From 5547e9658d3475b44db117dda960aee9ce0153aa Mon Sep 17 00:00:00 2001 From: ukdtom Date: Sun, 1 Apr 2018 21:32:15 +0200 Subject: [PATCH 001/710] Advanced.py done --- Contents/Code/interface/advanced.py | 170 +++++++++++++++++----------- Contents/Strings/en.json | 51 ++++++++- 2 files changed, 153 insertions(+), 68 deletions(-) diff --git a/Contents/Code/interface/advanced.py b/Contents/Code/interface/advanced.py index 55f8166ae..a097a74d2 100644 --- a/Contents/Code/interface/advanced.py +++ b/Contents/Code/interface/advanced.py @@ -24,82 +24,89 @@ @route(PREFIX + '/advanced') def AdvancedMenu(randomize=None, header=None, message=None): - oc = SubFolderObjectContainer(header=header or "Internal stuff, pay attention!", message=message, no_cache=True, - no_history=True, - replace_parent=False, title2="Advanced") + oc = SubFolderObjectContainer( + header=header or L("Internal stuff, pay attention!"), + message=message, + no_cache=True, + no_history=True, + replace_parent=False, + title2=L("Advanced")) if config.lock_advanced_menu and not config.pin_correct: oc.add(DirectoryObject( - key=Callback(PinMenu, randomize=timestamp(), success_go_to="advanced"), - title=pad_title("Enter PIN"), - summary="The owner has restricted the access to this menu. Please enter the correct pin", + key=Callback( + PinMenu, + randomize=timestamp(), + success_go_to=L("advanced")), + title=pad_title(L("Enter PIN")), + summary=L("The owner has restricted the access to this menu. Please enter the correct pin"), )) return oc oc.add(DirectoryObject( key=Callback(TriggerRestart, randomize=timestamp()), - title=pad_title("Restart the plugin"), + title=pad_title(L("Restart the plugin")), )) oc.add(DirectoryObject( key=Callback(GetLogsLink), - title="Get my logs (copy the appearing link and open it in your browser, please)", - summary="Copy the appearing link and open it in your browser, please", + title=L("Get my logs (copy the appearing link and open it in your browser, please)"), + summary=L("Copy the appearing link and open it in your browser, please"), )) oc.add(DirectoryObject( key=Callback(TriggerBetterSubtitles, randomize=timestamp()), - title=pad_title("Trigger find better subtitles"), + title=pad_title(L("Trigger find better subtitles")), )) oc.add(DirectoryObject( key=Callback(SkipFindBetterSubtitles, randomize=timestamp()), - title=pad_title("Skip next find better subtitles (sets last run to now)"), + title=pad_title(L("Skip next find better subtitles (sets last run to now)")), )) oc.add(DirectoryObject( key=Callback(TriggerStorageMaintenance, randomize=timestamp()), - title=pad_title("Trigger subtitle storage maintenance"), + title=pad_title(L("Trigger subtitle storage maintenance")), )) oc.add(DirectoryObject( key=Callback(TriggerStorageMigration, randomize=timestamp()), - title=pad_title("Trigger subtitle storage migration (expensive)"), + title=pad_title(L("Trigger subtitle storage migration (expensive)")), )) oc.add(DirectoryObject( key=Callback(TriggerCacheMaintenance, randomize=timestamp()), - title=pad_title("Trigger cache maintenance (refiners, providers and packs/archives)"), + title=pad_title(L("Trigger cache maintenance (refiners, providers and packs/archives)")), )) oc.add(DirectoryObject( key=Callback(ApplyDefaultMods, randomize=timestamp()), - title=pad_title("Apply configured default subtitle mods to all (active) stored subtitles"), + title=pad_title(L("Apply configured default subtitle mods to all (active) stored subtitles")), )) oc.add(DirectoryObject( key=Callback(ReApplyMods, randomize=timestamp()), - title=pad_title("Re-Apply mods of all stored subtitles"), + title=pad_title(L("Re-Apply mods of all stored subtitles")), )) oc.add(DirectoryObject( key=Callback(LogStorage, key="tasks", randomize=timestamp()), - title=pad_title("Log the plugin's scheduled tasks state storage"), + title=pad_title(L("Log the plugin's scheduled tasks state storage")), )) oc.add(DirectoryObject( key=Callback(LogStorage, key="ignore", randomize=timestamp()), - title=pad_title("Log the plugin's internal ignorelist storage"), + title=pad_title(L("Log the plugin's internal ignorelist storage")), )) oc.add(DirectoryObject( key=Callback(LogStorage, key=None, randomize=timestamp()), - title=pad_title("Log the plugin's complete state storage"), + title=pad_title(L("Log the plugin's complete state storage")), )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="tasks", randomize=timestamp()), - title=pad_title("Reset the plugin's scheduled tasks state storage"), + title=pad_title(L("Reset the plugin's scheduled tasks state storage")), )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="ignore", randomize=timestamp()), - title=pad_title("Reset the plugin's internal ignorelist storage"), + title=pad_title(L("Reset the plugin's internal ignorelist storage")), )) oc.add(DirectoryObject( key=Callback(InvalidateCache, randomize=timestamp()), - title=pad_title("Invalidate Sub-Zero metadata caches (subliminal)"), + title=pad_title(L("Invalidate Sub-Zero metadata caches (subliminal)")), )) oc.add(DirectoryObject( key=Callback(ResetProviderThrottle, randomize=timestamp()), - title=pad_title("Reset provider throttle states"), + title=pad_title(L("Reset provider throttle states")), )) return oc @@ -111,11 +118,15 @@ def DispatchRestart(): @route(PREFIX + '/advanced/restart/trigger') @debounce def TriggerRestart(randomize=None): - set_refresh_menu_state("Restarting the plugin") + set_refresh_menu_state(L("Restarting the plugin")) DispatchRestart() - return fatality(header="Restart triggered, please wait about 5 seconds", force_title=" ", only_refresh=True, - replace_parent=True, - no_history=True, randomize=timestamp()) + return fatality( + header=L("Restart triggered, please wait about 5 seconds"), + force_title=" ", + only_refresh=True, + replace_parent=True, + no_history=True, + randomize=timestamp()) @route(PREFIX + '/advanced/restart/execute') @@ -127,10 +138,17 @@ def Restart(): @debounce def ResetStorage(key, randomize=None, sure=False): if not sure: - oc = SubFolderObjectContainer(no_history=True, title1="Reset subtitle storage", title2="Are you sure?") + oc = SubFolderObjectContainer( + no_history=True, + title1=L("Reset subtitle storage"), + title2=L("Are you sure?")) oc.add(DirectoryObject( - key=Callback(ResetStorage, key=key, sure=True, randomize=timestamp()), - title=pad_title("Are you really sure?"), + key=Callback( + ResetStorage, + key=key, + sure=True, + randomize=timestamp()), + title=pad_title(L("Are you really sure?")), )) return oc @@ -144,8 +162,8 @@ def ResetStorage(key, randomize=None, sure=False): return AdvancedMenu( randomize=timestamp(), - header='Success', - message='Information Storage (%s) reset' % key + header=L("Success"), + message=L("Information Storage (%s) reset") % key ) @@ -154,8 +172,8 @@ def LogStorage(key, randomize=None): log_storage(key) return AdvancedMenu( randomize=timestamp(), - header='Success', - message='Information Storage (%s) logged' % key + header=L("Success"), + message=L("Information Storage (%s) logged") % key ) @@ -165,12 +183,11 @@ def TriggerBetterSubtitles(randomize=None): scheduler.dispatch_task("FindBetterSubtitles") return AdvancedMenu( randomize=timestamp(), - header='Success', - message='FindBetterSubtitles triggered' + header=L("Success"), + message=L("FindBetterSubtitles triggered") ) - @route(PREFIX + '/skipbetter') @debounce def SkipFindBetterSubtitles(randomize=None): @@ -179,8 +196,8 @@ def SkipFindBetterSubtitles(randomize=None): return AdvancedMenu( randomize=timestamp(), - header='Success', - message='FindBetterSubtitles skipped' + header=L("Success"), + message=L("FindBetterSubtitles skipped") ) @@ -190,8 +207,8 @@ def TriggerStorageMaintenance(randomize=None): scheduler.dispatch_task("SubtitleStorageMaintenance") return AdvancedMenu( randomize=timestamp(), - header='Success', - message='SubtitleStorageMaintenance triggered' + header=L("Success"), + message=L("SubtitleStorageMaintenance triggered") ) @@ -201,8 +218,8 @@ def TriggerStorageMigration(randomize=None): scheduler.dispatch_task("MigrateSubtitleStorage") return AdvancedMenu( randomize=timestamp(), - header='Success', - message='MigrateSubtitleStorage triggered' + header=L("Success"), + message=L("MigrateSubtitleStorage triggered") ) @@ -212,8 +229,8 @@ def TriggerCacheMaintenance(randomize=None): scheduler.dispatch_task("CacheMaintenance") return AdvancedMenu( randomize=timestamp(), - header='Success', - message='TriggerCacheMaintenance triggered' + header=L("Success"), + message=L("TriggerCacheMaintenance triggered") ) @@ -265,8 +282,8 @@ def ApplyDefaultMods(randomize=None): Thread.CreateTimer(1.0, apply_default_mods) return AdvancedMenu( randomize=timestamp(), - header='Success', - message='This may take some time ...' + header=L("Success"), + message=L("This may take some time ...") ) @@ -276,17 +293,20 @@ def ReApplyMods(randomize=None): Thread.CreateTimer(1.0, apply_default_mods, reapply_current=True) return AdvancedMenu( randomize=timestamp(), - header='Success', - message='This may take some time ...' + header=L("Success"), + message=L("This may take some time ...") ) @route(PREFIX + '/get_logs_link') def GetLogsLink(): if not config.plex_token: - oc = ObjectContainer(title2="Download Logs", no_cache=True, no_history=True, - header="Sorry, feature unavailable", - message="Universal Plex token not available") + oc = ObjectContainer( + title2=L("Download Logs"), + no_cache=True, + no_history=True, + header=L("Sorry, feature unavailable"), + message=L("Universal Plex token not available")) return oc # try getting the link base via the request in context, first, otherwise use the public ip @@ -311,9 +331,12 @@ def GetLogsLink(): Log.Debug("Using ip-based fallback link_base") logs_link = "%s%s?X-Plex-Token=%s" % (link_base, PREFIX + '/logs', config.plex_token) - oc = ObjectContainer(title2=logs_link, no_cache=True, no_history=True, - header="Copy this link and open this in your browser, please", - message=logs_link) + oc = ObjectContainer( + title2=logs_link, + no_cache=True, + no_history=True, + header=L("Copy this link and open this in your browser, please"), + message=logs_link) return oc @@ -343,32 +366,45 @@ def InvalidateCache(randomize=None): region.invalidate() return AdvancedMenu( randomize=timestamp(), - header='Success', - message='Cache invalidated' + header=L("Success"), + message=L("Cache invalidated") ) @route(PREFIX + '/pin') def PinMenu(pin="", randomize=None, success_go_to="channel"): - oc = ObjectContainer(title2="Enter PIN number %s" % (len(pin) + 1), no_cache=True, no_history=True, - skip_pin_lock=True) + oc = ObjectContainer( + title2=L("Enter PIN number ") + str(len(pin) + 1), + no_cache=True, + no_history=True, + skip_pin_lock=True) if pin == config.pin: Dict["pin_correct_time"] = datetime.datetime.now() config.locked = False if success_go_to == "channel": - return fatality(force_title="PIN correct", header="PIN correct", no_history=True) + return fatality( + force_title=L("PIN correct"), + header=L("PIN correct"), + no_history=True) elif success_go_to == "advanced": return AdvancedMenu(randomize=timestamp()) for i in range(10): oc.add(DirectoryObject( - key=Callback(PinMenu, randomize=timestamp(), pin=pin + str(i), success_go_to=success_go_to), + key=Callback( + PinMenu, + randomize=timestamp(), + pin=pin + str(i), + success_go_to=success_go_to), title=pad_title(str(i)), )) oc.add(DirectoryObject( - key=Callback(PinMenu, randomize=timestamp(), success_go_to=success_go_to), - title=pad_title("Reset"), + key=Callback( + PinMenu, + randomize=timestamp(), + success_go_to=success_go_to), + title=pad_title(L("Reset")), )) return oc @@ -377,7 +413,7 @@ def PinMenu(pin="", randomize=None, success_go_to="channel"): def ClearPin(randomize=None): Dict["pin_correct_time"] = None config.locked = True - return fatality(force_title="Menu locked", header=" ", no_history=True) + return fatality(force_title=L("Menu locked"), header=" ", no_history=True) @route(PREFIX + '/reset_throttle') @@ -386,6 +422,6 @@ def ResetProviderThrottle(randomize=None): Dict.Save() return AdvancedMenu( randomize=timestamp(), - header='Success', - message='Provider throttles reset' - ) \ No newline at end of file + header=L("Success"), + message=L("Provider throttles reset") + ) diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 8d5307873..d8d94f98e 100755 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -45,5 +45,54 @@ "th":"Thai", "tr":"Turkish", "uk":"Ukranian", - "vi":"Vietnamese" + "vi":"Vietnamese", + "Internal stuff, pay attention!":"Internal stuff, pay attention!", + "Advanced":"Advanced", + "advanced":"advanced", + "Enter PIN":"Enter PIN", + "The owner has restricted the access to this menu. Please enter the correct pin":"The owner has restricted the access to this menu. Please enter the correct pin", + "Restart the plugin":"Restart the plugin", + "Get my logs (copy the appearing link and open it in your browser, please)":"Get my logs (copy the appearing link and open it in your browser, please)", + "Copy the appearing link and open it in your browser, please":"Copy the appearing link and open it in your browser, please", + "Trigger find better subtitles":"Trigger find better subtitles", + "Skip next find better subtitles (sets last run to now)":"Skip next find better subtitles (sets last run to now)", + "Trigger subtitle storage maintenance":"Trigger subtitle storage maintenance", + "Trigger subtitle storage migration (expensive)":"Trigger subtitle storage migration (expensive)", + "Trigger cache maintenance (refiners, providers and packs/archives)":"Trigger cache maintenance (refiners, providers and packs/archives)", + "Apply configured default subtitle mods to all (active) stored subtitles":"Apply configured default subtitle mods to all (active) stored subtitles", + "Re-Apply mods of all stored subtitles":"Re-Apply mods of all stored subtitles", + "Log the plugin's scheduled tasks state storage":"Log the plugin's scheduled tasks state storage", + "Log the plugin's internal ignorelist storage":"Log the plugin's internal ignorelist storage", + "Log the plugin's complete state storage":"Log the plugin's complete state storage", + "Reset the plugin's scheduled tasks state storage":"Reset the plugin's scheduled tasks state storage", + "Reset the plugin's internal ignorelist storage":"Reset the plugin's internal ignorelist storage", + "Invalidate Sub-Zero metadata caches (subliminal)":"Invalidate Sub-Zero metadata caches (subliminal)", + "Reset provider throttle states":"Reset provider throttle states", + "Restarting the plugin":"Restarting the plugin", + "Restart triggered, please wait about 5 seconds":"Restart triggered, please wait about 5 seconds", + "Reset subtitle storage":"Reset subtitle storage", + "Are you sure?":"Are you sure?", + "Are you really sure?":"Are you really sure?", + "Success":"Success", + "Information Storage (":"Information Storage (", + ") reset":") reset", + ") logged":") logged", + "FindBetterSubtitles triggered":"FindBetterSubtitles triggered", + "FindBetterSubtitles skipped":"FindBetterSubtitles skipped", + "SubtitleStorageMaintenance triggered":"SubtitleStorageMaintenance triggered", + "MigrateSubtitleStorage triggered":"MigrateSubtitleStorage triggered", + "TriggerCacheMaintenance triggered":"TriggerCacheMaintenance triggered", + "This may take some time ...":"This may take some time ...", + "Download Logs":"Download Logs", + "Sorry, feature unavailable":"Sorry, feature unavailable", + "Universal Plex token not available":"Universal Plex token not available", + "Copy this link and open this in your browser, please":"Copy this link and open this in your browser, please", + "Cache invalidated":"Cache invalidated", + "Enter PIN number ":"Enter PIN number ", + "PIN correct":"PIN correct", + "Reset":"Reset", + "Menu locked":"Menu locked", + "Provider throttles reset":"Provider throttles reset" + + } From bba2823065e301800d287fe9dca1f4f784ee5c16 Mon Sep 17 00:00:00 2001 From: ukdtom Date: Sun, 1 Apr 2018 21:42:11 +0200 Subject: [PATCH 002/710] Fixed nasty syntax for placeholders, as well as some PEP8 --- Contents/Strings/en.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index d8d94f98e..2e6663e8f 100755 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -74,9 +74,8 @@ "Are you sure?":"Are you sure?", "Are you really sure?":"Are you really sure?", "Success":"Success", - "Information Storage (":"Information Storage (", - ") reset":") reset", - ") logged":") logged", + "Information Storage (%s) reset":"Information Storage (%s) reset", + "Information Storage (%s) logged":"Information Storage (%s) logged", "FindBetterSubtitles triggered":"FindBetterSubtitles triggered", "FindBetterSubtitles skipped":"FindBetterSubtitles skipped", "SubtitleStorageMaintenance triggered":"SubtitleStorageMaintenance triggered", From 4b811f38b00e8ff05e6d8c5fd1e2759885965cdb Mon Sep 17 00:00:00 2001 From: ukdtom Date: Sun, 1 Apr 2018 23:19:53 +0200 Subject: [PATCH 003/710] Switch i18n to dev mode :) --- Contents/Info.plist | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 7facfc9eb..7114fd78c 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,10 +23,10 @@ PlexPluginConsoleLogging 0 PlexPluginDevMode - 0 - PlexPluginCodePolicy - - Elevated + 1 + PlexPluginCodePolicy + + Elevated PlexAgentAttributionText <div style="white-space: pre;"><img src="https://raw.githubusercontent.com/pannal/Sub-Zero.bundle/master/Contents/Resources/subzero.gif" /> From ce3b4661dee64e1abb33637f994ea601eaf3c68c Mon Sep 17 00:00:00 2001 From: ukdtom Date: Sun, 1 Apr 2018 23:24:02 +0200 Subject: [PATCH 004/710] Added item_details.py --- Contents/Code/interface/item_details.py | 150 +++++++++++++----------- Contents/Strings/en.json | 49 +++++++- 2 files changed, 130 insertions(+), 69 deletions(-) mode change 100755 => 100644 Contents/Strings/en.json diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index f75a817af..51bb580cf 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -41,14 +41,23 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra timeout = 30 - oc = SubFolderObjectContainer(title2=title, replace_parent=True, header=header, message=message) + oc = SubFolderObjectContainer( + title2=title, + replace_parent=True, + header=header, + message=message) if not item: oc.add(DirectoryObject( - key=Callback(ItemDetailsMenu, rating_key=rating_key, title=title, base_title=base_title, - item_title=item_title, randomize=timestamp()), - title=u"Item not found: %s!" % item_title, - summary="Plex didn't return any information about the item, please refresh it and come back later", + key=Callback( + ItemDetailsMenu, + rating_key=rating_key, + title=title, + base_title=base_title, + item_title=item_title, + randomize=timestamp()), + title=L(u"Item not found: %s!") % item_title, + summary=L("Plex didn't return any information about the item, please refresh it and come back later"), thumb=default_thumb )) return oc @@ -60,26 +69,36 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra season = get_item(item.season.rating_key) oc.add(DirectoryObject( - key=Callback(MetadataMenu, rating_key=season.rating_key, title=season.title, base_title=show.title, - previous_item_type="show", previous_rating_key=show.rating_key, - display_items=True, randomize=timestamp()), - title=u"< Back to %s" % season.title, - summary="Back to %s > %s" % (show.title, season.title), + key=Callback( + MetadataMenu, + rating_key=season.rating_key, + title=season.title, + base_title=show.title, + previous_item_type="show", + previous_rating_key=show.rating_key, + display_items=True, + randomize=timestamp()), + title=L(u"< Back to %s") % season.title, + summary=L("Back to %s > %s") % (show.title, season.title), thumb=season.thumb or default_thumb )) oc.add(DirectoryObject( - key=Callback(RefreshItem, rating_key=rating_key, item_title=item_title, randomize=timestamp(), - timeout=timeout * 1000), - title=u"Refresh: %s" % item_title, - summary="Refreshes the %s, possibly searching for missing and picking up new subtitles on disk" % current_kind, + key=Callback( + RefreshItem, + rating_key=rating_key, + item_title=item_title, + randomize=timestamp(), + timeout=timeout * 1000), + title=L(u"Refresh: %s") % item_title, + summary=L("Refreshes the %s, possibly searching for missing and picking up new subtitles on disk") % current_kind, thumb=item.thumb or default_thumb )) oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=item_title, force=True, randomize=timestamp(), timeout=timeout * 1000), - title=u"Force-find subtitles: %s" % item_title, - summary="Issues a forced refresh, ignoring known subtitles and searching for new ones", + title=L(u"Force-find subtitles: %s") % item_title, + summary=L("Issues a forced refresh, ignoring known subtitles and searching for new ones"), thumb=item.thumb or default_thumb )) @@ -102,7 +121,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra part_index_addon = "" part_summary_addon = "" if has_multiple_parts: - part_index_addon = u"File %s: " % part_index + part_index_addon = L(u"File %s: ") % part_index part_summary_addon = "%s " % filename # iterate through all configured languages @@ -112,17 +131,18 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra current_sub_id = None current_sub_provider_name = None - summary = u"%sNo current subtitle in storage" % part_summary_addon + summary = L(u"%sNo current subtitle in storage") % part_summary_addon current_score = None if current_sub: current_sub_id = current_sub.id current_sub_provider_name = current_sub.provider_name current_score = current_sub.score - summary = u"%sCurrent subtitle: %s (added: %s, %s), Language: %s, Score: %i, Storage: %s" % \ - (part_summary_addon, current_sub.provider_name, df(current_sub.date_added), - current_sub.mode_verbose, display_language(lang), current_sub.score, - current_sub.storage_type) + summary = L(u"%sCurrent subtitle: %s (added: %s, %s), Language: %s, Score: %i, Storage: %s") % ( + part_summary_addon, current_sub.provider_name, + df(current_sub.date_added), current_sub.mode_verbose, + display_language(lang), current_sub.score, + current_sub.storage_type) oc.add(DirectoryObject( key=Callback(SubtitleOptionsMenu, rating_key=rating_key, part_id=part_id, title=title, @@ -131,7 +151,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra item_type=plex_item.type, filename=filename, current_data=summary, randomize=timestamp(), current_provider=current_sub_provider_name, current_score=current_score), - title=u"%sManage %s subtitle" % (part_index_addon, display_language(lang)), + title=L(u"%sManage %s subtitle") % (part_index_addon, display_language(lang)), summary=summary )) else: @@ -142,7 +162,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra item_type=plex_item.type, filename=filename, current_data=summary, randomize=timestamp(), current_provider=current_sub_provider_name, current_score=current_score), - title=u"%sList %s subtitles" % (part_index_addon, display_language(lang)), + title=L(u"%sList %s subtitles") % (part_index_addon, display_language(lang)), summary=summary )) @@ -167,9 +187,10 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra key=Callback(ListEmbeddedSubsForItemMenu, rating_key=rating_key, part_id=part_id, title=title, item_type=plex_item.type, item_title=item_title, base_title=base_title, randomize=timestamp()), - title=u"%sEmbedded subtitles (%s)" % (part_index_addon, ", ".join(display_language(l) for l in - set(embedded_langs))), - summary=u"Extract and activate embedded subtitle streams" + title=L(u"%sEmbedded subtitles (%s)") % ( + part_index_addon, + ", ".join(display_language(l) for l in set(embedded_langs))), + summary=L(u"Extract and activate embedded subtitle streams") )) ignore_title = item_title @@ -197,33 +218,33 @@ def SubtitleOptionsMenu(**kwargs): oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), - title=u"< Back to %s" % kwargs["title"], + title=L(u"< Back to %s") % kwargs["title"], summary=kwargs["current_data"], thumb=default_thumb )) if subs_count: oc.add(DirectoryObject( key=Callback(ListStoredSubsForItemMenu, randomize=timestamp(), **kwargs), - title=u"Select active %s subtitle" % kwargs["language_name"], - summary=u"%d subtitles in storage" % subs_count + title=L(u"Select active %s subtitle") % kwargs["language_name"], + summary=L(u"%d subtitles in storage") % subs_count )) oc.add(DirectoryObject( key=Callback(ListAvailableSubsForItemMenu, randomize=timestamp(), **kwargs), - title=u"List available %s subtitles" % kwargs["language_name"], + title=L(u"List available %s subtitles") % kwargs["language_name"], summary=kwargs["current_data"] )) if current_sub: oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title=u"Modify current %s subtitle" % kwargs["language_name"], - summary=u"Currently applied mods: %s" % (", ".join(current_sub.mods) if current_sub.mods else "none") + title=L(u"Modify current %s subtitle") % kwargs["language_name"], + summary=L(u"Currently applied mods: %s") % (", ".join(current_sub.mods) if current_sub.mods else "none") )) if current_sub.provider_name != "embedded": oc.add(DirectoryObject( key=Callback(BlacklistSubtitleMenu, randomize=timestamp(), **kwargs), - title=u"Blacklist current %s subtitle and search for a new one" % kwargs["language_name"], + title=L(u"Blacklist current %s subtitle and search for a new one") % kwargs["language_name"], summary=current_data )) @@ -231,8 +252,8 @@ def SubtitleOptionsMenu(**kwargs): if current_bl: oc.add(DirectoryObject( key=Callback(ManageBlacklistMenu, randomize=timestamp(), **kwargs), - title=u"Manage blacklist (%s contained)" % len(current_bl), - summary=u"Inspect currently blacklisted subtitles" + title=L(u"Manage blacklist (%s contained)") % len(current_bl), + summary=L(u"Inspect currently blacklisted subtitles") )) storage.destroy() @@ -265,7 +286,7 @@ def ListStoredSubsForItemMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SelectStoredSubForItemMenu, randomize=timestamp(), sub_key="__".join(key), **kwargs), - title=u"%s%s, Score: %s" % ("Current: " if is_current else "Stored: ", sub_name, + title=L(u"%s%s, Score: %s") % ("Current: " if is_current else "Stored: ", sub_name, subtitle.score), summary=summary )) @@ -294,13 +315,12 @@ def SelectStoredSubForItemMenu(**kwargs): save_stored_sub(subtitle, rating_key, part_id, language, item_type, plex_item=plex_item, storage=storage, stored_subs=stored_subs) - storage.save(stored_subs) storage.destroy() kwargs.pop("randomize") - kwargs["header"] = 'Success' - kwargs["message"] = 'Subtitle saved to disk' + kwargs["header"] = L("Success") + kwargs["message"] = L("Subtitle saved to disk") return SubtitleOptionsMenu(randomize=timestamp(), **kwargs) @@ -404,7 +424,7 @@ def ManageBlacklistMenu(**kwargs): oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), - title=u"< Back to %s" % kwargs["title"], + title=L(u"< Back to %s") % kwargs["title"], summary=kwargs["current_data"], thumb=default_thumb )) @@ -415,15 +435,14 @@ def sorter(pair): for sub_key, data in sorted(current_bl.iteritems(), key=sorter, reverse=True): provider_name, subtitle_id = sub_key - title = u"%s, %s (added: %s, %s), Language: " \ - u"%s, Score: %i, Storage: %s" % (provider_name, subtitle_id, df(data["date_added"]), + title = L(u"%s, %s (added: %s, %s), Language: %s, Score: %i, Storage: %s") % (provider_name, subtitle_id, df(data["date_added"]), current_sub.get_mode_verbose(data["mode"]), display_language(Language.fromietf(language)), data["score"], data["storage_type"]) oc.add(DirectoryObject( key=Callback(ManageBlacklistMenu, remove_sub_key="__".join(sub_key), randomize=timestamp(), **kwargs), title=title, - summary=u"Remove subtitle from blacklist" + summary=L(u"Remove subtitle from blacklist") )) storage.destroy() @@ -450,7 +469,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item oc = SubFolderObjectContainer(title2=unicode(title), replace_parent=True) oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=rating_key, item_title=item_title, title=title, randomize=timestamp()), - title=u"< Back to %s" % title, + title=L(u"< Back to %s") % title, summary=current_data, thumb=default_thumb )) @@ -468,20 +487,20 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item video_display_data = [video.format] if video.format else [] if video.release_group: - video_display_data.append(u"by %s" % video.release_group) + video_display_data.append(L(u"by %s") % video.release_group) video_display_data = " ".join(video_display_data) else: video_display_data = metadata["filename"] - current_display = (u"Current: %s (%s) " % (current_provider, current_score) if current_provider else "") + current_display = (L(u"Current: %s (%s) ") % (current_provider, current_score) if current_provider else "") if not running: oc.add(DirectoryObject( key=Callback(ListAvailableSubsForItemMenu, rating_key=rating_key, item_title=item_title, language=language, filename=filename, part_id=part_id, title=title, current_id=current_id, force=True, current_provider=current_provider, current_score=current_score, current_data=current_data, item_type=item_type, randomize=timestamp()), - title=u"Search for %s subs (%s)" % (get_language(language).name, video_display_data), - summary=u"%sFilename: %s" % (current_display, filename), + title=L(u"Search for %s subs (%s)") % (get_language(language).name, video_display_data), + summary=L(u"%sFilename: %s") % (current_display, filename), thumb=default_thumb )) @@ -492,8 +511,8 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item part_id=part_id, title=title, current_id=current_id, item_type=item_type, current_provider=current_provider, current_score=current_score, randomize=timestamp()), - title=u"No subtitles found", - summary=u"%sFilename: %s" % (current_display, filename), + title=L(u"No subtitles found"), + summary=L(u"%sFilename: %s") % (current_display, filename), thumb=default_thumb )) else: @@ -503,9 +522,9 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item part_id=part_id, title=title, current_id=current_id, item_type=item_type, current_provider=current_provider, current_score=current_score, randomize=timestamp()), - title=u"Searching for %s subs (%s), refresh here ..." % (display_language(get_language(language)), + title=L(u"Searching for %s subs (%s), refresh here ...") % (display_language(get_language(language)), video_display_data), - summary=u"%sFilename: %s" % (current_display, filename), + summary=L(u"%sFilename: %s") % (current_display, filename), thumb=default_thumb )) @@ -527,16 +546,16 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item wrong_fps_addon = "" if subtitle.wrong_fps: if plex_part: - wrong_fps_addon = " (wrong FPS, sub: %s, media: %s)" % (subtitle.fps, plex_part.fps) + wrong_fps_addon = L(" (wrong FPS, sub: %s, media: %s)") % (subtitle.fps, plex_part.fps) else: - wrong_fps_addon = " (wrong FPS, sub: %s, media: unknown, low impact mode)" % subtitle.fps + wrong_fps_addon = L(" (wrong FPS, sub: %s, media: unknown, low impact mode)") % subtitle.fps oc.add(DirectoryObject( key=Callback(TriggerDownloadSubtitle, rating_key=rating_key, randomize=timestamp(), item_title=item_title, subtitle_id=str(subtitle.id), language=language), - title=u"%s%s: %s, score: %s%s" % (bl_addon, "Available" if current_id != subtitle.id else "Current", + title=L(u"%s%s: %s, score: %s%s") % (bl_addon, "Available" if current_id != subtitle.id else "Current", subtitle.provider_name, subtitle.score, wrong_fps_addon), - summary=u"Release: %s, Matches: %s" % (subtitle.release_info, ", ".join(subtitle.matches)), + summary=L(u"Release: %s, Matches: %s") % (subtitle.release_info, ", ".join(subtitle.matches)), thumb=default_thumb )) @@ -550,7 +569,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item def TriggerDownloadSubtitle(rating_key=None, subtitle_id=None, item_title=None, language=None, randomize=None): from interface.main import fatality - set_refresh_menu_state("Downloading subtitle for %s" % item_title or rating_key) + set_refresh_menu_state(L("Downloading subtitle for %s") % item_title or rating_key) search_results = get_item_task_data("AvailableSubsForItem", rating_key, language) download_subtitle = None @@ -599,18 +618,17 @@ def ListEmbeddedSubsForItemMenu(**kwargs): oc.add(DirectoryObject( key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), stream_index=str(stream.index), language=language, with_mods=True, **kwargs), - title=u"Extract stream %s, " - u"%s%s%s%s with default mods" % (stream.index, display_language(language), - " (unknown)" if is_unknown else "", - " (forced)" if is_forced else "", + title=L(u"Extract stream %s, %s%s%s%s with default mods") % (stream.index, display_language(language), + L(" (unknown)") if is_unknown else "", + L(" (forced)") if is_forced else "", " (\"%s\")" % stream.title if stream.title else ""), )) oc.add(DirectoryObject( key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), stream_index=str(stream.index), language=language, **kwargs), - title=u"Extract stream %s, %s%s%s%s" % (stream.index, display_language(language), - " (unknown)" if is_unknown else "", - " (forced)" if is_forced else "", + title=L(u"Extract stream %s, %s%s%s%s") % (stream.index, display_language(language), + L(" (unknown)") if is_unknown else "", + L(" (forced)") if is_forced else "", " (\"%s\")" % stream.title if stream.title else ""), )) return oc @@ -624,7 +642,7 @@ def TriggerExtractEmbeddedSubForItemMenu(**kwargs): stream_index = kwargs.get("stream_index") Thread.Create(extract_embedded_sub, **kwargs) - header = u"Extracting of embedded subtitle %s of part %s:%s triggered" % (stream_index, rating_key, part_id) + header = L(u"Extracting of embedded subtitle %s of part %s:%s triggered") % (stream_index, rating_key, part_id) kwargs.pop("randomize") kwargs.pop("item_type") diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json old mode 100755 new mode 100644 index 2e6663e8f..195df6630 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -91,7 +91,50 @@ "PIN correct":"PIN correct", "Reset":"Reset", "Menu locked":"Menu locked", - "Provider throttles reset":"Provider throttles reset" - - + "Provider throttles reset":"Provider throttles reset", + "Plex didn't return any information about the item, please refresh it and come back later":"Plex didn't return any information about the item, please refresh it and come back later", + "Item not found: %s!":"Item not found: %s!", + "< Back to %s":"< Back to %s", + "Back to %s > %s":"Back to %s > %s", + "Refresh: %s":"Refresh: %s", + "Refreshes the %s, possibly searching for missing and picking up new subtitles on disk":"Refreshes the %s, possibly searching for missing and picking up new subtitles on disk", + "Force-find subtitles: %s":"Force-find subtitles: %s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones":"Issues a forced refresh, ignoring known subtitles and searching for new ones", + "File %s: ":"File %s: ", + "%sNo current subtitle in storage":"%sNo current subtitle in storage", + "%sCurrent subtitle: %s (added: %s, %s), Language: %s, Score: %i, Storage: %s":"%sCurrent subtitle: %s (added: %s, %s), Language: %s, Score: %i, Storage: %s", + "%sManage %s subtitle":"%sManage %s subtitle", + "%sList %s subtitles":"%sList %s subtitles", + "%sEmbedded subtitles (%s)":"%sEmbedded subtitles (%s)", + "Extract and activate embedded subtitle streams":"Extract and activate embedded subtitle streams", + "Select active %s subtitle":"Select active %s subtitle", + "%d subtitles in storage":"%d subtitles in storage", + "List available %s subtitles":"List available %s subtitles", + "Modify current %s subtitle":"Modify current %s subtitle", + "Currently applied mods: %s":"Currently applied mods: %s", + "Blacklist current %s subtitle and search for a new one":"Blacklist current %s subtitle and search for a new one", + "Manage blacklist (%s contained)":"Manage blacklist (%s contained)", + "Inspect currently blacklisted subtitles":"Inspect currently blacklisted subtitles", + "%s%s, Score: %s":"%s%s, Score: %s", + "Subtitle saved to disk":"Subtitle saved to disk", + "%s, Score: %i, Storage: %s":"%s, Score: %i, Storage: %s", + "Remove subtitle from blacklist":"Remove subtitle from blacklist", + "by %s":"by %s", + "Current: %s (%s) ":"Current: %s (%s) ", + "Search for %s subs (%s)":"Search for %s subs (%s)", + "%sFilename: %s":"%sFilename: %s", + "No subtitles found":"No subtitles found", + "Searching for %s subs (%s), refresh here ...":"Searching for %s subs (%s), refresh here ...", + " (wrong FPS, sub: %s, media: %s)":" (wrong FPS, sub: %s, media: %s)", + " (wrong FPS, sub: %s, media: unknown, low impact mode)":" (wrong FPS, sub: %s, media: unknown, low impact mode)", + "%s%s: %s, score: %s%s":"%s%s: %s, score: %s%s", + "Release: %s, Matches: %s":"Release: %s, Matches: %s", + "Downloading subtitle for %s":"Downloading subtitle for %s", + "%s%s%s%s with default mods":"%s%s%s%s with default mods", + " (unknown)":" (unknown)", + " (forced)":" (forced)", + "Extract stream %s, %s%s%s%s":"Extract stream %s, %s%s%s%s", + "Extracting of embedded subtitle %s of part %s:%s triggered":"Extracting of embedded subtitle %s of part %s:%s triggered", + "%s, %s (added: %s, %s), Language: %s, Score: %i, Storage: %s":"%s, %s (added: %s, %s), Language: %s, Score: %i, Storage: %s", + "Extract stream %s, %s%s%s%s with default mods":"Extract stream %s, %s%s%s%s with default mods" } From b532a60c3d19d6ce2febbbe06d98a1730f975352 Mon Sep 17 00:00:00 2001 From: ukdtom Date: Mon, 2 Apr 2018 19:02:36 +0200 Subject: [PATCH 005/710] main.py translation, but look at line 3 for misses --- Contents/Code/interface/main.py | 104 ++++++++++++++++---------------- Contents/Strings/en.json | 52 +++++++++++++++- 2 files changed, 103 insertions(+), 53 deletions(-) diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index fea01c688..43caa1f03 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -1,5 +1,7 @@ # coding=utf-8 +# i18n: Look at line 90, 122, 129, 130, 137, 145, 152 + from subzero.constants import PREFIX, TITLE, ART from support.config import config from support.helpers import pad_title, timestamp, df, display_language @@ -35,8 +37,8 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r if config.lock_menu and not config.pin_correct: oc.add(DirectoryObject( key=Callback(PinMenu, randomize=timestamp()), - title=pad_title("Enter PIN"), - summary="The owner has restricted the access to this menu. Please enter the correct pin", + title=pad_title(L("Enter PIN")), + summary=L("The owner has restricted the access to this menu. Please enter the correct pin"), )) return oc @@ -44,23 +46,23 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r if not isinstance(config.missing_permissions, list): oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), - title=pad_title("Insufficient permissions"), + title=pad_title(L("Insufficient permissions")), summary=config.missing_permissions, )) else: for title, path in config.missing_permissions: oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), - title=pad_title("Insufficient permissions"), - summary="Insufficient permissions on library %s, folder: %s" % (title, path), + title=pad_title(L("Insufficient permissions")), + summary=L("Insufficient permissions on library %s, folder: %s") % (title, path), )) return oc if not config.enabled_sections: oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), - title=pad_title("I'm not enabled!"), - summary="Please enable me for some of your libraries in your server settings; currently I do nothing", + title=pad_title(L("I'm not enabled!")), + summary=L("Please enable me for some of your libraries in your server settings; currently I do nothing"), )) return oc @@ -68,8 +70,8 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r if Dict["current_refresh_state"]: oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), - title=pad_title("Working ... refresh here"), - summary="Current state: %s; Last state: %s" % ( + title=pad_title(L("Working ... refresh here")), + summary=L("Current state: %s; Last state: %s") % ( (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" ) @@ -77,37 +79,34 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r oc.add(DirectoryObject( key=Callback(OnDeckMenu), - title="On-deck items", - summary="Shows the current on deck items and allows you to individually (force-) refresh their metadata/" - "subtitles.", + title=L("On-deck items"), + summary=L("Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles."), thumb=R("icon-ondeck.jpg") )) if "last_played_items" in Dict and Dict["last_played_items"]: oc.add(DirectoryObject( key=Callback(RecentlyPlayedMenu), - title=pad_title("Recently played items"), - summary="Shows the %i recently played items and allows you to individually (force-) refresh their " - "metadata/subtitles." % config.store_recently_played_amount, + title=pad_title(L("Recently played items")), + # summary=L("Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.") % config.store_recently_played_amount, + summary="Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles." % config.store_recently_played_amount, thumb=R("icon-played.jpg") )) oc.add(DirectoryObject( key=Callback(RecentlyAddedMenu), - title="Recently-added items", - summary="Shows the recently added items per section.", + title=L("Recently-added items"), + summary=L("Shows the recently added items per section."), thumb=R("icon-added.jpg") )) oc.add(DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, randomize=timestamp()), - title="Show recently added items with missing subtitles", - summary="Lists items with missing subtitles. Click on \"Find recent items with missing subs\" " - "to update list", + title=L("Show recently added items with missing subtitles"), + summary=L("Lists items with missing subtitles. Click on Find recent items with missing subs to update list"), thumb=R("icon-missing.jpg") )) oc.add(DirectoryObject( key=Callback(SectionsMenu), - title="Browse all items", - summary="Go through your whole library and manage your ignore list. You can also " - "(force-) refresh the metadata/subtitles of individual items.", + title=L("Browse all items"), + summary=L("Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items."), thumb=R("icon-browse.jpg") )) @@ -115,7 +114,7 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r task = scheduler.task(task_name) if task.ready_for_display: - task_state = "Running: %s/%s (%s%%)" % (task.items_done, task.items_searching, task.percentage) + task_state = L("Running: %s/%s (%s%%)") % (task.items_done, task.items_searching, task.percentage) else: lr = scheduler.last_run(task_name) nr = scheduler.next_run(task_name) @@ -128,6 +127,7 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r key=Callback(RefreshMissing, randomize=timestamp()), title="Search for missing subtitles (in recently-added items, max-age: %s)" % Prefs[ "scheduler.item_is_recent_age"], + # summary=L("Automatically run periodically by the scheduler, if configured. %s") % task_state, summary="Automatically run periodically by the scheduler, if configured. %s" % task_state, thumb=R("icon-search.jpg") )) @@ -135,20 +135,20 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r oc.add(DirectoryObject( key=Callback(IgnoreListMenu), title="Display ignore list (%d)" % len(ignore_list), - summary="Show the current ignore list (mainly used for the automatic tasks)", + summary=L("Show the current ignore list (mainly used for the automatic tasks)"), thumb=R("icon-ignore.jpg") )) oc.add(DirectoryObject( key=Callback(HistoryMenu), - title="History", + title=L("History"), summary="Show the last %i downloaded subtitles" % int(Prefs["history_size"]), thumb=R("icon-history.jpg") )) oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), - title=pad_title("Refresh"), + title=pad_title(L("Refresh")), summary="Current state: %s; Last state: %s" % ( (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" @@ -160,8 +160,8 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r if config.pin: oc.add(DirectoryObject( key=Callback(ClearPin, randomize=timestamp()), - title=pad_title("Re-lock menu(s)"), - summary="Enabled the PIN again for menu(s)" + title=pad_title(L("Re-lock menu(s)")), + summary=L("Enabled the PIN again for menu(s)") )) if not only_refresh: @@ -169,19 +169,19 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r summary_data = [] for provider, data in Dict["provider_throttle"].iteritems(): reason, until, desc = data - summary_data.append("%s until %s (%s)" % (provider, until.strftime("%y/%m/%d %H:%M"), reason)) + summary_data.append(L("%s until %s (%s)") % (provider, until.strftime("%y/%m/%d %H:%M"), reason)) oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), - title=pad_title("Throttled providers: %s" % ", ".join(Dict["provider_throttle"].keys())), + title=pad_title(L("Throttled providers: %s") % ", ".join(Dict["provider_throttle"].keys())), summary=", ".join(summary_data), thumb=R("icon-throttled.jpg") )) oc.add(DirectoryObject( key=Callback(AdvancedMenu), - title=pad_title("Advanced functions"), - summary="Use at your own risk", + title=pad_title(L("Advanced functions")), + summary=L("Use at your own risk"), thumb=R("icon-advanced.jpg") )) @@ -195,12 +195,12 @@ def OnDeckMenu(message=None): :param message: :return: """ - return mergedItemsMenu(title="Items On Deck", base_title="Items On Deck", itemGetter=get_on_deck_items) + return mergedItemsMenu(title=L("Items On Deck"), base_title=L("Items On Deck"), itemGetter=get_on_deck_items) @route(PREFIX + '/recently_played') def RecentlyPlayedMenu(): - base_title = "Recently Played" + base_title = L("Recently Played") oc = SubFolderObjectContainer(title2=base_title, replace_parent=True) for item in [get_item(rating_key) for rating_key in Dict["last_played_items"]]: @@ -228,13 +228,13 @@ def RecentlyAddedMenu(message=None): :param message: :return: """ - return SectionsMenu(base_title="Recently added", section_items_key="recently_added", ignore_options=False) + return SectionsMenu(base_title=L("Recently added"), section_items_key="recently_added", ignore_options=False) @route(PREFIX + '/recent', force=bool) @debounce def RecentMissingSubtitlesMenu(force=False, randomize=None): - title = "Items with missing subtitles" + title = L("Items with missing subtitles") oc = SubFolderObjectContainer(title2=title, no_cache=True, no_history=True) running = scheduler.is_task_running("MissingSubtitles") @@ -248,13 +248,13 @@ def RecentMissingSubtitlesMenu(force=False, randomize=None): if not running: oc.add(DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, force=True, randomize=timestamp()), - title=u"Find recent items with missing subtitles", + title=L(u"Find recent items with missing subtitles"), thumb=default_thumb )) else: oc.add(DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, force=False, randomize=timestamp()), - title=u"Updating, refresh here ...", + title=L(u"Updating, refresh here ..."), thumb=default_thumb )) @@ -264,7 +264,7 @@ def RecentMissingSubtitlesMenu(force=False, randomize=None): key=Callback(ItemDetailsMenu, title=title + " > " + item_title, item_title=item_title, rating_key=item_id), title=item_title, - summary="Missing: %s" % ", ".join(display_language(l) for l in missing_languages), + summary=L("Missing: %s") % ", ".join(display_language(l) for l in missing_languages), thumb=get_item_thumb(item) or default_thumb )) @@ -322,13 +322,13 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): """ is_ignored = rating_key in ignore_list[kind] if not sure: - oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1="%s %s %s %s the ignore list" % ( - "Add" if not is_ignored else "Remove", ignore_list.verbose(kind), title, - "to" if not is_ignored else "from"), title2="Are you sure?") + oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1=L("%s %s %s %s the ignore list") % ( + L("Add") if not is_ignored else L("Remove"), ignore_list.verbose(kind), title, + L("to") if not is_ignored else L("from")), title2=L("Are you sure?")) oc.add(DirectoryObject( key=Callback(IgnoreMenu, kind=kind, rating_key=rating_key, title=title, sure=True, - todo="add" if not is_ignored else "remove"), - title=pad_title("Are you sure?"), + todo=L("add") if not is_ignored else L("remove")), + title=pad_title(L("Are you sure?")), )) return oc @@ -342,7 +342,7 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): Log.Info("Removed %s (%s) from the ignore list", title, rating_key) ignore_list.remove_title(kind, rating_key) ignore_list.save() - state = "removed from" + state = L("removed from") elif todo == "add": if is_ignored: dont_change = True @@ -351,25 +351,25 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): Log.Info("Added %s (%s) to the ignore list", title, rating_key) ignore_list.add_title(kind, rating_key, title) ignore_list.save() - state = "added to" + state = L("added to") else: dont_change = True if dont_change: - return fatality(force_title=" ", header="Didn't change the ignore list", no_history=True) + return fatality(force_title=" ", header=L("Didn't change the ignore list"), no_history=True) - return fatality(force_title=" ", header="%s %s the ignore list" % (title, state), no_history=True) + return fatality(force_title=" ", header=L("%s %s the ignore list") % (title, state), no_history=True) @route(PREFIX + '/sections') -def SectionsMenu(base_title="Sections", section_items_key="all", ignore_options=True): +def SectionsMenu(base_title=L("Sections"), section_items_key="all", ignore_options=True): """ displays the menu for all sections :return: """ items = get_all_items("sections") - return dig_tree(SubFolderObjectContainer(title2="Sections", no_cache=True, no_history=True), items, None, + return dig_tree(SubFolderObjectContainer(title2=L("Sections"), no_cache=True, no_history=True), items, None, menu_determination_callback=determine_section_display, pass_kwargs={"base_title": base_title, "section_items_key": section_items_key, "ignore_options": ignore_options}, @@ -430,7 +430,7 @@ def SectionFirstLetterMenu(rating_key, title=None, base_title=None, section_titl add_ignore_options(oc, "sections", title=section_title, rating_key=rating_key, callback_menu=IgnoreMenu) oc.add(DirectoryObject( - key=Callback(SectionMenu, title="All", base_title=title, rating_key=rating_key, ignore_options=False), + key=Callback(SectionMenu, title=L("All"), base_title=title, rating_key=rating_key, ignore_options=False), title="All" ) ) diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 195df6630..6a3a09a7c 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -136,5 +136,55 @@ "Extract stream %s, %s%s%s%s":"Extract stream %s, %s%s%s%s", "Extracting of embedded subtitle %s of part %s:%s triggered":"Extracting of embedded subtitle %s of part %s:%s triggered", "%s, %s (added: %s, %s), Language: %s, Score: %i, Storage: %s":"%s, %s (added: %s, %s), Language: %s, Score: %i, Storage: %s", - "Extract stream %s, %s%s%s%s with default mods":"Extract stream %s, %s%s%s%s with default mods" + "Extract stream %s, %s%s%s%s with default mods":"Extract stream %s, %s%s%s%s with default mods", + "Insufficient permissions":"Insufficient permissions", + "Insufficient permissions on library %s, folder: %s":"Insufficient permissions on library %s, folder: %s", + "I'm not enabled!":"I'm not enabled!", + "Please enable me for some of your libraries in your server settings; currently I do nothing":"Please enable me for some of your libraries in your server settings; currently I do nothing", + "Working ... refresh here":"Working ... refresh here", + "Current state: %s; Last state: %s":"Current state: %s; Last state: %s", + "On-deck items":"On-deck items", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles.":"Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles.", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", + "Recently-added items":"Recently-added items", + "Recently played items":"Recently played items", + "Shows the recently added items per section.":"Shows the recently added items per section.", + "Show recently added items with missing subtitles":"Show recently added items with missing subtitles", + "Lists items with missing subtitles. Click on Find recent items with missing subs to update list":"Lists items with missing subtitles. Click on Find recent items with missing subs to update list", + "Browse all items":"Browse all items", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.":"Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.", + "Running: %s/%s (%s%%)":"Running: %s/%s (%s%%)", + "Last run: %s; Next scheduled run: %s; Last runtime: %s":"Last run: %s; Next scheduled run: %s; Last runtime: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)":"Search for missing subtitles (in recently-added items, max-age: %s)", + "Automatically run periodically by the scheduler, if configured. %s":"Automatically run periodically by the scheduler, if configured. %s", + "Display ignore list (%d)":"Display ignore list (%d)", + "Show the current ignore list (mainly used for the automatic tasks)":"Show the current ignore list (mainly used for the automatic tasks)", + "History":"History", + "Show the last %i downloaded subtitles":"Show the last %i downloaded subtitles", + "Refresh":"Refresh", + "Re-lock menu(s)":"Re-lock menu(s)", + "Enabled the PIN again for menu(s)":"Enabled the PIN again for menu(s)", + "%s until %s (%s)":"%s until %s (%s)", + "Throttled providers: %s":"Throttled providers: %s", + "Advanced functions":"Advanced functions", + "Use at your own risk":"Use at your own risk", + "Items On Deck":"Items On Deck", + "Recently Played":"Recently Played", + "Items with missing subtitles":"Items with missing subtitles", + "Find recent items with missing subtitles":"Find recent items with missing subtitles", + "Updating, refresh here ...":"Updating, refresh here ...", + "Missing: %s":"Missing: %s", + "%s %s %s %s the ignore list":"%s %s %s %s the ignore list", + "Add":"Add", + "Remove":"Remove", + "to":"to", + "from":"from", + "add":"add", + "remove":"remove", + "removed from":"removed from", + "added to":"added to", + "Didn't change the ignore list":"Didn't change the ignore list", + "%s %s the ignore list":"%s %s the ignore list", + "Sections":"Sections", + "All":"All" } From ca11273b37e2e520d7a9878b5245fedb6a7a10e4 Mon Sep 17 00:00:00 2001 From: ukdtom Date: Mon, 2 Apr 2018 19:18:41 +0200 Subject: [PATCH 006/710] menu_helpers.py done, but look at line 3 --- Contents/Code/interface/menu_helpers.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 25ac9ba31..c0838b0d0 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -1,4 +1,7 @@ # coding=utf-8 + +# i18n: Look at line 248 + import traceback import types import datetime @@ -51,7 +54,7 @@ def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None oc.add(DirectoryObject( key=Callback(callback_menu, kind=use_kind, rating_key=rating_key, title=title), title=u"%s %s \"%s\"" % ( - "Un-Ignore" if in_list else "Ignore", ignore_list.verbose(kind) if add_kind else "", unicode(title)) + L("Un-Ignore") if in_list else L("Ignore"), ignore_list.verbose(kind) if add_kind else "", unicode(title)) ) ) @@ -103,14 +106,14 @@ def set_refresh_menu_state(state_or_media, media_type="movies"): for episode in media.seasons[season].episodes: ep = media.seasons[season].episodes[episode] media_id = ep.id - title = get_video_display_title("show", ep.title, parent_title=media.title, season=int(season), episode=int(episode)) + title = get_video_display_title(L("show"), ep.title, parent_title=media.title, season=int(season), episode=int(episode)) else: - title = get_video_display_title("movie", media.title) + title = get_video_display_title(L("movie"), media.title) intent = get_intent() force_refresh = intent.get("force", media_id) - Dict["current_refresh_state"] = u"%sRefreshing %s" % ("Force-" if force_refresh else "", unicode(title)) + Dict["current_refresh_state"] = L(u"%sRefreshing %s") % (L("Force-") if force_refresh else "", unicode(title)) def get_item_task_data(task_name, rating_key, language): @@ -178,7 +181,7 @@ def extract_embedded_sub(**kwargs): is_forced = is_stream_forced(stream) bn = os.path.basename(part.file) - set_refresh_menu_state(u"Extracting subtitle %s of %s" % (stream_index, bn)) + set_refresh_menu_state(L(u"Extracting subtitle %s of %s") % (stream_index, bn)) Log.Info(u"Extracting stream %s (%s) of %s", stream_index, display_language(language), bn) out_codec = stream.codec if stream.codec != "mov_text" else "srt" @@ -244,7 +247,7 @@ def __init__(self, *args, **kwargs): from support.helpers import pad_title, timestamp self.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), - title=pad_title("<< Back to home"), + title=pad_title(L("<< Back to home")), summary="Current state: %s; Last state: %s" % ( (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" @@ -265,4 +268,4 @@ def Content(self): self.SetHeader("Content-Disposition", 'attachment; filename="' + datetime.datetime.now().strftime("Logs_%y%m%d_%H-%M-%S.zip") + '"') - return self.zipdata \ No newline at end of file + return self.zipdata From 1c39c55423a7d3f0825e9bfe3e039bc6ee9a9bff Mon Sep 17 00:00:00 2001 From: ukdtom Date: Mon, 2 Apr 2018 19:20:05 +0200 Subject: [PATCH 007/710] menu_helpers done, but look at line 3 --- Contents/Code/interface/menu_helpers.py | 2 +- Contents/Strings/en.json | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index c0838b0d0..eb771b18a 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -1,6 +1,6 @@ # coding=utf-8 -# i18n: Look at line 248 +# i18n: Look at line 248 for problem import traceback import types diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 6a3a09a7c..afcda8125 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -186,5 +186,13 @@ "Didn't change the ignore list":"Didn't change the ignore list", "%s %s the ignore list":"%s %s the ignore list", "Sections":"Sections", - "All":"All" + "All":"All", + "Un-Ignore":"Un-Ignore", + "Ignore":"Ignore", + "show":"show", + "movie":"movie", + "%sRefreshing %s":"%sRefreshing %s", + "Force-":"Force-", + "Extracting subtitle %s of %s":"Extracting subtitle %s of %s", + "<< Back to home":"<< Back to home" } From ac9b81abead5f59233e1fe86493fe2bbb3bb48bb Mon Sep 17 00:00:00 2001 From: ukdtom Date: Mon, 2 Apr 2018 19:59:58 +0200 Subject: [PATCH 008/710] menu.py done --- Contents/Code/interface/main.py | 21 ++++++++------------- Contents/Code/interface/menu.py | 28 ++++++++++++++-------------- Contents/Strings/en.json | 9 ++++++++- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index 43caa1f03..196cb2f99 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -1,7 +1,4 @@ # coding=utf-8 - -# i18n: Look at line 90, 122, 129, 130, 137, 145, 152 - from subzero.constants import PREFIX, TITLE, ART from support.config import config from support.helpers import pad_title, timestamp, df, display_language @@ -87,8 +84,7 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r oc.add(DirectoryObject( key=Callback(RecentlyPlayedMenu), title=pad_title(L("Recently played items")), - # summary=L("Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.") % config.store_recently_played_amount, - summary="Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles." % config.store_recently_played_amount, + summary=F("Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", config.store_recently_played_amount), thumb=R("icon-played.jpg") )) oc.add(DirectoryObject( @@ -118,23 +114,22 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r else: lr = scheduler.last_run(task_name) nr = scheduler.next_run(task_name) - task_state = "Last run: %s; Next scheduled run: %s; Last runtime: %s" % ( + task_state = F("Last run: %s; Next scheduled run: %s; Last runtime: %s", df(scheduler.last_run(task_name)) if lr else "never", df(scheduler.next_run(task_name)) if nr else "never", str(task.last_run_time).split(".")[0]) oc.add(DirectoryObject( key=Callback(RefreshMissing, randomize=timestamp()), - title="Search for missing subtitles (in recently-added items, max-age: %s)" % Prefs[ - "scheduler.item_is_recent_age"], - # summary=L("Automatically run periodically by the scheduler, if configured. %s") % task_state, - summary="Automatically run periodically by the scheduler, if configured. %s" % task_state, + title=F("Search for missing subtitles (in recently-added items, max-age: %s)", Prefs[ + "scheduler.item_is_recent_age"]), + summary=F("Automatically run periodically by the scheduler, if configured. %s", task_state), thumb=R("icon-search.jpg") )) oc.add(DirectoryObject( key=Callback(IgnoreListMenu), - title="Display ignore list (%d)" % len(ignore_list), + title=F("Display ignore list (%d)", len(ignore_list)), summary=L("Show the current ignore list (mainly used for the automatic tasks)"), thumb=R("icon-ignore.jpg") )) @@ -142,14 +137,14 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r oc.add(DirectoryObject( key=Callback(HistoryMenu), title=L("History"), - summary="Show the last %i downloaded subtitles" % int(Prefs["history_size"]), + summary=F("Show the last %i downloaded subtitles", int(Prefs["history_size"])), thumb=R("icon-history.jpg") )) oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title(L("Refresh")), - summary="Current state: %s; Last state: %s" % ( + summary=F("Current state: %s; Last state: %s", (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" ), diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 4e2bb8cbc..5b6e72d7b 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -89,7 +89,7 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p oc.add(DirectoryObject( key=Callback(MetadataMenu, rating_key=show.rating_key, title=show.title, base_title=show.section.title, previous_item_type="section", display_items=True, randomize=timestamp()), - title=u"< Back to %s" % show.title, + title=L(u"< Back to %s") % show.title, thumb=show.thumb or default_thumb )) elif current_kind == "series": @@ -117,9 +117,9 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p title=title, previous_item_type=previous_item_type, with_mods=True, previous_rating_key=previous_rating_key, randomize=timestamp()), - title=u"Extract missing %s embedded subtitles" % display_language(lang), - summary="Extracts the not yet extracted embedded subtitles of all episodes for the current season " - "with all configured default modifications" + title=L(u"Extract missing %s embedded subtitles") % display_language(lang), + summary=L("Extracts the not yet extracted embedded subtitles of all episodes for the current season ") + + L("with all configured default modifications") )) oc.add(DirectoryObject( key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, @@ -127,24 +127,24 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p title=title, force=True, previous_item_type=previous_item_type, with_mods=True, previous_rating_key=previous_rating_key, randomize=timestamp()), - title=u"Extract and activate %s embedded subtitles" % display_language(lang), - summary="Extracts embedded subtitles of all episodes for the current season " - "with all configured default modifications" + title=L(u"Extract and activate %s embedded subtitles") % display_language(lang), + summary=L("Extracts embedded subtitles of all episodes for the current season ") + + L("with all configured default modifications") )) # add refresh oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=title, refresh_kind=current_kind, previous_rating_key=previous_rating_key, timeout=timeout * 1000, randomize=timestamp()), - title=u"Refresh: %s" % item_title, - summary="Refreshes the %s, possibly searching for missing and picking up new subtitles on disk" % current_kind + title=L(u"Refresh: %s") % item_title, + summary=L("Refreshes the %s, possibly searching for missing and picking up new subtitles on disk") % current_kind )) oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=title, force=True, refresh_kind=current_kind, previous_rating_key=previous_rating_key, timeout=timeout * 1000, randomize=timestamp()), - title=u"Auto-Find subtitles: %s" % item_title, - summary="Issues a forced refresh, ignoring known subtitles and searching for new ones" + title=L(u"Auto-Find subtitles: %s") % item_title, + summary=L("Issues a forced refresh, ignoring known subtitles and searching for new ones") )) else: return ItemDetailsMenu(rating_key=rating_key, title=title, item_title=item_title) @@ -164,8 +164,8 @@ def SeasonExtractEmbedded(**kwargs): Thread.Create(season_extract_embedded, **{"rating_key": rating_key, "requested_language": requested_language, "with_mods": with_mods, "force": force}) - kwargs["header"] = 'Success' - kwargs["message"] = u"Extracting of embedded subtitles for %s triggered" % title + kwargs["header"] = L("Success") + kwargs["message"] = L(u"Extracting of embedded subtitles for %s triggered") % title kwargs.pop("randomize") return MetadataMenu(randomize=timestamp(), title=item_title, **kwargs) @@ -231,7 +231,7 @@ def IgnoreListMenu(): def HistoryMenu(): from support.history import get_history history = get_history() - oc = SubFolderObjectContainer(title2="History", replace_parent=True) + oc = SubFolderObjectContainer(title2=L("History"), replace_parent=True) for item in history.items: possible_language = item.language diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index afcda8125..450fde550 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -194,5 +194,12 @@ "%sRefreshing %s":"%sRefreshing %s", "Force-":"Force-", "Extracting subtitle %s of %s":"Extracting subtitle %s of %s", - "<< Back to home":"<< Back to home" + "<< Back to home":"<< Back to home", + "Extract missing %s embedded subtitles":"Extract missing %s embedded subtitles", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season ":"Extracts the not yet extracted embedded subtitles of all episodes for the current season ", + "with all configured default modifications":"with all configured default modifications", + "Extract and activate %s embedded subtitles":"Extract and activate %s embedded subtitles", + "Extracts embedded subtitles of all episodes for the current season ":"Extracts embedded subtitles of all episodes for the current season ", + "Auto-Find subtitles: %s":"Auto-Find subtitles: %s", + "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered" } From 8f8da8e6eae5dbd961b525b4a8d8eb5e12306a83 Mon Sep 17 00:00:00 2001 From: ukdtom Date: Mon, 2 Apr 2018 20:01:32 +0200 Subject: [PATCH 009/710] fixed menu_helpers --- Contents/Code/interface/menu_helpers.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index eb771b18a..59ccd15bd 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -1,7 +1,4 @@ # coding=utf-8 - -# i18n: Look at line 248 for problem - import traceback import types import datetime @@ -248,7 +245,7 @@ def __init__(self, *args, **kwargs): self.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title(L("<< Back to home")), - summary="Current state: %s; Last state: %s" % ( + summary=F("Current state: %s; Last state: %s", (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" ) From 3b8c965f4b5edb00b6e2ddd0d6974fedd425c91a Mon Sep 17 00:00:00 2001 From: ukdtom Date: Mon, 2 Apr 2018 20:07:08 +0200 Subject: [PATCH 010/710] refresh_items done --- Contents/Code/interface/refresh_item.py | 4 ++-- Contents/Strings/en.json | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Contents/Code/interface/refresh_item.py b/Contents/Code/interface/refresh_item.py index 042baddc9..d746b1b7d 100644 --- a/Contents/Code/interface/refresh_item.py +++ b/Contents/Code/interface/refresh_item.py @@ -15,9 +15,9 @@ def RefreshItem(rating_key=None, came_from="/recent", item_title=None, force=Fal from interface.main import fatality header = " " if trigger: - set_refresh_menu_state(u"Triggering %sRefresh for %s" % ("Force-" if force else "", item_title)) + set_refresh_menu_state(F(u"Triggering %sRefresh for %s", L("Force-") if force else "", item_title)) Thread.Create(refresh_item, rating_key=rating_key, force=force, refresh_kind=refresh_kind, parent_rating_key=previous_rating_key, timeout=int(timeout)) - header = u"%s of item %s triggered" % ("Refresh" if not force else "Forced-refresh", rating_key) + header = F(u"%s of item %s triggered", L("Refresh") if not force else L("Forced-refresh"), rating_key) return fatality(randomize=timestamp(), header=header, replace_parent=True) diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 450fde550..b1f9ea163 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -201,5 +201,8 @@ "Extract and activate %s embedded subtitles":"Extract and activate %s embedded subtitles", "Extracts embedded subtitles of all episodes for the current season ":"Extracts embedded subtitles of all episodes for the current season ", "Auto-Find subtitles: %s":"Auto-Find subtitles: %s", - "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered" + "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered", + "Triggering %sRefresh for %s":"Triggering %sRefresh for %s", + "%s of item %s triggered":"%s of item %s triggered", + "Forced-refresh":"Forced-refresh" } From 525256e15cc7d92d7e9bf0ae611960857bf001f8 Mon Sep 17 00:00:00 2001 From: ukdtom Date: Mon, 2 Apr 2018 21:16:49 +0200 Subject: [PATCH 011/710] Everything in /Contents/Code/Interface done --- Contents/Code/interface/advanced.py | 4 +- Contents/Code/interface/item_details.py | 112 +++++++++++++----------- Contents/Code/interface/main.py | 16 ++-- Contents/Code/interface/menu.py | 16 ++-- Contents/Code/interface/menu_helpers.py | 6 +- Contents/Code/interface/sub_mod.py | 34 +++---- Contents/Strings/en.json | 18 +++- 7 files changed, 115 insertions(+), 91 deletions(-) diff --git a/Contents/Code/interface/advanced.py b/Contents/Code/interface/advanced.py index a097a74d2..97e3b1019 100644 --- a/Contents/Code/interface/advanced.py +++ b/Contents/Code/interface/advanced.py @@ -163,7 +163,7 @@ def ResetStorage(key, randomize=None, sure=False): return AdvancedMenu( randomize=timestamp(), header=L("Success"), - message=L("Information Storage (%s) reset") % key + message=F("Information Storage (%s) reset", key) ) @@ -173,7 +173,7 @@ def LogStorage(key, randomize=None): return AdvancedMenu( randomize=timestamp(), header=L("Success"), - message=L("Information Storage (%s) logged") % key + message=F("Information Storage (%s) logged", key) ) diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index 51bb580cf..bc37f7354 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -56,7 +56,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra base_title=base_title, item_title=item_title, randomize=timestamp()), - title=L(u"Item not found: %s!") % item_title, + title=F(u"Item not found: %s!", item_title), summary=L("Plex didn't return any information about the item, please refresh it and come back later"), thumb=default_thumb )) @@ -78,8 +78,8 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra previous_rating_key=show.rating_key, display_items=True, randomize=timestamp()), - title=L(u"< Back to %s") % season.title, - summary=L("Back to %s > %s") % (show.title, season.title), + title=F(u"< Back to %s", season.title), + summary=F("Back to %s > %s", show.title, season.title), thumb=season.thumb or default_thumb )) @@ -90,14 +90,14 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra item_title=item_title, randomize=timestamp(), timeout=timeout * 1000), - title=L(u"Refresh: %s") % item_title, - summary=L("Refreshes the %s, possibly searching for missing and picking up new subtitles on disk") % current_kind, + title=F(u"Refresh: %s", item_title), + summary=F("Refreshes the %s, possibly searching for missing and picking up new subtitles on disk", current_kind), thumb=item.thumb or default_thumb )) oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=item_title, force=True, randomize=timestamp(), timeout=timeout * 1000), - title=L(u"Force-find subtitles: %s") % item_title, + title=F(u"Force-find subtitles: %s", item_title), summary=L("Issues a forced refresh, ignoring known subtitles and searching for new ones"), thumb=item.thumb or default_thumb )) @@ -121,7 +121,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra part_index_addon = "" part_summary_addon = "" if has_multiple_parts: - part_index_addon = L(u"File %s: ") % part_index + part_index_addon = F(u"File %s: ", part_index) part_summary_addon = "%s " % filename # iterate through all configured languages @@ -131,14 +131,14 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra current_sub_id = None current_sub_provider_name = None - summary = L(u"%sNo current subtitle in storage") % part_summary_addon + summary = F(u"%sNo current subtitle in storage", part_summary_addon) current_score = None if current_sub: current_sub_id = current_sub.id current_sub_provider_name = current_sub.provider_name current_score = current_sub.score - summary = L(u"%sCurrent subtitle: %s (added: %s, %s), Language: %s, Score: %i, Storage: %s") % ( + summary = F(u"%sCurrent subtitle: %s (added: %s, %s), Language: %s, Score: %i, Storage: %s", part_summary_addon, current_sub.provider_name, df(current_sub.date_added), current_sub.mode_verbose, display_language(lang), current_sub.score, @@ -151,7 +151,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra item_type=plex_item.type, filename=filename, current_data=summary, randomize=timestamp(), current_provider=current_sub_provider_name, current_score=current_score), - title=L(u"%sManage %s subtitle") % (part_index_addon, display_language(lang)), + title=F(u"%sManage %s subtitle", part_index_addon, display_language(lang)), summary=summary )) else: @@ -162,7 +162,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra item_type=plex_item.type, filename=filename, current_data=summary, randomize=timestamp(), current_provider=current_sub_provider_name, current_score=current_score), - title=L(u"%sList %s subtitles") % (part_index_addon, display_language(lang)), + title=F(u"%sList %s subtitles", part_index_addon, display_language(lang)), summary=summary )) @@ -187,7 +187,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra key=Callback(ListEmbeddedSubsForItemMenu, rating_key=rating_key, part_id=part_id, title=title, item_type=plex_item.type, item_title=item_title, base_title=base_title, randomize=timestamp()), - title=L(u"%sEmbedded subtitles (%s)") % ( + title=F(u"%sEmbedded subtitles (%s)", part_index_addon, ", ".join(display_language(l) for l in set(embedded_langs))), summary=L(u"Extract and activate embedded subtitle streams") @@ -218,33 +218,33 @@ def SubtitleOptionsMenu(**kwargs): oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), - title=L(u"< Back to %s") % kwargs["title"], + title=F(u"< Back to %s", kwargs["title"]), summary=kwargs["current_data"], thumb=default_thumb )) if subs_count: oc.add(DirectoryObject( key=Callback(ListStoredSubsForItemMenu, randomize=timestamp(), **kwargs), - title=L(u"Select active %s subtitle") % kwargs["language_name"], - summary=L(u"%d subtitles in storage") % subs_count + title=F(u"Select active %s subtitle", kwargs["language_name"]), + summary=F(u"%d subtitles in storage", subs_count) )) oc.add(DirectoryObject( key=Callback(ListAvailableSubsForItemMenu, randomize=timestamp(), **kwargs), - title=L(u"List available %s subtitles") % kwargs["language_name"], + title=F(u"List available %s subtitles", kwargs["language_name"]), summary=kwargs["current_data"] )) if current_sub: oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title=L(u"Modify current %s subtitle") % kwargs["language_name"], - summary=L(u"Currently applied mods: %s") % (", ".join(current_sub.mods) if current_sub.mods else "none") + title=F(u"Modify current %s subtitle", kwargs["language_name"]), + summary=F(u"Currently applied mods: %s", (", ".join(current_sub.mods) if current_sub.mods else "none")) )) if current_sub.provider_name != "embedded": oc.add(DirectoryObject( key=Callback(BlacklistSubtitleMenu, randomize=timestamp(), **kwargs), - title=L(u"Blacklist current %s subtitle and search for a new one") % kwargs["language_name"], + title=F(u"Blacklist current %s subtitle and search for a new one", kwargs["language_name"]), summary=current_data )) @@ -252,7 +252,7 @@ def SubtitleOptionsMenu(**kwargs): if current_bl: oc.add(DirectoryObject( key=Callback(ManageBlacklistMenu, randomize=timestamp(), **kwargs), - title=L(u"Manage blacklist (%s contained)") % len(current_bl), + title=F(u"Manage blacklist (%s contained)", len(current_bl)), summary=L(u"Inspect currently blacklisted subtitles") )) @@ -275,10 +275,11 @@ def ListStoredSubsForItemMenu(**kwargs): key=lambda x: x[1].date_added, reverse=True): is_current = key == all_subs["current"] - summary = u"added: %s, %s, Language: %s, Score: %i, Storage: %s" % \ + summary = F(u"added: %s, %s, Language: %s, Score: %i, Storage: %s", (df(subtitle.date_added), - subtitle.mode_verbose, display_language(language), subtitle.score, - subtitle.storage_type) + subtitle.mode_verbose, display_language(language), + subtitle.score, + subtitle.storage_type)) sub_name = subtitle.provider_name if sub_name == "embedded": @@ -286,7 +287,7 @@ def ListStoredSubsForItemMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SelectStoredSubForItemMenu, randomize=timestamp(), sub_key="__".join(key), **kwargs), - title=L(u"%s%s, Score: %s") % ("Current: " if is_current else "Stored: ", sub_name, + title=F(u"%s%s, Score: %s", "Current: " if is_current else "Stored: ", sub_name, subtitle.score), summary=summary )) @@ -424,7 +425,7 @@ def ManageBlacklistMenu(**kwargs): oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), - title=L(u"< Back to %s") % kwargs["title"], + title=F(u"< Back to %s", kwargs["title"]), summary=kwargs["current_data"], thumb=default_thumb )) @@ -435,10 +436,11 @@ def sorter(pair): for sub_key, data in sorted(current_bl.iteritems(), key=sorter, reverse=True): provider_name, subtitle_id = sub_key - title = L(u"%s, %s (added: %s, %s), Language: %s, Score: %i, Storage: %s") % (provider_name, subtitle_id, df(data["date_added"]), - current_sub.get_mode_verbose(data["mode"]), - display_language(Language.fromietf(language)), data["score"], - data["storage_type"]) + title = F(u"%s, %s (added: %s, %s), Language: %s, Score: %i, Storage: %s", + provider_name, subtitle_id, df(data["date_added"]), + current_sub.get_mode_verbose(data["mode"]), + display_language(Language.fromietf(language)), data["score"], + data["storage_type"]) oc.add(DirectoryObject( key=Callback(ManageBlacklistMenu, remove_sub_key="__".join(sub_key), randomize=timestamp(), **kwargs), title=title, @@ -469,7 +471,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item oc = SubFolderObjectContainer(title2=unicode(title), replace_parent=True) oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=rating_key, item_title=item_title, title=title, randomize=timestamp()), - title=L(u"< Back to %s") % title, + title=F(u"< Back to %s", title), summary=current_data, thumb=default_thumb )) @@ -487,20 +489,20 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item video_display_data = [video.format] if video.format else [] if video.release_group: - video_display_data.append(L(u"by %s") % video.release_group) + video_display_data.append(F(u"by %s", video.release_group)) video_display_data = " ".join(video_display_data) else: video_display_data = metadata["filename"] - current_display = (L(u"Current: %s (%s) ") % (current_provider, current_score) if current_provider else "") + current_display = (F(u"Current: %s (%s) ", current_provider, current_score if current_provider else "")) if not running: oc.add(DirectoryObject( key=Callback(ListAvailableSubsForItemMenu, rating_key=rating_key, item_title=item_title, language=language, filename=filename, part_id=part_id, title=title, current_id=current_id, force=True, current_provider=current_provider, current_score=current_score, current_data=current_data, item_type=item_type, randomize=timestamp()), - title=L(u"Search for %s subs (%s)") % (get_language(language).name, video_display_data), - summary=L(u"%sFilename: %s") % (current_display, filename), + title=F(u"Search for %s subs (%s)", get_language(language).name, video_display_data), + summary=F(u"%sFilename: %s", current_display, filename), thumb=default_thumb )) @@ -512,7 +514,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item current_provider=current_provider, current_score=current_score, randomize=timestamp()), title=L(u"No subtitles found"), - summary=L(u"%sFilename: %s") % (current_display, filename), + summary=F(u"%sFilename: %s", current_display, filename), thumb=default_thumb )) else: @@ -522,9 +524,10 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item part_id=part_id, title=title, current_id=current_id, item_type=item_type, current_provider=current_provider, current_score=current_score, randomize=timestamp()), - title=L(u"Searching for %s subs (%s), refresh here ...") % (display_language(get_language(language)), - video_display_data), - summary=L(u"%sFilename: %s") % (current_display, filename), + title=F(u"Searching for %s subs (%s), refresh here ...", + display_language(get_language(language)), + video_display_data), + summary=F(u"%sFilename: %s", current_display, filename), thumb=default_thumb )) @@ -546,16 +549,16 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item wrong_fps_addon = "" if subtitle.wrong_fps: if plex_part: - wrong_fps_addon = L(" (wrong FPS, sub: %s, media: %s)") % (subtitle.fps, plex_part.fps) + wrong_fps_addon = F(" (wrong FPS, sub: %s, media: %s)", subtitle.fps, plex_part.fps) else: - wrong_fps_addon = L(" (wrong FPS, sub: %s, media: unknown, low impact mode)") % subtitle.fps + wrong_fps_addon = F(" (wrong FPS, sub: %s, media: unknown, low impact mode)", subtitle.fps) oc.add(DirectoryObject( key=Callback(TriggerDownloadSubtitle, rating_key=rating_key, randomize=timestamp(), item_title=item_title, subtitle_id=str(subtitle.id), language=language), - title=L(u"%s%s: %s, score: %s%s") % (bl_addon, "Available" if current_id != subtitle.id else "Current", + title=F(u"%s%s: %s, score: %s%s", bl_addon, "Available" if current_id != subtitle.id else "Current", subtitle.provider_name, subtitle.score, wrong_fps_addon), - summary=L(u"Release: %s, Matches: %s") % (subtitle.release_info, ", ".join(subtitle.matches)), + summary=F(u"Release: %s, Matches: %s", subtitle.release_info, ", ".join(subtitle.matches)), thumb=default_thumb )) @@ -569,7 +572,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item def TriggerDownloadSubtitle(rating_key=None, subtitle_id=None, item_title=None, language=None, randomize=None): from interface.main import fatality - set_refresh_menu_state(L("Downloading subtitle for %s") % item_title or rating_key) + set_refresh_menu_state(F("Downloading subtitle for %s", item_title or rating_key)) search_results = get_item_task_data("AvailableSubsForItem", rating_key, language) download_subtitle = None @@ -600,7 +603,7 @@ def ListEmbeddedSubsForItemMenu(**kwargs): oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], base_title=kwargs["base_title"], title=kwargs["item_title"], randomize=timestamp()), - title=u"< Back to %s" % kwargs["title"], + title=F("< Back to %s", kwargs["title"]), thumb=default_thumb )) @@ -618,18 +621,20 @@ def ListEmbeddedSubsForItemMenu(**kwargs): oc.add(DirectoryObject( key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), stream_index=str(stream.index), language=language, with_mods=True, **kwargs), - title=L(u"Extract stream %s, %s%s%s%s with default mods") % (stream.index, display_language(language), - L(" (unknown)") if is_unknown else "", - L(" (forced)") if is_forced else "", - " (\"%s\")" % stream.title if stream.title else ""), + title=F(u"Extract stream %s, %s%s%s%s with default mods", + stream.index, display_language(language), + L(" (unknown)") if is_unknown else "", + L(" (forced)") if is_forced else "", + " (\"%s\")" % stream.title if stream.title else ""), )) oc.add(DirectoryObject( key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), stream_index=str(stream.index), language=language, **kwargs), - title=L(u"Extract stream %s, %s%s%s%s") % (stream.index, display_language(language), - L(" (unknown)") if is_unknown else "", - L(" (forced)") if is_forced else "", - " (\"%s\")" % stream.title if stream.title else ""), + title=F(u"Extract stream %s, %s%s%s%s", + stream.index, display_language(language), + L(" (unknown)") if is_unknown else "", + L(" (forced)") if is_forced else "", + " (\"%s\")" % stream.title if stream.title else ""), )) return oc @@ -642,7 +647,8 @@ def TriggerExtractEmbeddedSubForItemMenu(**kwargs): stream_index = kwargs.get("stream_index") Thread.Create(extract_embedded_sub, **kwargs) - header = L(u"Extracting of embedded subtitle %s of part %s:%s triggered") % (stream_index, rating_key, part_id) + header = F(u"Extracting of embedded subtitle %s of part %s:%s triggered", + stream_index, rating_key, part_id) kwargs.pop("randomize") kwargs.pop("item_type") diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index 196cb2f99..471194e49 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -51,7 +51,7 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), title=pad_title(L("Insufficient permissions")), - summary=L("Insufficient permissions on library %s, folder: %s") % (title, path), + summary=F("Insufficient permissions on library %s, folder: %s", title, path), )) return oc @@ -68,7 +68,7 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title(L("Working ... refresh here")), - summary=L("Current state: %s; Last state: %s") % ( + summary=F("Current state: %s; Last state: %s", (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" ) @@ -110,7 +110,7 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r task = scheduler.task(task_name) if task.ready_for_display: - task_state = L("Running: %s/%s (%s%%)") % (task.items_done, task.items_searching, task.percentage) + task_state = F("Running: %s/%s (%s%%)", task.items_done, task.items_searching, task.percentage) else: lr = scheduler.last_run(task_name) nr = scheduler.next_run(task_name) @@ -164,11 +164,11 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r summary_data = [] for provider, data in Dict["provider_throttle"].iteritems(): reason, until, desc = data - summary_data.append(L("%s until %s (%s)") % (provider, until.strftime("%y/%m/%d %H:%M"), reason)) + summary_data.append(F("%s until %s (%s)", provider, until.strftime("%y/%m/%d %H:%M"), reason)) oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), - title=pad_title(L("Throttled providers: %s") % ", ".join(Dict["provider_throttle"].keys())), + title=pad_title(F("Throttled providers: %s", ", ".join(Dict["provider_throttle"].keys()))), summary=", ".join(summary_data), thumb=R("icon-throttled.jpg") )) @@ -259,7 +259,7 @@ def RecentMissingSubtitlesMenu(force=False, randomize=None): key=Callback(ItemDetailsMenu, title=title + " > " + item_title, item_title=item_title, rating_key=item_id), title=item_title, - summary=L("Missing: %s") % ", ".join(display_language(l) for l in missing_languages), + summary=F("Missing: %s", ", ".join(display_language(l) for l in missing_languages)), thumb=get_item_thumb(item) or default_thumb )) @@ -317,7 +317,7 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): """ is_ignored = rating_key in ignore_list[kind] if not sure: - oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1=L("%s %s %s %s the ignore list") % ( + oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1=F("%s %s %s %s the ignore list", L("Add") if not is_ignored else L("Remove"), ignore_list.verbose(kind), title, L("to") if not is_ignored else L("from")), title2=L("Are you sure?")) oc.add(DirectoryObject( @@ -353,7 +353,7 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): if dont_change: return fatality(force_title=" ", header=L("Didn't change the ignore list"), no_history=True) - return fatality(force_title=" ", header=L("%s %s the ignore list") % (title, state), no_history=True) + return fatality(force_title=" ", header=F("%s %s the ignore list", title, state), no_history=True) @route(PREFIX + '/sections') diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 5b6e72d7b..3d7a0063a 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -89,7 +89,7 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p oc.add(DirectoryObject( key=Callback(MetadataMenu, rating_key=show.rating_key, title=show.title, base_title=show.section.title, previous_item_type="section", display_items=True, randomize=timestamp()), - title=L(u"< Back to %s") % show.title, + title=F(u"< Back to %s", show.title), thumb=show.thumb or default_thumb )) elif current_kind == "series": @@ -117,7 +117,7 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p title=title, previous_item_type=previous_item_type, with_mods=True, previous_rating_key=previous_rating_key, randomize=timestamp()), - title=L(u"Extract missing %s embedded subtitles") % display_language(lang), + title=F(u"Extract missing %s embedded subtitles", display_language(lang)), summary=L("Extracts the not yet extracted embedded subtitles of all episodes for the current season ") + L("with all configured default modifications") )) @@ -127,7 +127,7 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p title=title, force=True, previous_item_type=previous_item_type, with_mods=True, previous_rating_key=previous_rating_key, randomize=timestamp()), - title=L(u"Extract and activate %s embedded subtitles") % display_language(lang), + title=F(u"Extract and activate %s embedded subtitles", display_language(lang)), summary=L("Extracts embedded subtitles of all episodes for the current season ") + L("with all configured default modifications") )) @@ -136,14 +136,14 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=title, refresh_kind=current_kind, previous_rating_key=previous_rating_key, timeout=timeout * 1000, randomize=timestamp()), - title=L(u"Refresh: %s") % item_title, - summary=L("Refreshes the %s, possibly searching for missing and picking up new subtitles on disk") % current_kind + title=F(u"Refresh: %s", item_title), + summary=F("Refreshes the %s, possibly searching for missing and picking up new subtitles on disk", current_kind) )) oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=title, force=True, refresh_kind=current_kind, previous_rating_key=previous_rating_key, timeout=timeout * 1000, randomize=timestamp()), - title=L(u"Auto-Find subtitles: %s") % item_title, + title=F(u"Auto-Find subtitles: %s", item_title), summary=L("Issues a forced refresh, ignoring known subtitles and searching for new ones") )) else: @@ -165,7 +165,7 @@ def SeasonExtractEmbedded(**kwargs): "with_mods": with_mods, "force": force}) kwargs["header"] = L("Success") - kwargs["message"] = L(u"Extracting of embedded subtitles for %s triggered") % title + kwargs["message"] = F(u"Extracting of embedded subtitles for %s triggered", title) kwargs.pop("randomize") return MetadataMenu(randomize=timestamp(), title=item_title, **kwargs) @@ -241,7 +241,7 @@ def HistoryMenu(): key=Callback(ItemDetailsMenu, title=item.title, item_title=item.item_title, rating_key=item.rating_key), title=u"%s (%s)" % (item.item_title, item.mode_verbose), - summary=u"%s in %s (%s, score: %s), %s" % (language_display, item.section_title, + summary=F(u"%s in %s (%s, score: %s), %s", language_display, item.section_title, item.provider_name, item.score, df(item.time)) )) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 59ccd15bd..8568552c1 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -110,7 +110,9 @@ def set_refresh_menu_state(state_or_media, media_type="movies"): intent = get_intent() force_refresh = intent.get("force", media_id) - Dict["current_refresh_state"] = L(u"%sRefreshing %s") % (L("Force-") if force_refresh else "", unicode(title)) + Dict["current_refresh_state"] = F(u"%sRefreshing %s", + L("Force-") if force_refresh else "", + unicode(title)) def get_item_task_data(task_name, rating_key, language): @@ -178,7 +180,7 @@ def extract_embedded_sub(**kwargs): is_forced = is_stream_forced(stream) bn = os.path.basename(part.file) - set_refresh_menu_state(L(u"Extracting subtitle %s of %s") % (stream_index, bn)) + set_refresh_menu_state(F(u"Extracting subtitle %s of %s", stream_index, bn)) Log.Info(u"Extracting stream %s (%s) of %s", stream_index, display_language(language), bn) out_codec = stream.codec if stream.codec != "mov_text" else "srt" diff --git a/Contents/Code/interface/sub_mod.py b/Contents/Code/interface/sub_mod.py index b9c6b3cdd..e0efcaa00 100644 --- a/Contents/Code/interface/sub_mod.py +++ b/Contents/Code/interface/sub_mod.py @@ -31,7 +31,7 @@ def SubtitleModificationsMenu(**kwargs): from interface.item_details import SubtitleOptionsMenu oc.add(DirectoryObject( key=Callback(SubtitleOptionsMenu, randomize=timestamp(), **kwargs), - title=u"< Back to subtitle options for: %s" % kwargs["title"], + title=F(u"< Back to subtitle options for: %s", kwargs["title"]), summary=kwargs["current_data"], thumb=default_thumb )) @@ -72,24 +72,24 @@ def SubtitleModificationsMenu(**kwargs): if current_mods: oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="remove_last", randomize=timestamp(), **kwargs), - title=pad_title("Remove last applied mod (%s)" % current_mods[-1]), - summary=u"Currently applied mods: %s" % (", ".join(current_mods) if current_mods else "none") + title=pad_title(F("Remove last applied mod (%s)", current_mods[-1])), + summary=F(u"Currently applied mods: %s", ", ".join(current_mods) if current_mods else L("none")) )) oc.add(DirectoryObject( key=Callback(SubtitleListMods, randomize=timestamp(), **kwargs), - title=pad_title("Manage applied mods"), - summary=u"Currently applied mods: %s" % (", ".join(current_mods)) + title=pad_title(L("Manage applied mods")), + summary=F(u"Currently applied mods: %s", ", ".join(current_mods)) )) oc.add(DirectoryObject( key=Callback(SubtitleReapplyMods, randomize=timestamp(), **kwargs), - title=pad_title("Reapply applied mods"), - summary=u"Currently applied mods: %s" % (", ".join(current_mods) if current_mods else "none") + title=pad_title(L("Reapply applied mods")), + summary=F(u"Currently applied mods: %s", ", ".join(current_mods) if current_mods else L("none")) )) oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="clear", randomize=timestamp(), **kwargs), - title=pad_title("Restore original version"), - summary=u"Currently applied mods: %s" % (", ".join(current_mods) if current_mods else "none") + title=pad_title(L("Restore original version")), + summary=F(u"Currently applied mods: %s", ", ".join(current_mods) if current_mods else L("none")) )) storage.destroy() @@ -109,7 +109,7 @@ def SubtitleFPSModMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title="< Back to subtitle modification menu" + title=L("< Back to subtitle modification menu") )) metadata = get_plex_metadata(rating_key, part_id, item_type) @@ -123,14 +123,14 @@ def SubtitleFPSModMenu(**kwargs): continue if float(fps) > float(target_fps): - indicator = "subs constantly getting faster" + indicator = L("subs constantly getting faster") else: - indicator = "subs constantly getting slower" + indicator = L("subs constantly getting slower") mod_ident = SubtitleModifications.get_mod_signature("change_FPS", **{"from": fps, "to": target_fps}) oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=mod_ident, mode="add", randomize=timestamp(), **kwargs), - title="%s fps -> %s fps (%s)" % (fps, target_fps, indicator) + title=F("%s fps -> %s fps (%s)", fps, target_fps, indicator) )) return oc @@ -148,13 +148,13 @@ def SubtitleShiftModUnitMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title="< Back to subtitle modifications" + title=L("< Back to subtitle modifications") )) for unit, title in POSSIBLE_UNITS: oc.add(DirectoryObject( key=Callback(SubtitleShiftModMenu, unit=unit, randomize=timestamp(), **kwargs), - title="Adjust by %s" % title + title=F("Adjust by %s", title) )) return oc @@ -171,7 +171,7 @@ def SubtitleShiftModMenu(unit=None, **kwargs): oc.add(DirectoryObject( key=Callback(SubtitleShiftModUnitMenu, randomize=timestamp(), **kwargs), - title="< Back to unit selection" + title=L("< Back to unit selection") )) rng = [] @@ -273,7 +273,7 @@ def SubtitleListMods(**kwargs): for identifier in current_sub.mods: oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=identifier, mode="remove", randomize=timestamp(), **kwargs), - title="Remove: %s" % identifier + title=F("Remove: %s", identifier) )) storage.destroy() diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index b1f9ea163..d684c59b5 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -204,5 +204,21 @@ "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered", "Triggering %sRefresh for %s":"Triggering %sRefresh for %s", "%s of item %s triggered":"%s of item %s triggered", - "Forced-refresh":"Forced-refresh" + "Forced-refresh":"Forced-refresh", + "< Back to subtitle options for: %s":"< Back to subtitle options for: %s", + "Remove last applied mod (%s)":"Remove last applied mod (%s)", + "none":"none", + "Manage applied mods":"Manage applied mods", + "Reapply applied mods":"Reapply applied mods", + "Restore original version":"Restore original version", + "< Back to subtitle modification menu":"< Back to subtitle modification menu", + "subs constantly getting faster":"subs constantly getting faster", + "subs constantly getting slower":"subs constantly getting slower", + "%s fps -> %s fps (%s)":"%s fps -> %s fps (%s)", + "< Back to subtitle modifications":"< Back to subtitle modifications", + "Adjust by %s":"Adjust by %s", + "< Back to unit selection":"< Back to unit selection", + "added: %s, %s, Language: %s, Score: %i, Storage: %s":"added: %s, %s, Language: %s, Score: %i, Storage: %s", + "Remove: %s":"Remove: %s" + } From ac209e7ee2157691d27e07c783535085a076c20f Mon Sep 17 00:00:00 2001 From: ukdtom Date: Tue, 3 Apr 2018 00:27:08 +0200 Subject: [PATCH 012/710] Prefs translated --- Contents/Strings/en.json | 160 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 158 insertions(+), 2 deletions(-) diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index d684c59b5..6c042382b 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -219,6 +219,162 @@ "Adjust by %s":"Adjust by %s", "< Back to unit selection":"< Back to unit selection", "added: %s, %s, Language: %s, Score: %i, Storage: %s":"added: %s, %s, Language: %s, Score: %i, Storage: %s", - "Remove: %s":"Remove: %s" - + "Remove: %s":"Remove: %s", + "Subtitle Language (1)":"Subtitle Language (1)", + "Subtitle Language (2)":"Subtitle Language (2)", + "Subtitle Language (3)":"Subtitle Language (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)":"Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)", + "Only download foreign/forced subtitles":"Only download foreign/forced subtitles", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)":"Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)":"Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")":"Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1":"Embedded subtitles: Treat \"Undefined\" (und) as language 1", + "I rename my files using":"I rename my files using", + "Retrieve original filename from .file_info/file_info index files (see wiki)":"Retrieve original filename from .file_info/file_info index files (see wiki)", + "Sonarr URL (add URL base if configured)":"Sonarr URL (add URL base if configured)", + "Sonarr API key":"Sonarr API key", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)":"Radarr URL (add URL base if configured, min. version: 0.2.0.897)", + "Radarr API key":"Radarr API key", + "Provider: Enable OpenSubtitles":"Provider: Enable OpenSubtitles", + "Opensubtitles Username":"Opensubtitles Username", + "Opensubtitles Password":"Opensubtitles Password", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)":"OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET":"Provider: Enable Podnapisi.NET", + "Provider: Enable Titlovi.com":"Provider: Enable Titlovi.com", + "Provider: Enable Addic7ed":"Provider: Enable Addic7ed", + "Addic7ed Username":"Addic7ed Username", + "Addic7ed Password":"Addic7ed Password", + "Addic7ed: boost score (if requirements met)":"Addic7ed: boost score (if requirements met)", + "Addic7ed: Use random user agents":"Addic7ed: Use random user agents", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)":"Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", + "Legendas TV Username":"Legendas TV Username", + "Legendas TV Password":"Legendas TV Password", + "Provider: Enable TVsubtitles.net":"Provider: Enable TVsubtitles.net", + "Provider: Enable NapiProjekt.pl (Polish)":"Provider: Enable NapiProjekt.pl (Polish)", + "Provider: Enable SubScene (TV shows)":"Provider: Enable SubScene (TV shows)", + "Provider: Enable hosszupuskasub.com (Hungarian)":"Provider: Enable hosszupuskasub.com (Hungarian)", + "Provider: Enable aRGENTeaM (Spanish)":"Provider: Enable aRGENTeaM (Spanish)", + "Search enabled providers simultaneously (multithreading)":"Search enabled providers simultaneously (multithreading)", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)":"Automatically extract and use embedded subtitles upon media addition (with configured default mods)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?":"After automatic extraction of embedded subtitles, also immediately search for available subtitles?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?":"Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?":"Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?", + "How strict should these subtitles existing on the filesystem be detected?":"How strict should these subtitles existing on the filesystem be detected?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?":"Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)":"Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)":"Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)", + "Download hearing impaired subtitles.":"Download hearing impaired subtitles.", + "Remove Hearing Impaired tags from downloaded subtitles":"Remove Hearing Impaired tags from downloaded subtitles", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)":"Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)", + "Fix common issues in subtitles":"Fix common issues in subtitles", + "Fix common OCR errors in downloaded subtitles":"Fix common OCR errors in downloaded subtitles", + "Reverse punctuation in RTL languages (heb)":"Reverse punctuation in RTL languages (heb)", + "Change colors of subtitles to":"Change colors of subtitles to", + "Store subtitles next to media files (instead of metadata)":"Store subtitles next to media files (instead of metadata)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)":"Subtitle formats to save (non-SRT only works if the previous option is enabled)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)":"Subtitle Folder (\"current folder\" is the folder the current media file lives in)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)":"Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)", + "Fall back to metadata storage if filesystem storage failed":"Fall back to metadata storage if filesystem storage failed", + "Set subtitle file permissions to (integer, e.g.: 0775)":"Set subtitle file permissions to (integer, e.g.: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles":"Automatically delete leftover/unused (externally saved) subtitles", + "On media playback: search for missing subtitles (refresh item)":"On media playback: search for missing subtitles (refresh item)", + "Scheduler: Periodically search for recent items with missing subtitles":"Scheduler: Periodically search for recent items with missing subtitles", + "Scheduler: Item age to be considered recent":"Scheduler: Item age to be considered recent", + "Scheduler: Recent items to consider per library":"Scheduler: Recent items to consider per library", + "Scheduler: Periodically search for better subtitles":"Scheduler: Periodically search for better subtitles", + "Scheduler: Days to search for better subtitles (max: 30 days)":"Scheduler: Days to search for better subtitles (max: 30 days)", + "Scheduler: Don't search for better subtitles if the item's air date is older than":"Scheduler: Don't search for better subtitles if the item's air date is older than", + "Scheduler: Overwrite manually selected subtitles when better found":"Scheduler: Overwrite manually selected subtitles when better found", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found":"Scheduler: Overwrite subtitles with non-default subtitle modifications when better found", + "History: amount of items to store historical data for":"History: amount of items to store historical data for", + "How many download tries per subtitle (on timeout or error)":"How many download tries per subtitle (on timeout or error)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)":"Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)", + "Ignore anything in the following paths (comma-separated)":"Ignore anything in the following paths (comma-separated)", + "Sub-Zero mode":"Sub-Zero mode", + "Access PIN (any amount of numbers, 0-9)":"Access PIN (any amount of numbers, 0-9)", + "Access PIN valid for minutes":"Access PIN valid for minutes", + "Use PIN to restrict access to (needs plugin or PMS restart)":"Use PIN to restrict access to (needs plugin or PMS restart)", + "Call this executable upon successful subtitle download (see Wiki for details)":"Call this executable upon successful subtitle download (see Wiki for details)", + "Check for correct folder permissions of every library on plugin start":"Check for correct folder permissions of every library on plugin start", + "Use new style caching (for subliminal)":"Use new style caching (for subliminal)", + "Low impact mode (for remote filesystems)":"Low impact mode (for remote filesystems)", + "Timeout for API requests sent to the PMS":"Timeout for API requests sent to the PMS", + "HTTP proxy to use for providers (supports credentials)":"HTTP proxy to use for providers (supports credentials)", + "How verbose should the logging be?":"How verbose should the logging be?", + "How many log backups to keep?":"How many log backups to keep?", + "Log subtitle modification (debug)":"Log subtitle modification (debug)", + "Log to console (for development/debugging)":"Log to console (for development/debugging)", + "Collect anonymous usage statistics":"Collect anonymous usage statistics", + "Sonarr/Radarr (fill api info below)":"Sonarr/Radarr (fill api info below)", + "Filebot":"Filebot", + "Sonarr/Radarr/Filebot":"Sonarr/Radarr/Filebot", + "Symlink to original file":"Symlink to original file", + "I keep the original filenames":"I keep the original filenames", + "none of the above":"none of the above", + "exact: media filename match":"exact: media filename match", + "loose: filename contains media filename":"loose: filename contains media filename", + "any":"any", + "prefer":"prefer", + "don't prefer":"don't prefer", + "force HI":"force HI", + "force non-HI":"force non-HI", + "don't change":"don't change", + "white":"white", + "light-grey":"light-grey", + "red":"red", + "green":"green", + "yellow":"yellow", + "blue":"blue", + "magenta":"magenta", + "cyan":"cyan", + "black":"black", + "dark-red":"dark-red", + "dark-green":"dark-green", + "dark-yellow":"dark-yellow", + "dark-blue":"dark-blue", + "dark-magenta":"dark-magenta", + "dark-cyan":"dark-cyan", + "dark-grey":"dark-grey", + "current folder":"current folder", + "never":"never", + "current media item":"current media item", + "next episode (series)":"next episode (series)", + "hybrid: current item or next episode":"hybrid: current item or next episode", + "hybrid-plus: current item and next episode":"hybrid-plus: current item and next episode", + "every 6 hours":"every 6 hours", + "every 12 hours":"every 12 hours", + "every 24 hours":"every 24 hours", + "1 days":"1 days", + "2 days":"2 days", + "3 days":"3 days", + "4 days":"4 days", + "1 weeks":"1 weeks", + "2 weeks":"2 weeks", + "3 weeks":"3 weeks", + "4 weeks":"4 weeks", + "5 weeks":"5 weeks", + "6 weeks":"6 weeks", + "12 weeks":"12 weeks", + "don't limit":"don't limit", + "1 year":"1 year", + "2 years":"2 years", + "3 years":"3 years", + "4 years":"4 years", + "5 years":"5 years", + "6 years":"6 years", + "7 years":"7 years", + "8 years":"8 years", + "9 years":"9 years", + "10 years":"10 years", + "agent + channel":"agent + channel", + "only agent":"only agent", + "only channel":"only channel", + "disabled":"disabled", + "channel menu":"channel menu", + "advanced menu":"advanced menu", + "CRITICAL":"CRITICAL", + "ERROR":"ERROR", + "WARNING":"WARNING", + "INFO":"INFO", + "DEBUG":"DEBUG" } From c9f1e8a8bb6a60fb7afafb125ea4c4c7b61f3645 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 16:54:46 +0200 Subject: [PATCH 013/710] core: add i18n module; implement our own version of F and L as _ --- Contents/Code/interface/menu_helpers.py | 5 +-- Contents/Code/support/__init__.py | 4 +++ Contents/Code/support/i18n.py | 47 +++++++++++++++++++++++++ Contents/Code/support/tasks.py | 2 +- 4 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 Contents/Code/support/i18n.py diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 8568552c1..f9882c26e 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -7,6 +7,7 @@ from func import enable_channel_wrapper from subzero.language import Language +from support.i18n import is_localized_string from support.items import get_kind, get_item_thumb, get_item, get_item_kind_from_item, refresh_item from support.helpers import get_video_display_title, pad_title, display_language, quote_args, is_stream_forced from support.ignore import ignore_list @@ -91,8 +92,8 @@ def set_refresh_menu_state(state_or_media, media_type="movies"): Dict["current_refresh_state"] = None return - if isinstance(state_or_media, types.StringTypes): - Dict["current_refresh_state"] = state_or_media + if isinstance(state_or_media, types.StringTypes) or is_localized_string(state_or_media): + Dict["current_refresh_state"] = unicode(state_or_media) return media = state_or_media diff --git a/Contents/Code/support/__init__.py b/Contents/Code/support/__init__.py index 67a12c803..06ab61e5c 100644 --- a/Contents/Code/support/__init__.py +++ b/Contents/Code/support/__init__.py @@ -13,6 +13,10 @@ sys.modules["support.lib"] = lib +import i18n + +sys.modules["support.i18n"] = i18n + import plex_media sys.modules["support.plex_media"] = plex_media diff --git a/Contents/Code/support/i18n.py b/Contents/Code/support/i18n.py new file mode 100644 index 000000000..e466e5052 --- /dev/null +++ b/Contents/Code/support/i18n.py @@ -0,0 +1,47 @@ +# coding=utf-8 + +import inspect + +core = getattr(Data, "_core") + + +# get original localization module in order to access its base classes later on +def get_localization_module(): + cls = getattr(core.localization, "__class__") + return inspect.getmodule(cls) + + +plex_i18n_module = get_localization_module() + + +class SmartLocalStringFormatter(plex_i18n_module.LocalStringFormatter): + """ + this allows the use of dictionaries for string formatting, also does some sanity checking on the keys and values + """ + def __init__(self, string1, string2, locale=None): + setattr(self, "_string1", string1) + + if isinstance(string2, tuple) and len(string2) == 1 and hasattr(string2[0], "iteritems"): + if "%(" not in string1: + raise ValueError(u"%s requires a dictionary for formatting" % string1) + string2 = string2[0] + + setattr(self, "_string2", string2) + setattr(self, "_locale", locale) + + +def local_string_with_optional_format(key, *args): + if args: + return SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale), tuple(args)) + + if ("%s" in key or "%(" in key) and not args: + raise ValueError(u"%s requires a arguments for formatting" % key) + + return plex_i18n_module.LocalString(core, key, Locale.CurrentLocale) + + +_ = local_string_with_optional_format + + +def is_localized_string(s): + return hasattr(s, "localize") diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index 4b5e24c76..4c101235c 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -242,7 +242,7 @@ def download_subtitle(self, subtitle, rating_key, mode="m"): if not scheduler.is_task_running("MissingSubtitles"): scheduler.clear_task_data("MissingSubtitles") else: - set_refresh_menu_state(u"%s: Subtitle download failed (%s)" % (self.name, rating_key)) + set_refresh_menu_state(F(u"%s: Subtitle download failed (%s)", self.name, rating_key)) return download_successful From c48e704502a4a27df4a66ea7adc23fe9d6698435 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 17:00:53 +0200 Subject: [PATCH 014/710] i18n: replace all F and L calls with _ --- Contents/Code/interface/advanced.py | 117 ++++++++++++------------ Contents/Code/interface/item_details.py | 107 +++++++++++----------- Contents/Code/interface/main.py | 110 +++++++++++----------- Contents/Code/interface/menu.py | 31 ++++--- Contents/Code/interface/menu_helpers.py | 18 ++-- Contents/Code/interface/refresh_item.py | 5 +- Contents/Code/interface/sub_mod.py | 35 +++---- Contents/Code/support/tasks.py | 3 +- 8 files changed, 217 insertions(+), 209 deletions(-) diff --git a/Contents/Code/interface/advanced.py b/Contents/Code/interface/advanced.py index 97e3b1019..8defb33be 100644 --- a/Contents/Code/interface/advanced.py +++ b/Contents/Code/interface/advanced.py @@ -20,93 +20,94 @@ from support.storage import reset_storage, log_storage, get_subtitle_storage from support.scheduler import scheduler from support.items import set_mods_for_part, get_item_kind_from_rating_key +from support.i18n import _ @route(PREFIX + '/advanced') def AdvancedMenu(randomize=None, header=None, message=None): oc = SubFolderObjectContainer( - header=header or L("Internal stuff, pay attention!"), + header=header or _("Internal stuff, pay attention!"), message=message, no_cache=True, no_history=True, replace_parent=False, - title2=L("Advanced")) + title2=_("Advanced")) if config.lock_advanced_menu and not config.pin_correct: oc.add(DirectoryObject( key=Callback( PinMenu, randomize=timestamp(), - success_go_to=L("advanced")), - title=pad_title(L("Enter PIN")), - summary=L("The owner has restricted the access to this menu. Please enter the correct pin"), + success_go_to=_("advanced")), + title=pad_title(_("Enter PIN")), + summary=_("The owner has restricted the access to this menu. Please enter the correct pin"), )) return oc oc.add(DirectoryObject( key=Callback(TriggerRestart, randomize=timestamp()), - title=pad_title(L("Restart the plugin")), + title=pad_title(_("Restart the plugin")), )) oc.add(DirectoryObject( key=Callback(GetLogsLink), - title=L("Get my logs (copy the appearing link and open it in your browser, please)"), - summary=L("Copy the appearing link and open it in your browser, please"), + title=_("Get my logs (copy the appearing link and open it in your browser, please)"), + summary=_("Copy the appearing link and open it in your browser, please"), )) oc.add(DirectoryObject( key=Callback(TriggerBetterSubtitles, randomize=timestamp()), - title=pad_title(L("Trigger find better subtitles")), + title=pad_title(_("Trigger find better subtitles")), )) oc.add(DirectoryObject( key=Callback(SkipFindBetterSubtitles, randomize=timestamp()), - title=pad_title(L("Skip next find better subtitles (sets last run to now)")), + title=pad_title(_("Skip next find better subtitles (sets last run to now)")), )) oc.add(DirectoryObject( key=Callback(TriggerStorageMaintenance, randomize=timestamp()), - title=pad_title(L("Trigger subtitle storage maintenance")), + title=pad_title(_("Trigger subtitle storage maintenance")), )) oc.add(DirectoryObject( key=Callback(TriggerStorageMigration, randomize=timestamp()), - title=pad_title(L("Trigger subtitle storage migration (expensive)")), + title=pad_title(_("Trigger subtitle storage migration (expensive)")), )) oc.add(DirectoryObject( key=Callback(TriggerCacheMaintenance, randomize=timestamp()), - title=pad_title(L("Trigger cache maintenance (refiners, providers and packs/archives)")), + title=pad_title(_("Trigger cache maintenance (refiners, providers and packs/archives)")), )) oc.add(DirectoryObject( key=Callback(ApplyDefaultMods, randomize=timestamp()), - title=pad_title(L("Apply configured default subtitle mods to all (active) stored subtitles")), + title=pad_title(_("Apply configured default subtitle mods to all (active) stored subtitles")), )) oc.add(DirectoryObject( key=Callback(ReApplyMods, randomize=timestamp()), - title=pad_title(L("Re-Apply mods of all stored subtitles")), + title=pad_title(_("Re-Apply mods of all stored subtitles")), )) oc.add(DirectoryObject( key=Callback(LogStorage, key="tasks", randomize=timestamp()), - title=pad_title(L("Log the plugin's scheduled tasks state storage")), + title=pad_title(_("Log the plugin's scheduled tasks state storage")), )) oc.add(DirectoryObject( key=Callback(LogStorage, key="ignore", randomize=timestamp()), - title=pad_title(L("Log the plugin's internal ignorelist storage")), + title=pad_title(_("Log the plugin's internal ignorelist storage")), )) oc.add(DirectoryObject( key=Callback(LogStorage, key=None, randomize=timestamp()), - title=pad_title(L("Log the plugin's complete state storage")), + title=pad_title(_("Log the plugin's complete state storage")), )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="tasks", randomize=timestamp()), - title=pad_title(L("Reset the plugin's scheduled tasks state storage")), + title=pad_title(_("Reset the plugin's scheduled tasks state storage")), )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="ignore", randomize=timestamp()), - title=pad_title(L("Reset the plugin's internal ignorelist storage")), + title=pad_title(_("Reset the plugin's internal ignorelist storage")), )) oc.add(DirectoryObject( key=Callback(InvalidateCache, randomize=timestamp()), - title=pad_title(L("Invalidate Sub-Zero metadata caches (subliminal)")), + title=pad_title(_("Invalidate Sub-Zero metadata caches (subliminal)")), )) oc.add(DirectoryObject( key=Callback(ResetProviderThrottle, randomize=timestamp()), - title=pad_title(L("Reset provider throttle states")), + title=pad_title(_("Reset provider throttle states")), )) return oc @@ -118,10 +119,10 @@ def DispatchRestart(): @route(PREFIX + '/advanced/restart/trigger') @debounce def TriggerRestart(randomize=None): - set_refresh_menu_state(L("Restarting the plugin")) + set_refresh_menu_state(_("Restarting the plugin")) DispatchRestart() return fatality( - header=L("Restart triggered, please wait about 5 seconds"), + header=_("Restart triggered, please wait about 5 seconds"), force_title=" ", only_refresh=True, replace_parent=True, @@ -140,15 +141,15 @@ def ResetStorage(key, randomize=None, sure=False): if not sure: oc = SubFolderObjectContainer( no_history=True, - title1=L("Reset subtitle storage"), - title2=L("Are you sure?")) + title1=_("Reset subtitle storage"), + title2=_("Are you sure?")) oc.add(DirectoryObject( key=Callback( ResetStorage, key=key, sure=True, randomize=timestamp()), - title=pad_title(L("Are you really sure?")), + title=pad_title(_("Are you really sure?")), )) return oc @@ -162,8 +163,8 @@ def ResetStorage(key, randomize=None, sure=False): return AdvancedMenu( randomize=timestamp(), - header=L("Success"), - message=F("Information Storage (%s) reset", key) + header=_("Success"), + message=_("Information Storage (%s) reset", key) ) @@ -172,8 +173,8 @@ def LogStorage(key, randomize=None): log_storage(key) return AdvancedMenu( randomize=timestamp(), - header=L("Success"), - message=F("Information Storage (%s) logged", key) + header=_("Success"), + message=_("Information Storage (%s) logged", key) ) @@ -183,8 +184,8 @@ def TriggerBetterSubtitles(randomize=None): scheduler.dispatch_task("FindBetterSubtitles") return AdvancedMenu( randomize=timestamp(), - header=L("Success"), - message=L("FindBetterSubtitles triggered") + header=_("Success"), + message=_("FindBetterSubtitles triggered") ) @@ -196,8 +197,8 @@ def SkipFindBetterSubtitles(randomize=None): return AdvancedMenu( randomize=timestamp(), - header=L("Success"), - message=L("FindBetterSubtitles skipped") + header=_("Success"), + message=_("FindBetterSubtitles skipped") ) @@ -207,8 +208,8 @@ def TriggerStorageMaintenance(randomize=None): scheduler.dispatch_task("SubtitleStorageMaintenance") return AdvancedMenu( randomize=timestamp(), - header=L("Success"), - message=L("SubtitleStorageMaintenance triggered") + header=_("Success"), + message=_("SubtitleStorageMaintenance triggered") ) @@ -218,8 +219,8 @@ def TriggerStorageMigration(randomize=None): scheduler.dispatch_task("MigrateSubtitleStorage") return AdvancedMenu( randomize=timestamp(), - header=L("Success"), - message=L("MigrateSubtitleStorage triggered") + header=_("Success"), + message=_("MigrateSubtitleStorage triggered") ) @@ -229,8 +230,8 @@ def TriggerCacheMaintenance(randomize=None): scheduler.dispatch_task("CacheMaintenance") return AdvancedMenu( randomize=timestamp(), - header=L("Success"), - message=L("TriggerCacheMaintenance triggered") + header=_("Success"), + message=_("TriggerCacheMaintenance triggered") ) @@ -282,8 +283,8 @@ def ApplyDefaultMods(randomize=None): Thread.CreateTimer(1.0, apply_default_mods) return AdvancedMenu( randomize=timestamp(), - header=L("Success"), - message=L("This may take some time ...") + header=_("Success"), + message=_("This may take some time ...") ) @@ -293,8 +294,8 @@ def ReApplyMods(randomize=None): Thread.CreateTimer(1.0, apply_default_mods, reapply_current=True) return AdvancedMenu( randomize=timestamp(), - header=L("Success"), - message=L("This may take some time ...") + header=_("Success"), + message=_("This may take some time ...") ) @@ -302,11 +303,11 @@ def ReApplyMods(randomize=None): def GetLogsLink(): if not config.plex_token: oc = ObjectContainer( - title2=L("Download Logs"), + title2=_("Download Logs"), no_cache=True, no_history=True, - header=L("Sorry, feature unavailable"), - message=L("Universal Plex token not available")) + header=_("Sorry, feature unavailable"), + message=_("Universal Plex token not available")) return oc # try getting the link base via the request in context, first, otherwise use the public ip @@ -335,7 +336,7 @@ def GetLogsLink(): title2=logs_link, no_cache=True, no_history=True, - header=L("Copy this link and open this in your browser, please"), + header=_("Copy this link and open this in your browser, please"), message=logs_link) return oc @@ -366,15 +367,15 @@ def InvalidateCache(randomize=None): region.invalidate() return AdvancedMenu( randomize=timestamp(), - header=L("Success"), - message=L("Cache invalidated") + header=_("Success"), + message=_("Cache invalidated") ) @route(PREFIX + '/pin') def PinMenu(pin="", randomize=None, success_go_to="channel"): oc = ObjectContainer( - title2=L("Enter PIN number ") + str(len(pin) + 1), + title2=_("Enter PIN number ") + str(len(pin) + 1), no_cache=True, no_history=True, skip_pin_lock=True) @@ -384,8 +385,8 @@ def PinMenu(pin="", randomize=None, success_go_to="channel"): config.locked = False if success_go_to == "channel": return fatality( - force_title=L("PIN correct"), - header=L("PIN correct"), + force_title=_("PIN correct"), + header=_("PIN correct"), no_history=True) elif success_go_to == "advanced": return AdvancedMenu(randomize=timestamp()) @@ -404,7 +405,7 @@ def PinMenu(pin="", randomize=None, success_go_to="channel"): PinMenu, randomize=timestamp(), success_go_to=success_go_to), - title=pad_title(L("Reset")), + title=pad_title(_("Reset")), )) return oc @@ -413,7 +414,7 @@ def PinMenu(pin="", randomize=None, success_go_to="channel"): def ClearPin(randomize=None): Dict["pin_correct_time"] = None config.locked = True - return fatality(force_title=L("Menu locked"), header=" ", no_history=True) + return fatality(force_title=_("Menu locked"), header=" ", no_history=True) @route(PREFIX + '/reset_throttle') @@ -422,6 +423,6 @@ def ResetProviderThrottle(randomize=None): Dict.Save() return AdvancedMenu( randomize=timestamp(), - header=L("Success"), - message=L("Provider throttles reset") + header=_("Success"), + message=_("Provider throttles reset") ) diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index bc37f7354..f7b1cf2a3 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -16,6 +16,7 @@ from support.scanning import scan_videos from support.scheduler import scheduler from support.storage import get_subtitle_storage +from support.i18n import _ # fixme: needs kwargs cleanup @@ -56,8 +57,8 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra base_title=base_title, item_title=item_title, randomize=timestamp()), - title=F(u"Item not found: %s!", item_title), - summary=L("Plex didn't return any information about the item, please refresh it and come back later"), + title=_(u"Item not found: %s!", item_title), + summary=_("Plex didn't return any information about the item, please refresh it and come back later"), thumb=default_thumb )) return oc @@ -78,8 +79,8 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra previous_rating_key=show.rating_key, display_items=True, randomize=timestamp()), - title=F(u"< Back to %s", season.title), - summary=F("Back to %s > %s", show.title, season.title), + title=_(u"< Back to %s", season.title), + summary=_("Back to %s > %s", show.title, season.title), thumb=season.thumb or default_thumb )) @@ -90,15 +91,15 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra item_title=item_title, randomize=timestamp(), timeout=timeout * 1000), - title=F(u"Refresh: %s", item_title), - summary=F("Refreshes the %s, possibly searching for missing and picking up new subtitles on disk", current_kind), + title=_(u"Refresh: %s", item_title), + summary=_("Refreshes the %s, possibly searching for missing and picking up new subtitles on disk", current_kind), thumb=item.thumb or default_thumb )) oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=item_title, force=True, randomize=timestamp(), timeout=timeout * 1000), - title=F(u"Force-find subtitles: %s", item_title), - summary=L("Issues a forced refresh, ignoring known subtitles and searching for new ones"), + title=_(u"Force-find subtitles: %s", item_title), + summary=_("Issues a forced refresh, ignoring known subtitles and searching for new ones"), thumb=item.thumb or default_thumb )) @@ -121,7 +122,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra part_index_addon = "" part_summary_addon = "" if has_multiple_parts: - part_index_addon = F(u"File %s: ", part_index) + part_index_addon = _(u"File %s: ", part_index) part_summary_addon = "%s " % filename # iterate through all configured languages @@ -131,14 +132,14 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra current_sub_id = None current_sub_provider_name = None - summary = F(u"%sNo current subtitle in storage", part_summary_addon) + summary = _(u"%sNo current subtitle in storage", part_summary_addon) current_score = None if current_sub: current_sub_id = current_sub.id current_sub_provider_name = current_sub.provider_name current_score = current_sub.score - summary = F(u"%sCurrent subtitle: %s (added: %s, %s), Language: %s, Score: %i, Storage: %s", + summary = _(u"%sCurrent subtitle: %s (added: %s, %s), Language: %s, Score: %i, Storage: %s", part_summary_addon, current_sub.provider_name, df(current_sub.date_added), current_sub.mode_verbose, display_language(lang), current_sub.score, @@ -151,7 +152,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra item_type=plex_item.type, filename=filename, current_data=summary, randomize=timestamp(), current_provider=current_sub_provider_name, current_score=current_score), - title=F(u"%sManage %s subtitle", part_index_addon, display_language(lang)), + title=_(u"%sManage %s subtitle", part_index_addon, display_language(lang)), summary=summary )) else: @@ -162,7 +163,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra item_type=plex_item.type, filename=filename, current_data=summary, randomize=timestamp(), current_provider=current_sub_provider_name, current_score=current_score), - title=F(u"%sList %s subtitles", part_index_addon, display_language(lang)), + title=_(u"%sList %s subtitles", part_index_addon, display_language(lang)), summary=summary )) @@ -187,10 +188,10 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra key=Callback(ListEmbeddedSubsForItemMenu, rating_key=rating_key, part_id=part_id, title=title, item_type=plex_item.type, item_title=item_title, base_title=base_title, randomize=timestamp()), - title=F(u"%sEmbedded subtitles (%s)", + title=_(u"%sEmbedded subtitles (%s)", part_index_addon, ", ".join(display_language(l) for l in set(embedded_langs))), - summary=L(u"Extract and activate embedded subtitle streams") + summary=_(u"Extract and activate embedded subtitle streams") )) ignore_title = item_title @@ -218,33 +219,33 @@ def SubtitleOptionsMenu(**kwargs): oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), - title=F(u"< Back to %s", kwargs["title"]), + title=_(u"< Back to %s", kwargs["title"]), summary=kwargs["current_data"], thumb=default_thumb )) if subs_count: oc.add(DirectoryObject( key=Callback(ListStoredSubsForItemMenu, randomize=timestamp(), **kwargs), - title=F(u"Select active %s subtitle", kwargs["language_name"]), - summary=F(u"%d subtitles in storage", subs_count) + title=_(u"Select active %s subtitle", kwargs["language_name"]), + summary=_(u"%d subtitles in storage", subs_count) )) oc.add(DirectoryObject( key=Callback(ListAvailableSubsForItemMenu, randomize=timestamp(), **kwargs), - title=F(u"List available %s subtitles", kwargs["language_name"]), + title=_(u"List available %s subtitles", kwargs["language_name"]), summary=kwargs["current_data"] )) if current_sub: oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title=F(u"Modify current %s subtitle", kwargs["language_name"]), - summary=F(u"Currently applied mods: %s", (", ".join(current_sub.mods) if current_sub.mods else "none")) + title=_(u"Modify current %s subtitle", kwargs["language_name"]), + summary=_(u"Currently applied mods: %s", (", ".join(current_sub.mods) if current_sub.mods else "none")) )) if current_sub.provider_name != "embedded": oc.add(DirectoryObject( key=Callback(BlacklistSubtitleMenu, randomize=timestamp(), **kwargs), - title=F(u"Blacklist current %s subtitle and search for a new one", kwargs["language_name"]), + title=_(u"Blacklist current %s subtitle and search for a new one", kwargs["language_name"]), summary=current_data )) @@ -252,8 +253,8 @@ def SubtitleOptionsMenu(**kwargs): if current_bl: oc.add(DirectoryObject( key=Callback(ManageBlacklistMenu, randomize=timestamp(), **kwargs), - title=F(u"Manage blacklist (%s contained)", len(current_bl)), - summary=L(u"Inspect currently blacklisted subtitles") + title=_(u"Manage blacklist (%s contained)", len(current_bl)), + summary=_(u"Inspect currently blacklisted subtitles") )) storage.destroy() @@ -275,7 +276,7 @@ def ListStoredSubsForItemMenu(**kwargs): key=lambda x: x[1].date_added, reverse=True): is_current = key == all_subs["current"] - summary = F(u"added: %s, %s, Language: %s, Score: %i, Storage: %s", + summary = _(u"added: %s, %s, Language: %s, Score: %i, Storage: %s", (df(subtitle.date_added), subtitle.mode_verbose, display_language(language), subtitle.score, @@ -287,7 +288,7 @@ def ListStoredSubsForItemMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SelectStoredSubForItemMenu, randomize=timestamp(), sub_key="__".join(key), **kwargs), - title=F(u"%s%s, Score: %s", "Current: " if is_current else "Stored: ", sub_name, + title=_(u"%s%s, Score: %s", "Current: " if is_current else "Stored: ", sub_name, subtitle.score), summary=summary )) @@ -320,8 +321,8 @@ def SelectStoredSubForItemMenu(**kwargs): kwargs.pop("randomize") - kwargs["header"] = L("Success") - kwargs["message"] = L("Subtitle saved to disk") + kwargs["header"] = _("Success") + kwargs["message"] = _("Subtitle saved to disk") return SubtitleOptionsMenu(randomize=timestamp(), **kwargs) @@ -425,7 +426,7 @@ def ManageBlacklistMenu(**kwargs): oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), - title=F(u"< Back to %s", kwargs["title"]), + title=_(u"< Back to %s", kwargs["title"]), summary=kwargs["current_data"], thumb=default_thumb )) @@ -436,7 +437,7 @@ def sorter(pair): for sub_key, data in sorted(current_bl.iteritems(), key=sorter, reverse=True): provider_name, subtitle_id = sub_key - title = F(u"%s, %s (added: %s, %s), Language: %s, Score: %i, Storage: %s", + title = _(u"%s, %s (added: %s, %s), Language: %s, Score: %i, Storage: %s", provider_name, subtitle_id, df(data["date_added"]), current_sub.get_mode_verbose(data["mode"]), display_language(Language.fromietf(language)), data["score"], @@ -444,7 +445,7 @@ def sorter(pair): oc.add(DirectoryObject( key=Callback(ManageBlacklistMenu, remove_sub_key="__".join(sub_key), randomize=timestamp(), **kwargs), title=title, - summary=L(u"Remove subtitle from blacklist") + summary=_(u"Remove subtitle from blacklist") )) storage.destroy() @@ -471,7 +472,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item oc = SubFolderObjectContainer(title2=unicode(title), replace_parent=True) oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=rating_key, item_title=item_title, title=title, randomize=timestamp()), - title=F(u"< Back to %s", title), + title=_(u"< Back to %s", title), summary=current_data, thumb=default_thumb )) @@ -489,20 +490,20 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item video_display_data = [video.format] if video.format else [] if video.release_group: - video_display_data.append(F(u"by %s", video.release_group)) + video_display_data.append(_(u"by %s", video.release_group)) video_display_data = " ".join(video_display_data) else: video_display_data = metadata["filename"] - current_display = (F(u"Current: %s (%s) ", current_provider, current_score if current_provider else "")) + current_display = (_(u"Current: %s (%s) ", current_provider, current_score if current_provider else "")) if not running: oc.add(DirectoryObject( key=Callback(ListAvailableSubsForItemMenu, rating_key=rating_key, item_title=item_title, language=language, filename=filename, part_id=part_id, title=title, current_id=current_id, force=True, current_provider=current_provider, current_score=current_score, current_data=current_data, item_type=item_type, randomize=timestamp()), - title=F(u"Search for %s subs (%s)", get_language(language).name, video_display_data), - summary=F(u"%sFilename: %s", current_display, filename), + title=_(u"Search for %s subs (%s)", get_language(language).name, video_display_data), + summary=_(u"%sFilename: %s", current_display, filename), thumb=default_thumb )) @@ -513,8 +514,8 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item part_id=part_id, title=title, current_id=current_id, item_type=item_type, current_provider=current_provider, current_score=current_score, randomize=timestamp()), - title=L(u"No subtitles found"), - summary=F(u"%sFilename: %s", current_display, filename), + title=_(u"No subtitles found"), + summary=_(u"%sFilename: %s", current_display, filename), thumb=default_thumb )) else: @@ -524,10 +525,10 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item part_id=part_id, title=title, current_id=current_id, item_type=item_type, current_provider=current_provider, current_score=current_score, randomize=timestamp()), - title=F(u"Searching for %s subs (%s), refresh here ...", + title=_(u"Searching for %s subs (%s), refresh here ...", display_language(get_language(language)), video_display_data), - summary=F(u"%sFilename: %s", current_display, filename), + summary=_(u"%sFilename: %s", current_display, filename), thumb=default_thumb )) @@ -549,16 +550,16 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item wrong_fps_addon = "" if subtitle.wrong_fps: if plex_part: - wrong_fps_addon = F(" (wrong FPS, sub: %s, media: %s)", subtitle.fps, plex_part.fps) + wrong_fps_addon = _(" (wrong FPS, sub: %s, media: %s)", subtitle.fps, plex_part.fps) else: - wrong_fps_addon = F(" (wrong FPS, sub: %s, media: unknown, low impact mode)", subtitle.fps) + wrong_fps_addon = _(" (wrong FPS, sub: %s, media: unknown, low impact mode)", subtitle.fps) oc.add(DirectoryObject( key=Callback(TriggerDownloadSubtitle, rating_key=rating_key, randomize=timestamp(), item_title=item_title, subtitle_id=str(subtitle.id), language=language), - title=F(u"%s%s: %s, score: %s%s", bl_addon, "Available" if current_id != subtitle.id else "Current", + title=_(u"%s%s: %s, score: %s%s", bl_addon, "Available" if current_id != subtitle.id else "Current", subtitle.provider_name, subtitle.score, wrong_fps_addon), - summary=F(u"Release: %s, Matches: %s", subtitle.release_info, ", ".join(subtitle.matches)), + summary=_(u"Release: %s, Matches: %s", subtitle.release_info, ", ".join(subtitle.matches)), thumb=default_thumb )) @@ -572,7 +573,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item def TriggerDownloadSubtitle(rating_key=None, subtitle_id=None, item_title=None, language=None, randomize=None): from interface.main import fatality - set_refresh_menu_state(F("Downloading subtitle for %s", item_title or rating_key)) + set_refresh_menu_state(_("Downloading subtitle for %s", item_title or rating_key)) search_results = get_item_task_data("AvailableSubsForItem", rating_key, language) download_subtitle = None @@ -603,7 +604,7 @@ def ListEmbeddedSubsForItemMenu(**kwargs): oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], base_title=kwargs["base_title"], title=kwargs["item_title"], randomize=timestamp()), - title=F("< Back to %s", kwargs["title"]), + title=_("< Back to %s", kwargs["title"]), thumb=default_thumb )) @@ -621,19 +622,19 @@ def ListEmbeddedSubsForItemMenu(**kwargs): oc.add(DirectoryObject( key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), stream_index=str(stream.index), language=language, with_mods=True, **kwargs), - title=F(u"Extract stream %s, %s%s%s%s with default mods", + title=_(u"Extract stream %s, %s%s%s%s with default mods", stream.index, display_language(language), - L(" (unknown)") if is_unknown else "", - L(" (forced)") if is_forced else "", + _(" (unknown)") if is_unknown else "", + _(" (forced)") if is_forced else "", " (\"%s\")" % stream.title if stream.title else ""), )) oc.add(DirectoryObject( key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), stream_index=str(stream.index), language=language, **kwargs), - title=F(u"Extract stream %s, %s%s%s%s", + title=_(u"Extract stream %s, %s%s%s%s", stream.index, display_language(language), - L(" (unknown)") if is_unknown else "", - L(" (forced)") if is_forced else "", + _(" (unknown)") if is_unknown else "", + _(" (forced)") if is_forced else "", " (\"%s\")" % stream.title if stream.title else ""), )) return oc @@ -647,7 +648,7 @@ def TriggerExtractEmbeddedSubForItemMenu(**kwargs): stream_index = kwargs.get("stream_index") Thread.Create(extract_embedded_sub, **kwargs) - header = F(u"Extracting of embedded subtitle %s of part %s:%s triggered", + header = _(u"Extracting of embedded subtitle %s of part %s:%s triggered", stream_index, rating_key, part_id) kwargs.pop("randomize") diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index 471194e49..7ba938e71 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -1,4 +1,5 @@ # coding=utf-8 + from subzero.constants import PREFIX, TITLE, ART from support.config import config from support.helpers import pad_title, timestamp, df, display_language @@ -7,6 +8,7 @@ from support.items import get_item_thumb, get_on_deck_items, get_all_items, get_items_info, get_item, get_item_title from menu_helpers import main_icon, debounce, SubFolderObjectContainer, default_thumb, dig_tree, add_ignore_options, \ ObjectContainer, route, handler +from support.i18n import _ from item_details import ItemDetailsMenu @@ -34,8 +36,8 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r if config.lock_menu and not config.pin_correct: oc.add(DirectoryObject( key=Callback(PinMenu, randomize=timestamp()), - title=pad_title(L("Enter PIN")), - summary=L("The owner has restricted the access to this menu. Please enter the correct pin"), + title=pad_title(_("Enter PIN")), + summary=_("The owner has restricted the access to this menu. Please enter the correct pin"), )) return oc @@ -43,23 +45,23 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r if not isinstance(config.missing_permissions, list): oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), - title=pad_title(L("Insufficient permissions")), + title=pad_title(_("Insufficient permissions")), summary=config.missing_permissions, )) else: for title, path in config.missing_permissions: oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), - title=pad_title(L("Insufficient permissions")), - summary=F("Insufficient permissions on library %s, folder: %s", title, path), + title=pad_title(_("Insufficient permissions")), + summary=_("Insufficient permissions on library %s, folder: %s", title, path), )) return oc if not config.enabled_sections: oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), - title=pad_title(L("I'm not enabled!")), - summary=L("Please enable me for some of your libraries in your server settings; currently I do nothing"), + title=pad_title(_("I'm not enabled!")), + summary=_("Please enable me for some of your libraries in your server settings; currently I do nothing"), )) return oc @@ -67,8 +69,8 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r if Dict["current_refresh_state"]: oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), - title=pad_title(L("Working ... refresh here")), - summary=F("Current state: %s; Last state: %s", + title=pad_title(_("Working ... refresh here")), + summary=_("Current state: %s; Last state: %s", (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" ) @@ -76,33 +78,33 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r oc.add(DirectoryObject( key=Callback(OnDeckMenu), - title=L("On-deck items"), - summary=L("Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles."), + title=_("On-deck items"), + summary=_("Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles."), thumb=R("icon-ondeck.jpg") )) if "last_played_items" in Dict and Dict["last_played_items"]: oc.add(DirectoryObject( key=Callback(RecentlyPlayedMenu), - title=pad_title(L("Recently played items")), - summary=F("Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", config.store_recently_played_amount), + title=pad_title(_("Recently played items")), + summary=_("Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", config.store_recently_played_amount), thumb=R("icon-played.jpg") )) oc.add(DirectoryObject( key=Callback(RecentlyAddedMenu), - title=L("Recently-added items"), - summary=L("Shows the recently added items per section."), + title=_("Recently-added items"), + summary=_("Shows the recently added items per section."), thumb=R("icon-added.jpg") )) oc.add(DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, randomize=timestamp()), - title=L("Show recently added items with missing subtitles"), - summary=L("Lists items with missing subtitles. Click on Find recent items with missing subs to update list"), + title=_("Show recently added items with missing subtitles"), + summary=_("Lists items with missing subtitles. Click on Find recent items with missing subs to update list"), thumb=R("icon-missing.jpg") )) oc.add(DirectoryObject( key=Callback(SectionsMenu), - title=L("Browse all items"), - summary=L("Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items."), + title=_("Browse all items"), + summary=_("Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items."), thumb=R("icon-browse.jpg") )) @@ -110,41 +112,41 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r task = scheduler.task(task_name) if task.ready_for_display: - task_state = F("Running: %s/%s (%s%%)", task.items_done, task.items_searching, task.percentage) + task_state = _("Running: %s/%s (%s%%)", task.items_done, task.items_searching, task.percentage) else: lr = scheduler.last_run(task_name) nr = scheduler.next_run(task_name) - task_state = F("Last run: %s; Next scheduled run: %s; Last runtime: %s", + task_state = _("Last run: %s; Next scheduled run: %s; Last runtime: %s", df(scheduler.last_run(task_name)) if lr else "never", df(scheduler.next_run(task_name)) if nr else "never", str(task.last_run_time).split(".")[0]) oc.add(DirectoryObject( key=Callback(RefreshMissing, randomize=timestamp()), - title=F("Search for missing subtitles (in recently-added items, max-age: %s)", Prefs[ + title=_("Search for missing subtitles (in recently-added items, max-age: %s)", Prefs[ "scheduler.item_is_recent_age"]), - summary=F("Automatically run periodically by the scheduler, if configured. %s", task_state), + summary=_("Automatically run periodically by the scheduler, if configured. %s", task_state), thumb=R("icon-search.jpg") )) oc.add(DirectoryObject( key=Callback(IgnoreListMenu), - title=F("Display ignore list (%d)", len(ignore_list)), - summary=L("Show the current ignore list (mainly used for the automatic tasks)"), + title=_("Display ignore list (%d)", len(ignore_list)), + summary=_("Show the current ignore list (mainly used for the automatic tasks)"), thumb=R("icon-ignore.jpg") )) oc.add(DirectoryObject( key=Callback(HistoryMenu), - title=L("History"), - summary=F("Show the last %i downloaded subtitles", int(Prefs["history_size"])), + title=_("History"), + summary=_("Show the last %i downloaded subtitles", int(Prefs["history_size"])), thumb=R("icon-history.jpg") )) oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), - title=pad_title(L("Refresh")), - summary=F("Current state: %s; Last state: %s", + title=pad_title(_("Refresh")), + summary=_("Current state: %s; Last state: %s", (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" ), @@ -155,8 +157,8 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r if config.pin: oc.add(DirectoryObject( key=Callback(ClearPin, randomize=timestamp()), - title=pad_title(L("Re-lock menu(s)")), - summary=L("Enabled the PIN again for menu(s)") + title=pad_title(_("Re-lock menu(s)")), + summary=_("Enabled the PIN again for menu(s)") )) if not only_refresh: @@ -164,19 +166,19 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r summary_data = [] for provider, data in Dict["provider_throttle"].iteritems(): reason, until, desc = data - summary_data.append(F("%s until %s (%s)", provider, until.strftime("%y/%m/%d %H:%M"), reason)) + summary_data.append(_("%s until %s (%s)", provider, until.strftime("%y/%m/%d %H:%M"), reason)) oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), - title=pad_title(F("Throttled providers: %s", ", ".join(Dict["provider_throttle"].keys()))), + title=pad_title(_("Throttled providers: %s", ", ".join(Dict["provider_throttle"].keys()))), summary=", ".join(summary_data), thumb=R("icon-throttled.jpg") )) oc.add(DirectoryObject( key=Callback(AdvancedMenu), - title=pad_title(L("Advanced functions")), - summary=L("Use at your own risk"), + title=pad_title(_("Advanced functions")), + summary=_("Use at your own risk"), thumb=R("icon-advanced.jpg") )) @@ -190,12 +192,12 @@ def OnDeckMenu(message=None): :param message: :return: """ - return mergedItemsMenu(title=L("Items On Deck"), base_title=L("Items On Deck"), itemGetter=get_on_deck_items) + return mergedItemsMenu(title=_("Items On Deck"), base_title=_("Items On Deck"), itemGetter=get_on_deck_items) @route(PREFIX + '/recently_played') def RecentlyPlayedMenu(): - base_title = L("Recently Played") + base_title = _("Recently Played") oc = SubFolderObjectContainer(title2=base_title, replace_parent=True) for item in [get_item(rating_key) for rating_key in Dict["last_played_items"]]: @@ -223,13 +225,13 @@ def RecentlyAddedMenu(message=None): :param message: :return: """ - return SectionsMenu(base_title=L("Recently added"), section_items_key="recently_added", ignore_options=False) + return SectionsMenu(base_title=_("Recently added"), section_items_key="recently_added", ignore_options=False) @route(PREFIX + '/recent', force=bool) @debounce def RecentMissingSubtitlesMenu(force=False, randomize=None): - title = L("Items with missing subtitles") + title = _("Items with missing subtitles") oc = SubFolderObjectContainer(title2=title, no_cache=True, no_history=True) running = scheduler.is_task_running("MissingSubtitles") @@ -243,13 +245,13 @@ def RecentMissingSubtitlesMenu(force=False, randomize=None): if not running: oc.add(DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, force=True, randomize=timestamp()), - title=L(u"Find recent items with missing subtitles"), + title=_(u"Find recent items with missing subtitles"), thumb=default_thumb )) else: oc.add(DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, force=False, randomize=timestamp()), - title=L(u"Updating, refresh here ..."), + title=_(u"Updating, refresh here ..."), thumb=default_thumb )) @@ -259,7 +261,7 @@ def RecentMissingSubtitlesMenu(force=False, randomize=None): key=Callback(ItemDetailsMenu, title=title + " > " + item_title, item_title=item_title, rating_key=item_id), title=item_title, - summary=F("Missing: %s", ", ".join(display_language(l) for l in missing_languages)), + summary=_("Missing: %s", ", ".join(display_language(l) for l in missing_languages)), thumb=get_item_thumb(item) or default_thumb )) @@ -317,13 +319,13 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): """ is_ignored = rating_key in ignore_list[kind] if not sure: - oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1=F("%s %s %s %s the ignore list", - L("Add") if not is_ignored else L("Remove"), ignore_list.verbose(kind), title, - L("to") if not is_ignored else L("from")), title2=L("Are you sure?")) + oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1=_("%s %s %s %s the ignore list", + _("Add") if not is_ignored else _("Remove"), ignore_list.verbose(kind), title, + _("to") if not is_ignored else _("from")), title2=_("Are you sure?")) oc.add(DirectoryObject( key=Callback(IgnoreMenu, kind=kind, rating_key=rating_key, title=title, sure=True, - todo=L("add") if not is_ignored else L("remove")), - title=pad_title(L("Are you sure?")), + todo=_("add") if not is_ignored else _("remove")), + title=pad_title(_("Are you sure?")), )) return oc @@ -337,7 +339,7 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): Log.Info("Removed %s (%s) from the ignore list", title, rating_key) ignore_list.remove_title(kind, rating_key) ignore_list.save() - state = L("removed from") + state = _("removed from") elif todo == "add": if is_ignored: dont_change = True @@ -346,25 +348,25 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): Log.Info("Added %s (%s) to the ignore list", title, rating_key) ignore_list.add_title(kind, rating_key, title) ignore_list.save() - state = L("added to") + state = _("added to") else: dont_change = True if dont_change: - return fatality(force_title=" ", header=L("Didn't change the ignore list"), no_history=True) + return fatality(force_title=" ", header=_("Didn't change the ignore list"), no_history=True) - return fatality(force_title=" ", header=F("%s %s the ignore list", title, state), no_history=True) + return fatality(force_title=" ", header=_("%s %s the ignore list", title, state), no_history=True) @route(PREFIX + '/sections') -def SectionsMenu(base_title=L("Sections"), section_items_key="all", ignore_options=True): +def SectionsMenu(base_title=_("Sections"), section_items_key="all", ignore_options=True): """ displays the menu for all sections :return: """ items = get_all_items("sections") - return dig_tree(SubFolderObjectContainer(title2=L("Sections"), no_cache=True, no_history=True), items, None, + return dig_tree(SubFolderObjectContainer(title2=_("Sections"), no_cache=True, no_history=True), items, None, menu_determination_callback=determine_section_display, pass_kwargs={"base_title": base_title, "section_items_key": section_items_key, "ignore_options": ignore_options}, @@ -425,7 +427,7 @@ def SectionFirstLetterMenu(rating_key, title=None, base_title=None, section_titl add_ignore_options(oc, "sections", title=section_title, rating_key=rating_key, callback_menu=IgnoreMenu) oc.add(DirectoryObject( - key=Callback(SectionMenu, title=L("All"), base_title=title, rating_key=rating_key, ignore_options=False), + key=Callback(SectionMenu, title=_("All"), base_title=title, rating_key=rating_key, ignore_options=False), title="All" ) ) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 8341f53b6..a6b7e33c3 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -24,6 +24,7 @@ from support.ignore import ignore_list from support.items import get_all_items, get_items_info, get_item_kind_from_rating_key, get_item, MI_KEY, get_item_title from support.storage import get_subtitle_storage +from support.i18n import _ # init GUI ObjectContainer.art = R(ART) @@ -89,7 +90,7 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p oc.add(DirectoryObject( key=Callback(MetadataMenu, rating_key=show.rating_key, title=show.title, base_title=show.section.title, previous_item_type="section", display_items=True, randomize=timestamp()), - title=F(u"< Back to %s", show.title), + title=_(u"< Back to %s", show.title), thumb=show.thumb or default_thumb )) elif current_kind == "series": @@ -117,9 +118,9 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p title=title, previous_item_type=previous_item_type, with_mods=True, previous_rating_key=previous_rating_key, randomize=timestamp()), - title=F(u"Extract missing %s embedded subtitles", display_language(lang)), - summary=L("Extracts the not yet extracted embedded subtitles of all episodes for the current season ") + - L("with all configured default modifications") + title=_(u"Extract missing %s embedded subtitles", display_language(lang)), + summary=_("Extracts the not yet extracted embedded subtitles of all episodes for the current season ") + + _("with all configured default modifications") )) oc.add(DirectoryObject( key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, @@ -127,24 +128,24 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p title=title, force=True, previous_item_type=previous_item_type, with_mods=True, previous_rating_key=previous_rating_key, randomize=timestamp()), - title=F(u"Extract and activate %s embedded subtitles", display_language(lang)), - summary=L("Extracts embedded subtitles of all episodes for the current season ") + - L("with all configured default modifications") + title=_(u"Extract and activate %s embedded subtitles", display_language(lang)), + summary=_("Extracts embedded subtitles of all episodes for the current season ") + + _("with all configured default modifications") )) # add refresh oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=title, refresh_kind=current_kind, previous_rating_key=previous_rating_key, timeout=timeout * 1000, randomize=timestamp()), - title=F(u"Refresh: %s", item_title), - summary=F("Refreshes the %s, possibly searching for missing and picking up new subtitles on disk", current_kind) + title=_(u"Refresh: %s", item_title), + summary=_("Refreshes the %s, possibly searching for missing and picking up new subtitles on disk", current_kind) )) oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=title, force=True, refresh_kind=current_kind, previous_rating_key=previous_rating_key, timeout=timeout * 1000, randomize=timestamp()), - title=F(u"Auto-Find subtitles: %s", item_title), - summary=L("Issues a forced refresh, ignoring known subtitles and searching for new ones") + title=_(u"Auto-Find subtitles: %s", item_title), + summary=_("Issues a forced refresh, ignoring known subtitles and searching for new ones") )) else: return ItemDetailsMenu(rating_key=rating_key, title=title, item_title=item_title) @@ -164,8 +165,8 @@ def SeasonExtractEmbedded(**kwargs): Thread.Create(season_extract_embedded, **{"rating_key": rating_key, "requested_language": requested_language, "with_mods": with_mods, "force": force}) - kwargs["header"] = L("Success") - kwargs["message"] = F(u"Extracting of embedded subtitles for %s triggered", title) + kwargs["header"] = _("Success") + kwargs["message"] = _(u"Extracting of embedded subtitles for %s triggered", title) kwargs.pop("randomize") return MetadataMenu(randomize=timestamp(), title=item_title, **kwargs) @@ -231,7 +232,7 @@ def IgnoreListMenu(): def HistoryMenu(): from support.history import get_history history = get_history() - oc = SubFolderObjectContainer(title2=L("History"), replace_parent=True) + oc = SubFolderObjectContainer(title2=_("History"), replace_parent=True) for item in history.items: possible_language = item.language @@ -241,7 +242,7 @@ def HistoryMenu(): key=Callback(ItemDetailsMenu, title=item.title, item_title=item.item_title, rating_key=item.rating_key), title=u"%s (%s)" % (item.item_title, item.mode_verbose), - summary=F(u"%s in %s (%s, score: %s), %s", language_display, item.section_title, + summary=_(u"%s in %s (%s, score: %s), %s", language_display, item.section_title, item.provider_name, item.score, df(item.time)) )) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index f9882c26e..fb6e079a6 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -7,7 +7,7 @@ from func import enable_channel_wrapper from subzero.language import Language -from support.i18n import is_localized_string +from support.i18n import is_localized_string, _ from support.items import get_kind, get_item_thumb, get_item, get_item_kind_from_item, refresh_item from support.helpers import get_video_display_title, pad_title, display_language, quote_args, is_stream_forced from support.ignore import ignore_list @@ -52,7 +52,7 @@ def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None oc.add(DirectoryObject( key=Callback(callback_menu, kind=use_kind, rating_key=rating_key, title=title), title=u"%s %s \"%s\"" % ( - L("Un-Ignore") if in_list else L("Ignore"), ignore_list.verbose(kind) if add_kind else "", unicode(title)) + _("Un-Ignore") if in_list else _("Ignore"), ignore_list.verbose(kind) if add_kind else "", unicode(title)) ) ) @@ -104,15 +104,15 @@ def set_refresh_menu_state(state_or_media, media_type="movies"): for episode in media.seasons[season].episodes: ep = media.seasons[season].episodes[episode] media_id = ep.id - title = get_video_display_title(L("show"), ep.title, parent_title=media.title, season=int(season), episode=int(episode)) + title = get_video_display_title(_("show"), ep.title, parent_title=media.title, season=int(season), episode=int(episode)) else: - title = get_video_display_title(L("movie"), media.title) + title = get_video_display_title(_("movie"), media.title) intent = get_intent() force_refresh = intent.get("force", media_id) - Dict["current_refresh_state"] = F(u"%sRefreshing %s", - L("Force-") if force_refresh else "", + Dict["current_refresh_state"] = _(u"%sRefreshing %s", + _("Force-") if force_refresh else "", unicode(title)) @@ -181,7 +181,7 @@ def extract_embedded_sub(**kwargs): is_forced = is_stream_forced(stream) bn = os.path.basename(part.file) - set_refresh_menu_state(F(u"Extracting subtitle %s of %s", stream_index, bn)) + set_refresh_menu_state(_(u"Extracting subtitle %s of %s", stream_index, bn)) Log.Info(u"Extracting stream %s (%s) of %s", stream_index, display_language(language), bn) out_codec = stream.codec if stream.codec != "mov_text" else "srt" @@ -247,8 +247,8 @@ def __init__(self, *args, **kwargs): from support.helpers import pad_title, timestamp self.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), - title=pad_title(L("<< Back to home")), - summary=F("Current state: %s; Last state: %s", + title=pad_title(_("<< Back to home")), + summary=_("Current state: %s; Last state: %s", (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" ) diff --git a/Contents/Code/interface/refresh_item.py b/Contents/Code/interface/refresh_item.py index d746b1b7d..c6a726f60 100644 --- a/Contents/Code/interface/refresh_item.py +++ b/Contents/Code/interface/refresh_item.py @@ -4,6 +4,7 @@ from menu_helpers import debounce, set_refresh_menu_state, route from support.items import refresh_item from support.helpers import timestamp +from support.i18n import _ @route(PREFIX + '/item/refresh/{rating_key}/force', force=True) @@ -15,9 +16,9 @@ def RefreshItem(rating_key=None, came_from="/recent", item_title=None, force=Fal from interface.main import fatality header = " " if trigger: - set_refresh_menu_state(F(u"Triggering %sRefresh for %s", L("Force-") if force else "", item_title)) + set_refresh_menu_state(_(u"Triggering %sRefresh for %s", _("Force-") if force else "", item_title)) Thread.Create(refresh_item, rating_key=rating_key, force=force, refresh_kind=refresh_kind, parent_rating_key=previous_rating_key, timeout=int(timeout)) - header = F(u"%s of item %s triggered", L("Refresh") if not force else L("Forced-refresh"), rating_key) + header = _(u"%s of item %s triggered", _("Refresh") if not force else _("Forced-refresh"), rating_key) return fatality(randomize=timestamp(), header=header, replace_parent=True) diff --git a/Contents/Code/interface/sub_mod.py b/Contents/Code/interface/sub_mod.py index e0efcaa00..7f2e26a74 100644 --- a/Contents/Code/interface/sub_mod.py +++ b/Contents/Code/interface/sub_mod.py @@ -12,6 +12,7 @@ from support.scanning import scan_videos from support.helpers import timestamp, pad_title from support.items import get_current_sub, set_mods_for_part +from support.i18n import _ @route(PREFIX + '/item/sub_mods/{rating_key}/{part_id}', force=bool) @@ -31,7 +32,7 @@ def SubtitleModificationsMenu(**kwargs): from interface.item_details import SubtitleOptionsMenu oc.add(DirectoryObject( key=Callback(SubtitleOptionsMenu, randomize=timestamp(), **kwargs), - title=F(u"< Back to subtitle options for: %s", kwargs["title"]), + title=_(u"< Back to subtitle options for: %s", kwargs["title"]), summary=kwargs["current_data"], thumb=default_thumb )) @@ -72,24 +73,24 @@ def SubtitleModificationsMenu(**kwargs): if current_mods: oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="remove_last", randomize=timestamp(), **kwargs), - title=pad_title(F("Remove last applied mod (%s)", current_mods[-1])), - summary=F(u"Currently applied mods: %s", ", ".join(current_mods) if current_mods else L("none")) + title=pad_title(_("Remove last applied mod (%s)", current_mods[-1])), + summary=_(u"Currently applied mods: %s", ", ".join(current_mods) if current_mods else _("none")) )) oc.add(DirectoryObject( key=Callback(SubtitleListMods, randomize=timestamp(), **kwargs), - title=pad_title(L("Manage applied mods")), - summary=F(u"Currently applied mods: %s", ", ".join(current_mods)) + title=pad_title(_("Manage applied mods")), + summary=_(u"Currently applied mods: %s", ", ".join(current_mods)) )) oc.add(DirectoryObject( key=Callback(SubtitleReapplyMods, randomize=timestamp(), **kwargs), - title=pad_title(L("Reapply applied mods")), - summary=F(u"Currently applied mods: %s", ", ".join(current_mods) if current_mods else L("none")) + title=pad_title(_("Reapply applied mods")), + summary=_(u"Currently applied mods: %s", ", ".join(current_mods) if current_mods else _("none")) )) oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="clear", randomize=timestamp(), **kwargs), - title=pad_title(L("Restore original version")), - summary=F(u"Currently applied mods: %s", ", ".join(current_mods) if current_mods else L("none")) + title=pad_title(_("Restore original version")), + summary=_(u"Currently applied mods: %s", ", ".join(current_mods) if current_mods else _("none")) )) storage.destroy() @@ -109,7 +110,7 @@ def SubtitleFPSModMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title=L("< Back to subtitle modification menu") + title=_("< Back to subtitle modification menu") )) metadata = get_plex_metadata(rating_key, part_id, item_type) @@ -123,14 +124,14 @@ def SubtitleFPSModMenu(**kwargs): continue if float(fps) > float(target_fps): - indicator = L("subs constantly getting faster") + indicator = _("subs constantly getting faster") else: - indicator = L("subs constantly getting slower") + indicator = _("subs constantly getting slower") mod_ident = SubtitleModifications.get_mod_signature("change_FPS", **{"from": fps, "to": target_fps}) oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=mod_ident, mode="add", randomize=timestamp(), **kwargs), - title=F("%s fps -> %s fps (%s)", fps, target_fps, indicator) + title=_("%s fps -> %s fps (%s)", fps, target_fps, indicator) )) return oc @@ -148,13 +149,13 @@ def SubtitleShiftModUnitMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title=L("< Back to subtitle modifications") + title=_("< Back to subtitle modifications") )) for unit, title in POSSIBLE_UNITS: oc.add(DirectoryObject( key=Callback(SubtitleShiftModMenu, unit=unit, randomize=timestamp(), **kwargs), - title=F("Adjust by %s", title) + title=_("Adjust by %s", title) )) return oc @@ -171,7 +172,7 @@ def SubtitleShiftModMenu(unit=None, **kwargs): oc.add(DirectoryObject( key=Callback(SubtitleShiftModUnitMenu, randomize=timestamp(), **kwargs), - title=L("< Back to unit selection") + title=_("< Back to unit selection") )) rng = [] @@ -273,7 +274,7 @@ def SubtitleListMods(**kwargs): for identifier in current_sub.mods: oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=identifier, mode="remove", randomize=timestamp(), **kwargs), - title=F("Remove: %s", identifier) + title=_("Remove: %s", identifier) )) storage.destroy() diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index 4c101235c..e607c4599 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -20,6 +20,7 @@ from support.helpers import track_usage, get_title_for_video_metadata, cast_bool, PartUnknownException from support.plex_media import get_plex_metadata from support.scanning import scan_videos +from support.i18n import _ from download import download_best_subtitles, pre_download_hook, post_download_hook, language_hook PROVIDER_SLACK = 30 @@ -242,7 +243,7 @@ def download_subtitle(self, subtitle, rating_key, mode="m"): if not scheduler.is_task_running("MissingSubtitles"): scheduler.clear_task_data("MissingSubtitles") else: - set_refresh_menu_state(F(u"%s: Subtitle download failed (%s)", self.name, rating_key)) + set_refresh_menu_state(_(u"%s: Subtitle download failed (%s)", self.name, rating_key)) return download_successful From 0c549c6bdaf1a33c83d9570173b8f2d6cfa0e497 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 17:03:33 +0200 Subject: [PATCH 015/710] i18n: support kwargs in _ in addition to {} as first non-keyword-argument --- Contents/Code/support/i18n.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/i18n.py b/Contents/Code/support/i18n.py index e466e5052..fc713c35a 100644 --- a/Contents/Code/support/i18n.py +++ b/Contents/Code/support/i18n.py @@ -30,9 +30,14 @@ def __init__(self, string1, string2, locale=None): setattr(self, "_locale", locale) -def local_string_with_optional_format(key, *args): +def local_string_with_optional_format(key, *args, **kwargs): + if kwargs: + args = (kwargs,) + else: + args = tuple(args) + if args: - return SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale), tuple(args)) + return SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale), args) if ("%s" in key or "%(" in key) and not args: raise ValueError(u"%s requires a arguments for formatting" % key) From 7a5112bee58369e6ac4a3737d6a0fdd8c6ffcc98 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 17:09:18 +0200 Subject: [PATCH 016/710] i18n: en: add missing string --- Contents/Strings/en.json | 1 + 1 file changed, 1 insertion(+) diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 6c042382b..3fc85ad77 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -220,6 +220,7 @@ "< Back to unit selection":"< Back to unit selection", "added: %s, %s, Language: %s, Score: %i, Storage: %s":"added: %s, %s, Language: %s, Score: %i, Storage: %s", "Remove: %s":"Remove: %s", + "%s: Subtitle download failed (%s)": "%s: Subtitle download failed (%s)", "Subtitle Language (1)":"Subtitle Language (1)", "Subtitle Language (2)":"Subtitle Language (2)", "Subtitle Language (3)":"Subtitle Language (3)", From 8d83184cd1e3136342118d08af55c037c60934c9 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 17:13:51 +0200 Subject: [PATCH 017/710] i18n: _: log error instead of raising an exception, which breaks menu code --- Contents/Code/support/i18n.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/i18n.py b/Contents/Code/support/i18n.py index fc713c35a..d3c2f5f23 100644 --- a/Contents/Code/support/i18n.py +++ b/Contents/Code/support/i18n.py @@ -23,7 +23,7 @@ def __init__(self, string1, string2, locale=None): if isinstance(string2, tuple) and len(string2) == 1 and hasattr(string2[0], "iteritems"): if "%(" not in string1: - raise ValueError(u"%s requires a dictionary for formatting" % string1) + Log.Error(u"%s requires a dictionary for formatting" % string1) string2 = string2[0] setattr(self, "_string2", string2) @@ -40,7 +40,7 @@ def local_string_with_optional_format(key, *args, **kwargs): return SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale), args) if ("%s" in key or "%(" in key) and not args: - raise ValueError(u"%s requires a arguments for formatting" % key) + raise Log.Error(u"%s requires a arguments for formatting" % key) return plex_i18n_module.LocalString(core, key, Locale.CurrentLocale) From 064b634f772424225431635981c9089dbcad6213 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 17:48:41 +0200 Subject: [PATCH 018/710] i18n: _: don't fail check on localized string --- Contents/Code/support/i18n.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/i18n.py b/Contents/Code/support/i18n.py index d3c2f5f23..a2ca4a7f8 100644 --- a/Contents/Code/support/i18n.py +++ b/Contents/Code/support/i18n.py @@ -22,7 +22,7 @@ def __init__(self, string1, string2, locale=None): setattr(self, "_string1", string1) if isinstance(string2, tuple) and len(string2) == 1 and hasattr(string2[0], "iteritems"): - if "%(" not in string1: + if not is_localized_string(string1) and "%(" not in string1: Log.Error(u"%s requires a dictionary for formatting" % string1) string2 = string2[0] @@ -39,7 +39,8 @@ def local_string_with_optional_format(key, *args, **kwargs): if args: return SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale), args) - if ("%s" in key or "%(" in key) and not args: + # check string instances for arguments + if not is_localized_string(key) and ("%s" in key or "%(" in key) and not args: raise Log.Error(u"%s requires a arguments for formatting" % key) return plex_i18n_module.LocalString(core, key, Locale.CurrentLocale) From c234f75d7e86b1392adee0782e64656ee6ab9b78 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 17:48:57 +0200 Subject: [PATCH 019/710] i18n: mid-string-update commit WIP --- Contents/Code/interface/item_details.py | 121 +++++++++++++++--------- Contents/Code/interface/menu.py | 3 +- Contents/Strings/en.json | 59 ++++++------ 3 files changed, 106 insertions(+), 77 deletions(-) diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index f7b1cf2a3..a947fa8b5 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -98,7 +98,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=item_title, force=True, randomize=timestamp(), timeout=timeout * 1000), - title=_(u"Force-find subtitles: %s", item_title), + title=_(u"Force-find subtitles: %(item_title)s", item_title=item_title), summary=_("Issues a forced refresh, ignoring known subtitles and searching for new ones"), thumb=item.thumb or default_thumb )) @@ -122,7 +122,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra part_index_addon = "" part_summary_addon = "" if has_multiple_parts: - part_index_addon = _(u"File %s: ", part_index) + part_index_addon = _(u"File %(file_part_index)s: ", file_part_index=part_index) part_summary_addon = "%s " % filename # iterate through all configured languages @@ -132,18 +132,22 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra current_sub_id = None current_sub_provider_name = None - summary = _(u"%sNo current subtitle in storage", part_summary_addon) + summary = _(u"%(part_summary)sNo current subtitle in storage", part_summary=part_summary_addon) current_score = None if current_sub: current_sub_id = current_sub.id current_sub_provider_name = current_sub.provider_name current_score = current_sub.score - summary = _(u"%sCurrent subtitle: %s (added: %s, %s), Language: %s, Score: %i, Storage: %s", - part_summary_addon, current_sub.provider_name, - df(current_sub.date_added), current_sub.mode_verbose, - display_language(lang), current_sub.score, - current_sub.storage_type) + summary = _(u"%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, " + u"%(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + part_summary=part_summary_addon, + provider_name=current_sub.provider_name, + date_added=df(current_sub.date_added), + mode=current_sub.mode_verbose, + language=display_language(lang), + score=current_sub.score, + storage_type=current_sub.storage_type) oc.add(DirectoryObject( key=Callback(SubtitleOptionsMenu, rating_key=rating_key, part_id=part_id, title=title, @@ -152,7 +156,8 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra item_type=plex_item.type, filename=filename, current_data=summary, randomize=timestamp(), current_provider=current_sub_provider_name, current_score=current_score), - title=_(u"%sManage %s subtitle", part_index_addon, display_language(lang)), + title=_(u"%(part_summary)sManage %(language)s subtitle", part_summary=part_index_addon, + language=display_language(lang)), summary=summary )) else: @@ -163,7 +168,8 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra item_type=plex_item.type, filename=filename, current_data=summary, randomize=timestamp(), current_provider=current_sub_provider_name, current_score=current_score), - title=_(u"%sList %s subtitles", part_index_addon, display_language(lang)), + title=_(u"%(part_summary)sList %(language)s subtitles", part_summary=part_index_addon, + language=display_language(lang)), summary=summary )) @@ -188,9 +194,9 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra key=Callback(ListEmbeddedSubsForItemMenu, rating_key=rating_key, part_id=part_id, title=title, item_type=plex_item.type, item_title=item_title, base_title=base_title, randomize=timestamp()), - title=_(u"%sEmbedded subtitles (%s)", - part_index_addon, - ", ".join(display_language(l) for l in set(embedded_langs))), + title=_(u"%(part_summary)sEmbedded subtitles (%(languages)s)", + part_summary=part_index_addon, + languages=", ".join(display_language(l) for l in set(embedded_langs))), summary=_(u"Extract and activate embedded subtitle streams") )) @@ -226,26 +232,28 @@ def SubtitleOptionsMenu(**kwargs): if subs_count: oc.add(DirectoryObject( key=Callback(ListStoredSubsForItemMenu, randomize=timestamp(), **kwargs), - title=_(u"Select active %s subtitle", kwargs["language_name"]), - summary=_(u"%d subtitles in storage", subs_count) + title=_(u"Select active %(language)s subtitle", language=kwargs["language_name"]), + summary=_(u"%(count)d subtitles in storage", count=subs_count) )) oc.add(DirectoryObject( key=Callback(ListAvailableSubsForItemMenu, randomize=timestamp(), **kwargs), - title=_(u"List available %s subtitles", kwargs["language_name"]), + title=_(u"List available %(language)s subtitles", language=kwargs["language_name"]), summary=kwargs["current_data"] )) if current_sub: oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title=_(u"Modify current %s subtitle", kwargs["language_name"]), - summary=_(u"Currently applied mods: %s", (", ".join(current_sub.mods) if current_sub.mods else "none")) + title=_(u"Modify current %(language)s subtitle", language=kwargs["language_name"]), + summary=_(u"Currently applied mods: %(mod_list)s", + mod_list=(", ".join(current_sub.mods) if current_sub.mods else "none")) )) if current_sub.provider_name != "embedded": oc.add(DirectoryObject( key=Callback(BlacklistSubtitleMenu, randomize=timestamp(), **kwargs), - title=_(u"Blacklist current %s subtitle and search for a new one", kwargs["language_name"]), + title=_(u"Blacklist current %(language)s subtitle and search for a new one", + language=kwargs["language_name"]), summary=current_data )) @@ -253,7 +261,7 @@ def SubtitleOptionsMenu(**kwargs): if current_bl: oc.add(DirectoryObject( key=Callback(ManageBlacklistMenu, randomize=timestamp(), **kwargs), - title=_(u"Manage blacklist (%s contained)", len(current_bl)), + title=_(u"Manage blacklist (%(amount)s contained)", amount=len(current_bl)), summary=_(u"Inspect currently blacklisted subtitles") )) @@ -288,8 +296,10 @@ def ListStoredSubsForItemMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SelectStoredSubForItemMenu, randomize=timestamp(), sub_key="__".join(key), **kwargs), - title=_(u"%s%s, Score: %s", "Current: " if is_current else "Stored: ", sub_name, - subtitle.score), + title=_(u"%(current_state)s%(subtitle_name)s, Score: %(score)s", + current_state=_("Current: ") if is_current else _("Stored: "), + subtitle_name=sub_name, + score=subtitle.score), summary=summary )) @@ -490,20 +500,24 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item video_display_data = [video.format] if video.format else [] if video.release_group: - video_display_data.append(_(u"by %s", video.release_group)) + video_display_data.append(unicode(_(u"by %(release_group)s", release_group=video.release_group))) video_display_data = " ".join(video_display_data) else: video_display_data = metadata["filename"] - current_display = (_(u"Current: %s (%s) ", current_provider, current_score if current_provider else "")) + current_display = (_(u"Current: %(provider_name)s (%(score)s) ", + provider_name=current_provider, + score=current_score if current_provider else "")) if not running: oc.add(DirectoryObject( key=Callback(ListAvailableSubsForItemMenu, rating_key=rating_key, item_title=item_title, language=language, filename=filename, part_id=part_id, title=title, current_id=current_id, force=True, current_provider=current_provider, current_score=current_score, current_data=current_data, item_type=item_type, randomize=timestamp()), - title=_(u"Search for %s subs (%s)", get_language(language).name, video_display_data), - summary=_(u"%sFilename: %s", current_display, filename), + title=_(u"Search for %(language)s subs (%(video_data)s)", + language=get_language(language).name, + video_data=video_display_data), + summary=_(u"%(current_info)sFilename: %(filename)s", current_info=current_display, filename=filename), thumb=default_thumb )) @@ -515,7 +529,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item current_provider=current_provider, current_score=current_score, randomize=timestamp()), title=_(u"No subtitles found"), - summary=_(u"%sFilename: %s", current_display, filename), + summary=_(u"%(current_info)sFilename: %(filename)s", current_info=current_display, filename=filename), thumb=default_thumb )) else: @@ -525,10 +539,10 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item part_id=part_id, title=title, current_id=current_id, item_type=item_type, current_provider=current_provider, current_score=current_score, randomize=timestamp()), - title=_(u"Searching for %s subs (%s), refresh here ...", - display_language(get_language(language)), - video_display_data), - summary=_(u"%sFilename: %s", current_display, filename), + title=_(u"Searching for %(language)s subs (%(video_data)s), refresh here ...", + language=display_language(get_language(language)), + video_data=video_display_data), + summary=_(u"%(current_info)sFilename: %(filename)s", current_info=current_display, filename=filename), thumb=default_thumb )) @@ -550,16 +564,25 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item wrong_fps_addon = "" if subtitle.wrong_fps: if plex_part: - wrong_fps_addon = _(" (wrong FPS, sub: %s, media: %s)", subtitle.fps, plex_part.fps) + wrong_fps_addon = _(" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", + subtitle_fps=subtitle.fps, + media_fps=plex_part.fps) else: - wrong_fps_addon = _(" (wrong FPS, sub: %s, media: unknown, low impact mode)", subtitle.fps) + wrong_fps_addon = _(" (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", + subtitle_fps=subtitle.fps) oc.add(DirectoryObject( key=Callback(TriggerDownloadSubtitle, rating_key=rating_key, randomize=timestamp(), item_title=item_title, subtitle_id=str(subtitle.id), language=language), - title=_(u"%s%s: %s, score: %s%s", bl_addon, "Available" if current_id != subtitle.id else "Current", - subtitle.provider_name, subtitle.score, wrong_fps_addon), - summary=_(u"Release: %s, Matches: %s", subtitle.release_info, ", ".join(subtitle.matches)), + title=_(u"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", + blacklisted_state=bl_addon, + current_state="Available" if current_id != subtitle.id else "Current", + provider_name=subtitle.provider_name, + score=subtitle.score, + wrong_fps_state=wrong_fps_addon), + summary=_(u"Release: %(release_info)s, Matches: %(matches)s", + release_info=subtitle.release_info, + matches=", ".join(subtitle.matches)), thumb=default_thumb )) @@ -573,7 +596,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item def TriggerDownloadSubtitle(rating_key=None, subtitle_id=None, item_title=None, language=None, randomize=None): from interface.main import fatality - set_refresh_menu_state(_("Downloading subtitle for %s", item_title or rating_key)) + set_refresh_menu_state(_("Downloading subtitle for %(title_or_id)s", title_or_id=item_title or rating_key)) search_results = get_item_task_data("AvailableSubsForItem", rating_key, language) download_subtitle = None @@ -622,20 +645,24 @@ def ListEmbeddedSubsForItemMenu(**kwargs): oc.add(DirectoryObject( key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), stream_index=str(stream.index), language=language, with_mods=True, **kwargs), - title=_(u"Extract stream %s, %s%s%s%s with default mods", - stream.index, display_language(language), - _(" (unknown)") if is_unknown else "", - _(" (forced)") if is_forced else "", - " (\"%s\")" % stream.title if stream.title else ""), + title=_(u"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s" + u"%(stream_title)s with default mods", + stream_index=stream.index, + language=display_language(language), + unknown_state=_(" (unknown)") if is_unknown else "", + forced_state=_(" (forced)") if is_forced else "", + stream_title=" (\"%s\")" % stream.title if stream.title else ""), )) oc.add(DirectoryObject( key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), stream_index=str(stream.index), language=language, **kwargs), - title=_(u"Extract stream %s, %s%s%s%s", - stream.index, display_language(language), - _(" (unknown)") if is_unknown else "", - _(" (forced)") if is_forced else "", - " (\"%s\")" % stream.title if stream.title else ""), + title=_(u"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s" + u"%(stream_title)s", + stream_index=stream.index, + language=display_language(language), + unknown_state=_(" (unknown)") if is_unknown else "", + forced_state=_(" (forced)") if is_forced else "", + stream_title=" (\"%s\")" % stream.title if stream.title else ""), )) return oc diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index a6b7e33c3..74f6d76a6 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -138,7 +138,8 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p key=Callback(RefreshItem, rating_key=rating_key, item_title=title, refresh_kind=current_kind, previous_rating_key=previous_rating_key, timeout=timeout * 1000, randomize=timestamp()), title=_(u"Refresh: %s", item_title), - summary=_("Refreshes the %s, possibly searching for missing and picking up new subtitles on disk", current_kind) + summary=_("Refreshes the %(current_kind)s, possibly searching for missing and picking up " + "new subtitles on disk", current_kind=current_kind) )) oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=title, force=True, diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 3fc85ad77..f12c6ee40 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -97,43 +97,44 @@ "< Back to %s":"< Back to %s", "Back to %s > %s":"Back to %s > %s", "Refresh: %s":"Refresh: %s", - "Refreshes the %s, possibly searching for missing and picking up new subtitles on disk":"Refreshes the %s, possibly searching for missing and picking up new subtitles on disk", - "Force-find subtitles: %s":"Force-find subtitles: %s", + "Refreshes the %(current_kind)s, possibly searching for missing and picking up new subtitles on disk":"Refreshes the %(current_kind)s, possibly searching for missing and picking up new subtitles on disk", + "Force-find subtitles: %(item_title)s":"Force-find subtitles: %(item_title)s", "Issues a forced refresh, ignoring known subtitles and searching for new ones":"Issues a forced refresh, ignoring known subtitles and searching for new ones", - "File %s: ":"File %s: ", - "%sNo current subtitle in storage":"%sNo current subtitle in storage", - "%sCurrent subtitle: %s (added: %s, %s), Language: %s, Score: %i, Storage: %s":"%sCurrent subtitle: %s (added: %s, %s), Language: %s, Score: %i, Storage: %s", - "%sManage %s subtitle":"%sManage %s subtitle", - "%sList %s subtitles":"%sList %s subtitles", - "%sEmbedded subtitles (%s)":"%sEmbedded subtitles (%s)", + "File %(file_part_index)s: ":"File %(file_part_index)s: ", + "%(part_summary)sNo current subtitle in storage":"%(part_summary)sNo current subtitle in storage", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle":"%(part_summary)sManage %(language)s subtitle", + "%(part_summary)sList %(language)s subtitles":"%(part_summary)sList %(language)s subtitles", + "%(part_summary)sEmbedded subtitles (%(languages)s)":"%(part_summary)sEmbedded subtitles (%(languages)s)", "Extract and activate embedded subtitle streams":"Extract and activate embedded subtitle streams", - "Select active %s subtitle":"Select active %s subtitle", - "%d subtitles in storage":"%d subtitles in storage", - "List available %s subtitles":"List available %s subtitles", - "Modify current %s subtitle":"Modify current %s subtitle", - "Currently applied mods: %s":"Currently applied mods: %s", - "Blacklist current %s subtitle and search for a new one":"Blacklist current %s subtitle and search for a new one", - "Manage blacklist (%s contained)":"Manage blacklist (%s contained)", + "Select active %(language)s subtitle":"Select active %(language)s subtitle", + "%(count)d subtitles in storage":"%(count)d subtitles in storage", + "List available %(language)s subtitles":"List available %(language)s subtitles", + "Modify current %(language)s subtitle":"Modify current %(language)s subtitle", + "Currently applied mods: %(mod_list)s":"Currently applied mods: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one":"Blacklist current %(language)s subtitle and search for a new one", + "Manage blacklist (%(amount)s contained)":"Manage blacklist (%(amount)s contained)", "Inspect currently blacklisted subtitles":"Inspect currently blacklisted subtitles", - "%s%s, Score: %s":"%s%s, Score: %s", + "%(current_state)s%(subtitle_name)s, Score: %(score)s":"%(current_state)s%(subtitle_name)s, Score: %(score)s", + "Current: ":"Current: ", + "Stored: ":"Stored: ", "Subtitle saved to disk":"Subtitle saved to disk", - "%s, Score: %i, Storage: %s":"%s, Score: %i, Storage: %s", "Remove subtitle from blacklist":"Remove subtitle from blacklist", - "by %s":"by %s", - "Current: %s (%s) ":"Current: %s (%s) ", - "Search for %s subs (%s)":"Search for %s subs (%s)", - "%sFilename: %s":"%sFilename: %s", + "by %(release_group)s":"by %(release_group)s", + "Current: %(provider_name)s (%(score)s) ":"Current: %(provider_name)s (%(score)s) ", + "Search for %(language)s subs (%(video_data)s)":"Search for %(language)s subs (%(video_data)s)", + "%(current_info)sFilename: %(filename)s":"%(current_info)sFilename: %(filename)s", "No subtitles found":"No subtitles found", - "Searching for %s subs (%s), refresh here ...":"Searching for %s subs (%s), refresh here ...", - " (wrong FPS, sub: %s, media: %s)":" (wrong FPS, sub: %s, media: %s)", - " (wrong FPS, sub: %s, media: unknown, low impact mode)":" (wrong FPS, sub: %s, media: unknown, low impact mode)", - "%s%s: %s, score: %s%s":"%s%s: %s, score: %s%s", - "Release: %s, Matches: %s":"Release: %s, Matches: %s", - "Downloading subtitle for %s":"Downloading subtitle for %s", - "%s%s%s%s with default mods":"%s%s%s%s with default mods", + "Searching for %(language)s subs (%(video_data)s), refresh here ...":"Searching for %(language)s subs (%(video_data)s), refresh here ...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)":" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)":" (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s":"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s":"Release: %(release_info)s, Matches: %(matches)s", + "Downloading subtitle for %(title_or_id)s":"Downloading subtitle for %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods", " (unknown)":" (unknown)", " (forced)":" (forced)", - "Extract stream %s, %s%s%s%s":"Extract stream %s, %s%s%s%s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", "Extracting of embedded subtitle %s of part %s:%s triggered":"Extracting of embedded subtitle %s of part %s:%s triggered", "%s, %s (added: %s, %s), Language: %s, Score: %i, Storage: %s":"%s, %s (added: %s, %s), Language: %s, Score: %i, Storage: %s", "Extract stream %s, %s%s%s%s with default mods":"Extract stream %s, %s%s%s%s with default mods", From 6aa8108fce6d622798568066c15af653880a7dc9 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 18:48:37 +0200 Subject: [PATCH 020/710] i18n: string update finished --- Contents/Code/interface/item_details.py | 26 ++++++++++------- Contents/Code/interface/main.py | 31 +++++++++++++++------ Contents/Code/interface/menu.py | 4 +-- Contents/Code/interface/menu_helpers.py | 10 ++++--- Contents/Code/interface/refresh_item.py | 8 ++++-- Contents/Code/interface/sub_mod.py | 9 ++++-- Contents/Code/support/tasks.py | 4 ++- Contents/Strings/en.json | 37 ++++++++++++------------- 8 files changed, 80 insertions(+), 49 deletions(-) diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index a947fa8b5..05c22671b 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -284,11 +284,13 @@ def ListStoredSubsForItemMenu(**kwargs): key=lambda x: x[1].date_added, reverse=True): is_current = key == all_subs["current"] - summary = _(u"added: %s, %s, Language: %s, Score: %i, Storage: %s", - (df(subtitle.date_added), - subtitle.mode_verbose, display_language(language), - subtitle.score, - subtitle.storage_type)) + summary = _(u"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: " + u"%(storage_type)s", + date_added=df(subtitle.date_added), + mode=subtitle.mode_verbose, + language=display_language(language), + score=subtitle.score, + storage_type=subtitle.storage_type) sub_name = subtitle.provider_name if sub_name == "embedded": @@ -447,11 +449,15 @@ def sorter(pair): for sub_key, data in sorted(current_bl.iteritems(), key=sorter, reverse=True): provider_name, subtitle_id = sub_key - title = _(u"%s, %s (added: %s, %s), Language: %s, Score: %i, Storage: %s", - provider_name, subtitle_id, df(data["date_added"]), - current_sub.get_mode_verbose(data["mode"]), - display_language(Language.fromietf(language)), data["score"], - data["storage_type"]) + title = _(u"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, " + u"Score: %(score)i, Storage: %(storage_type)s", + provider_name=provider_name, + subtitle_id=subtitle_id, + date_added=df(data["date_added"]), + mode=current_sub.get_mode_verbose(data["mode"]), + language=display_language(Language.fromietf(language)), + score=data["score"], + storage_type=data["storage_type"]) oc.add(DirectoryObject( key=Callback(ManageBlacklistMenu, remove_sub_key="__".join(sub_key), randomize=timestamp(), **kwargs), title=title, diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index 7ba938e71..8b952378f 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -53,7 +53,9 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), title=pad_title(_("Insufficient permissions")), - summary=_("Insufficient permissions on library %s, folder: %s", title, path), + summary=_("Insufficient permissions on library %(title)s, folder: %(path)s", + title=title, + path=path), )) return oc @@ -112,7 +114,10 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r task = scheduler.task(task_name) if task.ready_for_display: - task_state = _("Running: %s/%s (%s%%)", task.items_done, task.items_searching, task.percentage) + task_state = _("Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + items_done=task.items_done, + items_searching=task.items_searching, + percentage=task.percentage) else: lr = scheduler.last_run(task_name) nr = scheduler.next_run(task_name) @@ -131,7 +136,7 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r oc.add(DirectoryObject( key=Callback(IgnoreListMenu), - title=_("Display ignore list (%d)", len(ignore_list)), + title=_("Display ignore list (%(ignored_count)d)", ignored_count=len(ignore_list)), summary=_("Show the current ignore list (mainly used for the automatic tasks)"), thumb=R("icon-ignore.jpg") )) @@ -166,7 +171,10 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r summary_data = [] for provider, data in Dict["provider_throttle"].iteritems(): reason, until, desc = data - summary_data.append(_("%s until %s (%s)", provider, until.strftime("%y/%m/%d %H:%M"), reason)) + summary_data.append(unicode(_("%(throttled_provider)s until %(until_date)s (%(reason)s)", + throttled_provider=provider, + until_date=until.strftime("%y/%m/%d %H:%M"), + reason=reason))) oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), @@ -319,9 +327,13 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): """ is_ignored = rating_key in ignore_list[kind] if not sure: - oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1=_("%s %s %s %s the ignore list", - _("Add") if not is_ignored else _("Remove"), ignore_list.verbose(kind), title, - _("to") if not is_ignored else _("from")), title2=_("Are you sure?")) + oc = SubFolderObjectContainer(no_history=True, replace_parent=True, + title1=_("%(add_or_remove)s %(kind)s %(title)s %(to_or_from)s the ignore list", + add_or_remove=_("Add") if not is_ignored else _("Remove"), + kind=ignore_list.verbose(kind), + title=title, + to_or_from=_("to") if not is_ignored else _("from")), + title2=_("Are you sure?")) oc.add(DirectoryObject( key=Callback(IgnoreMenu, kind=kind, rating_key=rating_key, title=title, sure=True, todo=_("add") if not is_ignored else _("remove")), @@ -355,7 +367,10 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): if dont_change: return fatality(force_title=" ", header=_("Didn't change the ignore list"), no_history=True) - return fatality(force_title=" ", header=_("%s %s the ignore list", title, state), no_history=True) + return fatality(force_title=" ", header=_("%(title)s %(added_to_or_removed_from)s the ignore list", + title=title, + added_to_or_removed_from=state), + no_history=True) @route(PREFIX + '/sections') diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 74f6d76a6..731841355 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -118,7 +118,7 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p title=title, previous_item_type=previous_item_type, with_mods=True, previous_rating_key=previous_rating_key, randomize=timestamp()), - title=_(u"Extract missing %s embedded subtitles", display_language(lang)), + title=_(u"Extract missing %(language)s embedded subtitles", language=display_language(lang)), summary=_("Extracts the not yet extracted embedded subtitles of all episodes for the current season ") + _("with all configured default modifications") )) @@ -128,7 +128,7 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p title=title, force=True, previous_item_type=previous_item_type, with_mods=True, previous_rating_key=previous_rating_key, randomize=timestamp()), - title=_(u"Extract and activate %s embedded subtitles", display_language(lang)), + title=_(u"Extract and activate %(language)s embedded subtitles", language=display_language(lang)), summary=_("Extracts embedded subtitles of all episodes for the current season ") + _("with all configured default modifications") )) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index fb6e079a6..bbd76904e 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -111,9 +111,9 @@ def set_refresh_menu_state(state_or_media, media_type="movies"): intent = get_intent() force_refresh = intent.get("force", media_id) - Dict["current_refresh_state"] = _(u"%sRefreshing %s", - _("Force-") if force_refresh else "", - unicode(title)) + Dict["current_refresh_state"] = unicode(_(u"%(force_state)sRefreshing %(title)s", + force_state=_("Force-") if force_refresh else "", + title=unicode(title))) def get_item_task_data(task_name, rating_key, language): @@ -181,7 +181,9 @@ def extract_embedded_sub(**kwargs): is_forced = is_stream_forced(stream) bn = os.path.basename(part.file) - set_refresh_menu_state(_(u"Extracting subtitle %s of %s", stream_index, bn)) + set_refresh_menu_state(_(u"Extracting subtitle %(stream_index)s of %(filename)s", + stream_index=stream_index, + filename=bn)) Log.Info(u"Extracting stream %s (%s) of %s", stream_index, display_language(language), bn) out_codec = stream.codec if stream.codec != "mov_text" else "srt" diff --git a/Contents/Code/interface/refresh_item.py b/Contents/Code/interface/refresh_item.py index c6a726f60..51f6a7717 100644 --- a/Contents/Code/interface/refresh_item.py +++ b/Contents/Code/interface/refresh_item.py @@ -16,9 +16,13 @@ def RefreshItem(rating_key=None, came_from="/recent", item_title=None, force=Fal from interface.main import fatality header = " " if trigger: - set_refresh_menu_state(_(u"Triggering %sRefresh for %s", _("Force-") if force else "", item_title)) + set_refresh_menu_state(_(u"Triggering %(forced)sRefresh for %(title)s", + forced=_("Force-") if force else "", + title=item_title)) Thread.Create(refresh_item, rating_key=rating_key, force=force, refresh_kind=refresh_kind, parent_rating_key=previous_rating_key, timeout=int(timeout)) - header = _(u"%s of item %s triggered", _("Refresh") if not force else _("Forced-refresh"), rating_key) + header = _(u"%(refresh_or_forced_refresh)s of item %(item_id)s triggered", + refresh_or_forced_refresh=_("Refresh") if not force else _("Forced-refresh"), + item_id=rating_key) return fatality(randomize=timestamp(), header=header, replace_parent=True) diff --git a/Contents/Code/interface/sub_mod.py b/Contents/Code/interface/sub_mod.py index 7f2e26a74..3f4ae127c 100644 --- a/Contents/Code/interface/sub_mod.py +++ b/Contents/Code/interface/sub_mod.py @@ -131,7 +131,10 @@ def SubtitleFPSModMenu(**kwargs): mod_ident = SubtitleModifications.get_mod_signature("change_FPS", **{"from": fps, "to": target_fps}) oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=mod_ident, mode="add", randomize=timestamp(), **kwargs), - title=_("%s fps -> %s fps (%s)", fps, target_fps, indicator) + title=_("%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + from_fps=fps, + to_fps=target_fps, + slower_or_faster_indicator=indicator) )) return oc @@ -155,7 +158,7 @@ def SubtitleShiftModUnitMenu(**kwargs): for unit, title in POSSIBLE_UNITS: oc.add(DirectoryObject( key=Callback(SubtitleShiftModMenu, unit=unit, randomize=timestamp(), **kwargs), - title=_("Adjust by %s", title) + title=_("Adjust by %(time_and_unit)s", time_and_unit=title) )) return oc @@ -274,7 +277,7 @@ def SubtitleListMods(**kwargs): for identifier in current_sub.mods: oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=identifier, mode="remove", randomize=timestamp(), **kwargs), - title=_("Remove: %s", identifier) + title=_("Remove: %(mod_name)s", mod_name=identifier) )) storage.destroy() diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index e607c4599..d6c0d77d2 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -243,7 +243,9 @@ def download_subtitle(self, subtitle, rating_key, mode="m"): if not scheduler.is_task_running("MissingSubtitles"): scheduler.clear_task_data("MissingSubtitles") else: - set_refresh_menu_state(_(u"%s: Subtitle download failed (%s)", self.name, rating_key)) + set_refresh_menu_state(_(u"%(class_name)s: Subtitle download failed (%(item_id)s)", + class_name=self.name, + item_id=rating_key)) return download_successful diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index f12c6ee40..c2c3b2296 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -136,10 +136,9 @@ " (forced)":" (forced)", "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", "Extracting of embedded subtitle %s of part %s:%s triggered":"Extracting of embedded subtitle %s of part %s:%s triggered", - "%s, %s (added: %s, %s), Language: %s, Score: %i, Storage: %s":"%s, %s (added: %s, %s), Language: %s, Score: %i, Storage: %s", - "Extract stream %s, %s%s%s%s with default mods":"Extract stream %s, %s%s%s%s with default mods", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", "Insufficient permissions":"Insufficient permissions", - "Insufficient permissions on library %s, folder: %s":"Insufficient permissions on library %s, folder: %s", + "Insufficient permissions on library %(title)s, folder: %(path)s":"Insufficient permissions on library %(title)s, folder: %(path)s", "I'm not enabled!":"I'm not enabled!", "Please enable me for some of your libraries in your server settings; currently I do nothing":"Please enable me for some of your libraries in your server settings; currently I do nothing", "Working ... refresh here":"Working ... refresh here", @@ -154,18 +153,18 @@ "Lists items with missing subtitles. Click on Find recent items with missing subs to update list":"Lists items with missing subtitles. Click on Find recent items with missing subs to update list", "Browse all items":"Browse all items", "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.":"Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.", - "Running: %s/%s (%s%%)":"Running: %s/%s (%s%%)", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)":"Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", "Last run: %s; Next scheduled run: %s; Last runtime: %s":"Last run: %s; Next scheduled run: %s; Last runtime: %s", "Search for missing subtitles (in recently-added items, max-age: %s)":"Search for missing subtitles (in recently-added items, max-age: %s)", "Automatically run periodically by the scheduler, if configured. %s":"Automatically run periodically by the scheduler, if configured. %s", - "Display ignore list (%d)":"Display ignore list (%d)", + "Display ignore list (%(ignored_count)d)":"Display ignore list (%(ignored_count)d)", "Show the current ignore list (mainly used for the automatic tasks)":"Show the current ignore list (mainly used for the automatic tasks)", "History":"History", "Show the last %i downloaded subtitles":"Show the last %i downloaded subtitles", "Refresh":"Refresh", "Re-lock menu(s)":"Re-lock menu(s)", "Enabled the PIN again for menu(s)":"Enabled the PIN again for menu(s)", - "%s until %s (%s)":"%s until %s (%s)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)":"%(throttled_provider)s until %(until_date)s (%(reason)s)", "Throttled providers: %s":"Throttled providers: %s", "Advanced functions":"Advanced functions", "Use at your own risk":"Use at your own risk", @@ -175,7 +174,7 @@ "Find recent items with missing subtitles":"Find recent items with missing subtitles", "Updating, refresh here ...":"Updating, refresh here ...", "Missing: %s":"Missing: %s", - "%s %s %s %s the ignore list":"%s %s %s %s the ignore list", + "%(add_or_remove)s %(kind)s %(title)s %(to_or_from)s the ignore list":"%(add_or_remove)s %(kind)s %(title)s %(to_or_from)s the ignore list", "Add":"Add", "Remove":"Remove", "to":"to", @@ -185,26 +184,26 @@ "removed from":"removed from", "added to":"added to", "Didn't change the ignore list":"Didn't change the ignore list", - "%s %s the ignore list":"%s %s the ignore list", + "%(title)s %(added_to_or_removed_from)s the ignore list":"%(title)s %(added_to_or_removed_from)s the ignore list", "Sections":"Sections", "All":"All", "Un-Ignore":"Un-Ignore", "Ignore":"Ignore", "show":"show", "movie":"movie", - "%sRefreshing %s":"%sRefreshing %s", + "%(force_state)sRefreshing %(title)s":"%(force_state)sRefreshing %(title)s", "Force-":"Force-", - "Extracting subtitle %s of %s":"Extracting subtitle %s of %s", + "Extracting subtitle %(stream_index)s of %(filename)s":"Extracting subtitle %(stream_index)s of %(filename)s", "<< Back to home":"<< Back to home", - "Extract missing %s embedded subtitles":"Extract missing %s embedded subtitles", + "Extract missing %(language)s embedded subtitles":"Extract missing %(language)s embedded subtitles", "Extracts the not yet extracted embedded subtitles of all episodes for the current season ":"Extracts the not yet extracted embedded subtitles of all episodes for the current season ", "with all configured default modifications":"with all configured default modifications", - "Extract and activate %s embedded subtitles":"Extract and activate %s embedded subtitles", + "Extract and activate %(language)s embedded subtitles":"Extract and activate %(language)s embedded subtitles", "Extracts embedded subtitles of all episodes for the current season ":"Extracts embedded subtitles of all episodes for the current season ", "Auto-Find subtitles: %s":"Auto-Find subtitles: %s", "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered", - "Triggering %sRefresh for %s":"Triggering %sRefresh for %s", - "%s of item %s triggered":"%s of item %s triggered", + "Triggering %(forced)sRefresh for %(title)s":"Triggering %(forced)sRefresh for %(title)s", + "%(refresh_or_forced_refresh)s of item %(item_id)s triggered":"%(refresh_or_forced_refresh)s of item %(item_id)s triggered", "Forced-refresh":"Forced-refresh", "< Back to subtitle options for: %s":"< Back to subtitle options for: %s", "Remove last applied mod (%s)":"Remove last applied mod (%s)", @@ -215,13 +214,13 @@ "< Back to subtitle modification menu":"< Back to subtitle modification menu", "subs constantly getting faster":"subs constantly getting faster", "subs constantly getting slower":"subs constantly getting slower", - "%s fps -> %s fps (%s)":"%s fps -> %s fps (%s)", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)":"%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", "< Back to subtitle modifications":"< Back to subtitle modifications", - "Adjust by %s":"Adjust by %s", + "Adjust by %(time_and_unit)s":"Adjust by %(time_and_unit)s", "< Back to unit selection":"< Back to unit selection", - "added: %s, %s, Language: %s, Score: %i, Storage: %s":"added: %s, %s, Language: %s, Score: %i, Storage: %s", - "Remove: %s":"Remove: %s", - "%s: Subtitle download failed (%s)": "%s: Subtitle download failed (%s)", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "Remove: %(mod_name)s":"Remove: %(mod_name)s", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Subtitle download failed (%(item_id)s)", "Subtitle Language (1)":"Subtitle Language (1)", "Subtitle Language (2)":"Subtitle Language (2)", "Subtitle Language (3)":"Subtitle Language (3)", From 048f930da159e0644a6f548717417db5ab40ed52 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 19:02:41 +0200 Subject: [PATCH 021/710] i18n: add missing strings --- Contents/Code/interface/menu_helpers.py | 7 ++++--- Contents/Code/interface/sub_mod.py | 4 ++-- Contents/Strings/en.json | 2 ++ 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index bbd76904e..fc1164c2a 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -52,7 +52,8 @@ def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None oc.add(DirectoryObject( key=Callback(callback_menu, kind=use_kind, rating_key=rating_key, title=title), title=u"%s %s \"%s\"" % ( - _("Un-Ignore") if in_list else _("Ignore"), ignore_list.verbose(kind) if add_kind else "", unicode(title)) + unicode(_("Un-Ignore") if in_list else _("Ignore")), ignore_list.verbose(kind) if add_kind else "", + unicode(title)) ) ) @@ -251,8 +252,8 @@ def __init__(self, *args, **kwargs): key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title(_("<< Back to home")), summary=_("Current state: %s; Last state: %s", - (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", - (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" + (Dict["current_refresh_state"] or _("Idle")) if "current_refresh_state" in Dict else _("Idle"), + (Dict["last_refresh_state"] or _("None")) if "last_refresh_state" in Dict else _("None") ) )) diff --git a/Contents/Code/interface/sub_mod.py b/Contents/Code/interface/sub_mod.py index 3f4ae127c..24daa4481 100644 --- a/Contents/Code/interface/sub_mod.py +++ b/Contents/Code/interface/sub_mod.py @@ -209,7 +209,7 @@ def SubtitleColorModMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title="< Back to subtitle modification menu" + title=_("< Back to subtitle modification menu") )) for color, code in color_mod.colors.iteritems(): @@ -271,7 +271,7 @@ def SubtitleListMods(**kwargs): oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title="< Back to subtitle modifications" + title=_("< Back to subtitle modifications") )) for identifier in current_sub.mods: diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index c2c3b2296..1524cc0f4 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -208,6 +208,8 @@ "< Back to subtitle options for: %s":"< Back to subtitle options for: %s", "Remove last applied mod (%s)":"Remove last applied mod (%s)", "none":"none", + "None":"None", + "Idle":"Idle", "Manage applied mods":"Manage applied mods", "Reapply applied mods":"Reapply applied mods", "Restore original version":"Restore original version", From 79457536f2167e6d56455f9190a49477cac21cf0 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 19:03:33 +0200 Subject: [PATCH 022/710] providers: opensubtitles: return compatible status code in case of error --- Contents/Libraries/Shared/subliminal_patch/http.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index a1e92b3a7..54903aaa1 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -7,7 +7,7 @@ import requests import xmlrpclib -from xmlrpclib import SafeTransport, ProtocolError, Fault, Transport +from xmlrpclib import SafeTransport, Transport from requests import Session, exceptions from retry.api import retry_call @@ -158,8 +158,8 @@ def request(self, host, handler, request_body, verbose=0): try: resp.raise_for_status() except requests.RequestException as e: - raise xmlrpclib.ProtocolError(url, resp.status_code, - str(e), resp.headers) + return {"status": str(resp.status_code)} + else: self.verbose = verbose return self.parse_response(resp.raw) From 2bb050de40c53d9d899a654119f8ed3831f92e42 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 22:49:26 +0200 Subject: [PATCH 023/710] i18n: add optional debug mode that checks correct supply of args/kwargs for a format string --- Contents/Code/support/config.py | 2 ++ Contents/Code/support/i18n.py | 16 ++++++++++++---- Contents/advanced_settings.json.template | 2 ++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 696e2d2d4..7c6b159e5 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -94,6 +94,7 @@ class Config(object): new_style_cache = False pack_cache_dir = None advanced = None + debug_i18n = False enable_channel = True enable_agent = True @@ -167,6 +168,7 @@ def initialize(self): self.new_style_cache = cast_bool(Prefs['new_style_cache']) self.pack_cache_dir = self.get_pack_cache_dir() self.advanced = self.get_advanced_config() + self.debug_i18n = self.advanced.debug_i18n os.environ["SZ_USER_AGENT"] = self.get_user_agent() diff --git a/Contents/Code/support/i18n.py b/Contents/Code/support/i18n.py index a2ca4a7f8..d70d3bfb2 100644 --- a/Contents/Code/support/i18n.py +++ b/Contents/Code/support/i18n.py @@ -2,6 +2,9 @@ import inspect +from support.config import config + + core = getattr(Data, "_core") @@ -22,9 +25,11 @@ def __init__(self, string1, string2, locale=None): setattr(self, "_string1", string1) if isinstance(string2, tuple) and len(string2) == 1 and hasattr(string2[0], "iteritems"): - if not is_localized_string(string1) and "%(" not in string1: - Log.Error(u"%s requires a dictionary for formatting" % string1) string2 = string2[0] + if config.debug_i18n: + if "%(" not in string1.__str__(): + Log.Error(u"%r: dictionary for non-named format string supplied" % string1) + string2 = "BROKEN STRING" setattr(self, "_string2", string2) setattr(self, "_locale", locale) @@ -40,8 +45,11 @@ def local_string_with_optional_format(key, *args, **kwargs): return SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale), args) # check string instances for arguments - if not is_localized_string(key) and ("%s" in key or "%(" in key) and not args: - raise Log.Error(u"%s requires a arguments for formatting" % key) + if config.debug_i18n: + k = key.__str__().replace("%%", "") + if ("%s" in k or "%(" in k) and not args: + Log.Error(u"%r requires a arguments for formatting" % k) + return "NEEDS FORMAT ARGUMENTS" return plex_i18n_module.LocalString(core, key, Locale.CurrentLocale) diff --git a/Contents/advanced_settings.json.template b/Contents/advanced_settings.json.template index 4804b5098..0f86c5deb 100644 --- a/Contents/advanced_settings.json.template +++ b/Contents/advanced_settings.json.template @@ -24,6 +24,8 @@ Don't expect support if you mess this up. "find_better_as_extracted_tv_score": 352, "find_better_as_extracted_movie_score": 82, + "debug_i18n": false, + // per-provider-config "providers": { // enabled_for: specifies which media type to enable the provider for. does not override global/throttled From e280b62f5c867a8dc2d8bfd0c97d89341ffa1ace Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 23:27:53 +0200 Subject: [PATCH 024/710] i18n: improve debug mode improper usage detection --- Contents/Code/support/i18n.py | 59 ++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/Contents/Code/support/i18n.py b/Contents/Code/support/i18n.py index d70d3bfb2..5b1dc4795 100644 --- a/Contents/Code/support/i18n.py +++ b/Contents/Code/support/i18n.py @@ -17,20 +17,56 @@ def get_localization_module(): plex_i18n_module = get_localization_module() +def old_style_placeholders_count(s): + # fixme: incomplete, use regex + return sum(s.count(c) for c in ["%s", "%d", "%r", "%f"]) + + +def check_old_style_placeholders(k, args): + # replace escaped %'s? + k = k.__str__().replace("%%", "") + + if "%(" in k: + Log.Error(u"%r defines named placeholders for formatting" % k) + return "NEEDS NAMED ARGUMENTS" + + placeholders_found = old_style_placeholders_count(k) + if placeholders_found and not args: + Log.Error(u"%r requires a arguments for formatting" % k) + return "NEEDS FORMAT ARGUMENTS" + + elif not placeholders_found and args: + Log.Error(u"%r doesn't define placeholders for formatting" % k) + return "HAS NO FORMAT ARGUMENTS" + + elif placeholders_found and placeholders_found != len(args): + Log.Error(u"%r wrong amount of arguments supplied for formatting" % k) + return "WRONG FORMAT ARGUMENT COUNT" + + class SmartLocalStringFormatter(plex_i18n_module.LocalStringFormatter): """ this allows the use of dictionaries for string formatting, also does some sanity checking on the keys and values """ def __init__(self, string1, string2, locale=None): - setattr(self, "_string1", string1) - - if isinstance(string2, tuple) and len(string2) == 1 and hasattr(string2[0], "iteritems"): - string2 = string2[0] - if config.debug_i18n: - if "%(" not in string1.__str__(): - Log.Error(u"%r: dictionary for non-named format string supplied" % string1) - string2 = "BROKEN STRING" + if isinstance(string2, tuple): + # dictionary passed + if len(string2) == 1 and hasattr(string2[0], "iteritems"): + string2 = string2[0] + if config.debug_i18n: + if "%(" not in string1.__str__().replace("%%", ""): + Log.Error(u"%r: dictionary for non-named format string supplied" % string1.__str__()) + string1 = "%s" + string2 = "NO NAMED ARGUMENTS" + + # arguments + elif len(string2) >= 1 and config.debug_i18n: + msg = check_old_style_placeholders(string1, string2) + if msg: + string1 = "%s" + string2 = msg + setattr(self, "_string1", string1) setattr(self, "_string2", string2) setattr(self, "_locale", locale) @@ -46,10 +82,9 @@ def local_string_with_optional_format(key, *args, **kwargs): # check string instances for arguments if config.debug_i18n: - k = key.__str__().replace("%%", "") - if ("%s" in k or "%(" in k) and not args: - Log.Error(u"%r requires a arguments for formatting" % k) - return "NEEDS FORMAT ARGUMENTS" + msg = check_old_style_placeholders(key, args) + if msg: + return msg return plex_i18n_module.LocalString(core, key, Locale.CurrentLocale) From bd982958fa2bfd1a05a611abbf539a2cd608bd51 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 23:47:52 +0200 Subject: [PATCH 025/710] i18n: add blank de.json --- Contents/Strings/de.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Contents/Strings/de.json diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json new file mode 100644 index 000000000..0e0dcd235 --- /dev/null +++ b/Contents/Strings/de.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file From 93d8494ddc80925f133cbbdd15f99446ff268d12 Mon Sep 17 00:00:00 2001 From: pannal Date: Tue, 3 Apr 2018 23:49:01 +0200 Subject: [PATCH 026/710] Update de.json (POEditor.com) --- Contents/Strings/de.json | 382 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 381 insertions(+), 1 deletion(-) diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 0e0dcd235..72d4e8f86 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -1,3 +1,383 @@ { - + "sq": "Albanisch", + "ar": "", + "be": "", + "bs": "", + "bg": "", + "ca": "", + "zh": "", + "hr": "", + "cs": "", + "da": "", + "nl": "", + "en": "", + "et": "", + "fa": "", + "fi": "", + "fr": "", + "de": "", + "el": "", + "he": "", + "hi": "", + "hu": "", + "is": "", + "id": "", + "it": "", + "ja": "", + "ko": "", + "lv": "", + "lt": "", + "mk": "", + "ms": "", + "no": "", + "pl": "", + "pt": "", + "pt-br": "", + "ro": "", + "ru": "", + "sr": "", + "sr-cyrl": "", + "sr-latn": "", + "sk": "", + "sl": "", + "es": "", + "sv": "", + "th": "", + "tr": "", + "uk": "", + "vi": "", + "Internal stuff, pay attention!": "", + "Advanced": "", + "advanced": "", + "Enter PIN": "", + "The owner has restricted the access to this menu. Please enter the correct pin": "", + "Restart the plugin": "", + "Get my logs (copy the appearing link and open it in your browser, please)": "", + "Copy the appearing link and open it in your browser, please": "", + "Trigger find better subtitles": "", + "Skip next find better subtitles (sets last run to now)": "", + "Trigger subtitle storage maintenance": "", + "Trigger subtitle storage migration (expensive)": "", + "Trigger cache maintenance (refiners, providers and packs/archives)": "", + "Apply configured default subtitle mods to all (active) stored subtitles": "", + "Re-Apply mods of all stored subtitles": "", + "Log the plugin's scheduled tasks state storage": "", + "Log the plugin's internal ignorelist storage": "", + "Log the plugin's complete state storage": "", + "Reset the plugin's scheduled tasks state storage": "", + "Reset the plugin's internal ignorelist storage": "", + "Invalidate Sub-Zero metadata caches (subliminal)": "", + "Reset provider throttle states": "", + "Restarting the plugin": "", + "Restart triggered, please wait about 5 seconds": "", + "Reset subtitle storage": "", + "Are you sure?": "", + "Are you really sure?": "", + "Success": "", + "FindBetterSubtitles triggered": "", + "FindBetterSubtitles skipped": "", + "SubtitleStorageMaintenance triggered": "", + "MigrateSubtitleStorage triggered": "", + "TriggerCacheMaintenance triggered": "", + "This may take some time ...": "", + "Download Logs": "", + "Sorry, feature unavailable": "", + "Universal Plex token not available": "", + "Copy this link and open this in your browser, please": "", + "Cache invalidated": "", + "Enter PIN number ": "", + "PIN correct": "", + "Reset": "", + "Menu locked": "", + "Provider throttles reset": "", + "Information Storage (%s) reset": "", + "Information Storage (%s) logged": "", + "Plex didn't return any information about the item, please refresh it and come back later": "", + "Item not found: %s!": "", + "< Back to %s": "", + "Back to %s > %s": "", + "Refresh: %s": "", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "", + "Extract and activate embedded subtitle streams": "", + "Inspect currently blacklisted subtitles": "", + "Subtitle saved to disk": "", + "Remove subtitle from blacklist": "", + "No subtitles found": "", + " (unknown)": "", + " (forced)": "", + "Extracting of embedded subtitle %s of part %s:%s triggered": "", + "Insufficient permissions": "", + "I'm not enabled!": "", + "Please enable me for some of your libraries in your server settings; currently I do nothing": "", + "Working ... refresh here": "", + "Current state: %s; Last state: %s": "", + "On-deck items": "", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles.": "", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "", + "Recently-added items": "", + "Recently played items": "", + "Shows the recently added items per section.": "", + "Show recently added items with missing subtitles": "", + "Lists items with missing subtitles. Click on Find recent items with missing subs to update list": "", + "Browse all items": "", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "", + "Last run: %s; Next scheduled run: %s; Last runtime: %s": "", + "Search for missing subtitles (in recently-added items, max-age: %s)": "", + "Automatically run periodically by the scheduler, if configured. %s": "", + "Show the current ignore list (mainly used for the automatic tasks)": "", + "History": "", + "Show the last %i downloaded subtitles": "", + "Refresh": "", + "Re-lock menu(s)": "", + "Enabled the PIN again for menu(s)": "", + "Throttled providers: %s": "", + "Advanced functions": "", + "Use at your own risk": "", + "Items On Deck": "", + "Recently Played": "", + "Items with missing subtitles": "", + "Find recent items with missing subtitles": "", + "Updating, refresh here ...": "", + "Missing: %s": "", + "Add": "", + "Remove": "", + "to": "", + "from": "", + "add": "", + "remove": "", + "removed from": "", + "added to": "", + "Didn't change the ignore list": "", + "Sections": "", + "All": "", + "Un-Ignore": "", + "Ignore": "", + "show": "", + "movie": "", + "Force-": "", + "<< Back to home": "", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season ": "", + "with all configured default modifications": "", + "Extracts embedded subtitles of all episodes for the current season ": "", + "Auto-Find subtitles: %s": "", + "Extracting of embedded subtitles for %s triggered": "", + "Forced-refresh": "", + "< Back to subtitle options for: %s": "", + "Remove last applied mod (%s)": "", + "none": "", + "Manage applied mods": "", + "Reapply applied mods": "", + "Restore original version": "", + "< Back to subtitle modification menu": "", + "subs constantly getting faster": "", + "subs constantly getting slower": "", + "< Back to subtitle modifications": "", + "< Back to unit selection": "", + "Subtitle Language (1)": "", + "Subtitle Language (2)": "", + "Subtitle Language (3)": "", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "", + "Only download foreign/forced subtitles": "", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "", + "I rename my files using": "", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "", + "Sonarr URL (add URL base if configured)": "", + "Sonarr API key": "", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "", + "Radarr API key": "", + "Provider: Enable OpenSubtitles": "", + "Opensubtitles Username": "", + "Opensubtitles Password": "", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "", + "Provider: Enable Podnapisi.NET": "", + "Provider: Enable Titlovi.com": "", + "Provider: Enable Addic7ed": "", + "Addic7ed Username": "", + "Addic7ed Password": "", + "Addic7ed: boost score (if requirements met)": "", + "Addic7ed: Use random user agents": "", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "", + "Legendas TV Username": "", + "Legendas TV Password": "", + "Provider: Enable TVsubtitles.net": "", + "Provider: Enable NapiProjekt.pl (Polish)": "", + "Provider: Enable SubScene (TV shows)": "", + "Provider: Enable hosszupuskasub.com (Hungarian)": "", + "Provider: Enable aRGENTeaM (Spanish)": "", + "Search enabled providers simultaneously (multithreading)": "", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "", + "How strict should these subtitles existing on the filesystem be detected?": "", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "", + "Download hearing impaired subtitles.": "", + "Remove Hearing Impaired tags from downloaded subtitles": "", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "", + "Fix common issues in subtitles": "", + "Fix common OCR errors in downloaded subtitles": "", + "Reverse punctuation in RTL languages (heb)": "", + "Change colors of subtitles to": "", + "Store subtitles next to media files (instead of metadata)": "", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "", + "Fall back to metadata storage if filesystem storage failed": "", + "Set subtitle file permissions to (integer, e.g.: 0775)": "", + "Automatically delete leftover/unused (externally saved) subtitles": "", + "On media playback: search for missing subtitles (refresh item)": "", + "Scheduler: Periodically search for recent items with missing subtitles": "", + "Scheduler: Item age to be considered recent": "", + "Scheduler: Recent items to consider per library": "", + "Scheduler: Periodically search for better subtitles": "", + "Scheduler: Days to search for better subtitles (max: 30 days)": "", + "Scheduler: Don't search for better subtitles if the item's air date is older than": "", + "Scheduler: Overwrite manually selected subtitles when better found": "", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "", + "History: amount of items to store historical data for": "", + "How many download tries per subtitle (on timeout or error)": "", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "", + "Ignore anything in the following paths (comma-separated)": "", + "Sub-Zero mode": "", + "Access PIN (any amount of numbers, 0-9)": "", + "Access PIN valid for minutes": "", + "Use PIN to restrict access to (needs plugin or PMS restart)": "", + "Call this executable upon successful subtitle download (see Wiki for details)": "", + "Check for correct folder permissions of every library on plugin start": "", + "Use new style caching (for subliminal)": "", + "Low impact mode (for remote filesystems)": "", + "Timeout for API requests sent to the PMS": "", + "HTTP proxy to use for providers (supports credentials)": "", + "How verbose should the logging be?": "", + "How many log backups to keep?": "", + "Log subtitle modification (debug)": "", + "Log to console (for development/debugging)": "", + "Collect anonymous usage statistics": "", + "Sonarr/Radarr (fill api info below)": "", + "Filebot": "", + "Sonarr/Radarr/Filebot": "", + "Symlink to original file": "", + "I keep the original filenames": "", + "none of the above": "", + "exact: media filename match": "", + "loose: filename contains media filename": "", + "any": "", + "prefer": "", + "don't prefer": "", + "force HI": "", + "force non-HI": "", + "don't change": "", + "white": "", + "light-grey": "", + "red": "", + "green": "", + "yellow": "", + "blue": "", + "magenta": "", + "cyan": "", + "black": "", + "dark-red": "", + "dark-green": "", + "dark-yellow": "", + "dark-blue": "", + "dark-magenta": "", + "dark-cyan": "", + "dark-grey": "", + "current folder": "", + "never": "", + "current media item": "", + "next episode (series)": "", + "hybrid: current item or next episode": "", + "hybrid-plus: current item and next episode": "", + "every 6 hours": "", + "every 12 hours": "", + "every 24 hours": "", + "1 days": "", + "2 days": "", + "3 days": "", + "4 days": "", + "1 weeks": "", + "2 weeks": "", + "3 weeks": "", + "4 weeks": "", + "5 weeks": "", + "6 weeks": "", + "12 weeks": "", + "don't limit": "", + "1 year": "", + "2 years": "", + "3 years": "", + "4 years": "", + "5 years": "", + "6 years": "", + "7 years": "", + "8 years": "", + "9 years": "", + "10 years": "", + "agent + channel": "", + "only agent": "", + "only channel": "", + "disabled": "", + "channel menu": "", + "advanced menu": "", + "CRITICAL": "", + "ERROR": "", + "WARNING": "", + "INFO": "", + "DEBUG": "", + "Refreshes the %(current_kind)s, possibly searching for missing and picking up new subtitles on disk": "", + "Force-find subtitles: %(item_title)s": "", + "File %(file_part_index)s: ": "", + "%(part_summary)sNo current subtitle in storage": "", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "", + "%(part_summary)sManage %(language)s subtitle": "", + "%(part_summary)sList %(language)s subtitles": "", + "%(part_summary)sEmbedded subtitles (%(languages)s)": "", + "Select active %(language)s subtitle": "", + "%(count)d subtitles in storage": "", + "List available %(language)s subtitles": "", + "Modify current %(language)s subtitle": "", + "Currently applied mods: %(mod_list)s": "", + "Blacklist current %(language)s subtitle and search for a new one": "", + "Manage blacklist (%(amount)s contained)": "", + "%(current_state)s%(subtitle_name)s, Score: %(score)s": "", + "Current: ": "", + "Stored: ": "", + "by %(release_group)s": "", + "Current: %(provider_name)s (%(score)s) ": "", + "Search for %(language)s subs (%(video_data)s)": "", + "%(current_info)sFilename: %(filename)s": "", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": "", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": "", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "", + "Release: %(release_info)s, Matches: %(matches)s": "", + "Downloading subtitle for %(title_or_id)s": "", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "", + "Insufficient permissions on library %(title)s, folder: %(path)s": "", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "", + "Display ignore list (%(ignored_count)d)": "", + "%(throttled_provider)s until %(until_date)s (%(reason)s)": "", + "%(add_or_remove)s %(kind)s %(title)s %(to_or_from)s the ignore list": "", + "%(title)s %(added_to_or_removed_from)s the ignore list": "", + "%(force_state)sRefreshing %(title)s": "", + "Extracting subtitle %(stream_index)s of %(filename)s": "", + "Extract missing %(language)s embedded subtitles": "", + "Extract and activate %(language)s embedded subtitles": "", + "Triggering %(forced)sRefresh for %(title)s": "", + "%(refresh_or_forced_refresh)s of item %(item_id)s triggered": "", + "None": "", + "Idle": "", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "", + "Adjust by %(time_and_unit)s": "", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "", + "Remove: %(mod_name)s": "", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "" } \ No newline at end of file From d9fa860b0cfe74e23e0a46a7c7ce661daad73f59 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 23:52:49 +0200 Subject: [PATCH 027/710] i18n: add non-blank de.json --- Contents/Strings/de.json | 384 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 382 insertions(+), 2 deletions(-) diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 0e0dcd235..1524cc0f4 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -1,3 +1,383 @@ { - -} \ No newline at end of file + "sq":"Albanian", + "ar":"Arabic", + "be":"Belarusian", + "bs":"Bosnian", + "bg":"Bulgarian", + "ca":"Catalan", + "zh":"Chinese", + "hr":"Croatian", + "cs":"Czech", + "da":"Danish", + "nl":"Dutch", + "en":"English", + "et":"Estonian", + "fa":"Persian (Farsi)", + "fi":"Finnish", + "fr":"French", + "de":"German", + "el":"Greek", + "he":"Hebrew", + "hi":"Hindi", + "hu":"Hungarian", + "is":"Icelandic", + "id":"Indonesian", + "it":"Italian", + "ja":"Japanese", + "ko":"Korean", + "lv":"Latvian", + "lt":"Lithuanian", + "mk":"Macedonian", + "ms":"Malay", + "no":"Norwegian", + "pl":"Polish", + "pt":"Portuguese", + "pt-br":"Portuguese (Brasil)", + "ro":"Romanian", + "ru":"Russian", + "sr":"Serbian", + "sr-cyrl":"Serbian (Cyrillic)", + "sr-latn":"Serbian (Latin)", + "sk":"Slovak", + "sl":"Slovenian", + "es":"Spanish", + "sv":"Swedish", + "th":"Thai", + "tr":"Turkish", + "uk":"Ukranian", + "vi":"Vietnamese", + "Internal stuff, pay attention!":"Internal stuff, pay attention!", + "Advanced":"Advanced", + "advanced":"advanced", + "Enter PIN":"Enter PIN", + "The owner has restricted the access to this menu. Please enter the correct pin":"The owner has restricted the access to this menu. Please enter the correct pin", + "Restart the plugin":"Restart the plugin", + "Get my logs (copy the appearing link and open it in your browser, please)":"Get my logs (copy the appearing link and open it in your browser, please)", + "Copy the appearing link and open it in your browser, please":"Copy the appearing link and open it in your browser, please", + "Trigger find better subtitles":"Trigger find better subtitles", + "Skip next find better subtitles (sets last run to now)":"Skip next find better subtitles (sets last run to now)", + "Trigger subtitle storage maintenance":"Trigger subtitle storage maintenance", + "Trigger subtitle storage migration (expensive)":"Trigger subtitle storage migration (expensive)", + "Trigger cache maintenance (refiners, providers and packs/archives)":"Trigger cache maintenance (refiners, providers and packs/archives)", + "Apply configured default subtitle mods to all (active) stored subtitles":"Apply configured default subtitle mods to all (active) stored subtitles", + "Re-Apply mods of all stored subtitles":"Re-Apply mods of all stored subtitles", + "Log the plugin's scheduled tasks state storage":"Log the plugin's scheduled tasks state storage", + "Log the plugin's internal ignorelist storage":"Log the plugin's internal ignorelist storage", + "Log the plugin's complete state storage":"Log the plugin's complete state storage", + "Reset the plugin's scheduled tasks state storage":"Reset the plugin's scheduled tasks state storage", + "Reset the plugin's internal ignorelist storage":"Reset the plugin's internal ignorelist storage", + "Invalidate Sub-Zero metadata caches (subliminal)":"Invalidate Sub-Zero metadata caches (subliminal)", + "Reset provider throttle states":"Reset provider throttle states", + "Restarting the plugin":"Restarting the plugin", + "Restart triggered, please wait about 5 seconds":"Restart triggered, please wait about 5 seconds", + "Reset subtitle storage":"Reset subtitle storage", + "Are you sure?":"Are you sure?", + "Are you really sure?":"Are you really sure?", + "Success":"Success", + "Information Storage (%s) reset":"Information Storage (%s) reset", + "Information Storage (%s) logged":"Information Storage (%s) logged", + "FindBetterSubtitles triggered":"FindBetterSubtitles triggered", + "FindBetterSubtitles skipped":"FindBetterSubtitles skipped", + "SubtitleStorageMaintenance triggered":"SubtitleStorageMaintenance triggered", + "MigrateSubtitleStorage triggered":"MigrateSubtitleStorage triggered", + "TriggerCacheMaintenance triggered":"TriggerCacheMaintenance triggered", + "This may take some time ...":"This may take some time ...", + "Download Logs":"Download Logs", + "Sorry, feature unavailable":"Sorry, feature unavailable", + "Universal Plex token not available":"Universal Plex token not available", + "Copy this link and open this in your browser, please":"Copy this link and open this in your browser, please", + "Cache invalidated":"Cache invalidated", + "Enter PIN number ":"Enter PIN number ", + "PIN correct":"PIN correct", + "Reset":"Reset", + "Menu locked":"Menu locked", + "Provider throttles reset":"Provider throttles reset", + "Plex didn't return any information about the item, please refresh it and come back later":"Plex didn't return any information about the item, please refresh it and come back later", + "Item not found: %s!":"Item not found: %s!", + "< Back to %s":"< Back to %s", + "Back to %s > %s":"Back to %s > %s", + "Refresh: %s":"Refresh: %s", + "Refreshes the %(current_kind)s, possibly searching for missing and picking up new subtitles on disk":"Refreshes the %(current_kind)s, possibly searching for missing and picking up new subtitles on disk", + "Force-find subtitles: %(item_title)s":"Force-find subtitles: %(item_title)s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones":"Issues a forced refresh, ignoring known subtitles and searching for new ones", + "File %(file_part_index)s: ":"File %(file_part_index)s: ", + "%(part_summary)sNo current subtitle in storage":"%(part_summary)sNo current subtitle in storage", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle":"%(part_summary)sManage %(language)s subtitle", + "%(part_summary)sList %(language)s subtitles":"%(part_summary)sList %(language)s subtitles", + "%(part_summary)sEmbedded subtitles (%(languages)s)":"%(part_summary)sEmbedded subtitles (%(languages)s)", + "Extract and activate embedded subtitle streams":"Extract and activate embedded subtitle streams", + "Select active %(language)s subtitle":"Select active %(language)s subtitle", + "%(count)d subtitles in storage":"%(count)d subtitles in storage", + "List available %(language)s subtitles":"List available %(language)s subtitles", + "Modify current %(language)s subtitle":"Modify current %(language)s subtitle", + "Currently applied mods: %(mod_list)s":"Currently applied mods: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one":"Blacklist current %(language)s subtitle and search for a new one", + "Manage blacklist (%(amount)s contained)":"Manage blacklist (%(amount)s contained)", + "Inspect currently blacklisted subtitles":"Inspect currently blacklisted subtitles", + "%(current_state)s%(subtitle_name)s, Score: %(score)s":"%(current_state)s%(subtitle_name)s, Score: %(score)s", + "Current: ":"Current: ", + "Stored: ":"Stored: ", + "Subtitle saved to disk":"Subtitle saved to disk", + "Remove subtitle from blacklist":"Remove subtitle from blacklist", + "by %(release_group)s":"by %(release_group)s", + "Current: %(provider_name)s (%(score)s) ":"Current: %(provider_name)s (%(score)s) ", + "Search for %(language)s subs (%(video_data)s)":"Search for %(language)s subs (%(video_data)s)", + "%(current_info)sFilename: %(filename)s":"%(current_info)sFilename: %(filename)s", + "No subtitles found":"No subtitles found", + "Searching for %(language)s subs (%(video_data)s), refresh here ...":"Searching for %(language)s subs (%(video_data)s), refresh here ...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)":" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)":" (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s":"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s":"Release: %(release_info)s, Matches: %(matches)s", + "Downloading subtitle for %(title_or_id)s":"Downloading subtitle for %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods", + " (unknown)":" (unknown)", + " (forced)":" (forced)", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "Extracting of embedded subtitle %s of part %s:%s triggered":"Extracting of embedded subtitle %s of part %s:%s triggered", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "Insufficient permissions":"Insufficient permissions", + "Insufficient permissions on library %(title)s, folder: %(path)s":"Insufficient permissions on library %(title)s, folder: %(path)s", + "I'm not enabled!":"I'm not enabled!", + "Please enable me for some of your libraries in your server settings; currently I do nothing":"Please enable me for some of your libraries in your server settings; currently I do nothing", + "Working ... refresh here":"Working ... refresh here", + "Current state: %s; Last state: %s":"Current state: %s; Last state: %s", + "On-deck items":"On-deck items", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles.":"Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles.", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", + "Recently-added items":"Recently-added items", + "Recently played items":"Recently played items", + "Shows the recently added items per section.":"Shows the recently added items per section.", + "Show recently added items with missing subtitles":"Show recently added items with missing subtitles", + "Lists items with missing subtitles. Click on Find recent items with missing subs to update list":"Lists items with missing subtitles. Click on Find recent items with missing subs to update list", + "Browse all items":"Browse all items", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.":"Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)":"Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Last run: %s; Next scheduled run: %s; Last runtime: %s":"Last run: %s; Next scheduled run: %s; Last runtime: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)":"Search for missing subtitles (in recently-added items, max-age: %s)", + "Automatically run periodically by the scheduler, if configured. %s":"Automatically run periodically by the scheduler, if configured. %s", + "Display ignore list (%(ignored_count)d)":"Display ignore list (%(ignored_count)d)", + "Show the current ignore list (mainly used for the automatic tasks)":"Show the current ignore list (mainly used for the automatic tasks)", + "History":"History", + "Show the last %i downloaded subtitles":"Show the last %i downloaded subtitles", + "Refresh":"Refresh", + "Re-lock menu(s)":"Re-lock menu(s)", + "Enabled the PIN again for menu(s)":"Enabled the PIN again for menu(s)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)":"%(throttled_provider)s until %(until_date)s (%(reason)s)", + "Throttled providers: %s":"Throttled providers: %s", + "Advanced functions":"Advanced functions", + "Use at your own risk":"Use at your own risk", + "Items On Deck":"Items On Deck", + "Recently Played":"Recently Played", + "Items with missing subtitles":"Items with missing subtitles", + "Find recent items with missing subtitles":"Find recent items with missing subtitles", + "Updating, refresh here ...":"Updating, refresh here ...", + "Missing: %s":"Missing: %s", + "%(add_or_remove)s %(kind)s %(title)s %(to_or_from)s the ignore list":"%(add_or_remove)s %(kind)s %(title)s %(to_or_from)s the ignore list", + "Add":"Add", + "Remove":"Remove", + "to":"to", + "from":"from", + "add":"add", + "remove":"remove", + "removed from":"removed from", + "added to":"added to", + "Didn't change the ignore list":"Didn't change the ignore list", + "%(title)s %(added_to_or_removed_from)s the ignore list":"%(title)s %(added_to_or_removed_from)s the ignore list", + "Sections":"Sections", + "All":"All", + "Un-Ignore":"Un-Ignore", + "Ignore":"Ignore", + "show":"show", + "movie":"movie", + "%(force_state)sRefreshing %(title)s":"%(force_state)sRefreshing %(title)s", + "Force-":"Force-", + "Extracting subtitle %(stream_index)s of %(filename)s":"Extracting subtitle %(stream_index)s of %(filename)s", + "<< Back to home":"<< Back to home", + "Extract missing %(language)s embedded subtitles":"Extract missing %(language)s embedded subtitles", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season ":"Extracts the not yet extracted embedded subtitles of all episodes for the current season ", + "with all configured default modifications":"with all configured default modifications", + "Extract and activate %(language)s embedded subtitles":"Extract and activate %(language)s embedded subtitles", + "Extracts embedded subtitles of all episodes for the current season ":"Extracts embedded subtitles of all episodes for the current season ", + "Auto-Find subtitles: %s":"Auto-Find subtitles: %s", + "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered", + "Triggering %(forced)sRefresh for %(title)s":"Triggering %(forced)sRefresh for %(title)s", + "%(refresh_or_forced_refresh)s of item %(item_id)s triggered":"%(refresh_or_forced_refresh)s of item %(item_id)s triggered", + "Forced-refresh":"Forced-refresh", + "< Back to subtitle options for: %s":"< Back to subtitle options for: %s", + "Remove last applied mod (%s)":"Remove last applied mod (%s)", + "none":"none", + "None":"None", + "Idle":"Idle", + "Manage applied mods":"Manage applied mods", + "Reapply applied mods":"Reapply applied mods", + "Restore original version":"Restore original version", + "< Back to subtitle modification menu":"< Back to subtitle modification menu", + "subs constantly getting faster":"subs constantly getting faster", + "subs constantly getting slower":"subs constantly getting slower", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)":"%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "< Back to subtitle modifications":"< Back to subtitle modifications", + "Adjust by %(time_and_unit)s":"Adjust by %(time_and_unit)s", + "< Back to unit selection":"< Back to unit selection", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "Remove: %(mod_name)s":"Remove: %(mod_name)s", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Subtitle download failed (%(item_id)s)", + "Subtitle Language (1)":"Subtitle Language (1)", + "Subtitle Language (2)":"Subtitle Language (2)", + "Subtitle Language (3)":"Subtitle Language (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)":"Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)", + "Only download foreign/forced subtitles":"Only download foreign/forced subtitles", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)":"Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)":"Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")":"Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1":"Embedded subtitles: Treat \"Undefined\" (und) as language 1", + "I rename my files using":"I rename my files using", + "Retrieve original filename from .file_info/file_info index files (see wiki)":"Retrieve original filename from .file_info/file_info index files (see wiki)", + "Sonarr URL (add URL base if configured)":"Sonarr URL (add URL base if configured)", + "Sonarr API key":"Sonarr API key", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)":"Radarr URL (add URL base if configured, min. version: 0.2.0.897)", + "Radarr API key":"Radarr API key", + "Provider: Enable OpenSubtitles":"Provider: Enable OpenSubtitles", + "Opensubtitles Username":"Opensubtitles Username", + "Opensubtitles Password":"Opensubtitles Password", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)":"OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET":"Provider: Enable Podnapisi.NET", + "Provider: Enable Titlovi.com":"Provider: Enable Titlovi.com", + "Provider: Enable Addic7ed":"Provider: Enable Addic7ed", + "Addic7ed Username":"Addic7ed Username", + "Addic7ed Password":"Addic7ed Password", + "Addic7ed: boost score (if requirements met)":"Addic7ed: boost score (if requirements met)", + "Addic7ed: Use random user agents":"Addic7ed: Use random user agents", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)":"Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", + "Legendas TV Username":"Legendas TV Username", + "Legendas TV Password":"Legendas TV Password", + "Provider: Enable TVsubtitles.net":"Provider: Enable TVsubtitles.net", + "Provider: Enable NapiProjekt.pl (Polish)":"Provider: Enable NapiProjekt.pl (Polish)", + "Provider: Enable SubScene (TV shows)":"Provider: Enable SubScene (TV shows)", + "Provider: Enable hosszupuskasub.com (Hungarian)":"Provider: Enable hosszupuskasub.com (Hungarian)", + "Provider: Enable aRGENTeaM (Spanish)":"Provider: Enable aRGENTeaM (Spanish)", + "Search enabled providers simultaneously (multithreading)":"Search enabled providers simultaneously (multithreading)", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)":"Automatically extract and use embedded subtitles upon media addition (with configured default mods)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?":"After automatic extraction of embedded subtitles, also immediately search for available subtitles?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?":"Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?":"Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?", + "How strict should these subtitles existing on the filesystem be detected?":"How strict should these subtitles existing on the filesystem be detected?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?":"Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)":"Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)":"Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)", + "Download hearing impaired subtitles.":"Download hearing impaired subtitles.", + "Remove Hearing Impaired tags from downloaded subtitles":"Remove Hearing Impaired tags from downloaded subtitles", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)":"Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)", + "Fix common issues in subtitles":"Fix common issues in subtitles", + "Fix common OCR errors in downloaded subtitles":"Fix common OCR errors in downloaded subtitles", + "Reverse punctuation in RTL languages (heb)":"Reverse punctuation in RTL languages (heb)", + "Change colors of subtitles to":"Change colors of subtitles to", + "Store subtitles next to media files (instead of metadata)":"Store subtitles next to media files (instead of metadata)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)":"Subtitle formats to save (non-SRT only works if the previous option is enabled)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)":"Subtitle Folder (\"current folder\" is the folder the current media file lives in)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)":"Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)", + "Fall back to metadata storage if filesystem storage failed":"Fall back to metadata storage if filesystem storage failed", + "Set subtitle file permissions to (integer, e.g.: 0775)":"Set subtitle file permissions to (integer, e.g.: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles":"Automatically delete leftover/unused (externally saved) subtitles", + "On media playback: search for missing subtitles (refresh item)":"On media playback: search for missing subtitles (refresh item)", + "Scheduler: Periodically search for recent items with missing subtitles":"Scheduler: Periodically search for recent items with missing subtitles", + "Scheduler: Item age to be considered recent":"Scheduler: Item age to be considered recent", + "Scheduler: Recent items to consider per library":"Scheduler: Recent items to consider per library", + "Scheduler: Periodically search for better subtitles":"Scheduler: Periodically search for better subtitles", + "Scheduler: Days to search for better subtitles (max: 30 days)":"Scheduler: Days to search for better subtitles (max: 30 days)", + "Scheduler: Don't search for better subtitles if the item's air date is older than":"Scheduler: Don't search for better subtitles if the item's air date is older than", + "Scheduler: Overwrite manually selected subtitles when better found":"Scheduler: Overwrite manually selected subtitles when better found", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found":"Scheduler: Overwrite subtitles with non-default subtitle modifications when better found", + "History: amount of items to store historical data for":"History: amount of items to store historical data for", + "How many download tries per subtitle (on timeout or error)":"How many download tries per subtitle (on timeout or error)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)":"Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)", + "Ignore anything in the following paths (comma-separated)":"Ignore anything in the following paths (comma-separated)", + "Sub-Zero mode":"Sub-Zero mode", + "Access PIN (any amount of numbers, 0-9)":"Access PIN (any amount of numbers, 0-9)", + "Access PIN valid for minutes":"Access PIN valid for minutes", + "Use PIN to restrict access to (needs plugin or PMS restart)":"Use PIN to restrict access to (needs plugin or PMS restart)", + "Call this executable upon successful subtitle download (see Wiki for details)":"Call this executable upon successful subtitle download (see Wiki for details)", + "Check for correct folder permissions of every library on plugin start":"Check for correct folder permissions of every library on plugin start", + "Use new style caching (for subliminal)":"Use new style caching (for subliminal)", + "Low impact mode (for remote filesystems)":"Low impact mode (for remote filesystems)", + "Timeout for API requests sent to the PMS":"Timeout for API requests sent to the PMS", + "HTTP proxy to use for providers (supports credentials)":"HTTP proxy to use for providers (supports credentials)", + "How verbose should the logging be?":"How verbose should the logging be?", + "How many log backups to keep?":"How many log backups to keep?", + "Log subtitle modification (debug)":"Log subtitle modification (debug)", + "Log to console (for development/debugging)":"Log to console (for development/debugging)", + "Collect anonymous usage statistics":"Collect anonymous usage statistics", + "Sonarr/Radarr (fill api info below)":"Sonarr/Radarr (fill api info below)", + "Filebot":"Filebot", + "Sonarr/Radarr/Filebot":"Sonarr/Radarr/Filebot", + "Symlink to original file":"Symlink to original file", + "I keep the original filenames":"I keep the original filenames", + "none of the above":"none of the above", + "exact: media filename match":"exact: media filename match", + "loose: filename contains media filename":"loose: filename contains media filename", + "any":"any", + "prefer":"prefer", + "don't prefer":"don't prefer", + "force HI":"force HI", + "force non-HI":"force non-HI", + "don't change":"don't change", + "white":"white", + "light-grey":"light-grey", + "red":"red", + "green":"green", + "yellow":"yellow", + "blue":"blue", + "magenta":"magenta", + "cyan":"cyan", + "black":"black", + "dark-red":"dark-red", + "dark-green":"dark-green", + "dark-yellow":"dark-yellow", + "dark-blue":"dark-blue", + "dark-magenta":"dark-magenta", + "dark-cyan":"dark-cyan", + "dark-grey":"dark-grey", + "current folder":"current folder", + "never":"never", + "current media item":"current media item", + "next episode (series)":"next episode (series)", + "hybrid: current item or next episode":"hybrid: current item or next episode", + "hybrid-plus: current item and next episode":"hybrid-plus: current item and next episode", + "every 6 hours":"every 6 hours", + "every 12 hours":"every 12 hours", + "every 24 hours":"every 24 hours", + "1 days":"1 days", + "2 days":"2 days", + "3 days":"3 days", + "4 days":"4 days", + "1 weeks":"1 weeks", + "2 weeks":"2 weeks", + "3 weeks":"3 weeks", + "4 weeks":"4 weeks", + "5 weeks":"5 weeks", + "6 weeks":"6 weeks", + "12 weeks":"12 weeks", + "don't limit":"don't limit", + "1 year":"1 year", + "2 years":"2 years", + "3 years":"3 years", + "4 years":"4 years", + "5 years":"5 years", + "6 years":"6 years", + "7 years":"7 years", + "8 years":"8 years", + "9 years":"9 years", + "10 years":"10 years", + "agent + channel":"agent + channel", + "only agent":"only agent", + "only channel":"only channel", + "disabled":"disabled", + "channel menu":"channel menu", + "advanced menu":"advanced menu", + "CRITICAL":"CRITICAL", + "ERROR":"ERROR", + "WARNING":"WARNING", + "INFO":"INFO", + "DEBUG":"DEBUG" +} From c08e63ab80fa5673d0502dbbdc1a47e065288983 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 3 Apr 2018 23:56:26 +0200 Subject: [PATCH 028/710] i18n: add non-blank de.json with languages translated; add base_template.json --- Contents/Strings/base_template.json | 49 ++++ Contents/Strings/de.json | 430 ++++------------------------ 2 files changed, 97 insertions(+), 382 deletions(-) create mode 100644 Contents/Strings/base_template.json diff --git a/Contents/Strings/base_template.json b/Contents/Strings/base_template.json new file mode 100644 index 000000000..774182b68 --- /dev/null +++ b/Contents/Strings/base_template.json @@ -0,0 +1,49 @@ +{ + "sq": "Albanian", + "ar": "Arabic", + "be": "Belarusian", + "bs": "Bosnian", + "bg": "Bulgarian", + "ca": "Catalan", + "zh": "Chinese", + "hr": "Croatian", + "cs": "Czech", + "da": "Danish", + "nl": "Dutch", + "en": "English", + "et": "Estonian", + "fa": "Persian (Farsi)", + "fi": "Finnish", + "fr": "French", + "de": "German", + "el": "Greek", + "he": "Hebrew", + "hi": "Hindi", + "hu": "Hungarian", + "is": "Icelandic", + "id": "Indonesian", + "it": "Italian", + "ja": "Japanese", + "ko": "Korean", + "lv": "Latvian", + "lt": "Lithuanian", + "mk": "Macedonian", + "ms": "Malay", + "no": "Norwegian", + "pl": "Polish", + "pt": "Portuguese", + "pt-br": "Portuguese (Brasil)", + "ro": "Romanian", + "ru": "Russian", + "sr": "Serbian", + "sr-cyrl": "Serbian (Cyrillic)", + "sr-latn": "Serbian (Latin)", + "sk": "Slovak", + "sl": "Slovenian", + "es": "Spanish", + "sv": "Swedish", + "th": "Thai", + "tr": "Turkish", + "uk": "Ukranian", + "vi": "Vietnamese" +} \ No newline at end of file diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 1524cc0f4..774182b68 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -1,383 +1,49 @@ { - "sq":"Albanian", - "ar":"Arabic", - "be":"Belarusian", - "bs":"Bosnian", - "bg":"Bulgarian", - "ca":"Catalan", - "zh":"Chinese", - "hr":"Croatian", - "cs":"Czech", - "da":"Danish", - "nl":"Dutch", - "en":"English", - "et":"Estonian", - "fa":"Persian (Farsi)", - "fi":"Finnish", - "fr":"French", - "de":"German", - "el":"Greek", - "he":"Hebrew", - "hi":"Hindi", - "hu":"Hungarian", - "is":"Icelandic", - "id":"Indonesian", - "it":"Italian", - "ja":"Japanese", - "ko":"Korean", - "lv":"Latvian", - "lt":"Lithuanian", - "mk":"Macedonian", - "ms":"Malay", - "no":"Norwegian", - "pl":"Polish", - "pt":"Portuguese", - "pt-br":"Portuguese (Brasil)", - "ro":"Romanian", - "ru":"Russian", - "sr":"Serbian", - "sr-cyrl":"Serbian (Cyrillic)", - "sr-latn":"Serbian (Latin)", - "sk":"Slovak", - "sl":"Slovenian", - "es":"Spanish", - "sv":"Swedish", - "th":"Thai", - "tr":"Turkish", - "uk":"Ukranian", - "vi":"Vietnamese", - "Internal stuff, pay attention!":"Internal stuff, pay attention!", - "Advanced":"Advanced", - "advanced":"advanced", - "Enter PIN":"Enter PIN", - "The owner has restricted the access to this menu. Please enter the correct pin":"The owner has restricted the access to this menu. Please enter the correct pin", - "Restart the plugin":"Restart the plugin", - "Get my logs (copy the appearing link and open it in your browser, please)":"Get my logs (copy the appearing link and open it in your browser, please)", - "Copy the appearing link and open it in your browser, please":"Copy the appearing link and open it in your browser, please", - "Trigger find better subtitles":"Trigger find better subtitles", - "Skip next find better subtitles (sets last run to now)":"Skip next find better subtitles (sets last run to now)", - "Trigger subtitle storage maintenance":"Trigger subtitle storage maintenance", - "Trigger subtitle storage migration (expensive)":"Trigger subtitle storage migration (expensive)", - "Trigger cache maintenance (refiners, providers and packs/archives)":"Trigger cache maintenance (refiners, providers and packs/archives)", - "Apply configured default subtitle mods to all (active) stored subtitles":"Apply configured default subtitle mods to all (active) stored subtitles", - "Re-Apply mods of all stored subtitles":"Re-Apply mods of all stored subtitles", - "Log the plugin's scheduled tasks state storage":"Log the plugin's scheduled tasks state storage", - "Log the plugin's internal ignorelist storage":"Log the plugin's internal ignorelist storage", - "Log the plugin's complete state storage":"Log the plugin's complete state storage", - "Reset the plugin's scheduled tasks state storage":"Reset the plugin's scheduled tasks state storage", - "Reset the plugin's internal ignorelist storage":"Reset the plugin's internal ignorelist storage", - "Invalidate Sub-Zero metadata caches (subliminal)":"Invalidate Sub-Zero metadata caches (subliminal)", - "Reset provider throttle states":"Reset provider throttle states", - "Restarting the plugin":"Restarting the plugin", - "Restart triggered, please wait about 5 seconds":"Restart triggered, please wait about 5 seconds", - "Reset subtitle storage":"Reset subtitle storage", - "Are you sure?":"Are you sure?", - "Are you really sure?":"Are you really sure?", - "Success":"Success", - "Information Storage (%s) reset":"Information Storage (%s) reset", - "Information Storage (%s) logged":"Information Storage (%s) logged", - "FindBetterSubtitles triggered":"FindBetterSubtitles triggered", - "FindBetterSubtitles skipped":"FindBetterSubtitles skipped", - "SubtitleStorageMaintenance triggered":"SubtitleStorageMaintenance triggered", - "MigrateSubtitleStorage triggered":"MigrateSubtitleStorage triggered", - "TriggerCacheMaintenance triggered":"TriggerCacheMaintenance triggered", - "This may take some time ...":"This may take some time ...", - "Download Logs":"Download Logs", - "Sorry, feature unavailable":"Sorry, feature unavailable", - "Universal Plex token not available":"Universal Plex token not available", - "Copy this link and open this in your browser, please":"Copy this link and open this in your browser, please", - "Cache invalidated":"Cache invalidated", - "Enter PIN number ":"Enter PIN number ", - "PIN correct":"PIN correct", - "Reset":"Reset", - "Menu locked":"Menu locked", - "Provider throttles reset":"Provider throttles reset", - "Plex didn't return any information about the item, please refresh it and come back later":"Plex didn't return any information about the item, please refresh it and come back later", - "Item not found: %s!":"Item not found: %s!", - "< Back to %s":"< Back to %s", - "Back to %s > %s":"Back to %s > %s", - "Refresh: %s":"Refresh: %s", - "Refreshes the %(current_kind)s, possibly searching for missing and picking up new subtitles on disk":"Refreshes the %(current_kind)s, possibly searching for missing and picking up new subtitles on disk", - "Force-find subtitles: %(item_title)s":"Force-find subtitles: %(item_title)s", - "Issues a forced refresh, ignoring known subtitles and searching for new ones":"Issues a forced refresh, ignoring known subtitles and searching for new ones", - "File %(file_part_index)s: ":"File %(file_part_index)s: ", - "%(part_summary)sNo current subtitle in storage":"%(part_summary)sNo current subtitle in storage", - "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "%(part_summary)sManage %(language)s subtitle":"%(part_summary)sManage %(language)s subtitle", - "%(part_summary)sList %(language)s subtitles":"%(part_summary)sList %(language)s subtitles", - "%(part_summary)sEmbedded subtitles (%(languages)s)":"%(part_summary)sEmbedded subtitles (%(languages)s)", - "Extract and activate embedded subtitle streams":"Extract and activate embedded subtitle streams", - "Select active %(language)s subtitle":"Select active %(language)s subtitle", - "%(count)d subtitles in storage":"%(count)d subtitles in storage", - "List available %(language)s subtitles":"List available %(language)s subtitles", - "Modify current %(language)s subtitle":"Modify current %(language)s subtitle", - "Currently applied mods: %(mod_list)s":"Currently applied mods: %(mod_list)s", - "Blacklist current %(language)s subtitle and search for a new one":"Blacklist current %(language)s subtitle and search for a new one", - "Manage blacklist (%(amount)s contained)":"Manage blacklist (%(amount)s contained)", - "Inspect currently blacklisted subtitles":"Inspect currently blacklisted subtitles", - "%(current_state)s%(subtitle_name)s, Score: %(score)s":"%(current_state)s%(subtitle_name)s, Score: %(score)s", - "Current: ":"Current: ", - "Stored: ":"Stored: ", - "Subtitle saved to disk":"Subtitle saved to disk", - "Remove subtitle from blacklist":"Remove subtitle from blacklist", - "by %(release_group)s":"by %(release_group)s", - "Current: %(provider_name)s (%(score)s) ":"Current: %(provider_name)s (%(score)s) ", - "Search for %(language)s subs (%(video_data)s)":"Search for %(language)s subs (%(video_data)s)", - "%(current_info)sFilename: %(filename)s":"%(current_info)sFilename: %(filename)s", - "No subtitles found":"No subtitles found", - "Searching for %(language)s subs (%(video_data)s), refresh here ...":"Searching for %(language)s subs (%(video_data)s), refresh here ...", - " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)":" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", - " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)":" (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", - "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s":"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", - "Release: %(release_info)s, Matches: %(matches)s":"Release: %(release_info)s, Matches: %(matches)s", - "Downloading subtitle for %(title_or_id)s":"Downloading subtitle for %(title_or_id)s", - "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods", - " (unknown)":" (unknown)", - " (forced)":" (forced)", - "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", - "Extracting of embedded subtitle %s of part %s:%s triggered":"Extracting of embedded subtitle %s of part %s:%s triggered", - "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "Insufficient permissions":"Insufficient permissions", - "Insufficient permissions on library %(title)s, folder: %(path)s":"Insufficient permissions on library %(title)s, folder: %(path)s", - "I'm not enabled!":"I'm not enabled!", - "Please enable me for some of your libraries in your server settings; currently I do nothing":"Please enable me for some of your libraries in your server settings; currently I do nothing", - "Working ... refresh here":"Working ... refresh here", - "Current state: %s; Last state: %s":"Current state: %s; Last state: %s", - "On-deck items":"On-deck items", - "Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles.":"Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles.", - "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", - "Recently-added items":"Recently-added items", - "Recently played items":"Recently played items", - "Shows the recently added items per section.":"Shows the recently added items per section.", - "Show recently added items with missing subtitles":"Show recently added items with missing subtitles", - "Lists items with missing subtitles. Click on Find recent items with missing subs to update list":"Lists items with missing subtitles. Click on Find recent items with missing subs to update list", - "Browse all items":"Browse all items", - "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.":"Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.", - "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)":"Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", - "Last run: %s; Next scheduled run: %s; Last runtime: %s":"Last run: %s; Next scheduled run: %s; Last runtime: %s", - "Search for missing subtitles (in recently-added items, max-age: %s)":"Search for missing subtitles (in recently-added items, max-age: %s)", - "Automatically run periodically by the scheduler, if configured. %s":"Automatically run periodically by the scheduler, if configured. %s", - "Display ignore list (%(ignored_count)d)":"Display ignore list (%(ignored_count)d)", - "Show the current ignore list (mainly used for the automatic tasks)":"Show the current ignore list (mainly used for the automatic tasks)", - "History":"History", - "Show the last %i downloaded subtitles":"Show the last %i downloaded subtitles", - "Refresh":"Refresh", - "Re-lock menu(s)":"Re-lock menu(s)", - "Enabled the PIN again for menu(s)":"Enabled the PIN again for menu(s)", - "%(throttled_provider)s until %(until_date)s (%(reason)s)":"%(throttled_provider)s until %(until_date)s (%(reason)s)", - "Throttled providers: %s":"Throttled providers: %s", - "Advanced functions":"Advanced functions", - "Use at your own risk":"Use at your own risk", - "Items On Deck":"Items On Deck", - "Recently Played":"Recently Played", - "Items with missing subtitles":"Items with missing subtitles", - "Find recent items with missing subtitles":"Find recent items with missing subtitles", - "Updating, refresh here ...":"Updating, refresh here ...", - "Missing: %s":"Missing: %s", - "%(add_or_remove)s %(kind)s %(title)s %(to_or_from)s the ignore list":"%(add_or_remove)s %(kind)s %(title)s %(to_or_from)s the ignore list", - "Add":"Add", - "Remove":"Remove", - "to":"to", - "from":"from", - "add":"add", - "remove":"remove", - "removed from":"removed from", - "added to":"added to", - "Didn't change the ignore list":"Didn't change the ignore list", - "%(title)s %(added_to_or_removed_from)s the ignore list":"%(title)s %(added_to_or_removed_from)s the ignore list", - "Sections":"Sections", - "All":"All", - "Un-Ignore":"Un-Ignore", - "Ignore":"Ignore", - "show":"show", - "movie":"movie", - "%(force_state)sRefreshing %(title)s":"%(force_state)sRefreshing %(title)s", - "Force-":"Force-", - "Extracting subtitle %(stream_index)s of %(filename)s":"Extracting subtitle %(stream_index)s of %(filename)s", - "<< Back to home":"<< Back to home", - "Extract missing %(language)s embedded subtitles":"Extract missing %(language)s embedded subtitles", - "Extracts the not yet extracted embedded subtitles of all episodes for the current season ":"Extracts the not yet extracted embedded subtitles of all episodes for the current season ", - "with all configured default modifications":"with all configured default modifications", - "Extract and activate %(language)s embedded subtitles":"Extract and activate %(language)s embedded subtitles", - "Extracts embedded subtitles of all episodes for the current season ":"Extracts embedded subtitles of all episodes for the current season ", - "Auto-Find subtitles: %s":"Auto-Find subtitles: %s", - "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered", - "Triggering %(forced)sRefresh for %(title)s":"Triggering %(forced)sRefresh for %(title)s", - "%(refresh_or_forced_refresh)s of item %(item_id)s triggered":"%(refresh_or_forced_refresh)s of item %(item_id)s triggered", - "Forced-refresh":"Forced-refresh", - "< Back to subtitle options for: %s":"< Back to subtitle options for: %s", - "Remove last applied mod (%s)":"Remove last applied mod (%s)", - "none":"none", - "None":"None", - "Idle":"Idle", - "Manage applied mods":"Manage applied mods", - "Reapply applied mods":"Reapply applied mods", - "Restore original version":"Restore original version", - "< Back to subtitle modification menu":"< Back to subtitle modification menu", - "subs constantly getting faster":"subs constantly getting faster", - "subs constantly getting slower":"subs constantly getting slower", - "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)":"%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", - "< Back to subtitle modifications":"< Back to subtitle modifications", - "Adjust by %(time_and_unit)s":"Adjust by %(time_and_unit)s", - "< Back to unit selection":"< Back to unit selection", - "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "Remove: %(mod_name)s":"Remove: %(mod_name)s", - "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Subtitle download failed (%(item_id)s)", - "Subtitle Language (1)":"Subtitle Language (1)", - "Subtitle Language (2)":"Subtitle Language (2)", - "Subtitle Language (3)":"Subtitle Language (3)", - "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)":"Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)", - "Only download foreign/forced subtitles":"Only download foreign/forced subtitles", - "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)":"Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", - "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)":"Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)", - "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")":"Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")", - "Embedded subtitles: Treat \"Undefined\" (und) as language 1":"Embedded subtitles: Treat \"Undefined\" (und) as language 1", - "I rename my files using":"I rename my files using", - "Retrieve original filename from .file_info/file_info index files (see wiki)":"Retrieve original filename from .file_info/file_info index files (see wiki)", - "Sonarr URL (add URL base if configured)":"Sonarr URL (add URL base if configured)", - "Sonarr API key":"Sonarr API key", - "Radarr URL (add URL base if configured, min. version: 0.2.0.897)":"Radarr URL (add URL base if configured, min. version: 0.2.0.897)", - "Radarr API key":"Radarr API key", - "Provider: Enable OpenSubtitles":"Provider: Enable OpenSubtitles", - "Opensubtitles Username":"Opensubtitles Username", - "Opensubtitles Password":"Opensubtitles Password", - "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)":"OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)", - "Provider: Enable Podnapisi.NET":"Provider: Enable Podnapisi.NET", - "Provider: Enable Titlovi.com":"Provider: Enable Titlovi.com", - "Provider: Enable Addic7ed":"Provider: Enable Addic7ed", - "Addic7ed Username":"Addic7ed Username", - "Addic7ed Password":"Addic7ed Password", - "Addic7ed: boost score (if requirements met)":"Addic7ed: boost score (if requirements met)", - "Addic7ed: Use random user agents":"Addic7ed: Use random user agents", - "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)":"Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", - "Legendas TV Username":"Legendas TV Username", - "Legendas TV Password":"Legendas TV Password", - "Provider: Enable TVsubtitles.net":"Provider: Enable TVsubtitles.net", - "Provider: Enable NapiProjekt.pl (Polish)":"Provider: Enable NapiProjekt.pl (Polish)", - "Provider: Enable SubScene (TV shows)":"Provider: Enable SubScene (TV shows)", - "Provider: Enable hosszupuskasub.com (Hungarian)":"Provider: Enable hosszupuskasub.com (Hungarian)", - "Provider: Enable aRGENTeaM (Spanish)":"Provider: Enable aRGENTeaM (Spanish)", - "Search enabled providers simultaneously (multithreading)":"Search enabled providers simultaneously (multithreading)", - "Automatically extract and use embedded subtitles upon media addition (with configured default mods)":"Automatically extract and use embedded subtitles upon media addition (with configured default mods)", - "After automatic extraction of embedded subtitles, also immediately search for available subtitles?":"After automatic extraction of embedded subtitles, also immediately search for available subtitles?", - "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?":"Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?", - "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?":"Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?", - "How strict should these subtitles existing on the filesystem be detected?":"How strict should these subtitles existing on the filesystem be detected?", - "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?":"Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?", - "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)":"Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)", - "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)":"Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)", - "Download hearing impaired subtitles.":"Download hearing impaired subtitles.", - "Remove Hearing Impaired tags from downloaded subtitles":"Remove Hearing Impaired tags from downloaded subtitles", - "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)":"Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)", - "Fix common issues in subtitles":"Fix common issues in subtitles", - "Fix common OCR errors in downloaded subtitles":"Fix common OCR errors in downloaded subtitles", - "Reverse punctuation in RTL languages (heb)":"Reverse punctuation in RTL languages (heb)", - "Change colors of subtitles to":"Change colors of subtitles to", - "Store subtitles next to media files (instead of metadata)":"Store subtitles next to media files (instead of metadata)", - "Subtitle formats to save (non-SRT only works if the previous option is enabled)":"Subtitle formats to save (non-SRT only works if the previous option is enabled)", - "Subtitle Folder (\"current folder\" is the folder the current media file lives in)":"Subtitle Folder (\"current folder\" is the folder the current media file lives in)", - "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)":"Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)", - "Fall back to metadata storage if filesystem storage failed":"Fall back to metadata storage if filesystem storage failed", - "Set subtitle file permissions to (integer, e.g.: 0775)":"Set subtitle file permissions to (integer, e.g.: 0775)", - "Automatically delete leftover/unused (externally saved) subtitles":"Automatically delete leftover/unused (externally saved) subtitles", - "On media playback: search for missing subtitles (refresh item)":"On media playback: search for missing subtitles (refresh item)", - "Scheduler: Periodically search for recent items with missing subtitles":"Scheduler: Periodically search for recent items with missing subtitles", - "Scheduler: Item age to be considered recent":"Scheduler: Item age to be considered recent", - "Scheduler: Recent items to consider per library":"Scheduler: Recent items to consider per library", - "Scheduler: Periodically search for better subtitles":"Scheduler: Periodically search for better subtitles", - "Scheduler: Days to search for better subtitles (max: 30 days)":"Scheduler: Days to search for better subtitles (max: 30 days)", - "Scheduler: Don't search for better subtitles if the item's air date is older than":"Scheduler: Don't search for better subtitles if the item's air date is older than", - "Scheduler: Overwrite manually selected subtitles when better found":"Scheduler: Overwrite manually selected subtitles when better found", - "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found":"Scheduler: Overwrite subtitles with non-default subtitle modifications when better found", - "History: amount of items to store historical data for":"History: amount of items to store historical data for", - "How many download tries per subtitle (on timeout or error)":"How many download tries per subtitle (on timeout or error)", - "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)":"Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)", - "Ignore anything in the following paths (comma-separated)":"Ignore anything in the following paths (comma-separated)", - "Sub-Zero mode":"Sub-Zero mode", - "Access PIN (any amount of numbers, 0-9)":"Access PIN (any amount of numbers, 0-9)", - "Access PIN valid for minutes":"Access PIN valid for minutes", - "Use PIN to restrict access to (needs plugin or PMS restart)":"Use PIN to restrict access to (needs plugin or PMS restart)", - "Call this executable upon successful subtitle download (see Wiki for details)":"Call this executable upon successful subtitle download (see Wiki for details)", - "Check for correct folder permissions of every library on plugin start":"Check for correct folder permissions of every library on plugin start", - "Use new style caching (for subliminal)":"Use new style caching (for subliminal)", - "Low impact mode (for remote filesystems)":"Low impact mode (for remote filesystems)", - "Timeout for API requests sent to the PMS":"Timeout for API requests sent to the PMS", - "HTTP proxy to use for providers (supports credentials)":"HTTP proxy to use for providers (supports credentials)", - "How verbose should the logging be?":"How verbose should the logging be?", - "How many log backups to keep?":"How many log backups to keep?", - "Log subtitle modification (debug)":"Log subtitle modification (debug)", - "Log to console (for development/debugging)":"Log to console (for development/debugging)", - "Collect anonymous usage statistics":"Collect anonymous usage statistics", - "Sonarr/Radarr (fill api info below)":"Sonarr/Radarr (fill api info below)", - "Filebot":"Filebot", - "Sonarr/Radarr/Filebot":"Sonarr/Radarr/Filebot", - "Symlink to original file":"Symlink to original file", - "I keep the original filenames":"I keep the original filenames", - "none of the above":"none of the above", - "exact: media filename match":"exact: media filename match", - "loose: filename contains media filename":"loose: filename contains media filename", - "any":"any", - "prefer":"prefer", - "don't prefer":"don't prefer", - "force HI":"force HI", - "force non-HI":"force non-HI", - "don't change":"don't change", - "white":"white", - "light-grey":"light-grey", - "red":"red", - "green":"green", - "yellow":"yellow", - "blue":"blue", - "magenta":"magenta", - "cyan":"cyan", - "black":"black", - "dark-red":"dark-red", - "dark-green":"dark-green", - "dark-yellow":"dark-yellow", - "dark-blue":"dark-blue", - "dark-magenta":"dark-magenta", - "dark-cyan":"dark-cyan", - "dark-grey":"dark-grey", - "current folder":"current folder", - "never":"never", - "current media item":"current media item", - "next episode (series)":"next episode (series)", - "hybrid: current item or next episode":"hybrid: current item or next episode", - "hybrid-plus: current item and next episode":"hybrid-plus: current item and next episode", - "every 6 hours":"every 6 hours", - "every 12 hours":"every 12 hours", - "every 24 hours":"every 24 hours", - "1 days":"1 days", - "2 days":"2 days", - "3 days":"3 days", - "4 days":"4 days", - "1 weeks":"1 weeks", - "2 weeks":"2 weeks", - "3 weeks":"3 weeks", - "4 weeks":"4 weeks", - "5 weeks":"5 weeks", - "6 weeks":"6 weeks", - "12 weeks":"12 weeks", - "don't limit":"don't limit", - "1 year":"1 year", - "2 years":"2 years", - "3 years":"3 years", - "4 years":"4 years", - "5 years":"5 years", - "6 years":"6 years", - "7 years":"7 years", - "8 years":"8 years", - "9 years":"9 years", - "10 years":"10 years", - "agent + channel":"agent + channel", - "only agent":"only agent", - "only channel":"only channel", - "disabled":"disabled", - "channel menu":"channel menu", - "advanced menu":"advanced menu", - "CRITICAL":"CRITICAL", - "ERROR":"ERROR", - "WARNING":"WARNING", - "INFO":"INFO", - "DEBUG":"DEBUG" -} + "sq": "Albanian", + "ar": "Arabic", + "be": "Belarusian", + "bs": "Bosnian", + "bg": "Bulgarian", + "ca": "Catalan", + "zh": "Chinese", + "hr": "Croatian", + "cs": "Czech", + "da": "Danish", + "nl": "Dutch", + "en": "English", + "et": "Estonian", + "fa": "Persian (Farsi)", + "fi": "Finnish", + "fr": "French", + "de": "German", + "el": "Greek", + "he": "Hebrew", + "hi": "Hindi", + "hu": "Hungarian", + "is": "Icelandic", + "id": "Indonesian", + "it": "Italian", + "ja": "Japanese", + "ko": "Korean", + "lv": "Latvian", + "lt": "Lithuanian", + "mk": "Macedonian", + "ms": "Malay", + "no": "Norwegian", + "pl": "Polish", + "pt": "Portuguese", + "pt-br": "Portuguese (Brasil)", + "ro": "Romanian", + "ru": "Russian", + "sr": "Serbian", + "sr-cyrl": "Serbian (Cyrillic)", + "sr-latn": "Serbian (Latin)", + "sk": "Slovak", + "sl": "Slovenian", + "es": "Spanish", + "sv": "Swedish", + "th": "Thai", + "tr": "Turkish", + "uk": "Ukranian", + "vi": "Vietnamese" +} \ No newline at end of file From 4206edfb13076f3325bca95817b2a7166e38ca95 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 4 Apr 2018 00:00:30 +0200 Subject: [PATCH 029/710] i18n: revert last commit; add blank de/da --- Contents/Strings/base_template.json | 49 ----------------------------- Contents/Strings/da.json | 3 ++ Contents/Strings/de.json | 48 +--------------------------- 3 files changed, 4 insertions(+), 96 deletions(-) delete mode 100644 Contents/Strings/base_template.json create mode 100644 Contents/Strings/da.json diff --git a/Contents/Strings/base_template.json b/Contents/Strings/base_template.json deleted file mode 100644 index 774182b68..000000000 --- a/Contents/Strings/base_template.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "sq": "Albanian", - "ar": "Arabic", - "be": "Belarusian", - "bs": "Bosnian", - "bg": "Bulgarian", - "ca": "Catalan", - "zh": "Chinese", - "hr": "Croatian", - "cs": "Czech", - "da": "Danish", - "nl": "Dutch", - "en": "English", - "et": "Estonian", - "fa": "Persian (Farsi)", - "fi": "Finnish", - "fr": "French", - "de": "German", - "el": "Greek", - "he": "Hebrew", - "hi": "Hindi", - "hu": "Hungarian", - "is": "Icelandic", - "id": "Indonesian", - "it": "Italian", - "ja": "Japanese", - "ko": "Korean", - "lv": "Latvian", - "lt": "Lithuanian", - "mk": "Macedonian", - "ms": "Malay", - "no": "Norwegian", - "pl": "Polish", - "pt": "Portuguese", - "pt-br": "Portuguese (Brasil)", - "ro": "Romanian", - "ru": "Russian", - "sr": "Serbian", - "sr-cyrl": "Serbian (Cyrillic)", - "sr-latn": "Serbian (Latin)", - "sk": "Slovak", - "sl": "Slovenian", - "es": "Spanish", - "sv": "Swedish", - "th": "Thai", - "tr": "Turkish", - "uk": "Ukranian", - "vi": "Vietnamese" -} \ No newline at end of file diff --git a/Contents/Strings/da.json b/Contents/Strings/da.json new file mode 100644 index 000000000..0e0dcd235 --- /dev/null +++ b/Contents/Strings/da.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 774182b68..0e0dcd235 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -1,49 +1,3 @@ { - "sq": "Albanian", - "ar": "Arabic", - "be": "Belarusian", - "bs": "Bosnian", - "bg": "Bulgarian", - "ca": "Catalan", - "zh": "Chinese", - "hr": "Croatian", - "cs": "Czech", - "da": "Danish", - "nl": "Dutch", - "en": "English", - "et": "Estonian", - "fa": "Persian (Farsi)", - "fi": "Finnish", - "fr": "French", - "de": "German", - "el": "Greek", - "he": "Hebrew", - "hi": "Hindi", - "hu": "Hungarian", - "is": "Icelandic", - "id": "Indonesian", - "it": "Italian", - "ja": "Japanese", - "ko": "Korean", - "lv": "Latvian", - "lt": "Lithuanian", - "mk": "Macedonian", - "ms": "Malay", - "no": "Norwegian", - "pl": "Polish", - "pt": "Portuguese", - "pt-br": "Portuguese (Brasil)", - "ro": "Romanian", - "ru": "Russian", - "sr": "Serbian", - "sr-cyrl": "Serbian (Cyrillic)", - "sr-latn": "Serbian (Latin)", - "sk": "Slovak", - "sl": "Slovenian", - "es": "Spanish", - "sv": "Swedish", - "th": "Thai", - "tr": "Turkish", - "uk": "Ukranian", - "vi": "Vietnamese" + } \ No newline at end of file From 92196897a9cb9fb6c34bc774fdc49df5a5d3c2d3 Mon Sep 17 00:00:00 2001 From: pannal Date: Wed, 4 Apr 2018 00:01:03 +0200 Subject: [PATCH 030/710] Update da.json (POEditor.com) --- Contents/Strings/da.json | 382 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 381 insertions(+), 1 deletion(-) diff --git a/Contents/Strings/da.json b/Contents/Strings/da.json index 0e0dcd235..186a6b5a0 100644 --- a/Contents/Strings/da.json +++ b/Contents/Strings/da.json @@ -1,3 +1,383 @@ { - + "sq": "Albansk", + "ar": "Arabisk", + "be": "", + "bs": "", + "bg": "", + "ca": "", + "zh": "Kinesisk", + "hr": "", + "cs": "", + "da": "Dansk", + "nl": "Hollansk", + "en": "Engelsk", + "et": "", + "fa": "", + "fi": "Finsk", + "fr": "Fransk", + "de": "Tysk", + "el": "Græsk", + "he": "", + "hi": "Hindi", + "hu": "", + "is": "Islansk", + "id": "", + "it": "Italiensk", + "ja": "", + "ko": "", + "lv": "", + "lt": "", + "mk": "", + "ms": "", + "no": "Norsk", + "pl": "Polsk", + "pt": "", + "pt-br": "", + "ro": "", + "ru": "", + "sr": "", + "sr-cyrl": "", + "sr-latn": "", + "sk": "", + "sl": "", + "es": "Spansk", + "sv": "", + "th": "", + "tr": "", + "uk": "", + "vi": "", + "Internal stuff, pay attention!": "", + "Advanced": "", + "advanced": "", + "Enter PIN": "Indtast Pin", + "The owner has restricted the access to this menu. Please enter the correct pin": "", + "Restart the plugin": "Genstart Plugin", + "Get my logs (copy the appearing link and open it in your browser, please)": "", + "Copy the appearing link and open it in your browser, please": "", + "Trigger find better subtitles": "", + "Skip next find better subtitles (sets last run to now)": "", + "Trigger subtitle storage maintenance": "", + "Trigger subtitle storage migration (expensive)": "", + "Trigger cache maintenance (refiners, providers and packs/archives)": "", + "Apply configured default subtitle mods to all (active) stored subtitles": "", + "Re-Apply mods of all stored subtitles": "", + "Log the plugin's scheduled tasks state storage": "", + "Log the plugin's internal ignorelist storage": "", + "Log the plugin's complete state storage": "", + "Reset the plugin's scheduled tasks state storage": "", + "Reset the plugin's internal ignorelist storage": "", + "Invalidate Sub-Zero metadata caches (subliminal)": "", + "Reset provider throttle states": "", + "Restarting the plugin": "Genstarter plugin", + "Restart triggered, please wait about 5 seconds": "", + "Reset subtitle storage": "", + "Are you sure?": "Er du sikker?", + "Are you really sure?": "Er du helt sikker?", + "Success": "", + "FindBetterSubtitles triggered": "", + "FindBetterSubtitles skipped": "", + "SubtitleStorageMaintenance triggered": "", + "MigrateSubtitleStorage triggered": "", + "TriggerCacheMaintenance triggered": "", + "This may take some time ...": "", + "Download Logs": "", + "Sorry, feature unavailable": "", + "Universal Plex token not available": "", + "Copy this link and open this in your browser, please": "", + "Cache invalidated": "", + "Enter PIN number ": "Indtast PIN nummer ", + "PIN correct": "PIN korrekt", + "Reset": "Nulstil", + "Menu locked": "", + "Provider throttles reset": "", + "Information Storage (%s) reset": "", + "Information Storage (%s) logged": "", + "Plex didn't return any information about the item, please refresh it and come back later": "", + "Item not found: %s!": "Media ikke fundet: %s!", + "< Back to %s": "< Tilbage til %s", + "Back to %s > %s": "", + "Refresh: %s": "", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "", + "Extract and activate embedded subtitle streams": "", + "Inspect currently blacklisted subtitles": "", + "Subtitle saved to disk": "Undertekster gemt på disk", + "Remove subtitle from blacklist": "", + "No subtitles found": "Ingen undertekster fundet", + " (unknown)": " (Ukendt)", + " (forced)": " (Trunget)", + "Extracting of embedded subtitle %s of part %s:%s triggered": "", + "Insufficient permissions": "", + "I'm not enabled!": "Jeg er ikke aktiveret!", + "Please enable me for some of your libraries in your server settings; currently I do nothing": "", + "Working ... refresh here": "", + "Current state: %s; Last state: %s": "", + "On-deck items": "", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles.": "", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "", + "Recently-added items": "", + "Recently played items": "", + "Shows the recently added items per section.": "", + "Show recently added items with missing subtitles": "", + "Lists items with missing subtitles. Click on Find recent items with missing subs to update list": "", + "Browse all items": "", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "", + "Last run: %s; Next scheduled run: %s; Last runtime: %s": "", + "Search for missing subtitles (in recently-added items, max-age: %s)": "", + "Automatically run periodically by the scheduler, if configured. %s": "", + "Show the current ignore list (mainly used for the automatic tasks)": "", + "History": "Historie", + "Show the last %i downloaded subtitles": "", + "Refresh": "", + "Re-lock menu(s)": "", + "Enabled the PIN again for menu(s)": "", + "Throttled providers: %s": "", + "Advanced functions": "", + "Use at your own risk": "", + "Items On Deck": "", + "Recently Played": "", + "Items with missing subtitles": "", + "Find recent items with missing subtitles": "", + "Updating, refresh here ...": "", + "Missing: %s": "", + "Add": "", + "Remove": "", + "to": "", + "from": "", + "add": "", + "remove": "", + "removed from": "", + "added to": "", + "Didn't change the ignore list": "", + "Sections": "", + "All": "", + "Un-Ignore": "", + "Ignore": "", + "show": "", + "movie": "", + "Force-": "", + "<< Back to home": "", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season ": "", + "with all configured default modifications": "", + "Extracts embedded subtitles of all episodes for the current season ": "", + "Auto-Find subtitles: %s": "", + "Extracting of embedded subtitles for %s triggered": "", + "Forced-refresh": "", + "< Back to subtitle options for: %s": "", + "Remove last applied mod (%s)": "", + "none": "", + "Manage applied mods": "", + "Reapply applied mods": "", + "Restore original version": "", + "< Back to subtitle modification menu": "", + "subs constantly getting faster": "", + "subs constantly getting slower": "", + "< Back to subtitle modifications": "", + "< Back to unit selection": "", + "Subtitle Language (1)": "", + "Subtitle Language (2)": "", + "Subtitle Language (3)": "", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "", + "Only download foreign/forced subtitles": "", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "", + "I rename my files using": "", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "", + "Sonarr URL (add URL base if configured)": "", + "Sonarr API key": "", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "", + "Radarr API key": "", + "Provider: Enable OpenSubtitles": "", + "Opensubtitles Username": "", + "Opensubtitles Password": "", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "", + "Provider: Enable Podnapisi.NET": "", + "Provider: Enable Titlovi.com": "", + "Provider: Enable Addic7ed": "", + "Addic7ed Username": "", + "Addic7ed Password": "", + "Addic7ed: boost score (if requirements met)": "", + "Addic7ed: Use random user agents": "", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "", + "Legendas TV Username": "", + "Legendas TV Password": "", + "Provider: Enable TVsubtitles.net": "", + "Provider: Enable NapiProjekt.pl (Polish)": "", + "Provider: Enable SubScene (TV shows)": "", + "Provider: Enable hosszupuskasub.com (Hungarian)": "", + "Provider: Enable aRGENTeaM (Spanish)": "", + "Search enabled providers simultaneously (multithreading)": "", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "", + "How strict should these subtitles existing on the filesystem be detected?": "", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "", + "Download hearing impaired subtitles.": "", + "Remove Hearing Impaired tags from downloaded subtitles": "", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "", + "Fix common issues in subtitles": "", + "Fix common OCR errors in downloaded subtitles": "", + "Reverse punctuation in RTL languages (heb)": "", + "Change colors of subtitles to": "", + "Store subtitles next to media files (instead of metadata)": "", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "", + "Fall back to metadata storage if filesystem storage failed": "", + "Set subtitle file permissions to (integer, e.g.: 0775)": "", + "Automatically delete leftover/unused (externally saved) subtitles": "", + "On media playback: search for missing subtitles (refresh item)": "", + "Scheduler: Periodically search for recent items with missing subtitles": "", + "Scheduler: Item age to be considered recent": "", + "Scheduler: Recent items to consider per library": "", + "Scheduler: Periodically search for better subtitles": "", + "Scheduler: Days to search for better subtitles (max: 30 days)": "", + "Scheduler: Don't search for better subtitles if the item's air date is older than": "", + "Scheduler: Overwrite manually selected subtitles when better found": "", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "", + "History: amount of items to store historical data for": "", + "How many download tries per subtitle (on timeout or error)": "", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "", + "Ignore anything in the following paths (comma-separated)": "", + "Sub-Zero mode": "", + "Access PIN (any amount of numbers, 0-9)": "", + "Access PIN valid for minutes": "", + "Use PIN to restrict access to (needs plugin or PMS restart)": "", + "Call this executable upon successful subtitle download (see Wiki for details)": "", + "Check for correct folder permissions of every library on plugin start": "", + "Use new style caching (for subliminal)": "", + "Low impact mode (for remote filesystems)": "", + "Timeout for API requests sent to the PMS": "", + "HTTP proxy to use for providers (supports credentials)": "", + "How verbose should the logging be?": "", + "How many log backups to keep?": "", + "Log subtitle modification (debug)": "", + "Log to console (for development/debugging)": "", + "Collect anonymous usage statistics": "", + "Sonarr/Radarr (fill api info below)": "", + "Filebot": "", + "Sonarr/Radarr/Filebot": "", + "Symlink to original file": "", + "I keep the original filenames": "", + "none of the above": "", + "exact: media filename match": "", + "loose: filename contains media filename": "", + "any": "", + "prefer": "", + "don't prefer": "", + "force HI": "", + "force non-HI": "", + "don't change": "", + "white": "", + "light-grey": "", + "red": "", + "green": "", + "yellow": "", + "blue": "", + "magenta": "", + "cyan": "", + "black": "", + "dark-red": "", + "dark-green": "", + "dark-yellow": "", + "dark-blue": "", + "dark-magenta": "", + "dark-cyan": "", + "dark-grey": "", + "current folder": "", + "never": "", + "current media item": "", + "next episode (series)": "", + "hybrid: current item or next episode": "", + "hybrid-plus: current item and next episode": "", + "every 6 hours": "", + "every 12 hours": "", + "every 24 hours": "", + "1 days": "", + "2 days": "", + "3 days": "", + "4 days": "", + "1 weeks": "", + "2 weeks": "", + "3 weeks": "", + "4 weeks": "", + "5 weeks": "", + "6 weeks": "", + "12 weeks": "", + "don't limit": "", + "1 year": "", + "2 years": "", + "3 years": "", + "4 years": "", + "5 years": "", + "6 years": "", + "7 years": "", + "8 years": "", + "9 years": "", + "10 years": "", + "agent + channel": "", + "only agent": "", + "only channel": "", + "disabled": "", + "channel menu": "", + "advanced menu": "", + "CRITICAL": "", + "ERROR": "", + "WARNING": "", + "INFO": "", + "DEBUG": "", + "Refreshes the %(current_kind)s, possibly searching for missing and picking up new subtitles on disk": "", + "Force-find subtitles: %(item_title)s": "", + "File %(file_part_index)s: ": "", + "%(part_summary)sNo current subtitle in storage": "", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "", + "%(part_summary)sManage %(language)s subtitle": "", + "%(part_summary)sList %(language)s subtitles": "", + "%(part_summary)sEmbedded subtitles (%(languages)s)": "", + "Select active %(language)s subtitle": "", + "%(count)d subtitles in storage": "", + "List available %(language)s subtitles": "", + "Modify current %(language)s subtitle": "", + "Currently applied mods: %(mod_list)s": "", + "Blacklist current %(language)s subtitle and search for a new one": "", + "Manage blacklist (%(amount)s contained)": "", + "%(current_state)s%(subtitle_name)s, Score: %(score)s": "", + "Current: ": "", + "Stored: ": "", + "by %(release_group)s": "", + "Current: %(provider_name)s (%(score)s) ": "", + "Search for %(language)s subs (%(video_data)s)": "", + "%(current_info)sFilename: %(filename)s": "", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": "", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": "", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "", + "Release: %(release_info)s, Matches: %(matches)s": "", + "Downloading subtitle for %(title_or_id)s": "", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "", + "Insufficient permissions on library %(title)s, folder: %(path)s": "", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "", + "Display ignore list (%(ignored_count)d)": "", + "%(throttled_provider)s until %(until_date)s (%(reason)s)": "", + "%(add_or_remove)s %(kind)s %(title)s %(to_or_from)s the ignore list": "", + "%(title)s %(added_to_or_removed_from)s the ignore list": "", + "%(force_state)sRefreshing %(title)s": "", + "Extracting subtitle %(stream_index)s of %(filename)s": "", + "Extract missing %(language)s embedded subtitles": "", + "Extract and activate %(language)s embedded subtitles": "", + "Triggering %(forced)sRefresh for %(title)s": "", + "%(refresh_or_forced_refresh)s of item %(item_id)s triggered": "", + "None": "", + "Idle": "", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "", + "Adjust by %(time_and_unit)s": "", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "", + "Remove: %(mod_name)s": "", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "" } \ No newline at end of file From 3d8687f69da8b267f88373881b41a7f2b766d3b6 Mon Sep 17 00:00:00 2001 From: pannal Date: Wed, 4 Apr 2018 15:25:24 +0200 Subject: [PATCH 031/710] Update de.json (POEditor.com) --- Contents/Strings/de.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 0e0dcd235..527267d8f 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -1,3 +1,16 @@ { - + "sq": "Albanisch", + "ar": "Arabisch", + "be": "Weißrussisch", + "bs": "Bosnisch", + "bg": "Bulgarisch", + "ca": "Katalanisch", + "zh": "Chinesisch", + "hr": "Kroatisch", + "cs": "Tschechisch", + "da": "Dänisch", + "nl": "Holländisch", + "en": "Englisch", + "Re-Apply mods of all stored subtitles": "Alle Mods aller gespeicherten Untertitel abermals anwenden", + "%(count)d subtitles in storage": "%(count)d Untertitel im Speicher" } \ No newline at end of file From df78cecb31535ab4b14db2f5f2e5fb3bb8a268ff Mon Sep 17 00:00:00 2001 From: pannal Date: Wed, 4 Apr 2018 15:28:33 +0200 Subject: [PATCH 032/710] Update de.json (POEditor.com) --- Contents/Strings/de.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 527267d8f..bb9a2b079 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -12,5 +12,6 @@ "nl": "Holländisch", "en": "Englisch", "Re-Apply mods of all stored subtitles": "Alle Mods aller gespeicherten Untertitel abermals anwenden", - "%(count)d subtitles in storage": "%(count)d Untertitel im Speicher" + "%(count)d subtitles in storage": "%(count)d Untertitel im Speicher", + "List available %(language)s subtitles": "List available %(language)s subtitles; Umlauttest ÜÜÜ ß 😁" } \ No newline at end of file From 6dba0792d205133dd8448660ea93710549af124a Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 4 Apr 2018 15:32:43 +0200 Subject: [PATCH 033/710] i18n: unicodize the result of _() --- Contents/Code/support/i18n.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/i18n.py b/Contents/Code/support/i18n.py index 5b1dc4795..87e985ad8 100644 --- a/Contents/Code/support/i18n.py +++ b/Contents/Code/support/i18n.py @@ -78,7 +78,8 @@ def local_string_with_optional_format(key, *args, **kwargs): args = tuple(args) if args: - return SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale), args) + # fixme: may not be the best idea as this evaluates the string early + return unicode(SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale), args)) # check string instances for arguments if config.debug_i18n: @@ -86,7 +87,7 @@ def local_string_with_optional_format(key, *args, **kwargs): if msg: return msg - return plex_i18n_module.LocalString(core, key, Locale.CurrentLocale) + return unicode(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale)) _ = local_string_with_optional_format From 65ec539875972dd07d9510cc61ec8eab03cf994c Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 5 Apr 2018 01:25:11 +0200 Subject: [PATCH 034/710] rename "channel" to "interface" --- Contents/Code/interface/menu.py | 2 +- Contents/Code/support/config.py | 8 ++++---- Contents/DefaultPrefs.json | 8 ++++---- Contents/Strings/en.json | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 731841355..f3799fac0 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -292,7 +292,7 @@ def ValidatePrefs(): update_dict = True elif Dict["channel_enabled"] != config.enable_channel: - Log.Debug("Channel features %s, restarting plugin", "enabled" if config.enable_channel else "disabled") + Log.Debug("Interface features %s, restarting plugin", "enabled" if config.enable_channel else "disabled") update_dict = True restart = True diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 7c6b159e5..77c6e0011 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -356,16 +356,16 @@ def set_plugin_mode(self): if not self.providers: self.enable_agent = False self.enable_channel = False - Log.Warn("No providers enabled, disabling agent and channel!") + Log.Warn("No providers enabled, disabling agent and interface!") return if Prefs["plugin_mode"] == "only agent": self.enable_channel = False - elif Prefs["plugin_mode"] == "only channel": + elif Prefs["plugin_mode"] == "only interface": self.enable_agent = False def set_plugin_lock(self): - if Prefs["plugin_pin_mode"] in ("channel menu", "advanced menu"): + if Prefs["plugin_pin_mode"] in ("interface", "advanced menu"): # check pin pin = Prefs["plugin_pin"] if not pin or not len(pin): @@ -379,7 +379,7 @@ def set_plugin_lock(self): Log.Warn("PIN has to be an integer (0-9)") self.pin = pin self.lock_advanced_menu = Prefs["plugin_pin_mode"] == "advanced menu" - self.lock_menu = Prefs["plugin_pin_mode"] == "channel menu" + self.lock_menu = Prefs["plugin_pin_mode"] == "interface" try: self.pin_valid_minutes = int(Prefs["plugin_pin_valid_for"].strip()) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 71de98e5f..323a6e395 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -713,11 +713,11 @@ "label": "Sub-Zero mode", "type": "enum", "values": [ - "agent + channel", + "agent + interface", "only agent", - "only channel" + "only interface" ], - "default": "agent + channel" + "default": "agent + interface" }, { "id": "plugin_pin", @@ -739,7 +739,7 @@ "type": "enum", "values": [ "disabled", - "channel menu", + "interface", "advanced menu" ], "default": "disabled" diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 1524cc0f4..1c41ee75f 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -369,11 +369,11 @@ "8 years":"8 years", "9 years":"9 years", "10 years":"10 years", - "agent + channel":"agent + channel", + "agent + interface":"agent + interface", "only agent":"only agent", - "only channel":"only channel", + "only interface":"only interface", "disabled":"disabled", - "channel menu":"channel menu", + "interface":"interface", "advanced menu":"advanced menu", "CRITICAL":"CRITICAL", "ERROR":"ERROR", From c687152724963368e7eef0414cf35c8bd0468ddb Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 5 Apr 2018 01:28:20 +0200 Subject: [PATCH 035/710] readme: rename "channel" to "interface" --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cb8b8bdaf..68ed8548e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ If you like this, buy me a beer:
[![Donate](https://www.paypalobjects.com/en ## Introduction #### What's Sub-Zero? -Sub-Zero is a metadata agent and channel at the same time, for the popular Plex Media Server environment. +Sub-Zero is a metadata agent and interface-plugin at the same time, for the popular Plex Media Server environment. #### Why not use the builtin OpenSubtitles agent? Because it doesn't deliver. Especially for very new media items it may pick up none or bad subtitles for your media. Also it doesn't know when "better" subtitles get released for your media file. @@ -42,8 +42,8 @@ Via the preferences you can configure almost every parameter Sub-Zero uses when From an infinite number of different languages to search for, to hearing impaired settings, foreign/forced-only captions, embedded subtitle handling and many more. -#### Channel menu -The automatic matching Sub-Zero does has been improved massively over the last years and reaches an extremely high accuracy for recently-released items, in the first 6 hours. It still might be, that you want some manual managability over your library and its subtitles. This is where the channel menu comes into play. +#### Interface +The automatic matching Sub-Zero does has been improved massively over the last years and reaches an extremely high accuracy for recently-released items, in the first 6 hours. It still might be, that you want some manual managability over your library and its subtitles. This is where the interface comes into play. It allows you to trigger background tasks, browse your library based on several different starting points, adds a recently-viewed menu for instant access to your recently played media and allows you to list and select available subtitles for any item in your library. @@ -58,7 +58,7 @@ They currently consist of six individual mods: - **OCR**: fixes problems in subtitles introduced by OCR (custom implementation of [SubtitleEdit](https://github.com/SubtitleEdit/subtitleedit)'s dictionaries) (`hands agaInst the waII!` -> `hands against the wall!`) - **Remove Tags**: removes any font style tags from the subtitles (bold, italic, underline, colors, ...) -Hearing Impaired, Common, OCR and Color can be applied automatically on every subtitle downloaded. All mods are manually managable via the channel menu. +Hearing Impaired, Common, OCR and Color can be applied automatically on every subtitle downloaded. All mods are manually managable via the interface. Mods are applied on-the-fly, the original content of the subtitle stays available, so mods are completely reversible. From a7342ac77e432436a260ae40b4dbfadf65ca53c3 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 5 Apr 2018 14:51:51 +0200 Subject: [PATCH 036/710] i18n: replace badly translatable strings --- Contents/Code/interface/main.py | 20 ++++++++++++-------- Contents/Code/interface/refresh_item.py | 12 ++++++++---- Contents/Strings/en.json | 17 ++++++++++------- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index 8b952378f..b05701a5f 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -81,7 +81,7 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r oc.add(DirectoryObject( key=Callback(OnDeckMenu), title=_("On-deck items"), - summary=_("Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles."), + summary=_("Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles."), thumb=R("icon-ondeck.jpg") )) if "last_played_items" in Dict and Dict["last_played_items"]: @@ -327,12 +327,14 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): """ is_ignored = rating_key in ignore_list[kind] if not sure: + t = "Add %(kind)s %(title)s to the ignore list" + if is_ignored: + t = "Remove %(kind)s %(title)s from the ignore list" oc = SubFolderObjectContainer(no_history=True, replace_parent=True, - title1=_("%(add_or_remove)s %(kind)s %(title)s %(to_or_from)s the ignore list", - add_or_remove=_("Add") if not is_ignored else _("Remove"), + title1=_(t, kind=ignore_list.verbose(kind), - title=title, - to_or_from=_("to") if not is_ignored else _("from")), + title=title + ), title2=_("Are you sure?")) oc.add(DirectoryObject( key=Callback(IgnoreMenu, kind=kind, rating_key=rating_key, title=title, sure=True, @@ -367,9 +369,11 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): if dont_change: return fatality(force_title=" ", header=_("Didn't change the ignore list"), no_history=True) - return fatality(force_title=" ", header=_("%(title)s %(added_to_or_removed_from)s the ignore list", - title=title, - added_to_or_removed_from=state), + t = "%(title)s added to the ignore list" + if todo == "remove": + t = "%(title)s removed from the ignore list" + return fatality(force_title=" ", header=_(t, + title=title,), no_history=True) diff --git a/Contents/Code/interface/refresh_item.py b/Contents/Code/interface/refresh_item.py index 51f6a7717..d716f1afb 100644 --- a/Contents/Code/interface/refresh_item.py +++ b/Contents/Code/interface/refresh_item.py @@ -16,13 +16,17 @@ def RefreshItem(rating_key=None, came_from="/recent", item_title=None, force=Fal from interface.main import fatality header = " " if trigger: - set_refresh_menu_state(_(u"Triggering %(forced)sRefresh for %(title)s", - forced=_("Force-") if force else "", + t = u"Triggering refresh for %(title)s" + if force: + u"Triggering forced refresh for %(title)s" + set_refresh_menu_state(_(t, title=item_title)) Thread.Create(refresh_item, rating_key=rating_key, force=force, refresh_kind=refresh_kind, parent_rating_key=previous_rating_key, timeout=int(timeout)) - header = _(u"%(refresh_or_forced_refresh)s of item %(item_id)s triggered", - refresh_or_forced_refresh=_("Refresh") if not force else _("Forced-refresh"), + t = u"Refresh of item %(item_id)s triggered" + if force: + t = u"Forced refresh of item %(item_id)s triggered" + header = _(t, item_id=rating_key) return fatality(randomize=timestamp(), header=header, replace_parent=True) diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 1c41ee75f..d8ba6fe69 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -144,13 +144,13 @@ "Working ... refresh here":"Working ... refresh here", "Current state: %s; Last state: %s":"Current state: %s; Last state: %s", "On-deck items":"On-deck items", - "Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles.":"Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles.", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.", "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", "Recently-added items":"Recently-added items", "Recently played items":"Recently played items", "Shows the recently added items per section.":"Shows the recently added items per section.", "Show recently added items with missing subtitles":"Show recently added items with missing subtitles", - "Lists items with missing subtitles. Click on Find recent items with missing subs to update list":"Lists items with missing subtitles. Click on Find recent items with missing subs to update list", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list":"Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list", "Browse all items":"Browse all items", "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.":"Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.", "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)":"Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", @@ -174,7 +174,8 @@ "Find recent items with missing subtitles":"Find recent items with missing subtitles", "Updating, refresh here ...":"Updating, refresh here ...", "Missing: %s":"Missing: %s", - "%(add_or_remove)s %(kind)s %(title)s %(to_or_from)s the ignore list":"%(add_or_remove)s %(kind)s %(title)s %(to_or_from)s the ignore list", + "Add %(kind)s %(title)s to the ignore list":"Add %(kind)s %(title)s to the ignore list", + "Remove %(kind)s %(title)s from the ignore list":"Remove %(kind)s %(title)s from the ignore list", "Add":"Add", "Remove":"Remove", "to":"to", @@ -184,7 +185,8 @@ "removed from":"removed from", "added to":"added to", "Didn't change the ignore list":"Didn't change the ignore list", - "%(title)s %(added_to_or_removed_from)s the ignore list":"%(title)s %(added_to_or_removed_from)s the ignore list", + "%(title)s added to the ignore list":"%(title)s added to the ignore list", + "%(title)s removed from the ignore list":"%(title)s removed from the ignore list", "Sections":"Sections", "All":"All", "Un-Ignore":"Un-Ignore", @@ -202,9 +204,10 @@ "Extracts embedded subtitles of all episodes for the current season ":"Extracts embedded subtitles of all episodes for the current season ", "Auto-Find subtitles: %s":"Auto-Find subtitles: %s", "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered", - "Triggering %(forced)sRefresh for %(title)s":"Triggering %(forced)sRefresh for %(title)s", - "%(refresh_or_forced_refresh)s of item %(item_id)s triggered":"%(refresh_or_forced_refresh)s of item %(item_id)s triggered", - "Forced-refresh":"Forced-refresh", + "Triggering refresh for %(title)s":"Triggering refresh for %(title)s", + "Triggering forced refresh for %(title)s":"Triggering forced refresh for %(title)s", + "Refresh of item %(item_id)s triggered":"Refresh of item %(item_id)s triggered", + "Forced refresh of item %(item_id)s triggered":"Forced refresh of item %(item_id)s triggered", "< Back to subtitle options for: %s":"< Back to subtitle options for: %s", "Remove last applied mod (%s)":"Remove last applied mod (%s)", "none":"none", From 6c39fb0649327a7a259e185f747b5ec809968c9e Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 5 Apr 2018 14:56:29 +0200 Subject: [PATCH 037/710] i18n: remove obsolete translations --- Contents/Code/interface/main.py | 4 +--- Contents/Strings/en.json | 8 -------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index b05701a5f..2d3190f26 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -338,7 +338,7 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): title2=_("Are you sure?")) oc.add(DirectoryObject( key=Callback(IgnoreMenu, kind=kind, rating_key=rating_key, title=title, sure=True, - todo=_("add") if not is_ignored else _("remove")), + todo="add" if not is_ignored else "remove"), title=pad_title(_("Are you sure?")), )) return oc @@ -353,7 +353,6 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): Log.Info("Removed %s (%s) from the ignore list", title, rating_key) ignore_list.remove_title(kind, rating_key) ignore_list.save() - state = _("removed from") elif todo == "add": if is_ignored: dont_change = True @@ -362,7 +361,6 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): Log.Info("Added %s (%s) to the ignore list", title, rating_key) ignore_list.add_title(kind, rating_key, title) ignore_list.save() - state = _("added to") else: dont_change = True diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index d8ba6fe69..ef66c10e8 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -176,14 +176,6 @@ "Missing: %s":"Missing: %s", "Add %(kind)s %(title)s to the ignore list":"Add %(kind)s %(title)s to the ignore list", "Remove %(kind)s %(title)s from the ignore list":"Remove %(kind)s %(title)s from the ignore list", - "Add":"Add", - "Remove":"Remove", - "to":"to", - "from":"from", - "add":"add", - "remove":"remove", - "removed from":"removed from", - "added to":"added to", "Didn't change the ignore list":"Didn't change the ignore list", "%(title)s added to the ignore list":"%(title)s added to the ignore list", "%(title)s removed from the ignore list":"%(title)s removed from the ignore list", From 7bda522f0ad8b07337d859baef55a02610809718 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 5 Apr 2018 15:02:13 +0200 Subject: [PATCH 038/710] i18n: replace badly translatable terms --- Contents/Code/interface/menu_helpers.py | 15 +++++++++++---- Contents/Strings/en.json | 8 ++++---- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index fc1164c2a..737531842 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -49,10 +49,14 @@ def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None in_list = rating_key in ignore_list[use_kind] + t = u"Ignore %(kind)s \"%(title)s\"" + if in_list: + t = u"Un-ignore %(kind)s \"%(title)s\"" + oc.add(DirectoryObject( key=Callback(callback_menu, kind=use_kind, rating_key=rating_key, title=title), - title=u"%s %s \"%s\"" % ( - unicode(_("Un-Ignore") if in_list else _("Ignore")), ignore_list.verbose(kind) if add_kind else "", + title=t % ( + ignore_list.verbose(kind) if add_kind else "", unicode(title)) ) ) @@ -112,8 +116,11 @@ def set_refresh_menu_state(state_or_media, media_type="movies"): intent = get_intent() force_refresh = intent.get("force", media_id) - Dict["current_refresh_state"] = unicode(_(u"%(force_state)sRefreshing %(title)s", - force_state=_("Force-") if force_refresh else "", + t = u"Refreshing %(title)s" + if force_refresh: + t = u"Force-refreshing %(title)s" + + Dict["current_refresh_state"] = unicode(_(t, title=unicode(title))) diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index ef66c10e8..5676f5551 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -181,12 +181,12 @@ "%(title)s removed from the ignore list":"%(title)s removed from the ignore list", "Sections":"Sections", "All":"All", - "Un-Ignore":"Un-Ignore", - "Ignore":"Ignore", + "Ignore %(kind)s \"%(title)s\"":"Ignore %(kind)s \"%(title)s\"", + "Un-ignore %(kind)s \"%(title)s\"":"Un-ignore %(kind)s \"%(title)s\"", "show":"show", "movie":"movie", - "%(force_state)sRefreshing %(title)s":"%(force_state)sRefreshing %(title)s", - "Force-":"Force-", + "Refreshing %(title)s":"Refreshing %(title)s", + "Force-refreshing %(title)s":"Force-refreshing %(title)s", "Extracting subtitle %(stream_index)s of %(filename)s":"Extracting subtitle %(stream_index)s of %(filename)s", "<< Back to home":"<< Back to home", "Extract missing %(language)s embedded subtitles":"Extract missing %(language)s embedded subtitles", From de50dfdb7c17fa0944be23434e0cba85c4b7486e Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 5 Apr 2018 15:09:42 +0200 Subject: [PATCH 039/710] i18n: replace badly translatable terms --- Contents/Code/interface/menu.py | 8 ++++---- Contents/Strings/en.json | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index f3799fac0..18e03a55e 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -119,8 +119,8 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p previous_item_type=previous_item_type, with_mods=True, previous_rating_key=previous_rating_key, randomize=timestamp()), title=_(u"Extract missing %(language)s embedded subtitles", language=display_language(lang)), - summary=_("Extracts the not yet extracted embedded subtitles of all episodes for the current season ") + - _("with all configured default modifications") + summary=_("Extracts the not yet extracted embedded subtitles of all episodes for the current " + "season with all configured default modifications") )) oc.add(DirectoryObject( key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, @@ -129,8 +129,8 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p previous_item_type=previous_item_type, with_mods=True, previous_rating_key=previous_rating_key, randomize=timestamp()), title=_(u"Extract and activate %(language)s embedded subtitles", language=display_language(lang)), - summary=_("Extracts embedded subtitles of all episodes for the current season ") + - _("with all configured default modifications") + summary=_("Extracts embedded subtitles of all episodes for the current season " + "with all configured default modifications") )) # add refresh diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 5676f5551..b05af91c7 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -190,10 +190,9 @@ "Extracting subtitle %(stream_index)s of %(filename)s":"Extracting subtitle %(stream_index)s of %(filename)s", "<< Back to home":"<< Back to home", "Extract missing %(language)s embedded subtitles":"Extract missing %(language)s embedded subtitles", - "Extracts the not yet extracted embedded subtitles of all episodes for the current season ":"Extracts the not yet extracted embedded subtitles of all episodes for the current season ", - "with all configured default modifications":"with all configured default modifications", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications", "Extract and activate %(language)s embedded subtitles":"Extract and activate %(language)s embedded subtitles", - "Extracts embedded subtitles of all episodes for the current season ":"Extracts embedded subtitles of all episodes for the current season ", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts embedded subtitles of all episodes for the current season with all configured default modifications", "Auto-Find subtitles: %s":"Auto-Find subtitles: %s", "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered", "Triggering refresh for %(title)s":"Triggering refresh for %(title)s", From 729404d05f912d98f58f0a5b93a89c96ad8e43d5 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 5 Apr 2018 16:01:46 +0200 Subject: [PATCH 040/710] i18n: replace badly translatable terms --- Contents/Code/interface/menu.py | 4 ++-- Contents/Strings/en.json | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 18e03a55e..6068ab08d 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -138,8 +138,8 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p key=Callback(RefreshItem, rating_key=rating_key, item_title=title, refresh_kind=current_kind, previous_rating_key=previous_rating_key, timeout=timeout * 1000, randomize=timestamp()), title=_(u"Refresh: %s", item_title), - summary=_("Refreshes the %(current_kind)s, possibly searching for missing and picking up " - "new subtitles on disk", current_kind=current_kind) + summary=_("Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up " + "new subtitles on disk", the_movie_series_season_episode=_(u"the %s" % current_kind)) )) oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=title, force=True, diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index b05af91c7..47a90aa36 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -97,7 +97,11 @@ "< Back to %s":"< Back to %s", "Back to %s > %s":"Back to %s > %s", "Refresh: %s":"Refresh: %s", - "Refreshes the %(current_kind)s, possibly searching for missing and picking up new subtitles on disk":"Refreshes the %(current_kind)s, possibly searching for missing and picking up new subtitles on disk", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk":"Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk", + "the movie":"the movie", + "the series":"the series", + "the episode":"the episode", + "the season":"the season", "Force-find subtitles: %(item_title)s":"Force-find subtitles: %(item_title)s", "Issues a forced refresh, ignoring known subtitles and searching for new ones":"Issues a forced refresh, ignoring known subtitles and searching for new ones", "File %(file_part_index)s: ":"File %(file_part_index)s: ", From 6e604f98e38996f6f89ff47629df88e865fdf79a Mon Sep 17 00:00:00 2001 From: pannal Date: Thu, 5 Apr 2018 16:32:33 +0200 Subject: [PATCH 041/710] Update de.json (POEditor.com) --- Contents/Strings/de.json | 366 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 365 insertions(+), 1 deletion(-) diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index bb9a2b079..48a7ff8d3 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -11,7 +11,371 @@ "da": "Dänisch", "nl": "Holländisch", "en": "Englisch", + "et": "Estnisch", + "fa": "Persisch", + "fi": "Finnisch", + "fr": "Französisch", + "de": "Deutsch", + "el": "Griechisch", + "he": "Hebräisch", + "hi": "Hindi", + "hu": "Ungarisch", + "is": "Isländisch", + "id": "Indonesisch", + "it": "Italienisch", + "ja": "Japanisch", + "ko": "Koreanisch", + "lv": "Lettisch", + "lt": "Litauisch", + "mk": "Mazedonisch", + "ms": "Malaiisch", + "no": "Norwegisch", + "pl": "Polnisch", + "pt": "Portugiesisch", + "pt-br": "Portigiesisch (Brasilien)", + "ro": "Rumänisch", + "ru": "Russisch", + "sr": "Serbisch", + "sr-cyrl": "Serbisch (Kyrillisch)", + "sr-latn": "Serbisch (Lateinisch)", + "sk": "Slowakisch", + "sl": "Slowenisch", + "es": "Spanisch", + "sv": "Schwedisch", + "th": "Thailändisch", + "tr": "Türkisch", + "uk": "Ukrainisch", + "vi": "Vietnamesisch", + "Internal stuff, pay attention!": "Internes, bitte aufpassen!", + "Advanced": "Erweitert", + "advanced": "erweitert", + "Enter PIN": "PIN eingeben", + "The owner has restricted the access to this menu. Please enter the correct pin": "Der Inhaber hat den Zugriff zu diesem Menü eingeschränkt, bitte die korrekte PIN eingeben", + "Restart the plugin": "Plugin neustarten", + "Get my logs (copy the appearing link and open it in your browser, please)": "Hole meine Logs (bitte den erscheinenden Link kopieren und im Browser öffnen)", + "Copy the appearing link and open it in your browser, please": "Bitte den erscheinenden Link kopieren und im Browser öffnen", + "Trigger find better subtitles": "Bessere Untertitel finden anstoßen", + "Skip next find better subtitles (sets last run to now)": "Das nächste Bessere-Untertitel-Finden überspringen (setzt den letzten Laufzeitpunkt auf jetzt)", + "Trigger subtitle storage maintenance": "Unterstitelspeicher-Wartung anstoßen", + "Trigger subtitle storage migration (expensive)": "Untertitelspeicher-Migration anstoßen (teuer)", + "Trigger cache maintenance (refiners, providers and packs/archives)": "Cache-Wartung anstoßen (Refiner, Anbieter, Pakete/Archive)", + "Apply configured default subtitle mods to all (active) stored subtitles": "Alle Standard-Untertitel-Mods auf alle (aktiven) gespeicherten Untertitel anwenden", "Re-Apply mods of all stored subtitles": "Alle Mods aller gespeicherten Untertitel abermals anwenden", + "Log the plugin's scheduled tasks state storage": "Den Geplante-Aufgaben-Status-Speicher protokollieren", + "Log the plugin's internal ignorelist storage": "Den internen Ignore-Listen-Speicher protokollieren", + "Log the plugin's complete state storage": "Den kompletten internen State-Speicher protokollieren", + "Reset the plugin's scheduled tasks state storage": "Den Geplante-Aufgaben-Status-Speicher zurücksetzen", + "Reset the plugin's internal ignorelist storage": "Den internen Ignore-Listen-Speicher zurücksetzen", + "Invalidate Sub-Zero metadata caches (subliminal)": "Die Sub-Zero Metadaten-Caches invalidieren (subliminal)", + "Reset provider throttle states": "Den Anbieter-Drosselungsstatus zurücksetzen", + "Restarting the plugin": "Starte das Plugin neu", + "Restart triggered, please wait about 5 seconds": "Neustart angestoßen, bitte circa 5 Sekunden warten", + "Reset subtitle storage": "Untertitelspeicher zurücksetzen", + "Are you sure?": "Sicher?", + "Are you really sure?": "Wirklich sicher?", + "Success": "Erfolg", + "FindBetterSubtitles triggered": "FindBetterSubtitles angestoßen", + "FindBetterSubtitles skipped": "FindBetterSubtitles übersprungen", + "SubtitleStorageMaintenance triggered": "SubtitleStorageMaintenance angestoßen", + "MigrateSubtitleStorage triggered": "MigrateSubtitleStorage angestoßen", + "TriggerCacheMaintenance triggered": "TriggerCacheMaintenance angestoßen", + "This may take some time ...": "Dies könnte ein wenig dauern ...", + "Download Logs": "Logs herunterladen", + "Sorry, feature unavailable": "Entschuldigung, Funktion nicht verfügbar", + "Universal Plex token not available": "Universeller Plex-Token nicht verfügbar", + "Copy this link and open this in your browser, please": "Bitte diesen Link kopieren und im Browser öffnen", + "Cache invalidated": "Cache invalidiert", + "Enter PIN number ": "PIN eingeben", + "PIN correct": "PIN ist korrekt", + "Reset": "Zurücksetzen", + "Menu locked": "Menü gesperrt", + "Provider throttles reset": "Anbieter-Drosselung zurückgesetzt", + "Information Storage (%s) reset": "Informationsspeicher (%s) zurückgesetzt", + "Information Storage (%s) logged": "Informationsspeicher (%s) protokolliert", + "Plex didn't return any information about the item, please refresh it and come back later": "Plex hat leider keine Informationen über dieses Element, bitte dieses aktualisieren und noch mal probieren", + "Item not found: %s!": "Element nicht gefunden: %s!", + "< Back to %s": "< Zurück zu %s", + "Back to %s > %s": "Zurück zu %s > %s", + "Refresh: %s": "Aktualisieren: %s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Startet eine erzwungene Aktualisierung; ignoriert dabei bereits bekannte Untertitel und sucht nach neuen", + "Extract and activate embedded subtitle streams": "Eingebettete Untertitel extrahieren und aktivieren", + "Inspect currently blacklisted subtitles": "Untertitel-Sperrliste ansehen", + "Subtitle saved to disk": "Untertitel gespeichert", + "Remove subtitle from blacklist": "Untertitel von der Sperrliste entfernen", + "No subtitles found": "Keine Untertitel gefunden", + " (unknown)": " (unbekannt)", + " (forced)": " (erzwungen)", + "Extracting of embedded subtitle %s of part %s:%s triggered": "Extraktion des eingebetteten Untertitels %s des Teils %s:%s angestoßen", + "Insufficient permissions": "Unzureichende Berechtigungen", + "I'm not enabled!": "Ich bin nicht aktiv!", + "Please enable me for some of your libraries in your server settings; currently I do nothing": "Bitte für wenigstens eine Medienbibliothek aktivieren, aktuell tue ich nichts", + "Working ... refresh here": "In Arbeit ... hier aktualisieren", + "Current state: %s; Last state: %s": "Aktueller Status: %s; Letzter Status: %s", + "On-deck items": "Aktuelle Medien", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "Zeigt die letzten %s abgespielten Medien und ermöglicht die (erzwungene) Aktualisierung derer Metadaten/Untertitel", + "Recently-added items": "Zuletzt hinzugefügte Medien", + "Recently played items": "Zuletzt abgespielte Medien", + "Shows the recently added items per section.": "Zeigt die zuletzt hinzugefügten Medien pro Bereich", + "Show recently added items with missing subtitles": "Zeigt zuletzt hinzugefügte Medien mit fehlenden Untertiteln", + "Browse all items": "Alle Medien durchsuchen", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Die gesamten Medienbibliothek durchsuchen und die Ignore-Listen verwalten. Hier können ebenfalls die Metadaten/Untertitel einzelner Medien (erzwungen) aktualisiert werden", + "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Letzter Durchlauf: %s; Nächster geplanter Durchlauf: %s; Letzte Laufzeit: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)": "Nach fehlenden Untertiteln suchen (für zuletzt hinzugefügte Medien, maximales Alter: %s)", + "Automatically run periodically by the scheduler, if configured. %s": "Automatisch regelmäßig vom Scheduler ausgeführt, wenn konfiguriert. %s", + "Show the current ignore list (mainly used for the automatic tasks)": "Zeige die aktuelle Ignore-Liste (hauptsächlich für Hintergrundaufgaben genutzt)", + "History": "Verlauf", + "Show the last %i downloaded subtitles": "Zeige die letzten %i heruntergeladenen Untertitel", + "Refresh": "Aktualisieren", + "Re-lock menu(s)": "Menüs wieder sperren", + "Enabled the PIN again for menu(s)": "PIN für Menüs wieder aktiviert", + "Throttled providers: %s": "Gedrosselte Anbieter: %s", + "Advanced functions": "Erweiterte Funktionen", + "Use at your own risk": "Benutzung auf eigene Gefahr", + "Items On Deck": "Aktuelle Medien", + "Recently Played": "Zuletzt abgespielt", + "Items with missing subtitles": "Medien mit fehlenden Untertiteln", + "Find recent items with missing subtitles": "Finde zuletzt hinzugefügte Medien mit fehlenden Untertiteln", + "Updating, refresh here ...": "Update, hier aktualisieren ...", + "Missing: %s": "Fehlt: %s", + "Didn't change the ignore list": "Ignore-Liste wurde nicht verändert", + "Sections": "Bereiche", + "All": "Alle", + "show": "Serie", + "movie": "Film", + "<< Back to home": "<< Zurück zum Anfang", + "Auto-Find subtitles: %s": "Untertitel automatisch finden: %s", + "Extracting of embedded subtitles for %s triggered": "Extraktion eingebetteter Untertitel für %s angestoßen", + "< Back to subtitle options for: %s": "< Zurück zu den Untertiteloptionen für: %s", + "Remove last applied mod (%s)": "Die zuletzt angewandte Modifikation entfernen (%s)", + "none": "keine", + "Manage applied mods": "Angewandte Modifikationen verwalten", + "Reapply applied mods": "Angewandte Modifikationen erneut anwenden", + "Restore original version": "Originalversion wiederherstellen", + "< Back to subtitle modification menu": "< Zurück zum Untertitel-Modifikations-Menü", + "subs constantly getting faster": "Untertitel werden konstant schneller", + "subs constantly getting slower": "Untertitel werden konstant langsamer", + "< Back to subtitle modifications": "< Zurück zu den Untertitel-Modifikationen", + "< Back to unit selection": "< Zurück zur Einheiten-Auswahl", + "Subtitle Language (1)": "Untertitel-Sprache (1)", + "Subtitle Language (2)": "Untertitel-Sprache (2)", + "Subtitle Language (3)": "Untertitel-Sprache (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "Weitere Untertitel-Sprachen (ISO-639-1 Kodierung benutzen, kommagetrennt)", + "Only download foreign/forced subtitles": "Nur erzwungende/fremdsprachige Untertitel herunterladen", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Sprachen mit Landesattribut als ISO 639-1 anzeigen (z. B. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Sprachen mit Landesattribut als ISO 639-1 behandeln (pt-BR nicht herunterladen, wenn ein pt Untertitel existiert)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Auf eine Sprache beschränken (fügt dem Dateinamen kein \".lang.\"-Suffix hinzu; benutzt nur \"Untertitel Sprache (1)\")", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Eingebettete Untertitel: behandle Unbekannte Sprache als Sprache 1", + "I rename my files using": "Ich benenne meine Dateien um, mit:", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "Originale Dateinamen von .file_info/file_info Indexdateien beziehen (siehe Wiki)", + "Sonarr URL (add URL base if configured)": "Sonarr URL (URL-Basis hinzufügen, wenn konfiguriert)", + "Sonarr API key": "Sonarr API-Schlüssel", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "Radarr URL (URL-Basis hinzufügen, wenn konfiguriert; minimale Version: 0.2.0.897)", + "Radarr API key": "Radarr API-Schlüssel", + "Provider: Enable OpenSubtitles": "Anbieter: OpenSubtitles aktivieren", + "Opensubtitles Username": "OpenSubtitles Benutzername", + "Opensubtitles Password": "OpenSubtitles Passwort", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "OpenSubtitles VIP? (werbefreie Untertitel, 1000 Untertitel/Tag, no-cache VIP-Server: http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET": "Anbieter: Podnapisi.NET aktivieren", + "Provider: Enable Titlovi.com": "Anbieter: Titlovi.com aktivieren", + "Provider: Enable Addic7ed": "Anbieter: Addic7ed aktivieren", + "Addic7ed Username": "Addic7ed Benutzername", + "Addic7ed Password": "Addic7ed Passwort", + "Addic7ed: boost score (if requirements met)": "Addic7ed: Punktzahl anheben (wenn Voraussetzungen erfüllt)", + "Addic7ed: Use random user agents": "Addic7ed: Zufällige User-Agents benutzen", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "Anbieter: Legendas TV aktivieren (meist pt-BR; UNRAR erforderlich!)", + "Legendas TV Username": "Legendas TV Benutzername", + "Legendas TV Password": "Legendas TV Passwort", + "Provider: Enable TVsubtitles.net": "Anbieter: TVsubtitles.net aktivieren", + "Provider: Enable NapiProjekt.pl (Polish)": "Anbieter: NapiProjekt.pl aktivieren (polnisch)", + "Provider: Enable SubScene (TV shows)": "Anbieter: SubScene aktivieren (Serien)", + "Provider: Enable hosszupuskasub.com (Hungarian)": "Anbieter: Hosszupuskasub.com aktivieren (ungarisch)", + "Provider: Enable aRGENTeaM (Spanish)": "Anbieter: aRGENTeaM aktivieren (spanisch)", + "Search enabled providers simultaneously (multithreading)": "Durchsuche aktive Anbieter gleichzeitig (Multithreading)", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Extrahiere und aktiviere eingebettete Untertitel automatisch nach dem Hinzufügen der Medien (mit den konfigurierten Standard-Mods)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "Soll nach der automatischen Extraktion eingebetteter Untertitel zusätzlich auch sofort nach verfügbaren gesucht werden?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "Nicht nach Untertiteln einer Sprache suchen, wenn bereits einer als eingebetteter Untertitel in der Mediendatei existiert (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "Nicht nach Untertiteln einer Sprache suchen, wenn bereits einer im Dateisystem existiert (Metadaten/Dateisystem)?", + "How strict should these subtitles existing on the filesystem be detected?": "Wie genau soll die Erkennung existierender Untertitel auf dem Dateisystem sein?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "Dabei nicht-textbasierte Untertitelformate einbeziehen? (Alles außer .srt/.ssa/.ass/.vtt; eingebettet oder extern)", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "Minimale Punktzahl für Serien (min: 240, sinnvoll: 337, min-ideal: 352; see http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "Minimale Punktzahl für Filme (min: 60, def/sane: 69, sinnvoll: 82; see http://v.ht/szscores)", + "Download hearing impaired subtitles.": "Untertitel für Hörgeschädigte herunterladen.", + "Remove Hearing Impaired tags from downloaded subtitles": "Inhalte für Hörgeschädigte von heruntergeladenen Untertiteln entfernen", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Textformatierungen von heruntergeladenen Untertiteln entfernen (fett, kursiv, unterstrichen, Farben, ...)", + "Fix common issues in subtitles": "Häufige Probleme in Untertiteln beheben", + "Fix common OCR errors in downloaded subtitles": "Häufige Texterkennungsfehler in Untertiteln beheben", + "Reverse punctuation in RTL languages (heb)": "Zeichensetzung in linksläufigen Schriften umkehren (heb)", + "Change colors of subtitles to": "Farbe der Untertitel ändern zu", + "Store subtitles next to media files (instead of metadata)": "Speichere Untertitel neben den Medien (anstatt im Metadatenspeicher)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Zu speichernde Untertitelformate (Nicht-SRT funktioniert nur, wenn die vorherige Option aktiv ist)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "Untertitel-Ordner (\"aktueller Ordner\" ist der, in dem die Mediendatei liegt)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "Benutzerdefinierter Untertitelordner (überschreibt \"Untertitel-Ordner\"; wird zu echten Pfaden aufgelöst)", + "Fall back to metadata storage if filesystem storage failed": "Im Notfall im Metadatenspeicher speichern, wenn nicht auf dem Dateisystem gespeichert werden konnte", + "Set subtitle file permissions to (integer, e.g.: 0775)": "Untertitel-Berechtigungen setzen auf (Ganzzahl, z. B.: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles": "Automatisch übrig gebliebene/ungenutzte (extern gespeicherter) Untertitel löschen", + "On media playback: search for missing subtitles (refresh item)": "Beim Abspielen von Median nach fehlenden Untertiteln suchen (Element aktualisieren)", + "Scheduler: Periodically search for recent items with missing subtitles": "Hintergrundaufgaben: Regelmäßig nach aktuellen Medien mit fehlenden Untertiteln suchen", + "Scheduler: Item age to be considered recent": "Hintergrundaufgaben: Medien-Alter um als \"aktuell\" zu gelten", + "Scheduler: Recent items to consider per library": "Hintergrundaufgaben: Anzahl an zu berücksichtigenden Medien pro Bibliothek", + "Scheduler: Periodically search for better subtitles": "Hintergrundaufgaben: Regelmäßig nach besseren Untertiteln suchen", + "Scheduler: Days to search for better subtitles (max: 30 days)": "Hintergrundaufgaben: Wie viele Tage soll nach besseren Untertiteln gesucht werden (max: 30 Tage)", + "Scheduler: Don't search for better subtitles if the item's air date is older than": "Hintergrundaufgaben: Nicht nach besseren Untertiteln suchen, wenn der Ausstrahlungszeitpunkt älter ist als", + "Scheduler: Overwrite manually selected subtitles when better found": "Hintergrundaufgaben: Manuell ausgewählte Untertitel überschreiben, wenn bessere gefunden wurden", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Hintergrundaufgaben: Untertitel mit Nicht-Standard-Modifikationen überschreiben, wenn bessere gefunden wurden", + "History: amount of items to store historical data for": "Verlauf: Anzahl der Elemente", + "How many download tries per subtitle (on timeout or error)": "Wie oft soll der Download pro Untertitel versucht werden (bei Fehlern)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "Ignoriere Ordner mit \"subzero.ignore/.subzero.ignore/.nosz\"-Dateien", + "Ignore anything in the following paths (comma-separated)": "Ignoriere folgende Pfade", + "Sub-Zero mode": "Sub-Zero Modus", + "Access PIN (any amount of numbers, 0-9)": "Zugriffs-PIN (beliebige Anzahl Zahlen, 0-9)", + "Access PIN valid for minutes": "Zugriffs-PIN gültig für Minuten", + "Use PIN to restrict access to (needs plugin or PMS restart)": "Benutze PIN um den Zugriff einzuschränken für (benötigt Plugin- oder PMS-Neustart)", + "Call this executable upon successful subtitle download (see Wiki for details)": "Diese ausführbare Datei nach erfolgreichem Untertitel-Download aufrufen (siehe Wiki für Details)", + "Check for correct folder permissions of every library on plugin start": "Korrekte Ordnerberechtigungen bei jedem Plugin-Start überprüfen", + "Use new style caching (for subliminal)": "Modernes Caching benutzen (für subliminal)", + "Low impact mode (for remote filesystems)": "Belastungsarmer Modus (für rechnerferne Dateisysteme)", + "Timeout for API requests sent to the PMS": "Timeout für Plex-API-Anfragen", + "HTTP proxy to use for providers (supports credentials)": "Benutze HTTP-Proxy für Untertitel-Anbieter (unterstützt Anmeldeinformationen)", + "How verbose should the logging be?": "Wie ausführlich soll die Protokollierung sein?", + "How many log backups to keep?": "Wie viele Protokoll-Sicherungen sollen behalten werden?", + "Log subtitle modification (debug)": "Untertitelmodifikationen protokollieren (debug)", + "Log to console (for development/debugging)": "Protokollausgabe in der Konsole (für Entwicklung/Debugging)", + "Collect anonymous usage statistics": "Anonyme Nutzungsstatistiken sammeln", + "Sonarr/Radarr (fill api info below)": "Sonarr/Radarr (API info unten ergänzen)", + "Filebot": "Filebot", + "Sonarr/Radarr/Filebot": "Sonarr/Radarr/Filebot", + "Symlink to original file": "Symbolischer Link zur Originaldatei", + "I keep the original filenames": "Ich behalte die originalen Dateinamen", + "none of the above": "keine dieser Optionen", + "exact: media filename match": "Exakt: Dateiname stimmt überein", + "loose: filename contains media filename": "Locker: Untertiteldateiname enthält Mediendateiname", + "any": "alle", + "prefer": "bevorzugen", + "don't prefer": "nicht bevorzugen", + "force HI": "HI erzwingen", + "force non-HI": "Non-HI erzwingen", + "don't change": "nicht ändern", + "white": "weiß", + "light-grey": "hellgrau", + "red": "rot", + "green": "grün", + "yellow": "gelb", + "blue": "blau", + "magenta": "Magentarot", + "cyan": "türkis", + "black": "schwarz", + "dark-red": "dunkelrot", + "dark-green": "dunkelgrün", + "dark-yellow": "ocker", + "dark-blue": "dunkelblau", + "dark-magenta": "dunkles Magentarot", + "dark-cyan": "dunkles Türkis", + "dark-grey": "dunkelgrau", + "current folder": "aktueller Ordner", + "never": "nie", + "current media item": "aktuelle Mediendatei", + "next episode (series)": "nächste Episode (Serien)", + "hybrid: current item or next episode": "hybrid: aktuelle Mediendatei oder nächste Episode", + "hybrid-plus: current item and next episode": "hybrid-plus: aktuelle Mediendatei und nächste Episode", + "every 6 hours": "alle 6 Stunden", + "every 12 hours": "alle 12 Stunden", + "every 24 hours": "alle 24 Stunden", + "1 days": "1 Tag", + "2 days": "2 Tage", + "3 days": "3 Tage", + "4 days": "4 Tage", + "1 weeks": "1 Woche", + "2 weeks": "2 Wochen", + "3 weeks": "3 Wochen", + "4 weeks": "4 Wochen", + "5 weeks": "5 Wochen", + "6 weeks": "6 Wochen", + "12 weeks": "12 Wochen", + "don't limit": "keine Limitierung", + "1 year": "1 Jahr", + "2 years": "2 Jahre", + "3 years": "3 Jahre", + "4 years": "4 Jahre", + "5 years": "5 Jahre", + "6 years": "6 Jahre", + "7 years": "7 Jahre", + "8 years": "8 Jahre", + "9 years": "9 Jahre", + "10 years": "10 Jahre", + "only agent": "nur Metadaten-Agent", + "disabled": "deaktiviert", + "advanced menu": "erweitertes Menü", + "CRITICAL": "CRITICAL", + "ERROR": "ERROR", + "WARNING": "WARNING", + "INFO": "INFO", + "DEBUG": "DEBUG", + "Force-find subtitles: %(item_title)s": "Erzwinge Suche nach Untertiteln: %(item_title)s", + "File %(file_part_index)s: ": "Datei %(file_part_index)s: ", + "%(part_summary)sNo current subtitle in storage": "%(part_summary)sKein aktueller Untertitel im Speicher", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sAktueller Untertitel: %(provider_name)s (hinzugefügt: %(date_added)s, %(mode)s), Sprache: %(language)s, Punktzahl: %(score)i, Speicher: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)s%(language)s-Untertitel verwalten", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)s%(language)s-Untertitel auflisten", + "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sEingebettete Untertitel (%(languages)s)", + "Select active %(language)s subtitle": "Aktiven %(language)s-Untertitel auswählen", "%(count)d subtitles in storage": "%(count)d Untertitel im Speicher", - "List available %(language)s subtitles": "List available %(language)s subtitles; Umlauttest ÜÜÜ ß 😁" + "List available %(language)s subtitles": "List available %(language)s subtitles; Umlauttest ÜÜÜ ß 😁", + "Modify current %(language)s subtitle": "Aktiven %(language)s-Untertitel modifizieren", + "Currently applied mods: %(mod_list)s": "Aktuell angewandte Modifikationen: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one": "Aktuellen %(language)s-Untertitel zur Sperrliste hinzufügen und nach einem neuen suchen", + "Manage blacklist (%(amount)s contained)": "Sperrliste verwalten (enthält %(amount)s)", + "%(current_state)s%(subtitle_name)s, Score: %(score)s": "%(current_state)s%(subtitle_name)s, Punktzahl: %(score)s", + "Current: ": "Aktuell: ", + "Stored: ": "Gespeichert: ", + "by %(release_group)s": "von %(release_group)s", + "Current: %(provider_name)s (%(score)s) ": "Aktuell: %(provider_name)s (%(score)s) ", + "Search for %(language)s subs (%(video_data)s)": "Nach %(language)s-Untertiteln suchen (%(video_data)s)", + "%(current_info)sFilename: %(filename)s": "%(current_info)sDateiname: %(filename)s", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "Suche nach %(language)s-Untertiteln (%(video_data)s), hier aktualisieren ...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": " (falsche FPS, Untertitel: %(subtitle_fps)s, Video: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": " (falsche FPS, Untertitel: %(subtitle_fps)s, Video: Unbekannt, belastungsarmer Modus aktiv)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, Punktzahl: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s": "Release: %(release_info)s, Übereinstimmungen: %(matches)s", + "Downloading subtitle for %(title_or_id)s": "Lade Untertitel für %(title_or_id)s herunter", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Stream mit Standard-Mods extrahieren: %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "Stream extrahieren: %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (hinzugefügt: %(date_added)s, %(mode)s), Sprache: %(language)s, Punktzahl: %(score)i, Speicher: %(storage_type)s", + "Insufficient permissions on library %(title)s, folder: %(path)s": "Ungenügende Berechtigungen der Bibliothek %(title)s, Ordner: %(path)s", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Läuft: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Display ignore list (%(ignored_count)d)": "Ignore-Liste anzeigen (%(ignored_count)d)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s bis %(until_date)s (%(reason)s)", + "Extracting subtitle %(stream_index)s of %(filename)s": "Extrahiere Untertitel %(stream_index)s von %(filename)s", + "Extract missing %(language)s embedded subtitles": "Extrahiere fehlende, eingebettete %(language)s-Untertitel", + "Extract and activate %(language)s embedded subtitles": "Extrahiere und aktiviere eingebettete %(language)s-Untertitel", + "None": "Keine", + "Idle": "Inaktiv", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "Adjust by %(time_and_unit)s": "Verschieben um %(time_and_unit)s", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "hinzugefügt: %(date_added)s, %(mode)s, Sprache: %(language)s, Punktzahl: %(score)i, Speicher: %(storage_type)s", + "Remove: %(mod_name)s": "%(mod_name)s entfernen", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Herunterladen von Untertitel fehlgeschlagen (%(item_id)s)", + "agent + interface": "Metadatenagent + Benutzeroberfläche", + "only interface": "nur Benutzeroberfläche", + "interface": "Benutzeroberfläche", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "Zeigt die aktuellen Medien und ermöglicht die (erzwungene) Aktualisierung derer Metadaten/Untertitel", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "Zeigt Medien mit fehlenden Untertiteln. Auf \"Finde zuletzt hinzugefügte Medien mit fehlenden Untertiteln\" klicken, um die Liste zu aktualisieren", + "Add %(kind)s %(title)s to the ignore list": "Füge %(kind)s %(title)s zur Ignore-Liste hinzu", + "Remove %(kind)s %(title)s from the ignore list": "Entferne %(kind)s %(title)s von der Ignore-Liste", + "%(title)s added to the ignore list": "%(title)s zur Ignore-Liste hinzugefügt", + "%(title)s removed from the ignore list": "%(title)s von der Ignore-Liste entfernt", + "Triggering refresh for %(title)s": "Stoße Aktualisierung an, für: %(title)s", + "Triggering forced refresh for %(title)s": "Stoße erzwungene Aktualisieren an, für %(title)s", + "Refresh of item %(item_id)s triggered": "Aktualisierung von %(item_id)s angestoßen", + "Forced refresh of item %(item_id)s triggered": "Erzwungene Aktualisierung von %(item_id)s angestoßen", + "Ignore %(kind)s \"%(title)s\"": "%(kind)s \"%(title)s\" ignorieren", + "Un-ignore %(kind)s \"%(title)s\"": "%(kind)s \"%(title)s\" nicht mehr ignorieren", + "Refreshing %(title)s": "Aktualisiere %(title)s", + "Force-refreshing %(title)s": "Erzwinge Aktualisierung von %(title)s", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Extrahiert die noch nicht extrahierten, eingebetteten Untertitel aller Episoden der aktuellen Staffel, mit allen konfigurierten Standard-Modifikationen", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "Extrahiert eingebettete Untertitel aller Episoden der aktuellen Staffel, mit allen konfigurierten Standard-Modifikationen", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Aktualisiert %(the_movie_series_season_episode)s, möglicherweise mit einer Suche nach fehlenden Untertiteln, sowie Auffinden von Untertiteln im Dateisystem", + "the movie": "den Film", + "the series": "die Serie", + "the episode": "die Episode", + "the season": "die Staffel" } \ No newline at end of file From 2ddd786819c0c45b5e3d2f2944ec39bd7c96c7c7 Mon Sep 17 00:00:00 2001 From: pannal Date: Thu, 5 Apr 2018 16:50:24 +0200 Subject: [PATCH 042/710] Update de.json (POEditor.com) --- Contents/Strings/de.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 48a7ff8d3..ebab698a3 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -314,24 +314,24 @@ "File %(file_part_index)s: ": "Datei %(file_part_index)s: ", "%(part_summary)sNo current subtitle in storage": "%(part_summary)sKein aktueller Untertitel im Speicher", "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sAktueller Untertitel: %(provider_name)s (hinzugefügt: %(date_added)s, %(mode)s), Sprache: %(language)s, Punktzahl: %(score)i, Speicher: %(storage_type)s", - "%(part_summary)sManage %(language)s subtitle": "%(part_summary)s%(language)s-Untertitel verwalten", - "%(part_summary)sList %(language)s subtitles": "%(part_summary)s%(language)s-Untertitel auflisten", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)s%(language)s: Untertitel verwalten", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)s%(language)s: Untertitel auflisten", "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sEingebettete Untertitel (%(languages)s)", - "Select active %(language)s subtitle": "Aktiven %(language)s-Untertitel auswählen", + "Select active %(language)s subtitle": "%(language)s: Aktiven Untertitel auswählen", "%(count)d subtitles in storage": "%(count)d Untertitel im Speicher", - "List available %(language)s subtitles": "List available %(language)s subtitles; Umlauttest ÜÜÜ ß 😁", - "Modify current %(language)s subtitle": "Aktiven %(language)s-Untertitel modifizieren", + "List available %(language)s subtitles": "%(language)s: Verfügbare Untertitel auflisten", + "Modify current %(language)s subtitle": "%(language)s: Aktiven Untertitel modifizieren", "Currently applied mods: %(mod_list)s": "Aktuell angewandte Modifikationen: %(mod_list)s", - "Blacklist current %(language)s subtitle and search for a new one": "Aktuellen %(language)s-Untertitel zur Sperrliste hinzufügen und nach einem neuen suchen", + "Blacklist current %(language)s subtitle and search for a new one": "%(language)s: Aktuellen Untertitel zur Sperrliste hinzufügen und nach einem neuen suchen", "Manage blacklist (%(amount)s contained)": "Sperrliste verwalten (enthält %(amount)s)", "%(current_state)s%(subtitle_name)s, Score: %(score)s": "%(current_state)s%(subtitle_name)s, Punktzahl: %(score)s", "Current: ": "Aktuell: ", "Stored: ": "Gespeichert: ", "by %(release_group)s": "von %(release_group)s", "Current: %(provider_name)s (%(score)s) ": "Aktuell: %(provider_name)s (%(score)s) ", - "Search for %(language)s subs (%(video_data)s)": "Nach %(language)s-Untertiteln suchen (%(video_data)s)", + "Search for %(language)s subs (%(video_data)s)": "%(language)s: Nach Untertiteln suchen (%(video_data)s)", "%(current_info)sFilename: %(filename)s": "%(current_info)sDateiname: %(filename)s", - "Searching for %(language)s subs (%(video_data)s), refresh here ...": "Suche nach %(language)s-Untertiteln (%(video_data)s), hier aktualisieren ...", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "%(language)s: Suche nach Untertiteln (%(video_data)s), hier aktualisieren ...", " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": " (falsche FPS, Untertitel: %(subtitle_fps)s, Video: %(media_fps)s)", " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": " (falsche FPS, Untertitel: %(subtitle_fps)s, Video: Unbekannt, belastungsarmer Modus aktiv)", "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, Punktzahl: %(score)s%(wrong_fps_state)s", @@ -345,9 +345,9 @@ "Display ignore list (%(ignored_count)d)": "Ignore-Liste anzeigen (%(ignored_count)d)", "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s bis %(until_date)s (%(reason)s)", "Extracting subtitle %(stream_index)s of %(filename)s": "Extrahiere Untertitel %(stream_index)s von %(filename)s", - "Extract missing %(language)s embedded subtitles": "Extrahiere fehlende, eingebettete %(language)s-Untertitel", - "Extract and activate %(language)s embedded subtitles": "Extrahiere und aktiviere eingebettete %(language)s-Untertitel", - "None": "Keine", + "Extract missing %(language)s embedded subtitles": "%(language)s: Extrahiere fehlende, eingebettete Untertitel", + "Extract and activate %(language)s embedded subtitles": "%(language)s: Extrahiere und aktiviere eingebettete Untertitel", + "None": "Nichts", "Idle": "Inaktiv", "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", "Adjust by %(time_and_unit)s": "Verschieben um %(time_and_unit)s", From f99f03dc33311a5ae4aa5f155158b03b966e852e Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 5 Apr 2018 16:50:58 +0200 Subject: [PATCH 043/710] i18n: inject _ into helpers; fix untranslated strings; display translated language name --- Contents/Code/interface/main.py | 8 ++++---- Contents/Code/interface/menu_helpers.py | 6 +++--- Contents/Code/support/__init__.py | 2 ++ Contents/Code/support/helpers.py | 8 +------- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index 2d3190f26..9e0e416c2 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -73,8 +73,8 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title(_("Working ... refresh here")), summary=_("Current state: %s; Last state: %s", - (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", - (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" + (Dict["current_refresh_state"] or _("Idle")) if "current_refresh_state" in Dict else _("Idle"), + (Dict["last_refresh_state"] or _("None")) if "last_refresh_state" in Dict else _("None") ) )) @@ -152,8 +152,8 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title(_("Refresh")), summary=_("Current state: %s; Last state: %s", - (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", - (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" + (Dict["current_refresh_state"] or _("Idle")) if "current_refresh_state" in Dict else _("Idle"), + (Dict["last_refresh_state"] or _("None")) if "last_refresh_state" in Dict else _("None") ), thumb=R("icon-refresh.jpg") )) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 737531842..e1d46a106 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -55,9 +55,9 @@ def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None oc.add(DirectoryObject( key=Callback(callback_menu, kind=use_kind, rating_key=rating_key, title=title), - title=t % ( - ignore_list.verbose(kind) if add_kind else "", - unicode(title)) + title=_(t, + kind=ignore_list.verbose(kind) if add_kind else "", + title=unicode(title)) ) ) diff --git a/Contents/Code/support/__init__.py b/Contents/Code/support/__init__.py index 06ab61e5c..4cb998b12 100644 --- a/Contents/Code/support/__init__.py +++ b/Contents/Code/support/__init__.py @@ -17,6 +17,8 @@ sys.modules["support.i18n"] = i18n +helpers._ = i18n._ + import plex_media sys.modules["support.plex_media"] = plex_media diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 9e16237ab..fe450cb07 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -370,13 +370,7 @@ def get_language(lang_short): def display_language(l): - addons = [] - if l.country: - addons.append(l.country.alpha2) - if l.script: - addons.append(l.script.code) - - return l.name if not addons else "%s (%s)" % (l.name, ", ".join(addons)) + return _(str(l)) def is_stream_forced(stream): From 1c7b9145c80d1ab2a091292bfdaf0726a0ee1a1a Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 5 Apr 2018 16:57:07 +0200 Subject: [PATCH 044/710] i18n: add missing modification translations --- Contents/Code/interface/sub_mod.py | 8 ++++---- .../Shared/subzero/modification/mods/fps.py | 2 +- .../Shared/subzero/modification/mods/offset.py | 2 +- Contents/Strings/en.json | 18 +++++++++++++++++- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Contents/Code/interface/sub_mod.py b/Contents/Code/interface/sub_mod.py index 24daa4481..0925130cc 100644 --- a/Contents/Code/interface/sub_mod.py +++ b/Contents/Code/interface/sub_mod.py @@ -49,25 +49,25 @@ def SubtitleModificationsMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=identifier, mode="add", randomize=timestamp(), **kwargs), - title=pad_title(mod.description), summary=mod.long_description or "" + title=pad_title(_(mod.description)), summary=_(mod.long_description) or "" )) fps_mod = SubtitleModifications.get_mod_class("change_FPS") oc.add(DirectoryObject( key=Callback(SubtitleFPSModMenu, randomize=timestamp(), **kwargs), - title=pad_title(fps_mod.description), summary=fps_mod.long_description or "" + title=pad_title(_(fps_mod.description)), summary=_(fps_mod.long_description) or "" )) shift_mod = SubtitleModifications.get_mod_class("shift_offset") oc.add(DirectoryObject( key=Callback(SubtitleShiftModUnitMenu, randomize=timestamp(), **kwargs), - title=pad_title(shift_mod.description), summary=shift_mod.long_description or "" + title=pad_title(_(shift_mod.description)), summary=_(shift_mod.long_description) or "" )) color_mod = SubtitleModifications.get_mod_class("color") oc.add(DirectoryObject( key=Callback(SubtitleColorModMenu, randomize=timestamp(), **kwargs), - title=pad_title(color_mod.description), summary=color_mod.long_description or "" + title=pad_title(_(color_mod.description)), summary=_(color_mod.long_description) or "" )) if current_mods: diff --git a/Contents/Libraries/Shared/subzero/modification/mods/fps.py b/Contents/Libraries/Shared/subzero/modification/mods/fps.py index 4947a791d..3a618f6bf 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/fps.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/fps.py @@ -16,7 +16,7 @@ class ChangeFPS(SubtitleModification): modifies_whole_file = True long_description = """\ - Re-syncs the subtitle to the framerate of the current media file. + Re-syncs the subtitle to the framerate of the current media file. """ def modify(self, content, debug=False, parent=None, **kwargs): diff --git a/Contents/Libraries/Shared/subzero/modification/mods/offset.py b/Contents/Libraries/Shared/subzero/modification/mods/offset.py index 705e714e9..409148dc2 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/offset.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/offset.py @@ -17,7 +17,7 @@ class ShiftOffset(SubtitleModification): modifies_whole_file = True long_description = """\ - Adds or substracts a certain amount of time from the whole subtitle to match your media + Adds or substracts a certain amount of time from the whole subtitle to match your media """ @classmethod diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 47a90aa36..220c9a47a 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -377,5 +377,21 @@ "ERROR":"ERROR", "WARNING":"WARNING", "INFO":"INFO", - "DEBUG":"DEBUG" + "DEBUG":"DEBUG", + "Change the color of the subtitle":"Change the color of the subtitle", + "Adds the requested color to every line of the subtitle. Support depends on player.":"Adds the requested color to every line of the subtitle. Support depends on player.", + "Basic common fixes":"Basic common fixes", + "Fix common and whitespace/punctuation issues in subtitles":"Fix common and whitespace/punctuation issues in subtitles", + "Remove all style tags":"Remove all style tags", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.":"Removes all possible style tags from the subtitle, such as font, bold, color etc.", + "Reverse punctuation in RTL languages":"Reverse punctuation in RTL languages", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew":"Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew", + "Change the FPS of the subtitle":"Change the FPS of the subtitle", + "Re-syncs the subtitle to the framerate of the current media file.":"Re-syncs the subtitle to the framerate of the current media file.", + "Remove Hearing Impaired tags":"Remove Hearing Impaired tags", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people":"Removes tags, text and characters from subtitles that are meant for hearing impaired people", + "Fix common OCR issues":"Fix common OCR issues", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR":"Fix issues that happen when a subtitle gets converted from bitmap to text through OCR", + "Change the timing of the subtitle":"Change the timing of the subtitle", + "Adds or substracts a certain amount of time from the whole subtitle to match your media":"Adds or substracts a certain amount of time from the whole subtitle to match your media" } From 8c4372d0d33dd37deabccc220cd41bb9f2f5c825 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 5 Apr 2018 17:11:45 +0200 Subject: [PATCH 045/710] i18n: add missing translations; fix summary passthrough with explicit unicode casting --- Contents/Code/interface/item_details.py | 19 +++++++++++-------- Contents/Strings/en.json | 4 +++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index 05c22671b..80d6c1fa5 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -119,11 +119,11 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra part_id = str(part.id) part_index += 1 - part_index_addon = "" - part_summary_addon = "" + part_index_addon = u"" + part_summary_addon = u"" if has_multiple_parts: part_index_addon = _(u"File %(file_part_index)s: ", file_part_index=part_index) - part_summary_addon = "%s " % filename + part_summary_addon = u"%s " % filename # iterate through all configured languages for lang in config.lang_list: @@ -216,7 +216,7 @@ def SubtitleOptionsMenu(**kwargs): rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] - current_data = kwargs["current_data"] + current_data = unicode(kwargs["current_data"]) current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) subs_count = stored_subs.count(part_id, language) @@ -226,7 +226,7 @@ def SubtitleOptionsMenu(**kwargs): key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), title=_(u"< Back to %s", kwargs["title"]), - summary=kwargs["current_data"], + summary=current_data, thumb=default_thumb )) if subs_count: @@ -239,7 +239,7 @@ def SubtitleOptionsMenu(**kwargs): oc.add(DirectoryObject( key=Callback(ListAvailableSubsForItemMenu, randomize=timestamp(), **kwargs), title=_(u"List available %(language)s subtitles", language=kwargs["language_name"]), - summary=kwargs["current_data"] + summary=current_data )) if current_sub: oc.add(DirectoryObject( @@ -423,6 +423,7 @@ def ManageBlacklistMenu(**kwargs): part_id = kwargs["part_id"] language = kwargs["language"] remove_sub_key = kwargs.pop("remove_sub_key", None) + current_data = unicode(kwargs["current_data"]) current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) current_bl, subs = stored_subs.get_blacklist(part_id, language) @@ -439,7 +440,7 @@ def ManageBlacklistMenu(**kwargs): key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), title=_(u"< Back to %s", kwargs["title"]), - summary=kwargs["current_data"], + summary=current_data, thumb=default_thumb )) @@ -480,6 +481,8 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item running = scheduler.is_task_running("AvailableSubsForItem") search_results = get_item_task_data("AvailableSubsForItem", rating_key, language) + current_data = unicode(current_data) if current_data else None + if (search_results is None or force) and not running: scheduler.dispatch_task("AvailableSubsForItem", rating_key=rating_key, item_type=item_type, part_id=part_id, language=language) @@ -582,7 +585,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item subtitle_id=str(subtitle.id), language=language), title=_(u"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", blacklisted_state=bl_addon, - current_state="Available" if current_id != subtitle.id else "Current", + current_state=_("Available") if current_id != subtitle.id else _("Current"), provider_name=subtitle.provider_name, score=subtitle.score, wrong_fps_state=wrong_fps_addon), diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 220c9a47a..06bdc3298 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -393,5 +393,7 @@ "Fix common OCR issues":"Fix common OCR issues", "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR":"Fix issues that happen when a subtitle gets converted from bitmap to text through OCR", "Change the timing of the subtitle":"Change the timing of the subtitle", - "Adds or substracts a certain amount of time from the whole subtitle to match your media":"Adds or substracts a certain amount of time from the whole subtitle to match your media" + "Adds or substracts a certain amount of time from the whole subtitle to match your media":"Adds or substracts a certain amount of time from the whole subtitle to match your media", + "Available":"Available", + "Current":"Current" } From d47ad013cd2a4e0b7aac389cb15975ba73b90c81 Mon Sep 17 00:00:00 2001 From: pannal Date: Thu, 5 Apr 2018 17:26:09 +0200 Subject: [PATCH 046/710] Update de.json (POEditor.com) --- Contents/Strings/de.json | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index ebab698a3..28d15791a 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -377,5 +377,23 @@ "the movie": "den Film", "the series": "die Serie", "the episode": "die Episode", - "the season": "die Staffel" + "the season": "die Staffel", + "Change the color of the subtitle": "Untertitel-Farben ändern", + "Adds the requested color to every line of the subtitle. Support depends on player.": "Fügt die gewählte Farbe zu jeder Untertitelzeile hinzu. Wird nicht von jedem Abspielgerät unterstützt", + "Basic common fixes": "Behebe häufige Probleme in Untertiteln", + "Fix common and whitespace/punctuation issues in subtitles": "Behebe häufige und Leerraum/Zeichensetzungs-Probleme in Untertiteln", + "Remove all style tags": "Entferne alle Textformatierungen", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.": "Entfernt alle möglichen Textformatierungen von Untertiteln, wie z. B. Schriftart, Fettschrift, Farben etc.", + "Reverse punctuation in RTL languages": "Zeichensetzung in linksläufigen Schriften umkehren", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew": "Einige Abspielgeräte verarbeiten nötige Marker für linksläufige Schriften nicht korrekt. Invertiere die Zeichensetzung, um dies zu beheben. Anwendbar auf: hebräisch", + "Change the FPS of the subtitle": "Ändern der Bildwiederholrate des Untertitels", + "Re-syncs the subtitle to the framerate of the current media file.": "Synchronisiert den Untertitel zur Bildwiederholrate der Mediendatei.", + "Remove Hearing Impaired tags": "Inhalte für Hörgeschädigte von heruntergeladenen Untertiteln entfernen", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people": "Entfernt Markierungen, Text und Zeichen von Untertiteln, die Inhalte für Hörgeschädigte enthalten", + "Fix common OCR issues": "Häufige Texterkennungsfehler in Untertiteln beheben", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR": "Behebt Fehler, die auftreten, wenn ein Untertitel vom Bitmap-Format zu Text konvertiert werden (OCR).", + "Change the timing of the subtitle": "Die zeitliche Abstimmung des Untertitels ändern", + "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Verschiebt den Untertitel um eine bestimmte Zeiteinheit", + "Available": "Verfügbar", + "Current": "Aktuell" } \ No newline at end of file From f3754de394edcb90bc77e05c0088f54c774e34c7 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 5 Apr 2018 17:34:59 +0200 Subject: [PATCH 047/710] i18n: make mod descriptions properly translatable; fix current mods display --- Contents/Code/interface/sub_mod.py | 10 +++++----- .../Shared/subzero/modification/mods/color.py | 4 +--- .../Shared/subzero/modification/mods/common.py | 14 ++++---------- .../Shared/subzero/modification/mods/fps.py | 4 +--- .../subzero/modification/mods/hearing_impaired.py | 4 +--- .../Shared/subzero/modification/mods/ocr_fixes.py | 4 +--- .../Shared/subzero/modification/mods/offset.py | 4 +--- 7 files changed, 14 insertions(+), 30 deletions(-) diff --git a/Contents/Code/interface/sub_mod.py b/Contents/Code/interface/sub_mod.py index 0925130cc..5cb167039 100644 --- a/Contents/Code/interface/sub_mod.py +++ b/Contents/Code/interface/sub_mod.py @@ -33,7 +33,7 @@ def SubtitleModificationsMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SubtitleOptionsMenu, randomize=timestamp(), **kwargs), title=_(u"< Back to subtitle options for: %s", kwargs["title"]), - summary=kwargs["current_data"], + summary=unicode(kwargs["current_data"]), thumb=default_thumb )) @@ -74,23 +74,23 @@ def SubtitleModificationsMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="remove_last", randomize=timestamp(), **kwargs), title=pad_title(_("Remove last applied mod (%s)", current_mods[-1])), - summary=_(u"Currently applied mods: %s", ", ".join(current_mods) if current_mods else _("none")) + summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods) if current_mods else _("none")) )) oc.add(DirectoryObject( key=Callback(SubtitleListMods, randomize=timestamp(), **kwargs), title=pad_title(_("Manage applied mods")), - summary=_(u"Currently applied mods: %s", ", ".join(current_mods)) + summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods)) )) oc.add(DirectoryObject( key=Callback(SubtitleReapplyMods, randomize=timestamp(), **kwargs), title=pad_title(_("Reapply applied mods")), - summary=_(u"Currently applied mods: %s", ", ".join(current_mods) if current_mods else _("none")) + summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods) if current_mods else _("none")) )) oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="clear", randomize=timestamp(), **kwargs), title=pad_title(_("Restore original version")), - summary=_(u"Currently applied mods: %s", ", ".join(current_mods) if current_mods else _("none")) + summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods) if current_mods else _("none")) )) storage.destroy() diff --git a/Contents/Libraries/Shared/subzero/modification/mods/color.py b/Contents/Libraries/Shared/subzero/modification/mods/color.py index d837ff366..9e883b101 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/color.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/color.py @@ -39,9 +39,7 @@ class Color(SubtitleModification): colors = COLOR_MAP - long_description = """\ - Adds the requested color to every line of the subtitle. Support depends on player. - """ + long_description = "Adds the requested color to every line of the subtitle. Support depends on player." def modify(self, content, debug=False, parent=None, **kwargs): color = self.colors.get(kwargs.get("name")) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 8d7b34b1d..ec4fd8196 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -15,9 +15,7 @@ class CommonFixes(SubtitleTextModification): exclusive = True order = 40 - long_description = """\ - Fix common and whitespace/punctuation issues in subtitles - """ + long_description = "Fix common and whitespace/punctuation issues in subtitles" processors = [ # -- = em dash @@ -105,9 +103,7 @@ class RemoveTags(SubtitleModification): exclusive = True modifies_whole_file = True - long_description = """\ - Removes all possible style tags from the subtitle, such as font, bold, color etc. - """ + long_description = "Removes all possible style tags from the subtitle, such as font, bold, color etc." def modify(self, content, debug=False, parent=None, **kwargs): for entry in parent.f: @@ -122,10 +118,8 @@ class ReverseRTL(SubtitleModification): order = 50 languages = [Language("heb")] - long_description = """\ - Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. - Applicable to languages: hebrew - """ + long_description = "Some playback devices don't properly handle right-to-left markers for punctuation. " \ + "Physically swap punctuation. Applicable to languages: hebrew" processors = [ # new? (?u)(^([\s.!?]*)(.+?)(\s*)(-?\s*)$); \5\4\3\2 diff --git a/Contents/Libraries/Shared/subzero/modification/mods/fps.py b/Contents/Libraries/Shared/subzero/modification/mods/fps.py index 3a618f6bf..b209eddff 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/fps.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/fps.py @@ -15,9 +15,7 @@ class ChangeFPS(SubtitleModification): advanced = True modifies_whole_file = True - long_description = """\ - Re-syncs the subtitle to the framerate of the current media file. - """ + long_description = "Re-syncs the subtitle to the framerate of the current media file." def modify(self, content, debug=False, parent=None, **kwargs): fps_from = kwargs.get("from") diff --git a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py index c5ab9900d..3aa35413d 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py @@ -22,9 +22,7 @@ class HearingImpaired(SubtitleTextModification): exclusive = True order = 20 - long_description = """\ - Removes tags, text and characters from subtitles that are meant for hearing impaired people - """ + long_description = "Removes tags, text and characters from subtitles that are meant for hearing impaired people" processors = [ # full bracket entry, single or multiline; starting with brackets and ending with brackets diff --git a/Contents/Libraries/Shared/subzero/modification/mods/ocr_fixes.py b/Contents/Libraries/Shared/subzero/modification/mods/ocr_fixes.py index b817621ee..f5876ade6 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/ocr_fixes.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/ocr_fixes.py @@ -19,9 +19,7 @@ class FixOCR(SubtitleTextModification): order = 10 data_dict = None - long_description = """\ - Fix issues that happen when a subtitle gets converted from bitmap to text through OCR - """ + long_description = "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR" def __init__(self, parent): super(FixOCR, self).__init__(parent) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/offset.py b/Contents/Libraries/Shared/subzero/modification/mods/offset.py index 409148dc2..affb78efe 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/offset.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/offset.py @@ -16,9 +16,7 @@ class ShiftOffset(SubtitleModification): args_mergeable = True modifies_whole_file = True - long_description = """\ - Adds or substracts a certain amount of time from the whole subtitle to match your media - """ + long_description = "Adds or substracts a certain amount of time from the whole subtitle to match your media" @classmethod def merge_args(cls, args1, args2): From 4cbfa21b52221d0298b37e3f03f23a78d5c688f1 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 5 Apr 2018 17:36:34 +0200 Subject: [PATCH 048/710] i18n: debug i18n: recognize %i when checking strings --- Contents/Code/support/i18n.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/support/i18n.py b/Contents/Code/support/i18n.py index 87e985ad8..884c131e8 100644 --- a/Contents/Code/support/i18n.py +++ b/Contents/Code/support/i18n.py @@ -19,7 +19,7 @@ def get_localization_module(): def old_style_placeholders_count(s): # fixme: incomplete, use regex - return sum(s.count(c) for c in ["%s", "%d", "%r", "%f"]) + return sum(s.count(c) for c in ["%s", "%d", "%r", "%f", "%i"]) def check_old_style_placeholders(k, args): From c198788017040f2f448d934e61469316143b16d7 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 5 Apr 2018 18:01:28 +0200 Subject: [PATCH 049/710] i18n: defaultlocale placeholder --- Contents/Code/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 0ee193bc2..c1da3cdc7 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -46,6 +46,8 @@ def Start(): intent = get_intent() intent.cleanup() + #Locale.DefaultLocale = "de" + # clear expired menu history items now = datetime.datetime.now() if "menu_history" in Dict: From 77a74c883944e7652fb037903ec56db4f25a1ba1 Mon Sep 17 00:00:00 2001 From: ukdtom Date: Thu, 5 Apr 2018 18:59:07 +0200 Subject: [PATCH 050/710] Updated danish a tad --- Contents/Strings/da.json | 424 ++++++++++++++++++++------------------- 1 file changed, 220 insertions(+), 204 deletions(-) diff --git a/Contents/Strings/da.json b/Contents/Strings/da.json index 186a6b5a0..21e8ff731 100644 --- a/Contents/Strings/da.json +++ b/Contents/Strings/da.json @@ -1,60 +1,60 @@ { "sq": "Albansk", "ar": "Arabisk", - "be": "", - "bs": "", - "bg": "", - "ca": "", + "be": "Hviderussisk", + "bs": "Bosnisk", + "bg": "Bulgarisk", + "ca": "Catalansk", "zh": "Kinesisk", - "hr": "", - "cs": "", + "hr": "Kroatisk", + "cs": "Tjekkisk", "da": "Dansk", "nl": "Hollansk", "en": "Engelsk", - "et": "", - "fa": "", + "et": "Estisk", + "fa": "Persisk", "fi": "Finsk", "fr": "Fransk", "de": "Tysk", "el": "Græsk", - "he": "", + "he": "Hebrarisk", "hi": "Hindi", - "hu": "", + "hu": "Ungarsk", "is": "Islansk", - "id": "", + "id": "Indonesisk", "it": "Italiensk", - "ja": "", - "ko": "", - "lv": "", - "lt": "", - "mk": "", - "ms": "", + "ja": "Japansk", + "ko": "Koreansk", + "lv": "Lettisk", + "lt": "Litauisk", + "mk": "Makedonsk", + "ms": "Malajsisk", "no": "Norsk", "pl": "Polsk", - "pt": "", - "pt-br": "", - "ro": "", - "ru": "", - "sr": "", - "sr-cyrl": "", - "sr-latn": "", - "sk": "", - "sl": "", + "pt": "Portugisisk", + "pt-br": "Portugisisk (Brasiliansk)", + "ro": "Romansk", + "ru": "Russisk", + "sr": "Serbisk", + "sr-cyrl": "Serbisk (Cyrillic)", + "sr-latn": "Serbisk (Latin)", + "sk": "Slovakisk", + "sl": "Slovensk", "es": "Spansk", - "sv": "", - "th": "", - "tr": "", - "uk": "", - "vi": "", - "Internal stuff, pay attention!": "", - "Advanced": "", - "advanced": "", + "sv": "Svensk", + "th": "Thaisk", + "tr": "Tyrkisk", + "uk": "Ukrainsk", + "vi": "Vietnamesisk", + "Internal stuff, pay attention!": "Intern ting, være opmærksom!", + "Advanced": "Avanceret", + "advanced": "avanceret", "Enter PIN": "Indtast Pin", - "The owner has restricted the access to this menu. Please enter the correct pin": "", + "The owner has restricted the access to this menu. Please enter the correct pin": "Ejeren har begrænset adgangen til denne menu. Venligst indtast den rigtige PIN kode", "Restart the plugin": "Genstart Plugin", "Get my logs (copy the appearing link and open it in your browser, please)": "", "Copy the appearing link and open it in your browser, please": "", - "Trigger find better subtitles": "", + "Trigger find better subtitles": "Trigger find bedre undertekster", "Skip next find better subtitles (sets last run to now)": "", "Trigger subtitle storage maintenance": "", "Trigger subtitle storage migration (expensive)": "", @@ -69,56 +69,54 @@ "Invalidate Sub-Zero metadata caches (subliminal)": "", "Reset provider throttle states": "", "Restarting the plugin": "Genstarter plugin", - "Restart triggered, please wait about 5 seconds": "", - "Reset subtitle storage": "", + "Restart triggered, please wait about 5 seconds": "Genstart aktiveret, vent venligst ca. 5 sekunder", + "Reset subtitle storage": "Nulstil undertekst lager", "Are you sure?": "Er du sikker?", "Are you really sure?": "Er du helt sikker?", - "Success": "", + "Success": "Success", "FindBetterSubtitles triggered": "", "FindBetterSubtitles skipped": "", "SubtitleStorageMaintenance triggered": "", "MigrateSubtitleStorage triggered": "", "TriggerCacheMaintenance triggered": "", - "This may take some time ...": "", - "Download Logs": "", - "Sorry, feature unavailable": "", - "Universal Plex token not available": "", - "Copy this link and open this in your browser, please": "", - "Cache invalidated": "", + "This may take some time ...": "Dette kan tage et stykke tid ...", + "Download Logs": "Download logs", + "Sorry, feature unavailable": "Beklager, men ikke tilgængelig", + "Universal Plex token not available": "Universal Plex token er ikke tilgængelig", + "Copy this link and open this in your browser, please": "Kopier venligst dette link, og åben i en browser", + "Cache invalidated": "Cache invalideret", "Enter PIN number ": "Indtast PIN nummer ", "PIN correct": "PIN korrekt", "Reset": "Nulstil", - "Menu locked": "", + "Menu locked": "Menu låst", "Provider throttles reset": "", "Information Storage (%s) reset": "", "Information Storage (%s) logged": "", "Plex didn't return any information about the item, please refresh it and come back later": "", "Item not found: %s!": "Media ikke fundet: %s!", "< Back to %s": "< Tilbage til %s", - "Back to %s > %s": "", - "Refresh: %s": "", - "Issues a forced refresh, ignoring known subtitles and searching for new ones": "", - "Extract and activate embedded subtitle streams": "", - "Inspect currently blacklisted subtitles": "", + "Back to %s > %s": "Tilbage til %s > %s", + "Refresh: %s": "Opdater: %s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Start en tvungen opdatering, ignorer kendte undertekster, og søg for nye", + "Extract and activate embedded subtitle streams": "Extrakt og aktiver undertekster fra selve mediet", + "Inspect currently blacklisted subtitles": "Undersøg nuværende undertekster i karantæne", "Subtitle saved to disk": "Undertekster gemt på disk", - "Remove subtitle from blacklist": "", + "Remove subtitle from blacklist": "Fjern undertekst fra karantæne", "No subtitles found": "Ingen undertekster fundet", " (unknown)": " (Ukendt)", " (forced)": " (Trunget)", "Extracting of embedded subtitle %s of part %s:%s triggered": "", - "Insufficient permissions": "", + "Insufficient permissions": "Utilstrækkelig rettigheder", "I'm not enabled!": "Jeg er ikke aktiveret!", "Please enable me for some of your libraries in your server settings; currently I do nothing": "", - "Working ... refresh here": "", - "Current state: %s; Last state: %s": "", + "Working ... refresh here": "Arbejder ... Opdater her", + "Current state: %s; Last state: %s": "Nuværende status: %s; Sidste status: %s", "On-deck items": "", - "Shows the current on deck items and allows you to individually (force-) refresh their metadata subtitles.": "", "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "", - "Recently-added items": "", - "Recently played items": "", + "Recently-added items": "Nylig tilføjet media", + "Recently played items": "Nylig afspillet media", "Shows the recently added items per section.": "", "Show recently added items with missing subtitles": "", - "Lists items with missing subtitles. Click on Find recent items with missing subs to update list": "", "Browse all items": "", "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "", "Last run: %s; Next scheduled run: %s; Last runtime: %s": "", @@ -127,87 +125,72 @@ "Show the current ignore list (mainly used for the automatic tasks)": "", "History": "Historie", "Show the last %i downloaded subtitles": "", - "Refresh": "", + "Refresh": "Opdater", "Re-lock menu(s)": "", "Enabled the PIN again for menu(s)": "", "Throttled providers: %s": "", "Advanced functions": "", - "Use at your own risk": "", + "Use at your own risk": "Brug for egen risiko", "Items On Deck": "", "Recently Played": "", - "Items with missing subtitles": "", + "Items with missing subtitles": "Medias der mangler undertekster", "Find recent items with missing subtitles": "", - "Updating, refresh here ...": "", - "Missing: %s": "", - "Add": "", - "Remove": "", - "to": "", - "from": "", - "add": "", - "remove": "", - "removed from": "", - "added to": "", + "Updating, refresh here ...": "Opdaterer, klik her for ny status ...", + "Missing: %s": "Mangler: %s", "Didn't change the ignore list": "", - "Sections": "", - "All": "", - "Un-Ignore": "", - "Ignore": "", - "show": "", - "movie": "", - "Force-": "", - "<< Back to home": "", - "Extracts the not yet extracted embedded subtitles of all episodes for the current season ": "", - "with all configured default modifications": "", - "Extracts embedded subtitles of all episodes for the current season ": "", - "Auto-Find subtitles: %s": "", + "Sections": "Sektion", + "All": "Alle", + "show": "Show", + "movie": "film", + "<< Back to home": "<< Tilbage til hoved menu", + "Auto-Find subtitles: %s": "Auto-Find undertekster: %s", "Extracting of embedded subtitles for %s triggered": "", - "Forced-refresh": "", - "< Back to subtitle options for: %s": "", + "< Back to subtitle options for: %s": "< Tilbage til undertekst muligheder for: %s", "Remove last applied mod (%s)": "", - "none": "", + "none": "ingen", "Manage applied mods": "", "Reapply applied mods": "", "Restore original version": "", "< Back to subtitle modification menu": "", - "subs constantly getting faster": "", - "subs constantly getting slower": "", - "< Back to subtitle modifications": "", + "subs constantly getting faster": "Undertekster bliver konstant hurtigere", + "subs constantly getting slower": "Undertekster bliver konstant langsommere", + "< Back to subtitle modifications": "< Tilbage til undertekst ændringer", "< Back to unit selection": "", - "Subtitle Language (1)": "", - "Subtitle Language (2)": "", - "Subtitle Language (3)": "", + "Subtitle Language (1)": "Undertekst sprog (1)", + "Subtitle Language (2)": "Undertekst sprog (2)", + "Subtitle Language (3)": "Undertekst sprog (3)", "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "", "Only download foreign/forced subtitles": "", "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "", "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "", "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "", "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "", - "I rename my files using": "", + "I rename my files using": "Jeg omdøber mine filer med", "Retrieve original filename from .file_info/file_info index files (see wiki)": "", "Sonarr URL (add URL base if configured)": "", - "Sonarr API key": "", + "Sonarr API key": "Sonarr API key", "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "", - "Radarr API key": "", - "Provider: Enable OpenSubtitles": "", - "Opensubtitles Username": "", - "Opensubtitles Password": "", - "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "", - "Provider: Enable Podnapisi.NET": "", - "Provider: Enable Titlovi.com": "", - "Provider: Enable Addic7ed": "", - "Addic7ed Username": "", - "Addic7ed Password": "", + "Radarr API key": "Radarr API key", + "Provider: Enable OpenSubtitles": "Provider: Aktiver OpenSubtitles", + "Opensubtitles Username": "Opensubtitles Brugernavn", + "Opensubtitles Password": "Opensubtitles Kodeord", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "OpenSubtitles VIP? (reklamefri undertekster, 1000 undertekster/dag, no-cache VIP server: http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET": "Provider: Aktiver Podnapisi.NET", + "Provider: Enable Titlovi.com": "Provider: Aktiver Titlovi.com", + "Provider: Enable Addic7ed": "Provider: Aktiver Addic7ed", + "Addic7ed Username": "Addic7ed Brugernavn", + "Addic7ed Password": "Addic7ed Kodeord", "Addic7ed: boost score (if requirements met)": "", "Addic7ed: Use random user agents": "", "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "", - "Legendas TV Username": "", - "Legendas TV Password": "", + "Legendas TV Username": "Legendas TV Brugernavn", + "Legendas TV Password": "Legendas TV Kodeord", "Provider: Enable TVsubtitles.net": "", - "Provider: Enable NapiProjekt.pl (Polish)": "", - "Provider: Enable SubScene (TV shows)": "", + "Provider: Enable NapiProjekt.pl (Polish)": "Provider: Aktiver NapiProjekt.pl (Polsk)", + "Provider: Enable SubScene (TV shows)": "Provider: Aktiver SubScene (TV shows)", "Provider: Enable hosszupuskasub.com (Hungarian)": "", - "Provider: Enable aRGENTeaM (Spanish)": "", - "Search enabled providers simultaneously (multithreading)": "", + "Provider: Enable aRGENTeaM (Spanish)": "Provider: Aktiver aRGENTeaM (Spansk)", + "Search enabled providers simultaneously (multithreading)": "Søg flere providers samtidigt (multithreading)", "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "", "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "", "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "", @@ -216,14 +199,14 @@ "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "", "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "", "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "", - "Download hearing impaired subtitles.": "", - "Remove Hearing Impaired tags from downloaded subtitles": "", - "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "", - "Fix common issues in subtitles": "", + "Download hearing impaired subtitles.": "Hent undertekster for hørehæmmet", + "Remove Hearing Impaired tags from downloaded subtitles": "Fjern hørehæmmet dele fra undertekst", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Fjern formatering fra hentede undertekster (fremhævet, kursiv, understreget, farver ...)", + "Fix common issues in subtitles": "Fix std. fejl med undertekster", "Fix common OCR errors in downloaded subtitles": "", "Reverse punctuation in RTL languages (heb)": "", - "Change colors of subtitles to": "", - "Store subtitles next to media files (instead of metadata)": "", + "Change colors of subtitles to": "Skift farve på undertekster til", + "Store subtitles next to media files (instead of metadata)": "Gem undertekster sammen med medie (Istedet for internt i Plex)", "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "", "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "", "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "", @@ -243,94 +226,90 @@ "How many download tries per subtitle (on timeout or error)": "", "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "", "Ignore anything in the following paths (comma-separated)": "", - "Sub-Zero mode": "", - "Access PIN (any amount of numbers, 0-9)": "", - "Access PIN valid for minutes": "", + "Sub-Zero mode": "Sub-Zero mode", + "Access PIN (any amount of numbers, 0-9)": "PIN (tilfældig antal af nummere , 0-9)", + "Access PIN valid for minutes": "Pin er gyldig i minutter", "Use PIN to restrict access to (needs plugin or PMS restart)": "", "Call this executable upon successful subtitle download (see Wiki for details)": "", "Check for correct folder permissions of every library on plugin start": "", "Use new style caching (for subliminal)": "", "Low impact mode (for remote filesystems)": "", - "Timeout for API requests sent to the PMS": "", + "Timeout for API requests sent to the PMS": "Timeout for kommunikation med Plex server", "HTTP proxy to use for providers (supports credentials)": "", "How verbose should the logging be?": "", "How many log backups to keep?": "", "Log subtitle modification (debug)": "", - "Log to console (for development/debugging)": "", + "Log to console (for development/debugging)": "Log til console (for udvikling/fejlfinding)", "Collect anonymous usage statistics": "", "Sonarr/Radarr (fill api info below)": "", - "Filebot": "", - "Sonarr/Radarr/Filebot": "", + "Filebot": "Filebot", + "Sonarr/Radarr/Filebot": "Sonarr/Radarr/Filebot", "Symlink to original file": "", - "I keep the original filenames": "", - "none of the above": "", + "I keep the original filenames": "Jeg beholder de orginale fil navne", + "none of the above": "Ingen af ovenstående", "exact: media filename match": "", "loose: filename contains media filename": "", - "any": "", - "prefer": "", - "don't prefer": "", - "force HI": "", - "force non-HI": "", - "don't change": "", - "white": "", - "light-grey": "", - "red": "", - "green": "", - "yellow": "", - "blue": "", - "magenta": "", - "cyan": "", - "black": "", - "dark-red": "", - "dark-green": "", - "dark-yellow": "", - "dark-blue": "", - "dark-magenta": "", - "dark-cyan": "", - "dark-grey": "", - "current folder": "", - "never": "", + "any": "alle", + "prefer": "foretræk", + "don't prefer": "foretræk ikke", + "force HI": "brug kun hørehæmmet", + "force non-HI": "brug ikke hørehæmmet", + "don't change": "skift ikke", + "white": "hvid", + "light-grey": "lysegrå", + "red": "rød", + "green": "grøn", + "yellow": "gul", + "blue": "blå", + "magenta": "magenta", + "cyan": "cyan", + "black": "sort", + "dark-red": "mørkerød", + "dark-green": "mørkegrøn", + "dark-yellow": "mørkegul", + "dark-blue": "mørkeblå", + "dark-magenta": "mørkemagenta", + "dark-cyan": "mørkecyan", + "dark-grey": "mørkegrå", + "current folder": "nuværende folder", + "never": "aldrig", "current media item": "", - "next episode (series)": "", + "next episode (series)": "næste episode (serier)", "hybrid: current item or next episode": "", "hybrid-plus: current item and next episode": "", - "every 6 hours": "", - "every 12 hours": "", - "every 24 hours": "", - "1 days": "", - "2 days": "", - "3 days": "", - "4 days": "", - "1 weeks": "", - "2 weeks": "", - "3 weeks": "", - "4 weeks": "", - "5 weeks": "", - "6 weeks": "", - "12 weeks": "", - "don't limit": "", - "1 year": "", - "2 years": "", - "3 years": "", - "4 years": "", - "5 years": "", - "6 years": "", - "7 years": "", - "8 years": "", - "9 years": "", - "10 years": "", - "agent + channel": "", - "only agent": "", - "only channel": "", - "disabled": "", - "channel menu": "", - "advanced menu": "", - "CRITICAL": "", - "ERROR": "", - "WARNING": "", - "INFO": "", - "DEBUG": "", - "Refreshes the %(current_kind)s, possibly searching for missing and picking up new subtitles on disk": "", + "every 6 hours": "hver 6 time", + "every 12 hours": "hver 12 time", + "every 24 hours": "hver 24 time", + "1 days": "hver dag", + "2 days": "hver 2 dag", + "3 days": "hver 3 dag", + "4 days": "hver 4 dag", + "1 weeks": "hver uge", + "2 weeks": "hver 2 uge", + "3 weeks": "hver 3 uge", + "4 weeks": "hver 4 uge", + "5 weeks": "hver 5 uge", + "6 weeks": "hver 6 uge", + "12 weeks": "hver 12 uge", + "don't limit": "ingen begrænsning", + "1 year": "1 år", + "2 years": "2 år", + "3 years": "3 år", + "4 years": "4 år", + "5 years": "5 år", + "6 years": "6 år", + "7 years": "7 år", + "8 years": "8 år", + "9 years": "9 år", + "10 years": "10 år", + "only agent": "kun agent", + "disabled": "ikke aktiv", + "advanced menu": "advanceret menu", + "CRITICAL": "KRITISK", + "ERROR": "FEJL", + "WARNING": "ADVARSEL", + "INFO": "INFO", + "DEBUG": "DEBUG", "Force-find subtitles: %(item_title)s": "", "File %(file_part_index)s: ": "", "%(part_summary)sNo current subtitle in storage": "", @@ -340,14 +319,14 @@ "%(part_summary)sEmbedded subtitles (%(languages)s)": "", "Select active %(language)s subtitle": "", "%(count)d subtitles in storage": "", - "List available %(language)s subtitles": "", - "Modify current %(language)s subtitle": "", + "List available %(language)s subtitles": "Vis tilgængelige %(language)s undertekster", + "Modify current %(language)s subtitle": "Modificer nuværrende %(language)s undertekst", "Currently applied mods: %(mod_list)s": "", "Blacklist current %(language)s subtitle and search for a new one": "", "Manage blacklist (%(amount)s contained)": "", "%(current_state)s%(subtitle_name)s, Score: %(score)s": "", - "Current: ": "", - "Stored: ": "", + "Current: ": "Nuværende: ", + "Stored: ": "Gemt: ", "by %(release_group)s": "", "Current: %(provider_name)s (%(score)s) ": "", "Search for %(language)s subs (%(video_data)s)": "", @@ -365,19 +344,56 @@ "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "", "Display ignore list (%(ignored_count)d)": "", "%(throttled_provider)s until %(until_date)s (%(reason)s)": "", - "%(add_or_remove)s %(kind)s %(title)s %(to_or_from)s the ignore list": "", - "%(title)s %(added_to_or_removed_from)s the ignore list": "", - "%(force_state)sRefreshing %(title)s": "", "Extracting subtitle %(stream_index)s of %(filename)s": "", - "Extract missing %(language)s embedded subtitles": "", - "Extract and activate %(language)s embedded subtitles": "", - "Triggering %(forced)sRefresh for %(title)s": "", - "%(refresh_or_forced_refresh)s of item %(item_id)s triggered": "", - "None": "", - "Idle": "", + "Extract missing %(language)s embedded subtitles": "Udtrækker manglende %(language)s indlejrede undertekster", + "Extract and activate %(language)s embedded subtitles": "Udtræk og aktiver %(language)s indlejret undertekster", + "None": "Ingen", + "Idle": "Venter", "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "", - "Adjust by %(time_and_unit)s": "", + "Adjust by %(time_and_unit)s": "Justeret med %(time_and_unit)s", "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "", - "Remove: %(mod_name)s": "", - "%(class_name)s: Subtitle download failed (%(item_id)s)": "" + "Remove: %(mod_name)s": "Fjern: %(mod_name)s", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Undertekst download fejlede (%(item_id)s)", + "agent + interface": "agent + interface", + "only interface": "kun interface", + "interface": "interface", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "", + "Add %(kind)s %(title)s to the ignore list": "", + "Remove %(kind)s %(title)s from the ignore list": "", + "%(title)s added to the ignore list": "", + "%(title)s removed from the ignore list": "", + "Triggering refresh for %(title)s": "", + "Triggering forced refresh for %(title)s": "", + "Refresh of item %(item_id)s triggered": "", + "Forced refresh of item %(item_id)s triggered": "", + "Ignore %(kind)s \"%(title)s\"": "", + "Un-ignore %(kind)s \"%(title)s\"": "", + "Refreshing %(title)s": "", + "Force-refreshing %(title)s": "", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "", + "the movie": "", + "the series": "", + "the episode": "", + "the season": "", + "Change the color of the subtitle": "", + "Adds the requested color to every line of the subtitle. Support depends on player.": "", + "Basic common fixes": "", + "Fix common and whitespace/punctuation issues in subtitles": "", + "Remove all style tags": "", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.": "", + "Reverse punctuation in RTL languages": "", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew": "", + "Change the FPS of the subtitle": "", + "Re-syncs the subtitle to the framerate of the current media file.": "", + "Remove Hearing Impaired tags": "", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people": "", + "Fix common OCR issues": "", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR": "", + "Change the timing of the subtitle": "", + "Adds or substracts a certain amount of time from the whole subtitle to match your media": "", + "Available": "", + "Current": "" } \ No newline at end of file From 41f884e12963eef15be7a4d875145465b23f5a81 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 6 Apr 2018 13:53:29 +0200 Subject: [PATCH 051/710] i18n: lowercase language identifier (to make it actually work) --- Contents/Code/support/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index fe450cb07..9b64adbcc 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -370,7 +370,7 @@ def get_language(lang_short): def display_language(l): - return _(str(l)) + return _(str(l).lower()) def is_stream_forced(stream): From 06c6fa4d011edb1a91ba7cc455fb4bad1d399c0f Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 6 Apr 2018 13:58:21 +0200 Subject: [PATCH 052/710] core: due to enum value changes, add plugin_mode and plugin_pin_mode suffixes --- Contents/Code/support/config.py | 10 +++++----- Contents/DefaultPrefs.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 77c6e0011..813a6fefa 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -359,13 +359,13 @@ def set_plugin_mode(self): Log.Warn("No providers enabled, disabling agent and interface!") return - if Prefs["plugin_mode"] == "only agent": + if Prefs["plugin_mode2"] == "only agent": self.enable_channel = False - elif Prefs["plugin_mode"] == "only interface": + elif Prefs["plugin_mode2"] == "only interface": self.enable_agent = False def set_plugin_lock(self): - if Prefs["plugin_pin_mode"] in ("interface", "advanced menu"): + if Prefs["plugin_pin_mode2"] in ("interface", "advanced menu"): # check pin pin = Prefs["plugin_pin"] if not pin or not len(pin): @@ -378,8 +378,8 @@ def set_plugin_lock(self): except ValueError: Log.Warn("PIN has to be an integer (0-9)") self.pin = pin - self.lock_advanced_menu = Prefs["plugin_pin_mode"] == "advanced menu" - self.lock_menu = Prefs["plugin_pin_mode"] == "interface" + self.lock_advanced_menu = Prefs["plugin_pin_mode2"] == "advanced menu" + self.lock_menu = Prefs["plugin_pin_mode2"] == "interface" try: self.pin_valid_minutes = int(Prefs["plugin_pin_valid_for"].strip()) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 323a6e395..81377f020 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -709,7 +709,7 @@ "default": "" }, { - "id": "plugin_mode", + "id": "plugin_mode2", "label": "Sub-Zero mode", "type": "enum", "values": [ @@ -734,7 +734,7 @@ "default": "10" }, { - "id": "plugin_pin_mode", + "id": "plugin_pin_mode2", "label": "Use PIN to restrict access to (needs plugin or PMS restart)", "type": "enum", "values": [ From b0f0af087bba382f2d795fabdf99f147c639eab9 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 17 Apr 2018 17:25:35 +0200 Subject: [PATCH 053/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 867d63a98..6e1654742 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ PlexPluginConsoleLogging 0 PlexPluginDevMode - 0 + 1 PlexPluginCodePolicy Elevated @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.4.2527 +Version 2.5.4.2527 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 1b44f6d220685f3958133597e7426f0f7a168436 Mon Sep 17 00:00:00 2001 From: morpheus133 Date: Wed, 18 Apr 2018 20:28:53 +0200 Subject: [PATCH 054/710] Added Hungarian provider supersubtitles https://www.feliratok.info/ Support: Movies Series SeriesPacks --- Contents/Code/support/config.py | 2 + Contents/DefaultPrefs.json | 6 + .../converters/supersubtitles.py | 24 + .../providers/supersubtitles.py | 416 ++++++++++++++++++ 4 files changed, 448 insertions(+) create mode 100644 Contents/Libraries/Shared/subliminal_patch/converters/supersubtitles.py create mode 100644 Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 441518f71..427f9878b 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -612,6 +612,7 @@ def get_providers(self, media_type="series"): 'legendastv': cast_bool(Prefs['provider.legendastv.enabled']), 'napiprojekt': cast_bool(Prefs['provider.napiprojekt.enabled']), 'hosszupuska': cast_bool(Prefs['provider.hosszupuska.enabled']), + 'supersubtitles': cast_bool(Prefs['provider.supersubtitles.enabled']), 'shooter': False, 'subscene': cast_bool(Prefs['provider.subscene.enabled']), 'argenteam': cast_bool(Prefs['provider.argenteam.enabled']), @@ -632,6 +633,7 @@ def get_providers(self, media_type="series"): providers["napiprojekt"] = False providers["shooter"] = False providers["hosszupuska"] = False + providers["supersubtitles"] = False providers["titlovi"] = False providers["argenteam"] = False diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 42b4284b5..ed1f3d259 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -380,6 +380,12 @@ "type": "bool", "default": "true" }, + { + "id": "provider.supersubtitles.enabled", + "label": "Provider: Enable feliratok.info (Hungarian)", + "type": "bool", + "default": "false" + }, { "id": "provider.hosszupuska.enabled", "label": "Provider: Enable hosszupuskasub.com (Hungarian)", diff --git a/Contents/Libraries/Shared/subliminal_patch/converters/supersubtitles.py b/Contents/Libraries/Shared/subliminal_patch/converters/supersubtitles.py new file mode 100644 index 000000000..cc5697b42 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/converters/supersubtitles.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from babelfish import LanguageReverseConverter, language_converters + + +class SuperSubtitlesConverter(LanguageReverseConverter): + def __init__(self): + self.alpha2_converter = language_converters['alpha2'] + self.from_supersubtitles = {'hu': ('hun', ), 'en': ('eng',)} + self.to_supersubtitles = {v: k for k, v in self.from_supersubtitles.items()} + self.codes = self.alpha2_converter.codes | set(self.from_supersubtitles.keys()) + + def convert(self, alpha3, country=None, script=None): + if (alpha3, country) in self.to_supersubtitles: + return self.to_supersubtitles[(alpha3, country)] + if (alpha3,) in self.to_supersubtitles: + return self.to_supersubtitles[(alpha3,)] + + return self.alpha2_converter.convert(alpha3, country, script) + + def reverse(self, supersubtitles): + if supersubtitles in self.from_supersubtitles: + return self.from_supersubtitles[supersubtitles] + + return self.alpha2_converter.reverse(supersubtitles) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py new file mode 100644 index 000000000..4948d9b19 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py @@ -0,0 +1,416 @@ +# coding: iso8859_2 +import io +import six +import os +from pkg_resources import require +import logging +import re +import os +import time + +from babelfish import Language, language_converters +from requests import Session + +from subliminal.subtitle import fix_line_ending +from subliminal_patch.providers import Provider +from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin +from subliminal.providers import ParserBeautifulSoup +from subliminal_patch.exceptions import ProviderError +from subliminal.score import get_equivalent_release_groups +from subliminal_patch.subtitle import Subtitle, guess_matches +from subliminal.utils import sanitize, sanitize_release_group +from subliminal.video import Episode, Movie +from zipfile import ZipFile, is_zipfile +from rarfile import RarFile, is_rarfile +from subliminal_patch.utils import sanitize, fix_inconsistent_naming as _fix_inconsistent_naming +from guessit import guessit +''' +import types + + +from babelfish import Language, language_converters +from requests import Session +from . import ParserBeautifulSoup, Provider +# from ..exceptions import ProviderError +from ..score import get_equivalent_release_groups +from ..subtitle import Subtitle, fix_line_ending + +from ..utils import sanitize, sanitize_release_group +from ..video import Episode, Movie + +''' +# import ProviderSubtitleArchiveMixin +# from mixins import ProviderSubtitleArchiveMixin + +logger = logging.getLogger(__name__) + +language_converters.register('supersubtitles = subliminal_patch.converters.supersubtitles:SuperSubtitlesConverter') + + +class SuperSubtitlesSubtitle(Subtitle): + """SuperSubtitles Subtitle.""" + provider_name = 'supersubtitles' + + def __str__(self): + subtit = "Subtitle id: " + str(self.subtitle_id) \ + + " Series: " + self.series \ + + " Season: " + str(self.season) \ + + " Episode: " + str(self.episode) \ + + " Version: " + str(self.version) \ + + " Releases: " + str(self.releases) \ + + " DownloadLink: " + str(self.page_link) \ + + " Matches: " + str(self.matches) + if self.year: + subtit = subtit + " Year: " + str(self.year) + return subtit.encode('utf-8') + + def __init__(self, language, page_link, subtitle_id, series, season, episode, version, + releases, year, imdb_id, asked_for_episode=None, asked_for_release_group=None): + super(SuperSubtitlesSubtitle, self).__init__(language, page_link=page_link) + self.subtitle_id = subtitle_id + self.series = series + self.season = season + self.episode = episode + self.version = version + self.releases = releases + self.year = year + if year: + self.year = int(year) + + self.release_info = u", ".join(releases) + self.page_link = page_link + self.asked_for_release_group = asked_for_release_group + self.asked_for_episode = asked_for_episode + self.imdb_id = imdb_id + self.is_pack = True + + def numeric_id(self): + return subtitle_id + + def __repr__(self): + ep_addon = (" S%02dE%02d" % (self.season, self.episode)) if self.episode else "" + return '<%s %r [%s]>' % ( + self.__class__.__name__, u"%s%s%s [%s]" % (self.series, " (%s)" % self.year if self.year else "", ep_addon, + self.release_info), self.language) + + @property + def id(self): + return str(self.subtitle_id) + + def get_matches(self, video): + matches = set() + + # episode + if isinstance(video, Episode): + # series + if video.series and sanitize(self.series) == sanitize(video.series): + matches.add('series') + # season + if video.season and self.season == video.season: + matches.add('season') + # episode + if video.episode and self.episode == video.episode: + matches.add('episode') + # imdb_id + if video.series_imdb_id and self.imdb_id and str(self.imdb_id) == str(video.series_imdb_id): + matches.add('series_imdb_id') + matches.add('series') + matches.add('year') + # year + if ('series' in matches and video.original_series and self.year is None or + video.year and video.year == self.year): + matches.add('year') + # movie + elif isinstance(video, Movie): + # title + if video.title and (sanitize(self.series) in ( + sanitize(name) for name in [video.title] + video.alternative_titles)): + matches.add('title') + # imdb_id + if video.imdb_id and self.imdb_id == video.imdb_id: + matches.add('imdb_id') + matches.add('title') + matches.add('year') + # year + if video.year and self.year == video.year: + matches.add('year') + + # release_group + if (video.release_group and self.version and + any(r in sanitize_release_group(self.version) + for r in get_equivalent_release_groups(sanitize_release_group(video.release_group)))): + matches.add('release_group') + # resolution + if video.resolution and self.version and video.resolution in self.version.lower(): + matches.add('resolution') + # format + if video.format and self.version and video.format.lower() in self.version.lower(): + matches.add('format') + # other properties + # matches |= guess_matches(video, guessit(self.release_info.encode("utf-8"))) + + self.matches = matches + return matches + + +class SuperSubtitlesProvider(Provider, ProviderSubtitleArchiveMixin): + """SuperSubtitles Provider.""" + languages = {Language('hun', 'HU')} | {Language(l) for l in [ + 'hun', 'eng' + ]} + video_types = (Episode, Movie) + # https://www.feliratok.info/?search=&soriSorszam=&nyelv=&sorozatnev=The+Flash+%282014%29&sid=3212&complexsearch=true&knyelv=0&evad=4&epizod1=1&cimke=0&minoseg=0&rlsr=0&tab=all + server_url = 'https://www.feliratok.info/' + subtitle_class = SuperSubtitlesSubtitle + hearing_impaired_verifiable = False + multi_result_throttle = 2 # seconds + + def initialize(self): + self.session = Session() + self.session.headers = {'User-Agent': os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")} + + def terminate(self): + self.session.close() + + def get_language(self, text): + if text == 'Magyar': + return Language.fromsupersubtitles('hu') + if text == 'Angol': + return Language.fromsupersubtitles('en') + return None + + def find_imdb_id(self, sub_id): + """ + + """ + + url = self.server_url + "index.php?tipus=adatlap&azon=a_" + sub_id + # url = https://www.feliratok.info/index.php?tipus=adatlap&azon=a_1518600916 + logger.info('Get IMDB id from URL %s', url) + r = self.session.get(url, timeout=10).content + + soup = ParserBeautifulSoup(r, ['lxml']) + links = soup.find_all("a") + + for value in links: + if "imdb.com" in str(value): + # iMDB + imdb_id = re.findall(r"(?<=www.imdb.com\/title\/).*(?=\/\")", str(value))[0] + return imdb_id + + return None + + def find_id(self, series, year, original_title): + """ + We need to find the id of the series at the following url: + https://www.feliratok.info/index.php?term=SERIESNAME&nyelv=0&action=autoname + Where SERIESNAME is a searchable string. + The result will be something like this: + [{"name":"DC\u2019s Legends of Tomorrow (2016)","ID":"3725"},{"name":"Miles from Tomorrowland (2015)","ID":"3789"} + ,{"name":"No Tomorrow (2016)","ID":"4179"}] + + """ + + # Search for exact name + url = self.server_url + "index.php?term=" + series + "&nyelv=0&action=autoname" + # url = self.server_url + "index.php?term=" + "fla"+ "&nyelv=0&action=autoname" + logger.info('Get series id from URL %s', url) + r = self.session.get(url, timeout=10).content + + # r is something like this: + # [{"name":"DC\u2019s Legends of Tomorrow (2016)","ID":"3725"},{"name":"Miles from Tomorrowland (2015)","ID":"3789"} + # ,{"name":"No Tomorrow (2016)","ID":"4179"}] + + # We create a list from the data between { } + # "name":"DC\u2019s Legends of Tomorrow (2016)","ID":"3725" + # "name":"Miles from Tomorrowland (2015)","ID":"3789" + # ... + results = re.findall(r"(?<={).*?(?=})", str(r)) + + # check all of the results: + for result in results: + try: + # "name":"Miles from Tomorrowland (2015)","ID":"3789" + result_year = re.findall(r"(?<=\()\d\d\d\d(?=\))", result)[0] + except IndexError: + result_year = "" + + try: + # "name":"Miles from Tomorrowland (2015)","ID":"3789" + result_title = re.findall(r"(?<=name\":\").*(?=\()", result)[0] + result_id = re.findall(r"(?<=ID\":\").*(?=\")", result)[0] + except IndexError: + continue + + result_title = result_title.strip().replace("u2019", "").replace("\\\\u2019", "").replace("'", "").replace("\\", + "").replace(" ", ".") + guessable = result_title.strip() + ".s01e01." + result_year + guess = guessit(guessable, {'type': "episode"}) + + if sanitize(original_title) == sanitize(guess['title']) and year and guess['year'] and year == guess['year']: + # Return the founded id + return result_id + + return None + + def query(self, series, video=None): + year = video.year + if isinstance(video, Episode): + series = video.series + season = video.season + episode = video.episode + guess = guessit(series, {'type': "episode"}) + series_id = None + #seriesa = series.replace(' ', '+') + + title = series + str(season) + str(episode) + # Get ID of series with original name + series_id = self.find_id(series, year, series) + if not series_id: + # If not founded try without ' char + modified_series = series.replace(' ', '+').replace('\'', '') + series_id = self.find_id(modified_series, year, series) + if not series_id: + # If still not founded try with the longest word is series title + modified_series = modified_series.split('+') + modified_series = max(modified_series, key=len) + series_id = self.find_id(modified_series, year, series) + if not series_id: + return None + + if isinstance(video, Movie): + guess = guessit(series, {'type': "movie"}) + season = None + episode = None + title = series.replace(" ", "+") + + # get the episode page + if isinstance(video, Episode): + + # https://www.feliratok.info/index.php?search=&soriSorszam=&nyelv=&sorozatnev=&sid=2075&complexsearch=true&knyelv=0&evad=6&epizod1=16&cimke=0&minoseg=0&rlsr=0&tab=all + url = self.server_url + "index.php?search=&soriSorszam=&nyelv=&sorozatnev=&sid=" + \ + str(series_id) + "&complexsearch=true&knyelv=0&evad=" + str(season) + "&epizod1="+str(episode)+"&cimke=0&minoseg=0&rlsr=0&tab=all" + subtitle = self.process_subs(series, video, url) + + if subtitle == []: + # No Subtitle found. Maybe already archived to season pack + url = self.server_url + "index.php?search=&soriSorszam=&nyelv=&sorozatnev=&sid=" + \ + str(series_id) + "&complexsearch=true&knyelv=0&evad=" + str( season) + "&epizod1=&evadpakk=on&cimke=0&minoseg=0&rlsr=0&tab=all" + subtitle = self.process_subs(series, video, url) + + if isinstance(video, Movie): + # https://www.feliratok.info/index.php?search=The+Hitman%27s+BodyGuard&soriSorszam=&nyelv=&tab=film + url = self.server_url + "index.php?search=" + title + "&soriSorszam=&nyelv=&tab=film" + subtitle = self.process_subs(series, video, url) + + return subtitle + + def process_subs(self, series, video, url): + + year = video.year + subtitles = [] + + logger.info('URL for subtitles %s', url) + r = self.session.get(url, timeout=10).content + + soup = ParserBeautifulSoup(r, ['lxml']) + tables = soup.find_all("table") + tables = tables[0].find_all("tr") + i = 0 + series_imdb_id = None + for table in tables: + if "vilagit" in str(table) and i > 1: + try: + sub_hun_name = table.findAll("div", {"class": "magyar"})[0] + if isinstance(video, Episode): + if "vad)" not in str(sub_hun_name): + #
A pletykafszek (3. vad)
+ sub_hun_name = re.findall(r"(?<=\
).*(?= -)", str(sub_hun_name))[0] + else: + #
A holnap legendi - 3x11
+ sub_hun_name = re.findall(r"(?<=\
).*(?= \()", str(sub_hun_name))[0] + if isinstance(video, Movie): + sub_hun_name = re.findall(r"(?<=
).*(?=<\/div)", str(sub_hun_name))[0] + except IndexError: + sub_hun_name = "" + + sub_english = table.findAll("div", {"class": "eredeti"}) + if isinstance(video, Episode): + asked_for_episode = video.episode + if "Season" not in str(sub_english): + # [
Gossip Girl (Season 3) (DVDRip-REWARD)
] + sub_english_name = re.findall(r"(?<=\
).*?(?= -)", str(sub_english))[0] + sub_season = int((re.findall(r"(?<=- ).*?(?= - )", str(sub_english))[0].split('x')[0]).strip()) + sub_episode = int((re.findall(r"(?<=- ).*?(?= - )", str(sub_english))[0].split('x')[1]).strip()) + + else: + # [
DC's Legends of Tomorrow - 3x11 - Here I Go Again (HDTV-AFG, HDTV-RMX, 720p-SVA, 720p-PSA
] + sub_english_name = \ + re.findall(r"(?<=\
).*?(?=\(Season)", str(sub_english))[0] + sub_season = int(re.findall(r"(?<=Season )\d+(?=\))", str(sub_english))[0]) + sub_episode = int(video.episode) + if isinstance(video, Movie): + asked_for_episode = None + sub_english_name = re.findall(r"(?<=\
).*?(?=\()", str(sub_english))[0] + sub_season = None + sub_episode = None + + sub_version = (str(sub_english).split('(')[len(str(sub_english).split('(')) - 1]).split(')')[0] + # Angol + lang = table.findAll("small")[0] + sub_language = self.get_language(re.findall(r"(?<=).*(?=<\/small>)", str(lang))[0]) + + # + link = str(table.findAll("a")[len(table.findAll("a")) - 1]).replace("amp;", "") + sub_downloadlink = self.server_url + re.findall(r"(?<=href=\"\/).*(?=\"\>)", link)[0] + + sub_id = re.findall(r"(?<=felirat\=).*(?=\"\>)", link)[0] + sub_year = video.year + sub_releases = [s.strip() for s in sub_version.split(',')] + + # For episodes we open the series page so all subtitles imdb_id must be the same. no need to check all + if (isinstance(video, Episode) and series_imdb_id is not None): + sub_imdb_id = series_imdb_id + else: + sub_imdb_id = self.find_imdb_id(sub_id) + series_imdb_id = sub_imdb_id + + subtitle = SuperSubtitlesSubtitle(sub_language, sub_downloadlink, sub_id, sub_english_name.strip(), sub_season, + sub_episode, sub_version, sub_releases, sub_year, sub_imdb_id, + asked_for_episode, asked_for_release_group=video.release_group ) + subtitles.append(subtitle) + i = i + 1 + return subtitles + + def list_subtitles(self, video, languages): + if isinstance(video, Episode): + titles = [video.series] + video.alternative_series + elif isinstance(video, Movie): + titles = [video.title] + video.alternative_titles + + for title in titles: + subs = self.query(title, video=video) + if subs: + return subs + + time.sleep(self.multi_result_throttle) + + def download_subtitle(self, subtitle): + + # download as a zip + logger.info('Downloading subtitle %r', subtitle.subtitle_id) + r = self.session.get(subtitle.page_link, timeout=10) + r.raise_for_status() + + if ".rar" in subtitle.page_link: + logger.debug('Archive identified as rar') + archive_stream = io.BytesIO(r.content) + archive = RarFile(archive_stream) + subtitle.content = self.get_subtitle_from_archive(subtitle, archive) + elif ".zip" in subtitle.page_link: + logger.debug('Archive identified as zip') + archive_stream = io.BytesIO(r.content) + archive = ZipFile(archive_stream) + subtitle.content = self.get_subtitle_from_archive(subtitle, archive) + else: + subtitle.content = fix_line_ending(r.content) \ No newline at end of file From b4855611c49f65f93206c41b51f4c38c863c6170 Mon Sep 17 00:00:00 2001 From: morpheus133 Date: Wed, 18 Apr 2018 20:34:39 +0200 Subject: [PATCH 055/710] removed unnecessary comments --- .../subliminal_patch/providers/supersubtitles.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py index 4948d9b19..31ee3200b 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py @@ -24,24 +24,8 @@ from rarfile import RarFile, is_rarfile from subliminal_patch.utils import sanitize, fix_inconsistent_naming as _fix_inconsistent_naming from guessit import guessit -''' -import types -from babelfish import Language, language_converters -from requests import Session -from . import ParserBeautifulSoup, Provider -# from ..exceptions import ProviderError -from ..score import get_equivalent_release_groups -from ..subtitle import Subtitle, fix_line_ending - -from ..utils import sanitize, sanitize_release_group -from ..video import Episode, Movie - -''' -# import ProviderSubtitleArchiveMixin -# from mixins import ProviderSubtitleArchiveMixin - logger = logging.getLogger(__name__) language_converters.register('supersubtitles = subliminal_patch.converters.supersubtitles:SuperSubtitlesConverter') From a4016616a12d1cc66f560eb6a7257b36fa6ebd04 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 25 Apr 2018 15:33:19 +0200 Subject: [PATCH 056/710] log usage of advanced config; add "adv_cfg_path" config variable to debug output --- Contents/Code/interface/menu.py | 2 +- Contents/Code/support/config.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index a8f10fc19..e220576ac 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -323,7 +323,7 @@ def ValidatePrefs(): "version", "app_support_path", "data_path", "data_items_path", "enable_agent", "enable_channel", "permissions_ok", "missing_permissions", "fs_encoding", "subtitle_destination_folder", "new_style_cache", "dbm_supported", "lang_list", "providers", - "plex_transcoder", "refiner_settings", "unrar"]: + "plex_transcoder", "refiner_settings", "unrar", "adv_cfg_path"]: value = getattr(config, attr) if isinstance(value, dict): diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 441518f71..248bdeae7 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -136,6 +136,7 @@ class Config(object): embedded_auto_extract = False ietf_as_alpha3 = False unrar = None + adv_cfg_path = None store_recently_played_amount = 40 @@ -321,7 +322,10 @@ def get_advanced_config(self): if os.path.isfile(path): data = FileIO.read(path, "r") - return Dicked(**jstyleson.loads(data)) + d = Dicked(**jstyleson.loads(data)) + self.adv_cfg_path = path + Log.Info(u"Using advanced settings from: %s", path) + return d return Dicked() From 3ae02c3050e9745becfad1436a71e17d46f819a5 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 25 Apr 2018 16:01:26 +0200 Subject: [PATCH 057/710] providers: opensubtitles: properly handle opensubtitles responses with the new requests xmlrpc handler --- .../Libraries/Shared/subliminal_patch/http.py | 12 +++----- .../providers/opensubtitles.py | 29 ++++++++++++------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 4eee1e6c5..bcf97d7b8 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -107,14 +107,10 @@ def request(self, host, handler, request_body, verbose=0): except Exception: raise # something went wrong else: - try: - resp.raise_for_status() - except requests.RequestException as e: - return {"status": str(resp.status_code)} - - else: - self.verbose = verbose - return self.parse_response(resp.raw) + resp.raise_for_status() + + self.verbose = verbose + return self.parse_response(resp.raw) def _build_url(self, host, handler): """ diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index b00f182a7..10b27fd53 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -4,6 +4,8 @@ import os import traceback +import requests + from babelfish import language_converters from dogpile.cache.api import NO_VALUE from subliminal.exceptions import ConfigurationError, ServiceUnavailable @@ -125,8 +127,8 @@ def log_in(self, server_url=None): response = self.retry( lambda: checked( - self.server.LogIn(self.username, self.password, 'eng', - os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")) + lambda: self.server.LogIn(self.username, self.password, 'eng', + os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")) ) ) @@ -158,7 +160,7 @@ def initialize(self): if token is not NO_VALUE: try: logger.debug('Trying previous token') - checked(self.server.NoOperation(token)) + checked(lambda: self.server.NoOperation(token)) self.token = token logger.debug("Using previous login token: %s", self.token) return @@ -179,7 +181,7 @@ def initialize(self): def terminate(self): try: - checked(self.server.LogOut(self.token)) + checked(lambda: self.server.LogOut(self.token)) except: logger.error("Logout failed: %s", traceback.format_exc()) @@ -247,7 +249,7 @@ def query(self, languages, hash=None, size=None, imdb_id=None, query=None, seaso # query the server logger.info('Searching subtitles %r', criteria) response = self.use_token_or_login( - lambda: self.retry(lambda: checked(self.server.SearchSubtitles(self.token, criteria))) + lambda: self.retry(lambda: checked(lambda: self.server.SearchSubtitles(self.token, criteria))) ) subtitles = [] @@ -308,15 +310,22 @@ def download_subtitle(self, subtitle): return self.use_token_or_login(lambda: super(OpenSubtitlesProvider, self).download_subtitle(subtitle)) -def checked(response): - """Check a response status before returning it. +def checked(fn): + """Run :fn: and check the response status before returning it. - :param response: a response from a XMLRPC call to OpenSubtitles. + :param fn: the function to make an XMLRPC call to OpenSubtitles. :return: the response. :raise: :class:`OpenSubtitlesError` """ - status_code = int(response['status'][:3]) + response = None + try: + response = fn() + except requests.RequestException as e: + status_code = response.status_code + else: + status_code = int(response['status'][:3]) + if status_code == 401: raise Unauthorized if status_code == 406: @@ -336,4 +345,4 @@ def checked(response): if status_code != 200: raise OpenSubtitlesError(response['status']) - return response \ No newline at end of file + return response From edef9cb93630281e3e5e3ddee2ee6f192d23ce82 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 25 Apr 2018 16:09:36 +0200 Subject: [PATCH 058/710] providers: opensubtitles: use new response handling for DownloadSubtitles as well --- .../subliminal_patch/providers/opensubtitles.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index 10b27fd53..8918228ec 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -1,8 +1,9 @@ # coding=utf-8 - +import base64 import logging import os import traceback +import zlib import requests @@ -13,6 +14,7 @@ OpenSubtitlesSubtitle as _OpenSubtitlesSubtitle, Episode, ServerProxy, Unauthorized, NoSession, \ DownloadLimitReached, InvalidImdbid, UnknownUserAgent, DisabledUserAgent, OpenSubtitlesError from mixins import ProviderRetryMixin +from subliminal.subtitle import fix_line_ending from subliminal_patch.http import SubZeroRequestsTransport from subliminal.cache import region from subliminal_patch.score import framerate_equal @@ -307,7 +309,13 @@ def query(self, languages, hash=None, size=None, imdb_id=None, query=None, seaso return subtitles def download_subtitle(self, subtitle): - return self.use_token_or_login(lambda: super(OpenSubtitlesProvider, self).download_subtitle(subtitle)) + logger.info('Downloading subtitle %r', subtitle) + response = self.use_token_or_login( + lambda: checked( + lambda: self.server.DownloadSubtitles(self.token, [str(subtitle.subtitle_id)]) + ) + ) + subtitle.content = fix_line_ending(zlib.decompress(base64.b64decode(response['data'][0]['data']), 47)) def checked(fn): From 62e37dbd09c69b7b05fdd1f56fdac4f254bfa1bb Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 25 Apr 2018 16:10:23 +0200 Subject: [PATCH 059/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 6e1654742..a62993a66 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.5.4.2527 + 2.5.4.2532 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.4.2527 DEV +Version 2.5.4.2532 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 89bb747ee3604b0df3b53a7d7002ae6b322a17c4 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 26 Apr 2018 06:13:10 +0200 Subject: [PATCH 060/710] update provider test; providers: opensubtitles: use e.response, not response in case of http error --- Contents/Libraries/Shared/provider_test.sh | 5 ++++- .../Shared/subliminal_patch/providers/opensubtitles.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/provider_test.sh b/Contents/Libraries/Shared/provider_test.sh index 6235a06e0..67fc66b57 100644 --- a/Contents/Libraries/Shared/provider_test.sh +++ b/Contents/Libraries/Shared/provider_test.sh @@ -4,9 +4,12 @@ python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.get # addic7ed download_best python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import os; os.environ['U1pfT01EQl9LRVk'] = '789CF30DAC2C8B0AF433F5C9AD34290A712DF30D7135F12D0FB3E502006FDE081E'; import subliminal_patch, subliminal; from subliminal_patch.core import SZProviderPool, download_best_subtitles; from subliminal_patch.score import compute_score; from babelfish import Language; subliminal.region.configure('dogpile.cache.memory'); from subzero.video import parse_video; video = parse_video('FILE_NAME', hints={'type': 'episode'}, dry_run=True); download_best_subtitles([video], pool_class=SZProviderPool, compute_score=compute_score, providers=['addic7ed'], provider_configs={'addic7ed': {'use_random_agents': True}}, languages={Language('fra')} )" -# opensubtitles +# opensubtitles:list python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subliminal_patch.core import SZProviderPool; from babelfish import Language; from subzero.video import parse_video; SZProviderPool(providers=['opensubtitles'], )['opensubtitles'].list_subtitles(parse_video('FULL_PATH', {}, {'type': 'episode'}), languages=[Language('eng')])" +# opensubtitles:download +python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subliminal_patch.core import SZProviderPool, download_best_subtitles; from subliminal_patch.score import compute_score; from babelfish import Language; from subzero.video import parse_video; video = parse_video('FILE_NAME', hints={'type': 'movie'}, dry_run=True); download_best_subtitles([video], pool_class=SZProviderPool, compute_score=compute_score, providers=['opensubtitles'], languages={Language('srp')} )" + # podnapisi python -c "import logging; logging.basicConfig(level=logging.DEBUG); import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subliminal_patch.core import SZProviderPool; from babelfish import Language; SZProviderPool(providers=['podnapisi'], )['podnapisi'].query([Language('eng')], 'Game of Thrones', season=2, episode=1)" diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index 8918228ec..73bfb7e96 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -330,7 +330,7 @@ def checked(fn): try: response = fn() except requests.RequestException as e: - status_code = response.status_code + status_code = e.response.status_code else: status_code = int(response['status'][:3]) From 84e78e1e2081ca964b755d50ee39b5d4ae819f0b Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 26 Apr 2018 06:19:42 +0200 Subject: [PATCH 061/710] core: try retrieving advanced_settings.json from the path given, which may be a file path or a directory --- Contents/Code/support/config.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 248bdeae7..f04b2472b 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -314,18 +314,23 @@ def get_pack_cache_dir(self): return pack_cache_dir def get_advanced_config(self): + paths = [] if Prefs['path_to_advanced_settings']: - path = Prefs['path_to_advanced_settings'] - else: - path = os.path.join(config.data_path, "advanced_settings.json") + paths = [ + Prefs['path_to_advanced_settings'], + os.path.join(Prefs['path_to_advanced_settings'], "advanced_settings.json") + ] + + paths.append(os.path.join(config.data_path, "advanced_settings.json")) - if os.path.isfile(path): - data = FileIO.read(path, "r") + for path in paths: + if os.path.isfile(path): + data = FileIO.read(path, "r") - d = Dicked(**jstyleson.loads(data)) - self.adv_cfg_path = path - Log.Info(u"Using advanced settings from: %s", path) - return d + d = Dicked(**jstyleson.loads(data)) + self.adv_cfg_path = path + Log.Info(u"Using advanced settings from: %s", path) + return d return Dicked() From 2f9eb51868586c0babbe3817fa7544cdc9d5b944 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 26 Apr 2018 06:21:55 +0200 Subject: [PATCH 062/710] i18n: add custom advanced_settings.json setting --- Contents/Strings/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 06bdc3298..c9bf9df5a 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -395,5 +395,6 @@ "Change the timing of the subtitle":"Change the timing of the subtitle", "Adds or substracts a certain amount of time from the whole subtitle to match your media":"Adds or substracts a certain amount of time from the whole subtitle to match your media", "Available":"Available", - "Current":"Current" + "Current":"Current", + "Custom path to advanced_settings.json":"Custom path to advanced_settings.json" } From af335d5565483243d5eb897120429438b001f9df Mon Sep 17 00:00:00 2001 From: pannal Date: Thu, 26 Apr 2018 06:24:25 +0200 Subject: [PATCH 063/710] Update de.json (POEditor.com) --- Contents/Strings/de.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 28d15791a..614950d48 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -395,5 +395,6 @@ "Change the timing of the subtitle": "Die zeitliche Abstimmung des Untertitels ändern", "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Verschiebt den Untertitel um eine bestimmte Zeiteinheit", "Available": "Verfügbar", - "Current": "Aktuell" + "Current": "Aktuell", + "Custom path to advanced_settings.json": "Spezifischer Pfad zu advanced_settings.json" } \ No newline at end of file From 824957ae85850c0f54ac542fd2d3e082e029aebe Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 26 Apr 2018 06:30:13 +0200 Subject: [PATCH 064/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index a62993a66..874478951 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.5.4.2532 + 2.5.4.2535 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.4.2532 DEV +Version 2.5.4.2535 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From a01552e88ca1fbde19097f576d8aa5c8ff790baa Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 16 May 2018 18:11:27 +0200 Subject: [PATCH 065/710] menu: ignore options: fix plugin not responding, fix unicode strings; resolve #509 --- Contents/Code/interface/main.py | 7 ++++--- Contents/Code/interface/menu_helpers.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index fea01c688..8dff08c5c 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -322,7 +322,7 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): """ is_ignored = rating_key in ignore_list[kind] if not sure: - oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1="%s %s %s %s the ignore list" % ( + oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1=u"%s %s %s %s the ignore list" % ( "Add" if not is_ignored else "Remove", ignore_list.verbose(kind), title, "to" if not is_ignored else "from"), title2="Are you sure?") oc.add(DirectoryObject( @@ -334,6 +334,7 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): rel = ignore_list[kind] dont_change = False + state = None if todo == "remove": if not is_ignored: dont_change = True @@ -356,9 +357,9 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): dont_change = True if dont_change: - return fatality(force_title=" ", header="Didn't change the ignore list", no_history=True) + return fatality(force_title=" ", header=u"Didn't change the ignore list", no_history=True) - return fatality(force_title=" ", header="%s %s the ignore list" % (title, state), no_history=True) + return fatality(force_title=" ", header=u"%s %s the ignore list" % (title, state), no_history=True) @route(PREFIX + '/sections') diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index a4ee64036..42a5ec4ed 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -50,7 +50,7 @@ def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None in_list = rating_key in ignore_list[use_kind] oc.add(DirectoryObject( - key=Callback(callback_menu, kind=use_kind, rating_key=rating_key, title=title), + key=Callback(callback_menu, kind=use_kind, sure=False, todo="not_set", rating_key=rating_key, title=title), title=u"%s %s \"%s\"" % ( "Un-Ignore" if in_list else "Ignore", ignore_list.verbose(kind) if add_kind else "", unicode(title)) ) From bdd9134a0ede6a821f3ddb26e81403d49fe1e315 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 16 May 2018 18:39:00 +0200 Subject: [PATCH 066/710] providers: addic7ed: adapt to new (broken) search handling; use new ajax show-season endpoint --- .../subliminal_patch/providers/addic7ed.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index d779bcda0..4b3e3f926 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -3,6 +3,7 @@ import re import datetime import subliminal +import time from random import randint from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded @@ -142,10 +143,21 @@ def _search_show_id(self, series, year=None): # make the search logger.info('Searching show ids with %r', params) - r = self.session.get(self.server_url + 'srch.php', params=params, timeout=10) - r.raise_for_status() + + # currently addic7ed searches via srch.php from the front page, then a re-search is needed which calls + # search.php + for endpoint in ("srch.php", "search.php",): + r = self.session.get(self.server_url + endpoint, params=params, timeout=10) + r.raise_for_status() + + if "Sorry, your search" not in r.content: + break + + time.sleep(4) + if r.status_code == 304: raise TooManyRequests() + soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser']) suggestion = None @@ -174,7 +186,8 @@ def query(self, show_id, series, season, year=None, country=None): # get the page of the season of the show logger.info('Getting the page of show id %d, season %d', show_id, season) - r = self.session.get(self.server_url + 'show/%d' % show_id, params={'season': season}, timeout=10) + r = self.session.get(self.server_url + 'ajax_loadShow.php', params={'show': show_id, 'season': season}, + timeout=10) r.raise_for_status() if r.status_code == 304: From e842579f251c6ef7e4d896dce85e4291a357a4dd Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 16 May 2018 19:17:15 +0200 Subject: [PATCH 067/710] providers: addic7ed: handle empty r.content --- .../Libraries/Shared/subliminal_patch/providers/addic7ed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 4b3e3f926..d3a91806c 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -150,7 +150,7 @@ def _search_show_id(self, series, year=None): r = self.session.get(self.server_url + endpoint, params=params, timeout=10) r.raise_for_status() - if "Sorry, your search" not in r.content: + if r.content and "Sorry, your search" not in r.content: break time.sleep(4) From 7c32a7c2c82a38e8ae3dc3f6480909181e460b10 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 17 May 2018 14:35:42 +0200 Subject: [PATCH 068/710] providers: addic7ed: set correct headers for endpoints --- .../subliminal_patch/providers/addic7ed.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index d3a91806c..72e1d0b71 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -147,7 +147,12 @@ def _search_show_id(self, series, year=None): # currently addic7ed searches via srch.php from the front page, then a re-search is needed which calls # search.php for endpoint in ("srch.php", "search.php",): - r = self.session.get(self.server_url + endpoint, params=params, timeout=10) + headers = None + if endpoint == "search.php": + headers = { + "referer": self.server_url + "srch.php" + } + r = self.session.get(self.server_url + endpoint, params=params, timeout=10, headers=headers) r.raise_for_status() if r.content and "Sorry, your search" not in r.content: @@ -186,8 +191,15 @@ def query(self, show_id, series, season, year=None, country=None): # get the page of the season of the show logger.info('Getting the page of show id %d, season %d', show_id, season) - r = self.session.get(self.server_url + 'ajax_loadShow.php', params={'show': show_id, 'season': season}, - timeout=10) + r = self.session.get(self.server_url + 'ajax_loadShow.php', + params={'show': show_id, 'season': season}, + timeout=10, + headers={ + "referer": "%sshow/%s" % (self.server_url, show_id), + "X-Requested-With": "XMLHttpRequest" + } + ) + r.raise_for_status() if r.status_code == 304: From a7f7b3e57207b1c26e8785bffd1aec52a8a7a271 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 17 May 2018 14:40:04 +0200 Subject: [PATCH 069/710] bump dev changelog --- CHANGELOG.md | 19 +++++++++++++++++++ Contents/Info.plist | 4 ++-- README.md | 22 +++++----------------- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f442e181c..554188a5f 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,23 @@ +2.5.4.2527 + +- core: bugfixes +- core: get_item: don't fail on socket timeout; fixes #498 +- core: fix scandir encoding errors; #453 #461 #441 +- core: clamp menu history to 25 items +- add UnRAR for aarch64 (untested), arm (armv5tel, untested), linux/i386, MacOSX/i386; fixes #311 +- add 3rd party licenses +- menu: new debounce/history mechanism; fixes the back button usage +- config: add custom path option for advanced_settings.json +- providers: opensubtitles: re-add support for throttling based on HTTP response codes, which got ditched due to new connection interface +- providers: legendastv: disable if unrar wasn't found +- providers: addic7ed: reduce show cache to 1 week +- advanced settings: sonarr/radarr: make ssl verification optional +- advanced settings: opensubtitles: add configurable connection timeout +- refiners: drone: use certifi for HTTPS connections +- tasks: SearchAllRecentlyAddedMissing: fix ZeroDivisionError in edgecases; fixes #496 + + 2.5.3.2452 - core: update certifi to 2018.01.18 diff --git a/Contents/Info.plist b/Contents/Info.plist index 874478951..4b3d0a818 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.5.4.2535 + 2.5.4.2540 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.4.2535 DEV +Version 2.5.4.2540 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index c2f21de26..a833d1227 100644 --- a/README.md +++ b/README.md @@ -77,24 +77,12 @@ Jacob K, Ninjouz, chopeta, fvb, Jose ## Changelog -2.5.4.2527 - -- core: bugfixes -- core: get_item: don't fail on socket timeout; fixes #498 -- core: fix scandir encoding errors; #453 #461 #441 -- core: clamp menu history to 25 items -- add UnRAR for aarch64 (untested), arm (armv5tel, untested), linux/i386, MacOSX/i386; fixes #311 -- add 3rd party licenses -- menu: new debounce/history mechanism; fixes the back button usage -- config: add custom path option for advanced_settings.json -- providers: opensubtitles: re-add support for throttling based on HTTP response codes, which got ditched due to new connection interface -- providers: legendastv: disable if unrar wasn't found -- providers: addic7ed: reduce show cache to 1 week -- advanced settings: sonarr/radarr: make ssl verification optional -- advanced settings: opensubtitles: add configurable connection timeout -- refiners: drone: use certifi for HTTPS connections -- tasks: SearchAllRecentlyAddedMissing: fix ZeroDivisionError in edgecases; fixes #496 +2.5.4.2540 +- core: try retrieving advanced_settings.json from the path given, which may be a file path or a directory +- menu: ignore options: fix plugin not responding, fix unicode strings; resolve #509 +- providers: addic7ed: fix usage/adapt to new show search method +- providers: opensubtitles: properly handle responses again, re-enable automatic throttling based on those (broken since XMLRPC handler rewrite) From a1cc9a20497815c53e3dc8bcf02f40a84d8c17b9 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 17 May 2018 14:41:36 +0200 Subject: [PATCH 070/710] release 2.5.4.2541 --- Contents/Info.plist | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 4b3d0a818..a6fe616d5 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.5.4.2540 + 2.5.4.2541 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.4.2540 DEV +Version 2.5.4.2541 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index a833d1227..45729544b 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ Jacob K, Ninjouz, chopeta, fvb, Jose ## Changelog -2.5.4.2540 +2.5.4.2541 - core: try retrieving advanced_settings.json from the path given, which may be a file path or a directory - menu: ignore options: fix plugin not responding, fix unicode strings; resolve #509 From 682d1d85ce62f4c5cee58ab981c6751e6ddd1e03 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 17 May 2018 14:58:38 +0200 Subject: [PATCH 071/710] remove dev flag --- Contents/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index a6fe616d5..4d44b1c7a 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ PlexPluginConsoleLogging 0 PlexPluginDevMode - 1 + 0 PlexPluginCodePolicy Elevated From f3f9ab13607fc6c157968c87a9b9d8af626f4093 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 17 May 2018 15:01:14 +0200 Subject: [PATCH 072/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 4d44b1c7a..4963ede88 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ PlexPluginConsoleLogging 0 PlexPluginDevMode - 0 + 1 PlexPluginCodePolicy Elevated @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.4.2541 +Version 2.5.4.2541 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 924de62dff9d9789e4bb64c00adcc77704e9aa2f Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 17 May 2018 15:08:39 +0200 Subject: [PATCH 073/710] fix missing string, thanks @morpheus133 --- Contents/Code/interface/item_details.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index 49bb2aa03..ee6fb8189 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -91,7 +91,8 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra randomize=timestamp(), timeout=timeout * 1000), title=_(u"Refresh: %s", item_title), - summary=_("Refreshes the %s, possibly searching for missing and picking up new subtitles on disk", current_kind), + summary=_("Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up " + "new subtitles on disk", the_movie_series_season_episode=_(u"the %s" % current_kind)), thumb=item.thumb or default_thumb )) oc.add(DirectoryObject( From 5199fbe0cbad205db487c7dd62c7bf5305248962 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 15:28:11 +0200 Subject: [PATCH 074/710] fix #520 --- Contents/Code/support/config.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index f04b2472b..bd8588fb0 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -502,9 +502,14 @@ def check_notify_executable(self): if not fn: return - splitted_fn = fn.split() - exe_fn = splitted_fn[0] - arguments = [arg.strip() for arg in splitted_fn[1:]] + got_args = "%(" in fn + if got_args: + first_arg_pos = fn.index("%(") + exe_fn = fn[:first_arg_pos].strip() + arguments = [arg.strip() for arg in fn[first_arg_pos:].split()] + else: + exe_fn = fn + arguments = [] if os.path.isfile(exe_fn) and os.access(exe_fn, os.X_OK): return exe_fn, arguments From 8b6b162073cebe7465db1413f51bb71aaf784fea Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 15:48:13 +0200 Subject: [PATCH 075/710] try fixing #518 --- Contents/Libraries/Shared/libfilebot/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/libfilebot/main.py b/Contents/Libraries/Shared/libfilebot/main.py index 55c3ab1f1..44d016a89 100644 --- a/Contents/Libraries/Shared/libfilebot/main.py +++ b/Contents/Libraries/Shared/libfilebot/main.py @@ -50,7 +50,8 @@ def default_xattr(fn): ), "darwin": { lambda fn: ["xattr", "-p", "net.filebot.filename", fn], - lambda result: binascii.unhexlify(result.replace(' ', '').replace('\n', '')).strip("\x00") + lambda result: binascii.unhexlify(result.strip().replace(' ', '').replace('\r\n', '').replace('\r', '') + .replace('\n', '')).strip("\x00") }, "win32": { lambda fn: fn, From 70c1142f8dbf87f2b22fa6faa41cecdabc329d97 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 16:05:50 +0200 Subject: [PATCH 076/710] #518 correctly define functions for darwin and win32 --- Contents/Libraries/Shared/libfilebot/main.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Contents/Libraries/Shared/libfilebot/main.py b/Contents/Libraries/Shared/libfilebot/main.py index 44d016a89..8a632765b 100644 --- a/Contents/Libraries/Shared/libfilebot/main.py +++ b/Contents/Libraries/Shared/libfilebot/main.py @@ -48,15 +48,15 @@ def default_xattr(fn): lambda result: re.search('(?um)(net\.filebot\.filename(?=="|: )[=:" ]+|Attribute.+:\s)([^"\n\r\0]+)', result).group(2) ), - "darwin": { + "darwin": ( lambda fn: ["xattr", "-p", "net.filebot.filename", fn], lambda result: binascii.unhexlify(result.strip().replace(' ', '').replace('\r\n', '').replace('\r', '') .replace('\n', '')).strip("\x00") - }, - "win32": { + ), + "win32": ( lambda fn: fn, win32_xattr, - } + ) } if sys.platform not in XATTR_MAP: From 01d5a18af84c2ca84168c49b5f83ac82f307c6d5 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 16:06:13 +0200 Subject: [PATCH 077/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 4963ede88..f0fb7bbf9 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.5.4.2541 + 2.5.4.2547 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.4.2541 DEV +Version 2.5.4.2547 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From e91aac65cc20808d50c4a8ea79fb2103ab30add9 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 16:08:00 +0200 Subject: [PATCH 078/710] add debug info --- Contents/Libraries/Shared/libfilebot/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Contents/Libraries/Shared/libfilebot/main.py b/Contents/Libraries/Shared/libfilebot/main.py index 8a632765b..7f76c191e 100644 --- a/Contents/Libraries/Shared/libfilebot/main.py +++ b/Contents/Libraries/Shared/libfilebot/main.py @@ -96,6 +96,7 @@ def get_filebot_attrs(fn): return orig_fn.strip() except: logger.info(u"%s: Couldn't get filebot original filename" % fn) + logger.debug(u"%s: Result: %r" % (fn, output)) if __name__ == "__main__": From edf6c25e17fe43117f3e6b70e705db6259c4c706 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 16:32:17 +0200 Subject: [PATCH 079/710] add libfilebot to logged dependencies --- Contents/Libraries/Shared/subzero/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/constants.py b/Contents/Libraries/Shared/subzero/constants.py index d541de9f2..43297b2a2 100755 --- a/Contents/Libraries/Shared/subzero/constants.py +++ b/Contents/Libraries/Shared/subzero/constants.py @@ -2,7 +2,7 @@ OS_PLEX_USERAGENT = 'plexapp.com v9.0' -DEPENDENCY_MODULE_NAMES = ['subliminal', 'subliminal_patch', 'enzyme', 'guessit', 'subzero'] +DEPENDENCY_MODULE_NAMES = ['subliminal', 'subliminal_patch', 'enzyme', 'guessit', 'subzero', 'libfilebot'] PERSONAL_MEDIA_IDENTIFIER = "com.plexapp.agents.none" PLUGIN_IDENTIFIER_SHORT = "subzero" PLUGIN_IDENTIFIER = "com.plexapp.agents.%s" % PLUGIN_IDENTIFIER_SHORT From 42b7e9fa62cb883177b9aac0a485c26c77634948 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 16:34:02 +0200 Subject: [PATCH 080/710] add logging for the filebot refiner --- .../Libraries/Shared/subliminal_patch/refiners/filebot.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/filebot.py b/Contents/Libraries/Shared/subliminal_patch/refiners/filebot.py index 0cd3df48c..90bd14353 100644 --- a/Contents/Libraries/Shared/subliminal_patch/refiners/filebot.py +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/filebot.py @@ -1,8 +1,11 @@ # coding=utf-8 +import logging from libfilebot import get_filebot_attrs from common import update_video +logger = logging.getLogger(__name__) + def refine(video, **kwargs): """ @@ -15,3 +18,5 @@ def refine(video, **kwargs): if orig_fn: update_video(video, orig_fn) + else: + logger.info(u"%s: Filebot didn't return an original filename", orig_fn) From 02761db660d37c8c87905f7a8d90248d250207a9 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 16:38:28 +0200 Subject: [PATCH 081/710] and even more logging --- .../Shared/subliminal_patch/refiners/filebot.py | 13 ++++++++----- Contents/Libraries/Shared/subzero/video.py | 1 + 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/filebot.py b/Contents/Libraries/Shared/subliminal_patch/refiners/filebot.py index 90bd14353..332026d9d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/refiners/filebot.py +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/filebot.py @@ -14,9 +14,12 @@ def refine(video, **kwargs): :param kwargs: :return: """ - orig_fn = get_filebot_attrs(video.name) + try: + orig_fn = get_filebot_attrs(video.name) - if orig_fn: - update_video(video, orig_fn) - else: - logger.info(u"%s: Filebot didn't return an original filename", orig_fn) + if orig_fn: + update_video(video, orig_fn) + else: + logger.info(u"%s: Filebot didn't return an original filename", video.name) + except: + logger.exception(u"%s: Something went wrong when retrieving filebot attributes:", video.name) diff --git a/Contents/Libraries/Shared/subzero/video.py b/Contents/Libraries/Shared/subzero/video.py index bfd9d2471..fd5dc9fed 100644 --- a/Contents/Libraries/Shared/subzero/video.py +++ b/Contents/Libraries/Shared/subzero/video.py @@ -115,6 +115,7 @@ def refine_video(video, no_refining=False, refiner_settings=None): video.year = year refine(video, **refine_kwargs) + logger.info(u"Using filename: %s", video.original_name) if hints["type"] == "movie" and not video.imdb_id: if plex_title: From 451b34dceb9e3b592d145ff9db6ad88f4165d8fc Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 16:39:16 +0200 Subject: [PATCH 082/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index f0fb7bbf9..5ffa83f15 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.5.4.2547 + 2.5.4.2552 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.4.2547 DEV +Version 2.5.4.2552 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From bd8e26ecab61b23f03b78ebc361d0ae96aaf7213 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 16:57:23 +0200 Subject: [PATCH 083/710] add additional debug logging in case of filebot attr retrieval error --- Contents/Libraries/Shared/libfilebot/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/libfilebot/main.py b/Contents/Libraries/Shared/libfilebot/main.py index 7f76c191e..2d75f17ef 100644 --- a/Contents/Libraries/Shared/libfilebot/main.py +++ b/Contents/Libraries/Shared/libfilebot/main.py @@ -83,7 +83,8 @@ def get_filebot_attrs(fn): output = subprocess.check_output(quote_args(args), stderr=subprocess.PIPE, shell=True) except subprocess.CalledProcessError, e: if e.returncode == 1: - logger.info(u"%s: Couldn't get filebot original filename", fn) + logger.info(u"%s: Couldn't get filebot original filename, args: %r, error: %s", fn, args, + traceback.format_exc()) else: logger.error(u"%s: Unexpected error while getting filebot original filename: %s", fn, traceback.format_exc()) From 9ca959a20a2b839967bf18e52d9f75ee9e1a2321 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 17:23:42 +0200 Subject: [PATCH 084/710] libfilebot: use subprocess.Popen directly instead of check_output --- Contents/Libraries/Shared/libfilebot/main.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Contents/Libraries/Shared/libfilebot/main.py b/Contents/Libraries/Shared/libfilebot/main.py index 2d75f17ef..97d62a4b6 100644 --- a/Contents/Libraries/Shared/libfilebot/main.py +++ b/Contents/Libraries/Shared/libfilebot/main.py @@ -80,13 +80,18 @@ def get_filebot_attrs(fn): args = args_func(fn) if isinstance(args, types.ListType): try: - output = subprocess.check_output(quote_args(args), stderr=subprocess.PIPE, shell=True) - except subprocess.CalledProcessError, e: - if e.returncode == 1: + proc = subprocess.Popen(quote_args(args), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + output, errors = proc.communicate() + + if proc.returncode == 1: logger.info(u"%s: Couldn't get filebot original filename, args: %r, error: %s", fn, args, - traceback.format_exc()) - else: - logger.error(u"%s: Unexpected error while getting filebot original filename: %s", fn, + errors.decode()) + return + + output = output.decode() + + except: + logger.error(u"%s: Unexpected error while getting filebot original filename: %s", fn, traceback.format_exc()) return else: From e7fbfca2d7dccf150557aba9694a34c83e11a397 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 17:25:48 +0200 Subject: [PATCH 085/710] libfilebot: log output as well in case of returncode 1 --- Contents/Libraries/Shared/libfilebot/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/libfilebot/main.py b/Contents/Libraries/Shared/libfilebot/main.py index 97d62a4b6..62d35f9bd 100644 --- a/Contents/Libraries/Shared/libfilebot/main.py +++ b/Contents/Libraries/Shared/libfilebot/main.py @@ -84,8 +84,8 @@ def get_filebot_attrs(fn): output, errors = proc.communicate() if proc.returncode == 1: - logger.info(u"%s: Couldn't get filebot original filename, args: %r, error: %s", fn, args, - errors.decode()) + logger.info(u"%s: Couldn't get filebot original filename, args: %r, output: %r, error: %r", fn, args, + output, errors) return output = output.decode() From 2252d7ea6a45b4e79a99faec1cc78059dd85c96d Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 17:39:42 +0200 Subject: [PATCH 086/710] libfilebot: set correct environment for xattr calls --- Contents/Libraries/Shared/libfilebot/main.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/libfilebot/main.py b/Contents/Libraries/Shared/libfilebot/main.py index 62d35f9bd..cce154647 100644 --- a/Contents/Libraries/Shared/libfilebot/main.py +++ b/Contents/Libraries/Shared/libfilebot/main.py @@ -7,11 +7,14 @@ import re import binascii import types +import os from pipes import quote from lib import find_executable +mswindows = False if sys.platform == "win32": + mswindows = True from pyads import ADS logger = logging.getLogger(__name__) @@ -80,7 +83,22 @@ def get_filebot_attrs(fn): args = args_func(fn) if isinstance(args, types.ListType): try: - proc = subprocess.Popen(quote_args(args), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + env = dict(os.environ) + if not mswindows: + env_path = {"PATH": os.pathsep.join( + [ + "/usr/local/bin", + "/usr/bin", + os.environ.get("PATH", "") + ] + ) + } + env = dict(os.environ, **env_path) + + env.pop("LD_LIBRARY_PATH", None) + + proc = subprocess.Popen(quote_args(args), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, + env=env) output, errors = proc.communicate() if proc.returncode == 1: From c686214f56520480c140f4d66d2074e6f2266333 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 17:40:34 +0200 Subject: [PATCH 087/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 5ffa83f15..89c8d5dd9 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.5.4.2552 + 2.5.4.2557 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.4.2552 DEV +Version 2.5.4.2557 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 98291370019cf9db2855941dff919d807c914ebc Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 May 2018 17:41:59 +0200 Subject: [PATCH 088/710] libfilebot: add sbin folders to environment as well --- Contents/Libraries/Shared/libfilebot/main.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Contents/Libraries/Shared/libfilebot/main.py b/Contents/Libraries/Shared/libfilebot/main.py index cce154647..00e5cc9e6 100644 --- a/Contents/Libraries/Shared/libfilebot/main.py +++ b/Contents/Libraries/Shared/libfilebot/main.py @@ -89,6 +89,8 @@ def get_filebot_attrs(fn): [ "/usr/local/bin", "/usr/bin", + "/usr/local/sbin", + "/usr/sbin", os.environ.get("PATH", "") ] ) From 833d7072ed11c278c94fd53fc28a27f2fe190e93 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 26 May 2018 05:06:16 +0200 Subject: [PATCH 089/710] libfilebot: remove native xattr handling and use filebot itself --- Contents/Libraries/Shared/libfilebot/main.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Contents/Libraries/Shared/libfilebot/main.py b/Contents/Libraries/Shared/libfilebot/main.py index 00e5cc9e6..565a6f5a9 100644 --- a/Contents/Libraries/Shared/libfilebot/main.py +++ b/Contents/Libraries/Shared/libfilebot/main.py @@ -51,11 +51,11 @@ def default_xattr(fn): lambda result: re.search('(?um)(net\.filebot\.filename(?=="|: )[=:" ]+|Attribute.+:\s)([^"\n\r\0]+)', result).group(2) ), - "darwin": ( - lambda fn: ["xattr", "-p", "net.filebot.filename", fn], - lambda result: binascii.unhexlify(result.strip().replace(' ', '').replace('\r\n', '').replace('\r', '') - .replace('\n', '')).strip("\x00") - ), + # "darwin": ( + # lambda fn: ["xattr", "-p", "net.filebot.filename", fn], + # lambda result: binascii.unhexlify(result.strip().replace(' ', '').replace('\r\n', '').replace('\r', '') + # .replace('\n', '')).strip("\x00") + # ), "win32": ( lambda fn: fn, win32_xattr, From ba8a165aa516473b96ab425f46489a531794134d Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 26 May 2018 05:50:07 +0200 Subject: [PATCH 090/710] libfilebot: filebot executable fallback --- Contents/Libraries/Shared/libfilebot/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/libfilebot/main.py b/Contents/Libraries/Shared/libfilebot/main.py index 565a6f5a9..4dcbeefbc 100644 --- a/Contents/Libraries/Shared/libfilebot/main.py +++ b/Contents/Libraries/Shared/libfilebot/main.py @@ -63,7 +63,8 @@ def default_xattr(fn): } if sys.platform not in XATTR_MAP: - default_xattr_bin = find_executable("getfattr") or find_executable("attr") or find_executable("filebot") + default_xattr_bin = find_executable("getfattr") or find_executable("attr") or find_executable("filebot") \ + or "filebot" def get_filebot_attrs(fn): From a6120ae27a151a98bae50ce88bfff4b1eff2553f Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 26 May 2018 06:06:58 +0200 Subject: [PATCH 091/710] libfilebot: use filebot instead of xattr for darwin, just to be safe --- Contents/Libraries/Shared/libfilebot/main.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Contents/Libraries/Shared/libfilebot/main.py b/Contents/Libraries/Shared/libfilebot/main.py index 4dcbeefbc..9a4e685eb 100644 --- a/Contents/Libraries/Shared/libfilebot/main.py +++ b/Contents/Libraries/Shared/libfilebot/main.py @@ -56,6 +56,11 @@ def default_xattr(fn): # lambda result: binascii.unhexlify(result.strip().replace(' ', '').replace('\r\n', '').replace('\r', '') # .replace('\n', '')).strip("\x00") # ), + "darwin": ( + lambda fn: ["filebot", "-script", "fn:xattr", fn], + lambda result: re.search('(?um)(net\.filebot\.filename(?=="|: )[=:" ]+|Attribute.+:\s)([^"\n\r\0]+)', + result).group(2) + ), "win32": ( lambda fn: fn, win32_xattr, From c0aa465827724db3f566698fc620514a7b915c10 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 26 May 2018 06:07:42 +0200 Subject: [PATCH 092/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 89c8d5dd9..bdce62aae 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.5.4.2557 + 2.5.4.2562 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.4.2557 DEV +Version 2.5.4.2562 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 696e9d6b648d84ef667be81b56e7b0269c25c3ad Mon Sep 17 00:00:00 2001 From: Dimo Tsai Date: Sun, 6 May 2018 02:04:03 +0800 Subject: [PATCH 093/710] Support Traditional Chinese Since 'zh'always represents simplified Chinese in opensubtitles.org, add 'zh-Hant' as an additional language option in the menu. And fix the language converter of opensubtitles. --- Contents/DefaultPrefs.json | 6 ++++++ Contents/Libraries/Shared/subliminal_patch/language.py | 4 ++++ Contents/Strings/en.json | 2 ++ 3 files changed, 12 insertions(+) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 42b4284b5..c29b1e730 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -11,6 +11,8 @@ "bg", "ca", "zh", + "zh-hans", + "zh-hant", "cs", "da", "nl", @@ -67,6 +69,8 @@ "bg", "ca", "zh", + "zh-hans", + "zh-hant", "cs", "da", "nl", @@ -123,6 +127,8 @@ "bg", "ca", "zh", + "zh-hans", + "zh-hant", "cs", "da", "nl", diff --git a/Contents/Libraries/Shared/subliminal_patch/language.py b/Contents/Libraries/Shared/subliminal_patch/language.py index c79476291..83f70e155 100644 --- a/Contents/Libraries/Shared/subliminal_patch/language.py +++ b/Contents/Libraries/Shared/subliminal_patch/language.py @@ -20,6 +20,10 @@ def __init__(self): self.to_opensubtitles.update({ ('srp', None, "Latn"): 'scc', ('srp', None, "Cyrl"): 'scc', + ('chi', None, 'Hant'): 'zht' + }) + self.from_opensubtitles.update({ + 'zht': ('zho', None, 'Hant') }) def convert(self, alpha3, country=None, script=None): diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 8d5307873..8d47b75c9 100755 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -6,6 +6,8 @@ "bg":"Bulgarian", "ca":"Catalan", "zh":"Chinese", + "zh-hant":"Chinese (Traditional)", + "zh-hans":"Chinese (Simplified)", "hr":"Croatian", "cs":"Czech", "da":"Danish", From 5661528862fc1d64f2fa073c5954dec58fd6710a Mon Sep 17 00:00:00 2001 From: Dimo Tsai Date: Mon, 28 May 2018 10:16:50 +0800 Subject: [PATCH 094/710] Add assrt provider and language converter Since shooter.cn is not available any longer, implement a new provider for Chinese as an alternative. --- Contents/Code/support/config.py | 5 +- Contents/DefaultPrefs.json | 12 ++ .../subliminal_patch/converters/assrt.py | 25 +++ .../subliminal_patch/providers/assrt.py | 164 ++++++++++++++++++ 4 files changed, 205 insertions(+), 1 deletion(-) create mode 100644 Contents/Libraries/Shared/subliminal_patch/converters/assrt.py create mode 100644 Contents/Libraries/Shared/subliminal_patch/providers/assrt.py diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index f04b2472b..94bf49f8a 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -625,6 +625,7 @@ def get_providers(self, media_type="series"): 'subscene': cast_bool(Prefs['provider.subscene.enabled']), 'argenteam': cast_bool(Prefs['provider.argenteam.enabled']), 'subscenter': False, + 'assrt': cast_bool(Prefs['provider.assrt.enabled']), } providers_by_prefs = copy.deepcopy(providers) @@ -643,6 +644,7 @@ def get_providers(self, media_type="series"): providers["hosszupuska"] = False providers["titlovi"] = False providers["argenteam"] = False + providers["assrt"] = False if not self.unrar and providers["legendastv"]: providers["legendastv"] = False @@ -701,7 +703,8 @@ def get_provider_settings(self): }, 'legendastv': {'username': Prefs['provider.legendastv.username'], 'password': Prefs['provider.legendastv.password'], - } + }, + 'assrt': {'token': Prefs['provider.assrt.token'], } } return provider_settings diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index c29b1e730..ddc180eae 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -398,6 +398,18 @@ "type": "bool", "default": "false" }, + { + "id": "provider.assrt.enabled", + "label": "Provider: Enable assrt.net (Chinese)", + "type": "bool", + "default": "false" + }, + { + "id": "provider.assrt.token", + "label": "Assrt API Token", + "type": "text", + "default": "" + }, { "id": "providers.multithreading", "label": "Search enabled providers simultaneously (multithreading)", diff --git a/Contents/Libraries/Shared/subliminal_patch/converters/assrt.py b/Contents/Libraries/Shared/subliminal_patch/converters/assrt.py new file mode 100644 index 000000000..ed4fd0362 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/converters/assrt.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +from babelfish import LanguageReverseConverter +from subliminal.exceptions import ConfigurationError + +class AssrtConverter(LanguageReverseConverter): + def __init__(self): + self.from_assrt = { u'简体': ('zho', None, 'Hans'), u'繁体': ('zho', None, 'Hant'), + u'簡體': ('zho', None, 'Hans'), u'繁體': ('zho', None, 'Hant'), + u'英文': ('eng',), + u'chs': ('zho', None, 'Hans'), u'cht': ('zho', None, 'Hant'), + u'chn': ('zho', None, 'Hans'), u'twn': ('zho', None, 'Hant')} + self.to_assrt = { ('zho', None, 'Hans'): u'chs', ('zho', None, 'Hant'): u'cht', ('eng',) : u'eng' } + self.codes = set(self.from_assrt.keys()) + + def convert(self, alpha3, country=None, script=None): + if (alpha3, country, script) in self.to_assrt: + return self.to_assrt[(alpha3, country, script)] + + raise ConfigurationError('Unsupported language for assrt: %s, %s, %s' % (alpha3, country, script)) + + def reverse(self, assrt): + if assrt in self.from_assrt: + return self.from_assrt[assrt] + + raise ConfigurationError('Unsupported language code for assrt: %s' % assrt) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/assrt.py b/Contents/Libraries/Shared/subliminal_patch/providers/assrt.py new file mode 100644 index 000000000..3ba011291 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/providers/assrt.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- +import json +import logging +import os +import re + +from babelfish import language_converters +from guessit import guessit +from requests import Session + +from subliminal import Movie, Episode, ProviderError, __short_version__ +from subliminal.exceptions import AuthenticationError, ConfigurationError, DownloadLimitExceeded, ProviderError +from subliminal_patch.subtitle import Subtitle, guess_matches +from subliminal.subtitle import fix_line_ending +from subliminal_patch.providers import Provider +from subzero.language import Language + +logger = logging.getLogger(__name__) + +language_converters.register('assrt = subliminal_patch.converters.assrt:AssrtConverter') + +server_url = 'https://api.assrt.net/v1' +supported_languages = language_converters['assrt'].to_assrt.keys() + +class AssrtSubtitle(Subtitle): + """Assrt Sbutitle.""" + provider_name = 'assrt' + guessit_options = { + 'allowed_languages': [ l[0] for l in supported_languages ], + 'allowed_countries': [ l[1] for l in supported_languages if len(l) > 1 ], + 'enforce_list': True + } + + def __init__(self, language, subtitle_id, video_name, session, token): + super(AssrtSubtitle, self).__init__(language) + self.session = session + self.token = token + self.subtitle_id = subtitle_id + self.video_name = video_name + self.url = None + self._detail = None + + def _get_detail(self): + if self._detail: + return self._detail + params = {'token': self.token, 'id': self.id} + r = self.session.get(server_url + '/sub/detail', params=params, timeout=10) + r.raise_for_status() + + result = r.json() + sub = result['sub']['subs'][0] + files = sub['filelist'] + + # first pass: guessit + for f in files: + logger.info('File %r', f) + guess = guessit(f['f'], self.guessit_options) + logger.info('GuessIt %r', guess) + langs = set() + if 'language' in guess: + langs.update(guess['language']) + if 'subtitle_language' in guess: + langs.update(guess['subtitle_language']) + if self.language in langs: + self._defail = f + return f + + # second pass: keyword matching + codes = language_converters['assrt'].codes + for f in files: + langs = set([ Language.fromassrt(k) for k in codes if k in f['f'] ]) + logger.info('%s: %r', f['f'], langs) + if self.language in langs: + self._defail = f + return f + + # fallback: pick up first file if nothing matches + return files[0] + + @property + def id(self): + return self.subtitle_id + + @property + def download_link(self): + detail = self._get_detail() + return detail['url'] + + def get_matches(self, video): + matches = guess_matches(video, guessit(self.video_name)) + return matches + +class AssrtProvider(Provider): + """Assrt Provider.""" + languages = {Language(*l) for l in supported_languages} + + def __init__(self, token=None): + if not token: + raise ConfigurationError('Token must be specified') + self.token = token + + def initialize(self): + self.session = Session() + self.session.headers = {'User-Agent': os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")} + + def terminate(self): + self.session.close() + + def query(self, languages, video): + # query the server + keywords = [] + if isinstance(video, Movie): + if video.title: + keywords.append(video.title) + if video.year: + keywords.append(str(video.year)) + elif isinstance(video, Episode): + if video.series: + keywords.append(video.series) + if video.season and video.episode: + keywords.append('S%02dE%02d' % (video.season, video.episode)) + elif video.episode: + keywords.append('E%02d' % video.episode) + query = ' '.join(keywords) + + params = {'token': self.token, 'q': query, 'is_file': 1} + logger.debug('Searching subtitles %r', params) + res = self.session.get(server_url + '/sub/search', params=params, timeout=10) + res.raise_for_status() + result = res.json() + + if result['status'] != 0: + logger.error('status error: %r', r) + return [] + + if not result['sub']['subs']: + logger.debug('No subtitle found') + + # parse the subtitles + pattern = re.compile(ur'lang(?P\w+)') + subtitles = [] + for sub in result['sub']['subs']: + if 'lang' not in sub: + continue + for key in sub['lang']['langlist'].keys(): + match = pattern.match(key) + try: + language = Language.fromassrt(match.group('code')) + if language in languages: + subtitles.append(AssrtSubtitle(language, sub['id'], sub['videoname'], self.session, self.token)) + except: + pass + + return subtitles + + def list_subtitles(self, video, languages): + return self.query(languages, video) + + def download_subtitle(self, subtitle): + logger.info('Downloading subtitle %r', subtitle) + r = self.session.get(subtitle.download_link, timeout=10) + r.raise_for_status() + + subtitle.content = fix_line_ending(r.content) From 4a4c6e7df2b705d96a7a22a7a049fb1b4a052578 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 30 May 2018 16:20:38 +0200 Subject: [PATCH 095/710] enable logging of notification executable's output and error streams when its exit code is 1, #355 --- Contents/Code/support/helpers.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 9e16237ab..68f634c83 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -307,12 +307,21 @@ def notify_executable(exe_info, videos, subtitles, storage): env.pop("LD_LIBRARY_PATH", None) try: - output = subprocess.check_output(quote_args([exe] + prepared_arguments), - stderr=subprocess.STDOUT, shell=True, env=env) - except subprocess.CalledProcessError: - Log.Error(u"Calling %s failed: %s" % (exe, traceback.format_exc())) + proc = subprocess.Popen(quote_args([exe] + prepared_arguments), stdout=subprocess.PIPE, + stderr=subprocess.PIPE, shell=True, env=env) + output, errors = proc.communicate() + + if proc.returncode == 1: + Log.Info(u"Calling %s failed: %s, args: %r, output: %r, error: %r", exe, prepared_arguments, + output, errors) + return + + output = output.decode() + + except: + Log.Error(u"Calling %s failed: %s", exe, traceback.format_exc()) else: - Log.Debug(u"Process output: %s" % output) + Log.Debug(u"Process output: %s", output) def track_usage(category=None, action=None, label=None, value=None): From 7a47e6617d00bec22fc042476e72ccc3227fd1de Mon Sep 17 00:00:00 2001 From: morpheus133 Date: Tue, 5 Jun 2018 12:29:06 +0200 Subject: [PATCH 096/710] - Changed coding to UTF8 - Using .json() insted of manually parsing --- .../providers/supersubtitles.py | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py index 31ee3200b..f56099822 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py @@ -1,4 +1,4 @@ -# coding: iso8859_2 +# coding=utf-8 import io import six import os @@ -199,35 +199,31 @@ def find_id(self, series, year, original_title): url = self.server_url + "index.php?term=" + series + "&nyelv=0&action=autoname" # url = self.server_url + "index.php?term=" + "fla"+ "&nyelv=0&action=autoname" logger.info('Get series id from URL %s', url) - r = self.session.get(url, timeout=10).content + r = self.session.get(url, timeout=10) # r is something like this: # [{"name":"DC\u2019s Legends of Tomorrow (2016)","ID":"3725"},{"name":"Miles from Tomorrowland (2015)","ID":"3789"} # ,{"name":"No Tomorrow (2016)","ID":"4179"}] - # We create a list from the data between { } - # "name":"DC\u2019s Legends of Tomorrow (2016)","ID":"3725" - # "name":"Miles from Tomorrowland (2015)","ID":"3789" - # ... - results = re.findall(r"(?<={).*?(?=})", str(r)) + results = r.json() # check all of the results: for result in results: try: # "name":"Miles from Tomorrowland (2015)","ID":"3789" - result_year = re.findall(r"(?<=\()\d\d\d\d(?=\))", result)[0] + result_year = re.findall(r"(?<=\()\d\d\d\d(?=\))", result['name'])[0] except IndexError: result_year = "" try: # "name":"Miles from Tomorrowland (2015)","ID":"3789" - result_title = re.findall(r"(?<=name\":\").*(?=\()", result)[0] - result_id = re.findall(r"(?<=ID\":\").*(?=\")", result)[0] + result_title = re.findall(r".*(?=\(\d\d\d\d\))", result['name'])[0] + result_id = result['ID'] except IndexError: continue - result_title = result_title.strip().replace("u2019", "").replace("\\\\u2019", "").replace("'", "").replace("\\", - "").replace(" ", ".") + result_title = result_title.strip().replace("", "").replace(" ", ".") + guessable = result_title.strip() + ".s01e01." + result_year guess = guessit(guessable, {'type': "episode"}) From 67ba6be6e2494fde6fba93049ce957b180f544cc Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 5 Jun 2018 14:38:15 +0200 Subject: [PATCH 097/710] #355 try finding executable in path --- Contents/Code/support/config.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index bd8588fb0..232d6a50f 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -513,6 +513,19 @@ def check_notify_executable(self): if os.path.isfile(exe_fn) and os.access(exe_fn, os.X_OK): return exe_fn, arguments + + # try finding the executable itself, the path might contain spaces and there might have been other arguments + fn_split = exe_fn.split(u" ") + tmp_exe_fn = fn_split[0] + + for offset in range(1, len(fn_split)+1): + if os.path.isfile(tmp_exe_fn) and os.access(tmp_exe_fn, os.X_OK): + exe_fn = tmp_exe_fn.strip() + arguments = [arg.strip() for arg in fn_split[offset:]] + arguments + return exe_fn, arguments + + tmp_exe_fn = u" ".join(fn_split[:offset+1]) + Log.Error("Notify executable not existing or not executable: %s" % exe_fn) def refresh_enabled_sections(self): From a749ed4837c3560627025031ed9aff81961025c8 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 6 Jun 2018 18:40:29 +0200 Subject: [PATCH 098/710] core: handle "ENGLISH" --- Contents/Libraries/Shared/subzero/language.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index a07952bba..6185f900f 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -7,6 +7,7 @@ repl_map = { "dk": "da", "nld": "nl", + "english": "en", } @@ -24,8 +25,9 @@ def language_from_stream(l): class Language(Language_): @classmethod def fromietf(cls, ietf): - if ietf in repl_map: - ietf = repl_map[ietf] + ietf_lower = ietf.lower() + if ietf_lower in repl_map: + ietf = repl_map[ietf_lower] return Language_.fromietf(ietf) From 4e3b8ee3c2aeffb7ad19bcb3dc068b08fefafae0 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 6 Jun 2018 18:43:27 +0200 Subject: [PATCH 099/710] opensubtitles: only try logging out if token existed --- .../Shared/subliminal_patch/providers/opensubtitles.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index 73bfb7e96..bcaf3a06f 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -182,10 +182,11 @@ def initialize(self): logger.error("Login failed, please check your credentials") def terminate(self): - try: - checked(lambda: self.server.LogOut(self.token)) - except: - logger.error("Logout failed: %s", traceback.format_exc()) + if self.token: + try: + checked(lambda: self.server.LogOut(self.token)) + except: + logger.error("Logout failed: %s", traceback.format_exc()) try: self.server.close() From c3b2ffa97d6de02420af583b8db9e414fae59076 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 6 Jun 2018 21:59:31 +0200 Subject: [PATCH 100/710] submod: HI: support "&" and "+" in hi_before_colon --- .../subzero/modification/mods/hearing_impaired.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py index c5ab9900d..d202ea65a 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py @@ -50,15 +50,15 @@ class HearingImpaired(SubtitleTextModification): # uppercase text before colon (at least 3 uppercase chars); at start or after a sentence, # possibly with a dash in front; ignore anything ending with a quote - NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"\']))([\s-]*(?=[A-ZÀ-Ž]\s*[A-ZÀ-Ž]\s*[A-ZÀ-Ž])' - ur'[A-ZÀ-Ž-_0-9\s\"\']+:(?![\"\'’ʼ❜‘‛”“‟„])\s*)(?![0-9])'), "", + NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"\']))([\s-]*(?=[A-ZÀ-Ž&+]\s*[A-ZÀ-Ž&+]\s*[A-ZÀ-Ž&+])' + ur'[A-ZÀ-Ž-_0-9\s\"\'&+]+:(?![\"\'’ʼ❜‘‛”“‟„])\s*)(?![0-9])'), "", name="HI_before_colon_caps"), # any text before colon (at least 3 chars); at start or after a sentence, # possibly with a dash in front; try not breaking actual sentences with a colon at the end by not matching if # more than one space is inside the text; ignore anything ending with a quote - NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"]))([\s-]*(?=[A-zÀ-ž]\s*[A-zÀ-ž]\s*[A-zÀ-ž])' - ur'[A-zÀ-ž-_0-9\s\"\']+:(?![\"’ʼ❜‘‛”“‟„])\s*)(?![0-9])'), + NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"]))([\s-]*(?=[A-zÀ-ž&+]\s*[A-zÀ-ž&+]\s*[A-zÀ-ž&+])' + ur'[A-zÀ-ž-_0-9\s\"\'&+]+:(?![\"’ʼ❜‘‛”“‟„])\s*)(?![0-9])'), lambda match: match.group(1) if (match.group(1).count(" ") > 1 or match.group(1).count("-") > 1) else "", name="HI_before_colon_noncaps"), @@ -69,7 +69,7 @@ class HearingImpaired(SubtitleTextModification): # name="HI_brackets_special"), # all caps line (at least 4 consecutive uppercase chars) - NReProcessor(re.compile(ur'(?u)(^(?=.*[A-ZÀ-Ž]{4,})[A-ZÀ-Ž-_\s]+$)'), "", name="HI_all_caps"), + NReProcessor(re.compile(ur'(?u)(^(?=.*[A-ZÀ-Ž&+]{4,})[A-ZÀ-Ž-_\s&+]+$)'), "", name="HI_all_caps"), # dash in front # NReProcessor(re.compile(r'(?u)^\s*-\s*'), "", name="HI_starting_dash"), From b9249ff09a400558909efc74687e433eab829ba7 Mon Sep 17 00:00:00 2001 From: Dimo Tsai Date: Thu, 7 Jun 2018 14:08:02 +0800 Subject: [PATCH 101/710] Fix language order in preferences --- Contents/DefaultPrefs.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index ddc180eae..3c89a53de 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -11,8 +11,6 @@ "bg", "ca", "zh", - "zh-hans", - "zh-hant", "cs", "da", "nl", @@ -52,7 +50,9 @@ "tr", "uk", "vi", - "hr" + "hr", + "zh-hans", + "zh-hant" ], "default": "en" }, @@ -69,8 +69,6 @@ "bg", "ca", "zh", - "zh-hans", - "zh-hant", "cs", "da", "nl", @@ -110,7 +108,9 @@ "tr", "uk", "vi", - "hr" + "hr", + "zh-hans", + "zh-hant" ], "default": "None" }, @@ -127,8 +127,6 @@ "bg", "ca", "zh", - "zh-hans", - "zh-hant", "cs", "da", "nl", @@ -168,7 +166,9 @@ "tr", "uk", "vi", - "hr" + "hr", + "zh-hans", + "zh-hant" ], "default": "None" }, From edc3ce1ba4be4c1908b17dc53c157f0476d92ad9 Mon Sep 17 00:00:00 2001 From: morpheus133 Date: Thu, 7 Jun 2018 11:36:56 +0200 Subject: [PATCH 102/710] Correct return value --- .../Shared/subliminal_patch/providers/supersubtitles.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py index f56099822..53d9de1e1 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py @@ -374,6 +374,7 @@ def list_subtitles(self, video, languages): return subs time.sleep(self.multi_result_throttle) + return [] def download_subtitle(self, subtitle): From 4e20d282f74ad20d6cd8a9be46768eb185c4796e Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 7 Jun 2018 15:57:03 +0200 Subject: [PATCH 103/710] #355 fix logging --- Contents/Code/support/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 68f634c83..5fb750eea 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -312,7 +312,7 @@ def notify_executable(exe_info, videos, subtitles, storage): output, errors = proc.communicate() if proc.returncode == 1: - Log.Info(u"Calling %s failed: %s, args: %r, output: %r, error: %r", exe, prepared_arguments, + Log.Info(u"Calling %s with args %s failed: output: %r, error: %r", exe, prepared_arguments, output, errors) return From 8d2d2341c828eb6a597d14b1ae788fb0d6446cba Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 7 Jun 2018 16:10:16 +0200 Subject: [PATCH 104/710] #355 don't use explicit env for mswindows; set working directory to executable directory --- Contents/Code/support/helpers.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 5fb750eea..cd91bf6fc 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -292,7 +292,6 @@ def notify_executable(exe_info, videos, subtitles, storage): prepared_arguments = [arg % prepared_data for arg in arguments] Log.Debug(u"Calling %s with arguments: %s" % (exe, prepared_arguments)) - env = dict(os.environ) if not mswindows: env_path = {"PATH": os.pathsep.join( [ @@ -303,12 +302,13 @@ def notify_executable(exe_info, videos, subtitles, storage): ) } env = dict(os.environ, **env_path) - - env.pop("LD_LIBRARY_PATH", None) + env.pop("LD_LIBRARY_PATH", None) + else: + env = None try: proc = subprocess.Popen(quote_args([exe] + prepared_arguments), stdout=subprocess.PIPE, - stderr=subprocess.PIPE, shell=True, env=env) + stderr=subprocess.PIPE, shell=True, env=env, cwd=os.path.dirname(exe)) output, errors = proc.communicate() if proc.returncode == 1: From 76481186e916490dbd189b36195c5c0646aa0069 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 10 Jun 2018 22:45:18 +0200 Subject: [PATCH 105/710] core: notify executable: unset PYTHONPATH in env if given and contains Plex --- Contents/Code/support/helpers.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index cd91bf6fc..9354ec1d6 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -304,7 +304,9 @@ def notify_executable(exe_info, videos, subtitles, storage): env = dict(os.environ, **env_path) env.pop("LD_LIBRARY_PATH", None) else: - env = None + env = dict(os.environ) + if "PYTHONPATH" in env and "Plex" in env["PYTHONPATH"]: + del env["PYTHONPATH"] try: proc = subprocess.Popen(quote_args([exe] + prepared_arguments), stdout=subprocess.PIPE, From 5690ada2a7e7b9092f4ca5d5f3baf97c188b84e7 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 12 Jun 2018 04:22:05 +0200 Subject: [PATCH 106/710] core: notify executable: log error instead of info; properly clean up PYTHONPATH environment variable --- Contents/Code/support/helpers.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 9354ec1d6..8f502c627 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -303,9 +303,22 @@ def notify_executable(exe_info, videos, subtitles, storage): } env = dict(os.environ, **env_path) env.pop("LD_LIBRARY_PATH", None) + pp_sep = ":" else: env = dict(os.environ) - if "PYTHONPATH" in env and "Plex" in env["PYTHONPATH"]: + pp_sep = ";" + + # clean out any Plex-PYTHONPATH additions that may bleed through the spawned process + if "PYTHONPATH" in env and "plex" in env["PYTHONPATH"].lower(): + pp = [] + for path in env["PYTHONPATH"].split(pp_sep): + path_stripped = path.strip() + if path_stripped and "plex" not in path_stripped.lower(): + pp.append(path_stripped) + + if pp: + env["PYTHONPATH"] = pp_sep.join(pp) + else: del env["PYTHONPATH"] try: @@ -314,7 +327,7 @@ def notify_executable(exe_info, videos, subtitles, storage): output, errors = proc.communicate() if proc.returncode == 1: - Log.Info(u"Calling %s with args %s failed: output: %r, error: %r", exe, prepared_arguments, + Log.Error(u"Calling %s with args %s failed: output:\n%s, error:\n%s", exe, prepared_arguments, output, errors) return From 3ce25007b5a55f52891930dabb2691d18f3d244a Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 14 Jun 2018 15:45:04 +0200 Subject: [PATCH 107/710] core: notify executable: drop pythonpath from env altogether if it was altered by plex --- Contents/Code/support/helpers.py | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 8f502c627..4ec2a6dbf 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -303,23 +303,12 @@ def notify_executable(exe_info, videos, subtitles, storage): } env = dict(os.environ, **env_path) env.pop("LD_LIBRARY_PATH", None) - pp_sep = ":" else: env = dict(os.environ) - pp_sep = ";" - # clean out any Plex-PYTHONPATH additions that may bleed through the spawned process + # clean out any Plex-PYTHONPATH that may bleed through the spawned process if "PYTHONPATH" in env and "plex" in env["PYTHONPATH"].lower(): - pp = [] - for path in env["PYTHONPATH"].split(pp_sep): - path_stripped = path.strip() - if path_stripped and "plex" not in path_stripped.lower(): - pp.append(path_stripped) - - if pp: - env["PYTHONPATH"] = pp_sep.join(pp) - else: - del env["PYTHONPATH"] + del env["PYTHONPATH"] try: proc = subprocess.Popen(quote_args([exe] + prepared_arguments), stdout=subprocess.PIPE, From adb9926928732bd164daaea8523666aa0419a339 Mon Sep 17 00:00:00 2001 From: pannal Date: Fri, 15 Jun 2018 02:23:57 +0200 Subject: [PATCH 108/710] Update da.json (POEditor.com) --- Contents/Strings/da.json | 393 ++++++++++++++++++++------------------- 1 file changed, 197 insertions(+), 196 deletions(-) diff --git a/Contents/Strings/da.json b/Contents/Strings/da.json index 21e8ff731..e77f34407 100644 --- a/Contents/Strings/da.json +++ b/Contents/Strings/da.json @@ -46,53 +46,53 @@ "tr": "Tyrkisk", "uk": "Ukrainsk", "vi": "Vietnamesisk", - "Internal stuff, pay attention!": "Intern ting, være opmærksom!", + "Internal stuff, pay attention!": "Interne ting, vær opmærksom!", "Advanced": "Avanceret", "advanced": "avanceret", "Enter PIN": "Indtast Pin", "The owner has restricted the access to this menu. Please enter the correct pin": "Ejeren har begrænset adgangen til denne menu. Venligst indtast den rigtige PIN kode", "Restart the plugin": "Genstart Plugin", - "Get my logs (copy the appearing link and open it in your browser, please)": "", - "Copy the appearing link and open it in your browser, please": "", + "Get my logs (copy the appearing link and open it in your browser, please)": "Hent mine logs (kopier det viste link og åben det i din browser)", + "Copy the appearing link and open it in your browser, please": "Kopier det viste link og åben det i din browser", "Trigger find better subtitles": "Trigger find bedre undertekster", - "Skip next find better subtitles (sets last run to now)": "", - "Trigger subtitle storage maintenance": "", - "Trigger subtitle storage migration (expensive)": "", - "Trigger cache maintenance (refiners, providers and packs/archives)": "", - "Apply configured default subtitle mods to all (active) stored subtitles": "", - "Re-Apply mods of all stored subtitles": "", - "Log the plugin's scheduled tasks state storage": "", - "Log the plugin's internal ignorelist storage": "", - "Log the plugin's complete state storage": "", - "Reset the plugin's scheduled tasks state storage": "", - "Reset the plugin's internal ignorelist storage": "", - "Invalidate Sub-Zero metadata caches (subliminal)": "", - "Reset provider throttle states": "", + "Skip next find better subtitles (sets last run to now)": "Spring næste Find bedre undertekster over (sæt sidste kørsel til nu)", + "Trigger subtitle storage maintenance": "Start undertekst lager vedligehold", + "Trigger subtitle storage migration (expensive)": "Start migration af undertekst lagre (dyrt?)", + "Trigger cache maintenance (refiners, providers and packs/archives)": "Start cache vedligehold (for refiners, udbydere og pakker/arkiver)", + "Apply configured default subtitle mods to all (active) stored subtitles": "Brug de standard konfigurede undertekst-mods til alle (aktive) gemte undertekster", + "Re-Apply mods of all stored subtitles": "Genindsæt alle mods for alle gemte undertekster", + "Log the plugin's scheduled tasks state storage": "Log plugins planlagte aktivitets lagerstatus", + "Log the plugin's internal ignorelist storage": "Log plugins interne ignoreliste lager", + "Log the plugin's complete state storage": "Log plugins komplette lager status", + "Reset the plugin's scheduled tasks state storage": "Nulstil plugins planlagte aktivitets lagerstatus", + "Reset the plugin's internal ignorelist storage": "Nulstil plugins internet ignoreliste lager", + "Invalidate Sub-Zero metadata caches (subliminal)": "Afkræft Sub-Zero metadata cache (subliminale)", + "Reset provider throttle states": "Nulstil udbyders throttle status", "Restarting the plugin": "Genstarter plugin", "Restart triggered, please wait about 5 seconds": "Genstart aktiveret, vent venligst ca. 5 sekunder", "Reset subtitle storage": "Nulstil undertekst lager", "Are you sure?": "Er du sikker?", "Are you really sure?": "Er du helt sikker?", - "Success": "Success", - "FindBetterSubtitles triggered": "", - "FindBetterSubtitles skipped": "", - "SubtitleStorageMaintenance triggered": "", - "MigrateSubtitleStorage triggered": "", - "TriggerCacheMaintenance triggered": "", + "Success": "Succes", + "FindBetterSubtitles triggered": "FindBedreUndertekster startet", + "FindBetterSubtitles skipped": "FindBedreUndertekster sprunget over", + "SubtitleStorageMaintenance triggered": "Undertekst lager vedligehold startet", + "MigrateSubtitleStorage triggered": "Migration af undertekst lager startet", + "TriggerCacheMaintenance triggered": "Udløseren for Cache vedligehold startet", "This may take some time ...": "Dette kan tage et stykke tid ...", "Download Logs": "Download logs", "Sorry, feature unavailable": "Beklager, men ikke tilgængelig", "Universal Plex token not available": "Universal Plex token er ikke tilgængelig", "Copy this link and open this in your browser, please": "Kopier venligst dette link, og åben i en browser", - "Cache invalidated": "Cache invalideret", + "Cache invalidated": "Cache ugyldig", "Enter PIN number ": "Indtast PIN nummer ", "PIN correct": "PIN korrekt", "Reset": "Nulstil", "Menu locked": "Menu låst", - "Provider throttles reset": "", - "Information Storage (%s) reset": "", - "Information Storage (%s) logged": "", - "Plex didn't return any information about the item, please refresh it and come back later": "", + "Provider throttles reset": "Udbyders throttle nulstilles", + "Information Storage (%s) reset": "Informationslager (%s) nulstilles", + "Information Storage (%s) logged": "Informationslager (%s) logget", + "Plex didn't return any information about the item, please refresh it and come back later": "Plex retunerede ingen information vedr. mediet. Venligst opdater det i Plex, og forsøg igen", "Item not found: %s!": "Media ikke fundet: %s!", "< Back to %s": "< Tilbage til %s", "Back to %s > %s": "Tilbage til %s > %s", @@ -104,72 +104,72 @@ "Remove subtitle from blacklist": "Fjern undertekst fra karantæne", "No subtitles found": "Ingen undertekster fundet", " (unknown)": " (Ukendt)", - " (forced)": " (Trunget)", - "Extracting of embedded subtitle %s of part %s:%s triggered": "", + " (forced)": " (Tvunget)", + "Extracting of embedded subtitle %s of part %s:%s triggered": "Udpakker indlejrede undertekster %s som del af %s:%s startet", "Insufficient permissions": "Utilstrækkelig rettigheder", "I'm not enabled!": "Jeg er ikke aktiveret!", - "Please enable me for some of your libraries in your server settings; currently I do nothing": "", + "Please enable me for some of your libraries in your server settings; currently I do nothing": "Venligst aktiver mig til nogle af dine biblioteker i dine server indstillinger; lige nu gør jeg ingenting", "Working ... refresh here": "Arbejder ... Opdater her", "Current state: %s; Last state: %s": "Nuværende status: %s; Sidste status: %s", - "On-deck items": "", - "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "", + "On-deck items": "Skrivebords medier", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "Viser de %s sidste afspillede titler og giver dig mulighed for individuelt (gennem tvinge) at opdatere deres metadata/undertekster. ", "Recently-added items": "Nylig tilføjet media", "Recently played items": "Nylig afspillet media", - "Shows the recently added items per section.": "", - "Show recently added items with missing subtitles": "", - "Browse all items": "", - "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "", - "Last run: %s; Next scheduled run: %s; Last runtime: %s": "", - "Search for missing subtitles (in recently-added items, max-age: %s)": "", - "Automatically run periodically by the scheduler, if configured. %s": "", - "Show the current ignore list (mainly used for the automatic tasks)": "", + "Shows the recently added items per section.": "Vis seneste tilføjede media pr. sektion", + "Show recently added items with missing subtitles": "Vis seneste tilføjede hvor undertekster mangler", + "Browse all items": "Gennemse alle media", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Gå igennem hele dit bibliotek og håndter din ignorer-liste. Du kan også (gennemtvinge) en opdatering af metadata/undertekster og de enkelte elementer.", + "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Sidste gennemgang: %s; Næste planlagte gennemgang: %s; Sidste gennemløbs tid: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)": "Søg efter manglende undertekster (blandt de sidste tilføjede titler, maksimal alder: &s)", + "Automatically run periodically by the scheduler, if configured. %s": "Automatisk periodisk gennemløb af jobplanlæggeren, såfremt konfigureret. %s.", + "Show the current ignore list (mainly used for the automatic tasks)": "Hvis den nuværende ignorer liste (hovedsageligt brugt for de automatiske opgaver)", "History": "Historie", - "Show the last %i downloaded subtitles": "", + "Show the last %i downloaded subtitles": "Vis de sidste &s hentede undertekster", "Refresh": "Opdater", - "Re-lock menu(s)": "", - "Enabled the PIN again for menu(s)": "", - "Throttled providers: %s": "", - "Advanced functions": "", + "Re-lock menu(s)": "Gen aflås meny(er)", + "Enabled the PIN again for menu(s)": "Aktiver PIN igen for meny(er)", + "Throttled providers: %s": "Throttled udbydere: %s", + "Advanced functions": "Avancerede funktioner", "Use at your own risk": "Brug for egen risiko", - "Items On Deck": "", - "Recently Played": "", - "Items with missing subtitles": "Medias der mangler undertekster", - "Find recent items with missing subtitles": "", + "Items On Deck": "Elementer på skrivebord", + "Recently Played": "Nyeligt afspillede", + "Items with missing subtitles": "Titler som mangler undertekster", + "Find recent items with missing subtitles": "Find seneste medias hvor undertekster mangler", "Updating, refresh here ...": "Opdaterer, klik her for ny status ...", "Missing: %s": "Mangler: %s", - "Didn't change the ignore list": "", - "Sections": "Sektion", + "Didn't change the ignore list": "Ændre ikke ignorer-listen", + "Sections": "Sektioner", "All": "Alle", - "show": "Show", + "show": "vis", "movie": "film", "<< Back to home": "<< Tilbage til hoved menu", "Auto-Find subtitles: %s": "Auto-Find undertekster: %s", - "Extracting of embedded subtitles for %s triggered": "", + "Extracting of embedded subtitles for %s triggered": "Udpakning af indlejrede undertekster for %s fundne", "< Back to subtitle options for: %s": "< Tilbage til undertekst muligheder for: %s", - "Remove last applied mod (%s)": "", + "Remove last applied mod (%s)": "Fjern sidste aktive", "none": "ingen", - "Manage applied mods": "", - "Reapply applied mods": "", - "Restore original version": "", - "< Back to subtitle modification menu": "", + "Manage applied mods": "Håndter de gældende mods", + "Reapply applied mods": "Genaktiver de pågældende mods", + "Restore original version": "Gendan orginal version", + "< Back to subtitle modification menu": "< Tilbage til undertekst modifikations meny", "subs constantly getting faster": "Undertekster bliver konstant hurtigere", "subs constantly getting slower": "Undertekster bliver konstant langsommere", "< Back to subtitle modifications": "< Tilbage til undertekst ændringer", - "< Back to unit selection": "", + "< Back to unit selection": "< Tilbage til enheds valg ", "Subtitle Language (1)": "Undertekst sprog (1)", "Subtitle Language (2)": "Undertekst sprog (2)", "Subtitle Language (3)": "Undertekst sprog (3)", - "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "", - "Only download foreign/forced subtitles": "", - "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "", - "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "", - "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "", - "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "Flere Undertekst sprog (brug ISO-639-1 koder; kommasepareret)", + "Only download foreign/forced subtitles": "Download kun fremmede/gennemtvungne undertekster", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Vis sprog med lande attributer som i ISO639-1 (f.eks. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Behandel sprog med lande attributer som i ISO 639-1 (f.eks hent ikke pt-BR hvis pt undertekster findes)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Indskrænk til et sprog (tilføj ikke \".lang\" til underteksters filnavn; brug kun \"Undertekst sprog (1)\")", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Indlejrede undertekster: Behandel \"Udefineret\" som sprog 1", "I rename my files using": "Jeg omdøber mine filer med", - "Retrieve original filename from .file_info/file_info index files (see wiki)": "", - "Sonarr URL (add URL base if configured)": "", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "Genskab det originale filnavn fra .file_info/file_info indeks filer (se wiki)", + "Sonarr URL (add URL base if configured)": "Sonarr URL (tilføj URL databse hvis konfigureret)", "Sonarr API key": "Sonarr API key", - "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "Radarr URL (tilføj URL database hvos konfigireret, min. version: 0.2.0.897)", "Radarr API key": "Radarr API key", "Provider: Enable OpenSubtitles": "Provider: Aktiver OpenSubtitles", "Opensubtitles Username": "Opensubtitles Brugernavn", @@ -180,75 +180,75 @@ "Provider: Enable Addic7ed": "Provider: Aktiver Addic7ed", "Addic7ed Username": "Addic7ed Brugernavn", "Addic7ed Password": "Addic7ed Kodeord", - "Addic7ed: boost score (if requirements met)": "", - "Addic7ed: Use random user agents": "", - "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "", + "Addic7ed: boost score (if requirements met)": "Addic7ed: boost score (hvis betingelser er opfyldt)", + "Addic7ed: Use random user agents": "Addic7ed: Brug tilfældig bruger agent", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "Provider: Aktiver Legendas TV (for det meste pt-BR; UNRAR skal være tilgængelig)", "Legendas TV Username": "Legendas TV Brugernavn", "Legendas TV Password": "Legendas TV Kodeord", - "Provider: Enable TVsubtitles.net": "", + "Provider: Enable TVsubtitles.net": "Provider: Aktiver TVsubtitles.net", "Provider: Enable NapiProjekt.pl (Polish)": "Provider: Aktiver NapiProjekt.pl (Polsk)", "Provider: Enable SubScene (TV shows)": "Provider: Aktiver SubScene (TV shows)", - "Provider: Enable hosszupuskasub.com (Hungarian)": "", + "Provider: Enable hosszupuskasub.com (Hungarian)": "Provider: Aktiver hosszupuskasub.com (Ungaren)", "Provider: Enable aRGENTeaM (Spanish)": "Provider: Aktiver aRGENTeaM (Spansk)", "Search enabled providers simultaneously (multithreading)": "Søg flere providers samtidigt (multithreading)", - "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "", - "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "", - "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "", - "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "", - "How strict should these subtitles existing on the filesystem be detected?": "", - "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "", - "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "", - "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Udpak automatisk og brug indlejrede undertekster når nyt indlægges (med konfigurerede default mods)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "Efter automatisk udpakning af indlejrede undertekster skal der straks søges efter tilgængelige undertekster?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "Søg ikke efter undertekster for et sprog når der er indlejrede undertekster i et medies fil (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "Søg ikke efter undertekster for et sprog hvis det allerede eksisterer i filsystemet (metadata/filsystem)?", + "How strict should these subtitles existing on the filesystem be detected?": "Hvor eksakt skal undertekster på fil systemet blive fundet?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "Inkluder ikke-tekst undertekst formater (alt andet end .srt/.ssa/.ass/.vtt; indlejret eller eksternt) i det ovenstående?", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; læs http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "Minimum score for film(min: 60, def/sane: 69, min-ideal: 82; læs http://v.ht/szscores)", "Download hearing impaired subtitles.": "Hent undertekster for hørehæmmet", "Remove Hearing Impaired tags from downloaded subtitles": "Fjern hørehæmmet dele fra undertekst", "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Fjern formatering fra hentede undertekster (fremhævet, kursiv, understreget, farver ...)", "Fix common issues in subtitles": "Fix std. fejl med undertekster", - "Fix common OCR errors in downloaded subtitles": "", - "Reverse punctuation in RTL languages (heb)": "", - "Change colors of subtitles to": "Skift farve på undertekster til", - "Store subtitles next to media files (instead of metadata)": "Gem undertekster sammen med medie (Istedet for internt i Plex)", - "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "", - "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "", - "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "", - "Fall back to metadata storage if filesystem storage failed": "", - "Set subtitle file permissions to (integer, e.g.: 0775)": "", - "Automatically delete leftover/unused (externally saved) subtitles": "", - "On media playback: search for missing subtitles (refresh item)": "", - "Scheduler: Periodically search for recent items with missing subtitles": "", - "Scheduler: Item age to be considered recent": "", - "Scheduler: Recent items to consider per library": "", - "Scheduler: Periodically search for better subtitles": "", - "Scheduler: Days to search for better subtitles (max: 30 days)": "", - "Scheduler: Don't search for better subtitles if the item's air date is older than": "", - "Scheduler: Overwrite manually selected subtitles when better found": "", - "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "", - "History: amount of items to store historical data for": "", - "How many download tries per subtitle (on timeout or error)": "", - "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "", - "Ignore anything in the following paths (comma-separated)": "", + "Fix common OCR errors in downloaded subtitles": "Fix almindelige OCR fejl i downloadede undertekster", + "Reverse punctuation in RTL languages (heb)": "Genindkald tegnsætning i RTL sprog (hebræisk)", + "Change colors of subtitles to": "Slå farve på undertekster til", + "Store subtitles next to media files (instead of metadata)": "Gem undertekster sammen med medie filer (Istedet for internt i Plex)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Undertekster formater der gemmes (non-SRT virker kun såfremt forrige option er aktiveret)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "Undertekst bibliotek (\"Nuværede bibliotek\" er det bibliotek som det aktive medies fil lever i)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "Brugertilpas Undertekst bibliotek (overskriver \"Undertekst bibliotek\"; udregner den rette sti)", + "Fall back to metadata storage if filesystem storage failed": "Fald tilbage til metadata lager såfremt filsystem lager fejlede", + "Set subtitle file permissions to (integer, e.g.: 0775)": "Sæt undertekst fils egenskaber til (integer, f.eks: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles": "Slet automatisk overskuds/ubrugte (eksternt gemte) undertekster", + "On media playback: search for missing subtitles (refresh item)": "Ved mediets playback: søg efter manglende undertekster (genindlæs dem)", + "Scheduler: Periodically search for recent items with missing subtitles": "Jobplanlægger: Periodisk søgning efter titler med manglende undertekster", + "Scheduler: Item age to be considered recent": "Jobplanlægger: En titles alder anses som fornylig", + "Scheduler: Recent items to consider per library": "Jobplanlægger: Fornylige titler at blive undersøgt per bibliotek", + "Scheduler: Periodically search for better subtitles": "Jobplanlægger:Periodisk søgning efter bedre undertekster", + "Scheduler: Days to search for better subtitles (max: 30 days)": "Jobplanlægger: Dage til søgning efter bedre undertekster (max: 30 dage)", + "Scheduler: Don't search for better subtitles if the item's air date is older than": "Jobplanlægger: Søg ikke efter bedre undertekster såfremt titlens dato er ældre end", + "Scheduler: Overwrite manually selected subtitles when better found": "Jobplanlægger: Overskriv manuelt valgte undertekster når bedre er fundet", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Jobplanlægger: Overskriv undertekster når ikke-default undertekster ændringer såfremt bedre er fundet", + "History: amount of items to store historical data for": "Historie: antallet af titler som der skal gemmes historiske data for", + "How many download tries per subtitle (on timeout or error)": "Hvormange downloads forsøg per titel (på timeout eller fejl)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "Ignorer biblioteker (med \"subzero.ignore/.subzero.ignore/.nosz\" filer i dem)", + "Ignore anything in the following paths (comma-separated)": "Ignorer alting i det følgende bibliotek (kommesepareret)", "Sub-Zero mode": "Sub-Zero mode", "Access PIN (any amount of numbers, 0-9)": "PIN (tilfældig antal af nummere , 0-9)", "Access PIN valid for minutes": "Pin er gyldig i minutter", - "Use PIN to restrict access to (needs plugin or PMS restart)": "", - "Call this executable upon successful subtitle download (see Wiki for details)": "", - "Check for correct folder permissions of every library on plugin start": "", - "Use new style caching (for subliminal)": "", - "Low impact mode (for remote filesystems)": "", + "Use PIN to restrict access to (needs plugin or PMS restart)": "Brug PIN til at hindre adgang til (kræver plugin eller PMS genstart)", + "Call this executable upon successful subtitle download (see Wiki for details)": "Kald denne eksekverebare såfremt undertekst download (se i WIKI for detaljer)", + "Check for correct folder permissions of every library on plugin start": "Undersøg for de korrekte biblioteks tilladelser på hvert bibliotek når plugin stater op", + "Use new style caching (for subliminal)": "Brug ny stil cacing (til sublimiral)", + "Low impact mode (for remote filesystems)": "Lille indvirkrning tilstand (for remote filsystemer)", "Timeout for API requests sent to the PMS": "Timeout for kommunikation med Plex server", - "HTTP proxy to use for providers (supports credentials)": "", - "How verbose should the logging be?": "", - "How many log backups to keep?": "", - "Log subtitle modification (debug)": "", + "HTTP proxy to use for providers (supports credentials)": "HTTP proxy til brug for udbydere (understøtter legitimation)", + "How verbose should the logging be?": "Hvor ordrig/omfattende skal logning være?", + "How many log backups to keep?": "Hvormange log backups skal gemmes?", + "Log subtitle modification (debug)": "Log til modifikation af undertekster (debug)", "Log to console (for development/debugging)": "Log til console (for udvikling/fejlfinding)", - "Collect anonymous usage statistics": "", - "Sonarr/Radarr (fill api info below)": "", + "Collect anonymous usage statistics": "Indsaml anonymt brugs statistik", + "Sonarr/Radarr (fill api info below)": "Sonarr/Radarr (indsæt api information nedenfor)", "Filebot": "Filebot", "Sonarr/Radarr/Filebot": "Sonarr/Radarr/Filebot", - "Symlink to original file": "", + "Symlink to original file": "Symlink til original fil", "I keep the original filenames": "Jeg beholder de orginale fil navne", "none of the above": "Ingen af ovenstående", - "exact: media filename match": "", - "loose: filename contains media filename": "", + "exact: media filename match": "eksakt: mediets filnavn stemmer", + "loose: filename contains media filename": "løs: filnavn indeholder mediets filnavn", "any": "alle", "prefer": "foretræk", "don't prefer": "foretræk ikke", @@ -273,10 +273,10 @@ "dark-grey": "mørkegrå", "current folder": "nuværende folder", "never": "aldrig", - "current media item": "", + "current media item": "nuværende titel", "next episode (series)": "næste episode (serier)", - "hybrid: current item or next episode": "", - "hybrid-plus: current item and next episode": "", + "hybrid: current item or next episode": "hybrid: nuværende titel eller næste afsnit", + "hybrid-plus: current item and next episode": "hybrid-plus: nuværende titel eller næste afsnit", "every 6 hours": "hver 6 time", "every 12 hours": "hver 12 time", "every 24 hours": "hver 24 time", @@ -310,90 +310,91 @@ "WARNING": "ADVARSEL", "INFO": "INFO", "DEBUG": "DEBUG", - "Force-find subtitles: %(item_title)s": "", - "File %(file_part_index)s: ": "", - "%(part_summary)sNo current subtitle in storage": "", - "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "", - "%(part_summary)sManage %(language)s subtitle": "", - "%(part_summary)sList %(language)s subtitles": "", - "%(part_summary)sEmbedded subtitles (%(languages)s)": "", - "Select active %(language)s subtitle": "", - "%(count)d subtitles in storage": "", + "Force-find subtitles: %(item_title)s": "Gennentving-find undertekster: %s (titler)", + "File %(file_part_index)s: ": "Fil %(file_part_index)s:␣", + "%(part_summary)sNo current subtitle in storage": "%(part_summary)s Ingen undertekster for nuværende gemt", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sNuværende undertekst: %(provider_name)s (tilføjet: %(date_added)s, %(mode)s), Sprog: %(language)s, Score: %(score)i, Lager: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)sAdministrer %(language)s undertekster", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)sVis %(language)s undertekster", + "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sIndlejrede undertekster (%(language)s)", + "Select active %(language)s subtitle": "Vælg aktive %(language)s undertekster", + "%(count)d subtitles in storage": "%(count)d undertekster gemt", "List available %(language)s subtitles": "Vis tilgængelige %(language)s undertekster", - "Modify current %(language)s subtitle": "Modificer nuværrende %(language)s undertekst", - "Currently applied mods: %(mod_list)s": "", - "Blacklist current %(language)s subtitle and search for a new one": "", - "Manage blacklist (%(amount)s contained)": "", - "%(current_state)s%(subtitle_name)s, Score: %(score)s": "", + "Modify current %(language)s subtitle": "Modificer nuværende %(language)s undertekst", + "Currently applied mods: %(mod_list)s": "Nuværende gældende mods: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one": "Blacklist nuværende %(language)s undertekst og søg efter en ny", + "Manage blacklist (%(amount)s contained)": "Administrer blacklist (%(amount)s indeholdt)", + "%(current_state)s%(subtitle_name)s, Score: %(score)s": "%(current_state)s%(subtitle_name)s, Score: %(score)s", "Current: ": "Nuværende: ", "Stored: ": "Gemt: ", - "by %(release_group)s": "", - "Current: %(provider_name)s (%(score)s) ": "", - "Search for %(language)s subs (%(video_data)s)": "", - "%(current_info)sFilename: %(filename)s": "", - "Searching for %(language)s subs (%(video_data)s), refresh here ...": "", - " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": "", - " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": "", - "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "", - "Release: %(release_info)s, Matches: %(matches)s": "", - "Downloading subtitle for %(title_or_id)s": "", - "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "", - "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "", - "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "", - "Insufficient permissions on library %(title)s, folder: %(path)s": "", - "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "", - "Display ignore list (%(ignored_count)d)": "", - "%(throttled_provider)s until %(until_date)s (%(reason)s)": "", - "Extracting subtitle %(stream_index)s of %(filename)s": "", - "Extract missing %(language)s embedded subtitles": "Udtrækker manglende %(language)s indlejrede undertekster", - "Extract and activate %(language)s embedded subtitles": "Udtræk og aktiver %(language)s indlejret undertekster", + "by %(release_group)s": "af %(release_group)s", + "Current: %(provider_name)s (%(score)s) ": "Nuværende: %(provider_name)s (%(score)s)␣", + "Search for %(language)s subs (%(video_data)s)": "Søg efter %(language)s undertekster (%(video_data)s)", + "%(current_info)sFilename: %(filename)s": "%(current_info)sFilenavn: %(filename)s", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "Søger efter %(language)s undertekster (%(video_data)s), opdater her...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": " ␣(forkert FPS, undertekst: %(subtitle_fps)s, medie: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": "␣(forkert FPS, undertekst: %(subtitle_fps)s, medie: ukendt, lav betydnings modus)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s": "Udgivelse: %(release_info)s, Stemmer: %(matches)s", + "Downloading subtitle for %(title_or_id)s": "Henter undertekster for %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Udpak stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s med gældende mods", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "Udpak stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Sprog: %(language)s, Score: %(score)i, Lager: %(storage_type)s", + "Insufficient permissions on library %(title)s, folder: %(path)s": "Utilstrækkelig tilladelser for bibliotek %(title)s, Sti: %(path)s", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Kører: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Display ignore list (%(ignored_count)d)": "Vis ignorer listen (%(ignored_count)d)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s indtil %(until_date)s (%(reason)s)", + "Extracting subtitle %(stream_index)s of %(filename)s": "Udpakker undertekst %(stream_index)s af %(filename)s", + "Extract missing %(language)s embedded subtitles": "Udpakker manglende %(language)s indlejrede undertekster", + "Extract and activate %(language)s embedded subtitles": "Udpak og aktiver %(language)s indlejrede undertekster", "None": "Ingen", "Idle": "Venter", - "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", "Adjust by %(time_and_unit)s": "Justeret med %(time_and_unit)s", - "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "tilføjet: %(date_added)s, %(mode)s, Sprog: %(language)s, Score: %(score)i, Lager: %(storage_type)s", "Remove: %(mod_name)s": "Fjern: %(mod_name)s", "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Undertekst download fejlede (%(item_id)s)", "agent + interface": "agent + interface", "only interface": "kun interface", "interface": "interface", - "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "", - "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "", - "Add %(kind)s %(title)s to the ignore list": "", - "Remove %(kind)s %(title)s from the ignore list": "", - "%(title)s added to the ignore list": "", - "%(title)s removed from the ignore list": "", - "Triggering refresh for %(title)s": "", - "Triggering forced refresh for %(title)s": "", - "Refresh of item %(item_id)s triggered": "", - "Forced refresh of item %(item_id)s triggered": "", - "Ignore %(kind)s \"%(title)s\"": "", - "Un-ignore %(kind)s \"%(title)s\"": "", - "Refreshing %(title)s": "", - "Force-refreshing %(title)s": "", - "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "", - "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "", - "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "", - "the movie": "", - "the series": "", - "the episode": "", - "the season": "", - "Change the color of the subtitle": "", - "Adds the requested color to every line of the subtitle. Support depends on player.": "", - "Basic common fixes": "", - "Fix common and whitespace/punctuation issues in subtitles": "", - "Remove all style tags": "", - "Removes all possible style tags from the subtitle, such as font, bold, color etc.": "", - "Reverse punctuation in RTL languages": "", - "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew": "", - "Change the FPS of the subtitle": "", - "Re-syncs the subtitle to the framerate of the current media file.": "", - "Remove Hearing Impaired tags": "", - "Removes tags, text and characters from subtitles that are meant for hearing impaired people": "", - "Fix common OCR issues": "", - "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR": "", - "Change the timing of the subtitle": "", - "Adds or substracts a certain amount of time from the whole subtitle to match your media": "", - "Available": "", - "Current": "" + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "Vis nuværende desktop titler og du kan individuelt (gennemtvinge) en opdatering af metadata/undertekster.", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "Vis titler med manglende undertekster. Klik på \"Find seneste titler med manglende undertekster\" for at opdatere listen", + "Add %(kind)s %(title)s to the ignore list": "Tilføj %(kind)s %(title)s til ignorer listen", + "Remove %(kind)s %(title)s from the ignore list": "Fjern %(kind)s %(title)s fra ignorer listen", + "%(title)s added to the ignore list": "%(title)s tilføjet til ignorer listen", + "%(title)s removed from the ignore list": "%(title)s fjernet fra ignorer listen", + "Triggering refresh for %(title)s": "Aktiver genindlæsning for %(title)s", + "Triggering forced refresh for %(title)s": "Aktiver gennemtvunget opdatering for %(title)s", + "Refresh of item %(item_id)s triggered": "Opdatering af %(item_id)s titler er aktiveret", + "Forced refresh of item %(item_id)s triggered": "Gennemtvunget opdatering af %(item_id)s titler er aktiveret", + "Ignore %(kind)s \"%(title)s\"": "Ignorer %(kind)s \"%(title)s\"", + "Un-ignore %(kind)s \"%(title)s\"": "Ikke-ignorer %(kind)s \"%(title)s\"", + "Refreshing %(title)s": "Genindlæser %(title)s", + "Force-refreshing %(title)s": "Gennentvunget-opdatering %(title)s", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Udpakker de endnu ikke udpakkede indlejrede undertekster fra alle afsnit for nuværende sæson ved brug af de konfigurede default indstillede rettelser \n", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "Udpakker indlejrede undertekster fra alle afsnit for nuværende sæson ved brug af de konfigurede default indstillede rettelser", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Genindlæser %(the_movie_series_season_episode)s, sandsynligvis søges der efter manglende undertekster ellers anvendes nye fra disken", + "the movie": "filmen", + "the series": "serien", + "the episode": "episoden", + "the season": "sæsonen", + "Change the color of the subtitle": "Skift farve på underteksten", + "Adds the requested color to every line of the subtitle. Support depends on player.": "Tilføjer den valgte farve til hver linje i underteksten. Support afhænger af afspiller.", + "Basic common fixes": "Basale fælles rettelser", + "Fix common and whitespace/punctuation issues in subtitles": "Ret fælles og whitespace/tegnsætnings problemer i undertekster", + "Remove all style tags": "Fjern alle style tags", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.": "Fjern alle mulige style tags fra underteksten såsom font, fed, farve osv.", + "Reverse punctuation in RTL languages": "Omvend tegnsætning i RTL sprog", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew": "Nogle afspille håndterer ikke højre-til-venstre tegnsætning korrekt. Fysisk ændring af tegnsætning. Gældende for sprog som: hebræisk", + "Change the FPS of the subtitle": "Ændre FPS for undertekst", + "Re-syncs the subtitle to the framerate of the current media file.": "Gensynkroniser underteksten med frameraten på den nuværende medie fil.", + "Remove Hearing Impaired tags": "Fjern Høresvækkede tags", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people": "Fjern tags, tekst og tegn fra underteksten som er tiltænkt høresvækkede mennesker", + "Fix common OCR issues": "Ret fælles OCR problemer", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR": "Ret problemer når en undertekst bliver oversat fra bitmap eller gennem OCR", + "Change the timing of the subtitle": "Ændre timingen på underteksten", + "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Tilføj eller fjern en vis tid fra underteksten så den matcher din medie", + "Available": "Tilgængelig", + "Current": "Nuværende", + "Custom path to advanced_settings.json": "Bruger defineret sti til advanced_settings.json" } \ No newline at end of file From 0a2a6b558fc0be7ac6dc9445518868a488ae653c Mon Sep 17 00:00:00 2001 From: pannal Date: Fri, 15 Jun 2018 02:24:00 +0200 Subject: [PATCH 109/710] Update de.json (POEditor.com) From afa0c3a1b0d981601376d543e7326d9d7ef1454f Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 15 Jun 2018 04:33:49 +0200 Subject: [PATCH 110/710] i18n: add spanish, hungarian, dutch --- Contents/Strings/es.json | 400 +++++++++++++++++++++++++++++++++++++++ Contents/Strings/hu.json | 400 +++++++++++++++++++++++++++++++++++++++ Contents/Strings/nl.json | 400 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 1200 insertions(+) create mode 100644 Contents/Strings/es.json create mode 100644 Contents/Strings/hu.json create mode 100644 Contents/Strings/nl.json diff --git a/Contents/Strings/es.json b/Contents/Strings/es.json new file mode 100644 index 000000000..c9bf9df5a --- /dev/null +++ b/Contents/Strings/es.json @@ -0,0 +1,400 @@ +{ + "sq":"Albanian", + "ar":"Arabic", + "be":"Belarusian", + "bs":"Bosnian", + "bg":"Bulgarian", + "ca":"Catalan", + "zh":"Chinese", + "hr":"Croatian", + "cs":"Czech", + "da":"Danish", + "nl":"Dutch", + "en":"English", + "et":"Estonian", + "fa":"Persian (Farsi)", + "fi":"Finnish", + "fr":"French", + "de":"German", + "el":"Greek", + "he":"Hebrew", + "hi":"Hindi", + "hu":"Hungarian", + "is":"Icelandic", + "id":"Indonesian", + "it":"Italian", + "ja":"Japanese", + "ko":"Korean", + "lv":"Latvian", + "lt":"Lithuanian", + "mk":"Macedonian", + "ms":"Malay", + "no":"Norwegian", + "pl":"Polish", + "pt":"Portuguese", + "pt-br":"Portuguese (Brasil)", + "ro":"Romanian", + "ru":"Russian", + "sr":"Serbian", + "sr-cyrl":"Serbian (Cyrillic)", + "sr-latn":"Serbian (Latin)", + "sk":"Slovak", + "sl":"Slovenian", + "es":"Spanish", + "sv":"Swedish", + "th":"Thai", + "tr":"Turkish", + "uk":"Ukranian", + "vi":"Vietnamese", + "Internal stuff, pay attention!":"Internal stuff, pay attention!", + "Advanced":"Advanced", + "advanced":"advanced", + "Enter PIN":"Enter PIN", + "The owner has restricted the access to this menu. Please enter the correct pin":"The owner has restricted the access to this menu. Please enter the correct pin", + "Restart the plugin":"Restart the plugin", + "Get my logs (copy the appearing link and open it in your browser, please)":"Get my logs (copy the appearing link and open it in your browser, please)", + "Copy the appearing link and open it in your browser, please":"Copy the appearing link and open it in your browser, please", + "Trigger find better subtitles":"Trigger find better subtitles", + "Skip next find better subtitles (sets last run to now)":"Skip next find better subtitles (sets last run to now)", + "Trigger subtitle storage maintenance":"Trigger subtitle storage maintenance", + "Trigger subtitle storage migration (expensive)":"Trigger subtitle storage migration (expensive)", + "Trigger cache maintenance (refiners, providers and packs/archives)":"Trigger cache maintenance (refiners, providers and packs/archives)", + "Apply configured default subtitle mods to all (active) stored subtitles":"Apply configured default subtitle mods to all (active) stored subtitles", + "Re-Apply mods of all stored subtitles":"Re-Apply mods of all stored subtitles", + "Log the plugin's scheduled tasks state storage":"Log the plugin's scheduled tasks state storage", + "Log the plugin's internal ignorelist storage":"Log the plugin's internal ignorelist storage", + "Log the plugin's complete state storage":"Log the plugin's complete state storage", + "Reset the plugin's scheduled tasks state storage":"Reset the plugin's scheduled tasks state storage", + "Reset the plugin's internal ignorelist storage":"Reset the plugin's internal ignorelist storage", + "Invalidate Sub-Zero metadata caches (subliminal)":"Invalidate Sub-Zero metadata caches (subliminal)", + "Reset provider throttle states":"Reset provider throttle states", + "Restarting the plugin":"Restarting the plugin", + "Restart triggered, please wait about 5 seconds":"Restart triggered, please wait about 5 seconds", + "Reset subtitle storage":"Reset subtitle storage", + "Are you sure?":"Are you sure?", + "Are you really sure?":"Are you really sure?", + "Success":"Success", + "Information Storage (%s) reset":"Information Storage (%s) reset", + "Information Storage (%s) logged":"Information Storage (%s) logged", + "FindBetterSubtitles triggered":"FindBetterSubtitles triggered", + "FindBetterSubtitles skipped":"FindBetterSubtitles skipped", + "SubtitleStorageMaintenance triggered":"SubtitleStorageMaintenance triggered", + "MigrateSubtitleStorage triggered":"MigrateSubtitleStorage triggered", + "TriggerCacheMaintenance triggered":"TriggerCacheMaintenance triggered", + "This may take some time ...":"This may take some time ...", + "Download Logs":"Download Logs", + "Sorry, feature unavailable":"Sorry, feature unavailable", + "Universal Plex token not available":"Universal Plex token not available", + "Copy this link and open this in your browser, please":"Copy this link and open this in your browser, please", + "Cache invalidated":"Cache invalidated", + "Enter PIN number ":"Enter PIN number ", + "PIN correct":"PIN correct", + "Reset":"Reset", + "Menu locked":"Menu locked", + "Provider throttles reset":"Provider throttles reset", + "Plex didn't return any information about the item, please refresh it and come back later":"Plex didn't return any information about the item, please refresh it and come back later", + "Item not found: %s!":"Item not found: %s!", + "< Back to %s":"< Back to %s", + "Back to %s > %s":"Back to %s > %s", + "Refresh: %s":"Refresh: %s", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk":"Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk", + "the movie":"the movie", + "the series":"the series", + "the episode":"the episode", + "the season":"the season", + "Force-find subtitles: %(item_title)s":"Force-find subtitles: %(item_title)s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones":"Issues a forced refresh, ignoring known subtitles and searching for new ones", + "File %(file_part_index)s: ":"File %(file_part_index)s: ", + "%(part_summary)sNo current subtitle in storage":"%(part_summary)sNo current subtitle in storage", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle":"%(part_summary)sManage %(language)s subtitle", + "%(part_summary)sList %(language)s subtitles":"%(part_summary)sList %(language)s subtitles", + "%(part_summary)sEmbedded subtitles (%(languages)s)":"%(part_summary)sEmbedded subtitles (%(languages)s)", + "Extract and activate embedded subtitle streams":"Extract and activate embedded subtitle streams", + "Select active %(language)s subtitle":"Select active %(language)s subtitle", + "%(count)d subtitles in storage":"%(count)d subtitles in storage", + "List available %(language)s subtitles":"List available %(language)s subtitles", + "Modify current %(language)s subtitle":"Modify current %(language)s subtitle", + "Currently applied mods: %(mod_list)s":"Currently applied mods: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one":"Blacklist current %(language)s subtitle and search for a new one", + "Manage blacklist (%(amount)s contained)":"Manage blacklist (%(amount)s contained)", + "Inspect currently blacklisted subtitles":"Inspect currently blacklisted subtitles", + "%(current_state)s%(subtitle_name)s, Score: %(score)s":"%(current_state)s%(subtitle_name)s, Score: %(score)s", + "Current: ":"Current: ", + "Stored: ":"Stored: ", + "Subtitle saved to disk":"Subtitle saved to disk", + "Remove subtitle from blacklist":"Remove subtitle from blacklist", + "by %(release_group)s":"by %(release_group)s", + "Current: %(provider_name)s (%(score)s) ":"Current: %(provider_name)s (%(score)s) ", + "Search for %(language)s subs (%(video_data)s)":"Search for %(language)s subs (%(video_data)s)", + "%(current_info)sFilename: %(filename)s":"%(current_info)sFilename: %(filename)s", + "No subtitles found":"No subtitles found", + "Searching for %(language)s subs (%(video_data)s), refresh here ...":"Searching for %(language)s subs (%(video_data)s), refresh here ...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)":" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)":" (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s":"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s":"Release: %(release_info)s, Matches: %(matches)s", + "Downloading subtitle for %(title_or_id)s":"Downloading subtitle for %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods", + " (unknown)":" (unknown)", + " (forced)":" (forced)", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "Extracting of embedded subtitle %s of part %s:%s triggered":"Extracting of embedded subtitle %s of part %s:%s triggered", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "Insufficient permissions":"Insufficient permissions", + "Insufficient permissions on library %(title)s, folder: %(path)s":"Insufficient permissions on library %(title)s, folder: %(path)s", + "I'm not enabled!":"I'm not enabled!", + "Please enable me for some of your libraries in your server settings; currently I do nothing":"Please enable me for some of your libraries in your server settings; currently I do nothing", + "Working ... refresh here":"Working ... refresh here", + "Current state: %s; Last state: %s":"Current state: %s; Last state: %s", + "On-deck items":"On-deck items", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", + "Recently-added items":"Recently-added items", + "Recently played items":"Recently played items", + "Shows the recently added items per section.":"Shows the recently added items per section.", + "Show recently added items with missing subtitles":"Show recently added items with missing subtitles", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list":"Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list", + "Browse all items":"Browse all items", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.":"Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)":"Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Last run: %s; Next scheduled run: %s; Last runtime: %s":"Last run: %s; Next scheduled run: %s; Last runtime: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)":"Search for missing subtitles (in recently-added items, max-age: %s)", + "Automatically run periodically by the scheduler, if configured. %s":"Automatically run periodically by the scheduler, if configured. %s", + "Display ignore list (%(ignored_count)d)":"Display ignore list (%(ignored_count)d)", + "Show the current ignore list (mainly used for the automatic tasks)":"Show the current ignore list (mainly used for the automatic tasks)", + "History":"History", + "Show the last %i downloaded subtitles":"Show the last %i downloaded subtitles", + "Refresh":"Refresh", + "Re-lock menu(s)":"Re-lock menu(s)", + "Enabled the PIN again for menu(s)":"Enabled the PIN again for menu(s)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)":"%(throttled_provider)s until %(until_date)s (%(reason)s)", + "Throttled providers: %s":"Throttled providers: %s", + "Advanced functions":"Advanced functions", + "Use at your own risk":"Use at your own risk", + "Items On Deck":"Items On Deck", + "Recently Played":"Recently Played", + "Items with missing subtitles":"Items with missing subtitles", + "Find recent items with missing subtitles":"Find recent items with missing subtitles", + "Updating, refresh here ...":"Updating, refresh here ...", + "Missing: %s":"Missing: %s", + "Add %(kind)s %(title)s to the ignore list":"Add %(kind)s %(title)s to the ignore list", + "Remove %(kind)s %(title)s from the ignore list":"Remove %(kind)s %(title)s from the ignore list", + "Didn't change the ignore list":"Didn't change the ignore list", + "%(title)s added to the ignore list":"%(title)s added to the ignore list", + "%(title)s removed from the ignore list":"%(title)s removed from the ignore list", + "Sections":"Sections", + "All":"All", + "Ignore %(kind)s \"%(title)s\"":"Ignore %(kind)s \"%(title)s\"", + "Un-ignore %(kind)s \"%(title)s\"":"Un-ignore %(kind)s \"%(title)s\"", + "show":"show", + "movie":"movie", + "Refreshing %(title)s":"Refreshing %(title)s", + "Force-refreshing %(title)s":"Force-refreshing %(title)s", + "Extracting subtitle %(stream_index)s of %(filename)s":"Extracting subtitle %(stream_index)s of %(filename)s", + "<< Back to home":"<< Back to home", + "Extract missing %(language)s embedded subtitles":"Extract missing %(language)s embedded subtitles", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications", + "Extract and activate %(language)s embedded subtitles":"Extract and activate %(language)s embedded subtitles", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts embedded subtitles of all episodes for the current season with all configured default modifications", + "Auto-Find subtitles: %s":"Auto-Find subtitles: %s", + "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered", + "Triggering refresh for %(title)s":"Triggering refresh for %(title)s", + "Triggering forced refresh for %(title)s":"Triggering forced refresh for %(title)s", + "Refresh of item %(item_id)s triggered":"Refresh of item %(item_id)s triggered", + "Forced refresh of item %(item_id)s triggered":"Forced refresh of item %(item_id)s triggered", + "< Back to subtitle options for: %s":"< Back to subtitle options for: %s", + "Remove last applied mod (%s)":"Remove last applied mod (%s)", + "none":"none", + "None":"None", + "Idle":"Idle", + "Manage applied mods":"Manage applied mods", + "Reapply applied mods":"Reapply applied mods", + "Restore original version":"Restore original version", + "< Back to subtitle modification menu":"< Back to subtitle modification menu", + "subs constantly getting faster":"subs constantly getting faster", + "subs constantly getting slower":"subs constantly getting slower", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)":"%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "< Back to subtitle modifications":"< Back to subtitle modifications", + "Adjust by %(time_and_unit)s":"Adjust by %(time_and_unit)s", + "< Back to unit selection":"< Back to unit selection", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "Remove: %(mod_name)s":"Remove: %(mod_name)s", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Subtitle download failed (%(item_id)s)", + "Subtitle Language (1)":"Subtitle Language (1)", + "Subtitle Language (2)":"Subtitle Language (2)", + "Subtitle Language (3)":"Subtitle Language (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)":"Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)", + "Only download foreign/forced subtitles":"Only download foreign/forced subtitles", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)":"Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)":"Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")":"Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1":"Embedded subtitles: Treat \"Undefined\" (und) as language 1", + "I rename my files using":"I rename my files using", + "Retrieve original filename from .file_info/file_info index files (see wiki)":"Retrieve original filename from .file_info/file_info index files (see wiki)", + "Sonarr URL (add URL base if configured)":"Sonarr URL (add URL base if configured)", + "Sonarr API key":"Sonarr API key", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)":"Radarr URL (add URL base if configured, min. version: 0.2.0.897)", + "Radarr API key":"Radarr API key", + "Provider: Enable OpenSubtitles":"Provider: Enable OpenSubtitles", + "Opensubtitles Username":"Opensubtitles Username", + "Opensubtitles Password":"Opensubtitles Password", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)":"OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET":"Provider: Enable Podnapisi.NET", + "Provider: Enable Titlovi.com":"Provider: Enable Titlovi.com", + "Provider: Enable Addic7ed":"Provider: Enable Addic7ed", + "Addic7ed Username":"Addic7ed Username", + "Addic7ed Password":"Addic7ed Password", + "Addic7ed: boost score (if requirements met)":"Addic7ed: boost score (if requirements met)", + "Addic7ed: Use random user agents":"Addic7ed: Use random user agents", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)":"Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", + "Legendas TV Username":"Legendas TV Username", + "Legendas TV Password":"Legendas TV Password", + "Provider: Enable TVsubtitles.net":"Provider: Enable TVsubtitles.net", + "Provider: Enable NapiProjekt.pl (Polish)":"Provider: Enable NapiProjekt.pl (Polish)", + "Provider: Enable SubScene (TV shows)":"Provider: Enable SubScene (TV shows)", + "Provider: Enable hosszupuskasub.com (Hungarian)":"Provider: Enable hosszupuskasub.com (Hungarian)", + "Provider: Enable aRGENTeaM (Spanish)":"Provider: Enable aRGENTeaM (Spanish)", + "Search enabled providers simultaneously (multithreading)":"Search enabled providers simultaneously (multithreading)", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)":"Automatically extract and use embedded subtitles upon media addition (with configured default mods)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?":"After automatic extraction of embedded subtitles, also immediately search for available subtitles?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?":"Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?":"Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?", + "How strict should these subtitles existing on the filesystem be detected?":"How strict should these subtitles existing on the filesystem be detected?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?":"Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)":"Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)":"Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)", + "Download hearing impaired subtitles.":"Download hearing impaired subtitles.", + "Remove Hearing Impaired tags from downloaded subtitles":"Remove Hearing Impaired tags from downloaded subtitles", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)":"Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)", + "Fix common issues in subtitles":"Fix common issues in subtitles", + "Fix common OCR errors in downloaded subtitles":"Fix common OCR errors in downloaded subtitles", + "Reverse punctuation in RTL languages (heb)":"Reverse punctuation in RTL languages (heb)", + "Change colors of subtitles to":"Change colors of subtitles to", + "Store subtitles next to media files (instead of metadata)":"Store subtitles next to media files (instead of metadata)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)":"Subtitle formats to save (non-SRT only works if the previous option is enabled)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)":"Subtitle Folder (\"current folder\" is the folder the current media file lives in)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)":"Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)", + "Fall back to metadata storage if filesystem storage failed":"Fall back to metadata storage if filesystem storage failed", + "Set subtitle file permissions to (integer, e.g.: 0775)":"Set subtitle file permissions to (integer, e.g.: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles":"Automatically delete leftover/unused (externally saved) subtitles", + "On media playback: search for missing subtitles (refresh item)":"On media playback: search for missing subtitles (refresh item)", + "Scheduler: Periodically search for recent items with missing subtitles":"Scheduler: Periodically search for recent items with missing subtitles", + "Scheduler: Item age to be considered recent":"Scheduler: Item age to be considered recent", + "Scheduler: Recent items to consider per library":"Scheduler: Recent items to consider per library", + "Scheduler: Periodically search for better subtitles":"Scheduler: Periodically search for better subtitles", + "Scheduler: Days to search for better subtitles (max: 30 days)":"Scheduler: Days to search for better subtitles (max: 30 days)", + "Scheduler: Don't search for better subtitles if the item's air date is older than":"Scheduler: Don't search for better subtitles if the item's air date is older than", + "Scheduler: Overwrite manually selected subtitles when better found":"Scheduler: Overwrite manually selected subtitles when better found", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found":"Scheduler: Overwrite subtitles with non-default subtitle modifications when better found", + "History: amount of items to store historical data for":"History: amount of items to store historical data for", + "How many download tries per subtitle (on timeout or error)":"How many download tries per subtitle (on timeout or error)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)":"Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)", + "Ignore anything in the following paths (comma-separated)":"Ignore anything in the following paths (comma-separated)", + "Sub-Zero mode":"Sub-Zero mode", + "Access PIN (any amount of numbers, 0-9)":"Access PIN (any amount of numbers, 0-9)", + "Access PIN valid for minutes":"Access PIN valid for minutes", + "Use PIN to restrict access to (needs plugin or PMS restart)":"Use PIN to restrict access to (needs plugin or PMS restart)", + "Call this executable upon successful subtitle download (see Wiki for details)":"Call this executable upon successful subtitle download (see Wiki for details)", + "Check for correct folder permissions of every library on plugin start":"Check for correct folder permissions of every library on plugin start", + "Use new style caching (for subliminal)":"Use new style caching (for subliminal)", + "Low impact mode (for remote filesystems)":"Low impact mode (for remote filesystems)", + "Timeout for API requests sent to the PMS":"Timeout for API requests sent to the PMS", + "HTTP proxy to use for providers (supports credentials)":"HTTP proxy to use for providers (supports credentials)", + "How verbose should the logging be?":"How verbose should the logging be?", + "How many log backups to keep?":"How many log backups to keep?", + "Log subtitle modification (debug)":"Log subtitle modification (debug)", + "Log to console (for development/debugging)":"Log to console (for development/debugging)", + "Collect anonymous usage statistics":"Collect anonymous usage statistics", + "Sonarr/Radarr (fill api info below)":"Sonarr/Radarr (fill api info below)", + "Filebot":"Filebot", + "Sonarr/Radarr/Filebot":"Sonarr/Radarr/Filebot", + "Symlink to original file":"Symlink to original file", + "I keep the original filenames":"I keep the original filenames", + "none of the above":"none of the above", + "exact: media filename match":"exact: media filename match", + "loose: filename contains media filename":"loose: filename contains media filename", + "any":"any", + "prefer":"prefer", + "don't prefer":"don't prefer", + "force HI":"force HI", + "force non-HI":"force non-HI", + "don't change":"don't change", + "white":"white", + "light-grey":"light-grey", + "red":"red", + "green":"green", + "yellow":"yellow", + "blue":"blue", + "magenta":"magenta", + "cyan":"cyan", + "black":"black", + "dark-red":"dark-red", + "dark-green":"dark-green", + "dark-yellow":"dark-yellow", + "dark-blue":"dark-blue", + "dark-magenta":"dark-magenta", + "dark-cyan":"dark-cyan", + "dark-grey":"dark-grey", + "current folder":"current folder", + "never":"never", + "current media item":"current media item", + "next episode (series)":"next episode (series)", + "hybrid: current item or next episode":"hybrid: current item or next episode", + "hybrid-plus: current item and next episode":"hybrid-plus: current item and next episode", + "every 6 hours":"every 6 hours", + "every 12 hours":"every 12 hours", + "every 24 hours":"every 24 hours", + "1 days":"1 days", + "2 days":"2 days", + "3 days":"3 days", + "4 days":"4 days", + "1 weeks":"1 weeks", + "2 weeks":"2 weeks", + "3 weeks":"3 weeks", + "4 weeks":"4 weeks", + "5 weeks":"5 weeks", + "6 weeks":"6 weeks", + "12 weeks":"12 weeks", + "don't limit":"don't limit", + "1 year":"1 year", + "2 years":"2 years", + "3 years":"3 years", + "4 years":"4 years", + "5 years":"5 years", + "6 years":"6 years", + "7 years":"7 years", + "8 years":"8 years", + "9 years":"9 years", + "10 years":"10 years", + "agent + interface":"agent + interface", + "only agent":"only agent", + "only interface":"only interface", + "disabled":"disabled", + "interface":"interface", + "advanced menu":"advanced menu", + "CRITICAL":"CRITICAL", + "ERROR":"ERROR", + "WARNING":"WARNING", + "INFO":"INFO", + "DEBUG":"DEBUG", + "Change the color of the subtitle":"Change the color of the subtitle", + "Adds the requested color to every line of the subtitle. Support depends on player.":"Adds the requested color to every line of the subtitle. Support depends on player.", + "Basic common fixes":"Basic common fixes", + "Fix common and whitespace/punctuation issues in subtitles":"Fix common and whitespace/punctuation issues in subtitles", + "Remove all style tags":"Remove all style tags", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.":"Removes all possible style tags from the subtitle, such as font, bold, color etc.", + "Reverse punctuation in RTL languages":"Reverse punctuation in RTL languages", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew":"Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew", + "Change the FPS of the subtitle":"Change the FPS of the subtitle", + "Re-syncs the subtitle to the framerate of the current media file.":"Re-syncs the subtitle to the framerate of the current media file.", + "Remove Hearing Impaired tags":"Remove Hearing Impaired tags", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people":"Removes tags, text and characters from subtitles that are meant for hearing impaired people", + "Fix common OCR issues":"Fix common OCR issues", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR":"Fix issues that happen when a subtitle gets converted from bitmap to text through OCR", + "Change the timing of the subtitle":"Change the timing of the subtitle", + "Adds or substracts a certain amount of time from the whole subtitle to match your media":"Adds or substracts a certain amount of time from the whole subtitle to match your media", + "Available":"Available", + "Current":"Current", + "Custom path to advanced_settings.json":"Custom path to advanced_settings.json" +} diff --git a/Contents/Strings/hu.json b/Contents/Strings/hu.json new file mode 100644 index 000000000..c9bf9df5a --- /dev/null +++ b/Contents/Strings/hu.json @@ -0,0 +1,400 @@ +{ + "sq":"Albanian", + "ar":"Arabic", + "be":"Belarusian", + "bs":"Bosnian", + "bg":"Bulgarian", + "ca":"Catalan", + "zh":"Chinese", + "hr":"Croatian", + "cs":"Czech", + "da":"Danish", + "nl":"Dutch", + "en":"English", + "et":"Estonian", + "fa":"Persian (Farsi)", + "fi":"Finnish", + "fr":"French", + "de":"German", + "el":"Greek", + "he":"Hebrew", + "hi":"Hindi", + "hu":"Hungarian", + "is":"Icelandic", + "id":"Indonesian", + "it":"Italian", + "ja":"Japanese", + "ko":"Korean", + "lv":"Latvian", + "lt":"Lithuanian", + "mk":"Macedonian", + "ms":"Malay", + "no":"Norwegian", + "pl":"Polish", + "pt":"Portuguese", + "pt-br":"Portuguese (Brasil)", + "ro":"Romanian", + "ru":"Russian", + "sr":"Serbian", + "sr-cyrl":"Serbian (Cyrillic)", + "sr-latn":"Serbian (Latin)", + "sk":"Slovak", + "sl":"Slovenian", + "es":"Spanish", + "sv":"Swedish", + "th":"Thai", + "tr":"Turkish", + "uk":"Ukranian", + "vi":"Vietnamese", + "Internal stuff, pay attention!":"Internal stuff, pay attention!", + "Advanced":"Advanced", + "advanced":"advanced", + "Enter PIN":"Enter PIN", + "The owner has restricted the access to this menu. Please enter the correct pin":"The owner has restricted the access to this menu. Please enter the correct pin", + "Restart the plugin":"Restart the plugin", + "Get my logs (copy the appearing link and open it in your browser, please)":"Get my logs (copy the appearing link and open it in your browser, please)", + "Copy the appearing link and open it in your browser, please":"Copy the appearing link and open it in your browser, please", + "Trigger find better subtitles":"Trigger find better subtitles", + "Skip next find better subtitles (sets last run to now)":"Skip next find better subtitles (sets last run to now)", + "Trigger subtitle storage maintenance":"Trigger subtitle storage maintenance", + "Trigger subtitle storage migration (expensive)":"Trigger subtitle storage migration (expensive)", + "Trigger cache maintenance (refiners, providers and packs/archives)":"Trigger cache maintenance (refiners, providers and packs/archives)", + "Apply configured default subtitle mods to all (active) stored subtitles":"Apply configured default subtitle mods to all (active) stored subtitles", + "Re-Apply mods of all stored subtitles":"Re-Apply mods of all stored subtitles", + "Log the plugin's scheduled tasks state storage":"Log the plugin's scheduled tasks state storage", + "Log the plugin's internal ignorelist storage":"Log the plugin's internal ignorelist storage", + "Log the plugin's complete state storage":"Log the plugin's complete state storage", + "Reset the plugin's scheduled tasks state storage":"Reset the plugin's scheduled tasks state storage", + "Reset the plugin's internal ignorelist storage":"Reset the plugin's internal ignorelist storage", + "Invalidate Sub-Zero metadata caches (subliminal)":"Invalidate Sub-Zero metadata caches (subliminal)", + "Reset provider throttle states":"Reset provider throttle states", + "Restarting the plugin":"Restarting the plugin", + "Restart triggered, please wait about 5 seconds":"Restart triggered, please wait about 5 seconds", + "Reset subtitle storage":"Reset subtitle storage", + "Are you sure?":"Are you sure?", + "Are you really sure?":"Are you really sure?", + "Success":"Success", + "Information Storage (%s) reset":"Information Storage (%s) reset", + "Information Storage (%s) logged":"Information Storage (%s) logged", + "FindBetterSubtitles triggered":"FindBetterSubtitles triggered", + "FindBetterSubtitles skipped":"FindBetterSubtitles skipped", + "SubtitleStorageMaintenance triggered":"SubtitleStorageMaintenance triggered", + "MigrateSubtitleStorage triggered":"MigrateSubtitleStorage triggered", + "TriggerCacheMaintenance triggered":"TriggerCacheMaintenance triggered", + "This may take some time ...":"This may take some time ...", + "Download Logs":"Download Logs", + "Sorry, feature unavailable":"Sorry, feature unavailable", + "Universal Plex token not available":"Universal Plex token not available", + "Copy this link and open this in your browser, please":"Copy this link and open this in your browser, please", + "Cache invalidated":"Cache invalidated", + "Enter PIN number ":"Enter PIN number ", + "PIN correct":"PIN correct", + "Reset":"Reset", + "Menu locked":"Menu locked", + "Provider throttles reset":"Provider throttles reset", + "Plex didn't return any information about the item, please refresh it and come back later":"Plex didn't return any information about the item, please refresh it and come back later", + "Item not found: %s!":"Item not found: %s!", + "< Back to %s":"< Back to %s", + "Back to %s > %s":"Back to %s > %s", + "Refresh: %s":"Refresh: %s", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk":"Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk", + "the movie":"the movie", + "the series":"the series", + "the episode":"the episode", + "the season":"the season", + "Force-find subtitles: %(item_title)s":"Force-find subtitles: %(item_title)s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones":"Issues a forced refresh, ignoring known subtitles and searching for new ones", + "File %(file_part_index)s: ":"File %(file_part_index)s: ", + "%(part_summary)sNo current subtitle in storage":"%(part_summary)sNo current subtitle in storage", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle":"%(part_summary)sManage %(language)s subtitle", + "%(part_summary)sList %(language)s subtitles":"%(part_summary)sList %(language)s subtitles", + "%(part_summary)sEmbedded subtitles (%(languages)s)":"%(part_summary)sEmbedded subtitles (%(languages)s)", + "Extract and activate embedded subtitle streams":"Extract and activate embedded subtitle streams", + "Select active %(language)s subtitle":"Select active %(language)s subtitle", + "%(count)d subtitles in storage":"%(count)d subtitles in storage", + "List available %(language)s subtitles":"List available %(language)s subtitles", + "Modify current %(language)s subtitle":"Modify current %(language)s subtitle", + "Currently applied mods: %(mod_list)s":"Currently applied mods: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one":"Blacklist current %(language)s subtitle and search for a new one", + "Manage blacklist (%(amount)s contained)":"Manage blacklist (%(amount)s contained)", + "Inspect currently blacklisted subtitles":"Inspect currently blacklisted subtitles", + "%(current_state)s%(subtitle_name)s, Score: %(score)s":"%(current_state)s%(subtitle_name)s, Score: %(score)s", + "Current: ":"Current: ", + "Stored: ":"Stored: ", + "Subtitle saved to disk":"Subtitle saved to disk", + "Remove subtitle from blacklist":"Remove subtitle from blacklist", + "by %(release_group)s":"by %(release_group)s", + "Current: %(provider_name)s (%(score)s) ":"Current: %(provider_name)s (%(score)s) ", + "Search for %(language)s subs (%(video_data)s)":"Search for %(language)s subs (%(video_data)s)", + "%(current_info)sFilename: %(filename)s":"%(current_info)sFilename: %(filename)s", + "No subtitles found":"No subtitles found", + "Searching for %(language)s subs (%(video_data)s), refresh here ...":"Searching for %(language)s subs (%(video_data)s), refresh here ...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)":" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)":" (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s":"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s":"Release: %(release_info)s, Matches: %(matches)s", + "Downloading subtitle for %(title_or_id)s":"Downloading subtitle for %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods", + " (unknown)":" (unknown)", + " (forced)":" (forced)", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "Extracting of embedded subtitle %s of part %s:%s triggered":"Extracting of embedded subtitle %s of part %s:%s triggered", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "Insufficient permissions":"Insufficient permissions", + "Insufficient permissions on library %(title)s, folder: %(path)s":"Insufficient permissions on library %(title)s, folder: %(path)s", + "I'm not enabled!":"I'm not enabled!", + "Please enable me for some of your libraries in your server settings; currently I do nothing":"Please enable me for some of your libraries in your server settings; currently I do nothing", + "Working ... refresh here":"Working ... refresh here", + "Current state: %s; Last state: %s":"Current state: %s; Last state: %s", + "On-deck items":"On-deck items", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", + "Recently-added items":"Recently-added items", + "Recently played items":"Recently played items", + "Shows the recently added items per section.":"Shows the recently added items per section.", + "Show recently added items with missing subtitles":"Show recently added items with missing subtitles", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list":"Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list", + "Browse all items":"Browse all items", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.":"Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)":"Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Last run: %s; Next scheduled run: %s; Last runtime: %s":"Last run: %s; Next scheduled run: %s; Last runtime: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)":"Search for missing subtitles (in recently-added items, max-age: %s)", + "Automatically run periodically by the scheduler, if configured. %s":"Automatically run periodically by the scheduler, if configured. %s", + "Display ignore list (%(ignored_count)d)":"Display ignore list (%(ignored_count)d)", + "Show the current ignore list (mainly used for the automatic tasks)":"Show the current ignore list (mainly used for the automatic tasks)", + "History":"History", + "Show the last %i downloaded subtitles":"Show the last %i downloaded subtitles", + "Refresh":"Refresh", + "Re-lock menu(s)":"Re-lock menu(s)", + "Enabled the PIN again for menu(s)":"Enabled the PIN again for menu(s)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)":"%(throttled_provider)s until %(until_date)s (%(reason)s)", + "Throttled providers: %s":"Throttled providers: %s", + "Advanced functions":"Advanced functions", + "Use at your own risk":"Use at your own risk", + "Items On Deck":"Items On Deck", + "Recently Played":"Recently Played", + "Items with missing subtitles":"Items with missing subtitles", + "Find recent items with missing subtitles":"Find recent items with missing subtitles", + "Updating, refresh here ...":"Updating, refresh here ...", + "Missing: %s":"Missing: %s", + "Add %(kind)s %(title)s to the ignore list":"Add %(kind)s %(title)s to the ignore list", + "Remove %(kind)s %(title)s from the ignore list":"Remove %(kind)s %(title)s from the ignore list", + "Didn't change the ignore list":"Didn't change the ignore list", + "%(title)s added to the ignore list":"%(title)s added to the ignore list", + "%(title)s removed from the ignore list":"%(title)s removed from the ignore list", + "Sections":"Sections", + "All":"All", + "Ignore %(kind)s \"%(title)s\"":"Ignore %(kind)s \"%(title)s\"", + "Un-ignore %(kind)s \"%(title)s\"":"Un-ignore %(kind)s \"%(title)s\"", + "show":"show", + "movie":"movie", + "Refreshing %(title)s":"Refreshing %(title)s", + "Force-refreshing %(title)s":"Force-refreshing %(title)s", + "Extracting subtitle %(stream_index)s of %(filename)s":"Extracting subtitle %(stream_index)s of %(filename)s", + "<< Back to home":"<< Back to home", + "Extract missing %(language)s embedded subtitles":"Extract missing %(language)s embedded subtitles", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications", + "Extract and activate %(language)s embedded subtitles":"Extract and activate %(language)s embedded subtitles", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts embedded subtitles of all episodes for the current season with all configured default modifications", + "Auto-Find subtitles: %s":"Auto-Find subtitles: %s", + "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered", + "Triggering refresh for %(title)s":"Triggering refresh for %(title)s", + "Triggering forced refresh for %(title)s":"Triggering forced refresh for %(title)s", + "Refresh of item %(item_id)s triggered":"Refresh of item %(item_id)s triggered", + "Forced refresh of item %(item_id)s triggered":"Forced refresh of item %(item_id)s triggered", + "< Back to subtitle options for: %s":"< Back to subtitle options for: %s", + "Remove last applied mod (%s)":"Remove last applied mod (%s)", + "none":"none", + "None":"None", + "Idle":"Idle", + "Manage applied mods":"Manage applied mods", + "Reapply applied mods":"Reapply applied mods", + "Restore original version":"Restore original version", + "< Back to subtitle modification menu":"< Back to subtitle modification menu", + "subs constantly getting faster":"subs constantly getting faster", + "subs constantly getting slower":"subs constantly getting slower", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)":"%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "< Back to subtitle modifications":"< Back to subtitle modifications", + "Adjust by %(time_and_unit)s":"Adjust by %(time_and_unit)s", + "< Back to unit selection":"< Back to unit selection", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "Remove: %(mod_name)s":"Remove: %(mod_name)s", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Subtitle download failed (%(item_id)s)", + "Subtitle Language (1)":"Subtitle Language (1)", + "Subtitle Language (2)":"Subtitle Language (2)", + "Subtitle Language (3)":"Subtitle Language (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)":"Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)", + "Only download foreign/forced subtitles":"Only download foreign/forced subtitles", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)":"Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)":"Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")":"Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1":"Embedded subtitles: Treat \"Undefined\" (und) as language 1", + "I rename my files using":"I rename my files using", + "Retrieve original filename from .file_info/file_info index files (see wiki)":"Retrieve original filename from .file_info/file_info index files (see wiki)", + "Sonarr URL (add URL base if configured)":"Sonarr URL (add URL base if configured)", + "Sonarr API key":"Sonarr API key", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)":"Radarr URL (add URL base if configured, min. version: 0.2.0.897)", + "Radarr API key":"Radarr API key", + "Provider: Enable OpenSubtitles":"Provider: Enable OpenSubtitles", + "Opensubtitles Username":"Opensubtitles Username", + "Opensubtitles Password":"Opensubtitles Password", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)":"OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET":"Provider: Enable Podnapisi.NET", + "Provider: Enable Titlovi.com":"Provider: Enable Titlovi.com", + "Provider: Enable Addic7ed":"Provider: Enable Addic7ed", + "Addic7ed Username":"Addic7ed Username", + "Addic7ed Password":"Addic7ed Password", + "Addic7ed: boost score (if requirements met)":"Addic7ed: boost score (if requirements met)", + "Addic7ed: Use random user agents":"Addic7ed: Use random user agents", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)":"Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", + "Legendas TV Username":"Legendas TV Username", + "Legendas TV Password":"Legendas TV Password", + "Provider: Enable TVsubtitles.net":"Provider: Enable TVsubtitles.net", + "Provider: Enable NapiProjekt.pl (Polish)":"Provider: Enable NapiProjekt.pl (Polish)", + "Provider: Enable SubScene (TV shows)":"Provider: Enable SubScene (TV shows)", + "Provider: Enable hosszupuskasub.com (Hungarian)":"Provider: Enable hosszupuskasub.com (Hungarian)", + "Provider: Enable aRGENTeaM (Spanish)":"Provider: Enable aRGENTeaM (Spanish)", + "Search enabled providers simultaneously (multithreading)":"Search enabled providers simultaneously (multithreading)", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)":"Automatically extract and use embedded subtitles upon media addition (with configured default mods)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?":"After automatic extraction of embedded subtitles, also immediately search for available subtitles?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?":"Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?":"Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?", + "How strict should these subtitles existing on the filesystem be detected?":"How strict should these subtitles existing on the filesystem be detected?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?":"Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)":"Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)":"Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)", + "Download hearing impaired subtitles.":"Download hearing impaired subtitles.", + "Remove Hearing Impaired tags from downloaded subtitles":"Remove Hearing Impaired tags from downloaded subtitles", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)":"Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)", + "Fix common issues in subtitles":"Fix common issues in subtitles", + "Fix common OCR errors in downloaded subtitles":"Fix common OCR errors in downloaded subtitles", + "Reverse punctuation in RTL languages (heb)":"Reverse punctuation in RTL languages (heb)", + "Change colors of subtitles to":"Change colors of subtitles to", + "Store subtitles next to media files (instead of metadata)":"Store subtitles next to media files (instead of metadata)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)":"Subtitle formats to save (non-SRT only works if the previous option is enabled)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)":"Subtitle Folder (\"current folder\" is the folder the current media file lives in)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)":"Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)", + "Fall back to metadata storage if filesystem storage failed":"Fall back to metadata storage if filesystem storage failed", + "Set subtitle file permissions to (integer, e.g.: 0775)":"Set subtitle file permissions to (integer, e.g.: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles":"Automatically delete leftover/unused (externally saved) subtitles", + "On media playback: search for missing subtitles (refresh item)":"On media playback: search for missing subtitles (refresh item)", + "Scheduler: Periodically search for recent items with missing subtitles":"Scheduler: Periodically search for recent items with missing subtitles", + "Scheduler: Item age to be considered recent":"Scheduler: Item age to be considered recent", + "Scheduler: Recent items to consider per library":"Scheduler: Recent items to consider per library", + "Scheduler: Periodically search for better subtitles":"Scheduler: Periodically search for better subtitles", + "Scheduler: Days to search for better subtitles (max: 30 days)":"Scheduler: Days to search for better subtitles (max: 30 days)", + "Scheduler: Don't search for better subtitles if the item's air date is older than":"Scheduler: Don't search for better subtitles if the item's air date is older than", + "Scheduler: Overwrite manually selected subtitles when better found":"Scheduler: Overwrite manually selected subtitles when better found", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found":"Scheduler: Overwrite subtitles with non-default subtitle modifications when better found", + "History: amount of items to store historical data for":"History: amount of items to store historical data for", + "How many download tries per subtitle (on timeout or error)":"How many download tries per subtitle (on timeout or error)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)":"Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)", + "Ignore anything in the following paths (comma-separated)":"Ignore anything in the following paths (comma-separated)", + "Sub-Zero mode":"Sub-Zero mode", + "Access PIN (any amount of numbers, 0-9)":"Access PIN (any amount of numbers, 0-9)", + "Access PIN valid for minutes":"Access PIN valid for minutes", + "Use PIN to restrict access to (needs plugin or PMS restart)":"Use PIN to restrict access to (needs plugin or PMS restart)", + "Call this executable upon successful subtitle download (see Wiki for details)":"Call this executable upon successful subtitle download (see Wiki for details)", + "Check for correct folder permissions of every library on plugin start":"Check for correct folder permissions of every library on plugin start", + "Use new style caching (for subliminal)":"Use new style caching (for subliminal)", + "Low impact mode (for remote filesystems)":"Low impact mode (for remote filesystems)", + "Timeout for API requests sent to the PMS":"Timeout for API requests sent to the PMS", + "HTTP proxy to use for providers (supports credentials)":"HTTP proxy to use for providers (supports credentials)", + "How verbose should the logging be?":"How verbose should the logging be?", + "How many log backups to keep?":"How many log backups to keep?", + "Log subtitle modification (debug)":"Log subtitle modification (debug)", + "Log to console (for development/debugging)":"Log to console (for development/debugging)", + "Collect anonymous usage statistics":"Collect anonymous usage statistics", + "Sonarr/Radarr (fill api info below)":"Sonarr/Radarr (fill api info below)", + "Filebot":"Filebot", + "Sonarr/Radarr/Filebot":"Sonarr/Radarr/Filebot", + "Symlink to original file":"Symlink to original file", + "I keep the original filenames":"I keep the original filenames", + "none of the above":"none of the above", + "exact: media filename match":"exact: media filename match", + "loose: filename contains media filename":"loose: filename contains media filename", + "any":"any", + "prefer":"prefer", + "don't prefer":"don't prefer", + "force HI":"force HI", + "force non-HI":"force non-HI", + "don't change":"don't change", + "white":"white", + "light-grey":"light-grey", + "red":"red", + "green":"green", + "yellow":"yellow", + "blue":"blue", + "magenta":"magenta", + "cyan":"cyan", + "black":"black", + "dark-red":"dark-red", + "dark-green":"dark-green", + "dark-yellow":"dark-yellow", + "dark-blue":"dark-blue", + "dark-magenta":"dark-magenta", + "dark-cyan":"dark-cyan", + "dark-grey":"dark-grey", + "current folder":"current folder", + "never":"never", + "current media item":"current media item", + "next episode (series)":"next episode (series)", + "hybrid: current item or next episode":"hybrid: current item or next episode", + "hybrid-plus: current item and next episode":"hybrid-plus: current item and next episode", + "every 6 hours":"every 6 hours", + "every 12 hours":"every 12 hours", + "every 24 hours":"every 24 hours", + "1 days":"1 days", + "2 days":"2 days", + "3 days":"3 days", + "4 days":"4 days", + "1 weeks":"1 weeks", + "2 weeks":"2 weeks", + "3 weeks":"3 weeks", + "4 weeks":"4 weeks", + "5 weeks":"5 weeks", + "6 weeks":"6 weeks", + "12 weeks":"12 weeks", + "don't limit":"don't limit", + "1 year":"1 year", + "2 years":"2 years", + "3 years":"3 years", + "4 years":"4 years", + "5 years":"5 years", + "6 years":"6 years", + "7 years":"7 years", + "8 years":"8 years", + "9 years":"9 years", + "10 years":"10 years", + "agent + interface":"agent + interface", + "only agent":"only agent", + "only interface":"only interface", + "disabled":"disabled", + "interface":"interface", + "advanced menu":"advanced menu", + "CRITICAL":"CRITICAL", + "ERROR":"ERROR", + "WARNING":"WARNING", + "INFO":"INFO", + "DEBUG":"DEBUG", + "Change the color of the subtitle":"Change the color of the subtitle", + "Adds the requested color to every line of the subtitle. Support depends on player.":"Adds the requested color to every line of the subtitle. Support depends on player.", + "Basic common fixes":"Basic common fixes", + "Fix common and whitespace/punctuation issues in subtitles":"Fix common and whitespace/punctuation issues in subtitles", + "Remove all style tags":"Remove all style tags", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.":"Removes all possible style tags from the subtitle, such as font, bold, color etc.", + "Reverse punctuation in RTL languages":"Reverse punctuation in RTL languages", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew":"Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew", + "Change the FPS of the subtitle":"Change the FPS of the subtitle", + "Re-syncs the subtitle to the framerate of the current media file.":"Re-syncs the subtitle to the framerate of the current media file.", + "Remove Hearing Impaired tags":"Remove Hearing Impaired tags", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people":"Removes tags, text and characters from subtitles that are meant for hearing impaired people", + "Fix common OCR issues":"Fix common OCR issues", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR":"Fix issues that happen when a subtitle gets converted from bitmap to text through OCR", + "Change the timing of the subtitle":"Change the timing of the subtitle", + "Adds or substracts a certain amount of time from the whole subtitle to match your media":"Adds or substracts a certain amount of time from the whole subtitle to match your media", + "Available":"Available", + "Current":"Current", + "Custom path to advanced_settings.json":"Custom path to advanced_settings.json" +} diff --git a/Contents/Strings/nl.json b/Contents/Strings/nl.json new file mode 100644 index 000000000..c9bf9df5a --- /dev/null +++ b/Contents/Strings/nl.json @@ -0,0 +1,400 @@ +{ + "sq":"Albanian", + "ar":"Arabic", + "be":"Belarusian", + "bs":"Bosnian", + "bg":"Bulgarian", + "ca":"Catalan", + "zh":"Chinese", + "hr":"Croatian", + "cs":"Czech", + "da":"Danish", + "nl":"Dutch", + "en":"English", + "et":"Estonian", + "fa":"Persian (Farsi)", + "fi":"Finnish", + "fr":"French", + "de":"German", + "el":"Greek", + "he":"Hebrew", + "hi":"Hindi", + "hu":"Hungarian", + "is":"Icelandic", + "id":"Indonesian", + "it":"Italian", + "ja":"Japanese", + "ko":"Korean", + "lv":"Latvian", + "lt":"Lithuanian", + "mk":"Macedonian", + "ms":"Malay", + "no":"Norwegian", + "pl":"Polish", + "pt":"Portuguese", + "pt-br":"Portuguese (Brasil)", + "ro":"Romanian", + "ru":"Russian", + "sr":"Serbian", + "sr-cyrl":"Serbian (Cyrillic)", + "sr-latn":"Serbian (Latin)", + "sk":"Slovak", + "sl":"Slovenian", + "es":"Spanish", + "sv":"Swedish", + "th":"Thai", + "tr":"Turkish", + "uk":"Ukranian", + "vi":"Vietnamese", + "Internal stuff, pay attention!":"Internal stuff, pay attention!", + "Advanced":"Advanced", + "advanced":"advanced", + "Enter PIN":"Enter PIN", + "The owner has restricted the access to this menu. Please enter the correct pin":"The owner has restricted the access to this menu. Please enter the correct pin", + "Restart the plugin":"Restart the plugin", + "Get my logs (copy the appearing link and open it in your browser, please)":"Get my logs (copy the appearing link and open it in your browser, please)", + "Copy the appearing link and open it in your browser, please":"Copy the appearing link and open it in your browser, please", + "Trigger find better subtitles":"Trigger find better subtitles", + "Skip next find better subtitles (sets last run to now)":"Skip next find better subtitles (sets last run to now)", + "Trigger subtitle storage maintenance":"Trigger subtitle storage maintenance", + "Trigger subtitle storage migration (expensive)":"Trigger subtitle storage migration (expensive)", + "Trigger cache maintenance (refiners, providers and packs/archives)":"Trigger cache maintenance (refiners, providers and packs/archives)", + "Apply configured default subtitle mods to all (active) stored subtitles":"Apply configured default subtitle mods to all (active) stored subtitles", + "Re-Apply mods of all stored subtitles":"Re-Apply mods of all stored subtitles", + "Log the plugin's scheduled tasks state storage":"Log the plugin's scheduled tasks state storage", + "Log the plugin's internal ignorelist storage":"Log the plugin's internal ignorelist storage", + "Log the plugin's complete state storage":"Log the plugin's complete state storage", + "Reset the plugin's scheduled tasks state storage":"Reset the plugin's scheduled tasks state storage", + "Reset the plugin's internal ignorelist storage":"Reset the plugin's internal ignorelist storage", + "Invalidate Sub-Zero metadata caches (subliminal)":"Invalidate Sub-Zero metadata caches (subliminal)", + "Reset provider throttle states":"Reset provider throttle states", + "Restarting the plugin":"Restarting the plugin", + "Restart triggered, please wait about 5 seconds":"Restart triggered, please wait about 5 seconds", + "Reset subtitle storage":"Reset subtitle storage", + "Are you sure?":"Are you sure?", + "Are you really sure?":"Are you really sure?", + "Success":"Success", + "Information Storage (%s) reset":"Information Storage (%s) reset", + "Information Storage (%s) logged":"Information Storage (%s) logged", + "FindBetterSubtitles triggered":"FindBetterSubtitles triggered", + "FindBetterSubtitles skipped":"FindBetterSubtitles skipped", + "SubtitleStorageMaintenance triggered":"SubtitleStorageMaintenance triggered", + "MigrateSubtitleStorage triggered":"MigrateSubtitleStorage triggered", + "TriggerCacheMaintenance triggered":"TriggerCacheMaintenance triggered", + "This may take some time ...":"This may take some time ...", + "Download Logs":"Download Logs", + "Sorry, feature unavailable":"Sorry, feature unavailable", + "Universal Plex token not available":"Universal Plex token not available", + "Copy this link and open this in your browser, please":"Copy this link and open this in your browser, please", + "Cache invalidated":"Cache invalidated", + "Enter PIN number ":"Enter PIN number ", + "PIN correct":"PIN correct", + "Reset":"Reset", + "Menu locked":"Menu locked", + "Provider throttles reset":"Provider throttles reset", + "Plex didn't return any information about the item, please refresh it and come back later":"Plex didn't return any information about the item, please refresh it and come back later", + "Item not found: %s!":"Item not found: %s!", + "< Back to %s":"< Back to %s", + "Back to %s > %s":"Back to %s > %s", + "Refresh: %s":"Refresh: %s", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk":"Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk", + "the movie":"the movie", + "the series":"the series", + "the episode":"the episode", + "the season":"the season", + "Force-find subtitles: %(item_title)s":"Force-find subtitles: %(item_title)s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones":"Issues a forced refresh, ignoring known subtitles and searching for new ones", + "File %(file_part_index)s: ":"File %(file_part_index)s: ", + "%(part_summary)sNo current subtitle in storage":"%(part_summary)sNo current subtitle in storage", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle":"%(part_summary)sManage %(language)s subtitle", + "%(part_summary)sList %(language)s subtitles":"%(part_summary)sList %(language)s subtitles", + "%(part_summary)sEmbedded subtitles (%(languages)s)":"%(part_summary)sEmbedded subtitles (%(languages)s)", + "Extract and activate embedded subtitle streams":"Extract and activate embedded subtitle streams", + "Select active %(language)s subtitle":"Select active %(language)s subtitle", + "%(count)d subtitles in storage":"%(count)d subtitles in storage", + "List available %(language)s subtitles":"List available %(language)s subtitles", + "Modify current %(language)s subtitle":"Modify current %(language)s subtitle", + "Currently applied mods: %(mod_list)s":"Currently applied mods: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one":"Blacklist current %(language)s subtitle and search for a new one", + "Manage blacklist (%(amount)s contained)":"Manage blacklist (%(amount)s contained)", + "Inspect currently blacklisted subtitles":"Inspect currently blacklisted subtitles", + "%(current_state)s%(subtitle_name)s, Score: %(score)s":"%(current_state)s%(subtitle_name)s, Score: %(score)s", + "Current: ":"Current: ", + "Stored: ":"Stored: ", + "Subtitle saved to disk":"Subtitle saved to disk", + "Remove subtitle from blacklist":"Remove subtitle from blacklist", + "by %(release_group)s":"by %(release_group)s", + "Current: %(provider_name)s (%(score)s) ":"Current: %(provider_name)s (%(score)s) ", + "Search for %(language)s subs (%(video_data)s)":"Search for %(language)s subs (%(video_data)s)", + "%(current_info)sFilename: %(filename)s":"%(current_info)sFilename: %(filename)s", + "No subtitles found":"No subtitles found", + "Searching for %(language)s subs (%(video_data)s), refresh here ...":"Searching for %(language)s subs (%(video_data)s), refresh here ...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)":" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)":" (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s":"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s":"Release: %(release_info)s, Matches: %(matches)s", + "Downloading subtitle for %(title_or_id)s":"Downloading subtitle for %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods", + " (unknown)":" (unknown)", + " (forced)":" (forced)", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "Extracting of embedded subtitle %s of part %s:%s triggered":"Extracting of embedded subtitle %s of part %s:%s triggered", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "Insufficient permissions":"Insufficient permissions", + "Insufficient permissions on library %(title)s, folder: %(path)s":"Insufficient permissions on library %(title)s, folder: %(path)s", + "I'm not enabled!":"I'm not enabled!", + "Please enable me for some of your libraries in your server settings; currently I do nothing":"Please enable me for some of your libraries in your server settings; currently I do nothing", + "Working ... refresh here":"Working ... refresh here", + "Current state: %s; Last state: %s":"Current state: %s; Last state: %s", + "On-deck items":"On-deck items", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", + "Recently-added items":"Recently-added items", + "Recently played items":"Recently played items", + "Shows the recently added items per section.":"Shows the recently added items per section.", + "Show recently added items with missing subtitles":"Show recently added items with missing subtitles", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list":"Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list", + "Browse all items":"Browse all items", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.":"Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)":"Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Last run: %s; Next scheduled run: %s; Last runtime: %s":"Last run: %s; Next scheduled run: %s; Last runtime: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)":"Search for missing subtitles (in recently-added items, max-age: %s)", + "Automatically run periodically by the scheduler, if configured. %s":"Automatically run periodically by the scheduler, if configured. %s", + "Display ignore list (%(ignored_count)d)":"Display ignore list (%(ignored_count)d)", + "Show the current ignore list (mainly used for the automatic tasks)":"Show the current ignore list (mainly used for the automatic tasks)", + "History":"History", + "Show the last %i downloaded subtitles":"Show the last %i downloaded subtitles", + "Refresh":"Refresh", + "Re-lock menu(s)":"Re-lock menu(s)", + "Enabled the PIN again for menu(s)":"Enabled the PIN again for menu(s)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)":"%(throttled_provider)s until %(until_date)s (%(reason)s)", + "Throttled providers: %s":"Throttled providers: %s", + "Advanced functions":"Advanced functions", + "Use at your own risk":"Use at your own risk", + "Items On Deck":"Items On Deck", + "Recently Played":"Recently Played", + "Items with missing subtitles":"Items with missing subtitles", + "Find recent items with missing subtitles":"Find recent items with missing subtitles", + "Updating, refresh here ...":"Updating, refresh here ...", + "Missing: %s":"Missing: %s", + "Add %(kind)s %(title)s to the ignore list":"Add %(kind)s %(title)s to the ignore list", + "Remove %(kind)s %(title)s from the ignore list":"Remove %(kind)s %(title)s from the ignore list", + "Didn't change the ignore list":"Didn't change the ignore list", + "%(title)s added to the ignore list":"%(title)s added to the ignore list", + "%(title)s removed from the ignore list":"%(title)s removed from the ignore list", + "Sections":"Sections", + "All":"All", + "Ignore %(kind)s \"%(title)s\"":"Ignore %(kind)s \"%(title)s\"", + "Un-ignore %(kind)s \"%(title)s\"":"Un-ignore %(kind)s \"%(title)s\"", + "show":"show", + "movie":"movie", + "Refreshing %(title)s":"Refreshing %(title)s", + "Force-refreshing %(title)s":"Force-refreshing %(title)s", + "Extracting subtitle %(stream_index)s of %(filename)s":"Extracting subtitle %(stream_index)s of %(filename)s", + "<< Back to home":"<< Back to home", + "Extract missing %(language)s embedded subtitles":"Extract missing %(language)s embedded subtitles", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications", + "Extract and activate %(language)s embedded subtitles":"Extract and activate %(language)s embedded subtitles", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts embedded subtitles of all episodes for the current season with all configured default modifications", + "Auto-Find subtitles: %s":"Auto-Find subtitles: %s", + "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered", + "Triggering refresh for %(title)s":"Triggering refresh for %(title)s", + "Triggering forced refresh for %(title)s":"Triggering forced refresh for %(title)s", + "Refresh of item %(item_id)s triggered":"Refresh of item %(item_id)s triggered", + "Forced refresh of item %(item_id)s triggered":"Forced refresh of item %(item_id)s triggered", + "< Back to subtitle options for: %s":"< Back to subtitle options for: %s", + "Remove last applied mod (%s)":"Remove last applied mod (%s)", + "none":"none", + "None":"None", + "Idle":"Idle", + "Manage applied mods":"Manage applied mods", + "Reapply applied mods":"Reapply applied mods", + "Restore original version":"Restore original version", + "< Back to subtitle modification menu":"< Back to subtitle modification menu", + "subs constantly getting faster":"subs constantly getting faster", + "subs constantly getting slower":"subs constantly getting slower", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)":"%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "< Back to subtitle modifications":"< Back to subtitle modifications", + "Adjust by %(time_and_unit)s":"Adjust by %(time_and_unit)s", + "< Back to unit selection":"< Back to unit selection", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "Remove: %(mod_name)s":"Remove: %(mod_name)s", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Subtitle download failed (%(item_id)s)", + "Subtitle Language (1)":"Subtitle Language (1)", + "Subtitle Language (2)":"Subtitle Language (2)", + "Subtitle Language (3)":"Subtitle Language (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)":"Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)", + "Only download foreign/forced subtitles":"Only download foreign/forced subtitles", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)":"Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)":"Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")":"Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1":"Embedded subtitles: Treat \"Undefined\" (und) as language 1", + "I rename my files using":"I rename my files using", + "Retrieve original filename from .file_info/file_info index files (see wiki)":"Retrieve original filename from .file_info/file_info index files (see wiki)", + "Sonarr URL (add URL base if configured)":"Sonarr URL (add URL base if configured)", + "Sonarr API key":"Sonarr API key", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)":"Radarr URL (add URL base if configured, min. version: 0.2.0.897)", + "Radarr API key":"Radarr API key", + "Provider: Enable OpenSubtitles":"Provider: Enable OpenSubtitles", + "Opensubtitles Username":"Opensubtitles Username", + "Opensubtitles Password":"Opensubtitles Password", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)":"OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET":"Provider: Enable Podnapisi.NET", + "Provider: Enable Titlovi.com":"Provider: Enable Titlovi.com", + "Provider: Enable Addic7ed":"Provider: Enable Addic7ed", + "Addic7ed Username":"Addic7ed Username", + "Addic7ed Password":"Addic7ed Password", + "Addic7ed: boost score (if requirements met)":"Addic7ed: boost score (if requirements met)", + "Addic7ed: Use random user agents":"Addic7ed: Use random user agents", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)":"Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", + "Legendas TV Username":"Legendas TV Username", + "Legendas TV Password":"Legendas TV Password", + "Provider: Enable TVsubtitles.net":"Provider: Enable TVsubtitles.net", + "Provider: Enable NapiProjekt.pl (Polish)":"Provider: Enable NapiProjekt.pl (Polish)", + "Provider: Enable SubScene (TV shows)":"Provider: Enable SubScene (TV shows)", + "Provider: Enable hosszupuskasub.com (Hungarian)":"Provider: Enable hosszupuskasub.com (Hungarian)", + "Provider: Enable aRGENTeaM (Spanish)":"Provider: Enable aRGENTeaM (Spanish)", + "Search enabled providers simultaneously (multithreading)":"Search enabled providers simultaneously (multithreading)", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)":"Automatically extract and use embedded subtitles upon media addition (with configured default mods)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?":"After automatic extraction of embedded subtitles, also immediately search for available subtitles?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?":"Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?":"Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?", + "How strict should these subtitles existing on the filesystem be detected?":"How strict should these subtitles existing on the filesystem be detected?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?":"Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)":"Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)":"Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)", + "Download hearing impaired subtitles.":"Download hearing impaired subtitles.", + "Remove Hearing Impaired tags from downloaded subtitles":"Remove Hearing Impaired tags from downloaded subtitles", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)":"Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)", + "Fix common issues in subtitles":"Fix common issues in subtitles", + "Fix common OCR errors in downloaded subtitles":"Fix common OCR errors in downloaded subtitles", + "Reverse punctuation in RTL languages (heb)":"Reverse punctuation in RTL languages (heb)", + "Change colors of subtitles to":"Change colors of subtitles to", + "Store subtitles next to media files (instead of metadata)":"Store subtitles next to media files (instead of metadata)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)":"Subtitle formats to save (non-SRT only works if the previous option is enabled)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)":"Subtitle Folder (\"current folder\" is the folder the current media file lives in)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)":"Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)", + "Fall back to metadata storage if filesystem storage failed":"Fall back to metadata storage if filesystem storage failed", + "Set subtitle file permissions to (integer, e.g.: 0775)":"Set subtitle file permissions to (integer, e.g.: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles":"Automatically delete leftover/unused (externally saved) subtitles", + "On media playback: search for missing subtitles (refresh item)":"On media playback: search for missing subtitles (refresh item)", + "Scheduler: Periodically search for recent items with missing subtitles":"Scheduler: Periodically search for recent items with missing subtitles", + "Scheduler: Item age to be considered recent":"Scheduler: Item age to be considered recent", + "Scheduler: Recent items to consider per library":"Scheduler: Recent items to consider per library", + "Scheduler: Periodically search for better subtitles":"Scheduler: Periodically search for better subtitles", + "Scheduler: Days to search for better subtitles (max: 30 days)":"Scheduler: Days to search for better subtitles (max: 30 days)", + "Scheduler: Don't search for better subtitles if the item's air date is older than":"Scheduler: Don't search for better subtitles if the item's air date is older than", + "Scheduler: Overwrite manually selected subtitles when better found":"Scheduler: Overwrite manually selected subtitles when better found", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found":"Scheduler: Overwrite subtitles with non-default subtitle modifications when better found", + "History: amount of items to store historical data for":"History: amount of items to store historical data for", + "How many download tries per subtitle (on timeout or error)":"How many download tries per subtitle (on timeout or error)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)":"Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)", + "Ignore anything in the following paths (comma-separated)":"Ignore anything in the following paths (comma-separated)", + "Sub-Zero mode":"Sub-Zero mode", + "Access PIN (any amount of numbers, 0-9)":"Access PIN (any amount of numbers, 0-9)", + "Access PIN valid for minutes":"Access PIN valid for minutes", + "Use PIN to restrict access to (needs plugin or PMS restart)":"Use PIN to restrict access to (needs plugin or PMS restart)", + "Call this executable upon successful subtitle download (see Wiki for details)":"Call this executable upon successful subtitle download (see Wiki for details)", + "Check for correct folder permissions of every library on plugin start":"Check for correct folder permissions of every library on plugin start", + "Use new style caching (for subliminal)":"Use new style caching (for subliminal)", + "Low impact mode (for remote filesystems)":"Low impact mode (for remote filesystems)", + "Timeout for API requests sent to the PMS":"Timeout for API requests sent to the PMS", + "HTTP proxy to use for providers (supports credentials)":"HTTP proxy to use for providers (supports credentials)", + "How verbose should the logging be?":"How verbose should the logging be?", + "How many log backups to keep?":"How many log backups to keep?", + "Log subtitle modification (debug)":"Log subtitle modification (debug)", + "Log to console (for development/debugging)":"Log to console (for development/debugging)", + "Collect anonymous usage statistics":"Collect anonymous usage statistics", + "Sonarr/Radarr (fill api info below)":"Sonarr/Radarr (fill api info below)", + "Filebot":"Filebot", + "Sonarr/Radarr/Filebot":"Sonarr/Radarr/Filebot", + "Symlink to original file":"Symlink to original file", + "I keep the original filenames":"I keep the original filenames", + "none of the above":"none of the above", + "exact: media filename match":"exact: media filename match", + "loose: filename contains media filename":"loose: filename contains media filename", + "any":"any", + "prefer":"prefer", + "don't prefer":"don't prefer", + "force HI":"force HI", + "force non-HI":"force non-HI", + "don't change":"don't change", + "white":"white", + "light-grey":"light-grey", + "red":"red", + "green":"green", + "yellow":"yellow", + "blue":"blue", + "magenta":"magenta", + "cyan":"cyan", + "black":"black", + "dark-red":"dark-red", + "dark-green":"dark-green", + "dark-yellow":"dark-yellow", + "dark-blue":"dark-blue", + "dark-magenta":"dark-magenta", + "dark-cyan":"dark-cyan", + "dark-grey":"dark-grey", + "current folder":"current folder", + "never":"never", + "current media item":"current media item", + "next episode (series)":"next episode (series)", + "hybrid: current item or next episode":"hybrid: current item or next episode", + "hybrid-plus: current item and next episode":"hybrid-plus: current item and next episode", + "every 6 hours":"every 6 hours", + "every 12 hours":"every 12 hours", + "every 24 hours":"every 24 hours", + "1 days":"1 days", + "2 days":"2 days", + "3 days":"3 days", + "4 days":"4 days", + "1 weeks":"1 weeks", + "2 weeks":"2 weeks", + "3 weeks":"3 weeks", + "4 weeks":"4 weeks", + "5 weeks":"5 weeks", + "6 weeks":"6 weeks", + "12 weeks":"12 weeks", + "don't limit":"don't limit", + "1 year":"1 year", + "2 years":"2 years", + "3 years":"3 years", + "4 years":"4 years", + "5 years":"5 years", + "6 years":"6 years", + "7 years":"7 years", + "8 years":"8 years", + "9 years":"9 years", + "10 years":"10 years", + "agent + interface":"agent + interface", + "only agent":"only agent", + "only interface":"only interface", + "disabled":"disabled", + "interface":"interface", + "advanced menu":"advanced menu", + "CRITICAL":"CRITICAL", + "ERROR":"ERROR", + "WARNING":"WARNING", + "INFO":"INFO", + "DEBUG":"DEBUG", + "Change the color of the subtitle":"Change the color of the subtitle", + "Adds the requested color to every line of the subtitle. Support depends on player.":"Adds the requested color to every line of the subtitle. Support depends on player.", + "Basic common fixes":"Basic common fixes", + "Fix common and whitespace/punctuation issues in subtitles":"Fix common and whitespace/punctuation issues in subtitles", + "Remove all style tags":"Remove all style tags", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.":"Removes all possible style tags from the subtitle, such as font, bold, color etc.", + "Reverse punctuation in RTL languages":"Reverse punctuation in RTL languages", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew":"Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew", + "Change the FPS of the subtitle":"Change the FPS of the subtitle", + "Re-syncs the subtitle to the framerate of the current media file.":"Re-syncs the subtitle to the framerate of the current media file.", + "Remove Hearing Impaired tags":"Remove Hearing Impaired tags", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people":"Removes tags, text and characters from subtitles that are meant for hearing impaired people", + "Fix common OCR issues":"Fix common OCR issues", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR":"Fix issues that happen when a subtitle gets converted from bitmap to text through OCR", + "Change the timing of the subtitle":"Change the timing of the subtitle", + "Adds or substracts a certain amount of time from the whole subtitle to match your media":"Adds or substracts a certain amount of time from the whole subtitle to match your media", + "Available":"Available", + "Current":"Current", + "Custom path to advanced_settings.json":"Custom path to advanced_settings.json" +} From a8f5ad64359faaedf6a5d4d5c9d1b708da4c49ba Mon Sep 17 00:00:00 2001 From: pannal Date: Fri, 15 Jun 2018 04:37:03 +0200 Subject: [PATCH 111/710] Update da.json (POEditor.com) From c6e7e64ba30d50dede0aa698f5168f8ea333738f Mon Sep 17 00:00:00 2001 From: pannal Date: Fri, 15 Jun 2018 04:37:05 +0200 Subject: [PATCH 112/710] Update de.json (POEditor.com) From 2092d446274cd670a9758f03fb6b04a09530ca40 Mon Sep 17 00:00:00 2001 From: pannal Date: Fri, 15 Jun 2018 04:37:07 +0200 Subject: [PATCH 113/710] Update nl.json (POEditor.com) --- Contents/Strings/nl.json | 798 +++++++++++++++++++-------------------- 1 file changed, 399 insertions(+), 399 deletions(-) diff --git a/Contents/Strings/nl.json b/Contents/Strings/nl.json index c9bf9df5a..ff8b4f78d 100644 --- a/Contents/Strings/nl.json +++ b/Contents/Strings/nl.json @@ -1,400 +1,400 @@ { - "sq":"Albanian", - "ar":"Arabic", - "be":"Belarusian", - "bs":"Bosnian", - "bg":"Bulgarian", - "ca":"Catalan", - "zh":"Chinese", - "hr":"Croatian", - "cs":"Czech", - "da":"Danish", - "nl":"Dutch", - "en":"English", - "et":"Estonian", - "fa":"Persian (Farsi)", - "fi":"Finnish", - "fr":"French", - "de":"German", - "el":"Greek", - "he":"Hebrew", - "hi":"Hindi", - "hu":"Hungarian", - "is":"Icelandic", - "id":"Indonesian", - "it":"Italian", - "ja":"Japanese", - "ko":"Korean", - "lv":"Latvian", - "lt":"Lithuanian", - "mk":"Macedonian", - "ms":"Malay", - "no":"Norwegian", - "pl":"Polish", - "pt":"Portuguese", - "pt-br":"Portuguese (Brasil)", - "ro":"Romanian", - "ru":"Russian", - "sr":"Serbian", - "sr-cyrl":"Serbian (Cyrillic)", - "sr-latn":"Serbian (Latin)", - "sk":"Slovak", - "sl":"Slovenian", - "es":"Spanish", - "sv":"Swedish", - "th":"Thai", - "tr":"Turkish", - "uk":"Ukranian", - "vi":"Vietnamese", - "Internal stuff, pay attention!":"Internal stuff, pay attention!", - "Advanced":"Advanced", - "advanced":"advanced", - "Enter PIN":"Enter PIN", - "The owner has restricted the access to this menu. Please enter the correct pin":"The owner has restricted the access to this menu. Please enter the correct pin", - "Restart the plugin":"Restart the plugin", - "Get my logs (copy the appearing link and open it in your browser, please)":"Get my logs (copy the appearing link and open it in your browser, please)", - "Copy the appearing link and open it in your browser, please":"Copy the appearing link and open it in your browser, please", - "Trigger find better subtitles":"Trigger find better subtitles", - "Skip next find better subtitles (sets last run to now)":"Skip next find better subtitles (sets last run to now)", - "Trigger subtitle storage maintenance":"Trigger subtitle storage maintenance", - "Trigger subtitle storage migration (expensive)":"Trigger subtitle storage migration (expensive)", - "Trigger cache maintenance (refiners, providers and packs/archives)":"Trigger cache maintenance (refiners, providers and packs/archives)", - "Apply configured default subtitle mods to all (active) stored subtitles":"Apply configured default subtitle mods to all (active) stored subtitles", - "Re-Apply mods of all stored subtitles":"Re-Apply mods of all stored subtitles", - "Log the plugin's scheduled tasks state storage":"Log the plugin's scheduled tasks state storage", - "Log the plugin's internal ignorelist storage":"Log the plugin's internal ignorelist storage", - "Log the plugin's complete state storage":"Log the plugin's complete state storage", - "Reset the plugin's scheduled tasks state storage":"Reset the plugin's scheduled tasks state storage", - "Reset the plugin's internal ignorelist storage":"Reset the plugin's internal ignorelist storage", - "Invalidate Sub-Zero metadata caches (subliminal)":"Invalidate Sub-Zero metadata caches (subliminal)", - "Reset provider throttle states":"Reset provider throttle states", - "Restarting the plugin":"Restarting the plugin", - "Restart triggered, please wait about 5 seconds":"Restart triggered, please wait about 5 seconds", - "Reset subtitle storage":"Reset subtitle storage", - "Are you sure?":"Are you sure?", - "Are you really sure?":"Are you really sure?", - "Success":"Success", - "Information Storage (%s) reset":"Information Storage (%s) reset", - "Information Storage (%s) logged":"Information Storage (%s) logged", - "FindBetterSubtitles triggered":"FindBetterSubtitles triggered", - "FindBetterSubtitles skipped":"FindBetterSubtitles skipped", - "SubtitleStorageMaintenance triggered":"SubtitleStorageMaintenance triggered", - "MigrateSubtitleStorage triggered":"MigrateSubtitleStorage triggered", - "TriggerCacheMaintenance triggered":"TriggerCacheMaintenance triggered", - "This may take some time ...":"This may take some time ...", - "Download Logs":"Download Logs", - "Sorry, feature unavailable":"Sorry, feature unavailable", - "Universal Plex token not available":"Universal Plex token not available", - "Copy this link and open this in your browser, please":"Copy this link and open this in your browser, please", - "Cache invalidated":"Cache invalidated", - "Enter PIN number ":"Enter PIN number ", - "PIN correct":"PIN correct", - "Reset":"Reset", - "Menu locked":"Menu locked", - "Provider throttles reset":"Provider throttles reset", - "Plex didn't return any information about the item, please refresh it and come back later":"Plex didn't return any information about the item, please refresh it and come back later", - "Item not found: %s!":"Item not found: %s!", - "< Back to %s":"< Back to %s", - "Back to %s > %s":"Back to %s > %s", - "Refresh: %s":"Refresh: %s", - "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk":"Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk", - "the movie":"the movie", - "the series":"the series", - "the episode":"the episode", - "the season":"the season", - "Force-find subtitles: %(item_title)s":"Force-find subtitles: %(item_title)s", - "Issues a forced refresh, ignoring known subtitles and searching for new ones":"Issues a forced refresh, ignoring known subtitles and searching for new ones", - "File %(file_part_index)s: ":"File %(file_part_index)s: ", - "%(part_summary)sNo current subtitle in storage":"%(part_summary)sNo current subtitle in storage", - "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "%(part_summary)sManage %(language)s subtitle":"%(part_summary)sManage %(language)s subtitle", - "%(part_summary)sList %(language)s subtitles":"%(part_summary)sList %(language)s subtitles", - "%(part_summary)sEmbedded subtitles (%(languages)s)":"%(part_summary)sEmbedded subtitles (%(languages)s)", - "Extract and activate embedded subtitle streams":"Extract and activate embedded subtitle streams", - "Select active %(language)s subtitle":"Select active %(language)s subtitle", - "%(count)d subtitles in storage":"%(count)d subtitles in storage", - "List available %(language)s subtitles":"List available %(language)s subtitles", - "Modify current %(language)s subtitle":"Modify current %(language)s subtitle", - "Currently applied mods: %(mod_list)s":"Currently applied mods: %(mod_list)s", - "Blacklist current %(language)s subtitle and search for a new one":"Blacklist current %(language)s subtitle and search for a new one", - "Manage blacklist (%(amount)s contained)":"Manage blacklist (%(amount)s contained)", - "Inspect currently blacklisted subtitles":"Inspect currently blacklisted subtitles", - "%(current_state)s%(subtitle_name)s, Score: %(score)s":"%(current_state)s%(subtitle_name)s, Score: %(score)s", - "Current: ":"Current: ", - "Stored: ":"Stored: ", - "Subtitle saved to disk":"Subtitle saved to disk", - "Remove subtitle from blacklist":"Remove subtitle from blacklist", - "by %(release_group)s":"by %(release_group)s", - "Current: %(provider_name)s (%(score)s) ":"Current: %(provider_name)s (%(score)s) ", - "Search for %(language)s subs (%(video_data)s)":"Search for %(language)s subs (%(video_data)s)", - "%(current_info)sFilename: %(filename)s":"%(current_info)sFilename: %(filename)s", - "No subtitles found":"No subtitles found", - "Searching for %(language)s subs (%(video_data)s), refresh here ...":"Searching for %(language)s subs (%(video_data)s), refresh here ...", - " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)":" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", - " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)":" (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", - "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s":"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", - "Release: %(release_info)s, Matches: %(matches)s":"Release: %(release_info)s, Matches: %(matches)s", - "Downloading subtitle for %(title_or_id)s":"Downloading subtitle for %(title_or_id)s", - "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods", - " (unknown)":" (unknown)", - " (forced)":" (forced)", - "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", - "Extracting of embedded subtitle %s of part %s:%s triggered":"Extracting of embedded subtitle %s of part %s:%s triggered", - "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "Insufficient permissions":"Insufficient permissions", - "Insufficient permissions on library %(title)s, folder: %(path)s":"Insufficient permissions on library %(title)s, folder: %(path)s", - "I'm not enabled!":"I'm not enabled!", - "Please enable me for some of your libraries in your server settings; currently I do nothing":"Please enable me for some of your libraries in your server settings; currently I do nothing", - "Working ... refresh here":"Working ... refresh here", - "Current state: %s; Last state: %s":"Current state: %s; Last state: %s", - "On-deck items":"On-deck items", - "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.", - "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", - "Recently-added items":"Recently-added items", - "Recently played items":"Recently played items", - "Shows the recently added items per section.":"Shows the recently added items per section.", - "Show recently added items with missing subtitles":"Show recently added items with missing subtitles", - "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list":"Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list", - "Browse all items":"Browse all items", - "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.":"Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.", - "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)":"Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", - "Last run: %s; Next scheduled run: %s; Last runtime: %s":"Last run: %s; Next scheduled run: %s; Last runtime: %s", - "Search for missing subtitles (in recently-added items, max-age: %s)":"Search for missing subtitles (in recently-added items, max-age: %s)", - "Automatically run periodically by the scheduler, if configured. %s":"Automatically run periodically by the scheduler, if configured. %s", - "Display ignore list (%(ignored_count)d)":"Display ignore list (%(ignored_count)d)", - "Show the current ignore list (mainly used for the automatic tasks)":"Show the current ignore list (mainly used for the automatic tasks)", - "History":"History", - "Show the last %i downloaded subtitles":"Show the last %i downloaded subtitles", - "Refresh":"Refresh", - "Re-lock menu(s)":"Re-lock menu(s)", - "Enabled the PIN again for menu(s)":"Enabled the PIN again for menu(s)", - "%(throttled_provider)s until %(until_date)s (%(reason)s)":"%(throttled_provider)s until %(until_date)s (%(reason)s)", - "Throttled providers: %s":"Throttled providers: %s", - "Advanced functions":"Advanced functions", - "Use at your own risk":"Use at your own risk", - "Items On Deck":"Items On Deck", - "Recently Played":"Recently Played", - "Items with missing subtitles":"Items with missing subtitles", - "Find recent items with missing subtitles":"Find recent items with missing subtitles", - "Updating, refresh here ...":"Updating, refresh here ...", - "Missing: %s":"Missing: %s", - "Add %(kind)s %(title)s to the ignore list":"Add %(kind)s %(title)s to the ignore list", - "Remove %(kind)s %(title)s from the ignore list":"Remove %(kind)s %(title)s from the ignore list", - "Didn't change the ignore list":"Didn't change the ignore list", - "%(title)s added to the ignore list":"%(title)s added to the ignore list", - "%(title)s removed from the ignore list":"%(title)s removed from the ignore list", - "Sections":"Sections", - "All":"All", - "Ignore %(kind)s \"%(title)s\"":"Ignore %(kind)s \"%(title)s\"", - "Un-ignore %(kind)s \"%(title)s\"":"Un-ignore %(kind)s \"%(title)s\"", - "show":"show", - "movie":"movie", - "Refreshing %(title)s":"Refreshing %(title)s", - "Force-refreshing %(title)s":"Force-refreshing %(title)s", - "Extracting subtitle %(stream_index)s of %(filename)s":"Extracting subtitle %(stream_index)s of %(filename)s", - "<< Back to home":"<< Back to home", - "Extract missing %(language)s embedded subtitles":"Extract missing %(language)s embedded subtitles", - "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications", - "Extract and activate %(language)s embedded subtitles":"Extract and activate %(language)s embedded subtitles", - "Extracts embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts embedded subtitles of all episodes for the current season with all configured default modifications", - "Auto-Find subtitles: %s":"Auto-Find subtitles: %s", - "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered", - "Triggering refresh for %(title)s":"Triggering refresh for %(title)s", - "Triggering forced refresh for %(title)s":"Triggering forced refresh for %(title)s", - "Refresh of item %(item_id)s triggered":"Refresh of item %(item_id)s triggered", - "Forced refresh of item %(item_id)s triggered":"Forced refresh of item %(item_id)s triggered", - "< Back to subtitle options for: %s":"< Back to subtitle options for: %s", - "Remove last applied mod (%s)":"Remove last applied mod (%s)", - "none":"none", - "None":"None", - "Idle":"Idle", - "Manage applied mods":"Manage applied mods", - "Reapply applied mods":"Reapply applied mods", - "Restore original version":"Restore original version", - "< Back to subtitle modification menu":"< Back to subtitle modification menu", - "subs constantly getting faster":"subs constantly getting faster", - "subs constantly getting slower":"subs constantly getting slower", - "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)":"%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", - "< Back to subtitle modifications":"< Back to subtitle modifications", - "Adjust by %(time_and_unit)s":"Adjust by %(time_and_unit)s", - "< Back to unit selection":"< Back to unit selection", - "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "Remove: %(mod_name)s":"Remove: %(mod_name)s", - "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Subtitle download failed (%(item_id)s)", - "Subtitle Language (1)":"Subtitle Language (1)", - "Subtitle Language (2)":"Subtitle Language (2)", - "Subtitle Language (3)":"Subtitle Language (3)", - "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)":"Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)", - "Only download foreign/forced subtitles":"Only download foreign/forced subtitles", - "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)":"Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", - "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)":"Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)", - "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")":"Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")", - "Embedded subtitles: Treat \"Undefined\" (und) as language 1":"Embedded subtitles: Treat \"Undefined\" (und) as language 1", - "I rename my files using":"I rename my files using", - "Retrieve original filename from .file_info/file_info index files (see wiki)":"Retrieve original filename from .file_info/file_info index files (see wiki)", - "Sonarr URL (add URL base if configured)":"Sonarr URL (add URL base if configured)", - "Sonarr API key":"Sonarr API key", - "Radarr URL (add URL base if configured, min. version: 0.2.0.897)":"Radarr URL (add URL base if configured, min. version: 0.2.0.897)", - "Radarr API key":"Radarr API key", - "Provider: Enable OpenSubtitles":"Provider: Enable OpenSubtitles", - "Opensubtitles Username":"Opensubtitles Username", - "Opensubtitles Password":"Opensubtitles Password", - "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)":"OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)", - "Provider: Enable Podnapisi.NET":"Provider: Enable Podnapisi.NET", - "Provider: Enable Titlovi.com":"Provider: Enable Titlovi.com", - "Provider: Enable Addic7ed":"Provider: Enable Addic7ed", - "Addic7ed Username":"Addic7ed Username", - "Addic7ed Password":"Addic7ed Password", - "Addic7ed: boost score (if requirements met)":"Addic7ed: boost score (if requirements met)", - "Addic7ed: Use random user agents":"Addic7ed: Use random user agents", - "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)":"Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", - "Legendas TV Username":"Legendas TV Username", - "Legendas TV Password":"Legendas TV Password", - "Provider: Enable TVsubtitles.net":"Provider: Enable TVsubtitles.net", - "Provider: Enable NapiProjekt.pl (Polish)":"Provider: Enable NapiProjekt.pl (Polish)", - "Provider: Enable SubScene (TV shows)":"Provider: Enable SubScene (TV shows)", - "Provider: Enable hosszupuskasub.com (Hungarian)":"Provider: Enable hosszupuskasub.com (Hungarian)", - "Provider: Enable aRGENTeaM (Spanish)":"Provider: Enable aRGENTeaM (Spanish)", - "Search enabled providers simultaneously (multithreading)":"Search enabled providers simultaneously (multithreading)", - "Automatically extract and use embedded subtitles upon media addition (with configured default mods)":"Automatically extract and use embedded subtitles upon media addition (with configured default mods)", - "After automatic extraction of embedded subtitles, also immediately search for available subtitles?":"After automatic extraction of embedded subtitles, also immediately search for available subtitles?", - "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?":"Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?", - "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?":"Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?", - "How strict should these subtitles existing on the filesystem be detected?":"How strict should these subtitles existing on the filesystem be detected?", - "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?":"Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?", - "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)":"Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)", - "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)":"Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)", - "Download hearing impaired subtitles.":"Download hearing impaired subtitles.", - "Remove Hearing Impaired tags from downloaded subtitles":"Remove Hearing Impaired tags from downloaded subtitles", - "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)":"Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)", - "Fix common issues in subtitles":"Fix common issues in subtitles", - "Fix common OCR errors in downloaded subtitles":"Fix common OCR errors in downloaded subtitles", - "Reverse punctuation in RTL languages (heb)":"Reverse punctuation in RTL languages (heb)", - "Change colors of subtitles to":"Change colors of subtitles to", - "Store subtitles next to media files (instead of metadata)":"Store subtitles next to media files (instead of metadata)", - "Subtitle formats to save (non-SRT only works if the previous option is enabled)":"Subtitle formats to save (non-SRT only works if the previous option is enabled)", - "Subtitle Folder (\"current folder\" is the folder the current media file lives in)":"Subtitle Folder (\"current folder\" is the folder the current media file lives in)", - "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)":"Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)", - "Fall back to metadata storage if filesystem storage failed":"Fall back to metadata storage if filesystem storage failed", - "Set subtitle file permissions to (integer, e.g.: 0775)":"Set subtitle file permissions to (integer, e.g.: 0775)", - "Automatically delete leftover/unused (externally saved) subtitles":"Automatically delete leftover/unused (externally saved) subtitles", - "On media playback: search for missing subtitles (refresh item)":"On media playback: search for missing subtitles (refresh item)", - "Scheduler: Periodically search for recent items with missing subtitles":"Scheduler: Periodically search for recent items with missing subtitles", - "Scheduler: Item age to be considered recent":"Scheduler: Item age to be considered recent", - "Scheduler: Recent items to consider per library":"Scheduler: Recent items to consider per library", - "Scheduler: Periodically search for better subtitles":"Scheduler: Periodically search for better subtitles", - "Scheduler: Days to search for better subtitles (max: 30 days)":"Scheduler: Days to search for better subtitles (max: 30 days)", - "Scheduler: Don't search for better subtitles if the item's air date is older than":"Scheduler: Don't search for better subtitles if the item's air date is older than", - "Scheduler: Overwrite manually selected subtitles when better found":"Scheduler: Overwrite manually selected subtitles when better found", - "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found":"Scheduler: Overwrite subtitles with non-default subtitle modifications when better found", - "History: amount of items to store historical data for":"History: amount of items to store historical data for", - "How many download tries per subtitle (on timeout or error)":"How many download tries per subtitle (on timeout or error)", - "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)":"Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)", - "Ignore anything in the following paths (comma-separated)":"Ignore anything in the following paths (comma-separated)", - "Sub-Zero mode":"Sub-Zero mode", - "Access PIN (any amount of numbers, 0-9)":"Access PIN (any amount of numbers, 0-9)", - "Access PIN valid for minutes":"Access PIN valid for minutes", - "Use PIN to restrict access to (needs plugin or PMS restart)":"Use PIN to restrict access to (needs plugin or PMS restart)", - "Call this executable upon successful subtitle download (see Wiki for details)":"Call this executable upon successful subtitle download (see Wiki for details)", - "Check for correct folder permissions of every library on plugin start":"Check for correct folder permissions of every library on plugin start", - "Use new style caching (for subliminal)":"Use new style caching (for subliminal)", - "Low impact mode (for remote filesystems)":"Low impact mode (for remote filesystems)", - "Timeout for API requests sent to the PMS":"Timeout for API requests sent to the PMS", - "HTTP proxy to use for providers (supports credentials)":"HTTP proxy to use for providers (supports credentials)", - "How verbose should the logging be?":"How verbose should the logging be?", - "How many log backups to keep?":"How many log backups to keep?", - "Log subtitle modification (debug)":"Log subtitle modification (debug)", - "Log to console (for development/debugging)":"Log to console (for development/debugging)", - "Collect anonymous usage statistics":"Collect anonymous usage statistics", - "Sonarr/Radarr (fill api info below)":"Sonarr/Radarr (fill api info below)", - "Filebot":"Filebot", - "Sonarr/Radarr/Filebot":"Sonarr/Radarr/Filebot", - "Symlink to original file":"Symlink to original file", - "I keep the original filenames":"I keep the original filenames", - "none of the above":"none of the above", - "exact: media filename match":"exact: media filename match", - "loose: filename contains media filename":"loose: filename contains media filename", - "any":"any", - "prefer":"prefer", - "don't prefer":"don't prefer", - "force HI":"force HI", - "force non-HI":"force non-HI", - "don't change":"don't change", - "white":"white", - "light-grey":"light-grey", - "red":"red", - "green":"green", - "yellow":"yellow", - "blue":"blue", - "magenta":"magenta", - "cyan":"cyan", - "black":"black", - "dark-red":"dark-red", - "dark-green":"dark-green", - "dark-yellow":"dark-yellow", - "dark-blue":"dark-blue", - "dark-magenta":"dark-magenta", - "dark-cyan":"dark-cyan", - "dark-grey":"dark-grey", - "current folder":"current folder", - "never":"never", - "current media item":"current media item", - "next episode (series)":"next episode (series)", - "hybrid: current item or next episode":"hybrid: current item or next episode", - "hybrid-plus: current item and next episode":"hybrid-plus: current item and next episode", - "every 6 hours":"every 6 hours", - "every 12 hours":"every 12 hours", - "every 24 hours":"every 24 hours", - "1 days":"1 days", - "2 days":"2 days", - "3 days":"3 days", - "4 days":"4 days", - "1 weeks":"1 weeks", - "2 weeks":"2 weeks", - "3 weeks":"3 weeks", - "4 weeks":"4 weeks", - "5 weeks":"5 weeks", - "6 weeks":"6 weeks", - "12 weeks":"12 weeks", - "don't limit":"don't limit", - "1 year":"1 year", - "2 years":"2 years", - "3 years":"3 years", - "4 years":"4 years", - "5 years":"5 years", - "6 years":"6 years", - "7 years":"7 years", - "8 years":"8 years", - "9 years":"9 years", - "10 years":"10 years", - "agent + interface":"agent + interface", - "only agent":"only agent", - "only interface":"only interface", - "disabled":"disabled", - "interface":"interface", - "advanced menu":"advanced menu", - "CRITICAL":"CRITICAL", - "ERROR":"ERROR", - "WARNING":"WARNING", - "INFO":"INFO", - "DEBUG":"DEBUG", - "Change the color of the subtitle":"Change the color of the subtitle", - "Adds the requested color to every line of the subtitle. Support depends on player.":"Adds the requested color to every line of the subtitle. Support depends on player.", - "Basic common fixes":"Basic common fixes", - "Fix common and whitespace/punctuation issues in subtitles":"Fix common and whitespace/punctuation issues in subtitles", - "Remove all style tags":"Remove all style tags", - "Removes all possible style tags from the subtitle, such as font, bold, color etc.":"Removes all possible style tags from the subtitle, such as font, bold, color etc.", - "Reverse punctuation in RTL languages":"Reverse punctuation in RTL languages", - "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew":"Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew", - "Change the FPS of the subtitle":"Change the FPS of the subtitle", - "Re-syncs the subtitle to the framerate of the current media file.":"Re-syncs the subtitle to the framerate of the current media file.", - "Remove Hearing Impaired tags":"Remove Hearing Impaired tags", - "Removes tags, text and characters from subtitles that are meant for hearing impaired people":"Removes tags, text and characters from subtitles that are meant for hearing impaired people", - "Fix common OCR issues":"Fix common OCR issues", - "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR":"Fix issues that happen when a subtitle gets converted from bitmap to text through OCR", - "Change the timing of the subtitle":"Change the timing of the subtitle", - "Adds or substracts a certain amount of time from the whole subtitle to match your media":"Adds or substracts a certain amount of time from the whole subtitle to match your media", - "Available":"Available", - "Current":"Current", - "Custom path to advanced_settings.json":"Custom path to advanced_settings.json" -} + "sq": "Albanees", + "ar": "Arabisch", + "be": "Wit-Russisch", + "bs": "Bosnisch", + "bg": "Bulgaars", + "ca": "Catalaans\n", + "zh": "Chinees", + "hr": "Kroatisch", + "cs": "Czech", + "da": "Deens", + "nl": "Nederlands", + "en": "Engels", + "et": "Estlands", + "fa": "Perzisch (Farsi)", + "fi": "Fins", + "fr": "Frans", + "de": "Duits", + "el": "Grieks", + "he": "Hebreeuws", + "hi": "Hindi", + "hu": "Hongaars", + "is": "IJslands", + "id": "Indonesisch", + "it": "Italiaans", + "ja": "Japanees", + "ko": "Koreaans", + "lv": "Lets", + "lt": "Litouws", + "mk": "Macedonisch", + "ms": "Maleis", + "no": "Noors", + "pl": "Pools", + "pt": "Portugees", + "pt-br": "Portugees (Braziliaans)", + "ro": "Roemeens", + "ru": "Russisch", + "sr": "Servisch", + "sr-cyrl": "Servisch (Cyrillisch)", + "sr-latn": "Servisch (Latijns)", + "sk": "Slowaaks", + "sl": "Sloveens", + "es": "Spaans", + "sv": "Zweeds", + "th": "Thais", + "tr": "Turks", + "uk": "Oekraïens", + "vi": "Vietnamees", + "Internal stuff, pay attention!": "Interne dingen, Opletten!", + "Advanced": "Geavanceerd", + "advanced": "geavanceerd", + "Enter PIN": "PIN invoeren", + "The owner has restricted the access to this menu. Please enter the correct pin": "De eigenaar heeft de toegang beperkt tot dit menu. Vul a.u.b. de correcte PIN in.", + "Restart the plugin": "Herstart de plugin", + "Get my logs (copy the appearing link and open it in your browser, please)": "Haal mijn logs op (kopieer de link en open deze in je browser, a.u.b.)", + "Copy the appearing link and open it in your browser, please": "kopieer de link en open deze in je browser, a.u.b.", + "Trigger find better subtitles": "Activeer zoek betere ondertiteling", + "Skip next find better subtitles (sets last run to now)": "Sla volgende zoek beter ondertiteling over (stelt de laatste uitvoering op nu)", + "Trigger subtitle storage maintenance": "Activeer ondertiteling opslag onderhoud", + "Trigger subtitle storage migration (expensive)": "Activeer ondertiteling opslag migratie (zwaar)", + "Trigger cache maintenance (refiners, providers and packs/archives)": "Activeer Cache onderhoud (filters, providers en packs/archieven)", + "Apply configured default subtitle mods to all (active) stored subtitles": "Pas geconfigureerde standaard ondertiteling modificaties toe op alle (actieve) opgeslagen ondertiteling", + "Re-Apply mods of all stored subtitles": "Pas modificaties op alle opgeslagen ondertiteling opnieuw toe", + "Log the plugin's scheduled tasks state storage": "Log de plugin's geplande takenstaat opslag", + "Log the plugin's internal ignorelist storage": "Log de plugin's interne negeerlijst opslag", + "Log the plugin's complete state storage": "Log de plugin's compleetstaat opslag", + "Reset the plugin's scheduled tasks state storage": "Reset de plugin's geplande takenstaat opslag", + "Reset the plugin's internal ignorelist storage": "Reset de plugin's interne negeerlijst opslag", + "Invalidate Sub-Zero metadata caches (subliminal)": "Invalideer Sub-Zero metadata caches (subliminal)", + "Reset provider throttle states": "Reset provider pauze staten", + "Restarting the plugin": "Plugin herstarten", + "Restart triggered, please wait about 5 seconds": "Herstart geactiveerd, wacht a.u.b. ongeveer 5 seconden", + "Reset subtitle storage": "Reset ondertiteling opslag", + "Are you sure?": "Weet je het zeker?", + "Are you really sure?": "Weet je het heel zeker?", + "Success": "Succes", + "FindBetterSubtitles triggered": "ZoekBetereOndertiteling geactiveerd", + "FindBetterSubtitles skipped": "ZoekBetereOndertiteling overgeslagen", + "SubtitleStorageMaintenance triggered": "OndertitelingOpslagOnderhoud geactiveerd", + "MigrateSubtitleStorage triggered": "MigreerOndertitelingOpslag geactiveerd", + "TriggerCacheMaintenance triggered": "CacheOnderhoud geactiveerd", + "This may take some time ...": "Dit kan een tijd duren...", + "Download Logs": "Download Logs", + "Sorry, feature unavailable": "Sorry, eigenschap is niet beschikbaar", + "Universal Plex token not available": "Universele Plex token niet beschikbaar", + "Copy this link and open this in your browser, please": "Kopieer deze link en open deze in je browser, a.u.b.", + "Cache invalidated": "Cache is geinvalideerd", + "Enter PIN number ": "Voer PIN nummer in ", + "PIN correct": "PIN is correct", + "Reset": "Reset", + "Menu locked": "Menu geblokeerd", + "Provider throttles reset": "Provider pauzes reset", + "Information Storage (%s) reset": "Informatie opslag (%s) gereset", + "Information Storage (%s) logged": "Informatie opslag (%s) geregistreerd", + "Plex didn't return any information about the item, please refresh it and come back later": "Plex heeft geen informatie over het item gegeven, ververs a.u.b. het item en kom later terug", + "Item not found: %s!": "Item niet gevonden: %s!", + "< Back to %s": "< Terug naar %s", + "Back to %s > %s": "Terug naar %s > %s", + "Refresh: %s": "Ververs: %s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Voert een geforceerde vernieuwing uit, negeert bekende ondertiteling en zoekt naar nieuwe", + "Extract and activate embedded subtitle streams": "Geëmbedde ondertiteling streams extraheren en activeren", + "Inspect currently blacklisted subtitles": "Inspecteer de ondertiteling op de zwarte lijst", + "Subtitle saved to disk": "Ondertitel opgeslagen op schijf", + "Remove subtitle from blacklist": "Verwijder ondertitel van zwarte lijst", + "No subtitles found": "Geen ondertiteling gevonden", + " (unknown)": " (onbekend)", + " (forced)": " (geforceerd)", + "Extracting of embedded subtitle %s of part %s:%s triggered": "Extraheren van geëmbedde ondertitel %s van deel %s:%s geactiveerd", + "Insufficient permissions": "Niet genoeg rechten", + "I'm not enabled!": "Ik ben niet ingeschakeld!", + "Please enable me for some of your libraries in your server settings; currently I do nothing": "Schakel me alstublieft in voor enkele van uw bibliotheken in uw serverinstellingen; momenteel doe ik niets", + "Working ... refresh here": "Bezig... ververs hier", + "Current state: %s; Last state: %s": "Huidige staat: %s, Laatste staat: %s", + "On-deck items": "On-deck items", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "Toont de %s recentelijk afgespeelde items en stelt je instaat om hiervan de metadata/ondertiteling individueel (geforceerd) te verversen", + "Recently-added items": "Recentelijk toegevoegde items", + "Recently played items": "Recentelijk afgespeelde items", + "Shows the recently added items per section.": "Toont de recentelijk toegevoegde items per sectie", + "Show recently added items with missing subtitles": "Laat de recentelijk toegevoegde items met missende ondertiteling zien", + "Browse all items": "Blader door alle items", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Ga door je hele bibliotheek heen en beheer je negeerlijst. Je kan ook de metadata/ondertiteling van individuele items (geforceerd) verversen.", + "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Laatste uitvoering: %s; Volgend geplande uitvoering: %s; Laatste uitvoeringstijd: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)": "Zoek naar missende ondertiteling (in recentelijk toegevoegde items, maximale leeftijd: %s)", + "Automatically run periodically by the scheduler, if configured. %s": "Voer automatisch periodiek uit door de taakplanner, indien ingesteld. %s", + "Show the current ignore list (mainly used for the automatic tasks)": "Laat de huidige negeerlijst zien (hoofdzakelijk gebruikt voor automatische taken)", + "History": "Geschiedenis", + "Show the last %i downloaded subtitles": "Laat de laatste %i gedownloade ondertiteling zien", + "Refresh": "Ververs", + "Re-lock menu(s)": "Her-blokkeer menu('s)", + "Enabled the PIN again for menu(s)": "PIN opnieuw ingeschakeld voor menu('s)", + "Throttled providers: %s": "Gepauzeerde providers: %s", + "Advanced functions": "Geavanceerde functies", + "Use at your own risk": "Gebruik op eigen risico", + "Items On Deck": "Items On-deck", + "Recently Played": "Recentelijk afgespeeld", + "Items with missing subtitles": "Items met missende ondertiteling", + "Find recent items with missing subtitles": "Zoek recente items met missende ondertiteling", + "Updating, refresh here ...": "Updaten, ververs hier...", + "Missing: %s": "Missend: %s", + "Didn't change the ignore list": "De negeerlijst is niet gewijzigd", + "Sections": "Secties", + "All": "Alles", + "show": "serie", + "movie": "film", + "<< Back to home": "<< Terug naar start", + "Auto-Find subtitles: %s": "Auto-Vind ondertiteling: %s", + "Extracting of embedded subtitles for %s triggered": "Extraheren van geëmbedde ondertiteling voor %s is geactiveerd", + "< Back to subtitle options for: %s": "< Teug naar ondertitel opties voor: %s", + "Remove last applied mod (%s)": "Verwijder laatst toegepaste modificatie (%s)", + "none": "geen", + "Manage applied mods": "Beheer toegepaste modificaties", + "Reapply applied mods": "Opnieuw toepassen van toegepaste modificaties", + "Restore original version": "Herstel originele versie", + "< Back to subtitle modification menu": "< Terug naar ondertitel modificatie menu", + "subs constantly getting faster": "ondertiteling wordt constant sneller", + "subs constantly getting slower": "ondertiteling wordt constant langzamer", + "< Back to subtitle modifications": "< Terug naar ondertitel modificaties", + "< Back to unit selection": "< Terug naar eenheid selectie", + "Subtitle Language (1)": "Ondertitel taal (1)", + "Subtitle Language (2)": "Ondertitel taal (2)", + "Subtitle Language (3)": "Ondertitel taal (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "Additionele ondertitel talen (gebruik ISO-639-1 codes; komma-gescheiden)", + "Only download foreign/forced subtitles": "Download enkel ondertiteling voor buitenlands gesproken delen (forced)", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Geef talen weer met landattribuut als ISO 639-1 (bijvoorbeeld pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Behandel talen met landattribuut als ISO 639-1 (bijvoorbeeld download geen pt-BR als pt ondertitel bestaat)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Beperken tot één taal (slaat het toevoegen van \".lang.\" aan de ondertitel bestandsnaam over, gebruikt alleen \"Ondertitel taal (1)\")", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Geëmbedde ondertiteling: Behandel \"Ongedefineerd\" (und) als \"Ondertitel taal (1)\"", + "I rename my files using": "Ik hernoem mijn bestanden met", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "Oorspronkelijke bestandsnaam ophalen uit .file_info / file_info indexbestanden (zie wiki)", + "Sonarr URL (add URL base if configured)": "Sonarr URL (voeg URL-basis toe indien geconfigureerd)", + "Sonarr API key": "Sonarr API sleutel", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "Radarr URL (voeg URL-basis toe indien geconfigureerd, minimaal benodigde versie:0.2.0.897)", + "Radarr API key": "Radarr API sleutel", + "Provider: Enable OpenSubtitles": "Provider: Opensubtitles inschakelen", + "Opensubtitles Username": "Opensubtitles gebruikersnaam", + "Opensubtitles Password": "Opensubtitles wachtwoord", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "OpenSubtitles VIP? (reclame vrije ondertiteling, 1000 ondertitels/dag, geen-cache, VIP server: http://v.ht/osvip) ", + "Provider: Enable Podnapisi.NET": "Provider: Podnapisi.NET inschakelen", + "Provider: Enable Titlovi.com": "Provider:Titlovi.com inschakelen", + "Provider: Enable Addic7ed": "Provider: Addic7ed inschakelen", + "Addic7ed Username": "Addic7ed gebruikersnaam", + "Addic7ed Password": "Addic7ed wachtwoord", + "Addic7ed: boost score (if requirements met)": "Addic7ed: verhoog score (indien aan eisen wordt voldaan)", + "Addic7ed: Use random user agents": "Addic7ed: gebruik willekeurige user-agents", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "Provider: Legendas TV inschakelen (meestal pt-BR; UNRAR NODIG)", + "Legendas TV Username": "Legendas TV gebruikersnaam", + "Legendas TV Password": "Legendas TV wachtwoord", + "Provider: Enable TVsubtitles.net": "Provider: Tvsubtitles.net inschakelen", + "Provider: Enable NapiProjekt.pl (Polish)": "Provider: NapiProjekt.pl inschakelen (Pools)", + "Provider: Enable SubScene (TV shows)": "Provider: SubScene inschakelen (TV series)", + "Provider: Enable hosszupuskasub.com (Hungarian)": "Provider: hosszupuskasub.com inschakelen (Hongaars)", + "Provider: Enable aRGENTeaM (Spanish)": "Provider: aRGENTeaM inschakelen (Spaans)", + "Search enabled providers simultaneously (multithreading)": "Zoek gelijkertijd bij ingeschakelde providers (multithreading)", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Extraheer en gebruik geëmbedde ondertiteling automatisch bij media toevoeging (met geconfigureerde standaard modificaties)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "Na het automatisch extraheren van geëmbedde ondertiteling, ook gelijk zoeken naar beschikbare ondertiteling?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "Niet zoeken naar ondertiteling van een taal als er al geëmbedde ondertiteling bestaat in het media bestand (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "Niet zoeken naar ondertiteling van een taal als er ondertiteling bestaat op het bestandssysteem (metadata/bestandssysteem)?", + "How strict should these subtitles existing on the filesystem be detected?": "Hoe strikt moet deze ondertiteling op het bestandssysteem worden gedetecteerd?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "Gebruik niet-tekst ondertiteling formaten (iets anders dan .srt / .ssa / .ass / .vtt; geëmbed of extern) in het bovenstaande?", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "Minimale score voor TV (minimaal: 240, verstandig: 337, minimaal ideaal: 352; zie http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "Minimale score voor films (minimaal: 60, verstandig: 69, minimaal ideaal: 82; zie http://v.ht/szscores)", + "Download hearing impaired subtitles.": "Download ondertiteling voor slechthorende", + "Remove Hearing Impaired tags from downloaded subtitles": "Verwijder slecthorende-tags uit ondertiteling", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Verwijder stijl-tags uit de ondertiteling (dik gedrukt, schuin, onderlijnt, kleuren, ...)", + "Fix common issues in subtitles": "Repareer veel voorkomende fouten in ondertiteling", + "Fix common OCR errors in downloaded subtitles": "Repareer veel voorkomende OCR fouten om gedownloade ondertiteling", + "Reverse punctuation in RTL languages (heb)": "Draai leestekens in RTL (rechts naar links) talen om (Hebreeuws)", + "Change colors of subtitles to": "Wijzig kleur van ondertiteling naar", + "Store subtitles next to media files (instead of metadata)": "Sla ondertiteling naast de media bestanden op (in plaats van in de metadata)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Ondertiteling formaten om op te slaan (niet-SRT werkt alleen als de vorige optie is ingeschakeld)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "Ondertiteling map (\"huidige map\" is de map waar de huidige media is opgelsagen)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "Aangepaste ondertiteling map (overschrijft de \"Ondertiteling map\"; gebruikt echte paden)", + "Fall back to metadata storage if filesystem storage failed": "Val terug naar metadata opslag indien het bestandssysteem faalt", + "Set subtitle file permissions to (integer, e.g.: 0775)": "Stel rechten voor ondertitel bestanden in (geheel getal, bijv .: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles": "Verwijder automatisch achtergebleven/ongebruikte (extern opgeslagen) ondertiteling", + "On media playback: search for missing subtitles (refresh item)": "Bij media afspelen: zoek naar missende ondertiteling (ververs item)", + "Scheduler: Periodically search for recent items with missing subtitles": "Taakplanner: Zoek periodiek naar recente items met missende ondertiteling", + "Scheduler: Item age to be considered recent": "Taakplanner: Item leeftijd die als recent moet worden beschouwd", + "Scheduler: Recent items to consider per library": "Taakplanner: Recente items om te overwegen per bibliotheek", + "Scheduler: Periodically search for better subtitles": "Taakplanner: Zoek periodiek naar betere ondertiteling", + "Scheduler: Days to search for better subtitles (max: 30 days)": "Taakplanner: Dagen om te zoeken naar betere ondertiteling (maximaal 30 dagen)", + "Scheduler: Don't search for better subtitles if the item's air date is older than": "Taakplanner: Niet zoeken naar betere ondertiteling als de uitzenddatum ouder is dan", + "Scheduler: Overwrite manually selected subtitles when better found": "Taakplanner: Overschrijf handmatig geselecteerde ondertiteling als betere ondertiteling is gevonden", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Taakplanner: Overschrijf ondertiteling met niet-standaard ondertitel modificaties als betere ondertiteling is gevonden", + "History: amount of items to store historical data for": "Geschiedenis: aantal items om historische gegevens voor op te slaan", + "How many download tries per subtitle (on timeout or error)": "Hoeveel download pogingen per ondertitel (bij time-out of fout)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "Negeer mappen (met \"subzero.ignore/.subzero.ignore/.nosz\" bestanden in de mappen)", + "Ignore anything in the following paths (comma-separated)": "Negeer alles in de volgende paden (komma-gescheiden)", + "Sub-Zero mode": "Sub-Zero modus", + "Access PIN (any amount of numbers, 0-9)": "ToegangsPIN (elk aantal cijfers, 0-9)", + "Access PIN valid for minutes": "ToegangsPIN geldig voor minuten", + "Use PIN to restrict access to (needs plugin or PMS restart)": "Gebruik PIN om toegang te beperken tot (hiervoor moet de plugin of PMS worden herstart)", + "Call this executable upon successful subtitle download (see Wiki for details)": "Voer dit uitvoerbare bestand uit na succesvolle ondertitel download (zie Wiki voor details)", + "Check for correct folder permissions of every library on plugin start": "Controleer op juiste map rechten van elke bibliotheek bij het starten van de plugin", + "Use new style caching (for subliminal)": "Gebruik nieuwe manier van caching (voor subliminal)", + "Low impact mode (for remote filesystems)": "Lage impact modus (voor externe bestandssystemen)", + "Timeout for API requests sent to the PMS": "Time-out voor API-aanvragen die naar PMS worden verzonden", + "HTTP proxy to use for providers (supports credentials)": "HTTP proxy om te gebruiken voor providers (ondersteunt inloggegevens)", + "How verbose should the logging be?": "Hoe uitgebreid moet de logging zijn?", + "How many log backups to keep?": "Hoeveel log bestanden moeten worden bewaard?", + "Log subtitle modification (debug)": "Log ondertitel modificatie (debug)", + "Log to console (for development/debugging)": "Log naar console (voor ontwikkeling/debugging)", + "Collect anonymous usage statistics": "Verzamel anonieme gebruiksstatistieken", + "Sonarr/Radarr (fill api info below)": "Sonarr/Radarr (vul API informatie hieronder in)", + "Filebot": "Filebot", + "Sonarr/Radarr/Filebot": "Sonarr/Radarr/Filebot ", + "Symlink to original file": "Symlink naar origineel bestand", + "I keep the original filenames": "Ik bewaar de originele bestandsnamen", + "none of the above": "geen van de bovenstaande", + "exact: media filename match": "Precies: media bestandsnaam overeenkomst", + "loose: filename contains media filename": "Los: Bestandsnaam bevat media bestandsnaam", + "any": "elk", + "prefer": "prefereren", + "don't prefer": "niet refereren", + "force HI": "forceer slechthorend", + "force non-HI": "forceer niet slechthorend", + "don't change": "niet wijzigen", + "white": "wit", + "light-grey": "licht grijs", + "red": "rood", + "green": "groen", + "yellow": "geel", + "blue": "blauw", + "magenta": "magenta", + "cyan": "cyaan", + "black": "zwart", + "dark-red": "donker rood", + "dark-green": "donker groen", + "dark-yellow": "donker geel", + "dark-blue": "donker blauw", + "dark-magenta": "donker magenta", + "dark-cyan": "donker cyaan", + "dark-grey": "donker grijs", + "current folder": "huidige map", + "never": "nooit", + "current media item": "huidig media item", + "next episode (series)": "volgende aflevering (series)", + "hybrid: current item or next episode": "Hybride: huidig item of volgende aflevering", + "hybrid-plus: current item and next episode": "Hybride-plus: huidig item en volgende aflevering", + "every 6 hours": "elke 6 uur", + "every 12 hours": "elke 12 uur", + "every 24 hours": "elk 24 uur", + "1 days": "1 dag", + "2 days": "2 dagen", + "3 days": "3 dagen", + "4 days": "4 dagen", + "1 weeks": "1 week", + "2 weeks": "2 weken", + "3 weeks": "3 weken", + "4 weeks": "4 weken", + "5 weeks": "5 weken", + "6 weeks": "6 weken", + "12 weeks": "12 weken", + "don't limit": "niet limiteren", + "1 year": "1 jaar", + "2 years": "2 jaar", + "3 years": "3 jaar", + "4 years": "4 jaar", + "5 years": "5 jaar", + "6 years": "6 jaar", + "7 years": "7 jaar", + "8 years": "8 jaar", + "9 years": "9 jaar", + "10 years": "10 jaar", + "only agent": "enkel agent", + "disabled": "uitgeschakeld", + "advanced menu": "geavanceerd menu", + "CRITICAL": "KRITISCH", + "ERROR": "ERROR", + "WARNING": "WAARSCHUWING", + "INFO": "INFO", + "DEBUG": "DEBUG", + "Force-find subtitles: %(item_title)s": "Geforceerd ondertiteling zoeken: %(item_title)s", + "File %(file_part_index)s: ": "Bestand %(file_part_index)s: ", + "%(part_summary)sNo current subtitle in storage": "%(part_summary)sGeen huidige ondertitel gevonden in opslag", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sHuidige ondertitel: %(provider_name)s (toegevoegd: %(date_added)s, %(mode)s), Taal: %(language)s, Score: %(score)i, Opslag: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)sBeheer %(language)se ondertitel", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)s %(language)se ondertiteling weergeven", + "%(part_summary)sEmbedded subtitles (%(languages)s)": " %(part_summary)sGeëmbedde ondertiteling (%(languages)s) ", + "Select active %(language)s subtitle": "Selecteer actieve %(language)se ondertitel", + "%(count)d subtitles in storage": "%(count)d ondertitels gevonden in opslag", + "List available %(language)s subtitles": "Beschikbare %(language)se ondertiteling weergeven", + "Modify current %(language)s subtitle": "Wijzig huidige %(language)se ondertitel", + "Currently applied mods: %(mod_list)s": "Huidig toegepaste modificaties: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one": "Zet de huidige %(language)se ondertitel op de zwarte lijst en zoek naar nieuwe", + "Manage blacklist (%(amount)s contained)": "Beheer de zwarte lijst (bevat er %(amount)s)", + "%(current_state)s%(subtitle_name)s, Score: %(score)s": "%(current_state)s%(subtitle_name)s, Score: %(score)s", + "Current: ": "Huidig: ", + "Stored: ": "Opgeslagen: ", + "by %(release_group)s": " door %(release_group)s ", + "Current: %(provider_name)s (%(score)s) ": "Huidig: %(provider_name)s (%(score)s) ", + "Search for %(language)s subs (%(video_data)s)": "Zoek naar %(language)se ondertiteling (%(video_data)s)", + "%(current_info)sFilename: %(filename)s": "%(current_info)sBestandsnaam: %(filename)s", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "Zoeken naar %(language)se ondertiteling (%(video_data)s), ververs hier", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": " (verkeerde FPS, ondertitel: %(subtitle_fps)s, media: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": " (verkeerde FPS, ondertitel: %(subtitle_fps)s, media: onbekend, lage impact modus)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s": "Uitgave: %(release_info)s, Overeenkomst: %(matches)s", + "Downloading subtitle for %(title_or_id)s": "Ondertitel downloaden voor %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Extraheer stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s met standaard modificaties", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "Extraheer stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (Toegevoegd: %(date_added)s, %(mode)s), Taal: %(language)s, Score: %(score)i, Opslag: %(storage_type)s", + "Insufficient permissions on library %(title)s, folder: %(path)s": "Niet genoeg rechten op bibliotheek %(title)s, map: %(path)s", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Uitvoeren: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Display ignore list (%(ignored_count)d)": "Negeerlijst weergeven (%(ignored_count)d)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s tot %(until_date)s (%(reason)s)", + "Extracting subtitle %(stream_index)s of %(filename)s": "Extraheren van ondertitel %(stream_index)s van %(filename)s", + "Extract missing %(language)s embedded subtitles": "Extraheer missende %(language)s geëmbedde ondertiteling", + "Extract and activate %(language)s embedded subtitles": "Extraheer en activeer %(language)s geëmbedde ondertiteling", + "None": "Geen", + "Idle": "Idle", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "Adjust by %(time_and_unit)s": "Aanpassen met %(time_and_unit)s", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "Toegevoegd: %(date_added)s, %(mode)s, Taal: %(language)s, Score: %(score)i, Opslag: %(storage_type)s", + "Remove: %(mod_name)s": "Verwijder: %(mod_name)s ", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Downloaden van ondertitel mislukt (%(item_id)s)", + "agent + interface": "agent + interface", + "only interface": "enkel de interface", + "interface": "interface", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "Toont de huidige on-deck items en stelt je instaat om hiervan de metadata/ondertiteling individueel (geforceerd) te verversen", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "Items met missende ondertiteling weergeven. Klik op \"Zoek recente items met missende ondertiteling\" om de lijst te updaten", + "Add %(kind)s %(title)s to the ignore list": "Voeg %(kind)s %(title)s toe aan negeerlijst", + "Remove %(kind)s %(title)s from the ignore list": "Verwijder %(kind)s %(title)s van negeerlijst", + "%(title)s added to the ignore list": "%(title)s toegevoegd aan negeerlijst", + "%(title)s removed from the ignore list": "%(title)s verwijderd van negeerlijst", + "Triggering refresh for %(title)s": "Activeer een verversing voor %(title)s", + "Triggering forced refresh for %(title)s": "Activeer een geforceerde verversing voor %(title)s", + "Refresh of item %(item_id)s triggered": "Verversing van item %(item_id)s geactiveerd", + "Forced refresh of item %(item_id)s triggered": "Geforceerde verversing van item %(item_id)s geactiveerd", + "Ignore %(kind)s \"%(title)s\"": "Negeer %(kind)s \"%(title)s\" ", + "Un-ignore %(kind)s \"%(title)s\"": "%(kind)s \"%(title)s\" niet meer negeren", + "Refreshing %(title)s": "%(title)s aan het verversen", + "Force-refreshing %(title)s": "%(title)s aan het geforceerd verversen", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Extraheert de nog niet geëxtraheerde geëmbedde ondertiteling van alle afleveringen voor het huidige seizoen met alle geconfigureerde standaard modificaties", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "Extraheert geëmbedde ondertiteling van alle afleveringen voor het huidig seizoen met alle geconfigureerde standaard modificaties", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Ververst %(the_movie_series_season_episode)s, mogelijk zoeken naar missende ondertiteling en nieuwe ondertiteling op schijf", + "the movie": "de film", + "the series": "de serie", + "the episode": "de aflevering", + "the season": "het zeizoen", + "Change the color of the subtitle": "Wijzig de kleur van de ondertiteling", + "Adds the requested color to every line of the subtitle. Support depends on player.": "Voegt de ingestelde kleur toe aan elke regel van de ondertiteling. Ondersteuning is afhankelijk van de speler.", + "Basic common fixes": "Basis veel voorkomende reparaties", + "Fix common and whitespace/punctuation issues in subtitles": "Repareer veel voorkomende en wit ruimte/leestekens fouten in ondertiteling", + "Remove all style tags": "Verwijder alle stijl-tags", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.": "Verwijder alle mogelijke stijl-tags uit de ondertiteling, zoals lettertype, dik gedrukt, kleur enz.", + "Reverse punctuation in RTL languages": "Draai leestekens in RTL (rechts naar links) talen om", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew": "Sommige afspeelapparaten kunnen de leestekens van rechts naar links niet goed verwerken. Wissel interpunctie fysiek. Van toepassing op talen: hebreeuws", + "Change the FPS of the subtitle": "Wijzig de FPS van de ondertitel", + "Re-syncs the subtitle to the framerate of the current media file.": "Synchroniseert de ondertitel naar de framerate van het huidige mediabestand opnieuw.", + "Remove Hearing Impaired tags": "Verwijder slecthorende-tags", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people": "Verwijderd tags. tekst en karakters uit ondertiteling die zijn bedoeld voor slechthorende mensen", + "Fix common OCR issues": "Repareer veel voorkomende OCR fouten", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR": "Repareer fouten die optreden als een ondertitel is geconverteerd van bitmap naar tekst met OCR", + "Change the timing of the subtitle": "Wijzig de timing van de ondertitel", + "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Voegt een bepaalde hoeveelheid tijd toe of trekt een bepaalde tijd af van de hele ondertitel zodat deze overeenkomt met uw media", + "Available": "Beschikbaar", + "Current": "Huidig", + "Custom path to advanced_settings.json": "Aangepast pad naar advanced_settings.json" +} \ No newline at end of file From 036d036a6129b0ae7ce5a073d0f133855bc4fca0 Mon Sep 17 00:00:00 2001 From: pannal Date: Fri, 15 Jun 2018 04:37:10 +0200 Subject: [PATCH 114/710] Update es.json (POEditor.com) --- Contents/Strings/es.json | 798 +++++++++++++++++++-------------------- 1 file changed, 399 insertions(+), 399 deletions(-) diff --git a/Contents/Strings/es.json b/Contents/Strings/es.json index c9bf9df5a..b0574a1d1 100644 --- a/Contents/Strings/es.json +++ b/Contents/Strings/es.json @@ -1,400 +1,400 @@ { - "sq":"Albanian", - "ar":"Arabic", - "be":"Belarusian", - "bs":"Bosnian", - "bg":"Bulgarian", - "ca":"Catalan", - "zh":"Chinese", - "hr":"Croatian", - "cs":"Czech", - "da":"Danish", - "nl":"Dutch", - "en":"English", - "et":"Estonian", - "fa":"Persian (Farsi)", - "fi":"Finnish", - "fr":"French", - "de":"German", - "el":"Greek", - "he":"Hebrew", - "hi":"Hindi", - "hu":"Hungarian", - "is":"Icelandic", - "id":"Indonesian", - "it":"Italian", - "ja":"Japanese", - "ko":"Korean", - "lv":"Latvian", - "lt":"Lithuanian", - "mk":"Macedonian", - "ms":"Malay", - "no":"Norwegian", - "pl":"Polish", - "pt":"Portuguese", - "pt-br":"Portuguese (Brasil)", - "ro":"Romanian", - "ru":"Russian", - "sr":"Serbian", - "sr-cyrl":"Serbian (Cyrillic)", - "sr-latn":"Serbian (Latin)", - "sk":"Slovak", - "sl":"Slovenian", - "es":"Spanish", - "sv":"Swedish", - "th":"Thai", - "tr":"Turkish", - "uk":"Ukranian", - "vi":"Vietnamese", - "Internal stuff, pay attention!":"Internal stuff, pay attention!", - "Advanced":"Advanced", - "advanced":"advanced", - "Enter PIN":"Enter PIN", - "The owner has restricted the access to this menu. Please enter the correct pin":"The owner has restricted the access to this menu. Please enter the correct pin", - "Restart the plugin":"Restart the plugin", - "Get my logs (copy the appearing link and open it in your browser, please)":"Get my logs (copy the appearing link and open it in your browser, please)", - "Copy the appearing link and open it in your browser, please":"Copy the appearing link and open it in your browser, please", - "Trigger find better subtitles":"Trigger find better subtitles", - "Skip next find better subtitles (sets last run to now)":"Skip next find better subtitles (sets last run to now)", - "Trigger subtitle storage maintenance":"Trigger subtitle storage maintenance", - "Trigger subtitle storage migration (expensive)":"Trigger subtitle storage migration (expensive)", - "Trigger cache maintenance (refiners, providers and packs/archives)":"Trigger cache maintenance (refiners, providers and packs/archives)", - "Apply configured default subtitle mods to all (active) stored subtitles":"Apply configured default subtitle mods to all (active) stored subtitles", - "Re-Apply mods of all stored subtitles":"Re-Apply mods of all stored subtitles", - "Log the plugin's scheduled tasks state storage":"Log the plugin's scheduled tasks state storage", - "Log the plugin's internal ignorelist storage":"Log the plugin's internal ignorelist storage", - "Log the plugin's complete state storage":"Log the plugin's complete state storage", - "Reset the plugin's scheduled tasks state storage":"Reset the plugin's scheduled tasks state storage", - "Reset the plugin's internal ignorelist storage":"Reset the plugin's internal ignorelist storage", - "Invalidate Sub-Zero metadata caches (subliminal)":"Invalidate Sub-Zero metadata caches (subliminal)", - "Reset provider throttle states":"Reset provider throttle states", - "Restarting the plugin":"Restarting the plugin", - "Restart triggered, please wait about 5 seconds":"Restart triggered, please wait about 5 seconds", - "Reset subtitle storage":"Reset subtitle storage", - "Are you sure?":"Are you sure?", - "Are you really sure?":"Are you really sure?", - "Success":"Success", - "Information Storage (%s) reset":"Information Storage (%s) reset", - "Information Storage (%s) logged":"Information Storage (%s) logged", - "FindBetterSubtitles triggered":"FindBetterSubtitles triggered", - "FindBetterSubtitles skipped":"FindBetterSubtitles skipped", - "SubtitleStorageMaintenance triggered":"SubtitleStorageMaintenance triggered", - "MigrateSubtitleStorage triggered":"MigrateSubtitleStorage triggered", - "TriggerCacheMaintenance triggered":"TriggerCacheMaintenance triggered", - "This may take some time ...":"This may take some time ...", - "Download Logs":"Download Logs", - "Sorry, feature unavailable":"Sorry, feature unavailable", - "Universal Plex token not available":"Universal Plex token not available", - "Copy this link and open this in your browser, please":"Copy this link and open this in your browser, please", - "Cache invalidated":"Cache invalidated", - "Enter PIN number ":"Enter PIN number ", - "PIN correct":"PIN correct", - "Reset":"Reset", - "Menu locked":"Menu locked", - "Provider throttles reset":"Provider throttles reset", - "Plex didn't return any information about the item, please refresh it and come back later":"Plex didn't return any information about the item, please refresh it and come back later", - "Item not found: %s!":"Item not found: %s!", - "< Back to %s":"< Back to %s", - "Back to %s > %s":"Back to %s > %s", - "Refresh: %s":"Refresh: %s", - "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk":"Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk", - "the movie":"the movie", - "the series":"the series", - "the episode":"the episode", - "the season":"the season", - "Force-find subtitles: %(item_title)s":"Force-find subtitles: %(item_title)s", - "Issues a forced refresh, ignoring known subtitles and searching for new ones":"Issues a forced refresh, ignoring known subtitles and searching for new ones", - "File %(file_part_index)s: ":"File %(file_part_index)s: ", - "%(part_summary)sNo current subtitle in storage":"%(part_summary)sNo current subtitle in storage", - "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "%(part_summary)sManage %(language)s subtitle":"%(part_summary)sManage %(language)s subtitle", - "%(part_summary)sList %(language)s subtitles":"%(part_summary)sList %(language)s subtitles", - "%(part_summary)sEmbedded subtitles (%(languages)s)":"%(part_summary)sEmbedded subtitles (%(languages)s)", - "Extract and activate embedded subtitle streams":"Extract and activate embedded subtitle streams", - "Select active %(language)s subtitle":"Select active %(language)s subtitle", - "%(count)d subtitles in storage":"%(count)d subtitles in storage", - "List available %(language)s subtitles":"List available %(language)s subtitles", - "Modify current %(language)s subtitle":"Modify current %(language)s subtitle", - "Currently applied mods: %(mod_list)s":"Currently applied mods: %(mod_list)s", - "Blacklist current %(language)s subtitle and search for a new one":"Blacklist current %(language)s subtitle and search for a new one", - "Manage blacklist (%(amount)s contained)":"Manage blacklist (%(amount)s contained)", - "Inspect currently blacklisted subtitles":"Inspect currently blacklisted subtitles", - "%(current_state)s%(subtitle_name)s, Score: %(score)s":"%(current_state)s%(subtitle_name)s, Score: %(score)s", - "Current: ":"Current: ", - "Stored: ":"Stored: ", - "Subtitle saved to disk":"Subtitle saved to disk", - "Remove subtitle from blacklist":"Remove subtitle from blacklist", - "by %(release_group)s":"by %(release_group)s", - "Current: %(provider_name)s (%(score)s) ":"Current: %(provider_name)s (%(score)s) ", - "Search for %(language)s subs (%(video_data)s)":"Search for %(language)s subs (%(video_data)s)", - "%(current_info)sFilename: %(filename)s":"%(current_info)sFilename: %(filename)s", - "No subtitles found":"No subtitles found", - "Searching for %(language)s subs (%(video_data)s), refresh here ...":"Searching for %(language)s subs (%(video_data)s), refresh here ...", - " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)":" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", - " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)":" (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", - "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s":"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", - "Release: %(release_info)s, Matches: %(matches)s":"Release: %(release_info)s, Matches: %(matches)s", - "Downloading subtitle for %(title_or_id)s":"Downloading subtitle for %(title_or_id)s", - "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods", - " (unknown)":" (unknown)", - " (forced)":" (forced)", - "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", - "Extracting of embedded subtitle %s of part %s:%s triggered":"Extracting of embedded subtitle %s of part %s:%s triggered", - "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "Insufficient permissions":"Insufficient permissions", - "Insufficient permissions on library %(title)s, folder: %(path)s":"Insufficient permissions on library %(title)s, folder: %(path)s", - "I'm not enabled!":"I'm not enabled!", - "Please enable me for some of your libraries in your server settings; currently I do nothing":"Please enable me for some of your libraries in your server settings; currently I do nothing", - "Working ... refresh here":"Working ... refresh here", - "Current state: %s; Last state: %s":"Current state: %s; Last state: %s", - "On-deck items":"On-deck items", - "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.", - "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", - "Recently-added items":"Recently-added items", - "Recently played items":"Recently played items", - "Shows the recently added items per section.":"Shows the recently added items per section.", - "Show recently added items with missing subtitles":"Show recently added items with missing subtitles", - "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list":"Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list", - "Browse all items":"Browse all items", - "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.":"Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.", - "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)":"Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", - "Last run: %s; Next scheduled run: %s; Last runtime: %s":"Last run: %s; Next scheduled run: %s; Last runtime: %s", - "Search for missing subtitles (in recently-added items, max-age: %s)":"Search for missing subtitles (in recently-added items, max-age: %s)", - "Automatically run periodically by the scheduler, if configured. %s":"Automatically run periodically by the scheduler, if configured. %s", - "Display ignore list (%(ignored_count)d)":"Display ignore list (%(ignored_count)d)", - "Show the current ignore list (mainly used for the automatic tasks)":"Show the current ignore list (mainly used for the automatic tasks)", - "History":"History", - "Show the last %i downloaded subtitles":"Show the last %i downloaded subtitles", - "Refresh":"Refresh", - "Re-lock menu(s)":"Re-lock menu(s)", - "Enabled the PIN again for menu(s)":"Enabled the PIN again for menu(s)", - "%(throttled_provider)s until %(until_date)s (%(reason)s)":"%(throttled_provider)s until %(until_date)s (%(reason)s)", - "Throttled providers: %s":"Throttled providers: %s", - "Advanced functions":"Advanced functions", - "Use at your own risk":"Use at your own risk", - "Items On Deck":"Items On Deck", - "Recently Played":"Recently Played", - "Items with missing subtitles":"Items with missing subtitles", - "Find recent items with missing subtitles":"Find recent items with missing subtitles", - "Updating, refresh here ...":"Updating, refresh here ...", - "Missing: %s":"Missing: %s", - "Add %(kind)s %(title)s to the ignore list":"Add %(kind)s %(title)s to the ignore list", - "Remove %(kind)s %(title)s from the ignore list":"Remove %(kind)s %(title)s from the ignore list", - "Didn't change the ignore list":"Didn't change the ignore list", - "%(title)s added to the ignore list":"%(title)s added to the ignore list", - "%(title)s removed from the ignore list":"%(title)s removed from the ignore list", - "Sections":"Sections", - "All":"All", - "Ignore %(kind)s \"%(title)s\"":"Ignore %(kind)s \"%(title)s\"", - "Un-ignore %(kind)s \"%(title)s\"":"Un-ignore %(kind)s \"%(title)s\"", - "show":"show", - "movie":"movie", - "Refreshing %(title)s":"Refreshing %(title)s", - "Force-refreshing %(title)s":"Force-refreshing %(title)s", - "Extracting subtitle %(stream_index)s of %(filename)s":"Extracting subtitle %(stream_index)s of %(filename)s", - "<< Back to home":"<< Back to home", - "Extract missing %(language)s embedded subtitles":"Extract missing %(language)s embedded subtitles", - "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications", - "Extract and activate %(language)s embedded subtitles":"Extract and activate %(language)s embedded subtitles", - "Extracts embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts embedded subtitles of all episodes for the current season with all configured default modifications", - "Auto-Find subtitles: %s":"Auto-Find subtitles: %s", - "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered", - "Triggering refresh for %(title)s":"Triggering refresh for %(title)s", - "Triggering forced refresh for %(title)s":"Triggering forced refresh for %(title)s", - "Refresh of item %(item_id)s triggered":"Refresh of item %(item_id)s triggered", - "Forced refresh of item %(item_id)s triggered":"Forced refresh of item %(item_id)s triggered", - "< Back to subtitle options for: %s":"< Back to subtitle options for: %s", - "Remove last applied mod (%s)":"Remove last applied mod (%s)", - "none":"none", - "None":"None", - "Idle":"Idle", - "Manage applied mods":"Manage applied mods", - "Reapply applied mods":"Reapply applied mods", - "Restore original version":"Restore original version", - "< Back to subtitle modification menu":"< Back to subtitle modification menu", - "subs constantly getting faster":"subs constantly getting faster", - "subs constantly getting slower":"subs constantly getting slower", - "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)":"%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", - "< Back to subtitle modifications":"< Back to subtitle modifications", - "Adjust by %(time_and_unit)s":"Adjust by %(time_and_unit)s", - "< Back to unit selection":"< Back to unit selection", - "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "Remove: %(mod_name)s":"Remove: %(mod_name)s", - "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Subtitle download failed (%(item_id)s)", - "Subtitle Language (1)":"Subtitle Language (1)", - "Subtitle Language (2)":"Subtitle Language (2)", - "Subtitle Language (3)":"Subtitle Language (3)", - "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)":"Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)", - "Only download foreign/forced subtitles":"Only download foreign/forced subtitles", - "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)":"Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", - "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)":"Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)", - "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")":"Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")", - "Embedded subtitles: Treat \"Undefined\" (und) as language 1":"Embedded subtitles: Treat \"Undefined\" (und) as language 1", - "I rename my files using":"I rename my files using", - "Retrieve original filename from .file_info/file_info index files (see wiki)":"Retrieve original filename from .file_info/file_info index files (see wiki)", - "Sonarr URL (add URL base if configured)":"Sonarr URL (add URL base if configured)", - "Sonarr API key":"Sonarr API key", - "Radarr URL (add URL base if configured, min. version: 0.2.0.897)":"Radarr URL (add URL base if configured, min. version: 0.2.0.897)", - "Radarr API key":"Radarr API key", - "Provider: Enable OpenSubtitles":"Provider: Enable OpenSubtitles", - "Opensubtitles Username":"Opensubtitles Username", - "Opensubtitles Password":"Opensubtitles Password", - "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)":"OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)", - "Provider: Enable Podnapisi.NET":"Provider: Enable Podnapisi.NET", - "Provider: Enable Titlovi.com":"Provider: Enable Titlovi.com", - "Provider: Enable Addic7ed":"Provider: Enable Addic7ed", - "Addic7ed Username":"Addic7ed Username", - "Addic7ed Password":"Addic7ed Password", - "Addic7ed: boost score (if requirements met)":"Addic7ed: boost score (if requirements met)", - "Addic7ed: Use random user agents":"Addic7ed: Use random user agents", - "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)":"Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", - "Legendas TV Username":"Legendas TV Username", - "Legendas TV Password":"Legendas TV Password", - "Provider: Enable TVsubtitles.net":"Provider: Enable TVsubtitles.net", - "Provider: Enable NapiProjekt.pl (Polish)":"Provider: Enable NapiProjekt.pl (Polish)", - "Provider: Enable SubScene (TV shows)":"Provider: Enable SubScene (TV shows)", - "Provider: Enable hosszupuskasub.com (Hungarian)":"Provider: Enable hosszupuskasub.com (Hungarian)", - "Provider: Enable aRGENTeaM (Spanish)":"Provider: Enable aRGENTeaM (Spanish)", - "Search enabled providers simultaneously (multithreading)":"Search enabled providers simultaneously (multithreading)", - "Automatically extract and use embedded subtitles upon media addition (with configured default mods)":"Automatically extract and use embedded subtitles upon media addition (with configured default mods)", - "After automatic extraction of embedded subtitles, also immediately search for available subtitles?":"After automatic extraction of embedded subtitles, also immediately search for available subtitles?", - "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?":"Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?", - "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?":"Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?", - "How strict should these subtitles existing on the filesystem be detected?":"How strict should these subtitles existing on the filesystem be detected?", - "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?":"Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?", - "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)":"Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)", - "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)":"Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)", - "Download hearing impaired subtitles.":"Download hearing impaired subtitles.", - "Remove Hearing Impaired tags from downloaded subtitles":"Remove Hearing Impaired tags from downloaded subtitles", - "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)":"Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)", - "Fix common issues in subtitles":"Fix common issues in subtitles", - "Fix common OCR errors in downloaded subtitles":"Fix common OCR errors in downloaded subtitles", - "Reverse punctuation in RTL languages (heb)":"Reverse punctuation in RTL languages (heb)", - "Change colors of subtitles to":"Change colors of subtitles to", - "Store subtitles next to media files (instead of metadata)":"Store subtitles next to media files (instead of metadata)", - "Subtitle formats to save (non-SRT only works if the previous option is enabled)":"Subtitle formats to save (non-SRT only works if the previous option is enabled)", - "Subtitle Folder (\"current folder\" is the folder the current media file lives in)":"Subtitle Folder (\"current folder\" is the folder the current media file lives in)", - "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)":"Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)", - "Fall back to metadata storage if filesystem storage failed":"Fall back to metadata storage if filesystem storage failed", - "Set subtitle file permissions to (integer, e.g.: 0775)":"Set subtitle file permissions to (integer, e.g.: 0775)", - "Automatically delete leftover/unused (externally saved) subtitles":"Automatically delete leftover/unused (externally saved) subtitles", - "On media playback: search for missing subtitles (refresh item)":"On media playback: search for missing subtitles (refresh item)", - "Scheduler: Periodically search for recent items with missing subtitles":"Scheduler: Periodically search for recent items with missing subtitles", - "Scheduler: Item age to be considered recent":"Scheduler: Item age to be considered recent", - "Scheduler: Recent items to consider per library":"Scheduler: Recent items to consider per library", - "Scheduler: Periodically search for better subtitles":"Scheduler: Periodically search for better subtitles", - "Scheduler: Days to search for better subtitles (max: 30 days)":"Scheduler: Days to search for better subtitles (max: 30 days)", - "Scheduler: Don't search for better subtitles if the item's air date is older than":"Scheduler: Don't search for better subtitles if the item's air date is older than", - "Scheduler: Overwrite manually selected subtitles when better found":"Scheduler: Overwrite manually selected subtitles when better found", - "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found":"Scheduler: Overwrite subtitles with non-default subtitle modifications when better found", - "History: amount of items to store historical data for":"History: amount of items to store historical data for", - "How many download tries per subtitle (on timeout or error)":"How many download tries per subtitle (on timeout or error)", - "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)":"Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)", - "Ignore anything in the following paths (comma-separated)":"Ignore anything in the following paths (comma-separated)", - "Sub-Zero mode":"Sub-Zero mode", - "Access PIN (any amount of numbers, 0-9)":"Access PIN (any amount of numbers, 0-9)", - "Access PIN valid for minutes":"Access PIN valid for minutes", - "Use PIN to restrict access to (needs plugin or PMS restart)":"Use PIN to restrict access to (needs plugin or PMS restart)", - "Call this executable upon successful subtitle download (see Wiki for details)":"Call this executable upon successful subtitle download (see Wiki for details)", - "Check for correct folder permissions of every library on plugin start":"Check for correct folder permissions of every library on plugin start", - "Use new style caching (for subliminal)":"Use new style caching (for subliminal)", - "Low impact mode (for remote filesystems)":"Low impact mode (for remote filesystems)", - "Timeout for API requests sent to the PMS":"Timeout for API requests sent to the PMS", - "HTTP proxy to use for providers (supports credentials)":"HTTP proxy to use for providers (supports credentials)", - "How verbose should the logging be?":"How verbose should the logging be?", - "How many log backups to keep?":"How many log backups to keep?", - "Log subtitle modification (debug)":"Log subtitle modification (debug)", - "Log to console (for development/debugging)":"Log to console (for development/debugging)", - "Collect anonymous usage statistics":"Collect anonymous usage statistics", - "Sonarr/Radarr (fill api info below)":"Sonarr/Radarr (fill api info below)", - "Filebot":"Filebot", - "Sonarr/Radarr/Filebot":"Sonarr/Radarr/Filebot", - "Symlink to original file":"Symlink to original file", - "I keep the original filenames":"I keep the original filenames", - "none of the above":"none of the above", - "exact: media filename match":"exact: media filename match", - "loose: filename contains media filename":"loose: filename contains media filename", - "any":"any", - "prefer":"prefer", - "don't prefer":"don't prefer", - "force HI":"force HI", - "force non-HI":"force non-HI", - "don't change":"don't change", - "white":"white", - "light-grey":"light-grey", - "red":"red", - "green":"green", - "yellow":"yellow", - "blue":"blue", - "magenta":"magenta", - "cyan":"cyan", - "black":"black", - "dark-red":"dark-red", - "dark-green":"dark-green", - "dark-yellow":"dark-yellow", - "dark-blue":"dark-blue", - "dark-magenta":"dark-magenta", - "dark-cyan":"dark-cyan", - "dark-grey":"dark-grey", - "current folder":"current folder", - "never":"never", - "current media item":"current media item", - "next episode (series)":"next episode (series)", - "hybrid: current item or next episode":"hybrid: current item or next episode", - "hybrid-plus: current item and next episode":"hybrid-plus: current item and next episode", - "every 6 hours":"every 6 hours", - "every 12 hours":"every 12 hours", - "every 24 hours":"every 24 hours", - "1 days":"1 days", - "2 days":"2 days", - "3 days":"3 days", - "4 days":"4 days", - "1 weeks":"1 weeks", - "2 weeks":"2 weeks", - "3 weeks":"3 weeks", - "4 weeks":"4 weeks", - "5 weeks":"5 weeks", - "6 weeks":"6 weeks", - "12 weeks":"12 weeks", - "don't limit":"don't limit", - "1 year":"1 year", - "2 years":"2 years", - "3 years":"3 years", - "4 years":"4 years", - "5 years":"5 years", - "6 years":"6 years", - "7 years":"7 years", - "8 years":"8 years", - "9 years":"9 years", - "10 years":"10 years", - "agent + interface":"agent + interface", - "only agent":"only agent", - "only interface":"only interface", - "disabled":"disabled", - "interface":"interface", - "advanced menu":"advanced menu", - "CRITICAL":"CRITICAL", - "ERROR":"ERROR", - "WARNING":"WARNING", - "INFO":"INFO", - "DEBUG":"DEBUG", - "Change the color of the subtitle":"Change the color of the subtitle", - "Adds the requested color to every line of the subtitle. Support depends on player.":"Adds the requested color to every line of the subtitle. Support depends on player.", - "Basic common fixes":"Basic common fixes", - "Fix common and whitespace/punctuation issues in subtitles":"Fix common and whitespace/punctuation issues in subtitles", - "Remove all style tags":"Remove all style tags", - "Removes all possible style tags from the subtitle, such as font, bold, color etc.":"Removes all possible style tags from the subtitle, such as font, bold, color etc.", - "Reverse punctuation in RTL languages":"Reverse punctuation in RTL languages", - "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew":"Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew", - "Change the FPS of the subtitle":"Change the FPS of the subtitle", - "Re-syncs the subtitle to the framerate of the current media file.":"Re-syncs the subtitle to the framerate of the current media file.", - "Remove Hearing Impaired tags":"Remove Hearing Impaired tags", - "Removes tags, text and characters from subtitles that are meant for hearing impaired people":"Removes tags, text and characters from subtitles that are meant for hearing impaired people", - "Fix common OCR issues":"Fix common OCR issues", - "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR":"Fix issues that happen when a subtitle gets converted from bitmap to text through OCR", - "Change the timing of the subtitle":"Change the timing of the subtitle", - "Adds or substracts a certain amount of time from the whole subtitle to match your media":"Adds or substracts a certain amount of time from the whole subtitle to match your media", - "Available":"Available", - "Current":"Current", - "Custom path to advanced_settings.json":"Custom path to advanced_settings.json" -} + "sq": "Albanés", + "ar": "Árabe", + "be": "Bieloruso", + "bs": "Bosnio", + "bg": "Búlgaro", + "ca": "Catalán", + "zh": "Chino", + "hr": "Croata", + "cs": "Checo", + "da": "Danés", + "nl": "Neerlandés", + "en": "Inglés", + "et": "Estonio", + "fa": "Persa", + "fi": "Finés", + "fr": "Francés", + "de": "Alemán", + "el": "Griego", + "he": "Hebreo", + "hi": "Hindi", + "hu": "Húngaro", + "is": "Islandés", + "id": "Indonesio", + "it": "Italiano", + "ja": "Japonés", + "ko": "Coreano", + "lv": "Letonio", + "lt": "Lituano", + "mk": "Macedonio", + "ms": "Malayo", + "no": "Noruego", + "pl": "Polaco", + "pt": "Portugués", + "pt-br": "Portugués (Brasil)", + "ro": "Rumano", + "ru": "Ruso", + "sr": "Serbio", + "sr-cyrl": "Serbio (Cirílico)", + "sr-latn": "Serbio (Latín)", + "sk": "Eslovaco", + "sl": "Slovaco", + "es": "Español", + "sv": "Sueco", + "th": "Tailandés", + "tr": "Turco", + "uk": "Ucraniano", + "vi": "Vietnamita", + "Internal stuff, pay attention!": "Asunto interno, ¡prestar atención!", + "Advanced": "Avanzado", + "advanced": "avanzado", + "Enter PIN": "Ingresar PIN", + "The owner has restricted the access to this menu. Please enter the correct pin": "El dueño ha restringido el acceso a este menú. Por favor ingrese el PIN adecuado", + "Restart the plugin": "Reiniciar el plugin", + "Get my logs (copy the appearing link and open it in your browser, please)": "Obtener mis bitácoras (copia el enlace que aparece y ábrelo en tu navegador, por favor)", + "Copy the appearing link and open it in your browser, please": "Copia el enlace que aparece y ábrelo en tu navegador, por favor", + "Trigger find better subtitles": "Provocar búsqueda de Mejores Subtítulos", + "Skip next find better subtitles (sets last run to now)": "Evitar la próxima búsqueda de Mejores Subtítulos (fija a Ahora la última búsqueda)", + "Trigger subtitle storage maintenance": "Provocar el mantenimiento del almacenamiento de subtítulos", + "Trigger subtitle storage migration (expensive)": "Provocar la migración del almacenamiento de subtítulos (lento)", + "Trigger cache maintenance (refiners, providers and packs/archives)": "Provocar el mantenimiento de la caché (refinadores, proveedores y paquetes)", + "Apply configured default subtitle mods to all (active) stored subtitles": "Aplicar las modificaciones de la configuración de subtítulos a todos los almacenados y activos", + "Re-Apply mods of all stored subtitles": "Reaplicar modificaciones a todos los subtítulos almacenados", + "Log the plugin's scheduled tasks state storage": "Anotar en el log las tareas de las descargar programadas del plugin", + "Log the plugin's internal ignorelist storage": "Anotar en el log la lista a ignorar en las descargas", + "Log the plugin's complete state storage": "Anotar en el log el estado completo de las descargas", + "Reset the plugin's scheduled tasks state storage": "Reiniciar el plugin de descargas programadas", + "Reset the plugin's internal ignorelist storage": "Reiniciar el plugin de la lista a ignorar en las descargas", + "Invalidate Sub-Zero metadata caches (subliminal)": "Invalidar el caché de metadata Sub-Zero (subliminal)", + "Reset provider throttle states": "Reiniciar estado en proveedores ralentizados", + "Restarting the plugin": "Reiniciar el plugin", + "Restart triggered, please wait about 5 seconds": "Reinicio provocado, por favor espere 5 segundos", + "Reset subtitle storage": "Limpiar carpeta de almacenamiento de subtítulos", + "Are you sure?": "¿Estás seguro?", + "Are you really sure?": "¿Estás realmente seguro?", + "Success": "Éxito", + "FindBetterSubtitles triggered": "Buscar Mejores Subtítulos provocado", + "FindBetterSubtitles skipped": "Buscar Mejores Subtítulos evitado", + "SubtitleStorageMaintenance triggered": "Mantenimiento del almacenamiento de subtítulos provocado", + "MigrateSubtitleStorage triggered": "Migración del almacenamiento de subtítulos provocada", + "TriggerCacheMaintenance triggered": "Mantenimiento de la caché provocado", + "This may take some time ...": "Esto podría tomar algún tiempo...", + "Download Logs": "Descargar logs", + "Sorry, feature unavailable": "Lo sentimos, característica no disponible", + "Universal Plex token not available": "Token universal Plex no disponible", + "Copy this link and open this in your browser, please": "Copia este enlace y ábrelo en tu navegador, por favor", + "Cache invalidated": "Caché invalidado", + "Enter PIN number ": "Ingrese número PIN␣", + "PIN correct": "PIN correcto", + "Reset": "Resetear", + "Menu locked": "Menú bloqueado", + "Provider throttles reset": "Reiniciar proveedores ralentizados", + "Information Storage (%s) reset": "Almacén de Información (%s) reiniciado", + "Information Storage (%s) logged": "Almacén de Información (%s) logueado", + "Plex didn't return any information about the item, please refresh it and come back later": "Plex no retornó información del elemento, por favor actualice y vuelva más tarde", + "Item not found: %s!": "¡Elemento no encontrado: %s!", + "< Back to %s": "< Regresar a %s", + "Back to %s > %s": "Regresar a %s > %s", + "Refresh: %s": "Actualizar: %s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Ejecuta una actualización forzada, ignorando subtítulos presentes y buscando nuevos", + "Extract and activate embedded subtitle streams": "Extraer y activar subtítulos integrados", + "Inspect currently blacklisted subtitles": "Inspeccionar la actual lista de bloqueados", + "Subtitle saved to disk": "Subtítulo guardado en disco", + "Remove subtitle from blacklist": "Eliminar subtítulo de la lista de bloqueados", + "No subtitles found": "No se han encontrado subtítulos", + " (unknown)": "␣(desconocido)", + " (forced)": "␣(forzado)", + "Extracting of embedded subtitle %s of part %s:%s triggered": "Extracción del subtítulo integrado %s de la parte %s:%s lanzada", + "Insufficient permissions": "Permisos insuficientes", + "I'm not enabled!": "¡No estoy habilitado!", + "Please enable me for some of your libraries in your server settings; currently I do nothing": "Por favor, habilítame para alguna biblioteca en tu servidor; ahora mismo no puedo hacer nada", + "Working ... refresh here": "Trabajando... refresque aquí", + "Current state: %s; Last state: %s": "Estado actual: %s; Último estado: %s", + "On-deck items": "Archivos On-deck", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "Muestra los últimos %s elementos reproducidos y permite actualizar individualmente sus metadatos y subtítulos.", + "Recently-added items": "Elementos recién añadidos", + "Recently played items": "Elementos recién reproducidos", + "Shows the recently added items per section.": "Muestra los elementos recién añadidos por sección.", + "Show recently added items with missing subtitles": "Muestra los elementos recién añadidos sin subtítulos", + "Browse all items": "Ver todos los elementos", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Navega a través de la colección completa y gestiona la Lista de Ignorados. Puede además actualizar individualmente sus metadatos y subtítulos", + "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Última ejecución: %s; Próxima ejecución: %s; Duración de la última ejecución: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)": "Buscar subtítulos faltantes (en elementos recién añadidos, antigüedad máxima: %s)", + "Automatically run periodically by the scheduler, if configured. %s": "Ejecuta automáticamente las tareas programadas, si están configuradas. %s", + "Show the current ignore list (mainly used for the automatic tasks)": "Muestra la Lista de Ignorados actual (principalmente usado por tareas automáticas)", + "History": "Historial", + "Show the last %i downloaded subtitles": "Muestra lo últimos %i subtítulos descargados", + "Refresh": "Actualizar", + "Re-lock menu(s)": "Bloquear menús", + "Enabled the PIN again for menu(s)": "Habilitado el PIN de nuevo en los menús", + "Throttled providers: %s": "Proveedores ralentizados: %s", + "Advanced functions": "Funciones avanzadas", + "Use at your own risk": "Use bajo su responsabilidad", + "Items On Deck": "Elementos On Deck", + "Recently Played": "Recién Reproducidos", + "Items with missing subtitles": "Elementos sin subtítulos", + "Find recent items with missing subtitles": "Buscar elementos recientes sin subtítulos", + "Updating, refresh here ...": "Actualizando, refresque aquí...", + "Missing: %s": "Falta: %s", + "Didn't change the ignore list": "La Lista de Ignorados no ha cambiado", + "Sections": "Secciones", + "All": "Todo", + "show": "serie", + "movie": "película", + "<< Back to home": "<< Volver a Inicio", + "Auto-Find subtitles: %s": "Auto-búsqueda de subtítulos: %s ", + "Extracting of embedded subtitles for %s triggered": "Extracción lanzada para los subtítulos integrados de %s", + "< Back to subtitle options for: %s": "< Regresar a las opciones de subtítulos para: %s", + "Remove last applied mod (%s)": "Quitar la última modificación realizada (%s)", + "none": "ninguno", + "Manage applied mods": "Gestionar modificaciones realizadas", + "Reapply applied mods": "Reaplicar modificaciones realizadas", + "Restore original version": "Restaurar versión original", + "< Back to subtitle modification menu": "< Regresar al menú de modificación de subtítulos", + "subs constantly getting faster": "los subtítulos van más rápido constantemente", + "subs constantly getting slower": "los subtítulos van más lento constantemente", + "< Back to subtitle modifications": "< Regresar a las modificaciones de subtítulos", + "< Back to unit selection": "< Regresar a la selección", + "Subtitle Language (1)": "Idioma del Subtítulo (1)", + "Subtitle Language (2)": "Idioma del Subtítulo (2)", + "Subtitle Language (3)": "Idioma del Subtítulo (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "Idiomas adicionales de subtítulos (use códigos ISO-639-1 separados por comas)", + "Only download foreign/forced subtitles": "Descargar sólo subtítulos extranjeros o forzados", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Mostar idiomas con atributos de país tipo ISO 639-1 (p. ej. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Tratar idiomas con atributos de país como ISO 639-1 (es decir, no descargar pt-BR si existe un subtítulo pt)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Restringir a un idioma (evita añadir \".lang\" al nombre del fichero del subtítulo; solo usa el \"Idioma del Subtítulo (1)\"", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Subtítulos integrados: tratar \"Undefined\" (und) como primer idioma", + "I rename my files using": "Renombro los archivos usando", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "Obtener el nombre original del archivo del los archivos tipo \"file_info\" (ver wiki)", + "Sonarr URL (add URL base if configured)": "URL de Sonarr (añadir la URL base si está configurada)", + "Sonarr API key": "Clave API de Sonarr", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "URL de Radar (añadir la URL base si está configurada, versión mínima: 0.2.0.897)", + "Radarr API key": "Clave API de Radarr", + "Provider: Enable OpenSubtitles": "Proveedor: Habilitar OpenSubtitles", + "Opensubtitles Username": "Usuario de OpenSubtitles", + "Opensubtitles Password": "Contraseña de OpenSubtitles", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "¿Es usuario VIP de OpenSubtitles? (http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET": "Proveedor: Habilitar Podnapisi.net", + "Provider: Enable Titlovi.com": "Proveedor: Habilitar Titlovi.com", + "Provider: Enable Addic7ed": "Proveedor: Habilitar Addic7ed", + "Addic7ed Username": "Usuario de Addic7ed", + "Addic7ed Password": "Contraseña de Addic7ed", + "Addic7ed: boost score (if requirements met)": "Addic7ed: puntuación incentivada si cumple los requisitos", + "Addic7ed: Use random user agents": "Addic7ed: Usar agentes aleatorios", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "Proveedor: Habilitar Legendas TV (sobre todo pt-BR, requiere UNRAR)", + "Legendas TV Username": "Usuario de Legendas TV", + "Legendas TV Password": "Contraseña de Legendas TV", + "Provider: Enable TVsubtitles.net": "Proveedor: Habilitar TVsubtitles.net", + "Provider: Enable NapiProjekt.pl (Polish)": "Proveedor: Habilitar NapiProjekt.pl (polaco)", + "Provider: Enable SubScene (TV shows)": "Proveedor: Habilitar SubScene (series de tv)", + "Provider: Enable hosszupuskasub.com (Hungarian)": "Proveedor: Habilitar hosszupuskasub.com (húngaro)", + "Provider: Enable aRGENTeaM (Spanish)": "Proveedor: Habilitar aRGENTeaM (español)", + "Search enabled providers simultaneously (multithreading)": "Buscar proveedores habilitados simultáneamente (multihebra)", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Extraer automáticamente y usar subtítulos integrados al añadir contenidos (con las modificaciones configuradas por defecto)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "Después de extraer automáticamente subtítulos integrados ¿buscar inmediatamente subtítulos disponibles?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "¿No buscar subtítulos de un idioma si existen subtítulos integrados dentro del archivo (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "¿No buscar subtítulos de un idioma si ya existen en el sistema de ficheros o en los metadatos?", + "How strict should these subtitles existing on the filesystem be detected?": "¿Cómo de estricta debe ser la detección de estos subtítulos en el sistema de archivos?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "¿Incluir subtítulos que no sean tipo texto (diferentes a .srt/.ssa/.ass/.vtt; integrados o externos) en lo anterior?", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "Puntuación mínima para Series de TV (mínimo: 240, sano: 337, recomendable: 352; ver http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "Puntuación mínima para Películas (mínimo: 60, sano: 69, recomendado: 82; ver \nhttp://v.ht/szscores)", + "Download hearing impaired subtitles.": "Descargar subtítulos para sordos", + "Remove Hearing Impaired tags from downloaded subtitles": "Eliminar etiquetas para sordos de los subtítulos descargados", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Eliminar etiquetas y estilos de los subtítulos descargados (negrita, cursiva, subrayado, colores, ...)", + "Fix common issues in subtitles": "Arreglar problemas comunes en los subtítullos", + "Fix common OCR errors in downloaded subtitles": "Arreglar errores comunes de OCR en los subtítulos descargados", + "Reverse punctuation in RTL languages (heb)": "Invertir puntuación en idiomas RTL (heb)", + "Change colors of subtitles to": "Cambiar color de los subtítulos a", + "Store subtitles next to media files (instead of metadata)": "Almacenar los subtítulos junto a los archivos de video (en lugar de en los metadatos)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Formatos de subtítulos a guardar (lo que no sean SRT sólo funcionan si la opción anterior está habilitada)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "Carpeta de subtítulos (\"carpeta actual\" es la carpeta donde los archivos de video están guardados)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "Carpeta de subtítulos personalizada (sustituye a la \"Carpeta de subtítulos\", calculada con las rutas reales)", + "Fall back to metadata storage if filesystem storage failed": "Activar como segunda opción el almacenamiento en los metadatos si falla en el sistema de almacenamiento", + "Set subtitle file permissions to (integer, e.g.: 0775)": "Fijar los permisos de los subtítulos a (nº entero, p. ej.: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles": "Borrar automáticamente los subtítulos sin uso (grabados externamente)", + "On media playback: search for missing subtitles (refresh item)": "Al reproducir un vídeo: buscar subtítulos automáticamente", + "Scheduler: Periodically search for recent items with missing subtitles": "Programador: Buscar subtítulos periódicamente para elementos recién añadidos que no tengan", + "Scheduler: Item age to be considered recent": "Programador: Antigüedad del elemento para ser considerado como Reciente", + "Scheduler: Recent items to consider per library": "Programador: Elementos recientes a considerar por biblioteca", + "Scheduler: Periodically search for better subtitles": "Programador: Buscar periódicamente Mejores Subtítulos", + "Scheduler: Days to search for better subtitles (max: 30 days)": "Programador: Días a buscar Mejores Subtítulos (máximo 30)", + "Scheduler: Don't search for better subtitles if the item's air date is older than": "Programador: No buscar Mejores Subtítulos si la fecha de emisión del elemento es mayor que", + "Scheduler: Overwrite manually selected subtitles when better found": "Programador: Sobreescribir subtítulos seleccionados manualmente cuando se encuentren Mejores Subtítulos", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Programador: Sobreecribir subtítulos con modificaciones que no sean por defecto cuando se encuentren Mejores Subtítulos", + "History: amount of items to store historical data for": "Historial: Cantidad de elementos de los que se guardará datos históricos", + "How many download tries per subtitle (on timeout or error)": "¿Cuántos intentos se deben realizar por subtítulos, cuando se produzca un error o supere el tiempo de espera?", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "Ignorar carpetas (con archivos tipo \"subzero.ignore/.subzero.ignore/.nosz\" en ellas)", + "Ignore anything in the following paths (comma-separated)": "Ignorar cualquier cosa en las siguientes rutas, separadas por comas", + "Sub-Zero mode": "Modo Sub-Zero", + "Access PIN (any amount of numbers, 0-9)": "PIN de acceso (cualquier cantidad de números, 0-9)", + "Access PIN valid for minutes": "Minutos de validez para el PIN de acceso ", + "Use PIN to restrict access to (needs plugin or PMS restart)": "Usar PIN para restringir el acceso (necesitar reinicio)", + "Call this executable upon successful subtitle download (see Wiki for details)": "Llamar a este ejecutable tras las descarga correcta de un subtítulo (ver detalles en la Wiki)", + "Check for correct folder permissions of every library on plugin start": "Comprobar permisos de carpeta para cada biblioteca al iniciar el plugin", + "Use new style caching (for subliminal)": "Usar nuevo estilo de caché (para Subliminal)", + "Low impact mode (for remote filesystems)": "Modo de bajo impacto (para sistemas de archivo remotos)", + "Timeout for API requests sent to the PMS": "Tiempo de espera para peticiones API enviadas al PMS", + "HTTP proxy to use for providers (supports credentials)": "Proxy HTTP a usar para proveedores (permite credenciales)", + "How verbose should the logging be?": "¿Cómo de extenso debe ser el detalle del log?", + "How many log backups to keep?": "¿Cuántas copias del log quiere mantener?", + "Log subtitle modification (debug)": "Anotar en el log las modificaciones de subtítulos (en pruebas)", + "Log to console (for development/debugging)": "Anotar log en consola (para desarrollar o depurar)", + "Collect anonymous usage statistics": "Recolectar estadísticas anónimas de uso", + "Sonarr/Radarr (fill api info below)": "Sonarr/Radarr (rellenar información de la API)", + "Filebot": "Filebot", + "Sonarr/Radarr/Filebot": "Sonarr/Radarr/Filebot", + "Symlink to original file": "Enlace simbólico al archivo original", + "I keep the original filenames": "Mantener los nombres de archivo originales", + "none of the above": "ninguno de los anteriores", + "exact: media filename match": "exacta: coincidencia por nombre de archivo del vídeo", + "loose: filename contains media filename": "parcial: el nombre del vídeo aparece en el nombre del archivo", + "any": "cualquiera", + "prefer": "preferir", + "don't prefer": "no preferir", + "force HI": "forzar Alta", + "force non-HI": "forzar No Alta", + "don't change": "sin cambios", + "white": "blanco", + "light-grey": "gris claro", + "red": "rojo", + "green": "verde", + "yellow": "amarillo", + "blue": "azul", + "magenta": "magenta", + "cyan": "cyan", + "black": "negro", + "dark-red": "rojo-oscuro", + "dark-green": "verde-oscuro", + "dark-yellow": "amarillo-oscuro", + "dark-blue": "azul-oscuro", + "dark-magenta": "magenta-oscuro", + "dark-cyan": "cyan-oscuro", + "dark-grey": "gris-oscuro", + "current folder": "carpeta actual", + "never": "nunca", + "current media item": "elemento multimedia actual", + "next episode (series)": "siguiente episodio (serie)", + "hybrid: current item or next episode": "híbrido: elemento actual o siguiente episodio", + "hybrid-plus: current item and next episode": "híbrido-plus: elemento actual y siguiente episodio", + "every 6 hours": "cada 6 horas", + "every 12 hours": "cada 12 horas", + "every 24 hours": "cada 24 horas", + "1 days": "1 día", + "2 days": "2 días", + "3 days": "3 días", + "4 days": "4 días", + "1 weeks": "1 semana", + "2 weeks": "2 semanas", + "3 weeks": "3 semanas", + "4 weeks": "4 semanas", + "5 weeks": "5 semanas", + "6 weeks": "6 semanas", + "12 weeks": "12 semanas", + "don't limit": "no limitar", + "1 year": "1 año", + "2 years": "2 años", + "3 years": "3 años", + "4 years": "4 años", + "5 years": "5 años", + "6 years": "5 años", + "7 years": "7 años", + "8 years": "8 años", + "9 years": "9 años", + "10 years": "10 años", + "only agent": "sólo agente", + "disabled": "deshabilitado", + "advanced menu": "menú avanzado", + "CRITICAL": "CRÍTICO", + "ERROR": "ERROR", + "WARNING": "ADVERTENCIA", + "INFO": "INFO", + "DEBUG": "DEPURACIÓN", + "Force-find subtitles: %(item_title)s": "Forzar búsqueda de subtítulos: %(item_title)s", + "File %(file_part_index)s: ": "Archivo %(file_part_index)s:␣", + "%(part_summary)sNo current subtitle in storage": "%(part_summary)sNo hay un subtítulo guardado", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sSubtítulos actual: %(provider_name)s (añadido: %(date_added)s, %(mode)s), Idioma: %(language)s, Puntuación: %(score)i, Almacenamiento: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)Gestiona subtítulos en %(language)s", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)Muestra subtítulos en %(language)s", + "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sSubtítulos integrados en (%(languages)s)", + "Select active %(language)s subtitle": "Selecciona subtítulos activos en %(language)s subtitle", + "%(count)d subtitles in storage": "%(count)d subtítulos almacenados", + "List available %(language)s subtitles": "Muestra subtítulos disponibles en %(language)s", + "Modify current %(language)s subtitle": "Modificar el subtítulo actual en %(language)s", + "Currently applied mods: %(mod_list)s": "Modificaciones aplicadas actualmente: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one": "Bloquear el actual subtítulo en %(language)s y buscar uno nuevo ", + "Manage blacklist (%(amount)s contained)": "Gestionar lista de bloqueados (total: %(amount)s) ", + "%(current_state)s%(subtitle_name)s, Score: %(score)s": "%(current_state)s%(subtitle_name)s, Puntuación: %(score)s", + "Current: ": "Actual: ", + "Stored: ": "Almacenado: ", + "by %(release_group)s": "por %(release_group)s", + "Current: %(provider_name)s (%(score)s) ": "Actual: %(provider_name)s (%(score)s)␣", + "Search for %(language)s subs (%(video_data)s)": "Buscar subtítulos en %(language)s (%(video_data)s)", + "%(current_info)sFilename: %(filename)s": "%(current_info)sNombre de archivo: %(filename)s", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "Buscando subtítulos en %(language)s para (%(video_data)s), actualice aquí...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": "␣(FPS incorrectos, sub: %(subtitle_fps)s, archivo: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": " ␣(FPS incorrectos, sub: %(subtitle_fps)s, archivo: desconocido, modo de bajo impacto)\n", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, puntuación: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s": "Release: %(release_info)s, Coincidencia: %(matches)s", + "Downloading subtitle for %(title_or_id)s": "Descargando subtítulo para %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Extraer flujo %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s con las modificaciones por defecto", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "Extraer flujo %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Idioma: %(language)s, Puntuación: %(score)i, Almacenamiento: %(storage_type)s", + "Insufficient permissions on library %(title)s, folder: %(path)s": "Permisos insuficientes en biblioteca %(title)s, carpeta: %(path)s", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Ejecutando: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Display ignore list (%(ignored_count)d)": "Mostrar lista de ignorados (%(ignored_count)d)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s hasta %(until_date)s (%(reason)s)", + "Extracting subtitle %(stream_index)s of %(filename)s": "Extrayendo subtítulos %(stream_index)s de %(filename)s", + "Extract missing %(language)s embedded subtitles": "Extraer subtítulos integrados faltantes en %(language)s", + "Extract and activate %(language)s embedded subtitles": "Extraer y activar subtítulos integrados en %(language)s", + "None": "Ninguno", + "Idle": "Parado", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "Adjust by %(time_and_unit)s": "Ajustar a %(time_and_unit)s", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "añadido: %(date_added)s, %(mode)s, Idioma: %(language)s, Puntuación: %(score)i, Almacenamiento: %(storage_type)s\n", + "Remove: %(mod_name)s": "Quitar: %(mod_name)s", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Fallo la descarga del subtítulos(%(item_id)s)", + "agent + interface": "agente + interfaz", + "only interface": "sólo interfaz", + "interface": "interfaz", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "Mostrar los elementos En Progreso y permite actualiza individualmente los metadatos y subtítulos", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "Muestra elementos sin subtítulos. Haz clic en \"Buscar elementos recientes sin subtítulos\" para actualizar la lista", + "Add %(kind)s %(title)s to the ignore list": "Añadir %(kind)s %(title)s a la lista de ignorados", + "Remove %(kind)s %(title)s from the ignore list": "Eliminar %(kind)s %(title)s de la lista de ignorados", + "%(title)s added to the ignore list": "%(title)s añadido a la lista de ignorados", + "%(title)s removed from the ignore list": "%(title)s eliminados de la lista de ignorados", + "Triggering refresh for %(title)s": "Actualización lanzada para %(title)s", + "Triggering forced refresh for %(title)s": "Actualización forzada para%(title)s", + "Refresh of item %(item_id)s triggered": "Actualización de elementos %(item_id)s lanzada", + "Forced refresh of item %(item_id)s triggered": "Actualización de elementos %(item_id)s forzada", + "Ignore %(kind)s \"%(title)s\"": "Ignorar %(kind)s \"%(title)s\"", + "Un-ignore %(kind)s \"%(title)s\"": "Dejar de ignorar %(kind)s \"%(title)s\"", + "Refreshing %(title)s": "Actualizando %(title)s", + "Force-refreshing %(title)s": "Actualizando forzosamente %(title)s", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Extraer los subtítulos integrados no extraídos de todos los episodios de la actual temporada con las modificaciones configuradas por defecto", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "Extraer los subtítulos integrados de todos los episodios de la actual temporada con las modificaciones configuradas por defecto", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Actualiza %(the_movie_series_season_episode)s, posiblemente buscando y tomando nuevos subtítulos del disco", + "the movie": "la película", + "the series": "la serie", + "the episode": "el episodio", + "the season": "la temporada", + "Change the color of the subtitle": "cambiar el color del subtítulo", + "Adds the requested color to every line of the subtitle. Support depends on player.": "Añade el color seleccionado a todos los subtítulos. El funcionamiento depende del reproductor.", + "Basic common fixes": "Arreglos comunes básicos", + "Fix common and whitespace/punctuation issues in subtitles": "Arregla problemas comunes, espacios y puntuación en los subtítulos", + "Remove all style tags": "Elimina toda las etiquetas de estilo", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.": "Elimina todas las posibles etiquetas de estilo del subtítulo, como fuente, negrita, color, etc.", + "Reverse punctuation in RTL languages": "Invertir puntuación en idiomas RTL", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew": "Algunos reproductores no saben tratar correctamente la puntuación de derecha a izquierda, que aplica al idioma hebreo", + "Change the FPS of the subtitle": "Cambiar los FPS del subtítulo", + "Re-syncs the subtitle to the framerate of the current media file.": "Resincronizar los subtítulos a la tasa de frames del archivo original", + "Remove Hearing Impaired tags": "Eliminar etiquetas para sordos", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people": "Eliminar etiquetas, textos y caracteres de los subtítulos puestos para sordos", + "Fix common OCR issues": "Arreglar errores OCR comunes", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR": "Arreglar fallos que ocurren cuando los subtítulos se convierten de imagen a texto por un OCR", + "Change the timing of the subtitle": "Cambiar el \"timing\" de los subtítulos", + "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Añadir o quitar cierta cantidad de tiempo de todo el subtítulos para emparejarlo con el vídeo", + "Available": "Disponible", + "Current": "Actual", + "Custom path to advanced_settings.json": "Ruta personalizada para advanced_settings.json" +} \ No newline at end of file From 026c30642e07f8643aeb3020660389626fac7fdd Mon Sep 17 00:00:00 2001 From: pannal Date: Fri, 15 Jun 2018 04:37:12 +0200 Subject: [PATCH 115/710] Update hu.json (POEditor.com) --- Contents/Strings/hu.json | 798 +++++++++++++++++++-------------------- 1 file changed, 399 insertions(+), 399 deletions(-) diff --git a/Contents/Strings/hu.json b/Contents/Strings/hu.json index c9bf9df5a..555722ac1 100644 --- a/Contents/Strings/hu.json +++ b/Contents/Strings/hu.json @@ -1,400 +1,400 @@ { - "sq":"Albanian", - "ar":"Arabic", - "be":"Belarusian", - "bs":"Bosnian", - "bg":"Bulgarian", - "ca":"Catalan", - "zh":"Chinese", - "hr":"Croatian", - "cs":"Czech", - "da":"Danish", - "nl":"Dutch", - "en":"English", - "et":"Estonian", - "fa":"Persian (Farsi)", - "fi":"Finnish", - "fr":"French", - "de":"German", - "el":"Greek", - "he":"Hebrew", - "hi":"Hindi", - "hu":"Hungarian", - "is":"Icelandic", - "id":"Indonesian", - "it":"Italian", - "ja":"Japanese", - "ko":"Korean", - "lv":"Latvian", - "lt":"Lithuanian", - "mk":"Macedonian", - "ms":"Malay", - "no":"Norwegian", - "pl":"Polish", - "pt":"Portuguese", - "pt-br":"Portuguese (Brasil)", - "ro":"Romanian", - "ru":"Russian", - "sr":"Serbian", - "sr-cyrl":"Serbian (Cyrillic)", - "sr-latn":"Serbian (Latin)", - "sk":"Slovak", - "sl":"Slovenian", - "es":"Spanish", - "sv":"Swedish", - "th":"Thai", - "tr":"Turkish", - "uk":"Ukranian", - "vi":"Vietnamese", - "Internal stuff, pay attention!":"Internal stuff, pay attention!", - "Advanced":"Advanced", - "advanced":"advanced", - "Enter PIN":"Enter PIN", - "The owner has restricted the access to this menu. Please enter the correct pin":"The owner has restricted the access to this menu. Please enter the correct pin", - "Restart the plugin":"Restart the plugin", - "Get my logs (copy the appearing link and open it in your browser, please)":"Get my logs (copy the appearing link and open it in your browser, please)", - "Copy the appearing link and open it in your browser, please":"Copy the appearing link and open it in your browser, please", - "Trigger find better subtitles":"Trigger find better subtitles", - "Skip next find better subtitles (sets last run to now)":"Skip next find better subtitles (sets last run to now)", - "Trigger subtitle storage maintenance":"Trigger subtitle storage maintenance", - "Trigger subtitle storage migration (expensive)":"Trigger subtitle storage migration (expensive)", - "Trigger cache maintenance (refiners, providers and packs/archives)":"Trigger cache maintenance (refiners, providers and packs/archives)", - "Apply configured default subtitle mods to all (active) stored subtitles":"Apply configured default subtitle mods to all (active) stored subtitles", - "Re-Apply mods of all stored subtitles":"Re-Apply mods of all stored subtitles", - "Log the plugin's scheduled tasks state storage":"Log the plugin's scheduled tasks state storage", - "Log the plugin's internal ignorelist storage":"Log the plugin's internal ignorelist storage", - "Log the plugin's complete state storage":"Log the plugin's complete state storage", - "Reset the plugin's scheduled tasks state storage":"Reset the plugin's scheduled tasks state storage", - "Reset the plugin's internal ignorelist storage":"Reset the plugin's internal ignorelist storage", - "Invalidate Sub-Zero metadata caches (subliminal)":"Invalidate Sub-Zero metadata caches (subliminal)", - "Reset provider throttle states":"Reset provider throttle states", - "Restarting the plugin":"Restarting the plugin", - "Restart triggered, please wait about 5 seconds":"Restart triggered, please wait about 5 seconds", - "Reset subtitle storage":"Reset subtitle storage", - "Are you sure?":"Are you sure?", - "Are you really sure?":"Are you really sure?", - "Success":"Success", - "Information Storage (%s) reset":"Information Storage (%s) reset", - "Information Storage (%s) logged":"Information Storage (%s) logged", - "FindBetterSubtitles triggered":"FindBetterSubtitles triggered", - "FindBetterSubtitles skipped":"FindBetterSubtitles skipped", - "SubtitleStorageMaintenance triggered":"SubtitleStorageMaintenance triggered", - "MigrateSubtitleStorage triggered":"MigrateSubtitleStorage triggered", - "TriggerCacheMaintenance triggered":"TriggerCacheMaintenance triggered", - "This may take some time ...":"This may take some time ...", - "Download Logs":"Download Logs", - "Sorry, feature unavailable":"Sorry, feature unavailable", - "Universal Plex token not available":"Universal Plex token not available", - "Copy this link and open this in your browser, please":"Copy this link and open this in your browser, please", - "Cache invalidated":"Cache invalidated", - "Enter PIN number ":"Enter PIN number ", - "PIN correct":"PIN correct", - "Reset":"Reset", - "Menu locked":"Menu locked", - "Provider throttles reset":"Provider throttles reset", - "Plex didn't return any information about the item, please refresh it and come back later":"Plex didn't return any information about the item, please refresh it and come back later", - "Item not found: %s!":"Item not found: %s!", - "< Back to %s":"< Back to %s", - "Back to %s > %s":"Back to %s > %s", - "Refresh: %s":"Refresh: %s", - "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk":"Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk", - "the movie":"the movie", - "the series":"the series", - "the episode":"the episode", - "the season":"the season", - "Force-find subtitles: %(item_title)s":"Force-find subtitles: %(item_title)s", - "Issues a forced refresh, ignoring known subtitles and searching for new ones":"Issues a forced refresh, ignoring known subtitles and searching for new ones", - "File %(file_part_index)s: ":"File %(file_part_index)s: ", - "%(part_summary)sNo current subtitle in storage":"%(part_summary)sNo current subtitle in storage", - "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "%(part_summary)sManage %(language)s subtitle":"%(part_summary)sManage %(language)s subtitle", - "%(part_summary)sList %(language)s subtitles":"%(part_summary)sList %(language)s subtitles", - "%(part_summary)sEmbedded subtitles (%(languages)s)":"%(part_summary)sEmbedded subtitles (%(languages)s)", - "Extract and activate embedded subtitle streams":"Extract and activate embedded subtitle streams", - "Select active %(language)s subtitle":"Select active %(language)s subtitle", - "%(count)d subtitles in storage":"%(count)d subtitles in storage", - "List available %(language)s subtitles":"List available %(language)s subtitles", - "Modify current %(language)s subtitle":"Modify current %(language)s subtitle", - "Currently applied mods: %(mod_list)s":"Currently applied mods: %(mod_list)s", - "Blacklist current %(language)s subtitle and search for a new one":"Blacklist current %(language)s subtitle and search for a new one", - "Manage blacklist (%(amount)s contained)":"Manage blacklist (%(amount)s contained)", - "Inspect currently blacklisted subtitles":"Inspect currently blacklisted subtitles", - "%(current_state)s%(subtitle_name)s, Score: %(score)s":"%(current_state)s%(subtitle_name)s, Score: %(score)s", - "Current: ":"Current: ", - "Stored: ":"Stored: ", - "Subtitle saved to disk":"Subtitle saved to disk", - "Remove subtitle from blacklist":"Remove subtitle from blacklist", - "by %(release_group)s":"by %(release_group)s", - "Current: %(provider_name)s (%(score)s) ":"Current: %(provider_name)s (%(score)s) ", - "Search for %(language)s subs (%(video_data)s)":"Search for %(language)s subs (%(video_data)s)", - "%(current_info)sFilename: %(filename)s":"%(current_info)sFilename: %(filename)s", - "No subtitles found":"No subtitles found", - "Searching for %(language)s subs (%(video_data)s), refresh here ...":"Searching for %(language)s subs (%(video_data)s), refresh here ...", - " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)":" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", - " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)":" (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", - "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s":"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", - "Release: %(release_info)s, Matches: %(matches)s":"Release: %(release_info)s, Matches: %(matches)s", - "Downloading subtitle for %(title_or_id)s":"Downloading subtitle for %(title_or_id)s", - "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods", - " (unknown)":" (unknown)", - " (forced)":" (forced)", - "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", - "Extracting of embedded subtitle %s of part %s:%s triggered":"Extracting of embedded subtitle %s of part %s:%s triggered", - "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "Insufficient permissions":"Insufficient permissions", - "Insufficient permissions on library %(title)s, folder: %(path)s":"Insufficient permissions on library %(title)s, folder: %(path)s", - "I'm not enabled!":"I'm not enabled!", - "Please enable me for some of your libraries in your server settings; currently I do nothing":"Please enable me for some of your libraries in your server settings; currently I do nothing", - "Working ... refresh here":"Working ... refresh here", - "Current state: %s; Last state: %s":"Current state: %s; Last state: %s", - "On-deck items":"On-deck items", - "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.", - "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", - "Recently-added items":"Recently-added items", - "Recently played items":"Recently played items", - "Shows the recently added items per section.":"Shows the recently added items per section.", - "Show recently added items with missing subtitles":"Show recently added items with missing subtitles", - "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list":"Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list", - "Browse all items":"Browse all items", - "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.":"Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.", - "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)":"Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", - "Last run: %s; Next scheduled run: %s; Last runtime: %s":"Last run: %s; Next scheduled run: %s; Last runtime: %s", - "Search for missing subtitles (in recently-added items, max-age: %s)":"Search for missing subtitles (in recently-added items, max-age: %s)", - "Automatically run periodically by the scheduler, if configured. %s":"Automatically run periodically by the scheduler, if configured. %s", - "Display ignore list (%(ignored_count)d)":"Display ignore list (%(ignored_count)d)", - "Show the current ignore list (mainly used for the automatic tasks)":"Show the current ignore list (mainly used for the automatic tasks)", - "History":"History", - "Show the last %i downloaded subtitles":"Show the last %i downloaded subtitles", - "Refresh":"Refresh", - "Re-lock menu(s)":"Re-lock menu(s)", - "Enabled the PIN again for menu(s)":"Enabled the PIN again for menu(s)", - "%(throttled_provider)s until %(until_date)s (%(reason)s)":"%(throttled_provider)s until %(until_date)s (%(reason)s)", - "Throttled providers: %s":"Throttled providers: %s", - "Advanced functions":"Advanced functions", - "Use at your own risk":"Use at your own risk", - "Items On Deck":"Items On Deck", - "Recently Played":"Recently Played", - "Items with missing subtitles":"Items with missing subtitles", - "Find recent items with missing subtitles":"Find recent items with missing subtitles", - "Updating, refresh here ...":"Updating, refresh here ...", - "Missing: %s":"Missing: %s", - "Add %(kind)s %(title)s to the ignore list":"Add %(kind)s %(title)s to the ignore list", - "Remove %(kind)s %(title)s from the ignore list":"Remove %(kind)s %(title)s from the ignore list", - "Didn't change the ignore list":"Didn't change the ignore list", - "%(title)s added to the ignore list":"%(title)s added to the ignore list", - "%(title)s removed from the ignore list":"%(title)s removed from the ignore list", - "Sections":"Sections", - "All":"All", - "Ignore %(kind)s \"%(title)s\"":"Ignore %(kind)s \"%(title)s\"", - "Un-ignore %(kind)s \"%(title)s\"":"Un-ignore %(kind)s \"%(title)s\"", - "show":"show", - "movie":"movie", - "Refreshing %(title)s":"Refreshing %(title)s", - "Force-refreshing %(title)s":"Force-refreshing %(title)s", - "Extracting subtitle %(stream_index)s of %(filename)s":"Extracting subtitle %(stream_index)s of %(filename)s", - "<< Back to home":"<< Back to home", - "Extract missing %(language)s embedded subtitles":"Extract missing %(language)s embedded subtitles", - "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications", - "Extract and activate %(language)s embedded subtitles":"Extract and activate %(language)s embedded subtitles", - "Extracts embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts embedded subtitles of all episodes for the current season with all configured default modifications", - "Auto-Find subtitles: %s":"Auto-Find subtitles: %s", - "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered", - "Triggering refresh for %(title)s":"Triggering refresh for %(title)s", - "Triggering forced refresh for %(title)s":"Triggering forced refresh for %(title)s", - "Refresh of item %(item_id)s triggered":"Refresh of item %(item_id)s triggered", - "Forced refresh of item %(item_id)s triggered":"Forced refresh of item %(item_id)s triggered", - "< Back to subtitle options for: %s":"< Back to subtitle options for: %s", - "Remove last applied mod (%s)":"Remove last applied mod (%s)", - "none":"none", - "None":"None", - "Idle":"Idle", - "Manage applied mods":"Manage applied mods", - "Reapply applied mods":"Reapply applied mods", - "Restore original version":"Restore original version", - "< Back to subtitle modification menu":"< Back to subtitle modification menu", - "subs constantly getting faster":"subs constantly getting faster", - "subs constantly getting slower":"subs constantly getting slower", - "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)":"%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", - "< Back to subtitle modifications":"< Back to subtitle modifications", - "Adjust by %(time_and_unit)s":"Adjust by %(time_and_unit)s", - "< Back to unit selection":"< Back to unit selection", - "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "Remove: %(mod_name)s":"Remove: %(mod_name)s", - "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Subtitle download failed (%(item_id)s)", - "Subtitle Language (1)":"Subtitle Language (1)", - "Subtitle Language (2)":"Subtitle Language (2)", - "Subtitle Language (3)":"Subtitle Language (3)", - "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)":"Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)", - "Only download foreign/forced subtitles":"Only download foreign/forced subtitles", - "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)":"Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", - "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)":"Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)", - "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")":"Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")", - "Embedded subtitles: Treat \"Undefined\" (und) as language 1":"Embedded subtitles: Treat \"Undefined\" (und) as language 1", - "I rename my files using":"I rename my files using", - "Retrieve original filename from .file_info/file_info index files (see wiki)":"Retrieve original filename from .file_info/file_info index files (see wiki)", - "Sonarr URL (add URL base if configured)":"Sonarr URL (add URL base if configured)", - "Sonarr API key":"Sonarr API key", - "Radarr URL (add URL base if configured, min. version: 0.2.0.897)":"Radarr URL (add URL base if configured, min. version: 0.2.0.897)", - "Radarr API key":"Radarr API key", - "Provider: Enable OpenSubtitles":"Provider: Enable OpenSubtitles", - "Opensubtitles Username":"Opensubtitles Username", - "Opensubtitles Password":"Opensubtitles Password", - "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)":"OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)", - "Provider: Enable Podnapisi.NET":"Provider: Enable Podnapisi.NET", - "Provider: Enable Titlovi.com":"Provider: Enable Titlovi.com", - "Provider: Enable Addic7ed":"Provider: Enable Addic7ed", - "Addic7ed Username":"Addic7ed Username", - "Addic7ed Password":"Addic7ed Password", - "Addic7ed: boost score (if requirements met)":"Addic7ed: boost score (if requirements met)", - "Addic7ed: Use random user agents":"Addic7ed: Use random user agents", - "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)":"Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", - "Legendas TV Username":"Legendas TV Username", - "Legendas TV Password":"Legendas TV Password", - "Provider: Enable TVsubtitles.net":"Provider: Enable TVsubtitles.net", - "Provider: Enable NapiProjekt.pl (Polish)":"Provider: Enable NapiProjekt.pl (Polish)", - "Provider: Enable SubScene (TV shows)":"Provider: Enable SubScene (TV shows)", - "Provider: Enable hosszupuskasub.com (Hungarian)":"Provider: Enable hosszupuskasub.com (Hungarian)", - "Provider: Enable aRGENTeaM (Spanish)":"Provider: Enable aRGENTeaM (Spanish)", - "Search enabled providers simultaneously (multithreading)":"Search enabled providers simultaneously (multithreading)", - "Automatically extract and use embedded subtitles upon media addition (with configured default mods)":"Automatically extract and use embedded subtitles upon media addition (with configured default mods)", - "After automatic extraction of embedded subtitles, also immediately search for available subtitles?":"After automatic extraction of embedded subtitles, also immediately search for available subtitles?", - "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?":"Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?", - "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?":"Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?", - "How strict should these subtitles existing on the filesystem be detected?":"How strict should these subtitles existing on the filesystem be detected?", - "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?":"Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?", - "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)":"Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)", - "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)":"Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)", - "Download hearing impaired subtitles.":"Download hearing impaired subtitles.", - "Remove Hearing Impaired tags from downloaded subtitles":"Remove Hearing Impaired tags from downloaded subtitles", - "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)":"Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)", - "Fix common issues in subtitles":"Fix common issues in subtitles", - "Fix common OCR errors in downloaded subtitles":"Fix common OCR errors in downloaded subtitles", - "Reverse punctuation in RTL languages (heb)":"Reverse punctuation in RTL languages (heb)", - "Change colors of subtitles to":"Change colors of subtitles to", - "Store subtitles next to media files (instead of metadata)":"Store subtitles next to media files (instead of metadata)", - "Subtitle formats to save (non-SRT only works if the previous option is enabled)":"Subtitle formats to save (non-SRT only works if the previous option is enabled)", - "Subtitle Folder (\"current folder\" is the folder the current media file lives in)":"Subtitle Folder (\"current folder\" is the folder the current media file lives in)", - "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)":"Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)", - "Fall back to metadata storage if filesystem storage failed":"Fall back to metadata storage if filesystem storage failed", - "Set subtitle file permissions to (integer, e.g.: 0775)":"Set subtitle file permissions to (integer, e.g.: 0775)", - "Automatically delete leftover/unused (externally saved) subtitles":"Automatically delete leftover/unused (externally saved) subtitles", - "On media playback: search for missing subtitles (refresh item)":"On media playback: search for missing subtitles (refresh item)", - "Scheduler: Periodically search for recent items with missing subtitles":"Scheduler: Periodically search for recent items with missing subtitles", - "Scheduler: Item age to be considered recent":"Scheduler: Item age to be considered recent", - "Scheduler: Recent items to consider per library":"Scheduler: Recent items to consider per library", - "Scheduler: Periodically search for better subtitles":"Scheduler: Periodically search for better subtitles", - "Scheduler: Days to search for better subtitles (max: 30 days)":"Scheduler: Days to search for better subtitles (max: 30 days)", - "Scheduler: Don't search for better subtitles if the item's air date is older than":"Scheduler: Don't search for better subtitles if the item's air date is older than", - "Scheduler: Overwrite manually selected subtitles when better found":"Scheduler: Overwrite manually selected subtitles when better found", - "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found":"Scheduler: Overwrite subtitles with non-default subtitle modifications when better found", - "History: amount of items to store historical data for":"History: amount of items to store historical data for", - "How many download tries per subtitle (on timeout or error)":"How many download tries per subtitle (on timeout or error)", - "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)":"Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)", - "Ignore anything in the following paths (comma-separated)":"Ignore anything in the following paths (comma-separated)", - "Sub-Zero mode":"Sub-Zero mode", - "Access PIN (any amount of numbers, 0-9)":"Access PIN (any amount of numbers, 0-9)", - "Access PIN valid for minutes":"Access PIN valid for minutes", - "Use PIN to restrict access to (needs plugin or PMS restart)":"Use PIN to restrict access to (needs plugin or PMS restart)", - "Call this executable upon successful subtitle download (see Wiki for details)":"Call this executable upon successful subtitle download (see Wiki for details)", - "Check for correct folder permissions of every library on plugin start":"Check for correct folder permissions of every library on plugin start", - "Use new style caching (for subliminal)":"Use new style caching (for subliminal)", - "Low impact mode (for remote filesystems)":"Low impact mode (for remote filesystems)", - "Timeout for API requests sent to the PMS":"Timeout for API requests sent to the PMS", - "HTTP proxy to use for providers (supports credentials)":"HTTP proxy to use for providers (supports credentials)", - "How verbose should the logging be?":"How verbose should the logging be?", - "How many log backups to keep?":"How many log backups to keep?", - "Log subtitle modification (debug)":"Log subtitle modification (debug)", - "Log to console (for development/debugging)":"Log to console (for development/debugging)", - "Collect anonymous usage statistics":"Collect anonymous usage statistics", - "Sonarr/Radarr (fill api info below)":"Sonarr/Radarr (fill api info below)", - "Filebot":"Filebot", - "Sonarr/Radarr/Filebot":"Sonarr/Radarr/Filebot", - "Symlink to original file":"Symlink to original file", - "I keep the original filenames":"I keep the original filenames", - "none of the above":"none of the above", - "exact: media filename match":"exact: media filename match", - "loose: filename contains media filename":"loose: filename contains media filename", - "any":"any", - "prefer":"prefer", - "don't prefer":"don't prefer", - "force HI":"force HI", - "force non-HI":"force non-HI", - "don't change":"don't change", - "white":"white", - "light-grey":"light-grey", - "red":"red", - "green":"green", - "yellow":"yellow", - "blue":"blue", - "magenta":"magenta", - "cyan":"cyan", - "black":"black", - "dark-red":"dark-red", - "dark-green":"dark-green", - "dark-yellow":"dark-yellow", - "dark-blue":"dark-blue", - "dark-magenta":"dark-magenta", - "dark-cyan":"dark-cyan", - "dark-grey":"dark-grey", - "current folder":"current folder", - "never":"never", - "current media item":"current media item", - "next episode (series)":"next episode (series)", - "hybrid: current item or next episode":"hybrid: current item or next episode", - "hybrid-plus: current item and next episode":"hybrid-plus: current item and next episode", - "every 6 hours":"every 6 hours", - "every 12 hours":"every 12 hours", - "every 24 hours":"every 24 hours", - "1 days":"1 days", - "2 days":"2 days", - "3 days":"3 days", - "4 days":"4 days", - "1 weeks":"1 weeks", - "2 weeks":"2 weeks", - "3 weeks":"3 weeks", - "4 weeks":"4 weeks", - "5 weeks":"5 weeks", - "6 weeks":"6 weeks", - "12 weeks":"12 weeks", - "don't limit":"don't limit", - "1 year":"1 year", - "2 years":"2 years", - "3 years":"3 years", - "4 years":"4 years", - "5 years":"5 years", - "6 years":"6 years", - "7 years":"7 years", - "8 years":"8 years", - "9 years":"9 years", - "10 years":"10 years", - "agent + interface":"agent + interface", - "only agent":"only agent", - "only interface":"only interface", - "disabled":"disabled", - "interface":"interface", - "advanced menu":"advanced menu", - "CRITICAL":"CRITICAL", - "ERROR":"ERROR", - "WARNING":"WARNING", - "INFO":"INFO", - "DEBUG":"DEBUG", - "Change the color of the subtitle":"Change the color of the subtitle", - "Adds the requested color to every line of the subtitle. Support depends on player.":"Adds the requested color to every line of the subtitle. Support depends on player.", - "Basic common fixes":"Basic common fixes", - "Fix common and whitespace/punctuation issues in subtitles":"Fix common and whitespace/punctuation issues in subtitles", - "Remove all style tags":"Remove all style tags", - "Removes all possible style tags from the subtitle, such as font, bold, color etc.":"Removes all possible style tags from the subtitle, such as font, bold, color etc.", - "Reverse punctuation in RTL languages":"Reverse punctuation in RTL languages", - "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew":"Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew", - "Change the FPS of the subtitle":"Change the FPS of the subtitle", - "Re-syncs the subtitle to the framerate of the current media file.":"Re-syncs the subtitle to the framerate of the current media file.", - "Remove Hearing Impaired tags":"Remove Hearing Impaired tags", - "Removes tags, text and characters from subtitles that are meant for hearing impaired people":"Removes tags, text and characters from subtitles that are meant for hearing impaired people", - "Fix common OCR issues":"Fix common OCR issues", - "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR":"Fix issues that happen when a subtitle gets converted from bitmap to text through OCR", - "Change the timing of the subtitle":"Change the timing of the subtitle", - "Adds or substracts a certain amount of time from the whole subtitle to match your media":"Adds or substracts a certain amount of time from the whole subtitle to match your media", - "Available":"Available", - "Current":"Current", - "Custom path to advanced_settings.json":"Custom path to advanced_settings.json" -} + "sq": "Albán", + "ar": "Arab", + "be": "Fehérorosz", + "bs": "Bosnyák", + "bg": "Bolgár", + "ca": "Katalán", + "zh": "Kínai", + "hr": "Horváth", + "cs": "Cseh", + "da": "Dán", + "nl": "Holland", + "en": "Angol", + "et": "Észt", + "fa": "Perzsa", + "fi": "Finn", + "fr": "Francia", + "de": "Németh", + "el": "Görög", + "he": "Héber", + "hi": "Hindu", + "hu": "Magyar", + "is": "Izlandi", + "id": "Indonéz", + "it": "Olasz", + "ja": "Japán", + "ko": "Koreai", + "lv": "Lett", + "lt": "Litván", + "mk": "Makedón", + "ms": "Maláj", + "no": "Norwég", + "pl": "Lengyel", + "pt": "Portugál", + "pt-br": "Portugál (Brazil)", + "ro": "Román", + "ru": "Orosz", + "sr": "Szerb", + "sr-cyrl": "Szerb (Cirill)", + "sr-latn": "Szerb (Latin)", + "sk": "Szlovák", + "sl": "Szlovén", + "es": "Spanyol", + "sv": "Svéd", + "th": "Thai", + "tr": "Török", + "uk": "Ukrán", + "vi": "Vietnámi", + "Internal stuff, pay attention!": "Belső dolog, figyelem!", + "Advanced": "Haladó", + "advanced": "haladó", + "Enter PIN": "Írd be a PIN-t", + "The owner has restricted the access to this menu. Please enter the correct pin": "A tulajdonos korlátozta a hozzáférést a menühöz. Kérlek írd be a jó pint-t", + "Restart the plugin": "Bővítmény újrainditása", + "Get my logs (copy the appearing link and open it in your browser, please)": "Logok lekérése (másold ki a megjelenő linket és nyisd meg a böngészőben)", + "Copy the appearing link and open it in your browser, please": "Másold ki a megjelenő linket és nyisd meg a böngészőben", + "Trigger find better subtitles": "Jobban passzoló feliratok keresése", + "Skip next find better subtitles (sets last run to now)": "Ugrás a következőre, keress jobb feliratot\n", + "Trigger subtitle storage maintenance": "Feliarttár karbantartás indítása", + "Trigger subtitle storage migration (expensive)": "Felirattár migrálás indítása (költséges)", + "Trigger cache maintenance (refiners, providers and packs/archives)": "Gyorsitótár karbantartás indítása (refiners, providers and packs/archives)", + "Apply configured default subtitle mods to all (active) stored subtitles": "Alapértelmezett módosítások alkalmazása az összes (aktív) feliratra", + "Re-Apply mods of all stored subtitles": "Módosítások újra alkalmazása az összes feliratra", + "Log the plugin's scheduled tasks state storage": "Bővítmény ütemezett feladatainak logolása", + "Log the plugin's internal ignorelist storage": "A bővítmény mellőzendő listájának naplózása.", + "Log the plugin's complete state storage": "Bővítmény teljes állapotának naplózása", + "Reset the plugin's scheduled tasks state storage": "Bővítmény ütemezett feladatainak visszaállítása", + "Reset the plugin's internal ignorelist storage": "A bővítmény mellőzendő listájának alaphelyzetbe állítása", + "Invalidate Sub-Zero metadata caches (subliminal)": "Sub-Zero metaadat tár érvénytelenítése (subliminal)", + "Reset provider throttle states": "Szolgáltató túlterhelési állapotának alaphelyzetbe állítása", + "Restarting the plugin": "Bővítmény újraindítása", + "Restart triggered, please wait about 5 seconds": "Újraindítás folyamatban, várj körülbelül 5 másodpercet", + "Reset subtitle storage": "Felirattár alaphelyzetbe állitása", + "Are you sure?": "Biztos vagy benne?", + "Are you really sure?": "Teljesen biztos vagy benne?", + "Success": "Sikerült", + "FindBetterSubtitles triggered": "Jobb felirat keresése elindítva", + "FindBetterSubtitles skipped": "Jobb felirat keresése kihagyva", + "SubtitleStorageMaintenance triggered": "Felirat tár karbantartás elindítva", + "MigrateSubtitleStorage triggered": "Felirat tár migrálás elindítva", + "TriggerCacheMaintenance triggered": "Gyorsítótár karbantartás elindítva", + "This may take some time ...": "Ez egy kis időt vehet igénybe ...", + "Download Logs": "Naplófájlok letöltése", + "Sorry, feature unavailable": "Sajnálom, ez a funkció nem elérhető", + "Universal Plex token not available": "Univerzális Plex Token nem elérhető", + "Copy this link and open this in your browser, please": "Kérlek másold ki ezt a linket és nyisd meg a böngésződben", + "Cache invalidated": "Gyorsítótár érvénytelenítse", + "Enter PIN number ": "Írd be a PIN kódot", + "PIN correct": "PIN elfogadva", + "Reset": "Alaphelyzetbe állitás", + "Menu locked": "Menü zárolva", + "Provider throttles reset": "Szolgáltató túlterhelés védelem apahelyzetbe állítása", + "Information Storage (%s) reset": "Információs tár ( %s) alaphelyzetbe állítása", + "Information Storage (%s) logged": "Információs tár (%s) naplózva", + "Plex didn't return any information about the item, please refresh it and come back later": "A plex nem adott vissza semmi információt az elemről. Frissítsd és gyere vissza később.", + "Item not found: %s!": "Elem nem található: %s!", + "< Back to %s": "< Vissza %s", + "Back to %s > %s": "Vissza %s > %s", + "Refresh: %s": "Frissítés: %s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Kényszerített frissítés, figyelmen kívül hagyja az ismert feliratokat és újakat keres", + "Extract and activate embedded subtitle streams": "Beágyazott felirat kitömörítése és aktiválása", + "Inspect currently blacklisted subtitles": "Feketelistás feliratok megvizsgálása", + "Subtitle saved to disk": "Felirat lemezre mentve", + "Remove subtitle from blacklist": "Felirat eltávolítása a feketelistáról", + "No subtitles found": "Felirat nem található", + " (unknown)": " (ismeretlen)", + " (forced)": " (kiegészítő felirat)", + "Extracting of embedded subtitle %s of part %s:%s triggered": "Beágyazott felirat %s of part %s:%s kitömörítése elindítva", + "Insufficient permissions": "Nincs elegendő engedély", + "I'm not enabled!": "Bővitmény nincs bekapcsolva", + "Please enable me for some of your libraries in your server settings; currently I do nothing": "Aktiválj valamelyik könyvtáradhoz a server beállításoknál.\njelenleg semmit nem csinálok.", + "Working ... refresh here": "Folyamatban ... Frissíts it", + "Current state: %s; Last state: %s": "Jelenlegi állapot: %s; Utolsó állapot: %s", + "On-deck items": "Lejátszás alatt lévő elemek", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "Mutassa a %s most játszott elemeket és adjon lehetőséget a metaadataik egyenként történő frissítésére,", + "Recently-added items": "Mostanában hozzáadott elemek", + "Recently played items": "Mostanában játszottak elemek", + "Shows the recently added items per section.": "Mostanában hozzáadott elemek mutatása könyvtáranként", + "Show recently added items with missing subtitles": "Mutasd a mostanában hozzáadott felirat nélküli elemeket", + "Browse all items": "Összes elme böngészése", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Végig megy a teljes könyvtáron és kezeli a mellőzendők listáját. Lehetőség van az egyes metaadatok és feliratok (erőltetett-) frissítésre is az egyes elemeknél.", + "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Utolsó futás: %s, Következő időzített futás: %s, Utolsó futás hossza: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)": "Hiányzó feliratok keresése (újonnan hozzáadott elemek, max. kor: %s)", + "Automatically run periodically by the scheduler, if configured. %s": "Automatikus futtatás az ütemező által konfigurálva. %s", + "Show the current ignore list (mainly used for the automatic tasks)": "Mellőzendő lista megjelenése (elsősorban automatikus feladatokhoz)", + "History": "Előzmények", + "Show the last %i downloaded subtitles": "Mutasd az utolsó %i letöltött feliratot", + "Refresh": "Frissités", + "Re-lock menu(s)": "menü(k) újrazárolása", + "Enabled the PIN again for menu(s)": "PIN újra engedélyezése a menü(k)-höz", + "Throttled providers: %s": "Túlterhelt szolgáltatók: %s", + "Advanced functions": "Fejlett funkciók", + "Use at your own risk": "Csak saját felelősségre használd", + "Items On Deck": "Lejátszás alatt álló elemek", + "Recently Played": "Mostanában játszott elemek", + "Items with missing subtitles": "Hiányzó felirattal rendelkező elemek", + "Find recent items with missing subtitles": "Mostanában hozzáadott hiányzó felirattal rendelkező elemek keresése", + "Updating, refresh here ...": "Frissítés folyamatban, frissíts itt ...", + "Missing: %s": "Hiányzó: %s", + "Didn't change the ignore list": "Ne változzon a mellőzendő lista ", + "Sections": "Könyvtárak", + "All": "Mind", + "show": "mutasd", + "movie": "Film", + "<< Back to home": "<< Vissza a kezdőképernyőre", + "Auto-Find subtitles: %s": "Felirat autó keresése: %s", + "Extracting of embedded subtitles for %s triggered": "Beágyazott felirat kitömörítése a %s -hez elindítva", + "< Back to subtitle options for: %s": "< Vissza a felirat beállításokhoz: %s", + "Remove last applied mod (%s)": "Utoljára alkalmazott (%s) módosítás visszavonása", + "none": "egyik sem", + "Manage applied mods": "Használatban lévő módositások kezelése", + "Reapply applied mods": "Módosítások újra alkalmazása", + "Restore original version": "Eredeti verzió visszaállítása", + "< Back to subtitle modification menu": "< Vissza a felirat módosítás menübe", + "subs constantly getting faster": "feliratok folyamatosan gyorsabbak lesznek", + "subs constantly getting slower": "feliratok folyamatosan lassabbak lesznek", + "< Back to subtitle modifications": "< Vissza a felirat módosításokhoz: %s", + "< Back to unit selection": "< Vissza a unit választáshoz", + "Subtitle Language (1)": "Felirat Nyelve (1)", + "Subtitle Language (2)": "Felirat Nyelve (2)", + "Subtitle Language (3)": "Felirat Nyelve (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "További felirat nyelvei (ISO-639-1 kódok vesszővel elválasztva)", + "Only download foreign/forced subtitles": "Csak külföldi / kényszerített feliratok letöltése", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Nyelvek megjelentetési az ISO 639-1 es kódolásnak megfelelő ország attribútummal (pl. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Ország attribútummal rendelkező nyelveket kezeljen ISO 639-1 esként (pl. ne töltsön le pt-BR-t ha pt már le van töltve)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Korlátozás egy nyelvre (nem adja hozzá a \".nyelv\"-et a felirat fájl nevéhez.)", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Beágyazott feliratok: \"Ismeretlen\" nyelvet úgy tekinti mintha az elsődleges lenne", + "I rename my files using": "Átneveztem a fájlokat a következő segitségével", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "Eredeti fájlnév meghatározása a .file_info/file_info index fájlokból. (lásd wiki)", + "Sonarr URL (add URL base if configured)": "Sonarr URL (base url hozzáadása ha be van állítva)", + "Sonarr API key": "Sonarr API kulcs", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "Radarr URL (base url hozzáadása ha be van állítva) min. verzió: 0.2.0.897", + "Radarr API key": "Radarr API kulcs", + "Provider: Enable OpenSubtitles": "Szolgáltató: OpenSubtitles használata", + "Opensubtitles Username": "Opensubtitles Felhasználónév", + "Opensubtitles Password": "Opensubtitles Jelszó", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "OpenSubtitles VIP? (hirdetésmentes feliratok, 1000 felirat/nap, VIP server: http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET": "Szolgáltató: Podnapisi.NET használata", + "Provider: Enable Titlovi.com": "Szolgáltató: Titlovi.com használata", + "Provider: Enable Addic7ed": "Szolgáltató: Titlovi.com használata", + "Addic7ed Username": "Addic7ed Felhasználónév", + "Addic7ed Password": "Addic7ed Jelszó", + "Addic7ed: boost score (if requirements met)": "Addic7ed: találati esély növelése (ha a feltételek teljesülnek)", + "Addic7ed: Use random user agents": "Addic7ed: Random \"user agent\" használata", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "Szolgáltató: Legendas TV használata (jellemzően pt-BR nyelvhez) ", + "Legendas TV Username": "Legendas TV felhasználói név", + "Legendas TV Password": "Legendas TV jelszó", + "Provider: Enable TVsubtitles.net": "Szolgáltató: Tvsubtitles.net engedélyezése", + "Provider: Enable NapiProjekt.pl (Polish)": "Szolgáltató: NapiProjekt.pl (Lengyel) engedélyezése", + "Provider: Enable SubScene (TV shows)": "Szolgáltató: SubScene (TV sorozatok) engedélyezése", + "Provider: Enable hosszupuskasub.com (Hungarian)": "Szolgáltató: hosszupuskasub.com (Magyar) engedélyezése", + "Provider: Enable aRGENTeaM (Spanish)": "Szolgáltató: aRGENTeaM (Spanyol) engedélyezése", + "Search enabled providers simultaneously (multithreading)": "Párhuzamos keresés az engedélyezett szolgáltatóknál ( multithreading )", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Automatikusan tömörítse ki és használja a beágyazott feliratot a media hozzáadásakor (a beállított alapmódosításokkal )", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "A beágyazott felirat automatikus kitömörítés után azonnal keressen elérhető feliratot?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "Ne keressen feliratot ahhoz a nyelvhez amihez van beágyazott felirat a média fájlban (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "Ne keressen feliratot olyan nyelvhez ami már megtalálható a fájlrendszeren (metaadat/fájlrendszer)", + "How strict should these subtitles existing on the filesystem be detected?": "Mennyire szigorúan nézze ezeknek a feliratoknak a meglétét a fájlrendszeren?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "Nem szöveg alapú feliratok használat (bármi más mint srt/.ssa/.ass/.vtt; beágyazott vagy külső)", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "Minimum pontszám Sorozatokhoz (min: 240, def/sane: 337, min-ideális: 352; bővebben: http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "Minimum pontszám Filmekhez (min: 60, def/sane: 69, min-ideal: 82; bővebben: http://v.ht/szscores)", + "Download hearing impaired subtitles.": "Halláskárosult feliratok letöltése", + "Remove Hearing Impaired tags from downloaded subtitles": "Halláskárosult címke törlése a letöltött feliratokról", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Stílus címkék törlése a letöltött feliratokról (vastag, dőlt, aláhúzott, színek, ...)", + "Fix common issues in subtitles": "Gyakori hibák javítása a feliratokban", + "Fix common OCR errors in downloaded subtitles": "Általános OCR hibák javítása a letöltött feliratokban", + "Reverse punctuation in RTL languages (heb)": "Fordított írásjelek RTL nyelveken (heb)", + "Change colors of subtitles to": "Felirat színének megváltoztatása erre", + "Store subtitles next to media files (instead of metadata)": "Feliratok tárolása a videó fájlok mellet (az adatbázis helyett)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Felirat mentési formátuma (a non-SRT csak akkor működik ha az előző opció be van kapcsolva)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "Felirat mappa (az \"aktuális mappa\" az az aktuális médiafájl mappája)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "Egyéni felirat mappa (felülbírálja a \"Felirat mappa\" -át, valós útvonalnak megfelelően)", + "Fall back to metadata storage if filesystem storage failed": "A fájlok tárolásának meghiúsulása esetén térjen vissza a metaadat-tároláshoz", + "Set subtitle file permissions to (integer, e.g.: 0775)": "Felirat fájl engedélyeinek beállítása erre (egész szám, például: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles": "Elhagyott/használatlan (egyénileg mentett) feliratok automatikus törlése", + "On media playback: search for missing subtitles (refresh item)": "Lejátszás esetén: keressen hiányzó feliratot ( elem frissítése )", + "Scheduler: Periodically search for recent items with missing subtitles": "Ütemező: Rendszeresen keressen feliratot a felirattal nem rendelkező friss elemekhez", + "Scheduler: Item age to be considered recent": "Ütemező: Elem frissnek tekinthető ha a kora", + "Scheduler: Recent items to consider per library": "Ütemező: Könyvtáranként ennyi elemet vegyen figyelembe mint friss", + "Scheduler: Periodically search for better subtitles": "Ütemező: Rendszeresen keressen jobb feliratot", + "Scheduler: Days to search for better subtitles (max: 30 days)": "Ütemező: Ennyi napig keressen jobb feliratot (max 30 nap)", + "Scheduler: Don't search for better subtitles if the item's air date is older than": "Ütemező: Ne keressen jobb feliratot ha az elem vetítési dátuma régebbi mint", + "Scheduler: Overwrite manually selected subtitles when better found": "Ütemező: Manuálisan kiválasztott felirat felülírása ha van jobb találat", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Ütemező: Írja felül a feliratot ha van jobb", + "History: amount of items to store historical data for": "Előzmények: ennyi elemnek tárolja az előzményeit", + "How many download tries per subtitle (on timeout or error)": "Hány letöltési próbálkozás történjen feliratonként (időtúllépés vagy hiba esetén)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "Mappák figyelmen kívül hagyása (amik tartalmazzák a \"subzero.ignore/.subzero.ignore/.nosz\" kifejezést)", + "Ignore anything in the following paths (comma-separated)": "Minden kihagyása a következő helyeken (vesszővel elválasztva)", + "Sub-Zero mode": "Sub-Zero mód", + "Access PIN (any amount of numbers, 0-9)": "PIN Hozzáférés (tetszőleges hosszuságú szám, 0-9)", + "Access PIN valid for minutes": "PIN hozzáférés ennyi percig valid: ", + "Use PIN to restrict access to (needs plugin or PMS restart)": "PIN használta hogy hozzáférj (Bővítmény vagy PMS újraindítás szükséges)", + "Call this executable upon successful subtitle download (see Wiki for details)": "Ennek a programnak az indítása sikeres felirat letöltés esetén (Részletek a Wiki-n)", + "Check for correct folder permissions of every library on plugin start": "Megfelelő mappa engedélyek ellenőrzése minden bővítmény indításnál", + "Use new style caching (for subliminal)": "Új stílusú gyorsitótár használata (subliminalhoz) ", + "Low impact mode (for remote filesystems)": "Alacsony hatású mód (távoli fájlrendszerek esetén)", + "Timeout for API requests sent to the PMS": "A PMS-hez küldött API-kérelmek időtúllépése", + "HTTP proxy to use for providers (supports credentials)": "HTTP proxy használata a szolgáltatók eléréséhez (supports credentials)", + "How verbose should the logging be?": "Milyen mértékű legyen a naplózás?", + "How many log backups to keep?": "Hány napló-mentés maradjon?", + "Log subtitle modification (debug)": "Felirat módosítások naplózása (Debug esetén)", + "Log to console (for development/debugging)": "Naplózás konzolra (fejlesztéshez/hiba kereséshez)", + "Collect anonymous usage statistics": "Anonim használati statisztikák gyűjtése", + "Sonarr/Radarr (fill api info below)": "Sonarr/Radarr (API infó kitöltése lent)", + "Filebot": "Filebot", + "Sonarr/Radarr/Filebot": "Sonarr/Radarr/Filebot", + "Symlink to original file": "Symlink az eredeti fájlra", + "I keep the original filenames": "Megtartottam az eredeti fájl neveket", + "none of the above": "Egyiksem", + "exact: media filename match": "pontos: média fájl neve egyezik", + "loose: filename contains media filename": "gyenge: fájlnév tartalmazza a média fájl nevét.", + "any": "bármelyik", + "prefer": "javasolt", + "don't prefer": "nem javasolt", + "force HI": "HI erőltetésé", + "force non-HI": "non-Hi eröltetése", + "don't change": "nincs módositás", + "white": "fehér", + "light-grey": "világos-szürke", + "red": "piros", + "green": "zöld", + "yellow": "sárga", + "blue": "kék", + "magenta": "magenta", + "cyan": "cián", + "black": "fekete", + "dark-red": "sötét-piros", + "dark-green": "sötét-zöld", + "dark-yellow": "sötét-sárga", + "dark-blue": "sötét-két", + "dark-magenta": "sötét-magenta", + "dark-cyan": "sötét-cián", + "dark-grey": "sötét-szürke", + "current folder": "jelenlegi mappa", + "never": "soha", + "current media item": "jelenlegi média elem", + "next episode (series)": "következő rész (sorozat)", + "hybrid: current item or next episode": "hybrid: jelenlegi elem vagy következő rész", + "hybrid-plus: current item and next episode": "hybrid-plus: jelenlegi elem és következő rész", + "every 6 hours": "6 óránként", + "every 12 hours": "12 óránként", + "every 24 hours": "24 óránként", + "1 days": "1 nap", + "2 days": "2 nap", + "3 days": "3 nap", + "4 days": "4 nap", + "1 weeks": "1 hét", + "2 weeks": "2 hét", + "3 weeks": "3 hét", + "4 weeks": "4 hét", + "5 weeks": "5 hét", + "6 weeks": "6 hét", + "12 weeks": "12 hét", + "don't limit": "Nem korlátozott", + "1 year": "1 év", + "2 years": "2 év", + "3 years": "3 év", + "4 years": "4 év", + "5 years": "5 év", + "6 years": "6 év", + "7 years": "7 év", + "8 years": "8 év", + "9 years": "9 év", + "10 years": "10 év", + "only agent": "csak ügynök", + "disabled": "inaktiv", + "advanced menu": "fejlett menü", + "CRITICAL": "CRITICAL", + "ERROR": "ERROR", + "WARNING": "WARNING", + "INFO": "INFO", + "DEBUG": "DEBUG", + "Force-find subtitles: %(item_title)s": "Erőltetett felirat keresés: %(item_title)s", + "File %(file_part_index)s: ": "Fájl %(file_part_index)s: ", + "%(part_summary)sNo current subtitle in storage": "%(part_summary)sNincs jelenlegi felirat", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sJelenlegi felirat: %(provider_name)s (hozzáadva: %(date_added)s, %(mode)s), Nyelv: %(language)s, Pontszám: %(score)i, Tárolás: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)sKezelje a(z) %(language)s feliratot", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)sListázza a(z) %(language)s feliratokat", + "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sBeágyazott feliratok (%(languages)s)", + "Select active %(language)s subtitle": "Aktív %(language)s felirat kiválasztása", + "%(count)d subtitles in storage": "%(count)d felirat tárolva", + "List available %(language)s subtitles": "%(language)s feliratok listázása", + "Modify current %(language)s subtitle": "%(language)s felirat módosítása", + "Currently applied mods: %(mod_list)s": "Már alkalmazott módosítások: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one": "Tegye feketelistára a mostani %(language)s feliratot és keressen újat", + "Manage blacklist (%(amount)s contained)": "Feketelista kezelése ((%(amount)s tartalmaz))", + "%(current_state)s%(subtitle_name)s, Score: %(score)s": "%(current_state)s%(subtitle_name)s, Pontszám: %(score)s", + "Current: ": "Jelenlegi: ", + "Stored: ": "Tárolt: ", + "by %(release_group)s": "%(release_group)s alapján", + "Current: %(provider_name)s (%(score)s) ": "Jelenlegi: %(provider_name)s (%(score)s)␣", + "Search for %(language)s subs (%(video_data)s)": "Keressen %(language)s feliratot (%(video_data)s)", + "%(current_info)sFilename: %(filename)s": "%(current_info)sFájlnév: %(filename)s", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "Keresés folyamatban a %(language)s felirathoz (%(video_data)s), \nSearching for %(language)s subs (%(video_data)s), frissíts itt ...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": " (rossz FPS, felirat: %(subtitle_fps)s, média: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": " (rossz FPS, felirat: %(subtitle_fps)s, média: ismeretlen, low impact mód)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, Pont: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s": "Release: %(release_info)s, Találatok: %(matches)s", + "Downloading subtitle for %(title_or_id)s": "Felirat letöltése ehhez: %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Tömöritsd ki a stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s alap beállításokkal", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "Tömörítsd ki a sream %(stream_index)s -t, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (hozzáadva: %(date_added)s, %(mode)s), Nyelv: %(language)s, Pontszám: %(score)i, Tárolás: %(storage_type)s", + "Insufficient permissions on library %(title)s, folder: %(path)s": "Nem megfelelő jogosultság ehhez %(title)s, mappa: %(path)s", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Folyamatban: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Display ignore list (%(ignored_count)d)": "Mutasd a mellőzendők listáját (%(ignored_count)d)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s %(until_date)s ig (%(reason)s)", + "Extracting subtitle %(stream_index)s of %(filename)s": "Felirat kitömörítése %(stream_index)s a %(filename)s -ból", + "Extract missing %(language)s embedded subtitles": "Hiányzó %(language)s beágyazott felirat kitömörítése", + "Extract and activate %(language)s embedded subtitles": "Beágyazott %(language)s felirat kitömörítése és aktiválása", + "None": "Egyik sem", + "Idle": "Tétlen", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "Adjust by %(time_and_unit)s": "Igazítás %(time_and_unit)s -val ", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "Hozzáadva: %(date_added)s, %(mode)s, Nyelv: %(language)s, Pontszám: %(score)i, Tárolás: %(storage_type)s", + "Remove: %(mod_name)s": "Eltávolít: %(mod_name)s", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Felirat letöltés nem sikerült (%(item_id)s)", + "agent + interface": "Ügynök + interfész", + "only interface": "Csak interfész", + "interface": "Interfész", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "Mutassa a most játszott elemeket, és adjon lehetősége egyesével történő metaadat/felirat frissítéshez", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "Hiányzó felirattal rendelkező elemek listázása. Kattints a \"Mostanában hozzáadott hiányzó felirattal rendelkező elemek keresése\"-re hogy frissítsd a listát", + "Add %(kind)s %(title)s to the ignore list": "%(kind)s %(title)s hozzáadása a listára", + "Remove %(kind)s %(title)s from the ignore list": "%(kind)s %(title)s eltávolítása a listáról ", + "%(title)s added to the ignore list": "%(title)s hozzáadva a listára", + "%(title)s removed from the ignore list": "%(title)s kivéve a listáról", + "Triggering refresh for %(title)s": "Frissítés indítása a(z) %(title)s -hez", + "Triggering forced refresh for %(title)s": "Erőltetett frissítés indítása a(z) %(title)s -hez", + "Refresh of item %(item_id)s triggered": "Frissítés a %(item_id)s elemhez elindítva", + "Forced refresh of item %(item_id)s triggered": "Erőltetett frissítés a %(item_id)s elemhez elindítva", + "Ignore %(kind)s \"%(title)s\"": "Hagyd figyelmen kívül: %(kind)s \"%(title)s\"", + "Un-ignore %(kind)s \"%(title)s\"": "Ne hagyd figyelmen kívül: Un-ignore %(kind)s \"%(title)s\"", + "Refreshing %(title)s": "Frissítés: %(title)s", + "Force-refreshing %(title)s": "Erőltetett frissítés: %(title)s", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "A még nem kitömörített beágyazott feliratok kitömörítése a kiválasztott évad összes részéből az összes beállított alapmódosítással", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "A beágyazott feliratok kitömörítése a kiválasztott évad összes részéből az összes beállított alapmódosítással", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Frissítse %(the_movie_series_season_episode)s, új feliratot keres vagy hozzáad a meghajtón lévőkből.", + "the movie": "a film", + "the series": "a sorozat", + "the episode": "az epizód", + "the season": "az évadot", + "Change the color of the subtitle": "Felirat színének megváltoztatása", + "Adds the requested color to every line of the subtitle. Support depends on player.": "Kért szín hozzáadása a felirat minden sorához. Támogatása a lejátszótól függ.", + "Basic common fixes": "Általános alap javítások", + "Fix common and whitespace/punctuation issues in subtitles": "Általános szóköz/írásjel hibák javítása a feliratokban", + "Remove all style tags": "Minden stílus tag eltávolítása", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.": "Eltávolítja az összes lehetséges stílust a feliratból, például betűtípus, félkövér, szín stb.", + "Reverse punctuation in RTL languages": "Fordított írásjelek RTL nyelveken", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew": "Néhány lejátszóeszköz nem megfelelően kezeli a jobbról balra történő írásnál az írásjeleket. Fizikálisan felcseréli az írásjeleket. A következő nyelvekhez alkalmazható: héber", + "Change the FPS of the subtitle": "Feliratok FPS-ének megváltoztatása", + "Re-syncs the subtitle to the framerate of the current media file.": "Felirat képkocka-sebességének szinkronizálása az aktuális médiához", + "Remove Hearing Impaired tags": "Hallássérülteknek szánt információ eltávolitása ", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people": "Hallás sérültek számára hozzáadott szövegek, karakterek, tagek eltávolítása a feliratokból.", + "Fix common OCR issues": "Általános OCR hibák javitása", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR": "Felirat képből szöveggé történő átalakítása(OCR) során keletkezett hibák javítása", + "Change the timing of the subtitle": "Felirat időzítésének módosítása", + "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Hozzáad vagy elvesz a feliratból egy bizonyos időtartamot hogy illeszkedjen a médiához.", + "Available": "Elérhető", + "Current": "Jelenlegi", + "Custom path to advanced_settings.json": "Egyéni útvonal az advanced_settings.json fájlhoz" +} \ No newline at end of file From d1935a4439a069991d0949fa793759ce76f52da5 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 15 Jun 2018 04:58:00 +0200 Subject: [PATCH 116/710] i18n: fix danish placeholders --- Contents/Strings/da.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Strings/da.json b/Contents/Strings/da.json index e77f34407..24cf12cf4 100644 --- a/Contents/Strings/da.json +++ b/Contents/Strings/da.json @@ -120,11 +120,11 @@ "Browse all items": "Gennemse alle media", "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Gå igennem hele dit bibliotek og håndter din ignorer-liste. Du kan også (gennemtvinge) en opdatering af metadata/undertekster og de enkelte elementer.", "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Sidste gennemgang: %s; Næste planlagte gennemgang: %s; Sidste gennemløbs tid: %s", - "Search for missing subtitles (in recently-added items, max-age: %s)": "Søg efter manglende undertekster (blandt de sidste tilføjede titler, maksimal alder: &s)", + "Search for missing subtitles (in recently-added items, max-age: %s)": "Søg efter manglende undertekster (blandt de sidste tilføjede titler, maksimal alder: %s)", "Automatically run periodically by the scheduler, if configured. %s": "Automatisk periodisk gennemløb af jobplanlæggeren, såfremt konfigureret. %s.", "Show the current ignore list (mainly used for the automatic tasks)": "Hvis den nuværende ignorer liste (hovedsageligt brugt for de automatiske opgaver)", "History": "Historie", - "Show the last %i downloaded subtitles": "Vis de sidste &s hentede undertekster", + "Show the last %i downloaded subtitles": "Vis de sidste %i hentede undertekster", "Refresh": "Opdater", "Re-lock menu(s)": "Gen aflås meny(er)", "Enabled the PIN again for menu(s)": "Aktiver PIN igen for meny(er)", From 648725813687d6b0002a963213ad5fdf0ff16bd0 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 15 Jun 2018 04:58:29 +0200 Subject: [PATCH 117/710] i18n: revert to english in case of error --- Contents/Code/support/i18n.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/i18n.py b/Contents/Code/support/i18n.py index 884c131e8..92ac9eebd 100644 --- a/Contents/Code/support/i18n.py +++ b/Contents/Code/support/i18n.py @@ -79,7 +79,11 @@ def local_string_with_optional_format(key, *args, **kwargs): if args: # fixme: may not be the best idea as this evaluates the string early - return unicode(SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale), args)) + try: + return unicode(SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale), args)) + except TypeError: + Log.Exception("Broken translation!") + return unicode(SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, "en"), args)) # check string instances for arguments if config.debug_i18n: @@ -87,7 +91,12 @@ def local_string_with_optional_format(key, *args, **kwargs): if msg: return msg - return unicode(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale)) + try: + return unicode(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale)) + + except TypeError: + Log.Exception("Broken translation!") + return unicode(plex_i18n_module.LocalString(core, key, "en")) _ = local_string_with_optional_format From 54bd222605beb7a3e78d5d460a6c4c44c877ea0a Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 15 Jun 2018 04:58:43 +0200 Subject: [PATCH 118/710] core: fix plugin_pin_mode --- Contents/Code/interface/menu.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 5fe1aed35..9c52b9600 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -296,16 +296,16 @@ def ValidatePrefs(): update_dict = True restart = True - if "plugin_pin_mode" not in Dict: + if "plugin_pin_mode2" not in Dict: update_dict = True - elif Dict["plugin_pin_mode"] != Prefs["plugin_pin_mode"]: + elif Dict["plugin_pin_mode2"] != Prefs["plugin_pin_mode2"]: update_dict = True restart = True if update_dict: Dict["channel_enabled"] = config.enable_channel - Dict["plugin_pin_mode"] = Prefs["plugin_pin_mode"] + Dict["plugin_pin_mode2"] = Prefs["plugin_pin_mode2"] Dict.Save() if restart: From a07d5aa440a09276ce821841844ef94cd59bbc62 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 15 Jun 2018 05:38:39 +0200 Subject: [PATCH 119/710] addic7ed: cache login data instead of re-login per search --- Contents/Code/support/config.py | 3 +- .../subliminal_patch/providers/addic7ed.py | 42 +++++++++++++++++-- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 2e5808068..bf9ecd8cc 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -12,7 +12,7 @@ import subliminal_patch import subzero.constants import lib -from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded +from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded, AuthenticationError from subliminal_patch.core import is_windows_special_path from whichdb import whichdb @@ -70,6 +70,7 @@ def int_or_default(s, default): }, "addic7ed": { DownloadLimitExceeded: (datetime.timedelta(hours=24), "24 hours"), + AuthenticationError: (datetime.timedelta(minutes=10), "5 minutes"), } } diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 72e1d0b71..f12c458d9 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -5,8 +5,10 @@ import subliminal import time from random import randint +from dogpile.cache.api import NO_VALUE +from requests import Session -from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded +from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded, AuthenticationError from subliminal.providers.addic7ed import Addic7edProvider as _Addic7edProvider, \ Addic7edSubtitle as _Addic7edSubtitle, ParserBeautifulSoup, show_cells_re from subliminal.cache import region @@ -70,14 +72,46 @@ def __init__(self, username=None, password=None, use_random_agents=False): self.USE_ADDICTED_RANDOM_AGENTS = use_random_agents def initialize(self): - # patch: add optional user agent randomization - super(Addic7edProvider, self).initialize() + self.session = Session() + self.session.headers['User-Agent'] = 'Subliminal/%s' % subliminal.__short_version__ + if self.USE_ADDICTED_RANDOM_AGENTS: from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST - logger.debug("addic7ed: using random user agents") + logger.debug("Addic7ed: using random user agents") self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)] self.session.headers['Referer'] = self.server_url + # login + if self.username and self.password: + ccks = region.get("addic7ed_cookies", expiration_time=86400) + do_login = False + if ccks != NO_VALUE: + self.session.cookies.update(ccks) + r = self.session.get(self.server_url + 'panel.php', allow_redirects=False, timeout=10) + if r.status_code == 302: + logger.info('Addic7ed: Login expired') + do_login = True + else: + logger.info('Addic7ed: Reusing old login') + self.logged_in = True + + if do_login: + logger.info('Addic7ed: Logging in') + data = {'username': self.username, 'password': self.password, 'Submit': 'Log in'} + r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10) + + #if "relax, slow down" in r.content: + # pass + + if r.status_code != 302: + raise AuthenticationError(self.username) + + region.set("addic7ed_cookies", r.cookies) + + logger.debug('Addic7ed: Logged in') + self.logged_in = True + + @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME) def _get_show_ids(self): """Get the ``dict`` of show ids per series by querying the `shows.php` page. From b9ebd4e1d6d8f27c5fd7362a31c777e02ad9869a Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 15 Jun 2018 15:03:03 +0200 Subject: [PATCH 120/710] addic7ed: reduce DownloadLimitExceeded to 3 hours --- Contents/Code/support/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index bf9ecd8cc..26abdca81 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -69,7 +69,7 @@ def int_or_default(s, default): DownloadLimitExceeded: (datetime.timedelta(hours=6), "6 hours"), }, "addic7ed": { - DownloadLimitExceeded: (datetime.timedelta(hours=24), "24 hours"), + DownloadLimitExceeded: (datetime.timedelta(hours=2), "3 hours"), AuthenticationError: (datetime.timedelta(minutes=10), "5 minutes"), } } From de8aaaa5e52a25c8c989f4714b9fdc832f872cd5 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 15 Jun 2018 15:05:02 +0200 Subject: [PATCH 121/710] addic7ed: raise TooManyRequests and throttle in case of too frequent login --- Contents/Code/support/config.py | 2 +- .../Libraries/Shared/subliminal_patch/providers/addic7ed.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 26abdca81..e90568320 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -70,7 +70,7 @@ def int_or_default(s, default): }, "addic7ed": { DownloadLimitExceeded: (datetime.timedelta(hours=2), "3 hours"), - AuthenticationError: (datetime.timedelta(minutes=10), "5 minutes"), + TooManyRequests: (datetime.timedelta(minutes=5), "5 minutes"), } } diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index f12c458d9..269dd6aa9 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -100,8 +100,8 @@ def initialize(self): data = {'username': self.username, 'password': self.password, 'Submit': 'Log in'} r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10) - #if "relax, slow down" in r.content: - # pass + if "relax, slow down" in r.content: + raise TooManyRequests(self.username) if r.status_code != 302: raise AuthenticationError(self.username) From 2cb077423db81ddb63a594f5c667fe557a5076e1 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 15 Jun 2018 15:05:28 +0200 Subject: [PATCH 122/710] addic7ed: use correct throttle hours --- Contents/Code/support/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index e90568320..cb8e7ca39 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -69,7 +69,7 @@ def int_or_default(s, default): DownloadLimitExceeded: (datetime.timedelta(hours=6), "6 hours"), }, "addic7ed": { - DownloadLimitExceeded: (datetime.timedelta(hours=2), "3 hours"), + DownloadLimitExceeded: (datetime.timedelta(hours=3), "3 hours"), TooManyRequests: (datetime.timedelta(minutes=5), "5 minutes"), } } From 42cc500b051fccf6ae912a39e45fdfdc8c0d1949 Mon Sep 17 00:00:00 2001 From: pannal Date: Fri, 15 Jun 2018 15:11:10 +0200 Subject: [PATCH 123/710] Update de.json (POEditor.com) --- Contents/Strings/de.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 614950d48..2ab39e6a3 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -396,5 +396,7 @@ "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Verschiebt den Untertitel um eine bestimmte Zeiteinheit", "Available": "Verfügbar", "Current": "Aktuell", - "Custom path to advanced_settings.json": "Spezifischer Pfad zu advanced_settings.json" + "Custom path to advanced_settings.json": "Spezifischer Pfad zu advanced_settings.json", + "zh-hant": "Chinesisch (traditionell)", + "zh-hans": "Chinesisch (vereinfacht)" } \ No newline at end of file From d23c44589ed059933b55e60c6f67137d9cc48576 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 15 Jun 2018 15:22:11 +0200 Subject: [PATCH 124/710] assrt/supersubtitles: adjust code style --- .../subliminal_patch/providers/assrt.py | 2 + .../providers/supersubtitles.py | 73 +++++++++---------- 2 files changed, 35 insertions(+), 40 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/assrt.py b/Contents/Libraries/Shared/subliminal_patch/providers/assrt.py index 3ba011291..67300dd0b 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/assrt.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/assrt.py @@ -22,6 +22,7 @@ server_url = 'https://api.assrt.net/v1' supported_languages = language_converters['assrt'].to_assrt.keys() + class AssrtSubtitle(Subtitle): """Assrt Sbutitle.""" provider_name = 'assrt' @@ -90,6 +91,7 @@ def get_matches(self, video): matches = guess_matches(video, guessit(self.video_name)) return matches + class AssrtProvider(Provider): """Assrt Provider.""" languages = {Language(*l) for l in supported_languages} diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py index 53d9de1e1..d813764da 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py @@ -69,7 +69,7 @@ def __init__(self, language, page_link, subtitle_id, series, season, episode, ve self.is_pack = True def numeric_id(self): - return subtitle_id + return self.subtitle_id def __repr__(self): ep_addon = (" S%02dE%02d" % (self.season, self.episode)) if self.episode else "" @@ -179,7 +179,7 @@ def find_imdb_id(self, sub_id): for value in links: if "imdb.com" in str(value): # iMDB - imdb_id = re.findall(r"(?<=www.imdb.com\/title\/).*(?=\/\")", str(value))[0] + imdb_id = re.findall(r'(?<=www\.imdb\.com/title/).*(?=/")', str(value))[0] return imdb_id return None @@ -222,7 +222,7 @@ def find_id(self, series, year, original_title): except IndexError: continue - result_title = result_title.strip().replace("", "").replace(" ", ".") + result_title = result_title.strip().replace("�", "").replace(" ", ".") guessable = result_title.strip() + ".s01e01." + result_year guess = guessit(guessable, {'type': "episode"}) @@ -235,50 +235,44 @@ def find_id(self, series, year, original_title): def query(self, series, video=None): year = video.year + subtitle = None if isinstance(video, Episode): series = video.series season = video.season episode = video.episode - guess = guessit(series, {'type': "episode"}) - series_id = None #seriesa = series.replace(' ', '+') - title = series + str(season) + str(episode) # Get ID of series with original name series_id = self.find_id(series, year, series) if not series_id: # If not founded try without ' char modified_series = series.replace(' ', '+').replace('\'', '') series_id = self.find_id(modified_series, year, series) - if not series_id: - # If still not founded try with the longest word is series title - modified_series = modified_series.split('+') - modified_series = max(modified_series, key=len) - series_id = self.find_id(modified_series, year, series) - if not series_id: - return None - - if isinstance(video, Movie): - guess = guessit(series, {'type': "movie"}) - season = None - episode = None - title = series.replace(" ", "+") + if not series_id and modified_series: + # If still not founded try with the longest word is series title + modified_series = modified_series.split('+') + modified_series = max(modified_series, key=len) + series_id = self.find_id(modified_series, year, series) - # get the episode page - if isinstance(video, Episode): + if not series_id: + return None # https://www.feliratok.info/index.php?search=&soriSorszam=&nyelv=&sorozatnev=&sid=2075&complexsearch=true&knyelv=0&evad=6&epizod1=16&cimke=0&minoseg=0&rlsr=0&tab=all url = self.server_url + "index.php?search=&soriSorszam=&nyelv=&sorozatnev=&sid=" + \ - str(series_id) + "&complexsearch=true&knyelv=0&evad=" + str(season) + "&epizod1="+str(episode)+"&cimke=0&minoseg=0&rlsr=0&tab=all" + str(series_id) + "&complexsearch=true&knyelv=0&evad=" + str(season) + "&epizod1=" + str( + episode) + "&cimke=0&minoseg=0&rlsr=0&tab=all" subtitle = self.process_subs(series, video, url) - if subtitle == []: + if not subtitle: # No Subtitle found. Maybe already archived to season pack url = self.server_url + "index.php?search=&soriSorszam=&nyelv=&sorozatnev=&sid=" + \ - str(series_id) + "&complexsearch=true&knyelv=0&evad=" + str( season) + "&epizod1=&evadpakk=on&cimke=0&minoseg=0&rlsr=0&tab=all" + str(series_id) + "&complexsearch=true&knyelv=0&evad=" + str( + season) + "&epizod1=&evadpakk=on&cimke=0&minoseg=0&rlsr=0&tab=all" subtitle = self.process_subs(series, video, url) if isinstance(video, Movie): + title = series.replace(" ", "+") + # https://www.feliratok.info/index.php?search=The+Hitman%27s+BodyGuard&soriSorszam=&nyelv=&tab=film url = self.server_url + "index.php?search=" + title + "&soriSorszam=&nyelv=&tab=film" subtitle = self.process_subs(series, video, url) @@ -287,7 +281,6 @@ def query(self, series, video=None): def process_subs(self, series, video, url): - year = video.year subtitles = [] logger.info('URL for subtitles %s', url) @@ -304,52 +297,52 @@ def process_subs(self, series, video, url): sub_hun_name = table.findAll("div", {"class": "magyar"})[0] if isinstance(video, Episode): if "vad)" not in str(sub_hun_name): - #
A pletykafszek (3. vad)
- sub_hun_name = re.findall(r"(?<=\
).*(?= -)", str(sub_hun_name))[0] + #
A pletykaf�szek (3. �vad)
+ sub_hun_name = re.findall(r'(?<=
).*(?= -)', str(sub_hun_name))[0] else: - #
A holnap legendi - 3x11
- sub_hun_name = re.findall(r"(?<=\
).*(?= \()", str(sub_hun_name))[0] + #
A holnap legend�i - 3x11
+ sub_hun_name = re.findall(r'(?<=
).*(?= \()', str(sub_hun_name))[0] if isinstance(video, Movie): - sub_hun_name = re.findall(r"(?<=
).*(?=<\/div)", str(sub_hun_name))[0] + sub_hun_name = re.findall(r'(?<=
).*(?=Gossip Girl (Season 3) (DVDRip-REWARD)
] - sub_english_name = re.findall(r"(?<=\
).*?(?= -)", str(sub_english))[0] + sub_english_name = re.findall(r'(?<=
).*?(?= -)', str(sub_english))[0] sub_season = int((re.findall(r"(?<=- ).*?(?= - )", str(sub_english))[0].split('x')[0]).strip()) sub_episode = int((re.findall(r"(?<=- ).*?(?= - )", str(sub_english))[0].split('x')[1]).strip()) else: # [
DC's Legends of Tomorrow - 3x11 - Here I Go Again (HDTV-AFG, HDTV-RMX, 720p-SVA, 720p-PSA
] sub_english_name = \ - re.findall(r"(?<=\
).*?(?=\(Season)", str(sub_english))[0] + re.findall(r'(?<=
).*?(?=\(Season)', str(sub_english))[0] sub_season = int(re.findall(r"(?<=Season )\d+(?=\))", str(sub_english))[0]) sub_episode = int(video.episode) if isinstance(video, Movie): - asked_for_episode = None - sub_english_name = re.findall(r"(?<=\
).*?(?=\()", str(sub_english))[0] - sub_season = None - sub_episode = None + sub_english_name = re.findall(r'(?<=
).*?(?=\()', str(sub_english))[0] sub_version = (str(sub_english).split('(')[len(str(sub_english).split('(')) - 1]).split(')')[0] # Angol lang = table.findAll("small")[0] - sub_language = self.get_language(re.findall(r"(?<=).*(?=<\/small>)", str(lang))[0]) + sub_language = self.get_language(re.findall(r"(?<=).*(?=)", str(lang))[0]) # link = str(table.findAll("a")[len(table.findAll("a")) - 1]).replace("amp;", "") - sub_downloadlink = self.server_url + re.findall(r"(?<=href=\"\/).*(?=\"\>)", link)[0] + sub_downloadlink = self.server_url + re.findall(r'(?<=href="/).*(?=">)', link)[0] sub_id = re.findall(r"(?<=felirat\=).*(?=\"\>)", link)[0] sub_year = video.year sub_releases = [s.strip() for s in sub_version.split(',')] # For episodes we open the series page so all subtitles imdb_id must be the same. no need to check all - if (isinstance(video, Episode) and series_imdb_id is not None): + if isinstance(video, Episode) and series_imdb_id is not None: sub_imdb_id = series_imdb_id else: sub_imdb_id = self.find_imdb_id(sub_id) @@ -394,4 +387,4 @@ def download_subtitle(self, subtitle): archive = ZipFile(archive_stream) subtitle.content = self.get_subtitle_from_archive(subtitle, archive) else: - subtitle.content = fix_line_ending(r.content) \ No newline at end of file + subtitle.content = fix_line_ending(r.content) From fbc5069fb833a8168ec5be2c45a00047505384f4 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 15 Jun 2018 15:42:10 +0200 Subject: [PATCH 125/710] submod: HI: be less aggressive with HI_before_colon_noncaps; fixes #510 --- .../subzero/modification/mods/hearing_impaired.py | 11 ++++++----- Contents/Libraries/Shared/test.srt | 3 +++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py index 1968a99ef..4b92034d5 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py @@ -54,11 +54,12 @@ class HearingImpaired(SubtitleTextModification): # any text before colon (at least 3 chars); at start or after a sentence, # possibly with a dash in front; try not breaking actual sentences with a colon at the end by not matching if - # more than one space is inside the text; ignore anything ending with a quote - NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"]))([\s-]*(?=[A-zÀ-ž&+]\s*[A-zÀ-ž&+]\s*[A-zÀ-ž&+])' - ur'[A-zÀ-ž-_0-9\s\"\'&+]+:(?![\"’ʼ❜‘‛”“‟„])\s*)(?![0-9])'), - lambda match: match.group(1) if (match.group(1).count(" ") > 1 - or match.group(1).count("-") > 1) else "", + # a space is inside the text; ignore anything ending with a quote + NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"]))([\s-]*((?=[A-zÀ-ž&+]\s*[A-zÀ-ž&+]\s*[A-zÀ-ž&+])' + ur'[A-zÀ-ž-_0-9\s\"\'&+]+:)(?![\"’ʼ❜‘‛”“‟„])\s*)(?![0-9])'), + lambda match: + match.group(1) if (match.group(2).count(" ") > 0 or match.group(1).count("-") > 0) + else "" if not match.group(1).startswith(" ") else " ", name="HI_before_colon_noncaps"), # text in brackets at start, after optional dash, before colon or at end of line diff --git a/Contents/Libraries/Shared/test.srt b/Contents/Libraries/Shared/test.srt index a7dc4dd78..ef05aa5ab 100644 --- a/Contents/Libraries/Shared/test.srt +++ b/Contents/Libraries/Shared/test.srt @@ -3,6 +3,9 @@ (WHOOSHING) This is a phone number: 123 4325 123 H i. But not MATCH hindrance. +Ja, det är väl det. Tack och lov +att HD:s beslut var så solklart. +But this should. Peter: Yello! 2 00:00:10,759 --> 00:00:12,678 From 237eafed357879861b224c6d5d2a19cdf3c000b2 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 15 Jun 2018 15:50:39 +0200 Subject: [PATCH 126/710] release 2.5.7.2663 --- CHANGELOG.md | 8 ++++++++ Contents/Info.plist | 4 ++-- README.md | 22 ++++++++++++++++------ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 554188a5f..588f33a24 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,12 @@ +2.5.4.2541 + +- core: try retrieving advanced_settings.json from the path given, which may be a file path or a directory +- menu: ignore options: fix plugin not responding, fix unicode strings; resolve #509 +- providers: addic7ed: fix usage/adapt to new show search method +- providers: opensubtitles: properly handle responses again, re-enable automatic throttling based on those (broken since XMLRPC handler rewrite) + + 2.5.4.2527 - core: bugfixes diff --git a/Contents/Info.plist b/Contents/Info.plist index bdce62aae..bd62ef06f 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.5.4.2562 + 2.5.7.2663 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.4.2562 DEV +Version 2.5.7.2663 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 14fbb7d75..e8099e02a 100644 --- a/README.md +++ b/README.md @@ -77,12 +77,22 @@ Jacob K, Ninjouz, chopeta, fvb, Jose ## Changelog -2.5.4.2541 - -- core: try retrieving advanced_settings.json from the path given, which may be a file path or a directory -- menu: ignore options: fix plugin not responding, fix unicode strings; resolve #509 -- providers: addic7ed: fix usage/adapt to new show search method -- providers: opensubtitles: properly handle responses again, re-enable automatic throttling based on those (broken since XMLRPC handler rewrite) +2.5.7.2663 +- implement translations for the channel and the settings +- i18n: German (myself) +- i18n: Danish (thanks Uthman, Claus Møller, dane22) +- i18n: Dutch (thanks jippo015, Semi Doludizgin, Rafael) +- i18n: Hungarian (thanks Morpheus1333, sugarman402) +- i18n: Spanish LA&C (thanks Yamil.llanos, Notorius28) +- core: notify executable: support spaces in path, fixes #520 +- core: notify executable: fix usage with python scripts (drops inherited PYTHONPATH), fixes #355 +- core: fix plugin_pin_mode +- refiners: filebot: fix usage on OSX +- providers: add assrt.net (Chinese) +- providers: add supersubtitles (feliratok.info, Hungarian) +- providers: addic7ed: cache login data instead of re-login per search +- submod: HI: support "&" and "+" in hi_before_colon +- submod: HI: be less aggressive with HI_before_colon_noncaps; fixes #510 From 6d444ebe996b54d7c5c34acd082381d14654554e Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 15 Jun 2018 15:51:32 +0200 Subject: [PATCH 127/710] back from dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index bd62ef06f..9c7d644ed 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ PlexPluginConsoleLogging 0 PlexPluginDevMode - 1 + 0 PlexPluginCodePolicy Elevated @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.7.2663 DEV +Version 2.5.7.2663 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 56b9f971e47c951403d75c1fdb319554c7e6dffd Mon Sep 17 00:00:00 2001 From: pannal Date: Fri, 15 Jun 2018 16:13:15 +0200 Subject: [PATCH 128/710] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e8099e02a..bcc7a4768 100644 --- a/README.md +++ b/README.md @@ -88,8 +88,8 @@ Jacob K, Ninjouz, chopeta, fvb, Jose - core: notify executable: fix usage with python scripts (drops inherited PYTHONPATH), fixes #355 - core: fix plugin_pin_mode - refiners: filebot: fix usage on OSX -- providers: add assrt.net (Chinese) -- providers: add supersubtitles (feliratok.info, Hungarian) +- providers: add assrt.net (Chinese) - thanks @dimotsai! +- providers: add supersubtitles (feliratok.info, Hungarian) - thanks @morpheus133! - providers: addic7ed: cache login data instead of re-login per search - submod: HI: support "&" and "+" in hi_before_colon - submod: HI: be less aggressive with HI_before_colon_noncaps; fixes #510 From 66bd71e8c98094450d98c7688511e296c65d1913 Mon Sep 17 00:00:00 2001 From: morpheus133 Date: Wed, 25 Jul 2018 08:04:59 +0200 Subject: [PATCH 129/710] Quick correction to #539 --- .../Shared/subliminal_patch/providers/hosszupuska.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py b/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py index aa436087f..febfad8c8 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py @@ -180,9 +180,9 @@ def query(self, series, season, episode, year=None, video=None): sub_year = sub_english_name = sub_version = None # Handle the case when '(' in subtitle - if datas[1].getText().count('(') == 2: + if datas[1].getText().count('(') == 1: sub_english_name = re.split('s(\d{1,2})e(\d{1,2})', datas[1].getText())[3] - if datas[1].getText().count('(') == 3: + if datas[1].getText().count('(') == 2: sub_year = re.findall(r"(?<=\()(\d{4})(?=\))", datas[1].getText().strip())[0] sub_english_name = re.split('s(\d{1,2})e(\d{1,2})', datas[1].getText().split('(')[0])[0] @@ -199,9 +199,9 @@ def query(self, series, season, episode, year=None, video=None): sub_downloadlink = datas[6].find_all('a')[1]['href'] sub_id = sub_downloadlink.split('=')[1].split('.')[0] - if datas[1].getText().count('(') == 2: + if datas[1].getText().count('(') == 1: sub_version = datas[1].getText().split('(')[1].split(')')[0] - if datas[1].getText().count('(') == 3: + if datas[1].getText().count('(') == 2: sub_version = datas[1].getText().split('(')[2].split(')')[0] # One subtitle can be used for several releases @@ -225,6 +225,7 @@ def list_subtitles(self, video, languages): return subs time.sleep(self.multi_result_throttle) + return [] def download_subtitle(self, subtitle): r = self.session.get(subtitle.page_link, timeout=10) From 02091c796926559af4e4c946d942a2d63040517e Mon Sep 17 00:00:00 2001 From: doopler <42199374+doopler@users.noreply.github.com> Date: Tue, 28 Aug 2018 11:07:23 +0300 Subject: [PATCH 130/710] Update common.py --- Contents/Libraries/Shared/subzero/modification/mods/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index ec4fd8196..0be13fe2e 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -125,7 +125,7 @@ class ReverseRTL(SubtitleModification): # new? (?u)(^([\s.!?]*)(.+?)(\s*)(-?\s*)$); \5\4\3\2 #NReProcessor(re.compile(ur"(?u)((?=(?<=\b|^)|(?<=\s))([.!?-]+)([^.!?-]+)(?=\b|$|\s))"), r"\3\2", # name="CM_RTL_reverse") - NReProcessor(re.compile(ur"(?u)(^([\s.!?]*)(.+?)(\s*)(-?\s*)$)"), r"\5\4\3\2", + NReProcessor(re.compile(ur"(?u)(^([\s.!?:,'-]*)(.+?)(\s*)(-?\s*)$)"), r"\5\4\3\2", name="CM_RTL_reverse") ] From 9c7716c4a4f696d81e04d158da8ccd55607a0573 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 16 Jun 2018 15:24:15 +0200 Subject: [PATCH 131/710] submod: common: improve detection and normalization of quotes, apostrophes --- .../Shared/subzero/modification/mods/common.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 0be13fe2e..18302c931 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -31,7 +31,15 @@ class CommonFixes(SubtitleTextModification): NReProcessor(re.compile(ur'(?u)(^[*#¶\s]*[*#¶]+[*#¶\s]*$)'), u"♪", name="CM_music_symbols"), # '' = " - StringProcessor("''", '"', name="CM_double_apostrophe"), + NReProcessor(re.compile(ur'(?u)([\'’ʼ❜‘‛][\'’ʼ❜‘‛]+)'), u'"', name="CM_double_apostrophe"), + + # normalize quotes + NReProcessor(re.compile(ur'(?u)(\s*["”“‟„])\s*(["”“‟„]["”“‟„\s]*)'), + lambda match: '"' + (" " if match.group(2).endswith(" ") else ""), + name="CM_normalize_quotes"), + + # normalize single quotes + NReProcessor(re.compile(ur'(?u)([\'’ʼ❜‘‛])'), u"'", name="CM_normalize_squotes"), # remove leading ... NReProcessor(re.compile(r'(?u)^\.\.\.[\s]*'), "", name="CM_leading_ellipsis"), From 3d6cba7b43d649b137652d122403bf1bca4cee81 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 16 Jun 2018 15:40:16 +0200 Subject: [PATCH 132/710] submod: OCR: add dictionaries for bosnian and norwegian bokmal; update dicts for dan, eng, hrv, spa, srp, swe --- .../subzero/modification/dictionaries/data.py | 70 +- .../xml/bos_OCRFixReplaceList.xml | 1840 +++++++++++++++++ .../xml/dan_OCRFixReplaceList.xml | 4 + .../xml/eng_OCRFixReplaceList.xml | 30 +- .../xml/hrv_OCRFixReplaceList.xml | 857 ++++++-- .../xml/nob_OCRFixReplaceList.xml | 58 + .../xml/spa_OCRFixReplaceList.xml | 6 + .../xml/srp_OCRFixReplaceList.xml | 90 +- .../xml/swe_OCRFixReplaceList.xml | 53 +- 9 files changed, 2808 insertions(+), 200 deletions(-) create mode 100644 Contents/Libraries/Shared/subzero/modification/dictionaries/xml/bos_OCRFixReplaceList.xml create mode 100644 Contents/Libraries/Shared/subzero/modification/dictionaries/xml/nob_OCRFixReplaceList.xml diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py b/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py index 443df8cdb..2ec9253f7 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py @@ -1,6 +1,18 @@ import re from collections import OrderedDict -data = {'dan': {'BeginLines': {'data': OrderedDict(), +data = {'bos': {'BeginLines': {'data': OrderedDict(), + 'pattern': None}, + 'EndLines': {'data': OrderedDict(), + 'pattern': None}, + 'PartialLines': {'data': OrderedDict([(u'da nadjem', u'na\u0107i'), (u'da nadjes', u'na\u0107i'), (u'da budes', u'biti'), (u'da ides', u'i\u0107i'), (u'da prodemo', u'pro\u0107i'), (u'da udem', u'u\u0107i'), (u'gdje ides', u'kamo ide\u0161'), (u'Gdje ides', u'Kamo ide\u0161'), (u'hocu da budem', u'\u017eelim biti'), (u'Hocu da budem', u'\u017delim biti'), (u'hocu da kazem', u'\u017eelim re\u0107i'), (u'hoces da kazes', u'\u017eeli\u0161 re\u0107i'), (u'hoce da kaze', u'\u017eeli re\u0107i'), (u'kao sto sam', u'kao \u0161to sam'), (u'me leda', u'me le\u0111a'), (u'medu nama', u'me\u0111u nama'), (u'moramo da idemo', u'moramo i\u0107i'), (u'moras da ides', u'mora\u0161 i\u0107i'), (u'na vecer', u'nave\u010der'), (u'Na vecer', u'Nave\u010der'), (u'ne cu', u'ne\u0107u'), (u'ne ces', u'ne\u0107e\u0161'), (u'ne\u0161to sto', u'ne\u0161to \u0161to'), (u'ono sto', u'ono \u0161to'), (u'Ono sto', u'Ono \u0161to'), (u'reci \u0107u', u're\u0107i \u0107u'), (u'sto ti se ne', u'\u0161to ti se ne'), (u'sto vise', u'\u0161to vi\u0161e'), (u'sve sto', u'sve \u0161to'), (u'Zao mi', u'\u017dao mi'), (u'zao mi', u'\u017eao mi'), (u'Zato sto', u'Zato \u0161to'), (u'zato sto', u'zato \u0161to'), (u'znas sto', u'zna\u0161 \u0161to'), (u'zna\u0161 sto', u'zna\u0161 \u0161to')]), + 'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:da\\ nadjem|da\\ nadjes|da\\ budes|da\\ ides|da\\ prodemo|da\\ udem|gdje\\ ides|Gdje\\ ides|hocu\\ da\\ budem|Hocu\\ da\\ budem|hocu\\ da\\ kazem|hoces\\ da\\ kazes|hoce\\ da\\ kaze|kao\\ sto\\ sam|me\\ leda|medu\\ nama|moramo\\ da\\ idemo|moras\\ da\\ ides|na\\ vecer|Na\\ vecer|ne\\ cu|ne\\ ces|ne\\\u0161to\\ sto|ono\\ sto|Ono\\ sto|reci\\ \\\u0107u|sto\\ ti\\ se\\ ne|sto\\ vise|sve\\ sto|Zao\\ mi|zao\\ mi|Zato\\ sto|zato\\ sto|znas\\ sto|zna\\\u0161\\ sto)(?:(?=\\s)|(?=$)|(?=\\b))'}, + 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'pattern': None}, + 'WholeLines': {'data': OrderedDict(), + 'pattern': None}, + 'WholeWords': {'data': OrderedDict([(u'andele', u'an\u0111ele'), (u'andeli', u'an\u0111eli'), (u'bacas', u'baca\u0161'), (u'bas', u'ba\u0161'), (u'Bas', u'Ba\u0161'), (u'basta', u'vrt'), (u'Basta', u'Vrt'), (u'baste', u'vrtovi'), (u'Baste', u'Vrtovi'), (u'basti', u'vrtu'), (u'Basti', u'Vrtu'), (u'bastom', u'vrtom'), (u'Bastom', u'Vrtom'), (u'bastu', u'vrt'), (u'Bastu', u'Vrt'), (u'Bice', u'Bi\u0107e'), (u'bice', u'bi\u0107e'), (u'Bice\u0161', u'Bit \u0107e\u0161'), (u'Bicu', u'Bit \u0107u'), (u'bicu', u'bi\u0107u'), (u'blagonaklonoscu', u'blagonaklono\u0161\u0107u'), (u'blizi', u'bli\u017ei'), (u'bljesti', u'blije\u0161ti'), (u'Bljesti', u'Blije\u0161ti'), (u'bojis', u'boji\u0161'), (u'braca', u'bra\u0107a'), (u'Braca', u'Bra\u0107a'), (u'broncane', u'bron\u010dane'), (u'broncanu', u'bron\u010danu'), (u'budes', u'bude\u0161'), (u'caj', u'\u010daj'), (u'caja', u'\u010daja'), (u'Cak', u'\u010cak'), (u'cak', u'\u010dak'), (u'cale', u'tata'), (u'Cao', u'\u0106ao'), (u'cao', u'\u0107ao'), (u'cas', u'sat'), (u'casno', u'\u010dasno'), (u'Casno', u'\u010casno'), (u'castis', u'\u010dasti\u0161'), (u'casu', u'ca\u0161u'), (u'ca\u0161u', u'\u010da\u0161u'), (u'cebe', u'deku'), (u'cega', u'\u010dega'), (u'Cek', u'\u010cek'), (u'cek', u'\u010dek'), (u'cekali', u'\u010dekali'), (u'cekas', u'\u010deka\u0161'), (u'Cemu', u'\u010cemu'), (u'cemu', u'\u010demu'), (u'cerka', u'k\u0107i'), (u'Cerka', u'K\u0107i'), (u'cerke', u'k\u0107eri'), (u'Cerke', u'K\u0107eri'), (u'cerku', u'k\u0107er'), (u'Cerku', u'K\u0107er'), (u'ces', u'\u0107e\u0161'), (u'cesce', u'\u010de\u0161\u0107e'), (u'Cesce', u'\u010ce\u0161\u0107e'), (u'Ceskoj', u'\u010ce\u0161koj'), (u'cestitki', u'\u010destitki'), (u'cesto', u'\u010desto'), (u'Cesto', u'\u010cesto'), (u'cetiri', u'\u010detiri'), (u'Cetiri', u'\u010cetiri'), (u'cetri', u'\u010detiri'), (u'cetu', u'\u010detu'), (u'ceznja', u'\u010de\u017enja'), (u'ceznje', u'\u010de\u017enje'), (u'ceznji', u'\u010de\u017enji'), (u'ceznjom', u'\u010de\u017enjom'), (u'ceznju', u'\u010de\u017enju'), (u'ceznu', u'\u010deznu'), (u'ce\u0161', u'\u0107e\u0161'), (u'Cija', u'\u010cija'), (u'cija', u'\u010dija'), (u'cije', u'\u010dije'), (u'Ciji', u'\u010ciji'), (u'ciji', u'\u010diji'), (u'cijih', u'\u010dijih'), (u'Cijih', u'\u010cijih'), (u'cijim', u'\u010dijim'), (u'Cijim', u'\u010cijim'), (u'Cim', u'\u010cim'), (u'cim', u'\u010dim'), (u'cime', u'\u010dime'), (u'cinila', u'\u010dinila'), (u'cinili', u'\u010dinili'), (u'cinio', u'\u010dinio'), (u'cinis', u'\u010dini\u0161'), (u'ciniti', u'\u010diniti'), (u'cipka', u'\u010dipka'), (u'cipku', u'\u010dipku'), (u'cita', u'\u010dita'), (u'citao', u'\u010ditao'), (u'citas', u'\u010dita\u0161'), (u'citavu', u'\u010ditavu'), (u'cizme', u'\u010dizme'), (u'clan', u'\u010dlan'), (u'Clan', u'\u010clan'), (u'clanke', u'\u010dlanke'), (u'clanove', u'\u010dlanove'), (u'clanovi', u'\u010dlanovi'), (u'clanovima', u'\u010dlanovima'), (u'cmo', u'\u0107emo'), (u'corsokak', u'slijepa ulica'), (u'corsokaku', u'slijepoj ulici'), (u'cosak', u'ugao'), (u'cosku', u'uglu'), (u'covece', u'\u010dovje\u010de'), (u'covek', u'\u010dovjek'), (u'covjece', u'\u010dovje\u010de'), (u'covjecnost', u'\u010dovje\u010dnost'), (u'covjek', u'\u010dovjek'), (u'covjeka', u'\u010dovjeka'), (u'covjeku', u'\u010dovjeku'), (u'crpeci', u'crpe\u0107i'), (u'cte', u'\u0107ete'), (u'Cu', u'\u0106u'), (u'Ce\u0161', u'\u0106e\u0161'), (u'Ce', u'\u0106e'), (u'Cemo', u'\u0106emo'), (u'Cete', u'\u0106ete'), (u'cu', u'\u0107u'), (u'ce', u'\u0107e'), (u'cemo', u'\u0107emo'), (u'cete', u'\u0107ete'), (u'cudi', u'\u010dudi'), (u'Cudo', u'\u010cudo'), (u'cudo', u'\u010dudo'), (u'Cujte', u'\u010cujte'), (u'cula', u'\u010dula'), (u'culi', u'\u010duli'), (u'Culi', u'\u010culi'), (u'culima', u'\u010dulima'), (u'cuo', u'\u010duo'), (u'Cuo', u'\u010cuo'), (u'cupam', u'\u010dupam'), (u'cutanje', u'\u0161utnja'), (u'Cutanje', u'\u0160utnja'), (u'cutao', u'\u0161utio'), (u'Cutao', u'\u0160utio'), (u'cuti', u'\u010duti'), (u'cutljiv', u'\u0161utljiv'), (u'cutnja', u'\u0161utnja'), (u'cuvali', u'\u010duvali'), (u'cuveni', u'\u010duveni'), (u'dace', u'dat \u0107e'), (u'dacemo', u'dat \u0107emo'), (u'davo', u'vrag'), (u'definise', u'definira'), (u'definisi', u'definiraj'), (u'Desava', u'Doga\u0111a'), (u'desava', u'doga\u0111a'), (u'disemo', u'di\u0161emo'), (u'disi', u'di\u0161i'), (u'dobijes', u'dobije\u0161'), (u'dobivas', u'dobiva\u0161'), (u'doci', u'do\u0107i'), (u'dode', u'do\u0111e'), (u'dodem', u'do\u0111em'), (u'dodes', u'do\u0111e\u0161'), (u'dodete', u'do\u0111ete'), (u'dode\u0161', u'do\u0111e\u0161'), (u'Dodi', u'Do\u0111i'), (u'dodi', u'do\u0111i'), (u'dodite', u'do\u0111ite'), (u'Dodji', u'Do\u0111i'), (u'dodji', u'do\u0111i'), (u'Dodjite', u'Do\u0111ite'), (u'dodjite', u'do\u0111ite'), (u'Dodju', u'Do\u0111u'), (u'dodju', u'do\u0111u'), (u'dodu', u'do\u0111u'), (u'dolazis', u'dolazi\u0161'), (u'dopustao', u'dopu\u0161tao'), (u'dorucak', u'doru\u010dak'), (u'dorucku', u'doru\u010dku'), (u'Dosao', u'Do\u0161ao'), (u'dosao', u'do\u0161ao'), (u'drhteci', u'drhte\u0107i'), (u'drhte\u0107i', u'drhte\u0107i'), (u'Drhte\u0107i', u'Drhte\u0107i'), (u'drugacija', u'druga\u010dija'), (u'Drugacije', u'Druga\u010dije'), (u'drugacije', u'druga\u010dije'), (u'drugaciji', u'druga\u010diji'), (u'Drugaciji', u'Druga\u010diji'), (u'drukciji', u'druga\u010diji'), (u'drveca', u'drve\u0107a'), (u'drvece', u'drve\u0107e'), (u'drvecem', u'drve\u0107em'), (u'drvecu', u'drve\u0107u'), (u'drzi', u'dr\u017ei'), (u'Drzim', u'Dr\u017eim'), (u'dugmici', u'gumbi\u0107i'), (u'duze', u'du\u017ee'), (u'duzinom', u'du\u017einom'), (u'dzanki', u'ovisnik'), (u'Dzejk', u'Jake'), (u'Dzime', u'Jime'), (u'Dzone', u'Johne'), (u'flasom', u'fla\u0161om'), (u'flasu', u'fla\u0161u'), (u'fucka', u'fu\u0107ka'), (u'funkcionisu', u'funkcioniraju'), (u'gacice', u'ga\u0107ice'), (u'gadao', u'ga\u0111ao'), (u'gadis', u'gadi\u0161'), (u'Gadis', u'Gadi\u0161'), (u'gdica', u'g\u0111ica'), (u'gdice', u'g\u0111ice'), (u'gdici', u'g\u0111ici'), (u'gdicu', u'g\u0111icu'), (u'gdu', u'g\u0111u'), (u'glupaco', u'glupa\u010do'), (u'govoris', u'govori\u0161'), (u'gradani', u'gra\u0111ani'), (u'gradic', u'gradi\u0107'), (u'gradica', u'gradi\u0107a'), (u'gradicu', u'gradi\u0107u'), (u'grancica', u'gran\u010dica'), (u'grancicu', u'gran\u010dicu'), (u'gresci', u'gre\u0161ci'), (u'grese', u'grije\u0161e'), (u'greski', u'gre\u0161ci'), (u'gresku', u'gre\u0161ku'), (u'gubis', u'gubi\u0161'), (u'Hoces', u'Ho\u0107e\u0161'), (u'hoces', u'ho\u0107e\u0161'), (u'hocu', u'ho\u0107u'), (u'Hocu', u'Ho\u0107u'), (u'hodas', u'hoda\u0161'), (u'htjeo', u'htio'), (u'iceg', u'i\u010deg'), (u'icega', u'i\u010dega'), (u'icemu', u'i\u010demu'), (u'Ici', u'I\u0107i'), (u'ici', u'i\u0107i'), (u'Ides', u'Ide\u0161'), (u'ides', u'ide\u0161'), (u'iduce', u'idu\u0107e'), (u'iduceg', u'idu\u0107eg'), (u'iducem', u'idu\u0107em'), (u'Iduci', u'Idu\u0107i'), (u'iduci', u'idu\u0107i'), (u'ignorisi', u'ignoriraju'), (u'igras', u'igra\u0161'), (u'Ijudi', u'ljudi'), (u'imas', u'ima\u0161'), (u'imidz', u'imid\u017e'), (u'inace', u'ina\u010de'), (u'Inace', u'Ina\u010de'), (u'isao', u'i\u0161ao'), (u'Isao', u'I\u0161ao'), (u'iscupao', u'i\u0161\u010dupao'), (u'ise\u0107emo', u'izrezati'), (u'isla', u'i\u0161la'), (u'istjece', u'istje\u010de'), (u'istrazio', u'istrazio'), (u'Istrazio', u'Istrazio'), (u'isuvise', u'previ\u0161e'), (u'izaci', u'iza\u0107i'), (u'Izaci', u'Iza\u0107i'), (u'izade', u'iza\u0111e'), (u'Izade', u'Iza\u0111e'), (u'izadem', u'iza\u0111em'), (u'izades', u'iza\u0111e\u0161'), (u'izadete', u'iza\u0111ete'), (u'Izadi', u'Iza\u0111i'), (u'izadi', u'iza\u0111i'), (u'izasao', u'iza\u0161ao'), (u'izasla', u'iza\u0161la'), (u'izici', u'izi\u0107i'), (u'izluduje', u'izlu\u0111uje'), (u'izluduju', u'izlu\u0111uju'), (u'izmedu', u'izme\u0111u'), (u'Izmedu', u'Izme\u0111u'), (u'izostri', u'izo\u0161tri'), (u'izostrim', u'izo\u0161trim'), (u'izvuci', u'izvu\u0107i'), (u'i\u0161cupao', u'i\u0161\u010dupao'), (u'jebes', u'jebe\u0161'), (u'Jebes', u'Jebe\u0161'), (u'jos', u'jo\u0161'), (u'Jos', u'Jo\u0161'), (u'juce', u'ju\u010der'), (u'Juce', u'Ju\u010der'), (u'jucer', u'ju\u010der'), (u'Jucer', u'Ju\u010der'), (u'kaslja', u'ka\u0161lja'), (u'kaze', u'ka\u017ee'), (u'Kaze', u'Ka\u017ee'), (u'kazemo', u'ka\u017eemo'), (u'kazite', u'ka\u017eite'), (u'Kazite', u'Ka\u017eite'), (u'kazu', u'ka\u017eu'), (u'Kcer', u'K\u0107er'), (u'kcer', u'k\u0107er'), (u'kcerka', u'k\u0107i'), (u'Kcerka', u'K\u0107i'), (u'kcerkama', u'k\u0107erima'), (u'kcerku', u'k\u0107er'), (u'Kcerku', u'K\u0107er'), (u'kecap', u'ke\u010dap'), (u'kecapa', u'ke\u010dapa'), (u'kise', u'ki\u0161e'), (u'kisi', u'ki\u0161i'), (u'kleknes', u'klekne\u0161'), (u'kociji', u'ko\u010diji'), (u'kolaca', u'kola\u010da'), (u'kolace', u'kola\u010de'), (u'komadic', u'komadi\u0107'), (u'komsijama', u'susjedima'), (u'komsije', u'susjedi'), (u'komsiji', u'susjedu'), (u'komsiluk', u'susjedstvo'), (u'komsiluku', u'susjedstvu'), (u'kom\u0161ija', u'susjed'), (u'Kom\u0161ija', u'Susjed'), (u'Konkurise', u'Konkurira'), (u'konkurise', u'konkurira'), (u'konkurisem', u'konkuriram'), (u'konkurisu', u'konkuriraju'), (u'kontrolisu', u'kontroliraju'), (u'kosulja', u'ko\u0161ulja'), (u'kosulje', u'ko\u0161ulje'), (u'kosulji', u'ko\u0161ulji'), (u'kosulju', u'ko\u0161ulju'), (u'kovceg', u'kov\u010deg'), (u'kovcegu', u'kov\u010degu'), (u'krada', u'kra\u0111a'), (u'Krada', u'Kra\u0111a'), (u'Krece', u'Kre\u0107e'), (u'krece', u'kre\u0107e'), (u'Kreci', u'Kre\u0107i'), (u'kreci', u'kre\u0107i'), (u'krecu', u'kre\u0107u'), (u'kre\u0107es', u'kre\u0107e\u0161'), (u'krosnje', u'kro\u0161nje'), (u'krvaris', u'krvari\u0161'), (u'kuca', u'ku\u0107a'), (u'kucama', u'ku\u0107ama'), (u'kuce', u'ku\u0107e'), (u'kuci', u'ku\u0107i'), (u'kusa', u'ku\u0161a'), (u'kusas', u'ku\u0161a\u0161'), (u'ku\u010da', u'ku\u0107a'), (u'ku\u010di', u'ku\u0107i'), (u'lakocom', u'lako\u0107om'), (u'laz', u'la\u017e'), (u'lazac', u'la\u017eljivac'), (u'laze', u'la\u017ee'), (u'lazi', u'la\u017ei'), (u'lazne', u'la\u017ene'), (u'lazni', u'la\u017eni'), (u'lazov', u'la\u017eljivac'), (u'ledja', u'le\u0111a'), (u'ledjima', u'le\u0111ima'), (u'leprsa', u'lepr\u0161a'), (u'lezala', u'le\u017eala'), (u'lezali', u'le\u017eali'), (u'lezati', u'le\u017eati'), (u'lezis', u'le\u017ei\u0161'), (u'Lezis', u'Le\u017ei\u0161'), (u'lici', u'li\u010di'), (u'licim', u'li\u010dim'), (u'licis', u'li\u010di\u0161'), (u'licnost', u'li\u010dnost'), (u'licnosti', u'li\u010dnosti'), (u'lijecniku', u'lije\u010dniku'), (u'ljubis', u'ljubi\u0161'), (u'los', u'lo\u0161'), (u'losa', u'lo\u0161a'), (u'losu', u'lo\u0161u'), (u'majcine', u'maj\u010dine'), (u'masini', u'ma\u0161ini'), (u'medu', u'me\u0111u'), (u'Medutim', u'Me\u0111utim'), (u'medutim', u'me\u0111utim'), (u'mici', u'mi\u010di'), (u'Mici', u'Mi\u010di'), (u'micu', u'mi\u010du'), (u'mislis', u'misli\u0161'), (u'Mislis', u'Misli\u0161'), (u'mjesecevom', u'mjese\u010devom'), (u'mjesecine', u'mjese\u010dine'), (u'mjesecini', u'mjese\u010dini'), (u'mjesecinu', u'mjese\u010dinu'), (u'mladic', u'mladi\u0107'), (u'moc', u'mo\u0107'), (u'moci', u'mo\u0107i'), (u'motivisu', u'motiviraju'), (u'mozda', u'mo\u017eda'), (u'Mozda', u'Mo\u017eda'), (u'moze', u'mo\u017ee'), (u'mozete', u'mo\u017eete'), (u'mreza', u'mre\u017ea'), (u'mrezu', u'mre\u017eu'), (u'mrzis', u'mrzi\u0161'), (u'muce', u'mu\u010de'), (u'mucenik', u'mu\u010denik'), (u'mucne', u'mu\u010dne'), (u'muska', u'mu\u0161ka'), (u'muz', u'mu\u017e'), (u'muza', u'mu\u017ea'), (u'naci', u'na\u0107i'), (u'Naci', u'Na\u0107i'), (u'nacin', u'na\u010din'), (u'nadem', u'na\u0111em'), (u'Nadem', u'Na\u0111em'), (u'nademo', u'na\u0111emo'), (u'nades', u'na\u0111e\u0161'), (u'Nades', u'Na\u0111e\u0161'), (u'nadete', u'na\u0111ete'), (u'nadici', u'nadi\u0107i'), (u'nadje', u'na\u0111e'), (u'Nadje', u'Na\u0111e'), (u'nadjen', u'na\u0111en'), (u'nadjes', u'na\u0111e\u0161'), (u'Nadjes', u'Na\u0111e\u0161'), (u'nadjete', u'na\u0111ete'), (u'nagovestaj', u'nagovje\u0161taj'), (u'najvise', u'najvise'), (u'Najvise', u'Najvi\u0161e'), (u'naklonoscu', u'nakolono\u0161\u0107u'), (u'naocale', u'nao\u010dale'), (u'Napisite', u'Napi\u0161ite'), (u'nasa', u'na\u0161a'), (u'Nase', u'Na\u0161e'), (u'nase', u'na\u0161e'), (u'naseg', u'na\u0161eg'), (u'nasi', u'na\u0161i'), (u'Nasi', u'Na\u0161i'), (u'nasao', u'na\u0161ao'), (u'Nasao', u'Na\u0161ao'), (u'nasla', u'na\u0161la'), (u'Nasla', u'Na\u0161la'), (u'nasli', u'na\u0161li'), (u'Nasli', u'Na\u0161li'), (u'nasoj', u'na\u0161oj'), (u'nasrecu', u'na sre\u0107u'), (u'nastavis', u'nastavi\u0161'), (u'nasu', u'na\u0161u'), (u'nauce', u'nau\u010de'), (u'neceg', u'ne\u010deg'), (u'necega', u'ne\u010dega'), (u'necemo', u'ne\u0107emo'), (u'necemu', u'ne\u010demu'), (u'necije', u'ne\u010dije'), (u'neciji', u'ne\u010diji'), (u'necim', u'ne\u010dim'), (u'necovjecnost', u'ne\u010dovje\u010dnost'), (u'necovjecnosti', u'ne\u010dovje\u010dnosti'), (u'necu', u'ne\u0107u'), (u'Necu', u'Ne\u0107u'), (u'nekaze', u'ne ka\u017ee'), (u'nekoc', u'neko\u0107'), (u'Nemas', u'Nema\u0161'), (u'nemas', u'nema\u0161'), (u'Nesreca', u'Nesre\u0107a'), (u'nesto', u'ne\u0161to'), (u'Nesto', u'Ne\u0161to'), (u'new yorski', u'njujor\u0161ki'), (u'Nezan', u'Nje\u017ean'), (u'nezan', u'nje\u017ean'), (u'nezna', u'nje\u017ena'), (u'Neznam', u'Ne znam'), (u'Neznas', u'Ne znas'), (u'Neznajuci', u'Ne znaju\u0107i'), (u'Neznavsi', u'Ne znav\u0161i'), (u'neznam', u'ne znam'), (u'neznas', u'ne znas'), (u'neznajuci', u'ne znaju\u0107i'), (u'neznavsi', u'ne znav\u0161i'), (u'nezni', u'nje\u017eni'), (u'neznih', u'nje\u017enih'), (u'neznim', u'nje\u017enim'), (u'nezno', u'nje\u017eno'), (u'neznu', u'nje\u017enu'), (u'niceg', u'ni\u010deg'), (u'nicega', u'ni\u010dega'), (u'nicemu', u'ni\u010demu'), (u'nicija', u'ni\u010dija'), (u'niciji', u'ni\u010diji'), (u'nicim', u'ni\u010dim'), (u'njezno', u'nje\u017eno'), (u'nju jorski', u'njujor\u0161ki'), (u'noci', u'no\u0107i'), (u'nocnu', u'no\u0107nu'), (u'nosac', u'nosa\u010d'), (u'nosices', u'nosit \u0107e\u0161'), (u'nosis', u'nosi\u0161'), (u'noz', u'no\u017e'), (u'nozem', u'no\u017eem'), (u'Obecao', u'Obe\u0107ao'), (u'Obezbedjuju', u'Osiguravaju'), (u'obezbedjuju', u'osiguravaju'), (u'obide', u'obi\u0111e'), (u'objasnis', u'objasni\u0161'), (u'obozavalac', u'obo\u017eavatelj'), (u'obracas', u'obra\u0107a\u0161'), (u'obra\u0107as', u'obra\u0107a\u0161'), (u'obuce', u'obu\u010de'), (u'obucem', u'obu\u010dem'), (u'oceve', u'o\u010deve'), (u'ocito', u'o\u010dito'), (u'ocnjaci', u'o\u010dnjaci'), (u'odes', u'ode\u0161'), (u'odlazis', u'odlazi\u0161'), (u'odlezati', u'odle\u017eati'), (u'odlucim', u'odlu\u010dim'), (u'odmice', u'odmi\u010de'), (u'odraduje', u'odra\u0111uje'), (u'odreden', u'odre\u0111en'), (u'odreduje', u'odre\u0111uje'), (u'odredujemo', u'odre\u0111ujemo'), (u'odvec', u'odve\u0107'), (u'ogrtac', u'ogrta\u010d'), (u'ohrabrujuce', u'ohrabruju\u0107e'), (u'ojacam', u'oja\u010dam'), (u'okrece', u'okre\u0107e'), (u'opasac', u'opasa\u010d'), (u'operise', u'operira'), (u'operisemo', u'operiramo'), (u'operisete', u'operirate'), (u'operise\u0161', u'operira\u0161'), (u'osecaces', u'osje\u0107at \u0107e\u0161'), (u'osjecaces', u'osje\u0107at \u0107e\u0161'), (u'osjecam', u'osje\u0107am'), (u'osjecanja', u'osje\u0107anja'), (u'oslobada', u'osloba\u0111a'), (u'ostra', u'o\u0161tra'), (u'ostre', u'o\u0161tre'), (u'ostri', u'o\u0161tri'), (u'ostrom', u'o\u0161trom'), (u'ostru', u'o\u0161tru'), (u'osvrnes', u'osvrne\u0161'), (u'Osvrnes', u'Osvrne\u0161'), (u'otezala', u'ote\u017eala'), (u'otidi', u'oti\u0111i'), (u'otidji', u'oti\u0111i'), (u'otisao', u'oti\u0161ao'), (u'oziljak', u'o\u017eiljak'), (u'palaca', u'pala\u010da'), (u'palaci', u'pala\u010di'), (u'palacu', u'pala\u010du'), (u'papucama', u'papu\u010dama'), (u'parce', u'komadi\u0107'), (u'pateci', u'pate\u0107i'), (u'patis', u'pati\u0161'), (u'pcela', u'p\u010dela'), (u'pcele', u'p\u010dele'), (u'pecini', u'pe\u0107ini'), (u'pecinski', u'pe\u0107inski'), (u'peraca', u'pera\u010da'), (u'Peraci', u'Pera\u010di'), (u'pica', u'pi\u0107a'), (u'pice', u'pi\u0107e'), (u'picem', u'pi\u0107em'), (u'pijes', u'pije\u0161'), (u'pisacoj', u'pisa\u0107oj'), (u'pise', u'pi\u0161e'), (u'pisem', u'pi\u0161em'), (u'pisemo', u'pi\u0161emo'), (u'pises', u'pi\u0161e\u0161'), (u'pisite', u'pi\u0161ite'), (u'pisu', u'pi\u0161u'), (u'pitas', u'pita\u0161'), (u'placa', u'pla\u0107a'), (u'placam', u'pla\u0107am'), (u'placanje', u'pla\u0107anje'), (u'placanjem', u'pla\u0107anjem'), (u'place', u'pla\u010de'), (u'placem', u'pla\u010dem'), (u'placete', u'pla\u010dete'), (u'place\u0161', u'pla\u010de\u0161'), (u'placu', u'pla\u0107u'), (u'placuci', u'pla\u010du\u0107i'), (u'Plasi', u'Boji'), (u'plazi', u'pla\u017ei'), (u'plazu', u'pla\u017eu'), (u'plese', u'ple\u0161e'), (u'plesemo', u'ple\u0161emo'), (u'plesete', u'ple\u0161ete'), (u'plesu', u'ple\u0161u'), (u'ploca', u'plo\u010da'), (u'ploce', u'plo\u010de'), (u'pluca', u'plu\u0107a'), (u'plucima', u'plu\u0107ima'), (u'pobjeci', u'pobje\u0107i'), (u'pobjeduje', u'pobje\u0111uje'), (u'poceli', u'po\u010deli'), (u'poceo', u'po\u010deo'), (u'pocetak', u'po\u010detak'), (u'pocevsi', u'po\u010dev\u0161i'), (u'pocev\u0161i', u'po\u010dev\u0161i'), (u'poci', u'po\u0107i'), (u'pocinje', u'po\u010dinje'), (u'pociva', u'po\u010diva'), (u'pocivali', u'po\u010divali'), (u'pocivao', u'po\u010divao'), (u'pode', u'po\u0111e'), (u'podi', u'po\u0111i'), (u'podici', u'podi\u0107i'), (u'Podici', u'Podi\u0107i'), (u'podimo', u'po\u0111imo'), (u'Podimo', u'Po\u0111imo'), (u'podje', u'po\u0111e'), (u'Podje', u'Po\u0111e'), (u'Podji', u'Po\u0111i'), (u'podji', u'po\u0111i'), (u'podneses', u'podnese\u0161'), (u'podocnjacima', u'podo\u010dnjacima'), (u'podocnjake', u'podo\u010dnjake'), (u'podstice', u'poti\u010de'), (u'poduzeca', u'poduze\u0107a'), (u'poduzece', u'poduze\u0107e'), (u'poduzecu', u'poduze\u0107u'), (u'pojesce', u'pojest \u0107e'), (u'pojiliste', u'pojili\u0161te'), (u'pokazi', u'poka\u017ei'), (u'Pokazi', u'Poka\u017ei'), (u'pokrece', u'pokre\u0107e'), (u'pokusaj', u'poku\u0161aj'), (u'pokusam', u'poku\u0161am'), (u'pokusas', u'poku\u0161a\u0161'), (u'poletis', u'poleti\u0161'), (u'polozaja', u'polo\u017eaja'), (u'polozaju', u'polo\u017eaju'), (u'pomaci', u'pomaknuti'), (u'pomazes', u'poma\u017ee\u0161'), (u'pomislis', u'pomisli\u0161'), (u'pomognes', u'pomogne\u0161'), (u'poneses', u'ponese\u0161'), (u'ponovis', u'ponovi\u0161'), (u'poreci', u'pore\u0107i'), (u'porice', u'pori\u010de'), (u'posalji', u'po\u0161alji'), (u'Posalji', u'Po\u0161alji'), (u'posaljite', u'po\u0161aljite'), (u'posle', u'poslije'), (u'posluzili', u'poslu\u017eili'), (u'Posluzite', u'Poslu\u017eite'), (u'posluzite', u'poslu\u017eite'), (u'postaras', u'pobrine\u0161'), (u'posto', u'po\u0161to'), (u'Posto', u'Po\u0161to'), (u'potece', u'pote\u010de'), (u'potice', u'poti\u010de'), (u'potici', u'poti\u010di'), (u'potjece', u'potje\u010de'), (u'potjecem', u'potje\u010dem'), (u'potjeces', u'potje\u010de\u0161'), (u'potpises', u'potpi\u0161e\u0161'), (u'povedes', u'povede\u0161'), (u'pozuda', u'po\u017euda'), (u'pozude', u'po\u017eude'), (u'pozudi', u'po\u017eudi'), (u'pozudu', u'po\u017eudu'), (u'prakticno', u'prakti\u010dno'), (u'premasuje', u'prema\u0161uje'), (u'premasuju', u'prema\u0161uju'), (u'preporuca', u'preporu\u010duje'), (u'presao', u'pre\u0161ao'), (u'presjecen', u'presje\u010den'), (u'Previse', u'Previ\u0161e'), (u'previse', u'previ\u0161e'), (u'preziveo', u'pre\u017eivio'), (u'Priblizi', u'Pribli\u017ei'), (u'price', u'pri\u010de'), (u'prici', u'pri\u010di'), (u'pricu', u'pri\u010du'), (u'Pridji', u'Pri\u0111i'), (u'pridji', u'pri\u0111i'), (u'prijeci', u'prije\u0107i'), (u'prijedi', u'prije\u0111i'), (u'prilazis', u'prilazi\u0161'), (u'prisao', u'pri\u0161ao'), (u'priusti', u'priu\u0161ti'), (u'priustimo', u'priu\u0161timo'), (u'priustiti', u'priu\u0161titi'), (u'proci', u'pro\u0107i'), (u'prodavac', u'prodava\u010d'), (u'promasio', u'proma\u0161io'), (u'Promasio', u'Proma\u0161io'), (u'prosao', u'pro\u0161ao'), (u'prosla', u'pro\u0161la'), (u'Prosle', u'Pro\u0161le'), (u'prosle', u'pro\u0161le'), (u'prosli', u'pro\u0161li'), (u'Prosli', u'Pro\u0161li'), (u'proslim', u'pro\u0161lim'), (u'proslo', u'pro\u0161lo'), (u'Proslo', u'Pro\u0161lo'), (u'provedes', u'provede\u0161'), (u'provlaci', u'provla\u010di'), (u'provlacimo', u'provla\u010dimo'), (u'pticica', u'pti\u010dica'), (u'pticicu', u'pti\u010dicu'), (u'pucini', u'pu\u010dini'), (u'pupcanu', u'pup\u010danu'), (u'pusac', u'pu\u0161a\u010d'), (u'pusaci', u'pu\u0161a\u010di'), (u'pusi', u'pu\u0161i'), (u'pusimo', u'pu\u0161imo'), (u'pusite', u'pu\u0161ite'), (u'pustam', u'pu\u0161tam'), (u'racunare', u'ra\u010dunala'), (u'racunari', u'ra\u010dunala'), (u'radis', u'radi\u0161'), (u'Radis', u'Radi\u0161'), (u'raskosni', u'rasko\u0161ni'), (u'razumes', u'razumije\u0161'), (u'Razumes', u'Razumije\u0161'), (u'rec', u'rije\u010d'), (u'rece', u're\u010de'), (u'Receno', u'Re\u010deno'), (u'receno', u're\u010deno'), (u'recima', u'rije\u010dima'), (u'resimo', u'rije\u0161imo'), (u'rijec', u'rije\u010d'), (u'Rijeci', u'Rije\u010di'), (u'rijedji', u'rje\u0111i'), (u'rjedji', u'rje\u0111i'), (u'Rjesit', u'Rije\u0161it'), (u'rodena', u'ro\u0111ena'), (u'rodeni', u'ro\u0111eni'), (u'rodis', u'rodi\u0161'), (u'rodjen', u'ro\u0111en'), (u'rucno', u'ru\u010dno'), (u'ruza', u'ru\u017ea'), (u'ruzan', u'ru\u017ean'), (u'ruzu', u'ru\u017eu'), (u'sadrze', u'sadr\u017ee'), (u'sadrzi', u'sadr\u017ei'), (u'salje', u'\u0161alje'), (u'saljes', u'\u0161alje\u0161'), (u'salju', u'\u0161alju'), (u'sasila', u'sa\u0161ila'), (u'sasili', u'sa\u0161ili'), (u'sasio', u'sa\u0161io'), (u'sasiti', u'sa\u0161iti'), (u'savescu', u'savje\u0161\u0107u'), (u'savijescu', u'savje\u0161\u0107u'), (u'sedeces', u'sjedit \u0107e\u0161'), (u'sedis', u'sjedi\u0161'), (u'sedista', u'sjedala'), (u'sediste', u'sjedi\u0161te'), (u'sendvic', u'sendvi\u010d'), (u'sesir', u'\u0161e\u0161ir'), (u'sesirom', u'\u0161e\u0161irom'), (u'sest', u'\u0161est'), (u'setala', u'\u0161etala'), (u'setam', u'\u0161etam'), (u'setis', u'sjeti\u0161'), (u'seva', u'\u0161eva'), (u'sevu', u'\u0161evu'), (u'sezdeset', u'\u0161ezdeset'), (u'Sidji', u'Si\u0111i'), (u'sidji', u'si\u0111i'), (u'sijecanj', u'sije\u010danj'), (u'siroki', u'\u0161iroki'), (u'sjecaju', u'sje\u0107aju'), (u'sjecam', u'sje\u0107am'), (u'Sjecam', u'Sje\u0107am'), (u'sjecanja', u'sje\u0107anja'), (u'sjecanje', u'sje\u0107anje'), (u'skace', u'ska\u010de'), (u'skaci', u'ska\u010di'), (u'skacu', u'ska\u010du'), (u'sklanjas', u'sklanja\u0161'), (u'sklonoscu', u'sklono\u0161\u0107u'), (u'sklupcam', u'sklup\u010dam'), (u'skola', u'\u0161kola'), (u'Skola', u'\u0160kola'), (u'Skotska', u'\u0160kotska'), (u'Skotskoj', u'\u0160kotskoj'), (u'skrt', u'\u0161krt'), (u'skrte', u'\u0161krte'), (u'skrusena', u'skru\u0161ena'), (u'Skrusena', u'Skru\u0161ena'), (u'sledeca', u'sljede\u0107a'), (u'Sledece', u'Sljede\u0107e'), (u'sledeci', u'sljede\u0107i'), (u'Sledeci', u'Sljede\u0107i'), (u'slicno', u'sli\u010dno'), (u'sljedeci', u'sljede\u0107i'), (u'Sljedeci', u'Sljede\u0107i'), (u'slozila', u'slo\u017eila'), (u'slozili', u'slo\u017eili'), (u'slozio', u'slo\u017eio'), (u'sloziti', u'slo\u017eiti'), (u'slucaja', u'slu\u010daja'), (u'Smatras', u'Smatra\u0161'), (u'smatras', u'smatra\u0161'), (u'smece', u'sme\u0107e'), (u'smeda', u'sme\u0111a'), (u'smedem', u'sme\u0111em'), (u'smedi', u'sme\u0111i'), (u'smedoj', u'sme\u0111oj'), (u'smedu', u'sme\u0111u'), (u'smesak', u'smje\u0161ak'), (u'Smijes', u'Smije\u0161'), (u'smijes', u'smije\u0161'), (u'smionoscu', u'smiono\u0161\u0107u'), (u'smraci', u'smra\u010di'), (u'smracilo', u'smra\u010dilo'), (u'smrcu', u'smr\u0107u'), (u'snimacete', u'snimat \u0107ete'), (u'sokiras', u'\u0161okira\u0161'), (u'spases', u'spasi\u0161'), (u'Spases', u'Spasi\u0161'), (u'spavaca', u'spava\u0107a'), (u'spavacoj', u'spava\u0107oj'), (u'spominjes', u'spominje\u0161'), (u'spustamo', u'spu\u0161tamo'), (u'srdacan', u'srda\u010dan'), (u'srecom', u'sre\u0107om'), (u'sresce', u'srest \u0107e'), (u'sre\u0161ce', u'srest \u0107e'), (u'srljas', u'srlja\u0161'), (u'Sta', u'\u0160to'), (u'sta', u'\u0161to'), (u'stab', u'sto\u017eer'), (u'Stab', u'Sto\u017eer'), (u'stagod', u'\u0161to god'), (u'stampa', u'tisak'), (u'stampati', u'tiskati'), (u'stampi', u'tisku'), (u'stampom', u'tiskom'), (u'stampu', u'tisak'), (u'standa', u'\u0161tanda'), (u'standu', u'\u0161tandu'), (u'stavis', u'stavi\u0161'), (u'Stavise', u'\u0160tovi\u0161e'), (u'Stavi\u0107emo', u'Stavit \u0107emo'), (u'steceni', u'ste\u010deni'), (u'stezuci', u'ste\u017eu\u0107i'), (u'stici', u'sti\u0107i'), (u'stojis', u'stoji\u0161'), (u'Stojis', u'Stoji\u0161'), (u'stp', u'\u0161to'), (u'strasan', u'stra\u0161an'), (u'strasno', u'stra\u0161no'), (u'sudeci', u'sude\u0107i'), (u'sudenja', u'su\u0111enja'), (u'sudenje', u'su\u0111enje'), (u'sudenju', u'su\u0111enju'), (u'sugerisu', u'predla\u017eu'), (u'sumnjas', u'sumnja\u0161'), (u'sumska', u'\u0161umska'), (u'sumski', u'\u0161umski'), (u'sumskoj', u'\u0161umskoj'), (u'supak', u'\u0161upak'), (u'suraduj', u'sura\u0111uj'), (u'suraduje', u'sura\u0111uje'), (u'suradujemo', u'sura\u0111ujemo'), (u'suraduju', u'sura\u0111uju'), (u'Suraduj', u'Sura\u0111uj'), (u'Suraduje', u'Sura\u0111uje'), (u'Suradujemo', u'Sura\u0111ujemo'), (u'Suraduju', u'Sura\u0111uju'), (u'sustina', u'bit'), (u'sustine', u'biti'), (u'sustini', u'biti'), (u'Sustine', u'Biti'), (u'Sustini', u'Biti'), (u'Sustinom', u'Biti'), (u'sustinom', u'biti'), (u'sustinski', u'bitni'), (u'suti', u'\u0161uti'), (u'Suti', u'\u0160uti'), (u'svacije', u'sva\u010dije'), (u'svaciji', u'sva\u010diji'), (u'svaciju', u'sva\u010diju'), (u'svecan', u'sve\u010dan'), (u'svecani', u'sve\u010dani'), (u'svez', u'svje\u017e'), (u'sveza', u'svje\u017ea'), (u'svezu', u'svje\u017eu'), (u'svezi', u'svje\u017ei'), (u'sveze', u'svje\u017ee'), (u'svezim', u'svje\u017eim'), (u'svezom', u'svje\u017eom'), (u'svezoj', u'svje\u017eoj'), (u'svezinom', u'svje\u017einom'), (u'svezina', u'svje\u017eina'), (u'svezinu', u'svje\u017einu'), (u'svezini', u'svje\u017eini'), (u'svezine', u'svje\u017eine'), (u'Svida', u'Svi\u0111a'), (u'svidala', u'svi\u0111ala'), (u'svidalo', u'svi\u0111alo'), (u'svidam', u'svi\u0111am'), (u'svidao', u'svi\u0111ao'), (u'sviras', u'svira\u0161'), (u'taknes', u'takne\u0161'), (u'takode', u'tako\u0111er'), (u'takoder', u'tako\u0111er'), (u'takodje', u'tako\u0111er'), (u'Takodje', u'Tako\u0111er'), (u'tece', u'te\u010de'), (u'teska', u'te\u0161ka'), (u'Teska', u'Te\u0161ka'), (u'teske', u'te\u0161ke'), (u'teski', u'te\u0161ki'), (u'tesko', u'te\u0161ko'), (u'Tesko', u'Te\u0161ko'), (u'teskom', u'te\u0161kom'), (u'tezak', u'te\u017eak'), (u'Tezak', u'Te\u017eak'), (u'teze', u'te\u017ee'), (u'tezi', u'te\u017ei'), (u'Tezi', u'Te\u017ei'), (u'tezimo', u'te\u017eimo'), (u'Tezimo', u'Te\u017eimo'), (u'tezinu', u'te\u017einu'), (u'tezis', u'te\u017ei\u0161'), (u'Tezi\u0161', u'Te\u017ei\u0161'), (u'tisuce', u'tisu\u0107e'), (u'tisucu', u'tisu\u0107u'), (u'Tocak', u'Kota\u010d'), (u'tocak', u'kota\u010d'), (u'tocka', u'to\u010dka'), (u'tocku', u'to\u010dku'), (u'trajace', u'trajat \u0107e'), (u'Trajace', u'Trajat \u0107e'), (u'trazis', u'tra\u017ei\u0161'), (u'trcao', u'tr\u010dao'), (u'trce', u'tr\u010de'), (u'Trce', u'Tr\u010de'), (u'trci', u'tr\u010di'), (u'Trci', u'Tr\u010di'), (u'trcim', u'tr\u010dim'), (u'Trcim', u'Tr\u010dim'), (u'trcimo', u'tr\u010dimo'), (u'trebas', u'treba\u0161'), (u'Trebas', u'Treba\u0161'), (u'treci', u'tre\u0107i'), (u'tricarija', u'tri\u010darija'), (u'trudis', u'trudi\u0161'), (u'trunuce', u'trunut \u0107e'), (u'tuce', u'tu\u010de'), (u'tuces', u'tu\u010de\u0161'), (u'tucom', u'tu\u010dom'), (u'tucu', u'tu\u010dnjavu'), (u'tudje', u'tu\u0111e'), (u'tudjeg', u'tu\u0111eg'), (u'tudoj', u'tu\u0111oj'), (u'tudom', u'tu\u0111om'), (u'tudjem', u'tu\u0111em'), (u'tudem', u'tu\u0111em'), (u'tumaras', u'tumara\u0161'), (u'tvoris', u'tvori\u0161'), (u'ubedjuju', u'uvjeravaju'), (u'ubijes', u'ubije\u0161'), (u'Ubijes', u'Ubije\u0161'), (u'uceni', u'u\u010deni'), (u'uci', u'u\u0107i'), (u'ucine', u'u\u010dine'), (u'ucinimo', u'u\u010dinimo'), (u'ucinio', u'u\u010dinio'), (u'ucio', u'u\u010dio'), (u'Ucio', u'U\u010dio'), (u'udas', u'uda\u0161'), (u'udete', u'u\u0111ete'), (u'ude\u0161', u'ude\u0161'), (u'udi', u'u\u0111i'), (u'Udi', u'U\u0111i'), (u'Udje', u'U\u0111e'), (u'udje', u'u\u0111e'), (u'udjes', u'u\u0111e\u0161'), (u'ugriscu', u'ugrist \u0107u'), (u'ukljestena', u'uklije\u0161tena'), (u'ukljucujuci', u'uklju\u010duju\u0107i'), (u'umes', u'umije\u0161'), (u'umiruci', u'umiru\u0107i'), (u'umrecu', u'umrijet \u0107u'), (u'umres', u'umre\u0161'), (u'unistice', u'uni\u0161tit \u0107e'), (u'uopce', u'uop\u0107e'), (u'Uopce', u'Uop\u0107e'), (u'Uopste', u'Uop\u0107e'), (u'uopste', u'uop\u0107e'), (u'upoznas', u'upozna\u0161'), (u'uradis', u'u\u010dini\u0161'), (u'usao', u'u\u0161ao'), (u'Usao', u'U\u0161ao'), (u'usli', u'u\u0161li'), (u'Usmjerice', u'Usmjerit \u0107e'), (u'uspanicio', u'uspani\u010dio'), (u'utapas', u'utapa\u0161'), (u'utesi', u'utje\u0161i'), (u'utesim', u'utje\u0161im'), (u'uzinu', u'u\u017einu'), (u'uzivo', u'u\u017eivo'), (u'valda', u'valjda'), (u'vasa', u'va\u0161a'), (u'vaseg', u'va\u0161eg'), (u'Vaseg', u'Va\u0161eg'), (u'vasem', u'va\u0161em'), (u'vasi', u'va\u0161i'), (u'vasoj', u'va\u0161oj'), (u'vazi', u'vrijedi'), (u'Vec', u'Ve\u0107'), (u'vec', u've\u0107'), (u'vecan', u'vje\u010dan'), (u'vecera', u've\u010dera'), (u'Veceras', u'Ve\u010deras'), (u'veceras', u've\u010deras'), (u'vecere', u've\u010dere'), (u'veceri', u've\u010deri'), (u'veceru', u've\u010deru'), (u'vecih', u've\u0107ih'), (u'vecitim', u'vje\u010ditim'), (u'vecna', u'vje\u010dna'), (u'vecno', u'vje\u010dno'), (u'vecnost', u'vje\u010dnost'), (u'verovacu', u'vjerovat \u0107u'), (u'vice', u'vi\u010de'), (u'vicem', u'vi\u010dem'), (u'vicemo', u'vi\u010demo'), (u'vices', u'vi\u010de\u0161'), (u'vicete', u'vi\u010dete'), (u'viden', u'vi\u0111en'), (u'Viden', u'Vi\u0111en'), (u'vishe', u'vi\u0161e'), (u'vjencali', u'vjen\u010dali'), (u'vjencati', u'vjen\u010dati'), (u'vjerujes', u'vjeruje\u0161'), (u'Vjerujes', u'Vjeruje\u0161'), (u'vjetrenjace', u'vjetrenja\u010de'), (u'voce', u'vo\u0107e'), (u'vocka', u'vo\u0107ka'), (u'vocku', u'vo\u0107ku'), (u'vocnjak', u'vo\u0107njak'), (u'vocnjaku', u'vo\u0107njaku'), (u'vodic', u'vodi\u010d'), (u'vodju', u'vo\u0111u'), (u'vozac', u'voza\u010d'), (u'Vozac', u'Voza\u010d'), (u'vozaca', u'voza\u010da'), (u'vracam', u'vra\u0107am'), (u'vracen', u'vra\u010den'), (u'vrazja', u'vra\u017eja'), (u'vrazji', u'vra\u017eji'), (u'vreca', u'vre\u010da'), (u'vrece', u'vre\u0107e'), (u'vrecu', u'vre\u0107u'), (u'vredja', u'vrije\u0111a'), (u'vredjanje', u'vrije\u0111anje'), (u'vrtic', u'vrti\u0107'), (u'vrtica', u'vrti\u0107a'), (u'vrticu', u'vrti\u0107u'), (u'zacepe', u'za\u010depe'), (u'Zacepi', u'Za\u010depi'), (u'Zadrzi', u'Zadr\u017ei'), (u'zadrzi', u'zadr\u017ei'), (u'zaduzen', u'zadu\u017een'), (u'Zaduzen', u'Zadu\u017een'), (u'zagrlis', u'zagrli\u0161'), (u'zaljenja', u'\u017ealjenja'), (u'zaljenje', u'\u017ealjenje'), (u'zalosna', u'\u017ealosna'), (u'Zalosna', u'\u017dalosna'), (u'zaokruzi', u'zaokru\u017ei'), (u'zaokruzim', u'zaokru\u017eim'), (u'zaokruzimo', u'zaokru\u017eimo'), (u'zapoceli', u'zapo\u010deli'), (u'zarucen', u'zaru\u010den'), (u'zasto', u'za\u0161to'), (u'Zasto', u'Za\u0161to'), (u'zateci', u'zate\u0107i'), (u'zatvoris', u'zatvori\u0161'), (u'zdrebe', u'\u017edrijebe'), (u'Zele', u'\u017dele'), (u'zele', u'\u017eele'), (u'Zeleci', u'\u017dele\u0107i'), (u'zelila', u'\u017eeljela'), (u'Zelis', u'\u017deli\u0161'), (u'zelis', u'\u017eeli\u0161'), (u'zene', u'\u017eene'), (u'zenke', u'\u017eenke'), (u'zesce', u'\u017ee\u0161\u0107e'), (u'zezas', u'zeza\u0161'), (u'zita', u'\u017eita'), (u'zito', u'\u017eito'), (u'zitu', u'\u017eitu'), (u'ziv', u'\u017eiv'), (u'ziva', u'\u017eiva'), (u'zive', u'\u017eive'), (u'zivi', u'\u017eivi'), (u'zivis', u'\u017eivi\u0161'), (u'zivjeo', u'\u017eivio'), (u'Zivjeo', u'\u017divio'), (u'zmureo', u'\u017emirio'), (u'znacaj', u'zna\u010daj'), (u'znacaja', u'zna\u010daja'), (u'znace', u'zna\u010de'), (u'znace\u0161', u'znat \u0107e\u0161'), (u'znas', u'zna\u0161'), (u'Znas', u'Zna\u0161'), (u'zuris', u'zuri\u0161'), (u'zutoj', u'\u017eutoj'), (u'zvanican', u'slu\u017eben'), (u'\u0107es', u'\u0107e\u0161'), (u'\u0107te', u'\u0107ete'), (u'\u010cime', u'\u010cime'), (u'\u017eelis', u'\u017eeli\u0161'), (u'\u017diveo', u'\u017divio')]), + 'pattern': u'(?um)(\\b|^)(?:andele|andeli|bacas|bas|Bas|basta|Basta|baste|Baste|basti|Basti|bastom|Bastom|bastu|Bastu|Bice|bice|Bice\\\u0161|Bicu|bicu|blagonaklonoscu|blizi|bljesti|Bljesti|bojis|braca|Braca|broncane|broncanu|budes|caj|caja|Cak|cak|cale|Cao|cao|cas|casno|Casno|castis|casu|ca\\\u0161u|cebe|cega|Cek|cek|cekali|cekas|Cemu|cemu|cerka|Cerka|cerke|Cerke|cerku|Cerku|ces|cesce|Cesce|Ceskoj|cestitki|cesto|Cesto|cetiri|Cetiri|cetri|cetu|ceznja|ceznje|ceznji|ceznjom|ceznju|ceznu|ce\\\u0161|Cija|cija|cije|Ciji|ciji|cijih|Cijih|cijim|Cijim|Cim|cim|cime|cinila|cinili|cinio|cinis|ciniti|cipka|cipku|cita|citao|citas|citavu|cizme|clan|Clan|clanke|clanove|clanovi|clanovima|cmo|corsokak|corsokaku|cosak|cosku|covece|covek|covjece|covjecnost|covjek|covjeka|covjeku|crpeci|cte|Cu|Ce\\\u0161|Ce|Cemo|Cete|cu|ce|cemo|cete|cudi|Cudo|cudo|Cujte|cula|culi|Culi|culima|cuo|Cuo|cupam|cutanje|Cutanje|cutao|Cutao|cuti|cutljiv|cutnja|cuvali|cuveni|dace|dacemo|davo|definise|definisi|Desava|desava|disemo|disi|dobijes|dobivas|doci|dode|dodem|dodes|dodete|dode\\\u0161|Dodi|dodi|dodite|Dodji|dodji|Dodjite|dodjite|Dodju|dodju|dodu|dolazis|dopustao|dorucak|dorucku|Dosao|dosao|drhteci|drhte\\\u0107i|Drhte\\\u0107i|drugacija|Drugacije|drugacije|drugaciji|Drugaciji|drukciji|drveca|drvece|drvecem|drvecu|drzi|Drzim|dugmici|duze|duzinom|dzanki|Dzejk|Dzime|Dzone|flasom|flasu|fucka|funkcionisu|gacice|gadao|gadis|Gadis|gdica|gdice|gdici|gdicu|gdu|glupaco|govoris|gradani|gradic|gradica|gradicu|grancica|grancicu|gresci|grese|greski|gresku|gubis|Hoces|hoces|hocu|Hocu|hodas|htjeo|iceg|icega|icemu|Ici|ici|Ides|ides|iduce|iduceg|iducem|Iduci|iduci|ignorisi|igras|Ijudi|imas|imidz|inace|Inace|isao|Isao|iscupao|ise\\\u0107emo|isla|istjece|istrazio|Istrazio|isuvise|izaci|Izaci|izade|Izade|izadem|izades|izadete|Izadi|izadi|izasao|izasla|izici|izluduje|izluduju|izmedu|Izmedu|izostri|izostrim|izvuci|i\\\u0161cupao|jebes|Jebes|jos|Jos|juce|Juce|jucer|Jucer|kaslja|kaze|Kaze|kazemo|kazite|Kazite|kazu|Kcer|kcer|kcerka|Kcerka|kcerkama|kcerku|Kcerku|kecap|kecapa|kise|kisi|kleknes|kociji|kolaca|kolace|komadic|komsijama|komsije|komsiji|komsiluk|komsiluku|kom\\\u0161ija|Kom\\\u0161ija|Konkurise|konkurise|konkurisem|konkurisu|kontrolisu|kosulja|kosulje|kosulji|kosulju|kovceg|kovcegu|krada|Krada|Krece|krece|Kreci|kreci|krecu|kre\\\u0107es|krosnje|krvaris|kuca|kucama|kuce|kuci|kusa|kusas|ku\\\u010da|ku\\\u010di|lakocom|laz|lazac|laze|lazi|lazne|lazni|lazov|ledja|ledjima|leprsa|lezala|lezali|lezati|lezis|Lezis|lici|licim|licis|licnost|licnosti|lijecniku|ljubis|los|losa|losu|majcine|masini|medu|Medutim|medutim|mici|Mici|micu|mislis|Mislis|mjesecevom|mjesecine|mjesecini|mjesecinu|mladic|moc|moci|motivisu|mozda|Mozda|moze|mozete|mreza|mrezu|mrzis|muce|mucenik|mucne|muska|muz|muza|naci|Naci|nacin|nadem|Nadem|nademo|nades|Nades|nadete|nadici|nadje|Nadje|nadjen|nadjes|Nadjes|nadjete|nagovestaj|najvise|Najvise|naklonoscu|naocale|Napisite|nasa|Nase|nase|naseg|nasi|Nasi|nasao|Nasao|nasla|Nasla|nasli|Nasli|nasoj|nasrecu|nastavis|nasu|nauce|neceg|necega|necemo|necemu|necije|neciji|necim|necovjecnost|necovjecnosti|necu|Necu|nekaze|nekoc|Nemas|nemas|Nesreca|nesto|Nesto|new\\ yorski|Nezan|nezan|nezna|Neznam|Neznas|Neznajuci|Neznavsi|neznam|neznas|neznajuci|neznavsi|nezni|neznih|neznim|nezno|neznu|niceg|nicega|nicemu|nicija|niciji|nicim|njezno|nju\\ jorski|noci|nocnu|nosac|nosices|nosis|noz|nozem|Obecao|Obezbedjuju|obezbedjuju|obide|objasnis|obozavalac|obracas|obra\\\u0107as|obuce|obucem|oceve|ocito|ocnjaci|odes|odlazis|odlezati|odlucim|odmice|odraduje|odreden|odreduje|odredujemo|odvec|ogrtac|ohrabrujuce|ojacam|okrece|opasac|operise|operisemo|operisete|operise\\\u0161|osecaces|osjecaces|osjecam|osjecanja|oslobada|ostra|ostre|ostri|ostrom|ostru|osvrnes|Osvrnes|otezala|otidi|otidji|otisao|oziljak|palaca|palaci|palacu|papucama|parce|pateci|patis|pcela|pcele|pecini|pecinski|peraca|Peraci|pica|pice|picem|pijes|pisacoj|pise|pisem|pisemo|pises|pisite|pisu|pitas|placa|placam|placanje|placanjem|place|placem|placete|place\\\u0161|placu|placuci|Plasi|plazi|plazu|plese|plesemo|plesete|plesu|ploca|ploce|pluca|plucima|pobjeci|pobjeduje|poceli|poceo|pocetak|pocevsi|pocev\\\u0161i|poci|pocinje|pociva|pocivali|pocivao|pode|podi|podici|Podici|podimo|Podimo|podje|Podje|Podji|podji|podneses|podocnjacima|podocnjake|podstice|poduzeca|poduzece|poduzecu|pojesce|pojiliste|pokazi|Pokazi|pokrece|pokusaj|pokusam|pokusas|poletis|polozaja|polozaju|pomaci|pomazes|pomislis|pomognes|poneses|ponovis|poreci|porice|posalji|Posalji|posaljite|posle|posluzili|Posluzite|posluzite|postaras|posto|Posto|potece|potice|potici|potjece|potjecem|potjeces|potpises|povedes|pozuda|pozude|pozudi|pozudu|prakticno|premasuje|premasuju|preporuca|presao|presjecen|Previse|previse|preziveo|Priblizi|price|prici|pricu|Pridji|pridji|prijeci|prijedi|prilazis|prisao|priusti|priustimo|priustiti|proci|prodavac|promasio|Promasio|prosao|prosla|Prosle|prosle|prosli|Prosli|proslim|proslo|Proslo|provedes|provlaci|provlacimo|pticica|pticicu|pucini|pupcanu|pusac|pusaci|pusi|pusimo|pusite|pustam|racunare|racunari|radis|Radis|raskosni|razumes|Razumes|rec|rece|Receno|receno|recima|resimo|rijec|Rijeci|rijedji|rjedji|Rjesit|rodena|rodeni|rodis|rodjen|rucno|ruza|ruzan|ruzu|sadrze|sadrzi|salje|saljes|salju|sasila|sasili|sasio|sasiti|savescu|savijescu|sedeces|sedis|sedista|sediste|sendvic|sesir|sesirom|sest|setala|setam|setis|seva|sevu|sezdeset|Sidji|sidji|sijecanj|siroki|sjecaju|sjecam|Sjecam|sjecanja|sjecanje|skace|skaci|skacu|sklanjas|sklonoscu|sklupcam|skola|Skola|Skotska|Skotskoj|skrt|skrte|skrusena|Skrusena|sledeca|Sledece|sledeci|Sledeci|slicno|sljedeci|Sljedeci|slozila|slozili|slozio|sloziti|slucaja|Smatras|smatras|smece|smeda|smedem|smedi|smedoj|smedu|smesak|Smijes|smijes|smionoscu|smraci|smracilo|smrcu|snimacete|sokiras|spases|Spases|spavaca|spavacoj|spominjes|spustamo|srdacan|srecom|sresce|sre\\\u0161ce|srljas|Sta|sta|stab|Stab|stagod|stampa|stampati|stampi|stampom|stampu|standa|standu|stavis|Stavise|Stavi\\\u0107emo|steceni|stezuci|stici|stojis|Stojis|stp|strasan|strasno|sudeci|sudenja|sudenje|sudenju|sugerisu|sumnjas|sumska|sumski|sumskoj|supak|suraduj|suraduje|suradujemo|suraduju|Suraduj|Suraduje|Suradujemo|Suraduju|sustina|sustine|sustini|Sustine|Sustini|Sustinom|sustinom|sustinski|suti|Suti|svacije|svaciji|svaciju|svecan|svecani|svez|sveza|svezu|svezi|sveze|svezim|svezom|svezoj|svezinom|svezina|svezinu|svezini|svezine|Svida|svidala|svidalo|svidam|svidao|sviras|taknes|takode|takoder|takodje|Takodje|tece|teska|Teska|teske|teski|tesko|Tesko|teskom|tezak|Tezak|teze|tezi|Tezi|tezimo|Tezimo|tezinu|tezis|Tezi\\\u0161|tisuce|tisucu|Tocak|tocak|tocka|tocku|trajace|Trajace|trazis|trcao|trce|Trce|trci|Trci|trcim|Trcim|trcimo|trebas|Trebas|treci|tricarija|trudis|trunuce|tuce|tuces|tucom|tucu|tudje|tudjeg|tudoj|tudom|tudjem|tudem|tumaras|tvoris|ubedjuju|ubijes|Ubijes|uceni|uci|ucine|ucinimo|ucinio|ucio|Ucio|udas|udete|ude\\\u0161|udi|Udi|Udje|udje|udjes|ugriscu|ukljestena|ukljucujuci|umes|umiruci|umrecu|umres|unistice|uopce|Uopce|Uopste|uopste|upoznas|uradis|usao|Usao|usli|Usmjerice|uspanicio|utapas|utesi|utesim|uzinu|uzivo|valda|vasa|vaseg|Vaseg|vasem|vasi|vasoj|vazi|Vec|vec|vecan|vecera|Veceras|veceras|vecere|veceri|veceru|vecih|vecitim|vecna|vecno|vecnost|verovacu|vice|vicem|vicemo|vices|vicete|viden|Viden|vishe|vjencali|vjencati|vjerujes|Vjerujes|vjetrenjace|voce|vocka|vocku|vocnjak|vocnjaku|vodic|vodju|vozac|Vozac|vozaca|vracam|vracen|vrazja|vrazji|vreca|vrece|vrecu|vredja|vredjanje|vrtic|vrtica|vrticu|zacepe|Zacepi|Zadrzi|zadrzi|zaduzen|Zaduzen|zagrlis|zaljenja|zaljenje|zalosna|Zalosna|zaokruzi|zaokruzim|zaokruzimo|zapoceli|zarucen|zasto|Zasto|zateci|zatvoris|zdrebe|Zele|zele|Zeleci|zelila|Zelis|zelis|zene|zenke|zesce|zezas|zita|zito|zitu|ziv|ziva|zive|zivi|zivis|zivjeo|Zivjeo|zmureo|znacaj|znacaja|znace|znace\\\u0161|znas|Znas|zuris|zutoj|zvanican|\\\u0107es|\\\u0107te|\\\u010cime|\\\u017eelis|\\\u017diveo)(\\b|$)'}}, + 'dan': {'BeginLines': {'data': OrderedDict(), 'pattern': None}, 'EndLines': {'data': OrderedDict(), 'pattern': None}, @@ -10,8 +22,8 @@ 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, - 'WholeWords': {'data': OrderedDict([(u'Haner', u'Han er'), (u'JaveL', u'Javel'), (u'Pa//e', u'Palle'), (u'bffte', u'bitte'), (u'Utro//gt', u'Utroligt'), (u'Kommerdu', u'Kommer du'), (u'smi/er', u'smiler'), (u'/eg', u'leg'), (u'harvinger', u'har vinger'), (u'/et', u'let'), (u'erjeres', u'er jeres'), (u'hardet', u'har det'), (u't\xe6nktjer', u't\xe6nkt jer'), (u'erjo', u'er jo'), (u'sti/', u'stil'), (u'Iappe', u'lappe'), (u'Beklagel\xe7', u'Beklager,'), (u'vardet', u'var det'), (u'afden', u'af den'), (u'snupperjeg', u'snupper jeg'), (u'ikkejeg', u'ikke jeg'), (u'bliverjeg', u'bliver jeg'), (u'hartravit', u'har travlt'), (u'pandekagef/ag', u'pandekageflag'), (u'Stormvarsell', u'Stormvarsel!'), (u'stormvejn', u'stormvejr.'), (u'morgenkomp/et', u'morgenkomplet'), (u'/yv', u'lyv'), (u'varjo', u'var jo'), (u'/eger', u'leger'), (u'harjeg', u'har jeg'), (u'havdejeg', u'havde jeg'), (u'hvorjeg', u'hvor jeg'), (u'n\xe5rjeg', u'n\xe5r jeg'), (u'g\xe5rvi', u'g\xe5r vi'), (u'atjeg', u'at jeg'), (u'isine', u'i sine'), (u'f\xe5rjeg', u'f\xe5r jeg'), (u'k\xe6rtighed', u'k\xe6rlighed'), (u'skullejeg', u'skulle jeg'), (u'laest', u'l\xe6st'), (u'laese', u'l\xe6se'), (u'g\xf8rjeg', u'g\xf8r jeg'), (u'g\xf8rvi', u'g\xf8r vi'), (u'angrerjo', u'angrer jo'), (u'Hvergang', u'Hver gang'), (u'erder', u'er der'), (u'villetilgive', u'ville tilgive'), (u'\ufb01eme', u'fjeme'), (u'genopst\xe5ri', u'genopst\xe5r i'), (u'svigtejer', u'svigte jer'), (u'kommernu', u'kommer nu'), (u'n\xe5rman', u'n\xe5r man'), (u'erfire', u'er fire'), (u'Hvorfor\ufb01nderdu', u'Hvorfor \ufb01nder du'), (u'undertigt', u'underligt'), (u'itroen', u'i troen'), (u'erl\xf8gnt', u'er l\xf8gn!'), (u'g\xf8rden', u'g\xf8r den'), (u'forhelvede', u'for helvede'), (u'hjpe', u'hj\xe6lpe'), (u'togeti', u'toget i'), (u'M\xe5jeg', u'M\xe5 jeg'), (u'savnerjer', u'savner jer'), (u'erjeg', u'er jeg'), (u'vaere', u'v\xe6re'), (u'geme', u'gerne'), (u'trorp\xe5', u'tror p\xe5'), (u'forham', u'for ham'), (u'afham', u'af ham'), (u'harjo', u'har jo'), (u'ovema\ufb01et', u'overnattet'), (u'begae\ufb01ighed', u'beg\xe6rlighed'), (u'sy\u2019g', u'syg'), (u'Imensjeg', u'Imens jeg'), (u'bliverdu', u'bliver du'), (u'\ufb01ser', u'fiser'), (u'manipuierer', u'manipulerer'), (u'forjeg', u'for jeg'), (u'iivgivendefor', u'livgivende for'), (u'formig', u'for mig'), (u'Hardu', u'Har du'), (u'fornold', u'forhold'), (u'defrelste', u'de frelste'), (u'S\xe5jeg', u'S\xe5 jeg'), (u'varjeg', u'var jeg'), (u'g\xf8rved', u'g\xf8r ved'), (u'kalderjeg', u'kalder jeg'), (u'\ufb02ytte', u'flytte'), (u'handlerdet', u'handler det'), (u'trorjeg', u'tror jeg'), (u'\ufb02ytter', u'flytter'), (u'soverjeg', u'sover jeg'), (u'\ufb01nderud', u'\ufb01nder ud'), (u'naboerp\xe5', u'naboer p\xe5'), (u'ervildt', u'er vildt'), (u'v\xe6reher', u'v\xe6re her'), (u'hyggerjer', u'hygger jer'), (u'borjo', u'bor jo'), (u'kommerikke', u'kommer ikke'), (u'folkynde', u'forkynde'), (u'farglad', u'far glad'), (u'misterjeg', u'mister jeg'), (u'\ufb01nt', u'fint'), (u'Harl', u'Har I'), (u'bedejer', u'bede jer'), (u'synesjeg', u'synes jeg'), (u'vartil', u'var til'), (u'eren', u'er en'), (u'\\Al', u'Vil'), (u'\\A', u'Vi'), (u'fjeme', u'fjerne'), (u'Iigefyldt', u'lige fyldt'), (u'ertil', u'er til'), (u'fa\ufb01igt', u'farligt'), (u'\ufb01nder', u'finder'), (u'\ufb01ndes', u'findes'), (u'irettesae\ufb01else', u'irettes\xe6ttelse'), (u'ermed', u'er med'), (u'\xe8n', u'\xe9n'), (u'gikjoi', u'gik jo i'), (u'Hvisjeg', u'Hvis jeg'), (u'ovema\ufb01er', u'overnatter'), (u'hoident', u'holdent'), (u'\\Adne', u'Vidne'), (u'fori', u'for i'), (u'vei', u'vel'), (u'savnerjerjo', u'savner jer jo'), (u'elskerjer', u'elsker jer'), (u'harl\xf8jet', u'har l\xf8jet'), (u'eri', u'er i'), (u'\ufb01ende', u'fjende'), (u'derjo', u'der jo'), (u'sigerjo', u'siger jo'), (u'menerjeg', u'mener jeg'), (u'Harjeg', u'Har jeg'), (u'sigerjeg', u'siger jeg'), (u'splitterjeg', u'splitter jeg'), (u'erjournalist', u'er journalist'), (u'erjoumalist', u'er journalist'), (u'Forjeg', u'For jeg'), (u'g\xe2rjeg', u'g\xe5r jeg'), (u'N\xe2rjeg', u'N\xe5r jeg'), (u'a\ufb02lom', u'afkom'), (u'farerjo', u'farer jo'), (u'tagerjeg', u'tager jeg'), (u'Virkerjeg', u'Virker jeg'), (u'morerjer', u'morer jer'), (u'kommerjo', u'kommer jo'), (u'istand', u'i stand'), (u'b\xf8m', u'b\xf8rn'), (u'frygterjeg', u'frygter jeg'), (u'kommerjeg', u'kommer jeg'), (u'eriournalistelev', u'er journalistelev'), (u'harfat', u'har fat'), (u'f\xe5r\ufb01ngre', u'f\xe5r \ufb01ngre'), (u'sl\xe2rjeg', u'sl\xe5r jeg'), (u'bam', u'barn'), (u'erjournalistelev', u'er journalistelev'), (u'politietjo', u'politiet jo'), (u'elskerjo', u'elsker jo'), (u'vari', u'var i'), (u'fornemmerjeres', u'fornemmer jeres'), (u'udkl\xe6kketl', u'udkl\xe6kket!'), (u'\xed', u'i'), (u'nyi', u'ny i'), (u'Iumijelse', u'forn\xf8jelse'), (u'vures', u'vores'), (u'I/Vash\xedngtan', u'Washington'), (u'opleverjeg', u'oplever jeg'), (u'PANTEL\xc3NER', u'PANTEL\xc5NER'), (u'Gudmurgen', u'Godmorgen'), (u'SKYDEV\xc3BEN', u'SKYDEV\xc5BEN'), (u'P\xc3LIDELIG', u'P\xc5LIDELIG'), (u'avertalte', u'overtalte'), (u'Oms\xedder', u'Omsider'), (u'lurteb\xe5d', u'lorteb\xe5d'), (u'Telrslning', u'Tekstning'), (u'miU\xf8', u'milj\xf8'), (u'g\xe5ri', u'g\xe5r i'), (u'Fan/el', u'Farvel'), (u'abe\ufb01\xe6s', u'abefj\xe6s'), (u'hartalt', u'har talt'), (u'\\\xc5rkelig', u'Virkelig'), (u'beklagerjeg', u'beklager jeg'), (u'N\xe5rjeg', u'N\xe5r jeg'), (u'rnaend', u'm\xe6nd'), (u'vaskebjorn', u'vaskebj\xf8rn'), (u'Ivil', u'I vil'), (u'besog', u'bes\xf8g'), (u'Vaer', u'V\xe6r'), (u'Undersogte', u'Unders\xf8gte'), (u'modte', u'm\xf8dte'), (u'toj', u't\xf8j'), (u'fodt', u'f\xf8dt'), (u'gore', u'g\xf8re'), (u'provede', u'pr\xf8vede'), (u'forste', u'f\xf8rste'), (u'igang', u'i gang'), (u'ligenu', u'lige nu'), (u'clet', u'det'), (u'Strombell', u'Strombel!'), (u'tmvlt', u'travlt'), (u'studererjournalistik', u'studerer journalistik'), (u'inforrnererjeg', u'informerer jeg'), (u'omk\ufb01ng', u'omkring'), (u'tilAsg\xe5rd', u'til Asg\xe5rd'), (u'Kederjeg', u'Keder jeg'), (u'jaettetamp', u'j\xe6ttetamp'), (u'erjer', u'er jer'), (u'atjulehygge', u'at julehygge'), (u'Ueneste', u'tjeneste'), (u'foltsaetter', u'forts\xe6tter'), (u'A/ice', u'Alice'), (u'tvivlerjeg', u'tvivler jeg'), (u'henterjer', u'henter jer'), (u'forst\xe5rjeg', u'forst\xe5r jeg'), (u'hvisjeg', u'hvis jeg'), (u'/\xe6rt', u'l\xe6rt'), (u'vfgtrgt', u'vigtigt'), (u'hurtigtjeg', u'hurtigt jeg'), (u'kenderjo', u'kender jo'), (u'seiv', u'selv'), (u'/\xe6gehuset', u'l\xe6gehuset'), (u'herjo', u'her jo'), (u'stolerjeg', u'stoler jeg'), (u'digi', u'dig i'), (u'taberi', u'taber i'), (u'sl\xe5rjeres', u'sl\xe5r jeres'), (u'laere', u'l\xe6re'), (u'tr\xe6nerwushu', u'tr\xe6ner wushu'), (u'efterjeg', u'efter jeg'), (u'e\ufb01er', u'efter'), (u'dui', u'du i'), (u'a\ufb01en', u'aften'), (u'bliveri', u'bliver i'), (u'acceptererjer', u'accepterer jer'), (u'drikkerjo', u'drikker jo'), (u'\ufb01anjin', u'Tianjin'), (u'erl\xe6nge', u'er l\xe6nge'), (u'erikke', u'er ikke'), (u'medjer', u'med jer'), (u'Tmykke', u'Tillykke'), (u"'\ufb01anjins", u'Tianjins'), (u'Mesteri', u'Mester i'), (u'sagdetil', u'sagde til'), (u'indei', u'inde i'), (u'o\ufb01e', u'ofte'), (u"'\ufb01lgiv", u'Tilgiv'), (u'Lf\xe5r', u'I f\xe5r'), (u'viserjer', u'viser jer'), (u'Rejsjerblot', u'Rejs jer blot'), (u"'\ufb01llad", u'Tillad'), (u'iiiie\ufb01nger', u'lille\ufb01nger'), (u'VILOMFATTE', u'VIL OMFATTE'), (u'mo\ufb01o', u'motto'), (u'g\xf8rjer', u'g\xf8r jer'), (u'gifi', u'gift'), (u'hardu', u'har du'), (u'gi\ufb01', u'gift'), (u'Iaeggerjeg', u'l\xe6gger jeg'), (u'iet', u'i et'), (u'sv/yte', u'svigte'), (u'ti/', u'til'), (u'Wdal', u'Vidal'), (u'\ufb01\xe5et', u'f\xe5et'), (u'Hvo/for', u'Hvorfor'), (u'hellerikke', u'heller ikke'), (u'Wlle', u'Ville'), (u'dr/ver', u'driver'), (u'V\\\ufb02lliam', u'William'), (u'V\\\ufb02lliams', u'Williams'), (u'Vk\ufb01lliam', u'William'), (u'v\xe5dejakke', u'v\xe5de jakke'), (u'k\xe6\ufb02l', u'k\xe6ft!'), (u'sagdejeg', u'sagde jeg'), (u'oven/ejet', u'overvejet'), (u'karameisauce', u'karamelsauce'), (u'Lf\xf8lgej\xf8disk', u'If\xf8lge j\xf8disk'), (u'blevjo', u'blev jo'), (u'asiateri', u'asiater i'), (u'erV\\\ufb02lliam', u'er William'), (u'lidt\ufb02ov', u'lidt \ufb02ov'), (u'sagdejo', u'sagde jo'), (u'erlige', u'er lige'), (u'Vt\ufb01lliam', u'William'), (u'W\ufb01II', u'Will'), (u'a\ufb02darede', u'afklarede'), (u'hj\xe6iperjeg', u'hj\xe6lper jeg'), (u'laderjeg', u'lader jeg'), (u'H\xe2ndledsbeskyttere', u'H\xe5ndledsbeskyttere'), (u'Lsabels', u'Isabels'), (u'G\xf8rjeg', u'G\xf8r jeg'), (u'm\xe2jeg', u'm\xe5 jeg'), (u'ogjeg', u'og jeg'), (u'gjordejeg', u'gjorde jeg'), (u'villejeg', u'ville jeg'), (u'Vl\ufb02lliams', u'Williams'), (u'Dajeg', u'Da jeg'), (u'iorden', u'i orden'), (u'fandtjeg', u'fandt jeg'), (u'Tilykke', u'Tillykke'), (u'k\xf8rerjer', u'k\xf8rer jer'), (u'g\xf8fjeg', u'g\xf8r jeg'), (u'Selvflgelig', u'Selvf\xf8lgelig'), (u'fdder', u'fadder'), (u'bnfaldt', u'b\xf8nfaldt'), (u't\\/ehovedede', u'tvehovedede'), (u'EIler', u'Eller'), (u'ringerjeg', u'ringer jeg'), (u'blevv\xe6k', u'blev v\xe6k'), (u'st\xe1rjeg', u'st\xe5r jeg'), (u'varforbi', u'var forbi'), (u'harfortalt', u'har fortalt'), (u'iflere', u'i flere'), (u't\xf8rjeg', u't\xf8r jeg'), (u'kunnejeg', u'kunne jeg'), (u'm\xe1', u'm\xe5'), (u'hart\xe6nkt', u'har t\xe6nkt'), (u'F\xe1rjeg', u'F\xe5r jeg'), (u'afdelingervar', u'afdelinger var'), (u'0rd', u'ord'), (u'p\xe1st\xe1', u'p\xe5st\xe5'), (u'gr\xe1haret', u'gr\xe5haret'), (u'varforbl\xf8ffende', u'var forbl\xf8ffende'), (u'holdtjeg', u'holdt jeg'), (u'h\xe6ngerjo', u'h\xe6nger jo'), (u'fikjeg', u'fik jeg'), (u'f\xe1r', u'f\xe5r'), (u'Hvorforf\xf8lerjeg', u'Hvorfor f\xf8ler jeg'), (u'harfeber', u'har feber'), (u'\xe1ndssvagt', u'\xe5ndssvagt'), (u'0g', u'Og'), (u'vartre', u'var tre'), (u'abner', u'\xe5bner'), (u'garjeg', u'g\xe5r jeg'), (u'sertil', u'ser til'), (u'hvorfin', u'hvor fin'), (u'harfri', u'har fri'), (u'forstarjeg', u'forst\xe5r jeg'), (u'S\xe4', u'S\xe5'), (u'hvorfint', u'hvor fint'), (u'm\xe6rkerjeg', u'm\xe6rker jeg'), (u'ogsa', u'ogs\xe5'), (u'n\xe1rjeg', u'n\xe5r jeg'), (u'Jas\xe1', u'Jas\xe5'), (u'b\xe1ndoptager', u'b\xe5ndoptager'), (u'bed\xe1rende', u'bed\xe5rende'), (u's\xe1', u's\xe5'), (u'n\xe1r', u'n\xe5r'), (u'kunnejo', u'kunne jo'), (u'Brammertil', u'Brammer til'), (u'serjeg', u'ser jeg'), (u'gikjeg', u'gik jeg'), (u'udholderjeg', u'udholder jeg'), (u'm\xe1neder', u'm\xe5neder'), (u'vartr\xe6t', u'var tr\xe6t'), (u'd\xe1rligt', u'd\xe5rligt'), (u'klaretjer', u'klaret jer'), (u'pavirkelig', u'p\xe5virkelig'), (u'spekulererjeg', u'spekulerer jeg'), (u'fors\xf8gerjeg', u'fors\xf8ger jeg'), (u'huskerjeg', u'husker jeg'), (u'ifavnen', u'i favnen'), (u'skullejo', u'skulle jo'), (u'vartung', u'var tung'), (u'varfuldst\xe6ndig', u'var fuldst\xe6ndig'), (u'Paskedag', u'P\xe5skedag'), (u'turi', u'tur i'), (u'spillerschumanns', u'spiller Schumanns'), (u'forst\xe1rjeg', u'forst\xe5r jeg'), (u'istedet', u'i stedet'), (u'n\xe1rfrem', u'n\xe5r frem'), (u'habertrods', u'h\xe5ber trods'), (u'forf\xf8rste', u'for f\xf8rste'), (u'varto', u'var to'), (u'overtil', u'over til'), (u'forfem', u'for fem'), (u'holdtjo', u'holdt jo'), (u'passerjo', u'passer jo'), (u'ellerto', u'eller to'), (u'hartrods', u'har trods'), (u'harfuldst\xe6ndig', u'har fuldst\xe6ndig'), (u'g\xe5rjeg', u'g\xe5r jeg'), (u'giderjeg', u'gider jeg'), (u'forjer', u'for jer'), (u'erindrerjeg', u'erindrer jeg'), (u't\xe6nkerjeg', u't\xe6nker jeg'), (u'GAEt', u'G\xc5ET'), (u'h\xf8rerjo', u'h\xf8rer jo'), (u'forladerjeg', u'forlader jeg'), (u'kosterjo', u'koster jo'), (u'fort\xe6llerjeg', u'fort\xe6ller jeg'), (u'Forstyrrerjeg', u'Forstyrrer jeg'), (u'tjekkerjeg', u'tjekker jeg'), (u'erjurist', u'er jurist'), (u'tlLBUD', u'TILBUD'), (u'serjo', u'se rjo'), (u'bederjeg', u'beder jeg'), (u'bilderjeg', u'bilder jeg'), (u'ULVEtlME', u'ULVETlME'), (u'sk\xe6rerjo', u'sk\xe6rer jo'), (u'afjer', u'af jer'), (u'ordnerjeg', u'ordner jeg'), (u'giverjeg', u'giver jeg'), (u'rejservi', u'rejser vi'), (u'fangerjeg', u'fanger jeg'), (u'erjaloux', u'er jaloux'), (u'glemmerjeg', u'glemmer jeg'), (u'Beh\xf8verjeg', u'Beh\xf8ver jeg'), (u'harvi', u'har vi'), (u'ertyndere', u'er tyndere'), (u'f\xe5rtordenvejr', u'f\xe5r tordenvejr'), (u'varf\xe6rdig', u'var f\xe6rdig'), (u'h\xf8rerfor', u'h\xf8rer for'), (u'varvel', u'var vel'), (u'erforbi', u'er forbi'), (u'AIle', u'Alle'), (u'l\xe6serjo', u'l\xe6ser jo'), (u'Edgarer', u'Edgar er'), (u'hartaget', u'har taget'), (u'derer', u'der er'), (u'stikkerfrem', u'stikker frem'), (u'haraldrig', u'har aldrig'), (u'ellerfar', u'eller far'), (u'erat', u'er at'), (u'turtil', u'tur til'), (u'erf\xe6rdig', u'er f\xe6rdig'), (u'f\xf8lerjeg', u'f\xf8ler jeg'), (u'jerfra', u'jer fra'), (u'eralt', u'er alt'), (u'harfaktisk', u'har faktisk'), (u'harfundet', u'har fundet'), (u'harvendt', u'har vendt'), (u'Kunstneraf', u'Kunstner af'), (u'ervel', u'er vel'), (u'st\xe5ransigt', u'st\xe5r ansigt'), (u'Erjeg', u'Er jeg'), (u'venterjeg', u'venter jeg'), (u'Hvorvar', u'Hvor var'), (u'varfint', u'var fint'), (u'ervarmt', u'er varmt'), (u'g\xe5rfint', u'g\xe5r fint'), (u'flyverforbi', u'flyver forbi'), (u'Dervar', u'Der var'), (u'dervar', u'der var'), (u'mener\xe5ndeligt', u'mener \xe5ndeligt'), (u'forat', u'for at'), (u'herovertil', u'herover til'), (u'soverfor', u'sover for'), (u'begyndtejeg', u'begyndte jeg'), (u'vendertilbage', u'vender tilbage'), (u'erforf\xe6rdelig', u'er forf\xe6rdelig'), (u'g\xf8raltid', u'g\xf8r altid'), (u'ertilbage', u'er tilbage'), (u'harv\xe6ret', u'har v\xe6ret'), (u'bagoverellertil', u'bagover eller til'), (u'hertaler', u'her taler'), (u'v\xe5gnerjeg', u'v\xe5gner jeg'), (u'vartomt', u'var tomt'), (u'g\xe5rfrem', u'g\xe5r frem'), (u'talertil', u'taler til'), (u'ertryg', u'er tryg'), (u'ansigtervendes', u'ansigter vendes'), (u'hervirkeligt', u'her virkeligt'), (u'herer', u'her er'), (u'dr\xf8mmerjo', u'dr\xf8mmer jo'), (u'erfuldkommen', u'er fuldkommen'), (u'hveren', u'hver en'), (u'erfej', u'er fej'), (u'datterforg\xe6ves', u'datter forg\xe6ves'), (u'fors\xf8gerjo', u'fors\xf8ger jo'), (u'ertom', u'er tom'), (u'vareftermiddag', u'var eftermiddag'), (u'vartom', u'var tom'), (u'angerellerforventninger', u'anger eller forventninger'), (u'k\xf8rtejeg', u'k\xf8rte jeg'), (u'Hvorforfort\xe6ller', u'Hvorfor fort\xe6ller'), (u'g\xe5rtil', u'g\xe5r til'), (u'ringerefter', u'ringer efter'), (u's\xf8gertilflugt', u's\xf8ger tilflugt'), (u'ertvunget', u'er tvunget'), (u'megetjeg', u'meget jeg'), (u'varikke', u'var ikke'), (u'Derermange', u'Der e rmange'), (u'dervilhindre', u'der vil hindre'), (u'ers\xe5', u'er s\xe5'), (u'Detforst\xe5rLeggodt', u'Det forst\xe5r jeg godt'), (u'ergodt', u'er godt'), (u'vorventen', u'vor venten'), (u'tagerfejl', u'tager fejl'), (u'ellerer', u'eller er'), (u'laverjeg', u'laver jeg'), (u'0mgang', u'omgang'), (u'afst\xe1r', u'afst\xe5r'), (u'p\xe1', u'p\xe5'), (u'rejserjeg', u'rejser jeg'), (u'ellertage', u'eller tage'), (u'takkerjeg', u'takker jeg'), (u'ertilf\xe6ldigvis', u'er tilf\xe6ldigvis'), (u'fremstar', u'fremst\xe5r'), (u'ert\xe6t', u'er t\xe6t'), (u'ijeres', u'i jeres'), (u'Sagdejeg', u'Sagde jeg'), (u'overi', u'over i'), (u'plukkerjordb\xe6r', u'plukker jordb\xe6r'), (u'klarerjeg', u'klarer jeg'), (u'jerfire', u'jer fire'), (u't\xe1beligste', u't\xe5beligste'), (u'sigertvillingerne', u'siger tvillingerne'), (u'erfaktisk', u'er faktisk'), (u'g\xe1r', u'g\xe5r'), (u'harvasket', u'har vasket'), (u'harplukketjordb\xe6rtil', u'har plukket jordb\xe6r til'), (u'plukketjordb\xe6r', u'plukket jordb\xe6r'), (u'klaverfireh\xe6ndigt', u'klaver fireh\xe6ndigt'), (u'erj\xe6vnaldrende', u'er j\xe6vnaldrende'), (u'tierjeg', u'tier jeg'), (u'Hvorerden', u'Hvor er den'), (u'0veraltjeg', u'overalt jeg'), (u'g\xe5rp\xe5', u'g\xe5r p\xe5'), (u'finderjeg', u'finder jeg'), (u'serhans', u'ser hans'), (u'tiderbliver', u'tider bliver'), (u'ellertrist', u'eller trist'), (u'forst\xe5rjeres', u'forst\xe5r jeres'), (u'Hvorsj\xe6len', u'Hvor sj\xe6len'), (u'finderro', u'finder ro'), (u'sidderjeg', u'sidder jeg'), (u'tagerjo', u'tager jo'), (u'efterjeres', u'efter jeres'), (u'10O', u'100'), (u'besluttedejeg', u'besluttede jeg'), (u'varsket', u'var sket'), (u'uadskillige', u'uadskillelige'), (u'harjetlag', u'har jetlag'), (u'lkke', u'Ikke'), (u'lntet', u'Intet'), (u'afsl\xf8rerjeg', u'afsl\xf8rer jeg'), (u'm\xe5jeg', u'm\xe5 jeg'), (u'Vl', u'VI'), (u'atbygge', u'at bygge'), (u'detmakabre', u'det makabre'), (u'vilikke', u'vil ikke'), (u'talsmandbekr\xe6fter', u'talsmand bekr\xe6fter'), (u'vedatrenovere', u'ved at renovere'), (u'fors\xf8geratforst\xe5', u'fors\xf8ger at forst\xe5'), (u'ersket', u'er sket'), (u'morderp\xe5', u'morder p\xe5'), (u'frifodiRosewood', u'fri fod i Rosewood'), (u'holdtpressem\xf8de', u'holdt pressem\xf8de'), (u'lngen', u'Ingen'), (u'lND', u'IND'), (u'henterjeg', u'henter jeg'), (u'lsabel', u'Isabel'), (u'lsabels', u'Isabels'), (u'vinderjo', u'vinder jo'), (u'r\xf8dmerjo', u'r\xf8dmer jo'), (u'etjakkes\xe6t', u'et jakkes\xe6t'), (u'gl\xe6derjeg', u'gl\xe6der jeg'), (u'lgen', u'Igen'), (u'ls\xe6r', u'Is\xe6r'), (u'iparken', u'i parken'), (u'n\xe5rl', u'n\xe5r I'), (u'tilA1', u'til A1'), (u'FBl', u'FBI'), (u'viljo', u'vil jo'), (u'detp\xe5', u'det p\xe5'), (u'KIar', u'Klar'), (u'PIan', u'Plan'), (u'EIIer', u'Eller'), (u'FIot', u'Flot'), (u'AIIe', u'Alle'), (u'AIt', u'Alt'), (u'KIap', u'Klap'), (u'PIaza', u'Plaza'), (u'SIap', u'Slap'), (u'I\xe5', u'l\xe5'), (u'BIing', u'Bling'), (u'GIade', u'Glade'), (u'Iejrb\xe5lssange', u'lejrb\xe5lssange'), (u'bedtjer', u'bedt jer'), (u'h\xf8rerjeg', u'h\xf8rer jeg'), (u'F\xe5rjeg', u'F\xe5r jeg'), (u'fikJames', u'fik James'), (u'atsnakke', u'at snakke'), (u'varkun', u'var kun'), (u'retterjeg', u'retter jeg'), (u'ernormale', u'er normale'), (u'viljeg', u'vil jeg'), (u'S\xe6tjer', u'S\xe6t jer'), (u'udsatham', u'udsat ham')]), - 'pattern': u"(?um)(\\b|^)(?:Haner|JaveL|Pa\\/\\/e|bffte|Utro\\/\\/gt|Kommerdu|smi\\/er|\\/eg|harvinger|\\/et|erjeres|hardet|t\\\xe6nktjer|erjo|sti\\/|Iappe|Beklagel\\\xe7|vardet|afden|snupperjeg|ikkejeg|bliverjeg|hartravit|pandekagef\\/ag|Stormvarsell|stormvejn|morgenkomp\\/et|\\/yv|varjo|\\/eger|harjeg|havdejeg|hvorjeg|n\\\xe5rjeg|g\\\xe5rvi|atjeg|isine|f\\\xe5rjeg|k\\\xe6rtighed|skullejeg|laest|laese|g\\\xf8rjeg|g\\\xf8rvi|angrerjo|Hvergang|erder|villetilgive|\\\ufb01eme|genopst\\\xe5ri|svigtejer|kommernu|n\\\xe5rman|erfire|Hvorfor\\\ufb01nderdu|undertigt|itroen|erl\\\xf8gnt|g\\\xf8rden|forhelvede|hjpe|togeti|M\\\xe5jeg|savnerjer|erjeg|vaere|geme|trorp\\\xe5|forham|afham|harjo|ovema\\\ufb01et|begae\\\ufb01ighed|sy\\\u2019g|Imensjeg|bliverdu|\\\ufb01ser|manipuierer|forjeg|iivgivendefor|formig|Hardu|fornold|defrelste|S\\\xe5jeg|varjeg|g\\\xf8rved|kalderjeg|\\\ufb02ytte|handlerdet|trorjeg|\\\ufb02ytter|soverjeg|\\\ufb01nderud|naboerp\\\xe5|ervildt|v\\\xe6reher|hyggerjer|borjo|kommerikke|folkynde|farglad|misterjeg|\\\ufb01nt|Harl|bedejer|synesjeg|vartil|eren|\\\\Al|\\\\A|fjeme|Iigefyldt|ertil|fa\\\ufb01igt|\\\ufb01nder|\\\ufb01ndes|irettesae\\\ufb01else|ermed|\\\xe8n|gikjoi|Hvisjeg|ovema\\\ufb01er|hoident|\\\\Adne|fori|vei|savnerjerjo|elskerjer|harl\\\xf8jet|eri|\\\ufb01ende|derjo|sigerjo|menerjeg|Harjeg|sigerjeg|splitterjeg|erjournalist|erjoumalist|Forjeg|g\\\xe2rjeg|N\\\xe2rjeg|a\\\ufb02lom|farerjo|tagerjeg|Virkerjeg|morerjer|kommerjo|istand|b\\\xf8m|frygterjeg|kommerjeg|eriournalistelev|harfat|f\\\xe5r\\\ufb01ngre|sl\\\xe2rjeg|bam|erjournalistelev|politietjo|elskerjo|vari|fornemmerjeres|udkl\\\xe6kketl|\\\xed|nyi|Iumijelse|vures|I\\/Vash\\\xedngtan|opleverjeg|PANTEL\\\xc3NER|Gudmurgen|SKYDEV\\\xc3BEN|P\\\xc3LIDELIG|avertalte|Oms\\\xedder|lurteb\\\xe5d|Telrslning|miU\\\xf8|g\\\xe5ri|Fan\\/el|abe\\\ufb01\\\xe6s|hartalt|\\\\\\\xc5rkelig|beklagerjeg|N\\\xe5rjeg|rnaend|vaskebjorn|Ivil|besog|Vaer|Undersogte|modte|toj|fodt|gore|provede|forste|igang|ligenu|clet|Strombell|tmvlt|studererjournalistik|inforrnererjeg|omk\\\ufb01ng|tilAsg\\\xe5rd|Kederjeg|jaettetamp|erjer|atjulehygge|Ueneste|foltsaetter|A\\/ice|tvivlerjeg|henterjer|forst\\\xe5rjeg|hvisjeg|\\/\\\xe6rt|vfgtrgt|hurtigtjeg|kenderjo|seiv|\\/\\\xe6gehuset|herjo|stolerjeg|digi|taberi|sl\\\xe5rjeres|laere|tr\\\xe6nerwushu|efterjeg|e\\\ufb01er|dui|a\\\ufb01en|bliveri|acceptererjer|drikkerjo|\\\ufb01anjin|erl\\\xe6nge|erikke|medjer|Tmykke|\\'\\\ufb01anjins|Mesteri|sagdetil|indei|o\\\ufb01e|\\'\\\ufb01lgiv|Lf\\\xe5r|viserjer|Rejsjerblot|\\'\\\ufb01llad|iiiie\\\ufb01nger|VILOMFATTE|mo\\\ufb01o|g\\\xf8rjer|gifi|hardu|gi\\\ufb01|Iaeggerjeg|iet|sv\\/yte|ti\\/|Wdal|\\\ufb01\\\xe5et|Hvo\\/for|hellerikke|Wlle|dr\\/ver|V\\\\\\\ufb02lliam|V\\\\\\\ufb02lliams|Vk\\\ufb01lliam|v\\\xe5dejakke|k\\\xe6\\\ufb02l|sagdejeg|oven\\/ejet|karameisauce|Lf\\\xf8lgej\\\xf8disk|blevjo|asiateri|erV\\\\\\\ufb02lliam|lidt\\\ufb02ov|sagdejo|erlige|Vt\\\ufb01lliam|W\\\ufb01II|a\\\ufb02darede|hj\\\xe6iperjeg|laderjeg|H\\\xe2ndledsbeskyttere|Lsabels|G\\\xf8rjeg|m\\\xe2jeg|ogjeg|gjordejeg|villejeg|Vl\\\ufb02lliams|Dajeg|iorden|fandtjeg|Tilykke|k\\\xf8rerjer|g\\\xf8fjeg|Selvflgelig|fdder|bnfaldt|t\\\\\\/ehovedede|EIler|ringerjeg|blevv\\\xe6k|st\\\xe1rjeg|varforbi|harfortalt|iflere|t\\\xf8rjeg|kunnejeg|m\\\xe1|hart\\\xe6nkt|F\\\xe1rjeg|afdelingervar|0rd|p\\\xe1st\\\xe1|gr\\\xe1haret|varforbl\\\xf8ffende|holdtjeg|h\\\xe6ngerjo|fikjeg|f\\\xe1r|Hvorforf\\\xf8lerjeg|harfeber|\\\xe1ndssvagt|0g|vartre|abner|garjeg|sertil|hvorfin|harfri|forstarjeg|S\\\xe4|hvorfint|m\\\xe6rkerjeg|ogsa|n\\\xe1rjeg|Jas\\\xe1|b\\\xe1ndoptager|bed\\\xe1rende|s\\\xe1|n\\\xe1r|kunnejo|Brammertil|serjeg|gikjeg|udholderjeg|m\\\xe1neder|vartr\\\xe6t|d\\\xe1rligt|klaretjer|pavirkelig|spekulererjeg|fors\\\xf8gerjeg|huskerjeg|ifavnen|skullejo|vartung|varfuldst\\\xe6ndig|Paskedag|turi|spillerschumanns|forst\\\xe1rjeg|istedet|n\\\xe1rfrem|habertrods|forf\\\xf8rste|varto|overtil|forfem|holdtjo|passerjo|ellerto|hartrods|harfuldst\\\xe6ndig|g\\\xe5rjeg|giderjeg|forjer|erindrerjeg|t\\\xe6nkerjeg|GAEt|h\\\xf8rerjo|forladerjeg|kosterjo|fort\\\xe6llerjeg|Forstyrrerjeg|tjekkerjeg|erjurist|tlLBUD|serjo|bederjeg|bilderjeg|ULVEtlME|sk\\\xe6rerjo|afjer|ordnerjeg|giverjeg|rejservi|fangerjeg|erjaloux|glemmerjeg|Beh\\\xf8verjeg|harvi|ertyndere|f\\\xe5rtordenvejr|varf\\\xe6rdig|h\\\xf8rerfor|varvel|erforbi|AIle|l\\\xe6serjo|Edgarer|hartaget|derer|stikkerfrem|haraldrig|ellerfar|erat|turtil|erf\\\xe6rdig|f\\\xf8lerjeg|jerfra|eralt|harfaktisk|harfundet|harvendt|Kunstneraf|ervel|st\\\xe5ransigt|Erjeg|venterjeg|Hvorvar|varfint|ervarmt|g\\\xe5rfint|flyverforbi|Dervar|dervar|mener\\\xe5ndeligt|forat|herovertil|soverfor|begyndtejeg|vendertilbage|erforf\\\xe6rdelig|g\\\xf8raltid|ertilbage|harv\\\xe6ret|bagoverellertil|hertaler|v\\\xe5gnerjeg|vartomt|g\\\xe5rfrem|talertil|ertryg|ansigtervendes|hervirkeligt|herer|dr\\\xf8mmerjo|erfuldkommen|hveren|erfej|datterforg\\\xe6ves|fors\\\xf8gerjo|ertom|vareftermiddag|vartom|angerellerforventninger|k\\\xf8rtejeg|Hvorforfort\\\xe6ller|g\\\xe5rtil|ringerefter|s\\\xf8gertilflugt|ertvunget|megetjeg|varikke|Derermange|dervilhindre|ers\\\xe5|Detforst\\\xe5rLeggodt|ergodt|vorventen|tagerfejl|ellerer|laverjeg|0mgang|afst\\\xe1r|p\\\xe1|rejserjeg|ellertage|takkerjeg|ertilf\\\xe6ldigvis|fremstar|ert\\\xe6t|ijeres|Sagdejeg|overi|plukkerjordb\\\xe6r|klarerjeg|jerfire|t\\\xe1beligste|sigertvillingerne|erfaktisk|g\\\xe1r|harvasket|harplukketjordb\\\xe6rtil|plukketjordb\\\xe6r|klaverfireh\\\xe6ndigt|erj\\\xe6vnaldrende|tierjeg|Hvorerden|0veraltjeg|g\\\xe5rp\\\xe5|finderjeg|serhans|tiderbliver|ellertrist|forst\\\xe5rjeres|Hvorsj\\\xe6len|finderro|sidderjeg|tagerjo|efterjeres|10O|besluttedejeg|varsket|uadskillige|harjetlag|lkke|lntet|afsl\\\xf8rerjeg|m\\\xe5jeg|Vl|atbygge|detmakabre|vilikke|talsmandbekr\\\xe6fter|vedatrenovere|fors\\\xf8geratforst\\\xe5|ersket|morderp\\\xe5|frifodiRosewood|holdtpressem\\\xf8de|lngen|lND|henterjeg|lsabel|lsabels|vinderjo|r\\\xf8dmerjo|etjakkes\\\xe6t|gl\\\xe6derjeg|lgen|ls\\\xe6r|iparken|n\\\xe5rl|tilA1|FBl|viljo|detp\\\xe5|KIar|PIan|EIIer|FIot|AIIe|AIt|KIap|PIaza|SIap|I\\\xe5|BIing|GIade|Iejrb\\\xe5lssange|bedtjer|h\\\xf8rerjeg|F\\\xe5rjeg|fikJames|atsnakke|varkun|retterjeg|ernormale|viljeg|S\\\xe6tjer|udsatham)(\\b|$)"}}, + 'WholeWords': {'data': OrderedDict([(u'Haner', u'Han er'), (u'JaveL', u'Javel'), (u'Pa//e', u'Palle'), (u'bffte', u'bitte'), (u'Utro//gt', u'Utroligt'), (u'Kommerdu', u'Kommer du'), (u'smi/er', u'smiler'), (u'/eg', u'leg'), (u'harvinger', u'har vinger'), (u'/et', u'let'), (u'erjeres', u'er jeres'), (u'hardet', u'har det'), (u't\xe6nktjer', u't\xe6nkt jer'), (u'erjo', u'er jo'), (u'sti/', u'stil'), (u'Iappe', u'lappe'), (u'Beklagel\xe7', u'Beklager,'), (u'vardet', u'var det'), (u'afden', u'af den'), (u'snupperjeg', u'snupper jeg'), (u'ikkejeg', u'ikke jeg'), (u'bliverjeg', u'bliver jeg'), (u'hartravit', u'har travlt'), (u'pandekagef/ag', u'pandekageflag'), (u'Stormvarsell', u'Stormvarsel!'), (u'stormvejn', u'stormvejr.'), (u'morgenkomp/et', u'morgenkomplet'), (u'/yv', u'lyv'), (u'varjo', u'var jo'), (u'/eger', u'leger'), (u'harjeg', u'har jeg'), (u'havdejeg', u'havde jeg'), (u'hvorjeg', u'hvor jeg'), (u'n\xe5rjeg', u'n\xe5r jeg'), (u'g\xe5rvi', u'g\xe5r vi'), (u'atjeg', u'at jeg'), (u'isine', u'i sine'), (u'f\xe5rjeg', u'f\xe5r jeg'), (u'k\xe6rtighed', u'k\xe6rlighed'), (u'skullejeg', u'skulle jeg'), (u'laest', u'l\xe6st'), (u'laese', u'l\xe6se'), (u'g\xf8rjeg', u'g\xf8r jeg'), (u'g\xf8rvi', u'g\xf8r vi'), (u'angrerjo', u'angrer jo'), (u'Hvergang', u'Hver gang'), (u'erder', u'er der'), (u'villetilgive', u'ville tilgive'), (u'\ufb01eme', u'fjeme'), (u'genopst\xe5ri', u'genopst\xe5r i'), (u'svigtejer', u'svigte jer'), (u'kommernu', u'kommer nu'), (u'n\xe5rman', u'n\xe5r man'), (u'erfire', u'er fire'), (u'Hvorfor\ufb01nderdu', u'Hvorfor \ufb01nder du'), (u'undertigt', u'underligt'), (u'itroen', u'i troen'), (u'erl\xf8gnt', u'er l\xf8gn!'), (u'g\xf8rden', u'g\xf8r den'), (u'forhelvede', u'for helvede'), (u'hjpe', u'hj\xe6lpe'), (u'togeti', u'toget i'), (u'M\xe5jeg', u'M\xe5 jeg'), (u'savnerjer', u'savner jer'), (u'erjeg', u'er jeg'), (u'vaere', u'v\xe6re'), (u'geme', u'gerne'), (u'trorp\xe5', u'tror p\xe5'), (u'forham', u'for ham'), (u'afham', u'af ham'), (u'harjo', u'har jo'), (u'ovema\ufb01et', u'overnattet'), (u'begae\ufb01ighed', u'beg\xe6rlighed'), (u'sy\u2019g', u'syg'), (u'Imensjeg', u'Imens jeg'), (u'bliverdu', u'bliver du'), (u'\ufb01ser', u'fiser'), (u'manipuierer', u'manipulerer'), (u'forjeg', u'for jeg'), (u'iivgivendefor', u'livgivende for'), (u'formig', u'for mig'), (u'Hardu', u'Har du'), (u'fornold', u'forhold'), (u'defrelste', u'de frelste'), (u'S\xe5jeg', u'S\xe5 jeg'), (u'varjeg', u'var jeg'), (u'g\xf8rved', u'g\xf8r ved'), (u'kalderjeg', u'kalder jeg'), (u'\ufb02ytte', u'flytte'), (u'handlerdet', u'handler det'), (u'trorjeg', u'tror jeg'), (u'\ufb02ytter', u'flytter'), (u'soverjeg', u'sover jeg'), (u'\ufb01nderud', u'\ufb01nder ud'), (u'naboerp\xe5', u'naboer p\xe5'), (u'ervildt', u'er vildt'), (u'v\xe6reher', u'v\xe6re her'), (u'hyggerjer', u'hygger jer'), (u'borjo', u'bor jo'), (u'kommerikke', u'kommer ikke'), (u'folkynde', u'forkynde'), (u'farglad', u'far glad'), (u'misterjeg', u'mister jeg'), (u'\ufb01nt', u'fint'), (u'Harl', u'Har I'), (u'bedejer', u'bede jer'), (u'synesjeg', u'synes jeg'), (u'vartil', u'var til'), (u'eren', u'er en'), (u'\\Al', u'Vil'), (u'\\A', u'Vi'), (u'fjeme', u'fjerne'), (u'Iigefyldt', u'lige fyldt'), (u'ertil', u'er til'), (u'fa\ufb01igt', u'farligt'), (u'\ufb01nder', u'finder'), (u'\ufb01ndes', u'findes'), (u'irettesae\ufb01else', u'irettes\xe6ttelse'), (u'ermed', u'er med'), (u'\xe8n', u'\xe9n'), (u'gikjoi', u'gik jo i'), (u'Hvisjeg', u'Hvis jeg'), (u'ovema\ufb01er', u'overnatter'), (u'hoident', u'holdent'), (u'\\Adne', u'Vidne'), (u'fori', u'for i'), (u'vei', u'vel'), (u'savnerjerjo', u'savner jer jo'), (u'elskerjer', u'elsker jer'), (u'harl\xf8jet', u'har l\xf8jet'), (u'eri', u'er i'), (u'\ufb01ende', u'fjende'), (u'derjo', u'der jo'), (u'sigerjo', u'siger jo'), (u'menerjeg', u'mener jeg'), (u'Harjeg', u'Har jeg'), (u'sigerjeg', u'siger jeg'), (u'splitterjeg', u'splitter jeg'), (u'erjournalist', u'er journalist'), (u'erjoumalist', u'er journalist'), (u'Forjeg', u'For jeg'), (u'g\xe2rjeg', u'g\xe5r jeg'), (u'N\xe2rjeg', u'N\xe5r jeg'), (u'a\ufb02lom', u'afkom'), (u'farerjo', u'farer jo'), (u'tagerjeg', u'tager jeg'), (u'Virkerjeg', u'Virker jeg'), (u'morerjer', u'morer jer'), (u'kommerjo', u'kommer jo'), (u'istand', u'i stand'), (u'b\xf8m', u'b\xf8rn'), (u'frygterjeg', u'frygter jeg'), (u'kommerjeg', u'kommer jeg'), (u'eriournalistelev', u'er journalistelev'), (u'harfat', u'har fat'), (u'f\xe5r\ufb01ngre', u'f\xe5r \ufb01ngre'), (u'sl\xe2rjeg', u'sl\xe5r jeg'), (u'bam', u'barn'), (u'erjournalistelev', u'er journalistelev'), (u'politietjo', u'politiet jo'), (u'elskerjo', u'elsker jo'), (u'vari', u'var i'), (u'fornemmerjeres', u'fornemmer jeres'), (u'udkl\xe6kketl', u'udkl\xe6kket!'), (u'\xed', u'i'), (u'nyi', u'ny i'), (u'Iumijelse', u'forn\xf8jelse'), (u'vures', u'vores'), (u'I/Vash\xedngtan', u'Washington'), (u'opleverjeg', u'oplever jeg'), (u'PANTEL\xc3NER', u'PANTEL\xc5NER'), (u'Gudmurgen', u'Godmorgen'), (u'SKYDEV\xc3BEN', u'SKYDEV\xc5BEN'), (u'P\xc3LIDELIG', u'P\xc5LIDELIG'), (u'avertalte', u'overtalte'), (u'Oms\xedder', u'Omsider'), (u'lurteb\xe5d', u'lorteb\xe5d'), (u'Telrslning', u'Tekstning'), (u'miU\xf8', u'milj\xf8'), (u'g\xe5ri', u'g\xe5r i'), (u'Fan/el', u'Farvel'), (u'abe\ufb01\xe6s', u'abefj\xe6s'), (u'hartalt', u'har talt'), (u'\\\xc5rkelig', u'Virkelig'), (u'beklagerjeg', u'beklager jeg'), (u'N\xe5rjeg', u'N\xe5r jeg'), (u'rnaend', u'm\xe6nd'), (u'vaskebjorn', u'vaskebj\xf8rn'), (u'Ivil', u'I vil'), (u'besog', u'bes\xf8g'), (u'Vaer', u'V\xe6r'), (u'Undersogte', u'Unders\xf8gte'), (u'modte', u'm\xf8dte'), (u'toj', u't\xf8j'), (u'fodt', u'f\xf8dt'), (u'gore', u'g\xf8re'), (u'provede', u'pr\xf8vede'), (u'forste', u'f\xf8rste'), (u'igang', u'i gang'), (u'ligenu', u'lige nu'), (u'clet', u'det'), (u'Strombell', u'Strombel!'), (u'tmvlt', u'travlt'), (u'studererjournalistik', u'studerer journalistik'), (u'inforrnererjeg', u'informerer jeg'), (u'omk\ufb01ng', u'omkring'), (u'tilAsg\xe5rd', u'til Asg\xe5rd'), (u'Kederjeg', u'Keder jeg'), (u'jaettetamp', u'j\xe6ttetamp'), (u'erjer', u'er jer'), (u'atjulehygge', u'at julehygge'), (u'Ueneste', u'tjeneste'), (u'foltsaetter', u'forts\xe6tter'), (u'A/ice', u'Alice'), (u'tvivlerjeg', u'tvivler jeg'), (u'henterjer', u'henter jer'), (u'forst\xe5rjeg', u'forst\xe5r jeg'), (u'hvisjeg', u'hvis jeg'), (u'/\xe6rt', u'l\xe6rt'), (u'vfgtrgt', u'vigtigt'), (u'hurtigtjeg', u'hurtigt jeg'), (u'kenderjo', u'kender jo'), (u'seiv', u'selv'), (u'/\xe6gehuset', u'l\xe6gehuset'), (u'herjo', u'her jo'), (u'stolerjeg', u'stoler jeg'), (u'digi', u'dig i'), (u'taberi', u'taber i'), (u'sl\xe5rjeres', u'sl\xe5r jeres'), (u'laere', u'l\xe6re'), (u'tr\xe6nerwushu', u'tr\xe6ner wushu'), (u'efterjeg', u'efter jeg'), (u'e\ufb01er', u'efter'), (u'dui', u'du i'), (u'a\ufb01en', u'aften'), (u'bliveri', u'bliver i'), (u'acceptererjer', u'accepterer jer'), (u'drikkerjo', u'drikker jo'), (u'\ufb01anjin', u'Tianjin'), (u'erl\xe6nge', u'er l\xe6nge'), (u'erikke', u'er ikke'), (u'medjer', u'med jer'), (u'Tmykke', u'Tillykke'), (u"'\ufb01anjins", u'Tianjins'), (u'Mesteri', u'Mester i'), (u'sagdetil', u'sagde til'), (u'indei', u'inde i'), (u'o\ufb01e', u'ofte'), (u"'\ufb01lgiv", u'Tilgiv'), (u'Lf\xe5r', u'I f\xe5r'), (u'viserjer', u'viser jer'), (u'Rejsjerblot', u'Rejs jer blot'), (u"'\ufb01llad", u'Tillad'), (u'iiiie\ufb01nger', u'lille\ufb01nger'), (u'VILOMFATTE', u'VIL OMFATTE'), (u'mo\ufb01o', u'motto'), (u'g\xf8rjer', u'g\xf8r jer'), (u'gifi', u'gift'), (u'hardu', u'har du'), (u'gi\ufb01', u'gift'), (u'Iaeggerjeg', u'l\xe6gger jeg'), (u'iet', u'i et'), (u'sv/yte', u'svigte'), (u'ti/', u'til'), (u'Wdal', u'Vidal'), (u'\ufb01\xe5et', u'f\xe5et'), (u'Hvo/for', u'Hvorfor'), (u'hellerikke', u'heller ikke'), (u'Wlle', u'Ville'), (u'dr/ver', u'driver'), (u'V\\\ufb02lliam', u'William'), (u'V\\\ufb02lliams', u'Williams'), (u'Vk\ufb01lliam', u'William'), (u'v\xe5dejakke', u'v\xe5de jakke'), (u'k\xe6\ufb02l', u'k\xe6ft!'), (u'sagdejeg', u'sagde jeg'), (u'oven/ejet', u'overvejet'), (u'karameisauce', u'karamelsauce'), (u'Lf\xf8lgej\xf8disk', u'If\xf8lge j\xf8disk'), (u'blevjo', u'blev jo'), (u'asiateri', u'asiater i'), (u'erV\\\ufb02lliam', u'er William'), (u'lidt\ufb02ov', u'lidt \ufb02ov'), (u'sagdejo', u'sagde jo'), (u'erlige', u'er lige'), (u'Vt\ufb01lliam', u'William'), (u'W\ufb01II', u'Will'), (u'a\ufb02darede', u'afklarede'), (u'hj\xe6iperjeg', u'hj\xe6lper jeg'), (u'laderjeg', u'lader jeg'), (u'H\xe2ndledsbeskyttere', u'H\xe5ndledsbeskyttere'), (u'Lsabels', u'Isabels'), (u'G\xf8rjeg', u'G\xf8r jeg'), (u'm\xe2jeg', u'm\xe5 jeg'), (u'ogjeg', u'og jeg'), (u'gjordejeg', u'gjorde jeg'), (u'villejeg', u'ville jeg'), (u'Vl\ufb02lliams', u'Williams'), (u'Dajeg', u'Da jeg'), (u'iorden', u'i orden'), (u'fandtjeg', u'fandt jeg'), (u'Tilykke', u'Tillykke'), (u'k\xf8rerjer', u'k\xf8rer jer'), (u'g\xf8fjeg', u'g\xf8r jeg'), (u'Selvflgelig', u'Selvf\xf8lgelig'), (u'fdder', u'fadder'), (u'bnfaldt', u'b\xf8nfaldt'), (u't\\/ehovedede', u'tvehovedede'), (u'EIler', u'Eller'), (u'ringerjeg', u'ringer jeg'), (u'blevv\xe6k', u'blev v\xe6k'), (u'st\xe1rjeg', u'st\xe5r jeg'), (u'varforbi', u'var forbi'), (u'harfortalt', u'har fortalt'), (u'iflere', u'i flere'), (u't\xf8rjeg', u't\xf8r jeg'), (u'kunnejeg', u'kunne jeg'), (u'm\xe1', u'm\xe5'), (u'hart\xe6nkt', u'har t\xe6nkt'), (u'F\xe1rjeg', u'F\xe5r jeg'), (u'afdelingervar', u'afdelinger var'), (u'0rd', u'ord'), (u'p\xe1st\xe1', u'p\xe5st\xe5'), (u'gr\xe1haret', u'gr\xe5haret'), (u'varforbl\xf8ffende', u'var forbl\xf8ffende'), (u'holdtjeg', u'holdt jeg'), (u'h\xe6ngerjo', u'h\xe6nger jo'), (u'fikjeg', u'fik jeg'), (u'f\xe1r', u'f\xe5r'), (u'Hvorforf\xf8lerjeg', u'Hvorfor f\xf8ler jeg'), (u'harfeber', u'har feber'), (u'\xe1ndssvagt', u'\xe5ndssvagt'), (u'0g', u'Og'), (u'vartre', u'var tre'), (u'abner', u'\xe5bner'), (u'garjeg', u'g\xe5r jeg'), (u'sertil', u'ser til'), (u'hvorfin', u'hvor fin'), (u'harfri', u'har fri'), (u'forstarjeg', u'forst\xe5r jeg'), (u'S\xe4', u'S\xe5'), (u'hvorfint', u'hvor fint'), (u'm\xe6rkerjeg', u'm\xe6rker jeg'), (u'ogsa', u'ogs\xe5'), (u'n\xe1rjeg', u'n\xe5r jeg'), (u'Jas\xe1', u'Jas\xe5'), (u'b\xe1ndoptager', u'b\xe5ndoptager'), (u'bed\xe1rende', u'bed\xe5rende'), (u's\xe1', u's\xe5'), (u'n\xe1r', u'n\xe5r'), (u'kunnejo', u'kunne jo'), (u'Brammertil', u'Brammer til'), (u'serjeg', u'ser jeg'), (u'gikjeg', u'gik jeg'), (u'udholderjeg', u'udholder jeg'), (u'm\xe1neder', u'm\xe5neder'), (u'vartr\xe6t', u'var tr\xe6t'), (u'd\xe1rligt', u'd\xe5rligt'), (u'klaretjer', u'klaret jer'), (u'pavirkelig', u'p\xe5virkelig'), (u'spekulererjeg', u'spekulerer jeg'), (u'fors\xf8gerjeg', u'fors\xf8ger jeg'), (u'huskerjeg', u'husker jeg'), (u'ifavnen', u'i favnen'), (u'skullejo', u'skulle jo'), (u'vartung', u'var tung'), (u'varfuldst\xe6ndig', u'var fuldst\xe6ndig'), (u'Paskedag', u'P\xe5skedag'), (u'turi', u'tur i'), (u'spillerschumanns', u'spiller Schumanns'), (u'forst\xe1rjeg', u'forst\xe5r jeg'), (u'istedet', u'i stedet'), (u'n\xe1rfrem', u'n\xe5r frem'), (u'habertrods', u'h\xe5ber trods'), (u'forf\xf8rste', u'for f\xf8rste'), (u'varto', u'var to'), (u'overtil', u'over til'), (u'forfem', u'for fem'), (u'holdtjo', u'holdt jo'), (u'passerjo', u'passer jo'), (u'ellerto', u'eller to'), (u'hartrods', u'har trods'), (u'harfuldst\xe6ndig', u'har fuldst\xe6ndig'), (u'g\xe5rjeg', u'g\xe5r jeg'), (u'giderjeg', u'gider jeg'), (u'forjer', u'for jer'), (u'erindrerjeg', u'erindrer jeg'), (u't\xe6nkerjeg', u't\xe6nker jeg'), (u'GAEt', u'G\xc5ET'), (u'h\xf8rerjo', u'h\xf8rer jo'), (u'forladerjeg', u'forlader jeg'), (u'kosterjo', u'koster jo'), (u'fort\xe6llerjeg', u'fort\xe6ller jeg'), (u'Forstyrrerjeg', u'Forstyrrer jeg'), (u'tjekkerjeg', u'tjekker jeg'), (u'erjurist', u'er jurist'), (u'tlLBUD', u'TILBUD'), (u'serjo', u'se rjo'), (u'bederjeg', u'beder jeg'), (u'bilderjeg', u'bilder jeg'), (u'ULVEtlME', u'ULVETlME'), (u'sk\xe6rerjo', u'sk\xe6rer jo'), (u'afjer', u'af jer'), (u'ordnerjeg', u'ordner jeg'), (u'giverjeg', u'giver jeg'), (u'rejservi', u'rejser vi'), (u'fangerjeg', u'fanger jeg'), (u'erjaloux', u'er jaloux'), (u'glemmerjeg', u'glemmer jeg'), (u'Beh\xf8verjeg', u'Beh\xf8ver jeg'), (u'harvi', u'har vi'), (u'ertyndere', u'er tyndere'), (u'f\xe5rtordenvejr', u'f\xe5r tordenvejr'), (u'varf\xe6rdig', u'var f\xe6rdig'), (u'h\xf8rerfor', u'h\xf8rer for'), (u'varvel', u'var vel'), (u'erforbi', u'er forbi'), (u'AIle', u'Alle'), (u'l\xe6serjo', u'l\xe6ser jo'), (u'Edgarer', u'Edgar er'), (u'hartaget', u'har taget'), (u'derer', u'der er'), (u'stikkerfrem', u'stikker frem'), (u'haraldrig', u'har aldrig'), (u'ellerfar', u'eller far'), (u'erat', u'er at'), (u'turtil', u'tur til'), (u'erf\xe6rdig', u'er f\xe6rdig'), (u'f\xf8lerjeg', u'f\xf8ler jeg'), (u'jerfra', u'jer fra'), (u'eralt', u'er alt'), (u'harfaktisk', u'har faktisk'), (u'harfundet', u'har fundet'), (u'harvendt', u'har vendt'), (u'Kunstneraf', u'Kunstner af'), (u'ervel', u'er vel'), (u'st\xe5ransigt', u'st\xe5r ansigt'), (u'Erjeg', u'Er jeg'), (u'venterjeg', u'venter jeg'), (u'Hvorvar', u'Hvor var'), (u'varfint', u'var fint'), (u'ervarmt', u'er varmt'), (u'g\xe5rfint', u'g\xe5r fint'), (u'flyverforbi', u'flyver forbi'), (u'Dervar', u'Der var'), (u'dervar', u'der var'), (u'mener\xe5ndeligt', u'mener \xe5ndeligt'), (u'forat', u'for at'), (u'herovertil', u'herover til'), (u'soverfor', u'sover for'), (u'begyndtejeg', u'begyndte jeg'), (u'vendertilbage', u'vender tilbage'), (u'erforf\xe6rdelig', u'er forf\xe6rdelig'), (u'g\xf8raltid', u'g\xf8r altid'), (u'ertilbage', u'er tilbage'), (u'harv\xe6ret', u'har v\xe6ret'), (u'bagoverellertil', u'bagover eller til'), (u'hertaler', u'her taler'), (u'v\xe5gnerjeg', u'v\xe5gner jeg'), (u'vartomt', u'var tomt'), (u'g\xe5rfrem', u'g\xe5r frem'), (u'talertil', u'taler til'), (u'ertryg', u'er tryg'), (u'ansigtervendes', u'ansigter vendes'), (u'hervirkeligt', u'her virkeligt'), (u'herer', u'her er'), (u'dr\xf8mmerjo', u'dr\xf8mmer jo'), (u'erfuldkommen', u'er fuldkommen'), (u'hveren', u'hver en'), (u'erfej', u'er fej'), (u'datterforg\xe6ves', u'datter forg\xe6ves'), (u'fors\xf8gerjo', u'fors\xf8ger jo'), (u'ertom', u'er tom'), (u'vareftermiddag', u'var eftermiddag'), (u'vartom', u'var tom'), (u'angerellerforventninger', u'anger eller forventninger'), (u'k\xf8rtejeg', u'k\xf8rte jeg'), (u'Hvorforfort\xe6ller', u'Hvorfor fort\xe6ller'), (u'g\xe5rtil', u'g\xe5r til'), (u'ringerefter', u'ringer efter'), (u's\xf8gertilflugt', u's\xf8ger tilflugt'), (u'ertvunget', u'er tvunget'), (u'megetjeg', u'meget jeg'), (u'varikke', u'var ikke'), (u'Derermange', u'Der e rmange'), (u'dervilhindre', u'der vil hindre'), (u'ers\xe5', u'er s\xe5'), (u'Detforst\xe5rLeggodt', u'Det forst\xe5r jeg godt'), (u'ergodt', u'er godt'), (u'vorventen', u'vor venten'), (u'tagerfejl', u'tager fejl'), (u'ellerer', u'eller er'), (u'laverjeg', u'laver jeg'), (u'0mgang', u'omgang'), (u'afst\xe1r', u'afst\xe5r'), (u'p\xe1', u'p\xe5'), (u'rejserjeg', u'rejser jeg'), (u'ellertage', u'eller tage'), (u'takkerjeg', u'takker jeg'), (u'ertilf\xe6ldigvis', u'er tilf\xe6ldigvis'), (u'fremstar', u'fremst\xe5r'), (u'ert\xe6t', u'er t\xe6t'), (u'ijeres', u'i jeres'), (u'Sagdejeg', u'Sagde jeg'), (u'overi', u'over i'), (u'plukkerjordb\xe6r', u'plukker jordb\xe6r'), (u'klarerjeg', u'klarer jeg'), (u'jerfire', u'jer fire'), (u't\xe1beligste', u't\xe5beligste'), (u'sigertvillingerne', u'siger tvillingerne'), (u'erfaktisk', u'er faktisk'), (u'g\xe1r', u'g\xe5r'), (u'harvasket', u'har vasket'), (u'harplukketjordb\xe6rtil', u'har plukket jordb\xe6r til'), (u'plukketjordb\xe6r', u'plukket jordb\xe6r'), (u'klaverfireh\xe6ndigt', u'klaver fireh\xe6ndigt'), (u'erj\xe6vnaldrende', u'er j\xe6vnaldrende'), (u'tierjeg', u'tier jeg'), (u'Hvorerden', u'Hvor er den'), (u'0veraltjeg', u'overalt jeg'), (u'g\xe5rp\xe5', u'g\xe5r p\xe5'), (u'finderjeg', u'finder jeg'), (u'serhans', u'ser hans'), (u'tiderbliver', u'tider bliver'), (u'ellertrist', u'eller trist'), (u'forst\xe5rjeres', u'forst\xe5r jeres'), (u'Hvorsj\xe6len', u'Hvor sj\xe6len'), (u'finderro', u'finder ro'), (u'sidderjeg', u'sidder jeg'), (u'tagerjo', u'tager jo'), (u'efterjeres', u'efter jeres'), (u'10O', u'100'), (u'besluttedejeg', u'besluttede jeg'), (u'varsket', u'var sket'), (u'uadskillige', u'uadskillelige'), (u'harjetlag', u'har jetlag'), (u'lkke', u'Ikke'), (u'lntet', u'Intet'), (u'afsl\xf8rerjeg', u'afsl\xf8rer jeg'), (u'm\xe5jeg', u'm\xe5 jeg'), (u'Vl', u'VI'), (u'atbygge', u'at bygge'), (u'detmakabre', u'det makabre'), (u'vilikke', u'vil ikke'), (u'talsmandbekr\xe6fter', u'talsmand bekr\xe6fter'), (u'vedatrenovere', u'ved at renovere'), (u'fors\xf8geratforst\xe5', u'fors\xf8ger at forst\xe5'), (u'ersket', u'er sket'), (u'morderp\xe5', u'morder p\xe5'), (u'frifodiRosewood', u'fri fod i Rosewood'), (u'holdtpressem\xf8de', u'holdt pressem\xf8de'), (u'lngen', u'Ingen'), (u'lND', u'IND'), (u'henterjeg', u'henter jeg'), (u'lsabel', u'Isabel'), (u'lsabels', u'Isabels'), (u'vinderjo', u'vinder jo'), (u'r\xf8dmerjo', u'r\xf8dmer jo'), (u'etjakkes\xe6t', u'et jakkes\xe6t'), (u'gl\xe6derjeg', u'gl\xe6der jeg'), (u'lgen', u'Igen'), (u'ls\xe6r', u'Is\xe6r'), (u'iparken', u'i parken'), (u'n\xe5rl', u'n\xe5r I'), (u'tilA1', u'til A1'), (u'FBl', u'FBI'), (u'viljo', u'vil jo'), (u'detp\xe5', u'det p\xe5'), (u'KIar', u'Klar'), (u'PIan', u'Plan'), (u'EIIer', u'Eller'), (u'FIot', u'Flot'), (u'AIIe', u'Alle'), (u'AIt', u'Alt'), (u'KIap', u'Klap'), (u'PIaza', u'Plaza'), (u'SIap', u'Slap'), (u'I\xe5', u'l\xe5'), (u'BIing', u'Bling'), (u'GIade', u'Glade'), (u'Iejrb\xe5lssange', u'lejrb\xe5lssange'), (u'bedtjer', u'bedt jer'), (u'h\xf8rerjeg', u'h\xf8rer jeg'), (u'F\xe5rjeg', u'F\xe5r jeg'), (u'fikJames', u'fik James'), (u'atsnakke', u'at snakke'), (u'varkun', u'var kun'), (u'retterjeg', u'retter jeg'), (u'ernormale', u'er normale'), (u'viljeg', u'vil jeg'), (u'S\xe6tjer', u'S\xe6t jer'), (u'udsatham', u'udsat ham'), (u'afen', u'af en'), (u'p\xe5jorden', u'p\xe5 jorden'), (u'afdem', u'af dem'), (u'kmt', u'km/t')]), + 'pattern': u"(?um)(\\b|^)(?:Haner|JaveL|Pa\\/\\/e|bffte|Utro\\/\\/gt|Kommerdu|smi\\/er|\\/eg|harvinger|\\/et|erjeres|hardet|t\\\xe6nktjer|erjo|sti\\/|Iappe|Beklagel\\\xe7|vardet|afden|snupperjeg|ikkejeg|bliverjeg|hartravit|pandekagef\\/ag|Stormvarsell|stormvejn|morgenkomp\\/et|\\/yv|varjo|\\/eger|harjeg|havdejeg|hvorjeg|n\\\xe5rjeg|g\\\xe5rvi|atjeg|isine|f\\\xe5rjeg|k\\\xe6rtighed|skullejeg|laest|laese|g\\\xf8rjeg|g\\\xf8rvi|angrerjo|Hvergang|erder|villetilgive|\\\ufb01eme|genopst\\\xe5ri|svigtejer|kommernu|n\\\xe5rman|erfire|Hvorfor\\\ufb01nderdu|undertigt|itroen|erl\\\xf8gnt|g\\\xf8rden|forhelvede|hjpe|togeti|M\\\xe5jeg|savnerjer|erjeg|vaere|geme|trorp\\\xe5|forham|afham|harjo|ovema\\\ufb01et|begae\\\ufb01ighed|sy\\\u2019g|Imensjeg|bliverdu|\\\ufb01ser|manipuierer|forjeg|iivgivendefor|formig|Hardu|fornold|defrelste|S\\\xe5jeg|varjeg|g\\\xf8rved|kalderjeg|\\\ufb02ytte|handlerdet|trorjeg|\\\ufb02ytter|soverjeg|\\\ufb01nderud|naboerp\\\xe5|ervildt|v\\\xe6reher|hyggerjer|borjo|kommerikke|folkynde|farglad|misterjeg|\\\ufb01nt|Harl|bedejer|synesjeg|vartil|eren|\\\\Al|\\\\A|fjeme|Iigefyldt|ertil|fa\\\ufb01igt|\\\ufb01nder|\\\ufb01ndes|irettesae\\\ufb01else|ermed|\\\xe8n|gikjoi|Hvisjeg|ovema\\\ufb01er|hoident|\\\\Adne|fori|vei|savnerjerjo|elskerjer|harl\\\xf8jet|eri|\\\ufb01ende|derjo|sigerjo|menerjeg|Harjeg|sigerjeg|splitterjeg|erjournalist|erjoumalist|Forjeg|g\\\xe2rjeg|N\\\xe2rjeg|a\\\ufb02lom|farerjo|tagerjeg|Virkerjeg|morerjer|kommerjo|istand|b\\\xf8m|frygterjeg|kommerjeg|eriournalistelev|harfat|f\\\xe5r\\\ufb01ngre|sl\\\xe2rjeg|bam|erjournalistelev|politietjo|elskerjo|vari|fornemmerjeres|udkl\\\xe6kketl|\\\xed|nyi|Iumijelse|vures|I\\/Vash\\\xedngtan|opleverjeg|PANTEL\\\xc3NER|Gudmurgen|SKYDEV\\\xc3BEN|P\\\xc3LIDELIG|avertalte|Oms\\\xedder|lurteb\\\xe5d|Telrslning|miU\\\xf8|g\\\xe5ri|Fan\\/el|abe\\\ufb01\\\xe6s|hartalt|\\\\\\\xc5rkelig|beklagerjeg|N\\\xe5rjeg|rnaend|vaskebjorn|Ivil|besog|Vaer|Undersogte|modte|toj|fodt|gore|provede|forste|igang|ligenu|clet|Strombell|tmvlt|studererjournalistik|inforrnererjeg|omk\\\ufb01ng|tilAsg\\\xe5rd|Kederjeg|jaettetamp|erjer|atjulehygge|Ueneste|foltsaetter|A\\/ice|tvivlerjeg|henterjer|forst\\\xe5rjeg|hvisjeg|\\/\\\xe6rt|vfgtrgt|hurtigtjeg|kenderjo|seiv|\\/\\\xe6gehuset|herjo|stolerjeg|digi|taberi|sl\\\xe5rjeres|laere|tr\\\xe6nerwushu|efterjeg|e\\\ufb01er|dui|a\\\ufb01en|bliveri|acceptererjer|drikkerjo|\\\ufb01anjin|erl\\\xe6nge|erikke|medjer|Tmykke|\\'\\\ufb01anjins|Mesteri|sagdetil|indei|o\\\ufb01e|\\'\\\ufb01lgiv|Lf\\\xe5r|viserjer|Rejsjerblot|\\'\\\ufb01llad|iiiie\\\ufb01nger|VILOMFATTE|mo\\\ufb01o|g\\\xf8rjer|gifi|hardu|gi\\\ufb01|Iaeggerjeg|iet|sv\\/yte|ti\\/|Wdal|\\\ufb01\\\xe5et|Hvo\\/for|hellerikke|Wlle|dr\\/ver|V\\\\\\\ufb02lliam|V\\\\\\\ufb02lliams|Vk\\\ufb01lliam|v\\\xe5dejakke|k\\\xe6\\\ufb02l|sagdejeg|oven\\/ejet|karameisauce|Lf\\\xf8lgej\\\xf8disk|blevjo|asiateri|erV\\\\\\\ufb02lliam|lidt\\\ufb02ov|sagdejo|erlige|Vt\\\ufb01lliam|W\\\ufb01II|a\\\ufb02darede|hj\\\xe6iperjeg|laderjeg|H\\\xe2ndledsbeskyttere|Lsabels|G\\\xf8rjeg|m\\\xe2jeg|ogjeg|gjordejeg|villejeg|Vl\\\ufb02lliams|Dajeg|iorden|fandtjeg|Tilykke|k\\\xf8rerjer|g\\\xf8fjeg|Selvflgelig|fdder|bnfaldt|t\\\\\\/ehovedede|EIler|ringerjeg|blevv\\\xe6k|st\\\xe1rjeg|varforbi|harfortalt|iflere|t\\\xf8rjeg|kunnejeg|m\\\xe1|hart\\\xe6nkt|F\\\xe1rjeg|afdelingervar|0rd|p\\\xe1st\\\xe1|gr\\\xe1haret|varforbl\\\xf8ffende|holdtjeg|h\\\xe6ngerjo|fikjeg|f\\\xe1r|Hvorforf\\\xf8lerjeg|harfeber|\\\xe1ndssvagt|0g|vartre|abner|garjeg|sertil|hvorfin|harfri|forstarjeg|S\\\xe4|hvorfint|m\\\xe6rkerjeg|ogsa|n\\\xe1rjeg|Jas\\\xe1|b\\\xe1ndoptager|bed\\\xe1rende|s\\\xe1|n\\\xe1r|kunnejo|Brammertil|serjeg|gikjeg|udholderjeg|m\\\xe1neder|vartr\\\xe6t|d\\\xe1rligt|klaretjer|pavirkelig|spekulererjeg|fors\\\xf8gerjeg|huskerjeg|ifavnen|skullejo|vartung|varfuldst\\\xe6ndig|Paskedag|turi|spillerschumanns|forst\\\xe1rjeg|istedet|n\\\xe1rfrem|habertrods|forf\\\xf8rste|varto|overtil|forfem|holdtjo|passerjo|ellerto|hartrods|harfuldst\\\xe6ndig|g\\\xe5rjeg|giderjeg|forjer|erindrerjeg|t\\\xe6nkerjeg|GAEt|h\\\xf8rerjo|forladerjeg|kosterjo|fort\\\xe6llerjeg|Forstyrrerjeg|tjekkerjeg|erjurist|tlLBUD|serjo|bederjeg|bilderjeg|ULVEtlME|sk\\\xe6rerjo|afjer|ordnerjeg|giverjeg|rejservi|fangerjeg|erjaloux|glemmerjeg|Beh\\\xf8verjeg|harvi|ertyndere|f\\\xe5rtordenvejr|varf\\\xe6rdig|h\\\xf8rerfor|varvel|erforbi|AIle|l\\\xe6serjo|Edgarer|hartaget|derer|stikkerfrem|haraldrig|ellerfar|erat|turtil|erf\\\xe6rdig|f\\\xf8lerjeg|jerfra|eralt|harfaktisk|harfundet|harvendt|Kunstneraf|ervel|st\\\xe5ransigt|Erjeg|venterjeg|Hvorvar|varfint|ervarmt|g\\\xe5rfint|flyverforbi|Dervar|dervar|mener\\\xe5ndeligt|forat|herovertil|soverfor|begyndtejeg|vendertilbage|erforf\\\xe6rdelig|g\\\xf8raltid|ertilbage|harv\\\xe6ret|bagoverellertil|hertaler|v\\\xe5gnerjeg|vartomt|g\\\xe5rfrem|talertil|ertryg|ansigtervendes|hervirkeligt|herer|dr\\\xf8mmerjo|erfuldkommen|hveren|erfej|datterforg\\\xe6ves|fors\\\xf8gerjo|ertom|vareftermiddag|vartom|angerellerforventninger|k\\\xf8rtejeg|Hvorforfort\\\xe6ller|g\\\xe5rtil|ringerefter|s\\\xf8gertilflugt|ertvunget|megetjeg|varikke|Derermange|dervilhindre|ers\\\xe5|Detforst\\\xe5rLeggodt|ergodt|vorventen|tagerfejl|ellerer|laverjeg|0mgang|afst\\\xe1r|p\\\xe1|rejserjeg|ellertage|takkerjeg|ertilf\\\xe6ldigvis|fremstar|ert\\\xe6t|ijeres|Sagdejeg|overi|plukkerjordb\\\xe6r|klarerjeg|jerfire|t\\\xe1beligste|sigertvillingerne|erfaktisk|g\\\xe1r|harvasket|harplukketjordb\\\xe6rtil|plukketjordb\\\xe6r|klaverfireh\\\xe6ndigt|erj\\\xe6vnaldrende|tierjeg|Hvorerden|0veraltjeg|g\\\xe5rp\\\xe5|finderjeg|serhans|tiderbliver|ellertrist|forst\\\xe5rjeres|Hvorsj\\\xe6len|finderro|sidderjeg|tagerjo|efterjeres|10O|besluttedejeg|varsket|uadskillige|harjetlag|lkke|lntet|afsl\\\xf8rerjeg|m\\\xe5jeg|Vl|atbygge|detmakabre|vilikke|talsmandbekr\\\xe6fter|vedatrenovere|fors\\\xf8geratforst\\\xe5|ersket|morderp\\\xe5|frifodiRosewood|holdtpressem\\\xf8de|lngen|lND|henterjeg|lsabel|lsabels|vinderjo|r\\\xf8dmerjo|etjakkes\\\xe6t|gl\\\xe6derjeg|lgen|ls\\\xe6r|iparken|n\\\xe5rl|tilA1|FBl|viljo|detp\\\xe5|KIar|PIan|EIIer|FIot|AIIe|AIt|KIap|PIaza|SIap|I\\\xe5|BIing|GIade|Iejrb\\\xe5lssange|bedtjer|h\\\xf8rerjeg|F\\\xe5rjeg|fikJames|atsnakke|varkun|retterjeg|ernormale|viljeg|S\\\xe6tjer|udsatham|afen|p\\\xe5jorden|afdem|kmt)(\\b|$)"}}, 'deu': {'BeginLines': {'data': OrderedDict(), 'pattern': None}, 'EndLines': {'data': OrderedDict(), @@ -24,18 +36,18 @@ 'pattern': None}, 'WholeWords': {'data': OrderedDict([(u'/a', u'Ja'), (u'/ch', u'Ich'), (u'/d/of', u'Idiot'), (u'/ebte', u'lebte'), (u'/eid', u'leid'), (u'/hn', u'ihn'), (u'/hnen', u'Ihnen'), (u'/hr', u'Ihr'), (u'/hre', u'Ihre'), (u'/hren', u'Ihren'), (u'/m', u'im'), (u'/mmer', u'immer'), (u'/n', u'In'), (u'/ndividuen', u'Individuen'), (u'/nn', u'Inn'), (u'/oe', u'Joe'), (u'/sf', u'ist'), (u'/sf/0/1n', u'Ist John'), (u'/ungs', u'Jungs'), (u'/Vfinuten', u'Minuten'), (u'/\xe9nger', u'l\xe4nger'), (u'/\xe9uft', u'l\xe4uft'), (u'0/1', u'Oh'), (u'0/me', u'ohne'), (u'0/vne', u'ohne'), (u'00om', u'000 m'), (u'100m', u'100 m'), (u'120m', u'120 m'), (u'13Oj\xa7hrie', u'130-j\xe4hrige'), (u'145m', u'145 m'), (u'150m', u'150 m'), (u'160m', u'160 m'), (u'165m', u'165 m'), (u'19m', u'19 m'), (u'20m', u'20 m'), (u'27m', u'27 m'), (u'30m', u'30 m'), (u'37m', u'37 m'), (u'38m', u'38 m'), (u'3km', u'3 km'), (u'5/ch', u'sich'), (u'5/cher', u'sicher'), (u'5/cherer', u'sicherer'), (u'5/e', u'Sie'), (u'5/nd', u'Sind'), (u'500m', u'500 m'), (u'5ulSere', u'\xe4u\xdfere'), (u'60m', u'60 m'), (u'6de', u'\xf6de'), (u'6dere', u'\xf6dere'), (u'6ffne', u'\xf6ffne'), (u'6ffnen', u'\xf6ffnen'), (u'6ffnet', u'\xd6ffnet'), (u'6fter', u'\xf6fter'), (u'750m', u'750 m'), (u'85m', u'85 m'), (u'90m', u'90 m'), (u'a//em', u'allem'), (u'A//es', u'Alles'), (u'abbeif$en', u'abbei\xdfen'), (u'abdrficken', u'abdr\xfccken'), (u'aBen', u'a\xdfen'), (u'abergl\xe9iubischen', u'abergl\xe4ubischen'), (u'aberja', u'aber ja'), (u'aberjemand', u'aber jemand'), (u'Aberjetzt', u'Aber jetzt'), (u'abf\xe9hrt', u'abf\xe4hrt'), (u'abf\xe9illt', u'abf\xe4llt'), (u'abgef\xe9rbt', u'abgef\xe4rbt'), (u'abgeh\xe9ngt', u'abgeh\xe4ngt'), (u'abgeh\xe9rt', u'abgeh\xf6rt'), (u'abgelost', u'abgel\xf6st'), (u'abgesprengli', u'abgesprengt!'), (u'abgestfirztl', u'abgest\xfcrzt'), (u'abgestilrzt', u'abgest\xfcrzt'), (u'abgestofien', u'abgesto\xdfen'), (u'abgew\xe9hlt', u'abgew\xe4hlt'), (u'abgew\xe9hnen', u'abgew\xf6hnen'), (u'abgew\xe9hnt', u'abgew\xf6hnt'), (u'abge\xe9nderten', u'abge\xe4nderten'), (u'abh\xe9ingt', u'abh\xe4ngt'), (u'abh\xe9ngen', u'abh\xe4ngen'), (u'abh\xe9ngig', u'abh\xe4ngig'), (u'abh\xe9ngiges', u'abh\xe4ngiges'), (u'Abh\xe9rstationen', u'Abh\xf6rstationen'), (u'Abjetzt', u'Ab jetzt'), (u'abkfihlen', u'abk\xfchlen'), (u'Abkfirzung', u'Abk\xfcrzung'), (u'abkommlich', u'abk\xf6mmlich'), (u'Ablegenl', u'Ablegen!'), (u'ablfisen', u'abl\xf6sen'), (u'ablosen', u'abl\xf6sen'), (u'Ablosung', u'Abl\xf6sung'), (u'abreif$en', u'abrei\xdfen'), (u'Abrijcken', u'Abr\xfccken'), (u'abr\xe9umen', u'abr\xe4umen'), (u'Absch/ed', u'Abschied'), (u'abschiefien', u'abschie\xdfen'), (u'abschlief$en', u'abschlie\xdfen'), (u'abschliefien', u'abschlie\xdfen'), (u'abschwiiren', u'abschw\xf6ren'), (u'abstoflsend', u'absto\xdfend'), (u'Abtrijnnige', u'Abtr\xfcnnige'), (u'abwiirgt', u'abw\xfcrgt'), (u'abw\xe9gen', u'abw\xe4gen'), (u'abzuh\xe9ren', u'abzuh\xf6ren'), (u'abzuschwiiren', u'abzuschw\xf6ren'), (u'abzusfofien', u'abzusto\xdfen'), (u'ACh', u'Ach'), (u'Achtungl', u'Achtung!'), (u'Achzen', u'\xc4chzen'), (u'ACHZT', u'\xc4CHZT'), (u'Acic', u'Acid'), (u'ADDRESSDATEI', u'ADRESSDATEI'), (u'Adi\xf6s', u'Adi\xf3s'), (u'Admiralitat', u'Admiralit\xe4t'), (u'Admiralit\xe9it', u'Admiralit\xe4t'), (u'Admiralit\xe9t', u'Admiralit\xe4t'), (u'Aff\xe9re', u'Aff\xe4re'), (u'Aff\xe9ren', u'Aff\xe4ren'), (u'AFl', u'AFI'), (u'aggresivem', u'aggressivem'), (u'Agypten', u'\xc4gypten'), (u'aher', u'aber'), (u'AI/en/vichtigste', u'Allerwichtigste'), (u'Ain/vays', u'Airways'), (u'AIs', u'Als'), (u'Aktivit\xe9iten', u'Aktivit\xe4ten'), (u'Aktivit\xe9ten', u'Aktivit\xe4ten'), (u'AKTMERT', u'AKTIVIERT'), (u'Alarmsfufe', u'Alarmstufe'), (u'albem', u'albern'), (u'Albtriiume', u'Albtr\xe4ume'), (u'ale', u'als'), (u'alleinl', u'allein!'), (u'allejubeln', u'alle jubeln'), (u'allern\xe9chsten', u'allern\xe4chsten'), (u'Allmiichtigerl', u'Allm\xe4chtiger!'), (u'Allm\xe9chtige', u'Allm\xe4chtige'), (u'Allm\xe9chtiger', u'Allm\xe4chtiger'), (u'allm\xe9hlich', u'allm\xe4hlich'), (u'Allm\xe9ichtiger', u'Allm\xe4chtiger'), (u'Allsparkl', u'Allspark!'), (u'allt\xe9iglichen', u'allt\xe4glichen'), (u'ALTESTE', u'\xc4LTESTE'), (u'Altester', u'\xc4ltester'), (u'Alzte', u'\xc4rzte'), (u"Amerx'kaner", u'Amerikaner'), (u'amfisierst', u'am\xfcsierst'), (u'Amiilsierst', u'Am\xfcsierst'), (u'amiisieren', u'am\xfcsieren'), (u'amiisierenl', u'am\xfcsieren!'), (u'amiisierte', u'am\xfcsierte'), (u'Amijsant', u'Am\xfcsant'), (u'amlllsant', u'am\xfcsant'), (u'amlllsiert', u'am\xfcsiert'), (u'amtlsant', u'am\xfcsant'), (u'Amusanf', u'Am\xfcsant'), (u'amusant', u'am\xfcsant'), (u'Amusiert', u'Am\xfcsiert'), (u'Anderst', u'\xc4nderst'), (u'Anderung', u'\xc4nderung'), (u'Anderungen', u'\xc4nderungen'), (u"anfa'ngt", u'anf\xe4ngt'), (u'Anffihrer', u'Anf\xfchrer'), (u'Anffingerl', u'Anf\xe4nger!'), (u'Anfiihrer', u'Anf\xfchrer'), (u'anfijhlt', u'anf\xfchlt'), (u'Anfingerl', u'Anf\xe4nger!'), (u'Anfuhrer', u'Anf\xfchrer'), (u'Anfuhrern', u'Anf\xfchrern'), (u'Anf\xe9inger', u'Anf\xe4nger'), (u'Anf\xe9ingergliick', u'Anf\xe4ngergl\xfcck'), (u'Anf\xe9nge', u'Anf\xe4nge'), (u'anf\xe9ngst', u'anf\xe4ngst'), (u'anf\xe9ngt', u'anf\xe4ngt'), (u'angebrfillt', u'angebr\xfcllt'), (u'angebrullt', u'angebr\xfcllt'), (u'angefiihrt', u'angef\xfchrt'), (u'ANGEHCHDRIGE', u'ANGEH\xd6RIGE'), (u'angehfirt', u'angeh\xf6rt'), (u'Angehtirigen', u'Angeh\xf6rigen'), (u'angeh\xe9ren', u'angeh\xf6ren'), (u'angeh\xe9rt', u'angeh\xf6rt'), (u'angel\xe9chelt', u'angel\xe4chelt'), (u'angerilhrt', u'anger\xfchrt'), (u'anger\ufb02hrt', u'anger\xfchrt'), (u'angeschweifit', u'angeschwei\xdft'), (u'angespruht', u'angespr\xfcht'), (u'angetiltert', u'anget\xfctert'), (u'Angriffspl\xe9nen', u'Angriffspl\xe4nen'), (u'Angstschweili', u'Angstschwei\xdf'), (u'anhiiren', u'anh\xf6ren'), (u'Anh\xe9inger', u'Anh\xe4nger'), (u'anh\xe9lt', u'anh\xe4lt'), (u'anh\xe9ngen', u'anh\xe4ngen'), (u'anh\xe9ren', u'anh\xf6ren'), (u'ankijndigen', u'ank\xfcndigen'), (u'anliigen', u'anl\xfcgen'), (u'anlugen', u'anl\xfcgen'), (u'anmal3ende', u'anma\xdfende'), (u'ann\xe9hern', u'ann\xe4hern'), (u'anriihrst', u'anr\xfchrst'), (u'anrijuhren', u'anr\xfchren'), (u'anst\xe9indig', u'anst\xe4ndig'), (u'anst\xe9indiger', u'anst\xe4ndiger'), (u'anst\xe9indiges', u'anst\xe4ndiges'), (u'anst\xe9ndig', u'anst\xe4ndig'), (u'anst\xe9ndige', u'anst\xe4ndige'), (u'anst\xe9ndigen', u'anst\xe4ndigen'), (u'Anst\xe9ndiges', u'Anst\xe4ndiges'), (u'Antik\xe9rper', u'Antik\xf6rper'), (u'Antiquit\xe9t', u'Antiquit\xe4t'), (u'Antistrahlenger\xe9t', u'Antistrahlenger\xe4t'), (u'antwortenl', u'antworten!'), (u'Anwe/sung', u'Anweisung'), (u'Anwe/sungen', u'Anweisungen'), (u'Anw\xe9iltin', u'Anw\xe4ltin'), (u'Anw\xe9lte', u'Anw\xe4lte'), (u'Anw\xe9ltin', u'Anw\xe4ltin'), (u'Anzilge', u'Anz\xfcge'), (u'Anztinden', u'Anz\xfcnden'), (u'Anzuge', u'Anz\xfcge'), (u'Anzugen', u'Anz\xfcgen'), (u'anzuhiiren', u'anzuh\xf6ren'), (u'anzuhoren', u'anzuh\xf6ren'), (u'anzundenl', u'anz\xfcnden!'), (u'anzupiibeln', u'anzup\xf6beln'), (u'An\xe9sthesie', u'An\xe4sthesie'), (u'An\xe9sthesieprofessor', u'An\xe4sthesieprofessor'), (u'An\xe9sthesieteam', u'An\xe4sthesieteam'), (u'An\xe9sthesist', u'An\xe4sthesist'), (u'An\xe9sthesisten', u'An\xe4sthesisten'), (u'An\xe9sthetikum', u'An\xe4sthetikum'), (u'ARBEITERI', u'ARBEITER:'), (u'Arbeitsfl\ufb02gel', u'Arbeitsfl\xfcgel'), (u'Armeefunkger\xe9t', u'Armeefunkger\xe4t'), (u'Armel', u'\xc4rmel'), (u'Arschkichern', u'Arschl\xf6chern'), (u'Arschliicher', u'Arschl\xf6cher'), (u'Arschliichern', u'Arschl\xf6chern'), (u'Arschl\xe9cher', u'Arschl\xf6cher'), (u'Arschl\xe9chern', u'Arschl\xf6chern'), (u'Arzte', u'\xc4rzte'), (u'Arzten', u'\xc4rzten'), (u'Arztin', u'\xc4rztin'), (u'Atemger\xe9usche', u'Atemger\xe4usche'), (u'Atlantikkiiste', u'Atlantikk\xfcste'), (u'Atlantikkuste', u'Atlantikk\xfcste'), (u'ATMOSPHARE', u'ATMOSPH\xc4RE'), (u'Atmosph\xe9re', u'Atmosph\xe4re'), (u'Atmosph\xe9renbereich', u'Atmosph\xe4renbereich'), (u'Atmosph\xe9reneinflugsequenz', u'Atmosph\xe4reneinflugsequenz'), (u'Atmosph\xe9reneintritt', u'Atmosph\xe4reneintritt'), (u'Attenfaiter', u'Attent\xe4ter'), (u'Attent\xe9iter', u'Attent\xe4ter'), (u'Attent\xe9ter', u'Attent\xe4ter'), (u'Attent\xe9ters', u'Attent\xe4ters'), (u'Attraktivit\xe9t', u'Attraktivit\xe4t'), (u'auBen', u'au\xdfen'), (u'Aubenblick', u'Augenblick'), (u'AuBenbord', u'Au\xdfenbord'), (u'AuBenwelt', u'Au\xdfenwelt'), (u'auBer', u'au\xdfer'), (u'AuBerdem', u'Au\xdferdem'), (u'auBerhalb', u'au\xdferhalb'), (u'auc/1', u'auch'), (u'auchl', u'auch!'), (u'Auf$erdem', u'Au\xdferdem'), (u'auf3er', u'au\xdfer'), (u'aufAugenh6he', u'auf Augenh\xf6he'), (u'aufblilhende', u'aufbl\xfchende'), (u"auff'a'ngt", u'auff\xe4ngt'), (u'Auff\xe9lliges', u'Auff\xe4lliges'), (u'aufgebltiht', u'aufgebl\xfcht'), (u'aufgeftlhrt', u'aufgef\xfchrt'), (u'aufgeh\xe9ingt', u'aufgeh\xe4ngt'), (u'aufgeh\xe9rt', u'aufgeh\xf6rt'), (u'aufgekl\xe9rt', u'aufgekl\xe4rt'), (u'aufger\xe9umt', u'aufger\xe4umt'), (u'aufgespiefit', u'aufgespie\xdft'), (u'aufgewiihlter', u'aufgew\xfchlter'), (u'aufgez\xe9hlt', u'aufgez\xe4hlt'), (u'Aufh6ren', u'Aufh\xf6ren'), (u'aufhbren', u'aufh\xf6ren'), (u'aufhdrf', u'aufh\xf6rt'), (u'aufhfiren', u'aufh\xf6ren'), (u'aufhiiren', u'aufh\xf6ren'), (u'Aufhoren', u'Aufh\xf6ren'), (u'Aufh\xe9iren', u'Aufh\xf6ren'), (u'aufh\xe9ngen', u'aufh\xe4ngen'), (u'Aufh\xe9ren', u'Aufh\xf6ren'), (u'aufh\xe9renl', u'aufh\xf6ren'), (u'aufi', u'auf,'), (u'Aufienministerium', u'Au\xdfenministerium'), (u'aufier', u'au\xdfer'), (u'Aufierdem', u'Au\xdferdem'), (u'aufiergew\xe9hnliche', u'au\xdfergew\xf6hnliche'), (u'aufierhalb', u'au\xdferhalb'), (u'Aufierirdischer', u'Au\xdferirdischer'), (u'Aufierlich', u'\xc4u\xdferlich'), (u'aufierordentlich', u'au\xdferordentlich'), (u'Aufkenposten', u'Au\xdfenposten'), (u'aufkisen', u'aufl\xf6sen'), (u'aufkl\xe9ren', u'aufkl\xe4ren'), (u'Aufkl\xe9rung', u'Aufkl\xe4rung'), (u'aufl', u'auf!'), (u'Aufl6sung', u'Aufl\xf6sung'), (u'aufliisen', u'aufl\xf6sen'), (u'auflser', u'au\xdfer'), (u'aufl\xe9sen', u'aufl\xf6sen'), (u'aufmiibeln', u'aufm\xf6beln'), (u'aufraumte', u'aufr\xe4umte'), (u'aufr\xe9umen', u'aufr\xe4umen'), (u'aufschlief$en', u'aufschlie\xdfen'), (u'Aufschlull', u'Aufschluss'), (u'aufSer', u'au\xdfer'), (u'aufSIJBigkeiten', u'auf S\xfc\xdfigkeiten'), (u'aufspturen', u'aufsp\xfcren'), (u'aufstellenl', u'aufstellen!'), (u'Aufst\xe9ndige', u'Aufst\xe4ndische'), (u'aufTanis', u'auf Tanis'), (u'Auftr\xe9ge', u'Auftr\xe4ge'), (u'aufvv\xe9ndigen', u'aufw\xe4ndigen'), (u'aufw\xe9ichst', u'aufw\xe4chst'), (u'aufw\xe9rmen', u'aufw\xe4rmen'), (u'aufZ>er', u'au\xdfer'), (u'Aufztlge', u'Aufz\xfcge'), (u'aufzuhiivren', u'aufzuh\xf6ren'), (u'aufzukl\xe9ren', u'aufzukl\xe4ren'), (u'aufzuldsen', u'aufzul\xf6sen'), (u'aufzur\xe9umen', u'aufzur\xe4umen'), (u'aufz\xe9hlen', u'aufz\xe4hlen'), (u'auf\xe9er', u'au\xdfer'), (u'auf\ufb02iegen', u'auffliegen'), (u'Augenm\xe9igen', u'Augenm\xe4gen'), (u"aul'5er", u'au\xdfer'), (u'aul3er', u'au\xdfer'), (u'Aul3erdem', u'Au\xdferdem'), (u'aul5er', u'au\xdfer'), (u'aulier', u'au\xdfer'), (u'Aulierdem', u'Au\xdferdem'), (u'auliergewfihnlich', u'au\xdfergew\xf6hnlich'), (u'aulierhalb', u'au\xdferhalb'), (u'Aulierirdischen', u'Au\xdferirdischen'), (u'auller', u'au\xdfer'), (u'aullerhalb', u'au\xdferhalb'), (u'AulSer', u'Au\xdfer'), (u'AulSerdem', u'Au\xdferdem'), (u'ausdriicken', u'ausdr\xfccken'), (u'ausdriickt', u'ausdr\xfcckt'), (u'ausdrijcken', u'ausdr\xfccken'), (u'ausdrucklicher', u'ausdr\xfccklicher'), (u'Ausdr\ufb02cken', u'Ausdr\xfccken'), (u'Ausen/v\xe9hlte', u'Auserw\xe4hlte'), (u'Ausen/v\xe9hlter', u'Auserw\xe4hlter'), (u'auserw\xe9hlt', u'auserw\xe4hlt'), (u'Ausffillen', u'Ausf\xfcllen'), (u'ausfijhren', u'ausf\xfchren'), (u'ausfijhrt', u'ausf\xfchrt'), (u'ausfuhren', u'ausf\xfchren'), (u'ausfullt', u'ausf\xfcllt'), (u'ausgef\ufb02llt', u'ausgef\xfcllt'), (u'ausgeliischt', u'ausgel\xf6scht'), (u'ausgeliist', u'ausgel\xf6st'), (u'ausgel\xe9ist', u'ausgel\xf6st'), (u'ausgel\xe9scht', u'ausgel\xf6scht'), (u'ausgel\xe9st', u'ausgel\xf6st'), (u'ausgeriickt', u'ausger\xfcckt'), (u'ausgerijstet', u'ausger\xfcstet'), (u'AUSGEWAHLT', u'AUSGEW\xc4HLT'), (u'ausgew\xe9hlt', u'ausgew\xe4hlt'), (u'Ausg\xe9ngen', u'Ausg\xe4ngen'), (u'aush6hlen', u'aush\xf6hlen'), (u'aushiilt', u'aush\xe4lt'), (u'Aushilfspunkerl', u'Aushilfspunker!'), (u'aush\xe9lt', u'aush\xe4lt'), (u'ausilben', u'aus\xfcben'), (u'Auskunfte', u'Ausk\xfcnfte'), (u'ausl', u'aus!'), (u'Ausl\xe9nder', u'Ausl\xe4nder'), (u'Ausl\xe9nderl', u'Ausl\xe4nder'), (u'ausl\xe9schen', u'ausl\xf6schen'), (u'ausl\xe9sen', u'ausl\xf6sen'), (u'Ausl\xe9ser', u'Ausl\xf6ser'), (u'AusmaB', u'Ausma\xdf'), (u'ausprobie\ufb02', u'ausprobiert'), (u'Ausriistung', u'Ausr\xfcstung'), (u'ausrusten', u'ausr\xfcsten'), (u'Ausrustung', u'Ausr\xfcstung'), (u'Ausschullware', u'Ausschussware'), (u'ausschwinnenl', u'ausschw\xe4rmen!'), (u'auszudriicken', u'auszudr\xfccken'), (u'auszuschliefien', u'auszuschlie\xdfen'), (u'auszuw\xe9hlen', u'auszuw\xe4hlen'), (u'Autorit\xe9t', u'Autorit\xe4t'), (u'Autoschlilssel', u'Autoschl\xfcssel'), (u'Autoschl\ufb02ssel', u'Autoschl\xfcssel'), (u'au\ufb02/viihlt', u'aufw\xfchlt'), (u'Au\ufb02ergewiihnlich', u'Au\xdfergew\xf6hnlich'), (u'Azevedol', u'Azevedo!'), (u'A\ufb02es', u'Alles'), (u'B/ick', u'Blick'), (u'b/olog/sch', u'biologisch'), (u'b/sschen', u'bisschen'), (u'B6se', u'B\xf6se'), (u'B6sem', u'B\xf6sem'), (u'B6ser', u'B\xf6ser'), (u'Babym\xe9dchen', u'Babym\xe4dchen'), (u'Ballastst\xe9ffchen', u'Ballastst\xf6ffchen'), (u'Ballm\xe9dchen', u'Ballm\xe4dchen'), (u'Ballm\xe9idchen', u'Ballm\xe4dchen'), (u'Ballonverk\xe9ufer', u'Ballonverk\xe4ufer'), (u'Balzenl', u'Balzen!'), (u'Bankijberfall', u'Bank\xfcberfall'), (u'Barbarenilberfall', u'Barbaren\xfcberfall'), (u'Barenk\xe9nig', u'Barenk\xf6nig'), (u'basfeln', u'basteln'), (u'Bastianol', u'Bastiano!'), (u'Bastlano', u'Bastiano'), (u'Bauchfellentztmdung', u'Bauchfellentz\xfcndung'), (u'Bauchkr\xe9mpfe', u'Bauchkr\xe4mpfe'), (u'bauf\xe9llig', u'bauf\xe4llig'), (u'bauf\xe9llige', u'bauf\xe4llige'), (u'Baumst\xe9mme', u'Baumst\xe4mme'), (u'Baupl\xe9ne', u'Baupl\xe4ne'), (u'Bbses', u'B\xf6ses'), (u'be/de', u'beide'), (u'bedecktl', u'bedeckt!'), (u'Bedilrfnisse', u'Bed\xfcrfnisse'), (u'Bedilrfnissen', u'Bed\xfcrfnissen'), (u'Bedllirfnisse', u'Bed\xfcrfnisse'), (u'bedrijckt', u'bedr\xfcckt'), (u'bedr\xe9ngen', u'bedr\xe4ngen'), (u'bedr\xe9ngt', u'bedr\xe4ngt'), (u'bedr\xe9ngten', u'bedr\xe4ngten'), (u'Beeilungf', u'Beeilung!'), (u'Beeilungl', u'Beeilung!'), (u'Beerdingungsinsiiiui', u'Beerdigungsinstitut'), (u'Beerdingungsinstitut', u'Beerdigungsinstitut'), (u'Befehll', u'Befehl!'), (u'beffirdert', u'bef\xf6rdert'), (u'Beffirderung', u'Bef\xf6rderung'), (u'befiirchte', u'bef\xfcrchte'), (u'befiirchteten', u'bef\xfcrchteten'), (u'befiirdert', u'bef\xf6rdert'), (u'befiirderte', u'bef\xf6rderte'), (u'Befiirderung', u'Bef\xf6rderung'), (u'befilrchtete', u'bef\xfcrchtete'), (u'befllirchte', u'bef\xfcrchte'), (u'befurworte', u'bef\xfcrworte'), (u'befurwortet', u'bef\xfcrwortet'), (u'bef\xe9rdere', u'bef\xf6rdere'), (u'bef\xe9rdert', u'bef\xf6rdert'), (u'Bef\xe9rderung', u'Bef\xf6rderung'), (u'beg/ng', u'beging'), (u'begl\ufb02ckt', u'begl\xfcckt'), (u'begniigt', u'begn\xfcgt'), (u'begrfindetes', u'begr\xfcndetes'), (u'Begriiliungsruf', u'Begr\xfc\xdfungsruf'), (u'begrijfien', u'begr\xfc\xdfen'), (u'Begrilfiung', u'Begr\xfc\xdfung'), (u'Begrilfkung', u'Begr\xfc\xdfung'), (u"begrL'llZ>en", u'begr\xfc\xdfen'), (u'BegrUBungsruf', u'Begr\xfc\xdfungsruf'), (u'begrUf$t', u'begr\xfc\xdft'), (u'begrufie', u'begr\xfc\xdfe'), (u'begrufit', u'begr\xfc\xdft'), (u'Begrundung', u'Begr\xfcndung'), (u'Beh6rden', u'Beh\xf6rden'), (u'beh\xe9lt', u'beh\xe4lt'), (u'Beh\xe9lter', u'Beh\xe4lter'), (u'beh\xe9mmert', u'beh\xe4mmert'), (u'beiB', u'bei\xdf'), (u'beiBen', u'bei\xdfen'), (u'beiBt', u'bei\xdft'), (u'beif$t', u'bei\xdft'), (u'beif2>en', u'bei\xdfen'), (u'beifken', u'bei\xdfen'), (u'beiflsen', u'bei\xdfen'), (u'beijenen', u'bei jenen'), (u'Beiliring', u'Bei\xdfring'), (u'BEKAMPFEN', u'BEK\xc4MPFEN'), (u'bekannf', u'bekannt'), (u'bekanntermafken', u'bekannterma\xdfen'), (u'bek\xe9me', u'bek\xe4me'), (u'bek\xe9mpfen', u'bek\xe4mpfen'), (u'Bek\xe9mpfung', u'Bek\xe4mpfung'), (u'bel', u'bei'), (u'belde', u'beide'), (u'beliellsen', u'belie\xdfen'), (u'belm', u'beim'), (u'Beltlftungstunnels', u'Bel\xfcftungstunnels'), (u'Beluftungstunnel', u'Bel\xfcftungstunnel'), (u'Beluftungstunnell', u'Bel\xfcftungstunnel!'), (u'bel\xe9stigen', u'bel\xe4stigen'), (u'Bemiihe', u'Bem\xfche'), (u'Bemiihen', u'Bem\xfchen'), (u"bemL'lhe", u'bem\xfche'), (u'bemtuht', u'bem\xfcht'), (u'bemuhen', u'bem\xfchen'), (u'bemuhten', u'bem\xfchten'), (u'Ben\xe9tigen', u'Ben\xf6tigen'), (u'ben\xe9tigt', u'ben\xf6tigt'), (u'ben\xe9tigten', u'ben\xf6tigten'), (u'Beobachtar', u'Beobachter'), (u'bereft', u'bereit'), (u'bereitf\xe9ndet', u'bereitf\xe4ndet'), (u'beriichtigtsten', u'ber\xfcchtigtsten'), (u'beriichtlgten', u'ber\xfcchtigten'), (u'beriihmt', u'ber\xfchmt'), (u'Beriihmtheiten', u'Ber\xfchmtheiten'), (u'beriihren', u'ber\xfchren'), (u'Beriihrend', u'Ber\xfchrend'), (u'beriihrt', u'ber\xfchrt'), (u'Beriihrtl', u'Ber\xfchrt!'), (u'berijhrt', u'ber\xfchrt'), (u'berilhmter', u'ber\xfchmter'), (u'berilhrt', u'ber\xfchrt'), (u'Berilhrung', u'Ber\xfchrung'), (u'Berks/1/re', u'Berkshire'), (u"BerL'lhre", u'Ber\xfchre'), (u'berllichtigter', u'ber\xfcchtigter'), (u'berllihren', u'ber\xfchren'), (u'berllihrt', u'ber\xfchrt'), (u'berlllhmten', u'ber\xfchmten'), (u'Bern/e', u'Bernie'), (u'beruhrt', u'ber\xfchrt'), (u'beruhrte', u'ber\xfchrte'), (u'ber\ufb02hmter', u'ber\xfchmter'), (u'besafi', u'besa\xdf'), (u"Besch'a'ftigt", u'Besch\xe4ftigt'), (u'bescheifien', u'beschei\xdfen'), (u'beschiftigt', u'besch\xe4ftigt'), (u'beschiiftigt', u'besch\xe4ftigt'), (u'beschiitzen', u'besch\xfctzen'), (u'beschiitzt', u'besch\xfctzt'), (u'beschiltze', u'besch\xfctze'), (u'beschiltzen', u'besch\xfctzen'), (u'beschleun/gt', u'beschleunigt'), (u'beschliefkt', u'beschlie\xdft'), (u'beschlie\ufb02tloszuziehen', u'beschlie\xdft loszuziehen'), (u'beschllitzet', u'besch\xfctzet'), (u'beschllitzt', u'besch\xfctzt'), (u'beschr\xe9nkt', u'beschr\xe4nkt'), (u'Beschr\xe9nkungen', u'Beschr\xe4nkungen'), (u'beschtitze', u'besch\xfctze'), (u'beschutzen', u'besch\xfctzen'), (u'besch\xe9digt', u'besch\xe4digt'), (u'besch\xe9ftigen', u'besch\xe4ftigen'), (u'besch\xe9ftigt', u'besch\xe4ftigt'), (u'besch\xe9ftigte', u'besch\xe4ftigte'), (u'besch\xe9ftigten', u'besch\xe4ftigten'), (u'besch\xe9iftige', u'besch\xe4ftige'), (u'besch\xe9iftigt', u'besch\xe4ftigt'), (u'Besch\xe9imen', u'Besch\xe4men'), (u'besch\xe9mendste', u'besch\xe4mendste'), (u'besch\xe9oligen', u'besch\xe4digen'), (u'besch\ufb02tzen', u'besch\xfctzen'), (u'Besch\ufb02tzer', u'Besch\xfctzer'), (u'Besf\xe9f/gen', u'Best\xe4tigen'), (u'Besitztijmer', u'Besitzt\xfcmer'), (u'BESTATIGE', u'BEST\xc4TIGE'), (u'BESTATIGT', u'BEST\xc4TIGT'), (u'bestenl', u'besten!'), (u'bestiirzt', u'best\xfcrzt'), (u'bestiitigen', u'best\xe4tigen'), (u'bestltigt', u'best\xe4tigt'), (u"bestx'mmt", u'bestimmt'), (u'best\xe9indige', u'best\xe4ndige'), (u'best\xe9itigt', u'best\xe4tigt'), (u'Best\xe9itigung', u'Best\xe4tigung'), (u'Best\xe9itigungen', u'Best\xe4tigungen'), (u'Best\xe9tige', u'Best\xe4tige'), (u'Best\xe9tigen', u'Best\xe4tigen'), (u'best\xe9tigt', u'best\xe4tigt'), (u'Best\xe9tigung', u'Best\xe4tigung'), (u'bes\xe9inftigen', u'bes\xe4nftigen'), (u'bes\xe9inftigt', u'bes\xe4nftigt'), (u'bes\xe9nftigen', u'bes\xe4nftigen'), (u'Betiiubt', u'Bet\xe4ubt'), (u'betriibt', u'betr\xfcbt'), (u'betriigen', u'betr\xfcgen'), (u'Betriiger', u'Betr\xfcger'), (u'betriigt', u'betr\xfcgt'), (u'betrijgen', u'betr\xfcgen'), (u'Betrijgerl', u'Betr\xfcger!'), (u'betrilgen', u'betr\xfcgen'), (u'betrtlgerischer', u'betr\xfcgerischer'), (u'betr\xe9chtliches', u'betr\xe4chtliches'), (u'Betr\xe9ge', u'Betr\xe4ge'), (u'betr\xe9gt', u'betr\xe4gt'), (u'Bettw\xe9ische', u'Bettw\xe4sche'), (u'Beviilkerung', u'Bev\xf6lkerung'), (u'bevorwir', u'bevor wir'), (u'bev\xe9lkern', u'bev\xf6lkern'), (u'bewegf', u'bewegt'), (u'Bew\xe9hrungsauflage', u'Bew\xe4hrungsauflage'), (u'bew\xe9ihrte', u'bew\xe4hrte'), (u'bew\xe9iltigen', u'bew\xe4ltigen'), (u'bew\xe9issern', u'bew\xe4ssern'), (u'bew\xe9lkten', u'bew\xf6lkten'), (u'bew\xe9ltigen', u'bew\xe4ltigen'), (u'Bew\xe9ltigung', u'Bew\xe4ltigung'), (u'bew\xe9ssern', u'bew\xe4ssern'), (u'Bew\xe9sserungssysteme', u'Bew\xe4sserungssysteme'), (u'Bezirksgelinde', u'Bezirksgel\xe4nde'), (u'bezuglich', u'bez\xfcglich'), (u'be\xe9ingstigende', u'be\xe4ngstigende'), (u'be\xe9ngstigend', u'be\xe4ngstigend'), (u'be\xe9ngstigender', u'be\xe4ngstigender'), (u'bffnen', u'\xf6ffnen'), (u'Bficher', u'B\xfccher'), (u'Bfiro', u'B\xfcro'), (u'bfirsten', u'b\xfcrsten'), (u'bfise', u'b\xf6se'), (u'bfisen', u'b\xf6sen'), (u'bfiser', u'b\xf6ser'), (u'bfises', u'b\xf6ses'), (u'bfiseste', u'b\xf6seste'), (u'bfisesten', u'b\xf6sesten'), (u'bgsonderen', u'besonderen'), (u'BI6de', u'Bl\xf6de'), (u'Bierbfichse', u'Bierb\xfcchse'), (u'Biicher', u'B\xfccher'), (u'Biicherei', u'B\xfccherei'), (u'Biick', u'B\xfcck'), (u'Biiffel', u'B\xfcffel'), (u'BIiHlt', u'Bl\xfcht'), (u'Biihne', u'B\xfchne'), (u'Biilcherei', u'B\xfccherei'), (u'BIind', u'Blind'), (u'Biirger', u'B\xfcrger'), (u'Biirgerrechte', u'B\xfcrgerrechte'), (u'Biiro', u'B\xfcro'), (u'Biiros', u'B\xfcros'), (u'Biirotiir', u'B\xfcrot\xfcr'), (u'biirsten', u'b\xfcrsten'), (u'Biise', u'B\xf6se'), (u'Biisen', u'B\xf6sen'), (u'biises', u'b\xf6ses'), (u'Bijchern', u'B\xfcchern'), (u'Bijhne', u'B\xfchne'), (u'Bijndnis', u'B\xfcndnis'), (u'Bijrger', u'B\xfcrger'), (u'Bijrgermeister', u'B\xfcrgermeister'), (u'Bijro', u'B\xfcro'), (u'Bijrokraten', u'B\xfcrokraten'), (u'Bijrzel', u'B\xfcrzel'), (u'Bilchern', u'B\xfcchern'), (u'Bildseitenverh\xe9ltnis', u'Bildseitenverh\xe4ltnis'), (u'Bilndel', u'B\xfcndel'), (u'Bilro', u'B\xfcro'), (u'BIood', u'Blood'), (u'BIQIS', u'Blo\xdf'), (u'Bischiife', u'Bisch\xf6fe'), (u'Bischiifen', u'Bisch\xf6fen'), (u'Bisch\xe9fe', u'Bisch\xf6fe'), (u'bistja', u'bist ja'), (u'bistjetzt', u'bist jetzt'), (u'Bittejetzt', u'Bitte jetzt'), (u'bittersiJl3es', u'bitters\xfc\xdfes'), (u'Bittesch\xe9n', u'Bittesch\xf6n'), (u'BIue', u'Blue'), (u'bi\xdfchen', u'bisschen'), (u'BL1hne', u'B\xfchne'), (u'Bl6cke', u'Bl\xf6cke'), (u'bl6d', u'bl\xf6d'), (u'bl6de', u'bl\xf6de'), (u'bl6den', u'bl\xf6den'), (u'bl6der', u'bl\xf6der'), (u'bl6des', u'bl\xf6des'), (u'Bl6dian', u'Bl\xf6dian'), (u'Bl6dmann', u'Bl\xf6dmann'), (u'Bl6dsinn', u'Bl\xf6dsinn'), (u'Blauaugel', u'Blauauge!'), (u'Blddes', u'Bl\xf6des'), (u'Ble/bf', u'Bleibt'), (u'bleibenl', u'bleiben!'), (u'blelbenl', u'blelben!'), (u'Blfidmann', u'Bl\xf6dmann'), (u'Blfidsinn', u'Bl\xf6dsinn'), (u'Blfimchen', u'Bl\xfcmchen'), (u'BLicher', u'B\xfccher'), (u'BLihne', u'B\xfchne'), (u'Bliid', u'Bl\xf6d'), (u'bliide', u'bl\xf6de'), (u'bliiden', u'bl\xf6den'), (u'bliidere', u'bl\xf6dere'), (u'bliides', u'bl\xf6des'), (u'Bliidmann', u'Bl\xf6dmann'), (u'Bliidsinn', u'Bl\xf6dsinn'), (u'bliiht', u'bl\xfcht'), (u'bliirgerlichen', u'b\xfcrgerlichen'), (u'Blijmchen', u'Bl\xfcmchen'), (u'Bllck', u'Blick'), (u'Bllindel', u'B\xfcndel'), (u'Blllroklammer', u'B\xfcroklammer'), (u'bln', u'bin'), (u'bloB', u'blo\xdf'), (u'bloBen', u'blo\xdfen'), (u'bloBstellen', u'blo\xdfstellen'), (u'blockiertl', u'blockiert!'), (u'BLODE', u'BL\xd6DE'), (u'blof$', u'blo\xdf'), (u'blofl', u'blo\xdf'), (u'Blol2>', u'Blo\xdf'), (u'blol3', u'blo\xdf'), (u'blol3>', u'blo\xdf'), (u'blol3stellen', u'blo\xdfstellen'), (u'bloli', u'blo\xdf'), (u'blolistellen', u'blo\xdfstellen'), (u'blolls', u'blo\xdf'), (u'bls', u'bis'), (u'Blst', u'Bist'), (u'bltte', u'bitte'), (u'Blumenstr\xe9iulichen', u'Blumenstr\xe4u\xdfchen'), (u'Blument\xe9pfen', u'Blument\xf6pfen'), (u'Blutgetr\xe4nkte', u'Blut getr\xe4nkte'), (u'Blutgetr\xe9nkte', u'Blutgetr\xe4nkte'), (u'blutjungl', u'blutjung!'), (u'blutriinstig', u'blutr\xfcnstig'), (u'Blutvergiefien', u'Blutvergie\xdfen'), (u'bl\xe9d', u'bl\xf6d'), (u'Bl\xe9de', u'Bl\xf6de'), (u'bl\xe9den', u'bl\xf6den'), (u'bl\xe9der', u'bl\xf6der'), (u'Bl\xe9des', u'Bl\xf6des'), (u'Bl\xe9dheit', u'Bl\xf6dheit'), (u'Bl\xe9dmann', u'Bl\xf6dmann'), (u'Bl\xe9dsinn', u'Bl\xf6dsinn'), (u'Bl\xe9iser', u'Bl\xe4ser'), (u'Bl\xe9ser', u'Bl\xe4ser'), (u'bl\xe9st', u'bl\xe4st'), (u'Bnjicke', u'Br\xfccke'), (u'Bodensch\xe9tze', u'Bodensch\xe4tze'), (u'Bogenschiefien', u'Bogenschie\xdfen'), (u'Bogenschiefienl', u'Bogenschie\xdfen!'), (u'Bogenschiefiens', u'Bogenschie\xdfens'), (u'Bogenschiitze', u'Bogensch\xfctze'), (u'Bogenschiitzen', u'Bogensch\xfctzen'), (u'Bogenschijtze', u'Bogensch\xfctze'), (u'Bogenschijtzen', u'Bogensch\xfctzen'), (u'Bogenschutzen', u'Bogensch\xfctzen'), (u'Bogenschutzenl', u'Bogensch\xfctzen!'), (u'BOnjour', u'Bonjour'), (u'bosartige', u'b\xf6sartige'), (u'Bracken', u'Brocken'), (u'Briicke', u'Br\xfccke'), (u'Briicken', u'Br\xfccken'), (u'Briider', u'Br\xfcder'), (u'Briihe', u'Br\xfche'), (u'Briillen', u'Br\xfcllen'), (u'briillt', u'br\xfcllt'), (u'Brijcke', u'Br\xfccke'), (u'Brijderlichkeit', u'Br\xfcderlichkeit'), (u'brijllen', u'br\xfcllen'), (u'Brilcke', u'Br\xfccke'), (u'Brilder', u'Br\xfcder'), (u'Brilllen', u'Br\xfcllen'), (u'brillltjeden', u'br\xfcllt jeden'), (u'Brilnette', u'Br\xfcnette'), (u'Brilsten', u'Br\xfcsten'), (u'brilten', u'br\xfcten'), (u"BrL'lcke", u'Br\xfccke'), (u"brL'lllen", u'br\xfcllen'), (u'brlliderliche', u'br\xfcderliche'), (u'Brllidern', u'Br\xfcdern'), (u'Brlliste', u'Br\xfcste'), (u'Broschijre', u'Brosch\xfcre'), (u'Broschilren', u'Brosch\xfcren'), (u'Broschuren', u'Brosch\xfcren'), (u'Brucke', u'Br\xfccke'), (u'Brucken', u'Br\xfccken'), (u'Brudern', u'Br\xfcdern'), (u'Bruhe', u'Br\xfche'), (u'brullen', u'br\xfcllen'), (u'brullt', u'br\xfcllt'), (u'Brutalitiit', u'Brutalit\xe4t'), (u'Brutzelhtihnchen', u'Brutzelh\xfchnchen'), (u'Br\xe9chtet', u'Br\xe4chtet'), (u'Br\xe9iutigam', u'Br\xe4utigam'), (u'Br\xe9sel', u'Br\xf6sel'), (u'Br\xe9tchen', u'Br\xf6tchen'), (u'br\xe9uchte', u'br\xe4uchte'), (u'br\xe9uchten', u'br\xe4uchten'), (u'br\xe9unen', u'br\xe4unen'), (u'Br\xe9ute', u'Br\xe4ute'), (u'Br\ufb02cke', u'Br\xfccke'), (u'Br\ufb02der', u'Br\xfcder'), (u'Btiro', u'B\xfcro'), (u'Btiser', u'B\xf6ser'), (u'Bucher', u'B\xfccher'), (u'Buchern', u'B\xfcchern'), (u'Budgetkiirzung', u'Budgetk\xfcrzung'), (u'BUFO', u'B\xfcro'), (u'Bugschutzgerate', u'Bugschutzger\xe4te'), (u'Buhnenbild', u'B\xfchnenbild'), (u'Bullel', u'Bulle!'), (u'Buml', u'Bum!'), (u'Bundnis', u'B\xfcndnis'), (u'Burger', u'B\xfcrger'), (u'Burgerrechtlerin', u'B\xfcrgerrechtlerin'), (u'Buro', u'B\xfcro'), (u'BURO', u'B\xdcRO'), (u'Burol', u'B\xfcro!'), (u'Burottlr', u'B\xfcrot\xfcr'), (u'Busche', u'B\xfcsche'), (u'B\xe9ickchen', u'B\xe4ckchen'), (u'B\xe9ickerei', u'B\xe4ckerei'), (u'B\xe9ille', u'B\xe4lle'), (u'B\xe9inder', u'B\xe4nder'), (u'B\xe9ir', u'B\xe4r'), (u'B\xe9irgermeister', u'B\xfcrgermeister'), (u'B\xe9iro', u'B\xfcro'), (u'b\xe9ise', u'b\xf6se'), (u'B\xe9iume', u'B\xe4ume'), (u'B\xe9nder', u'B\xe4nder'), (u'B\xe9r', u'B\xe4r'), (u'B\xe9ren', u'B\xe4ren'), (u'B\xe9renhasser', u'B\xe4renhasser'), (u'B\xe9renhunger', u'B\xe4renhunger'), (u'B\xe9renj\xe9ger', u'B\xe4renj\xe4ger'), (u'B\xe9renk\xe9nig', u'B\xe4renk\xf6nig'), (u'B\xe9renlaute', u'B\xe4renlaute'), (u'B\xe9renrolle', u'B\xe4renrolle'), (u'B\xe9renschnitzereien', u'B\xe4renschnitzereien'), (u'B\xe9renstimmen', u'B\xe4renstimmen'), (u'B\xe9rin', u'B\xe4rin'), (u'B\xe9risch', u'B\xe4risch'), (u'B\xe9rs', u'B\xe4rs'), (u'B\xe9rte', u'B\xe4rte'), (u'b\xe9s', u'b\xf6s'), (u'b\xe9se', u'b\xf6se'), (u'b\xe9sen', u'b\xf6sen'), (u'B\xe9ses', u'B\xf6ses'), (u'B\xe9ume', u'B\xe4ume'), (u'B\xe9umen', u'B\xe4umen'), (u'B\ufb02chern', u'B\xfcchern'), (u'B\ufb02ste', u'B\xfcste'), (u'Cafe', u'Caf\xe9'), (u'Caf\xe4', u'Caf\xe9'), (u'CASAREN', u'C\xc4SAREN'), (u'Charakterm\xe9ngel', u'Charakterm\xe4ngel'), (u'Charakterst\xe9rke', u'Charakterst\xe4rke'), (u'Chrlntlna', u'Christina'), (u'Ciden', u'\xf6den'), (u'Ciffnet', u'\xd6ffnet'), (u'Cihrchen', u'\xd6hrchen'), (u'Citro\xe9n', u'Citro\xebn'), (u'clamit', u'damit'), (u'class', u'dass'), (u'Clbernimmt', u'\xfcbernimmt'), (u'cler', u'der'), (u'Coimbrasl', u'Coimbras!'), (u'CommanderWill', u'Commander Will'), (u'Corenillal', u'Corenilla!'), (u'Cowboyscheifi', u'Cowboyschei\xdf'), (u'C\xe9sar', u'C\xe4sar'), (u'D/e', u'Die'), (u'd/ese', u'diese'), (u'd/esem', u'diesem'), (u'd/esen', u'diesen'), (u'D/eser', u'Dieser'), (u'D/eses', u'Dieses'), (u'D/sko', u'Disko'), (u'dabel', u'dabei'), (u'dachfen', u'dachten'), (u'daffir', u'daf\xfcr'), (u'dafiir', u'daf\xfcr'), (u'Dafijr', u'Daf\xfcr'), (u'Dafijur', u'Daf\xfcr'), (u'Dafilr', u'Daf\xfcr'), (u"dafL'lr", u'daf\xfcr'), (u'dafLir', u'daf\xfcr'), (u'dafljr', u'daf\xfcr'), (u'dafllir', u'daf\xfcr'), (u'Daflllrwar', u'Daf\xfcr war'), (u'daftir', u'daf\xfcr'), (u'dafUr', u'daf\xfcr'), (u'dafzjir', u'daf\xfcr'), (u'dajemand', u'da jemand'), (u'dal', u'da!'), (u'Damenh\xe9nde', u'Damenh\xe4nde'), (u'damitl', u'damit!'), (u'damlt', u'damit'), (u'DANEMARK', u'D\xc4NEMARK'), (u'darfiber', u'dar\xfcber'), (u'Dariiber', u'Dar\xfcber'), (u'darijber', u'dar\xfcber'), (u'Darilber', u'Dar\xfcber'), (u"dart/'ber", u'dar\xfcber'), (u'dartlber', u'dar\xfcber'), (u'DARUBER', u'DAR\xdcBER'), (u'DarUber', u'Dar\xfcber'), (u'dasjetzt', u'das jetzt'), (u'dasl', u'das!'), (u'Dateniibermittlung', u'Daten\xfcbermittlung'), (u'dauem', u'dauern'), (u'dauerf', u'dauert'), (u'dazugeh\xe9ren', u'dazugeh\xf6ren'), (u'Da\xdf', u'Dass'), (u'Da\ufb02lr', u'Daf\xfcr'), (u'Ddrfern', u'D\xf6rfern'), (u'def', u'der'), (u'Defekf/v', u'Detektiv'), (u'deinerZelle', u'deiner Zelle'), (u'deln', u'dein'), (u'delne', u'deine'), (u'demfiltigen', u'dem\xfctigen'), (u'Demijtigung', u'Dem\xfctigung'), (u'demllitige', u'dem\xfctige'), (u'demllitigen', u'dem\xfctigen'), (u'denkwurdiger', u'denkw\xfcrdiger'), (u'denkw\ufb02rdiger', u'denkw\xfcrdiger'), (u'derAbgeordnete', u'der Abgeordnete'), (u'derAusgabe', u'der Ausgabe'), (u'derAusl6ser', u'der Ausl\xf6ser'), (u"DerjL'lngste", u'Der j\xfcngste'), (u'derjunge', u'der junge'), (u'dermaben', u'derma\xdfen'), (u'derTyp', u'der Typ'), (u'derWeg', u'der Weg'), (u'derWelle', u'der Welle'), (u'DerWL1rfel', u'Der W\xfcrfel'), (u'DerZauberer', u'Der Zauberer'), (u'de__n', u'den'), (u'dfeserr', u'diesem'), (u'dffentlichen', u'\xf6ffentlichen'), (u'dffnen', u'\xf6ffnen'), (u'Dfimonen', u'D\xe4monen'), (u'dfinn', u'd\xfcnn'), (u'dichl', u'dich!'), (u'diej\xfcngste', u'die J\xfcngste'), (u'dienstunfahig', u'dienstunf\xe4hig'), (u'Dieselkapit\xe9in', u'Dieselkapit\xe4n'), (u'Dieselkapit\xe9n', u'Dieselkapit\xe4n'), (u'Dieselmotorenl', u'Dieselmotoren!'), (u'dieserAufnahme', u'dieser Aufnahme'), (u'Dieserjunge', u'Dieser junge'), (u'Diiit', u'Di\xe4t'), (u'diirfe', u'd\xfcrfe'), (u'Diirfen', u'D\xfcrfen'), (u'diirft', u'd\xfcrft'), (u'diirfte', u'd\xfcrfte'), (u'dijfien', u'd\xfcrfen'), (u'dijnn', u'd\xfcnn'), (u'dijrfen', u'd\xfcrfen'), (u'Dijrfte', u'D\xfcrfte'), (u'dijstere', u'd\xfcstere'), (u'dilmmer', u'd\xfcmmer'), (u'dilrfen', u'd\xfcrfen'), (u'dilrft', u'd\xfcrft'), (u'dilrften', u'd\xfcrften'), (u'dilrftig', u'd\xfcrftig'), (u'Dine', u'D\xe4ne'), (u'dirja', u'dir ja'), (u'dirjemand', u'dir jemand'), (u'dirjetzt', u'dir jetzt'), (u'dirJulie', u'dir Julie'), (u'dirl', u'dir!'), (u'dirwehzutun', u'dir wehzutun'), (u'Di\xe9t', u'Di\xe4t'), (u'Di\xe9tberaterin', u'Di\xe4tberaterin'), (u'Di\xe9tbier', u'Di\xe4tbier'), (u'dlch', u'dich'), (u'Dle', u'Die'), (u'dles', u'dies'), (u'Dlese', u'Diese'), (u'Dlfit', u'Di\xe4t'), (u'Dlitplan', u'Di\xe4tplan'), (u'dllirfen', u'd\xfcrfen'), (u'dllirft', u'd\xfcrft'), (u'dllirstet', u'd\xfcrstet'), (u'dlr', u'dir'), (u'doc/1', u'doch'), (u'dochl', u'doch!'), (u'dolthin', u'dorthin'), (u'Doppelgfiner', u'Doppelg\xe4nger'), (u'Doppelgfinger', u'Doppelg\xe4nger'), (u'Doppelg\xe9inger', u'Doppelg\xe4nger'), (u'Doppelg\xe9nger', u'Doppelg\xe4nger'), (u'Doppelzijngig', u'Doppelz\xfcngig'), (u'doppelztmgiger', u'doppelz\xfcngiger'), (u'dor', u'der'), (u"Dr'a'ngt", u'Dr\xe4ngt'), (u'drachengriinen', u'drachengr\xfcnen'), (u'Drahte', u'Dr\xe4hte'), (u'dranl', u'dran!'), (u'drau/3en', u'drau\xdfen'), (u'drau/Sen', u'drau\xdfen'), (u'drauBen', u'drau\xdfen'), (u'drauf$en', u'drau\xdfen'), (u'draufdrilcken', u'draufdr\xfccken'), (u'draufgestllirzt', u'draufgest\xfcrzt'), (u'draufg\xe9ngerisch', u'draufg\xe4ngerisch'), (u'draufien', u'drau\xdfen'), (u'draufken', u'drau\xdfen'), (u'drauflsenl', u'drau\xdfen!'), (u'drauf\xe9en', u'drau\xdfen'), (u'drauilen', u'drau\xdfen'), (u'draul3en', u'drau\xdfen'), (u'draul5en', u'drau\xdfen'), (u'draulien', u'drau\xdfen'), (u'draullen', u'drau\xdfen'), (u'draulSen', u'drau\xdfen'), (u'Dreckl\xe9chern', u'Dreckl\xf6chern'), (u'Drecksmiihle', u'Drecksm\xfchle'), (u'Drecks\xe9cke', u'Drecks\xe4cke'), (u'drfiben', u'dr\xfcben'), (u'Drfick', u'Dr\xfcck'), (u'Drfingeln', u'Dr\xe4ngeln'), (u'drih', u'dritt'), (u'driiben', u'dr\xfcben'), (u'driicken', u'dr\xfccken'), (u'driickt', u'dr\xfcckt'), (u'drijben', u'dr\xfcben'), (u'drijber', u'dr\xfcber'), (u'drijck', u'dr\xfcck'), (u'drijckt', u'dr\xfcckt'), (u'drilben', u'dr\xfcben'), (u'drilber', u'dr\xfcber'), (u'drilcken', u'dr\xfccken'), (u'drLiber', u'dr\xfcber'), (u'drlliben', u'dr\xfcben'), (u'drlllben', u'dr\xfcben'), (u'Drogenabh\xe9ngige', u'Drogenabh\xe4ngige'), (u'Drticken', u'Dr\xfccken'), (u'druben', u'dr\xfcben'), (u'drubenl', u'dr\xfcben!'), (u'druber', u'dr\xfcber'), (u'Druckkn\xe9pfe', u'Druckkn\xf6pfe'), (u'drunterliegt', u'drunter liegt'), (u'Dr\xe9nage', u'Dr\xe4nage'), (u'dr\xe9ngeln', u'dr\xe4ngeln'), (u'dr\xe9ngen', u'dr\xe4ngen'), (u'dr\xe9ngt', u'dr\xe4ngt'), (u'dr\ufb02ben', u'dr\xfcben'), (u'dtirft', u'd\xfcrft'), (u'dtlrfen', u'd\xfcrfen'), (u'Dudels\xe9cken', u'Dudels\xe4cken'), (u"dUFf\u20acl'1", u'd\xfcrfen'), (u'dul', u'du!'), (u'dull', u'dass'), (u'Dummk6pfe', u'Dummk\xf6pfe'), (u'Dummkiipfe', u'Dummk\xf6pfe'), (u'Dunnschiss', u'D\xfcnnschiss'), (u'durchdrficken', u'durchdr\xfccken'), (u'durchdr\xe9ngen', u'durchdr\xe4ngen'), (u'Durchfiihrung', u'Durchf\xfchrung'), (u'durchfuhren', u'durchf\xfchren'), (u'durchgefiihlt', u'durchgef\xfchrt'), (u'durchgefijhrt', u'durchgef\xfchrt'), (u'durchgefuhrt', u'durchgef\xfchrt'), (u'durchgef\ufb02hrt', u'durchgef\xfchrt'), (u'Durchg\xe9nge', u'Durchg\xe4nge'), (u'Durchladenl', u'Durchladen!'), (u'durchlfichere', u'durchl\xf6chere'), (u'durchsetzungsf\xe9higer', u'durchsetzungsf\xe4higer'), (u'durchst\xe9bern', u'durchst\xf6bern'), (u'durchwilhlt', u'durchw\xfchlt'), (u'durchzufilhren', u'durchzuf\xfchren'), (u'durchzufuhren', u'durchzuf\xfchren'), (u'Durfen', u'D\xfcrfen'), (u'durft', u'd\xfcrft'), (u'dusterer', u'd\xfcsterer'), (u'D\xe9cher', u'D\xe4cher'), (u'D\xe9imon', u'D\xe4mon'), (u'D\xe9imonen', u'D\xe4monen'), (u'D\xe9inemark', u'D\xe4nemark'), (u'D\xe9inemarks', u'D\xe4nemarks'), (u'D\xe9inen', u'D\xe4nen'), (u'd\xe9inisches', u'd\xe4nisches'), (u'd\xe9mlich', u'd\xe4mlich'), (u'D\xe9mliche', u'D\xe4mliche'), (u'd\xe9mlichen', u'd\xe4mlichen'), (u'd\xe9mlicher', u'd\xe4mlicher'), (u'd\xe9mlichl', u'd\xe4mlich'), (u'd\xe9mmert', u'd\xe4mmert'), (u'D\xe9monenb\xe9ren', u'D\xe4monenb\xe4ren'), (u'd\xe9monischen', u'd\xe4monischen'), (u'D\xe9rme', u'D\xe4rme'), (u'D\xe9rrfleisch', u'D\xf6rrfleisch'), (u'D\xe9umchen', u'D\xe4umchen'), (u'd\ufb02rfen', u'd\xfcrfen'), (u'E//e', u'Elle'), (u'e/n', u'ein'), (u'e/ne', u'eine'), (u'e/nem', u'einem'), (u'e/nen', u'einen'), (u'e/ner', u'einer'), (u'e/nes', u'eines'), (u'e/ns', u'eins'), (u'e/nsf', u'einst'), (u'E9YPt', u'Egypt'), (u'Ea/vtes', u'Echtes'), (u'ebenbfirtig', u'ebenb\xfcrtig'), (u'ebenburtige', u'ebenb\xfcrtige'), (u'Ec/vte', u'Echte'), (u'echfen', u'echten'), (u'edelm\ufb02tig', u'edelm\xfctig'), (u'efn', u'ein'), (u'efwas', u'etwas'), (u'Eheminner', u'Ehem\xe4nner'), (u'Ehem\xe9nnern', u'Ehem\xe4nnern'), (u'Ehezerstfirerin', u'Ehezerst\xf6rerin'), (u'Ehrenbijrger', u'Ehrenb\xfcrger'), (u'EHRENBURGERSCHAFT', u'EHRENB\xdcRGERSCHAFT'), (u'Ehreng\xe9iste', u'Ehreng\xe4ste'), (u'Eichhfirnchen', u'Eichh\xf6rnchen'), (u'Eichhiirnchen', u'Eichh\xf6rnchen'), (u'Eichh\xe9rnchens', u'Eichh\xf6rnchens'), (u'eifersfichtig', u'eifers\xfcchtig'), (u'eifersiichtig', u'eifers\xfcchtig'), (u'eifers\ufb02chtig', u'eifers\xfcchtig'), (u'eigenh\xe9ndig', u'eigenh\xe4ndig'), (u'eigenmlchtig', u'eigenm\xe4chtig'), (u'eigenntltziges', u'eigenn\xfctziges'), (u'Eihnlich', u'\xe4hnlich'), (u'Eimen/veise', u'Eimerweise'), (u'Einbruche', u'Einbr\xfcche'), (u'eindriicken', u'eindr\xfccken'), (u'Eindring/Inge', u'Eindringlinge'), (u'eindrucken', u'eindr\xfccken'), (u'einejunge', u'eine junge'), (u'einerfr\ufb02hen', u'einer fr\xfchen'), (u'einervorfuhrung', u'einer Vorf\xfchrung'), (u'einfiihren', u'einf\xfchren'), (u'Einfiihrung', u'Einf\xfchrung'), (u'einfilgen', u'einf\xfcgen'), (u'einfilhlsamsten', u'einf\xfchlsamsten'), (u'einflllgen', u'einf\xfcgen'), (u'Einflusse', u'Einfl\xfcsse'), (u'einfugen', u'einf\xfcgen'), (u'einfuhrten', u'einf\xfchrten'), (u'Einfuhrung', u'Einf\xfchrung'), (u'Einf\xe9ltige', u'Einf\xe4ltige'), (u'eingefiigt', u'eingef\xfcgt'), (u'eingef\ufb02gt', u'eingef\xfcgt'), (u'eingehiillt', u'eingeh\xfcllt'), (u'eingepr\xe9gt', u'eingepr\xe4gt'), (u'einger\xe9iumt', u'einger\xe4umt'), (u'einger\xe9umt', u'einger\xe4umt'), (u'eingeschl\xe9fert', u'eingeschl\xe4fert'), (u'eingeschr\xe9nkt', u'eingeschr\xe4nkt'), (u'eingesch\xe9itzt', u'eingesch\xe4tzt'), (u'eingesch\xe9tzt', u'eingesch\xe4tzt'), (u'eingesturzt', u'eingest\xfcrzt'), (u'eingieBt', u'eingie\xdft'), (u'eingschaltet', u'eingeschaltet'), (u'Einh\xe9rnern', u'Einh\xf6rner'), (u'einlegenl', u'einlegen!'), (u'einl\xe9dt', u'einl\xe4dt'), (u'einl\xe9sen', u'einl\xf6sen'), (u'Einsatzfahigkeit', u'Einsatzf\xe4higkeit'), (u'Einschiichterung', u'Einsch\xfcchterung'), (u'Einschliefklich', u'Einschlie\xdflich'), (u'Einschlielilich', u'Einschlie\xdflich'), (u'einstellenl', u'einstellen!'), (u'Eins\xe9tze', u'Eins\xe4tze'), (u'eint\xe9nig', u'eint\xf6nig'), (u'Einzelg\xe9ngerin', u'Einzelg\xe4ngerin'), (u'einzusch\xe9tzen', u'einzusch\xe4tzen'), (u'Eisstiirme', u'Eisst\xfcrme'), (u'Elektrizit\xe9t', u'Elektrizit\xe4t'), (u'elfenbeingetfinte', u'elfenbeinget\xf6nte'), (u'elit\xe9rer', u'elit\xe4rer'), (u'Eln', u'Ein'), (u'Elne', u'Eine'), (u'elnem', u'einem'), (u'Elnen', u'Einen'), (u'elner', u'einer'), (u'Elnes', u'Eines'), (u'empfindungsf\xe9higen', u'empfindungsf\xe4higen'), (u'Empf\xe9inger', u'Empf\xe4nger'), (u'empf\xe9ngt', u'empf\xe4ngt'), (u'Empiirend', u'Emp\xf6rend'), (u'Empiirendste', u'Emp\xf6rendste'), (u'empiirt', u'emp\xf6rt'), (u'emst', u'ernst'), (u'en/varten', u'erwarten'), (u'En/vartungen', u'Erwartungen'), (u'en/v\xe9hnt', u'erw\xe4hnt'), (u'Enchant\xe4', u'Enchant\xe9'), (u'endgiiltig', u'endg\xfcltig'), (u'endgultig', u'endg\xfcltig'), (u'endgultigen', u'endg\xfcltigen'), (u'endg\ufb02ltig', u'endg\xfcltig'), (u'endlichl', u'endlich!'), (u'ENERIGE', u'ENERGIE'), (u'enfternt', u'entfernt'), (u'Engl\xe9nder', u'Engl\xe4nder'), (u'Engl\xe9nderin', u'Engl\xe4nderin'), (u'eniillen', u'erf\xfcllen'), (u'entbl6Bte', u'entbl\xf6\xdfte'), (u'entbl6f$en', u'entbl\xf6\xdfen'), (u'entfiihre', u'entf\xfchre'), (u'entfiihrt', u'entf\xfchrt'), (u'entfiihrte', u'entf\xfchrte'), (u'Entfiihrung', u'Entf\xfchrung'), (u'Entftihrung', u'Entf\xfchrung'), (u'ENTFUHRUNGSVERDACHTIGER', u'ENTF\xdcHRUNGSVERD\xc4CHTIGER'), (u'enthllt', u'enth\xe4lt'), (u'enthUllt', u'enth\xfcllt'), (u'enth\xe9lt', u'enth\xe4lt'), (u'entliiften', u'entl\xfcften'), (u'Entliiftungen', u'Entl\xfcftungen'), (u'Entlijlftungen', u'Entl\xfcftungen'), (u'entluften', u'entl\xfcften'), (u'entl\xe9sst', u'entl\xe4sst'), (u'Entreilit', u'Entrei\xdft'), (u'entriistet', u'entr\xfcstet'), (u'entr\xe9itseln', u'entr\xe4tseln'), (u'Entschlrfen', u'Entsch\xe4rfen'), (u'Entschlull', u'Entschluss'), (u'ENTSCHLUSSELN', u'ENTSCHL\xdcSSELN'), (u'Entschlussen', u'Entschl\xfcssen'), (u'entsch\xe9rfen', u'entsch\xe4rfen'), (u'enttausche', u'entt\xe4usche'), (u'enttiiuscht', u'entt\xe4uscht'), (u'Enttluscht', u'Entt\xe4uscht'), (u'Enttluschungen', u'Entt\xe4uschungen'), (u'entt\xe9iuschen', u'entt\xe4uschen'), (u'entt\xe9uschen', u'entt\xe4uschen'), (u'entt\xe9uschst', u'entt\xe4uschst'), (u'entt\xe9uscht', u'entt\xe4uscht'), (u'Entv\\/Urfe', u'Entw\xfcrfe'), (u'Entwicklungsl\xe9ndern', u'Entwicklungsl\xe4ndern'), (u'entzllickt', u'entz\xfcckt'), (u'entzllindet', u'entz\xfcndet'), (u'entzuckend', u'entz\xfcckend'), (u'entzundet', u'entz\xfcndet'), (u'enzv\xe9rmt', u'erw\xe4rmt'), (u'Er6ffnen', u'Er\xf6ffnen'), (u'erb\xe9rml/ch', u'erb\xe4rmlich'), (u'erb\xe9rmlich', u'erb\xe4rmlich'), (u'Erb\xe9rmliches', u'Erb\xe4rmliches'), (u'Erdnijsse', u'Erdn\xfcsse'), (u'erdriickt', u'erdr\xfcckt'), (u'erd\xe9ihnliche', u'erd\xe4hnliche'), (u'erfebst', u'erlebst'), (u'erffillen', u'erf\xfcllen'), (u'erfiffnet', u'er\xf6ffnet'), (u'erfiille', u'erf\xfclle'), (u'erfiillen', u'erf\xfcllen'), (u'erfiillt', u'erf\xfcllt'), (u'erfijllt', u'erf\xfcllt'), (u'erfillle', u'erf\xfclle'), (u'erfilllen', u'erf\xfcllen'), (u'erfilllt', u'erf\xfcllt'), (u'erfllille', u'erf\xfclle'), (u'erfllillt', u'erf\xfcllt'), (u'erflllllen', u'erf\xfcllen'), (u'Erfolgl', u'Erfolg!'), (u'erfullen', u'erf\xfcllen'), (u'erfullt', u'erf\xfcllt'), (u'erf\xe9hrst', u'erf\xe4hrst'), (u'erf\xe9hrt', u'erf\xe4hrt'), (u'erf\ufb02llen', u'erf\xfcllen'), (u'ergrllindet', u'ergr\xfcndet'), (u'erhalfen', u'erhalten'), (u'Erhdhe', u'Erh\xf6he'), (u'erhiihter', u'erh\xf6hter'), (u'erhiiren', u'erh\xf6ren'), (u'ERHKLT', u'ERH\xc4LT'), (u'erhllt', u'erh\xe4lt'), (u'erh\xe9hen', u'erh\xf6hen'), (u'erh\xe9ht', u'erh\xf6ht'), (u'erh\xe9ilt', u'erh\xe4llt'), (u'erh\xe9lt', u'erh\xe4lt'), (u'erh\xe9rt', u'erh\xf6rt'), (u'erh\xe9rte', u'erh\xf6rte'), (u'eriiffnet', u'er\xf6ffnet'), (u'erja', u'er ja'), (u'erjetzt', u'er jetzt'), (u'erjung', u'er jung'), (u"erkl'a'ren", u'erkl\xe4ren'), (u"erkl'air's", u"erkl\xe4r's"), (u'erklaren', u'erkl\xe4ren'), (u'erklfire', u'erkl\xe4re'), (u'Erklfirung', u'Erkl\xe4rung'), (u'erklirt', u'erkl\xe4rt'), (u'erkllre', u'erkl\xe4re'), (u'erkllrt', u'erkl\xe4rt'), (u'erkllrte', u'erkl\xe4rte'), (u'erkllrten', u'erkl\xe4rten'), (u'Erkllrung', u'Erkl\xe4rung'), (u'erkl\xe9ir', u'erkl\xe4r'), (u'erkl\xe9ire', u'erkl\xe4re'), (u'erkl\xe9iren', u'erkl\xe4ren'), (u'erkl\xe9r', u'erkl\xe4r'), (u"erkl\xe9r's", u"erkl\xe4r's"), (u'erkl\xe9rbar', u'erkl\xe4rbar'), (u'Erkl\xe9re', u'Erkl\xe4re'), (u'erkl\xe9ren', u'erkl\xe4ren'), (u'erkl\xe9rt', u'erkl\xe4rt'), (u'Erkl\xe9rung', u'Erkl\xe4rung'), (u'erk\xe9ltest', u'erkaltest'), (u"erlC'>st", u'erl\xf6st'), (u'erldse', u'erl\xf6se'), (u'Erled/gen', u'Erledigen'), (u'erlieB', u'erlie\xdf'), (u'erlnnem', u'erinnern'), (u'erl\xe9scht', u'erl\xf6scht'), (u'erl\xe9sen', u'erl\xf6sen'), (u'erl\xe9st', u'erl\xf6st'), (u'Erl\xe9sung', u'Erl\xf6sung'), (u'ermbglichen', u'erm\xf6glichen'), (u'Erm\xe9chtige', u'Erm\xe4chtige'), (u'erm\xe9glicht', u'erm\xf6glicht'), (u'erm\xe9glichte', u'erm\xf6glichte'), (u'ernlllchtert', u'ern\xfcchtert'), (u'ern\xe9hren', u'ern\xe4hren'), (u'Ern\xe9hrung', u'Ern\xe4hrung'), (u'eroffnet', u'er\xf6ffnet'), (u'Erpressungsscheilie', u'Erpressungsschei\xdfe'), (u'err\xe9tst', u'err\xe4tst'), (u'erschieB', u'erschie\xdf'), (u'erschieBen', u'erschie\xdfen'), (u'erschiefien', u'erschie\xdfen'), (u'erschiefit', u'erschie\xdft'), (u'erschiefke', u'erschie\xdfe'), (u'erschielie', u'erschie\xdfe'), (u'Erschielit', u'Erschie\xdft'), (u'erschiipft', u'ersch\xf6pft'), (u'erschiittert', u'ersch\xfcttert'), (u'erschilttert', u'ersch\xfcttert'), (u'erschl\xe9gt', u'erschl\xe4gt'), (u'ERTCHDNT', u'ERT\xd6NT'), (u'ERTCNT', u'ERT\xd6NT'), (u'ERTGNT', u'ERT\xd6NT'), (u'ertiffnen', u'er\xf6ffnen'), (u'ertr\xe9gst', u'ertr\xe4gst'), (u'ertr\xe9inken', u'ertr\xe4nken'), (u'ert\xe9nt', u'ert\xf6nt'), (u'ervvartez', u'erwartet'), (u'ervvilrgen', u'erw\xfcrgen'), (u'ervv\xe9hnen', u'erw\xe4hnen'), (u'ervv\xe9ihnen', u'erw\xe4hnen'), (u'ervv\xe9ihnt', u'erw\xe4hnt'), (u'ervv\xe9ihnte', u'erw\xe4hnte'), (u'Erv\\/an', u'Erwan'), (u"Erv\\/an's", u"Erwan's"), (u"erw'a'hnt", u'erw\xe4hnt'), (u'Erwar', u'Er war'), (u'erwe/sen', u'erweisen'), (u'Erwfirmung', u'Erw\xe4rmung'), (u'Erwird', u'Er wird'), (u'Erwtirde', u'Er w\xfcrde'), (u'erw\xe9gt', u'erw\xe4gt'), (u'Erw\xe9gung', u'Erw\xe4gung'), (u'Erw\xe9hne', u'Erw\xe4hne'), (u'erw\xe9hnen', u'erw\xe4hnen'), (u'erw\xe9hnt', u'erw\xe4hnt'), (u'erw\xe9hnte', u'erw\xe4hnte'), (u'Erw\xe9hnung', u'Erw\xe4hnung'), (u'erw\xe9ihlt', u'erw\xe4hlt'), (u'erw\xe9ihnt', u'erw\xe4hnt'), (u'erw\xe9rmt', u'erw\xe4rmt'), (u"erz'a'hlt", u'erz\xe4hlt'), (u'Erzdiiizese', u'Erzdi\xf6zese'), (u'erzfihlen', u'erz\xe4hlen'), (u'Erzfihler', u'Erz\xe4hler'), (u'erzihlenl', u'erz\xe4hlen!'), (u'erziihlen', u'erz\xe4hlen'), (u'erziihlt', u'erz\xe4hlt'), (u'erziirnt', u'erz\xfcrnt'), (u'erzilrnt', u'erz\xfcrnt'), (u'erzllirnt', u'erz\xfcrnt'), (u'erzurnen', u'erz\xfcrnen'), (u'erz\xe9hl', u'erz\xe4hl'), (u'erz\xe9hle', u'erz\xe4hle'), (u'Erz\xe9hlen', u'Erz\xe4hlen'), (u'erz\xe9hlerische', u'erz\xe4hlerische'), (u'erz\xe9hlerischen', u'erz\xe4hlerischen'), (u'erz\xe9hlerischer', u'erz\xe4hlerischer'), (u'Erz\xe9hlkunste', u'Erz\xe4hlk\xfcnste'), (u'erz\xe9hlst', u'erz\xe4hlst'), (u'erz\xe9hlt', u'erz\xe4hlt'), (u'erz\xe9hlte', u'erz\xe4hlte'), (u'Erz\xe9hlung', u'Erz\xe4hlung'), (u'Erz\xe9ihl', u'Erz\xe4hl'), (u'Erz\xe9ihle', u'Erz\xe4hle'), (u'erz\xe9ihlen', u'erz\xe4hlen'), (u'erz\xe9ihlst', u'erz\xe4hlst'), (u'erz\xe9ihlt', u'erz\xe4hlt'), (u'erz\xe9ihlte', u'erz\xe4hlte'), (u'er\xe9ffnen', u'er\xf6ffnen'), (u'er\xe9ffnet', u'er\xf6ffnet'), (u'er\xe9ffnete', u'er\xf6ffnete'), (u'Er\xe9ffnungsaufnahme', u'Er\xf6ffnungsaufnahme'), (u'Er\xe9ffnungssequenz', u'Er\xf6ffnungssequenz'), (u'Er\xe9ffnungsszene', u'Er\xf6ffnungsszene'), (u'Er\ufb02lllen', u'Erf\xfcllen'), (u'etemity', u'eternity'), (u'etvva', u'etwa'), (u'euc/1', u'euch'), (u'Europ\xe9er', u'Europ\xe4er'), (u'europ\xe9ische', u'europ\xe4ische'), (u"ex'nfac'/7", u'einfach'), (u'Examenspriifungen', u'Examenspr\xfcfungen'), (u'Exekutivzust\xe9noligkeit', u'Exekutivzust\xe4ndigkeit'), (u'Explosionenl', u'Explosionen!'), (u'Extrablattl', u'Extrablatt!'), (u'F/nden', u'Finden'), (u'F/ugba/I', u'Flugball'), (u'Fahnrich', u'F\xe4hnrich'), (u'fahrlissiges', u'fahrl\xe4ssiges'), (u'Fairbankverlieh', u'Fairbank verlieh'), (u'Fallef', u'Falle!'), (u'fallengelassen', u'fallen gelassen'), (u'Fallschirmj\xe9gereinheiten', u'Fallschirmj\xe4gereinheiten'), (u'Fam/Z/e', u'Familie'), (u'Fa\xdf', u'Fass'), (u'FBl', u'FBI'), (u'Fe/nd', u'Feind'), (u'fehlschl\xe9gt', u'fehlschl\xe4gt'), (u'Feindberllihrung', u'Feindber\xfchrung'), (u'Feind\xfcbewvachung', u'Feind\xfcberwachung'), (u'feltig', u'fertig'), (u'femen', u'fernen'), (u'fernh\xe9ilt', u'fernh\xe4lt'), (u'Festhaltenl', u'Festhalten!'), (u'Fettw\xe9nste', u'Fettw\xe4nste'), (u'Feuen/vehr', u'Feuerwehr'), (u'Feuerliischer', u'Feuerl\xf6scher'), (u'Feuervvehrrnann', u'Feuerwehrrnann'), (u'Feuerwehrl', u'Feuerwehr!'), (u'Feuerwfirmen', u'Feuer w\xe4rmen'), (u'Feue\ufb02', u'Feuer!'), (u"ff'Ul'1\u20acf'\u20acl'1", u'fr\xfcheren'), (u'Ffiegen', u'Fliegen'), (u'ffihft', u'f\xfchlt'), (u'ffihren', u'f\xfchren'), (u'ffinf', u'f\xfcnf'), (u'ffir', u'f\xfcr'), (u'ffirchte', u'f\xfcrchte'), (u'ffirs', u'f\xfcrs'), (u'ffittere', u'f\xfcttere'), (u'FI6he', u'Fl\xf6he'), (u'Fiasenm\xe9iher', u'Rasenm\xe4her'), (u'fibel', u'\xfcbel'), (u'fiber', u'\xfcber'), (u'fiberdressierter', u'\xfcberdressierter'), (u'fibergezogen', u'\xfcbergezogen'), (u'fiberhaupt', u'\xfcberhaupt'), (u'fiberholt', u'\xfcberholt'), (u'fiberlegt', u'\xfcberlegt'), (u'fibernachtet', u'\xfcbernachtet'), (u'fiberspannt', u'\xfcberspannt'), (u'fibertreiben', u'\xfcbertreiben'), (u'fiberzfichtete', u'\xfcberz\xfcchtete'), (u'fibrig', u'\xfcbrig'), (u'Fieferenz', u'Referenz'), (u'Fieifi', u'Rei\xdf'), (u'fiffentlichkeit', u'\xd6ffentlichkeit'), (u'fiffnen', u'\xf6ffnen'), (u'fiffnest', u'\xf6ffnest'), (u'fifter', u'\xf6fter'), (u'Fihigkeit', u'F\xe4higkeit'), (u'fihneln', u'\xe4hneln'), (u'Fihrt', u'F\xe4hrt'), (u'fiihl', u'f\xfchl'), (u'fiihle', u'f\xfchle'), (u'fiihlen', u'f\xfchlen'), (u'fiihlst', u'f\xfchlst'), (u'fiihlt', u'f\xfchlt'), (u'Fiihlte', u'F\xfchlte'), (u'Fiihre', u'F\xfchre'), (u'Fiihren', u'F\xfchren'), (u'Fiihrerin', u'F\xfchrerin'), (u'Fiihrerschein', u'F\xfchrerschein'), (u'fiihrfe', u'f\xfchrte'), (u'fiihrt', u'f\xfchrt'), (u'fiihrte', u'f\xfchrte'), (u'Fiihrungsf\xe9ihigkeiten', u'F\xfchrungsf\xe4higkeiten'), (u'Fiihrungsprogramm', u'F\xfchrungsprogramm'), (u'Fiihrungsstil', u'F\xfchrungsstil'), (u'Fiilcksicht', u'R\xfccksicht'), (u'fiillen', u'f\xfcllen'), (u'fiinden', u'f\xe4nden'), (u'fiinf', u'f\xfcnf'), (u'fiinfhundert', u'f\xfcnfhundert'), (u'fiinfzehn', u'f\xfcnfzehn'), (u'fiir', u'f\xfcr'), (u'fiirchte', u'f\xfcrchte'), (u'fiirchten', u'f\xfcrchten'), (u'fiirchterlich', u'f\xfcrchterlich'), (u'fiirchterlichl', u'f\xfcrchterlich!'), (u'fiirchterllches', u'f\xfcrchterliches'), (u'fiirchtet', u'f\xfcrchtet'), (u'fiirchteten', u'f\xfcrchteten'), (u'fiirjeden', u'f\xfcr jeden'), (u'Fiirmchen', u'F\xf6rmchen'), (u'fiirs', u'f\xfcrs'), (u'Fijgen', u'F\xfcgen'), (u'fijhl', u'f\xfchl'), (u'fijhle', u'f\xfchle'), (u'fijhlen', u'f\xfchlen'), (u'fijhlst', u'f\xfchlst'), (u'fijhlt', u'f\xfchlt'), (u'fijhren', u'f\xfchren'), (u'Fijhrer', u'F\xfchrer'), (u'fijhrt', u'f\xfchrt'), (u'Fijhrungsqualit\xe9iten', u'F\xfchrungsqualit\xe4ten'), (u'FiJl3en', u'F\xfc\xdfen'), (u'Fijlie', u'F\xfc\xdfe'), (u'fijlr', u'f\xfcr'), (u'Fijnf', u'F\xfcnf'), (u'Fijnfziger', u'F\xfcnfziger'), (u'fijr', u'f\xfcr'), (u'fijrchte', u'f\xfcrchte'), (u'fijrchten', u'f\xfcrchten'), (u'Fijrjedenl', u'F\xfcr jeden!'), (u'fijrs', u'f\xfcrs'), (u'fiJrVorteile', u'f\xfcr Vorteile'), (u'fijttern', u'f\xfcttern'), (u'fijur', u'f\xfcr'), (u'filhl', u'f\xfchl'), (u'filhle', u'f\xfchle'), (u'filhlen', u'f\xfchlen'), (u'filhlte', u'f\xfchlte'), (u'filhre', u'f\xfchre'), (u'filhren', u'f\xfchren'), (u'Filhrern', u'F\xfchrern'), (u'Filhrerschein', u'F\xfchrerschein'), (u'filhrst', u'f\xfchrst'), (u'filhrt', u'f\xfchrt'), (u'filhrte', u'f\xfchrte'), (u'filhrten', u'f\xfchrten'), (u'Filhrung', u'F\xfchrung'), (u'Fillle', u'F\xfclle'), (u'Filll\xe9en', u'F\xfc\xdfen'), (u'Filmemachen', u'Filme machen'), (u'Filml', u'Film!'), (u'filnf', u'f\xfcnf'), (u'Filn\ufb02', u'F\xfcnf!'), (u'Filr', u'F\xfcr'), (u"filr'ne", u"f\xfcr'ne"), (u'filrchten', u'f\xfcrchten'), (u'filrchterlich', u'f\xfcrchterlich'), (u'filrs', u'f\xfcrs'), (u'filter', u'\xe4lter'), (u'findem', u'\xe4ndern'), (u'findenlassen', u'finden lassen'), (u'Fingerabdrijcke', u'Fingerabdr\xfccke'), (u'Fingerabdrilcke', u'Fingerabdr\xfccke'), (u'Fingerniigeln', u'Fingern\xe4geln'), (u'Fingern\xe9gel', u'Fingern\xe4gel'), (u'Fingern\xe9geln', u'Fingern\xe4geln'), (u'fingstlich', u'\xe4ngstlich'), (u'Fiothaarige', u'Rothaarige'), (u'Firmen\xe9rzte', u'Firmen\xe4rzte'), (u'Fischk\xe9pfe', u'Fischk\xf6pfe'), (u'FIUssigkeitsgleichgewicht', u'Fl\xfcssigkeitsgleichgewicht'), (u'Fiusten', u'F\xe4usten'), (u'FIynn', u'Flynn'), (u'fjffnen', u'\xf6ffnen'), (u"fL'1'r", u'f\xfcr'), (u"fL'1hle", u'f\xfchle'), (u"FL'1r", u'F\xfcr'), (u"fL'ir", u'f\xfcr'), (u"fL'lr", u'f\xfcr'), (u'fL1r', u'f\xfcr'), (u'Fl6he', u'Fl\xf6he'), (u'Flclse', u'Rose'), (u'fleifkige', u'flei\xdfige'), (u'fleifkiges', u'flei\xdfiges'), (u'fleil3ig', u'flei\xdfig'), (u'Fleischb\xe9llchen', u'Fleischb\xe4llchen'), (u"Fleischkl6l'Sen", u'Fleischkl\xf6\xdfen'), (u'Flfige', u'Fl\xfcge'), (u'Flfigell', u'Fl\xfcgel!'), (u'flfistert', u'fl\xfcstert'), (u'Flhigkeiten', u'F\xe4higkeiten'), (u'Flhnrich', u'F\xe4hnrich'), (u'Flhnriche', u'F\xe4hnriche'), (u'flieBen', u'flie\xdfen'), (u'Fliefiband', u'Flie\xdfband'), (u'Fliefiheck', u'Flie\xdfheck'), (u'Flieflsb\xe9nder', u'Flie\xdfb\xe4nder'), (u'flielit', u'flie\xdft'), (u'flielSt', u'flie\xdft'), (u'FLif$e', u'F\xfc\xdfe'), (u'fLihlt', u'f\xfchlt'), (u'fliichtige', u'fl\xfcchtige'), (u'Fliigel', u'Fl\xfcgel'), (u'flijchtig', u'fl\xfcchtig'), (u'Flijgel', u'Fl\xfcgel'), (u'Flijgelfedernl', u'Fl\xfcgelfedern!'), (u'Flilssige', u'Fl\xfcssige'), (u'flilstert', u'fl\xfcstert'), (u'fLir', u'f\xfcr'), (u'fljhrt', u'f\xfchrt'), (u'Fljr', u'F\xfcr'), (u"flJr'n", u"f\xfcr'n"), (u'fllihrst', u'f\xfchrst'), (u'Fllihrt', u'F\xfchrt'), (u'fllinf', u'f\xfcnf'), (u'fllinften', u'f\xfcnften'), (u'Fllinkchen', u'F\xfcnkchen'), (u'Fllir', u'F\xfcr'), (u'fllirchte', u'f\xfcrchte'), (u'fllirchten', u'f\xfcrchten'), (u'fllirchterlichen', u'f\xfcrchterlichen'), (u'fllirchtet', u'f\xfcrchtet'), (u'Fllirsten', u'F\xfcrsten'), (u'Fllitterungszeitenl', u'F\xfctterungszeiten!'), (u'flllgte', u'f\xfcgte'), (u'flllgten', u'f\xfcgten'), (u'flllhrten', u'fl\xfchrten'), (u'Flllhrung', u'F\xfchrung'), (u'Fllligel', u'Fl\xfcgel'), (u'flllistern', u'fl\xfcstern'), (u'fllllstert', u'fl\xfcstert'), (u'flllrchte', u'f\xfcrchte'), (u'flllrchten', u'f\xfcrchten'), (u'flllrjede', u'f\xfcr jede'), (u'Flohtransporterl', u'Flohtransporter!'), (u'Floli', u'Flo\xdf'), (u'Flottenalzt', u'Flottenarzt'), (u'Flottenstiitzpunkt', u'Flottenst\xfctzpunkt'), (u'Flottenstutzpunkt', u'Flottenst\xfctzpunkt'), (u'Flrma', u'Firma'), (u'fltlsterte', u'fl\xfcsterte'), (u'Fluchtig', u'Fl\xfcchtig'), (u'Flughdhe', u'Flugh\xf6he'), (u'Flughiihe', u'Flugh\xf6he'), (u'Flugh\xe9ifen', u'Flugh\xe4fen'), (u'Flugunf\xe9ihig', u'Flugunf\xe4hig'), (u'flugunf\xe9ihigen', u'flugunf\xe4higen'), (u'Flugunf\xe9ihigl', u'Flugunf\xe4hig!'), (u'Flugzeugl', u'Flugzeug!'), (u'FLUSSIGER', u'FL\xdcSSIGER'), (u'Flustereffekt', u'Fl\xfcstereffekt'), (u'Flustern', u'Fl\xfcstern'), (u'FLUSTERT', u'FL\xdcSTERT'), (u'fl\ufb02stern', u'fl\xfcstern'), (u'fl\ufb02sterten', u'fl\xfcsterten'), (u'Folgendesz', u'Folgendes:'), (u'fortgespiilt', u'fortgesp\xfclt'), (u'fortspiilen', u'fortsp\xfclen'), (u'fortw\xe9hrend', u'fortw\xe4hrend'), (u'Fr/ed/10/', u'Friedhof'), (u'Fr5ulein', u'Fr\xe4ulein'), (u'Fr6hliche', u'Fr\xf6hliche'), (u'Frachfmodule', u'Frachtmodule'), (u'Frafi', u'Fra\xdf'), (u'fragfe', u'fragte'), (u"Fral'S", u'Fra\xdf'), (u'fralken', u'fra\xdfen'), (u'Franzfisisch', u'Franz\xf6sisch'), (u'Franziisin', u'Franz\xf6sin'), (u'franziisische', u'franz\xf6sische'), (u'franziisischen', u'franz\xf6sischen'), (u'franziisischer', u'franz\xf6sischer'), (u'franziisisches', u'franz\xf6sisches'), (u'Franz\xe9sisch', u'Franz\xf6sisch'), (u'franz\xe9sische', u'franz\xf6sische'), (u'franz\xe9sischen', u'franz\xf6sischen'), (u'franz\xe9sischer', u'franz\xf6sischer'), (u'Franz\xe9sisches', u'Franz\xf6sisches'), (u'FRAULEIN', u'FR\xc4ULEIN'), (u'fre/em', u'freiem'), (u'freffen', u'treffen'), (u'freilieB', u'freilie\xdf'), (u'freimiitigen', u'freim\xfctigen'), (u'Fressger\xe9usche', u'Fressger\xe4usche'), (u'Frfichtekuchen', u'Fr\xfcchtekuchen'), (u'frfih', u'fr\xfch'), (u'frfiher', u'fr\xfcher'), (u'Friedh\xe9fe', u'Friedh\xf6fe'), (u'Friichtchen', u'Fr\xfcchtchen'), (u'friih', u'fr\xfch'), (u'friihen', u'fr\xfchen'), (u'friiher', u'fr\xfcher'), (u'friihere', u'fr\xfchere'), (u'friihliche', u'fr\xf6hliche'), (u'friihlichen', u'fr\xf6hlichen'), (u'Friihstiick', u'Fr\xfchst\xfcck'), (u'friilher', u'fr\xfcher'), (u'friilhesten', u'fr\xfchesten'), (u'Frijchte', u'Fr\xfcchte'), (u'frijh', u'fr\xfch'), (u'frijher', u'fr\xfcher'), (u'frijherer', u'fri\xfcherer'), (u'frilh', u'fr\xfch'), (u'frilhen', u'fr\xfchen'), (u'Frilher', u'Fr\xfcher'), (u'frilhere', u'fr\xfchere'), (u'Frilhst\ufb02ck', u'Fr\xfchst\xfcck'), (u'Fris6r', u'Fris\xf6r'), (u"frL'lher", u'fr\xfcher'), (u'Frljihling', u'Fr\xfchling'), (u'Frllichte', u'Fr\xfcchte'), (u'frllih', u'fr\xfch'), (u'frlliher', u'fr\xfcher'), (u'Frllihstiickskiiche', u'Fr\xfchst\xfccksk\xfcche'), (u'fro/1', u'froh'), (u'FROHLICHE', u'FR\xd6HLICHE'), (u'frtih', u'fr\xfch'), (u'Frtiher', u'Fr\xfcher'), (u'Frtihliche', u'Fr\xf6hliche'), (u'Frtihstticksei', u'Fr\xfchst\xfccksei'), (u'Frtlh', u'Fr\xfch'), (u'FrUh', u'Fr\xfch'), (u'FRUHE', u'FR\xdcHE'), (u'fruhe', u'fr\xfche'), (u'fruhen', u'fr\xfchen'), (u'Fruher', u'Fr\xfcher'), (u'fruheren', u'fr\xfcheren'), (u'Fruhling', u'Fr\xfchling'), (u'Fruhlingsrolle', u'Fr\xfchlingsrolle'), (u'FrUhstUck', u'Fr\xfchstuck'), (u'Fruhstuck', u'Fr\xfchst\xfcck'), (u'frUhstUcken', u'fr\xfchst\xfccken'), (u'fr\xe9hliches', u'fr\xf6hliches'), (u'fr\xe9ihfiches', u'fr\xf6hliches'), (u'fr\xe9ihlich', u'fr\xf6hlich'), (u'Fr\xe9iulein', u'Fr\xe4ulein'), (u'fr\xe9nen', u'fr\xf6nen'), (u'Fr\xe9sche', u'Fr\xf6sche'), (u'Fr\xe9ulein', u'Fr\xe4ulein'), (u'ftihlen', u'f\xfchlen'), (u'Ftillhorn', u'F\xfcllhorn'), (u'Ftir', u'F\xfcr'), (u'Ftirs', u'F\xfcrs'), (u'Ftlhrung', u'F\xfchrung'), (u'ftlrchte', u'f\xfcrchte'), (u'ftmf', u'f\xfcnf'), (u'Fu/3', u'Fu\xdf'), (u'FuB', u'Fu\xdf'), (u'FuBballspieler', u'Fu\xdfballspieler'), (u'FUBen', u'F\xfc\xdfen'), (u'Fuf$', u'Fu\xdf'), (u'Fufi', u'Fu\xdf'), (u'Fufiabdrucke', u'Fu\xdfabdr\xfccke'), (u'Fufiballtraining', u'Fu\xdfballtraining'), (u'FufL', u'Fu\xdf'), (u'Fuflsball', u'Fu\xdfball'), (u'Fuflsballszene', u'Fu\xdfballszene'), (u"fUhl't", u'f\xfchrt'), (u'fuhle', u'f\xfchle'), (u'fuhlst', u'f\xfchlst'), (u'fUhlt', u'f\xfchlt'), (u'fUhre', u'f\xfchre'), (u'fUhrt', u'f\xfchrt'), (u'fuhrte', u'f\xfchrte'), (u'fuhrten', u'f\xfchrten'), (u'Fuhrung', u'F\xfchrung'), (u'Fuhrungsf\xe9higkeiten', u'F\xfchrungsf\xe4higkeiten'), (u'Fuhrungsoffizier', u'F\xfchrungsoffizier'), (u'Fuhrungsqualit\xe9t', u'F\xfchrungsqualit\xe4t'), (u'FUI3en', u'F\xfc\xdfen'), (u'Fuli', u'Fu\xdf'), (u'Fuliball', u'Fu\xdfball'), (u'Fulisohlen', u'Fu\xdfsohlen'), (u'FUller', u'F\xfcller'), (u'fUllten', u'f\xfcllten'), (u'fumt', u'f\xfchlt'), (u'Fundbiiro', u'Fundb\xfcro'), (u'FUnf', u'F\xfcnf'), (u'Funftbeste', u'F\xfcnftbeste'), (u'Funkchen', u'F\xfcnkchen'), (u'Funkger\xe9it', u'Funkger\xe4t'), (u'Funkger\xe9ite', u'Funkger\xe4te'), (u'Funkger\xe9t', u'Funkger\xe4t'), (u'funktionstilchtig', u'funktionst\xfcchtig'), (u'FUR', u'F\xdcR'), (u'Fur', u'F\xfcr'), (u"fUrAusweichmanc'\xa7ver", u'f\xfcr Ausweichman\xf6ver'), (u'furchteinfl6Bend', u'furchteinfl\xf6\xdfend'), (u'furchteinfl6Bende', u'furchteinfl\xf6\xdfende'), (u'furchten', u'f\xfcrchten'), (u'Furchtest', u'F\xfcrchtest'), (u'furchtet', u'f\xfcrchtet'), (u'furchteten', u'f\xfcrchteten'), (u'fureinander', u'f\xfcreinander'), (u'furjeden', u'f\xfcr jeden'), (u'furjemanden', u'f\xfcr jemanden'), (u'furjudische', u'fur j\xfcdische'), (u'furs', u'f\xfcrs'), (u'FUrWalter', u'F\xfcr Walter'), (u'fut', u'tut'), (u'Fu\ufb02ballspiel', u'Fu\xdfballspiel'), (u'F\xa7hnlein', u'F\xe4hnlein'), (u'f\xe9//t', u'f\xe4llt'), (u'f\xe9hig', u'f\xe4hig'), (u'F\xe9higkeit', u'F\xe4higkeit'), (u'F\xe9higkeiten', u'F\xe4higkeiten'), (u'f\xe9hnen', u'f\xf6hnen'), (u'F\xe9hnens', u'F\xf6hnens'), (u'F\xe9hnerei', u'F\xf6hnerei'), (u'F\xe9hnleinmiitter', u'F\xe4hnleinm\xfctter'), (u'F\xe9hre', u'F\xe4hre'), (u'f\xe9hrst', u'f\xe4hrst'), (u'f\xe9hrt', u'f\xe4hrt'), (u'F\xe9ihigkeit', u'F\xe4higkeit'), (u'F\xe9ihigkeiten', u'F\xe4higkeiten'), (u'f\xe9ihrt', u'f\xe4hrt'), (u'f\xe9illst', u'f\xe4llst'), (u'f\xe9illt', u'f\xe4llt'), (u'F\xe9ilschung', u'F\xe4lschung'), (u'F\xe9ingt', u'F\xe4ngt'), (u'f\xe9ir', u'f\xfcr'), (u'F\xe9lle', u'F\xe4lle'), (u'F\xe9llen', u'F\xe4llen'), (u'f\xe9lligl', u'f\xe4llig'), (u'F\xe9llt', u'F\xe4llt'), (u"f\xe9llt's", u"f\xe4llt's"), (u'F\xe9lschen', u'F\xe4lschen'), (u'F\xe9lschung', u'F\xe4lschung'), (u'f\xe9nde', u'f\xe4nde'), (u'F\xe9ngst', u'F\xe4ngst'), (u'F\xe9ngt', u'F\xe4ngt'), (u'f\xe9rben', u'f\xe4rben'), (u'f\xe9rbt', u'f\xe4rbt'), (u'f\xe9rdern', u'f\xf6rdern'), (u'f\xe9rmlich', u'f\xf6rmlich'), (u'F\xe9ustlinge', u'F\xe4ustlinge'), (u"f\xfcr'ne", u"f\xfcr 'ne"), (u'f\xfcrchlerlichen', u'f\xfcrchterlichen'), (u'f\xfcrjede', u'f\xfcr jede'), (u'f\xfcrjeden', u'f\xfcr jeden'), (u'F\ufb02hrungsprogramm', u'F\xfchrungsprogramm'), (u'F\ufb02hrungsstil', u'F\xfchrungsstil'), (u'f\ufb02llen', u'f\xfcllen'), (u'f\ufb02llt', u'f\xe4llt'), (u'f\ufb02nf', u'f\xfcnf'), (u'F\ufb02r', u'F\xfcr'), (u'f\ufb02rchte', u'f\xfcrchte'), (u'f\ufb02rjeden', u'f\xfcr jeden'), (u'g/bf', u'gibt'), (u'g/bsf', u'gibst'), (u'G5ste', u'G\xe4ste'), (u'G6nn', u'G\xf6nn'), (u"G6t'lllche", u'G\xf6ttliche'), (u'G6tter', u'G\xf6tter'), (u'G6ttern', u'G\xf6ttern'), (u'Gamilonl', u'Gamilon!'), (u'ganzlich', u'g\xe4nzlich'), (u'gardel', u'garde!'), (u'Gasbrfiter', u'Gasbr\xe4ter'), (u'gauze', u'ganze'), (u'GCJKTEN', u'G\xd6KTEN'), (u'ge6lt', u'ge\xf6lt'), (u'gebauf', u'gebaut'), (u'Gebiez', u'Gebiet'), (u'Gebi\xe9ude', u'Geb\xe4ude'), (u'gebliebenl', u'geblieben!'), (u'GEBRAUCHTWAGENIPOLIZEIITAXI', u'GEBRAUCHTWAGEN/POLIZEI/TAXI'), (u'Gebr\xe9u', u'Gebr\xe4u'), (u'gebs', u"geb's"), (u'gebuhrend', u'geb\xfchrend'), (u'Geb\xe9ick', u'Geb\xe4ck'), (u'Geb\xe9iude', u'Geb\xe4ude'), (u'geb\xe9rdet', u'geb\xe4rdet'), (u'Geb\xe9rmutter', u'Geb\xe4rmutter'), (u'Geb\xe9rmutterhals', u'Geb\xe4rmutterhals'), (u'Geb\xe9ude', u'Geb\xe4ude'), (u'Geb\xe9udedach', u'Geb\xe4udedach'), (u'Geb\xe9uden', u'Geb\xe4uden'), (u'Geb\xe9udes', u'Geb\xe4udes'), (u'gedemiitigt', u'gedem\xfctigt'), (u'gedemijtigt', u'gedem\xfctigt'), (u'gedemllitigt', u'gedem\xfctigt'), (u'gedrtickt', u'gedr\xfcckt'), (u'gedr\xe9ngt', u'gedr\xe4ngt'), (u'Ged\xe9chtnisverlustes', u'Ged\xe4chtnisverlustes'), (u'Ged\xe9ichtnis', u'Ged\xe4chtnis'), (u'ged\xe9mpft', u'ged\xe4mpft'), (u"gef'a'hrlich", u'gef\xe4hrlich'), (u"gef'a'llt", u'gef\xe4llt'), (u'gef5IIt', u'gef\xe4llt'), (u'gefahrdet', u'gef\xe4hrdet'), (u'gefahrlich', u'gef\xe4hrlich'), (u'gefallsllichtige', u'gefalls\xfcchtige'), (u'GEFANGNISTECHNOLOGIE', u'GEF\xc4NGNISTECHNOLOGIE'), (u'Gefechtsausrustung', u'Gefechtsausr\xfcstung'), (u'Geffihl', u'Gef\xfchl'), (u'geffihrt', u'gef\xfchrt'), (u'geffillt', u'gef\xe4llt'), (u'Gefihrliche', u'Gef\xe4rliche'), (u'Gefiihl', u'Gef\xfchl'), (u'Gefiihle', u'Gef\xfchle'), (u'Gefiihlen', u'Gef\xfchlen'), (u'Gefiihlslebens', u'Gef\xfchlslebens'), (u'gefiihlsmiliigen', u'gef\xfchlsm\xe4\xdfigen'), (u'gefiihrt', u'gef\xfchrt'), (u'gefiillst', u'gef\xe4llst'), (u'gefiillt', u'gef\xfcllt'), (u'gefiirchtet', u'gef\xfcrchtet'), (u'Gefijhl', u'Gef\xfchl'), (u'Gefijhle', u'Gef\xfchle'), (u'gefijhlt', u'gef\xfchlt'), (u'gefijllte', u'gef\xfcllte'), (u'Gefilhl', u'Gef\xfchl'), (u'Gefilhle', u'Gef\xfchle'), (u'gefillt', u'gef\xe4llt'), (u'Gefingnis', u'Gef\xe4ngnis'), (u"gefL'lllten", u'gef\xfcllten'), (u'Geflilster', u'Gefl\xfcster'), (u'gefllihllos', u'gef\xfchllos'), (u'Geflllhlsduselige', u'Gef\xfchlsduselige'), (u'GEFLUSTERT', u'GEFL\xdcSTERT'), (u'Geftuhle', u'Gef\xfchle'), (u'Gefuhl', u'Gef\xfchl'), (u'Gefuhle', u'Gef\xfchle'), (u'Gefuhlen', u'Gef\xfchlen'), (u'gefuhlt', u'gef\xfchlt'), (u'gefuhlvolle', u'gef\xfchlvolle'), (u'gefurchtet', u'gef\xfcrchtet'), (u'Gef\xe9hrde', u'Gef\xe4hrde'), (u'gef\xe9hrden', u'gef\xe4hrden'), (u'gef\xe9hrdet', u'gef\xe4hrdet'), (u'Gef\xe9hrdung', u'Gef\xe4hrdung'), (u'gef\xe9hrlich', u'gef\xe4hrlich'), (u'gef\xe9hrliche', u'gef\xe4hrliche'), (u'gef\xe9hrlicher', u'gef\xe4hrlicher'), (u'gef\xe9hrlicheren', u'gef\xe4hrlicheren'), (u'Gef\xe9hrliches', u'Gef\xe4hrliches'), (u'Gef\xe9hrt', u'Gef\xe4hrt'), (u'gef\xe9ihrden', u'gef\xe4hrden'), (u'gef\xe9ihrdet', u'gef\xe4hrdet'), (u'gef\xe9ihrlich', u'gef\xe4hrlich'), (u'Gef\xe9ihrte', u'Gef\xe4hrte'), (u'Gef\xe9ihrten', u'Gef\xe4hrten'), (u'gef\xe9illt', u'gef\xe4llt'), (u"Gef\xe9illt's", u"Gef\xe4llt's"), (u'gef\xe9llf', u'gef\xe4llt'), (u'gef\xe9llfs', u"gef\xe4llt's"), (u'gef\xe9llig', u'gef\xe4llig'), (u'gef\xe9lligst', u'gef\xe4lligst'), (u'gef\xe9llst', u'gef\xe4llst'), (u'Gef\xe9llt', u'Gef\xe4llt'), (u"Gef\xe9llt's", u"Gef\xe4llt's"), (u'gef\xe9lscht', u'gef\xe4lscht'), (u'Gef\xe9ngnis', u'Gef\xe4ngnis'), (u'Gef\xe9ngnisregeln', u'Gef\xe4ngnisregeln'), (u'Gef\xe9ngnisse', u'Gef\xe4ngnisse'), (u'Gef\xe9ngnissen', u'Gef\xe4ngnissen'), (u'Gef\xe9ngnisses', u'Gef\xe4ngnisses'), (u'Gef\xe9ngniswagen', u'Gef\xe4ngniswagen'), (u'gef\ufb02gig', u'gef\xfcgig'), (u'gegenfiber', u'gegen\xfcber'), (u'gegeniiber', u'gegen\xfcber'), (u'gegeniibertritt', u'gegen\xfcbertritt'), (u'gegeniiberzusfehen', u'gegen\xfcberzustehen'), (u'gegenijber', u'gegen\xfcber'), (u'gegenlliber', u'gegen\xfcber'), (u'gegenlliberstehen', u'gegen\xfcberstehen'), (u'Gegenstrfimung', u'Gegenstr\xf6mung'), (u'Gegenstr\xe9mung', u'Gegenstr\xf6mung'), (u'Gegensttlck', u'Gegenst\xfcck'), (u'Gegenst\xe9nde', u'Gegenst\xe4nde'), (u'gegenuber', u'gegen\xfcber'), (u'Gegenverschwiirung', u'Gegenverschw\xf6rung'), (u'gegenw\xe9rtigen', u'gegenw\xe4rtigen'), (u'gegriindet', u'gegr\xfcndet'), (u'gegrijfit', u'gegr\xfc\xdft'), (u'gegrilfit', u'gegr\xfc\xdft'), (u'GegrUl3t', u'Gegr\xfc\xdft'), (u'gegrundet', u'gegr\xfcndet'), (u'geh6ren', u'geh\xf6ren'), (u'geh6rt', u'geh\xf6rt'), (u'gehdrt', u'geh\xf6rt'), (u'GeheilS', u'Gehei\xdf'), (u'geheilSen', u'gehei\xdfen'), (u'gehejetzt', u'gehe jetzt'), (u'gehf', u'geht'), (u'gehfiirt', u'geh\xf6rt'), (u'gehfire', u'geh\xf6re'), (u'gehfiren', u'geh\xf6ren'), (u'gehfirt', u'geh\xf6rt'), (u'gehiipft', u'geh\xfcpft'), (u'Gehiir', u'Geh\xf6r'), (u'gehiire', u'geh\xf6re'), (u'gehiiren', u'geh\xf6ren'), (u'gehiirst', u'geh\xf6rst'), (u'gehiirt', u'geh\xf6rt'), (u'Gehim', u'Gehirn'), (u'Gehirnsch\xe9den', u'Gehirnsch\xe4den'), (u'gehlngt', u'geh\xe4ngt'), (u'gehore', u'geh\xf6re'), (u'gehoren', u'geh\xf6ren'), (u'gehort', u'geh\xf6rt'), (u"geht'sl", u"geht's!"), (u'Gehtirt', u'Geh\xf6rt'), (u'gehtjetzt', u'geht jetzt'), (u'geh\xe9irt', u'geh\xf6rt'), (u'Geh\xe9iuteten', u'Geh\xe4uteten'), (u'geh\xe9r', u'geh\xf6r'), (u'geh\xe9re', u'geh\xf6re'), (u'geh\xe9ren', u'geh\xf6ren'), (u'geh\xe9rst', u'geh\xf6rst'), (u'Geh\xe9rt', u'Geh\xf6rt'), (u'geh\xe9rten', u'geh\xf6rten'), (u'geh\xe9rtf', u'geh\xf6rt!'), (u'geiiffnet', u'ge\xf6ffnet'), (u'geilbt', u'ge\xfcbt'), (u'geistesgestort', u'geistesgest\xf6rt'), (u'Gei\ufb02blatt', u'Gei\xdfblatt'), (u'Gei\ufb02blattstaude', u'Gei\xdfblattstaude'), (u'gekiisst', u'gek\xfcsst'), (u'gekiisstl', u'gek\xfcsst!'), (u'gekijndigt', u'gek\xfcndigt'), (u'gekijsst', u'gek\xfcsst'), (u'gekilsst', u'gek\xfcsst'), (u'gekimpfl', u'gek\xe4mpft'), (u'gekimpft', u'gek\xe4mpft'), (u'geklautl', u'geklaut!'), (u'gekliirt', u'gekl\xe4rt'), (u'gekllrt', u'gekl\xe4rt'), (u'gekl\xe9rt', u'gekl\xe4rt'), (u'gekriint', u'gekr\xf6nt'), (u'gekrijmmt', u'gekr\xfcmmt'), (u'GEKUHLTER', u'GEK\xdcHLTER'), (u'gekurzt', u'gek\xfcrzt'), (u'gek\xe9mpft', u'gek\xe4mpft'), (u'gelaufenl', u'gelaufen!'), (u'gelegf', u'gelegt'), (u'gelegtwurde', u'gelegt wurde'), (u'geliist', u'gel\xf6st'), (u'gelilftet', u'gel\xfcftet'), (u'gelndert', u'ge\xe4ndert'), (u'Gelst', u'Geist'), (u'Geltungsbedurfnis', u'Geltungsbed\xfcrfnis'), (u'GELUBDE', u'GEL\xdcBDE'), (u'Gel\xe9chter', u'Gel\xe4chter'), (u'gel\xe9hmt', u'gel\xe4hmt'), (u'gel\xe9ischt', u'gel\xf6scht'), (u'Gel\xe9nde', u'Gel\xe4nde'), (u'gel\xe9nge', u'gel\xe4nge'), (u'gel\xe9st', u'gel\xf6st'), (u'gem', u'gern'), (u'gemafiregelt', u'gema\xdfregelt'), (u'Geme', u'Gerne'), (u'gemfitliches', u'gem\xfctliches'), (u'Gemiise', u'Gem\xfcse'), (u'gemiitlich', u'gem\xfctlich'), (u'Gemijlse', u'Gem\xfcse'), (u'Gemilt', u'Gem\xfct'), (u'gemiltlicher', u'gem\xfctlicher'), (u'GemLise', u'Gem\xfcse'), (u'Gemut', u'Gem\xfct'), (u'gem\xe9fi', u'gem\xe4\xdf'), (u'Gem\xe9fk', u'Gem\xe4\xdf'), (u'gem\xe9ht', u'gem\xe4ht'), (u'Gem\xe9ili', u'Gem\xe4\xdf'), (u'Gem\xe9lde', u'Gem\xe4lde'), (u'Gem\xe9lden', u'Gem\xe4lden'), (u'Genaul', u'Genau!'), (u'genieBt', u'genie\xdft'), (u'genief$en', u'genie\xdfen'), (u'Geniefien', u'Genie\xdfen'), (u'geniefk', u'genie\xdf'), (u'genielien', u'genie\xdfen'), (u'genielken', u'genie\xdfen'), (u'genie\ufb02en', u'genie\xdfen'), (u'genligen', u'gen\xfcgen'), (u'genlligend', u'gen\xfcgend'), (u'genlligt', u'gen\xfcgt'), (u'genlllgend', u'gen\xfcgend'), (u'genugt', u'gen\xfcgt'), (u'genugte', u'gen\xfcgte'), (u'georfef', u'geortet'), (u'gepfluckt', u'gepfl\xfcckt'), (u'gepriifter', u'gepr\xfcfter'), (u'gepruft', u'gepr\xfcft'), (u'Gep\xe9ck', u'Gep\xe4ck'), (u'gerfit', u'ger\xe4t'), (u'Geriichte', u'Ger\xfcchte'), (u'Geriite', u'Ger\xe4te'), (u'Gerijcht', u'Ger\xfccht'), (u'Gerllicht', u'Ger\xfccht'), (u'gerllistet', u'ger\xfcstet'), (u'gernhaben', u'gern-haben'), (u'gernntgt', u'ger\xf6ntgt'), (u'ger\xe9it', u'ger\xe4t'), (u'Ger\xe9iusch', u'Ger\xe4usch'), (u'Ger\xe9t', u'Ger\xe4t'), (u'Ger\xe9te', u'Ger\xe4te'), (u'Ger\xe9tschaften', u'Ger\xe4tschaften'), (u'ger\xe9umt', u'ger\xe4umt'), (u'Ger\xe9usch', u'Ger\xe4usch'), (u'Ger\xe9usche', u'Ger\xe4usche'), (u'ger\xe9uschvoll', u'ger\xe4uschvoll'), (u'geschafff', u'geschafft'), (u'GESCHAFTSFUHRER', u'GESCH\xc4FTSF\xdcHRER'), (u'gescha\ufb02i', u'geschafft'), (u'Geschfift', u'Gesch\xe4ft'), (u'geschfimt', u'gesch\xe4mt'), (u'Geschift', u'Gesch\xe4ft'), (u'Geschifte', u'Gesch\xe4fte'), (u'Geschiftsleute', u'Gesch\xe4ftsleute'), (u'Geschiftswelt', u'Gesch\xe4ftswelt'), (u'geschiidigt', u'gesch\xe4digt'), (u'Geschiift', u'Gesch\xe4ft'), (u'Geschiiftsleben', u'Gesch\xe4ftsleben'), (u'geschijtzten', u'gesch\xfctzten'), (u'Geschiltz', u'Gesch\xfctz'), (u'Geschiltze', u'Gesch\xfctze'), (u'Geschiltzrohre', u'Gesch\xfctzrohre'), (u'Geschiltzturm', u'Gesch\xfctzturm'), (u'geschlijpftl', u'geschl\xfcpft!'), (u'Geschllitzstellungen', u'Gesch\xfctzstellungen'), (u'geschnfiffelt', u'geschn\xfcffelt'), (u'Geschtitz', u'Gesch\xfctz'), (u'Geschtltz', u'Gesch\xfctz'), (u'Geschutz', u'Gesch\xfctz'), (u'Geschutze', u'Gesch\xfctze'), (u'Geschwiir', u'Geschw\xfcr'), (u'Geschwllir', u'Geschw\xfcr'), (u'Geschwur', u'Geschw\xfcr'), (u'geschw\xe9cht', u'geschw\xe4cht'), (u'geschw\xe9ingert', u'geschw\xe4ngert'), (u'Geschw\xe9tz', u'Geschw\xe4tz'), (u'Gesch\xe9ft', u'Gesch\xe4ft'), (u'Gesch\xe9fte', u'Gesch\xe4fte'), (u'Gesch\xe9ftige', u'Gesch\xe4ftige'), (u'gesch\xe9ftlich', u'gesch\xe4ftlich'), (u'Gesch\xe9fts', u'Gesch\xe4fts'), (u'Gesch\xe9ftsleben', u'Gesch\xe4ftsleben'), (u'Gesch\xe9ift', u'Gesch\xe4ft'), (u'Gesch\xe9ifte', u'Gesch\xe4fte'), (u'gesch\xe9iftsm\xe9ifiig', u'gesch\xe4ftsm\xe4\xdfig'), (u'gesch\xe9itzt', u'gesch\xe4tzt'), (u'gesch\xe9nolet', u'gesch\xe4ndet'), (u'Gesch\ufb02tze', u'Gesch\xfctze'), (u'Gesetzeshiiter', u'Gesetzesh\xfcter'), (u'Gesichtl', u'Gesicht!'), (u'Gesichtsausdrijcke', u'Gesichtsausdr\xfccke'), (u'Gesiiff', u'Ges\xf6ff'), (u'gesiindigt', u'ges\xfcndigt'), (u'gespiirt', u'gesp\xfcrt'), (u'Gesprach', u'Gespr\xe4ch'), (u'GESPRACH', u'GESPR\xc4CH'), (u'GESPRACHE', u'GESPR\xc4CHE'), (u'Gespr\xe9ch', u'Gespr\xe4ch'), (u'Gespr\xe9che', u'Gespr\xe4che'), (u'Gespr\xe9iche', u'Gespr\xe4che'), (u'Gespr\xe9ichsthema', u'Gespr\xe4chsthema'), (u'Gespur', u'Gesp\xfcr'), (u'gestiirt', u'gest\xf6rt'), (u'gestijrzt', u'gest\xfcrzt'), (u'gestijtzte', u'gest\xfctzte'), (u'gestof$en', u'gesto\xdfen'), (u'gestolken', u'gesto\xdfen'), (u'Gestriipp', u'Gestr\xfcpp'), (u'Gestrijpp', u'Gestr\xfcpp'), (u'GESTURZT', u'GEST\xdcRZT'), (u'gest\xe9irt', u'gest\xf6rt'), (u'Gest\xe9ndnis', u'Gest\xe4ndnis'), (u'gest\xe9rt', u'gest\xf6rt'), (u'gest\ufb02rzt', u'gest\xfcrzt'), (u'Gesundheitsbehijrde', u'Gesundheitsbeh\xf6rde'), (u'Gesundheitsftlrsorge', u'Gesundheitsf\xfcrsorge'), (u'Ges\xe9fitaschel', u'Ges\xe4\xdftasche!'), (u'Ges\xe9iffstaschenl', u'Ges\xe4\xdftaschen!'), (u'get6tet', u'get\xf6tet'), (u'Getiise', u'Get\xf6se'), (u'getiitet', u'get\xf6tet'), (u"getr'a'umt", u'getr\xe4umt'), (u'getr\xe9umt', u'getr\xe4umt'), (u'get\xe9tet', u'get\xf6tet'), (u'get\xe9tetf', u'get\xf6tet!'), (u'get\xe9uscht', u'get\xe4uscht'), (u'gev\xe9gelt', u'gev\xf6gelt'), (u'gew6hnt', u'gew\xf6hnt'), (u'GEWACHSHAUS', u'GEW\xc4CHSHAUS'), (u'gewaltt\xe9tig', u'gewaltt\xe4tig'), (u'gewarnf', u'gewarnt'), (u'Gewerkschaftsfunktion\xe9ren', u'Gewerkschaftsfunktion\xe4ren'), (u'gewfinscht', u'gew\xfcnscht'), (u'Gewiasenskon\ufb02ikte', u'Gewissenskon\ufb02ikte'), (u'gewiihlt', u'gew\xe4hlt'), (u'gewiihnen', u'gew\xf6hnen'), (u'gewiihnlich', u'gew\xf6hnlich'), (u'gewiihnlicher', u'gew\xf6hnlicher'), (u'gewiihnliches', u'gew\xf6hnliches'), (u'gewiihnt', u'gew\xf6hnt'), (u'gewiinscht', u'gew\xfcnscht'), (u'gewijhnlichen', u'gew\xf6hnlichen'), (u'gewijnscht', u'gew\xfcnscht'), (u'gewissermafien', u'gewisserma\xdfen'), (u'gewissermallsen', u'gewisserma\xdfen'), (u'gewlllnscht', u'gew\xfcnscht'), (u'Gewohnheitstiter', u'Gewohnheitst\xe4ter'), (u'gewtinscht', u'gew\xfcnscht'), (u'gewunscht', u'gew\xfcnscht'), (u'gewunschten', u'gew\xfcnschten'), (u'Gew\xe9chshaus', u'Gew\xe4chshaus'), (u'gew\xe9hlt', u'gew\xe4hlt'), (u'gew\xe9hnen', u'gew\xf6hnen'), (u'gew\xe9hnlicher', u'gew\xf6hnlicher'), (u'gew\xe9hnst', u'gew\xf6hnst'), (u'gew\xe9hnt', u'gew\xf6hnt'), (u'Gew\xe9hren', u'Gew\xe4hren'), (u'gew\xe9hrt', u'gew\xe4hrt'), (u'Gew\xe9isser', u'Gew\xe4sser'), (u'Gew\xe9ssern', u'Gew\xe4ssern'), (u'gezfichtet', u'gez\xfcchtet'), (u'gezilndet', u'gez\xfcndet'), (u'gez\xe9hlt', u'gez\xe4hlt'), (u'gez\xe9ihlt', u'gez\xe4hlt'), (u'gez\xe9ihmt', u'gez\xe4hmt'), (u'ge\xe9ndert', u'ge\xe4ndert'), (u"GF6l'1Z6fUf", u'Grenze f\xfcr'), (u'Gfirtel', u'G\xfcrtel'), (u'Gfirtner', u'G\xe4rtner'), (u'Gfiste', u'G\xe4ste'), (u'Gfitter', u'G\xf6tter'), (u'Ghrchen', u'\xd6hrchen'), (u'gibtjede', u'gibt jede'), (u'gibtk', u"gibt's"), (u'gibts', u"gibt's"), (u'gieBen', u'gie\xdfen'), (u'GieBkanne', u'Gie\xdfkanne'), (u'gief$t', u'gie\xdft'), (u'giefit', u'gie\xdft'), (u'gielit', u'gie\xdft'), (u'gignalton', u'Signalton'), (u'giinstiger', u'g\xfcnstiger'), (u'Giire', u'G\xf6re'), (u'Giite', u'G\xfcte'), (u'giitiger', u'g\xfctiger'), (u'Giitter', u'G\xf6tter'), (u'Giittliche', u'G\xf6ttliche'), (u'giittlichen', u'g\xf6ttlichen'), (u'Gijte', u'G\xfcte'), (u'Gijtel', u'G\xfcte!'), (u'Gilrtel', u'G\xfcrtel'), (u'Gilte', u'G\xfcte'), (u'Giltiger', u'G\xfctiger'), (u'Gitarrenkl\xe9nge', u'Gitarrenkl\xe4nge'), (u'Gite', u'G\xfcte'), (u'GIUck', u'Gl\xfcck'), (u"GIUCKliCl'1", u'Gl\xfccklich'), (u"GL'lte", u'G\xfcte'), (u'Glaubwurdigkeit', u'Glaubw\xfcrdigkeit'), (u'Glaubwurdigkeitl', u'Glaubw\xfcrdigkeit!'), (u'glaubw\ufb02rdig', u'glaubw\xfcrdig'), (u'glb', u'gib'), (u'glbt', u'gibt'), (u'Gle/ch', u'Gleich'), (u'gleichgiiltig', u'gleichg\xfcltig'), (u'gleichm\xe9mig', u'gleichm\xe4\xdfig'), (u'Glfick', u'Gl\xfcck'), (u'glficklich', u'gl\xfccklich'), (u'Glfickspilz', u'Gl\xfcckspilz'), (u'Gliick', u'Gl\xfcck'), (u'Gliickchen', u'Gl\xf6ckchen'), (u'gliicklich', u'gl\xfccklich'), (u'gliicklicher', u'gl\xfccklicher'), (u'Gliicksbringer', u'Gl\xfccksbringer'), (u'Gliickssfr\xe9hne', u'Gl\xfccksstr\xe4hne'), (u'Gliickwunsch', u'Gl\xfcckwunsch'), (u'gliilcklich', u'gl\xfccklich'), (u'Glijck', u'Gl\xfcck'), (u'glijcklich', u'gl\xfccklich'), (u'Glilck', u'Gl\xfcck'), (u'glilcklich', u'gl\xfccklich'), (u'Glilckwunsch', u'Gl\xfcckwunsch'), (u'Glillck', u'Gl\xfcck'), (u'gllinstig', u'g\xfcnstig'), (u'gllinstigem', u'g\xfcnstigem'), (u'gllinstigen', u'g\xfcnstigen'), (u'glljcklich', u'gl\xfccklich'), (u'glllicklich', u'gl\xfccklich'), (u'glllickliche', u'gl\xfcckliche'), (u'Glllte', u'G\xfcte'), (u'Glorifiziertl', u'Glorifiziert!'), (u'glticklich', u'gl\xfccklich'), (u'Gltickszahlen', u'Gl\xfcckszahlen'), (u'gltlckliohes', u'gl\xfcckliches'), (u'Gluck', u'Gl\xfcck'), (u'glucklich', u'gl\xfccklich'), (u'gluckliche', u'gl\xfcckliche'), (u'GLUCKSELIGKEIT', u'GL\xdcCKSELIGKEIT'), (u'Gluckwunsch', u'Gl\xfcckwunsch'), (u'Gluok', u'Gl\xfcck'), (u'gluoklich', u'gl\xfccklich'), (u'Glupsch\xe9ugige', u'Glupsch\xe4ugige'), (u'glutheilie', u'gluthei\xdfe'), (u'gl\xe9inzende', u'gl\xe4nzende'), (u'gl\xe9nzende', u'gl\xe4nzende'), (u'gl\xe9nzte', u'gl\xe4nzte'), (u'Gl\xe9ser', u'Gl\xe4ser'), (u'gl\xe9ubige', u'gl\xe4ubige'), (u'Gl\xe9ubigen', u'Gl\xe4ubigen'), (u'Gl\ufb02ck', u'Gl\xfcck'), (u'Gl\ufb02cklich', u'Gl\xfccklich'), (u'Gl\ufb02ckstag', u'Gl\xfcckstag'), (u'Gl\ufb02ckwilnsche', u'Gl\xfcckw\xfcnsche'), (u'gnidig', u'gn\xe4dig'), (u'Gnllnden', u'Gr\xfcnden'), (u'gn\xe9dig', u'gn\xe4dig'), (u'gn\xe9dige', u'gn\xe4dige'), (u'gn\xe9digen', u'gn\xe4digen'), (u'Gn\xe9digste', u'Gn\xe4digste'), (u'gn\xe9idig', u'gn\xe4dig'), (u'Goff', u'Gott'), (u'Golfballweili', u'Golfballwei\xdf'), (u'gonnst', u'g\xf6nnst'), (u'gottesfllirchtiger', u'gottesf\xfcrchtiger'), (u'Gottverdammt', u'Gott verdammt'), (u'Go\ufb02', u'Gott'), (u'Gr6Be', u'Gr\xf6\xdfe'), (u'gr6Ber', u'gr\xf6\xdfer'), (u'gr6Bere', u'gr\xf6\xdfere'), (u'gr6Beren', u'gr\xf6\xdferen'), (u'Gr6Bte', u'Gr\xf6\xdfte'), (u'Gr6Bten', u'Gr\xf6\xdften'), (u'gr6Bter', u'gr\xf6\xdfter'), (u'gr6Btes', u'gr\xf6\xdftes'), (u'gr6f$te', u'gr\xf6\xdfte'), (u'gr6f$ten', u'gr\xf6\xdften'), (u'gr6f5ten', u'gr\xf6\xdften'), (u'gr6I3ter', u'gr\xf6\xdfter'), (u'gr6ISten', u'gr\xf6\xdften'), (u'Gr6l3e', u'Gr\xf6\xdfe'), (u'gr6l3ter', u'gr\xf6\xdfter'), (u'Grabst\xe9tte', u'Grabst\xe4tte'), (u'gratulierel', u'gratuliere!'), (u'grClf$en', u'gr\xfc\xdfen'), (u'grfilieren', u'gr\xf6\xdferen'), (u'Grfiner', u'Gr\xfcner'), (u'griil3e', u'gr\xfc\xdfe'), (u'griiliere', u'gr\xf6\xdfere'), (u'griiliten', u'gr\xf6\xdften'), (u'griin', u'gr\xfcn'), (u'Griinde', u'Gr\xfcnde'), (u'Griinden', u'Gr\xfcnden'), (u'griindlich', u'gr\xfcndlich'), (u'Griine', u'Gr\xfcne'), (u'griinen', u'gr\xfcnen'), (u'Griiner', u'Gr\xfcner'), (u'griin\xe9iugige', u'gr\xfcn\xe4ugige'), (u'griin\xe9iugiges', u'gr\xfcn\xe4ugiges'), (u'grii\ufb02te', u'gr\xf6\xdfte'), (u'Grijbeln', u'Gr\xfcbeln'), (u'griJBen', u'gr\xfc\xdfen'), (u'grijn', u'gr\xfcn'), (u'Grijnde', u'Gr\xfcnde'), (u'grijnden', u'gr\xfcnden'), (u'grijndlich', u'gr\xfcndlich'), (u'grijnes', u'gr\xfcnes'), (u'Grijnfutter', u'Gr\xfcnfutter'), (u'Grilbelt', u'Gr\xfcbelt'), (u'grilfken', u'gr\xfc\xdfen'), (u'Grillh\xe9hnchen', u'Grillh\xe4hnchen'), (u'Grilnde', u'Gr\xfcnde'), (u'Grilnden', u'Gr\xfcnden'), (u'grilndet', u'gr\xfcndet'), (u'grilndlich', u'gr\xfcndlich'), (u'grilndlicherf', u'gr\xfcndlicher!'), (u'grilndlichl', u'gr\xfcndlich!'), (u'grilne', u'gr\xfcne'), (u'Grilnschn\xe9bel', u'Gr\xfcnschn\xe4bel'), (u'grim', u'gr\xfcn'), (u'Grime', u'Gr\xf6\xdfe'), (u'grinco', u'gringo'), (u'Grllinde', u'Gr\xfcnde'), (u'grllinden', u'gr\xfcnden'), (u'grllindlich', u'gr\xfcndlich'), (u'grlllnes', u'gr\xfcnes'), (u'Gro/3artig', u'Gro\xdfartig'), (u'gro/3es', u'gro\xdfes'), (u'gro/3zUgig', u'gro\xdfz\xfcgig'), (u'Gro/Bstadt', u'Gro\xdfstadt'), (u'gro/Ken', u'gro\xdfen'), (u'groB', u'gro\xdf'), (u'groBartig', u'gro\xdfartig'), (u'GroBe', u'Gro\xdfe'), (u'GroBes', u'Gro\xdfes'), (u'GroBmutter', u'Gro\xdfmutter'), (u'GroBteil', u'Gro\xdfteil'), (u'groBziJgiger', u'gro\xdfz\xfcgiger'), (u'grof$', u'gro\xdf'), (u'grof$artig', u'gro\xdfartig'), (u'grof$artigen', u'gro\xdfartigen'), (u'grof$e', u'gro\xdfe'), (u'grof$er', u'gro\xdfer'), (u'grof$es', u'gro\xdfes'), (u'grof3', u'gro\xdf'), (u'grof3>artige', u'gro\xdfartige'), (u'Grof3e', u'Gro\xdfe'), (u'grof3en', u'gro\xdfen'), (u'grof3erAlien', u'gro\xdfer Alien'), (u'grof5es', u'gro\xdfes'), (u'Grofbvaters', u'Gro\xdfvaters'), (u'grofi', u'gro\xdf'), (u'Grofiangriffs', u'Gro\xdfangriffs'), (u'Grofiartig', u'Gro\xdfartig'), (u'grofiartige', u'gro\xdfartige'), (u'grofiartigen', u'gro\xdfartigen'), (u'grofiartiger', u'gro\xdfartiger'), (u'Grofiartiges', u'Gro\xdfartiges'), (u'Grofibritannien', u'Gro\xdfbritannien'), (u'Grofidiebstahl', u'Gro\xdfdiebstahl'), (u'Grofie', u'Gro\xdfe'), (u'grofier', u'gro\xdfer'), (u'grofies', u'gro\xdfes'), (u'grofiten', u'gr\xf6\xdften'), (u'grofk', u'gro\xdf'), (u'Grofkartig', u'Gro\xdfartig'), (u'grofke', u'gro\xdfe'), (u'Grofken', u'Gro\xdfen'), (u'Grofker', u'Gro\xdfer'), (u'Grofkvater', u'Gro\xdfvater'), (u'grofLe', u'gro\xdfe'), (u'grofler', u'gro\xdfer'), (u'groflsartig', u'gro\xdfartig'), (u'groflsartige', u'gro\xdfartige'), (u'Groflse', u'Gro\xdfe'), (u'groflsen', u'gro\xdfen'), (u'Grofser', u'Gro\xdfer'), (u'grol', u'gro\xdf'), (u"grol'3>en", u'gro\xdfen'), (u'grol2>', u'gro\xdf'), (u'grol2>en', u'gro\xdfen'), (u'grol3>es', u'gro\xdfes'), (u'grol3e', u'gro\xdfe'), (u'grol3er', u'gro\xdfer'), (u'Grol3raum', u'Gro\xdfraum'), (u'groli', u'gro\xdf'), (u'Groliartig', u'Gro\xdfartig'), (u'groliartige', u'gro\xdfartige'), (u'groliartigen', u'gro\xdfartigen'), (u'grolie', u'gro\xdfe'), (u'grolien', u'gro\xdfen'), (u'groliherzig', u'gro\xdfherzig'), (u'Grolimutter', u'Gro\xdfmutter'), (u'Grolisegel', u'Gro\xdfsegel'), (u'Grolkvater', u'Gro\xdfvater'), (u'groller', u'gro\xdfer'), (u'Grollser', u'Gro\xdfer'), (u'grollzugig', u'gro\xdfz\xfcgig'), (u'grolS', u'gro\xdf'), (u'grolSe', u'gro\xdfe'), (u'GrolSeltern', u'Gro\xdfeltern'), (u'grolSer', u'gro\xdfer'), (u'GrolSvater', u'Gro\xdfvater'), (u'grolZ~', u'gro\xdfe'), (u'gror$er', u'gro\xdfer'), (u'grorker', u'gro\xdfer'), (u'grosses', u'gro\xdfes'), (u'GROSSTE', u'GR\xd6SSTE'), (u'gro\ufb02', u'gro\xdf'), (u'gro\ufb02e', u'gro\xdfe'), (u'Gro\ufb02stadtkind', u'Gro\xdfstadtkind'), (u'Gro\ufb02vater', u'Gro\xdfvater'), (u'Grtin', u'Gr\xfcn'), (u'Grtmde', u'Gr\xfcnde'), (u'GruB', u'Gru\xdf'), (u'Grubenausg\xe9nge', u'Grubenausg\xe4nge'), (u'Gruf$', u'Gru\xdf'), (u'grUf$en', u'gr\xfc\xdfen'), (u'grufit', u'gr\xfc\xdft'), (u'Gruli', u'Gru\xdf'), (u'Grulikarte', u'Gru\xdfkarte'), (u'Grulikarten', u'Gru\xdfkarten'), (u'Grun', u'Gr\xfcn'), (u'grundlich', u'gr\xfcndlich'), (u'Grundstiick', u'Grundst\xfcck'), (u'grunds\xe9tzlich', u'grunds\xe4tzlich'), (u'grune', u'gr\xfcne'), (u'grunen', u'gr\xfcnen'), (u'Gr\xe9ben', u'Gr\xe4ben'), (u'gr\xe9bst', u'gr\xe4bst'), (u'gr\xe9fier', u'gr\xf6\xdfer'), (u'gr\xe9fkte', u'gr\xf6\xdfte'), (u'gr\xe9flserer', u'gr\xf6\xdferer'), (u'Gr\xe9ifite', u'Gr\xf6\xdfte'), (u'gr\xe9illten', u'gr\xf6\xdften'), (u'gr\xe9sslich', u'gr\xe4sslich'), (u'Gr\xe9uel', u'Gr\xe4uel'), (u'gr\ufb02ndlich', u'gr\xfcndlich'), (u'gr\ufb02ne', u'gr\xfcne'), (u'gull', u'gut!'), (u'Gummist\xe9psel', u'Gummist\xf6psel'), (u'Gumml', u'Gummi'), (u'GUNSTIGSTEN', u'G\xdcNSTIGSTEN'), (u'Gurtell', u'G\xfcrtel!'), (u'gutaussehend', u'gut aussehend'), (u'gutaussehender', u'gut aussehender'), (u'GUte', u'G\xfcte'), (u'gutgebaut', u'gut gebaut'), (u'gutgehen', u'gut gehen'), (u'Gutmijtigkeit', u'Gutm\xfctigkeit'), (u'g\xe9be', u'g\xe4be'), (u'g\xe9ben', u'g\xe4ben'), (u'g\xe9ibe', u'g\xe4be'), (u'G\xe9ittern', u'G\xf6ttern'), (u'G\xe9lisch', u'G\xe4lisch'), (u'G\xe9lische', u'G\xe4lische'), (u'g\xe9lisches', u'g\xe4lisches'), (u'G\xe9nsehaut', u'G\xe4nsehaut'), (u'G\xe9nsen', u'G\xe4nsen'), (u'G\xe9nze', u'G\xe4nze'), (u'G\xe9rfen', u'G\xe4rten'), (u'G\xe9rtnern', u'G\xe4rtnern'), (u'G\xe9ste', u'G\xe4ste'), (u'G\xe9stezimmer', u'G\xe4stezimmer'), (u'G\xe9tter', u'G\xf6tter'), (u'G\xe9tterspeise', u'G\xf6tterspeise'), (u'G\xe9ttin', u'G\xf6ttin'), (u'G\xe9ttliche', u'G\xf6ttliche'), (u'g\xe9ttlichen', u'g\xf6ttlichen'), (u'G\xe9tze', u'G\xf6tze'), (u'G\u20acfUhl6', u'Gef\xfchle'), (u'G\u20acStFUpp', u'Gestr\xfcpp'), (u"h<'>'r't", u'h\xf6rt'), (u"h<'5r", u'h\xf6r'), (u"h'a'lt", u'h\xe4lt'), (u"H'a'nde", u'H\xe4nde'), (u"H'a'nden", u'H\xe4nden'), (u"H'a'ttest", u'H\xe4ttest'), (u'H/', u'Hi'), (u'H/er', u'Hier'), (u'h/nfer', u'hinter'), (u'h5tte', u'h\xe4tte'), (u'H6fe', u'H\xf6fe'), (u'h6flich', u'h\xf6flich'), (u'H6fling', u'H\xf6fling'), (u'H6hen', u'H\xf6hen'), (u'h6her', u'h\xf6her'), (u'h6here', u'h\xf6here'), (u'H6HERER', u'H\xd6HERER'), (u'H6hle', u'H\xf6hle'), (u'H6l1e', u'H\xf6rte'), (u'H6lle', u'H\xf6lle'), (u'H6llen', u'H\xf6llen'), (u'h6lte', u'h\xf6rte'), (u'H6r', u'H\xf6r'), (u'h6re', u'h\xf6re'), (u'h6ren', u'h\xf6ren'), (u'H6rer', u'H\xf6rer'), (u'H6rner', u'H\xf6rner'), (u'h6rst', u'h\xf6rst'), (u'h6rt', u'h\xf6rt'), (u'h6rte', u'h\xf6rte'), (u'Ha/s', u'Hals'), (u'Haarbijrstel', u'Haarb\xfcrste!'), (u'Haarhfirste', u'Haarb\xfcrste'), (u'Haarl', u'Haar!'), (u'Haarstr\xe9hne', u'Haarstr\xe4hne'), (u"hab'jemanden", u"hab' jemanden"), (u'Hah', u'H\xe4h'), (u'halbstlllndiges', u'halbst\xfcndiges'), (u'halbvervvandelt', u'halbverwandelt'), (u'halfef', u'haltet'), (u'Hallfjchen', u'Hall\xf6chen'), (u'hallol', u'hallo!'), (u'Halsb\xe9nder', u'Halsb\xe4nder'), (u'Halsl', u'Hals!'), (u'haltenl', u'halten!'), (u'Haltjohnny', u'Halt Johnny'), (u'Hammersch\xe9del', u'Hammersch\xe4del'), (u'Handfl\xe9che', u'Handfl\xe4che'), (u'Handlungsstr\xe9nge', u'Handlungsstr\xe4nge'), (u'harfe', u'harte'), (u'hartn\xe9ickig', u'hartn\xe4ckig'), (u'Hasenful', u'Hasenfu\xdf'), (u'Hasenfull', u'Hasenfu\xdf'), (u'hassq', u'hasse'), (u'Hastja', u'Hast ja'), (u'hatjetzt', u'hat jetzt'), (u'hatta', u'hatte'), (u'Haupfbus', u'Hauptbus'), (u'Hauptaktion\xe9ire', u'Hauptaktion\xe4re'), (u'Hauptaktion\xe9irinnen', u'Hauptaktion\xe4rinnen'), (u'Hauptkabell', u'Hauptkabel!'), (u'haupts\xe9chlich', u'haupts\xe4chlich'), (u'haupts\xe9ichlich', u'haupts\xe4chlich'), (u'Haupttrib\ufb02ne', u'Haupttrib\xfcne'), (u'Hauptverschwiirer', u'Hauptverschw\xf6rer'), (u'Hauptwasserrohrwar', u'Hauptwasserrohr war'), (u'Hausfirzte', u'Haus\xe4rzte'), (u'Haush\xe9lterin', u'Haush\xe4lterin'), (u'Hausschlilssel', u'Hausschl\xfcssel'), (u'Haustilr', u'Haust\xfcr'), (u'Hausubervvachung', u'Haus\xfcberwachung'), (u'ha\xdft', u'hasst'), (u'Hbr', u'H\xf6r'), (u"hc'5ren", u'h\xf6ren'), (u"hc'\xa7r", u'h\xf6r'), (u'hdchsfens', u'h\xf6chstens'), (u'Hdchstleistung', u'H\xf6chstleistung'), (u'hdher', u'h\xf6her'), (u'Hdlle', u'H\xf6lle'), (u'Hdllenfeuer', u'H\xf6llenfeuer'), (u'hdre', u'h\xf6re'), (u'hdren', u'h\xf6ren'), (u'hdrsf', u'h\xf6rst'), (u'hdrten', u'horten'), (u'He/nr/ch', u'Heinrich'), (u'hedeutest', u'bedeutest'), (u'hegrfille', u'begr\xfc\xdfe'), (u'heiB', u'hei\xdf'), (u'heiBe', u'hei\xdfe'), (u'heiBen', u'hei\xdfen'), (u'HeiBer', u'Hei\xdfer'), (u'heiBes', u'hei\xdfes'), (u'heiBt', u'hei\xdft'), (u'heif$', u'hei\xdf'), (u'heif$e', u'hei\xdfe'), (u'heif$es', u'hei\xdfes'), (u'Heif$t', u'Hei\xdft'), (u'heif3>en', u'hei\xdfen'), (u'heif3t', u'hei\xdft'), (u'heif5en', u'hei\xdfen'), (u'heifie', u'hei\xdfe'), (u'heifiem', u'hei\xdfem'), (u'heifien', u'hei\xdfen'), (u'heifit', u'hei\xdft'), (u'heifkt', u'hei\xdft'), (u'heifLt', u'hei\xdft'), (u'heifZ>e', u'hei\xdfe'), (u"heil'$", u'hei\xdf'), (u"heil'$en", u'hei\xdfen'), (u"heil'$t", u'hei\xdft'), (u"heil'Se", u'hei\xdfe'), (u'heil2>en', u'hei\xdfen'), (u'heil2>t', u'hei\xdft'), (u'heil3en', u'hei\xdfen'), (u'heil3t', u'hei\xdft'), (u'heil5e', u'hei\xdfe'), (u'heil5t', u'hei\xdft'), (u'heili', u'hei\xdf'), (u'heilies', u'hei\xdfes'), (u'heilit', u'hei\xdft'), (u'heillst', u'hei\xdft'), (u'heilZ~', u'hei\xdft'), (u'heir$', u'hei\xdf'), (u'heisst', u'hei\xdft'), (u'Helllger', u'Heiliger'), (u'Helzlichen', u'Herzlichen'), (u"Hen'je", u'Herrje'), (u'herabstofien', u'herabsto\xdfen'), (u'heransttlrmtet', u'heranst\xfcrmtet'), (u'heraush\xe9ngendem', u'heraush\xe4ngendem'), (u'herhfiren', u'herh\xf6ren'), (u'herh\xe9ren', u'herh\xf6ren'), (u'heriiber', u'her\xfcber'), (u'HerrSchmidt', u'Herr Schmidt'), (u'herumf\xe9hrt', u'herumf\xe4hrt'), (u'herumkehren', u'herum kehren'), (u'herumlluft', u'heruml\xe4uft'), (u'herumzuwijhlen', u'herumzuw\xfchlen'), (u'Herzrhythmusst\xe9rungen', u'Herzrhythmusst\xf6rungen'), (u'Herzschlielierei', u'Herzschlie\xdferei'), (u'Herzstlllck', u'Herzst\xfcck'), (u'Heuta', u'Heute'), (u'Hexenhtltte', u'Hexenh\xfctte'), (u'HeY\xb7', u'Hey.'), (u'Hfibscheste', u'H\xfcbscheste'), (u'hfiherer', u'h\xf6herer'), (u'hfihsch', u'h\xfcbsch'), (u'Hfilfte', u'H\xe4fte'), (u'Hfille', u'H\xf6lle'), (u'hfilt', u'h\xe4lt'), (u'hfiltst', u'h\xe4ltst'), (u'Hfin', u'H\xf6rt'), (u'hfipft', u'h\xfcpft'), (u'Hfir', u'H\xf6r'), (u'hfiren', u'h\xf6ren'), (u'hfirst', u'h\xf6rst'), (u'hfirt', u'h\xf6rt'), (u'hfitte', u'h\xe4tte'), (u'hfitten', u'h\xe4tten'), (u'hie/3', u'hie\xdf'), (u'hieB', u'hie\xdf'), (u'hiefL', u'hie\xdf'), (u'hiel3', u'hie\xdf'), (u'hiells', u'hie\xdf'), (u'hierhergereist', u'hierher gereist'), (u'hierherzuriick', u'hierher zur\xfcck'), (u'hierijber', u'hier\xfcber'), (u'hierjede', u'hier jede'), (u'hierjeder', u'hier jeder'), (u'hierl', u'hier!'), (u'hierL', u'hie\xdf'), (u'hierwar', u'hier war'), (u'hierzum', u'hier-zum'), (u'hie\ufb02', u'hie\xdf'), (u'Hiibsch', u'H\xfcbsch'), (u'Hiibsche', u'H\xfcbsche'), (u'Hiibscher', u'H\xfcbscher'), (u'hiibschl', u'h\xfcbsch!'), (u'hiichst', u'h\xf6chst'), (u'hiichstens', u'h\xf6chstens'), (u'hiichster', u'h\xf6chster'), (u'hiichstpersiinlich', u'h\xf6chstpers\xf6nlich'), (u'Hiifen', u'H\xf6fen'), (u'hiifischen', u'h\xf6fischen'), (u'Hiifling', u'H\xf6fling'), (u'Hiigel', u'H\xfcgel'), (u'Hiihe', u'H\xf6he'), (u'Hiihepunkt', u'H\xf6hepunkt'), (u'hiiher', u'h\xf6her'), (u'hiihere', u'h\xf6here'), (u'Hiihlen', u'H\xf6hlen'), (u'Hiihnchen', u'H\xfchnchen'), (u'Hiihner', u'H\xfchner'), (u'Hiihnerkl\xe9fkchen', u'H\xfchnerkl\xf6\xdfchen'), (u'Hiilfte', u'H\xe4lfte'), (u'Hiille', u'H\xf6lle'), (u'Hiillenstreitmacht', u'H\xf6llenstreitmacht'), (u'hiillischen', u'h\xf6llischen'), (u'hiipfen', u'h\xfcpfen'), (u'Hiir', u'H\xf6r'), (u'hiire', u'h\xf6re'), (u'Hiiren', u'H\xf6ren'), (u'Hiirer', u'H\xf6rer'), (u'Hiiret', u'H\xf6ret'), (u'Hiirjetzt', u'H\xf6r jetzt'), (u'Hiirt', u'H\xf6rt'), (u'hiirte', u'h\xf6rte'), (u'hiirtest', u'h\xf6rtest'), (u'Hiissliches', u'H\xe4ssliches'), (u'Hiite', u'H\xfcte'), (u'Hiiten', u'H\xfcten'), (u'hiitet', u'h\xfctet'), (u'Hiitte', u'H\xe4tte'), (u'hiitten', u'h\xe4tten'), (u'Hiitten', u'H\xfctten'), (u'hijbsch', u'h\xfcbsch'), (u'hijbschen', u'h\xfcbschen'), (u'hijbsches', u'h\xfcbsches'), (u'Hijfte', u'H\xfcfte'), (u'Hijften', u'H\xfcften'), (u'Hijgel', u'H\xfcgel'), (u'Hijgels', u'H\xfcgels'), (u'Hijpfburgl', u'H\xfcpfburg!'), (u'hijpfe', u'h\xfcpfe'), (u'hijpfen', u'h\xfcpfen'), (u'hijre', u'h\xf6re'), (u'Hijren', u'H\xf6ren'), (u'Hijrer', u'H\xf6rer'), (u'hilbsch', u'h\xfcbsch'), (u'hilbsche', u'h\xfcbsche'), (u'hilbschen', u'h\xfcbschen'), (u'hilbscher', u'h\xfcbscher'), (u'Hilfel', u'Hilfe!'), (u'HILFSPERSONALI', u'HILFSPERSONAL:'), (u'Hilgel', u'H\xfcgel'), (u'hillig', u'billig'), (u'Hilt', u'H\xe4lt'), (u'hil\ufb02', u'hilft'), (u'Him', u'Hirn'), (u'Himmell', u'Himmel!'), (u'hineintr\xe9umen', u'hineintr\xe4umen'), (u'hinfijhrt', u'hinf\xfchrt'), (u'hingefiihrt', u'hingef\xfchrt'), (u'hingehdren', u'hingeh\xf6ren'), (u'hingehiiren', u'hingeh\xf6ren'), (u'hinilber', u'hin\xfcber'), (u'hinreiliend', u'hinrei\xdfend'), (u'hinschmeifit', u'hinschmei\xdft'), (u'HintenN\xe4ldler', u'Hinterw\xe4ldler'), (u'Hintergrundl\xe9rm', u'Hintergrundl\xe4rm'), (u'hinterhfiltig', u'hinterh\xe4ltig'), (u'hinterh\xe9iltiger', u'hinterh\xe4ltiger'), (u'Hinterh\xe9iltigl', u'Hinterh\xe4ltig!'), (u'hinterh\xe9ltige', u'hinterh\xe4ltige'), (u'hinterh\xe9ltiger', u'hinterh\xe4ltiger'), (u'Hinterk\xe9pfen', u'Hinterk\xf6pfen'), (u'hinterlieBe', u'hinterlie\xdfe'), (u'hinterl\xe9sst', u'hinterl\xe4sst'), (u'Hintersttlbchen', u'Hinterst\xfcbchen'), (u'Hintertur', u'Hintert\xfcr'), (u'hinwollen', u'hin wollen'), (u'hinzufuhren', u'hinzuf\xfchren'), (u'hinzuf\ufb02gten', u'hinzuf\xfcgten'), (u'Hirnrnel', u'Himmel'), (u'hirteste', u'h\xe4rteste'), (u'hisslich', u'h\xe4sslich'), (u'Hi\xe9tte', u'H\xe4tte'), (u'Hler', u'Her'), (u'hler', u'hier'), (u'hllf', u'hilf'), (u'hllibsch', u'h\xfcbsch'), (u'Hllindinnen', u'H\xfcndinnen'), (u'Hlllpf', u'H\xfcpf'), (u'hln', u'hin'), (u'Hlnbllck', u'Hinblick'), (u'hltte', u'h\xe4tte'), (u'Hltten', u'H\xe4tten'), (u'Hochfrequenzst\xe9rungenl', u'Hochfrequenzst\xf6rungen!'), (u'hochl', u'hoch!'), (u'Hochsicherheitsgef\xe9ngnis', u'Hochsicherheitsgef\xe4ngnis'), (u'Hochstens', u'H\xf6chstens'), (u'Hochzeitskostiime', u'Hochzeitskost\xfcme'), (u'Hohek', u'Hoheit'), (u'Hohepunkt', u'H\xf6hepunkt'), (u'hohere', u'h\xf6here'), (u'HoHo', u'Hoho'), (u'Holle', u'H\xf6lle'), (u'Holzsttlck', u'Holzst\xfcck'), (u'hor', u'h\xf6r'), (u'Horen', u'H\xf6ren'), (u'Hosenscheifker', u'Hosenschei\xdfer'), (u'Hosenscheiiker', u'Hosenschei\xdfer'), (u'Hosenschei\ufb02er', u'Hosenschei\xdfer'), (u'Hotelg\xe9ste', u'Hotelg\xe4ste'), (u'HQHE', u'H\xd6HE'), (u'htibscher', u'h\xfcbscher'), (u'Htihnchen', u'H\xfchnchen'), (u'Htipfen', u'H\xfcpfen'), (u'Htipfenl', u'H\xfcpfen!'), (u'htiren', u'h\xf6ren'), (u'hubsch', u'h\xfcbsch'), (u'hubsche', u'h\xfcbsche'), (u'hubschen', u'h\xfcbschen'), (u'Hubscher', u'H\xfcbscher'), (u'hubscheres', u'h\xfcbscheres'), (u'Hubsches', u'H\xfcbsches'), (u'Huhner', u'H\xfchner'), (u'humon/oll', u'humorvoll'), (u'Hundchen', u'H\xfcndchen'), (u'Hundebullel', u'Hundebulle!'), (u'Hunden\xe9pfe', u'Hunden\xe4pfe'), (u'Hundescheilie', u'Hundeschei\xdfe'), (u'Hundl', u'Hund!'), (u'HUNG', u'H\xfclle'), (u'hunte', u'bunte'), (u'Hurensiihne', u'Hurens\xf6hne'), (u'Hurensohnl', u'Hurensohn!'), (u'Huterin', u'H\xfcterin'), (u'HUtte', u'H\xfctte'), (u'Hypoglyk\xe9mie', u'Hypoglyk\xe4mie'), (u'h\xe9', u'h\xe4'), (u'H\xe9chste', u'H\xf6chste'), (u'h\xe9chsten', u'h\xf6chsten'), (u'H\xe9chstens', u'H\xf6chstens'), (u'H\xe9chstpers\xe9nlich', u'H\xf6chstpers\xf6nlich'), (u'H\xe9fen', u'H\xe4fen'), (u'h\xe9flich', u'h\xf6flich'), (u'H\xe9ftling', u'H\xe4ftling'), (u'H\xe9ftlinge', u'H\xe4ftlinge'), (u'H\xe9ftlingsr\xe9te', u'H\xe4ftlingsr\xe4te'), (u'H\xe9hef', u'H\xf6he!'), (u'H\xe9hepunkt', u'H\xf6hepunkt'), (u'h\xe9her', u'h\xf6her'), (u'h\xe9heren', u'h\xf6heren'), (u'H\xe9i', u'H\xe4'), (u'H\xe9ifen', u'H\xe4fen'), (u'H\xe9ilften', u'H\xe4lften'), (u'h\xe9iltst', u'h\xe4ltst'), (u'H\xe9inde', u'H\xe4nde'), (u'h\xe9ing', u'h\xe4ng'), (u'h\xe9ingen', u'h\xe4ngen'), (u'h\xe9ingt', u'h\xe4ngt'), (u'h\xe9ir', u'h\xf6r'), (u'h\xe9irter', u'h\xe4rter'), (u'h\xe9itt', u'h\xe4tt'), (u'H\xe9itte', u'H\xe4tte'), (u'h\xe9itten', u'h\xe4tten'), (u'h\xe9ittest', u'h\xe4ttest'), (u'h\xe9iufig', u'h\xe4ufig'), (u'H\xe9lfte', u'H\xe4lfte'), (u'H\xe9lle', u'H\xf6lle'), (u'H\xe9llen', u'H\xf6llen'), (u'H\xe9llenloch', u'H\xf6llenloch'), (u'h\xe9llisch', u'h\xf6llisch'), (u'h\xe9llische', u'h\xf6llische'), (u'h\xe9lt', u'h\xe4lt'), (u'H\xe9ltst', u'H\xe4ltst'), (u'h\xe9lzernes', u'h\xf6lzernes'), (u'h\xe9misch', u'h\xe4misch'), (u'H\xe9mmer', u'H\xe4mmer'), (u'h\xe9mmernde', u'h\xe4mmernde'), (u'H\xe9moglobin', u'H\xe4moglobin'), (u'H\xe9morrhoiden', u'H\xe4morrhoiden'), (u'H\xe9ndchen', u'H\xe4ndchen'), (u'H\xe9nde', u'H\xe4nde'), (u'H\xe9ndedruck', u'H\xe4ndedruck'), (u'H\xe9nden', u'H\xe4nden'), (u'H\xe9ndlerin', u'H\xe4ndlerin'), (u'h\xe9ng', u'h\xe4ng'), (u'h\xe9ngen', u'h\xe4ngen'), (u'h\xe9ngend', u'h\xe4ngend'), (u'h\xe9ngst', u'h\xe4ngst'), (u'h\xe9ngt', u'h\xe4ngt'), (u'H\xe9r', u'H\xf6r'), (u'h\xe9re', u'h\xf6re'), (u'h\xe9ren', u'h\xf6ren'), (u'H\xe9rgesch\xe9idigte', u'H\xf6rgesch\xe4digte'), (u'h\xe9rst', u'h\xf6rst'), (u'h\xe9rt', u'h\xf6rt'), (u'h\xe9rte', u'h\xf6rte'), (u'h\xe9rten', u'h\xf6rten'), (u'h\xe9rter', u'h\xe4rter'), (u'H\xe9rzu', u'H\xf6r zu'), (u'H\xe9schen', u'Haschen'), (u'h\xe9sslich', u'h\xe4sslich'), (u'h\xe9sslicher', u'h\xe4sslicher'), (u'h\xe9sslichl', u'h\xe4sslich'), (u'h\xe9sslichste', u'h\xe4sslichste'), (u'h\xe9tt', u'h\xe4tt'), (u'H\xe9tte', u'H\xe4tte'), (u'h\xe9tten', u'h\xe4tten'), (u"h\xe9tten's", u"h\xe4tten's"), (u'h\xe9ttest', u'h\xe4ttest'), (u'H\xe9ttet', u'H\xe4ttet'), (u'H\xe9ufi', u'H\xe4ufi'), (u'h\xe9ufig', u'h\xe4ufig'), (u'h\xe9ufiger', u'h\xe4ufiger'), (u'H\xe9ufigkeit', u'H\xe4ufigkeit'), (u'h\xe9ufigsten', u'h\xe4ufigsten'), (u'H\xe9user', u'H\xe4user'), (u'H\xe9usern', u'H\xe4usern'), (u'h\xe9ute', u'h\xe4ute'), (u'H\u20acY', u'Hey'), (u'H\ufb02geln', u'H\xfcgeln'), (u"i'\xa7ffne", u'\xd6ffne'), (u'I/egen', u'liegen'), (u'I5sst', u'l\xe4sst'), (u'I5stern', u'l\xe4stern'), (u'I6sen', u'l\xf6sen'), (u'Ia\xdf', u'lass'), (u'Ia\xdft', u'lasst'), (u'Icll', u'Ich'), (u'identifizieet', u'identifiziert'), (u'IDENTITAT', u'IDENTIT\xc4T'), (u'IE', u'I\xdf'), (u'Iebendigl', u'lebendig!'), (u'Iebenslinglich', u'lebensl\xe4glich'), (u'Iebtjetzt', u'lebt jetzt'), (u'Ieck', u'leck'), (u'Iehn', u'lehn'), (u'Ieid\u201a', u'leid\u201a'), (u'Ieinenlose', u'leinenlose'), (u'Ienistische', u'leninistische'), (u'Ietztendlich', u'letztendlich'), (u'Ifigt', u'l\xfcgt'), (u'Ihrdllirft', u'Ihr d\xfcrft'), (u'ihrja', u'ihr ja'), (u'ihrjemals', u'ihr jemals'), (u'ihrjetzt', u'ihr jetzt'), (u'ihrjeweiliges', u'ihr jeweiliges'), (u'ihrVater', u'ihr Vater'), (u'ihrvorstrafenregister', u'ihr Vorstrafenregister'), (u'ihrwahres', u'ihr wahres'), (u'Ihrwerdet', u'Ihr werdet'), (u'ihrzwei', u'ihr zwei'), (u'iibel', u'\xfcbel'), (u'iibemehmen', u'\xfcbernehmen'), (u'iiber', u'\xfcber'), (u'iiberall', u'\xfcberall'), (u'iiberallhin', u'\xfcberallhin'), (u'iiberdauern', u'\xfcberdauern'), (u'iiberdauerte', u'\xfcberdauerte'), (u'iibereinstimmte', u'\xfcbereinstimme'), (u'iiberfallen', u'\xfcberfallen'), (u'iiberfiel', u'\xfcberfiel'), (u'iibergeben', u'\xfcbergeben'), (u'iiberhaupt', u'\xfcberhaupt'), (u'iiberhiirt', u'\xfcberh\xf6rt'), (u'iiberholt', u'\xfcberholt'), (u'iiberholter', u'\xfcberholter'), (u'iiberkam', u'\xfcberkam'), (u'iiberlassen', u'\xfcberlassen'), (u'iiberleben', u'\xfcberleben'), (u'iiberlebt', u'\xfcberlebt'), (u'iiberlegen', u'\xfcberlegen'), (u'iiberlegten', u'\xfcberlegten'), (u'iibernahmen', u'\xfcbernahmen'), (u'iibernehme', u'\xfcbernehme'), (u'iibernehmen', u'\xfcbernehmen'), (u'iibernimmt', u'\xfcbernimmt'), (u'iibernommen', u'\xfcbernommen'), (u'iiberpriife', u'\xfcberpr\xfcfe'), (u'iiberpriifen', u'\xfcberpr\xfcfen'), (u'iiberpriift', u'\xfcberpr\xfcft'), (u'iiberpriiften', u'\xfcberpr\xfcften'), (u'iiberqueren', u'\xfcberqueren'), (u'iiberragen', u'\xfcberragen'), (u'iiberrascht', u'\xfcberrascht'), (u'iiberraschte', u'\xfcberraschte'), (u'iiberreden', u'\xfcberreden'), (u'iiberschritten', u'\xfcberschritten'), (u'iibersetzen', u'\xfcbersetzen'), (u'iibersetzt', u'\xfcbersetzt'), (u'iibersteigt', u'\xfcbersteigt'), (u'iibertragen', u'\xfcbertragen'), (u'iibertreffen', u'\xfcbertreffen'), (u'iibertreib', u'\xfcbertreib'), (u'iibertreiben', u'\xfcbertreiben'), (u'iibertrieben', u'\xfcbertrieben'), (u'iiberzeugen', u'\xfcberzeugen'), (u'iiberzeugt', u'\xfcberzeugt'), (u'iiblich', u'\xfcblich'), (u'iibliche', u'\xfcbliche'), (u'iibrig', u'\xfcbrig'), (u'IieB', u'lie\xdf'), (u'Iiebte', u'liebte'), (u"Iief's", u"lief's"), (u'Iiehe', u'liebe'), (u'Iie\ufb02est', u'lie\xdfest'), (u'iiffentlichen', u'\xf6ffentlichen'), (u'iiffentliches', u'\xf6ffentliches'), (u'iiffnest', u'\xf6ffnest'), (u'iifter', u'\xf6fter'), (u'iihnllchkelt', u'\xc4hnllchkelt'), (u'Iisst', u'l\xe4sst'), (u'ijbel', u'\xfcbel'), (u'ijben', u'\xfcben'), (u'ijberall', u'\xfcberall'), (u'ijberhaupt', u'\xfcberhaupt'), (u'ijberlegene', u'\xfcberlegene'), (u'ijbernehme', u'\xfcbernehme'), (u'ijbernimmst', u'\xfcbernimmst'), (u'ijberprijfen', u'\xfcberpr\xfcfen'), (u'ijberreden', u'\xfcberreden'), (u'ijbertrage', u'\xfcbertrage'), (u'ijberwunden', u'\xfcberwunden'), (u'ijberzeugen', u'\xfcberzeugen'), (u'ijberzogen', u'\xfcberzogen'), (u'Il6her', u'h\xf6her'), (u'IleiB', u'hei\xdf'), (u'Ill', u'III'), (u'Illfie', u'Wie'), (u'Ilrger', u'\xc4rger'), (u'Ilufierste', u'\xc4u\xdferste'), (u'immerja', u'immer ja'), (u'immerjung', u'immer jung'), (u'immerweinen', u'immer weinen'), (u'immerw\xe4hrende', u'immer w\xe4hrende'), (u'immerw\xe9hrende', u'immerw\xe4hrende'), (u'Improvisiation', u'Improvisation'), (u'Impulswellengeschutz', u'Impulswellengesch\xfctz'), (u'INBRUNSTIGE', u'INBR\xdcNSTIGE'), (u'instfindig', u'inst\xe4ndig'), (u'intramuskul\xe9r', u'intramuskul\xe4r'), (u'INVASIONSFLOTFE', u'INVASIONSFLOTTE'), (u'Iosgeliist', u'losgel\xf6st'), (u'Iosgel\xe9st', u'losgel\xf6st'), (u'Ioszuliisen', u'loszul\xf6sen'), (u'ip', u'in'), (u'irn', u'im'), (u'irrefuhren', u'irref\xfchren'), (u'irrefuhrende', u'irref\xfchrende'), (u'istja', u'ist ja'), (u'istjedoch', u'ist jedoch'), (u'istjemand', u'ist jemand'), (u'istjetzt', u'ist jetzt'), (u'istJohnny', u'ist Johnny'), (u'istjung', u'ist jung'), (u'istweg', u'ist weg'), (u'ITIUSSEFI', u'm\xfcssen'), (u'ITIUSSGI7', u'm\xfcssen'), (u'ITTITTRZ', u'Danke.'), (u'Ivl\xe9gliche', u'M\xf6gliche'), (u'I\xe9cheln', u'l\xe4cheln'), (u'I\xe9cherlich', u'l\xe4cherlich'), (u'I\xe9cherlichen', u'l\xe4cherlichen'), (u'I\xe9hmt', u'l\xe4hmt'), (u'I\xe9iuft', u'l\xe4uft'), (u'I\xe9nger', u'l\xe4nger'), (u'I\xe9sst', u'l\xe4sst'), (u'I\xe9sste', u'l\xe4sste'), (u'I\xe9uft', u'l\xe4uft'), (u'J0Shua', u'Joshua'), (u'Jackettkaufen', u'Jackett kaufen'), (u'jahr', u'Jahr'), (u'jahre', u'Jahre'), (u'jahren', u'Jahren'), (u'JAHRIGE', u'J\xc4HRIGE'), (u'jal', u'ja!'), (u'jemandenl', u'jemanden!'), (u'jetztl', u'jetzt!'), (u'jiidisch', u'j\xfcdisch'), (u'Jiingem', u'J\xfcngern'), (u'jiingerwar', u'j\xfcnger war'), (u'Jiingste', u'J\xfcngste'), (u'jilnger', u'j\xfcnger'), (u'Jlllngling', u'J\xfcngling'), (u'job', u'Job'), (u'Jogglng', u'Jogging'), (u'john', u'John'), (u'johnny', u'Johnny'), (u'journalisten', u'Journalisten'), (u'Jullo', u'Julie'), (u'JUNGFRAULICHE', u'JUNGFR\xc4ULICHE'), (u'jungfr\xe9uliche', u'jungfr\xe4uliche'), (u'jungfr\xe9ulichen', u'jungfr\xe4ulichen'), (u'jungfr\xe9ulicher', u'jungfr\xe4ulicher'), (u'Jungfr\xe9ulichkeit', u'Jungfr\xe4ulichkeit'), (u'Jungsl', u'Jungs!'), (u'Jungste', u'J\xfcngste'), (u'Jurlgs', u'Jungs'), (u'Justitzministeriums', u'Justizministeriums'), (u'J\xe9ger', u'J\xe4ger'), (u'J\xe9hrige', u'J\xe4hrige'), (u'j\xe9hrigen', u'j\xe4hrigen'), (u'j\xe9hriger', u'j\xe4hriger'), (u'j\xe9hrlich', u'j\xe4hrlich'), (u'J\xe9iger', u'J\xe4ger'), (u'j\xe9ihrigen', u'j\xe4hrigen'), (u'j\xe9mmerlich', u'j\xe4mmerlich'), (u"k'a'mpfen", u'k\xe4mpfen'), (u'K/no', u'Kino'), (u'K/Varte', u'Warte'), (u'K/Velle', u'Welle'), (u'K5NIGIN', u'K\xd6NIGIN'), (u'K6der', u'K\xf6der'), (u'K6ln', u'K\xf6ln'), (u'K6nig', u'K\xf6nig'), (u'K6nige', u'K\xf6nige'), (u'K6nigin', u'K\xf6nigin'), (u'k6nnen', u'k\xf6nnen'), (u"k6nnen's", u"k\xf6nnen's"), (u'k6nnest', u'k\xf6nntest'), (u'k6nnt', u'k\xf6nnt'), (u'K6nnte', u'K\xf6nnte'), (u"k6nnte's", u"k\xf6nnte's"), (u'k6nnten', u'k\xf6nnten'), (u'k6nntest', u'k\xf6nntest'), (u'K6pfe', u'K\xf6pfe'), (u'K6rper', u'K\xf6rper'), (u'K6rpers', u'K\xf6rpers'), (u'K6stlich', u'K\xf6stlich'), (u'Kabelm\xe9nner', u'Kabelm\xe4nner'), (u'kalf', u'kalt'), (u'kaltblijtig', u'kaltbl\xfctig'), (u'kampfen', u'k\xe4mpfen'), (u'Kampfj\xe9ger', u'Kampfj\xe4ger'), (u'Kanarienviigeln', u'Kanarienv\xf6geln'), (u"kann'sja", u"kann's ja"), (u'kannstja', u'kannst ja'), (u'Kan\xe9len', u'Kan\xe4len'), (u'Kapitan', u'Kapit\xe4n'), (u'Kapitln', u'Kapit\xe4n'), (u'Kapitlnen', u'Kapit\xe4nen'), (u'Kapitlns', u'Kapit\xe4ns'), (u'Kapit\xe9in', u'Kapit\xe4n'), (u'Kapit\xe9inleutnant', u'Kapit\xe4nleutnant'), (u'Kapit\xe9ins', u'Kapit\xe4ns'), (u'Kapit\xe9n', u'Kapit\xe4n'), (u'Kapit\xe9nleutnant', u'Kapit\xe4nleutnant'), (u'Kapit\xe9ns', u'Kapit\xe4ns'), (u"Kapt'n", u"K\xe4pt'n"), (u'kaputthaust', u'kaputt haust'), (u'Kartoffelsch\xe9len', u'Kartoffelsch\xe4len'), (u'Kassettenger\xe9it', u'Kassettenger\xe4t'), (u'kbnnen', u'k\xf6nnen'), (u'kbnnten', u'k\xf6nnten'), (u'kdnnen', u'k\xf6nnen'), (u'kdnnfe', u'k\xf6nnte'), (u'kdnnte', u'k\xf6nnte'), (u'ke/ne', u'keine'), (u'Kefn', u'Kein'), (u'Keh/1', u'Kehrt'), (u'Keithl', u'Keith!'), (u'keln', u'kein'), (u'kelne', u'keine'), (u'Keri', u'Kerl'), (u'kfime', u'k\xe4me'), (u'Kfimmer', u'K\xfcmmer'), (u'kfimmere', u'k\xfcmmere'), (u'kfimmern', u'k\xfcmmern'), (u'kfimmert', u'k\xfcmmert'), (u'kfimpft', u'k\xe4mpft'), (u'kfimpften', u'k\xe4mpften'), (u'Kfinig', u'K\xf6nig'), (u'Kfinnen', u'K\xf6nnen'), (u'kfinnte', u'k\xf6nnte'), (u'Kfinnten', u'K\xf6nnten'), (u'Kfinntest', u'K\xf6nntest'), (u'Kfiss', u'K\xfcss'), (u'Kfisschen', u'K\xfcsschen'), (u'Kfissen', u'K\xfcssen'), (u'Kfjnnte', u'K\xf6nnte'), (u'Khnlichkeit', u'\xc4hnlichkeit'), (u'KIar', u'Klar'), (u'Kifig', u'K\xe4fig'), (u'Kiiche', u'K\xfcche'), (u'Kiichenhelfer', u'K\xfcchenhelfer'), (u'Kiichln', u'K\xf6chin'), (u'Kiihe', u'K\xfche'), (u'Kiihlbox', u'K\xfchlbox'), (u'kiihler', u'k\xfchler'), (u'Kiihlschrank', u'K\xfchlschrank'), (u'kiimmem', u'k\xfcmmern'), (u'kiimmer', u'k\xfcmmer'), (u'kiimmere', u'k\xfcmmere'), (u'Kiimmern', u'K\xfcmmern'), (u'kiindigen', u'k\xfcndigen'), (u'Kiinig', u'K\xf6nig'), (u'Kiinige', u'K\xf6nige'), (u'Kiinigen', u'K\xf6nigen'), (u'Kiinigin', u'K\xf6nigin'), (u'Kiiniginnen', u'K\xf6niginnen'), (u'kiinigliche', u'k\xf6nigliche'), (u'kiiniglichen', u'k\xf6niglichen'), (u'kiiniglicher', u'k\xf6niglicher'), (u'Kiinigreichs', u'K\xf6nigreichs'), (u'Kiinigs', u'K\xf6nigs'), (u'Kiinigtum', u'K\xf6nigtum'), (u'kiinne', u'k\xf6nne'), (u'kiinnen', u'k\xf6nnen'), (u'kiinnt', u'k\xf6nnt'), (u'Kiinnte', u'K\xf6nnte'), (u'kiinnten', u'k\xf6nnten'), (u'kiinntest', u'k\xf6nntest'), (u'kiinntet', u'k\xf6nntet'), (u'Kiinstler', u'K\xfcnstler'), (u'kiinstlerischen', u'k\xfcnstlerischen'), (u'kiipfen', u'k\xf6pfen'), (u'Kiirper', u'K\xf6rper'), (u'Kiirperfunktionen', u'K\xf6rperfunktionen'), (u'Kiirperhaltung', u'K\xf6rperhaltung'), (u'kiirperliche', u'k\xf6rperliche'), (u'Kiirperliches', u'K\xf6rperliches'), (u'Kiirpersprache', u'K\xf6rpersprache'), (u'Kiirperverletzung', u'K\xf6rperverletzung'), (u'kiirzen', u'k\xfcrzen'), (u'kiirzerzutreten', u'k\xfcrzerzutreten'), (u'kiirzeste', u'k\xfcrzeste'), (u'Kiisschen', u'K\xfcsschen'), (u'Kiissen', u'K\xfcssen'), (u'Kiisst', u'K\xfcsst'), (u'Kiiste', u'K\xfcste'), (u'kiistlich', u'k\xf6stlich'), (u'Kijche', u'K\xfcche'), (u'Kijhlschrank', u'K\xfchlschrank'), (u'Kijmmere', u'K\xfcmmere'), (u'kijmmern', u'k\xfcmmern'), (u'kijmmernl', u'k\xfcmmern!'), (u'kijmmerst', u'k\xfcmmerst'), (u'kijmmerten', u'k\xfcmmerten'), (u'kijndigt', u'k\xfcndigt'), (u'kijnnen', u'k\xf6nnen'), (u'kijnnt', u'k\xf6nnt'), (u'kijnnte', u'k\xf6nnte'), (u'kijnnten', u'k\xf6nnten'), (u'Kijnstler', u'K\xfcnstler'), (u'Kijrbis', u'K\xfcrbis'), (u'kijrzlich', u'k\xfcrzlich'), (u'kijrzliche', u'k\xfcrzliche'), (u'Kijrzungen', u'K\xfcrzungen'), (u'kijsst', u'k\xfcsst'), (u'Kijste', u'K\xfcste'), (u'Kilche', u'K\xfcche'), (u'Kilchlein', u'K\xfcchlein'), (u'kilhlen', u'k\xfchlen'), (u'kilhler', u'k\xfchler'), (u'Kilhlkreislauf', u'K\xfchlkreislauf'), (u'Kilhlschrank', u'K\xfchlschrank'), (u'Kilmmern', u'K\xfcmmern'), (u'Kilmmert', u'K\xfcmmert'), (u'kilndigen', u'k\xfcndigen'), (u'kilnstliche', u'k\xfcnstliche'), (u'kilss', u'k\xfcss'), (u'kilsse', u'k\xfcsse'), (u'kilssen', u'k\xfcssen'), (u'Kinderm\xe9dchen', u'Kinderm\xe4dchen'), (u'Kinderspiell', u'Kinderspiel!'), (u'Kindsk\xe9pfe', u'Kindsk\xf6pfe'), (u'kiokflip', u'kickflip'), (u'KIotz', u'Klotz'), (u"KL'lr", u'K\xfcr'), (u"KL'lste", u'K\xfcste'), (u'Klapsmiihle', u'Klapsm\xfchle'), (u'Klassem\xe9dchen', u'Klassem\xe4dchen'), (u'kle/ne', u'kleine'), (u'Kleidergr6Be', u'Kleidergr\xf6\xdfe'), (u'Kleidergrfilie', u'Kleidergr\xf6\xdfe'), (u'Kleinerl', u'Kleiner!'), (u'kleinwiichsige', u'kleinw\xfcchsige'), (u'kleinwilchsiges', u'kleinw\xfcchsiges'), (u'klijger', u'kl\xfcger'), (u'klijgsten', u'kl\xfcgsten'), (u'klilger', u'kl\xfcger'), (u"kLinft'gen", u"k\xfcnft'gen"), (u'klirst', u'kl\xe4rst'), (u'kljmmere', u'k\xfcmmere'), (u'Kllirze', u'K\xfcrze'), (u'kllissen', u'k\xfcssen'), (u'Klliste', u'K\xfcste'), (u'Klllche', u'K\xfcche'), (u'klllhnsten', u'k\xfchnsten'), (u'kllllger', u'kl\xfcger'), (u'Klobtlrsten', u'Klob\xfcrsten'), (u'klop\ufb02l', u'klopft!'), (u"Klpt'n", u"K\xe4pt'n"), (u"Klpt'nl", u"K\xe4pt'n!"), (u"Klpt'ns", u"K\xe4pt'ns"), (u'Klse', u'K\xe4se'), (u'Klseschnuffelei', u'K\xe4seschn\xfcffelei'), (u'Kltigste', u'Kl\xfcgste'), (u'Klugschei\ufb02er', u'Klugschei\xdfer'), (u'kl\xe9ffen', u'kl\xe4ffen'), (u'Kl\xe9iren', u'Kl\xe4ren'), (u'Kl\xe9ranlage', u'Kl\xe4ranlage'), (u'Kl\xe9re', u'Kl\xe4re'), (u'kl\xe9ren', u'kl\xe4ren'), (u'Kn6pf', u'Kn\xf6pf'), (u'Knallttite', u'Knallt\xfcte'), (u'Knastwill', u'Knast will'), (u'Knderung', u'\xc4nderung'), (u'Knochengrfinde', u'Knochengr\xfcnde'), (u'Knofen', u'Knoten'), (u'Knuller', u'Kn\xfcller'), (u'Knupf', u'Kn\xfcpf'), (u'Knupfe', u'Kn\xfcpfe'), (u'knupfen', u'kn\xfcpfen'), (u'knzjipfe', u'kn\xfcpfe'), (u'Kn\xe9dell', u'Kn\xf6del!'), (u'kn\xe9pf', u'kn\xf6pf'), (u'Kn\xe9pfe', u'Kn\xf6pfe'), (u'Kn\xe9sten', u'Kn\xe4sten'), (u'Kofferraumschliissel', u'Kofferraumschl\xfcssel'), (u'Kohlens\xe9ure', u'Kohlens\xe4ure'), (u'Komaf\xe9lle', u'Komaf\xe4lle'), (u'Komaf\xe9llen', u'Komaf\xe4llen'), (u'Kombiise', u'Komb\xfcse'), (u'Kombuse', u'Komb\xfcse'), (u'Komiidie', u'Kom\xf6die'), (u'kommerz/ellen', u'kommerziellen'), (u'kommjetzt', u'komm jetzt'), (u'Kompatibilitfits', u'Kompatibilit\xe4ts'), (u'Kompatibilit\xe9its', u'Kompatibilit\xe4ts'), (u'Kompatiblit5ts', u'Kompatiblit\xe4ts'), (u'Kom\xe9die', u'Kom\xf6die'), (u'KONIGIN', u'K\xd6NIGIN'), (u'konne', u'k\xf6nne'), (u'konnen', u'k\xf6nnen'), (u'konnt', u'k\xf6nnt'), (u'konsen/ativ', u'konservativ'), (u'Kopfabreifimann', u'Kopfabrei\xdfmann'), (u'Kopfgeldj\xe9ger', u'Kopfgeldj\xe4ger'), (u'Kopfgeldj\xe9gern', u'Kopfgeldj\xe4gern'), (u'Kopfm\xe9fiig', u'Kopfm\xe4\xdfig'), (u'Kopfnijsse', u'Kopfn\xfcsse'), (u'kostengtlnstige', u'kosteng\xfcnstige'), (u'Kostiim', u'Kost\xfcm'), (u'Kostiimdesigner', u'Kost\xfcmdesigner'), (u'Kostiimdesignerin', u'Kost\xfcmdesignerin'), (u'Kostiimdrama', u'Kost\xfcmdrama'), (u'Kostiime', u'Kost\xfcme'), (u'Kostiims', u'Kost\xfcms'), (u'Kostume', u'Kost\xfcme'), (u'Kost\ufb02m', u'Kost\xfcm'), (u'kr/egen', u'kriegen'), (u'kr6ne', u'kr\xf6ne'), (u'kr6nen', u'kr\xf6nen'), (u'Kr6ten', u'Kr\xf6ten'), (u'Krafte', u'Kr\xe4fte'), (u'Kraftwfirfel', u'Kraftw\xfcrfel'), (u'Kranf\ufb02hrer', u'Kranf\xfchrer'), (u'Kreativit\xe9t', u'Kreativit\xe4t'), (u'Kreuzverhor', u'Kreuzverh\xf6r'), (u'krfiftiger', u'kr\xe4ftiger'), (u'Krfiutertee', u'Kr\xe4utertee'), (u'Kriegserkl\xe9rungen', u'Kriegserkl\xe4rungen'), (u'Kriegsfuhrung', u'Kriegsf\xfchrung'), (u'Kriegsschauplatze', u'Kriegsschaupl\xe4tze'), (u'Kriifte', u'Kr\xe4fte'), (u'Kriinung', u'Kr\xf6nung'), (u'Kriinungsfeier', u'Kr\xf6nungsfeier'), (u'Krijppel', u'Kr\xfcppel'), (u'Krijte', u'Kr\xf6te'), (u'Kronjuwell', u'Kronjuwel!'), (u'KROTE', u'KR\xd6TE'), (u'Krsche', u'\xc4rsche'), (u'Kr\xe9fte', u'Kr\xe4fte'), (u'Kr\xe9ften', u'Kr\xe4ften'), (u'Kr\xe9ftigsten', u'Kr\xe4ftigsten'), (u'Kr\xe9he', u'Kr\xe4he'), (u'kr\xe9ht', u'kr\xe4ht'), (u'kr\xe9ichzt', u'kr\xe4chzt'), (u'Kr\xe9ifte', u'Kr\xe4fte'), (u'Kr\xe9iutertee', u'Kr\xe4utertee'), (u'Kr\xe9mpfe', u'Kr\xe4mpfe'), (u'kr\xe9nte', u'kr\xf6nte'), (u'Kr\xe9te', u'Kr\xf6te'), (u'Kr\xe9tes', u'Kr\xf6tes'), (u'Kr\xe9utern', u'Kr\xe4utern'), (u'Kr\xe9utersenf', u'Kr\xe4utersenf'), (u'Ktiche', u'K\xfcche'), (u'Ktinige', u'K\xf6nige'), (u'ktinntest', u'k\xf6nntest'), (u'Ktisschen', u'K\xfcsschen'), (u'ktlmmere', u'k\xfcmmere'), (u'ktznnen', u'k\xf6nnen'), (u'Kuche', u'K\xfcche'), (u'KUCHE', u'K\xdcCHE'), (u'Kuckucksger\xe9usch', u'Kuckucksger\xe4usch'), (u"KUl'ZSCl'1lUSS9", u'K\xfcrzschl\xfcsse'), (u'kulz', u'kurz'), (u'kummer', u'k\xfcmmer'), (u'Kummere', u'K\xfcmmere'), (u'kummern', u'k\xfcmmern'), (u'kummert', u'k\xfcmmert'), (u'Kumpell', u'Kumpel!'), (u'Kunststficke', u'Kunstst\xfccke'), (u'Kunststticke', u'Kunstst\xfccke'), (u'Kuriosit\xe9ten', u'Kuriosit\xe4ten'), (u'kurzeste', u'k\xfcrzeste'), (u'kurzte', u'k\xfcrzte'), (u'Kurzwellenfunkger\xe9te', u'Kurzwellenfunkger\xe4te'), (u'Kurzzeitgediichtnis', u'Kurzzeitged\xe4chtnis'), (u'Kurzzeitged\xe9chtnis', u'Kurzzeitged\xe4chtnis'), (u'KUS1I\u20ac', u'K\xfcste'), (u'Kuschelhengstl', u'Kuschelhengst!'), (u'KUSSE', u'K\xdcSSE'), (u'KUSSGH', u'k\xfcssen'), (u'kusste', u'k\xfcsste'), (u'KUSTE', u'K\xdcSTE'), (u'Kuste', u'K\xfcste'), (u'K\xe9fer', u'K\xe4fer'), (u'K\xe9fig', u'K\xe4fig'), (u'k\xe9ime', u'k\xe4me'), (u'k\xe9impfen', u'k\xe4mpfen'), (u'k\xe9impfend', u'k\xe4mpfend'), (u'k\xe9impft', u'k\xe4mpft'), (u'k\xe9impfte', u'k\xe4mpfte'), (u'k\xe9impften', u'k\xe4mpften'), (u'k\xe9impftest', u'k\xe4mpftest'), (u'k\xe9impfwie', u'k\xe4mpf wie'), (u'K\xe9inguru', u'K\xe4nguru'), (u'k\xe9innen', u'k\xf6nnen'), (u'k\xe9innte', u'k\xf6nnte'), (u'K\xe9irper', u'K\xf6rper'), (u'K\xe9ise', u'K\xe4se'), (u'K\xe9isebrunnen', u'K\xe4sebrunnen'), (u'K\xe9lte', u'K\xe4lte'), (u'k\xe9lter', u'k\xe4lter'), (u'k\xe9lteste', u'k\xe4lteste'), (u'k\xe9me', u'k\xe4me'), (u'k\xe9men', u'k\xe4men'), (u'k\xe9mpfe', u'k\xe4mpfe'), (u'K\xe9mpfen', u'K\xe4mpfen'), (u'K\xe9mpfer', u'K\xe4mpfer'), (u'k\xe9mpferische', u'k\xe4mpferische'), (u'k\xe9mpfst', u'k\xe4mpfst'), (u'k\xe9mpft', u'k\xe4mpft'), (u'k\xe9mpfte', u'k\xe4mpfte'), (u'k\xe9mpften', u'k\xe4mpften'), (u'k\xe9mt', u'k\xe4mt'), (u'K\xe9nig', u'K\xf6nig'), (u'K\xe9nige', u'K\xf6nige'), (u'K\xe9nigin', u'K\xf6nigin'), (u'K\xe9niginl', u'K\xf6nigin!'), (u'K\xe9niginnen', u'K\xf6niginnen'), (u'k\xe9niglich', u'k\xf6niglich'), (u'k\xe9nigliche', u'k\xf6nigliche'), (u'k\xe9niglichen', u'k\xf6niglichen'), (u'k\xe9nigliches', u'k\xf6nigliches'), (u'K\xe9nigreich', u'K\xf6nigreich'), (u'K\xe9nigreichs', u'K\xf6nigreichs'), (u'K\xe9nigs', u'K\xf6nigs'), (u'K\xe9nigsfamilie', u'K\xf6nigsfamilie'), (u'k\xe9nne', u'k\xf6nne'), (u'k\xe9nnen', u'k\xf6nnen'), (u'k\xe9nnt', u'k\xf6nnt'), (u'k\xe9nnte', u'k\xf6nnte'), (u'K\xe9nnten', u'K\xf6nnten'), (u'K\xe9nntest', u'K\xf6nntest'), (u'K\xe9nntet', u'K\xf6nntet'), (u'K\xe9pfchen', u'K\xf6pfchen'), (u'K\xe9pfe', u'K\xf6pfe'), (u'K\xe9pfen', u'K\xf6pfen'), (u'k\xe9pft', u'k\xf6pft'), (u"K\xe9pt'n", u"K\xe4pt'n"), (u'K\xe9rbchen', u'K\xf6rbchen'), (u'K\xe9rbchengr\xe9fie', u'K\xf6rbchengr\xf6\xdfe'), (u'K\xe9rben', u'K\xf6rben'), (u'K\xe9rper', u'K\xf6rper'), (u'K\xe9rperfunktionen', u'K\xf6rperfunktionen'), (u'k\xe9rperlich', u'k\xf6rperlich'), (u'k\xe9rperliche', u'k\xf6rperliche'), (u'K\xe9rperproportionen', u'K\xf6rperproportionen'), (u'K\xe9rpersprache', u'K\xf6rpersprache'), (u'K\xe9rpertyp', u'K\xf6rpertyp'), (u'K\xe9rperverletzung', u'K\xf6rperverletzung'), (u'K\xe9rper\xe9ffnungen', u'K\xf6rper\xf6ffnungen'), (u'K\xe9se', u'K\xe4se'), (u'K\xe9sebrett', u'K\xe4sebrett'), (u'K\xe9secracker', u'K\xe4secracker'), (u'k\xe9stlich', u'k\xf6stlich'), (u'K\xe9ter', u'K\xf6ter'), (u'K\xe9tern', u'K\xf6tern'), (u'K\ufb02mmere', u'K\xfcmmere'), (u'k\ufb02mmern', u'k\xfcmmern'), (u"L'a'cherlich", u'L\xe4cherlich'), (u"L'a'ndern", u'L\xe4ndern'), (u"l'a'sst", u'l\xe4sst'), (u"l'a'uft", u'l\xe4uft'), (u'l/chtes', u'lichtes'), (u'l/Vings', u'Wings'), (u'L5cheln', u'L\xe4cheln'), (u'L6ffel', u'L\xf6ffel'), (u'L6schen', u'L\xf6schen'), (u'L6se', u'L\xf6se'), (u'l6sen', u'l\xf6sen'), (u'L6wen', u'L\xf6wen'), (u'L6win', u'L\xf6win'), (u'LADIESMANZ17', u'LADIESMAN217'), (u'Landh\xe9user', u'Landh\xe4user'), (u'Landstra\ufb02e', u'Landstra\xdfe'), (u'Lands\xe9iugetier', u'Lands\xe4ugetier'), (u'langl', u'lang!'), (u'langweiligl', u'langweilig!'), (u'Lasergestutzte', u'Lasergest\xfctzte'), (u'Laserzielger\xe9t', u'Laserzielger\xe4t'), (u'Lattenzaunwei\ufb02', u'Lattenzaunwei\xdf'), (u'Laudal', u'Lauda!'), (u'laufl', u'lauf!'), (u'Lau\ufb02', u'Lauf!'), (u'La\xdf', u'Lass'), (u'lch', u'Ich'), (u'ldee', u'Idee'), (u'ldeen', u'Ideen'), (u'ldelia', u'Idelia'), (u'ldentifikation', u'Identifikation'), (u'ldentifikationsnummer', u'Identifikationsnummer'), (u'ldentifikationssignal', u'Identifikationssignal'), (u'ldentifizierung', u'Identifizierung'), (u"ldentit'a'tsscheibe", u'ldentit\xe4tsscheibe'), (u'ldioten', u'Idioten'), (u'ldloten', u'Idioten'), (u'Le/d', u'Leid'), (u'Lebenl', u'Leben!'), (u'lebensf\xe9hig', u'lebensf\xe4hig'), (u'lebensl\xe9nglich', u'lebensl\xe4nglich'), (u'lebensmijlde', u'lebensm\xfcde'), (u'Lebersch\xe9den', u'Lebersch\xe4den'), (u'leergegessen', u'leer gegessen'), (u'legend\xe9re', u'legend\xe4re'), (u'legend\xe9ren', u'legend\xe4ren'), (u'Legion\xe9r', u'Legion\xe4r'), (u'Legion\xe9re', u'Legion\xe4re'), (u'Lehe', u'Lebe'), (u'Leichensch\xe9ndung', u'Leichensch\xe4ndung'), (u'leichtjemanden', u'leicht jemanden'), (u'leidl', u'leid!'), (u'Leistuljg', u'Leistung'), (u'Lelbwfichter', u'Leibw\xe4chter'), (u'Leld', u'Leid'), (u'lemen', u'lernen'), (u'Lenks\xe9ule', u'Lenks\xe4ule'), (u'lfidt', u'l\xe4dt'), (u'lfigt', u'l\xfcgt'), (u'lfinger', u'l\xe4nger'), (u'lfiuft', u'l\xe4uft'), (u'Lfiuterung', u'L\xe4uterung'), (u'lgitt', u'Igitt'), (u'lgnorier', u'Ignorier'), (u'lhm', u'Ihm'), (u'lhn', u'Ihn'), (u'lhnen', u'Ihnen'), (u'lhnenl', u'Ihnen!'), (u'lhr', u'Ihr'), (u'lhre', u'Ihre'), (u'lhrem', u'Ihrem'), (u'lhren', u'Ihren'), (u'lhrer', u'Ihrer'), (u'lhrerverffigung', u'Ihrer Verf\xfcgung'), (u'lhres', u'Ihres'), (u'lhrfehlt', u'Ihr fehlt'), (u'lhrjemalsjemanden', u'lhr jemals jemanden'), (u'lhrVerteidiger', u'lhr Verteidiger'), (u'Libel', u'\xfcbel'), (u'Libelwollen', u'\xfcbelwollen'), (u'Liben', u'\xfcben'), (u'Liber', u'\xfcber'), (u'Liberall', u'\xfcberall'), (u'Liberdenken', u'\xfcberdenken'), (u'Liberdrllissig', u'\xfcberdr\xfcssig'), (u'Liberfallen', u'\xfcberfallen'), (u'Libergebrannt', u'\xfcbergebrannt'), (u'Liberhaupt', u'\xfcberhaupt'), (u'Liberlasst', u'\xfcberlasst'), (u'Liberleben', u'\xdcberleben'), (u'Liberlegen', u'\xfcberlegen'), (u'Liberlegt', u'\xfcberlegt'), (u'Libernimmt', u'\xfcbernimmt'), (u'Liberpriift', u'\xfcberpr\xfcft'), (u'Liberreden', u'\xfcberreden'), (u'Libersteht', u'\xfcbersteht'), (u'Liberstllirzen', u'\xfcberst\xfcrzen'), (u'Liberwachen', u'\xfcberwachen'), (u'Liberwacht', u'\xfcberwacht'), (u'Liberwinden', u'\xfcberwinden'), (u'Liberw\xe9ltigen', u'\xfcberw\xe4ltigen'), (u'Liberw\xe9ltigt', u'\xfcberw\xe4ltigt'), (u'Liberzeugt', u'\xfcberzeugt'), (u'Lible', u'\xfcble'), (u'Liblich', u'\xfcblich'), (u'Libliche', u'\xdcbliche'), (u'Librig', u'\xfcbrig'), (u'lie/3', u'lie\xdf'), (u'lie/Se', u'lie\xdfe'), (u'lieB', u'lie\xdf'), (u'lieBe', u'lie\xdfe'), (u'liebenswilrdig', u'liebensw\xfcrdig'), (u'liebenswurdiger', u'liebensw\xfcrdiger'), (u'Liebesgestiindnis', u'Liebesgest\xe4ndnis'), (u'Lieblingsbesch\xe9ftigung', u'Lieblingsbesch\xe4ftigung'), (u'Lieblingsrockerl', u'Lieblingsrocker!'), (u'Lieblingss\xe9tze', u'Lieblingss\xe4tze'), (u'lief2>en', u'lie\xdfen'), (u'Liefergebiihren', u'Liefergeb\xfchren'), (u'lieflsen', u'lie\xdfen'), (u'liegenlassen', u'liegen lassen'), (u'Liehe', u'Liebe'), (u'lieli', u'lie\xdf'), (u'lielien', u'lie\xdfen'), (u'Liellen', u'Lie\xdfen'), (u'liells', u'lie\xdf'), (u'lien', u'lie\xdf'), (u'Liicher', u'L\xf6cher'), (u'Liige', u'L\xfcge'), (u'Liigner', u'L\xfcgner'), (u'liinger', u'l\xe4nger'), (u'liischen', u'l\xf6schen'), (u'liischt', u'l\xf6scht'), (u'Liisst', u'L\xe4sst'), (u'liist', u'l\xf6st'), (u'Liisung', u'L\xf6sung'), (u'Liisungen', u'L\xf6sungen'), (u'Liiwen', u'L\xf6wen'), (u'Lii\ufb02ung', u'L\xfcftung'), (u'lijgen', u'l\xfcgen'), (u'Lijgner', u'L\xfcgner'), (u'Lilgner', u'L\xfcgner'), (u'lilgst', u'l\xfcgst'), (u'lilgt', u'l\xfcgt'), (u'Lilterer', u'\xc4lterer'), (u'LIMOUSINENSERVICE10I06', u'LIMOUSINENSERVICE 10:06'), (u'linger', u'l\xe4nger'), (u"lke's", u"Ike's"), (u'lkone', u'Ikone'), (u"lL'lgt", u'l\xfcgt'), (u'Llberstehen', u'\xfcberstehen'), (u'Llebe', u'Liebe'), (u'llebt', u'liebt'), (u'lllfie', u'Wie'), (u'lllfillensstark', u'Willensstark'), (u"lllfillie's", u"Willie's"), (u'lllfir', u'Wir'), (u'Lllignerl', u'L\xfcgner!'), (u'llligtl', u'l\xfcgt!'), (u'lllusionen', u'Illusionen'), (u'llngst', u'l\xe4ngst'), (u'llztlicher', u'\xe4rztlicher'), (u'lm', u'Im'), (u'lmbiss', u'Imbiss'), (u'lmmer', u'Immer'), (u'lmmigranten', u'Immigranten'), (u'lmpuls', u'Impuls'), (u'lmpulsantrieb', u'Impulsantrieb'), (u'lndianer', u'Indianer'), (u'lndianerin', u'Indianerin'), (u'lndianerm\xe9dchen', u'Indianerm\xe4dchen'), (u'lndianertanz', u'Indianertanz'), (u'lndikation', u'Indikation'), (u'lndividualit\xe9t', u'Individualit\xe4t'), (u'lndividuen', u'Individuen'), (u'lndividuum', u'Individuum'), (u'lnduktion', u'Induktion'), (u'lneffizienz', u'Ineffizienz'), (u'lnformationen', u'Informationen'), (u'lnfos', u'Infos'), (u'lngenieur', u'Ingenieur'), (u'lngenieure', u'Ingenieure'), (u'lnhalt', u'Inhalt'), (u'lnhalte', u'Inhalte'), (u'lnnenraum', u'Innenraum'), (u'lnnenr\xe9ume', u'Innenr\xe4ume'), (u'lnsekt', u'Insekt'), (u'lnsekten', u'Insekten'), (u'lnsel', u'Insel'), (u'lnserat', u'Inserat'), (u'lnspektion', u'Inspektion'), (u'lnstinkt', u'Instinkt'), (u'lnstinkte', u'Instinkte'), (u'lnstitut', u'Institut'), (u'lnstrumente', u'Instrumente'), (u'lnstrumentenwagen', u'Instrumentenwagen'), (u'lnsubordination', u'Insubordination'), (u'lntellektuellste', u'Intellektuellste'), (u'lntelligenz', u'Intelligenz'), (u'lntensivstation', u'Intensivstation'), (u'lnteraktion', u'Interaktion'), (u'lnteresse', u'Interesse'), (u'lnteressen', u'Interessen'), (u'lnternat', u'Internat'), (u'lntrigantin', u'Intrigantin'), (u'lntrigantl', u'Intrigant!'), (u'lntrigen', u'Intrigen'), (u'lnverness', u'Inverness'), (u'lnvestition', u'Investition'), (u'lnvestoren', u'Investoren'), (u'lnzucht', u'Inzucht'), (u'lo', u'Io'), (u'Lordk\xe9mmerer', u'Lordk\xe4mmerer'), (u'losf', u'los!'), (u'losl', u'los!'), (u'losw\ufb02rde', u'losw\xfcrde'), (u'Lou/e', u'Louie'), (u'Loyalit\xe9t', u'Loyalit\xe4t'), (u'lrak', u'Irak'), (u'lraner', u'Iraner'), (u'lren', u'Iren'), (u'Lrgendetvvas', u'Irgendetwas'), (u'lrland', u'Irland'), (u'lronhide', u'Ironhide'), (u'lronie', u'Ironie'), (u'lrre', u'Irre'), (u'lrren', u'Irren'), (u'lrrenanstalt', u'Irrenanstalt'), (u'lrrenhaus', u'Irrenhaus'), (u'lrrer', u'Irrer'), (u'lrrgarten', u'Irrgarten'), (u'lrrlicht', u'Irrlicht'), (u'lrrlichter', u'Irrlichter'), (u'lrrsinn', u'Irrsinn'), (u'lrrsinns', u'Irrsinns'), (u'lrrtum', u'Irrtum'), (u'lscandar', u'Iscandar'), (u'lscandars', u'Iscandars'), (u'lsolierband', u'Isolierband'), (u'lss', u'Iss'), (u'lstja', u'Ist ja'), (u'ltaker', u'Itaker'), (u'ltakerflossen', u'Itakerflossen'), (u'ltalo', u'Italo'), (u'Ltiffel', u'L\xf6ffel'), (u'ltlgen', u'l\xfcgen'), (u'Lufijagen', u'Luft jagen'), (u'Luftballonsl', u'Luftballons!'), (u'Luftjagen', u'Luft jagen'), (u'Luftunterst\ufb02tzung', u'Luftunterst\xfctzung'), (u'LUgen', u'L\xfcgen'), (u'lvl\xe9idchen', u'M\xe4dchen'), (u'lwan', u'Iwan'), (u"l\xa7uft's", u"l\xe4uft's"), (u'L\xe9chelmfinderl', u'L\xe4chelm\xfcnder!'), (u'l\xe9cheln', u'l\xe4cheln'), (u'l\xe9chelt', u'l\xe4chelt'), (u'L\xe9cher', u'L\xf6cher'), (u'L\xe9cherlich', u'L\xe4cherlich'), (u'l\xe9cherliches', u'l\xe4cherliches'), (u'L\xe9chle', u'L\xe4chle'), (u'l\xe9dt', u'l\xe4dt'), (u'L\xe9ffel', u'L\xf6ffel'), (u'l\xe9ge', u'l\xe4ge'), (u'L\xe9icheln', u'L\xe4cheln'), (u'L\xe9icherlich', u'L\xe4cherlich'), (u'l\xe9ichle', u'l\xe4chle'), (u'L\xe9indchen', u'L\xe4ndchen'), (u'l\xe9ingst', u'l\xe4ngst'), (u'l\xe9isen', u'l\xf6sen'), (u'l\xe9issig', u'l\xe4ssig'), (u'l\xe9isst', u'l\xe4sst'), (u'L\xe9iuft', u'L\xe4uft'), (u'L\xe9jsung', u'L\xf6sung'), (u'L\xe9mmchen', u'L\xe4mmchen'), (u'L\xe9mmer', u'L\xe4mmer'), (u'L\xe9nder', u'L\xe4nder'), (u'L\xe9ndern', u'L\xe4ndern'), (u'L\xe9nge', u'L\xe4nge'), (u'L\xe9ngen', u'L\xe4ngen'), (u'l\xe9nger', u'l\xe4nger'), (u'l\xe9ngst', u'l\xe4ngst'), (u'l\xe9ngste', u'l\xe4ngste'), (u'L\xe9rm', u'L\xe4rm'), (u'L\xe9rmbeschwerden', u'L\xe4rmbeschwerden'), (u'l\xe9schen', u'l\xf6schen'), (u'L\xe9se', u'L\xf6se'), (u'L\xe9segeld', u'L\xf6segeld'), (u'l\xe9sst', u'l\xe4sst'), (u'l\xe9st', u'l\xf6st'), (u'l\xe9ste', u'l\xf6ste'), (u'l\xe9sten', u'l\xf6sten'), (u'l\xe9stig', u'listig'), (u'L\xe9sung', u'L\xf6sung'), (u'l\xe9ufig', u'l\xe4ufig'), (u'l\xe9ufst', u'l\xe4ufst'), (u'L\xe9uft', u'L\xe4uft'), (u'l\xe9uten', u'l\xe4uten'), (u'l\xe9utet', u'l\xe4utet'), (u'L\xe9we', u'L\xf6we'), (u'L\ufb02gner', u'L\xfcgner'), (u"M'a'dchen", u'M\xe4dchen'), (u'm/ese', u'miese'), (u'M/ffsommernachfsfraum', u'Mittsommernachtstraum'), (u'M/r', u'Mir'), (u'M0I8KUI', u'Molek\xfcl'), (u'm6belt', u'm\xf6belt'), (u'm6chte', u'm\xf6chte'), (u'm6chtest', u'm\xf6chtest'), (u'm6gen', u'm\xf6gen'), (u'm6glich', u'm\xf6glich'), (u'm6glichen', u'm\xf6glichen'), (u'm6glicher', u'm\xf6glicher'), (u'm6gt', u'm\xf6gt'), (u'M6rder', u'M\xf6rder'), (u'MaB', u'Ma\xdf'), (u'MaBgabe', u'Ma\xdfgabe'), (u'mac/1e', u'mache'), (u'mac/7', u'nach'), (u'machs', u"mach's"), (u'Machtiibernahme', u'Macht\xfcbernahme'), (u'madenschw\xe9inziger', u'madenschw\xe4nziger'), (u'Mafinahme', u'Ma\xdfnahme'), (u'Magengeschwiire', u'Magengeschw\xfcre'), (u'Magengeschwilr', u'Magengeschw\xfcr'), (u'Magengeschwtir', u'Magengeschw\xfcr'), (u'Magnolienbliiten', u'Magnolienbl\xfcten'), (u'Majesfait', u'Majest\xe4t'), (u'Majest\xe9it', u'Majest\xe4t'), (u'Majest\xe9t', u'Majest\xe4t'), (u'Majest\xe9ten', u'Majest\xe4ten'), (u'Mal2>en', u'Ma\xdfen'), (u'Mal3en', u'Ma\xdfen'), (u'malf', u'mal!'), (u'Malinahme', u'Ma\xdfnahme'), (u'mall', u'mal!'), (u'Mallregelten', u'Ma\xdfregelten'), (u'Mandverstation', u'Man\xf6verstation'), (u'Manfiver', u'Man\xf6ver'), (u'Maniiver', u'Man\xf6ver'), (u'Manikfire', u'Manik\xfcre'), (u'Mannscha\ufb02', u'Mannschaft'), (u"Mansclle\ufb02'enkm'5pfe", u'Manschettenkn\xf6pfe'), (u'Man\xe9iver', u'Man\xf6ver'), (u'Man\xe9ver', u'Man\xf6ver'), (u'man\xe9vrieren', u'man\xf6vrieren'), (u'man\xe9vrierf\xe9hig', u'man\xf6vrierf\xe4hig'), (u'Man\xe9vriermodus', u'Man\xf6vriermodus'), (u'Margoliserklfirung', u'Margoliserkl\xe4rung'), (u'Margoliserkl\xe9rung', u'Margoliserkl\xe4rung'), (u'marsch\xe9hnliche', u'marsch\xe4hnliche'), (u'Massagestllihlen', u'Massagest\xfchlen'), (u'Massenzerst\xe9rung', u'Massenzerst\xf6rung'), (u'Massenzerst\xe9rungswaffen', u'Massenzerst\xf6rungswaffen'), (u'Mater/al', u'Material'), (u'Maxiriicke', u'Maxir\xf6cke'), (u'Mayonaise', u'Mayonnaise'), (u'mbglichst', u'm\xf6glichst'), (u'Mdge', u'M\xf6ge'), (u'mdglichen/veise', u'm\xf6glicherweise'), (u'mdglicherweise', u'm\xf6glicherweise'), (u'Mdglichkeit', u'M\xf6glichkeit'), (u'me/n', u'mein'), (u'mehrZeit', u'mehr Zeit'), (u"mein'ja", u"mein' ja"), (u'meinerjetzigen', u'meiner jetzigen'), (u'Meinungs\xe9ufierung', u'Meinungs\xe4u\xdferung'), (u'Meisterbr\xe9u', u'Meisterbr\xe4u'), (u'Meisterstijck', u'Meisterst\xfcck'), (u'meistgehasste', u'meist gehasste'), (u'meln', u'mein'), (u'melne', u'meine'), (u'Mend', u'Mond'), (u'Menschenh\xe9indler', u'Menschenh\xe4ndler'), (u'Menstruationsst\xe9rungen', u'Menstruationsst\xf6rungen'), (u'Merkwiirdig', u'Merkw\xfcrdig'), (u'Merkwiirdige', u'Merkw\xfcrdige'), (u'merkwiirdiger', u'merkw\xfcrdiger'), (u'merkwilrdig', u'merkw\xfcrdig'), (u'merkwlllrdige', u'merkw\xfcrdige'), (u'merkwurdig', u'merkw\xfcrdig'), (u'merkwurolig', u'merkw\xfcrdig'), (u'merkw\ufb02rdig', u'merkw\xfcrdig'), (u'Messger\xe9t', u'Messger\xe4t'), (u'mfichte', u'm\xf6chte'), (u'Mfichten', u'M\xf6chten'), (u'Mfidchen', u'M\xe4dchen'), (u'Mfidchenl', u'M\xe4dchen!'), (u'Mfidels', u'M\xe4dels'), (u'mfigen', u'm\xf6gen'), (u'Mfigliche', u'M\xf6gliche'), (u'mfiglichen', u'm\xf6glichen'), (u'mfiglicherweise', u'm\xf6glicherweise'), (u'Mfill', u'M\xfcll'), (u'Mfillhalde', u'M\xfcllhalde'), (u'Mfinchen', u'M\xfcnchen'), (u'Mfinder', u'M\xfcnder'), (u'Mfinnern', u'M\xe4nnern'), (u'Mfissen', u'M\xfcssen'), (u'mfisst', u'm\xfcsst'), (u'mfisste', u'm\xfcsste'), (u'Mfjrder', u'M\xf6rder'), (u'Midchen', u'M\xe4dchen'), (u'Migrane', u'Migr\xe4ne'), (u'Migr\xe9ne', u'Migr\xe4ne'), (u'Migr\ufb02ne', u'Migr\xe4ne'), (u'miichte', u'm\xf6chte'), (u'Miichtegern', u'M\xf6chtegern'), (u'Miichten', u'M\xf6chten'), (u'miichtest', u'm\xf6chtest'), (u'miide', u'm\xfcde'), (u'Miidels', u'M\xe4dels'), (u'miides', u'm\xfcdes'), (u'miige', u'm\xf6ge'), (u'miigen', u'm\xf6gen'), (u'miiglich', u'm\xf6glich'), (u'miigliche', u'm\xf6gliche'), (u'miiglichen', u'm\xf6glichen'), (u'miigliches', u'm\xf6gliches'), (u'Miiglichkeit', u'M\xf6glichkeit'), (u'Miiglichkeiten', u'M\xf6glichkeiten'), (u'miigt', u'm\xf6gt'), (u'Miill', u'M\xfcll'), (u'Miillhalde', u'M\xfcllhalde'), (u'Miilltonnen', u'M\xfclltonnen'), (u'miilssen', u'm\xfcssen'), (u'miirderisch', u'm\xf6rderisch'), (u'miisse', u'm\xfcsse'), (u'Miissen', u'M\xfcssen'), (u'miisst', u'm\xfcsst'), (u'miisste', u'm\xfcsste'), (u'Miiuse', u'M\xe4use'), (u'mijchte', u'm\xf6chte'), (u'Mijcken', u'M\xfccken'), (u'Mijhe', u'M\xfche'), (u'Mijnzen', u'M\xfcnzen'), (u'mijssen', u'm\xfcssen'), (u'mijsst', u'm\xfcsst'), (u'mijsste', u'm\xfcsste'), (u'mijsstest', u'm\xfcsstest'), (u'Milchstrafie', u'Milchstra\xdfe'), (u'Milhe', u'M\xfche'), (u'Milhle', u'M\xfchle'), (u'MILITAR', u'MILIT\xc4R'), (u'Militiirprogramme', u'Milit\xe4rprogramme'), (u'Militir', u'Milit\xe4r'), (u'militlrische', u'milit\xe4rische'), (u'Milit\xe9irkodex', u'Milit\xe4rkodex'), (u'Milit\xe9r', u'Milit\xe4r'), (u'Milit\xe9rakademie', u'Milit\xe4rakademie'), (u'Milit\xe9rdienst', u'Milit\xe4rdienst'), (u'milit\xe9rischen', u'milit\xe4rischen'), (u'Milit\xe9rkodex', u'Milit\xe4rkodex'), (u'Milit\xe9rluftraum', u'Milit\xe4rluftraum'), (u'Milit\xe9rnetzwerk', u'Milit\xe4rnetzwerk'), (u'Milit\xe9rs', u'Milit\xe4rs'), (u'Milit\xe9rsystem', u'Milit\xe4rsystem'), (u'Millbilligung', u'Missbilligung'), (u'Millefs', u"Miller's"), (u'Millgeburt', u'Missgeburt'), (u'Milliard\xe9iren', u'Milliard\xe4ren'), (u'Million\xe9rssohn', u'Million\xe4rssohn'), (u'Milli\xe9quivalent', u'Milli\xe4quivalent'), (u'Millltonne', u'M\xfclltonne'), (u'millverstanden', u'missverstanden'), (u'milssen', u'm\xfcssen'), (u'milsst', u'm\xfcsst'), (u'milsste', u'm\xfcsste'), (u'milssten', u'm\xfcssten'), (u'Miltter', u'M\xfctter'), (u'Minenraumen', u'Minenr\xe4umen'), (u'Miniriicke', u'Minir\xf6cke'), (u'mirglauben', u'mir glauben'), (u'mirja', u'mir ja'), (u'mirje', u'mir je'), (u'mirjeglichen', u'mir jeglichen'), (u'mirjemals', u'mir jemals'), (u'mirjemand', u'mir jemand'), (u'mirjetzt', u'mir jetzt'), (u'mirso', u'mir so'), (u'mirvon', u'mir von'), (u'mirzu', u'mir zu'), (u'Miserabell', u'Miserabel!'), (u'missf\xe9llt', u'missf\xe4llt'), (u'Missverstfindnisl', u'Missverst\xe4ndnis!'), (u'Missverstiindnis', u'Missverst\xe4ndnis'), (u'Missverst\xe9ndnis', u'Missverst\xe4ndnis'), (u'Missverst\xe9ndnissen', u'Missverst\xe4ndnissen'), (u'Mistkerlel', u'Mistkerle!'), (u'Mistkiiter', u'Mistk\xf6ter'), (u'Miststiick', u'Mistst\xfcck'), (u'Mistst\ufb02cke', u'Mistst\xfccke'), (u'Mitbijrger', u'Mitb\xfcrger'), (u'Mitbilrger', u'Mitb\xfcrger'), (u'mitfiihlend', u'mitf\xfchlend'), (u'mitfiihlender', u'mitf\xfchlender'), (u'mitfuhlend', u'mitf\xfchlend'), (u'Mitgefiihl', u'Mitgef\xfchl'), (u'Mitgefuhl', u'Mitgef\xfchl'), (u'mitgehiirt', u'mitgeh\xf6rt'), (u'mitgez\xe9hlt', u'mitgez\xe4hlt'), (u'mitjedem', u'mit jedem'), (u'mitjemandem', u'mit jemandem'), (u'mittlen/veile', u'mittlerweile'), (u"ML'1nze", u'M\xfcnze'), (u'mlch', u'mich'), (u'Mldchen', u'M\xe4dchen'), (u'mLissen', u'm\xfcssen'), (u'Mljnder', u'M\xfcnder'), (u'Mllillschlucker', u'M\xfcllschlucker'), (u'Mllindel', u'M\xfcndel'), (u'Mllindung', u'M\xfcndung'), (u'mllissen', u'm\xfcssen'), (u'mllisst', u'm\xfcsst'), (u'Mlllhe', u'M\xfche'), (u'Mllllon', u'Million'), (u'Mllllonen', u'Millionen'), (u'mlllsst', u'm\xfcsst'), (u'Mllltterjedoch', u'M\xfctter jedoch'), (u'Mlnnern', u'M\xe4nnern'), (u'mlr', u'mir'), (u'mlrl', u'mir!'), (u'mlt', u'mit'), (u'moglich', u'm\xf6glich'), (u'Moglichkeit', u'M\xf6glichkeit'), (u'Moglichkeiten', u'M\xf6glichkeiten'), (u'Molekijle', u'Molek\xfcle'), (u"MolekL'lle", u'Molek\xfcle'), (u'Mondeinhiirner', u'Mondeinh\xf6rner'), (u'Mondeinhiirnerl', u'Mondeinh\xf6rner!'), (u'Mondeinh\xe9irner', u'Mondeinh\xf6rner'), (u'Mondk\xe9ilber', u'Mondk\xe4lber'), (u'Monl', u'Mom'), (u'MONTONEI', u'MONTONE:'), (u'Mordsiiberraschung', u'Mords\xfcberraschung'), (u'Mordverd\xe9chtiger', u'Mordverd\xe4chtiger'), (u'Morsealphabetl', u'Morsealphabet!'), (u'Motorger\xe9usch', u'Motorger\xe4usch'), (u'Motorger\xe9usche', u'Motorger\xe4usche'), (u"Mousset\ufb02e's", u"Moussette's"), (u'Mowen', u'M\xf6wen'), (u'Mtihe', u'M\xfche'), (u'Mtillschlucker', u'M\xfcllschlucker'), (u'mtissen', u'm\xfcssen'), (u'mtissenl', u'm\xfcssen!'), (u'Mtitzel', u'M\xfctze!'), (u'mtlde', u'm\xfcde'), (u'mtlsste', u'm\xfcsste'), (u'muBt', u'musst'), (u'Mucken', u'M\xfccken'), (u'mucksm\xe9uschenstill', u'mucksm\xe4uschenstill'), (u'mude', u'm\xfcde'), (u'Muhe', u'M\xfche'), (u'MUII', u'M\xfcll'), (u'mull', u'muss'), (u'MULL', u'M\xdcLL'), (u'mullte', u'musste'), (u'Mundl', u'Mund!'), (u'Mundung', u'M\xfcndung'), (u'Munzfernsprecher', u'M\xfcnzfernsprecher'), (u'Muskatnijsse', u'Muskatn\xfcsse'), (u'Muskelkumpelsl', u'Muskelkumpels!'), (u'muskul\xe9ren', u'muskul\xe4ren'), (u'mussen', u'm\xfcssen'), (u'MUSSEN', u'M\xdcSSEN'), (u"mUssen's", u"m\xfcssen's"), (u"muss_'\xa7e", u'musste'), (u'Musterschuler', u'Mustersch\xfcler'), (u'Mutterja', u'Mutter ja'), (u'mutterlich', u'm\xfctterlich'), (u'Mutze', u'M\xfctze'), (u'mu\xdf', u'muss'), (u'mu\xdft', u'musst'), (u'mu\xdfte', u'musste'), (u"mx't", u'mit'), (u'Mzlinnern', u'M\xe4nnern'), (u'M\xe9bel', u'M\xf6bel'), (u'm\xe9cht', u'm\xf6cht'), (u'M\xe9chte', u'M\xe4chte'), (u'm\xe9chte', u'm\xf6chte'), (u'M\xe9chtegern', u'M\xf6chtegern'), (u'm\xe9chten', u'm\xf6chten'), (u'm\xe9chtest', u'm\xf6chtest'), (u'm\xe9chtet', u'm\xf6chtet'), (u'm\xe9chtig', u'm\xe4chtig'), (u'm\xe9chtige', u'm\xe4chtige'), (u'm\xe9chtigen', u'm\xe4chtigen'), (u'm\xe9chtiger', u'm\xe4chtiger'), (u'm\xe9chtiges', u'm\xe4chtiges'), (u'm\xe9chtigste', u'm\xe4chtigste'), (u'm\xe9chtigsten', u'm\xe4chtigsten'), (u'M\xe9dchen', u'M\xe4dchen'), (u'M\xe9dchenh\xe9nden', u'M\xe4dchenh\xe4nden'), (u'M\xe9dchens', u'M\xe4dchens'), (u'M\xe9del', u'M\xe4del'), (u'M\xe9dels', u'M\xe4dels'), (u'M\xe9delsl', u'M\xe4dels!'), (u'M\xe9fiigung', u'M\xe4\xdfigung'), (u'm\xe9ge', u'm\xf6ge'), (u'M\xe9gen', u'M\xf6gen'), (u'M\xe9glich', u'M\xf6glich'), (u'm\xe9gliche', u'm\xf6gliche'), (u'M\xe9glichen', u'M\xf6glichen'), (u'M\xe9gliches', u'M\xf6gliches'), (u'M\xe9glichkeit', u'M\xf6glichkeit'), (u'M\xe9glichkeiten', u'M\xf6glichkeiten'), (u'm\xe9glichst', u'm\xf6glichst'), (u'm\xe9gt', u'm\xf6gt'), (u'm\xe9ichtig', u'm\xe4chtig'), (u'm\xe9ichtige', u'm\xe4chtige'), (u'm\xe9ichtigen', u'm\xe4chtigen'), (u'm\xe9ichtiger', u'm\xe4chtiger'), (u'M\xe9idchen', u'M\xe4dchen'), (u'M\xe9idel', u'M\xe4del'), (u'M\xe9inner', u'M\xe4nner'), (u'M\xe9innl', u'M\xe4nnl'), (u'm\xe9innlicher', u'm\xe4nnlicher'), (u'M\xe9irder', u'M\xf6rder'), (u'M\xe9irz', u'M\xe4rz'), (u'M\xe9nnchen', u'M\xe4nnchen'), (u'M\xe9nnchens', u'M\xe4nnchens'), (u'M\xe9nner', u'M\xe4nner'), (u'M\xe9nnerfreundschaft', u'M\xe4nnerfreundschaft'), (u'M\xe9nnern', u'M\xe4nnern'), (u'M\xe9nnersache', u'M\xe4nnersache'), (u'm\xe9nnlich', u'm\xe4nnlich'), (u'm\xe9nnliche', u'm\xe4nnliche'), (u'M\xe9ntel', u'M\xe4ntel'), (u'M\xe9olel', u'M\xe4del'), (u'M\xe9olels', u'M\xe4dels'), (u'M\xe9rchen', u'M\xe4rchen'), (u'M\xe9rchenl', u'M\xe4rchen!'), (u'M\xe9rchenprinzen', u'M\xe4rchenprinzen'), (u'M\xe9rder', u'M\xf6rder'), (u'M\xe9rtyrer', u'M\xe4rtyrer'), (u'M\xe9rz', u'M\xe4rz'), (u'M\xe9tresse', u'M\xe4tresse'), (u'M\xe9uschen', u'M\xe4uschen'), (u'M\xe9use', u'M\xe4use'), (u'M\xe9usehtipfer', u'M\xe4useh\xfcpfer'), (u'M\xe9usen', u'M\xe4usen'), (u'M\xe9userennen', u'M\xe4userennen'), (u'm\xfc\xdft', u'm\xfcsst'), (u'm\ufb02de', u'm\xfcde'), (u'm\ufb02ssen', u'm\xfcssen'), (u"n'a'chste", u'n\xe4chste'), (u"n'a'hert", u'n\xe4hert'), (u'n/chfs', u'nichts'), (u'n/chi', u'nicht'), (u'N/ck', u'Nick'), (u'n/e', u'nie'), (u'N6', u'N\xf6'), (u'n6tig', u'n\xf6tig'), (u'nac/1', u'nach'), (u'Nachf', u'Nacht'), (u'nachllssig', u'nachl\xe4ssig'), (u'nachl\xe9ssig', u'nachl\xe4ssig'), (u'nachl\xe9sst', u'nachl\xe4sst'), (u'nachprufen', u'nachpr\xfcfen'), (u'Nachschlussel', u'Nachschl\xfcssel'), (u'Nachste', u'N\xe4chste'), (u'NAHERT', u'N\xc4HERT'), (u'NAHERTE', u'N\xc4HERTE'), (u'Nat/on', u'Nation'), (u'natfirlich', u'nat\xfcrlich'), (u'Natiilrlich', u'Nat\xfcrlich'), (u'Natiirlich', u'Nat\xfcrlich'), (u'Natiirllch', u'Nat\xfcrlich'), (u'natijrlich', u'nat\xfcrlich'), (u'natijrlichen', u'nat\xfcrlichen'), (u'natilrlich', u'nat\xfcrlich'), (u'natilrliche', u'nat\xfcrliche'), (u"natL'lrlich", u'nat\xfcrlich'), (u'Natllirlich', u'Nat\xfcrlich'), (u'Nattirlich', u'Nat\xfcrlich'), (u'Nattlrlich', u'Nat\xfcrlich'), (u'Nattlrliohl', u'Nat\xfcrlich!'), (u'Naturlich', u'Naturloch'), (u'naturlich', u'nat\xfcrlich'), (u'naturlichen', u'nat\xfcrlichen'), (u'naturlichsten', u'nat\xfcrlichsten'), (u'Navajoweifi', u'Navajowei\xdf'), (u'ndtige', u'n\xf6tige'), (u'ne/n', u'nein'), (u'Nebengeb\xe9ude', u'Nebengeb\xe4ude'), (u'Nebengesch\xe9ift', u'Nebengesch\xe4ft'), (u'neffes', u'nettes'), (u'Nehmf', u'Nehmt'), (u'neinl', u'nein!'), (u'Neln', u'Nein'), (u'nerv6s', u'nerv\xf6s'), (u'Nervens\xe9ge', u'Nervens\xe4ge'), (u'Nervens\xe9ige', u'Nervens\xe4ge'), (u'nerviis', u'nerv\xf6s'), (u'Nerv\xe9s', u'Nerv\xf6s'), (u'ner\\/t', u'nervt'), (u'Neuankiimmlinge', u'Neuank\xf6mmlinge'), (u'neuromuskul\xe9ren', u'neuromuskul\xe4ren'), (u'Neuzug\xe9inge', u'Neuzug\xe4nge'), (u'Nfichster', u'N\xe4chster'), (u'NIANN', u'MANN'), (u'nichsten', u'n\xe4chsten'), (u'nichtim', u'nicht im'), (u'nichtjemand', u'nicht jemand'), (u'Nichtjetzt', u'Nicht jetzt'), (u'Nichtsl', u'Nichts!'), (u'nichtzurilckgelassen', u'nicht zur\xfcckgelassen'), (u'nic_l_1t', u'nicht'), (u'niederk\xe9mpfen', u'niederk\xe4mpfen'), (u'niederliells', u'niederlie\xdf'), (u'niedlichl', u'niedlich!'), (u'niher', u'n\xe4her'), (u'niichsten', u'n\xe4chsten'), (u'niichstes', u'n\xe4chstes'), (u'niirgeln', u'n\xf6rgeln'), (u'niitig', u'n\xf6tig'), (u'niitige', u'n\xf6tige'), (u'Nijssen', u'N\xfcssen'), (u'Nijsternl', u'N\xfcstern!'), (u'nijtzlich', u'n\xfctzlich'), (u'nilchtern', u'n\xfcchtern'), (u'niltzen', u'n\xfctzen'), (u'Nlagnaten', u'Magnaten'), (u'Nlannern', u'M\xe4nnern'), (u'nlchste', u'n\xe4chste'), (u'nlchsthoheren', u'n\xe4chsth\xf6heren'), (u'nlcht', u'nicht'), (u'nle', u'nie'), (u'Nlemalsl', u'Niemals!'), (u'Nlhe', u'N\xe4he'), (u'nlir', u'mir'), (u'nllitzen', u'n\xfctzen'), (u'Nl\xe9inner', u'M\xe4nner'), (u'noc/1', u'noch'), (u"Not/'all", u'Notfall'), (u'Notfalll', u'Notfall!'), (u'notig', u'n\xf6tig'), (u'notigen', u'n\xf6tigen'), (u'Notliige', u'Notl\xfcge'), (u'Notziindung', u'Notz\xfcndung'), (u'NUFI', u'Nur:'), (u'Nunja', u'Nun ja'), (u'Nurdich', u'Nur dich'), (u'nureins', u'nur eins'), (u'nurflustern', u'nur fl\xfcstern'), (u'Nurjetzt', u'Nur jetzt'), (u'nurl', u'nur 1'), (u'nurwunscht', u'nur w\xfcnscht'), (u'Nurzu', u'Nur zu'), (u'nus', u'aus'), (u'NUSSS', u'N\xfcsse'), (u'nutzlich', u'n\xfctzlich'), (u"Nx'emand", u'Niemand'), (u'N\xe9chste', u'N\xe4chste'), (u'n\xe9chsten', u'n\xe4chsten'), (u'N\xe9chster', u'N\xe4chster'), (u'n\xe9chstes', u'n\xe4chstes'), (u'N\xe9chte', u'N\xe4chte'), (u'N\xe9chten', u'N\xe4chten'), (u'n\xe9chtlichen', u'n\xe4chtlichen'), (u'N\xe9gel', u'N\xe4gel'), (u'N\xe9h', u'N\xe4h'), (u'N\xe9he', u'N\xe4he'), (u'n\xe9henf', u'n\xe4hert'), (u'n\xe9her', u'n\xe4her'), (u'n\xe9here', u'n\xe4here'), (u'N\xe9hern', u'N\xe4hern'), (u'n\xe9hernde', u'n\xe4hernde'), (u'n\xe9hert', u'n\xe4hert'), (u'n\xe9herte', u'n\xe4herte'), (u'n\xe9hren', u'n\xe4hren'), (u'n\xe9ht', u'n\xe4ht'), (u'N\xe9hten', u'N\xe4hten'), (u'N\xe9ichste', u'N\xe4chste'), (u'n\xe9ichsten', u'n\xe4chsten'), (u'N\xe9ichstes', u'N\xe4chstes'), (u'N\xe9ihe', u'N\xe4he'), (u'n\xe9iher', u'n\xe4her'), (u'n\xe9ihern', u'n\xe4hern'), (u'n\xe9ihert', u'n\xe4hert'), (u'N\xe9ihten', u'N\xe4hten'), (u'n\xe9imlich', u'n\xe4mlich'), (u'n\xe9mlich', u'n\xe4mlich'), (u'N\xe9pfe', u'N\xe4pfe'), (u'n\xe9rdlich', u'n\xf6rdlich'), (u'n\xe9rgelnde', u'n\xf6rgelnde'), (u'N\xe9rrin', u'N\xe4rrin'), (u'N\xe9schen', u'N\xe4schen'), (u'n\xe9tig', u'n\xf6tig'), (u'n\xe9tige', u'n\xf6tige'), (u'n\xe9tiges', u'n\xf6tiges'), (u'O8', u'08'), (u'obdachlosl', u'obdachlos!'), (u'Obefil\xe9iche', u'Oberfl\xe4che'), (u'OBERFLACHENSCHWERKRAFT', u'OBERFL\xc4CHENSCHWERKRAFT'), (u'Oberfl\xe9che', u'Oberfl\xe4che'), (u'Oberfl\xe9chen', u'Oberfl\xe4chen'), (u'oberfl\xe9chlich', u'oberfl\xe4chlich'), (u'oberfl\xe9chliche', u'oberfl\xe4chliche'), (u'Oberm\xe9inner', u'Oberm\xe4nner'), (u'Ober\ufb02fiche', u'Oberfl\xe4che'), (u"of/'en", u'offen'), (u'Offenslchtllch', u'Offensichtlich'), (u'Offentliches', u'\xd6ffentliches'), (u'Offentlichkeit', u'\xd6ffentlichkeit'), (u'Offne', u'\xd6ffne'), (u'Offnen', u'\xd6ffnen'), (u'Offnet', u'\xd6ffnet'), (u'ofi', u'oft'), (u'Ofiiziere', u'Offiziere'), (u'Ofiiziers', u'Offiziers'), (u'Oftweg', u'Oft weg'), (u'Of\ufb02cer', u'Officer'), (u'Ohnejede', u'Ohne jede'), (u'ohnm\xe9chtig', u'ohnm\xe4chtig'), (u'ohnm\xe9ichtig', u'ohnm\xe4chtig'), (u'OI', u'\xd6l'), (u'olas', u'das'), (u'oles', u'des'), (u'Oltanks', u'\xd6ltanks'), (u'OO', u'00'), (u'Orgelt\xe9ne', u'Orgelt\xf6ne'), (u'ORTI', u'ORT:'), (u'Ortl', u'Ort!'), (u'Ostfltlgel', u'Ostfl\xfcgel'), (u'Paliontologie', u'Pal\xe4ontologie'), (u'pallt', u'passt'), (u'Pal\xe9sten', u'Pal\xe4sten'), (u'Panfike/chen', u'Partikelchen'), (u'Papierbl\xe9tter', u'Papierbl\xe4tter'), (u'Papiertiite', u'Papiert\xfcte'), (u'Papiertilcher', u'Papiert\xfccher'), (u'Parfyknaller', u'Partyknaller'), (u'Partyhiite', u'Partyh\xfcte'), (u'Partyhijte', u'Partyh\xfcte'), (u'Passendervveise', u'Passenderweise'), (u'Paulgenauso', u'Paul genauso'), (u'pa\xdf', u'pass'), (u'pa\xdft', u'passt'), (u'peinliohl', u'peinlich'), (u'persdnlich', u'pers\xf6nlich'), (u'persfinlich', u'pers\xf6nlich'), (u'persiinlich', u'pers\xf6nlich'), (u'persiinliche', u'pers\xf6nliche'), (u'persiinlicher', u'pers\xf6nlicher'), (u'Persiinllchkeltsspaltun', u'Pers\xf6nllchkeltsspaltung'), (u'persijnliche', u'pers\xf6nliche'), (u'personlich', u'pers\xf6nlich'), (u'Personlichkeit', u'Pers\xf6nlichkeit'), (u'pers\xe9nlich', u'pers\xf6nlich'), (u'pers\xe9nliche', u'pers\xf6nliche'), (u'pers\xe9nlicher', u'pers\xf6nlicher'), (u'Pers\xe9nliches', u'Pers\xf6nliches'), (u'Pers\xe9nlichkeit', u'Pers\xf6nlichkeit'), (u'pe\ufb02g', u'peng'), (u'Pfadfindervvappen', u'Pfadfinderwappen'), (u'Pfad\ufb02ndeml', u'Pfad\ufb02ndern!'), (u'Pffitzen', u'Pf\xfctzen'), (u'Pfiitchen', u'Pf\xf6tchen'), (u'Pfippchen', u'P\xfcppchen'), (u"pflL'lgen", u'pfl\xfcgen'), (u'Pfllitze', u'Pf\xfctze'), (u'pflugte', u'pfl\xfcgte'), (u'Pfundbijro', u'Pfundb\xfcro'), (u'ph\xe9nomenal', u'ph\xe4nomenal'), (u'PIatz', u'Platz'), (u'Piimpel', u'P\xf6mpel'), (u'Piinlttchenltrawatte', u'P\xfcnktchenkrawatte'), (u'Pijppchen', u'P\xfcppchen'), (u'Pijppchenl', u'P\xfcppchen!'), (u'Planetenf', u'Planeten!'), (u'planm\xe9fiigen', u'planm\xe4\xdfigen'), (u'Plastikfr\xe9iuleinl', u'Plastikfr\xe4ulein!'), (u'plattmachen', u'platt machen'), (u'Plfitzchen', u'Pl\xe4tzchen'), (u'plfitzlich', u'pl\xf6tzlich'), (u'pliitzlich', u'pl\xf6tzlich'), (u'pliitzllch', u'pl\xf6tzlich'), (u'Pllllnderer', u'Pl\xfcnderer'), (u'plotzlich', u'pl\xf6tzlich'), (u'pl\xe9dieren', u'pl\xe4dieren'), (u'Pl\xe9ine', u'Pl\xe4ne'), (u'Pl\xe9inen', u'Pl\xe4nen'), (u'Pl\xe9itzchen', u'Pl\xe4tzchen'), (u'Pl\xe9itze', u'Pl\xe4tze'), (u'Pl\xe9ne', u'Pl\xe4ne'), (u'Pl\xe9tzchen', u'Pl\xe4tzchen'), (u'Pl\xe9tze', u'Platze'), (u'Pl\xe9tzel', u'Pl\xe4tze!'), (u'pl\xe9tzlich', u'pl\xf6tzlich'), (u'pl\xe9tzliche', u'pl\xf6tzliche'), (u'Pofkawoche', u'Polkawoche'), (u'Polizistl', u'Polizist!'), (u'pompiise', u'pomp\xf6se'), (u'popul\xe9r', u'popul\xe4r'), (u'potth\xe9sslich', u'potth\xe4sslich'), (u'prasentleren', u'pr\xe4sentieren'), (u'prfignant', u'pr\xe4gnant'), (u'Prfisentation', u'Pr\xe4sentation'), (u'Prfisi', u'Pr\xe4si'), (u'priide', u'pr\xfcde'), (u'Priife', u'Pr\xfcfe'), (u'priifen', u'pr\xfcfen'), (u'prijfen', u'pr\xfcfen'), (u"Priorit2a't", u'Priorit\xe4t'), (u'PRIORITKT', u'PRIORIT\xc4T'), (u'PRIORITKTSZUGANG', u'PRIORIT\xc4TSZUGANG'), (u'Priorit\xe9itszugang', u'Priorit\xe4tszugang'), (u'Priorit\xe9t', u'Priorit\xe4t'), (u'Prisident', u'Pr\xe4sident'), (u'Privatgem\xe9chern', u'Privatgem\xe4chern'), (u'Privatsph\xe9re', u'Privatsph\xe4re'), (u'Probfeme', u'Probleme'), (u'Profitinzerinnen', u'Profit\xe4nzerinnen'), (u'Protege', u'Prot\xe9g\xe9'), (u'prude', u'pr\xfcde'), (u'Pruf', u'Pr\xfcf'), (u'prufen', u'pr\xfcfen'), (u'Prugelei', u'Pr\xfcgelei'), (u'prugeln', u'pr\xfcgeln'), (u'pr\xe9chtig', u'pr\xe4chtig'), (u'Pr\xe9fekt', u'Pr\xe4fekt'), (u'pr\xe9historischer', u'pr\xe4historischer'), (u'pr\xe9ichtiger', u'pr\xe4chtiger'), (u'pr\xe9ichtiges', u'pr\xe4chtiges'), (u'Pr\xe9imie', u'Pr\xe4mie'), (u'pr\xe9ipotente', u'pr\xe4potente'), (u'pr\xe9isentiert', u'pr\xe4sentiert'), (u'Pr\xe9isidenten', u'Pr\xe4sidenten'), (u'Pr\xe9itorianer', u'Pr\xe4torianer'), (u'Pr\xe9mie', u'Pr\xe4mie'), (u'Pr\xe9operative', u'Pr\xe4operative'), (u'pr\xe9sentiere', u'pr\xe4sentiere'), (u'pr\xe9sentieren', u'pr\xe4sentieren'), (u'Pr\xe9sentiert', u'Pr\xe4sentiert'), (u'Pr\xe9senz', u'Pr\xe4senz'), (u'Pr\xe9sident', u'Pr\xe4sident'), (u'Pr\xe9sidenten', u'Pr\xe4sidenten'), (u'Pr\xe9sidentin', u'Pr\xe4sidentin'), (u'Pr\xe9sidentschaft', u'Pr\xe4sidentschaft'), (u'Pr\xe9torianer', u'Pr\xe4torianer'), (u'pr\xe9zise', u'pr\xe4zise'), (u'pr\xe9ziser', u'pr\xe4ziser'), (u'Pr\ufb02fungen', u'Pr\xfcfungen'), (u'Pubert\xe9it', u'Pubert\xe4t'), (u'Publlkuml', u'Publlkum!'), (u'PUPPCHEN', u'P\xdcPPCHEN'), (u'PUpst', u'Pupst'), (u'Purzelb\xe9ume', u'Purzelb\xe4ume'), (u'P\xe9ckchen', u'P\xe4ckchen'), (u'p\xe9idagogisch', u'p\xe4dagogisch'), (u'P\xe9irchen', u'P\xe4rchen'), (u'P\xe9rchen', u'P\xe4rchen'), (u'p\ufb02egen', u'pflegen'), (u'P\ufb02icht', u'Pflicht'), (u'p\ufb02ichtbewullt', u'pflichtbewusst'), (u'Qas', u'Das'), (u'Qualit\xe9tskontrolle', u'Qualit\xe4tskontrolle'), (u'Quten', u'guten'), (u'qu\xe9ilen', u'qu\xe4len'), (u'qu\xe9ilt', u'qu\xe4lt'), (u'Qu\xe9l', u'Qu\xe4l'), (u'Qu\xe9lt', u'Qu\xe4lt'), (u"R'a'che", u'R\xe4che'), (u'R/ck', u'Rick'), (u'R/nge', u'Ringe'), (u'R6mer', u'R\xf6mer'), (u'rachsiichtiger', u'rachs\xfcchtiger'), (u'ranghfiheren', u'rangh\xf6heren'), (u'rangh\xe9heren', u'rangh\xf6heren'), (u'ranzukommen', u'ran-zukommen'), (u'Rasenm\xe9herunfall', u'Rasenm\xe4herunfall'), (u'Rasterllibertragung', u'Raster\xfcbertragung'), (u'Rasterubertragung', u'Raster\xfcbertragung'), (u'Ratschl\xe9ige', u'Ratschl\xe4ge'), (u'Rattenf\xe9nger', u'Rattenf\xe4nger'), (u'Rauc/7', u'Rauch'), (u'Rauc/vender', u'Rauchender'), (u'rauhen', u'rauen'), (u'RAUMFAHRE', u'RAUMF\xc4HRE'), (u'Raumf\xe9hre', u'Raumf\xe4hre'), (u'Raumsschiff', u'Raumschiff'), (u'rausf\xe9hrt', u'rausf\xe4hrt'), (u'rausgeprtigeltl', u'rausgepr\xfcgelt!'), (u'rausliefien', u'rauslie\xdfen'), (u'rauszuschmeifien', u'rauszuschmei\xdfen'), (u'rau\ufb02', u'rau!'), (u'Re/se', u'Reise'), (u'Realit\xe9it', u'Realit\xe4t'), (u'Realit\xe9t', u'Realit\xe4t'), (u'Rechtgl\xe9ubige', u'Rechtgl\xe4ubige'), (u'rechtm\xe9fkigen', u'rechtm\xe4\xdfigen'), (u'RECHTSANWALTE', u'RECHTSANW\xc4LTE'), (u'rechtsl', u'rechts!'), (u'Reffer', u'Retter'), (u'regelm\xe9fiige', u'regelm\xe4\xdfige'), (u'Regenh\xe9igen', u'Regenb\xf6gen'), (u'Regenm\xe9ntel', u'Regenm\xe4ntel'), (u'Regierungsgehirnw\xe9ischesignal', u'Regierungsgehirnw\xe4schesignal'), (u'regul\xe9re', u'regul\xe4re'), (u'reiB', u'rei\xdf'), (u'reiBt', u'rei\xdft'), (u'Reichtfimer', u'Reicht\xfcmer'), (u'Reichtllimern', u'Reicht\xfcmern'), (u'reif$', u'rei\xdf'), (u'reif$en', u'rei\xdfen'), (u'Reifiverschluss', u'Rei\xdfverschluss'), (u'Reil3t', u'Rei\xdft'), (u'reil5', u'rei\xdf'), (u'Reili', u'Rei\xdf'), (u'reilien', u'rei\xdfen'), (u'Reilin\xe9gel', u'Rei\xdfn\xe4gel'), (u'Reillt', u'Rei\xdft'), (u'reilZ>', u'rei\xdf'), (u'reingeh\xe9ngt', u'reingeh\xe4ngt'), (u'Reingelegtl', u'Reingelegt!'), (u'reinhupft', u'reinh\xfcpft'), (u'reinl', u'rein!'), (u'reinstilrmen', u'reinst\xfcrmen'), (u'reiohen', u'reichen'), (u'REISSVERSCHLUSSGERAUSCH', u'REISSVERSCHLUSSGER\xc4USCH'), (u'rei\ufb02', u'rei\xdf'), (u'rei\ufb02en', u'rei\xdfen'), (u'relch', u'reich'), (u'religi6s', u'religi\xf6s'), (u'religiiiser', u'religi\xf6ser'), (u'religi\xe9s', u'religi\xf6s'), (u'Rels', u'Reis'), (u'Rentenbezuge', u'Rentenbez\xfcge'), (u'Repr\xe9sentantin', u'Repr\xe4sentantin'), (u'Rettungsflofi', u'Rettungsflo\xdf'), (u'Rev/er', u'Revier'), (u'rfiber', u'r\xfcber'), (u'rfiberwachsen', u'r\xfcberwachsen'), (u'Rfickseite', u'R\xfcckseite'), (u'rfihrselige', u'r\xfchrselige'), (u'rfilpse', u'r\xfclpse'), (u'Rfissel', u'R\xfcssel'), (u'RGMISCHE', u'R\xd6MISCHE'), (u'Richer', u'R\xe4cher'), (u'Riesenhfipfer', u'Riesenh\xfcpfer'), (u'Riesenspafi', u'Riesenspa\xdf'), (u'Riesentijr', u'Riesent\xfcr'), (u'riiber', u'r\xfcber'), (u'Riicheln', u'R\xf6cheln'), (u'riichelt', u'r\xf6chelt'), (u'Riick', u'R\xfcck'), (u'Riickblickend', u'R\xfcckblickend'), (u'Riicken', u'R\xfccken'), (u'Riickenlage', u'R\xfcckenlage'), (u'Riickenwind', u'R\xfcckenwind'), (u'riicksichtslos', u'r\xfccksichtslos'), (u'Riicksichtslosigkeit', u'R\xfccksichtslosigkeit'), (u'Riicksitz', u'R\xfccksitz'), (u'Riickw\xe9irts', u'R\xfcckw\xe4rts'), (u'Riickzug', u'R\xfcckzug'), (u'Riick\ufb02ug', u'R\xfcck\ufb02ug'), (u'riihrt', u'r\xfchrt'), (u'Riilpsen', u'R\xfclpsen'), (u'riilpst', u'r\xfclpst'), (u'Riimischen', u'R\xf6mischen'), (u'Riistung', u'R\xfcstung'), (u'Riiumlichkeiten', u'R\xe4umlichkeiten'), (u'Rijbe', u'R\xfcbe'), (u'rijber', u'r\xfcber'), (u'rijckgfingig', u'r\xfcckg\xe4ngig'), (u'rijckw\xe9irts', u'r\xfcckw\xe4rts'), (u'Rijsseltierl', u'R\xfcsseltier!'), (u'Rilbe', u'R\xfcbe'), (u'rilber', u'r\xfcber'), (u'rilberkommen', u'r\xfcberkommen'), (u'Rilckkehr', u'R\xfcckkehr'), (u'rilcksichtsloses', u'r\xfccksichtsloses'), (u'rilckw\xe9rts', u'r\xfcckw\xe4rts'), (u'Rillpsen', u'R\xfclpsen'), (u'Riol', u'Rio!'), (u'Rivalit\xe9t', u'Rivalit\xe4t'), (u"rL'lber", u'r\xfcber'), (u"RL'lhr", u'R\xfchr'), (u'rllicken', u'r\xfccken'), (u'rllickt', u'r\xfcckt'), (u'Rlllckgrat', u'R\xfcckgrat'), (u'Rlnge', u'Ringe'), (u'Rlumgerate', u'R\xe4umger\xe4te'), (u'ROMISCHE', u'R\xd6MISCHE'), (u'ROMISCHEN', u'R\xd6MISCHEN'), (u'rosa\xe9ugiges', u'rosa\xe4ugiges'), (u'rotiugiger', u'rot\xe4ugiger'), (u'Rotk\xe9ppchen', u'Rotk\xe4ppchen'), (u'Rott\xe9nen', u'Rott\xf6nen'), (u'Routinetlberprijfung', u'Routine\xfcberpr\xfcfung'), (u'Rticken', u'R\xfccken'), (u'rticksichtslos', u'r\xfccksichtslos'), (u'rtlber', u'r\xfcber'), (u'Rtlckseite', u'R\xfcckseite'), (u'ruber', u'r\xfcber'), (u'Ruberrutschen', u'R\xfcberrutschen'), (u'Ruckblende', u'R\xfcckblende'), (u'Ruckblick', u'R\xfcckblick'), (u'Rucken', u'R\xfccken'), (u'Ruckenlage', u'R\xfcckenlage'), (u'Ruckenwind', u'R\xfcckenwind'), (u'Ruckfall', u'R\xfcckfall'), (u'Ruckfrage', u'R\xfcckfrage'), (u'Ruckgriff', u'R\xfcckgriff'), (u'Ruckkehr', u'R\xfcckkehr'), (u'Rucksitz', u'R\xfccksitz'), (u'Ruckzugl', u'R\xfcckzug!'), (u'ruhlg', u'ruhig'), (u'ruhrenl', u'r\xfchren!'), (u'Ruhrt', u'R\xfchrt'), (u'Rul3', u'Ru\xdf'), (u'Rumgebrfillel', u'Rumgebr\xfclle!'), (u'rumhingen', u'rumh\xe4ngen'), (u'rumh\xe9ngen', u'rumh\xe4ngen'), (u'rumh\xe9ngst', u'rumh\xe4ngst'), (u'ruml\xe9uft', u'ruml\xe4uft'), (u'rumwuhlen', u'rumw\xfchlen'), (u'rumzuf\ufb02hren', u'rumzuf\xfchren'), (u'rum\xe9rgern', u'rum\xe4rgern'), (u'runterffihrt', u'runterf\xe4hrt'), (u'runtergespillt', u'runtergesp\xfclt'), (u'runtergesp\ufb02lt', u'runtergesp\xfclt'), (u'Runterl', u'Runter!'), (u'runterspillen', u'runtersp\xfclen'), (u'runterspllllen', u'runtersp\xfclen'), (u'runtersp\xfclt', u'runter-sp\xfclt'), (u'runtervverfen', u'runterwerfen'), (u'Rupem', u'Rupert!'), (u'Rustung', u'R\xfcstung'), (u'r\xe9che', u'r\xe4che'), (u'r\xe9chen', u'r\xe4chen'), (u'R\xe9cher', u'R\xe4cher'), (u'r\xe9cht', u'r\xe4cht'), (u'R\xe9der', u'R\xe4der'), (u'R\xe9dern', u'R\xe4dern'), (u'R\xe9hre', u'R\xf6hre'), (u'R\xe9idern', u'R\xe4dern'), (u'R\xe9itsel', u'R\xe4tsel'), (u'r\xe9itseln', u'r\xe4tseln'), (u'r\xe9itst', u'r\xe4tst'), (u'R\xe9iume', u'R\xe4ume'), (u'R\xe9mern', u'R\xf6mern'), (u'r\xe9mische', u'r\xf6mische'), (u'r\xe9mischen', u'r\xf6mischen'), (u'r\xe9mischer', u'r\xf6mischer'), (u'R\xe9nder', u'R\xe4nder'), (u'R\xe9nke', u'R\xe4nke'), (u'R\xe9nken', u'R\xe4nken'), (u'R\xe9ntgenaufnahme', u'R\xf6ntgenaufnahme'), (u'R\xe9ntgenbild', u'R\xf6ntgenbild'), (u'R\xe9son', u'R\xe4son'), (u'r\xe9t', u'r\xe4t'), (u'R\xe9tsel', u'R\xe4tsel'), (u'r\xe9tselhaft', u'r\xe4tselhaft'), (u'R\xe9tselhaftes', u'R\xe4tselhaftes'), (u'R\xe9ume', u'R\xe4ume'), (u'R\xe9umen', u'R\xe4umen'), (u'R\xe9umlichkeiten', u'R\xe4umlichkeiten'), (u'R\xe9umt', u'R\xe4umt'), (u'r\xe9uspert', u'r\xe4uspert'), (u'R\ufb02be', u'R\xfcbe'), (u'r\ufb02bergeguckt', u'r\xfcbergekuckt'), (u'R\ufb02ckkehr', u'R\xfcckkehr'), (u'S/e', u'Sie'), (u's/nd', u'sind'), (u'S5tze', u'S\xe4tze'), (u'S6hne', u'S\xf6hne'), (u'saB', u'sa\xdf'), (u'Sachverstlndiger', u'Sachverst\xe4ndiger'), (u'sagf', u'sagt'), (u'sagfen', u'sagten'), (u'Sammlerstiicken', u'Sammlerst\xfccken'), (u'Sands\xe9cke', u'Sands\xe4cke'), (u'Sanftmiltigen', u'Sanftm\xfctigen'), (u'Sanierungsbeh\xe9rde', u'Sanierungsbeh\xf6rde'), (u'Sanit\xe9ter', u'Sanit\xe4ter'), (u'Sargn\xe9gel', u'Sargn\xe4gel'), (u'sari', u'sa\xdf'), (u'Satellitenschijssel', u'Satellitensch\xfcssel'), (u'Satellitenschusseln', u'Satellitensch\xfcsseln'), (u'Satellitenuberwachung', u'Satelliten\xfcberwachung'), (u'Saugf\ufb02flsen', u'Saugf\xfc\xdfen'), (u'sc/10/1', u'schon'), (u'sc/16/1', u'sch\xf6n'), (u'sch/cken', u'schicken'), (u'Sch/ffe', u'Schiffe'), (u'sch6n', u'sch\xf6n'), (u'Schadeniiberpriifung', u'Schaden\xfcberpr\xfcfung'), (u'Schadenuberprtlfung', u'Schaden\xfcberpr\xfcfung'), (u'Scharfschijtze', u'Scharfsch\xfctze'), (u'schbn', u'sch\xf6n'), (u"schc'\xa7n", u'sch\xf6n'), (u'Schdn', u'Sch\xf6n'), (u'schdnen', u'sch\xf6nen'), (u'Schecksl', u'Schecks!'), (u'ScheiB', u'Schei\xdf'), (u'ScheiBe', u'Schei\xdfe'), (u'scheiBegal', u'schei\xdfegal'), (u'Scheif$e', u'Schei\xdfe'), (u'scheiffsel', u'schei\xdfe!'), (u'Scheifi', u'Schei\xdf'), (u'Scheifiding', u'Schei\xdfding'), (u'scheifie', u'schei\xdfe'), (u'Scheifiel', u'Schei\xdfe!'), (u'Scheifier', u'Schei\xdfer'), (u'Scheifihelm', u'Schei\xdfhelm'), (u'Scheifiloch', u'Schei\xdfloch'), (u'Scheifipascha', u'Schei\xdfpascha'), (u'Scheifisofa', u'Schei\xdfsofa'), (u'Scheifiweiber', u'Schei\xdfweiber'), (u'Scheifle', u'Schei\xdfe'), (u'Scheiiislangweilig', u'Schei\xdflangweilig'), (u"Scheil'$e", u'Schei\xdfe'), (u'Scheil3>er', u'Schei\xdfer'), (u'Scheil3e', u'Schei\xdfe'), (u'Scheili', u'Schei\xdf'), (u'Scheilie', u'Schei\xdfe'), (u'scheilien', u'schei\xdfen'), (u'Scheille', u'Schei\xdfe'), (u'Scheillel', u'Schei\xdfe!'), (u'ScheilSe', u'Schei\xdfe'), (u'ScheilZ>', u'Schei\xdf'), (u'Scheir$oling', u'Schei\xdfding'), (u'scheissegal', u'schei\xdfegal'), (u'Scheisskarre', u'Schei\xdfkarre'), (u'Schei\ufb02e', u'Schei\xdfe'), (u'scheme', u'schei\xdfe'), (u'scheuf$lich', u'scheu\xdflich'), (u'Scheulilich', u'Scheu\xdflich'), (u'schfichtern', u'sch\xfcchtern'), (u'schfimen', u'sch\xe4men'), (u'schfin', u'sch\xf6n'), (u'Schfine', u'Sch\xf6ne'), (u'schfinen', u'sch\xf6nen'), (u'Schfines', u'Sch\xf6nes'), (u'schfirfer', u'sch\xe4rfer'), (u'Schfissel', u'Sch\xfcssel'), (u'Schfitzchen', u'Sch\xe4tzchen'), (u'schfjnes', u'sch\xf6nes'), (u'Schideln', u'Sch\xe4deln'), (u'schief$en', u'schie\xdfen'), (u'Schief3>en', u'Schie\xdfen'), (u'Schiefien', u'Schie\xdfen'), (u'schiefit', u'schie\xdft'), (u'schiefZ>t', u'schie\xdft'), (u"schiel'5", u'schie\xdf'), (u'Schiel3t', u'Schie\xdft'), (u'schiellen', u'schie\xdfen'), (u'Schielmbung', u'Schie\xdf\xfcbung'), (u'schie\ufb02en', u'schie\xdfen'), (u'schie\ufb02t', u'schie\xdft'), (u'Schiffs\xe9rzte', u'Schiffs\xe4rzte'), (u'Schiffzerstfiren', u'Schiff zerst\xf6ren'), (u'Schifies', u'Schiffes'), (u'Schiidel', u'Sch\xe4del'), (u'schiilzen', u'sch\xe4tzen'), (u'schiin', u'sch\xf6n'), (u'schiine', u'sch\xf6ne'), (u'Schiinen', u'Sch\xf6nen'), (u'Schiiner', u'Sch\xf6ner'), (u'schiines', u'sch\xf6nes'), (u'Schiinheit', u'Sch\xf6nheit'), (u'Schiipfer', u'Sch\xf6pfer'), (u'Schiipfung', u'Sch\xf6pfung'), (u'Schiisse', u'Sch\xfcsse'), (u'Schiitt', u'Sch\xfctt'), (u'Schiittelfrost', u'Sch\xfcttelfrost'), (u'schiitten', u'sch\xfctten'), (u'schiittet', u'sch\xfcttet'), (u'schiitze', u'sch\xe4tze'), (u'schiitzen', u'sch\xfctzen'), (u'schiitzt', u'sch\xfctzt'), (u'schijn', u'sch\xf6n'), (u'Schijnes', u'Sch\xf6nes'), (u'schijng', u'sch\xf6n!'), (u'Schijssel', u'Sch\xfcssel'), (u'schijttelt', u'sch\xfcttelt'), (u'Schijtze', u'Sch\xfctze'), (u'schijtzen', u'sch\xfctzen'), (u'Schildkr\xe9te', u'Schildkr\xf6te'), (u'Schilrze', u'Sch\xfcrze'), (u'Schilsse', u'Sch\xfcsse'), (u'schiltten', u'sch\xfctten'), (u'schiltzen', u'sch\xfctzen'), (u'schimte', u'sch\xe4mte'), (u'Schizophrenia', u'Schizophrenie'), (u'Schi\xe9tze', u'Sch\xe4tze'), (u'Schlachtgetllimmels', u'Schlachtget\xfcmmels'), (u'Schlachtschifl', u'Schlachtschiff'), (u'schlafenl', u'schlafen!'), (u'Schlafk\xe9fern', u'Schlafk\xe4fern'), (u'Schlafmiitzenl', u'Schlafm\xfctzen!'), (u'Schlafm\ufb02tzel', u'Schlafm\xfctze!'), (u'Schlangeng\xe9ttin', u'Schlangeng\xf6ttin'), (u'Schlappschw\xe9nze', u'Schlappschw\xe4nze'), (u'Schlaumeierl', u'Schlaumeier!'), (u'schlechf', u'schlecht'), (u'Schlelistiinde', u'Schie\xdfst\xe4nde'), (u'Schlellen', u'Schie\xdfen'), (u'Schle\ufb02t', u'Schie\xdft'), (u'Schlfilsselparty', u'Schl\xfcsselparty'), (u'Schlfisse', u'Schl\xfcsse'), (u'SchlieBe', u'Schlie\xdfe'), (u'schlieBen', u'schlie\xdfen'), (u'schlieBIich', u'schlie\xdflich'), (u'schlieBlich', u'schlie\xdflich'), (u'SchlieBt', u'Schlie\xdft'), (u'schlief$en', u'schlie\xdfen'), (u'Schlief$lich', u'Schlie\xdflich'), (u'schlief2>lich', u'schlie\xdflich'), (u'schlief3t', u'schlie\xdft'), (u'Schliefie', u'Schlie\xdfe'), (u'schliefien', u'schlie\xdfen'), (u'Schliefilich', u'Schlie\xdflich'), (u'schlieflslich', u'schlie\xdflich'), (u'schliel3en', u'schlie\xdfen'), (u'schliel3lich', u'schlie\xdflich'), (u'Schliel5t', u'Schlie\xdft'), (u'schlielie', u'schlie\xdfe'), (u'schlielien', u'schlie\xdfen'), (u'schlielilich', u'schlie\xdflich'), (u'schliellsen', u'schlie\xdfen'), (u'SchlielSt', u'Schlie\xdft'), (u'Schliissel', u'Schl\xfcssel'), (u'Schliissell', u'Schl\xfcssel!'), (u'Schliisselmoment', u'Schl\xfcsselmoment'), (u'Schliisseln', u'Schl\xfcsseln'), (u'Schlijsse', u'Schl\xfcsse'), (u'Schlijssel', u'Schl\xfcssel'), (u'Schlijsselloch', u'Schl\xfcsselloch'), (u'Schlilssel', u'Schl\xfcssel'), (u'Schlilssell', u'Schl\xfcssel'), (u'Schlilsselparty', u'Schl\xfcsselparty'), (u'schlimmsterAlbtraum', u'schlimmster Albtraum'), (u'Schlle\ufb02en', u'Schlie\xdfen'), (u'Schllisse', u'Sch\xfcsse'), (u'schllitze', u'sch\xfctze'), (u'schllitzen', u'sch\xfctzen'), (u'Schlllissell', u'Schl\xfcssel!'), (u'Schlull', u'Schluss'), (u'Schlupfern', u'Schl\xfcpfern'), (u'Schlusselmoment', u'Schl\xfcsselmoment'), (u'Schlusselszenen', u'Schl\xfcsselszenen'), (u'Schlusselw\xe9rter', u'Schlusselw\xf6rter'), (u'Schlussl', u'Schluss!'), (u'Schlu\xdf', u'Schluss'), (u'Schl\xe9chter', u'Schl\xe4chter'), (u'schl\xe9fst', u'schl\xe4fst'), (u'Schl\xe9ft', u'Schl\xe4ft'), (u'Schl\xe9ge', u'Schl\xe4ge'), (u'Schl\xe9ger', u'Schl\xe4ger'), (u'Schl\xe9gerei', u'Schl\xe4gerei'), (u'schl\xe9gt', u'schl\xe4gt'), (u'schl\xe9ift', u'schl\xe4ft'), (u'schl\xe9igst', u'schl\xe4gst'), (u'Schl\ufb02ssel', u'Schl\xfcssel'), (u'Schmatzger\xe9usche', u'Schmatzger\xe4usche'), (u'SchmeiBt', u'Schmei\xdft'), (u'Schmeif$', u'Schmei\xdf'), (u'Schmeif$t', u'Schmei\xdft'), (u'Schmeifien', u'Schmei\xdfen'), (u'schmeifit', u'schmei\xdft'), (u'Schmeilit', u'Schmei\xdft'), (u'Schmei\ufb02', u'Schmei\xdf'), (u'Schmier\xe9l', u'Schmier\xf6l'), (u'schmiicken', u'schm\xfccken'), (u'schmilztl', u'schmilzt!'), (u'schmi\ufb02', u'schmiss'), (u'Schmuckk\xe9stchen', u'Schmuckk\xe4stchen'), (u'Schmuckstiick', u'Schmuckst\xfcck'), (u'Schnappschijsse', u'Schnappsch\xfcsse'), (u'Schnauzel', u'Schnauze!'), (u'Schneegest\xe9ber', u'Schneegest\xf6ber'), (u'Schneidez\xe9hnen', u'Schneidez\xe4hnen'), (u'Schneidez\xe9ihne', u'Schneidez\xe4hne'), (u'schnellf', u'schnell!'), (u'Schnfiffeln', u'Schn\xfcffeln'), (u'schnfiffelnl', u'schn\xfcffeln!'), (u'schnfiffelst', u'schn\xfcffelst'), (u'Schnfirsenkel', u'Schn\xfcrsenkel'), (u'schniiffele', u'schn\xfcffele'), (u'schnijffelt', u'schn\xfcffelt'), (u'Schnilffeln', u'Schn\xfcffeln'), (u'schnilrt', u'schn\xfcrt'), (u'Schnitzereigesch\xe9ft', u'Schnitzereigesch\xe4ft'), (u'Schniuzer', u'Schn\xe4uzer'), (u'Schnuoki', u'Schnucki'), (u'Schn\xe9ppchen', u'Schn\xe4ppchen'), (u'SchoB', u'Scho\xdf'), (u'Schofk', u'Scho\xdf'), (u'ScholShund', u'Scho\xdfhund'), (u'Schones', u'Sch\xf6nes'), (u'schonl', u'schon!'), (u'schopferische', u'sch\xf6pferische'), (u'scho\xdf', u'schoss'), (u'Schrankw\xe9nde', u'Schrankw\xe4nde'), (u'Schraubenschlijssel', u'Schraubenschl\xfcssel'), (u'schrecklichl', u'schrecklich!'), (u'Schriftist', u'Schrift ist'), (u'Schriftstijcks', u'Schriftst\xfccks'), (u'schr\xe9ge', u'schr\xe4ge'), (u'Schr\xe9ges', u'Schr\xe4ges'), (u'Schr\xe9nke', u'Schr\xe4nke'), (u'Schr\xe9nken', u'Schr\xe4nken'), (u'schtin', u'sch\xf6n'), (u'schtine', u'sch\xf6ne'), (u'Schtisse', u'Sch\xfcsse'), (u'schuchtern', u'sch\xfcchtern'), (u'Schuchterne', u'Sch\xfcchterne'), (u'Schuhl', u'Schuh!'), (u'Schuldgeftihlen', u'Schuldgef\xfchlen'), (u'Schulterl', u'Schulter!'), (u'Schutzen', u'Sch\xfctzen'), (u'Schutzr\xe9ume', u'Schutzr\xe4ume'), (u'SCHUTZT', u'SCH\xdcTZT'), (u"Schw6r's", u"Schw\xf6r's"), (u'Schwachkop\ufb02', u'Schwachkop!'), (u'Schwanzlutscherl', u'Schwanzlutscher!'), (u'Schwarzh\xe9ndler', u'Schwarzh\xe4ndler'), (u'Schwarzweills', u'Schwarzwei\xdf'), (u'schwei\ufb02durchnisst', u'schwei\xdfdurchn\xe4sst'), (u'schwerh\xe9rig', u'schwerh\xf6rig'), (u'schwiicht', u'schw\xe4cht'), (u'schwiire', u'schw\xf6re'), (u'schwiiren', u'schw\xf6ren'), (u'Schwimmanziige', u'Schwimmanz\xfcge'), (u'schwi\xe9rmten', u'schw\xe4rmten'), (u'schwnre', u'schw\xf6re'), (u'Schw\xe9che', u'Schw\xe4che'), (u'Schw\xe9chen', u'Schw\xe4chen'), (u'schw\xe9cher', u'schw\xe4cher'), (u'schw\xe9cheren', u'schw\xe4cheren'), (u'schw\xe9chsten', u'schw\xe4chsten'), (u'Schw\xe9icheanfall', u'Schw\xe4cheanfall'), (u'Schw\xe9ichen', u'Schw\xe4chen'), (u'schw\xe9icher', u'schw\xe4cher'), (u'Schw\xe9ichling', u'Schw\xe4chling'), (u'Schw\xe9irmerei', u'Schw\xe4rmerei'), (u'schw\xe9irzeste', u'schw\xe4rzeste'), (u'Schw\xe9mme', u'Schw\xe4mme'), (u'schw\xe9re', u'schw\xf6re'), (u'schw\xe9ren', u'schw\xf6ren'), (u'Schw\xe9rme', u'Schw\xe4rme'), (u'schw\xe9rmt', u'schw\xe4rmt'), (u'schw\xe9rmte', u'schw\xe4rmte'), (u'Schw\xe9tzer', u'Schw\xe4tzer'), (u'sch\xe9biger', u'sch\xe4biger'), (u'Sch\xe9del', u'Sch\xe4del'), (u'Sch\xe9den', u'Sch\xe4den'), (u'Sch\xe9inder', u'Sch\xe4nder'), (u'sch\xe9ine', u'sch\xf6ne'), (u'sch\xe9inen', u'sch\xf6nen'), (u'Sch\xe9iner', u'Sch\xf6ner'), (u'sch\xe9irfen', u'sch\xe4rfen'), (u'sch\xe9le', u'sch\xe4le'), (u'sch\xe9me', u'sch\xe4me'), (u'Sch\xe9n', u'Sch\xf6n'), (u'sch\xe9ne', u'sch\xf6ne'), (u'Sch\xe9nen', u'Sch\xf6nen'), (u'Sch\xe9ner', u'Sch\xf6ner'), (u'Sch\xe9nes', u'Sch\xf6nes'), (u'Sch\xe9nheit', u'Sch\xf6nheit'), (u'sch\xe9nl', u'sch\xf6n!'), (u'sch\xe9nste', u'sch\xf6nste'), (u'sch\xe9nsten', u'sch\xf6nsten'), (u'sch\xe9nstes', u'sch\xf6nstes'), (u'Sch\xe9tzchen', u'Sch\xe4tzchen'), (u'Sch\xe9tze', u'Sch\xe4tze'), (u'sch\xe9tzen', u'sch\xe4tzen'), (u'sch\xe9tzt', u'sch\xe4tzt'), (u'Sch\xe9tzung', u'Sch\xe4tzung'), (u'Sch\xe9umen', u'Sch\xe4umen'), (u'sch\ufb02chtern', u'sch\xfcchtern'), (u"SCl'1lUSS6l", u'Schl\xfcssel'), (u'Scllrift', u'Schrift'), (u'scmoss', u'SCHLOSS'), (u'se/n', u'sein'), (u'Se/wen', u'Sehen'), (u'sehenl', u'sehen!'), (u'Sehenswlllrdigkeiten', u'Sehensw\xfcrdigkeiten'), (u'Sehnsilchte', u'Sehns\xfcchte'), (u'sehrangespannt', u'sehr angespannt'), (u'sehrjung', u'sehr jung'), (u'Sehrwohl', u'Sehr wohl'), (u'sehrzufrieden', u'sehr zufrieden'), (u'sehtjetzt', u'seht jetzt'), (u'Seidenglattl', u'Seidenglatt!'), (u'seidjetzt', u'seid jetzt'), (u'Seitwann', u'Seit wann'), (u'SEKRETARIN', u'SEKRET\xc4RIN'), (u'Sekretiir', u'Sekret\xe4r'), (u'Sekretir', u'Sekret\xe4r'), (u'Sekret\xe9irin', u'Sekret\xe4rin'), (u'Sekret\xe9rin', u'Sekret\xe4rin'), (u'sel/g', u'selig'), (u'selbstl', u'selbst!'), (u'selbststiindig', u'selbstst\xe4ndig'), (u'selbstsuchtige', u'selbsts\xfcchtige'), (u'selbstverstindlich', u'selbstverst\xe4ndlich'), (u'Selbstverstlndlich', u'Selbstverst\xe4ndlich'), (u'Selbstverst\xe9indlich', u'Selbstverst\xe4ndlich'), (u'Selbstverst\xe9ndlich', u'Selbstverst\xe4ndlich'), (u'seld', u'seid'), (u'selhst', u'selbst'), (u'SeligerVater', u'Seliger Vater'), (u'seln', u'sein'), (u'Selt', u'Seit'), (u'sentimalen', u'sentimentalen'), (u'seri\xe9ser', u'seri\xf6ser'), (u'Sexualit\xe9t', u'Sexualit\xe4t'), (u'Sfe', u'Sie'), (u'Sfidamerikas', u'S\xfcdamerikas'), (u'Sfidwind', u'S\xfcdwind'), (u'Sfifies', u'S\xfc\xdfes'), (u'Sfihne', u'S\xf6hne'), (u'Sfildner', u'S\xf6ldner'), (u'Sfilie', u'S\xfc\xdfe'), (u'Sfilieste', u'S\xfc\xdfeste'), (u'Sfi\ufb02igkeiten', u'S\xfc\xdfigkeiten'), (u'sfnd', u'sind'), (u'SICHERHEITSBEHORDE', u'SICHERHEITSBEH\xd6RDE'), (u'Sicherheitsgrijnden', u'Sicherheitsgr\xfcnden'), (u'Sichtubervvachung', u'Sicht\xfcberwachung'), (u'Sichtunterstutzung', u'Sichtunterst\xfctzung'), (u'Sieja', u'Sie ja'), (u'Sifihnchen', u'S\xf6hnchen'), (u'Signalst\xe9rke', u'Signalst\xe4rke'), (u'Siiden', u'S\xfcden'), (u'Siidfrankreich', u'S\xfcdfrankreich'), (u'siidliche', u's\xfcdliche'), (u'siil$', u's\xfc\xdf'), (u'siili', u's\xfc\xdf'), (u'Siilie', u'S\xfc\xdfe'), (u'siilier', u's\xfc\xdfer'), (u"SIim's", u"Slim's"), (u'Siinde', u'S\xfcnde'), (u'Siinden', u'S\xfcnden'), (u'Siinder', u'S\xfcnder'), (u'siindigen', u's\xfcndigen'), (u'sii\ufb02en', u's\xfc\xdfen'), (u'siJB', u's\xfc\xdf'), (u'SiJBe', u'S\xfc\xdfe'), (u'siJchtige', u's\xfcchtige'), (u'sijlien', u'si\xfc\xdfen'), (u'sijliesten', u's\xfc\xdfesten'), (u'Sijsser', u'S\xfc\xdfer'), (u'Sildtunnel', u'S\xfcdtunnel'), (u'Silfie', u'S\xfc\xdfe'), (u'Silfier', u'S\xfc\xdfer'), (u'Silfies', u'S\xfc\xdfes'), (u'silfker', u's\xfc\xdfer'), (u'Silnden', u'S\xfcnden'), (u'Silndenbock', u'S\xfcndenbock'), (u'sindja', u'sind ja'), (u'Sirl', u'Sir!'), (u'Sj_r', u'Sir'), (u'Skilaufen', u'Ski laufen'), (u'skrupelloserAnw\xe9lte', u'skrupelloser Anw\xe4lte'), (u"sL'lf$e", u's\xfc\xdfe'), (u'sL1B', u's\xfc\xdf'), (u'slch', u'sich'), (u'sle', u'sie'), (u'slebe', u'siebe'), (u'sLif$', u's\xfc\xdf'), (u'SLif$e', u'S\xfc\xdfe'), (u'SLif$er', u'S\xfc\xdfer'), (u'sLif$es', u's\xfc\xdfes'), (u'SLilSe', u'S\xfc\xdfe'), (u'Slliden', u'S\xfcden'), (u'Sllinde', u'S\xfcnde'), (u'sllindigen', u's\xfcndigen'), (u'Slnd', u'Sind'), (u'Slr', u'Sir'), (u'Slrs', u'Sirs'), (u'SoBen', u'So\xdfen'), (u'sofortl', u'sofort!'), (u'soh\xe9nen', u'sch\xf6nen'), (u'Solien', u'So\xdfen'), (u'sollenl', u'sollen!'), (u'SONDERMULL', u'SONDERM\xdcLL'), (u'sorgf\xe9iltig', u'sorgf\xe4ltig'), (u'sorgf\xe9ltig', u'sorgf\xe4ltig'), (u'souver\xe9ine', u'souver\xe4ne'), (u'souver\xe9inen', u'souver\xe4nen'), (u'souver\xe9ner', u'souver\xe4ner'), (u"sp'a'ter", u'sp\xe4ter'), (u'sp/elen', u'spielen'), (u'SpaB', u'Spa\xdf'), (u'Spaf$', u'Spa\xdf'), (u'Spaf2>', u'Spa\xdf'), (u'Spaffs', u'Spa\xdf'), (u'Spafi', u'Spa\xdf'), (u'Spafls', u'Spa\xdf'), (u'SpafS', u'Spa\xdf'), (u"Spal'5", u'Spa\xdf'), (u'Spal2>', u'Spa\xdf'), (u'Spal3', u'Spa\xdf'), (u'Spali', u'Spa\xdf'), (u'Spall', u'Spa\xdf'), (u'Spass', u'Spa\xdf'), (u'spat', u'sp\xe4t'), (u'spektakular', u'spektakul\xe4r'), (u'Spell', u'Sp\xe4\xdf'), (u'Spells', u'Sp\xe4\xdf'), (u'Spell\xbb', u'Spa\xdf'), (u'Spezialit\xe9t', u'Spezialit\xe4t'), (u'spfit', u'sp\xe4t'), (u'SpieB', u'Spie\xdf'), (u'spief$ig', u'spie\xdfig'), (u'Spielzeuggeschfiftn', u'Spielzeuggesch\xe4ft--'), (u'spiilte', u'sp\xfclte'), (u'spiiren', u'sp\xfcren'), (u'spiirt', u'sp\xfcrt'), (u'spiit', u'sp\xe4t'), (u'spijre', u'sp\xfcre'), (u'spijren', u'sp\xfcren'), (u'spijrt', u'sp\xfcrt'), (u'Spillmeier', u'Sp\xfclmeier'), (u'spilre', u'sp\xfcre'), (u'spilren', u'sp\xfcren'), (u'spit', u'sp\xe4t'), (u'Spitzenfriihstiick', u'Spitzenfr\xfchst\xfcck'), (u"spLir's", u"sp\xfcr's"), (u'splliren', u'sp\xfcren'), (u'splter', u'sp\xe4ter'), (u'Sportilbertragung', u'Sport\xfcbertragung'), (u'Sportsfraund', u'Sportsfreund'), (u'Sprachpijppchen', u'Sprachp\xfcppchen'), (u'SPRACHPUPPCHEN', u'SPRACHP\xdcPPCHEN'), (u'Spriichlein', u'Spr\xfcchlein'), (u'Sprilht', u'Spr\xfcht'), (u'spr\xe9che', u'spr\xe4che'), (u'spr\xe9chen', u'spr\xe4chen'), (u'spr\xe9chet', u'spr\xe4chet'), (u'Spr\ufb02che', u'Spr\xfcche'), (u'spr\ufb02ht', u'spr\xfcht'), (u'spUl', u'sp\xfcl'), (u'spUr', u'sp\xfcr'), (u'spurbare', u'sp\xfcrbare'), (u'spUrt', u'sp\xfcrt'), (u'sp\xa7ter', u'sp\xe4ter'), (u'Sp\xe4\xdf', u'Spa\xdf'), (u'sp\xe9it', u'sp\xe4t'), (u'sp\xe9iter', u'sp\xe4ter'), (u'sp\xe9t', u'sp\xe4t'), (u'Sp\xe9ter', u'Sp\xe4ter'), (u'Sp\xe9tzchen', u'Sp\xe4tzchen'), (u'Sp\xe9tzchenl', u'Sp\xe4tzchen!'), (u'ssh', u'sah'), (u'st6Bt', u'st\xf6\xdft'), (u'st6hnt', u'st\xf6hnt'), (u'st6lSt', u'st\xf6\xdft'), (u'St6rt', u'St\xf6rt'), (u'ST@HNT', u'ST\xd6HNT'), (u'Staatsaff\xe9ren', u'Staatsaff\xe4ren'), (u'staatsbllirgerliches', u'staatsb\xfcrgerliches'), (u'Staatsgesch\xe9fte', u'Staatsgesch\xe4fte'), (u'Standardan\xe9sthesie', u'Standardan\xe4sthesie'), (u'standig', u'st\xe4ndig'), (u'STARSCREAMI', u'STARSCREAM:'), (u'station\xe9r', u'station\xe4r'), (u'Statusmeldungl', u'Statusmeldung!'), (u'stdrte', u'st\xf6rte'), (u'stecktjede', u'steckt jede'), (u'Stehenbleiben', u'Stehen bleiben'), (u'Stehvermiigen', u'Stehverm\xf6gen'), (u'Steigbilgeldinger', u'Steigb\xfcgeldinger'), (u'Steinh\xe9user', u'Steinh\xe4user'), (u'Sternenkijsse', u'Sternenk\xfcsse'), (u'Steuererkl\xe9rung', u'Steuererkl\xe4rung'), (u'Steuererkl\xe9rungen', u'Steuererkl\xe4rungen'), (u'Steuerprtifer', u'Steuerpr\xfcfer'), (u'Steuerprtifung', u'Steuerpr\xfcfung'), (u'Steuersiitzen', u'Steuers\xe4tzen'), (u'stfipseln', u'st\xf6pseln'), (u'stfiren', u'st\xf6ren'), (u'stfirker', u'st\xe4rker'), (u'Stfirt', u'St\xf6rt'), (u'stfirzt', u'st\xfcrzt'), (u'stieB', u'stie\xdf'), (u'Stiefbriider', u'Stiefbr\xfcder'), (u'Stiicke', u'St\xfccke'), (u'Stiihle', u'St\xfchle'), (u'Stiihlen', u'St\xfchlen'), (u'stiihnt', u'st\xf6hnt'), (u'Stiillen', u'St\xe4llen'), (u'Stiire', u'St\xf6re'), (u'stiiren', u'st\xf6ren'), (u'Stiirme', u'St\xfcrme'), (u'stiirmischen', u'st\xfcrmischen'), (u'Stiirsignale', u'St\xf6rsignale'), (u'stiirt', u'st\xf6rt'), (u'Stiirung', u'St\xf6rung'), (u'stiirzen', u'st\xfcrzen'), (u'Stiitzpunkt', u'St\xfctzpunkt'), (u'Stijck', u'St\xfcck'), (u'Stijckchen', u'St\xfcckchen'), (u'Stijcke', u'St\xfccke'), (u'stijhle', u'st\xfchle'), (u'stijrme', u'st\xfcrme'), (u'stijrzen', u'st\xfcrzen'), (u'Stilck', u'St\xfcck'), (u'Stilcke', u'St\xfccke'), (u'Stillckchen', u'St\xfcckchen'), (u'Stillst\xe9nde', u'Stillst\xe4nde'), (u'Stilvolll', u'Stilvoll!'), (u'stinden', u'st\xe4nden'), (u'Stldseite', u'S\xfcdseite'), (u'stleg', u'stieg'), (u'Stllihle', u'St\xfchle'), (u'Stllirmen', u'St\xfcrmen'), (u'stllirzt', u'st\xfcrzt'), (u'stlllrzen', u'st\xfcrzen'), (u'Stl\ufb02', u'Stift'), (u'sto/3en', u'sto\xdfen'), (u'StoB', u'Sto\xdf'), (u'stoBe', u'sto\xdfe'), (u'stof$en', u'sto\xdfen'), (u'Stofi', u'Sto\xdf'), (u'STOHNT', u'ST\xd6HNT'), (u'Stol3zahn', u'Sto\xdfzahn'), (u'Stol3zeit', u'Sto\xdfzeit'), (u'stolie', u'sto\xdfe'), (u'Storung', u'St\xf6rung'), (u'Str6men', u'Str\xf6men'), (u'str6mt', u'str\xf6mt'), (u'StraBe', u'Stra\xdfe'), (u'StraBen', u'Stra\xdfen'), (u'StraBenk6tern', u'Stra\xdfenk\xf6tern'), (u'Straf$e', u'Stra\xdfe'), (u'Strafiengang', u'Stra\xdfengang'), (u'Strafienratten', u'Stra\xdfenratten'), (u'Strafienschlacht', u'Stra\xdfenschlacht'), (u'Straflsenecke', u'Stra\xdfenecke'), (u'Straflsenmaler', u'Stra\xdfenmaler'), (u'Straflsenschilder', u'Stra\xdfenschilder'), (u'Straft\xe9ter', u'Straft\xe4ter'), (u'Strahlenschutzger\xe9t', u'Strahlenschutzger\xe4t'), (u'Strahlungsintensit\xe9t', u'Strahlungsintensit\xe4t'), (u'Stral3en', u'Stra\xdfen'), (u'Stral5e', u'Stra\xdfe'), (u'Stralie', u'Stra\xdfe'), (u'Straliengang', u'Stra\xdfengang'), (u'Stralienk\xe9ter', u'Stra\xdfenk\xf6ter'), (u'Straliensperre', u'Stra\xdfensperre'), (u'Streitkr\xe9fte', u'Streitkr\xe4fte'), (u'Streitkr\xe9ften', u'Streitkr\xe4ften'), (u'Streit\xe9xte', u'Streit\xe4xte'), (u'strfimten', u'str\xf6mten'), (u'Striimen', u'Str\xf6men'), (u'Striimungen', u'Str\xf6mungen'), (u'Stromschliige', u'Stromschl\xe4ge'), (u'Stromschnellenl', u'Stromschnellen!'), (u'Stromung', u'Str\xf6mung'), (u'Strullerl', u'Struller!'), (u'Str\xe9mung', u'Str\xf6mung'), (u'Str\xe9mungen', u'Str\xf6mungen'), (u'sturzte', u'st\xfcrzte'), (u'STUTZPUNKT', u'ST\xdcTZPUNKT'), (u'St\xe9be', u'St\xe4be'), (u'st\xe9hnt', u'st\xf6hnt'), (u'st\xe9hnte', u'st\xf6hnte'), (u'St\xe9idtchen', u'St\xe4dtchen'), (u'St\xe9idte', u'St\xe4dte'), (u'st\xe9indig', u'st\xe4ndig'), (u'St\xe9irke', u'St\xe4rke'), (u'st\xe9irker', u'st\xe4rker'), (u'St\xe9irkeres', u'St\xe4rkeres'), (u'st\xe9llst', u'st\xf6\xdft'), (u'St\xe9ndchen', u'St\xe4ndchen'), (u'St\xe9nder', u'St\xe4nder'), (u'St\xe9ndig', u'St\xe4ndig'), (u'st\xe9pseln', u'st\xf6pseln'), (u'st\xe9ren', u'st\xf6ren'), (u'St\xe9rke', u'St\xe4rke'), (u'St\xe9rken', u'St\xe4rken'), (u'st\xe9rker', u'st\xe4rker'), (u'St\xe9rkere', u'St\xe4rkere'), (u'st\xe9rkeres', u'st\xe4rkeres'), (u'st\xe9rkste', u'st\xe4rkste'), (u'st\xe9rst', u'st\xf6rst'), (u'st\xe9rt', u'st\xf6rt'), (u'St\xe9rung', u'St\xf6rung'), (u'St\xe9tten', u'St\xe4tten'), (u'St\ufb02ck', u'St\xfcck'), (u'St\ufb02hlen', u'St\xfchlen'), (u'sUB', u's\xfc\xdf'), (u'sUBe', u's\xfc\xdfe'), (u'Suchfeam', u'Suchteam'), (u'SUden', u'S\xfcden'), (u'Sudseite', u'S\xfcdseite'), (u'Sudwest', u'S\xfcdwest'), (u'sUf$', u's\xfc\xdf'), (u'SUf$e', u'S\xfc\xdfe'), (u'suMM\u2020', u'SUMMT'), (u'Suohet', u'Suchet'), (u'Superkr\xe9fte', u'Superkr\xe4fte'), (u'superl\xe9cherlich', u'superl\xe4cherlich'), (u"s\xa2'il3", u's\xfc\xdf'), (u'S\xe9cke', u'S\xe4cke'), (u'S\xe9ge', u'S\xe4ge'), (u's\xe9he', u's\xe4he'), (u'S\xe9hne', u'S\xf6hne'), (u'S\xe9hnen', u'S\xf6hnen'), (u'S\xe9icke', u'S\xe4cke'), (u'S\xe9inger', u'S\xe4nger'), (u'S\xe9iulen', u'S\xe4ulen'), (u'S\xe9ldner', u'S\xf6ldner'), (u's\xe9mfl/che', u's\xe4mtliche'), (u's\xe9mtliche', u's\xe4mtliche'), (u's\xe9mtlichen', u's\xe4mtlichen'), (u'S\xe9nger', u'S\xe4nger'), (u'S\xe9ngerin', u'S\xe4ngerin'), (u's\xe9ubern', u's\xe4ubern'), (u's\xe9uft', u's\xe4uft'), (u's\xe9ugen', u's\xe4ugen'), (u'S\xe9ulen', u'S\xe4ulen'), (u'S\xe9urewannen', u'S\xe4urewannen'), (u'S\ufb02dh\xe9ingen', u'S\xfcdh\xe4ngen'), (u'T6chter', u'T\xf6chter'), (u'T6pfchen', u'T\xf6pfchen'), (u'T6rn', u'T\xf6rn'), (u'T6rtchen', u'T\xf6rtchen'), (u't6te', u't\xf6te'), (u'T6ten', u'T\xf6ten'), (u't6tet', u't\xf6tet'), (u'TANZERINNEN', u'T\xc4NZERINNEN'), (u'Tater', u'T\xe4ter'), (u'tats\xe9chlich', u'tats\xe4chlich'), (u'tats\xe9chliche', u'tats\xe4chliche'), (u'tats\xe9ichlich', u'tats\xe4chlich'), (u'Tatverd\xe9ichtigen', u'Tatverd\xe4chtigen'), (u'Tauchg\xe9inge', u'Tauchg\xe4nge'), (u'Tauchg\xe9nge', u'Tauchg\xe4nge'), (u'Tauschgesch\xe9fte', u'Tauschgesch\xe4fte'), (u'Tauschgesch\xe9\ufb02e', u'Tauschgesch\xe4fte'), (u'Tbrn', u'T\xf6rn'), (u'tbten', u't\xf6ten'), (u'tdten', u't\xf6ten'), (u'tdtete', u't\xf6tete'), (u'Telefongespr\xe9che', u'Telefongespr\xe4che'), (u'Tempelsch\xe9nderf', u'Tempelsch\xe4nder!'), (u'TemPO', u'Tempo'), (u'TESTGELANDE', u'TESTGEL\xc4NDE'), (u'Testvorf\ufb02hrungen', u'Testvorf\xfchrungen'), (u'tfidlich', u't\xf6dlich'), (u'tfiitet', u't\xf6tet'), (u'Tfir', u'T\xfcr'), (u'tfirkischen', u't\xfcrkischen'), (u'Tfite', u'T\xfcte'), (u'Theaterstfick', u'Theaterst\xfcck'), (u'Therapiel', u'Therapie!'), (u'Thermalger\xe9t', u'Thermalger\xe4t'), (u'Thronr\xe9uber', u'Thronr\xe4uber'), (u'Thronr\xe9uberin', u'Thronr\xe4uberin'), (u'Tiefkilhlung', u'Tiefk\xfchlung'), (u'Tiefktih/system', u'Tiefk\xfchlsystem'), (u'Tiefktihleind\xe9mmung', u'Tiefk\xfchleind\xe4mmung'), (u'TIEFKUHL', u'TIEFK\xdcHL'), (u'Tiefkuhlstasis', u'Tiefk\xfchlstasis'), (u'Tiefkuhlung', u'Tiefk\xfchlung'), (u'tiglich', u't\xe4glich'), (u'tiichtige', u't\xfcchtige'), (u'tiint', u't\xf6nt'), (u'Tiipfchen', u'T\xf6pfchen'), (u'Tiipfchennummer', u'T\xf6pfchennummer'), (u'Tiir', u'T\xfcr'), (u'Tiiren', u'T\xfcren'), (u'Tiirl', u'T\xfcr!'), (u'Tiirme', u'T\xfcrme'), (u'tiite', u't\xf6te'), (u'Tiite', u'T\xfcte'), (u'tiiten', u't\xf6ten'), (u'tiitet', u't\xf6tet'), (u'tiitete', u't\xf6tete'), (u'TiJr', u'T\xfcr'), (u'Tijrme', u'T\xfcrme'), (u'Tilr', u'T\xfcr'), (u'Tilrglocke', u'T\xfcrglocke'), (u'Tilrklingel', u'T\xfcrklingel'), (u'Tilr\xe9ffner', u'T\xfcr\xf6ffner'), (u'Tippger\xe9usch', u'Tippger\xe4usch'), (u'Tischlenuerkstatt', u'Tischlerwerkstatt'), (u"TL'lr", u'T\xfcr'), (u'tlglich', u't\xe4glich'), (u'Tllir', u'T\xfcr'), (u'Tllirkei', u'T\xfcrkei'), (u'Tlllpfelchen', u'T\xfcpfelchen'), (u'TOILETTENSPULUNG', u'TOILETTENSP\xdcLUNG'), (u'Tonl', u'Ton'), (u'Toreroabs\xe9tze', u'Toreroabs\xe4tze'), (u'Tortenb\xe9ickerin', u'Tortenb\xe4ckerin'), (u'Tragfidie', u'Trag\xf6die'), (u'Tragiidie', u'Trag\xf6die'), (u'Trag\xe9die', u'Trag\xf6die'), (u'Trainingsijbung', u'Trainings\xfcbung'), (u'TRAUMKCRPER', u'TRAUMK\xd6RPER'), (u'treffan', u'treffen'), (u'trfiumen', u'tr\xe4umen'), (u'Tribiinen', u'Trib\xfcnen'), (u"trif'f't", u'trifft'), (u'trigt', u'tr\xe4gt'), (u'Triibsal', u'Tr\xfcbsal'), (u'Triimmem', u'Tr\xfcmmern'), (u'triistllch', u'tr\xf6stlich'), (u'Triistungen', u'Tr\xf6stungen'), (u'Triiume', u'Tr\xe4ume'), (u'Trilmmer', u'Tr\xfcmmer'), (u'triume', u'tr\xe4ume'), (u'Trockenger\xe9ite', u'Trockenger\xe4te'), (u'Trockenger\xe9te', u'Trockenger\xe4te'), (u'Tropfsteinhiihle', u'Tropfsteinh\xf6hle'), (u'Trottell', u'Trottel!'), (u'Trubsal', u'Tr\xfcbsal'), (u'tr\xe9ge', u'tr\xe4ge'), (u'Tr\xe9gerschiff', u'Tr\xe4gerschiff'), (u'tr\xe9gt', u'tr\xe4gt'), (u'Tr\xe9igerschiff', u'Tr\xe4gerschiff'), (u'tr\xe9igt', u'tr\xe4gt'), (u'tr\xe9ium', u'tr\xe4um'), (u'tr\xe9iume', u'tr\xe4ume'), (u'tr\xe9iumen', u'tr\xe4umen'), (u'tr\xe9iumt', u'tr\xe4umt'), (u'tr\xe9llert', u'tr\xe4llert'), (u'Tr\xe9ne', u'Tr\xe4ne'), (u'Tr\xe9nen', u'Tr\xe4nen'), (u'Tr\xe9um', u'Tr\xe4um'), (u'tr\xe9ume', u'tr\xe4ume'), (u'Tr\xe9umen', u'Tr\xe4umen'), (u'Tr\xe9umer', u'Tr\xe4umer'), (u'tr\xe9umst', u'tr\xe4umst'), (u'Tr\xe9umt', u'Tr\xe4umt'), (u'Tschiiss', u'Tsch\xfcss'), (u'Tschiissl', u'Tsch\xfcss!'), (u'tschijss', u'tsch\xfcss'), (u'Tschtiss', u'Tsch\xfcss'), (u'tsch\xfc\xdf', u'tsch\xfcss'), (u'Tsch\ufb02s', u'Tsch\xfcs'), (u'Ttir', u'T\xfcr'), (u'ttlckisch', u't\xfcckisch'), (u'Ttlte', u'T\xfcte'), (u'tubul\xe9re', u'tubul\xe4re'), (u'Tupperschiissel', u'Tuppersch\xfcssel'), (u'TUR', u'T\xdcR'), (u'TUr', u'T\xfcr'), (u'Turen', u'T\xfcren'), (u'TURKEI', u'T\xdcRKEI'), (u'Turmwiichter', u'Turmw\xe4chter'), (u'tutjetzt', u'tut jetzt'), (u'typlschl', u'typlsch!'), (u'T\xe9chter', u'T\xf6chter'), (u't\xe9d/ichen', u't\xf6dlichen'), (u't\xe9dlich', u't\xf6dlich'), (u't\xe9dliche', u't\xf6dliche'), (u't\xe9dlichen', u't\xf6dlichen'), (u't\xe9glich', u't\xe4glich'), (u't\xe9glichen', u't\xe4glichen'), (u't\xe9iglich', u't\xe4glich'), (u't\xe9itowieren', u't\xe4towieren'), (u't\xe9itowierte', u't\xe4towierte'), (u'T\xe9itowierung', u'T\xe4towierung'), (u't\xe9iuschen', u't\xe4uschen'), (u'T\xe9ler', u'T\xe4ler'), (u'T\xe9lpell', u'T\xf6lpel!'), (u'T\xe9nze', u'T\xe4nze'), (u'T\xe9nzerin', u'T\xe4nzerin'), (u'T\xe9pfchen', u'T\xf6pfchen'), (u'T\xe9pfchenquatsch', u'T\xf6pfchenquatsch'), (u'T\xe9pfchensache', u'T\xf6pfchensache'), (u't\xe9te', u't\xf6te'), (u'T\xe9ten', u'T\xf6ten'), (u't\xe9test', u't\xe4test'), (u't\xe9tet', u't\xf6tet'), (u't\xe9tete', u't\xf6tete'), (u't\xe9towieren', u't\xe4towieren'), (u't\xe9towierte', u't\xe4towierte'), (u'T\xe9towierung', u'T\xe4towierung'), (u'T\xe9towierungen', u'T\xe4towierungen'), (u't\xe9uschen', u't\xe4uschen'), (u't\xe9uscht', u't\xe4uscht'), (u'T\xe9uschung', u'T\xe4uschung'), (u'T\xe9uschungsman\xe9ver', u'T\xe4uschungsman\xf6ver'), (u"Ub6FpFUfl'T1al", u'\xfcberpr\xfcf'), (u"Ub6l'pl'Uf\u20ac", u'\xdcberpr\xfcfe'), (u'Ube', u'\xdcbe'), (u'Ubel', u'\xfcbel'), (u'Ubelkeit', u'\xdcbelkeit'), (u'Ubelt\xe9ter', u'\xdcbelt\xe4ter'), (u'Uben', u'\xdcben'), (u'Uben/vachen', u'\xdcberwachen'), (u'Uben/vacher', u'\xdcberwacher'), (u'Uben/vacht', u'\xdcberwacht'), (u'Uben/vachungen', u'\xdcberwachungen'), (u'Uben/vachungsgesetz', u'\xdcberwachungsgesetz'), (u'Uben/vinden', u'\xfcberwinden'), (u'Uber', u'\xfcber'), (u'UBER', u'\xdcBER'), (u'Uberall', u'\xfcberall'), (u'Uberanstrenge', u'\xfcberanstrenge'), (u'Uberanstrengung', u'\xdcberanstrengung'), (u'Uberarbeiten', u'\xdcberarbeiten'), (u'UberAuf$erirdische', u'\xfcber Au\xdferirdische'), (u'Uberaus', u'\xfcberaus'), (u'Uberbleibsel', u'\xdcberbleibsel'), (u'Uberblick', u'\xdcberblick'), (u'Uberbringe', u'\xfcberbringe'), (u'Uberdauern', u'\xfcberdauern'), (u'Uberdecken', u'\xfcberdecken'), (u'Ubereinstimmung', u'\xdcbereinstimmung'), (u'Uberfahren', u'\xfcberfahren'), (u'Uberfall', u'\xdcberfall'), (u'Uberflilssig', u'\xfcberfl\xfcssig'), (u'Ubergabe', u'\xdcbergabe'), (u'Ubergaben', u'\xdcbergaben'), (u'Ubergabepunkt', u'\xdcbergabepunkt'), (u'Ubergangen', u'\xfcbergangen'), (u'Ubergangsweise', u'\xfcbergangsweise'), (u'Ubergeben', u'\xfcbergeben'), (u'Ubergehen', u'\xfcbergehen'), (u'Uberhaupt', u'\xdcberhaupt'), (u'Uberholt', u'\xdcberholt'), (u'Uberholter', u'\xfcberholter'), (u'Uberh\xe9rt', u'\xfcberh\xf6rt'), (u'Uberjemanden', u'\xfcber jemanden'), (u'Uberlagerungs', u'\xdcberlagerungs'), (u'Uberlandleitungen', u'\xdcberlandleitungen'), (u'Uberlass', u'\xdcberlass'), (u'Uberlasse', u'\xfcberlasse'), (u'Uberlassen', u'\xfcberlassen'), (u'Uberlassenl', u'\xfcberlassen!'), (u'Uberlasteten', u'\xdcberlasteten'), (u'Uberleben', u'\xdcberleben'), (u'Uberlebende', u'\xdcberlebende'), (u'Uberlebenden', u'\xdcberlebenden'), (u'Uberlebenschancen', u'\xdcberlebenschancen'), (u'Uberlebenswichtigen', u'\xfcberlebenswichtigen'), (u'Uberlebt', u'\xfcberlebt'), (u'Uberleg', u'\xfcberleg'), (u'Uberlegen', u'\xdcberlegen'), (u'Uberlegenheit', u'\xdcberlegenheit'), (u'uberlegt', u'\xfcberlegt'), (u'Uberlegten', u'\xfcberlegten'), (u'Uberleiten', u'\xfcberleiten'), (u'Uberleitung', u'\xdcberleitung'), (u'Uberlieferungen', u'\xdcberlieferungen'), (u'Uberl\xe9sst', u'\xfcberl\xe4sst'), (u'Uberm', u'\xfcberm'), (u'Ubermorgen', u'\xdcbermorgen'), (u'Ubernachtungsgast', u'\xdcbernachtungsgast'), (u'Ubernahm', u'\xfcbernahm'), (u'Ubernahme', u'\xdcbernahme'), (u'Ubernahmen', u'\xfcbernahmen'), (u'Ubernehme', u'\xfcbernehme'), (u'Ubernehmen', u'\xfcbernehmen'), (u'Ubernimmst', u'\xfcbernimmst'), (u'ubernimmt', u'\xfcbernimmt'), (u'Ubernommen', u'\xfcbernommen'), (u'Uberpriifen', u'\xfcberpr\xfcfen'), (u'Uberprilfen', u'\xfcberpr\xfcfen'), (u'Uberprliifen', u'\xdcberpr\xfcfen'), (u'Uberprufe', u'\xfcberpr\xfcfe'), (u'Uberprufen', u'\xfcberpr\xfcfen'), (u'Uberpruft', u'\xfcberpr\xfcft'), (u'Uberraschend', u'\xdcberraschend'), (u'Uberrascht', u'\xdcberrascht'), (u'Uberraschte', u'\xdcberraschte'), (u'Uberraschter', u'\xfcberraschter'), (u'Uberraschung', u'\xdcberraschung'), (u'Uberraschungen', u'\xdcberraschungen'), (u'Uberraschungl', u'\xdcberraschung!'), (u'Uberreagiert', u'\xfcberreagiert'), (u'Uberreden', u'\xfcberreden'), (u'Uberredet', u'\xdcberredet'), (u'Uberreste', u'\xdcberreste'), (u'Uberrumpeln', u'\xfcberrumpeln'), (u'Uberrumple', u'\xdcberrumple'), (u'Ubers', u'\xfcbers'), (u'Uberschl\xe9gt', u'\xdcberschl\xe4gt'), (u'Uberschreiten', u'\xdcberschreiten'), (u'Uberschritten', u'\xfcberschritten'), (u'Uberschwemmung', u'\xdcberschwemmung'), (u'Ubersehen', u'\xfcbersehen'), (u'Ubersensibilit\xe9t', u'\xdcbersensibilit\xe4t'), (u'Ubersetzung', u'\xdcbersetzung'), (u'Uberspannte', u'\xfcberspannte'), (u'Uberspielt', u'\xfcberspielt'), (u'Uberstehen', u'\xdcberstehen'), (u'Ubersteigerten', u'\xfcbersteigerten'), (u'Ubersteigt', u'\xfcbersteigt'), (u'Uberstunden', u'\xdcberstunden'), (u'Ubertraf', u'\xfcbertraf'), (u'UBERTRAGEN', u'\xdcBERTRAGEN'), (u'Ubertragen', u'\xfcbertragen'), (u'UBERTRAGUNG', u'\xdcBERTRAGUNG'), (u'ubertreibe', u'\xfcbertreibe'), (u'Ubertreiben', u'\xfcbertreiben'), (u'Ubertrieben', u'\xfcbertrieben'), (u'Ubertriebene', u'\xdcbertriebene'), (u'ubertriebener', u'\xfcbertriebener'), (u'Ubertrifft', u'\xdcbertrifft'), (u'Ubervvachen', u'\xfcberwachen'), (u'Ubervvacht', u'\xfcberwacht'), (u'Ubervvachung', u'\xdcberwachung'), (u'Ubervvachungs', u'\xdcberwachungs'), (u'Ubervvachungsstaat', u'\xdcberwachungsstaat'), (u'Ubervvachungsstaats', u'\xdcberwachungsstaats'), (u'Ubervvachungsvideos', u'\xdcberwachungsvideos'), (u'Ubervv\xe9iltigend', u'\xfcberw\xe4ltigend'), (u'Uberwachen', u'\xfcberwachen'), (u'Uberwacher', u'\xdcberwacher'), (u'Uberwachung', u'\xdcberwachung'), (u'Uberzeuge', u'\xfcberzeuge'), (u'Uberzeugen', u'\xfcberzeugen'), (u'Uberzeugend', u'\xfcberzeugend'), (u'Uberzeugt', u'\xfcberzeugt'), (u'Uberzeugung', u'\xdcberzeugung'), (u'Uberzeugungen', u'\xdcberzeugungen'), (u'Uberziehen', u'\xfcberziehen'), (u'Uberzuleiten', u'\xfcberzuleiten'), (u'ublem', u'\xfcblem'), (u'Ubler', u'\xdcbler'), (u'Ubles', u'\xdcbles'), (u'Ublich', u'\xfcblich'), (u'Ubliche', u'\xdcbliche'), (u'ublichen', u'\xfcblichen'), (u'Ubrig', u'\xfcbrig'), (u'Ubrige', u'\xdcbrige'), (u'Ubrigen', u'\xdcbrigen'), (u'Ubrigens', u'\xfcbrigens'), (u'Ubrlgens', u'\xdcbrigens'), (u'Ubrllccol', u'Ubriacco!'), (u'Ubung', u'\xdcbung'), (u'Ubungsbedingungen', u'\xdcbungsbedingungen'), (u'Ubungsschiisse', u'\xdcbungssch\xfcsse'), (u'Ubungsschusse', u'\xdcbungssch\xfcsse'), (u"Ub\u20acf'pf'Uf\u20acl'1", u'\xfcberpr\xfcfen'), (u'Uher', u'\xdcber'), (u'ultrakiistlichl', u'ultrak\xf6stlich!'), (u'umgeriistet', u'umger\xfcstet'), (u'umg\xe9nglich', u'umg\xe4nglich'), (u'umhdren', u'umh\xf6ren'), (u'umh\xe9ngt', u'umh\xe4ngt'), (u'Umschlfigen', u'Umschl\xe4gen'), (u'umschlieBt', u'umschlie\xdft'), (u'Umst\xe9inden', u'Umst\xe4nden'), (u'Umst\xe9nde', u'Umst\xe4nde'), (u'Umst\xe9nden', u'Umst\xe4nden'), (u'umst\xe9ndlich', u'umst\xe4ndlich'), (u'umweltsch\xe9dlich', u'umweltsch\xe4dlich'), (u'unabhiingiges', u'unabh\xe4ngiges'), (u'unabh\xe9ingig', u'unabh\xe4ngig'), (u'unabh\xe9ngig', u'unabh\xe4ngig'), (u'unabl\xe9ssig', u'unabl\xe4ssig'), (u'Unauff\xe9lligeres', u'Unauff\xe4lligeres'), (u'unaufhalfsam', u'unaufhaltsam'), (u'unaufhiirlich', u'unaufh\xf6rlich'), (u'unaufh\xe9rlich', u'unaufh\xf6rlich'), (u'unaufi\xe9llig', u'unauff\xe4llig'), (u'unberijhrbar', u'unber\xfchrbar'), (u'unberllihrten', u'unber\xfchrten'), (u'unbesch\xe9digt', u'unbesch\xe4digt'), (u'Uncl', u'Und'), (u'undja', u'und ja'), (u'undjeder', u'und jeder'), (u'undjemand', u'und jemand'), (u'undjetzt', u'und jetzt'), (u'undlassenihn', u'und lassen ihn'), (u'undlhnen', u'und Ihnen'), (u'undurchfuhrbar', u'undurchf\xfchrbar'), (u'uneingeschr\xe9nkten', u'uneingeschr\xe4nkten'), (u'unergrilndliche', u'unergr\xfcndliche'), (u'unerhort', u'unerh\xf6rt'), (u'unerhorte', u'unerh\xf6rte'), (u'unerkl\xe9rliche', u'unerkl\xe4rliche'), (u'unerkl\xe9rlichen', u'unerkl\xe4rlichen'), (u'unertr\xe9glich', u'unertr\xe4glich'), (u"unf'a'hig", u'unf\xe4hig'), (u'Unfahigkeit', u'Unf\xe4higkeit'), (u'unfersfellen', u'unterstellen'), (u'unfiirmigen', u'unf\xf6rmigen'), (u'unf\xe9hig', u'unf\xe4hig'), (u'unf\xe9higste', u'unf\xe4higste'), (u'unf\xe9ihigste', u'unf\xe4higste'), (u'Unf\xe9ille', u'Unf\xe4lle'), (u'Unf\xe9lle', u'Unf\xe4lle'), (u'ungef\xe9hr', u'ungef\xe4hr'), (u'ungef\xe9hre', u'ungef\xe4hre'), (u'Ungef\xe9ihr', u'Ungef\xe4hr'), (u'ungef\xe9ihrlich', u'ungef\xe4hrlich'), (u'ungemutlich', u'ungem\xfctlich'), (u'ungenugend', u'ungen\xfcgend'), (u'ungestbrt', u'ungest\xf6rt'), (u'ungewfihnliche', u'ungew\xf6hnliche'), (u'Ungewfjhnliches', u'Ungew\xf6hnliches'), (u'ungewiihnlich', u'ungew\xf6hnlich'), (u'Ungewijhnliches', u'Ungew\xf6hnliches'), (u'ungew\xe9hnlich', u'ungew\xf6hnlich'), (u'ungew\xe9hnliche', u'ungew\xf6hnliche'), (u'ungew\xe9hnlichste', u'ungew\xf6hnlichste'), (u'ungfinstigen', u'ung\xfcnstigen'), (u'ungiiltig', u'ung\xfcltig'), (u'ungilnstig', u'ung\xfcnstig'), (u'Unglaubliohl', u'Unglaublich!'), (u'unglaubwurdig', u'unglaubw\xfcrdig'), (u'Unglfiubige', u'Ungl\xe4ubige'), (u'Ungliicklicherweise', u'Ungl\xfccklicherweise'), (u'Unglilck', u'Ungl\xfcck'), (u"Ungll'Jcklichervveise", u'Ungl\xfccklicherweise'), (u'Unglllick', u'Ungl\xfcck'), (u'unglllicklich', u'ungl\xfccklich'), (u'ungllllckliche', u'ungl\xfcckliche'), (u'unglucklich', u'ungl\xfccklich'), (u'Ungl\xe9ubiger', u'Ungl\xe4ubiger'), (u'ungultig', u'ung\xfcltig'), (u'ungunstigen', u'ung\xfcnstigen'), (u'unheimlichl', u'unheimlich!'), (u'UNHORBARES', u'UNH\xd6RBARES'), (u'unh\xe9flich', u'unh\xf6flich'), (u'Universitlt', u'Universit\xe4t'), (u'Universit\xe9t', u'Universit\xe4t'), (u'unlfisbare', u'unl\xf6sbare'), (u'unm6glich', u'unm\xf6glich'), (u'unmfiglich', u'unm\xf6glich'), (u'Unmiiglich', u'Unm\xf6glich'), (u'Unmiigliche', u'Unm\xf6gliche'), (u'unmijglich', u'unm\xf6glich'), (u'unmissverst\xe9ndlich', u'unmissverst\xe4ndlich'), (u'unmoglich', u'unm\xf6glich'), (u'Unmtioglich', u'Unm\xf6glich'), (u'Unm\xe9glich', u'Unm\xf6glich'), (u'unm\xe9glioh', u'unm\xf6glich'), (u'unnatiirliche', u'unnat\xfcrliche'), (u'unnaturliche', u'unnat\xfcrliche'), (u'unnfitigen', u'unn\xf6tigen'), (u'unniitig', u'unn\xf6tig'), (u'unnllitz', u'unn\xfctz'), (u'unn\xe9tig', u'unn\xf6tig'), (u'unn\xe9tigen', u'unn\xf6tigen'), (u'unol', u'und'), (u'unp\xe9sslich', u'unp\xe4sslich'), (u'UNREGELMASSIG', u'UNREGELM\xc4SSIG'), (u'Unregelm\xe9fiigkeiten', u'Unregelm\xe4\xdfigkeiten'), (u'unschliissig', u'unschl\xfcssig'), (u'unserejungen', u'unsere jungen'), (u'unsererAnw\xe9lte', u'unserer Anw\xe4lte'), (u'unsererjungfr\xe9ulichen', u'unserer jungfr\xe4ulichen'), (u'unsjede', u'uns jede'), (u'uns\xe9glich', u'uns\xe4glich'), (u'Untenuelt', u'Unterwelt'), (u'unterdriickten', u'unterdr\xfcckten'), (u'Unterdrilckung', u'\xdcnterdr\xfcckung'), (u'unterdrtlckte', u'unterdr\xfcckte'), (u'Unterdr\ufb02ckung', u'Unterdr\xfcckung'), (u'Unterhaltskostenl', u'Unterhaltskosten!'), (u'Unterhaltungsm\xe9fiig', u'Unterhaltungsm\xe4\xdfig'), (u'unterhfilt', u'unterh\xe4lt'), (u'unterh\xe9lt', u'unterh\xe4lt'), (u'unterschitzt', u'untersch\xe4tzt'), (u'untersch\xe9tzte', u'untersch\xe4tzte'), (u'unterstiitzt', u'unterst\xfctzt'), (u'Unterstiitzung', u'Unterst\xfctzung'), (u'unterstijtzt', u'unterst\xfctzt'), (u'Unterstiltzung', u'Unterst\xfctzung'), (u'Unterstllitzung', u'Unterst\xfctzung'), (u'unterstutzen', u'unterst\xfctzen'), (u'unterstutzt', u'unterst\xfctzt'), (u'Unterstutzten', u'Unterst\xfctzten'), (u'Unterstutzung', u'Unterst\xfctzung'), (u'Untersuchungsausschijsse', u'Untersuchungsaussch\xfcsse'), (u'Unterw\xe9sche', u'Unterw\xe4sche'), (u'untr\xe9stlich', u'untr\xf6stlich'), (u'Unt\xe9tigkeit', u'Unt\xe4tigkeit'), (u'unumg\xe9nglich', u'unumg\xe4nglich'), (u'unverm\xe9hlt', u'unverm\xe4hlt'), (u'Unverschfimtheitl', u'Unversch\xe4mtheit'), (u'unversch\xe9mte', u'unversch\xe4mte'), (u'Unversch\xe9mtheitl', u'Unversch\xe4mtheit'), (u'UNVERSTANDLICH', u'UNVERST\xc4NDLICH'), (u'UNVERSTANDLICHE', u'UNVERST\xc4NDLICHE'), (u'UNVERSTANDLICHER', u'UNVERST\xc4NDLICHER'), (u'UNVERSTANDLICHES', u'UNVERST\xc4NDLICHES'), (u'Unverst\xe9ndliche', u'Unverst\xe4ndliche'), (u'unverst\xe9ndlichen', u'unverst\xe4ndlichen'), (u'unverst\xe9ndliches', u'unverst\xe4ndliches'), (u'unverzlliglich', u'unverz\xfcglich'), (u'unver\xe9ndert', u'unver\xe4ndert'), (u'Unzerbrechliohen', u'Unzerbrechlichen'), (u'unzurechnungsfahig', u'unzurechnungsf\xe4hig'), (u'unzuverlassiger', u'unzuverl\xe4ssiger'), (u'Unzuverl\xe9ssiger', u'Unzuverl\xe4ssiger'), (u'unzuverl\xe9ssiges', u'unzuverl\xe4ssiges'), (u'unz\xe9hlige', u'unz\xe4hlige'), (u'unz\xe9hligen', u'unz\xe4hligen'), (u'unz\xe9ihlige', u'unz\xe4hlige'), (u'Urgrofivaters', u'Urgro\xdfvaters'), (u'Urlaubsuberschreitung', u'Urlaubs\xfcberschreitung'), (u'Ursprijnglich', u'Urspr\xfcnglich'), (u'ursprtmglich', u'urspr\xfcnglich'), (u'Ursprunglich', u'Urspr\xfcnglich'), (u'Ururgrofivater', u'Ururgro\xdfvater'), (u'v/el', u'viel'), (u'v/er', u'vier'), (u'v/erfe', u'vierte'), (u'v/erfes', u'viertes'), (u'V6gel', u'V\xf6gel'), (u'v6IIig', u'v\xf6llig'), (u'V6lker', u'V\xf6lker'), (u'V6llig', u'V\xf6llig'), (u'v6lllg', u'v\xf6llig'), (u'vdllig', u'v\xf6llig'), (u'Ve/Teidigungskr\xe9fte', u'Verteidigungskr\xe4fte'), (u'Velzeih', u'Verzeih'), (u'Velzeihung', u'Verzeihung'), (u'velzichte', u'verzichte'), (u'Ven/vandter', u'Verwandter'), (u'ven/v\xe9hntl', u'verw\xf6hnt!'), (u'Ventilationsfiffnung', u'Ventilations\xf6ffnung'), (u'Ventilatorsch\xe9chte', u'Ventilatorsch\xe4chte'), (u'VERACHTLICH', u'VER\xc4CHTLICH'), (u'verandert', u'ver\xe4ndert'), (u'Verbiindeten', u'Verb\xfcndeten'), (u'Verbilndeter', u'Verb\xfcndeter'), (u'verbliidet', u'verbl\xf6det'), (u'Verbliidung', u'Verbl\xf6dung'), (u'verbllirgen', u'verb\xfcrgen'), (u'verbrachfe', u'verbrachte'), (u'Verbrec/ver', u'Verbrecher'), (u'Verbtmdeter', u'Verb\xfcndeter'), (u'Verbundeten', u'Verb\xfcndeten'), (u'Verb\ufb02nolete', u'Verb\xfcndete'), (u'verdiichtigen', u'verd\xe4chtigen'), (u'verdiinnt', u'verd\xfcnnt'), (u'verdllistern', u'verd\xfcstern'), (u'verdr\ufb02ckt', u'verdr\xfcckt'), (u'verdunnt', u'verd\xfcnnt'), (u'verd\xe9chtig', u'verd\xe4chtig'), (u'Verd\xe9chtigen', u'Verd\xe4chtigen'), (u'verd\xe9chtiger', u'verd\xe4chtiger'), (u'verffilgbares', u'verf\xfcgbares'), (u'Verfiigung', u'Verf\xfcgung'), (u'verfiihren', u'verf\xfchren'), (u'verfiihrt', u'verf\xfchrt'), (u'verfiittem', u'verf\xfcttern'), (u'Verfijgung', u'Verf\xfcgung'), (u'verfilgst', u'verf\xfcgst'), (u'verfilgte', u'verf\xfcgte'), (u'Verfilgung', u'Verf\xfcgung'), (u'Verfilhrungskilnste', u'Verf\xfchrungsk\xfcnste'), (u'verflligen', u'verf\xfcgen'), (u'verfllihrt', u'verf\xfchrt'), (u'Verflllgung', u'Verf\xfcgung'), (u'verfolgf', u'verfolgt'), (u'verfolgtl', u'verfolgt!'), (u'VERFUGBAR', u'VERF\xdcGBAR'), (u'verfugt', u'verf\xfcgt'), (u'vergafk', u'verga\xdf'), (u'Vergniigen', u'Vergn\xfcgen'), (u'Vergniigens', u'Vergn\xfcgens'), (u'Vergniigungsausflug', u'Vergn\xfcgungsausflug'), (u'Vergnijgen', u'Vergn\xfcgen'), (u'Vergnilgen', u'Vergn\xfcgen'), (u'Vergnlligen', u'Vergn\xfcgen'), (u'Vergntigen', u'Vergn\xfcgen'), (u'Vergnugen', u'Vergn\xfcgen'), (u'vergnugt', u'vergn\xfcgt'), (u'vergnugte', u'vergn\xfcgte'), (u'Vergnugungsausflug', u'Vergn\xfcgungsausflug'), (u'vergr6Bern', u'vergr\xf6\xdfern'), (u'vergr\xe9fiern', u'vergr\xf6\xdfern'), (u'Vergr\xe9fierung', u'Vergr\xf6\xdferung'), (u'verg\xe9nglich', u'verg\xe4nglich'), (u'verhiirt', u'verh\xf6rt'), (u'Verhiitung', u'Verh\xfctung'), (u'Verhor', u'Verh\xf6r'), (u'verhort', u'verh\xf6rt'), (u'verhorten', u'verh\xf6rten'), (u'verh\xe9ilt', u'verh\xe4lt'), (u'verh\xe9lt', u'verh\xe4lt'), (u'Verh\xe9ltnis', u'Verh\xe4ltnis'), (u'Verh\xe9ltnisse', u'Verh\xe4ltnisse'), (u'verh\xe9ltst', u'verh\xe4ltst'), (u'veriindert', u'ver\xe4ndert'), (u'Verinderungen', u'Ver\xe4nderungen'), (u'verkilnden', u'verk\xfcnden'), (u'verkilndet', u'verk\xfcndet'), (u'verkniipft', u'verkn\xfcpft'), (u"verknUpf't", u'verkn\xfcpft'), (u'verkunde', u'verk\xfcnde'), (u'verkunden', u'verk\xfcnden'), (u'verkundet', u'verk\xfcndet'), (u'VERKUNDIGUNG', u'VERK\xdcNDIGUNG'), (u'Verk\xe9ufer', u'Verk\xe4ufer'), (u'verletztl', u'verletzt!'), (u'verlieB', u'verlie\xdf'), (u'verlielien', u'verlie\xdfen'), (u'verlorenl', u'verloren!'), (u'verl\xe9ingert', u'verl\xe4ngert'), (u'Verl\xe9ingerungskabel', u'Verl\xe4ngerungskabel'), (u'verl\xe9isst', u'verl\xe4sst'), (u'verl\xe9sst', u'verl\xe4sst'), (u'verl\xe9uft', u'verl\xe4uft'), (u"verm'aihlen", u'verm\xe4hlen'), (u'verm/ssf', u'vermisst'), (u'vermiibelt', u'verm\xf6belt'), (u'Vermiigt', u'Verm\xf6gt'), (u'Verm\xe9gen', u'Verm\xf6gen'), (u'verm\xe9hle', u'verm\xe4hle'), (u'verm\xe9hlen', u'verm\xe4hlen'), (u'verm\xe9hlt', u'verm\xe4hlt'), (u'Verm\xe9ihlung', u'Verm\xe4hlung'), (u'vernachl\xe9ssigt', u'vernachl\xe4ssigt'), (u'Vernachl\xe9ssigung', u'Vernachl\xe4ssigung'), (u'vernfinftig', u'vern\xfcnftig'), (u'vernfinftige', u'vern\xfcnftige'), (u'vernilnftig', u'vern\xfcnftig'), (u'vernllmftigsten', u'vern\xfcnftigsten'), (u'verntmftige', u'vern\xfcnftige'), (u'vernunftig', u'vern\xfcnftig'), (u'vernunftigsten', u'vern\xfcnftigsten'), (u'vern\ufb02nftig', u'vern\xfcnftig'), (u'verpa\xdft', u'verpasst'), (u'verpesfefe', u'verpestete'), (u'verprilgle', u'verpr\xfcgle'), (u'verprugeln', u'verpr\xfcgeln'), (u'Verp\ufb02ichtungen', u'Verpflichtungen'), (u'verrat', u'verr\xe4t'), (u'verrfickter', u'verr\xfcckter'), (u'verriickt', u'verr\xfcckt'), (u'Verriickte', u'Verr\xfcckte'), (u'Verriickten', u'Verr\xfcckten'), (u'Verriickter', u'Verr\xfcckter'), (u'verriicktes', u'verr\xfccktes'), (u'verrijckt', u'verr\xfcckt'), (u'verrijckte', u'verr\xfcckte'), (u'verrilckt', u'verr\xfcckt'), (u'Verrilckte', u'Verr\xfcckte'), (u'Verrilckter', u'Verr\xfcckter'), (u'Verrilcktes', u'Verr\xfccktes'), (u"verrL'lckt", u'verr\xfcckt'), (u'verrljckt', u'verr\xfcckt'), (u'verrllickt', u'verr\xfcckt'), (u'Verrllickte', u'Verr\xfcckte'), (u'Verrllickter', u'Verr\xfcckter'), (u'verrlllckte', u'verr\xfcckte'), (u'verrtickt', u'verr\xfcckt'), (u'verrUckt', u'verr\xfcckt'), (u'Verruckte', u'Verr\xfcckte'), (u'verruckten', u'verr\xfcckten'), (u'Verruckter', u'Verr\xfcckter'), (u'Verr\xe9iter', u'Verr\xe4ter'), (u'verr\xe9itst', u'verr\xe4itst'), (u'verr\xe9t', u'verr\xe4t'), (u'Verr\xe9ter', u'Verr\xe4ter'), (u'Verr\xe9terin', u'Verr\xe4terin'), (u'verr\xe9terisch', u'verr\xe4terisch'), (u'verr\xe9terischen', u'verr\xe4terischen'), (u'verr\ufb02ckt', u'verr\xfcckt'), (u'versaumt', u'vers\xe4umt'), (u'Verscheifier', u'Verschei\xdfer'), (u'verschiichtert', u'versch\xfcchtert'), (u'verschiitten', u'versch\xfctten'), (u'verschlucktl', u'verschluckt!'), (u'VERSCHLUSSELN', u'VERSCHL\xdcSSELN'), (u'VERSCHLUSSELT', u'VERSCHL\xdcSSELT'), (u'Verschlusselung', u'Verschl\xfcsselung'), (u'Verschnauferst', u'Verschnauf erst'), (u'Verschwdrung', u'Verschw\xf6rung'), (u'verschweilit', u'verschwei\xdft'), (u'Verschwiirer', u'Verschw\xf6rer'), (u'verschwiirerisch', u'verschw\xf6rerisch'), (u'Verschwiirern', u'Verschw\xf6rern'), (u'Verschwiirung', u'Verschw\xf6rung'), (u'Verschwiirungen', u'Verschw\xf6rungen'), (u'Verschw\xe9rer', u'Verschw\xf6rer'), (u'Verschw\xe9rung', u'Verschw\xf6rung'), (u'Verschw\xe9rungstheoretiker', u'Verschw\xf6rungstheoretiker'), (u'versch\xe9rft', u'versch\xe4rft'), (u'versfanden', u'verstanden'), (u'Versfehen', u'Verstehen'), (u'versiihnlich', u'vers\xf6hnlich'), (u'Versiihnung', u'Vers\xf6hnung'), (u'verslumte', u'vers\xe4umte'), (u'Verspfitung', u'Versp\xe4tung'), (u'verspiire', u'versp\xfcre'), (u'verspilre', u'versp\xfcre'), (u'verspiten', u'versp\xe4ten'), (u'versprijht', u'verspr\xfcht'), (u'verst0I3en', u'versto\xdfen'), (u'verst6Bt', u'verst\xf6\xdft'), (u'Verst6ISt', u'Verst\xf6\xdft'), (u'verst6l3t', u'verst\xf6\xdft'), (u'verstehejetzt', u'verstehe jetzt'), (u'Verstiindnis', u'Verst\xe4ndnis'), (u'verstiirkt', u'verst\xe4rkt'), (u'Verstiirkung', u'Verst\xe4rkung'), (u'verstilmmelst', u'verst\xfcmmelst'), (u'verstoBen', u'Versto\xdfen'), (u'verstofken', u'versto\xdfen'), (u'verstolien', u'versto\xdfen'), (u'verstummelt', u'verst\xfcmmelt'), (u'verstunde', u'verst\xfcnde'), (u'verstundest', u'verst\xfcndest'), (u'verst\xe9fkt', u'verst\xf6\xdft'), (u'verst\xe9indlich', u'verst\xe4ndlich'), (u'Verst\xe9irkung', u'Verst\xe4rkung'), (u'Verst\xe9ndigen', u'Verst\xe4ndigen'), (u'Verst\xe9ndigt', u'Verst\xe4ndigt'), (u'verst\xe9ndlich', u'verst\xe4ndlich'), (u'Verst\xe9ndnis', u'Verst\xe4ndnis'), (u'verst\xe9rken', u'verst\xe4rken'), (u'verst\xe9rkt', u'verst\xe4rkt'), (u'verst\xe9rkte', u'verst\xe4rkte'), (u'verst\xe9rkter', u'verst\xe4rkter'), (u'Verst\xe9rkung', u'Verst\xe4rkung'), (u'verst\xe9rt', u'verst\xf6rt'), (u'vers\xe9hnen', u'vers\xf6hnen'), (u'vers\xe9hnt', u'vers\xf6hnt'), (u'vers\xe9umen', u'vers\xe4umen'), (u'vers\xe9umt', u'vers\xe4umt'), (u'VERTRAGSLANGE', u'VERTRAGSL\xc4NGE'), (u'vertrauenswiirdig', u'vertrauensw\xfcrdig'), (u'vertrauenswtlrdig', u'vertrauensw\xfcrdig'), (u'vertrauenswtlrdigen', u'vertrauensw\xfcrdigen'), (u'vertr\xe9umte', u'vertr\xe4umte'), (u'vervvanzt', u'verwanzt'), (u'verwiistete', u'verw\xfcstete'), (u'verwllisten', u'verw\xfcsten'), (u'verwustet', u'verw\xfcstet'), (u'verw\xe9hnten', u'verw\xf6hnten'), (u'verw\xe9ihnen', u'verw\xf6hnen'), (u'verw\xe9ssert', u'verw\xe4ssert'), (u'verz\xe9gere', u'verz\xf6gere'), (u'Verz\xe9gerte', u'Verz\xf6gerte'), (u'Verz\xe9gerung', u'Verz\xf6gerung'), (u'ver\xe9ffentliche', u'ver\xf6ffentliche'), (u'ver\xe9ffentlichen', u'ver\xf6ffentlichen'), (u'ver\xe9ffentlicht', u'ver\xf6ffentlicht'), (u'ver\xe9indert', u'ver\xe4ndert'), (u'Ver\xe9inderung', u'Ver\xe4nderung'), (u'ver\xe9ndern', u'ver\xe4ndern'), (u'ver\xe9ndert', u'ver\xe4ndert'), (u'ver\xe9nderte', u'ver\xe4nderte'), (u'ver\xe9nderten', u'ver\xe4nderten'), (u'Ver\xe9nderung', u'Ver\xe4nderung'), (u'Ver\xe9nderungen', u'Ver\xe4nderungen'), (u'ver\xe9ngstigtes', u'ver\xe4ngstigtes'), (u'ver\xe9ppelt', u'ver\xe4ppelt'), (u'ver\xe9rgert', u'ver\xe4rgert'), (u'vewvendet', u'verwendet'), (u'vfillig', u'v\xf6llig'), (u'VGFKUFZGH', u'verk\xfcrzen'), (u'VI/illkommen', u'Willkommen'), (u'VI/itwicky', u'Witwicky'), (u'vial', u'viel'), (u'Videoiiben/vachung', u'Video\xfcberwachung'), (u'Vie/e', u'Viele'), (u'Vielfrafi', u'Vielfra\xdf'), (u'vielf\xe9ltig', u'vielf\xe4ltig'), (u'Vielleichtja', u'Vielleicht ja'), (u'vielversprechend', u'viel versprechend'), (u'Vieraugengespr\xe9ch', u'Vieraugengespr\xe4ch'), (u'vieriunge', u'vier junge'), (u'vierj\xe9hriges', u'vierj\xe4hriges'), (u'vierk\xe9pfige', u'vierk\xf6pfige'), (u'Viigel', u'V\xf6gel'), (u'viillig', u'v\xf6llig'), (u'viilliges', u'v\xf6lliges'), (u'Viterchen', u'V\xe4terchen'), (u'Vizepr\xe9isident', u'Vizepr\xe4sident'), (u'vlel', u'viel'), (u'Vlellelcht', u'Vielleicht'), (u'Vogelscheifke', u'Vogelschei\xdfe'), (u'Vogelscheilie', u'Vogelschei\xdfe'), (u'Volksm\xe9rchen', u'Volksm\xe4rchen'), (u'vollerjeder', u'voller jeder'), (u'vollmachen', u'voll machen'), (u'vollst\xe9ndig', u'vollst\xe4ndig'), (u'vollst\xe9ndige', u'vollst\xe4ndige'), (u'Volltrefferl', u'Volltreffer!'), (u'vollz\xe9hlig', u'vollz\xe4hlig'), (u'Volumenl', u'Volumen!'), (u'von/vagten', u'vorwagten'), (u'von/v\xe9irts', u'vorw\xe4rts'), (u'vonn6ten', u'vonn\xf6ten'), (u'Vonn\xe9irts', u'Vorw\xe4rts'), (u'Vordertiir', u'Vordert\xfcr'), (u'Vorderturl', u'Vordert\xfcr!'), (u'vordr\xe9ngelnl', u'vordr\xe4ngeln!'), (u'vorfibergehend', u'vor\xfcbergehend'), (u'Vorfuhrungen', u'Vorf\xfchrungen'), (u'vorgef\ufb02hrt', u'vorgef\xfchrt'), (u'Vorgiinge', u'Vorg\xe4nge'), (u'Vorg\xe9nger', u'Vorg\xe4nger'), (u'Vorg\xe9ngern', u'Vorg\xe4ngern'), (u'Vorh\xe9nge', u'Vorh\xe4nge'), (u'vorijbergehend', u'vor\xfcbergehend'), (u'vorilber', u'vor\xfcber'), (u'vorilbergehende', u'vor\xfcbergehende'), (u'vorkniipfen', u'vorkn\xf6pfen'), (u'Vorl\xe9ufer', u'Vorl\xe4ufer'), (u'Vorl\xe9ufig', u'Vorl\xe4ufig'), (u'Vorraus', u'Voraus'), (u'Vorschl\xe9ge', u'Vorschl\xe4ge'), (u'vorschriftsm\xe9fiig', u'vorschriftsm\xe4\xdfig'), (u'vorschriftsm\xe9iliig', u'vorschriftsm\xe4\xdfig'), (u'Vorsichtsmaflnahme', u'Vorsichtsma\xdfnahme'), (u'Vorstellungsgespr\xe9ch', u'Vorstellungsgespr\xe4ch'), (u'Vorstellungsgespr\xe9che', u'Vorstellungsgespr\xe4che'), (u'Vorstof$', u'Vorsto\xdf'), (u'Vortlbergehende', u'Vor\xfcbergehende'), (u'vort\xe9uschen', u'vort\xe4uschen'), (u'vorubergehend', u'vor\xfcbergehend'), (u'vorvv\xe9rts', u'vorw\xe4rts'), (u'Vorwfirts', u'Vorw\xe4rts'), (u'vorw\xe9rts', u'vorw\xe4rts'), (u'vorzfiglichl', u'vorz\xfcglich!'), (u'vor\ufb02ber', u'vor\xfcber'), (u'Vor\ufb02bergehend', u'Vor\xfcbergehend'), (u'VVACHMANN', u'WACHMANN'), (u'Vvaffen', u'Waffen'), (u'Vvagen', u'Wagen'), (u'VVarte', u'Warte'), (u'VVeif3>t', u'Wei\xdft'), (u"VVeil'2>t", u'Wei\xdft'), (u'VVir', u'Wir'), (u'VVM', u'WM'), (u'v\\/as', u'was'), (u'V\\/e', u'We'), (u'V\xe9gel', u'V\xf6gel'), (u'v\xe9geln', u'v\xf6geln'), (u'v\xe9gelt', u'v\xf6gelt'), (u'v\xe9llig', u'v\xf6llig'), (u"w/'r", u'wir'), (u'W/e', u'Wie'), (u'w/eder', u'wieder'), (u'W/nkel', u'Winkel'), (u'w/r', u'wir'), (u'w/rd', u'wird'), (u'w/rkl/ch', u'wirklich'), (u'W0', u'Wo'), (u'w5r', u'w\xe4r'), (u"w5r's", u"w\xe4r's"), (u'W6lfe', u'W\xf6lfe'), (u'W6lfen', u'W\xf6lfen'), (u'W99', u'Weg'), (u'Waffenschr\xe9nke', u'Waffenschr\xe4nke'), (u'wafs', u"w\xe4r's"), (u'wahrend', u'w\xe4hrend'), (u'WAHRENDDESSEN', u'W\xc4HRENDDESSEN'), (u'Wahrheitl', u'Wahrheit!'), (u'wail', u'weil'), (u'Walbl', u'Wal\xf6l'), (u'Walsinghaml', u'Walsingham!'), (u'wankelmiltig', u'wankelm\xfctig'), (u'ware', u'w\xe4re'), (u'WAREST', u'W\xc4REST'), (u'Warfe', u'Warte'), (u'warja', u'war ja'), (u'Waschbrettb\xe9uche', u'Waschbrettb\xe4uche'), (u'Waschb\xe9ir', u'Waschb\xe4r'), (u'Waschb\xe9iren', u'Waschb\xe4ren'), (u'Wasseranschlljssen', u'Wasseranschl\xfcssen'), (u'Wattekn\xe9uel', u'Wattekn\xe4uel'), (u'Wattest\xe9bchen', u'Wattest\xe4bchen'), (u"we're", u'w\xe4re'), (u"We'ro", u"We're"), (u'we/B', u'wei\xdf'), (u'We/Bf', u'Wei\xdft'), (u'we/fere', u'weitere'), (u'Wechsell', u'Wechsel!'), (u'weggebfirstet', u'weggeb\xfcrstet'), (u'weggespllllt', u'weggesp\xfclt'), (u'weggesplllltl', u'weggesp\xfclt!'), (u'weggesp\ufb02lt', u'weggesp\xfclt'), (u'wegl', u'weg!'), (u'wegreiflsen', u'wegrei\xdfen'), (u'wegschieBen', u'wegschie\xdfen'), (u'Wegtratan', u'Wegtreten'), (u'wegzuwefien', u'wegzuwerfen'), (u'wei/3', u'wei\xdf'), (u'WeiB', u'Wei\xdf'), (u'weiBe', u'wei\xdfe'), (u'weiBen', u'wei\xdfen'), (u'weiBer', u'wei\xdfer'), (u'weiBes', u'wei\xdfes'), (u'WeiBfresse', u'Wei\xdffresse'), (u'weiBt', u'wei\xdft'), (u'Weif$', u'Wei\xdf'), (u'Weif$t', u'Wei\xdft'), (u'weif2>', u'wei\xdf'), (u'weif3', u'wei\xdf'), (u'weif3>', u'wei\xdf'), (u'Weif3t', u'Wei\xdft'), (u'weif5', u'wei\xdf'), (u'Weifbe', u'Wei\xdfe'), (u'weifbt', u'wei\xdft'), (u'Weifi', u'Wei\xdf'), (u'Weifie', u'Wei\xdfe'), (u'weifies', u'wei\xdfes'), (u'Weifist', u'Wei\xdft'), (u'Weifit', u'Wei\xdft'), (u'weifk', u'wei\xdf'), (u'weifken', u'wei\xdfen'), (u'Weifker', u'Wei\xdfer'), (u'weifkes', u'wei\xdfes'), (u'weifkt', u'wei\xdft'), (u'weifL', u'wei\xdf'), (u'weifLt', u'wei\xdft'), (u'weifl\xbb', u'wei\xdf'), (u'weifS', u'wei\xdf'), (u'WeifSt', u'Wei\xdft'), (u'weifZ>', u'wei\xdf'), (u'WeifZ>t', u'Wei\xdft'), (u'weif\xe9t', u'wei\xdft'), (u'Weihnachtseink\xe9ufe', u'Weihnachtseink\xe4ufe'), (u'Weihnachtsm\xe9nner', u'Weihnachtsm\xe4nner'), (u"weil'5", u'wei\xdf'), (u"weil'5t", u'wei\xdft'), (u'weil3', u'wei\xdf'), (u'Weil3t', u'Wei\xdft'), (u'weil5', u'wei\xdf'), (u'Weil5t', u'Wei\xdft'), (u'weili', u'wei\xdf'), (u'weilit', u'wei\xdft'), (u'weilke', u'wei\xdfe'), (u'Weill', u'Wei\xdf'), (u'weills', u'wei\xdf'), (u'weillst', u'wei\xdft'), (u'weillt', u'weisst'), (u'weilS', u'wei\xdf'), (u'weilSe', u'wei\xdfe'), (u'WeilSglut', u'Wei\xdfglut'), (u'weilZ>', u'wei\xdf'), (u'weilZ~', u'wei\xdf'), (u'weiss', u'wei\xdf'), (u'weissen', u'wei\xdfen'), (u'weisst', u'wei\xdft'), (u'weiterhiipfen', u'weiterh\xfcpfen'), (u'Weiterpessen', u'Weiterpressen'), (u'weitl\xe9ufige', u'weitl\xe4ufige'), (u'weitweg', u'weit weg'), (u'WelBt', u'Wei\xdft'), (u'well', u'weil'), (u'Well', u'Welt'), (u'Wellit', u'Wei\xdft'), (u'welllt', u'wei\xdft'), (u'welt', u'weit'), (u'WELTBEVOLKERUNG', u'WELTBEV\xd6LKERUNG'), (u'Wel\ufb02t', u'Wei\xdft'), (u'Werdja', u'Werd ja'), (u'Werkst\xe9tten', u'Werkst\xe4tten'), (u'Werkzeugg\ufb02rtel', u'Werkzeugg\xfcrtel'), (u'wertschfitzen', u'wertsch\xe4tzen'), (u'Westflilgel', u'Westfl\xfcgel'), (u'Westkilste', u'Westk\xfcste'), (u'Wettk\xe9mpfe', u'Wettk\xe4mpfe'), (u'Wettk\xe9mpfen', u'Wettk\xe4mpfen'), (u'Wettk\xe9mpfer', u'Wettk\xe4mpfer'), (u'Wfinsche', u'W\xfcnsche'), (u'wfinschen', u'w\xfcnschen'), (u'Wfird', u'W\xfcrd'), (u'wfirde', u'w\xfcrde'), (u'Wfirden', u'W\xfcrden'), (u'wfirdest', u'w\xfcrdest'), (u'wfire', u'w\xe4re'), (u'Wfirme', u'W\xe4rme'), (u'Wfisste', u'W\xfcsste'), (u'wfitete', u'w\xfctete'), (u'wfssen', u'wissen'), (u'Widen/v\xe9rtig', u'Widerw\xe4rtig'), (u"widerf'a'hrt", u'widerf\xe4hrt'), (u'widerspriichliche', u'widerspr\xfcchliche'), (u'Widerw\xe9irtig', u'Widerw\xe4rtig'), (u'wiedergew\xe9ihltl', u'wiedergew\xe4hlt'), (u'wiederhaben', u'wieder-haben'), (u'Wiederh\xe9ren', u'Wiederh\xf6ren'), (u'Wieheifiternoch', u'Wiehei\xdfternoch'), (u'Wieheiliternoch', u'Wiehei\xdfternoch'), (u'wihlerisch', u'w\xe4hlerisch'), (u'wihlerlsch', u'w\xe4hlerisch'), (u'wiihlen', u'w\xfchlen'), (u'wiihlte', u'w\xe4hlte'), (u'wiihrend', u'w\xe4hrend'), (u'wiilrdest', u'w\xfcrdest'), (u'Wiinde', u'W\xe4nde'), (u'wiinsch', u'w\xfcnsch'), (u'Wiinsche', u'W\xfcnsche'), (u'Wiinschen', u'W\xfcnschen'), (u'wiinschst', u'w\xfcnschst'), (u'wiinscht', u'w\xfcnscht'), (u'wiinschte', u'w\xfcnschte'), (u'wiirde', u'w\xfcrde'), (u'Wiirden', u'W\xfcrden'), (u'Wiirdest', u'W\xfcrdest'), (u'wiirdet', u'w\xfcrdet'), (u'wiirdigst', u'w\xfcrdigst'), (u'Wiire', u'W\xe4re'), (u'wiiren', u'w\xe4ren'), (u'Wiirfel', u'W\xfcrfel'), (u'wiirfeln', u'w\xfcrfeln'), (u'Wiirfels', u'W\xfcrfels'), (u'wiirs', u"w\xe4r's"), (u'Wiirstchen', u'W\xfcrstchen'), (u'wiischt', u'w\xe4scht'), (u'Wiisste', u'W\xfcsste'), (u'wiissten', u'w\xfcssten'), (u'wiisstest', u'w\xfcsstest'), (u'Wiiste', u'W\xfcste'), (u'wiitenden', u'w\xfctenden'), (u'wijnsche', u'w\xfcnsche'), (u'wijnschen', u'w\xfcnschen'), (u'wijnschte', u'w\xfcnschte'), (u'wijrd', u'w\xfcrd'), (u'wijrde', u'w\xfcrde'), (u'wijrden', u'w\xfcrden'), (u'wijrdest', u'w\xfcrdest'), (u'wijrdiger', u'w\xfcrdiger'), (u'Wijrg', u'W\xfcrg'), (u'wijsste', u'w\xfcsste'), (u'wijtend', u'w\xfctend'), (u'wildl', u'wild!'), (u'wilnsch', u'w\xfcnsch'), (u'wilnsche', u'w\xfcnsche'), (u'wilnschen', u'w\xfcnschen'), (u'wilnscht', u'w\xfcnscht'), (u'wilnschte', u'w\xfcnschte'), (u'wilrd', u'w\xfcrd'), (u'Wilrde', u'W\xfcrde'), (u'Wilrden', u'W\xfcrden'), (u'Wilrdest', u'W\xfcrdest'), (u'wilrdig', u'w\xfcrdig'), (u'Wilrfel', u'W\xfcrfel'), (u'Wilrfelenergie', u'W\xfcrfelenergie'), (u'wilsste', u'w\xfcsste'), (u'wilssten', u'w\xfcssten'), (u'Wilstling', u'W\xfcstling'), (u'wiltend', u'w\xfctend'), (u'Windelhundl', u'Windelhund!'), (u'Windhundk\xe9rper', u'Windhundk\xf6rper'), (u'winner', u'w\xe4rmer'), (u'Wire', u'W\xe4re'), (u'wires', u'wir es'), (u'Wirfangen', u'Wir fangen'), (u'wirja', u'wir ja'), (u'wirje', u'wir je'), (u'wirjede', u'wir jede'), (u'wirjeden', u'wir jeden'), (u'wirjetzt', u'wir jetzt'), (u'Wirnisse', u'Wirrnisse'), (u'Wirsind', u'Wir sind'), (u'wirtragen', u'wir tragen'), (u'Wirtschaftspriifer', u'Wirtschaftspr\xfcfer'), (u'Wirverfolgen', u'Wir verfolgen'), (u'wirvom', u'wir vom'), (u'Wirwaren', u'Wir waren'), (u'Wirwarten', u'Wir warten'), (u'Wirwerden', u'Wir werden'), (u'Wirwissen', u'Wir wissen'), (u'Wirwollen', u'Wir wollen'), (u'Wirwollten', u'Wir wollten'), (u'Wirzeigten', u'Wir zeigten'), (u'wirzu', u'wir zu'), (u'Witzl', u'Witz!'), (u'WKHRENDDESSEN', u'W\xc4HRENDDESSEN'), (u"wL'lrden", u'w\xfcrden'), (u'wle', u'wie'), (u'Wleso', u'Wieso'), (u'Wlhlen', u'W\xe4hlen'), (u'wllinsch', u'w\xfcnsch'), (u'wllinschst', u'w\xfcnschst'), (u'wllinscht', u'w\xfcnscht'), (u'wllirde', u'w\xfcrde'), (u'wllirden', u'w\xfcrden'), (u'wllirdest', u'w\xfcrdest'), (u'wllirdet', u'w\xfcrdet'), (u'Wllirgegriff', u'W\xfcrgegriff'), (u'wllirgen', u'w\xfcrgen'), (u'wllisste', u'w\xfcsste'), (u'wlr', u'wir'), (u'wlrd', u'wird'), (u'wlrkllch', u'wirklich'), (u'Wlrkllchkelt', u'Wirklichkeit'), (u'wlrst', u'wirst'), (u'Wlrwarten', u'Wir warten'), (u'wlrwollen', u'wir wollen'), (u'Wo/f', u'Wolf'), (u'Wochenf\xe9hre', u'Wochenf\xe4hre'), (u'woffir', u'wof\xfcr'), (u'Wofiir', u'Wof\xfcr'), (u'Wofijr', u'Wof\xfcr'), (u'wofilr', u'wof\xfcr'), (u'Wofur', u'Wof\xfcr'), (u'WoherweiB', u'Woher wei\xdf'), (u'WoherweiBt', u'Woher wei\xdft'), (u'Woherweif$t', u'Woher wei\xdft'), (u'wohlfilhlen', u'wohlf\xfchlen'), (u'Wollkn\xe9uel', u'Wollkn\xe4uel'), (u'womiiglich', u'wom\xf6glich'), (u'wom\xe9glich', u'wom\xf6glich'), (u'wom\xe9iglich', u'wom\xf6glich'), (u'Worfiber', u'Wor\xfcber'), (u'woriiber', u'wor\xfcber'), (u'Worijber', u'Wor\xfcber'), (u'Wortgepl\xe9nkel', u'Wortgepl\xe4nkel'), (u'Woruber', u'Wor\xfcber'), (u"wt/'rden", u'w\xfcrden'), (u'wtinsche', u'w\xfcnsche'), (u'wtinschst', u'w\xfcnschst'), (u'wtirde', u'w\xfcrde'), (u'Wtirdest', u'W\xfcrdest'), (u'Wtirfel', u'W\xfcrfel'), (u'Wtmschen', u'W\xfcnschen'), (u"WUl'd\u20ac", u'w\xfcrde'), (u'WUlfelbecher', u'W\xfcrfelbecher'), (u'wullte', u'wusste'), (u'Wundersch6n', u'Wundersch\xf6n'), (u'wunderschfin', u'wundersch\xf6n'), (u'Wunderschiin', u'Wundersch\xf6n'), (u'wunderschiinen', u'wundersch\xf6nen'), (u'wundersch\xe9n', u'wundersch\xf6n'), (u'wundersch\xe9ne', u'wundersch\xf6ne'), (u'Wundersch\xe9nel', u'Wundersch\xf6ne!'), (u'wundersch\xe9nen', u'wundersch\xf6nen'), (u'wundersch\xe9nes', u'wundersch\xf6nes'), (u'wundersoh\xe9n', u'wundersch\xf6n'), (u'wunsche', u'w\xfcnsche'), (u'Wunschen', u'W\xfcnschen'), (u'wunscht', u'w\xfcnscht'), (u'wunschte', u'w\xfcnschte'), (u'WUNSCHTE', u'W\xdcNSCHTE'), (u'wurcle', u'wurde'), (u'wUrde', u'w\xfcrde'), (u'Wurdige', u'W\xfcrdige'), (u'WURGT', u'W\xdcRGT'), (u'Wurmer', u'W\xfcrmer'), (u'Wursfsfulle', u'Wurststulle'), (u'Wuste', u'W\xfcste'), (u'WUSTEN', u'W\xdcSTEN'), (u'wutend', u'w\xfctend'), (u'wu\xdfte', u'wusste'), (u'wu\xdftest', u'wusstest'), (u"w\xa7r's", u"w\xe4r's"), (u'w\xa7re', u'w\xe4re'), (u"W\xa7ren's", u"W\xe4ren's"), (u"w\xe9'hrend", u'w\xe4hrend'), (u'w\xe9chst', u'w\xe4chst'), (u'W\xe9chter', u'W\xe4chter'), (u'w\xe9fs', u"w\xe4r's"), (u'W\xe9g', u'Weg'), (u'w\xe9hle', u'w\xe4hle'), (u'w\xe9hlejetzt', u'w\xe4hle jetzt'), (u'w\xe9hlen', u'w\xe4hlen'), (u'W\xe9hler', u'W\xe4hler'), (u'W\xe9hlern', u'W\xe4hlern'), (u'w\xe9hlt', u'w\xe4hlt'), (u'w\xe9hlte', u'w\xe4hlte'), (u'w\xe9hrend', u'w\xe4hrend'), (u'W\xe9hrung', u'W\xe4hrung'), (u'W\xe9ichter', u'W\xe4chter'), (u'w\xe9ihlen', u'w\xe4hlen'), (u'w\xe9ihrend', u'w\xe4hrend'), (u'w\xe9ir', u'w\xe4r'), (u"w\xe9ir's", u"w\xe4r's"), (u'w\xe9irde', u'w\xfcrde'), (u'W\xe9ire', u'W\xe4re'), (u'w\xe9iren', u'w\xe4ren'), (u'w\xe9irmen', u'w\xe4rmen'), (u'w\xe9irst', u'w\xe4rst'), (u'W\xe9lder', u'W\xe4lder'), (u'W\xe9ldern', u'W\xe4ldern'), (u'W\xe9lfen', u'W\xf6lfen'), (u'W\xe9lkchen', u'W\xf6lkchen'), (u'W\xe9nde', u'W\xe4nde'), (u'W\xe9nden', u'W\xe4nden'), (u'w\xe9r', u'w\xe4r'), (u"w\xe9r's", u"w\xe4r's"), (u'W\xe9re', u'W\xe4re'), (u'W\xe9ren', u'W\xe4ren'), (u'w\xe9ret', u'w\xe4ret'), (u'w\xe9rja', u'w\xe4r ja'), (u'W\xe9rm', u'W\xe4rm'), (u'W\xe9rme', u'W\xe4rme'), (u'w\xe9rmt', u'w\xe4rmt'), (u'W\xe9rst', u'W\xe4rst'), (u'w\xe9rt', u'w\xe4rt'), (u'W\xe9rter', u'W\xf6rter'), (u'W\xe9rterbuch', u'W\xf6rterbuch'), (u'w\xe9rtliche', u'w\xf6rtliche'), (u'W\xe9sche', u'W\xe4sche'), (u'W\xe9scheklammer', u'W\xe4scheklammer'), (u'W\xe9schst', u'W\xe4schst'), (u'w\xe9scht', u'w\xe4scht'), (u'w\ufb02rde', u'w\xfcrde'), (u'w\ufb02rden', u'w\xfcrden'), (u'W\ufb02rfel', u'W\xfcrfel'), (u"z'a'h", u'z\xe4h'), (u'Z/egf', u'liegt'), (u'Z/yarettenb\xe4ume', u'Zigarettenb\xe4ume'), (u'Z05', u'los'), (u'z6gel1e', u'z\xf6gerte'), (u'z6gern', u'z\xf6gern'), (u'zahlenm\xe9\ufb02ig', u'zahlenm\xe4\xdfig'), (u'zappelnl', u'zappeln!'), (u'Zauberspruchen', u'Zauberspr\xfcchen'), (u'Zaubervoodookr\xe9fte', u'Zaubervoodookr\xe4fte'), (u'Zauherpfippchen', u'Zauberp\xfcppchen'), (u'Zefietzende', u'Zerfetzende'), (u'zeitgem5B', u'zeitgem\xe4\xdf'), (u'Zeitgem\xe9\ufb02e', u'Zeitgem\xe4\xdfe'), (u'Zeitgeniissische', u'Zeitgen\xf6ssische'), (u'zeitgeniissischen', u'zeitgen\xf6ssischen'), (u'Zellenschliissel', u'Zellenschl\xfcssel'), (u'zerbeif$en', u'zerbei\xdfen'), (u'zerbeif$t', u'zerbei\xdft'), (u'zerf\xe9llt', u'zerf\xe4llt'), (u'Zermatschger\xe9usch', u'Zermatschger\xe4usch'), (u'zerm\ufb02rben', u'zerm\xfcrben'), (u'zerreifien', u'zerrei\xdfen'), (u'zerreilit', u'zerrei\xdft'), (u'zersfdren', u'zerst\xf6ren'), (u'zerst6rst', u'zerst\xf6rst'), (u'zerst6rt', u'zerst\xf6rt'), (u'zerstdren', u'zerst\xf6ren'), (u'Zerstfiren', u'Zerst\xf6ren'), (u'Zerstfirer', u'Zerst\xf6rer'), (u'Zerstfirungskraft', u'Zerst\xf6rungskraft'), (u'Zerstiickelung', u'Zerst\xfcckelung'), (u'zerstiire', u'zerst\xf6re'), (u'zerstiiren', u'zerst\xf6ren'), (u'Zerstiirer', u'Zerst\xf6rer'), (u'zerstiirt', u'zerst\xf6rt'), (u'zerstiirten', u'zerst\xf6rten'), (u'zerstiirtl', u'zerst\xf6rt!'), (u'Zerstiirungl', u'Zerst\xf6rung!'), (u'zerstoren', u'zerst\xf6ren'), (u'zerst\xe9re', u'zerst\xf6re'), (u'zerst\xe9ren', u'zerst\xf6ren'), (u'Zerst\xe9rer', u'Zerst\xf6rer'), (u'zerst\xe9rt', u'zerst\xf6rt'), (u'Zerst\xe9rung', u'Zerst\xf6rung'), (u'Zerst\xe9rungsfeldzug', u'Zerst\xf6rungsfeldzug'), (u'zertrlllmmert', u'zertr\xfcmmert'), (u'zfihlt', u'z\xe4hlt'), (u'Ziel160m', u'Ziel 160 m'), (u'Zihnelt', u'\xe4hnelt'), (u'ziichtiger', u'z\xfcchtiger'), (u'Ziige', u'Z\xfcge'), (u'Ziindkapseln', u'Z\xfcndkapseln'), (u'Zilnd', u'Z\xfcnd'), (u'Zilnden', u'Z\xfcnden'), (u'Zilndungsenergie', u'Z\xfcndungsenergie'), (u'Zilrich', u'Z\xfcrich'), (u'Zindern', u'\xe4ndern'), (u'Zingstlich', u'\xe4ngstlich'), (u'Ziufierst', u'\xe4u\xdferst'), (u'zleht', u'zieht'), (u'ZLIFUCK', u'zur\xfcck'), (u'Zooschlieliung', u'Zooschlie\xdfung'), (u'Zuckerschn\ufb02tchen', u'Zuckerschn\xfctchen'), (u'zuerstvor', u'zuerst vor'), (u'zuffillig', u'zuf\xe4llig'), (u'zuflligen', u'zuf\xfcgen'), (u'ZUFUCK', u'zur\xfcck'), (u'Zuf\xe9illig', u'Zuf\xe4llig'), (u'Zuf\xe9illigerweise', u'Zuf\xe4lligerweise'), (u'zuf\xe9llig', u'zuf\xe4llig'), (u'Zuf\xe9lligerweise', u'Zuf\xe4lligerweise'), (u"zug'a'nglichen", u'zug\xe4nglichen'), (u'ZUGANGSPRIORITKT', u'ZUGANGSPRIORIT\xc4T'), (u'zugehdrt', u'zugeh\xf6rt'), (u'zugeh\xe9rt', u'zugeh\xf6rt'), (u'zugestofien', u'zugesto\xdfen'), (u'Zugest\xe9ndnis', u'Zugest\xe4ndnis'), (u'Zugest\xe9ndnisse', u'Zugest\xe4ndnisse'), (u'Zugiinge', u'Zug\xe4nge'), (u'zuh6ren', u'zuh\xf6ren'), (u'zuh6rt', u'zuh\xf6rt'), (u'zuhiiren', u'zuh\xf6ren'), (u'zuhiirt', u'zuh\xf6rt'), (u'Zuh\xe9lter', u'Zuh\xe4lter'), (u'Zuh\xe9ren', u'Zuh\xf6ren'), (u'Zuh\xe9rer', u'Zuh\xf6rer'), (u'zukilnftiges', u'zuk\xfcnftiges'), (u'zul', u'zu!'), (u'zundete', u'z\xfcndete'), (u'Zundverteilerkappe', u'Z\xfcndverteilerkappe'), (u'zunjick', u'zur\xfcck'), (u'zun\xe9chst', u'zun\xe4chst'), (u'zun\xe9hen', u'zun\xe4hen'), (u'zun\xe9ihen', u'zun\xe4hen'), (u'Zuokerschntltchen', u'Zuckerschn\xfctchen'), (u'zurfick', u'zur\xfcck'), (u'zurfickblicken', u'zur\xfcckblicken'), (u'zurfickgekommen', u'zur\xfcckgekommen'), (u'zurfickgezogen', u'zur\xfcckgezogen'), (u'zurfickkehren', u'zur\xfcckkehren'), (u'zurfickzufuhren', u'zur\xfcckzuf\xfchren'), (u'zuriick', u'zur\xfcck'), (u'zuriickbleiben', u'zur\xfcckbleiben'), (u'zuriickgeben', u'zur\xfcckgeben'), (u'zuriickgehen', u'zur\xfcckgehen'), (u'zuriickgekommen', u'zur\xfcckgekommen'), (u'zuriickgezogen', u'zur\xfcckgezogen'), (u'zuriickhaben', u'zur\xfcckhaben'), (u'zuriickkehre', u'zur\xfcckkehre'), (u'zuriickkehren', u'zur\xfcckkehren'), (u'zuriickkehrst', u'zur\xfcckkehrst'), (u'zuriickziehen', u'zur\xfcckziehen'), (u'Zurijck', u'Zur\xfcck'), (u'zurijckbringen', u'zur\xfcckbringen'), (u'zurijckfordem', u'zur\xfcckfordern'), (u'zurijckgeholt', u'zur\xfcckgeholt'), (u'zurijckgekehrt', u'zur\xfcckgekehrt'), (u'zurijckgekommen', u'zur\xfcckgekommen'), (u'zurijckgelassen', u'zur\xfcckgelassen'), (u'zurijckgerufen', u'zur\xfcckgerufen'), (u'zurijckkehren', u'zur\xfcckkehren'), (u'zurijcknehmen', u'zur\xfccknehmen'), (u'zurijckstolpern', u'zur\xfcckstolpern'), (u'Zurilck', u'Zur\xfcck'), (u'Zurilckf', u'Zur\xfcck!'), (u'zurilckgeblieben', u'zur\xfcckgeblieben'), (u'zurilckgeholt', u'zur\xfcckgeholt'), (u'zurilckgekehrt', u'zur\xfcckgekehrt'), (u'zurilckhalten', u'zur\xfcckhalten'), (u'zurilckholen', u'zur\xfcckholen'), (u'zurilckkehre', u'zur\xfcckkehre'), (u'zurilckkehren', u'zur\xfcckkehren'), (u'zurilckkehrt', u'zur\xfcckkehrt'), (u'zurilckkommen', u'zur\xfcckkommen'), (u'zurilckkommt', u'zur\xfcckkommt'), (u'zurilcklassen', u'zur\xfccklassen'), (u'zurilckziehen', u'zur\xfcckziehen'), (u'Zurilckziehenl', u'Zur\xfcckziehen!'), (u'zurilckzugeben', u'zur\xfcckzugeben'), (u"zurl'Jck", u'zur\xfcck!'), (u"zurL'lck", u'zur\xfcck'), (u'zurLick', u'zur\xfcck'), (u'zurljckgeben', u'zur\xfcckgeben'), (u'zurllickfallen', u'zur\xfcckfallen'), (u'zurllickgekehrt', u'zur\xfcckgekehrt'), (u'zurllickkehrt', u'zur\xfcckkehrt'), (u'zurllickzukehren', u'zur\xfcckzukehren'), (u'zurlllckgehen', u'zur\xfcckgehen'), (u'zurlllckkomme', u'zur\xfcckkomme'), (u'zurtick', u'zur\xfcck'), (u'zurtickbringe', u'zur\xfcckbringe'), (u'zurtickgezogen', u'zur\xfcckgezogen'), (u'zurtlckgekommen', u'zur\xfcckgekommen'), (u'zurtlckvervvandeln', u'zur\xfcckverwandeln'), (u'Zuruck', u'Zur\xfcck'), (u'ZURUCK', u'ZUR\xdcCK'), (u'zuruckbleiben', u'zur\xfcckbleiben'), (u'zuruckblicken', u'zur\xfcckblicken'), (u'zuruckdenke', u'zur\xfcckdenke'), (u'zuruckfeuern', u'zur\xfcckfeuern'), (u'zuruckgehen', u'zur\xfcckgehen'), (u'zuruckgelegt', u'zur\xfcckgelegt'), (u'zuruckgewiesen', u'zur\xfcckgewiesen'), (u'zuruckgreifen', u'zur\xfcckgreifen'), (u'zuruckhaben', u'zur\xfcckhaben'), (u'zuruckkehren', u'zur\xfcckkehren'), (u'zuruckkehrten', u'zur\xfcckkehrten'), (u'zuruckkomme', u'zur\xfcckkomme'), (u'zuruckkommen', u'zur\xfcckkommen'), (u'zuruckk\xe9mst', u'zur\xfcckk\xe4mst'), (u'zuruckl', u'zur\xfcck!'), (u'zurucklassen', u'zur\xfccklassen'), (u'zurUcklieB', u'zur\xfccklie\xdf'), (u'zuruckl\xe9cheln', u'zur\xfcckl\xe4cheln'), (u'zurucknehmen', u'zur\xfccknehmen'), (u'zuruckverwandeln', u'zur\xfcckverwandeln'), (u'zuruckverwandelt', u'zur\xfcckverwandelt'), (u'zuruckziehen', u'zur\xfcckziehen'), (u'zuruckzukommen', u'zur\xfcckzukommen'), (u'zurverfilgung', u'zur Verf\xfcgung'), (u'zur\xe9ickrufen', u'zur\xfcckrufen'), (u'zur\ufb02ck', u'zur\xfcck'), (u'Zur\ufb02ckbleiben', u'Zur\xfcckbleiben'), (u'zur\ufb02ckfliegen', u'zur\xfcckfliegen'), (u'zur\ufb02ckgeschickt', u'zur\xfcckgeschickt'), (u'zur\ufb02ckgibst', u'zur\xfcckgibst'), (u"zus'a'tzliche", u'zus\xe4tzliche'), (u'zusammenbeilien', u'zusammenbei\xdfen'), (u'zusammenffigen', u'zusammenf\xfcgen'), (u'zusammenfugen', u'zusammenf\xfcgen'), (u'zusammenfuhren', u'zusammenf\xfchren'), (u'zusammenf\xe9illt', u'zusammenf\xe4llt'), (u'zusammenh\xe9ilt', u'zusammenh\xe4lt'), (u'zusammenh\xe9lt', u'zusammenh\xe4lt'), (u'zusammenh\xe9ngen', u'zusammenh\xe4ngen'), (u'zusammenreifien', u'zusammenrei\xdfen'), (u'zusammenzuschweifien', u'zusammenzuschwei\xdfen'), (u'zuschl\xe9gst', u'zuschl\xe4gst'), (u'zust6Bt', u'zust\xf6\xdft'), (u'zustofken', u'zusto\xdfen'), (u'zust\xe9indig', u'zust\xe4ndig'), (u'zust\xe9ncligen', u'zust\xe4ndigen'), (u'zust\xe9ndig', u'zust\xe4ndig'), (u'zust\xe9ndigen', u'zust\xe4ndigen'), (u'zus\xe9tzlich', u'zus\xe4tzlich'), (u'zus\xe9tzliche', u'zus\xe4tzliche'), (u'zuverlfissig', u'zuverl\xe4ssig'), (u'zuverllssig', u'zuverl\xe4ssig'), (u'zuverl\xe9ssig', u'zuverl\xe4ssig'), (u'zuverl\xe9ssiger', u'zuverl\xe4ssiger'), (u'zuviel', u'zu viel'), (u'zuviele', u'zu viele'), (u'zuzuflligen', u'zuzuf\xfcgen'), (u'Zu\ufb02ucht', u'Zuflucht'), (u'zvvei', u'zwei'), (u'Zw6If', u'Zw\xf6lf'), (u'zw6lfmal', u'zw\xf6lfmal'), (u'Zwel', u'Zwei'), (u'Zwickmfihle', u'Zwickm\xfchle'), (u'Zwillingstiichter', u'Zwillingst\xf6chter'), (u'Zwischenf\xe9lle', u'Zwischenf\xe4lle'), (u'zwnlf', u'zw\xf6lf'), (u'Zw\xe9ilften', u'Zw\xf6lften'), (u'zw\xe9lf', u'zw\xf6lf'), (u'z\xe9gerlich', u'z\xf6gerlich'), (u'z\xe9gern', u'z\xf6gern'), (u'Z\xe9gerns', u'Z\xf6gerns'), (u'z\xe9h', u'z\xe4h'), (u'z\xe9he', u'z\xe4he'), (u'z\xe9her', u'z\xe4her'), (u'z\xe9hl', u'z\xe4hl'), (u'z\xe9hle', u'z\xe4hle'), (u'z\xe9hlen', u'z\xe4hlen'), (u'Z\xe9hlerei', u'Z\xe4hlerei'), (u'z\xe9hlt', u'z\xe4hlt'), (u'z\xe9hltl', u'z\xe4hlt!'), (u'Z\xe9hlung', u'Z\xe4hlung'), (u'Z\xe9hne', u'Z\xe4hne'), (u'Z\xe9hnen', u'Z\xe4hnen'), (u'Z\xe9hneputzen', u'Z\xe4hneputzen'), (u'z\xe9ihle', u'z\xe4hle'), (u'z\xe9ihlen', u'z\xe4hlen'), (u'z\xe9ihlt', u'z\xe4hlt'), (u'Z\xe9ihlungen', u'Z\xe4hlungen'), (u'Z\xe9ihne', u'Z\xe4hne'), (u'Z\xe9libat', u'Z\xf6libat'), (u'\\/GFQHUQGH', u'Vergn\xfcgen'), (u'\\/OFVVUFf\u20ac', u'Vorw\xfcrfe'), (u'\\/Vahrheit', u'Wahrheit'), (u'\\/Vir', u'Wir'), (u"\\/\\/i6fUl'1l\u20acfi", u'Wie f\xfchlen'), (u"\\/\\/il'fUl'1I'\u20acl'1", u'Wir f\xfchren'), (u'\\Nynn', u'Wynn'), (u'_', u'-'), (u'\xc4u', u'Au'), (u'\xe9', u'\xe0'), (u'\xe9chzt', u'\xe4chzt'), (u'\xe9ffentlich', u'\xf6ffentlich'), (u'\xe9ffne', u'\xf6ffne'), (u'\xe9ffnen', u'\xf6ffnen'), (u'\xe9ffnet', u'\xf6ffnet'), (u'\xe9fft', u'\xe4fft'), (u'\xe9fter', u'\xf6fter'), (u'\xe9fters', u'\xf6fters'), (u'\xe9h', u'\xe4h'), (u'\xe9hnlich', u'\xe4hnlich'), (u'\xe9hnliche', u'\xe4hnliche'), (u'\xe9hnlicher', u'\xe4hnlicher'), (u'\xe9ih', u'\xe4h'), (u'\xe9ihnlich', u'\xe4hnlich'), (u'\xe9indern', u'\xe4ndern'), (u'\xe9itzend', u'\xe4tzend'), (u'\xe9lter', u'\xe4lter'), (u'\xe9lteste', u'\xe4lteste'), (u'\xe9ltesten', u'\xe4ltesten'), (u'\xe9ndere', u'\xe4ndere'), (u'\xe9ndern', u'\xe4ndern'), (u'\xe9ndert', u'\xe4ndert'), (u'\xe9nderte', u'\xe4nderte'), (u'\xe9nderten', u'\xe4nderten'), (u'\xe9ngstlich', u'\xe4ngstlich'), (u'\xe9rgere', u'\xe4rgere'), (u'\xe9rgern', u'\xe4rgern'), (u'\xe9rztliche', u'\xe4rztliche'), (u'\xe9rztlichen', u'\xe4rztlichen'), (u'\xe9rztlicher', u'\xe4rztlicher'), (u'\xe9sthetisch', u'\xe4sthetisch'), (u'\xe9tzend', u'\xe4tzend'), (u'\xe9ufierst', u'\xe4u\xdferst'), (u'\xe9ufiersten', u'\xe4u\xdfersten'), (u'\xe9uflserst', u'\xe4u\xdferst'), (u'\ufb02atterndem', u'flatterndem'), (u'\ufb02el', u'fiel'), (u'\ufb02iehen', u'fliehen'), (u'\ufb02jr', u'f\xfcr'), (u'\ufb02lhlen', u'f\xfchlen'), (u'\ufb02lllen', u'f\xfcllen'), (u'\ufb02lr', u'f\xfcr'), (u'\ufb02lrchterlich', u'f\xfcrchterlich'), (u'\ufb02ndet', u'findet'), (u'AIle', u'Alle'), (u'AIter', u'Alter'), (u'GI\xfcck', u'Gl\xfcck'), (u'PIaystation', u'Playstation'), (u'AIIes', u'Alles'), (u'AIso', u'Also'), (u'Ouatsch', u'Quatsch'), (u'AIles', u'Alles'), (u'BIeib', u'Bleib'), (u'KIaut', u'Klaut'), (u'AIlah', u'Allah'), (u'PIan', u'Plan'), (u'oderjemand', u'oder jemand'), (u'liestjetzt', u'liest jetzt')]), 'pattern': u"(?um)(\\b|^)(?:\\/a|\\/ch|\\/d\\/of|\\/ebte|\\/eid|\\/hn|\\/hnen|\\/hr|\\/hre|\\/hren|\\/m|\\/mmer|\\/n|\\/ndividuen|\\/nn|\\/oe|\\/sf|\\/sf\\/0\\/1n|\\/ungs|\\/Vfinuten|\\/\\\xe9nger|\\/\\\xe9uft|0\\/1|0\\/me|0\\/vne|00om|100m|120m|13Oj\\\xa7hrie|145m|150m|160m|165m|19m|20m|27m|30m|37m|38m|3km|5\\/ch|5\\/cher|5\\/cherer|5\\/e|5\\/nd|500m|5ulSere|60m|6de|6dere|6ffne|6ffnen|6ffnet|6fter|750m|85m|90m|a\\/\\/em|A\\/\\/es|abbeif\\$en|abdrficken|aBen|abergl\\\xe9iubischen|aberja|aberjemand|Aberjetzt|abf\\\xe9hrt|abf\\\xe9illt|abgef\\\xe9rbt|abgeh\\\xe9ngt|abgeh\\\xe9rt|abgelost|abgesprengli|abgestfirztl|abgestilrzt|abgestofien|abgew\\\xe9hlt|abgew\\\xe9hnen|abgew\\\xe9hnt|abge\\\xe9nderten|abh\\\xe9ingt|abh\\\xe9ngen|abh\\\xe9ngig|abh\\\xe9ngiges|Abh\\\xe9rstationen|Abjetzt|abkfihlen|Abkfirzung|abkommlich|Ablegenl|ablfisen|ablosen|Ablosung|abreif\\$en|Abrijcken|abr\\\xe9umen|Absch\\/ed|abschiefien|abschlief\\$en|abschliefien|abschwiiren|abstoflsend|Abtrijnnige|abwiirgt|abw\\\xe9gen|abzuh\\\xe9ren|abzuschwiiren|abzusfofien|ACh|Achtungl|Achzen|ACHZT|Acic|ADDRESSDATEI|Adi\\\xf6s|Admiralitat|Admiralit\\\xe9it|Admiralit\\\xe9t|Aff\\\xe9re|Aff\\\xe9ren|AFl|aggresivem|Agypten|aher|AI\\/en\\/vichtigste|Ain\\/vays|AIs|Aktivit\\\xe9iten|Aktivit\\\xe9ten|AKTMERT|Alarmsfufe|albem|Albtriiume|ale|alleinl|allejubeln|allern\\\xe9chsten|Allmiichtigerl|Allm\\\xe9chtige|Allm\\\xe9chtiger|allm\\\xe9hlich|Allm\\\xe9ichtiger|Allsparkl|allt\\\xe9iglichen|ALTESTE|Altester|Alzte|Amerx\\'kaner|amfisierst|Amiilsierst|amiisieren|amiisierenl|amiisierte|Amijsant|amlllsant|amlllsiert|amtlsant|Amusanf|amusant|Amusiert|Anderst|Anderung|Anderungen|anfa\\'ngt|Anffihrer|Anffingerl|Anfiihrer|anfijhlt|Anfingerl|Anfuhrer|Anfuhrern|Anf\\\xe9inger|Anf\\\xe9ingergliick|Anf\\\xe9nge|anf\\\xe9ngst|anf\\\xe9ngt|angebrfillt|angebrullt|angefiihrt|ANGEHCHDRIGE|angehfirt|Angehtirigen|angeh\\\xe9ren|angeh\\\xe9rt|angel\\\xe9chelt|angerilhrt|anger\\\ufb02hrt|angeschweifit|angespruht|angetiltert|Angriffspl\\\xe9nen|Angstschweili|anhiiren|Anh\\\xe9inger|anh\\\xe9lt|anh\\\xe9ngen|anh\\\xe9ren|ankijndigen|anliigen|anlugen|anmal3ende|ann\\\xe9hern|anriihrst|anrijuhren|anst\\\xe9indig|anst\\\xe9indiger|anst\\\xe9indiges|anst\\\xe9ndig|anst\\\xe9ndige|anst\\\xe9ndigen|Anst\\\xe9ndiges|Antik\\\xe9rper|Antiquit\\\xe9t|Antistrahlenger\\\xe9t|antwortenl|Anwe\\/sung|Anwe\\/sungen|Anw\\\xe9iltin|Anw\\\xe9lte|Anw\\\xe9ltin|Anzilge|Anztinden|Anzuge|Anzugen|anzuhiiren|anzuhoren|anzundenl|anzupiibeln|An\\\xe9sthesie|An\\\xe9sthesieprofessor|An\\\xe9sthesieteam|An\\\xe9sthesist|An\\\xe9sthesisten|An\\\xe9sthetikum|ARBEITERI|Arbeitsfl\\\ufb02gel|Armeefunkger\\\xe9t|Armel|Arschkichern|Arschliicher|Arschliichern|Arschl\\\xe9cher|Arschl\\\xe9chern|Arzte|Arzten|Arztin|Atemger\\\xe9usche|Atlantikkiiste|Atlantikkuste|ATMOSPHARE|Atmosph\\\xe9re|Atmosph\\\xe9renbereich|Atmosph\\\xe9reneinflugsequenz|Atmosph\\\xe9reneintritt|Attenfaiter|Attent\\\xe9iter|Attent\\\xe9ter|Attent\\\xe9ters|Attraktivit\\\xe9t|auBen|Aubenblick|AuBenbord|AuBenwelt|auBer|AuBerdem|auBerhalb|auc\\/1|auchl|Auf\\$erdem|auf3er|aufAugenh6he|aufblilhende|auff\\'a\\'ngt|Auff\\\xe9lliges|aufgebltiht|aufgeftlhrt|aufgeh\\\xe9ingt|aufgeh\\\xe9rt|aufgekl\\\xe9rt|aufger\\\xe9umt|aufgespiefit|aufgewiihlter|aufgez\\\xe9hlt|Aufh6ren|aufhbren|aufhdrf|aufhfiren|aufhiiren|Aufhoren|Aufh\\\xe9iren|aufh\\\xe9ngen|Aufh\\\xe9ren|aufh\\\xe9renl|aufi|Aufienministerium|aufier|Aufierdem|aufiergew\\\xe9hnliche|aufierhalb|Aufierirdischer|Aufierlich|aufierordentlich|Aufkenposten|aufkisen|aufkl\\\xe9ren|Aufkl\\\xe9rung|aufl|Aufl6sung|aufliisen|auflser|aufl\\\xe9sen|aufmiibeln|aufraumte|aufr\\\xe9umen|aufschlief\\$en|Aufschlull|aufSer|aufSIJBigkeiten|aufspturen|aufstellenl|Aufst\\\xe9ndige|aufTanis|Auftr\\\xe9ge|aufvv\\\xe9ndigen|aufw\\\xe9ichst|aufw\\\xe9rmen|aufZ\\>er|Aufztlge|aufzuhiivren|aufzukl\\\xe9ren|aufzuldsen|aufzur\\\xe9umen|aufz\\\xe9hlen|auf\\\xe9er|auf\\\ufb02iegen|Augenm\\\xe9igen|aul\\'5er|aul3er|Aul3erdem|aul5er|aulier|Aulierdem|auliergewfihnlich|aulierhalb|Aulierirdischen|auller|aullerhalb|AulSer|AulSerdem|ausdriicken|ausdriickt|ausdrijcken|ausdrucklicher|Ausdr\\\ufb02cken|Ausen\\/v\\\xe9hlte|Ausen\\/v\\\xe9hlter|auserw\\\xe9hlt|Ausffillen|ausfijhren|ausfijhrt|ausfuhren|ausfullt|ausgef\\\ufb02llt|ausgeliischt|ausgeliist|ausgel\\\xe9ist|ausgel\\\xe9scht|ausgel\\\xe9st|ausgeriickt|ausgerijstet|AUSGEWAHLT|ausgew\\\xe9hlt|Ausg\\\xe9ngen|aush6hlen|aushiilt|Aushilfspunkerl|aush\\\xe9lt|ausilben|Auskunfte|ausl|Ausl\\\xe9nder|Ausl\\\xe9nderl|ausl\\\xe9schen|ausl\\\xe9sen|Ausl\\\xe9ser|AusmaB|ausprobie\\\ufb02|Ausriistung|ausrusten|Ausrustung|Ausschullware|ausschwinnenl|auszudriicken|auszuschliefien|auszuw\\\xe9hlen|Autorit\\\xe9t|Autoschlilssel|Autoschl\\\ufb02ssel|au\\\ufb02\\/viihlt|Au\\\ufb02ergewiihnlich|Azevedol|A\\\ufb02es|B\\/ick|b\\/olog\\/sch|b\\/sschen|B6se|B6sem|B6ser|Babym\\\xe9dchen|Ballastst\\\xe9ffchen|Ballm\\\xe9dchen|Ballm\\\xe9idchen|Ballonverk\\\xe9ufer|Balzenl|Bankijberfall|Barbarenilberfall|Barenk\\\xe9nig|basfeln|Bastianol|Bastlano|Bauchfellentztmdung|Bauchkr\\\xe9mpfe|bauf\\\xe9llig|bauf\\\xe9llige|Baumst\\\xe9mme|Baupl\\\xe9ne|Bbses|be\\/de|bedecktl|Bedilrfnisse|Bedilrfnissen|Bedllirfnisse|bedrijckt|bedr\\\xe9ngen|bedr\\\xe9ngt|bedr\\\xe9ngten|Beeilungf|Beeilungl|Beerdingungsinsiiiui|Beerdingungsinstitut|Befehll|beffirdert|Beffirderung|befiirchte|befiirchteten|befiirdert|befiirderte|Befiirderung|befilrchtete|befllirchte|befurworte|befurwortet|bef\\\xe9rdere|bef\\\xe9rdert|Bef\\\xe9rderung|beg\\/ng|begl\\\ufb02ckt|begniigt|begrfindetes|Begriiliungsruf|begrijfien|Begrilfiung|Begrilfkung|begrL\\'llZ\\>en|BegrUBungsruf|begrUf\\$t|begrufie|begrufit|Begrundung|Beh6rden|beh\\\xe9lt|Beh\\\xe9lter|beh\\\xe9mmert|beiB|beiBen|beiBt|beif\\$t|beif2\\>en|beifken|beiflsen|beijenen|Beiliring|BEKAMPFEN|bekannf|bekanntermafken|bek\\\xe9me|bek\\\xe9mpfen|Bek\\\xe9mpfung|bel|belde|beliellsen|belm|Beltlftungstunnels|Beluftungstunnel|Beluftungstunnell|bel\\\xe9stigen|Bemiihe|Bemiihen|bemL\\'lhe|bemtuht|bemuhen|bemuhten|Ben\\\xe9tigen|ben\\\xe9tigt|ben\\\xe9tigten|Beobachtar|bereft|bereitf\\\xe9ndet|beriichtigtsten|beriichtlgten|beriihmt|Beriihmtheiten|beriihren|Beriihrend|beriihrt|Beriihrtl|berijhrt|berilhmter|berilhrt|Berilhrung|Berks\\/1\\/re|BerL\\'lhre|berllichtigter|berllihren|berllihrt|berlllhmten|Bern\\/e|beruhrt|beruhrte|ber\\\ufb02hmter|besafi|Besch\\'a\\'ftigt|bescheifien|beschiftigt|beschiiftigt|beschiitzen|beschiitzt|beschiltze|beschiltzen|beschleun\\/gt|beschliefkt|beschlie\\\ufb02tloszuziehen|beschllitzet|beschllitzt|beschr\\\xe9nkt|Beschr\\\xe9nkungen|beschtitze|beschutzen|besch\\\xe9digt|besch\\\xe9ftigen|besch\\\xe9ftigt|besch\\\xe9ftigte|besch\\\xe9ftigten|besch\\\xe9iftige|besch\\\xe9iftigt|Besch\\\xe9imen|besch\\\xe9mendste|besch\\\xe9oligen|besch\\\ufb02tzen|Besch\\\ufb02tzer|Besf\\\xe9f\\/gen|Besitztijmer|BESTATIGE|BESTATIGT|bestenl|bestiirzt|bestiitigen|bestltigt|bestx\\'mmt|best\\\xe9indige|best\\\xe9itigt|Best\\\xe9itigung|Best\\\xe9itigungen|Best\\\xe9tige|Best\\\xe9tigen|best\\\xe9tigt|Best\\\xe9tigung|bes\\\xe9inftigen|bes\\\xe9inftigt|bes\\\xe9nftigen|Betiiubt|betriibt|betriigen|Betriiger|betriigt|betrijgen|Betrijgerl|betrilgen|betrtlgerischer|betr\\\xe9chtliches|Betr\\\xe9ge|betr\\\xe9gt|Bettw\\\xe9ische|Beviilkerung|bevorwir|bev\\\xe9lkern|bewegf|Bew\\\xe9hrungsauflage|bew\\\xe9ihrte|bew\\\xe9iltigen|bew\\\xe9issern|bew\\\xe9lkten|bew\\\xe9ltigen|Bew\\\xe9ltigung|bew\\\xe9ssern|Bew\\\xe9sserungssysteme|Bezirksgelinde|bezuglich|be\\\xe9ingstigende|be\\\xe9ngstigend|be\\\xe9ngstigender|bffnen|Bficher|Bfiro|bfirsten|bfise|bfisen|bfiser|bfises|bfiseste|bfisesten|bgsonderen|BI6de|Bierbfichse|Biicher|Biicherei|Biick|Biiffel|BIiHlt|Biihne|Biilcherei|BIind|Biirger|Biirgerrechte|Biiro|Biiros|Biirotiir|biirsten|Biise|Biisen|biises|Bijchern|Bijhne|Bijndnis|Bijrger|Bijrgermeister|Bijro|Bijrokraten|Bijrzel|Bilchern|Bildseitenverh\\\xe9ltnis|Bilndel|Bilro|BIood|BIQIS|Bischiife|Bischiifen|Bisch\\\xe9fe|bistja|bistjetzt|Bittejetzt|bittersiJl3es|Bittesch\\\xe9n|BIue|bi\\\xdfchen|BL1hne|Bl6cke|bl6d|bl6de|bl6den|bl6der|bl6des|Bl6dian|Bl6dmann|Bl6dsinn|Blauaugel|Blddes|Ble\\/bf|bleibenl|blelbenl|Blfidmann|Blfidsinn|Blfimchen|BLicher|BLihne|Bliid|bliide|bliiden|bliidere|bliides|Bliidmann|Bliidsinn|bliiht|bliirgerlichen|Blijmchen|Bllck|Bllindel|Blllroklammer|bln|bloB|bloBen|bloBstellen|blockiertl|BLODE|blof\\$|blofl|Blol2\\>|blol3|blol3\\>|blol3stellen|bloli|blolistellen|blolls|bls|Blst|bltte|Blumenstr\\\xe9iulichen|Blument\\\xe9pfen|Blutgetr\\\xe4nkte|Blutgetr\\\xe9nkte|blutjungl|blutriinstig|Blutvergiefien|bl\\\xe9d|Bl\\\xe9de|bl\\\xe9den|bl\\\xe9der|Bl\\\xe9des|Bl\\\xe9dheit|Bl\\\xe9dmann|Bl\\\xe9dsinn|Bl\\\xe9iser|Bl\\\xe9ser|bl\\\xe9st|Bnjicke|Bodensch\\\xe9tze|Bogenschiefien|Bogenschiefienl|Bogenschiefiens|Bogenschiitze|Bogenschiitzen|Bogenschijtze|Bogenschijtzen|Bogenschutzen|Bogenschutzenl|BOnjour|bosartige|Bracken|Briicke|Briicken|Briider|Briihe|Briillen|briillt|Brijcke|Brijderlichkeit|brijllen|Brilcke|Brilder|Brilllen|brillltjeden|Brilnette|Brilsten|brilten|BrL\\'lcke|brL\\'lllen|brlliderliche|Brllidern|Brlliste|Broschijre|Broschilren|Broschuren|Brucke|Brucken|Brudern|Bruhe|brullen|brullt|Brutalitiit|Brutzelhtihnchen|Br\\\xe9chtet|Br\\\xe9iutigam|Br\\\xe9sel|Br\\\xe9tchen|br\\\xe9uchte|br\\\xe9uchten|br\\\xe9unen|Br\\\xe9ute|Br\\\ufb02cke|Br\\\ufb02der|Btiro|Btiser|Bucher|Buchern|Budgetkiirzung|BUFO|Bugschutzgerate|Buhnenbild|Bullel|Buml|Bundnis|Burger|Burgerrechtlerin|Buro|BURO|Burol|Burottlr|Busche|B\\\xe9ickchen|B\\\xe9ickerei|B\\\xe9ille|B\\\xe9inder|B\\\xe9ir|B\\\xe9irgermeister|B\\\xe9iro|b\\\xe9ise|B\\\xe9iume|B\\\xe9nder|B\\\xe9r|B\\\xe9ren|B\\\xe9renhasser|B\\\xe9renhunger|B\\\xe9renj\\\xe9ger|B\\\xe9renk\\\xe9nig|B\\\xe9renlaute|B\\\xe9renrolle|B\\\xe9renschnitzereien|B\\\xe9renstimmen|B\\\xe9rin|B\\\xe9risch|B\\\xe9rs|B\\\xe9rte|b\\\xe9s|b\\\xe9se|b\\\xe9sen|B\\\xe9ses|B\\\xe9ume|B\\\xe9umen|B\\\ufb02chern|B\\\ufb02ste|Cafe|Caf\\\xe4|CASAREN|Charakterm\\\xe9ngel|Charakterst\\\xe9rke|Chrlntlna|Ciden|Ciffnet|Cihrchen|Citro\\\xe9n|clamit|class|Clbernimmt|cler|Coimbrasl|CommanderWill|Corenillal|Cowboyscheifi|C\\\xe9sar|D\\/e|d\\/ese|d\\/esem|d\\/esen|D\\/eser|D\\/eses|D\\/sko|dabel|dachfen|daffir|dafiir|Dafijr|Dafijur|Dafilr|dafL\\'lr|dafLir|dafljr|dafllir|Daflllrwar|daftir|dafUr|dafzjir|dajemand|dal|Damenh\\\xe9nde|damitl|damlt|DANEMARK|darfiber|Dariiber|darijber|Darilber|dart\\/\\'ber|dartlber|DARUBER|DarUber|dasjetzt|dasl|Dateniibermittlung|dauem|dauerf|dazugeh\\\xe9ren|Da\\\xdf|Da\\\ufb02lr|Ddrfern|def|Defekf\\/v|deinerZelle|deln|delne|demfiltigen|Demijtigung|demllitige|demllitigen|denkwurdiger|denkw\\\ufb02rdiger|derAbgeordnete|derAusgabe|derAusl6ser|DerjL\\'lngste|derjunge|dermaben|derTyp|derWeg|derWelle|DerWL1rfel|DerZauberer|de\\_\\_n|dfeserr|dffentlichen|dffnen|Dfimonen|dfinn|dichl|diej\\\xfcngste|dienstunfahig|Dieselkapit\\\xe9in|Dieselkapit\\\xe9n|Dieselmotorenl|dieserAufnahme|Dieserjunge|Diiit|diirfe|Diirfen|diirft|diirfte|dijfien|dijnn|dijrfen|Dijrfte|dijstere|dilmmer|dilrfen|dilrft|dilrften|dilrftig|Dine|dirja|dirjemand|dirjetzt|dirJulie|dirl|dirwehzutun|Di\\\xe9t|Di\\\xe9tberaterin|Di\\\xe9tbier|dlch|Dle|dles|Dlese|Dlfit|Dlitplan|dllirfen|dllirft|dllirstet|dlr|doc\\/1|dochl|dolthin|Doppelgfiner|Doppelgfinger|Doppelg\\\xe9inger|Doppelg\\\xe9nger|Doppelzijngig|doppelztmgiger|dor|Dr\\'a\\'ngt|drachengriinen|Drahte|dranl|drau\\/3en|drau\\/Sen|drauBen|drauf\\$en|draufdrilcken|draufgestllirzt|draufg\\\xe9ngerisch|draufien|draufken|drauflsenl|drauf\\\xe9en|drauilen|draul3en|draul5en|draulien|draullen|draulSen|Dreckl\\\xe9chern|Drecksmiihle|Drecks\\\xe9cke|drfiben|Drfick|Drfingeln|drih|driiben|driicken|driickt|drijben|drijber|drijck|drijckt|drilben|drilber|drilcken|drLiber|drlliben|drlllben|Drogenabh\\\xe9ngige|Drticken|druben|drubenl|druber|Druckkn\\\xe9pfe|drunterliegt|Dr\\\xe9nage|dr\\\xe9ngeln|dr\\\xe9ngen|dr\\\xe9ngt|dr\\\ufb02ben|dtirft|dtlrfen|Dudels\\\xe9cken|dUFf\\\u20acl\\'1|dul|dull|Dummk6pfe|Dummkiipfe|Dunnschiss|durchdrficken|durchdr\\\xe9ngen|Durchfiihrung|durchfuhren|durchgefiihlt|durchgefijhrt|durchgefuhrt|durchgef\\\ufb02hrt|Durchg\\\xe9nge|Durchladenl|durchlfichere|durchsetzungsf\\\xe9higer|durchst\\\xe9bern|durchwilhlt|durchzufilhren|durchzufuhren|Durfen|durft|dusterer|D\\\xe9cher|D\\\xe9imon|D\\\xe9imonen|D\\\xe9inemark|D\\\xe9inemarks|D\\\xe9inen|d\\\xe9inisches|d\\\xe9mlich|D\\\xe9mliche|d\\\xe9mlichen|d\\\xe9mlicher|d\\\xe9mlichl|d\\\xe9mmert|D\\\xe9monenb\\\xe9ren|d\\\xe9monischen|D\\\xe9rme|D\\\xe9rrfleisch|D\\\xe9umchen|d\\\ufb02rfen|E\\/\\/e|e\\/n|e\\/ne|e\\/nem|e\\/nen|e\\/ner|e\\/nes|e\\/ns|e\\/nsf|E9YPt|Ea\\/vtes|ebenbfirtig|ebenburtige|Ec\\/vte|echfen|edelm\\\ufb02tig|efn|efwas|Eheminner|Ehem\\\xe9nnern|Ehezerstfirerin|Ehrenbijrger|EHRENBURGERSCHAFT|Ehreng\\\xe9iste|Eichhfirnchen|Eichhiirnchen|Eichh\\\xe9rnchens|eifersfichtig|eifersiichtig|eifers\\\ufb02chtig|eigenh\\\xe9ndig|eigenmlchtig|eigenntltziges|Eihnlich|Eimen\\/veise|Einbruche|eindriicken|Eindring\\/Inge|eindrucken|einejunge|einerfr\\\ufb02hen|einervorfuhrung|einfiihren|Einfiihrung|einfilgen|einfilhlsamsten|einflllgen|Einflusse|einfugen|einfuhrten|Einfuhrung|Einf\\\xe9ltige|eingefiigt|eingef\\\ufb02gt|eingehiillt|eingepr\\\xe9gt|einger\\\xe9iumt|einger\\\xe9umt|eingeschl\\\xe9fert|eingeschr\\\xe9nkt|eingesch\\\xe9itzt|eingesch\\\xe9tzt|eingesturzt|eingieBt|eingschaltet|Einh\\\xe9rnern|einlegenl|einl\\\xe9dt|einl\\\xe9sen|Einsatzfahigkeit|Einschiichterung|Einschliefklich|Einschlielilich|einstellenl|Eins\\\xe9tze|eint\\\xe9nig|Einzelg\\\xe9ngerin|einzusch\\\xe9tzen|Eisstiirme|Elektrizit\\\xe9t|elfenbeingetfinte|elit\\\xe9rer|Eln|Elne|elnem|Elnen|elner|Elnes|empfindungsf\\\xe9higen|Empf\\\xe9inger|empf\\\xe9ngt|Empiirend|Empiirendste|empiirt|emst|en\\/varten|En\\/vartungen|en\\/v\\\xe9hnt|Enchant\\\xe4|endgiiltig|endgultig|endgultigen|endg\\\ufb02ltig|endlichl|ENERIGE|enfternt|Engl\\\xe9nder|Engl\\\xe9nderin|eniillen|entbl6Bte|entbl6f\\$en|entfiihre|entfiihrt|entfiihrte|Entfiihrung|Entftihrung|ENTFUHRUNGSVERDACHTIGER|enthllt|enthUllt|enth\\\xe9lt|entliiften|Entliiftungen|Entlijlftungen|entluften|entl\\\xe9sst|Entreilit|entriistet|entr\\\xe9itseln|Entschlrfen|Entschlull|ENTSCHLUSSELN|Entschlussen|entsch\\\xe9rfen|enttausche|enttiiuscht|Enttluscht|Enttluschungen|entt\\\xe9iuschen|entt\\\xe9uschen|entt\\\xe9uschst|entt\\\xe9uscht|Entv\\\\\\/Urfe|Entwicklungsl\\\xe9ndern|entzllickt|entzllindet|entzuckend|entzundet|enzv\\\xe9rmt|Er6ffnen|erb\\\xe9rml\\/ch|erb\\\xe9rmlich|Erb\\\xe9rmliches|Erdnijsse|erdriickt|erd\\\xe9ihnliche|erfebst|erffillen|erfiffnet|erfiille|erfiillen|erfiillt|erfijllt|erfillle|erfilllen|erfilllt|erfllille|erfllillt|erflllllen|Erfolgl|erfullen|erfullt|erf\\\xe9hrst|erf\\\xe9hrt|erf\\\ufb02llen|ergrllindet|erhalfen|Erhdhe|erhiihter|erhiiren|ERHKLT|erhllt|erh\\\xe9hen|erh\\\xe9ht|erh\\\xe9ilt|erh\\\xe9lt|erh\\\xe9rt|erh\\\xe9rte|eriiffnet|erja|erjetzt|erjung|erkl\\'a\\'ren|erkl\\'air\\'s|erklaren|erklfire|Erklfirung|erklirt|erkllre|erkllrt|erkllrte|erkllrten|Erkllrung|erkl\\\xe9ir|erkl\\\xe9ire|erkl\\\xe9iren|erkl\\\xe9r|erkl\\\xe9r\\'s|erkl\\\xe9rbar|Erkl\\\xe9re|erkl\\\xe9ren|erkl\\\xe9rt|Erkl\\\xe9rung|erk\\\xe9ltest|erlC\\'\\>st|erldse|Erled\\/gen|erlieB|erlnnem|erl\\\xe9scht|erl\\\xe9sen|erl\\\xe9st|Erl\\\xe9sung|ermbglichen|Erm\\\xe9chtige|erm\\\xe9glicht|erm\\\xe9glichte|ernlllchtert|ern\\\xe9hren|Ern\\\xe9hrung|eroffnet|Erpressungsscheilie|err\\\xe9tst|erschieB|erschieBen|erschiefien|erschiefit|erschiefke|erschielie|Erschielit|erschiipft|erschiittert|erschilttert|erschl\\\xe9gt|ERTCHDNT|ERTCNT|ERTGNT|ertiffnen|ertr\\\xe9gst|ertr\\\xe9inken|ert\\\xe9nt|ervvartez|ervvilrgen|ervv\\\xe9hnen|ervv\\\xe9ihnen|ervv\\\xe9ihnt|ervv\\\xe9ihnte|Erv\\\\\\/an|Erv\\\\\\/an\\'s|erw\\'a\\'hnt|Erwar|erwe\\/sen|Erwfirmung|Erwird|Erwtirde|erw\\\xe9gt|Erw\\\xe9gung|Erw\\\xe9hne|erw\\\xe9hnen|erw\\\xe9hnt|erw\\\xe9hnte|Erw\\\xe9hnung|erw\\\xe9ihlt|erw\\\xe9ihnt|erw\\\xe9rmt|erz\\'a\\'hlt|Erzdiiizese|erzfihlen|Erzfihler|erzihlenl|erziihlen|erziihlt|erziirnt|erzilrnt|erzllirnt|erzurnen|erz\\\xe9hl|erz\\\xe9hle|Erz\\\xe9hlen|erz\\\xe9hlerische|erz\\\xe9hlerischen|erz\\\xe9hlerischer|Erz\\\xe9hlkunste|erz\\\xe9hlst|erz\\\xe9hlt|erz\\\xe9hlte|Erz\\\xe9hlung|Erz\\\xe9ihl|Erz\\\xe9ihle|erz\\\xe9ihlen|erz\\\xe9ihlst|erz\\\xe9ihlt|erz\\\xe9ihlte|er\\\xe9ffnen|er\\\xe9ffnet|er\\\xe9ffnete|Er\\\xe9ffnungsaufnahme|Er\\\xe9ffnungssequenz|Er\\\xe9ffnungsszene|Er\\\ufb02lllen|etemity|etvva|euc\\/1|Europ\\\xe9er|europ\\\xe9ische|ex\\'nfac\\'\\/7|Examenspriifungen|Exekutivzust\\\xe9noligkeit|Explosionenl|Extrablattl|F\\/nden|F\\/ugba\\/I|Fahnrich|fahrlissiges|Fairbankverlieh|Fallef|fallengelassen|Fallschirmj\\\xe9gereinheiten|Fam\\/Z\\/e|Fa\\\xdf|FBl|Fe\\/nd|fehlschl\\\xe9gt|Feindberllihrung|Feind\\\xfcbewvachung|feltig|femen|fernh\\\xe9ilt|Festhaltenl|Fettw\\\xe9nste|Feuen\\/vehr|Feuerliischer|Feuervvehrrnann|Feuerwehrl|Feuerwfirmen|Feue\\\ufb02|ff\\'Ul\\'1\\\u20acf\\'\\\u20acl\\'1|Ffiegen|ffihft|ffihren|ffinf|ffir|ffirchte|ffirs|ffittere|FI6he|Fiasenm\\\xe9iher|fibel|fiber|fiberdressierter|fibergezogen|fiberhaupt|fiberholt|fiberlegt|fibernachtet|fiberspannt|fibertreiben|fiberzfichtete|fibrig|Fieferenz|Fieifi|fiffentlichkeit|fiffnen|fiffnest|fifter|Fihigkeit|fihneln|Fihrt|fiihl|fiihle|fiihlen|fiihlst|fiihlt|Fiihlte|Fiihre|Fiihren|Fiihrerin|Fiihrerschein|fiihrfe|fiihrt|fiihrte|Fiihrungsf\\\xe9ihigkeiten|Fiihrungsprogramm|Fiihrungsstil|Fiilcksicht|fiillen|fiinden|fiinf|fiinfhundert|fiinfzehn|fiir|fiirchte|fiirchten|fiirchterlich|fiirchterlichl|fiirchterllches|fiirchtet|fiirchteten|fiirjeden|Fiirmchen|fiirs|Fijgen|fijhl|fijhle|fijhlen|fijhlst|fijhlt|fijhren|Fijhrer|fijhrt|Fijhrungsqualit\\\xe9iten|FiJl3en|Fijlie|fijlr|Fijnf|Fijnfziger|fijr|fijrchte|fijrchten|Fijrjedenl|fijrs|fiJrVorteile|fijttern|fijur|filhl|filhle|filhlen|filhlte|filhre|filhren|Filhrern|Filhrerschein|filhrst|filhrt|filhrte|filhrten|Filhrung|Fillle|Filll\\\xe9en|Filmemachen|Filml|filnf|Filn\\\ufb02|Filr|filr\\'ne|filrchten|filrchterlich|filrs|filter|findem|findenlassen|Fingerabdrijcke|Fingerabdrilcke|Fingerniigeln|Fingern\\\xe9gel|Fingern\\\xe9geln|fingstlich|Fiothaarige|Firmen\\\xe9rzte|Fischk\\\xe9pfe|FIUssigkeitsgleichgewicht|Fiusten|FIynn|fjffnen|fL\\'1\\'r|fL\\'1hle|FL\\'1r|fL\\'ir|fL\\'lr|fL1r|Fl6he|Flclse|fleifkige|fleifkiges|fleil3ig|Fleischb\\\xe9llchen|Fleischkl6l\\'Sen|Flfige|Flfigell|flfistert|Flhigkeiten|Flhnrich|Flhnriche|flieBen|Fliefiband|Fliefiheck|Flieflsb\\\xe9nder|flielit|flielSt|FLif\\$e|fLihlt|fliichtige|Fliigel|flijchtig|Flijgel|Flijgelfedernl|Flilssige|flilstert|fLir|fljhrt|Fljr|flJr\\'n|fllihrst|Fllihrt|fllinf|fllinften|Fllinkchen|Fllir|fllirchte|fllirchten|fllirchterlichen|fllirchtet|Fllirsten|Fllitterungszeitenl|flllgte|flllgten|flllhrten|Flllhrung|Fllligel|flllistern|fllllstert|flllrchte|flllrchten|flllrjede|Flohtransporterl|Floli|Flottenalzt|Flottenstiitzpunkt|Flottenstutzpunkt|Flrma|fltlsterte|Fluchtig|Flughdhe|Flughiihe|Flugh\\\xe9ifen|Flugunf\\\xe9ihig|flugunf\\\xe9ihigen|Flugunf\\\xe9ihigl|Flugzeugl|FLUSSIGER|Flustereffekt|Flustern|FLUSTERT|fl\\\ufb02stern|fl\\\ufb02sterten|Folgendesz|fortgespiilt|fortspiilen|fortw\\\xe9hrend|Fr\\/ed\\/10\\/|Fr5ulein|Fr6hliche|Frachfmodule|Frafi|fragfe|Fral\\'S|fralken|Franzfisisch|Franziisin|franziisische|franziisischen|franziisischer|franziisisches|Franz\\\xe9sisch|franz\\\xe9sische|franz\\\xe9sischen|franz\\\xe9sischer|Franz\\\xe9sisches|FRAULEIN|fre\\/em|freffen|freilieB|freimiitigen|Fressger\\\xe9usche|Frfichtekuchen|frfih|frfiher|Friedh\\\xe9fe|Friichtchen|friih|friihen|friiher|friihere|friihliche|friihlichen|Friihstiick|friilher|friilhesten|Frijchte|frijh|frijher|frijherer|frilh|frilhen|Frilher|frilhere|Frilhst\\\ufb02ck|Fris6r|frL\\'lher|Frljihling|Frllichte|frllih|frlliher|Frllihstiickskiiche|fro\\/1|FROHLICHE|frtih|Frtiher|Frtihliche|Frtihstticksei|Frtlh|FrUh|FRUHE|fruhe|fruhen|Fruher|fruheren|Fruhling|Fruhlingsrolle|FrUhstUck|Fruhstuck|frUhstUcken|fr\\\xe9hliches|fr\\\xe9ihfiches|fr\\\xe9ihlich|Fr\\\xe9iulein|fr\\\xe9nen|Fr\\\xe9sche|Fr\\\xe9ulein|ftihlen|Ftillhorn|Ftir|Ftirs|Ftlhrung|ftlrchte|ftmf|Fu\\/3|FuB|FuBballspieler|FUBen|Fuf\\$|Fufi|Fufiabdrucke|Fufiballtraining|FufL|Fuflsball|Fuflsballszene|fUhl\\'t|fuhle|fuhlst|fUhlt|fUhre|fUhrt|fuhrte|fuhrten|Fuhrung|Fuhrungsf\\\xe9higkeiten|Fuhrungsoffizier|Fuhrungsqualit\\\xe9t|FUI3en|Fuli|Fuliball|Fulisohlen|FUller|fUllten|fumt|Fundbiiro|FUnf|Funftbeste|Funkchen|Funkger\\\xe9it|Funkger\\\xe9ite|Funkger\\\xe9t|funktionstilchtig|FUR|Fur|fUrAusweichmanc\\'\\\xa7ver|furchteinfl6Bend|furchteinfl6Bende|furchten|Furchtest|furchtet|furchteten|fureinander|furjeden|furjemanden|furjudische|furs|FUrWalter|fut|Fu\\\ufb02ballspiel|F\\\xa7hnlein|f\\\xe9\\/\\/t|f\\\xe9hig|F\\\xe9higkeit|F\\\xe9higkeiten|f\\\xe9hnen|F\\\xe9hnens|F\\\xe9hnerei|F\\\xe9hnleinmiitter|F\\\xe9hre|f\\\xe9hrst|f\\\xe9hrt|F\\\xe9ihigkeit|F\\\xe9ihigkeiten|f\\\xe9ihrt|f\\\xe9illst|f\\\xe9illt|F\\\xe9ilschung|F\\\xe9ingt|f\\\xe9ir|F\\\xe9lle|F\\\xe9llen|f\\\xe9lligl|F\\\xe9llt|f\\\xe9llt\\'s|F\\\xe9lschen|F\\\xe9lschung|f\\\xe9nde|F\\\xe9ngst|F\\\xe9ngt|f\\\xe9rben|f\\\xe9rbt|f\\\xe9rdern|f\\\xe9rmlich|F\\\xe9ustlinge|f\\\xfcr\\'ne|f\\\xfcrchlerlichen|f\\\xfcrjede|f\\\xfcrjeden|F\\\ufb02hrungsprogramm|F\\\ufb02hrungsstil|f\\\ufb02llen|f\\\ufb02llt|f\\\ufb02nf|F\\\ufb02r|f\\\ufb02rchte|f\\\ufb02rjeden|g\\/bf|g\\/bsf|G5ste|G6nn|G6t\\'lllche|G6tter|G6ttern|Gamilonl|ganzlich|gardel|Gasbrfiter|gauze|GCJKTEN|ge6lt|gebauf|Gebiez|Gebi\\\xe9ude|gebliebenl|GEBRAUCHTWAGENIPOLIZEIITAXI|Gebr\\\xe9u|gebs|gebuhrend|Geb\\\xe9ick|Geb\\\xe9iude|geb\\\xe9rdet|Geb\\\xe9rmutter|Geb\\\xe9rmutterhals|Geb\\\xe9ude|Geb\\\xe9udedach|Geb\\\xe9uden|Geb\\\xe9udes|gedemiitigt|gedemijtigt|gedemllitigt|gedrtickt|gedr\\\xe9ngt|Ged\\\xe9chtnisverlustes|Ged\\\xe9ichtnis|ged\\\xe9mpft|gef\\'a\\'hrlich|gef\\'a\\'llt|gef5IIt|gefahrdet|gefahrlich|gefallsllichtige|GEFANGNISTECHNOLOGIE|Gefechtsausrustung|Geffihl|geffihrt|geffillt|Gefihrliche|Gefiihl|Gefiihle|Gefiihlen|Gefiihlslebens|gefiihlsmiliigen|gefiihrt|gefiillst|gefiillt|gefiirchtet|Gefijhl|Gefijhle|gefijhlt|gefijllte|Gefilhl|Gefilhle|gefillt|Gefingnis|gefL\\'lllten|Geflilster|gefllihllos|Geflllhlsduselige|GEFLUSTERT|Geftuhle|Gefuhl|Gefuhle|Gefuhlen|gefuhlt|gefuhlvolle|gefurchtet|Gef\\\xe9hrde|gef\\\xe9hrden|gef\\\xe9hrdet|Gef\\\xe9hrdung|gef\\\xe9hrlich|gef\\\xe9hrliche|gef\\\xe9hrlicher|gef\\\xe9hrlicheren|Gef\\\xe9hrliches|Gef\\\xe9hrt|gef\\\xe9ihrden|gef\\\xe9ihrdet|gef\\\xe9ihrlich|Gef\\\xe9ihrte|Gef\\\xe9ihrten|gef\\\xe9illt|Gef\\\xe9illt\\'s|gef\\\xe9llf|gef\\\xe9llfs|gef\\\xe9llig|gef\\\xe9lligst|gef\\\xe9llst|Gef\\\xe9llt|Gef\\\xe9llt\\'s|gef\\\xe9lscht|Gef\\\xe9ngnis|Gef\\\xe9ngnisregeln|Gef\\\xe9ngnisse|Gef\\\xe9ngnissen|Gef\\\xe9ngnisses|Gef\\\xe9ngniswagen|gef\\\ufb02gig|gegenfiber|gegeniiber|gegeniibertritt|gegeniiberzusfehen|gegenijber|gegenlliber|gegenlliberstehen|Gegenstrfimung|Gegenstr\\\xe9mung|Gegensttlck|Gegenst\\\xe9nde|gegenuber|Gegenverschwiirung|gegenw\\\xe9rtigen|gegriindet|gegrijfit|gegrilfit|GegrUl3t|gegrundet|geh6ren|geh6rt|gehdrt|GeheilS|geheilSen|gehejetzt|gehf|gehfiirt|gehfire|gehfiren|gehfirt|gehiipft|Gehiir|gehiire|gehiiren|gehiirst|gehiirt|Gehim|Gehirnsch\\\xe9den|gehlngt|gehore|gehoren|gehort|geht\\'sl|Gehtirt|gehtjetzt|geh\\\xe9irt|Geh\\\xe9iuteten|geh\\\xe9r|geh\\\xe9re|geh\\\xe9ren|geh\\\xe9rst|Geh\\\xe9rt|geh\\\xe9rten|geh\\\xe9rtf|geiiffnet|geilbt|geistesgestort|Gei\\\ufb02blatt|Gei\\\ufb02blattstaude|gekiisst|gekiisstl|gekijndigt|gekijsst|gekilsst|gekimpfl|gekimpft|geklautl|gekliirt|gekllrt|gekl\\\xe9rt|gekriint|gekrijmmt|GEKUHLTER|gekurzt|gek\\\xe9mpft|gelaufenl|gelegf|gelegtwurde|geliist|gelilftet|gelndert|Gelst|Geltungsbedurfnis|GELUBDE|Gel\\\xe9chter|gel\\\xe9hmt|gel\\\xe9ischt|Gel\\\xe9nde|gel\\\xe9nge|gel\\\xe9st|gem|gemafiregelt|Geme|gemfitliches|Gemiise|gemiitlich|Gemijlse|Gemilt|gemiltlicher|GemLise|Gemut|gem\\\xe9fi|Gem\\\xe9fk|gem\\\xe9ht|Gem\\\xe9ili|Gem\\\xe9lde|Gem\\\xe9lden|Genaul|genieBt|genief\\$en|Geniefien|geniefk|genielien|genielken|genie\\\ufb02en|genligen|genlligend|genlligt|genlllgend|genugt|genugte|georfef|gepfluckt|gepriifter|gepruft|Gep\\\xe9ck|gerfit|Geriichte|Geriite|Gerijcht|Gerllicht|gerllistet|gernhaben|gernntgt|ger\\\xe9it|Ger\\\xe9iusch|Ger\\\xe9t|Ger\\\xe9te|Ger\\\xe9tschaften|ger\\\xe9umt|Ger\\\xe9usch|Ger\\\xe9usche|ger\\\xe9uschvoll|geschafff|GESCHAFTSFUHRER|gescha\\\ufb02i|Geschfift|geschfimt|Geschift|Geschifte|Geschiftsleute|Geschiftswelt|geschiidigt|Geschiift|Geschiiftsleben|geschijtzten|Geschiltz|Geschiltze|Geschiltzrohre|Geschiltzturm|geschlijpftl|Geschllitzstellungen|geschnfiffelt|Geschtitz|Geschtltz|Geschutz|Geschutze|Geschwiir|Geschwllir|Geschwur|geschw\\\xe9cht|geschw\\\xe9ingert|Geschw\\\xe9tz|Gesch\\\xe9ft|Gesch\\\xe9fte|Gesch\\\xe9ftige|gesch\\\xe9ftlich|Gesch\\\xe9fts|Gesch\\\xe9ftsleben|Gesch\\\xe9ift|Gesch\\\xe9ifte|gesch\\\xe9iftsm\\\xe9ifiig|gesch\\\xe9itzt|gesch\\\xe9nolet|Gesch\\\ufb02tze|Gesetzeshiiter|Gesichtl|Gesichtsausdrijcke|Gesiiff|gesiindigt|gespiirt|Gesprach|GESPRACH|GESPRACHE|Gespr\\\xe9ch|Gespr\\\xe9che|Gespr\\\xe9iche|Gespr\\\xe9ichsthema|Gespur|gestiirt|gestijrzt|gestijtzte|gestof\\$en|gestolken|Gestriipp|Gestrijpp|GESTURZT|gest\\\xe9irt|Gest\\\xe9ndnis|gest\\\xe9rt|gest\\\ufb02rzt|Gesundheitsbehijrde|Gesundheitsftlrsorge|Ges\\\xe9fitaschel|Ges\\\xe9iffstaschenl|get6tet|Getiise|getiitet|getr\\'a\\'umt|getr\\\xe9umt|get\\\xe9tet|get\\\xe9tetf|get\\\xe9uscht|gev\\\xe9gelt|gew6hnt|GEWACHSHAUS|gewaltt\\\xe9tig|gewarnf|Gewerkschaftsfunktion\\\xe9ren|gewfinscht|Gewiasenskon\\\ufb02ikte|gewiihlt|gewiihnen|gewiihnlich|gewiihnlicher|gewiihnliches|gewiihnt|gewiinscht|gewijhnlichen|gewijnscht|gewissermafien|gewissermallsen|gewlllnscht|Gewohnheitstiter|gewtinscht|gewunscht|gewunschten|Gew\\\xe9chshaus|gew\\\xe9hlt|gew\\\xe9hnen|gew\\\xe9hnlicher|gew\\\xe9hnst|gew\\\xe9hnt|Gew\\\xe9hren|gew\\\xe9hrt|Gew\\\xe9isser|Gew\\\xe9ssern|gezfichtet|gezilndet|gez\\\xe9hlt|gez\\\xe9ihlt|gez\\\xe9ihmt|ge\\\xe9ndert|GF6l\\'1Z6fUf|Gfirtel|Gfirtner|Gfiste|Gfitter|Ghrchen|gibtjede|gibtk|gibts|gieBen|GieBkanne|gief\\$t|giefit|gielit|gignalton|giinstiger|Giire|Giite|giitiger|Giitter|Giittliche|giittlichen|Gijte|Gijtel|Gilrtel|Gilte|Giltiger|Gitarrenkl\\\xe9nge|Gite|GIUck|GIUCKliCl\\'1|GL\\'lte|Glaubwurdigkeit|Glaubwurdigkeitl|glaubw\\\ufb02rdig|glb|glbt|Gle\\/ch|gleichgiiltig|gleichm\\\xe9mig|Glfick|glficklich|Glfickspilz|Gliick|Gliickchen|gliicklich|gliicklicher|Gliicksbringer|Gliickssfr\\\xe9hne|Gliickwunsch|gliilcklich|Glijck|glijcklich|Glilck|glilcklich|Glilckwunsch|Glillck|gllinstig|gllinstigem|gllinstigen|glljcklich|glllicklich|glllickliche|Glllte|Glorifiziertl|glticklich|Gltickszahlen|gltlckliohes|Gluck|glucklich|gluckliche|GLUCKSELIGKEIT|Gluckwunsch|Gluok|gluoklich|Glupsch\\\xe9ugige|glutheilie|gl\\\xe9inzende|gl\\\xe9nzende|gl\\\xe9nzte|Gl\\\xe9ser|gl\\\xe9ubige|Gl\\\xe9ubigen|Gl\\\ufb02ck|Gl\\\ufb02cklich|Gl\\\ufb02ckstag|Gl\\\ufb02ckwilnsche|gnidig|Gnllnden|gn\\\xe9dig|gn\\\xe9dige|gn\\\xe9digen|Gn\\\xe9digste|gn\\\xe9idig|Goff|Golfballweili|gonnst|gottesfllirchtiger|Gottverdammt|Go\\\ufb02|Gr6Be|gr6Ber|gr6Bere|gr6Beren|Gr6Bte|Gr6Bten|gr6Bter|gr6Btes|gr6f\\$te|gr6f\\$ten|gr6f5ten|gr6I3ter|gr6ISten|Gr6l3e|gr6l3ter|Grabst\\\xe9tte|gratulierel|grClf\\$en|grfilieren|Grfiner|griil3e|griiliere|griiliten|griin|Griinde|Griinden|griindlich|Griine|griinen|Griiner|griin\\\xe9iugige|griin\\\xe9iugiges|grii\\\ufb02te|Grijbeln|griJBen|grijn|Grijnde|grijnden|grijndlich|grijnes|Grijnfutter|Grilbelt|grilfken|Grillh\\\xe9hnchen|Grilnde|Grilnden|grilndet|grilndlich|grilndlicherf|grilndlichl|grilne|Grilnschn\\\xe9bel|grim|Grime|grinco|Grllinde|grllinden|grllindlich|grlllnes|Gro\\/3artig|gro\\/3es|gro\\/3zUgig|Gro\\/Bstadt|gro\\/Ken|groB|groBartig|GroBe|GroBes|GroBmutter|GroBteil|groBziJgiger|grof\\$|grof\\$artig|grof\\$artigen|grof\\$e|grof\\$er|grof\\$es|grof3|grof3\\>artige|Grof3e|grof3en|grof3erAlien|grof5es|Grofbvaters|grofi|Grofiangriffs|Grofiartig|grofiartige|grofiartigen|grofiartiger|Grofiartiges|Grofibritannien|Grofidiebstahl|Grofie|grofier|grofies|grofiten|grofk|Grofkartig|grofke|Grofken|Grofker|Grofkvater|grofLe|grofler|groflsartig|groflsartige|Groflse|groflsen|Grofser|grol|grol\\'3\\>en|grol2\\>|grol2\\>en|grol3\\>es|grol3e|grol3er|Grol3raum|groli|Groliartig|groliartige|groliartigen|grolie|grolien|groliherzig|Grolimutter|Grolisegel|Grolkvater|groller|Grollser|grollzugig|grolS|grolSe|GrolSeltern|grolSer|GrolSvater|grolZ\\~|gror\\$er|grorker|grosses|GROSSTE|gro\\\ufb02|gro\\\ufb02e|Gro\\\ufb02stadtkind|Gro\\\ufb02vater|Grtin|Grtmde|GruB|Grubenausg\\\xe9nge|Gruf\\$|grUf\\$en|grufit|Gruli|Grulikarte|Grulikarten|Grun|grundlich|Grundstiick|grunds\\\xe9tzlich|grune|grunen|Gr\\\xe9ben|gr\\\xe9bst|gr\\\xe9fier|gr\\\xe9fkte|gr\\\xe9flserer|Gr\\\xe9ifite|gr\\\xe9illten|gr\\\xe9sslich|Gr\\\xe9uel|gr\\\ufb02ndlich|gr\\\ufb02ne|gull|Gummist\\\xe9psel|Gumml|GUNSTIGSTEN|Gurtell|gutaussehend|gutaussehender|GUte|gutgebaut|gutgehen|Gutmijtigkeit|g\\\xe9be|g\\\xe9ben|g\\\xe9ibe|G\\\xe9ittern|G\\\xe9lisch|G\\\xe9lische|g\\\xe9lisches|G\\\xe9nsehaut|G\\\xe9nsen|G\\\xe9nze|G\\\xe9rfen|G\\\xe9rtnern|G\\\xe9ste|G\\\xe9stezimmer|G\\\xe9tter|G\\\xe9tterspeise|G\\\xe9ttin|G\\\xe9ttliche|g\\\xe9ttlichen|G\\\xe9tze|G\\\u20acfUhl6|G\\\u20acStFUpp|h\\<\\'\\>\\'r\\'t|h\\<\\'5r|h\\'a\\'lt|H\\'a\\'nde|H\\'a\\'nden|H\\'a\\'ttest|H\\/|H\\/er|h\\/nfer|h5tte|H6fe|h6flich|H6fling|H6hen|h6her|h6here|H6HERER|H6hle|H6l1e|H6lle|H6llen|h6lte|H6r|h6re|h6ren|H6rer|H6rner|h6rst|h6rt|h6rte|Ha\\/s|Haarbijrstel|Haarhfirste|Haarl|Haarstr\\\xe9hne|hab\\'jemanden|Hah|halbstlllndiges|halbvervvandelt|halfef|Hallfjchen|hallol|Halsb\\\xe9nder|Halsl|haltenl|Haltjohnny|Hammersch\\\xe9del|Handfl\\\xe9che|Handlungsstr\\\xe9nge|harfe|hartn\\\xe9ickig|Hasenful|Hasenfull|hassq|Hastja|hatjetzt|hatta|Haupfbus|Hauptaktion\\\xe9ire|Hauptaktion\\\xe9irinnen|Hauptkabell|haupts\\\xe9chlich|haupts\\\xe9ichlich|Haupttrib\\\ufb02ne|Hauptverschwiirer|Hauptwasserrohrwar|Hausfirzte|Haush\\\xe9lterin|Hausschlilssel|Haustilr|Hausubervvachung|ha\\\xdft|Hbr|hc\\'5ren|hc\\'\\\xa7r|hdchsfens|Hdchstleistung|hdher|Hdlle|Hdllenfeuer|hdre|hdren|hdrsf|hdrten|He\\/nr\\/ch|hedeutest|hegrfille|heiB|heiBe|heiBen|HeiBer|heiBes|heiBt|heif\\$|heif\\$e|heif\\$es|Heif\\$t|heif3\\>en|heif3t|heif5en|heifie|heifiem|heifien|heifit|heifkt|heifLt|heifZ\\>e|heil\\'\\$|heil\\'\\$en|heil\\'\\$t|heil\\'Se|heil2\\>en|heil2\\>t|heil3en|heil3t|heil5e|heil5t|heili|heilies|heilit|heillst|heilZ\\~|heir\\$|heisst|Helllger|Helzlichen|Hen\\'je|herabstofien|heransttlrmtet|heraush\\\xe9ngendem|herhfiren|herh\\\xe9ren|heriiber|HerrSchmidt|herumf\\\xe9hrt|herumkehren|herumlluft|herumzuwijhlen|Herzrhythmusst\\\xe9rungen|Herzschlielierei|Herzstlllck|Heuta|Hexenhtltte|HeY\\\xb7|Hfibscheste|hfiherer|hfihsch|Hfilfte|Hfille|hfilt|hfiltst|Hfin|hfipft|Hfir|hfiren|hfirst|hfirt|hfitte|hfitten|hie\\/3|hieB|hiefL|hiel3|hiells|hierhergereist|hierherzuriick|hierijber|hierjede|hierjeder|hierl|hierL|hierwar|hierzum|hie\\\ufb02|Hiibsch|Hiibsche|Hiibscher|hiibschl|hiichst|hiichstens|hiichster|hiichstpersiinlich|Hiifen|hiifischen|Hiifling|Hiigel|Hiihe|Hiihepunkt|hiiher|hiihere|Hiihlen|Hiihnchen|Hiihner|Hiihnerkl\\\xe9fkchen|Hiilfte|Hiille|Hiillenstreitmacht|hiillischen|hiipfen|Hiir|hiire|Hiiren|Hiirer|Hiiret|Hiirjetzt|Hiirt|hiirte|hiirtest|Hiissliches|Hiite|Hiiten|hiitet|Hiitte|hiitten|Hiitten|hijbsch|hijbschen|hijbsches|Hijfte|Hijften|Hijgel|Hijgels|Hijpfburgl|hijpfe|hijpfen|hijre|Hijren|Hijrer|hilbsch|hilbsche|hilbschen|hilbscher|Hilfel|HILFSPERSONALI|Hilgel|hillig|Hilt|hil\\\ufb02|Him|Himmell|hineintr\\\xe9umen|hinfijhrt|hingefiihrt|hingehdren|hingehiiren|hinilber|hinreiliend|hinschmeifit|HintenN\\\xe4ldler|Hintergrundl\\\xe9rm|hinterhfiltig|hinterh\\\xe9iltiger|Hinterh\\\xe9iltigl|hinterh\\\xe9ltige|hinterh\\\xe9ltiger|Hinterk\\\xe9pfen|hinterlieBe|hinterl\\\xe9sst|Hintersttlbchen|Hintertur|hinwollen|hinzufuhren|hinzuf\\\ufb02gten|Hirnrnel|hirteste|hisslich|Hi\\\xe9tte|Hler|hler|hllf|hllibsch|Hllindinnen|Hlllpf|hln|Hlnbllck|hltte|Hltten|Hochfrequenzst\\\xe9rungenl|hochl|Hochsicherheitsgef\\\xe9ngnis|Hochstens|Hochzeitskostiime|Hohek|Hohepunkt|hohere|HoHo|Holle|Holzsttlck|hor|Horen|Hosenscheifker|Hosenscheiiker|Hosenschei\\\ufb02er|Hotelg\\\xe9ste|HQHE|htibscher|Htihnchen|Htipfen|Htipfenl|htiren|hubsch|hubsche|hubschen|Hubscher|hubscheres|Hubsches|Huhner|humon\\/oll|Hundchen|Hundebullel|Hunden\\\xe9pfe|Hundescheilie|Hundl|HUNG|hunte|Hurensiihne|Hurensohnl|Huterin|HUtte|Hypoglyk\\\xe9mie|h\\\xe9|H\\\xe9chste|h\\\xe9chsten|H\\\xe9chstens|H\\\xe9chstpers\\\xe9nlich|H\\\xe9fen|h\\\xe9flich|H\\\xe9ftling|H\\\xe9ftlinge|H\\\xe9ftlingsr\\\xe9te|H\\\xe9hef|H\\\xe9hepunkt|h\\\xe9her|h\\\xe9heren|H\\\xe9i|H\\\xe9ifen|H\\\xe9ilften|h\\\xe9iltst|H\\\xe9inde|h\\\xe9ing|h\\\xe9ingen|h\\\xe9ingt|h\\\xe9ir|h\\\xe9irter|h\\\xe9itt|H\\\xe9itte|h\\\xe9itten|h\\\xe9ittest|h\\\xe9iufig|H\\\xe9lfte|H\\\xe9lle|H\\\xe9llen|H\\\xe9llenloch|h\\\xe9llisch|h\\\xe9llische|h\\\xe9lt|H\\\xe9ltst|h\\\xe9lzernes|h\\\xe9misch|H\\\xe9mmer|h\\\xe9mmernde|H\\\xe9moglobin|H\\\xe9morrhoiden|H\\\xe9ndchen|H\\\xe9nde|H\\\xe9ndedruck|H\\\xe9nden|H\\\xe9ndlerin|h\\\xe9ng|h\\\xe9ngen|h\\\xe9ngend|h\\\xe9ngst|h\\\xe9ngt|H\\\xe9r|h\\\xe9re|h\\\xe9ren|H\\\xe9rgesch\\\xe9idigte|h\\\xe9rst|h\\\xe9rt|h\\\xe9rte|h\\\xe9rten|h\\\xe9rter|H\\\xe9rzu|H\\\xe9schen|h\\\xe9sslich|h\\\xe9sslicher|h\\\xe9sslichl|h\\\xe9sslichste|h\\\xe9tt|H\\\xe9tte|h\\\xe9tten|h\\\xe9tten\\'s|h\\\xe9ttest|H\\\xe9ttet|H\\\xe9ufi|h\\\xe9ufig|h\\\xe9ufiger|H\\\xe9ufigkeit|h\\\xe9ufigsten|H\\\xe9user|H\\\xe9usern|h\\\xe9ute|H\\\u20acY|H\\\ufb02geln|i\\'\\\xa7ffne|I\\/egen|I5sst|I5stern|I6sen|Ia\\\xdf|Ia\\\xdft|Icll|identifizieet|IDENTITAT|IE|Iebendigl|Iebenslinglich|Iebtjetzt|Ieck|Iehn|Ieid\\\u201a|Ieinenlose|Ienistische|Ietztendlich|Ifigt|Ihrdllirft|ihrja|ihrjemals|ihrjetzt|ihrjeweiliges|ihrVater|ihrvorstrafenregister|ihrwahres|Ihrwerdet|ihrzwei|iibel|iibemehmen|iiber|iiberall|iiberallhin|iiberdauern|iiberdauerte|iibereinstimmte|iiberfallen|iiberfiel|iibergeben|iiberhaupt|iiberhiirt|iiberholt|iiberholter|iiberkam|iiberlassen|iiberleben|iiberlebt|iiberlegen|iiberlegten|iibernahmen|iibernehme|iibernehmen|iibernimmt|iibernommen|iiberpriife|iiberpriifen|iiberpriift|iiberpriiften|iiberqueren|iiberragen|iiberrascht|iiberraschte|iiberreden|iiberschritten|iibersetzen|iibersetzt|iibersteigt|iibertragen|iibertreffen|iibertreib|iibertreiben|iibertrieben|iiberzeugen|iiberzeugt|iiblich|iibliche|iibrig|IieB|Iiebte|Iief\\'s|Iiehe|Iie\\\ufb02est|iiffentlichen|iiffentliches|iiffnest|iifter|iihnllchkelt|Iisst|ijbel|ijben|ijberall|ijberhaupt|ijberlegene|ijbernehme|ijbernimmst|ijberprijfen|ijberreden|ijbertrage|ijberwunden|ijberzeugen|ijberzogen|Il6her|IleiB|Ill|Illfie|Ilrger|Ilufierste|immerja|immerjung|immerweinen|immerw\\\xe4hrende|immerw\\\xe9hrende|Improvisiation|Impulswellengeschutz|INBRUNSTIGE|instfindig|intramuskul\\\xe9r|INVASIONSFLOTFE|Iosgeliist|Iosgel\\\xe9st|Ioszuliisen|ip|irn|irrefuhren|irrefuhrende|istja|istjedoch|istjemand|istjetzt|istJohnny|istjung|istweg|ITIUSSEFI|ITIUSSGI7|ITTITTRZ|Ivl\\\xe9gliche|I\\\xe9cheln|I\\\xe9cherlich|I\\\xe9cherlichen|I\\\xe9hmt|I\\\xe9iuft|I\\\xe9nger|I\\\xe9sst|I\\\xe9sste|I\\\xe9uft|J0Shua|Jackettkaufen|jahr|jahre|jahren|JAHRIGE|jal|jemandenl|jetztl|jiidisch|Jiingem|jiingerwar|Jiingste|jilnger|Jlllngling|job|Jogglng|john|johnny|journalisten|Jullo|JUNGFRAULICHE|jungfr\\\xe9uliche|jungfr\\\xe9ulichen|jungfr\\\xe9ulicher|Jungfr\\\xe9ulichkeit|Jungsl|Jungste|Jurlgs|Justitzministeriums|J\\\xe9ger|J\\\xe9hrige|j\\\xe9hrigen|j\\\xe9hriger|j\\\xe9hrlich|J\\\xe9iger|j\\\xe9ihrigen|j\\\xe9mmerlich|k\\'a\\'mpfen|K\\/no|K\\/Varte|K\\/Velle|K5NIGIN|K6der|K6ln|K6nig|K6nige|K6nigin|k6nnen|k6nnen\\'s|k6nnest|k6nnt|K6nnte|k6nnte\\'s|k6nnten|k6nntest|K6pfe|K6rper|K6rpers|K6stlich|Kabelm\\\xe9nner|kalf|kaltblijtig|kampfen|Kampfj\\\xe9ger|Kanarienviigeln|kann\\'sja|kannstja|Kan\\\xe9len|Kapitan|Kapitln|Kapitlnen|Kapitlns|Kapit\\\xe9in|Kapit\\\xe9inleutnant|Kapit\\\xe9ins|Kapit\\\xe9n|Kapit\\\xe9nleutnant|Kapit\\\xe9ns|Kapt\\'n|kaputthaust|Kartoffelsch\\\xe9len|Kassettenger\\\xe9it|kbnnen|kbnnten|kdnnen|kdnnfe|kdnnte|ke\\/ne|Kefn|Keh\\/1|Keithl|keln|kelne|Keri|kfime|Kfimmer|kfimmere|kfimmern|kfimmert|kfimpft|kfimpften|Kfinig|Kfinnen|kfinnte|Kfinnten|Kfinntest|Kfiss|Kfisschen|Kfissen|Kfjnnte|Khnlichkeit|KIar|Kifig|Kiiche|Kiichenhelfer|Kiichln|Kiihe|Kiihlbox|kiihler|Kiihlschrank|kiimmem|kiimmer|kiimmere|Kiimmern|kiindigen|Kiinig|Kiinige|Kiinigen|Kiinigin|Kiiniginnen|kiinigliche|kiiniglichen|kiiniglicher|Kiinigreichs|Kiinigs|Kiinigtum|kiinne|kiinnen|kiinnt|Kiinnte|kiinnten|kiinntest|kiinntet|Kiinstler|kiinstlerischen|kiipfen|Kiirper|Kiirperfunktionen|Kiirperhaltung|kiirperliche|Kiirperliches|Kiirpersprache|Kiirperverletzung|kiirzen|kiirzerzutreten|kiirzeste|Kiisschen|Kiissen|Kiisst|Kiiste|kiistlich|Kijche|Kijhlschrank|Kijmmere|kijmmern|kijmmernl|kijmmerst|kijmmerten|kijndigt|kijnnen|kijnnt|kijnnte|kijnnten|Kijnstler|Kijrbis|kijrzlich|kijrzliche|Kijrzungen|kijsst|Kijste|Kilche|Kilchlein|kilhlen|kilhler|Kilhlkreislauf|Kilhlschrank|Kilmmern|Kilmmert|kilndigen|kilnstliche|kilss|kilsse|kilssen|Kinderm\\\xe9dchen|Kinderspiell|Kindsk\\\xe9pfe|kiokflip|KIotz|KL\\'lr|KL\\'lste|Klapsmiihle|Klassem\\\xe9dchen|kle\\/ne|Kleidergr6Be|Kleidergrfilie|Kleinerl|kleinwiichsige|kleinwilchsiges|klijger|klijgsten|klilger|kLinft\\'gen|klirst|kljmmere|Kllirze|kllissen|Klliste|Klllche|klllhnsten|kllllger|Klobtlrsten|klop\\\ufb02l|Klpt\\'n|Klpt\\'nl|Klpt\\'ns|Klse|Klseschnuffelei|Kltigste|Klugschei\\\ufb02er|kl\\\xe9ffen|Kl\\\xe9iren|Kl\\\xe9ranlage|Kl\\\xe9re|kl\\\xe9ren|Kn6pf|Knallttite|Knastwill|Knderung|Knochengrfinde|Knofen|Knuller|Knupf|Knupfe|knupfen|knzjipfe|Kn\\\xe9dell|kn\\\xe9pf|Kn\\\xe9pfe|Kn\\\xe9sten|Kofferraumschliissel|Kohlens\\\xe9ure|Komaf\\\xe9lle|Komaf\\\xe9llen|Kombiise|Kombuse|Komiidie|kommerz\\/ellen|kommjetzt|Kompatibilitfits|Kompatibilit\\\xe9its|Kompatiblit5ts|Kom\\\xe9die|KONIGIN|konne|konnen|konnt|konsen\\/ativ|Kopfabreifimann|Kopfgeldj\\\xe9ger|Kopfgeldj\\\xe9gern|Kopfm\\\xe9fiig|Kopfnijsse|kostengtlnstige|Kostiim|Kostiimdesigner|Kostiimdesignerin|Kostiimdrama|Kostiime|Kostiims|Kostume|Kost\\\ufb02m|kr\\/egen|kr6ne|kr6nen|Kr6ten|Krafte|Kraftwfirfel|Kranf\\\ufb02hrer|Kreativit\\\xe9t|Kreuzverhor|krfiftiger|Krfiutertee|Kriegserkl\\\xe9rungen|Kriegsfuhrung|Kriegsschauplatze|Kriifte|Kriinung|Kriinungsfeier|Krijppel|Krijte|Kronjuwell|KROTE|Krsche|Kr\\\xe9fte|Kr\\\xe9ften|Kr\\\xe9ftigsten|Kr\\\xe9he|kr\\\xe9ht|kr\\\xe9ichzt|Kr\\\xe9ifte|Kr\\\xe9iutertee|Kr\\\xe9mpfe|kr\\\xe9nte|Kr\\\xe9te|Kr\\\xe9tes|Kr\\\xe9utern|Kr\\\xe9utersenf|Ktiche|Ktinige|ktinntest|Ktisschen|ktlmmere|ktznnen|Kuche|KUCHE|Kuckucksger\\\xe9usch|KUl\\'ZSCl\\'1lUSS9|kulz|kummer|Kummere|kummern|kummert|Kumpell|Kunststficke|Kunststticke|Kuriosit\\\xe9ten|kurzeste|kurzte|Kurzwellenfunkger\\\xe9te|Kurzzeitgediichtnis|Kurzzeitged\\\xe9chtnis|KUS1I\\\u20ac|Kuschelhengstl|KUSSE|KUSSGH|kusste|KUSTE|Kuste|K\\\xe9fer|K\\\xe9fig|k\\\xe9ime|k\\\xe9impfen|k\\\xe9impfend|k\\\xe9impft|k\\\xe9impfte|k\\\xe9impften|k\\\xe9impftest|k\\\xe9impfwie|K\\\xe9inguru|k\\\xe9innen|k\\\xe9innte|K\\\xe9irper|K\\\xe9ise|K\\\xe9isebrunnen|K\\\xe9lte|k\\\xe9lter|k\\\xe9lteste|k\\\xe9me|k\\\xe9men|k\\\xe9mpfe|K\\\xe9mpfen|K\\\xe9mpfer|k\\\xe9mpferische|k\\\xe9mpfst|k\\\xe9mpft|k\\\xe9mpfte|k\\\xe9mpften|k\\\xe9mt|K\\\xe9nig|K\\\xe9nige|K\\\xe9nigin|K\\\xe9niginl|K\\\xe9niginnen|k\\\xe9niglich|k\\\xe9nigliche|k\\\xe9niglichen|k\\\xe9nigliches|K\\\xe9nigreich|K\\\xe9nigreichs|K\\\xe9nigs|K\\\xe9nigsfamilie|k\\\xe9nne|k\\\xe9nnen|k\\\xe9nnt|k\\\xe9nnte|K\\\xe9nnten|K\\\xe9nntest|K\\\xe9nntet|K\\\xe9pfchen|K\\\xe9pfe|K\\\xe9pfen|k\\\xe9pft|K\\\xe9pt\\'n|K\\\xe9rbchen|K\\\xe9rbchengr\\\xe9fie|K\\\xe9rben|K\\\xe9rper|K\\\xe9rperfunktionen|k\\\xe9rperlich|k\\\xe9rperliche|K\\\xe9rperproportionen|K\\\xe9rpersprache|K\\\xe9rpertyp|K\\\xe9rperverletzung|K\\\xe9rper\\\xe9ffnungen|K\\\xe9se|K\\\xe9sebrett|K\\\xe9secracker|k\\\xe9stlich|K\\\xe9ter|K\\\xe9tern|K\\\ufb02mmere|k\\\ufb02mmern|L\\'a\\'cherlich|L\\'a\\'ndern|l\\'a\\'sst|l\\'a\\'uft|l\\/chtes|l\\/Vings|L5cheln|L6ffel|L6schen|L6se|l6sen|L6wen|L6win|LADIESMANZ17|Landh\\\xe9user|Landstra\\\ufb02e|Lands\\\xe9iugetier|langl|langweiligl|Lasergestutzte|Laserzielger\\\xe9t|Lattenzaunwei\\\ufb02|Laudal|laufl|Lau\\\ufb02|La\\\xdf|lch|ldee|ldeen|ldelia|ldentifikation|ldentifikationsnummer|ldentifikationssignal|ldentifizierung|ldentit\\'a\\'tsscheibe|ldioten|ldloten|Le\\/d|Lebenl|lebensf\\\xe9hig|lebensl\\\xe9nglich|lebensmijlde|Lebersch\\\xe9den|leergegessen|legend\\\xe9re|legend\\\xe9ren|Legion\\\xe9r|Legion\\\xe9re|Lehe|Leichensch\\\xe9ndung|leichtjemanden|leidl|Leistuljg|Lelbwfichter|Leld|lemen|Lenks\\\xe9ule|lfidt|lfigt|lfinger|lfiuft|Lfiuterung|lgitt|lgnorier|lhm|lhn|lhnen|lhnenl|lhr|lhre|lhrem|lhren|lhrer|lhrerverffigung|lhres|lhrfehlt|lhrjemalsjemanden|lhrVerteidiger|Libel|Libelwollen|Liben|Liber|Liberall|Liberdenken|Liberdrllissig|Liberfallen|Libergebrannt|Liberhaupt|Liberlasst|Liberleben|Liberlegen|Liberlegt|Libernimmt|Liberpriift|Liberreden|Libersteht|Liberstllirzen|Liberwachen|Liberwacht|Liberwinden|Liberw\\\xe9ltigen|Liberw\\\xe9ltigt|Liberzeugt|Lible|Liblich|Libliche|Librig|lie\\/3|lie\\/Se|lieB|lieBe|liebenswilrdig|liebenswurdiger|Liebesgestiindnis|Lieblingsbesch\\\xe9ftigung|Lieblingsrockerl|Lieblingss\\\xe9tze|lief2\\>en|Liefergebiihren|lieflsen|liegenlassen|Liehe|lieli|lielien|Liellen|liells|lien|Liicher|Liige|Liigner|liinger|liischen|liischt|Liisst|liist|Liisung|Liisungen|Liiwen|Lii\\\ufb02ung|lijgen|Lijgner|Lilgner|lilgst|lilgt|Lilterer|LIMOUSINENSERVICE10I06|linger|lke\\'s|lkone|lL\\'lgt|Llberstehen|Llebe|llebt|lllfie|lllfillensstark|lllfillie\\'s|lllfir|Lllignerl|llligtl|lllusionen|llngst|llztlicher|lm|lmbiss|lmmer|lmmigranten|lmpuls|lmpulsantrieb|lndianer|lndianerin|lndianerm\\\xe9dchen|lndianertanz|lndikation|lndividualit\\\xe9t|lndividuen|lndividuum|lnduktion|lneffizienz|lnformationen|lnfos|lngenieur|lngenieure|lnhalt|lnhalte|lnnenraum|lnnenr\\\xe9ume|lnsekt|lnsekten|lnsel|lnserat|lnspektion|lnstinkt|lnstinkte|lnstitut|lnstrumente|lnstrumentenwagen|lnsubordination|lntellektuellste|lntelligenz|lntensivstation|lnteraktion|lnteresse|lnteressen|lnternat|lntrigantin|lntrigantl|lntrigen|lnverness|lnvestition|lnvestoren|lnzucht|lo|Lordk\\\xe9mmerer|losf|losl|losw\\\ufb02rde|Lou\\/e|Loyalit\\\xe9t|lrak|lraner|lren|Lrgendetvvas|lrland|lronhide|lronie|lrre|lrren|lrrenanstalt|lrrenhaus|lrrer|lrrgarten|lrrlicht|lrrlichter|lrrsinn|lrrsinns|lrrtum|lscandar|lscandars|lsolierband|lss|lstja|ltaker|ltakerflossen|ltalo|Ltiffel|ltlgen|Lufijagen|Luftballonsl|Luftjagen|Luftunterst\\\ufb02tzung|LUgen|lvl\\\xe9idchen|lwan|l\\\xa7uft\\'s|L\\\xe9chelmfinderl|l\\\xe9cheln|l\\\xe9chelt|L\\\xe9cher|L\\\xe9cherlich|l\\\xe9cherliches|L\\\xe9chle|l\\\xe9dt|L\\\xe9ffel|l\\\xe9ge|L\\\xe9icheln|L\\\xe9icherlich|l\\\xe9ichle|L\\\xe9indchen|l\\\xe9ingst|l\\\xe9isen|l\\\xe9issig|l\\\xe9isst|L\\\xe9iuft|L\\\xe9jsung|L\\\xe9mmchen|L\\\xe9mmer|L\\\xe9nder|L\\\xe9ndern|L\\\xe9nge|L\\\xe9ngen|l\\\xe9nger|l\\\xe9ngst|l\\\xe9ngste|L\\\xe9rm|L\\\xe9rmbeschwerden|l\\\xe9schen|L\\\xe9se|L\\\xe9segeld|l\\\xe9sst|l\\\xe9st|l\\\xe9ste|l\\\xe9sten|l\\\xe9stig|L\\\xe9sung|l\\\xe9ufig|l\\\xe9ufst|L\\\xe9uft|l\\\xe9uten|l\\\xe9utet|L\\\xe9we|L\\\ufb02gner|M\\'a\\'dchen|m\\/ese|M\\/ffsommernachfsfraum|M\\/r|M0I8KUI|m6belt|m6chte|m6chtest|m6gen|m6glich|m6glichen|m6glicher|m6gt|M6rder|MaB|MaBgabe|mac\\/1e|mac\\/7|machs|Machtiibernahme|madenschw\\\xe9inziger|Mafinahme|Magengeschwiire|Magengeschwilr|Magengeschwtir|Magnolienbliiten|Majesfait|Majest\\\xe9it|Majest\\\xe9t|Majest\\\xe9ten|Mal2\\>en|Mal3en|malf|Malinahme|mall|Mallregelten|Mandverstation|Manfiver|Maniiver|Manikfire|Mannscha\\\ufb02|Mansclle\\\ufb02\\'enkm\\'5pfe|Man\\\xe9iver|Man\\\xe9ver|man\\\xe9vrieren|man\\\xe9vrierf\\\xe9hig|Man\\\xe9vriermodus|Margoliserklfirung|Margoliserkl\\\xe9rung|marsch\\\xe9hnliche|Massagestllihlen|Massenzerst\\\xe9rung|Massenzerst\\\xe9rungswaffen|Mater\\/al|Maxiriicke|Mayonaise|mbglichst|Mdge|mdglichen\\/veise|mdglicherweise|Mdglichkeit|me\\/n|mehrZeit|mein\\'ja|meinerjetzigen|Meinungs\\\xe9ufierung|Meisterbr\\\xe9u|Meisterstijck|meistgehasste|meln|melne|Mend|Menschenh\\\xe9indler|Menstruationsst\\\xe9rungen|Merkwiirdig|Merkwiirdige|merkwiirdiger|merkwilrdig|merkwlllrdige|merkwurdig|merkwurolig|merkw\\\ufb02rdig|Messger\\\xe9t|mfichte|Mfichten|Mfidchen|Mfidchenl|Mfidels|mfigen|Mfigliche|mfiglichen|mfiglicherweise|Mfill|Mfillhalde|Mfinchen|Mfinder|Mfinnern|Mfissen|mfisst|mfisste|Mfjrder|Midchen|Migrane|Migr\\\xe9ne|Migr\\\ufb02ne|miichte|Miichtegern|Miichten|miichtest|miide|Miidels|miides|miige|miigen|miiglich|miigliche|miiglichen|miigliches|Miiglichkeit|Miiglichkeiten|miigt|Miill|Miillhalde|Miilltonnen|miilssen|miirderisch|miisse|Miissen|miisst|miisste|Miiuse|mijchte|Mijcken|Mijhe|Mijnzen|mijssen|mijsst|mijsste|mijsstest|Milchstrafie|Milhe|Milhle|MILITAR|Militiirprogramme|Militir|militlrische|Milit\\\xe9irkodex|Milit\\\xe9r|Milit\\\xe9rakademie|Milit\\\xe9rdienst|milit\\\xe9rischen|Milit\\\xe9rkodex|Milit\\\xe9rluftraum|Milit\\\xe9rnetzwerk|Milit\\\xe9rs|Milit\\\xe9rsystem|Millbilligung|Millefs|Millgeburt|Milliard\\\xe9iren|Million\\\xe9rssohn|Milli\\\xe9quivalent|Millltonne|millverstanden|milssen|milsst|milsste|milssten|Miltter|Minenraumen|Miniriicke|mirglauben|mirja|mirje|mirjeglichen|mirjemals|mirjemand|mirjetzt|mirso|mirvon|mirzu|Miserabell|missf\\\xe9llt|Missverstfindnisl|Missverstiindnis|Missverst\\\xe9ndnis|Missverst\\\xe9ndnissen|Mistkerlel|Mistkiiter|Miststiick|Mistst\\\ufb02cke|Mitbijrger|Mitbilrger|mitfiihlend|mitfiihlender|mitfuhlend|Mitgefiihl|Mitgefuhl|mitgehiirt|mitgez\\\xe9hlt|mitjedem|mitjemandem|mittlen\\/veile|ML\\'1nze|mlch|Mldchen|mLissen|Mljnder|Mllillschlucker|Mllindel|Mllindung|mllissen|mllisst|Mlllhe|Mllllon|Mllllonen|mlllsst|Mllltterjedoch|Mlnnern|mlr|mlrl|mlt|moglich|Moglichkeit|Moglichkeiten|Molekijle|MolekL\\'lle|Mondeinhiirner|Mondeinhiirnerl|Mondeinh\\\xe9irner|Mondk\\\xe9ilber|Monl|MONTONEI|Mordsiiberraschung|Mordverd\\\xe9chtiger|Morsealphabetl|Motorger\\\xe9usch|Motorger\\\xe9usche|Mousset\\\ufb02e\\'s|Mowen|Mtihe|Mtillschlucker|mtissen|mtissenl|Mtitzel|mtlde|mtlsste|muBt|Mucken|mucksm\\\xe9uschenstill|mude|Muhe|MUII|mull|MULL|mullte|Mundl|Mundung|Munzfernsprecher|Muskatnijsse|Muskelkumpelsl|muskul\\\xe9ren|mussen|MUSSEN|mUssen\\'s|muss\\_\\'\\\xa7e|Musterschuler|Mutterja|mutterlich|Mutze|mu\\\xdf|mu\\\xdft|mu\\\xdfte|mx\\'t|Mzlinnern|M\\\xe9bel|m\\\xe9cht|M\\\xe9chte|m\\\xe9chte|M\\\xe9chtegern|m\\\xe9chten|m\\\xe9chtest|m\\\xe9chtet|m\\\xe9chtig|m\\\xe9chtige|m\\\xe9chtigen|m\\\xe9chtiger|m\\\xe9chtiges|m\\\xe9chtigste|m\\\xe9chtigsten|M\\\xe9dchen|M\\\xe9dchenh\\\xe9nden|M\\\xe9dchens|M\\\xe9del|M\\\xe9dels|M\\\xe9delsl|M\\\xe9fiigung|m\\\xe9ge|M\\\xe9gen|M\\\xe9glich|m\\\xe9gliche|M\\\xe9glichen|M\\\xe9gliches|M\\\xe9glichkeit|M\\\xe9glichkeiten|m\\\xe9glichst|m\\\xe9gt|m\\\xe9ichtig|m\\\xe9ichtige|m\\\xe9ichtigen|m\\\xe9ichtiger|M\\\xe9idchen|M\\\xe9idel|M\\\xe9inner|M\\\xe9innl|m\\\xe9innlicher|M\\\xe9irder|M\\\xe9irz|M\\\xe9nnchen|M\\\xe9nnchens|M\\\xe9nner|M\\\xe9nnerfreundschaft|M\\\xe9nnern|M\\\xe9nnersache|m\\\xe9nnlich|m\\\xe9nnliche|M\\\xe9ntel|M\\\xe9olel|M\\\xe9olels|M\\\xe9rchen|M\\\xe9rchenl|M\\\xe9rchenprinzen|M\\\xe9rder|M\\\xe9rtyrer|M\\\xe9rz|M\\\xe9tresse|M\\\xe9uschen|M\\\xe9use|M\\\xe9usehtipfer|M\\\xe9usen|M\\\xe9userennen|m\\\xfc\\\xdft|m\\\ufb02de|m\\\ufb02ssen|n\\'a\\'chste|n\\'a\\'hert|n\\/chfs|n\\/chi|N\\/ck|n\\/e|N6|n6tig|nac\\/1|Nachf|nachllssig|nachl\\\xe9ssig|nachl\\\xe9sst|nachprufen|Nachschlussel|Nachste|NAHERT|NAHERTE|Nat\\/on|natfirlich|Natiilrlich|Natiirlich|Natiirllch|natijrlich|natijrlichen|natilrlich|natilrliche|natL\\'lrlich|Natllirlich|Nattirlich|Nattlrlich|Nattlrliohl|Naturlich|naturlich|naturlichen|naturlichsten|Navajoweifi|ndtige|ne\\/n|Nebengeb\\\xe9ude|Nebengesch\\\xe9ift|neffes|Nehmf|neinl|Neln|nerv6s|Nervens\\\xe9ge|Nervens\\\xe9ige|nerviis|Nerv\\\xe9s|ner\\\\\\/t|Neuankiimmlinge|neuromuskul\\\xe9ren|Neuzug\\\xe9inge|Nfichster|NIANN|nichsten|nichtim|nichtjemand|Nichtjetzt|Nichtsl|nichtzurilckgelassen|nic\\_l\\_1t|niederk\\\xe9mpfen|niederliells|niedlichl|niher|niichsten|niichstes|niirgeln|niitig|niitige|Nijssen|Nijsternl|nijtzlich|nilchtern|niltzen|Nlagnaten|Nlannern|nlchste|nlchsthoheren|nlcht|nle|Nlemalsl|Nlhe|nlir|nllitzen|Nl\\\xe9inner|noc\\/1|Not\\/\\'all|Notfalll|notig|notigen|Notliige|Notziindung|NUFI|Nunja|Nurdich|nureins|nurflustern|Nurjetzt|nurl|nurwunscht|Nurzu|nus|NUSSS|nutzlich|Nx\\'emand|N\\\xe9chste|n\\\xe9chsten|N\\\xe9chster|n\\\xe9chstes|N\\\xe9chte|N\\\xe9chten|n\\\xe9chtlichen|N\\\xe9gel|N\\\xe9h|N\\\xe9he|n\\\xe9henf|n\\\xe9her|n\\\xe9here|N\\\xe9hern|n\\\xe9hernde|n\\\xe9hert|n\\\xe9herte|n\\\xe9hren|n\\\xe9ht|N\\\xe9hten|N\\\xe9ichste|n\\\xe9ichsten|N\\\xe9ichstes|N\\\xe9ihe|n\\\xe9iher|n\\\xe9ihern|n\\\xe9ihert|N\\\xe9ihten|n\\\xe9imlich|n\\\xe9mlich|N\\\xe9pfe|n\\\xe9rdlich|n\\\xe9rgelnde|N\\\xe9rrin|N\\\xe9schen|n\\\xe9tig|n\\\xe9tige|n\\\xe9tiges|O8|obdachlosl|Obefil\\\xe9iche|OBERFLACHENSCHWERKRAFT|Oberfl\\\xe9che|Oberfl\\\xe9chen|oberfl\\\xe9chlich|oberfl\\\xe9chliche|Oberm\\\xe9inner|Ober\\\ufb02fiche|of\\/\\'en|Offenslchtllch|Offentliches|Offentlichkeit|Offne|Offnen|Offnet|ofi|Ofiiziere|Ofiiziers|Oftweg|Of\\\ufb02cer|Ohnejede|ohnm\\\xe9chtig|ohnm\\\xe9ichtig|OI|olas|oles|Oltanks|OO|Orgelt\\\xe9ne|ORTI|Ortl|Ostfltlgel|Paliontologie|pallt|Pal\\\xe9sten|Panfike\\/chen|Papierbl\\\xe9tter|Papiertiite|Papiertilcher|Parfyknaller|Partyhiite|Partyhijte|Passendervveise|Paulgenauso|pa\\\xdf|pa\\\xdft|peinliohl|persdnlich|persfinlich|persiinlich|persiinliche|persiinlicher|Persiinllchkeltsspaltun|persijnliche|personlich|Personlichkeit|pers\\\xe9nlich|pers\\\xe9nliche|pers\\\xe9nlicher|Pers\\\xe9nliches|Pers\\\xe9nlichkeit|pe\\\ufb02g|Pfadfindervvappen|Pfad\\\ufb02ndeml|Pffitzen|Pfiitchen|Pfippchen|pflL\\'lgen|Pfllitze|pflugte|Pfundbijro|ph\\\xe9nomenal|PIatz|Piimpel|Piinlttchenltrawatte|Pijppchen|Pijppchenl|Planetenf|planm\\\xe9fiigen|Plastikfr\\\xe9iuleinl|plattmachen|Plfitzchen|plfitzlich|pliitzlich|pliitzllch|Pllllnderer|plotzlich|pl\\\xe9dieren|Pl\\\xe9ine|Pl\\\xe9inen|Pl\\\xe9itzchen|Pl\\\xe9itze|Pl\\\xe9ne|Pl\\\xe9tzchen|Pl\\\xe9tze|Pl\\\xe9tzel|pl\\\xe9tzlich|pl\\\xe9tzliche|Pofkawoche|Polizistl|pompiise|popul\\\xe9r|potth\\\xe9sslich|prasentleren|prfignant|Prfisentation|Prfisi|priide|Priife|priifen|prijfen|Priorit2a\\'t|PRIORITKT|PRIORITKTSZUGANG|Priorit\\\xe9itszugang|Priorit\\\xe9t|Prisident|Privatgem\\\xe9chern|Privatsph\\\xe9re|Probfeme|Profitinzerinnen|Protege|prude|Pruf|prufen|Prugelei|prugeln|pr\\\xe9chtig|Pr\\\xe9fekt|pr\\\xe9historischer|pr\\\xe9ichtiger|pr\\\xe9ichtiges|Pr\\\xe9imie|pr\\\xe9ipotente|pr\\\xe9isentiert|Pr\\\xe9isidenten|Pr\\\xe9itorianer|Pr\\\xe9mie|Pr\\\xe9operative|pr\\\xe9sentiere|pr\\\xe9sentieren|Pr\\\xe9sentiert|Pr\\\xe9senz|Pr\\\xe9sident|Pr\\\xe9sidenten|Pr\\\xe9sidentin|Pr\\\xe9sidentschaft|Pr\\\xe9torianer|pr\\\xe9zise|pr\\\xe9ziser|Pr\\\ufb02fungen|Pubert\\\xe9it|Publlkuml|PUPPCHEN|PUpst|Purzelb\\\xe9ume|P\\\xe9ckchen|p\\\xe9idagogisch|P\\\xe9irchen|P\\\xe9rchen|p\\\ufb02egen|P\\\ufb02icht|p\\\ufb02ichtbewullt|Qas|Qualit\\\xe9tskontrolle|Quten|qu\\\xe9ilen|qu\\\xe9ilt|Qu\\\xe9l|Qu\\\xe9lt|R\\'a\\'che|R\\/ck|R\\/nge|R6mer|rachsiichtiger|ranghfiheren|rangh\\\xe9heren|ranzukommen|Rasenm\\\xe9herunfall|Rasterllibertragung|Rasterubertragung|Ratschl\\\xe9ige|Rattenf\\\xe9nger|Rauc\\/7|Rauc\\/vender|rauhen|RAUMFAHRE|Raumf\\\xe9hre|Raumsschiff|rausf\\\xe9hrt|rausgeprtigeltl|rausliefien|rauszuschmeifien|rau\\\ufb02|Re\\/se|Realit\\\xe9it|Realit\\\xe9t|Rechtgl\\\xe9ubige|rechtm\\\xe9fkigen|RECHTSANWALTE|rechtsl|Reffer|regelm\\\xe9fiige|Regenh\\\xe9igen|Regenm\\\xe9ntel|Regierungsgehirnw\\\xe9ischesignal|regul\\\xe9re|reiB|reiBt|Reichtfimer|Reichtllimern|reif\\$|reif\\$en|Reifiverschluss|Reil3t|reil5|Reili|reilien|Reilin\\\xe9gel|Reillt|reilZ\\>|reingeh\\\xe9ngt|Reingelegtl|reinhupft|reinl|reinstilrmen|reiohen|REISSVERSCHLUSSGERAUSCH|rei\\\ufb02|rei\\\ufb02en|relch|religi6s|religiiiser|religi\\\xe9s|Rels|Rentenbezuge|Repr\\\xe9sentantin|Rettungsflofi|Rev\\/er|rfiber|rfiberwachsen|Rfickseite|rfihrselige|rfilpse|Rfissel|RGMISCHE|Richer|Riesenhfipfer|Riesenspafi|Riesentijr|riiber|Riicheln|riichelt|Riick|Riickblickend|Riicken|Riickenlage|Riickenwind|riicksichtslos|Riicksichtslosigkeit|Riicksitz|Riickw\\\xe9irts|Riickzug|Riick\\\ufb02ug|riihrt|Riilpsen|riilpst|Riimischen|Riistung|Riiumlichkeiten|Rijbe|rijber|rijckgfingig|rijckw\\\xe9irts|Rijsseltierl|Rilbe|rilber|rilberkommen|Rilckkehr|rilcksichtsloses|rilckw\\\xe9rts|Rillpsen|Riol|Rivalit\\\xe9t|rL\\'lber|RL\\'lhr|rllicken|rllickt|Rlllckgrat|Rlnge|Rlumgerate|ROMISCHE|ROMISCHEN|rosa\\\xe9ugiges|rotiugiger|Rotk\\\xe9ppchen|Rott\\\xe9nen|Routinetlberprijfung|Rticken|rticksichtslos|rtlber|Rtlckseite|ruber|Ruberrutschen|Ruckblende|Ruckblick|Rucken|Ruckenlage|Ruckenwind|Ruckfall|Ruckfrage|Ruckgriff|Ruckkehr|Rucksitz|Ruckzugl|ruhlg|ruhrenl|Ruhrt|Rul3|Rumgebrfillel|rumhingen|rumh\\\xe9ngen|rumh\\\xe9ngst|ruml\\\xe9uft|rumwuhlen|rumzuf\\\ufb02hren|rum\\\xe9rgern|runterffihrt|runtergespillt|runtergesp\\\ufb02lt|Runterl|runterspillen|runterspllllen|runtersp\\\xfclt|runtervverfen|Rupem|Rustung|r\\\xe9che|r\\\xe9chen|R\\\xe9cher|r\\\xe9cht|R\\\xe9der|R\\\xe9dern|R\\\xe9hre|R\\\xe9idern|R\\\xe9itsel|r\\\xe9itseln|r\\\xe9itst|R\\\xe9iume|R\\\xe9mern|r\\\xe9mische|r\\\xe9mischen|r\\\xe9mischer|R\\\xe9nder|R\\\xe9nke|R\\\xe9nken|R\\\xe9ntgenaufnahme|R\\\xe9ntgenbild|R\\\xe9son|r\\\xe9t|R\\\xe9tsel|r\\\xe9tselhaft|R\\\xe9tselhaftes|R\\\xe9ume|R\\\xe9umen|R\\\xe9umlichkeiten|R\\\xe9umt|r\\\xe9uspert|R\\\ufb02be|r\\\ufb02bergeguckt|R\\\ufb02ckkehr|S\\/e|s\\/nd|S5tze|S6hne|saB|Sachverstlndiger|sagf|sagfen|Sammlerstiicken|Sands\\\xe9cke|Sanftmiltigen|Sanierungsbeh\\\xe9rde|Sanit\\\xe9ter|Sargn\\\xe9gel|sari|Satellitenschijssel|Satellitenschusseln|Satellitenuberwachung|Saugf\\\ufb02flsen|sc\\/10\\/1|sc\\/16\\/1|sch\\/cken|Sch\\/ffe|sch6n|Schadeniiberpriifung|Schadenuberprtlfung|Scharfschijtze|schbn|schc\\'\\\xa7n|Schdn|schdnen|Schecksl|ScheiB|ScheiBe|scheiBegal|Scheif\\$e|scheiffsel|Scheifi|Scheifiding|scheifie|Scheifiel|Scheifier|Scheifihelm|Scheifiloch|Scheifipascha|Scheifisofa|Scheifiweiber|Scheifle|Scheiiislangweilig|Scheil\\'\\$e|Scheil3\\>er|Scheil3e|Scheili|Scheilie|scheilien|Scheille|Scheillel|ScheilSe|ScheilZ\\>|Scheir\\$oling|scheissegal|Scheisskarre|Schei\\\ufb02e|scheme|scheuf\\$lich|Scheulilich|schfichtern|schfimen|schfin|Schfine|schfinen|Schfines|schfirfer|Schfissel|Schfitzchen|schfjnes|Schideln|schief\\$en|Schief3\\>en|Schiefien|schiefit|schiefZ\\>t|schiel\\'5|Schiel3t|schiellen|Schielmbung|schie\\\ufb02en|schie\\\ufb02t|Schiffs\\\xe9rzte|Schiffzerstfiren|Schifies|Schiidel|schiilzen|schiin|schiine|Schiinen|Schiiner|schiines|Schiinheit|Schiipfer|Schiipfung|Schiisse|Schiitt|Schiittelfrost|schiitten|schiittet|schiitze|schiitzen|schiitzt|schijn|Schijnes|schijng|Schijssel|schijttelt|Schijtze|schijtzen|Schildkr\\\xe9te|Schilrze|Schilsse|schiltten|schiltzen|schimte|Schizophrenia|Schi\\\xe9tze|Schlachtgetllimmels|Schlachtschifl|schlafenl|Schlafk\\\xe9fern|Schlafmiitzenl|Schlafm\\\ufb02tzel|Schlangeng\\\xe9ttin|Schlappschw\\\xe9nze|Schlaumeierl|schlechf|Schlelistiinde|Schlellen|Schle\\\ufb02t|Schlfilsselparty|Schlfisse|SchlieBe|schlieBen|schlieBIich|schlieBlich|SchlieBt|schlief\\$en|Schlief\\$lich|schlief2\\>lich|schlief3t|Schliefie|schliefien|Schliefilich|schlieflslich|schliel3en|schliel3lich|Schliel5t|schlielie|schlielien|schlielilich|schliellsen|SchlielSt|Schliissel|Schliissell|Schliisselmoment|Schliisseln|Schlijsse|Schlijssel|Schlijsselloch|Schlilssel|Schlilssell|Schlilsselparty|schlimmsterAlbtraum|Schlle\\\ufb02en|Schllisse|schllitze|schllitzen|Schlllissell|Schlull|Schlupfern|Schlusselmoment|Schlusselszenen|Schlusselw\\\xe9rter|Schlussl|Schlu\\\xdf|Schl\\\xe9chter|schl\\\xe9fst|Schl\\\xe9ft|Schl\\\xe9ge|Schl\\\xe9ger|Schl\\\xe9gerei|schl\\\xe9gt|schl\\\xe9ift|schl\\\xe9igst|Schl\\\ufb02ssel|Schmatzger\\\xe9usche|SchmeiBt|Schmeif\\$|Schmeif\\$t|Schmeifien|schmeifit|Schmeilit|Schmei\\\ufb02|Schmier\\\xe9l|schmiicken|schmilztl|schmi\\\ufb02|Schmuckk\\\xe9stchen|Schmuckstiick|Schnappschijsse|Schnauzel|Schneegest\\\xe9ber|Schneidez\\\xe9hnen|Schneidez\\\xe9ihne|schnellf|Schnfiffeln|schnfiffelnl|schnfiffelst|Schnfirsenkel|schniiffele|schnijffelt|Schnilffeln|schnilrt|Schnitzereigesch\\\xe9ft|Schniuzer|Schnuoki|Schn\\\xe9ppchen|SchoB|Schofk|ScholShund|Schones|schonl|schopferische|scho\\\xdf|Schrankw\\\xe9nde|Schraubenschlijssel|schrecklichl|Schriftist|Schriftstijcks|schr\\\xe9ge|Schr\\\xe9ges|Schr\\\xe9nke|Schr\\\xe9nken|schtin|schtine|Schtisse|schuchtern|Schuchterne|Schuhl|Schuldgeftihlen|Schulterl|Schutzen|Schutzr\\\xe9ume|SCHUTZT|Schw6r\\'s|Schwachkop\\\ufb02|Schwanzlutscherl|Schwarzh\\\xe9ndler|Schwarzweills|schwei\\\ufb02durchnisst|schwerh\\\xe9rig|schwiicht|schwiire|schwiiren|Schwimmanziige|schwi\\\xe9rmten|schwnre|Schw\\\xe9che|Schw\\\xe9chen|schw\\\xe9cher|schw\\\xe9cheren|schw\\\xe9chsten|Schw\\\xe9icheanfall|Schw\\\xe9ichen|schw\\\xe9icher|Schw\\\xe9ichling|Schw\\\xe9irmerei|schw\\\xe9irzeste|Schw\\\xe9mme|schw\\\xe9re|schw\\\xe9ren|Schw\\\xe9rme|schw\\\xe9rmt|schw\\\xe9rmte|Schw\\\xe9tzer|sch\\\xe9biger|Sch\\\xe9del|Sch\\\xe9den|Sch\\\xe9inder|sch\\\xe9ine|sch\\\xe9inen|Sch\\\xe9iner|sch\\\xe9irfen|sch\\\xe9le|sch\\\xe9me|Sch\\\xe9n|sch\\\xe9ne|Sch\\\xe9nen|Sch\\\xe9ner|Sch\\\xe9nes|Sch\\\xe9nheit|sch\\\xe9nl|sch\\\xe9nste|sch\\\xe9nsten|sch\\\xe9nstes|Sch\\\xe9tzchen|Sch\\\xe9tze|sch\\\xe9tzen|sch\\\xe9tzt|Sch\\\xe9tzung|Sch\\\xe9umen|sch\\\ufb02chtern|SCl\\'1lUSS6l|Scllrift|scmoss|se\\/n|Se\\/wen|sehenl|Sehenswlllrdigkeiten|Sehnsilchte|sehrangespannt|sehrjung|Sehrwohl|sehrzufrieden|sehtjetzt|Seidenglattl|seidjetzt|Seitwann|SEKRETARIN|Sekretiir|Sekretir|Sekret\\\xe9irin|Sekret\\\xe9rin|sel\\/g|selbstl|selbststiindig|selbstsuchtige|selbstverstindlich|Selbstverstlndlich|Selbstverst\\\xe9indlich|Selbstverst\\\xe9ndlich|seld|selhst|SeligerVater|seln|Selt|sentimalen|seri\\\xe9ser|Sexualit\\\xe9t|Sfe|Sfidamerikas|Sfidwind|Sfifies|Sfihne|Sfildner|Sfilie|Sfilieste|Sfi\\\ufb02igkeiten|sfnd|SICHERHEITSBEHORDE|Sicherheitsgrijnden|Sichtubervvachung|Sichtunterstutzung|Sieja|Sifihnchen|Signalst\\\xe9rke|Siiden|Siidfrankreich|siidliche|siil\\$|siili|Siilie|siilier|SIim\\'s|Siinde|Siinden|Siinder|siindigen|sii\\\ufb02en|siJB|SiJBe|siJchtige|sijlien|sijliesten|Sijsser|Sildtunnel|Silfie|Silfier|Silfies|silfker|Silnden|Silndenbock|sindja|Sirl|Sj\\_r|Skilaufen|skrupelloserAnw\\\xe9lte|sL\\'lf\\$e|sL1B|slch|sle|slebe|sLif\\$|SLif\\$e|SLif\\$er|sLif\\$es|SLilSe|Slliden|Sllinde|sllindigen|Slnd|Slr|Slrs|SoBen|sofortl|soh\\\xe9nen|Solien|sollenl|SONDERMULL|sorgf\\\xe9iltig|sorgf\\\xe9ltig|souver\\\xe9ine|souver\\\xe9inen|souver\\\xe9ner|sp\\'a\\'ter|sp\\/elen|SpaB|Spaf\\$|Spaf2\\>|Spaffs|Spafi|Spafls|SpafS|Spal\\'5|Spal2\\>|Spal3|Spali|Spall|Spass|spat|spektakular|Spell|Spells|Spell\\\xbb|Spezialit\\\xe9t|spfit|SpieB|spief\\$ig|Spielzeuggeschfiftn|spiilte|spiiren|spiirt|spiit|spijre|spijren|spijrt|Spillmeier|spilre|spilren|spit|Spitzenfriihstiick|spLir\\'s|splliren|splter|Sportilbertragung|Sportsfraund|Sprachpijppchen|SPRACHPUPPCHEN|Spriichlein|Sprilht|spr\\\xe9che|spr\\\xe9chen|spr\\\xe9chet|Spr\\\ufb02che|spr\\\ufb02ht|spUl|spUr|spurbare|spUrt|sp\\\xa7ter|Sp\\\xe4\\\xdf|sp\\\xe9it|sp\\\xe9iter|sp\\\xe9t|Sp\\\xe9ter|Sp\\\xe9tzchen|Sp\\\xe9tzchenl|ssh|st6Bt|st6hnt|st6lSt|St6rt|ST\\@HNT|Staatsaff\\\xe9ren|staatsbllirgerliches|Staatsgesch\\\xe9fte|Standardan\\\xe9sthesie|standig|STARSCREAMI|station\\\xe9r|Statusmeldungl|stdrte|stecktjede|Stehenbleiben|Stehvermiigen|Steigbilgeldinger|Steinh\\\xe9user|Sternenkijsse|Steuererkl\\\xe9rung|Steuererkl\\\xe9rungen|Steuerprtifer|Steuerprtifung|Steuersiitzen|stfipseln|stfiren|stfirker|Stfirt|stfirzt|stieB|Stiefbriider|Stiicke|Stiihle|Stiihlen|stiihnt|Stiillen|Stiire|stiiren|Stiirme|stiirmischen|Stiirsignale|stiirt|Stiirung|stiirzen|Stiitzpunkt|Stijck|Stijckchen|Stijcke|stijhle|stijrme|stijrzen|Stilck|Stilcke|Stillckchen|Stillst\\\xe9nde|Stilvolll|stinden|Stldseite|stleg|Stllihle|Stllirmen|stllirzt|stlllrzen|Stl\\\ufb02|sto\\/3en|StoB|stoBe|stof\\$en|Stofi|STOHNT|Stol3zahn|Stol3zeit|stolie|Storung|Str6men|str6mt|StraBe|StraBen|StraBenk6tern|Straf\\$e|Strafiengang|Strafienratten|Strafienschlacht|Straflsenecke|Straflsenmaler|Straflsenschilder|Straft\\\xe9ter|Strahlenschutzger\\\xe9t|Strahlungsintensit\\\xe9t|Stral3en|Stral5e|Stralie|Straliengang|Stralienk\\\xe9ter|Straliensperre|Streitkr\\\xe9fte|Streitkr\\\xe9ften|Streit\\\xe9xte|strfimten|Striimen|Striimungen|Stromschliige|Stromschnellenl|Stromung|Strullerl|Str\\\xe9mung|Str\\\xe9mungen|sturzte|STUTZPUNKT|St\\\xe9be|st\\\xe9hnt|st\\\xe9hnte|St\\\xe9idtchen|St\\\xe9idte|st\\\xe9indig|St\\\xe9irke|st\\\xe9irker|St\\\xe9irkeres|st\\\xe9llst|St\\\xe9ndchen|St\\\xe9nder|St\\\xe9ndig|st\\\xe9pseln|st\\\xe9ren|St\\\xe9rke|St\\\xe9rken|st\\\xe9rker|St\\\xe9rkere|st\\\xe9rkeres|st\\\xe9rkste|st\\\xe9rst|st\\\xe9rt|St\\\xe9rung|St\\\xe9tten|St\\\ufb02ck|St\\\ufb02hlen|sUB|sUBe|Suchfeam|SUden|Sudseite|Sudwest|sUf\\$|SUf\\$e|suMM\\\u2020|Suohet|Superkr\\\xe9fte|superl\\\xe9cherlich|s\\\xa2\\'il3|S\\\xe9cke|S\\\xe9ge|s\\\xe9he|S\\\xe9hne|S\\\xe9hnen|S\\\xe9icke|S\\\xe9inger|S\\\xe9iulen|S\\\xe9ldner|s\\\xe9mfl\\/che|s\\\xe9mtliche|s\\\xe9mtlichen|S\\\xe9nger|S\\\xe9ngerin|s\\\xe9ubern|s\\\xe9uft|s\\\xe9ugen|S\\\xe9ulen|S\\\xe9urewannen|S\\\ufb02dh\\\xe9ingen|T6chter|T6pfchen|T6rn|T6rtchen|t6te|T6ten|t6tet|TANZERINNEN|Tater|tats\\\xe9chlich|tats\\\xe9chliche|tats\\\xe9ichlich|Tatverd\\\xe9ichtigen|Tauchg\\\xe9inge|Tauchg\\\xe9nge|Tauschgesch\\\xe9fte|Tauschgesch\\\xe9\\\ufb02e|Tbrn|tbten|tdten|tdtete|Telefongespr\\\xe9che|Tempelsch\\\xe9nderf|TemPO|TESTGELANDE|Testvorf\\\ufb02hrungen|tfidlich|tfiitet|Tfir|tfirkischen|Tfite|Theaterstfick|Therapiel|Thermalger\\\xe9t|Thronr\\\xe9uber|Thronr\\\xe9uberin|Tiefkilhlung|Tiefktih\\/system|Tiefktihleind\\\xe9mmung|TIEFKUHL|Tiefkuhlstasis|Tiefkuhlung|tiglich|tiichtige|tiint|Tiipfchen|Tiipfchennummer|Tiir|Tiiren|Tiirl|Tiirme|tiite|Tiite|tiiten|tiitet|tiitete|TiJr|Tijrme|Tilr|Tilrglocke|Tilrklingel|Tilr\\\xe9ffner|Tippger\\\xe9usch|Tischlenuerkstatt|TL\\'lr|tlglich|Tllir|Tllirkei|Tlllpfelchen|TOILETTENSPULUNG|Tonl|Toreroabs\\\xe9tze|Tortenb\\\xe9ickerin|Tragfidie|Tragiidie|Trag\\\xe9die|Trainingsijbung|TRAUMKCRPER|treffan|trfiumen|Tribiinen|trif\\'f\\'t|trigt|Triibsal|Triimmem|triistllch|Triistungen|Triiume|Trilmmer|triume|Trockenger\\\xe9ite|Trockenger\\\xe9te|Tropfsteinhiihle|Trottell|Trubsal|tr\\\xe9ge|Tr\\\xe9gerschiff|tr\\\xe9gt|Tr\\\xe9igerschiff|tr\\\xe9igt|tr\\\xe9ium|tr\\\xe9iume|tr\\\xe9iumen|tr\\\xe9iumt|tr\\\xe9llert|Tr\\\xe9ne|Tr\\\xe9nen|Tr\\\xe9um|tr\\\xe9ume|Tr\\\xe9umen|Tr\\\xe9umer|tr\\\xe9umst|Tr\\\xe9umt|Tschiiss|Tschiissl|tschijss|Tschtiss|tsch\\\xfc\\\xdf|Tsch\\\ufb02s|Ttir|ttlckisch|Ttlte|tubul\\\xe9re|Tupperschiissel|TUR|TUr|Turen|TURKEI|Turmwiichter|tutjetzt|typlschl|T\\\xe9chter|t\\\xe9d\\/ichen|t\\\xe9dlich|t\\\xe9dliche|t\\\xe9dlichen|t\\\xe9glich|t\\\xe9glichen|t\\\xe9iglich|t\\\xe9itowieren|t\\\xe9itowierte|T\\\xe9itowierung|t\\\xe9iuschen|T\\\xe9ler|T\\\xe9lpell|T\\\xe9nze|T\\\xe9nzerin|T\\\xe9pfchen|T\\\xe9pfchenquatsch|T\\\xe9pfchensache|t\\\xe9te|T\\\xe9ten|t\\\xe9test|t\\\xe9tet|t\\\xe9tete|t\\\xe9towieren|t\\\xe9towierte|T\\\xe9towierung|T\\\xe9towierungen|t\\\xe9uschen|t\\\xe9uscht|T\\\xe9uschung|T\\\xe9uschungsman\\\xe9ver|Ub6FpFUfl\\'T1al|Ub6l\\'pl\\'Uf\\\u20ac|Ube|Ubel|Ubelkeit|Ubelt\\\xe9ter|Uben|Uben\\/vachen|Uben\\/vacher|Uben\\/vacht|Uben\\/vachungen|Uben\\/vachungsgesetz|Uben\\/vinden|Uber|UBER|Uberall|Uberanstrenge|Uberanstrengung|Uberarbeiten|UberAuf\\$erirdische|Uberaus|Uberbleibsel|Uberblick|Uberbringe|Uberdauern|Uberdecken|Ubereinstimmung|Uberfahren|Uberfall|Uberflilssig|Ubergabe|Ubergaben|Ubergabepunkt|Ubergangen|Ubergangsweise|Ubergeben|Ubergehen|Uberhaupt|Uberholt|Uberholter|Uberh\\\xe9rt|Uberjemanden|Uberlagerungs|Uberlandleitungen|Uberlass|Uberlasse|Uberlassen|Uberlassenl|Uberlasteten|Uberleben|Uberlebende|Uberlebenden|Uberlebenschancen|Uberlebenswichtigen|Uberlebt|Uberleg|Uberlegen|Uberlegenheit|uberlegt|Uberlegten|Uberleiten|Uberleitung|Uberlieferungen|Uberl\\\xe9sst|Uberm|Ubermorgen|Ubernachtungsgast|Ubernahm|Ubernahme|Ubernahmen|Ubernehme|Ubernehmen|Ubernimmst|ubernimmt|Ubernommen|Uberpriifen|Uberprilfen|Uberprliifen|Uberprufe|Uberprufen|Uberpruft|Uberraschend|Uberrascht|Uberraschte|Uberraschter|Uberraschung|Uberraschungen|Uberraschungl|Uberreagiert|Uberreden|Uberredet|Uberreste|Uberrumpeln|Uberrumple|Ubers|Uberschl\\\xe9gt|Uberschreiten|Uberschritten|Uberschwemmung|Ubersehen|Ubersensibilit\\\xe9t|Ubersetzung|Uberspannte|Uberspielt|Uberstehen|Ubersteigerten|Ubersteigt|Uberstunden|Ubertraf|UBERTRAGEN|Ubertragen|UBERTRAGUNG|ubertreibe|Ubertreiben|Ubertrieben|Ubertriebene|ubertriebener|Ubertrifft|Ubervvachen|Ubervvacht|Ubervvachung|Ubervvachungs|Ubervvachungsstaat|Ubervvachungsstaats|Ubervvachungsvideos|Ubervv\\\xe9iltigend|Uberwachen|Uberwacher|Uberwachung|Uberzeuge|Uberzeugen|Uberzeugend|Uberzeugt|Uberzeugung|Uberzeugungen|Uberziehen|Uberzuleiten|ublem|Ubler|Ubles|Ublich|Ubliche|ublichen|Ubrig|Ubrige|Ubrigen|Ubrigens|Ubrlgens|Ubrllccol|Ubung|Ubungsbedingungen|Ubungsschiisse|Ubungsschusse|Ub\\\u20acf\\'pf\\'Uf\\\u20acl\\'1|Uher|ultrakiistlichl|umgeriistet|umg\\\xe9nglich|umhdren|umh\\\xe9ngt|Umschlfigen|umschlieBt|Umst\\\xe9inden|Umst\\\xe9nde|Umst\\\xe9nden|umst\\\xe9ndlich|umweltsch\\\xe9dlich|unabhiingiges|unabh\\\xe9ingig|unabh\\\xe9ngig|unabl\\\xe9ssig|Unauff\\\xe9lligeres|unaufhalfsam|unaufhiirlich|unaufh\\\xe9rlich|unaufi\\\xe9llig|unberijhrbar|unberllihrten|unbesch\\\xe9digt|Uncl|undja|undjeder|undjemand|undjetzt|undlassenihn|undlhnen|undurchfuhrbar|uneingeschr\\\xe9nkten|unergrilndliche|unerhort|unerhorte|unerkl\\\xe9rliche|unerkl\\\xe9rlichen|unertr\\\xe9glich|unf\\'a\\'hig|Unfahigkeit|unfersfellen|unfiirmigen|unf\\\xe9hig|unf\\\xe9higste|unf\\\xe9ihigste|Unf\\\xe9ille|Unf\\\xe9lle|ungef\\\xe9hr|ungef\\\xe9hre|Ungef\\\xe9ihr|ungef\\\xe9ihrlich|ungemutlich|ungenugend|ungestbrt|ungewfihnliche|Ungewfjhnliches|ungewiihnlich|Ungewijhnliches|ungew\\\xe9hnlich|ungew\\\xe9hnliche|ungew\\\xe9hnlichste|ungfinstigen|ungiiltig|ungilnstig|Unglaubliohl|unglaubwurdig|Unglfiubige|Ungliicklicherweise|Unglilck|Ungll\\'Jcklichervveise|Unglllick|unglllicklich|ungllllckliche|unglucklich|Ungl\\\xe9ubiger|ungultig|ungunstigen|unheimlichl|UNHORBARES|unh\\\xe9flich|Universitlt|Universit\\\xe9t|unlfisbare|unm6glich|unmfiglich|Unmiiglich|Unmiigliche|unmijglich|unmissverst\\\xe9ndlich|unmoglich|Unmtioglich|Unm\\\xe9glich|unm\\\xe9glioh|unnatiirliche|unnaturliche|unnfitigen|unniitig|unnllitz|unn\\\xe9tig|unn\\\xe9tigen|unol|unp\\\xe9sslich|UNREGELMASSIG|Unregelm\\\xe9fiigkeiten|unschliissig|unserejungen|unsererAnw\\\xe9lte|unsererjungfr\\\xe9ulichen|unsjede|uns\\\xe9glich|Untenuelt|unterdriickten|Unterdrilckung|unterdrtlckte|Unterdr\\\ufb02ckung|Unterhaltskostenl|Unterhaltungsm\\\xe9fiig|unterhfilt|unterh\\\xe9lt|unterschitzt|untersch\\\xe9tzte|unterstiitzt|Unterstiitzung|unterstijtzt|Unterstiltzung|Unterstllitzung|unterstutzen|unterstutzt|Unterstutzten|Unterstutzung|Untersuchungsausschijsse|Unterw\\\xe9sche|untr\\\xe9stlich|Unt\\\xe9tigkeit|unumg\\\xe9nglich|unverm\\\xe9hlt|Unverschfimtheitl|unversch\\\xe9mte|Unversch\\\xe9mtheitl|UNVERSTANDLICH|UNVERSTANDLICHE|UNVERSTANDLICHER|UNVERSTANDLICHES|Unverst\\\xe9ndliche|unverst\\\xe9ndlichen|unverst\\\xe9ndliches|unverzlliglich|unver\\\xe9ndert|Unzerbrechliohen|unzurechnungsfahig|unzuverlassiger|Unzuverl\\\xe9ssiger|unzuverl\\\xe9ssiges|unz\\\xe9hlige|unz\\\xe9hligen|unz\\\xe9ihlige|Urgrofivaters|Urlaubsuberschreitung|Ursprijnglich|ursprtmglich|Ursprunglich|Ururgrofivater|v\\/el|v\\/er|v\\/erfe|v\\/erfes|V6gel|v6IIig|V6lker|V6llig|v6lllg|vdllig|Ve\\/Teidigungskr\\\xe9fte|Velzeih|Velzeihung|velzichte|Ven\\/vandter|ven\\/v\\\xe9hntl|Ventilationsfiffnung|Ventilatorsch\\\xe9chte|VERACHTLICH|verandert|Verbiindeten|Verbilndeter|verbliidet|Verbliidung|verbllirgen|verbrachfe|Verbrec\\/ver|Verbtmdeter|Verbundeten|Verb\\\ufb02nolete|verdiichtigen|verdiinnt|verdllistern|verdr\\\ufb02ckt|verdunnt|verd\\\xe9chtig|Verd\\\xe9chtigen|verd\\\xe9chtiger|verffilgbares|Verfiigung|verfiihren|verfiihrt|verfiittem|Verfijgung|verfilgst|verfilgte|Verfilgung|Verfilhrungskilnste|verflligen|verfllihrt|Verflllgung|verfolgf|verfolgtl|VERFUGBAR|verfugt|vergafk|Vergniigen|Vergniigens|Vergniigungsausflug|Vergnijgen|Vergnilgen|Vergnlligen|Vergntigen|Vergnugen|vergnugt|vergnugte|Vergnugungsausflug|vergr6Bern|vergr\\\xe9fiern|Vergr\\\xe9fierung|verg\\\xe9nglich|verhiirt|Verhiitung|Verhor|verhort|verhorten|verh\\\xe9ilt|verh\\\xe9lt|Verh\\\xe9ltnis|Verh\\\xe9ltnisse|verh\\\xe9ltst|veriindert|Verinderungen|verkilnden|verkilndet|verkniipft|verknUpf\\'t|verkunde|verkunden|verkundet|VERKUNDIGUNG|Verk\\\xe9ufer|verletztl|verlieB|verlielien|verlorenl|verl\\\xe9ingert|Verl\\\xe9ingerungskabel|verl\\\xe9isst|verl\\\xe9sst|verl\\\xe9uft|verm\\'aihlen|verm\\/ssf|vermiibelt|Vermiigt|Verm\\\xe9gen|verm\\\xe9hle|verm\\\xe9hlen|verm\\\xe9hlt|Verm\\\xe9ihlung|vernachl\\\xe9ssigt|Vernachl\\\xe9ssigung|vernfinftig|vernfinftige|vernilnftig|vernllmftigsten|verntmftige|vernunftig|vernunftigsten|vern\\\ufb02nftig|verpa\\\xdft|verpesfefe|verprilgle|verprugeln|Verp\\\ufb02ichtungen|verrat|verrfickter|verriickt|Verriickte|Verriickten|Verriickter|verriicktes|verrijckt|verrijckte|verrilckt|Verrilckte|Verrilckter|Verrilcktes|verrL\\'lckt|verrljckt|verrllickt|Verrllickte|Verrllickter|verrlllckte|verrtickt|verrUckt|Verruckte|verruckten|Verruckter|Verr\\\xe9iter|verr\\\xe9itst|verr\\\xe9t|Verr\\\xe9ter|Verr\\\xe9terin|verr\\\xe9terisch|verr\\\xe9terischen|verr\\\ufb02ckt|versaumt|Verscheifier|verschiichtert|verschiitten|verschlucktl|VERSCHLUSSELN|VERSCHLUSSELT|Verschlusselung|Verschnauferst|Verschwdrung|verschweilit|Verschwiirer|verschwiirerisch|Verschwiirern|Verschwiirung|Verschwiirungen|Verschw\\\xe9rer|Verschw\\\xe9rung|Verschw\\\xe9rungstheoretiker|versch\\\xe9rft|versfanden|Versfehen|versiihnlich|Versiihnung|verslumte|Verspfitung|verspiire|verspilre|verspiten|versprijht|verst0I3en|verst6Bt|Verst6ISt|verst6l3t|verstehejetzt|Verstiindnis|verstiirkt|Verstiirkung|verstilmmelst|verstoBen|verstofken|verstolien|verstummelt|verstunde|verstundest|verst\\\xe9fkt|verst\\\xe9indlich|Verst\\\xe9irkung|Verst\\\xe9ndigen|Verst\\\xe9ndigt|verst\\\xe9ndlich|Verst\\\xe9ndnis|verst\\\xe9rken|verst\\\xe9rkt|verst\\\xe9rkte|verst\\\xe9rkter|Verst\\\xe9rkung|verst\\\xe9rt|vers\\\xe9hnen|vers\\\xe9hnt|vers\\\xe9umen|vers\\\xe9umt|VERTRAGSLANGE|vertrauenswiirdig|vertrauenswtlrdig|vertrauenswtlrdigen|vertr\\\xe9umte|vervvanzt|verwiistete|verwllisten|verwustet|verw\\\xe9hnten|verw\\\xe9ihnen|verw\\\xe9ssert|verz\\\xe9gere|Verz\\\xe9gerte|Verz\\\xe9gerung|ver\\\xe9ffentliche|ver\\\xe9ffentlichen|ver\\\xe9ffentlicht|ver\\\xe9indert|Ver\\\xe9inderung|ver\\\xe9ndern|ver\\\xe9ndert|ver\\\xe9nderte|ver\\\xe9nderten|Ver\\\xe9nderung|Ver\\\xe9nderungen|ver\\\xe9ngstigtes|ver\\\xe9ppelt|ver\\\xe9rgert|vewvendet|vfillig|VGFKUFZGH|VI\\/illkommen|VI\\/itwicky|vial|Videoiiben\\/vachung|Vie\\/e|Vielfrafi|vielf\\\xe9ltig|Vielleichtja|vielversprechend|Vieraugengespr\\\xe9ch|vieriunge|vierj\\\xe9hriges|vierk\\\xe9pfige|Viigel|viillig|viilliges|Viterchen|Vizepr\\\xe9isident|vlel|Vlellelcht|Vogelscheifke|Vogelscheilie|Volksm\\\xe9rchen|vollerjeder|vollmachen|vollst\\\xe9ndig|vollst\\\xe9ndige|Volltrefferl|vollz\\\xe9hlig|Volumenl|von\\/vagten|von\\/v\\\xe9irts|vonn6ten|Vonn\\\xe9irts|Vordertiir|Vorderturl|vordr\\\xe9ngelnl|vorfibergehend|Vorfuhrungen|vorgef\\\ufb02hrt|Vorgiinge|Vorg\\\xe9nger|Vorg\\\xe9ngern|Vorh\\\xe9nge|vorijbergehend|vorilber|vorilbergehende|vorkniipfen|Vorl\\\xe9ufer|Vorl\\\xe9ufig|Vorraus|Vorschl\\\xe9ge|vorschriftsm\\\xe9fiig|vorschriftsm\\\xe9iliig|Vorsichtsmaflnahme|Vorstellungsgespr\\\xe9ch|Vorstellungsgespr\\\xe9che|Vorstof\\$|Vortlbergehende|vort\\\xe9uschen|vorubergehend|vorvv\\\xe9rts|Vorwfirts|vorw\\\xe9rts|vorzfiglichl|vor\\\ufb02ber|Vor\\\ufb02bergehend|VVACHMANN|Vvaffen|Vvagen|VVarte|VVeif3\\>t|VVeil\\'2\\>t|VVir|VVM|v\\\\\\/as|V\\\\\\/e|V\\\xe9gel|v\\\xe9geln|v\\\xe9gelt|v\\\xe9llig|w\\/\\'r|W\\/e|w\\/eder|W\\/nkel|w\\/r|w\\/rd|w\\/rkl\\/ch|W0|w5r|w5r\\'s|W6lfe|W6lfen|W99|Waffenschr\\\xe9nke|wafs|wahrend|WAHRENDDESSEN|Wahrheitl|wail|Walbl|Walsinghaml|wankelmiltig|ware|WAREST|Warfe|warja|Waschbrettb\\\xe9uche|Waschb\\\xe9ir|Waschb\\\xe9iren|Wasseranschlljssen|Wattekn\\\xe9uel|Wattest\\\xe9bchen|we\\'re|We\\'ro|we\\/B|We\\/Bf|we\\/fere|Wechsell|weggebfirstet|weggespllllt|weggesplllltl|weggesp\\\ufb02lt|wegl|wegreiflsen|wegschieBen|Wegtratan|wegzuwefien|wei\\/3|WeiB|weiBe|weiBen|weiBer|weiBes|WeiBfresse|weiBt|Weif\\$|Weif\\$t|weif2\\>|weif3|weif3\\>|Weif3t|weif5|Weifbe|weifbt|Weifi|Weifie|weifies|Weifist|Weifit|weifk|weifken|Weifker|weifkes|weifkt|weifL|weifLt|weifl\\\xbb|weifS|WeifSt|weifZ\\>|WeifZ\\>t|weif\\\xe9t|Weihnachtseink\\\xe9ufe|Weihnachtsm\\\xe9nner|weil\\'5|weil\\'5t|weil3|Weil3t|weil5|Weil5t|weili|weilit|weilke|Weill|weills|weillst|weillt|weilS|weilSe|WeilSglut|weilZ\\>|weilZ\\~|weiss|weissen|weisst|weiterhiipfen|Weiterpessen|weitl\\\xe9ufige|weitweg|WelBt|well|Well|Wellit|welllt|welt|WELTBEVOLKERUNG|Wel\\\ufb02t|Werdja|Werkst\\\xe9tten|Werkzeugg\\\ufb02rtel|wertschfitzen|Westflilgel|Westkilste|Wettk\\\xe9mpfe|Wettk\\\xe9mpfen|Wettk\\\xe9mpfer|Wfinsche|wfinschen|Wfird|wfirde|Wfirden|wfirdest|wfire|Wfirme|Wfisste|wfitete|wfssen|Widen\\/v\\\xe9rtig|widerf\\'a\\'hrt|widerspriichliche|Widerw\\\xe9irtig|wiedergew\\\xe9ihltl|wiederhaben|Wiederh\\\xe9ren|Wieheifiternoch|Wieheiliternoch|wihlerisch|wihlerlsch|wiihlen|wiihlte|wiihrend|wiilrdest|Wiinde|wiinsch|Wiinsche|Wiinschen|wiinschst|wiinscht|wiinschte|wiirde|Wiirden|Wiirdest|wiirdet|wiirdigst|Wiire|wiiren|Wiirfel|wiirfeln|Wiirfels|wiirs|Wiirstchen|wiischt|Wiisste|wiissten|wiisstest|Wiiste|wiitenden|wijnsche|wijnschen|wijnschte|wijrd|wijrde|wijrden|wijrdest|wijrdiger|Wijrg|wijsste|wijtend|wildl|wilnsch|wilnsche|wilnschen|wilnscht|wilnschte|wilrd|Wilrde|Wilrden|Wilrdest|wilrdig|Wilrfel|Wilrfelenergie|wilsste|wilssten|Wilstling|wiltend|Windelhundl|Windhundk\\\xe9rper|winner|Wire|wires|Wirfangen|wirja|wirje|wirjede|wirjeden|wirjetzt|Wirnisse|Wirsind|wirtragen|Wirtschaftspriifer|Wirverfolgen|wirvom|Wirwaren|Wirwarten|Wirwerden|Wirwissen|Wirwollen|Wirwollten|Wirzeigten|wirzu|Witzl|WKHRENDDESSEN|wL\\'lrden|wle|Wleso|Wlhlen|wllinsch|wllinschst|wllinscht|wllirde|wllirden|wllirdest|wllirdet|Wllirgegriff|wllirgen|wllisste|wlr|wlrd|wlrkllch|Wlrkllchkelt|wlrst|Wlrwarten|wlrwollen|Wo\\/f|Wochenf\\\xe9hre|woffir|Wofiir|Wofijr|wofilr|Wofur|WoherweiB|WoherweiBt|Woherweif\\$t|wohlfilhlen|Wollkn\\\xe9uel|womiiglich|wom\\\xe9glich|wom\\\xe9iglich|Worfiber|woriiber|Worijber|Wortgepl\\\xe9nkel|Woruber|wt\\/\\'rden|wtinsche|wtinschst|wtirde|Wtirdest|Wtirfel|Wtmschen|WUl\\'d\\\u20ac|WUlfelbecher|wullte|Wundersch6n|wunderschfin|Wunderschiin|wunderschiinen|wundersch\\\xe9n|wundersch\\\xe9ne|Wundersch\\\xe9nel|wundersch\\\xe9nen|wundersch\\\xe9nes|wundersoh\\\xe9n|wunsche|Wunschen|wunscht|wunschte|WUNSCHTE|wurcle|wUrde|Wurdige|WURGT|Wurmer|Wursfsfulle|Wuste|WUSTEN|wutend|wu\\\xdfte|wu\\\xdftest|w\\\xa7r\\'s|w\\\xa7re|W\\\xa7ren\\'s|w\\\xe9\\'hrend|w\\\xe9chst|W\\\xe9chter|w\\\xe9fs|W\\\xe9g|w\\\xe9hle|w\\\xe9hlejetzt|w\\\xe9hlen|W\\\xe9hler|W\\\xe9hlern|w\\\xe9hlt|w\\\xe9hlte|w\\\xe9hrend|W\\\xe9hrung|W\\\xe9ichter|w\\\xe9ihlen|w\\\xe9ihrend|w\\\xe9ir|w\\\xe9ir\\'s|w\\\xe9irde|W\\\xe9ire|w\\\xe9iren|w\\\xe9irmen|w\\\xe9irst|W\\\xe9lder|W\\\xe9ldern|W\\\xe9lfen|W\\\xe9lkchen|W\\\xe9nde|W\\\xe9nden|w\\\xe9r|w\\\xe9r\\'s|W\\\xe9re|W\\\xe9ren|w\\\xe9ret|w\\\xe9rja|W\\\xe9rm|W\\\xe9rme|w\\\xe9rmt|W\\\xe9rst|w\\\xe9rt|W\\\xe9rter|W\\\xe9rterbuch|w\\\xe9rtliche|W\\\xe9sche|W\\\xe9scheklammer|W\\\xe9schst|w\\\xe9scht|w\\\ufb02rde|w\\\ufb02rden|W\\\ufb02rfel|z\\'a\\'h|Z\\/egf|Z\\/yarettenb\\\xe4ume|Z05|z6gel1e|z6gern|zahlenm\\\xe9\\\ufb02ig|zappelnl|Zauberspruchen|Zaubervoodookr\\\xe9fte|Zauherpfippchen|Zefietzende|zeitgem5B|Zeitgem\\\xe9\\\ufb02e|Zeitgeniissische|zeitgeniissischen|Zellenschliissel|zerbeif\\$en|zerbeif\\$t|zerf\\\xe9llt|Zermatschger\\\xe9usch|zerm\\\ufb02rben|zerreifien|zerreilit|zersfdren|zerst6rst|zerst6rt|zerstdren|Zerstfiren|Zerstfirer|Zerstfirungskraft|Zerstiickelung|zerstiire|zerstiiren|Zerstiirer|zerstiirt|zerstiirten|zerstiirtl|Zerstiirungl|zerstoren|zerst\\\xe9re|zerst\\\xe9ren|Zerst\\\xe9rer|zerst\\\xe9rt|Zerst\\\xe9rung|Zerst\\\xe9rungsfeldzug|zertrlllmmert|zfihlt|Ziel160m|Zihnelt|ziichtiger|Ziige|Ziindkapseln|Zilnd|Zilnden|Zilndungsenergie|Zilrich|Zindern|Zingstlich|Ziufierst|zleht|ZLIFUCK|Zooschlieliung|Zuckerschn\\\ufb02tchen|zuerstvor|zuffillig|zuflligen|ZUFUCK|Zuf\\\xe9illig|Zuf\\\xe9illigerweise|zuf\\\xe9llig|Zuf\\\xe9lligerweise|zug\\'a\\'nglichen|ZUGANGSPRIORITKT|zugehdrt|zugeh\\\xe9rt|zugestofien|Zugest\\\xe9ndnis|Zugest\\\xe9ndnisse|Zugiinge|zuh6ren|zuh6rt|zuhiiren|zuhiirt|Zuh\\\xe9lter|Zuh\\\xe9ren|Zuh\\\xe9rer|zukilnftiges|zul|zundete|Zundverteilerkappe|zunjick|zun\\\xe9chst|zun\\\xe9hen|zun\\\xe9ihen|Zuokerschntltchen|zurfick|zurfickblicken|zurfickgekommen|zurfickgezogen|zurfickkehren|zurfickzufuhren|zuriick|zuriickbleiben|zuriickgeben|zuriickgehen|zuriickgekommen|zuriickgezogen|zuriickhaben|zuriickkehre|zuriickkehren|zuriickkehrst|zuriickziehen|Zurijck|zurijckbringen|zurijckfordem|zurijckgeholt|zurijckgekehrt|zurijckgekommen|zurijckgelassen|zurijckgerufen|zurijckkehren|zurijcknehmen|zurijckstolpern|Zurilck|Zurilckf|zurilckgeblieben|zurilckgeholt|zurilckgekehrt|zurilckhalten|zurilckholen|zurilckkehre|zurilckkehren|zurilckkehrt|zurilckkommen|zurilckkommt|zurilcklassen|zurilckziehen|Zurilckziehenl|zurilckzugeben|zurl\\'Jck|zurL\\'lck|zurLick|zurljckgeben|zurllickfallen|zurllickgekehrt|zurllickkehrt|zurllickzukehren|zurlllckgehen|zurlllckkomme|zurtick|zurtickbringe|zurtickgezogen|zurtlckgekommen|zurtlckvervvandeln|Zuruck|ZURUCK|zuruckbleiben|zuruckblicken|zuruckdenke|zuruckfeuern|zuruckgehen|zuruckgelegt|zuruckgewiesen|zuruckgreifen|zuruckhaben|zuruckkehren|zuruckkehrten|zuruckkomme|zuruckkommen|zuruckk\\\xe9mst|zuruckl|zurucklassen|zurUcklieB|zuruckl\\\xe9cheln|zurucknehmen|zuruckverwandeln|zuruckverwandelt|zuruckziehen|zuruckzukommen|zurverfilgung|zur\\\xe9ickrufen|zur\\\ufb02ck|Zur\\\ufb02ckbleiben|zur\\\ufb02ckfliegen|zur\\\ufb02ckgeschickt|zur\\\ufb02ckgibst|zus\\'a\\'tzliche|zusammenbeilien|zusammenffigen|zusammenfugen|zusammenfuhren|zusammenf\\\xe9illt|zusammenh\\\xe9ilt|zusammenh\\\xe9lt|zusammenh\\\xe9ngen|zusammenreifien|zusammenzuschweifien|zuschl\\\xe9gst|zust6Bt|zustofken|zust\\\xe9indig|zust\\\xe9ncligen|zust\\\xe9ndig|zust\\\xe9ndigen|zus\\\xe9tzlich|zus\\\xe9tzliche|zuverlfissig|zuverllssig|zuverl\\\xe9ssig|zuverl\\\xe9ssiger|zuviel|zuviele|zuzuflligen|Zu\\\ufb02ucht|zvvei|Zw6If|zw6lfmal|Zwel|Zwickmfihle|Zwillingstiichter|Zwischenf\\\xe9lle|zwnlf|Zw\\\xe9ilften|zw\\\xe9lf|z\\\xe9gerlich|z\\\xe9gern|Z\\\xe9gerns|z\\\xe9h|z\\\xe9he|z\\\xe9her|z\\\xe9hl|z\\\xe9hle|z\\\xe9hlen|Z\\\xe9hlerei|z\\\xe9hlt|z\\\xe9hltl|Z\\\xe9hlung|Z\\\xe9hne|Z\\\xe9hnen|Z\\\xe9hneputzen|z\\\xe9ihle|z\\\xe9ihlen|z\\\xe9ihlt|Z\\\xe9ihlungen|Z\\\xe9ihne|Z\\\xe9libat|\\\\\\/GFQHUQGH|\\\\\\/OFVVUFf\\\u20ac|\\\\\\/Vahrheit|\\\\\\/Vir|\\\\\\/\\\\\\/i6fUl\\'1l\\\u20acfi|\\\\\\/\\\\\\/il\\'fUl\\'1I\\'\\\u20acl\\'1|\\\\Nynn|\\_|\\\xc4u|\\\xe9|\\\xe9chzt|\\\xe9ffentlich|\\\xe9ffne|\\\xe9ffnen|\\\xe9ffnet|\\\xe9fft|\\\xe9fter|\\\xe9fters|\\\xe9h|\\\xe9hnlich|\\\xe9hnliche|\\\xe9hnlicher|\\\xe9ih|\\\xe9ihnlich|\\\xe9indern|\\\xe9itzend|\\\xe9lter|\\\xe9lteste|\\\xe9ltesten|\\\xe9ndere|\\\xe9ndern|\\\xe9ndert|\\\xe9nderte|\\\xe9nderten|\\\xe9ngstlich|\\\xe9rgere|\\\xe9rgern|\\\xe9rztliche|\\\xe9rztlichen|\\\xe9rztlicher|\\\xe9sthetisch|\\\xe9tzend|\\\xe9ufierst|\\\xe9ufiersten|\\\xe9uflserst|\\\ufb02atterndem|\\\ufb02el|\\\ufb02iehen|\\\ufb02jr|\\\ufb02lhlen|\\\ufb02lllen|\\\ufb02lr|\\\ufb02lrchterlich|\\\ufb02ndet|AIle|AIter|GI\\\xfcck|PIaystation|AIIes|AIso|Ouatsch|AIles|BIeib|KIaut|AIlah|PIan|oderjemand|liestjetzt)(\\b|$)"}}, - 'eng': {'BeginLines': {'data': OrderedDict([(u'lgot it', u'I got it'), (u'Don,t ', u"Don't "), (u'Can,t ', u"Can't "), (u'Let,s ', u"Let's "), (u'He,s ', u"He's "), (u'I,m ', u"I'm "), (u'I,ve ', u"I've "), (u'I,ll ', u"I'll "), (u'You,ll ', u"You'll "), (u'T hey ', u'They '), (u'T here ', u'There '), (u'W here ', u'Where '), (u'M aybe ', u'Maybe '), (u'S hould ', u'Should '), (u'|was', u'I was'), (u'|am ', u'I am'), (u'No w, ', u'Now, '), (u'l... I ', u'I... I '), (u'L... I ', u'I... I '), (u'lrn gonna', u"I'm gonna"), (u"-l don't", u"-I don't"), (u"l don't", u"I don't"), (u'L ', u'I '), (u'-L ', u'-I '), (u'- L ', u'- I '), (u'-l ', u'-I '), (u'- l ', u'- I '), (u'G0', u'Go'), (u'GO get', u'Go get'), (u'GO to', u'Go to'), (u'GO for', u'Go for'), (u'Ifl', u'If I'), (u"lt'll", u"It'll"), (u"Lt'll", u"It'll"), (u'IVIa', u'Ma'), (u'IVIu', u'Mu'), (u'0ne', u'One'), (u'0nly', u'Only'), (u'0n ', u'On '), (u'lt ', u'It '), (u'Lt ', u'It '), (u"lt's ", u"It's "), (u"Lt's ", u"It's "), (u'ln ', u'In '), (u'Ln ', u'In '), (u'l-in ', u'I-in '), (u'l-impossible', u'I-impossible'), (u'l- impossible', u'I-impossible'), (u'L- impossible', u'I-impossible'), (u"l-isn't ", u"I-isn't "), (u"L-isn't ", u"I-isn't "), (u"l- isn't ", u"I-isn't "), (u"L- isn't ", u"I-isn't "), (u'l- l ', u'I-I '), (u'L- l ', u'I-I '), (u'l- it ', u'I-it '), (u'L- it ', u'I-it '), (u'Ls it ', u'Is it '), (u'Ls there ', u'Is there '), (u'Ls he ', u'Is he '), (u'Ls she ', u'Is she '), (u'L can', u'I can'), (u'l can', u'I can'), (u"L'm ", u"I'm "), (u"L' m ", u"I'm "), (u"Lt' s ", u"It's "), (u"I']I ", u"I'll "), (u'...ls ', u'...Is '), (u'- ls ', u'- Is '), (u'...l ', u'...I '), (u'Ill ', u"I'll "), (u'L hope ', u'I hope '), (u"|\u2019E'$ ", u"It's "), (u"The y're ", u"They're "), (u'/ ', u'I '), (u'/ ', u'I '), (u'/n ', u'In '), (u'/n ', u'In '), (u'Ana\u2019 ', u'And '), (u"Ana' ", u'And '), (u'~ ', u'- '), (u"A'|'|'EN BOROUGH:", u'ATTENBOROUGH:'), (u"A'|'|'EN BOROUGH:", u'ATTENBOROUGH:'), (u"DAVID A'|'|'EN BOROUGH:", u'DAVID ATTENBOROUGH:'), (u"AT|'EN BOROUGH:", u'ATTENBOROUGH:'), (u"DAVID AT|'EN BOROUGH:", u'DAVID ATTENBOROUGH:'), (u"AT|'EN BOROUGH:", u'ATTENBOROUGH:'), (u'TH REE ', u'THREE '), (u'NARRA TOR', u'NARRATOR'), (u'NARRA TOR', u'NARRATOR'), (u"lt'syour", u"It's your"), (u"It'syour", u"It's your"), (u'Ls ', u'Is '), (u'l ', u'I ')]), - 'pattern': u"(?um)^(?:lgot\\ it|Don\\,t\\ |Can\\,t\\ |Let\\,s\\ |He\\,s\\ |I\\,m\\ |I\\,ve\\ |I\\,ll\\ |You\\,ll\\ |T\\ hey\\ |T\\ here\\ |W\\ here\\ |M\\ aybe\\ |S\\ hould\\ |\\|was|\\|am\\ |No\\ w\\,\\ |l\\.\\.\\.\\ I\\ |L\\.\\.\\.\\ I\\ |lrn\\ gonna|\\-l\\ don\\'t|l\\ don\\'t|L\\ |\\-L\\ |\\-\\ L\\ |\\-l\\ |\\-\\ l\\ |G0|GO\\ get|GO\\ to|GO\\ for|Ifl|lt\\'ll|Lt\\'ll|IVIa|IVIu|0ne|0nly|0n\\ |lt\\ |Lt\\ |lt\\'s\\ |Lt\\'s\\ |ln\\ |Ln\\ |l\\-in\\ |l\\-impossible|l\\-\\ impossible|L\\-\\ impossible|l\\-isn\\'t\\ |L\\-isn\\'t\\ |l\\-\\ isn\\'t\\ |L\\-\\ isn\\'t\\ |l\\-\\ l\\ |L\\-\\ l\\ |l\\-\\ it\\ |L\\-\\ it\\ |Ls\\ it\\ |Ls\\ there\\ |Ls\\ he\\ |Ls\\ she\\ |L\\ can|l\\ can|L\\'m\\ |L\\'\\ m\\ |Lt\\'\\ s\\ |I\\'\\]I\\ |\\.\\.\\.ls\\ |\\-\\ ls\\ |\\.\\.\\.l\\ |Ill\\ |L\\ hope\\ |\\|\\\u2019E\\'\\$\\ |The\\ y\\'re\\ |\\\\/\\ |\\/\\ |\\\\/n\\ |\\/n\\ |\\Ana\\\u2019\\ |\\Ana\\'\\ |\\~\\ |\\A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|DAVID\\ A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|AT\\|\\'EN\\ BOROUGH\\:|DAVID\\ AT\\|\\'EN\\ BOROUGH\\:|\\AT\\|\\'EN\\ BOROUGH\\:|TH\\ REE\\ |NARRA\\ TOR|\\NARRA\\ TOR|lt\\'syour|It\\'syour|Ls\\ |l\\ )"}, - 'EndLines': {'data': OrderedDict([(u', sin', u', sir.'), (u' mothen', u' mother.'), (u" can't_", u" can't."), (u' openiL', u' open it.'), (u' of\ufb02', u' off!'), (u'pshycol', u'psycho!')]), - 'pattern': u"(?um)(?:\\,\\ sin|\\ mothen|\\ can\\'t\\_|\\ openiL|\\ of\\\ufb02|pshycol)$"}, - 'PartialLines': {'data': OrderedDict([(u' /be ', u' I be '), (u" aren '1'", u" aren't"), (u" aren'tyou", u" aren't you"), (u" doesn '1'", u" doesn't"), (u" fr/eno'", u' friend'), (u" fr/eno'.", u' friend.'), (u" haven 'z' ", u" haven't "), (u" haven 'z'.", u" haven't."), (u' I ha ve ', u' I have '), (u" I']I ", u" I'll "), (u' L am', u' I am'), (u' L can', u' I can'), (u" L don't ", u" I don't "), (u' L hate ', u' I hate '), (u' L have ', u' I have '), (u' L like ', u' I like '), (u' L will', u' I will'), (u' L would', u' I would'), (u" L'll ", u" I'll "), (u" L've ", u" I've "), (u' m y family', u' my family'), (u" 's ", u"'s "), (u" shou/dn '1 ", u" shouldn't "), (u" won 'z' ", u" won't "), (u" won 'z'.", u" won't."), (u" wou/c/n 'z' ", u" wouldn't "), (u" wou/c/n 'z'.", u" wouldn't."), (u" wou/dn 'z' ", u" wouldn't "), (u" wou/dn 'z'.", u" wouldn't."), (u'/ did', u'I did'), (u'/ have ', u'I have '), (u'/ just ', u'I just '), (u'/ loved ', u'I loved '), (u'/ need', u'I need'), (u'|was11', u'I was 11'), (u'at Hrst', u'at first'), (u"B ullshiz'", u'Bullshit'), (u'big lunk', u'love you'), (u"can 't", u"can't"), (u"can' t ", u"can't "), (u"can 't ", u"can't "), (u'CHA TTERING', u'CHATTERING'), (u'come 0n', u'come on'), (u'Come 0n', u'Come on'), (u"couldn 't", u"couldn't"), (u"couldn' t ", u"couldn't "), (u"couldn 't ", u"couldn't "), (u"Destin y's", u"Destiny's"), (u"didn 't", u"didn't"), (u"didn' t ", u"didn't "), (u"didn 't ", u"didn't "), (u"Doesn '1'", u"Doesn't"), (u"doesn '1' ", u"doesn't "), (u"doesn '1\u2018 ", u"doesn't "), (u"doesn 't", u"doesn't"), (u"doesn'1' ", u"doesn't "), (u"doesn'1\u2018 ", u"doesn't "), (u"don '1' ", u"don't "), (u"don '1\u2018 ", u"don't "), (u"don '2' ", u"don't "), (u" aren '2'", u" aren't"), (u"aren '2' ", u"aren't "), (u"don '2\u2018 ", u"don't "), (u"don 't", u"don't"), (u"Don' t ", u"Don't "), (u"Don 't ", u"Don't "), (u"don'1' ", u"don't "), (u"don'1\u2018 ", u"don't "), (u"there '5 ", u"there's "), (u'E very', u'Every'), (u'get 0n', u'get on'), (u'go 0n', u'go on'), (u'Go 0n', u'Go on'), (u"H3993' birthday", u'Happy birthday'), (u"hadn 't", u"hadn't"), (u"he 's", u"he's"), (u"He 's", u"He's"), (u'He y', u'Hey'), (u'he)/', u'hey'), (u'He)/', u'Hey'), (u'HEA VY', u'HEAVY'), (u'Hold 0n', u'Hold on'), (u'I am. ls', u'I am. Is'), (u'I d0', u'I do'), (u"I 'm", u"I'm"), (u"I 'rn ", u"I'm "), (u"I 've", u"I've"), (u'I0 ve her', u'love her'), (u'I0 ve you', u'love you'), (u"I02'", u'lot'), (u"I'm sony", u"I'm sorry"), (u"isn' t ", u"isn't "), (u"isn 't ", u"isn't "), (u'K)/le', u'Kyle'), (u'L ook', u'Look'), (u'let me 90', u'let me go'), (u'Let me 90', u'Let me go'), (u"let's 90", u"let's go"), (u"Let's 90", u"Let's go"), (u'lfl had', u'If I had'), (u'lova you', u'love you'), (u'Lova you', u'love you'), (u'lovo you', u'love you'), (u'Lovo you', u'love you'), (u'ls anyone', u'Is anyone'), (u'ls he', u'Is he'), (u'-ls he', u'- Is he'), (u'ls it', u'Is it'), (u'-ls it', u'- Is it'), (u'ls she', u'Is she'), (u'-ls she', u'- Is she'), (u'ls that', u'Is that'), (u'-ls that', u'- Is that'), (u'ls this', u'Is this'), (u'-ls this', u'- Is this'), (u'Maze] tov', u'Mazel tov'), (u"N02' ", u'Not '), (u' of 0ur ', u' of our '), (u' ot mine ', u' of mine '), (u'PLA YING', u'PLAYING'), (u'REPEA TING ', u'REPEATING '), (u'Sa y', u'Say'), (u"she 's", u"she's"), (u"She 's", u"She's"), (u"shouldn 't", u"shouldn't"), (u'sta y', u'stay'), (u'Sta y', u'Stay'), (u'SWO rd', u'Sword'), (u'taka care', u'take care'), (u'Taka care', u'Take care'), (u'the Hrst', u'the first'), (u'toc late', u'too late'), (u'uf me', u'of me'), (u'uf our', u'of our'), (u'wa y', u'way'), (u'Wal-I\\/Iart', u'Wal-Mart'), (u"wasn '1' ", u"wasn't "), (u"Wasn '1' ", u"Wasn't "), (u"wasn '1\u2018 ", u"wasn't "), (u"Wasn '1\u2018 ", u"Wasn't "), (u"wasn 't", u"wasn't"), (u"Wasn 't", u"Wasn't"), (u"we 've", u"we've"), (u"We 've", u"We've"), (u"wem' off", u'went off'), (u"weren 't", u"weren't"), (u"who 's", u"who's"), (u"won 't", u"won't"), (u'would ha ve', u'would have '), (u"wouldn 't", u"wouldn't"), (u"Wouldn 't", u"Wouldn't"), (u'y()u', u'you'), (u'you QUYS', u'you guys'), (u"you' re ", u"you're "), (u"you 're ", u"you're "), (u"you 've", u"you've"), (u"You 've", u"You've"), (u"you' ve ", u"you've "), (u"you 've ", u"you've "), (u'aftera while', u'after a while'), (u'Aftera while', u'After a while'), (u'THUN DERCLAPS', u'THUNDERCLAPS'), (u'(BUZZI N G)', u'(BUZZING)'), (u'[BUZZI N G]', u'[BUZZING]'), (u'(G RU NTING', u'(GRUNTING'), (u'[G RU NTING', u'[GRUNTING'), (u'(G ROWLING', u'(GROWLING'), (u'[G ROWLING', u'[GROWLING'), (u' WAI LS)', u'WAILS)'), (u' WAI LS]', u'WAILS]'), (u'(scu RRYING)', u'(SCURRYING)'), (u'[scu RRYING]', u'[SCURRYING]'), (u'(GRUNT5)', u'(GRUNTS)'), (u'[GRUNT5]', u'[GRUNTS]'), (u'NARRA TOR:', u'NARRATOR:'), (u'(GROAN ING', u'(GROANING'), (u'[GROAN ING', u'[GROANING'), (u'GROAN ING)', u'GROANING)'), (u'GROAN ING]', u'GROANING]'), (u'(LAUGH ING', u'(LAUGHING'), (u'[LAUGH ING', u'[LAUGHING'), (u'LAUGH ING)', u'LAUGHING)'), (u'LAUGH ING]', u'LAUGHING]'), (u'(BU BBLING', u'(BUBBLING'), (u'[BU BBLING', u'[BUBBLING'), (u'BU BBLING)', u'BUBBLING)'), (u'BU BBLING]', u'BUBBLING]'), (u'(SH USHING', u'(SHUSHING'), (u'[SH USHING', u'[SHUSHING'), (u'SH USHING)', u'SHUSHING)'), (u'SH USHING]', u'SHUSHING]'), (u'(CH ILDREN', u'(CHILDREN'), (u'[CH ILDREN', u'[CHILDREN'), (u'CH ILDREN)', u'CHILDREN)'), (u'CH ILDREN]', u'CHILDREN]'), (u'(MURMU RING', u'(MURMURING'), (u'[MURMU RING', u'[MURMURING'), (u'MURMU RING)', u'MURMURING)'), (u'MURMU RING]', u'MURMURING]'), (u'(GU N ', u'(GUN '), (u'[GU N ', u'[GUN '), (u'GU N)', u'GUN)'), (u'GU N]', u'GUN]'), (u'CH ILDREN:', u'CHILDREN:'), (u'STU DENTS:', u'STUDENTS:'), (u'(WH ISTLE', u'(WHISTLE'), (u'[WH ISTLE', u'[WHISTLE'), (u'WH ISTLE)', u'WHISTLE)'), (u'WH ISTLE]', u'WHISTLE]'), (u'U LU LATING', u'ULULATING'), (u'AU DIENCE:', u'AUDIENCE:'), (u'HA WAIIAN', u'HAWAIIAN'), (u'(ARTH UR', u'(ARTHUR'), (u'[ARTH UR', u'[ARTHUR'), (u'ARTH UR)', u'ARTHUR)'), (u'ARTH UR]', u'ARTHUR]'), (u'J EREMY:', u'JEREMY:'), (u'(ELEVA TOR', u'(ELEVATOR'), (u'[ELEVA TOR', u'[ELEVATOR'), (u'ELEVA TOR)', u'ELEVATOR)'), (u'ELEVA TOR]', u'ELEVATOR]'), (u'CONTIN U ES', u'CONTINUES'), (u'WIN D HOWLING', u'WIND HOWLING'), (u'telis me', u'tells me'), (u'Telis me', u'Tells me'), (u'. Ls ', u'. Is '), (u'! Ls ', u'! Is '), (u'? Ls ', u'? Is '), (u'. Lt ', u'. It '), (u'! Lt ', u'! It '), (u'? Lt ', u'? It '), (u'SQMEWH ERE ELSE', u'SOMEWHERE ELSE'), (u' I,m ', u" I'm "), (u' I,ve ', u" I've "), (u' you,re ', u" you're "), (u' you,ll ', u" you'll "), (u' doesn,t ', u" doesn't "), (u' let,s ', u" let's "), (u' he,s ', u" he's "), (u' it,s ', u" it's "), (u' can,t ', u" can't "), (u' Can,t ', u" Can't "), (u' don,t ', u" don't "), (u' Don,t ', u" Don't "), (u"wouldn 'tyou", u"wouldn't you"), (u' lgot it', u' I got it'), (u' you,ve ', u" you've "), (u"L don't", u"I don't"), (u"L won't", u"I won't"), (u'L should', u'I should'), (u'L had', u'I had'), (u'L happen', u'I happen'), (u"L wasn't", u"I wasnt't"), (u'H i', u'Hi'), (u"L didn't", u"I didn't"), (u'L do', u'I do'), (u'L could', u'I could'), (u'L will', u'I will'), (u'L suggest', u'I suggest'), (u'L reckon', u'I reckon'), (u'L am', u'I am'), (u"L couldn't", u"I couldn't"), (u'L might', u'I might'), (u'L would', u'I would'), (u'L was', u'I was'), (u'L know', u'I know'), (u'L think', u'I think'), (u"L haven't", u"I haven't"), (u'L have ', u'I have'), (u'L want', u'I want'), (u'L can', u'I can'), (u'L love', u'I love'), (u'L like', u'I like')]), - 'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:\\ \\/be\\ |\\ aren\\ \\'1\\'|\\ aren\\'tyou|\\ doesn\\ \\'1\\'|\\ fr\\/eno\\'|\\ fr\\/eno\\'\\.|\\ haven\\ \\'z\\'\\ |\\ haven\\ \\'z\\'\\.|\\ I\\ ha\\ ve\\ |\\ I\\'\\]I\\ |\\ L\\ am|\\ L\\ can|\\ L\\ don\\'t\\ |\\ L\\ hate\\ |\\ L\\ have\\ |\\ L\\ like\\ |\\ L\\ will|\\ L\\ would|\\ L\\'ll\\ |\\ L\\'ve\\ |\\ m\\ y\\ family|\\ \\'s\\ |\\ shou\\/dn\\ \\'1\\ |\\ won\\ \\'z\\'\\ |\\ won\\ \\'z\\'\\.|\\ wou\\/c\\/n\\ \\'z\\'\\ |\\ wou\\/c\\/n\\ \\'z\\'\\.|\\ wou\\/dn\\ \\'z\\'\\ |\\ wou\\/dn\\ \\'z\\'\\.|\\/\\ did|\\/\\ have\\ |\\/\\ just\\ |\\/\\ loved\\ |\\/\\ need|\\|was11|at\\ Hrst|B\\ ullshiz\\'|big\\ lunk|can\\ \\'t|can\\'\\ t\\ |can\\ \\'t\\ |CHA\\ TTERING|come\\ 0n|Come\\ 0n|couldn\\ \\'t|couldn\\'\\ t\\ |couldn\\ \\'t\\ |Destin\\ y\\'s|didn\\ \\'t|didn\\'\\ t\\ |didn\\ \\'t\\ |Doesn\\ \\'1\\'|doesn\\ \\'1\\'\\ |doesn\\ \\'1\\\u2018\\ |doesn\\ \\'t|doesn\\'1\\'\\ |doesn\\'1\\\u2018\\ |don\\ \\'1\\'\\ |don\\ \\'1\\\u2018\\ |don\\ \\'2\\'\\ |\\ aren\\ \\'2\\'|aren\\ \\'2\\'\\ |don\\ \\'2\\\u2018\\ |don\\ \\'t|Don\\'\\ t\\ |Don\\ \\'t\\ |don\\'1\\'\\ |don\\'1\\\u2018\\ |there\\ \\'5\\ |E\\ very|get\\ 0n|go\\ 0n|Go\\ 0n|H3993\\'\\ birthday|hadn\\ \\'t|he\\ \\'s|He\\ \\'s|He\\ y|he\\)\\/|He\\)\\/|HEA\\ VY|Hold\\ 0n|I\\ am\\.\\ ls|I\\ d0|I\\ \\'m|I\\ \\'rn\\ |I\\ \\'ve|I0\\ ve\\ her|I0\\ ve\\ you|I02\\'|I\\'m\\ sony|isn\\'\\ t\\ |isn\\ \\'t\\ |K\\)\\/le|L\\ ook|let\\ me\\ 90|Let\\ me\\ 90|let\\'s\\ 90|Let\\'s\\ 90|lfl\\ had|lova\\ you|Lova\\ you|lovo\\ you|Lovo\\ you|ls\\ anyone|ls\\ he|\\-ls\\ he|ls\\ it|\\-ls\\ it|ls\\ she|\\-ls\\ she|ls\\ that|\\-ls\\ that|ls\\ this|\\-ls\\ this|Maze\\]\\ tov|N02\\'\\ |\\ of\\ 0ur\\ |\\ ot\\ mine\\ |PLA\\ YING|REPEA\\ TING\\ |Sa\\ y|she\\ \\'s|She\\ \\'s|shouldn\\ \\'t|sta\\ y|Sta\\ y|SWO\\ rd|taka\\ care|Taka\\ care|the\\ Hrst|toc\\ late|uf\\ me|uf\\ our|wa\\ y|Wal\\-I\\\\\\/Iart|wasn\\ \\'1\\'\\ |Wasn\\ \\'1\\'\\ |wasn\\ \\'1\\\u2018\\ |Wasn\\ \\'1\\\u2018\\ |wasn\\ \\'t|Wasn\\ \\'t|we\\ \\'ve|We\\ \\'ve|wem\\'\\ off|weren\\ \\'t|who\\ \\'s|won\\ \\'t|would\\ ha\\ ve|wouldn\\ \\'t|Wouldn\\ \\'t|y\\(\\)u|you\\ QUYS|you\\'\\ re\\ |you\\ \\'re\\ |you\\ \\'ve|You\\ \\'ve|you\\'\\ ve\\ |you\\ \\'ve\\ |aftera\\ while|Aftera\\ while|THUN\\ DERCLAPS|\\(BUZZI\\ N\\ G\\)|\\[BUZZI\\ N\\ G\\]|\\(G\\ RU\\ NTING|\\[G\\ RU\\ NTING|\\(G\\ ROWLING|\\[G\\ ROWLING|\\ WAI\\ LS\\)|\\ WAI\\ LS\\]|\\(scu\\ RRYING\\)|\\[scu\\ RRYING\\]|\\(GRUNT5\\)|\\[GRUNT5\\]|NARRA\\ TOR\\:|\\(GROAN\\ ING|\\[GROAN\\ ING|GROAN\\ ING\\)|GROAN\\ ING\\]|\\(LAUGH\\ ING|\\[LAUGH\\ ING|LAUGH\\ ING\\)|LAUGH\\ ING\\]|\\(BU\\ BBLING|\\[BU\\ BBLING|BU\\ BBLING\\)|BU\\ BBLING\\]|\\(SH\\ USHING|\\[SH\\ USHING|SH\\ USHING\\)|SH\\ USHING\\]|\\(CH\\ ILDREN|\\[CH\\ ILDREN|CH\\ ILDREN\\)|CH\\ ILDREN\\]|\\(MURMU\\ RING|\\[MURMU\\ RING|MURMU\\ RING\\)|MURMU\\ RING\\]|\\(GU\\ N\\ |\\[GU\\ N\\ |GU\\ N\\)|GU\\ N\\]|CH\\ ILDREN\\:|STU\\ DENTS\\:|\\(WH\\ ISTLE|\\[WH\\ ISTLE|WH\\ ISTLE\\)|WH\\ ISTLE\\]|U\\ LU\\ LATING|AU\\ DIENCE\\:|HA\\ WAIIAN|\\(ARTH\\ UR|\\[ARTH\\ UR|ARTH\\ UR\\)|ARTH\\ UR\\]|J\\ EREMY\\:|\\(ELEVA\\ TOR|\\[ELEVA\\ TOR|ELEVA\\ TOR\\)|ELEVA\\ TOR\\]|CONTIN\\ U\\ ES|WIN\\ D\\ HOWLING|telis\\ me|Telis\\ me|\\.\\ Ls\\ |\\!\\ Ls\\ |\\?\\ Ls\\ |\\.\\ Lt\\ |\\!\\ Lt\\ |\\?\\ Lt\\ |SQMEWH\\ ERE\\ ELSE|\\ I\\,m\\ |\\ I\\,ve\\ |\\ you\\,re\\ |\\ you\\,ll\\ |\\ doesn\\,t\\ |\\ let\\,s\\ |\\ he\\,s\\ |\\ it\\,s\\ |\\ can\\,t\\ |\\ Can\\,t\\ |\\ don\\,t\\ |\\ Don\\,t\\ |wouldn\\ \\'tyou|\\ lgot\\ it|\\ you\\,ve\\ |L\\ don\\'t|L\\ won\\'t|L\\ should|L\\ had|L\\ happen|L\\ wasn\\'t|H\\ i|L\\ didn\\'t|L\\ do|L\\ could|L\\ will|L\\ suggest|L\\ reckon|L\\ am|L\\ couldn\\'t|L\\ might|L\\ would|L\\ was|L\\ know|L\\ think|L\\ haven\\'t|L\\ have\\ |L\\ want|L\\ can|L\\ love|L\\ like)(?:(?=\\s)|(?=$)|(?=\\b))"}, + 'eng': {'BeginLines': {'data': OrderedDict([(u'lgot it', u'I got it'), (u'Don,t ', u"Don't "), (u'Can,t ', u"Can't "), (u'Let,s ', u"Let's "), (u'He,s ', u"He's "), (u'I,m ', u"I'm "), (u'I,ve ', u"I've "), (u'I,ll ', u"I'll "), (u'You,ll ', u"You'll "), (u'T hey ', u'They '), (u'T here ', u'There '), (u'W here ', u'Where '), (u'M aybe ', u'Maybe '), (u'S hould ', u'Should '), (u'|was', u'I was'), (u'|am ', u'I am'), (u'No w, ', u'Now, '), (u'l... I ', u'I... I '), (u'L... I ', u'I... I '), (u'lrn gonna', u"I'm gonna"), (u"-l don't", u"-I don't"), (u"l don't", u"I don't"), (u'L ', u'I '), (u'-L ', u'-I '), (u'- L ', u'- I '), (u'-l ', u'-I '), (u'- l ', u'- I '), (u'G0', u'Go'), (u'GO get', u'Go get'), (u'GO to', u'Go to'), (u'GO for', u'Go for'), (u'Ifl', u'If I'), (u"lt'll", u"It'll"), (u"Lt'll", u"It'll"), (u'IVIa', u'Ma'), (u'IVIu', u'Mu'), (u'0ne', u'One'), (u'0nly', u'Only'), (u'0n ', u'On '), (u'lt ', u'It '), (u'Lt ', u'It '), (u"lt's ", u"It's "), (u"Lt's ", u"It's "), (u'ln ', u'In '), (u'Ln ', u'In '), (u'l-in ', u'I-in '), (u'l-impossible', u'I-impossible'), (u'l- impossible', u'I-impossible'), (u'L- impossible', u'I-impossible'), (u"l-isn't ", u"I-isn't "), (u"L-isn't ", u"I-isn't "), (u"l- isn't ", u"I-isn't "), (u"L- isn't ", u"I-isn't "), (u'l- l ', u'I-I '), (u'L- l ', u'I-I '), (u'l- it ', u'I-it '), (u'L- it ', u'I-it '), (u'Ls it ', u'Is it '), (u'Ls there ', u'Is there '), (u'Ls he ', u'Is he '), (u'Ls she ', u'Is she '), (u'L can', u'I can'), (u'l can', u'I can'), (u"L'm ", u"I'm "), (u"L' m ", u"I'm "), (u"Lt' s ", u"It's "), (u"I']I ", u"I'll "), (u'...ls ', u'...Is '), (u'- ls ', u'- Is '), (u'...l ', u'...I '), (u'Ill ', u"I'll "), (u'L hope ', u'I hope '), (u"|\u2019E'$ ", u"It's "), (u"The y're ", u"They're "), (u'/ ', u'I '), (u'/ ', u'I '), (u'/n ', u'In '), (u'/n ', u'In '), (u'Ana\u2019 ', u'And '), (u"Ana' ", u'And '), (u'~ ', u'- '), (u"A'|'|'EN BOROUGH:", u'ATTENBOROUGH:'), (u"A'|'|'EN BOROUGH:", u'ATTENBOROUGH:'), (u"DAVID A'|'|'EN BOROUGH:", u'DAVID ATTENBOROUGH:'), (u"AT|'EN BOROUGH:", u'ATTENBOROUGH:'), (u"DAVID AT|'EN BOROUGH:", u'DAVID ATTENBOROUGH:'), (u"AT|'EN BOROUGH:", u'ATTENBOROUGH:'), (u'TH REE ', u'THREE '), (u'NARRA TOR', u'NARRATOR'), (u'NARRA TOR', u'NARRATOR'), (u"lt'syour", u"It's your"), (u"It'syour", u"It's your"), (u'Ls ', u'Is '), (u'I ve ', u"I've "), (u'I ii ', u"I'll "), (u'I m ', u"I'm "), (u'Why d ', u"Why'd "), (u'why d ', u"Why'd "), (u'Couldn t ', u"Couldn't "), (u'couldn t ', u"Couldn't "), (u'That s ', u"That's "), (u'that s ', u"That's "), (u'l ', u'I ')]), + 'pattern': u"(?um)^(?:lgot\\ it|Don\\,t\\ |Can\\,t\\ |Let\\,s\\ |He\\,s\\ |I\\,m\\ |I\\,ve\\ |I\\,ll\\ |You\\,ll\\ |T\\ hey\\ |T\\ here\\ |W\\ here\\ |M\\ aybe\\ |S\\ hould\\ |\\|was|\\|am\\ |No\\ w\\,\\ |l\\.\\.\\.\\ I\\ |L\\.\\.\\.\\ I\\ |lrn\\ gonna|\\-l\\ don\\'t|l\\ don\\'t|L\\ |\\-L\\ |\\-\\ L\\ |\\-l\\ |\\-\\ l\\ |G0|GO\\ get|GO\\ to|GO\\ for|Ifl|lt\\'ll|Lt\\'ll|IVIa|IVIu|0ne|0nly|0n\\ |lt\\ |Lt\\ |lt\\'s\\ |Lt\\'s\\ |ln\\ |Ln\\ |l\\-in\\ |l\\-impossible|l\\-\\ impossible|L\\-\\ impossible|l\\-isn\\'t\\ |L\\-isn\\'t\\ |l\\-\\ isn\\'t\\ |L\\-\\ isn\\'t\\ |l\\-\\ l\\ |L\\-\\ l\\ |l\\-\\ it\\ |L\\-\\ it\\ |Ls\\ it\\ |Ls\\ there\\ |Ls\\ he\\ |Ls\\ she\\ |L\\ can|l\\ can|L\\'m\\ |L\\'\\ m\\ |Lt\\'\\ s\\ |I\\'\\]I\\ |\\.\\.\\.ls\\ |\\-\\ ls\\ |\\.\\.\\.l\\ |Ill\\ |L\\ hope\\ |\\|\\\u2019E\\'\\$\\ |The\\ y\\'re\\ |\\\\/\\ |\\/\\ |\\\\/n\\ |\\/n\\ |\\Ana\\\u2019\\ |\\Ana\\'\\ |\\~\\ |\\A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|DAVID\\ A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|AT\\|\\'EN\\ BOROUGH\\:|DAVID\\ AT\\|\\'EN\\ BOROUGH\\:|\\AT\\|\\'EN\\ BOROUGH\\:|TH\\ REE\\ |NARRA\\ TOR|\\NARRA\\ TOR|lt\\'syour|It\\'syour|Ls\\ |I\\ ve\\ |I\\ ii\\ |I\\ m\\ |Why\\ d\\ |why\\ d\\ |Couldn\\ t\\ |couldn\\ t\\ |That\\ s\\ |that\\ s\\ |l\\ )"}, + 'EndLines': {'data': OrderedDict([(u', sin', u', sir.'), (u' mothen', u' mother.'), (u" can't_", u" can't."), (u' openiL', u' open it.'), (u' of\ufb02', u' off!'), (u'pshycol', u'psycho!'), (u' i...', u' I...'), (u' L.', u' I.')]), + 'pattern': u"(?um)(?:\\,\\ sin|\\ mothen|\\ can\\'t\\_|\\ openiL|\\ of\\\ufb02|pshycol|\\ i\\.\\.\\.|\\ L\\.)$"}, + 'PartialLines': {'data': OrderedDict([(u' /be ', u' I be '), (u" aren '1'", u" aren't"), (u" aren'tyou", u" aren't you"), (u" doesn '1'", u" doesn't"), (u" fr/eno'", u' friend'), (u" fr/eno'.", u' friend.'), (u" haven 'z' ", u" haven't "), (u" haven 'z'.", u" haven't."), (u' I ha ve ', u' I have '), (u" I']I ", u" I'll "), (u' L am', u' I am'), (u' L can', u' I can'), (u" L don't ", u" I don't "), (u' L hate ', u' I hate '), (u' L have ', u' I have '), (u' L like ', u' I like '), (u' L will', u' I will'), (u' L would', u' I would'), (u" L'll ", u" I'll "), (u" L've ", u" I've "), (u' m y family', u' my family'), (u" 's ", u"'s "), (u" shou/dn '1 ", u" shouldn't "), (u" won 'z' ", u" won't "), (u" won 'z'.", u" won't."), (u" wou/c/n 'z' ", u" wouldn't "), (u" wou/c/n 'z'.", u" wouldn't."), (u" wou/dn 'z' ", u" wouldn't "), (u" wou/dn 'z'.", u" wouldn't."), (u'/ did', u'I did'), (u'/ have ', u'I have '), (u'/ just ', u'I just '), (u'/ loved ', u'I loved '), (u'/ need', u'I need'), (u'|was11', u'I was 11'), (u'at Hrst', u'at first'), (u"B ullshiz'", u'Bullshit'), (u'big lunk', u'love you'), (u"can 't", u"can't"), (u"can' t ", u"can't "), (u"can 't ", u"can't "), (u'CHA TTERING', u'CHATTERING'), (u'come 0n', u'come on'), (u'Come 0n', u'Come on'), (u"couldn 't", u"couldn't"), (u"couldn' t ", u"couldn't "), (u"couldn 't ", u"couldn't "), (u"Destin y's", u"Destiny's"), (u"didn 't", u"didn't"), (u"didn' t ", u"didn't "), (u"didn 't ", u"didn't "), (u"Doesn '1'", u"Doesn't"), (u"doesn '1' ", u"doesn't "), (u"doesn '1\u2018 ", u"doesn't "), (u"doesn 't", u"doesn't"), (u"doesn'1' ", u"doesn't "), (u"doesn'1\u2018 ", u"doesn't "), (u"don '1' ", u"don't "), (u"don '1\u2018 ", u"don't "), (u"don '2' ", u"don't "), (u" aren '2'", u" aren't"), (u"aren '2' ", u"aren't "), (u"don '2\u2018 ", u"don't "), (u"don 't", u"don't"), (u"Don' t ", u"Don't "), (u"Don 't ", u"Don't "), (u"don'1' ", u"don't "), (u"don'1\u2018 ", u"don't "), (u"there '5 ", u"there's "), (u'E very', u'Every'), (u'get 0n', u'get on'), (u'go 0n', u'go on'), (u'Go 0n', u'Go on'), (u"H3993' birthday", u'Happy birthday'), (u"hadn 't", u"hadn't"), (u"he 's", u"he's"), (u"He 's", u"He's"), (u'He y', u'Hey'), (u'he)/', u'hey'), (u'He)/', u'Hey'), (u'HEA VY', u'HEAVY'), (u'Henry ll', u'Henry II'), (u'Henry lll', u'Henry III'), (u'Henry Vlll', u'Henry VIII'), (u'Henry Vll', u'Henry VII'), (u'Henry Vl', u'Henry VI'), (u'Hold 0n', u'Hold on'), (u'I am. ls', u'I am. Is'), (u'I d0', u'I do'), (u"I 'm", u"I'm"), (u"I 'rn ", u"I'm "), (u"I 've", u"I've"), (u'I0 ve her', u'love her'), (u'I0 ve you', u'love you'), (u"I02'", u'lot'), (u"I'm sony", u"I'm sorry"), (u"isn' t ", u"isn't "), (u"isn 't ", u"isn't "), (u'K)/le', u'Kyle'), (u'L ook', u'Look'), (u'let me 90', u'let me go'), (u'Let me 90', u'Let me go'), (u"let's 90", u"let's go"), (u"Let's 90", u"Let's go"), (u'lfl had', u'If I had'), (u'lova you', u'love you'), (u'Lova you', u'love you'), (u'lovo you', u'love you'), (u'Lovo you', u'love you'), (u'ls anyone', u'Is anyone'), (u'ls he', u'Is he'), (u'-ls he', u'- Is he'), (u'ls it', u'Is it'), (u'-ls it', u'- Is it'), (u'ls she', u'Is she'), (u'-ls she', u'- Is she'), (u'ls that', u'Is that'), (u'-ls that', u'- Is that'), (u'ls this', u'Is this'), (u'-ls this', u'- Is this'), (u'Maze] tov', u'Mazel tov'), (u"N02' ", u'Not '), (u' of 0ur ', u' of our '), (u' ot mine ', u' of mine '), (u'PLA YING', u'PLAYING'), (u'REPEA TING ', u'REPEATING '), (u'Sa y', u'Say'), (u"she 's", u"she's"), (u"She 's", u"She's"), (u"shouldn 't", u"shouldn't"), (u'sta y', u'stay'), (u'Sta y', u'Stay'), (u'SWO rd', u'Sword'), (u'taka care', u'take care'), (u'Taka care', u'Take care'), (u'the Hrst', u'the first'), (u'toc late', u'too late'), (u'uf me', u'of me'), (u'uf our', u'of our'), (u'wa y', u'way'), (u'Wal-I\\/Iart', u'Wal-Mart'), (u"wasn '1' ", u"wasn't "), (u"Wasn '1' ", u"Wasn't "), (u"wasn '1\u2018 ", u"wasn't "), (u"Wasn '1\u2018 ", u"Wasn't "), (u"wasn 't", u"wasn't"), (u"Wasn 't", u"Wasn't"), (u"we 've", u"we've"), (u"We 've", u"We've"), (u"wem' off", u'went off'), (u"weren 't", u"weren't"), (u"who 's", u"who's"), (u"won 't", u"won't"), (u'would ha ve', u'would have '), (u"wouldn 't", u"wouldn't"), (u"Wouldn 't", u"Wouldn't"), (u'y()u', u'you'), (u'you QUYS', u'you guys'), (u"you' re ", u"you're "), (u"you 're ", u"you're "), (u"you 've", u"you've"), (u"You 've", u"You've"), (u"you' ve ", u"you've "), (u"you 've ", u"you've "), (u'aftera while', u'after a while'), (u'Aftera while', u'After a while'), (u'THUN DERCLAPS', u'THUNDERCLAPS'), (u'(BUZZI N G)', u'(BUZZING)'), (u'[BUZZI N G]', u'[BUZZING]'), (u'(G RU NTING', u'(GRUNTING'), (u'[G RU NTING', u'[GRUNTING'), (u'(G ROWLING', u'(GROWLING'), (u'[G ROWLING', u'[GROWLING'), (u' WAI LS)', u'WAILS)'), (u' WAI LS]', u'WAILS]'), (u'(scu RRYING)', u'(SCURRYING)'), (u'[scu RRYING]', u'[SCURRYING]'), (u'(GRUNT5)', u'(GRUNTS)'), (u'[GRUNT5]', u'[GRUNTS]'), (u'NARRA TOR:', u'NARRATOR:'), (u'(GROAN ING', u'(GROANING'), (u'[GROAN ING', u'[GROANING'), (u'GROAN ING)', u'GROANING)'), (u'GROAN ING]', u'GROANING]'), (u'(LAUGH ING', u'(LAUGHING'), (u'[LAUGH ING', u'[LAUGHING'), (u'LAUGH ING)', u'LAUGHING)'), (u'LAUGH ING]', u'LAUGHING]'), (u'(BU BBLING', u'(BUBBLING'), (u'[BU BBLING', u'[BUBBLING'), (u'BU BBLING)', u'BUBBLING)'), (u'BU BBLING]', u'BUBBLING]'), (u'(SH USHING', u'(SHUSHING'), (u'[SH USHING', u'[SHUSHING'), (u'SH USHING)', u'SHUSHING)'), (u'SH USHING]', u'SHUSHING]'), (u'(CH ILDREN', u'(CHILDREN'), (u'[CH ILDREN', u'[CHILDREN'), (u'CH ILDREN)', u'CHILDREN)'), (u'CH ILDREN]', u'CHILDREN]'), (u'(MURMU RING', u'(MURMURING'), (u'[MURMU RING', u'[MURMURING'), (u'MURMU RING)', u'MURMURING)'), (u'MURMU RING]', u'MURMURING]'), (u'(GU N ', u'(GUN '), (u'[GU N ', u'[GUN '), (u'GU N)', u'GUN)'), (u'GU N]', u'GUN]'), (u'CH ILDREN:', u'CHILDREN:'), (u'STU DENTS:', u'STUDENTS:'), (u'(WH ISTLE', u'(WHISTLE'), (u'[WH ISTLE', u'[WHISTLE'), (u'WH ISTLE)', u'WHISTLE)'), (u'WH ISTLE]', u'WHISTLE]'), (u'U LU LATING', u'ULULATING'), (u'AU DIENCE:', u'AUDIENCE:'), (u'HA WAIIAN', u'HAWAIIAN'), (u'(ARTH UR', u'(ARTHUR'), (u'[ARTH UR', u'[ARTHUR'), (u'ARTH UR)', u'ARTHUR)'), (u'ARTH UR]', u'ARTHUR]'), (u'J EREMY:', u'JEREMY:'), (u'(ELEVA TOR', u'(ELEVATOR'), (u'[ELEVA TOR', u'[ELEVATOR'), (u'ELEVA TOR)', u'ELEVATOR)'), (u'ELEVA TOR]', u'ELEVATOR]'), (u'CONTIN U ES', u'CONTINUES'), (u'WIN D HOWLING', u'WIND HOWLING'), (u'telis me', u'tells me'), (u'Telis me', u'Tells me'), (u'. Ls ', u'. Is '), (u'! Ls ', u'! Is '), (u'? Ls ', u'? Is '), (u'. Lt ', u'. It '), (u'! Lt ', u'! It '), (u'? Lt ', u'? It '), (u'SQMEWH ERE ELSE', u'SOMEWHERE ELSE'), (u' I,m ', u" I'm "), (u' I,ve ', u" I've "), (u' you,re ', u" you're "), (u' you,ll ', u" you'll "), (u' doesn,t ', u" doesn't "), (u' let,s ', u" let's "), (u' he,s ', u" he's "), (u' it,s ', u" it's "), (u' can,t ', u" can't "), (u' Can,t ', u" Can't "), (u' don,t ', u" don't "), (u' Don,t ', u" Don't "), (u"wouldn 'tyou", u"wouldn't you"), (u' lgot it', u' I got it'), (u' you,ve ', u" you've "), (u' I ve ', u" I've "), (u' I ii ', u" I'll "), (u' I m ', u" I'm "), (u' why d ', u" why'd "), (u' couldn t ', u" couldn't "), (u' that s ', u" that's "), (u' i... ', u' I... '), (u"L don't", u"I don't"), (u"L won't", u"I won't"), (u'L should', u'I should'), (u'L had', u'I had'), (u'L happen', u'I happen'), (u"L wasn't", u"I wasnt't"), (u'H i', u'Hi'), (u"L didn't", u"I didn't"), (u'L do', u'I do'), (u'L could', u'I could'), (u'L will', u'I will'), (u'L suggest', u'I suggest'), (u'L reckon', u'I reckon'), (u'L am', u'I am'), (u"L couldn't", u"I couldn't"), (u'L might', u'I might'), (u'L would', u'I would'), (u'L was', u'I was'), (u'L know', u'I know'), (u'L think', u'I think'), (u"L haven't", u"I haven't"), (u'L have ', u'I have'), (u'L want', u'I want'), (u'L can', u'I can'), (u'L love', u'I love'), (u'L like', u'I like')]), + 'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:\\ \\/be\\ |\\ aren\\ \\'1\\'|\\ aren\\'tyou|\\ doesn\\ \\'1\\'|\\ fr\\/eno\\'|\\ fr\\/eno\\'\\.|\\ haven\\ \\'z\\'\\ |\\ haven\\ \\'z\\'\\.|\\ I\\ ha\\ ve\\ |\\ I\\'\\]I\\ |\\ L\\ am|\\ L\\ can|\\ L\\ don\\'t\\ |\\ L\\ hate\\ |\\ L\\ have\\ |\\ L\\ like\\ |\\ L\\ will|\\ L\\ would|\\ L\\'ll\\ |\\ L\\'ve\\ |\\ m\\ y\\ family|\\ \\'s\\ |\\ shou\\/dn\\ \\'1\\ |\\ won\\ \\'z\\'\\ |\\ won\\ \\'z\\'\\.|\\ wou\\/c\\/n\\ \\'z\\'\\ |\\ wou\\/c\\/n\\ \\'z\\'\\.|\\ wou\\/dn\\ \\'z\\'\\ |\\ wou\\/dn\\ \\'z\\'\\.|\\/\\ did|\\/\\ have\\ |\\/\\ just\\ |\\/\\ loved\\ |\\/\\ need|\\|was11|at\\ Hrst|B\\ ullshiz\\'|big\\ lunk|can\\ \\'t|can\\'\\ t\\ |can\\ \\'t\\ |CHA\\ TTERING|come\\ 0n|Come\\ 0n|couldn\\ \\'t|couldn\\'\\ t\\ |couldn\\ \\'t\\ |Destin\\ y\\'s|didn\\ \\'t|didn\\'\\ t\\ |didn\\ \\'t\\ |Doesn\\ \\'1\\'|doesn\\ \\'1\\'\\ |doesn\\ \\'1\\\u2018\\ |doesn\\ \\'t|doesn\\'1\\'\\ |doesn\\'1\\\u2018\\ |don\\ \\'1\\'\\ |don\\ \\'1\\\u2018\\ |don\\ \\'2\\'\\ |\\ aren\\ \\'2\\'|aren\\ \\'2\\'\\ |don\\ \\'2\\\u2018\\ |don\\ \\'t|Don\\'\\ t\\ |Don\\ \\'t\\ |don\\'1\\'\\ |don\\'1\\\u2018\\ |there\\ \\'5\\ |E\\ very|get\\ 0n|go\\ 0n|Go\\ 0n|H3993\\'\\ birthday|hadn\\ \\'t|he\\ \\'s|He\\ \\'s|He\\ y|he\\)\\/|He\\)\\/|HEA\\ VY|Henry\\ ll|Henry\\ lll|Henry\\ Vlll|Henry\\ Vll|Henry\\ Vl|Hold\\ 0n|I\\ am\\.\\ ls|I\\ d0|I\\ \\'m|I\\ \\'rn\\ |I\\ \\'ve|I0\\ ve\\ her|I0\\ ve\\ you|I02\\'|I\\'m\\ sony|isn\\'\\ t\\ |isn\\ \\'t\\ |K\\)\\/le|L\\ ook|let\\ me\\ 90|Let\\ me\\ 90|let\\'s\\ 90|Let\\'s\\ 90|lfl\\ had|lova\\ you|Lova\\ you|lovo\\ you|Lovo\\ you|ls\\ anyone|ls\\ he|\\-ls\\ he|ls\\ it|\\-ls\\ it|ls\\ she|\\-ls\\ she|ls\\ that|\\-ls\\ that|ls\\ this|\\-ls\\ this|Maze\\]\\ tov|N02\\'\\ |\\ of\\ 0ur\\ |\\ ot\\ mine\\ |PLA\\ YING|REPEA\\ TING\\ |Sa\\ y|she\\ \\'s|She\\ \\'s|shouldn\\ \\'t|sta\\ y|Sta\\ y|SWO\\ rd|taka\\ care|Taka\\ care|the\\ Hrst|toc\\ late|uf\\ me|uf\\ our|wa\\ y|Wal\\-I\\\\\\/Iart|wasn\\ \\'1\\'\\ |Wasn\\ \\'1\\'\\ |wasn\\ \\'1\\\u2018\\ |Wasn\\ \\'1\\\u2018\\ |wasn\\ \\'t|Wasn\\ \\'t|we\\ \\'ve|We\\ \\'ve|wem\\'\\ off|weren\\ \\'t|who\\ \\'s|won\\ \\'t|would\\ ha\\ ve|wouldn\\ \\'t|Wouldn\\ \\'t|y\\(\\)u|you\\ QUYS|you\\'\\ re\\ |you\\ \\'re\\ |you\\ \\'ve|You\\ \\'ve|you\\'\\ ve\\ |you\\ \\'ve\\ |aftera\\ while|Aftera\\ while|THUN\\ DERCLAPS|\\(BUZZI\\ N\\ G\\)|\\[BUZZI\\ N\\ G\\]|\\(G\\ RU\\ NTING|\\[G\\ RU\\ NTING|\\(G\\ ROWLING|\\[G\\ ROWLING|\\ WAI\\ LS\\)|\\ WAI\\ LS\\]|\\(scu\\ RRYING\\)|\\[scu\\ RRYING\\]|\\(GRUNT5\\)|\\[GRUNT5\\]|NARRA\\ TOR\\:|\\(GROAN\\ ING|\\[GROAN\\ ING|GROAN\\ ING\\)|GROAN\\ ING\\]|\\(LAUGH\\ ING|\\[LAUGH\\ ING|LAUGH\\ ING\\)|LAUGH\\ ING\\]|\\(BU\\ BBLING|\\[BU\\ BBLING|BU\\ BBLING\\)|BU\\ BBLING\\]|\\(SH\\ USHING|\\[SH\\ USHING|SH\\ USHING\\)|SH\\ USHING\\]|\\(CH\\ ILDREN|\\[CH\\ ILDREN|CH\\ ILDREN\\)|CH\\ ILDREN\\]|\\(MURMU\\ RING|\\[MURMU\\ RING|MURMU\\ RING\\)|MURMU\\ RING\\]|\\(GU\\ N\\ |\\[GU\\ N\\ |GU\\ N\\)|GU\\ N\\]|CH\\ ILDREN\\:|STU\\ DENTS\\:|\\(WH\\ ISTLE|\\[WH\\ ISTLE|WH\\ ISTLE\\)|WH\\ ISTLE\\]|U\\ LU\\ LATING|AU\\ DIENCE\\:|HA\\ WAIIAN|\\(ARTH\\ UR|\\[ARTH\\ UR|ARTH\\ UR\\)|ARTH\\ UR\\]|J\\ EREMY\\:|\\(ELEVA\\ TOR|\\[ELEVA\\ TOR|ELEVA\\ TOR\\)|ELEVA\\ TOR\\]|CONTIN\\ U\\ ES|WIN\\ D\\ HOWLING|telis\\ me|Telis\\ me|\\.\\ Ls\\ |\\!\\ Ls\\ |\\?\\ Ls\\ |\\.\\ Lt\\ |\\!\\ Lt\\ |\\?\\ Lt\\ |SQMEWH\\ ERE\\ ELSE|\\ I\\,m\\ |\\ I\\,ve\\ |\\ you\\,re\\ |\\ you\\,ll\\ |\\ doesn\\,t\\ |\\ let\\,s\\ |\\ he\\,s\\ |\\ it\\,s\\ |\\ can\\,t\\ |\\ Can\\,t\\ |\\ don\\,t\\ |\\ Don\\,t\\ |wouldn\\ \\'tyou|\\ lgot\\ it|\\ you\\,ve\\ |\\ I\\ ve\\ |\\ I\\ ii\\ |\\ I\\ m\\ |\\ why\\ d\\ |\\ couldn\\ t\\ |\\ that\\ s\\ |\\ i\\.\\.\\.\\ |L\\ don\\'t|L\\ won\\'t|L\\ should|L\\ had|L\\ happen|L\\ wasn\\'t|H\\ i|L\\ didn\\'t|L\\ do|L\\ could|L\\ will|L\\ suggest|L\\ reckon|L\\ am|L\\ couldn\\'t|L\\ might|L\\ would|L\\ was|L\\ know|L\\ think|L\\ haven\\'t|L\\ have\\ |L\\ want|L\\ can|L\\ love|L\\ like)(?:(?=\\s)|(?=$)|(?=\\b))"}, 'PartialWordsAlways': {'data': OrderedDict([(u'\xa4', u'o'), (u'lVI', u'M'), (u'IVl', u'M'), (u'lVl', u'M'), (u'I\\/I', u'M'), (u'l\\/I', u'M'), (u'I\\/l', u'M'), (u'l\\/l', u'M'), (u'IVIa', u'Ma'), (u'IVIe', u'Me'), (u'IVIi', u'Mi'), (u'IVIo', u'Mo'), (u'IVIu', u'Mu'), (u'IVIy', u'My'), (u' l ', u' I '), (u'l/an', u'lian'), (u'\xb0x\xb0', u'%'), (u'\xc3\xc2s', u"'s"), (u'at/on', u'ation'), (u'lljust', u'll just'), (u"'sjust", u"'s just"), (u'compiete', u'complete'), (u' L ', u' I '), (u'a/ion', u'ation'), (u'\xc2s', u"'s"), (u"'tjust", u"'t just"), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), 'pattern': None}, 'WholeLines': {'data': OrderedDict([(u'H ey.', u'Hey.'), (u'He)\u2019-', u'Hey.'), (u'N0.', u'No.'), (u'-N0.', u'-No.'), (u'Noll', u'No!!'), (u'(G ROANS)', u'(GROANS)'), (u'[G ROANS]', u'[GROANS]'), (u'(M EOWS)', u'(MEOWS)'), (u'[M EOWS]', u'[MEOWS]'), (u'Uaughs]', u'[laughs]'), (u'[chitte rs]', u'[chitters]'), (u'Hil\u2018 it!', u'Hit it!'), (u'Hil\u2018 it!', u'Hit it!'), (u'ISIGHS]', u'[SIGHS]')]), 'pattern': None}, - 'WholeWords': {'data': OrderedDict([(u'$COff$', u'scoffs'), (u'$ergei', u'Sergei'), (u"$'llOp", u'Stop'), (u"/'//", u"I'll"), (u"/'/I", u"I'll"), (u'/ennifer', u'Jennifer'), (u'/got', u'I got'), (u'/have', u'I have'), (u'/hope', u'I hope'), (u'/just', u'I just'), (u'/love', u'I love'), (u"/'m", u"I'm"), (u'/mmerse', u'immerse'), (u'/nsu/ts', u'Insults'), (u'/ong', u'long'), (u'/ook', u'look'), (u"/t's", u"It's"), (u"/'ve", u"I've"), (u"\\/\\/e'd", u"We'd"), (u"\\/\\/e're", u"We're"), (u"\\/\\/e've", u"We've"), (u'\\/\\/hat', u'What'), (u"\\/\\/here'd", u"Where'd"), (u'\\/\\/hoo', u'Whoo'), (u'\\/\\/hy', u'Why'), (u"\\/\\/hy'd", u"Why'd"), (u"\\/\\le're", u"We're"), (u'\\/Ve', u'We'), (u"\\Ne're", u"We're"), (u"\\Nhat's", u"What's"), (u"\\Nhere's", u"Where's"), (u"|'mjust", u"I'm just"), (u'\xa4ff', u'off'), (u'\xa4Id', u'old'), (u'\xa4Ids', u'olds'), (u'\xa4n', u'on'), (u'\xa4ne', u'one'), (u'\xa4nly', u'only'), (u'\xa4pen', u'open'), (u'\xa4r', u'or'), (u'\xa4rder', u'order'), (u'\xa4ther', u'other'), (u'\xa4ur', u'our'), (u'\xa4ut', u'out'), (u'\xa4ver', u'over'), (u'\xa4wn', u'own'), (u"\u20acV\u20acI'y", u'every'), (u"0'clock", u"o'clock"), (u'0f', u'of'), (u'0fEngland', u'of England'), (u'0fft0', u'off to'), (u'0l/er', u'over'), (u'0n', u'on'), (u'0ne', u'one'), (u"0ne's", u"one's"), (u'0r', u'or'), (u'0rders', u'orders'), (u"0thers'", u"others'"), (u'0ut', u'out'), (u"0utlaw's", u"outlaw's"), (u"0utlaws'", u"outlaws'"), (u'0ver', u'over'), (u'13oos', u'1300s'), (u'18oos', u'1800s'), (u'195os', u'1950s'), (u"1et's", u"let's"), (u'1o', u'10'), (u'1oo', u'100'), (u'1ooth', u'100th'), (u'1oth', u'10th'), (u'2E_', u'2E.'), (u"2'IST", u'21ST'), (u"2'Ist_", u"2'1st."), (u'2o', u'20'), (u'2oth', u'20th'), (u'3o', u'30'), (u'3oth', u'30th'), (u'4o', u'40'), (u'4os', u'40s'), (u'4oth', u'40th'), (u'50rry', u'sorry'), (u'5o', u'50'), (u'5oth', u'50th'), (u'6o', u'60'), (u'6os', u'60s'), (u"'6os", u"'60s"), (u'6oth', u'60th'), (u'7o', u'70'), (u"'7os", u"'70s"), (u'7oth', u'70th'), (u'8o', u'80'), (u"'8os", u"'80s"), (u'8oth', u'80th'), (u'9/aim', u'alarm'), (u'9o', u'90'), (u'9oth', u'90th'), (u'9UnShQt', u'gunshot'), (u'a//', u'all'), (u'a/bum', u'album'), (u'a/so', u'also'), (u'A/ways', u'Always'), (u'abcut', u'about'), (u'aboutjoining', u'about joining'), (u'aboutposh', u'about posh'), (u'aboutus', u'about us'), (u'aboutyou', u'about you'), (u'accldent', u'accident'), (u'Acool', u'A cool'), (u'afier', u'after'), (u'affraid', u'afraid'), (u'Afriend', u'A friend'), (u'afterall', u'after all'), (u'afterthe', u'after the'), (u'afulcrum', u'a fulcrum'), (u'Afunny', u'A funny'), (u'aga/nst', u'against'), (u'ahsolutes', u'absolutes'), (u'AI_I_', u'ALL'), (u'AIien', u'Alien'), (u'AIex', u'Alex'), (u'AII', u'All'), (u'AIIan', u'Allan'), (u'AIIow', u'Allow'), (u'AIive', u'Alive'), (u"ain'tgotno", u"ain't got no"), (u"Ain'tgotno", u"Ain't got no"), (u'airstrike', u'air strike'), (u'AIVIBULANCE', u'AMBULANCE'), (u'ajob', u'a job'), (u'ajockey_', u'a jockey.'), (u'ajoke', u'a joke'), (u'Ajoke', u'A joke'), (u'ajoking', u'a joking'), (u'al/', u'all'), (u'al/en', u'alien'), (u'alittle', u'a little'), (u'allgasp', u'all gasp'), (u'alljustforshow', u'all just for show'), (u"aln't", u"ain't"), (u'alot', u'a lot'), (u'Alot', u'A lot'), (u'An5wer', u'Answer'), (u'Andit', u'And it'), (u"Andit's", u"And it's"), (u'andl', u'and I'), (u'andlaughs', u'and laughs'), (u'andleave', u'and leave'), (u'andthe', u'and the'), (u'andyou', u'and you'), (u'Andyou', u'And you'), (u'ANNOUNC/NG', u'ANNOUNCING'), (u'anotherstep', u'another step'), (u'ANSWER/NG', u'ANSWERING'), (u'answerwhat', u'answer what'), (u'antiquejoke', u'antique joke'), (u"anyhcdy's", u"anybody's"), (u'Anyidea', u'Any idea'), (u"anyone's_", u"anyone's."), (u'apejust', u'ape just'), (u'ARABlc', u'ARABIC'), (u"aren't_", u"aren't."), (u"arerl't", u"aren't"), (u"Arnsteln's", u"Arnstein's"), (u'atleast', u'at least'), (u'Atough', u'A tough'), (u'Awhole', u'A whole'), (u'awoman', u'a woman'), (u'Awoman', u'A woman'), (u'barelytalked', u'barely talked'), (u'bcat', u'boat'), (u'Bcllvla', u'Bolivia'), (u'bcmb', u'bomb'), (u'bcmbs', u'bombs'), (u'be//y', u'belly'), (u'becuase', u'because'), (u"Beep/'ng", u'Beeping'), (u'bejumpy', u'be jumpy'), (u'besldes', u'besides'), (u'bestfriend', u'best friend'), (u'bestguy', u'best guy'), (u'bestjob', u'best job'), (u'BIack', u'Black'), (u'BIess', u'Bless'), (u'bigos___', u'bigos...'), (u'BIame', u'Blame'), (u'BIind', u'Blind'), (u'BIood', u'Blood'), (u'BIue', u'Blue'), (u'BLOVVS', u'BLOWS'), (u'blowholel', u'blowhole!'), (u'blt', u'bit'), (u'Bo99', u'Bogg'), (u'bodiedyoung', u'bodied young'), (u'breakf\xe9wtl', u'breakfast!'), (u'bulldozlng', u'bulldozing'), (u'butjust', u'but just'), (u'butl', u'but I'), (u'Butl', u'But I'), (u'butljust', u'but I just'), (u"Butljustcan'tgetenough", u"But I just can't get enough"), (u"Butyou're", u"But you're"), (u'buythem', u'buy them'), (u'buyyou', u'buy you'), (u'byjust', u'by just'), (u'bythe', u'by the'), (u"C/latter/'/7g", u'Chattering'), (u'ca///ng', u'calling'), (u'ca/I', u'call'), (u'call/ng', u'calling'), (u'callyou', u'call you'), (u'can*t', u"can't"), (u"can'i", u"can't"), (u"can'I", u"can't"), (u'canlgetyou', u'canI get you'), (u'cannotchange', u'cannot change'), (u'cannut', u'cannot'), (u"can'T", u"can't"), (u"can't_", u'Crucially'), (u"can'tjust", u"can't just"), (u"can'tletgo", u"can't let go"), (u'Car0l', u'Carol'), (u'Carhorn', u'Car horn'), (u'carrled', u'carried'), (u'Ccug', u'Coug'), (u'Ccugs', u'Cougs'), (u'Ccver', u'Cover'), (u'cellularchange', u'cellular change'), (u'cff', u'off'), (u'cfycu', u'of you'), (u'cfycur', u'of your'), (u'Ch/rping', u'Chirping'), (u'chaletgirl', u'chalet girl'), (u'changejobs', u'change jobs'), (u'Charliejust', u'Charlie just'), (u"Chatter/'rtg", u'Chattering'), (u'CHATTERWG', u'CHATTERING'), (u'Chequeredlove', u'Chequered love'), (u'cHIRPINcs', u'CHIRPING'), (u'chjldishness', u'childishness'), (u'chlldrcn', u'children'), (u'chlldren', u'children'), (u'chocolatte', u'chocolate'), (u'Cho/r', u'Choir'), (u'cHucKl_Es', u'CHUCKLES'), (u'CIark', u'Clark'), (u'CIear', u'Clear'), (u'circumcised_', u'circumcised.'), (u'ckay', u'okay'), (u'cl_osEs', u'CLOSES'), (u'CLATTERWG', u'CLATTERING'), (u'cn', u'on'), (u'cne', u'one'), (u'cnes', u'ones'), (u'Coincidenta//y', u'Coincidentally'), (u'COm\u20ac', u'Come'), (u'comp/etey', u'completely'), (u'complainingabout', u'complaining about'), (u'coms', u'come'), (u'cond/lion', u'condition'), (u'confdence', u'confidence'), (u'conhrmed', u'confirmed'), (u'connrm', u'confirm'), (u'Consecutivelyl', u'Consecutively!'), (u'COUGH5', u'COUGHS'), (u'CouGHING', u'COUGHING'), (u"couIdn't", u"couldn't"), (u'couldjust', u'could just'), (u"couldn'T", u"couldn't"), (u"couldn'tjust", u"couldn't just"), (u'Couldyou', u'Could you'), (u'crappyjob', u'crappy job'), (u'CRAsHING', u'CRASHING'), (u'crder', u'order'), (u'Crowdcheers', u'Crowd cheers'), (u'Cruoially', u'Crucially'), (u'cther', u'other'), (u'cuuld', u'could'), (u'cver', u'over'), (u"d/'dn't", u"didn't"), (u'd/squietude', u'disquietude'), (u"D\xa4esn't", u"Doesn't"), (u"d\xa4n'i", u"don't"), (u"d\xa4n't", u"don't"), (u'd\xb09', u'dog'), (u'd0', u'do'), (u'D0', u'Do'), (u"D0asn't", u"Doesn't"), (u"Dad'//", u"Dad'll"), (u'dairyjust', u'dairy just'), (u'Dar//ng', u'Darling'), (u'dc', u'do'), (u'Dcbby', u'Dobby'), (u"dccsn't", u"doesn't"), (u'dcctcr', u'doctor'), (u'Dces', u'Does'), (u'dcgs', u'dogs'), (u'dcing', u'doing'), (u"dcn'I", u"don't"), (u"dcn't", u"don't"), (u"Dcn't", u"Don't"), (u'dcughnut', u'doughnut'), (u'declslons', u'decisions'), (u'deedhas', u'deed has'), (u'Dehnitely', u'Definitely'), (u'desewes', u'deserves'), (u'desperate/\xbby', u'desperately'), (u'D\ufb02nk', u'Drink'), (u'DIAl_lNcs', u'DIALING'), (u"didn'!", u"didn't"), (u'didnt', u"didn't"), (u"didn'T", u"didn't"), (u"dIdn't", u"didn't"), (u"didn't_", u"didn't."), (u'didrft', u"didn't"), (u"didrl't", u"didn't"), (u'didyou', u'did you'), (u'divorcing_', u'divorcing.'), (u'dld', u'did'), (u"dldn't", u"didn't"), (u'dlfflcull', u'difficult'), (u'dlg', u'dig'), (u'dlsobeyed', u'disobeyed'), (u"doasn't", u"doesn't"), (u"Doasn't", u"Doesn't"), (u'doctoh', u'doctor'), (u'Doctor___tell', u'Doctor... tell'), (u'doesnt', u"doesn't"), (u"doesn'T", u"doesn't"), (u"doesri't", u"doesnt't"), (u'doesrt', u"doesn't"), (u'Doesrt', u"Doesn't"), (u'doit', u'do it'), (u'dojust', u'do just'), (u'don*t', u"don't"), (u'donejobs', u'done jobs'), (u"don'i", u"don't"), (u"don'l", u"don't"), (u"Don'l", u"Don't"), (u'Donllook', u"Don't look"), (u'dont', u"don't"), (u"don'T", u"don't"), (u"don'tcare", u"don't care"), (u"don'tjoke", u"don't joke"), (u"Don'tjudge", u"Don't judge"), (u"don'tjust", u"don't just"), (u"Don'tjust", u"Don't just"), (u"Don'tlet", u"Don't let"), (u"don'tlhink", u"don't think"), (u"don'tpush", u"don't push"), (u"Don'tyou", u"Don't you"), (u'DonWlook', u"Don't look"), (u'Dooropens', u'Door opens'), (u'doorshuts', u'door shuts'), (u'dothat', u'do that'), (u'dothis', u'do this'), (u'Drinkthis', u'Drink this'), (u'dumbass', u'dumb-ass'), (u'dumbto', u'dumb to'), (u"dun't", u"don't"), (u'E//e', u'Elle'), (u'E9YPt', u'Egypt'), (u"ea/'t/7", u'earth'), (u'eart/7', u'earth'), (u"efi'/'c/'ent", u'efficient'), (u'EN<3LlsH', u'ENGLISH'), (u'Enjoythe', u'Enjoy the'), (u'Erv\\/an', u'Erwan'), (u"Erv\\/an's", u"Erwan's"), (u'etemity', u'eternity'), (u'ev/I', u'evil'), (u'eve/yone', u'everyone'), (u"even/body's", u"everybody's"), (u'eversay', u'ever say'), (u'Everymonth', u'Every month'), (u'everythings', u"everything's"), (u"Everythirlg's", u'Everything\u2019s'), (u"Everythlng's", u"Everything's"), (u'Everytime', u'Every time'), (u'Exac\ufb02y', u'Exactly'), (u'ExacUy_', u'Exactly.'), (u'excitedshrieking', u'excited shrieking'), (u'ExcLAllvls', u'EXCLAIMS'), (u'exploatation', u'exploitation'), (u'expreusion', u'expression'), (u'fairthat', u'fair that'), (u'Fathef', u'Father'), (u'fatherfigure', u'father figure'), (u'FBl', u'FBI'), (u'fcrebcdlng', u'foreboding'), (u'fcreverjudges', u'forever judges'), (u'fcund', u'found'), (u'feeleverything', u'feel everything'), (u'feelsweet', u'feel sweet'), (u"fiam/'/y", u'family'), (u'\ufb01ngernail', u'fingernail'), (u'finishedjunior', u'finished junior'), (u'FIynn', u'Flynn'), (u'flll', u'fill'), (u'flra', u'fira'), (u'Flylng', u'Flying'), (u'Fnends', u'Fiends'), (u'fo/low', u'follow'), (u'fonzvard', u'forward'), (u'fora', u'for a'), (u'Fora', u'For a'), (u'forajob', u'for a job'), (u'forAmerica', u'for America'), (u'forNew', u'for New'), (u'forone', u'for one'), (u'forso', u'for so'), (u'Forsuch', u'For such'), (u'forsunburns', u'for sunburns'), (u'forthe', u'for the'), (u'Foryears', u'For years'), (u'foryou', u'for you'), (u'Foudeen', u'Fouteen'), (u'Fou\ufb02een', u'Fourteen'), (u'FourSeasons', u'Four Seasons'), (u'fr/ends', u'friends'), (u'freezerfood', u'freezer food'), (u'F\xfchrerfeels', u'F\xfchrer feels'), (u'furthernotice', u'further notice'), (u'furyou', u'for you'), (u'G0', u'Go'), (u'g0in9', u'going'), (u'gamlenias', u'gardenias'), (u'GAsPING', u'GASPING'), (u'gc', u'go'), (u'gcing', u'going'), (u'gcnna', u'gonna'), (u'Gcnna', u'Gonna'), (u'gct', u'get'), (u'Gct', u'Got'), (u'genercsity', u'generosity'), (u'generosityn', u'generosity"'), (u'getjust', u'get just'), (u'g\ufb02ing', u'going'), (u'gi\ufb02friend', u'girlfriend'), (u'gir/', u'girl'), (u"gir/s'boarding", u"girls' boarding"), (u'giris', u'girls'), (u'gLlyS', u'guys'), (u'glum_', u'glum.'), (u'gnyone', u'anyone'), (u'golng', u'going'), (u'goodboyand', u'good boy and'), (u'goodjob', u'good job'), (u'gOt', u'got'), (u'gotjumped', u'got jumped'), (u'gotmyfirstinterview', u'got my first interview'), (u'grandjury', u'grand jury'), (u'greatjob', u'great job'), (u'Greatjobl', u'Great job!'), (u'grinco', u'gringo'), (u'GRoANING', u'GROANING'), (u'GRUNUNG', u'GRUNTING'), (u'gu', u'go'), (u'gunna', u'gonna'), (u'guyjumped', u'guy jumped'), (u'guyjust', u'guy just'), (u'gUyS', u'guys'), (u'_H6Y-', u'- Hey!'), (u'H\u20acY', u'Hey'), (u'H0we\xb7ver', u'However'), (u'halftheir', u'half their'), (u'hapPY', u'happy'), (u'hasrt', u"hasn't"), (u'Hasrt', u"Hasn't"), (u"haven'tspokerl", u"haven't spoken"), (u'hcle', u'hole'), (u'hcme', u'home'), (u'hcmes', u'homes'), (u'hcpe', u'hope'), (u'hctel', u'hotel'), (u'hcurs', u'hours'), (u'Hcw', u'How'), (u'he/ps', u'helps'), (u'hearjokestonight', u'hear jokes tonight'), (u'hearme', u'hear me'), (u'Hefell', u'He fell'), (u"he'II", u"he'll"), (u"He'II", u"He'll"), (u'HeII0', u'Hello'), (u"He'Il", u"He'll"), (u'Hejust', u'He just'), (u"He'lI", u"He'll"), (u'HelIo', u'Hello'), (u'hellc', u'hello'), (u'HellO', u'Hello'), (u'herboyfr/end', u'her boyfriend'), (u'herflesh', u'her flesh'), (u'herfollov\\/ed', u'her followed'), (u'herjob_', u'her job.'), (u'HerrSchmidt', u'Herr Schmidt'), (u'herwith', u'her with'), (u'HeY\xb7', u'Hey.'), (u'HeyJennifer', u'Hey Jennifer'), (u'hiddsn', u'hidden'), (u'hisjunk', u'his junk'), (u'Hitlershare', u'Hitler share'), (u'Hlneed', u"I'll need"), (u'Hnally', u'finally'), (u'Hnishing', u'finishing'), (u'HOId', u'Hold'), (u'hOIes', u'holes'), (u'HONMNG', u'HONKING'), (u'honorthe', u'honor the'), (u'honoryou', u'honor you'), (u'honoryour', u'honor your'), (u"Hov\\/'s", u"How's"), (u"Hov\\/'S", u"How's"), (u'HovvLING', u'HOWLING'), (u'howit', u'how it'), (u"HoW's", u"How's"), (u'howto', u'how to'), (u"Hs's", u"He's"), (u'hurtyou', u'hurt you'), (u'I/erilj/', u'verify'), (u'I/fe', u'life'), (u'I\\/I', u'M'), (u'I\\/Ian', u'Man'), (u'I\\/Iathies', u'Mathies'), (u'I\\/Ie', u'Me'), (u'I\\/Iommy', u'Mommy'), (u'I\\/Ir', u'Mr'), (u'I\\/Ir.', u'Mr.'), (u'I\\/ly', u'My'), (u'I3EEPING', u'BEEPING'), (u'I3LARING', u'BLARING'), (u'Iacings', u'lacings'), (u'Iaid', u'laid'), (u'Iam', u'I am'), (u'Iand', u'land'), (u'Ianding', u'landing'), (u'Iast', u'last'), (u'Iate', u'late'), (u'Icad', u'load'), (u'Icading', u'loading'), (u'Ican', u'I can'), (u'Iccked', u'locked'), (u'Icng', u'long'), (u'Icsing', u'losing'), (u'Icslng', u'losing'), (u'Idid', u'I did'), (u"Ididn't", u"I didn't"), (u'Ido', u'I do'), (u"Idon'i", u"I don't"), (u"Idon't", u"I don't"), (u"Idon'tthink", u"I don't think"), (u"I'E'$", u"It's"), (u'Ieamed', u'learned'), (u'Ieapt', u'leapt'), (u'Iearned', u'learned'), (u'Ieast', u'least'), (u'Ieave', u'leave'), (u'Ied', u'led'), (u'Ieft', u'left'), (u"Ieg's", u"leg's"), (u'Iess', u'less'), (u'Iet', u'let'), (u"Iet's", u"let's"), (u"Iet'sjust", u"let's just"), (u'if/just', u'if I just'), (u'Ifear', u'I fear'), (u'Ifeared', u'I feared'), (u'Ifeel', u'I feel'), (u"ifI'||", u"if I'll"), (u"ifI'd", u"if I'd"), (u"ifI'II", u"if I'll"), (u"ifI'll", u"if I'll"), (u"ifI'm", u"if I'm"), (u'Ifinally', u'I finally'), (u"ifI've", u"if I've"), (u'ifl', u'if I'), (u'Iforgot', u'I forgot'), (u'Ifound', u'I found'), (u'ifshe', u'if she'), (u"ifthat's", u"if that's"), (u'ifthe', u'if the'), (u'Ifthe', u'If the'), (u"ifthere's", u"if there's"), (u'Ifthey', u'If they'), (u'ifwe', u'if we'), (u'Ifwe', u'If we'), (u'Ifycu', u'If you'), (u'ifyou', u'if you'), (u'Ifyou', u'If you'), (u'ifyuu', u'if you'), (u'Iget', u'I get'), (u'Igot', u'I got'), (u'Igotta', u'I gotta'), (u'Igotyou', u'I got you'), (u'Iguess', u'I guess'), (u'Iguessljust', u'I guess I just'), (u'Ihad', u'I had'), (u"Ihat's", u"that's"), (u'Ihave', u'I have'), (u'Iheard', u'I heard'), (u"ihere's", u"there's"), (u"ihey've", u"they've"), (u'Ihope', u'I hope'), (u'ii/Iary', u'Mary'), (u'ii/Ir', u'Mr'), (u'ii/Ir.', u'Mr.'), (u'ii/love', u'Move'), (u'Iife', u'life'), (u"I'II", u"I'll"), (u'Iike', u'like'), (u"I'Il", u"I'll"), (u'Iine', u'line'), (u'iirst', u'first'), (u"ii's", u"it's"), (u"Ii's", u"It's"), (u'Iiterallyjumped', u'literally jumped'), (u'Ijoined', u'I joined'), (u'Ijust', u'I just'), (u'Iknew', u'I knew'), (u'Iknow', u'I know'), (u'Ile', u'lie'), (u'Ileft', u'I left'), (u"I'lldo", u"I'll do"), (u"I'llmake", u"I'll make"), (u'Ilons', u'lions'), (u'Ilove', u'I love'), (u"I'mjust", u"I'm just"), (u'Inconceivablel', u'Inconceivable!'), (u'infact', u'in fact'), (u'Infact', u'In fact'), (u'in\ufb02uence', u'influence'), (u'infront', u'in front'), (u'injust', u'in just'), (u'insc\ufb01p\ufb01ons', u'inscriptions'), (u'insolencel', u'insolence!'), (u'intc', u'into'), (u'internationaljudges', u'international judges'), (u'inthe', u'in the'), (u'Iockdown', u'lockdown'), (u'Iong', u'long'), (u'Iongships', u'longships'), (u'Iook', u'look'), (u'Iookjust', u'look just'), (u'Iooklng', u'looking'), (u'Iooks', u'looks'), (u'Ioose', u'loose'), (u"Iord's", u"lord's"), (u'Iose', u'lose'), (u'Ioser', u'loser'), (u'Ioss', u'loss'), (u'Iost', u'lost'), (u'Iot', u'lot'), (u"Iot's", u"lot's"), (u'Iousyjob', u'lousy job'), (u'Iove', u'love'), (u'Ioves', u'loves'), (u'Iowlife', u'lowlife'), (u'Ipaid', u'I paid'), (u'Iquit', u'I quit'), (u'Ireallythinkthis', u'I really think this'), (u"I'rn", u"I'm"), (u'Isaw', u'I saw'), (u'Isayt/1e', u'I say the'), (u'isjust', u'is just'), (u"isn'i", u"isn't"), (u"isn't_", u"isn't."), (u'Isthis', u'Is this'), (u'Istill', u'I still'), (u'Istumblod', u'I stumbled'), (u'Itake', u'I take'), (u'itdown', u'it down'), (u'Iteach', u'I teach'), (u'Itfeels', u'It feels'), (u'ithave', u'it have'), (u'Ithink', u'I think'), (u'Ithinkthat', u'I think that'), (u'Ithinkthis', u'I think this'), (u"Ithinkyou're", u"I think you're"), (u'Ithlnk', u'I think'), (u'Ithoguht', u'I thought'), (u'Ithought', u'I thought'), (u'Ithoughtl', u'I thought I'), (u"it'II", u"it'll"), (u"It'II", u"It'll"), (u"it'Il", u"it'll"), (u"It'Il", u"It'll"), (u'itin', u'it in'), (u'itjust', u'it just'), (u'Itjust', u'It just'), (u"it'lI", u"it'll"), (u"It'lI", u"It'll"), (u"It'llhappen", u"It'll happen"), (u"it'lljust", u"it'll just"), (u'Itold', u'I told'), (u'Itook', u'I took'), (u'itout', u'it out'), (u"it'S", u"it's"), (u"it'sjinxed", u"it's jinxed"), (u"it'sjust", u"it's just"), (u"It'sjust", u"It's just"), (u'itso', u'it so'), (u'Ittends', u'It tends'), (u"Itwasn't", u"It wasn't"), (u'Iuckier', u'luckier'), (u'IV|oney', u'Money'), (u"IV|oney's", u"Money's"), (u"I'va", u"I've"), (u"I'Ve", u"I've"), (u'IVIan', u'Man'), (u'IVIAN', u'MAN'), (u'IVIarch', u'March'), (u"IVIarci's", u"Marci's"), (u'IVIarko', u'Marko'), (u'IVIe', u'Me'), (u"IVIine's", u"Mine's"), (u'IVImm', u'Mmm'), (u'IVIoney', u'Money'), (u'IVIr.', u'Mr.'), (u'IVIrs', u'Mrs'), (u'IVIuch', u'Much'), (u'IVIust', u'Must'), (u'IVIy', u'My'), (u'IVlacArthur', u'MacArthur'), (u"IVlacArthur's", u"MacArthur's"), (u'IVlcBride', u'McBride'), (u'IVlore', u'More'), (u'IVlotherfucker_', u'Motherfucker.'), (u'IVlr', u'Mr'), (u'IVlr.', u'Mr.'), (u'IVlr_', u'Mr.'), (u'IVlust', u'Must'), (u'IVly', u'My'), (u'Iwake', u'I wake'), (u'Iwant', u'I want'), (u'Iwanted', u'I wanted'), (u'Iwas', u'I was'), (u'Iwasjust', u'I was just'), (u'Iwasjustu', u'I was just...'), (u'Iwill', u'I will'), (u'Iwish', u'I wish'), (u"Iwon't", u"I won't"), (u'Iworked', u'I worked'), (u'Iwould', u'I would'), (u'jalapeno', u'jalape\xf1o'), (u'Jaokson', u'Jackson'), (u'Jascn', u'Jason'), (u'jcke', u'joke'), (u'jennifer', u'Jennifer'), (u'joseph', u'Joseph'), (u'Jumpthem', u'Jump them'), (u'jusi', u'just'), (u'jusl', u'just'), (u'justjudge', u'just judge'), (u'justleave', u'just leave'), (u'Justletgo', u'Just let go'), (u'kidsjumped', u'kids jumped'), (u'kiokflip', u'kickflip'), (u'knowjust', u'know just'), (u'knowthat', u'know that'), (u'knowthis', u'know this'), (u'knowwhat', u'know what'), (u'knowyet', u'know yet'), (u'knowyourlove', u'know your love'), (u'korean', u'Korean'), (u'L/ght', u'Light'), (u'L/kes', u'Likes'), (u'L\\/Ianuela', u'Manuela'), (u'L\\/Ianuelal', u'Manuela!'), (u'l\\/Iauzard', u'Mauzard'), (u'l\\/I\xe9lanie', u'M\xe9lanie'), (u'L\\/I\xe9lanie', u'M\xe9lanie'), (u'l\\/Iom', u'Mom'), (u'l\\/Iommy', u'Mommy'), (u'l\\/Ir', u'Mr'), (u'l\\/Ir.', u'Mr.'), (u'l\\/Is', u'Ms'), (u'l\\/ly', u'My'), (u'l_AuGHING', u'LAUGHING'), (u'l\u2018m', u"I'm"), (u'Laml6', u'I am l6'), (u'Lcad', u'Load'), (u'lcan', u'I can'), (u"lcan't", u"I can't"), (u"lcarl't_", u"I can't."), (u'Lcve', u'Love'), (u"l'd", u"I'd"), (u"L'd", u"I'd"), (u'ldid', u'I did'), (u'Ldid', u'I did'), (u'ldiot', u'Idiot'), (u"L'djump", u"I'd jump"), (u"ldon't", u"I don't"), (u"Ldon't", u"I don't"), (u'Lefs', u"Let's"), (u"Let'sjust", u"Let's just"), (u'lf', u'if'), (u'Lf', u'If'), (u'lfeelonelung', u'I feel one lung'), (u'lfthey', u'if they'), (u'lfyou', u'If you'), (u'Lfyou', u'If you'), (u"lfyou're", u"If you're"), (u'lget', u'I get'), (u'lgive', u'I give'), (u'Li/0/Academy', u'Lilly Academy'), (u'li/lr.', u'Mr.'), (u'ligature___', u'ligature...'), (u"l'II", u"I'll"), (u"l'Il", u"I'll"), (u'ljust', u'I just'), (u'Ljust', u'I just'), (u"ll/Iommy's", u"Mommy's"), (u'll/lajor', u'Major'), (u'Ll/lajor', u'Major'), (u'll/layans', u'Mayans'), (u"l'lI", u"I'll"), (u"l'll", u"I'll"), (u"L'll", u"I'll"), (u"l'lljust", u"I'll just"), (u"L'lltake", u"I'll take"), (u'llte', u'lite'), (u"l'm", u"I'm"), (u"L'm", u"I'm"), (u'Lmean', u'I mean'), (u"l'mjust", u"I'm just"), (u'ln', u'In'), (u'lN', u'IN'), (u'lNAuDll3LE', u'INAUDIBLE'), (u'LNAuDll3LE', u'INAUDIBLE'), (u'LNDlsTINcT', u'INDISTINCT'), (u'lneed', u'I need'), (u'lostyou', u'lost you'), (u'Loudmusic', u'Loud music'), (u'lraq', u'Iraq'), (u"lRA's", u"IRA's"), (u'Lrenka', u'Irenka'), (u'Lrn', u"I'm"), (u'lRS', u'IRS'), (u'lsabella', u'Isabella'), (u"lsn't", u"isn't"), (u"Lsn't", u"Isn't"), (u"Lst's", u"Let's"), (u'lsuppose', u'I suppose'), (u'lt', u'It'), (u'ltake', u'I take'), (u'ltell', u'I tell'), (u'lthink', u'I think'), (u'Lthink', u'I think'), (u'lthink___', u'I think...'), (u"lt'II", u"It'll"), (u"lt'Il", u"It'll"), (u'ltjammed_', u'It jammed.'), (u"lt'll", u"It'll"), (u'ltold', u'I told'), (u"lt's", u"It's"), (u"lT'S", u"IT'S"), (u"Lt'S", u"It's"), (u"Lt'sjust", u"It's just"), (u"lv\\/asn't", u"I wasn't"), (u"l've", u"I've"), (u"L've", u"I've"), (u'lVIan', u'Man'), (u'lVIcHenry', u'McHenry'), (u'lVIr.', u'Mr.'), (u'lVlacArthur', u'MacArthur'), (u'LVlore', u'More'), (u'lVlr', u'Mr'), (u'lVlr.', u'Mr.'), (u'lvluslc', u'MUSIC'), (u'lVlust', u'Must'), (u'LVly', u'Lily'), (u'lwaited', u'I waited'), (u'lwamoto', u'Iwamoto'), (u'lwant', u'I want'), (u'lwanted', u'I wanted'), (u'lwas', u'I was'), (u'lwill', u'I will'), (u"lwon't", u"I won't"), (u'lworked', u'I worked'), (u'lwould', u'I would'), (u"lwould've", u"I would've"), (u'lx/Iorning', u'Morning'), (u'M/dd/e', u'Middle'), (u'm/g/7ty', u'mighty'), (u'MACH/NE', u'MACHINE'), (u'MacKenz/e', u'MacKenzie'), (u'majorjackpot', u'major jackpot'), (u'majormuscle', u'major muscle'), (u'Manuela_', u'Manuela.'), (u'maste/y', u'mastery'), (u'Masturhate', u'Masturbate'), (u'Mattei_', u'Mattei.'), (u'mayjust', u'may just'), (u'mbecause', u'"because'), (u'McCa/Iister', u'McCallister'), (u'McCallisler', u'McCallister'), (u'Mccallister', u'McCallister'), (u'Mccallisters', u'McCallisters'), (u"mcm's", u"mom's"), (u'mcney', u'money'), (u'mcral', u'moral'), (u'mcre', u'more'), (u'mcve', u'move'), (u'mejust', u'me just'), (u'Mexioo', u'Mexico'), (u'mi//<', u'milk'), (u'misfartune', u'misfortune'), (u'Ml6', u'MI6'), (u'Mlnd', u'Mind'), (u"Mock/'ngbl'rd", u'Mockingbird'), (u"mOI'\u20ac", u'more'), (u'Mom_', u'Mom.'), (u'monkeyback', u'monkey back'), (u'move___l', u'move... I'), (u'moveto', u'move to'), (u'mustknock', u'must knock'), (u'Myheart', u'My heart'), (u'myjch', u'my job'), (u'myjet', u'my jet'), (u'myjob', u'my job'), (u'Myjob', u'My job'), (u"myjob's", u"my job's"), (u'mylife', u'my life'), (u'Mynew', u'My new'), (u'myown', u'my own'), (u'mypants', u'my pants'), (u'myselli', u'myself'), (u'Myshoes', u'My shoes'), (u'mysong', u'my song'), (u'mytemper', u'my temper'), (u'mythumb', u'my thumb'), (u'Myworld', u'My world'), (u'N0', u'No'), (u'narne', u'name'), (u'Natians', u'Nations'), (u'naTve', u'naive'), (u'nc', u'no'), (u'Nc', u'No'), (u'ncne', u'none'), (u'Ncrth', u'North'), (u'ncw', u'new'), (u'Ncw', u'Now'), (u'needyou', u'need you'), (u'neighboun', u'neighbour'), (u'neverfound', u'never found'), (u'neverthere', u'never there'), (u'neverv\\/ill_', u'never will.'), (u'NewJersey', u'New Jersey'), (u'newjob', u'new job'), (u'newjobs', u'new jobs'), (u'nextdoor', u'next door'), (u'Nighw', u'Nighty'), (u'nilios', u'ni\xf1os'), (u'Nlagnificence', u'Magnificence'), (u'Nlakes', u'Makes'), (u'Nlalina', u'Malina'), (u'Nlan', u'Man'), (u'Nlarch', u'March'), (u'Nlarine', u'Marine'), (u'Nlarion', u'Marion'), (u'Nlarry', u'Marry'), (u'Nlars', u'Mars'), (u'Nlarty', u'Marty'), (u'Nle', u'Me'), (u'Nleet', u'Meet'), (u'Nlen', u'Men'), (u'Nlom', u'Mom'), (u'Nlore', u'More'), (u'Nlornin', u'Mornin'), (u'Nlother', u'Mother'), (u'Nlr', u'Mr'), (u'Nlr.', u'Mr.'), (u'Nlrs', u'Mrs'), (u'Nluch', u'Much'), (u'nojurisdiction', u'no jurisdiction'), (u'noone', u'no one'), (u'Noone', u'No one'), (u'not judging', u'not judging'), (u'notgoing', u'not going'), (u'notjunk', u'not junk'), (u'Notjunk', u'Not junk'), (u'notjust', u'not just'), (u'notsure', u'not sure'), (u'novv', u'now'), (u'Nowjust', u'Now just'), (u"Nowthat's", u"Now that's"), (u'Numbertwo', u'Number two'), (u"oan't", u"can't"), (u"oan'tjust", u"can't just"), (u'objecl', u'object'), (u'occultpowerand', u'occult power and'), (u'Ocps', u'Oops'), (u'ofa', u'of a'), (u'ofajudge', u'of a judge'), (u'ofall', u'of all'), (u'Ofall', u'Of all'), (u'ofBedford', u'of Bedford'), (u'ofcourse', u'of course'), (u'Ofcourse', u'Of course'), (u'ofeach', u'of each'), (u'ofeither', u'of either'), (u"Offioer's", u"Officer's"), (u'ofFrance', u'of France'), (u'offreedom', u'of freedom'), (u'offthe', u'off the'), (u'offthis', u'off this'), (u'offto', u'off to'), (u'offun', u'of fun'), (u'ofguy', u'of guy'), (u'Ofhce', u'Office'), (u'ofhis', u'of his'), (u'ofHis', u'of His'), (u'ofhoneybees', u'of honeybees'), (u'ofit', u'of it'), (u'ofjam', u'of jam'), (u'OFJOAN', u'OF JOAN'), (u'ofjoy', u'of joy'), (u'ofjunior', u'of junior'), (u'ofme', u'of me'), (u'ofmead', u'of mead'), (u'ofmicroinjections', u'of microinjections'), (u'ofmy', u'of my'), (u'ofNew', u'of New'), (u"ofNorris'", u"of Norris'"), (u'ofopinions', u'of opinions'), (u'ofour', u'of our'), (u'ofpeopla', u'of people'), (u'ofthat', u'of that'), (u'ofthe', u'of the'), (u'Ofthe', u'Of the'), (u'oftheir', u'of their'), (u'ofthem', u'of them'), (u"ofthem's", u"of them's"), (u'ofthemselves', u'of themselves'), (u'ofthere', u'of there'), (u'ofthese', u'of these'), (u'ofthings', u'of things'), (u'ofthis', u'of this'), (u'ofthlngs', u'of things'), (u'ofthose', u'of those'), (u'ofuse', u'of use'), (u'ofwashington', u'of Washington'), (u'ofyou', u'of you'), (u'ofyour', u'of your'), (u'OId', u'Old'), (u'OIsson', u'Olsson'), (u'Ok3Y', u'Okay'), (u'okaY', u'okay'), (u'OkaY', u'Okay'), (u'OKaY', u'Okay'), (u'OKGY', u'Okay'), (u'Ol<', u'Ole'), (u'oldAdolfon', u'old Adolf on'), (u'onboard', u'on board'), (u'onIy', u'only'), (u'onIything', u'only thing'), (u'onJanuaw', u'on January'), (u'onlyjust', u'only just'), (u'Onyinal', u'Original'), (u'oomprise', u'comprise'), (u'oonstitution', u'constitution'), (u"oouldn't", u"couldn't"), (u"oould've", u"could've"), (u"oousin's", u"cousin's"), (u'opiimistically', u'optimistically'), (u'ora', u'or a'), (u'orfall', u'or fall'), (u'orglory', u'or glory'), (u'orjust', u'or just'), (u'Orjust', u'Or just'), (u'Orthat', u'Or that'), (u'orwould', u'or would'), (u'Orwould', u'Or would'), (u'Othenzvise', u'Otherwise'), (u'our joumey', u'our journey'), (u'ourbrave', u'our brave'), (u'ourfathers', u'our fathers'), (u'ourgirlon', u'our girl on'), (u'Ourgoal', u'Our goal'), (u'Ourguy', u'Our guy'), (u"ourj0b's", u"our job's"), (u"Ourj0b's", u"Our job's"), (u'ourjobs', u'our jobs'), (u"ourjob's", u"our job's"), (u"Ourjob's", u"Our job's"), (u'ourjoumey', u'our journey'), (u'ourphotos', u'our photos'), (u'ourv\\/ay', u'our way'), (u"outlool<'s", u"outlook's"), (u'overme', u'over me'), (u'overthe', u'over the'), (u'overthere', u'over there'), (u'p/ace', u'place'), (u'P/ease', u'Please'), (u'p_m_', u'p.m.'), (u'P\xb0P$', u'Pops'), (u'PANUNG', u'PANTING'), (u'pclnt', u'point'), (u'pclnts', u'points'), (u'pe0pIe', u'people'), (u'Perrut_', u'Perrut.'), (u'Persona/4/', u'Personally'), (u'Persona/y', u'Personally'), (u'persors', u"person's"), (u'PIain', u'Plain'), (u'PIease', u'Please'), (u'PIeasure', u'Pleasure'), (u'PIus', u'Plus'), (u'pleasurlng', u'pleasuring'), (u'POIe', u'Pole'), (u'Polynes/ans', u'Polynesians'), (u'poorshowing', u'poor showing'), (u'popsicle', u'Popsicle'), (u'Presidenfs', u"President's"), (u'probablyjust', u'probably just'), (u'puIIing', u'pulling'), (u'Putyourhand', u'Put your hand'), (u'Qh', u'Oh'), (u'QkaY', u'Okay'), (u'Qpen', u'Open'), (u'QUYS', u'GUYS'), (u'_QW', u'Aw'), (u'r/ght', u'right'), (u'ralnbow', u'rainbow'), (u'ratherjump', u'rather jump'), (u'ratherjust', u'rather just'), (u'Rcque', u'Roque'), (u'rcscucd', u'rescued'), (u'rea/', u'real'), (u'readytolaunchu', u'ready to launch...'), (u'reaHy', u'really'), (u'ReaHy', u'Really'), (u'reallyjust', u'really just'), (u'reallymiss', u'really miss'), (u'reallytalked', u'really talked'), (u'reallythink', u'really think'), (u'reallythinkthis', u'really think this'), (u'rememberthem', u'remember them'), (u'reoalibrated', u'recalibrated'), (u'retum', u'return'), (u'rhfluence', u'influence'), (u'rightdown', u'right down'), (u'roadyou', u'road you'), (u'RUMBUNG', u'RUMBLING'), (u's/uggikh', u'sluggish'), (u'S0', u'So'), (u'S1oW1y', u'Slowly'), (u'saidyou', u'said you'), (u"sayeverything's", u"say everything's"), (u'saynothing', u'say nothing'), (u'saythat', u'say that'), (u'sc', u'so'), (u'scientihc', u'scientific'), (u'SCREAIVHNG', u'SCREAMING'), (u'sCREAlvllNG', u'SCREAMING'), (u'SCREAlvllNG', u'SCREAMING'), (u'scund', u'sound'), (u"S'EOp", u'Stop'), (u'severa/parents', u'several parents'), (u'sfill', u'still'), (u'S\ufb02ence', u'Silence'), (u'shallrise', u'shall rise'), (u'sHATTERING', u'SHATTERING'), (u'shcws', u'shows'), (u'Shdsjust', u"She's just"), (u'She`s', u"She's"), (u'She\u2018II', u"She'll"), (u"she'II", u"she'll"), (u"She'II", u"She'll"), (u"she'Il", u"she'll"), (u'Shejust', u'She just'), (u"she'lI", u"she'll"), (u'Shoofing', u'Shooting'), (u'ShOp', u'shop'), (u'shortyears', u'short years'), (u'shou/dn', u'shouldn\u2019t'), (u'shou\ufb01ng', u'shouting'), (u'Shou\ufb02ng', u'Shouting'), (u'shouldnt', u"shouldn't"), (u'Shouldrt', u"Shouldn't"), (u'shouldrt', u"shouldn't"), (u"Shs's", u"She's"), (u'SHUDDERWG', u'SHUDDERING'), (u'Shutup', u'Shut up'), (u'SIGH$', u'SIGHS'), (u'signifcance', u'significance'), (u'Sincc', u'Since'), (u'sistervvill', u'sister will'), (u'Skarsg\xe9rd', u'Skarsg\xe5rd'), (u'slcsHs', u'SIGHS'), (u'slGHINcs', u'SIGHING'), (u'slGHING', u'SIGHING'), (u'slNGING', u'SINGING'), (u'slzzLING', u'SIZZLING'), (u'smarfest', u'smartest'), (u'Smiih', u'Smith'), (u'so/id', u'solid'), (u'SoBl3lNG', u'SOBBING'), (u'soemtimes', u'sometimes'), (u'Sojust', u'So just'), (u'soldierl', u'soldier!'), (u'somethlng', u'something'), (u"somethlng's", u"something's"), (u"somez'/7/ng", u'something'), (u'somthing', u'something'), (u'sumthing', u'something'), (u'sou/', u'soul'), (u'SoundofMusic', u'Sound of Music'), (u'SP/ash', u'Splash'), (u'SPEAK/NG', u'SPEAKING'), (u'speII', u'spell'), (u"speII's", u"spell's"), (u'Spendourtime', u'Spend our time'), (u'sQUA\\/\\/KING', u'SQUAWKING'), (u'StAnton', u'St Anton'), (u'stealsjeans', u'steals jeans'), (u'StilI', u'Still'), (u'Stilldesperatelyseeking', u'Still desperately seeking'), (u'stlll', u'still'), (u'sToPs', u'STOPS'), (u'storyl', u'story!'), (u'Stubbom', u'Stubborn'), (u'su/faces', u'surfaces'), (u'suffocaiing', u'suffocating'), (u'summerjob', u'summer job'), (u'Summerjust', u'Summer just'), (u'sun/ive', u'survive'), (u'superiorman', u'superior man'), (u'sur\ufb02aces', u'surfaces'), (u't/ying', u'trying'), (u'T0', u'To'), (u'T00', u'Too'), (u'ta/ks', u'talks'), (u'taiked', u'talked'), (u'talkto', u'talk to'), (u'Talkto', u'Talk to'), (u'talktonight', u'talk tonight'), (u'tampax', u'Tampax'), (u'tc', u'to'), (u'tcday', u'today'), (u'tcrturing', u'torturing'), (u'tcuch', u'touch'), (u'te//', u'tell'), (u'tearjust', u'tear just'), (u'tellsjokes', u'tells jokes'), (u'tellyou', u'tell you'), (u'terriers_', u'terriers.'), (u'th/nk', u'think'), (u'THEPASSION', u'THE PASSION'), (u'thafs', u"that's"), (u'Thafs', u"That's"), (u"Thai's", u"That's"), (u"Thal's", u"That's"), (u'thankyou', u'thank you'), (u'Thankyou', u'Thank you'), (u'thatconverts', u'that converts'), (u'thatgoes', u'that goes'), (u"that'II", u"that'll"), (u"That'II", u"That'll"), (u'thatjob', u'that job'), (u'thatjunk', u'that junk'), (u'thatjust', u'that just'), (u'thatleads', u'that leads'), (u"Thatl'm", u"That I'm"), (u"that's just", u"that's just"), (u'Thatsand', u'That sand'), (u"that'sjust", u"that's just"), (u"That'sjust", u"That's just"), (u'Thc', u'The'), (u'theirface', u'their face'), (u'theirfeet', u'their feet'), (u'theirfury', u'their fury'), (u'thejaw', u'the jaw'), (u'thejoint', u'the joint'), (u'thejudge', u'the judge'), (u'thejudges', u'the judges'), (u'Thejudges', u'The judges'), (u'thejury', u'the jury'), (u'Thelook', u'The look'), (u'Therds', u"There's"), (u"There'II", u"There'll"), (u"There'Il", u"There'll"), (u"There'lI", u"There'll"), (u"They'/'e", u"They're"), (u"they/'II", u"they'll"), (u'They/re', u"They're"), (u"They/'re", u"They're"), (u"they'II", u"they'll"), (u"they'Il", u"they'll"), (u'theyjust', u'they just'), (u'Theyjust', u'They just'), (u"they'lI", u"they'll"), (u"They'lI", u"They'll"), (u'theyre', u"they're"), (u'theysay', u'they say'), (u'thinkthat', u'think that'), (u"this'II", u"this'll"), (u'thlngs', u'things'), (u'Thlnkthls', u'Think this'), (u'thls', u'this'), (u"thore's", u"there's"), (u"Thore's", u"There's"), (u'Thorjust', u'Thor just'), (u"thoughtl'dletyou", u"thought I'd let you"), (u'tnatjust', u'that just'), (u"tnat's", u"that's"), (u"Tnat's", u"That's"), (u"Tnere'll", u"There'll"), (u'to//et', u'toilet'), (u'To//S', u'Tolls'), (u"todayl'd", u"today I'd"), (u'togelher', u'together'), (u'togethen', u'together'), (u'tojoin', u'to join'), (u'tojudge', u'to judge'), (u'toldyou', u'told you'), (u'tomorrovv', u'tomorrow'), (u'Tonighfsjust', u"Tonight's just"), (u'totake', u'to take'), (u'totalk', u'to talk'), (u'tothat', u'to that'), (u'tothe', u'to the'), (u'Towef', u'Tower'), (u'Tr/ck/ing', u'Trickling'), (u'Traitur', u'Traitor'), (u'tv\\/o', u'two'), (u'tvvelve', u'twelve'), (u'Tvvelve', u'Twelve'), (u'tvventy', u'tvventy'), (u'Tvventy', u'Tvventy'), (u'tvvo', u'two'), (u'Tvvo', u'Two'), (u'twc', u'two'), (u'unconhrmed', u'unconfirmed'), (u'underthat', u'under that'), (u'underthe', u'under the'), (u'underthese', u'under these'), (u'underyour', u'under your'), (u'unfilyou', u'until you'), (u"Unfon'unate/y", u'Unfortunately'), (u'Uninnabited', u'Uninhabited'), (u'untilApril', u'until April'), (u'untilyou', u'until you'), (u'upthinking', u'up thinking'), (u'upto', u'up to'), (u'V\\/ait___', u'Wait...'), (u'v\\/as', u'was'), (u'V\\/as', u'Was'), (u'V\\/e', u'We'), (u"v\\/eek's", u"week's"), (u'V\\/eird_', u'Weird.'), (u'V\\/ell', u'Well'), (u'V\\/hat', u'what'), (u"V\\/hen'll", u"When'll"), (u'V\\/ho', u'Who'), (u"v\\/ho'll", u"who'll"), (u'v\\/Hoops', u'Whoops'), (u"v\\/ho's", u"who's"), (u"V\\/ho's", u"Who's"), (u'V\\/hy', u'Why'), (u'v\\/ith', u'with'), (u"v\\/on't", u"won't"), (u'V\\fith', u'With'), (u'V\\fithin', u'Within'), (u'valedictolian', u'valedictorian'), (u'vcice', u'voice'), (u've/y', u'very'), (u'veiy', u'very'), (u'V\xe9ry', u'Very'), (u'versioin', u'version'), (u'vi/ay', u'way'), (u'visitjails', u'visit jails'), (u"Viva/di's", u"Vivaldi's"), (u'vlll', u'vill'), (u'Voil\xe1', u'Voil\xe0'), (u'Voil\xe9', u'Voil\xe0'), (u'vvasjust', u'was just'), (u"VVasn't", u"Wasn't"), (u'vvay', u'way'), (u'VVe', u'We'), (u"VVe'II", u"We'll"), (u"VVe'll", u"We'll"), (u'Vvelooked', u'We looked'), (u"VVe're", u"We're"), (u"VVe've", u"We've"), (u'VVhat', u'What'), (u"VVhat's", u"What's"), (u"VVhat'S", u"What's"), (u'VVhen', u'When'), (u"'v'Vhere's", u"Where's"), (u'VVhip', u'Whip'), (u'vvHooPING', u'WHOOPING'), (u'VvHooPING', u'WHOOPING'), (u'VVhy', u'Why'), (u'VVill', u'Will'), (u'VVinters', u'Winters'), (u'vvlND', u'WIND'), (u"w\xa4n't", u"won't"), (u'W9', u'We'), (u'waht', u'want'), (u'waierfall', u'waterfall'), (u'walkjust', u'walk just'), (u'wallplant', u'wall plant'), (u'wannajump', u'wanna jump'), (u'wantyou', u'want you'), (u'Warcontinues', u'War continues'), (u'wasjennifer', u'was Jennifer'), (u'wasjust', u'was just'), (u'wasrt', u"wasn't"), (u'Wasrt', u"Wasn't"), (u'wayl', u'way I'), (u'wayround', u'way round'), (u'wclf', u'wolf'), (u'wcman', u'woman'), (u'wcmen', u'women'), (u"wcn't", u"won't"), (u'wcrse', u'worse'), (u'wculd', u'would'), (u'We//', u'Well'), (u'We/came', u'Welcome'), (u'we/come', u'welcome'), (u'We/come', u'Welcome'), (u'We/I', u'Well'), (u'weekendjust', u'weekend just'), (u'werert', u"weren't"), (u'Werert', u"Weren't"), (u"we'II", u"we'll"), (u"We'II", u"We'll"), (u"we'Il", u"we'll"), (u"We'Il", u"We'll"), (u'wejust', u'we just'), (u"we'lI", u"we'll"), (u"We'rejust", u"We're just"), (u"We'ro", u"We're"), (u"We'Ve", u"We've"), (u'wh/p', u'whip'), (u'Wh\xb0ops', u'Whoops'), (u'Whafs', u"What's"), (u'Whatam', u'What am'), (u'Whatare', u'What are'), (u'Whateverwe', u'Whatever we'), (u"What'II", u"What'll"), (u'Whatis', u'What is'), (u'whatjust', u'what just'), (u'Whatl', u'What I'), (u'whatshe', u'what she'), (u'whatwe', u'what we'), (u"Whc's", u"Who's"), (u'Whcse', u'Whose'), (u'wHlsPERs', u'WHISPERS'), (u'wi//', u'will'), (u'wil/', u'will'), (u'Wil/', u'Will'), (u'wilI', u'will'), (u'willbe', u'will be'), (u'willhire', u'will hire'), (u'willneverknow', u'will never know'), (u'willyou', u'will you'), (u'wlfe', u'wife'), (u"wlfe's", u"wife's"), (u'wlth', u'with'), (u"wnat's", u"what's"), (u'Wno', u'Who'), (u'Wo/f', u'Wolf'), (u'wo\ufb02d', u'world'), (u"WOI'1't", u"won't"), (u'wondernobody', u'wonder nobody'), (u"won'T", u"won't"), (u"won'tanswerme", u"won't answer me"), (u"won'tforget", u"won't forget"), (u"won'tletitbring", u"won't let it bring"), (u"Wo're", u"We're"), (u'worfd', u'world'), (u"won'th", u'worth'), (u"won'thwhile", u'worthwhile'), (u'workyou', u'work you'), (u"wouIdn't", u"wouldn't"), (u"wouldn'!", u"wouldn't"), (u'Wouldrt', u"Wouldn't"), (u"wr/'2'/ng", u'writing'), (u'writign', u'writing'), (u'wrcng', u'wrong'), (u'wuuld', u'would'), (u'_Yay', u'Yay'), (u"Y\xa4u'II", u"You'll"), (u"Y\xa4u'll", u"You'll"), (u"y\xa4u're", u"you're"), (u"Y\xa4u're", u"You're"), (u"y\xa4u've", u"you've"), (u'Y0', u'Yo'), (u'y0LI', u'you'), (u"y0u'II", u"you'll"), (u"Y0u'rc", u"You're"), (u"Y0u're", u"You're"), (u"Y0u've", u"You've"), (u'yaming', u'yarning'), (u'yaurparents', u'your parents'), (u'ycu', u'you'), (u"ycu'd", u"you'd"), (u'ycur', u'your'), (u"Ycu're", u"You're"), (u'Ycursins', u'Your sins'), (u'YEI_I_', u'YELL'), (u'YELL$', u'YELLS'), (u'yigg/mg', u'giggling'), (u'Yigg/mg', u'giggling'), (u'yoLI', u'you'), (u'yOu', u'you'), (u'yOU', u'you'), (u'you`re', u"you're"), (u"you'II", u"you'll"), (u"You'II", u"You'll"), (u"You'Il", u"You'll"), (u'youjack', u'you jack'), (u'youjoin', u'you join'), (u'Youjoin', u'You join'), (u'youjust', u'you just'), (u"You'lI", u"You'll"), (u'youngsterlike', u'youngster like'), (u'youpick', u'you pick'), (u"you'ra", u"you're"), (u'Yourattention', u'Your attention'), (u'yourautomobile', u'your automobile'), (u"You'rejustjealous", u"You're just jealous"), (u'yourextra', u'your extra'), (u'yourfather', u'your father'), (u'yourhand', u'your hand'), (u'yourhusband', u'your husband'), (u'yourjewelry', u'your jewelry'), (u'yourjob', u'your job'), (u'Yourjob', u'Your job'), (u'yourjob_', u'your job.'), (u'yourjockey', u'your jockey'), (u'yourjury', u'your jury'), (u'yourname', u'your name'), (u'Yourpackage', u'Your package'), (u'yourpackage', u'your package'), (u"you'ro", u"you're"), (u'yourpoorleg', u'your poor leg'), (u'yourvveak', u'your weak'), (u"you'va", u"you've"), (u"You'va", u"You've"), (u'youWlneversee', u"you'll never see"), (u'yQu', u'you'), (u'YQu', u'You'), (u"yQu'_7", u'you?'), (u'yummY', u'yummy'), (u'yuu', u'you'), (u'Yuu', u'You'), (u"Yuu've", u"You've"), (u"z'housand", u'thousand'), (u'zlPPING', u'ZIPPING'), (u'Ifslocked', u"It's locked"), (u'nightjust', u'night just'), (u'dayjourney', u'day journey'), (u'Ourjob', u'Our job'), (u'IunCh', u'lunch'), (u'nieCe', u'niece'), (u'giVes', u'gives'), (u'wantto', u'want to'), (u'besttoday', u'best today'), (u'NiCe', u'Nice'), (u'oftravelling', u'of travelling'), (u'oftwo', u'of two'), (u'ALl', u'ALI'), (u'afterparty', u'after-party'), (u'welL', u'well.'), (u'theirjob', u'their job'), (u"lfhe's", u"If he's"), (u'babyjesus', u'baby Jesus'), (u'shithousejohn', u'shithouse John'), (u'jesus', u'Jesus'), (u'withjesus', u'with Jesus'), (u'Gojoin', u'Go join'), (u'Adaughter', u'A daughter'), (u'talkwith', u'talk with'), (u'anyjournals', u'any journals'), (u"L'mjewish", u"I'm Jewish"), (u'arejust', u'are just'), (u'soundjust', u'sound just'), (u"ifl'm", u"if I'm"), (u'askyou', u'ask you'), (u'ordinarywoman', u'ordinary woman'), (u'andjunkies', u'and junkies'), (u'isjack', u'is Jack'), (u'helpyou', u'help you'), (u'thinkyou', u'think you'), (u'Lordjesus', u'Lord Jesus'), (u'injuvy', u'in juvy'), (u'thejets', u'the jets'), (u'ifGod', u'if God'), (u'againstjewish', u'against Jewish'), (u'ajunkie', u'a junkie'), (u'dearjesus', u'dear Jesus'), (u'hearyour', u'hear your'), (u'takeyears', u'take years'), (u'friendjean', u'friend Jean'), (u'Fatherjohn', u'Father John'), (u'youjean', u'you Jean'), (u'hearyou', u'hear you'), (u'Ifshe', u'If she'), (u"didn'tjust", u"didn't just"), (u'IfGod', u'If God'), (u'notjudge', u'not judge'), (u'andjudge', u'and judge'), (u'OKBY', u'Okay'), (u'myjourney', u'my journey'), (u'yourpremium', u'your premium'), (u"we'rejust", u"we're just"), (u'Iittlejokes', u'little jokes'), (u'Iifejust', u'life just'), (u'Andjust', u'And just'), (u'ofThe', u'of The'), (u'lifejust', u'life just'), (u'AIice', u'Alice'), (u'lnternationalAirport', u'International Airport'), (u'yourbody', u'your body'), (u'DollarBaby', u'Dollar Baby'), (u'ofjonesing', u'of jonesing'), (u'yourpanties', u'your panties'), (u'offforme', u'off for me'), (u'pantyparty', u'panty party'), (u'everhit', u'ever hit'), (u'theirhomes', u'their homes'), (u'AirForce', u'Air Force'), (u'yourhead', u'your head'), (u'betterbe', u'better be'), (u'myparty', u'my party'), (u'disasterlockdown', u'disaster lockdown'), (u"Ifpot's", u"If pot's"), (u'ifmy', u'if my'), (u'yourmoney', u'your money'), (u'Potterfan', u'Potter fan'), (u'Hermionejust', u'Hermione just'), (u'ofourshit', u'of our shit'), (u'showyou', u'show you'), (u'answernow', u'answer now'), (u'theirsjust', u'theirs just'), (u'BIackie', u'Blackie'), (u'SIeep', u'Sleep'), (u'foryour', u'for your'), (u'oryour', u'or your'), (u'forArthur', u'for Arthur'), (u'CIamp', u'Clamp'), (u'CIass', u'Class'), (u'CIose', u'Close'), (u'GIove', u'Glove'), (u'EIIen', u'Ellen'), (u'PIay', u'Play'), (u'PIace', u'Place'), (u'EIgyn', u'Elgyn'), (u'AIert', u'Alert'), (u'CIaus', u'Claus'), (u'CIimb', u'Climb'), (u"military'II", u"military'll"), (u'anylonget', u'any longer'), (u'yourlife', u'your life'), (u"Yourbitch'IIgetyou", u"Your bitch'll get you"), (u'yourdick', u'your dick'), (u'Tellyourbitch', u'Tell your bitch'), (u'rememberyou', u'remember you'), (u'newface', u'new face'), (u'Butyou', u'But you'), (u"don'tyou", u"don't you"), (u'yourlives', u'your lives'), (u'Iovedher', u'loved her'), (u'reallydid', u'really did'), (u'firstperson', u'first person'), (u'mybest', u'my best'), (u'Justgive', u'Just give'), (u'AIong', u'Along'), (u'atyourbody', u'at your body'), (u'myhands', u'my hands'), (u'sayhe', u'say he'), (u'mybooty', u'my booty'), (u'yourbooty', u'your booty'), (u'yourgirl', u'your girl'), (u'yourlegs', u'your legs'), (u'betterifthey', u'better if they'), (u'manybeautiful', u'many beautiful'), (u'contactpolice', u'contact police'), (u'numberbelow', u'number below'), (u'biggestproblem', u'biggest problem'), (u'Itgave', u'It gave'), (u'everybodykind', u'everybody kind'), (u'theyhad', u'they had'), (u'knowherlast', u'know her last'), (u'herhearing', u'her hearing'), (u'othermembers', u'other members'), (u'BIing', u'Bling'), (u'CIyde', u'Clyde'), (u'foundguilty', u'found guilty'), (u'fouryears', u'four years'), (u'countyjail', u'county jail'), (u'yearin', u'year in'), (u'theirrole', u'their role'), (u'manybottles', u'many bottles'), (u"can'tpronounce", u"can't pronounce"), (u'manybowls', u'many bowls'), (u'ofthatgreen', u'of that green'), (u'manyjoyrides', u'many joyrides'), (u'Superrich', u'Super rich'), (u'Iprefer', u'I prefer'), (u'Theymust', u'They must'), (u'whatyou', u'what you'), (u"I'IIjump", u"I'll jump"), (u'nobodyknow', u'nobody know'), (u'neverknew', u'never knew'), (u'EIectronica', u'Electronica'), (u'AIarm', u'Alarm'), (u'getyourman', u'get your man'), (u'sayyou', u'say you'), (u'getyour', u'get your'), (u'Fuckyou', u'Fuck you'), (u'Whyyou', u'Why you'), (u'butyoujust', u'but you just'), (u'forgetyourname', u'forget your name'), (u'Whatyou', u'What you'), (u"Co/'ncidenta//y", u'Coincidentally'), (u'GIad', u'Glad'), (u'RachelMarron', u'Rachel Marron'), (u"She'llgive", u"She'll give"), (u'presidentialsuite', u'presidential suite'), (u'andgentlemen', u'and gentlemen'), (u'willnot', u'will not'), (u'ourproducers', u'our producers'), (u"Ifshe's", u"If she's"), (u'CIock', u'Clock'), (u'Ishould', u'I should'), (u"I'llgo", u"I'll go"), (u'maypass', u'may pass'), (u'andprotecting', u'and protecting'), (u'BIessed', u'Blessed'), (u'CIean', u'Clean'), (u'SIave', u'Slave'), (u'AIi', u'Ali'), (u'AIIah', u'Allah'), (u'AIIahu', u'Allahu'), (u'CIick', u'Click'), (u'BIast', u'Blast'), (u'AIlah', u'Allah'), (u'SIow', u'Slow'), (u'theirpolicies', u'their policies'), (u'Orperhaps', u'Or perhaps'), (u'ofsex', u'of sex'), (u'forpleasure', u'for pleasure'), (u'ourpower', u'our power'), (u'Yourpiece', u'Your piece'), (u'Offioers', u'Officers'), (u'oondesoended', u'condescended'), (u'myseif', u'myself'), (u"let'sjust", u'let\u2019s just'), (u'yourway', u'your way'), (u'An9TY', u'Angry'), (u'ourjourney', u'our journey'), (u'LuCY', u'Lucy'), (u"\\'m", u'I\u2019m'), (u'CEDR/C', u'CEDRIC'), (u'lsaac', u'Isaac'), (u'FIy', u'Fly'), (u'Ionger', u'longer'), (u'Iousy', u'lousy'), (u'Iosing', u'losing'), (u"They'II", u"They'll"), (u'yourpaws', u'your paws'), (u'littie', u'little'), (u"It'lljust", u"It'll just"), (u'AIso', u'Also'), (u'Iisten', u'listen'), (u'suPPosed', u'supposed'), (u'somePIace', u'someplace'), (u'exPIain', u'explain'), (u'Iittle', u'little'), (u'StoP', u'Stop'), (u'AIways', u'Always'), (u'Iectures', u'lectures'), (u'Iow', u'low'), (u'Ieaving', u'leaving'), (u'Ietting', u'letting'), (u'Iistening', u'listening'), (u'Iecture', u'lecture'), (u'Iicking', u'licking'), (u'Iosses', u'losses'), (u'PIeased', u'Pleased'), (u'ofburglaries', u'of burglaries'), (u"He'sjust", u"He's just"), (u'mytrucktoo', u'my truck too'), (u'nowwhat', u'now what'), (u'yourfire', u'your fire'), (u"herwhat's", u"her what's"), (u'hearthat', u'hear that'), (u'oryou', u'or you'), (u'preferjournalist', u'prefer journalist'), (u'CIaw', u'Claw'), (u'Ifour', u'If our'), (u'lron', u'Iron'), (u"It'syour", u"It's your"), (u'lfstill', u'If still'), (u'forjoining', u'for joining'), (u'foryears', u'for years'), (u'Ifit', u'If it'), (u'notjump', u'not jump'), (u'ourproblem', u'our problem'), (u'yourprofile', u'your profile'), (u'ifJanine', u'if Janine'), (u'forpreventative', u'for preventative'), (u'whetherprotest', u'whether protest'), (u'Ifnot', u'If not'), (u'ourpeople', u'our people'), (u'offmy', u'off my'), (u'forproviding', u'for providing'), (u'hadjust', u'had just'), (u'nearyou', u'near you'), (u'whateveryou', u'whatever you'), (u'hourputs', u'hour puts'), (u'timejob', u'time job'), (u'overyour', u'over your'), (u'orpermanent', u'or permanent'), (u'createjobs', u'create jobs'), (u"I'vejust", u"I've just"), (u'peoplejobs', u'people jobs'), (u'dinnerpail', u'dinner pail'), (u'hasjumped', u'has jumped'), (u'theirprivacy', u'their privacy'), (u'AIl', u'All'), (u'ofserious', u'of serious'), (u'yourprofessional', u'your professional'), (u'poiitical', u'political'), (u'tojump', u'to jump'), (u'iives', u'lives'), (u'eiections', u'elections'), (u'militaryjuntas', u'military juntas'), (u'nojoke', u'no joke'), (u'yourpresidency', u'your presidency'), (u'ofmilitaryjuntas', u'of military juntas'), (u'Ourproposal', u'Our proposal'), (u'LeBIanc', u'LeBlanc'), (u'KIaus', u'Klaus'), (u'yourpussy', u'your pussy'), (u'lNTERVIEWER', u'INTERVIEWER'), (u'lNAUDIBLE', u'INAUDIBLE'), (u'SImpsons', u'Simpsons'), (u'anotherjob', u'another job'), (u'lfthere', u'If there'), (u'descentinto', u'descent into'), (u'ofthathere', u'of that here'), (u'ofway', u'of way'), (u'yourseat', u'your seat'), (u'allyou', u'all you'), (u'Allyou', u'All you'), (u'yourass', u'your ass'), (u'Yourbutt', u'Your butt'), (u'iustiiggle', u'just jiggle'), (u'iust', u'just'), (u'CSi', u'CSI'), (u'affernoon', u'afternoon'), (u'orpersecution', u'or persecution'), (u'theirpetty', u'their petty'), (u'Fourpercent', u'Four percent'), (u'fourpercent', u'four percent'), (u'willjust', u'will just'), (u"Ifyou're", u"If you're"), (u'ourplanet', u'our planet'), (u'lsolation', u'Isolation'), (u'yourprimitive', u'your primitive'), (u'yourplanet', u'your planet'), (u'matteryour', u'matter your'), (u'Yourplace', u'Your place'), (u'andjustice', u'and justice'), (u'anotherpart', u'another part'), (u'confiict', u'conflict'), (u'growingjeopardy', u'growing jeopardy'), (u'hasjust', u'has just'), (u'havejust', u'have just'), (u'herselfinto', u'herself into'), (u'ifnecessary', u'if necessary'), (u"we'vejust", u"we've just"), (u'tojust', u'to just'), (u'yourjudgment', u'your judgment'), (u'yourjeans', u'your jeans'), (u'Youjust', u'You just'), (u'ajanitor', u'a janitor'), (u'FIattery', u'Flattery'), (u'myjournal', u'my journal'), (u'myjudgment', u'my judgment'), (u'offofmy', u'off of my'), (u'offyour', u'off your'), (u'ofgood', u'of good'), (u'ofguilty', u'of guilty'), (u'ofhaving', u'of having'), (u'ofheart', u'of heart'), (u'ofhonor', u'of honor'), (u'oflove', u'of love'), (u'ofmankind', u'of mankind'), (u'ofmany', u'of many'), (u'ofnormal', u'of normal'), (u'ofpeople', u'of people'), (u'ofpower', u'of power'), (u'ofsuch', u'of such'), (u'peoplejust', u'people just'), (u"They'rejust", u"They're just"), (u'tojeopardize', u'to jeopardize'), (u'Yourplaces', u'Your places'), (u'yourposition', u'your position'), (u'yourselfa', u'yourself a'), (u'yourselfright', u'yourself right'), (u'thejob', u'the job'), (u'thejanitors', u'the janitors'), (u'alljust', u'all just'), (u"forAmerica's", u"for America's"), (u'Forpencils', u'For pencils'), (u'forpondering', u'for pondering'), (u'handwrittenjournals', u'handwritten journals'), (u'herpursuit', u'her pursuit'), (u'ofjust', u'of just'), (u'oflanding', u'of landing'), (u'oflife', u'of life'), (u'outjust', u'out just'), (u'Thejoke', u'The joke'), (u'ourpatient', u'our patient'), (u"oryou're", u"or you're"), (u'ofyourself', u'of yourself'), (u'poweryour', u'power your'), (u'Ofmy', u'Of my'), (u'EIlen', u'Ellen'), (u"Don'tget", u"Don't get"), (u'tellme', u'tell me'), (u'ofdecision', u'of decision'), (u'itgoing', u'it going'), (u'artificialgravity', u'artificial gravity'), (u'shouldknow', u'should know'), (u"Hasn'tgot", u"Hasn't got"), (u'thirdjunction', u'third junction'), (u'somebodypicks', u'somebody picks'), (u'Willyou', u'Will you'), (u"can'tget", u"can't get"), (u'BuZZes', u'Buzzes'), (u"wouldn'tyou", u"wouldn't you"), (u'Wellbelow', u'Well below'), (u"What'dyou", u"What'd you"), (u'decipheredpart', u'deciphered part'), (u"they'llknow", u"they'll know"), (u"ifit's", u"if it's"), (u'ornot', u'or not'), (u'myposition', u'my position'), (u'lndistinct', u'Indistinct'), (u'anybiscuits', u'any biscuits'), (u'Andifyou', u'And if you'), (u'lfwe', u'If we'), (u'yourarm', u'your arm'), (u'lnteresting', u'Interesting'), (u'findit', u'find it'), (u"it'llstart", u"it'll start"), (u'holdit', u'hold it'), (u'ofkilling', u'of killing'), (u'Howyou', u'How you'), (u'lnhales', u'Inhales'), (u'lgot', u'I got'), (u'CIip', u'Clip'), (u"what'II", u"what'll"), (u"road'II", u"road'll"), (u'girI', u'girl'), (u'LIoyd', u'Lloyd'), (u'BIake', u'Blake'), (u'reaI', u'real'), (u'Foryour', u'For your'), (u'yourpublic', u'your public'), (u'LAst', u'Last'), (u'h is', u'his'), (u'He)\u2019', u'Hey'), (u'Ls', u'Is'), (u"al'", u'at'), (u"wail'", u'wait'), (u"III'll", u"I'll"), (u'forthis', u'for this'), (u'Yea h', u'Yeah'), (u'a re', u'are'), (u'He)"', u'Hey'), (u"pan'", u'part'), (u'yea h', u'yeah'), (u'Tun', u'Run'), (u"He)'", u'Hey'), (u"he)'", u'hey'), (u"I'11", u"I'll"), (u'he)"', u'hey'), (u" 're ", u"'re ")]), - 'pattern': u'(?um)(\\b|^)(?:\\$COff\\$|\\$ergei|\\$\\\'llOp|\\/\\\'\\/\\/|\\/\\\'\\/I|\\/ennifer|\\/got|\\/have|\\/hope|\\/just|\\/love|\\/\\\'m|\\/mmerse|\\/nsu\\/ts|\\/ong|\\/ook|\\/t\\\'s|\\/\\\'ve|\\\\\\/\\\\\\/e\\\'d|\\\\\\/\\\\\\/e\\\'re|\\\\\\/\\\\\\/e\\\'ve|\\\\\\/\\\\\\/hat|\\\\\\/\\\\\\/here\\\'d|\\\\\\/\\\\\\/hoo|\\\\\\/\\\\\\/hy|\\\\\\/\\\\\\/hy\\\'d|\\\\\\/\\\\le\\\'re|\\\\\\/Ve|\\\\Ne\\\'re|\\\\Nhat\\\'s|\\\\Nhere\\\'s|\\|\\\'mjust|\\\xa4ff|\\\xa4Id|\\\xa4Ids|\\\xa4n|\\\xa4ne|\\\xa4nly|\\\xa4pen|\\\xa4r|\\\xa4rder|\\\xa4ther|\\\xa4ur|\\\xa4ut|\\\xa4ver|\\\xa4wn|\\\u20acV\\\u20acI\\\'y|0\\\'clock|0f|0fEngland|0fft0|0l\\/er|0n|0ne|0ne\\\'s|0r|0rders|0thers\\\'|0ut|0utlaw\\\'s|0utlaws\\\'|0ver|13oos|18oos|195os|1et\\\'s|1o|1oo|1ooth|1oth|2E\\_|2\\\'IST|2\\\'Ist\\_|2o|2oth|3o|3oth|4o|4os|4oth|50rry|5o|5oth|6o|6os|\\\'6os|6oth|7o|\\\'7os|7oth|8o|\\\'8os|8oth|9\\/aim|9o|9oth|9UnShQt|a\\/\\/|a\\/bum|a\\/so|A\\/ways|abcut|aboutjoining|aboutposh|aboutus|aboutyou|accldent|Acool|afier|affraid|Afriend|afterall|afterthe|afulcrum|Afunny|aga\\/nst|ahsolutes|AI\\_I\\_|AIien|AIex|AII|AIIan|AIIow|AIive|ain\\\'tgotno|Ain\\\'tgotno|airstrike|AIVIBULANCE|ajob|ajockey\\_|ajoke|Ajoke|ajoking|al\\/|al\\/en|alittle|allgasp|alljustforshow|aln\\\'t|alot|Alot|An5wer|Andit|Andit\\\'s|andl|andlaughs|andleave|andthe|andyou|Andyou|ANNOUNC\\/NG|anotherstep|ANSWER\\/NG|answerwhat|antiquejoke|anyhcdy\\\'s|Anyidea|anyone\\\'s\\_|apejust|ARABlc|aren\\\'t\\_|arerl\\\'t|Arnsteln\\\'s|atleast|Atough|Awhole|awoman|Awoman|barelytalked|bcat|Bcllvla|bcmb|bcmbs|be\\/\\/y|becuase|Beep\\/\\\'ng|bejumpy|besldes|bestfriend|bestguy|bestjob|BIack|BIess|bigos\\_\\_\\_|BIame|BIind|BIood|BIue|BLOVVS|blowholel|blt|Bo99|bodiedyoung|breakf\\\xe9wtl|bulldozlng|butjust|butl|Butl|butljust|Butljustcan\\\'tgetenough|Butyou\\\'re|buythem|buyyou|byjust|bythe|C\\/latter\\/\\\'\\/7g|ca\\/\\/\\/ng|ca\\/I|call\\/ng|callyou|can\\*t|can\\\'i|can\\\'I|canlgetyou|cannotchange|cannut|can\\\'T|can\\\'t\\_|can\\\'tjust|can\\\'tletgo|Car0l|Carhorn|carrled|Ccug|Ccugs|Ccver|cellularchange|cff|cfycu|cfycur|Ch\\/rping|chaletgirl|changejobs|Charliejust|Chatter\\/\\\'rtg|CHATTERWG|Chequeredlove|cHIRPINcs|chjldishness|chlldrcn|chlldren|chocolatte|Cho\\/r|cHucKl\\_Es|CIark|CIear|circumcised\\_|ckay|cl\\_osEs|CLATTERWG|cn|cne|cnes|Coincidenta\\/\\/y|COm\\\u20ac|comp\\/etey|complainingabout|coms|cond\\/lion|confdence|conhrmed|connrm|Consecutivelyl|COUGH5|CouGHING|couIdn\\\'t|couldjust|couldn\\\'T|couldn\\\'tjust|Couldyou|crappyjob|CRAsHING|crder|Crowdcheers|Cruoially|cther|cuuld|cver|d\\/\\\'dn\\\'t|d\\/squietude|D\\\xa4esn\\\'t|d\\\xa4n\\\'i|d\\\xa4n\\\'t|d\\\xb09|d0|D0|D0asn\\\'t|Dad\\\'\\/\\/|dairyjust|Dar\\/\\/ng|dc|Dcbby|dccsn\\\'t|dcctcr|Dces|dcgs|dcing|dcn\\\'I|dcn\\\'t|Dcn\\\'t|dcughnut|declslons|deedhas|Dehnitely|desewes|desperate\\/\\\xbby|D\\\ufb02nk|DIAl\\_lNcs|didn\\\'\\!|didnt|didn\\\'T|dIdn\\\'t|didn\\\'t\\_|didrft|didrl\\\'t|didyou|divorcing\\_|dld|dldn\\\'t|dlfflcull|dlg|dlsobeyed|doasn\\\'t|Doasn\\\'t|doctoh|Doctor\\_\\_\\_tell|doesnt|doesn\\\'T|doesri\\\'t|doesrt|Doesrt|doit|dojust|don\\*t|donejobs|don\\\'i|don\\\'l|Don\\\'l|Donllook|dont|don\\\'T|don\\\'tcare|don\\\'tjoke|Don\\\'tjudge|don\\\'tjust|Don\\\'tjust|Don\\\'tlet|don\\\'tlhink|don\\\'tpush|Don\\\'tyou|DonWlook|Dooropens|doorshuts|dothat|dothis|Drinkthis|dumbass|dumbto|dun\\\'t|E\\/\\/e|E9YPt|ea\\/\\\'t\\/7|eart\\/7|efi\\\'\\/\\\'c\\/\\\'ent|EN\\<3LlsH|Enjoythe|Erv\\\\\\/an|Erv\\\\\\/an\\\'s|etemity|ev\\/I|eve\\/yone|even\\/body\\\'s|eversay|Everymonth|everythings|Everythirlg\\\'s|Everythlng\\\'s|Everytime|Exac\\\ufb02y|ExacUy\\_|excitedshrieking|ExcLAllvls|exploatation|expreusion|fairthat|Fathef|fatherfigure|FBl|fcrebcdlng|fcreverjudges|fcund|feeleverything|feelsweet|fiam\\/\\\'\\/y|\\\ufb01ngernail|finishedjunior|FIynn|flll|flra|Flylng|Fnends|fo\\/low|fonzvard|fora|Fora|forajob|forAmerica|forNew|forone|forso|Forsuch|forsunburns|forthe|Foryears|foryou|Foudeen|Fou\\\ufb02een|FourSeasons|fr\\/ends|freezerfood|F\\\xfchrerfeels|furthernotice|furyou|G0|g0in9|gamlenias|GAsPING|gc|gcing|gcnna|Gcnna|gct|Gct|genercsity|generosityn|getjust|g\\\ufb02ing|gi\\\ufb02friend|gir\\/|gir\\/s\\\'boarding|giris|gLlyS|glum\\_|gnyone|golng|goodboyand|goodjob|gOt|gotjumped|gotmyfirstinterview|grandjury|greatjob|Greatjobl|grinco|GRoANING|GRUNUNG|gu|gunna|guyjumped|guyjust|gUyS|\\_H6Y\\-|H\\\u20acY|H0we\\\xb7ver|halftheir|hapPY|hasrt|Hasrt|haven\\\'tspokerl|hcle|hcme|hcmes|hcpe|hctel|hcurs|Hcw|he\\/ps|hearjokestonight|hearme|Hefell|he\\\'II|He\\\'II|HeII0|He\\\'Il|Hejust|He\\\'lI|HelIo|hellc|HellO|herboyfr\\/end|herflesh|herfollov\\\\\\/ed|herjob\\_|HerrSchmidt|herwith|HeY\\\xb7|HeyJennifer|hiddsn|hisjunk|Hitlershare|Hlneed|Hnally|Hnishing|HOId|hOIes|HONMNG|honorthe|honoryou|honoryour|Hov\\\\\\/\\\'s|Hov\\\\\\/\\\'S|HovvLING|howit|HoW\\\'s|howto|Hs\\\'s|hurtyou|I\\/erilj\\/|I\\/fe|I\\\\\\/I|I\\\\\\/Ian|I\\\\\\/Iathies|I\\\\\\/Ie|I\\\\\\/Iommy|I\\\\\\/Ir|I\\\\\\/Ir\\.|I\\\\\\/ly|I3EEPING|I3LARING|Iacings|Iaid|Iam|Iand|Ianding|Iast|Iate|Icad|Icading|Ican|Iccked|Icng|Icsing|Icslng|Idid|Ididn\\\'t|Ido|Idon\\\'i|Idon\\\'t|Idon\\\'tthink|I\\\'E\\\'\\$|Ieamed|Ieapt|Iearned|Ieast|Ieave|Ied|Ieft|Ieg\\\'s|Iess|Iet|Iet\\\'s|Iet\\\'sjust|if\\/just|Ifear|Ifeared|Ifeel|ifI\\\'\\|\\||ifI\\\'d|ifI\\\'II|ifI\\\'ll|ifI\\\'m|Ifinally|ifI\\\'ve|ifl|Iforgot|Ifound|ifshe|ifthat\\\'s|ifthe|Ifthe|ifthere\\\'s|Ifthey|ifwe|Ifwe|Ifycu|ifyou|Ifyou|ifyuu|Iget|Igot|Igotta|Igotyou|Iguess|Iguessljust|Ihad|Ihat\\\'s|Ihave|Iheard|ihere\\\'s|ihey\\\'ve|Ihope|ii\\/Iary|ii\\/Ir|ii\\/Ir\\.|ii\\/love|Iife|I\\\'II|Iike|I\\\'Il|Iine|iirst|ii\\\'s|Ii\\\'s|Iiterallyjumped|Ijoined|Ijust|Iknew|Iknow|Ile|Ileft|I\\\'lldo|I\\\'llmake|Ilons|Ilove|I\\\'mjust|Inconceivablel|infact|Infact|in\\\ufb02uence|infront|injust|insc\\\ufb01p\\\ufb01ons|insolencel|intc|internationaljudges|inthe|Iockdown|Iong|Iongships|Iook|Iookjust|Iooklng|Iooks|Ioose|Iord\\\'s|Iose|Ioser|Ioss|Iost|Iot|Iot\\\'s|Iousyjob|Iove|Ioves|Iowlife|Ipaid|Iquit|Ireallythinkthis|I\\\'rn|Isaw|Isayt\\/1e|isjust|isn\\\'i|isn\\\'t\\_|Isthis|Istill|Istumblod|Itake|itdown|Iteach|Itfeels|ithave|Ithink|Ithinkthat|Ithinkthis|Ithinkyou\\\'re|Ithlnk|Ithoguht|Ithought|Ithoughtl|it\\\'II|It\\\'II|it\\\'Il|It\\\'Il|itin|itjust|Itjust|it\\\'lI|It\\\'lI|It\\\'llhappen|it\\\'lljust|Itold|Itook|itout|it\\\'S|it\\\'sjinxed|it\\\'sjust|It\\\'sjust|itso|Ittends|Itwasn\\\'t|Iuckier|IV\\|oney|IV\\|oney\\\'s|I\\\'va|I\\\'Ve|IVIan|IVIAN|IVIarch|IVIarci\\\'s|IVIarko|IVIe|IVIine\\\'s|IVImm|IVIoney|IVIr\\.|IVIrs|IVIuch|IVIust|IVIy|IVlacArthur|IVlacArthur\\\'s|IVlcBride|IVlore|IVlotherfucker\\_|IVlr|IVlr\\.|IVlr\\_|IVlust|IVly|Iwake|Iwant|Iwanted|Iwas|Iwasjust|Iwasjustu|Iwill|Iwish|Iwon\\\'t|Iworked|Iwould|jalapeno|Jaokson|Jascn|jcke|jennifer|joseph|Jumpthem|jusi|jusl|justjudge|justleave|Justletgo|kidsjumped|kiokflip|knowjust|knowthat|knowthis|knowwhat|knowyet|knowyourlove|korean|L\\/ght|L\\/kes|L\\\\\\/Ianuela|L\\\\\\/Ianuelal|l\\\\\\/Iauzard|l\\\\\\/I\\\xe9lanie|L\\\\\\/I\\\xe9lanie|l\\\\\\/Iom|l\\\\\\/Iommy|l\\\\\\/Ir|l\\\\\\/Ir\\.|l\\\\\\/Is|l\\\\\\/ly|l\\_AuGHING|l\\\u2018m|Laml6|Lcad|lcan|lcan\\\'t|lcarl\\\'t\\_|Lcve|l\\\'d|L\\\'d|ldid|Ldid|ldiot|L\\\'djump|ldon\\\'t|Ldon\\\'t|Lefs|Let\\\'sjust|lf|Lf|lfeelonelung|lfthey|lfyou|Lfyou|lfyou\\\'re|lget|lgive|Li\\/0\\/Academy|li\\/lr\\.|ligature\\_\\_\\_|l\\\'II|l\\\'Il|ljust|Ljust|ll\\/Iommy\\\'s|ll\\/lajor|Ll\\/lajor|ll\\/layans|l\\\'lI|l\\\'ll|L\\\'ll|l\\\'lljust|L\\\'lltake|llte|l\\\'m|L\\\'m|Lmean|l\\\'mjust|ln|lN|lNAuDll3LE|LNAuDll3LE|LNDlsTINcT|lneed|lostyou|Loudmusic|lraq|lRA\\\'s|Lrenka|Lrn|lRS|lsabella|lsn\\\'t|Lsn\\\'t|Lst\\\'s|lsuppose|lt|ltake|ltell|lthink|Lthink|lthink\\_\\_\\_|lt\\\'II|lt\\\'Il|ltjammed\\_|lt\\\'ll|ltold|lt\\\'s|lT\\\'S|Lt\\\'S|Lt\\\'sjust|lv\\\\\\/asn\\\'t|l\\\'ve|L\\\'ve|lVIan|lVIcHenry|lVIr\\.|lVlacArthur|LVlore|lVlr|lVlr\\.|lvluslc|lVlust|LVly|lwaited|lwamoto|lwant|lwanted|lwas|lwill|lwon\\\'t|lworked|lwould|lwould\\\'ve|lx\\/Iorning|M\\/dd\\/e|m\\/g\\/7ty|MACH\\/NE|MacKenz\\/e|majorjackpot|majormuscle|Manuela\\_|maste\\/y|Masturhate|Mattei\\_|mayjust|mbecause|McCa\\/Iister|McCallisler|Mccallister|Mccallisters|mcm\\\'s|mcney|mcral|mcre|mcve|mejust|Mexioo|mi\\/\\/\\<|misfartune|Ml6|Mlnd|Mock\\/\\\'ngbl\\\'rd|mOI\\\'\\\u20ac|Mom\\_|monkeyback|move\\_\\_\\_l|moveto|mustknock|Myheart|myjch|myjet|myjob|Myjob|myjob\\\'s|mylife|Mynew|myown|mypants|myselli|Myshoes|mysong|mytemper|mythumb|Myworld|N0|narne|Natians|naTve|nc|Nc|ncne|Ncrth|ncw|Ncw|needyou|neighboun|neverfound|neverthere|neverv\\\\\\/ill\\_|NewJersey|newjob|newjobs|nextdoor|Nighw|nilios|Nlagnificence|Nlakes|Nlalina|Nlan|Nlarch|Nlarine|Nlarion|Nlarry|Nlars|Nlarty|Nle|Nleet|Nlen|Nlom|Nlore|Nlornin|Nlother|Nlr|Nlr\\.|Nlrs|Nluch|nojurisdiction|noone|Noone|not\\ judging|notgoing|notjunk|Notjunk|notjust|notsure|novv|Nowjust|Nowthat\\\'s|Numbertwo|oan\\\'t|oan\\\'tjust|objecl|occultpowerand|Ocps|ofa|ofajudge|ofall|Ofall|ofBedford|ofcourse|Ofcourse|ofeach|ofeither|Offioer\\\'s|ofFrance|offreedom|offthe|offthis|offto|offun|ofguy|Ofhce|ofhis|ofHis|ofhoneybees|ofit|ofjam|OFJOAN|ofjoy|ofjunior|ofme|ofmead|ofmicroinjections|ofmy|ofNew|ofNorris\\\'|ofopinions|ofour|ofpeopla|ofthat|ofthe|Ofthe|oftheir|ofthem|ofthem\\\'s|ofthemselves|ofthere|ofthese|ofthings|ofthis|ofthlngs|ofthose|ofuse|ofwashington|ofyou|ofyour|OId|OIsson|Ok3Y|okaY|OkaY|OKaY|OKGY|Ol\\<|oldAdolfon|onboard|onIy|onIything|onJanuaw|onlyjust|Onyinal|oomprise|oonstitution|oouldn\\\'t|oould\\\'ve|oousin\\\'s|opiimistically|ora|orfall|orglory|orjust|Orjust|Orthat|orwould|Orwould|Othenzvise|our\\ joumey|ourbrave|ourfathers|ourgirlon|Ourgoal|Ourguy|ourj0b\\\'s|Ourj0b\\\'s|ourjobs|ourjob\\\'s|Ourjob\\\'s|ourjoumey|ourphotos|ourv\\\\\\/ay|outlool\\<\\\'s|overme|overthe|overthere|p\\/ace|P\\/ease|p\\_m\\_|P\\\xb0P\\$|PANUNG|pclnt|pclnts|pe0pIe|Perrut\\_|Persona\\/4\\/|Persona\\/y|persors|PIain|PIease|PIeasure|PIus|pleasurlng|POIe|Polynes\\/ans|poorshowing|popsicle|Presidenfs|probablyjust|puIIing|Putyourhand|Qh|QkaY|Qpen|QUYS|\\_QW|r\\/ght|ralnbow|ratherjump|ratherjust|Rcque|rcscucd|rea\\/|readytolaunchu|reaHy|ReaHy|reallyjust|reallymiss|reallytalked|reallythink|reallythinkthis|rememberthem|reoalibrated|retum|rhfluence|rightdown|roadyou|RUMBUNG|s\\/uggikh|S0|S1oW1y|saidyou|sayeverything\\\'s|saynothing|saythat|sc|scientihc|SCREAIVHNG|sCREAlvllNG|SCREAlvllNG|scund|S\\\'EOp|severa\\/parents|sfill|S\\\ufb02ence|shallrise|sHATTERING|shcws|Shdsjust|She\\`s|She\\\u2018II|she\\\'II|She\\\'II|she\\\'Il|Shejust|she\\\'lI|Shoofing|ShOp|shortyears|shou\\/dn|shou\\\ufb01ng|Shou\\\ufb02ng|shouldnt|Shouldrt|shouldrt|Shs\\\'s|SHUDDERWG|Shutup|SIGH\\$|signifcance|Sincc|sistervvill|Skarsg\\\xe9rd|slcsHs|slGHINcs|slGHING|slNGING|slzzLING|smarfest|Smiih|so\\/id|SoBl3lNG|soemtimes|Sojust|soldierl|somethlng|somethlng\\\'s|somez\\\'\\/7\\/ng|somthing|sumthing|sou\\/|SoundofMusic|SP\\/ash|SPEAK\\/NG|speII|speII\\\'s|Spendourtime|sQUA\\\\\\/\\\\\\/KING|StAnton|stealsjeans|StilI|Stilldesperatelyseeking|stlll|sToPs|storyl|Stubbom|su\\/faces|suffocaiing|summerjob|Summerjust|sun\\/ive|superiorman|sur\\\ufb02aces|t\\/ying|T0|T00|ta\\/ks|taiked|talkto|Talkto|talktonight|tampax|tc|tcday|tcrturing|tcuch|te\\/\\/|tearjust|tellsjokes|tellyou|terriers\\_|th\\/nk|THEPASSION|thafs|Thafs|Thai\\\'s|Thal\\\'s|thankyou|Thankyou|thatconverts|thatgoes|that\\\'II|That\\\'II|thatjob|thatjunk|thatjust|thatleads|Thatl\\\'m|that\\\'s\\ just|Thatsand|that\\\'sjust|That\\\'sjust|Thc|theirface|theirfeet|theirfury|thejaw|thejoint|thejudge|thejudges|Thejudges|thejury|Thelook|Therds|There\\\'II|There\\\'Il|There\\\'lI|They\\\'\\/\\\'e|they\\/\\\'II|They\\/re|They\\/\\\'re|they\\\'II|they\\\'Il|theyjust|Theyjust|they\\\'lI|They\\\'lI|theyre|theysay|thinkthat|this\\\'II|thlngs|Thlnkthls|thls|thore\\\'s|Thore\\\'s|Thorjust|thoughtl\\\'dletyou|tnatjust|tnat\\\'s|Tnat\\\'s|Tnere\\\'ll|to\\/\\/et|To\\/\\/S|todayl\\\'d|togelher|togethen|tojoin|tojudge|toldyou|tomorrovv|Tonighfsjust|totake|totalk|tothat|tothe|Towef|Tr\\/ck\\/ing|Traitur|tv\\\\\\/o|tvvelve|Tvvelve|tvventy|Tvventy|tvvo|Tvvo|twc|unconhrmed|underthat|underthe|underthese|underyour|unfilyou|Unfon\\\'unate\\/y|Uninnabited|untilApril|untilyou|upthinking|upto|V\\\\\\/ait\\_\\_\\_|v\\\\\\/as|V\\\\\\/as|V\\\\\\/e|v\\\\\\/eek\\\'s|V\\\\\\/eird\\_|V\\\\\\/ell|V\\\\\\/hat|V\\\\\\/hen\\\'ll|V\\\\\\/ho|v\\\\\\/ho\\\'ll|v\\\\\\/Hoops|v\\\\\\/ho\\\'s|V\\\\\\/ho\\\'s|V\\\\\\/hy|v\\\\\\/ith|v\\\\\\/on\\\'t|V\\\\fith|V\\\\fithin|valedictolian|vcice|ve\\/y|veiy|V\\\xe9ry|versioin|vi\\/ay|visitjails|Viva\\/di\\\'s|vlll|Voil\\\xe1|Voil\\\xe9|vvasjust|VVasn\\\'t|vvay|VVe|VVe\\\'II|VVe\\\'ll|Vvelooked|VVe\\\'re|VVe\\\'ve|VVhat|VVhat\\\'s|VVhat\\\'S|VVhen|\\\'v\\\'Vhere\\\'s|VVhip|vvHooPING|VvHooPING|VVhy|VVill|VVinters|vvlND|w\\\xa4n\\\'t|W9|waht|waierfall|walkjust|wallplant|wannajump|wantyou|Warcontinues|wasjennifer|wasjust|wasrt|Wasrt|wayl|wayround|wclf|wcman|wcmen|wcn\\\'t|wcrse|wculd|We\\/\\/|We\\/came|we\\/come|We\\/come|We\\/I|weekendjust|werert|Werert|we\\\'II|We\\\'II|we\\\'Il|We\\\'Il|wejust|we\\\'lI|We\\\'rejust|We\\\'ro|We\\\'Ve|wh\\/p|Wh\\\xb0ops|Whafs|Whatam|Whatare|Whateverwe|What\\\'II|Whatis|whatjust|Whatl|whatshe|whatwe|Whc\\\'s|Whcse|wHlsPERs|wi\\/\\/|wil\\/|Wil\\/|wilI|willbe|willhire|willneverknow|willyou|wlfe|wlfe\\\'s|wlth|wnat\\\'s|Wno|Wo\\/f|wo\\\ufb02d|WOI\\\'1\\\'t|wondernobody|won\\\'T|won\\\'tanswerme|won\\\'tforget|won\\\'tletitbring|Wo\\\'re|worfd|won\\\'th|won\\\'thwhile|workyou|wouIdn\\\'t|wouldn\\\'\\!|Wouldrt|wr\\/\\\'2\\\'\\/ng|writign|wrcng|wuuld|\\_Yay|Y\\\xa4u\\\'II|Y\\\xa4u\\\'ll|y\\\xa4u\\\'re|Y\\\xa4u\\\'re|y\\\xa4u\\\'ve|Y0|y0LI|y0u\\\'II|Y0u\\\'rc|Y0u\\\'re|Y0u\\\'ve|yaming|yaurparents|ycu|ycu\\\'d|ycur|Ycu\\\'re|Ycursins|YEI\\_I\\_|YELL\\$|yigg\\/mg|Yigg\\/mg|yoLI|yOu|yOU|you\\`re|you\\\'II|You\\\'II|You\\\'Il|youjack|youjoin|Youjoin|youjust|You\\\'lI|youngsterlike|youpick|you\\\'ra|Yourattention|yourautomobile|You\\\'rejustjealous|yourextra|yourfather|yourhand|yourhusband|yourjewelry|yourjob|Yourjob|yourjob\\_|yourjockey|yourjury|yourname|Yourpackage|yourpackage|you\\\'ro|yourpoorleg|yourvveak|you\\\'va|You\\\'va|youWlneversee|yQu|YQu|yQu\\\'\\_7|yummY|yuu|Yuu|Yuu\\\'ve|z\\\'housand|zlPPING|Ifslocked|nightjust|dayjourney|Ourjob|IunCh|nieCe|giVes|wantto|besttoday|NiCe|oftravelling|oftwo|ALl|afterparty|welL|theirjob|lfhe\\\'s|babyjesus|shithousejohn|jesus|withjesus|Gojoin|Adaughter|talkwith|anyjournals|L\\\'mjewish|arejust|soundjust|ifl\\\'m|askyou|ordinarywoman|andjunkies|isjack|helpyou|thinkyou|Lordjesus|injuvy|thejets|ifGod|againstjewish|ajunkie|dearjesus|hearyour|takeyears|friendjean|Fatherjohn|youjean|hearyou|Ifshe|didn\\\'tjust|IfGod|notjudge|andjudge|OKBY|myjourney|yourpremium|we\\\'rejust|Iittlejokes|Iifejust|Andjust|ofThe|lifejust|AIice|lnternationalAirport|yourbody|DollarBaby|ofjonesing|yourpanties|offforme|pantyparty|everhit|theirhomes|AirForce|yourhead|betterbe|myparty|disasterlockdown|Ifpot\\\'s|ifmy|yourmoney|Potterfan|Hermionejust|ofourshit|showyou|answernow|theirsjust|BIackie|SIeep|foryour|oryour|forArthur|CIamp|CIass|CIose|GIove|EIIen|PIay|PIace|EIgyn|AIert|CIaus|CIimb|military\\\'II|anylonget|yourlife|Yourbitch\\\'IIgetyou|yourdick|Tellyourbitch|rememberyou|newface|Butyou|don\\\'tyou|yourlives|Iovedher|reallydid|firstperson|mybest|Justgive|AIong|atyourbody|myhands|sayhe|mybooty|yourbooty|yourgirl|yourlegs|betterifthey|manybeautiful|contactpolice|numberbelow|biggestproblem|Itgave|everybodykind|theyhad|knowherlast|herhearing|othermembers|BIing|CIyde|foundguilty|fouryears|countyjail|yearin|theirrole|manybottles|can\\\'tpronounce|manybowls|ofthatgreen|manyjoyrides|Superrich|Iprefer|Theymust|whatyou|I\\\'IIjump|nobodyknow|neverknew|EIectronica|AIarm|getyourman|sayyou|getyour|Fuckyou|Whyyou|butyoujust|forgetyourname|Whatyou|Co\\/\\\'ncidenta\\/\\/y|GIad|RachelMarron|She\\\'llgive|presidentialsuite|andgentlemen|willnot|ourproducers|Ifshe\\\'s|CIock|Ishould|I\\\'llgo|maypass|andprotecting|BIessed|CIean|SIave|AIi|AIIah|AIIahu|CIick|BIast|AIlah|SIow|theirpolicies|Orperhaps|ofsex|forpleasure|ourpower|Yourpiece|Offioers|oondesoended|myseif|let\\\'sjust|yourway|An9TY|ourjourney|LuCY|\\\\\\\'m|CEDR\\/C|lsaac|FIy|Ionger|Iousy|Iosing|They\\\'II|yourpaws|littie|It\\\'lljust|AIso|Iisten|suPPosed|somePIace|exPIain|Iittle|StoP|AIways|Iectures|Iow|Ieaving|Ietting|Iistening|Iecture|Iicking|Iosses|PIeased|ofburglaries|He\\\'sjust|mytrucktoo|nowwhat|yourfire|herwhat\\\'s|hearthat|oryou|preferjournalist|CIaw|Ifour|lron|It\\\'syour|lfstill|forjoining|foryears|Ifit|notjump|ourproblem|yourprofile|ifJanine|forpreventative|whetherprotest|Ifnot|ourpeople|offmy|forproviding|hadjust|nearyou|whateveryou|hourputs|timejob|overyour|orpermanent|createjobs|I\\\'vejust|peoplejobs|dinnerpail|hasjumped|theirprivacy|AIl|ofserious|yourprofessional|poiitical|tojump|iives|eiections|militaryjuntas|nojoke|yourpresidency|ofmilitaryjuntas|Ourproposal|LeBIanc|KIaus|yourpussy|lNTERVIEWER|lNAUDIBLE|SImpsons|anotherjob|lfthere|descentinto|ofthathere|ofway|yourseat|allyou|Allyou|yourass|Yourbutt|iustiiggle|iust|CSi|affernoon|orpersecution|theirpetty|Fourpercent|fourpercent|willjust|Ifyou\\\'re|ourplanet|lsolation|yourprimitive|yourplanet|matteryour|Yourplace|andjustice|anotherpart|confiict|growingjeopardy|hasjust|havejust|herselfinto|ifnecessary|we\\\'vejust|tojust|yourjudgment|yourjeans|Youjust|ajanitor|FIattery|myjournal|myjudgment|offofmy|offyour|ofgood|ofguilty|ofhaving|ofheart|ofhonor|oflove|ofmankind|ofmany|ofnormal|ofpeople|ofpower|ofsuch|peoplejust|They\\\'rejust|tojeopardize|Yourplaces|yourposition|yourselfa|yourselfright|thejob|thejanitors|alljust|forAmerica\\\'s|Forpencils|forpondering|handwrittenjournals|herpursuit|ofjust|oflanding|oflife|outjust|Thejoke|ourpatient|oryou\\\'re|ofyourself|poweryour|Ofmy|EIlen|Don\\\'tget|tellme|ofdecision|itgoing|artificialgravity|shouldknow|Hasn\\\'tgot|thirdjunction|somebodypicks|Willyou|can\\\'tget|BuZZes|wouldn\\\'tyou|Wellbelow|What\\\'dyou|decipheredpart|they\\\'llknow|ifit\\\'s|ornot|myposition|lndistinct|anybiscuits|Andifyou|lfwe|yourarm|lnteresting|findit|it\\\'llstart|holdit|ofkilling|Howyou|lnhales|lgot|CIip|what\\\'II|road\\\'II|girI|LIoyd|BIake|reaI|Foryour|yourpublic|LAst|h\\ is|He\\)\\\u2019|Ls|al\\\'|wail\\\'|III\\\'ll|forthis|Yea\\ h|a\\ re|He\\)\\"|pan\\\'|yea\\ h|Tun|He\\)\\\'|he\\)\\\'|I\\\'11|he\\)\\"|\\ \\\'re\\ )(\\b|$)'}}, + 'WholeWords': {'data': OrderedDict([(u'$COff$', u'scoffs'), (u'$ergei', u'Sergei'), (u"$'llOp", u'Stop'), (u"/'//", u"I'll"), (u"/'/I", u"I'll"), (u'/ennifer', u'Jennifer'), (u'/got', u'I got'), (u'/have', u'I have'), (u'/hope', u'I hope'), (u'/just', u'I just'), (u'/love', u'I love'), (u"/'m", u"I'm"), (u'/mmerse', u'immerse'), (u'/nsu/ts', u'Insults'), (u'/ong', u'long'), (u'/ook', u'look'), (u"/t's", u"It's"), (u"/'ve", u"I've"), (u"\\/\\/e'd", u"We'd"), (u"\\/\\/e're", u"We're"), (u"\\/\\/e've", u"We've"), (u'\\/\\/hat', u'What'), (u"\\/\\/here'd", u"Where'd"), (u'\\/\\/hoo', u'Whoo'), (u'\\/\\/hy', u'Why'), (u"\\/\\/hy'd", u"Why'd"), (u"\\/\\le're", u"We're"), (u'\\/Ve', u'We'), (u"\\Ne're", u"We're"), (u"\\Nhat's", u"What's"), (u"\\Nhere's", u"Where's"), (u"|'mjust", u"I'm just"), (u'\xa4ff', u'off'), (u'\xa4Id', u'old'), (u'\xa4Ids', u'olds'), (u'\xa4n', u'on'), (u'\xa4ne', u'one'), (u'\xa4nly', u'only'), (u'\xa4pen', u'open'), (u'\xa4r', u'or'), (u'\xa4rder', u'order'), (u'\xa4ther', u'other'), (u'\xa4ur', u'our'), (u'\xa4ut', u'out'), (u'\xa4ver', u'over'), (u'\xa4wn', u'own'), (u"\u20acV\u20acI'y", u'every'), (u"0'clock", u"o'clock"), (u'0f', u'of'), (u'0fEngland', u'of England'), (u'0fft0', u'off to'), (u'0l/er', u'over'), (u'0n', u'on'), (u'0ne', u'one'), (u"0ne's", u"one's"), (u'0r', u'or'), (u'0rders', u'orders'), (u"0thers'", u"others'"), (u'0ut', u'out'), (u"0utlaw's", u"outlaw's"), (u"0utlaws'", u"outlaws'"), (u'0ver', u'over'), (u'13oos', u'1300s'), (u'18oos', u'1800s'), (u'195os', u'1950s'), (u"1et's", u"let's"), (u'1o', u'10'), (u'1oo', u'100'), (u'1ooth', u'100th'), (u'1oth', u'10th'), (u'2E_', u'2E.'), (u"2'IST", u'21ST'), (u"2'Ist_", u"2'1st."), (u'2o', u'20'), (u'2oth', u'20th'), (u'3o', u'30'), (u'3oth', u'30th'), (u'4o', u'40'), (u'4os', u'40s'), (u'4oth', u'40th'), (u'50rry', u'sorry'), (u'5o', u'50'), (u'5oth', u'50th'), (u'6o', u'60'), (u'6os', u'60s'), (u"'6os", u"'60s"), (u'6oth', u'60th'), (u'7o', u'70'), (u"'7os", u"'70s"), (u'7oth', u'70th'), (u'8o', u'80'), (u"'8os", u"'80s"), (u'8oth', u'80th'), (u'9/aim', u'alarm'), (u'9o', u'90'), (u'9oth', u'90th'), (u'9UnShQt', u'gunshot'), (u'a//', u'all'), (u'a/bum', u'album'), (u'a/so', u'also'), (u'A/ways', u'Always'), (u'abcut', u'about'), (u'aboutjoining', u'about joining'), (u'aboutposh', u'about posh'), (u'aboutus', u'about us'), (u'aboutyou', u'about you'), (u'accldent', u'accident'), (u'Acool', u'A cool'), (u'afier', u'after'), (u'affraid', u'afraid'), (u'Afriend', u'A friend'), (u'afterall', u'after all'), (u'afterthe', u'after the'), (u'afulcrum', u'a fulcrum'), (u'Afunny', u'A funny'), (u'aga/nst', u'against'), (u'ahsolutes', u'absolutes'), (u'AI_I_', u'ALL'), (u'AIien', u'Alien'), (u'AIex', u'Alex'), (u'AII', u'All'), (u'AIIan', u'Allan'), (u'AIIow', u'Allow'), (u'AIive', u'Alive'), (u"ain'tgotno", u"ain't got no"), (u"Ain'tgotno", u"Ain't got no"), (u'airstrike', u'air strike'), (u'AIVIBULANCE', u'AMBULANCE'), (u'ajob', u'a job'), (u'ajockey_', u'a jockey.'), (u'ajoke', u'a joke'), (u'Ajoke', u'A joke'), (u'ajoking', u'a joking'), (u'al/', u'all'), (u'al/en', u'alien'), (u'alittle', u'a little'), (u'allgasp', u'all gasp'), (u'alljustforshow', u'all just for show'), (u"aln't", u"ain't"), (u'alot', u'a lot'), (u'Alot', u'A lot'), (u'An5wer', u'Answer'), (u'Andit', u'And it'), (u"Andit's", u"And it's"), (u'andl', u'and I'), (u'andlaughs', u'and laughs'), (u'andleave', u'and leave'), (u'andthe', u'and the'), (u'andyou', u'and you'), (u'Andyou', u'And you'), (u'ANNOUNC/NG', u'ANNOUNCING'), (u'anotherstep', u'another step'), (u'ANSWER/NG', u'ANSWERING'), (u'answerwhat', u'answer what'), (u'antiquejoke', u'antique joke'), (u"anyhcdy's", u"anybody's"), (u'Anyidea', u'Any idea'), (u"anyone's_", u"anyone's."), (u'apejust', u'ape just'), (u'ARABlc', u'ARABIC'), (u"aren't_", u"aren't."), (u"arerl't", u"aren't"), (u"Arnsteln's", u"Arnstein's"), (u'atleast', u'at least'), (u'Atough', u'A tough'), (u'Awhole', u'A whole'), (u'awoman', u'a woman'), (u'Awoman', u'A woman'), (u'barelytalked', u'barely talked'), (u'bcat', u'boat'), (u'Bcllvla', u'Bolivia'), (u'bcmb', u'bomb'), (u'bcmbs', u'bombs'), (u'be//y', u'belly'), (u'becuase', u'because'), (u"Beep/'ng", u'Beeping'), (u'bejumpy', u'be jumpy'), (u'besldes', u'besides'), (u'bestfriend', u'best friend'), (u'bestguy', u'best guy'), (u'bestjob', u'best job'), (u'BIack', u'Black'), (u'BIess', u'Bless'), (u'bigos___', u'bigos...'), (u'BIame', u'Blame'), (u'BIind', u'Blind'), (u'BIood', u'Blood'), (u'BIue', u'Blue'), (u'BLOVVS', u'BLOWS'), (u'blowholel', u'blowhole!'), (u'blt', u'bit'), (u'Bo99', u'Bogg'), (u'bodiedyoung', u'bodied young'), (u'breakf\xe9wtl', u'breakfast!'), (u'bulldozlng', u'bulldozing'), (u'butjust', u'but just'), (u'butl', u'but I'), (u'Butl', u'But I'), (u'butljust', u'but I just'), (u"Butljustcan'tgetenough", u"But I just can't get enough"), (u"Butyou're", u"But you're"), (u'buythem', u'buy them'), (u'buyyou', u'buy you'), (u'byjust', u'by just'), (u'bythe', u'by the'), (u"C/latter/'/7g", u'Chattering'), (u'ca///ng', u'calling'), (u'ca/I', u'call'), (u'call/ng', u'calling'), (u'callyou', u'call you'), (u'can*t', u"can't"), (u"can'i", u"can't"), (u"can'I", u"can't"), (u'canlgetyou', u'canI get you'), (u'cannotchange', u'cannot change'), (u'cannut', u'cannot'), (u"can'T", u"can't"), (u"can't_", u'Crucially'), (u"can'tjust", u"can't just"), (u"can'tletgo", u"can't let go"), (u'Car0l', u'Carol'), (u'Carhorn', u'Car horn'), (u'carrled', u'carried'), (u'Ccug', u'Coug'), (u'Ccugs', u'Cougs'), (u'Ccver', u'Cover'), (u'cellularchange', u'cellular change'), (u'cff', u'off'), (u'cfycu', u'of you'), (u'cfycur', u'of your'), (u'Ch/rping', u'Chirping'), (u'chaletgirl', u'chalet girl'), (u'changejobs', u'change jobs'), (u'Charliejust', u'Charlie just'), (u"Chatter/'rtg", u'Chattering'), (u'CHATTERWG', u'CHATTERING'), (u'Chequeredlove', u'Chequered love'), (u'cHIRPINcs', u'CHIRPING'), (u'chjldishness', u'childishness'), (u'chlldrcn', u'children'), (u'chlldren', u'children'), (u'chocolatte', u'chocolate'), (u'Cho/r', u'Choir'), (u'cHucKl_Es', u'CHUCKLES'), (u'CIark', u'Clark'), (u'CIear', u'Clear'), (u'circumcised_', u'circumcised.'), (u'ckay', u'okay'), (u'cl_osEs', u'CLOSES'), (u'CLATTERWG', u'CLATTERING'), (u'cn', u'on'), (u'cne', u'one'), (u'cnes', u'ones'), (u'Coincidenta//y', u'Coincidentally'), (u'COm\u20ac', u'Come'), (u'comp/etey', u'completely'), (u'complainingabout', u'complaining about'), (u'coms', u'come'), (u'cond/lion', u'condition'), (u'confdence', u'confidence'), (u'conhrmed', u'confirmed'), (u'connrm', u'confirm'), (u'Consecutivelyl', u'Consecutively!'), (u'COUGH5', u'COUGHS'), (u'CouGHING', u'COUGHING'), (u"couIdn't", u"couldn't"), (u'couldjust', u'could just'), (u"couldn'T", u"couldn't"), (u"couldn'tjust", u"couldn't just"), (u'Couldyou', u'Could you'), (u'crappyjob', u'crappy job'), (u'CRAsHING', u'CRASHING'), (u'crder', u'order'), (u'Crowdcheers', u'Crowd cheers'), (u'Cruoially', u'Crucially'), (u'cther', u'other'), (u'cuuld', u'could'), (u'cver', u'over'), (u"d/'dn't", u"didn't"), (u'd/squietude', u'disquietude'), (u"D\xa4esn't", u"Doesn't"), (u"d\xa4n'i", u"don't"), (u"d\xa4n't", u"don't"), (u'd\xb09', u'dog'), (u'd0', u'do'), (u'D0', u'Do'), (u"D0asn't", u"Doesn't"), (u"Dad'//", u"Dad'll"), (u'dairyjust', u'dairy just'), (u'Dar//ng', u'Darling'), (u'dc', u'do'), (u'Dcbby', u'Dobby'), (u"dccsn't", u"doesn't"), (u'dcctcr', u'doctor'), (u'Dces', u'Does'), (u'dcgs', u'dogs'), (u'dcing', u'doing'), (u"dcn'I", u"don't"), (u"dcn't", u"don't"), (u"Dcn't", u"Don't"), (u'dcughnut', u'doughnut'), (u'declslons', u'decisions'), (u'deedhas', u'deed has'), (u'Dehnitely', u'Definitely'), (u'desewes', u'deserves'), (u'desperate/\xbby', u'desperately'), (u'D\ufb02nk', u'Drink'), (u'DIAl_lNcs', u'DIALING'), (u"didn'!", u"didn't"), (u'didnt', u"didn't"), (u"didn'T", u"didn't"), (u"dIdn't", u"didn't"), (u"didn't_", u"didn't."), (u'didrft', u"didn't"), (u"didrl't", u"didn't"), (u'didyou', u'did you'), (u'divorcing_', u'divorcing.'), (u'dld', u'did'), (u"dldn't", u"didn't"), (u'dlfflcull', u'difficult'), (u'dlg', u'dig'), (u'dlsobeyed', u'disobeyed'), (u"doasn't", u"doesn't"), (u"Doasn't", u"Doesn't"), (u'doctoh', u'doctor'), (u'Doctor___tell', u'Doctor... tell'), (u'doesnt', u"doesn't"), (u"doesn'T", u"doesn't"), (u"doesri't", u"doesnt't"), (u'doesrt', u"doesn't"), (u'Doesrt', u"Doesn't"), (u'doit', u'do it'), (u'dojust', u'do just'), (u'don*t', u"don't"), (u'donejobs', u'done jobs'), (u"don'i", u"don't"), (u"don'l", u"don't"), (u"Don'l", u"Don't"), (u'Donllook', u"Don't look"), (u'dont', u"don't"), (u"don'T", u"don't"), (u"don'tcare", u"don't care"), (u"don'tjoke", u"don't joke"), (u"Don'tjudge", u"Don't judge"), (u"don'tjust", u"don't just"), (u"Don'tjust", u"Don't just"), (u"Don'tlet", u"Don't let"), (u"don'tlhink", u"don't think"), (u"don'tpush", u"don't push"), (u"Don'tyou", u"Don't you"), (u'DonWlook', u"Don't look"), (u'Dooropens', u'Door opens'), (u'doorshuts', u'door shuts'), (u'dothat', u'do that'), (u'dothis', u'do this'), (u'Drinkthis', u'Drink this'), (u'dumbass', u'dumb-ass'), (u'dumbto', u'dumb to'), (u"dun't", u"don't"), (u'E//e', u'Elle'), (u'E9YPt', u'Egypt'), (u"ea/'t/7", u'earth'), (u'eart/7', u'earth'), (u"efi'/'c/'ent", u'efficient'), (u'EN<3LlsH', u'ENGLISH'), (u'Enjoythe', u'Enjoy the'), (u'Erv\\/an', u'Erwan'), (u"Erv\\/an's", u"Erwan's"), (u'etemity', u'eternity'), (u'ev/I', u'evil'), (u'eve/yone', u'everyone'), (u"even/body's", u"everybody's"), (u'eversay', u'ever say'), (u'Everymonth', u'Every month'), (u'everythings', u"everything's"), (u"Everythirlg's", u'Everything\u2019s'), (u"Everythlng's", u"Everything's"), (u'Everytime', u'Every time'), (u'Exac\ufb02y', u'Exactly'), (u'ExacUy_', u'Exactly.'), (u'excitedshrieking', u'excited shrieking'), (u'ExcLAllvls', u'EXCLAIMS'), (u'exploatation', u'exploitation'), (u'expreusion', u'expression'), (u'fairthat', u'fair that'), (u'Fathef', u'Father'), (u'fatherfigure', u'father figure'), (u'FBl', u'FBI'), (u'fcrebcdlng', u'foreboding'), (u'fcreverjudges', u'forever judges'), (u'fcund', u'found'), (u'feeleverything', u'feel everything'), (u'feelsweet', u'feel sweet'), (u"fiam/'/y", u'family'), (u'\ufb01ngernail', u'fingernail'), (u'finishedjunior', u'finished junior'), (u'FIynn', u'Flynn'), (u'flll', u'fill'), (u'flra', u'fira'), (u'Flylng', u'Flying'), (u'Fnends', u'Fiends'), (u'fo/low', u'follow'), (u'fonzvard', u'forward'), (u'fora', u'for a'), (u'Fora', u'For a'), (u'forajob', u'for a job'), (u'forAmerica', u'for America'), (u'forNew', u'for New'), (u'forone', u'for one'), (u'forso', u'for so'), (u'Forsuch', u'For such'), (u'forsunburns', u'for sunburns'), (u'forthe', u'for the'), (u'Foryears', u'For years'), (u'foryou', u'for you'), (u'Foudeen', u'Fouteen'), (u'Fou\ufb02een', u'Fourteen'), (u'FourSeasons', u'Four Seasons'), (u'fr/ends', u'friends'), (u'freezerfood', u'freezer food'), (u'F\xfchrerfeels', u'F\xfchrer feels'), (u'furthernotice', u'further notice'), (u'furyou', u'for you'), (u'G0', u'Go'), (u'g0in9', u'going'), (u'gamlenias', u'gardenias'), (u'GAsPING', u'GASPING'), (u'gc', u'go'), (u'gcing', u'going'), (u'gcnna', u'gonna'), (u'Gcnna', u'Gonna'), (u'gct', u'get'), (u'Gct', u'Got'), (u'genercsity', u'generosity'), (u'generosityn', u'generosity"'), (u'getjust', u'get just'), (u'g\ufb02ing', u'going'), (u'gi\ufb02friend', u'girlfriend'), (u'gir/', u'girl'), (u"gir/s'boarding", u"girls' boarding"), (u'giris', u'girls'), (u'gLlyS', u'guys'), (u'glum_', u'glum.'), (u'gnyone', u'anyone'), (u'golng', u'going'), (u'goodboyand', u'good boy and'), (u'goodjob', u'good job'), (u'gOt', u'got'), (u'gotjumped', u'got jumped'), (u'gotmyfirstinterview', u'got my first interview'), (u'grandjury', u'grand jury'), (u'greatjob', u'great job'), (u'Greatjobl', u'Great job!'), (u'grinco', u'gringo'), (u'GRoANING', u'GROANING'), (u'GRUNUNG', u'GRUNTING'), (u'gu', u'go'), (u'gunna', u'gonna'), (u'guyjumped', u'guy jumped'), (u'guyjust', u'guy just'), (u'gUyS', u'guys'), (u'_H6Y-', u'- Hey!'), (u'H\u20acY', u'Hey'), (u'H0we\xb7ver', u'However'), (u'halftheir', u'half their'), (u'hapPY', u'happy'), (u'hasrt', u"hasn't"), (u'Hasrt', u"Hasn't"), (u"haven'tspokerl", u"haven't spoken"), (u'hcle', u'hole'), (u'hcme', u'home'), (u'hcmes', u'homes'), (u'hcpe', u'hope'), (u'hctel', u'hotel'), (u'hcurs', u'hours'), (u'Hcw', u'How'), (u'he/ps', u'helps'), (u'hearjokestonight', u'hear jokes tonight'), (u'hearme', u'hear me'), (u'Hefell', u'He fell'), (u"he'II", u"he'll"), (u"He'II", u"He'll"), (u'HeII0', u'Hello'), (u"He'Il", u"He'll"), (u'Hejust', u'He just'), (u"He'lI", u"He'll"), (u'HelIo', u'Hello'), (u'hellc', u'hello'), (u'HellO', u'Hello'), (u'herboyfr/end', u'her boyfriend'), (u'herflesh', u'her flesh'), (u'herfollov\\/ed', u'her followed'), (u'herjob_', u'her job.'), (u'HerrSchmidt', u'Herr Schmidt'), (u'herwith', u'her with'), (u'HeY\xb7', u'Hey.'), (u'HeyJennifer', u'Hey Jennifer'), (u'hiddsn', u'hidden'), (u'hisjunk', u'his junk'), (u'Hitlershare', u'Hitler share'), (u'Hlneed', u"I'll need"), (u'Hnally', u'finally'), (u'Hnishing', u'finishing'), (u'HOId', u'Hold'), (u'hOIes', u'holes'), (u'HONMNG', u'HONKING'), (u'honorthe', u'honor the'), (u'honoryou', u'honor you'), (u'honoryour', u'honor your'), (u"Hov\\/'s", u"How's"), (u"Hov\\/'S", u"How's"), (u'HovvLING', u'HOWLING'), (u'howit', u'how it'), (u"HoW's", u"How's"), (u'howto', u'how to'), (u"Hs's", u"He's"), (u'hurtyou', u'hurt you'), (u'I/erilj/', u'verify'), (u'I/fe', u'life'), (u'I\\/I', u'M'), (u'I\\/Ian', u'Man'), (u'I\\/Iathies', u'Mathies'), (u'I\\/Ie', u'Me'), (u'I\\/Iommy', u'Mommy'), (u'I\\/Ir', u'Mr'), (u'I\\/Ir.', u'Mr.'), (u'I\\/ly', u'My'), (u'I3EEPING', u'BEEPING'), (u'I3LARING', u'BLARING'), (u'Iacings', u'lacings'), (u'Iaid', u'laid'), (u'Iam', u'I am'), (u'Iand', u'land'), (u'Ianding', u'landing'), (u'Iast', u'last'), (u'Iate', u'late'), (u'Icad', u'load'), (u'Icading', u'loading'), (u'Ican', u'I can'), (u'Iccked', u'locked'), (u'Icng', u'long'), (u'Icsing', u'losing'), (u'Icslng', u'losing'), (u'Idid', u'I did'), (u"Ididn't", u"I didn't"), (u'Ido', u'I do'), (u"Idon'i", u"I don't"), (u"Idon't", u"I don't"), (u"Idon'tthink", u"I don't think"), (u"I'E'$", u"It's"), (u'Ieamed', u'learned'), (u'Ieapt', u'leapt'), (u'Iearned', u'learned'), (u'Ieast', u'least'), (u'Ieave', u'leave'), (u'Ied', u'led'), (u'Ieft', u'left'), (u"Ieg's", u"leg's"), (u'Iess', u'less'), (u'Iet', u'let'), (u"Iet's", u"let's"), (u"Iet'sjust", u"let's just"), (u'if/just', u'if I just'), (u'Ifear', u'I fear'), (u'Ifeared', u'I feared'), (u'Ifeel', u'I feel'), (u"ifI'||", u"if I'll"), (u"ifI'd", u"if I'd"), (u"ifI'II", u"if I'll"), (u"ifI'll", u"if I'll"), (u"ifI'm", u"if I'm"), (u'Ifinally', u'I finally'), (u"ifI've", u"if I've"), (u'ifl', u'if I'), (u'Iforgot', u'I forgot'), (u'Ifound', u'I found'), (u'ifshe', u'if she'), (u"ifthat's", u"if that's"), (u'ifthe', u'if the'), (u'Ifthe', u'If the'), (u"ifthere's", u"if there's"), (u'Ifthey', u'If they'), (u'ifwe', u'if we'), (u'Ifwe', u'If we'), (u'Ifycu', u'If you'), (u'ifyou', u'if you'), (u'Ifyou', u'If you'), (u'ifyuu', u'if you'), (u'Iget', u'I get'), (u'Igot', u'I got'), (u'Igotta', u'I gotta'), (u'Igotyou', u'I got you'), (u'Iguess', u'I guess'), (u'Iguessljust', u'I guess I just'), (u'Ihad', u'I had'), (u"Ihat's", u"that's"), (u'Ihave', u'I have'), (u'Iheard', u'I heard'), (u"ihere's", u"there's"), (u"ihey've", u"they've"), (u'Ihope', u'I hope'), (u'ii/Iary', u'Mary'), (u'ii/Ir', u'Mr'), (u'ii/Ir.', u'Mr.'), (u'ii/love', u'Move'), (u'Iife', u'life'), (u"I'II", u"I'll"), (u'Iike', u'like'), (u"I'Il", u"I'll"), (u'Iine', u'line'), (u'iirst', u'first'), (u"ii's", u"it's"), (u"Ii's", u"It's"), (u'Iiterallyjumped', u'literally jumped'), (u'Ijoined', u'I joined'), (u'Ijust', u'I just'), (u'Iknew', u'I knew'), (u'Iknow', u'I know'), (u'Ile', u'lie'), (u'Ileft', u'I left'), (u"I'lldo", u"I'll do"), (u"I'llmake", u"I'll make"), (u'Ilons', u'lions'), (u'Ilove', u'I love'), (u"I'mjust", u"I'm just"), (u'Inconceivablel', u'Inconceivable!'), (u'infact', u'in fact'), (u'Infact', u'In fact'), (u'in\ufb02uence', u'influence'), (u'infront', u'in front'), (u'injust', u'in just'), (u'insc\ufb01p\ufb01ons', u'inscriptions'), (u'insolencel', u'insolence!'), (u'intc', u'into'), (u'internationaljudges', u'international judges'), (u'inthe', u'in the'), (u'Iockdown', u'lockdown'), (u'Iong', u'long'), (u'Iongships', u'longships'), (u'Iook', u'look'), (u'Iookjust', u'look just'), (u'Iooklng', u'looking'), (u'Iooks', u'looks'), (u'Ioose', u'loose'), (u"Iord's", u"lord's"), (u'Iose', u'lose'), (u'Ioser', u'loser'), (u'Ioss', u'loss'), (u'Iost', u'lost'), (u'Iot', u'lot'), (u"Iot's", u"lot's"), (u'Iousyjob', u'lousy job'), (u'Iove', u'love'), (u'Ioves', u'loves'), (u'Iowlife', u'lowlife'), (u'Ipaid', u'I paid'), (u'Iquit', u'I quit'), (u'Ireallythinkthis', u'I really think this'), (u"I'rn", u"I'm"), (u'Isaw', u'I saw'), (u'Isayt/1e', u'I say the'), (u'isjust', u'is just'), (u"isn'i", u"isn't"), (u"isn't_", u"isn't."), (u'Isthis', u'Is this'), (u'Istill', u'I still'), (u'Istumblod', u'I stumbled'), (u'Itake', u'I take'), (u'itdown', u'it down'), (u'Iteach', u'I teach'), (u'Itfeels', u'It feels'), (u'ithave', u'it have'), (u'Ithink', u'I think'), (u'Ithinkthat', u'I think that'), (u'Ithinkthis', u'I think this'), (u"Ithinkyou're", u"I think you're"), (u'Ithlnk', u'I think'), (u'Ithoguht', u'I thought'), (u'Ithought', u'I thought'), (u'Ithoughtl', u'I thought I'), (u"it'II", u"it'll"), (u"It'II", u"It'll"), (u"it'Il", u"it'll"), (u"It'Il", u"It'll"), (u'itin', u'it in'), (u'itjust', u'it just'), (u'Itjust', u'It just'), (u"it'lI", u"it'll"), (u"It'lI", u"It'll"), (u"It'llhappen", u"It'll happen"), (u"it'lljust", u"it'll just"), (u'Itold', u'I told'), (u'Itook', u'I took'), (u'itout', u'it out'), (u"it'S", u"it's"), (u"it'sjinxed", u"it's jinxed"), (u"it'sjust", u"it's just"), (u"It'sjust", u"It's just"), (u'itso', u'it so'), (u'Ittends', u'It tends'), (u"Itwasn't", u"It wasn't"), (u'Iuckier', u'luckier'), (u'IV|oney', u'Money'), (u"IV|oney's", u"Money's"), (u"I'va", u"I've"), (u"I'Ve", u"I've"), (u'IVIan', u'Man'), (u'IVIAN', u'MAN'), (u'IVIarch', u'March'), (u"IVIarci's", u"Marci's"), (u'IVIarko', u'Marko'), (u'IVIe', u'Me'), (u"IVIine's", u"Mine's"), (u'IVImm', u'Mmm'), (u'IVIoney', u'Money'), (u'IVIr.', u'Mr.'), (u'IVIrs', u'Mrs'), (u'IVIuch', u'Much'), (u'IVIust', u'Must'), (u'IVIy', u'My'), (u'IVlacArthur', u'MacArthur'), (u"IVlacArthur's", u"MacArthur's"), (u'IVlcBride', u'McBride'), (u'IVlore', u'More'), (u'IVlotherfucker_', u'Motherfucker.'), (u'IVlr', u'Mr'), (u'IVlr.', u'Mr.'), (u'IVlr_', u'Mr.'), (u'IVlust', u'Must'), (u'IVly', u'My'), (u'Iwake', u'I wake'), (u'Iwant', u'I want'), (u'Iwanted', u'I wanted'), (u'Iwas', u'I was'), (u'Iwasjust', u'I was just'), (u'Iwasjustu', u'I was just...'), (u'Iwill', u'I will'), (u'Iwish', u'I wish'), (u"Iwon't", u"I won't"), (u'Iworked', u'I worked'), (u'Iwould', u'I would'), (u'jalapeno', u'jalape\xf1o'), (u'Jaokson', u'Jackson'), (u'Jascn', u'Jason'), (u'jcke', u'joke'), (u'jennifer', u'Jennifer'), (u'joseph', u'Joseph'), (u'jsut', u'just'), (u'Jumpthem', u'Jump them'), (u'jusi', u'just'), (u'jusl', u'just'), (u'justjudge', u'just judge'), (u'justleave', u'just leave'), (u'Justletgo', u'Just let go'), (u'kidsjumped', u'kids jumped'), (u'kiokflip', u'kickflip'), (u'knowjust', u'know just'), (u'knowthat', u'know that'), (u'knowthis', u'know this'), (u'knowwhat', u'know what'), (u'knowyet', u'know yet'), (u'knowyourlove', u'know your love'), (u'korean', u'Korean'), (u'L/ght', u'Light'), (u'L/kes', u'Likes'), (u'L\\/Ianuela', u'Manuela'), (u'L\\/Ianuelal', u'Manuela!'), (u'l\\/Iauzard', u'Mauzard'), (u'l\\/I\xe9lanie', u'M\xe9lanie'), (u'L\\/I\xe9lanie', u'M\xe9lanie'), (u'l\\/Iom', u'Mom'), (u'l\\/Iommy', u'Mommy'), (u'l\\/Ir', u'Mr'), (u'l\\/Ir.', u'Mr.'), (u'l\\/Is', u'Ms'), (u'l\\/ly', u'My'), (u'l_AuGHING', u'LAUGHING'), (u'l\u2018m', u"I'm"), (u'Laml6', u'I am l6'), (u'Lcad', u'Load'), (u'lcan', u'I can'), (u"lcan't", u"I can't"), (u"lcarl't_", u"I can't."), (u'Lcve', u'Love'), (u"l'd", u"I'd"), (u"L'd", u"I'd"), (u'ldid', u'I did'), (u'Ldid', u'I did'), (u'ldiot', u'Idiot'), (u"L'djump", u"I'd jump"), (u"ldon't", u"I don't"), (u"Ldon't", u"I don't"), (u'Lefs', u"Let's"), (u"Let'sjust", u"Let's just"), (u'lf', u'if'), (u'Lf', u'If'), (u'lfeelonelung', u'I feel one lung'), (u'lfthey', u'if they'), (u'lfyou', u'If you'), (u'Lfyou', u'If you'), (u"lfyou're", u"If you're"), (u'lget', u'I get'), (u'lgive', u'I give'), (u'Li/0/Academy', u'Lilly Academy'), (u'li/lr.', u'Mr.'), (u'ligature___', u'ligature...'), (u"l'II", u"I'll"), (u"l'Il", u"I'll"), (u'ljust', u'I just'), (u'Ljust', u'I just'), (u"ll/Iommy's", u"Mommy's"), (u'll/lajor', u'Major'), (u'Ll/lajor', u'Major'), (u'll/layans', u'Mayans'), (u"l'lI", u"I'll"), (u"l'll", u"I'll"), (u"L'll", u"I'll"), (u"l'lljust", u"I'll just"), (u"L'lltake", u"I'll take"), (u'llte', u'lite'), (u"l'm", u"I'm"), (u"L'm", u"I'm"), (u'Lmean', u'I mean'), (u"l'mjust", u"I'm just"), (u'ln', u'In'), (u'lN', u'IN'), (u'lNAuDll3LE', u'INAUDIBLE'), (u'LNAuDll3LE', u'INAUDIBLE'), (u'LNDlsTINcT', u'INDISTINCT'), (u'lneed', u'I need'), (u'lostyou', u'lost you'), (u'Loudmusic', u'Loud music'), (u'lraq', u'Iraq'), (u"lRA's", u"IRA's"), (u'Lrenka', u'Irenka'), (u'Lrn', u"I'm"), (u'lRS', u'IRS'), (u'lsabella', u'Isabella'), (u"lsn't", u"isn't"), (u"Lsn't", u"Isn't"), (u"Lst's", u"Let's"), (u'lsuppose', u'I suppose'), (u'lt', u'It'), (u'ltake', u'I take'), (u'ltell', u'I tell'), (u'lthink', u'I think'), (u'Lthink', u'I think'), (u'lthink___', u'I think...'), (u"lt'II", u"It'll"), (u"lt'Il", u"It'll"), (u'ltjammed_', u'It jammed.'), (u"lt'll", u"It'll"), (u'ltold', u'I told'), (u"lt's", u"It's"), (u"lT'S", u"IT'S"), (u"Lt'S", u"It's"), (u"Lt'sjust", u"It's just"), (u"lv\\/asn't", u"I wasn't"), (u"l've", u"I've"), (u"L've", u"I've"), (u'lVIan', u'Man'), (u'lVIcHenry', u'McHenry'), (u'lVIr.', u'Mr.'), (u'lVlacArthur', u'MacArthur'), (u'LVlore', u'More'), (u'lVlr', u'Mr'), (u'lVlr.', u'Mr.'), (u'lvluslc', u'MUSIC'), (u'lVlust', u'Must'), (u'LVly', u'Lily'), (u'lwaited', u'I waited'), (u'lwamoto', u'Iwamoto'), (u'lwant', u'I want'), (u'lwanted', u'I wanted'), (u'lwas', u'I was'), (u'lwill', u'I will'), (u"lwon't", u"I won't"), (u'lworked', u'I worked'), (u'lwould', u'I would'), (u"lwould've", u"I would've"), (u'lx/Iorning', u'Morning'), (u'M/dd/e', u'Middle'), (u'm/g/7ty', u'mighty'), (u'MACH/NE', u'MACHINE'), (u'MacKenz/e', u'MacKenzie'), (u'majorjackpot', u'major jackpot'), (u'majormuscle', u'major muscle'), (u'Manuela_', u'Manuela.'), (u'maste/y', u'mastery'), (u'Masturhate', u'Masturbate'), (u'Mattei_', u'Mattei.'), (u'mayjust', u'may just'), (u'mbecause', u'"because'), (u'McCa/Iister', u'McCallister'), (u'McCallisler', u'McCallister'), (u'Mccallister', u'McCallister'), (u'Mccallisters', u'McCallisters'), (u"mcm's", u"mom's"), (u'mcney', u'money'), (u'mcral', u'moral'), (u'mcre', u'more'), (u'mcve', u'move'), (u'mejust', u'me just'), (u'Mexioo', u'Mexico'), (u'mi//<', u'milk'), (u'misfartune', u'misfortune'), (u'Ml6', u'MI6'), (u'Mlnd', u'Mind'), (u"Mock/'ngbl'rd", u'Mockingbird'), (u"mOI'\u20ac", u'more'), (u'Mom_', u'Mom.'), (u'monkeyback', u'monkey back'), (u'move___l', u'move... I'), (u'moveto', u'move to'), (u'mustknock', u'must knock'), (u'Myheart', u'My heart'), (u'myjch', u'my job'), (u'myjet', u'my jet'), (u'myjob', u'my job'), (u'Myjob', u'My job'), (u"myjob's", u"my job's"), (u'mylife', u'my life'), (u'Mynew', u'My new'), (u'myown', u'my own'), (u'mypants', u'my pants'), (u'myselli', u'myself'), (u'Myshoes', u'My shoes'), (u'mysong', u'my song'), (u'mytemper', u'my temper'), (u'mythumb', u'my thumb'), (u'Myworld', u'My world'), (u'N0', u'No'), (u'narne', u'name'), (u'Natians', u'Nations'), (u'naTve', u'naive'), (u'nc', u'no'), (u'Nc', u'No'), (u'ncne', u'none'), (u'Ncrth', u'North'), (u'ncw', u'new'), (u'Ncw', u'Now'), (u'needyou', u'need you'), (u'neighboun', u'neighbour'), (u'neverfound', u'never found'), (u'neverthere', u'never there'), (u'neverv\\/ill_', u'never will.'), (u'NewJersey', u'New Jersey'), (u'newjob', u'new job'), (u'newjobs', u'new jobs'), (u'nextdoor', u'next door'), (u'Nighw', u'Nighty'), (u'nilios', u'ni\xf1os'), (u'Nlagnificence', u'Magnificence'), (u'Nlakes', u'Makes'), (u'Nlalina', u'Malina'), (u'Nlan', u'Man'), (u'Nlarch', u'March'), (u'Nlarine', u'Marine'), (u'Nlarion', u'Marion'), (u'Nlarry', u'Marry'), (u'Nlars', u'Mars'), (u'Nlarty', u'Marty'), (u'Nle', u'Me'), (u'Nleet', u'Meet'), (u'Nlen', u'Men'), (u'Nlom', u'Mom'), (u'Nlore', u'More'), (u'Nlornin', u'Mornin'), (u'Nlother', u'Mother'), (u'Nlr', u'Mr'), (u'Nlr.', u'Mr.'), (u'Nlrs', u'Mrs'), (u'Nluch', u'Much'), (u'nojurisdiction', u'no jurisdiction'), (u'noone', u'no one'), (u'Noone', u'No one'), (u'not judging', u'not judging'), (u'notgoing', u'not going'), (u'notjunk', u'not junk'), (u'Notjunk', u'Not junk'), (u'notjust', u'not just'), (u'notsure', u'not sure'), (u'novv', u'now'), (u'Nowjust', u'Now just'), (u"Nowthat's", u"Now that's"), (u'Numbertwo', u'Number two'), (u"oan't", u"can't"), (u"oan'tjust", u"can't just"), (u'objecl', u'object'), (u'occultpowerand', u'occult power and'), (u'Ocps', u'Oops'), (u'ofa', u'of a'), (u'ofajudge', u'of a judge'), (u'ofall', u'of all'), (u'Ofall', u'Of all'), (u'ofBedford', u'of Bedford'), (u'ofcourse', u'of course'), (u'Ofcourse', u'Of course'), (u'ofeach', u'of each'), (u'ofeither', u'of either'), (u"Offioer's", u"Officer's"), (u'ofFrance', u'of France'), (u'offreedom', u'of freedom'), (u'offthe', u'off the'), (u'offthis', u'off this'), (u'offto', u'off to'), (u'offun', u'of fun'), (u'ofguy', u'of guy'), (u'Ofhce', u'Office'), (u'ofhis', u'of his'), (u'ofHis', u'of His'), (u'ofhoneybees', u'of honeybees'), (u'ofit', u'of it'), (u'ofjam', u'of jam'), (u'OFJOAN', u'OF JOAN'), (u'ofjoy', u'of joy'), (u'ofjunior', u'of junior'), (u'ofme', u'of me'), (u'ofmead', u'of mead'), (u'ofmicroinjections', u'of microinjections'), (u'ofmy', u'of my'), (u'ofNew', u'of New'), (u"ofNorris'", u"of Norris'"), (u'ofopinions', u'of opinions'), (u'ofour', u'of our'), (u'ofpeopla', u'of people'), (u'ofthat', u'of that'), (u'ofthe', u'of the'), (u'Ofthe', u'Of the'), (u'oftheir', u'of their'), (u'ofthem', u'of them'), (u"ofthem's", u"of them's"), (u'ofthemselves', u'of themselves'), (u'ofthere', u'of there'), (u'ofthese', u'of these'), (u'ofthings', u'of things'), (u'ofthis', u'of this'), (u'ofthlngs', u'of things'), (u'ofthose', u'of those'), (u'ofuse', u'of use'), (u'ofwashington', u'of Washington'), (u'ofyou', u'of you'), (u'ofyour', u'of your'), (u'OId', u'Old'), (u'OIsson', u'Olsson'), (u'Ok3Y', u'Okay'), (u'okaY', u'okay'), (u'OkaY', u'Okay'), (u'OKaY', u'Okay'), (u'OKGY', u'Okay'), (u'Ol<', u'Ole'), (u'oldAdolfon', u'old Adolf on'), (u'onboard', u'on board'), (u'onIy', u'only'), (u'onIything', u'only thing'), (u'onJanuaw', u'on January'), (u'onlyjust', u'only just'), (u'Onyinal', u'Original'), (u'oomprise', u'comprise'), (u'oonstitution', u'constitution'), (u"oouldn't", u"couldn't"), (u"oould've", u"could've"), (u"oousin's", u"cousin's"), (u'opiimistically', u'optimistically'), (u'ora', u'or a'), (u'orfall', u'or fall'), (u'orglory', u'or glory'), (u'orjust', u'or just'), (u'Orjust', u'Or just'), (u'Orthat', u'Or that'), (u'orwould', u'or would'), (u'Orwould', u'Or would'), (u'Othenzvise', u'Otherwise'), (u'our joumey', u'our journey'), (u'ourbrave', u'our brave'), (u'ourfathers', u'our fathers'), (u'ourgirlon', u'our girl on'), (u'Ourgoal', u'Our goal'), (u'Ourguy', u'Our guy'), (u"ourj0b's", u"our job's"), (u"Ourj0b's", u"Our job's"), (u'ourjobs', u'our jobs'), (u"ourjob's", u"our job's"), (u"Ourjob's", u"Our job's"), (u'ourjoumey', u'our journey'), (u'ourphotos', u'our photos'), (u'ourv\\/ay', u'our way'), (u"outlool<'s", u"outlook's"), (u'overme', u'over me'), (u'overthe', u'over the'), (u'overthere', u'over there'), (u'p/ace', u'place'), (u'P/ease', u'Please'), (u'p_m_', u'p.m.'), (u'P\xb0P$', u'Pops'), (u'PANUNG', u'PANTING'), (u'pclnt', u'point'), (u'pclnts', u'points'), (u'pe0pIe', u'people'), (u'Perrut_', u'Perrut.'), (u'Persona/4/', u'Personally'), (u'Persona/y', u'Personally'), (u'persors', u"person's"), (u'PIain', u'Plain'), (u'PIease', u'Please'), (u'PIeasure', u'Pleasure'), (u'PIus', u'Plus'), (u'pleasurlng', u'pleasuring'), (u'POIe', u'Pole'), (u'Polynes/ans', u'Polynesians'), (u'poorshowing', u'poor showing'), (u'popsicle', u'Popsicle'), (u'Presidenfs', u"President's"), (u'probablyjust', u'probably just'), (u'puIIing', u'pulling'), (u'Putyourhand', u'Put your hand'), (u'Qh', u'Oh'), (u'QkaY', u'Okay'), (u'Qpen', u'Open'), (u'QUYS', u'GUYS'), (u'_QW', u'Aw'), (u'r/ght', u'right'), (u'ralnbow', u'rainbow'), (u'ratherjump', u'rather jump'), (u'ratherjust', u'rather just'), (u'Rcque', u'Roque'), (u'rcscucd', u'rescued'), (u'rea/', u'real'), (u'readytolaunchu', u'ready to launch...'), (u'reaHy', u'really'), (u'ReaHy', u'Really'), (u'reallyjust', u'really just'), (u'reallymiss', u'really miss'), (u'reallytalked', u'really talked'), (u'reallythink', u'really think'), (u'reallythinkthis', u'really think this'), (u'rememberthem', u'remember them'), (u'reoalibrated', u'recalibrated'), (u'retum', u'return'), (u'rhfluence', u'influence'), (u'rightdown', u'right down'), (u'roadyou', u'road you'), (u'RUMBUNG', u'RUMBLING'), (u's/uggikh', u'sluggish'), (u'S0', u'So'), (u'S1oW1y', u'Slowly'), (u'saidyou', u'said you'), (u"sayeverything's", u"say everything's"), (u'saynothing', u'say nothing'), (u'saythat', u'say that'), (u'sc', u'so'), (u'scientihc', u'scientific'), (u'SCREAIVHNG', u'SCREAMING'), (u'sCREAlvllNG', u'SCREAMING'), (u'SCREAlvllNG', u'SCREAMING'), (u'scund', u'sound'), (u"S'EOp", u'Stop'), (u'severa/parents', u'several parents'), (u'sfill', u'still'), (u'S\ufb02ence', u'Silence'), (u'shallrise', u'shall rise'), (u'sHATTERING', u'SHATTERING'), (u'shcws', u'shows'), (u'Shdsjust', u"She's just"), (u'She`s', u"She's"), (u'She\u2018II', u"She'll"), (u"she'II", u"she'll"), (u"She'II", u"She'll"), (u"she'Il", u"she'll"), (u'Shejust', u'She just'), (u"she'lI", u"she'll"), (u'Shoofing', u'Shooting'), (u'ShOp', u'shop'), (u'shortyears', u'short years'), (u'shou/dn', u'shouldn\u2019t'), (u'shou\ufb01ng', u'shouting'), (u'Shou\ufb02ng', u'Shouting'), (u'shouldnt', u"shouldn't"), (u'Shouldrt', u"Shouldn't"), (u'shouldrt', u"shouldn't"), (u"Shs's", u"She's"), (u'SHUDDERWG', u'SHUDDERING'), (u'Shutup', u'Shut up'), (u'SIGH$', u'SIGHS'), (u'signifcance', u'significance'), (u'Sincc', u'Since'), (u'sistervvill', u'sister will'), (u'Skarsg\xe9rd', u'Skarsg\xe5rd'), (u'slcsHs', u'SIGHS'), (u'slGHINcs', u'SIGHING'), (u'slGHING', u'SIGHING'), (u'slNGING', u'SINGING'), (u'slzzLING', u'SIZZLING'), (u'smarfest', u'smartest'), (u'Smiih', u'Smith'), (u'so/id', u'solid'), (u'SoBl3lNG', u'SOBBING'), (u'soemtimes', u'sometimes'), (u'Sojust', u'So just'), (u'soldierl', u'soldier!'), (u'somethlng', u'something'), (u"somethlng's", u"something's"), (u"somez'/7/ng", u'something'), (u'somthing', u'something'), (u'sumthing', u'something'), (u'sou/', u'soul'), (u'SoundofMusic', u'Sound of Music'), (u'SP/ash', u'Splash'), (u'SPEAK/NG', u'SPEAKING'), (u'speII', u'spell'), (u"speII's", u"spell's"), (u'Spendourtime', u'Spend our time'), (u'sQUA\\/\\/KING', u'SQUAWKING'), (u'StAnton', u'St Anton'), (u'stealsjeans', u'steals jeans'), (u'StilI', u'Still'), (u'Stilldesperatelyseeking', u'Still desperately seeking'), (u'stlll', u'still'), (u'sToPs', u'STOPS'), (u'storyl', u'story!'), (u'Stubbom', u'Stubborn'), (u'su/faces', u'surfaces'), (u'suffocaiing', u'suffocating'), (u'summerjob', u'summer job'), (u'Summerjust', u'Summer just'), (u'sun/ive', u'survive'), (u'superiorman', u'superior man'), (u'sur\ufb02aces', u'surfaces'), (u't/ying', u'trying'), (u'T0', u'To'), (u'T00', u'Too'), (u'ta/ks', u'talks'), (u'taiked', u'talked'), (u'talkto', u'talk to'), (u'Talkto', u'Talk to'), (u'talktonight', u'talk tonight'), (u'tampax', u'Tampax'), (u'tc', u'to'), (u'tcday', u'today'), (u'tcrturing', u'torturing'), (u'tcuch', u'touch'), (u'te//', u'tell'), (u'tearjust', u'tear just'), (u'tellsjokes', u'tells jokes'), (u'tellyou', u'tell you'), (u'terriers_', u'terriers.'), (u'th/nk', u'think'), (u'THEPASSION', u'THE PASSION'), (u'thafs', u"that's"), (u'Thafs', u"That's"), (u"Thai's", u"That's"), (u"Thal's", u"That's"), (u'thankyou', u'thank you'), (u'Thankyou', u'Thank you'), (u'thatconverts', u'that converts'), (u'thatgoes', u'that goes'), (u"that'II", u"that'll"), (u"That'II", u"That'll"), (u'thatjob', u'that job'), (u'thatjunk', u'that junk'), (u'thatjust', u'that just'), (u'thatleads', u'that leads'), (u"Thatl'm", u"That I'm"), (u"that's just", u"that's just"), (u'Thatsand', u'That sand'), (u"that'sjust", u"that's just"), (u"That'sjust", u"That's just"), (u'Thc', u'The'), (u'theirface', u'their face'), (u'theirfeet', u'their feet'), (u'theirfury', u'their fury'), (u'thejaw', u'the jaw'), (u'thejoint', u'the joint'), (u'thejudge', u'the judge'), (u'thejudges', u'the judges'), (u'Thejudges', u'The judges'), (u'thejury', u'the jury'), (u'Thelook', u'The look'), (u'Therds', u"There's"), (u"There'II", u"There'll"), (u"There'Il", u"There'll"), (u"There'lI", u"There'll"), (u"They'/'e", u"They're"), (u"they/'II", u"they'll"), (u'They/re', u"They're"), (u"They/'re", u"They're"), (u"they'II", u"they'll"), (u"they'Il", u"they'll"), (u'theyjust', u'they just'), (u'Theyjust', u'They just'), (u"they'lI", u"they'll"), (u"They'lI", u"They'll"), (u'theyre', u"they're"), (u'theysay', u'they say'), (u'thinkthat', u'think that'), (u"this'II", u"this'll"), (u'thlngs', u'things'), (u'Thlnkthls', u'Think this'), (u'thls', u'this'), (u"thore's", u"there's"), (u"Thore's", u"There's"), (u'Thorjust', u'Thor just'), (u"thoughtl'dletyou", u"thought I'd let you"), (u'tnatjust', u'that just'), (u"tnat's", u"that's"), (u"Tnat's", u"That's"), (u"Tnere'll", u"There'll"), (u'to//et', u'toilet'), (u'To//S', u'Tolls'), (u"todayl'd", u"today I'd"), (u'togelher', u'together'), (u'togethen', u'together'), (u'tojoin', u'to join'), (u'tojudge', u'to judge'), (u'toldyou', u'told you'), (u'tomorrovv', u'tomorrow'), (u'Tonighfsjust', u"Tonight's just"), (u'totake', u'to take'), (u'totalk', u'to talk'), (u'tothat', u'to that'), (u'tothe', u'to the'), (u'Towef', u'Tower'), (u'Tr/ck/ing', u'Trickling'), (u'Traitur', u'Traitor'), (u'tv\\/o', u'two'), (u'tvvelve', u'twelve'), (u'Tvvelve', u'Twelve'), (u'tvventy', u'tvventy'), (u'Tvventy', u'Tvventy'), (u'tvvo', u'two'), (u'Tvvo', u'Two'), (u'twc', u'two'), (u'unconhrmed', u'unconfirmed'), (u'underthat', u'under that'), (u'underthe', u'under the'), (u'underthese', u'under these'), (u'underyour', u'under your'), (u'unfilyou', u'until you'), (u"Unfon'unate/y", u'Unfortunately'), (u'Uninnabited', u'Uninhabited'), (u'untilApril', u'until April'), (u'untilyou', u'until you'), (u'upthinking', u'up thinking'), (u'upto', u'up to'), (u'V\\/ait___', u'Wait...'), (u'v\\/as', u'was'), (u'V\\/as', u'Was'), (u'V\\/e', u'We'), (u"v\\/eek's", u"week's"), (u'V\\/eird_', u'Weird.'), (u'V\\/ell', u'Well'), (u'V\\/hat', u'what'), (u"V\\/hen'll", u"When'll"), (u'V\\/ho', u'Who'), (u"v\\/ho'll", u"who'll"), (u'v\\/Hoops', u'Whoops'), (u"v\\/ho's", u"who's"), (u"V\\/ho's", u"Who's"), (u'V\\/hy', u'Why'), (u'v\\/ith', u'with'), (u"v\\/on't", u"won't"), (u'V\\fith', u'With'), (u'V\\fithin', u'Within'), (u'valedictolian', u'valedictorian'), (u'vcice', u'voice'), (u've/y', u'very'), (u'veiy', u'very'), (u'V\xe9ry', u'Very'), (u'versioin', u'version'), (u'vi/ay', u'way'), (u'visitjails', u'visit jails'), (u"Viva/di's", u"Vivaldi's"), (u'vlll', u'vill'), (u'Voil\xe1', u'Voil\xe0'), (u'Voil\xe9', u'Voil\xe0'), (u'vvasjust', u'was just'), (u"VVasn't", u"Wasn't"), (u'vvay', u'way'), (u'VVe', u'We'), (u"VVe'II", u"We'll"), (u"VVe'll", u"We'll"), (u'Vvelooked', u'We looked'), (u"VVe're", u"We're"), (u"VVe've", u"We've"), (u'VVhat', u'What'), (u"VVhat's", u"What's"), (u"VVhat'S", u"What's"), (u'VVhen', u'When'), (u"'v'Vhere's", u"Where's"), (u'VVhip', u'Whip'), (u'vvHooPING', u'WHOOPING'), (u'VvHooPING', u'WHOOPING'), (u'VVhy', u'Why'), (u'VVill', u'Will'), (u'VVinters', u'Winters'), (u'vvlND', u'WIND'), (u"w\xa4n't", u"won't"), (u'W9', u'We'), (u'waht', u'want'), (u'waierfall', u'waterfall'), (u'walkjust', u'walk just'), (u'wallplant', u'wall plant'), (u'wannajump', u'wanna jump'), (u'wantyou', u'want you'), (u'Warcontinues', u'War continues'), (u'wasjennifer', u'was Jennifer'), (u'wasjust', u'was just'), (u'wasrt', u"wasn't"), (u'Wasrt', u"Wasn't"), (u'wayl', u'way I'), (u'wayround', u'way round'), (u'wclf', u'wolf'), (u'wcman', u'woman'), (u'wcmen', u'women'), (u"wcn't", u"won't"), (u'wcrse', u'worse'), (u'wculd', u'would'), (u'We//', u'Well'), (u'We/came', u'Welcome'), (u'we/come', u'welcome'), (u'We/come', u'Welcome'), (u'We/I', u'Well'), (u'weekendjust', u'weekend just'), (u'werert', u"weren't"), (u'Werert', u"Weren't"), (u"we'II", u"we'll"), (u"We'II", u"We'll"), (u"we'Il", u"we'll"), (u"We'Il", u"We'll"), (u'wejust', u'we just'), (u"we'lI", u"we'll"), (u"We'rejust", u"We're just"), (u"We'ro", u"We're"), (u"We'Ve", u"We've"), (u'wh/p', u'whip'), (u'Wh\xb0ops', u'Whoops'), (u'Whafs', u"What's"), (u'Whatam', u'What am'), (u'Whatare', u'What are'), (u'Whateverwe', u'Whatever we'), (u"What'II", u"What'll"), (u'Whatis', u'What is'), (u'whatjust', u'what just'), (u'Whatl', u'What I'), (u'whatshe', u'what she'), (u'whatwe', u'what we'), (u"Whc's", u"Who's"), (u'Whcse', u'Whose'), (u'wHlsPERs', u'WHISPERS'), (u'wi//', u'will'), (u'wil/', u'will'), (u'Wil/', u'Will'), (u'wilI', u'will'), (u'willbe', u'will be'), (u'willhire', u'will hire'), (u'willneverknow', u'will never know'), (u'willyou', u'will you'), (u'wlfe', u'wife'), (u"wlfe's", u"wife's"), (u'wlth', u'with'), (u"wnat's", u"what's"), (u'Wno', u'Who'), (u'Wo/f', u'Wolf'), (u'wo\ufb02d', u'world'), (u"WOI'1't", u"won't"), (u'wondernobody', u'wonder nobody'), (u"won'T", u"won't"), (u"won'tanswerme", u"won't answer me"), (u"won'tforget", u"won't forget"), (u"won'tletitbring", u"won't let it bring"), (u"Wo're", u"We're"), (u'worfd', u'world'), (u"won'th", u'worth'), (u"won'thwhile", u'worthwhile'), (u'workyou', u'work you'), (u"wouIdn't", u"wouldn't"), (u"wouldn'!", u"wouldn't"), (u'Wouldrt', u"Wouldn't"), (u"wr/'2'/ng", u'writing'), (u'writign', u'writing'), (u'wrcng', u'wrong'), (u'wuuld', u'would'), (u'_Yay', u'Yay'), (u"Y\xa4u'II", u"You'll"), (u"Y\xa4u'll", u"You'll"), (u"y\xa4u're", u"you're"), (u"Y\xa4u're", u"You're"), (u"y\xa4u've", u"you've"), (u'Y0', u'Yo'), (u'y0LI', u'you'), (u"y0u'II", u"you'll"), (u"Y0u'rc", u"You're"), (u"Y0u're", u"You're"), (u"Y0u've", u"You've"), (u'yaming', u'yarning'), (u'yaurparents', u'your parents'), (u'ycu', u'you'), (u"ycu'd", u"you'd"), (u'ycur', u'your'), (u"Ycu're", u"You're"), (u'Ycursins', u'Your sins'), (u'YEI_I_', u'YELL'), (u'YELL$', u'YELLS'), (u'yigg/mg', u'giggling'), (u'Yigg/mg', u'giggling'), (u'yoLI', u'you'), (u'yOu', u'you'), (u'yOU', u'you'), (u'you`re', u"you're"), (u"you'II", u"you'll"), (u"You'II", u"You'll"), (u"You'Il", u"You'll"), (u'youjack', u'you jack'), (u'youjoin', u'you join'), (u'Youjoin', u'You join'), (u'youjust', u'you just'), (u"You'lI", u"You'll"), (u'youngsterlike', u'youngster like'), (u'youpick', u'you pick'), (u"you'ra", u"you're"), (u'Yourattention', u'Your attention'), (u'yourautomobile', u'your automobile'), (u"You'rejustjealous", u"You're just jealous"), (u'yourextra', u'your extra'), (u'yourfather', u'your father'), (u'yourhand', u'your hand'), (u'yourhusband', u'your husband'), (u'yourjewelry', u'your jewelry'), (u'yourjob', u'your job'), (u'Yourjob', u'Your job'), (u'yourjob_', u'your job.'), (u'yourjockey', u'your jockey'), (u'yourjury', u'your jury'), (u'yourname', u'your name'), (u'Yourpackage', u'Your package'), (u'yourpackage', u'your package'), (u"you'ro", u"you're"), (u'yourpoorleg', u'your poor leg'), (u'yourvveak', u'your weak'), (u"you'va", u"you've"), (u"You'va", u"You've"), (u'youWlneversee', u"you'll never see"), (u'yQu', u'you'), (u'YQu', u'You'), (u"yQu'_7", u'you?'), (u'yummY', u'yummy'), (u'yuu', u'you'), (u'Yuu', u'You'), (u"Yuu've", u"You've"), (u"z'housand", u'thousand'), (u'zlPPING', u'ZIPPING'), (u'Ifslocked', u"It's locked"), (u'nightjust', u'night just'), (u'dayjourney', u'day journey'), (u'Ourjob', u'Our job'), (u'IunCh', u'lunch'), (u'nieCe', u'niece'), (u'giVes', u'gives'), (u'wantto', u'want to'), (u'besttoday', u'best today'), (u'NiCe', u'Nice'), (u'oftravelling', u'of travelling'), (u'oftwo', u'of two'), (u'ALl', u'ALI'), (u'afterparty', u'after-party'), (u'welL', u'well.'), (u'theirjob', u'their job'), (u"lfhe's", u"If he's"), (u'babyjesus', u'baby Jesus'), (u'shithousejohn', u'shithouse John'), (u'jesus', u'Jesus'), (u'withjesus', u'with Jesus'), (u'Gojoin', u'Go join'), (u'Adaughter', u'A daughter'), (u'talkwith', u'talk with'), (u'anyjournals', u'any journals'), (u"L'mjewish", u"I'm Jewish"), (u'arejust', u'are just'), (u'soundjust', u'sound just'), (u"ifl'm", u"if I'm"), (u'askyou', u'ask you'), (u'ordinarywoman', u'ordinary woman'), (u'andjunkies', u'and junkies'), (u'isjack', u'is Jack'), (u'helpyou', u'help you'), (u'thinkyou', u'think you'), (u'Lordjesus', u'Lord Jesus'), (u'injuvy', u'in juvy'), (u'thejets', u'the jets'), (u'ifGod', u'if God'), (u'againstjewish', u'against Jewish'), (u'ajunkie', u'a junkie'), (u'dearjesus', u'dear Jesus'), (u'hearyour', u'hear your'), (u'takeyears', u'take years'), (u'friendjean', u'friend Jean'), (u'Fatherjohn', u'Father John'), (u'youjean', u'you Jean'), (u'hearyou', u'hear you'), (u'Ifshe', u'If she'), (u"didn'tjust", u"didn't just"), (u'IfGod', u'If God'), (u'notjudge', u'not judge'), (u'andjudge', u'and judge'), (u'OKBY', u'Okay'), (u'myjourney', u'my journey'), (u'yourpremium', u'your premium'), (u"we'rejust", u"we're just"), (u'Iittlejokes', u'little jokes'), (u'Iifejust', u'life just'), (u'Andjust', u'And just'), (u'ofThe', u'of The'), (u'lifejust', u'life just'), (u'AIice', u'Alice'), (u'lnternationalAirport', u'International Airport'), (u'yourbody', u'your body'), (u'DollarBaby', u'Dollar Baby'), (u'ofjonesing', u'of jonesing'), (u'yourpanties', u'your panties'), (u'offforme', u'off for me'), (u'pantyparty', u'panty party'), (u'everhit', u'ever hit'), (u'theirhomes', u'their homes'), (u'AirForce', u'Air Force'), (u'yourhead', u'your head'), (u'betterbe', u'better be'), (u'myparty', u'my party'), (u'disasterlockdown', u'disaster lockdown'), (u"Ifpot's", u"If pot's"), (u'ifmy', u'if my'), (u'yourmoney', u'your money'), (u'Potterfan', u'Potter fan'), (u'Hermionejust', u'Hermione just'), (u'ofourshit', u'of our shit'), (u'showyou', u'show you'), (u'answernow', u'answer now'), (u'theirsjust', u'theirs just'), (u'BIackie', u'Blackie'), (u'SIeep', u'Sleep'), (u'foryour', u'for your'), (u'oryour', u'or your'), (u'forArthur', u'for Arthur'), (u'CIamp', u'Clamp'), (u'CIass', u'Class'), (u'CIose', u'Close'), (u'GIove', u'Glove'), (u'EIIen', u'Ellen'), (u'PIay', u'Play'), (u'PIace', u'Place'), (u'EIgyn', u'Elgyn'), (u'AIert', u'Alert'), (u'CIaus', u'Claus'), (u'CIimb', u'Climb'), (u"military'II", u"military'll"), (u'anylonget', u'any longer'), (u'yourlife', u'your life'), (u"Yourbitch'IIgetyou", u"Your bitch'll get you"), (u'yourdick', u'your dick'), (u'Tellyourbitch', u'Tell your bitch'), (u'rememberyou', u'remember you'), (u'newface', u'new face'), (u'Butyou', u'But you'), (u"don'tyou", u"don't you"), (u'yourlives', u'your lives'), (u'Iovedher', u'loved her'), (u'reallydid', u'really did'), (u'firstperson', u'first person'), (u'mybest', u'my best'), (u'Justgive', u'Just give'), (u'AIong', u'Along'), (u'atyourbody', u'at your body'), (u'myhands', u'my hands'), (u'sayhe', u'say he'), (u'mybooty', u'my booty'), (u'yourbooty', u'your booty'), (u'yourgirl', u'your girl'), (u'yourlegs', u'your legs'), (u'betterifthey', u'better if they'), (u'manybeautiful', u'many beautiful'), (u'contactpolice', u'contact police'), (u'numberbelow', u'number below'), (u'biggestproblem', u'biggest problem'), (u'Itgave', u'It gave'), (u'everybodykind', u'everybody kind'), (u'theyhad', u'they had'), (u'knowherlast', u'know her last'), (u'herhearing', u'her hearing'), (u'othermembers', u'other members'), (u'BIing', u'Bling'), (u'CIyde', u'Clyde'), (u'foundguilty', u'found guilty'), (u'fouryears', u'four years'), (u'countyjail', u'county jail'), (u'yearin', u'year in'), (u'theirrole', u'their role'), (u'manybottles', u'many bottles'), (u"can'tpronounce", u"can't pronounce"), (u'manybowls', u'many bowls'), (u'ofthatgreen', u'of that green'), (u'manyjoyrides', u'many joyrides'), (u'Superrich', u'Super rich'), (u'Iprefer', u'I prefer'), (u'Theymust', u'They must'), (u'whatyou', u'what you'), (u"I'IIjump", u"I'll jump"), (u'nobodyknow', u'nobody know'), (u'neverknew', u'never knew'), (u'EIectronica', u'Electronica'), (u'AIarm', u'Alarm'), (u'getyourman', u'get your man'), (u'sayyou', u'say you'), (u'getyour', u'get your'), (u'Fuckyou', u'Fuck you'), (u'Whyyou', u'Why you'), (u'butyoujust', u'but you just'), (u'forgetyourname', u'forget your name'), (u'Whatyou', u'What you'), (u"Co/'ncidenta//y", u'Coincidentally'), (u'GIad', u'Glad'), (u'RachelMarron', u'Rachel Marron'), (u"She'llgive", u"She'll give"), (u'presidentialsuite', u'presidential suite'), (u'andgentlemen', u'and gentlemen'), (u'willnot', u'will not'), (u'ourproducers', u'our producers'), (u"Ifshe's", u"If she's"), (u'CIock', u'Clock'), (u'Ishould', u'I should'), (u"I'llgo", u"I'll go"), (u'maypass', u'may pass'), (u'andprotecting', u'and protecting'), (u'BIessed', u'Blessed'), (u'CIean', u'Clean'), (u'SIave', u'Slave'), (u'AIi', u'Ali'), (u'AIIah', u'Allah'), (u'AIIahu', u'Allahu'), (u'CIick', u'Click'), (u'BIast', u'Blast'), (u'AIlah', u'Allah'), (u'SIow', u'Slow'), (u'theirpolicies', u'their policies'), (u'Orperhaps', u'Or perhaps'), (u'ofsex', u'of sex'), (u'forpleasure', u'for pleasure'), (u'ourpower', u'our power'), (u'Yourpiece', u'Your piece'), (u'Offioers', u'Officers'), (u'oondesoended', u'condescended'), (u'myseif', u'myself'), (u"let'sjust", u'let\u2019s just'), (u'yourway', u'your way'), (u'An9TY', u'Angry'), (u'ourjourney', u'our journey'), (u'LuCY', u'Lucy'), (u"\\'m", u'I\u2019m'), (u'CEDR/C', u'CEDRIC'), (u'lsaac', u'Isaac'), (u'FIy', u'Fly'), (u'Ionger', u'longer'), (u'Iousy', u'lousy'), (u'Iosing', u'losing'), (u"They'II", u"They'll"), (u'yourpaws', u'your paws'), (u'littie', u'little'), (u"It'lljust", u"It'll just"), (u'AIso', u'Also'), (u'Iisten', u'listen'), (u'suPPosed', u'supposed'), (u'somePIace', u'someplace'), (u'exPIain', u'explain'), (u'Iittle', u'little'), (u'StoP', u'Stop'), (u'AIways', u'Always'), (u'Iectures', u'lectures'), (u'Iow', u'low'), (u'Ieaving', u'leaving'), (u'Ietting', u'letting'), (u'Iistening', u'listening'), (u'Iecture', u'lecture'), (u'Iicking', u'licking'), (u'Iosses', u'losses'), (u'PIeased', u'Pleased'), (u'ofburglaries', u'of burglaries'), (u"He'sjust", u"He's just"), (u'mytrucktoo', u'my truck too'), (u'nowwhat', u'now what'), (u'yourfire', u'your fire'), (u"herwhat's", u"her what's"), (u'hearthat', u'hear that'), (u'oryou', u'or you'), (u'preferjournalist', u'prefer journalist'), (u'CIaw', u'Claw'), (u'Ifour', u'If our'), (u'lron', u'Iron'), (u"It'syour", u"It's your"), (u'lfstill', u'If still'), (u'forjoining', u'for joining'), (u'foryears', u'for years'), (u'Ifit', u'If it'), (u'notjump', u'not jump'), (u'ourproblem', u'our problem'), (u'yourprofile', u'your profile'), (u'ifJanine', u'if Janine'), (u'forpreventative', u'for preventative'), (u'whetherprotest', u'whether protest'), (u'Ifnot', u'If not'), (u'ourpeople', u'our people'), (u'offmy', u'off my'), (u'forproviding', u'for providing'), (u'hadjust', u'had just'), (u'nearyou', u'near you'), (u'whateveryou', u'whatever you'), (u'hourputs', u'hour puts'), (u'timejob', u'time job'), (u'overyour', u'over your'), (u'orpermanent', u'or permanent'), (u'createjobs', u'create jobs'), (u"I'vejust", u"I've just"), (u'peoplejobs', u'people jobs'), (u'dinnerpail', u'dinner pail'), (u'hasjumped', u'has jumped'), (u'theirprivacy', u'their privacy'), (u'AIl', u'All'), (u'ofserious', u'of serious'), (u'yourprofessional', u'your professional'), (u'poiitical', u'political'), (u'tojump', u'to jump'), (u'iives', u'lives'), (u'eiections', u'elections'), (u'militaryjuntas', u'military juntas'), (u'nojoke', u'no joke'), (u'yourpresidency', u'your presidency'), (u'ofmilitaryjuntas', u'of military juntas'), (u'Ourproposal', u'Our proposal'), (u'LeBIanc', u'LeBlanc'), (u'KIaus', u'Klaus'), (u'yourpussy', u'your pussy'), (u'lNTERVIEWER', u'INTERVIEWER'), (u'lNAUDIBLE', u'INAUDIBLE'), (u'SImpsons', u'Simpsons'), (u'anotherjob', u'another job'), (u'lfthere', u'If there'), (u'descentinto', u'descent into'), (u'ofthathere', u'of that here'), (u'ofway', u'of way'), (u'yourseat', u'your seat'), (u'allyou', u'all you'), (u'Allyou', u'All you'), (u'yourass', u'your ass'), (u'Yourbutt', u'Your butt'), (u'iustiiggle', u'just jiggle'), (u'iust', u'just'), (u'CSi', u'CSI'), (u'affernoon', u'afternoon'), (u'orpersecution', u'or persecution'), (u'theirpetty', u'their petty'), (u'Fourpercent', u'Four percent'), (u'fourpercent', u'four percent'), (u'willjust', u'will just'), (u"Ifyou're", u"If you're"), (u'ourplanet', u'our planet'), (u'lsolation', u'Isolation'), (u'yourprimitive', u'your primitive'), (u'yourplanet', u'your planet'), (u'matteryour', u'matter your'), (u'Yourplace', u'Your place'), (u'andjustice', u'and justice'), (u'anotherpart', u'another part'), (u'confiict', u'conflict'), (u'growingjeopardy', u'growing jeopardy'), (u'hasjust', u'has just'), (u'havejust', u'have just'), (u'herselfinto', u'herself into'), (u'ifnecessary', u'if necessary'), (u"we'vejust", u"we've just"), (u'tojust', u'to just'), (u'yourjudgment', u'your judgment'), (u'yourjeans', u'your jeans'), (u'Youjust', u'You just'), (u'ajanitor', u'a janitor'), (u'FIattery', u'Flattery'), (u'myjournal', u'my journal'), (u'myjudgment', u'my judgment'), (u'offofmy', u'off of my'), (u'offyour', u'off your'), (u'ofgood', u'of good'), (u'ofguilty', u'of guilty'), (u'ofhaving', u'of having'), (u'ofheart', u'of heart'), (u'ofhonor', u'of honor'), (u'oflove', u'of love'), (u'ofmankind', u'of mankind'), (u'ofmany', u'of many'), (u'ofnormal', u'of normal'), (u'ofpeople', u'of people'), (u'ofpower', u'of power'), (u'ofsuch', u'of such'), (u'peoplejust', u'people just'), (u"They'rejust", u"They're just"), (u'tojeopardize', u'to jeopardize'), (u'Yourplaces', u'Your places'), (u'yourposition', u'your position'), (u'yourselfa', u'yourself a'), (u'yourselfright', u'yourself right'), (u'thejob', u'the job'), (u'thejanitors', u'the janitors'), (u'alljust', u'all just'), (u"forAmerica's", u"for America's"), (u'Forpencils', u'For pencils'), (u'forpondering', u'for pondering'), (u'handwrittenjournals', u'handwritten journals'), (u'herpursuit', u'her pursuit'), (u'ofjust', u'of just'), (u'oflanding', u'of landing'), (u'oflife', u'of life'), (u'outjust', u'out just'), (u'Thejoke', u'The joke'), (u'ourpatient', u'our patient'), (u"oryou're", u"or you're"), (u'ofyourself', u'of yourself'), (u'poweryour', u'power your'), (u'Ofmy', u'Of my'), (u'EIlen', u'Ellen'), (u"Don'tget", u"Don't get"), (u'tellme', u'tell me'), (u'ofdecision', u'of decision'), (u'itgoing', u'it going'), (u'artificialgravity', u'artificial gravity'), (u'shouldknow', u'should know'), (u"Hasn'tgot", u"Hasn't got"), (u'thirdjunction', u'third junction'), (u'somebodypicks', u'somebody picks'), (u'Willyou', u'Will you'), (u"can'tget", u"can't get"), (u'BuZZes', u'Buzzes'), (u"wouldn'tyou", u"wouldn't you"), (u'Wellbelow', u'Well below'), (u"What'dyou", u"What'd you"), (u'decipheredpart', u'deciphered part'), (u"they'llknow", u"they'll know"), (u"ifit's", u"if it's"), (u'ornot', u'or not'), (u'myposition', u'my position'), (u'lndistinct', u'Indistinct'), (u'anybiscuits', u'any biscuits'), (u'Andifyou', u'And if you'), (u'lfwe', u'If we'), (u'yourarm', u'your arm'), (u'lnteresting', u'Interesting'), (u'findit', u'find it'), (u"it'llstart", u"it'll start"), (u'holdit', u'hold it'), (u'ofkilling', u'of killing'), (u'Howyou', u'How you'), (u'lnhales', u'Inhales'), (u'lgot', u'I got'), (u'CIip', u'Clip'), (u"what'II", u"what'll"), (u"road'II", u"road'll"), (u'girI', u'girl'), (u'LIoyd', u'Lloyd'), (u'BIake', u'Blake'), (u'reaI', u'real'), (u'Foryour', u'For your'), (u'yourpublic', u'your public'), (u'LAst', u'Last'), (u'h is', u'his'), (u'He)\u2019', u'Hey'), (u'Ls', u'Is'), (u"al'", u'at'), (u"wail'", u'wait'), (u"III'll", u"I'll"), (u'forthis', u'for this'), (u'Yea h', u'Yeah'), (u'a re', u'are'), (u'He)"', u'Hey'), (u"pan'", u'part'), (u'yea h', u'yeah'), (u'Tun', u'Run'), (u"He)'", u'Hey'), (u"he)'", u'hey'), (u"I'11", u"I'll"), (u'he)"', u'hey'), (u" 're ", u"'re ")]), + 'pattern': u'(?um)(\\b|^)(?:\\$COff\\$|\\$ergei|\\$\\\'llOp|\\/\\\'\\/\\/|\\/\\\'\\/I|\\/ennifer|\\/got|\\/have|\\/hope|\\/just|\\/love|\\/\\\'m|\\/mmerse|\\/nsu\\/ts|\\/ong|\\/ook|\\/t\\\'s|\\/\\\'ve|\\\\\\/\\\\\\/e\\\'d|\\\\\\/\\\\\\/e\\\'re|\\\\\\/\\\\\\/e\\\'ve|\\\\\\/\\\\\\/hat|\\\\\\/\\\\\\/here\\\'d|\\\\\\/\\\\\\/hoo|\\\\\\/\\\\\\/hy|\\\\\\/\\\\\\/hy\\\'d|\\\\\\/\\\\le\\\'re|\\\\\\/Ve|\\\\Ne\\\'re|\\\\Nhat\\\'s|\\\\Nhere\\\'s|\\|\\\'mjust|\\\xa4ff|\\\xa4Id|\\\xa4Ids|\\\xa4n|\\\xa4ne|\\\xa4nly|\\\xa4pen|\\\xa4r|\\\xa4rder|\\\xa4ther|\\\xa4ur|\\\xa4ut|\\\xa4ver|\\\xa4wn|\\\u20acV\\\u20acI\\\'y|0\\\'clock|0f|0fEngland|0fft0|0l\\/er|0n|0ne|0ne\\\'s|0r|0rders|0thers\\\'|0ut|0utlaw\\\'s|0utlaws\\\'|0ver|13oos|18oos|195os|1et\\\'s|1o|1oo|1ooth|1oth|2E\\_|2\\\'IST|2\\\'Ist\\_|2o|2oth|3o|3oth|4o|4os|4oth|50rry|5o|5oth|6o|6os|\\\'6os|6oth|7o|\\\'7os|7oth|8o|\\\'8os|8oth|9\\/aim|9o|9oth|9UnShQt|a\\/\\/|a\\/bum|a\\/so|A\\/ways|abcut|aboutjoining|aboutposh|aboutus|aboutyou|accldent|Acool|afier|affraid|Afriend|afterall|afterthe|afulcrum|Afunny|aga\\/nst|ahsolutes|AI\\_I\\_|AIien|AIex|AII|AIIan|AIIow|AIive|ain\\\'tgotno|Ain\\\'tgotno|airstrike|AIVIBULANCE|ajob|ajockey\\_|ajoke|Ajoke|ajoking|al\\/|al\\/en|alittle|allgasp|alljustforshow|aln\\\'t|alot|Alot|An5wer|Andit|Andit\\\'s|andl|andlaughs|andleave|andthe|andyou|Andyou|ANNOUNC\\/NG|anotherstep|ANSWER\\/NG|answerwhat|antiquejoke|anyhcdy\\\'s|Anyidea|anyone\\\'s\\_|apejust|ARABlc|aren\\\'t\\_|arerl\\\'t|Arnsteln\\\'s|atleast|Atough|Awhole|awoman|Awoman|barelytalked|bcat|Bcllvla|bcmb|bcmbs|be\\/\\/y|becuase|Beep\\/\\\'ng|bejumpy|besldes|bestfriend|bestguy|bestjob|BIack|BIess|bigos\\_\\_\\_|BIame|BIind|BIood|BIue|BLOVVS|blowholel|blt|Bo99|bodiedyoung|breakf\\\xe9wtl|bulldozlng|butjust|butl|Butl|butljust|Butljustcan\\\'tgetenough|Butyou\\\'re|buythem|buyyou|byjust|bythe|C\\/latter\\/\\\'\\/7g|ca\\/\\/\\/ng|ca\\/I|call\\/ng|callyou|can\\*t|can\\\'i|can\\\'I|canlgetyou|cannotchange|cannut|can\\\'T|can\\\'t\\_|can\\\'tjust|can\\\'tletgo|Car0l|Carhorn|carrled|Ccug|Ccugs|Ccver|cellularchange|cff|cfycu|cfycur|Ch\\/rping|chaletgirl|changejobs|Charliejust|Chatter\\/\\\'rtg|CHATTERWG|Chequeredlove|cHIRPINcs|chjldishness|chlldrcn|chlldren|chocolatte|Cho\\/r|cHucKl\\_Es|CIark|CIear|circumcised\\_|ckay|cl\\_osEs|CLATTERWG|cn|cne|cnes|Coincidenta\\/\\/y|COm\\\u20ac|comp\\/etey|complainingabout|coms|cond\\/lion|confdence|conhrmed|connrm|Consecutivelyl|COUGH5|CouGHING|couIdn\\\'t|couldjust|couldn\\\'T|couldn\\\'tjust|Couldyou|crappyjob|CRAsHING|crder|Crowdcheers|Cruoially|cther|cuuld|cver|d\\/\\\'dn\\\'t|d\\/squietude|D\\\xa4esn\\\'t|d\\\xa4n\\\'i|d\\\xa4n\\\'t|d\\\xb09|d0|D0|D0asn\\\'t|Dad\\\'\\/\\/|dairyjust|Dar\\/\\/ng|dc|Dcbby|dccsn\\\'t|dcctcr|Dces|dcgs|dcing|dcn\\\'I|dcn\\\'t|Dcn\\\'t|dcughnut|declslons|deedhas|Dehnitely|desewes|desperate\\/\\\xbby|D\\\ufb02nk|DIAl\\_lNcs|didn\\\'\\!|didnt|didn\\\'T|dIdn\\\'t|didn\\\'t\\_|didrft|didrl\\\'t|didyou|divorcing\\_|dld|dldn\\\'t|dlfflcull|dlg|dlsobeyed|doasn\\\'t|Doasn\\\'t|doctoh|Doctor\\_\\_\\_tell|doesnt|doesn\\\'T|doesri\\\'t|doesrt|Doesrt|doit|dojust|don\\*t|donejobs|don\\\'i|don\\\'l|Don\\\'l|Donllook|dont|don\\\'T|don\\\'tcare|don\\\'tjoke|Don\\\'tjudge|don\\\'tjust|Don\\\'tjust|Don\\\'tlet|don\\\'tlhink|don\\\'tpush|Don\\\'tyou|DonWlook|Dooropens|doorshuts|dothat|dothis|Drinkthis|dumbass|dumbto|dun\\\'t|E\\/\\/e|E9YPt|ea\\/\\\'t\\/7|eart\\/7|efi\\\'\\/\\\'c\\/\\\'ent|EN\\<3LlsH|Enjoythe|Erv\\\\\\/an|Erv\\\\\\/an\\\'s|etemity|ev\\/I|eve\\/yone|even\\/body\\\'s|eversay|Everymonth|everythings|Everythirlg\\\'s|Everythlng\\\'s|Everytime|Exac\\\ufb02y|ExacUy\\_|excitedshrieking|ExcLAllvls|exploatation|expreusion|fairthat|Fathef|fatherfigure|FBl|fcrebcdlng|fcreverjudges|fcund|feeleverything|feelsweet|fiam\\/\\\'\\/y|\\\ufb01ngernail|finishedjunior|FIynn|flll|flra|Flylng|Fnends|fo\\/low|fonzvard|fora|Fora|forajob|forAmerica|forNew|forone|forso|Forsuch|forsunburns|forthe|Foryears|foryou|Foudeen|Fou\\\ufb02een|FourSeasons|fr\\/ends|freezerfood|F\\\xfchrerfeels|furthernotice|furyou|G0|g0in9|gamlenias|GAsPING|gc|gcing|gcnna|Gcnna|gct|Gct|genercsity|generosityn|getjust|g\\\ufb02ing|gi\\\ufb02friend|gir\\/|gir\\/s\\\'boarding|giris|gLlyS|glum\\_|gnyone|golng|goodboyand|goodjob|gOt|gotjumped|gotmyfirstinterview|grandjury|greatjob|Greatjobl|grinco|GRoANING|GRUNUNG|gu|gunna|guyjumped|guyjust|gUyS|\\_H6Y\\-|H\\\u20acY|H0we\\\xb7ver|halftheir|hapPY|hasrt|Hasrt|haven\\\'tspokerl|hcle|hcme|hcmes|hcpe|hctel|hcurs|Hcw|he\\/ps|hearjokestonight|hearme|Hefell|he\\\'II|He\\\'II|HeII0|He\\\'Il|Hejust|He\\\'lI|HelIo|hellc|HellO|herboyfr\\/end|herflesh|herfollov\\\\\\/ed|herjob\\_|HerrSchmidt|herwith|HeY\\\xb7|HeyJennifer|hiddsn|hisjunk|Hitlershare|Hlneed|Hnally|Hnishing|HOId|hOIes|HONMNG|honorthe|honoryou|honoryour|Hov\\\\\\/\\\'s|Hov\\\\\\/\\\'S|HovvLING|howit|HoW\\\'s|howto|Hs\\\'s|hurtyou|I\\/erilj\\/|I\\/fe|I\\\\\\/I|I\\\\\\/Ian|I\\\\\\/Iathies|I\\\\\\/Ie|I\\\\\\/Iommy|I\\\\\\/Ir|I\\\\\\/Ir\\.|I\\\\\\/ly|I3EEPING|I3LARING|Iacings|Iaid|Iam|Iand|Ianding|Iast|Iate|Icad|Icading|Ican|Iccked|Icng|Icsing|Icslng|Idid|Ididn\\\'t|Ido|Idon\\\'i|Idon\\\'t|Idon\\\'tthink|I\\\'E\\\'\\$|Ieamed|Ieapt|Iearned|Ieast|Ieave|Ied|Ieft|Ieg\\\'s|Iess|Iet|Iet\\\'s|Iet\\\'sjust|if\\/just|Ifear|Ifeared|Ifeel|ifI\\\'\\|\\||ifI\\\'d|ifI\\\'II|ifI\\\'ll|ifI\\\'m|Ifinally|ifI\\\'ve|ifl|Iforgot|Ifound|ifshe|ifthat\\\'s|ifthe|Ifthe|ifthere\\\'s|Ifthey|ifwe|Ifwe|Ifycu|ifyou|Ifyou|ifyuu|Iget|Igot|Igotta|Igotyou|Iguess|Iguessljust|Ihad|Ihat\\\'s|Ihave|Iheard|ihere\\\'s|ihey\\\'ve|Ihope|ii\\/Iary|ii\\/Ir|ii\\/Ir\\.|ii\\/love|Iife|I\\\'II|Iike|I\\\'Il|Iine|iirst|ii\\\'s|Ii\\\'s|Iiterallyjumped|Ijoined|Ijust|Iknew|Iknow|Ile|Ileft|I\\\'lldo|I\\\'llmake|Ilons|Ilove|I\\\'mjust|Inconceivablel|infact|Infact|in\\\ufb02uence|infront|injust|insc\\\ufb01p\\\ufb01ons|insolencel|intc|internationaljudges|inthe|Iockdown|Iong|Iongships|Iook|Iookjust|Iooklng|Iooks|Ioose|Iord\\\'s|Iose|Ioser|Ioss|Iost|Iot|Iot\\\'s|Iousyjob|Iove|Ioves|Iowlife|Ipaid|Iquit|Ireallythinkthis|I\\\'rn|Isaw|Isayt\\/1e|isjust|isn\\\'i|isn\\\'t\\_|Isthis|Istill|Istumblod|Itake|itdown|Iteach|Itfeels|ithave|Ithink|Ithinkthat|Ithinkthis|Ithinkyou\\\'re|Ithlnk|Ithoguht|Ithought|Ithoughtl|it\\\'II|It\\\'II|it\\\'Il|It\\\'Il|itin|itjust|Itjust|it\\\'lI|It\\\'lI|It\\\'llhappen|it\\\'lljust|Itold|Itook|itout|it\\\'S|it\\\'sjinxed|it\\\'sjust|It\\\'sjust|itso|Ittends|Itwasn\\\'t|Iuckier|IV\\|oney|IV\\|oney\\\'s|I\\\'va|I\\\'Ve|IVIan|IVIAN|IVIarch|IVIarci\\\'s|IVIarko|IVIe|IVIine\\\'s|IVImm|IVIoney|IVIr\\.|IVIrs|IVIuch|IVIust|IVIy|IVlacArthur|IVlacArthur\\\'s|IVlcBride|IVlore|IVlotherfucker\\_|IVlr|IVlr\\.|IVlr\\_|IVlust|IVly|Iwake|Iwant|Iwanted|Iwas|Iwasjust|Iwasjustu|Iwill|Iwish|Iwon\\\'t|Iworked|Iwould|jalapeno|Jaokson|Jascn|jcke|jennifer|joseph|jsut|Jumpthem|jusi|jusl|justjudge|justleave|Justletgo|kidsjumped|kiokflip|knowjust|knowthat|knowthis|knowwhat|knowyet|knowyourlove|korean|L\\/ght|L\\/kes|L\\\\\\/Ianuela|L\\\\\\/Ianuelal|l\\\\\\/Iauzard|l\\\\\\/I\\\xe9lanie|L\\\\\\/I\\\xe9lanie|l\\\\\\/Iom|l\\\\\\/Iommy|l\\\\\\/Ir|l\\\\\\/Ir\\.|l\\\\\\/Is|l\\\\\\/ly|l\\_AuGHING|l\\\u2018m|Laml6|Lcad|lcan|lcan\\\'t|lcarl\\\'t\\_|Lcve|l\\\'d|L\\\'d|ldid|Ldid|ldiot|L\\\'djump|ldon\\\'t|Ldon\\\'t|Lefs|Let\\\'sjust|lf|Lf|lfeelonelung|lfthey|lfyou|Lfyou|lfyou\\\'re|lget|lgive|Li\\/0\\/Academy|li\\/lr\\.|ligature\\_\\_\\_|l\\\'II|l\\\'Il|ljust|Ljust|ll\\/Iommy\\\'s|ll\\/lajor|Ll\\/lajor|ll\\/layans|l\\\'lI|l\\\'ll|L\\\'ll|l\\\'lljust|L\\\'lltake|llte|l\\\'m|L\\\'m|Lmean|l\\\'mjust|ln|lN|lNAuDll3LE|LNAuDll3LE|LNDlsTINcT|lneed|lostyou|Loudmusic|lraq|lRA\\\'s|Lrenka|Lrn|lRS|lsabella|lsn\\\'t|Lsn\\\'t|Lst\\\'s|lsuppose|lt|ltake|ltell|lthink|Lthink|lthink\\_\\_\\_|lt\\\'II|lt\\\'Il|ltjammed\\_|lt\\\'ll|ltold|lt\\\'s|lT\\\'S|Lt\\\'S|Lt\\\'sjust|lv\\\\\\/asn\\\'t|l\\\'ve|L\\\'ve|lVIan|lVIcHenry|lVIr\\.|lVlacArthur|LVlore|lVlr|lVlr\\.|lvluslc|lVlust|LVly|lwaited|lwamoto|lwant|lwanted|lwas|lwill|lwon\\\'t|lworked|lwould|lwould\\\'ve|lx\\/Iorning|M\\/dd\\/e|m\\/g\\/7ty|MACH\\/NE|MacKenz\\/e|majorjackpot|majormuscle|Manuela\\_|maste\\/y|Masturhate|Mattei\\_|mayjust|mbecause|McCa\\/Iister|McCallisler|Mccallister|Mccallisters|mcm\\\'s|mcney|mcral|mcre|mcve|mejust|Mexioo|mi\\/\\/\\<|misfartune|Ml6|Mlnd|Mock\\/\\\'ngbl\\\'rd|mOI\\\'\\\u20ac|Mom\\_|monkeyback|move\\_\\_\\_l|moveto|mustknock|Myheart|myjch|myjet|myjob|Myjob|myjob\\\'s|mylife|Mynew|myown|mypants|myselli|Myshoes|mysong|mytemper|mythumb|Myworld|N0|narne|Natians|naTve|nc|Nc|ncne|Ncrth|ncw|Ncw|needyou|neighboun|neverfound|neverthere|neverv\\\\\\/ill\\_|NewJersey|newjob|newjobs|nextdoor|Nighw|nilios|Nlagnificence|Nlakes|Nlalina|Nlan|Nlarch|Nlarine|Nlarion|Nlarry|Nlars|Nlarty|Nle|Nleet|Nlen|Nlom|Nlore|Nlornin|Nlother|Nlr|Nlr\\.|Nlrs|Nluch|nojurisdiction|noone|Noone|not\\ judging|notgoing|notjunk|Notjunk|notjust|notsure|novv|Nowjust|Nowthat\\\'s|Numbertwo|oan\\\'t|oan\\\'tjust|objecl|occultpowerand|Ocps|ofa|ofajudge|ofall|Ofall|ofBedford|ofcourse|Ofcourse|ofeach|ofeither|Offioer\\\'s|ofFrance|offreedom|offthe|offthis|offto|offun|ofguy|Ofhce|ofhis|ofHis|ofhoneybees|ofit|ofjam|OFJOAN|ofjoy|ofjunior|ofme|ofmead|ofmicroinjections|ofmy|ofNew|ofNorris\\\'|ofopinions|ofour|ofpeopla|ofthat|ofthe|Ofthe|oftheir|ofthem|ofthem\\\'s|ofthemselves|ofthere|ofthese|ofthings|ofthis|ofthlngs|ofthose|ofuse|ofwashington|ofyou|ofyour|OId|OIsson|Ok3Y|okaY|OkaY|OKaY|OKGY|Ol\\<|oldAdolfon|onboard|onIy|onIything|onJanuaw|onlyjust|Onyinal|oomprise|oonstitution|oouldn\\\'t|oould\\\'ve|oousin\\\'s|opiimistically|ora|orfall|orglory|orjust|Orjust|Orthat|orwould|Orwould|Othenzvise|our\\ joumey|ourbrave|ourfathers|ourgirlon|Ourgoal|Ourguy|ourj0b\\\'s|Ourj0b\\\'s|ourjobs|ourjob\\\'s|Ourjob\\\'s|ourjoumey|ourphotos|ourv\\\\\\/ay|outlool\\<\\\'s|overme|overthe|overthere|p\\/ace|P\\/ease|p\\_m\\_|P\\\xb0P\\$|PANUNG|pclnt|pclnts|pe0pIe|Perrut\\_|Persona\\/4\\/|Persona\\/y|persors|PIain|PIease|PIeasure|PIus|pleasurlng|POIe|Polynes\\/ans|poorshowing|popsicle|Presidenfs|probablyjust|puIIing|Putyourhand|Qh|QkaY|Qpen|QUYS|\\_QW|r\\/ght|ralnbow|ratherjump|ratherjust|Rcque|rcscucd|rea\\/|readytolaunchu|reaHy|ReaHy|reallyjust|reallymiss|reallytalked|reallythink|reallythinkthis|rememberthem|reoalibrated|retum|rhfluence|rightdown|roadyou|RUMBUNG|s\\/uggikh|S0|S1oW1y|saidyou|sayeverything\\\'s|saynothing|saythat|sc|scientihc|SCREAIVHNG|sCREAlvllNG|SCREAlvllNG|scund|S\\\'EOp|severa\\/parents|sfill|S\\\ufb02ence|shallrise|sHATTERING|shcws|Shdsjust|She\\`s|She\\\u2018II|she\\\'II|She\\\'II|she\\\'Il|Shejust|she\\\'lI|Shoofing|ShOp|shortyears|shou\\/dn|shou\\\ufb01ng|Shou\\\ufb02ng|shouldnt|Shouldrt|shouldrt|Shs\\\'s|SHUDDERWG|Shutup|SIGH\\$|signifcance|Sincc|sistervvill|Skarsg\\\xe9rd|slcsHs|slGHINcs|slGHING|slNGING|slzzLING|smarfest|Smiih|so\\/id|SoBl3lNG|soemtimes|Sojust|soldierl|somethlng|somethlng\\\'s|somez\\\'\\/7\\/ng|somthing|sumthing|sou\\/|SoundofMusic|SP\\/ash|SPEAK\\/NG|speII|speII\\\'s|Spendourtime|sQUA\\\\\\/\\\\\\/KING|StAnton|stealsjeans|StilI|Stilldesperatelyseeking|stlll|sToPs|storyl|Stubbom|su\\/faces|suffocaiing|summerjob|Summerjust|sun\\/ive|superiorman|sur\\\ufb02aces|t\\/ying|T0|T00|ta\\/ks|taiked|talkto|Talkto|talktonight|tampax|tc|tcday|tcrturing|tcuch|te\\/\\/|tearjust|tellsjokes|tellyou|terriers\\_|th\\/nk|THEPASSION|thafs|Thafs|Thai\\\'s|Thal\\\'s|thankyou|Thankyou|thatconverts|thatgoes|that\\\'II|That\\\'II|thatjob|thatjunk|thatjust|thatleads|Thatl\\\'m|that\\\'s\\ just|Thatsand|that\\\'sjust|That\\\'sjust|Thc|theirface|theirfeet|theirfury|thejaw|thejoint|thejudge|thejudges|Thejudges|thejury|Thelook|Therds|There\\\'II|There\\\'Il|There\\\'lI|They\\\'\\/\\\'e|they\\/\\\'II|They\\/re|They\\/\\\'re|they\\\'II|they\\\'Il|theyjust|Theyjust|they\\\'lI|They\\\'lI|theyre|theysay|thinkthat|this\\\'II|thlngs|Thlnkthls|thls|thore\\\'s|Thore\\\'s|Thorjust|thoughtl\\\'dletyou|tnatjust|tnat\\\'s|Tnat\\\'s|Tnere\\\'ll|to\\/\\/et|To\\/\\/S|todayl\\\'d|togelher|togethen|tojoin|tojudge|toldyou|tomorrovv|Tonighfsjust|totake|totalk|tothat|tothe|Towef|Tr\\/ck\\/ing|Traitur|tv\\\\\\/o|tvvelve|Tvvelve|tvventy|Tvventy|tvvo|Tvvo|twc|unconhrmed|underthat|underthe|underthese|underyour|unfilyou|Unfon\\\'unate\\/y|Uninnabited|untilApril|untilyou|upthinking|upto|V\\\\\\/ait\\_\\_\\_|v\\\\\\/as|V\\\\\\/as|V\\\\\\/e|v\\\\\\/eek\\\'s|V\\\\\\/eird\\_|V\\\\\\/ell|V\\\\\\/hat|V\\\\\\/hen\\\'ll|V\\\\\\/ho|v\\\\\\/ho\\\'ll|v\\\\\\/Hoops|v\\\\\\/ho\\\'s|V\\\\\\/ho\\\'s|V\\\\\\/hy|v\\\\\\/ith|v\\\\\\/on\\\'t|V\\\\fith|V\\\\fithin|valedictolian|vcice|ve\\/y|veiy|V\\\xe9ry|versioin|vi\\/ay|visitjails|Viva\\/di\\\'s|vlll|Voil\\\xe1|Voil\\\xe9|vvasjust|VVasn\\\'t|vvay|VVe|VVe\\\'II|VVe\\\'ll|Vvelooked|VVe\\\'re|VVe\\\'ve|VVhat|VVhat\\\'s|VVhat\\\'S|VVhen|\\\'v\\\'Vhere\\\'s|VVhip|vvHooPING|VvHooPING|VVhy|VVill|VVinters|vvlND|w\\\xa4n\\\'t|W9|waht|waierfall|walkjust|wallplant|wannajump|wantyou|Warcontinues|wasjennifer|wasjust|wasrt|Wasrt|wayl|wayround|wclf|wcman|wcmen|wcn\\\'t|wcrse|wculd|We\\/\\/|We\\/came|we\\/come|We\\/come|We\\/I|weekendjust|werert|Werert|we\\\'II|We\\\'II|we\\\'Il|We\\\'Il|wejust|we\\\'lI|We\\\'rejust|We\\\'ro|We\\\'Ve|wh\\/p|Wh\\\xb0ops|Whafs|Whatam|Whatare|Whateverwe|What\\\'II|Whatis|whatjust|Whatl|whatshe|whatwe|Whc\\\'s|Whcse|wHlsPERs|wi\\/\\/|wil\\/|Wil\\/|wilI|willbe|willhire|willneverknow|willyou|wlfe|wlfe\\\'s|wlth|wnat\\\'s|Wno|Wo\\/f|wo\\\ufb02d|WOI\\\'1\\\'t|wondernobody|won\\\'T|won\\\'tanswerme|won\\\'tforget|won\\\'tletitbring|Wo\\\'re|worfd|won\\\'th|won\\\'thwhile|workyou|wouIdn\\\'t|wouldn\\\'\\!|Wouldrt|wr\\/\\\'2\\\'\\/ng|writign|wrcng|wuuld|\\_Yay|Y\\\xa4u\\\'II|Y\\\xa4u\\\'ll|y\\\xa4u\\\'re|Y\\\xa4u\\\'re|y\\\xa4u\\\'ve|Y0|y0LI|y0u\\\'II|Y0u\\\'rc|Y0u\\\'re|Y0u\\\'ve|yaming|yaurparents|ycu|ycu\\\'d|ycur|Ycu\\\'re|Ycursins|YEI\\_I\\_|YELL\\$|yigg\\/mg|Yigg\\/mg|yoLI|yOu|yOU|you\\`re|you\\\'II|You\\\'II|You\\\'Il|youjack|youjoin|Youjoin|youjust|You\\\'lI|youngsterlike|youpick|you\\\'ra|Yourattention|yourautomobile|You\\\'rejustjealous|yourextra|yourfather|yourhand|yourhusband|yourjewelry|yourjob|Yourjob|yourjob\\_|yourjockey|yourjury|yourname|Yourpackage|yourpackage|you\\\'ro|yourpoorleg|yourvveak|you\\\'va|You\\\'va|youWlneversee|yQu|YQu|yQu\\\'\\_7|yummY|yuu|Yuu|Yuu\\\'ve|z\\\'housand|zlPPING|Ifslocked|nightjust|dayjourney|Ourjob|IunCh|nieCe|giVes|wantto|besttoday|NiCe|oftravelling|oftwo|ALl|afterparty|welL|theirjob|lfhe\\\'s|babyjesus|shithousejohn|jesus|withjesus|Gojoin|Adaughter|talkwith|anyjournals|L\\\'mjewish|arejust|soundjust|ifl\\\'m|askyou|ordinarywoman|andjunkies|isjack|helpyou|thinkyou|Lordjesus|injuvy|thejets|ifGod|againstjewish|ajunkie|dearjesus|hearyour|takeyears|friendjean|Fatherjohn|youjean|hearyou|Ifshe|didn\\\'tjust|IfGod|notjudge|andjudge|OKBY|myjourney|yourpremium|we\\\'rejust|Iittlejokes|Iifejust|Andjust|ofThe|lifejust|AIice|lnternationalAirport|yourbody|DollarBaby|ofjonesing|yourpanties|offforme|pantyparty|everhit|theirhomes|AirForce|yourhead|betterbe|myparty|disasterlockdown|Ifpot\\\'s|ifmy|yourmoney|Potterfan|Hermionejust|ofourshit|showyou|answernow|theirsjust|BIackie|SIeep|foryour|oryour|forArthur|CIamp|CIass|CIose|GIove|EIIen|PIay|PIace|EIgyn|AIert|CIaus|CIimb|military\\\'II|anylonget|yourlife|Yourbitch\\\'IIgetyou|yourdick|Tellyourbitch|rememberyou|newface|Butyou|don\\\'tyou|yourlives|Iovedher|reallydid|firstperson|mybest|Justgive|AIong|atyourbody|myhands|sayhe|mybooty|yourbooty|yourgirl|yourlegs|betterifthey|manybeautiful|contactpolice|numberbelow|biggestproblem|Itgave|everybodykind|theyhad|knowherlast|herhearing|othermembers|BIing|CIyde|foundguilty|fouryears|countyjail|yearin|theirrole|manybottles|can\\\'tpronounce|manybowls|ofthatgreen|manyjoyrides|Superrich|Iprefer|Theymust|whatyou|I\\\'IIjump|nobodyknow|neverknew|EIectronica|AIarm|getyourman|sayyou|getyour|Fuckyou|Whyyou|butyoujust|forgetyourname|Whatyou|Co\\/\\\'ncidenta\\/\\/y|GIad|RachelMarron|She\\\'llgive|presidentialsuite|andgentlemen|willnot|ourproducers|Ifshe\\\'s|CIock|Ishould|I\\\'llgo|maypass|andprotecting|BIessed|CIean|SIave|AIi|AIIah|AIIahu|CIick|BIast|AIlah|SIow|theirpolicies|Orperhaps|ofsex|forpleasure|ourpower|Yourpiece|Offioers|oondesoended|myseif|let\\\'sjust|yourway|An9TY|ourjourney|LuCY|\\\\\\\'m|CEDR\\/C|lsaac|FIy|Ionger|Iousy|Iosing|They\\\'II|yourpaws|littie|It\\\'lljust|AIso|Iisten|suPPosed|somePIace|exPIain|Iittle|StoP|AIways|Iectures|Iow|Ieaving|Ietting|Iistening|Iecture|Iicking|Iosses|PIeased|ofburglaries|He\\\'sjust|mytrucktoo|nowwhat|yourfire|herwhat\\\'s|hearthat|oryou|preferjournalist|CIaw|Ifour|lron|It\\\'syour|lfstill|forjoining|foryears|Ifit|notjump|ourproblem|yourprofile|ifJanine|forpreventative|whetherprotest|Ifnot|ourpeople|offmy|forproviding|hadjust|nearyou|whateveryou|hourputs|timejob|overyour|orpermanent|createjobs|I\\\'vejust|peoplejobs|dinnerpail|hasjumped|theirprivacy|AIl|ofserious|yourprofessional|poiitical|tojump|iives|eiections|militaryjuntas|nojoke|yourpresidency|ofmilitaryjuntas|Ourproposal|LeBIanc|KIaus|yourpussy|lNTERVIEWER|lNAUDIBLE|SImpsons|anotherjob|lfthere|descentinto|ofthathere|ofway|yourseat|allyou|Allyou|yourass|Yourbutt|iustiiggle|iust|CSi|affernoon|orpersecution|theirpetty|Fourpercent|fourpercent|willjust|Ifyou\\\'re|ourplanet|lsolation|yourprimitive|yourplanet|matteryour|Yourplace|andjustice|anotherpart|confiict|growingjeopardy|hasjust|havejust|herselfinto|ifnecessary|we\\\'vejust|tojust|yourjudgment|yourjeans|Youjust|ajanitor|FIattery|myjournal|myjudgment|offofmy|offyour|ofgood|ofguilty|ofhaving|ofheart|ofhonor|oflove|ofmankind|ofmany|ofnormal|ofpeople|ofpower|ofsuch|peoplejust|They\\\'rejust|tojeopardize|Yourplaces|yourposition|yourselfa|yourselfright|thejob|thejanitors|alljust|forAmerica\\\'s|Forpencils|forpondering|handwrittenjournals|herpursuit|ofjust|oflanding|oflife|outjust|Thejoke|ourpatient|oryou\\\'re|ofyourself|poweryour|Ofmy|EIlen|Don\\\'tget|tellme|ofdecision|itgoing|artificialgravity|shouldknow|Hasn\\\'tgot|thirdjunction|somebodypicks|Willyou|can\\\'tget|BuZZes|wouldn\\\'tyou|Wellbelow|What\\\'dyou|decipheredpart|they\\\'llknow|ifit\\\'s|ornot|myposition|lndistinct|anybiscuits|Andifyou|lfwe|yourarm|lnteresting|findit|it\\\'llstart|holdit|ofkilling|Howyou|lnhales|lgot|CIip|what\\\'II|road\\\'II|girI|LIoyd|BIake|reaI|Foryour|yourpublic|LAst|h\\ is|He\\)\\\u2019|Ls|al\\\'|wail\\\'|III\\\'ll|forthis|Yea\\ h|a\\ re|He\\)\\"|pan\\\'|yea\\ h|Tun|He\\)\\\'|he\\)\\\'|I\\\'11|he\\)\\"|\\ \\\'re\\ )(\\b|$)'}}, 'fin': {'BeginLines': {'data': OrderedDict(), 'pattern': None}, 'EndLines': {'data': OrderedDict(), @@ -64,14 +76,14 @@ 'pattern': None}, 'EndLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialLines': {'data': OrderedDict([(u'Ako ej', u'Ako je'), (u'ako ej', u'ako je'), (u'bez svesti', u'bez svijesti'), (u'Bi\u0107u uz', u'Bit \u0107u uz'), (u'bi ja', u'bih ja'), (u'bi la', u'bila'), (u'biti uredu', u'biti u redu'), (u'bi da bude', u'bi biti'), (u'Bi ste', u'Biste'), (u'bilo ko', u'bilo tko'), (u'\u0107e da do\u0111e', u'\u0107e do\u0107i'), (u'Da li \u0107emo', u'Ho\u0107emo li'), (u'da li \u0107u', u'ho\u0107u li'), (u'dali \u0107u', u'ho\u0107u li'), (u'Da li je', u'Je li'), (u'da li je', u'je li'), (u'Da li ste', u'Jeste li'), (u'Da li si', u'Jesi li'), (u'dali si', u'jesi li'), (u'da li \u0107e', u'ho\u0107e li'), (u'dali \u0107e', u'ho\u0107e li'), (u'do srede', u'do srijede'), (u'Dobro ve\u010de', u'Dobra ve\u010der'), (u'Dobro ve\u010der', u'Dobra ve\u010der'), (u'Dobar ve\u010der', u'Dobra ve\u010der'), (u'gdje ide\u0161', u'kamo ide\u0161'), (u'Gdje ide\u0161', u'Kamo ide\u0161'), (u'Gdje sada', u'Kamo sada'), (u'gle ko', u'gle tko'), (u'ho\u0107u da budem', u'\u017eelim biti'), (u'Ho\u0107u da budem', u'\u017delim biti'), (u'ho\u0107u da ka\u017eem', u'\u017eelim re\u0107i'), (u'ho\u0107e\u0161 da ka\u017ee\u0161', u'\u017eeli\u0161 re\u0107i'), (u'ho\u0107e da ka\u017ee', u'\u017eeli re\u0107i'), (u'Izvini se', u'Ispri\u010daj se'), (u'izvini se', u'ispri\u010daj se'), (u'Izvinite me', u'Ispri\u010dajte me'), (u'Izvinite nas', u'Ispri\u010dajte nas'), (u'izvinite nas', u'ispri\u010dajte nas'), (u'Izvinjavamo se', u'Ispri\u010davamo se'), (u'ja bi', u'ja bih'), (u'Ja bi', u'Ja bih'), (u'Jel sam ti', u'Jesam li ti'), (u'Jeli se', u'Je li se'), (u'Jeli sve', u'Je li sve'), (u'Jeli ti', u'Je li ti'), (u'ko je', u'tko je'), (u'ko zna', u'tko zna'), (u'moglo da bude', u'moglo biti'), (u'moje sau\u010de\u0161\u0107e', u'moja su\u0107ut'), (u'mora da bude', u'mora biti'), (u'Moram da idem', u'Moram i\u0107i'), (u'Moramo da idemo', u'Moramo i\u0107i'), (u'mora\u0161 da ide\u0161', u'mora\u0161 i\u0107i'), (u'na ve\u010der', u'nave\u010der'), (u'Na ve\u010der', u'Nave\u010der'), (u'neko ko', u'netko tko'), (u'nedjelju dana', u'tjedan dana'), (u'Ne mogu da verujem', u'Ne mogu vjerovati'), (u'od kako', u'otkako'), (u'Pla\u0161im se', u'Bojim se'), (u'pla\u0161im se', u'bojim se'), (u'pravo u o\u010di', u'ravno u o\u010di'), (u'sa njom', u's njom'), (u'sa tim', u's tim'), (u'sa tom', u's tom'), (u'sa tobom', u's tobom'), (u'Si dobro', u'Jesi li dobro'), (u'Svako ko', u'Svatko tko'), (u'Svo vreme', u'Sve vrijeme'), (u'Svo vrijeme', u'Sve vrijeme'), (u'smeo da', u'smio'), (u'smeli da', u'smjeli'), (u'\u0160to ej', u'\u0160to je'), (u'\u0161to ej', u'\u0161to je'), (u'to j', u'to je'), (u'to ej', u'to je'), (u'To ej', u'To je'), (u'tamo natrag', u'tamo iza'), (u'tamo je natrag', u'tamo je iza'), (u'Tamo je natrag', u'Tamo je iza'), (u'zato sto', u'zato \u0161to'), (u'zna ko', u'zna tko'), (u'znati ko', u'znati tko'), (u'\u017eelim da budem', u'\u017eelim biti'), (u'\u017delim da budem', u'\u017delim biti'), (u'\u017eeli\u0161 da bude\u0161', u'\u017eeli\u0161 biti'), (u'\u017eelim da odem', u'\u017eelim oti\u0107i'), (u'\u017eeli\u0161 da ode\u0161', u'\u017eeli\u0161 oti\u0107i'), (u'\u017eelim da znam', u'\u017eelim znati'), (u'\u017eeli\u0161 da zna\u0161', u'\u017eeli\u0161 znati')]), - 'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:Ako\\ ej|ako\\ ej|bez\\ svesti|Bi\\\u0107u\\ uz|bi\\ ja|bi\\ la|biti\\ uredu|bi\\ da\\ bude|Bi\\ ste|bilo\\ ko|\\\u0107e\\ da\\ do\\\u0111e|Da\\ li\\ \\\u0107emo|da\\ li\\ \\\u0107u|dali\\ \\\u0107u|Da\\ li\\ je|da\\ li\\ je|Da\\ li\\ ste|Da\\ li\\ si|dali\\ si|da\\ li\\ \\\u0107e|dali\\ \\\u0107e|do\\ srede|Dobro\\ ve\\\u010de|Dobro\\ ve\\\u010der|Dobar\\ ve\\\u010der|gdje\\ ide\\\u0161|Gdje\\ ide\\\u0161|Gdje\\ sada|gle\\ ko|ho\\\u0107u\\ da\\ budem|Ho\\\u0107u\\ da\\ budem|ho\\\u0107u\\ da\\ ka\\\u017eem|ho\\\u0107e\\\u0161\\ da\\ ka\\\u017ee\\\u0161|ho\\\u0107e\\ da\\ ka\\\u017ee|Izvini\\ se|izvini\\ se|Izvinite\\ me|Izvinite\\ nas|izvinite\\ nas|Izvinjavamo\\ se|ja\\ bi|Ja\\ bi|Jel\\ sam\\ ti|Jeli\\ se|Jeli\\ sve|Jeli\\ ti|ko\\ je|ko\\ zna|moglo\\ da\\ bude|moje\\ sau\\\u010de\\\u0161\\\u0107e|mora\\ da\\ bude|Moram\\ da\\ idem|Moramo\\ da\\ idemo|mora\\\u0161\\ da\\ ide\\\u0161|na\\ ve\\\u010der|Na\\ ve\\\u010der|neko\\ ko|nedjelju\\ dana|Ne\\ mogu\\ da\\ verujem|od\\ kako|Pla\\\u0161im\\ se|pla\\\u0161im\\ se|pravo\\ u\\ o\\\u010di|sa\\ njom|sa\\ tim|sa\\ tom|sa\\ tobom|Si\\ dobro|Svako\\ ko|Svo\\ vreme|Svo\\ vrijeme|smeo\\ da|smeli\\ da|\\\u0160to\\ ej|\\\u0161to\\ ej|to\\ j|to\\ ej|To\\ ej|tamo\\ natrag|tamo\\ je\\ natrag|Tamo\\ je\\ natrag|zato\\ sto|zna\\ ko|znati\\ ko|\\\u017eelim\\ da\\ budem|\\\u017delim\\ da\\ budem|\\\u017eeli\\\u0161\\ da\\ bude\\\u0161|\\\u017eelim\\ da\\ odem|\\\u017eeli\\\u0161\\ da\\ ode\\\u0161|\\\u017eelim\\ da\\ znam|\\\u017eeli\\\u0161\\ da\\ zna\\\u0161)(?:(?=\\s)|(?=$)|(?=\\b))'}, + 'PartialLines': {'data': OrderedDict([(u'Ako ej', u'Ako je'), (u'ako ej', u'ako je'), (u'bez svesti', u'bez svijesti'), (u'Bi\u0107u uz', u'Bit \u0107u uz'), (u'bi ja', u'bih ja'), (u'bi la', u'bila'), (u'biti uredu', u'biti u redu'), (u'bi da bude', u'bi biti'), (u'Bi ste', u'Biste'), (u'Bilo ko', u'Bilo tko'), (u'bilo ko', u'bilo tko'), (u'\u0107e da do\u0111e', u'\u0107e do\u0107i'), (u'Da li \u0107e', u'Ho\u0107e li'), (u'Da li \u0107emo', u'Ho\u0107emo li'), (u'Da li \u0107u', u'Ho\u0107u li'), (u'da li \u0107u', u'ho\u0107u li'), (u'dali \u0107u', u'ho\u0107u li'), (u'Da li je', u'Je li'), (u'da li je', u'je li'), (u'dali je', u'je li'), (u'Da li ste', u'Jeste li'), (u'Da li si', u'Jesi li'), (u'dali si', u'jesi li'), (u'da li \u0107e', u'ho\u0107e li'), (u'dali \u0107e', u'ho\u0107e li'), (u'do srede', u'do srijede'), (u'Dobro ve\u010de', u'Dobra ve\u010der'), (u'Dobro ve\u010der', u'Dobra ve\u010der'), (u'Dobar ve\u010der', u'Dobra ve\u010der'), (u'gdje ide\u0161', u'kamo ide\u0161'), (u'Gdje ide\u0161', u'Kamo ide\u0161'), (u'Gdje sada', u'Kamo sada'), (u'gle ko', u'gle tko'), (u'ho\u0107u da budem', u'\u017eelim biti'), (u'Ho\u0107u da budem', u'\u017delim biti'), (u'ho\u0107u da ka\u017eem', u'\u017eelim re\u0107i'), (u'ho\u0107e\u0161 da ka\u017ee\u0161', u'\u017eeli\u0161 re\u0107i'), (u'ho\u0107e da ka\u017ee', u'\u017eeli re\u0107i'), (u'ho\u0107u da \u017eivim', u'\u017eelim \u017eivjeti'), (u'Izvini se', u'Ispri\u010daj se'), (u'izvini se', u'ispri\u010daj se'), (u'Izvinite me', u'Ispri\u010dajte me'), (u'Izvinite nas', u'Ispri\u010dajte nas'), (u'izvinite nas', u'ispri\u010dajte nas'), (u'Izvinjavamo se', u'Ispri\u010davamo se'), (u'ja bi', u'ja bih'), (u'Ja bi', u'Ja bih'), (u'Jel sam ti', u'Jesam li ti'), (u'Jeli se', u'Je li se'), (u'Jeli sve', u'Je li sve'), (u'Jeli ti', u'Je li ti'), (u'ko je', u'tko je'), (u'ko si', u'tko si'), (u'ko ti je', u'tko ti je'), (u'ko te je', u'tko te je'), (u'ko zna', u'tko zna'), (u'mo\u0107i da idemo', u'mo\u0107i i\u0107i'), (u'moglo da bude', u'moglo biti'), (u'moje sau\u010de\u0161\u0107e', u'moja su\u0107ut'), (u'mora da bude', u'mora biti'), (u'moram da budem', u'moram biti'), (u'Moram da idem', u'Moram i\u0107i'), (u'moram da idem', u'moram i\u0107i'), (u'Mora\u0161 da ide\u0161', u'Mora\u0161 i\u0107i'), (u'Moramo da idemo', u'Moramo i\u0107i'), (u'moram da vidim', u'moram vidjeti'), (u'moram da zaboravim', u'moram zaboraviti'), (u'mora\u0161 da zaboravi\u0161', u'mora\u0161 zaboraviti'), (u'mora da zna', u'mora znati'), (u'moram da znam', u'moram znati'), (u'Moram da znam', u'Moram znati'), (u'mora\u0161 da zna\u0161', u'mora\u0161 znati'), (u'mora\u0161 da ide\u0161', u'mora\u0161 i\u0107i'), (u'mo\u017ee da bude', u'mo\u017ee biti'), (u'mo\u017ee\u0161 da bude\u0161', u'mo\u017ee\u0161 biti'), (u'mo\u017ee da di\u0161e', u'mo\u017ee disati'), (u'mo\u017ee\u0161 da dobije\u0161', u'mo\u017ee\u0161 dobiti'), (u'mo\u017eemo da imamo', u'mo\u017eemo imati'), (u'na ve\u010der', u'nave\u010der'), (u'Na ve\u010der', u'Nave\u010der'), (u'ne\u0107e da bude', u'ne\u0107e biti'), (u'ne\u0107e\u0161 da bude\u0161', u'ne\u0107e\u0161 biti'), (u'ne\u0107e\u0161 da po\u017eali\u0161', u'ne\u0107e\u0161 po\u017ealiti'), (u'Neko ko', u'Netko tko'), (u'neko ko', u'netko tko'), (u'neko ne\u0161to', u'netko ne\u0161to'), (u'nedjelju dana', u'tjedan dana'), (u'Ne mogu da verujem', u'Ne mogu vjerovati'), (u'new yor\u0161ki', u'njujor\u0161ki'), (u'nju jor\u0161ki', u'njujor\u0161ki'), (u'od kako', u'otkako'), (u'Pla\u0161im se', u'Bojim se'), (u'pla\u0161im se', u'bojim se'), (u'pravo u o\u010di', u'ravno u o\u010di'), (u'sa njim', u's njim'), (u'sa njima', u's njima'), (u'sa njom', u's njom'), (u'sa tim', u's tim'), (u'sa tom', u's tom'), (u'sa tobom', u's tobom'), (u'sa vama', u's vama'), (u'sam da budem', u'sam biti'), (u'si\u0107i dolje', u'si\u0107i'), (u'Si dobro', u'Jesi li dobro'), (u'Svako ko', u'Svatko tko'), (u'Svo vreme', u'Sve vrijeme'), (u'Svo vrijeme', u'Sve vrijeme'), (u'smeo da', u'smio'), (u'smeli da', u'smjeli'), (u'\u0160to ej', u'\u0160to je'), (u'\u0161to ej', u'\u0161to je'), (u'to j', u'to je'), (u'to ej', u'to je'), (u'To ej', u'To je'), (u'tamo natrag', u'tamo iza'), (u'tamo je natrag', u'tamo je iza'), (u'Tamo je natrag', u'Tamo je iza'), (u'treba da bude', u'treba biti'), (u'u jutro', u'ujutro'), (u'u\u0107i unutra', u'u\u0107i'), (u'vas je lagao', u'vam je lagao'), (u'za uvijek', u'zauvijek'), (u'zato sto', u'zato \u0161to'), (u'zna da bude', u'zna biti'), (u'zna ko', u'zna tko'), (u'znati ko', u'znati tko'), (u'\u017eele da budu', u'\u017eele biti'), (u'\u017eeli da bude', u'\u017eeli biti'), (u'\u017eelio da budem', u'\u017eelio biti'), (u'\u017eelim da budem', u'\u017eelim biti'), (u'\u017delim da budem', u'\u017delim biti'), (u'\u017eeli\u0161 da bude\u0161', u'\u017eeli\u0161 biti'), (u'\u017eelim da idem', u'\u017eelim i\u0107i'), (u'\u017eelim da odem', u'\u017eelim oti\u0107i'), (u'\u017eeli\u0161 da ode\u0161', u'\u017eeli\u0161 oti\u0107i'), (u'\u017eeli\u0161 da u\u0111e\u0161', u'\u017eeli\u0161 u\u0107i'), (u'\u017eelim da umrem', u'\u017eelim umrijeti'), (u'\u017delim da znam', u'\u017delim znati'), (u'\u017eelim da znam', u'\u017eelim znati'), (u'\u017eeli\u0161 da zna\u0161', u'\u017eeli\u0161 znati')]), + 'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:Ako\\ ej|ako\\ ej|bez\\ svesti|Bi\\\u0107u\\ uz|bi\\ ja|bi\\ la|biti\\ uredu|bi\\ da\\ bude|Bi\\ ste|Bilo\\ ko|bilo\\ ko|\\\u0107e\\ da\\ do\\\u0111e|Da\\ li\\ \\\u0107e|Da\\ li\\ \\\u0107emo|Da\\ li\\ \\\u0107u|da\\ li\\ \\\u0107u|dali\\ \\\u0107u|Da\\ li\\ je|da\\ li\\ je|dali\\ je|Da\\ li\\ ste|Da\\ li\\ si|dali\\ si|da\\ li\\ \\\u0107e|dali\\ \\\u0107e|do\\ srede|Dobro\\ ve\\\u010de|Dobro\\ ve\\\u010der|Dobar\\ ve\\\u010der|gdje\\ ide\\\u0161|Gdje\\ ide\\\u0161|Gdje\\ sada|gle\\ ko|ho\\\u0107u\\ da\\ budem|Ho\\\u0107u\\ da\\ budem|ho\\\u0107u\\ da\\ ka\\\u017eem|ho\\\u0107e\\\u0161\\ da\\ ka\\\u017ee\\\u0161|ho\\\u0107e\\ da\\ ka\\\u017ee|ho\\\u0107u\\ da\\ \\\u017eivim|Izvini\\ se|izvini\\ se|Izvinite\\ me|Izvinite\\ nas|izvinite\\ nas|Izvinjavamo\\ se|ja\\ bi|Ja\\ bi|Jel\\ sam\\ ti|Jeli\\ se|Jeli\\ sve|Jeli\\ ti|ko\\ je|ko\\ si|ko\\ ti\\ je|ko\\ te\\ je|ko\\ zna|mo\\\u0107i\\ da\\ idemo|moglo\\ da\\ bude|moje\\ sau\\\u010de\\\u0161\\\u0107e|mora\\ da\\ bude|moram\\ da\\ budem|Moram\\ da\\ idem|moram\\ da\\ idem|Mora\\\u0161\\ da\\ ide\\\u0161|Moramo\\ da\\ idemo|moram\\ da\\ vidim|moram\\ da\\ zaboravim|mora\\\u0161\\ da\\ zaboravi\\\u0161|mora\\ da\\ zna|moram\\ da\\ znam|Moram\\ da\\ znam|mora\\\u0161\\ da\\ zna\\\u0161|mora\\\u0161\\ da\\ ide\\\u0161|mo\\\u017ee\\ da\\ bude|mo\\\u017ee\\\u0161\\ da\\ bude\\\u0161|mo\\\u017ee\\ da\\ di\\\u0161e|mo\\\u017ee\\\u0161\\ da\\ dobije\\\u0161|mo\\\u017eemo\\ da\\ imamo|na\\ ve\\\u010der|Na\\ ve\\\u010der|ne\\\u0107e\\ da\\ bude|ne\\\u0107e\\\u0161\\ da\\ bude\\\u0161|ne\\\u0107e\\\u0161\\ da\\ po\\\u017eali\\\u0161|Neko\\ ko|neko\\ ko|neko\\ ne\\\u0161to|nedjelju\\ dana|Ne\\ mogu\\ da\\ verujem|new\\ yor\\\u0161ki|nju\\ jor\\\u0161ki|od\\ kako|Pla\\\u0161im\\ se|pla\\\u0161im\\ se|pravo\\ u\\ o\\\u010di|sa\\ njim|sa\\ njima|sa\\ njom|sa\\ tim|sa\\ tom|sa\\ tobom|sa\\ vama|sam\\ da\\ budem|si\\\u0107i\\ dolje|Si\\ dobro|Svako\\ ko|Svo\\ vreme|Svo\\ vrijeme|smeo\\ da|smeli\\ da|\\\u0160to\\ ej|\\\u0161to\\ ej|to\\ j|to\\ ej|To\\ ej|tamo\\ natrag|tamo\\ je\\ natrag|Tamo\\ je\\ natrag|treba\\ da\\ bude|u\\ jutro|u\\\u0107i\\ unutra|vas\\ je\\ lagao|za\\ uvijek|zato\\ sto|zna\\ da\\ bude|zna\\ ko|znati\\ ko|\\\u017eele\\ da\\ budu|\\\u017eeli\\ da\\ bude|\\\u017eelio\\ da\\ budem|\\\u017eelim\\ da\\ budem|\\\u017delim\\ da\\ budem|\\\u017eeli\\\u0161\\ da\\ bude\\\u0161|\\\u017eelim\\ da\\ idem|\\\u017eelim\\ da\\ odem|\\\u017eeli\\\u0161\\ da\\ ode\\\u0161|\\\u017eeli\\\u0161\\ da\\ u\\\u0111e\\\u0161|\\\u017eelim\\ da\\ umrem|\\\u017delim\\ da\\ znam|\\\u017eelim\\ da\\ znam|\\\u017eeli\\\u0161\\ da\\ zna\\\u0161)(?:(?=\\s)|(?=$)|(?=\\b))'}, 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, - 'WholeWords': {'data': OrderedDict([(u'advokati', u'odvjetnici'), (u'Advokati', u'Odvjetnici'), (u'advokatima', u'odvjetnicima'), (u'Advokatima', u'Odvjetnicima'), (u'afirmi\u0161e', u'afirmira'), (u'akcenat', u'naglasak'), (u'akcionara', u'dioni\u010dara'), (u'amin', u'amen'), (u'Amin', u'Amen'), (u'azot', u'du\u0161ik'), (u'ba\u0161ta', u'vrt'), (u'Ba\u0161ta', u'Vrt'), (u'ba\u0161te', u'vrtovi'), (u'Ba\u0161te', u'Vrtovi'), (u'ba\u0161ti', u'vrtu'), (u'ba\u0161tu', u'vrt'), (u'Ba\u0161tu', u'Vrt'), (u'ba\u0161tom', u'vrtom'), (u'bedan', u'bijedan'), (u'bede', u'bijede'), (u'bedi', u'bijedi'), (u'bejah', u'bijah'), (u'bele\u0161ci', u'bilje\u0161ci'), (u'be\u0161ike', u'mjehure'), (u'bimso', u'bismo'), (u'bioskop', u'kino'), (u'bioskopi', u'kina'), (u'bitci', u'bitki'), (u'blije\u0111i', u'blje\u0111i'), (u'beg', u'bijeg'), (u'begu', u'bijegu'), (u'beja\u0161e', u'bija\u0161e'), (u'bekstvo', u'bijeg'), (u'bekstvu', u'bijegu'), (u'begstvu', u'bijegu'), (u'bes', u'bijes'), (u'besa', u'bijesa'), (u'besan', u'bijesan'), (u'besom', u'bijesom'), (u'besu', u'bijesu'), (u'be\u0161e', u'bje\u0161e'), (u'bioje', u'bio je'), (u'bi smo', u'bismo'), (u'bi ste', u'biste'), (u'bled', u'blijed'), (u'blede', u'blijede'), (u'boksuje\u0161', u'boksa\u0161'), (u'bolesan', u'bolestan'), (u'braon', u'sme\u0111a'), (u'bregu', u'brijegu'), (u'bti', u'biti'), (u'cedilu', u'cjedilu'), (u'ceo', u'cijeli'), (u'Ceo', u'Cijeli'), (u'cepa', u'cijepa'), (u'cev', u'cijev'), (u'cevi', u'cijevi'), (u'cev\u010dica', u'cjev\u010dica'), (u'cev\u010dicu', u'cjev\u010dicu'), (u'cvetu', u'cvijetu'), (u'cvjetu', u'cvijetu'), (u'cvetalo', u'cvjetalo'), (u'cvjetom', u'cvijetom'), (u'\u010cakom', u'Chuckom'), (u'\u010dar\u0161av', u'plahta'), (u'\u010dar\u0161ave', u'plahte'), (u'\u010dar\u0161avima', u'plahtama'), (u'\u010das', u'sat'), (u'\u010detvoro', u'\u010detvero'), (u'\u010cita\u0107u', u'\u010citat \u0107u'), (u'\u010derku', u'k\u0107er'), (u'\u010cerku', u'K\u0107er'), (u'\u0107erku', u'k\u0107er'), (u'\u0106erku', u'K\u0107er'), (u'\u0107erkama', u'k\u0107erima'), (u'\u010derkama', u'k\u0107erima'), (u'\u0107erkom', u'k\u0107eri'), (u'\u010derkom', u'k\u0107eri'), (u'k\u0107erkom', u'k\u0107eri'), (u'k\u010derkom', u'k\u0107eri'), (u'\u0107ebe', u'deku'), (u'\u0107ebetu', u'deki'), (u'\u010dk', u'\u010dak'), (u'\u0107\u0161', u'\u0107e\u0161'), (u'\u0107ale', u'tata'), (u'\u0107aletom', u'ocem'), (u'\u0107aleta', u'oca'), (u'\u0107aletu', u'ocu'), (u'\u0107orsokak', u'slijepa ulica'), (u'\u0107orsokaku', u'slijepoj ulici'), (u'\u0107o\u0161ak', u'ugao'), (u'\u0107o\u0161ku', u'uglu'), (u'\u0107erka', u'k\u0107i'), (u'\u0106erka', u'K\u0107i'), (u'\u0107mo', u'\u0107emo'), (u'\u0107te', u'\u0107ete'), (u'\u010du\u0107e', u'\u010dut \u0107e'), (u'\u010du\u0107emo', u'\u010dut \u0107emo'), (u'\u010cu\u0107emo', u'\u010cut \u0107emo'), (u'\u010cu\u0107ete', u'\u010cut \u0107ete'), (u'\u010cu\u0107e', u'\u010cut \u0107e'), (u'\u0107utao', u'\u0161utio'), (u'\u0106utao', u'\u0160utio'), (u'cvetova', u'cvjetova'), (u'daga', u'da ga'), (u'damas', u'danas'), (u'deda', u'djed'), (u'Deda', u'Djed'), (u'dede', u'djeda'), (u'dedi', u'djedu'), (u'dedom', u'djedom'), (u'defini\u0161e', u'definira'), (u'dele\u0107i', u'dijele\u0107i'), (u'deo', u'dio'), (u'Deo', u'Dio'), (u'de\u0161ava', u'doga\u0111a'), (u'dete', u'dijete'), (u'diluje', u'dila'), (u'diluju', u'dilaju'), (u'djete', u'dijete'), (u'Dete', u'Dijete'), (u'Djete', u'Dijete'), (u'detektuje', u'detektira'), (u'dodju', u'do\u0111u'), (u'dole', u'dolje'), (u'Dole', u'Dolje'), (u'Donije\u0107u', u'Donijet \u0107u'), (u'do ovde', u'dovde'), (u'dospeo', u'dospio'), (u'dospeju', u'dospiju'), (u'do\u0111avola', u'dovraga'), (u'Do\u0111avola', u'Dovraga'), (u'drug', u'prijatelj'), (u'drugde', u'drugdje'), (u'duuga', u'd\xfaga'), (u'duvana', u'duhana'), (u'dve', u'dvije'), (u'Dve', u'Dvije'), (u'dvema', u'dvjema'), (u'\u0111avo', u'vrag'), (u'\u0111avola', u'vraga'), (u'\u0111emper', u'd\u017eemper'), (u'd\u017eanki', u'ovisnik'), (u'd\u017eelat', u'krvnik'), (u'\u0111ubre', u'sme\u0107e'), (u'eksperata', u'stru\u010dnjaka'), (u'eksperti', u'stru\u010dnjaci'), (u'Eksperti', u'Stru\u010dnjaci'), (u'ekspertima', u'stru\u010dnjacima'), (u'en', u'ne'), (u'emitovao', u'emitirao'), (u'emitovati', u'emitirati'), (u'emituje', u'emitira'), (u'emitujem', u'emitiram'), (u'emituju', u'emitiraju'), (u'familijama', u'obiteljima'), (u'familiji', u'obitelji'), (u'flertuje', u'o\u010dijuka'), (u'foka', u'tuljan'), (u'foku', u'tuljana'), (u'foke', u'tuljani'), (u'fokama', u'tuljanima'), (u'fotografi\u0161u', u'fotografiraju'), (u'gde', u'gdje'), (u'Gde', u'Gdje'), (u'gluhonem', u'gluhonijem'), (u'gre\u0161e', u'grije\u0161e'), (u'gre\u0161ki', u'gre\u0161ci'), (u'grijehova', u'grijeha'), (u'hipnoti\u0161e', u'hipnotizira'), (u'Historija', u'Povijest'), (u'Historiju', u'Povijest'), (u'Historije', u'Povijesti'), (u'Historiji', u'Povijesti'), (u'Istorija', u'Povijest'), (u'Istoriju', u'Povijest'), (u'Istorije', u'Povijesti'), (u'Istoriji', u'Povijesti'), (u'historije', u'povijesti'), (u'historiji', u'povijesti'), (u'istorije', u'povijesti'), (u'istoriji', u'povijesti'), (u'istorijom', u'povije\u0161\u0107u'), (u'ho\u010du', u'ho\u0107u'), (u'Ho\u010du', u'Ho\u0107u'), (u'hte\u0107e', u'htjet \u0107e'), (u'htedoh', u'htjedoh'), (u'i\u010di', u'i\u0107i'), (u'I\u010di', u'I\u0107i'), (u'iko', u'itko'), (u'ignori\u0161i', u'ignoriraj'), (u'Ignori\u0161i', u'Ignoriraj'), (u'ignori\u0161ite', u'ignorirajte'), (u'Ignori\u0161ite', u'Ignorirajte'), (u'ignori\u0161u', u'ignoriraju'), (u'ilustruju', u'ilustriraju'), (u'informi\u0161e', u'informira'), (u'informi\u0161u', u'informiraju'), (u'inspirisao', u'inspirirao'), (u'interesuje', u'zanima'), (u'Interesuje', u'Zanima'), (u'Interesuju', u'Zanimaju'), (u'interesuju', u'zanimaju'), (u'isekao', u'izrezao'), (u'isterao', u'istjerao'), (u'istera\u0161', u'istjera\u0161'), (u'Istera\u0161', u'Istjera\u0161'), (u'isuvi\u0161e', u'previ\u0161e'), (u'ivica', u'rub'), (u'ivice', u'ruba'), (u'ivici', u'rubu'), (u'ivicu', u'rub'), (u'Izolujete', u'Izolirate'), (u'Izolujte', u'Izolirajte'), (u'izgladneo', u'izgladnio'), (u'izmeriti', u'izmjeriti'), (u'izmerio', u'izmjerio'), (u'izneo', u'iznio'), (u'izolujte', u'izolirajte'), (u'izneti', u'iznijeti'), (u'izvestan', u'izvjestan'), (u'izvinim', u'ispri\u010dam'), (u'izvini\u0161', u'ispri\u010da\u0161'), (u'izviniti', u'ispri\u010dati'), (u'izvinjenje', u'isprika'), (u'izvinjenja', u'isprike'), (u'izvinjenju', u'isprici'), (u'jedamput', u'jedanput'), (u'jelda', u"jel' da"), (u'Je\u0161\u0107emo', u'Jest \u0107emo'), (u'ju\u010de', u'ju\u010der'), (u'Ju\u010de', u'Ju\u010der'), (u'kakava', u'kakva'), (u'kampuje', u'kampira'), (u'kampujemo', u'kampiramo'), (u'kampuju', u'kampiraju'), (u'kancelariji', u'uredu'), (u'kancelarijom', u'uredom'), (u'kancera', u'raka'), (u'kandidovati', u'kandidirati'), (u'kandidujem', u'kandidiram'), (u'karmin', u'ru\u017e'), (u'karminom', u'ru\u017eem'), (u'k\u0107erci', u'k\u0107eri'), (u'k\u0107erka', u'k\u0107i'), (u'k\u010derka', u'k\u0107i'), (u'K\u0107erka', u'K\u0107i'), (u'K\u010derka', u'K\u0107i'), (u'k\u0107erkama', u'k\u0107erima'), (u'ker', u'pas'), (u'Ker', u'Pas'), (u'kerova', u'pasa'), (u'kidnapovan', u'otet'), (u'Kidnapovan', u'Otet'), (u'kiji', u'koji'), (u'kijim', u'kojim'), (u'klasifikuju', u'klasificiraju'), (u'Ko', u'Tko'), (u'koa', u'kao'), (u'koaj', u'koja'), (u'kola', u'auto'), (u'kolima', u'autu'), (u'komandni', u'zapovjedni'), (u'kombinuju', u'kombiniraju'), (u'kompanija', u'tvrtka'), (u'kom\u0161ija', u'susjed'), (u'kom\u0161iji', u'susjedu'), (u'kom\u0161iju', u'susjeda'), (u'kom\u0161iluk', u'susjedstvo'), (u'kom\u0161iluka', u'susjedstva'), (u'kom\u0161iluku', u'susjedstvu'), (u'kom\u0161ije', u'susjedi'), (u'kom\u0161ijama', u'susjedima'), (u'kontroli\u0161u', u'kontroliraju'), (u'Kontroli\u0161u', u'Kontroliraju'), (u'Kontroli\u0161i', u'Kontroliraj'), (u'kontroli\u0161i', u'kontroliraj'), (u'Kontroli\u0161ite', u'Kontrolirajte'), (u'kontroli\u0161ite', u'kontrolirajte'), (u'korpu', u'ko\u0161aru'), (u'kritikuju', u'kritiziraju'), (u'krsta', u'kri\u017ea'), (u'krstu', u'kri\u017eu'), (u'krsti\u0107a', u'kri\u017ei\u0107a'), (u'krsti\u0107u', u'kri\u017ei\u0107u'), (u'Krsta', u'Kri\u017ea'), (u'Krstu', u'Kri\u017eu'), (u'Krsti\u0107a', u'Kri\u017ei\u0107a'), (u'Krsti\u0107u', u'Kri\u017ei\u0107u'), (u'krstom', u'kri\u017eem'), (u'krstove', u'kri\u017eeve'), (u'Krstove', u'Kri\u017eeve'), (u'krstovima', u'kri\u017eevima'), (u'Krstovima', u'Kri\u017eevima'), (u'kri\u017eom', u'kri\u017eem'), (u'kupatilo', u'kupaona'), (u'kupatilu', u'kupaoni'), (u'kvalifikuju', u'kvalificiraju'), (u'la\u017eeju', u'la\u017eu'), (u'la\u017eov', u'la\u017eljivac'), (u'la\u017eovi', u'la\u017eljivci'), (u'la\u017eovu', u'la\u017eljivcu'), (u'la\u017eovima', u'la\u017eljivcima'), (u'la\u017eovom', u'la\u017eljivcem'), (u'lebdeo', u'lebdio'), (u'le\u010di', u'lije\u010di'), (u'le\u010de', u'lije\u010de'), (u'lje\u010di', u'lije\u010di'), (u'Le\u010di', u'Lije\u010di'), (u'Lje\u010di', u'Lije\u010di'), (u'Lejn', u'Lane'), (u'Lenja', u'Lijena'), (u'lenji', u'lijeni'), (u'lenja', u'lijena'), (u'le\u0161nik', u'lje\u0161njak'), (u'Leta', u'Ljeta'), (u'leto', u'ljeto'), (u'letiti', u'letjeti'), (u'leve', u'lijeve'), (u'lo\u017ei', u'pali'), (u'lza', u'Iza'), (u'majca', u'majica'), (u'majce', u'majice'), (u'majcu', u'majicu'), (u'majcom', u'majicom'), (u'Malopre', u'Malo prije'), (u'malopre', u'malo prije'), (u'maloprije', u'malo prije'), (u'manifestuje', u'manifestira'), (u'Mek', u'Mac'), (u'mehur', u'mjehur'), (u'menom', u'mnom'), (u'mera\u010d', u'mjera\u010d'), (u'meri', u'mjeri'), (u'mere', u'mjere'), (u'merdevine', u'ljestve'), (u'merdevinama', u'ljestvama'), (u'me\u0161ane', u'mije\u0161ane'), (u'me\u0161avina', u'mje\u0161avina'), (u'me\u0161avine', u'mje\u0161avine'), (u'me\u0161avinu', u'mje\u0161avinu'), (u'me\u0161tana', u'mje\u0161tana'), (u'minut', u'minutu'), (u'mo\u010d', u'mo\u0107'), (u'mofu', u'mogu'), (u'momenat', u'trenutak'), (u'muzejem', u'muzejom'), (u'muzici', u'glazbi'), (u'na\u010di', u'na\u0107i'), (u'naduvan', u'napu\u0161en'), (u'najpre', u'najprije'), (u'Najpre', u'Najprije'), (u'najzad', u'napokon'), (u'nanev\u0161i', u'nanjev\u0161i'), (u'napastvuje', u'napastuje'), (u'Napolje', u'Van'), (u'napolje', u'van'), (u'Napolju', u'Vani'), (u'napolju', u'vani'), (u'nauka', u'znanost'), (u'Nauka', u'Znanost'), (u'nauci', u'znanosti'), (u'nazad', u'natrag'), (u'Nazad', u'Natrag'), (u'napred', u'naprijed'), (u'Napred', u'Naprijed'), (u'naprimjer', u'na primjer'), (u'naseo', u'nasjeo'), (u'nasme\u0161i', u'nasmije\u0161i'), (u'nasre\u0107u', u'na sre\u0107u'), (u'nebi', u'ne bi'), (u'nebih', u'ne bih'), (u'Nebi', u'Ne bi'), (u'Nebih', u'Ne bih'), (u'nebismo', u'ne bismo'), (u'Nebismo', u'Ne bismo'), (u'nebiste', u'ne biste'), (u'Nebiste', u'Ne biste'), (u'nedaj', u'ne daj'), (u'negde', u'negdje'), (u'Negde', u'Negdje'), (u'neguje', u'njeguje'), (u'neguju', u'njeguju'), (u'nekto', u'netko'), (u'nemi', u'nijemi'), (u'nemrem', u'ne mogu'), (u'nemogu', u'ne mogu'), (u'Nemogu', u'Ne mogu'), (u'nemora', u'ne mora'), (u'Nemora', u'Ne mora'), (u'nene', u'njene'), (u'ne\u0161o', u'ne\u0161to'), (u'nevreme', u'nevrijeme'), (u'nezi', u'njezi'), (u'nigde', u'nigdje'), (u'Nigde', u'Nigdje'), (u'niko', u'nitko'), (u'Niko', u'Nitko'), (u'nisma', u'nisam'), (u'Nisma', u'Nisam'), (u'ne\u0107\u0161', u'ne\u0107e\u0161'), (u'nejde', u'ne ide'), (u'neda', u'ne da'), (u'nedam', u'ne dam'), (u'new yor\u0161ki', u'njujor\u0161ki'), (u'nju jor\u0161ki', u'njujor\u0161ki'), (u'njegi', u'njezi'), (u'ne\u017eeli', u'ne \u017eeli'), (u'niej', u'nije'), (u'njie', u'nije'), (u'njem', u'nijem'), (u'njeme', u'njene'), (u'nsiam', u'nisam'), (u'nteko', u'netko'), (u'obe', u'obje'), (u'Obe', u'Obje'), (u'obema', u'objema'), (u'Obezbe\u0111uju', u'Osiguravaju'), (u'obezbe\u0111uju', u'osiguravaju'), (u'objekat', u'objekt'), (u'oblast', u'podru\u010dje'), (u'oblastima', u'podru\u010djima'), (u'oblasti', u'podru\u010dj*'), (u'obolelu', u'oboljelu'), (u'obo\u017eavalac', u'obo\u017eavatelj'), (u'obu\u010di', u'obu\u0107i'), (u'obuhvata', u'obuhva\u0107a'), (u'odandje', u'odande'), (u'odavdje', u'odavde'), (u'odela', u'odjela'), (u'odelu', u'odjelu'), (u'odelenje', u'odjel'), (u'odelenju', u'odjelu'), (u'odeljak', u'odjeljak'), (u'odeljenje', u'odjel'), (u'Odeljenje', u'Odjel'), (u'odjeljenje', u'odjel'), (u'Odjeljenje', u'Odjel'), (u'odeljenjem', u'odjelom'), (u'odma', u'odmah'), (u'Odne\u0107u', u'Odnijet \u0107u'), (u'odne\u0107u', u'odnijet \u0107u'), (u'odne\u0107e', u'odnijet \u0107e'), (u'odoliti', u'odoljeti'), (u'odneti', u'odnijeti'), (u'odprilike', u'otprilike'), (u'odseo', u'odsjeo'), (u'odsela', u'odsjela'), (u'odsesti', u'odsjesti'), (u'odupreti', u'oduprijeti'), (u'ogladneo', u'ogladnio'), (u'organizuju', u'organiziraju'), (u'Organizuju', u'Organiziraju'), (u'osje\u0107anja', u'osje\u0107aje'), (u'osmehe', u'osmijehe'), (u'osmehne', u'osmjehne'), (u'osobenosti', u'osobnosti'), (u'ostrva', u'otoka'), (u'ostrvu', u'otoku'), (u'ostrvom', u'otokom'), (u'Ostrva', u'Otoka'), (u'Ostrvu', u'Otoku'), (u'Ostrvom', u'Otokom'), (u'ostrvima', u'otocima'), (u'osete', u'osjete'), (u'ostrvo', u'otok'), (u'Ostrvo', u'Otok'), (u'ovde', u'ovdje'), (u'Ovde', u'Ovdje'), (u'ovdije', u'ovdje'), (u'Ovdije', u'Ovdje'), (u'ovjde', u'ovdje'), (u'Ovjde', u'Ovdje'), (u'palatama', u'pala\u010dama'), (u'palate', u'pala\u010de'), (u'palatu', u'pala\u010du'), (u'palati', u'pala\u010di'), (u'pantalone', u'hla\u010de'), (u'Pantalone', u'Hla\u010de'), (u'pantalona', u'hla\u010da'), (u'pantalonama', u'hla\u010dama'), (u'par\u010de', u'komadi\u0107'), (u'par\u010deta', u'komadi\u0107a'), (u'par\u010detom', u'komadi\u0107em'), (u'parampar\u010dad', u'komadi\u0107i'), (u'pd', u'od'), (u'pemzija', u'penzija'), (u'pemziju', u'penziju'), (u'penzionerski', u'umirovljeni\u010dki'), (u'Penzionerski', u'Umirovljeni\u010dki'), (u'pertle', u'\u017enirance'), (u'pesama', u'pjesama'), (u'pesnicima', u'pjesnicima'), (u'pe\u0161ice', u'pje\u0161ice'), (u'Pe\u0161ice', u'Pje\u0161ice'), (u'plata', u'pla\u0107a'), (u'pla\u010da', u'pla\u0107a'), (u'platu', u'pla\u0107u'), (u'pla\u010danje', u'pla\u0107anje'), (u'pla\u010danjem', u'pla\u0107anjem'), (u'pla\u0107e\u0161', u'pla\u010de\u0161'), (u'po\u010de\u0107u', u'po\u010det \u0107u'), (u'podjelimo', u'podijelimo'), (u'podnesti', u'podnijeti'), (u'podstreka\u010d', u'poticatelj'), (u'podsete', u'podsjete'), (u'poen', u'bod'), (u'poena', u'boda'), (u'poene', u'bodove'), (u'poeni', u'bodovi'), (u'Poeni', u'Bodovi'), (u'poenima', u'bodovima'), (u'poludili', u'poludjeli'), (u'poma\u0107i', u'pomaknuti'), (u'pomaknim', u'pomaknem'), (u'pomaknio', u'pomaknuo'), (u'pomakniti', u'pomaknuti'), (u'pomenu', u'spomenu'), (u'Pomera', u'Mi\u010de'), (u'pomera', u'mi\u010de'), (u'pomerajte', u'mi\u010dite'), (u'pomjeri', u'pomakni'), (u'pomeraj', u'mi\u010di'), (u'pomjeraj', u'mi\u010di'), (u'pomeraju', u'mi\u010du'), (u'pomerala', u'micala'), (u'pomeranja', u'pomicanja'), (u'pomerati', u'micati'), (u'pomjerati', u'pomicati'), (u'pomeri\u0161', u'pomakne\u0161'), (u'ponaosob', u'osobno'), (u'ponesla', u'ponijela'), (u'Ponesla', u'Ponijela'), (u'pore\u0111enje', u'usporedba'), (u'pore\u0111enju', u'usporedbi'), (u'porekla', u'podrijetla'), (u'poreklo', u'podrijetlo'), (u'poreklu', u'podrijetlu'), (u'Porodica', u'Obitelj'), (u'Porodice', u'Obitelji'), (u'porodica', u'obitelj'), (u'porodice', u'obitelji'), (u'porodici', u'obitelji'), (u'porodicama', u'obiteljima'), (u'porodicom', u'obitelji'), (u'porodicu', u'obitelj'), (u'posle', u'poslije'), (u'Posle', u'Poslije'), (u'poslje', u'poslije'), (u'postara', u'pobrine'), (u'Postara\u0107u', u'Pobrinut \u0107u'), (u'postara\u0107u', u'pobrinut \u0107u'), (u'postaraj', u'pobrini'), (u'Postaraj', u'Pobrini'), (u'Postaraju', u'Pobrinu'), (u'postaraju', u'pobrinu'), (u'postarajmo', u'pobrinimo'), (u'postaramo', u'pobrinemo'), (u'postara\u0161', u'pobrine\u0161'), (u'povesne', u'povijesne'), (u'Povinuju', u'Pokoravaju'), (u'povinuju', u'pokoravaju'), (u'pozadi', u'iza'), (u'praktikuj', u'prakticiraj'), (u'praktikuju', u'prakticiraju'), (u'praktikovala', u'prakticirala'), (u'praktikovati', u'prakticirati'), (u'pre', u'prije'), (u'Pre', u'Prije'), (u'Pre\u0107i', u'Prije\u0107i'), (u'pre\u0107i', u'prije\u0107i'), (u'predame', u'preda me'), (u'predelu', u'predjelu'), (u'preformuli\u0161i', u'preformuliraj'), (u'preklo', u'porijeklo'), (u'preloma', u'prijeloma'), (u'Prene\u0107u', u'Prenijet \u0107u'), (u'prene\u0107u', u'prenijet \u0107u'), (u'prenos', u'prijenos'), (u'prenosa', u'prijenosa'), (u'prenosom', u'prijenosom'), (u'prenosu', u'prijenosu'), (u'preneo', u'prenio'), (u'prenela', u'prenijela'), (u'prenjela', u'prenijela'), (u'preneli', u'prenijeli'), (u'prenjeli', u'prenijeli'), (u'preneti', u'prenijeti'), (u'preporu\u010da', u'preporu\u010duje'), (u'prese\u0107i', u'presje\u0107i'), (u'preti', u'prijeti'), (u'prete\u0107im', u'prijete\u0107im'), (u'prete\u0107ih', u'prijete\u0107ih'), (u'pretrpeo', u'pretrpio'), (u'prevod', u'prijevod'), (u'Prevod', u'Prijevod'), (u'prezentovati', u'prezentirati'), (u'pridonjeti', u'pridonijeti'), (u'prijatan', u'ugodan'), (u'primedbi', u'primjedbi'), (u'primjete', u'primijete'), (u'prisetim', u'prisjetim'), (u'pritiskam', u'priti\u0161\u0107em'), (u'prmda', u'iako'), (u'procenat', u'postotak'), (u'procent', u'postotak'), (u'procenata', u'postotaka'), (u'procenti', u'postoci'), (u'Procenti', u'Postoci'), (u'procente', u'postotke'), (u'Procente', u'Postotke'), (u'procentu', u'postotku'), (u'Procentu', u'Postotku'), (u'procentima', u'postocima'), (u'prodato', u'prodano'), (u'prohte', u'prohtije'), (u'projekat', u'projekt'), (u'Projekat', u'Projekt'), (u'promijena', u'promjena'), (u'protestvovat', u'protestirat'), (u'Protestvovat', u'Protestirat'), (u'Protestvujem', u'Protestiram'), (u'protestvujem', u'protestiram'), (u'protestvuju', u'protestiraju'), (u'protestuju\u0107i', u'protestiraju\u0107i'), (u'psihi\u0107ki', u'psihi\u010dki'), (u'ra\u010dunari', u'ra\u010dunala'), (u'ra\u010dunare', u'ra\u010dunala'), (u'radijo', u'radio'), (u'ra\u0111e', u'radije'), (u'ranac', u'ruksak'), (u'rancu', u'ruksaku'), (u'rascep', u'rascjep'), (u'rasejan', u'rastresen'), (u'rasejana', u'rastresena'), (u'raspust', u'odmor'), (u'razdevi\u010de', u'razdjevi\u010de'), (u'razgovrati', u'razgovarati'), (u'razre\u0161i', u'razrije\u0161i'), (u'razume', u'razumije'), (u'razumeju', u'razumiju'), (u're\u0111e', u'rje\u0111e'), (u'rejv', u'rave'), (u'rejvu', u'raveu'), (u'reko', u'rekao'), (u'rengen', u'rendgen'), (u'repuje\u0161', u'repa\u0161'), (u'resetuje', u'resetira'), (u'resetujte', u'resetirajte'), (u'Resetujte', u'Resetirajte'), (u'rije\u0111i', u'rje\u0111i'), (u'Rizikuj', u'Riskiraj'), (u'rokenrol', u"rock'n'roll"), (u'ronioc', u'ronilac'), (u'savije\u0161\u0107u', u'savje\u0161\u0107u'), (u'save\u0161\u0107u', u'savje\u0161\u0107u'), (u'sede\u0107e\u0161', u'sjedit \u0107e\u0161'), (u'sedeli', u'sjedili'), (u'sedi\u0161ta', u'sjedala'), (u'sedi\u0161te', u'sjedalo'), (u'sedi\u0161tu', u'sjedalu'), (u'sedni', u'sjedni'), (u'Sedni', u'Sjedni'), (u'sedi', u'sjedi'), (u'Sedi', u'Sjedi'), (u'sedite', u'sjedite'), (u'sesti', u'sjesti'), (u'sekire', u'sjekire'), (u'sekiraj', u'brini'), (u'sekiramo', u'brinemo'), (u'sekirate', u'brinete'), (u'sekirajte', u'brinite'), (u'seme', u'sjeme'), (u'sertan', u'sretan'), (u'Se\u0161\u0107u', u'Sjest \u0107u'), (u'se\u0161\u0107u', u'sjest \u0107u'), (u'sje\u0161\u0107emo', u'sjest \u0107emo'), (u'seta', u'sjeta'), (u'sigruno', u'sigurno'), (u'siguan', u'siguran'), (u'sija', u'sja'), (u'sir\u0107e', u'ocat'), (u'sir\u0107eta', u'octa'), (u'sir\u0107etu', u'octu'), (u'sle\u0107e', u'slije\u0107e'), (u'sle\u0107u', u'slije\u0107u'), (u'sle\u0107emo', u'slije\u0107emo'), (u'sleva', u'slijeva'), (u'se\u0107anjima', u'sje\u0107anjima'), (u'seo', u'sjeo'), (u'Seo', u'Sjeo'), (u'sem', u'osim'), (u'sma', u'sam'), (u'smao', u'samo'), (u'Smao', u'Samo'), (u'sme', u'smije'), (u'Sme', u'Smije'), (u'sme\u0107pm', u'sme\u0107em'), (u'smej', u'smij'), (u'smesta', u'smjesta'), (u'Smesta', u'Smjesta'), (u'smeste', u'smjeste'), (u'sme\u0161ak', u'smje\u0161ak'), (u'sme\u0161i', u'smije\u0161i'), (u'Sme\u0161i', u'Smije\u0161i'), (u'sme\u0161io', u'smije\u0161io'), (u'sme\u0161kom', u'smje\u0161kom'), (u'smjeo', u'smio'), (u'smrdeo', u'smrdio'), (u'sintersajzer', u'synthesizer'), (u'sitnisajzer', u'synthesizer'), (u'skelet', u'kostur'), (u'so\u010diva', u'le\u0107e'), (u'so\u010divo', u'le\u0107a'), (u'so\u010divom', u'le\u0107om'), (u'so\u010divu', u'le\u0107i'), (u'spasao', u'spasio'), (u'Spasao', u'Spasio'), (u'spasen', u'spa\u0161en'), (u'spasla', u'spasila'), (u'spasli', u'spasili'), (u'speluje', u'sri\u010de'), (u'speluju', u'sri\u010du'), (u'spolja', u'izvana'), (u'stabilizuju', u'stabiliziraju'), (u'starati', u'brinuti'), (u'Starati', u'Brinuti'), (u'steni', u'stijeni'), (u'stepen', u'stupanj'), (u'stepena', u'stupnjeva'), (u'stepeni', u'stupnjeva'), (u'stepenu', u'stupnju'), (u'sticati', u'stjecati'), (u'stiditi', u'stidjeti'), (u'stole\u0107a', u'stolje\u0107a'), (u'stobom', u's tobom'), (u'stvrano', u'stvarno'), (u'subjekat', u'subjekt'), (u'sudija', u'sudac'), (u'Sudija', u'Sudac'), (u'sudije', u'suca'), (u'sudiji', u'sucu'), (u'sudijo', u'su\u010de'), (u'sudiju', u'suca'), (u'sudijom', u'sucem'), (u'sudijskog', u'sudskog'), (u'sugeri\u0161u', u'predla\u017eu'), (u'sugeri\u0161e', u'predla\u017ee'), (u'surfuje', u'surfa'), (u'surfuje\u0161', u'surfa\u0161'), (u'surfuju', u'surfaju'), (u'su\u0161tina', u'bit'), (u'su\u0161tinski', u'bitni'), (u'suvim', u'suhim'), (u'svestan', u'svjestan'), (u'svjest', u'svijest'), (u'Svjest', u'Svijest'), (u'svjesti', u'svijesti'), (u'Svjesti', u'Svijesti'), (u'svetova', u'svjetova'), (u'svugde', u'svugdje'), (u'\u0161olja', u'\u0161alica'), (u'\u0161olju', u'\u0161alicu'), (u'\u0160ta', u'\u0160to'), (u'\u0161tagod', u'\u0161to god'), (u'\u0161ta', u'\u0161to'), (u'\u0161tp', u'\u0161to'), (u'\u0161tampa', u'tisak'), (u'\u0161tampu', u'tisak'), (u'\u0161tampom', u'tiskom'), (u'\u0161tampi', u'tisku'), (u'\u0161tampati', u'tiskati'), (u'tablu', u'plo\u010du'), (u'tako\u0111e', u'tako\u0111er'), (u'Tako\u0111e', u'Tako\u0111er'), (u'talas', u'val'), (u'Talas', u'Val'), (u'talasa', u'valova'), (u'talasima', u'valovima'), (u'talase', u'valove'), (u'talasi', u'valovi'), (u'Talasi', u'Valovi'), (u'te\u010dnost', u'teku\u0107ina'), (u'te\u010dnosti', u'teku\u0107ine'), (u'te\u010dno\u0161\u0107u', u'teku\u0107inom'), (u'tek\u0161o', u'te\u0161ko'), (u'Tek\u0161o', u'Te\u0161ko'), (u'terajte', u'tjerajte'), (u'to\u010dak', u'kota\u010d'), (u'To\u010dak', u'Kota\u010d'), (u'toha', u'toga'), (u'tovj', u'tvoj'), (u'trabam', u'trebam'), (u'trkanje', u'utrkivanje'), (u'trkanja', u'utrkivanja'), (u'trkao', u'utrkivao'), (u'trougao', u'trokut'), (u'trougla', u'trokuta'), (u'trouglu', u'trokutu'), (u'trouglove', u'trokute'), (u'trpeo', u'trpio'), (u'Trpeo', u'Trpio'), (u'tugi', u'tuzi'), (u'tvrtci', u'tvrtki'), (u'ubede', u'uvjere'), (u'Ube\u0111ivao', u'Uvjeravao'), (u'ube\u0111ivati', u'uvjeravati'), (u'ubje\u0111ivati', u'uvjeravati'), (u'ube\u0111uje', u'uvjerava'), (u'ube\u0111uje\u0161', u'uvjerava\u0161'), (u'ube\u0111uju', u'uvjeravaju'), (u'ubjediti', u'uvjeriti'), (u'u\u010dtivo', u'uljudno'), (u'u\u010dtivost', u'uljudnost'), (u'u\u010dtivo\u0161\u0107u', u'uljudno\u0161\u0107u'), (u'udata', u'udana'), (u'Udata', u'Udana'), (u'udeo', u'udio'), (u'uliva', u'ulijeva'), (u'ulivali', u'ulijevali'), (u'ulivate', u'ulijevate'), (u'uljeva', u'ulijeva'), (u'u jutro', u'ujutro'), (u'ujutru', u'ujutro'), (u'ume', u'zna'), (u'umem', u'umijem'), (u'ume\u0161', u'umije\u0161'), (u'umesto', u'umjesto'), (u'umetninama', u'umjetninama'), (u'umreti', u'umrijeti'), (u'Umret', u'Umrijet'), (u'Une\u0107u', u'Unijet \u0107u'), (u'univerzitet', u'sveu\u010dili\u0161te'), (u'univerzitetu', u'sveu\u010dili\u0161tu'), (u'Uop\u0161te', u'Uop\u0107e'), (u'uop\u0161te', u'uop\u0107e'), (u'uop\u010de', u'uop\u0107e'), (u'uprkos', u'usprkos'), (u'Uprkos', u'Usprkos'), (u'uradio', u'u\u010dinio'), (u'Uredu', u'U redu'), (u'uspe', u'uspije'), (u'Uspe', u'Uspije'), (u'uspeo', u'uspio'), (u'Uspeo', u'Uspio'), (u'uspe\u0161', u'uspije\u0161'), (u'uspeju', u'uspiju'), (u'uspjevala', u'uspijevala'), (u'uspijo', u'uspio'), (u'u sred', u'usred'), (u'usled', u'uslijed'), (u'Usled', u'Uslijed'), (u'usledila', u'uslijedila'), (u'usljed', u'uslijed'), (u'Usljed', u'Uslijed'), (u'u\u0161unjate', u'u\u0161uljate'), (u'utehe', u'utjehe'), (u'uve\u010de', u'nave\u010der'), (u'uvijet', u'uvjet'), (u'uvo', u'uho'), (u'vaistinu', u'uistinu'), (u'Vaistinu', u'Uistinu'), (u'varnica', u'iskra'), (u'varnicu', u'iskru'), (u'vaspitavan', u'odgajan'), (u'vaspitavanju', u'odgoju'), (u'va\u0161ljivi', u'u\u0161ljivi'), (u'va\u017ei', u'vrijedi'), (u've\u010dan', u'vje\u010dan'), (u'vek', u'stolje\u0107e'), (u'veka', u'stolje\u0107a'), (u'veke', u'vijeke'), (u'vekova', u'stolje\u0107a'), (u'venca', u'vijenca'), (u've\u010dnost', u'vje\u010dnost'), (u'veoma', u'vrlo'), (u'Veoma', u'Vrlo'), (u'veren', u'zaru\u010den'), (u'Veren', u'Zaru\u010den'), (u'verena', u'zaru\u010dena'), (u'vereni', u'zaru\u010deni'), (u'verimo', u'zaru\u010dimo'), (u've\u0161\u0107u', u'vije\u0161\u0107u'), (u've\u0161u', u'rublju'), (u'vidjeo', u'vidio'), (u'Vidjeo', u'Vidio'), (u'vjerojatno\u0107a', u'vjerojatnost'), (u'vje\u0161\u0107u', u'vije\u0161\u0107u'), (u'vje\u0161ta\u010dko', u'umjetno'), (u'vje\u0161ta\u010dki', u'umjetni'), (u'vje\u0161ta\u010dkom', u'umjetnom'), (u'vje\u0161ta\u010dkog', u'umjetnog'), (u'vje\u0161ta\u010dku', u'umjetnu'), (u'vlo', u'vrlo'), (u'Vodi\u0107e', u'Vodit \u0107e'), (u'Vodi\u0107u', u'Vodit \u0107u'), (u'voliti', u'voljeti'), (u'vredelo', u'vrijedilo'), (u'vrednom', u'vrijednom'), (u'vrednog', u'vrijednog'), (u'vreme', u'vrijeme'), (u'Vreme', u'Vrijeme'), (u'vrjeme', u'vrijeme'), (u'Vrjeme', u'Vrijeme'), (u'vrteo', u'vrtio'), (u'whiskey', u'viski'), (u'zaceljivanje', u'zacjeljivanje'), (u'zagrevanje', u'zagrijavanje'), (u'zalepili', u'zalijepili'), (u'zalepiti', u'zalijepiti'), (u'zanm', u'znam'), (u'zanma', u'zanima'), (u'zaspem', u'zaspim'), (u'zastareo', u'zastario'), (u'za uvijek', u'zauvijek'), (u'zavera', u'zavjera'), (u'zavredili', u'zavrijedili'), (u'zahtev', u'zahtjev'), (u'Zahtev', u'Zahtjev'), (u'zasede', u'zasjede'), (u'zasedi', u'zasjedi'), (u'zasedu', u'zasjedu'), (u'zatp', u'zato'), (u'Zatp', u'Zato'), (u'zbg', u'zbog'), (u'zdrvo', u'zdravo'), (u'Zdrvo', u'Zdravo'), (u'zlodela', u'zlodjela'), (u'zna\u0107i', u'zna\u010di'), (u'zvani\u010dan', u'slu\u017eben'), (u'\u017eemo', u'\u0107emo'), (u'\u017diveo', u'\u017divio'), (u'\u017emureo', u'\u017emirio'), (u'Ajron', u'Iron'), (u'Ar\u010di', u'Archie'), (u'Ajvi', u'Ivy'), (u'Beverli', u'Beverly'), (u'Bejker', u'Baker'), (u'Brid\u017eit', u'Bridget'), (u'Bri\u017eit', u'Brigitte'), (u'Darvin', u'Darwin'), (u'Darvina', u'Darwina'), (u'Darvinu', u'Darwinu'), (u'Darvinom', u'Darwinom'), (u'Dejv', u'Dave'), (u'Dejvi', u'Davie'), (u'Dejva', u'Davea'), (u'Dejvu', u'Daveu'), (u'Dejvom', u'Daveom'), (u'Den', u'Dan'), (u'Dru', u'Drew'), (u'D\u017eosi', u'Josie'), (u'\u0110o\u0161ua', u'Joshua'), (u'D\u017ees', u'Jess'), (u'D\u017een', u'Jen'), (u'D\u017eej', u'Jay'), (u'D\u017eejn', u'Jane'), (u'D\u017eil', u'Jill'), (u'D\u017eodi', u'Jody'), (u'D\u017euli', u'Julie'), (u'Ejb', u'Abe'), (u'Ejmi', u'Amy'), (u'Ejpril', u'April'), (u'End\u017ei', u'Angie'), (u'Entoni', u'Anthony'), (u'E\u0161li', u'Ashley'), (u'Fibi', u'Phoebe'), (u'Gre\u010den', u'Gretchen'), (u'Grejs', u'Grace'), (u'Hju', u'Hugh'), (u'Hjua', u'Hugha'), (u'Hjuz', u'Hughes'), (u'Hjuza', u'Hughesa'), (u'Hjuston', u'Houston'), (u'Ilejn', u'Elaine'), (u'Kejsi', u'Casey'), (u'Kerol', u'Carol'), (u'Kerolajn', u'Caroline'), (u'Kloe', u'Chloe'), (u'Kortni', u'Courtney'), (u'Krejg', u'Craig'), (u'Kristi', u'Christie'), (u'Lajf', u'Life'), (u'Lusi', u'Lucy'), (u'Majk', u'Mike'), (u'Medelin', u'Madeline'), (u'Mejbel', u'Mabel'), (u'Mejn', u'Maine'), (u'Mejna', u'Mainea'), (u'Mejnu', u'Maineu'), (u'Mejnom', u'Maineom'), (u'Merilend', u'Maryland'), (u'Mi\u010del', u'Mitchell'), (u'Nejt', u'Nate'), (u'Nensi', u'Nancy'), (u'Ni\u010de', u'Nietzsche'), (u'Odri', u'Audrey'), (u'Ohajo', u'Ohio'), (u'Pem', u'Pam'), (u'Pejd\u017e', u'Paige'), (u'Rej\u010del', u'Rachel'), (u'Rouz', u'Rose'), (u'Stejt', u'State'), (u'Stejsi', u'Stacy'), (u'\u0160eron', u'Sharon'), (u'\u0160eril', u'Cheryl'), (u'\u0160paniji', u'\u0160panjolskoj'), (u'Tajms', u'Times'), (u'Tejlor', u'Taylor'), (u'\u017dak', u'Jacques'), (u'januar', u'sije\u010danj'), (u'Januar', u'Sije\u010danj'), (u'februar', u'velja\u010da'), (u'februara', u'velja\u010de'), (u'februaru', u'velja\u010di'), (u'Februar', u'Velja\u010da'), (u'Februara', u'Velja\u010de'), (u'Februaru', u'Velja\u010di'), (u'mart', u'o\u017eujak'), (u'Mart', u'O\u017eujak'), (u'april', u'travanj'), (u'April', u'Travanj'), (u'maj', u'svibanj'), (u'Maj', u'Svibanj'), (u'svibnjom', u'svibnjem'), (u'jun', u'lipanj'), (u'juna', u'lipnja'), (u'junu', u'lipnju'), (u'Jun', u'Lipanj'), (u'juli', u'srpanj'), (u'jula', u'srpnja'), (u'julu', u'srpnju'), (u'Juli', u'Srpanj'), (u'septembar', u'rujan'), (u'Septembar', u'Rujan'), (u'oktobar', u'listopad'), (u'Oktobar', u'Listopad'), (u'novembar', u'studeni'), (u'november', u'studeni'), (u'novembra', u'studenog'), (u'novembru', u'studenom'), (u'Novembar', u'Studeni'), (u'November', u'Studeni'), (u'Novembra', u'Studenog'), (u'Novembru', u'Studenom'), (u'decembar', u'prosinac'), (u'Decembar', u'Prosinac')]), - 'pattern': u'(?um)(\\b|^)(?:advokati|Advokati|advokatima|Advokatima|afirmi\\\u0161e|akcenat|akcionara|amin|Amin|azot|ba\\\u0161ta|Ba\\\u0161ta|ba\\\u0161te|Ba\\\u0161te|ba\\\u0161ti|ba\\\u0161tu|Ba\\\u0161tu|ba\\\u0161tom|bedan|bede|bedi|bejah|bele\\\u0161ci|be\\\u0161ike|bimso|bioskop|bioskopi|bitci|blije\\\u0111i|beg|begu|beja\\\u0161e|bekstvo|bekstvu|begstvu|bes|besa|besan|besom|besu|be\\\u0161e|bioje|bi\\ smo|bi\\ ste|bled|blede|boksuje\\\u0161|bolesan|braon|bregu|bti|cedilu|ceo|Ceo|cepa|cev|cevi|cev\\\u010dica|cev\\\u010dicu|cvetu|cvjetu|cvetalo|cvjetom|\\\u010cakom|\\\u010dar\\\u0161av|\\\u010dar\\\u0161ave|\\\u010dar\\\u0161avima|\\\u010das|\\\u010detvoro|\\\u010cita\\\u0107u|\\\u010derku|\\\u010cerku|\\\u0107erku|\\\u0106erku|\\\u0107erkama|\\\u010derkama|\\\u0107erkom|\\\u010derkom|k\\\u0107erkom|k\\\u010derkom|\\\u0107ebe|\\\u0107ebetu|\\\u010dk|\\\u0107\\\u0161|\\\u0107ale|\\\u0107aletom|\\\u0107aleta|\\\u0107aletu|\\\u0107orsokak|\\\u0107orsokaku|\\\u0107o\\\u0161ak|\\\u0107o\\\u0161ku|\\\u0107erka|\\\u0106erka|\\\u0107mo|\\\u0107te|\\\u010du\\\u0107e|\\\u010du\\\u0107emo|\\\u010cu\\\u0107emo|\\\u010cu\\\u0107ete|\\\u010cu\\\u0107e|\\\u0107utao|\\\u0106utao|cvetova|daga|damas|deda|Deda|dede|dedi|dedom|defini\\\u0161e|dele\\\u0107i|deo|Deo|de\\\u0161ava|dete|diluje|diluju|djete|Dete|Djete|detektuje|dodju|dole|Dole|Donije\\\u0107u|do\\ ovde|dospeo|dospeju|do\\\u0111avola|Do\\\u0111avola|drug|drugde|duuga|duvana|dve|Dve|dvema|\\\u0111avo|\\\u0111avola|\\\u0111emper|d\\\u017eanki|d\\\u017eelat|\\\u0111ubre|eksperata|eksperti|Eksperti|ekspertima|en|emitovao|emitovati|emituje|emitujem|emituju|familijama|familiji|flertuje|foka|foku|foke|fokama|fotografi\\\u0161u|gde|Gde|gluhonem|gre\\\u0161e|gre\\\u0161ki|grijehova|hipnoti\\\u0161e|Historija|Historiju|Historije|Historiji|Istorija|Istoriju|Istorije|Istoriji|historije|historiji|istorije|istoriji|istorijom|ho\\\u010du|Ho\\\u010du|hte\\\u0107e|htedoh|i\\\u010di|I\\\u010di|iko|ignori\\\u0161i|Ignori\\\u0161i|ignori\\\u0161ite|Ignori\\\u0161ite|ignori\\\u0161u|ilustruju|informi\\\u0161e|informi\\\u0161u|inspirisao|interesuje|Interesuje|Interesuju|interesuju|isekao|isterao|istera\\\u0161|Istera\\\u0161|isuvi\\\u0161e|ivica|ivice|ivici|ivicu|Izolujete|Izolujte|izgladneo|izmeriti|izmerio|izneo|izolujte|izneti|izvestan|izvinim|izvini\\\u0161|izviniti|izvinjenje|izvinjenja|izvinjenju|jedamput|jelda|Je\\\u0161\\\u0107emo|ju\\\u010de|Ju\\\u010de|kakava|kampuje|kampujemo|kampuju|kancelariji|kancelarijom|kancera|kandidovati|kandidujem|karmin|karminom|k\\\u0107erci|k\\\u0107erka|k\\\u010derka|K\\\u0107erka|K\\\u010derka|k\\\u0107erkama|ker|Ker|kerova|kidnapovan|Kidnapovan|kiji|kijim|klasifikuju|Ko|koa|koaj|kola|kolima|komandni|kombinuju|kompanija|kom\\\u0161ija|kom\\\u0161iji|kom\\\u0161iju|kom\\\u0161iluk|kom\\\u0161iluka|kom\\\u0161iluku|kom\\\u0161ije|kom\\\u0161ijama|kontroli\\\u0161u|Kontroli\\\u0161u|Kontroli\\\u0161i|kontroli\\\u0161i|Kontroli\\\u0161ite|kontroli\\\u0161ite|korpu|kritikuju|krsta|krstu|krsti\\\u0107a|krsti\\\u0107u|Krsta|Krstu|Krsti\\\u0107a|Krsti\\\u0107u|krstom|krstove|Krstove|krstovima|Krstovima|kri\\\u017eom|kupatilo|kupatilu|kvalifikuju|la\\\u017eeju|la\\\u017eov|la\\\u017eovi|la\\\u017eovu|la\\\u017eovima|la\\\u017eovom|lebdeo|le\\\u010di|le\\\u010de|lje\\\u010di|Le\\\u010di|Lje\\\u010di|Lejn|Lenja|lenji|lenja|le\\\u0161nik|Leta|leto|letiti|leve|lo\\\u017ei|lza|majca|majce|majcu|majcom|Malopre|malopre|maloprije|manifestuje|Mek|mehur|menom|mera\\\u010d|meri|mere|merdevine|merdevinama|me\\\u0161ane|me\\\u0161avina|me\\\u0161avine|me\\\u0161avinu|me\\\u0161tana|minut|mo\\\u010d|mofu|momenat|muzejem|muzici|na\\\u010di|naduvan|najpre|Najpre|najzad|nanev\\\u0161i|napastvuje|Napolje|napolje|Napolju|napolju|nauka|Nauka|nauci|nazad|Nazad|napred|Napred|naprimjer|naseo|nasme\\\u0161i|nasre\\\u0107u|nebi|nebih|Nebi|Nebih|nebismo|Nebismo|nebiste|Nebiste|nedaj|negde|Negde|neguje|neguju|nekto|nemi|nemrem|nemogu|Nemogu|nemora|Nemora|nene|ne\\\u0161o|nevreme|nezi|nigde|Nigde|niko|Niko|nisma|Nisma|ne\\\u0107\\\u0161|nejde|neda|nedam|new\\ yor\\\u0161ki|nju\\ jor\\\u0161ki|njegi|ne\\\u017eeli|niej|njie|njem|njeme|nsiam|nteko|obe|Obe|obema|Obezbe\\\u0111uju|obezbe\\\u0111uju|objekat|oblast|oblastima|oblasti|obolelu|obo\\\u017eavalac|obu\\\u010di|obuhvata|odandje|odavdje|odela|odelu|odelenje|odelenju|odeljak|odeljenje|Odeljenje|odjeljenje|Odjeljenje|odeljenjem|odma|Odne\\\u0107u|odne\\\u0107u|odne\\\u0107e|odoliti|odneti|odprilike|odseo|odsela|odsesti|odupreti|ogladneo|organizuju|Organizuju|osje\\\u0107anja|osmehe|osmehne|osobenosti|ostrva|ostrvu|ostrvom|Ostrva|Ostrvu|Ostrvom|ostrvima|osete|ostrvo|Ostrvo|ovde|Ovde|ovdije|Ovdije|ovjde|Ovjde|palatama|palate|palatu|palati|pantalone|Pantalone|pantalona|pantalonama|par\\\u010de|par\\\u010deta|par\\\u010detom|parampar\\\u010dad|pd|pemzija|pemziju|penzionerski|Penzionerski|pertle|pesama|pesnicima|pe\\\u0161ice|Pe\\\u0161ice|plata|pla\\\u010da|platu|pla\\\u010danje|pla\\\u010danjem|pla\\\u0107e\\\u0161|po\\\u010de\\\u0107u|podjelimo|podnesti|podstreka\\\u010d|podsete|poen|poena|poene|poeni|Poeni|poenima|poludili|poma\\\u0107i|pomaknim|pomaknio|pomakniti|pomenu|Pomera|pomera|pomerajte|pomjeri|pomeraj|pomjeraj|pomeraju|pomerala|pomeranja|pomerati|pomjerati|pomeri\\\u0161|ponaosob|ponesla|Ponesla|pore\\\u0111enje|pore\\\u0111enju|porekla|poreklo|poreklu|Porodica|Porodice|porodica|porodice|porodici|porodicama|porodicom|porodicu|posle|Posle|poslje|postara|Postara\\\u0107u|postara\\\u0107u|postaraj|Postaraj|Postaraju|postaraju|postarajmo|postaramo|postara\\\u0161|povesne|Povinuju|povinuju|pozadi|praktikuj|praktikuju|praktikovala|praktikovati|pre|Pre|Pre\\\u0107i|pre\\\u0107i|predame|predelu|preformuli\\\u0161i|preklo|preloma|Prene\\\u0107u|prene\\\u0107u|prenos|prenosa|prenosom|prenosu|preneo|prenela|prenjela|preneli|prenjeli|preneti|preporu\\\u010da|prese\\\u0107i|preti|prete\\\u0107im|prete\\\u0107ih|pretrpeo|prevod|Prevod|prezentovati|pridonjeti|prijatan|primedbi|primjete|prisetim|pritiskam|prmda|procenat|procent|procenata|procenti|Procenti|procente|Procente|procentu|Procentu|procentima|prodato|prohte|projekat|Projekat|promijena|protestvovat|Protestvovat|Protestvujem|protestvujem|protestvuju|protestuju\\\u0107i|psihi\\\u0107ki|ra\\\u010dunari|ra\\\u010dunare|radijo|ra\\\u0111e|ranac|rancu|rascep|rasejan|rasejana|raspust|razdevi\\\u010de|razgovrati|razre\\\u0161i|razume|razumeju|re\\\u0111e|rejv|rejvu|reko|rengen|repuje\\\u0161|resetuje|resetujte|Resetujte|rije\\\u0111i|Rizikuj|rokenrol|ronioc|savije\\\u0161\\\u0107u|save\\\u0161\\\u0107u|sede\\\u0107e\\\u0161|sedeli|sedi\\\u0161ta|sedi\\\u0161te|sedi\\\u0161tu|sedni|Sedni|sedi|Sedi|sedite|sesti|sekire|sekiraj|sekiramo|sekirate|sekirajte|seme|sertan|Se\\\u0161\\\u0107u|se\\\u0161\\\u0107u|sje\\\u0161\\\u0107emo|seta|sigruno|siguan|sija|sir\\\u0107e|sir\\\u0107eta|sir\\\u0107etu|sle\\\u0107e|sle\\\u0107u|sle\\\u0107emo|sleva|se\\\u0107anjima|seo|Seo|sem|sma|smao|Smao|sme|Sme|sme\\\u0107pm|smej|smesta|Smesta|smeste|sme\\\u0161ak|sme\\\u0161i|Sme\\\u0161i|sme\\\u0161io|sme\\\u0161kom|smjeo|smrdeo|sintersajzer|sitnisajzer|skelet|so\\\u010diva|so\\\u010divo|so\\\u010divom|so\\\u010divu|spasao|Spasao|spasen|spasla|spasli|speluje|speluju|spolja|stabilizuju|starati|Starati|steni|stepen|stepena|stepeni|stepenu|sticati|stiditi|stole\\\u0107a|stobom|stvrano|subjekat|sudija|Sudija|sudije|sudiji|sudijo|sudiju|sudijom|sudijskog|sugeri\\\u0161u|sugeri\\\u0161e|surfuje|surfuje\\\u0161|surfuju|su\\\u0161tina|su\\\u0161tinski|suvim|svestan|svjest|Svjest|svjesti|Svjesti|svetova|svugde|\\\u0161olja|\\\u0161olju|\\\u0160ta|\\\u0161tagod|\\\u0161ta|\\\u0161tp|\\\u0161tampa|\\\u0161tampu|\\\u0161tampom|\\\u0161tampi|\\\u0161tampati|tablu|tako\\\u0111e|Tako\\\u0111e|talas|Talas|talasa|talasima|talase|talasi|Talasi|te\\\u010dnost|te\\\u010dnosti|te\\\u010dno\\\u0161\\\u0107u|tek\\\u0161o|Tek\\\u0161o|terajte|to\\\u010dak|To\\\u010dak|toha|tovj|trabam|trkanje|trkanja|trkao|trougao|trougla|trouglu|trouglove|trpeo|Trpeo|tugi|tvrtci|ubede|Ube\\\u0111ivao|ube\\\u0111ivati|ubje\\\u0111ivati|ube\\\u0111uje|ube\\\u0111uje\\\u0161|ube\\\u0111uju|ubjediti|u\\\u010dtivo|u\\\u010dtivost|u\\\u010dtivo\\\u0161\\\u0107u|udata|Udata|udeo|uliva|ulivali|ulivate|uljeva|u\\ jutro|ujutru|ume|umem|ume\\\u0161|umesto|umetninama|umreti|Umret|Une\\\u0107u|univerzitet|univerzitetu|Uop\\\u0161te|uop\\\u0161te|uop\\\u010de|uprkos|Uprkos|uradio|Uredu|uspe|Uspe|uspeo|Uspeo|uspe\\\u0161|uspeju|uspjevala|uspijo|u\\ sred|usled|Usled|usledila|usljed|Usljed|u\\\u0161unjate|utehe|uve\\\u010de|uvijet|uvo|vaistinu|Vaistinu|varnica|varnicu|vaspitavan|vaspitavanju|va\\\u0161ljivi|va\\\u017ei|ve\\\u010dan|vek|veka|veke|vekova|venca|ve\\\u010dnost|veoma|Veoma|veren|Veren|verena|vereni|verimo|ve\\\u0161\\\u0107u|ve\\\u0161u|vidjeo|Vidjeo|vjerojatno\\\u0107a|vje\\\u0161\\\u0107u|vje\\\u0161ta\\\u010dko|vje\\\u0161ta\\\u010dki|vje\\\u0161ta\\\u010dkom|vje\\\u0161ta\\\u010dkog|vje\\\u0161ta\\\u010dku|vlo|Vodi\\\u0107e|Vodi\\\u0107u|voliti|vredelo|vrednom|vrednog|vreme|Vreme|vrjeme|Vrjeme|vrteo|whiskey|zaceljivanje|zagrevanje|zalepili|zalepiti|zanm|zanma|zaspem|zastareo|za\\ uvijek|zavera|zavredili|zahtev|Zahtev|zasede|zasedi|zasedu|zatp|Zatp|zbg|zdrvo|Zdrvo|zlodela|zna\\\u0107i|zvani\\\u010dan|\\\u017eemo|\\\u017diveo|\\\u017emureo|Ajron|Ar\\\u010di|Ajvi|Beverli|Bejker|Brid\\\u017eit|Bri\\\u017eit|Darvin|Darvina|Darvinu|Darvinom|Dejv|Dejvi|Dejva|Dejvu|Dejvom|Den|Dru|D\\\u017eosi|\\\u0110o\\\u0161ua|D\\\u017ees|D\\\u017een|D\\\u017eej|D\\\u017eejn|D\\\u017eil|D\\\u017eodi|D\\\u017euli|Ejb|Ejmi|Ejpril|End\\\u017ei|Entoni|E\\\u0161li|Fibi|Gre\\\u010den|Grejs|Hju|Hjua|Hjuz|Hjuza|Hjuston|Ilejn|Kejsi|Kerol|Kerolajn|Kloe|Kortni|Krejg|Kristi|Lajf|Lusi|Majk|Medelin|Mejbel|Mejn|Mejna|Mejnu|Mejnom|Merilend|Mi\\\u010del|Nejt|Nensi|Ni\\\u010de|Odri|Ohajo|Pem|Pejd\\\u017e|Rej\\\u010del|Rouz|Stejt|Stejsi|\\\u0160eron|\\\u0160eril|\\\u0160paniji|Tajms|Tejlor|\\\u017dak|januar|Januar|februar|februara|februaru|Februar|Februara|Februaru|mart|Mart|april|April|maj|Maj|svibnjom|jun|juna|junu|Jun|juli|jula|julu|Juli|septembar|Septembar|oktobar|Oktobar|novembar|november|novembra|novembru|Novembar|November|Novembra|Novembru|decembar|Decembar)(\\b|$)'}}, + 'WholeWords': {'data': OrderedDict([(u'advokati', u'odvjetnici'), (u'Advokati', u'Odvjetnici'), (u'advokatima', u'odvjetnicima'), (u'Advokatima', u'Odvjetnicima'), (u'afirmi\u0161e', u'afirmira'), (u'akcenat', u'naglasak'), (u'akcionara', u'dioni\u010dara'), (u'akvarijum', u'akvarij'), (u'akvarijumu', u'akvariju'), (u'amin', u'amen'), (u'Amin', u'Amen'), (u'ans', u'nas'), (u'apsorbovanje', u'apsorbiranje'), (u'apsorbuje', u'apsorbira'), (u'azot', u'du\u0161ik'), (u'ba\u0161ta', u'vrt'), (u'Ba\u0161ta', u'Vrt'), (u'ba\u0161te', u'vrtovi'), (u'Ba\u0161te', u'Vrtovi'), (u'ba\u0161ti', u'vrtu'), (u'ba\u0161tu', u'vrt'), (u'Ba\u0161tu', u'Vrt'), (u'ba\u0161tom', u'vrtom'), (u'bedan', u'bijedan'), (u'bede', u'bijede'), (u'bedi', u'bijedi'), (u'bejah', u'bijah'), (u'bejahu', u'bijahu'), (u'bele\u0161ci', u'bilje\u0161ci'), (u'be\u0161ike', u'mjehure'), (u'bebisiterka', u'dadilja'), (u'beg', u'bijeg'), (u'begu', u'bijegu'), (u'begstva', u'bijega'), (u'beja\u0161e', u'bija\u0161e'), (u'bekstvo', u'bijeg'), (u'bekstvu', u'bijegu'), (u'begstvu', u'bijegu'), (u'bes', u'bijes'), (u'besa', u'bijesa'), (u'besan', u'bijesan'), (u'besom', u'bijesom'), (u'besu', u'bijesu'), (u'be\u0161e', u'bje\u0161e'), (u'bimso', u'bismo'), (u'blije\u0111i', u'blje\u0111i'), (u'bioje', u'bio je'), (u'bi smo', u'bismo'), (u'bi ste', u'biste'), (u'bioskop', u'kino'), (u'bioskopi', u'kina'), (u'bitci', u'bitki'), (u'bled', u'blijed'), (u'blede', u'blijede'), (u'boksuje\u0161', u'boksa\u0161'), (u'bolesan', u'bolestan'), (u'bolila', u'boljela'), (u'bori\u0107e\u0161', u'borit \u0107e\u0161'), (u'Bori\u0107e\u0161', u'Borit \u0107e\u0161'), (u'braon', u'sme\u0111a'), (u'bregu', u'brijegu'), (u'bti', u'biti'), (u'cedilu', u'cjedilu'), (u'ceo', u'cijeli'), (u'Ceo', u'Cijeli'), (u'cepa', u'cijepa'), (u'cev', u'cijev'), (u'cevi', u'cijevi'), (u'cjevi', u'cijevi'), (u'cevima', u'cijevima'), (u'Cevi', u'Cijevi'), (u'Cjevi', u'Cijevi'), (u'Cevima', u'Cijevima'), (u'Cjevima', u'Cijevima'), (u'cev\u010dica', u'cjev\u010dica'), (u'cev\u010dicu', u'cjev\u010dicu'), (u'cutanje', u'\u0161utnja'), (u'\u010dutanje', u'\u0161utnja'), (u'\u0107utanje', u'\u0161utnja'), (u'Cutanje', u'\u0160utnja'), (u'\u010cutanje', u'\u0160utnja'), (u'\u0106utanje', u'\u0160utnja'), (u'cutanjem', u'\u0161utnjom'), (u'\u010dutanjem', u'\u0161utnjom'), (u'\u0107utanjem', u'\u0161utnjom'), (u'Cutanjem', u'\u0160utnjom'), (u'\u010cutanjem', u'\u0160utnjom'), (u'\u0106utanjem', u'\u0160utnjom'), (u'cvetaju', u'cvjetaju'), (u'cvetove', u'cvjetove'), (u'cvetu', u'cvijetu'), (u'cvjetu', u'cvijetu'), (u'cvetalo', u'cvjetalo'), (u'cvjetom', u'cvijetom'), (u'\u010cakom', u'Chuckom'), (u'\u010dar\u0161av', u'plahta'), (u'\u010dar\u0161ave', u'plahte'), (u'\u010dar\u0161avi', u'plahte'), (u'\u010dar\u0161avima', u'plahtama'), (u'\u010das', u'sat'), (u'\u010detvoro', u'\u010detvero'), (u'\u010cita\u0107u', u'\u010citat \u0107u'), (u'\u010derku', u'k\u0107er'), (u'\u010cerku', u'K\u0107er'), (u'\u0107erku', u'k\u0107er'), (u'\u0106erku', u'K\u0107er'), (u'\u0107erkama', u'k\u0107erima'), (u'\u010derkama', u'k\u0107erima'), (u'\u0107erkom', u'k\u0107eri'), (u'\u010derkom', u'k\u0107eri'), (u'k\u0107erkom', u'k\u0107eri'), (u'k\u010derkom', u'k\u0107eri'), (u'\u010cu', u'\u0106u'), (u'\u010ce\u0161', u'\u0106e\u0161'), (u'\u010ce', u'\u0106e'), (u'\u010cemo', u'\u0106emo'), (u'\u010cete', u'\u0106ete'), (u'\u010du', u'\u0107u'), (u'\u010de\u0161', u'\u0107e\u0161'), (u'\u010de', u'\u0107e'), (u'\u010demo', u'\u0107emo'), (u'\u010dete', u'\u0107ete'), (u'\u0107ebe', u'deku'), (u'\u0107ebetu', u'deki'), (u'\u010dk', u'\u010dak'), (u'\u0107\u0161', u'\u0107e\u0161'), (u'\u0107ale', u'tata'), (u'\u0107aletom', u'ocem'), (u'\u0107aleta', u'oca'), (u'\u0107aletu', u'ocu'), (u'\u0107orsokak', u'slijepa ulica'), (u'\u0107orsokaku', u'slijepoj ulici'), (u'\u0107o\u0161ak', u'ugao'), (u'\u0107o\u0161ku', u'uglu'), (u'\u0107erka', u'k\u0107i'), (u'\u0106erka', u'K\u0107i'), (u'\u0107mo', u'\u0107emo'), (u'\u0107te', u'\u0107ete'), (u'\u010du\u0107e', u'\u010dut \u0107e'), (u'\u010du\u0107emo', u'\u010dut \u0107emo'), (u'\u010cu\u0107emo', u'\u010cut \u0107emo'), (u'\u010cu\u0107ete', u'\u010cut \u0107ete'), (u'\u010cu\u0107e', u'\u010cut \u0107e'), (u'\u0107uo', u'\u010duo'), (u'\u0107utao', u'\u0161utio'), (u'\u0106utao', u'\u0160utio'), (u'\u0107ute', u'\u0161ute'), (u'\u0106ute', u'\u0160ute'), (u'cvetova', u'cvjetova'), (u'daga', u'da ga'), (u'damas', u'danas'), (u'date', u'dane'), (u'deda', u'djed'), (u'Deda', u'Djed'), (u'dede', u'djeda'), (u'dedi', u'djedu'), (u'dedom', u'djedom'), (u'defini\u0161e', u'definira'), (u'dejstvo', u'djelovanje'), (u'Dejstvo', u'Djelovanje'), (u'dejstvom', u'djelovanjem'), (u'Dejstvom', u'Djelovanjem'), (u'dele\u0107i', u'dijele\u0107i'), (u'deo', u'dio'), (u'Deo', u'Dio'), (u'de\u0161ava', u'doga\u0111a'), (u'dete', u'dijete'), (u'Dete', u'Dijete'), (u'diluje', u'dila'), (u'diluju', u'dilaju'), (u'diskutuje', u'raspravlja'), (u'Diskutuje', u'Raspravlja'), (u'diskutujemo', u'raspravljamo'), (u'Diskutujemo', u'Raspravljamo'), (u'djete', u'dijete'), (u'Djete', u'Dijete'), (u'detektuje', u'detektira'), (u'dodju', u'do\u0111u'), (u'dole', u'dolje'), (u'Dole', u'Dolje'), (u'donijeo', u'donio'), (u'Donijeo', u'Donio'), (u'Donije\u0107u', u'Donijet \u0107u'), (u'dosledan', u'dosljedan'), (u'dospeo', u'dospio'), (u'dospeju', u'dospiju'), (u'do\u0111avola', u'dovraga'), (u'Do\u0111avola', u'Dovraga'), (u'drug', u'prijatelj'), (u'drugari', u'prijatelji'), (u'drugare', u'prijatelje'), (u'drug\u010diji', u'druga\u010diji'), (u'drugde', u'drugdje'), (u'duuga', u'd\xfaga'), (u'duvana', u'duhana'), (u'dve', u'dvije'), (u'Dve', u'Dvije'), (u'dvema', u'dvjema'), (u'\u0111avo', u'vrag'), (u'\u0111avola', u'vraga'), (u'\u0111emper', u'd\u017eemper'), (u'd\u017eanki', u'ovisnik'), (u'd\u017eelat', u'krvnik'), (u'\u0111ubre', u'sme\u0107e'), (u'efekat', u'efekt'), (u'eksperata', u'stru\u010dnjaka'), (u'eksperti', u'stru\u010dnjaci'), (u'Eksperti', u'Stru\u010dnjaci'), (u'ekspertima', u'stru\u010dnjacima'), (u'en', u'ne'), (u'emitovao', u'emitirao'), (u'emitovati', u'emitirati'), (u'emituje', u'emitira'), (u'emitujem', u'emitiram'), (u'Emitujem', u'Emitiram'), (u'emituju', u'emitiraju'), (u'evra', u'eura'), (u'familija', u'obitelj'), (u'Familija', u'Obitelj'), (u'familiju', u'obitelj'), (u'Familiju', u'Obitelj'), (u'familijama', u'obiteljima'), (u'familiji', u'obitelji'), (u'flertuje', u'o\u010dijuka'), (u'foka', u'tuljan'), (u'foku', u'tuljana'), (u'foke', u'tuljani'), (u'fokama', u'tuljanima'), (u'fotografi\u0161u', u'fotografiraju'), (u'gasova', u'plinova'), (u'gde', u'gdje'), (u'Gde', u'Gdje'), (u'gluhonem', u'gluhonijem'), (u'gre\u0161e', u'grije\u0161e'), (u'grje\u0161e', u'grije\u0161e'), (u'gre\u0161i', u'grije\u0161i'), (u'grje\u0161i', u'grije\u0161i'), (u'gre\u0161ki', u'gre\u0161ci'), (u'grijehova', u'grijeha'), (u'grijehove', u'grijehe'), (u'hipnotisao', u'hipnotizirao'), (u'hipnotisana', u'hipnotizirana'), (u'hipnoti\u0161e', u'hipnotizira'), (u'Historija', u'Povijest'), (u'Historiju', u'Povijest'), (u'Historije', u'Povijesti'), (u'Historiji', u'Povijesti'), (u'Istorija', u'Povijest'), (u'Istoriju', u'Povijest'), (u'Istorije', u'Povijesti'), (u'Istoriji', u'Povijesti'), (u'historije', u'povijesti'), (u'historiji', u'povijesti'), (u'istorije', u'povijesti'), (u'istoriji', u'povijesti'), (u'istorijom', u'povije\u0161\u0107u'), (u'hakuje', u'hakira'), (u'Hakuje', u'Hakira'), (u'hakujemo', u'hakiramo'), (u'Hakujemo', u'Hakiramo'), (u'Hakuju', u'Hakiraju'), (u'hakuju', u'hakiraju'), (u'ho\u010du', u'ho\u0107u'), (u'Ho\u010du', u'Ho\u0107u'), (u'hte\u0107e', u'htjet \u0107e'), (u'htedoh', u'htjedoh'), (u'Htjeo', u'Htio'), (u'Hteo', u'Htio'), (u'htjeo', u'htio'), (u'hteo', u'htio'), (u'i\u010di', u'i\u0107i'), (u'I\u010di', u'I\u0107i'), (u'iko', u'itko'), (u'ignori\u0161i', u'ignoriraj'), (u'Ignori\u0161i', u'Ignoriraj'), (u'ignori\u0161ite', u'ignorirajte'), (u'Ignori\u0161ite', u'Ignorirajte'), (u'ignori\u0161u', u'ignoriraju'), (u'ilustruju', u'ilustriraju'), (u'inspirisao', u'inspirirao'), (u'interesantan', u'zanimljiv'), (u'Interesantan', u'Zanimljiv'), (u'interesuje', u'zanima'), (u'Interesuje', u'Zanima'), (u'interesujemo', u'zanimamo'), (u'Interesujemo', u'Zanimamo'), (u'interesujete', u'zanimate'), (u'Interesujete', u'Zanimate'), (u'Interesuju', u'Zanimaju'), (u'interesuju', u'zanimaju'), (u'isekao', u'izrezao'), (u'isterao', u'istjerao'), (u'istera\u0161', u'istjera\u0161'), (u'Istera\u0161', u'Istjera\u0161'), (u'istrebi', u'istrijebi'), (u'istrebiti', u'istrijebiti'), (u'isuvi\u0161e', u'previ\u0161e'), (u'ivica', u'rub'), (u'ivice', u'ruba'), (u'ivici', u'rubu'), (u'ivicu', u'rub'), (u'izduvaj', u'ispu\u0161i'), (u'izduvamo', u'ispu\u0161emo'), (u'izoluje', u'izolira'), (u'izolujemo', u'izoliramo'), (u'izoluje\u0161', u'izolira\u0161'), (u'Izolujete', u'Izolirate'), (u'Izolujte', u'Izolirajte'), (u'izolujte', u'izolirajte'), (u'izgladneo', u'izgladnio'), (u'izmeriti', u'izmjeriti'), (u'izmerio', u'izmjerio'), (u'izme\u0161ane', u'izmije\u0161ane'), (u'izneo', u'iznio'), (u'izneti', u'iznijeti'), (u'izvestan', u'izvjestan'), (u'izvinem', u'ispri\u010dam'), (u'izvine\u0161', u'ispri\u010da\u0161'), (u'Izvinem', u'Ispri\u010dam'), (u'Izvine\u0161', u'Ispri\u010da\u0161'), (u'izvinim', u'ispri\u010dam'), (u'izvini\u0161', u'ispri\u010da\u0161'), (u'izviniti', u'ispri\u010dati'), (u'izvinjenje', u'isprika'), (u'izvinjenja', u'isprike'), (u'izvinjenju', u'isprici'), (u'jedamput', u'jedanput'), (u'jelda', u"jel' da"), (u'Je\u0161\u0107emo', u'Jest \u0107emo'), (u'Je\u0161\u0107e\u0161', u'Jest \u0107e\u0161'), (u'je\u0161\u0107e', u'jest \u0107e'), (u'je\u0161\u0107u', u'jest \u0107u'), (u'Je\u0161\u0107u', u'Jest \u0107u'), (u'je\u0161\u0107e\u0161', u'jest \u0107e\u0161'), (u'je\u0161\u0107emo', u'jest \u0107emo'), (u'ju\u010de', u'ju\u010der'), (u'Ju\u010de', u'Ju\u010der'), (u'kakava', u'kakva'), (u'kampovao', u'kampirao'), (u'kampuje', u'kampira'), (u'kampujemo', u'kampiramo'), (u'kampuju', u'kampiraju'), (u'kancelarija', u'ured'), (u'kancelarijama', u'uredima'), (u'kancelariju', u'ured'), (u'Kancelarija', u'Ured'), (u'Kancelariju', u'Ured'), (u'kancelariji', u'uredu'), (u'kancelarije', u'ureda'), (u'kancelarijom', u'uredom'), (u'kancera', u'raka'), (u'kandidovati', u'kandidirati'), (u'kandidujem', u'kandidiram'), (u'kapar', u'kopar'), (u'kapra', u'kopra'), (u'karmin', u'ru\u017e'), (u'karminom', u'ru\u017eem'), (u'k\u0107erci', u'k\u0107eri'), (u'k\u0107erka', u'k\u0107i'), (u'k\u010derka', u'k\u0107i'), (u'K\u0107erka', u'K\u0107i'), (u'K\u010derka', u'K\u0107i'), (u'k\u0107erkama', u'k\u0107erima'), (u'ker', u'pas'), (u'Ker', u'Pas'), (u'kerova', u'pasa'), (u'kidnapovan', u'otet'), (u'Kidnapovan', u'Otet'), (u'kiji', u'koji'), (u'kijim', u'kojim'), (u'klasifikuju', u'klasificiraju'), (u'kle\u0161ta', u'klije\u0161ta'), (u'klje\u0161ta', u'klije\u0161ta'), (u'Ko', u'Tko'), (u'koa', u'kao'), (u'koaj', u'koja'), (u'kola', u'auto'), (u'kolima', u'autu'), (u'komandni', u'zapovjedni'), (u'kombinuju', u'kombiniraju'), (u'kompanija', u'tvrtka'), (u'komponovao', u'skladao'), (u'kom\u0161ija', u'susjed'), (u'kom\u0161iji', u'susjedu'), (u'kom\u0161iju', u'susjeda'), (u'kom\u0161iluk', u'susjedstvo'), (u'kom\u0161iluka', u'susjedstva'), (u'kom\u0161iluku', u'susjedstvu'), (u'kom\u0161ije', u'susjedi'), (u'kom\u0161ijama', u'susjedima'), (u'kom\u0161inica', u'susjeda'), (u'kom\u0161inicu', u'susjedu'), (u'konektovan', u'spojen'), (u'konektovati', u'spojiti'), (u'kontroli\u0161u', u'kontroliraju'), (u'Kontroli\u0161u', u'Kontroliraju'), (u'Kontroli\u0161i', u'Kontroliraj'), (u'kontroli\u0161i', u'kontroliraj'), (u'Kontroli\u0161ite', u'Kontrolirajte'), (u'kontroli\u0161ite', u'kontrolirajte'), (u'korpu', u'ko\u0161aru'), (u'kritikuju', u'kritiziraju'), (u'krsta', u'kri\u017ea'), (u'krsta\u0161i', u'kri\u017eari'), (u'krstu', u'kri\u017eu'), (u'krsti\u0107a', u'kri\u017ei\u0107a'), (u'krsti\u0107u', u'kri\u017ei\u0107u'), (u'Krsta', u'Kri\u017ea'), (u'Krstu', u'Kri\u017eu'), (u'Krsti\u0107a', u'Kri\u017ei\u0107a'), (u'Krsti\u0107u', u'Kri\u017ei\u0107u'), (u'krstom', u'kri\u017eem'), (u'krstove', u'kri\u017eeve'), (u'Krstove', u'Kri\u017eeve'), (u'krstovima', u'kri\u017eevima'), (u'Krstovima', u'Kri\u017eevima'), (u'kri\u017eom', u'kri\u017eem'), (u'kupatilo', u'kupaona'), (u'kupatilu', u'kupaoni'), (u'kvalifikuju', u'kvalificiraju'), (u'la\u017eeju', u'la\u017eu'), (u'La\u017eov', u'La\u017eljivac'), (u'la\u017eov', u'la\u017eljivac'), (u'la\u017eovi', u'la\u017eljivci'), (u'la\u017eovu', u'la\u017eljivcu'), (u'la\u017eovima', u'la\u017eljivcima'), (u'la\u017eovom', u'la\u017eljivcem'), (u'lebdeo', u'lebdio'), (u'le\u010di', u'lije\u010di'), (u'le\u010de', u'lije\u010de'), (u'lje\u010di', u'lije\u010di'), (u'Le\u010di', u'Lije\u010di'), (u'Lje\u010di', u'Lije\u010di'), (u'Lejn', u'Lane'), (u'Lenja', u'Lijena'), (u'lenji', u'lijeni'), (u'lenja', u'lijena'), (u'le\u0161nik', u'lje\u0161njak'), (u'Leta', u'Ljeta'), (u'leto', u'ljeto'), (u'Leto', u'Ljeto'), (u'letos', u'ljetos'), (u'letiti', u'letjeti'), (u'leve', u'lijeve'), (u'lo\u017ei', u'pali'), (u'lza', u'Iza'), (u'ljepiti', u'lijepiti'), (u'ljepili', u'lijepili'), (u'magnezijuma', u'magnezija'), (u'magnezijumu', u'magneziju'), (u'maja', u'svibnja'), (u'maju', u'svibnju'), (u'majem', u'svibnjem'), (u'majca', u'majica'), (u'majce', u'majice'), (u'majcu', u'majicu'), (u'majcom', u'majicom'), (u'Malopre', u'Malo prije'), (u'malopre', u'malo prije'), (u'maloprije', u'malo prije'), (u'manifestuje', u'manifestira'), (u'manifestuju', u'manifestiraju'), (u'marta', u'o\u017eujka'), (u'martu', u'o\u017eujku'), (u'martom', u'o\u017eujkom'), (u'mehur', u'mjehur'), (u'menom', u'mnom'), (u'mera\u010d', u'mjera\u010d'), (u'meri', u'mjeri'), (u'mere', u'mjere'), (u'merdevine', u'ljestve'), (u'merdevinama', u'ljestvama'), (u'merljivo', u'mjerljivo'), (u'me\u0161ane', u'mije\u0161ane'), (u'me\u0161avina', u'mje\u0161avina'), (u'me\u0161avine', u'mje\u0161avine'), (u'me\u0161avinu', u'mje\u0161avinu'), (u'minut', u'minutu'), (u'mleo', u'mljeo'), (u'mo\u010d', u'mo\u0107'), (u'mofu', u'mogu'), (u'momenat', u'trenutak'), (u'momenta', u'trena'), (u'muzejem', u'muzejom'), (u'muzici', u'glazbi'), (u'muzika', u'glazba'), (u'muzike', u'glazbe'), (u'muzikom', u'glazbom'), (u'Muzika', u'Glazba'), (u'Muzike', u'Glazbe'), (u'Muzikom', u'Glazbom'), (u'na\u010di', u'na\u0107i'), (u'nadevati', u'nadijevati'), (u'naduvan', u'napu\u0161en'), (u'najpre', u'najprije'), (u'Najpre', u'Najprije'), (u'najzad', u'napokon'), (u'nanev\u0161i', u'nanjev\u0161i'), (u'nanjeli', u'nanijeli'), (u'napastvuje', u'napastuje'), (u'Napolje', u'Van'), (u'napolje', u'van'), (u'Napolju', u'Vani'), (u'napolju', u'vani'), (u'nauka', u'znanost'), (u'Nauka', u'Znanost'), (u'nauci', u'znanosti'), (u'nazad', u'natrag'), (u'Nazad', u'Natrag'), (u'napred', u'naprijed'), (u'Napred', u'Naprijed'), (u'naprimjer', u'na primjer'), (u'naseo', u'nasjeo'), (u'nasesti', u'nasjesti'), (u'nasre\u0107u', u'na sre\u0107u'), (u'nebi', u'ne bi'), (u'nebih', u'ne bih'), (u'Nebi', u'Ne bi'), (u'Nebih', u'Ne bih'), (u'nebismo', u'ne bismo'), (u'Nebismo', u'Ne bismo'), (u'nebiste', u'ne biste'), (u'Nebiste', u'Ne biste'), (u'nedaj', u'ne daj'), (u'negde', u'negdje'), (u'Negde', u'Negdje'), (u'neguje', u'njeguje'), (u'neguju', u'njeguju'), (u'nekto', u'netko'), (u'nemi', u'nijemi'), (u'nemrem', u'ne mogu'), (u'nemogu', u'ne mogu'), (u'Nemogu', u'Ne mogu'), (u'nemora', u'ne mora'), (u'Nemora', u'Ne mora'), (u'nene', u'njene'), (u'ne\u0161o', u'ne\u0161to'), (u'nevesta', u'nevjesta'), (u'nevreme', u'nevrijeme'), (u'nezi', u'njezi'), (u'niasm', u'nisam'), (u'nigde', u'nigdje'), (u'Nigde', u'Nigdje'), (u'nikakave', u'nikakve'), (u'niko', u'nitko'), (u'Niko', u'Nitko'), (u'nisma', u'nisam'), (u'Nisma', u'Nisam'), (u'ne\u0107\u0161', u'ne\u0107e\u0161'), (u'nejde', u'ne ide'), (u'Nejde', u'Ne ide'), (u'neda', u'ne da'), (u'nedam', u'ne dam'), (u'negujem', u'njegujem'), (u'njegi', u'njezi'), (u'ne\u017eeli', u'ne \u017eeli'), (u'niej', u'nije'), (u'nili', u'niti'), (u'njie', u'nije'), (u'njem', u'nijem'), (u'njeme', u'njene'), (u'nominovan', u'nominiran'), (u'nsiam', u'nisam'), (u'nteko', u'netko'), (u'obe', u'obje'), (u'Obe', u'Obje'), (u'obema', u'objema'), (u'Obezbe\u0111uju', u'Osiguravaju'), (u'obezbe\u0111uju', u'osiguravaju'), (u'objekat', u'objekt'), (u'oblast', u'podru\u010dje'), (u'oblastima', u'podru\u010djima'), (u'oblasti', u'podru\u010dj*'), (u'obolelu', u'oboljelu'), (u'obo\u017eavalac', u'obo\u017eavatelj'), (u'obu\u010di', u'obu\u0107i'), (u'obuhvata', u'obuhva\u0107a'), (u'odandje', u'odande'), (u'odavdje', u'odavde'), (u'Odavdje', u'Odavde'), (u'odbi\u0107e\u0161', u'odbit \u0107e\u0161'), (u'odbi\u0107emo', u'odbit \u0107emo'), (u'odela', u'odjela'), (u'odelu', u'odjelu'), (u'odelenja', u'odjela'), (u'odelenje', u'odjel'), (u'odelenju', u'odjelu'), (u'odeljak', u'odjeljak'), (u'odeljenje', u'odjel'), (u'Odeljenje', u'Odjel'), (u'odjeljenje', u'odjel'), (u'Odjeljenje', u'Odjel'), (u'odeljenjem', u'odjelom'), (u'odma', u'odmah'), (u'Odne\u0107u', u'Odnijet \u0107u'), (u'odne\u0107u', u'odnijet \u0107u'), (u'odne\u0107e', u'odnijet \u0107e'), (u'odoliti', u'odoljeti'), (u'odneti', u'odnijeti'), (u'odseo', u'odsjeo'), (u'odsela', u'odsjela'), (u'odsesti', u'odsjesti'), (u'odupreti', u'oduprijeti'), (u'oduvek', u'oduvijek'), (u'Oduvek', u'Oduvijek'), (u'oduvjek', u'oduvijek'), (u'Oduvjek', u'Oduvijek'), (u'ogladneo', u'ogladnio'), (u'okoreli', u'okorjeli'), (u'organizuju', u'organiziraju'), (u'Organizuju', u'Organiziraju'), (u'osje\u0107anja', u'osje\u0107aje'), (u'osmehe', u'osmijehe'), (u'osmehne', u'osmjehne'), (u'osmehnu', u'osmjehnu'), (u'osobenosti', u'osobnosti'), (u'ostareli', u'ostarjeli'), (u'ostrva', u'otoka'), (u'ostrvu', u'otoku'), (u'ostrvom', u'otokom'), (u'Ostrva', u'Otoka'), (u'Ostrvu', u'Otoku'), (u'Ostrvom', u'Otokom'), (u'ostrvima', u'otocima'), (u'osete', u'osjete'), (u'ostrvo', u'otok'), (u'Ostrvo', u'Otok'), (u'osvjetljen', u'osvijetljen'), (u'ovde', u'ovdje'), (u'Ovde', u'Ovdje'), (u'ovdej', u'ovdje'), (u'ovdije', u'ovdje'), (u'Ovdije', u'Ovdje'), (u'ovjde', u'ovdje'), (u'Ovjde', u'Ovdje'), (u'pakuje', u'pakira'), (u'Pakuje', u'Pakira'), (u'Pakuju', u'Pakiraju'), (u'pakuju', u'pakiraju'), (u'palatama', u'pala\u010dama'), (u'palate', u'pala\u010de'), (u'palatu', u'pala\u010du'), (u'palati', u'pala\u010di'), (u'pantalone', u'hla\u010de'), (u'Pantalone', u'Hla\u010de'), (u'pantalona', u'hla\u010da'), (u'pantalonama', u'hla\u010dama'), (u'par\u010de', u'komadi\u0107'), (u'par\u010deta', u'komadi\u0107a'), (u'par\u010detu', u'komadi\u0107u'), (u'par\u010detom', u'komadi\u0107em'), (u'parampar\u010dad', u'komadi\u0107i'), (u'pastuv', u'pastuh'), (u'pastuva', u'pastuha'), (u'pastuvu', u'pastuhu'), (u'pd', u'od'), (u'pemzija', u'penzija'), (u'pemziju', u'penziju'), (u'penzionerski', u'umirovljeni\u010dki'), (u'Penzionerski', u'Umirovljeni\u010dki'), (u'pertle', u'\u017enirance'), (u'pesama', u'pjesama'), (u'pesnicima', u'pjesnicima'), (u'pe\u0161ice', u'pje\u0161ice'), (u'Pe\u0161ice', u'Pje\u0161ice'), (u'pe\u0161ke', u'pje\u0161ke'), (u'plata', u'pla\u0107a'), (u'pla\u010da', u'pla\u0107a'), (u'platom', u'pla\u0107om'), (u'platu', u'pla\u0107u'), (u'pla\u010danje', u'pla\u0107anje'), (u'pla\u010danjem', u'pla\u0107anjem'), (u'pla\u0107e\u0161', u'pla\u010de\u0161'), (u'plen', u'plijen'), (u'Plen', u'Plijen'), (u'pljen', u'plijen'), (u'Pljen', u'Plijen'), (u'po\u010de\u0107u', u'po\u010det \u0107u'), (u'podjelimo', u'podijelimo'), (u'podnesti', u'podnijeti'), (u'podstreka\u010d', u'poticatelj'), (u'podsete', u'podsjete'), (u'poen', u'bod'), (u'poena', u'boda'), (u'poene', u'bodove'), (u'poeni', u'bodovi'), (u'Poeni', u'Bodovi'), (u'poenima', u'bodovima'), (u'poludili', u'poludjeli'), (u'poma\u0107i', u'pomaknuti'), (u'pomaknim', u'pomaknem'), (u'pomaknio', u'pomaknuo'), (u'pomakni\u0161', u'pomakne\u0161'), (u'pomakniti', u'pomaknuti'), (u'pomenu', u'spomenu'), (u'Pomera', u'Mi\u010de'), (u'pomera', u'mi\u010de'), (u'pomjera', u'pomi\u010de'), (u'pomerajte', u'mi\u010dite'), (u'pomjeri', u'pomakni'), (u'pomeraj', u'mi\u010di'), (u'pomjeraj', u'mi\u010di'), (u'pomeraju', u'mi\u010du'), (u'pomerala', u'micala'), (u'pomjerala', u'pomicala'), (u'pomjeraju', u'pomi\u010du'), (u'pomeranja', u'pomicanja'), (u'pomerati', u'micati'), (u'pomjerati', u'pomicati'), (u'pomeri\u0161', u'pomakne\u0161'), (u'ponaosob', u'osobno'), (u'ponesla', u'ponijela'), (u'Ponesla', u'Ponijela'), (u'pore\u0111enje', u'usporedba'), (u'pore\u0111enju', u'usporedbi'), (u'porekla', u'podrijetla'), (u'poreklo', u'podrijetlo'), (u'poreklu', u'podrijetlu'), (u'Porodica', u'Obitelj'), (u'Porodice', u'Obitelji'), (u'porodica', u'obitelj'), (u'porodice', u'obitelji'), (u'porodici', u'obitelji'), (u'porodicama', u'obiteljima'), (u'porodicom', u'obitelji'), (u'porodicu', u'obitelj'), (u'poslata', u'poslana'), (u'posle', u'poslije'), (u'Posle', u'Poslije'), (u'poslje', u'poslije'), (u'posredi', u'posrijedi'), (u'postara', u'pobrine'), (u'Postara\u0107u', u'Pobrinut \u0107u'), (u'postara\u0107u', u'pobrinut \u0107u'), (u'postaraj', u'pobrini'), (u'Postaraj', u'Pobrini'), (u'Postaraju', u'Pobrinu'), (u'postaraju', u'pobrinu'), (u'postarajmo', u'pobrinimo'), (u'postaramo', u'pobrinemo'), (u'postara\u0161', u'pobrine\u0161'), (u'povesne', u'povijesne'), (u'Povinuju', u'Pokoravaju'), (u'povinuju', u'pokoravaju'), (u'pozadi', u'iza'), (u'po\u017eeleo', u'po\u017eelio'), (u'Po\u017eeleo', u'Po\u017eelio'), (u'Po\u017eeljeo', u'Po\u017eelio'), (u'po\u017eeljeo', u'po\u017eelio'), (u'praktikuj', u'prakticiraj'), (u'praktikuju', u'prakticiraju'), (u'praktikovala', u'prakticirala'), (u'praktikovati', u'prakticirati'), (u'pre', u'prije'), (u'Pre', u'Prije'), (u'predela', u'predjela'), (u'predelu', u'predjelu'), (u'Pre\u0107i', u'Prije\u0107i'), (u'pre\u0107i', u'prije\u0107i'), (u'pre\u0107utkuje', u'pre\u0161u\u0107uje'), (u'predame', u'preda me'), (u'predamnom', u'preda mnom'), (u'Predamnom', u'Preda mnom'), (u'preformuli\u0161i', u'preformuliraj'), (u'preklo', u'porijeklo'), (u'preloma', u'prijeloma'), (u'Prene\u0107u', u'Prenijet \u0107u'), (u'prene\u0107u', u'prenijet \u0107u'), (u'prenos', u'prijenos'), (u'prenosa', u'prijenosa'), (u'prenosom', u'prijenosom'), (u'prenosu', u'prijenosu'), (u'preneo', u'prenio'), (u'Preneo', u'Prenio'), (u'prenela', u'prenijela'), (u'prenjela', u'prenijela'), (u'preneli', u'prenijeli'), (u'prenjeli', u'prenijeli'), (u'preneti', u'prenijeti'), (u'preporu\u010da', u'preporu\u010duje'), (u'prese\u0107i', u'presje\u0107i'), (u'preti', u'prijeti'), (u'prete', u'prijete'), (u'Prete', u'Prijete'), (u'prjeti', u'prijeti'), (u'prjete', u'prijete'), (u'prete\u0107im', u'prijete\u0107im'), (u'prete\u0107ih', u'prijete\u0107ih'), (u'pretrpeo', u'pretrpio'), (u'prevod', u'prijevod'), (u'Prevod', u'Prijevod'), (u'prezentovati', u'prezentirati'), (u'prezentovane', u'prezentirane'), (u'prezentovan', u'prezentiran'), (u'prezentovani', u'prezentirani'), (u'prezentovano', u'prezentirano'), (u'pridonjeti', u'pridonijeti'), (u'prijatan', u'ugodan'), (u'prime\u0107ivao', u'primje\u0107ivao'), (u'primedbi', u'primjedbi'), (u'primjete', u'primijete'), (u'prisetim', u'prisjetim'), (u'prisetio', u'prisjetio'), (u'prisetite', u'prisjetite'), (u'pritiskam', u'priti\u0161\u0107em'), (u'prmda', u'iako'), (u'procenat', u'postotak'), (u'procent', u'postotak'), (u'procenta', u'postotka'), (u'procenata', u'postotaka'), (u'procenti', u'postoci'), (u'Procenti', u'Postoci'), (u'procente', u'postotke'), (u'Procente', u'Postotke'), (u'procentu', u'postotku'), (u'Procentu', u'Postotku'), (u'procentima', u'postocima'), (u'prodato', u'prodano'), (u'prohte', u'prohtije'), (u'projekat', u'projekt'), (u'Projekat', u'Projekt'), (u'promijena', u'promjena'), (u'prosledili', u'proslijedili'), (u'protestvovat', u'protestirat'), (u'Protestvovat', u'Protestirat'), (u'Protestvujem', u'Protestiram'), (u'protestvujem', u'protestiram'), (u'protestvuju', u'protestiraju'), (u'protestuju\u0107i', u'protestiraju\u0107i'), (u'psihi\u0107ki', u'psihi\u010dki'), (u'pto', u'\u0161to'), (u'ptom', u'potom'), (u'punoletan', u'punoljetan'), (u'Punoletan', u'Punoljetan'), (u'ra\u010dunari', u'ra\u010dunala'), (u'ra\u010dunare', u'ra\u010dunala'), (u'radijo', u'radio'), (u'ra\u0111e', u'radije'), (u'ranac', u'ruksak'), (u'rancu', u'ruksaku'), (u'rascep', u'rascjep'), (u'rasejan', u'rastresen'), (u'rasejana', u'rastresena'), (u'raspust', u'odmor'), (u'razbi\u0107u', u'razbit \u0107u'), (u'razbijesneo', u'razbjesnio'), (u'ra\u0161\u0107e', u'rast \u0107e'), (u'Razbi\u0107u', u'Razbit \u0107u'), (u'razdevi\u010de', u'razdjevi\u010de'), (u'razgovrati', u'razgovarati'), (u'razre\u0161i', u'razrije\u0161i'), (u'razume', u'razumije'), (u'razumeju', u'razumiju'), (u're\u010dju', u'rije\u010dju'), (u'Re\u010dju', u'Rije\u010dju'), (u'rje\u010dju', u'rije\u010dju'), (u'Rje\u010dju', u'Rije\u010dju'), (u'reagujte', u'reagirajte'), (u'redov', u'vojnik'), (u'redovu', u'vojniku'), (u're\u0111e', u'rje\u0111e'), (u're\u0111i', u'rje\u0111i'), (u'rejv', u'rave'), (u'rejvu', u'raveu'), (u'reko', u'rekao'), (u'rengen', u'rendgen'), (u'repuje\u0161', u'repa\u0161'), (u'resetuje', u'resetira'), (u'resetujte', u'resetirajte'), (u'Resetujte', u'Resetirajte'), (u'rije\u0111i', u'rje\u0111i'), (u'Rizikuj', u'Riskiraj'), (u'rizikuju', u'riskiraju'), (u'rizikuje', u'riskira'), (u'rizikujte', u'riskirajte'), (u'rje\u0161io', u'rije\u0161io'), (u'rokenrol', u"rock'n'roll"), (u'ronioc', u'ronilac'), (u'savije\u0161\u0107u', u'savje\u0161\u0107u'), (u'save\u0161\u0107u', u'savje\u0161\u0107u'), (u'secka', u'sjecka'), (u'seckam', u'sjeckam'), (u'sede\u0107e\u0161', u'sjedit \u0107e\u0161'), (u'sedeli', u'sjedili'), (u'sedi\u0161ta', u'sjedala'), (u'sedi\u0161te', u'sjedalo'), (u'sedi\u0161tu', u'sjedalu'), (u'sedni', u'sjedni'), (u'Sedni', u'Sjedni'), (u'sedi', u'sjedi'), (u'Sedi', u'Sjedi'), (u'sedite', u'sjedite'), (u'sesti', u'sjesti'), (u'sekire', u'sjekire'), (u'sekiraj', u'brini'), (u'sekiram', u'brinem'), (u'sekiramo', u'brinemo'), (u'sekira\u0161', u'brine\u0161'), (u'sekirate', u'brinete'), (u'sekirajte', u'brinite'), (u'seme', u'sjeme'), (u'sertan', u'sretan'), (u'Se\u0161\u0107u', u'Sjest \u0107u'), (u'se\u0161\u0107u', u'sjest \u0107u'), (u'sje\u0161\u0107emo', u'sjest \u0107emo'), (u'seta', u'sjeta'), (u'sigruno', u'sigurno'), (u'siguan', u'siguran'), (u'sija', u'sja'), (u'sijaju', u'sjaju'), (u'sir\u0107e', u'ocat'), (u'sir\u0107eta', u'octa'), (u'sir\u0107etu', u'octu'), (u'sje\u0161\u0107u', u'sjest \u0107u'), (u'sje\u0161\u0107e', u'sjest \u0107e'), (u'sle\u0107e', u'slije\u0107e'), (u'sle\u0107u', u'slije\u0107u'), (u'sle\u0107emo', u'slije\u0107emo'), (u'sleva', u'slijeva'), (u'se\u0107anjima', u'sje\u0107anjima'), (u'seo', u'sjeo'), (u'Seo', u'Sjeo'), (u'sem', u'osim'), (u'sma', u'sam'), (u'smao', u'samo'), (u'Smao', u'Samo'), (u'sme', u'smije'), (u'Sme', u'Smije'), (u'sme\u0107pm', u'sme\u0107em'), (u'smej', u'smij'), (u'Smejte', u'Smijte'), (u'smejte', u'smijte'), (u'smesta', u'smjesta'), (u'Smesta', u'Smjesta'), (u'smeste', u'smjeste'), (u'sme\u0161ak', u'smje\u0161ak'), (u'sme\u0161i', u'smije\u0161i'), (u'Sme\u0161i', u'Smije\u0161i'), (u'sme\u0161io', u'smije\u0161io'), (u'sme\u0161i\u0161', u'smije\u0161i\u0161'), (u'sme\u0161kom', u'smje\u0161kom'), (u'smjeo', u'smio'), (u'smrdeo', u'smrdio'), (u'sintersajzer', u'synthesizer'), (u'sitnisajzer', u'synthesizer'), (u'skelet', u'kostur'), (u'so\u010diva', u'le\u0107e'), (u'so\u010divima', u'le\u0107ama'), (u'so\u010divo', u'le\u0107a'), (u'so\u010divom', u'le\u0107om'), (u'so\u010divu', u'le\u0107i'), (u'Spakuj', u'Spakiraj'), (u'Spakujte', u'Spakirajte'), (u'spakujte', u'spakirajte'), (u'spasao', u'spasio'), (u'Spasao', u'Spasio'), (u'spasen', u'spa\u0161en'), (u'spasla', u'spasila'), (u'spasli', u'spasili'), (u'speluje', u'sri\u010de'), (u'speluju', u'sri\u010du'), (u'spoji\u0107e', u'spojit \u0107e'), (u'spolja', u'izvana'), (u'Sredi\u0107e', u'Sredit \u0107e'), (u'Sredi\u0107u', u'Sredit \u0107u'), (u'stabilizuju', u'stabiliziraju'), (u'starao', u'brinuo'), (u'starati', u'brinuti'), (u'Starati', u'Brinuti'), (u'steni', u'stijeni'), (u'stepen', u'stupanj'), (u'stepena', u'stupnjeva'), (u'stepeni', u'stupnjeva'), (u'stepenu', u'stupnju'), (u'sticati', u'stjecati'), (u'stiditi', u'stidjeti'), (u'streljamo', u'strijeljamo'), (u'streljati', u'strijeljati'), (u'stole\u0107a', u'stolje\u0107a'), (u'stobom', u's tobom'), (u'stvrano', u'stvarno'), (u'Stupi\u0107u', u'Stupit \u0107u'), (u'stupi\u0107u', u'stupit \u0107u'), (u'subjekat', u'subjekt'), (u'sudija', u'sudac'), (u'Sudija', u'Sudac'), (u'sudije', u'suca'), (u'sudiji', u'sucu'), (u'sudijo', u'su\u010de'), (u'sudiju', u'suca'), (u'sudijom', u'sucem'), (u'sudijskog', u'sudskog'), (u'sugeri\u0161u', u'predla\u017eu'), (u'sugeri\u0161e', u'predla\u017ee'), (u'supa', u'juha'), (u'supe', u'juhe'), (u'supi', u'juhi'), (u'supu', u'juhu'), (u'supom', u'juhom'), (u'supama', u'juhama'), (u'Supa', u'Juha'), (u'Supe', u'Juhe'), (u'Supi', u'Juhi'), (u'Supu', u'Juhu'), (u'Supom', u'Juhom'), (u'Supama', u'Juhama'), (u'surfuje', u'surfa'), (u'surfuje\u0161', u'surfa\u0161'), (u'surfuju', u'surfaju'), (u'su\u0161tina', u'bit'), (u'su\u0161tinski', u'bitni'), (u'suvom', u'suhom'), (u'suvog', u'suhog'), (u'suvoj', u'suhoj'), (u'Suvom', u'Suhom'), (u'Suvog', u'Suhog'), (u'Suvoj', u'Suhoj'), (u'suvim', u'suhim'), (u'Suvim', u'Suhim'), (u'svestan', u'svjestan'), (u'svjest', u'svijest'), (u'Svjest', u'Svijest'), (u'svjesti', u'svijesti'), (u'Svjesti', u'Svijesti'), (u'svetova', u'svjetova'), (u'svetove', u'svjetove'), (u'svugde', u'svugdje'), (u'\u0161olja', u'\u0161alica'), (u'\u0161olju', u'\u0161alicu'), (u'\u0160ta', u'\u0160to'), (u'\u0161tagod', u'\u0161to god'), (u'\u0161ta', u'\u0161to'), (u'\u0161tp', u'\u0161to'), (u'\u0161tampa', u'tisak'), (u'\u0161tampu', u'tisak'), (u'\u0161tampom', u'tiskom'), (u'\u0161tampi', u'tisku'), (u'\u0161tampati', u'tiskati'), (u'\u0160utje\u0107e', u'\u0160utjet \u0107e'), (u'tablu', u'plo\u010du'), (u'taguje', u'tagira'), (u'tako\u0111e', u'tako\u0111er'), (u'Tako\u0111e', u'Tako\u0111er'), (u'talas', u'val'), (u'Talas', u'Val'), (u'talasa', u'valova'), (u'talase', u'valove'), (u'talasi', u'valovi'), (u'Talasi', u'Valovi'), (u'talasima', u'valovima'), (u'Talasima', u'Valovima'), (u'te\u010dnost', u'teku\u0107ina'), (u'te\u010dnosti', u'teku\u0107ine'), (u'te\u010dno\u0161\u0107u', u'teku\u0107inom'), (u'tek\u0161o', u'te\u0161ko'), (u'Tek\u0161o', u'Te\u0161ko'), (u'terajte', u'tjerajte'), (u'te\u0161io', u'tje\u0161io'), (u'te\u0161i\u0161', u'tje\u0161i\u0161'), (u'tki', u'tko'), (u'to\u010dak', u'kota\u010d'), (u'To\u010dak', u'Kota\u010d'), (u'toha', u'toga'), (u'tovj', u'tvoj'), (u'trabam', u'trebam'), (u'trkanje', u'utrkivanje'), (u'trkanja', u'utrkivanja'), (u'trkao', u'utrkivao'), (u'trougao', u'trokut'), (u'trougla', u'trokuta'), (u'trouglu', u'trokutu'), (u'trouglove', u'trokute'), (u'trpeo', u'trpio'), (u'Trpeo', u'Trpio'), (u'tugi', u'tuzi'), (u'tvrtci', u'tvrtki'), (u'ubede', u'uvjere'), (u'Ube\u0111ivao', u'Uvjeravao'), (u'ube\u0111ivati', u'uvjeravati'), (u'ubje\u0111ivati', u'uvjeravati'), (u'ube\u0111uje', u'uvjerava'), (u'ube\u0111uje\u0161', u'uvjerava\u0161'), (u'ube\u0111uju', u'uvjeravaju'), (u'ubjediti', u'uvjeriti'), (u'u\u010dtivo', u'uljudno'), (u'u\u010dtivost', u'uljudnost'), (u'u\u010dtivo\u0161\u0107u', u'uljudno\u0161\u0107u'), (u'udata', u'udana'), (u'Udata', u'Udana'), (u'udatoj', u'udanoj'), (u'udeo', u'udio'), (u'ugljenik', u'ugljik'), (u'uliva', u'ulijeva'), (u'ulivali', u'ulijevali'), (u'ulivate', u'ulijevate'), (u'uljeva', u'ulijeva'), (u'ujutru', u'ujutro'), (u'Ukoliko', u'Ako'), (u'ukoliko', u'ako'), (u'ume', u'zna'), (u'umem', u'umijem'), (u'ume\u0161', u'umije\u0161'), (u'umesto', u'umjesto'), (u'Umesto', u'umjesto'), (u'umete', u'znate'), (u'umijesto', u'umjesto'), (u'Umijesto', u'Umjesto'), (u'umetninama', u'umjetninama'), (u'umreti', u'umrijeti'), (u'Umret', u'Umrijet'), (u'umrije\u0107e\u0161', u'umrijet \u0107e\u0161'), (u'umrije\u0107ete', u'umrijet \u0107ete'), (u'Une\u0107u', u'Unijet \u0107u'), (u'univerzitet', u'sveu\u010dili\u0161te'), (u'univerzitetu', u'sveu\u010dili\u0161tu'), (u'Uop\u0161te', u'Uop\u0107e'), (u'uop\u0161te', u'uop\u0107e'), (u'uop\u010de', u'uop\u0107e'), (u'upustva', u'uputstva'), (u'uprkos', u'usprkos'), (u'Uprkos', u'Usprkos'), (u'uradio', u'u\u010dinio'), (u'Uredu', u'U redu'), (u'uspe', u'uspije'), (u'Uspe', u'Uspije'), (u'uspeo', u'uspio'), (u'Uspeo', u'Uspio'), (u'uspe\u0107e\u0161', u'uspjet \u0107e\u0161'), (u'uspje\u0107e\u0161', u'uspjet \u0107e\u0161'), (u'uspe\u0107emo', u'uspjet \u0107emo'), (u'uspe\u0161', u'uspije\u0161'), (u'uspeju', u'uspiju'), (u'uspjevala', u'uspijevala'), (u'uspijo', u'uspio'), (u'u sred', u'usred'), (u'usled', u'uslijed'), (u'Usled', u'Uslijed'), (u'usledila', u'uslijedila'), (u'usljed', u'uslijed'), (u'Usljed', u'Uslijed'), (u'u\u0161unjate', u'u\u0161uljate'), (u'utehe', u'utjehe'), (u'uve\u010de', u'nave\u010der'), (u'uvek', u'uvijek'), (u'Uvek', u'Uvijek'), (u'uvjek', u'uvijek'), (u'Uvjek', u'Uvijek'), (u'uvijet', u'uvjet'), (u'uvijeti', u'uvjeti'), (u'uvijetima', u'uvjetima'), (u'uva', u'uha'), (u'Uva', u'Uha'), (u'uvo', u'uho'), (u'Uvo', u'Uho'), (u'uvom', u'uhom'), (u'Uvom', u'Uhom'), (u'uvu', u'uhu'), (u'Uvu', u'Uhu'), (u'vaistinu', u'uistinu'), (u'Vaistinu', u'Uistinu'), (u'vajar', u'kipar'), (u'vakcini\u0161e', u'cijepi'), (u'varnica', u'iskra'), (u'varnicu', u'iskru'), (u'vaspitala', u'odgojila'), (u'vaspitavan', u'odgajan'), (u'vaspitavanju', u'odgoju'), (u'va\u0161ljivi', u'u\u0161ljivi'), (u'va\u017ei', u'vrijedi'), (u've\u010dan', u'vje\u010dan'), (u've\u0107ati', u'vije\u0107ati'), (u'vek', u'stolje\u0107e'), (u'veka', u'stolje\u0107a'), (u'veke', u'vijeke'), (u'vekova', u'stolje\u0107a'), (u'venca', u'vijenca'), (u've\u010dnost', u'vje\u010dnost'), (u'veoma', u'vrlo'), (u'Veoma', u'Vrlo'), (u'vera', u'vjera'), (u'vere', u'vjere'), (u'veri', u'vjeri'), (u'verom', u'vjerom'), (u'veru', u'vjeru'), (u'veran', u'vjeran'), (u'verama', u'vjerama'), (u'Vera', u'Vjera'), (u'Vere', u'Vjere'), (u'Veri', u'Vjeri'), (u'Verom', u'Vjerom'), (u'Veru', u'Vjeru'), (u'Veran', u'Vjeran'), (u'Verama', u'Vjerama'), (u'veren', u'zaru\u010den'), (u'Veren', u'Zaru\u010den'), (u'verena', u'zaru\u010dena'), (u'vereni', u'zaru\u010deni'), (u'verimo', u'zaru\u010dimo'), (u'vest', u'vijest'), (u'Vest', u'Vijest'), (u'vesti', u'vijesti'), (u'Vesti', u'Vijesti'), (u'Vjesti', u'Vijesti'), (u'vjesti', u'vijesti'), (u'vestima', u'vijestima'), (u'Vestima', u'Vijestima'), (u'vjestima', u'vijestima'), (u'Vjestima', u'Vijestima'), (u've\u0161ala', u'vje\u0161ala'), (u've\u0161\u0107u', u'vije\u0161\u0107u'), (u've\u0161u', u'rublju'), (u'vide\u0161e', u'vidje\u0161e'), (u'vidjeo', u'vidio'), (u'Vidjeo', u'Vidio'), (u'vjerojatno\u0107a', u'vjerojatnost'), (u'vje\u0161\u0107u', u'vije\u0161\u0107u'), (u'vlo', u'vrlo'), (u'Vodi\u0107e', u'Vodit \u0107e'), (u'Vodi\u0107u', u'Vodit \u0107u'), (u'voliti', u'voljeti'), (u'vredelo', u'vrijedilo'), (u'vrednom', u'vrijednom'), (u'vrednog', u'vrijednog'), (u'vreme', u'vrijeme'), (u'Vreme', u'Vrijeme'), (u'vrjeme', u'vrijeme'), (u'Vrjeme', u'Vrijeme'), (u'vrteo', u'vrtio'), (u'vrvela', u'vrvjela'), (u'whiskey', u'viski'), (u'zaceljivanje', u'zacjeljivanje'), (u'zagreva', u'zagrijava'), (u'Zagreva', u'Zagrijava'), (u'Zagrevate', u'Zagrijavate'), (u'zagrevanje', u'zagrijavanje'), (u'zakunio', u'zakleo'), (u'zalepili', u'zalijepili'), (u'zalepiti', u'zalijepiti'), (u'zaliv', u'zaljev'), (u'zalivu', u'zaljevu'), (u'zanm', u'znam'), (u'zanma', u'zanima'), (u'zaplena', u'zapljena'), (u'zapleni', u'zaplijeni'), (u'zaplenu', u'zapljenu'), (u'zaspem', u'zaspim'), (u'zastareo', u'zastario'), (u'zauvek', u'zauvijek'), (u'Zauvek', u'Zauvijek'), (u'zauvjek', u'zauvijek'), (u'Zauvjek', u'Zauvijek'), (u'zavera', u'zavjera'), (u'zahtev', u'zahtjev'), (u'Zahtev', u'Zahtjev'), (u'zasede', u'zasjede'), (u'zasedi', u'zasjedi'), (u'zasedu', u'zasjedu'), (u'zatp', u'zato'), (u'Zatp', u'Zato'), (u'za\u017eeleo', u'za\u017eelio'), (u'Za\u017eeleo', u'Za\u017eelio'), (u'Za\u017eeljeo', u'Za\u017eelio'), (u'za\u017eeljeo', u'za\u017eelio'), (u'zbg', u'zbog'), (u'zdrvo', u'zdravo'), (u'Zdrvo', u'Zdravo'), (u'zlodela', u'zlodjela'), (u'zna\u0107i', u'zna\u010di'), (u'zvani\u010dan', u'slu\u017eben'), (u'zvezdom', u'zvijezdom'), (u'\u017eemo', u'\u0107emo'), (u'\u017eeleo', u'\u017eelio'), (u'\u017deleo', u'\u017delio'), (u'\u017deljeo', u'\u017delio'), (u'\u017eeljeo', u'\u017eelio'), (u'\u017diveo', u'\u017divio'), (u'\u017eiveo', u'\u017eivio'), (u'\u017emureo', u'\u017emirio'), (u'Abi', u'Abby'), (u'Alis', u'Alice'), (u'Ajk', u'Ike'), (u'Ajku', u'Ikeu'), (u'Ajrin', u'Irene'), (u'Ajris', u'Iris'), (u'Ajron', u'Iron'), (u'Ajvi', u'Ivy'), (u'An\u0111eles', u'Angeles'), (u'An\u0111elesa', u'Angelesa'), (u'An\u0111elesu', u'Angelesu'), (u'An\u0111elesom', u'Angelesom'), (u'Antoni', u'Anthony'), (u'Antoniju', u'Anthonyju'), (u'Ar\u010di', u'Archie'), (u'Beverli', u'Beverly'), (u'Bejker', u'Baker'), (u'Bitls', u'Beatles'), (u'Bitlsi', u'Beatlesi'), (u'Brid\u017eit', u'Bridget'), (u'Bri\u017eit', u'Brigitte'), (u'Bruks', u'Brooks'), (u'Dablin', u'Dublin'), (u'Dablina', u'Dublina'), (u'Dablinu', u'Dublinu'), (u'Dag', u'Doug'), (u'Darvin', u'Darwin'), (u'Darvina', u'Darwina'), (u'Darvinu', u'Darwinu'), (u'Darvinom', u'Darwinom'), (u'Dejv', u'Dave'), (u'Dejvi', u'Davie'), (u'Dejva', u'Davea'), (u'Dejvu', u'Daveu'), (u'Dejvom', u'Daveom'), (u'Den', u'Dan'), (u'Deril', u'Daryl'), (u'Dijaz', u'Diaz'), (u'Dru', u'Drew'), (u'\u0110eni', u'Jenny'), (u'\u0110o\u0161ua', u'Joshua'), (u'D\u017eejmi', u'Jamie'), (u'D\u017ead', u'Jude'), (u'D\u017eeri', u'Jerry'), (u'D\u017eerija', u'Jerryja'), (u'D\u017eo', u'Joe'), (u'D\u017eoel', u'Joel'), (u'D\u017eoelu', u'Joelu'), (u'D\u017eo\u0161', u'Josh'), (u'D\u017eo\u0161u', u'Joshu'), (u'D\u017eosi', u'Josie'), (u'D\u017eozi', u'Josie'), (u'D\u017ees', u'Jess'), (u'D\u017een', u'Jen'), (u'D\u017eej', u'Jay'), (u'D\u017eejn', u'Jane'), (u'D\u017eil', u'Jill'), (u'D\u017eodi', u'Jody'), (u'D\u017eud', u'Jude'), (u'D\u017euli', u'Julie'), (u'Ebi', u'Abby'), (u'Ejb', u'Abe'), (u'Ejba', u'Abea'), (u'Ejmi', u'Amy'), (u'Ejpril', u'April'), (u'Empajer', u'Empire'), (u'En\u0111el', u'Angel'), (u'End\u017ei', u'Angie'), (u'Entoni', u'Anthony'), (u'E\u0161ford', u'Ashford'), (u'E\u0161forda', u'Ashforda'), (u'E\u0161li', u'Ashley'), (u'Fibi', u'Phoebe'), (u'Filovo', u'Philovo'), (u'Flober', u'Flaubert'), (u'Fokner', u'Faulkner'), (u'Fren', u'Fran'), (u'Gre\u010den', u'Gretchen'), (u'Grejs', u'Grace'), (u'Hadson', u'Hudson'), (u'Hadsonu', u'Hudsonu'), (u'Hant', u'Hunt'), (u'Hemingvej', u'Hemingway'), (u'Henk', u'Hank'), (u'Hejstings', u'Hastings'), (u'Hju', u'Hugh'), (u'Hjua', u'Hugha'), (u'Hjuz', u'Hughes'), (u'Hjuza', u'Hughesa'), (u'Hjuston', u'Houston'), (u'Hjustonu', u'Houstonu'), (u'Igo', u'Hugo'), (u'Ilejn', u'Elaine'), (u'\u017didovin', u'\u017didov'), (u'Johni', u'Johnny'), (u'Jud\u017ein', u'Eugene'), (u'Kasl', u'Castle'), (u'Kejd\u017e', u'Cage'), (u'Kejn', u'Kane'), (u'Kejsi', u'Casey'), (u'Kejti', u'Katie'), (u'Keren', u'Karen'), (u'Kerol', u'Carol'), (u'Kerolajn', u'Caroline'), (u'Klajv', u'Clive'), (u'Klajva', u'Clivea'), (u'Klajve', u'Clive'), (u'Klajvu', u'Cliveu'), (u'Klarens', u'Clarence'), (u'Kler', u'Claire'), (u'Kloi', u'Chloe'), (u'Klod', u'Claude'), (u'Klode', u'Claude'), (u'Kol', u'Cole'), (u'Kolins', u'Collins'), (u'Kortni', u'Courtney'), (u'Krej?g', u'Craig'), (u'Kristi', u'Christie'), (u'Lajf', u'Life'), (u'Lajl', u'Lile'), (u'Lejk', u'Lake'), (u'Lorejn', u'Loraine'), (u'Lorens', u'Lawrence'), (u'Lusi', u'Lucy'), (u'Majk', u'Mike'), (u'Majkeve', u'Mikeove'), (u'Majlo', u'Milo'), (u'Maslou', u'Maslow'), (u'Medlin', u'Madelaine'), (u'Medelin', u'Madeline'), (u'Mejbel', u'Mabel'), (u'Mejn', u'Maine'), (u'Mejna', u'Mainea'), (u'Mejnu', u'Maineu'), (u'Mejnom', u'Maineom'), (u'Mejpls', u'Maples'), (u'Mejsi', u'Maisy'), (u'Mek', u'Mac'), (u'Merilend', u'Maryland'), (u'Mi\u010del', u'Mitchell'), (u'Nensi', u'Nancy'), (u'Ni\u010de', u'Nietzsche'), (u'Ni\u010dea', u'Nietzschea'), (u'Ni\u010deu', u'Nietzscheu'), (u'Ni\u010deom', u'Nietzscheom'), (u'Odri', u'Audrey'), (u'Ohajo', u'Ohio'), (u'Ohaja', u'Ohia'), (u'Ohaju', u'Ohiu'), (u'Olbrajt', u'Albright'), (u"O'Nil", u"O'Neal"), (u'Orlins', u'Orleans'), (u'Orlinsa', u'Orleansa'), (u'Orlinsu', u'Orleansu'), (u'Pem', u'Pam'), (u'Pejd\u017e', u'Paige'), (u'Red\u017ei', u'Reggie'), (u'Red\u017einald', u'Reginald'), (u'Rej', u'Ray'), (u'Rej\u010del', u'Rachel'), (u'Ri\u010d', u'Rich'), (u'Rouz', u'Rose'), (u'Sendi', u'Sandy'), (u'Sidnej', u'Sidney'), (u'Sindi', u'Cindy'), (u'Sojer', u'Sawyer'), (u'Sojeru', u'Sawyeru'), (u'Sole', u'Saule'), (u'Stejsi', u'Stacy'), (u'Stoun', u'Stone'), (u'\u0160eron', u'Sharon'), (u'\u0160eril', u'Cheryl'), (u'\u0160irli', u'Shirley'), (u'\u0160paniji', u'\u0160panjolskoj'), (u'Tajms', u'Times'), (u'Tejlor', u'Taylor'), (u'Vajlder', u'Wilder'), (u'Val\u0161', u'Walsh'), (u'Vins', u'Vince'), (u'Voren', u'Warren'), (u'Vud', u'Wood'), (u'\u017dak', u'Jacques'), (u'\u017dil', u'Jules'), (u'januar', u'sije\u010danj'), (u'Januar', u'Sije\u010danj'), (u'februar', u'velja\u010da'), (u'februara', u'velja\u010de'), (u'februaru', u'velja\u010di'), (u'Februar', u'Velja\u010da'), (u'Februara', u'Velja\u010de'), (u'Februaru', u'Velja\u010di'), (u'mart', u'o\u017eujak'), (u'Mart', u'O\u017eujak'), (u'april', u'travanj'), (u'April', u'Travanj'), (u'maj', u'svibanj'), (u'Maj', u'Svibanj'), (u'svibnjom', u'svibnjem'), (u'jun', u'lipanj'), (u'juna', u'lipnja'), (u'junu', u'lipnju'), (u'Jun', u'Lipanj'), (u'Juni', u'Lipanj'), (u'juli', u'srpanj'), (u'jula', u'srpnja'), (u'julu', u'srpnju'), (u'Juli', u'Srpanj'), (u'septembar', u'rujan'), (u'Septembar', u'Rujan'), (u'oktobar', u'listopad'), (u'Oktobar', u'Listopad'), (u'oktobra', u'listopada'), (u'oktobru', u'listopadu'), (u'novembar', u'studeni'), (u'november', u'studeni'), (u'novembra', u'studenog'), (u'novembru', u'studenom'), (u'Novembar', u'Studeni'), (u'November', u'Studeni'), (u'Novembra', u'Studenog'), (u'Novembru', u'Studenom'), (u'decembar', u'prosinac'), (u'Decembar', u'Prosinac')]), + 'pattern': u"(?um)(\\b|^)(?:advokati|Advokati|advokatima|Advokatima|afirmi\\\u0161e|akcenat|akcionara|akvarijum|akvarijumu|amin|Amin|ans|apsorbovanje|apsorbuje|azot|ba\\\u0161ta|Ba\\\u0161ta|ba\\\u0161te|Ba\\\u0161te|ba\\\u0161ti|ba\\\u0161tu|Ba\\\u0161tu|ba\\\u0161tom|bedan|bede|bedi|bejah|bejahu|bele\\\u0161ci|be\\\u0161ike|bebisiterka|beg|begu|begstva|beja\\\u0161e|bekstvo|bekstvu|begstvu|bes|besa|besan|besom|besu|be\\\u0161e|bimso|blije\\\u0111i|bioje|bi\\ smo|bi\\ ste|bioskop|bioskopi|bitci|bled|blede|boksuje\\\u0161|bolesan|bolila|bori\\\u0107e\\\u0161|Bori\\\u0107e\\\u0161|braon|bregu|bti|cedilu|ceo|Ceo|cepa|cev|cevi|cjevi|cevima|Cevi|Cjevi|Cevima|Cjevima|cev\\\u010dica|cev\\\u010dicu|cutanje|\\\u010dutanje|\\\u0107utanje|Cutanje|\\\u010cutanje|\\\u0106utanje|cutanjem|\\\u010dutanjem|\\\u0107utanjem|Cutanjem|\\\u010cutanjem|\\\u0106utanjem|cvetaju|cvetove|cvetu|cvjetu|cvetalo|cvjetom|\\\u010cakom|\\\u010dar\\\u0161av|\\\u010dar\\\u0161ave|\\\u010dar\\\u0161avi|\\\u010dar\\\u0161avima|\\\u010das|\\\u010detvoro|\\\u010cita\\\u0107u|\\\u010derku|\\\u010cerku|\\\u0107erku|\\\u0106erku|\\\u0107erkama|\\\u010derkama|\\\u0107erkom|\\\u010derkom|k\\\u0107erkom|k\\\u010derkom|\\\u010cu|\\\u010ce\\\u0161|\\\u010ce|\\\u010cemo|\\\u010cete|\\\u010du|\\\u010de\\\u0161|\\\u010de|\\\u010demo|\\\u010dete|\\\u0107ebe|\\\u0107ebetu|\\\u010dk|\\\u0107\\\u0161|\\\u0107ale|\\\u0107aletom|\\\u0107aleta|\\\u0107aletu|\\\u0107orsokak|\\\u0107orsokaku|\\\u0107o\\\u0161ak|\\\u0107o\\\u0161ku|\\\u0107erka|\\\u0106erka|\\\u0107mo|\\\u0107te|\\\u010du\\\u0107e|\\\u010du\\\u0107emo|\\\u010cu\\\u0107emo|\\\u010cu\\\u0107ete|\\\u010cu\\\u0107e|\\\u0107uo|\\\u0107utao|\\\u0106utao|\\\u0107ute|\\\u0106ute|cvetova|daga|damas|date|deda|Deda|dede|dedi|dedom|defini\\\u0161e|dejstvo|Dejstvo|dejstvom|Dejstvom|dele\\\u0107i|deo|Deo|de\\\u0161ava|dete|Dete|diluje|diluju|diskutuje|Diskutuje|diskutujemo|Diskutujemo|djete|Djete|detektuje|dodju|dole|Dole|donijeo|Donijeo|Donije\\\u0107u|dosledan|dospeo|dospeju|do\\\u0111avola|Do\\\u0111avola|drug|drugari|drugare|drug\\\u010diji|drugde|duuga|duvana|dve|Dve|dvema|\\\u0111avo|\\\u0111avola|\\\u0111emper|d\\\u017eanki|d\\\u017eelat|\\\u0111ubre|efekat|eksperata|eksperti|Eksperti|ekspertima|en|emitovao|emitovati|emituje|emitujem|Emitujem|emituju|evra|familija|Familija|familiju|Familiju|familijama|familiji|flertuje|foka|foku|foke|fokama|fotografi\\\u0161u|gasova|gde|Gde|gluhonem|gre\\\u0161e|grje\\\u0161e|gre\\\u0161i|grje\\\u0161i|gre\\\u0161ki|grijehova|grijehove|hipnotisao|hipnotisana|hipnoti\\\u0161e|Historija|Historiju|Historije|Historiji|Istorija|Istoriju|Istorije|Istoriji|historije|historiji|istorije|istoriji|istorijom|hakuje|Hakuje|hakujemo|Hakujemo|Hakuju|hakuju|ho\\\u010du|Ho\\\u010du|hte\\\u0107e|htedoh|Htjeo|Hteo|htjeo|hteo|i\\\u010di|I\\\u010di|iko|ignori\\\u0161i|Ignori\\\u0161i|ignori\\\u0161ite|Ignori\\\u0161ite|ignori\\\u0161u|ilustruju|inspirisao|interesantan|Interesantan|interesuje|Interesuje|interesujemo|Interesujemo|interesujete|Interesujete|Interesuju|interesuju|isekao|isterao|istera\\\u0161|Istera\\\u0161|istrebi|istrebiti|isuvi\\\u0161e|ivica|ivice|ivici|ivicu|izduvaj|izduvamo|izoluje|izolujemo|izoluje\\\u0161|Izolujete|Izolujte|izolujte|izgladneo|izmeriti|izmerio|izme\\\u0161ane|izneo|izneti|izvestan|izvinem|izvine\\\u0161|Izvinem|Izvine\\\u0161|izvinim|izvini\\\u0161|izviniti|izvinjenje|izvinjenja|izvinjenju|jedamput|jelda|Je\\\u0161\\\u0107emo|Je\\\u0161\\\u0107e\\\u0161|je\\\u0161\\\u0107e|je\\\u0161\\\u0107u|Je\\\u0161\\\u0107u|je\\\u0161\\\u0107e\\\u0161|je\\\u0161\\\u0107emo|ju\\\u010de|Ju\\\u010de|kakava|kampovao|kampuje|kampujemo|kampuju|kancelarija|kancelarijama|kancelariju|Kancelarija|Kancelariju|kancelariji|kancelarije|kancelarijom|kancera|kandidovati|kandidujem|kapar|kapra|karmin|karminom|k\\\u0107erci|k\\\u0107erka|k\\\u010derka|K\\\u0107erka|K\\\u010derka|k\\\u0107erkama|ker|Ker|kerova|kidnapovan|Kidnapovan|kiji|kijim|klasifikuju|kle\\\u0161ta|klje\\\u0161ta|Ko|koa|koaj|kola|kolima|komandni|kombinuju|kompanija|komponovao|kom\\\u0161ija|kom\\\u0161iji|kom\\\u0161iju|kom\\\u0161iluk|kom\\\u0161iluka|kom\\\u0161iluku|kom\\\u0161ije|kom\\\u0161ijama|kom\\\u0161inica|kom\\\u0161inicu|konektovan|konektovati|kontroli\\\u0161u|Kontroli\\\u0161u|Kontroli\\\u0161i|kontroli\\\u0161i|Kontroli\\\u0161ite|kontroli\\\u0161ite|korpu|kritikuju|krsta|krsta\\\u0161i|krstu|krsti\\\u0107a|krsti\\\u0107u|Krsta|Krstu|Krsti\\\u0107a|Krsti\\\u0107u|krstom|krstove|Krstove|krstovima|Krstovima|kri\\\u017eom|kupatilo|kupatilu|kvalifikuju|la\\\u017eeju|La\\\u017eov|la\\\u017eov|la\\\u017eovi|la\\\u017eovu|la\\\u017eovima|la\\\u017eovom|lebdeo|le\\\u010di|le\\\u010de|lje\\\u010di|Le\\\u010di|Lje\\\u010di|Lejn|Lenja|lenji|lenja|le\\\u0161nik|Leta|leto|Leto|letos|letiti|leve|lo\\\u017ei|lza|ljepiti|ljepili|magnezijuma|magnezijumu|maja|maju|majem|majca|majce|majcu|majcom|Malopre|malopre|maloprije|manifestuje|manifestuju|marta|martu|martom|mehur|menom|mera\\\u010d|meri|mere|merdevine|merdevinama|merljivo|me\\\u0161ane|me\\\u0161avina|me\\\u0161avine|me\\\u0161avinu|minut|mleo|mo\\\u010d|mofu|momenat|momenta|muzejem|muzici|muzika|muzike|muzikom|Muzika|Muzike|Muzikom|na\\\u010di|nadevati|naduvan|najpre|Najpre|najzad|nanev\\\u0161i|nanjeli|napastvuje|Napolje|napolje|Napolju|napolju|nauka|Nauka|nauci|nazad|Nazad|napred|Napred|naprimjer|naseo|nasesti|nasre\\\u0107u|nebi|nebih|Nebi|Nebih|nebismo|Nebismo|nebiste|Nebiste|nedaj|negde|Negde|neguje|neguju|nekto|nemi|nemrem|nemogu|Nemogu|nemora|Nemora|nene|ne\\\u0161o|nevesta|nevreme|nezi|niasm|nigde|Nigde|nikakave|niko|Niko|nisma|Nisma|ne\\\u0107\\\u0161|nejde|Nejde|neda|nedam|negujem|njegi|ne\\\u017eeli|niej|nili|njie|njem|njeme|nominovan|nsiam|nteko|obe|Obe|obema|Obezbe\\\u0111uju|obezbe\\\u0111uju|objekat|oblast|oblastima|oblasti|obolelu|obo\\\u017eavalac|obu\\\u010di|obuhvata|odandje|odavdje|Odavdje|odbi\\\u0107e\\\u0161|odbi\\\u0107emo|odela|odelu|odelenja|odelenje|odelenju|odeljak|odeljenje|Odeljenje|odjeljenje|Odjeljenje|odeljenjem|odma|Odne\\\u0107u|odne\\\u0107u|odne\\\u0107e|odoliti|odneti|odseo|odsela|odsesti|odupreti|oduvek|Oduvek|oduvjek|Oduvjek|ogladneo|okoreli|organizuju|Organizuju|osje\\\u0107anja|osmehe|osmehne|osmehnu|osobenosti|ostareli|ostrva|ostrvu|ostrvom|Ostrva|Ostrvu|Ostrvom|ostrvima|osete|ostrvo|Ostrvo|osvjetljen|ovde|Ovde|ovdej|ovdije|Ovdije|ovjde|Ovjde|pakuje|Pakuje|Pakuju|pakuju|palatama|palate|palatu|palati|pantalone|Pantalone|pantalona|pantalonama|par\\\u010de|par\\\u010deta|par\\\u010detu|par\\\u010detom|parampar\\\u010dad|pastuv|pastuva|pastuvu|pd|pemzija|pemziju|penzionerski|Penzionerski|pertle|pesama|pesnicima|pe\\\u0161ice|Pe\\\u0161ice|pe\\\u0161ke|plata|pla\\\u010da|platom|platu|pla\\\u010danje|pla\\\u010danjem|pla\\\u0107e\\\u0161|plen|Plen|pljen|Pljen|po\\\u010de\\\u0107u|podjelimo|podnesti|podstreka\\\u010d|podsete|poen|poena|poene|poeni|Poeni|poenima|poludili|poma\\\u0107i|pomaknim|pomaknio|pomakni\\\u0161|pomakniti|pomenu|Pomera|pomera|pomjera|pomerajte|pomjeri|pomeraj|pomjeraj|pomeraju|pomerala|pomjerala|pomjeraju|pomeranja|pomerati|pomjerati|pomeri\\\u0161|ponaosob|ponesla|Ponesla|pore\\\u0111enje|pore\\\u0111enju|porekla|poreklo|poreklu|Porodica|Porodice|porodica|porodice|porodici|porodicama|porodicom|porodicu|poslata|posle|Posle|poslje|posredi|postara|Postara\\\u0107u|postara\\\u0107u|postaraj|Postaraj|Postaraju|postaraju|postarajmo|postaramo|postara\\\u0161|povesne|Povinuju|povinuju|pozadi|po\\\u017eeleo|Po\\\u017eeleo|Po\\\u017eeljeo|po\\\u017eeljeo|praktikuj|praktikuju|praktikovala|praktikovati|pre|Pre|predela|predelu|Pre\\\u0107i|pre\\\u0107i|pre\\\u0107utkuje|predame|predamnom|Predamnom|preformuli\\\u0161i|preklo|preloma|Prene\\\u0107u|prene\\\u0107u|prenos|prenosa|prenosom|prenosu|preneo|Preneo|prenela|prenjela|preneli|prenjeli|preneti|preporu\\\u010da|prese\\\u0107i|preti|prete|Prete|prjeti|prjete|prete\\\u0107im|prete\\\u0107ih|pretrpeo|prevod|Prevod|prezentovati|prezentovane|prezentovan|prezentovani|prezentovano|pridonjeti|prijatan|prime\\\u0107ivao|primedbi|primjete|prisetim|prisetio|prisetite|pritiskam|prmda|procenat|procent|procenta|procenata|procenti|Procenti|procente|Procente|procentu|Procentu|procentima|prodato|prohte|projekat|Projekat|promijena|prosledili|protestvovat|Protestvovat|Protestvujem|protestvujem|protestvuju|protestuju\\\u0107i|psihi\\\u0107ki|pto|ptom|punoletan|Punoletan|ra\\\u010dunari|ra\\\u010dunare|radijo|ra\\\u0111e|ranac|rancu|rascep|rasejan|rasejana|raspust|razbi\\\u0107u|razbijesneo|ra\\\u0161\\\u0107e|Razbi\\\u0107u|razdevi\\\u010de|razgovrati|razre\\\u0161i|razume|razumeju|re\\\u010dju|Re\\\u010dju|rje\\\u010dju|Rje\\\u010dju|reagujte|redov|redovu|re\\\u0111e|re\\\u0111i|rejv|rejvu|reko|rengen|repuje\\\u0161|resetuje|resetujte|Resetujte|rije\\\u0111i|Rizikuj|rizikuju|rizikuje|rizikujte|rje\\\u0161io|rokenrol|ronioc|savije\\\u0161\\\u0107u|save\\\u0161\\\u0107u|secka|seckam|sede\\\u0107e\\\u0161|sedeli|sedi\\\u0161ta|sedi\\\u0161te|sedi\\\u0161tu|sedni|Sedni|sedi|Sedi|sedite|sesti|sekire|sekiraj|sekiram|sekiramo|sekira\\\u0161|sekirate|sekirajte|seme|sertan|Se\\\u0161\\\u0107u|se\\\u0161\\\u0107u|sje\\\u0161\\\u0107emo|seta|sigruno|siguan|sija|sijaju|sir\\\u0107e|sir\\\u0107eta|sir\\\u0107etu|sje\\\u0161\\\u0107u|sje\\\u0161\\\u0107e|sle\\\u0107e|sle\\\u0107u|sle\\\u0107emo|sleva|se\\\u0107anjima|seo|Seo|sem|sma|smao|Smao|sme|Sme|sme\\\u0107pm|smej|Smejte|smejte|smesta|Smesta|smeste|sme\\\u0161ak|sme\\\u0161i|Sme\\\u0161i|sme\\\u0161io|sme\\\u0161i\\\u0161|sme\\\u0161kom|smjeo|smrdeo|sintersajzer|sitnisajzer|skelet|so\\\u010diva|so\\\u010divima|so\\\u010divo|so\\\u010divom|so\\\u010divu|Spakuj|Spakujte|spakujte|spasao|Spasao|spasen|spasla|spasli|speluje|speluju|spoji\\\u0107e|spolja|Sredi\\\u0107e|Sredi\\\u0107u|stabilizuju|starao|starati|Starati|steni|stepen|stepena|stepeni|stepenu|sticati|stiditi|streljamo|streljati|stole\\\u0107a|stobom|stvrano|Stupi\\\u0107u|stupi\\\u0107u|subjekat|sudija|Sudija|sudije|sudiji|sudijo|sudiju|sudijom|sudijskog|sugeri\\\u0161u|sugeri\\\u0161e|supa|supe|supi|supu|supom|supama|Supa|Supe|Supi|Supu|Supom|Supama|surfuje|surfuje\\\u0161|surfuju|su\\\u0161tina|su\\\u0161tinski|suvom|suvog|suvoj|Suvom|Suvog|Suvoj|suvim|Suvim|svestan|svjest|Svjest|svjesti|Svjesti|svetova|svetove|svugde|\\\u0161olja|\\\u0161olju|\\\u0160ta|\\\u0161tagod|\\\u0161ta|\\\u0161tp|\\\u0161tampa|\\\u0161tampu|\\\u0161tampom|\\\u0161tampi|\\\u0161tampati|\\\u0160utje\\\u0107e|tablu|taguje|tako\\\u0111e|Tako\\\u0111e|talas|Talas|talasa|talase|talasi|Talasi|talasima|Talasima|te\\\u010dnost|te\\\u010dnosti|te\\\u010dno\\\u0161\\\u0107u|tek\\\u0161o|Tek\\\u0161o|terajte|te\\\u0161io|te\\\u0161i\\\u0161|tki|to\\\u010dak|To\\\u010dak|toha|tovj|trabam|trkanje|trkanja|trkao|trougao|trougla|trouglu|trouglove|trpeo|Trpeo|tugi|tvrtci|ubede|Ube\\\u0111ivao|ube\\\u0111ivati|ubje\\\u0111ivati|ube\\\u0111uje|ube\\\u0111uje\\\u0161|ube\\\u0111uju|ubjediti|u\\\u010dtivo|u\\\u010dtivost|u\\\u010dtivo\\\u0161\\\u0107u|udata|Udata|udatoj|udeo|ugljenik|uliva|ulivali|ulivate|uljeva|ujutru|Ukoliko|ukoliko|ume|umem|ume\\\u0161|umesto|Umesto|umete|umijesto|Umijesto|umetninama|umreti|Umret|umrije\\\u0107e\\\u0161|umrije\\\u0107ete|Une\\\u0107u|univerzitet|univerzitetu|Uop\\\u0161te|uop\\\u0161te|uop\\\u010de|upustva|uprkos|Uprkos|uradio|Uredu|uspe|Uspe|uspeo|Uspeo|uspe\\\u0107e\\\u0161|uspje\\\u0107e\\\u0161|uspe\\\u0107emo|uspe\\\u0161|uspeju|uspjevala|uspijo|u\\ sred|usled|Usled|usledila|usljed|Usljed|u\\\u0161unjate|utehe|uve\\\u010de|uvek|Uvek|uvjek|Uvjek|uvijet|uvijeti|uvijetima|uva|Uva|uvo|Uvo|uvom|Uvom|uvu|Uvu|vaistinu|Vaistinu|vajar|vakcini\\\u0161e|varnica|varnicu|vaspitala|vaspitavan|vaspitavanju|va\\\u0161ljivi|va\\\u017ei|ve\\\u010dan|ve\\\u0107ati|vek|veka|veke|vekova|venca|ve\\\u010dnost|veoma|Veoma|vera|vere|veri|verom|veru|veran|verama|Vera|Vere|Veri|Verom|Veru|Veran|Verama|veren|Veren|verena|vereni|verimo|vest|Vest|vesti|Vesti|Vjesti|vjesti|vestima|Vestima|vjestima|Vjestima|ve\\\u0161ala|ve\\\u0161\\\u0107u|ve\\\u0161u|vide\\\u0161e|vidjeo|Vidjeo|vjerojatno\\\u0107a|vje\\\u0161\\\u0107u|vlo|Vodi\\\u0107e|Vodi\\\u0107u|voliti|vredelo|vrednom|vrednog|vreme|Vreme|vrjeme|Vrjeme|vrteo|vrvela|whiskey|zaceljivanje|zagreva|Zagreva|Zagrevate|zagrevanje|zakunio|zalepili|zalepiti|zaliv|zalivu|zanm|zanma|zaplena|zapleni|zaplenu|zaspem|zastareo|zauvek|Zauvek|zauvjek|Zauvjek|zavera|zahtev|Zahtev|zasede|zasedi|zasedu|zatp|Zatp|za\\\u017eeleo|Za\\\u017eeleo|Za\\\u017eeljeo|za\\\u017eeljeo|zbg|zdrvo|Zdrvo|zlodela|zna\\\u0107i|zvani\\\u010dan|zvezdom|\\\u017eemo|\\\u017eeleo|\\\u017deleo|\\\u017deljeo|\\\u017eeljeo|\\\u017diveo|\\\u017eiveo|\\\u017emureo|Abi|Alis|Ajk|Ajku|Ajrin|Ajris|Ajron|Ajvi|An\\\u0111eles|An\\\u0111elesa|An\\\u0111elesu|An\\\u0111elesom|Antoni|Antoniju|Ar\\\u010di|Beverli|Bejker|Bitls|Bitlsi|Brid\\\u017eit|Bri\\\u017eit|Bruks|Dablin|Dablina|Dablinu|Dag|Darvin|Darvina|Darvinu|Darvinom|Dejv|Dejvi|Dejva|Dejvu|Dejvom|Den|Deril|Dijaz|Dru|\\\u0110eni|\\\u0110o\\\u0161ua|D\\\u017eejmi|D\\\u017ead|D\\\u017eeri|D\\\u017eerija|D\\\u017eo|D\\\u017eoel|D\\\u017eoelu|D\\\u017eo\\\u0161|D\\\u017eo\\\u0161u|D\\\u017eosi|D\\\u017eozi|D\\\u017ees|D\\\u017een|D\\\u017eej|D\\\u017eejn|D\\\u017eil|D\\\u017eodi|D\\\u017eud|D\\\u017euli|Ebi|Ejb|Ejba|Ejmi|Ejpril|Empajer|En\\\u0111el|End\\\u017ei|Entoni|E\\\u0161ford|E\\\u0161forda|E\\\u0161li|Fibi|Filovo|Flober|Fokner|Fren|Gre\\\u010den|Grejs|Hadson|Hadsonu|Hant|Hemingvej|Henk|Hejstings|Hju|Hjua|Hjuz|Hjuza|Hjuston|Hjustonu|Igo|Ilejn|\\\u017didovin|Johni|Jud\\\u017ein|Kasl|Kejd\\\u017e|Kejn|Kejsi|Kejti|Keren|Kerol|Kerolajn|Klajv|Klajva|Klajve|Klajvu|Klarens|Kler|Kloi|Klod|Klode|Kol|Kolins|Kortni|Krej\\?g|Kristi|Lajf|Lajl|Lejk|Lorejn|Lorens|Lusi|Majk|Majkeve|Majlo|Maslou|Medlin|Medelin|Mejbel|Mejn|Mejna|Mejnu|Mejnom|Mejpls|Mejsi|Mek|Merilend|Mi\\\u010del|Nensi|Ni\\\u010de|Ni\\\u010dea|Ni\\\u010deu|Ni\\\u010deom|Odri|Ohajo|Ohaja|Ohaju|Olbrajt|O\\'Nil|Orlins|Orlinsa|Orlinsu|Pem|Pejd\\\u017e|Red\\\u017ei|Red\\\u017einald|Rej|Rej\\\u010del|Ri\\\u010d|Rouz|Sendi|Sidnej|Sindi|Sojer|Sojeru|Sole|Stejsi|Stoun|\\\u0160eron|\\\u0160eril|\\\u0160irli|\\\u0160paniji|Tajms|Tejlor|Vajlder|Val\\\u0161|Vins|Voren|Vud|\\\u017dak|\\\u017dil|januar|Januar|februar|februara|februaru|Februar|Februara|Februaru|mart|Mart|april|April|maj|Maj|svibnjom|jun|juna|junu|Jun|Juni|juli|jula|julu|Juli|septembar|Septembar|oktobar|Oktobar|oktobra|oktobru|novembar|november|novembra|novembru|Novembar|November|Novembra|Novembru|decembar|Decembar)(\\b|$)"}}, 'hun': {'BeginLines': {'data': OrderedDict(), 'pattern': None}, 'EndLines': {'data': OrderedDict(), @@ -96,6 +108,18 @@ 'pattern': None}, 'WholeWords': {'data': OrderedDict([(u'ls', u'Is'), (u'ln', u'In'), (u'lk', u'Ik'), (u'ledereen', u'Iedereen'), (u'ledere', u'Iedere'), (u'lemand', u'Iemand')]), 'pattern': u'(?um)(\\b|^)(?:ls|ln|lk|ledereen|ledere|lemand)(\\b|$)'}}, + 'nob': {'BeginLines': {'data': OrderedDict(), + 'pattern': None}, + 'EndLines': {'data': OrderedDict(), + 'pattern': None}, + 'PartialLines': {'data': OrderedDict(), + 'pattern': None}, + 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'pattern': None}, + 'WholeLines': {'data': OrderedDict(), + 'pattern': None}, + 'WholeWords': {'data': OrderedDict([(u'varjeg', u'var jeg'), (u'omjeg', u'om jeg'), (u'menjeg', u'men jeg'), (u'noejeg', u'noe jeg'), (u'f\xf8rjeg', u'f\xf8r jeg'), (u'harjobbet', u'har jobbet'), (u'Kunnejeg', u'Kunne jeg'), (u'haddejeg', u'hadde jeg'), (u'p\xe5jorden', u'p\xe5 jorden'), (u'n\xe5rjeg', u'n\xe5r jeg'), (u'tenkerjeg', u'tenker jeg'), (u'helejorden', u'hele jorden'), (u'menjorden', u'men jorden'), (u'rundtjorden', u'rundt jorden'), (u'forjorden', u'for jorden'), (u'avjordens', u'av jordens')]), + 'pattern': u'(?um)(\\b|^)(?:varjeg|omjeg|menjeg|noejeg|f\\\xf8rjeg|harjobbet|Kunnejeg|haddejeg|p\\\xe5jorden|n\\\xe5rjeg|tenkerjeg|helejorden|menjorden|rundtjorden|forjorden|avjordens)(\\b|$)'}}, 'nor': {'BeginLines': {'data': OrderedDict(), 'pattern': None}, 'EndLines': {'data': OrderedDict(), @@ -142,20 +166,20 @@ 'pattern': None}, 'WholeLines': {'data': OrderedDict([(u'No', u'No.')]), 'pattern': None}, - 'WholeWords': {'data': OrderedDict([(u'KBs', u'kB'), (u'Vd', u'Ud'), (u'N\xb0', u'N.\xb0'), (u'n\xb0', u'n.\xb0'), (u'nro.', u'n.\xb0'), (u'Nro.', u'N.\xb0'), (u'aca', u'ac\xe1'), (u'actuas', u'act\xfaas'), (u'actues', u'act\xfaes'), (u'adios', u'adi\xf3s'), (u'agarrenla', u'ag\xe1rrenla'), (u'agarrenlo', u'ag\xe1rrenlo'), (u'agarrandose', u'agarr\xe1ndose'), (u'algun', u'alg\xfan'), (u'alli', u'all\xed'), (u'alla', u'all\xe1'), (u'alejate', u'al\xe9jate'), (u'ahi', u'ah\xed'), (u'angel', u'\xe1ngel'), (u'angeles', u'\xe1ngeles'), (u'apagala', u'ap\xe1gala'), (u'aqui', u'aqu\xed'), (u'asi', u'as\xed'), (u'bahia', u'bah\xeda'), (u'busqueda', u'b\xfasqueda'), (u'busquedas', u'b\xfasquedas'), (u'callate', u'c\xe1llate'), (u'carcel', u'c\xe1rcel'), (u'camara', u'c\xe1mara'), (u'caido', u'ca\xeddo'), (u'cabron', u'cabr\xf3n'), (u'camion', u'cami\xf3n'), (u'codigo', u'c\xf3digo'), (u'codigos', u'c\xf3digos'), (u'comence', u'comenc\xe9'), (u'comprate', u'c\xf3mprate'), (u'consegui', u'consegu\xed'), (u'confias', u'conf\xedas'), (u'convertira', u'convertir\xe1'), (u'corazon', u'coraz\xf3n'), (u'crei', u'cre\xed'), (u'creia', u'cre\xeda'), (u'creido', u'cre\xeddo'), (u'creiste', u'cre\xedste'), (u'cubrenos', u'c\xfabrenos'), (u'comio', u'comi\xf3'), (u'dara', u'dar\xe1'), (u'dia', u'd\xeda'), (u'dias', u'd\xedas'), (u'debio', u'debi\xf3'), (u'demelo', u'd\xe9melo'), (u'dimelo', u'd\xedmelo'), (u'denoslo', u'd\xe9noslo'), (u'deselo', u'd\xe9selo'), (u'decia', u'dec\xeda'), (u'decian', u'dec\xedan'), (u'detras', u'detr\xe1s'), (u'deberia', u'deber\xeda'), (u'deberas', u'deber\xe1s'), (u'deberias', u'deber\xedas'), (u'deberian', u'deber\xedan'), (u'deberiamos', u'deber\xedamos'), (u'dejame', u'd\xe9jame'), (u'dejate', u'd\xe9jate'), (u'dejalo', u'd\xe9jalo'), (u'dejarian', u'dejar\xedan'), (u'damela', u'd\xe1mela'), (u'despues', u'despu\xe9s'), (u'diciendome', u'dici\xe9ndome'), (u'dificil', u'dif\xedcil'), (u'dificiles', u'dif\xedciles'), (u'disculpate', u'disc\xfalpate'), (u'dolares', u'd\xf3lares'), (u'hechar', u'echar'), (u'examenes', u'ex\xe1menes'), (u'empezo', u'empez\xf3'), (u'empujon', u'empuj\xf3n'), (u'empujalo', u'emp\xfajalo'), (u'escondanme', u'esc\xf3ndanme'), (u'esperame', u'esp\xe9rame'), (u'estara', u'estar\xe1'), (u'estare', u'estar\xe9'), (u'estaria', u'estar\xeda'), (u'estan', u'est\xe1n'), (u'estaran', u'estar\xe1n'), (u'estabamos', u'est\xe1bamos'), (u'estuvieramos', u'estuvi\xe9ramos'), (u'exito', u'\xe9xito'), (u'facil', u'f\xe1cil'), (u'fiscalia', u'fiscal\xeda'), (u'fragil', u'fr\xe1gil'), (u'fragiles', u'fr\xe1giles'), (u'frances', u'franc\xe9s'), (u'gustaria', u'gustar\xeda'), (u'habia', u'hab\xeda'), (u'habias', u'hab\xedas'), (u'habian', u'hab\xedan'), (u'habrian', u'habr\xedan'), (u'habrias', u'habr\xedas'), (u'hagalo', u'h\xe1galo'), (u'haria', u'har\xeda'), (u'increible', u'incre\xedble'), (u'incredulo', u'incr\xe9dulo'), (u'intentalo', u'int\xe9ntalo'), (u'ire', u'ir\xe9'), (u'jovenes', u'j\xf3venes'), (u'ladron', u'ladr\xf3n'), (u'linea', u'l\xednea'), (u'llamame', u'll\xe1mame'), (u'llevalo', u'll\xe9valo'), (u'mama', u'mam\xe1'), (u'maricon', u'maric\xf3n'), (u'mayoria', u'mayor\xeda'), (u'metodo', u'm\xe9todo'), (u'metodos', u'm\xe9todos'), (u'mio', u'm\xedo'), (u'mostro', u'mostr\xf3'), (u'morira', u'morir\xe1'), (u'muevete', u'mu\xe9vete'), (u'murio', u'muri\xf3'), (u'numero', u'n\xfamero'), (u'numeros', u'n\xfameros'), (u'ningun', u'ning\xfan'), (u'oido', u'o\xeddo'), (u'oidos', u'o\xeddos'), (u'oimos', u'o\xedmos'), (u'oiste', u'o\xedste'), (u'pasale', u'p\xe1sale'), (u'pasame', u'p\xe1same'), (u'paraiso', u'para\xedso'), (u'parate', u'p\xe1rate'), (u'pense', u'pens\xe9'), (u'peluqueria', u'peluquer\xeda'), (u'platano', u'pl\xe1tano'), (u'plastico', u'pl\xe1stico'), (u'plasticos', u'pl\xe1sticos'), (u'policia', u'polic\xeda'), (u'policias', u'polic\xedas'), (u'poster', u'p\xf3ster'), (u'podia', u'pod\xeda'), (u'podias', u'pod\xedas'), (u'podria', u'podr\xeda'), (u'podrian', u'podr\xedan'), (u'podrias', u'podr\xedas'), (u'podriamos', u'podr\xedamos'), (u'prometio', u'prometi\xf3'), (u'proposito', u'prop\xf3sito'), (u'pideselo', u'p\xeddeselo'), (u'ponganse', u'p\xf3nganse'), (u'prometeme', u'prom\xe9teme'), (u'publico', u'p\xfablico'), (u'publicos', u'p\xfablicos'), (u'publicamente', u'p\xfablicamente'), (u'quedate', u'qu\xe9date'), (u'queria', u'quer\xeda'), (u'querrias', u'querr\xedas'), (u'querian', u'quer\xedan'), (u'rapido', u'r\xe1pido'), (u'rapidamente', u'r\xe1pidamente'), (u'razon', u'raz\xf3n'), (u'rehusen', u'reh\xfasen'), (u'rie', u'r\xede'), (u'rias', u'r\xedas'), (u'rindete', u'r\xedndete'), (u'sacame', u's\xe1came'), (u'sentian', u'sent\xedan'), (u'sientate', u'si\xe9ntate'), (u'sera', u'ser\xe1'), (u'soplon', u'sopl\xf3n'), (u'sueltalo', u'su\xe9ltalo'), (u'tambien', u'tambi\xe9n'), (u'teoria', u'teor\xeda'), (u'tendra', u'tendr\xe1'), (u'telefono', u'tel\xe9fono'), (u'tipica', u't\xedpica'), (u'todavia', u'todav\xeda'), (u'tomalo', u't\xf3malo'), (u'tonterias', u'tonter\xedas'), (u'torci', u'torc\xed'), (u'traelos', u'tr\xe1elos'), (u'traiganlo', u'tr\xe1iganlo'), (u'traiganlos', u'tr\xe1iganlos'), (u'trio', u'tr\xedo'), (u'tuvieramos', u'tuvi\xe9ramos'), (u'union', u'uni\xf3n'), (u'ultimo', u'\xfaltimo'), (u'ultima', u'\xfaltima'), (u'ultimos', u'\xfaltimos'), (u'ultimas', u'\xfaltimas'), (u'unica', u'\xfanica'), (u'unico', u'\xfanico'), (u'vamonos', u'v\xe1monos'), (u'vayanse', u'v\xe1yanse'), (u'victima', u'v\xedctima'), (u'vivira', u'vivir\xe1'), (u'volvio', u'volvi\xf3'), (u'volvia', u'volv\xeda'), (u'volvian', u'volv\xedan'), (u'reir', u're\xedr'), (u'freir', u'fre\xedr'), (u'sonreir', u'sonre\xedr'), (u'hazmerreir', u'hazmerre\xedr'), (u'oir', u'o\xedr'), (u'oirlo', u'o\xedrlo'), (u'oirte', u'o\xedrte'), (u'oirse', u'o\xedrse'), (u'oirme', u'o\xedrme'), (u'oirle', u'o\xedrle'), (u'oirla', u'o\xedrla'), (u'oirles', u'o\xedrles'), (u'oirnos', u'o\xedrnos'), (u'oirlas', u'o\xedrlas'), (u'bi\xe9n', u'bien'), (u'cr\xedmen', u'crimen'), (u'fu\xe9', u'fue'), (u'fu\xed', u'fui'), (u'qui\xe9res', u'quieres'), (u't\xed', u'ti'), (u'd\xed', u'di'), (u'v\xe1', u'va'), (u'v\xe9', u've'), (u'v\xed', u'vi'), (u'vi\xf3', u'vio'), (u'\xf3', u'o'), (u'cl\xf3n', u'clon'), (u'di\xf3', u'dio'), (u'gui\xf3n', u'guion'), (u'd\xf3n', u'don'), (u'f\xe9', u'fe'), (u'\xe1quel', u'aquel'), (u'\xe9ste', u'este'), (u'\xe9sta', u'esta'), (u'\xe9stos', u'estos'), (u'\xe9stas', u'estas'), (u'\xe9se', u'ese'), (u'\xe9sa', u'esa'), (u'\xe9sos', u'esos'), (u'\xe9sas', u'esas'), (u's\xf3lo', u'solo'), (u'coktel', u'c\xf3ctel'), (u'cocktel', u'c\xf3ctel'), (u'conciente', u'consciente'), (u'comenz\xe9', u'comenc\xe9'), (u'desilucionarte', u'desilusionarte'), (u'dijieron', u'dijeron'), (u'empez\xe9', u'empec\xe9'), (u'hize', u'hice'), (u'ilucionarte', u'ilusionarte'), (u'inconciente', u'inconsciente'), (u'quize', u'quise'), (u'quizo', u'quiso'), (u'verguenza', u'verg\xfcenza'), (u'Nu\xf1ez', u'N\xfa\xf1ez'), (u'Ivan', u'Iv\xe1n'), (u'Japon', u'Jap\xf3n'), (u'Monica', u'M\xf3nica'), (u'Maria', u'Mar\xeda'), (u'Jose', u'Jos\xe9'), (u'Ramon', u'Ram\xf3n'), (u'Garcia', u'Garc\xeda'), (u'Gonzalez', u'Gonz\xe1lez'), (u'Jesus', u'Jes\xfas'), (u'Alvarez', u'\xc1lvarez'), (u'Damian', u'Dami\xe1n'), (u'Rene', u'Ren\xe9'), (u'Nicolas', u'Nicol\xe1s'), (u'Jonas', u'Jon\xe1s'), (u'Lopez', u'L\xf3pez'), (u'Hernandez', u'Hern\xe1ndez'), (u'Bermudez', u'Berm\xfadez'), (u'Fernandez', u'Fern\xe1ndez'), (u'Suarez', u'Su\xe1rez'), (u'Sofia', u'Sof\xeda'), (u'Seneca', u'S\xe9neca'), (u'Tokyo', u'Tokio'), (u'Canada', u'Canad\xe1'), (u'Paris', u'Par\xeds'), (u'Turquia', u'Turqu\xeda'), (u'Mexico', u'M\xe9xico'), (u'Mejico', u'M\xe9xico'), (u'Matias', u'Mat\xedas'), (u'Valentin', u'Valent\xedn'), (u'mejicano', u'mexicano'), (u'mejicanos', u'mexicanos'), (u'mejicana', u'mexicana'), (u'mejicanas', u'mexicanas'), (u'io', u'lo'), (u'ia', u'la'), (u'ie', u'le'), (u'Io', u'lo'), (u'Ia', u'la'), (u'AI', u'Al'), (u'Ie', u'le'), (u'EI', u'El'), (u'suba\ufb02uente', u'subafluente'), (u'a\ufb02\xf3jalo', u'afl\xf3jalo'), (u'A\ufb02\xf3jalo', u'Afl\xf3jalo'), (u'perdi', u'perd\xed'), (u'Podria', u'Podr\xeda'), (u'confia', u'conf\xeda'), (u'pasaria', u'pasar\xeda'), (u'Podias', u'Pod\xedas'), (u'responsabke', u'responsable'), (u'Todavia', u'Todav\xeda'), (u'envien', u'env\xeden'), (u'Queria', u'Quer\xeda'), (u'tio', u't\xedo'), (u'traido', u'tra\xeddo'), (u'Asi', u'As\xed'), (u'elegi', u'eleg\xed'), (u'habria', u'habr\xeda'), (u'encantaria', u'encantar\xeda'), (u'leido', u'le\xeddo'), (u'conocias', u'conoc\xedas'), (u'harias', u'har\xedas'), (u'Aqui', u'Aqu\xed'), (u'decidi', u'decid\xed'), (u'mia', u'm\xeda'), (u'Crei', u'Cre\xed'), (u'podiamos', u'pod\xedamos'), (u'avisame', u'av\xedsame'), (u'debia', u'deb\xeda'), (u'pensarias', u'pensar\xedas'), (u'reuniamos', u'reun\xedamos'), (u'PO\xcf', u'por'), (u'vendria', u'vendr\xeda'), (u'caida', u'ca\xedda'), (u'venian', u'ven\xedan'), (u'compa\xf1ias', u'compa\xf1\xedas'), (u'leiste', u'le\xedste'), (u'Leiste', u'Le\xedste'), (u'fiaria', u'fiar\xeda'), (u'Hungria', u'Hungr\xeda'), (u'fotografia', u'fotograf\xeda'), (u'cafeteria', u'cafeter\xeda'), (u'Digame', u'D\xedgame'), (u'debias', u'deb\xedas'), (u'tendria', u'tendr\xeda'), (u'C\xcfGO', u'creo'), (u'anteg', u'antes'), (u'S\xf3Io', u'Solo'), (u'Ilam\xe1ndola', u'llam\xe1ndola'), (u'C\xe1\ufb02at\xe9', u'C\xe1llate'), (u'Ilamaste', u'llamaste'), (u'daria', u'dar\xeda'), (u'Iargaba', u'largaba'), (u'Yati', u'Y a ti'), (u'querias', u'quer\xedas'), (u'Iimpiarlo', u'limpiarlo'), (u'Iargado', u'largado'), (u'galeria', u'galer\xeda'), (u'Bartomeu', u'Bertomeu'), (u'Iocalizarlo', u'localizarlo'), (u'Il\xe1mame', u'll\xe1mame')]), - 'pattern': u'(?um)(\\b|^)(?:KBs|Vd|N\\\xb0|n\\\xb0|nro\\.|Nro\\.|aca|actuas|actues|adios|agarrenla|agarrenlo|agarrandose|algun|alli|alla|alejate|ahi|angel|angeles|apagala|aqui|asi|bahia|busqueda|busquedas|callate|carcel|camara|caido|cabron|camion|codigo|codigos|comence|comprate|consegui|confias|convertira|corazon|crei|creia|creido|creiste|cubrenos|comio|dara|dia|dias|debio|demelo|dimelo|denoslo|deselo|decia|decian|detras|deberia|deberas|deberias|deberian|deberiamos|dejame|dejate|dejalo|dejarian|damela|despues|diciendome|dificil|dificiles|disculpate|dolares|hechar|examenes|empezo|empujon|empujalo|escondanme|esperame|estara|estare|estaria|estan|estaran|estabamos|estuvieramos|exito|facil|fiscalia|fragil|fragiles|frances|gustaria|habia|habias|habian|habrian|habrias|hagalo|haria|increible|incredulo|intentalo|ire|jovenes|ladron|linea|llamame|llevalo|mama|maricon|mayoria|metodo|metodos|mio|mostro|morira|muevete|murio|numero|numeros|ningun|oido|oidos|oimos|oiste|pasale|pasame|paraiso|parate|pense|peluqueria|platano|plastico|plasticos|policia|policias|poster|podia|podias|podria|podrian|podrias|podriamos|prometio|proposito|pideselo|ponganse|prometeme|publico|publicos|publicamente|quedate|queria|querrias|querian|rapido|rapidamente|razon|rehusen|rie|rias|rindete|sacame|sentian|sientate|sera|soplon|sueltalo|tambien|teoria|tendra|telefono|tipica|todavia|tomalo|tonterias|torci|traelos|traiganlo|traiganlos|trio|tuvieramos|union|ultimo|ultima|ultimos|ultimas|unica|unico|vamonos|vayanse|victima|vivira|volvio|volvia|volvian|reir|freir|sonreir|hazmerreir|oir|oirlo|oirte|oirse|oirme|oirle|oirla|oirles|oirnos|oirlas|bi\\\xe9n|cr\\\xedmen|fu\\\xe9|fu\\\xed|qui\\\xe9res|t\\\xed|d\\\xed|v\\\xe1|v\\\xe9|v\\\xed|vi\\\xf3|\\\xf3|cl\\\xf3n|di\\\xf3|gui\\\xf3n|d\\\xf3n|f\\\xe9|\\\xe1quel|\\\xe9ste|\\\xe9sta|\\\xe9stos|\\\xe9stas|\\\xe9se|\\\xe9sa|\\\xe9sos|\\\xe9sas|s\\\xf3lo|coktel|cocktel|conciente|comenz\\\xe9|desilucionarte|dijieron|empez\\\xe9|hize|ilucionarte|inconciente|quize|quizo|verguenza|Nu\\\xf1ez|Ivan|Japon|Monica|Maria|Jose|Ramon|Garcia|Gonzalez|Jesus|Alvarez|Damian|Rene|Nicolas|Jonas|Lopez|Hernandez|Bermudez|Fernandez|Suarez|Sofia|Seneca|Tokyo|Canada|Paris|Turquia|Mexico|Mejico|Matias|Valentin|mejicano|mejicanos|mejicana|mejicanas|io|ia|ie|Io|Ia|AI|Ie|EI|suba\\\ufb02uente|a\\\ufb02\\\xf3jalo|A\\\ufb02\\\xf3jalo|perdi|Podria|confia|pasaria|Podias|responsabke|Todavia|envien|Queria|tio|traido|Asi|elegi|habria|encantaria|leido|conocias|harias|Aqui|decidi|mia|Crei|podiamos|avisame|debia|pensarias|reuniamos|PO\\\xcf|vendria|caida|venian|compa\\\xf1ias|leiste|Leiste|fiaria|Hungria|fotografia|cafeteria|Digame|debias|tendria|C\\\xcfGO|anteg|S\\\xf3Io|Ilam\\\xe1ndola|C\\\xe1\\\ufb02at\\\xe9|Ilamaste|daria|Iargaba|Yati|querias|Iimpiarlo|Iargado|galeria|Bartomeu|Iocalizarlo|Il\\\xe1mame)(\\b|$)'}}, + 'WholeWords': {'data': OrderedDict([(u'KBs', u'kB'), (u'Vd', u'Ud'), (u'N\xb0', u'N.\xb0'), (u'n\xb0', u'n.\xb0'), (u'nro.', u'n.\xb0'), (u'Nro.', u'N.\xb0'), (u'aca', u'ac\xe1'), (u'actuas', u'act\xfaas'), (u'actues', u'act\xfaes'), (u'adios', u'adi\xf3s'), (u'agarrenla', u'ag\xe1rrenla'), (u'agarrenlo', u'ag\xe1rrenlo'), (u'agarrandose', u'agarr\xe1ndose'), (u'algun', u'alg\xfan'), (u'alli', u'all\xed'), (u'alla', u'all\xe1'), (u'alejate', u'al\xe9jate'), (u'ahi', u'ah\xed'), (u'angel', u'\xe1ngel'), (u'angeles', u'\xe1ngeles'), (u'ansian', u'ans\xedan'), (u'apagala', u'ap\xe1gala'), (u'aqui', u'aqu\xed'), (u'asi', u'as\xed'), (u'bahia', u'bah\xeda'), (u'busqueda', u'b\xfasqueda'), (u'busquedas', u'b\xfasquedas'), (u'callate', u'c\xe1llate'), (u'carcel', u'c\xe1rcel'), (u'camara', u'c\xe1mara'), (u'caido', u'ca\xeddo'), (u'cabron', u'cabr\xf3n'), (u'camion', u'cami\xf3n'), (u'codigo', u'c\xf3digo'), (u'codigos', u'c\xf3digos'), (u'comence', u'comenc\xe9'), (u'comprate', u'c\xf3mprate'), (u'consegui', u'consegu\xed'), (u'confias', u'conf\xedas'), (u'convertira', u'convertir\xe1'), (u'corazon', u'coraz\xf3n'), (u'crei', u'cre\xed'), (u'creia', u'cre\xeda'), (u'creido', u'cre\xeddo'), (u'creiste', u'cre\xedste'), (u'cubrenos', u'c\xfabrenos'), (u'comio', u'comi\xf3'), (u'dara', u'dar\xe1'), (u'dia', u'd\xeda'), (u'dias', u'd\xedas'), (u'debio', u'debi\xf3'), (u'demelo', u'd\xe9melo'), (u'dimelo', u'd\xedmelo'), (u'denoslo', u'd\xe9noslo'), (u'deselo', u'd\xe9selo'), (u'decia', u'dec\xeda'), (u'decian', u'dec\xedan'), (u'detras', u'detr\xe1s'), (u'deberia', u'deber\xeda'), (u'deberas', u'deber\xe1s'), (u'deberias', u'deber\xedas'), (u'deberian', u'deber\xedan'), (u'deberiamos', u'deber\xedamos'), (u'dejame', u'd\xe9jame'), (u'dejate', u'd\xe9jate'), (u'dejalo', u'd\xe9jalo'), (u'dejarian', u'dejar\xedan'), (u'damela', u'd\xe1mela'), (u'despues', u'despu\xe9s'), (u'diciendome', u'dici\xe9ndome'), (u'dificil', u'dif\xedcil'), (u'dificiles', u'dif\xedciles'), (u'disculpate', u'disc\xfalpate'), (u'dolares', u'd\xf3lares'), (u'hechar', u'echar'), (u'examenes', u'ex\xe1menes'), (u'empezo', u'empez\xf3'), (u'empujon', u'empuj\xf3n'), (u'empujalo', u'emp\xfajalo'), (u'energia', u'energ\xeda'), (u'enfrian', u'enfr\xedan'), (u'escondanme', u'esc\xf3ndanme'), (u'esperame', u'esp\xe9rame'), (u'estara', u'estar\xe1'), (u'estare', u'estar\xe9'), (u'estaria', u'estar\xeda'), (u'estan', u'est\xe1n'), (u'estaran', u'estar\xe1n'), (u'estabamos', u'est\xe1bamos'), (u'estuvieramos', u'estuvi\xe9ramos'), (u'exito', u'\xe9xito'), (u'facil', u'f\xe1cil'), (u'fiscalia', u'fiscal\xeda'), (u'fragil', u'fr\xe1gil'), (u'fragiles', u'fr\xe1giles'), (u'frances', u'franc\xe9s'), (u'gustaria', u'gustar\xeda'), (u'habia', u'hab\xeda'), (u'habias', u'hab\xedas'), (u'habian', u'hab\xedan'), (u'habrian', u'habr\xedan'), (u'habrias', u'habr\xedas'), (u'hagalo', u'h\xe1galo'), (u'haria', u'har\xeda'), (u'increible', u'incre\xedble'), (u'incredulo', u'incr\xe9dulo'), (u'intentalo', u'int\xe9ntalo'), (u'ire', u'ir\xe9'), (u'jovenes', u'j\xf3venes'), (u'ladron', u'ladr\xf3n'), (u'linea', u'l\xednea'), (u'llamame', u'll\xe1mame'), (u'llevalo', u'll\xe9valo'), (u'mama', u'mam\xe1'), (u'maricon', u'maric\xf3n'), (u'mayoria', u'mayor\xeda'), (u'metodo', u'm\xe9todo'), (u'metodos', u'm\xe9todos'), (u'mio', u'm\xedo'), (u'mostro', u'mostr\xf3'), (u'morira', u'morir\xe1'), (u'muevete', u'mu\xe9vete'), (u'murio', u'muri\xf3'), (u'numero', u'n\xfamero'), (u'numeros', u'n\xfameros'), (u'ningun', u'ning\xfan'), (u'oido', u'o\xeddo'), (u'oidos', u'o\xeddos'), (u'oimos', u'o\xedmos'), (u'oiste', u'o\xedste'), (u'pasale', u'p\xe1sale'), (u'pasame', u'p\xe1same'), (u'paraiso', u'para\xedso'), (u'parate', u'p\xe1rate'), (u'pense', u'pens\xe9'), (u'peluqueria', u'peluquer\xeda'), (u'platano', u'pl\xe1tano'), (u'plastico', u'pl\xe1stico'), (u'plasticos', u'pl\xe1sticos'), (u'policia', u'polic\xeda'), (u'policias', u'polic\xedas'), (u'poster', u'p\xf3ster'), (u'podia', u'pod\xeda'), (u'podias', u'pod\xedas'), (u'podria', u'podr\xeda'), (u'podrian', u'podr\xedan'), (u'podrias', u'podr\xedas'), (u'podriamos', u'podr\xedamos'), (u'prometio', u'prometi\xf3'), (u'proposito', u'prop\xf3sito'), (u'pideselo', u'p\xeddeselo'), (u'ponganse', u'p\xf3nganse'), (u'prometeme', u'prom\xe9teme'), (u'publico', u'p\xfablico'), (u'publicos', u'p\xfablicos'), (u'publicamente', u'p\xfablicamente'), (u'quedate', u'qu\xe9date'), (u'queria', u'quer\xeda'), (u'querrias', u'querr\xedas'), (u'querian', u'quer\xedan'), (u'rapido', u'r\xe1pido'), (u'rapidamente', u'r\xe1pidamente'), (u'razon', u'raz\xf3n'), (u'rehusen', u'reh\xfasen'), (u'rie', u'r\xede'), (u'rias', u'r\xedas'), (u'rindete', u'r\xedndete'), (u'sacame', u's\xe1came'), (u'sentian', u'sent\xedan'), (u'sientate', u'si\xe9ntate'), (u'sera', u'ser\xe1'), (u'soplon', u'sopl\xf3n'), (u'sueltalo', u'su\xe9ltalo'), (u'tambien', u'tambi\xe9n'), (u'teoria', u'teor\xeda'), (u'tendra', u'tendr\xe1'), (u'telefono', u'tel\xe9fono'), (u'tipica', u't\xedpica'), (u'todavia', u'todav\xeda'), (u'tomalo', u't\xf3malo'), (u'tonterias', u'tonter\xedas'), (u'torci', u'torc\xed'), (u'traelos', u'tr\xe1elos'), (u'traiganlo', u'tr\xe1iganlo'), (u'traiganlos', u'tr\xe1iganlos'), (u'trio', u'tr\xedo'), (u'tuvieramos', u'tuvi\xe9ramos'), (u'union', u'uni\xf3n'), (u'ultimo', u'\xfaltimo'), (u'ultima', u'\xfaltima'), (u'ultimos', u'\xfaltimos'), (u'ultimas', u'\xfaltimas'), (u'unica', u'\xfanica'), (u'unico', u'\xfanico'), (u'vamonos', u'v\xe1monos'), (u'vayanse', u'v\xe1yanse'), (u'victima', u'v\xedctima'), (u'vivira', u'vivir\xe1'), (u'volvio', u'volvi\xf3'), (u'volvia', u'volv\xeda'), (u'volvian', u'volv\xedan'), (u'reir', u're\xedr'), (u'freir', u'fre\xedr'), (u'sonreir', u'sonre\xedr'), (u'hazmerreir', u'hazmerre\xedr'), (u'oir', u'o\xedr'), (u'oirlo', u'o\xedrlo'), (u'oirte', u'o\xedrte'), (u'oirse', u'o\xedrse'), (u'oirme', u'o\xedrme'), (u'oirle', u'o\xedrle'), (u'oirla', u'o\xedrla'), (u'oirles', u'o\xedrles'), (u'oirnos', u'o\xedrnos'), (u'oirlas', u'o\xedrlas'), (u'bi\xe9n', u'bien'), (u'cr\xedmen', u'crimen'), (u'fu\xe9', u'fue'), (u'fu\xed', u'fui'), (u'qui\xe9res', u'quieres'), (u't\xed', u'ti'), (u'd\xed', u'di'), (u'v\xe1', u'va'), (u'v\xe9', u've'), (u'v\xed', u'vi'), (u'vi\xf3', u'vio'), (u'\xf3', u'o'), (u'cl\xf3n', u'clon'), (u'di\xf3', u'dio'), (u'gui\xf3n', u'guion'), (u'd\xf3n', u'don'), (u'f\xe9', u'fe'), (u'\xe1quel', u'aquel'), (u'\xe9ste', u'este'), (u'\xe9sta', u'esta'), (u'\xe9stos', u'estos'), (u'\xe9stas', u'estas'), (u'\xe9se', u'ese'), (u'\xe9sa', u'esa'), (u'\xe9sos', u'esos'), (u'\xe9sas', u'esas'), (u's\xf3lo', u'solo'), (u'coktel', u'c\xf3ctel'), (u'cocktel', u'c\xf3ctel'), (u'conciente', u'consciente'), (u'comenz\xe9', u'comenc\xe9'), (u'desilucionarte', u'desilusionarte'), (u'dijieron', u'dijeron'), (u'empez\xe9', u'empec\xe9'), (u'hize', u'hice'), (u'ilucionarte', u'ilusionarte'), (u'inconciente', u'inconsciente'), (u'quize', u'quise'), (u'quizo', u'quiso'), (u'verguenza', u'verg\xfcenza'), (u'Nu\xf1ez', u'N\xfa\xf1ez'), (u'Ivan', u'Iv\xe1n'), (u'Japon', u'Jap\xf3n'), (u'Monica', u'M\xf3nica'), (u'Maria', u'Mar\xeda'), (u'Jose', u'Jos\xe9'), (u'Ramon', u'Ram\xf3n'), (u'Garcia', u'Garc\xeda'), (u'Gonzalez', u'Gonz\xe1lez'), (u'Jesus', u'Jes\xfas'), (u'Alvarez', u'\xc1lvarez'), (u'Damian', u'Dami\xe1n'), (u'Rene', u'Ren\xe9'), (u'Nicolas', u'Nicol\xe1s'), (u'Jonas', u'Jon\xe1s'), (u'Lopez', u'L\xf3pez'), (u'Hernandez', u'Hern\xe1ndez'), (u'Bermudez', u'Berm\xfadez'), (u'Fernandez', u'Fern\xe1ndez'), (u'Suarez', u'Su\xe1rez'), (u'Sofia', u'Sof\xeda'), (u'Seneca', u'S\xe9neca'), (u'Tokyo', u'Tokio'), (u'Canada', u'Canad\xe1'), (u'Paris', u'Par\xeds'), (u'Turquia', u'Turqu\xeda'), (u'Mexico', u'M\xe9xico'), (u'Mejico', u'M\xe9xico'), (u'Matias', u'Mat\xedas'), (u'Valentin', u'Valent\xedn'), (u'mejicano', u'mexicano'), (u'mejicanos', u'mexicanos'), (u'mejicana', u'mexicana'), (u'mejicanas', u'mexicanas'), (u'io', u'lo'), (u'ia', u'la'), (u'ie', u'le'), (u'Io', u'lo'), (u'Ia', u'la'), (u'AI', u'Al'), (u'Ie', u'le'), (u'EI', u'El'), (u'suba\ufb02uente', u'subafluente'), (u'a\ufb02\xf3jalo', u'afl\xf3jalo'), (u'A\ufb02\xf3jalo', u'Afl\xf3jalo'), (u'perdi', u'perd\xed'), (u'Podria', u'Podr\xeda'), (u'confia', u'conf\xeda'), (u'pasaria', u'pasar\xeda'), (u'Podias', u'Pod\xedas'), (u'responsabke', u'responsable'), (u'Todavia', u'Todav\xeda'), (u'envien', u'env\xeden'), (u'Queria', u'Quer\xeda'), (u'tio', u't\xedo'), (u'traido', u'tra\xeddo'), (u'Asi', u'As\xed'), (u'elegi', u'eleg\xed'), (u'habria', u'habr\xeda'), (u'encantaria', u'encantar\xeda'), (u'leido', u'le\xeddo'), (u'conocias', u'conoc\xedas'), (u'harias', u'har\xedas'), (u'Aqui', u'Aqu\xed'), (u'decidi', u'decid\xed'), (u'mia', u'm\xeda'), (u'Crei', u'Cre\xed'), (u'podiamos', u'pod\xedamos'), (u'avisame', u'av\xedsame'), (u'debia', u'deb\xeda'), (u'pensarias', u'pensar\xedas'), (u'reuniamos', u'reun\xedamos'), (u'PO\xcf', u'por'), (u'vendria', u'vendr\xeda'), (u'caida', u'ca\xedda'), (u'venian', u'ven\xedan'), (u'compa\xf1ias', u'compa\xf1\xedas'), (u'leiste', u'le\xedste'), (u'Leiste', u'Le\xedste'), (u'fiaria', u'fiar\xeda'), (u'Hungria', u'Hungr\xeda'), (u'fotografia', u'fotograf\xeda'), (u'cafeteria', u'cafeter\xeda'), (u'Digame', u'D\xedgame'), (u'debias', u'deb\xedas'), (u'tendria', u'tendr\xeda'), (u'C\xcfGO', u'creo'), (u'anteg', u'antes'), (u'S\xf3Io', u'Solo'), (u'Ilam\xe1ndola', u'llam\xe1ndola'), (u'C\xe1\ufb02at\xe9', u'C\xe1llate'), (u'Ilamaste', u'llamaste'), (u'daria', u'dar\xeda'), (u'Iargaba', u'largaba'), (u'Yati', u'Y a ti'), (u'querias', u'quer\xedas'), (u'Iimpiarlo', u'limpiarlo'), (u'Iargado', u'largado'), (u'galeria', u'galer\xeda'), (u'Bartomeu', u'Bertomeu'), (u'Iocalizarlo', u'localizarlo'), (u'Il\xe1mame', u'll\xe1mame')]), + 'pattern': u'(?um)(\\b|^)(?:KBs|Vd|N\\\xb0|n\\\xb0|nro\\.|Nro\\.|aca|actuas|actues|adios|agarrenla|agarrenlo|agarrandose|algun|alli|alla|alejate|ahi|angel|angeles|ansian|apagala|aqui|asi|bahia|busqueda|busquedas|callate|carcel|camara|caido|cabron|camion|codigo|codigos|comence|comprate|consegui|confias|convertira|corazon|crei|creia|creido|creiste|cubrenos|comio|dara|dia|dias|debio|demelo|dimelo|denoslo|deselo|decia|decian|detras|deberia|deberas|deberias|deberian|deberiamos|dejame|dejate|dejalo|dejarian|damela|despues|diciendome|dificil|dificiles|disculpate|dolares|hechar|examenes|empezo|empujon|empujalo|energia|enfrian|escondanme|esperame|estara|estare|estaria|estan|estaran|estabamos|estuvieramos|exito|facil|fiscalia|fragil|fragiles|frances|gustaria|habia|habias|habian|habrian|habrias|hagalo|haria|increible|incredulo|intentalo|ire|jovenes|ladron|linea|llamame|llevalo|mama|maricon|mayoria|metodo|metodos|mio|mostro|morira|muevete|murio|numero|numeros|ningun|oido|oidos|oimos|oiste|pasale|pasame|paraiso|parate|pense|peluqueria|platano|plastico|plasticos|policia|policias|poster|podia|podias|podria|podrian|podrias|podriamos|prometio|proposito|pideselo|ponganse|prometeme|publico|publicos|publicamente|quedate|queria|querrias|querian|rapido|rapidamente|razon|rehusen|rie|rias|rindete|sacame|sentian|sientate|sera|soplon|sueltalo|tambien|teoria|tendra|telefono|tipica|todavia|tomalo|tonterias|torci|traelos|traiganlo|traiganlos|trio|tuvieramos|union|ultimo|ultima|ultimos|ultimas|unica|unico|vamonos|vayanse|victima|vivira|volvio|volvia|volvian|reir|freir|sonreir|hazmerreir|oir|oirlo|oirte|oirse|oirme|oirle|oirla|oirles|oirnos|oirlas|bi\\\xe9n|cr\\\xedmen|fu\\\xe9|fu\\\xed|qui\\\xe9res|t\\\xed|d\\\xed|v\\\xe1|v\\\xe9|v\\\xed|vi\\\xf3|\\\xf3|cl\\\xf3n|di\\\xf3|gui\\\xf3n|d\\\xf3n|f\\\xe9|\\\xe1quel|\\\xe9ste|\\\xe9sta|\\\xe9stos|\\\xe9stas|\\\xe9se|\\\xe9sa|\\\xe9sos|\\\xe9sas|s\\\xf3lo|coktel|cocktel|conciente|comenz\\\xe9|desilucionarte|dijieron|empez\\\xe9|hize|ilucionarte|inconciente|quize|quizo|verguenza|Nu\\\xf1ez|Ivan|Japon|Monica|Maria|Jose|Ramon|Garcia|Gonzalez|Jesus|Alvarez|Damian|Rene|Nicolas|Jonas|Lopez|Hernandez|Bermudez|Fernandez|Suarez|Sofia|Seneca|Tokyo|Canada|Paris|Turquia|Mexico|Mejico|Matias|Valentin|mejicano|mejicanos|mejicana|mejicanas|io|ia|ie|Io|Ia|AI|Ie|EI|suba\\\ufb02uente|a\\\ufb02\\\xf3jalo|A\\\ufb02\\\xf3jalo|perdi|Podria|confia|pasaria|Podias|responsabke|Todavia|envien|Queria|tio|traido|Asi|elegi|habria|encantaria|leido|conocias|harias|Aqui|decidi|mia|Crei|podiamos|avisame|debia|pensarias|reuniamos|PO\\\xcf|vendria|caida|venian|compa\\\xf1ias|leiste|Leiste|fiaria|Hungria|fotografia|cafeteria|Digame|debias|tendria|C\\\xcfGO|anteg|S\\\xf3Io|Ilam\\\xe1ndola|C\\\xe1\\\ufb02at\\\xe9|Ilamaste|daria|Iargaba|Yati|querias|Iimpiarlo|Iargado|galeria|Bartomeu|Iocalizarlo|Il\\\xe1mame)(\\b|$)'}}, 'srp': {'BeginLines': {'data': OrderedDict(), 'pattern': None}, 'EndLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialLines': {'data': OrderedDict([(u'bi smo', u'bismo'), (u'dali je', u'da li je'), (u'dali si', u'da li si'), (u'Dali si', u'Da li si'), (u'Jel sam ti', u'Jesam li ti'), (u'Jel si', u'Jesi li'), (u"Jel' si", u'Jesi li'), (u"Je I'", u'Jesi li'), (u'Jel si to', u'Jesi li to'), (u"Jel' si to", u'Da li si to'), (u'jel si to', u'da li si to'), (u"jel' si to", u'jesi li to'), (u'Jel si ti', u'Da li si ti'), (u"Jel' si ti", u'Da li si ti'), (u'jel si ti', u'da li si ti'), (u"jel' si ti", u'da li si ti'), (u'jel ste ', u'jeste li '), (u'Jel ste', u'Jeste li'), (u"jel' ste ", u'jeste li '), (u"Jel' ste ", u'Jeste li '), (u'Jel su ', u'Jesu li '), (u'Jel da ', u'Zar ne'), (u'jel da ', u'zar ne'), (u"jel'da ", u'zar ne'), (u'Jeli sve ', u'Je li sve'), (u'Jeli on ', u'Je li on'), (u'Jeli ti ', u'Je li ti'), (u'jeli ti ', u'je li ti'), (u'Jeli to ', u'Je li to'), (u'Nebrini', u'Ne brini'), (u'nedaj', u'ne daj'), (u'ne \u0107u', u'ne\u0107u'), (u'Nemogu', u'Ne mogu'), (u'ne mogu', u'ne mogu'), (u'Nemora\u0161', u'Ne mora\u0161'), (u'od kako', u'otkako'), (u'Si dobro', u'Jesi li dobro'), (u'Svo vreme', u'Sve vrijeme'), (u'Svo vrijeme', u'Sve vrijeme'), (u'Cijelo vrijeme', u'Sve vrijeme')]), - 'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:bi\\ smo|dali\\ je|dali\\ si|Dali\\ si|Jel\\ sam\\ ti|Jel\\ si|Jel\\'\\ si|Je\\ I\\'|Jel\\ si\\ to|Jel\\'\\ si\\ to|jel\\ si\\ to|jel\\'\\ si\\ to|Jel\\ si\\ ti|Jel\\'\\ si\\ ti|jel\\ si\\ ti|jel\\'\\ si\\ ti|jel\\ ste\\ |Jel\\ ste|jel\\'\\ ste\\ |Jel\\'\\ ste\\ |Jel\\ su\\ |Jel\\ da\\ |jel\\ da\\ |jel\\'da\\ |Jeli\\ sve\\ |Jeli\\ on\\ |Jeli\\ ti\\ |jeli\\ ti\\ |Jeli\\ to\\ |Nebrini|nedaj|ne\\ \\\u0107u|Nemogu|ne\\ mogu|Nemora\\\u0161|od\\ kako|Si\\ dobro|Svo\\ vreme|Svo\\ vrijeme|Cijelo\\ vrijeme)(?:(?=\\s)|(?=$)|(?=\\b))"}, + 'PartialLines': {'data': OrderedDict([(u'bi smo', u'bismo'), (u'dali je', u'da li je'), (u'dali si', u'da li si'), (u'Dali si', u'Da li si'), (u'Jel sam ti', u'Jesam li ti'), (u'Jel si', u'Jesi li'), (u"Jel' si", u'Jesi li'), (u"Je I'", u'Jesi li'), (u'Jel si to', u'Jesi li to'), (u"Jel' si to", u'Da li si to'), (u'jel si to', u'da li si to'), (u"jel' si to", u'jesi li to'), (u'Jel si ti', u'Da li si ti'), (u"Jel' si ti", u'Da li si ti'), (u'jel si ti', u'da li si ti'), (u"jel' si ti", u'da li si ti'), (u'jel ste ', u'jeste li '), (u'Jel ste', u'Jeste li'), (u"jel' ste ", u'jeste li '), (u"Jel' ste ", u'Jeste li '), (u'Jel su ', u'Jesu li '), (u'Jel da ', u'Zar ne'), (u'jel da ', u'zar ne'), (u"jel'da ", u'zar ne'), (u'Jeli sve ', u'Je li sve'), (u'Jeli on ', u'Je li on'), (u'Jeli ti ', u'Je li ti'), (u'jeli ti ', u'je li ti'), (u'Jeli to ', u'Je li to'), (u'Nebrini', u'Ne brini'), (u'ne \u0107u', u'ne\u0107u'), (u'od kako', u'otkako'), (u'Si dobro', u'Jesi li dobro'), (u'Svo vreme', u'Sve vrijeme'), (u'Svo vrijeme', u'Sve vrijeme'), (u'Cijelo vrijeme', u'Sve vrijeme')]), + 'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:bi\\ smo|dali\\ je|dali\\ si|Dali\\ si|Jel\\ sam\\ ti|Jel\\ si|Jel\\'\\ si|Je\\ I\\'|Jel\\ si\\ to|Jel\\'\\ si\\ to|jel\\ si\\ to|jel\\'\\ si\\ to|Jel\\ si\\ ti|Jel\\'\\ si\\ ti|jel\\ si\\ ti|jel\\'\\ si\\ ti|jel\\ ste\\ |Jel\\ ste|jel\\'\\ ste\\ |Jel\\'\\ ste\\ |Jel\\ su\\ |Jel\\ da\\ |jel\\ da\\ |jel\\'da\\ |Jeli\\ sve\\ |Jeli\\ on\\ |Jeli\\ ti\\ |jeli\\ ti\\ |Jeli\\ to\\ |Nebrini|ne\\ \\\u0107u|od\\ kako|Si\\ dobro|Svo\\ vreme|Svo\\ vrijeme|Cijelo\\ vrijeme)(?:(?=\\s)|(?=$)|(?=\\b))"}, 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, - 'WholeWords': {'data': OrderedDict([(u'\u010du', u'\u0107u'), (u'\u010de\u0161', u'\u0107e\u0161'), (u'\u010de', u'\u0107e'), (u'\u0107\u0161', u'\u0107e\u0161'), (u'\u0107mo', u'\u0107emo'), (u'\u0107te', u'\u0107ete'), (u'\u010demo', u'\u0107emo'), (u'\u010dete', u'\u010dete'), (u'djete', u'dijete'), (u'Hey', u'Hej'), (u'hey', u'hej'), (u'htjeo', u'htio'), (u'Ho\u010de\u0161', u'Ho\u0107e\u0161'), (u'ho\u010de\u0161', u'ho\u0107e\u0161'), (u'i\u010di', u'i\u0107i'), (u'jel', u"je l'"), (u'Jel', u"Je l'"), (u'nedaj', u'ne daj'), (u'Rje\u0161it', u'Rije\u0161it'), (u'smjeo', u'smio'), (u'uop\u010de', u'uop\u0107e'), (u'valda', u'valjda'), (u'\u017eelila', u'\u017eeljela')]), - 'pattern': u'(?um)(\\b|^)(?:\\\u010du|\\\u010de\\\u0161|\\\u010de|\\\u0107\\\u0161|\\\u0107mo|\\\u0107te|\\\u010demo|\\\u010dete|djete|Hey|hey|htjeo|Ho\\\u010de\\\u0161|ho\\\u010de\\\u0161|i\\\u010di|jel|Jel|nedaj|Rje\\\u0161it|smjeo|uop\\\u010de|valda|\\\u017eelila)(\\b|$)'}}, + 'WholeWords': {'data': OrderedDict([(u'\u010du', u'\u0107u'), (u'\u010de\u0161', u'\u0107e\u0161'), (u'\u010de', u'\u0107e'), (u'\u0107\u0161', u'\u0107e\u0161'), (u'\u0107mo', u'\u0107emo'), (u'\u0107te', u'\u0107ete'), (u'\u010demo', u'\u0107emo'), (u'\u010dete', u'\u0107ete'), (u'djete', u'dijete'), (u'Hey', u'Hej'), (u'hey', u'hej'), (u'htjeo', u'htio'), (u'i\u010di', u'i\u0107i'), (u'jel', u"je l'"), (u'Jel', u"Je l'"), (u'Nebi', u'Ne bi'), (u'Nebih', u'Ne bih'), (u'nebi', u'ne bi'), (u'nebih', u'ne bih'), (u'nedaj', u'ne daj'), (u'Nedaj', u'Ne daj'), (u'nedam', u'ne dam'), (u'Nedam', u'Ne dam'), (u'neda\u0161', u'ne da\u0161'), (u'Neda\u0161', u'Ne da\u0161'), (u'nemogu', u'ne mogu'), (u'Nemogu', u'Ne mogu'), (u'nemora', u'ne mora'), (u'Nemora', u'Ne mora'), (u'nemora\u0161', u'ne mora\u0161'), (u'Nemora\u0161', u'Ne mora\u0161'), (u'predamnom', u'preda mnom'), (u'Predamnom', u'Preda mnom'), (u'Rje\u0161it', u'Rije\u0161it'), (u'samnom', u'sa mnom'), (u'Samnom', u'Sa mnom'), (u'smjeo', u'smio'), (u'uop\u010de', u'uop\u0107e'), (u'Uop\u010de', u'Uop\u0107e'), (u'umijesto', u'umjesto'), (u'Umijesto', u'Umjesto'), (u'uspije\u0161an', u'uspje\u0161an'), (u'uvjek', u'uvijek'), (u'Uvjek', u'Uvijek'), (u'valda', u'valjda'), (u'zamnom', u'za mnom'), (u'Zamnom', u'Za mnom'), (u'\u017eelila', u'\u017eeljela')]), + 'pattern': u'(?um)(\\b|^)(?:\\\u010du|\\\u010de\\\u0161|\\\u010de|\\\u0107\\\u0161|\\\u0107mo|\\\u0107te|\\\u010demo|\\\u010dete|djete|Hey|hey|htjeo|i\\\u010di|jel|Jel|Nebi|Nebih|nebi|nebih|nedaj|Nedaj|nedam|Nedam|neda\\\u0161|Neda\\\u0161|nemogu|Nemogu|nemora|Nemora|nemora\\\u0161|Nemora\\\u0161|predamnom|Predamnom|Rje\\\u0161it|samnom|Samnom|smjeo|uop\\\u010de|Uop\\\u010de|umijesto|Umijesto|uspije\\\u0161an|uvjek|Uvjek|valda|zamnom|Zamnom|\\\u017eelila)(\\b|$)'}}, 'swe': {'BeginLines': {'data': OrderedDict([(u'Ln ', u'In '), (u'U ppfattat', u'Uppfattat')]), 'pattern': u'(?um)^(?:Ln\\ |U\\ ppfattat)'}, 'EndLines': {'data': OrderedDict(), @@ -166,8 +190,8 @@ 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, - 'WholeWords': {'data': OrderedDict([(u'l\xe2rt', u'l\xe4rt'), (u'hederv\xe5rda', u'hederv\xe4rda'), (u'storm\xe2stare', u'storm\xe4stare'), (u'Avf\xe2rd', u'Avf\xe4rd'), (u't\xe2lten', u't\xe4lten'), (u'\xe2rjag', u'\xe4r jag'), (u'\xe4rjag', u'\xe4r jag'), (u'j\xe2mlikar', u'j\xe4mlikar'), (u'Riskako\ufb02', u'Riskakor'), (u'Karamellen/', u'Karamellen'), (u'Lngen\xfcng', u'Ingenting'), (u'\xe4rju', u'\xe4r ju'), (u'S\xe1', u'S\xe5'), (u'n\xe4rjag', u'n\xe4r jag'), (u'alltjag', u'allt jag'), (u'g\xf6rjag', u'g\xf6r jag'), (u'trorjag', u'tror jag'), (u'varju', u'var ju'), (u'g\xf6rju', u'g\xf6r ju'), (u'kanju', u'kan ju'), (u'blirjag', u'blir jag'), (u's\xe4gerjag', u's\xe4ger jag'), (u'beh\xe5llerjag', u'beh\xe5ller jag'), (u'pr\xf8blem', u'problem'), (u'r\xe4ddadeju', u'r\xe4ddade ju'), (u'hon\xf8m', u'honom'), (u'Ln', u'In'), (u'sv\xe5r\ufb02\xf6rtad', u'sv\xe5rfl\xf6rtad'), (u'\xf8ch', u'och'), (u'\ufb02\xf6rtar', u'fl\xf6rtar'), (u'k\xe4nnerjag', u'k\xe4nner jag'), (u'\ufb02ickan', u'flickan'), (u'sn\xf8', u'sn\xf6'), (u'gerju', u'ger ju'), (u'k\xf8ntakter', u'kontakter'), (u'\xf8lycka', u'olycka'), (u'n\xf8lla', u'nolla'), (u'sinnenajublar', u'sinnena jublar'), (u'ijobbet', u'i jobbet'), (u'F\xe5rjag', u'F\xe5r jag'), (u'Ar', u'\xc4r'), (u'liggerju', u'ligger ju'), (u'um', u'om'), (u'lbland', u'Ibland'), (u'skjuterjag', u'skjuter jag'), (u'Vadd\xe5', u'Vad d\xe5'), (u'pratarj\xe4mt', u'pratar j\xe4mt'), (u'harju', u'har ju'), (u'sitterjag', u'sitter jag'), (u'h\xe4\ufb02a', u'h\xe4rja'), (u's\ufb01\xe4l', u'stj\xe4l'), (u'F\xd6U', u'F\xf6lj'), (u'varf\xf6rjag', u'varf\xf6r jag'), (u's\ufb01\xe4rna', u'stj\xe4rna'), (u'b\xf6\ufb02ar', u'b\xf6rjar'), (u'b\xf6\ufb02an', u'b\xf6rjan'), (u'st\xe4ri', u'st\xe5r'), (u'p\xe4', u'p\xe5'), (u'harjag', u'har jag'), (u'attjag', u'att jag'), (u'Verkarjag', u'Verkar jag'), (u'K\xe4nnerjag', u'K\xe4nner jag'), (u'd\xe4rjag', u'd\xe4r jag'), (u'tu\ufb01', u'tuff'), (u'lurarjag', u'lurar jag'), (u'varj\xe4ttebra', u'var j\xe4ttebra'), (u'allvan', u'allvar'), (u'deth\xe4r', u'det h\xe4r'), (u'va\ufb02e', u'varje'), (u'F\xf6Uer', u'F\xf6ljer'), (u'personalm\xf6tetl', u'personalm\xf6tet!'), (u'harjust', u'har just'), (u'\xe4rj\xe4tteduktig', u'\xe4r j\xe4tteduktig'), (u'd\xe4rja', u'd\xe4r ja'), (u'lngen\xfcng', u'lngenting'), (u'iluften', u'i luften'), (u'\xf6sen', u'\xf6ser'), (u'tv\xe2', u'tv\xe5'), (u'Uejerna', u'Tjejerna'), (u'h\xe5n*', u'h\xe5rt'), (u'\xc4rjag', u'\xc4r jag'), (u'keL', u'Okej'), (u'F\xf6rjag', u'F\xf6r jag'), (u'varj\xe4ttekul', u'var j\xe4ttekul'), (u'k\xe4mpan', u'k\xe4mpar'), (u'mycketjobb', u'mycket jobb'), (u'Uus', u'ljus'), (u'serjag', u'ser jag'), (u'vetjag', u'vet jag'), (u'f\xe5rjag', u'f\xe5r jag'), (u'hurjag', u'hur jag'), (u'f\xf6rs\xf6kerjag', u'f\xf6rs\xf6ker jag'), (u't\xe1nagel', u't\xe5nagel'), (u'va\xfce', u'varje'), (u'Uudet', u'ljudet'), (u'amhopa', u'allihopa'), (u'V\xe4\xfc', u'V\xe4lj'), (u'g\xe4ri', u'g\xe5r'), (u'r\xf6d\xfcus', u'r\xf6dljus'), (u'Uuset', u'ljuset'), (u'Rid\xe0n', u'Rid\xe5n'), (u'vi\xfca', u'vilja'), (u'g\xe5ri', u'g\xe5r i'), (u'Hurd\xe5', u'Hur d\xe5'), (u'inter\\/juar', u'intervjuar'), (u'menarjag', u'menar jag'), (u'spyrjag', u'spyr jag'), (u'bri\xfcera', u'briljera'), (u'N\xe4rjag', u'N\xe4r jag'), (u'ner\\/\xf6s', u'nerv\xf6s'), (u'ilivets', u'i livets'), (u'n\xe4got', u'n\xe5got'), (u'p\xe0', u'p\xe5'), (u'Lnnan', u'Innan'), (u'Uf', u'Ut'), (u'lnnan', u'Innan'), (u'D\xe0ren', u'D\xe5ren'), (u'F\xe0rjag', u'F\xe5r jag'), (u'Vad\xe4rdetd\xe4L', u'Vad \xe4r det d\xe4r'), (u'sm\xe0tjuv', u'sm\xe5tjuv'), (u't\xe0gr\xe5nare', u't\xe5gr\xe5nare'), (u'dit\xe0t', u'dit\xe5t'), (u's\xe4', u's\xe5'), (u'v\xe0rdsl\xf6sa', u'v\xe5rdsl\xf6sa'), (u'n\xe0n', u'n\xe5n'), (u'kommerjag', u'kommer jag'), (u'\xe4rj\xe4ttebra', u'\xe4r j\xe4ttebra'), (u'\xe4rj\xe4vligt', u'\xe4r j\xe4vligt'), (u'\xe0kerjag', u'\xe5ker jag'), (u'ellerjapaner', u'eller japaner'), (u'attjaga', u'att jaga'), (u'eften', u'efter'), (u'h\xe4stan', u'h\xe4star'), (u'Lntensivare', u'Intensivare'), (u'fr\xe0garjag', u'fr\xe5gar jag'), (u'pen/ers', u'pervers'), (u'r\xe0barkade', u'r\xe5barkade'), (u'styrkon', u'styrkor'), (u'Dif\xe5f', u'Dit\xe5t'), (u'h\xe4nden', u'h\xe4nder'), (u'f\xf6\ufb01a', u'f\xf6lja'), (u'Idioten/', u'Idioter!'), (u'Varf\xf6rjagade', u'Varf\xf6r jagade'), (u'd\xe4rf\xf6rjag', u'd\xe4rf\xf6r jag'), (u'forjag', u'for jag'), (u'Iivsgladje', u'livsgl\xe4dje'), (u'narjag', u'n\xe4r jag'), (u'sajag', u'sa jag'), (u'genastja', u'genast ja'), (u'rockument\xe0ren', u'rockument\xe4ren'), (u'turne', u'turn\xe9'), (u'fickjag', u'fick jag'), (u'sager', u's\xe4ger'), (u'Ijush\xe5rig', u'ljush\xe5rig'), (u'tradg\xe5rdsolycka', u'tr\xe4dg\xe5rdsolycka'), (u'kvavdes', u'kv\xe4vdes'), (u'd\xe0rja', u'd\xe4r ja'), (u'hedersgaster', u'hedersg\xe4ster'), (u'Nar', u'N\xe4r'), (u'smaki\xf6sa', u'smakl\xf6sa'), (u'lan', u'Ian'), (u'Lan', u'Ian'), (u'eri', u'er i'), (u'universitetsamne', u'universitets\xe4mne'), (u'garna', u'g\xe4rna'), (u'ar', u'\xe4r'), (u'baltdjur', u'b\xe4ltdjur'), (u'varjag', u'var jag'), (u'\xe0r', u'\xe4r'), (u'f\xf6rf\xf6rst\xe0rkare', u'f\xf6rf\xf6rst\xe4rkare'), (u'arjattespeciell', u'\xe4r j\xe4ttespeciell'), (u'h\xe0rg\xe5r', u'h\xe4r g\xe5r'), (u'Ia', u'la'), (u'Iimousinen', u'limousinen'), (u'krickettra', u'krickettr\xe4'), (u'h\xe5rdrockv\xe0rlden', u'h\xe5rdrockv\xe4rlden'), (u'tr\xe0bit', u'tr\xe4bit'), (u'Mellanvastern', u'Mellanv\xe4stern'), (u'arju', u'\xe4r ju'), (u'turnen', u'turn\xe9n'), (u'kanns', u'k\xe4nns'), (u'battre', u'b\xe4ttre'), (u'v\xe0rldsturne', u'v\xe4rldsturne'), (u'dar', u'd\xe4r'), (u'sj\xe0lvant\xe0nder', u'sj\xe4lvant\xe4nder'), (u'jattelange', u'j\xe4ttel\xe4nge'), (u'berattade', u'ber\xe4ttade'), (u'S\xe4', u'S\xe5'), (u'vandpunkten', u'v\xe4ndpunkten'), (u'N\xe0rjag', u'N\xe4r jag'), (u'lasa', u'l\xe4sa'), (u'skitl\xe0skigt', u'skitl\xe4skigt'), (u'sambandsv\xe0g', u'sambandsv\xe4g'), (u'valdigt', u'v\xe4ldigt'), (u'Stamga\ufb01el', u'St\xe4mgaffel'), (u'\xe0rjag', u'\xe4r jag'), (u'tajming', u'tajmning'), (u'utg\xe4ng', u'utg\xe5ng'), (u'H\xe0r\xe5t', u'H\xe4r\xe5t'), (u'h\xe0r\xe5t', u'h\xe4r\xe5t'), (u'anvander', u'anv\xe4nder'), (u'harjobbat', u'har jobbat'), (u'imageide', u'imageid\xe9'), (u'kla\ufb01en', u'klaffen'), (u'sjalv', u'sj\xe4lv'), (u'dvarg', u'dv\xe4rg'), (u'detjag', u'det jag'), (u'dvargarna', u'dv\xe4rgarna'), (u'fantasiv\xe0rld', u'fantasiv\xe4rld'), (u'\ufb01olliga', u'Fjolliga'), (u'mandoiinstr\xe0ngar', u'mandollnstr\xe4ngar'), (u'mittjobb', u'mitt jobb'), (u'Skajag', u'Ska jag'), (u'landari', u'landar i'), (u'gang', u'g\xe4ng'), (u'Detjag', u'Det jag'), (u'Narmre', u'N\xe4rmre'), (u'I\xe5tjavelni', u'l\xe5tj\xe4veln'), (u'H\xe5llerjag', u'H\xe5ller jag'), (u'visionarer', u'vision\xe4rer'), (u'T\xfclvad', u'Till vad'), (u'milit\xe0rbas', u'milit\xe4rbas'), (u'jattegiada', u'j\xe4tteglada'), (u'Fastjag', u'Fast jag'), (u's\xe5jag', u's\xe5 jag'), (u'rockvarlden', u'rockv\xe4rlden'), (u'saknarjag', u'saknar jag'), (u'allafall', u'alla fall'), (u'\ufb01anta', u'fjanta'), (u'Kr\xe0ma', u'Kr\xe4ma'), (u'stammer', u'st\xe4mmer'), (u'budb\xe0rare', u'budb\xe4rare'), (u'Iivsfiiosofi', u'livsfiiosofi'), (u'f\xf6rj\xe4mnan', u'f\xf6r j\xe4mnan'), (u'gillarjag', u'gillar jag'), (u'Iarvat', u'larvat'), (u'klararjag', u'klarar jag'), (u"hatta\ufb01'\xe0r", u'hattaff\xe4r'), (u'D\xe0', u'D\xe5'), (u'upp\ufb01nna', u'uppfinna'), (u'R\xe0ttf\xe5glar', u'R\xe5ttf\xe5glar'), (u'Sv\xe4\xfcboda', u'Sv\xe4ljboda'), (u'P\xe5b\xf6\ufb02ar', u'P\xe5b\xf6rjar'), (u'slutarju', u'slutar ju'), (u'ni\ufb01skebu\xfcken', u'i fiskebutiken'), (u'h\xe4rj\xe4keln', u'h\xe4r j\xe4keln'), (u'H\xdfppa', u'Hoppa'), (u'f\xf6rst\xf6rds', u'f\xf6rst\xf6rdes'), (u'varj\xe4ttegoda', u'var j\xe4ttegoda'), (u'Kor\\/', u'Korv'), (u'br\xfcl\xe9el', u'br\xfcl\xe9e!'), (u'Hei', u'Hej'), (u'\xe4lskarjordgubbsglass', u'\xe4lskar jordgubbsglass'), (u'Sn\xf6bom', u'Sn\xf6boll'), (u'Sn\xf6boH', u'Sn\xf6boll'), (u'Sn\xf6bol', u'Sn\xf6boll'), (u'sn\xf6boH', u'sn\xf6boll'), (u'L\xe4ggerp\xe5', u'L\xe4gger p\xe5'), (u'lnge\ufb02', u'lnget!'), (u'S\xe4gerj\xe4ttesmarta', u'S\xe4ger j\xe4ttesmarta'), (u'dopplen/\xe4derradar', u'dopplerv\xe4derradar'), (u's\xe4kertj\xe4ttefin', u's\xe4kert j\xe4ttefin'), (u'\xe4rj\xe4ttefin', u'\xe4r j\xe4ttefin'), (u'verkarju', u'verkar ju'), (u'blirju', u'blir ju'), (u'kor\\/', u'korv'), (u'naturkatastro\ufb01', u'naturkatastrof!'), (u'stickerjag', u'stickerj ag'), (u'j\xe4ttebu\ufb01\xe9', u'j\xe4ttebuff\xe9'), (u'be\ufb01nner', u'befinner'), (u'Sp\ufb02ng', u'Spring'), (u'trec\ufb01e', u'tredje'), (u'ryckerjag', u'rycker jag'), (u'skullejag', u'skulle jag'), (u'vetju', u'vet ju'), (u'a\ufb02jag', u'att jag'), (u'\ufb02nns', u'finns'), (u'\xe4rl\xe5ng', u'\xe4r l\xe5ng'), (u'k\xe5ra', u'k\xe4ra'), (u'\xe4r\ufb01na', u'\xe4r \ufb01na'), (u'\xe4ri', u'\xe4r i'), (u'h\xf6rden', u'h\xf6r den'), (u'\xe4ttj\xe4g', u'att j\xe4g'), (u'g\xe4r', u'g\xe5r'), (u'f\xf6ri', u'f\xf6r i'), (u'Hurvisste', u'Hur visste'), (u'\ufb01ck', u'fick'), (u'\ufb01nns', u'finns'), (u'\ufb01n', u'fin'), (u'Fa', u'Bra.'), (u'bori', u'bor i'), (u'fiendeplanl', u'fiendeplan!'), (u'if\xf6rnamn', u'i f\xf6rnamn'), (u'detju', u'det ju'), (u'N\xfcd', u'Niki'), (u'hatarjag', u'hatar jag'), (u'Klararjag', u'Klarar jag'), (u'deta\ufb01er', u'detaljer'), (u'v\xe4/', u'v\xe4l'), (u'smakarju', u'smakar ju'), (u'Teache\ufb02', u'Teacher!'), (u'imorse', u'i morse'), (u'drickerjag', u'dricker jag'), (u'st\xe5ri', u'st\xe5r i'), (u'Harjag', u'Har jag'), (u'Talarjag', u'Talar jag'), (u'undrarjag', u'undrar jag'), (u'\xe5lderjag', u'\xe5lder jag'), (u'va\ufb01e', u'varje'), (u'f\xf6rfalskningl', u'f\xf6rfalskning!'), (u'Vi\ufb01iiiam', u'William'), (u'V\\\ufb01lliams', u'Williams'), (u'attjobba', u'att jobba'), (u'intei', u'inte i'), (u'n\xe4rV\\\ufb01lliam', u'n\xe4r William'), (u'V\\\ufb01lliam', u'William'), (u'E\ufb01ersom', u'Eftersom'), (u'Vl\ufb01lliam', u'William'), (u'I\xe4ngejag', u'l\xe4nge jag'), (u"'\ufb01digare", u'Tidigare'), (u'b\xf6rjadei', u'b\xf6rjade i'), (u'merjust', u'mer just'), (u'e\ufb01er\xe5t', u'efter\xe5t'), (u'gjordejag', u'gjorde jag'), (u'hadeju', u'hade ju'), (u'g\xe5rvi', u'g\xe5r vi'), (u'k\xf6perjag', u'k\xf6per jag'), (u'M\xe5stejag', u'M\xe5ste jag'), (u'k\xe4nnerju', u'k\xe4nner ju'), (u'\ufb02n', u'fin'), (u'treviig', u'trevlig'), (u'Grattisl', u'Grattis!'), (u'kande', u'k\xe4nde'), (u"'llden", u'Tiden'), (u'sakjag', u'sak jag'), (u'klartjag', u'klart jag'), (u'h\xe4\ufb01igt', u'h\xe4ftigt'), (u'I\xe4mnarjag', u'l\xe4mnar jag'), (u'gickju', u'gick ju'), (u'skajag', u'ska jag'), (u'G\xf6rjag', u'G\xf6r jag'), (u'm\xe5stejag', u'm\xe5ste jag'), (u'gra\\/iditet', u'graviditet'), (u'hittadqdin', u'hittade din'), (u'\xe4rjobbigt', u'\xe4r jobbigt'), (u'Overdrivet', u'\xd6verdrivet'), (u'hOgtidlig', u'h\xf6gtidlig'), (u'Overtyga', u'\xd6vertyga'), (u'SKILSMASSA', u'SKILSM\xc4SSA'), (u'brukarju', u'brukar ju'), (u'lsabel', u'Isabel'), (u'kundejag', u'kunde jag'), (u'\xe4rl\xe4get', u'\xe4r l\xe4get'), (u'blirinte', u'blir inte'), (u"l'm", u"I'm"), (u"lt's", u"It's"), (u'ijakt', u'i jakt'), (u'avjordens', u'av jordens')]), - 'pattern': u"(?um)(\\b|^)(?:l\\\xe2rt|hederv\\\xe5rda|storm\\\xe2stare|Avf\\\xe2rd|t\\\xe2lten|\\\xe2rjag|\\\xe4rjag|j\\\xe2mlikar|Riskako\\\ufb02|Karamellen\\/|Lngen\\\xfcng|\\\xe4rju|S\\\xe1|n\\\xe4rjag|alltjag|g\\\xf6rjag|trorjag|varju|g\\\xf6rju|kanju|blirjag|s\\\xe4gerjag|beh\\\xe5llerjag|pr\\\xf8blem|r\\\xe4ddadeju|hon\\\xf8m|Ln|sv\\\xe5r\\\ufb02\\\xf6rtad|\\\xf8ch|\\\ufb02\\\xf6rtar|k\\\xe4nnerjag|\\\ufb02ickan|sn\\\xf8|gerju|k\\\xf8ntakter|\\\xf8lycka|n\\\xf8lla|sinnenajublar|ijobbet|F\\\xe5rjag|Ar|liggerju|um|lbland|skjuterjag|Vadd\\\xe5|pratarj\\\xe4mt|harju|sitterjag|h\\\xe4\\\ufb02a|s\\\ufb01\\\xe4l|F\\\xd6U|varf\\\xf6rjag|s\\\ufb01\\\xe4rna|b\\\xf6\\\ufb02ar|b\\\xf6\\\ufb02an|st\\\xe4ri|p\\\xe4|harjag|attjag|Verkarjag|K\\\xe4nnerjag|d\\\xe4rjag|tu\\\ufb01|lurarjag|varj\\\xe4ttebra|allvan|deth\\\xe4r|va\\\ufb02e|F\\\xf6Uer|personalm\\\xf6tetl|harjust|\\\xe4rj\\\xe4tteduktig|d\\\xe4rja|lngen\\\xfcng|iluften|\\\xf6sen|tv\\\xe2|Uejerna|h\\\xe5n\\*|\\\xc4rjag|keL|F\\\xf6rjag|varj\\\xe4ttekul|k\\\xe4mpan|mycketjobb|Uus|serjag|vetjag|f\\\xe5rjag|hurjag|f\\\xf6rs\\\xf6kerjag|t\\\xe1nagel|va\\\xfce|Uudet|amhopa|V\\\xe4\\\xfc|g\\\xe4ri|r\\\xf6d\\\xfcus|Uuset|Rid\\\xe0n|vi\\\xfca|g\\\xe5ri|Hurd\\\xe5|inter\\\\\\/juar|menarjag|spyrjag|bri\\\xfcera|N\\\xe4rjag|ner\\\\\\/\\\xf6s|ilivets|n\\\xe4got|p\\\xe0|Lnnan|Uf|lnnan|D\\\xe0ren|F\\\xe0rjag|Vad\\\xe4rdetd\\\xe4L|sm\\\xe0tjuv|t\\\xe0gr\\\xe5nare|dit\\\xe0t|s\\\xe4|v\\\xe0rdsl\\\xf6sa|n\\\xe0n|kommerjag|\\\xe4rj\\\xe4ttebra|\\\xe4rj\\\xe4vligt|\\\xe0kerjag|ellerjapaner|attjaga|eften|h\\\xe4stan|Lntensivare|fr\\\xe0garjag|pen\\/ers|r\\\xe0barkade|styrkon|Dif\\\xe5f|h\\\xe4nden|f\\\xf6\\\ufb01a|Idioten\\/|Varf\\\xf6rjagade|d\\\xe4rf\\\xf6rjag|forjag|Iivsgladje|narjag|sajag|genastja|rockument\\\xe0ren|turne|fickjag|sager|Ijush\\\xe5rig|tradg\\\xe5rdsolycka|kvavdes|d\\\xe0rja|hedersgaster|Nar|smaki\\\xf6sa|lan|Lan|eri|universitetsamne|garna|ar|baltdjur|varjag|\\\xe0r|f\\\xf6rf\\\xf6rst\\\xe0rkare|arjattespeciell|h\\\xe0rg\\\xe5r|Ia|Iimousinen|krickettra|h\\\xe5rdrockv\\\xe0rlden|tr\\\xe0bit|Mellanvastern|arju|turnen|kanns|battre|v\\\xe0rldsturne|dar|sj\\\xe0lvant\\\xe0nder|jattelange|berattade|S\\\xe4|vandpunkten|N\\\xe0rjag|lasa|skitl\\\xe0skigt|sambandsv\\\xe0g|valdigt|Stamga\\\ufb01el|\\\xe0rjag|tajming|utg\\\xe4ng|H\\\xe0r\\\xe5t|h\\\xe0r\\\xe5t|anvander|harjobbat|imageide|kla\\\ufb01en|sjalv|dvarg|detjag|dvargarna|fantasiv\\\xe0rld|\\\ufb01olliga|mandoiinstr\\\xe0ngar|mittjobb|Skajag|landari|gang|Detjag|Narmre|I\\\xe5tjavelni|H\\\xe5llerjag|visionarer|T\\\xfclvad|milit\\\xe0rbas|jattegiada|Fastjag|s\\\xe5jag|rockvarlden|saknarjag|allafall|\\\ufb01anta|Kr\\\xe0ma|stammer|budb\\\xe0rare|Iivsfiiosofi|f\\\xf6rj\\\xe4mnan|gillarjag|Iarvat|klararjag|hatta\\\ufb01\\'\\\xe0r|D\\\xe0|upp\\\ufb01nna|R\\\xe0ttf\\\xe5glar|Sv\\\xe4\\\xfcboda|P\\\xe5b\\\xf6\\\ufb02ar|slutarju|ni\\\ufb01skebu\\\xfcken|h\\\xe4rj\\\xe4keln|H\\\xdfppa|f\\\xf6rst\\\xf6rds|varj\\\xe4ttegoda|Kor\\\\\\/|br\\\xfcl\\\xe9el|Hei|\\\xe4lskarjordgubbsglass|Sn\\\xf6bom|Sn\\\xf6boH|Sn\\\xf6bol|sn\\\xf6boH|L\\\xe4ggerp\\\xe5|lnge\\\ufb02|S\\\xe4gerj\\\xe4ttesmarta|dopplen\\/\\\xe4derradar|s\\\xe4kertj\\\xe4ttefin|\\\xe4rj\\\xe4ttefin|verkarju|blirju|kor\\\\\\/|naturkatastro\\\ufb01|stickerjag|j\\\xe4ttebu\\\ufb01\\\xe9|be\\\ufb01nner|Sp\\\ufb02ng|trec\\\ufb01e|ryckerjag|skullejag|vetju|a\\\ufb02jag|\\\ufb02nns|\\\xe4rl\\\xe5ng|k\\\xe5ra|\\\xe4r\\\ufb01na|\\\xe4ri|h\\\xf6rden|\\\xe4ttj\\\xe4g|g\\\xe4r|f\\\xf6ri|Hurvisste|\\\ufb01ck|\\\ufb01nns|\\\ufb01n|Fa|bori|fiendeplanl|if\\\xf6rnamn|detju|N\\\xfcd|hatarjag|Klararjag|deta\\\ufb01er|v\\\xe4\\/|smakarju|Teache\\\ufb02|imorse|drickerjag|st\\\xe5ri|Harjag|Talarjag|undrarjag|\\\xe5lderjag|va\\\ufb01e|f\\\xf6rfalskningl|Vi\\\ufb01iiiam|V\\\\\\\ufb01lliams|attjobba|intei|n\\\xe4rV\\\\\\\ufb01lliam|V\\\\\\\ufb01lliam|E\\\ufb01ersom|Vl\\\ufb01lliam|I\\\xe4ngejag|\\'\\\ufb01digare|b\\\xf6rjadei|merjust|e\\\ufb01er\\\xe5t|gjordejag|hadeju|g\\\xe5rvi|k\\\xf6perjag|M\\\xe5stejag|k\\\xe4nnerju|\\\ufb02n|treviig|Grattisl|kande|\\'llden|sakjag|klartjag|h\\\xe4\\\ufb01igt|I\\\xe4mnarjag|gickju|skajag|G\\\xf6rjag|m\\\xe5stejag|gra\\\\\\/iditet|hittadqdin|\\\xe4rjobbigt|Overdrivet|hOgtidlig|Overtyga|SKILSMASSA|brukarju|lsabel|kundejag|\\\xe4rl\\\xe4get|blirinte|l\\'m|lt\\'s|ijakt|avjordens)(\\b|$)"}}} + 'WholeWords': {'data': OrderedDict([(u'l\xe2rt', u'l\xe4rt'), (u'hederv\xe5rda', u'hederv\xe4rda'), (u'storm\xe2stare', u'storm\xe4stare'), (u'Avf\xe2rd', u'Avf\xe4rd'), (u't\xe2lten', u't\xe4lten'), (u'\xe2rjag', u'\xe4r jag'), (u'\xe4rjag', u'\xe4r jag'), (u'j\xe2mlikar', u'j\xe4mlikar'), (u'Riskako\ufb02', u'Riskakor'), (u'Karamellen/', u'Karamellen'), (u'Lngen\xfcng', u'Ingenting'), (u'\xe4rju', u'\xe4r ju'), (u'S\xe1', u'S\xe5'), (u'n\xe4rjag', u'n\xe4r jag'), (u'alltjag', u'allt jag'), (u'g\xf6rjag', u'g\xf6r jag'), (u'trorjag', u'tror jag'), (u'varju', u'var ju'), (u'g\xf6rju', u'g\xf6r ju'), (u'kanju', u'kan ju'), (u'blirjag', u'blir jag'), (u's\xe4gerjag', u's\xe4ger jag'), (u'beh\xe5llerjag', u'beh\xe5ller jag'), (u'pr\xf8blem', u'problem'), (u'r\xe4ddadeju', u'r\xe4ddade ju'), (u'hon\xf8m', u'honom'), (u'Ln', u'In'), (u'sv\xe5r\ufb02\xf6rtad', u'sv\xe5rfl\xf6rtad'), (u'\xf8ch', u'och'), (u'\ufb02\xf6rtar', u'fl\xf6rtar'), (u'k\xe4nnerjag', u'k\xe4nner jag'), (u'\ufb02ickan', u'flickan'), (u'sn\xf8', u'sn\xf6'), (u'gerju', u'ger ju'), (u'k\xf8ntakter', u'kontakter'), (u'\xf8lycka', u'olycka'), (u'n\xf8lla', u'nolla'), (u'sinnenajublar', u'sinnena jublar'), (u'ijobbet', u'i jobbet'), (u'F\xe5rjag', u'F\xe5r jag'), (u'Ar', u'\xc4r'), (u'liggerju', u'ligger ju'), (u'um', u'om'), (u'lbland', u'Ibland'), (u'skjuterjag', u'skjuter jag'), (u'Vadd\xe5', u'Vad d\xe5'), (u'pratarj\xe4mt', u'pratar j\xe4mt'), (u'harju', u'har ju'), (u'sitterjag', u'sitter jag'), (u'h\xe4\ufb02a', u'h\xe4rja'), (u's\ufb01\xe4l', u'stj\xe4l'), (u'F\xd6U', u'F\xf6lj'), (u'varf\xf6rjag', u'varf\xf6r jag'), (u's\ufb01\xe4rna', u'stj\xe4rna'), (u'b\xf6\ufb02ar', u'b\xf6rjar'), (u'b\xf6\ufb02an', u'b\xf6rjan'), (u'st\xe4ri', u'st\xe5r'), (u'p\xe4', u'p\xe5'), (u'harjag', u'har jag'), (u'attjag', u'att jag'), (u'Verkarjag', u'Verkar jag'), (u'K\xe4nnerjag', u'K\xe4nner jag'), (u'd\xe4rjag', u'd\xe4r jag'), (u'tu\ufb01', u'tuff'), (u'lurarjag', u'lurar jag'), (u'varj\xe4ttebra', u'var j\xe4ttebra'), (u'allvan', u'allvar'), (u'deth\xe4r', u'det h\xe4r'), (u'va\ufb02e', u'varje'), (u'F\xf6Uer', u'F\xf6ljer'), (u'personalm\xf6tetl', u'personalm\xf6tet!'), (u'harjust', u'har just'), (u'\xe4rj\xe4tteduktig', u'\xe4r j\xe4tteduktig'), (u'd\xe4rja', u'd\xe4r ja'), (u'lngen\xfcng', u'lngenting'), (u'iluften', u'i luften'), (u'\xf6sen', u'\xf6ser'), (u'tv\xe2', u'tv\xe5'), (u'Uejerna', u'Tjejerna'), (u'h\xe5n*', u'h\xe5rt'), (u'\xc4rjag', u'\xc4r jag'), (u'keL', u'Okej'), (u'F\xf6rjag', u'F\xf6r jag'), (u'varj\xe4ttekul', u'var j\xe4ttekul'), (u'k\xe4mpan', u'k\xe4mpar'), (u'mycketjobb', u'mycket jobb'), (u'Uus', u'ljus'), (u'serjag', u'ser jag'), (u'vetjag', u'vet jag'), (u'f\xe5rjag', u'f\xe5r jag'), (u'hurjag', u'hur jag'), (u'f\xf6rs\xf6kerjag', u'f\xf6rs\xf6ker jag'), (u't\xe1nagel', u't\xe5nagel'), (u'va\xfce', u'varje'), (u'Uudet', u'ljudet'), (u'amhopa', u'allihopa'), (u'V\xe4\xfc', u'V\xe4lj'), (u'g\xe4ri', u'g\xe5r'), (u'r\xf6d\xfcus', u'r\xf6dljus'), (u'Uuset', u'ljuset'), (u'Rid\xe0n', u'Rid\xe5n'), (u'vi\xfca', u'vilja'), (u'g\xe5ri', u'g\xe5r i'), (u'Hurd\xe5', u'Hur d\xe5'), (u'inter\\/juar', u'intervjuar'), (u'menarjag', u'menar jag'), (u'spyrjag', u'spyr jag'), (u'bri\xfcera', u'briljera'), (u'N\xe4rjag', u'N\xe4r jag'), (u'ner\\/\xf6s', u'nerv\xf6s'), (u'ilivets', u'i livets'), (u'n\xe4got', u'n\xe5got'), (u'p\xe0', u'p\xe5'), (u'Lnnan', u'Innan'), (u'Uf', u'Ut'), (u'lnnan', u'Innan'), (u'D\xe0ren', u'D\xe5ren'), (u'F\xe0rjag', u'F\xe5r jag'), (u'Vad\xe4rdetd\xe4L', u'Vad \xe4r det d\xe4r'), (u'sm\xe0tjuv', u'sm\xe5tjuv'), (u't\xe0gr\xe5nare', u't\xe5gr\xe5nare'), (u'dit\xe0t', u'dit\xe5t'), (u's\xe4', u's\xe5'), (u'v\xe0rdsl\xf6sa', u'v\xe5rdsl\xf6sa'), (u'n\xe0n', u'n\xe5n'), (u'kommerjag', u'kommer jag'), (u'\xe4rj\xe4ttebra', u'\xe4r j\xe4ttebra'), (u'\xe4rj\xe4vligt', u'\xe4r j\xe4vligt'), (u'\xe0kerjag', u'\xe5ker jag'), (u'ellerjapaner', u'eller japaner'), (u'attjaga', u'att jaga'), (u'eften', u'efter'), (u'h\xe4stan', u'h\xe4star'), (u'Lntensivare', u'Intensivare'), (u'fr\xe0garjag', u'fr\xe5gar jag'), (u'pen/ers', u'pervers'), (u'r\xe0barkade', u'r\xe5barkade'), (u'styrkon', u'styrkor'), (u'Dif\xe5f', u'Dit\xe5t'), (u'h\xe4nden', u'h\xe4nder'), (u'f\xf6\ufb01a', u'f\xf6lja'), (u'Idioten/', u'Idioter!'), (u'Varf\xf6rjagade', u'Varf\xf6r jagade'), (u'd\xe4rf\xf6rjag', u'd\xe4rf\xf6r jag'), (u'forjag', u'for jag'), (u'Iivsgladje', u'livsgl\xe4dje'), (u'narjag', u'n\xe4r jag'), (u'sajag', u'sa jag'), (u'genastja', u'genast ja'), (u'rockument\xe0ren', u'rockument\xe4ren'), (u'turne', u'turn\xe9'), (u'fickjag', u'fick jag'), (u'sager', u's\xe4ger'), (u'Ijush\xe5rig', u'ljush\xe5rig'), (u'tradg\xe5rdsolycka', u'tr\xe4dg\xe5rdsolycka'), (u'kvavdes', u'kv\xe4vdes'), (u'd\xe0rja', u'd\xe4r ja'), (u'hedersgaster', u'hedersg\xe4ster'), (u'Nar', u'N\xe4r'), (u'smaki\xf6sa', u'smakl\xf6sa'), (u'lan', u'Ian'), (u'Lan', u'Ian'), (u'eri', u'er i'), (u'universitetsamne', u'universitets\xe4mne'), (u'garna', u'g\xe4rna'), (u'ar', u'\xe4r'), (u'baltdjur', u'b\xe4ltdjur'), (u'varjag', u'var jag'), (u'\xe0r', u'\xe4r'), (u'f\xf6rf\xf6rst\xe0rkare', u'f\xf6rf\xf6rst\xe4rkare'), (u'arjattespeciell', u'\xe4r j\xe4ttespeciell'), (u'h\xe0rg\xe5r', u'h\xe4r g\xe5r'), (u'Ia', u'la'), (u'Iimousinen', u'limousinen'), (u'krickettra', u'krickettr\xe4'), (u'h\xe5rdrockv\xe0rlden', u'h\xe5rdrockv\xe4rlden'), (u'tr\xe0bit', u'tr\xe4bit'), (u'Mellanvastern', u'Mellanv\xe4stern'), (u'arju', u'\xe4r ju'), (u'turnen', u'turn\xe9n'), (u'kanns', u'k\xe4nns'), (u'battre', u'b\xe4ttre'), (u'v\xe0rldsturne', u'v\xe4rldsturne'), (u'dar', u'd\xe4r'), (u'sj\xe0lvant\xe0nder', u'sj\xe4lvant\xe4nder'), (u'jattelange', u'j\xe4ttel\xe4nge'), (u'berattade', u'ber\xe4ttade'), (u'S\xe4', u'S\xe5'), (u'vandpunkten', u'v\xe4ndpunkten'), (u'N\xe0rjag', u'N\xe4r jag'), (u'lasa', u'l\xe4sa'), (u'skitl\xe0skigt', u'skitl\xe4skigt'), (u'sambandsv\xe0g', u'sambandsv\xe4g'), (u'valdigt', u'v\xe4ldigt'), (u'Stamga\ufb01el', u'St\xe4mgaffel'), (u'\xe0rjag', u'\xe4r jag'), (u'tajming', u'tajmning'), (u'utg\xe4ng', u'utg\xe5ng'), (u'H\xe0r\xe5t', u'H\xe4r\xe5t'), (u'h\xe0r\xe5t', u'h\xe4r\xe5t'), (u'anvander', u'anv\xe4nder'), (u'harjobbat', u'har jobbat'), (u'imageide', u'imageid\xe9'), (u'kla\ufb01en', u'klaffen'), (u'sjalv', u'sj\xe4lv'), (u'dvarg', u'dv\xe4rg'), (u'detjag', u'det jag'), (u'dvargarna', u'dv\xe4rgarna'), (u'fantasiv\xe0rld', u'fantasiv\xe4rld'), (u'\ufb01olliga', u'Fjolliga'), (u'mandoiinstr\xe0ngar', u'mandollnstr\xe4ngar'), (u'mittjobb', u'mitt jobb'), (u'Skajag', u'Ska jag'), (u'landari', u'landar i'), (u'gang', u'g\xe4ng'), (u'Detjag', u'Det jag'), (u'Narmre', u'N\xe4rmre'), (u'I\xe5tjavelni', u'l\xe5tj\xe4veln'), (u'H\xe5llerjag', u'H\xe5ller jag'), (u'visionarer', u'vision\xe4rer'), (u'T\xfclvad', u'Till vad'), (u'milit\xe0rbas', u'milit\xe4rbas'), (u'jattegiada', u'j\xe4tteglada'), (u'Fastjag', u'Fast jag'), (u's\xe5jag', u's\xe5 jag'), (u'rockvarlden', u'rockv\xe4rlden'), (u'saknarjag', u'saknar jag'), (u'allafall', u'alla fall'), (u'\ufb01anta', u'fjanta'), (u'Kr\xe0ma', u'Kr\xe4ma'), (u'stammer', u'st\xe4mmer'), (u'budb\xe0rare', u'budb\xe4rare'), (u'Iivsfiiosofi', u'livsfiiosofi'), (u'f\xf6rj\xe4mnan', u'f\xf6r j\xe4mnan'), (u'gillarjag', u'gillar jag'), (u'Iarvat', u'larvat'), (u'klararjag', u'klarar jag'), (u"hatta\ufb01'\xe0r", u'hattaff\xe4r'), (u'D\xe0', u'D\xe5'), (u'upp\ufb01nna', u'uppfinna'), (u'R\xe0ttf\xe5glar', u'R\xe5ttf\xe5glar'), (u'Sv\xe4\xfcboda', u'Sv\xe4ljboda'), (u'P\xe5b\xf6\ufb02ar', u'P\xe5b\xf6rjar'), (u'slutarju', u'slutar ju'), (u'ni\ufb01skebu\xfcken', u'i fiskebutiken'), (u'h\xe4rj\xe4keln', u'h\xe4r j\xe4keln'), (u'H\xdfppa', u'Hoppa'), (u'f\xf6rst\xf6rds', u'f\xf6rst\xf6rdes'), (u'varj\xe4ttegoda', u'var j\xe4ttegoda'), (u'Kor\\/', u'Korv'), (u'br\xfcl\xe9el', u'br\xfcl\xe9e!'), (u'Hei', u'Hej'), (u'\xe4lskarjordgubbsglass', u'\xe4lskar jordgubbsglass'), (u'Sn\xf6bom', u'Sn\xf6boll'), (u'Sn\xf6boH', u'Sn\xf6boll'), (u'Sn\xf6bol', u'Sn\xf6boll'), (u'sn\xf6boH', u'sn\xf6boll'), (u'L\xe4ggerp\xe5', u'L\xe4gger p\xe5'), (u'lnge\ufb02', u'lnget!'), (u'S\xe4gerj\xe4ttesmarta', u'S\xe4ger j\xe4ttesmarta'), (u'dopplen/\xe4derradar', u'dopplerv\xe4derradar'), (u's\xe4kertj\xe4ttefin', u's\xe4kert j\xe4ttefin'), (u'\xe4rj\xe4ttefin', u'\xe4r j\xe4ttefin'), (u'verkarju', u'verkar ju'), (u'blirju', u'blir ju'), (u'kor\\/', u'korv'), (u'naturkatastro\ufb01', u'naturkatastrof!'), (u'stickerjag', u'stickerj ag'), (u'j\xe4ttebu\ufb01\xe9', u'j\xe4ttebuff\xe9'), (u'be\ufb01nner', u'befinner'), (u'Sp\ufb02ng', u'Spring'), (u'trec\ufb01e', u'tredje'), (u'ryckerjag', u'rycker jag'), (u'skullejag', u'skulle jag'), (u'vetju', u'vet ju'), (u'a\ufb02jag', u'att jag'), (u'\ufb02nns', u'finns'), (u'\xe4rl\xe5ng', u'\xe4r l\xe5ng'), (u'k\xe5ra', u'k\xe4ra'), (u'\xe4r\ufb01na', u'\xe4r \ufb01na'), (u'\xe4ri', u'\xe4r i'), (u'h\xf6rden', u'h\xf6r den'), (u'\xe4ttj\xe4g', u'att j\xe4g'), (u'g\xe4r', u'g\xe5r'), (u'f\xf6ri', u'f\xf6r i'), (u'Hurvisste', u'Hur visste'), (u'\ufb01ck', u'fick'), (u'\ufb01nns', u'finns'), (u'\ufb01n', u'fin'), (u'Fa', u'Bra.'), (u'bori', u'bor i'), (u'fiendeplanl', u'fiendeplan!'), (u'if\xf6rnamn', u'i f\xf6rnamn'), (u'detju', u'det ju'), (u'N\xfcd', u'Niki'), (u'hatarjag', u'hatar jag'), (u'Klararjag', u'Klarar jag'), (u'deta\ufb01er', u'detaljer'), (u'v\xe4/', u'v\xe4l'), (u'smakarju', u'smakar ju'), (u'Teache\ufb02', u'Teacher!'), (u'imorse', u'i morse'), (u'drickerjag', u'dricker jag'), (u'st\xe5ri', u'st\xe5r i'), (u'Harjag', u'Har jag'), (u'Talarjag', u'Talar jag'), (u'undrarjag', u'undrar jag'), (u'\xe5lderjag', u'\xe5lder jag'), (u'va\ufb01e', u'varje'), (u'f\xf6rfalskningl', u'f\xf6rfalskning!'), (u'Vi\ufb01iiiam', u'William'), (u'V\\\ufb01lliams', u'Williams'), (u'attjobba', u'att jobba'), (u'intei', u'inte i'), (u'n\xe4rV\\\ufb01lliam', u'n\xe4r William'), (u'V\\\ufb01lliam', u'William'), (u'E\ufb01ersom', u'Eftersom'), (u'Vl\ufb01lliam', u'William'), (u'I\xe4ngejag', u'l\xe4nge jag'), (u"'\ufb01digare", u'Tidigare'), (u'b\xf6rjadei', u'b\xf6rjade i'), (u'merjust', u'mer just'), (u'e\ufb01er\xe5t', u'efter\xe5t'), (u'gjordejag', u'gjorde jag'), (u'hadeju', u'hade ju'), (u'g\xe5rvi', u'g\xe5r vi'), (u'k\xf6perjag', u'k\xf6per jag'), (u'M\xe5stejag', u'M\xe5ste jag'), (u'k\xe4nnerju', u'k\xe4nner ju'), (u'\ufb02n', u'fin'), (u'treviig', u'trevlig'), (u'Grattisl', u'Grattis!'), (u'kande', u'k\xe4nde'), (u"'llden", u'Tiden'), (u'sakjag', u'sak jag'), (u'klartjag', u'klart jag'), (u'h\xe4\ufb01igt', u'h\xe4ftigt'), (u'I\xe4mnarjag', u'l\xe4mnar jag'), (u'gickju', u'gick ju'), (u'skajag', u'ska jag'), (u'G\xf6rjag', u'G\xf6r jag'), (u'm\xe5stejag', u'm\xe5ste jag'), (u'gra\\/iditet', u'graviditet'), (u'hittadqdin', u'hittade din'), (u'\xe4rjobbigt', u'\xe4r jobbigt'), (u'Overdrivet', u'\xd6verdrivet'), (u'hOgtidlig', u'h\xf6gtidlig'), (u'Overtyga', u'\xd6vertyga'), (u'SKILSMASSA', u'SKILSM\xc4SSA'), (u'brukarju', u'brukar ju'), (u'lsabel', u'Isabel'), (u'kundejag', u'kunde jag'), (u'\xe4rl\xe4get', u'\xe4r l\xe4get'), (u'blirinte', u'blir inte'), (u'ijakt', u'i jakt'), (u'avjordens', u'av jordens'), (u'90000O', u'900000'), (u'9O0', u'900'), (u'\xe4rp\xe5', u'\xe4r p\xe5'), (u'\xe4rproteserna', u'\xe4r proteserna'), (u'\xe4rytterst', u'\xe4r ytterst'), (u'beborjorden', u'bebor jorden'), (u'filmjag', u'film jag'), (u'fokuserarp\xe5', u'fokuserar p\xe5'), (u'folkjag', u'folk jag'), (u'f\xf6rest\xe4lldejag', u'f\xf6rest\xe4llde jag'), (u'f\xf6rpubliken', u'f\xf6r publiken'), (u'gilladejag', u'gillade jag'), (u'h\xe5llerp\xe5', u'h\xe5ller p\xe5'), (u'harp\xe5', u'har p\xe5'), (u'harplaner', u'har planer'), (u'harprylar', u'har prylar'), (u'kommerpubliken', u'kommer publiken'), (u'kostymerp\xe5', u'kostymer p\xe5'), (u'litarp\xe5', u'litar p\xe5'), (u'lngen', u'Ingen'), (u'lnom', u'Inom'), (u'lnte', u'Inte'), (u'ochjag', u'och jag'), (u'Ochjag', u'Och jag'), (u'ochjorden', u'och jorden'), (u'omjag', u'om jag'), (u'Omjag', u'Om jag'), (u'passarperfekt', u'passar perfekt'), (u's\xe4ttetjag', u's\xe4ttet jag'), (u'silverp\xe5', u'silver p\xe5'), (u'skruvarjag', u'skruvar jag'), (u'somjag', u'som jag'), (u'Somjag', u'Som jag'), (u'talarp\xe5', u'talar p\xe5'), (u't\xe4nktejag', u't\xe4nkte jag'), (u'tapparjag', u'tappar jag'), (u'tittarp\xe5', u'tittar p\xe5'), (u'visstejag', u'visste jag'), (u'medjetpacks', u'med jetpacks'), (u's\xe4tterp\xe5', u's\xe4tter p\xe5'), (u'st\xe5rp\xe5', u'st\xe5r p\xe5'), (u'tillh\xf6rp\xe5', u'tillh\xf6r p\xe5')]), + 'pattern': u"(?um)(\\b|^)(?:l\\\xe2rt|hederv\\\xe5rda|storm\\\xe2stare|Avf\\\xe2rd|t\\\xe2lten|\\\xe2rjag|\\\xe4rjag|j\\\xe2mlikar|Riskako\\\ufb02|Karamellen\\/|Lngen\\\xfcng|\\\xe4rju|S\\\xe1|n\\\xe4rjag|alltjag|g\\\xf6rjag|trorjag|varju|g\\\xf6rju|kanju|blirjag|s\\\xe4gerjag|beh\\\xe5llerjag|pr\\\xf8blem|r\\\xe4ddadeju|hon\\\xf8m|Ln|sv\\\xe5r\\\ufb02\\\xf6rtad|\\\xf8ch|\\\ufb02\\\xf6rtar|k\\\xe4nnerjag|\\\ufb02ickan|sn\\\xf8|gerju|k\\\xf8ntakter|\\\xf8lycka|n\\\xf8lla|sinnenajublar|ijobbet|F\\\xe5rjag|Ar|liggerju|um|lbland|skjuterjag|Vadd\\\xe5|pratarj\\\xe4mt|harju|sitterjag|h\\\xe4\\\ufb02a|s\\\ufb01\\\xe4l|F\\\xd6U|varf\\\xf6rjag|s\\\ufb01\\\xe4rna|b\\\xf6\\\ufb02ar|b\\\xf6\\\ufb02an|st\\\xe4ri|p\\\xe4|harjag|attjag|Verkarjag|K\\\xe4nnerjag|d\\\xe4rjag|tu\\\ufb01|lurarjag|varj\\\xe4ttebra|allvan|deth\\\xe4r|va\\\ufb02e|F\\\xf6Uer|personalm\\\xf6tetl|harjust|\\\xe4rj\\\xe4tteduktig|d\\\xe4rja|lngen\\\xfcng|iluften|\\\xf6sen|tv\\\xe2|Uejerna|h\\\xe5n\\*|\\\xc4rjag|keL|F\\\xf6rjag|varj\\\xe4ttekul|k\\\xe4mpan|mycketjobb|Uus|serjag|vetjag|f\\\xe5rjag|hurjag|f\\\xf6rs\\\xf6kerjag|t\\\xe1nagel|va\\\xfce|Uudet|amhopa|V\\\xe4\\\xfc|g\\\xe4ri|r\\\xf6d\\\xfcus|Uuset|Rid\\\xe0n|vi\\\xfca|g\\\xe5ri|Hurd\\\xe5|inter\\\\\\/juar|menarjag|spyrjag|bri\\\xfcera|N\\\xe4rjag|ner\\\\\\/\\\xf6s|ilivets|n\\\xe4got|p\\\xe0|Lnnan|Uf|lnnan|D\\\xe0ren|F\\\xe0rjag|Vad\\\xe4rdetd\\\xe4L|sm\\\xe0tjuv|t\\\xe0gr\\\xe5nare|dit\\\xe0t|s\\\xe4|v\\\xe0rdsl\\\xf6sa|n\\\xe0n|kommerjag|\\\xe4rj\\\xe4ttebra|\\\xe4rj\\\xe4vligt|\\\xe0kerjag|ellerjapaner|attjaga|eften|h\\\xe4stan|Lntensivare|fr\\\xe0garjag|pen\\/ers|r\\\xe0barkade|styrkon|Dif\\\xe5f|h\\\xe4nden|f\\\xf6\\\ufb01a|Idioten\\/|Varf\\\xf6rjagade|d\\\xe4rf\\\xf6rjag|forjag|Iivsgladje|narjag|sajag|genastja|rockument\\\xe0ren|turne|fickjag|sager|Ijush\\\xe5rig|tradg\\\xe5rdsolycka|kvavdes|d\\\xe0rja|hedersgaster|Nar|smaki\\\xf6sa|lan|Lan|eri|universitetsamne|garna|ar|baltdjur|varjag|\\\xe0r|f\\\xf6rf\\\xf6rst\\\xe0rkare|arjattespeciell|h\\\xe0rg\\\xe5r|Ia|Iimousinen|krickettra|h\\\xe5rdrockv\\\xe0rlden|tr\\\xe0bit|Mellanvastern|arju|turnen|kanns|battre|v\\\xe0rldsturne|dar|sj\\\xe0lvant\\\xe0nder|jattelange|berattade|S\\\xe4|vandpunkten|N\\\xe0rjag|lasa|skitl\\\xe0skigt|sambandsv\\\xe0g|valdigt|Stamga\\\ufb01el|\\\xe0rjag|tajming|utg\\\xe4ng|H\\\xe0r\\\xe5t|h\\\xe0r\\\xe5t|anvander|harjobbat|imageide|kla\\\ufb01en|sjalv|dvarg|detjag|dvargarna|fantasiv\\\xe0rld|\\\ufb01olliga|mandoiinstr\\\xe0ngar|mittjobb|Skajag|landari|gang|Detjag|Narmre|I\\\xe5tjavelni|H\\\xe5llerjag|visionarer|T\\\xfclvad|milit\\\xe0rbas|jattegiada|Fastjag|s\\\xe5jag|rockvarlden|saknarjag|allafall|\\\ufb01anta|Kr\\\xe0ma|stammer|budb\\\xe0rare|Iivsfiiosofi|f\\\xf6rj\\\xe4mnan|gillarjag|Iarvat|klararjag|hatta\\\ufb01\\'\\\xe0r|D\\\xe0|upp\\\ufb01nna|R\\\xe0ttf\\\xe5glar|Sv\\\xe4\\\xfcboda|P\\\xe5b\\\xf6\\\ufb02ar|slutarju|ni\\\ufb01skebu\\\xfcken|h\\\xe4rj\\\xe4keln|H\\\xdfppa|f\\\xf6rst\\\xf6rds|varj\\\xe4ttegoda|Kor\\\\\\/|br\\\xfcl\\\xe9el|Hei|\\\xe4lskarjordgubbsglass|Sn\\\xf6bom|Sn\\\xf6boH|Sn\\\xf6bol|sn\\\xf6boH|L\\\xe4ggerp\\\xe5|lnge\\\ufb02|S\\\xe4gerj\\\xe4ttesmarta|dopplen\\/\\\xe4derradar|s\\\xe4kertj\\\xe4ttefin|\\\xe4rj\\\xe4ttefin|verkarju|blirju|kor\\\\\\/|naturkatastro\\\ufb01|stickerjag|j\\\xe4ttebu\\\ufb01\\\xe9|be\\\ufb01nner|Sp\\\ufb02ng|trec\\\ufb01e|ryckerjag|skullejag|vetju|a\\\ufb02jag|\\\ufb02nns|\\\xe4rl\\\xe5ng|k\\\xe5ra|\\\xe4r\\\ufb01na|\\\xe4ri|h\\\xf6rden|\\\xe4ttj\\\xe4g|g\\\xe4r|f\\\xf6ri|Hurvisste|\\\ufb01ck|\\\ufb01nns|\\\ufb01n|Fa|bori|fiendeplanl|if\\\xf6rnamn|detju|N\\\xfcd|hatarjag|Klararjag|deta\\\ufb01er|v\\\xe4\\/|smakarju|Teache\\\ufb02|imorse|drickerjag|st\\\xe5ri|Harjag|Talarjag|undrarjag|\\\xe5lderjag|va\\\ufb01e|f\\\xf6rfalskningl|Vi\\\ufb01iiiam|V\\\\\\\ufb01lliams|attjobba|intei|n\\\xe4rV\\\\\\\ufb01lliam|V\\\\\\\ufb01lliam|E\\\ufb01ersom|Vl\\\ufb01lliam|I\\\xe4ngejag|\\'\\\ufb01digare|b\\\xf6rjadei|merjust|e\\\ufb01er\\\xe5t|gjordejag|hadeju|g\\\xe5rvi|k\\\xf6perjag|M\\\xe5stejag|k\\\xe4nnerju|\\\ufb02n|treviig|Grattisl|kande|\\'llden|sakjag|klartjag|h\\\xe4\\\ufb01igt|I\\\xe4mnarjag|gickju|skajag|G\\\xf6rjag|m\\\xe5stejag|gra\\\\\\/iditet|hittadqdin|\\\xe4rjobbigt|Overdrivet|hOgtidlig|Overtyga|SKILSMASSA|brukarju|lsabel|kundejag|\\\xe4rl\\\xe4get|blirinte|ijakt|avjordens|90000O|9O0|\\\xe4rp\\\xe5|\\\xe4rproteserna|\\\xe4rytterst|beborjorden|filmjag|fokuserarp\\\xe5|folkjag|f\\\xf6rest\\\xe4lldejag|f\\\xf6rpubliken|gilladejag|h\\\xe5llerp\\\xe5|harp\\\xe5|harplaner|harprylar|kommerpubliken|kostymerp\\\xe5|litarp\\\xe5|lngen|lnom|lnte|ochjag|Ochjag|ochjorden|omjag|Omjag|passarperfekt|s\\\xe4ttetjag|silverp\\\xe5|skruvarjag|somjag|Somjag|talarp\\\xe5|t\\\xe4nktejag|tapparjag|tittarp\\\xe5|visstejag|medjetpacks|s\\\xe4tterp\\\xe5|st\\\xe5rp\\\xe5|tillh\\\xf6rp\\\xe5)(\\b|$)"}}} for lang, grps in data.iteritems(): for grp in grps.iterkeys(): if data[lang][grp]["pattern"]: diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/bos_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/bos_OCRFixReplaceList.xml new file mode 100644 index 000000000..4faf79872 --- /dev/null +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/bos_OCRFixReplaceList.xml @@ -0,0 +1,1840 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/dan_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/dan_OCRFixReplaceList.xml index 4aedbabeb..2135ce878 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/dan_OCRFixReplaceList.xml +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/dan_OCRFixReplaceList.xml @@ -592,6 +592,10 @@ + + + + diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/eng_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/eng_OCRFixReplaceList.xml index 34e29504b..05adb1d9c 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/eng_OCRFixReplaceList.xml +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/eng_OCRFixReplaceList.xml @@ -748,6 +748,7 @@ + @@ -2094,6 +2095,11 @@ + + + + + @@ -2260,6 +2266,13 @@ + + + + + + + @@ -2358,6 +2371,15 @@ + + + + + + + + + @@ -2366,6 +2388,8 @@ + + @@ -2385,6 +2409,8 @@ - + + + - \ No newline at end of file + diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/hrv_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/hrv_OCRFixReplaceList.xml index 942169045..4097a7519 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/hrv_OCRFixReplaceList.xml +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/hrv_OCRFixReplaceList.xml @@ -7,8 +7,13 @@ + + + + + @@ -22,15 +27,13 @@ + - - - - - + + @@ -41,13 +44,21 @@ + + + + + + + + @@ -57,8 +68,28 @@ + + + + + + + + + + + + + + + + + + + + @@ -66,6 +97,7 @@ + @@ -80,6 +112,16 @@ + + + + + + + + + + @@ -101,39 +143,56 @@ + + + + + + + + + + + + + - + + - + + + + @@ -146,6 +205,7 @@ + @@ -155,7 +215,13 @@ + + + + + + @@ -164,12 +230,19 @@ + + + + + + + @@ -184,10 +257,20 @@ + + + + + + + + + + @@ -197,31 +280,47 @@ - - + + + + + + + + + + + + + + + - + + + + @@ -231,17 +330,32 @@ + + + + + + + + + + + + + + + @@ -258,6 +372,8 @@ + + @@ -266,6 +382,7 @@ + @@ -274,6 +391,10 @@ + + + + @@ -283,6 +404,7 @@ + @@ -300,6 +422,7 @@ + @@ -318,10 +441,19 @@ + + + + + + + + + @@ -330,7 +462,10 @@ - + + + + @@ -338,23 +473,33 @@ + - + + + + + + + + + + @@ -369,7 +514,7 @@ - + @@ -393,26 +538,31 @@ + + + + - - + + + @@ -430,8 +580,12 @@ + + + + @@ -446,19 +600,25 @@ - + + + + + + + @@ -469,12 +629,18 @@ + + + + + + @@ -485,8 +651,12 @@ + + + + @@ -497,12 +667,18 @@ + + + + + + @@ -518,22 +694,25 @@ + + + + - @@ -549,9 +728,11 @@ + + @@ -566,16 +747,24 @@ + + + + + + + - + + @@ -586,6 +775,7 @@ + @@ -594,21 +784,33 @@ + + + + + + + + + + + + @@ -622,6 +824,7 @@ + @@ -629,6 +832,10 @@ + + + + @@ -639,12 +846,24 @@ + + + + + + + + + + + + @@ -655,10 +874,16 @@ + + + + + + @@ -672,7 +897,9 @@ + + @@ -684,9 +911,12 @@ + + + @@ -702,6 +932,8 @@ + + @@ -709,6 +941,7 @@ + @@ -716,9 +949,13 @@ + + + + @@ -726,9 +963,13 @@ + + + + @@ -738,9 +979,13 @@ + + + + @@ -752,18 +997,38 @@ + + + + + + + + + + + + + + + + + + + + @@ -776,22 +1041,28 @@ + + - + + + + + @@ -821,26 +1092,36 @@ + + - + + + + + + + + + @@ -849,6 +1130,9 @@ + + + @@ -862,17 +1146,34 @@ + + + + + + + + + + + + + + + + + @@ -881,22 +1182,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - @@ -909,18 +1231,30 @@ + + + + + + + + + + - + + + + - @@ -928,24 +1262,53 @@ + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + @@ -956,66 +1319,153 @@ + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + - + + + + + + + + + + + + - + + + + + + + + + + + + + + - + + + + + + + + + + + + + + @@ -1036,6 +1486,7 @@ + @@ -1044,6 +1495,8 @@ + + @@ -1067,13 +1520,17 @@ + + + + @@ -1092,6 +1549,7 @@ + @@ -1105,26 +1563,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1139,14 +1628,27 @@ + + + + + + + + + + + + + @@ -1156,7 +1658,7 @@ - + @@ -1182,10 +1684,13 @@ + + + @@ -1204,6 +1709,7 @@ + @@ -1218,7 +1724,7 @@ - + @@ -1226,23 +1732,17 @@ - - - - + + + - - - - - @@ -1253,8 +1753,6 @@ - - @@ -1262,6 +1760,7 @@ + @@ -1269,7 +1768,7 @@ - + @@ -1295,7 +1794,7 @@ - + @@ -1303,26 +1802,26 @@ + - - - + - - + + + @@ -1330,6 +1829,7 @@ + @@ -1337,8 +1837,6 @@ - - @@ -1355,22 +1853,21 @@ - - + + + - - - + + + - - @@ -1382,9 +1879,8 @@ - + - @@ -1394,20 +1890,16 @@ - - + - - - @@ -1464,7 +1956,7 @@ - + @@ -1474,13 +1966,14 @@ - + + - + @@ -1496,14 +1989,15 @@ + - + - + @@ -1517,25 +2011,25 @@ - - + + - - + + @@ -1555,8 +2049,8 @@ - - + + @@ -1575,7 +2069,7 @@ - + @@ -1584,8 +2078,9 @@ - + + @@ -1599,10 +2094,11 @@ + - + @@ -1638,6 +2134,7 @@ + @@ -1655,22 +2152,23 @@ - + - - + + + - - + - + + @@ -1684,7 +2182,7 @@ - + @@ -1703,9 +2201,10 @@ - + - + + @@ -1721,7 +2220,6 @@ - @@ -1729,7 +2227,7 @@ - + @@ -1742,7 +2240,6 @@ - @@ -1799,6 +2296,7 @@ + @@ -1821,12 +2319,9 @@ - - - + - @@ -1841,8 +2336,6 @@ - - @@ -1879,7 +2372,7 @@ - + @@ -1890,14 +2383,13 @@ - - + - + @@ -1913,10 +2405,8 @@ - - - + @@ -1938,30 +2428,27 @@ - + - - + + - - - - + + - - + @@ -1993,8 +2480,7 @@ - - + @@ -2007,9 +2493,7 @@ - - @@ -2017,19 +2501,40 @@ - + + + + + + + + + + + + + + + + + + + + + + @@ -2038,20 +2543,27 @@ + + + + + + + @@ -2062,9 +2574,8 @@ - - + @@ -2074,43 +2585,50 @@ + - - + + + + + - + - - + + + + + @@ -2122,10 +2640,10 @@ - + @@ -2141,8 +2659,10 @@ + + @@ -2150,20 +2670,23 @@ + + - + + + - @@ -2172,24 +2695,30 @@ - + + - + + + + + + - + @@ -2199,12 +2728,15 @@ - - + + + + + @@ -2224,6 +2756,7 @@ + @@ -2238,22 +2771,29 @@ + + + - + + + + + @@ -2262,23 +2802,35 @@ - + + + + + + + + - + + + + + + @@ -2291,7 +2843,10 @@ + + + @@ -2315,33 +2870,39 @@ + + + + + - + + - + @@ -2349,6 +2910,7 @@ + @@ -2364,16 +2926,21 @@ + + - + + + + - + @@ -2381,6 +2948,8 @@ + + diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/nob_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/nob_OCRFixReplaceList.xml new file mode 100644 index 000000000..64007ef91 --- /dev/null +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/nob_OCRFixReplaceList.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/spa_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/spa_OCRFixReplaceList.xml index 1c463a05e..938e90a89 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/spa_OCRFixReplaceList.xml +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/spa_OCRFixReplaceList.xml @@ -22,6 +22,7 @@ + @@ -80,6 +81,8 @@ + + @@ -942,5 +945,8 @@ + + + \ No newline at end of file diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/srp_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/srp_OCRFixReplaceList.xml index c54bacd97..7b682c6fd 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/srp_OCRFixReplaceList.xml +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/srp_OCRFixReplaceList.xml @@ -8,21 +8,46 @@ - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -65,11 +90,7 @@ - - - - @@ -81,6 +102,21 @@ + + + + + + + + + + + + + + + @@ -90,46 +126,44 @@ + - - - + + - + - + - - - - - - - + + + + + - - + - - - - - - + + + + + + + @@ -231,4 +265,4 @@ - \ No newline at end of file + diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/swe_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/swe_OCRFixReplaceList.xml index edd3ae30e..9eadfca8a 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/swe_OCRFixReplaceList.xml +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/swe_OCRFixReplaceList.xml @@ -1,4 +1,5 @@ - + + @@ -354,10 +355,50 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -392,6 +433,12 @@ + + + + + + From 5a316915a5d43e90b05679835a11702fa15d572e Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 17 Jun 2018 04:19:36 +0200 Subject: [PATCH 133/710] core: add config versioning; migrate only forced/foreign setting to new "Download Subtitles" setting --- Contents/Code/support/config.py | 32 +++++++++++++++++++- Contents/DefaultPrefs.json | 14 ++++++--- Contents/Libraries/Shared/subzero/prefs.py | 34 ++++++++++++++++++++++ 3 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 Contents/Libraries/Shared/subzero/prefs.py diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 609d5d354..875e290e7 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -24,6 +24,7 @@ from subzero.lib.dict import Dicked from subzero.util import get_root_path from subzero.constants import PLUGIN_NAME, PLUGIN_IDENTIFIER, MOVIE, SHOW, MEDIA_TYPE_TO_STRING +from subzero.prefs import get_user_prefs, update_user_prefs from dogpile.cache.region import register_backend as register_cache_backend from lib import Plex from helpers import check_write_permissions, cast_bool, cast_int, mswindows @@ -76,6 +77,7 @@ def int_or_default(s, default): class Config(object): + config_version = 1 libraries_root = None plugin_info = "" version = None @@ -165,6 +167,7 @@ def initialize(self): self.plex_token = os.environ.get("PLEXTOKEN", self.universal_plex_token) subzero.constants.DEFAULT_TIMEOUT = lib.DEFAULT_TIMEOUT = self.pms_request_timeout = \ min(cast_int(Prefs['pms_request_timeout'], 15), 45) + self.migrate_prefs() self.low_impact_mode = cast_bool(Prefs['low_impact_mode']) self.new_style_cache = cast_bool(Prefs['new_style_cache']) self.pack_cache_dir = self.get_pack_cache_dir() @@ -181,7 +184,7 @@ def initialize(self): self.subtitle_destination_folder = self.get_subtitle_destination_folder() self.subtitle_formats = self.get_subtitle_formats() - self.forced_only = cast_bool(Prefs["subtitles.only_foreign"]) + self.forced_only = Prefs["subtitles.when"] == "Only foreign/forced" self.max_recent_items_per_library = int_or_default(Prefs["scheduler.max_recent_items_per_library"], 2000) self.sections = list(Plex["library"].sections()) self.missing_permissions = [] @@ -210,6 +213,33 @@ def initialize(self): self.ietf_as_alpha3 = cast_bool(Prefs["subtitles.language.ietf_normalize"]) self.initialized = True + def migrate_prefs(self): + config_version = 0 if "config_version" not in Dict else Dict["config_version"] + if config_version < self.config_version: + user_prefs = get_user_prefs(Prefs, Log) + if user_prefs: + for i in range(config_version, self.config_version): + version = i+1 + func = "migrate_prefs_to_%i" % version + if hasattr(self, func): + Log.Info("Migrating user prefs to version %i" % version) + try: + getattr(self, func)(user_prefs) + Dict["config_version"] = version + Dict.Save() + Log.Info("User prefs migrated to version %i" % version) + except: + Log.Exception("User prefs migration from %i to %i failed" % (self.config_version, version)) + break + + def migrate_prefs_to_1(self, user_prefs): + update_prefs = {} + if "subtitles.only_foreign" in user_prefs and user_prefs["subtitles.only_foreign"] == "true": + update_prefs["subtitles.when"] = "1" + + if update_prefs: + update_user_prefs(update_prefs, Prefs, Log) + def init_libraries(self): try_executables = [] custom_unrar = os.environ.get("SZ_UNRAR_TOOL") diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 265656523..f5b5b9625 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -179,10 +179,16 @@ "default": "None" }, { - "id": "subtitles.only_foreign", - "label": "Only download foreign/forced subtitles", - "type": "bool", - "default": "false" + "id": "subtitles.when", + "label": "Download subtitles", + "type": "enum", + "values": [ + "Always", + "Only foreign/forced", + "When main audio stream is not Language 1", + "When main audio stream is not any configured language" + ], + "default": "Always" }, { "id": "subtitles.language.ietf_display", diff --git a/Contents/Libraries/Shared/subzero/prefs.py b/Contents/Libraries/Shared/subzero/prefs.py new file mode 100644 index 000000000..9212f4b69 --- /dev/null +++ b/Contents/Libraries/Shared/subzero/prefs.py @@ -0,0 +1,34 @@ +# coding=utf-8 +import traceback +from constants import PLUGIN_IDENTIFIER + + +def get_user_prefs(Prefs, Logger): + """ + loads all user prefs regardless of whether they exist in DefaultPrefs or not + :param Prefs: + :param Logger: + :return: + """ + + prefs_set = Prefs._sandbox.preferences._sets[PLUGIN_IDENTIFIER] + user_prefs = {} + try: + xml_path = prefs_set._user_file_path + if not Prefs._core.storage.file_exists(xml_path): + return {} + prefs_str = Prefs._core.storage.load(xml_path, mtime_key=prefs_set) + prefs_xml = Prefs._core.data.xml.from_string(prefs_str) + for el in prefs_xml: + user_prefs[str(el.tag)] = str(el.text) + except: + Logger.Error("Loading user prefs failed: %s", traceback.format_exc()) + else: + return user_prefs + return {} + + +def update_user_prefs(update_prefs, Prefs, Logger): + prefs_set = Prefs._sandbox.preferences._sets[PLUGIN_IDENTIFIER] + prefs_set.update_user_values(**update_prefs) + Logger.Info("User prefs updated") From d510fd3b71f58f78e237fc70bcd88a0c49467cab Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 17 Jun 2018 04:46:59 +0200 Subject: [PATCH 134/710] core: correctly force non-foreign-only-capable providers off; remove subscene from foreign-only capable providers --- Contents/Code/support/config.py | 8 +++++++- .../Shared/subliminal_patch/providers/subscene.py | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 875e290e7..b2ae8ca4d 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -687,6 +687,7 @@ def get_providers(self, media_type="series"): providers["subscene"] = False # ditch non-forced-subtitles-reporting providers + providers_forced_off = {} if self.forced_only: providers["addic7ed"] = False providers["tvsubtitles"] = False @@ -698,6 +699,8 @@ def get_providers(self, media_type="series"): providers["titlovi"] = False providers["argenteam"] = False providers["assrt"] = False + providers["subscene"] = False + providers_forced_off = dict(providers) if not self.unrar and providers["legendastv"]: providers["legendastv"] = False @@ -706,7 +709,7 @@ def get_providers(self, media_type="series"): # advanced settings if media_type and self.advanced.providers: for provider, data in self.advanced.providers.iteritems(): - if provider not in providers or not providers_by_prefs[provider]: + if provider not in providers or not providers_by_prefs[provider] or provider in providers_forced_off: continue if data["enabled_for"] is not None: @@ -754,6 +757,9 @@ def get_provider_settings(self): 'podnapisi': { 'only_foreign': self.forced_only, }, + 'subscene': { + 'only_foreign': self.forced_only, + }, 'legendastv': {'username': Prefs['provider.legendastv.username'], 'password': Prefs['provider.legendastv.password'], }, diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 4dd363959..d49177ef0 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -127,6 +127,9 @@ def terminate(self): def _create_filters(self, languages): self.filters = dict(HearingImpaired="2") + if self.only_foreign: + self.filters["ForeignOnly"] = "True" + logger.info("Only searching for foreign/forced subtitles") self.filters["LanguageFilter"] = ",".join((str(language_ids[l.alpha3]) for l in languages if l.alpha3 in language_ids)) From e573ddbb2513e9370f497ee2f0079a59cba86f89 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 17 Jun 2018 04:47:45 +0200 Subject: [PATCH 135/710] core: scanning: collect information about audio streams --- Contents/Code/support/download.py | 2 + Contents/Code/support/scanning.py | 68 ++++++++++++------- .../Shared/subliminal_patch/video.py | 4 +- 3 files changed, 48 insertions(+), 26 deletions(-) diff --git a/Contents/Code/support/download.py b/Contents/Code/support/download.py index 740054102..49eab170a 100644 --- a/Contents/Code/support/download.py +++ b/Contents/Code/support/download.py @@ -17,6 +17,8 @@ def get_missing_languages(video, part): languages = set([Language.fromietf(str(l)) for l in config.lang_list]) + + # should we treat IETF as alpha3? (ditch the country part) alpha3_map = {} if config.ietf_as_alpha3: diff --git a/Contents/Code/support/scanning.py b/Contents/Code/support/scanning.py index a99d8850c..8e5e86fea 100644 --- a/Contents/Code/support/scanning.py +++ b/Contents/Code/support/scanning.py @@ -44,32 +44,45 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr # embedded subtitles # fixme: skip the whole scanning process if known_embedded == wanted languages? + stream_languages = [] if plexpy_part: - if embedded_subtitles: - for stream in plexpy_part.streams: - # subtitle stream - if stream.stream_type == 3: - is_forced = helpers.is_stream_forced(stream) - - if (config.forced_only and is_forced) or \ - (not config.forced_only and not is_forced): - - # embedded subtitle - # fixme: tap into external subtitles here instead of scanning for ourselves later? - if stream.codec and getattr(stream, "index", None): - if config.exotic_ext or stream.codec.lower() in config.text_based_formats: - lang = None - try: - lang = language_from_stream(stream.language_code) - except LanguageError: - Log.Debug("Couldn't detect embedded subtitle stream language: %s", stream.language_code) - - # treat unknown language as lang1? - if not lang and config.treat_und_as_first: - lang = list(config.lang_list)[0] - - if lang: - known_embedded.append(lang.alpha3) + for stream in plexpy_part.streams: + if stream.stream_type == 2: + lang = None + try: + lang = language_from_stream(stream.language_code) + except LanguageError: + Log.Debug("Couldn't detect embedded subtitle stream language: %s", stream.language_code) + + # treat unknown language as lang1? + if not lang and config.treat_und_as_first: + lang = list(config.lang_list)[0] + + stream_languages.append(lang.alpha3) + + # subtitle stream + elif stream.stream_type == 3 and embedded_subtitles: + is_forced = helpers.is_stream_forced(stream) + + if (config.forced_only and is_forced) or \ + (not config.forced_only and not is_forced): + + # embedded subtitle + # fixme: tap into external subtitles here instead of scanning for ourselves later? + if stream.codec and getattr(stream, "index", None): + if config.exotic_ext or stream.codec.lower() in config.text_based_formats: + lang = None + try: + lang = language_from_stream(stream.language_code) + except LanguageError: + Log.Debug("Couldn't detect embedded subtitle stream language: %s", stream.language_code) + + # treat unknown language as lang1? + if not lang and config.treat_und_as_first: + lang = list(config.lang_list)[0] + + if lang: + known_embedded.append(lang.alpha3) else: Log.Warn("Part %s missing of %s, not able to scan internal streams", plex_part.id, rating_key) @@ -84,6 +97,11 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr video = parse_video(plex_part.file, hints, skip_hashing=config.low_impact_mode or skip_hashing, providers=providers) + # set stream languages + if stream_languages: + video.stream_languages = set(stream_languages) + Log.Info("Found audio streams: %s" % stream_languages) + if not ignore_all: set_existing_languages(video, pms_video_info, external_subtitles=external_subtitles, embedded_subtitles=embedded_subtitles, known_embedded=known_embedded, diff --git a/Contents/Libraries/Shared/subliminal_patch/video.py b/Contents/Libraries/Shared/subliminal_patch/video.py index a230b6e55..bcfbc456f 100644 --- a/Contents/Libraries/Shared/subliminal_patch/video.py +++ b/Contents/Libraries/Shared/subliminal_patch/video.py @@ -11,12 +11,14 @@ class Video(Video_): plexapi_metadata = None hints = None season_fully_aired = None + stream_languages = None def __init__(self, name, format=None, release_group=None, resolution=None, video_codec=None, audio_codec=None, - imdb_id=None, hashes=None, size=None, subtitle_languages=None): + imdb_id=None, hashes=None, size=None, subtitle_languages=None, stream_languages=None): super(Video, self).__init__(name, format=format, release_group=release_group, resolution=resolution, video_codec=video_codec, audio_codec=audio_codec, imdb_id=imdb_id, hashes=hashes, size=size, subtitle_languages=subtitle_languages) self.original_name = os.path.basename(name) self.plexapi_metadata = {} self.hints = {} + self.stream_languages = stream_languages or set() From e6e31449f6010ce6780f19efc0b2aede85dd51e8 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 17 Jun 2018 04:53:18 +0200 Subject: [PATCH 136/710] move prefs migration call; log exception --- Contents/Code/support/config.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index b2ae8ca4d..fffe69cd8 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -165,9 +165,13 @@ def initialize(self): self.data_items_path = os.path.join(self.data_path, "DataItems") self.universal_plex_token = self.get_universal_plex_token() self.plex_token = os.environ.get("PLEXTOKEN", self.universal_plex_token) + try: + self.migrate_prefs() + except: + Log.Exception("Catastrophic failure when running prefs migration") + subzero.constants.DEFAULT_TIMEOUT = lib.DEFAULT_TIMEOUT = self.pms_request_timeout = \ min(cast_int(Prefs['pms_request_timeout'], 15), 45) - self.migrate_prefs() self.low_impact_mode = cast_bool(Prefs['low_impact_mode']) self.new_style_cache = cast_bool(Prefs['new_style_cache']) self.pack_cache_dir = self.get_pack_cache_dir() From 4e3f1a926f3303b3dfd21bb419df42c7eccc4740 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 17 Jun 2018 05:26:39 +0200 Subject: [PATCH 137/710] core: add support for downloading subtitles only when the audio streams don't match (any?) configured languages; fixes #519 --- Contents/Code/__init__.py | 8 +++++++- Contents/Code/support/download.py | 7 +++++-- Contents/Code/support/helpers.py | 20 +++++++++++++++++++ Contents/Code/support/scanning.py | 10 +++++----- Contents/DefaultPrefs.json | 6 ++++-- .../Shared/subliminal_patch/video.py | 6 +++--- 6 files changed, 44 insertions(+), 13 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index c1da3cdc7..9b9935ca7 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -29,7 +29,8 @@ from support.items import is_ignored from support.config import config from support.lib import get_intent -from support.helpers import track_usage, get_title_for_video_metadata, get_identifier, cast_bool +from support.helpers import track_usage, get_title_for_video_metadata, get_identifier, cast_bool, \ + audio_streams_match_languages from support.history import get_history from support.data import dispatch_migrate from support.activities import activity @@ -127,6 +128,11 @@ def agent_extract_embedded(video_part_map): plexapi_item = scanned_video.plexapi_metadata["item"] stored_subs = subtitle_storage.load_or_new(plexapi_item) + if audio_streams_match_languages(scanned_video, list(config.lang_list)): + Log.Debug("Skipping embedded subtitle extraction for %s, audio streams are in correct language(s)", + plexapi_item.rating_key) + continue + for plexapi_part in get_all_parts(plexapi_item): item_count = item_count + 1 for requested_language in config.lang_list: diff --git a/Contents/Code/support/download.py b/Contents/Code/support/download.py index 49eab170a..bb8564029 100644 --- a/Contents/Code/support/download.py +++ b/Contents/Code/support/download.py @@ -6,7 +6,7 @@ import subliminal_patch as subliminal from support.config import config -from support.helpers import cast_bool +from support.helpers import cast_bool, audio_streams_match_languages from subtitlehelpers import get_subtitles_from_metadata from subliminal_patch import compute_score from support.plex_media import get_blacklist_from_part_map @@ -17,7 +17,10 @@ def get_missing_languages(video, part): languages = set([Language.fromietf(str(l)) for l in config.lang_list]) - + if audio_streams_match_languages(video, list(config.lang_list)): + Log.Debug("Skipping subtitle search for %s, audio streams are in correct language(s)", + video) + return set() # should we treat IETF as alpha3? (ditch the country part) alpha3_map = {} diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 816da08b6..d5631d791 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -378,6 +378,26 @@ def get_language_from_stream(lang_code): return Language.fromietf(lang) +def audio_streams_match_languages(video, languages): + if Prefs["subtitles.when"] == "When main audio stream is not Language (1)": + if video.audio_languages and video.audio_languages[0] == languages[0]: + return True + + elif Prefs["subtitles.when"] == "When any audio stream is not Language (1)": + if video.audio_languages and languages[0] in video.audio_languages: + return True + + elif Prefs["subtitles.when"] == "When main audio stream is not any configured language": + if video.audio_languages and video.audio_languages[0] in languages: + return True + + elif Prefs["subtitles.when"] == "When any audio stream is not any configured language": + if video.audio_languages and set(video.audio_languages).intersection(set(languages)): + return True + + return False + + def get_language(lang_short): return Language.fromietf(lang_short) diff --git a/Contents/Code/support/scanning.py b/Contents/Code/support/scanning.py index 8e5e86fea..9a16bcce3 100644 --- a/Contents/Code/support/scanning.py +++ b/Contents/Code/support/scanning.py @@ -44,7 +44,7 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr # embedded subtitles # fixme: skip the whole scanning process if known_embedded == wanted languages? - stream_languages = [] + audio_languages = [] if plexpy_part: for stream in plexpy_part.streams: if stream.stream_type == 2: @@ -58,7 +58,7 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr if not lang and config.treat_und_as_first: lang = list(config.lang_list)[0] - stream_languages.append(lang.alpha3) + audio_languages.append(lang) # subtitle stream elif stream.stream_type == 3 and embedded_subtitles: @@ -98,9 +98,9 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr providers=providers) # set stream languages - if stream_languages: - video.stream_languages = set(stream_languages) - Log.Info("Found audio streams: %s" % stream_languages) + if audio_languages: + video.audio_languages = audio_languages + Log.Info("Found audio streams: %s" % ", ".join([str(l) for l in audio_languages])) if not ignore_all: set_existing_languages(video, pms_video_info, external_subtitles=external_subtitles, diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index f5b5b9625..687d173fe 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -185,8 +185,10 @@ "values": [ "Always", "Only foreign/forced", - "When main audio stream is not Language 1", - "When main audio stream is not any configured language" + "When main audio stream is not Language (1)", + "When main audio stream is not any configured language", + "When any audio stream is not Language (1)", + "When any audio stream is not any configured language" ], "default": "Always" }, diff --git a/Contents/Libraries/Shared/subliminal_patch/video.py b/Contents/Libraries/Shared/subliminal_patch/video.py index bcfbc456f..df615c849 100644 --- a/Contents/Libraries/Shared/subliminal_patch/video.py +++ b/Contents/Libraries/Shared/subliminal_patch/video.py @@ -11,14 +11,14 @@ class Video(Video_): plexapi_metadata = None hints = None season_fully_aired = None - stream_languages = None + audio_languages = None def __init__(self, name, format=None, release_group=None, resolution=None, video_codec=None, audio_codec=None, - imdb_id=None, hashes=None, size=None, subtitle_languages=None, stream_languages=None): + imdb_id=None, hashes=None, size=None, subtitle_languages=None, audio_languages=None): super(Video, self).__init__(name, format=format, release_group=release_group, resolution=resolution, video_codec=video_codec, audio_codec=audio_codec, imdb_id=imdb_id, hashes=hashes, size=size, subtitle_languages=subtitle_languages) self.original_name = os.path.basename(name) self.plexapi_metadata = {} self.hints = {} - self.stream_languages = stream_languages or set() + self.audio_languages = audio_languages or set() From 9f81317ecd4b8d659ecf8e1812f816c7a5371db2 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 17 Jun 2018 05:30:21 +0200 Subject: [PATCH 138/710] simplify conditions --- Contents/Code/support/helpers.py | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index d5631d791..34a049eca 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -379,21 +379,22 @@ def get_language_from_stream(lang_code): def audio_streams_match_languages(video, languages): - if Prefs["subtitles.when"] == "When main audio stream is not Language (1)": - if video.audio_languages and video.audio_languages[0] == languages[0]: - return True - - elif Prefs["subtitles.when"] == "When any audio stream is not Language (1)": - if video.audio_languages and languages[0] in video.audio_languages: - return True - - elif Prefs["subtitles.when"] == "When main audio stream is not any configured language": - if video.audio_languages and video.audio_languages[0] in languages: - return True - - elif Prefs["subtitles.when"] == "When any audio stream is not any configured language": - if video.audio_languages and set(video.audio_languages).intersection(set(languages)): - return True + if video.audio_languages: + if Prefs["subtitles.when"] == "When main audio stream is not Language (1)": + if video.audio_languages[0] == languages[0]: + return True + + elif Prefs["subtitles.when"] == "When any audio stream is not Language (1)": + if languages[0] in video.audio_languages: + return True + + elif Prefs["subtitles.when"] == "When main audio stream is not any configured language": + if video.audio_languages[0] in languages: + return True + + elif Prefs["subtitles.when"] == "When any audio stream is not any configured language": + if set(video.audio_languages).intersection(set(languages)): + return True return False From a15d2e65871428b08f7000a2202fe6b6387f2392 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 17 Jun 2018 05:30:55 +0200 Subject: [PATCH 139/710] bump dev --- Contents/Info.plist | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 9c7d644ed..e1c67020a 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -9,11 +9,11 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleShortVersionString - 2.5.4 + 2.5.8 CFBundleSignature ???? CFBundleVersion - 2.5.7.2663 + 2.5.8.2671 PlexFrameworkVersion 2 PlexPluginClass @@ -23,7 +23,7 @@ PlexPluginConsoleLogging 0 PlexPluginDevMode - 0 + 1 PlexPluginCodePolicy Elevated @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.7.2663 +Version 2.5.8.2671 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 8d9c9bbfa6a447c2d4eaa2814cef7ee93ee6569b Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 17 Jun 2018 05:34:47 +0200 Subject: [PATCH 140/710] #519 fix pref strings --- Contents/Code/support/helpers.py | 4 ++-- Contents/DefaultPrefs.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 34a049eca..2da1cd2da 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -380,11 +380,11 @@ def get_language_from_stream(lang_code): def audio_streams_match_languages(video, languages): if video.audio_languages: - if Prefs["subtitles.when"] == "When main audio stream is not Language (1)": + if Prefs["subtitles.when"] == "When main audio stream is not Subtitle Language (1)": if video.audio_languages[0] == languages[0]: return True - elif Prefs["subtitles.when"] == "When any audio stream is not Language (1)": + elif Prefs["subtitles.when"] == "When any audio stream is not Subtitle Language (1)": if languages[0] in video.audio_languages: return True diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 687d173fe..0360e8c6b 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -185,9 +185,9 @@ "values": [ "Always", "Only foreign/forced", - "When main audio stream is not Language (1)", + "When main audio stream is not Subtitle Language (1)", "When main audio stream is not any configured language", - "When any audio stream is not Language (1)", + "When any audio stream is not Subtitle Language (1)", "When any audio stream is not any configured language" ], "default": "Always" From d83286a5ff1fcc277b05e5441079e147127f5b7d Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 17 Jun 2018 05:35:28 +0200 Subject: [PATCH 141/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index e1c67020a..785a25862 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.5.8.2671 + 2.5.8.2674 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.8.2671 DEV +Version 2.5.8.2674 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From d5c08a5f511be57433a158b5ed9c2039bd58cb08 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 17 Jun 2018 05:46:45 +0200 Subject: [PATCH 142/710] core: prefs migration: pass version infos --- Contents/Code/support/config.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index fffe69cd8..095e9d6c3 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -228,7 +228,8 @@ def migrate_prefs(self): if hasattr(self, func): Log.Info("Migrating user prefs to version %i" % version) try: - getattr(self, func)(user_prefs) + getattr(self, func)(user_prefs, from_version=config_version, to_version=version, + current_version=self.config_version) Dict["config_version"] = version Dict.Save() Log.Info("User prefs migrated to version %i" % version) @@ -236,7 +237,7 @@ def migrate_prefs(self): Log.Exception("User prefs migration from %i to %i failed" % (self.config_version, version)) break - def migrate_prefs_to_1(self, user_prefs): + def migrate_prefs_to_1(self, user_prefs, from_version=None, to_version=None, current_version=None): update_prefs = {} if "subtitles.only_foreign" in user_prefs and user_prefs["subtitles.only_foreign"] == "true": update_prefs["subtitles.when"] = "1" From 3702c308b3d79fd07f4506c1f470f4b02c96fe7e Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 17 Jun 2018 06:00:16 +0200 Subject: [PATCH 143/710] core: prefs migration: safeguard --- Contents/Libraries/Shared/subzero/prefs.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/prefs.py b/Contents/Libraries/Shared/subzero/prefs.py index 9212f4b69..252164fb9 100644 --- a/Contents/Libraries/Shared/subzero/prefs.py +++ b/Contents/Libraries/Shared/subzero/prefs.py @@ -11,7 +11,12 @@ def get_user_prefs(Prefs, Logger): :return: """ - prefs_set = Prefs._sandbox.preferences._sets[PLUGIN_IDENTIFIER] + try: + prefs_set = Prefs._sandbox.preferences._sets[PLUGIN_IDENTIFIER] + except: + Logger.Error("Loading user prefs failed: %s", traceback.format_exc()) + return {} + user_prefs = {} try: xml_path = prefs_set._user_file_path From 1a6378f24ae91f761098f1929174dd1406c9a80e Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 17 Jun 2018 06:10:32 +0200 Subject: [PATCH 144/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 785a25862..8ed486238 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.5.8.2674 + 2.5.8.2677 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.8.2674 DEV +Version 2.5.8.2677 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 2211f99f3624b6824b01b400c871e4c480c5cce4 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 17 Jun 2018 15:31:35 +0200 Subject: [PATCH 145/710] core: prefs migration: save user prefs after gathering all migration results to retain non-existant settings as long as possible --- Contents/Code/support/config.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 095e9d6c3..34689bdf0 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -222,14 +222,17 @@ def migrate_prefs(self): if config_version < self.config_version: user_prefs = get_user_prefs(Prefs, Log) if user_prefs: + update_prefs = {} for i in range(config_version, self.config_version): version = i+1 func = "migrate_prefs_to_%i" % version if hasattr(self, func): Log.Info("Migrating user prefs to version %i" % version) try: - getattr(self, func)(user_prefs, from_version=config_version, to_version=version, - current_version=self.config_version) + mig_result = getattr(self, func)(user_prefs, from_version=config_version, + to_version=version, + current_version=self.config_version) + update_prefs.update(mig_result) Dict["config_version"] = version Dict.Save() Log.Info("User prefs migrated to version %i" % version) @@ -237,13 +240,15 @@ def migrate_prefs(self): Log.Exception("User prefs migration from %i to %i failed" % (self.config_version, version)) break + if update_prefs: + update_user_prefs(update_prefs, Prefs, Log) + def migrate_prefs_to_1(self, user_prefs, from_version=None, to_version=None, current_version=None): update_prefs = {} if "subtitles.only_foreign" in user_prefs and user_prefs["subtitles.only_foreign"] == "true": update_prefs["subtitles.when"] = "1" - if update_prefs: - update_user_prefs(update_prefs, Prefs, Log) + return update_prefs def init_libraries(self): try_executables = [] From f35b53a0717d236824a5785c2afd53d8847b48e6 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 17 Jun 2018 15:38:39 +0200 Subject: [PATCH 146/710] core: prefs migration: pass already migrated prefs to migration functions --- Contents/Code/support/config.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 34689bdf0..7cc0586cb 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -231,7 +231,8 @@ def migrate_prefs(self): try: mig_result = getattr(self, func)(user_prefs, from_version=config_version, to_version=version, - current_version=self.config_version) + current_version=self.config_version, + migrated_prefs=update_prefs) update_prefs.update(mig_result) Dict["config_version"] = version Dict.Save() @@ -243,7 +244,7 @@ def migrate_prefs(self): if update_prefs: update_user_prefs(update_prefs, Prefs, Log) - def migrate_prefs_to_1(self, user_prefs, from_version=None, to_version=None, current_version=None): + def migrate_prefs_to_1(self, user_prefs, **kwargs): update_prefs = {} if "subtitles.only_foreign" in user_prefs and user_prefs["subtitles.only_foreign"] == "true": update_prefs["subtitles.when"] = "1" From 00947efe53228cade1bd06e3451ddb1756231959 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 13 Jul 2018 02:09:04 +0200 Subject: [PATCH 147/710] core: fallback for OSError on scandir, should fix #532 --- Contents/Code/interface/advanced.py | 68 ++++++++++--------- Contents/Code/support/tasks.py | 24 +++++-- Contents/Libraries/Shared/fcache/cache.py | 7 +- Contents/Libraries/Shared/scandir.py | 2 +- .../Libraries/Shared/subliminal_patch/core.py | 15 ++-- .../Shared/subzero/subtitle_storage.py | 27 +++++--- 6 files changed, 86 insertions(+), 57 deletions(-) diff --git a/Contents/Code/interface/advanced.py b/Contents/Code/interface/advanced.py index 640df426e..4cf5a9a71 100644 --- a/Contents/Code/interface/advanced.py +++ b/Contents/Code/interface/advanced.py @@ -240,44 +240,48 @@ def TriggerCacheMaintenance(randomize=None): ) -def apply_default_mods(reapply_current=False): +def apply_default_mods(reapply_current=False, scandir_generic=False): storage = get_subtitle_storage() subs_applied = 0 - for fn in storage.get_all_files(): - data = storage.load(None, filename=fn) - if data: - video_id = data.video_id - item_type = get_item_kind_from_rating_key(video_id) - if not item_type: - continue - - for part_id, part in data.parts.iteritems(): - for lang, subs in part.iteritems(): - current_sub = subs.get("current") - if not current_sub: - continue - sub = subs[current_sub] - - if not sub.content: - continue - - current_mods = sub.mods or [] - if not reapply_current: - add_mods = list(set(config.default_mods).difference(set(current_mods))) - if not add_mods: + + try: + for fn in storage.get_all_files(scandir_generic=scandir_generic): + data = storage.load(None, filename=fn) + if data: + video_id = data.video_id + item_type = get_item_kind_from_rating_key(video_id) + if not item_type: + continue + + for part_id, part in data.parts.iteritems(): + for lang, subs in part.iteritems(): + current_sub = subs.get("current") + if not current_sub: continue - else: - if not current_mods: + sub = subs[current_sub] + + if not sub.content: continue - add_mods = [] - try: - set_mods_for_part(video_id, part_id, Language.fromietf(lang), item_type, add_mods, mode="add") - except: - Log.Error("Couldn't set mods for %s:%s: %s", video_id, part_id, traceback.format_exc()) - continue + current_mods = sub.mods or [] + if not reapply_current: + add_mods = list(set(config.default_mods).difference(set(current_mods))) + if not add_mods: + continue + else: + if not current_mods: + continue + add_mods = [] + + try: + set_mods_for_part(video_id, part_id, Language.fromietf(lang), item_type, add_mods, mode="add") + except: + Log.Error("Couldn't set mods for %s:%s: %s", video_id, part_id, traceback.format_exc()) + continue - subs_applied += 1 + subs_applied += 1 + except OSError: + return apply_default_mods(reapply_current=reapply_current, scandir_generic=True) storage.destroy() Log.Debug("Applied mods to %i items" % subs_applied) diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index 3050b5c65..1f39b4cd7 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -823,7 +823,12 @@ def run(self): self.running = True Log.Info(u"%s: Running subtitle storage maintenance", self.name) storage = get_subtitle_storage() - deleted_items = storage.delete_missing(wanted_languages=set(str(l) for l in config.lang_list)) + try: + deleted_items = storage.delete_missing(wanted_languages=set(str(l) for l in config.lang_list)) + except OSError: + deleted_items = storage.delete_missing(wanted_languages=set(str(l) for l in config.lang_list), + scandir_generic=True) + if deleted_items: Log.Info(u"%s: Subtitle information for %d non-existant videos have been cleaned up", self.name, len(deleted_items)) @@ -861,11 +866,18 @@ def run(self): self.running = True Log.Info(u"%s: Running subtitle storage migration", self.name) storage = get_subtitle_storage() - for fn in storage.get_all_files(): - if fn.endswith(".json.gz"): - continue - Log.Debug(u"%s: Migrating %s", self.name, fn) - storage.load(None, fn) + + def migrate(scandir_generic=False): + for fn in storage.get_all_files(scandir_generic=scandir_generic): + if fn.endswith(".json.gz"): + continue + Log.Debug(u"%s: Migrating %s", self.name, fn) + storage.load(None, fn) + + try: + migrate() + except OSError: + migrate(scandir_generic=True) storage.destroy() diff --git a/Contents/Libraries/Shared/fcache/cache.py b/Contents/Libraries/Shared/fcache/cache.py index 3dc99ec71..3eaf62777 100644 --- a/Contents/Libraries/Shared/fcache/cache.py +++ b/Contents/Libraries/Shared/fcache/cache.py @@ -8,7 +8,7 @@ import appdirs -from scandir import scandir +from scandir import scandir, scandir_generic as _scandir_generic try: from collections.abc import MutableMapping @@ -232,10 +232,11 @@ def _filename_to_key(self, absfilename): """Convert an absolute cache filename to a key name.""" return os.path.split(absfilename)[1] - def _all_filenames(self): + def _all_filenames(self, scandir_generic=True): """Return a list of absolute cache filenames""" + _scandir = _scandir_generic if scandir_generic else scandir try: - for entry in scandir(self.cache_dir): + for entry in _scandir(self.cache_dir): if entry.is_file(follow_symlinks=False): yield os.path.join(self.cache_dir, entry.name) except (FileNotFoundError, OSError): diff --git a/Contents/Libraries/Shared/scandir.py b/Contents/Libraries/Shared/scandir.py index 5444fac88..403f52d7b 100644 --- a/Contents/Libraries/Shared/scandir.py +++ b/Contents/Libraries/Shared/scandir.py @@ -42,7 +42,7 @@ "or ctypes, using slow generic fallback") __version__ = '1.6' -__all__ = ['scandir', 'walk'] +__all__ = ['scandir', 'scandir_generic', 'walk'] # Windows FILE_ATTRIBUTE constants for interpreting the # FIND_DATA.dwFileAttributes member diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index af401d57a..f926d7432 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -31,7 +31,7 @@ from subliminal_patch.exceptions import TooManyRequests from subzero.language import Language -from scandir import scandir +from scandir import scandir, scandir_generic as _scandir_generic logger = logging.getLogger(__name__) @@ -550,12 +550,13 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski return video -def _search_external_subtitles(path, forced_tag=False, languages=None, only_one=False): +def _search_external_subtitles(path, forced_tag=False, languages=None, only_one=False, scandir_generic=False): dirpath, filename = os.path.split(path) dirpath = dirpath or '.' fileroot, fileext = os.path.splitext(filename) subtitles = {} - for entry in scandir(dirpath): + _scandir = _scandir_generic if scandir_generic else scandir + for entry in _scandir(dirpath): if not entry.is_file(follow_symlinks=False): continue @@ -626,8 +627,12 @@ def search_external_subtitles(path, forced_tag=False, languages=None, only_one=F logger.debug("external subs: scanning path %s", abspath) if os.path.isdir(os.path.dirname(abspath)): - subtitles.update(_search_external_subtitles(abspath, forced_tag=forced_tag, languages=languages, - only_one=only_one)) + try: + subtitles.update(_search_external_subtitles(abspath, forced_tag=forced_tag, languages=languages, + only_one=only_one)) + except OSError: + subtitles.update(_search_external_subtitles(abspath, forced_tag=forced_tag, languages=languages, + only_one=only_one, scandir_generic=True)) logger.debug("external subs: found %s", subtitles) return subtitles diff --git a/Contents/Libraries/Shared/subzero/subtitle_storage.py b/Contents/Libraries/Shared/subzero/subtitle_storage.py index 4c1ac1dc3..b0e733e13 100644 --- a/Contents/Libraries/Shared/subzero/subtitle_storage.py +++ b/Contents/Libraries/Shared/subzero/subtitle_storage.py @@ -12,7 +12,7 @@ from json_tricks.nonp import loads from subzero.lib.json import dumps -from scandir import scandir +from scandir import scandir, scandir_generic as _scandir_generic from constants import mode_map logger = logging.getLogger(__name__) @@ -302,8 +302,9 @@ def get_json_data_path(self, bare_fn): return os.path.join(self.dataitems_path, "%s%s" % (bare_fn, self.extension)) return os.path.join(self.dataitems_path, bare_fn) - def get_all_files(self): - for entry in scandir(self.dataitems_path): + def get_all_files(self, scandir_generic=False): + _scandir = _scandir_generic if scandir_generic else scandir + for entry in _scandir(self.dataitems_path): if entry.is_file(follow_symlinks=False) and \ entry.name.startswith("subs_") and \ entry.name.endswith(self.extension): @@ -313,11 +314,17 @@ def get_recent_files(self, age_days=30): fl = [] root = self.dataitems_path recent_dt = datetime.datetime.now() - datetime.timedelta(days=age_days) - for fn in self.get_all_files(): - ctime = os.path.getctime(os.path.join(root, fn)) - created = datetime.datetime.fromtimestamp(ctime) - if created > recent_dt: - fl.append(fn) + + def run(scandir_generic=False): + for fn in self.get_all_files(scandir_generic=scandir_generic): + ctime = os.path.getctime(os.path.join(root, fn)) + created = datetime.datetime.fromtimestamp(ctime) + if created > recent_dt: + fl.append(fn) + try: + run() + except OSError: + run(scandir_generic=True) return fl def load_recent_files(self, age_days=30): @@ -329,7 +336,7 @@ def load_recent_files(self, age_days=30): out[fn] = data return out - def delete_missing(self, wanted_languages=set()): + def delete_missing(self, wanted_languages=set(), scandir_generic=False): deleted = [] def delete_fn(filename): @@ -338,7 +345,7 @@ def delete_fn(filename): else: self.legacy_delete(filename) - for fn in self.get_all_files(): + for fn in self.get_all_files(scandir_generic=scandir_generic): video_id = os.path.basename(fn).split(".")[0].split("subs_")[1] item = self.get_item(video_id) From 4acf26b73d9ba123890ef436116db6f8be9056c3 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 13 Jul 2018 03:28:10 +0200 Subject: [PATCH 148/710] prefs: set autoclean leftover/unused to off by default --- Contents/DefaultPrefs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 0360e8c6b..61471b397 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -602,7 +602,7 @@ "id": "subtitles.autoclean", "label": "Automatically delete leftover/unused (externally saved) subtitles", "type": "bool", - "default": "true" + "default": "false" }, { "id": "activity.on_playback", From 8062abade9e657ffbeefd9ddbdc687cdf0291c7b Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 13 Jul 2018 15:42:17 +0200 Subject: [PATCH 149/710] submod: common: fix double quotes that are meant to be single quotes inside words --- Contents/Libraries/Shared/subzero/modification/mods/common.py | 3 +++ Contents/Libraries/Shared/test.srt | 1 + 2 files changed, 4 insertions(+) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 18302c931..adf8fd82f 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -33,6 +33,9 @@ class CommonFixes(SubtitleTextModification): # '' = " NReProcessor(re.compile(ur'(?u)([\'’ʼ❜‘‛][\'’ʼ❜‘‛]+)'), u'"', name="CM_double_apostrophe"), + # double quotes instead of single quotes inside words + NReProcessor(re.compile(ur'(?u)([A-zÀ-ž])"([A-zÀ-ž])'), ur"\1'\2", name="CM_double_as_single"), + # normalize quotes NReProcessor(re.compile(ur'(?u)(\s*["”“‟„])\s*(["”“‟„]["”“‟„\s]*)'), lambda match: '"' + (" " if match.group(2).endswith(" ") else ""), diff --git a/Contents/Libraries/Shared/test.srt b/Contents/Libraries/Shared/test.srt index ef05aa5ab..e5c95606b 100644 --- a/Contents/Libraries/Shared/test.srt +++ b/Contents/Libraries/Shared/test.srt @@ -41,6 +41,7 @@ But fix this: 81 ,00 (laughing): lrn gonna And when are we? (chuckles) lrn gonna And when are we? "I luv butts". +That'’s OK. 8 00:00:24,274 --> 00:00:26,649 From eb64716012e9cf351626b80779deb20aa54d01e2 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 14 Jul 2018 15:03:25 +0200 Subject: [PATCH 150/710] i18n: fix not used translation for recently added missing subtitles menu --- Contents/Code/interface/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index 27af0417b..191c229ca 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -100,7 +100,7 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r oc.add(DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, randomize=timestamp()), title=_("Show recently added items with missing subtitles"), - summary=_("Lists items with missing subtitles. Click on Find recent items with missing subs to update list"), + summary=_("Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list"), thumb=R("icon-missing.jpg") )) oc.add(DirectoryObject( From bdcac383fdccb841713f0b29b64a4fdcea55390d Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 14 Jul 2018 18:33:13 +0200 Subject: [PATCH 151/710] core: instead of an ignore list, add the option to disable SZ by default, then enable it per item/series/section (inverse ignore list) --- Contents/Code/__init__.py | 4 +- Contents/Code/interface/main.py | 18 ++--- Contents/Code/interface/menu.py | 8 +-- Contents/Code/interface/menu_helpers.py | 12 ++-- Contents/Code/support/config.py | 61 +++++++++++------ Contents/Code/support/ignore.py | 14 +++- Contents/Code/support/items.py | 91 ++++++++++++++----------- Contents/Code/support/tasks.py | 6 +- Contents/DefaultPrefs.json | 18 +++-- 9 files changed, 140 insertions(+), 92 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 9b9935ca7..61b402c14 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -26,7 +26,7 @@ from support.plex_media import media_to_videos, get_media_item_ids from support.scanning import scan_videos from support.storage import save_subtitles, store_subtitle_info, get_subtitle_storage -from support.items import is_ignored +from support.items import is_wanted from support.config import config from support.lib import get_intent from support.helpers import track_usage, get_title_for_video_metadata, get_identifier, cast_bool, \ @@ -204,7 +204,7 @@ def update(self, metadata, media, lang): # media ignored? use_any_parts = False for video in videos: - if is_ignored(video["id"]): + if not is_wanted(video["id"]): Log.Debug(u"Ignoring %s" % video) continue use_any_parts = True diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index 191c229ca..94e080fd5 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -4,7 +4,7 @@ from support.config import config from support.helpers import pad_title, timestamp, df, display_language from support.scheduler import scheduler -from support.ignore import ignore_list +from support.ignore import exclude_list from support.items import get_item_thumb, get_on_deck_items, get_all_items, get_items_info, get_item, get_item_title from menu_helpers import main_icon, debounce, SubFolderObjectContainer, default_thumb, dig_tree, add_ignore_options, \ ObjectContainer, route, handler @@ -136,7 +136,7 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r oc.add(DirectoryObject( key=Callback(IgnoreListMenu), - title=_("Display ignore list (%(ignored_count)d)", ignored_count=len(ignore_list)), + title=_("Display ignore list (%(ignored_count)d)", ignored_count=len(exclude_list)), summary=_("Show the current ignore list (mainly used for the automatic tasks)"), thumb=R("icon-ignore.jpg") )) @@ -325,14 +325,14 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): :param todo: :return: """ - is_ignored = rating_key in ignore_list[kind] + is_ignored = rating_key in exclude_list[kind] if not sure: t = u"Add %(kind)s %(title)s to the ignore list" if is_ignored: t = u"Remove %(kind)s %(title)s from the ignore list" oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1=_(t, - kind=ignore_list.verbose(kind), + kind=exclude_list.verbose(kind), title=title ), title2=_("Are you sure?")) @@ -343,7 +343,7 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): )) return oc - rel = ignore_list[kind] + rel = exclude_list[kind] dont_change = False state = None if todo == "remove": @@ -352,16 +352,16 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): else: rel.remove(rating_key) Log.Info("Removed %s (%s) from the ignore list", title, rating_key) - ignore_list.remove_title(kind, rating_key) - ignore_list.save() + exclude_list.remove_title(kind, rating_key) + exclude_list.save() elif todo == "add": if is_ignored: dont_change = True else: rel.append(rating_key) Log.Info("Added %s (%s) to the ignore list", title, rating_key) - ignore_list.add_title(kind, rating_key, title) - ignore_list.save() + exclude_list.add_title(kind, rating_key, title) + exclude_list.save() else: dont_change = True diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 9c52b9600..f6db72946 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -21,7 +21,7 @@ from support.scheduler import scheduler from support.config import config from support.helpers import timestamp, df, display_language -from support.ignore import ignore_list +from support.ignore import exclude_list from support.items import get_all_items, get_items_info, get_item_kind_from_rating_key, get_item, MI_KEY, get_item_title from support.storage import get_subtitle_storage from support.i18n import _ @@ -221,10 +221,10 @@ def season_extract_embedded(rating_key, requested_language, with_mods=False, for @route(PREFIX + '/ignore_list') def IgnoreListMenu(): oc = SubFolderObjectContainer(title2="Ignore list", replace_parent=True) - for key in ignore_list.key_order: - values = ignore_list[key] + for key in exclude_list.key_order: + values = exclude_list[key] for value in values: - add_ignore_options(oc, key, title=ignore_list.get_title(key, value), rating_key=value, + add_ignore_options(oc, key, title=exclude_list.get_title(key, value), rating_key=value, callback_menu=IgnoreMenu) return oc diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index ac5309d7d..f1487ca42 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -11,7 +11,7 @@ from support.i18n import is_localized_string, _ from support.items import get_kind, get_item_thumb, get_item, get_item_kind_from_item, refresh_item from support.helpers import get_video_display_title, pad_title, display_language, quote_args, is_stream_forced -from support.ignore import ignore_list +from support.ignore import exclude_list from support.lib import get_intent from support.config import config from subzero.constants import ICON_SUB, ICON @@ -43,12 +43,12 @@ def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None """ # try to translate kind to the ignore key use_kind = kind - if kind not in ignore_list: - use_kind = ignore_list.translate_key(kind) - if not use_kind or use_kind not in ignore_list: + if kind not in exclude_list: + use_kind = exclude_list.translate_key(kind) + if not use_kind or use_kind not in exclude_list: return - in_list = rating_key in ignore_list[use_kind] + in_list = rating_key in exclude_list[use_kind] t = u"Ignore %(kind)s \"%(title)s\"" if in_list: @@ -57,7 +57,7 @@ def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None oc.add(DirectoryObject( key=Callback(callback_menu, kind=use_kind, sure=False, todo="not_set", rating_key=rating_key, title=title), title=_(t, - kind=ignore_list.verbose(kind) if add_kind else "", + kind=exclude_list.verbose(kind) if add_kind else "", title=unicode(title)) ) ) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 7cc0586cb..a9c4b472a 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -44,7 +44,8 @@ 'wtv', 'xsp', 'xvid', 'webm'] -IGNORE_FN = ("subzero.ignore", ".subzero.ignore", ".nosz") +EXCLUDE_FN = ("subzero.ignore", ".subzero.ignore", "subzero.exclude", ".subzero.exclude", ".nosz") +INCLUDE_FN = ("subzero.include", ".subzero.include", ".sz") VERSION_RE = re.compile(ur'CFBundleVersion.+?([0-9\.]+)', re.DOTALL) DEV_RE = re.compile(ur'PlexPluginDevMode.+?([01]+)', re.DOTALL) @@ -77,7 +78,7 @@ def int_or_default(s, default): class Config(object): - config_version = 1 + config_version = 2 libraries_root = None plugin_info = "" version = None @@ -98,6 +99,7 @@ class Config(object): advanced = None debug_i18n = False + include = False enable_channel = True enable_agent = True pin = None @@ -110,8 +112,8 @@ class Config(object): max_recent_items_per_library = 200 permissions_ok = False missing_permissions = None - ignore_sz_files = False - ignore_paths = None + include_exclude_sz_files = False + include_exclude_paths = None fs_encoding = None notify_executable = None sections = None @@ -186,14 +188,15 @@ def initialize(self): self.set_activity_modes() self.parse_rename_mode() + self.include = Prefs["subtitles.include_exclude_mode"] == "manual include" self.subtitle_destination_folder = self.get_subtitle_destination_folder() self.subtitle_formats = self.get_subtitle_formats() self.forced_only = Prefs["subtitles.when"] == "Only foreign/forced" self.max_recent_items_per_library = int_or_default(Prefs["scheduler.max_recent_items_per_library"], 2000) self.sections = list(Plex["library"].sections()) self.missing_permissions = [] - self.ignore_sz_files = cast_bool(Prefs["subtitles.ignore_fs"]) - self.ignore_paths = self.parse_ignore_paths() + self.include_exclude_sz_files = cast_bool(Prefs["subtitles.include_exclude_fs"]) + self.include_exclude_paths = self.parse_include_exclude_paths() self.enabled_sections = self.check_enabled_sections() self.permissions_ok = self.check_permissions() self.notify_executable = self.check_notify_executable() @@ -251,6 +254,16 @@ def migrate_prefs_to_1(self, user_prefs, **kwargs): return update_prefs + def migrate_prefs_to_2(self, user_prefs, **kwargs): + update_prefs = {} + if "subtitles.ignore_fs" in user_prefs and user_prefs["subtitles.ignore_fs"] == "true": + update_prefs["subtitles.include_exclude_fs"] = "true" + + if "subtitles.ignore_paths" in user_prefs and user_prefs["subtitles.ignore_paths"]: + update_prefs["subtitles.include_exclude_paths"] = user_prefs["subtitles.ignore_paths"] + + return update_prefs + def init_libraries(self): try_executables = [] custom_unrar = os.environ.get("SZ_UNRAR_TOOL") @@ -462,7 +475,8 @@ def check_permissions(self): return True self.missing_permissions = [] - use_ignore_fs = Prefs["subtitles.ignore_fs"] + use_include_exclude_fs = self.include_exclude_sz_files + cmp_val = self.include all_permissions_ok = True for section in self.sections: if section.key not in self.enabled_sections: @@ -477,12 +491,12 @@ def check_permissions(self): if not os.path.exists(path_str): continue - if use_ignore_fs: + if use_include_exclude_fs: # check whether we've got an ignore file inside the section path - if self.is_physically_ignored(path_str): + if self.is_physically_wanted(path_str) == cmp_val: continue - if self.is_path_ignored(path_str): + if self.is_path_wanted(path_str) == cmp_val: # is the path in our ignored paths setting? continue @@ -517,29 +531,32 @@ def get_plugin_info(self): info_file_path = os.path.abspath(os.path.join(curDir, "..", "..", "Info.plist")) return FileIO.read(info_file_path) - def parse_ignore_paths(self): - paths = Prefs["subtitles.ignore_paths"] + def parse_include_exclude_paths(self): + paths = Prefs["subtitles.include_exclude_paths"] if paths: try: return [path.strip() for path in paths.split(",")] except: - Log.Error("Couldn't parse your ignore paths settings: %s" % paths) + Log.Error("Couldn't parse your include/exclude paths settings: %s" % paths) return [] - def is_physically_ignored(self, folder): + def is_physically_wanted(self, folder): # check whether we've got an ignore file inside the path - for ifn in IGNORE_FN: + ret_val = self.include + ref_list = INCLUDE_FN if self.include else EXCLUDE_FN + for ifn in ref_list: if os.path.isfile(os.path.join(folder, ifn)): - Log.Info(u'Ignoring "%s" because "%s" exists', folder, ifn) - return True + Log.Info(u'%s "%s" because "%s" exists', "Including" if self.include else "Ignoring", folder, ifn) + return ret_val - return False + return not ret_val - def is_path_ignored(self, fn): - for path in self.ignore_paths: + def is_path_wanted(self, fn): + ret_val = self.include + for path in self.include_exclude_paths: if fn.startswith(path): - return True - return False + return ret_val + return not ret_val def check_notify_executable(self): fn = Prefs["notify_executable"] diff --git a/Contents/Code/support/ignore.py b/Contents/Code/support/ignore.py index dff1748de..6ddd94201 100644 --- a/Contents/Code/support/ignore.py +++ b/Contents/Code/support/ignore.py @@ -1,9 +1,10 @@ # coding=utf-8 from subzero.lib.dict import DictProxy +from config import config -class IgnoreDict(DictProxy): +class ExcludeDict(DictProxy): store = "ignore" # single item keys returned by helpers.items.getItems mapped to their parents @@ -62,4 +63,13 @@ def setup_defaults(self): return {"sections": [], "series": [], "videos": [], "titles": {}, "seasons": []} -ignore_list = IgnoreDict(Dict) +class IncludeDict(ExcludeDict): + store = "include" + + +exclude_list = ExcludeDict(Dict) +include_list = IncludeDict(Dict) + + +def get_decision_list(): + return include_list if config.include else exclude_list diff --git a/Contents/Code/support/items.py b/Contents/Code/support/items.py index b4fe2c4b8..5daee0e0e 100644 --- a/Contents/Code/support/items.py +++ b/Contents/Code/support/items.py @@ -10,10 +10,10 @@ import datetime -from ignore import ignore_list +from ignore import get_decision_list from helpers import is_recent, get_plex_item_display_title, query_plex, PartUnknownException from lib import Plex, get_intent -from config import config, IGNORE_FN +from config import config from subliminal_patch.subtitle import ModifiedSubtitle from subzero.modification import registry as mod_registry, SubtitleModifications from socket import timeout @@ -209,10 +209,13 @@ def get_recent_items(): available_keys = ("key", "title", "parent_key", "parent_title", "season", "episode", "added", "filename") recent = [] + ref_list = get_decision_list() + for section in Plex["library"].sections(): if section.type not in ("movie", "show") \ or section.key not in config.enabled_sections \ - or section.key in ignore_list.sections: + or ((section.key not in ref_list.sections and config.include) + or (section.key in ref_list.sections and not config.include)): Log.Debug(u"Skipping section: %s" % section.title) continue @@ -229,13 +232,15 @@ def get_recent_items(): matches = [m.groupdict() for m in matcher.finditer(response.content)] for match in matches: data = dict((key, match[key] if key in match else None) for key in available_keys) - if section.type == "show" and data["parent_key"] in ignore_list.series: + if section.type == "show" and ((data["parent_key"] not in ref_list.series and config.include) or + (data["parent_key"] in ref_list.series and not config.include)): Log.Debug(u"Skipping series: %s" % data["parent_title"]) continue - if data["key"] in ignore_list.videos: + if (data["key"] not in ref_list.videos and config.include) or \ + (data["key"] in ref_list.videos and not config.include): Log.Debug(u"Skipping item: %s" % data["title"]) continue - if is_physically_ignored(data["filename"], plex_item_type): + if not is_physically_wanted(data["filename"], plex_item_type): Log.Debug(u"Skipping item: %s" % data["title"]) continue @@ -257,63 +262,69 @@ def get_all_items(key, base="library", value=None, flat=False): return get_items(key, base=base, value=value, flat=flat) -def is_ignored(rating_key, item=None): +def is_wanted(rating_key, item=None): """ check whether an item, its show/season/section is in the soft or the hard ignore list :param rating_key: :param item: :return: """ - # item in soft ignore list - if ignore_list["videos"] and rating_key in ignore_list["videos"]: - Log.Debug("Item %s is in the soft ignore list" % rating_key) - return True + + ref_list = get_decision_list() + ret_val = ref_list.store == "include" + inc_exc_verbose = "exclude" if not ret_val else "include" + + # item in soft include/exclude list + if ref_list["videos"] and rating_key in ref_list["videos"]: + Log.Debug("Item %s is in the soft %s list" % (rating_key, inc_exc_verbose)) + return ret_val item = item or get_item(rating_key) kind = get_item_kind(item) - # show in soft ignore list - if kind == "Episode" and ignore_list["series"] and item.show.rating_key in ignore_list["series"]: - Log.Debug("Item %s's show is in the soft ignore list" % rating_key) - return True + # show in soft include/exclude list + if kind == "Episode" and ref_list["series"] and item.show.rating_key in ref_list["series"]: + Log.Debug("Item %s's show is in the soft %s list" % (rating_key, inc_exc_verbose)) + return ret_val - # season in soft ignore list - if kind == "Episode" and ignore_list["seasons"] and item.season.rating_key in ignore_list["seasons"]: - Log.Debug("Item %s's season is in the soft ignore list" % rating_key) - return True + # season in soft include/exclude list + if kind == "Episode" and ref_list["seasons"] and item.season.rating_key in ref_list["seasons"]: + Log.Debug("Item %s's season is in the soft %s list" % (rating_key, inc_exc_verbose)) + return ret_val - # section in soft ignore list - if ignore_list["sections"] and item.section.key in ignore_list["sections"]: - Log.Debug("Item %s's section is in the soft ignore list" % rating_key) - return True + # section in soft include/exclude list + if ref_list["sections"] and item.section.key in ref_list["sections"]: + Log.Debug("Item %s's section is in the soft %s list" % (rating_key, inc_exc_verbose)) + return ret_val - # physical/path ignore - if config.ignore_sz_files or config.ignore_paths: + # physical/path include/exclude + if config.include_exclude_sz_files or config.include_exclude_paths: for media in item.media: for part in media.parts: - if is_physically_ignored(part.file, kind): - return True + if is_physically_wanted(part.file, kind): + return ret_val - return False + return not ret_val -def is_physically_ignored(fn, kind): - if config.ignore_sz_files or config.ignore_paths: +def is_physically_wanted(fn, kind): + ret_val = config.include + if config.include_exclude_sz_files or config.include_exclude_paths: # normally check current item folder and the library - check_ignore_paths = [".", "../"] + check_paths = [".", "../"] if kind == "Episode": # series/episode, we've got a season folder here, also - check_ignore_paths.append("../../") + check_paths.append("../../") - if config.ignore_paths and config.is_path_ignored(fn): - Log.Debug("Item %s's path is manually ignored" % fn) - return True + if config.include_exclude_paths and config.is_path_wanted(fn): + Log.Debug("Item %s's path is manually %s" % (fn, "included" if ret_val else "excluded")) + return ret_val - if config.ignore_sz_files: - for sub_path in check_ignore_paths: - if config.is_physically_ignored(os.path.normpath(os.path.join(os.path.dirname(fn), sub_path))): - Log.Debug("An ignore file exists in either the items or its parent folders") - return True + if config.include_exclude_sz_files: + for sub_path in check_paths: + if config.is_physically_wanted(os.path.normpath(os.path.join(os.path.dirname(fn), sub_path))): + Log.Debug("An include/exclude indicator file exists in either the items or its parent folders") + return ret_val def refresh_item(rating_key, force=False, timeout=8000, refresh_kind=None, parent_rating_key=None): diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index 1f39b4cd7..b971a0e7a 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -16,7 +16,7 @@ from scheduler import scheduler from storage import save_subtitles, get_subtitle_storage from support.config import config -from support.items import get_recent_items, get_item, is_ignored, get_item_title +from support.items import get_recent_items, get_item, is_wanted, get_item_title from support.helpers import track_usage, get_title_for_video_metadata, cast_bool, PartUnknownException from support.plex_media import get_plex_metadata from support.scanning import scan_videos @@ -421,7 +421,7 @@ def skip_item(): skip_item() continue - if is_ignored(video_id, item=plex_item): + if not is_wanted(video_id, item=plex_item): skip_item() continue @@ -558,7 +558,7 @@ def prepare(self, *args, **kwargs): self.items_done = [] recent_items = get_recent_items() missing = items_get_all_missing_subs(recent_items, sleep_after_request=0.2) - ids = set([id for added_at, id, title, item, missing_languages in missing if not is_ignored(id, item=item)]) + ids = set([id for added_at, id, title, item, missing_languages in missing if is_wanted(id, item=item)]) self.items_searching = missing self.items_searching_ids = ids self.items_failed = [] diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 61471b397..79abc4be3 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -729,14 +729,24 @@ "default": "2" }, { - "id": "subtitles.ignore_fs", - "label": "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)", + "id": "subtitles.include_exclude_mode", + "label": "Explicitly enable Sub-Zero and manually ignore items, or disable Sub-Zero and explicitly include items?", + "type": "enum", + "values": [ + "manual exclude", + "manual include" + ], + "default": "manual exclude" + }, + { + "id": "subtitles.include_exclude_fs", + "label": "Enable/disable Sub-Zero for folders (with \"subzero.ignore/.subzero.ignore/.nosz or subzero.include/.sz\" files in them)", "type": "bool", "default": "false" }, { - "id": "subtitles.ignore_paths", - "label": "Ignore anything in the following paths (comma-separated)", + "id": "subtitles.include_exclude_paths", + "label": "Enable/disable Sub-Zero in the following paths (comma-separated)", "type": "text", "default": "" }, From 53e92ed3dcb97b3ee1e0fd858f04dfbf4bb485cf Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 14 Jul 2018 18:37:35 +0200 Subject: [PATCH 152/710] prefs: clarify? include exclude mode --- Contents/DefaultPrefs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 79abc4be3..10c481012 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -730,7 +730,7 @@ }, { "id": "subtitles.include_exclude_mode", - "label": "Explicitly enable Sub-Zero and manually ignore items, or disable Sub-Zero and explicitly include items?", + "label": "Do you want to manually exclude items SZ should work with, or manually include them? (inverts the settings below)", "type": "enum", "values": [ "manual exclude", From 7c80ea515f764543a886ff2dde6df2fa9502fb4e Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 15 Jul 2018 05:54:51 +0200 Subject: [PATCH 153/710] core: fixes for include/exclude mode --- Contents/Code/__init__.py | 2 +- Contents/Code/support/config.py | 5 ++--- Contents/Code/support/items.py | 9 +++------ 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 61b402c14..9869afca9 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -205,7 +205,7 @@ def update(self, metadata, media, lang): use_any_parts = False for video in videos: if not is_wanted(video["id"]): - Log.Debug(u"Ignoring %s" % video) + Log.Debug(u"Skipping %s" % video) continue use_any_parts = True diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index a9c4b472a..24d9f0abb 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -476,7 +476,6 @@ def check_permissions(self): self.missing_permissions = [] use_include_exclude_fs = self.include_exclude_sz_files - cmp_val = self.include all_permissions_ok = True for section in self.sections: if section.key not in self.enabled_sections: @@ -493,10 +492,10 @@ def check_permissions(self): if use_include_exclude_fs: # check whether we've got an ignore file inside the section path - if self.is_physically_wanted(path_str) == cmp_val: + if not self.is_physically_wanted(path_str): continue - if self.is_path_wanted(path_str) == cmp_val: + if not self.is_path_wanted(path_str): # is the path in our ignored paths setting? continue diff --git a/Contents/Code/support/items.py b/Contents/Code/support/items.py index 5daee0e0e..853261493 100644 --- a/Contents/Code/support/items.py +++ b/Contents/Code/support/items.py @@ -302,13 +302,12 @@ def is_wanted(rating_key, item=None): for media in item.media: for part in media.parts: if is_physically_wanted(part.file, kind): - return ret_val + return True return not ret_val def is_physically_wanted(fn, kind): - ret_val = config.include if config.include_exclude_sz_files or config.include_exclude_paths: # normally check current item folder and the library check_paths = [".", "../"] @@ -317,14 +316,12 @@ def is_physically_wanted(fn, kind): check_paths.append("../../") if config.include_exclude_paths and config.is_path_wanted(fn): - Log.Debug("Item %s's path is manually %s" % (fn, "included" if ret_val else "excluded")) - return ret_val + return True if config.include_exclude_sz_files: for sub_path in check_paths: if config.is_physically_wanted(os.path.normpath(os.path.join(os.path.dirname(fn), sub_path))): - Log.Debug("An include/exclude indicator file exists in either the items or its parent folders") - return ret_val + return True def refresh_item(rating_key, force=False, timeout=8000, refresh_kind=None, parent_rating_key=None): From d372aa469f4e028e806d80be5181d6032773efc1 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 15 Jul 2018 05:55:19 +0200 Subject: [PATCH 154/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 8ed486238..6c1f70023 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.5.8.2677 + 2.5.8.2687 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.8.2677 DEV +Version 2.5.8.2687 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 87e49b8c5f1b591f705aa207efe18d41f97f18af Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 15 Jul 2018 06:23:55 +0200 Subject: [PATCH 155/710] core: include/exclude: add more logging; more fixing; clarify settings --- Contents/Code/__init__.py | 2 +- Contents/Code/interface/menu.py | 3 ++- Contents/Code/support/items.py | 12 +++++------- Contents/DefaultPrefs.json | 4 ++-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 9869afca9..29a6ac2cd 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -205,7 +205,7 @@ def update(self, metadata, media, lang): use_any_parts = False for video in videos: if not is_wanted(video["id"]): - Log.Debug(u"Skipping %s" % video) + Log.Debug(u'Skipping "%s"' % video["filename"]) continue use_any_parts = True diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index f6db72946..0e0ff0092 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -324,7 +324,8 @@ def ValidatePrefs(): for attr in [ "version", "app_support_path", "data_path", "data_items_path", "enable_agent", "enable_channel", "permissions_ok", "missing_permissions", "fs_encoding", - "subtitle_destination_folder", "new_style_cache", "dbm_supported", "lang_list", "providers", + "subtitle_destination_folder", "include", "include_exclude_paths", "include_exclude_sz_files", + "new_style_cache", "dbm_supported", "lang_list", "providers", "plex_transcoder", "refiner_settings", "unrar", "adv_cfg_path"]: value = getattr(config, attr) diff --git a/Contents/Code/support/items.py b/Contents/Code/support/items.py index 853261493..ad77faf85 100644 --- a/Contents/Code/support/items.py +++ b/Contents/Code/support/items.py @@ -301,8 +301,7 @@ def is_wanted(rating_key, item=None): if config.include_exclude_sz_files or config.include_exclude_paths: for media in item.media: for part in media.parts: - if is_physically_wanted(part.file, kind): - return True + return is_physically_wanted(part.file, kind) return not ret_val @@ -315,13 +314,12 @@ def is_physically_wanted(fn, kind): # series/episode, we've got a season folder here, also check_paths.append("../../") - if config.include_exclude_paths and config.is_path_wanted(fn): - return True - if config.include_exclude_sz_files: for sub_path in check_paths: - if config.is_physically_wanted(os.path.normpath(os.path.join(os.path.dirname(fn), sub_path))): - return True + return config.is_physically_wanted(os.path.normpath(os.path.join(os.path.dirname(fn), sub_path))) + + if config.include_exclude_paths and config.is_path_wanted(fn): + return True def refresh_item(rating_key, force=False, timeout=8000, refresh_kind=None, parent_rating_key=None): diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 10c481012..573a6a924 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -730,7 +730,7 @@ }, { "id": "subtitles.include_exclude_mode", - "label": "Do you want to manually exclude items SZ should work with, or manually include them? (inverts the settings below)", + "label": "Do you want to manually exclude items SZ should work with, or manually include them? (impacts the settings below)", "type": "enum", "values": [ "manual exclude", @@ -740,7 +740,7 @@ }, { "id": "subtitles.include_exclude_fs", - "label": "Enable/disable Sub-Zero for folders (with \"subzero.ignore/.subzero.ignore/.nosz or subzero.include/.sz\" files in them)", + "label": "Use \"subzero.ignore/.subzero.ignore/.nosz\" (exclude) or \"subzero.include/.subzero.include/.sz\" (include) files inside folders", "type": "bool", "default": "false" }, From 426fe2489427a10310ff7bb1d886efff873f3204 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 15 Jul 2018 06:27:09 +0200 Subject: [PATCH 156/710] core: include/exclude: reorder settings, clarify settings --- Contents/DefaultPrefs.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 573a6a924..b1cc924d7 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -730,7 +730,7 @@ }, { "id": "subtitles.include_exclude_mode", - "label": "Do you want to manually exclude items SZ should work with, or manually include them? (impacts the settings below)", + "label": "Do you want to manually exclude or include items SZ should work with? (impacts the settings below and the plugin menu)", "type": "enum", "values": [ "manual exclude", @@ -738,18 +738,18 @@ ], "default": "manual exclude" }, + { + "id": "subtitles.include_exclude_paths", + "label": "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impact this)", + "type": "text", + "default": "" + }, { "id": "subtitles.include_exclude_fs", "label": "Use \"subzero.ignore/.subzero.ignore/.nosz\" (exclude) or \"subzero.include/.subzero.include/.sz\" (include) files inside folders", "type": "bool", "default": "false" }, - { - "id": "subtitles.include_exclude_paths", - "label": "Enable/disable Sub-Zero in the following paths (comma-separated)", - "type": "text", - "default": "" - }, { "id": "plugin_mode2", "label": "Sub-Zero mode", From c031eb5829778135c7a622429a645c2a8f5148c9 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 17 Jul 2018 03:28:38 +0200 Subject: [PATCH 157/710] menu: fix plugin not responding when ignoring an item in certain menus; fixes #535 --- Contents/Code/interface/menu_helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index f1487ca42..192ec70c1 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -55,7 +55,7 @@ def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None t = u"Un-ignore %(kind)s \"%(title)s\"" oc.add(DirectoryObject( - key=Callback(callback_menu, kind=use_kind, sure=False, todo="not_set", rating_key=rating_key, title=title), + key=Callback(callback_menu, kind=use_kind, sure=False, todo="not_set", rating_key=str(rating_key), title=title), title=_(t, kind=exclude_list.verbose(kind) if add_kind else "", title=unicode(title)) From bc1f99f6af5760ad85533c20fdab35dc41432b33 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 2 Aug 2018 17:38:59 +0200 Subject: [PATCH 158/710] core: include/exclude: proper handling for sz indicator files --- Contents/Code/support/items.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Contents/Code/support/items.py b/Contents/Code/support/items.py index ad77faf85..b4647a004 100644 --- a/Contents/Code/support/items.py +++ b/Contents/Code/support/items.py @@ -314,9 +314,18 @@ def is_physically_wanted(fn, kind): # series/episode, we've got a season folder here, also check_paths.append("../../") + wanted_results = [] if config.include_exclude_sz_files: for sub_path in check_paths: - return config.is_physically_wanted(os.path.normpath(os.path.join(os.path.dirname(fn), sub_path))) + wanted_results.append(config.is_physically_wanted(os.path.normpath(os.path.join(os.path.dirname(fn), + sub_path)))) + + if config.include and any(wanted_results): + return True + elif not config.include and not all(wanted_results): + return False + else: + return True if config.include_exclude_paths and config.is_path_wanted(fn): return True From 82b1cdb9578e72f67089de8092d54fbb4836dfdb Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 2 Aug 2018 18:10:15 +0200 Subject: [PATCH 159/710] core: include/exclude: proper handling for sz indicator files and include/exclude paths --- Contents/Code/support/items.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Contents/Code/support/items.py b/Contents/Code/support/items.py index b4647a004..228cf615c 100644 --- a/Contents/Code/support/items.py +++ b/Contents/Code/support/items.py @@ -320,15 +320,15 @@ def is_physically_wanted(fn, kind): wanted_results.append(config.is_physically_wanted(os.path.normpath(os.path.join(os.path.dirname(fn), sub_path)))) - if config.include and any(wanted_results): - return True - elif not config.include and not all(wanted_results): - return False - else: - return True - if config.include_exclude_paths and config.is_path_wanted(fn): + wanted_results.append(True) + + if config.include and any(wanted_results): return True + elif not config.include and not all(wanted_results): + return False + + return True def refresh_item(rating_key, force=False, timeout=8000, refresh_kind=None, parent_rating_key=None): From f2be750e2e057f228764a78ed6a9dfc9aff95d78 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 2 Aug 2018 18:12:49 +0200 Subject: [PATCH 160/710] core: include/exclude: proper handling for sz indicator files and include/exclude paths, attempt 2 --- Contents/Code/support/items.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/items.py b/Contents/Code/support/items.py index 228cf615c..5bba8021e 100644 --- a/Contents/Code/support/items.py +++ b/Contents/Code/support/items.py @@ -320,8 +320,8 @@ def is_physically_wanted(fn, kind): wanted_results.append(config.is_physically_wanted(os.path.normpath(os.path.join(os.path.dirname(fn), sub_path)))) - if config.include_exclude_paths and config.is_path_wanted(fn): - wanted_results.append(True) + if config.include_exclude_paths: + wanted_results.append(config.is_path_wanted(fn)) if config.include and any(wanted_results): return True From 5e3f56a1b0f83842b15b1ae597f226a2d7859068 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 2 Aug 2018 18:17:10 +0200 Subject: [PATCH 161/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 6c1f70023..da0a96bcf 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.5.8.2687 + 2.5.8.2694 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.8.2687 DEV +Version 2.5.8.2694 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 124f6da70c13e6ed8af39c50ce70d3d8fe55043a Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 2 Aug 2018 18:24:42 +0200 Subject: [PATCH 162/710] submod: common: normalize small hyphens to dash --- Contents/Libraries/Shared/subzero/modification/mods/common.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index adf8fd82f..009da55f6 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -18,6 +18,9 @@ class CommonFixes(SubtitleTextModification): long_description = "Fix common and whitespace/punctuation issues in subtitles" processors = [ + # normalize hyphens + NReProcessor(re.compile(ur'(?u)([‑‐﹘﹣])'), u"-", name="CM_hyphens"), + # -- = em dash NReProcessor(re.compile(r'(?u)(\w|\b|\s|^)(-\s?-{1,2})'), ur"\1—", name="CM_multidash"), From 031bee20d907ac77076aa08db89cacd68fddc46a Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 6 Aug 2018 15:03:26 +0200 Subject: [PATCH 163/710] providers: opensubtitles: handle bad/inexistant responses --- .../subliminal_patch/providers/opensubtitles.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index bcaf3a06f..cdcadc8d8 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -329,11 +329,14 @@ def checked(fn): """ response = None try: - response = fn() - except requests.RequestException as e: - status_code = e.response.status_code - else: - status_code = int(response['status'][:3]) + try: + response = fn() + except requests.RequestException as e: + status_code = e.response.status_code + else: + status_code = int(response['status'][:3]) + except: + status_code = None if status_code == 401: raise Unauthorized @@ -352,6 +355,8 @@ def checked(fn): if status_code == 503: raise ServiceUnavailable if status_code != 200: - raise OpenSubtitlesError(response['status']) + if response and "status" in response: + raise OpenSubtitlesError(response['status']) + raise OpenSubtitlesError("Unknown Error") return response From 49b124e7bf0ef4ec6ff7973152c750c6f00c48e1 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 6 Aug 2018 15:25:27 +0200 Subject: [PATCH 164/710] providers: opensubtitles: log bad response data --- Contents/Libraries/Shared/subliminal_patch/http.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index bcf97d7b8..4bb583f73 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -110,7 +110,10 @@ def request(self, host, handler, request_body, verbose=0): resp.raise_for_status() self.verbose = verbose - return self.parse_response(resp.raw) + try: + return self.parse_response(resp.raw) + except: + logger.debug("Bad response data: %r", resp.raw) def _build_url(self, host, handler): """ From 5a9337c2e26d8c2b8acf049471a645f6951a3218 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 6 Aug 2018 15:39:48 +0200 Subject: [PATCH 165/710] providers: opensubtitles: treat empty response as ServiceUnavailable for now --- .../Shared/subliminal_patch/providers/opensubtitles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index cdcadc8d8..88fd0d647 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -357,6 +357,6 @@ def checked(fn): if status_code != 200: if response and "status" in response: raise OpenSubtitlesError(response['status']) - raise OpenSubtitlesError("Unknown Error") + raise ServiceUnavailable("Unknown Error, empty response") return response From f31d75618546c6d92b86f311c388dd26a9c8c7e9 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 6 Aug 2018 15:57:39 +0200 Subject: [PATCH 166/710] submod: HI: only remove caps before colon if the colon is followed by whitespace or EOL; fixes #542 --- .../Shared/subzero/modification/mods/hearing_impaired.py | 2 +- Contents/Libraries/Shared/test.srt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py index 4b92034d5..6e5390093 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py @@ -49,7 +49,7 @@ class HearingImpaired(SubtitleTextModification): # uppercase text before colon (at least 3 uppercase chars); at start or after a sentence, # possibly with a dash in front; ignore anything ending with a quote NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"\']))([\s-]*(?=[A-ZÀ-Ž&+]\s*[A-ZÀ-Ž&+]\s*[A-ZÀ-Ž&+])' - ur'[A-ZÀ-Ž-_0-9\s\"\'&+]+:(?![\"\'’ʼ❜‘‛”“‟„])\s*)(?![0-9])'), "", + ur'[A-ZÀ-Ž-_0-9\s\"\'&+]+:(?![\"\'’ʼ❜‘‛”“‟„])(?:\s+|$))(?![0-9])'), "", name="HI_before_colon_caps"), # any text before colon (at least 3 chars); at start or after a sentence, diff --git a/Contents/Libraries/Shared/test.srt b/Contents/Libraries/Shared/test.srt index e5c95606b..0c1f7eddb 100644 --- a/Contents/Libraries/Shared/test.srt +++ b/Contents/Libraries/Shared/test.srt @@ -6,6 +6,7 @@ H i. But not MATCH hindrance. Ja, det är väl det. Tack och lov att HD:s beslut var så solklart. But this should. Peter: Yello! +- IMF:s stordator. 2 00:00:10,759 --> 00:00:12,678 From 31ad78d28a2c190c9e023971fedc6586724c6741 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 3 Sep 2018 10:30:27 +0200 Subject: [PATCH 167/710] providers: supersubtitles: add base properties to subtitle --- .../Shared/subliminal_patch/providers/supersubtitles.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py index d813764da..9cd47ae4e 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py @@ -82,7 +82,7 @@ def id(self): return str(self.subtitle_id) def get_matches(self, video): - matches = set() + matches = guess_matches(video, guessit(self.release_info.encode("utf-8"))) # episode if isinstance(video, Episode): @@ -130,8 +130,6 @@ def get_matches(self, video): # format if video.format and self.version and video.format.lower() in self.version.lower(): matches.add('format') - # other properties - # matches |= guess_matches(video, guessit(self.release_info.encode("utf-8"))) self.matches = matches return matches From d17ced4c45ced078008941f814c55dbb3746c5d2 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 3 Sep 2018 10:45:30 +0200 Subject: [PATCH 168/710] providers: opensubtitles: log reason for ServiceUnavailable --- Contents/Code/support/config.py | 4 ++-- .../Shared/subliminal_patch/providers/opensubtitles.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 24d9f0abb..7ba582745 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -825,8 +825,8 @@ def provider_throttle(self, name, exception): throttle_until = datetime.datetime.now() + throttle_delta Dict["provider_throttle"][name] = (cls_name, throttle_until, throttle_description) - Log.Info("Throttling %s for %s, until %s, because of: %s", name, throttle_description, - throttle_until.strftime("%y/%m/%d %H:%M"), cls_name) + Log.Info("Throttling %s for %s, until %s, because of: %s. Exception info: %r", name, throttle_description, + throttle_until.strftime("%y/%m/%d %H:%M"), cls_name, exception.message) Dict.Save() @property diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index 88fd0d647..a1f8f7e4c 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -353,10 +353,10 @@ def checked(fn): if status_code == 429: raise TooManyRequests if status_code == 503: - raise ServiceUnavailable + raise ServiceUnavailable(str(status_code)) if status_code != 200: if response and "status" in response: raise OpenSubtitlesError(response['status']) - raise ServiceUnavailable("Unknown Error, empty response") + raise ServiceUnavailable("Unknown Error, empty response: %s: %r" % (status_code, response)) return response From 3ac8a5cd8679ad96c9f83cb2ba3831268304149b Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 3 Sep 2018 10:46:03 +0200 Subject: [PATCH 169/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index da0a96bcf..efd60c6ba 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.5.8.2694 + 2.5.8.2708 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.8.2694 DEV +Version 2.5.8.2708 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From c6937325fa2c7ed91eb4a7c03b33973665fee51f Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 3 Sep 2018 11:34:50 +0200 Subject: [PATCH 170/710] support :forced flag on Language --- Contents/Libraries/Shared/subzero/language.py | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index 6185f900f..0e9d587fa 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -22,8 +22,50 @@ def language_from_stream(l): raise LanguageError() +def wrap_forced(f): + def inner(*args): + args = list(args)[1:] + s = args.pop(0) + base, forced = s.split(":") + instance = f(base, *args) + instance.forced = forced == "forced" + return instance + + return inner + + class Language(Language_): + def __init__(self, language, country=None, script=None, unknown=None, forced=False): + super(Language, self).__init__(language, country=country, script=script, unknown=unknown) + self.forced = forced + + def __getstate__(self): + return self.alpha3, self.country, self.script, self.forced + + def __setstate__(self, state): + self.alpha3, self.country, self.script, self.forced = state + + def __eq__(self, other): + if isinstance(other, Language): + return super(Language, self).__eq__(other) and other.forced == self.forced + return super(Language, self).__eq__(other) + + def __str__(self): + return super(Language, self).__str__() + (":forced" if self.forced else "") + + def __getattr__(self, name): + ret = super(Language, self).__getattr(name) + if ret: + ret.forced = self.forced + return ret + + @classmethod + @wrap_forced + def fromcode(cls, code, converter): + return Language_.fromcode(code, converter) + @classmethod + @wrap_forced def fromietf(cls, ietf): ietf_lower = ietf.lower() if ietf_lower in repl_map: @@ -32,6 +74,7 @@ def fromietf(cls, ietf): return Language_.fromietf(ietf) @classmethod + @wrap_forced def fromalpha3b(cls, s): if s in repl_map: s = repl_map[s] From 6a20750bfdede155035593c10e8c0db269811f45 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 3 Sep 2018 12:11:33 +0200 Subject: [PATCH 171/710] Language: fix __getattr__, add .fromlanguage --- Contents/Libraries/Shared/subzero/language.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index 0e9d587fa..0650484aa 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -54,11 +54,20 @@ def __str__(self): return super(Language, self).__str__() + (":forced" if self.forced else "") def __getattr__(self, name): - ret = super(Language, self).__getattr(name) + ret = super(Language, self).__getattr__(name) if ret: ret.forced = self.forced return ret + @classmethod + def fromlanguage(cls, instance, **replkw): + state = instance.__getstate__() + attrs = ("country", "script", "forced") + language = state[0] + kwa = dict(zip(attrs, state[1:])) + kwa.update(replkw) + return cls(language, **kwa) + @classmethod @wrap_forced def fromcode(cls, code, converter): From 0bfcf967735a457eb90f29c19103275ddc07b404 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 3 Sep 2018 13:06:48 +0200 Subject: [PATCH 172/710] Language: fix wrapper --- Contents/Libraries/Shared/subzero/language.py | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index 0650484aa..25c9a709a 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -23,12 +23,21 @@ def language_from_stream(l): def wrap_forced(f): - def inner(*args): - args = list(args)[1:] + def inner(*args, **kwargs): + """ + classmethod wrapper + :param args: args[0] = cls + :param kwargs: + :return: + """ + args = list(args) + cls = args[0] + args = args[1:] s = args.pop(0) - base, forced = s.split(":") - instance = f(base, *args) - instance.forced = forced == "forced" + base, forced = s.split(":") if ":" in s else s, False + instance = f(cls, base, *args, **kwargs) + if isinstance(instance, Language): + instance.forced = forced == "forced" return instance return inner @@ -55,9 +64,9 @@ def __str__(self): def __getattr__(self, name): ret = super(Language, self).__getattr__(name) - if ret: + if ret and isinstance(ret, Language): ret.forced = self.forced - return ret + return ret @classmethod def fromlanguage(cls, instance, **replkw): From 28a67f4c745a0bb21d623708d6fd9bcd3b30bc94 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 3 Sep 2018 17:48:57 +0200 Subject: [PATCH 173/710] submod: common: remove line only consisting of colon; remove empty colon at start of line --- .../Libraries/Shared/subzero/modification/mods/common.py | 5 ++++- Contents/Libraries/Shared/test.srt | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 009da55f6..9c31ceca0 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -25,7 +25,10 @@ class CommonFixes(SubtitleTextModification): NReProcessor(re.compile(r'(?u)(\w|\b|\s|^)(-\s?-{1,2})'), ur"\1—", name="CM_multidash"), # line = _/-/\s - NReProcessor(re.compile(r'(?u)(^\W*[-_.]+\W*$)'), "", name="CM_non_word_only"), + NReProcessor(re.compile(r'(?u)(^\W*[-_.:]+\W*$)'), "", name="CM_non_word_only"), + + # line = : text + NReProcessor(re.compile(r'(?u)(^\W*:\s*(?=\w+))'), "", name="CM_empty_colon_start"), # multi space NReProcessor(re.compile(r'(?u)(\s{2,})'), " ", name="CM_multi_space"), diff --git a/Contents/Libraries/Shared/test.srt b/Contents/Libraries/Shared/test.srt index 0c1f7eddb..7edcc7d6b 100644 --- a/Contents/Libraries/Shared/test.srt +++ b/Contents/Libraries/Shared/test.srt @@ -23,6 +23,8 @@ of signal, drawing the Tardis off.... course. 00:00:16,099 --> 00:00:17,224 this is a"subtitle" test "with a"text before colons and "peter"following: Where are we?." Mah numbar is wrong: 1 91 7 +: +: Peter is funny! 5 00:00:17,225 --> 00:00:19,684 From 262b7e250c6018b782d64a4ad84a5068caccd7b4 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 6 Sep 2018 01:16:02 +0200 Subject: [PATCH 174/710] core: use correct storage path when storing subtitle info, when only VTT is used --- Contents/Libraries/Shared/subliminal_patch/core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index f926d7432..5832c810a 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -827,6 +827,7 @@ def save_subtitles(file_path, subtitles, single=False, directory=None, chmod=Non if content: with open(subtitle_path, 'w') as f: f.write(content) + subtitle.storage_path = subtitle_path else: logger.error(u"Something went wrong when getting modified subtitle for %s", subtitle) From d318946791632d57d891ad52078e8cc65dcde44f Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 6 Sep 2018 01:16:57 +0200 Subject: [PATCH 175/710] forced_also WIP --- Contents/Code/support/config.py | 8 ++++++++ Contents/DefaultPrefs.json | 7 ++++++- .../providers/opensubtitles.py | 20 ++++++++++++------- .../subliminal_patch/providers/podnapisi.py | 14 +++++++++---- 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 7ba582745..c21703089 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -126,6 +126,7 @@ class Config(object): colors = "" chmod = None forced_only = False + forced_also = False exotic_ext = False treat_und_as_first = False subtitle_sub_dir = None, None @@ -192,6 +193,7 @@ def initialize(self): self.subtitle_destination_folder = self.get_subtitle_destination_folder() self.subtitle_formats = self.get_subtitle_formats() self.forced_only = Prefs["subtitles.when"] == "Only foreign/forced" + self.forced_also = not self.forced_only and "foreign/forced" in Prefs["subtitles.when"] self.max_recent_items_per_library = int_or_default(Prefs["scheduler.max_recent_items_per_library"], 2000) self.sections = list(Plex["library"].sections()) self.missing_permissions = [] @@ -667,6 +669,10 @@ def get_lang_list(self, provider=None): continue l.update({real_lang}) + if self.forced_also: + for lang in list(l): + l.add(Language.fromlanguage(lang, forced=True)) + return l lang_list = property(get_lang_list) @@ -777,12 +783,14 @@ def get_provider_settings(self): 'password': Prefs['provider.opensubtitles.password'], 'use_tag_search': self.exact_filenames, 'only_foreign': self.forced_only, + 'also_foreign': self.forced_also, 'is_vip': cast_bool(Prefs['provider.opensubtitles.is_vip']), 'use_ssl': os_use_https, 'timeout': self.advanced.providers.opensubtitles.timeout or 15 }, 'podnapisi': { 'only_foreign': self.forced_only, + 'also_foreign': self.forced_also, }, 'subscene': { 'only_foreign': self.forced_only, diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index b1cc924d7..4b9b79a2e 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -184,11 +184,16 @@ "type": "enum", "values": [ "Always", + "Always, also download foreign/forced", "Only foreign/forced", "When main audio stream is not Subtitle Language (1)", + "When main audio stream is not Subtitle Language (1), also download foreign/forced", "When main audio stream is not any configured language", + "When main audio stream is not any configured language, also download foreign/forced", "When any audio stream is not Subtitle Language (1)", - "When any audio stream is not any configured language" + "When any audio stream is not Subtitle Language (1), also download foreign/forced", + "When any audio stream is not any configured language", + "When any audio stream is not any configured language, also download foreign/forced" ], "default": "Always" }, diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index a1f8f7e4c..522f30098 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -74,6 +74,7 @@ def get_matches(self, video, hearing_impaired=False): class OpenSubtitlesProvider(ProviderRetryMixin, _OpenSubtitlesProvider): only_foreign = False + also_foreign = False subtitle_class = OpenSubtitlesSubtitle hash_verifiable = True hearing_impaired_verifiable = True @@ -85,11 +86,10 @@ class OpenSubtitlesProvider(ProviderRetryMixin, _OpenSubtitlesProvider): default_url = "//api.opensubtitles.org/xml-rpc" vip_url = "//vip-api.opensubtitles.org/xml-rpc" - languages = {Language.fromopensubtitles(l) for l in language_converters['szopensubtitles'].codes}# | { - #Language.fromietf("sr-latn"), Language.fromietf("sr-cyrl")} + languages = {Language.fromopensubtitles(l) for l in language_converters['szopensubtitles'].codes} - def __init__(self, username=None, password=None, use_tag_search=False, only_foreign=False, skip_wrong_fps=True, - is_vip=False, use_ssl=True, timeout=15): + def __init__(self, username=None, password=None, use_tag_search=False, only_foreign=False, also_foreign=False, + skip_wrong_fps=True, is_vip=False, use_ssl=True, timeout=15): if any((username, password)) and not all((username, password)): raise ConfigurationError('Username and password must be specified') @@ -97,6 +97,7 @@ def __init__(self, username=None, password=None, use_tag_search=False, only_fore self.password = password or '' self.use_tag_search = use_tag_search self.only_foreign = only_foreign + self.also_foreign = also_foreign self.skip_wrong_fps = skip_wrong_fps self.token = None self.is_vip = is_vip @@ -223,10 +224,11 @@ def list_subtitles(self, video, languages): return self.query(languages, hash=video.hashes.get('opensubtitles'), size=video.size, imdb_id=video.imdb_id, query=query, season=season, episode=episode, tag=video.original_name, - use_tag_search=self.use_tag_search, only_foreign=self.only_foreign) + use_tag_search=self.use_tag_search, only_foreign=self.only_foreign, + also_foreign=self.also_foreign) def query(self, languages, hash=None, size=None, imdb_id=None, query=None, season=None, episode=None, tag=None, - use_tag_search=False, only_foreign=False): + use_tag_search=False, only_foreign=False, also_foreign=False): # fill the search criteria criteria = [] if hash and size: @@ -294,9 +296,13 @@ def query(self, languages, hash=None, size=None, imdb_id=None, query=None, seaso continue # foreign/forced not wanted - if not only_foreign and foreign_parts_only: + elif not only_foreign and not also_foreign and foreign_parts_only: continue + # foreign/forced *also* wanted + elif also_foreign and foreign_parts_only: + language = Language.fromlanguage(language, forced=True) + query_parameters = _subtitle_item.get("QueryParameters") subtitle = self.subtitle_class(language, hearing_impaired, page_link, subtitle_id, matched_by, diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py b/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py index 67e029b6d..e231eac71 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py @@ -92,11 +92,13 @@ class PodnapisiProvider(_PodnapisiProvider, ProviderSubtitleArchiveMixin): server_url = 'https://podnapisi.net/subtitles/' only_foreign = False + also_foreign = False subtitle_class = PodnapisiSubtitle hearing_impaired_verifiable = True - def __init__(self, only_foreign=False): + def __init__(self, only_foreign=False, also_foreign=False): self.only_foreign = only_foreign + self.also_foreign = also_foreign if only_foreign: logger.info("Only searching for foreign/forced subtitles") @@ -119,13 +121,14 @@ def list_subtitles(self, video, languages): for title in titles: subtitles = [s for l in languages for s in self.query(l, title, video, season=season, episode=episode, year=video.year, - only_foreign=self.only_foreign)] + only_foreign=self.only_foreign, also_foreign=self.also_foreign)] if subtitles: return subtitles return [] - def query(self, language, keyword, video, season=None, episode=None, year=None, only_foreign=False): + def query(self, language, keyword, video, season=None, episode=None, year=None, only_foreign=False, + also_foreign=False): search_language = str(language).lower() # sr-Cyrl specialcase @@ -177,9 +180,12 @@ def query(self, language, keyword, video, season=None, episode=None, year=None, if only_foreign and not foreign: continue - if not only_foreign and foreign: + elif not only_foreign and not also_foreign and foreign: continue + elif also_foreign and foreign: + language = Language.fromlanguage(language, forced=True) + page_link = subtitle_xml.find('url').text releases = [] if subtitle_xml.find('release').text: From ecbd374dc71873951b908a914d6dd6c5d2b8f94e Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 6 Sep 2018 01:16:02 +0200 Subject: [PATCH 176/710] core: use correct storage path when storing subtitle info, when only VTT is used --- Contents/Libraries/Shared/subliminal_patch/core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index af401d57a..dc2bab346 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -822,6 +822,7 @@ def save_subtitles(file_path, subtitles, single=False, directory=None, chmod=Non if content: with open(subtitle_path, 'w') as f: f.write(content) + subtitle.storage_path = subtitle_path else: logger.error(u"Something went wrong when getting modified subtitle for %s", subtitle) From 3c40f0ccf020d5ce4887963acf51ccb3072e9dd6 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 6 Sep 2018 03:50:42 +0200 Subject: [PATCH 177/710] adapt codebase to new forced subtitle/language handling --- Contents/Code/__init__.py | 3 +-- Contents/Code/interface/item_details.py | 4 +++- Contents/Code/interface/menu.py | 3 +-- Contents/Code/interface/menu_helpers.py | 4 ++-- Contents/Code/support/config.py | 8 +++++-- Contents/Code/support/helpers.py | 2 +- Contents/Code/support/missing_subtitles.py | 14 ++++++----- Contents/Code/support/plex_media.py | 13 ++++------ Contents/Code/support/scanning.py | 16 ++++++------- Contents/Code/support/storage.py | 16 ++++++------- Contents/DefaultPrefs.json | 10 ++++---- Contents/Info.plist | 6 ++--- .../Libraries/Shared/subliminal_patch/core.py | 24 +++++++++---------- .../providers/opensubtitles.py | 2 +- .../subliminal_patch/providers/podnapisi.py | 2 +- Contents/Libraries/Shared/subzero/language.py | 22 ++++++++++------- Contents/Libraries/Shared/subzero/video.py | 16 ++++--------- 17 files changed, 82 insertions(+), 83 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 29a6ac2cd..af2d6e4af 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -139,8 +139,7 @@ def agent_extract_embedded(video_part_map): embedded_subs = stored_subs.get_by_provider(plexapi_part.id, requested_language, "embedded") current = stored_subs.get_any(plexapi_part.id, requested_language) if not embedded_subs: - stream_data = get_embedded_subtitle_streams(plexapi_part, requested_language=requested_language, - get_forced=config.forced_only) + stream_data = get_embedded_subtitle_streams(plexapi_part, requested_language=requested_language) if stream_data: stream = stream_data[0]["stream"] diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index ee6fb8189..84eddf0d3 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -10,7 +10,7 @@ from refresh_item import RefreshItem from subzero.constants import PREFIX from support.config import config, TEXT_SUBTITLE_EXTS -from support.helpers import timestamp, df, get_language, display_language, get_language_from_stream +from support.helpers import timestamp, df, get_language, display_language, get_language_from_stream, is_stream_forced from support.items import get_item_kind_from_rating_key, get_item, get_current_sub, get_item_title, save_stored_sub from support.plex_media import get_plex_metadata, get_part, get_embedded_subtitle_streams from support.scanning import scan_videos @@ -181,11 +181,13 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra # subtitle stream if stream.stream_type == 3 and not stream.stream_key and stream.codec in TEXT_SUBTITLE_EXTS: lang = get_language_from_stream(stream.language_code) + is_forced = is_stream_forced(stream) if not lang and config.treat_und_as_first: lang = list(config.lang_list)[0] if lang: + lang = Language.rebuild(lang, forced=is_forced) embedded_langs.append(lang) embedded_count += 1 diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 0e0ff0092..c57f828a1 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -203,8 +203,7 @@ def season_extract_embedded(rating_key, requested_language, with_mods=False, for embedded_subs = stored_subs.get_by_provider(part.id, requested_language, "embedded") current = stored_subs.get_any(part.id, requested_language) if not embedded_subs or force: - stream_data = get_embedded_subtitle_streams(part, requested_language=requested_language, - get_forced=config.forced_only) + stream_data = get_embedded_subtitle_streams(part, requested_language=requested_language) if stream_data: stream = stream_data[0]["stream"] diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 192ec70c1..9814d4e61 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -173,7 +173,7 @@ def extract_embedded_sub(**kwargs): set_refresh_menu_state(_(u"Extracting subtitle %(stream_index)s of %(filename)s", stream_index=stream_index, filename=bn)) - Log.Info(u"Extracting stream %s (%s) of %s", stream_index, display_language(language), bn) + Log.Info(u"Extracting stream %s (%s) of %s", stream_index, str(language), bn) out_codec = stream.codec if stream.codec != "mov_text" else "srt" @@ -196,7 +196,7 @@ def extract_embedded_sub(**kwargs): # fixme: speedup video; only video.name is needed save_successful = save_subtitles(scanned_videos, {scanned_videos.keys()[0]: [subtitle]}, mode="m", - set_current=set_current, is_forced=is_forced) + set_current=set_current) set_refresh_menu_state(None) if save_successful and refresh: diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index c21703089..72f6dd0bf 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -189,7 +189,7 @@ def initialize(self): self.set_activity_modes() self.parse_rename_mode() - self.include = Prefs["subtitles.include_exclude_mode"] == "manual include" + self.include = Prefs["subtitles.include_exclude_mode"] == "enable SZ for all items by default, use ignore lists" self.subtitle_destination_folder = self.get_subtitle_destination_folder() self.subtitle_formats = self.get_subtitle_formats() self.forced_only = Prefs["subtitles.when"] == "Only foreign/forced" @@ -671,7 +671,11 @@ def get_lang_list(self, provider=None): if self.forced_also: for lang in list(l): - l.add(Language.fromlanguage(lang, forced=True)) + l.add(Language.rebuild(lang, forced=True)) + + elif self.forced_only: + for lang in l: + lang.forced = True return l diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 2da1cd2da..0eea641da 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -404,7 +404,7 @@ def get_language(lang_short): def display_language(l): - return _(str(l).lower()) + return _(str(l.basename).lower()) def is_stream_forced(stream): diff --git a/Contents/Code/support/missing_subtitles.py b/Contents/Code/support/missing_subtitles.py index e0d0f5874..7553af5d1 100755 --- a/Contents/Code/support/missing_subtitles.py +++ b/Contents/Code/support/missing_subtitles.py @@ -7,7 +7,7 @@ from babelfish import LanguageReverseError from support.config import config, TEXT_SUBTITLE_EXTS -from support.helpers import get_plex_item_display_title, cast_bool, get_language_from_stream +from support.helpers import get_plex_item_display_title, cast_bool, get_language_from_stream, is_stream_forced from support.items import get_item from support.lib import Plex from support.storage import get_subtitle_storage @@ -31,7 +31,7 @@ def item_discover_missing_subs(rating_key, kind="show", added_at=None, section_t subtitle_target_dir, tdir_is_absolute = config.subtitle_sub_dir missing = set() - languages_set = set([Language.fromietf(str(l)) for l in languages]) + languages_set = set([Language.rebuild(l) for l in languages]) for media in item.media: existing_subs = {"internal": [], "external": [], "own_external": [], "count": 0} for part in media.parts: @@ -79,6 +79,7 @@ def item_discover_missing_subs(rating_key, kind="show", added_at=None, section_t for stream in part.streams: if stream.stream_type == 3: + is_forced = is_stream_forced(stream) if stream.index: key = "internal" else: @@ -89,7 +90,7 @@ def item_discover_missing_subs(rating_key, kind="show", added_at=None, section_t # treat unknown language as lang1? if not stream.language_code and config.treat_und_as_first: - lang = Language.fromietf(str(list(config.lang_list)[0])) + lang = Language.rebuild(list(config.lang_list)[0]) # we can't parse empty language codes elif not stream.language_code or not stream.codec: @@ -101,7 +102,7 @@ def item_discover_missing_subs(rating_key, kind="show", added_at=None, section_t lang = get_language_from_stream(stream.language_code) if not lang: if config.treat_und_as_first: - lang = Language.fromietf(str(list(config.lang_list)[0])) + lang = Language.rebuild(list(config.lang_list)[0]) else: continue @@ -110,10 +111,11 @@ def item_discover_missing_subs(rating_key, kind="show", added_at=None, section_t if lang: # Log.Debug("Found babelfish language: %r", lang) + lang.forced = is_forced existing_subs[key].append(lang) existing_subs["count"] = existing_subs["count"] + 1 - missing_from_part = set([Language.fromietf(str(l)) for l in languages]) + missing_from_part = set([Language.rebuild(l) for l in languages]) if existing_subs["count"]: # fixme: this is actually somewhat broken with IETF, as Plex doesn't store the country portion @@ -123,7 +125,7 @@ def item_discover_missing_subs(rating_key, kind="show", added_at=None, section_t + (existing_subs["external"] if external else []) + existing_subs["own_external"]) - check_languages = set([Language.fromietf(str(l)) for l in languages]) + check_languages = set([Language.rebuild(l) for l in languages]) alpha3_map = {} if config.ietf_as_alpha3: for language in existing_flat: diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index 67e306f1f..178cf2b79 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -4,6 +4,7 @@ import helpers from items import get_item +from subzero.language import Language from lib import Plex from support.config import TEXT_SUBTITLE_EXTS, config @@ -171,27 +172,23 @@ def get_all_parts(plex_item): return parts -def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_unknown=True, get_forced=None): +def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_unknown=True): streams = [] has_unknown = False for stream in part.streams: # subtitle stream if stream.stream_type == 3 and not stream.stream_key and stream.codec in TEXT_SUBTITLE_EXTS: - language = helpers.get_language_from_stream(stream.language_code) + is_forced = helpers.is_stream_forced(stream) + language = Language.rebuild(helpers.get_language_from_stream(stream.language_code), forced=is_forced) is_unknown = False found_requested_language = requested_language and requested_language == language - is_forced = helpers.is_stream_forced(stream) - - if get_forced is not None: - if (get_forced and not is_forced) or (not get_forced and is_forced): - continue if not language and config.treat_und_as_first: # only consider first unknown subtitle stream if has_unknown and skip_duplicate_unknown: continue - language = list(config.lang_list)[0] + language = Language.rebuild(list(config.lang_list)[0], forced=is_forced) is_unknown = True has_unknown = True diff --git a/Contents/Code/support/scanning.py b/Contents/Code/support/scanning.py index 9a16bcce3..be6c15987 100644 --- a/Contents/Code/support/scanning.py +++ b/Contents/Code/support/scanning.py @@ -9,7 +9,7 @@ from support.config import config, TEXT_SUBTITLE_EXTS from subzero.video import parse_video, set_existing_languages -from subzero.language import language_from_stream +from subzero.language import language_from_stream, Language def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, providers=None, skip_hashing=False): @@ -56,7 +56,7 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr # treat unknown language as lang1? if not lang and config.treat_und_as_first: - lang = list(config.lang_list)[0] + lang = Language.rebuild(list(config.lang_list)[0]) audio_languages.append(lang) @@ -64,9 +64,7 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr elif stream.stream_type == 3 and embedded_subtitles: is_forced = helpers.is_stream_forced(stream) - if (config.forced_only and is_forced) or \ - (not config.forced_only and not is_forced): - + if ((config.forced_only or config.forced_also) and is_forced) or not is_forced: # embedded subtitle # fixme: tap into external subtitles here instead of scanning for ourselves later? if stream.codec and getattr(stream, "index", None): @@ -79,10 +77,12 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr # treat unknown language as lang1? if not lang and config.treat_und_as_first: - lang = list(config.lang_list)[0] + lang = Language.rebuild(list(config.lang_list)[0]) if lang: - known_embedded.append(lang.alpha3) + if is_forced: + lang.forced = True + known_embedded.append(lang) else: Log.Warn("Part %s missing of %s, not able to scan internal streams", plex_part.id, rating_key) @@ -105,7 +105,7 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr if not ignore_all: set_existing_languages(video, pms_video_info, external_subtitles=external_subtitles, embedded_subtitles=embedded_subtitles, known_embedded=known_embedded, - forced_only=config.forced_only, stored_subs=stored_subs, languages=config.lang_list, + stored_subs=stored_subs, languages=config.lang_list, only_one=config.only_one) # add video fps info diff --git a/Contents/Code/support/storage.py b/Contents/Code/support/storage.py index 0fc0ccc36..7c654f37a 100644 --- a/Contents/Code/support/storage.py +++ b/Contents/Code/support/storage.py @@ -113,8 +113,7 @@ def get_target_folder(file_path): return fld -def save_subtitles_to_file(subtitles, tags=None, forced_tag=None): - forced_tag = forced_tag or config.forced_only +def save_subtitles_to_file(subtitles, tags=None): for video, video_subtitles in subtitles.items(): if not video_subtitles: continue @@ -126,12 +125,12 @@ def save_subtitles_to_file(subtitles, tags=None, forced_tag=None): fld = get_target_folder(file_path) subliminal_save_subtitles(file_path, video_subtitles, directory=fld, single=cast_bool(Prefs['subtitles.only_one']), - chmod=config.chmod, forced_tag=forced_tag, path_decoder=force_unicode, + chmod=config.chmod, path_decoder=force_unicode, debug_mods=config.debug_mods, formats=config.subtitle_formats, tags=tags) return True -def save_subtitles_to_metadata(videos, subtitles, is_forced=False): +def save_subtitles_to_metadata(videos, subtitles): for video, video_subtitles in subtitles.items(): mediaPart = videos[video] for subtitle in video_subtitles: @@ -143,7 +142,7 @@ def save_subtitles_to_metadata(videos, subtitles, is_forced=False): mp = PMSMediaProxy(video.id).get_part(mediaPart.id) else: mp = mediaPart - pm = Proxy.Media(content, ext="srt", forced="1" if is_forced else None) + pm = Proxy.Media(content, ext="srt", forced="1" if subtitle.language.forced else None) lang = Locale.Language.Match(subtitle.language.alpha2) mp.subtitles[lang].validate_keys({}) mp.subtitles[lang]["subzero"] = pm @@ -151,7 +150,7 @@ def save_subtitles_to_metadata(videos, subtitles, is_forced=False): def save_subtitles(scanned_video_part_map, downloaded_subtitles, mode="a", bare_save=False, mods=None, - set_current=True, is_forced=False): + set_current=True): """ :param set_current: save the subtitle as the current one @@ -186,7 +185,7 @@ def save_subtitles(scanned_video_part_map, downloaded_subtitles, mode="a", bare_ if save_to_fs: try: Log.Debug("Using filesystem as subtitle storage") - save_subtitles_to_file(downloaded_subtitles, forced_tag=is_forced) + save_subtitles_to_file(downloaded_subtitles) except OSError: if cast_bool(Prefs["subtitles.save.metadata_fallback"]): meta_fallback = True @@ -201,8 +200,7 @@ def save_subtitles(scanned_video_part_map, downloaded_subtitles, mode="a", bare_ Log.Debug("Using metadata as subtitle storage, because filesystem storage failed") else: Log.Debug("Using metadata as subtitle storage") - save_successful = save_subtitles_to_metadata(scanned_video_part_map, downloaded_subtitles, - is_forced=is_forced) + save_successful = save_subtitles_to_metadata(scanned_video_part_map, downloaded_subtitles) if not bare_save and save_successful and config.notify_executable: notify_executable(config.notify_executable, scanned_video_part_map, downloaded_subtitles, storage) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 4b9b79a2e..188e22b24 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -735,17 +735,17 @@ }, { "id": "subtitles.include_exclude_mode", - "label": "Do you want to manually exclude or include items SZ should work with? (impacts the settings below and the plugin menu)", + "label": "Should SZ be enabled or disabled for by default? (impacts the settings below and the plugin menu)", "type": "enum", "values": [ - "manual exclude", - "manual include" + "enable SZ for all items by default, use ignore lists", + "disable SZ for all items by default, use include lists" ], - "default": "manual exclude" + "default": "enable SZ for all items by default, use ignore lists" }, { "id": "subtitles.include_exclude_paths", - "label": "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impact this)", + "label": "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)", "type": "text", "default": "" }, diff --git a/Contents/Info.plist b/Contents/Info.plist index efd60c6ba..fa5290ca9 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -9,11 +9,11 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleShortVersionString - 2.5.8 + 2.6.1 CFBundleSignature ???? CFBundleVersion - 2.5.8.2708 + 2.6.1.2715 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.8.2708 DEV +Version 2.6.1.2715 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 5832c810a..00617c856 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -550,7 +550,7 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski return video -def _search_external_subtitles(path, forced_tag=False, languages=None, only_one=False, scandir_generic=False): +def _search_external_subtitles(path, languages=None, only_one=False, scandir_generic=False): dirpath, filename = os.path.split(path) dirpath = dirpath or '.' fileroot, fileext = os.path.splitext(filename) @@ -579,11 +579,9 @@ def _search_external_subtitles(path, forced_tag=False, languages=None, only_one= if adv_tag in ['forced', 'normal', 'default', 'embedded', 'embedded-forced', 'custom']: p_root = split_tag[0] - # forced wanted but NIL + forced = False if adv_tag: forced = "forced" in adv_tag - if (forced_tag and not forced) or (not forced_tag and forced): - continue # extract the potential language code language_code = p_root[len(fileroot):].replace('_', '-')[1:] @@ -595,11 +593,13 @@ def _search_external_subtitles(path, forced_tag=False, languages=None, only_one= if language_code: try: language = Language.fromietf(language_code) + language.forced = forced except ValueError: logger.error('Cannot parse language code %r', language_code) + language = None if not language and only_one: - language = list(languages)[0] + language = Language.rebuild(list(languages)[0], forced=forced) subtitles[p] = language @@ -608,7 +608,7 @@ def _search_external_subtitles(path, forced_tag=False, languages=None, only_one= return subtitles -def search_external_subtitles(path, forced_tag=False, languages=None, only_one=False): +def search_external_subtitles(path, languages=None, only_one=False): """ wrap original search_external_subtitles function to search multiple paths for one given video # todo: cleanup and merge with _search_external_subtitles @@ -628,10 +628,10 @@ def search_external_subtitles(path, forced_tag=False, languages=None, only_one=F if os.path.isdir(os.path.dirname(abspath)): try: - subtitles.update(_search_external_subtitles(abspath, forced_tag=forced_tag, languages=languages, + subtitles.update(_search_external_subtitles(abspath, languages=languages, only_one=only_one)) except OSError: - subtitles.update(_search_external_subtitles(abspath, forced_tag=forced_tag, languages=languages, + subtitles.update(_search_external_subtitles(abspath, languages=languages, only_one=only_one, scandir_generic=True)) logger.debug("external subs: found %s", subtitles) return subtitles @@ -760,7 +760,7 @@ def get_subtitle_path(video_path, language=None, extension='.srt', forced_tag=Fa tags.append("forced") if language: - subtitle_root += '.' + str(language) + subtitle_root += '.' + str(language.basename) if tags: subtitle_root += ".%s" % "-".join(tags) @@ -768,7 +768,7 @@ def get_subtitle_path(video_path, language=None, extension='.srt', forced_tag=Fa return subtitle_root + extension -def save_subtitles(file_path, subtitles, single=False, directory=None, chmod=None, formats=("srt",), forced_tag=False, +def save_subtitles(file_path, subtitles, single=False, directory=None, chmod=None, formats=("srt",), tags=None, path_decoder=None, debug_mods=False): """Save subtitles on filesystem. @@ -805,8 +805,8 @@ def save_subtitles(file_path, subtitles, single=False, directory=None, chmod=Non continue # create subtitle path - subtitle_path = get_subtitle_path(file_path, None if single else subtitle.language, forced_tag=forced_tag, - tags=tags) + subtitle_path = get_subtitle_path(file_path, None if single else subtitle.language, + forced_tag=subtitle.language.forced, tags=tags) if directory is not None: subtitle_path = os.path.join(directory, os.path.split(subtitle_path)[1]) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index 522f30098..7a37524d9 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -301,7 +301,7 @@ def query(self, languages, hash=None, size=None, imdb_id=None, query=None, seaso # foreign/forced *also* wanted elif also_foreign and foreign_parts_only: - language = Language.fromlanguage(language, forced=True) + language = Language.rebuild(language, forced=True) query_parameters = _subtitle_item.get("QueryParameters") diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py b/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py index e231eac71..a8931ef75 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py @@ -184,7 +184,7 @@ def query(self, language, keyword, video, season=None, episode=None, year=None, continue elif also_foreign and foreign: - language = Language.fromlanguage(language, forced=True) + language = Language.rebuild(language, forced=True) page_link = subtitle_xml.find('url').text releases = [] diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index 25c9a709a..dc0f6b0a0 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -34,7 +34,7 @@ def inner(*args, **kwargs): cls = args[0] args = args[1:] s = args.pop(0) - base, forced = s.split(":") if ":" in s else s, False + base, forced = s.split(":") if ":" in s else (s, False) instance = f(cls, base, *args, **kwargs) if isinstance(instance, Language): instance.forced = forced == "forced" @@ -44,9 +44,11 @@ def inner(*args, **kwargs): class Language(Language_): + forced = False + def __init__(self, language, country=None, script=None, unknown=None, forced=False): - super(Language, self).__init__(language, country=country, script=script, unknown=unknown) self.forced = forced + super(Language, self).__init__(language, country=country, script=script, unknown=unknown) def __getstate__(self): return self.alpha3, self.country, self.script, self.forced @@ -62,14 +64,18 @@ def __eq__(self, other): def __str__(self): return super(Language, self).__str__() + (":forced" if self.forced else "") + @property + def basename(self): + return super(Language, self).__str__() + def __getattr__(self, name): ret = super(Language, self).__getattr__(name) - if ret and isinstance(ret, Language): + if isinstance(ret, Language): ret.forced = self.forced return ret @classmethod - def fromlanguage(cls, instance, **replkw): + def rebuild(cls, instance, **replkw): state = instance.__getstate__() attrs = ("country", "script", "forced") language = state[0] @@ -80,7 +86,7 @@ def fromlanguage(cls, instance, **replkw): @classmethod @wrap_forced def fromcode(cls, code, converter): - return Language_.fromcode(code, converter) + return Language(*Language_.fromcode(code, converter).__getstate__()) @classmethod @wrap_forced @@ -89,13 +95,13 @@ def fromietf(cls, ietf): if ietf_lower in repl_map: ietf = repl_map[ietf_lower] - return Language_.fromietf(ietf) + return Language(*Language_.fromietf(ietf).__getstate__()) @classmethod @wrap_forced def fromalpha3b(cls, s): if s in repl_map: s = repl_map[s] - return Language_.fromietf(s) + return Language(*Language_.fromietf(s).__getstate__()) - return Language_.fromalpha3b(s) + return Language(*Language_.fromalpha3b(s).__getstate__()) diff --git a/Contents/Libraries/Shared/subzero/video.py b/Contents/Libraries/Shared/subzero/video.py index fd5dc9fed..4f7f40bd9 100644 --- a/Contents/Libraries/Shared/subzero/video.py +++ b/Contents/Libraries/Shared/subzero/video.py @@ -17,11 +17,11 @@ def has_external_subtitle(part_id, stored_subs, language): def set_existing_languages(video, video_info, external_subtitles=False, embedded_subtitles=False, known_embedded=None, - forced_only=False, stored_subs=None, languages=None, only_one=False): + stored_subs=None, languages=None, only_one=False): logger.debug(u"Determining existing subtitles for %s", video.name) # scan for external subtitles - external_langs_found = set(search_external_subtitles(video.name, forced_tag=forced_only, languages=languages, + external_langs_found = set(search_external_subtitles(video.name, languages=languages, only_one=only_one).values()) # found external subtitles should be considered? @@ -40,18 +40,10 @@ def set_existing_languages(video, video_info, external_subtitles=False, embedded # add known embedded subtitles if embedded_subtitles and known_embedded: - embedded_subtitle_languages = set() # mp4 and stuff, check burned in for language in known_embedded: - try: - embedded_subtitle_languages.add(language_from_stream(language)) - - except LanguageError: - logger.error('Embedded subtitle track language %r is not a valid language', language) - embedded_subtitle_languages.add(Language('und')) - - logger.debug('Found embedded subtitle %r', embedded_subtitle_languages) - video.subtitle_languages.update(embedded_subtitle_languages) + logger.debug('Found embedded subtitle %r', language) + video.subtitle_languages.add(language) def parse_video(fn, hints, skip_hashing=False, dry_run=False, providers=None): From a97f5853ad1e6479f1291a20bbaee039d8e769a0 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 6 Sep 2018 05:42:54 +0200 Subject: [PATCH 178/710] providers: legendastv: match second title and imdb id --- .../subliminal_patch/providers/legendastv.py | 175 +++++++++++++++++- 1 file changed, 174 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py b/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py index b705e6e6c..cffde9064 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py @@ -1,10 +1,13 @@ # coding=utf-8 import logging import rarfile +import os from subliminal.exceptions import ConfigurationError from subliminal.providers.legendastv import LegendasTVSubtitle as _LegendasTVSubtitle, \ - LegendasTVProvider as _LegendasTVProvider, Episode, Movie, guess_matches, guessit, sanitize + LegendasTVProvider as _LegendasTVProvider, Episode, Movie, guess_matches, guessit, sanitize, region, type_map, \ + raise_for_status, json, SHOW_EXPIRATION_TIME, title_re, season_re, datetime, pytz, NO_VALUE, releases_key, \ + SUBTITLE_EXTENSIONS logger = logging.getLogger(__name__) @@ -78,6 +81,176 @@ def __init__(self, username=None, password=None): self.logged_in = False self.session = None + @staticmethod + def is_valid_title(title, title_id, sanitized_title, season, year, imdb_id): + """Check if is a valid title.""" + if title["imdb_id"] and title["imdb_id"] == imdb_id: + logger.debug(u'Matched title "%s" as IMDB ID %s', sanitized_title, title["imdb_id"]) + return True + + if title["title2"] and sanitize(title['title2']) == sanitized_title: + logger.debug(u'Matched title "%s" as "%s"', sanitized_title, title["title2"]) + return True + + return _LegendasTVProvider.is_valid_title(title, title_id, sanitized_title, season, year) + + @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME, should_cache_fn=lambda value: value) + def search_titles(self, title, season, title_year, imdb_id): + """Search for titles matching the `title`. + + For episodes, each season has it own title + :param str title: the title to search for. + :param int season: season of the title + :param int title_year: year of the title + :return: found titles. + :rtype: dict + """ + titles = {} + sanitized_titles = [sanitize(title)] + ignore_characters = {'\'', '.'} + if any(c in title for c in ignore_characters): + sanitized_titles.append(sanitize(title, ignore_characters=ignore_characters)) + + for sanitized_title in sanitized_titles: + # make the query + if season: + logger.info('Searching episode title %r for season %r', sanitized_title, season) + else: + logger.info('Searching movie title %r', sanitized_title) + + r = self.session.get(self.server_url + 'legenda/sugestao/{}'.format(sanitized_title), timeout=10) + raise_for_status(r) + results = json.loads(r.text) + + # loop over results + for result in results: + source = result['_source'] + + # extract id + title_id = int(source['id_filme']) + + # extract type + title = {'type': type_map[source['tipo']], 'title2': None, 'imdb_id': None} + + # extract title, year and country + name, year, country = title_re.match(source['dsc_nome']).groups() + title['title'] = name + + if "dsc_nome_br" in source: + name2, ommit1, ommit2 = title_re.match(source['dsc_nome_br']).groups() + title['title2'] = name2 + + # extract imdb_id + if source['id_imdb'] != '0': + if not source['id_imdb'].startswith('tt'): + title['imdb_id'] = 'tt' + source['id_imdb'].zfill(7) + else: + title['imdb_id'] = source['id_imdb'] + + # extract season + if title['type'] == 'episode': + if source['temporada'] and source['temporada'].isdigit(): + title['season'] = int(source['temporada']) + else: + match = season_re.search(source['dsc_nome_br']) + if match: + title['season'] = int(match.group('season')) + else: + logger.debug('No season detected for title %d (%s)', title_id, name) + + # extract year + if year: + title['year'] = int(year) + elif source['dsc_data_lancamento'] and source['dsc_data_lancamento'].isdigit(): + # year is based on season air date hence the adjustment + title['year'] = int(source['dsc_data_lancamento']) - title.get('season', 1) + 1 + + # add title only if is valid + # Check against title without ignored chars + if self.is_valid_title(title, title_id, sanitized_titles[0], season, title_year, imdb_id): + logger.debug(u'Found title: %s', title) + titles[title_id] = title + + logger.debug('Found %d titles', len(titles)) + + return titles + + def query(self, language, title, season=None, episode=None, year=None, imdb_id=None): + # search for titles + titles = self.search_titles(title, season, year, imdb_id) + + subtitles = [] + # iterate over titles + for title_id, t in titles.items(): + + logger.info('Getting archives for title %d and language %d', title_id, language.legendastv) + archives = self.get_archives(title_id, language.legendastv, t['type'], season, episode) + if not archives: + logger.info('No archives found for title %d and language %d', title_id, language.legendastv) + + # iterate over title's archives + for a in archives: + + # compute an expiration time based on the archive timestamp + expiration_time = (datetime.utcnow().replace(tzinfo=pytz.utc) - a.timestamp).total_seconds() + + # attempt to get the releases from the cache + cache_key = releases_key.format(archive_id=a.id, archive_name=a.name) + releases = region.get(cache_key, expiration_time=expiration_time) + + # the releases are not in cache or cache is expired + if releases == NO_VALUE: + logger.info('Releases not found in cache') + + # download archive + self.download_archive(a) + + # extract the releases + releases = [] + for name in a.content.namelist(): + # discard the legendastv file + if name.startswith('Legendas.tv'): + continue + + # discard hidden files + if os.path.split(name)[-1].startswith('.'): + continue + + # discard non-subtitle files + if not name.lower().endswith(SUBTITLE_EXTENSIONS): + continue + + releases.append(name) + + # cache the releases + region.set(cache_key, releases) + + # iterate over releases + for r in releases: + subtitle = self.subtitle_class(language, t['type'], t['title'], t.get('year'), t.get('imdb_id'), + t.get('season'), a, r) + logger.debug('Found subtitle %r', subtitle) + subtitles.append(subtitle) + + return subtitles + + def list_subtitles(self, video, languages): + season = episode = None + if isinstance(video, Episode): + titles = [video.series] + video.alternative_series + season = video.season + episode = video.episode + else: + titles = [video.title] + video.alternative_titles + + for title in titles: + subtitles = [s for l in languages for s in + self.query(l, title, season=season, episode=episode, year=video.year, imdb_id=video.imdb_id)] + if subtitles: + return subtitles + + return [] + def download_subtitle(self, subtitle): super(LegendasTVProvider, self).download_subtitle(subtitle) subtitle.archive.content = None From bb2ed5a1167bb71936e573ec824f6701d667682d Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 6 Sep 2018 05:42:54 +0200 Subject: [PATCH 179/710] providers: legendastv: match second title and imdb id --- .../subliminal_patch/providers/legendastv.py | 175 +++++++++++++++++- 1 file changed, 174 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py b/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py index b705e6e6c..cffde9064 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py @@ -1,10 +1,13 @@ # coding=utf-8 import logging import rarfile +import os from subliminal.exceptions import ConfigurationError from subliminal.providers.legendastv import LegendasTVSubtitle as _LegendasTVSubtitle, \ - LegendasTVProvider as _LegendasTVProvider, Episode, Movie, guess_matches, guessit, sanitize + LegendasTVProvider as _LegendasTVProvider, Episode, Movie, guess_matches, guessit, sanitize, region, type_map, \ + raise_for_status, json, SHOW_EXPIRATION_TIME, title_re, season_re, datetime, pytz, NO_VALUE, releases_key, \ + SUBTITLE_EXTENSIONS logger = logging.getLogger(__name__) @@ -78,6 +81,176 @@ def __init__(self, username=None, password=None): self.logged_in = False self.session = None + @staticmethod + def is_valid_title(title, title_id, sanitized_title, season, year, imdb_id): + """Check if is a valid title.""" + if title["imdb_id"] and title["imdb_id"] == imdb_id: + logger.debug(u'Matched title "%s" as IMDB ID %s', sanitized_title, title["imdb_id"]) + return True + + if title["title2"] and sanitize(title['title2']) == sanitized_title: + logger.debug(u'Matched title "%s" as "%s"', sanitized_title, title["title2"]) + return True + + return _LegendasTVProvider.is_valid_title(title, title_id, sanitized_title, season, year) + + @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME, should_cache_fn=lambda value: value) + def search_titles(self, title, season, title_year, imdb_id): + """Search for titles matching the `title`. + + For episodes, each season has it own title + :param str title: the title to search for. + :param int season: season of the title + :param int title_year: year of the title + :return: found titles. + :rtype: dict + """ + titles = {} + sanitized_titles = [sanitize(title)] + ignore_characters = {'\'', '.'} + if any(c in title for c in ignore_characters): + sanitized_titles.append(sanitize(title, ignore_characters=ignore_characters)) + + for sanitized_title in sanitized_titles: + # make the query + if season: + logger.info('Searching episode title %r for season %r', sanitized_title, season) + else: + logger.info('Searching movie title %r', sanitized_title) + + r = self.session.get(self.server_url + 'legenda/sugestao/{}'.format(sanitized_title), timeout=10) + raise_for_status(r) + results = json.loads(r.text) + + # loop over results + for result in results: + source = result['_source'] + + # extract id + title_id = int(source['id_filme']) + + # extract type + title = {'type': type_map[source['tipo']], 'title2': None, 'imdb_id': None} + + # extract title, year and country + name, year, country = title_re.match(source['dsc_nome']).groups() + title['title'] = name + + if "dsc_nome_br" in source: + name2, ommit1, ommit2 = title_re.match(source['dsc_nome_br']).groups() + title['title2'] = name2 + + # extract imdb_id + if source['id_imdb'] != '0': + if not source['id_imdb'].startswith('tt'): + title['imdb_id'] = 'tt' + source['id_imdb'].zfill(7) + else: + title['imdb_id'] = source['id_imdb'] + + # extract season + if title['type'] == 'episode': + if source['temporada'] and source['temporada'].isdigit(): + title['season'] = int(source['temporada']) + else: + match = season_re.search(source['dsc_nome_br']) + if match: + title['season'] = int(match.group('season')) + else: + logger.debug('No season detected for title %d (%s)', title_id, name) + + # extract year + if year: + title['year'] = int(year) + elif source['dsc_data_lancamento'] and source['dsc_data_lancamento'].isdigit(): + # year is based on season air date hence the adjustment + title['year'] = int(source['dsc_data_lancamento']) - title.get('season', 1) + 1 + + # add title only if is valid + # Check against title without ignored chars + if self.is_valid_title(title, title_id, sanitized_titles[0], season, title_year, imdb_id): + logger.debug(u'Found title: %s', title) + titles[title_id] = title + + logger.debug('Found %d titles', len(titles)) + + return titles + + def query(self, language, title, season=None, episode=None, year=None, imdb_id=None): + # search for titles + titles = self.search_titles(title, season, year, imdb_id) + + subtitles = [] + # iterate over titles + for title_id, t in titles.items(): + + logger.info('Getting archives for title %d and language %d', title_id, language.legendastv) + archives = self.get_archives(title_id, language.legendastv, t['type'], season, episode) + if not archives: + logger.info('No archives found for title %d and language %d', title_id, language.legendastv) + + # iterate over title's archives + for a in archives: + + # compute an expiration time based on the archive timestamp + expiration_time = (datetime.utcnow().replace(tzinfo=pytz.utc) - a.timestamp).total_seconds() + + # attempt to get the releases from the cache + cache_key = releases_key.format(archive_id=a.id, archive_name=a.name) + releases = region.get(cache_key, expiration_time=expiration_time) + + # the releases are not in cache or cache is expired + if releases == NO_VALUE: + logger.info('Releases not found in cache') + + # download archive + self.download_archive(a) + + # extract the releases + releases = [] + for name in a.content.namelist(): + # discard the legendastv file + if name.startswith('Legendas.tv'): + continue + + # discard hidden files + if os.path.split(name)[-1].startswith('.'): + continue + + # discard non-subtitle files + if not name.lower().endswith(SUBTITLE_EXTENSIONS): + continue + + releases.append(name) + + # cache the releases + region.set(cache_key, releases) + + # iterate over releases + for r in releases: + subtitle = self.subtitle_class(language, t['type'], t['title'], t.get('year'), t.get('imdb_id'), + t.get('season'), a, r) + logger.debug('Found subtitle %r', subtitle) + subtitles.append(subtitle) + + return subtitles + + def list_subtitles(self, video, languages): + season = episode = None + if isinstance(video, Episode): + titles = [video.series] + video.alternative_series + season = video.season + episode = video.episode + else: + titles = [video.title] + video.alternative_titles + + for title in titles: + subtitles = [s for l in languages for s in + self.query(l, title, season=season, episode=episode, year=video.year, imdb_id=video.imdb_id)] + if subtitles: + return subtitles + + return [] + def download_subtitle(self, subtitle): super(LegendasTVProvider, self).download_subtitle(subtitle) subtitle.archive.content = None From c94a13ef548632f860b9e6e85ef7c8245a8bea33 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 6 Sep 2018 06:19:49 +0200 Subject: [PATCH 180/710] providers: opensubtitles: respect rate limit (40 hits/10s) --- Contents/Code/support/config.py | 6 ++++-- Contents/Libraries/Shared/subliminal_patch/core.py | 6 +++--- Contents/Libraries/Shared/subliminal_patch/exceptions.py | 4 ++++ Contents/Libraries/Shared/subliminal_patch/http.py | 4 ++++ .../Shared/subliminal_patch/providers/opensubtitles.py | 4 +++- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 72f6dd0bf..926701f72 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -17,7 +17,7 @@ from subliminal_patch.core import is_windows_special_path from whichdb import whichdb -from subliminal_patch.exceptions import TooManyRequests +from subliminal_patch.exceptions import TooManyRequests, APIThrottled from subzero.language import Language from subliminal.cli import MutexLock from subzero.lib.io import FileIO, get_viable_encoding @@ -58,17 +58,19 @@ def int_or_default(s, default): return default -VALID_THROTTLE_EXCEPTIONS = (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable) +VALID_THROTTLE_EXCEPTIONS = (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable, APIThrottled) PROVIDER_THROTTLE_MAP = { "default": { TooManyRequests: (datetime.timedelta(hours=1), "1 hour"), DownloadLimitExceeded: (datetime.timedelta(hours=3), "3 hours"), ServiceUnavailable: (datetime.timedelta(minutes=20), "20 minutes"), + APIThrottled: (datetime.timedelta(minutes=10), "10 minutes"), }, "opensubtitles": { TooManyRequests: (datetime.timedelta(hours=3), "3 hours"), DownloadLimitExceeded: (datetime.timedelta(hours=6), "6 hours"), + APIThrottled: (datetime.timedelta(seconds=15), "15 seconds"), }, "addic7ed": { DownloadLimitExceeded: (datetime.timedelta(hours=3), "3 hours"), diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 00617c856..768139a1f 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -28,7 +28,7 @@ from subliminal.video import VIDEO_EXTENSIONS, Video, Episode, Movie from subliminal.core import guessit, ProviderPool, io, is_windows_special_path, \ ThreadPoolExecutor, check_video -from subliminal_patch.exceptions import TooManyRequests +from subliminal_patch.exceptions import TooManyRequests, APIThrottled from subzero.language import Language from scandir import scandir, scandir_generic as _scandir_generic @@ -186,7 +186,7 @@ def list_subtitles_provider(self, provider, video, languages): except (requests.Timeout, socket.timeout): logger.error('Provider %r timed out', provider) - except (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable), e: + except (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable, APIThrottled), e: self.throttle_callback(provider, e) return @@ -283,7 +283,7 @@ def download_subtitle(self, subtitle): logger.debug("RAR Traceback: %s", traceback.format_exc()) return False - except (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable), e: + except (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable, APIThrottled), e: self.throttle_callback(subtitle.provider_name, e) self.discarded_providers.add(subtitle.provider_name) return False diff --git a/Contents/Libraries/Shared/subliminal_patch/exceptions.py b/Contents/Libraries/Shared/subliminal_patch/exceptions.py index d75f49ab8..e336a10af 100644 --- a/Contents/Libraries/Shared/subliminal_patch/exceptions.py +++ b/Contents/Libraries/Shared/subliminal_patch/exceptions.py @@ -5,3 +5,7 @@ class TooManyRequests(ProviderError): """Exception raised by providers when too many requests are made.""" pass + + +class APIThrottled(ProviderError): + pass diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 4bb583f73..92b1db097 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -10,6 +10,7 @@ from xmlrpclib import SafeTransport, Transport from requests import Session, exceptions from retry.api import retry_call +from exceptions import APIThrottled from subzero.lib.io import get_viable_encoding @@ -109,6 +110,9 @@ def request(self, host, handler, request_body, verbose=0): else: resp.raise_for_status() + if 'x-ratelimit-remaining' in resp.headers and resp.headers['x-ratelimit-remaining'] <= 2: + raise APIThrottled() + self.verbose = verbose try: return self.parse_response(resp.raw) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index 7a37524d9..bfd82304d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -20,7 +20,7 @@ from subliminal_patch.score import framerate_equal from subzero.language import Language -from ..exceptions import TooManyRequests +from ..exceptions import TooManyRequests, APIThrottled logger = logging.getLogger(__name__) @@ -337,6 +337,8 @@ def checked(fn): try: try: response = fn() + except APIThrottled: + raise except requests.RequestException as e: status_code = e.response.status_code else: From 75478d5ff114f38b63b08e632475b41d5078cd58 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 6 Sep 2018 06:24:30 +0200 Subject: [PATCH 181/710] providers: opensubtitles: retry once after api limit approached --- .../Shared/subliminal_patch/providers/opensubtitles.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index bfd82304d..2454182d0 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -4,7 +4,7 @@ import os import traceback import zlib - +import time import requests from babelfish import language_converters @@ -325,7 +325,7 @@ def download_subtitle(self, subtitle): subtitle.content = fix_line_ending(zlib.decompress(base64.b64decode(response['data'][0]['data']), 47)) -def checked(fn): +def checked(fn, raise_api_limit=False): """Run :fn: and check the response status before returning it. :param fn: the function to make an XMLRPC call to OpenSubtitles. @@ -338,7 +338,12 @@ def checked(fn): try: response = fn() except APIThrottled: + if not raise_api_limit: + logger.info("API request limit hit, waiting and trying again once.") + time.sleep(12) + return checked(fn, raise_api_limit=True) raise + except requests.RequestException as e: status_code = e.response.status_code else: From 7edbdb23336ae9e85ef33e4fd5bb3d853af8e3ce Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 6 Sep 2018 06:26:36 +0200 Subject: [PATCH 182/710] providers: opensubtitles: retry once after api limit approached and 429 hit --- .../Shared/subliminal_patch/providers/opensubtitles.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index 2454182d0..c0acfb80c 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -364,7 +364,10 @@ def checked(fn, raise_api_limit=False): if status_code == 415: raise DisabledUserAgent if status_code == 429: - raise TooManyRequests + if not raise_api_limit: + raise TooManyRequests + else: + raise APIThrottled if status_code == 503: raise ServiceUnavailable(str(status_code)) if status_code != 200: From 760e346ab9126e9e43fe938461672678fc43b6fb Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 6 Sep 2018 17:15:25 +0200 Subject: [PATCH 183/710] fix debug log --- Contents/Code/support/scanning.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/support/scanning.py b/Contents/Code/support/scanning.py index be6c15987..1fe48ef55 100644 --- a/Contents/Code/support/scanning.py +++ b/Contents/Code/support/scanning.py @@ -52,7 +52,7 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr try: lang = language_from_stream(stream.language_code) except LanguageError: - Log.Debug("Couldn't detect embedded subtitle stream language: %s", stream.language_code) + Log.Debug("Couldn't detect embedded audio stream language: %s", stream.language_code) # treat unknown language as lang1? if not lang and config.treat_und_as_first: From 8a726e9c890978796ff8fcda827a7ea4ec2f3b6e Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 6 Sep 2018 17:15:48 +0200 Subject: [PATCH 184/710] providers: opensubtitles: log unparsable ratelimit --- Contents/Libraries/Shared/subliminal_patch/http.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 92b1db097..42965deea 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -110,8 +110,11 @@ def request(self, host, handler, request_body, verbose=0): else: resp.raise_for_status() - if 'x-ratelimit-remaining' in resp.headers and resp.headers['x-ratelimit-remaining'] <= 2: - raise APIThrottled() + try: + if 'x-ratelimit-remaining' in resp.headers and int(resp.headers['x-ratelimit-remaining']) <= 2: + raise APIThrottled() + except ValueError: + logger.info('Couldn\'t parse "x-ratelimit-remaining": %r' % resp.headers['x-ratelimit-remaining']) self.verbose = verbose try: From a2e45c3ef794e5d3f32d5f6e4a068f2e992b1a74 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 6 Sep 2018 17:16:05 +0200 Subject: [PATCH 185/710] language: correctly compare one language to another with forced flag --- Contents/Libraries/Shared/subzero/language.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index dc0f6b0a0..af486c4ed 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -1,7 +1,7 @@ # coding=utf-8 from babelfish.exceptions import LanguageError -from babelfish import Language as Language_ +from babelfish import Language as Language_, basestr repl_map = { @@ -57,9 +57,14 @@ def __setstate__(self, state): self.alpha3, self.country, self.script, self.forced = state def __eq__(self, other): - if isinstance(other, Language): - return super(Language, self).__eq__(other) and other.forced == self.forced - return super(Language, self).__eq__(other) + if isinstance(other, basestr): + return str(self) == other + if not isinstance(other, Language): + return False + return (self.alpha3 == other.alpha3 and + self.country == other.country and + self.script == other.script and + bool(self.forced) == bool(other.forced)) def __str__(self): return super(Language, self).__str__() + (":forced" if self.forced else "") From b895c845a84bd2b5d21a2dcfe44f72508c1bbe7e Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 6 Sep 2018 17:21:23 +0200 Subject: [PATCH 186/710] rename "Embedded subtitles: Treat \"Undefined\" (und) as language 1" to "Embedded streams: Treat \"Undefined\" (und) as language 1" --- Contents/DefaultPrefs.json | 2 +- Contents/Strings/de.json | 2 +- Contents/Strings/en.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 188e22b24..0be134a2a 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -217,7 +217,7 @@ }, { "id": "subtitles.language.treat_und_as_first", - "label": "Embedded subtitles: Treat \"Undefined\" (und) as language 1", + "label": "Embedded streams: Treat \"Undefined\" (und) as language 1", "type": "bool", "default": "true" }, diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 2ab39e6a3..dfceeef3f 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -164,7 +164,7 @@ "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Sprachen mit Landesattribut als ISO 639-1 anzeigen (z. B. pt-BR = pt)", "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Sprachen mit Landesattribut als ISO 639-1 behandeln (pt-BR nicht herunterladen, wenn ein pt Untertitel existiert)", "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Auf eine Sprache beschränken (fügt dem Dateinamen kein \".lang.\"-Suffix hinzu; benutzt nur \"Untertitel Sprache (1)\")", - "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Eingebettete Untertitel: behandle Unbekannte Sprache als Sprache 1", + "Embedded streams: Treat \"Undefined\" (und) as language 1": "Eingebettete Streams: behandle Unbekannte Sprache als Sprache 1", "I rename my files using": "Ich benenne meine Dateien um, mit:", "Retrieve original filename from .file_info/file_info index files (see wiki)": "Originale Dateinamen von .file_info/file_info Indexdateien beziehen (siehe Wiki)", "Sonarr URL (add URL base if configured)": "Sonarr URL (URL-Basis hinzufügen, wenn konfiguriert)", diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 373c4b025..9b9b858a4 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -231,7 +231,7 @@ "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)":"Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)":"Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)", "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")":"Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")", - "Embedded subtitles: Treat \"Undefined\" (und) as language 1":"Embedded subtitles: Treat \"Undefined\" (und) as language 1", + "Embedded streams: Treat \"Undefined\" (und) as language 1":"Embedded streams: Treat \"Undefined\" (und) as language 1", "I rename my files using":"I rename my files using", "Retrieve original filename from .file_info/file_info index files (see wiki)":"Retrieve original filename from .file_info/file_info index files (see wiki)", "Sonarr URL (add URL base if configured)":"Sonarr URL (add URL base if configured)", From 0db56529614501fab76476af95d1c1645bed68c9 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 7 Sep 2018 22:56:01 +0200 Subject: [PATCH 187/710] fix disabled channel mode --- Contents/Code/interface/func.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Contents/Code/interface/func.py b/Contents/Code/interface/func.py index 05ec08f93..d8e1e59bf 100644 --- a/Contents/Code/interface/func.py +++ b/Contents/Code/interface/func.py @@ -7,7 +7,7 @@ from support.helpers import timestamp -def enable_channel_wrapper(func): +def enable_channel_wrapper(func, enforce_route=False): """ returns the original wrapper :func: (route or handler) if applicable, else the plain to-be-wrapped function :param func: original wrapper @@ -20,12 +20,11 @@ def inner(*a, **k): :param k: kwargs :return: originally to-be-wrapped function """ - return a[0] + return a[0] if len(a) else a return inner def wrap(*args, **kwargs): - enforce_route = kwargs.pop("enforce_route", None) return (func if (config.enable_channel or enforce_route) else noop)(*args, **kwargs) return wrap @@ -176,10 +175,11 @@ def inner(*a, **kw): return ret_f(*ret_a, **ret_kw) # @route may be used multiple times + enforce_route = kwargs.pop("enforce_route", None) if not already_wrapped: inner.orig_f = f - return enable_channel_wrapper(route(*args, **kwargs))(inner) - return enable_channel_wrapper(route(*args, **kwargs))(f) + return enable_channel_wrapper(route(*args, **kwargs), enforce_route=enforce_route)(inner) + return enable_channel_wrapper(route(*args, **kwargs), enforce_route=enforce_route)(f) return wrap From 49086ea93c52c8352fbea9c4a87b9a2785674b02 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 8 Sep 2018 03:56:58 +0200 Subject: [PATCH 188/710] fix language usage for subscene, hosszupuska, supersubtitles --- .../Libraries/Shared/subliminal_patch/converters/subscene.py | 4 ++-- .../Shared/subliminal_patch/providers/hosszupuska.py | 3 ++- .../Shared/subliminal_patch/providers/supersubtitles.py | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/converters/subscene.py b/Contents/Libraries/Shared/subliminal_patch/converters/subscene.py index 5f4e4c118..3a8c8ead6 100644 --- a/Contents/Libraries/Shared/subliminal_patch/converters/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/converters/subscene.py @@ -1,8 +1,8 @@ # coding=utf-8 -from babelfish import Language, LanguageReverseConverter - +from babelfish import LanguageReverseConverter from subliminal.exceptions import ConfigurationError +from subzero.language import Language # alpha3 codes extracted from `https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes` diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py b/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py index febfad8c8..a6e19d490 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py @@ -7,7 +7,8 @@ import os import time -from babelfish import Language, language_converters +from babelfish import language_converters +from subzero.language import Language from requests import Session from subliminal_patch.providers import Provider diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py index 9cd47ae4e..97c841103 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py @@ -8,7 +8,8 @@ import os import time -from babelfish import Language, language_converters +from babelfish import language_converters +from subzero.language import Language from requests import Session from subliminal.subtitle import fix_line_ending From 00adb257e8e31a5ebf2c4c1e5e69a2dd9a8829ec Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 8 Sep 2018 04:24:29 +0200 Subject: [PATCH 189/710] extract embedded: add extracted embedded subtitles to history --- Contents/Code/interface/item_details.py | 2 +- Contents/Code/interface/menu.py | 7 ++++--- Contents/Code/interface/menu_helpers.py | 16 ++++++++++++++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index 84eddf0d3..dab6bd946 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -684,7 +684,7 @@ def TriggerExtractEmbeddedSubForItemMenu(**kwargs): part_id = kwargs.get("part_id") stream_index = kwargs.get("stream_index") - Thread.Create(extract_embedded_sub, **kwargs) + Thread.Create(extract_embedded_sub, extract_mode="m", **kwargs) header = _(u"Extracting of embedded subtitle %s of part %s:%s triggered", stream_index, rating_key, part_id) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index c57f828a1..f9badaa29 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -173,7 +173,7 @@ def SeasonExtractEmbedded(**kwargs): return MetadataMenu(randomize=timestamp(), title=item_title, **kwargs) -def multi_extract_embedded(stream_list, refresh=False, with_mods=False, single_thread=True): +def multi_extract_embedded(stream_list, refresh=False, with_mods=False, single_thread=True, extract_mode="a"): def execute(): for video_part_map, plexapi_part, stream_index, language, set_current in stream_list: plexapi_item = video_part_map.keys()[0].plexapi_metadata["item"] @@ -181,7 +181,7 @@ def execute(): extract_embedded_sub(rating_key=plexapi_item.rating_key, part_id=plexapi_part.id, plex_item=plexapi_item, part=plexapi_part, scanned_videos=video_part_map, stream_index=stream_index, set_current=set_current, - language=language, with_mods=with_mods, refresh=refresh) + language=language, with_mods=with_mods, refresh=refresh, extract_mode=extract_mode) if single_thread: with Thread.Lock(key="extract_embedded"): @@ -212,7 +212,8 @@ def season_extract_embedded(rating_key, requested_language, with_mods=False, for extract_embedded_sub(rating_key=item.rating_key, part_id=part.id, stream_index=str(stream.index), set_current=set_current, - refresh=refresh, language=requested_language, with_mods=with_mods) + refresh=refresh, language=requested_language, with_mods=with_mods, + extract_mode="m") finally: subtitle_storage.destroy() diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 9814d4e61..1bb07793b 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -10,7 +10,9 @@ from subzero.language import Language from support.i18n import is_localized_string, _ from support.items import get_kind, get_item_thumb, get_item, get_item_kind_from_item, refresh_item -from support.helpers import get_video_display_title, pad_title, display_language, quote_args, is_stream_forced +from support.helpers import get_video_display_title, pad_title, display_language, quote_args, is_stream_forced, \ + get_title_for_video_metadata +from support.history import get_history from support.ignore import exclude_list from support.lib import get_intent from support.config import config @@ -156,6 +158,7 @@ def extract_embedded_sub(**kwargs): item_type = get_item_kind_from_item(plex_item) part = kwargs.pop("part", get_part(plex_item, part_id)) scanned_videos = kwargs.pop("scanned_videos", None) + extract_mode = kwargs.pop("extract_mode", "a") any_successful = False @@ -195,13 +198,22 @@ def extract_embedded_sub(**kwargs): subtitle.set_encoding("utf-8") # fixme: speedup video; only video.name is needed - save_successful = save_subtitles(scanned_videos, {scanned_videos.keys()[0]: [subtitle]}, mode="m", + video = scanned_videos.keys()[0] + save_successful = save_subtitles(scanned_videos, {video: [subtitle]}, mode="m", set_current=set_current) set_refresh_menu_state(None) if save_successful and refresh: refresh_item(rating_key) + # add item to history + item_title = get_title_for_video_metadata(video.plexapi_metadata, + add_section_title=False) + history = get_history() + history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], + subtitle=subtitle, mode=extract_mode) + history.destroy() + any_successful = True return any_successful From 5c03988e3c745136662dbe1aa6a32236a75ca2fe Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 8 Sep 2018 04:28:24 +0200 Subject: [PATCH 190/710] submod: reverse_RTL: enable mod for arabic, farsi and persian besides hebrew --- Contents/DefaultPrefs.json | 2 +- Contents/Libraries/Shared/subzero/modification/mods/common.py | 4 ++-- Contents/Strings/de.json | 2 +- Contents/Strings/en.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 0be134a2a..d7211c180 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -526,7 +526,7 @@ }, { "id": "subtitles.reverse_rtl", - "label": "Reverse punctuation in RTL languages (heb)", + "label": "Reverse punctuation in RTL languages (heb, ara, fas, per)", "type": "bool", "default": "false" }, diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 9c31ceca0..dd0f517e6 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -133,10 +133,10 @@ class ReverseRTL(SubtitleModification): description = "Reverse punctuation in RTL languages" exclusive = True order = 50 - languages = [Language("heb")] + languages = [Language(l) for l in ('heb', 'ara', 'fas', 'per')] long_description = "Some playback devices don't properly handle right-to-left markers for punctuation. " \ - "Physically swap punctuation. Applicable to languages: hebrew" + "Physically swap punctuation. Applicable to languages: hebrew, arabic, farsi, persian" processors = [ # new? (?u)(^([\s.!?]*)(.+?)(\s*)(-?\s*)$); \5\4\3\2 diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index dfceeef3f..2d794615c 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -204,7 +204,7 @@ "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Textformatierungen von heruntergeladenen Untertiteln entfernen (fett, kursiv, unterstrichen, Farben, ...)", "Fix common issues in subtitles": "Häufige Probleme in Untertiteln beheben", "Fix common OCR errors in downloaded subtitles": "Häufige Texterkennungsfehler in Untertiteln beheben", - "Reverse punctuation in RTL languages (heb)": "Zeichensetzung in linksläufigen Schriften umkehren (heb)", + "Reverse punctuation in RTL languages (heb, ara, fas, per)": "Zeichensetzung in linksläufigen Schriften umkehren (heb, ara, fas, per)", "Change colors of subtitles to": "Farbe der Untertitel ändern zu", "Store subtitles next to media files (instead of metadata)": "Speichere Untertitel neben den Medien (anstatt im Metadatenspeicher)", "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Zu speichernde Untertitelformate (Nicht-SRT funktioniert nur, wenn die vorherige Option aktiv ist)", diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 9b9b858a4..70636e2d2 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -271,7 +271,7 @@ "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)":"Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)", "Fix common issues in subtitles":"Fix common issues in subtitles", "Fix common OCR errors in downloaded subtitles":"Fix common OCR errors in downloaded subtitles", - "Reverse punctuation in RTL languages (heb)":"Reverse punctuation in RTL languages (heb)", + "Reverse punctuation in RTL languages (heb, ara, fas, per)":"Reverse punctuation in RTL languages (heb, ara, fas, per)", "Change colors of subtitles to":"Change colors of subtitles to", "Store subtitles next to media files (instead of metadata)":"Store subtitles next to media files (instead of metadata)", "Subtitle formats to save (non-SRT only works if the previous option is enabled)":"Subtitle formats to save (non-SRT only works if the previous option is enabled)", From 793fa7409677ae6c284d220d6eb1388eb51895c4 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 8 Sep 2018 04:51:46 +0200 Subject: [PATCH 191/710] submod: reverse_RTL: fas is per --- Contents/DefaultPrefs.json | 2 +- Contents/Libraries/Shared/subzero/modification/mods/common.py | 2 +- Contents/Strings/de.json | 2 +- Contents/Strings/en.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index d7211c180..735c4eaab 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -526,7 +526,7 @@ }, { "id": "subtitles.reverse_rtl", - "label": "Reverse punctuation in RTL languages (heb, ara, fas, per)", + "label": "Reverse punctuation in RTL languages (heb, ara, fas)", "type": "bool", "default": "false" }, diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index dd0f517e6..f4ea34f38 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -133,7 +133,7 @@ class ReverseRTL(SubtitleModification): description = "Reverse punctuation in RTL languages" exclusive = True order = 50 - languages = [Language(l) for l in ('heb', 'ara', 'fas', 'per')] + languages = [Language(l) for l in ('heb', 'ara', 'fas')] long_description = "Some playback devices don't properly handle right-to-left markers for punctuation. " \ "Physically swap punctuation. Applicable to languages: hebrew, arabic, farsi, persian" diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 2d794615c..46a56ec2b 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -204,7 +204,7 @@ "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Textformatierungen von heruntergeladenen Untertiteln entfernen (fett, kursiv, unterstrichen, Farben, ...)", "Fix common issues in subtitles": "Häufige Probleme in Untertiteln beheben", "Fix common OCR errors in downloaded subtitles": "Häufige Texterkennungsfehler in Untertiteln beheben", - "Reverse punctuation in RTL languages (heb, ara, fas, per)": "Zeichensetzung in linksläufigen Schriften umkehren (heb, ara, fas, per)", + "Reverse punctuation in RTL languages (heb, ara, fas)": "Zeichensetzung in linksläufigen Schriften umkehren (heb, ara, fas)", "Change colors of subtitles to": "Farbe der Untertitel ändern zu", "Store subtitles next to media files (instead of metadata)": "Speichere Untertitel neben den Medien (anstatt im Metadatenspeicher)", "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Zu speichernde Untertitelformate (Nicht-SRT funktioniert nur, wenn die vorherige Option aktiv ist)", diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 70636e2d2..6620d4518 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -271,7 +271,7 @@ "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)":"Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)", "Fix common issues in subtitles":"Fix common issues in subtitles", "Fix common OCR errors in downloaded subtitles":"Fix common OCR errors in downloaded subtitles", - "Reverse punctuation in RTL languages (heb, ara, fas, per)":"Reverse punctuation in RTL languages (heb, ara, fas, per)", + "Reverse punctuation in RTL languages (heb, ara, fas)":"Reverse punctuation in RTL languages (heb, ara, fas)", "Change colors of subtitles to":"Change colors of subtitles to", "Store subtitles next to media files (instead of metadata)":"Store subtitles next to media files (instead of metadata)", "Subtitle formats to save (non-SRT only works if the previous option is enabled)":"Subtitle formats to save (non-SRT only works if the previous option is enabled)", From 67fe2eebd4544330cfae5c7150b9ef96b54c8d94 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 8 Sep 2018 04:52:01 +0200 Subject: [PATCH 192/710] i18n: add further debug information when translating fails --- Contents/Code/support/i18n.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Contents/Code/support/i18n.py b/Contents/Code/support/i18n.py index 92ac9eebd..f904d62f7 100644 --- a/Contents/Code/support/i18n.py +++ b/Contents/Code/support/i18n.py @@ -81,8 +81,11 @@ def local_string_with_optional_format(key, *args, **kwargs): # fixme: may not be the best idea as this evaluates the string early try: return unicode(SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale), args)) - except TypeError: + except (TypeError, ValueError): Log.Exception("Broken translation!") + Log.Debug("EN string: %s", plex_i18n_module.LocalString(core, key, "en")) + Log.Debug("%s string: %r", Locale.CurrentLocale, + unicode(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale))) return unicode(SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, "en"), args)) # check string instances for arguments From 8d872c8b5a56c7c33a71e64e60172e3a899224af Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 8 Sep 2018 04:52:57 +0200 Subject: [PATCH 193/710] i18n: fix spanish translation, fixes #543 --- Contents/Strings/es.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Strings/es.json b/Contents/Strings/es.json index b0574a1d1..69d91505d 100644 --- a/Contents/Strings/es.json +++ b/Contents/Strings/es.json @@ -314,8 +314,8 @@ "File %(file_part_index)s: ": "Archivo %(file_part_index)s:␣", "%(part_summary)sNo current subtitle in storage": "%(part_summary)sNo hay un subtítulo guardado", "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sSubtítulos actual: %(provider_name)s (añadido: %(date_added)s, %(mode)s), Idioma: %(language)s, Puntuación: %(score)i, Almacenamiento: %(storage_type)s", - "%(part_summary)sManage %(language)s subtitle": "%(part_summary)Gestiona subtítulos en %(language)s", - "%(part_summary)sList %(language)s subtitles": "%(part_summary)Muestra subtítulos en %(language)s", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)sGestiona subtítulos en %(language)s", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)sMuestra subtítulos en %(language)s", "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sSubtítulos integrados en (%(languages)s)", "Select active %(language)s subtitle": "Selecciona subtítulos activos en %(language)s subtitle", "%(count)d subtitles in storage": "%(count)d subtítulos almacenados", From c19627024259d908cd115eec7e155c4f09ebc296 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 8 Sep 2018 04:54:53 +0200 Subject: [PATCH 194/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index fa5290ca9..023728b84 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2715 + 2.6.1.2731 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2715 DEV +Version 2.6.1.2731 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From d0267918647cb7b680884ede95c9a3388d82b17f Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 13:38:30 +0200 Subject: [PATCH 195/710] providers: opensubtitles: catch common exceptions in logout.close as well --- .../Shared/subliminal_patch/providers/opensubtitles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index c0acfb80c..d48bb5b05 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -190,7 +190,7 @@ def terminate(self): logger.error("Logout failed: %s", traceback.format_exc()) try: - self.server.close() + checked(lambda: self.server.close()) except: logger.error("Logout failed (server close): %s", traceback.format_exc()) From 20304d5b5c2fbb6eaff4e9ab92e9dd356d83cd6a Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 13:40:23 +0200 Subject: [PATCH 196/710] core: embedded subtitle streams: don't try parsing the language if not given --- Contents/Code/support/plex_media.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index 178cf2b79..6f3036033 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -179,7 +179,10 @@ def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_ # subtitle stream if stream.stream_type == 3 and not stream.stream_key and stream.codec in TEXT_SUBTITLE_EXTS: is_forced = helpers.is_stream_forced(stream) - language = Language.rebuild(helpers.get_language_from_stream(stream.language_code), forced=is_forced) + language = helpers.get_language_from_stream(stream.language_code) + if language: + language = Language.rebuild(language, forced=is_forced) + is_unknown = False found_requested_language = requested_language and requested_language == language From 68a26f7bb6a0f33195df2044a424f8eaeb09c27b Mon Sep 17 00:00:00 2001 From: viking Date: Thu, 9 Aug 2018 20:51:11 +0200 Subject: [PATCH 197/710] providers: titlovi: fix language handling (thanks viking1304) --- .../subliminal_patch/converters/titlovi.py | 47 ++++++++++++------- .../subliminal_patch/providers/titlovi.py | 28 +++++++---- 2 files changed, 51 insertions(+), 24 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/converters/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/converters/titlovi.py index b6f010149..940507d4f 100644 --- a/Contents/Libraries/Shared/subliminal_patch/converters/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/converters/titlovi.py @@ -9,34 +9,49 @@ class TitloviConverter(LanguageReverseConverter): def __init__(self): - self.from_titlovi = {'ba': ('bos',), - 'en': ('eng',), - 'hr': ('hrv',), - 'mk': ('mkd',), - 'rs': ('srp', None, 'Latn'), - 'rsc': ('srp', None, 'Cyrl'), - 'si': ('slv',), + self.from_titlovi = {'Bosanski': ('bos',), + 'English': ('eng',), + 'Hrvatski': ('hrv',), + 'Makedonski': ('mkd',), + 'Srpski': ('srp',), + 'Cirilica': ('srp', None, 'Cyrl'), + 'Slovenski': ('slv',), } - self.to_titlovi = {('bos',): 'bosanski', - ('eng',): 'english', - ('hrv',): 'hrvatski', - ('mkd',): 'makedonski', - ('srp', None, 'Latn'): 'srpski', - ('srp', None, 'Cyrl'): 'cirilica', - ('slv',): 'slovenski' + self.to_titlovi = {('bos',): 'Bosanski', + ('eng',): 'English', + ('hrv',): 'Hrvatski', + ('mkd',): 'Makedonski', + ('srp',): 'Srpski', + ('srp', None, 'Cyrl'): 'Cirilica', + ('slv',): 'Slovenski' } self.codes = set(self.from_titlovi.keys()) + # temporary fix, should be removed as soon as API is used + self.lang_from_countrycode = {'ba': ('bos',), + 'en': ('eng',), + 'hr': ('hrv',), + 'mk': ('mkd',), + 'rs': ('srp',), + 'rsc': ('srp', None, 'Cyrl'), + 'si': ('slv',) + } + def convert(self, alpha3, country=None, script=None): if (alpha3, country, script) in self.to_titlovi: return self.to_titlovi[(alpha3, country, script)] if (alpha3,) in self.to_titlovi: return self.to_titlovi[(alpha3,)] - logger.error(ConfigurationError('Unsupported language for titlovi: %s, %s, %s' % (alpha3, country, script))) + raise ConfigurationError('Unsupported language code for titlovi: %s, %s, %s' % (alpha3, country, script)) def reverse(self, titlovi): if titlovi in self.from_titlovi: return self.from_titlovi[titlovi] - logger.error(ConfigurationError('Unsupported language code for titlovi: %s' % titlovi)) + # temporary fix, should be removed as soon as API is used + if titlovi in self.lang_from_countrycode: + return self.lang_from_countrycode[titlovi] + + raise ConfigurationError('Unsupported language number for titlovi: %s' % titlovi) + diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index 162330cb0..17b07ef35 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -4,6 +4,7 @@ import logging import math import re +import platform import rarfile @@ -126,13 +127,17 @@ def get_matches(self, video): class TitloviProvider(Provider, ProviderSubtitleArchiveMixin): subtitle_class = TitloviSubtitle - languages = {Language.fromtitlovi(l) for l in language_converters['titlovi'].codes} | {Language.fromietf('sr')} - server_url = 'http://titlovi.com' + languages = {Language.fromtitlovi(l) for l in language_converters['titlovi'].codes} | {Language.fromietf('sr-Latn')} + server_url = 'https://titlovi.com' search_url = server_url + '/titlovi/?' download_url = server_url + '/download/?type=1&mediaid=' def initialize(self): self.session = Session() + self.session.headers['User-Agent'] = 'Mozilla / Sub-Zero for Plex 2.5 / ' + platform.platform() + logger.info('User-Agent set to %s', self.session.headers['User-Agent']) + self.session.headers['Referer'] = self.server_url + logger.info('Referer set to %s', self.session.headers['Referer']) def terminate(self): self.session.close() @@ -141,9 +146,18 @@ def query(self, languages, title, season=None, episode=None, year=None, video=No items_per_page = 10 current_page = 1 + used_languages = languages + lang_strings = [str(lang) for lang in used_languages] + + # handle possible duplicate use of Serbian Latin + if "sr" in lang_strings and "sr-Latn" in lang_strings: + logger.info('Duplicate entries and found, filtering languages') + used_languages = filter(lambda l: l != Language.fromietf('sr-Latn'), used_languages) + logger.info('Filtered language list %r', used_languages) + # convert list of languages into search string - langs = '|'.join( - map(str, [l.titlovi if l != Language.fromietf('sr') else 'cirilica' for l in languages])) + langs = '|'.join(map(str, [l.titlovi for l in used_languages])) + # set query params params = {'prijevod': title, 'jezik': langs} is_episode = False @@ -207,10 +221,8 @@ def query(self, languages, title, season=None, episode=None, year=None, video=No match = lang_re.search(sub.select_one('.lang').attrs['src']) if match: try: - lang = Language.fromtitlovi(match.group('lang')) - script = match.group('script') - if script: - lang.script = Script(script) + # decode language + lang = Language.fromtitlovi(match.group('lang')+match.group('script')) except ValueError: continue From 7289e89ceb195e08d04513c6981beecb9708759b Mon Sep 17 00:00:00 2001 From: viking Date: Fri, 10 Aug 2018 03:26:04 +0200 Subject: [PATCH 198/710] Proper handling of archives with both cyrlic and latin subtitles packed together --- .../subliminal_patch/providers/titlovi.py | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index 17b07ef35..e24fc3289 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -23,6 +23,7 @@ from subliminal.utils import sanitize_release_group from subliminal.subtitle import guess_matches from subliminal.video import Episode, Movie +from subliminal.subtitle import fix_line_ending from subzero.language import Language # parsing regex definitions @@ -309,4 +310,34 @@ def download_subtitle(self, subtitle): else: raise ProviderError('Unidentified archive type') - subtitle.content = self.get_subtitle_from_archive(subtitle, archive) + subs_in_archive = archive.namelist() + + # if Serbian lat and cyr versions are packed together, try to find right version + if len(subs_in_archive) > 1 and (subtitle.language == 'sr' or subtitle.language == 'sr-Cyrl'): + self.get_subtitle_from_boundled_archive(subtitle, subs_in_archive, archive) + else: + # use dfault method for everything else + subtitle.content = self.get_subtitle_from_archive(subtitle, archive) + + def get_subtitle_from_boundled_archive(self, subtitle, subs_in_archive, archive): + sr_lat_subs = [] + sr_cyr_subs = [] + sub_to_extract = None + + for sub_name in subs_in_archive: + if 'lat' in sub_name and not 'cyr' in sub_name: + sr_lat_subs.append(sub_name) + + if 'cyr' in sub_name and not 'lat' in sub_name: + sr_cyr_subs.append(sub_name) + + if subtitle.language == 'sr': + if len(sr_lat_subs) > 0: + sub_to_extract = sr_lat_subs[0] + + if subtitle.language == 'sr-Cyrl': + if len(sr_cyr_subs) > 0: + sub_to_extract = sr_cyr_subs[0] + + logger.info(u'Using %s from the archive', sub_to_extract) + subtitle.content = fix_line_ending(archive.read(sub_to_extract)) From a0f54be69b29c60533cd1eec9711b073ed221390 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 13:44:38 +0200 Subject: [PATCH 199/710] providers: titlovi: cleanup --- .../Libraries/Shared/subliminal_patch/providers/titlovi.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index e24fc3289..0a97b0785 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -314,12 +314,12 @@ def download_subtitle(self, subtitle): # if Serbian lat and cyr versions are packed together, try to find right version if len(subs_in_archive) > 1 and (subtitle.language == 'sr' or subtitle.language == 'sr-Cyrl'): - self.get_subtitle_from_boundled_archive(subtitle, subs_in_archive, archive) + self.get_subtitle_from_bundled_archive(subtitle, subs_in_archive, archive) else: - # use dfault method for everything else + # use default method for everything else subtitle.content = self.get_subtitle_from_archive(subtitle, archive) - def get_subtitle_from_boundled_archive(self, subtitle, subs_in_archive, archive): + def get_subtitle_from_bundled_archive(self, subtitle, subs_in_archive, archive): sr_lat_subs = [] sr_cyr_subs = [] sub_to_extract = None From 50723e890d05180a4a6f1ad418f8d9b825cf873c Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 13:46:46 +0200 Subject: [PATCH 200/710] providers: titlovi: debug log user agent and referer (instead of info); update user agent --- .../Shared/subliminal_patch/providers/titlovi.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index 0a97b0785..be4be6c9b 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -4,7 +4,6 @@ import logging import math import re -import platform import rarfile @@ -135,10 +134,11 @@ class TitloviProvider(Provider, ProviderSubtitleArchiveMixin): def initialize(self): self.session = Session() - self.session.headers['User-Agent'] = 'Mozilla / Sub-Zero for Plex 2.5 / ' + platform.platform() - logger.info('User-Agent set to %s', self.session.headers['User-Agent']) + self.session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' \ + '(KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' + logger.debug('User-Agent set to %s', self.session.headers['User-Agent']) self.session.headers['Referer'] = self.server_url - logger.info('Referer set to %s', self.session.headers['Referer']) + logger.debug('Referer set to %s', self.session.headers['Referer']) def terminate(self): self.session.close() From 892e5116b4d89104cbce5fd96b410fe587ea5582 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 13:48:42 +0200 Subject: [PATCH 201/710] core: subtitle: fix log call, fixes #569 --- Contents/Libraries/Shared/subliminal_patch/subtitle.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 50a99c765..16c88c018 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -195,12 +195,12 @@ def guess_encoding(self): logger.info('Falling back to bs4 detection') a = UnicodeDammit(self.content) - Log.Debug("bs4 detected encoding: %s" % a.original_encoding) + logger.debug("bs4 detected encoding: %s", a.original_encoding) if a.original_encoding: self._guessed_encoding = a.original_encoding return a.original_encoding - raise ValueError(u"Couldn't guess the proper encoding for %s" % self) + raise ValueError(u"Couldn't guess the proper encoding for %s", self) self._guessed_encoding = encoding return encoding From 1c649f82bf4aa7cba0f5dd1180ddbdf9c732e2d4 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 13:50:36 +0200 Subject: [PATCH 202/710] core: subtitle: bs4 encoding detection: log info --- Contents/Libraries/Shared/subliminal_patch/subtitle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 16c88c018..cd845646d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -195,7 +195,7 @@ def guess_encoding(self): logger.info('Falling back to bs4 detection') a = UnicodeDammit(self.content) - logger.debug("bs4 detected encoding: %s", a.original_encoding) + logger.info("bs4 detected encoding: %s", a.original_encoding) if a.original_encoding: self._guessed_encoding = a.original_encoding From 308d9beac47422dda4f1aaa40bfae8209476d598 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 13:51:05 +0200 Subject: [PATCH 203/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 023728b84..741bc0677 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2731 + 2.6.1.2740 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2731 DEV +Version 2.6.1.2740 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From bab5202d5c4c05e86f3a3b9bf96b53445372520f Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 14:20:08 +0200 Subject: [PATCH 204/710] core: new subtitles_when/when_forced handling and prefs --- Contents/Code/interface/menu.py | 2 +- Contents/Code/support/config.py | 30 ++++++++++++++++++++++++------ Contents/Code/support/download.py | 2 +- Contents/Code/support/helpers.py | 25 ++++++++++++++++++++----- Contents/DefaultPrefs.json | 20 ++++++++++++++------ 5 files changed, 60 insertions(+), 19 deletions(-) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index f9badaa29..8a6cc936c 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -325,7 +325,7 @@ def ValidatePrefs(): "version", "app_support_path", "data_path", "data_items_path", "enable_agent", "enable_channel", "permissions_ok", "missing_permissions", "fs_encoding", "subtitle_destination_folder", "include", "include_exclude_paths", "include_exclude_sz_files", - "new_style_cache", "dbm_supported", "lang_list", "providers", + "new_style_cache", "dbm_supported", "lang_list", "providers", "normal_subs", "forced_only", "forced_also", "plex_transcoder", "refiner_settings", "unrar", "adv_cfg_path"]: value = getattr(config, attr) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 926701f72..d17674be2 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -101,6 +101,9 @@ class Config(object): advanced = None debug_i18n = False + normal_subs = False + forced_also = False + forced_only = False include = False enable_channel = True enable_agent = True @@ -127,8 +130,6 @@ class Config(object): reverse_rtl = False colors = "" chmod = None - forced_only = False - forced_also = False exotic_ext = False treat_und_as_first = False subtitle_sub_dir = None, None @@ -191,11 +192,12 @@ def initialize(self): self.set_activity_modes() self.parse_rename_mode() + self.normal_subs = Prefs["subtitles.when"] != "Never" + self.forced_also = self.normal_subs and Prefs["subtitles.when_forced"] != "Never" + self.forced_only = not self.normal_subs and Prefs["subtitles.when_forced"] != "Never" self.include = Prefs["subtitles.include_exclude_mode"] == "enable SZ for all items by default, use ignore lists" self.subtitle_destination_folder = self.get_subtitle_destination_folder() self.subtitle_formats = self.get_subtitle_formats() - self.forced_only = Prefs["subtitles.when"] == "Only foreign/forced" - self.forced_also = not self.forced_only and "foreign/forced" in Prefs["subtitles.when"] self.max_recent_items_per_library = int_or_default(Prefs["scheduler.max_recent_items_per_library"], 2000) self.sections = list(Plex["library"].sections()) self.missing_permissions = [] @@ -254,7 +256,8 @@ def migrate_prefs(self): def migrate_prefs_to_1(self, user_prefs, **kwargs): update_prefs = {} if "subtitles.only_foreign" in user_prefs and user_prefs["subtitles.only_foreign"] == "true": - update_prefs["subtitles.when"] = "1" + update_prefs["subtitles.when_forced"] = "1" + update_prefs["subtitles.when"] = "0" return update_prefs @@ -672,7 +675,22 @@ def get_lang_list(self, provider=None): l.update({real_lang}) if self.forced_also: - for lang in list(l): + langs_to_force = [] + if Prefs["subtitles.when_forced"] == "Always": + langs_to_force = list(l) + + else: + for (setting, index) in (("Only for Subtitle Language (1)", 0), + ("Only for Subtitle Language (2)", 1), + ("Only for Subtitle Language (3)", 2)): + if Prefs["subtitles.when_forced"] == setting: + try: + langs_to_force.append(list(l)[index]) + break + except: + pass + + for lang in langs_to_force: l.add(Language.rebuild(lang, forced=True)) elif self.forced_only: diff --git a/Contents/Code/support/download.py b/Contents/Code/support/download.py index bb8564029..5d2fbbb42 100644 --- a/Contents/Code/support/download.py +++ b/Contents/Code/support/download.py @@ -15,7 +15,7 @@ def get_missing_languages(video, part): - languages = set([Language.fromietf(str(l)) for l in config.lang_list]) + languages = set([Language.rebuild(l) for l in config.lang_list]) if audio_streams_match_languages(video, list(config.lang_list)): Log.Debug("Skipping subtitle search for %s, audio streams are in correct language(s)", diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 0eea641da..e1793615f 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -380,21 +380,36 @@ def get_language_from_stream(lang_code): def audio_streams_match_languages(video, languages): if video.audio_languages: - if Prefs["subtitles.when"] == "When main audio stream is not Subtitle Language (1)": + decision = [] + + if Prefs["subtitles.when"] == "Always": + decision.append(False) + + elif Prefs["subtitles.when"] == "When main audio stream is not Subtitle Language (1)": if video.audio_languages[0] == languages[0]: - return True + decision.append(True) elif Prefs["subtitles.when"] == "When any audio stream is not Subtitle Language (1)": if languages[0] in video.audio_languages: - return True + decision.append(True) elif Prefs["subtitles.when"] == "When main audio stream is not any configured language": if video.audio_languages[0] in languages: - return True + decision.append(True) elif Prefs["subtitles.when"] == "When any audio stream is not any configured language": if set(video.audio_languages).intersection(set(languages)): - return True + decision.append(True) + + if Prefs["subtitles.when_forced"] in [ + "Always", + "Only for Subtitle Language (1)", + "Only for Subtitle Language (2)", + "Only for Subtitle Language (3)" + ]: + decision.append(False) + + return all(decision) return False diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 735c4eaab..29787e816 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -183,20 +183,28 @@ "label": "Download subtitles", "type": "enum", "values": [ + "Never", "Always", - "Always, also download foreign/forced", - "Only foreign/forced", "When main audio stream is not Subtitle Language (1)", - "When main audio stream is not Subtitle Language (1), also download foreign/forced", "When main audio stream is not any configured language", - "When main audio stream is not any configured language, also download foreign/forced", "When any audio stream is not Subtitle Language (1)", - "When any audio stream is not Subtitle Language (1), also download foreign/forced", "When any audio stream is not any configured language", - "When any audio stream is not any configured language, also download foreign/forced" ], "default": "Always" }, + { + "id": "subtitles.when_forced", + "label": "Download foreign/forced subtitles", + "type": "enum", + "values": [ + "Never", + "Always", + "Only for Subtitle Language (1)", + "Only for Subtitle Language (2)", + "Only for Subtitle Language (3)" + ], + "default": "Never" + }, { "id": "subtitles.language.ietf_display", "label": "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", From 31a3d05e0cdd2b111f0665331cef8a253bbdc7d4 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 14:20:53 +0200 Subject: [PATCH 205/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 741bc0677..3044057dc 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2740 + 2.6.1.2742 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2740 DEV +Version 2.6.1.2742 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 379745f822e26de527f5d65ec3704b6012949038 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 14:21:44 +0200 Subject: [PATCH 206/710] fix prefs, bump dev --- Contents/DefaultPrefs.json | 2 +- Contents/Info.plist | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 29787e816..5d341f423 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -188,7 +188,7 @@ "When main audio stream is not Subtitle Language (1)", "When main audio stream is not any configured language", "When any audio stream is not Subtitle Language (1)", - "When any audio stream is not any configured language", + "When any audio stream is not any configured language" ], "default": "Always" }, diff --git a/Contents/Info.plist b/Contents/Info.plist index 3044057dc..9893bff7e 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2742 + 2.6.1.2743 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2742 DEV +Version 2.6.1.2743 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 962131c61060bc5cfa11ed876b6f1e5a5d3084de Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 14:38:50 +0200 Subject: [PATCH 207/710] core: language: only replace kwarg if value is not None --- Contents/Libraries/Shared/subzero/language.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index af486c4ed..2fa694428 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -85,7 +85,7 @@ def rebuild(cls, instance, **replkw): attrs = ("country", "script", "forced") language = state[0] kwa = dict(zip(attrs, state[1:])) - kwa.update(replkw) + kwa.update(dict((key, value) for key, value in replkw.iteritems() if value is not None)) return cls(language, **kwa) @classmethod From de5d569197dd90918c6fa1252d5fb7ca9c9e9dc7 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 14:39:09 +0200 Subject: [PATCH 208/710] core: download subtitles: only use actually missing languages --- Contents/Code/support/download.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Contents/Code/support/download.py b/Contents/Code/support/download.py index 5d2fbbb42..9e2855b56 100644 --- a/Contents/Code/support/download.py +++ b/Contents/Code/support/download.py @@ -91,6 +91,7 @@ def language_hook(provider): def download_best_subtitles(video_part_map, min_score=0, throttle_time=None, providers=None): hearing_impaired = Prefs['subtitles.search.hearingImpaired'] languages = set([Language.fromietf(str(l)) for l in config.lang_list]) + missing_languages = [] if not languages: return @@ -109,11 +110,11 @@ def download_best_subtitles(video_part_map, min_score=0, throttle_time=None, pro # prepare blacklist blacklist = get_blacklist_from_part_map(video_part_map, languages) - if use_videos: + if use_videos and missing_languages: Log.Debug("Download best subtitles using settings: min_score: %s, hearing_impaired: %s, languages: %s" % - (min_score, hearing_impaired, languages)) + (min_score, hearing_impaired, missing_languages)) - return subliminal.download_best_subtitles(set(use_videos), languages, min_score, hearing_impaired, + return subliminal.download_best_subtitles(set(use_videos), missing_languages, min_score, hearing_impaired, providers=providers or config.providers, provider_configs=config.provider_settings, pool_class=config.provider_pool, From fb2273e47cdc9a5b8690baf5a170fc032c32eb1c Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 15:12:06 +0200 Subject: [PATCH 209/710] core: download best subtitles: only use actually languages searched for --- Contents/Libraries/Shared/subliminal_patch/core.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 768139a1f..5bdf67267 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -347,6 +347,10 @@ def download_best_subtitles(self, subtitles, video, languages, min_score=0, hear for s in subtitles: # get the matches + if s.language not in languages: + logger.debug("%r: Skipping, language not searched for", s) + continue + try: matches = s.get_matches(video) except AttributeError: From 5fc9126bd564e47f8599c9dc85298fda9e035389 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 15:12:29 +0200 Subject: [PATCH 210/710] providers: opensubtitles, podnapisi, subscene: fix foreign/forced handling --- Contents/Code/support/download.py | 4 ++-- .../Shared/subliminal_patch/providers/opensubtitles.py | 6 +----- .../Shared/subliminal_patch/providers/podnapisi.py | 1 + .../Libraries/Shared/subliminal_patch/providers/subscene.py | 5 +++++ 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Contents/Code/support/download.py b/Contents/Code/support/download.py index 9e2855b56..c61c2c2a3 100644 --- a/Contents/Code/support/download.py +++ b/Contents/Code/support/download.py @@ -45,7 +45,7 @@ def get_missing_languages(video, part): alpha3_map[language.alpha3] = language.country language.country = None - missing_languages = (set(str(l) for l in languages) - set(str(l) for l in have_languages)) + missing_languages = (languages - have_languages) # all languages are found if we either really have subs for all languages or we only want to have exactly one language # and we've only found one (the case for a selected language, Prefs['subtitles.only_one'] (one found sub matches any language)) @@ -90,7 +90,7 @@ def language_hook(provider): def download_best_subtitles(video_part_map, min_score=0, throttle_time=None, providers=None): hearing_impaired = Prefs['subtitles.search.hearingImpaired'] - languages = set([Language.fromietf(str(l)) for l in config.lang_list]) + languages = set([Language.rebuild(l) for l in config.lang_list]) missing_languages = [] if not languages: return diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index d48bb5b05..23e82c833 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -87,6 +87,7 @@ class OpenSubtitlesProvider(ProviderRetryMixin, _OpenSubtitlesProvider): vip_url = "//vip-api.opensubtitles.org/xml-rpc" languages = {Language.fromopensubtitles(l) for l in language_converters['szopensubtitles'].codes} + languages.update(set(Language.rebuild(l, forced=True) for l in languages)) def __init__(self, username=None, password=None, use_tag_search=False, only_foreign=False, also_foreign=False, skip_wrong_fps=True, is_vip=False, use_ssl=True, timeout=15): @@ -189,11 +190,6 @@ def terminate(self): except: logger.error("Logout failed: %s", traceback.format_exc()) - try: - checked(lambda: self.server.close()) - except: - logger.error("Logout failed (server close): %s", traceback.format_exc()) - self.server = None self.token = None diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py b/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py index a8931ef75..128973ea7 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py @@ -89,6 +89,7 @@ def get_matches(self, video): class PodnapisiProvider(_PodnapisiProvider, ProviderSubtitleArchiveMixin): languages = ({Language('por', 'BR'), Language('srp', script='Latn'), Language('srp', script='Cyrl')} | {Language.fromalpha2(l) for l in language_converters['alpha2'].codes}) + languages.update(set(Language.rebuild(l, forced=True) for l in languages)) server_url = 'https://podnapisi.net/subtitles/' only_foreign = False diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index d49177ef0..786e5467a 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -105,6 +105,8 @@ class SubsceneProvider(Provider, ProviderSubtitleArchiveMixin): """ subtitle_class = SubsceneSubtitle languages = supported_languages + languages.update(set(Language.rebuild(l, forced=True) for l in languages)) + session = None skip_wrong_fps = False hearing_impaired_verifiable = True @@ -180,6 +182,9 @@ def parse_results(self, video, film): if isinstance(video, Episode): subtitle.asked_for_episode = video.episode + if self.only_foreign: + subtitle.language = Language.rebuild(subtitle.language, forced=True) + subtitles.append(subtitle) logger.debug('Found subtitle %r', subtitle) From b7d2971b46089e417badb056807e7611b8476b60 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 15:13:03 +0200 Subject: [PATCH 211/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 9893bff7e..3a2d7f91e 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2743 + 2.6.1.2748 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2743 DEV +Version 2.6.1.2748 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 8be8a742393a8bb5bae42152ab0defe3d928e39b Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 15:57:08 +0200 Subject: [PATCH 212/710] submod: OCR/HI: skip certain processors for all-caps subs --- .../Libraries/Shared/subzero/modification/main.py | 14 ++++++++++++++ .../Shared/subzero/modification/mods/__init__.py | 4 ++++ .../subzero/modification/mods/hearing_impaired.py | 5 +++-- .../Shared/subzero/modification/mods/ocr_fixes.py | 2 +- .../subzero/modification/processors/__init__.py | 4 +++- .../modification/processors/re_processor.py | 8 ++++---- .../modification/processors/string_processor.py | 8 ++++---- 7 files changed, 33 insertions(+), 12 deletions(-) diff --git a/Contents/Libraries/Shared/subzero/modification/main.py b/Contents/Libraries/Shared/subzero/modification/main.py index ec471817d..182d304b7 100644 --- a/Contents/Libraries/Shared/subzero/modification/main.py +++ b/Contents/Libraries/Shared/subzero/modification/main.py @@ -16,6 +16,7 @@ class SubtitleModifications(object): debug = False language = None initialized_mods = {} + only_uppercase = False f = None font_style_tag_start = u"{\\" @@ -115,9 +116,22 @@ def prepare_mods(self, *mods): return line_mods, non_line_mods + def detect_uppercase(self): + orig = [] + for entry in self.f[:20]: + orig.append(entry.text.strip()) + + orig = "".join(orig) + if not orig: + return False + + return orig.isupper() + def modify(self, *mods): new_entries = [] start = time.time() + self.only_uppercase = self.detect_uppercase() + line_mods, non_line_mods = self.prepare_mods(*mods) # apply non-last file mods diff --git a/Contents/Libraries/Shared/subzero/modification/mods/__init__.py b/Contents/Libraries/Shared/subzero/modification/mods/__init__.py index ecaa76b02..49201069e 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/__init__.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/__init__.py @@ -38,6 +38,10 @@ def _process(self, content, processors, debug=False, parent=None, index=None, ** new_content = content for processor in _processors: + if not processor.supported(parent): + logger.debug("Processor not supported, skipping: %s", processor.name) + continue + old_content = new_content new_content = processor.process(new_content, debug=debug, **kwargs) if not new_content: diff --git a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py index 6e5390093..918b87b18 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py @@ -68,14 +68,15 @@ class HearingImpaired(SubtitleTextModification): # name="HI_brackets_special"), # all caps line (at least 4 consecutive uppercase chars) - NReProcessor(re.compile(ur'(?u)(^(?=.*[A-ZÀ-Ž&+]{4,})[A-ZÀ-Ž-_\s&+]+$)'), "", name="HI_all_caps"), + NReProcessor(re.compile(ur'(?u)(^(?=.*[A-ZÀ-Ž&+]{4,})[A-ZÀ-Ž-_\s&+]+$)'), "", name="HI_all_caps", + supported=lambda p: not p.only_uppercase), # dash in front # NReProcessor(re.compile(r'(?u)^\s*-\s*'), "", name="HI_starting_dash"), # all caps at start before new sentence NReProcessor(re.compile(ur'(?u)^(?=[A-ZÀ-Ž]{4,})[A-ZÀ-Ž-_\s]+\s([A-ZÀ-Ž][a-zà-ž].+)'), r"\1", - name="HI_starting_upper_then_sentence"), + name="HI_starting_upper_then_sentence", supported=lambda p: not p.only_uppercase), # remove music symbols NReProcessor(re.compile(ur'(?u)(^%(t)s[*#¶♫♪\s]*%(t)s[*#¶♫♪\s]+%(t)s[*#¶♫♪\s]*%(t)s$)' % {"t": TAG}), diff --git a/Contents/Libraries/Shared/subzero/modification/mods/ocr_fixes.py b/Contents/Libraries/Shared/subzero/modification/mods/ocr_fixes.py index f5876ade6..ec57ca006 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/ocr_fixes.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/ocr_fixes.py @@ -40,7 +40,7 @@ def get_processors(self): # don't modify stuff inside quotes NReProcessor(re.compile(ur'(?u)(^[^"\'’ʼ❜‘‛”“‟„]*(?<=[A-ZÀ-Ž]{3})[A-ZÀ-Ž-_\s0-9]+)' ur'(["\'’ʼ❜‘‛”“‟„]*[.,‚،⹁、;]+)(\s*)(?!["\'’ʼ❜‘‛”“‟„])'), - r"\1:\3", name="OCR_fix_HI_colons"), + r"\1:\3", name="OCR_fix_HI_colons", supported=lambda p: not p.only_uppercase), # fix F'bla NReProcessor(re.compile(ur'(?u)(\bF)(\')([A-zÀ-ž]*\b)'), r"\1\3", name="OCR_fix_F"), WholeLineProcessor(self.data_dict["WholeLines"], name="OCR_replace_line"), diff --git a/Contents/Libraries/Shared/subzero/modification/processors/__init__.py b/Contents/Libraries/Shared/subzero/modification/processors/__init__.py index 17200d6e1..f5cf48694 100644 --- a/Contents/Libraries/Shared/subzero/modification/processors/__init__.py +++ b/Contents/Libraries/Shared/subzero/modification/processors/__init__.py @@ -7,10 +7,12 @@ class Processor(object): """ name = None parent = None + supported = None - def __init__(self, name=None, parent=None): + def __init__(self, name=None, parent=None, supported=None): self.name = name self.parent = parent + self.supported = supported if supported else lambda parent: True @property def info(self): diff --git a/Contents/Libraries/Shared/subzero/modification/processors/re_processor.py b/Contents/Libraries/Shared/subzero/modification/processors/re_processor.py index 84c982989..5ff76331e 100644 --- a/Contents/Libraries/Shared/subzero/modification/processors/re_processor.py +++ b/Contents/Libraries/Shared/subzero/modification/processors/re_processor.py @@ -14,8 +14,8 @@ class ReProcessor(Processor): pattern = None replace_with = None - def __init__(self, pattern, replace_with, name=None): - super(ReProcessor, self).__init__(name=name) + def __init__(self, pattern, replace_with, name=None, supported=None): + super(ReProcessor, self).__init__(name=name, supported=supported) self.pattern = pattern self.replace_with = replace_with @@ -36,8 +36,8 @@ class MultipleWordReProcessor(ReProcessor): } replaces found key in pattern with the corresponding value in data """ - def __init__(self, snr_dict, name=None, parent=None): - super(ReProcessor, self).__init__(name=name) + def __init__(self, snr_dict, name=None, parent=None, supported=None): + super(ReProcessor, self).__init__(name=name, supported=supported) self.snr_dict = snr_dict def process(self, content, debug=False, **kwargs): diff --git a/Contents/Libraries/Shared/subzero/modification/processors/string_processor.py b/Contents/Libraries/Shared/subzero/modification/processors/string_processor.py index 77bf5669f..270fd76f8 100644 --- a/Contents/Libraries/Shared/subzero/modification/processors/string_processor.py +++ b/Contents/Libraries/Shared/subzero/modification/processors/string_processor.py @@ -12,8 +12,8 @@ class StringProcessor(Processor): String replacement processor base """ - def __init__(self, search, replace, name=None, parent=None): - super(StringProcessor, self).__init__(name=name) + def __init__(self, search, replace, name=None, parent=None, supported=None): + super(StringProcessor, self).__init__(name=name, supported=supported) self.search = search self.replace = replace @@ -31,8 +31,8 @@ class MultipleLineProcessor(Processor): "data": {"old_value": "new_value"} } """ - def __init__(self, snr_dict, name=None, parent=None): - super(MultipleLineProcessor, self).__init__(name=name) + def __init__(self, snr_dict, name=None, parent=None, supported=None): + super(MultipleLineProcessor, self).__init__(name=name, supported=supported) self.snr_dict = snr_dict def process(self, content, debug=False, **kwargs): From f8bfb5dc08097c55e4819bcf8e2af919add44809 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 16:42:40 +0200 Subject: [PATCH 213/710] submod: add subtitle modification for subtitles that are all uppercase --- Contents/Code/support/config.py | 4 +++ Contents/DefaultPrefs.json | 6 +++++ Contents/Libraries/Shared/submod_test.py | 2 +- .../Shared/subzero/modification/main.py | 5 ++++ .../subzero/modification/mods/__init__.py | 1 + .../subzero/modification/mods/common.py | 25 ++++++++++++++++++- .../modification/processors/__init__.py | 11 ++++++++ 7 files changed, 52 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index d17674be2..b078d16d8 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -127,6 +127,7 @@ class Config(object): remove_tags = False fix_ocr = False fix_common = False + fix_upper = False reverse_rtl = False colors = "" chmod = None @@ -210,6 +211,7 @@ def initialize(self): self.remove_tags = cast_bool(Prefs['subtitles.remove_tags']) self.fix_ocr = cast_bool(Prefs['subtitles.fix_ocr']) self.fix_common = cast_bool(Prefs['subtitles.fix_common']) + self.fix_upper = cast_bool(Prefs['subtitles.fix_only_uppercase']) self.reverse_rtl = cast_bool(Prefs['subtitles.reverse_rtl']) self.colors = Prefs['subtitles.colors'] if Prefs['subtitles.colors'] != "don't change" else None self.chmod = self.check_chmod() @@ -918,6 +920,8 @@ def get_default_mods(self): mods.append("OCR_fixes") if self.fix_common: mods.append("common") + if self.fix_upper: + mods.append("fix_uppercase") if self.colors: mods.append("color(name=%s)" % self.colors) if self.reverse_rtl: diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 5d341f423..67ee3dc0c 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -532,6 +532,12 @@ "type": "bool", "default": "true" }, + { + "id": "subtitles.fix_only_uppercase", + "label": "Fix only uppercase downloaded subtitles", + "type": "bool", + "default": "true" + }, { "id": "subtitles.reverse_rtl", "label": "Reverse punctuation in RTL languages (heb, ara, fas)", diff --git a/Contents/Libraries/Shared/submod_test.py b/Contents/Libraries/Shared/submod_test.py index 933db8686..408426da9 100644 --- a/Contents/Libraries/Shared/submod_test.py +++ b/Contents/Libraries/Shared/submod_test.py @@ -20,7 +20,7 @@ if debug: logging.basicConfig(level=logging.DEBUG) -sub = Subtitle(Language.fromietf("eng"), mods=["common", "remove_HI", "OCR_fixes"]) +sub = Subtitle(Language.fromietf("eng"), mods=["common", "remove_HI", "OCR_fixes", "fix_uppercase"]) sub.content = open(fn).read() sub.normalize() content = sub.get_modified_content(debug=True) diff --git a/Contents/Libraries/Shared/subzero/modification/main.py b/Contents/Libraries/Shared/subzero/modification/main.py index 182d304b7..0fa13bb56 100644 --- a/Contents/Libraries/Shared/subzero/modification/main.py +++ b/Contents/Libraries/Shared/subzero/modification/main.py @@ -96,6 +96,11 @@ def prepare_mods(self, *mods): identifier, self.language) continue + if mod_cls.only_uppercase and not self.only_uppercase: + if self.debug: + logger.debug("Skipping %s, because the subtitle isn't all uppercase", identifier) + continue + # merge args of duplicate mods if possible elif identifier in final_mods and mod_cls.args_mergeable: final_mods[identifier] = mod_cls.merge_args(final_mods[identifier], args) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/__init__.py b/Contents/Libraries/Shared/subzero/modification/mods/__init__.py index 49201069e..a1fd0f48e 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/__init__.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/__init__.py @@ -17,6 +17,7 @@ class SubtitleModification(object): order = None modifies_whole_file = False # operates on the whole file, not individual entries apply_last = False + only_uppercase = False pre_processors = [] processors = [] post_processors = [] diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index f4ea34f38..408d0bae6 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -4,7 +4,7 @@ from subzero.language import Language from subzero.modification.mods import SubtitleTextModification, empty_line_post_processors, SubtitleModification -from subzero.modification.processors.string_processor import StringProcessor +from subzero.modification.processors import FuncProcessor from subzero.modification.processors.re_processor import NReProcessor from subzero.modification import registry @@ -147,6 +147,29 @@ class ReverseRTL(SubtitleModification): ] +split_upper_re = re.compile(ur"(\s*[.!?♪]\s*)") + + +class FixUppercase(SubtitleModification): + identifier = "fix_uppercase" + description = "Fixes all-uppercase subtitles" + modifies_whole_file = True + exclusive = True + order = 41 + only_uppercase = True + apply_last = True + + long_description = "Some subtitles are in all-uppercase letters. This at least makes them readable." + + def capitalize(self, c): + return u"".join([s.capitalize() for s in split_upper_re.split(c)]) + + def modify(self, content, debug=False, parent=None, **kwargs): + for entry in parent.f: + entry.plaintext = self.capitalize(entry.plaintext) + + registry.register(CommonFixes) registry.register(RemoveTags) registry.register(ReverseRTL) +registry.register(FixUppercase) diff --git a/Contents/Libraries/Shared/subzero/modification/processors/__init__.py b/Contents/Libraries/Shared/subzero/modification/processors/__init__.py index f5cf48694..b12c27ee1 100644 --- a/Contents/Libraries/Shared/subzero/modification/processors/__init__.py +++ b/Contents/Libraries/Shared/subzero/modification/processors/__init__.py @@ -29,3 +29,14 @@ def __str__(self): def __unicode__(self): return unicode(repr(self)) + + +class FuncProcessor(Processor): + func = None + + def __init__(self, func, name=None, parent=None, supported=None): + super(FuncProcessor, self).__init__(name=name, supported=supported) + self.func = func + + def process(self, content, debug=False, **kwargs): + return self.func(content) From 7ca73b4fca548d364a345e57bc7121089d22b60e Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 16:43:04 +0200 Subject: [PATCH 214/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 3a2d7f91e..dbdc76f6b 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2748 + 2.6.1.2751 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2748 DEV +Version 2.6.1.2751 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 378c0eca3dd6f34c936e3265a2f7c8d2539ddd92 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 16:51:04 +0200 Subject: [PATCH 215/710] submod: fixupper: be smarter about HI bracket entries which might be lowercase inside a full-uppercase subtitle --- .../Shared/subzero/modification/main.py | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subzero/modification/main.py b/Contents/Libraries/Shared/subzero/modification/main.py index 0fa13bb56..4ff39faf9 100644 --- a/Contents/Libraries/Shared/subzero/modification/main.py +++ b/Contents/Libraries/Shared/subzero/modification/main.py @@ -123,10 +123,27 @@ def prepare_mods(self, *mods): def detect_uppercase(self): orig = [] - for entry in self.f[:20]: - orig.append(entry.text.strip()) + entries_used = 0 + for entry in self.f: + entry_used = False + for sub in entry.text.strip().split("\N"): + # try skipping HI bracket entries, those might actually be lowercase + sub = sub.strip() + if not sub[0] in ("[", "(") and not sub[-1] in ("]", ")"): + orig.append(sub) + entry_used = True + else: + # skip full entry + break + + if entry_used: + entries_used += 1 + + if entries_used == 20: + break orig = "".join(orig) + if not orig: return False @@ -137,6 +154,9 @@ def modify(self, *mods): start = time.time() self.only_uppercase = self.detect_uppercase() + if self.only_uppercase and self.debug: + logger.debug("Full-uppercase subtitle found") + line_mods, non_line_mods = self.prepare_mods(*mods) # apply non-last file mods From ad3b8e6da2cba4b5a7f540dc71aa8589ff50b63d Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 16:52:32 +0200 Subject: [PATCH 216/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index dbdc76f6b..4a748da75 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2751 + 2.6.1.2753 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2751 DEV +Version 2.6.1.2753 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From da863a44e03fd14b616de995d38751ab8bcea8a0 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 16:57:15 +0200 Subject: [PATCH 217/710] submod: fixupper: honor debug flag --- .../Libraries/Shared/subzero/modification/mods/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/__init__.py b/Contents/Libraries/Shared/subzero/modification/mods/__init__.py index a1fd0f48e..56a1017cb 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/__init__.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/__init__.py @@ -40,7 +40,8 @@ def _process(self, content, processors, debug=False, parent=None, index=None, ** new_content = content for processor in _processors: if not processor.supported(parent): - logger.debug("Processor not supported, skipping: %s", processor.name) + if debug: + logger.debug("Processor not supported, skipping: %s", processor.name) continue old_content = new_content From 898fe7c4439f0b8c83ebaf13a121b2e47e040538 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 12 Sep 2018 16:59:41 +0200 Subject: [PATCH 218/710] submod: fixupper: also capitalize after dash --- Contents/Libraries/Shared/subzero/modification/mods/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 408d0bae6..956d95021 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -147,7 +147,7 @@ class ReverseRTL(SubtitleModification): ] -split_upper_re = re.compile(ur"(\s*[.!?♪]\s*)") +split_upper_re = re.compile(ur"(\s*[.!?♪\-]\s*)") class FixUppercase(SubtitleModification): From e512184d6dd5594a677f3e4472fd3348cc132fbf Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 13 Sep 2018 00:00:08 +0200 Subject: [PATCH 219/710] core: re-fix Language.rebuild --- Contents/Libraries/Shared/subzero/language.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index 2fa694428..af486c4ed 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -85,7 +85,7 @@ def rebuild(cls, instance, **replkw): attrs = ("country", "script", "forced") language = state[0] kwa = dict(zip(attrs, state[1:])) - kwa.update(dict((key, value) for key, value in replkw.iteritems() if value is not None)) + kwa.update(replkw) return cls(language, **kwa) @classmethod From e2765c34d7f3ac523124c2638733683a7c8ff126 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 13 Sep 2018 01:10:28 +0200 Subject: [PATCH 220/710] refiners: tvdb: warn instead of error when no matching series was found --- Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py b/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py index be8cfe6dc..a70f9aba6 100644 --- a/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py @@ -117,7 +117,7 @@ def refine(video, **kwargs): # exit if we don't have exactly 1 matching result if not matching_results: - logger.error('No matching series found') + logger.warning('No matching series found') return if len(matching_results) > 1: logger.error('Multiple matches found') From ab090747ebd06c8034a625c8d3f2ae0ac95bc498 Mon Sep 17 00:00:00 2001 From: viking Date: Thu, 13 Sep 2018 01:15:48 +0200 Subject: [PATCH 221/710] Better handling of archives with both cyrlic and latin subtitles --- .../Libraries/Shared/subliminal_patch/providers/titlovi.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index be4be6c9b..0062448e2 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -325,10 +325,10 @@ def get_subtitle_from_bundled_archive(self, subtitle, subs_in_archive, archive): sub_to_extract = None for sub_name in subs_in_archive: - if 'lat' in sub_name and not 'cyr' in sub_name: + if not ('.cyr' in sub_name or '.cir' in sub_name): sr_lat_subs.append(sub_name) - if 'cyr' in sub_name and not 'lat' in sub_name: + if ('.cyr' in sub_name or '.cir' in sub_name) and not '.lat' in sub_name: sr_cyr_subs.append(sub_name) if subtitle.language == 'sr': From 0c2c75417f63e9ba26db073360dfb3000ea549d1 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 13 Sep 2018 02:28:31 +0200 Subject: [PATCH 222/710] refiners: always add alternative titles --- Contents/Libraries/Shared/subzero/video.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Contents/Libraries/Shared/subzero/video.py b/Contents/Libraries/Shared/subzero/video.py index 4f7f40bd9..14f655301 100644 --- a/Contents/Libraries/Shared/subzero/video.py +++ b/Contents/Libraries/Shared/subzero/video.py @@ -127,6 +127,9 @@ def refine_video(video, no_refining=False, refiner_settings=None): if video.imdb_id: logger.info(u"Adding PMS imdb_id info: %s", video.imdb_id) + elif hints["type"] == "movie" and plex_title: + video.alternative_titles.append(plex_title.replace(" - ", " ").replace(" -", " ").replace("- ", " ")) + if hints["type"] == "episode": video.season = video_info.get("season", video.season) video.episode = video_info.get("episode", video.episode) @@ -142,6 +145,9 @@ def refine_video(video, no_refining=False, refiner_settings=None): video.alternative_series.append(old_title) + elif plex_title: + video.alternative_series.append(plex_title) + # still no match? add our own data if not video.series_tvdb_id or not video.tvdb_id: logger.info(u"Adding PMS year info: %s", video_info.get("year")) From 3eea1840ffa646fa1c7f19aac1ba938674b8b01e Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 13 Sep 2018 02:56:45 +0200 Subject: [PATCH 223/710] core: remove obsolete video.title fallback --- Contents/Libraries/Shared/subliminal_patch/core.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 5bdf67267..b86cd0fd5 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -517,11 +517,6 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski guessed_result = guessit(guess_from, options=hints) logger.debug('GuessIt found: %s', json.dumps(guessed_result, cls=GuessitEncoder, indent=4, ensure_ascii=False)) video = Video.fromguess(path, guessed_result) - - # trust plex's movie name - if video_type == "movie" and hints.get("expected_title"): - video.title = hints.get("expected_title")[0] - video.hints = hints if dont_use_actual_file: From 84fd20c05ff24cd7e9789305cfc126360ee74d6a Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 13 Sep 2018 03:15:37 +0200 Subject: [PATCH 224/710] core: add guessit alternative title to alternative video titles --- Contents/Libraries/Shared/subliminal/video.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal/video.py b/Contents/Libraries/Shared/subliminal/video.py index a6efb8016..0db6c65c4 100644 --- a/Contents/Libraries/Shared/subliminal/video.py +++ b/Contents/Libraries/Shared/subliminal/video.py @@ -220,9 +220,13 @@ def fromguess(cls, name, guess): if 'title' not in guess: raise ValueError('Insufficient data to process the guess') + alternative_titles = [] + if 'alternative_title' in guess: + alternative_titles.append(u"%s %s" % (guess['title'], guess['alternative_title'])) + return cls(name, guess['title'], format=guess.get('format'), release_group=guess.get('release_group'), resolution=guess.get('screen_size'), video_codec=guess.get('video_codec'), - audio_codec=guess.get('audio_codec'), year=guess.get('year')) + audio_codec=guess.get('audio_codec'), year=guess.get('year'), alternative_titles=alternative_titles) @classmethod def fromname(cls, name): From 5c6c7a4459ebc0aa0f9897f0fd62e8984d684f4a Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 13 Sep 2018 04:00:42 +0200 Subject: [PATCH 225/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 4a748da75..b720aacf8 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2753 + 2.6.1.2763 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2753 DEV +Version 2.6.1.2763 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From d2750b87e9f05d441d2cfe96ee6b83bf43a9264d Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 13 Sep 2018 04:18:03 +0200 Subject: [PATCH 226/710] core: scanning: re-add expected title to guessit for narrowing down the video title --- Contents/Libraries/Shared/subliminal_patch/core.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index b86cd0fd5..5f3158195 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -514,6 +514,9 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski # guess hints["single_value"] = True + if video_type == "movie": + hints["expected_title"] = [hints["title"]] + guessed_result = guessit(guess_from, options=hints) logger.debug('GuessIt found: %s', json.dumps(guessed_result, cls=GuessitEncoder, indent=4, ensure_ascii=False)) video = Video.fromguess(path, guessed_result) From 0cdb13cc573d7be0136e4e4ce6dc638b070cf45b Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 13 Sep 2018 04:37:52 +0200 Subject: [PATCH 227/710] core: refining: be smarter about alternative titles --- Contents/Libraries/Shared/subzero/video.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subzero/video.py b/Contents/Libraries/Shared/subzero/video.py index 14f655301..cb5b8d172 100644 --- a/Contents/Libraries/Shared/subzero/video.py +++ b/Contents/Libraries/Shared/subzero/video.py @@ -128,7 +128,9 @@ def refine_video(video, no_refining=False, refiner_settings=None): logger.info(u"Adding PMS imdb_id info: %s", video.imdb_id) elif hints["type"] == "movie" and plex_title: - video.alternative_titles.append(plex_title.replace(" - ", " ").replace(" -", " ").replace("- ", " ")) + pt = plex_title.replace(" - ", " ").replace(" -", " ").replace("- ", " ") + if pt != video.title: + video.alternative_titles.append(pt) if hints["type"] == "episode": video.season = video_info.get("season", video.season) @@ -145,7 +147,7 @@ def refine_video(video, no_refining=False, refiner_settings=None): video.alternative_series.append(old_title) - elif plex_title: + elif plex_title and video.series != plex_title: video.alternative_series.append(plex_title) # still no match? add our own data From a15586f1a2e700939bffa0969e38093d1dfa7225 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 14 Sep 2018 02:35:12 +0200 Subject: [PATCH 228/710] submod: fix_uppercase: reduce log spam --- .../Libraries/Shared/subzero/modification/mods/__init__.py | 3 ++- .../Shared/subzero/modification/processors/__init__.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/__init__.py b/Contents/Libraries/Shared/subzero/modification/mods/__init__.py index 56a1017cb..10d0553da 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/__init__.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/__init__.py @@ -40,8 +40,9 @@ def _process(self, content, processors, debug=False, parent=None, index=None, ** new_content = content for processor in _processors: if not processor.supported(parent): - if debug: + if debug and processor.enabled: logger.debug("Processor not supported, skipping: %s", processor.name) + processor.enabled = False continue old_content = new_content diff --git a/Contents/Libraries/Shared/subzero/modification/processors/__init__.py b/Contents/Libraries/Shared/subzero/modification/processors/__init__.py index b12c27ee1..7cfb0aa33 100644 --- a/Contents/Libraries/Shared/subzero/modification/processors/__init__.py +++ b/Contents/Libraries/Shared/subzero/modification/processors/__init__.py @@ -8,6 +8,7 @@ class Processor(object): name = None parent = None supported = None + enabled = True def __init__(self, name=None, parent=None, supported=None): self.name = name From 21ab4f0aa43f09c3f4a56ed6c9635b2e5c01320e Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 14 Sep 2018 02:36:16 +0200 Subject: [PATCH 229/710] submod: fix_uppercase: be smarter; use HI removal for bracket entries; bail out as early as possible --- .../Shared/subzero/modification/main.py | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/Contents/Libraries/Shared/subzero/modification/main.py b/Contents/Libraries/Shared/subzero/modification/main.py index 4ff39faf9..ee2f9e1e4 100644 --- a/Contents/Libraries/Shared/subzero/modification/main.py +++ b/Contents/Libraries/Shared/subzero/modification/main.py @@ -1,7 +1,7 @@ # coding=utf-8 import traceback - +import re import pysubs2 import logging import time @@ -12,6 +12,9 @@ logger = logging.getLogger(__name__) +lowercase_re = re.compile(ur'(?sux)[a-zà-ž]') + + class SubtitleModifications(object): debug = False language = None @@ -122,15 +125,19 @@ def prepare_mods(self, *mods): return line_mods, non_line_mods def detect_uppercase(self): - orig = [] entries_used = 0 for entry in self.f: entry_used = False for sub in entry.text.strip().split("\N"): - # try skipping HI bracket entries, those might actually be lowercase + # skip HI bracket entries, those might actually be lowercase sub = sub.strip() - if not sub[0] in ("[", "(") and not sub[-1] in ("]", ")"): - orig.append(sub) + for processor in registry.mods["remove_HI"].processors[:4]: + sub = processor.process(sub) + + if sub.strip(): + if lowercase_re.search(sub): + return False + entry_used = True else: # skip full entry @@ -139,15 +146,10 @@ def detect_uppercase(self): if entry_used: entries_used += 1 - if entries_used == 20: + if entries_used == 40: break - orig = "".join(orig) - - if not orig: - return False - - return orig.isupper() + return True def modify(self, *mods): new_entries = [] From 5fef8400b966cd053602d975741045b3370269e0 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 14 Sep 2018 02:41:44 +0200 Subject: [PATCH 230/710] submod: HI: remove MAN: --- .../Shared/subzero/modification/mods/hearing_impaired.py | 3 +++ Contents/Libraries/Shared/test.srt | 2 ++ 2 files changed, 5 insertions(+) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py index 918b87b18..10dade9ee 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py @@ -71,6 +71,9 @@ class HearingImpaired(SubtitleTextModification): NReProcessor(re.compile(ur'(?u)(^(?=.*[A-ZÀ-Ž&+]{4,})[A-ZÀ-Ž-_\s&+]+$)'), "", name="HI_all_caps", supported=lambda p: not p.only_uppercase), + # remove MAN: + NReProcessor(re.compile(ur'(?suxi)(.*MAN:\s*)'), "", name="HI_remove_man"), + # dash in front # NReProcessor(re.compile(r'(?u)^\s*-\s*'), "", name="HI_starting_dash"), diff --git a/Contents/Libraries/Shared/test.srt b/Contents/Libraries/Shared/test.srt index 7edcc7d6b..f6eaead5e 100644 --- a/Contents/Libraries/Shared/test.srt +++ b/Contents/Libraries/Shared/test.srt @@ -3186,6 +3186,8 @@ Engage safety. 00:46:14,353 --> 00:46:17,384 MAN: Someone down there shouldn't be here. +weird man: oh yeah. +- man: shit. 745 00:46:19,985 --> 00:46:21,360 From 7dc5b9f7eea81afdc2e20759189b4c221dd171dc Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 14 Sep 2018 02:42:22 +0200 Subject: [PATCH 231/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index b720aacf8..d82a040bb 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2763 + 2.6.1.2769 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2763 DEV +Version 2.6.1.2769 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 89be51441f899f571f19e52ad44b27cb7eb917e5 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 17 Sep 2018 15:46:57 +0200 Subject: [PATCH 232/710] submod: keep track of actually applied mods --- .../Libraries/Shared/subliminal_patch/subtitle.py | 1 + .../Libraries/Shared/subzero/modification/main.py | 15 +++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index cd845646d..d2b25674b 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -315,6 +315,7 @@ def get_modified_content(self, format="srt", debug=False): if submods.load(content=self.text, language=self.language): logger.info("Applying mods: %s", self.mods) submods.modify(*self.mods) + self.mods = submods.mods_used content = fix_text(self.pysubs2_to_unicode(submods.f, format=format), **ftfy_defaults)\ .encode(encoding="utf-8") diff --git a/Contents/Libraries/Shared/subzero/modification/main.py b/Contents/Libraries/Shared/subzero/modification/main.py index ee2f9e1e4..759a28a2d 100644 --- a/Contents/Libraries/Shared/subzero/modification/main.py +++ b/Contents/Libraries/Shared/subzero/modification/main.py @@ -19,6 +19,7 @@ class SubtitleModifications(object): debug = False language = None initialized_mods = {} + mods_used = [] only_uppercase = False f = None @@ -27,6 +28,7 @@ class SubtitleModifications(object): def __init__(self, debug=False): self.debug = debug self.initialized_mods = {} + self.mods_used = [] def load(self, fn=None, content=None, language=None, encoding="utf-8"): """ @@ -77,12 +79,14 @@ def get_mod_signature(cls, identifier, **kwargs): return cls.get_mod_class(identifier).get_signature(**kwargs) def prepare_mods(self, *mods): - parsed_mods = [SubtitleModifications.parse_identifier(mod) for mod in mods] + parsed_mods = [(SubtitleModifications.parse_identifier(mod), mod) for mod in mods] final_mods = {} line_mods = [] non_line_mods = [] + used_mods = [] - for identifier, args in parsed_mods: + for mod_data, orig_identifier in parsed_mods: + identifier, args = mod_data if identifier not in registry.mods: logger.error("Mod %s not loaded", identifier) continue @@ -109,6 +113,7 @@ def prepare_mods(self, *mods): final_mods[identifier] = mod_cls.merge_args(final_mods[identifier], args) continue final_mods[identifier] = args + used_mods.append(orig_identifier) # separate all mods into line and non-line mods for identifier, args in final_mods.iteritems(): @@ -122,7 +127,7 @@ def prepare_mods(self, *mods): if identifier not in self.initialized_mods: self.initialized_mods[identifier] = mod_cls(self) - return line_mods, non_line_mods + return line_mods, non_line_mods, used_mods def detect_uppercase(self): entries_used = 0 @@ -159,7 +164,8 @@ def modify(self, *mods): if self.only_uppercase and self.debug: logger.debug("Full-uppercase subtitle found") - line_mods, non_line_mods = self.prepare_mods(*mods) + line_mods, non_line_mods, mods_used = self.prepare_mods(*mods) + self.mods_used = mods_used # apply non-last file mods if non_line_mods: @@ -193,6 +199,7 @@ def modify(self, *mods): if self.debug: logger.debug("Subtitle Modification took %ss", time.time() - start) + logger.debug("Mods applied: %s" % self.mods_used) def apply_non_line_mods(self, mods, only_last=False): for identifier, args in mods: From 0dc7d746630e2f55244b022b9ecffb37a4b41a98 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 17 Sep 2018 17:00:11 +0200 Subject: [PATCH 233/710] menu: select active subtitle: return to item details afterwards; correctly set current --- Contents/Code/interface/item_details.py | 17 +++++++++++------ Contents/Code/support/storage.py | 2 +- .../Shared/subzero/subtitle_storage.py | 14 +++++++++++++- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index dab6bd946..eb90420d4 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -326,19 +326,24 @@ def SelectStoredSubForItemMenu(**kwargs): subtitles = stored_subs.get_all(part_id, language) subtitle = subtitles[sub_key] - subtitles["current"] = sub_key - save_stored_sub(subtitle, rating_key, part_id, language, item_type, plex_item=plex_item, storage=storage, stored_subs=stored_subs) + stored_subs.set_current(part_id, language, sub_key) + storage.save(stored_subs) storage.destroy() - kwargs.pop("randomize") + kwa = { + "header": _("Success"), + "message": _("Subtitle saved to disk"), + "title": kwargs["title"], + "item_title": kwargs["item_title"], + "base_title": kwargs.get("base_title") + } - kwargs["header"] = _("Success") - kwargs["message"] = _("Subtitle saved to disk") + # fixme: return to SubtitleOptionsMenu properly? (needs recomputation of current_data - return SubtitleOptionsMenu(randomize=timestamp(), **kwargs) + return ItemDetailsMenu(rating_key, randomize=timestamp(), **kwa) @route(PREFIX + '/item/blacklist_recent/{language}') diff --git a/Contents/Code/support/storage.py b/Contents/Code/support/storage.py index 7c654f37a..e0fbd7ce8 100644 --- a/Contents/Code/support/storage.py +++ b/Contents/Code/support/storage.py @@ -205,7 +205,7 @@ def save_subtitles(scanned_video_part_map, downloaded_subtitles, mode="a", bare_ if not bare_save and save_successful and config.notify_executable: notify_executable(config.notify_executable, scanned_video_part_map, downloaded_subtitles, storage) - if not bare_save and save_successful or not set_current: + if (not bare_save and save_successful) or not set_current: store_subtitle_info(scanned_video_part_map, downloaded_subtitles, storage, mode=mode, set_current=set_current) return save_successful diff --git a/Contents/Libraries/Shared/subzero/subtitle_storage.py b/Contents/Libraries/Shared/subzero/subtitle_storage.py index b0e733e13..186a03a38 100644 --- a/Contents/Libraries/Shared/subzero/subtitle_storage.py +++ b/Contents/Libraries/Shared/subzero/subtitle_storage.py @@ -205,6 +205,18 @@ def get_all(self, part_id, lang): return part.get(str(lang)) + def set_current(self, part_id, lang, sub_key): + subs = self.get_all(part_id, lang) + if not subs: + return + + if sub_key not in subs: + logger.info("Tried setting unknown subtitle %s as current" % sub_key) + return + + subs["current"] = sub_key + logger.debug("Set subtitle %s as current for %s, %s" % (sub_key, part_id, lang)) + def get_by_provider(self, part_id, lang, provider_name): out = [] all_subs = self.get_all(part_id, lang) @@ -514,7 +526,7 @@ def save(self, subs_for_video): finally: f.close() except: - logger.error("Something REALLY went wrong when writing to: %s: %s", basename, + logger.error("Something went REALLY wrong when writing to: %s: %s", basename, traceback.format_exc()) else: with gzip.open(temp_fn, "wb", compresslevel=6) as f: From 97318bfd070e858e1d8e415584b94136f807fff7 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 17 Sep 2018 17:20:45 +0200 Subject: [PATCH 234/710] submod: common: add space after punctuation --- Contents/Libraries/Shared/subzero/modification/mods/common.py | 3 +++ Contents/Libraries/Shared/test.srt | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 956d95021..fc2e7f600 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -109,6 +109,9 @@ class CommonFixes(SubtitleTextModification): # remove spaces before punctuation; don't break spaced ellipses NReProcessor(re.compile(r'(?u)(?:(?<=^)|(?<=\w)) +([!?.,](?![!?.,]| \.))'), r"\1", name="CM_punctuation_space"), + + # add space after punctuation + NReProcessor(re.compile(r'(?u)([!?.,:])([A-zÀ-ž]{2,})'), r"\1 \2", name="CM_punctuation_space2"), ] post_processors = empty_line_post_processors diff --git a/Contents/Libraries/Shared/test.srt b/Contents/Libraries/Shared/test.srt index f6eaead5e..73ba75233 100644 --- a/Contents/Libraries/Shared/test.srt +++ b/Contents/Libraries/Shared/test.srt @@ -11,7 +11,7 @@ But this should. Peter: Yello! 2 00:00:10,759 --> 00:00:12,678 ROSE: (Help us. Please. . .help us.) -What's "wrong"? over 9, 000! +What's "wrong"?over 9, 000! I can't keep running. L can't! 3 From 5e57a6d61a8ad442932ccf6a30dcec43b546936d Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 17 Sep 2018 17:31:23 +0200 Subject: [PATCH 235/710] submod: common: fix lowercase i for english language --- Contents/Libraries/Shared/submod_test.py | 4 ++-- Contents/Libraries/Shared/subzero/modification/main.py | 4 +++- .../Libraries/Shared/subzero/modification/mods/common.py | 7 +++++++ Contents/Libraries/Shared/test.srt | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Contents/Libraries/Shared/submod_test.py b/Contents/Libraries/Shared/submod_test.py index 408426da9..9bb8c0c87 100644 --- a/Contents/Libraries/Shared/submod_test.py +++ b/Contents/Libraries/Shared/submod_test.py @@ -6,7 +6,7 @@ from ftfy import fix_text -from babelfish import Language +from subzero.language import Language from subliminal_patch import Subtitle from subliminal_patch.subtitle import ftfy_defaults @@ -20,7 +20,7 @@ if debug: logging.basicConfig(level=logging.DEBUG) -sub = Subtitle(Language.fromietf("eng"), mods=["common", "remove_HI", "OCR_fixes", "fix_uppercase"]) +sub = Subtitle(Language.fromietf("eng:forced"), mods=["common", "remove_HI", "OCR_fixes", "fix_uppercase"]) sub.content = open(fn).read() sub.normalize() content = sub.get_modified_content(debug=True) diff --git a/Contents/Libraries/Shared/subzero/modification/main.py b/Contents/Libraries/Shared/subzero/modification/main.py index 759a28a2d..187507837 100644 --- a/Contents/Libraries/Shared/subzero/modification/main.py +++ b/Contents/Libraries/Shared/subzero/modification/main.py @@ -8,6 +8,7 @@ from mods import EMPTY_TAG_PROCESSOR, EmptyEntryError from registry import registry +from subzero.language import Language logger = logging.getLogger(__name__) @@ -39,7 +40,8 @@ def load(self, fn=None, content=None, language=None, encoding="utf-8"): :param content: unicode :return: """ - self.language = language + if language: + self.language = Language.rebuild(language, forced=False) self.initialized_mods = {} try: if fn: diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index fc2e7f600..4793914a0 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -9,6 +9,9 @@ from subzero.modification import registry +ENGLISH = Language("eng") + + class CommonFixes(SubtitleTextModification): identifier = "common" description = "Basic common fixes" @@ -112,6 +115,10 @@ class CommonFixes(SubtitleTextModification): # add space after punctuation NReProcessor(re.compile(r'(?u)([!?.,:])([A-zÀ-ž]{2,})'), r"\1 \2", name="CM_punctuation_space2"), + + # fix lowercase I in english + NReProcessor(re.compile(r'(?u)(\b)i(\b)'), r"\1I\2", name="CM_EN_lowercase_i", + supported=lambda p: p.language == ENGLISH), ] post_processors = empty_line_post_processors diff --git a/Contents/Libraries/Shared/test.srt b/Contents/Libraries/Shared/test.srt index 73ba75233..37aed6972 100644 --- a/Contents/Libraries/Shared/test.srt +++ b/Contents/Libraries/Shared/test.srt @@ -16,7 +16,7 @@ I can't keep running. L can't! 3 00:00:12,679 --> 00:00:16,097 -I don't know. Some kind of wrong "1 00" number--- +i don't know. Some kind of wrong "1 00" number--- of signal, drawing the Tardis off.... course. 4 From 298d75abf677d38876db3ff65b4b2dee4c3d0f4f Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 17 Sep 2018 17:32:01 +0200 Subject: [PATCH 236/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index d82a040bb..58e9a96a4 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2769 + 2.6.1.2774 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2769 DEV +Version 2.6.1.2774 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 5356845e74c8e3d51640c3f3dead7fb3a17d6c10 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 21 Sep 2018 06:21:18 +0200 Subject: [PATCH 237/710] menu: add item thumbnails to history and a couple of submenus --- Contents/Code/__init__.py | 3 ++- Contents/Code/interface/main.py | 1 + Contents/Code/interface/menu.py | 8 +++++--- Contents/Code/interface/menu_helpers.py | 1 + Contents/Code/support/tasks.py | 2 ++ Contents/Libraries/Shared/subzero/history_storage.py | 9 ++++++--- 6 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index af2d6e4af..52614128c 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -288,9 +288,10 @@ def update(self, metadata, media, lang): for video, video_subtitles in downloaded_subtitles.items(): # store item(s) in history for subtitle in video_subtitles: - item_title = get_title_for_video_metadata(video.plexapi_metadata, add_section_title=False) + item_title = get_title_for_video_metadata(video.plexapi_metadata["item"], add_section_title=False) history = get_history() history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], + thumb=video.plexapi_metadata["item"].thumb, subtitle=subtitle) history.destroy() else: diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index 94e080fd5..c635ddeab 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -218,6 +218,7 @@ def RecentlyPlayedMenu(): item_title = get_item_title(item) oc.add(DirectoryObject( + thumb=get_item_thumb(item) or default_thumb, title=item_title, key=Callback(ItemDetailsMenu, title=base_title + " > " + item.title, item_title=item.title, rating_key=item.rating_key) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 8a6cc936c..2146bfc08 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -22,7 +22,8 @@ from support.config import config from support.helpers import timestamp, df, display_language from support.ignore import exclude_list -from support.items import get_all_items, get_items_info, get_item_kind_from_rating_key, get_item, MI_KEY, get_item_title +from support.items import get_all_items, get_items_info, get_item_kind_from_rating_key, get_item, MI_KEY, \ + get_item_title, get_item_thumb from support.storage import get_subtitle_storage from support.i18n import _ @@ -235,7 +236,7 @@ def HistoryMenu(): history = get_history() oc = SubFolderObjectContainer(title2=_("History"), replace_parent=True) - for item in history.items: + for item in history.items[:100]: possible_language = item.language language_display = item.lang_name if not possible_language else display_language(possible_language) @@ -244,7 +245,8 @@ def HistoryMenu(): rating_key=item.rating_key), title=u"%s (%s)" % (item.item_title, item.mode_verbose), summary=_(u"%s in %s (%s, score: %s), %s", language_display, item.section_title, - item.provider_name, item.score, df(item.time)) + item.provider_name, item.score, df(item.time)), + thumb=item.thumb or default_thumb )) history.destroy() diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 1bb07793b..6c0aad159 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -211,6 +211,7 @@ def extract_embedded_sub(**kwargs): add_section_title=False) history = get_history() history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], + thumb=video.plexapi_metadata["item"].thumb, subtitle=subtitle, mode=extract_mode) history.destroy() diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index b971a0e7a..e08a7dcb2 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -235,6 +235,7 @@ def download_subtitle(self, subtitle, rating_key, mode="m"): item_title = get_title_for_video_metadata(metadata, add_section_title=False) history = get_history() history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], + thumb=video.plexapi_metadata["item"].thumb, subtitle=subtitle, mode=mode) history.destroy() @@ -478,6 +479,7 @@ def skip_item(): for subtitle in video_subtitles: downloads_per_video += 1 history.add(item_title, video.id, section_title=metadata["section"], + thumb=video.plexapi_metadata["item"].thumb, subtitle=subtitle, mode="a") diff --git a/Contents/Libraries/Shared/subzero/history_storage.py b/Contents/Libraries/Shared/subzero/history_storage.py index 4a20e8b2a..38d859d55 100644 --- a/Contents/Libraries/Shared/subzero/history_storage.py +++ b/Contents/Libraries/Shared/subzero/history_storage.py @@ -20,10 +20,11 @@ class SubtitleHistoryItem(object): lang_name = None lang_data = None score = None + thumb = None time = None mode = "a" - def __init__(self, item_title, rating_key, section_title=None, subtitle=None, mode="a", time=None): + def __init__(self, item_title, rating_key, section_title=None, subtitle=None, thumb=None, mode="a", time=None): self.item_title = item_title self.section_title = section_title self.rating_key = str(rating_key) @@ -33,6 +34,7 @@ def __init__(self, item_title, rating_key, section_title=None, subtitle=None, mo str(subtitle.language.country) if subtitle.language.country else None, \ str(subtitle.language.script) if subtitle.language.script else None self.score = subtitle.score + self.thumb = thumb self.time = time or datetime.datetime.now() self.mode = mode @@ -82,11 +84,12 @@ def __init__(self, storage, threadkit, size=100): self.storage = storage self.threadkit = threadkit - def add(self, item_title, rating_key, section_title=None, subtitle=None, mode="a", time=None): + def add(self, item_title, rating_key, section_title=None, subtitle=None, thumb=None, mode="a", time=None): with self.threadkit.Lock(key="sub_history_add"): items = self.items - item = SubtitleHistoryItem(item_title, rating_key, section_title=section_title, subtitle=subtitle, mode=mode, time=time) + item = SubtitleHistoryItem(item_title, rating_key, section_title=section_title, subtitle=subtitle, + thumb=thumb, mode=mode, time=time) # insert item items.insert(0, item) From 7b5316104171e24f5230fea93d2a2d304bcef4c5 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 22 Sep 2018 05:08:41 +0200 Subject: [PATCH 238/710] menu: history: use series thumbnail instead of episode screenshot --- Contents/Code/__init__.py | 2 +- Contents/Code/interface/item_details.py | 2 +- Contents/Code/interface/menu_helpers.py | 2 +- Contents/Code/support/plex_media.py | 4 ++++ Contents/Code/support/tasks.py | 4 ++-- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 52614128c..4a864d1e7 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -291,7 +291,7 @@ def update(self, metadata, media, lang): item_title = get_title_for_video_metadata(video.plexapi_metadata["item"], add_section_title=False) history = get_history() history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], - thumb=video.plexapi_metadata["item"].thumb, + thumb=video.plexapi_metadata["super_thumb"], subtitle=subtitle) history.destroy() else: diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index eb90420d4..aacf9fca5 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -199,7 +199,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra title=_(u"%(part_summary)sEmbedded subtitles (%(languages)s)", part_summary=part_index_addon, languages=", ".join(display_language(l) for l in set(embedded_langs))), - summary=_(u"Extract and activate embedded subtitle streams") + summary=_(u"Extract embedded subtitle streams") )) ignore_title = item_title diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 6c0aad159..11ee28c97 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -211,7 +211,7 @@ def extract_embedded_sub(**kwargs): add_section_title=False) history = get_history() history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], - thumb=video.plexapi_metadata["item"].thumb, + thumb=video.plexapi_metadata["super_thumb"], subtitle=subtitle, mode=extract_mode) history.destroy() diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index 6f3036033..28b227b2a 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -108,6 +108,7 @@ def media_to_videos(media, kind="series"): "title": ep.title, "series": media.title, "id": ep.id, "year": year, "series_id": media.id, + "super_thumb": plex_item.thumb, "season_id": season_object.id, "imdb_id": None, "series_tvdb_id": series_tvdb_id, "tvdb_id": tvdb_id, @@ -128,6 +129,7 @@ def media_to_videos(media, kind="series"): videos.append( get_metadata_dict(plex_item, part, dict(stream_info, **{"plex_part": part, "type": "movie", "title": media.title, "id": media.id, + "super_thumb": plex_item.thumb, "series_id": None, "year": year, "season_id": None, "imdb_id": imdb_id, "original_title": original_title, @@ -256,6 +258,7 @@ def get_plex_metadata(rating_key, part_id, item_type, plex_item=None): "imdb_id": None, "year": year, "tvdb_id": tvdb_id, + "super_thumb": plex_item.show.thumb, "series_tvdb_id": series_tvdb_id, "original_title": original_title, "season": plex_item.season.index, @@ -275,6 +278,7 @@ def get_plex_metadata(rating_key, part_id, item_type, plex_item=None): "imdb_id": imdb_id, "year": plex_item.year, "tvdb_id": None, + "super_thumb": plex_item.thumb, "series_tvdb_id": None, "original_title": original_title, "season": None, diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index e08a7dcb2..6a0813146 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -235,7 +235,7 @@ def download_subtitle(self, subtitle, rating_key, mode="m"): item_title = get_title_for_video_metadata(metadata, add_section_title=False) history = get_history() history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], - thumb=video.plexapi_metadata["item"].thumb, + thumb=video.plexapi_metadata["super_thumb"], subtitle=subtitle, mode=mode) history.destroy() @@ -479,7 +479,7 @@ def skip_item(): for subtitle in video_subtitles: downloads_per_video += 1 history.add(item_title, video.id, section_title=metadata["section"], - thumb=video.plexapi_metadata["item"].thumb, + thumb=video.plexapi_metadata["super_thumb"], subtitle=subtitle, mode="a") From 20952b5c26ad38268486d34efba252c584bd4483 Mon Sep 17 00:00:00 2001 From: morpheus133 Date: Thu, 27 Sep 2018 15:14:38 +0200 Subject: [PATCH 239/710] Refactor the fix_inconsistent_naming function for hosszupuska. --- .../Shared/subliminal_patch/providers/hosszupuska.py | 9 +++++---- .../Shared/subliminal_patch/providers/titlovi.py | 4 ++-- Contents/Libraries/Shared/subliminal_patch/utils.py | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py b/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py index febfad8c8..4d4d4d9f1 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py @@ -32,8 +32,9 @@ def fix_inconsistent_naming(title): :rtype: str """ - return _fix_inconsistent_naming(title, {"DC's Legends of Tomorrow": "Legends of Tomorrow", - "Marvel's Jessica Jones": "Jessica Jones"}) + return _fix_inconsistent_naming(title, {"Stargate Origins": "Stargate: Origins", + "Marvel's Agents of S.H.I.E.L.D.": "Marvels+Agents+of+S.H.I.E.L.D", + "Mayans M.C.": "Mayans MC"}) logger = logging.getLogger(__name__) @@ -88,7 +89,7 @@ def id(self): def get_matches(self, video): matches = set() # series - if video.series and sanitize(self.series) == sanitize(video.series): + if video.series and ( sanitize(self.series) == sanitize(fix_inconsistent_naming(video.series)) or sanitize(self.series) == sanitize(video.series)): matches.add('series') # season if video.season and self.season == video.season: @@ -149,7 +150,7 @@ def query(self, series, season, episode, year=None, video=None): seasona = "%02d" % season episodea = "%02d" % episode series = fix_inconsistent_naming(series) - seriesa = series.replace(' ', '+').replace('\'', '') + seriesa = series.replace(' ', '+') # get the episode page logger.info('Getting the page for episode %s', episode) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index 162330cb0..b4d61423c 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -41,8 +41,8 @@ def fix_inconsistent_naming(title): :rtype: str """ - return _fix_inconsistent_naming(title, {"DC's Legends of Tomorrow": "Legends of Tomorrow", - "Marvel's Jessica Jones": "Jessica Jones"}) + return sanitize(_fix_inconsistent_naming(title, {"DC's Legends of Tomorrow": "Legends of Tomorrow", + "Marvel's Jessica Jones": "Jessica Jones"})) logger = logging.getLogger(__name__) diff --git a/Contents/Libraries/Shared/subliminal_patch/utils.py b/Contents/Libraries/Shared/subliminal_patch/utils.py index d439272b0..9bee59ab8 100644 --- a/Contents/Libraries/Shared/subliminal_patch/utils.py +++ b/Contents/Libraries/Shared/subliminal_patch/utils.py @@ -55,4 +55,4 @@ def fix_inconsistent_naming(title, inconsistent_titles_dict=None): title = pattern.sub(lambda x: inconsistent_titles_dict[x.group()], title) # return fixed and sanitized title - return sanitize(title) + return title From c17c59aea6d12d60fc055f8f228927a01cff7322 Mon Sep 17 00:00:00 2001 From: pannal Date: Thu, 11 Oct 2018 23:15:03 +0200 Subject: [PATCH 240/710] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index bcc7a4768..42db70ae2 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,10 @@ Check out **[the Sub-Zero Wiki](https://github.com/pannal/Sub-Zero.bundle/wiki)** by [@ukdtom](https://github.com/ukdtom) and [@mmgoodnow](https://github.com/mmgoodnow)

+
+ +**[The future of Sub-Zero](https://www.reddit.com/r/PleX/comments/9n9qjl/subzero_the_future/)** + If you like this, buy me a beer:
[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G9VKR2B8PMNKG)
or become a Patreon starting at **1 $ / month**

or use the OpenSubtitles Sub-Zero affiliate link to become VIP
**10€/year, ad-free subs, 1000 subs/day, no-cache *VIP* server**
## Introduction From 7ce4d61b31034ec0db065f4df61a5ca7bf0db16e Mon Sep 17 00:00:00 2001 From: pannal Date: Thu, 11 Oct 2018 23:15:57 +0200 Subject: [PATCH 241/710] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 42db70ae2..d753c012b 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,12 @@ Check out **[the Sub-Zero Wiki](https://github.com/pannal/Sub-Zero.bundle/wiki)*
+--- + **[The future of Sub-Zero](https://www.reddit.com/r/PleX/comments/9n9qjl/subzero_the_future/)** +--- + If you like this, buy me a beer:
[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G9VKR2B8PMNKG)
or become a Patreon starting at **1 $ / month**

or use the OpenSubtitles Sub-Zero affiliate link to become VIP
**10€/year, ad-free subs, 1000 subs/day, no-cache *VIP* server**
## Introduction From 5e4d1cbdabd84ad86a8d919d5d1193cdde85d09d Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 24 Oct 2018 13:44:15 +0200 Subject: [PATCH 242/710] resolve #583 --- Contents/Code/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 4a864d1e7..7e9c642e8 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -288,7 +288,7 @@ def update(self, metadata, media, lang): for video, video_subtitles in downloaded_subtitles.items(): # store item(s) in history for subtitle in video_subtitles: - item_title = get_title_for_video_metadata(video.plexapi_metadata["item"], add_section_title=False) + item_title = get_title_for_video_metadata(video.plexapi_metadata, add_section_title=False) history = get_history() history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], thumb=video.plexapi_metadata["super_thumb"], From 859f21646212368fff6134eca16b780a88e9fd58 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 24 Oct 2018 14:11:49 +0200 Subject: [PATCH 243/710] pass history storage through to agent_extract_embedded; should fix combined extraction+search history entries --- Contents/Code/__init__.py | 11 +++++++---- Contents/Code/interface/menu.py | 6 ++++-- Contents/Code/interface/menu_helpers.py | 11 +++++++++-- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 7e9c642e8..a2fff2291 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -117,7 +117,7 @@ def update_local_media(metadata, media, media_type="movies"): pass -def agent_extract_embedded(video_part_map): +def agent_extract_embedded(video_part_map, history_storage=None): try: subtitle_storage = get_subtitle_storage() @@ -155,7 +155,7 @@ def agent_extract_embedded(video_part_map): if to_extract: Log.Info("Triggering extraction of %d embedded subtitles of %d items", len(to_extract), item_count) Thread.Create(multi_extract_embedded, stream_list=to_extract, refresh=True, with_mods=True, - single_thread=not config.advanced.auto_extract_multithread) + single_thread=not config.advanced.auto_extract_multithread, history_storage=history_storage) except: Log.Error("Something went wrong when auto-extracting subtitles, continuing: %s", traceback.format_exc()) @@ -187,6 +187,7 @@ def update(self, metadata, media, lang): Log.Debug("Sub-Zero %s, %s update called" % (config.version, self.agent_type)) intent = get_intent() + history = get_history() if not media: Log.Error("Called with empty media, something is really wrong with your setup!") @@ -234,7 +235,7 @@ def update(self, metadata, media, lang): # auto extract embedded if config.embedded_auto_extract: if config.plex_transcoder: - agent_extract_embedded(scanned_video_part_map) + agent_extract_embedded(scanned_video_part_map, history_storage=history) else: Log.Warning("Plex Transcoder not found, can't auto extract") @@ -289,7 +290,6 @@ def update(self, metadata, media, lang): # store item(s) in history for subtitle in video_subtitles: item_title = get_title_for_video_metadata(video.plexapi_metadata, add_section_title=False) - history = get_history() history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], thumb=video.plexapi_metadata["super_thumb"], subtitle=subtitle) @@ -304,6 +304,9 @@ def update(self, metadata, media, lang): # update the menu state set_refresh_menu_state(None) + history.destroy() + history = None + # notify any running tasks about our finished update for item_id in item_ids: #scheduler.signal("updated_metadata", item_id) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 2146bfc08..a7d306c20 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -174,7 +174,8 @@ def SeasonExtractEmbedded(**kwargs): return MetadataMenu(randomize=timestamp(), title=item_title, **kwargs) -def multi_extract_embedded(stream_list, refresh=False, with_mods=False, single_thread=True, extract_mode="a"): +def multi_extract_embedded(stream_list, refresh=False, with_mods=False, single_thread=True, extract_mode="a", + history_storage=None): def execute(): for video_part_map, plexapi_part, stream_index, language, set_current in stream_list: plexapi_item = video_part_map.keys()[0].plexapi_metadata["item"] @@ -182,7 +183,8 @@ def execute(): extract_embedded_sub(rating_key=plexapi_item.rating_key, part_id=plexapi_part.id, plex_item=plexapi_item, part=plexapi_part, scanned_videos=video_part_map, stream_index=stream_index, set_current=set_current, - language=language, with_mods=with_mods, refresh=refresh, extract_mode=extract_mode) + language=language, with_mods=with_mods, refresh=refresh, extract_mode=extract_mode, + history_storage=history_storage) if single_thread: with Thread.Lock(key="extract_embedded"): diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 11ee28c97..f17cab40a 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -159,6 +159,7 @@ def extract_embedded_sub(**kwargs): part = kwargs.pop("part", get_part(plex_item, part_id)) scanned_videos = kwargs.pop("scanned_videos", None) extract_mode = kwargs.pop("extract_mode", "a") + history_storage = kwargs.pop("history_storage", None) any_successful = False @@ -209,11 +210,17 @@ def extract_embedded_sub(**kwargs): # add item to history item_title = get_title_for_video_metadata(video.plexapi_metadata, add_section_title=False) - history = get_history() + if history_storage: + history = history_storage + else: + history = get_history() + history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], thumb=video.plexapi_metadata["super_thumb"], subtitle=subtitle, mode=extract_mode) - history.destroy() + + if not history_storage: + history.destroy() any_successful = True From 4d5b0b95831161250b58a9422b3ba1129beac1c3 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 24 Oct 2018 14:44:02 +0200 Subject: [PATCH 244/710] fix include/exclude behaviour; add more verbose include logging --- Contents/Code/__init__.py | 2 +- Contents/Code/support/config.py | 17 ++++++++++++----- Contents/Code/support/items.py | 6 +++--- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index a2fff2291..c9ef9634f 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -204,7 +204,7 @@ def update(self, metadata, media, lang): # media ignored? use_any_parts = False for video in videos: - if not is_wanted(video["id"]): + if not is_wanted(video["id"], item=video["item"]): Log.Debug(u'Skipping "%s"' % video["filename"]) continue use_any_parts = True diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index b078d16d8..a87aa9104 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -196,7 +196,8 @@ def initialize(self): self.normal_subs = Prefs["subtitles.when"] != "Never" self.forced_also = self.normal_subs and Prefs["subtitles.when_forced"] != "Never" self.forced_only = not self.normal_subs and Prefs["subtitles.when_forced"] != "Never" - self.include = Prefs["subtitles.include_exclude_mode"] == "enable SZ for all items by default, use ignore lists" + self.include = \ + Prefs["subtitles.include_exclude_mode"] == "disable SZ for all items by default, use include lists" self.subtitle_destination_folder = self.get_subtitle_destination_folder() self.subtitle_formats = self.get_subtitle_formats() self.max_recent_items_per_library = int_or_default(Prefs["scheduler.max_recent_items_per_library"], 2000) @@ -541,20 +542,26 @@ def get_plugin_info(self): def parse_include_exclude_paths(self): paths = Prefs["subtitles.include_exclude_paths"] - if paths: + if paths and paths != "None": try: - return [path.strip() for path in paths.split(",")] + return [p for p in [path.strip() for path in paths.split(",")] + if p != "None" and os.path.exists(p)] except: Log.Error("Couldn't parse your include/exclude paths settings: %s" % paths) return [] - def is_physically_wanted(self, folder): + def is_physically_wanted(self, folder, ref_fn=None): # check whether we've got an ignore file inside the path ret_val = self.include ref_list = INCLUDE_FN if self.include else EXCLUDE_FN for ifn in ref_list: if os.path.isfile(os.path.join(folder, ifn)): - Log.Info(u'%s "%s" because "%s" exists', "Including" if self.include else "Ignoring", folder, ifn) + if ref_fn: + Log.Info(u'%s "%s" because "%s" exists in "%s"', "Including" if self.include else "Ignoring", + ref_fn, ifn, folder) + else: + Log.Info(u'%s "%s" because "%s" exists', "Including" if self.include else "Ignoring", folder, ifn) + return ret_val return not ret_val diff --git a/Contents/Code/support/items.py b/Contents/Code/support/items.py index 5bba8021e..9db364458 100644 --- a/Contents/Code/support/items.py +++ b/Contents/Code/support/items.py @@ -317,8 +317,8 @@ def is_physically_wanted(fn, kind): wanted_results = [] if config.include_exclude_sz_files: for sub_path in check_paths: - wanted_results.append(config.is_physically_wanted(os.path.normpath(os.path.join(os.path.dirname(fn), - sub_path)))) + wanted_results.append(config.is_physically_wanted( + os.path.normpath(os.path.join(os.path.dirname(fn), sub_path)), fn)) if config.include_exclude_paths: wanted_results.append(config.is_path_wanted(fn)) @@ -328,7 +328,7 @@ def is_physically_wanted(fn, kind): elif not config.include and not all(wanted_results): return False - return True + return not config.include def refresh_item(rating_key, force=False, timeout=8000, refresh_kind=None, parent_rating_key=None): From 6b8cff6dba457f8a21a08c924b5c68142459854b Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 24 Oct 2018 15:31:15 +0200 Subject: [PATCH 245/710] add full soft include/exclude menu handling --- Contents/Code/interface/item_details.py | 6 +- Contents/Code/interface/main.py | 76 +++++++++++++++---------- Contents/Code/interface/menu.py | 21 ++++--- Contents/Code/interface/menu_helpers.py | 27 +++++---- 4 files changed, 79 insertions(+), 51 deletions(-) diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index aacf9fca5..ac57f548a 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -4,7 +4,7 @@ from subzero.language import Language from sub_mod import SubtitleModificationsMenu -from menu_helpers import debounce, SubFolderObjectContainer, default_thumb, add_ignore_options, get_item_task_data, \ +from menu_helpers import debounce, SubFolderObjectContainer, default_thumb, add_incl_excl_options, get_item_task_data, \ set_refresh_menu_state, route, extract_embedded_sub from refresh_item import RefreshItem @@ -33,7 +33,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra :param randomize: :return: """ - from interface.main import IgnoreMenu + from interface.main import InclExclMenu title = unicode(base_title) + " > " + unicode(title) if base_title else unicode(title) item = plex_item = get_item(rating_key) @@ -205,7 +205,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra ignore_title = item_title if current_kind == "episode": ignore_title = get_item_title(item) - add_ignore_options(oc, "videos", title=ignore_title, rating_key=rating_key, callback_menu=IgnoreMenu) + add_incl_excl_options(oc, "videos", title=ignore_title, rating_key=rating_key, callback_menu=InclExclMenu) subtitle_storage.destroy() return oc diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index c635ddeab..b7d1a999a 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -4,9 +4,9 @@ from support.config import config from support.helpers import pad_title, timestamp, df, display_language from support.scheduler import scheduler -from support.ignore import exclude_list +from support.ignore import get_decision_list from support.items import get_item_thumb, get_on_deck_items, get_all_items, get_items_info, get_item, get_item_title -from menu_helpers import main_icon, debounce, SubFolderObjectContainer, default_thumb, dig_tree, add_ignore_options, \ +from menu_helpers import main_icon, debounce, SubFolderObjectContainer, default_thumb, dig_tree, add_incl_excl_options, \ ObjectContainer, route, handler from support.i18n import _ from item_details import ItemDetailsMenu @@ -134,10 +134,15 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r thumb=R("icon-search.jpg") )) + ref_list = get_decision_list() + incl_excl_ref = _("include") if ref_list.store == "include" else _("ignore") + oc.add(DirectoryObject( key=Callback(IgnoreListMenu), - title=_("Display ignore list (%(ignored_count)d)", ignored_count=len(exclude_list)), - summary=_("Show the current ignore list (mainly used for the automatic tasks)"), + title=_("Display %(incl_excl_list_name)s list (%(count)d)", + incl_excl_list_name=incl_excl_ref, count=len(ref_list)), + summary=_("Show the current %(incl_excl_list_name)s list (mainly used for the automatic tasks)", + incl_excl_list_name=incl_excl_ref), thumb=R("icon-ignore.jpg") )) @@ -315,8 +320,8 @@ def determine_section_display(kind, item, pass_kwargs=None): return SectionMenu -@route(PREFIX + '/ignore/set/{kind}/{rating_key}/{todo}/sure={sure}', kind=str, rating_key=str, todo=str, sure=bool) -def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): +@route(PREFIX + '/incl_excl/set/{kind}/{rating_key}/{todo}/sure={sure}', kind=str, rating_key=str, todo=str, sure=bool) +def InclExclMenu(kind, rating_key, title=None, sure=False, todo="not_set"): """ displays the ignore options for a menu :param kind: @@ -326,55 +331,68 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): :param todo: :return: """ - is_ignored = rating_key in exclude_list[kind] + ref_list = get_decision_list() + include = ref_list.store == "include" + list_str_ref = "include" if include else "ignore" + in_list = rating_key in ref_list[kind] + + if include: + # shortcut + sure = True + todo = "add" if not in_list else "remove" + if not sure: t = u"Add %(kind)s %(title)s to the ignore list" - if is_ignored: + if in_list: t = u"Remove %(kind)s %(title)s from the ignore list" oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1=_(t, - kind=exclude_list.verbose(kind), + kind=ref_list.verbose(kind), title=title ), title2=_("Are you sure?")) oc.add(DirectoryObject( - key=Callback(IgnoreMenu, kind=kind, rating_key=rating_key, title=title, sure=True, - todo="add" if not is_ignored else "remove"), + key=Callback(InclExclMenu, kind=kind, rating_key=rating_key, title=title, sure=True, + todo="add" if not in_list else "remove"), title=pad_title(_("Are you sure?")), )) return oc - rel = exclude_list[kind] + rel = ref_list[kind] dont_change = False state = None if todo == "remove": - if not is_ignored: + if not in_list: dont_change = True else: rel.remove(rating_key) - Log.Info("Removed %s (%s) from the ignore list", title, rating_key) - exclude_list.remove_title(kind, rating_key) - exclude_list.save() + Log.Info("Removed %s (%s) from the %s list", title, rating_key, list_str_ref) + ref_list.remove_title(kind, rating_key) + ref_list.save() elif todo == "add": - if is_ignored: + if in_list: dont_change = True else: rel.append(rating_key) - Log.Info("Added %s (%s) to the ignore list", title, rating_key) - exclude_list.add_title(kind, rating_key, title) - exclude_list.save() + Log.Info("Added %s (%s) to the %s list", title, rating_key, list_str_ref) + ref_list.add_title(kind, rating_key, title) + ref_list.save() else: dont_change = True if dont_change: - return fatality(force_title=" ", header=_("Didn't change the ignore list"), no_history=True) + return fatality(force_title=" ", header=_("Didn't change the %(incl_excl_list_name)s list", + incl_excl_list_name=_(list_str_ref)), no_history=True) - t = "%(title)s added to the ignore list" - if todo == "remove": - t = "%(title)s removed from the ignore list" - return fatality(force_title=" ", header=_(t, - title=title,), - no_history=True) + if include: + t = "%(title)s added to the include list" + if todo == "remove": + t = "%(title)s removed from the include list" + else: + t = "%(title)s added to the ignore list" + if todo == "remove": + t = "%(title)s removed from the ignore list" + return fatality(force_title=" ", header=_(t, title=title,), no_history=True) @route(PREFIX + '/sections') @@ -415,7 +433,7 @@ def SectionMenu(rating_key, title=None, base_title=None, section_title=None, ign title = base_title + " > " + title oc = SubFolderObjectContainer(title2=title, no_cache=True, no_history=True) if ignore_options: - add_ignore_options(oc, "sections", title=section_title, rating_key=rating_key, callback_menu=IgnoreMenu) + add_incl_excl_options(oc, "sections", title=section_title, rating_key=rating_key, callback_menu=InclExclMenu) return dig_tree(oc, items, MetadataMenu, pass_kwargs={"base_title": title, "display_items": deeper, "previous_item_type": "section", @@ -443,7 +461,7 @@ def SectionFirstLetterMenu(rating_key, title=None, base_title=None, section_titl title = unicode(title) oc = SubFolderObjectContainer(title2=section_title, no_cache=True, no_history=True) title = base_title + " > " + title - add_ignore_options(oc, "sections", title=section_title, rating_key=rating_key, callback_menu=IgnoreMenu) + add_incl_excl_options(oc, "sections", title=section_title, rating_key=rating_key, callback_menu=InclExclMenu) oc.add(DirectoryObject( key=Callback(SectionMenu, title=_("All"), base_title=title, rating_key=rating_key, ignore_options=False), diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index a7d306c20..6c22bae36 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -11,17 +11,17 @@ from requests import HTTPError from item_details import ItemDetailsMenu from refresh_item import RefreshItem -from menu_helpers import add_ignore_options, dig_tree, set_refresh_menu_state, \ +from menu_helpers import add_incl_excl_options, dig_tree, set_refresh_menu_state, \ default_thumb, debounce, ObjectContainer, SubFolderObjectContainer, route, \ extract_embedded_sub -from main import fatality, IgnoreMenu +from main import fatality, InclExclMenu from advanced import DispatchRestart from subzero.constants import ART, PREFIX, DEPENDENCY_MODULE_NAMES from support.plex_media import get_all_parts, get_embedded_subtitle_streams from support.scheduler import scheduler from support.config import config from support.helpers import timestamp, df, display_language -from support.ignore import exclude_list +from support.ignore import get_decision_list from support.items import get_all_items, get_items_info, get_item_kind_from_rating_key, get_item, MI_KEY, \ get_item_title, get_item_thumb from support.storage import get_subtitle_storage @@ -108,7 +108,7 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p if current_kind in ("series", "season"): item = get_item(rating_key) sub_title = get_item_title(item) - add_ignore_options(oc, current_kind, title=sub_title, rating_key=rating_key, callback_menu=IgnoreMenu) + add_incl_excl_options(oc, current_kind, title=sub_title, rating_key=rating_key, callback_menu=InclExclMenu) # mass-extract embedded if current_kind == "season" and config.plex_transcoder: @@ -223,12 +223,15 @@ def season_extract_embedded(rating_key, requested_language, with_mods=False, for @route(PREFIX + '/ignore_list') def IgnoreListMenu(): - oc = SubFolderObjectContainer(title2="Ignore list", replace_parent=True) - for key in exclude_list.key_order: - values = exclude_list[key] + ref_list = get_decision_list() + include = ref_list.store == "include" + list_title = _("Include list" if include else "Ignore list") + oc = SubFolderObjectContainer(title2=list_title, replace_parent=True) + for key in ref_list.key_order: + values = ref_list[key] for value in values: - add_ignore_options(oc, key, title=exclude_list.get_title(key, value), rating_key=value, - callback_menu=IgnoreMenu) + add_incl_excl_options(oc, key, title=ref_list.get_title(key, value), rating_key=value, + callback_menu=InclExclMenu) return oc diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index f17cab40a..23cc9ad3a 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -13,7 +13,7 @@ from support.helpers import get_video_display_title, pad_title, display_language, quote_args, is_stream_forced, \ get_title_for_video_metadata from support.history import get_history -from support.ignore import exclude_list +from support.ignore import get_decision_list from support.lib import get_intent from support.config import config from subzero.constants import ICON_SUB, ICON @@ -33,7 +33,7 @@ handler = enable_channel_wrapper(handler) -def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None, add_kind=True): +def add_incl_excl_options(oc, kind, callback_menu=None, title=None, rating_key=None, add_kind=True): """ :param oc: oc to add our options to @@ -45,21 +45,28 @@ def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None """ # try to translate kind to the ignore key use_kind = kind - if kind not in exclude_list: - use_kind = exclude_list.translate_key(kind) - if not use_kind or use_kind not in exclude_list: + ref_list = get_decision_list() + if kind not in ref_list: + use_kind = ref_list.translate_key(kind) + if not use_kind or use_kind not in ref_list: return - in_list = rating_key in exclude_list[use_kind] + in_list = rating_key in ref_list[use_kind] + include = ref_list.store == "include" - t = u"Ignore %(kind)s \"%(title)s\"" - if in_list: - t = u"Un-ignore %(kind)s \"%(title)s\"" + if include: + t = u"Enable Sub-Zero for %(kind)s \"%(title)s\"" + if in_list: + t = u"Disable Sub-Zero for %(kind)s \"%(title)s\"" + else: + t = u"Ignore %(kind)s \"%(title)s\"" + if in_list: + t = u"Un-ignore %(kind)s \"%(title)s\"" oc.add(DirectoryObject( key=Callback(callback_menu, kind=use_kind, sure=False, todo="not_set", rating_key=str(rating_key), title=title), title=_(t, - kind=exclude_list.verbose(kind) if add_kind else "", + kind=ref_list.verbose(kind) if add_kind else "", title=unicode(title)) ) ) From 0a49932835c47b0dcecf58c29ea202302fe7d15d Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 24 Oct 2018 15:31:52 +0200 Subject: [PATCH 246/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 58e9a96a4..afbe41d6c 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2774 + 2.6.1.2781 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2774 DEV +Version 2.6.1.2781 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From a8062298483bfb1be9e26b22c8430d1f042e1dfb Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 24 Oct 2018 15:39:52 +0200 Subject: [PATCH 247/710] providers: subscene: use original/sceneName if possible --- .../Libraries/Shared/subliminal_patch/providers/subscene.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 786e5467a..9f00975d6 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -95,7 +95,7 @@ def get_download_link(self, session): def get_video_filename(video): - return os.path.splitext(os.path.basename(video.name))[0] + return os.path.splitext(os.path.basename(video.original_name))[0] class SubsceneProvider(Provider, ProviderSubtitleArchiveMixin): From 1eee95b31a95617a3d8f283eff074bbcae035b8f Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 24 Oct 2018 17:18:06 +0200 Subject: [PATCH 248/710] core: agent: get intent and history storage later --- Contents/Code/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index c9ef9634f..3bb414691 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -186,13 +186,14 @@ def update(self, metadata, media, lang): return Log.Debug("Sub-Zero %s, %s update called" % (config.version, self.agent_type)) - intent = get_intent() - history = get_history() if not media: Log.Error("Called with empty media, something is really wrong with your setup!") return + intent = get_intent() + history = get_history() + item_ids = [] try: config.init_subliminal_patches() From d488361d3fb2ff549c0d67786d1f9fe464709c9e Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 25 Oct 2018 01:43:44 +0200 Subject: [PATCH 249/710] core: archives: explicitly skip forced subtitles if not searched for, when picking from an archive --- .../Libraries/Shared/subliminal_patch/providers/mixins.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/mixins.py b/Contents/Libraries/Shared/subliminal_patch/providers/mixins.py index c33a9b6ae..8e1f06fd4 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/mixins.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/mixins.py @@ -5,6 +5,7 @@ import logging import traceback import types +import os from httplib import ResponseNotReady from guessit import guessit @@ -83,8 +84,14 @@ def get_subtitle_from_archive(self, subtitle, archive): # - episode and season match # - format matches (if it was matched before) # - release group matches (and we asked for one and it was matched, or it was not matched) + # - not asked for forced and "forced" not in filename is_episode = subtitle.asked_for_episode + if not subtitle.language.forced: + base, ext = os.path.splitext(sub_name_lower) + if base.endswith("forced") or "forced" in guess.get("release_group", ""): + continue + episodes = guess.get("episode") if is_episode and episodes and not isinstance(episodes, list): episodes = [episodes] From 06622dba802ee0d0c4394c8eacf862a3efe4842d Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 25 Oct 2018 13:48:16 +0200 Subject: [PATCH 250/710] menu: fix forced language display --- Contents/Code/support/helpers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index e1793615f..1ba8fc133 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -419,7 +419,7 @@ def get_language(lang_short): def display_language(l): - return _(str(l.basename).lower()) + return _(str(l.basename).lower()) + ((u" (%s)" % _("forced")) if l.forced else "") def is_stream_forced(stream): @@ -432,4 +432,4 @@ def is_stream_forced(stream): class PartUnknownException(Exception): - pass \ No newline at end of file + pass From f73acb88f916058187caf20c79b6dbe34b8d5fb6 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 25 Oct 2018 14:02:29 +0200 Subject: [PATCH 251/710] core: include/exclude fix when .nosz or include/exclude paths are off --- Contents/Code/support/items.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/items.py b/Contents/Code/support/items.py index 9db364458..5e57c463e 100644 --- a/Contents/Code/support/items.py +++ b/Contents/Code/support/items.py @@ -241,7 +241,7 @@ def get_recent_items(): Log.Debug(u"Skipping item: %s" % data["title"]) continue if not is_physically_wanted(data["filename"], plex_item_type): - Log.Debug(u"Skipping item: %s" % data["title"]) + Log.Debug(u"Skipping item (physically not wanted): %s" % data["title"]) continue if is_recent(int(data["added"])): @@ -328,7 +328,7 @@ def is_physically_wanted(fn, kind): elif not config.include and not all(wanted_results): return False - return not config.include + return not config.include def refresh_item(rating_key, force=False, timeout=8000, refresh_kind=None, parent_rating_key=None): From cd69d46d1b6af3994d6e9c02bdcd82cfd05302bc Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 25 Oct 2018 14:13:01 +0200 Subject: [PATCH 252/710] core: activities/auto-refresh: fix hybrid-plus for movies --- Contents/Code/support/activities.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/support/activities.py b/Contents/Code/support/activities.py index 18f0fb117..0e4cf42a6 100644 --- a/Contents/Code/support/activities.py +++ b/Contents/Code/support/activities.py @@ -85,7 +85,7 @@ def on_playing(self, info): (rating_key, next_ep.rating_key, int(next_ep.season.index), int(next_ep.index)) else: - if config.activity_mode == "hybrid": + if config.activity_mode in ("hybrid", "hybrid-plus"): keys_to_refresh.append(rating_key) elif config.activity_mode == "refresh": keys_to_refresh.append(rating_key) From 2e0745e1b24e5f5089156f33a3a9eaf1739650f4 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 25 Oct 2018 14:44:04 +0200 Subject: [PATCH 253/710] i18n: update strings --- Contents/Code/interface/main.py | 8 ++++---- Contents/DefaultPrefs.json | 2 +- Contents/Strings/de.json | 34 +++++++++++++++++++++++++++------ Contents/Strings/en.json | 34 +++++++++++++++++++++++++++------ 4 files changed, 61 insertions(+), 17 deletions(-) diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index b7d1a999a..88eb49bbf 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -135,13 +135,13 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r )) ref_list = get_decision_list() - incl_excl_ref = _("include") if ref_list.store == "include" else _("ignore") + incl_excl_ref = _("include list") if ref_list.store == "include" else _("ignore list") oc.add(DirectoryObject( key=Callback(IgnoreListMenu), - title=_("Display %(incl_excl_list_name)s list (%(count)d)", + title=_("Display %(incl_excl_list_name)s (%(count)d)", incl_excl_list_name=incl_excl_ref, count=len(ref_list)), - summary=_("Show the current %(incl_excl_list_name)s list (mainly used for the automatic tasks)", + summary=_("Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)", incl_excl_list_name=incl_excl_ref), thumb=R("icon-ignore.jpg") )) @@ -381,7 +381,7 @@ def InclExclMenu(kind, rating_key, title=None, sure=False, todo="not_set"): dont_change = True if dont_change: - return fatality(force_title=" ", header=_("Didn't change the %(incl_excl_list_name)s list", + return fatality(force_title=" ", header=_("Didn't change the %(incl_excl_list_name)s", incl_excl_list_name=_(list_str_ref)), no_history=True) if include: diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 67ee3dc0c..67a4c9290 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -749,7 +749,7 @@ }, { "id": "subtitles.include_exclude_mode", - "label": "Should SZ be enabled or disabled for by default? (impacts the settings below and the plugin menu)", + "label": "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)", "type": "enum", "values": [ "enable SZ for all items by default, use ignore lists", diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 46a56ec2b..4534d4dca 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -122,7 +122,7 @@ "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Letzter Durchlauf: %s; Nächster geplanter Durchlauf: %s; Letzte Laufzeit: %s", "Search for missing subtitles (in recently-added items, max-age: %s)": "Nach fehlenden Untertiteln suchen (für zuletzt hinzugefügte Medien, maximales Alter: %s)", "Automatically run periodically by the scheduler, if configured. %s": "Automatisch regelmäßig vom Scheduler ausgeführt, wenn konfiguriert. %s", - "Show the current ignore list (mainly used for the automatic tasks)": "Zeige die aktuelle Ignore-Liste (hauptsächlich für Hintergrundaufgaben genutzt)", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "Zeige die aktuelle %(incl_excl_list_name)s (hauptsächlich für Hintergrundaufgaben genutzt)", "History": "Verlauf", "Show the last %i downloaded subtitles": "Zeige die letzten %i heruntergeladenen Untertitel", "Refresh": "Aktualisieren", @@ -137,7 +137,7 @@ "Find recent items with missing subtitles": "Finde zuletzt hinzugefügte Medien mit fehlenden Untertiteln", "Updating, refresh here ...": "Update, hier aktualisieren ...", "Missing: %s": "Fehlt: %s", - "Didn't change the ignore list": "Ignore-Liste wurde nicht verändert", + "Didn't change the %(incl_excl_list_name)s": "%(incl_excl_list_name)s wurde nicht verändert", "Sections": "Bereiche", "All": "Alle", "show": "Serie", @@ -160,7 +160,17 @@ "Subtitle Language (2)": "Untertitel-Sprache (2)", "Subtitle Language (3)": "Untertitel-Sprache (3)", "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "Weitere Untertitel-Sprachen (ISO-639-1 Kodierung benutzen, kommagetrennt)", - "Only download foreign/forced subtitles": "Nur erzwungende/fremdsprachige Untertitel herunterladen", + "Download subtitles": "Untertitel herunterladen", + "Never": "Nie", + "Always": "Immer", + "When main audio stream is not Subtitle Language (1)": "Wenn der Haupt-Audiostream nicht Subtitle Sprache (1) entspricht", + "When main audio stream is not any configured language": "Wenn der Haupt-Audiostream nicht irgendeiner konfigurierten Sprache entspricht", + "When any audio stream is not Subtitle Language (1)": "Wenn keiner der Audiostreams Subtitle Sprache (1) entspricht", + "When any audio stream is not any configured language": "Wenn keiner der Audiostreams irgendeiner konfigurierten Sprache entspricht", + "Download foreign/forced subtitles": "Erzwungende/fremdsprachige Untertitel herunterladen", + "Only for Subtitle Language (1)": "Nur für Untertitel Sprache (1)", + "Only for Subtitle Language (2)": "Nur für Untertitel Sprache (2)", + "Only for Subtitle Language (3)": "Nur für Untertitel Sprache (3)", "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Sprachen mit Landesattribut als ISO 639-1 anzeigen (z. B. pt-BR = pt)", "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Sprachen mit Landesattribut als ISO 639-1 behandeln (pt-BR nicht herunterladen, wenn ein pt Untertitel existiert)", "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Auf eine Sprache beschränken (fügt dem Dateinamen kein \".lang.\"-Suffix hinzu; benutzt nur \"Untertitel Sprache (1)\")", @@ -205,6 +215,7 @@ "Fix common issues in subtitles": "Häufige Probleme in Untertiteln beheben", "Fix common OCR errors in downloaded subtitles": "Häufige Texterkennungsfehler in Untertiteln beheben", "Reverse punctuation in RTL languages (heb, ara, fas)": "Zeichensetzung in linksläufigen Schriften umkehren (heb, ara, fas)", + "Fix only uppercase downloaded subtitles": "Nur-Großschreibung in Untertiteln beheben", "Change colors of subtitles to": "Farbe der Untertitel ändern zu", "Store subtitles next to media files (instead of metadata)": "Speichere Untertitel neben den Medien (anstatt im Metadatenspeicher)", "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Zu speichernde Untertitelformate (Nicht-SRT funktioniert nur, wenn die vorherige Option aktiv ist)", @@ -224,8 +235,11 @@ "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Hintergrundaufgaben: Untertitel mit Nicht-Standard-Modifikationen überschreiben, wenn bessere gefunden wurden", "History: amount of items to store historical data for": "Verlauf: Anzahl der Elemente", "How many download tries per subtitle (on timeout or error)": "Wie oft soll der Download pro Untertitel versucht werden (bei Fehlern)", - "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "Ignoriere Ordner mit \"subzero.ignore/.subzero.ignore/.nosz\"-Dateien", - "Ignore anything in the following paths (comma-separated)": "Ignoriere folgende Pfade", + "Should SZ be enabled or disabled for by default? (impacts the settings below and the plugin menu)": "Soll SZ standardmäßig aktiviert oder deaktiviert sein? (Beeinflusst Einstellungen und Menü)", + "enable SZ for all items by default, use ignore lists": "SZ standardmäßig für alle Medien aktivieren, benutze Ignore-Listen", + "disable SZ for all items by default, use include lists": "SZ standardmäßig für alle Medien deaktivieren, benutze Include-Listen", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (exclude) or \"subzero.include/.subzero.include/.sz\" (include) files inside folders": "Benutze \"subzero.ignore/.subzero.ignore/.nosz\" (ausschl.) oder \"subzero.include/.subzero.include/.sz\" (einschl.) Dateien in Ordnern", + "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "Aktiviere/deaktiviere Sub-Zero für folgende Pfade (kommasepariert; siehe Einstellung oben)", "Sub-Zero mode": "Sub-Zero Modus", "Access PIN (any amount of numbers, 0-9)": "Zugriffs-PIN (beliebige Anzahl Zahlen, 0-9)", "Access PIN valid for minutes": "Zugriffs-PIN gültig für Minuten", @@ -342,7 +356,11 @@ "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (hinzugefügt: %(date_added)s, %(mode)s), Sprache: %(language)s, Punktzahl: %(score)i, Speicher: %(storage_type)s", "Insufficient permissions on library %(title)s, folder: %(path)s": "Ungenügende Berechtigungen der Bibliothek %(title)s, Ordner: %(path)s", "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Läuft: %(items_done)s/%(items_searching)s (%(percentage)s%%)", - "Display ignore list (%(ignored_count)d)": "Ignore-Liste anzeigen (%(ignored_count)d)", + "Display %(incl_excl_list_name)s (%(count)d)": "%(incl_excl_list_name)s anzeigen (%(count)d)", + "include list": "Include-Liste", + "ignore list": "Ignore-Liste", + "Include list": "Include-Liste", + "Ignore list": "Ignore-Liste", "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s bis %(until_date)s (%(reason)s)", "Extracting subtitle %(stream_index)s of %(filename)s": "Extrahiere Untertitel %(stream_index)s von %(filename)s", "Extract missing %(language)s embedded subtitles": "%(language)s: Extrahiere fehlende, eingebettete Untertitel", @@ -363,12 +381,16 @@ "Remove %(kind)s %(title)s from the ignore list": "Entferne %(kind)s %(title)s von der Ignore-Liste", "%(title)s added to the ignore list": "%(title)s zur Ignore-Liste hinzugefügt", "%(title)s removed from the ignore list": "%(title)s von der Ignore-Liste entfernt", + "%(title)s added to the include list":"%(title)s zur Include-Liste hinzugefügt", + "%(title)s removed from the include list":"%(title)s von der Include-Liste entfernt", "Triggering refresh for %(title)s": "Stoße Aktualisierung an, für: %(title)s", "Triggering forced refresh for %(title)s": "Stoße erzwungene Aktualisieren an, für %(title)s", "Refresh of item %(item_id)s triggered": "Aktualisierung von %(item_id)s angestoßen", "Forced refresh of item %(item_id)s triggered": "Erzwungene Aktualisierung von %(item_id)s angestoßen", "Ignore %(kind)s \"%(title)s\"": "%(kind)s \"%(title)s\" ignorieren", "Un-ignore %(kind)s \"%(title)s\"": "%(kind)s \"%(title)s\" nicht mehr ignorieren", + "Enable Sub-Zero for %(kind)s \"%(title)s\"": "Aktiviere Sub-Zero für %(kind)s \"%(title)s\"", + "Disable Sub-Zero for %(kind)s \"%(title)s\"": "Deaktiviere Sub-Zero für %(kind)s \"%(title)s\"", "Refreshing %(title)s": "Aktualisiere %(title)s", "Force-refreshing %(title)s": "Erzwinge Aktualisierung von %(title)s", "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Extrahiert die noch nicht extrahierten, eingebetteten Untertitel aller Episoden der aktuellen Staffel, mit allen konfigurierten Standard-Modifikationen", diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 6620d4518..994cf8cc7 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -163,8 +163,12 @@ "Last run: %s; Next scheduled run: %s; Last runtime: %s":"Last run: %s; Next scheduled run: %s; Last runtime: %s", "Search for missing subtitles (in recently-added items, max-age: %s)":"Search for missing subtitles (in recently-added items, max-age: %s)", "Automatically run periodically by the scheduler, if configured. %s":"Automatically run periodically by the scheduler, if configured. %s", - "Display ignore list (%(ignored_count)d)":"Display ignore list (%(ignored_count)d)", - "Show the current ignore list (mainly used for the automatic tasks)":"Show the current ignore list (mainly used for the automatic tasks)", + "Display %(incl_excl_list_name)s (%(count)d)":"Display %(incl_excl_list_name)s list (%(count)d)", + "include list": "include list", + "ignore list": "ignore list" + "Include list": "Include list", + "Ignore list": "Ignore list", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)":"Show the current %(incl_excl_list_name)s list (mainly used for the automatic tasks)", "History":"History", "Show the last %i downloaded subtitles":"Show the last %i downloaded subtitles", "Refresh":"Refresh", @@ -182,13 +186,17 @@ "Missing: %s":"Missing: %s", "Add %(kind)s %(title)s to the ignore list":"Add %(kind)s %(title)s to the ignore list", "Remove %(kind)s %(title)s from the ignore list":"Remove %(kind)s %(title)s from the ignore list", - "Didn't change the ignore list":"Didn't change the ignore list", + "Didn't change the %(incl_excl_list_name)s":"Didn't change the %(incl_excl_list_name)s", "%(title)s added to the ignore list":"%(title)s added to the ignore list", "%(title)s removed from the ignore list":"%(title)s removed from the ignore list", + "%(title)s added to the include list":"%(title)s added to the include list", + "%(title)s removed from the include list":"%(title)s removed from the include list", "Sections":"Sections", "All":"All", "Ignore %(kind)s \"%(title)s\"":"Ignore %(kind)s \"%(title)s\"", "Un-ignore %(kind)s \"%(title)s\"":"Un-ignore %(kind)s \"%(title)s\"", + "Enable Sub-Zero for %(kind)s \"%(title)s\"": "Enable Sub-Zero for %(kind)s \"%(title)s\"", + "Disable Sub-Zero for %(kind)s \"%(title)s\"": "Disable Sub-Zero for %(kind)s \"%(title)s\"", "show":"show", "movie":"movie", "Refreshing %(title)s":"Refreshing %(title)s", @@ -227,7 +235,17 @@ "Subtitle Language (2)":"Subtitle Language (2)", "Subtitle Language (3)":"Subtitle Language (3)", "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)":"Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)", - "Only download foreign/forced subtitles":"Only download foreign/forced subtitles", + "Download subtitles":"Download subtitles", + "Never": "Never", + "Always": "Always", + "When main audio stream is not Subtitle Language (1)": "When main audio stream is not Subtitle Language (1)", + "When main audio stream is not any configured language": "When main audio stream is not any configured language", + "When any audio stream is not Subtitle Language (1)": "When any audio stream is not Subtitle Language (1)", + "When any audio stream is not any configured language": "When any audio stream is not any configured language", + "Download foreign/forced subtitles": "Download foreign/forced subtitles", + "Only for Subtitle Language (1)": "Only for Subtitle Language (1)", + "Only for Subtitle Language (2)": "Only for Subtitle Language (2)", + "Only for Subtitle Language (3)": "Only for Subtitle Language (3)", "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)":"Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)":"Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)", "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")":"Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")", @@ -272,6 +290,7 @@ "Fix common issues in subtitles":"Fix common issues in subtitles", "Fix common OCR errors in downloaded subtitles":"Fix common OCR errors in downloaded subtitles", "Reverse punctuation in RTL languages (heb, ara, fas)":"Reverse punctuation in RTL languages (heb, ara, fas)", + "Fix only uppercase downloaded subtitles": "Fix only uppercase downloaded subtitles", "Change colors of subtitles to":"Change colors of subtitles to", "Store subtitles next to media files (instead of metadata)":"Store subtitles next to media files (instead of metadata)", "Subtitle formats to save (non-SRT only works if the previous option is enabled)":"Subtitle formats to save (non-SRT only works if the previous option is enabled)", @@ -291,8 +310,11 @@ "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found":"Scheduler: Overwrite subtitles with non-default subtitle modifications when better found", "History: amount of items to store historical data for":"History: amount of items to store historical data for", "How many download tries per subtitle (on timeout or error)":"How many download tries per subtitle (on timeout or error)", - "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)":"Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)", - "Ignore anything in the following paths (comma-separated)":"Ignore anything in the following paths (comma-separated)", + "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)", + "enable SZ for all items by default, use ignore lists": "enable SZ for all items by default, use ignore lists", + "disable SZ for all items by default, use include lists": "disable SZ for all items by default, use include lists", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (exclude) or \"subzero.include/.subzero.include/.sz\" (include) files inside folders": "Use \"subzero.ignore/.subzero.ignore/.nosz\" (exclude) or \"subzero.include/.subzero.include/.sz\" (include) files inside folders", + "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)":"Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)", "Sub-Zero mode":"Sub-Zero mode", "Access PIN (any amount of numbers, 0-9)":"Access PIN (any amount of numbers, 0-9)", "Access PIN valid for minutes":"Access PIN valid for minutes", From cd9a1402cb994fd9d551c69bd25664c115a167de Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 25 Oct 2018 14:46:24 +0200 Subject: [PATCH 254/710] i18n: update strings --- Contents/Strings/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 4534d4dca..c69e6bead 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -235,7 +235,7 @@ "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Hintergrundaufgaben: Untertitel mit Nicht-Standard-Modifikationen überschreiben, wenn bessere gefunden wurden", "History: amount of items to store historical data for": "Verlauf: Anzahl der Elemente", "How many download tries per subtitle (on timeout or error)": "Wie oft soll der Download pro Untertitel versucht werden (bei Fehlern)", - "Should SZ be enabled or disabled for by default? (impacts the settings below and the plugin menu)": "Soll SZ standardmäßig aktiviert oder deaktiviert sein? (Beeinflusst Einstellungen und Menü)", + "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "Soll SZ standardmäßig aktiviert oder deaktiviert sein? (Beeinflusst Einstellungen und Menü)", "enable SZ for all items by default, use ignore lists": "SZ standardmäßig für alle Medien aktivieren, benutze Ignore-Listen", "disable SZ for all items by default, use include lists": "SZ standardmäßig für alle Medien deaktivieren, benutze Include-Listen", "Use \"subzero.ignore/.subzero.ignore/.nosz\" (exclude) or \"subzero.include/.subzero.include/.sz\" (include) files inside folders": "Benutze \"subzero.ignore/.subzero.ignore/.nosz\" (ausschl.) oder \"subzero.include/.subzero.include/.sz\" (einschl.) Dateien in Ordnern", From 36c6742532a02daf0c2c2a4ef468ace5ec8c0cf7 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 25 Oct 2018 15:06:56 +0200 Subject: [PATCH 255/710] i18n: add/update strings --- Contents/Code/interface/advanced.py | 2 +- Contents/Code/interface/item_details.py | 14 +++++++------- Contents/Code/interface/menu.py | 2 +- Contents/DefaultPrefs.json | 8 ++++---- Contents/Strings/de.json | 17 +++++++++++++---- Contents/Strings/en.json | 17 +++++++++++++---- 6 files changed, 39 insertions(+), 21 deletions(-) diff --git a/Contents/Code/interface/advanced.py b/Contents/Code/interface/advanced.py index 4cf5a9a71..ba47b0955 100644 --- a/Contents/Code/interface/advanced.py +++ b/Contents/Code/interface/advanced.py @@ -103,7 +103,7 @@ def AdvancedMenu(randomize=None, header=None, message=None): )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="menu_history", randomize=timestamp()), - title=pad_title("Reset the plugin's menu history storage"), + title=pad_title(_("Reset the plugin's menu history storage")), )) oc.add(DirectoryObject( key=Callback(InvalidateCache, randomize=timestamp()), diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index ac57f548a..60d734a60 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -142,9 +142,9 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra summary = _(u"%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, " u"%(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", part_summary=part_summary_addon, - provider_name=current_sub.provider_name, + provider_name=_(current_sub.provider_name), date_added=df(current_sub.date_added), - mode=current_sub.mode_verbose, + mode=_(current_sub.mode_verbose), language=display_language(lang), score=current_sub.score, storage_type=current_sub.storage_type) @@ -289,7 +289,7 @@ def ListStoredSubsForItemMenu(**kwargs): summary = _(u"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: " u"%(storage_type)s", date_added=df(subtitle.date_added), - mode=subtitle.mode_verbose, + mode=_(subtitle.mode_verbose), language=display_language(language), score=subtitle.score, storage_type=subtitle.storage_type) @@ -459,10 +459,10 @@ def sorter(pair): provider_name, subtitle_id = sub_key title = _(u"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, " u"Score: %(score)i, Storage: %(storage_type)s", - provider_name=provider_name, + provider_name=_(provider_name), subtitle_id=subtitle_id, date_added=df(data["date_added"]), - mode=current_sub.get_mode_verbose(data["mode"]), + mode=_(current_sub.get_mode_verbose(data["mode"])), language=display_language(Language.fromietf(language)), score=data["score"], storage_type=data["storage_type"]) @@ -521,7 +521,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item video_display_data = metadata["filename"] current_display = (_(u"Current: %(provider_name)s (%(score)s) ", - provider_name=current_provider, + provider_name=_(current_provider), score=current_score if current_provider else "")) if not running: oc.add(DirectoryObject( @@ -592,7 +592,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item title=_(u"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", blacklisted_state=bl_addon, current_state=_("Available") if current_id != subtitle.id else _("Current"), - provider_name=subtitle.provider_name, + provider_name=_(subtitle.provider_name), score=subtitle.score, wrong_fps_state=wrong_fps_addon), summary=_(u"Release: %(release_info)s, Matches: %(matches)s", diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 6c22bae36..dca7da450 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -250,7 +250,7 @@ def HistoryMenu(): rating_key=item.rating_key), title=u"%s (%s)" % (item.item_title, item.mode_verbose), summary=_(u"%s in %s (%s, score: %s), %s", language_display, item.section_title, - item.provider_name, item.score, df(item.time)), + _(item.provider_name), item.score, df(item.time)), thumb=item.thumb or default_thumb )) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 67a4c9290..577c11c34 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -752,10 +752,10 @@ "label": "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)", "type": "enum", "values": [ - "enable SZ for all items by default, use ignore lists", - "disable SZ for all items by default, use include lists" + "enable SZ for all items by default, use ignore mode", + "disable SZ for all items by default, use include mode" ], - "default": "enable SZ for all items by default, use ignore lists" + "default": "enable SZ for all items by default, use ignore mode" }, { "id": "subtitles.include_exclude_paths", @@ -765,7 +765,7 @@ }, { "id": "subtitles.include_exclude_fs", - "label": "Use \"subzero.ignore/.subzero.ignore/.nosz\" (exclude) or \"subzero.include/.subzero.include/.sz\" (include) files inside folders", + "label": "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders", "type": "bool", "default": "false" }, diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index c69e6bead..341c3a2be 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -66,6 +66,7 @@ "Log the plugin's complete state storage": "Den kompletten internen State-Speicher protokollieren", "Reset the plugin's scheduled tasks state storage": "Den Geplante-Aufgaben-Status-Speicher zurücksetzen", "Reset the plugin's internal ignorelist storage": "Den internen Ignore-Listen-Speicher zurücksetzen", + "Reset the plugin's menu history storage": "Den internen Menühistorie-Speicher zurücksetzen", "Invalidate Sub-Zero metadata caches (subliminal)": "Die Sub-Zero Metadaten-Caches invalidieren (subliminal)", "Reset provider throttle states": "Den Anbieter-Drosselungsstatus zurücksetzen", "Restarting the plugin": "Starte das Plugin neu", @@ -236,9 +237,9 @@ "History: amount of items to store historical data for": "Verlauf: Anzahl der Elemente", "How many download tries per subtitle (on timeout or error)": "Wie oft soll der Download pro Untertitel versucht werden (bei Fehlern)", "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "Soll SZ standardmäßig aktiviert oder deaktiviert sein? (Beeinflusst Einstellungen und Menü)", - "enable SZ for all items by default, use ignore lists": "SZ standardmäßig für alle Medien aktivieren, benutze Ignore-Listen", - "disable SZ for all items by default, use include lists": "SZ standardmäßig für alle Medien deaktivieren, benutze Include-Listen", - "Use \"subzero.ignore/.subzero.ignore/.nosz\" (exclude) or \"subzero.include/.subzero.include/.sz\" (include) files inside folders": "Benutze \"subzero.ignore/.subzero.ignore/.nosz\" (ausschl.) oder \"subzero.include/.subzero.include/.sz\" (einschl.) Dateien in Ordnern", + "enable SZ for all items by default, use ignore mode": "SZ standardmäßig für alle Medien aktivieren, benutze Ignore-Modus", + "disable SZ for all items by default, use include mode": "SZ standardmäßig für alle Medien deaktivieren, benutze Include-Modus", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "Benutze \"subzero.ignore/.subzero.ignore/.nosz\" (Ignore-Modus) oder \"subzero.include/.subzero.include/.sz\" (Include-Modus) Dateien in Ordnern", "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "Aktiviere/deaktiviere Sub-Zero für folgende Pfade (kommasepariert; siehe Einstellung oben)", "Sub-Zero mode": "Sub-Zero Modus", "Access PIN (any amount of numbers, 0-9)": "Zugriffs-PIN (beliebige Anzahl Zahlen, 0-9)", @@ -331,6 +332,8 @@ "%(part_summary)sManage %(language)s subtitle": "%(part_summary)s%(language)s: Untertitel verwalten", "%(part_summary)sList %(language)s subtitles": "%(part_summary)s%(language)s: Untertitel auflisten", "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sEingebettete Untertitel (%(languages)s)", + "%s in %s (%s, score: %s), %s": "%s in %s (%s, Punktzahl: %s), %s", + "Extract embedded subtitle streams": "Eingebettete Untertitel extrahieren", "Select active %(language)s subtitle": "%(language)s: Aktiven Untertitel auswählen", "%(count)d subtitles in storage": "%(count)d Untertitel im Speicher", "List available %(language)s subtitles": "%(language)s: Verfügbare Untertitel auflisten", @@ -400,6 +403,7 @@ "the series": "die Serie", "the episode": "die Episode", "the season": "die Staffel", + "forced": "erzwungen", "Change the color of the subtitle": "Untertitel-Farben ändern", "Adds the requested color to every line of the subtitle. Support depends on player.": "Fügt die gewählte Farbe zu jeder Untertitelzeile hinzu. Wird nicht von jedem Abspielgerät unterstützt", "Basic common fixes": "Behebe häufige Probleme in Untertiteln", @@ -420,5 +424,10 @@ "Current": "Aktuell", "Custom path to advanced_settings.json": "Spezifischer Pfad zu advanced_settings.json", "zh-hant": "Chinesisch (traditionell)", - "zh-hans": "Chinesisch (vereinfacht)" + "zh-hans": "Chinesisch (vereinfacht)", + "auto": "auto", + "manual": "manuell", + "auto-better": "auto-besser", + "Unknown": "Unbekannt", + "embedded": "eingebettet" } \ No newline at end of file diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 994cf8cc7..dc4df4074 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -68,6 +68,7 @@ "Log the plugin's complete state storage":"Log the plugin's complete state storage", "Reset the plugin's scheduled tasks state storage":"Reset the plugin's scheduled tasks state storage", "Reset the plugin's internal ignorelist storage":"Reset the plugin's internal ignorelist storage", + "Reset the plugin's menu history storage": "Reset the plugin's menu history storage", "Invalidate Sub-Zero metadata caches (subliminal)":"Invalidate Sub-Zero metadata caches (subliminal)", "Reset provider throttle states":"Reset provider throttle states", "Restarting the plugin":"Restarting the plugin", @@ -104,6 +105,7 @@ "the series":"the series", "the episode":"the episode", "the season":"the season", + "forced": "forced", "Force-find subtitles: %(item_title)s":"Force-find subtitles: %(item_title)s", "Issues a forced refresh, ignoring known subtitles and searching for new ones":"Issues a forced refresh, ignoring known subtitles and searching for new ones", "File %(file_part_index)s: ":"File %(file_part_index)s: ", @@ -112,6 +114,8 @@ "%(part_summary)sManage %(language)s subtitle":"%(part_summary)sManage %(language)s subtitle", "%(part_summary)sList %(language)s subtitles":"%(part_summary)sList %(language)s subtitles", "%(part_summary)sEmbedded subtitles (%(languages)s)":"%(part_summary)sEmbedded subtitles (%(languages)s)", + "%s in %s (%s, score: %s), %s": "%s in %s (%s, score: %s), %s", + "Extract embedded subtitle streams": "Extract embedded subtitle streams", "Extract and activate embedded subtitle streams":"Extract and activate embedded subtitle streams", "Select active %(language)s subtitle":"Select active %(language)s subtitle", "%(count)d subtitles in storage":"%(count)d subtitles in storage", @@ -311,9 +315,9 @@ "History: amount of items to store historical data for":"History: amount of items to store historical data for", "How many download tries per subtitle (on timeout or error)":"How many download tries per subtitle (on timeout or error)", "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)", - "enable SZ for all items by default, use ignore lists": "enable SZ for all items by default, use ignore lists", - "disable SZ for all items by default, use include lists": "disable SZ for all items by default, use include lists", - "Use \"subzero.ignore/.subzero.ignore/.nosz\" (exclude) or \"subzero.include/.subzero.include/.sz\" (include) files inside folders": "Use \"subzero.ignore/.subzero.ignore/.nosz\" (exclude) or \"subzero.include/.subzero.include/.sz\" (include) files inside folders", + "enable SZ for all items by default, use ignore mode": "enable SZ for all items by default, use ignore mode", + "disable SZ for all items by default, use include mode": "disable SZ for all items by default, use include mode", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders", "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)":"Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)", "Sub-Zero mode":"Sub-Zero mode", "Access PIN (any amount of numbers, 0-9)":"Access PIN (any amount of numbers, 0-9)", @@ -420,5 +424,10 @@ "Adds or substracts a certain amount of time from the whole subtitle to match your media":"Adds or substracts a certain amount of time from the whole subtitle to match your media", "Available":"Available", "Current":"Current", - "Custom path to advanced_settings.json":"Custom path to advanced_settings.json" + "Custom path to advanced_settings.json":"Custom path to advanced_settings.json", + "auto": "auto", + "manual": "manual", + "auto-better": "auto-better", + "Unknown": "Unknown", + "embedded": "embedded" } From 1479c6ebc5df145d7104b740cd95345042286b23 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 25 Oct 2018 15:12:49 +0200 Subject: [PATCH 256/710] menu: fix order of embedded subtitle streams in item detail --- Contents/Code/interface/item_details.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index 60d734a60..a6e19aec4 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -1,6 +1,8 @@ # coding=utf-8 import os +from collections import OrderedDict + from subzero.language import Language from sub_mod import SubtitleModificationsMenu @@ -198,7 +200,8 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra randomize=timestamp()), title=_(u"%(part_summary)sEmbedded subtitles (%(languages)s)", part_summary=part_index_addon, - languages=", ".join(display_language(l) for l in set(embedded_langs))), + languages=", ".join(display_language(l) + for l in list(OrderedDict.fromkeys(embedded_langs)))), summary=_(u"Extract embedded subtitle streams") )) From b9024945beb475f2ebc8f1811b6ec4039cf79856 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 25 Oct 2018 15:13:59 +0200 Subject: [PATCH 257/710] menu: history: translate item mode as well --- Contents/Code/interface/menu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index dca7da450..1d7f84cec 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -248,7 +248,7 @@ def HistoryMenu(): oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, title=item.title, item_title=item.item_title, rating_key=item.rating_key), - title=u"%s (%s)" % (item.item_title, item.mode_verbose), + title=u"%s (%s)" % (item.item_title, _(item.mode_verbose)), summary=_(u"%s in %s (%s, score: %s), %s", language_display, item.section_title, _(item.provider_name), item.score, df(item.time)), thumb=item.thumb or default_thumb From 5c887e1d9d4a6ffc8ffb0be818d6d4e19ab4eea0 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 25 Oct 2018 15:17:05 +0200 Subject: [PATCH 258/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index afbe41d6c..9d511976c 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2781 + 2.6.1.2793 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2781 DEV +Version 2.6.1.2793 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From bba95401bbebab11130dc63f12a64a151b66f4ac Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 25 Oct 2018 15:18:10 +0200 Subject: [PATCH 259/710] i18n: fix missing comma --- Contents/Strings/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index dc4df4074..96b72a306 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -169,7 +169,7 @@ "Automatically run periodically by the scheduler, if configured. %s":"Automatically run periodically by the scheduler, if configured. %s", "Display %(incl_excl_list_name)s (%(count)d)":"Display %(incl_excl_list_name)s list (%(count)d)", "include list": "include list", - "ignore list": "ignore list" + "ignore list": "ignore list", "Include list": "Include list", "Ignore list": "Ignore list", "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)":"Show the current %(incl_excl_list_name)s list (mainly used for the automatic tasks)", From c4a79c0e3767d7b9b85ca4ef1f99ea084e00cd88 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 26 Oct 2018 03:37:19 +0200 Subject: [PATCH 260/710] core: add furl==2.0.0 --- Contents/Libraries/Shared/furl/__init__.py | 20 + Contents/Libraries/Shared/furl/common.py | 24 + Contents/Libraries/Shared/furl/compat.py | 37 + Contents/Libraries/Shared/furl/furl.py | 1807 ++++++++++++++++++++ Contents/Libraries/Shared/furl/omdict1D.py | 112 ++ 5 files changed, 2000 insertions(+) create mode 100644 Contents/Libraries/Shared/furl/__init__.py create mode 100644 Contents/Libraries/Shared/furl/common.py create mode 100644 Contents/Libraries/Shared/furl/compat.py create mode 100644 Contents/Libraries/Shared/furl/furl.py create mode 100644 Contents/Libraries/Shared/furl/omdict1D.py diff --git a/Contents/Libraries/Shared/furl/__init__.py b/Contents/Libraries/Shared/furl/__init__.py new file mode 100644 index 000000000..cf944eeb4 --- /dev/null +++ b/Contents/Libraries/Shared/furl/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- + +# +# furl - URL manipulation made simple. +# +# Ansgar Grunseid +# grunseid.com +# grunseid@gmail.com +# +# License: Build Amazing Things (Unlicense) +# + +from .furl import * # noqa + +__title__ = 'furl' +__version__ = '2.0.0' +__license__ = 'Unlicense' +__author__ = 'Ansgar Grunseid' +__contact__ = 'grunseid@gmail.com' +__url__ = 'https://github.com/gruns/furl' diff --git a/Contents/Libraries/Shared/furl/common.py b/Contents/Libraries/Shared/furl/common.py new file mode 100644 index 000000000..748c38058 --- /dev/null +++ b/Contents/Libraries/Shared/furl/common.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +# +# furl - URL manipulation made simple. +# +# Ansgar Grunseid +# grunseid.com +# grunseid@gmail.com +# +# License: Build Amazing Things (Unlicense) +# + +from .compat import string_types + + +absent = object() + + +def callable_attr(obj, attr): + return hasattr(obj, attr) and callable(getattr(obj, attr)) + + +def is_iterable_but_not_string(v): + return callable_attr(v, '__iter__') and not isinstance(v, string_types) diff --git a/Contents/Libraries/Shared/furl/compat.py b/Contents/Libraries/Shared/furl/compat.py new file mode 100644 index 000000000..266881f4b --- /dev/null +++ b/Contents/Libraries/Shared/furl/compat.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- + +# +# furl - URL manipulation made simple. +# +# Ansgar Grunseid +# grunseid.com +# grunseid@gmail.com +# +# License: Build Amazing Things (Unlicense) +# + +import sys + + +if sys.version_info[0] == 2: + string_types = basestring # noqa +else: + string_types = (str, bytes) + + +if list(sys.version_info[:2]) >= [2, 7]: + from collections import OrderedDict # noqa +else: + from ordereddict import OrderedDict # noqa + + +class UnicodeMixin(object): + """ + Mixin that defines proper __str__/__unicode__ methods in Python 2 or 3. + """ + if sys.version_info[0] >= 3: # Python 3 + def __str__(self): + return self.__unicode__() + else: # Python 2 + def __str__(self): + return self.__unicode__().encode('utf8') diff --git a/Contents/Libraries/Shared/furl/furl.py b/Contents/Libraries/Shared/furl/furl.py new file mode 100644 index 000000000..cf4bbbdb3 --- /dev/null +++ b/Contents/Libraries/Shared/furl/furl.py @@ -0,0 +1,1807 @@ +# -*- coding: utf-8 -*- + +# +# furl - URL manipulation made simple. +# +# Ansgar Grunseid +# grunseid.com +# grunseid@gmail.com +# +# License: Build Amazing Things (Unlicense) +# + +import re +import abc +import warnings +from posixpath import normpath + +import six +from six.moves import urllib +from six.moves.urllib.parse import quote, unquote +try: + from icecream import ic +except ImportError: # Graceful fallback if IceCream isn't installed. + ic = lambda *a: None if not a else (a[0] if len(a) == 1 else a) # noqa + +from .omdict1D import omdict1D +from .compat import string_types, UnicodeMixin +from .common import ( + callable_attr, is_iterable_but_not_string, absent as _absent) + + +# Map of common protocols, as suggested by the common protocols included in +# urllib/parse.py, to their default ports. Protocol scheme strings are +# lowercase. +DEFAULT_PORTS = { + 'ws': 80, + 'ftp': 21, + 'git': 9418, + 'hdl': 2641, + 'nfs': 111, + 'sip': 5060, + 'ssh': 22, + 'svn': 3690, + 'wss': 443, + 'http': 80, + 'imap': 143, + 'nntp': 119, + 'sftp': 22, + 'sips': 5061, + 'tftp': 69, + 'rtsp': 554, + 'wais': 210, + 'https': 443, + 'rsync': 873, + 'rtspu': 5004, + 'snews': 563, + 'gopher': 70, + 'telnet': 23, + 'prospero': 191, +} + + +def lget(l, index, default=None): + try: + return l[index] + except IndexError: + return default + + +def attemptstr(o): + try: + return str(o) + except Exception: + return o + + +def utf8(o, default=_absent): + try: + return o.encode('utf8') + except Exception: + return o if default is _absent else default + + +def non_string_iterable(o): + return callable_attr(o, '__iter__') and not isinstance(o, string_types) + + +# TODO(grun): Support IDNA2008 via the third party idna module. See +# https://github.com/gruns/furl/issues/73. +def idna_encode(o): + if callable_attr(o, 'encode'): + return str(o.encode('idna').decode('utf8')) + return o + + +def idna_decode(o): + if callable_attr(utf8(o), 'decode'): + return utf8(o).decode('idna') + return o + + +def is_valid_port(port): + port = str(port) + if not port.isdigit() or not 0 < int(port) <= 65535: + return False + return True + + +def static_vars(**kwargs): + def decorator(func): + for key, value in six.iteritems(kwargs): + setattr(func, key, value) + return func + return decorator + + +# +# TODO(grun): Update some of the regex functions below to reflect the fact that +# the valid encoding of Path segments differs slightly from the valid encoding +# of Fragment Path segments. Similarly, the valid encodings of Query keys and +# values differ slightly from the valid encodings of Fragment Query keys and +# values. +# +# For example, '?' and '#' don't need to be encoded in Fragment Path segments +# but they must be encoded in Path segments. Similarly, '#' doesn't need to be +# encoded in Fragment Query keys and values, but must be encoded in Query keys +# and values. +# +# Perhaps merge them with URLPath, FragmentPath, URLQuery, and +# FragmentQuery when those new classes are created (see the TODO +# currently at the top of the source, 02/03/2012). +# + +# RFC 3986 (https://www.ietf.org/rfc/rfc3986.txt) +# +# unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" +# +# pct-encoded = "%" HEXDIG HEXDIG +# +# sub-delims = "!" / "$" / "&" / "'" / "(" / ")" +# / "*" / "+" / "," / ";" / "=" +# +# pchar = unreserved / pct-encoded / sub-delims / ":" / "@" +# +# === Path === +# segment = *pchar +# +# === Query === +# query = *( pchar / "/" / "?" ) +# +# === Scheme === +# scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) +# +PERCENT_REGEX = r'\%[a-fA-F\d][a-fA-F\d]' +INVALID_HOST_CHARS = '!@#$%^&\'\"*()+=:;/' + + +@static_vars(regex=re.compile( + r'^([\w%s]|(%s))*$' % (re.escape('-.~:@!$&\'()*+,;='), PERCENT_REGEX))) +def is_valid_encoded_path_segment(segment): + return is_valid_encoded_path_segment.regex.match(segment) is not None + + +@static_vars(regex=re.compile( + r'^([\w%s]|(%s))*$' % (re.escape('-.~:@!$&\'()*+,;/?'), PERCENT_REGEX))) +def is_valid_encoded_query_key(key): + return is_valid_encoded_query_key.regex.match(key) is not None + + +@static_vars(regex=re.compile( + r'^([\w%s]|(%s))*$' % (re.escape('-.~:@!$&\'()*+,;/?='), PERCENT_REGEX))) +def is_valid_encoded_query_value(value): + return is_valid_encoded_query_value.regex.match(value) is not None + + +@static_vars(regex=re.compile(r'[a-zA-Z][a-zA-Z\-\.\+]*')) +def is_valid_scheme(scheme): + return is_valid_scheme.regex.match(scheme) is not None + + +@static_vars(regex=re.compile('[%s]' % re.escape(INVALID_HOST_CHARS))) +def is_valid_host(hostname): + toks = hostname.split('.') + if toks[-1] == '': # Trailing '.' in a fully qualified domain name. + toks.pop() + + for tok in toks: + if is_valid_host.regex.search(tok) is not None: + return False + + return '' not in toks # Adjacent periods aren't allowed. + + +def get_scheme(url): + if url.startswith(':'): + return '' + + # Avoid incorrect scheme extraction with url.find(':') when other URL + # components, like the path, query, fragment, etc, may have a colon in + # them. For example, the URL 'a?query:', whose query has a ':' in it. + no_fragment = url.split('#', 1)[0] + no_query = no_fragment.split('?', 1)[0] + no_path_or_netloc = no_query.split('/', 1)[0] + scheme = url[:max(0, no_path_or_netloc.find(':'))] or None + + if scheme is not None and not is_valid_scheme(scheme): + return None + + return scheme + + +def strip_scheme(url): + scheme = get_scheme(url) or '' + url = url[len(scheme):] + if url.startswith(':'): + url = url[1:] + return url + + +def set_scheme(url, scheme): + after_scheme = strip_scheme(url) + if scheme is None: + return after_scheme + else: + return '%s:%s' % (scheme, after_scheme) + + +# 'netloc' in Python parlance, 'authority' in RFC 3986 parlance. +def has_netloc(url): + scheme = get_scheme(url) + return url.startswith('//' if scheme is None else scheme + '://') + + +def urlsplit(url): + """ + Parameters: + url: URL string to split. + Returns: urlparse.SplitResult tuple subclass, just like + urlparse.urlsplit() returns, with fields (scheme, netloc, path, + query, fragment, username, password, hostname, port). See + http://docs.python.org/library/urlparse.html#urlparse.urlsplit + for more details on urlsplit(). + """ + original_scheme = get_scheme(url) + + # urlsplit() parses URLs differently depending on whether or not the URL's + # scheme is in any of + # + # urllib.parse.uses_fragment + # urllib.parse.uses_netloc + # urllib.parse.uses_params + # urllib.parse.uses_query + # urllib.parse.uses_relative + # + # For consistent URL parsing, switch the URL's scheme to 'http', a scheme + # in all of the aforementioned uses_* lists, and afterwards revert to the + # original scheme (which may or may not be in some, or all, of the the + # uses_* lists). + if original_scheme is not None: + url = set_scheme(url, 'http') + + scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url) + + # Detect and preserve the '//' before the netloc, if present. E.g. preserve + # URLs like 'http:', 'http://', and '///sup' correctly. + after_scheme = strip_scheme(url) + if after_scheme.startswith('//'): + netloc = netloc or '' + else: + netloc = None + + scheme = original_scheme + + return urllib.parse.SplitResult(scheme, netloc, path, query, fragment) + + +def urljoin(base, url): + """ + Parameters: + base: Base URL to join with . + url: Relative or absolute URL to join with . + + Returns: The resultant URL from joining and . + """ + base_scheme = get_scheme(base) if has_netloc(base) else None + url_scheme = get_scheme(url) if has_netloc(url) else None + + if base_scheme is not None: + # For consistent URL joining, switch the base URL's scheme to + # 'http'. urllib.parse.urljoin() behaves differently depending on the + # scheme. E.g. + # + # >>> urllib.parse.urljoin('http://google.com/', 'hi') + # 'http://google.com/hi' + # + # vs + # + # >>> urllib.parse.urljoin('asdf://google.com/', 'hi') + # 'hi' + root = set_scheme(base, 'http') + else: + root = base + + joined = urllib.parse.urljoin(root, url) + + new_scheme = url_scheme if url_scheme is not None else base_scheme + if new_scheme is not None and has_netloc(joined): + joined = set_scheme(joined, new_scheme) + + return joined + + +def join_path_segments(*args): + """ + Join multiple lists of path segments together, intelligently + handling path segments borders to preserve intended slashes of the + final constructed path. + + This function is not encoding aware. It doesn't test for, or change, + the encoding of path segments it is passed. + + Examples: + join_path_segments(['a'], ['b']) == ['a','b'] + join_path_segments(['a',''], ['b']) == ['a','b'] + join_path_segments(['a'], ['','b']) == ['a','b'] + join_path_segments(['a',''], ['','b']) == ['a','','b'] + join_path_segments(['a','b'], ['c','d']) == ['a','b','c','d'] + + Returns: A list containing the joined path segments. + """ + finals = [] + + for segments in args: + if not segments or segments == ['']: + continue + elif not finals: + finals.extend(segments) + else: + # Example #1: ['a',''] + ['b'] == ['a','b'] + # Example #2: ['a',''] + ['','b'] == ['a','','b'] + if finals[-1] == '' and (segments[0] != '' or len(segments) > 1): + finals.pop(-1) + # Example: ['a'] + ['','b'] == ['a','b'] + elif finals[-1] != '' and segments[0] == '' and len(segments) > 1: + segments = segments[1:] + finals.extend(segments) + + return finals + + +def remove_path_segments(segments, remove): + """ + Removes the path segments of from the end of the path + segments . + + Examples: + # ('/a/b/c', 'b/c') -> '/a/' + remove_path_segments(['','a','b','c'], ['b','c']) == ['','a',''] + # ('/a/b/c', '/b/c') -> '/a' + remove_path_segments(['','a','b','c'], ['','b','c']) == ['','a'] + + Returns: The list of all remaining path segments after the segments + in have been removed from the end of . If no + segments from were removed from , is + returned unmodified. + """ + # [''] means a '/', which is properly represented by ['', '']. + if segments == ['']: + segments.append('') + if remove == ['']: + remove.append('') + + ret = None + if remove == segments: + ret = [] + elif len(remove) > len(segments): + ret = segments + else: + toremove = list(remove) + + if len(remove) > 1 and remove[0] == '': + toremove.pop(0) + + if toremove and toremove == segments[-1 * len(toremove):]: + ret = segments[:len(segments) - len(toremove)] + if remove[0] != '' and ret: + ret.append('') + else: + ret = segments + + return ret + + +def quacks_like_a_path_with_segments(obj): + return ( + hasattr(obj, 'segments') and + is_iterable_but_not_string(obj.segments)) + + +class Path(object): + + """ + Represents a path comprised of zero or more path segments. + + http://tools.ietf.org/html/rfc3986#section-3.3 + + Path parameters aren't supported. + + Attributes: + _force_absolute: Function whos boolean return value specifies + whether self.isabsolute should be forced to True or not. If + _force_absolute(self) returns True, isabsolute is read only and + raises an AttributeError if assigned to. If + _force_absolute(self) returns False, isabsolute is mutable and + can be set to True or False. URL paths use _force_absolute and + return True if the netloc is non-empty (not equal to + ''). Fragment paths are never read-only and their + _force_absolute(self) always returns False. + segments: List of zero or more path segments comprising this + path. If the path string has a trailing '/', the last segment + will be '' and self.isdir will be True and self.isfile will be + False. An empty segment list represents an empty path, not '/' + (though they have the same meaning). + isabsolute: Boolean whether or not this is an absolute path or + not. An absolute path starts with a '/'. self.isabsolute is + False if the path is empty (self.segments == [] and str(path) == + ''). + strict: Boolean whether or not UserWarnings should be raised if + improperly encoded path strings are provided to methods that + take such strings, like load(), add(), set(), remove(), etc. + """ + + # RFC 3986: + # + # segment = *pchar + # pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + # unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + # sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + # / "*" / "+" / "," / ";" / "=" + SAFE_SEGMENT_CHARS = ":@-._~!$&'()*+,;=" + + def __init__(self, path='', force_absolute=lambda _: False, strict=False): + self.segments = [] + + self.strict = strict + self._isabsolute = False + self._force_absolute = force_absolute + + self.load(path) + + def load(self, path): + """ + Load , replacing any existing path. can either be + a Path instance, a list of segments, a path string to adopt. + + Returns: . + """ + if not path: + segments = [] + elif quacks_like_a_path_with_segments(path): # Path interface. + segments = path.segments + elif is_iterable_but_not_string(path): # List interface. + segments = path + else: # String interface. + segments = self._segments_from_path(path) + + if self._force_absolute(self): + self._isabsolute = True if segments else False + else: + self._isabsolute = (segments and segments[0] == '') + + if self.isabsolute and len(segments) > 1 and segments[0] == '': + segments.pop(0) + + self.segments = segments + + return self + + def add(self, path): + """ + Add to the existing path. can either be a Path instance, + a list of segments, or a path string to append to the existing path. + + Returns: . + """ + if quacks_like_a_path_with_segments(path): # Path interface. + newsegments = path.segments + elif is_iterable_but_not_string(path): # List interface. + newsegments = path + else: # String interface. + newsegments = self._segments_from_path(path) + + # Preserve the opening '/' if one exists already (self.segments + # == ['']). + if self.segments == [''] and newsegments and newsegments[0] != '': + newsegments.insert(0, '') + + segments = self.segments + if self.isabsolute and self.segments and self.segments[0] != '': + segments.insert(0, '') + + self.load(join_path_segments(segments, newsegments)) + + return self + + def set(self, path): + self.load(path) + return self + + def remove(self, path): + if path is True: + self.load('') + else: + if is_iterable_but_not_string(path): # List interface. + segments = path + else: # String interface. + segments = self._segments_from_path(path) + base = ([''] if self.isabsolute else []) + self.segments + self.load(remove_path_segments(base, segments)) + + return self + + def normalize(self): + """ + Normalize the path. Turn '//a/./b/../c//' into '/a/c/'. + + Returns: . + """ + if str(self): + normalized = normpath(str(self)) + ('/' * self.isdir) + if normalized.startswith('//'): # http://bugs.python.org/636648 + normalized = '/' + normalized.lstrip('/') + self.load(normalized) + + return self + + def asdict(self): + return { + 'encoded': str(self), + 'isdir': self.isdir, + 'isfile': self.isfile, + 'segments': self.segments, + 'isabsolute': self.isabsolute, + } + + @property + def isabsolute(self): + if self._force_absolute(self): + return True + return self._isabsolute + + @isabsolute.setter + def isabsolute(self, isabsolute): + """ + Raises: AttributeError if _force_absolute(self) returns True. + """ + if self._force_absolute(self): + s = ('Path.isabsolute is True and read-only for URLs with a netloc' + ' (a username, password, host, and/or port). A URL path must ' + "start with a '/' to separate itself from a netloc.") + raise AttributeError(s) + self._isabsolute = isabsolute + + @property + def isdir(self): + """ + Returns: True if the path ends on a directory, False + otherwise. If True, the last segment is '', representing the + trailing '/' of the path. + """ + return (self.segments == [] or + (self.segments and self.segments[-1] == '')) + + @property + def isfile(self): + """ + Returns: True if the path ends on a file, False otherwise. If + True, the last segment is not '', representing some file as the + last segment of the path. + """ + return not self.isdir + + def __truediv__(self, path): + copy = self.__class__( + path=self.segments, + force_absolute=self._force_absolute, + strict=self.strict) + return copy.add(path) + + def __eq__(self, other): + return str(self) == str(other) + + def __ne__(self, other): + return not self == other + + def __bool__(self): + return len(self.segments) > 0 + __nonzero__ = __bool__ + + def __str__(self): + segments = list(self.segments) + if self.isabsolute: + if not segments: + segments = ['', ''] + else: + segments.insert(0, '') + return self._path_from_segments(segments) + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, str(self)) + + def _segments_from_path(self, path): + """ + Returns: The list of path segments from the path string . + + Raises: UserWarning if is an improperly encoded path + string and self.strict is True. + + TODO(grun): Accept both list values and string values and + refactor the list vs string interface testing to this common + method. + """ + segments = [] + for segment in path.split('/'): + if not is_valid_encoded_path_segment(segment): + segment = quote(utf8(segment)) + if self.strict: + s = ("Improperly encoded path string received: '%s'. " + "Proceeding, but did you mean '%s'?" % + (path, self._path_from_segments(segments))) + warnings.warn(s, UserWarning) + segments.append(utf8(segment)) + del segment + + # In Python 3, utf8() returns Bytes objects that must be decoded into + # strings before they can be passed to unquote(). In Python 2, utf8() + # returns strings that can be passed directly to urllib.unquote(). + segments = [ + segment.decode('utf8') + if isinstance(segment, bytes) and not isinstance(segment, str) + else segment for segment in segments] + + return [unquote(segment) for segment in segments] + + def _path_from_segments(self, segments): + """ + Combine the provided path segments into a path string. Path + segments in will be quoted. + + Returns: A path string with quoted path segments. + """ + segments = [ + quote(utf8(attemptstr(segment)), self.SAFE_SEGMENT_CHARS) + for segment in segments] + return '/'.join(segments) + + +@six.add_metaclass(abc.ABCMeta) +class PathCompositionInterface(object): + + """ + Abstract class interface for a parent class that contains a Path. + """ + + def __init__(self, strict=False): + """ + Params: + force_absolute: See Path._force_absolute. + + Assignments to in __init__() must be added to + __setattr__() below. + """ + self._path = Path(force_absolute=self._force_absolute, strict=strict) + + @property + def path(self): + return self._path + + @property + def pathstr(self): + """This method is deprecated. Use str(furl.path) instead.""" + s = ('furl.pathstr is deprecated. Use str(furl.path) instead. There ' + 'should be one, and preferably only one, obvious way to serialize' + ' a Path object to a string.') + warnings.warn(s, DeprecationWarning) + return str(self._path) + + @abc.abstractmethod + def _force_absolute(self, path): + """ + Subclass me. + """ + pass + + def __setattr__(self, attr, value): + """ + Returns: True if this attribute is handled and set here, False + otherwise. + """ + if attr == '_path': + self.__dict__[attr] = value + return True + elif attr == 'path': + self._path.load(value) + return True + return False + + +@six.add_metaclass(abc.ABCMeta) +class URLPathCompositionInterface(PathCompositionInterface): + + """ + Abstract class interface for a parent class that contains a URL + Path. + + A URL path's isabsolute attribute is absolute and read-only if a + netloc is defined. A path cannot start without '/' if there's a + netloc. For example, the URL 'http://google.coma/path' makes no + sense. It should be 'http://google.com/a/path'. + + A URL path's isabsolute attribute is mutable if there's no + netloc. The scheme doesn't matter. For example, the isabsolute + attribute of the URL path in 'mailto:user@host.com', with scheme + 'mailto' and path 'user@host.com', is mutable because there is no + netloc. See + + http://en.wikipedia.org/wiki/URI_scheme#Examples + """ + + def __init__(self, strict=False): + PathCompositionInterface.__init__(self, strict=strict) + + def _force_absolute(self, path): + return bool(path) and self.netloc + + +@six.add_metaclass(abc.ABCMeta) +class FragmentPathCompositionInterface(PathCompositionInterface): + + """ + Abstract class interface for a parent class that contains a Fragment + Path. + + Fragment Paths they be set to absolute (self.isabsolute = True) or + not absolute (self.isabsolute = False). + """ + + def __init__(self, strict=False): + PathCompositionInterface.__init__(self, strict=strict) + + def _force_absolute(self, path): + return False + + +class Query(object): + + """ + Represents a URL query comprised of zero or more unique parameters + and their respective values. + + http://tools.ietf.org/html/rfc3986#section-3.4 + + + All interaction with Query.params is done with unquoted strings. So + + f.query.params['a'] = 'a%5E' + + means the intended value for 'a' is 'a%5E', not 'a^'. + + + Query.params is implemented as an omdict1D object - a one + dimensional ordered multivalue dictionary. This provides support for + repeated URL parameters, like 'a=1&a=2'. omdict1D is a subclass of + omdict, an ordered multivalue dictionary. Documentation for omdict + can be found here + + https://github.com/gruns/orderedmultidict + + The one dimensional aspect of omdict1D means that a list of values + is interpreted as multiple values, not a single value which is + itself a list of values. This is a reasonable distinction to make + because URL query parameters are one dimensional: query parameter + values cannot themselves be composed of sub-values. + + So what does this mean? This means we can safely interpret + + f = furl('http://www.google.com') + f.query.params['arg'] = ['one', 'two', 'three'] + + as three different values for 'arg': 'one', 'two', and 'three', + instead of a single value which is itself some serialization of the + python list ['one', 'two', 'three']. Thus, the result of the above + will be + + f.query.allitems() == [ + ('arg','one'), ('arg','two'), ('arg','three')] + + and not + + f.query.allitems() == [('arg', ['one', 'two', 'three'])] + + The latter doesn't make sense because query parameter values cannot + be composed of sub-values. So finally + + str(f.query) == 'arg=one&arg=two&arg=three' + + + Additionally, while the set of allowed characters in URL queries is + defined in RFC 3986 section 3.4, the format for encoding key=value + pairs within the query is not. In turn, the parsing of encoded + key=value query pairs differs between implementations. + + As a compromise to support equal signs in both key=value pair + encoded queries, like + + https://www.google.com?a=1&b=2 + + and non-key=value pair encoded queries, like + + https://www.google.com?===3=== + + equal signs are percent encoded in key=value pairs where the key is + non-empty, e.g. + + https://www.google.com?equal-sign=%3D + + but not encoded in key=value pairs where the key is empty, e.g. + + https://www.google.com?===equal=sign=== + + This presents a reasonable compromise to accurately reproduce + non-key=value queries with equal signs while also still percent + encoding equal signs in key=value pair encoded queries, as + expected. See + + https://github.com/gruns/furl/issues/99 + + for more details. + + Attributes: + params: Ordered multivalue dictionary of query parameter key:value + pairs. Parameters in self.params are maintained URL decoded, + e.g. 'a b' not 'a+b'. + strict: Boolean whether or not UserWarnings should be raised if + improperly encoded query strings are provided to methods that + take such strings, like load(), add(), set(), remove(), etc. + """ + + def __init__(self, query='', strict=False): + self.strict = strict + + self._params = omdict1D() + + self.load(query) + + def load(self, query): + items = self._items(query) + self.params.load(items) + return self + + def add(self, args): + for param, value in self._items(args): + self.params.add(param, value) + return self + + def set(self, mapping): + """ + Adopt all mappings in , replacing any existing mappings + with the same key. If a key has multiple values in , + they are all adopted. + + Examples: + Query({1:1}).set([(1,None),(2,2)]).params.allitems() + == [(1,None),(2,2)] + Query({1:None,2:None}).set([(1,1),(2,2),(1,11)]).params.allitems() + == [(1,1),(2,2),(1,11)] + Query({1:None}).set([(1,[1,11,111])]).params.allitems() + == [(1,1),(1,11),(1,111)] + + Returns: . + """ + self.params.updateall(mapping) + return self + + def remove(self, query): + if query is True: + self.load('') + return self + + # Single key to remove. + items = [query] + # Dictionary or multivalue dictionary of items to remove. + if callable_attr(query, 'items'): + items = self._items(query) + # List of keys or items to remove. + elif non_string_iterable(query): + items = query + + for item in items: + if non_string_iterable(item) and len(item) == 2: + key, value = item + self.params.popvalue(key, value, None) + else: + key = item + self.params.pop(key, None) + + return self + + @property + def params(self): + return self._params + + @params.setter + def params(self, params): + items = self._items(params) + + self._params.clear() + for key, value in items: + self._params.add(key, value) + + def encode(self, delimiter='&', quote_plus=True, delimeter=_absent): + """ + Examples: + Query('a=a&b=#').encode() == 'a=a&b=%23' + Query('a=a&b=#').encode(';') == 'a=a;b=%23' + Query('a+b=c+d').encode(quote_plus=False) == 'a%20b=c%20d' + + Until furl v0.4.6, the 'delimiter' argument was incorrectly + spelled 'delimeter'. For backwards compatibility, accept both + the correct 'delimiter' and the old, mispelled 'delimeter'. + + Returns: A URL encoded query string using as the + delimiter separating key:value pairs. The most common and + default delimiter is '&', but ';' can also be specified. ';' is + W3C recommended. Parameter keys and values are encoded + application/x-www-form-urlencoded if is True, + percent-encoded otherwise. + """ + if delimeter is not _absent: + delimiter = delimeter + + pairs = [] + sixurl = urllib.parse # six.moves.urllib.parse + quote_fn = sixurl.quote_plus if quote_plus else sixurl.quote + for key, value in self.params.iterallitems(): + utf8key = utf8(key, utf8(attemptstr(key))) + utf8value = utf8(value, utf8(attemptstr(value))) + + quoted_key = quote_fn(utf8key) + safe_value_chars = '=' if not quoted_key else '' + quoted_value = quote_fn(utf8value, safe_value_chars) + + if value is None: # Example: http://sprop.su/?param. + pair = quoted_key + else: + pair = '='.join([quoted_key, quoted_value]) + + pairs.append(pair) + + query = delimiter.join(pairs) + + return query + + def asdict(self): + return { + 'encoded': str(self), + 'params': self.params.allitems(), + } + + def __eq__(self, other): + return str(self) == str(other) + + def __ne__(self, other): + return not self == other + + def __bool__(self): + return len(self.params) > 0 + __nonzero__ = __bool__ + + def __str__(self): + return self.encode() + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, str(self)) + + def _items(self, items): + """ + Extract and return the key:value items from various + containers. Some containers that could hold key:value items are + + - List of (key,value) tuples. + - Dictionaries of key:value items. + - Multivalue dictionary of key:value items, with potentially + repeated keys. + - Query string with encoded params and values. + + Keys and values are passed through unmodified unless they were + passed in within an encoded query string, like + 'a=a%20a&b=b'. Keys and values passed in within an encoded query + string are unquoted by urlparse.parse_qsl(), which uses + urllib.unquote_plus() internally. + + Returns: List of items as (key, value) tuples. Keys and values + are passed through unmodified unless they were passed in as part + of an encoded query string, in which case the final keys and + values that are returned will be unquoted. + + Raises: UserWarning if is an improperly encoded path + string and self.strict is True. + """ + if not items: + items = [] + # Multivalue Dictionary-like interface. e.g. {'a':1, 'a':2, + # 'b':2} + elif callable_attr(items, 'allitems'): + items = list(items.allitems()) + elif callable_attr(items, 'iterallitems'): + items = list(items.iterallitems()) + # Dictionary-like interface. e.g. {'a':1, 'b':2, 'c':3} + elif callable_attr(items, 'items'): + items = list(items.items()) + elif callable_attr(items, 'iteritems'): + items = list(items.iteritems()) + # Encoded query string. e.g. 'a=1&b=2&c=3' + elif isinstance(items, six.string_types): + items = self._extract_items_from_querystr(items) + # Default to list of key:value items interface. e.g. [('a','1'), + # ('b','2')] + else: + items = list(items) + + return items + + def _extract_items_from_querystr(self, querystr): + items = [] + + pairstrs = [s2 for s1 in querystr.split('&') for s2 in s1.split(';')] + pairs = [item.split('=', 1) for item in pairstrs] + pairs = [(p[0], lget(p, 1, '')) for p in pairs] # Pad with value ''. + + for pairstr, (key, value) in six.moves.zip(pairstrs, pairs): + valid_key = is_valid_encoded_query_key(key) + valid_value = is_valid_encoded_query_value(value) + if self.strict and (not valid_key or not valid_value): + msg = ( + "Incorrectly percent encoded query string received: '%s'. " + "Proceeding, but did you mean '%s'?" % + (querystr, urllib.parse.urlencode(pairs))) + warnings.warn(msg, UserWarning) + + key_decoded = unquote(key.replace('+', ' ')) + # Empty value without a '=', e.g. '?sup'. + if key == pairstr: + value_decoded = None + else: + value_decoded = unquote(value.replace('+', ' ')) + + items.append((key_decoded, value_decoded)) + + return items + + +@six.add_metaclass(abc.ABCMeta) +class QueryCompositionInterface(object): + + """ + Abstract class interface for a parent class that contains a Query. + """ + + def __init__(self, strict=False): + self._query = Query(strict=strict) + + @property + def query(self): + return self._query + + @property + def querystr(self): + """This method is deprecated. Use str(furl.query) instead.""" + s = ('furl.querystr is deprecated. Use str(furl.query) instead. There ' + 'should be one, and preferably only one, obvious way to serialize' + ' a Query object to a string.') + warnings.warn(s, DeprecationWarning) + return str(self._query) + + @property + def args(self): + """ + Shortcut method to access the query parameters, self._query.params. + """ + return self._query.params + + def __setattr__(self, attr, value): + """ + Returns: True if this attribute is handled and set here, False + otherwise. + """ + if attr == 'args' or attr == 'query': + self._query.load(value) + return True + return False + + +class Fragment(FragmentPathCompositionInterface, QueryCompositionInterface): + + """ + Represents a URL fragment, comprised internally of a Path and Query + optionally separated by a '?' character. + + http://tools.ietf.org/html/rfc3986#section-3.5 + + Attributes: + path: Path object from FragmentPathCompositionInterface. + query: Query object from QueryCompositionInterface. + separator: Boolean whether or not a '?' separator should be + included in the string representation of this fragment. When + False, a '?' character will not separate the fragment path from + the fragment query in the fragment string. This is useful to + build fragments like '#!arg1=val1&arg2=val2', where no + separating '?' is desired. + """ + + def __init__(self, fragment='', strict=False): + FragmentPathCompositionInterface.__init__(self, strict=strict) + QueryCompositionInterface.__init__(self, strict=strict) + self.strict = strict + self.separator = True + + self.load(fragment) + + def load(self, fragment): + self.path.load('') + self.query.load('') + + if fragment is None: + fragment = '' + + toks = fragment.split('?', 1) + if len(toks) == 0: + self._path.load('') + self._query.load('') + elif len(toks) == 1: + # Does this fragment look like a path or a query? Default to + # path. + if '=' in fragment: # Query example: '#woofs=dogs'. + self._query.load(fragment) + else: # Path example: '#supinthisthread'. + self._path.load(fragment) + else: + # Does toks[1] actually look like a query? Like 'a=a' or + # 'a=' or '=a'? + if '=' in toks[1]: + self._path.load(toks[0]) + self._query.load(toks[1]) + # If toks[1] doesn't look like a query, the user probably + # provided a fragment string like 'a?b?' that was intended + # to be adopted as-is, not a two part fragment with path 'a' + # and query 'b?'. + else: + self._path.load(fragment) + + def add(self, path=_absent, args=_absent): + if path is not _absent: + self.path.add(path) + if args is not _absent: + self.query.add(args) + + return self + + def set(self, path=_absent, args=_absent, separator=_absent): + if path is not _absent: + self.path.load(path) + if args is not _absent: + self.query.load(args) + if separator is True or separator is False: + self.separator = separator + + return self + + def remove(self, fragment=_absent, path=_absent, args=_absent): + if fragment is True: + self.load('') + if path is not _absent: + self.path.remove(path) + if args is not _absent: + self.query.remove(args) + + return self + + def asdict(self): + return { + 'encoded': str(self), + 'separator': self.separator, + 'path': self.path.asdict(), + 'query': self.query.asdict(), + } + + def __eq__(self, other): + return str(self) == str(other) + + def __ne__(self, other): + return not self == other + + def __setattr__(self, attr, value): + if (not PathCompositionInterface.__setattr__(self, attr, value) and + not QueryCompositionInterface.__setattr__(self, attr, value)): + object.__setattr__(self, attr, value) + + def __bool__(self): + return bool(self.path) or bool(self.query) + __nonzero__ = __bool__ + + def __str__(self): + path, query = str(self._path), str(self._query) + + # If there is no query or self.separator is False, decode all + # '?' characters in the path from their percent encoded form + # '%3F' to '?'. This allows for fragment strings containg '?'s, + # like '#dog?machine?yes'. + if path and (not query or not self.separator): + path = path.replace('%3F', '?') + + separator = '?' if path and query and self.separator else '' + + return path + separator + query + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, str(self)) + + +@six.add_metaclass(abc.ABCMeta) +class FragmentCompositionInterface(object): + + """ + Abstract class interface for a parent class that contains a + Fragment. + """ + + def __init__(self, strict=False): + self._fragment = Fragment(strict=strict) + + @property + def fragment(self): + return self._fragment + + @property + def fragmentstr(self): + """This method is deprecated. Use str(furl.fragment) instead.""" + s = ('furl.fragmentstr is deprecated. Use str(furl.fragment) instead. ' + 'There should be one, and preferably only one, obvious way to ' + 'serialize a Fragment object to a string.') + warnings.warn(s, DeprecationWarning) + return str(self._fragment) + + def __setattr__(self, attr, value): + """ + Returns: True if this attribute is handled and set here, False + otherwise. + """ + if attr == 'fragment': + self.fragment.load(value) + return True + return False + + +class furl(URLPathCompositionInterface, QueryCompositionInterface, + FragmentCompositionInterface, UnicodeMixin): + + """ + Object for simple parsing and manipulation of a URL and its + components. + + scheme://username:password@host:port/path?query#fragment + + Attributes: + strict: Boolean whether or not UserWarnings should be raised if + improperly encoded path, query, or fragment strings are provided + to methods that take such strings, like load(), add(), set(), + remove(), etc. + username: Username string for authentication. Initially None. + password: Password string for authentication with + . Initially None. + scheme: URL scheme. A string ('http', 'https', '', etc) or None. + All lowercase. Initially None. + host: URL host (hostname, IPv4 address, or IPv6 address), not + including port. All lowercase. Initially None. + port: Port. Valid port values are 1-65535, or None meaning no port + specified. + netloc: Network location. Combined host and port string. Initially + None. + path: Path object from URLPathCompositionInterface. + query: Query object from QueryCompositionInterface. + fragment: Fragment object from FragmentCompositionInterface. + """ + + def __init__(self, url='', args=_absent, path=_absent, fragment=_absent, + scheme=_absent, netloc=_absent, origin=_absent, + fragment_path=_absent, fragment_args=_absent, + fragment_separator=_absent, host=_absent, port=_absent, + query=_absent, query_params=_absent, username=_absent, + password=_absent, strict=False): + """ + Raises: ValueError on invalid url. + """ + URLPathCompositionInterface.__init__(self, strict=strict) + QueryCompositionInterface.__init__(self, strict=strict) + FragmentCompositionInterface.__init__(self, strict=strict) + self.strict = strict + + self.load(url) # Raises ValueError on invalid url. + self.set( + args=args, path=path, fragment=fragment, scheme=scheme, + netloc=netloc, origin=origin, fragment_path=fragment_path, + fragment_args=fragment_args, fragment_separator=fragment_separator, + host=host, port=port, query=query, query_params=query_params, + username=username, password=password) + + def load(self, url): + """ + Parse and load a URL. + + Raises: ValueError on invalid URL, like a malformed IPv6 address + or invalid port. + """ + self.username = self.password = None + self._host = self._port = self._scheme = None + + if url is None: + url = '' + if not isinstance(url, six.string_types): + url = str(url) + + # urlsplit() raises a ValueError on malformed IPv6 addresses in + # Python 2.7+. + tokens = urlsplit(url) + + self.netloc = tokens.netloc # Raises ValueError in Python 2.7+. + self.scheme = tokens.scheme + if not self.port: + self._port = DEFAULT_PORTS.get(self.scheme) + self.path.load(tokens.path) + self.query.load(tokens.query) + self.fragment.load(tokens.fragment) + + return self + + @property + def scheme(self): + return self._scheme + + @scheme.setter + def scheme(self, scheme): + if callable_attr(scheme, 'lower'): + scheme = scheme.lower() + self._scheme = scheme + + @property + def host(self): + return self._host + + @host.setter + def host(self, host): + """ + Raises: ValueError on invalid host or malformed IPv6 address. + """ + # Invalid IPv6 literal. + urllib.parse.urlsplit('http://%s/' % host) # Raises ValueError. + + # Invalid host string. + resembles_ipv6_literal = ( + host is not None and lget(host, 0) == '[' and ':' in host and + lget(host, -1) == ']') + if (host is not None and not resembles_ipv6_literal and + not is_valid_host(host)): + errmsg = ( + "Invalid host '%s'. Host strings must have at least one " + "non-period character, can't contain any of '%s', and can't " + "have adjacent periods.") + raise ValueError(errmsg % (host, INVALID_HOST_CHARS)) + + if callable_attr(host, 'lower'): + host = host.lower() + if callable_attr(host, 'startswith') and host.startswith('xn--'): + host = idna_decode(host) + self._host = host + + @property + def port(self): + return self._port or DEFAULT_PORTS.get(self.scheme) + + @port.setter + def port(self, port): + """ + The port value can be 1-65535 or None, meaning no port specified. If + is None and self.scheme is a known scheme in DEFAULT_PORTS, + the default port value from DEFAULT_PORTS will be used. + + Raises: ValueError on invalid port. + """ + if port is None: + self._port = DEFAULT_PORTS.get(self.scheme) + elif is_valid_port(port): + self._port = int(str(port)) + else: + raise ValueError("Invalid port '%s'." % port) + + @property + def netloc(self): + userpass = quote(self.username or '', safe='') + if self.password is not None: + userpass += ':' + quote(self.password, safe='') + if userpass or self.username is not None: + userpass += '@' + + netloc = idna_encode(self.host) + if self.port and self.port != DEFAULT_PORTS.get(self.scheme): + netloc = (netloc or '') + (':' + str(self.port)) + + if userpass or netloc: + netloc = (userpass or '') + (netloc or '') + + return netloc + + @netloc.setter + def netloc(self, netloc): + """ + Params: + netloc: Network location string, like 'google.com' or + 'user:pass@google.com:99'. + Raises: ValueError on invalid port or malformed IPv6 address. + """ + # Raises ValueError on malformed IPv6 addresses. + urllib.parse.urlsplit('http://%s/' % netloc) + + username = password = host = port = None + + if netloc and '@' in netloc: + userpass, netloc = netloc.split('@', 1) + if ':' in userpass: + username, password = userpass.split(':', 1) + else: + username = userpass + + if netloc and ':' in netloc: + # IPv6 address literal. + if ']' in netloc: + colonpos, bracketpos = netloc.rfind(':'), netloc.rfind(']') + if colonpos > bracketpos and colonpos != bracketpos + 1: + raise ValueError("Invalid netloc '%s'." % netloc) + elif colonpos > bracketpos and colonpos == bracketpos + 1: + host, port = netloc.rsplit(':', 1) + else: + host = netloc + else: + host, port = netloc.rsplit(':', 1) + host = host + else: + host = netloc + + # Avoid side effects by assigning self.port before self.host so + # that if an exception is raised when assigning self.port, + # self.host isn't updated. + self.port = port # Raises ValueError on invalid port. + self.host = host + self.username = None if username is None else unquote(username) + self.password = None if password is None else unquote(password) + + @property + def origin(self): + port = '' + scheme = self.scheme or '' + host = idna_encode(self.host) or '' + if self.port and self.port != DEFAULT_PORTS.get(self.scheme): + port = ':%s' % self.port + origin = '%s://%s%s' % (scheme, host, port) + + return origin + + @origin.setter + def origin(self, origin): + toks = origin.split('://', 1) + if len(toks) == 1: + host_port = origin + else: + self.scheme, host_port = toks + + if ':' in host_port: + self.host, self.port = host_port.split(':', 1) + else: + self.host = host_port + + @property + def url(self): + return self.tostr() + + @url.setter + def url(self, url): + return self.load(url) + + def add(self, args=_absent, path=_absent, fragment_path=_absent, + fragment_args=_absent, query_params=_absent): + """ + Add components to a URL and return this furl instance, . + + If both and are provided, a UserWarning is + raised because is provided as a shortcut for + , not to be used simultaneously with + . Nonetheless, providing both and + behaves as expected, with query keys and values + from both and added to the query - + first, then . + + Parameters: + args: Shortcut for . + path: A list of path segments to add to the existing path + segments, or a path string to join with the existing path + string. + query_params: A dictionary of query keys and values or list of + key:value items to add to the query. + fragment_path: A list of path segments to add to the existing + fragment path segments, or a path string to join with the + existing fragment path string. + fragment_args: A dictionary of query keys and values or list + of key:value items to add to the fragment's query. + + Returns: . + + Raises: UserWarning if redundant and possibly conflicting and + were provided. + """ + if args is not _absent and query_params is not _absent: + s = ('Both and provided to furl.add(). ' + ' is a shortcut for , not to be used ' + 'with . See furl.add() documentation for more ' + 'details.') + warnings.warn(s, UserWarning) + + if path is not _absent: + self.path.add(path) + if args is not _absent: + self.query.add(args) + if query_params is not _absent: + self.query.add(query_params) + if fragment_path is not _absent or fragment_args is not _absent: + self.fragment.add(path=fragment_path, args=fragment_args) + + return self + + def set(self, args=_absent, path=_absent, fragment=_absent, scheme=_absent, + netloc=_absent, origin=_absent, fragment_path=_absent, + fragment_args=_absent, fragment_separator=_absent, host=_absent, + port=_absent, query=_absent, query_params=_absent, + username=_absent, password=_absent): + """Set components of a url and return this furl instance, . + + If any overlapping, and hence possibly conflicting, parameters + are provided, appropriate UserWarning's will be raised. The + groups of parameters that could potentially overlap are + + and + , , and/or ( or ) + and ( and/or ) + any two or all of , , and/or + + In all of the above groups, the latter parameter(s) take + precedence over the earlier parameter(s). So, for example + + furl('http://google.com/').set( + netloc='yahoo.com:99', host='bing.com', port=40) + + will result in a UserWarning being raised and the url becoming + + 'http://bing.com:40/' + + not + + 'http://yahoo.com:99/ + + Parameters: + args: Shortcut for . + path: A list of path segments or a path string to adopt. + fragment: Fragment string to adopt. + scheme: Scheme string to adopt. + netloc: Network location string to adopt. + origin: Scheme and netloc. + query: Query string to adopt. + query_params: A dictionary of query keys and values or list of + key:value items to adopt. + fragment_path: A list of path segments to adopt for the + fragment's path or a path string to adopt as the fragment's + path. + fragment_args: A dictionary of query keys and values or list + of key:value items for the fragment's query to adopt. + fragment_separator: Boolean whether or not there should be a + '?' separator between the fragment path and fragment query. + host: Host string to adopt. + port: Port number to adopt. + username: Username string to adopt. + password: Password string to adopt. + Raises: + ValueError on invalid port. + UserWarning if and are provided. + UserWarning if , and/or ( and/or ) are + provided. + UserWarning if , , and/or are provided. + UserWarning if and (, + , and/or ) are provided. + Returns: . + """ + def present(v): + return v is not _absent + + if present(scheme) and present(origin): + s = ('Possible parameter overlap: and . See ' + 'furl.set() documentation for more details.') + warnings.warn(s, UserWarning) + provided = [ + present(netloc), present(origin), present(host) or present(port)] + if sum(provided) >= 2: + s = ('Possible parameter overlap: , and/or ' + '( and/or ) provided. See furl.set() ' + 'documentation for more details.') + warnings.warn(s, UserWarning) + if sum(present(p) for p in [args, query, query_params]) >= 2: + s = ('Possible parameter overlap: , , and/or ' + ' provided. See furl.set() documentation for ' + 'more details.') + warnings.warn(s, UserWarning) + provided = [fragment_path, fragment_args, fragment_separator] + if present(fragment) and any(present(p) for p in provided): + s = ('Possible parameter overlap: and ' + '(and/or ) or ' + 'and provided. See furl.set() ' + 'documentation for more details.') + warnings.warn(s, UserWarning) + + # Guard against side effects on exception. + original_url = self.url + try: + if username is not _absent: + self.username = username + if password is not _absent: + self.password = password + if netloc is not _absent: + # Raises ValueError on invalid port or malformed IP. + self.netloc = netloc + if origin is not _absent: + # Raises ValueError on invalid port or malformed IP. + self.origin = origin + if scheme is not _absent: + self.scheme = scheme + if host is not _absent: + # Raises ValueError on invalid host or malformed IP. + self.host = host + if port is not _absent: + self.port = port # Raises ValueError on invalid port. + + if path is not _absent: + self.path.load(path) + if query is not _absent: + self.query.load(query) + if args is not _absent: + self.query.load(args) + if query_params is not _absent: + self.query.load(query_params) + if fragment is not _absent: + self.fragment.load(fragment) + if fragment_path is not _absent: + self.fragment.path.load(fragment_path) + if fragment_args is not _absent: + self.fragment.query.load(fragment_args) + if fragment_separator is not _absent: + self.fragment.separator = fragment_separator + except Exception: + self.load(original_url) + raise + + return self + + def remove(self, args=_absent, path=_absent, fragment=_absent, + query=_absent, query_params=_absent, port=False, + fragment_path=_absent, fragment_args=_absent, username=False, + password=False): + """ + Remove components of this furl's URL and return this furl + instance, . + + Parameters: + args: Shortcut for query_params. + path: A list of path segments to remove from the end of the + existing path segments list, or a path string to remove from + the end of the existing path string, or True to remove the + path portion of the URL entirely. + query: A list of query keys to remove from the query, if they + exist, or True to remove the query portion of the URL + entirely. + query_params: A list of query keys to remove from the query, + if they exist. + port: If True, remove the port from the network location + string, if it exists. + fragment: If True, remove the fragment portion of the URL + entirely. + fragment_path: A list of path segments to remove from the end + of the fragment's path segments or a path string to remove + from the end of the fragment's path string. + fragment_args: A list of query keys to remove from the + fragment's query, if they exist. + username: If True, remove the username, if it exists. + password: If True, remove the password, if it exists. + Returns: . + """ + if username is True: + self.username = None + if password is True: + self.password = None + if port is True: + self.port = None + if path is not _absent: + self.path.remove(path) + + if args is not _absent: + self.query.remove(args) + if query is not _absent: + self.query.remove(query) + if query_params is not _absent: + self.query.remove(query_params) + + if fragment is not _absent: + self.fragment.remove(fragment) + if fragment_path is not _absent: + self.fragment.path.remove(fragment_path) + if fragment_args is not _absent: + self.fragment.query.remove(fragment_args) + + return self + + def tostr(self, query_delimiter='&', query_quote_plus=True): + url = urllib.parse.urlunsplit(( + self.scheme or '', # Must be text type in Python 3. + self.netloc, + str(self.path), + self.query.encode(query_delimiter, query_quote_plus), + str(self.fragment), + )) + + # Differentiate between '' and None values for scheme and netloc. + if self.scheme == '': + url = ':' + url + + if self.netloc == '': + if self.scheme is None: + url = '//' + url + elif strip_scheme(url) == '': + url = url + '//' + + return str(url) + + def join(self, *urls): + for url in urls: + if not isinstance(url, six.string_types): + url = str(url) + newurl = urljoin(self.url, url) + self.load(newurl) + return self + + def copy(self): + return self.__class__(self) + + def asdict(self): + return { + 'url': self.url, + 'scheme': self.scheme, + 'username': self.username, + 'password': self.password, + 'host': self.host, + 'host_encoded': idna_encode(self.host), + 'port': self.port, + 'netloc': self.netloc, + 'origin': self.origin, + 'path': self.path.asdict(), + 'query': self.query.asdict(), + 'fragment': self.fragment.asdict(), + } + + def __truediv__(self, path): + return self.copy().add(path=path) + + def __eq__(self, other): + try: + return self.url == other.url + except AttributeError: + return None + + def __ne__(self, other): + return not self == other + + def __setattr__(self, attr, value): + if (not PathCompositionInterface.__setattr__(self, attr, value) and + not QueryCompositionInterface.__setattr__(self, attr, value) and + not FragmentCompositionInterface.__setattr__(self, attr, value)): + object.__setattr__(self, attr, value) + + def __unicode__(self): + return self.tostr() + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, str(self)) diff --git a/Contents/Libraries/Shared/furl/omdict1D.py b/Contents/Libraries/Shared/furl/omdict1D.py new file mode 100644 index 000000000..43b8d9ee0 --- /dev/null +++ b/Contents/Libraries/Shared/furl/omdict1D.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- + +# +# furl - URL manipulation made simple. +# +# Ansgar Grunseid +# grunseid.com +# grunseid@gmail.com +# +# License: Build Amazing Things (Unlicense) +# + +from orderedmultidict import omdict + +from .common import is_iterable_but_not_string, absent as _absent + + +class omdict1D(omdict): + + """ + One dimensional ordered multivalue dictionary. Whenever a list of + values is passed to set(), __setitem__(), add(), update(), or + updateall(), it's treated as multiple values and the appropriate + 'list' method is called on that list, like setlist() or + addlist(). For example: + + omd = omdict1D() + + omd[1] = [1,2,3] + omd[1] != [1,2,3] # True. + omd[1] == 1 # True. + omd.getlist(1) == [1,2,3] # True. + + omd.add(2, [2,3,4]) + omd[2] != [2,3,4] # True. + omd[2] == 2 # True. + omd.getlist(2) == [2,3,4] # True. + + omd.update([(3, [3,4,5])]) + omd[3] != [3,4,5] # True. + omd[3] == 3 # True. + omd.getlist(3) == [3,4,5] # True. + + omd = omdict([(1,None),(2,None)]) + omd.updateall([(1,[1,11]), (2,[2,22])]) + omd.allitems == [(1,1), (1,11), (2,2), (2,22)] + """ + + def add(self, key, value): + if not is_iterable_but_not_string(value): + value = [value] + + if value: + self._map.setdefault(key, list()) + + for val in value: + node = self._items.append(key, val) + self._map[key].append(node) + + return self + + def set(self, key, value): + return self._set(key, value) + + def __setitem__(self, key, value): + return self._set(key, value) + + def _bin_update_items(self, items, replace_at_most_one, + replacements, leftovers): + """ + Subclassed from omdict._bin_update_items() to make update() and + updateall() process lists of values as multiple values. + + and are modified directly, ala pass by + reference. + """ + for key, values in items: + # is not a list or an empty list. + like_list_not_str = is_iterable_but_not_string(values) + if not like_list_not_str or (like_list_not_str and not values): + values = [values] + + for value in values: + # If the value is [], remove any existing leftovers with + # key and set the list of values itself to [], + # which in turn will later delete when [] is + # passed to omdict.setlist() in + # omdict._update_updateall(). + if value == []: + replacements[key] = [] + leftovers[:] = [l for l in leftovers if key != l[0]] + # If there are existing items with key that have + # yet to be marked for replacement, mark that item's + # value to be replaced by by appending it to + # . + elif (key in self and + replacements.get(key, _absent) in [[], _absent]): + replacements[key] = [value] + elif (key in self and not replace_at_most_one and + len(replacements[key]) < len(self.values(key))): + replacements[key].append(value) + elif replace_at_most_one: + replacements[key] = [value] + else: + leftovers.append((key, value)) + + def _set(self, key, value): + if not is_iterable_but_not_string(value): + value = [value] + self.setlist(key, value) + + return self From fc532e30d3d62d085e157844cb60291ebbab06d8 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 26 Oct 2018 03:39:46 +0200 Subject: [PATCH 261/710] core: add furl license --- Licenses/furl/LICENSE.md.txt | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 Licenses/furl/LICENSE.md.txt diff --git a/Licenses/furl/LICENSE.md.txt b/Licenses/furl/LICENSE.md.txt new file mode 100644 index 000000000..ed374f584 --- /dev/null +++ b/Licenses/furl/LICENSE.md.txt @@ -0,0 +1,30 @@ +Build Amazing Things. + +*** + +### Unlicense + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to . \ No newline at end of file From ea4f2783a9b493abaf7eeafb255bbce27ff4614b Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 26 Oct 2018 03:40:21 +0200 Subject: [PATCH 262/710] core: add orderedmultidict --- .../Shared/orderedmultidict/__init__.py | 21 + .../Shared/orderedmultidict/itemlist.py | 157 ++++ .../orderedmultidict/orderedmultidict.py | 811 ++++++++++++++++++ Licenses/orderedmultidict/LICENSE.md | 31 + 4 files changed, 1020 insertions(+) create mode 100644 Contents/Libraries/Shared/orderedmultidict/__init__.py create mode 100644 Contents/Libraries/Shared/orderedmultidict/itemlist.py create mode 100644 Contents/Libraries/Shared/orderedmultidict/orderedmultidict.py create mode 100644 Licenses/orderedmultidict/LICENSE.md diff --git a/Contents/Libraries/Shared/orderedmultidict/__init__.py b/Contents/Libraries/Shared/orderedmultidict/__init__.py new file mode 100644 index 000000000..4f0ce2f7c --- /dev/null +++ b/Contents/Libraries/Shared/orderedmultidict/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +# +# omdict - Ordered Multivalue Dictionary. +# +# Ansgar Grunseid +# grunseid.com +# grunseid@gmail.com +# +# License: Build Amazing Things (Unlicense) + +from __future__ import absolute_import + +from .orderedmultidict import * # noqa + +__title__ = 'orderedmultidict' +__version__ = '1.0' +__author__ = 'Ansgar Grunseid' +__contact__ = 'grunseid@gmail.com' +__license__ = 'Unlicense' +__url__ = 'https://github.com/gruns/orderedmultidict' diff --git a/Contents/Libraries/Shared/orderedmultidict/itemlist.py b/Contents/Libraries/Shared/orderedmultidict/itemlist.py new file mode 100644 index 000000000..e9e96c725 --- /dev/null +++ b/Contents/Libraries/Shared/orderedmultidict/itemlist.py @@ -0,0 +1,157 @@ +# -*- coding: utf-8 -*- + +# +# omdict - Ordered Multivalue Dictionary. +# +# Ansgar Grunseid +# grunseid.com +# grunseid@gmail.com +# +# License: Build Amazing Things (Unlicense) + +from __future__ import absolute_import + +from six.moves import zip_longest + +_absent = object() # Marker that means no parameter was provided. + + +class itemnode(object): + + """ + Dictionary key:value items wrapped in a node to be members of itemlist, the + doubly linked list defined below. + """ + + def __init__(self, prev=None, next=None, key=_absent, value=_absent): + self.prev = prev + self.next = next + self.key = key + self.value = value + + +class itemlist(object): + + """ + Doubly linked list of itemnodes. + + This class is used as the key:value item storage of orderedmultidict. + Methods below were only added as needed for use with orderedmultidict, so + some otherwise common list methods may be missing. + """ + + def __init__(self, items=[]): + self.root = itemnode() + self.root.next = self.root.prev = self.root + self.size = 0 + + for key, value in items: + self.append(key, value) + + def append(self, key, value): + tail = self.root.prev if self.root.prev is not self.root else self.root + node = itemnode(tail, self.root, key=key, value=value) + tail.next = node + self.root.prev = node + self.size += 1 + return node + + def removenode(self, node): + node.prev.next = node.next + node.next.prev = node.prev + self.size -= 1 + return self + + def clear(self): + for node, key, value in self: + self.removenode(node) + return self + + def items(self): + return list(self.iteritems()) + + def keys(self): + return list(self.iterkeys()) + + def values(self): + return list(self.itervalues()) + + def iteritems(self): + for node, key, value in self: + yield key, value + + def iterkeys(self): + for node, key, value in self: + yield key + + def itervalues(self): + for node, key, value in self: + yield value + + def reverse(self): + for node, key, value in self: + node.prev, node.next = node.next, node.prev + self.root.prev, self.root.next = self.root.next, self.root.prev + return self + + def __len__(self): + return self.size + + def __iter__(self): + current = self.root.next + while current and current is not self.root: + # Record current.next here in case current.next changes after the + # yield and before we return for the next iteration. For example, + # methods like reverse() will change current.next() before yield + # gets executed again. + nextnode = current.next + yield current, current.key, current.value + current = nextnode + + def __contains__(self, item): + """ + Params: + item: Can either be a (key,value) tuple or an itemnode reference. + """ + node = key = value = _absent + if hasattr(item, '__len__') and callable(item.__len__): + if len(item) == 2: + key, value = item + elif len(item) == 3: + node, key, value = item + else: + node = item + + if node is not _absent or _absent not in [key, value]: + for selfnode, selfkey, selfvalue in self: + if ((node is _absent and key == selfkey and value == selfvalue) + or (node is not _absent and node == selfnode)): + return True + return False + + def __getitem__(self, index): + # Only support direct access to the first or last element, as this is + # all orderedmultidict needs for now. + if index == 0 and self.root.next is not self.root: + return self.root.next + elif index == -1 and self.root.prev is not self.root: + return self.root.prev + raise IndexError(index) + + def __delitem__(self, index): + self.removenode(self[index]) + + def __eq__(self, other): + for (n1, key1, value1), (n2, key2, value2) in zip_longest(self, other): + if key1 != key2 or value1 != value2: + return False + return True + + def __ne__(self, other): + return not self.__eq__(other) + + def __nonzero__(self): + return self.size > 0 + + def __str__(self): + return '[%s]' % self.items() diff --git a/Contents/Libraries/Shared/orderedmultidict/orderedmultidict.py b/Contents/Libraries/Shared/orderedmultidict/orderedmultidict.py new file mode 100644 index 000000000..924dd8d2b --- /dev/null +++ b/Contents/Libraries/Shared/orderedmultidict/orderedmultidict.py @@ -0,0 +1,811 @@ +# -*- coding: utf-8 -*- + +# +# omdict - Ordered Multivalue Dictionary. +# +# Ansgar Grunseid +# grunseid.com +# grunseid@gmail.com +# +# License: Build Amazing Things (Unlicense) + +from __future__ import absolute_import + +from itertools import chain +from collections import MutableMapping + +import six +from six.moves import map, zip_longest + +from .itemlist import itemlist + +try: + from collections import OrderedDict as odict # Python 2.7 and later. +except ImportError: + from ordereddict import OrderedDict as odict # Python 2.6 and earlier. + +import sys +items_attr = 'items' if sys.version_info[0] >= 3 else 'iteritems' + +_absent = object() # Marker that means no parameter was provided. + + +def callable_attr(obj, attr): + return hasattr(obj, attr) and callable(getattr(obj, attr)) + + +# +# TODO(grun): Create a subclass of list that values(), getlist(), allitems(), +# etc return that the user can manipulate directly to control the omdict() +# object. +# +# For example, users should be able to do things like +# +# omd = omdict([(1,1), (1,11)]) +# omd.values(1).append('sup') +# omd.allitems() == [(1,1), (1,11), (1,'sup')] +# omd.values(1).remove(11) +# omd.allitems() == [(1,1), (1,'sup')] +# omd.values(1).extend(['two', 'more']) +# omd.allitems() == [(1,1), (1,'sup'), (1,'two'), (1,'more')] +# +# or +# +# omd = omdict([(1,1), (1,11)]) +# omd.allitems().extend([(2,2), (2,22)]) +# omd.allitems() == [(1,1), (1,11), (2,2), (2,22)]) +# +# or +# +# omd = omdict() +# omd.values(1) = [1, 11] +# omd.allitems() == [(1,1), (1,11)] +# omd.values(1) = list(map(lambda i: i * -10, omd.values(1))) +# omd.allitems() == [(1,-10), (1,-110)] +# omd.allitems() = filter(lambda (k,v): v > -100, omd.allitems()) +# omd.allitems() == [(1,-10)] +# +# etc. +# +# To accomplish this, subclass list in such a manner that each list element is +# really a two tuple, where the first tuple value is the actual value and the +# second tuple value is a reference to the itemlist node for that value. Users +# only interact with the first tuple values, the actual values, but behind the +# scenes when an element is modified, deleted, inserted, etc, the according +# itemlist nodes are modified, deleted, inserted, etc accordingly. In this +# manner, users can manipulate omdict objects directly through direct list +# manipulation. +# +# Once accomplished, some methods become redundant and should be removed in +# favor of the more intuitive direct value list manipulation. Such redundant +# methods include getlist() (removed in favor of values()?), addlist(), and +# setlist(). +# +# With the removal of many of the 'list' methods, think about renaming all +# remaining 'list' methods to 'values' methods, like poplist() -> popvalues(), +# poplistitem() -> popvaluesitem(), etc. This would be an easy switch for most +# methods, but wouldn't fit others so well. For example, iterlists() would +# become itervalues(), a name extremely similar to iterallvalues() but quite +# different in function. +# + + +class omdict(MutableMapping): + + """ + Ordered Multivalue Dictionary. + + A multivalue dictionary is a dictionary that can store multiple values per + key. An ordered multivalue dictionary is a multivalue dictionary that + retains the order of insertions and deletions. + + Internally, items are stored in a doubly linked list, self._items. A + dictionary, self._map, is also maintained and stores an ordered list of + linked list node references, one for each value associated with that key. + + Standard dict methods interact with the first value associated with a given + key. This means that omdict retains method parity with dict, and a dict + object can be replaced with an omdict object and all interaction will + behave identically. All dict methods that retain parity with omdict are: + + get(), setdefault(), pop(), popitem(), + clear(), copy(), update(), fromkeys(), len() + __getitem__(), __setitem__(), __delitem__(), __contains__(), + items(), keys(), values(), iteritems(), iterkeys(), itervalues(), + + Optional parameters have been added to some dict methods, but because the + added parameters are optional, existing use remains unaffected. An optional + parameter has been added to these methods: + + items(), values(), iteritems(), itervalues() + + New methods have also been added to omdict. Methods with 'list' in their + name interact with lists of values, and methods with 'all' in their name + interact with all items in the dictionary, including multiple items with + the same key. + + The new omdict methods are: + + load(), size(), reverse(), + getlist(), add(), addlist(), set(), setlist(), setdefaultlist(), + poplist(), popvalue(), popvalues(), popitem(), poplistitem(), + allitems(), allkeys(), allvalues(), lists(), listitems(), + iterallitems(), iterallkeys(), iterallvalues(), iterlists(), + iterlistitems() + + Explanations and examples of the new methods above can be found in the + function comments below and online at + + https://github.com/gruns/orderedmultidict + + Additional omdict information and documentation can also be found at the + above url. + """ + + def __init__(self, *args, **kwargs): + # Doubly linked list of itemnodes. Each itemnode stores a key:value + # item. + self._items = itemlist() + + # Ordered dictionary of keys and itemnode references. Each itemnode + # reference points to one of that keys values. + self._map = odict() + + self.load(*args, **kwargs) + + def load(self, *args, **kwargs): + """ + Clear all existing key:value items and import all key:value items from + . If multiple values exist for the same key in , they + are all be imported. + + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.load([(4,4), (4,44), (5,5)]) + omd.allitems() == [(4,4), (4,44), (5,5)] + + Returns: . + """ + self.clear() + self.updateall(*args, **kwargs) + return self + + def copy(self): + return self.__class__(self.allitems()) + + def clear(self): + self._map.clear() + self._items.clear() + + def size(self): + """ + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.size() == 5 + + Returns: Total number of items, including multiple items with the same + key. + """ + return len(self._items) + + @classmethod + def fromkeys(cls, iterable, value=None): + return cls([(key, value) for key in iterable]) + + def has_key(self, key): + return key in self + + def update(self, *args, **kwargs): + self._update_updateall(True, *args, **kwargs) + + def updateall(self, *args, **kwargs): + """ + Update this dictionary with the items from , replacing + existing key:value items with shared keys before adding new key:value + items. + + Example: + omd = omdict([(1,1), (2,2)]) + omd.updateall([(2,'two'), (1,'one'), (2,222), (1,111)]) + omd.allitems() == [(1, 'one'), (2, 'two'), (2, 222), (1, 111)] + + Returns: . + """ + self._update_updateall(False, *args, **kwargs) + return self + + def _update_updateall(self, replace_at_most_one, *args, **kwargs): + # Bin the items in and into or + # . Items in are new values to replace old + # values for a given key, and items in are new items to be + # added. + replacements, leftovers = dict(), [] + for mapping in chain(args, [kwargs]): + self._bin_update_items( + self._items_iterator(mapping), replace_at_most_one, + replacements, leftovers) + + # First, replace existing values for each key. + for key, values in six.iteritems(replacements): + self.setlist(key, values) + # Then, add the leftover items to the end of the list of all items. + for key, value in leftovers: + self.add(key, value) + + def _bin_update_items(self, items, replace_at_most_one, + replacements, leftovers): + """ + are modified directly, ala pass by + reference. + """ + for key, value in items: + # If there are existing items with key that have yet to be + # marked for replacement, mark that item's value to be replaced by + # by appending it to . + if key in self and key not in replacements: + replacements[key] = [value] + elif (key in self and not replace_at_most_one and + len(replacements[key]) < len(self.values(key))): + replacements[key].append(value) + else: + if replace_at_most_one: + replacements[key] = [value] + else: + leftovers.append((key, value)) + + def _items_iterator(self, container): + cont = container + iterator = iter(cont) + if callable_attr(cont, 'iterallitems'): + iterator = cont.iterallitems() + elif callable_attr(cont, 'allitems'): + iterator = iter(cont.allitems()) + elif callable_attr(cont, 'iteritems'): + iterator = cont.iteritems() + elif callable_attr(cont, 'items'): + iterator = iter(cont.items()) + return iterator + + def get(self, key, default=None): + if key in self: + return self._map[key][0].value + return default + + def getlist(self, key, default=[]): + """ + Returns: The list of values for if is in the dictionary, + else . If is not provided, an empty list is + returned. + """ + if key in self: + return [node.value for node in self._map[key]] + return default + + def setdefault(self, key, default=None): + if key in self: + return self[key] + self.add(key, default) + return default + + def setdefaultlist(self, key, defaultlist=[None]): + """ + Similar to setdefault() except is a list of values to set + for . If already exists, its existing list of values is + returned. + + If isn't a key and is an empty list, [], no values + are added for and will not be added as a key. + + Returns: List of 's values if exists in the dictionary, + otherwise . + """ + if key in self: + return self.getlist(key) + self.addlist(key, defaultlist) + return defaultlist + + def add(self, key, value=None): + """ + Add to the list of values for . If is not in the + dictionary, then is added as the sole value for . + + Example: + omd = omdict() + omd.add(1, 1) # omd.allitems() == [(1,1)] + omd.add(1, 11) # omd.allitems() == [(1,1), (1,11)] + omd.add(2, 2) # omd.allitems() == [(1,1), (1,11), (2,2)] + + Returns: . + """ + self._map.setdefault(key, []) + node = self._items.append(key, value) + self._map[key].append(node) + return self + + def addlist(self, key, valuelist=[]): + """ + Add the values in to the list of values for . If + is not in the dictionary, the values in become the values + for . + + Example: + omd = omdict([(1,1)]) + omd.addlist(1, [11, 111]) + omd.allitems() == [(1, 1), (1, 11), (1, 111)] + omd.addlist(2, [2]) + omd.allitems() == [(1, 1), (1, 11), (1, 111), (2, 2)] + + Returns: . + """ + for value in valuelist: + self.add(key, value) + return self + + def set(self, key, value=None): + """ + Sets 's value to . Identical in function to __setitem__(). + + Returns: . + """ + self[key] = value + return self + + def setlist(self, key, values): + """ + Sets 's list of values to . Existing items with key + are first replaced with new values from . Any remaining old + items that haven't been replaced with new values are deleted, and any + new values from that don't have corresponding items with + to replace are appended to the end of the list of all items. + + If values is an empty list, [], is deleted, equivalent in action + to del self[]. + + Example: + omd = omdict([(1,1), (2,2)]) + omd.setlist(1, [11, 111]) + omd.allitems() == [(1,11), (2,2), (1,111)] + + omd = omdict([(1,1), (1,11), (2,2), (1,111)]) + omd.setlist(1, [None]) + omd.allitems() == [(1,None), (2,2)] + + omd = omdict([(1,1), (1,11), (2,2), (1,111)]) + omd.setlist(1, []) + omd.allitems() == [(2,2)] + + Returns: . + """ + if not values and key in self: + self.pop(key) + else: + it = zip_longest( + list(self._map.get(key, [])), values, fillvalue=_absent) + for node, value in it: + if node is not _absent and value is not _absent: + node.value = value + elif node is _absent: + self.add(key, value) + elif value is _absent: + self._map[key].remove(node) + self._items.removenode(node) + return self + + def removevalues(self, key, values): + """ + Removes all from the values of . If has no + remaining values after removevalues(), the key is popped. + + Example: + omd = omdict([(1, 1), (1, 11), (1, 1), (1, 111)]) + omd.removevalues(1, [1, 111]) + omd.allitems() == [(1, 11)] + + Returns: . + """ + self.setlist(key, [v for v in self.getlist(key) if v not in values]) + return self + + def pop(self, key, default=_absent): + if key in self: + return self.poplist(key)[0] + elif key not in self._map and default is not _absent: + return default + raise KeyError(key) + + def poplist(self, key, default=_absent): + """ + If is in the dictionary, pop it and return its list of values. If + is not in the dictionary, return . KeyError is raised if + is not provided and is not in the dictionary. + + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.poplist(1) == [1, 11, 111] + omd.allitems() == [(2,2), (3,3)] + omd.poplist(2) == [2] + omd.allitems() == [(3,3)] + + Raises: KeyError if isn't in the dictionary and isn't + provided. + Returns: List of 's values. + """ + if key in self: + values = self.getlist(key) + del self._map[key] + for node, nodekey, nodevalue in self._items: + if nodekey == key: + self._items.removenode(node) + return values + elif key not in self._map and default is not _absent: + return default + raise KeyError(key) + + def popvalue(self, key, value=_absent, default=_absent, last=True): + """ + If is provided, pops the first or last (key,value) item in the + dictionary if is in the dictionary. + + If is not provided, pops the first or last value for if + is in the dictionary. + + If no longer has any values after a popvalue() call, is + removed from the dictionary. If isn't in the dictionary and + was provided, return default. KeyError is raised if + is not provided and is not in the dictionary. ValueError is + raised if is provided but isn't a value for . + + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3), (2,22)]) + omd.popvalue(1) == 111 + omd.allitems() == [(1,11), (1,111), (2,2), (3,3), (2,22)] + omd.popvalue(1, last=False) == 1 + omd.allitems() == [(1,11), (2,2), (3,3), (2,22)] + omd.popvalue(2, 2) == 2 + omd.allitems() == [(1,11), (3,3), (2,22)] + omd.popvalue(1, 11) == 11 + omd.allitems() == [(3,3), (2,22)] + omd.popvalue('not a key', default='sup') == 'sup' + + Params: + last: Boolean whether to return 's first value ( is False) + or last value ( is True). + Raises: + KeyError if isn't in the dictionary and isn't + provided. + ValueError if isn't a value for . + Returns: The first or last of 's values. + """ + def pop_node_with_index(key, index): + node = self._map[key].pop(index) + if not self._map[key]: + del self._map[key] + self._items.removenode(node) + return node + + if key in self: + if value is not _absent: + if last: + pos = self.values(key)[::-1].index(value) + else: + pos = self.values(key).index(value) + if pos == -1: + raise ValueError(value) + else: + index = (len(self.values(key)) - 1 - pos) if last else pos + return pop_node_with_index(key, index).value + else: + return pop_node_with_index(key, -1 if last else 0).value + elif key not in self._map and default is not _absent: + return default + raise KeyError(key) + + def popitem(self, fromall=False, last=True): + """ + Pop and return a key:value item. + + If is False, items()[0] is popped if is False or + items()[-1] is popped if is True. All remaining items with the + same key are removed. + + If is True, allitems()[0] is popped if is False or + allitems()[-1] is popped if is True. Any remaining items with + the same key remain. + + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.popitem() == (3,3) + omd.popitem(fromall=False, last=False) == (1,1) + omd.popitem(fromall=False, last=False) == (2,2) + + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.popitem(fromall=True, last=False) == (1,1) + omd.popitem(fromall=True, last=False) == (1,11) + omd.popitem(fromall=True, last=True) == (3,3) + omd.popitem(fromall=True, last=False) == (1,111) + + Params: + fromall: Whether to pop an item from items() ( is True) or + allitems() ( is False). + last: Boolean whether to pop the first item or last item of items() + or allitems(). + Raises: KeyError if the dictionary is empty. + Returns: The first or last item from item() or allitem(). + """ + if not self._items: + raise KeyError('popitem(): %s is empty' % self.__class__.__name__) + + if fromall: + node = self._items[-1 if last else 0] + key = node.key + return key, self.popvalue(key, last=last) + else: + key = list(self._map.keys())[-1 if last else 0] + return key, self.pop(key) + + def poplistitem(self, last=True): + """ + Pop and return a key:valuelist item comprised of a key and that key's + list of values. If is False, a key:valuelist item comprised of + keys()[0] and its list of values is popped and returned. If is + True, a key:valuelist item comprised of keys()[-1] and its list of + values is popped and returned. + + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.poplistitem(last=True) == (3,[3]) + omd.poplistitem(last=False) == (1,[1,11,111]) + + Params: + last: Boolean whether to pop the first or last key and its associated + list of values. + Raises: KeyError if the dictionary is empty. + Returns: A two-tuple comprised of the first or last key and its + associated list of values. + """ + if not self._items: + s = 'poplistitem(): %s is empty' % self.__class__.__name__ + raise KeyError(s) + + key = self.keys()[-1 if last else 0] + return key, self.poplist(key) + + def items(self, key=_absent): + """ + Raises: KeyError if is provided and not in the dictionary. + Returns: List created from iteritems(). Only items with key + are returned if is provided and is a dictionary key. + """ + return list(self.iteritems(key)) + + def keys(self): + return list(self.iterkeys()) + + def values(self, key=_absent): + """ + Raises: KeyError if is provided and not in the dictionary. + Returns: List created from itervalues().If is provided and + is a dictionary key, only values of items with key are + returned. + """ + if key is not _absent and key in self._map: + return self.getlist(key) + return list(self.itervalues()) + + def lists(self): + """ + Returns: List created from iterlists(). + """ + return list(self.iterlists()) + + def listitems(self): + """ + Returns: List created from iterlistitems(). + """ + return list(self.iterlistitems()) + + def iteritems(self, key=_absent): + """ + Parity with dict.iteritems() except the optional parameter has + been added. If is provided, only items with the provided key are + iterated over. KeyError is raised if is provided and not in the + dictionary. + + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.iteritems(1) -> (1,1) -> (1,11) -> (1,111) + omd.iteritems() -> (1,1) -> (2,2) -> (3,3) + + Raises: KeyError if is provided and not in the dictionary. + Returns: An iterator over the items() of the dictionary, or only items + with the key if is provided. + """ + if key is not _absent: + if key in self: + items = [(node.key, node.value) for node in self._map[key]] + return iter(items) + raise KeyError(key) + items = six.iteritems(self._map) + return iter((key, nodes[0].value) for (key, nodes) in items) + + def iterkeys(self): + return six.iterkeys(self._map) + + def itervalues(self, key=_absent): + """ + Parity with dict.itervalues() except the optional parameter has + been added. If is provided, only values from items with the + provided key are iterated over. KeyError is raised if is provided + and not in the dictionary. + + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.itervalues(1) -> 1 -> 11 -> 111 + omd.itervalues() -> 1 -> 11 -> 111 -> 2 -> 3 + + Raises: KeyError if is provided and isn't in the dictionary. + Returns: An iterator over the values() of the dictionary, or only the + values of key if is provided. + """ + if key is not _absent: + if key in self: + return iter([node.value for node in self._map[key]]) + raise KeyError(key) + return iter([nodes[0].value for nodes in six.itervalues(self._map)]) + + def allitems(self, key=_absent): + ''' + Raises: KeyError if is provided and not in the dictionary. + Returns: List created from iterallitems(). + ''' + return list(self.iterallitems(key)) + + def allkeys(self): + ''' + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.allkeys() == [1,1,1,2,3] + + Returns: List created from iterallkeys(). + ''' + return list(self.iterallkeys()) + + def allvalues(self, key=_absent): + ''' + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.allvalues() == [1,11,111,2,3] + omd.allvalues(1) == [1,11,111] + + Raises: KeyError if is provided and not in the dictionary. + Returns: List created from iterallvalues(). + ''' + return list(self.iterallvalues(key)) + + def iterallitems(self, key=_absent): + ''' + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.iterallitems() == (1,1) -> (1,11) -> (1,111) -> (2,2) -> (3,3) + omd.iterallitems(1) == (1,1) -> (1,11) -> (1,111) + + Raises: KeyError if is provided and not in the dictionary. + Returns: An iterator over every item in the diciontary. If is + provided, only items with the key are iterated over. + ''' + if key is not _absent: + # Raises KeyError if is not in self._map. + return self.iteritems(key) + return self._items.iteritems() + + def iterallkeys(self): + ''' + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.iterallkeys() == 1 -> 1 -> 1 -> 2 -> 3 + + Returns: An iterator over the keys of every item in the dictionary. + ''' + return self._items.iterkeys() + + def iterallvalues(self, key=_absent): + ''' + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.iterallvalues() == 1 -> 11 -> 111 -> 2 -> 3 + + Returns: An iterator over the values of every item in the dictionary. + ''' + if key is not _absent: + if key in self: + return iter(self.getlist(key)) + raise KeyError(key) + return self._items.itervalues() + + def iterlists(self): + ''' + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.iterlists() -> [1,11,111] -> [2] -> [3] + + Returns: An iterator over the list comprised of the lists of values for + each key. + ''' + return map(lambda key: self.getlist(key), self) + + def iterlistitems(self): + """ + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.iterlistitems() -> (1,[1,11,111]) -> (2,[2]) -> (3,[3]) + + Returns: An iterator over the list of key:valuelist items. + """ + return map(lambda key: (key, self.getlist(key)), self) + + def reverse(self): + """ + Reverse the order of all items in the dictionary. + + Example: + omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) + omd.reverse() + omd.allitems() == [(3,3), (2,2), (1,111), (1,11), (1,1)] + + Returns: . + """ + for key in six.iterkeys(self._map): + self._map[key].reverse() + self._items.reverse() + return self + + def __eq__(self, other): + if callable_attr(other, 'iterallitems'): + myiter, otheriter = self.iterallitems(), other.iterallitems() + for i1, i2 in zip_longest(myiter, otheriter, fillvalue=_absent): + if i1 != i2 or i1 is _absent or i2 is _absent: + return False + elif not hasattr(other, '__len__') or not hasattr(other, items_attr): + return False + # Ignore order so we can compare ordered omdicts with unordered dicts. + else: + if len(self) != len(other): + return False + for key, value in six.iteritems(other): + if self.get(key, _absent) != value: + return False + return True + + def __ne__(self, other): + return not self.__eq__(other) + + def __len__(self): + return len(self._map) + + def __iter__(self): + for key in self.iterkeys(): + yield key + + def __contains__(self, key): + return key in self._map + + def __getitem__(self, key): + if key in self: + return self.get(key) + raise KeyError(key) + + def __setitem__(self, key, value): + self.setlist(key, [value]) + + def __delitem__(self, key): + return self.pop(key) + + def __nonzero__(self): + return bool(self._map) + + def __str__(self): + return '{%s}' % ', '.join( + map(lambda p: '%r: %r' % (p[0], p[1]), self.iterallitems())) + + def __repr__(self): + return '%s(%s)' % (self.__class__.__name__, self.allitems()) diff --git a/Licenses/orderedmultidict/LICENSE.md b/Licenses/orderedmultidict/LICENSE.md new file mode 100644 index 000000000..210e8658b --- /dev/null +++ b/Licenses/orderedmultidict/LICENSE.md @@ -0,0 +1,31 @@ +Build Amazing Things. + +*** + +### Unlicense + +This is free and unencumbered software released into the public\ +domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or distribute\ +this software, either in source code form or as a compiled binary, for any\ +purpose, commercial or non-commercial, and by any means. + +In jurisdictions that recognize copyright laws, the author or authors of\ +this software dedicate any and all copyright interest in the software to the\ +public domain. We make this dedication for the benefit of the public at\ +large and to the detriment of our heirs and successors. We intend this\ +dedication to be an overt act of relinquishment in perpetuity of all\ +present and future rights to this software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF\ +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\ +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\ +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\ +SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\ +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT\ +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\ +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\ +SOFTWARE. + +For more information, please refer to From 17917378632fca063c79ba3dbea583473d4c8790 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 26 Oct 2018 05:05:10 +0200 Subject: [PATCH 263/710] core: don't disable plugin if all providers throttled; fix #585 #574 --- Contents/Code/support/config.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index a87aa9104..46748a4f9 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -437,7 +437,7 @@ def set_plugin_mode(self): self.enable_channel = True # any provider enabled? - if not self.providers: + if not self.providers_enabled: self.enable_agent = False self.enable_channel = False Log.Warn("No providers enabled, disabling agent and interface!") @@ -728,8 +728,9 @@ def get_subtitle_formats(self): out.append("vtt") return out - def get_providers(self, media_type="series"): - providers = {'opensubtitles': cast_bool(Prefs['provider.opensubtitles.enabled']), + @property + def providers_by_prefs(self): + return {'opensubtitles': cast_bool(Prefs['provider.opensubtitles.enabled']), # 'thesubdb': Prefs['provider.thesubdb.enabled'], 'podnapisi': cast_bool(Prefs['provider.podnapisi.enabled']), 'titlovi': cast_bool(Prefs['provider.titlovi.enabled']), @@ -746,6 +747,12 @@ def get_providers(self, media_type="series"): 'assrt': cast_bool(Prefs['provider.assrt.enabled']), } + @property + def providers_enabled(self): + return filter(lambda prov: self.providers_by_prefs[prov], self.providers_by_prefs) + + def get_providers(self, media_type="series"): + providers = self.providers_by_prefs providers_by_prefs = copy.deepcopy(providers) # disable subscene for movies by default From e655f599bf34162db89b6a3e62730ca1d3820615 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 26 Oct 2018 16:48:59 +0200 Subject: [PATCH 264/710] Revert "core: add orderedmultidict" This reverts commit ea4f278 --- .../Shared/orderedmultidict/__init__.py | 21 - .../Shared/orderedmultidict/itemlist.py | 157 ---- .../orderedmultidict/orderedmultidict.py | 811 ------------------ Licenses/orderedmultidict/LICENSE.md | 31 - 4 files changed, 1020 deletions(-) delete mode 100644 Contents/Libraries/Shared/orderedmultidict/__init__.py delete mode 100644 Contents/Libraries/Shared/orderedmultidict/itemlist.py delete mode 100644 Contents/Libraries/Shared/orderedmultidict/orderedmultidict.py delete mode 100644 Licenses/orderedmultidict/LICENSE.md diff --git a/Contents/Libraries/Shared/orderedmultidict/__init__.py b/Contents/Libraries/Shared/orderedmultidict/__init__.py deleted file mode 100644 index 4f0ce2f7c..000000000 --- a/Contents/Libraries/Shared/orderedmultidict/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- - -# -# omdict - Ordered Multivalue Dictionary. -# -# Ansgar Grunseid -# grunseid.com -# grunseid@gmail.com -# -# License: Build Amazing Things (Unlicense) - -from __future__ import absolute_import - -from .orderedmultidict import * # noqa - -__title__ = 'orderedmultidict' -__version__ = '1.0' -__author__ = 'Ansgar Grunseid' -__contact__ = 'grunseid@gmail.com' -__license__ = 'Unlicense' -__url__ = 'https://github.com/gruns/orderedmultidict' diff --git a/Contents/Libraries/Shared/orderedmultidict/itemlist.py b/Contents/Libraries/Shared/orderedmultidict/itemlist.py deleted file mode 100644 index e9e96c725..000000000 --- a/Contents/Libraries/Shared/orderedmultidict/itemlist.py +++ /dev/null @@ -1,157 +0,0 @@ -# -*- coding: utf-8 -*- - -# -# omdict - Ordered Multivalue Dictionary. -# -# Ansgar Grunseid -# grunseid.com -# grunseid@gmail.com -# -# License: Build Amazing Things (Unlicense) - -from __future__ import absolute_import - -from six.moves import zip_longest - -_absent = object() # Marker that means no parameter was provided. - - -class itemnode(object): - - """ - Dictionary key:value items wrapped in a node to be members of itemlist, the - doubly linked list defined below. - """ - - def __init__(self, prev=None, next=None, key=_absent, value=_absent): - self.prev = prev - self.next = next - self.key = key - self.value = value - - -class itemlist(object): - - """ - Doubly linked list of itemnodes. - - This class is used as the key:value item storage of orderedmultidict. - Methods below were only added as needed for use with orderedmultidict, so - some otherwise common list methods may be missing. - """ - - def __init__(self, items=[]): - self.root = itemnode() - self.root.next = self.root.prev = self.root - self.size = 0 - - for key, value in items: - self.append(key, value) - - def append(self, key, value): - tail = self.root.prev if self.root.prev is not self.root else self.root - node = itemnode(tail, self.root, key=key, value=value) - tail.next = node - self.root.prev = node - self.size += 1 - return node - - def removenode(self, node): - node.prev.next = node.next - node.next.prev = node.prev - self.size -= 1 - return self - - def clear(self): - for node, key, value in self: - self.removenode(node) - return self - - def items(self): - return list(self.iteritems()) - - def keys(self): - return list(self.iterkeys()) - - def values(self): - return list(self.itervalues()) - - def iteritems(self): - for node, key, value in self: - yield key, value - - def iterkeys(self): - for node, key, value in self: - yield key - - def itervalues(self): - for node, key, value in self: - yield value - - def reverse(self): - for node, key, value in self: - node.prev, node.next = node.next, node.prev - self.root.prev, self.root.next = self.root.next, self.root.prev - return self - - def __len__(self): - return self.size - - def __iter__(self): - current = self.root.next - while current and current is not self.root: - # Record current.next here in case current.next changes after the - # yield and before we return for the next iteration. For example, - # methods like reverse() will change current.next() before yield - # gets executed again. - nextnode = current.next - yield current, current.key, current.value - current = nextnode - - def __contains__(self, item): - """ - Params: - item: Can either be a (key,value) tuple or an itemnode reference. - """ - node = key = value = _absent - if hasattr(item, '__len__') and callable(item.__len__): - if len(item) == 2: - key, value = item - elif len(item) == 3: - node, key, value = item - else: - node = item - - if node is not _absent or _absent not in [key, value]: - for selfnode, selfkey, selfvalue in self: - if ((node is _absent and key == selfkey and value == selfvalue) - or (node is not _absent and node == selfnode)): - return True - return False - - def __getitem__(self, index): - # Only support direct access to the first or last element, as this is - # all orderedmultidict needs for now. - if index == 0 and self.root.next is not self.root: - return self.root.next - elif index == -1 and self.root.prev is not self.root: - return self.root.prev - raise IndexError(index) - - def __delitem__(self, index): - self.removenode(self[index]) - - def __eq__(self, other): - for (n1, key1, value1), (n2, key2, value2) in zip_longest(self, other): - if key1 != key2 or value1 != value2: - return False - return True - - def __ne__(self, other): - return not self.__eq__(other) - - def __nonzero__(self): - return self.size > 0 - - def __str__(self): - return '[%s]' % self.items() diff --git a/Contents/Libraries/Shared/orderedmultidict/orderedmultidict.py b/Contents/Libraries/Shared/orderedmultidict/orderedmultidict.py deleted file mode 100644 index 924dd8d2b..000000000 --- a/Contents/Libraries/Shared/orderedmultidict/orderedmultidict.py +++ /dev/null @@ -1,811 +0,0 @@ -# -*- coding: utf-8 -*- - -# -# omdict - Ordered Multivalue Dictionary. -# -# Ansgar Grunseid -# grunseid.com -# grunseid@gmail.com -# -# License: Build Amazing Things (Unlicense) - -from __future__ import absolute_import - -from itertools import chain -from collections import MutableMapping - -import six -from six.moves import map, zip_longest - -from .itemlist import itemlist - -try: - from collections import OrderedDict as odict # Python 2.7 and later. -except ImportError: - from ordereddict import OrderedDict as odict # Python 2.6 and earlier. - -import sys -items_attr = 'items' if sys.version_info[0] >= 3 else 'iteritems' - -_absent = object() # Marker that means no parameter was provided. - - -def callable_attr(obj, attr): - return hasattr(obj, attr) and callable(getattr(obj, attr)) - - -# -# TODO(grun): Create a subclass of list that values(), getlist(), allitems(), -# etc return that the user can manipulate directly to control the omdict() -# object. -# -# For example, users should be able to do things like -# -# omd = omdict([(1,1), (1,11)]) -# omd.values(1).append('sup') -# omd.allitems() == [(1,1), (1,11), (1,'sup')] -# omd.values(1).remove(11) -# omd.allitems() == [(1,1), (1,'sup')] -# omd.values(1).extend(['two', 'more']) -# omd.allitems() == [(1,1), (1,'sup'), (1,'two'), (1,'more')] -# -# or -# -# omd = omdict([(1,1), (1,11)]) -# omd.allitems().extend([(2,2), (2,22)]) -# omd.allitems() == [(1,1), (1,11), (2,2), (2,22)]) -# -# or -# -# omd = omdict() -# omd.values(1) = [1, 11] -# omd.allitems() == [(1,1), (1,11)] -# omd.values(1) = list(map(lambda i: i * -10, omd.values(1))) -# omd.allitems() == [(1,-10), (1,-110)] -# omd.allitems() = filter(lambda (k,v): v > -100, omd.allitems()) -# omd.allitems() == [(1,-10)] -# -# etc. -# -# To accomplish this, subclass list in such a manner that each list element is -# really a two tuple, where the first tuple value is the actual value and the -# second tuple value is a reference to the itemlist node for that value. Users -# only interact with the first tuple values, the actual values, but behind the -# scenes when an element is modified, deleted, inserted, etc, the according -# itemlist nodes are modified, deleted, inserted, etc accordingly. In this -# manner, users can manipulate omdict objects directly through direct list -# manipulation. -# -# Once accomplished, some methods become redundant and should be removed in -# favor of the more intuitive direct value list manipulation. Such redundant -# methods include getlist() (removed in favor of values()?), addlist(), and -# setlist(). -# -# With the removal of many of the 'list' methods, think about renaming all -# remaining 'list' methods to 'values' methods, like poplist() -> popvalues(), -# poplistitem() -> popvaluesitem(), etc. This would be an easy switch for most -# methods, but wouldn't fit others so well. For example, iterlists() would -# become itervalues(), a name extremely similar to iterallvalues() but quite -# different in function. -# - - -class omdict(MutableMapping): - - """ - Ordered Multivalue Dictionary. - - A multivalue dictionary is a dictionary that can store multiple values per - key. An ordered multivalue dictionary is a multivalue dictionary that - retains the order of insertions and deletions. - - Internally, items are stored in a doubly linked list, self._items. A - dictionary, self._map, is also maintained and stores an ordered list of - linked list node references, one for each value associated with that key. - - Standard dict methods interact with the first value associated with a given - key. This means that omdict retains method parity with dict, and a dict - object can be replaced with an omdict object and all interaction will - behave identically. All dict methods that retain parity with omdict are: - - get(), setdefault(), pop(), popitem(), - clear(), copy(), update(), fromkeys(), len() - __getitem__(), __setitem__(), __delitem__(), __contains__(), - items(), keys(), values(), iteritems(), iterkeys(), itervalues(), - - Optional parameters have been added to some dict methods, but because the - added parameters are optional, existing use remains unaffected. An optional - parameter has been added to these methods: - - items(), values(), iteritems(), itervalues() - - New methods have also been added to omdict. Methods with 'list' in their - name interact with lists of values, and methods with 'all' in their name - interact with all items in the dictionary, including multiple items with - the same key. - - The new omdict methods are: - - load(), size(), reverse(), - getlist(), add(), addlist(), set(), setlist(), setdefaultlist(), - poplist(), popvalue(), popvalues(), popitem(), poplistitem(), - allitems(), allkeys(), allvalues(), lists(), listitems(), - iterallitems(), iterallkeys(), iterallvalues(), iterlists(), - iterlistitems() - - Explanations and examples of the new methods above can be found in the - function comments below and online at - - https://github.com/gruns/orderedmultidict - - Additional omdict information and documentation can also be found at the - above url. - """ - - def __init__(self, *args, **kwargs): - # Doubly linked list of itemnodes. Each itemnode stores a key:value - # item. - self._items = itemlist() - - # Ordered dictionary of keys and itemnode references. Each itemnode - # reference points to one of that keys values. - self._map = odict() - - self.load(*args, **kwargs) - - def load(self, *args, **kwargs): - """ - Clear all existing key:value items and import all key:value items from - . If multiple values exist for the same key in , they - are all be imported. - - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.load([(4,4), (4,44), (5,5)]) - omd.allitems() == [(4,4), (4,44), (5,5)] - - Returns: . - """ - self.clear() - self.updateall(*args, **kwargs) - return self - - def copy(self): - return self.__class__(self.allitems()) - - def clear(self): - self._map.clear() - self._items.clear() - - def size(self): - """ - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.size() == 5 - - Returns: Total number of items, including multiple items with the same - key. - """ - return len(self._items) - - @classmethod - def fromkeys(cls, iterable, value=None): - return cls([(key, value) for key in iterable]) - - def has_key(self, key): - return key in self - - def update(self, *args, **kwargs): - self._update_updateall(True, *args, **kwargs) - - def updateall(self, *args, **kwargs): - """ - Update this dictionary with the items from , replacing - existing key:value items with shared keys before adding new key:value - items. - - Example: - omd = omdict([(1,1), (2,2)]) - omd.updateall([(2,'two'), (1,'one'), (2,222), (1,111)]) - omd.allitems() == [(1, 'one'), (2, 'two'), (2, 222), (1, 111)] - - Returns: . - """ - self._update_updateall(False, *args, **kwargs) - return self - - def _update_updateall(self, replace_at_most_one, *args, **kwargs): - # Bin the items in and into or - # . Items in are new values to replace old - # values for a given key, and items in are new items to be - # added. - replacements, leftovers = dict(), [] - for mapping in chain(args, [kwargs]): - self._bin_update_items( - self._items_iterator(mapping), replace_at_most_one, - replacements, leftovers) - - # First, replace existing values for each key. - for key, values in six.iteritems(replacements): - self.setlist(key, values) - # Then, add the leftover items to the end of the list of all items. - for key, value in leftovers: - self.add(key, value) - - def _bin_update_items(self, items, replace_at_most_one, - replacements, leftovers): - """ - are modified directly, ala pass by - reference. - """ - for key, value in items: - # If there are existing items with key that have yet to be - # marked for replacement, mark that item's value to be replaced by - # by appending it to . - if key in self and key not in replacements: - replacements[key] = [value] - elif (key in self and not replace_at_most_one and - len(replacements[key]) < len(self.values(key))): - replacements[key].append(value) - else: - if replace_at_most_one: - replacements[key] = [value] - else: - leftovers.append((key, value)) - - def _items_iterator(self, container): - cont = container - iterator = iter(cont) - if callable_attr(cont, 'iterallitems'): - iterator = cont.iterallitems() - elif callable_attr(cont, 'allitems'): - iterator = iter(cont.allitems()) - elif callable_attr(cont, 'iteritems'): - iterator = cont.iteritems() - elif callable_attr(cont, 'items'): - iterator = iter(cont.items()) - return iterator - - def get(self, key, default=None): - if key in self: - return self._map[key][0].value - return default - - def getlist(self, key, default=[]): - """ - Returns: The list of values for if is in the dictionary, - else . If is not provided, an empty list is - returned. - """ - if key in self: - return [node.value for node in self._map[key]] - return default - - def setdefault(self, key, default=None): - if key in self: - return self[key] - self.add(key, default) - return default - - def setdefaultlist(self, key, defaultlist=[None]): - """ - Similar to setdefault() except is a list of values to set - for . If already exists, its existing list of values is - returned. - - If isn't a key and is an empty list, [], no values - are added for and will not be added as a key. - - Returns: List of 's values if exists in the dictionary, - otherwise . - """ - if key in self: - return self.getlist(key) - self.addlist(key, defaultlist) - return defaultlist - - def add(self, key, value=None): - """ - Add to the list of values for . If is not in the - dictionary, then is added as the sole value for . - - Example: - omd = omdict() - omd.add(1, 1) # omd.allitems() == [(1,1)] - omd.add(1, 11) # omd.allitems() == [(1,1), (1,11)] - omd.add(2, 2) # omd.allitems() == [(1,1), (1,11), (2,2)] - - Returns: . - """ - self._map.setdefault(key, []) - node = self._items.append(key, value) - self._map[key].append(node) - return self - - def addlist(self, key, valuelist=[]): - """ - Add the values in to the list of values for . If - is not in the dictionary, the values in become the values - for . - - Example: - omd = omdict([(1,1)]) - omd.addlist(1, [11, 111]) - omd.allitems() == [(1, 1), (1, 11), (1, 111)] - omd.addlist(2, [2]) - omd.allitems() == [(1, 1), (1, 11), (1, 111), (2, 2)] - - Returns: . - """ - for value in valuelist: - self.add(key, value) - return self - - def set(self, key, value=None): - """ - Sets 's value to . Identical in function to __setitem__(). - - Returns: . - """ - self[key] = value - return self - - def setlist(self, key, values): - """ - Sets 's list of values to . Existing items with key - are first replaced with new values from . Any remaining old - items that haven't been replaced with new values are deleted, and any - new values from that don't have corresponding items with - to replace are appended to the end of the list of all items. - - If values is an empty list, [], is deleted, equivalent in action - to del self[]. - - Example: - omd = omdict([(1,1), (2,2)]) - omd.setlist(1, [11, 111]) - omd.allitems() == [(1,11), (2,2), (1,111)] - - omd = omdict([(1,1), (1,11), (2,2), (1,111)]) - omd.setlist(1, [None]) - omd.allitems() == [(1,None), (2,2)] - - omd = omdict([(1,1), (1,11), (2,2), (1,111)]) - omd.setlist(1, []) - omd.allitems() == [(2,2)] - - Returns: . - """ - if not values and key in self: - self.pop(key) - else: - it = zip_longest( - list(self._map.get(key, [])), values, fillvalue=_absent) - for node, value in it: - if node is not _absent and value is not _absent: - node.value = value - elif node is _absent: - self.add(key, value) - elif value is _absent: - self._map[key].remove(node) - self._items.removenode(node) - return self - - def removevalues(self, key, values): - """ - Removes all from the values of . If has no - remaining values after removevalues(), the key is popped. - - Example: - omd = omdict([(1, 1), (1, 11), (1, 1), (1, 111)]) - omd.removevalues(1, [1, 111]) - omd.allitems() == [(1, 11)] - - Returns: . - """ - self.setlist(key, [v for v in self.getlist(key) if v not in values]) - return self - - def pop(self, key, default=_absent): - if key in self: - return self.poplist(key)[0] - elif key not in self._map and default is not _absent: - return default - raise KeyError(key) - - def poplist(self, key, default=_absent): - """ - If is in the dictionary, pop it and return its list of values. If - is not in the dictionary, return . KeyError is raised if - is not provided and is not in the dictionary. - - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.poplist(1) == [1, 11, 111] - omd.allitems() == [(2,2), (3,3)] - omd.poplist(2) == [2] - omd.allitems() == [(3,3)] - - Raises: KeyError if isn't in the dictionary and isn't - provided. - Returns: List of 's values. - """ - if key in self: - values = self.getlist(key) - del self._map[key] - for node, nodekey, nodevalue in self._items: - if nodekey == key: - self._items.removenode(node) - return values - elif key not in self._map and default is not _absent: - return default - raise KeyError(key) - - def popvalue(self, key, value=_absent, default=_absent, last=True): - """ - If is provided, pops the first or last (key,value) item in the - dictionary if is in the dictionary. - - If is not provided, pops the first or last value for if - is in the dictionary. - - If no longer has any values after a popvalue() call, is - removed from the dictionary. If isn't in the dictionary and - was provided, return default. KeyError is raised if - is not provided and is not in the dictionary. ValueError is - raised if is provided but isn't a value for . - - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3), (2,22)]) - omd.popvalue(1) == 111 - omd.allitems() == [(1,11), (1,111), (2,2), (3,3), (2,22)] - omd.popvalue(1, last=False) == 1 - omd.allitems() == [(1,11), (2,2), (3,3), (2,22)] - omd.popvalue(2, 2) == 2 - omd.allitems() == [(1,11), (3,3), (2,22)] - omd.popvalue(1, 11) == 11 - omd.allitems() == [(3,3), (2,22)] - omd.popvalue('not a key', default='sup') == 'sup' - - Params: - last: Boolean whether to return 's first value ( is False) - or last value ( is True). - Raises: - KeyError if isn't in the dictionary and isn't - provided. - ValueError if isn't a value for . - Returns: The first or last of 's values. - """ - def pop_node_with_index(key, index): - node = self._map[key].pop(index) - if not self._map[key]: - del self._map[key] - self._items.removenode(node) - return node - - if key in self: - if value is not _absent: - if last: - pos = self.values(key)[::-1].index(value) - else: - pos = self.values(key).index(value) - if pos == -1: - raise ValueError(value) - else: - index = (len(self.values(key)) - 1 - pos) if last else pos - return pop_node_with_index(key, index).value - else: - return pop_node_with_index(key, -1 if last else 0).value - elif key not in self._map and default is not _absent: - return default - raise KeyError(key) - - def popitem(self, fromall=False, last=True): - """ - Pop and return a key:value item. - - If is False, items()[0] is popped if is False or - items()[-1] is popped if is True. All remaining items with the - same key are removed. - - If is True, allitems()[0] is popped if is False or - allitems()[-1] is popped if is True. Any remaining items with - the same key remain. - - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.popitem() == (3,3) - omd.popitem(fromall=False, last=False) == (1,1) - omd.popitem(fromall=False, last=False) == (2,2) - - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.popitem(fromall=True, last=False) == (1,1) - omd.popitem(fromall=True, last=False) == (1,11) - omd.popitem(fromall=True, last=True) == (3,3) - omd.popitem(fromall=True, last=False) == (1,111) - - Params: - fromall: Whether to pop an item from items() ( is True) or - allitems() ( is False). - last: Boolean whether to pop the first item or last item of items() - or allitems(). - Raises: KeyError if the dictionary is empty. - Returns: The first or last item from item() or allitem(). - """ - if not self._items: - raise KeyError('popitem(): %s is empty' % self.__class__.__name__) - - if fromall: - node = self._items[-1 if last else 0] - key = node.key - return key, self.popvalue(key, last=last) - else: - key = list(self._map.keys())[-1 if last else 0] - return key, self.pop(key) - - def poplistitem(self, last=True): - """ - Pop and return a key:valuelist item comprised of a key and that key's - list of values. If is False, a key:valuelist item comprised of - keys()[0] and its list of values is popped and returned. If is - True, a key:valuelist item comprised of keys()[-1] and its list of - values is popped and returned. - - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.poplistitem(last=True) == (3,[3]) - omd.poplistitem(last=False) == (1,[1,11,111]) - - Params: - last: Boolean whether to pop the first or last key and its associated - list of values. - Raises: KeyError if the dictionary is empty. - Returns: A two-tuple comprised of the first or last key and its - associated list of values. - """ - if not self._items: - s = 'poplistitem(): %s is empty' % self.__class__.__name__ - raise KeyError(s) - - key = self.keys()[-1 if last else 0] - return key, self.poplist(key) - - def items(self, key=_absent): - """ - Raises: KeyError if is provided and not in the dictionary. - Returns: List created from iteritems(). Only items with key - are returned if is provided and is a dictionary key. - """ - return list(self.iteritems(key)) - - def keys(self): - return list(self.iterkeys()) - - def values(self, key=_absent): - """ - Raises: KeyError if is provided and not in the dictionary. - Returns: List created from itervalues().If is provided and - is a dictionary key, only values of items with key are - returned. - """ - if key is not _absent and key in self._map: - return self.getlist(key) - return list(self.itervalues()) - - def lists(self): - """ - Returns: List created from iterlists(). - """ - return list(self.iterlists()) - - def listitems(self): - """ - Returns: List created from iterlistitems(). - """ - return list(self.iterlistitems()) - - def iteritems(self, key=_absent): - """ - Parity with dict.iteritems() except the optional parameter has - been added. If is provided, only items with the provided key are - iterated over. KeyError is raised if is provided and not in the - dictionary. - - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.iteritems(1) -> (1,1) -> (1,11) -> (1,111) - omd.iteritems() -> (1,1) -> (2,2) -> (3,3) - - Raises: KeyError if is provided and not in the dictionary. - Returns: An iterator over the items() of the dictionary, or only items - with the key if is provided. - """ - if key is not _absent: - if key in self: - items = [(node.key, node.value) for node in self._map[key]] - return iter(items) - raise KeyError(key) - items = six.iteritems(self._map) - return iter((key, nodes[0].value) for (key, nodes) in items) - - def iterkeys(self): - return six.iterkeys(self._map) - - def itervalues(self, key=_absent): - """ - Parity with dict.itervalues() except the optional parameter has - been added. If is provided, only values from items with the - provided key are iterated over. KeyError is raised if is provided - and not in the dictionary. - - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.itervalues(1) -> 1 -> 11 -> 111 - omd.itervalues() -> 1 -> 11 -> 111 -> 2 -> 3 - - Raises: KeyError if is provided and isn't in the dictionary. - Returns: An iterator over the values() of the dictionary, or only the - values of key if is provided. - """ - if key is not _absent: - if key in self: - return iter([node.value for node in self._map[key]]) - raise KeyError(key) - return iter([nodes[0].value for nodes in six.itervalues(self._map)]) - - def allitems(self, key=_absent): - ''' - Raises: KeyError if is provided and not in the dictionary. - Returns: List created from iterallitems(). - ''' - return list(self.iterallitems(key)) - - def allkeys(self): - ''' - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.allkeys() == [1,1,1,2,3] - - Returns: List created from iterallkeys(). - ''' - return list(self.iterallkeys()) - - def allvalues(self, key=_absent): - ''' - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.allvalues() == [1,11,111,2,3] - omd.allvalues(1) == [1,11,111] - - Raises: KeyError if is provided and not in the dictionary. - Returns: List created from iterallvalues(). - ''' - return list(self.iterallvalues(key)) - - def iterallitems(self, key=_absent): - ''' - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.iterallitems() == (1,1) -> (1,11) -> (1,111) -> (2,2) -> (3,3) - omd.iterallitems(1) == (1,1) -> (1,11) -> (1,111) - - Raises: KeyError if is provided and not in the dictionary. - Returns: An iterator over every item in the diciontary. If is - provided, only items with the key are iterated over. - ''' - if key is not _absent: - # Raises KeyError if is not in self._map. - return self.iteritems(key) - return self._items.iteritems() - - def iterallkeys(self): - ''' - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.iterallkeys() == 1 -> 1 -> 1 -> 2 -> 3 - - Returns: An iterator over the keys of every item in the dictionary. - ''' - return self._items.iterkeys() - - def iterallvalues(self, key=_absent): - ''' - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.iterallvalues() == 1 -> 11 -> 111 -> 2 -> 3 - - Returns: An iterator over the values of every item in the dictionary. - ''' - if key is not _absent: - if key in self: - return iter(self.getlist(key)) - raise KeyError(key) - return self._items.itervalues() - - def iterlists(self): - ''' - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.iterlists() -> [1,11,111] -> [2] -> [3] - - Returns: An iterator over the list comprised of the lists of values for - each key. - ''' - return map(lambda key: self.getlist(key), self) - - def iterlistitems(self): - """ - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.iterlistitems() -> (1,[1,11,111]) -> (2,[2]) -> (3,[3]) - - Returns: An iterator over the list of key:valuelist items. - """ - return map(lambda key: (key, self.getlist(key)), self) - - def reverse(self): - """ - Reverse the order of all items in the dictionary. - - Example: - omd = omdict([(1,1), (1,11), (1,111), (2,2), (3,3)]) - omd.reverse() - omd.allitems() == [(3,3), (2,2), (1,111), (1,11), (1,1)] - - Returns: . - """ - for key in six.iterkeys(self._map): - self._map[key].reverse() - self._items.reverse() - return self - - def __eq__(self, other): - if callable_attr(other, 'iterallitems'): - myiter, otheriter = self.iterallitems(), other.iterallitems() - for i1, i2 in zip_longest(myiter, otheriter, fillvalue=_absent): - if i1 != i2 or i1 is _absent or i2 is _absent: - return False - elif not hasattr(other, '__len__') or not hasattr(other, items_attr): - return False - # Ignore order so we can compare ordered omdicts with unordered dicts. - else: - if len(self) != len(other): - return False - for key, value in six.iteritems(other): - if self.get(key, _absent) != value: - return False - return True - - def __ne__(self, other): - return not self.__eq__(other) - - def __len__(self): - return len(self._map) - - def __iter__(self): - for key in self.iterkeys(): - yield key - - def __contains__(self, key): - return key in self._map - - def __getitem__(self, key): - if key in self: - return self.get(key) - raise KeyError(key) - - def __setitem__(self, key, value): - self.setlist(key, [value]) - - def __delitem__(self, key): - return self.pop(key) - - def __nonzero__(self): - return bool(self._map) - - def __str__(self): - return '{%s}' % ', '.join( - map(lambda p: '%r: %r' % (p[0], p[1]), self.iterallitems())) - - def __repr__(self): - return '%s(%s)' % (self.__class__.__name__, self.allitems()) diff --git a/Licenses/orderedmultidict/LICENSE.md b/Licenses/orderedmultidict/LICENSE.md deleted file mode 100644 index 210e8658b..000000000 --- a/Licenses/orderedmultidict/LICENSE.md +++ /dev/null @@ -1,31 +0,0 @@ -Build Amazing Things. - -*** - -### Unlicense - -This is free and unencumbered software released into the public\ -domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or distribute\ -this software, either in source code form or as a compiled binary, for any\ -purpose, commercial or non-commercial, and by any means. - -In jurisdictions that recognize copyright laws, the author or authors of\ -this software dedicate any and all copyright interest in the software to the\ -public domain. We make this dedication for the benefit of the public at\ -large and to the detriment of our heirs and successors. We intend this\ -dedication to be an overt act of relinquishment in perpetuity of all\ -present and future rights to this software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF\ -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\ -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\ -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\ -SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\ -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT\ -OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\ -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\ -SOFTWARE. - -For more information, please refer to From a070680c46375cebb990a909257df13f17d48848 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 26 Oct 2018 16:49:03 +0200 Subject: [PATCH 265/710] Revert "core: add furl license" This reverts commit fc532e3 --- Licenses/furl/LICENSE.md.txt | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 Licenses/furl/LICENSE.md.txt diff --git a/Licenses/furl/LICENSE.md.txt b/Licenses/furl/LICENSE.md.txt deleted file mode 100644 index ed374f584..000000000 --- a/Licenses/furl/LICENSE.md.txt +++ /dev/null @@ -1,30 +0,0 @@ -Build Amazing Things. - -*** - -### Unlicense - -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to . \ No newline at end of file From 09a6e26055dbfe95bdb7f455f9a91cc2d6d2c38c Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 26 Oct 2018 16:49:06 +0200 Subject: [PATCH 266/710] Revert "core: add furl==2.0.0" This reverts commit c4a79c0 --- Contents/Libraries/Shared/furl/__init__.py | 20 - Contents/Libraries/Shared/furl/common.py | 24 - Contents/Libraries/Shared/furl/compat.py | 37 - Contents/Libraries/Shared/furl/furl.py | 1807 -------------------- Contents/Libraries/Shared/furl/omdict1D.py | 112 -- 5 files changed, 2000 deletions(-) delete mode 100644 Contents/Libraries/Shared/furl/__init__.py delete mode 100644 Contents/Libraries/Shared/furl/common.py delete mode 100644 Contents/Libraries/Shared/furl/compat.py delete mode 100644 Contents/Libraries/Shared/furl/furl.py delete mode 100644 Contents/Libraries/Shared/furl/omdict1D.py diff --git a/Contents/Libraries/Shared/furl/__init__.py b/Contents/Libraries/Shared/furl/__init__.py deleted file mode 100644 index cf944eeb4..000000000 --- a/Contents/Libraries/Shared/furl/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- - -# -# furl - URL manipulation made simple. -# -# Ansgar Grunseid -# grunseid.com -# grunseid@gmail.com -# -# License: Build Amazing Things (Unlicense) -# - -from .furl import * # noqa - -__title__ = 'furl' -__version__ = '2.0.0' -__license__ = 'Unlicense' -__author__ = 'Ansgar Grunseid' -__contact__ = 'grunseid@gmail.com' -__url__ = 'https://github.com/gruns/furl' diff --git a/Contents/Libraries/Shared/furl/common.py b/Contents/Libraries/Shared/furl/common.py deleted file mode 100644 index 748c38058..000000000 --- a/Contents/Libraries/Shared/furl/common.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- - -# -# furl - URL manipulation made simple. -# -# Ansgar Grunseid -# grunseid.com -# grunseid@gmail.com -# -# License: Build Amazing Things (Unlicense) -# - -from .compat import string_types - - -absent = object() - - -def callable_attr(obj, attr): - return hasattr(obj, attr) and callable(getattr(obj, attr)) - - -def is_iterable_but_not_string(v): - return callable_attr(v, '__iter__') and not isinstance(v, string_types) diff --git a/Contents/Libraries/Shared/furl/compat.py b/Contents/Libraries/Shared/furl/compat.py deleted file mode 100644 index 266881f4b..000000000 --- a/Contents/Libraries/Shared/furl/compat.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- - -# -# furl - URL manipulation made simple. -# -# Ansgar Grunseid -# grunseid.com -# grunseid@gmail.com -# -# License: Build Amazing Things (Unlicense) -# - -import sys - - -if sys.version_info[0] == 2: - string_types = basestring # noqa -else: - string_types = (str, bytes) - - -if list(sys.version_info[:2]) >= [2, 7]: - from collections import OrderedDict # noqa -else: - from ordereddict import OrderedDict # noqa - - -class UnicodeMixin(object): - """ - Mixin that defines proper __str__/__unicode__ methods in Python 2 or 3. - """ - if sys.version_info[0] >= 3: # Python 3 - def __str__(self): - return self.__unicode__() - else: # Python 2 - def __str__(self): - return self.__unicode__().encode('utf8') diff --git a/Contents/Libraries/Shared/furl/furl.py b/Contents/Libraries/Shared/furl/furl.py deleted file mode 100644 index cf4bbbdb3..000000000 --- a/Contents/Libraries/Shared/furl/furl.py +++ /dev/null @@ -1,1807 +0,0 @@ -# -*- coding: utf-8 -*- - -# -# furl - URL manipulation made simple. -# -# Ansgar Grunseid -# grunseid.com -# grunseid@gmail.com -# -# License: Build Amazing Things (Unlicense) -# - -import re -import abc -import warnings -from posixpath import normpath - -import six -from six.moves import urllib -from six.moves.urllib.parse import quote, unquote -try: - from icecream import ic -except ImportError: # Graceful fallback if IceCream isn't installed. - ic = lambda *a: None if not a else (a[0] if len(a) == 1 else a) # noqa - -from .omdict1D import omdict1D -from .compat import string_types, UnicodeMixin -from .common import ( - callable_attr, is_iterable_but_not_string, absent as _absent) - - -# Map of common protocols, as suggested by the common protocols included in -# urllib/parse.py, to their default ports. Protocol scheme strings are -# lowercase. -DEFAULT_PORTS = { - 'ws': 80, - 'ftp': 21, - 'git': 9418, - 'hdl': 2641, - 'nfs': 111, - 'sip': 5060, - 'ssh': 22, - 'svn': 3690, - 'wss': 443, - 'http': 80, - 'imap': 143, - 'nntp': 119, - 'sftp': 22, - 'sips': 5061, - 'tftp': 69, - 'rtsp': 554, - 'wais': 210, - 'https': 443, - 'rsync': 873, - 'rtspu': 5004, - 'snews': 563, - 'gopher': 70, - 'telnet': 23, - 'prospero': 191, -} - - -def lget(l, index, default=None): - try: - return l[index] - except IndexError: - return default - - -def attemptstr(o): - try: - return str(o) - except Exception: - return o - - -def utf8(o, default=_absent): - try: - return o.encode('utf8') - except Exception: - return o if default is _absent else default - - -def non_string_iterable(o): - return callable_attr(o, '__iter__') and not isinstance(o, string_types) - - -# TODO(grun): Support IDNA2008 via the third party idna module. See -# https://github.com/gruns/furl/issues/73. -def idna_encode(o): - if callable_attr(o, 'encode'): - return str(o.encode('idna').decode('utf8')) - return o - - -def idna_decode(o): - if callable_attr(utf8(o), 'decode'): - return utf8(o).decode('idna') - return o - - -def is_valid_port(port): - port = str(port) - if not port.isdigit() or not 0 < int(port) <= 65535: - return False - return True - - -def static_vars(**kwargs): - def decorator(func): - for key, value in six.iteritems(kwargs): - setattr(func, key, value) - return func - return decorator - - -# -# TODO(grun): Update some of the regex functions below to reflect the fact that -# the valid encoding of Path segments differs slightly from the valid encoding -# of Fragment Path segments. Similarly, the valid encodings of Query keys and -# values differ slightly from the valid encodings of Fragment Query keys and -# values. -# -# For example, '?' and '#' don't need to be encoded in Fragment Path segments -# but they must be encoded in Path segments. Similarly, '#' doesn't need to be -# encoded in Fragment Query keys and values, but must be encoded in Query keys -# and values. -# -# Perhaps merge them with URLPath, FragmentPath, URLQuery, and -# FragmentQuery when those new classes are created (see the TODO -# currently at the top of the source, 02/03/2012). -# - -# RFC 3986 (https://www.ietf.org/rfc/rfc3986.txt) -# -# unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" -# -# pct-encoded = "%" HEXDIG HEXDIG -# -# sub-delims = "!" / "$" / "&" / "'" / "(" / ")" -# / "*" / "+" / "," / ";" / "=" -# -# pchar = unreserved / pct-encoded / sub-delims / ":" / "@" -# -# === Path === -# segment = *pchar -# -# === Query === -# query = *( pchar / "/" / "?" ) -# -# === Scheme === -# scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) -# -PERCENT_REGEX = r'\%[a-fA-F\d][a-fA-F\d]' -INVALID_HOST_CHARS = '!@#$%^&\'\"*()+=:;/' - - -@static_vars(regex=re.compile( - r'^([\w%s]|(%s))*$' % (re.escape('-.~:@!$&\'()*+,;='), PERCENT_REGEX))) -def is_valid_encoded_path_segment(segment): - return is_valid_encoded_path_segment.regex.match(segment) is not None - - -@static_vars(regex=re.compile( - r'^([\w%s]|(%s))*$' % (re.escape('-.~:@!$&\'()*+,;/?'), PERCENT_REGEX))) -def is_valid_encoded_query_key(key): - return is_valid_encoded_query_key.regex.match(key) is not None - - -@static_vars(regex=re.compile( - r'^([\w%s]|(%s))*$' % (re.escape('-.~:@!$&\'()*+,;/?='), PERCENT_REGEX))) -def is_valid_encoded_query_value(value): - return is_valid_encoded_query_value.regex.match(value) is not None - - -@static_vars(regex=re.compile(r'[a-zA-Z][a-zA-Z\-\.\+]*')) -def is_valid_scheme(scheme): - return is_valid_scheme.regex.match(scheme) is not None - - -@static_vars(regex=re.compile('[%s]' % re.escape(INVALID_HOST_CHARS))) -def is_valid_host(hostname): - toks = hostname.split('.') - if toks[-1] == '': # Trailing '.' in a fully qualified domain name. - toks.pop() - - for tok in toks: - if is_valid_host.regex.search(tok) is not None: - return False - - return '' not in toks # Adjacent periods aren't allowed. - - -def get_scheme(url): - if url.startswith(':'): - return '' - - # Avoid incorrect scheme extraction with url.find(':') when other URL - # components, like the path, query, fragment, etc, may have a colon in - # them. For example, the URL 'a?query:', whose query has a ':' in it. - no_fragment = url.split('#', 1)[0] - no_query = no_fragment.split('?', 1)[0] - no_path_or_netloc = no_query.split('/', 1)[0] - scheme = url[:max(0, no_path_or_netloc.find(':'))] or None - - if scheme is not None and not is_valid_scheme(scheme): - return None - - return scheme - - -def strip_scheme(url): - scheme = get_scheme(url) or '' - url = url[len(scheme):] - if url.startswith(':'): - url = url[1:] - return url - - -def set_scheme(url, scheme): - after_scheme = strip_scheme(url) - if scheme is None: - return after_scheme - else: - return '%s:%s' % (scheme, after_scheme) - - -# 'netloc' in Python parlance, 'authority' in RFC 3986 parlance. -def has_netloc(url): - scheme = get_scheme(url) - return url.startswith('//' if scheme is None else scheme + '://') - - -def urlsplit(url): - """ - Parameters: - url: URL string to split. - Returns: urlparse.SplitResult tuple subclass, just like - urlparse.urlsplit() returns, with fields (scheme, netloc, path, - query, fragment, username, password, hostname, port). See - http://docs.python.org/library/urlparse.html#urlparse.urlsplit - for more details on urlsplit(). - """ - original_scheme = get_scheme(url) - - # urlsplit() parses URLs differently depending on whether or not the URL's - # scheme is in any of - # - # urllib.parse.uses_fragment - # urllib.parse.uses_netloc - # urllib.parse.uses_params - # urllib.parse.uses_query - # urllib.parse.uses_relative - # - # For consistent URL parsing, switch the URL's scheme to 'http', a scheme - # in all of the aforementioned uses_* lists, and afterwards revert to the - # original scheme (which may or may not be in some, or all, of the the - # uses_* lists). - if original_scheme is not None: - url = set_scheme(url, 'http') - - scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url) - - # Detect and preserve the '//' before the netloc, if present. E.g. preserve - # URLs like 'http:', 'http://', and '///sup' correctly. - after_scheme = strip_scheme(url) - if after_scheme.startswith('//'): - netloc = netloc or '' - else: - netloc = None - - scheme = original_scheme - - return urllib.parse.SplitResult(scheme, netloc, path, query, fragment) - - -def urljoin(base, url): - """ - Parameters: - base: Base URL to join with . - url: Relative or absolute URL to join with . - - Returns: The resultant URL from joining and . - """ - base_scheme = get_scheme(base) if has_netloc(base) else None - url_scheme = get_scheme(url) if has_netloc(url) else None - - if base_scheme is not None: - # For consistent URL joining, switch the base URL's scheme to - # 'http'. urllib.parse.urljoin() behaves differently depending on the - # scheme. E.g. - # - # >>> urllib.parse.urljoin('http://google.com/', 'hi') - # 'http://google.com/hi' - # - # vs - # - # >>> urllib.parse.urljoin('asdf://google.com/', 'hi') - # 'hi' - root = set_scheme(base, 'http') - else: - root = base - - joined = urllib.parse.urljoin(root, url) - - new_scheme = url_scheme if url_scheme is not None else base_scheme - if new_scheme is not None and has_netloc(joined): - joined = set_scheme(joined, new_scheme) - - return joined - - -def join_path_segments(*args): - """ - Join multiple lists of path segments together, intelligently - handling path segments borders to preserve intended slashes of the - final constructed path. - - This function is not encoding aware. It doesn't test for, or change, - the encoding of path segments it is passed. - - Examples: - join_path_segments(['a'], ['b']) == ['a','b'] - join_path_segments(['a',''], ['b']) == ['a','b'] - join_path_segments(['a'], ['','b']) == ['a','b'] - join_path_segments(['a',''], ['','b']) == ['a','','b'] - join_path_segments(['a','b'], ['c','d']) == ['a','b','c','d'] - - Returns: A list containing the joined path segments. - """ - finals = [] - - for segments in args: - if not segments or segments == ['']: - continue - elif not finals: - finals.extend(segments) - else: - # Example #1: ['a',''] + ['b'] == ['a','b'] - # Example #2: ['a',''] + ['','b'] == ['a','','b'] - if finals[-1] == '' and (segments[0] != '' or len(segments) > 1): - finals.pop(-1) - # Example: ['a'] + ['','b'] == ['a','b'] - elif finals[-1] != '' and segments[0] == '' and len(segments) > 1: - segments = segments[1:] - finals.extend(segments) - - return finals - - -def remove_path_segments(segments, remove): - """ - Removes the path segments of from the end of the path - segments . - - Examples: - # ('/a/b/c', 'b/c') -> '/a/' - remove_path_segments(['','a','b','c'], ['b','c']) == ['','a',''] - # ('/a/b/c', '/b/c') -> '/a' - remove_path_segments(['','a','b','c'], ['','b','c']) == ['','a'] - - Returns: The list of all remaining path segments after the segments - in have been removed from the end of . If no - segments from were removed from , is - returned unmodified. - """ - # [''] means a '/', which is properly represented by ['', '']. - if segments == ['']: - segments.append('') - if remove == ['']: - remove.append('') - - ret = None - if remove == segments: - ret = [] - elif len(remove) > len(segments): - ret = segments - else: - toremove = list(remove) - - if len(remove) > 1 and remove[0] == '': - toremove.pop(0) - - if toremove and toremove == segments[-1 * len(toremove):]: - ret = segments[:len(segments) - len(toremove)] - if remove[0] != '' and ret: - ret.append('') - else: - ret = segments - - return ret - - -def quacks_like_a_path_with_segments(obj): - return ( - hasattr(obj, 'segments') and - is_iterable_but_not_string(obj.segments)) - - -class Path(object): - - """ - Represents a path comprised of zero or more path segments. - - http://tools.ietf.org/html/rfc3986#section-3.3 - - Path parameters aren't supported. - - Attributes: - _force_absolute: Function whos boolean return value specifies - whether self.isabsolute should be forced to True or not. If - _force_absolute(self) returns True, isabsolute is read only and - raises an AttributeError if assigned to. If - _force_absolute(self) returns False, isabsolute is mutable and - can be set to True or False. URL paths use _force_absolute and - return True if the netloc is non-empty (not equal to - ''). Fragment paths are never read-only and their - _force_absolute(self) always returns False. - segments: List of zero or more path segments comprising this - path. If the path string has a trailing '/', the last segment - will be '' and self.isdir will be True and self.isfile will be - False. An empty segment list represents an empty path, not '/' - (though they have the same meaning). - isabsolute: Boolean whether or not this is an absolute path or - not. An absolute path starts with a '/'. self.isabsolute is - False if the path is empty (self.segments == [] and str(path) == - ''). - strict: Boolean whether or not UserWarnings should be raised if - improperly encoded path strings are provided to methods that - take such strings, like load(), add(), set(), remove(), etc. - """ - - # RFC 3986: - # - # segment = *pchar - # pchar = unreserved / pct-encoded / sub-delims / ":" / "@" - # unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" - # sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - # / "*" / "+" / "," / ";" / "=" - SAFE_SEGMENT_CHARS = ":@-._~!$&'()*+,;=" - - def __init__(self, path='', force_absolute=lambda _: False, strict=False): - self.segments = [] - - self.strict = strict - self._isabsolute = False - self._force_absolute = force_absolute - - self.load(path) - - def load(self, path): - """ - Load , replacing any existing path. can either be - a Path instance, a list of segments, a path string to adopt. - - Returns: . - """ - if not path: - segments = [] - elif quacks_like_a_path_with_segments(path): # Path interface. - segments = path.segments - elif is_iterable_but_not_string(path): # List interface. - segments = path - else: # String interface. - segments = self._segments_from_path(path) - - if self._force_absolute(self): - self._isabsolute = True if segments else False - else: - self._isabsolute = (segments and segments[0] == '') - - if self.isabsolute and len(segments) > 1 and segments[0] == '': - segments.pop(0) - - self.segments = segments - - return self - - def add(self, path): - """ - Add to the existing path. can either be a Path instance, - a list of segments, or a path string to append to the existing path. - - Returns: . - """ - if quacks_like_a_path_with_segments(path): # Path interface. - newsegments = path.segments - elif is_iterable_but_not_string(path): # List interface. - newsegments = path - else: # String interface. - newsegments = self._segments_from_path(path) - - # Preserve the opening '/' if one exists already (self.segments - # == ['']). - if self.segments == [''] and newsegments and newsegments[0] != '': - newsegments.insert(0, '') - - segments = self.segments - if self.isabsolute and self.segments and self.segments[0] != '': - segments.insert(0, '') - - self.load(join_path_segments(segments, newsegments)) - - return self - - def set(self, path): - self.load(path) - return self - - def remove(self, path): - if path is True: - self.load('') - else: - if is_iterable_but_not_string(path): # List interface. - segments = path - else: # String interface. - segments = self._segments_from_path(path) - base = ([''] if self.isabsolute else []) + self.segments - self.load(remove_path_segments(base, segments)) - - return self - - def normalize(self): - """ - Normalize the path. Turn '//a/./b/../c//' into '/a/c/'. - - Returns: . - """ - if str(self): - normalized = normpath(str(self)) + ('/' * self.isdir) - if normalized.startswith('//'): # http://bugs.python.org/636648 - normalized = '/' + normalized.lstrip('/') - self.load(normalized) - - return self - - def asdict(self): - return { - 'encoded': str(self), - 'isdir': self.isdir, - 'isfile': self.isfile, - 'segments': self.segments, - 'isabsolute': self.isabsolute, - } - - @property - def isabsolute(self): - if self._force_absolute(self): - return True - return self._isabsolute - - @isabsolute.setter - def isabsolute(self, isabsolute): - """ - Raises: AttributeError if _force_absolute(self) returns True. - """ - if self._force_absolute(self): - s = ('Path.isabsolute is True and read-only for URLs with a netloc' - ' (a username, password, host, and/or port). A URL path must ' - "start with a '/' to separate itself from a netloc.") - raise AttributeError(s) - self._isabsolute = isabsolute - - @property - def isdir(self): - """ - Returns: True if the path ends on a directory, False - otherwise. If True, the last segment is '', representing the - trailing '/' of the path. - """ - return (self.segments == [] or - (self.segments and self.segments[-1] == '')) - - @property - def isfile(self): - """ - Returns: True if the path ends on a file, False otherwise. If - True, the last segment is not '', representing some file as the - last segment of the path. - """ - return not self.isdir - - def __truediv__(self, path): - copy = self.__class__( - path=self.segments, - force_absolute=self._force_absolute, - strict=self.strict) - return copy.add(path) - - def __eq__(self, other): - return str(self) == str(other) - - def __ne__(self, other): - return not self == other - - def __bool__(self): - return len(self.segments) > 0 - __nonzero__ = __bool__ - - def __str__(self): - segments = list(self.segments) - if self.isabsolute: - if not segments: - segments = ['', ''] - else: - segments.insert(0, '') - return self._path_from_segments(segments) - - def __repr__(self): - return "%s('%s')" % (self.__class__.__name__, str(self)) - - def _segments_from_path(self, path): - """ - Returns: The list of path segments from the path string . - - Raises: UserWarning if is an improperly encoded path - string and self.strict is True. - - TODO(grun): Accept both list values and string values and - refactor the list vs string interface testing to this common - method. - """ - segments = [] - for segment in path.split('/'): - if not is_valid_encoded_path_segment(segment): - segment = quote(utf8(segment)) - if self.strict: - s = ("Improperly encoded path string received: '%s'. " - "Proceeding, but did you mean '%s'?" % - (path, self._path_from_segments(segments))) - warnings.warn(s, UserWarning) - segments.append(utf8(segment)) - del segment - - # In Python 3, utf8() returns Bytes objects that must be decoded into - # strings before they can be passed to unquote(). In Python 2, utf8() - # returns strings that can be passed directly to urllib.unquote(). - segments = [ - segment.decode('utf8') - if isinstance(segment, bytes) and not isinstance(segment, str) - else segment for segment in segments] - - return [unquote(segment) for segment in segments] - - def _path_from_segments(self, segments): - """ - Combine the provided path segments into a path string. Path - segments in will be quoted. - - Returns: A path string with quoted path segments. - """ - segments = [ - quote(utf8(attemptstr(segment)), self.SAFE_SEGMENT_CHARS) - for segment in segments] - return '/'.join(segments) - - -@six.add_metaclass(abc.ABCMeta) -class PathCompositionInterface(object): - - """ - Abstract class interface for a parent class that contains a Path. - """ - - def __init__(self, strict=False): - """ - Params: - force_absolute: See Path._force_absolute. - - Assignments to in __init__() must be added to - __setattr__() below. - """ - self._path = Path(force_absolute=self._force_absolute, strict=strict) - - @property - def path(self): - return self._path - - @property - def pathstr(self): - """This method is deprecated. Use str(furl.path) instead.""" - s = ('furl.pathstr is deprecated. Use str(furl.path) instead. There ' - 'should be one, and preferably only one, obvious way to serialize' - ' a Path object to a string.') - warnings.warn(s, DeprecationWarning) - return str(self._path) - - @abc.abstractmethod - def _force_absolute(self, path): - """ - Subclass me. - """ - pass - - def __setattr__(self, attr, value): - """ - Returns: True if this attribute is handled and set here, False - otherwise. - """ - if attr == '_path': - self.__dict__[attr] = value - return True - elif attr == 'path': - self._path.load(value) - return True - return False - - -@six.add_metaclass(abc.ABCMeta) -class URLPathCompositionInterface(PathCompositionInterface): - - """ - Abstract class interface for a parent class that contains a URL - Path. - - A URL path's isabsolute attribute is absolute and read-only if a - netloc is defined. A path cannot start without '/' if there's a - netloc. For example, the URL 'http://google.coma/path' makes no - sense. It should be 'http://google.com/a/path'. - - A URL path's isabsolute attribute is mutable if there's no - netloc. The scheme doesn't matter. For example, the isabsolute - attribute of the URL path in 'mailto:user@host.com', with scheme - 'mailto' and path 'user@host.com', is mutable because there is no - netloc. See - - http://en.wikipedia.org/wiki/URI_scheme#Examples - """ - - def __init__(self, strict=False): - PathCompositionInterface.__init__(self, strict=strict) - - def _force_absolute(self, path): - return bool(path) and self.netloc - - -@six.add_metaclass(abc.ABCMeta) -class FragmentPathCompositionInterface(PathCompositionInterface): - - """ - Abstract class interface for a parent class that contains a Fragment - Path. - - Fragment Paths they be set to absolute (self.isabsolute = True) or - not absolute (self.isabsolute = False). - """ - - def __init__(self, strict=False): - PathCompositionInterface.__init__(self, strict=strict) - - def _force_absolute(self, path): - return False - - -class Query(object): - - """ - Represents a URL query comprised of zero or more unique parameters - and their respective values. - - http://tools.ietf.org/html/rfc3986#section-3.4 - - - All interaction with Query.params is done with unquoted strings. So - - f.query.params['a'] = 'a%5E' - - means the intended value for 'a' is 'a%5E', not 'a^'. - - - Query.params is implemented as an omdict1D object - a one - dimensional ordered multivalue dictionary. This provides support for - repeated URL parameters, like 'a=1&a=2'. omdict1D is a subclass of - omdict, an ordered multivalue dictionary. Documentation for omdict - can be found here - - https://github.com/gruns/orderedmultidict - - The one dimensional aspect of omdict1D means that a list of values - is interpreted as multiple values, not a single value which is - itself a list of values. This is a reasonable distinction to make - because URL query parameters are one dimensional: query parameter - values cannot themselves be composed of sub-values. - - So what does this mean? This means we can safely interpret - - f = furl('http://www.google.com') - f.query.params['arg'] = ['one', 'two', 'three'] - - as three different values for 'arg': 'one', 'two', and 'three', - instead of a single value which is itself some serialization of the - python list ['one', 'two', 'three']. Thus, the result of the above - will be - - f.query.allitems() == [ - ('arg','one'), ('arg','two'), ('arg','three')] - - and not - - f.query.allitems() == [('arg', ['one', 'two', 'three'])] - - The latter doesn't make sense because query parameter values cannot - be composed of sub-values. So finally - - str(f.query) == 'arg=one&arg=two&arg=three' - - - Additionally, while the set of allowed characters in URL queries is - defined in RFC 3986 section 3.4, the format for encoding key=value - pairs within the query is not. In turn, the parsing of encoded - key=value query pairs differs between implementations. - - As a compromise to support equal signs in both key=value pair - encoded queries, like - - https://www.google.com?a=1&b=2 - - and non-key=value pair encoded queries, like - - https://www.google.com?===3=== - - equal signs are percent encoded in key=value pairs where the key is - non-empty, e.g. - - https://www.google.com?equal-sign=%3D - - but not encoded in key=value pairs where the key is empty, e.g. - - https://www.google.com?===equal=sign=== - - This presents a reasonable compromise to accurately reproduce - non-key=value queries with equal signs while also still percent - encoding equal signs in key=value pair encoded queries, as - expected. See - - https://github.com/gruns/furl/issues/99 - - for more details. - - Attributes: - params: Ordered multivalue dictionary of query parameter key:value - pairs. Parameters in self.params are maintained URL decoded, - e.g. 'a b' not 'a+b'. - strict: Boolean whether or not UserWarnings should be raised if - improperly encoded query strings are provided to methods that - take such strings, like load(), add(), set(), remove(), etc. - """ - - def __init__(self, query='', strict=False): - self.strict = strict - - self._params = omdict1D() - - self.load(query) - - def load(self, query): - items = self._items(query) - self.params.load(items) - return self - - def add(self, args): - for param, value in self._items(args): - self.params.add(param, value) - return self - - def set(self, mapping): - """ - Adopt all mappings in , replacing any existing mappings - with the same key. If a key has multiple values in , - they are all adopted. - - Examples: - Query({1:1}).set([(1,None),(2,2)]).params.allitems() - == [(1,None),(2,2)] - Query({1:None,2:None}).set([(1,1),(2,2),(1,11)]).params.allitems() - == [(1,1),(2,2),(1,11)] - Query({1:None}).set([(1,[1,11,111])]).params.allitems() - == [(1,1),(1,11),(1,111)] - - Returns: . - """ - self.params.updateall(mapping) - return self - - def remove(self, query): - if query is True: - self.load('') - return self - - # Single key to remove. - items = [query] - # Dictionary or multivalue dictionary of items to remove. - if callable_attr(query, 'items'): - items = self._items(query) - # List of keys or items to remove. - elif non_string_iterable(query): - items = query - - for item in items: - if non_string_iterable(item) and len(item) == 2: - key, value = item - self.params.popvalue(key, value, None) - else: - key = item - self.params.pop(key, None) - - return self - - @property - def params(self): - return self._params - - @params.setter - def params(self, params): - items = self._items(params) - - self._params.clear() - for key, value in items: - self._params.add(key, value) - - def encode(self, delimiter='&', quote_plus=True, delimeter=_absent): - """ - Examples: - Query('a=a&b=#').encode() == 'a=a&b=%23' - Query('a=a&b=#').encode(';') == 'a=a;b=%23' - Query('a+b=c+d').encode(quote_plus=False) == 'a%20b=c%20d' - - Until furl v0.4.6, the 'delimiter' argument was incorrectly - spelled 'delimeter'. For backwards compatibility, accept both - the correct 'delimiter' and the old, mispelled 'delimeter'. - - Returns: A URL encoded query string using as the - delimiter separating key:value pairs. The most common and - default delimiter is '&', but ';' can also be specified. ';' is - W3C recommended. Parameter keys and values are encoded - application/x-www-form-urlencoded if is True, - percent-encoded otherwise. - """ - if delimeter is not _absent: - delimiter = delimeter - - pairs = [] - sixurl = urllib.parse # six.moves.urllib.parse - quote_fn = sixurl.quote_plus if quote_plus else sixurl.quote - for key, value in self.params.iterallitems(): - utf8key = utf8(key, utf8(attemptstr(key))) - utf8value = utf8(value, utf8(attemptstr(value))) - - quoted_key = quote_fn(utf8key) - safe_value_chars = '=' if not quoted_key else '' - quoted_value = quote_fn(utf8value, safe_value_chars) - - if value is None: # Example: http://sprop.su/?param. - pair = quoted_key - else: - pair = '='.join([quoted_key, quoted_value]) - - pairs.append(pair) - - query = delimiter.join(pairs) - - return query - - def asdict(self): - return { - 'encoded': str(self), - 'params': self.params.allitems(), - } - - def __eq__(self, other): - return str(self) == str(other) - - def __ne__(self, other): - return not self == other - - def __bool__(self): - return len(self.params) > 0 - __nonzero__ = __bool__ - - def __str__(self): - return self.encode() - - def __repr__(self): - return "%s('%s')" % (self.__class__.__name__, str(self)) - - def _items(self, items): - """ - Extract and return the key:value items from various - containers. Some containers that could hold key:value items are - - - List of (key,value) tuples. - - Dictionaries of key:value items. - - Multivalue dictionary of key:value items, with potentially - repeated keys. - - Query string with encoded params and values. - - Keys and values are passed through unmodified unless they were - passed in within an encoded query string, like - 'a=a%20a&b=b'. Keys and values passed in within an encoded query - string are unquoted by urlparse.parse_qsl(), which uses - urllib.unquote_plus() internally. - - Returns: List of items as (key, value) tuples. Keys and values - are passed through unmodified unless they were passed in as part - of an encoded query string, in which case the final keys and - values that are returned will be unquoted. - - Raises: UserWarning if is an improperly encoded path - string and self.strict is True. - """ - if not items: - items = [] - # Multivalue Dictionary-like interface. e.g. {'a':1, 'a':2, - # 'b':2} - elif callable_attr(items, 'allitems'): - items = list(items.allitems()) - elif callable_attr(items, 'iterallitems'): - items = list(items.iterallitems()) - # Dictionary-like interface. e.g. {'a':1, 'b':2, 'c':3} - elif callable_attr(items, 'items'): - items = list(items.items()) - elif callable_attr(items, 'iteritems'): - items = list(items.iteritems()) - # Encoded query string. e.g. 'a=1&b=2&c=3' - elif isinstance(items, six.string_types): - items = self._extract_items_from_querystr(items) - # Default to list of key:value items interface. e.g. [('a','1'), - # ('b','2')] - else: - items = list(items) - - return items - - def _extract_items_from_querystr(self, querystr): - items = [] - - pairstrs = [s2 for s1 in querystr.split('&') for s2 in s1.split(';')] - pairs = [item.split('=', 1) for item in pairstrs] - pairs = [(p[0], lget(p, 1, '')) for p in pairs] # Pad with value ''. - - for pairstr, (key, value) in six.moves.zip(pairstrs, pairs): - valid_key = is_valid_encoded_query_key(key) - valid_value = is_valid_encoded_query_value(value) - if self.strict and (not valid_key or not valid_value): - msg = ( - "Incorrectly percent encoded query string received: '%s'. " - "Proceeding, but did you mean '%s'?" % - (querystr, urllib.parse.urlencode(pairs))) - warnings.warn(msg, UserWarning) - - key_decoded = unquote(key.replace('+', ' ')) - # Empty value without a '=', e.g. '?sup'. - if key == pairstr: - value_decoded = None - else: - value_decoded = unquote(value.replace('+', ' ')) - - items.append((key_decoded, value_decoded)) - - return items - - -@six.add_metaclass(abc.ABCMeta) -class QueryCompositionInterface(object): - - """ - Abstract class interface for a parent class that contains a Query. - """ - - def __init__(self, strict=False): - self._query = Query(strict=strict) - - @property - def query(self): - return self._query - - @property - def querystr(self): - """This method is deprecated. Use str(furl.query) instead.""" - s = ('furl.querystr is deprecated. Use str(furl.query) instead. There ' - 'should be one, and preferably only one, obvious way to serialize' - ' a Query object to a string.') - warnings.warn(s, DeprecationWarning) - return str(self._query) - - @property - def args(self): - """ - Shortcut method to access the query parameters, self._query.params. - """ - return self._query.params - - def __setattr__(self, attr, value): - """ - Returns: True if this attribute is handled and set here, False - otherwise. - """ - if attr == 'args' or attr == 'query': - self._query.load(value) - return True - return False - - -class Fragment(FragmentPathCompositionInterface, QueryCompositionInterface): - - """ - Represents a URL fragment, comprised internally of a Path and Query - optionally separated by a '?' character. - - http://tools.ietf.org/html/rfc3986#section-3.5 - - Attributes: - path: Path object from FragmentPathCompositionInterface. - query: Query object from QueryCompositionInterface. - separator: Boolean whether or not a '?' separator should be - included in the string representation of this fragment. When - False, a '?' character will not separate the fragment path from - the fragment query in the fragment string. This is useful to - build fragments like '#!arg1=val1&arg2=val2', where no - separating '?' is desired. - """ - - def __init__(self, fragment='', strict=False): - FragmentPathCompositionInterface.__init__(self, strict=strict) - QueryCompositionInterface.__init__(self, strict=strict) - self.strict = strict - self.separator = True - - self.load(fragment) - - def load(self, fragment): - self.path.load('') - self.query.load('') - - if fragment is None: - fragment = '' - - toks = fragment.split('?', 1) - if len(toks) == 0: - self._path.load('') - self._query.load('') - elif len(toks) == 1: - # Does this fragment look like a path or a query? Default to - # path. - if '=' in fragment: # Query example: '#woofs=dogs'. - self._query.load(fragment) - else: # Path example: '#supinthisthread'. - self._path.load(fragment) - else: - # Does toks[1] actually look like a query? Like 'a=a' or - # 'a=' or '=a'? - if '=' in toks[1]: - self._path.load(toks[0]) - self._query.load(toks[1]) - # If toks[1] doesn't look like a query, the user probably - # provided a fragment string like 'a?b?' that was intended - # to be adopted as-is, not a two part fragment with path 'a' - # and query 'b?'. - else: - self._path.load(fragment) - - def add(self, path=_absent, args=_absent): - if path is not _absent: - self.path.add(path) - if args is not _absent: - self.query.add(args) - - return self - - def set(self, path=_absent, args=_absent, separator=_absent): - if path is not _absent: - self.path.load(path) - if args is not _absent: - self.query.load(args) - if separator is True or separator is False: - self.separator = separator - - return self - - def remove(self, fragment=_absent, path=_absent, args=_absent): - if fragment is True: - self.load('') - if path is not _absent: - self.path.remove(path) - if args is not _absent: - self.query.remove(args) - - return self - - def asdict(self): - return { - 'encoded': str(self), - 'separator': self.separator, - 'path': self.path.asdict(), - 'query': self.query.asdict(), - } - - def __eq__(self, other): - return str(self) == str(other) - - def __ne__(self, other): - return not self == other - - def __setattr__(self, attr, value): - if (not PathCompositionInterface.__setattr__(self, attr, value) and - not QueryCompositionInterface.__setattr__(self, attr, value)): - object.__setattr__(self, attr, value) - - def __bool__(self): - return bool(self.path) or bool(self.query) - __nonzero__ = __bool__ - - def __str__(self): - path, query = str(self._path), str(self._query) - - # If there is no query or self.separator is False, decode all - # '?' characters in the path from their percent encoded form - # '%3F' to '?'. This allows for fragment strings containg '?'s, - # like '#dog?machine?yes'. - if path and (not query or not self.separator): - path = path.replace('%3F', '?') - - separator = '?' if path and query and self.separator else '' - - return path + separator + query - - def __repr__(self): - return "%s('%s')" % (self.__class__.__name__, str(self)) - - -@six.add_metaclass(abc.ABCMeta) -class FragmentCompositionInterface(object): - - """ - Abstract class interface for a parent class that contains a - Fragment. - """ - - def __init__(self, strict=False): - self._fragment = Fragment(strict=strict) - - @property - def fragment(self): - return self._fragment - - @property - def fragmentstr(self): - """This method is deprecated. Use str(furl.fragment) instead.""" - s = ('furl.fragmentstr is deprecated. Use str(furl.fragment) instead. ' - 'There should be one, and preferably only one, obvious way to ' - 'serialize a Fragment object to a string.') - warnings.warn(s, DeprecationWarning) - return str(self._fragment) - - def __setattr__(self, attr, value): - """ - Returns: True if this attribute is handled and set here, False - otherwise. - """ - if attr == 'fragment': - self.fragment.load(value) - return True - return False - - -class furl(URLPathCompositionInterface, QueryCompositionInterface, - FragmentCompositionInterface, UnicodeMixin): - - """ - Object for simple parsing and manipulation of a URL and its - components. - - scheme://username:password@host:port/path?query#fragment - - Attributes: - strict: Boolean whether or not UserWarnings should be raised if - improperly encoded path, query, or fragment strings are provided - to methods that take such strings, like load(), add(), set(), - remove(), etc. - username: Username string for authentication. Initially None. - password: Password string for authentication with - . Initially None. - scheme: URL scheme. A string ('http', 'https', '', etc) or None. - All lowercase. Initially None. - host: URL host (hostname, IPv4 address, or IPv6 address), not - including port. All lowercase. Initially None. - port: Port. Valid port values are 1-65535, or None meaning no port - specified. - netloc: Network location. Combined host and port string. Initially - None. - path: Path object from URLPathCompositionInterface. - query: Query object from QueryCompositionInterface. - fragment: Fragment object from FragmentCompositionInterface. - """ - - def __init__(self, url='', args=_absent, path=_absent, fragment=_absent, - scheme=_absent, netloc=_absent, origin=_absent, - fragment_path=_absent, fragment_args=_absent, - fragment_separator=_absent, host=_absent, port=_absent, - query=_absent, query_params=_absent, username=_absent, - password=_absent, strict=False): - """ - Raises: ValueError on invalid url. - """ - URLPathCompositionInterface.__init__(self, strict=strict) - QueryCompositionInterface.__init__(self, strict=strict) - FragmentCompositionInterface.__init__(self, strict=strict) - self.strict = strict - - self.load(url) # Raises ValueError on invalid url. - self.set( - args=args, path=path, fragment=fragment, scheme=scheme, - netloc=netloc, origin=origin, fragment_path=fragment_path, - fragment_args=fragment_args, fragment_separator=fragment_separator, - host=host, port=port, query=query, query_params=query_params, - username=username, password=password) - - def load(self, url): - """ - Parse and load a URL. - - Raises: ValueError on invalid URL, like a malformed IPv6 address - or invalid port. - """ - self.username = self.password = None - self._host = self._port = self._scheme = None - - if url is None: - url = '' - if not isinstance(url, six.string_types): - url = str(url) - - # urlsplit() raises a ValueError on malformed IPv6 addresses in - # Python 2.7+. - tokens = urlsplit(url) - - self.netloc = tokens.netloc # Raises ValueError in Python 2.7+. - self.scheme = tokens.scheme - if not self.port: - self._port = DEFAULT_PORTS.get(self.scheme) - self.path.load(tokens.path) - self.query.load(tokens.query) - self.fragment.load(tokens.fragment) - - return self - - @property - def scheme(self): - return self._scheme - - @scheme.setter - def scheme(self, scheme): - if callable_attr(scheme, 'lower'): - scheme = scheme.lower() - self._scheme = scheme - - @property - def host(self): - return self._host - - @host.setter - def host(self, host): - """ - Raises: ValueError on invalid host or malformed IPv6 address. - """ - # Invalid IPv6 literal. - urllib.parse.urlsplit('http://%s/' % host) # Raises ValueError. - - # Invalid host string. - resembles_ipv6_literal = ( - host is not None and lget(host, 0) == '[' and ':' in host and - lget(host, -1) == ']') - if (host is not None and not resembles_ipv6_literal and - not is_valid_host(host)): - errmsg = ( - "Invalid host '%s'. Host strings must have at least one " - "non-period character, can't contain any of '%s', and can't " - "have adjacent periods.") - raise ValueError(errmsg % (host, INVALID_HOST_CHARS)) - - if callable_attr(host, 'lower'): - host = host.lower() - if callable_attr(host, 'startswith') and host.startswith('xn--'): - host = idna_decode(host) - self._host = host - - @property - def port(self): - return self._port or DEFAULT_PORTS.get(self.scheme) - - @port.setter - def port(self, port): - """ - The port value can be 1-65535 or None, meaning no port specified. If - is None and self.scheme is a known scheme in DEFAULT_PORTS, - the default port value from DEFAULT_PORTS will be used. - - Raises: ValueError on invalid port. - """ - if port is None: - self._port = DEFAULT_PORTS.get(self.scheme) - elif is_valid_port(port): - self._port = int(str(port)) - else: - raise ValueError("Invalid port '%s'." % port) - - @property - def netloc(self): - userpass = quote(self.username or '', safe='') - if self.password is not None: - userpass += ':' + quote(self.password, safe='') - if userpass or self.username is not None: - userpass += '@' - - netloc = idna_encode(self.host) - if self.port and self.port != DEFAULT_PORTS.get(self.scheme): - netloc = (netloc or '') + (':' + str(self.port)) - - if userpass or netloc: - netloc = (userpass or '') + (netloc or '') - - return netloc - - @netloc.setter - def netloc(self, netloc): - """ - Params: - netloc: Network location string, like 'google.com' or - 'user:pass@google.com:99'. - Raises: ValueError on invalid port or malformed IPv6 address. - """ - # Raises ValueError on malformed IPv6 addresses. - urllib.parse.urlsplit('http://%s/' % netloc) - - username = password = host = port = None - - if netloc and '@' in netloc: - userpass, netloc = netloc.split('@', 1) - if ':' in userpass: - username, password = userpass.split(':', 1) - else: - username = userpass - - if netloc and ':' in netloc: - # IPv6 address literal. - if ']' in netloc: - colonpos, bracketpos = netloc.rfind(':'), netloc.rfind(']') - if colonpos > bracketpos and colonpos != bracketpos + 1: - raise ValueError("Invalid netloc '%s'." % netloc) - elif colonpos > bracketpos and colonpos == bracketpos + 1: - host, port = netloc.rsplit(':', 1) - else: - host = netloc - else: - host, port = netloc.rsplit(':', 1) - host = host - else: - host = netloc - - # Avoid side effects by assigning self.port before self.host so - # that if an exception is raised when assigning self.port, - # self.host isn't updated. - self.port = port # Raises ValueError on invalid port. - self.host = host - self.username = None if username is None else unquote(username) - self.password = None if password is None else unquote(password) - - @property - def origin(self): - port = '' - scheme = self.scheme or '' - host = idna_encode(self.host) or '' - if self.port and self.port != DEFAULT_PORTS.get(self.scheme): - port = ':%s' % self.port - origin = '%s://%s%s' % (scheme, host, port) - - return origin - - @origin.setter - def origin(self, origin): - toks = origin.split('://', 1) - if len(toks) == 1: - host_port = origin - else: - self.scheme, host_port = toks - - if ':' in host_port: - self.host, self.port = host_port.split(':', 1) - else: - self.host = host_port - - @property - def url(self): - return self.tostr() - - @url.setter - def url(self, url): - return self.load(url) - - def add(self, args=_absent, path=_absent, fragment_path=_absent, - fragment_args=_absent, query_params=_absent): - """ - Add components to a URL and return this furl instance, . - - If both and are provided, a UserWarning is - raised because is provided as a shortcut for - , not to be used simultaneously with - . Nonetheless, providing both and - behaves as expected, with query keys and values - from both and added to the query - - first, then . - - Parameters: - args: Shortcut for . - path: A list of path segments to add to the existing path - segments, or a path string to join with the existing path - string. - query_params: A dictionary of query keys and values or list of - key:value items to add to the query. - fragment_path: A list of path segments to add to the existing - fragment path segments, or a path string to join with the - existing fragment path string. - fragment_args: A dictionary of query keys and values or list - of key:value items to add to the fragment's query. - - Returns: . - - Raises: UserWarning if redundant and possibly conflicting and - were provided. - """ - if args is not _absent and query_params is not _absent: - s = ('Both and provided to furl.add(). ' - ' is a shortcut for , not to be used ' - 'with . See furl.add() documentation for more ' - 'details.') - warnings.warn(s, UserWarning) - - if path is not _absent: - self.path.add(path) - if args is not _absent: - self.query.add(args) - if query_params is not _absent: - self.query.add(query_params) - if fragment_path is not _absent or fragment_args is not _absent: - self.fragment.add(path=fragment_path, args=fragment_args) - - return self - - def set(self, args=_absent, path=_absent, fragment=_absent, scheme=_absent, - netloc=_absent, origin=_absent, fragment_path=_absent, - fragment_args=_absent, fragment_separator=_absent, host=_absent, - port=_absent, query=_absent, query_params=_absent, - username=_absent, password=_absent): - """Set components of a url and return this furl instance, . - - If any overlapping, and hence possibly conflicting, parameters - are provided, appropriate UserWarning's will be raised. The - groups of parameters that could potentially overlap are - - and - , , and/or ( or ) - and ( and/or ) - any two or all of , , and/or - - In all of the above groups, the latter parameter(s) take - precedence over the earlier parameter(s). So, for example - - furl('http://google.com/').set( - netloc='yahoo.com:99', host='bing.com', port=40) - - will result in a UserWarning being raised and the url becoming - - 'http://bing.com:40/' - - not - - 'http://yahoo.com:99/ - - Parameters: - args: Shortcut for . - path: A list of path segments or a path string to adopt. - fragment: Fragment string to adopt. - scheme: Scheme string to adopt. - netloc: Network location string to adopt. - origin: Scheme and netloc. - query: Query string to adopt. - query_params: A dictionary of query keys and values or list of - key:value items to adopt. - fragment_path: A list of path segments to adopt for the - fragment's path or a path string to adopt as the fragment's - path. - fragment_args: A dictionary of query keys and values or list - of key:value items for the fragment's query to adopt. - fragment_separator: Boolean whether or not there should be a - '?' separator between the fragment path and fragment query. - host: Host string to adopt. - port: Port number to adopt. - username: Username string to adopt. - password: Password string to adopt. - Raises: - ValueError on invalid port. - UserWarning if and are provided. - UserWarning if , and/or ( and/or ) are - provided. - UserWarning if , , and/or are provided. - UserWarning if and (, - , and/or ) are provided. - Returns: . - """ - def present(v): - return v is not _absent - - if present(scheme) and present(origin): - s = ('Possible parameter overlap: and . See ' - 'furl.set() documentation for more details.') - warnings.warn(s, UserWarning) - provided = [ - present(netloc), present(origin), present(host) or present(port)] - if sum(provided) >= 2: - s = ('Possible parameter overlap: , and/or ' - '( and/or ) provided. See furl.set() ' - 'documentation for more details.') - warnings.warn(s, UserWarning) - if sum(present(p) for p in [args, query, query_params]) >= 2: - s = ('Possible parameter overlap: , , and/or ' - ' provided. See furl.set() documentation for ' - 'more details.') - warnings.warn(s, UserWarning) - provided = [fragment_path, fragment_args, fragment_separator] - if present(fragment) and any(present(p) for p in provided): - s = ('Possible parameter overlap: and ' - '(and/or ) or ' - 'and provided. See furl.set() ' - 'documentation for more details.') - warnings.warn(s, UserWarning) - - # Guard against side effects on exception. - original_url = self.url - try: - if username is not _absent: - self.username = username - if password is not _absent: - self.password = password - if netloc is not _absent: - # Raises ValueError on invalid port or malformed IP. - self.netloc = netloc - if origin is not _absent: - # Raises ValueError on invalid port or malformed IP. - self.origin = origin - if scheme is not _absent: - self.scheme = scheme - if host is not _absent: - # Raises ValueError on invalid host or malformed IP. - self.host = host - if port is not _absent: - self.port = port # Raises ValueError on invalid port. - - if path is not _absent: - self.path.load(path) - if query is not _absent: - self.query.load(query) - if args is not _absent: - self.query.load(args) - if query_params is not _absent: - self.query.load(query_params) - if fragment is not _absent: - self.fragment.load(fragment) - if fragment_path is not _absent: - self.fragment.path.load(fragment_path) - if fragment_args is not _absent: - self.fragment.query.load(fragment_args) - if fragment_separator is not _absent: - self.fragment.separator = fragment_separator - except Exception: - self.load(original_url) - raise - - return self - - def remove(self, args=_absent, path=_absent, fragment=_absent, - query=_absent, query_params=_absent, port=False, - fragment_path=_absent, fragment_args=_absent, username=False, - password=False): - """ - Remove components of this furl's URL and return this furl - instance, . - - Parameters: - args: Shortcut for query_params. - path: A list of path segments to remove from the end of the - existing path segments list, or a path string to remove from - the end of the existing path string, or True to remove the - path portion of the URL entirely. - query: A list of query keys to remove from the query, if they - exist, or True to remove the query portion of the URL - entirely. - query_params: A list of query keys to remove from the query, - if they exist. - port: If True, remove the port from the network location - string, if it exists. - fragment: If True, remove the fragment portion of the URL - entirely. - fragment_path: A list of path segments to remove from the end - of the fragment's path segments or a path string to remove - from the end of the fragment's path string. - fragment_args: A list of query keys to remove from the - fragment's query, if they exist. - username: If True, remove the username, if it exists. - password: If True, remove the password, if it exists. - Returns: . - """ - if username is True: - self.username = None - if password is True: - self.password = None - if port is True: - self.port = None - if path is not _absent: - self.path.remove(path) - - if args is not _absent: - self.query.remove(args) - if query is not _absent: - self.query.remove(query) - if query_params is not _absent: - self.query.remove(query_params) - - if fragment is not _absent: - self.fragment.remove(fragment) - if fragment_path is not _absent: - self.fragment.path.remove(fragment_path) - if fragment_args is not _absent: - self.fragment.query.remove(fragment_args) - - return self - - def tostr(self, query_delimiter='&', query_quote_plus=True): - url = urllib.parse.urlunsplit(( - self.scheme or '', # Must be text type in Python 3. - self.netloc, - str(self.path), - self.query.encode(query_delimiter, query_quote_plus), - str(self.fragment), - )) - - # Differentiate between '' and None values for scheme and netloc. - if self.scheme == '': - url = ':' + url - - if self.netloc == '': - if self.scheme is None: - url = '//' + url - elif strip_scheme(url) == '': - url = url + '//' - - return str(url) - - def join(self, *urls): - for url in urls: - if not isinstance(url, six.string_types): - url = str(url) - newurl = urljoin(self.url, url) - self.load(newurl) - return self - - def copy(self): - return self.__class__(self) - - def asdict(self): - return { - 'url': self.url, - 'scheme': self.scheme, - 'username': self.username, - 'password': self.password, - 'host': self.host, - 'host_encoded': idna_encode(self.host), - 'port': self.port, - 'netloc': self.netloc, - 'origin': self.origin, - 'path': self.path.asdict(), - 'query': self.query.asdict(), - 'fragment': self.fragment.asdict(), - } - - def __truediv__(self, path): - return self.copy().add(path=path) - - def __eq__(self, other): - try: - return self.url == other.url - except AttributeError: - return None - - def __ne__(self, other): - return not self == other - - def __setattr__(self, attr, value): - if (not PathCompositionInterface.__setattr__(self, attr, value) and - not QueryCompositionInterface.__setattr__(self, attr, value) and - not FragmentCompositionInterface.__setattr__(self, attr, value)): - object.__setattr__(self, attr, value) - - def __unicode__(self): - return self.tostr() - - def __repr__(self): - return "%s('%s')" % (self.__class__.__name__, str(self)) diff --git a/Contents/Libraries/Shared/furl/omdict1D.py b/Contents/Libraries/Shared/furl/omdict1D.py deleted file mode 100644 index 43b8d9ee0..000000000 --- a/Contents/Libraries/Shared/furl/omdict1D.py +++ /dev/null @@ -1,112 +0,0 @@ -# -*- coding: utf-8 -*- - -# -# furl - URL manipulation made simple. -# -# Ansgar Grunseid -# grunseid.com -# grunseid@gmail.com -# -# License: Build Amazing Things (Unlicense) -# - -from orderedmultidict import omdict - -from .common import is_iterable_but_not_string, absent as _absent - - -class omdict1D(omdict): - - """ - One dimensional ordered multivalue dictionary. Whenever a list of - values is passed to set(), __setitem__(), add(), update(), or - updateall(), it's treated as multiple values and the appropriate - 'list' method is called on that list, like setlist() or - addlist(). For example: - - omd = omdict1D() - - omd[1] = [1,2,3] - omd[1] != [1,2,3] # True. - omd[1] == 1 # True. - omd.getlist(1) == [1,2,3] # True. - - omd.add(2, [2,3,4]) - omd[2] != [2,3,4] # True. - omd[2] == 2 # True. - omd.getlist(2) == [2,3,4] # True. - - omd.update([(3, [3,4,5])]) - omd[3] != [3,4,5] # True. - omd[3] == 3 # True. - omd.getlist(3) == [3,4,5] # True. - - omd = omdict([(1,None),(2,None)]) - omd.updateall([(1,[1,11]), (2,[2,22])]) - omd.allitems == [(1,1), (1,11), (2,2), (2,22)] - """ - - def add(self, key, value): - if not is_iterable_but_not_string(value): - value = [value] - - if value: - self._map.setdefault(key, list()) - - for val in value: - node = self._items.append(key, val) - self._map[key].append(node) - - return self - - def set(self, key, value): - return self._set(key, value) - - def __setitem__(self, key, value): - return self._set(key, value) - - def _bin_update_items(self, items, replace_at_most_one, - replacements, leftovers): - """ - Subclassed from omdict._bin_update_items() to make update() and - updateall() process lists of values as multiple values. - - and are modified directly, ala pass by - reference. - """ - for key, values in items: - # is not a list or an empty list. - like_list_not_str = is_iterable_but_not_string(values) - if not like_list_not_str or (like_list_not_str and not values): - values = [values] - - for value in values: - # If the value is [], remove any existing leftovers with - # key and set the list of values itself to [], - # which in turn will later delete when [] is - # passed to omdict.setlist() in - # omdict._update_updateall(). - if value == []: - replacements[key] = [] - leftovers[:] = [l for l in leftovers if key != l[0]] - # If there are existing items with key that have - # yet to be marked for replacement, mark that item's - # value to be replaced by by appending it to - # . - elif (key in self and - replacements.get(key, _absent) in [[], _absent]): - replacements[key] = [value] - elif (key in self and not replace_at_most_one and - len(replacements[key]) < len(self.values(key))): - replacements[key].append(value) - elif replace_at_most_one: - replacements[key] = [value] - else: - leftovers.append((key, value)) - - def _set(self, key, value): - if not is_iterable_but_not_string(value): - value = [value] - self.setlist(key, value) - - return self From 8eca3e102c17d423a3e963dc34b01f63e6edc1da Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 26 Oct 2018 17:18:09 +0200 Subject: [PATCH 267/710] core: add option to use custom (Google, Cloudflare) DNS to resolve provider hosts in problematic countries; fixes #547 --- Contents/Code/interface/menu.py | 2 +- Contents/Code/support/config.py | 9 +- Contents/DefaultPrefs.json | 6 + Contents/Libraries/Shared/dns/__init__.py | 54 + Contents/Libraries/Shared/dns/_compat.py | 47 + Contents/Libraries/Shared/dns/dnssec.py | 457 ++++++ Contents/Libraries/Shared/dns/e164.py | 85 + Contents/Libraries/Shared/dns/edns.py | 150 ++ Contents/Libraries/Shared/dns/entropy.py | 141 ++ Contents/Libraries/Shared/dns/exception.py | 128 ++ Contents/Libraries/Shared/dns/flags.py | 112 ++ Contents/Libraries/Shared/dns/grange.py | 69 + Contents/Libraries/Shared/dns/hash.py | 31 + Contents/Libraries/Shared/dns/inet.py | 111 ++ Contents/Libraries/Shared/dns/ipv4.py | 59 + Contents/Libraries/Shared/dns/ipv6.py | 172 ++ Contents/Libraries/Shared/dns/message.py | 1152 ++++++++++++++ Contents/Libraries/Shared/dns/name.py | 924 +++++++++++ Contents/Libraries/Shared/dns/namedict.py | 104 ++ Contents/Libraries/Shared/dns/node.py | 178 +++ Contents/Libraries/Shared/dns/opcode.py | 107 ++ Contents/Libraries/Shared/dns/query.py | 539 +++++++ Contents/Libraries/Shared/dns/rcode.py | 125 ++ Contents/Libraries/Shared/dns/rdata.py | 458 ++++++ Contents/Libraries/Shared/dns/rdataclass.py | 118 ++ Contents/Libraries/Shared/dns/rdataset.py | 338 ++++ Contents/Libraries/Shared/dns/rdatatype.py | 255 +++ .../Libraries/Shared/dns/rdtypes/ANY/AFSDB.py | 53 + .../Libraries/Shared/dns/rdtypes/ANY/AVC.py | 23 + .../Libraries/Shared/dns/rdtypes/ANY/CAA.py | 73 + .../Shared/dns/rdtypes/ANY/CDNSKEY.py | 25 + .../Libraries/Shared/dns/rdtypes/ANY/CDS.py | 21 + .../Libraries/Shared/dns/rdtypes/ANY/CERT.py | 121 ++ .../Libraries/Shared/dns/rdtypes/ANY/CNAME.py | 25 + .../Libraries/Shared/dns/rdtypes/ANY/CSYNC.py | 124 ++ .../Libraries/Shared/dns/rdtypes/ANY/DLV.py | 21 + .../Libraries/Shared/dns/rdtypes/ANY/DNAME.py | 24 + .../Shared/dns/rdtypes/ANY/DNSKEY.py | 25 + .../Libraries/Shared/dns/rdtypes/ANY/DS.py | 21 + .../Libraries/Shared/dns/rdtypes/ANY/EUI48.py | 29 + .../Libraries/Shared/dns/rdtypes/ANY/EUI64.py | 29 + .../Libraries/Shared/dns/rdtypes/ANY/GPOS.py | 160 ++ .../Libraries/Shared/dns/rdtypes/ANY/HINFO.py | 84 + .../Libraries/Shared/dns/rdtypes/ANY/HIP.py | 113 ++ .../Libraries/Shared/dns/rdtypes/ANY/ISDN.py | 97 ++ .../Libraries/Shared/dns/rdtypes/ANY/LOC.py | 325 ++++ .../Libraries/Shared/dns/rdtypes/ANY/MX.py | 21 + .../Libraries/Shared/dns/rdtypes/ANY/NS.py | 21 + .../Libraries/Shared/dns/rdtypes/ANY/NSEC.py | 126 ++ .../Libraries/Shared/dns/rdtypes/ANY/NSEC3.py | 191 +++ .../Shared/dns/rdtypes/ANY/NSEC3PARAM.py | 88 ++ .../Libraries/Shared/dns/rdtypes/ANY/PTR.py | 21 + .../Libraries/Shared/dns/rdtypes/ANY/RP.py | 80 + .../Libraries/Shared/dns/rdtypes/ANY/RRSIG.py | 156 ++ .../Libraries/Shared/dns/rdtypes/ANY/RT.py | 21 + .../Libraries/Shared/dns/rdtypes/ANY/SOA.py | 114 ++ .../Libraries/Shared/dns/rdtypes/ANY/SPF.py | 23 + .../Libraries/Shared/dns/rdtypes/ANY/SSHFP.py | 77 + .../Libraries/Shared/dns/rdtypes/ANY/TLSA.py | 82 + .../Libraries/Shared/dns/rdtypes/ANY/TXT.py | 21 + .../Libraries/Shared/dns/rdtypes/ANY/URI.py | 80 + .../Libraries/Shared/dns/rdtypes/ANY/X25.py | 64 + .../Shared/dns/rdtypes/ANY/__init__.py | 50 + Contents/Libraries/Shared/dns/rdtypes/IN/A.py | 52 + .../Libraries/Shared/dns/rdtypes/IN/AAAA.py | 53 + .../Libraries/Shared/dns/rdtypes/IN/APL.py | 161 ++ .../Libraries/Shared/dns/rdtypes/IN/DHCID.py | 59 + .../Shared/dns/rdtypes/IN/IPSECKEY.py | 148 ++ .../Libraries/Shared/dns/rdtypes/IN/KX.py | 21 + .../Libraries/Shared/dns/rdtypes/IN/NAPTR.py | 125 ++ .../Libraries/Shared/dns/rdtypes/IN/NSAP.py | 58 + .../Shared/dns/rdtypes/IN/NSAP_PTR.py | 21 + .../Libraries/Shared/dns/rdtypes/IN/PX.py | 87 + .../Libraries/Shared/dns/rdtypes/IN/SRV.py | 81 + .../Libraries/Shared/dns/rdtypes/IN/WKS.py | 105 ++ .../Shared/dns/rdtypes/IN/__init__.py | 30 + .../Libraries/Shared/dns/rdtypes/__init__.py | 24 + .../Shared/dns/rdtypes/dnskeybase.py | 136 ++ .../Libraries/Shared/dns/rdtypes/dsbase.py | 83 + .../Libraries/Shared/dns/rdtypes/euibase.py | 71 + .../Libraries/Shared/dns/rdtypes/mxbase.py | 101 ++ .../Libraries/Shared/dns/rdtypes/nsbase.py | 81 + .../Libraries/Shared/dns/rdtypes/txtbase.py | 90 ++ Contents/Libraries/Shared/dns/renderer.py | 329 ++++ Contents/Libraries/Shared/dns/resolver.py | 1407 +++++++++++++++++ Contents/Libraries/Shared/dns/reversename.py | 89 ++ Contents/Libraries/Shared/dns/rrset.py | 182 +++ Contents/Libraries/Shared/dns/set.py | 259 +++ Contents/Libraries/Shared/dns/tokenizer.py | 564 +++++++ Contents/Libraries/Shared/dns/tsig.py | 234 +++ Contents/Libraries/Shared/dns/tsigkeyring.py | 48 + Contents/Libraries/Shared/dns/ttl.py | 68 + Contents/Libraries/Shared/dns/update.py | 249 +++ Contents/Libraries/Shared/dns/version.py | 34 + Contents/Libraries/Shared/dns/wiredata.py | 103 ++ Contents/Libraries/Shared/dns/zone.py | 1087 +++++++++++++ .../Shared/subliminal_patch/__init__.py | 1 + .../Libraries/Shared/subliminal_patch/http.py | 39 +- Contents/Strings/de.json | 1 + Contents/Strings/en.json | 1 + Licenses/dns/LICENSE | 16 + 101 files changed, 14854 insertions(+), 4 deletions(-) create mode 100644 Contents/Libraries/Shared/dns/__init__.py create mode 100644 Contents/Libraries/Shared/dns/_compat.py create mode 100644 Contents/Libraries/Shared/dns/dnssec.py create mode 100644 Contents/Libraries/Shared/dns/e164.py create mode 100644 Contents/Libraries/Shared/dns/edns.py create mode 100644 Contents/Libraries/Shared/dns/entropy.py create mode 100644 Contents/Libraries/Shared/dns/exception.py create mode 100644 Contents/Libraries/Shared/dns/flags.py create mode 100644 Contents/Libraries/Shared/dns/grange.py create mode 100644 Contents/Libraries/Shared/dns/hash.py create mode 100644 Contents/Libraries/Shared/dns/inet.py create mode 100644 Contents/Libraries/Shared/dns/ipv4.py create mode 100644 Contents/Libraries/Shared/dns/ipv6.py create mode 100644 Contents/Libraries/Shared/dns/message.py create mode 100644 Contents/Libraries/Shared/dns/name.py create mode 100644 Contents/Libraries/Shared/dns/namedict.py create mode 100644 Contents/Libraries/Shared/dns/node.py create mode 100644 Contents/Libraries/Shared/dns/opcode.py create mode 100644 Contents/Libraries/Shared/dns/query.py create mode 100644 Contents/Libraries/Shared/dns/rcode.py create mode 100644 Contents/Libraries/Shared/dns/rdata.py create mode 100644 Contents/Libraries/Shared/dns/rdataclass.py create mode 100644 Contents/Libraries/Shared/dns/rdataset.py create mode 100644 Contents/Libraries/Shared/dns/rdatatype.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/AFSDB.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/AVC.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/CAA.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/CDNSKEY.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/CDS.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/CERT.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/CNAME.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/CSYNC.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/DLV.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/DNAME.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/DNSKEY.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/DS.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/EUI48.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/EUI64.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/GPOS.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/HINFO.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/HIP.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/ISDN.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/LOC.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/MX.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/NS.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC3.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC3PARAM.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/PTR.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/RP.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/RRSIG.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/RT.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/SOA.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/SPF.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/SSHFP.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/TLSA.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/TXT.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/URI.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/X25.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/ANY/__init__.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/IN/A.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/IN/AAAA.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/IN/APL.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/IN/DHCID.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/IN/IPSECKEY.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/IN/KX.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/IN/NAPTR.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/IN/NSAP.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/IN/NSAP_PTR.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/IN/PX.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/IN/SRV.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/IN/WKS.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/IN/__init__.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/__init__.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/dnskeybase.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/dsbase.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/euibase.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/mxbase.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/nsbase.py create mode 100644 Contents/Libraries/Shared/dns/rdtypes/txtbase.py create mode 100644 Contents/Libraries/Shared/dns/renderer.py create mode 100644 Contents/Libraries/Shared/dns/resolver.py create mode 100644 Contents/Libraries/Shared/dns/reversename.py create mode 100644 Contents/Libraries/Shared/dns/rrset.py create mode 100644 Contents/Libraries/Shared/dns/set.py create mode 100644 Contents/Libraries/Shared/dns/tokenizer.py create mode 100644 Contents/Libraries/Shared/dns/tsig.py create mode 100644 Contents/Libraries/Shared/dns/tsigkeyring.py create mode 100644 Contents/Libraries/Shared/dns/ttl.py create mode 100644 Contents/Libraries/Shared/dns/update.py create mode 100644 Contents/Libraries/Shared/dns/version.py create mode 100644 Contents/Libraries/Shared/dns/wiredata.py create mode 100644 Contents/Libraries/Shared/dns/zone.py create mode 100644 Licenses/dns/LICENSE diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 1d7f84cec..db77e3d59 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -333,7 +333,7 @@ def ValidatePrefs(): "enable_channel", "permissions_ok", "missing_permissions", "fs_encoding", "subtitle_destination_folder", "include", "include_exclude_paths", "include_exclude_sz_files", "new_style_cache", "dbm_supported", "lang_list", "providers", "normal_subs", "forced_only", "forced_also", - "plex_transcoder", "refiner_settings", "unrar", "adv_cfg_path"]: + "plex_transcoder", "refiner_settings", "unrar", "adv_cfg_path", "use_custom_dns"]: value = getattr(config, attr) if isinstance(value, dict): diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 46748a4f9..45692cc4c 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -13,7 +13,6 @@ import subzero.constants import lib from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded, AuthenticationError - from subliminal_patch.core import is_windows_special_path from whichdb import whichdb @@ -148,6 +147,7 @@ class Config(object): ietf_as_alpha3 = False unrar = None adv_cfg_path = None + use_custom_dns = False store_recently_played_amount = 40 @@ -227,6 +227,7 @@ def initialize(self): self.only_one = cast_bool(Prefs['subtitles.only_one']) self.embedded_auto_extract = cast_bool(Prefs["subtitles.embedded.autoextract"]) self.ietf_as_alpha3 = cast_bool(Prefs["subtitles.language.ietf_normalize"]) + self.use_custom_dns = cast_bool(Prefs['use_custom_dns']) self.initialized = True def migrate_prefs(self): @@ -815,6 +816,7 @@ def get_providers(self, media_type="series"): def get_provider_settings(self): os_use_https = self.advanced.providers.opensubtitles.use_https \ if self.advanced.providers.opensubtitles.use_https != None else True + provider_settings = {'addic7ed': {'username': Prefs['provider.addic7ed.username'], 'password': Prefs['provider.addic7ed.password'], 'use_random_agents': cast_bool(Prefs['provider.addic7ed.use_random_agents1']), @@ -826,7 +828,7 @@ def get_provider_settings(self): 'also_foreign': self.forced_also, 'is_vip': cast_bool(Prefs['provider.opensubtitles.is_vip']), 'use_ssl': os_use_https, - 'timeout': self.advanced.providers.opensubtitles.timeout or 15 + 'timeout': self.advanced.providers.opensubtitles.timeout or 15, }, 'podnapisi': { 'only_foreign': self.forced_only, @@ -1049,6 +1051,9 @@ def init_subliminal_patches(self): subliminal_patch.core.DOWNLOAD_TRIES = int(Prefs['subtitles.try_downloads']) subliminal.score.episode_scores["addic7ed_boost"] = int(Prefs['provider.addic7ed.boost_by2']) + if self.use_custom_dns: + subliminal_patch.http.set_custom_resolver() + config = Config() config.initialize() diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 577c11c34..2f34c753c 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -835,6 +835,12 @@ "type": "text", "default": "15" }, + { + "id": "use_custom_dns", + "label": "Use Google DNS (for \"problematic\" countries)", + "type": "bool", + "default": "false" + }, { "id": "proxy", "label": "HTTP proxy to use for providers (supports credentials)", diff --git a/Contents/Libraries/Shared/dns/__init__.py b/Contents/Libraries/Shared/dns/__init__.py new file mode 100644 index 000000000..c848e4858 --- /dev/null +++ b/Contents/Libraries/Shared/dns/__init__.py @@ -0,0 +1,54 @@ +# Copyright (C) 2003-2007, 2009, 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""dnspython DNS toolkit""" + +__all__ = [ + 'dnssec', + 'e164', + 'edns', + 'entropy', + 'exception', + 'flags', + 'hash', + 'inet', + 'ipv4', + 'ipv6', + 'message', + 'name', + 'namedict', + 'node', + 'opcode', + 'query', + 'rcode', + 'rdata', + 'rdataclass', + 'rdataset', + 'rdatatype', + 'renderer', + 'resolver', + 'reversename', + 'rrset', + 'set', + 'tokenizer', + 'tsig', + 'tsigkeyring', + 'ttl', + 'rdtypes', + 'update', + 'version', + 'wiredata', + 'zone', +] diff --git a/Contents/Libraries/Shared/dns/_compat.py b/Contents/Libraries/Shared/dns/_compat.py new file mode 100644 index 000000000..956f9a133 --- /dev/null +++ b/Contents/Libraries/Shared/dns/_compat.py @@ -0,0 +1,47 @@ +import sys +import decimal +from decimal import Context + +if sys.version_info > (3,): + long = int + xrange = range +else: + long = long # pylint: disable=long-builtin + xrange = xrange # pylint: disable=xrange-builtin + +# unicode / binary types +if sys.version_info > (3,): + text_type = str + binary_type = bytes + string_types = (str,) + unichr = chr + def maybe_decode(x): + return x.decode() + def maybe_encode(x): + return x.encode() +else: + text_type = unicode # pylint: disable=unicode-builtin, undefined-variable + binary_type = str + string_types = ( + basestring, # pylint: disable=basestring-builtin, undefined-variable + ) + unichr = unichr # pylint: disable=unichr-builtin + def maybe_decode(x): + return x + def maybe_encode(x): + return x + + +def round_py2_compat(what): + """ + Python 2 and Python 3 use different rounding strategies in round(). This + function ensures that results are python2/3 compatible and backward + compatible with previous py2 releases + :param what: float + :return: rounded long + """ + d = Context( + prec=len(str(long(what))), # round to integer with max precision + rounding=decimal.ROUND_HALF_UP + ).create_decimal(str(what)) # str(): python 2.6 compat + return long(d) diff --git a/Contents/Libraries/Shared/dns/dnssec.py b/Contents/Libraries/Shared/dns/dnssec.py new file mode 100644 index 000000000..fec12082c --- /dev/null +++ b/Contents/Libraries/Shared/dns/dnssec.py @@ -0,0 +1,457 @@ +# Copyright (C) 2003-2007, 2009, 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Common DNSSEC-related functions and constants.""" + +from io import BytesIO +import struct +import time + +import dns.exception +import dns.hash +import dns.name +import dns.node +import dns.rdataset +import dns.rdata +import dns.rdatatype +import dns.rdataclass +from ._compat import string_types + + +class UnsupportedAlgorithm(dns.exception.DNSException): + + """The DNSSEC algorithm is not supported.""" + + +class ValidationFailure(dns.exception.DNSException): + + """The DNSSEC signature is invalid.""" + +RSAMD5 = 1 +DH = 2 +DSA = 3 +ECC = 4 +RSASHA1 = 5 +DSANSEC3SHA1 = 6 +RSASHA1NSEC3SHA1 = 7 +RSASHA256 = 8 +RSASHA512 = 10 +ECDSAP256SHA256 = 13 +ECDSAP384SHA384 = 14 +INDIRECT = 252 +PRIVATEDNS = 253 +PRIVATEOID = 254 + +_algorithm_by_text = { + 'RSAMD5': RSAMD5, + 'DH': DH, + 'DSA': DSA, + 'ECC': ECC, + 'RSASHA1': RSASHA1, + 'DSANSEC3SHA1': DSANSEC3SHA1, + 'RSASHA1NSEC3SHA1': RSASHA1NSEC3SHA1, + 'RSASHA256': RSASHA256, + 'RSASHA512': RSASHA512, + 'INDIRECT': INDIRECT, + 'ECDSAP256SHA256': ECDSAP256SHA256, + 'ECDSAP384SHA384': ECDSAP384SHA384, + 'PRIVATEDNS': PRIVATEDNS, + 'PRIVATEOID': PRIVATEOID, +} + +# We construct the inverse mapping programmatically to ensure that we +# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that +# would cause the mapping not to be true inverse. + +_algorithm_by_value = dict((y, x) for x, y in _algorithm_by_text.items()) + + +def algorithm_from_text(text): + """Convert text into a DNSSEC algorithm value + @rtype: int""" + + value = _algorithm_by_text.get(text.upper()) + if value is None: + value = int(text) + return value + + +def algorithm_to_text(value): + """Convert a DNSSEC algorithm value to text + @rtype: string""" + + text = _algorithm_by_value.get(value) + if text is None: + text = str(value) + return text + + +def _to_rdata(record, origin): + s = BytesIO() + record.to_wire(s, origin=origin) + return s.getvalue() + + +def key_id(key, origin=None): + rdata = _to_rdata(key, origin) + rdata = bytearray(rdata) + if key.algorithm == RSAMD5: + return (rdata[-3] << 8) + rdata[-2] + else: + total = 0 + for i in range(len(rdata) // 2): + total += (rdata[2 * i] << 8) + \ + rdata[2 * i + 1] + if len(rdata) % 2 != 0: + total += rdata[len(rdata) - 1] << 8 + total += ((total >> 16) & 0xffff) + return total & 0xffff + + +def make_ds(name, key, algorithm, origin=None): + if algorithm.upper() == 'SHA1': + dsalg = 1 + hash = dns.hash.hashes['SHA1']() + elif algorithm.upper() == 'SHA256': + dsalg = 2 + hash = dns.hash.hashes['SHA256']() + else: + raise UnsupportedAlgorithm('unsupported algorithm "%s"' % algorithm) + + if isinstance(name, string_types): + name = dns.name.from_text(name, origin) + hash.update(name.canonicalize().to_wire()) + hash.update(_to_rdata(key, origin)) + digest = hash.digest() + + dsrdata = struct.pack("!HBB", key_id(key), key.algorithm, dsalg) + digest + return dns.rdata.from_wire(dns.rdataclass.IN, dns.rdatatype.DS, dsrdata, 0, + len(dsrdata)) + + +def _find_candidate_keys(keys, rrsig): + candidate_keys = [] + value = keys.get(rrsig.signer) + if value is None: + return None + if isinstance(value, dns.node.Node): + try: + rdataset = value.find_rdataset(dns.rdataclass.IN, + dns.rdatatype.DNSKEY) + except KeyError: + return None + else: + rdataset = value + for rdata in rdataset: + if rdata.algorithm == rrsig.algorithm and \ + key_id(rdata) == rrsig.key_tag: + candidate_keys.append(rdata) + return candidate_keys + + +def _is_rsa(algorithm): + return algorithm in (RSAMD5, RSASHA1, + RSASHA1NSEC3SHA1, RSASHA256, + RSASHA512) + + +def _is_dsa(algorithm): + return algorithm in (DSA, DSANSEC3SHA1) + + +def _is_ecdsa(algorithm): + return _have_ecdsa and (algorithm in (ECDSAP256SHA256, ECDSAP384SHA384)) + + +def _is_md5(algorithm): + return algorithm == RSAMD5 + + +def _is_sha1(algorithm): + return algorithm in (DSA, RSASHA1, + DSANSEC3SHA1, RSASHA1NSEC3SHA1) + + +def _is_sha256(algorithm): + return algorithm in (RSASHA256, ECDSAP256SHA256) + + +def _is_sha384(algorithm): + return algorithm == ECDSAP384SHA384 + + +def _is_sha512(algorithm): + return algorithm == RSASHA512 + + +def _make_hash(algorithm): + if _is_md5(algorithm): + return dns.hash.hashes['MD5']() + if _is_sha1(algorithm): + return dns.hash.hashes['SHA1']() + if _is_sha256(algorithm): + return dns.hash.hashes['SHA256']() + if _is_sha384(algorithm): + return dns.hash.hashes['SHA384']() + if _is_sha512(algorithm): + return dns.hash.hashes['SHA512']() + raise ValidationFailure('unknown hash for algorithm %u' % algorithm) + + +def _make_algorithm_id(algorithm): + if _is_md5(algorithm): + oid = [0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05] + elif _is_sha1(algorithm): + oid = [0x2b, 0x0e, 0x03, 0x02, 0x1a] + elif _is_sha256(algorithm): + oid = [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01] + elif _is_sha512(algorithm): + oid = [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03] + else: + raise ValidationFailure('unknown algorithm %u' % algorithm) + olen = len(oid) + dlen = _make_hash(algorithm).digest_size + idbytes = [0x30] + [8 + olen + dlen] + \ + [0x30, olen + 4] + [0x06, olen] + oid + \ + [0x05, 0x00] + [0x04, dlen] + return struct.pack('!%dB' % len(idbytes), *idbytes) + + +def _validate_rrsig(rrset, rrsig, keys, origin=None, now=None): + """Validate an RRset against a single signature rdata + + The owner name of the rrsig is assumed to be the same as the owner name + of the rrset. + + @param rrset: The RRset to validate + @type rrset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset) + tuple + @param rrsig: The signature rdata + @type rrsig: dns.rrset.Rdata + @param keys: The key dictionary. + @type keys: a dictionary keyed by dns.name.Name with node or rdataset + values + @param origin: The origin to use for relative names + @type origin: dns.name.Name or None + @param now: The time to use when validating the signatures. The default + is the current time. + @type now: int + """ + + if isinstance(origin, string_types): + origin = dns.name.from_text(origin, dns.name.root) + + for candidate_key in _find_candidate_keys(keys, rrsig): + if not candidate_key: + raise ValidationFailure('unknown key') + + # For convenience, allow the rrset to be specified as a (name, + # rdataset) tuple as well as a proper rrset + if isinstance(rrset, tuple): + rrname = rrset[0] + rdataset = rrset[1] + else: + rrname = rrset.name + rdataset = rrset + + if now is None: + now = time.time() + if rrsig.expiration < now: + raise ValidationFailure('expired') + if rrsig.inception > now: + raise ValidationFailure('not yet valid') + + hash = _make_hash(rrsig.algorithm) + + if _is_rsa(rrsig.algorithm): + keyptr = candidate_key.key + (bytes_,) = struct.unpack('!B', keyptr[0:1]) + keyptr = keyptr[1:] + if bytes_ == 0: + (bytes_,) = struct.unpack('!H', keyptr[0:2]) + keyptr = keyptr[2:] + rsa_e = keyptr[0:bytes_] + rsa_n = keyptr[bytes_:] + keylen = len(rsa_n) * 8 + pubkey = Crypto.PublicKey.RSA.construct( + (Crypto.Util.number.bytes_to_long(rsa_n), + Crypto.Util.number.bytes_to_long(rsa_e))) + sig = (Crypto.Util.number.bytes_to_long(rrsig.signature),) + elif _is_dsa(rrsig.algorithm): + keyptr = candidate_key.key + (t,) = struct.unpack('!B', keyptr[0:1]) + keyptr = keyptr[1:] + octets = 64 + t * 8 + dsa_q = keyptr[0:20] + keyptr = keyptr[20:] + dsa_p = keyptr[0:octets] + keyptr = keyptr[octets:] + dsa_g = keyptr[0:octets] + keyptr = keyptr[octets:] + dsa_y = keyptr[0:octets] + pubkey = Crypto.PublicKey.DSA.construct( + (Crypto.Util.number.bytes_to_long(dsa_y), + Crypto.Util.number.bytes_to_long(dsa_g), + Crypto.Util.number.bytes_to_long(dsa_p), + Crypto.Util.number.bytes_to_long(dsa_q))) + (dsa_r, dsa_s) = struct.unpack('!20s20s', rrsig.signature[1:]) + sig = (Crypto.Util.number.bytes_to_long(dsa_r), + Crypto.Util.number.bytes_to_long(dsa_s)) + elif _is_ecdsa(rrsig.algorithm): + if rrsig.algorithm == ECDSAP256SHA256: + curve = ecdsa.curves.NIST256p + key_len = 32 + elif rrsig.algorithm == ECDSAP384SHA384: + curve = ecdsa.curves.NIST384p + key_len = 48 + else: + # shouldn't happen + raise ValidationFailure('unknown ECDSA curve') + keyptr = candidate_key.key + x = Crypto.Util.number.bytes_to_long(keyptr[0:key_len]) + y = Crypto.Util.number.bytes_to_long(keyptr[key_len:key_len * 2]) + assert ecdsa.ecdsa.point_is_valid(curve.generator, x, y) + point = ecdsa.ellipticcurve.Point(curve.curve, x, y, curve.order) + verifying_key = ecdsa.keys.VerifyingKey.from_public_point(point, + curve) + pubkey = ECKeyWrapper(verifying_key, key_len) + r = rrsig.signature[:key_len] + s = rrsig.signature[key_len:] + sig = ecdsa.ecdsa.Signature(Crypto.Util.number.bytes_to_long(r), + Crypto.Util.number.bytes_to_long(s)) + else: + raise ValidationFailure('unknown algorithm %u' % rrsig.algorithm) + + hash.update(_to_rdata(rrsig, origin)[:18]) + hash.update(rrsig.signer.to_digestable(origin)) + + if rrsig.labels < len(rrname) - 1: + suffix = rrname.split(rrsig.labels + 1)[1] + rrname = dns.name.from_text('*', suffix) + rrnamebuf = rrname.to_digestable(origin) + rrfixed = struct.pack('!HHI', rdataset.rdtype, rdataset.rdclass, + rrsig.original_ttl) + rrlist = sorted(rdataset) + for rr in rrlist: + hash.update(rrnamebuf) + hash.update(rrfixed) + rrdata = rr.to_digestable(origin) + rrlen = struct.pack('!H', len(rrdata)) + hash.update(rrlen) + hash.update(rrdata) + + digest = hash.digest() + + if _is_rsa(rrsig.algorithm): + # PKCS1 algorithm identifier goop + digest = _make_algorithm_id(rrsig.algorithm) + digest + padlen = keylen // 8 - len(digest) - 3 + digest = struct.pack('!%dB' % (2 + padlen + 1), + *([0, 1] + [0xFF] * padlen + [0])) + digest + elif _is_dsa(rrsig.algorithm) or _is_ecdsa(rrsig.algorithm): + pass + else: + # Raise here for code clarity; this won't actually ever happen + # since if the algorithm is really unknown we'd already have + # raised an exception above + raise ValidationFailure('unknown algorithm %u' % rrsig.algorithm) + + if pubkey.verify(digest, sig): + return + raise ValidationFailure('verify failure') + + +def _validate(rrset, rrsigset, keys, origin=None, now=None): + """Validate an RRset + + @param rrset: The RRset to validate + @type rrset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset) + tuple + @param rrsigset: The signature RRset + @type rrsigset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset) + tuple + @param keys: The key dictionary. + @type keys: a dictionary keyed by dns.name.Name with node or rdataset + values + @param origin: The origin to use for relative names + @type origin: dns.name.Name or None + @param now: The time to use when validating the signatures. The default + is the current time. + @type now: int + """ + + if isinstance(origin, string_types): + origin = dns.name.from_text(origin, dns.name.root) + + if isinstance(rrset, tuple): + rrname = rrset[0] + else: + rrname = rrset.name + + if isinstance(rrsigset, tuple): + rrsigname = rrsigset[0] + rrsigrdataset = rrsigset[1] + else: + rrsigname = rrsigset.name + rrsigrdataset = rrsigset + + rrname = rrname.choose_relativity(origin) + rrsigname = rrname.choose_relativity(origin) + if rrname != rrsigname: + raise ValidationFailure("owner names do not match") + + for rrsig in rrsigrdataset: + try: + _validate_rrsig(rrset, rrsig, keys, origin, now) + return + except ValidationFailure: + pass + raise ValidationFailure("no RRSIGs validated") + + +def _need_pycrypto(*args, **kwargs): + raise NotImplementedError("DNSSEC validation requires pycrypto") + +try: + import Crypto.PublicKey.RSA + import Crypto.PublicKey.DSA + import Crypto.Util.number + validate = _validate + validate_rrsig = _validate_rrsig + _have_pycrypto = True +except ImportError: + validate = _need_pycrypto + validate_rrsig = _need_pycrypto + _have_pycrypto = False + +try: + import ecdsa + import ecdsa.ecdsa + import ecdsa.ellipticcurve + import ecdsa.keys + _have_ecdsa = True + + class ECKeyWrapper(object): + + def __init__(self, key, key_len): + self.key = key + self.key_len = key_len + + def verify(self, digest, sig): + diglong = Crypto.Util.number.bytes_to_long(digest) + return self.key.pubkey.verifies(diglong, sig) + +except ImportError: + _have_ecdsa = False diff --git a/Contents/Libraries/Shared/dns/e164.py b/Contents/Libraries/Shared/dns/e164.py new file mode 100644 index 000000000..99300730b --- /dev/null +++ b/Contents/Libraries/Shared/dns/e164.py @@ -0,0 +1,85 @@ +# Copyright (C) 2006, 2007, 2009, 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS E.164 helpers + +@var public_enum_domain: The DNS public ENUM domain, e164.arpa. +@type public_enum_domain: dns.name.Name object +""" + + +import dns.exception +import dns.name +import dns.resolver +from ._compat import string_types + +public_enum_domain = dns.name.from_text('e164.arpa.') + + +def from_e164(text, origin=public_enum_domain): + """Convert an E.164 number in textual form into a Name object whose + value is the ENUM domain name for that number. + @param text: an E.164 number in textual form. + @type text: str + @param origin: The domain in which the number should be constructed. + The default is e164.arpa. + @type origin: dns.name.Name object or None + @rtype: dns.name.Name object + """ + parts = [d for d in text if d.isdigit()] + parts.reverse() + return dns.name.from_text('.'.join(parts), origin=origin) + + +def to_e164(name, origin=public_enum_domain, want_plus_prefix=True): + """Convert an ENUM domain name into an E.164 number. + @param name: the ENUM domain name. + @type name: dns.name.Name object. + @param origin: A domain containing the ENUM domain name. The + name is relativized to this domain before being converted to text. + @type origin: dns.name.Name object or None + @param want_plus_prefix: if True, add a '+' to the beginning of the + returned number. + @rtype: str + """ + if origin is not None: + name = name.relativize(origin) + dlabels = [d for d in name.labels if d.isdigit() and len(d) == 1] + if len(dlabels) != len(name.labels): + raise dns.exception.SyntaxError('non-digit labels in ENUM domain name') + dlabels.reverse() + text = b''.join(dlabels) + if want_plus_prefix: + text = b'+' + text + return text + + +def query(number, domains, resolver=None): + """Look for NAPTR RRs for the specified number in the specified domains. + + e.g. lookup('16505551212', ['e164.dnspython.org.', 'e164.arpa.']) + """ + if resolver is None: + resolver = dns.resolver.get_default_resolver() + e_nx = dns.resolver.NXDOMAIN() + for domain in domains: + if isinstance(domain, string_types): + domain = dns.name.from_text(domain) + qname = dns.e164.from_e164(number, domain) + try: + return resolver.query(qname, 'NAPTR') + except dns.resolver.NXDOMAIN as e: + e_nx += e + raise e_nx diff --git a/Contents/Libraries/Shared/dns/edns.py b/Contents/Libraries/Shared/dns/edns.py new file mode 100644 index 000000000..8ac676bc6 --- /dev/null +++ b/Contents/Libraries/Shared/dns/edns.py @@ -0,0 +1,150 @@ +# Copyright (C) 2009, 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""EDNS Options""" + +NSID = 3 + + +class Option(object): + + """Base class for all EDNS option types. + """ + + def __init__(self, otype): + """Initialize an option. + @param otype: The rdata type + @type otype: int + """ + self.otype = otype + + def to_wire(self, file): + """Convert an option to wire format. + """ + raise NotImplementedError + + @classmethod + def from_wire(cls, otype, wire, current, olen): + """Build an EDNS option object from wire format + + @param otype: The option type + @type otype: int + @param wire: The wire-format message + @type wire: string + @param current: The offset in wire of the beginning of the rdata. + @type current: int + @param olen: The length of the wire-format option data + @type olen: int + @rtype: dns.edns.Option instance""" + raise NotImplementedError + + def _cmp(self, other): + """Compare an EDNS option with another option of the same type. + Return < 0 if self < other, 0 if self == other, + and > 0 if self > other. + """ + raise NotImplementedError + + def __eq__(self, other): + if not isinstance(other, Option): + return False + if self.otype != other.otype: + return False + return self._cmp(other) == 0 + + def __ne__(self, other): + if not isinstance(other, Option): + return False + if self.otype != other.otype: + return False + return self._cmp(other) != 0 + + def __lt__(self, other): + if not isinstance(other, Option) or \ + self.otype != other.otype: + return NotImplemented + return self._cmp(other) < 0 + + def __le__(self, other): + if not isinstance(other, Option) or \ + self.otype != other.otype: + return NotImplemented + return self._cmp(other) <= 0 + + def __ge__(self, other): + if not isinstance(other, Option) or \ + self.otype != other.otype: + return NotImplemented + return self._cmp(other) >= 0 + + def __gt__(self, other): + if not isinstance(other, Option) or \ + self.otype != other.otype: + return NotImplemented + return self._cmp(other) > 0 + + +class GenericOption(Option): + + """Generate Rdata Class + + This class is used for EDNS option types for which we have no better + implementation. + """ + + def __init__(self, otype, data): + super(GenericOption, self).__init__(otype) + self.data = data + + def to_wire(self, file): + file.write(self.data) + + @classmethod + def from_wire(cls, otype, wire, current, olen): + return cls(otype, wire[current: current + olen]) + + def _cmp(self, other): + if self.data == other.data: + return 0 + if self.data > other.data: + return 1 + return -1 + +_type_to_class = { +} + + +def get_option_class(otype): + cls = _type_to_class.get(otype) + if cls is None: + cls = GenericOption + return cls + + +def option_from_wire(otype, wire, current, olen): + """Build an EDNS option object from wire format + + @param otype: The option type + @type otype: int + @param wire: The wire-format message + @type wire: string + @param current: The offset in wire of the beginning of the rdata. + @type current: int + @param olen: The length of the wire-format option data + @type olen: int + @rtype: dns.edns.Option instance""" + + cls = get_option_class(otype) + return cls.from_wire(otype, wire, current, olen) diff --git a/Contents/Libraries/Shared/dns/entropy.py b/Contents/Libraries/Shared/dns/entropy.py new file mode 100644 index 000000000..de7a70a51 --- /dev/null +++ b/Contents/Libraries/Shared/dns/entropy.py @@ -0,0 +1,141 @@ +# Copyright (C) 2009, 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import os +import random +import time +from ._compat import long, binary_type +try: + import threading as _threading +except ImportError: + import dummy_threading as _threading + + +class EntropyPool(object): + + def __init__(self, seed=None): + self.pool_index = 0 + self.digest = None + self.next_byte = 0 + self.lock = _threading.Lock() + try: + import hashlib + self.hash = hashlib.sha1() + self.hash_len = 20 + except ImportError: + try: + import sha + self.hash = sha.new() + self.hash_len = 20 + except ImportError: + import md5 # pylint: disable=import-error + self.hash = md5.new() + self.hash_len = 16 + self.pool = bytearray(b'\0' * self.hash_len) + if seed is not None: + self.stir(bytearray(seed)) + self.seeded = True + self.seed_pid = os.getpid() + else: + self.seeded = False + self.seed_pid = 0 + + def stir(self, entropy, already_locked=False): + if not already_locked: + self.lock.acquire() + try: + for c in entropy: + if self.pool_index == self.hash_len: + self.pool_index = 0 + b = c & 0xff + self.pool[self.pool_index] ^= b + self.pool_index += 1 + finally: + if not already_locked: + self.lock.release() + + def _maybe_seed(self): + if not self.seeded or self.seed_pid != os.getpid(): + try: + seed = os.urandom(16) + except Exception: + try: + r = open('/dev/urandom', 'rb', 0) + try: + seed = r.read(16) + finally: + r.close() + except Exception: + seed = str(time.time()) + self.seeded = True + self.seed_pid = os.getpid() + self.digest = None + seed = bytearray(seed) + self.stir(seed, True) + + def random_8(self): + self.lock.acquire() + try: + self._maybe_seed() + if self.digest is None or self.next_byte == self.hash_len: + self.hash.update(binary_type(self.pool)) + self.digest = bytearray(self.hash.digest()) + self.stir(self.digest, True) + self.next_byte = 0 + value = self.digest[self.next_byte] + self.next_byte += 1 + finally: + self.lock.release() + return value + + def random_16(self): + return self.random_8() * 256 + self.random_8() + + def random_32(self): + return self.random_16() * 65536 + self.random_16() + + def random_between(self, first, last): + size = last - first + 1 + if size > long(4294967296): + raise ValueError('too big') + if size > 65536: + rand = self.random_32 + max = long(4294967295) + elif size > 256: + rand = self.random_16 + max = 65535 + else: + rand = self.random_8 + max = 255 + return first + size * rand() // (max + 1) + +pool = EntropyPool() + +try: + system_random = random.SystemRandom() +except Exception: + system_random = None + +def random_16(): + if system_random is not None: + return system_random.randrange(0, 65536) + else: + return pool.random_16() + +def between(first, last): + if system_random is not None: + return system_random.randrange(first, last + 1) + else: + return pool.random_between(first, last) diff --git a/Contents/Libraries/Shared/dns/exception.py b/Contents/Libraries/Shared/dns/exception.py new file mode 100644 index 000000000..6c0b1f4b2 --- /dev/null +++ b/Contents/Libraries/Shared/dns/exception.py @@ -0,0 +1,128 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Common DNS Exceptions.""" + + +class DNSException(Exception): + + """Abstract base class shared by all dnspython exceptions. + + It supports two basic modes of operation: + + a) Old/compatible mode is used if __init__ was called with + empty **kwargs. + In compatible mode all *args are passed to standard Python Exception class + as before and all *args are printed by standard __str__ implementation. + Class variable msg (or doc string if msg is None) is returned from str() + if *args is empty. + + b) New/parametrized mode is used if __init__ was called with + non-empty **kwargs. + In the new mode *args has to be empty and all kwargs has to exactly match + set in class variable self.supp_kwargs. All kwargs are stored inside + self.kwargs and used in new __str__ implementation to construct + formatted message based on self.fmt string. + + In the simplest case it is enough to override supp_kwargs and fmt + class variables to get nice parametrized messages. + """ + msg = None # non-parametrized message + supp_kwargs = set() # accepted parameters for _fmt_kwargs (sanity check) + fmt = None # message parametrized with results from _fmt_kwargs + + def __init__(self, *args, **kwargs): + self._check_params(*args, **kwargs) + if kwargs: + self.kwargs = self._check_kwargs(**kwargs) + self.msg = str(self) + else: + self.kwargs = dict() # defined but empty for old mode exceptions + if self.msg is None: + # doc string is better implicit message than empty string + self.msg = self.__doc__ + if args: + super(DNSException, self).__init__(*args) + else: + super(DNSException, self).__init__(self.msg) + + def _check_params(self, *args, **kwargs): + """Old exceptions supported only args and not kwargs. + + For sanity we do not allow to mix old and new behavior.""" + if args or kwargs: + assert bool(args) != bool(kwargs), \ + 'keyword arguments are mutually exclusive with positional args' + + def _check_kwargs(self, **kwargs): + if kwargs: + assert set(kwargs.keys()) == self.supp_kwargs, \ + 'following set of keyword args is required: %s' % ( + self.supp_kwargs) + return kwargs + + def _fmt_kwargs(self, **kwargs): + """Format kwargs before printing them. + + Resulting dictionary has to have keys necessary for str.format call + on fmt class variable. + """ + fmtargs = {} + for kw, data in kwargs.items(): + if isinstance(data, (list, set)): + # convert list of to list of str() + fmtargs[kw] = list(map(str, data)) + if len(fmtargs[kw]) == 1: + # remove list brackets [] from single-item lists + fmtargs[kw] = fmtargs[kw].pop() + else: + fmtargs[kw] = data + return fmtargs + + def __str__(self): + if self.kwargs and self.fmt: + # provide custom message constructed from keyword arguments + fmtargs = self._fmt_kwargs(**self.kwargs) + return self.fmt.format(**fmtargs) + else: + # print *args directly in the same way as old DNSException + return super(DNSException, self).__str__() + + +class FormError(DNSException): + + """DNS message is malformed.""" + + +class SyntaxError(DNSException): + + """Text input is malformed.""" + + +class UnexpectedEnd(SyntaxError): + + """Text input ended unexpectedly.""" + + +class TooBig(DNSException): + + """The DNS message is too big.""" + + +class Timeout(DNSException): + + """The DNS operation timed out.""" + supp_kwargs = set(['timeout']) + fmt = "The DNS operation timed out after {timeout} seconds" diff --git a/Contents/Libraries/Shared/dns/flags.py b/Contents/Libraries/Shared/dns/flags.py new file mode 100644 index 000000000..388d6aaa7 --- /dev/null +++ b/Contents/Libraries/Shared/dns/flags.py @@ -0,0 +1,112 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Message Flags.""" + +# Standard DNS flags + +QR = 0x8000 +AA = 0x0400 +TC = 0x0200 +RD = 0x0100 +RA = 0x0080 +AD = 0x0020 +CD = 0x0010 + +# EDNS flags + +DO = 0x8000 + +_by_text = { + 'QR': QR, + 'AA': AA, + 'TC': TC, + 'RD': RD, + 'RA': RA, + 'AD': AD, + 'CD': CD +} + +_edns_by_text = { + 'DO': DO +} + + +# We construct the inverse mappings programmatically to ensure that we +# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that +# would cause the mappings not to be true inverses. + +_by_value = dict((y, x) for x, y in _by_text.items()) + +_edns_by_value = dict((y, x) for x, y in _edns_by_text.items()) + + +def _order_flags(table): + order = list(table.items()) + order.sort() + order.reverse() + return order + +_flags_order = _order_flags(_by_value) + +_edns_flags_order = _order_flags(_edns_by_value) + + +def _from_text(text, table): + flags = 0 + tokens = text.split() + for t in tokens: + flags = flags | table[t.upper()] + return flags + + +def _to_text(flags, table, order): + text_flags = [] + for k, v in order: + if flags & k != 0: + text_flags.append(v) + return ' '.join(text_flags) + + +def from_text(text): + """Convert a space-separated list of flag text values into a flags + value. + @rtype: int""" + + return _from_text(text, _by_text) + + +def to_text(flags): + """Convert a flags value into a space-separated list of flag text + values. + @rtype: string""" + + return _to_text(flags, _by_value, _flags_order) + + +def edns_from_text(text): + """Convert a space-separated list of EDNS flag text values into a EDNS + flags value. + @rtype: int""" + + return _from_text(text, _edns_by_text) + + +def edns_to_text(flags): + """Convert an EDNS flags value into a space-separated list of EDNS flag + text values. + @rtype: string""" + + return _to_text(flags, _edns_by_value, _edns_flags_order) diff --git a/Contents/Libraries/Shared/dns/grange.py b/Contents/Libraries/Shared/dns/grange.py new file mode 100644 index 000000000..9ce9f67a0 --- /dev/null +++ b/Contents/Libraries/Shared/dns/grange.py @@ -0,0 +1,69 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS GENERATE range conversion.""" + +import dns + + +def from_text(text): + """Convert the text form of a range in a GENERATE statement to an + integer. + + @param text: the textual range + @type text: string + @return: The start, stop and step values. + @rtype: tuple + """ + # TODO, figure out the bounds on start, stop and step. + + step = 1 + cur = '' + state = 0 + # state 0 1 2 3 4 + # x - y / z + + if text and text[0] == '-': + raise dns.exception.SyntaxError("Start cannot be a negative number") + + for c in text: + if c == '-' and state == 0: + start = int(cur) + cur = '' + state = 2 + elif c == '/': + stop = int(cur) + cur = '' + state = 4 + elif c.isdigit(): + cur += c + else: + raise dns.exception.SyntaxError("Could not parse %s" % (c)) + + if state in (1, 3): + raise dns.exception.SyntaxError() + + if state == 2: + stop = int(cur) + + if state == 4: + step = int(cur) + + assert step >= 1 + assert start >= 0 + assert start <= stop + # TODO, can start == stop? + + return (start, stop, step) diff --git a/Contents/Libraries/Shared/dns/hash.py b/Contents/Libraries/Shared/dns/hash.py new file mode 100644 index 000000000..966838a17 --- /dev/null +++ b/Contents/Libraries/Shared/dns/hash.py @@ -0,0 +1,31 @@ +# Copyright (C) 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Hashing backwards compatibility wrapper""" + +import hashlib + + +hashes = {} +hashes['MD5'] = hashlib.md5 +hashes['SHA1'] = hashlib.sha1 +hashes['SHA224'] = hashlib.sha224 +hashes['SHA256'] = hashlib.sha256 +hashes['SHA384'] = hashlib.sha384 +hashes['SHA512'] = hashlib.sha512 + + +def get(algorithm): + return hashes[algorithm.upper()] diff --git a/Contents/Libraries/Shared/dns/inet.py b/Contents/Libraries/Shared/dns/inet.py new file mode 100644 index 000000000..73490a9d7 --- /dev/null +++ b/Contents/Libraries/Shared/dns/inet.py @@ -0,0 +1,111 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Generic Internet address helper functions.""" + +import socket + +import dns.ipv4 +import dns.ipv6 + + +# We assume that AF_INET is always defined. + +AF_INET = socket.AF_INET + +# AF_INET6 might not be defined in the socket module, but we need it. +# We'll try to use the socket module's value, and if it doesn't work, +# we'll use our own value. + +try: + AF_INET6 = socket.AF_INET6 +except AttributeError: + AF_INET6 = 9999 + + +def inet_pton(family, text): + """Convert the textual form of a network address into its binary form. + + @param family: the address family + @type family: int + @param text: the textual address + @type text: string + @raises NotImplementedError: the address family specified is not + implemented. + @rtype: string + """ + + if family == AF_INET: + return dns.ipv4.inet_aton(text) + elif family == AF_INET6: + return dns.ipv6.inet_aton(text) + else: + raise NotImplementedError + + +def inet_ntop(family, address): + """Convert the binary form of a network address into its textual form. + + @param family: the address family + @type family: int + @param address: the binary address + @type address: string + @raises NotImplementedError: the address family specified is not + implemented. + @rtype: string + """ + if family == AF_INET: + return dns.ipv4.inet_ntoa(address) + elif family == AF_INET6: + return dns.ipv6.inet_ntoa(address) + else: + raise NotImplementedError + + +def af_for_address(text): + """Determine the address family of a textual-form network address. + + @param text: the textual address + @type text: string + @raises ValueError: the address family cannot be determined from the input. + @rtype: int + """ + try: + dns.ipv4.inet_aton(text) + return AF_INET + except Exception: + try: + dns.ipv6.inet_aton(text) + return AF_INET6 + except: + raise ValueError + + +def is_multicast(text): + """Is the textual-form network address a multicast address? + + @param text: the textual address + @raises ValueError: the address family cannot be determined from the input. + @rtype: bool + """ + try: + first = ord(dns.ipv4.inet_aton(text)[0]) + return first >= 224 and first <= 239 + except Exception: + try: + first = ord(dns.ipv6.inet_aton(text)[0]) + return first == 255 + except Exception: + raise ValueError diff --git a/Contents/Libraries/Shared/dns/ipv4.py b/Contents/Libraries/Shared/dns/ipv4.py new file mode 100644 index 000000000..3fef282b6 --- /dev/null +++ b/Contents/Libraries/Shared/dns/ipv4.py @@ -0,0 +1,59 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""IPv4 helper functions.""" + +import struct + +import dns.exception +from ._compat import binary_type + +def inet_ntoa(address): + """Convert an IPv4 address in network form to text form. + + @param address: The IPv4 address + @type address: string + @returns: string + """ + if len(address) != 4: + raise dns.exception.SyntaxError + if not isinstance(address, bytearray): + address = bytearray(address) + return (u'%u.%u.%u.%u' % (address[0], address[1], + address[2], address[3])).encode() + +def inet_aton(text): + """Convert an IPv4 address in text form to network form. + + @param text: The IPv4 address + @type text: string + @returns: string + """ + if not isinstance(text, binary_type): + text = text.encode() + parts = text.split(b'.') + if len(parts) != 4: + raise dns.exception.SyntaxError + for part in parts: + if not part.isdigit(): + raise dns.exception.SyntaxError + if len(part) > 1 and part[0] == '0': + # No leading zeros + raise dns.exception.SyntaxError + try: + bytes = [int(part) for part in parts] + return struct.pack('BBBB', *bytes) + except: + raise dns.exception.SyntaxError diff --git a/Contents/Libraries/Shared/dns/ipv6.py b/Contents/Libraries/Shared/dns/ipv6.py new file mode 100644 index 000000000..cbaee8edc --- /dev/null +++ b/Contents/Libraries/Shared/dns/ipv6.py @@ -0,0 +1,172 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""IPv6 helper functions.""" + +import re +import binascii + +import dns.exception +import dns.ipv4 +from ._compat import xrange, binary_type, maybe_decode + +_leading_zero = re.compile(b'0+([0-9a-f]+)') + +def inet_ntoa(address): + """Convert a network format IPv6 address into text. + + @param address: the binary address + @type address: string + @rtype: string + @raises ValueError: the address isn't 16 bytes long + """ + + if len(address) != 16: + raise ValueError("IPv6 addresses are 16 bytes long") + hex = binascii.hexlify(address) + chunks = [] + i = 0 + l = len(hex) + while i < l: + chunk = hex[i : i + 4] + # strip leading zeros. we do this with an re instead of + # with lstrip() because lstrip() didn't support chars until + # python 2.2.2 + m = _leading_zero.match(chunk) + if not m is None: + chunk = m.group(1) + chunks.append(chunk) + i += 4 + # + # Compress the longest subsequence of 0-value chunks to :: + # + best_start = 0 + best_len = 0 + start = -1 + last_was_zero = False + for i in xrange(8): + if chunks[i] != b'0': + if last_was_zero: + end = i + current_len = end - start + if current_len > best_len: + best_start = start + best_len = current_len + last_was_zero = False + elif not last_was_zero: + start = i + last_was_zero = True + if last_was_zero: + end = 8 + current_len = end - start + if current_len > best_len: + best_start = start + best_len = current_len + if best_len > 1: + if best_start == 0 and \ + (best_len == 6 or + best_len == 5 and chunks[5] == b'ffff'): + # We have an embedded IPv4 address + if best_len == 6: + prefix = b'::' + else: + prefix = b'::ffff:' + hex = prefix + dns.ipv4.inet_ntoa(address[12:]) + else: + hex = b':'.join(chunks[:best_start]) + b'::' + \ + b':'.join(chunks[best_start + best_len:]) + else: + hex = b':'.join(chunks) + return maybe_decode(hex) + +_v4_ending = re.compile(b'(.*):(\d+\.\d+\.\d+\.\d+)$') +_colon_colon_start = re.compile(b'::.*') +_colon_colon_end = re.compile(b'.*::$') + +def inet_aton(text): + """Convert a text format IPv6 address into network format. + + @param text: the textual address + @type text: string + @rtype: string + @raises dns.exception.SyntaxError: the text was not properly formatted + """ + + # + # Our aim here is not something fast; we just want something that works. + # + if not isinstance(text, binary_type): + text = text.encode() + + if text == b'::': + text = b'0::' + # + # Get rid of the icky dot-quad syntax if we have it. + # + m = _v4_ending.match(text) + if not m is None: + b = bytearray(dns.ipv4.inet_aton(m.group(2))) + text = (u"%s:%02x%02x:%02x%02x" % (m.group(1).decode(), b[0], b[1], + b[2], b[3])).encode() + # + # Try to turn '::' into ':'; if no match try to + # turn '::' into ':' + # + m = _colon_colon_start.match(text) + if not m is None: + text = text[1:] + else: + m = _colon_colon_end.match(text) + if not m is None: + text = text[:-1] + # + # Now canonicalize into 8 chunks of 4 hex digits each + # + chunks = text.split(b':') + l = len(chunks) + if l > 8: + raise dns.exception.SyntaxError + seen_empty = False + canonical = [] + for c in chunks: + if c == b'': + if seen_empty: + raise dns.exception.SyntaxError + seen_empty = True + for i in xrange(0, 8 - l + 1): + canonical.append(b'0000') + else: + lc = len(c) + if lc > 4: + raise dns.exception.SyntaxError + if lc != 4: + c = (b'0' * (4 - lc)) + c + canonical.append(c) + if l < 8 and not seen_empty: + raise dns.exception.SyntaxError + text = b''.join(canonical) + + # + # Finally we can go to binary. + # + try: + return binascii.unhexlify(text) + except (binascii.Error, TypeError): + raise dns.exception.SyntaxError + +_mapped_prefix = b'\x00' * 10 + b'\xff\xff' + +def is_mapped(address): + return address.startswith(_mapped_prefix) diff --git a/Contents/Libraries/Shared/dns/message.py b/Contents/Libraries/Shared/dns/message.py new file mode 100644 index 000000000..a0df18e67 --- /dev/null +++ b/Contents/Libraries/Shared/dns/message.py @@ -0,0 +1,1152 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Messages""" + +from __future__ import absolute_import + +from io import StringIO +import struct +import time + +import dns.edns +import dns.exception +import dns.flags +import dns.name +import dns.opcode +import dns.entropy +import dns.rcode +import dns.rdata +import dns.rdataclass +import dns.rdatatype +import dns.rrset +import dns.renderer +import dns.tsig +import dns.wiredata + +from ._compat import long, xrange, string_types + + +class ShortHeader(dns.exception.FormError): + + """The DNS packet passed to from_wire() is too short.""" + + +class TrailingJunk(dns.exception.FormError): + + """The DNS packet passed to from_wire() has extra junk at the end of it.""" + + +class UnknownHeaderField(dns.exception.DNSException): + + """The header field name was not recognized when converting from text + into a message.""" + + +class BadEDNS(dns.exception.FormError): + + """OPT record occurred somewhere other than the start of + the additional data section.""" + + +class BadTSIG(dns.exception.FormError): + + """A TSIG record occurred somewhere other than the end of + the additional data section.""" + + +class UnknownTSIGKey(dns.exception.DNSException): + + """A TSIG with an unknown key was received.""" + + +class Message(object): + + """A DNS message. + + @ivar id: The query id; the default is a randomly chosen id. + @type id: int + @ivar flags: The DNS flags of the message. @see: RFC 1035 for an + explanation of these flags. + @type flags: int + @ivar question: The question section. + @type question: list of dns.rrset.RRset objects + @ivar answer: The answer section. + @type answer: list of dns.rrset.RRset objects + @ivar authority: The authority section. + @type authority: list of dns.rrset.RRset objects + @ivar additional: The additional data section. + @type additional: list of dns.rrset.RRset objects + @ivar edns: The EDNS level to use. The default is -1, no Edns. + @type edns: int + @ivar ednsflags: The EDNS flags + @type ednsflags: long + @ivar payload: The EDNS payload size. The default is 0. + @type payload: int + @ivar options: The EDNS options + @type options: list of dns.edns.Option objects + @ivar request_payload: The associated request's EDNS payload size. + @type request_payload: int + @ivar keyring: The TSIG keyring to use. The default is None. + @type keyring: dict + @ivar keyname: The TSIG keyname to use. The default is None. + @type keyname: dns.name.Name object + @ivar keyalgorithm: The TSIG algorithm to use; defaults to + dns.tsig.default_algorithm. Constants for TSIG algorithms are defined + in dns.tsig, and the currently implemented algorithms are + HMAC_MD5, HMAC_SHA1, HMAC_SHA224, HMAC_SHA256, HMAC_SHA384, and + HMAC_SHA512. + @type keyalgorithm: string + @ivar request_mac: The TSIG MAC of the request message associated with + this message; used when validating TSIG signatures. @see: RFC 2845 for + more information on TSIG fields. + @type request_mac: string + @ivar fudge: TSIG time fudge; default is 300 seconds. + @type fudge: int + @ivar original_id: TSIG original id; defaults to the message's id + @type original_id: int + @ivar tsig_error: TSIG error code; default is 0. + @type tsig_error: int + @ivar other_data: TSIG other data. + @type other_data: string + @ivar mac: The TSIG MAC for this message. + @type mac: string + @ivar xfr: Is the message being used to contain the results of a DNS + zone transfer? The default is False. + @type xfr: bool + @ivar origin: The origin of the zone in messages which are used for + zone transfers or for DNS dynamic updates. The default is None. + @type origin: dns.name.Name object + @ivar tsig_ctx: The TSIG signature context associated with this + message. The default is None. + @type tsig_ctx: hmac.HMAC object + @ivar had_tsig: Did the message decoded from wire format have a TSIG + signature? + @type had_tsig: bool + @ivar multi: Is this message part of a multi-message sequence? The + default is false. This variable is used when validating TSIG signatures + on messages which are part of a zone transfer. + @type multi: bool + @ivar first: Is this message standalone, or the first of a multi + message sequence? This variable is used when validating TSIG signatures + on messages which are part of a zone transfer. + @type first: bool + @ivar index: An index of rrsets in the message. The index key is + (section, name, rdclass, rdtype, covers, deleting). Indexing can be + disabled by setting the index to None. + @type index: dict + """ + + def __init__(self, id=None): + if id is None: + self.id = dns.entropy.random_16() + else: + self.id = id + self.flags = 0 + self.question = [] + self.answer = [] + self.authority = [] + self.additional = [] + self.edns = -1 + self.ednsflags = 0 + self.payload = 0 + self.options = [] + self.request_payload = 0 + self.keyring = None + self.keyname = None + self.keyalgorithm = dns.tsig.default_algorithm + self.request_mac = '' + self.other_data = '' + self.tsig_error = 0 + self.fudge = 300 + self.original_id = self.id + self.mac = '' + self.xfr = False + self.origin = None + self.tsig_ctx = None + self.had_tsig = False + self.multi = False + self.first = True + self.index = {} + + def __repr__(self): + return '' + + def __str__(self): + return self.to_text() + + def to_text(self, origin=None, relativize=True, **kw): + """Convert the message to text. + + The I{origin}, I{relativize}, and any other keyword + arguments are passed to the rrset to_wire() method. + + @rtype: string + """ + + s = StringIO() + s.write(u'id %d\n' % self.id) + s.write(u'opcode %s\n' % + dns.opcode.to_text(dns.opcode.from_flags(self.flags))) + rc = dns.rcode.from_flags(self.flags, self.ednsflags) + s.write(u'rcode %s\n' % dns.rcode.to_text(rc)) + s.write(u'flags %s\n' % dns.flags.to_text(self.flags)) + if self.edns >= 0: + s.write(u'edns %s\n' % self.edns) + if self.ednsflags != 0: + s.write(u'eflags %s\n' % + dns.flags.edns_to_text(self.ednsflags)) + s.write(u'payload %d\n' % self.payload) + is_update = dns.opcode.is_update(self.flags) + if is_update: + s.write(u';ZONE\n') + else: + s.write(u';QUESTION\n') + for rrset in self.question: + s.write(rrset.to_text(origin, relativize, **kw)) + s.write(u'\n') + if is_update: + s.write(u';PREREQ\n') + else: + s.write(u';ANSWER\n') + for rrset in self.answer: + s.write(rrset.to_text(origin, relativize, **kw)) + s.write(u'\n') + if is_update: + s.write(u';UPDATE\n') + else: + s.write(u';AUTHORITY\n') + for rrset in self.authority: + s.write(rrset.to_text(origin, relativize, **kw)) + s.write(u'\n') + s.write(u';ADDITIONAL\n') + for rrset in self.additional: + s.write(rrset.to_text(origin, relativize, **kw)) + s.write(u'\n') + # + # We strip off the final \n so the caller can print the result without + # doing weird things to get around eccentricities in Python print + # formatting + # + return s.getvalue()[:-1] + + def __eq__(self, other): + """Two messages are equal if they have the same content in the + header, question, answer, and authority sections. + @rtype: bool""" + if not isinstance(other, Message): + return False + if self.id != other.id: + return False + if self.flags != other.flags: + return False + for n in self.question: + if n not in other.question: + return False + for n in other.question: + if n not in self.question: + return False + for n in self.answer: + if n not in other.answer: + return False + for n in other.answer: + if n not in self.answer: + return False + for n in self.authority: + if n not in other.authority: + return False + for n in other.authority: + if n not in self.authority: + return False + return True + + def __ne__(self, other): + """Are two messages not equal? + @rtype: bool""" + return not self.__eq__(other) + + def is_response(self, other): + """Is other a response to self? + @rtype: bool""" + if other.flags & dns.flags.QR == 0 or \ + self.id != other.id or \ + dns.opcode.from_flags(self.flags) != \ + dns.opcode.from_flags(other.flags): + return False + if dns.rcode.from_flags(other.flags, other.ednsflags) != \ + dns.rcode.NOERROR: + return True + if dns.opcode.is_update(self.flags): + return True + for n in self.question: + if n not in other.question: + return False + for n in other.question: + if n not in self.question: + return False + return True + + def section_number(self, section): + if section is self.question: + return 0 + elif section is self.answer: + return 1 + elif section is self.authority: + return 2 + elif section is self.additional: + return 3 + else: + raise ValueError('unknown section') + + def find_rrset(self, section, name, rdclass, rdtype, + covers=dns.rdatatype.NONE, deleting=None, create=False, + force_unique=False): + """Find the RRset with the given attributes in the specified section. + + @param section: the section of the message to look in, e.g. + self.answer. + @type section: list of dns.rrset.RRset objects + @param name: the name of the RRset + @type name: dns.name.Name object + @param rdclass: the class of the RRset + @type rdclass: int + @param rdtype: the type of the RRset + @type rdtype: int + @param covers: the covers value of the RRset + @type covers: int + @param deleting: the deleting value of the RRset + @type deleting: int + @param create: If True, create the RRset if it is not found. + The created RRset is appended to I{section}. + @type create: bool + @param force_unique: If True and create is also True, create a + new RRset regardless of whether a matching RRset exists already. + @type force_unique: bool + @raises KeyError: the RRset was not found and create was False + @rtype: dns.rrset.RRset object""" + + key = (self.section_number(section), + name, rdclass, rdtype, covers, deleting) + if not force_unique: + if self.index is not None: + rrset = self.index.get(key) + if rrset is not None: + return rrset + else: + for rrset in section: + if rrset.match(name, rdclass, rdtype, covers, deleting): + return rrset + if not create: + raise KeyError + rrset = dns.rrset.RRset(name, rdclass, rdtype, covers, deleting) + section.append(rrset) + if self.index is not None: + self.index[key] = rrset + return rrset + + def get_rrset(self, section, name, rdclass, rdtype, + covers=dns.rdatatype.NONE, deleting=None, create=False, + force_unique=False): + """Get the RRset with the given attributes in the specified section. + + If the RRset is not found, None is returned. + + @param section: the section of the message to look in, e.g. + self.answer. + @type section: list of dns.rrset.RRset objects + @param name: the name of the RRset + @type name: dns.name.Name object + @param rdclass: the class of the RRset + @type rdclass: int + @param rdtype: the type of the RRset + @type rdtype: int + @param covers: the covers value of the RRset + @type covers: int + @param deleting: the deleting value of the RRset + @type deleting: int + @param create: If True, create the RRset if it is not found. + The created RRset is appended to I{section}. + @type create: bool + @param force_unique: If True and create is also True, create a + new RRset regardless of whether a matching RRset exists already. + @type force_unique: bool + @rtype: dns.rrset.RRset object or None""" + + try: + rrset = self.find_rrset(section, name, rdclass, rdtype, covers, + deleting, create, force_unique) + except KeyError: + rrset = None + return rrset + + def to_wire(self, origin=None, max_size=0, **kw): + """Return a string containing the message in DNS compressed wire + format. + + Additional keyword arguments are passed to the rrset to_wire() + method. + + @param origin: The origin to be appended to any relative names. + @type origin: dns.name.Name object + @param max_size: The maximum size of the wire format output; default + is 0, which means 'the message's request payload, if nonzero, or + 65536'. + @type max_size: int + @raises dns.exception.TooBig: max_size was exceeded + @rtype: string + """ + + if max_size == 0: + if self.request_payload != 0: + max_size = self.request_payload + else: + max_size = 65535 + if max_size < 512: + max_size = 512 + elif max_size > 65535: + max_size = 65535 + r = dns.renderer.Renderer(self.id, self.flags, max_size, origin) + for rrset in self.question: + r.add_question(rrset.name, rrset.rdtype, rrset.rdclass) + for rrset in self.answer: + r.add_rrset(dns.renderer.ANSWER, rrset, **kw) + for rrset in self.authority: + r.add_rrset(dns.renderer.AUTHORITY, rrset, **kw) + if self.edns >= 0: + r.add_edns(self.edns, self.ednsflags, self.payload, self.options) + for rrset in self.additional: + r.add_rrset(dns.renderer.ADDITIONAL, rrset, **kw) + r.write_header() + if self.keyname is not None: + r.add_tsig(self.keyname, self.keyring[self.keyname], + self.fudge, self.original_id, self.tsig_error, + self.other_data, self.request_mac, + self.keyalgorithm) + self.mac = r.mac + return r.get_wire() + + def use_tsig(self, keyring, keyname=None, fudge=300, + original_id=None, tsig_error=0, other_data='', + algorithm=dns.tsig.default_algorithm): + """When sending, a TSIG signature using the specified keyring + and keyname should be added. + + @param keyring: The TSIG keyring to use; defaults to None. + @type keyring: dict + @param keyname: The name of the TSIG key to use; defaults to None. + The key must be defined in the keyring. If a keyring is specified + but a keyname is not, then the key used will be the first key in the + keyring. Note that the order of keys in a dictionary is not defined, + so applications should supply a keyname when a keyring is used, unless + they know the keyring contains only one key. + @type keyname: dns.name.Name or string + @param fudge: TSIG time fudge; default is 300 seconds. + @type fudge: int + @param original_id: TSIG original id; defaults to the message's id + @type original_id: int + @param tsig_error: TSIG error code; default is 0. + @type tsig_error: int + @param other_data: TSIG other data. + @type other_data: string + @param algorithm: The TSIG algorithm to use; defaults to + dns.tsig.default_algorithm + """ + + self.keyring = keyring + if keyname is None: + self.keyname = list(self.keyring.keys())[0] + else: + if isinstance(keyname, string_types): + keyname = dns.name.from_text(keyname) + self.keyname = keyname + self.keyalgorithm = algorithm + self.fudge = fudge + if original_id is None: + self.original_id = self.id + else: + self.original_id = original_id + self.tsig_error = tsig_error + self.other_data = other_data + + def use_edns(self, edns=0, ednsflags=0, payload=1280, request_payload=None, + options=None): + """Configure EDNS behavior. + @param edns: The EDNS level to use. Specifying None, False, or -1 + means 'do not use EDNS', and in this case the other parameters are + ignored. Specifying True is equivalent to specifying 0, i.e. 'use + EDNS0'. + @type edns: int or bool or None + @param ednsflags: EDNS flag values. + @type ednsflags: int + @param payload: The EDNS sender's payload field, which is the maximum + size of UDP datagram the sender can handle. + @type payload: int + @param request_payload: The EDNS payload size to use when sending + this message. If not specified, defaults to the value of payload. + @type request_payload: int or None + @param options: The EDNS options + @type options: None or list of dns.edns.Option objects + @see: RFC 2671 + """ + if edns is None or edns is False: + edns = -1 + if edns is True: + edns = 0 + if request_payload is None: + request_payload = payload + if edns < 0: + ednsflags = 0 + payload = 0 + request_payload = 0 + options = [] + else: + # make sure the EDNS version in ednsflags agrees with edns + ednsflags &= long(0xFF00FFFF) + ednsflags |= (edns << 16) + if options is None: + options = [] + self.edns = edns + self.ednsflags = ednsflags + self.payload = payload + self.options = options + self.request_payload = request_payload + + def want_dnssec(self, wanted=True): + """Enable or disable 'DNSSEC desired' flag in requests. + @param wanted: Is DNSSEC desired? If True, EDNS is enabled if + required, and then the DO bit is set. If False, the DO bit is + cleared if EDNS is enabled. + @type wanted: bool + """ + if wanted: + if self.edns < 0: + self.use_edns() + self.ednsflags |= dns.flags.DO + elif self.edns >= 0: + self.ednsflags &= ~dns.flags.DO + + def rcode(self): + """Return the rcode. + @rtype: int + """ + return dns.rcode.from_flags(self.flags, self.ednsflags) + + def set_rcode(self, rcode): + """Set the rcode. + @param rcode: the rcode + @type rcode: int + """ + (value, evalue) = dns.rcode.to_flags(rcode) + self.flags &= 0xFFF0 + self.flags |= value + self.ednsflags &= long(0x00FFFFFF) + self.ednsflags |= evalue + if self.ednsflags != 0 and self.edns < 0: + self.edns = 0 + + def opcode(self): + """Return the opcode. + @rtype: int + """ + return dns.opcode.from_flags(self.flags) + + def set_opcode(self, opcode): + """Set the opcode. + @param opcode: the opcode + @type opcode: int + """ + self.flags &= 0x87FF + self.flags |= dns.opcode.to_flags(opcode) + + +class _WireReader(object): + + """Wire format reader. + + @ivar wire: the wire-format message. + @type wire: string + @ivar message: The message object being built + @type message: dns.message.Message object + @ivar current: When building a message object from wire format, this + variable contains the offset from the beginning of wire of the next octet + to be read. + @type current: int + @ivar updating: Is the message a dynamic update? + @type updating: bool + @ivar one_rr_per_rrset: Put each RR into its own RRset? + @type one_rr_per_rrset: bool + @ivar ignore_trailing: Ignore trailing junk at end of request? + @type ignore_trailing: bool + @ivar zone_rdclass: The class of the zone in messages which are + DNS dynamic updates. + @type zone_rdclass: int + """ + + def __init__(self, wire, message, question_only=False, + one_rr_per_rrset=False, ignore_trailing=False): + self.wire = dns.wiredata.maybe_wrap(wire) + self.message = message + self.current = 0 + self.updating = False + self.zone_rdclass = dns.rdataclass.IN + self.question_only = question_only + self.one_rr_per_rrset = one_rr_per_rrset + self.ignore_trailing = ignore_trailing + + def _get_question(self, qcount): + """Read the next I{qcount} records from the wire data and add them to + the question section. + @param qcount: the number of questions in the message + @type qcount: int""" + + if self.updating and qcount > 1: + raise dns.exception.FormError + + for i in xrange(0, qcount): + (qname, used) = dns.name.from_wire(self.wire, self.current) + if self.message.origin is not None: + qname = qname.relativize(self.message.origin) + self.current = self.current + used + (rdtype, rdclass) = \ + struct.unpack('!HH', + self.wire[self.current:self.current + 4]) + self.current = self.current + 4 + self.message.find_rrset(self.message.question, qname, + rdclass, rdtype, create=True, + force_unique=True) + if self.updating: + self.zone_rdclass = rdclass + + def _get_section(self, section, count): + """Read the next I{count} records from the wire data and add them to + the specified section. + @param section: the section of the message to which to add records + @type section: list of dns.rrset.RRset objects + @param count: the number of records to read + @type count: int""" + + if self.updating or self.one_rr_per_rrset: + force_unique = True + else: + force_unique = False + seen_opt = False + for i in xrange(0, count): + rr_start = self.current + (name, used) = dns.name.from_wire(self.wire, self.current) + absolute_name = name + if self.message.origin is not None: + name = name.relativize(self.message.origin) + self.current = self.current + used + (rdtype, rdclass, ttl, rdlen) = \ + struct.unpack('!HHIH', + self.wire[self.current:self.current + 10]) + self.current = self.current + 10 + if rdtype == dns.rdatatype.OPT: + if section is not self.message.additional or seen_opt: + raise BadEDNS + self.message.payload = rdclass + self.message.ednsflags = ttl + self.message.edns = (ttl & 0xff0000) >> 16 + self.message.options = [] + current = self.current + optslen = rdlen + while optslen > 0: + (otype, olen) = \ + struct.unpack('!HH', + self.wire[current:current + 4]) + current = current + 4 + opt = dns.edns.option_from_wire( + otype, self.wire, current, olen) + self.message.options.append(opt) + current = current + olen + optslen = optslen - 4 - olen + seen_opt = True + elif rdtype == dns.rdatatype.TSIG: + if not (section is self.message.additional and + i == (count - 1)): + raise BadTSIG + if self.message.keyring is None: + raise UnknownTSIGKey('got signed message without keyring') + secret = self.message.keyring.get(absolute_name) + if secret is None: + raise UnknownTSIGKey("key '%s' unknown" % name) + self.message.keyname = absolute_name + (self.message.keyalgorithm, self.message.mac) = \ + dns.tsig.get_algorithm_and_mac(self.wire, self.current, + rdlen) + self.message.tsig_ctx = \ + dns.tsig.validate(self.wire, + absolute_name, + secret, + int(time.time()), + self.message.request_mac, + rr_start, + self.current, + rdlen, + self.message.tsig_ctx, + self.message.multi, + self.message.first) + self.message.had_tsig = True + else: + if ttl < 0: + ttl = 0 + if self.updating and \ + (rdclass == dns.rdataclass.ANY or + rdclass == dns.rdataclass.NONE): + deleting = rdclass + rdclass = self.zone_rdclass + else: + deleting = None + if deleting == dns.rdataclass.ANY or \ + (deleting == dns.rdataclass.NONE and + section is self.message.answer): + covers = dns.rdatatype.NONE + rd = None + else: + rd = dns.rdata.from_wire(rdclass, rdtype, self.wire, + self.current, rdlen, + self.message.origin) + covers = rd.covers() + if self.message.xfr and rdtype == dns.rdatatype.SOA: + force_unique = True + rrset = self.message.find_rrset(section, name, + rdclass, rdtype, covers, + deleting, True, force_unique) + if rd is not None: + rrset.add(rd, ttl) + self.current = self.current + rdlen + + def read(self): + """Read a wire format DNS message and build a dns.message.Message + object.""" + + l = len(self.wire) + if l < 12: + raise ShortHeader + (self.message.id, self.message.flags, qcount, ancount, + aucount, adcount) = struct.unpack('!HHHHHH', self.wire[:12]) + self.current = 12 + if dns.opcode.is_update(self.message.flags): + self.updating = True + self._get_question(qcount) + if self.question_only: + return + self._get_section(self.message.answer, ancount) + self._get_section(self.message.authority, aucount) + self._get_section(self.message.additional, adcount) + if not self.ignore_trailing and self.current != l: + raise TrailingJunk + if self.message.multi and self.message.tsig_ctx and \ + not self.message.had_tsig: + self.message.tsig_ctx.update(self.wire) + + +def from_wire(wire, keyring=None, request_mac='', xfr=False, origin=None, + tsig_ctx=None, multi=False, first=True, + question_only=False, one_rr_per_rrset=False, + ignore_trailing=False): + """Convert a DNS wire format message into a message + object. + + @param keyring: The keyring to use if the message is signed. + @type keyring: dict + @param request_mac: If the message is a response to a TSIG-signed request, + I{request_mac} should be set to the MAC of that request. + @type request_mac: string + @param xfr: Is this message part of a zone transfer? + @type xfr: bool + @param origin: If the message is part of a zone transfer, I{origin} + should be the origin name of the zone. + @type origin: dns.name.Name object + @param tsig_ctx: The ongoing TSIG context, used when validating zone + transfers. + @type tsig_ctx: hmac.HMAC object + @param multi: Is this message part of a multiple message sequence? + @type multi: bool + @param first: Is this message standalone, or the first of a multi + message sequence? + @type first: bool + @param question_only: Read only up to the end of the question section? + @type question_only: bool + @param one_rr_per_rrset: Put each RR into its own RRset + @type one_rr_per_rrset: bool + @param ignore_trailing: Ignore trailing junk at end of request? + @type ignore_trailing: bool + @raises ShortHeader: The message is less than 12 octets long. + @raises TrailingJunk: There were octets in the message past the end + of the proper DNS message. + @raises BadEDNS: An OPT record was in the wrong section, or occurred more + than once. + @raises BadTSIG: A TSIG record was not the last record of the additional + data section. + @rtype: dns.message.Message object""" + + m = Message(id=0) + m.keyring = keyring + m.request_mac = request_mac + m.xfr = xfr + m.origin = origin + m.tsig_ctx = tsig_ctx + m.multi = multi + m.first = first + + reader = _WireReader(wire, m, question_only, one_rr_per_rrset, + ignore_trailing) + reader.read() + + return m + + +class _TextReader(object): + + """Text format reader. + + @ivar tok: the tokenizer + @type tok: dns.tokenizer.Tokenizer object + @ivar message: The message object being built + @type message: dns.message.Message object + @ivar updating: Is the message a dynamic update? + @type updating: bool + @ivar zone_rdclass: The class of the zone in messages which are + DNS dynamic updates. + @type zone_rdclass: int + @ivar last_name: The most recently read name when building a message object + from text format. + @type last_name: dns.name.Name object + """ + + def __init__(self, text, message): + self.message = message + self.tok = dns.tokenizer.Tokenizer(text) + self.last_name = None + self.zone_rdclass = dns.rdataclass.IN + self.updating = False + + def _header_line(self, section): + """Process one line from the text format header section.""" + + token = self.tok.get() + what = token.value + if what == 'id': + self.message.id = self.tok.get_int() + elif what == 'flags': + while True: + token = self.tok.get() + if not token.is_identifier(): + self.tok.unget(token) + break + self.message.flags = self.message.flags | \ + dns.flags.from_text(token.value) + if dns.opcode.is_update(self.message.flags): + self.updating = True + elif what == 'edns': + self.message.edns = self.tok.get_int() + self.message.ednsflags = self.message.ednsflags | \ + (self.message.edns << 16) + elif what == 'eflags': + if self.message.edns < 0: + self.message.edns = 0 + while True: + token = self.tok.get() + if not token.is_identifier(): + self.tok.unget(token) + break + self.message.ednsflags = self.message.ednsflags | \ + dns.flags.edns_from_text(token.value) + elif what == 'payload': + self.message.payload = self.tok.get_int() + if self.message.edns < 0: + self.message.edns = 0 + elif what == 'opcode': + text = self.tok.get_string() + self.message.flags = self.message.flags | \ + dns.opcode.to_flags(dns.opcode.from_text(text)) + elif what == 'rcode': + text = self.tok.get_string() + self.message.set_rcode(dns.rcode.from_text(text)) + else: + raise UnknownHeaderField + self.tok.get_eol() + + def _question_line(self, section): + """Process one line from the text format question section.""" + + token = self.tok.get(want_leading=True) + if not token.is_whitespace(): + self.last_name = dns.name.from_text(token.value, None) + name = self.last_name + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + # Class + try: + rdclass = dns.rdataclass.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except dns.exception.SyntaxError: + raise dns.exception.SyntaxError + except Exception: + rdclass = dns.rdataclass.IN + # Type + rdtype = dns.rdatatype.from_text(token.value) + self.message.find_rrset(self.message.question, name, + rdclass, rdtype, create=True, + force_unique=True) + if self.updating: + self.zone_rdclass = rdclass + self.tok.get_eol() + + def _rr_line(self, section): + """Process one line from the text format answer, authority, or + additional data sections. + """ + + deleting = None + # Name + token = self.tok.get(want_leading=True) + if not token.is_whitespace(): + self.last_name = dns.name.from_text(token.value, None) + name = self.last_name + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + # TTL + try: + ttl = int(token.value, 0) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except dns.exception.SyntaxError: + raise dns.exception.SyntaxError + except Exception: + ttl = 0 + # Class + try: + rdclass = dns.rdataclass.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + if rdclass == dns.rdataclass.ANY or rdclass == dns.rdataclass.NONE: + deleting = rdclass + rdclass = self.zone_rdclass + except dns.exception.SyntaxError: + raise dns.exception.SyntaxError + except Exception: + rdclass = dns.rdataclass.IN + # Type + rdtype = dns.rdatatype.from_text(token.value) + token = self.tok.get() + if not token.is_eol_or_eof(): + self.tok.unget(token) + rd = dns.rdata.from_text(rdclass, rdtype, self.tok, None) + covers = rd.covers() + else: + rd = None + covers = dns.rdatatype.NONE + rrset = self.message.find_rrset(section, name, + rdclass, rdtype, covers, + deleting, True, self.updating) + if rd is not None: + rrset.add(rd, ttl) + + def read(self): + """Read a text format DNS message and build a dns.message.Message + object.""" + + line_method = self._header_line + section = None + while 1: + token = self.tok.get(True, True) + if token.is_eol_or_eof(): + break + if token.is_comment(): + u = token.value.upper() + if u == 'HEADER': + line_method = self._header_line + elif u == 'QUESTION' or u == 'ZONE': + line_method = self._question_line + section = self.message.question + elif u == 'ANSWER' or u == 'PREREQ': + line_method = self._rr_line + section = self.message.answer + elif u == 'AUTHORITY' or u == 'UPDATE': + line_method = self._rr_line + section = self.message.authority + elif u == 'ADDITIONAL': + line_method = self._rr_line + section = self.message.additional + self.tok.get_eol() + continue + self.tok.unget(token) + line_method(section) + + +def from_text(text): + """Convert the text format message into a message object. + + @param text: The text format message. + @type text: string + @raises UnknownHeaderField: + @raises dns.exception.SyntaxError: + @rtype: dns.message.Message object""" + + # 'text' can also be a file, but we don't publish that fact + # since it's an implementation detail. The official file + # interface is from_file(). + + m = Message() + + reader = _TextReader(text, m) + reader.read() + + return m + + +def from_file(f): + """Read the next text format message from the specified file. + + @param f: file or string. If I{f} is a string, it is treated + as the name of a file to open. + @raises UnknownHeaderField: + @raises dns.exception.SyntaxError: + @rtype: dns.message.Message object""" + + str_type = string_types + opts = 'rU' + + if isinstance(f, str_type): + f = open(f, opts) + want_close = True + else: + want_close = False + + try: + m = from_text(f) + finally: + if want_close: + f.close() + return m + + +def make_query(qname, rdtype, rdclass=dns.rdataclass.IN, use_edns=None, + want_dnssec=False, ednsflags=None, payload=None, + request_payload=None, options=None): + """Make a query message. + + The query name, type, and class may all be specified either + as objects of the appropriate type, or as strings. + + The query will have a randomly chosen query id, and its DNS flags + will be set to dns.flags.RD. + + @param qname: The query name. + @type qname: dns.name.Name object or string + @param rdtype: The desired rdata type. + @type rdtype: int + @param rdclass: The desired rdata class; the default is class IN. + @type rdclass: int + @param use_edns: The EDNS level to use; the default is None (no EDNS). + See the description of dns.message.Message.use_edns() for the possible + values for use_edns and their meanings. + @type use_edns: int or bool or None + @param want_dnssec: Should the query indicate that DNSSEC is desired? + @type want_dnssec: bool + @param ednsflags: EDNS flag values. + @type ednsflags: int + @param payload: The EDNS sender's payload field, which is the maximum + size of UDP datagram the sender can handle. + @type payload: int + @param request_payload: The EDNS payload size to use when sending + this message. If not specified, defaults to the value of payload. + @type request_payload: int or None + @param options: The EDNS options + @type options: None or list of dns.edns.Option objects + @see: RFC 2671 + @rtype: dns.message.Message object""" + + if isinstance(qname, string_types): + qname = dns.name.from_text(qname) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if isinstance(rdclass, string_types): + rdclass = dns.rdataclass.from_text(rdclass) + m = Message() + m.flags |= dns.flags.RD + m.find_rrset(m.question, qname, rdclass, rdtype, create=True, + force_unique=True) + # only pass keywords on to use_edns if they have been set to a + # non-None value. Setting a field will turn EDNS on if it hasn't + # been configured. + kwargs = {} + if ednsflags is not None: + kwargs['ednsflags'] = ednsflags + if use_edns is None: + use_edns = 0 + if payload is not None: + kwargs['payload'] = payload + if use_edns is None: + use_edns = 0 + if request_payload is not None: + kwargs['request_payload'] = request_payload + if use_edns is None: + use_edns = 0 + if options is not None: + kwargs['options'] = options + if use_edns is None: + use_edns = 0 + kwargs['edns'] = use_edns + m.use_edns(**kwargs) + m.want_dnssec(want_dnssec) + return m + + +def make_response(query, recursion_available=False, our_payload=8192, + fudge=300): + """Make a message which is a response for the specified query. + The message returned is really a response skeleton; it has all + of the infrastructure required of a response, but none of the + content. + + The response's question section is a shallow copy of the query's + question section, so the query's question RRsets should not be + changed. + + @param query: the query to respond to + @type query: dns.message.Message object + @param recursion_available: should RA be set in the response? + @type recursion_available: bool + @param our_payload: payload size to advertise in EDNS responses; default + is 8192. + @type our_payload: int + @param fudge: TSIG time fudge; default is 300 seconds. + @type fudge: int + @rtype: dns.message.Message object""" + + if query.flags & dns.flags.QR: + raise dns.exception.FormError('specified query message is not a query') + response = dns.message.Message(query.id) + response.flags = dns.flags.QR | (query.flags & dns.flags.RD) + if recursion_available: + response.flags |= dns.flags.RA + response.set_opcode(query.opcode()) + response.question = list(query.question) + if query.edns >= 0: + response.use_edns(0, 0, our_payload, query.payload) + if query.had_tsig: + response.use_tsig(query.keyring, query.keyname, fudge, None, 0, '', + query.keyalgorithm) + response.request_mac = query.mac + return response diff --git a/Contents/Libraries/Shared/dns/name.py b/Contents/Libraries/Shared/dns/name.py new file mode 100644 index 000000000..97e216c8f --- /dev/null +++ b/Contents/Libraries/Shared/dns/name.py @@ -0,0 +1,924 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Names. + +@var root: The DNS root name. +@type root: dns.name.Name object +@var empty: The empty DNS name. +@type empty: dns.name.Name object +""" + +from io import BytesIO +import struct +import sys +import copy +import encodings.idna +try: + import idna + have_idna_2008 = True +except ImportError: + have_idna_2008 = False + +import dns.exception +import dns.wiredata + +from ._compat import long, binary_type, text_type, unichr, maybe_decode + +try: + maxint = sys.maxint +except AttributeError: + maxint = (1 << (8 * struct.calcsize("P"))) // 2 - 1 + +NAMERELN_NONE = 0 +NAMERELN_SUPERDOMAIN = 1 +NAMERELN_SUBDOMAIN = 2 +NAMERELN_EQUAL = 3 +NAMERELN_COMMONANCESTOR = 4 + + +class EmptyLabel(dns.exception.SyntaxError): + + """A DNS label is empty.""" + + +class BadEscape(dns.exception.SyntaxError): + + """An escaped code in a text format of DNS name is invalid.""" + + +class BadPointer(dns.exception.FormError): + + """A DNS compression pointer points forward instead of backward.""" + + +class BadLabelType(dns.exception.FormError): + + """The label type in DNS name wire format is unknown.""" + + +class NeedAbsoluteNameOrOrigin(dns.exception.DNSException): + + """An attempt was made to convert a non-absolute name to + wire when there was also a non-absolute (or missing) origin.""" + + +class NameTooLong(dns.exception.FormError): + + """A DNS name is > 255 octets long.""" + + +class LabelTooLong(dns.exception.SyntaxError): + + """A DNS label is > 63 octets long.""" + + +class AbsoluteConcatenation(dns.exception.DNSException): + + """An attempt was made to append anything other than the + empty name to an absolute DNS name.""" + + +class NoParent(dns.exception.DNSException): + + """An attempt was made to get the parent of the root name + or the empty name.""" + +class NoIDNA2008(dns.exception.DNSException): + + """IDNA 2008 processing was requested but the idna module is not + available.""" + + +class IDNAException(dns.exception.DNSException): + + """IDNA processing raised an exception.""" + + supp_kwargs = set(['idna_exception']) + fmt = "IDNA processing exception: {idna_exception}" + +class IDNACodec(object): + + """Abstract base class for IDNA encoder/decoders.""" + + def __init__(self): + pass + + def encode(self, label): + raise NotImplementedError + + def decode(self, label): + # We do not apply any IDNA policy on decode; we just + downcased = label.lower() + if downcased.startswith(b'xn--'): + try: + label = downcased[4:].decode('punycode') + except Exception as e: + raise IDNAException(idna_exception=e) + else: + label = maybe_decode(label) + return _escapify(label, True) + +class IDNA2003Codec(IDNACodec): + + """IDNA 2003 encoder/decoder.""" + + def __init__(self, strict_decode=False): + """Initialize the IDNA 2003 encoder/decoder. + @param strict_decode: If True, then IDNA2003 checking is done when + decoding. This can cause failures if the name was encoded with + IDNA2008. The default is False. + @type strict_decode: bool + """ + super(IDNA2003Codec, self).__init__() + self.strict_decode = strict_decode + + def encode(self, label): + if label == '': + return b'' + try: + return encodings.idna.ToASCII(label) + except UnicodeError: + raise LabelTooLong + + def decode(self, label): + if not self.strict_decode: + return super(IDNA2003Codec, self).decode(label) + if label == b'': + return u'' + try: + return _escapify(encodings.idna.ToUnicode(label), True) + except Exception as e: + raise IDNAException(idna_exception=e) + +class IDNA2008Codec(IDNACodec): + + """IDNA 2008 encoder/decoder.""" + + def __init__(self, uts_46=False, transitional=False, + allow_pure_ascii=False, strict_decode=False): + """Initialize the IDNA 2008 encoder/decoder. + @param uts_46: If True, apply Unicode IDNA compatibility processing + as described in Unicode Technical Standard #46 + (U{http://unicode.org/reports/tr46/}). This parameter is only + meaningful if IDNA 2008 is in use. If False, do not apply + the mapping. The default is False + @type uts_46: bool + @param transitional: If True, use the "transitional" mode described + in Unicode Technical Standard #46. This parameter is only + meaningful if IDNA 2008 is in use. The default is False. + @type transitional: bool + @param allow_pure_ascii: If True, then a label which + consists of only ASCII characters is allowed. This is less strict + than regular IDNA 2008, but is also necessary for mixed names, + e.g. a name with starting with "_sip._tcp." and ending in an IDN + suffixm which would otherwise be disallowed. The default is False + @type allow_pure_ascii: bool + @param strict_decode: If True, then IDNA2008 checking is done when + decoding. This can cause failures if the name was encoded with + IDNA2003. The default is False. + @type strict_decode: bool + """ + super(IDNA2008Codec, self).__init__() + self.uts_46 = uts_46 + self.transitional = transitional + self.allow_pure_ascii = allow_pure_ascii + self.strict_decode = strict_decode + + def is_all_ascii(self, label): + for c in label: + if ord(c) > 0x7f: + return False + return True + + def encode(self, label): + if label == '': + return b'' + if self.allow_pure_ascii and self.is_all_ascii(label): + return label.encode('ascii') + if not have_idna_2008: + raise NoIDNA2008 + try: + if self.uts_46: + label = idna.uts46_remap(label, False, self.transitional) + return idna.alabel(label) + except idna.IDNAError as e: + raise IDNAException(idna_exception=e) + + def decode(self, label): + if not self.strict_decode: + return super(IDNA2008Codec, self).decode(label) + if label == b'': + return u'' + if not have_idna_2008: + raise NoIDNA2008 + try: + if self.uts_46: + label = idna.uts46_remap(label, False, False) + return _escapify(idna.ulabel(label), True) + except idna.IDNAError as e: + raise IDNAException(idna_exception=e) + +_escaped = bytearray(b'"().;\\@$') + +IDNA_2003_Practical = IDNA2003Codec(False) +IDNA_2003_Strict = IDNA2003Codec(True) +IDNA_2003 = IDNA_2003_Practical +IDNA_2008_Practical = IDNA2008Codec(True, False, True, False) +IDNA_2008_UTS_46 = IDNA2008Codec(True, False, False, False) +IDNA_2008_Strict = IDNA2008Codec(False, False, False, True) +IDNA_2008_Transitional = IDNA2008Codec(True, True, False, False) +IDNA_2008 = IDNA_2008_Practical + +def _escapify(label, unicode_mode=False): + """Escape the characters in label which need it. + @param unicode_mode: escapify only special and whitespace (<= 0x20) + characters + @returns: the escaped string + @rtype: string""" + if not unicode_mode: + text = '' + if isinstance(label, text_type): + label = label.encode() + for c in bytearray(label): + if c in _escaped: + text += '\\' + chr(c) + elif c > 0x20 and c < 0x7F: + text += chr(c) + else: + text += '\\%03d' % c + return text.encode() + + text = u'' + if isinstance(label, binary_type): + label = label.decode() + for c in label: + if c > u'\x20' and c < u'\x7f': + text += c + else: + if c >= u'\x7f': + text += c + else: + text += u'\\%03d' % ord(c) + return text + +def _validate_labels(labels): + """Check for empty labels in the middle of a label sequence, + labels that are too long, and for too many labels. + @raises NameTooLong: the name as a whole is too long + @raises EmptyLabel: a label is empty (i.e. the root label) and appears + in a position other than the end of the label sequence""" + + l = len(labels) + total = 0 + i = -1 + j = 0 + for label in labels: + ll = len(label) + total += ll + 1 + if ll > 63: + raise LabelTooLong + if i < 0 and label == b'': + i = j + j += 1 + if total > 255: + raise NameTooLong + if i >= 0 and i != l - 1: + raise EmptyLabel + + +def _ensure_bytes(label): + if isinstance(label, binary_type): + return label + if isinstance(label, text_type): + return label.encode() + raise ValueError + + +class Name(object): + + """A DNS name. + + The dns.name.Name class represents a DNS name as a tuple of labels. + Instances of the class are immutable. + + @ivar labels: The tuple of labels in the name. Each label is a string of + up to 63 octets.""" + + __slots__ = ['labels'] + + def __init__(self, labels): + """Initialize a domain name from a list of labels. + @param labels: the labels + @type labels: any iterable whose values are strings + """ + labels = [_ensure_bytes(x) for x in labels] + super(Name, self).__setattr__('labels', tuple(labels)) + _validate_labels(self.labels) + + def __setattr__(self, name, value): + raise TypeError("object doesn't support attribute assignment") + + def __copy__(self): + return Name(self.labels) + + def __deepcopy__(self, memo): + return Name(copy.deepcopy(self.labels, memo)) + + def __getstate__(self): + return {'labels': self.labels} + + def __setstate__(self, state): + super(Name, self).__setattr__('labels', state['labels']) + _validate_labels(self.labels) + + def is_absolute(self): + """Is the most significant label of this name the root label? + @rtype: bool + """ + + return len(self.labels) > 0 and self.labels[-1] == b'' + + def is_wild(self): + """Is this name wild? (I.e. Is the least significant label '*'?) + @rtype: bool + """ + + return len(self.labels) > 0 and self.labels[0] == b'*' + + def __hash__(self): + """Return a case-insensitive hash of the name. + @rtype: int + """ + + h = long(0) + for label in self.labels: + for c in bytearray(label.lower()): + h += (h << 3) + c + return int(h % maxint) + + def fullcompare(self, other): + """Compare two names, returning a 3-tuple (relation, order, nlabels). + + I{relation} describes the relation ship between the names, + and is one of: dns.name.NAMERELN_NONE, + dns.name.NAMERELN_SUPERDOMAIN, dns.name.NAMERELN_SUBDOMAIN, + dns.name.NAMERELN_EQUAL, or dns.name.NAMERELN_COMMONANCESTOR + + I{order} is < 0 if self < other, > 0 if self > other, and == + 0 if self == other. A relative name is always less than an + absolute name. If both names have the same relativity, then + the DNSSEC order relation is used to order them. + + I{nlabels} is the number of significant labels that the two names + have in common. + """ + + sabs = self.is_absolute() + oabs = other.is_absolute() + if sabs != oabs: + if sabs: + return (NAMERELN_NONE, 1, 0) + else: + return (NAMERELN_NONE, -1, 0) + l1 = len(self.labels) + l2 = len(other.labels) + ldiff = l1 - l2 + if ldiff < 0: + l = l1 + else: + l = l2 + + order = 0 + nlabels = 0 + namereln = NAMERELN_NONE + while l > 0: + l -= 1 + l1 -= 1 + l2 -= 1 + label1 = self.labels[l1].lower() + label2 = other.labels[l2].lower() + if label1 < label2: + order = -1 + if nlabels > 0: + namereln = NAMERELN_COMMONANCESTOR + return (namereln, order, nlabels) + elif label1 > label2: + order = 1 + if nlabels > 0: + namereln = NAMERELN_COMMONANCESTOR + return (namereln, order, nlabels) + nlabels += 1 + order = ldiff + if ldiff < 0: + namereln = NAMERELN_SUPERDOMAIN + elif ldiff > 0: + namereln = NAMERELN_SUBDOMAIN + else: + namereln = NAMERELN_EQUAL + return (namereln, order, nlabels) + + def is_subdomain(self, other): + """Is self a subdomain of other? + + The notion of subdomain includes equality. + @rtype: bool + """ + + (nr, o, nl) = self.fullcompare(other) + if nr == NAMERELN_SUBDOMAIN or nr == NAMERELN_EQUAL: + return True + return False + + def is_superdomain(self, other): + """Is self a superdomain of other? + + The notion of subdomain includes equality. + @rtype: bool + """ + + (nr, o, nl) = self.fullcompare(other) + if nr == NAMERELN_SUPERDOMAIN or nr == NAMERELN_EQUAL: + return True + return False + + def canonicalize(self): + """Return a name which is equal to the current name, but is in + DNSSEC canonical form. + @rtype: dns.name.Name object + """ + + return Name([x.lower() for x in self.labels]) + + def __eq__(self, other): + if isinstance(other, Name): + return self.fullcompare(other)[1] == 0 + else: + return False + + def __ne__(self, other): + if isinstance(other, Name): + return self.fullcompare(other)[1] != 0 + else: + return True + + def __lt__(self, other): + if isinstance(other, Name): + return self.fullcompare(other)[1] < 0 + else: + return NotImplemented + + def __le__(self, other): + if isinstance(other, Name): + return self.fullcompare(other)[1] <= 0 + else: + return NotImplemented + + def __ge__(self, other): + if isinstance(other, Name): + return self.fullcompare(other)[1] >= 0 + else: + return NotImplemented + + def __gt__(self, other): + if isinstance(other, Name): + return self.fullcompare(other)[1] > 0 + else: + return NotImplemented + + def __repr__(self): + return '' + + def __str__(self): + return self.to_text(False) + + def to_text(self, omit_final_dot=False): + """Convert name to text format. + @param omit_final_dot: If True, don't emit the final dot (denoting the + root label) for absolute names. The default is False. + @rtype: string + """ + + if len(self.labels) == 0: + return maybe_decode(b'@') + if len(self.labels) == 1 and self.labels[0] == b'': + return maybe_decode(b'.') + if omit_final_dot and self.is_absolute(): + l = self.labels[:-1] + else: + l = self.labels + s = b'.'.join(map(_escapify, l)) + return maybe_decode(s) + + def to_unicode(self, omit_final_dot=False, idna_codec=None): + """Convert name to Unicode text format. + + IDN ACE labels are converted to Unicode. + + @param omit_final_dot: If True, don't emit the final dot (denoting the + root label) for absolute names. The default is False. + @type omit_final_dot: bool + @param idna_codec: IDNA encoder/decoder. If None, the + IDNA_2003_Practical encoder/decoder is used. The IDNA_2003_Practical + decoder does not impose any policy, it just decodes punycode, so if + you don't want checking for compliance, you can use this decoder for + IDNA2008 as well. + @type idna_codec: dns.name.IDNA + @rtype: string + """ + + if len(self.labels) == 0: + return u'@' + if len(self.labels) == 1 and self.labels[0] == b'': + return u'.' + if omit_final_dot and self.is_absolute(): + l = self.labels[:-1] + else: + l = self.labels + if idna_codec is None: + idna_codec = IDNA_2003_Practical + return u'.'.join([idna_codec.decode(x) for x in l]) + + def to_digestable(self, origin=None): + """Convert name to a format suitable for digesting in hashes. + + The name is canonicalized and converted to uncompressed wire format. + + @param origin: If the name is relative and origin is not None, then + origin will be appended to it. + @type origin: dns.name.Name object + @raises NeedAbsoluteNameOrOrigin: All names in wire format are + absolute. If self is a relative name, then an origin must be supplied; + if it is missing, then this exception is raised + @rtype: string + """ + + if not self.is_absolute(): + if origin is None or not origin.is_absolute(): + raise NeedAbsoluteNameOrOrigin + labels = list(self.labels) + labels.extend(list(origin.labels)) + else: + labels = self.labels + dlabels = [struct.pack('!B%ds' % len(x), len(x), x.lower()) + for x in labels] + return b''.join(dlabels) + + def to_wire(self, file=None, compress=None, origin=None): + """Convert name to wire format, possibly compressing it. + + @param file: the file where the name is emitted (typically + a BytesIO file). If None, a string containing the wire name + will be returned. + @type file: file or None + @param compress: The compression table. If None (the default) names + will not be compressed. + @type compress: dict + @param origin: If the name is relative and origin is not None, then + origin will be appended to it. + @type origin: dns.name.Name object + @raises NeedAbsoluteNameOrOrigin: All names in wire format are + absolute. If self is a relative name, then an origin must be supplied; + if it is missing, then this exception is raised + """ + + if file is None: + file = BytesIO() + want_return = True + else: + want_return = False + + if not self.is_absolute(): + if origin is None or not origin.is_absolute(): + raise NeedAbsoluteNameOrOrigin + labels = list(self.labels) + labels.extend(list(origin.labels)) + else: + labels = self.labels + i = 0 + for label in labels: + n = Name(labels[i:]) + i += 1 + if compress is not None: + pos = compress.get(n) + else: + pos = None + if pos is not None: + value = 0xc000 + pos + s = struct.pack('!H', value) + file.write(s) + break + else: + if compress is not None and len(n) > 1: + pos = file.tell() + if pos <= 0x3fff: + compress[n] = pos + l = len(label) + file.write(struct.pack('!B', l)) + if l > 0: + file.write(label) + if want_return: + return file.getvalue() + + def __len__(self): + """The length of the name (in labels). + @rtype: int + """ + + return len(self.labels) + + def __getitem__(self, index): + return self.labels[index] + + def __add__(self, other): + return self.concatenate(other) + + def __sub__(self, other): + return self.relativize(other) + + def split(self, depth): + """Split a name into a prefix and suffix at depth. + + @param depth: the number of labels in the suffix + @type depth: int + @raises ValueError: the depth was not >= 0 and <= the length of the + name. + @returns: the tuple (prefix, suffix) + @rtype: tuple + """ + + l = len(self.labels) + if depth == 0: + return (self, dns.name.empty) + elif depth == l: + return (dns.name.empty, self) + elif depth < 0 or depth > l: + raise ValueError( + 'depth must be >= 0 and <= the length of the name') + return (Name(self[: -depth]), Name(self[-depth:])) + + def concatenate(self, other): + """Return a new name which is the concatenation of self and other. + @rtype: dns.name.Name object + @raises AbsoluteConcatenation: self is absolute and other is + not the empty name + """ + + if self.is_absolute() and len(other) > 0: + raise AbsoluteConcatenation + labels = list(self.labels) + labels.extend(list(other.labels)) + return Name(labels) + + def relativize(self, origin): + """If self is a subdomain of origin, return a new name which is self + relative to origin. Otherwise return self. + @rtype: dns.name.Name object + """ + + if origin is not None and self.is_subdomain(origin): + return Name(self[: -len(origin)]) + else: + return self + + def derelativize(self, origin): + """If self is a relative name, return a new name which is the + concatenation of self and origin. Otherwise return self. + @rtype: dns.name.Name object + """ + + if not self.is_absolute(): + return self.concatenate(origin) + else: + return self + + def choose_relativity(self, origin=None, relativize=True): + """Return a name with the relativity desired by the caller. If + origin is None, then self is returned. Otherwise, if + relativize is true the name is relativized, and if relativize is + false the name is derelativized. + @rtype: dns.name.Name object + """ + + if origin: + if relativize: + return self.relativize(origin) + else: + return self.derelativize(origin) + else: + return self + + def parent(self): + """Return the parent of the name. + @rtype: dns.name.Name object + @raises NoParent: the name is either the root name or the empty name, + and thus has no parent. + """ + if self == root or self == empty: + raise NoParent + return Name(self.labels[1:]) + +root = Name([b'']) +empty = Name([]) + + +def from_unicode(text, origin=root, idna_codec=None): + """Convert unicode text into a Name object. + + Labels are encoded in IDN ACE form. + + @param text: The text to convert into a name. + @type text: Unicode string + @param origin: The origin to append to non-absolute names. + @type origin: dns.name.Name + @param idna_codec: IDNA encoder/decoder. If None, the default IDNA 2003 + encoder/decoder is used. + @type idna_codec: dns.name.IDNA + @rtype: dns.name.Name object + """ + + if not isinstance(text, text_type): + raise ValueError("input to from_unicode() must be a unicode string") + if not (origin is None or isinstance(origin, Name)): + raise ValueError("origin must be a Name or None") + labels = [] + label = u'' + escaping = False + edigits = 0 + total = 0 + if idna_codec is None: + idna_codec = IDNA_2003 + if text == u'@': + text = u'' + if text: + if text == u'.': + return Name([b'']) # no Unicode "u" on this constant! + for c in text: + if escaping: + if edigits == 0: + if c.isdigit(): + total = int(c) + edigits += 1 + else: + label += c + escaping = False + else: + if not c.isdigit(): + raise BadEscape + total *= 10 + total += int(c) + edigits += 1 + if edigits == 3: + escaping = False + label += unichr(total) + elif c in [u'.', u'\u3002', u'\uff0e', u'\uff61']: + if len(label) == 0: + raise EmptyLabel + labels.append(idna_codec.encode(label)) + label = u'' + elif c == u'\\': + escaping = True + edigits = 0 + total = 0 + else: + label += c + if escaping: + raise BadEscape + if len(label) > 0: + labels.append(idna_codec.encode(label)) + else: + labels.append(b'') + + if (len(labels) == 0 or labels[-1] != b'') and origin is not None: + labels.extend(list(origin.labels)) + return Name(labels) + + +def from_text(text, origin=root, idna_codec=None): + """Convert text into a Name object. + + @param text: The text to convert into a name. + @type text: string + @param origin: The origin to append to non-absolute names. + @type origin: dns.name.Name + @param idna_codec: IDNA encoder/decoder. If None, the default IDNA 2003 + encoder/decoder is used. + @type idna_codec: dns.name.IDNA + @rtype: dns.name.Name object + """ + + if isinstance(text, text_type): + return from_unicode(text, origin, idna_codec) + if not isinstance(text, binary_type): + raise ValueError("input to from_text() must be a string") + if not (origin is None or isinstance(origin, Name)): + raise ValueError("origin must be a Name or None") + labels = [] + label = b'' + escaping = False + edigits = 0 + total = 0 + if text == b'@': + text = b'' + if text: + if text == b'.': + return Name([b'']) + for c in bytearray(text): + byte_ = struct.pack('!B', c) + if escaping: + if edigits == 0: + if byte_.isdigit(): + total = int(byte_) + edigits += 1 + else: + label += byte_ + escaping = False + else: + if not byte_.isdigit(): + raise BadEscape + total *= 10 + total += int(byte_) + edigits += 1 + if edigits == 3: + escaping = False + label += struct.pack('!B', total) + elif byte_ == b'.': + if len(label) == 0: + raise EmptyLabel + labels.append(label) + label = b'' + elif byte_ == b'\\': + escaping = True + edigits = 0 + total = 0 + else: + label += byte_ + if escaping: + raise BadEscape + if len(label) > 0: + labels.append(label) + else: + labels.append(b'') + if (len(labels) == 0 or labels[-1] != b'') and origin is not None: + labels.extend(list(origin.labels)) + return Name(labels) + + +def from_wire(message, current): + """Convert possibly compressed wire format into a Name. + @param message: the entire DNS message + @type message: string + @param current: the offset of the beginning of the name from the start + of the message + @type current: int + @raises dns.name.BadPointer: a compression pointer did not point backwards + in the message + @raises dns.name.BadLabelType: an invalid label type was encountered. + @returns: a tuple consisting of the name that was read and the number + of bytes of the wire format message which were consumed reading it + @rtype: (dns.name.Name object, int) tuple + """ + + if not isinstance(message, binary_type): + raise ValueError("input to from_wire() must be a byte string") + message = dns.wiredata.maybe_wrap(message) + labels = [] + biggest_pointer = current + hops = 0 + count = message[current] + current += 1 + cused = 1 + while count != 0: + if count < 64: + labels.append(message[current: current + count].unwrap()) + current += count + if hops == 0: + cused += count + elif count >= 192: + current = (count & 0x3f) * 256 + message[current] + if hops == 0: + cused += 1 + if current >= biggest_pointer: + raise BadPointer + biggest_pointer = current + hops += 1 + else: + raise BadLabelType + count = message[current] + current += 1 + if hops == 0: + cused += 1 + labels.append('') + return (Name(labels), cused) diff --git a/Contents/Libraries/Shared/dns/namedict.py b/Contents/Libraries/Shared/dns/namedict.py new file mode 100644 index 000000000..58e403440 --- /dev/null +++ b/Contents/Libraries/Shared/dns/namedict.py @@ -0,0 +1,104 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# Copyright (C) 2016 Coresec Systems AB +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND CORESEC SYSTEMS AB DISCLAIMS ALL +# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL CORESEC +# SYSTEMS AB BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS name dictionary""" + +import collections +import dns.name +from ._compat import xrange + + +class NameDict(collections.MutableMapping): + + """A dictionary whose keys are dns.name.Name objects. + @ivar max_depth: the maximum depth of the keys that have ever been + added to the dictionary. + @type max_depth: int + @ivar max_depth_items: the number of items of maximum depth + @type max_depth_items: int + """ + + __slots__ = ["max_depth", "max_depth_items", "__store"] + + def __init__(self, *args, **kwargs): + self.__store = dict() + self.max_depth = 0 + self.max_depth_items = 0 + self.update(dict(*args, **kwargs)) + + def __update_max_depth(self, key): + if len(key) == self.max_depth: + self.max_depth_items = self.max_depth_items + 1 + elif len(key) > self.max_depth: + self.max_depth = len(key) + self.max_depth_items = 1 + + def __getitem__(self, key): + return self.__store[key] + + def __setitem__(self, key, value): + if not isinstance(key, dns.name.Name): + raise ValueError('NameDict key must be a name') + self.__store[key] = value + self.__update_max_depth(key) + + def __delitem__(self, key): + value = self.__store.pop(key) + if len(value) == self.max_depth: + self.max_depth_items = self.max_depth_items - 1 + if self.max_depth_items == 0: + self.max_depth = 0 + for k in self.__store: + self.__update_max_depth(k) + + def __iter__(self): + return iter(self.__store) + + def __len__(self): + return len(self.__store) + + def has_key(self, key): + return key in self.__store + + def get_deepest_match(self, name): + """Find the deepest match to I{name} in the dictionary. + + The deepest match is the longest name in the dictionary which is + a superdomain of I{name}. + + @param name: the name + @type name: dns.name.Name object + @rtype: (key, value) tuple + """ + + depth = len(name) + if depth > self.max_depth: + depth = self.max_depth + for i in xrange(-depth, 0): + n = dns.name.Name(name[i:]) + if n in self: + return (n, self[n]) + v = self[dns.name.empty] + return (dns.name.empty, v) diff --git a/Contents/Libraries/Shared/dns/node.py b/Contents/Libraries/Shared/dns/node.py new file mode 100644 index 000000000..7c25060e9 --- /dev/null +++ b/Contents/Libraries/Shared/dns/node.py @@ -0,0 +1,178 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS nodes. A node is a set of rdatasets.""" + +from io import StringIO + +import dns.rdataset +import dns.rdatatype +import dns.renderer + + +class Node(object): + + """A DNS node. + + A node is a set of rdatasets + + @ivar rdatasets: the node's rdatasets + @type rdatasets: list of dns.rdataset.Rdataset objects""" + + __slots__ = ['rdatasets'] + + def __init__(self): + """Initialize a DNS node. + """ + + self.rdatasets = [] + + def to_text(self, name, **kw): + """Convert a node to text format. + + Each rdataset at the node is printed. Any keyword arguments + to this method are passed on to the rdataset's to_text() method. + @param name: the owner name of the rdatasets + @type name: dns.name.Name object + @rtype: string + """ + + s = StringIO() + for rds in self.rdatasets: + if len(rds) > 0: + s.write(rds.to_text(name, **kw)) + s.write(u'\n') + return s.getvalue()[:-1] + + def __repr__(self): + return '' + + def __eq__(self, other): + """Two nodes are equal if they have the same rdatasets. + + @rtype: bool + """ + # + # This is inefficient. Good thing we don't need to do it much. + # + for rd in self.rdatasets: + if rd not in other.rdatasets: + return False + for rd in other.rdatasets: + if rd not in self.rdatasets: + return False + return True + + def __ne__(self, other): + return not self.__eq__(other) + + def __len__(self): + return len(self.rdatasets) + + def __iter__(self): + return iter(self.rdatasets) + + def find_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE, + create=False): + """Find an rdataset matching the specified properties in the + current node. + + @param rdclass: The class of the rdataset + @type rdclass: int + @param rdtype: The type of the rdataset + @type rdtype: int + @param covers: The covered type. Usually this value is + dns.rdatatype.NONE, but if the rdtype is dns.rdatatype.SIG or + dns.rdatatype.RRSIG, then the covers value will be the rdata + type the SIG/RRSIG covers. The library treats the SIG and RRSIG + types as if they were a family of + types, e.g. RRSIG(A), RRSIG(NS), RRSIG(SOA). This makes RRSIGs much + easier to work with than if RRSIGs covering different rdata + types were aggregated into a single RRSIG rdataset. + @type covers: int + @param create: If True, create the rdataset if it is not found. + @type create: bool + @raises KeyError: An rdataset of the desired type and class does + not exist and I{create} is not True. + @rtype: dns.rdataset.Rdataset object + """ + + for rds in self.rdatasets: + if rds.match(rdclass, rdtype, covers): + return rds + if not create: + raise KeyError + rds = dns.rdataset.Rdataset(rdclass, rdtype) + self.rdatasets.append(rds) + return rds + + def get_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE, + create=False): + """Get an rdataset matching the specified properties in the + current node. + + None is returned if an rdataset of the specified type and + class does not exist and I{create} is not True. + + @param rdclass: The class of the rdataset + @type rdclass: int + @param rdtype: The type of the rdataset + @type rdtype: int + @param covers: The covered type. + @type covers: int + @param create: If True, create the rdataset if it is not found. + @type create: bool + @rtype: dns.rdataset.Rdataset object or None + """ + + try: + rds = self.find_rdataset(rdclass, rdtype, covers, create) + except KeyError: + rds = None + return rds + + def delete_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE): + """Delete the rdataset matching the specified properties in the + current node. + + If a matching rdataset does not exist, it is not an error. + + @param rdclass: The class of the rdataset + @type rdclass: int + @param rdtype: The type of the rdataset + @type rdtype: int + @param covers: The covered type. + @type covers: int + """ + + rds = self.get_rdataset(rdclass, rdtype, covers) + if rds is not None: + self.rdatasets.remove(rds) + + def replace_rdataset(self, replacement): + """Replace an rdataset. + + It is not an error if there is no rdataset matching I{replacement}. + + Ownership of the I{replacement} object is transferred to the node; + in other words, this method does not store a copy of I{replacement} + at the node, it stores I{replacement} itself. + """ + + if not isinstance(replacement, dns.rdataset.Rdataset): + raise ValueError('replacement is not an rdataset') + self.delete_rdataset(replacement.rdclass, replacement.rdtype, + replacement.covers) + self.rdatasets.append(replacement) diff --git a/Contents/Libraries/Shared/dns/opcode.py b/Contents/Libraries/Shared/dns/opcode.py new file mode 100644 index 000000000..70d704fb3 --- /dev/null +++ b/Contents/Libraries/Shared/dns/opcode.py @@ -0,0 +1,107 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Opcodes.""" + +import dns.exception + +QUERY = 0 +IQUERY = 1 +STATUS = 2 +NOTIFY = 4 +UPDATE = 5 + +_by_text = { + 'QUERY': QUERY, + 'IQUERY': IQUERY, + 'STATUS': STATUS, + 'NOTIFY': NOTIFY, + 'UPDATE': UPDATE +} + +# We construct the inverse mapping programmatically to ensure that we +# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that +# would cause the mapping not to be true inverse. + +_by_value = dict((y, x) for x, y in _by_text.items()) + + +class UnknownOpcode(dns.exception.DNSException): + + """An DNS opcode is unknown.""" + + +def from_text(text): + """Convert text into an opcode. + + @param text: the textual opcode + @type text: string + @raises UnknownOpcode: the opcode is unknown + @rtype: int + """ + + if text.isdigit(): + value = int(text) + if value >= 0 and value <= 15: + return value + value = _by_text.get(text.upper()) + if value is None: + raise UnknownOpcode + return value + + +def from_flags(flags): + """Extract an opcode from DNS message flags. + + @param flags: int + @rtype: int + """ + + return (flags & 0x7800) >> 11 + + +def to_flags(value): + """Convert an opcode to a value suitable for ORing into DNS message + flags. + @rtype: int + """ + + return (value << 11) & 0x7800 + + +def to_text(value): + """Convert an opcode to text. + + @param value: the opcdoe + @type value: int + @raises UnknownOpcode: the opcode is unknown + @rtype: string + """ + + text = _by_value.get(value) + if text is None: + text = str(value) + return text + + +def is_update(flags): + """True if the opcode in flags is UPDATE. + + @param flags: DNS flags + @type flags: int + @rtype: bool + """ + + return from_flags(flags) == UPDATE diff --git a/Contents/Libraries/Shared/dns/query.py b/Contents/Libraries/Shared/dns/query.py new file mode 100644 index 000000000..bfecd43e5 --- /dev/null +++ b/Contents/Libraries/Shared/dns/query.py @@ -0,0 +1,539 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Talk to a DNS server.""" + +from __future__ import generators + +import errno +import select +import socket +import struct +import sys +import time + +import dns.exception +import dns.inet +import dns.name +import dns.message +import dns.rdataclass +import dns.rdatatype +from ._compat import long, string_types + +if sys.version_info > (3,): + select_error = OSError +else: + select_error = select.error + +# Function used to create a socket. Can be overridden if needed in special +# situations. +socket_factory = socket.socket + +class UnexpectedSource(dns.exception.DNSException): + + """A DNS query response came from an unexpected address or port.""" + + +class BadResponse(dns.exception.FormError): + + """A DNS query response does not respond to the question asked.""" + + +def _compute_expiration(timeout): + if timeout is None: + return None + else: + return time.time() + timeout + + +def _poll_for(fd, readable, writable, error, timeout): + """Poll polling backend. + @param fd: File descriptor + @type fd: int + @param readable: Whether to wait for readability + @type readable: bool + @param writable: Whether to wait for writability + @type writable: bool + @param timeout: Deadline timeout (expiration time, in seconds) + @type timeout: float + @return True on success, False on timeout + """ + event_mask = 0 + if readable: + event_mask |= select.POLLIN + if writable: + event_mask |= select.POLLOUT + if error: + event_mask |= select.POLLERR + + pollable = select.poll() + pollable.register(fd, event_mask) + + if timeout: + event_list = pollable.poll(long(timeout * 1000)) + else: + event_list = pollable.poll() + + return bool(event_list) + + +def _select_for(fd, readable, writable, error, timeout): + """Select polling backend. + @param fd: File descriptor + @type fd: int + @param readable: Whether to wait for readability + @type readable: bool + @param writable: Whether to wait for writability + @type writable: bool + @param timeout: Deadline timeout (expiration time, in seconds) + @type timeout: float + @return True on success, False on timeout + """ + rset, wset, xset = [], [], [] + + if readable: + rset = [fd] + if writable: + wset = [fd] + if error: + xset = [fd] + + if timeout is None: + (rcount, wcount, xcount) = select.select(rset, wset, xset) + else: + (rcount, wcount, xcount) = select.select(rset, wset, xset, timeout) + + return bool((rcount or wcount or xcount)) + + +def _wait_for(fd, readable, writable, error, expiration): + done = False + while not done: + if expiration is None: + timeout = None + else: + timeout = expiration - time.time() + if timeout <= 0.0: + raise dns.exception.Timeout + try: + if not _polling_backend(fd, readable, writable, error, timeout): + raise dns.exception.Timeout + except select_error as e: + if e.args[0] != errno.EINTR: + raise e + done = True + + +def _set_polling_backend(fn): + """ + Internal API. Do not use. + """ + global _polling_backend + + _polling_backend = fn + +if hasattr(select, 'poll'): + # Prefer poll() on platforms that support it because it has no + # limits on the maximum value of a file descriptor (plus it will + # be more efficient for high values). + _polling_backend = _poll_for +else: + _polling_backend = _select_for + + +def _wait_for_readable(s, expiration): + _wait_for(s, True, False, True, expiration) + + +def _wait_for_writable(s, expiration): + _wait_for(s, False, True, True, expiration) + + +def _addresses_equal(af, a1, a2): + # Convert the first value of the tuple, which is a textual format + # address into binary form, so that we are not confused by different + # textual representations of the same address + n1 = dns.inet.inet_pton(af, a1[0]) + n2 = dns.inet.inet_pton(af, a2[0]) + return n1 == n2 and a1[1:] == a2[1:] + + +def _destination_and_source(af, where, port, source, source_port): + # Apply defaults and compute destination and source tuples + # suitable for use in connect(), sendto(), or bind(). + if af is None: + try: + af = dns.inet.af_for_address(where) + except Exception: + af = dns.inet.AF_INET + if af == dns.inet.AF_INET: + destination = (where, port) + if source is not None or source_port != 0: + if source is None: + source = '0.0.0.0' + source = (source, source_port) + elif af == dns.inet.AF_INET6: + destination = (where, port, 0, 0) + if source is not None or source_port != 0: + if source is None: + source = '::' + source = (source, source_port, 0, 0) + return (af, destination, source) + + +def udp(q, where, timeout=None, port=53, af=None, source=None, source_port=0, + ignore_unexpected=False, one_rr_per_rrset=False): + """Return the response obtained after sending a query via UDP. + + @param q: the query + @type q: dns.message.Message + @param where: where to send the message + @type where: string containing an IPv4 or IPv6 address + @param timeout: The number of seconds to wait before the query times out. + If None, the default, wait forever. + @type timeout: float + @param port: The port to which to send the message. The default is 53. + @type port: int + @param af: the address family to use. The default is None, which + causes the address family to use to be inferred from the form of where. + If the inference attempt fails, AF_INET is used. + @type af: int + @rtype: dns.message.Message object + @param source: source address. The default is the wildcard address. + @type source: string + @param source_port: The port from which to send the message. + The default is 0. + @type source_port: int + @param ignore_unexpected: If True, ignore responses from unexpected + sources. The default is False. + @type ignore_unexpected: bool + @param one_rr_per_rrset: Put each RR into its own RRset + @type one_rr_per_rrset: bool + """ + + wire = q.to_wire() + (af, destination, source) = _destination_and_source(af, where, port, + source, source_port) + s = socket_factory(af, socket.SOCK_DGRAM, 0) + begin_time = None + try: + expiration = _compute_expiration(timeout) + s.setblocking(0) + if source is not None: + s.bind(source) + _wait_for_writable(s, expiration) + begin_time = time.time() + s.sendto(wire, destination) + while 1: + _wait_for_readable(s, expiration) + (wire, from_address) = s.recvfrom(65535) + if _addresses_equal(af, from_address, destination) or \ + (dns.inet.is_multicast(where) and + from_address[1:] == destination[1:]): + break + if not ignore_unexpected: + raise UnexpectedSource('got a response from ' + '%s instead of %s' % (from_address, + destination)) + finally: + if begin_time is None: + response_time = 0 + else: + response_time = time.time() - begin_time + s.close() + r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac, + one_rr_per_rrset=one_rr_per_rrset) + r.time = response_time + if not q.is_response(r): + raise BadResponse + return r + + +def _net_read(sock, count, expiration): + """Read the specified number of bytes from sock. Keep trying until we + either get the desired amount, or we hit EOF. + A Timeout exception will be raised if the operation is not completed + by the expiration time. + """ + s = b'' + while count > 0: + _wait_for_readable(sock, expiration) + n = sock.recv(count) + if n == b'': + raise EOFError + count = count - len(n) + s = s + n + return s + + +def _net_write(sock, data, expiration): + """Write the specified data to the socket. + A Timeout exception will be raised if the operation is not completed + by the expiration time. + """ + current = 0 + l = len(data) + while current < l: + _wait_for_writable(sock, expiration) + current += sock.send(data[current:]) + + +def _connect(s, address): + try: + s.connect(address) + except socket.error: + (ty, v) = sys.exc_info()[:2] + + if hasattr(v, 'errno'): + v_err = v.errno + else: + v_err = v[0] + if v_err not in [errno.EINPROGRESS, errno.EWOULDBLOCK, errno.EALREADY]: + raise v + + +def tcp(q, where, timeout=None, port=53, af=None, source=None, source_port=0, + one_rr_per_rrset=False): + """Return the response obtained after sending a query via TCP. + + @param q: the query + @type q: dns.message.Message object + @param where: where to send the message + @type where: string containing an IPv4 or IPv6 address + @param timeout: The number of seconds to wait before the query times out. + If None, the default, wait forever. + @type timeout: float + @param port: The port to which to send the message. The default is 53. + @type port: int + @param af: the address family to use. The default is None, which + causes the address family to use to be inferred from the form of where. + If the inference attempt fails, AF_INET is used. + @type af: int + @rtype: dns.message.Message object + @param source: source address. The default is the wildcard address. + @type source: string + @param source_port: The port from which to send the message. + The default is 0. + @type source_port: int + @param one_rr_per_rrset: Put each RR into its own RRset + @type one_rr_per_rrset: bool + """ + + wire = q.to_wire() + (af, destination, source) = _destination_and_source(af, where, port, + source, source_port) + s = socket_factory(af, socket.SOCK_STREAM, 0) + begin_time = None + try: + expiration = _compute_expiration(timeout) + s.setblocking(0) + begin_time = time.time() + if source is not None: + s.bind(source) + _connect(s, destination) + + l = len(wire) + + # copying the wire into tcpmsg is inefficient, but lets us + # avoid writev() or doing a short write that would get pushed + # onto the net + tcpmsg = struct.pack("!H", l) + wire + _net_write(s, tcpmsg, expiration) + ldata = _net_read(s, 2, expiration) + (l,) = struct.unpack("!H", ldata) + wire = _net_read(s, l, expiration) + finally: + if begin_time is None: + response_time = 0 + else: + response_time = time.time() - begin_time + s.close() + r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac, + one_rr_per_rrset=one_rr_per_rrset) + r.time = response_time + if not q.is_response(r): + raise BadResponse + return r + + +def xfr(where, zone, rdtype=dns.rdatatype.AXFR, rdclass=dns.rdataclass.IN, + timeout=None, port=53, keyring=None, keyname=None, relativize=True, + af=None, lifetime=None, source=None, source_port=0, serial=0, + use_udp=False, keyalgorithm=dns.tsig.default_algorithm): + """Return a generator for the responses to a zone transfer. + + @param where: where to send the message + @type where: string containing an IPv4 or IPv6 address + @param zone: The name of the zone to transfer + @type zone: dns.name.Name object or string + @param rdtype: The type of zone transfer. The default is + dns.rdatatype.AXFR. + @type rdtype: int or string + @param rdclass: The class of the zone transfer. The default is + dns.rdataclass.IN. + @type rdclass: int or string + @param timeout: The number of seconds to wait for each response message. + If None, the default, wait forever. + @type timeout: float + @param port: The port to which to send the message. The default is 53. + @type port: int + @param keyring: The TSIG keyring to use + @type keyring: dict + @param keyname: The name of the TSIG key to use + @type keyname: dns.name.Name object or string + @param relativize: If True, all names in the zone will be relativized to + the zone origin. It is essential that the relativize setting matches + the one specified to dns.zone.from_xfr(). + @type relativize: bool + @param af: the address family to use. The default is None, which + causes the address family to use to be inferred from the form of where. + If the inference attempt fails, AF_INET is used. + @type af: int + @param lifetime: The total number of seconds to spend doing the transfer. + If None, the default, then there is no limit on the time the transfer may + take. + @type lifetime: float + @rtype: generator of dns.message.Message objects. + @param source: source address. The default is the wildcard address. + @type source: string + @param source_port: The port from which to send the message. + The default is 0. + @type source_port: int + @param serial: The SOA serial number to use as the base for an IXFR diff + sequence (only meaningful if rdtype == dns.rdatatype.IXFR). + @type serial: int + @param use_udp: Use UDP (only meaningful for IXFR) + @type use_udp: bool + @param keyalgorithm: The TSIG algorithm to use; defaults to + dns.tsig.default_algorithm + @type keyalgorithm: string + """ + + if isinstance(zone, string_types): + zone = dns.name.from_text(zone) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + q = dns.message.make_query(zone, rdtype, rdclass) + if rdtype == dns.rdatatype.IXFR: + rrset = dns.rrset.from_text(zone, 0, 'IN', 'SOA', + '. . %u 0 0 0 0' % serial) + q.authority.append(rrset) + if keyring is not None: + q.use_tsig(keyring, keyname, algorithm=keyalgorithm) + wire = q.to_wire() + (af, destination, source) = _destination_and_source(af, where, port, + source, source_port) + if use_udp: + if rdtype != dns.rdatatype.IXFR: + raise ValueError('cannot do a UDP AXFR') + s = socket_factory(af, socket.SOCK_DGRAM, 0) + else: + s = socket_factory(af, socket.SOCK_STREAM, 0) + s.setblocking(0) + if source is not None: + s.bind(source) + expiration = _compute_expiration(lifetime) + _connect(s, destination) + l = len(wire) + if use_udp: + _wait_for_writable(s, expiration) + s.send(wire) + else: + tcpmsg = struct.pack("!H", l) + wire + _net_write(s, tcpmsg, expiration) + done = False + delete_mode = True + expecting_SOA = False + soa_rrset = None + if relativize: + origin = zone + oname = dns.name.empty + else: + origin = None + oname = zone + tsig_ctx = None + first = True + while not done: + mexpiration = _compute_expiration(timeout) + if mexpiration is None or mexpiration > expiration: + mexpiration = expiration + if use_udp: + _wait_for_readable(s, expiration) + (wire, from_address) = s.recvfrom(65535) + else: + ldata = _net_read(s, 2, mexpiration) + (l,) = struct.unpack("!H", ldata) + wire = _net_read(s, l, mexpiration) + is_ixfr = (rdtype == dns.rdatatype.IXFR) + r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac, + xfr=True, origin=origin, tsig_ctx=tsig_ctx, + multi=True, first=first, + one_rr_per_rrset=is_ixfr) + tsig_ctx = r.tsig_ctx + first = False + answer_index = 0 + if soa_rrset is None: + if not r.answer or r.answer[0].name != oname: + raise dns.exception.FormError( + "No answer or RRset not for qname") + rrset = r.answer[0] + if rrset.rdtype != dns.rdatatype.SOA: + raise dns.exception.FormError("first RRset is not an SOA") + answer_index = 1 + soa_rrset = rrset.copy() + if rdtype == dns.rdatatype.IXFR: + if soa_rrset[0].serial <= serial: + # + # We're already up-to-date. + # + done = True + else: + expecting_SOA = True + # + # Process SOAs in the answer section (other than the initial + # SOA in the first message). + # + for rrset in r.answer[answer_index:]: + if done: + raise dns.exception.FormError("answers after final SOA") + if rrset.rdtype == dns.rdatatype.SOA and rrset.name == oname: + if expecting_SOA: + if rrset[0].serial != serial: + raise dns.exception.FormError( + "IXFR base serial mismatch") + expecting_SOA = False + elif rdtype == dns.rdatatype.IXFR: + delete_mode = not delete_mode + # + # If this SOA RRset is equal to the first we saw then we're + # finished. If this is an IXFR we also check that we're seeing + # the record in the expected part of the response. + # + if rrset == soa_rrset and \ + (rdtype == dns.rdatatype.AXFR or + (rdtype == dns.rdatatype.IXFR and delete_mode)): + done = True + elif expecting_SOA: + # + # We made an IXFR request and are expecting another + # SOA RR, but saw something else, so this must be an + # AXFR response. + # + rdtype = dns.rdatatype.AXFR + expecting_SOA = False + if done and q.keyring and not r.had_tsig: + raise dns.exception.FormError("missing TSIG") + yield r + s.close() diff --git a/Contents/Libraries/Shared/dns/rcode.py b/Contents/Libraries/Shared/dns/rcode.py new file mode 100644 index 000000000..314815f7c --- /dev/null +++ b/Contents/Libraries/Shared/dns/rcode.py @@ -0,0 +1,125 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Result Codes.""" + +import dns.exception +from ._compat import long + + +NOERROR = 0 +FORMERR = 1 +SERVFAIL = 2 +NXDOMAIN = 3 +NOTIMP = 4 +REFUSED = 5 +YXDOMAIN = 6 +YXRRSET = 7 +NXRRSET = 8 +NOTAUTH = 9 +NOTZONE = 10 +BADVERS = 16 + +_by_text = { + 'NOERROR': NOERROR, + 'FORMERR': FORMERR, + 'SERVFAIL': SERVFAIL, + 'NXDOMAIN': NXDOMAIN, + 'NOTIMP': NOTIMP, + 'REFUSED': REFUSED, + 'YXDOMAIN': YXDOMAIN, + 'YXRRSET': YXRRSET, + 'NXRRSET': NXRRSET, + 'NOTAUTH': NOTAUTH, + 'NOTZONE': NOTZONE, + 'BADVERS': BADVERS +} + +# We construct the inverse mapping programmatically to ensure that we +# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that +# would cause the mapping not to be a true inverse. + +_by_value = dict((y, x) for x, y in _by_text.items()) + + +class UnknownRcode(dns.exception.DNSException): + + """A DNS rcode is unknown.""" + + +def from_text(text): + """Convert text into an rcode. + + @param text: the textual rcode + @type text: string + @raises UnknownRcode: the rcode is unknown + @rtype: int + """ + + if text.isdigit(): + v = int(text) + if v >= 0 and v <= 4095: + return v + v = _by_text.get(text.upper()) + if v is None: + raise UnknownRcode + return v + + +def from_flags(flags, ednsflags): + """Return the rcode value encoded by flags and ednsflags. + + @param flags: the DNS flags + @type flags: int + @param ednsflags: the EDNS flags + @type ednsflags: int + @raises ValueError: rcode is < 0 or > 4095 + @rtype: int + """ + + value = (flags & 0x000f) | ((ednsflags >> 20) & 0xff0) + if value < 0 or value > 4095: + raise ValueError('rcode must be >= 0 and <= 4095') + return value + + +def to_flags(value): + """Return a (flags, ednsflags) tuple which encodes the rcode. + + @param value: the rcode + @type value: int + @raises ValueError: rcode is < 0 or > 4095 + @rtype: (int, int) tuple + """ + + if value < 0 or value > 4095: + raise ValueError('rcode must be >= 0 and <= 4095') + v = value & 0xf + ev = long(value & 0xff0) << 20 + return (v, ev) + + +def to_text(value): + """Convert rcode into text. + + @param value: the rcode + @type value: int + @rtype: string + """ + + text = _by_value.get(value) + if text is None: + text = str(value) + return text diff --git a/Contents/Libraries/Shared/dns/rdata.py b/Contents/Libraries/Shared/dns/rdata.py new file mode 100644 index 000000000..9e9344d5c --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdata.py @@ -0,0 +1,458 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS rdata. + +@var _rdata_modules: A dictionary mapping a (rdclass, rdtype) tuple to +the module which implements that type. +@type _rdata_modules: dict +@var _module_prefix: The prefix to use when forming modules names. The +default is 'dns.rdtypes'. Changing this value will break the library. +@type _module_prefix: string +@var _hex_chunk: At most this many octets that will be represented in each +chunk of hexstring that _hexify() produces before whitespace occurs. +@type _hex_chunk: int""" + +from io import BytesIO +import base64 +import binascii + +import dns.exception +import dns.name +import dns.rdataclass +import dns.rdatatype +import dns.tokenizer +import dns.wiredata +from ._compat import xrange, string_types, text_type + +_hex_chunksize = 32 + + +def _hexify(data, chunksize=_hex_chunksize): + """Convert a binary string into its hex encoding, broken up into chunks + of I{chunksize} characters separated by a space. + + @param data: the binary string + @type data: string + @param chunksize: the chunk size. Default is L{dns.rdata._hex_chunksize} + @rtype: string + """ + + line = binascii.hexlify(data) + return b' '.join([line[i:i + chunksize] + for i + in range(0, len(line), chunksize)]).decode() + +_base64_chunksize = 32 + + +def _base64ify(data, chunksize=_base64_chunksize): + """Convert a binary string into its base64 encoding, broken up into chunks + of I{chunksize} characters separated by a space. + + @param data: the binary string + @type data: string + @param chunksize: the chunk size. Default is + L{dns.rdata._base64_chunksize} + @rtype: string + """ + + line = base64.b64encode(data) + return b' '.join([line[i:i + chunksize] + for i + in range(0, len(line), chunksize)]).decode() + +__escaped = bytearray(b'"\\') + +def _escapify(qstring): + """Escape the characters in a quoted string which need it. + + @param qstring: the string + @type qstring: string + @returns: the escaped string + @rtype: string + """ + + if isinstance(qstring, text_type): + qstring = qstring.encode() + if not isinstance(qstring, bytearray): + qstring = bytearray(qstring) + + text = '' + for c in qstring: + if c in __escaped: + text += '\\' + chr(c) + elif c >= 0x20 and c < 0x7F: + text += chr(c) + else: + text += '\\%03d' % c + return text + + +def _truncate_bitmap(what): + """Determine the index of greatest byte that isn't all zeros, and + return the bitmap that contains all the bytes less than that index. + + @param what: a string of octets representing a bitmap. + @type what: string + @rtype: string + """ + + for i in xrange(len(what) - 1, -1, -1): + if what[i] != 0: + return what[0: i + 1] + return what[0:1] + + +class Rdata(object): + + """Base class for all DNS rdata types. + """ + + __slots__ = ['rdclass', 'rdtype'] + + def __init__(self, rdclass, rdtype): + """Initialize an rdata. + @param rdclass: The rdata class + @type rdclass: int + @param rdtype: The rdata type + @type rdtype: int + """ + + self.rdclass = rdclass + self.rdtype = rdtype + + def covers(self): + """DNS SIG/RRSIG rdatas apply to a specific type; this type is + returned by the covers() function. If the rdata type is not + SIG or RRSIG, dns.rdatatype.NONE is returned. This is useful when + creating rdatasets, allowing the rdataset to contain only RRSIGs + of a particular type, e.g. RRSIG(NS). + @rtype: int + """ + + return dns.rdatatype.NONE + + def extended_rdatatype(self): + """Return a 32-bit type value, the least significant 16 bits of + which are the ordinary DNS type, and the upper 16 bits of which are + the "covered" type, if any. + @rtype: int + """ + + return self.covers() << 16 | self.rdtype + + def to_text(self, origin=None, relativize=True, **kw): + """Convert an rdata to text format. + @rtype: string + """ + raise NotImplementedError + + def to_wire(self, file, compress=None, origin=None): + """Convert an rdata to wire format. + @rtype: string + """ + + raise NotImplementedError + + def to_digestable(self, origin=None): + """Convert rdata to a format suitable for digesting in hashes. This + is also the DNSSEC canonical form.""" + f = BytesIO() + self.to_wire(f, None, origin) + return f.getvalue() + + def validate(self): + """Check that the current contents of the rdata's fields are + valid. If you change an rdata by assigning to its fields, + it is a good idea to call validate() when you are done making + changes. + """ + dns.rdata.from_text(self.rdclass, self.rdtype, self.to_text()) + + def __repr__(self): + covers = self.covers() + if covers == dns.rdatatype.NONE: + ctext = '' + else: + ctext = '(' + dns.rdatatype.to_text(covers) + ')' + return '' + + def __str__(self): + return self.to_text() + + def _cmp(self, other): + """Compare an rdata with another rdata of the same rdtype and + rdclass. Return < 0 if self < other in the DNSSEC ordering, + 0 if self == other, and > 0 if self > other. + """ + our = self.to_digestable(dns.name.root) + their = other.to_digestable(dns.name.root) + if our == their: + return 0 + if our > their: + return 1 + + return -1 + + def __eq__(self, other): + if not isinstance(other, Rdata): + return False + if self.rdclass != other.rdclass or self.rdtype != other.rdtype: + return False + return self._cmp(other) == 0 + + def __ne__(self, other): + if not isinstance(other, Rdata): + return True + if self.rdclass != other.rdclass or self.rdtype != other.rdtype: + return True + return self._cmp(other) != 0 + + def __lt__(self, other): + if not isinstance(other, Rdata) or \ + self.rdclass != other.rdclass or self.rdtype != other.rdtype: + + return NotImplemented + return self._cmp(other) < 0 + + def __le__(self, other): + if not isinstance(other, Rdata) or \ + self.rdclass != other.rdclass or self.rdtype != other.rdtype: + return NotImplemented + return self._cmp(other) <= 0 + + def __ge__(self, other): + if not isinstance(other, Rdata) or \ + self.rdclass != other.rdclass or self.rdtype != other.rdtype: + return NotImplemented + return self._cmp(other) >= 0 + + def __gt__(self, other): + if not isinstance(other, Rdata) or \ + self.rdclass != other.rdclass or self.rdtype != other.rdtype: + return NotImplemented + return self._cmp(other) > 0 + + def __hash__(self): + return hash(self.to_digestable(dns.name.root)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + """Build an rdata object from text format. + + @param rdclass: The rdata class + @type rdclass: int + @param rdtype: The rdata type + @type rdtype: int + @param tok: The tokenizer + @type tok: dns.tokenizer.Tokenizer + @param origin: The origin to use for relative names + @type origin: dns.name.Name + @param relativize: should names be relativized? + @type relativize: bool + @rtype: dns.rdata.Rdata instance + """ + + raise NotImplementedError + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + """Build an rdata object from wire format + + @param rdclass: The rdata class + @type rdclass: int + @param rdtype: The rdata type + @type rdtype: int + @param wire: The wire-format message + @type wire: string + @param current: The offset in wire of the beginning of the rdata. + @type current: int + @param rdlen: The length of the wire-format rdata + @type rdlen: int + @param origin: The origin to use for relative names + @type origin: dns.name.Name + @rtype: dns.rdata.Rdata instance + """ + + raise NotImplementedError + + def choose_relativity(self, origin=None, relativize=True): + """Convert any domain names in the rdata to the specified + relativization. + """ + + pass + + +class GenericRdata(Rdata): + + """Generate Rdata Class + + This class is used for rdata types for which we have no better + implementation. It implements the DNS "unknown RRs" scheme. + """ + + __slots__ = ['data'] + + def __init__(self, rdclass, rdtype, data): + super(GenericRdata, self).__init__(rdclass, rdtype) + self.data = data + + def to_text(self, origin=None, relativize=True, **kw): + return r'\# %d ' % len(self.data) + _hexify(self.data) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + token = tok.get() + if not token.is_identifier() or token.value != '\#': + raise dns.exception.SyntaxError( + r'generic rdata does not start with \#') + length = tok.get_int() + chunks = [] + while 1: + token = tok.get() + if token.is_eol_or_eof(): + break + chunks.append(token.value.encode()) + hex = b''.join(chunks) + data = binascii.unhexlify(hex) + if len(data) != length: + raise dns.exception.SyntaxError( + 'generic rdata hex data has wrong length') + return cls(rdclass, rdtype, data) + + def to_wire(self, file, compress=None, origin=None): + file.write(self.data) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + return cls(rdclass, rdtype, wire[current: current + rdlen]) + +_rdata_modules = {} +_module_prefix = 'dns.rdtypes' + + +def get_rdata_class(rdclass, rdtype): + + def import_module(name): + mod = __import__(name) + components = name.split('.') + for comp in components[1:]: + mod = getattr(mod, comp) + return mod + + mod = _rdata_modules.get((rdclass, rdtype)) + rdclass_text = dns.rdataclass.to_text(rdclass) + rdtype_text = dns.rdatatype.to_text(rdtype) + rdtype_text = rdtype_text.replace('-', '_') + if not mod: + mod = _rdata_modules.get((dns.rdatatype.ANY, rdtype)) + if not mod: + try: + mod = import_module('.'.join([_module_prefix, + rdclass_text, rdtype_text])) + _rdata_modules[(rdclass, rdtype)] = mod + except ImportError: + try: + mod = import_module('.'.join([_module_prefix, + 'ANY', rdtype_text])) + _rdata_modules[(dns.rdataclass.ANY, rdtype)] = mod + except ImportError: + mod = None + if mod: + cls = getattr(mod, rdtype_text) + else: + cls = GenericRdata + return cls + + +def from_text(rdclass, rdtype, tok, origin=None, relativize=True): + """Build an rdata object from text format. + + This function attempts to dynamically load a class which + implements the specified rdata class and type. If there is no + class-and-type-specific implementation, the GenericRdata class + is used. + + Once a class is chosen, its from_text() class method is called + with the parameters to this function. + + If I{tok} is a string, then a tokenizer is created and the string + is used as its input. + + @param rdclass: The rdata class + @type rdclass: int + @param rdtype: The rdata type + @type rdtype: int + @param tok: The tokenizer or input text + @type tok: dns.tokenizer.Tokenizer or string + @param origin: The origin to use for relative names + @type origin: dns.name.Name + @param relativize: Should names be relativized? + @type relativize: bool + @rtype: dns.rdata.Rdata instance""" + + if isinstance(tok, string_types): + tok = dns.tokenizer.Tokenizer(tok) + cls = get_rdata_class(rdclass, rdtype) + if cls != GenericRdata: + # peek at first token + token = tok.get() + tok.unget(token) + if token.is_identifier() and \ + token.value == r'\#': + # + # Known type using the generic syntax. Extract the + # wire form from the generic syntax, and then run + # from_wire on it. + # + rdata = GenericRdata.from_text(rdclass, rdtype, tok, origin, + relativize) + return from_wire(rdclass, rdtype, rdata.data, 0, len(rdata.data), + origin) + return cls.from_text(rdclass, rdtype, tok, origin, relativize) + + +def from_wire(rdclass, rdtype, wire, current, rdlen, origin=None): + """Build an rdata object from wire format + + This function attempts to dynamically load a class which + implements the specified rdata class and type. If there is no + class-and-type-specific implementation, the GenericRdata class + is used. + + Once a class is chosen, its from_wire() class method is called + with the parameters to this function. + + @param rdclass: The rdata class + @type rdclass: int + @param rdtype: The rdata type + @type rdtype: int + @param wire: The wire-format message + @type wire: string + @param current: The offset in wire of the beginning of the rdata. + @type current: int + @param rdlen: The length of the wire-format rdata + @type rdlen: int + @param origin: The origin to use for relative names + @type origin: dns.name.Name + @rtype: dns.rdata.Rdata instance""" + + wire = dns.wiredata.maybe_wrap(wire) + cls = get_rdata_class(rdclass, rdtype) + return cls.from_wire(rdclass, rdtype, wire, current, rdlen, origin) diff --git a/Contents/Libraries/Shared/dns/rdataclass.py b/Contents/Libraries/Shared/dns/rdataclass.py new file mode 100644 index 000000000..17a4810d5 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdataclass.py @@ -0,0 +1,118 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Rdata Classes. + +@var _by_text: The rdata class textual name to value mapping +@type _by_text: dict +@var _by_value: The rdata class value to textual name mapping +@type _by_value: dict +@var _metaclasses: If an rdataclass is a metaclass, there will be a mapping +whose key is the rdatatype value and whose value is True in this dictionary. +@type _metaclasses: dict""" + +import re + +import dns.exception + +RESERVED0 = 0 +IN = 1 +CH = 3 +HS = 4 +NONE = 254 +ANY = 255 + +_by_text = { + 'RESERVED0': RESERVED0, + 'IN': IN, + 'CH': CH, + 'HS': HS, + 'NONE': NONE, + 'ANY': ANY +} + +# We construct the inverse mapping programmatically to ensure that we +# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that +# would cause the mapping not to be true inverse. + +_by_value = dict((y, x) for x, y in _by_text.items()) + +# Now that we've built the inverse map, we can add class aliases to +# the _by_text mapping. + +_by_text.update({ + 'INTERNET': IN, + 'CHAOS': CH, + 'HESIOD': HS +}) + +_metaclasses = { + NONE: True, + ANY: True +} + +_unknown_class_pattern = re.compile('CLASS([0-9]+)$', re.I) + + +class UnknownRdataclass(dns.exception.DNSException): + + """A DNS class is unknown.""" + + +def from_text(text): + """Convert text into a DNS rdata class value. + @param text: the text + @type text: string + @rtype: int + @raises dns.rdataclass.UnknownRdataclass: the class is unknown + @raises ValueError: the rdata class value is not >= 0 and <= 65535 + """ + + value = _by_text.get(text.upper()) + if value is None: + match = _unknown_class_pattern.match(text) + if match is None: + raise UnknownRdataclass + value = int(match.group(1)) + if value < 0 or value > 65535: + raise ValueError("class must be between >= 0 and <= 65535") + return value + + +def to_text(value): + """Convert a DNS rdata class to text. + @param value: the rdata class value + @type value: int + @rtype: string + @raises ValueError: the rdata class value is not >= 0 and <= 65535 + """ + + if value < 0 or value > 65535: + raise ValueError("class must be between >= 0 and <= 65535") + text = _by_value.get(value) + if text is None: + text = 'CLASS' + repr(value) + return text + + +def is_metaclass(rdclass): + """True if the class is a metaclass. + @param rdclass: the rdata class + @type rdclass: int + @rtype: bool""" + + if rdclass in _metaclasses: + return True + return False diff --git a/Contents/Libraries/Shared/dns/rdataset.py b/Contents/Libraries/Shared/dns/rdataset.py new file mode 100644 index 000000000..db266f2f0 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdataset.py @@ -0,0 +1,338 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS rdatasets (an rdataset is a set of rdatas of a given type and class)""" + +import random +from io import StringIO +import struct + +import dns.exception +import dns.rdatatype +import dns.rdataclass +import dns.rdata +import dns.set +from ._compat import string_types + +# define SimpleSet here for backwards compatibility +SimpleSet = dns.set.Set + + +class DifferingCovers(dns.exception.DNSException): + + """An attempt was made to add a DNS SIG/RRSIG whose covered type + is not the same as that of the other rdatas in the rdataset.""" + + +class IncompatibleTypes(dns.exception.DNSException): + + """An attempt was made to add DNS RR data of an incompatible type.""" + + +class Rdataset(dns.set.Set): + + """A DNS rdataset. + + @ivar rdclass: The class of the rdataset + @type rdclass: int + @ivar rdtype: The type of the rdataset + @type rdtype: int + @ivar covers: The covered type. Usually this value is + dns.rdatatype.NONE, but if the rdtype is dns.rdatatype.SIG or + dns.rdatatype.RRSIG, then the covers value will be the rdata + type the SIG/RRSIG covers. The library treats the SIG and RRSIG + types as if they were a family of + types, e.g. RRSIG(A), RRSIG(NS), RRSIG(SOA). This makes RRSIGs much + easier to work with than if RRSIGs covering different rdata + types were aggregated into a single RRSIG rdataset. + @type covers: int + @ivar ttl: The DNS TTL (Time To Live) value + @type ttl: int + """ + + __slots__ = ['rdclass', 'rdtype', 'covers', 'ttl'] + + def __init__(self, rdclass, rdtype, covers=dns.rdatatype.NONE): + """Create a new rdataset of the specified class and type. + + @see: the description of the class instance variables for the + meaning of I{rdclass} and I{rdtype}""" + + super(Rdataset, self).__init__() + self.rdclass = rdclass + self.rdtype = rdtype + self.covers = covers + self.ttl = 0 + + def _clone(self): + obj = super(Rdataset, self)._clone() + obj.rdclass = self.rdclass + obj.rdtype = self.rdtype + obj.covers = self.covers + obj.ttl = self.ttl + return obj + + def update_ttl(self, ttl): + """Set the TTL of the rdataset to be the lesser of the set's current + TTL or the specified TTL. If the set contains no rdatas, set the TTL + to the specified TTL. + @param ttl: The TTL + @type ttl: int""" + + if len(self) == 0: + self.ttl = ttl + elif ttl < self.ttl: + self.ttl = ttl + + def add(self, rd, ttl=None): + """Add the specified rdata to the rdataset. + + If the optional I{ttl} parameter is supplied, then + self.update_ttl(ttl) will be called prior to adding the rdata. + + @param rd: The rdata + @type rd: dns.rdata.Rdata object + @param ttl: The TTL + @type ttl: int""" + + # + # If we're adding a signature, do some special handling to + # check that the signature covers the same type as the + # other rdatas in this rdataset. If this is the first rdata + # in the set, initialize the covers field. + # + if self.rdclass != rd.rdclass or self.rdtype != rd.rdtype: + raise IncompatibleTypes + if ttl is not None: + self.update_ttl(ttl) + if self.rdtype == dns.rdatatype.RRSIG or \ + self.rdtype == dns.rdatatype.SIG: + covers = rd.covers() + if len(self) == 0 and self.covers == dns.rdatatype.NONE: + self.covers = covers + elif self.covers != covers: + raise DifferingCovers + if dns.rdatatype.is_singleton(rd.rdtype) and len(self) > 0: + self.clear() + super(Rdataset, self).add(rd) + + def union_update(self, other): + self.update_ttl(other.ttl) + super(Rdataset, self).union_update(other) + + def intersection_update(self, other): + self.update_ttl(other.ttl) + super(Rdataset, self).intersection_update(other) + + def update(self, other): + """Add all rdatas in other to self. + + @param other: The rdataset from which to update + @type other: dns.rdataset.Rdataset object""" + + self.update_ttl(other.ttl) + super(Rdataset, self).update(other) + + def __repr__(self): + if self.covers == 0: + ctext = '' + else: + ctext = '(' + dns.rdatatype.to_text(self.covers) + ')' + return '' + + def __str__(self): + return self.to_text() + + def __eq__(self, other): + """Two rdatasets are equal if they have the same class, type, and + covers, and contain the same rdata. + @rtype: bool""" + + if not isinstance(other, Rdataset): + return False + if self.rdclass != other.rdclass or \ + self.rdtype != other.rdtype or \ + self.covers != other.covers: + return False + return super(Rdataset, self).__eq__(other) + + def __ne__(self, other): + return not self.__eq__(other) + + def to_text(self, name=None, origin=None, relativize=True, + override_rdclass=None, **kw): + """Convert the rdataset into DNS master file format. + + @see: L{dns.name.Name.choose_relativity} for more information + on how I{origin} and I{relativize} determine the way names + are emitted. + + Any additional keyword arguments are passed on to the rdata + to_text() method. + + @param name: If name is not None, emit a RRs with I{name} as + the owner name. + @type name: dns.name.Name object + @param origin: The origin for relative names, or None. + @type origin: dns.name.Name object + @param relativize: True if names should names be relativized + @type relativize: bool""" + if name is not None: + name = name.choose_relativity(origin, relativize) + ntext = str(name) + pad = ' ' + else: + ntext = '' + pad = '' + s = StringIO() + if override_rdclass is not None: + rdclass = override_rdclass + else: + rdclass = self.rdclass + if len(self) == 0: + # + # Empty rdatasets are used for the question section, and in + # some dynamic updates, so we don't need to print out the TTL + # (which is meaningless anyway). + # + s.write(u'%s%s%s %s\n' % (ntext, pad, + dns.rdataclass.to_text(rdclass), + dns.rdatatype.to_text(self.rdtype))) + else: + for rd in self: + s.write(u'%s%s%d %s %s %s\n' % + (ntext, pad, self.ttl, dns.rdataclass.to_text(rdclass), + dns.rdatatype.to_text(self.rdtype), + rd.to_text(origin=origin, relativize=relativize, + **kw))) + # + # We strip off the final \n for the caller's convenience in printing + # + return s.getvalue()[:-1] + + def to_wire(self, name, file, compress=None, origin=None, + override_rdclass=None, want_shuffle=True): + """Convert the rdataset to wire format. + + @param name: The owner name of the RRset that will be emitted + @type name: dns.name.Name object + @param file: The file to which the wire format data will be appended + @type file: file + @param compress: The compression table to use; the default is None. + @type compress: dict + @param origin: The origin to be appended to any relative names when + they are emitted. The default is None. + @returns: the number of records emitted + @rtype: int + """ + + if override_rdclass is not None: + rdclass = override_rdclass + want_shuffle = False + else: + rdclass = self.rdclass + file.seek(0, 2) + if len(self) == 0: + name.to_wire(file, compress, origin) + stuff = struct.pack("!HHIH", self.rdtype, rdclass, 0, 0) + file.write(stuff) + return 1 + else: + if want_shuffle: + l = list(self) + random.shuffle(l) + else: + l = self + for rd in l: + name.to_wire(file, compress, origin) + stuff = struct.pack("!HHIH", self.rdtype, rdclass, + self.ttl, 0) + file.write(stuff) + start = file.tell() + rd.to_wire(file, compress, origin) + end = file.tell() + assert end - start < 65536 + file.seek(start - 2) + stuff = struct.pack("!H", end - start) + file.write(stuff) + file.seek(0, 2) + return len(self) + + def match(self, rdclass, rdtype, covers): + """Returns True if this rdataset matches the specified class, type, + and covers""" + if self.rdclass == rdclass and \ + self.rdtype == rdtype and \ + self.covers == covers: + return True + return False + + +def from_text_list(rdclass, rdtype, ttl, text_rdatas): + """Create an rdataset with the specified class, type, and TTL, and with + the specified list of rdatas in text format. + + @rtype: dns.rdataset.Rdataset object + """ + + if isinstance(rdclass, string_types): + rdclass = dns.rdataclass.from_text(rdclass) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + r = Rdataset(rdclass, rdtype) + r.update_ttl(ttl) + for t in text_rdatas: + rd = dns.rdata.from_text(r.rdclass, r.rdtype, t) + r.add(rd) + return r + + +def from_text(rdclass, rdtype, ttl, *text_rdatas): + """Create an rdataset with the specified class, type, and TTL, and with + the specified rdatas in text format. + + @rtype: dns.rdataset.Rdataset object + """ + + return from_text_list(rdclass, rdtype, ttl, text_rdatas) + + +def from_rdata_list(ttl, rdatas): + """Create an rdataset with the specified TTL, and with + the specified list of rdata objects. + + @rtype: dns.rdataset.Rdataset object + """ + + if len(rdatas) == 0: + raise ValueError("rdata list must not be empty") + r = None + for rd in rdatas: + if r is None: + r = Rdataset(rd.rdclass, rd.rdtype) + r.update_ttl(ttl) + r.add(rd) + return r + + +def from_rdata(ttl, *rdatas): + """Create an rdataset with the specified TTL, and with + the specified rdata objects. + + @rtype: dns.rdataset.Rdataset object + """ + + return from_rdata_list(ttl, rdatas) diff --git a/Contents/Libraries/Shared/dns/rdatatype.py b/Contents/Libraries/Shared/dns/rdatatype.py new file mode 100644 index 000000000..15284f64d --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdatatype.py @@ -0,0 +1,255 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Rdata Types. + +@var _by_text: The rdata type textual name to value mapping +@type _by_text: dict +@var _by_value: The rdata type value to textual name mapping +@type _by_value: dict +@var _metatypes: If an rdatatype is a metatype, there will be a mapping +whose key is the rdatatype value and whose value is True in this dictionary. +@type _metatypes: dict +@var _singletons: If an rdatatype is a singleton, there will be a mapping +whose key is the rdatatype value and whose value is True in this dictionary. +@type _singletons: dict""" + +import re + +import dns.exception + +NONE = 0 +A = 1 +NS = 2 +MD = 3 +MF = 4 +CNAME = 5 +SOA = 6 +MB = 7 +MG = 8 +MR = 9 +NULL = 10 +WKS = 11 +PTR = 12 +HINFO = 13 +MINFO = 14 +MX = 15 +TXT = 16 +RP = 17 +AFSDB = 18 +X25 = 19 +ISDN = 20 +RT = 21 +NSAP = 22 +NSAP_PTR = 23 +SIG = 24 +KEY = 25 +PX = 26 +GPOS = 27 +AAAA = 28 +LOC = 29 +NXT = 30 +SRV = 33 +NAPTR = 35 +KX = 36 +CERT = 37 +A6 = 38 +DNAME = 39 +OPT = 41 +APL = 42 +DS = 43 +SSHFP = 44 +IPSECKEY = 45 +RRSIG = 46 +NSEC = 47 +DNSKEY = 48 +DHCID = 49 +NSEC3 = 50 +NSEC3PARAM = 51 +TLSA = 52 +HIP = 55 +CDS = 59 +CDNSKEY = 60 +CSYNC = 62 +SPF = 99 +UNSPEC = 103 +EUI48 = 108 +EUI64 = 109 +TKEY = 249 +TSIG = 250 +IXFR = 251 +AXFR = 252 +MAILB = 253 +MAILA = 254 +ANY = 255 +URI = 256 +CAA = 257 +AVC = 258 +TA = 32768 +DLV = 32769 + +_by_text = { + 'NONE': NONE, + 'A': A, + 'NS': NS, + 'MD': MD, + 'MF': MF, + 'CNAME': CNAME, + 'SOA': SOA, + 'MB': MB, + 'MG': MG, + 'MR': MR, + 'NULL': NULL, + 'WKS': WKS, + 'PTR': PTR, + 'HINFO': HINFO, + 'MINFO': MINFO, + 'MX': MX, + 'TXT': TXT, + 'RP': RP, + 'AFSDB': AFSDB, + 'X25': X25, + 'ISDN': ISDN, + 'RT': RT, + 'NSAP': NSAP, + 'NSAP-PTR': NSAP_PTR, + 'SIG': SIG, + 'KEY': KEY, + 'PX': PX, + 'GPOS': GPOS, + 'AAAA': AAAA, + 'LOC': LOC, + 'NXT': NXT, + 'SRV': SRV, + 'NAPTR': NAPTR, + 'KX': KX, + 'CERT': CERT, + 'A6': A6, + 'DNAME': DNAME, + 'OPT': OPT, + 'APL': APL, + 'DS': DS, + 'SSHFP': SSHFP, + 'IPSECKEY': IPSECKEY, + 'RRSIG': RRSIG, + 'NSEC': NSEC, + 'DNSKEY': DNSKEY, + 'DHCID': DHCID, + 'NSEC3': NSEC3, + 'NSEC3PARAM': NSEC3PARAM, + 'TLSA': TLSA, + 'HIP': HIP, + 'CDS': CDS, + 'CDNSKEY': CDNSKEY, + 'CSYNC': CSYNC, + 'SPF': SPF, + 'UNSPEC': UNSPEC, + 'EUI48': EUI48, + 'EUI64': EUI64, + 'TKEY': TKEY, + 'TSIG': TSIG, + 'IXFR': IXFR, + 'AXFR': AXFR, + 'MAILB': MAILB, + 'MAILA': MAILA, + 'ANY': ANY, + 'URI': URI, + 'CAA': CAA, + 'AVC': AVC, + 'TA': TA, + 'DLV': DLV, +} + +# We construct the inverse mapping programmatically to ensure that we +# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that +# would cause the mapping not to be true inverse. + +_by_value = dict((y, x) for x, y in _by_text.items()) + + +_metatypes = { + OPT: True +} + +_singletons = { + SOA: True, + NXT: True, + DNAME: True, + NSEC: True, + # CNAME is technically a singleton, but we allow multiple CNAMEs. +} + +_unknown_type_pattern = re.compile('TYPE([0-9]+)$', re.I) + + +class UnknownRdatatype(dns.exception.DNSException): + + """DNS resource record type is unknown.""" + + +def from_text(text): + """Convert text into a DNS rdata type value. + @param text: the text + @type text: string + @raises dns.rdatatype.UnknownRdatatype: the type is unknown + @raises ValueError: the rdata type value is not >= 0 and <= 65535 + @rtype: int""" + + value = _by_text.get(text.upper()) + if value is None: + match = _unknown_type_pattern.match(text) + if match is None: + raise UnknownRdatatype + value = int(match.group(1)) + if value < 0 or value > 65535: + raise ValueError("type must be between >= 0 and <= 65535") + return value + + +def to_text(value): + """Convert a DNS rdata type to text. + @param value: the rdata type value + @type value: int + @raises ValueError: the rdata type value is not >= 0 and <= 65535 + @rtype: string""" + + if value < 0 or value > 65535: + raise ValueError("type must be between >= 0 and <= 65535") + text = _by_value.get(value) + if text is None: + text = 'TYPE' + repr(value) + return text + + +def is_metatype(rdtype): + """True if the type is a metatype. + @param rdtype: the type + @type rdtype: int + @rtype: bool""" + + if rdtype >= TKEY and rdtype <= ANY or rdtype in _metatypes: + return True + return False + + +def is_singleton(rdtype): + """True if the type is a singleton. + @param rdtype: the type + @type rdtype: int + @rtype: bool""" + + if rdtype in _singletons: + return True + return False diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/AFSDB.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/AFSDB.py new file mode 100644 index 000000000..f3d515403 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/AFSDB.py @@ -0,0 +1,53 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.mxbase + + +class AFSDB(dns.rdtypes.mxbase.UncompressedDowncasingMX): + + """AFSDB record + + @ivar subtype: the subtype value + @type subtype: int + @ivar hostname: the hostname name + @type hostname: dns.name.Name object""" + + # Use the property mechanism to make "subtype" an alias for the + # "preference" attribute, and "hostname" an alias for the "exchange" + # attribute. + # + # This lets us inherit the UncompressedMX implementation but lets + # the caller use appropriate attribute names for the rdata type. + # + # We probably lose some performance vs. a cut-and-paste + # implementation, but this way we don't copy code, and that's + # good. + + def get_subtype(self): + return self.preference + + def set_subtype(self, subtype): + self.preference = subtype + + subtype = property(get_subtype, set_subtype) + + def get_hostname(self): + return self.exchange + + def set_hostname(self, hostname): + self.exchange = hostname + + hostname = property(get_hostname, set_hostname) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/AVC.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/AVC.py new file mode 100644 index 000000000..137c9de92 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/AVC.py @@ -0,0 +1,23 @@ +# Copyright (C) 2016 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.txtbase + + +class AVC(dns.rdtypes.txtbase.TXTBase): + + """AVC record + + @see: U{http://www.iana.org/assignments/dns-parameters/AVC/avc-completed-template}""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/CAA.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/CAA.py new file mode 100644 index 000000000..f2e41ad0b --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/CAA.py @@ -0,0 +1,73 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.tokenizer + + +class CAA(dns.rdata.Rdata): + + """CAA (Certification Authority Authorization) record + + @ivar flags: the flags + @type flags: int + @ivar tag: the tag + @type tag: string + @ivar value: the value + @type value: string + @see: RFC 6844""" + + __slots__ = ['flags', 'tag', 'value'] + + def __init__(self, rdclass, rdtype, flags, tag, value): + super(CAA, self).__init__(rdclass, rdtype) + self.flags = flags + self.tag = tag + self.value = value + + def to_text(self, origin=None, relativize=True, **kw): + return '%u %s "%s"' % (self.flags, + dns.rdata._escapify(self.tag), + dns.rdata._escapify(self.value)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + flags = tok.get_uint8() + tag = tok.get_string().encode() + if len(tag) > 255: + raise dns.exception.SyntaxError("tag too long") + if not tag.isalnum(): + raise dns.exception.SyntaxError("tag is not alphanumeric") + value = tok.get_string().encode() + return cls(rdclass, rdtype, flags, tag, value) + + def to_wire(self, file, compress=None, origin=None): + file.write(struct.pack('!B', self.flags)) + l = len(self.tag) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.tag) + file.write(self.value) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (flags, l) = struct.unpack('!BB', wire[current: current + 2]) + current += 2 + tag = wire[current: current + l] + value = wire[current + l:current + rdlen - 2] + return cls(rdclass, rdtype, flags, tag, value) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/CDNSKEY.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/CDNSKEY.py new file mode 100644 index 000000000..83f3d51fc --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/CDNSKEY.py @@ -0,0 +1,25 @@ +# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.dnskeybase +from dns.rdtypes.dnskeybase import flags_to_text_set, flags_from_text_set + + +__all__ = ['flags_to_text_set', 'flags_from_text_set'] + + +class CDNSKEY(dns.rdtypes.dnskeybase.DNSKEYBase): + + """CDNSKEY record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/CDS.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/CDS.py new file mode 100644 index 000000000..e1abfc368 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/CDS.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.dsbase + + +class CDS(dns.rdtypes.dsbase.DSBase): + + """CDS record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/CERT.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/CERT.py new file mode 100644 index 000000000..1c35c23d2 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/CERT.py @@ -0,0 +1,121 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import base64 + +import dns.exception +import dns.dnssec +import dns.rdata +import dns.tokenizer + +_ctype_by_value = { + 1: 'PKIX', + 2: 'SPKI', + 3: 'PGP', + 253: 'URI', + 254: 'OID', +} + +_ctype_by_name = { + 'PKIX': 1, + 'SPKI': 2, + 'PGP': 3, + 'URI': 253, + 'OID': 254, +} + + +def _ctype_from_text(what): + v = _ctype_by_name.get(what) + if v is not None: + return v + return int(what) + + +def _ctype_to_text(what): + v = _ctype_by_value.get(what) + if v is not None: + return v + return str(what) + + +class CERT(dns.rdata.Rdata): + + """CERT record + + @ivar certificate_type: certificate type + @type certificate_type: int + @ivar key_tag: key tag + @type key_tag: int + @ivar algorithm: algorithm + @type algorithm: int + @ivar certificate: the certificate or CRL + @type certificate: string + @see: RFC 2538""" + + __slots__ = ['certificate_type', 'key_tag', 'algorithm', 'certificate'] + + def __init__(self, rdclass, rdtype, certificate_type, key_tag, algorithm, + certificate): + super(CERT, self).__init__(rdclass, rdtype) + self.certificate_type = certificate_type + self.key_tag = key_tag + self.algorithm = algorithm + self.certificate = certificate + + def to_text(self, origin=None, relativize=True, **kw): + certificate_type = _ctype_to_text(self.certificate_type) + return "%s %d %s %s" % (certificate_type, self.key_tag, + dns.dnssec.algorithm_to_text(self.algorithm), + dns.rdata._base64ify(self.certificate)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + certificate_type = _ctype_from_text(tok.get_string()) + key_tag = tok.get_uint16() + algorithm = dns.dnssec.algorithm_from_text(tok.get_string()) + if algorithm < 0 or algorithm > 255: + raise dns.exception.SyntaxError("bad algorithm type") + chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + chunks.append(t.value.encode()) + b64 = b''.join(chunks) + certificate = base64.b64decode(b64) + return cls(rdclass, rdtype, certificate_type, key_tag, + algorithm, certificate) + + def to_wire(self, file, compress=None, origin=None): + prefix = struct.pack("!HHB", self.certificate_type, self.key_tag, + self.algorithm) + file.write(prefix) + file.write(self.certificate) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + prefix = wire[current: current + 5].unwrap() + current += 5 + rdlen -= 5 + if rdlen < 0: + raise dns.exception.FormError + (certificate_type, key_tag, algorithm) = struct.unpack("!HHB", prefix) + certificate = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, certificate_type, key_tag, algorithm, + certificate) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/CNAME.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/CNAME.py new file mode 100644 index 000000000..65cf570c7 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/CNAME.py @@ -0,0 +1,25 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.nsbase + + +class CNAME(dns.rdtypes.nsbase.NSBase): + + """CNAME record + + Note: although CNAME is officially a singleton type, dnspython allows + non-singleton CNAME rdatasets because such sets have been commonly + used by BIND and other nameservers for load balancing.""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/CSYNC.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/CSYNC.py new file mode 100644 index 000000000..bf95cb273 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/CSYNC.py @@ -0,0 +1,124 @@ +# Copyright (C) 2004-2007, 2009-2011, 2016 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.rdatatype +import dns.name +from dns._compat import xrange + +class CSYNC(dns.rdata.Rdata): + + """CSYNC record + + @ivar serial: the SOA serial number + @type serial: int + @ivar flags: the CSYNC flags + @type flags: int + @ivar windows: the windowed bitmap list + @type windows: list of (window number, string) tuples""" + + __slots__ = ['serial', 'flags', 'windows'] + + def __init__(self, rdclass, rdtype, serial, flags, windows): + super(CSYNC, self).__init__(rdclass, rdtype) + self.serial = serial + self.flags = flags + self.windows = windows + + def to_text(self, origin=None, relativize=True, **kw): + text = '' + for (window, bitmap) in self.windows: + bits = [] + for i in xrange(0, len(bitmap)): + byte = bitmap[i] + for j in xrange(0, 8): + if byte & (0x80 >> j): + bits.append(dns.rdatatype.to_text(window * 256 + + i * 8 + j)) + text += (' ' + ' '.join(bits)) + return '%d %d%s' % (self.serial, self.flags, text) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + serial = tok.get_uint32() + flags = tok.get_uint16() + rdtypes = [] + while 1: + token = tok.get().unescape() + if token.is_eol_or_eof(): + break + nrdtype = dns.rdatatype.from_text(token.value) + if nrdtype == 0: + raise dns.exception.SyntaxError("CSYNC with bit 0") + if nrdtype > 65535: + raise dns.exception.SyntaxError("CSYNC with bit > 65535") + rdtypes.append(nrdtype) + rdtypes.sort() + window = 0 + octets = 0 + prior_rdtype = 0 + bitmap = bytearray(b'\0' * 32) + windows = [] + for nrdtype in rdtypes: + if nrdtype == prior_rdtype: + continue + prior_rdtype = nrdtype + new_window = nrdtype // 256 + if new_window != window: + windows.append((window, bitmap[0:octets])) + bitmap = bytearray(b'\0' * 32) + window = new_window + offset = nrdtype % 256 + byte = offset // 8 + bit = offset % 8 + octets = byte + 1 + bitmap[byte] = bitmap[byte] | (0x80 >> bit) + + windows.append((window, bitmap[0:octets])) + return cls(rdclass, rdtype, serial, flags, windows) + + def to_wire(self, file, compress=None, origin=None): + file.write(struct.pack('!IH', self.serial, self.flags)) + for (window, bitmap) in self.windows: + file.write(struct.pack('!BB', window, len(bitmap))) + file.write(bitmap) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + if rdlen < 6: + raise dns.exception.FormError("CSYNC too short") + (serial, flags) = struct.unpack("!IH", wire[current: current + 6]) + current += 6 + rdlen -= 6 + windows = [] + while rdlen > 0: + if rdlen < 3: + raise dns.exception.FormError("CSYNC too short") + window = wire[current] + octets = wire[current + 1] + if octets == 0 or octets > 32: + raise dns.exception.FormError("bad CSYNC octets") + current += 2 + rdlen -= 2 + if rdlen < octets: + raise dns.exception.FormError("bad CSYNC bitmap length") + bitmap = bytearray(wire[current: current + octets].unwrap()) + current += octets + rdlen -= octets + windows.append((window, bitmap)) + return cls(rdclass, rdtype, serial, flags, windows) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/DLV.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/DLV.py new file mode 100644 index 000000000..cd1244c19 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/DLV.py @@ -0,0 +1,21 @@ +# Copyright (C) 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.dsbase + + +class DLV(dns.rdtypes.dsbase.DSBase): + + """DLV record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/DNAME.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/DNAME.py new file mode 100644 index 000000000..dac97214a --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/DNAME.py @@ -0,0 +1,24 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.nsbase + + +class DNAME(dns.rdtypes.nsbase.UncompressedNS): + + """DNAME record""" + + def to_digestable(self, origin=None): + return self.target.to_digestable(origin) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/DNSKEY.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/DNSKEY.py new file mode 100644 index 000000000..e915e98bb --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/DNSKEY.py @@ -0,0 +1,25 @@ +# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.dnskeybase +from dns.rdtypes.dnskeybase import flags_to_text_set, flags_from_text_set + + +__all__ = ['flags_to_text_set', 'flags_from_text_set'] + + +class DNSKEY(dns.rdtypes.dnskeybase.DNSKEYBase): + + """DNSKEY record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/DS.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/DS.py new file mode 100644 index 000000000..577c8d841 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/DS.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.dsbase + + +class DS(dns.rdtypes.dsbase.DSBase): + + """DS record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/EUI48.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/EUI48.py new file mode 100644 index 000000000..aa260e205 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/EUI48.py @@ -0,0 +1,29 @@ +# Copyright (C) 2015 Red Hat, Inc. +# Author: Petr Spacek +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.euibase + + +class EUI48(dns.rdtypes.euibase.EUIBase): + + """EUI48 record + + @ivar fingerprint: 48-bit Extended Unique Identifier (EUI-48) + @type fingerprint: string + @see: rfc7043.txt""" + + byte_len = 6 # 0123456789ab (in hex) + text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/EUI64.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/EUI64.py new file mode 100644 index 000000000..5eba350d8 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/EUI64.py @@ -0,0 +1,29 @@ +# Copyright (C) 2015 Red Hat, Inc. +# Author: Petr Spacek +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.euibase + + +class EUI64(dns.rdtypes.euibase.EUIBase): + + """EUI64 record + + @ivar fingerprint: 64-bit Extended Unique Identifier (EUI-64) + @type fingerprint: string + @see: rfc7043.txt""" + + byte_len = 8 # 0123456789abcdef (in hex) + text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab-cd-ef diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/GPOS.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/GPOS.py new file mode 100644 index 000000000..a359a7712 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/GPOS.py @@ -0,0 +1,160 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.tokenizer +from dns._compat import long, text_type + + +def _validate_float_string(what): + if what[0] == b'-'[0] or what[0] == b'+'[0]: + what = what[1:] + if what.isdigit(): + return + (left, right) = what.split(b'.') + if left == b'' and right == b'': + raise dns.exception.FormError + if not left == b'' and not left.decode().isdigit(): + raise dns.exception.FormError + if not right == b'' and not right.decode().isdigit(): + raise dns.exception.FormError + + +def _sanitize(value): + if isinstance(value, text_type): + return value.encode() + return value + + +class GPOS(dns.rdata.Rdata): + + """GPOS record + + @ivar latitude: latitude + @type latitude: string + @ivar longitude: longitude + @type longitude: string + @ivar altitude: altitude + @type altitude: string + @see: RFC 1712""" + + __slots__ = ['latitude', 'longitude', 'altitude'] + + def __init__(self, rdclass, rdtype, latitude, longitude, altitude): + super(GPOS, self).__init__(rdclass, rdtype) + if isinstance(latitude, float) or \ + isinstance(latitude, int) or \ + isinstance(latitude, long): + latitude = str(latitude) + if isinstance(longitude, float) or \ + isinstance(longitude, int) or \ + isinstance(longitude, long): + longitude = str(longitude) + if isinstance(altitude, float) or \ + isinstance(altitude, int) or \ + isinstance(altitude, long): + altitude = str(altitude) + latitude = _sanitize(latitude) + longitude = _sanitize(longitude) + altitude = _sanitize(altitude) + _validate_float_string(latitude) + _validate_float_string(longitude) + _validate_float_string(altitude) + self.latitude = latitude + self.longitude = longitude + self.altitude = altitude + + def to_text(self, origin=None, relativize=True, **kw): + return '%s %s %s' % (self.latitude.decode(), + self.longitude.decode(), + self.altitude.decode()) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + latitude = tok.get_string() + longitude = tok.get_string() + altitude = tok.get_string() + tok.get_eol() + return cls(rdclass, rdtype, latitude, longitude, altitude) + + def to_wire(self, file, compress=None, origin=None): + l = len(self.latitude) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.latitude) + l = len(self.longitude) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.longitude) + l = len(self.altitude) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.altitude) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + l = wire[current] + current += 1 + rdlen -= 1 + if l > rdlen: + raise dns.exception.FormError + latitude = wire[current: current + l].unwrap() + current += l + rdlen -= l + l = wire[current] + current += 1 + rdlen -= 1 + if l > rdlen: + raise dns.exception.FormError + longitude = wire[current: current + l].unwrap() + current += l + rdlen -= l + l = wire[current] + current += 1 + rdlen -= 1 + if l != rdlen: + raise dns.exception.FormError + altitude = wire[current: current + l].unwrap() + return cls(rdclass, rdtype, latitude, longitude, altitude) + + def _get_float_latitude(self): + return float(self.latitude) + + def _set_float_latitude(self, value): + self.latitude = str(value) + + float_latitude = property(_get_float_latitude, _set_float_latitude, + doc="latitude as a floating point value") + + def _get_float_longitude(self): + return float(self.longitude) + + def _set_float_longitude(self, value): + self.longitude = str(value) + + float_longitude = property(_get_float_longitude, _set_float_longitude, + doc="longitude as a floating point value") + + def _get_float_altitude(self): + return float(self.altitude) + + def _set_float_altitude(self, value): + self.altitude = str(value) + + float_altitude = property(_get_float_altitude, _set_float_altitude, + doc="altitude as a floating point value") diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/HINFO.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/HINFO.py new file mode 100644 index 000000000..e5a1bea3d --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/HINFO.py @@ -0,0 +1,84 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.tokenizer +from dns._compat import text_type + + +class HINFO(dns.rdata.Rdata): + + """HINFO record + + @ivar cpu: the CPU type + @type cpu: string + @ivar os: the OS type + @type os: string + @see: RFC 1035""" + + __slots__ = ['cpu', 'os'] + + def __init__(self, rdclass, rdtype, cpu, os): + super(HINFO, self).__init__(rdclass, rdtype) + if isinstance(cpu, text_type): + self.cpu = cpu.encode() + else: + self.cpu = cpu + if isinstance(os, text_type): + self.os = os.encode() + else: + self.os = os + + def to_text(self, origin=None, relativize=True, **kw): + return '"%s" "%s"' % (dns.rdata._escapify(self.cpu), + dns.rdata._escapify(self.os)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + cpu = tok.get_string() + os = tok.get_string() + tok.get_eol() + return cls(rdclass, rdtype, cpu, os) + + def to_wire(self, file, compress=None, origin=None): + l = len(self.cpu) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.cpu) + l = len(self.os) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.os) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + l = wire[current] + current += 1 + rdlen -= 1 + if l > rdlen: + raise dns.exception.FormError + cpu = wire[current:current + l].unwrap() + current += l + rdlen -= l + l = wire[current] + current += 1 + rdlen -= 1 + if l != rdlen: + raise dns.exception.FormError + os = wire[current: current + l].unwrap() + return cls(rdclass, rdtype, cpu, os) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/HIP.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/HIP.py new file mode 100644 index 000000000..fbe955c35 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/HIP.py @@ -0,0 +1,113 @@ +# Copyright (C) 2010, 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import base64 +import binascii + +import dns.exception +import dns.rdata +import dns.rdatatype + + +class HIP(dns.rdata.Rdata): + + """HIP record + + @ivar hit: the host identity tag + @type hit: string + @ivar algorithm: the public key cryptographic algorithm + @type algorithm: int + @ivar key: the public key + @type key: string + @ivar servers: the rendezvous servers + @type servers: list of dns.name.Name objects + @see: RFC 5205""" + + __slots__ = ['hit', 'algorithm', 'key', 'servers'] + + def __init__(self, rdclass, rdtype, hit, algorithm, key, servers): + super(HIP, self).__init__(rdclass, rdtype) + self.hit = hit + self.algorithm = algorithm + self.key = key + self.servers = servers + + def to_text(self, origin=None, relativize=True, **kw): + hit = binascii.hexlify(self.hit).decode() + key = base64.b64encode(self.key).replace(b'\n', b'').decode() + text = u'' + servers = [] + for server in self.servers: + servers.append(server.choose_relativity(origin, relativize)) + if len(servers) > 0: + text += (u' ' + u' '.join((x.to_unicode() for x in servers))) + return u'%u %s %s%s' % (self.algorithm, hit, key, text) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + algorithm = tok.get_uint8() + hit = binascii.unhexlify(tok.get_string().encode()) + if len(hit) > 255: + raise dns.exception.SyntaxError("HIT too long") + key = base64.b64decode(tok.get_string().encode()) + servers = [] + while 1: + token = tok.get() + if token.is_eol_or_eof(): + break + server = dns.name.from_text(token.value, origin) + server.choose_relativity(origin, relativize) + servers.append(server) + return cls(rdclass, rdtype, hit, algorithm, key, servers) + + def to_wire(self, file, compress=None, origin=None): + lh = len(self.hit) + lk = len(self.key) + file.write(struct.pack("!BBH", lh, self.algorithm, lk)) + file.write(self.hit) + file.write(self.key) + for server in self.servers: + server.to_wire(file, None, origin) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (lh, algorithm, lk) = struct.unpack('!BBH', + wire[current: current + 4]) + current += 4 + rdlen -= 4 + hit = wire[current: current + lh].unwrap() + current += lh + rdlen -= lh + key = wire[current: current + lk].unwrap() + current += lk + rdlen -= lk + servers = [] + while rdlen > 0: + (server, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + current += cused + rdlen -= cused + if origin is not None: + server = server.relativize(origin) + servers.append(server) + return cls(rdclass, rdtype, hit, algorithm, key, servers) + + def choose_relativity(self, origin=None, relativize=True): + servers = [] + for server in self.servers: + server = server.choose_relativity(origin, relativize) + servers.append(server) + self.servers = servers diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/ISDN.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/ISDN.py new file mode 100644 index 000000000..da2ae3af3 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/ISDN.py @@ -0,0 +1,97 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.tokenizer +from dns._compat import text_type + + +class ISDN(dns.rdata.Rdata): + + """ISDN record + + @ivar address: the ISDN address + @type address: string + @ivar subaddress: the ISDN subaddress (or '' if not present) + @type subaddress: string + @see: RFC 1183""" + + __slots__ = ['address', 'subaddress'] + + def __init__(self, rdclass, rdtype, address, subaddress): + super(ISDN, self).__init__(rdclass, rdtype) + if isinstance(address, text_type): + self.address = address.encode() + else: + self.address = address + if isinstance(address, text_type): + self.subaddress = subaddress.encode() + else: + self.subaddress = subaddress + + def to_text(self, origin=None, relativize=True, **kw): + if self.subaddress: + return '"%s" "%s"' % (dns.rdata._escapify(self.address), + dns.rdata._escapify(self.subaddress)) + else: + return '"%s"' % dns.rdata._escapify(self.address) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + address = tok.get_string() + t = tok.get() + if not t.is_eol_or_eof(): + tok.unget(t) + subaddress = tok.get_string() + else: + tok.unget(t) + subaddress = '' + tok.get_eol() + return cls(rdclass, rdtype, address, subaddress) + + def to_wire(self, file, compress=None, origin=None): + l = len(self.address) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.address) + l = len(self.subaddress) + if l > 0: + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.subaddress) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + l = wire[current] + current += 1 + rdlen -= 1 + if l > rdlen: + raise dns.exception.FormError + address = wire[current: current + l].unwrap() + current += l + rdlen -= l + if rdlen > 0: + l = wire[current] + current += 1 + rdlen -= 1 + if l != rdlen: + raise dns.exception.FormError + subaddress = wire[current: current + l].unwrap() + else: + subaddress = '' + return cls(rdclass, rdtype, address, subaddress) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/LOC.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/LOC.py new file mode 100644 index 000000000..b433da948 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/LOC.py @@ -0,0 +1,325 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import division + +import struct + +import dns.exception +import dns.rdata +from dns._compat import long, xrange, round_py2_compat + + +_pows = tuple(long(10**i) for i in range(0, 11)) + +# default values are in centimeters +_default_size = 100.0 +_default_hprec = 1000000.0 +_default_vprec = 1000.0 + + +def _exponent_of(what, desc): + if what == 0: + return 0 + exp = None + for i in xrange(len(_pows)): + if what // _pows[i] == long(0): + exp = i - 1 + break + if exp is None or exp < 0: + raise dns.exception.SyntaxError("%s value out of bounds" % desc) + return exp + + +def _float_to_tuple(what): + if what < 0: + sign = -1 + what *= -1 + else: + sign = 1 + what = round_py2_compat(what * 3600000) + degrees = int(what // 3600000) + what -= degrees * 3600000 + minutes = int(what // 60000) + what -= minutes * 60000 + seconds = int(what // 1000) + what -= int(seconds * 1000) + what = int(what) + return (degrees, minutes, seconds, what, sign) + + +def _tuple_to_float(what): + value = float(what[0]) + value += float(what[1]) / 60.0 + value += float(what[2]) / 3600.0 + value += float(what[3]) / 3600000.0 + return float(what[4]) * value + + +def _encode_size(what, desc): + what = long(what) + exponent = _exponent_of(what, desc) & 0xF + base = what // pow(10, exponent) & 0xF + return base * 16 + exponent + + +def _decode_size(what, desc): + exponent = what & 0x0F + if exponent > 9: + raise dns.exception.SyntaxError("bad %s exponent" % desc) + base = (what & 0xF0) >> 4 + if base > 9: + raise dns.exception.SyntaxError("bad %s base" % desc) + return long(base) * pow(10, exponent) + + +class LOC(dns.rdata.Rdata): + + """LOC record + + @ivar latitude: latitude + @type latitude: (int, int, int, int, sign) tuple specifying the degrees, minutes, + seconds, milliseconds, and sign of the coordinate. + @ivar longitude: longitude + @type longitude: (int, int, int, int, sign) tuple specifying the degrees, + minutes, seconds, milliseconds, and sign of the coordinate. + @ivar altitude: altitude + @type altitude: float + @ivar size: size of the sphere + @type size: float + @ivar horizontal_precision: horizontal precision + @type horizontal_precision: float + @ivar vertical_precision: vertical precision + @type vertical_precision: float + @see: RFC 1876""" + + __slots__ = ['latitude', 'longitude', 'altitude', 'size', + 'horizontal_precision', 'vertical_precision'] + + def __init__(self, rdclass, rdtype, latitude, longitude, altitude, + size=_default_size, hprec=_default_hprec, + vprec=_default_vprec): + """Initialize a LOC record instance. + + The parameters I{latitude} and I{longitude} may be either a 4-tuple + of integers specifying (degrees, minutes, seconds, milliseconds), + or they may be floating point values specifying the number of + degrees. The other parameters are floats. Size, horizontal precision, + and vertical precision are specified in centimeters.""" + + super(LOC, self).__init__(rdclass, rdtype) + if isinstance(latitude, int) or isinstance(latitude, long): + latitude = float(latitude) + if isinstance(latitude, float): + latitude = _float_to_tuple(latitude) + self.latitude = latitude + if isinstance(longitude, int) or isinstance(longitude, long): + longitude = float(longitude) + if isinstance(longitude, float): + longitude = _float_to_tuple(longitude) + self.longitude = longitude + self.altitude = float(altitude) + self.size = float(size) + self.horizontal_precision = float(hprec) + self.vertical_precision = float(vprec) + + def to_text(self, origin=None, relativize=True, **kw): + if self.latitude[4] > 0: + lat_hemisphere = 'N' + else: + lat_hemisphere = 'S' + if self.longitude[4] > 0: + long_hemisphere = 'E' + else: + long_hemisphere = 'W' + text = "%d %d %d.%03d %s %d %d %d.%03d %s %0.2fm" % ( + self.latitude[0], self.latitude[1], + self.latitude[2], self.latitude[3], lat_hemisphere, + self.longitude[0], self.longitude[1], self.longitude[2], + self.longitude[3], long_hemisphere, + self.altitude / 100.0 + ) + + # do not print default values + if self.size != _default_size or \ + self.horizontal_precision != _default_hprec or \ + self.vertical_precision != _default_vprec: + text += " %0.2fm %0.2fm %0.2fm" % ( + self.size / 100.0, self.horizontal_precision / 100.0, + self.vertical_precision / 100.0 + ) + return text + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + latitude = [0, 0, 0, 0, 1] + longitude = [0, 0, 0, 0, 1] + size = _default_size + hprec = _default_hprec + vprec = _default_vprec + + latitude[0] = tok.get_int() + t = tok.get_string() + if t.isdigit(): + latitude[1] = int(t) + t = tok.get_string() + if '.' in t: + (seconds, milliseconds) = t.split('.') + if not seconds.isdigit(): + raise dns.exception.SyntaxError( + 'bad latitude seconds value') + latitude[2] = int(seconds) + if latitude[2] >= 60: + raise dns.exception.SyntaxError('latitude seconds >= 60') + l = len(milliseconds) + if l == 0 or l > 3 or not milliseconds.isdigit(): + raise dns.exception.SyntaxError( + 'bad latitude milliseconds value') + if l == 1: + m = 100 + elif l == 2: + m = 10 + else: + m = 1 + latitude[3] = m * int(milliseconds) + t = tok.get_string() + elif t.isdigit(): + latitude[2] = int(t) + t = tok.get_string() + if t == 'S': + latitude[4] = -1 + elif t != 'N': + raise dns.exception.SyntaxError('bad latitude hemisphere value') + + longitude[0] = tok.get_int() + t = tok.get_string() + if t.isdigit(): + longitude[1] = int(t) + t = tok.get_string() + if '.' in t: + (seconds, milliseconds) = t.split('.') + if not seconds.isdigit(): + raise dns.exception.SyntaxError( + 'bad longitude seconds value') + longitude[2] = int(seconds) + if longitude[2] >= 60: + raise dns.exception.SyntaxError('longitude seconds >= 60') + l = len(milliseconds) + if l == 0 or l > 3 or not milliseconds.isdigit(): + raise dns.exception.SyntaxError( + 'bad longitude milliseconds value') + if l == 1: + m = 100 + elif l == 2: + m = 10 + else: + m = 1 + longitude[3] = m * int(milliseconds) + t = tok.get_string() + elif t.isdigit(): + longitude[2] = int(t) + t = tok.get_string() + if t == 'W': + longitude[4] = -1 + elif t != 'E': + raise dns.exception.SyntaxError('bad longitude hemisphere value') + + t = tok.get_string() + if t[-1] == 'm': + t = t[0: -1] + altitude = float(t) * 100.0 # m -> cm + + token = tok.get().unescape() + if not token.is_eol_or_eof(): + value = token.value + if value[-1] == 'm': + value = value[0: -1] + size = float(value) * 100.0 # m -> cm + token = tok.get().unescape() + if not token.is_eol_or_eof(): + value = token.value + if value[-1] == 'm': + value = value[0: -1] + hprec = float(value) * 100.0 # m -> cm + token = tok.get().unescape() + if not token.is_eol_or_eof(): + value = token.value + if value[-1] == 'm': + value = value[0: -1] + vprec = float(value) * 100.0 # m -> cm + tok.get_eol() + + return cls(rdclass, rdtype, latitude, longitude, altitude, + size, hprec, vprec) + + def to_wire(self, file, compress=None, origin=None): + milliseconds = (self.latitude[0] * 3600000 + + self.latitude[1] * 60000 + + self.latitude[2] * 1000 + + self.latitude[3]) * self.latitude[4] + latitude = long(0x80000000) + milliseconds + milliseconds = (self.longitude[0] * 3600000 + + self.longitude[1] * 60000 + + self.longitude[2] * 1000 + + self.longitude[3]) * self.longitude[4] + longitude = long(0x80000000) + milliseconds + altitude = long(self.altitude) + long(10000000) + size = _encode_size(self.size, "size") + hprec = _encode_size(self.horizontal_precision, "horizontal precision") + vprec = _encode_size(self.vertical_precision, "vertical precision") + wire = struct.pack("!BBBBIII", 0, size, hprec, vprec, latitude, + longitude, altitude) + file.write(wire) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (version, size, hprec, vprec, latitude, longitude, altitude) = \ + struct.unpack("!BBBBIII", wire[current: current + rdlen]) + if latitude > long(0x80000000): + latitude = float(latitude - long(0x80000000)) / 3600000 + else: + latitude = -1 * float(long(0x80000000) - latitude) / 3600000 + if latitude < -90.0 or latitude > 90.0: + raise dns.exception.FormError("bad latitude") + if longitude > long(0x80000000): + longitude = float(longitude - long(0x80000000)) / 3600000 + else: + longitude = -1 * float(long(0x80000000) - longitude) / 3600000 + if longitude < -180.0 or longitude > 180.0: + raise dns.exception.FormError("bad longitude") + altitude = float(altitude) - 10000000.0 + size = _decode_size(size, "size") + hprec = _decode_size(hprec, "horizontal precision") + vprec = _decode_size(vprec, "vertical precision") + return cls(rdclass, rdtype, latitude, longitude, altitude, + size, hprec, vprec) + + def _get_float_latitude(self): + return _tuple_to_float(self.latitude) + + def _set_float_latitude(self, value): + self.latitude = _float_to_tuple(value) + + float_latitude = property(_get_float_latitude, _set_float_latitude, + doc="latitude as a floating point value") + + def _get_float_longitude(self): + return _tuple_to_float(self.longitude) + + def _set_float_longitude(self, value): + self.longitude = _float_to_tuple(value) + + float_longitude = property(_get_float_longitude, _set_float_longitude, + doc="longitude as a floating point value") diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/MX.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/MX.py new file mode 100644 index 000000000..3a6735dc5 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/MX.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.mxbase + + +class MX(dns.rdtypes.mxbase.MXBase): + + """MX record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/NS.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/NS.py new file mode 100644 index 000000000..ae56d819e --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/NS.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.nsbase + + +class NS(dns.rdtypes.nsbase.NSBase): + + """NS record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC.py new file mode 100644 index 000000000..dfe96859f --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC.py @@ -0,0 +1,126 @@ +# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.rdatatype +import dns.name +from dns._compat import xrange + + +class NSEC(dns.rdata.Rdata): + + """NSEC record + + @ivar next: the next name + @type next: dns.name.Name object + @ivar windows: the windowed bitmap list + @type windows: list of (window number, string) tuples""" + + __slots__ = ['next', 'windows'] + + def __init__(self, rdclass, rdtype, next, windows): + super(NSEC, self).__init__(rdclass, rdtype) + self.next = next + self.windows = windows + + def to_text(self, origin=None, relativize=True, **kw): + next = self.next.choose_relativity(origin, relativize) + text = '' + for (window, bitmap) in self.windows: + bits = [] + for i in xrange(0, len(bitmap)): + byte = bitmap[i] + for j in xrange(0, 8): + if byte & (0x80 >> j): + bits.append(dns.rdatatype.to_text(window * 256 + + i * 8 + j)) + text += (' ' + ' '.join(bits)) + return '%s%s' % (next, text) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + next = tok.get_name() + next = next.choose_relativity(origin, relativize) + rdtypes = [] + while 1: + token = tok.get().unescape() + if token.is_eol_or_eof(): + break + nrdtype = dns.rdatatype.from_text(token.value) + if nrdtype == 0: + raise dns.exception.SyntaxError("NSEC with bit 0") + if nrdtype > 65535: + raise dns.exception.SyntaxError("NSEC with bit > 65535") + rdtypes.append(nrdtype) + rdtypes.sort() + window = 0 + octets = 0 + prior_rdtype = 0 + bitmap = bytearray(b'\0' * 32) + windows = [] + for nrdtype in rdtypes: + if nrdtype == prior_rdtype: + continue + prior_rdtype = nrdtype + new_window = nrdtype // 256 + if new_window != window: + windows.append((window, bitmap[0:octets])) + bitmap = bytearray(b'\0' * 32) + window = new_window + offset = nrdtype % 256 + byte = offset // 8 + bit = offset % 8 + octets = byte + 1 + bitmap[byte] = bitmap[byte] | (0x80 >> bit) + + windows.append((window, bitmap[0:octets])) + return cls(rdclass, rdtype, next, windows) + + def to_wire(self, file, compress=None, origin=None): + self.next.to_wire(file, None, origin) + for (window, bitmap) in self.windows: + file.write(struct.pack('!BB', window, len(bitmap))) + file.write(bitmap) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (next, cused) = dns.name.from_wire(wire[: current + rdlen], current) + current += cused + rdlen -= cused + windows = [] + while rdlen > 0: + if rdlen < 3: + raise dns.exception.FormError("NSEC too short") + window = wire[current] + octets = wire[current + 1] + if octets == 0 or octets > 32: + raise dns.exception.FormError("bad NSEC octets") + current += 2 + rdlen -= 2 + if rdlen < octets: + raise dns.exception.FormError("bad NSEC bitmap length") + bitmap = bytearray(wire[current: current + octets].unwrap()) + current += octets + rdlen -= octets + windows.append((window, bitmap)) + if origin is not None: + next = next.relativize(origin) + return cls(rdclass, rdtype, next, windows) + + def choose_relativity(self, origin=None, relativize=True): + self.next = self.next.choose_relativity(origin, relativize) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC3.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC3.py new file mode 100644 index 000000000..9a15687ba --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC3.py @@ -0,0 +1,191 @@ +# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import base64 +import binascii +import string +import struct + +import dns.exception +import dns.rdata +import dns.rdatatype +from dns._compat import xrange, text_type + +try: + b32_hex_to_normal = string.maketrans('0123456789ABCDEFGHIJKLMNOPQRSTUV', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567') + b32_normal_to_hex = string.maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', + '0123456789ABCDEFGHIJKLMNOPQRSTUV') +except AttributeError: + b32_hex_to_normal = bytes.maketrans(b'0123456789ABCDEFGHIJKLMNOPQRSTUV', + b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567') + b32_normal_to_hex = bytes.maketrans(b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', + b'0123456789ABCDEFGHIJKLMNOPQRSTUV') + +# hash algorithm constants +SHA1 = 1 + +# flag constants +OPTOUT = 1 + + +class NSEC3(dns.rdata.Rdata): + + """NSEC3 record + + @ivar algorithm: the hash algorithm number + @type algorithm: int + @ivar flags: the flags + @type flags: int + @ivar iterations: the number of iterations + @type iterations: int + @ivar salt: the salt + @type salt: string + @ivar next: the next name hash + @type next: string + @ivar windows: the windowed bitmap list + @type windows: list of (window number, string) tuples""" + + __slots__ = ['algorithm', 'flags', 'iterations', 'salt', 'next', 'windows'] + + def __init__(self, rdclass, rdtype, algorithm, flags, iterations, salt, + next, windows): + super(NSEC3, self).__init__(rdclass, rdtype) + self.algorithm = algorithm + self.flags = flags + self.iterations = iterations + if isinstance(salt, text_type): + self.salt = salt.encode() + else: + self.salt = salt + self.next = next + self.windows = windows + + def to_text(self, origin=None, relativize=True, **kw): + next = base64.b32encode(self.next).translate( + b32_normal_to_hex).lower().decode() + if self.salt == b'': + salt = '-' + else: + salt = binascii.hexlify(self.salt).decode() + text = u'' + for (window, bitmap) in self.windows: + bits = [] + for i in xrange(0, len(bitmap)): + byte = bitmap[i] + for j in xrange(0, 8): + if byte & (0x80 >> j): + bits.append(dns.rdatatype.to_text(window * 256 + + i * 8 + j)) + text += (u' ' + u' '.join(bits)) + return u'%u %u %u %s %s%s' % (self.algorithm, self.flags, + self.iterations, salt, next, text) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + algorithm = tok.get_uint8() + flags = tok.get_uint8() + iterations = tok.get_uint16() + salt = tok.get_string() + if salt == u'-': + salt = b'' + else: + salt = binascii.unhexlify(salt.encode('ascii')) + next = tok.get_string().encode( + 'ascii').upper().translate(b32_hex_to_normal) + next = base64.b32decode(next) + rdtypes = [] + while 1: + token = tok.get().unescape() + if token.is_eol_or_eof(): + break + nrdtype = dns.rdatatype.from_text(token.value) + if nrdtype == 0: + raise dns.exception.SyntaxError("NSEC3 with bit 0") + if nrdtype > 65535: + raise dns.exception.SyntaxError("NSEC3 with bit > 65535") + rdtypes.append(nrdtype) + rdtypes.sort() + window = 0 + octets = 0 + prior_rdtype = 0 + bitmap = bytearray(b'\0' * 32) + windows = [] + for nrdtype in rdtypes: + if nrdtype == prior_rdtype: + continue + prior_rdtype = nrdtype + new_window = nrdtype // 256 + if new_window != window: + if octets != 0: + windows.append((window, ''.join(bitmap[0:octets]))) + bitmap = bytearray(b'\0' * 32) + window = new_window + offset = nrdtype % 256 + byte = offset // 8 + bit = offset % 8 + octets = byte + 1 + bitmap[byte] = bitmap[byte] | (0x80 >> bit) + if octets != 0: + windows.append((window, bitmap[0:octets])) + return cls(rdclass, rdtype, algorithm, flags, iterations, salt, next, + windows) + + def to_wire(self, file, compress=None, origin=None): + l = len(self.salt) + file.write(struct.pack("!BBHB", self.algorithm, self.flags, + self.iterations, l)) + file.write(self.salt) + l = len(self.next) + file.write(struct.pack("!B", l)) + file.write(self.next) + for (window, bitmap) in self.windows: + file.write(struct.pack("!BB", window, len(bitmap))) + file.write(bitmap) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (algorithm, flags, iterations, slen) = \ + struct.unpack('!BBHB', wire[current: current + 5]) + + current += 5 + rdlen -= 5 + salt = wire[current: current + slen].unwrap() + current += slen + rdlen -= slen + nlen = wire[current] + current += 1 + rdlen -= 1 + next = wire[current: current + nlen].unwrap() + current += nlen + rdlen -= nlen + windows = [] + while rdlen > 0: + if rdlen < 3: + raise dns.exception.FormError("NSEC3 too short") + window = wire[current] + octets = wire[current + 1] + if octets == 0 or octets > 32: + raise dns.exception.FormError("bad NSEC3 octets") + current += 2 + rdlen -= 2 + if rdlen < octets: + raise dns.exception.FormError("bad NSEC3 bitmap length") + bitmap = bytearray(wire[current: current + octets].unwrap()) + current += octets + rdlen -= octets + windows.append((window, bitmap)) + return cls(rdclass, rdtype, algorithm, flags, iterations, salt, next, + windows) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC3PARAM.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC3PARAM.py new file mode 100644 index 000000000..36bf74094 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC3PARAM.py @@ -0,0 +1,88 @@ +# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import binascii + +import dns.exception +import dns.rdata +from dns._compat import text_type + + +class NSEC3PARAM(dns.rdata.Rdata): + + """NSEC3PARAM record + + @ivar algorithm: the hash algorithm number + @type algorithm: int + @ivar flags: the flags + @type flags: int + @ivar iterations: the number of iterations + @type iterations: int + @ivar salt: the salt + @type salt: string""" + + __slots__ = ['algorithm', 'flags', 'iterations', 'salt'] + + def __init__(self, rdclass, rdtype, algorithm, flags, iterations, salt): + super(NSEC3PARAM, self).__init__(rdclass, rdtype) + self.algorithm = algorithm + self.flags = flags + self.iterations = iterations + if isinstance(salt, text_type): + self.salt = salt.encode() + else: + self.salt = salt + + def to_text(self, origin=None, relativize=True, **kw): + if self.salt == b'': + salt = '-' + else: + salt = binascii.hexlify(self.salt).decode() + return '%u %u %u %s' % (self.algorithm, self.flags, self.iterations, + salt) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + algorithm = tok.get_uint8() + flags = tok.get_uint8() + iterations = tok.get_uint16() + salt = tok.get_string() + if salt == '-': + salt = '' + else: + salt = binascii.unhexlify(salt.encode()) + tok.get_eol() + return cls(rdclass, rdtype, algorithm, flags, iterations, salt) + + def to_wire(self, file, compress=None, origin=None): + l = len(self.salt) + file.write(struct.pack("!BBHB", self.algorithm, self.flags, + self.iterations, l)) + file.write(self.salt) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (algorithm, flags, iterations, slen) = \ + struct.unpack('!BBHB', + wire[current: current + 5]) + current += 5 + rdlen -= 5 + salt = wire[current: current + slen].unwrap() + current += slen + rdlen -= slen + if rdlen != 0: + raise dns.exception.FormError + return cls(rdclass, rdtype, algorithm, flags, iterations, salt) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/PTR.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/PTR.py new file mode 100644 index 000000000..250187a61 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/PTR.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.nsbase + + +class PTR(dns.rdtypes.nsbase.NSBase): + + """PTR record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/RP.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/RP.py new file mode 100644 index 000000000..e9071c763 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/RP.py @@ -0,0 +1,80 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.exception +import dns.rdata +import dns.name + + +class RP(dns.rdata.Rdata): + + """RP record + + @ivar mbox: The responsible person's mailbox + @type mbox: dns.name.Name object + @ivar txt: The owner name of a node with TXT records, or the root name + if no TXT records are associated with this RP. + @type txt: dns.name.Name object + @see: RFC 1183""" + + __slots__ = ['mbox', 'txt'] + + def __init__(self, rdclass, rdtype, mbox, txt): + super(RP, self).__init__(rdclass, rdtype) + self.mbox = mbox + self.txt = txt + + def to_text(self, origin=None, relativize=True, **kw): + mbox = self.mbox.choose_relativity(origin, relativize) + txt = self.txt.choose_relativity(origin, relativize) + return "%s %s" % (str(mbox), str(txt)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + mbox = tok.get_name() + txt = tok.get_name() + mbox = mbox.choose_relativity(origin, relativize) + txt = txt.choose_relativity(origin, relativize) + tok.get_eol() + return cls(rdclass, rdtype, mbox, txt) + + def to_wire(self, file, compress=None, origin=None): + self.mbox.to_wire(file, None, origin) + self.txt.to_wire(file, None, origin) + + def to_digestable(self, origin=None): + return self.mbox.to_digestable(origin) + \ + self.txt.to_digestable(origin) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (mbox, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + current += cused + rdlen -= cused + if rdlen <= 0: + raise dns.exception.FormError + (txt, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + if cused != rdlen: + raise dns.exception.FormError + if origin is not None: + mbox = mbox.relativize(origin) + txt = txt.relativize(origin) + return cls(rdclass, rdtype, mbox, txt) + + def choose_relativity(self, origin=None, relativize=True): + self.mbox = self.mbox.choose_relativity(origin, relativize) + self.txt = self.txt.choose_relativity(origin, relativize) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/RRSIG.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/RRSIG.py new file mode 100644 index 000000000..953dfb9a5 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/RRSIG.py @@ -0,0 +1,156 @@ +# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import base64 +import calendar +import struct +import time + +import dns.dnssec +import dns.exception +import dns.rdata +import dns.rdatatype + + +class BadSigTime(dns.exception.DNSException): + + """Time in DNS SIG or RRSIG resource record cannot be parsed.""" + + +def sigtime_to_posixtime(what): + if len(what) != 14: + raise BadSigTime + year = int(what[0:4]) + month = int(what[4:6]) + day = int(what[6:8]) + hour = int(what[8:10]) + minute = int(what[10:12]) + second = int(what[12:14]) + return calendar.timegm((year, month, day, hour, minute, second, + 0, 0, 0)) + + +def posixtime_to_sigtime(what): + return time.strftime('%Y%m%d%H%M%S', time.gmtime(what)) + + +class RRSIG(dns.rdata.Rdata): + + """RRSIG record + + @ivar type_covered: the rdata type this signature covers + @type type_covered: int + @ivar algorithm: the algorithm used for the sig + @type algorithm: int + @ivar labels: number of labels + @type labels: int + @ivar original_ttl: the original TTL + @type original_ttl: long + @ivar expiration: signature expiration time + @type expiration: long + @ivar inception: signature inception time + @type inception: long + @ivar key_tag: the key tag + @type key_tag: int + @ivar signer: the signer + @type signer: dns.name.Name object + @ivar signature: the signature + @type signature: string""" + + __slots__ = ['type_covered', 'algorithm', 'labels', 'original_ttl', + 'expiration', 'inception', 'key_tag', 'signer', + 'signature'] + + def __init__(self, rdclass, rdtype, type_covered, algorithm, labels, + original_ttl, expiration, inception, key_tag, signer, + signature): + super(RRSIG, self).__init__(rdclass, rdtype) + self.type_covered = type_covered + self.algorithm = algorithm + self.labels = labels + self.original_ttl = original_ttl + self.expiration = expiration + self.inception = inception + self.key_tag = key_tag + self.signer = signer + self.signature = signature + + def covers(self): + return self.type_covered + + def to_text(self, origin=None, relativize=True, **kw): + return '%s %d %d %d %s %s %d %s %s' % ( + dns.rdatatype.to_text(self.type_covered), + self.algorithm, + self.labels, + self.original_ttl, + posixtime_to_sigtime(self.expiration), + posixtime_to_sigtime(self.inception), + self.key_tag, + self.signer.choose_relativity(origin, relativize), + dns.rdata._base64ify(self.signature) + ) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + type_covered = dns.rdatatype.from_text(tok.get_string()) + algorithm = dns.dnssec.algorithm_from_text(tok.get_string()) + labels = tok.get_int() + original_ttl = tok.get_ttl() + expiration = sigtime_to_posixtime(tok.get_string()) + inception = sigtime_to_posixtime(tok.get_string()) + key_tag = tok.get_int() + signer = tok.get_name() + signer = signer.choose_relativity(origin, relativize) + chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + chunks.append(t.value.encode()) + b64 = b''.join(chunks) + signature = base64.b64decode(b64) + return cls(rdclass, rdtype, type_covered, algorithm, labels, + original_ttl, expiration, inception, key_tag, signer, + signature) + + def to_wire(self, file, compress=None, origin=None): + header = struct.pack('!HBBIIIH', self.type_covered, + self.algorithm, self.labels, + self.original_ttl, self.expiration, + self.inception, self.key_tag) + file.write(header) + self.signer.to_wire(file, None, origin) + file.write(self.signature) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + header = struct.unpack('!HBBIIIH', wire[current: current + 18]) + current += 18 + rdlen -= 18 + (signer, cused) = dns.name.from_wire(wire[: current + rdlen], current) + current += cused + rdlen -= cused + if origin is not None: + signer = signer.relativize(origin) + signature = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, header[0], header[1], header[2], + header[3], header[4], header[5], header[6], signer, + signature) + + def choose_relativity(self, origin=None, relativize=True): + self.signer = self.signer.choose_relativity(origin, relativize) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/RT.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/RT.py new file mode 100644 index 000000000..88b754868 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/RT.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.mxbase + + +class RT(dns.rdtypes.mxbase.UncompressedDowncasingMX): + + """RT record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/SOA.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/SOA.py new file mode 100644 index 000000000..cc0098e8b --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/SOA.py @@ -0,0 +1,114 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.name + + +class SOA(dns.rdata.Rdata): + + """SOA record + + @ivar mname: the SOA MNAME (master name) field + @type mname: dns.name.Name object + @ivar rname: the SOA RNAME (responsible name) field + @type rname: dns.name.Name object + @ivar serial: The zone's serial number + @type serial: int + @ivar refresh: The zone's refresh value (in seconds) + @type refresh: int + @ivar retry: The zone's retry value (in seconds) + @type retry: int + @ivar expire: The zone's expiration value (in seconds) + @type expire: int + @ivar minimum: The zone's negative caching time (in seconds, called + "minimum" for historical reasons) + @type minimum: int + @see: RFC 1035""" + + __slots__ = ['mname', 'rname', 'serial', 'refresh', 'retry', 'expire', + 'minimum'] + + def __init__(self, rdclass, rdtype, mname, rname, serial, refresh, retry, + expire, minimum): + super(SOA, self).__init__(rdclass, rdtype) + self.mname = mname + self.rname = rname + self.serial = serial + self.refresh = refresh + self.retry = retry + self.expire = expire + self.minimum = minimum + + def to_text(self, origin=None, relativize=True, **kw): + mname = self.mname.choose_relativity(origin, relativize) + rname = self.rname.choose_relativity(origin, relativize) + return '%s %s %d %d %d %d %d' % ( + mname, rname, self.serial, self.refresh, self.retry, + self.expire, self.minimum) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + mname = tok.get_name() + rname = tok.get_name() + mname = mname.choose_relativity(origin, relativize) + rname = rname.choose_relativity(origin, relativize) + serial = tok.get_uint32() + refresh = tok.get_ttl() + retry = tok.get_ttl() + expire = tok.get_ttl() + minimum = tok.get_ttl() + tok.get_eol() + return cls(rdclass, rdtype, mname, rname, serial, refresh, retry, + expire, minimum) + + def to_wire(self, file, compress=None, origin=None): + self.mname.to_wire(file, compress, origin) + self.rname.to_wire(file, compress, origin) + five_ints = struct.pack('!IIIII', self.serial, self.refresh, + self.retry, self.expire, self.minimum) + file.write(five_ints) + + def to_digestable(self, origin=None): + return self.mname.to_digestable(origin) + \ + self.rname.to_digestable(origin) + \ + struct.pack('!IIIII', self.serial, self.refresh, + self.retry, self.expire, self.minimum) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (mname, cused) = dns.name.from_wire(wire[: current + rdlen], current) + current += cused + rdlen -= cused + (rname, cused) = dns.name.from_wire(wire[: current + rdlen], current) + current += cused + rdlen -= cused + if rdlen != 20: + raise dns.exception.FormError + five_ints = struct.unpack('!IIIII', + wire[current: current + rdlen]) + if origin is not None: + mname = mname.relativize(origin) + rname = rname.relativize(origin) + return cls(rdclass, rdtype, mname, rname, + five_ints[0], five_ints[1], five_ints[2], five_ints[3], + five_ints[4]) + + def choose_relativity(self, origin=None, relativize=True): + self.mname = self.mname.choose_relativity(origin, relativize) + self.rname = self.rname.choose_relativity(origin, relativize) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/SPF.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/SPF.py new file mode 100644 index 000000000..f3e0904e6 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/SPF.py @@ -0,0 +1,23 @@ +# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.txtbase + + +class SPF(dns.rdtypes.txtbase.TXTBase): + + """SPF record + + @see: RFC 4408""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/SSHFP.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/SSHFP.py new file mode 100644 index 000000000..7e846b342 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/SSHFP.py @@ -0,0 +1,77 @@ +# Copyright (C) 2005-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import binascii + +import dns.rdata +import dns.rdatatype + + +class SSHFP(dns.rdata.Rdata): + + """SSHFP record + + @ivar algorithm: the algorithm + @type algorithm: int + @ivar fp_type: the digest type + @type fp_type: int + @ivar fingerprint: the fingerprint + @type fingerprint: string + @see: draft-ietf-secsh-dns-05.txt""" + + __slots__ = ['algorithm', 'fp_type', 'fingerprint'] + + def __init__(self, rdclass, rdtype, algorithm, fp_type, + fingerprint): + super(SSHFP, self).__init__(rdclass, rdtype) + self.algorithm = algorithm + self.fp_type = fp_type + self.fingerprint = fingerprint + + def to_text(self, origin=None, relativize=True, **kw): + return '%d %d %s' % (self.algorithm, + self.fp_type, + dns.rdata._hexify(self.fingerprint, + chunksize=128)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + algorithm = tok.get_uint8() + fp_type = tok.get_uint8() + chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + chunks.append(t.value.encode()) + fingerprint = b''.join(chunks) + fingerprint = binascii.unhexlify(fingerprint) + return cls(rdclass, rdtype, algorithm, fp_type, fingerprint) + + def to_wire(self, file, compress=None, origin=None): + header = struct.pack("!BB", self.algorithm, self.fp_type) + file.write(header) + file.write(self.fingerprint) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + header = struct.unpack("!BB", wire[current: current + 2]) + current += 2 + rdlen -= 2 + fingerprint = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, header[0], header[1], fingerprint) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/TLSA.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/TLSA.py new file mode 100644 index 000000000..790a93b9d --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/TLSA.py @@ -0,0 +1,82 @@ +# Copyright (C) 2005-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import binascii + +import dns.rdata +import dns.rdatatype + + +class TLSA(dns.rdata.Rdata): + + """TLSA record + + @ivar usage: The certificate usage + @type usage: int + @ivar selector: The selector field + @type selector: int + @ivar mtype: The 'matching type' field + @type mtype: int + @ivar cert: The 'Certificate Association Data' field + @type cert: string + @see: RFC 6698""" + + __slots__ = ['usage', 'selector', 'mtype', 'cert'] + + def __init__(self, rdclass, rdtype, usage, selector, + mtype, cert): + super(TLSA, self).__init__(rdclass, rdtype) + self.usage = usage + self.selector = selector + self.mtype = mtype + self.cert = cert + + def to_text(self, origin=None, relativize=True, **kw): + return '%d %d %d %s' % (self.usage, + self.selector, + self.mtype, + dns.rdata._hexify(self.cert, + chunksize=128)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + usage = tok.get_uint8() + selector = tok.get_uint8() + mtype = tok.get_uint8() + cert_chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + cert_chunks.append(t.value.encode()) + cert = b''.join(cert_chunks) + cert = binascii.unhexlify(cert) + return cls(rdclass, rdtype, usage, selector, mtype, cert) + + def to_wire(self, file, compress=None, origin=None): + header = struct.pack("!BBB", self.usage, self.selector, self.mtype) + file.write(header) + file.write(self.cert) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + header = struct.unpack("!BBB", wire[current: current + 3]) + current += 3 + rdlen -= 3 + cert = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, header[0], header[1], header[2], cert) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/TXT.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/TXT.py new file mode 100644 index 000000000..6c7fa4502 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/TXT.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.txtbase + + +class TXT(dns.rdtypes.txtbase.TXTBase): + + """TXT record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/URI.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/URI.py new file mode 100644 index 000000000..b5595b510 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/URI.py @@ -0,0 +1,80 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# Copyright (C) 2015 Red Hat, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.name +from dns._compat import text_type + + +class URI(dns.rdata.Rdata): + + """URI record + + @ivar priority: the priority + @type priority: int + @ivar weight: the weight + @type weight: int + @ivar target: the target host + @type target: dns.name.Name object + @see: draft-faltstrom-uri-13""" + + __slots__ = ['priority', 'weight', 'target'] + + def __init__(self, rdclass, rdtype, priority, weight, target): + super(URI, self).__init__(rdclass, rdtype) + self.priority = priority + self.weight = weight + if len(target) < 1: + raise dns.exception.SyntaxError("URI target cannot be empty") + if isinstance(target, text_type): + self.target = target.encode() + else: + self.target = target + + def to_text(self, origin=None, relativize=True, **kw): + return '%d %d "%s"' % (self.priority, self.weight, + self.target.decode()) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + priority = tok.get_uint16() + weight = tok.get_uint16() + target = tok.get().unescape() + if not (target.is_quoted_string() or target.is_identifier()): + raise dns.exception.SyntaxError("URI target must be a string") + tok.get_eol() + return cls(rdclass, rdtype, priority, weight, target.value) + + def to_wire(self, file, compress=None, origin=None): + two_ints = struct.pack("!HH", self.priority, self.weight) + file.write(two_ints) + file.write(self.target) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + if rdlen < 5: + raise dns.exception.FormError('URI RR is shorter than 5 octets') + + (priority, weight) = struct.unpack('!HH', wire[current: current + 4]) + current += 4 + rdlen -= 4 + target = wire[current: current + rdlen] + current += rdlen + + return cls(rdclass, rdtype, priority, weight, target) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/X25.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/X25.py new file mode 100644 index 000000000..8732ccf0d --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/X25.py @@ -0,0 +1,64 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.tokenizer +from dns._compat import text_type + + +class X25(dns.rdata.Rdata): + + """X25 record + + @ivar address: the PSDN address + @type address: string + @see: RFC 1183""" + + __slots__ = ['address'] + + def __init__(self, rdclass, rdtype, address): + super(X25, self).__init__(rdclass, rdtype) + if isinstance(address, text_type): + self.address = address.encode() + else: + self.address = address + + def to_text(self, origin=None, relativize=True, **kw): + return '"%s"' % dns.rdata._escapify(self.address) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + address = tok.get_string() + tok.get_eol() + return cls(rdclass, rdtype, address) + + def to_wire(self, file, compress=None, origin=None): + l = len(self.address) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.address) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + l = wire[current] + current += 1 + rdlen -= 1 + if l != rdlen: + raise dns.exception.FormError + address = wire[current: current + l].unwrap() + return cls(rdclass, rdtype, address) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/__init__.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/__init__.py new file mode 100644 index 000000000..ea9c3e2e0 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/__init__.py @@ -0,0 +1,50 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Class ANY (generic) rdata type classes.""" + +__all__ = [ + 'AFSDB', + 'CDNSKEY', + 'CDS', + 'CERT', + 'CNAME', + 'DLV', + 'DNAME', + 'DNSKEY', + 'DS', + 'EUI48', + 'EUI64', + 'GPOS', + 'HINFO', + 'HIP', + 'ISDN', + 'LOC', + 'MX', + 'NS', + 'NSEC', + 'NSEC3', + 'NSEC3PARAM', + 'TLSA', + 'PTR', + 'RP', + 'RRSIG', + 'RT', + 'SOA', + 'SPF', + 'SSHFP', + 'TXT', + 'X25', +] diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/A.py b/Contents/Libraries/Shared/dns/rdtypes/IN/A.py new file mode 100644 index 000000000..3775548f2 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/A.py @@ -0,0 +1,52 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.exception +import dns.ipv4 +import dns.rdata +import dns.tokenizer + + +class A(dns.rdata.Rdata): + + """A record. + + @ivar address: an IPv4 address + @type address: string (in the standard "dotted quad" format)""" + + __slots__ = ['address'] + + def __init__(self, rdclass, rdtype, address): + super(A, self).__init__(rdclass, rdtype) + # check that it's OK + dns.ipv4.inet_aton(address) + self.address = address + + def to_text(self, origin=None, relativize=True, **kw): + return self.address + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + address = tok.get_identifier() + tok.get_eol() + return cls(rdclass, rdtype, address) + + def to_wire(self, file, compress=None, origin=None): + file.write(dns.ipv4.inet_aton(self.address)) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + address = dns.ipv4.inet_ntoa(wire[current: current + rdlen]).decode() + return cls(rdclass, rdtype, address) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/AAAA.py b/Contents/Libraries/Shared/dns/rdtypes/IN/AAAA.py new file mode 100644 index 000000000..4352404d7 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/AAAA.py @@ -0,0 +1,53 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.exception +import dns.inet +import dns.rdata +import dns.tokenizer + + +class AAAA(dns.rdata.Rdata): + + """AAAA record. + + @ivar address: an IPv6 address + @type address: string (in the standard IPv6 format)""" + + __slots__ = ['address'] + + def __init__(self, rdclass, rdtype, address): + super(AAAA, self).__init__(rdclass, rdtype) + # check that it's OK + dns.inet.inet_pton(dns.inet.AF_INET6, address) + self.address = address + + def to_text(self, origin=None, relativize=True, **kw): + return self.address + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + address = tok.get_identifier() + tok.get_eol() + return cls(rdclass, rdtype, address) + + def to_wire(self, file, compress=None, origin=None): + file.write(dns.inet.inet_pton(dns.inet.AF_INET6, self.address)) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + address = dns.inet.inet_ntop(dns.inet.AF_INET6, + wire[current: current + rdlen]) + return cls(rdclass, rdtype, address) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/APL.py b/Contents/Libraries/Shared/dns/rdtypes/IN/APL.py new file mode 100644 index 000000000..57ef6c0a9 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/APL.py @@ -0,0 +1,161 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import binascii + +import dns.exception +import dns.inet +import dns.rdata +import dns.tokenizer +from dns._compat import xrange + + +class APLItem(object): + + """An APL list item. + + @ivar family: the address family (IANA address family registry) + @type family: int + @ivar negation: is this item negated? + @type negation: bool + @ivar address: the address + @type address: string + @ivar prefix: the prefix length + @type prefix: int + """ + + __slots__ = ['family', 'negation', 'address', 'prefix'] + + def __init__(self, family, negation, address, prefix): + self.family = family + self.negation = negation + self.address = address + self.prefix = prefix + + def __str__(self): + if self.negation: + return "!%d:%s/%s" % (self.family, self.address, self.prefix) + else: + return "%d:%s/%s" % (self.family, self.address, self.prefix) + + def to_wire(self, file): + if self.family == 1: + address = dns.inet.inet_pton(dns.inet.AF_INET, self.address) + elif self.family == 2: + address = dns.inet.inet_pton(dns.inet.AF_INET6, self.address) + else: + address = binascii.unhexlify(self.address) + # + # Truncate least significant zero bytes. + # + last = 0 + for i in xrange(len(address) - 1, -1, -1): + if address[i] != chr(0): + last = i + 1 + break + address = address[0: last] + l = len(address) + assert l < 128 + if self.negation: + l |= 0x80 + header = struct.pack('!HBB', self.family, self.prefix, l) + file.write(header) + file.write(address) + + +class APL(dns.rdata.Rdata): + + """APL record. + + @ivar items: a list of APL items + @type items: list of APL_Item + @see: RFC 3123""" + + __slots__ = ['items'] + + def __init__(self, rdclass, rdtype, items): + super(APL, self).__init__(rdclass, rdtype) + self.items = items + + def to_text(self, origin=None, relativize=True, **kw): + return ' '.join(map(str, self.items)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + items = [] + while 1: + token = tok.get().unescape() + if token.is_eol_or_eof(): + break + item = token.value + if item[0] == '!': + negation = True + item = item[1:] + else: + negation = False + (family, rest) = item.split(':', 1) + family = int(family) + (address, prefix) = rest.split('/', 1) + prefix = int(prefix) + item = APLItem(family, negation, address, prefix) + items.append(item) + + return cls(rdclass, rdtype, items) + + def to_wire(self, file, compress=None, origin=None): + for item in self.items: + item.to_wire(file) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + items = [] + while 1: + if rdlen == 0: + break + if rdlen < 4: + raise dns.exception.FormError + header = struct.unpack('!HBB', wire[current: current + 4]) + afdlen = header[2] + if afdlen > 127: + negation = True + afdlen -= 128 + else: + negation = False + current += 4 + rdlen -= 4 + if rdlen < afdlen: + raise dns.exception.FormError + address = wire[current: current + afdlen].unwrap() + l = len(address) + if header[0] == 1: + if l < 4: + address += '\x00' * (4 - l) + address = dns.inet.inet_ntop(dns.inet.AF_INET, address) + elif header[0] == 2: + if l < 16: + address += '\x00' * (16 - l) + address = dns.inet.inet_ntop(dns.inet.AF_INET6, address) + else: + # + # This isn't really right according to the RFC, but it + # seems better than throwing an exception + # + address = address.encode('hex_codec') + current += afdlen + rdlen -= afdlen + item = APLItem(header[0], negation, address, header[1]) + items.append(item) + return cls(rdclass, rdtype, items) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/DHCID.py b/Contents/Libraries/Shared/dns/rdtypes/IN/DHCID.py new file mode 100644 index 000000000..5b8626a5a --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/DHCID.py @@ -0,0 +1,59 @@ +# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import base64 + +import dns.exception + + +class DHCID(dns.rdata.Rdata): + + """DHCID record + + @ivar data: the data (the content of the RR is opaque as far as the + DNS is concerned) + @type data: string + @see: RFC 4701""" + + __slots__ = ['data'] + + def __init__(self, rdclass, rdtype, data): + super(DHCID, self).__init__(rdclass, rdtype) + self.data = data + + def to_text(self, origin=None, relativize=True, **kw): + return dns.rdata._base64ify(self.data) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + chunks.append(t.value.encode()) + b64 = b''.join(chunks) + data = base64.b64decode(b64) + return cls(rdclass, rdtype, data) + + def to_wire(self, file, compress=None, origin=None): + file.write(self.data) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + data = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, data) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/IPSECKEY.py b/Contents/Libraries/Shared/dns/rdtypes/IN/IPSECKEY.py new file mode 100644 index 000000000..c673e839d --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/IPSECKEY.py @@ -0,0 +1,148 @@ +# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import base64 + +import dns.exception +import dns.inet +import dns.name + + +class IPSECKEY(dns.rdata.Rdata): + + """IPSECKEY record + + @ivar precedence: the precedence for this key data + @type precedence: int + @ivar gateway_type: the gateway type + @type gateway_type: int + @ivar algorithm: the algorithm to use + @type algorithm: int + @ivar gateway: the public key + @type gateway: None, IPv4 address, IPV6 address, or domain name + @ivar key: the public key + @type key: string + @see: RFC 4025""" + + __slots__ = ['precedence', 'gateway_type', 'algorithm', 'gateway', 'key'] + + def __init__(self, rdclass, rdtype, precedence, gateway_type, algorithm, + gateway, key): + super(IPSECKEY, self).__init__(rdclass, rdtype) + if gateway_type == 0: + if gateway != '.' and gateway is not None: + raise SyntaxError('invalid gateway for gateway type 0') + gateway = None + elif gateway_type == 1: + # check that it's OK + dns.inet.inet_pton(dns.inet.AF_INET, gateway) + elif gateway_type == 2: + # check that it's OK + dns.inet.inet_pton(dns.inet.AF_INET6, gateway) + elif gateway_type == 3: + pass + else: + raise SyntaxError( + 'invalid IPSECKEY gateway type: %d' % gateway_type) + self.precedence = precedence + self.gateway_type = gateway_type + self.algorithm = algorithm + self.gateway = gateway + self.key = key + + def to_text(self, origin=None, relativize=True, **kw): + if self.gateway_type == 0: + gateway = '.' + elif self.gateway_type == 1: + gateway = self.gateway + elif self.gateway_type == 2: + gateway = self.gateway + elif self.gateway_type == 3: + gateway = str(self.gateway.choose_relativity(origin, relativize)) + else: + raise ValueError('invalid gateway type') + return '%d %d %d %s %s' % (self.precedence, self.gateway_type, + self.algorithm, gateway, + dns.rdata._base64ify(self.key)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + precedence = tok.get_uint8() + gateway_type = tok.get_uint8() + algorithm = tok.get_uint8() + if gateway_type == 3: + gateway = tok.get_name().choose_relativity(origin, relativize) + else: + gateway = tok.get_string() + chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + chunks.append(t.value.encode()) + b64 = b''.join(chunks) + key = base64.b64decode(b64) + return cls(rdclass, rdtype, precedence, gateway_type, algorithm, + gateway, key) + + def to_wire(self, file, compress=None, origin=None): + header = struct.pack("!BBB", self.precedence, self.gateway_type, + self.algorithm) + file.write(header) + if self.gateway_type == 0: + pass + elif self.gateway_type == 1: + file.write(dns.inet.inet_pton(dns.inet.AF_INET, self.gateway)) + elif self.gateway_type == 2: + file.write(dns.inet.inet_pton(dns.inet.AF_INET6, self.gateway)) + elif self.gateway_type == 3: + self.gateway.to_wire(file, None, origin) + else: + raise ValueError('invalid gateway type') + file.write(self.key) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + if rdlen < 3: + raise dns.exception.FormError + header = struct.unpack('!BBB', wire[current: current + 3]) + gateway_type = header[1] + current += 3 + rdlen -= 3 + if gateway_type == 0: + gateway = None + elif gateway_type == 1: + gateway = dns.inet.inet_ntop(dns.inet.AF_INET, + wire[current: current + 4]) + current += 4 + rdlen -= 4 + elif gateway_type == 2: + gateway = dns.inet.inet_ntop(dns.inet.AF_INET6, + wire[current: current + 16]) + current += 16 + rdlen -= 16 + elif gateway_type == 3: + (gateway, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + current += cused + rdlen -= cused + else: + raise dns.exception.FormError('invalid IPSECKEY gateway type') + key = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, header[0], gateway_type, header[2], + gateway, key) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/KX.py b/Contents/Libraries/Shared/dns/rdtypes/IN/KX.py new file mode 100644 index 000000000..adbfe34b1 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/KX.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.mxbase + + +class KX(dns.rdtypes.mxbase.UncompressedMX): + + """KX record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/NAPTR.py b/Contents/Libraries/Shared/dns/rdtypes/IN/NAPTR.py new file mode 100644 index 000000000..5ae2feb15 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/NAPTR.py @@ -0,0 +1,125 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.name +import dns.rdata +from dns._compat import xrange, text_type + + +def _write_string(file, s): + l = len(s) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(s) + + +def _sanitize(value): + if isinstance(value, text_type): + return value.encode() + return value + + +class NAPTR(dns.rdata.Rdata): + + """NAPTR record + + @ivar order: order + @type order: int + @ivar preference: preference + @type preference: int + @ivar flags: flags + @type flags: string + @ivar service: service + @type service: string + @ivar regexp: regular expression + @type regexp: string + @ivar replacement: replacement name + @type replacement: dns.name.Name object + @see: RFC 3403""" + + __slots__ = ['order', 'preference', 'flags', 'service', 'regexp', + 'replacement'] + + def __init__(self, rdclass, rdtype, order, preference, flags, service, + regexp, replacement): + super(NAPTR, self).__init__(rdclass, rdtype) + self.flags = _sanitize(flags) + self.service = _sanitize(service) + self.regexp = _sanitize(regexp) + self.order = order + self.preference = preference + self.replacement = replacement + + def to_text(self, origin=None, relativize=True, **kw): + replacement = self.replacement.choose_relativity(origin, relativize) + return '%d %d "%s" "%s" "%s" %s' % \ + (self.order, self.preference, + dns.rdata._escapify(self.flags), + dns.rdata._escapify(self.service), + dns.rdata._escapify(self.regexp), + replacement) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + order = tok.get_uint16() + preference = tok.get_uint16() + flags = tok.get_string() + service = tok.get_string() + regexp = tok.get_string() + replacement = tok.get_name() + replacement = replacement.choose_relativity(origin, relativize) + tok.get_eol() + return cls(rdclass, rdtype, order, preference, flags, service, + regexp, replacement) + + def to_wire(self, file, compress=None, origin=None): + two_ints = struct.pack("!HH", self.order, self.preference) + file.write(two_ints) + _write_string(file, self.flags) + _write_string(file, self.service) + _write_string(file, self.regexp) + self.replacement.to_wire(file, compress, origin) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (order, preference) = struct.unpack('!HH', wire[current: current + 4]) + current += 4 + rdlen -= 4 + strings = [] + for i in xrange(3): + l = wire[current] + current += 1 + rdlen -= 1 + if l > rdlen or rdlen < 0: + raise dns.exception.FormError + s = wire[current: current + l].unwrap() + current += l + rdlen -= l + strings.append(s) + (replacement, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + if cused != rdlen: + raise dns.exception.FormError + if origin is not None: + replacement = replacement.relativize(origin) + return cls(rdclass, rdtype, order, preference, strings[0], strings[1], + strings[2], replacement) + + def choose_relativity(self, origin=None, relativize=True): + self.replacement = self.replacement.choose_relativity(origin, + relativize) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/NSAP.py b/Contents/Libraries/Shared/dns/rdtypes/IN/NSAP.py new file mode 100644 index 000000000..05d0745ef --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/NSAP.py @@ -0,0 +1,58 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import binascii + +import dns.exception +import dns.rdata +import dns.tokenizer + + +class NSAP(dns.rdata.Rdata): + + """NSAP record. + + @ivar address: a NASP + @type address: string + @see: RFC 1706""" + + __slots__ = ['address'] + + def __init__(self, rdclass, rdtype, address): + super(NSAP, self).__init__(rdclass, rdtype) + self.address = address + + def to_text(self, origin=None, relativize=True, **kw): + return "0x%s" % binascii.hexlify(self.address).decode() + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + address = tok.get_string() + tok.get_eol() + if address[0:2] != '0x': + raise dns.exception.SyntaxError('string does not start with 0x') + address = address[2:].replace('.', '') + if len(address) % 2 != 0: + raise dns.exception.SyntaxError('hexstring has odd length') + address = binascii.unhexlify(address.encode()) + return cls(rdclass, rdtype, address) + + def to_wire(self, file, compress=None, origin=None): + file.write(self.address) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + address = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, address) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/NSAP_PTR.py b/Contents/Libraries/Shared/dns/rdtypes/IN/NSAP_PTR.py new file mode 100644 index 000000000..56967df02 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/NSAP_PTR.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.nsbase + + +class NSAP_PTR(dns.rdtypes.nsbase.UncompressedNS): + + """NSAP-PTR record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/PX.py b/Contents/Libraries/Shared/dns/rdtypes/IN/PX.py new file mode 100644 index 000000000..e1ef102b1 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/PX.py @@ -0,0 +1,87 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.name + + +class PX(dns.rdata.Rdata): + + """PX record. + + @ivar preference: the preference value + @type preference: int + @ivar map822: the map822 name + @type map822: dns.name.Name object + @ivar mapx400: the mapx400 name + @type mapx400: dns.name.Name object + @see: RFC 2163""" + + __slots__ = ['preference', 'map822', 'mapx400'] + + def __init__(self, rdclass, rdtype, preference, map822, mapx400): + super(PX, self).__init__(rdclass, rdtype) + self.preference = preference + self.map822 = map822 + self.mapx400 = mapx400 + + def to_text(self, origin=None, relativize=True, **kw): + map822 = self.map822.choose_relativity(origin, relativize) + mapx400 = self.mapx400.choose_relativity(origin, relativize) + return '%d %s %s' % (self.preference, map822, mapx400) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + preference = tok.get_uint16() + map822 = tok.get_name() + map822 = map822.choose_relativity(origin, relativize) + mapx400 = tok.get_name(None) + mapx400 = mapx400.choose_relativity(origin, relativize) + tok.get_eol() + return cls(rdclass, rdtype, preference, map822, mapx400) + + def to_wire(self, file, compress=None, origin=None): + pref = struct.pack("!H", self.preference) + file.write(pref) + self.map822.to_wire(file, None, origin) + self.mapx400.to_wire(file, None, origin) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (preference, ) = struct.unpack('!H', wire[current: current + 2]) + current += 2 + rdlen -= 2 + (map822, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + if cused > rdlen: + raise dns.exception.FormError + current += cused + rdlen -= cused + if origin is not None: + map822 = map822.relativize(origin) + (mapx400, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + if cused != rdlen: + raise dns.exception.FormError + if origin is not None: + mapx400 = mapx400.relativize(origin) + return cls(rdclass, rdtype, preference, map822, mapx400) + + def choose_relativity(self, origin=None, relativize=True): + self.map822 = self.map822.choose_relativity(origin, relativize) + self.mapx400 = self.mapx400.choose_relativity(origin, relativize) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/SRV.py b/Contents/Libraries/Shared/dns/rdtypes/IN/SRV.py new file mode 100644 index 000000000..f4396d614 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/SRV.py @@ -0,0 +1,81 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.name + + +class SRV(dns.rdata.Rdata): + + """SRV record + + @ivar priority: the priority + @type priority: int + @ivar weight: the weight + @type weight: int + @ivar port: the port of the service + @type port: int + @ivar target: the target host + @type target: dns.name.Name object + @see: RFC 2782""" + + __slots__ = ['priority', 'weight', 'port', 'target'] + + def __init__(self, rdclass, rdtype, priority, weight, port, target): + super(SRV, self).__init__(rdclass, rdtype) + self.priority = priority + self.weight = weight + self.port = port + self.target = target + + def to_text(self, origin=None, relativize=True, **kw): + target = self.target.choose_relativity(origin, relativize) + return '%d %d %d %s' % (self.priority, self.weight, self.port, + target) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + priority = tok.get_uint16() + weight = tok.get_uint16() + port = tok.get_uint16() + target = tok.get_name(None) + target = target.choose_relativity(origin, relativize) + tok.get_eol() + return cls(rdclass, rdtype, priority, weight, port, target) + + def to_wire(self, file, compress=None, origin=None): + three_ints = struct.pack("!HHH", self.priority, self.weight, self.port) + file.write(three_ints) + self.target.to_wire(file, compress, origin) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (priority, weight, port) = struct.unpack('!HHH', + wire[current: current + 6]) + current += 6 + rdlen -= 6 + (target, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + if cused != rdlen: + raise dns.exception.FormError + if origin is not None: + target = target.relativize(origin) + return cls(rdclass, rdtype, priority, weight, port, target) + + def choose_relativity(self, origin=None, relativize=True): + self.target = self.target.choose_relativity(origin, relativize) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/WKS.py b/Contents/Libraries/Shared/dns/rdtypes/IN/WKS.py new file mode 100644 index 000000000..1d4012c30 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/WKS.py @@ -0,0 +1,105 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import socket +import struct + +import dns.ipv4 +import dns.rdata +from dns._compat import xrange + +_proto_tcp = socket.getprotobyname('tcp') +_proto_udp = socket.getprotobyname('udp') + + +class WKS(dns.rdata.Rdata): + + """WKS record + + @ivar address: the address + @type address: string + @ivar protocol: the protocol + @type protocol: int + @ivar bitmap: the bitmap + @type bitmap: string + @see: RFC 1035""" + + __slots__ = ['address', 'protocol', 'bitmap'] + + def __init__(self, rdclass, rdtype, address, protocol, bitmap): + super(WKS, self).__init__(rdclass, rdtype) + self.address = address + self.protocol = protocol + if not isinstance(bitmap, bytearray): + self.bitmap = bytearray(bitmap) + else: + self.bitmap = bitmap + + def to_text(self, origin=None, relativize=True, **kw): + bits = [] + for i in xrange(0, len(self.bitmap)): + byte = self.bitmap[i] + for j in xrange(0, 8): + if byte & (0x80 >> j): + bits.append(str(i * 8 + j)) + text = ' '.join(bits) + return '%s %d %s' % (self.address, self.protocol, text) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + address = tok.get_string() + protocol = tok.get_string() + if protocol.isdigit(): + protocol = int(protocol) + else: + protocol = socket.getprotobyname(protocol) + bitmap = bytearray() + while 1: + token = tok.get().unescape() + if token.is_eol_or_eof(): + break + if token.value.isdigit(): + serv = int(token.value) + else: + if protocol != _proto_udp and protocol != _proto_tcp: + raise NotImplementedError("protocol must be TCP or UDP") + if protocol == _proto_udp: + protocol_text = "udp" + else: + protocol_text = "tcp" + serv = socket.getservbyname(token.value, protocol_text) + i = serv // 8 + l = len(bitmap) + if l < i + 1: + for j in xrange(l, i + 1): + bitmap.append(0) + bitmap[i] = bitmap[i] | (0x80 >> (serv % 8)) + bitmap = dns.rdata._truncate_bitmap(bitmap) + return cls(rdclass, rdtype, address, protocol, bitmap) + + def to_wire(self, file, compress=None, origin=None): + file.write(dns.ipv4.inet_aton(self.address)) + protocol = struct.pack('!B', self.protocol) + file.write(protocol) + file.write(self.bitmap) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + address = dns.ipv4.inet_ntoa(wire[current: current + 4]) + protocol, = struct.unpack('!B', wire[current + 4: current + 5]) + current += 5 + rdlen -= 5 + bitmap = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, address, protocol, bitmap) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/__init__.py b/Contents/Libraries/Shared/dns/rdtypes/IN/__init__.py new file mode 100644 index 000000000..24cf1ece4 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/__init__.py @@ -0,0 +1,30 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Class IN rdata type classes.""" + +__all__ = [ + 'A', + 'AAAA', + 'APL', + 'DHCID', + 'KX', + 'NAPTR', + 'NSAP', + 'NSAP_PTR', + 'PX', + 'SRV', + 'WKS', +] diff --git a/Contents/Libraries/Shared/dns/rdtypes/__init__.py b/Contents/Libraries/Shared/dns/rdtypes/__init__.py new file mode 100644 index 000000000..826efbb6c --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/__init__.py @@ -0,0 +1,24 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS rdata type classes""" + +__all__ = [ + 'ANY', + 'IN', + 'euibase', + 'mxbase', + 'nsbase', +] diff --git a/Contents/Libraries/Shared/dns/rdtypes/dnskeybase.py b/Contents/Libraries/Shared/dns/rdtypes/dnskeybase.py new file mode 100644 index 000000000..85c4b23f0 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/dnskeybase.py @@ -0,0 +1,136 @@ +# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import base64 +import struct + +import dns.exception +import dns.dnssec +import dns.rdata + +# wildcard import +__all__ = ["SEP", "REVOKE", "ZONE", + "flags_to_text_set", "flags_from_text_set"] + +# flag constants +SEP = 0x0001 +REVOKE = 0x0080 +ZONE = 0x0100 + +_flag_by_text = { + 'SEP': SEP, + 'REVOKE': REVOKE, + 'ZONE': ZONE +} + +# We construct the inverse mapping programmatically to ensure that we +# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that +# would cause the mapping not to be true inverse. +_flag_by_value = dict((y, x) for x, y in _flag_by_text.items()) + + +def flags_to_text_set(flags): + """Convert a DNSKEY flags value to set texts + @rtype: set([string])""" + + flags_set = set() + mask = 0x1 + while mask <= 0x8000: + if flags & mask: + text = _flag_by_value.get(mask) + if not text: + text = hex(mask) + flags_set.add(text) + mask <<= 1 + return flags_set + + +def flags_from_text_set(texts_set): + """Convert set of DNSKEY flag mnemonic texts to DNSKEY flag value + @rtype: int""" + + flags = 0 + for text in texts_set: + try: + flags += _flag_by_text[text] + except KeyError: + raise NotImplementedError( + "DNSKEY flag '%s' is not supported" % text) + return flags + + +class DNSKEYBase(dns.rdata.Rdata): + + """Base class for rdata that is like a DNSKEY record + + @ivar flags: the key flags + @type flags: int + @ivar protocol: the protocol for which this key may be used + @type protocol: int + @ivar algorithm: the algorithm used for the key + @type algorithm: int + @ivar key: the public key + @type key: string""" + + __slots__ = ['flags', 'protocol', 'algorithm', 'key'] + + def __init__(self, rdclass, rdtype, flags, protocol, algorithm, key): + super(DNSKEYBase, self).__init__(rdclass, rdtype) + self.flags = flags + self.protocol = protocol + self.algorithm = algorithm + self.key = key + + def to_text(self, origin=None, relativize=True, **kw): + return '%d %d %d %s' % (self.flags, self.protocol, self.algorithm, + dns.rdata._base64ify(self.key)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + flags = tok.get_uint16() + protocol = tok.get_uint8() + algorithm = dns.dnssec.algorithm_from_text(tok.get_string()) + chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + chunks.append(t.value.encode()) + b64 = b''.join(chunks) + key = base64.b64decode(b64) + return cls(rdclass, rdtype, flags, protocol, algorithm, key) + + def to_wire(self, file, compress=None, origin=None): + header = struct.pack("!HBB", self.flags, self.protocol, self.algorithm) + file.write(header) + file.write(self.key) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + if rdlen < 4: + raise dns.exception.FormError + header = struct.unpack('!HBB', wire[current: current + 4]) + current += 4 + rdlen -= 4 + key = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, header[0], header[1], header[2], + key) + + def flags_to_text_set(self): + """Convert a DNSKEY flags value to set texts + @rtype: set([string])""" + return flags_to_text_set(self.flags) diff --git a/Contents/Libraries/Shared/dns/rdtypes/dsbase.py b/Contents/Libraries/Shared/dns/rdtypes/dsbase.py new file mode 100644 index 000000000..1ee28e4a3 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/dsbase.py @@ -0,0 +1,83 @@ +# Copyright (C) 2010, 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import binascii + +import dns.rdata +import dns.rdatatype + + +class DSBase(dns.rdata.Rdata): + + """Base class for rdata that is like a DS record + + @ivar key_tag: the key tag + @type key_tag: int + @ivar algorithm: the algorithm + @type algorithm: int + @ivar digest_type: the digest type + @type digest_type: int + @ivar digest: the digest + @type digest: int + @see: draft-ietf-dnsext-delegation-signer-14.txt""" + + __slots__ = ['key_tag', 'algorithm', 'digest_type', 'digest'] + + def __init__(self, rdclass, rdtype, key_tag, algorithm, digest_type, + digest): + super(DSBase, self).__init__(rdclass, rdtype) + self.key_tag = key_tag + self.algorithm = algorithm + self.digest_type = digest_type + self.digest = digest + + def to_text(self, origin=None, relativize=True, **kw): + return '%d %d %d %s' % (self.key_tag, self.algorithm, + self.digest_type, + dns.rdata._hexify(self.digest, + chunksize=128)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + key_tag = tok.get_uint16() + algorithm = tok.get_uint8() + digest_type = tok.get_uint8() + chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + chunks.append(t.value.encode()) + digest = b''.join(chunks) + digest = binascii.unhexlify(digest) + return cls(rdclass, rdtype, key_tag, algorithm, digest_type, + digest) + + def to_wire(self, file, compress=None, origin=None): + header = struct.pack("!HBB", self.key_tag, self.algorithm, + self.digest_type) + file.write(header) + file.write(self.digest) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + header = struct.unpack("!HBB", wire[current: current + 4]) + current += 4 + rdlen -= 4 + digest = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, header[0], header[1], header[2], digest) diff --git a/Contents/Libraries/Shared/dns/rdtypes/euibase.py b/Contents/Libraries/Shared/dns/rdtypes/euibase.py new file mode 100644 index 000000000..cc5fdaa63 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/euibase.py @@ -0,0 +1,71 @@ +# Copyright (C) 2015 Red Hat, Inc. +# Author: Petr Spacek +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import binascii + +import dns.rdata +from dns._compat import xrange + + +class EUIBase(dns.rdata.Rdata): + + """EUIxx record + + @ivar fingerprint: xx-bit Extended Unique Identifier (EUI-xx) + @type fingerprint: string + @see: rfc7043.txt""" + + __slots__ = ['eui'] + # define these in subclasses + # byte_len = 6 # 0123456789ab (in hex) + # text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab + + def __init__(self, rdclass, rdtype, eui): + super(EUIBase, self).__init__(rdclass, rdtype) + if len(eui) != self.byte_len: + raise dns.exception.FormError('EUI%s rdata has to have %s bytes' + % (self.byte_len * 8, self.byte_len)) + self.eui = eui + + def to_text(self, origin=None, relativize=True, **kw): + return dns.rdata._hexify(self.eui, chunksize=2).replace(' ', '-') + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + text = tok.get_string() + tok.get_eol() + if len(text) != cls.text_len: + raise dns.exception.SyntaxError( + 'Input text must have %s characters' % cls.text_len) + expected_dash_idxs = xrange(2, cls.byte_len * 3 - 1, 3) + for i in expected_dash_idxs: + if text[i] != '-': + raise dns.exception.SyntaxError('Dash expected at position %s' + % i) + text = text.replace('-', '') + try: + data = binascii.unhexlify(text.encode()) + except (ValueError, TypeError) as ex: + raise dns.exception.SyntaxError('Hex decoding error: %s' % str(ex)) + return cls(rdclass, rdtype, data) + + def to_wire(self, file, compress=None, origin=None): + file.write(self.eui) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + eui = wire[current:current + rdlen].unwrap() + return cls(rdclass, rdtype, eui) diff --git a/Contents/Libraries/Shared/dns/rdtypes/mxbase.py b/Contents/Libraries/Shared/dns/rdtypes/mxbase.py new file mode 100644 index 000000000..5ac8cef9e --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/mxbase.py @@ -0,0 +1,101 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""MX-like base classes.""" + +from io import BytesIO +import struct + +import dns.exception +import dns.rdata +import dns.name + + +class MXBase(dns.rdata.Rdata): + + """Base class for rdata that is like an MX record. + + @ivar preference: the preference value + @type preference: int + @ivar exchange: the exchange name + @type exchange: dns.name.Name object""" + + __slots__ = ['preference', 'exchange'] + + def __init__(self, rdclass, rdtype, preference, exchange): + super(MXBase, self).__init__(rdclass, rdtype) + self.preference = preference + self.exchange = exchange + + def to_text(self, origin=None, relativize=True, **kw): + exchange = self.exchange.choose_relativity(origin, relativize) + return '%d %s' % (self.preference, exchange) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + preference = tok.get_uint16() + exchange = tok.get_name() + exchange = exchange.choose_relativity(origin, relativize) + tok.get_eol() + return cls(rdclass, rdtype, preference, exchange) + + def to_wire(self, file, compress=None, origin=None): + pref = struct.pack("!H", self.preference) + file.write(pref) + self.exchange.to_wire(file, compress, origin) + + def to_digestable(self, origin=None): + return struct.pack("!H", self.preference) + \ + self.exchange.to_digestable(origin) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (preference, ) = struct.unpack('!H', wire[current: current + 2]) + current += 2 + rdlen -= 2 + (exchange, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + if cused != rdlen: + raise dns.exception.FormError + if origin is not None: + exchange = exchange.relativize(origin) + return cls(rdclass, rdtype, preference, exchange) + + def choose_relativity(self, origin=None, relativize=True): + self.exchange = self.exchange.choose_relativity(origin, relativize) + + +class UncompressedMX(MXBase): + + """Base class for rdata that is like an MX record, but whose name + is not compressed when converted to DNS wire format, and whose + digestable form is not downcased.""" + + def to_wire(self, file, compress=None, origin=None): + super(UncompressedMX, self).to_wire(file, None, origin) + + def to_digestable(self, origin=None): + f = BytesIO() + self.to_wire(f, None, origin) + return f.getvalue() + + +class UncompressedDowncasingMX(MXBase): + + """Base class for rdata that is like an MX record, but whose name + is not compressed when convert to DNS wire format.""" + + def to_wire(self, file, compress=None, origin=None): + super(UncompressedDowncasingMX, self).to_wire(file, None, origin) diff --git a/Contents/Libraries/Shared/dns/rdtypes/nsbase.py b/Contents/Libraries/Shared/dns/rdtypes/nsbase.py new file mode 100644 index 000000000..79333a140 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/nsbase.py @@ -0,0 +1,81 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""NS-like base classes.""" + +from io import BytesIO + +import dns.exception +import dns.rdata +import dns.name + + +class NSBase(dns.rdata.Rdata): + + """Base class for rdata that is like an NS record. + + @ivar target: the target name of the rdata + @type target: dns.name.Name object""" + + __slots__ = ['target'] + + def __init__(self, rdclass, rdtype, target): + super(NSBase, self).__init__(rdclass, rdtype) + self.target = target + + def to_text(self, origin=None, relativize=True, **kw): + target = self.target.choose_relativity(origin, relativize) + return str(target) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + target = tok.get_name() + target = target.choose_relativity(origin, relativize) + tok.get_eol() + return cls(rdclass, rdtype, target) + + def to_wire(self, file, compress=None, origin=None): + self.target.to_wire(file, compress, origin) + + def to_digestable(self, origin=None): + return self.target.to_digestable(origin) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (target, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + if cused != rdlen: + raise dns.exception.FormError + if origin is not None: + target = target.relativize(origin) + return cls(rdclass, rdtype, target) + + def choose_relativity(self, origin=None, relativize=True): + self.target = self.target.choose_relativity(origin, relativize) + + +class UncompressedNS(NSBase): + + """Base class for rdata that is like an NS record, but whose name + is not compressed when convert to DNS wire format, and whose + digestable form is not downcased.""" + + def to_wire(self, file, compress=None, origin=None): + super(UncompressedNS, self).to_wire(file, None, origin) + + def to_digestable(self, origin=None): + f = BytesIO() + self.to_wire(f, None, origin) + return f.getvalue() diff --git a/Contents/Libraries/Shared/dns/rdtypes/txtbase.py b/Contents/Libraries/Shared/dns/rdtypes/txtbase.py new file mode 100644 index 000000000..352b027bf --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/txtbase.py @@ -0,0 +1,90 @@ +# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""TXT-like base class.""" + +import struct + +import dns.exception +import dns.rdata +import dns.tokenizer +from dns._compat import binary_type + + +class TXTBase(dns.rdata.Rdata): + + """Base class for rdata that is like a TXT record + + @ivar strings: the text strings + @type strings: list of string + @see: RFC 1035""" + + __slots__ = ['strings'] + + def __init__(self, rdclass, rdtype, strings): + super(TXTBase, self).__init__(rdclass, rdtype) + if isinstance(strings, str): + strings = [strings] + self.strings = strings[:] + + def to_text(self, origin=None, relativize=True, **kw): + txt = '' + prefix = '' + for s in self.strings: + txt += '%s"%s"' % (prefix, dns.rdata._escapify(s)) + prefix = ' ' + return txt + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + strings = [] + while 1: + token = tok.get().unescape() + if token.is_eol_or_eof(): + break + if not (token.is_quoted_string() or token.is_identifier()): + raise dns.exception.SyntaxError("expected a string") + if len(token.value) > 255: + raise dns.exception.SyntaxError("string too long") + value = token.value + if isinstance(value, binary_type): + strings.append(value) + else: + strings.append(value.encode()) + if len(strings) == 0: + raise dns.exception.UnexpectedEnd + return cls(rdclass, rdtype, strings) + + def to_wire(self, file, compress=None, origin=None): + for s in self.strings: + l = len(s) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(s) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + strings = [] + while rdlen > 0: + l = wire[current] + current += 1 + rdlen -= 1 + if l > rdlen: + raise dns.exception.FormError + s = wire[current: current + l].unwrap() + current += l + rdlen -= l + strings.append(s) + return cls(rdclass, rdtype, strings) diff --git a/Contents/Libraries/Shared/dns/renderer.py b/Contents/Libraries/Shared/dns/renderer.py new file mode 100644 index 000000000..670fb28fa --- /dev/null +++ b/Contents/Libraries/Shared/dns/renderer.py @@ -0,0 +1,329 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Help for building DNS wire format messages""" + +from io import BytesIO +import struct +import random +import time + +import dns.exception +import dns.tsig +from ._compat import long + + +QUESTION = 0 +ANSWER = 1 +AUTHORITY = 2 +ADDITIONAL = 3 + + +class Renderer(object): + + """Helper class for building DNS wire-format messages. + + Most applications can use the higher-level L{dns.message.Message} + class and its to_wire() method to generate wire-format messages. + This class is for those applications which need finer control + over the generation of messages. + + Typical use:: + + r = dns.renderer.Renderer(id=1, flags=0x80, max_size=512) + r.add_question(qname, qtype, qclass) + r.add_rrset(dns.renderer.ANSWER, rrset_1) + r.add_rrset(dns.renderer.ANSWER, rrset_2) + r.add_rrset(dns.renderer.AUTHORITY, ns_rrset) + r.add_edns(0, 0, 4096) + r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_1) + r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_2) + r.write_header() + r.add_tsig(keyname, secret, 300, 1, 0, '', request_mac) + wire = r.get_wire() + + @ivar output: where rendering is written + @type output: BytesIO object + @ivar id: the message id + @type id: int + @ivar flags: the message flags + @type flags: int + @ivar max_size: the maximum size of the message + @type max_size: int + @ivar origin: the origin to use when rendering relative names + @type origin: dns.name.Name object + @ivar compress: the compression table + @type compress: dict + @ivar section: the section currently being rendered + @type section: int (dns.renderer.QUESTION, dns.renderer.ANSWER, + dns.renderer.AUTHORITY, or dns.renderer.ADDITIONAL) + @ivar counts: list of the number of RRs in each section + @type counts: int list of length 4 + @ivar mac: the MAC of the rendered message (if TSIG was used) + @type mac: string + """ + + def __init__(self, id=None, flags=0, max_size=65535, origin=None): + """Initialize a new renderer. + + @param id: the message id + @type id: int + @param flags: the DNS message flags + @type flags: int + @param max_size: the maximum message size; the default is 65535. + If rendering results in a message greater than I{max_size}, + then L{dns.exception.TooBig} will be raised. + @type max_size: int + @param origin: the origin to use when rendering relative names + @type origin: dns.name.Name or None. + """ + + self.output = BytesIO() + if id is None: + self.id = random.randint(0, 65535) + else: + self.id = id + self.flags = flags + self.max_size = max_size + self.origin = origin + self.compress = {} + self.section = QUESTION + self.counts = [0, 0, 0, 0] + self.output.write(b'\x00' * 12) + self.mac = '' + + def _rollback(self, where): + """Truncate the output buffer at offset I{where}, and remove any + compression table entries that pointed beyond the truncation + point. + + @param where: the offset + @type where: int + """ + + self.output.seek(where) + self.output.truncate() + keys_to_delete = [] + for k, v in self.compress.items(): + if v >= where: + keys_to_delete.append(k) + for k in keys_to_delete: + del self.compress[k] + + def _set_section(self, section): + """Set the renderer's current section. + + Sections must be rendered order: QUESTION, ANSWER, AUTHORITY, + ADDITIONAL. Sections may be empty. + + @param section: the section + @type section: int + @raises dns.exception.FormError: an attempt was made to set + a section value less than the current section. + """ + + if self.section != section: + if self.section > section: + raise dns.exception.FormError + self.section = section + + def add_question(self, qname, rdtype, rdclass=dns.rdataclass.IN): + """Add a question to the message. + + @param qname: the question name + @type qname: dns.name.Name + @param rdtype: the question rdata type + @type rdtype: int + @param rdclass: the question rdata class + @type rdclass: int + """ + + self._set_section(QUESTION) + before = self.output.tell() + qname.to_wire(self.output, self.compress, self.origin) + self.output.write(struct.pack("!HH", rdtype, rdclass)) + after = self.output.tell() + if after >= self.max_size: + self._rollback(before) + raise dns.exception.TooBig + self.counts[QUESTION] += 1 + + def add_rrset(self, section, rrset, **kw): + """Add the rrset to the specified section. + + Any keyword arguments are passed on to the rdataset's to_wire() + routine. + + @param section: the section + @type section: int + @param rrset: the rrset + @type rrset: dns.rrset.RRset object + """ + + self._set_section(section) + before = self.output.tell() + n = rrset.to_wire(self.output, self.compress, self.origin, **kw) + after = self.output.tell() + if after >= self.max_size: + self._rollback(before) + raise dns.exception.TooBig + self.counts[section] += n + + def add_rdataset(self, section, name, rdataset, **kw): + """Add the rdataset to the specified section, using the specified + name as the owner name. + + Any keyword arguments are passed on to the rdataset's to_wire() + routine. + + @param section: the section + @type section: int + @param name: the owner name + @type name: dns.name.Name object + @param rdataset: the rdataset + @type rdataset: dns.rdataset.Rdataset object + """ + + self._set_section(section) + before = self.output.tell() + n = rdataset.to_wire(name, self.output, self.compress, self.origin, + **kw) + after = self.output.tell() + if after >= self.max_size: + self._rollback(before) + raise dns.exception.TooBig + self.counts[section] += n + + def add_edns(self, edns, ednsflags, payload, options=None): + """Add an EDNS OPT record to the message. + + @param edns: The EDNS level to use. + @type edns: int + @param ednsflags: EDNS flag values. + @type ednsflags: int + @param payload: The EDNS sender's payload field, which is the maximum + size of UDP datagram the sender can handle. + @type payload: int + @param options: The EDNS options list + @type options: list of dns.edns.Option instances + @see: RFC 2671 + """ + + # make sure the EDNS version in ednsflags agrees with edns + ednsflags &= long(0xFF00FFFF) + ednsflags |= (edns << 16) + self._set_section(ADDITIONAL) + before = self.output.tell() + self.output.write(struct.pack('!BHHIH', 0, dns.rdatatype.OPT, payload, + ednsflags, 0)) + if options is not None: + lstart = self.output.tell() + for opt in options: + stuff = struct.pack("!HH", opt.otype, 0) + self.output.write(stuff) + start = self.output.tell() + opt.to_wire(self.output) + end = self.output.tell() + assert end - start < 65536 + self.output.seek(start - 2) + stuff = struct.pack("!H", end - start) + self.output.write(stuff) + self.output.seek(0, 2) + lend = self.output.tell() + assert lend - lstart < 65536 + self.output.seek(lstart - 2) + stuff = struct.pack("!H", lend - lstart) + self.output.write(stuff) + self.output.seek(0, 2) + after = self.output.tell() + if after >= self.max_size: + self._rollback(before) + raise dns.exception.TooBig + self.counts[ADDITIONAL] += 1 + + def add_tsig(self, keyname, secret, fudge, id, tsig_error, other_data, + request_mac, algorithm=dns.tsig.default_algorithm): + """Add a TSIG signature to the message. + + @param keyname: the TSIG key name + @type keyname: dns.name.Name object + @param secret: the secret to use + @type secret: string + @param fudge: TSIG time fudge + @type fudge: int + @param id: the message id to encode in the tsig signature + @type id: int + @param tsig_error: TSIG error code; default is 0. + @type tsig_error: int + @param other_data: TSIG other data. + @type other_data: string + @param request_mac: This message is a response to the request which + had the specified MAC. + @type request_mac: string + @param algorithm: the TSIG algorithm to use + @type algorithm: dns.name.Name object + """ + + self._set_section(ADDITIONAL) + before = self.output.tell() + s = self.output.getvalue() + (tsig_rdata, self.mac, ctx) = dns.tsig.sign(s, + keyname, + secret, + int(time.time()), + fudge, + id, + tsig_error, + other_data, + request_mac, + algorithm=algorithm) + keyname.to_wire(self.output, self.compress, self.origin) + self.output.write(struct.pack('!HHIH', dns.rdatatype.TSIG, + dns.rdataclass.ANY, 0, 0)) + rdata_start = self.output.tell() + self.output.write(tsig_rdata) + after = self.output.tell() + assert after - rdata_start < 65536 + if after >= self.max_size: + self._rollback(before) + raise dns.exception.TooBig + self.output.seek(rdata_start - 2) + self.output.write(struct.pack('!H', after - rdata_start)) + self.counts[ADDITIONAL] += 1 + self.output.seek(10) + self.output.write(struct.pack('!H', self.counts[ADDITIONAL])) + self.output.seek(0, 2) + + def write_header(self): + """Write the DNS message header. + + Writing the DNS message header is done after all sections + have been rendered, but before the optional TSIG signature + is added. + """ + + self.output.seek(0) + self.output.write(struct.pack('!HHHHHH', self.id, self.flags, + self.counts[0], self.counts[1], + self.counts[2], self.counts[3])) + self.output.seek(0, 2) + + def get_wire(self): + """Return the wire format message. + + @rtype: string + """ + + return self.output.getvalue() diff --git a/Contents/Libraries/Shared/dns/resolver.py b/Contents/Libraries/Shared/dns/resolver.py new file mode 100644 index 000000000..abc431d7f --- /dev/null +++ b/Contents/Libraries/Shared/dns/resolver.py @@ -0,0 +1,1407 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS stub resolver. + +@var default_resolver: The default resolver object +@type default_resolver: dns.resolver.Resolver object""" + +import socket +import sys +import time +import random + +try: + import threading as _threading +except ImportError: + import dummy_threading as _threading + +import dns.exception +import dns.flags +import dns.ipv4 +import dns.ipv6 +import dns.message +import dns.name +import dns.query +import dns.rcode +import dns.rdataclass +import dns.rdatatype +import dns.reversename +import dns.tsig +from ._compat import xrange, string_types + +if sys.platform == 'win32': + try: + import winreg as _winreg + except ImportError: + import _winreg # pylint: disable=import-error + +class NXDOMAIN(dns.exception.DNSException): + + """The DNS query name does not exist.""" + supp_kwargs = set(['qnames', 'responses']) + fmt = None # we have our own __str__ implementation + + def _check_kwargs(self, qnames, responses=None): + if not isinstance(qnames, (list, tuple, set)): + raise AttributeError("qnames must be a list, tuple or set") + if len(qnames) == 0: + raise AttributeError("qnames must contain at least one element") + if responses is None: + responses = {} + elif not isinstance(responses, dict): + raise AttributeError("responses must be a dict(qname=response)") + kwargs = dict(qnames=qnames, responses=responses) + return kwargs + + def __str__(self): + if 'qnames' not in self.kwargs: + return super(NXDOMAIN, self).__str__() + qnames = self.kwargs['qnames'] + if len(qnames) > 1: + msg = 'None of DNS query names exist' + else: + msg = self.__doc__[:-1] + qnames = ', '.join(map(str, qnames)) + return "%s: %s" % (msg, qnames) + + def canonical_name(self): + if not 'qnames' in self.kwargs: + raise TypeError("parametrized exception required") + IN = dns.rdataclass.IN + CNAME = dns.rdatatype.CNAME + cname = None + for qname in self.kwargs['qnames']: + response = self.kwargs['responses'][qname] + for answer in response.answer: + if answer.rdtype != CNAME or answer.rdclass != IN: + continue + cname = answer.items[0].target.to_text() + if cname is not None: + return dns.name.from_text(cname) + return self.kwargs['qnames'][0] + canonical_name = property(canonical_name, doc=( + "Return the unresolved canonical name.")) + + def __add__(self, e_nx): + """Augment by results from another NXDOMAIN exception.""" + qnames0 = list(self.kwargs.get('qnames', [])) + responses0 = dict(self.kwargs.get('responses', {})) + responses1 = e_nx.kwargs.get('responses', {}) + for qname1 in e_nx.kwargs.get('qnames', []): + if qname1 not in qnames0: + qnames0.append(qname1) + if qname1 in responses1: + responses0[qname1] = responses1[qname1] + return NXDOMAIN(qnames=qnames0, responses=responses0) + + +class YXDOMAIN(dns.exception.DNSException): + + """The DNS query name is too long after DNAME substitution.""" + +# The definition of the Timeout exception has moved from here to the +# dns.exception module. We keep dns.resolver.Timeout defined for +# backwards compatibility. + +Timeout = dns.exception.Timeout + + +class NoAnswer(dns.exception.DNSException): + + """The DNS response does not contain an answer to the question.""" + fmt = 'The DNS response does not contain an answer ' + \ + 'to the question: {query}' + supp_kwargs = set(['response']) + + def _fmt_kwargs(self, **kwargs): + return super(NoAnswer, self)._fmt_kwargs( + query=kwargs['response'].question) + + +class NoNameservers(dns.exception.DNSException): + + """All nameservers failed to answer the query. + + errors: list of servers and respective errors + The type of errors is + [(server ip address, any object convertible to string)]. + Non-empty errors list will add explanatory message () + """ + + msg = "All nameservers failed to answer the query." + fmt = "%s {query}: {errors}" % msg[:-1] + supp_kwargs = set(['request', 'errors']) + + def _fmt_kwargs(self, **kwargs): + srv_msgs = [] + for err in kwargs['errors']: + srv_msgs.append('Server %s %s port %s answered %s' % (err[0], + 'TCP' if err[1] else 'UDP', err[2], err[3])) + return super(NoNameservers, self)._fmt_kwargs( + query=kwargs['request'].question, errors='; '.join(srv_msgs)) + + +class NotAbsolute(dns.exception.DNSException): + + """An absolute domain name is required but a relative name was provided.""" + + +class NoRootSOA(dns.exception.DNSException): + + """There is no SOA RR at the DNS root name. This should never happen!""" + + +class NoMetaqueries(dns.exception.DNSException): + + """DNS metaqueries are not allowed.""" + + +class Answer(object): + + """DNS stub resolver answer + + Instances of this class bundle up the result of a successful DNS + resolution. + + For convenience, the answer object implements much of the sequence + protocol, forwarding to its rrset. E.g. "for a in answer" is + equivalent to "for a in answer.rrset", "answer[i]" is equivalent + to "answer.rrset[i]", and "answer[i:j]" is equivalent to + "answer.rrset[i:j]". + + Note that CNAMEs or DNAMEs in the response may mean that answer + node's name might not be the query name. + + @ivar qname: The query name + @type qname: dns.name.Name object + @ivar rdtype: The query type + @type rdtype: int + @ivar rdclass: The query class + @type rdclass: int + @ivar response: The response message + @type response: dns.message.Message object + @ivar rrset: The answer + @type rrset: dns.rrset.RRset object + @ivar expiration: The time when the answer expires + @type expiration: float (seconds since the epoch) + @ivar canonical_name: The canonical name of the query name + @type canonical_name: dns.name.Name object + """ + + def __init__(self, qname, rdtype, rdclass, response, + raise_on_no_answer=True): + self.qname = qname + self.rdtype = rdtype + self.rdclass = rdclass + self.response = response + min_ttl = -1 + rrset = None + for count in xrange(0, 15): + try: + rrset = response.find_rrset(response.answer, qname, + rdclass, rdtype) + if min_ttl == -1 or rrset.ttl < min_ttl: + min_ttl = rrset.ttl + break + except KeyError: + if rdtype != dns.rdatatype.CNAME: + try: + crrset = response.find_rrset(response.answer, + qname, + rdclass, + dns.rdatatype.CNAME) + if min_ttl == -1 or crrset.ttl < min_ttl: + min_ttl = crrset.ttl + for rd in crrset: + qname = rd.target + break + continue + except KeyError: + if raise_on_no_answer: + raise NoAnswer(response=response) + if raise_on_no_answer: + raise NoAnswer(response=response) + if rrset is None and raise_on_no_answer: + raise NoAnswer(response=response) + self.canonical_name = qname + self.rrset = rrset + if rrset is None: + while 1: + # Look for a SOA RR whose owner name is a superdomain + # of qname. + try: + srrset = response.find_rrset(response.authority, qname, + rdclass, dns.rdatatype.SOA) + if min_ttl == -1 or srrset.ttl < min_ttl: + min_ttl = srrset.ttl + if srrset[0].minimum < min_ttl: + min_ttl = srrset[0].minimum + break + except KeyError: + try: + qname = qname.parent() + except dns.name.NoParent: + break + self.expiration = time.time() + min_ttl + + def __getattr__(self, attr): + if attr == 'name': + return self.rrset.name + elif attr == 'ttl': + return self.rrset.ttl + elif attr == 'covers': + return self.rrset.covers + elif attr == 'rdclass': + return self.rrset.rdclass + elif attr == 'rdtype': + return self.rrset.rdtype + else: + raise AttributeError(attr) + + def __len__(self): + return self.rrset and len(self.rrset) or 0 + + def __iter__(self): + return self.rrset and iter(self.rrset) or iter(tuple()) + + def __getitem__(self, i): + return self.rrset[i] + + def __delitem__(self, i): + del self.rrset[i] + + +class Cache(object): + + """Simple DNS answer cache. + + @ivar data: A dictionary of cached data + @type data: dict + @ivar cleaning_interval: The number of seconds between cleanings. The + default is 300 (5 minutes). + @type cleaning_interval: float + @ivar next_cleaning: The time the cache should next be cleaned (in seconds + since the epoch.) + @type next_cleaning: float + """ + + def __init__(self, cleaning_interval=300.0): + """Initialize a DNS cache. + + @param cleaning_interval: the number of seconds between periodic + cleanings. The default is 300.0 + @type cleaning_interval: float. + """ + + self.data = {} + self.cleaning_interval = cleaning_interval + self.next_cleaning = time.time() + self.cleaning_interval + self.lock = _threading.Lock() + + def _maybe_clean(self): + """Clean the cache if it's time to do so.""" + + now = time.time() + if self.next_cleaning <= now: + keys_to_delete = [] + for (k, v) in self.data.items(): + if v.expiration <= now: + keys_to_delete.append(k) + for k in keys_to_delete: + del self.data[k] + now = time.time() + self.next_cleaning = now + self.cleaning_interval + + def get(self, key): + """Get the answer associated with I{key}. Returns None if + no answer is cached for the key. + @param key: the key + @type key: (dns.name.Name, int, int) tuple whose values are the + query name, rdtype, and rdclass. + @rtype: dns.resolver.Answer object or None + """ + + try: + self.lock.acquire() + self._maybe_clean() + v = self.data.get(key) + if v is None or v.expiration <= time.time(): + return None + return v + finally: + self.lock.release() + + def put(self, key, value): + """Associate key and value in the cache. + @param key: the key + @type key: (dns.name.Name, int, int) tuple whose values are the + query name, rdtype, and rdclass. + @param value: The answer being cached + @type value: dns.resolver.Answer object + """ + + try: + self.lock.acquire() + self._maybe_clean() + self.data[key] = value + finally: + self.lock.release() + + def flush(self, key=None): + """Flush the cache. + + If I{key} is specified, only that item is flushed. Otherwise + the entire cache is flushed. + + @param key: the key to flush + @type key: (dns.name.Name, int, int) tuple or None + """ + + try: + self.lock.acquire() + if key is not None: + if key in self.data: + del self.data[key] + else: + self.data = {} + self.next_cleaning = time.time() + self.cleaning_interval + finally: + self.lock.release() + + +class LRUCacheNode(object): + + """LRUCache node. + """ + + def __init__(self, key, value): + self.key = key + self.value = value + self.prev = self + self.next = self + + def link_before(self, node): + self.prev = node.prev + self.next = node + node.prev.next = self + node.prev = self + + def link_after(self, node): + self.prev = node + self.next = node.next + node.next.prev = self + node.next = self + + def unlink(self): + self.next.prev = self.prev + self.prev.next = self.next + + +class LRUCache(object): + + """Bounded least-recently-used DNS answer cache. + + This cache is better than the simple cache (above) if you're + running a web crawler or other process that does a lot of + resolutions. The LRUCache has a maximum number of nodes, and when + it is full, the least-recently used node is removed to make space + for a new one. + + @ivar data: A dictionary of cached data + @type data: dict + @ivar sentinel: sentinel node for circular doubly linked list of nodes + @type sentinel: LRUCacheNode object + @ivar max_size: The maximum number of nodes + @type max_size: int + """ + + def __init__(self, max_size=100000): + """Initialize a DNS cache. + + @param max_size: The maximum number of nodes to cache; the default is + 100,000. Must be greater than 1. + @type max_size: int + """ + self.data = {} + self.set_max_size(max_size) + self.sentinel = LRUCacheNode(None, None) + self.lock = _threading.Lock() + + def set_max_size(self, max_size): + if max_size < 1: + max_size = 1 + self.max_size = max_size + + def get(self, key): + """Get the answer associated with I{key}. Returns None if + no answer is cached for the key. + @param key: the key + @type key: (dns.name.Name, int, int) tuple whose values are the + query name, rdtype, and rdclass. + @rtype: dns.resolver.Answer object or None + """ + try: + self.lock.acquire() + node = self.data.get(key) + if node is None: + return None + # Unlink because we're either going to move the node to the front + # of the LRU list or we're going to free it. + node.unlink() + if node.value.expiration <= time.time(): + del self.data[node.key] + return None + node.link_after(self.sentinel) + return node.value + finally: + self.lock.release() + + def put(self, key, value): + """Associate key and value in the cache. + @param key: the key + @type key: (dns.name.Name, int, int) tuple whose values are the + query name, rdtype, and rdclass. + @param value: The answer being cached + @type value: dns.resolver.Answer object + """ + try: + self.lock.acquire() + node = self.data.get(key) + if node is not None: + node.unlink() + del self.data[node.key] + while len(self.data) >= self.max_size: + node = self.sentinel.prev + node.unlink() + del self.data[node.key] + node = LRUCacheNode(key, value) + node.link_after(self.sentinel) + self.data[key] = node + finally: + self.lock.release() + + def flush(self, key=None): + """Flush the cache. + + If I{key} is specified, only that item is flushed. Otherwise + the entire cache is flushed. + + @param key: the key to flush + @type key: (dns.name.Name, int, int) tuple or None + """ + try: + self.lock.acquire() + if key is not None: + node = self.data.get(key) + if node is not None: + node.unlink() + del self.data[node.key] + else: + node = self.sentinel.next + while node != self.sentinel: + next = node.next + node.prev = None + node.next = None + node = next + self.data = {} + finally: + self.lock.release() + + +class Resolver(object): + + """DNS stub resolver + + @ivar domain: The domain of this host + @type domain: dns.name.Name object + @ivar nameservers: A list of nameservers to query. Each nameserver is + a string which contains the IP address of a nameserver. + @type nameservers: list of strings + @ivar search: The search list. If the query name is a relative name, + the resolver will construct an absolute query name by appending the search + names one by one to the query name. + @type search: list of dns.name.Name objects + @ivar port: The port to which to send queries. The default is 53. + @type port: int + @ivar timeout: The number of seconds to wait for a response from a + server, before timing out. + @type timeout: float + @ivar lifetime: The total number of seconds to spend trying to get an + answer to the question. If the lifetime expires, a Timeout exception + will occur. + @type lifetime: float + @ivar keyring: The TSIG keyring to use. The default is None. + @type keyring: dict + @ivar keyname: The TSIG keyname to use. The default is None. + @type keyname: dns.name.Name object + @ivar keyalgorithm: The TSIG key algorithm to use. The default is + dns.tsig.default_algorithm. + @type keyalgorithm: string + @ivar edns: The EDNS level to use. The default is -1, no Edns. + @type edns: int + @ivar ednsflags: The EDNS flags + @type ednsflags: int + @ivar payload: The EDNS payload size. The default is 0. + @type payload: int + @ivar flags: The message flags to use. The default is None (i.e. not + overwritten) + @type flags: int + @ivar cache: The cache to use. The default is None. + @type cache: dns.resolver.Cache object + @ivar retry_servfail: should we retry a nameserver if it says SERVFAIL? + The default is 'false'. + @type retry_servfail: bool + """ + + def __init__(self, filename='/etc/resolv.conf', configure=True): + """Initialize a resolver instance. + + @param filename: The filename of a configuration file in + standard /etc/resolv.conf format. This parameter is meaningful + only when I{configure} is true and the platform is POSIX. + @type filename: string or file object + @param configure: If True (the default), the resolver instance + is configured in the normal fashion for the operating system + the resolver is running on. (I.e. a /etc/resolv.conf file on + POSIX systems and from the registry on Windows systems.) + @type configure: bool""" + + self.domain = None + self.nameservers = None + self.nameserver_ports = None + self.port = None + self.search = None + self.timeout = None + self.lifetime = None + self.keyring = None + self.keyname = None + self.keyalgorithm = None + self.edns = None + self.ednsflags = None + self.payload = None + self.cache = None + self.flags = None + self.retry_servfail = False + self.rotate = False + + self.reset() + if configure: + if sys.platform == 'win32': + self.read_registry() + elif filename: + self.read_resolv_conf(filename) + + def reset(self): + """Reset all resolver configuration to the defaults.""" + self.domain = \ + dns.name.Name(dns.name.from_text(socket.gethostname())[1:]) + if len(self.domain) == 0: + self.domain = dns.name.root + self.nameservers = [] + self.nameserver_ports = {} + self.port = 53 + self.search = [] + self.timeout = 2.0 + self.lifetime = 30.0 + self.keyring = None + self.keyname = None + self.keyalgorithm = dns.tsig.default_algorithm + self.edns = -1 + self.ednsflags = 0 + self.payload = 0 + self.cache = None + self.flags = None + self.retry_servfail = False + self.rotate = False + + def read_resolv_conf(self, f): + """Process f as a file in the /etc/resolv.conf format. If f is + a string, it is used as the name of the file to open; otherwise it + is treated as the file itself.""" + if isinstance(f, string_types): + try: + f = open(f, 'r') + except IOError: + # /etc/resolv.conf doesn't exist, can't be read, etc. + # We'll just use the default resolver configuration. + self.nameservers = ['127.0.0.1'] + return + want_close = True + else: + want_close = False + try: + for l in f: + if len(l) == 0 or l[0] == '#' or l[0] == ';': + continue + tokens = l.split() + + # Any line containing less than 2 tokens is malformed + if len(tokens) < 2: + continue + + if tokens[0] == 'nameserver': + self.nameservers.append(tokens[1]) + elif tokens[0] == 'domain': + self.domain = dns.name.from_text(tokens[1]) + elif tokens[0] == 'search': + for suffix in tokens[1:]: + self.search.append(dns.name.from_text(suffix)) + elif tokens[0] == 'options': + if 'rotate' in tokens[1:]: + self.rotate = True + finally: + if want_close: + f.close() + if len(self.nameservers) == 0: + self.nameservers.append('127.0.0.1') + + def _determine_split_char(self, entry): + # + # The windows registry irritatingly changes the list element + # delimiter in between ' ' and ',' (and vice-versa) in various + # versions of windows. + # + if entry.find(' ') >= 0: + split_char = ' ' + elif entry.find(',') >= 0: + split_char = ',' + else: + # probably a singleton; treat as a space-separated list. + split_char = ' ' + return split_char + + def _config_win32_nameservers(self, nameservers): + """Configure a NameServer registry entry.""" + # we call str() on nameservers to convert it from unicode to ascii + nameservers = str(nameservers) + split_char = self._determine_split_char(nameservers) + ns_list = nameservers.split(split_char) + for ns in ns_list: + if ns not in self.nameservers: + self.nameservers.append(ns) + + def _config_win32_domain(self, domain): + """Configure a Domain registry entry.""" + # we call str() on domain to convert it from unicode to ascii + self.domain = dns.name.from_text(str(domain)) + + def _config_win32_search(self, search): + """Configure a Search registry entry.""" + # we call str() on search to convert it from unicode to ascii + search = str(search) + split_char = self._determine_split_char(search) + search_list = search.split(split_char) + for s in search_list: + if s not in self.search: + self.search.append(dns.name.from_text(s)) + + def _config_win32_fromkey(self, key): + """Extract DNS info from a registry key.""" + try: + servers, rtype = _winreg.QueryValueEx(key, 'NameServer') + except WindowsError: # pylint: disable=undefined-variable + servers = None + if servers: + self._config_win32_nameservers(servers) + try: + dom, rtype = _winreg.QueryValueEx(key, 'Domain') + if dom: + self._config_win32_domain(dom) + except WindowsError: # pylint: disable=undefined-variable + pass + else: + try: + servers, rtype = _winreg.QueryValueEx(key, 'DhcpNameServer') + except WindowsError: # pylint: disable=undefined-variable + servers = None + if servers: + self._config_win32_nameservers(servers) + try: + dom, rtype = _winreg.QueryValueEx(key, 'DhcpDomain') + if dom: + self._config_win32_domain(dom) + except WindowsError: # pylint: disable=undefined-variable + pass + try: + search, rtype = _winreg.QueryValueEx(key, 'SearchList') + except WindowsError: # pylint: disable=undefined-variable + search = None + if search: + self._config_win32_search(search) + + def read_registry(self): + """Extract resolver configuration from the Windows registry.""" + lm = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) + want_scan = False + try: + try: + # XP, 2000 + tcp_params = _winreg.OpenKey(lm, + r'SYSTEM\CurrentControlSet' + r'\Services\Tcpip\Parameters') + want_scan = True + except EnvironmentError: + # ME + tcp_params = _winreg.OpenKey(lm, + r'SYSTEM\CurrentControlSet' + r'\Services\VxD\MSTCP') + try: + self._config_win32_fromkey(tcp_params) + finally: + tcp_params.Close() + if want_scan: + interfaces = _winreg.OpenKey(lm, + r'SYSTEM\CurrentControlSet' + r'\Services\Tcpip\Parameters' + r'\Interfaces') + try: + i = 0 + while True: + try: + guid = _winreg.EnumKey(interfaces, i) + i += 1 + key = _winreg.OpenKey(interfaces, guid) + if not self._win32_is_nic_enabled(lm, guid, key): + continue + try: + self._config_win32_fromkey(key) + finally: + key.Close() + except EnvironmentError: + break + finally: + interfaces.Close() + finally: + lm.Close() + + def _win32_is_nic_enabled(self, lm, guid, interface_key): + # Look in the Windows Registry to determine whether the network + # interface corresponding to the given guid is enabled. + # + # (Code contributed by Paul Marks, thanks!) + # + try: + # This hard-coded location seems to be consistent, at least + # from Windows 2000 through Vista. + connection_key = _winreg.OpenKey( + lm, + r'SYSTEM\CurrentControlSet\Control\Network' + r'\{4D36E972-E325-11CE-BFC1-08002BE10318}' + r'\%s\Connection' % guid) + + try: + # The PnpInstanceID points to a key inside Enum + (pnp_id, ttype) = _winreg.QueryValueEx( + connection_key, 'PnpInstanceID') + + if ttype != _winreg.REG_SZ: + raise ValueError + + device_key = _winreg.OpenKey( + lm, r'SYSTEM\CurrentControlSet\Enum\%s' % pnp_id) + + try: + # Get ConfigFlags for this device + (flags, ttype) = _winreg.QueryValueEx( + device_key, 'ConfigFlags') + + if ttype != _winreg.REG_DWORD: + raise ValueError + + # Based on experimentation, bit 0x1 indicates that the + # device is disabled. + return not flags & 0x1 + + finally: + device_key.Close() + finally: + connection_key.Close() + except (EnvironmentError, ValueError): + # Pre-vista, enabled interfaces seem to have a non-empty + # NTEContextList; this was how dnspython detected enabled + # nics before the code above was contributed. We've retained + # the old method since we don't know if the code above works + # on Windows 95/98/ME. + try: + (nte, ttype) = _winreg.QueryValueEx(interface_key, + 'NTEContextList') + return nte is not None + except WindowsError: # pylint: disable=undefined-variable + return False + + def _compute_timeout(self, start): + now = time.time() + duration = now - start + if duration < 0: + if duration < -1: + # Time going backwards is bad. Just give up. + raise Timeout(timeout=duration) + else: + # Time went backwards, but only a little. This can + # happen, e.g. under vmware with older linux kernels. + # Pretend it didn't happen. + now = start + if duration >= self.lifetime: + raise Timeout(timeout=duration) + return min(self.lifetime - duration, self.timeout) + + def query(self, qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN, + tcp=False, source=None, raise_on_no_answer=True, source_port=0): + """Query nameservers to find the answer to the question. + + The I{qname}, I{rdtype}, and I{rdclass} parameters may be objects + of the appropriate type, or strings that can be converted into objects + of the appropriate type. E.g. For I{rdtype} the integer 2 and the + the string 'NS' both mean to query for records with DNS rdata type NS. + + @param qname: the query name + @type qname: dns.name.Name object or string + @param rdtype: the query type + @type rdtype: int or string + @param rdclass: the query class + @type rdclass: int or string + @param tcp: use TCP to make the query (default is False). + @type tcp: bool + @param source: bind to this IP address (defaults to machine default + IP). + @type source: IP address in dotted quad notation + @param raise_on_no_answer: raise NoAnswer if there's no answer + (defaults is True). + @type raise_on_no_answer: bool + @param source_port: The port from which to send the message. + The default is 0. + @type source_port: int + @rtype: dns.resolver.Answer instance + @raises Timeout: no answers could be found in the specified lifetime + @raises NXDOMAIN: the query name does not exist + @raises YXDOMAIN: the query name is too long after DNAME substitution + @raises NoAnswer: the response did not contain an answer and + raise_on_no_answer is True. + @raises NoNameservers: no non-broken nameservers are available to + answer the question.""" + + if isinstance(qname, string_types): + qname = dns.name.from_text(qname, None) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if dns.rdatatype.is_metatype(rdtype): + raise NoMetaqueries + if isinstance(rdclass, string_types): + rdclass = dns.rdataclass.from_text(rdclass) + if dns.rdataclass.is_metaclass(rdclass): + raise NoMetaqueries + qnames_to_try = [] + if qname.is_absolute(): + qnames_to_try.append(qname) + else: + if len(qname) > 1: + qnames_to_try.append(qname.concatenate(dns.name.root)) + if self.search: + for suffix in self.search: + qnames_to_try.append(qname.concatenate(suffix)) + else: + qnames_to_try.append(qname.concatenate(self.domain)) + all_nxdomain = True + nxdomain_responses = {} + start = time.time() + _qname = None # make pylint happy + for _qname in qnames_to_try: + if self.cache: + answer = self.cache.get((_qname, rdtype, rdclass)) + if answer is not None: + if answer.rrset is None and raise_on_no_answer: + raise NoAnswer(response=answer.response) + else: + return answer + request = dns.message.make_query(_qname, rdtype, rdclass) + if self.keyname is not None: + request.use_tsig(self.keyring, self.keyname, + algorithm=self.keyalgorithm) + request.use_edns(self.edns, self.ednsflags, self.payload) + if self.flags is not None: + request.flags = self.flags + response = None + # + # make a copy of the servers list so we can alter it later. + # + nameservers = self.nameservers[:] + errors = [] + if self.rotate: + random.shuffle(nameservers) + backoff = 0.10 + while response is None: + if len(nameservers) == 0: + raise NoNameservers(request=request, errors=errors) + for nameserver in nameservers[:]: + timeout = self._compute_timeout(start) + port = self.nameserver_ports.get(nameserver, self.port) + try: + tcp_attempt = tcp + if tcp: + response = dns.query.tcp(request, nameserver, + timeout, port, + source=source, + source_port=source_port) + else: + response = dns.query.udp(request, nameserver, + timeout, port, + source=source, + source_port=source_port) + if response.flags & dns.flags.TC: + # Response truncated; retry with TCP. + tcp_attempt = True + timeout = self._compute_timeout(start) + response = \ + dns.query.tcp(request, nameserver, + timeout, port, + source=source, + source_port=source_port) + except (socket.error, dns.exception.Timeout) as ex: + # + # Communication failure or timeout. Go to the + # next server + # + errors.append((nameserver, tcp_attempt, port, ex, + response)) + response = None + continue + except dns.query.UnexpectedSource as ex: + # + # Who knows? Keep going. + # + errors.append((nameserver, tcp_attempt, port, ex, + response)) + response = None + continue + except dns.exception.FormError as ex: + # + # We don't understand what this server is + # saying. Take it out of the mix and + # continue. + # + nameservers.remove(nameserver) + errors.append((nameserver, tcp_attempt, port, ex, + response)) + response = None + continue + except EOFError as ex: + # + # We're using TCP and they hung up on us. + # Probably they don't support TCP (though + # they're supposed to!). Take it out of the + # mix and continue. + # + nameservers.remove(nameserver) + errors.append((nameserver, tcp_attempt, port, ex, + response)) + response = None + continue + rcode = response.rcode() + if rcode == dns.rcode.YXDOMAIN: + ex = YXDOMAIN() + errors.append((nameserver, tcp_attempt, port, ex, + response)) + raise ex + if rcode == dns.rcode.NOERROR or \ + rcode == dns.rcode.NXDOMAIN: + break + # + # We got a response, but we're not happy with the + # rcode in it. Remove the server from the mix if + # the rcode isn't SERVFAIL. + # + if rcode != dns.rcode.SERVFAIL or not self.retry_servfail: + nameservers.remove(nameserver) + errors.append((nameserver, tcp_attempt, port, + dns.rcode.to_text(rcode), response)) + response = None + if response is not None: + break + # + # All nameservers failed! + # + if len(nameservers) > 0: + # + # But we still have servers to try. Sleep a bit + # so we don't pound them! + # + timeout = self._compute_timeout(start) + sleep_time = min(timeout, backoff) + backoff *= 2 + time.sleep(sleep_time) + if response.rcode() == dns.rcode.NXDOMAIN: + nxdomain_responses[_qname] = response + continue + all_nxdomain = False + break + if all_nxdomain: + raise NXDOMAIN(qnames=qnames_to_try, responses=nxdomain_responses) + answer = Answer(_qname, rdtype, rdclass, response, + raise_on_no_answer) + if self.cache: + self.cache.put((_qname, rdtype, rdclass), answer) + return answer + + def use_tsig(self, keyring, keyname=None, + algorithm=dns.tsig.default_algorithm): + """Add a TSIG signature to the query. + + @param keyring: The TSIG keyring to use; defaults to None. + @type keyring: dict + @param keyname: The name of the TSIG key to use; defaults to None. + The key must be defined in the keyring. If a keyring is specified + but a keyname is not, then the key used will be the first key in the + keyring. Note that the order of keys in a dictionary is not defined, + so applications should supply a keyname when a keyring is used, unless + they know the keyring contains only one key. + @param algorithm: The TSIG key algorithm to use. The default + is dns.tsig.default_algorithm. + @type algorithm: string""" + self.keyring = keyring + if keyname is None: + self.keyname = list(self.keyring.keys())[0] + else: + self.keyname = keyname + self.keyalgorithm = algorithm + + def use_edns(self, edns, ednsflags, payload): + """Configure Edns. + + @param edns: The EDNS level to use. The default is -1, no Edns. + @type edns: int + @param ednsflags: The EDNS flags + @type ednsflags: int + @param payload: The EDNS payload size. The default is 0. + @type payload: int""" + + if edns is None: + edns = -1 + self.edns = edns + self.ednsflags = ednsflags + self.payload = payload + + def set_flags(self, flags): + """Overrides the default flags with your own + + @param flags: The flags to overwrite the default with + @type flags: int""" + self.flags = flags + +default_resolver = None + + +def get_default_resolver(): + """Get the default resolver, initializing it if necessary.""" + if default_resolver is None: + reset_default_resolver() + return default_resolver + + +def reset_default_resolver(): + """Re-initialize default resolver. + + resolv.conf will be re-read immediatelly. + """ + global default_resolver + default_resolver = Resolver() + + +def query(qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN, + tcp=False, source=None, raise_on_no_answer=True, + source_port=0): + """Query nameservers to find the answer to the question. + + This is a convenience function that uses the default resolver + object to make the query. + @see: L{dns.resolver.Resolver.query} for more information on the + parameters.""" + return get_default_resolver().query(qname, rdtype, rdclass, tcp, source, + raise_on_no_answer, source_port) + + +def zone_for_name(name, rdclass=dns.rdataclass.IN, tcp=False, resolver=None): + """Find the name of the zone which contains the specified name. + + @param name: the query name + @type name: absolute dns.name.Name object or string + @param rdclass: The query class + @type rdclass: int + @param tcp: use TCP to make the query (default is False). + @type tcp: bool + @param resolver: the resolver to use + @type resolver: dns.resolver.Resolver object or None + @rtype: dns.name.Name""" + + if isinstance(name, string_types): + name = dns.name.from_text(name, dns.name.root) + if resolver is None: + resolver = get_default_resolver() + if not name.is_absolute(): + raise NotAbsolute(name) + while 1: + try: + answer = resolver.query(name, dns.rdatatype.SOA, rdclass, tcp) + if answer.rrset.name == name: + return name + # otherwise we were CNAMEd or DNAMEd and need to look higher + except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer): + pass + try: + name = name.parent() + except dns.name.NoParent: + raise NoRootSOA + +# +# Support for overriding the system resolver for all python code in the +# running process. +# + +_protocols_for_socktype = { + socket.SOCK_DGRAM: [socket.SOL_UDP], + socket.SOCK_STREAM: [socket.SOL_TCP], +} + +_resolver = None +_original_getaddrinfo = socket.getaddrinfo +_original_getnameinfo = socket.getnameinfo +_original_getfqdn = socket.getfqdn +_original_gethostbyname = socket.gethostbyname +_original_gethostbyname_ex = socket.gethostbyname_ex +_original_gethostbyaddr = socket.gethostbyaddr + + +def _getaddrinfo(host=None, service=None, family=socket.AF_UNSPEC, socktype=0, + proto=0, flags=0): + if flags & (socket.AI_ADDRCONFIG | socket.AI_V4MAPPED) != 0: + raise NotImplementedError + if host is None and service is None: + raise socket.gaierror(socket.EAI_NONAME) + v6addrs = [] + v4addrs = [] + canonical_name = None + try: + # Is host None or a V6 address literal? + if host is None: + canonical_name = 'localhost' + if flags & socket.AI_PASSIVE != 0: + v6addrs.append('::') + v4addrs.append('0.0.0.0') + else: + v6addrs.append('::1') + v4addrs.append('127.0.0.1') + else: + parts = host.split('%') + if len(parts) == 2: + ahost = parts[0] + else: + ahost = host + addr = dns.ipv6.inet_aton(ahost) + v6addrs.append(host) + canonical_name = host + except Exception: + try: + # Is it a V4 address literal? + addr = dns.ipv4.inet_aton(host) + v4addrs.append(host) + canonical_name = host + except Exception: + if flags & socket.AI_NUMERICHOST == 0: + try: + if family == socket.AF_INET6 or family == socket.AF_UNSPEC: + v6 = _resolver.query(host, dns.rdatatype.AAAA, + raise_on_no_answer=False) + # Note that setting host ensures we query the same name + # for A as we did for AAAA. + host = v6.qname + canonical_name = v6.canonical_name.to_text(True) + if v6.rrset is not None: + for rdata in v6.rrset: + v6addrs.append(rdata.address) + if family == socket.AF_INET or family == socket.AF_UNSPEC: + v4 = _resolver.query(host, dns.rdatatype.A, + raise_on_no_answer=False) + host = v4.qname + canonical_name = v4.canonical_name.to_text(True) + if v4.rrset is not None: + for rdata in v4.rrset: + v4addrs.append(rdata.address) + except dns.resolver.NXDOMAIN: + raise socket.gaierror(socket.EAI_NONAME) + except: + raise socket.gaierror(socket.EAI_SYSTEM) + port = None + try: + # Is it a port literal? + if service is None: + port = 0 + else: + port = int(service) + except Exception: + if flags & socket.AI_NUMERICSERV == 0: + try: + port = socket.getservbyname(service) + except Exception: + pass + if port is None: + raise socket.gaierror(socket.EAI_NONAME) + tuples = [] + if socktype == 0: + socktypes = [socket.SOCK_DGRAM, socket.SOCK_STREAM] + else: + socktypes = [socktype] + if flags & socket.AI_CANONNAME != 0: + cname = canonical_name + else: + cname = '' + if family == socket.AF_INET6 or family == socket.AF_UNSPEC: + for addr in v6addrs: + for socktype in socktypes: + for proto in _protocols_for_socktype[socktype]: + tuples.append((socket.AF_INET6, socktype, proto, + cname, (addr, port, 0, 0))) + if family == socket.AF_INET or family == socket.AF_UNSPEC: + for addr in v4addrs: + for socktype in socktypes: + for proto in _protocols_for_socktype[socktype]: + tuples.append((socket.AF_INET, socktype, proto, + cname, (addr, port))) + if len(tuples) == 0: + raise socket.gaierror(socket.EAI_NONAME) + return tuples + + +def _getnameinfo(sockaddr, flags=0): + host = sockaddr[0] + port = sockaddr[1] + if len(sockaddr) == 4: + scope = sockaddr[3] + family = socket.AF_INET6 + else: + scope = None + family = socket.AF_INET + tuples = _getaddrinfo(host, port, family, socket.SOCK_STREAM, + socket.SOL_TCP, 0) + if len(tuples) > 1: + raise socket.error('sockaddr resolved to multiple addresses') + addr = tuples[0][4][0] + if flags & socket.NI_DGRAM: + pname = 'udp' + else: + pname = 'tcp' + qname = dns.reversename.from_address(addr) + if flags & socket.NI_NUMERICHOST == 0: + try: + answer = _resolver.query(qname, 'PTR') + hostname = answer.rrset[0].target.to_text(True) + except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer): + if flags & socket.NI_NAMEREQD: + raise socket.gaierror(socket.EAI_NONAME) + hostname = addr + if scope is not None: + hostname += '%' + str(scope) + else: + hostname = addr + if scope is not None: + hostname += '%' + str(scope) + if flags & socket.NI_NUMERICSERV: + service = str(port) + else: + service = socket.getservbyport(port, pname) + return (hostname, service) + + +def _getfqdn(name=None): + if name is None: + name = socket.gethostname() + try: + return _getnameinfo(_getaddrinfo(name, 80)[0][4])[0] + except Exception: + return name + + +def _gethostbyname(name): + return _gethostbyname_ex(name)[2][0] + + +def _gethostbyname_ex(name): + aliases = [] + addresses = [] + tuples = _getaddrinfo(name, 0, socket.AF_INET, socket.SOCK_STREAM, + socket.SOL_TCP, socket.AI_CANONNAME) + canonical = tuples[0][3] + for item in tuples: + addresses.append(item[4][0]) + # XXX we just ignore aliases + return (canonical, aliases, addresses) + + +def _gethostbyaddr(ip): + try: + dns.ipv6.inet_aton(ip) + sockaddr = (ip, 80, 0, 0) + family = socket.AF_INET6 + except Exception: + sockaddr = (ip, 80) + family = socket.AF_INET + (name, port) = _getnameinfo(sockaddr, socket.NI_NAMEREQD) + aliases = [] + addresses = [] + tuples = _getaddrinfo(name, 0, family, socket.SOCK_STREAM, socket.SOL_TCP, + socket.AI_CANONNAME) + canonical = tuples[0][3] + for item in tuples: + addresses.append(item[4][0]) + # XXX we just ignore aliases + return (canonical, aliases, addresses) + + +def override_system_resolver(resolver=None): + """Override the system resolver routines in the socket module with + versions which use dnspython's resolver. + + This can be useful in testing situations where you want to control + the resolution behavior of python code without having to change + the system's resolver settings (e.g. /etc/resolv.conf). + + The resolver to use may be specified; if it's not, the default + resolver will be used. + + @param resolver: the resolver to use + @type resolver: dns.resolver.Resolver object or None + """ + if resolver is None: + resolver = get_default_resolver() + global _resolver + _resolver = resolver + socket.getaddrinfo = _getaddrinfo + socket.getnameinfo = _getnameinfo + socket.getfqdn = _getfqdn + socket.gethostbyname = _gethostbyname + socket.gethostbyname_ex = _gethostbyname_ex + socket.gethostbyaddr = _gethostbyaddr + + +def restore_system_resolver(): + """Undo the effects of override_system_resolver(). + """ + global _resolver + _resolver = None + socket.getaddrinfo = _original_getaddrinfo + socket.getnameinfo = _original_getnameinfo + socket.getfqdn = _original_getfqdn + socket.gethostbyname = _original_gethostbyname + socket.gethostbyname_ex = _original_gethostbyname_ex + socket.gethostbyaddr = _original_gethostbyaddr diff --git a/Contents/Libraries/Shared/dns/reversename.py b/Contents/Libraries/Shared/dns/reversename.py new file mode 100644 index 000000000..9ea9395a8 --- /dev/null +++ b/Contents/Libraries/Shared/dns/reversename.py @@ -0,0 +1,89 @@ +# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Reverse Map Names. + +@var ipv4_reverse_domain: The DNS IPv4 reverse-map domain, in-addr.arpa. +@type ipv4_reverse_domain: dns.name.Name object +@var ipv6_reverse_domain: The DNS IPv6 reverse-map domain, ip6.arpa. +@type ipv6_reverse_domain: dns.name.Name object +""" + +import binascii +import sys + +import dns.name +import dns.ipv6 +import dns.ipv4 + +ipv4_reverse_domain = dns.name.from_text('in-addr.arpa.') +ipv6_reverse_domain = dns.name.from_text('ip6.arpa.') + + +def from_address(text): + """Convert an IPv4 or IPv6 address in textual form into a Name object whose + value is the reverse-map domain name of the address. + @param text: an IPv4 or IPv6 address in textual form (e.g. '127.0.0.1', + '::1') + @type text: str + @rtype: dns.name.Name object + """ + try: + v6 = dns.ipv6.inet_aton(text) + if dns.ipv6.is_mapped(v6): + if sys.version_info >= (3,): + parts = ['%d' % byte for byte in v6[12:]] + else: + parts = ['%d' % ord(byte) for byte in v6[12:]] + origin = ipv4_reverse_domain + else: + parts = [x for x in str(binascii.hexlify(v6).decode())] + origin = ipv6_reverse_domain + except Exception: + parts = ['%d' % + byte for byte in bytearray(dns.ipv4.inet_aton(text))] + origin = ipv4_reverse_domain + parts.reverse() + return dns.name.from_text('.'.join(parts), origin=origin) + + +def to_address(name): + """Convert a reverse map domain name into textual address form. + @param name: an IPv4 or IPv6 address in reverse-map form. + @type name: dns.name.Name object + @rtype: str + """ + if name.is_subdomain(ipv4_reverse_domain): + name = name.relativize(ipv4_reverse_domain) + labels = list(name.labels) + labels.reverse() + text = b'.'.join(labels) + # run through inet_aton() to check syntax and make pretty. + return dns.ipv4.inet_ntoa(dns.ipv4.inet_aton(text)) + elif name.is_subdomain(ipv6_reverse_domain): + name = name.relativize(ipv6_reverse_domain) + labels = list(name.labels) + labels.reverse() + parts = [] + i = 0 + l = len(labels) + while i < l: + parts.append(b''.join(labels[i:i + 4])) + i += 4 + text = b':'.join(parts) + # run through inet_aton() to check syntax and make pretty. + return dns.ipv6.inet_ntoa(dns.ipv6.inet_aton(text)) + else: + raise dns.exception.SyntaxError('unknown reverse-map address family') diff --git a/Contents/Libraries/Shared/dns/rrset.py b/Contents/Libraries/Shared/dns/rrset.py new file mode 100644 index 000000000..d0f8f9377 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rrset.py @@ -0,0 +1,182 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS RRsets (an RRset is a named rdataset)""" + + +import dns.name +import dns.rdataset +import dns.rdataclass +import dns.renderer +from ._compat import string_types + + +class RRset(dns.rdataset.Rdataset): + + """A DNS RRset (named rdataset). + + RRset inherits from Rdataset, and RRsets can be treated as + Rdatasets in most cases. There are, however, a few notable + exceptions. RRsets have different to_wire() and to_text() method + arguments, reflecting the fact that RRsets always have an owner + name. + """ + + __slots__ = ['name', 'deleting'] + + def __init__(self, name, rdclass, rdtype, covers=dns.rdatatype.NONE, + deleting=None): + """Create a new RRset.""" + + super(RRset, self).__init__(rdclass, rdtype, covers) + self.name = name + self.deleting = deleting + + def _clone(self): + obj = super(RRset, self)._clone() + obj.name = self.name + obj.deleting = self.deleting + return obj + + def __repr__(self): + if self.covers == 0: + ctext = '' + else: + ctext = '(' + dns.rdatatype.to_text(self.covers) + ')' + if self.deleting is not None: + dtext = ' delete=' + dns.rdataclass.to_text(self.deleting) + else: + dtext = '' + return '' + + def __str__(self): + return self.to_text() + + def __eq__(self, other): + """Two RRsets are equal if they have the same name and the same + rdataset + + @rtype: bool""" + if not isinstance(other, RRset): + return False + if self.name != other.name: + return False + return super(RRset, self).__eq__(other) + + def match(self, name, rdclass, rdtype, covers, deleting=None): + """Returns True if this rrset matches the specified class, type, + covers, and deletion state.""" + + if not super(RRset, self).match(rdclass, rdtype, covers): + return False + if self.name != name or self.deleting != deleting: + return False + return True + + def to_text(self, origin=None, relativize=True, **kw): + """Convert the RRset into DNS master file format. + + @see: L{dns.name.Name.choose_relativity} for more information + on how I{origin} and I{relativize} determine the way names + are emitted. + + Any additional keyword arguments are passed on to the rdata + to_text() method. + + @param origin: The origin for relative names, or None. + @type origin: dns.name.Name object + @param relativize: True if names should names be relativized + @type relativize: bool""" + + return super(RRset, self).to_text(self.name, origin, relativize, + self.deleting, **kw) + + def to_wire(self, file, compress=None, origin=None, **kw): + """Convert the RRset to wire format.""" + + return super(RRset, self).to_wire(self.name, file, compress, origin, + self.deleting, **kw) + + def to_rdataset(self): + """Convert an RRset into an Rdataset. + + @rtype: dns.rdataset.Rdataset object + """ + return dns.rdataset.from_rdata_list(self.ttl, list(self)) + + +def from_text_list(name, ttl, rdclass, rdtype, text_rdatas, + idna_codec=None): + """Create an RRset with the specified name, TTL, class, and type, and with + the specified list of rdatas in text format. + + @rtype: dns.rrset.RRset object + """ + + if isinstance(name, string_types): + name = dns.name.from_text(name, None, idna_codec=idna_codec) + if isinstance(rdclass, string_types): + rdclass = dns.rdataclass.from_text(rdclass) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + r = RRset(name, rdclass, rdtype) + r.update_ttl(ttl) + for t in text_rdatas: + rd = dns.rdata.from_text(r.rdclass, r.rdtype, t) + r.add(rd) + return r + + +def from_text(name, ttl, rdclass, rdtype, *text_rdatas): + """Create an RRset with the specified name, TTL, class, and type and with + the specified rdatas in text format. + + @rtype: dns.rrset.RRset object + """ + + return from_text_list(name, ttl, rdclass, rdtype, text_rdatas) + + +def from_rdata_list(name, ttl, rdatas, idna_codec=None): + """Create an RRset with the specified name and TTL, and with + the specified list of rdata objects. + + @rtype: dns.rrset.RRset object + """ + + if isinstance(name, string_types): + name = dns.name.from_text(name, None, idna_codec=idna_codec) + + if len(rdatas) == 0: + raise ValueError("rdata list must not be empty") + r = None + for rd in rdatas: + if r is None: + r = RRset(name, rd.rdclass, rd.rdtype) + r.update_ttl(ttl) + r.add(rd) + return r + + +def from_rdata(name, ttl, *rdatas): + """Create an RRset with the specified name and TTL, and with + the specified rdata objects. + + @rtype: dns.rrset.RRset object + """ + + return from_rdata_list(name, ttl, rdatas) diff --git a/Contents/Libraries/Shared/dns/set.py b/Contents/Libraries/Shared/dns/set.py new file mode 100644 index 000000000..ef7fd2955 --- /dev/null +++ b/Contents/Libraries/Shared/dns/set.py @@ -0,0 +1,259 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""A simple Set class.""" + + +class Set(object): + + """A simple set class. + + Sets are not in Python until 2.3, and rdata are not immutable so + we cannot use sets.Set anyway. This class implements subset of + the 2.3 Set interface using a list as the container. + + @ivar items: A list of the items which are in the set + @type items: list""" + + __slots__ = ['items'] + + def __init__(self, items=None): + """Initialize the set. + + @param items: the initial set of items + @type items: any iterable or None + """ + + self.items = [] + if items is not None: + for item in items: + self.add(item) + + def __repr__(self): + return "dns.simpleset.Set(%s)" % repr(self.items) + + def add(self, item): + """Add an item to the set.""" + if item not in self.items: + self.items.append(item) + + def remove(self, item): + """Remove an item from the set.""" + self.items.remove(item) + + def discard(self, item): + """Remove an item from the set if present.""" + try: + self.items.remove(item) + except ValueError: + pass + + def _clone(self): + """Make a (shallow) copy of the set. + + There is a 'clone protocol' that subclasses of this class + should use. To make a copy, first call your super's _clone() + method, and use the object returned as the new instance. Then + make shallow copies of the attributes defined in the subclass. + + This protocol allows us to write the set algorithms that + return new instances (e.g. union) once, and keep using them in + subclasses. + """ + + cls = self.__class__ + obj = cls.__new__(cls) + obj.items = list(self.items) + return obj + + def __copy__(self): + """Make a (shallow) copy of the set.""" + return self._clone() + + def copy(self): + """Make a (shallow) copy of the set.""" + return self._clone() + + def union_update(self, other): + """Update the set, adding any elements from other which are not + already in the set. + @param other: the collection of items with which to update the set + @type other: Set object + """ + if not isinstance(other, Set): + raise ValueError('other must be a Set instance') + if self is other: + return + for item in other.items: + self.add(item) + + def intersection_update(self, other): + """Update the set, removing any elements from other which are not + in both sets. + @param other: the collection of items with which to update the set + @type other: Set object + """ + if not isinstance(other, Set): + raise ValueError('other must be a Set instance') + if self is other: + return + # we make a copy of the list so that we can remove items from + # the list without breaking the iterator. + for item in list(self.items): + if item not in other.items: + self.items.remove(item) + + def difference_update(self, other): + """Update the set, removing any elements from other which are in + the set. + @param other: the collection of items with which to update the set + @type other: Set object + """ + if not isinstance(other, Set): + raise ValueError('other must be a Set instance') + if self is other: + self.items = [] + else: + for item in other.items: + self.discard(item) + + def union(self, other): + """Return a new set which is the union of I{self} and I{other}. + + @param other: the other set + @type other: Set object + @rtype: the same type as I{self} + """ + + obj = self._clone() + obj.union_update(other) + return obj + + def intersection(self, other): + """Return a new set which is the intersection of I{self} and I{other}. + + @param other: the other set + @type other: Set object + @rtype: the same type as I{self} + """ + + obj = self._clone() + obj.intersection_update(other) + return obj + + def difference(self, other): + """Return a new set which I{self} - I{other}, i.e. the items + in I{self} which are not also in I{other}. + + @param other: the other set + @type other: Set object + @rtype: the same type as I{self} + """ + + obj = self._clone() + obj.difference_update(other) + return obj + + def __or__(self, other): + return self.union(other) + + def __and__(self, other): + return self.intersection(other) + + def __add__(self, other): + return self.union(other) + + def __sub__(self, other): + return self.difference(other) + + def __ior__(self, other): + self.union_update(other) + return self + + def __iand__(self, other): + self.intersection_update(other) + return self + + def __iadd__(self, other): + self.union_update(other) + return self + + def __isub__(self, other): + self.difference_update(other) + return self + + def update(self, other): + """Update the set, adding any elements from other which are not + already in the set. + @param other: the collection of items with which to update the set + @type other: any iterable type""" + for item in other: + self.add(item) + + def clear(self): + """Make the set empty.""" + self.items = [] + + def __eq__(self, other): + # Yes, this is inefficient but the sets we're dealing with are + # usually quite small, so it shouldn't hurt too much. + for item in self.items: + if item not in other.items: + return False + for item in other.items: + if item not in self.items: + return False + return True + + def __ne__(self, other): + return not self.__eq__(other) + + def __len__(self): + return len(self.items) + + def __iter__(self): + return iter(self.items) + + def __getitem__(self, i): + return self.items[i] + + def __delitem__(self, i): + del self.items[i] + + def issubset(self, other): + """Is I{self} a subset of I{other}? + + @rtype: bool + """ + + if not isinstance(other, Set): + raise ValueError('other must be a Set instance') + for item in self.items: + if item not in other.items: + return False + return True + + def issuperset(self, other): + """Is I{self} a superset of I{other}? + + @rtype: bool + """ + + if not isinstance(other, Set): + raise ValueError('other must be a Set instance') + for item in other.items: + if item not in self.items: + return False + return True diff --git a/Contents/Libraries/Shared/dns/tokenizer.py b/Contents/Libraries/Shared/dns/tokenizer.py new file mode 100644 index 000000000..04b982549 --- /dev/null +++ b/Contents/Libraries/Shared/dns/tokenizer.py @@ -0,0 +1,564 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Tokenize DNS master file format""" + +from io import StringIO +import sys + +import dns.exception +import dns.name +import dns.ttl +from ._compat import long, text_type, binary_type + +_DELIMITERS = { + ' ': True, + '\t': True, + '\n': True, + ';': True, + '(': True, + ')': True, + '"': True} + +_QUOTING_DELIMITERS = {'"': True} + +EOF = 0 +EOL = 1 +WHITESPACE = 2 +IDENTIFIER = 3 +QUOTED_STRING = 4 +COMMENT = 5 +DELIMITER = 6 + + +class UngetBufferFull(dns.exception.DNSException): + + """An attempt was made to unget a token when the unget buffer was full.""" + + +class Token(object): + + """A DNS master file format token. + + @ivar ttype: The token type + @type ttype: int + @ivar value: The token value + @type value: string + @ivar has_escape: Does the token value contain escapes? + @type has_escape: bool + """ + + def __init__(self, ttype, value='', has_escape=False): + """Initialize a token instance. + + @param ttype: The token type + @type ttype: int + @param value: The token value + @type value: string + @param has_escape: Does the token value contain escapes? + @type has_escape: bool + """ + self.ttype = ttype + self.value = value + self.has_escape = has_escape + + def is_eof(self): + return self.ttype == EOF + + def is_eol(self): + return self.ttype == EOL + + def is_whitespace(self): + return self.ttype == WHITESPACE + + def is_identifier(self): + return self.ttype == IDENTIFIER + + def is_quoted_string(self): + return self.ttype == QUOTED_STRING + + def is_comment(self): + return self.ttype == COMMENT + + def is_delimiter(self): + return self.ttype == DELIMITER + + def is_eol_or_eof(self): + return self.ttype == EOL or self.ttype == EOF + + def __eq__(self, other): + if not isinstance(other, Token): + return False + return (self.ttype == other.ttype and + self.value == other.value) + + def __ne__(self, other): + if not isinstance(other, Token): + return True + return (self.ttype != other.ttype or + self.value != other.value) + + def __str__(self): + return '%d "%s"' % (self.ttype, self.value) + + def unescape(self): + if not self.has_escape: + return self + unescaped = '' + l = len(self.value) + i = 0 + while i < l: + c = self.value[i] + i += 1 + if c == '\\': + if i >= l: + raise dns.exception.UnexpectedEnd + c = self.value[i] + i += 1 + if c.isdigit(): + if i >= l: + raise dns.exception.UnexpectedEnd + c2 = self.value[i] + i += 1 + if i >= l: + raise dns.exception.UnexpectedEnd + c3 = self.value[i] + i += 1 + if not (c2.isdigit() and c3.isdigit()): + raise dns.exception.SyntaxError + c = chr(int(c) * 100 + int(c2) * 10 + int(c3)) + unescaped += c + return Token(self.ttype, unescaped) + + # compatibility for old-style tuple tokens + + def __len__(self): + return 2 + + def __iter__(self): + return iter((self.ttype, self.value)) + + def __getitem__(self, i): + if i == 0: + return self.ttype + elif i == 1: + return self.value + else: + raise IndexError + + +class Tokenizer(object): + + """A DNS master file format tokenizer. + + A token is a (type, value) tuple, where I{type} is an int, and + I{value} is a string. The valid types are EOF, EOL, WHITESPACE, + IDENTIFIER, QUOTED_STRING, COMMENT, and DELIMITER. + + @ivar file: The file to tokenize + @type file: file + @ivar ungotten_char: The most recently ungotten character, or None. + @type ungotten_char: string + @ivar ungotten_token: The most recently ungotten token, or None. + @type ungotten_token: (int, string) token tuple + @ivar multiline: The current multiline level. This value is increased + by one every time a '(' delimiter is read, and decreased by one every time + a ')' delimiter is read. + @type multiline: int + @ivar quoting: This variable is true if the tokenizer is currently + reading a quoted string. + @type quoting: bool + @ivar eof: This variable is true if the tokenizer has encountered EOF. + @type eof: bool + @ivar delimiters: The current delimiter dictionary. + @type delimiters: dict + @ivar line_number: The current line number + @type line_number: int + @ivar filename: A filename that will be returned by the L{where} method. + @type filename: string + """ + + def __init__(self, f=sys.stdin, filename=None): + """Initialize a tokenizer instance. + + @param f: The file to tokenize. The default is sys.stdin. + This parameter may also be a string, in which case the tokenizer + will take its input from the contents of the string. + @type f: file or string + @param filename: the name of the filename that the L{where} method + will return. + @type filename: string + """ + + if isinstance(f, text_type): + f = StringIO(f) + if filename is None: + filename = '' + elif isinstance(f, binary_type): + f = StringIO(f.decode()) + if filename is None: + filename = '' + else: + if filename is None: + if f is sys.stdin: + filename = '' + else: + filename = '' + self.file = f + self.ungotten_char = None + self.ungotten_token = None + self.multiline = 0 + self.quoting = False + self.eof = False + self.delimiters = _DELIMITERS + self.line_number = 1 + self.filename = filename + + def _get_char(self): + """Read a character from input. + @rtype: string + """ + + if self.ungotten_char is None: + if self.eof: + c = '' + else: + c = self.file.read(1) + if c == '': + self.eof = True + elif c == '\n': + self.line_number += 1 + else: + c = self.ungotten_char + self.ungotten_char = None + return c + + def where(self): + """Return the current location in the input. + + @rtype: (string, int) tuple. The first item is the filename of + the input, the second is the current line number. + """ + + return (self.filename, self.line_number) + + def _unget_char(self, c): + """Unget a character. + + The unget buffer for characters is only one character large; it is + an error to try to unget a character when the unget buffer is not + empty. + + @param c: the character to unget + @type c: string + @raises UngetBufferFull: there is already an ungotten char + """ + + if self.ungotten_char is not None: + raise UngetBufferFull + self.ungotten_char = c + + def skip_whitespace(self): + """Consume input until a non-whitespace character is encountered. + + The non-whitespace character is then ungotten, and the number of + whitespace characters consumed is returned. + + If the tokenizer is in multiline mode, then newlines are whitespace. + + @rtype: int + """ + + skipped = 0 + while True: + c = self._get_char() + if c != ' ' and c != '\t': + if (c != '\n') or not self.multiline: + self._unget_char(c) + return skipped + skipped += 1 + + def get(self, want_leading=False, want_comment=False): + """Get the next token. + + @param want_leading: If True, return a WHITESPACE token if the + first character read is whitespace. The default is False. + @type want_leading: bool + @param want_comment: If True, return a COMMENT token if the + first token read is a comment. The default is False. + @type want_comment: bool + @rtype: Token object + @raises dns.exception.UnexpectedEnd: input ended prematurely + @raises dns.exception.SyntaxError: input was badly formed + """ + + if self.ungotten_token is not None: + token = self.ungotten_token + self.ungotten_token = None + if token.is_whitespace(): + if want_leading: + return token + elif token.is_comment(): + if want_comment: + return token + else: + return token + skipped = self.skip_whitespace() + if want_leading and skipped > 0: + return Token(WHITESPACE, ' ') + token = '' + ttype = IDENTIFIER + has_escape = False + while True: + c = self._get_char() + if c == '' or c in self.delimiters: + if c == '' and self.quoting: + raise dns.exception.UnexpectedEnd + if token == '' and ttype != QUOTED_STRING: + if c == '(': + self.multiline += 1 + self.skip_whitespace() + continue + elif c == ')': + if self.multiline <= 0: + raise dns.exception.SyntaxError + self.multiline -= 1 + self.skip_whitespace() + continue + elif c == '"': + if not self.quoting: + self.quoting = True + self.delimiters = _QUOTING_DELIMITERS + ttype = QUOTED_STRING + continue + else: + self.quoting = False + self.delimiters = _DELIMITERS + self.skip_whitespace() + continue + elif c == '\n': + return Token(EOL, '\n') + elif c == ';': + while 1: + c = self._get_char() + if c == '\n' or c == '': + break + token += c + if want_comment: + self._unget_char(c) + return Token(COMMENT, token) + elif c == '': + if self.multiline: + raise dns.exception.SyntaxError( + 'unbalanced parentheses') + return Token(EOF) + elif self.multiline: + self.skip_whitespace() + token = '' + continue + else: + return Token(EOL, '\n') + else: + # This code exists in case we ever want a + # delimiter to be returned. It never produces + # a token currently. + token = c + ttype = DELIMITER + else: + self._unget_char(c) + break + elif self.quoting: + if c == '\\': + c = self._get_char() + if c == '': + raise dns.exception.UnexpectedEnd + if c.isdigit(): + c2 = self._get_char() + if c2 == '': + raise dns.exception.UnexpectedEnd + c3 = self._get_char() + if c == '': + raise dns.exception.UnexpectedEnd + if not (c2.isdigit() and c3.isdigit()): + raise dns.exception.SyntaxError + c = chr(int(c) * 100 + int(c2) * 10 + int(c3)) + elif c == '\n': + raise dns.exception.SyntaxError('newline in quoted string') + elif c == '\\': + # + # It's an escape. Put it and the next character into + # the token; it will be checked later for goodness. + # + token += c + has_escape = True + c = self._get_char() + if c == '' or c == '\n': + raise dns.exception.UnexpectedEnd + token += c + if token == '' and ttype != QUOTED_STRING: + if self.multiline: + raise dns.exception.SyntaxError('unbalanced parentheses') + ttype = EOF + return Token(ttype, token, has_escape) + + def unget(self, token): + """Unget a token. + + The unget buffer for tokens is only one token large; it is + an error to try to unget a token when the unget buffer is not + empty. + + @param token: the token to unget + @type token: Token object + @raises UngetBufferFull: there is already an ungotten token + """ + + if self.ungotten_token is not None: + raise UngetBufferFull + self.ungotten_token = token + + def next(self): + """Return the next item in an iteration. + @rtype: (int, string) + """ + + token = self.get() + if token.is_eof(): + raise StopIteration + return token + + __next__ = next + + def __iter__(self): + return self + + # Helpers + + def get_int(self): + """Read the next token and interpret it as an integer. + + @raises dns.exception.SyntaxError: + @rtype: int + """ + + token = self.get().unescape() + if not token.is_identifier(): + raise dns.exception.SyntaxError('expecting an identifier') + if not token.value.isdigit(): + raise dns.exception.SyntaxError('expecting an integer') + return int(token.value) + + def get_uint8(self): + """Read the next token and interpret it as an 8-bit unsigned + integer. + + @raises dns.exception.SyntaxError: + @rtype: int + """ + + value = self.get_int() + if value < 0 or value > 255: + raise dns.exception.SyntaxError( + '%d is not an unsigned 8-bit integer' % value) + return value + + def get_uint16(self): + """Read the next token and interpret it as a 16-bit unsigned + integer. + + @raises dns.exception.SyntaxError: + @rtype: int + """ + + value = self.get_int() + if value < 0 or value > 65535: + raise dns.exception.SyntaxError( + '%d is not an unsigned 16-bit integer' % value) + return value + + def get_uint32(self): + """Read the next token and interpret it as a 32-bit unsigned + integer. + + @raises dns.exception.SyntaxError: + @rtype: int + """ + + token = self.get().unescape() + if not token.is_identifier(): + raise dns.exception.SyntaxError('expecting an identifier') + if not token.value.isdigit(): + raise dns.exception.SyntaxError('expecting an integer') + value = long(token.value) + if value < 0 or value > long(4294967296): + raise dns.exception.SyntaxError( + '%d is not an unsigned 32-bit integer' % value) + return value + + def get_string(self, origin=None): + """Read the next token and interpret it as a string. + + @raises dns.exception.SyntaxError: + @rtype: string + """ + + token = self.get().unescape() + if not (token.is_identifier() or token.is_quoted_string()): + raise dns.exception.SyntaxError('expecting a string') + return token.value + + def get_identifier(self, origin=None): + """Read the next token and raise an exception if it is not an identifier. + + @raises dns.exception.SyntaxError: + @rtype: string + """ + + token = self.get().unescape() + if not token.is_identifier(): + raise dns.exception.SyntaxError('expecting an identifier') + return token.value + + def get_name(self, origin=None): + """Read the next token and interpret it as a DNS name. + + @raises dns.exception.SyntaxError: + @rtype: dns.name.Name object""" + + token = self.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError('expecting an identifier') + return dns.name.from_text(token.value, origin) + + def get_eol(self): + """Read the next token and raise an exception if it isn't EOL or + EOF. + + @raises dns.exception.SyntaxError: + @rtype: string + """ + + token = self.get() + if not token.is_eol_or_eof(): + raise dns.exception.SyntaxError( + 'expected EOL or EOF, got %d "%s"' % (token.ttype, + token.value)) + return token.value + + def get_ttl(self): + token = self.get().unescape() + if not token.is_identifier(): + raise dns.exception.SyntaxError('expecting an identifier') + return dns.ttl.from_text(token.value) diff --git a/Contents/Libraries/Shared/dns/tsig.py b/Contents/Libraries/Shared/dns/tsig.py new file mode 100644 index 000000000..c57d879fa --- /dev/null +++ b/Contents/Libraries/Shared/dns/tsig.py @@ -0,0 +1,234 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS TSIG support.""" + +import hmac +import struct + +import dns.exception +import dns.hash +import dns.rdataclass +import dns.name +from ._compat import long, string_types, text_type + +class BadTime(dns.exception.DNSException): + + """The current time is not within the TSIG's validity time.""" + + +class BadSignature(dns.exception.DNSException): + + """The TSIG signature fails to verify.""" + + +class PeerError(dns.exception.DNSException): + + """Base class for all TSIG errors generated by the remote peer""" + + +class PeerBadKey(PeerError): + + """The peer didn't know the key we used""" + + +class PeerBadSignature(PeerError): + + """The peer didn't like the signature we sent""" + + +class PeerBadTime(PeerError): + + """The peer didn't like the time we sent""" + + +class PeerBadTruncation(PeerError): + + """The peer didn't like amount of truncation in the TSIG we sent""" + +# TSIG Algorithms + +HMAC_MD5 = dns.name.from_text("HMAC-MD5.SIG-ALG.REG.INT") +HMAC_SHA1 = dns.name.from_text("hmac-sha1") +HMAC_SHA224 = dns.name.from_text("hmac-sha224") +HMAC_SHA256 = dns.name.from_text("hmac-sha256") +HMAC_SHA384 = dns.name.from_text("hmac-sha384") +HMAC_SHA512 = dns.name.from_text("hmac-sha512") + +_hashes = { + HMAC_SHA224: 'SHA224', + HMAC_SHA256: 'SHA256', + HMAC_SHA384: 'SHA384', + HMAC_SHA512: 'SHA512', + HMAC_SHA1: 'SHA1', + HMAC_MD5: 'MD5', +} + +default_algorithm = HMAC_MD5 + +BADSIG = 16 +BADKEY = 17 +BADTIME = 18 +BADTRUNC = 22 + + +def sign(wire, keyname, secret, time, fudge, original_id, error, + other_data, request_mac, ctx=None, multi=False, first=True, + algorithm=default_algorithm): + """Return a (tsig_rdata, mac, ctx) tuple containing the HMAC TSIG rdata + for the input parameters, the HMAC MAC calculated by applying the + TSIG signature algorithm, and the TSIG digest context. + @rtype: (string, string, hmac.HMAC object) + @raises ValueError: I{other_data} is too long + @raises NotImplementedError: I{algorithm} is not supported + """ + + if isinstance(other_data, text_type): + other_data = other_data.encode() + (algorithm_name, digestmod) = get_algorithm(algorithm) + if first: + ctx = hmac.new(secret, digestmod=digestmod) + ml = len(request_mac) + if ml > 0: + ctx.update(struct.pack('!H', ml)) + ctx.update(request_mac) + id = struct.pack('!H', original_id) + ctx.update(id) + ctx.update(wire[2:]) + if first: + ctx.update(keyname.to_digestable()) + ctx.update(struct.pack('!H', dns.rdataclass.ANY)) + ctx.update(struct.pack('!I', 0)) + long_time = time + long(0) + upper_time = (long_time >> 32) & long(0xffff) + lower_time = long_time & long(0xffffffff) + time_mac = struct.pack('!HIH', upper_time, lower_time, fudge) + pre_mac = algorithm_name + time_mac + ol = len(other_data) + if ol > 65535: + raise ValueError('TSIG Other Data is > 65535 bytes') + post_mac = struct.pack('!HH', error, ol) + other_data + if first: + ctx.update(pre_mac) + ctx.update(post_mac) + else: + ctx.update(time_mac) + mac = ctx.digest() + mpack = struct.pack('!H', len(mac)) + tsig_rdata = pre_mac + mpack + mac + id + post_mac + if multi: + ctx = hmac.new(secret, digestmod=digestmod) + ml = len(mac) + ctx.update(struct.pack('!H', ml)) + ctx.update(mac) + else: + ctx = None + return (tsig_rdata, mac, ctx) + + +def hmac_md5(wire, keyname, secret, time, fudge, original_id, error, + other_data, request_mac, ctx=None, multi=False, first=True, + algorithm=default_algorithm): + return sign(wire, keyname, secret, time, fudge, original_id, error, + other_data, request_mac, ctx, multi, first, algorithm) + + +def validate(wire, keyname, secret, now, request_mac, tsig_start, tsig_rdata, + tsig_rdlen, ctx=None, multi=False, first=True): + """Validate the specified TSIG rdata against the other input parameters. + + @raises FormError: The TSIG is badly formed. + @raises BadTime: There is too much time skew between the client and the + server. + @raises BadSignature: The TSIG signature did not validate + @rtype: hmac.HMAC object""" + + (adcount,) = struct.unpack("!H", wire[10:12]) + if adcount == 0: + raise dns.exception.FormError + adcount -= 1 + new_wire = wire[0:10] + struct.pack("!H", adcount) + wire[12:tsig_start] + current = tsig_rdata + (aname, used) = dns.name.from_wire(wire, current) + current = current + used + (upper_time, lower_time, fudge, mac_size) = \ + struct.unpack("!HIHH", wire[current:current + 10]) + time = ((upper_time + long(0)) << 32) + (lower_time + long(0)) + current += 10 + mac = wire[current:current + mac_size] + current += mac_size + (original_id, error, other_size) = \ + struct.unpack("!HHH", wire[current:current + 6]) + current += 6 + other_data = wire[current:current + other_size] + current += other_size + if current != tsig_rdata + tsig_rdlen: + raise dns.exception.FormError + if error != 0: + if error == BADSIG: + raise PeerBadSignature + elif error == BADKEY: + raise PeerBadKey + elif error == BADTIME: + raise PeerBadTime + elif error == BADTRUNC: + raise PeerBadTruncation + else: + raise PeerError('unknown TSIG error code %d' % error) + time_low = time - fudge + time_high = time + fudge + if now < time_low or now > time_high: + raise BadTime + (junk, our_mac, ctx) = sign(new_wire, keyname, secret, time, fudge, + original_id, error, other_data, + request_mac, ctx, multi, first, aname) + if our_mac != mac: + raise BadSignature + return ctx + + +def get_algorithm(algorithm): + """Returns the wire format string and the hash module to use for the + specified TSIG algorithm + + @rtype: (string, hash constructor) + @raises NotImplementedError: I{algorithm} is not supported + """ + + if isinstance(algorithm, string_types): + algorithm = dns.name.from_text(algorithm) + + try: + return (algorithm.to_digestable(), dns.hash.hashes[_hashes[algorithm]]) + except KeyError: + raise NotImplementedError("TSIG algorithm " + str(algorithm) + + " is not supported") + + +def get_algorithm_and_mac(wire, tsig_rdata, tsig_rdlen): + """Return the tsig algorithm for the specified tsig_rdata + @raises FormError: The TSIG is badly formed. + """ + current = tsig_rdata + (aname, used) = dns.name.from_wire(wire, current) + current = current + used + (upper_time, lower_time, fudge, mac_size) = \ + struct.unpack("!HIHH", wire[current:current + 10]) + current += 10 + mac = wire[current:current + mac_size] + current += mac_size + if current > tsig_rdata + tsig_rdlen: + raise dns.exception.FormError + return (aname, mac) diff --git a/Contents/Libraries/Shared/dns/tsigkeyring.py b/Contents/Libraries/Shared/dns/tsigkeyring.py new file mode 100644 index 000000000..01f87027c --- /dev/null +++ b/Contents/Libraries/Shared/dns/tsigkeyring.py @@ -0,0 +1,48 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""A place to store TSIG keys.""" + +from dns._compat import maybe_decode, maybe_encode + +import base64 + +import dns.name + + +def from_text(textring): + """Convert a dictionary containing (textual DNS name, base64 secret) pairs + into a binary keyring which has (dns.name.Name, binary secret) pairs. + @rtype: dict""" + + keyring = {} + for keytext in textring: + keyname = dns.name.from_text(keytext) + secret = base64.decodestring(maybe_encode(textring[keytext])) + keyring[keyname] = secret + return keyring + + +def to_text(keyring): + """Convert a dictionary containing (dns.name.Name, binary secret) pairs + into a text keyring which has (textual DNS name, base64 secret) pairs. + @rtype: dict""" + + textring = {} + for keyname in keyring: + keytext = maybe_decode(keyname.to_text()) + secret = maybe_decode(base64.encodestring(keyring[keyname])) + textring[keytext] = secret + return textring diff --git a/Contents/Libraries/Shared/dns/ttl.py b/Contents/Libraries/Shared/dns/ttl.py new file mode 100644 index 000000000..a27d82518 --- /dev/null +++ b/Contents/Libraries/Shared/dns/ttl.py @@ -0,0 +1,68 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS TTL conversion.""" + +import dns.exception +from ._compat import long + + +class BadTTL(dns.exception.SyntaxError): + + """DNS TTL value is not well-formed.""" + + +def from_text(text): + """Convert the text form of a TTL to an integer. + + The BIND 8 units syntax for TTLs (e.g. '1w6d4h3m10s') is supported. + + @param text: the textual TTL + @type text: string + @raises dns.ttl.BadTTL: the TTL is not well-formed + @rtype: int + """ + + if text.isdigit(): + total = long(text) + else: + if not text[0].isdigit(): + raise BadTTL + total = long(0) + current = long(0) + for c in text: + if c.isdigit(): + current *= 10 + current += long(c) + else: + c = c.lower() + if c == 'w': + total += current * long(604800) + elif c == 'd': + total += current * long(86400) + elif c == 'h': + total += current * long(3600) + elif c == 'm': + total += current * long(60) + elif c == 's': + total += current + else: + raise BadTTL("unknown unit '%s'" % c) + current = 0 + if not current == 0: + raise BadTTL("trailing integer") + if total < long(0) or total > long(2147483647): + raise BadTTL("TTL should be between 0 and 2^31 - 1 (inclusive)") + return total diff --git a/Contents/Libraries/Shared/dns/update.py b/Contents/Libraries/Shared/dns/update.py new file mode 100644 index 000000000..59728d982 --- /dev/null +++ b/Contents/Libraries/Shared/dns/update.py @@ -0,0 +1,249 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Dynamic Update Support""" + + +import dns.message +import dns.name +import dns.opcode +import dns.rdata +import dns.rdataclass +import dns.rdataset +import dns.tsig +from ._compat import string_types + + +class Update(dns.message.Message): + + def __init__(self, zone, rdclass=dns.rdataclass.IN, keyring=None, + keyname=None, keyalgorithm=dns.tsig.default_algorithm): + """Initialize a new DNS Update object. + + @param zone: The zone which is being updated. + @type zone: A dns.name.Name or string + @param rdclass: The class of the zone; defaults to dns.rdataclass.IN. + @type rdclass: An int designating the class, or a string whose value + is the name of a class. + @param keyring: The TSIG keyring to use; defaults to None. + @type keyring: dict + @param keyname: The name of the TSIG key to use; defaults to None. + The key must be defined in the keyring. If a keyring is specified + but a keyname is not, then the key used will be the first key in the + keyring. Note that the order of keys in a dictionary is not defined, + so applications should supply a keyname when a keyring is used, unless + they know the keyring contains only one key. + @type keyname: dns.name.Name or string + @param keyalgorithm: The TSIG algorithm to use; defaults to + dns.tsig.default_algorithm. Constants for TSIG algorithms are defined + in dns.tsig, and the currently implemented algorithms are + HMAC_MD5, HMAC_SHA1, HMAC_SHA224, HMAC_SHA256, HMAC_SHA384, and + HMAC_SHA512. + @type keyalgorithm: string + """ + super(Update, self).__init__() + self.flags |= dns.opcode.to_flags(dns.opcode.UPDATE) + if isinstance(zone, string_types): + zone = dns.name.from_text(zone) + self.origin = zone + if isinstance(rdclass, string_types): + rdclass = dns.rdataclass.from_text(rdclass) + self.zone_rdclass = rdclass + self.find_rrset(self.question, self.origin, rdclass, dns.rdatatype.SOA, + create=True, force_unique=True) + if keyring is not None: + self.use_tsig(keyring, keyname, algorithm=keyalgorithm) + + def _add_rr(self, name, ttl, rd, deleting=None, section=None): + """Add a single RR to the update section.""" + + if section is None: + section = self.authority + covers = rd.covers() + rrset = self.find_rrset(section, name, self.zone_rdclass, rd.rdtype, + covers, deleting, True, True) + rrset.add(rd, ttl) + + def _add(self, replace, section, name, *args): + """Add records. The first argument is the replace mode. If + false, RRs are added to an existing RRset; if true, the RRset + is replaced with the specified contents. The second + argument is the section to add to. The third argument + is always a name. The other arguments can be: + + - rdataset... + + - ttl, rdata... + + - ttl, rdtype, string...""" + + if isinstance(name, string_types): + name = dns.name.from_text(name, None) + if isinstance(args[0], dns.rdataset.Rdataset): + for rds in args: + if replace: + self.delete(name, rds.rdtype) + for rd in rds: + self._add_rr(name, rds.ttl, rd, section=section) + else: + args = list(args) + ttl = int(args.pop(0)) + if isinstance(args[0], dns.rdata.Rdata): + if replace: + self.delete(name, args[0].rdtype) + for rd in args: + self._add_rr(name, ttl, rd, section=section) + else: + rdtype = args.pop(0) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if replace: + self.delete(name, rdtype) + for s in args: + rd = dns.rdata.from_text(self.zone_rdclass, rdtype, s, + self.origin) + self._add_rr(name, ttl, rd, section=section) + + def add(self, name, *args): + """Add records. The first argument is always a name. The other + arguments can be: + + - rdataset... + + - ttl, rdata... + + - ttl, rdtype, string...""" + self._add(False, self.authority, name, *args) + + def delete(self, name, *args): + """Delete records. The first argument is always a name. The other + arguments can be: + + - I{nothing} + + - rdataset... + + - rdata... + + - rdtype, [string...]""" + + if isinstance(name, string_types): + name = dns.name.from_text(name, None) + if len(args) == 0: + self.find_rrset(self.authority, name, dns.rdataclass.ANY, + dns.rdatatype.ANY, dns.rdatatype.NONE, + dns.rdatatype.ANY, True, True) + elif isinstance(args[0], dns.rdataset.Rdataset): + for rds in args: + for rd in rds: + self._add_rr(name, 0, rd, dns.rdataclass.NONE) + else: + args = list(args) + if isinstance(args[0], dns.rdata.Rdata): + for rd in args: + self._add_rr(name, 0, rd, dns.rdataclass.NONE) + else: + rdtype = args.pop(0) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if len(args) == 0: + self.find_rrset(self.authority, name, + self.zone_rdclass, rdtype, + dns.rdatatype.NONE, + dns.rdataclass.ANY, + True, True) + else: + for s in args: + rd = dns.rdata.from_text(self.zone_rdclass, rdtype, s, + self.origin) + self._add_rr(name, 0, rd, dns.rdataclass.NONE) + + def replace(self, name, *args): + """Replace records. The first argument is always a name. The other + arguments can be: + + - rdataset... + + - ttl, rdata... + + - ttl, rdtype, string... + + Note that if you want to replace the entire node, you should do + a delete of the name followed by one or more calls to add.""" + + self._add(True, self.authority, name, *args) + + def present(self, name, *args): + """Require that an owner name (and optionally an rdata type, + or specific rdataset) exists as a prerequisite to the + execution of the update. The first argument is always a name. + The other arguments can be: + + - rdataset... + + - rdata... + + - rdtype, string...""" + + if isinstance(name, string_types): + name = dns.name.from_text(name, None) + if len(args) == 0: + self.find_rrset(self.answer, name, + dns.rdataclass.ANY, dns.rdatatype.ANY, + dns.rdatatype.NONE, None, + True, True) + elif isinstance(args[0], dns.rdataset.Rdataset) or \ + isinstance(args[0], dns.rdata.Rdata) or \ + len(args) > 1: + if not isinstance(args[0], dns.rdataset.Rdataset): + # Add a 0 TTL + args = list(args) + args.insert(0, 0) + self._add(False, self.answer, name, *args) + else: + rdtype = args[0] + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + self.find_rrset(self.answer, name, + dns.rdataclass.ANY, rdtype, + dns.rdatatype.NONE, None, + True, True) + + def absent(self, name, rdtype=None): + """Require that an owner name (and optionally an rdata type) does + not exist as a prerequisite to the execution of the update.""" + + if isinstance(name, string_types): + name = dns.name.from_text(name, None) + if rdtype is None: + self.find_rrset(self.answer, name, + dns.rdataclass.NONE, dns.rdatatype.ANY, + dns.rdatatype.NONE, None, + True, True) + else: + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + self.find_rrset(self.answer, name, + dns.rdataclass.NONE, rdtype, + dns.rdatatype.NONE, None, + True, True) + + def to_wire(self, origin=None, max_size=65535): + """Return a string containing the update in DNS compressed wire + format. + @rtype: string""" + if origin is None: + origin = self.origin + return super(Update, self).to_wire(origin, max_size) diff --git a/Contents/Libraries/Shared/dns/version.py b/Contents/Libraries/Shared/dns/version.py new file mode 100644 index 000000000..9e8dbb1b0 --- /dev/null +++ b/Contents/Libraries/Shared/dns/version.py @@ -0,0 +1,34 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""dnspython release version information.""" + +MAJOR = 1 +MINOR = 15 +MICRO = 0 +RELEASELEVEL = 0x0f +SERIAL = 0 + +if RELEASELEVEL == 0x0f: + version = '%d.%d.%d' % (MAJOR, MINOR, MICRO) +elif RELEASELEVEL == 0x00: + version = '%d.%d.%dx%d' % \ + (MAJOR, MINOR, MICRO, SERIAL) +else: + version = '%d.%d.%d%x%d' % \ + (MAJOR, MINOR, MICRO, RELEASELEVEL, SERIAL) + +hexversion = MAJOR << 24 | MINOR << 16 | MICRO << 8 | RELEASELEVEL << 4 | \ + SERIAL diff --git a/Contents/Libraries/Shared/dns/wiredata.py b/Contents/Libraries/Shared/dns/wiredata.py new file mode 100644 index 000000000..ccef59545 --- /dev/null +++ b/Contents/Libraries/Shared/dns/wiredata.py @@ -0,0 +1,103 @@ +# Copyright (C) 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Wire Data Helper""" + +import sys + +import dns.exception +from ._compat import binary_type, string_types + +# Figure out what constant python passes for an unspecified slice bound. +# It's supposed to be sys.maxint, yet on 64-bit windows sys.maxint is 2^31 - 1 +# but Python uses 2^63 - 1 as the constant. Rather than making pointless +# extra comparisons, duplicating code, or weakening WireData, we just figure +# out what constant Python will use. + + +class _SliceUnspecifiedBound(binary_type): + + def __getitem__(self, key): + return key.stop + + if sys.version_info < (3,): + def __getslice__(self, i, j): # pylint: disable=getslice-method + return self.__getitem__(slice(i, j)) + +_unspecified_bound = _SliceUnspecifiedBound()[1:] + + +class WireData(binary_type): + # WireData is a string with stricter slicing + + def __getitem__(self, key): + try: + if isinstance(key, slice): + # make sure we are not going outside of valid ranges, + # do stricter control of boundaries than python does + # by default + start = key.start + stop = key.stop + + if sys.version_info < (3,): + if stop == _unspecified_bound: + # handle the case where the right bound is unspecified + stop = len(self) + + if start < 0 or stop < 0: + raise dns.exception.FormError + # If it's not an empty slice, access left and right bounds + # to make sure they're valid + if start != stop: + super(WireData, self).__getitem__(start) + super(WireData, self).__getitem__(stop - 1) + else: + for index in (start, stop): + if index is None: + continue + elif abs(index) > len(self): + raise dns.exception.FormError + + return WireData(super(WireData, self).__getitem__( + slice(start, stop))) + return bytearray(self.unwrap())[key] + except IndexError: + raise dns.exception.FormError + + if sys.version_info < (3,): + def __getslice__(self, i, j): # pylint: disable=getslice-method + return self.__getitem__(slice(i, j)) + + def __iter__(self): + i = 0 + while 1: + try: + yield self[i] + i += 1 + except dns.exception.FormError: + raise StopIteration + + def unwrap(self): + return binary_type(self) + + +def maybe_wrap(wire): + if isinstance(wire, WireData): + return wire + elif isinstance(wire, binary_type): + return WireData(wire) + elif isinstance(wire, string_types): + return WireData(wire.encode()) + raise ValueError("unhandled type %s" % type(wire)) diff --git a/Contents/Libraries/Shared/dns/zone.py b/Contents/Libraries/Shared/dns/zone.py new file mode 100644 index 000000000..468618f67 --- /dev/null +++ b/Contents/Libraries/Shared/dns/zone.py @@ -0,0 +1,1087 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Zones.""" + +from __future__ import generators + +import sys +import re +import os +from io import BytesIO + +import dns.exception +import dns.name +import dns.node +import dns.rdataclass +import dns.rdatatype +import dns.rdata +import dns.rrset +import dns.tokenizer +import dns.ttl +import dns.grange +from ._compat import string_types, text_type + + +_py3 = sys.version_info > (3,) + + +class BadZone(dns.exception.DNSException): + + """The DNS zone is malformed.""" + + +class NoSOA(BadZone): + + """The DNS zone has no SOA RR at its origin.""" + + +class NoNS(BadZone): + + """The DNS zone has no NS RRset at its origin.""" + + +class UnknownOrigin(BadZone): + + """The DNS zone's origin is unknown.""" + + +class Zone(object): + + """A DNS zone. + + A Zone is a mapping from names to nodes. The zone object may be + treated like a Python dictionary, e.g. zone[name] will retrieve + the node associated with that name. The I{name} may be a + dns.name.Name object, or it may be a string. In the either case, + if the name is relative it is treated as relative to the origin of + the zone. + + @ivar rdclass: The zone's rdata class; the default is class IN. + @type rdclass: int + @ivar origin: The origin of the zone. + @type origin: dns.name.Name object + @ivar nodes: A dictionary mapping the names of nodes in the zone to the + nodes themselves. + @type nodes: dict + @ivar relativize: should names in the zone be relativized? + @type relativize: bool + @cvar node_factory: the factory used to create a new node + @type node_factory: class or callable + """ + + node_factory = dns.node.Node + + __slots__ = ['rdclass', 'origin', 'nodes', 'relativize'] + + def __init__(self, origin, rdclass=dns.rdataclass.IN, relativize=True): + """Initialize a zone object. + + @param origin: The origin of the zone. + @type origin: dns.name.Name object + @param rdclass: The zone's rdata class; the default is class IN. + @type rdclass: int""" + + if origin is not None: + if isinstance(origin, string_types): + origin = dns.name.from_text(origin) + elif not isinstance(origin, dns.name.Name): + raise ValueError("origin parameter must be convertible to a " + "DNS name") + if not origin.is_absolute(): + raise ValueError("origin parameter must be an absolute name") + self.origin = origin + self.rdclass = rdclass + self.nodes = {} + self.relativize = relativize + + def __eq__(self, other): + """Two zones are equal if they have the same origin, class, and + nodes. + @rtype: bool + """ + + if not isinstance(other, Zone): + return False + if self.rdclass != other.rdclass or \ + self.origin != other.origin or \ + self.nodes != other.nodes: + return False + return True + + def __ne__(self, other): + """Are two zones not equal? + @rtype: bool + """ + + return not self.__eq__(other) + + def _validate_name(self, name): + if isinstance(name, string_types): + name = dns.name.from_text(name, None) + elif not isinstance(name, dns.name.Name): + raise KeyError("name parameter must be convertible to a DNS name") + if name.is_absolute(): + if not name.is_subdomain(self.origin): + raise KeyError( + "name parameter must be a subdomain of the zone origin") + if self.relativize: + name = name.relativize(self.origin) + return name + + def __getitem__(self, key): + key = self._validate_name(key) + return self.nodes[key] + + def __setitem__(self, key, value): + key = self._validate_name(key) + self.nodes[key] = value + + def __delitem__(self, key): + key = self._validate_name(key) + del self.nodes[key] + + def __iter__(self): + return self.nodes.__iter__() + + def iterkeys(self): + if _py3: + return self.nodes.keys() + else: + return self.nodes.iterkeys() # pylint: disable=dict-iter-method + + def keys(self): + return self.nodes.keys() + + def itervalues(self): + if _py3: + return self.nodes.values() + else: + return self.nodes.itervalues() # pylint: disable=dict-iter-method + + def values(self): + return self.nodes.values() + + def items(self): + return self.nodes.items() + + iteritems = items + + def get(self, key): + key = self._validate_name(key) + return self.nodes.get(key) + + def __contains__(self, other): + return other in self.nodes + + def find_node(self, name, create=False): + """Find a node in the zone, possibly creating it. + + @param name: the name of the node to find + @type name: dns.name.Name object or string + @param create: should the node be created if it doesn't exist? + @type create: bool + @raises KeyError: the name is not known and create was not specified. + @rtype: dns.node.Node object + """ + + name = self._validate_name(name) + node = self.nodes.get(name) + if node is None: + if not create: + raise KeyError + node = self.node_factory() + self.nodes[name] = node + return node + + def get_node(self, name, create=False): + """Get a node in the zone, possibly creating it. + + This method is like L{find_node}, except it returns None instead + of raising an exception if the node does not exist and creation + has not been requested. + + @param name: the name of the node to find + @type name: dns.name.Name object or string + @param create: should the node be created if it doesn't exist? + @type create: bool + @rtype: dns.node.Node object or None + """ + + try: + node = self.find_node(name, create) + except KeyError: + node = None + return node + + def delete_node(self, name): + """Delete the specified node if it exists. + + It is not an error if the node does not exist. + """ + + name = self._validate_name(name) + if name in self.nodes: + del self.nodes[name] + + def find_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE, + create=False): + """Look for rdata with the specified name and type in the zone, + and return an rdataset encapsulating it. + + The I{name}, I{rdtype}, and I{covers} parameters may be + strings, in which case they will be converted to their proper + type. + + The rdataset returned is not a copy; changes to it will change + the zone. + + KeyError is raised if the name or type are not found. + Use L{get_rdataset} if you want to have None returned instead. + + @param name: the owner name to look for + @type name: DNS.name.Name object or string + @param rdtype: the rdata type desired + @type rdtype: int or string + @param covers: the covered type (defaults to None) + @type covers: int or string + @param create: should the node and rdataset be created if they do not + exist? + @type create: bool + @raises KeyError: the node or rdata could not be found + @rtype: dns.rrset.RRset object + """ + + name = self._validate_name(name) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if isinstance(covers, string_types): + covers = dns.rdatatype.from_text(covers) + node = self.find_node(name, create) + return node.find_rdataset(self.rdclass, rdtype, covers, create) + + def get_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE, + create=False): + """Look for rdata with the specified name and type in the zone, + and return an rdataset encapsulating it. + + The I{name}, I{rdtype}, and I{covers} parameters may be + strings, in which case they will be converted to their proper + type. + + The rdataset returned is not a copy; changes to it will change + the zone. + + None is returned if the name or type are not found. + Use L{find_rdataset} if you want to have KeyError raised instead. + + @param name: the owner name to look for + @type name: DNS.name.Name object or string + @param rdtype: the rdata type desired + @type rdtype: int or string + @param covers: the covered type (defaults to None) + @type covers: int or string + @param create: should the node and rdataset be created if they do not + exist? + @type create: bool + @rtype: dns.rrset.RRset object + """ + + try: + rdataset = self.find_rdataset(name, rdtype, covers, create) + except KeyError: + rdataset = None + return rdataset + + def delete_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE): + """Delete the rdataset matching I{rdtype} and I{covers}, if it + exists at the node specified by I{name}. + + The I{name}, I{rdtype}, and I{covers} parameters may be + strings, in which case they will be converted to their proper + type. + + It is not an error if the node does not exist, or if there is no + matching rdataset at the node. + + If the node has no rdatasets after the deletion, it will itself + be deleted. + + @param name: the owner name to look for + @type name: DNS.name.Name object or string + @param rdtype: the rdata type desired + @type rdtype: int or string + @param covers: the covered type (defaults to None) + @type covers: int or string + """ + + name = self._validate_name(name) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if isinstance(covers, string_types): + covers = dns.rdatatype.from_text(covers) + node = self.get_node(name) + if node is not None: + node.delete_rdataset(self.rdclass, rdtype, covers) + if len(node) == 0: + self.delete_node(name) + + def replace_rdataset(self, name, replacement): + """Replace an rdataset at name. + + It is not an error if there is no rdataset matching I{replacement}. + + Ownership of the I{replacement} object is transferred to the zone; + in other words, this method does not store a copy of I{replacement} + at the node, it stores I{replacement} itself. + + If the I{name} node does not exist, it is created. + + @param name: the owner name + @type name: DNS.name.Name object or string + @param replacement: the replacement rdataset + @type replacement: dns.rdataset.Rdataset + """ + + if replacement.rdclass != self.rdclass: + raise ValueError('replacement.rdclass != zone.rdclass') + node = self.find_node(name, True) + node.replace_rdataset(replacement) + + def find_rrset(self, name, rdtype, covers=dns.rdatatype.NONE): + """Look for rdata with the specified name and type in the zone, + and return an RRset encapsulating it. + + The I{name}, I{rdtype}, and I{covers} parameters may be + strings, in which case they will be converted to their proper + type. + + This method is less efficient than the similar + L{find_rdataset} because it creates an RRset instead of + returning the matching rdataset. It may be more convenient + for some uses since it returns an object which binds the owner + name to the rdata. + + This method may not be used to create new nodes or rdatasets; + use L{find_rdataset} instead. + + KeyError is raised if the name or type are not found. + Use L{get_rrset} if you want to have None returned instead. + + @param name: the owner name to look for + @type name: DNS.name.Name object or string + @param rdtype: the rdata type desired + @type rdtype: int or string + @param covers: the covered type (defaults to None) + @type covers: int or string + @raises KeyError: the node or rdata could not be found + @rtype: dns.rrset.RRset object + """ + + name = self._validate_name(name) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if isinstance(covers, string_types): + covers = dns.rdatatype.from_text(covers) + rdataset = self.nodes[name].find_rdataset(self.rdclass, rdtype, covers) + rrset = dns.rrset.RRset(name, self.rdclass, rdtype, covers) + rrset.update(rdataset) + return rrset + + def get_rrset(self, name, rdtype, covers=dns.rdatatype.NONE): + """Look for rdata with the specified name and type in the zone, + and return an RRset encapsulating it. + + The I{name}, I{rdtype}, and I{covers} parameters may be + strings, in which case they will be converted to their proper + type. + + This method is less efficient than the similar L{get_rdataset} + because it creates an RRset instead of returning the matching + rdataset. It may be more convenient for some uses since it + returns an object which binds the owner name to the rdata. + + This method may not be used to create new nodes or rdatasets; + use L{find_rdataset} instead. + + None is returned if the name or type are not found. + Use L{find_rrset} if you want to have KeyError raised instead. + + @param name: the owner name to look for + @type name: DNS.name.Name object or string + @param rdtype: the rdata type desired + @type rdtype: int or string + @param covers: the covered type (defaults to None) + @type covers: int or string + @rtype: dns.rrset.RRset object + """ + + try: + rrset = self.find_rrset(name, rdtype, covers) + except KeyError: + rrset = None + return rrset + + def iterate_rdatasets(self, rdtype=dns.rdatatype.ANY, + covers=dns.rdatatype.NONE): + """Return a generator which yields (name, rdataset) tuples for + all rdatasets in the zone which have the specified I{rdtype} + and I{covers}. If I{rdtype} is dns.rdatatype.ANY, the default, + then all rdatasets will be matched. + + @param rdtype: int or string + @type rdtype: int or string + @param covers: the covered type (defaults to None) + @type covers: int or string + """ + + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if isinstance(covers, string_types): + covers = dns.rdatatype.from_text(covers) + for (name, node) in self.iteritems(): + for rds in node: + if rdtype == dns.rdatatype.ANY or \ + (rds.rdtype == rdtype and rds.covers == covers): + yield (name, rds) + + def iterate_rdatas(self, rdtype=dns.rdatatype.ANY, + covers=dns.rdatatype.NONE): + """Return a generator which yields (name, ttl, rdata) tuples for + all rdatas in the zone which have the specified I{rdtype} + and I{covers}. If I{rdtype} is dns.rdatatype.ANY, the default, + then all rdatas will be matched. + + @param rdtype: int or string + @type rdtype: int or string + @param covers: the covered type (defaults to None) + @type covers: int or string + """ + + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if isinstance(covers, string_types): + covers = dns.rdatatype.from_text(covers) + for (name, node) in self.iteritems(): + for rds in node: + if rdtype == dns.rdatatype.ANY or \ + (rds.rdtype == rdtype and rds.covers == covers): + for rdata in rds: + yield (name, rds.ttl, rdata) + + def to_file(self, f, sorted=True, relativize=True, nl=None): + """Write a zone to a file. + + @param f: file or string. If I{f} is a string, it is treated + as the name of a file to open. + @param sorted: if True, the file will be written with the + names sorted in DNSSEC order from least to greatest. Otherwise + the names will be written in whatever order they happen to have + in the zone's dictionary. + @param relativize: if True, domain names in the output will be + relativized to the zone's origin (if possible). + @type relativize: bool + @param nl: The end of line string. If not specified, the + output will use the platform's native end-of-line marker (i.e. + LF on POSIX, CRLF on Windows, CR on Macintosh). + @type nl: string or None + """ + + if isinstance(f, string_types): + f = open(f, 'wb') + want_close = True + else: + want_close = False + + # must be in this way, f.encoding may contain None, or even attribute + # may not be there + file_enc = getattr(f, 'encoding', None) + if file_enc is None: + file_enc = 'utf-8' + + if nl is None: + nl_b = os.linesep.encode(file_enc) # binary mode, '\n' is not enough + nl = u'\n' + elif isinstance(nl, string_types): + nl_b = nl.encode(file_enc) + else: + nl_b = nl + nl = nl.decode() + + try: + if sorted: + names = list(self.keys()) + names.sort() + else: + names = self.iterkeys() + for n in names: + l = self[n].to_text(n, origin=self.origin, + relativize=relativize) + if isinstance(l, text_type): + l_b = l.encode(file_enc) + else: + l_b = l + l = l.decode() + + try: + f.write(l_b) + f.write(nl_b) + except TypeError: # textual mode + f.write(l) + f.write(nl) + finally: + if want_close: + f.close() + + def to_text(self, sorted=True, relativize=True, nl=None): + """Return a zone's text as though it were written to a file. + + @param sorted: if True, the file will be written with the + names sorted in DNSSEC order from least to greatest. Otherwise + the names will be written in whatever order they happen to have + in the zone's dictionary. + @param relativize: if True, domain names in the output will be + relativized to the zone's origin (if possible). + @type relativize: bool + @param nl: The end of line string. If not specified, the + output will use the platform's native end-of-line marker (i.e. + LF on POSIX, CRLF on Windows, CR on Macintosh). + @type nl: string or None + """ + temp_buffer = BytesIO() + self.to_file(temp_buffer, sorted, relativize, nl) + return_value = temp_buffer.getvalue() + temp_buffer.close() + return return_value + + def check_origin(self): + """Do some simple checking of the zone's origin. + + @raises dns.zone.NoSOA: there is no SOA RR + @raises dns.zone.NoNS: there is no NS RRset + @raises KeyError: there is no origin node + """ + if self.relativize: + name = dns.name.empty + else: + name = self.origin + if self.get_rdataset(name, dns.rdatatype.SOA) is None: + raise NoSOA + if self.get_rdataset(name, dns.rdatatype.NS) is None: + raise NoNS + + +class _MasterReader(object): + + """Read a DNS master file + + @ivar tok: The tokenizer + @type tok: dns.tokenizer.Tokenizer object + @ivar ttl: The default TTL + @type ttl: int + @ivar last_name: The last name read + @type last_name: dns.name.Name object + @ivar current_origin: The current origin + @type current_origin: dns.name.Name object + @ivar relativize: should names in the zone be relativized? + @type relativize: bool + @ivar zone: the zone + @type zone: dns.zone.Zone object + @ivar saved_state: saved reader state (used when processing $INCLUDE) + @type saved_state: list of (tokenizer, current_origin, last_name, file) + tuples. + @ivar current_file: the file object of the $INCLUDed file being parsed + (None if no $INCLUDE is active). + @ivar allow_include: is $INCLUDE allowed? + @type allow_include: bool + @ivar check_origin: should sanity checks of the origin node be done? + The default is True. + @type check_origin: bool + """ + + def __init__(self, tok, origin, rdclass, relativize, zone_factory=Zone, + allow_include=False, check_origin=True): + if isinstance(origin, string_types): + origin = dns.name.from_text(origin) + self.tok = tok + self.current_origin = origin + self.relativize = relativize + self.ttl = 0 + self.last_name = self.current_origin + self.zone = zone_factory(origin, rdclass, relativize=relativize) + self.saved_state = [] + self.current_file = None + self.allow_include = allow_include + self.check_origin = check_origin + + def _eat_line(self): + while 1: + token = self.tok.get() + if token.is_eol_or_eof(): + break + + def _rr_line(self): + """Process one line from a DNS master file.""" + # Name + if self.current_origin is None: + raise UnknownOrigin + token = self.tok.get(want_leading=True) + if not token.is_whitespace(): + self.last_name = dns.name.from_text( + token.value, self.current_origin) + else: + token = self.tok.get() + if token.is_eol_or_eof(): + # treat leading WS followed by EOL/EOF as if they were EOL/EOF. + return + self.tok.unget(token) + name = self.last_name + if not name.is_subdomain(self.zone.origin): + self._eat_line() + return + if self.relativize: + name = name.relativize(self.zone.origin) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + # TTL + try: + ttl = dns.ttl.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except dns.ttl.BadTTL: + ttl = self.ttl + # Class + try: + rdclass = dns.rdataclass.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except dns.exception.SyntaxError: + raise dns.exception.SyntaxError + except Exception: + rdclass = self.zone.rdclass + if rdclass != self.zone.rdclass: + raise dns.exception.SyntaxError("RR class is not zone's class") + # Type + try: + rdtype = dns.rdatatype.from_text(token.value) + except: + raise dns.exception.SyntaxError( + "unknown rdatatype '%s'" % token.value) + n = self.zone.nodes.get(name) + if n is None: + n = self.zone.node_factory() + self.zone.nodes[name] = n + try: + rd = dns.rdata.from_text(rdclass, rdtype, self.tok, + self.current_origin, False) + except dns.exception.SyntaxError: + # Catch and reraise. + (ty, va) = sys.exc_info()[:2] + raise va + except: + # All exceptions that occur in the processing of rdata + # are treated as syntax errors. This is not strictly + # correct, but it is correct almost all of the time. + # We convert them to syntax errors so that we can emit + # helpful filename:line info. + (ty, va) = sys.exc_info()[:2] + raise dns.exception.SyntaxError( + "caught exception %s: %s" % (str(ty), str(va))) + + rd.choose_relativity(self.zone.origin, self.relativize) + covers = rd.covers() + rds = n.find_rdataset(rdclass, rdtype, covers, True) + rds.add(rd, ttl) + + def _parse_modify(self, side): + # Here we catch everything in '{' '}' in a group so we can replace it + # with ''. + is_generate1 = re.compile("^.*\$({(\+|-?)(\d+),(\d+),(.)}).*$") + is_generate2 = re.compile("^.*\$({(\+|-?)(\d+)}).*$") + is_generate3 = re.compile("^.*\$({(\+|-?)(\d+),(\d+)}).*$") + # Sometimes there are modifiers in the hostname. These come after + # the dollar sign. They are in the form: ${offset[,width[,base]]}. + # Make names + g1 = is_generate1.match(side) + if g1: + mod, sign, offset, width, base = g1.groups() + if sign == '': + sign = '+' + g2 = is_generate2.match(side) + if g2: + mod, sign, offset = g2.groups() + if sign == '': + sign = '+' + width = 0 + base = 'd' + g3 = is_generate3.match(side) + if g3: + mod, sign, offset, width = g1.groups() + if sign == '': + sign = '+' + width = g1.groups()[2] + base = 'd' + + if not (g1 or g2 or g3): + mod = '' + sign = '+' + offset = 0 + width = 0 + base = 'd' + + if base != 'd': + raise NotImplementedError() + + return mod, sign, offset, width, base + + def _generate_line(self): + # range lhs [ttl] [class] type rhs [ comment ] + """Process one line containing the GENERATE statement from a DNS + master file.""" + if self.current_origin is None: + raise UnknownOrigin + + token = self.tok.get() + # Range (required) + try: + start, stop, step = dns.grange.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except: + raise dns.exception.SyntaxError + + # lhs (required) + try: + lhs = token.value + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except: + raise dns.exception.SyntaxError + + # TTL + try: + ttl = dns.ttl.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except dns.ttl.BadTTL: + ttl = self.ttl + # Class + try: + rdclass = dns.rdataclass.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except dns.exception.SyntaxError: + raise dns.exception.SyntaxError + except Exception: + rdclass = self.zone.rdclass + if rdclass != self.zone.rdclass: + raise dns.exception.SyntaxError("RR class is not zone's class") + # Type + try: + rdtype = dns.rdatatype.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except Exception: + raise dns.exception.SyntaxError("unknown rdatatype '%s'" % + token.value) + + # lhs (required) + try: + rhs = token.value + except: + raise dns.exception.SyntaxError + + lmod, lsign, loffset, lwidth, lbase = self._parse_modify(lhs) + rmod, rsign, roffset, rwidth, rbase = self._parse_modify(rhs) + for i in range(start, stop + 1, step): + # +1 because bind is inclusive and python is exclusive + + if lsign == u'+': + lindex = i + int(loffset) + elif lsign == u'-': + lindex = i - int(loffset) + + if rsign == u'-': + rindex = i - int(roffset) + elif rsign == u'+': + rindex = i + int(roffset) + + lzfindex = str(lindex).zfill(int(lwidth)) + rzfindex = str(rindex).zfill(int(rwidth)) + + name = lhs.replace(u'$%s' % (lmod), lzfindex) + rdata = rhs.replace(u'$%s' % (rmod), rzfindex) + + self.last_name = dns.name.from_text(name, self.current_origin) + name = self.last_name + if not name.is_subdomain(self.zone.origin): + self._eat_line() + return + if self.relativize: + name = name.relativize(self.zone.origin) + + n = self.zone.nodes.get(name) + if n is None: + n = self.zone.node_factory() + self.zone.nodes[name] = n + try: + rd = dns.rdata.from_text(rdclass, rdtype, rdata, + self.current_origin, False) + except dns.exception.SyntaxError: + # Catch and reraise. + (ty, va) = sys.exc_info()[:2] + raise va + except: + # All exceptions that occur in the processing of rdata + # are treated as syntax errors. This is not strictly + # correct, but it is correct almost all of the time. + # We convert them to syntax errors so that we can emit + # helpful filename:line info. + (ty, va) = sys.exc_info()[:2] + raise dns.exception.SyntaxError("caught exception %s: %s" % + (str(ty), str(va))) + + rd.choose_relativity(self.zone.origin, self.relativize) + covers = rd.covers() + rds = n.find_rdataset(rdclass, rdtype, covers, True) + rds.add(rd, ttl) + + def read(self): + """Read a DNS master file and build a zone object. + + @raises dns.zone.NoSOA: No SOA RR was found at the zone origin + @raises dns.zone.NoNS: No NS RRset was found at the zone origin + """ + + try: + while 1: + token = self.tok.get(True, True) + if token.is_eof(): + if self.current_file is not None: + self.current_file.close() + if len(self.saved_state) > 0: + (self.tok, + self.current_origin, + self.last_name, + self.current_file, + self.ttl) = self.saved_state.pop(-1) + continue + break + elif token.is_eol(): + continue + elif token.is_comment(): + self.tok.get_eol() + continue + elif token.value[0] == u'$': + c = token.value.upper() + if c == u'$TTL': + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError("bad $TTL") + self.ttl = dns.ttl.from_text(token.value) + self.tok.get_eol() + elif c == u'$ORIGIN': + self.current_origin = self.tok.get_name() + self.tok.get_eol() + if self.zone.origin is None: + self.zone.origin = self.current_origin + elif c == u'$INCLUDE' and self.allow_include: + token = self.tok.get() + filename = token.value + token = self.tok.get() + if token.is_identifier(): + new_origin =\ + dns.name.from_text(token.value, + self.current_origin) + self.tok.get_eol() + elif not token.is_eol_or_eof(): + raise dns.exception.SyntaxError( + "bad origin in $INCLUDE") + else: + new_origin = self.current_origin + self.saved_state.append((self.tok, + self.current_origin, + self.last_name, + self.current_file, + self.ttl)) + self.current_file = open(filename, 'r') + self.tok = dns.tokenizer.Tokenizer(self.current_file, + filename) + self.current_origin = new_origin + elif c == u'$GENERATE': + self._generate_line() + else: + raise dns.exception.SyntaxError( + "Unknown master file directive '" + c + "'") + continue + self.tok.unget(token) + self._rr_line() + except dns.exception.SyntaxError as detail: + (filename, line_number) = self.tok.where() + if detail is None: + detail = "syntax error" + raise dns.exception.SyntaxError( + "%s:%d: %s" % (filename, line_number, detail)) + + # Now that we're done reading, do some basic checking of the zone. + if self.check_origin: + self.zone.check_origin() + + +def from_text(text, origin=None, rdclass=dns.rdataclass.IN, + relativize=True, zone_factory=Zone, filename=None, + allow_include=False, check_origin=True): + """Build a zone object from a master file format string. + + @param text: the master file format input + @type text: string. + @param origin: The origin of the zone; if not specified, the first + $ORIGIN statement in the master file will determine the origin of the + zone. + @type origin: dns.name.Name object or string + @param rdclass: The zone's rdata class; the default is class IN. + @type rdclass: int + @param relativize: should names be relativized? The default is True + @type relativize: bool + @param zone_factory: The zone factory to use + @type zone_factory: function returning a Zone + @param filename: The filename to emit when describing where an error + occurred; the default is ''. + @type filename: string + @param allow_include: is $INCLUDE allowed? + @type allow_include: bool + @param check_origin: should sanity checks of the origin node be done? + The default is True. + @type check_origin: bool + @raises dns.zone.NoSOA: No SOA RR was found at the zone origin + @raises dns.zone.NoNS: No NS RRset was found at the zone origin + @rtype: dns.zone.Zone object + """ + + # 'text' can also be a file, but we don't publish that fact + # since it's an implementation detail. The official file + # interface is from_file(). + + if filename is None: + filename = '' + tok = dns.tokenizer.Tokenizer(text, filename) + reader = _MasterReader(tok, origin, rdclass, relativize, zone_factory, + allow_include=allow_include, + check_origin=check_origin) + reader.read() + return reader.zone + + +def from_file(f, origin=None, rdclass=dns.rdataclass.IN, + relativize=True, zone_factory=Zone, filename=None, + allow_include=True, check_origin=True): + """Read a master file and build a zone object. + + @param f: file or string. If I{f} is a string, it is treated + as the name of a file to open. + @param origin: The origin of the zone; if not specified, the first + $ORIGIN statement in the master file will determine the origin of the + zone. + @type origin: dns.name.Name object or string + @param rdclass: The zone's rdata class; the default is class IN. + @type rdclass: int + @param relativize: should names be relativized? The default is True + @type relativize: bool + @param zone_factory: The zone factory to use + @type zone_factory: function returning a Zone + @param filename: The filename to emit when describing where an error + occurred; the default is '', or the value of I{f} if I{f} is a + string. + @type filename: string + @param allow_include: is $INCLUDE allowed? + @type allow_include: bool + @param check_origin: should sanity checks of the origin node be done? + The default is True. + @type check_origin: bool + @raises dns.zone.NoSOA: No SOA RR was found at the zone origin + @raises dns.zone.NoNS: No NS RRset was found at the zone origin + @rtype: dns.zone.Zone object + """ + + str_type = string_types + opts = 'rU' + + if isinstance(f, str_type): + if filename is None: + filename = f + f = open(f, opts) + want_close = True + else: + if filename is None: + filename = '' + want_close = False + + try: + z = from_text(f, origin, rdclass, relativize, zone_factory, + filename, allow_include, check_origin) + finally: + if want_close: + f.close() + return z + + +def from_xfr(xfr, zone_factory=Zone, relativize=True, check_origin=True): + """Convert the output of a zone transfer generator into a zone object. + + @param xfr: The xfr generator + @type xfr: generator of dns.message.Message objects + @param relativize: should names be relativized? The default is True. + It is essential that the relativize setting matches the one specified + to dns.query.xfr(). + @type relativize: bool + @param check_origin: should sanity checks of the origin node be done? + The default is True. + @type check_origin: bool + @raises dns.zone.NoSOA: No SOA RR was found at the zone origin + @raises dns.zone.NoNS: No NS RRset was found at the zone origin + @rtype: dns.zone.Zone object + """ + + z = None + for r in xfr: + if z is None: + if relativize: + origin = r.origin + else: + origin = r.answer[0].name + rdclass = r.answer[0].rdclass + z = zone_factory(origin, rdclass, relativize=relativize) + for rrset in r.answer: + znode = z.nodes.get(rrset.name) + if not znode: + znode = z.node_factory() + z.nodes[rrset.name] = znode + zrds = znode.find_rdataset(rrset.rdclass, rrset.rdtype, + rrset.covers, True) + zrds.update_ttl(rrset.ttl) + for rd in rrset: + rd.choose_relativity(z.origin, relativize) + zrds.add(rd) + if check_origin: + z.check_origin() + return z diff --git a/Contents/Libraries/Shared/subliminal_patch/__init__.py b/Contents/Libraries/Shared/subliminal_patch/__init__.py index 35efd82ad..e2d872246 100755 --- a/Contents/Libraries/Shared/subliminal_patch/__init__.py +++ b/Contents/Libraries/Shared/subliminal_patch/__init__.py @@ -13,6 +13,7 @@ from .score import compute_score from .video import Video import extensions +import http # patch subliminal's core functions subliminal.scan_video = subliminal.core.scan_video = scan_video diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 42965deea..f82c3b9d6 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -6,9 +6,10 @@ import logging import requests import xmlrpclib +import dns.resolver -from xmlrpclib import SafeTransport, Transport from requests import Session, exceptions +from requests.packages.urllib3.util import connection from retry.api import retry_call from exceptions import APIThrottled @@ -23,6 +24,12 @@ default_ssl_context = None +custom_resolver = dns.resolver.Resolver(configure=False) + +# 8.8.8.8 is Google's public DNS server +custom_resolver.nameservers = ['8.8.8.8', '1.1.1.1'] + + class CertifiSession(Session): def __init__(self): super(CertifiSession, self).__init__() @@ -130,3 +137,33 @@ def _build_url(self, host, handler): scheme = 'https' if self.use_https else 'http' handler = handler[1:] if handler and handler[0] == "/" else handler return '%s://%s/%s' % (scheme, host, handler) + + +_orig_create_connection = connection.create_connection + + +dns_cache = {} + + +def set_custom_resolver(): + def patched_create_connection(address, *args, **kwargs): + """Wrap urllib3's create_connection to resolve the name elsewhere""" + # resolve hostname to an ip address; use your own + # resolver here, as otherwise the system resolver will be used. + host, port = address + if host in dns_cache: + ip = dns_cache[host] + logger.debug("Using %s=%s from cache", host, ip) + else: + try: + ip = custom_resolver.query(host)[0].address + dns_cache[host] = ip + except dns.exception.DNSException: + logger.warning("Couldn't resolve %s with DNS: %s", host, custom_resolver.nameservers) + return _orig_create_connection((host, port), *args, **kwargs) + + logger.debug("Resolved %s to %s using %s", host, ip, custom_resolver.nameservers) + + return _orig_create_connection((ip, port), *args, **kwargs) + + connection.create_connection = patched_create_connection diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 341c3a2be..b49a359d9 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -250,6 +250,7 @@ "Use new style caching (for subliminal)": "Modernes Caching benutzen (für subliminal)", "Low impact mode (for remote filesystems)": "Belastungsarmer Modus (für rechnerferne Dateisysteme)", "Timeout for API requests sent to the PMS": "Timeout für Plex-API-Anfragen", + "Use Google DNS (for \"problematic\" countries)": "Google DNS benutzen (für \"problematische\" Länder)", "HTTP proxy to use for providers (supports credentials)": "Benutze HTTP-Proxy für Untertitel-Anbieter (unterstützt Anmeldeinformationen)", "How verbose should the logging be?": "Wie ausführlich soll die Protokollierung sein?", "How many log backups to keep?": "Wie viele Protokoll-Sicherungen sollen behalten werden?", diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 96b72a306..c528640f6 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -328,6 +328,7 @@ "Use new style caching (for subliminal)":"Use new style caching (for subliminal)", "Low impact mode (for remote filesystems)":"Low impact mode (for remote filesystems)", "Timeout for API requests sent to the PMS":"Timeout for API requests sent to the PMS", + "Use Google DNS (for \"problematic\" countries)": "Use Google DNS (for \"problematic\" countries)", "HTTP proxy to use for providers (supports credentials)":"HTTP proxy to use for providers (supports credentials)", "How verbose should the logging be?":"How verbose should the logging be?", "How many log backups to keep?":"How many log backups to keep?", diff --git a/Licenses/dns/LICENSE b/Licenses/dns/LICENSE new file mode 100644 index 000000000..2896ca974 --- /dev/null +++ b/Licenses/dns/LICENSE @@ -0,0 +1,16 @@ +ISC License + +Copyright (C) 2001-2003 Nominum, Inc. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose with or without fee is hereby granted, +provided that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. From b67e68c83e5702b7a9859d246543ec525b97f03f Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 26 Oct 2018 17:21:56 +0200 Subject: [PATCH 268/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 9d511976c..9bc791363 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2793 + 2.6.1.2803 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2793 DEV +Version 2.6.1.2803 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 8af485396437f3015b2cca061a46c202c1b35b64 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 27 Oct 2018 03:08:32 +0200 Subject: [PATCH 269/710] providers: titlovi: allow direct subtitle downloads as fallback --- .../Libraries/Shared/subliminal_patch/providers/titlovi.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index 0062448e2..4cf6d124a 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -308,6 +308,11 @@ def download_subtitle(self, subtitle): logger.debug('Archive identified as zip') archive = ZipFile(archive_stream) else: + subtitle.content = r.content + if subtitle.is_valid(): + return + subtitle.content = None + raise ProviderError('Unidentified archive type') subs_in_archive = archive.namelist() From 5bede9c89ce7213fd7a033b135f8fb955f4669ec Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 27 Oct 2018 04:46:56 +0200 Subject: [PATCH 270/710] submod: correctly merge mods of the same kind (offset) --- Contents/Code/support/items.py | 3 +- Contents/Libraries/Shared/submod_test.py | 3 +- .../Shared/subzero/modification/main.py | 49 ++++++++++++++++++- .../subzero/modification/mods/offset.py | 5 +- 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/Contents/Code/support/items.py b/Contents/Code/support/items.py index 5e57c463e..aefcdf651 100644 --- a/Contents/Code/support/items.py +++ b/Contents/Code/support/items.py @@ -423,8 +423,9 @@ def save_stored_sub(stored_subtitle, rating_key, part_id, language, item_type, p try: save_subtitles(scanned_parts, {video: [subtitle]}, mode="m", bare_save=True) + stored_subtitle.mods = subtitle.mods Log.Debug("Modified %s subtitle for: %s:%s with: %s", language.name, rating_key, part_id, - ", ".join(stored_subtitle.mods) if stored_subtitle.mods else "none") + ", ".join(subtitle.mods) if subtitle.mods else "none") except: Log.Error("Something went wrong when modifying subtitle: %s", traceback.format_exc()) diff --git a/Contents/Libraries/Shared/submod_test.py b/Contents/Libraries/Shared/submod_test.py index 9bb8c0c87..c4455dd07 100644 --- a/Contents/Libraries/Shared/submod_test.py +++ b/Contents/Libraries/Shared/submod_test.py @@ -20,7 +20,8 @@ if debug: logging.basicConfig(level=logging.DEBUG) -sub = Subtitle(Language.fromietf("eng:forced"), mods=["common", "remove_HI", "OCR_fixes", "fix_uppercase"]) +#sub = Subtitle(Language.fromietf("eng:forced"), mods=["common", "remove_HI", "OCR_fixes", "fix_uppercase", "shift_offset(ms=-500)", "shift_offset(ms=500)", "shift_offset(s=2,ms=800)"]) +sub = Subtitle(Language.fromietf("eng:forced"), mods=["common", "remove_HI", "OCR_fixes", "fix_uppercase", "shift_offset(ms=0,s=1)"]) sub.content = open(fn).read() sub.normalize() content = sub.get_modified_content(debug=True) diff --git a/Contents/Libraries/Shared/subzero/modification/main.py b/Contents/Libraries/Shared/subzero/modification/main.py index 187507837..05c882d9e 100644 --- a/Contents/Libraries/Shared/subzero/modification/main.py +++ b/Contents/Libraries/Shared/subzero/modification/main.py @@ -86,6 +86,8 @@ def prepare_mods(self, *mods): line_mods = [] non_line_mods = [] used_mods = [] + mods_merged = {} + mods_merged_log = {} for mod_data, orig_identifier in parsed_mods: identifier, args = mod_data @@ -111,12 +113,55 @@ def prepare_mods(self, *mods): continue # merge args of duplicate mods if possible - elif identifier in final_mods and mod_cls.args_mergeable: - final_mods[identifier] = mod_cls.merge_args(final_mods[identifier], args) + elif mod_cls.args_mergeable and identifier in mods_merged: + mods_merged[identifier] = mod_cls.merge_args(mods_merged[identifier], args) + mods_merged_log[identifier]["identifiers"].append(orig_identifier) continue + + if mod_cls.args_mergeable: + mods_merged[identifier] = mod_cls.merge_args(args, {}) + mods_merged_log[identifier] = {"identifiers": [orig_identifier], "final_identifier": orig_identifier} + used_mods.append("%s_ORIG_POSITION" % identifier) + continue + final_mods[identifier] = args used_mods.append(orig_identifier) + # finalize merged mods into final and used mods + for identifier, args in mods_merged.iteritems(): + pos_preserve_index = used_mods.index("%s_ORIG_POSITION" % identifier) + + # clear empty mods after merging + if not any(args.values()): + if self.debug: + logger.debug("Skipping %s, empty args", identifier) + + if pos_preserve_index > -1: + used_mods.pop(pos_preserve_index) + + mods_merged_log.pop(identifier) + continue + + # clear empty args + final_mod_args = dict(filter(lambda (k, v): bool(v), args.iteritems())) + + _data = SubtitleModifications.get_mod_signature(identifier, **final_mod_args) + if _data == mods_merged_log[identifier]["final_identifier"]: + mods_merged_log.pop(identifier) + else: + mods_merged_log[identifier]["final_identifier"] = _data + + if pos_preserve_index > -1: + used_mods[pos_preserve_index] = _data + else: + # should never happen + used_mods.append(_data) + final_mods[identifier] = args + + if self.debug: + for identifier, data in mods_merged_log.iteritems(): + logger.debug("Merged %s to %s", data["identifiers"], data["final_identifier"]) + # separate all mods into line and non-line mods for identifier, args in final_mods.iteritems(): mod_cls = registry.mods[identifier] diff --git a/Contents/Libraries/Shared/subzero/modification/mods/offset.py b/Contents/Libraries/Shared/subzero/modification/mods/offset.py index affb78efe..2e342c0a1 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/offset.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/offset.py @@ -23,12 +23,15 @@ def merge_args(cls, args1, args2): new_args = dict((key, int(value)) for key, value in args1.iteritems()) for key, value in args2.iteritems(): + if not int(value): + continue + if key in new_args: new_args[key] += int(value) else: new_args[key] = int(value) - return new_args + return dict(filter(lambda (k, v): bool(v), new_args.iteritems())) def modify(self, content, debug=False, parent=None, **kwargs): parent.f.shift(h=int(kwargs.get("h", 0)), m=int(kwargs.get("m", 0)), s=int(kwargs.get("s", 0)), From 4bb8ad5b4c97849fd358baaf37e380c184aeeefd Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 27 Oct 2018 05:05:14 +0200 Subject: [PATCH 271/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 9bc791363..5f03f6114 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2803 + 2.6.1.2806 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2803 DEV +Version 2.6.1.2806 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 7f7b609b7a94638ead1c4c3c4cac756d632f096e Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 27 Oct 2018 23:40:34 +0200 Subject: [PATCH 272/710] core: skip cleanup for ignored paths --- Contents/Code/__init__.py | 14 ++++++++------ Contents/Code/support/localmedia.py | 5 +++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 3bb414691..aa75a18cd 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -94,12 +94,12 @@ def Start(): track_usage("General", "plugin", "start", config.version) -def update_local_media(metadata, media, media_type="movies"): +def update_local_media(metadata, media, media_type="movies", ignore_parts_cleanup=None): # Look for subtitles if media_type == "movies": for item in media.items: for part in item.parts: - support.localmedia.find_subtitles(part) + support.localmedia.find_subtitles(part, ignore_parts_cleanup=ignore_parts_cleanup) return # Look for subtitles for each episode. @@ -112,7 +112,7 @@ def update_local_media(metadata, media, media_type="movies"): # Look for subtitles. for part in i.parts: - support.localmedia.find_subtitles(part) + support.localmedia.find_subtitles(part, ignore_parts_cleanup=ignore_parts_cleanup) else: pass @@ -199,17 +199,19 @@ def update(self, metadata, media, lang): config.init_subliminal_patches() videos = media_to_videos(media, kind=self.agent_type) - # find local media - update_local_media(metadata, media, media_type=self.agent_type) - # media ignored? use_any_parts = False + ignore_parts_cleanup = [] for video in videos: if not is_wanted(video["id"], item=video["item"]): Log.Debug(u'Skipping "%s"' % video["filename"]) + ignore_parts_cleanup.append(video["path"]) continue use_any_parts = True + # find local media + update_local_media(metadata, media, media_type=self.agent_type, ignore_parts_cleanup=ignore_parts_cleanup) + if not use_any_parts: Log.Debug(u"Nothing to do.") return diff --git a/Contents/Code/support/localmedia.py b/Contents/Code/support/localmedia.py index 5f16b8977..52c59cf44 100755 --- a/Contents/Code/support/localmedia.py +++ b/Contents/Code/support/localmedia.py @@ -12,8 +12,9 @@ SECONDARY_TAGS = ['forced', 'normal', 'default', 'embedded', 'embedded-forced', 'custom', 'hi', 'cc', 'sdh'] -def find_subtitles(part): +def find_subtitles(part, ignore_parts_cleanup=None): lang_sub_map = {} + ignore_parts_cleanup = ignore_parts_cleanup or [] part_filename = helpers.unicodize(part.file) part_basename = os.path.splitext(os.path.basename(part_filename))[0] use_filesystem = helpers.cast_bool(Prefs["subtitles.save.filesystem"]) @@ -88,7 +89,7 @@ def find_subtitles(part): media_files.append(root) # cleanup any leftover subtitle if no associated media file was found - if use_filesystem and helpers.cast_bool(Prefs["subtitles.autoclean"]): + if use_filesystem and helpers.cast_bool(Prefs["subtitles.autoclean"]) and not ignore_parts_cleanup: for path in paths: # only housekeep in sub_subfolder if sub_subfolder is used if use_sub_subfolder and path != sub_subfolder and not sz_config.advanced.thorough_cleaning: From 1543c50d98bc699c93a531f786c07590d5e8b7d4 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 28 Oct 2018 01:28:05 +0200 Subject: [PATCH 273/710] core: save current state explicitly --- Contents/Code/interface/menu_helpers.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 23cc9ad3a..53d3ffb5a 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -105,10 +105,12 @@ def set_refresh_menu_state(state_or_media, media_type="movies"): # store it in last state and remove the current Dict["last_refresh_state"] = Dict["current_refresh_state"] Dict["current_refresh_state"] = None + Dict.Save() return if isinstance(state_or_media, types.StringTypes) or is_localized_string(state_or_media): Dict["current_refresh_state"] = unicode(state_or_media) + Dict.Save() return media = state_or_media @@ -132,6 +134,7 @@ def set_refresh_menu_state(state_or_media, media_type="movies"): Dict["current_refresh_state"] = unicode(_(t, title=unicode(title))) + Dict.Save() def get_item_task_data(task_name, rating_key, language): From 811db632d2b9fb6372281c28d5582a7ee450bcb6 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 28 Oct 2018 05:44:20 +0100 Subject: [PATCH 274/710] menu: correctly set title in history when extracting subs --- Contents/Code/interface/menu_helpers.py | 2 +- Contents/Code/support/helpers.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 53d3ffb5a..24ffd5bab 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -219,7 +219,7 @@ def extract_embedded_sub(**kwargs): # add item to history item_title = get_title_for_video_metadata(video.plexapi_metadata, - add_section_title=False) + add_section_title=False, add_episode_title=True) if history_storage: history = history_storage else: diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 1ba8fc133..8b5f2f454 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -162,6 +162,9 @@ def get_video_display_title(kind, title, section_title=None, parent_title=None, if season and episode: return '%s%s S%02dE%02d%s' % (section_add, parent_title, season or 0, episode or 0, (", %s" % title if title else "")) + elif season: + return '%s%s S%02d%s' % (section_add, parent_title, season or 0, + (", %s" % title if title else "")) return '%s%s%s' % (section_add, parent_title, (", %s" % title if title else "")) return "%s%s" % (section_add, title) From 32eb094f093b7e94a81974e84e454b278ae4b4cc Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 28 Oct 2018 06:19:59 +0100 Subject: [PATCH 275/710] menu: support S00E00 and equivalent --- Contents/Code/support/helpers.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 8b5f2f454..501a2feae 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -152,6 +152,13 @@ def get_plex_item_display_title(item, kind, parent=None, parent_title=None, sect add_section_title=add_section_title) +def series_num(v): + try: + return int(v) + except (TypeError, ValueError): + pass + + def get_video_display_title(kind, title, section_title=None, parent_title=None, season=None, episode=None, add_section_title=False): section_add = "" @@ -159,10 +166,10 @@ def get_video_display_title(kind, title, section_title=None, parent_title=None, section_add = ("%s: " % section_title) if section_title else "" if kind in ("season", "show") and parent_title: - if season and episode: + if series_num(season) is not None and series_num(episode) is not None: return '%s%s S%02dE%02d%s' % (section_add, parent_title, season or 0, episode or 0, (", %s" % title if title else "")) - elif season: + elif series_num(season) is not None: return '%s%s S%02d%s' % (section_add, parent_title, season or 0, (", %s" % title if title else "")) From 8b441872994d3a9ff3d72f518440354e101e4543 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 28 Oct 2018 06:25:52 +0100 Subject: [PATCH 276/710] core: log skipped autoclean on unwanted paths --- Contents/Code/support/localmedia.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Contents/Code/support/localmedia.py b/Contents/Code/support/localmedia.py index 52c59cf44..2a5ac39c4 100755 --- a/Contents/Code/support/localmedia.py +++ b/Contents/Code/support/localmedia.py @@ -22,6 +22,7 @@ def find_subtitles(part, ignore_parts_cleanup=None): if Prefs["subtitles.save.subFolder.Custom"] else None use_sub_subfolder = Prefs["subtitles.save.subFolder"] != "current folder" and not sub_dir_custom + autoclean = helpers.cast_bool(Prefs["subtitles.autoclean"]) sub_subfolder = None paths = [os.path.dirname(part_filename)] if use_filesystem else [] @@ -89,7 +90,10 @@ def find_subtitles(part, ignore_parts_cleanup=None): media_files.append(root) # cleanup any leftover subtitle if no associated media file was found - if use_filesystem and helpers.cast_bool(Prefs["subtitles.autoclean"]) and not ignore_parts_cleanup: + if autoclean and ignore_parts_cleanup: + Log.Info("Skipping housekeeping of: %s", paths) + + if use_filesystem and autoclean and not ignore_parts_cleanup: for path in paths: # only housekeep in sub_subfolder if sub_subfolder is used if use_sub_subfolder and path != sub_subfolder and not sz_config.advanced.thorough_cleaning: From 03c2f7cdcdf9e19bb4f8a68702418fa52dde1756 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 30 Oct 2018 16:53:02 +0100 Subject: [PATCH 277/710] core: update requests to 2.20.0 --- .../Libraries/Shared/requests/__init__.py | 83 +- .../Libraries/Shared/requests/__version__.py | 14 + .../Libraries/Shared/requests/adapters.py | 104 +- Contents/Libraries/Shared/requests/api.py | 44 +- Contents/Libraries/Shared/requests/auth.py | 25 +- Contents/Libraries/Shared/requests/cacert.pem | 5689 ------------ Contents/Libraries/Shared/requests/certs.py | 13 +- Contents/Libraries/Shared/requests/compat.py | 16 +- Contents/Libraries/Shared/requests/cookies.py | 49 +- .../Libraries/Shared/requests/exceptions.py | 12 +- Contents/Libraries/Shared/requests/help.py | 119 + Contents/Libraries/Shared/requests/hooks.py | 4 +- Contents/Libraries/Shared/requests/models.py | 113 +- .../Libraries/Shared/requests/packages.py | 14 + .../Shared/requests/packages/__init__.py | 36 - .../requests/packages/chardet/__init__.py | 32 - .../requests/packages/chardet/big5freq.py | 925 -- .../requests/packages/chardet/big5prober.py | 42 - .../requests/packages/chardet/chardetect.py | 80 - .../packages/chardet/chardistribution.py | 231 - .../packages/chardet/charsetgroupprober.py | 106 - .../packages/chardet/charsetprober.py | 62 - .../packages/chardet/codingstatemachine.py | 61 - .../requests/packages/chardet/compat.py | 34 - .../requests/packages/chardet/constants.py | 39 - .../requests/packages/chardet/cp949prober.py | 44 - .../requests/packages/chardet/escprober.py | 86 - .../Shared/requests/packages/chardet/escsm.py | 242 - .../requests/packages/chardet/eucjpprober.py | 90 - .../requests/packages/chardet/euckrfreq.py | 596 -- .../requests/packages/chardet/euckrprober.py | 42 - .../requests/packages/chardet/euctwfreq.py | 428 - .../requests/packages/chardet/euctwprober.py | 41 - .../requests/packages/chardet/gb2312freq.py | 472 - .../requests/packages/chardet/gb2312prober.py | 41 - .../requests/packages/chardet/hebrewprober.py | 283 - .../requests/packages/chardet/jisfreq.py | 569 -- .../requests/packages/chardet/jpcntx.py | 227 - .../packages/chardet/langbulgarianmodel.py | 229 - .../packages/chardet/langcyrillicmodel.py | 329 - .../packages/chardet/langgreekmodel.py | 225 - .../packages/chardet/langhebrewmodel.py | 201 - .../packages/chardet/langhungarianmodel.py | 225 - .../packages/chardet/langthaimodel.py | 200 - .../requests/packages/chardet/latin1prober.py | 139 - .../packages/chardet/mbcharsetprober.py | 86 - .../packages/chardet/mbcsgroupprober.py | 54 - .../requests/packages/chardet/mbcssm.py | 572 -- .../packages/chardet/sbcharsetprober.py | 120 - .../packages/chardet/sbcsgroupprober.py | 69 - .../requests/packages/chardet/sjisprober.py | 91 - .../packages/chardet/universaldetector.py | 170 - .../requests/packages/chardet/utf8prober.py | 76 - .../Shared/requests/packages/idna/__init__.py | 1 - .../Shared/requests/packages/idna/codec.py | 118 - .../Shared/requests/packages/idna/compat.py | 12 - .../Shared/requests/packages/idna/core.py | 387 - .../Shared/requests/packages/idna/idnadata.py | 1584 ---- .../requests/packages/idna/intranges.py | 46 - .../requests/packages/idna/uts46data.py | 7633 ----------------- .../requests/packages/urllib3/__init__.py | 97 - .../requests/packages/urllib3/_collections.py | 324 - .../requests/packages/urllib3/connection.py | 369 - .../packages/urllib3/connectionpool.py | 899 -- .../packages/urllib3/contrib/__init__.py | 0 .../packages/urllib3/contrib/appengine.py | 296 - .../packages/urllib3/contrib/ntlmpool.py | 112 - .../packages/urllib3/contrib/pyopenssl.py | 450 - .../packages/urllib3/contrib/socks.py | 188 - .../requests/packages/urllib3/exceptions.py | 246 - .../requests/packages/urllib3/fields.py | 178 - .../requests/packages/urllib3/filepost.py | 94 - .../packages/urllib3/packages/__init__.py | 5 - .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 53 - .../packages/urllib3/packages/ordered_dict.py | 259 - .../requests/packages/urllib3/packages/six.py | 868 -- .../packages/ssl_match_hostname/__init__.py | 19 - .../ssl_match_hostname/_implementation.py | 157 - .../requests/packages/urllib3/poolmanager.py | 363 - .../requests/packages/urllib3/request.py | 148 - .../requests/packages/urllib3/response.py | 618 -- .../packages/urllib3/util/__init__.py | 52 - .../packages/urllib3/util/connection.py | 130 - .../requests/packages/urllib3/util/request.py | 118 - .../packages/urllib3/util/response.py | 81 - .../requests/packages/urllib3/util/retry.py | 389 - .../packages/urllib3/util/selectors.py | 524 -- .../requests/packages/urllib3/util/ssl_.py | 336 - .../requests/packages/urllib3/util/timeout.py | 242 - .../requests/packages/urllib3/util/url.py | 226 - .../requests/packages/urllib3/util/wait.py | 40 - .../Libraries/Shared/requests/sessions.py | 274 +- .../Libraries/Shared/requests/status_codes.py | 39 +- .../Libraries/Shared/requests/structures.py | 10 +- Contents/Libraries/Shared/requests/utils.py | 242 +- 96 files changed, 838 insertions(+), 31283 deletions(-) create mode 100644 Contents/Libraries/Shared/requests/__version__.py delete mode 100644 Contents/Libraries/Shared/requests/cacert.pem create mode 100644 Contents/Libraries/Shared/requests/help.py create mode 100644 Contents/Libraries/Shared/requests/packages.py delete mode 100644 Contents/Libraries/Shared/requests/packages/__init__.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/__init__.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/big5freq.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/big5prober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/chardetect.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/chardistribution.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/charsetgroupprober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/charsetprober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/codingstatemachine.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/compat.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/constants.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/cp949prober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/escprober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/escsm.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/eucjpprober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/euckrfreq.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/euckrprober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/euctwfreq.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/euctwprober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/gb2312freq.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/gb2312prober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/hebrewprober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/jisfreq.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/jpcntx.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/langbulgarianmodel.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/langcyrillicmodel.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/langgreekmodel.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/langhebrewmodel.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/langhungarianmodel.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/langthaimodel.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/latin1prober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/mbcharsetprober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/mbcsgroupprober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/mbcssm.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/sbcharsetprober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/sbcsgroupprober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/sjisprober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/universaldetector.py delete mode 100644 Contents/Libraries/Shared/requests/packages/chardet/utf8prober.py delete mode 100644 Contents/Libraries/Shared/requests/packages/idna/__init__.py delete mode 100644 Contents/Libraries/Shared/requests/packages/idna/codec.py delete mode 100644 Contents/Libraries/Shared/requests/packages/idna/compat.py delete mode 100644 Contents/Libraries/Shared/requests/packages/idna/core.py delete mode 100644 Contents/Libraries/Shared/requests/packages/idna/idnadata.py delete mode 100644 Contents/Libraries/Shared/requests/packages/idna/intranges.py delete mode 100644 Contents/Libraries/Shared/requests/packages/idna/uts46data.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/__init__.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/_collections.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/connection.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/connectionpool.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/contrib/__init__.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/contrib/appengine.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/contrib/ntlmpool.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/contrib/pyopenssl.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/contrib/socks.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/exceptions.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/fields.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/filepost.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/packages/__init__.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/__init__.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/makefile.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/packages/ordered_dict.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/packages/six.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/poolmanager.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/request.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/response.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/util/__init__.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/util/connection.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/util/request.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/util/response.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/util/retry.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/util/selectors.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/util/ssl_.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/util/timeout.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/util/url.py delete mode 100644 Contents/Libraries/Shared/requests/packages/urllib3/util/wait.py diff --git a/Contents/Libraries/Shared/requests/__init__.py b/Contents/Libraries/Shared/requests/__init__.py index 1665d4b95..bc168ee53 100644 --- a/Contents/Libraries/Shared/requests/__init__.py +++ b/Contents/Libraries/Shared/requests/__init__.py @@ -6,7 +6,7 @@ # / """ -Requests HTTP library +Requests HTTP Library ~~~~~~~~~~~~~~~~~~~~~ Requests is an HTTP library, written in Python, for human beings. Basic GET @@ -22,7 +22,7 @@ ... or POST: >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post('http://httpbin.org/post', data=payload) + >>> r = requests.post('https://httpbin.org/post', data=payload) >>> print(r.text) { ... @@ -36,31 +36,81 @@ The other HTTP methods are supported - see `requests.api`. Full documentation is at . -:copyright: (c) 2016 by Kenneth Reitz. +:copyright: (c) 2017 by Kenneth Reitz. :license: Apache 2.0, see LICENSE for more details. """ -__title__ = 'requests' -__version__ = '2.13.0' -__build__ = 0x021300 -__author__ = 'Kenneth Reitz' -__license__ = 'Apache 2.0' -__copyright__ = 'Copyright 2016 Kenneth Reitz' +import urllib3 +import chardet +import warnings +from .exceptions import RequestsDependencyWarning + + +def check_compatibility(urllib3_version, chardet_version): + urllib3_version = urllib3_version.split('.') + assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append('0') + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1, <= 1.24 + assert major == 1 + assert minor >= 21 + assert minor <= 24 + + # Check chardet for compatibility. + major, minor, patch = chardet_version.split('.')[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet >= 3.0.2, < 3.1.0 + assert major == 3 + assert minor < 1 + assert patch >= 2 + + +def _check_cryptography(cryptography_version): + # cryptography < 1.3.4 + try: + cryptography_version = list(map(int, cryptography_version.split('.'))) + except ValueError: + return + + if cryptography_version < [1, 3, 4]: + warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) + warnings.warn(warning, RequestsDependencyWarning) + +# Check imported dependencies for compatibility. +try: + check_compatibility(urllib3.__version__, chardet.__version__) +except (AssertionError, ValueError): + warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported " + "version!".format(urllib3.__version__, chardet.__version__), + RequestsDependencyWarning) # Attempt to enable urllib3's SNI support, if possible try: - from .packages.urllib3.contrib import pyopenssl + from urllib3.contrib import pyopenssl pyopenssl.inject_into_urllib3() + + # Check cryptography version + from cryptography import __version__ as cryptography_version + _check_cryptography(cryptography_version) except ImportError: pass -import warnings - # urllib3's DependencyWarnings should be silenced. -from .packages.urllib3.exceptions import DependencyWarning +from urllib3.exceptions import DependencyWarning warnings.simplefilter('ignore', DependencyWarning) +from .__version__ import __title__, __description__, __url__, __version__ +from .__version__ import __build__, __author__, __author_email__, __license__ +from .__version__ import __copyright__, __cake__ + from . import utils +from . import packages from .models import Request, Response, PreparedRequest from .api import request, get, head, post, patch, put, delete, options from .sessions import session, Session @@ -73,12 +123,7 @@ # Set default logging handler to avoid "No handler found" warnings. import logging -try: # Python 2.7+ - from logging import NullHandler -except ImportError: - class NullHandler(logging.Handler): - def emit(self, record): - pass +from logging import NullHandler logging.getLogger(__name__).addHandler(NullHandler()) diff --git a/Contents/Libraries/Shared/requests/__version__.py b/Contents/Libraries/Shared/requests/__version__.py new file mode 100644 index 000000000..be8a45fe0 --- /dev/null +++ b/Contents/Libraries/Shared/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = 'requests' +__description__ = 'Python HTTP for Humans.' +__url__ = 'http://python-requests.org' +__version__ = '2.20.0' +__build__ = 0x022000 +__author__ = 'Kenneth Reitz' +__author_email__ = 'me@kennethreitz.org' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2018 Kenneth Reitz' +__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/Contents/Libraries/Shared/requests/adapters.py b/Contents/Libraries/Shared/requests/adapters.py index 2475879c2..fa4d9b3cc 100644 --- a/Contents/Libraries/Shared/requests/adapters.py +++ b/Contents/Libraries/Shared/requests/adapters.py @@ -11,33 +11,37 @@ import os.path import socket +from urllib3.poolmanager import PoolManager, proxy_from_url +from urllib3.response import HTTPResponse +from urllib3.util import parse_url +from urllib3.util import Timeout as TimeoutSauce +from urllib3.util.retry import Retry +from urllib3.exceptions import ClosedPoolError +from urllib3.exceptions import ConnectTimeoutError +from urllib3.exceptions import HTTPError as _HTTPError +from urllib3.exceptions import MaxRetryError +from urllib3.exceptions import NewConnectionError +from urllib3.exceptions import ProxyError as _ProxyError +from urllib3.exceptions import ProtocolError +from urllib3.exceptions import ReadTimeoutError +from urllib3.exceptions import SSLError as _SSLError +from urllib3.exceptions import ResponseError +from urllib3.exceptions import LocationValueError + from .models import Response -from .packages.urllib3.poolmanager import PoolManager, proxy_from_url -from .packages.urllib3.response import HTTPResponse -from .packages.urllib3.util import Timeout as TimeoutSauce -from .packages.urllib3.util.retry import Retry from .compat import urlparse, basestring -from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers, - prepend_scheme_if_needed, get_auth_from_url, urldefragauth, - select_proxy, to_native_string) +from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths, + get_encoding_from_headers, prepend_scheme_if_needed, + get_auth_from_url, urldefragauth, select_proxy) from .structures import CaseInsensitiveDict -from .packages.urllib3.exceptions import ClosedPoolError -from .packages.urllib3.exceptions import ConnectTimeoutError -from .packages.urllib3.exceptions import HTTPError as _HTTPError -from .packages.urllib3.exceptions import MaxRetryError -from .packages.urllib3.exceptions import NewConnectionError -from .packages.urllib3.exceptions import ProxyError as _ProxyError -from .packages.urllib3.exceptions import ProtocolError -from .packages.urllib3.exceptions import ReadTimeoutError -from .packages.urllib3.exceptions import SSLError as _SSLError -from .packages.urllib3.exceptions import ResponseError from .cookies import extract_cookies_to_jar from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, - ProxyError, RetryError, InvalidSchema) + ProxyError, RetryError, InvalidSchema, InvalidProxyURL, + InvalidURL) from .auth import _basic_auth_str try: - from .packages.urllib3.contrib.socks import SOCKSProxyManager + from urllib3.contrib.socks import SOCKSProxyManager except ImportError: def SOCKSProxyManager(*args, **kwargs): raise InvalidSchema("Missing dependencies for SOCKS support.") @@ -64,7 +68,9 @@ def send(self, request, stream=False, timeout=None, verify=True, data before giving up, as a float, or a :ref:`(connect timeout, read timeout) ` tuple. :type timeout: float or tuple - :param verify: (optional) Whether to verify SSL certificates. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use :param cert: (optional) Any user-provided SSL certificate to be trusted. :param proxies: (optional) The proxies dictionary to apply to the request. """ @@ -123,8 +129,7 @@ def __init__(self, pool_connections=DEFAULT_POOLSIZE, self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) def __getstate__(self): - return dict((attr, getattr(self, attr, None)) for attr in - self.__attrs__) + return {attr: getattr(self, attr, None) for attr in self.__attrs__} def __setstate__(self, state): # Can't handle by adding 'proxy_manager' to self.__attrs__ because @@ -168,7 +173,7 @@ def proxy_manager_for(self, proxy, **proxy_kwargs): :param proxy: The proxy to return a urllib3 ProxyManager for. :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. :returns: ProxyManager - :rtype: requests.packages.urllib3.ProxyManager + :rtype: urllib3.ProxyManager """ if proxy in self.proxy_manager: manager = self.proxy_manager[proxy] @@ -202,7 +207,9 @@ def cert_verify(self, conn, url, verify, cert): :param conn: The urllib3 connection object associated with the cert. :param url: The requested URL. - :param verify: Whether we should actually verify the certificate. + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use :param cert: The SSL certificate to verify. """ if url.lower().startswith('https') and verify: @@ -214,10 +221,11 @@ def cert_verify(self, conn, url, verify, cert): cert_loc = verify if not cert_loc: - cert_loc = DEFAULT_CA_BUNDLE_PATH + cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) - if not cert_loc: - raise Exception("Could not find a suitable SSL CA certificate bundle.") + if not cert_loc or not os.path.exists(cert_loc): + raise IOError("Could not find a suitable TLS CA certificate bundle, " + "invalid path: {}".format(cert_loc)) conn.cert_reqs = 'CERT_REQUIRED' @@ -236,6 +244,13 @@ def cert_verify(self, conn, url, verify, cert): conn.key_file = cert[1] else: conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise IOError("Could not find the TLS certificate file, " + "invalid path: {}".format(conn.cert_file)) + if conn.key_file and not os.path.exists(conn.key_file): + raise IOError("Could not find the TLS key file, " + "invalid path: {}".format(conn.key_file)) def build_response(self, req, resp): """Builds a :class:`Response ` object from a urllib3 @@ -281,12 +296,16 @@ def get_connection(self, url, proxies=None): :param url: The URL to connect to. :param proxies: (optional) A Requests-style dictionary of proxies used on this request. - :rtype: requests.packages.urllib3.ConnectionPool + :rtype: urllib3.ConnectionPool """ proxy = select_proxy(url, proxies) if proxy: proxy = prepend_scheme_if_needed(proxy, 'http') + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL("Please check proxy URL. It is malformed" + " and could be missing the host.") proxy_manager = self.proxy_manager_for(proxy) conn = proxy_manager.connection_from_url(url) else: @@ -360,7 +379,7 @@ def proxy_headers(self, proxy): when subclassing the :class:`HTTPAdapter `. - :param proxies: The url of the proxy being used for this request. + :param proxy: The url of the proxy being used for this request. :rtype: dict """ headers = {} @@ -380,18 +399,23 @@ def send(self, request, stream=False, timeout=None, verify=True, cert=None, prox :param timeout: (optional) How long to wait for the server to send data before giving up, as a float, or a :ref:`(connect timeout, read timeout) ` tuple. - :type timeout: float or tuple - :param verify: (optional) Whether to verify SSL certificates. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use :param cert: (optional) Any user-provided SSL certificate to be trusted. :param proxies: (optional) The proxies dictionary to apply to the request. :rtype: requests.Response """ - conn = self.get_connection(request.url, proxies) + try: + conn = self.get_connection(request.url, proxies) + except LocationValueError as e: + raise InvalidURL(e, request=request) self.cert_verify(conn, request.url, verify, cert) url = self.request_url(request, proxies) - self.add_headers(request) + self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) chunked = not (request.body is None or 'Content-Length' in request.headers) @@ -401,10 +425,12 @@ def send(self, request, stream=False, timeout=None, verify=True, cert=None, prox timeout = TimeoutSauce(connect=connect, read=read) except ValueError as e: # this may raise a string formatting error. - err = ("Invalid timeout {0}. Pass a (connect, read) " + err = ("Invalid timeout {}. Pass a (connect, read) " "timeout tuple, or a single float to set " "both timeouts to the same value".format(timeout)) raise ValueError(err) + elif isinstance(timeout, TimeoutSauce): + pass else: timeout = TimeoutSauce(connect=timeout, read=timeout) @@ -449,11 +475,10 @@ def send(self, request, stream=False, timeout=None, verify=True, cert=None, prox # Receive the response from the server try: - # For Python 2.7+ versions, use buffering of HTTP - # responses + # For Python 2.7, use buffering of HTTP responses r = low_conn.getresponse(buffering=True) except TypeError: - # For compatibility with Python 2.6 versions and back + # For compatibility with Python 3.3+ r = low_conn.getresponse() resp = HTTPResponse.from_httplib( @@ -484,6 +509,10 @@ def send(self, request, stream=False, timeout=None, verify=True, cert=None, prox if isinstance(e.reason, _ProxyError): raise ProxyError(e, request=request) + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + raise ConnectionError(e, request=request) except ClosedPoolError as e: @@ -494,6 +523,7 @@ def send(self, request, stream=False, timeout=None, verify=True, cert=None, prox except (_SSLError, _HTTPError) as e: if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 raise SSLError(e, request=request) elif isinstance(e, ReadTimeoutError): raise ReadTimeout(e, request=request) diff --git a/Contents/Libraries/Shared/requests/api.py b/Contents/Libraries/Shared/requests/api.py index 16fd1e94f..abada96d4 100644 --- a/Contents/Libraries/Shared/requests/api.py +++ b/Contents/Libraries/Shared/requests/api.py @@ -18,9 +18,11 @@ def request(method, url, **kwargs): :param method: method for the new :class:`Request` object. :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. @@ -29,14 +31,16 @@ def request(method, url, **kwargs): defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers to add for the file. :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How long to wait for the server to send data + :param timeout: (optional) How many seconds to wait for the server to send data before giving up, as a float, or a :ref:`(connect timeout, read timeout) ` tuple. :type timeout: float or tuple :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. - :param verify: (optional) whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to ``True``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. :param stream: (optional) if ``False``, the response content will be immediately downloaded. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. :return: :class:`Response ` object @@ -45,7 +49,7 @@ def request(method, url, **kwargs): Usage:: >>> import requests - >>> req = requests.request('GET', 'http://httpbin.org/get') + >>> req = requests.request('GET', 'https://httpbin.org/get') """ @@ -57,10 +61,11 @@ def request(method, url, **kwargs): def get(url, params=None, **kwargs): - """Sends a GET request. + r"""Sends a GET request. :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response @@ -71,7 +76,7 @@ def get(url, params=None, **kwargs): def options(url, **kwargs): - """Sends a OPTIONS request. + r"""Sends an OPTIONS request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. @@ -84,7 +89,7 @@ def options(url, **kwargs): def head(url, **kwargs): - """Sends a HEAD request. + r"""Sends a HEAD request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. @@ -97,10 +102,11 @@ def head(url, **kwargs): def post(url, data=None, json=None, **kwargs): - """Sends a POST request. + r"""Sends a POST request. :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param json: (optional) json data to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object @@ -111,10 +117,11 @@ def post(url, data=None, json=None, **kwargs): def put(url, data=None, **kwargs): - """Sends a PUT request. + r"""Sends a PUT request. :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param json: (optional) json data to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object @@ -125,21 +132,22 @@ def put(url, data=None, **kwargs): def patch(url, data=None, **kwargs): - """Sends a PATCH request. + r"""Sends a PATCH request. :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param json: (optional) json data to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response """ - return request('patch', url, data=data, **kwargs) + return request('patch', url, data=data, **kwargs) def delete(url, **kwargs): - """Sends a DELETE request. + r"""Sends a DELETE request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. diff --git a/Contents/Libraries/Shared/requests/auth.py b/Contents/Libraries/Shared/requests/auth.py index 510846d69..bdde51c7f 100644 --- a/Contents/Libraries/Shared/requests/auth.py +++ b/Contents/Libraries/Shared/requests/auth.py @@ -20,7 +20,6 @@ from .cookies import extract_cookies_to_jar from ._internal_utils import to_native_string from .utils import parse_dict_header -from .status_codes import codes CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' CONTENT_TYPE_MULTI_PART = 'multipart/form-data' @@ -39,7 +38,7 @@ def _basic_auth_str(username, password): if not isinstance(username, basestring): warnings.warn( "Non-string usernames will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({0!r}) to " + "3.0.0. Please convert the object you've passed in ({!r}) to " "a string or bytes object in the near future to avoid " "problems.".format(username), category=DeprecationWarning, @@ -49,7 +48,7 @@ def _basic_auth_str(username, password): if not isinstance(password, basestring): warnings.warn( "Non-string passwords will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({0!r}) to " + "3.0.0. Please convert the object you've passed in ({!r}) to " "a string or bytes object in the near future to avoid " "problems.".format(password), category=DeprecationWarning, @@ -154,6 +153,18 @@ def sha_utf8(x): x = x.encode('utf-8') return hashlib.sha1(x).hexdigest() hash_utf8 = sha_utf8 + elif _algorithm == 'SHA-256': + def sha256_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha256(x).hexdigest() + hash_utf8 = sha256_utf8 + elif _algorithm == 'SHA-512': + def sha512_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha512(x).hexdigest() + hash_utf8 = sha512_utf8 KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) @@ -193,7 +204,7 @@ def sha_utf8(x): elif qop == 'auth' or 'auth' in qop.split(','): noncebit = "%s:%s:%s:%s:%s" % ( nonce, ncvalue, cnonce, 'auth', HA2 - ) + ) respdig = KD(HA1, noncebit) else: # XXX handle auth-int. @@ -227,6 +238,12 @@ def handle_401(self, r, **kwargs): :rtype: requests.Response """ + # If response is not 4xx, do not auth + # See https://github.com/requests/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + if self._thread_local.pos is not None: # Rewind the file position indicator of the body to where # it was to resend the request. diff --git a/Contents/Libraries/Shared/requests/cacert.pem b/Contents/Libraries/Shared/requests/cacert.pem deleted file mode 100644 index 108f9d631..000000000 --- a/Contents/Libraries/Shared/requests/cacert.pem +++ /dev/null @@ -1,5689 +0,0 @@ - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network -# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network -# Label: "AddTrust Low-Value Services Root" -# Serial: 1 -# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc -# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d -# SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7 ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw -MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD -VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul -CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n -tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl -dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch -PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC -+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O -BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl -MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X -7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz -43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl -pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA -WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network -# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network -# Label: "AddTrust Public Services Root" -# Serial: 1 -# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f -# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5 -# SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx -MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB -ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV -BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV -6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX -GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP -dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH -1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF -62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW -BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv -b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 -IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ -iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh -4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm -XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network -# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network -# Label: "AddTrust Qualified Certificates Root" -# Serial: 1 -# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb -# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf -# SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16 ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 -MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK -EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh -BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq -xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G -87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i -2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U -WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 -0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G -A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr -pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm -aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv -hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm -hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 -P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y -iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no -xqE= ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: O=RSA Security Inc OU=RSA Security 2048 V3 -# Subject: O=RSA Security Inc OU=RSA Security 2048 V3 -# Label: "RSA Security 2048 v3" -# Serial: 13297492616345471454730593562152402946 -# MD5 Fingerprint: 77:0d:19:b1:21:fd:00:42:9c:3e:0c:a5:dd:0b:02:8e -# SHA1 Fingerprint: 25:01:90:19:cf:fb:d9:99:1c:b7:68:25:74:8d:94:5f:30:93:95:42 -# SHA256 Fingerprint: af:8b:67:62:a1:e5:28:22:81:61:a9:5d:5c:55:9e:e2:66:27:8f:75:d7:9e:83:01:89:a5:03:50:6a:bd:6b:4c ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 -MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp -dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX -BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy -MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp -eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg -/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl -wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh -AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 -PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu -AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR -MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc -HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ -Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO -rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch -6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 -7CAFYd4= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Global CA 2" -# Serial: 1 -# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9 -# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d -# SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85 ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs -IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg -R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A -PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 -Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL -TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL -5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 -S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe -2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap -EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td -EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv -/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN -A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 -abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF -I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz -4iIprn2DQKi6bA== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Label: "GeoTrust Universal CA" -# Serial: 1 -# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 -# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 -# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Universal CA 2" -# Serial: 1 -# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 -# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 -# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Label: "Visa eCommerce Root" -# Serial: 25952180776285836048024890241505565794 -# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 -# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 -# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -# Issuer: CN=Certum CA O=Unizeto Sp. z o.o. -# Subject: CN=Certum CA O=Unizeto Sp. z o.o. -# Label: "Certum Root CA" -# Serial: 65568 -# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9 -# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18 -# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24 ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E -jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo -ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI -ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu -Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg -AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 -HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA -uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa -TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg -xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q -CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs -6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=Secure Certificate Services O=Comodo CA Limited -# Subject: CN=Secure Certificate Services O=Comodo CA Limited -# Label: "Comodo Secure Services root" -# Serial: 1 -# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd -# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1 -# SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8 ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp -ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow -fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV -BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM -cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S -HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 -CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk -3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz -6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV -HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud -EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv -Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw -Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww -DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 -5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI -gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ -aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl -izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= ------END CERTIFICATE----- - -# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited -# Subject: CN=Trusted Certificate Services O=Comodo CA Limited -# Label: "Comodo Trusted Services root" -# Serial: 1 -# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27 -# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd -# SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 -aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla -MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO -BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD -VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW -fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt -TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL -fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW -1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 -kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G -A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v -ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo -dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu -Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ -HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS -jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ -xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn -dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - -# Issuer: CN=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - -# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com -# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com -# Label: "UTN USERFirst Hardware Root CA" -# Serial: 91374294542884704022267039221184531197 -# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39 -# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7 -# SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37 ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB -lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt -SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG -A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe -MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v -d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh -cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn -0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ -M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a -MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd -oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI -DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy -oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 -dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy -bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF -BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli -CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE -CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t -3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS -KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Chambers of Commerce Root" -# Serial: 0 -# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84 -# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1 -# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3 ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg -b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa -MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB -ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw -IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B -AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb -unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d -BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq -7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 -0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX -roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG -A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j -aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA -BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud -EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN -BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB -AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd -p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi -1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc -XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 -eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu -tGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Global Chambersign Root" -# Serial: 0 -# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19 -# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9 -# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo -YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 -MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy -NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G -A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA -A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 -Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s -QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV -eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 -B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh -z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T -AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i -ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH -MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD -VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE -VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B -AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM -bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi -ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG -VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c -ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ -AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Label: "XRamp Global CA Root" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Label: "StartCom Certification Authority" -# Serial: 1 -# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 -# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f -# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j -ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js -LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM -BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy -dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh -cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh -YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg -dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp -bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ -YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT -TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ -9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 -jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW -FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz -ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 -ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L -EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu -L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC -O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V -um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh -NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= ------END CERTIFICATE----- - -# Issuer: O=Government Root Certification Authority -# Subject: O=Government Root Certification Authority -# Label: "Taiwan GRCA" -# Serial: 42023070807708724159991140556527066870 -# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e -# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 -# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- - -# Issuer: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services -# Subject: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services -# Label: "Swisscom Root CA 1" -# Serial: 122348795730808398873664200247279986742 -# MD5 Fingerprint: f8:38:7c:77:88:df:2c:16:68:2e:c2:e2:52:4b:b8:f9 -# SHA1 Fingerprint: 5f:3a:fc:0a:8b:64:f6:86:67:34:74:df:7e:a9:a2:fe:f9:fa:7a:51 -# SHA256 Fingerprint: 21:db:20:12:36:60:bb:2e:d4:18:20:5d:a1:1e:e7:a8:5a:65:e2:bc:6e:55:b5:af:7e:78:99:c8:a2:66:d9:2e ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk -MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 -YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg -Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT -AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp -Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 -m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih -FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ -TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F -EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco -kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu -HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF -vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo -19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC -L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW -bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX -JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw -FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j -BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc -K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf -ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik -Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB -sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e -3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR -ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip -mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH -b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf -rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms -hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y -zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 -MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Label: "DST ACES CA X6" -# Serial: 17771143917277623872238992636097467865 -# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8 -# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d -# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40 ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx -ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w -MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD -VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx -FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu -ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 -gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH -fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a -ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT -ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk -c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto -dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI -hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk -QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ -h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR -rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 -9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu -IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow -RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY -U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv -Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br -YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF -nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH -6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt -eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ -c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ -MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH -HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf -jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c -wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB -AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp -WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 -xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ -2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ -IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 -aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X -em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR -dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ -OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ -hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy -tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Label: "GeoTrust Primary Certification Authority" -# Serial: 32798226551256963324313806436981982369 -# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf -# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 -# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA" -# Serial: 69529181992039203566298953787712940909 -# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 -# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 -# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" -# Serial: 33037644167568058970164719475676101450 -# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c -# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 -# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA -# Subject: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA -# Label: "WellsSecure Public Root Certificate Authority" -# Serial: 1 -# MD5 Fingerprint: 15:ac:a5:c2:92:2d:79:bc:e8:7f:cb:67:ed:02:cf:36 -# SHA1 Fingerprint: e7:b4:f6:9d:61:ec:90:69:db:7e:90:a7:40:1a:3c:f4:7d:4f:e8:ee -# SHA256 Fingerprint: a7:12:72:ae:aa:a3:cf:e8:72:7f:7f:b3:9f:0f:b3:d1:e5:42:6e:90:60:b0:6e:e6:f1:3e:9a:3c:58:33:cd:43 ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx -IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs -cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 -MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl -bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD -DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r -WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU -Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs -HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj -z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf -SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl -AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG -KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P -AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j -BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC -VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX -ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB -ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd -/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB -A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn -k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 -iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv -2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Label: "Security Communication EV RootCA1" -# Serial: 0 -# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3 -# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d -# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37 ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz -MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N -IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 -bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE -RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO -zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 -bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF -MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 -VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC -OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW -tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ -q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb -EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ -Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O -VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GA CA" -# Serial: 86718877871133159090080555911823548314 -# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 -# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 -# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA -# Subject: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA -# Label: "Microsec e-Szigno Root CA" -# Serial: 272122594155480254301341951808045322001 -# MD5 Fingerprint: f0:96:b6:2f:c5:10:d5:67:8e:83:25:32:e8:5e:2e:e5 -# SHA1 Fingerprint: 23:88:c9:d3:71:cc:9e:96:3d:ff:7d:3c:a7:ce:fc:d6:25:ec:19:0d -# SHA256 Fingerprint: 32:7a:3d:76:1a:ba:de:a0:34:eb:99:84:06:27:5c:b1:a4:77:6e:fd:ae:2f:df:6d:01:68:ea:1c:4f:55:67:d0 ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw -cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy -b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z -ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 -NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN -TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p -Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u -uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ -LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA -vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 -Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx -62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB -AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw -LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP -BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB -AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov -MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 -ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT -AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh -ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo -AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa -AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln -bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p -Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP -PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv -Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB -EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu -w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj -cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV -HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI -VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS -BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS -b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS -8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds -ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl -7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR -hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ -MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi -# Subject: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi -# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3" -# Serial: 17 -# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26 -# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96 -# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS -MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp -bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw -VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy -YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy -dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe -Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx -GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls -aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU -QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh -xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 -aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr -IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h -gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK -O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO -fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw -lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID -AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP -NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t -wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM -7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh -gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n -oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs -yZyQ2uypQjyttgI= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327 -# Label: "Buypass Class 2 CA 1" -# Serial: 1 -# MD5 Fingerprint: b8:08:9a:f0:03:cc:1b:0d:c8:6c:0b:76:a1:75:64:23 -# SHA1 Fingerprint: a0:a1:ab:90:c9:fc:84:7b:3b:12:61:e8:97:7d:5f:d3:22:61:d3:cc -# SHA256 Fingerprint: 0f:4e:9c:dd:26:4b:02:55:50:d1:70:80:63:40:21:4f:e9:44:34:c9:b0:2f:69:7e:c7:10:fc:5f:ea:fb:5e:38 ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg -Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL -MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD -VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 -ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX -l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB -HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B -5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 -WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD -AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP -gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ -DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu -BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs -h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk -LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=CNNIC ROOT O=CNNIC -# Subject: CN=CNNIC ROOT O=CNNIC -# Label: "CNNIC ROOT" -# Serial: 1228079105 -# MD5 Fingerprint: 21:bc:82:ab:49:c4:13:3b:4b:b2:2b:5c:6b:90:9c:19 -# SHA1 Fingerprint: 8b:af:4c:9b:1d:f0:2a:92:f7:da:12:8e:b9:1b:ac:f4:98:60:4b:6f -# SHA256 Fingerprint: e2:83:93:77:3d:a8:45:a6:79:f2:08:0c:c7:fb:44:a3:b7:a1:c3:79:2c:b7:eb:77:29:fd:cb:6a:8d:99:ae:a7 ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD -TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 -MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF -Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh -IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 -dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO -V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC -GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN -v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB -AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB -Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO -76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK -OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH -ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi -yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL -buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj -2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= ------END CERTIFICATE----- - -# Issuer: O=Japanese Government OU=ApplicationCA -# Subject: O=Japanese Government OU=ApplicationCA -# Label: "ApplicationCA - Japanese Government" -# Serial: 49 -# MD5 Fingerprint: 7e:23:4e:5b:a7:a5:b4:25:e9:00:07:74:11:62:ae:d6 -# SHA1 Fingerprint: 7f:8a:b0:cf:d0:51:87:6a:66:f3:36:0f:47:c8:8d:8c:d3:35:fc:74 -# SHA256 Fingerprint: 2d:47:43:7d:e1:79:51:21:5a:12:f3:c5:8e:51:c7:29:a5:80:26:ef:1f:cc:0a:5f:b3:d9:dc:01:2f:60:0d:19 ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc -MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp -b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT -AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs -aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H -j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K -f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 -IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw -FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht -QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm -/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ -k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ -MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC -seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ -hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ -eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U -DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj -B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G3" -# Serial: 28809105769928564313984085209975885599 -# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 -# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd -# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G2" -# Serial: 71758320672825410020661621085256472406 -# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f -# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 -# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G3" -# Serial: 127614157056681299805556476275995414779 -# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 -# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 -# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" -# Serial: 63143484348153506665311985501458640051 -# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 -# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a -# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) -# Label: "NetLock Arany (Class Gold) Főtanúsítvány" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=ACEDICOM Root O=EDICOM OU=PKI -# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI -# Label: "ACEDICOM Root" -# Serial: 7029493972724711941 -# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6 -# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84 -# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a ------BEGIN CERTIFICATE----- -MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE -AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x -CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW -MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF -RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC -AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 -09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 -XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P -Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK -t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb -X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 -MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU -fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI -2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH -K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae -ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP -BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ -MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw -RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv -bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm -fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 -gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe -I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i -5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi -ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn -MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ -o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 -zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN -GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt -r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK -Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 -MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 -ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD -VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j -b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq -scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO -xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H -LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX -uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD -yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ -JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q -rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN -BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L -hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB -QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ -HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu -Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg -QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB -BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA -A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb -laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 -awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo -JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw -LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT -VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk -LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb -UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ -QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ -naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls -QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Autorité Racine" -# Serial: 1 -# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a -# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3 -# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17 ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk -BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 -Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl -cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 -aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY -F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N -8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe -rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K -/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu -7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC -28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 -lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E -nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB -0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 -5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj -WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN -jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s -ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM -OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q -619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn -2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj -o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v -nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG -5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq -pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb -dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 -BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -# Issuer: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA -# Subject: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA -# Label: "Root CA Generalitat Valenciana" -# Serial: 994436456 -# MD5 Fingerprint: 2c:8c:17:5e:b1:54:ab:93:17:b5:36:5a:db:d1:c6:f2 -# SHA1 Fingerprint: a0:73:e5:c5:bd:43:61:0d:86:4c:21:13:0a:85:58:57:cc:9c:ea:46 -# SHA256 Fingerprint: 8c:4e:df:d0:43:48:f3:22:96:9e:7e:29:a4:cd:4d:ca:00:46:55:06:1c:16:e1:b0:76:42:2e:f3:42:ad:63:0e ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF -UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ -R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN -MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw -JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+ -WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj -SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl -u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy -A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk -Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7 -MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr -aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC -IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A -cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA -YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA -bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA -bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA -aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA -ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA -YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA -ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA -LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6 -Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y -eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw -CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G -A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu -Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn -lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt -b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg -9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF -ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC -IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Label: "StartCom Certification Authority" -# Serial: 45 -# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 -# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 -# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 ------BEGIN CERTIFICATE----- -MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul -F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC -ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w -ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk -aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 -YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg -c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 -d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG -CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF -wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS -Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst -0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc -pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl -CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF -P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK -1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm -KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE -JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ -8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm -fyWl8kgAwKQB2j8= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. -# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. -# Label: "StartCom Certification Authority G2" -# Serial: 59 -# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 -# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 -# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 ------BEGIN CERTIFICATE----- -MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 -OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG -A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ -JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD -vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo -D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ -Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW -RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK -HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN -nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM -0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i -UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 -Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg -TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL -BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K -2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX -UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl -6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK -9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ -HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI -wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY -XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l -IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo -hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr -so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Label: "EE Certification Centre Root CA" -# Serial: 112324828676200291871926431888494945866 -# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f -# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 -# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 -czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG -CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy -MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl -ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS -b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy -euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO -bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw -WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d -MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE -1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ -zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF -BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV -v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG -E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW -iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v -GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= ------END CERTIFICATE----- - -# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007 -# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007 -# Label: "TURKTRUST Certificate Services Provider Root 2007" -# Serial: 1 -# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72 -# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33 -# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50 ------BEGIN CERTIFICATE----- -MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS -S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg -SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx -OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry -b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC -VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE -sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F -ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY -KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG -+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG -HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P -IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M -733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk -Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW -AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I -aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 -mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa -XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ -qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica -# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT -# Label: "PSCProcert" -# Serial: 11 -# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec -# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74 -# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0 ------BEGIN CERTIFICATE----- -MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s -YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz -dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 -aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh -IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ -KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw -MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy -b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx -KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG -A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u -aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 -7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 -BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G -ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 -JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 -PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 -0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH -0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ -6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m -v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 -K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev -bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw -MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w -MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD -gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 -b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh -bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 -cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp -ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg -ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq -hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD -AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w -MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag -RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t -UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl -cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v -Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG -AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN -AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS -1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB -3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv -Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh -HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm -pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz -sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE -qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb -mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 -opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H -YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km ------END CERTIFICATE----- - -# Issuer: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center -# Subject: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center -# Label: "China Internet Network Information Center EV Certificates Root" -# Serial: 1218379777 -# MD5 Fingerprint: 55:5d:63:00:97:bd:6a:97:f5:67:ab:4b:fb:6e:63:15 -# SHA1 Fingerprint: 4f:99:aa:93:fb:2b:d1:37:26:a1:99:4a:ce:7f:f0:05:f2:93:5d:1e -# SHA256 Fingerprint: 1c:01:c6:f4:db:b2:fe:fc:22:55:8b:2b:ca:32:56:3f:49:84:4a:cf:c3:2b:7b:e4:b0:ff:59:9f:9e:8c:7a:f7 ------BEGIN CERTIFICATE----- -MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC -Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g -Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0 -aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa -Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg -SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo -aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp -ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z -7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA// -DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx -zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8 -hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs -4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u -gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY -NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E -FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3 -j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG -52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB -echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws -ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI -zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy -wy39FCqQmbkHzJ8= ------END CERTIFICATE----- - -# Issuer: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services -# Subject: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services -# Label: "Swisscom Root CA 2" -# Serial: 40698052477090394928831521023204026294 -# MD5 Fingerprint: 5b:04:69:ec:a5:83:94:63:18:a7:86:d0:e4:f2:6e:19 -# SHA1 Fingerprint: 77:47:4f:c6:30:e4:0f:4c:47:64:3f:84:ba:b8:c6:95:4a:8a:41:ec -# SHA256 Fingerprint: f0:9b:12:2c:71:14:f4:a0:9b:d4:ea:4f:4a:99:d5:58:b4:6e:4c:25:cd:81:14:0d:29:c0:56:13:91:4c:38:41 ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk -MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 -YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg -Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT -AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp -Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr -jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r -0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f -2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP -ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF -y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA -tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL -6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0 -uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL -acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh -k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q -VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw -FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O -BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh -b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R -fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv -/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI -REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx -srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv -aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT -woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n -Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W -t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N -8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2 -9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5 -wSsSnqaeG8XmDtkx2Q== ------END CERTIFICATE----- - -# Issuer: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services -# Subject: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services -# Label: "Swisscom Root EV CA 2" -# Serial: 322973295377129385374608406479535262296 -# MD5 Fingerprint: 7b:30:34:9f:dd:0a:4b:6b:35:ca:31:51:28:5d:ae:ec -# SHA1 Fingerprint: e7:a1:90:29:d3:d5:52:dc:0d:0f:c6:92:d3:ea:88:0d:15:2e:1a:6b -# SHA256 Fingerprint: d9:5f:ea:3c:a4:ee:dc:e7:4c:d7:6e:75:fc:6d:1f:f6:2c:44:1f:0f:a8:bc:77:f0:34:b1:9e:5d:b2:58:01:5d ------BEGIN CERTIFICATE----- -MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw -ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp -dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290 -IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD -VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy -dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg -MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx -UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD -1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH -oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR -HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/ -5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv -idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL -OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC -NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f -46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB -UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth -7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G -A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED -MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB -bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x -XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T -PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0 -Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70 -WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL -Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm -7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S -nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN -vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB -WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI -fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb -I+2ksx0WckNLIOFZfsLorSa/ovc= ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R1 O=Disig a.s. -# Subject: CN=CA Disig Root R1 O=Disig a.s. -# Label: "CA Disig Root R1" -# Serial: 14052245610670616104 -# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a -# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6 -# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy -MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk -D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o -OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A -fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe -IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n -oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK -/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj -rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD -3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE -7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC -yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd -qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI -hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR -xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA -SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo -HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB -emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC -AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb -7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x -DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk -F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF -a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT -Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=Certification Authority of WoSign O=WoSign CA Limited -# Subject: CN=Certification Authority of WoSign O=WoSign CA Limited -# Label: "WoSign" -# Serial: 125491772294754854453622855443212256657 -# MD5 Fingerprint: a1:f2:f9:b5:d2:c8:7a:74:b8:f3:05:f1:d7:e1:84:8d -# SHA1 Fingerprint: b9:42:94:bf:91:ea:8f:b6:4b:e6:10:97:c7:fb:00:13:59:b6:76:cb -# SHA256 Fingerprint: 4b:22:d5:a6:ae:c9:9f:3c:db:79:aa:5e:c0:68:38:47:9c:d5:ec:ba:71:64:f7:f2:2d:c1:d6:5f:63:d8:57:08 ------BEGIN CERTIFICATE----- -MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBV -MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV -BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw -MTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX -b1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvcqN -rLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1U -fcIiePyOCbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcScc -f+Hb0v1naMQFXQoOXXDX2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2 -ZjC1vt7tj/id07sBMOby8w7gLJKA84X5KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4M -x1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR+ScPewavVIMYe+HdVHpR -aG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ezEC8wQjch -zDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDar -uHqklWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221K -mYo0SLwX3OSACCK28jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvA -Sh0JWzko/amrzgD5LkhLJuYwTKVYyrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWv -HYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0CAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R8bNLtwYgFP6H -EtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 -LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJ -MuYhOZO9sxXqT2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2e -JXLOC62qx1ViC777Y7NhRCOjy+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VN -g64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC2nz4SNAzqfkHx5Xh9T71XXG68pWp -dIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes5cVAWubXbHssw1ab -R80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/EaEQ -PkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGce -xGATVdVhmVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+ -J7x6v+Db9NpSvd4MVHAxkUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMl -OtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGikpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWT -ee5Ehr7XHuQe+w== ------END CERTIFICATE----- - -# Issuer: CN=CA 沃通根证书 O=WoSign CA Limited -# Subject: CN=CA 沃通根证书 O=WoSign CA Limited -# Label: "WoSign China" -# Serial: 106921963437422998931660691310149453965 -# MD5 Fingerprint: 78:83:5b:52:16:76:c4:24:3b:83:78:e8:ac:da:9a:93 -# SHA1 Fingerprint: 16:32:47:8d:89:f9:21:3a:92:00:85:63:f5:a4:a7:d3:12:40:8a:d6 -# SHA256 Fingerprint: d6:f0:34:bd:94:aa:23:3f:02:97:ec:a4:24:5b:28:39:73:e4:47:aa:59:0f:31:0c:77:f4:8f:df:83:11:22:54 ------BEGIN CERTIFICATE----- -MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBG -MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNV -BAMMEkNBIOayg+mAmuagueivgeS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgw -MTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRl -ZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k8H/r -D195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld1 -9AXbbQs5uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExf -v5RxadmWPgxDT74wwJ85dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnk -UkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+L -NVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFyb7Ao65vh4YOhn0pdr8yb -+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc76DbT52V -qyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6K -yX2m+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0G -AbQOXDBGVWCvOGU6yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaK -J/kR8slC/k7e3x9cxKSGhxYzoacXGKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwEC -AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUAA4ICAQBqinA4 -WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 -yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj -/feTZU7n85iYr83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6 -jBAyvd0zaziGfjk9DgNyp115j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2 -ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0AkLppRQjbbpCBhqcqBT/mhDn4t/lX -X0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97qA4bLJyuQHCH2u2n -FoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Yjj4D -u9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10l -O1Hm13ZBONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Le -ie2uPAmvylezkolwQOQvT8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR1 -2KvxAmLBsX5VYc8T1yaw15zLKYs4SgsOkI26oQ== ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 14367148294922964480859022125800977897474 -# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e -# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb -# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G3" -# Serial: 10003001 -# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 -# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc -# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX -DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP -cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW -IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX -xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy -KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR -9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az -5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 -6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 -Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP -bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt -BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt -XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd -INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp -LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 -Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp -gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh -/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw -0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A -fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq -4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR -1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ -QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM -94B7IWcnMFk= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden EV Root CA" -# Serial: 10000013 -# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba -# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb -# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -# Label: "TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5" -# Serial: 156233699172481 -# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e -# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb -# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 ------BEGIN CERTIFICATE----- -MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE -BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn -aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg -QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg -SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 -MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD -VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom -/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR -Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 -4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z -5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 -hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID -AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX -SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l -VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq -URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf -peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF -Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW -+qtB4Uu2NQvAmxU= ------END CERTIFICATE----- - -# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -# Label: "TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6" -# Serial: 138134509972618 -# MD5 Fingerprint: f8:c5:ee:2a:6b:be:95:8d:08:f7:25:4a:ea:71:3e:46 -# SHA1 Fingerprint: 8a:5c:8c:ee:a5:03:e6:05:56:ba:d8:1b:d4:f6:c9:b0:ed:e5:2f:e0 -# SHA256 Fingerprint: 8d:e7:86:55:e1:be:7f:78:47:80:0b:93:f6:94:d2:1d:36:8c:c0:6e:03:3e:7f:ab:04:bb:5e:b9:9d:a6:b7:00 ------BEGIN CERTIFICATE----- -MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQG -EwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdp -IMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBB -LsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBI -aXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5MDQxMFoXDTIzMTIx -NjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBLBgNV -BAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2 -ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVs -ZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCdsGjW6L0UlqMACprx9MfMkU1x -eHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a2uqsxgbPJQ1BgfbBOCK9 -+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EEDwnS3/faA -z1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0p -u5FbHH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6p -lVxiSvgNZ1GpryHV+DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMB -AAGjQjBAMB0GA1UdDgQWBBTdVRcT9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAb1gNl0Oq -FlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3RfdCaqaXKGDsC -QC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy -o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKID -gI6tflEATseWhvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm -9ocJV612ph1jmv3XZch4gyt1O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsG -tAuYSyher4hYyw== ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Root CA" -# Serial: 1 -# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f -# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 -# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 ------BEGIN CERTIFICATE----- -MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb -BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz -MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx -FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g -Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 -fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl -LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV -WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF -TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb -5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc -CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri -wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ -wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG -m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 -F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng -WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 -2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF -AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ -0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw -F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS -g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj -qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN -h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ -ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V -btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj -Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ -8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW -gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=Certification Authority of WoSign G2 O=WoSign CA Limited -# Subject: CN=Certification Authority of WoSign G2 O=WoSign CA Limited -# Label: "Certification Authority of WoSign G2" -# Serial: 142423943073812161787490648904721057092 -# MD5 Fingerprint: c8:1c:7d:19:aa:cb:71:93:f2:50:f8:52:a8:1e:ba:60 -# SHA1 Fingerprint: fb:ed:dc:90:65:b7:27:20:37:bc:55:0c:9c:56:de:bb:f2:78:94:e1 -# SHA256 Fingerprint: d4:87:a5:6f:83:b0:74:82:e8:5e:96:33:94:c1:ec:c2:c9:e5:1d:09:03:ee:94:6b:02:c3:01:58:1e:d9:9e:16 ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBY -MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNV -BAMTJENlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDEx -MDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgxCzAJBgNVBAYTAkNOMRowGAYDVQQK -ExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPX -JYY1kBaiXW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgO -gHzKtB0TiGsOqCR3A9DuW/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg -5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg95k4ot+vElbGs/V6r+kHLXZ1L3PR8du9n -fwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BKv0mUYQs4kI9dJGwlezt5 -2eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJ -KoZIhvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8 -fHulwqZm46qwtyeYP0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G -3CE4Q3RM+zD4F3LBMvzIkRfEzFg3TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yy -SrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu+sif/a+RZQp4OBXllxcU3fng -LDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+7Q9LGOHSJDy7 -XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= ------END CERTIFICATE----- - -# Issuer: CN=CA WoSign ECC Root O=WoSign CA Limited -# Subject: CN=CA WoSign ECC Root O=WoSign CA Limited -# Label: "CA WoSign ECC Root" -# Serial: 138625735294506723296996289575837012112 -# MD5 Fingerprint: 80:c6:53:ee:61:82:28:72:f0:ff:21:b9:17:ca:b2:20 -# SHA1 Fingerprint: d2:7a:d2:be:ed:94:c0:a1:3c:c7:25:21:ea:5d:71:be:81:19:f3:2b -# SHA256 Fingerprint: 8b:45:da:1c:06:f7:91:eb:0c:ab:f2:6b:e5:88:f5:fb:23:16:5c:2e:61:4b:f8:85:56:2d:0d:ce:50:b2:9b:02 ------BEGIN CERTIFICATE----- -MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQsw -CQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMT -EkNBIFdvU2lnbiBFQ0MgUm9vdDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4 -NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEb -MBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZIzj0CAQYFK4EEACID -YgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiUt5v8 -KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES -1ns2o0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUqv3VWqP2h4syhf3RMluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB -1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0Daupn75OcsqF1NnstTJFGG+rrQIwfcf3 -aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYua/GRspBl9JrmkO5K ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=Certplus Root CA G1 O=Certplus -# Subject: CN=Certplus Root CA G1 O=Certplus -# Label: "Certplus Root CA G1" -# Serial: 1491911565779898356709731176965615564637713 -# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 -# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 -# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a -iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt -6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP -0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f -6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE -EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN -1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc -h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT -mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV -4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO -WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud -DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd -Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq -hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh -66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 -/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS -S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j -2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R -Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr -RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy -6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV -V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 -g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl -++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= ------END CERTIFICATE----- - -# Issuer: CN=Certplus Root CA G2 O=Certplus -# Subject: CN=Certplus Root CA G2 O=Certplus -# Label: "Certplus Root CA G2" -# Serial: 1492087096131536844209563509228951875861589 -# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 -# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a -# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 ------BEGIN CERTIFICATE----- -MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat -93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x -Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P -AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj -FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG -SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch -p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal -U5ORGpOucGpnutee5WEaXw== ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust -# Subject: CN=OpenTrust Root CA G1 O=OpenTrust -# Label: "OpenTrust Root CA G1" -# Serial: 1492036577811947013770400127034825178844775 -# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da -# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e -# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b -wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX -/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 -77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP -uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx -p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx -Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 -TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W -G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw -vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY -EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 -2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw -DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E -PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf -gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS -FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 -V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P -XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I -i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t -TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 -09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky -Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ -AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj -1oxx ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust -# Subject: CN=OpenTrust Root CA G2 O=OpenTrust -# Label: "OpenTrust Root CA G2" -# Serial: 1492012448042702096986875987676935573415441 -# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb -# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b -# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh -/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e -CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 -1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE -FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS -gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X -G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy -YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH -vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 -t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ -gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 -5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w -DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz -Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 -nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT -RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT -wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 -t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa -TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 -o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU -3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA -iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f -WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM -S1IK ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust -# Subject: CN=OpenTrust Root CA G3 O=OpenTrust -# Label: "OpenTrust Root CA G3" -# Serial: 1492104908271485653071219941864171170455615 -# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 -# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 -# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 ------BEGIN CERTIFICATE----- -MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx -CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U -cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow -QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl -blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm -3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d -oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G -A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 -DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK -BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q -j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx -4nxp5V2a+EEfOzmTk51V6s2N8fvB ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- -# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Secure Server CA" -# Serial: 927650371 -# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee -# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 -# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Label: "ValiCert Class 2 VA" -# Serial: 1 -# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 -# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 -# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- - -# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Express (Class C) Root" -# Serial: 104 -# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 -# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b -# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Business (Class B) Root" -# Serial: 105 -# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 -# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af -# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Label: "RSA Root Certificate 1" -# Serial: 1 -# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 -# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb -# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Label: "ValiCert Class 1 VA" -# Serial: 1 -# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb -# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e -# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure eBusiness CA 1" -# Serial: 4 -# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d -# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 -# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure Global eBusiness CA" -# Serial: 1 -# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc -# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 -# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Premium Server CA" -# Serial: 1 -# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a -# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a -# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Server CA" -# Serial: 1 -# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d -# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c -# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 149843929435818692848040365716851702463 -# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 -# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 -# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 80507572722862485515306429940691309246 -# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 -# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b -# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Label: "Verisign Class 3 Public Primary Certification Authority - G2" -# Serial: 167285380242319648451154478808036881606 -# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 -# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f -# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- - -# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Label: "GTE CyberTrust Global Root" -# Serial: 421 -# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db -# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 -# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -# Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Label: "Equifax Secure Certificate Authority" -# Serial: 903804111 -# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 -# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a -# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- diff --git a/Contents/Libraries/Shared/requests/certs.py b/Contents/Libraries/Shared/requests/certs.py index f922b99d7..d1a378d78 100644 --- a/Contents/Libraries/Shared/requests/certs.py +++ b/Contents/Libraries/Shared/requests/certs.py @@ -5,21 +5,14 @@ requests.certs ~~~~~~~~~~~~~~ -This module returns the preferred default CA certificate bundle. +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. If you are packaging Requests, e.g., for a Linux distribution or a managed environment, you can change the definition of where() to return a separately packaged CA bundle. """ -import os.path - -try: - from certifi import where -except ImportError: - def where(): - """Return the preferred certificate bundle.""" - # vendored bundle inside Requests - return os.path.join(os.path.dirname(__file__), 'cacert.pem') +from certifi import where if __name__ == '__main__': print(where()) diff --git a/Contents/Libraries/Shared/requests/compat.py b/Contents/Libraries/Shared/requests/compat.py index f88e600d2..c44b35efb 100644 --- a/Contents/Libraries/Shared/requests/compat.py +++ b/Contents/Libraries/Shared/requests/compat.py @@ -8,7 +8,7 @@ Python 3. """ -from .packages import chardet +import chardet import sys @@ -27,9 +27,7 @@ try: import simplejson as json -except (ImportError, SyntaxError): - # simplejson does not support Python 3.2, it throws a SyntaxError - # because of u'...' Unicode literals. +except ImportError: import json # --------- @@ -37,13 +35,16 @@ # --------- if is_py2: - from urllib import quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, proxy_bypass + from urllib import ( + quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, + proxy_bypass, proxy_bypass_environment, getproxies_environment) from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag from urllib2 import parse_http_list import cookielib from Cookie import Morsel from StringIO import StringIO - from .packages.urllib3.packages.ordered_dict import OrderedDict + from collections import Callable, Mapping, MutableMapping, OrderedDict + builtin_str = str bytes = str @@ -54,11 +55,12 @@ elif is_py3: from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag - from urllib.request import parse_http_list, getproxies, proxy_bypass + from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment from http import cookiejar as cookielib from http.cookies import Morsel from io import StringIO from collections import OrderedDict + from collections.abc import Callable, Mapping, MutableMapping builtin_str = str str = str diff --git a/Contents/Libraries/Shared/requests/cookies.py b/Contents/Libraries/Shared/requests/cookies.py index 856fd45ec..56fccd9c2 100644 --- a/Contents/Libraries/Shared/requests/cookies.py +++ b/Contents/Libraries/Shared/requests/cookies.py @@ -12,15 +12,12 @@ import copy import time import calendar -import collections from ._internal_utils import to_native_string -from .compat import cookielib, urlparse, urlunparse, Morsel +from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping try: import threading - # grr, pyflakes: this fixes "redefinition of unused 'threading'" - threading except ImportError: import dummy_threading as threading @@ -171,7 +168,7 @@ class CookieConflictError(RuntimeError): """ -class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): +class RequestsCookieJar(cookielib.CookieJar, MutableMapping): """Compatibility class; is a cookielib.CookieJar, but exposes a dict interface. @@ -308,8 +305,10 @@ def get_dict(self, domain=None, path=None): """ dictionary = {} for cookie in iter(self): - if (domain is None or cookie.domain == domain) and (path is None - or cookie.path == path): + if ( + (domain is None or cookie.domain == domain) and + (path is None or cookie.path == path) + ): dictionary[cookie.name] = cookie.value return dictionary @@ -415,9 +414,14 @@ def __setstate__(self, state): def copy(self): """Return a copy of this RequestsCookieJar.""" new_cj = RequestsCookieJar() + new_cj.set_policy(self.get_policy()) new_cj.update(self) return new_cj + def get_policy(self): + """Return the CookiePolicy instance used.""" + return self._policy + def _copy_cookie_jar(jar): if jar is None: @@ -440,20 +444,21 @@ def create_cookie(name, value, **kwargs): By default, the pair of `name` and `value` will be set for the domain '' and sent on every request (this is sometimes called a "supercookie"). """ - result = dict( - version=0, - name=name, - value=value, - port=None, - domain='', - path='/', - secure=False, - expires=None, - discard=True, - comment=None, - comment_url=None, - rest={'HttpOnly': None}, - rfc2109=False,) + result = { + 'version': 0, + 'name': name, + 'value': value, + 'port': None, + 'domain': '', + 'path': '/', + 'secure': False, + 'expires': None, + 'discard': True, + 'comment': None, + 'comment_url': None, + 'rest': {'HttpOnly': None}, + 'rfc2109': False, + } badargs = set(kwargs) - set(result) if badargs: @@ -507,6 +512,7 @@ def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): :param cookiejar: (optional) A cookiejar to add the cookies to. :param overwrite: (optional) If False, will not replace cookies already in the jar with new ones. + :rtype: CookieJar """ if cookiejar is None: cookiejar = RequestsCookieJar() @@ -525,6 +531,7 @@ def merge_cookies(cookiejar, cookies): :param cookiejar: CookieJar object to add the cookies to. :param cookies: Dictionary or CookieJar object to be added. + :rtype: CookieJar """ if not isinstance(cookiejar, cookielib.CookieJar): raise ValueError('You can only merge into CookieJar') diff --git a/Contents/Libraries/Shared/requests/exceptions.py b/Contents/Libraries/Shared/requests/exceptions.py index 0658e7ec5..a80cad80f 100644 --- a/Contents/Libraries/Shared/requests/exceptions.py +++ b/Contents/Libraries/Shared/requests/exceptions.py @@ -6,7 +6,7 @@ This module contains the set of Requests' exceptions. """ -from .packages.urllib3.exceptions import HTTPError as BaseHTTPError +from urllib3.exceptions import HTTPError as BaseHTTPError class RequestException(IOError): @@ -85,6 +85,10 @@ class InvalidHeader(RequestException, ValueError): """The header value provided was somehow invalid.""" +class InvalidProxyURL(InvalidURL): + """The proxy URL provided is invalid.""" + + class ChunkedEncodingError(RequestException): """The server declared chunked encoding but sent an invalid chunk.""" @@ -100,6 +104,7 @@ class StreamConsumedError(RequestException, TypeError): class RetryError(RequestException): """Custom retries logic failed""" + class UnrewindableBodyError(RequestException): """Requests encountered an error when trying to rewind a body""" @@ -114,3 +119,8 @@ class RequestsWarning(Warning): class FileModeWarning(RequestsWarning, DeprecationWarning): """A file was opened in text mode, but Requests determined its binary length.""" pass + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" + pass diff --git a/Contents/Libraries/Shared/requests/help.py b/Contents/Libraries/Shared/requests/help.py new file mode 100644 index 000000000..e53d35ef6 --- /dev/null +++ b/Contents/Libraries/Shared/requests/help.py @@ -0,0 +1,119 @@ +"""Module containing bug report helper(s).""" +from __future__ import print_function + +import json +import platform +import sys +import ssl + +import idna +import urllib3 +import chardet + +from . import __version__ as requests_version + +try: + from urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import OpenSSL + import cryptography + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 2.7.5 it will return + {'name': 'CPython', 'version': '2.7.5'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == 'CPython': + implementation_version = platform.python_version() + elif implementation == 'PyPy': + implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + implementation_version = ''.join([ + implementation_version, sys.pypy_version_info.releaselevel + ]) + elif implementation == 'Jython': + implementation_version = platform.python_version() # Complete Guess + elif implementation == 'IronPython': + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = 'Unknown' + + return {'name': implementation, 'version': implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + 'system': platform.system(), + 'release': platform.release(), + } + except IOError: + platform_info = { + 'system': 'Unknown', + 'release': 'Unknown', + } + + implementation_info = _implementation() + urllib3_info = {'version': urllib3.__version__} + chardet_info = {'version': chardet.__version__} + + pyopenssl_info = { + 'version': None, + 'openssl_version': '', + } + if OpenSSL: + pyopenssl_info = { + 'version': OpenSSL.__version__, + 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, + } + cryptography_info = { + 'version': getattr(cryptography, '__version__', ''), + } + idna_info = { + 'version': getattr(idna, '__version__', ''), + } + + system_ssl = ssl.OPENSSL_VERSION_NUMBER + system_ssl_info = { + 'version': '%x' % system_ssl if system_ssl is not None else '' + } + + return { + 'platform': platform_info, + 'implementation': implementation_info, + 'system_ssl': system_ssl_info, + 'using_pyopenssl': pyopenssl is not None, + 'pyOpenSSL': pyopenssl_info, + 'urllib3': urllib3_info, + 'chardet': chardet_info, + 'cryptography': cryptography_info, + 'idna': idna_info, + 'requests': { + 'version': requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/Contents/Libraries/Shared/requests/hooks.py b/Contents/Libraries/Shared/requests/hooks.py index 32b32de75..7a51f212c 100644 --- a/Contents/Libraries/Shared/requests/hooks.py +++ b/Contents/Libraries/Shared/requests/hooks.py @@ -15,14 +15,14 @@ def default_hooks(): - return dict((event, []) for event in HOOKS) + return {event: [] for event in HOOKS} # TODO: response is the only one def dispatch_hook(key, hooks, hook_data, **kwargs): """Dispatches a hook dictionary on a given piece of data.""" - hooks = hooks or dict() + hooks = hooks or {} hooks = hooks.get(key) if hooks: if hasattr(hooks, '__call__'): diff --git a/Contents/Libraries/Shared/requests/models.py b/Contents/Libraries/Shared/requests/models.py index d1a9c8687..3dded57ef 100644 --- a/Contents/Libraries/Shared/requests/models.py +++ b/Contents/Libraries/Shared/requests/models.py @@ -7,26 +7,26 @@ This module contains the primary objects that power Requests. """ -import collections import datetime import sys # Import encoding now, to avoid implicit import later. # Implicit import within threads may cause LookupError when standard library is in a ZIP, -# such as in Embedded Python. See https://github.com/kennethreitz/requests/issues/3578. +# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. import encodings.idna -from io import BytesIO, UnsupportedOperation +from urllib3.fields import RequestField +from urllib3.filepost import encode_multipart_formdata +from urllib3.util import parse_url +from urllib3.exceptions import ( + DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) + +from io import UnsupportedOperation from .hooks import default_hooks from .structures import CaseInsensitiveDict from .auth import HTTPBasicAuth from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar -from .packages.urllib3.fields import RequestField -from .packages.urllib3.filepost import encode_multipart_formdata -from .packages.urllib3.util import parse_url -from .packages.urllib3.exceptions import ( - DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) from .exceptions import ( HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, ContentDecodingError, ConnectionError, StreamConsumedError) @@ -36,7 +36,8 @@ stream_decode_response_unicode, to_key_val_list, parse_header_links, iter_slices, guess_json_utf, super_len, check_header_validity) from .compat import ( - cookielib, urlunparse, urlsplit, urlencode, str, bytes, StringIO, + Callable, Mapping, + cookielib, urlunparse, urlsplit, urlencode, str, bytes, is_py2, chardet, builtin_str, basestring) from .compat import json as complexjson from .status_codes import codes @@ -154,8 +155,12 @@ def _encode_files(files, data): if isinstance(fp, (str, bytes, bytearray)): fdata = fp - else: + elif hasattr(fp, 'read'): fdata = fp.read() + elif fp is None: + continue + else: + fdata = fp rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) rf.make_multipart(content_type=ft) @@ -173,10 +178,10 @@ def register_hook(self, event, hook): if event not in self.hooks: raise ValueError('Unsupported event specified, with event name "%s"' % (event)) - if isinstance(hook, collections.Callable): + if isinstance(hook, Callable): self.hooks[event].append(hook) elif hasattr(hook, '__iter__'): - self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable)) + self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) def deregister_hook(self, event, hook): """Deregister a previously registered hook. @@ -199,9 +204,13 @@ class Request(RequestHooksMixin): :param url: URL to send. :param headers: dictionary of headers to send. :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place. + :param data: the body to attach to the request. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. :param json: json for the body to attach to the request (if files or data is not specified). - :param params: dictionary of URL parameters to append to the URL. + :param params: URL parameters to append to the URL. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. :param auth: Auth handler or (user, pass) tuple. :param cookies: dictionary or CookieJar of cookies to attach to this request. :param hooks: dictionary of callback hooks, for internal usage. @@ -209,13 +218,14 @@ class Request(RequestHooksMixin): Usage:: >>> import requests - >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> req = requests.Request('GET', 'https://httpbin.org/get') >>> req.prepare() """ - def __init__(self, method=None, url=None, headers=None, files=None, - data=None, params=None, auth=None, cookies=None, hooks=None, json=None): + def __init__(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): # Default empty dicts for dict params. data = [] if data is None else data @@ -268,7 +278,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): Usage:: >>> import requests - >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> req = requests.Request('GET', 'https://httpbin.org/get') >>> r = req.prepare() @@ -294,8 +304,9 @@ def __init__(self): #: integer denoting starting position of a readable file-like body. self._body_position = None - def prepare(self, method=None, url=None, headers=None, files=None, - data=None, params=None, auth=None, cookies=None, hooks=None, json=None): + def prepare(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): """Prepares the entire request with the given parameters.""" self.prepare_method(method) @@ -333,13 +344,7 @@ def prepare_method(self, method): @staticmethod def _get_idna_encoded_host(host): - try: - from .packages import idna - except ImportError: - # tolerate the possibility of downstream repackagers unvendoring `requests` - # For more information, read: packages/__init__.py - import idna - sys.modules['requests.packages.idna'] = idna + import idna try: host = idna.encode(host, uts46=True).decode('utf-8') @@ -353,7 +358,7 @@ def prepare_url(self, url, params): #: We're unable to blindly call unicode/str functions #: as this will include the bytestring indicator (b'') #: on python 3.x. - #: https://github.com/kennethreitz/requests/pull/2238 + #: https://github.com/requests/requests/pull/2238 if isinstance(url, bytes): url = url.decode('utf8') else: @@ -464,7 +469,7 @@ def prepare_body(self, data, files, json=None): is_stream = all([ hasattr(data, '__iter__'), - not isinstance(data, (basestring, list, tuple, collections.Mapping)) + not isinstance(data, (basestring, list, tuple, Mapping)) ]) try: @@ -589,10 +594,9 @@ class Response(object): ] def __init__(self): - super(Response, self).__init__() - self._content = False self._content_consumed = False + self._next = None #: Integer Code of responded HTTP Status, e.g. 404 or 200. self.status_code = None @@ -636,16 +640,19 @@ def __init__(self): #: is a response. self.request = None + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + def __getstate__(self): # Consume everything; accessing the content attribute makes # sure the content has been fully read. if not self._content_consumed: self.content - return dict( - (attr, getattr(self, attr, None)) - for attr in self.__attrs__ - ) + return {attr: getattr(self, attr, None) for attr in self.__attrs__} def __setstate__(self, state): for name, value in state.items(): @@ -659,11 +666,23 @@ def __repr__(self): return '' % (self.status_code) def __bool__(self): - """Returns true if :attr:`status_code` is 'OK'.""" + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ return self.ok def __nonzero__(self): - """Returns true if :attr:`status_code` is 'OK'.""" + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ return self.ok def __iter__(self): @@ -672,6 +691,13 @@ def __iter__(self): @property def ok(self): + """Returns True if :attr:`status_code` is less than 400, False if not. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ try: self.raise_for_status() except HTTPError: @@ -687,12 +713,17 @@ def is_redirect(self): @property def is_permanent_redirect(self): - """True if this Response one of the permanent versions of redirect""" + """True if this Response one of the permanent versions of redirect.""" return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + @property def apparent_encoding(self): - """The apparent encoding, provided by the chardet library""" + """The apparent encoding, provided by the chardet library.""" return chardet.detect(self.content)['encoding'] def iter_content(self, chunk_size=1, decode_unicode=False): @@ -794,7 +825,7 @@ def content(self): if self.status_code == 0 or self.raw is None: self._content = None else: - self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes() + self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' self._content_consumed = True # don't need to release the connection; that's been handled by urllib3 @@ -840,7 +871,7 @@ def text(self): return content def json(self, **kwargs): - """Returns the json-encoded content of a response, if any. + r"""Returns the json-encoded content of a response, if any. :param \*\*kwargs: Optional arguments that ``json.loads`` takes. :raises ValueError: If the response body does not contain valid json. diff --git a/Contents/Libraries/Shared/requests/packages.py b/Contents/Libraries/Shared/requests/packages.py new file mode 100644 index 000000000..7232fe0ff --- /dev/null +++ b/Contents/Libraries/Shared/requests/packages.py @@ -0,0 +1,14 @@ +import sys + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ('urllib3', 'idna', 'chardet'): + locals()[package] = __import__(package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == package or mod.startswith(package + '.'): + sys.modules['requests.packages.' + mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/Contents/Libraries/Shared/requests/packages/__init__.py b/Contents/Libraries/Shared/requests/packages/__init__.py deleted file mode 100644 index 971c2ad02..000000000 --- a/Contents/Libraries/Shared/requests/packages/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -''' -Debian and other distributions "unbundle" requests' vendored dependencies, and -rewrite all imports to use the global versions of ``urllib3`` and ``chardet``. -The problem with this is that not only requests itself imports those -dependencies, but third-party code outside of the distros' control too. - -In reaction to these problems, the distro maintainers replaced -``requests.packages`` with a magical "stub module" that imports the correct -modules. The implementations were varying in quality and all had severe -problems. For example, a symlink (or hardlink) that links the correct modules -into place introduces problems regarding object identity, since you now have -two modules in `sys.modules` with the same API, but different identities:: - - requests.packages.urllib3 is not urllib3 - -With version ``2.5.2``, requests started to maintain its own stub, so that -distro-specific breakage would be reduced to a minimum, even though the whole -issue is not requests' fault in the first place. See -https://github.com/kennethreitz/requests/pull/2375 for the corresponding pull -request. -''' - -from __future__ import absolute_import -import sys - -try: - from . import urllib3 -except ImportError: - import urllib3 - sys.modules['%s.urllib3' % __name__] = urllib3 - -try: - from . import chardet -except ImportError: - import chardet - sys.modules['%s.chardet' % __name__] = chardet diff --git a/Contents/Libraries/Shared/requests/packages/chardet/__init__.py b/Contents/Libraries/Shared/requests/packages/chardet/__init__.py deleted file mode 100644 index 82c2a48d2..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/__init__.py +++ /dev/null @@ -1,32 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -__version__ = "2.3.0" -from sys import version_info - - -def detect(aBuf): - if ((version_info < (3, 0) and isinstance(aBuf, unicode)) or - (version_info >= (3, 0) and not isinstance(aBuf, bytes))): - raise ValueError('Expected a bytes object, not a unicode object') - - from . import universaldetector - u = universaldetector.UniversalDetector() - u.reset() - u.feed(aBuf) - u.close() - return u.result diff --git a/Contents/Libraries/Shared/requests/packages/chardet/big5freq.py b/Contents/Libraries/Shared/requests/packages/chardet/big5freq.py deleted file mode 100644 index 65bffc04b..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/big5freq.py +++ /dev/null @@ -1,925 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Big5 frequency table -# by Taiwan's Mandarin Promotion Council -# -# -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -#Char to FreqOrder table -BIG5_TABLE_SIZE = 5376 - -Big5CharToFreqOrder = ( - 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 -3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 -1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 - 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 -3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 -4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 -5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 - 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 - 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 - 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 -2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 -1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 -3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 - 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 -3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 -2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 - 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 -3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 -1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 -5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 - 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 -5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 -1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 - 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 - 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 -3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 -3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 - 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 -2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 -2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 - 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 - 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 -3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 -1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 -1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 -1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 -2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 - 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 -4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 -1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 -5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 -2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 - 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 - 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 - 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 - 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 -5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 - 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 -1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 - 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 - 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 -5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 -1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 - 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 -3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 -4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 -3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 - 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 - 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 -1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 -4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 -3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 -3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 -2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 -5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 -3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 -5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 -1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 -2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 -1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 - 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 -1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 -4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 -3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 - 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 - 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 - 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 -2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 -5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 -1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 -2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 -1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 -1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 -5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 -5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 -5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 -3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 -4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 -4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 -2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 -5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 -3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 - 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 -5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 -5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 -1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 -2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 -3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 -4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 -5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 -3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 -4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 -1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 -1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 -4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 -1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 - 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 -1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 -1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 -3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 - 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 -5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 -2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 -1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 -1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 -5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 - 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 -4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 - 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 -2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 - 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 -1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 -1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 - 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 -4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 -4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 -1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 -3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 -5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 -5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 -1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 -2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 -1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 -3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 -2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 -3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 -2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 -4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 -4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 -3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 - 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 -3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 - 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 -3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 -4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 -3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 -1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 -5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 - 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 -5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 -1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 - 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 -4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 -4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 - 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 -2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 -2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 -3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 -1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 -4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 -2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 -1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 -1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 -2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 -3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 -1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 -5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 -1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 -4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 -1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 - 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 -1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 -4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 -4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 -2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 -1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 -4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 - 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 -5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 -2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 -3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 -4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 - 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 -5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 -5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 -1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 -4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 -4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 -2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 -3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 -3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 -2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 -1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 -4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 -3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 -3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 -2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 -4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 -5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 -3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 -2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 -3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 -1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 -2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 -3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 -4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 -2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 -2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 -5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 -1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 -2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 -1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 -3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 -4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 -2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 -3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 -3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 -2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 -4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 -2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 -3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 -4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 -5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 -3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 - 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 -1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 -4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 -1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 -4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 -5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 - 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 -5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 -5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 -2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 -3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 -2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 -2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 - 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 -1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 -4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 -3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 -3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 - 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 -2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 - 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 -2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 -4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 -1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 -4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 -1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 -3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 - 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 -3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 -5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 -5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 -3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 -3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 -1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 -2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 -5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 -1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 -1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 -3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 - 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 -1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 -4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 -5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 -2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 -3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 - 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 -1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 -2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 -2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 -5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 -5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 -5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 -2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 -2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 -1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 -4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 -3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 -3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 -4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 -4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 -2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 -2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 -5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 -4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 -5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 -4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 - 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 - 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 -1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 -3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 -4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 -1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 -5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 -2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 -2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 -3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 -5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 -1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 -3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 -5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 -1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 -5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 -2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 -3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 -2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 -3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 -3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 -3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 -4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 - 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 -2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 -4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 -3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 -5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 -1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 -5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 - 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 -1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 - 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 -4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 -1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 -4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 -1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 - 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 -3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 -4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 -5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 - 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 -3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 - 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 -2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 #last 512 -#Everything below is of no interest for detection purpose -2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392 -2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408 -5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424 -5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440 -5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456 -5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472 -5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488 -5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504 -5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520 -5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536 -5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552 -5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568 -5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584 -5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600 -6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616 -6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632 -6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648 -6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664 -6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680 -6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696 -6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712 -6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728 -6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744 -6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760 -6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776 -6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792 -6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808 -6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824 -6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840 -6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856 -6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872 -6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888 -6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904 -6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920 -6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936 -6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952 -6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968 -6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984 -6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000 -6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016 -6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032 -6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048 -6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064 -6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080 -6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096 -6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112 -6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128 -6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144 -6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160 -6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176 -6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192 -6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208 -6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224 -6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240 -6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256 -3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272 -6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288 -6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304 -3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320 -6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336 -6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352 -6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368 -6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384 -6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400 -6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416 -6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432 -4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448 -6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464 -6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480 -3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496 -6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512 -6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528 -6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544 -6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560 -6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576 -6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592 -6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608 -6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624 -6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640 -6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656 -6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672 -7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688 -7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704 -7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720 -7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736 -7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752 -7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768 -7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784 -7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800 -7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816 -7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832 -7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848 -7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864 -7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880 -7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896 -7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912 -7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928 -7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944 -7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960 -7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976 -7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992 -7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008 -7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024 -7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040 -7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056 -7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072 -7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088 -7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104 -7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120 -7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136 -7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152 -7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168 -7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184 -7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200 -7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216 -7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232 -7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248 -7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264 -7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280 -7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296 -7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312 -7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328 -7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344 -7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360 -7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376 -7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392 -7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408 -7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424 -7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440 -3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456 -7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472 -7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488 -7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504 -7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520 -4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536 -7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552 -7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568 -7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584 -7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600 -7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616 -7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632 -7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648 -7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664 -7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680 -7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696 -7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712 -8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728 -8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744 -8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760 -8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776 -8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792 -8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808 -8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824 -8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840 -8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856 -8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872 -8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888 -8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904 -8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920 -8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936 -8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952 -8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968 -8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984 -8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000 -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016 -8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032 -8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048 -8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064 -8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080 -8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096 -8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112 -8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128 -8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144 -8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160 -8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176 -8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192 -8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208 -8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224 -8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240 -8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256 -8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272 -8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288 -8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304 -8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320 -8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336 -8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352 -8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368 -8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384 -8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400 -8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416 -8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432 -8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448 -8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464 -8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480 -8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496 -8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512 -8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528 -8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544 -8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560 -8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576 -8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592 -8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608 -8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624 -8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640 -8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656 -8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672 -8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688 -4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704 -8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720 -8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736 -8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752 -8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768 -9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784 -9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800 -9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816 -9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832 -9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848 -9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864 -9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880 -9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896 -9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912 -9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928 -9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944 -9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960 -9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976 -9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992 -9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008 -9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024 -9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040 -9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056 -9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072 -9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088 -9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104 -9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120 -9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136 -9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152 -9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168 -9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184 -9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200 -9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216 -9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232 -9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248 -9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264 -9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280 -9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296 -9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312 -9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328 -9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344 -9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360 -9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376 -3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392 -9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408 -9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424 -9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440 -4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456 -9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472 -9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488 -9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504 -9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520 -9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536 -9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552 -9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568 -9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584 -9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600 -9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616 -9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632 -9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648 -9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664 -9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680 -9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696 -9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712 -9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728 -9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744 -9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760 -9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776 -9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792 -9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808 -9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824 -10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840 -10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856 -10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872 -10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888 -10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904 -10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920 -10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936 -10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952 -10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968 -4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984 -10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000 -10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016 -10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032 -10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048 -10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064 -10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080 -10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096 -10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112 -4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128 -10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144 -10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160 -10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176 -10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192 -10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208 -10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224 -10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240 -10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256 -10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272 -10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288 -10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304 -10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320 -10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336 -10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352 -10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368 -10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384 -10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400 -4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416 -10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432 -10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448 -10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464 -10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480 -10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496 -10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512 -10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528 -10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544 -10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560 -10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576 -10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592 -10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608 -10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624 -10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640 -10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656 -10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672 -10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688 -10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704 -10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720 -10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736 -10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752 -10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768 -10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784 -10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800 -10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816 -10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832 -10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848 -10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864 -10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880 -10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896 -11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912 -11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928 -11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944 -4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960 -11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976 -11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992 -11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008 -11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024 -11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040 -11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056 -11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072 -11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088 -11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104 -11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120 -11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136 -11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152 -11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168 -11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184 -11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200 -11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216 -11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232 -11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248 -11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264 -11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280 -11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296 -11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312 -11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328 -11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344 -11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360 -11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376 -11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392 -11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408 -11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424 -11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440 -11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456 -11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472 -4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488 -11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504 -11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520 -11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536 -11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552 -11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568 -11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584 -11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600 -11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616 -11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632 -11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648 -11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664 -11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680 -11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696 -11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712 -11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728 -11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744 -11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760 -11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776 -11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792 -11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808 -11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824 -11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840 -11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856 -11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872 -11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888 -11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904 -11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920 -11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936 -12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952 -12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968 -12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984 -12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000 -12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016 -12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032 -12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048 -12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064 -12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080 -12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096 -12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112 -12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128 -12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144 -12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160 -12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176 -4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192 -4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208 -4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224 -12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240 -12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256 -12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272 -12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288 -12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304 -12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320 -12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336 -12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352 -12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368 -12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384 -12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400 -12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416 -12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432 -12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448 -12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464 -12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480 -12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496 -12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512 -12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528 -12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544 -12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560 -12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576 -12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592 -12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608 -12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624 -12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640 -12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656 -12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672 -12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688 -12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704 -12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720 -12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736 -12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752 -12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768 -12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784 -12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800 -12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816 -12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832 -12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848 -12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864 -12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880 -12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896 -12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912 -12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928 -12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944 -12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960 -12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976 -4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992 -13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008 -13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024 -13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040 -13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056 -13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072 -13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088 -13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104 -4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120 -13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136 -13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152 -13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168 -13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184 -13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200 -13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216 -13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232 -13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248 -13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264 -13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280 -13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296 -13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312 -13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328 -13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344 -13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360 -5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376 -13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392 -13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408 -13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424 -13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440 -13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456 -13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472 -13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488 -13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504 -13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520 -13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536 -13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552 -13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568 -13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584 -13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600 -13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616 -13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632 -13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648 -13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664 -13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680 -13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696 -13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712 -13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728 -13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744 -13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760 -13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776 -13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792 -13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808 -13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824 -13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840 -13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856 -13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872 -13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888 -13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904 -13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920 -13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936 -13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952 -13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968 -13968,13969,13970,13971,13972) #13973 - -# flake8: noqa diff --git a/Contents/Libraries/Shared/requests/packages/chardet/big5prober.py b/Contents/Libraries/Shared/requests/packages/chardet/big5prober.py deleted file mode 100644 index becce81e5..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/big5prober.py +++ /dev/null @@ -1,42 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import Big5DistributionAnalysis -from .mbcssm import Big5SMModel - - -class Big5Prober(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(Big5SMModel) - self._mDistributionAnalyzer = Big5DistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "Big5" diff --git a/Contents/Libraries/Shared/requests/packages/chardet/chardetect.py b/Contents/Libraries/Shared/requests/packages/chardet/chardetect.py deleted file mode 100644 index ffe892f25..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/chardetect.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python -""" -Script which takes one or more file paths and reports on their detected -encodings - -Example:: - - % chardetect somefile someotherfile - somefile: windows-1252 with confidence 0.5 - someotherfile: ascii with confidence 1.0 - -If no paths are provided, it takes its input from stdin. - -""" - -from __future__ import absolute_import, print_function, unicode_literals - -import argparse -import sys -from io import open - -from chardet import __version__ -from chardet.universaldetector import UniversalDetector - - -def description_of(lines, name='stdin'): - """ - Return a string describing the probable encoding of a file or - list of strings. - - :param lines: The lines to get the encoding of. - :type lines: Iterable of bytes - :param name: Name of file or collection of lines - :type name: str - """ - u = UniversalDetector() - for line in lines: - u.feed(line) - u.close() - result = u.result - if result['encoding']: - return '{0}: {1} with confidence {2}'.format(name, result['encoding'], - result['confidence']) - else: - return '{0}: no result'.format(name) - - -def main(argv=None): - ''' - Handles command line arguments and gets things started. - - :param argv: List of arguments, as if specified on the command-line. - If None, ``sys.argv[1:]`` is used instead. - :type argv: list of str - ''' - # Get command line arguments - parser = argparse.ArgumentParser( - description="Takes one or more file paths and reports their detected \ - encodings", - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - conflict_handler='resolve') - parser.add_argument('input', - help='File whose encoding we would like to determine.', - type=argparse.FileType('rb'), nargs='*', - default=[sys.stdin]) - parser.add_argument('--version', action='version', - version='%(prog)s {0}'.format(__version__)) - args = parser.parse_args(argv) - - for f in args.input: - if f.isatty(): - print("You are running chardetect interactively. Press " + - "CTRL-D twice at the start of a blank line to signal the " + - "end of your input. If you want help, run chardetect " + - "--help\n", file=sys.stderr) - print(description_of(f, f.name)) - - -if __name__ == '__main__': - main() diff --git a/Contents/Libraries/Shared/requests/packages/chardet/chardistribution.py b/Contents/Libraries/Shared/requests/packages/chardet/chardistribution.py deleted file mode 100644 index 4e64a00be..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/chardistribution.py +++ /dev/null @@ -1,231 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, - EUCTW_TYPICAL_DISTRIBUTION_RATIO) -from .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, - EUCKR_TYPICAL_DISTRIBUTION_RATIO) -from .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE, - GB2312_TYPICAL_DISTRIBUTION_RATIO) -from .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE, - BIG5_TYPICAL_DISTRIBUTION_RATIO) -from .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE, - JIS_TYPICAL_DISTRIBUTION_RATIO) -from .compat import wrap_ord - -ENOUGH_DATA_THRESHOLD = 1024 -SURE_YES = 0.99 -SURE_NO = 0.01 -MINIMUM_DATA_THRESHOLD = 3 - - -class CharDistributionAnalysis: - def __init__(self): - # Mapping table to get frequency order from char order (get from - # GetOrder()) - self._mCharToFreqOrder = None - self._mTableSize = None # Size of above table - # This is a constant value which varies from language to language, - # used in calculating confidence. See - # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html - # for further detail. - self._mTypicalDistributionRatio = None - self.reset() - - def reset(self): - """reset analyser, clear any state""" - # If this flag is set to True, detection is done and conclusion has - # been made - self._mDone = False - self._mTotalChars = 0 # Total characters encountered - # The number of characters whose frequency order is less than 512 - self._mFreqChars = 0 - - def feed(self, aBuf, aCharLen): - """feed a character with known length""" - if aCharLen == 2: - # we only care about 2-bytes character in our distribution analysis - order = self.get_order(aBuf) - else: - order = -1 - if order >= 0: - self._mTotalChars += 1 - # order is valid - if order < self._mTableSize: - if 512 > self._mCharToFreqOrder[order]: - self._mFreqChars += 1 - - def get_confidence(self): - """return confidence based on existing data""" - # if we didn't receive any character in our consideration range, - # return negative answer - if self._mTotalChars <= 0 or self._mFreqChars <= MINIMUM_DATA_THRESHOLD: - return SURE_NO - - if self._mTotalChars != self._mFreqChars: - r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars) - * self._mTypicalDistributionRatio)) - if r < SURE_YES: - return r - - # normalize confidence (we don't want to be 100% sure) - return SURE_YES - - def got_enough_data(self): - # It is not necessary to receive all data to draw conclusion. - # For charset detection, certain amount of data is enough - return self._mTotalChars > ENOUGH_DATA_THRESHOLD - - def get_order(self, aBuf): - # We do not handle characters based on the original encoding string, - # but convert this encoding string to a number, here called order. - # This allows multiple encodings of a language to share one frequency - # table. - return -1 - - -class EUCTWDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = EUCTWCharToFreqOrder - self._mTableSize = EUCTW_TABLE_SIZE - self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-TW encoding, we are interested - # first byte range: 0xc4 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = wrap_ord(aBuf[0]) - if first_char >= 0xC4: - return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1 - else: - return -1 - - -class EUCKRDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = EUCKRCharToFreqOrder - self._mTableSize = EUCKR_TABLE_SIZE - self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-KR encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = wrap_ord(aBuf[0]) - if first_char >= 0xB0: - return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1 - else: - return -1 - - -class GB2312DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = GB2312CharToFreqOrder - self._mTableSize = GB2312_TABLE_SIZE - self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for GB2312 encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if (first_char >= 0xB0) and (second_char >= 0xA1): - return 94 * (first_char - 0xB0) + second_char - 0xA1 - else: - return -1 - - -class Big5DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = Big5CharToFreqOrder - self._mTableSize = BIG5_TABLE_SIZE - self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for big5 encoding, we are interested - # first byte range: 0xa4 -- 0xfe - # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if first_char >= 0xA4: - if second_char >= 0xA1: - return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 - else: - return 157 * (first_char - 0xA4) + second_char - 0x40 - else: - return -1 - - -class SJISDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = JISCharToFreqOrder - self._mTableSize = JIS_TABLE_SIZE - self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for sjis encoding, we are interested - # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe - # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if (first_char >= 0x81) and (first_char <= 0x9F): - order = 188 * (first_char - 0x81) - elif (first_char >= 0xE0) and (first_char <= 0xEF): - order = 188 * (first_char - 0xE0 + 31) - else: - return -1 - order = order + second_char - 0x40 - if second_char > 0x7F: - order = -1 - return order - - -class EUCJPDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = JISCharToFreqOrder - self._mTableSize = JIS_TABLE_SIZE - self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-JP encoding, we are interested - # first byte range: 0xa0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - char = wrap_ord(aBuf[0]) - if char >= 0xA0: - return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1 - else: - return -1 diff --git a/Contents/Libraries/Shared/requests/packages/chardet/charsetgroupprober.py b/Contents/Libraries/Shared/requests/packages/chardet/charsetgroupprober.py deleted file mode 100644 index 85e7a1c67..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/charsetgroupprober.py +++ /dev/null @@ -1,106 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -import sys -from .charsetprober import CharSetProber - - -class CharSetGroupProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mActiveNum = 0 - self._mProbers = [] - self._mBestGuessProber = None - - def reset(self): - CharSetProber.reset(self) - self._mActiveNum = 0 - for prober in self._mProbers: - if prober: - prober.reset() - prober.active = True - self._mActiveNum += 1 - self._mBestGuessProber = None - - def get_charset_name(self): - if not self._mBestGuessProber: - self.get_confidence() - if not self._mBestGuessProber: - return None -# self._mBestGuessProber = self._mProbers[0] - return self._mBestGuessProber.get_charset_name() - - def feed(self, aBuf): - for prober in self._mProbers: - if not prober: - continue - if not prober.active: - continue - st = prober.feed(aBuf) - if not st: - continue - if st == constants.eFoundIt: - self._mBestGuessProber = prober - return self.get_state() - elif st == constants.eNotMe: - prober.active = False - self._mActiveNum -= 1 - if self._mActiveNum <= 0: - self._mState = constants.eNotMe - return self.get_state() - return self.get_state() - - def get_confidence(self): - st = self.get_state() - if st == constants.eFoundIt: - return 0.99 - elif st == constants.eNotMe: - return 0.01 - bestConf = 0.0 - self._mBestGuessProber = None - for prober in self._mProbers: - if not prober: - continue - if not prober.active: - if constants._debug: - sys.stderr.write(prober.get_charset_name() - + ' not active\n') - continue - cf = prober.get_confidence() - if constants._debug: - sys.stderr.write('%s confidence = %s\n' % - (prober.get_charset_name(), cf)) - if bestConf < cf: - bestConf = cf - self._mBestGuessProber = prober - if not self._mBestGuessProber: - return 0.0 - return bestConf -# else: -# self._mBestGuessProber = self._mProbers[0] -# return self._mBestGuessProber.get_confidence() diff --git a/Contents/Libraries/Shared/requests/packages/chardet/charsetprober.py b/Contents/Libraries/Shared/requests/packages/chardet/charsetprober.py deleted file mode 100644 index 97581712c..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/charsetprober.py +++ /dev/null @@ -1,62 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -import re - - -class CharSetProber: - def __init__(self): - pass - - def reset(self): - self._mState = constants.eDetecting - - def get_charset_name(self): - return None - - def feed(self, aBuf): - pass - - def get_state(self): - return self._mState - - def get_confidence(self): - return 0.0 - - def filter_high_bit_only(self, aBuf): - aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf) - return aBuf - - def filter_without_english_letters(self, aBuf): - aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf) - return aBuf - - def filter_with_english_letters(self, aBuf): - # TODO - return aBuf diff --git a/Contents/Libraries/Shared/requests/packages/chardet/codingstatemachine.py b/Contents/Libraries/Shared/requests/packages/chardet/codingstatemachine.py deleted file mode 100644 index 8dd8c9179..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/codingstatemachine.py +++ /dev/null @@ -1,61 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart -from .compat import wrap_ord - - -class CodingStateMachine: - def __init__(self, sm): - self._mModel = sm - self._mCurrentBytePos = 0 - self._mCurrentCharLen = 0 - self.reset() - - def reset(self): - self._mCurrentState = eStart - - def next_state(self, c): - # for each byte we get its class - # if it is first byte, we also get byte length - # PY3K: aBuf is a byte stream, so c is an int, not a byte - byteCls = self._mModel['classTable'][wrap_ord(c)] - if self._mCurrentState == eStart: - self._mCurrentBytePos = 0 - self._mCurrentCharLen = self._mModel['charLenTable'][byteCls] - # from byte's class and stateTable, we get its next state - curr_state = (self._mCurrentState * self._mModel['classFactor'] - + byteCls) - self._mCurrentState = self._mModel['stateTable'][curr_state] - self._mCurrentBytePos += 1 - return self._mCurrentState - - def get_current_charlen(self): - return self._mCurrentCharLen - - def get_coding_state_machine(self): - return self._mModel['name'] diff --git a/Contents/Libraries/Shared/requests/packages/chardet/compat.py b/Contents/Libraries/Shared/requests/packages/chardet/compat.py deleted file mode 100644 index d9e30addf..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/compat.py +++ /dev/null @@ -1,34 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# Contributor(s): -# Ian Cordasco - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys - - -if sys.version_info < (3, 0): - base_str = (str, unicode) -else: - base_str = (bytes, str) - - -def wrap_ord(a): - if sys.version_info < (3, 0) and isinstance(a, base_str): - return ord(a) - else: - return a diff --git a/Contents/Libraries/Shared/requests/packages/chardet/constants.py b/Contents/Libraries/Shared/requests/packages/chardet/constants.py deleted file mode 100644 index e4d148b3c..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/constants.py +++ /dev/null @@ -1,39 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -_debug = 0 - -eDetecting = 0 -eFoundIt = 1 -eNotMe = 2 - -eStart = 0 -eError = 1 -eItsMe = 2 - -SHORTCUT_THRESHOLD = 0.95 diff --git a/Contents/Libraries/Shared/requests/packages/chardet/cp949prober.py b/Contents/Libraries/Shared/requests/packages/chardet/cp949prober.py deleted file mode 100644 index ff4272f82..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/cp949prober.py +++ /dev/null @@ -1,44 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import CP949SMModel - - -class CP949Prober(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(CP949SMModel) - # NOTE: CP949 is a superset of EUC-KR, so the distribution should be - # not different. - self._mDistributionAnalyzer = EUCKRDistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "CP949" diff --git a/Contents/Libraries/Shared/requests/packages/chardet/escprober.py b/Contents/Libraries/Shared/requests/packages/chardet/escprober.py deleted file mode 100644 index 80a844ff3..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/escprober.py +++ /dev/null @@ -1,86 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -from .escsm import (HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel, - ISO2022KRSMModel) -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .compat import wrap_ord - - -class EscCharSetProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mCodingSM = [ - CodingStateMachine(HZSMModel), - CodingStateMachine(ISO2022CNSMModel), - CodingStateMachine(ISO2022JPSMModel), - CodingStateMachine(ISO2022KRSMModel) - ] - self.reset() - - def reset(self): - CharSetProber.reset(self) - for codingSM in self._mCodingSM: - if not codingSM: - continue - codingSM.active = True - codingSM.reset() - self._mActiveSM = len(self._mCodingSM) - self._mDetectedCharset = None - - def get_charset_name(self): - return self._mDetectedCharset - - def get_confidence(self): - if self._mDetectedCharset: - return 0.99 - else: - return 0.00 - - def feed(self, aBuf): - for c in aBuf: - # PY3K: aBuf is a byte array, so c is an int, not a byte - for codingSM in self._mCodingSM: - if not codingSM: - continue - if not codingSM.active: - continue - codingState = codingSM.next_state(wrap_ord(c)) - if codingState == constants.eError: - codingSM.active = False - self._mActiveSM -= 1 - if self._mActiveSM <= 0: - self._mState = constants.eNotMe - return self.get_state() - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - self._mDetectedCharset = codingSM.get_coding_state_machine() # nopep8 - return self.get_state() - - return self.get_state() diff --git a/Contents/Libraries/Shared/requests/packages/chardet/escsm.py b/Contents/Libraries/Shared/requests/packages/chardet/escsm.py deleted file mode 100644 index bd302b4c6..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/escsm.py +++ /dev/null @@ -1,242 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart, eError, eItsMe - -HZ_cls = ( -1,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,0,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,4,0,5,2,0, # 78 - 7f -1,1,1,1,1,1,1,1, # 80 - 87 -1,1,1,1,1,1,1,1, # 88 - 8f -1,1,1,1,1,1,1,1, # 90 - 97 -1,1,1,1,1,1,1,1, # 98 - 9f -1,1,1,1,1,1,1,1, # a0 - a7 -1,1,1,1,1,1,1,1, # a8 - af -1,1,1,1,1,1,1,1, # b0 - b7 -1,1,1,1,1,1,1,1, # b8 - bf -1,1,1,1,1,1,1,1, # c0 - c7 -1,1,1,1,1,1,1,1, # c8 - cf -1,1,1,1,1,1,1,1, # d0 - d7 -1,1,1,1,1,1,1,1, # d8 - df -1,1,1,1,1,1,1,1, # e0 - e7 -1,1,1,1,1,1,1,1, # e8 - ef -1,1,1,1,1,1,1,1, # f0 - f7 -1,1,1,1,1,1,1,1, # f8 - ff -) - -HZ_st = ( -eStart,eError, 3,eStart,eStart,eStart,eError,eError,# 00-07 -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f -eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError,# 10-17 - 5,eError, 6,eError, 5, 5, 4,eError,# 18-1f - 4,eError, 4, 4, 4,eError, 4,eError,# 20-27 - 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f -) - -HZCharLenTable = (0, 0, 0, 0, 0, 0) - -HZSMModel = {'classTable': HZ_cls, - 'classFactor': 6, - 'stateTable': HZ_st, - 'charLenTable': HZCharLenTable, - 'name': "HZ-GB-2312"} - -ISO2022CN_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,3,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,4,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022CN_st = ( -eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 -eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f -eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 -eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError,# 18-1f -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 - 5, 6,eError,eError,eError,eError,eError,eError,# 28-2f -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 -eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f -) - -ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022CNSMModel = {'classTable': ISO2022CN_cls, - 'classFactor': 9, - 'stateTable': ISO2022CN_st, - 'charLenTable': ISO2022CNCharLenTable, - 'name': "ISO-2022-CN"} - -ISO2022JP_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,2,2, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,7,0,0,0, # 20 - 27 -3,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -6,0,4,0,8,0,0,0, # 40 - 47 -0,9,5,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022JP_st = ( -eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 -eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 -eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f -eError, 5,eError,eError,eError, 4,eError,eError,# 20-27 -eError,eError,eError, 6,eItsMe,eError,eItsMe,eError,# 28-2f -eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f -eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 -) - -ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022JPSMModel = {'classTable': ISO2022JP_cls, - 'classFactor': 10, - 'stateTable': ISO2022JP_st, - 'charLenTable': ISO2022JPCharLenTable, - 'name': "ISO-2022-JP"} - -ISO2022KR_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,3,0,0,0, # 20 - 27 -0,4,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,5,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022KR_st = ( -eStart, 3,eError,eStart,eStart,eStart,eError,eError,# 00-07 -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f -eItsMe,eItsMe,eError,eError,eError, 4,eError,eError,# 10-17 -eError,eError,eError,eError, 5,eError,eError,eError,# 18-1f -eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 -) - -ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0) - -ISO2022KRSMModel = {'classTable': ISO2022KR_cls, - 'classFactor': 6, - 'stateTable': ISO2022KR_st, - 'charLenTable': ISO2022KRCharLenTable, - 'name': "ISO-2022-KR"} - -# flake8: noqa diff --git a/Contents/Libraries/Shared/requests/packages/chardet/eucjpprober.py b/Contents/Libraries/Shared/requests/packages/chardet/eucjpprober.py deleted file mode 100644 index 8e64fdcc2..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/eucjpprober.py +++ /dev/null @@ -1,90 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCJPDistributionAnalysis -from .jpcntx import EUCJPContextAnalysis -from .mbcssm import EUCJPSMModel - - -class EUCJPProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCJPSMModel) - self._mDistributionAnalyzer = EUCJPDistributionAnalysis() - self._mContextAnalyzer = EUCJPContextAnalysis() - self.reset() - - def reset(self): - MultiByteCharSetProber.reset(self) - self._mContextAnalyzer.reset() - - def get_charset_name(self): - return "EUC-JP" - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mContextAnalyzer.feed(self._mLastChar, charLen) - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen) - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mContextAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - contxtCf = self._mContextAnalyzer.get_confidence() - distribCf = self._mDistributionAnalyzer.get_confidence() - return max(contxtCf, distribCf) diff --git a/Contents/Libraries/Shared/requests/packages/chardet/euckrfreq.py b/Contents/Libraries/Shared/requests/packages/chardet/euckrfreq.py deleted file mode 100644 index a179e4c21..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/euckrfreq.py +++ /dev/null @@ -1,596 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology - -# 128 --> 0.79 -# 256 --> 0.92 -# 512 --> 0.986 -# 1024 --> 0.99944 -# 2048 --> 0.99999 -# -# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 -# Random Distribution Ration = 512 / (2350-512) = 0.279. -# -# Typical Distribution Ratio - -EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 - -EUCKR_TABLE_SIZE = 2352 - -# Char to FreqOrder table , -EUCKRCharToFreqOrder = ( \ - 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, -1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, -1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, - 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, - 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, - 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, -1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, - 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, - 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, -1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, -1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, -1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, -1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, -1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, - 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, -1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, -1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, -1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, -1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, - 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, -1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, - 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, - 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, -1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, - 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, -1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, - 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, - 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, -1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, -1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, -1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, -1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, - 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, -1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, - 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, - 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, -1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, -1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, -1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, -1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, -1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, -1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, - 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, - 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, - 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, -1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, - 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, -1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, - 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, - 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, -2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, - 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, - 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, -2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, -2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, -2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, - 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, - 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, -2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, - 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, -1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, -2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, -1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, -2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, -2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, -1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, - 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, -2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, -2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, - 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, - 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, -2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, -1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, -2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, -2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, -2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, -2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, -2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, -2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, -1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, -2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, -2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, -2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, -2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, -2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, -1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, -1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, -2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, -1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, -2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, -1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, - 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, -2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, - 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, -2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, - 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, -2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, -2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, - 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, -2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, -1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, - 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, -1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, -2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, -1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, -2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, - 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, -2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, -1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, -2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, -1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, -2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, -1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, - 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, -2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, -2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, - 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, - 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, -1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, -1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, - 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, -2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, -2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, - 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, - 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, - 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, -2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, - 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, - 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, -2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, -2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, - 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, -2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, -1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, - 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, -2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, -2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, -2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, - 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, - 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, - 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, -2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, -2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, -2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, -1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, -2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, - 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 -#Everything below is of no interest for detection purpose -2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, -2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, -2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, -2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, -2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, -2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, -2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, -2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, -2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, -2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, -2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, -2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, -2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, -2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, -1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, -2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, -2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, -2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, -2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, -2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, -2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, -2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, -2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, -2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, -3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, -3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, -3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, -3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, -3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, -3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, -3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, -3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, -3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, -3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, -3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, -3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, -3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, -3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, -3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, -3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, -3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, -3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, -3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, -3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, -3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, -3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, -3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, -3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, -3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, -3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, -3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, -3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, -3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, -3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, -3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, -3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, -1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, -1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, -3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, -3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, -3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, -3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, -3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, -3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, -3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, -3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, -3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, -3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, -3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, -3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, -3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, -1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, -3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, -3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, -3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, -3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, -3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, -3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, -3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, -1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, -3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, -3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, -3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, -3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, -1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, -3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, -3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, -3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, -3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, -3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, -3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, -3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, -4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, -4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, -1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, -4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, -4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, -4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, -4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, -4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, -4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, -4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, -4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, -4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, -4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, -4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, -4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, -4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, -4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, -4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, -4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, -4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, -4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, -4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, -4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, -4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, -4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, -4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, -4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, -4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, -4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, -4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, -4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, -4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, -4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, -4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, -4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, -4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, -4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, -4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, -4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, -4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, -4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, -4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, -4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, -4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, -4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, -1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, -4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, -4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, -4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, -4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, -4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, -4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, -4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, -4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, -4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, -4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, -4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, -4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, -4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, -4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, -4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, -4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, -4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, -4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, -4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, -4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, -5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, -5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, -1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, -5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, -5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, -5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, -5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, -5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, -1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, -5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, -5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, -5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, -5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, -5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, -1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, -5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, -5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, -5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, -5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, -5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, -5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, -5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, -5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, -5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, -5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, -5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, -5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, -5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, -5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, -5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, -5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, -5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, -5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, -5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, -5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, -5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, -5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, -5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, -1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, -5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, -5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, -5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, -5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, -1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, -5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, -5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, -5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, -5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, -5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, -1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, -5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, -1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, -5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, -5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, -5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, -5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, -5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, -5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, -5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, -5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, -5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, -5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, -5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, -5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, -5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, -5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, -6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, -6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, -6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, -6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, -6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, -6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, -6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, -6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, -6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, -6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, -6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, -6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, -6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, -6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, -6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, -6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, -6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, #1024 -6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, -6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, -6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, -6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, -6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, -6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, -6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, -6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, -6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, -6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, -6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, -6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, -6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, -6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, -6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, -6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, -6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, -6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, -1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, -6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, -6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, -6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, -6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, -6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, -1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, -6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, -1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, -6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, -6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, -6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, -1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, -6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, -6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, -6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, -6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, -6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, -6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, -6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, -6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, -6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, -6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, -6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, -6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, -6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, -6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, -6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, -6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, -6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, -7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, -7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, -7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, -7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, -7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, -7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, -7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, -7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, -7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, -7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, -7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, -7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, -7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, -7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, -7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, -7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, -7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, -7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, -7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, -7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, -7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, -7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, -7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, -7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, -7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, -7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, -7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, -7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, -7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, -7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, -7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, -7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, -7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, -7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, -7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, -7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, -7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, -7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, -7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, -7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, -7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, -7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, -7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, -7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, -7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, -7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, -7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, -7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, -7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, -7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, -7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, -7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, -7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, -7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, -7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, -7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, -7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, -7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, -7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, -7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, -7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, -7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, -8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, -8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, -8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, -8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, -8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, -8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, -8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, -8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, -8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, -8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, -8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, -8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, -8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, -8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, -8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, -8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, -8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, -8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, -8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, -8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, -8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, -8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, -8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, -8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, -8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, -8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, -8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, -8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, -8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, -8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, -8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, -8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, -8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, -8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, -8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, -8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, -8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, -8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, -8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, -8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, -8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, -8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, -8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, -8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, -8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, -8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, -8736,8737,8738,8739,8740,8741) - -# flake8: noqa diff --git a/Contents/Libraries/Shared/requests/packages/chardet/euckrprober.py b/Contents/Libraries/Shared/requests/packages/chardet/euckrprober.py deleted file mode 100644 index 5982a46b6..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/euckrprober.py +++ /dev/null @@ -1,42 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import EUCKRSMModel - - -class EUCKRProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCKRSMModel) - self._mDistributionAnalyzer = EUCKRDistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "EUC-KR" diff --git a/Contents/Libraries/Shared/requests/packages/chardet/euctwfreq.py b/Contents/Libraries/Shared/requests/packages/chardet/euctwfreq.py deleted file mode 100644 index 576e7504d..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/euctwfreq.py +++ /dev/null @@ -1,428 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# EUCTW frequency table -# Converted from big5 work -# by Taiwan's Mandarin Promotion Council -# - -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -# Char to FreqOrder table , -EUCTW_TABLE_SIZE = 8102 - -EUCTWCharToFreqOrder = ( - 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 -3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 -1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 - 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 -3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 -4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 -7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 - 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 - 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 - 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 -2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 -1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 -3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 - 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 -3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 -2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 - 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 -3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 -1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 -7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 - 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 -7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 -1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 - 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 - 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 -3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 -3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 - 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 -2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 -2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 - 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 - 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 -3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 -1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 -1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 -1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 -2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 - 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 -4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 -1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 -7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 -2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 - 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 - 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 - 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 - 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 -7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 - 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 -1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 - 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 - 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 -7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 -1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 - 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 -3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 -4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 -3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 - 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 - 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 -1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 -4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 -3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 -3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 -2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 -7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 -3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 -7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 -1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 -2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 -1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 - 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 -1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 -4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 -3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 - 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 - 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 - 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 -2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 -7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 -1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 -2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 -1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 -1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 -7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 -7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 -7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 -3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 -4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 -1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 -7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 -2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 -7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 -3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 -3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 -7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 -2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 -7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 - 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 -4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 -2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 -7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 -3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 -2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 -2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 - 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 -2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 -1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 -1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 -2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 -1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 -7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 -7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 -2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 -4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 -1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 -7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 - 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 -4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 - 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 -2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 - 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 -1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 -1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 - 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 -3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 -3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 -1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 -3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 -7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 -7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 -1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 -2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 -1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 -3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 -2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 -3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 -2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 -4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 -4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 -3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 - 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 -3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 - 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 -3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 -3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 -3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 -1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 -7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 - 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 -7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 -1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 - 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 -4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 -3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 - 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 -2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 -2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 -3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 -1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 -4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 -2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 -1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 -1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 -2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 -3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 -1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 -7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 -1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 -4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 -1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 - 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 -1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 -3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 -3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 -2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 -1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 -4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 - 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 -7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 -2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 -3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 -4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 - 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 -7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 -7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 -1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 -4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 -3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 -2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 -3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 -3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 -2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 -1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 -4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 -3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 -3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 -2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 -4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 -7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 -3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 -2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 -3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 -1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 -2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 -3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 -4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 -2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 -2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 -7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 -1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 -2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 -1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 -3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 -4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 -2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 -3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 -3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 -2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 -4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 -2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 -3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 -4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 -7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 -3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 - 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 -1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 -4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 -1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 -4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 -7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 - 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 -7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 -2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 -1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 -1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 -3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 - 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 - 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 - 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 -3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 -2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 - 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 -7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 -1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 -3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 -7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 -1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 -7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 -4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 -1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 -2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 -2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 -4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 - 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 - 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 -3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 -3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 -1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 -2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 -7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 -1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 -1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 -3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 - 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 -1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 -4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 -7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 -2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 -3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 - 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 -1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 -2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 -2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 -7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 -7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 -7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 -2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 -2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 -1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 -4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 -3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 -3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 -4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 -4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 -2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 -2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 -7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 -4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 -7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 -2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 -1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 -3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 -4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 -2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 - 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 -2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 -1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 -2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 -2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 -4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 -7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 -1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 -3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 -7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 -1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 -8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 -2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 -8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 -2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 -2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 -8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 -8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 -8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 - 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 -8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 -4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 -3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 -8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 -1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 -8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 - 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 -1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 - 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 -4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 -1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 -4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 -1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 - 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 -3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 -4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 -8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 - 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 -3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 - 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 -2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 -#Everything below is of no interest for detection purpose -2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118 -2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134 -8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150 -8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166 -8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182 -8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198 -8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214 -8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230 -8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246 -8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262 -8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278 -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294 -8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310 -8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326 -8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342 -8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358 -8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374 -8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390 -8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406 -8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422 -8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438 -8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454 -8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470 -8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486 -8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502 -8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518 -8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534 -8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550 -8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566 -8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582 -8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598 -8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614 -8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630 -8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646 -8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662 -8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678 -8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694 -8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710 -8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726 -8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742 - -# flake8: noqa diff --git a/Contents/Libraries/Shared/requests/packages/chardet/euctwprober.py b/Contents/Libraries/Shared/requests/packages/chardet/euctwprober.py deleted file mode 100644 index fe652fe37..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/euctwprober.py +++ /dev/null @@ -1,41 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCTWDistributionAnalysis -from .mbcssm import EUCTWSMModel - -class EUCTWProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCTWSMModel) - self._mDistributionAnalyzer = EUCTWDistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "EUC-TW" diff --git a/Contents/Libraries/Shared/requests/packages/chardet/gb2312freq.py b/Contents/Libraries/Shared/requests/packages/chardet/gb2312freq.py deleted file mode 100644 index 1238f510f..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/gb2312freq.py +++ /dev/null @@ -1,472 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# GB2312 most frequently used character table -# -# Char to FreqOrder table , from hz6763 - -# 512 --> 0.79 -- 0.79 -# 1024 --> 0.92 -- 0.13 -# 2048 --> 0.98 -- 0.06 -# 6768 --> 1.00 -- 0.02 -# -# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 -# Random Distribution Ration = 512 / (3755 - 512) = 0.157 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR - -GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 - -GB2312_TABLE_SIZE = 3760 - -GB2312CharToFreqOrder = ( -1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, -2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, -2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, - 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, -1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, -1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, - 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, -1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, -2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, -3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, - 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, -1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, - 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, -2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, - 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, -2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, -1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, -3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, - 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, -1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, - 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, -2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, -1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, -3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, -1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, -2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, -1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, - 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, -3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, -3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, - 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, -3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, - 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, -1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, -3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, -2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, -1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, - 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, -1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, -4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, - 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, -3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, -3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, - 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, -1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, -2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, -1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, -1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, - 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, -3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, -3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, -4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, - 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, -3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, -1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, -1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, -4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, - 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, - 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, -3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, -1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, - 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, -1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, -2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, - 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, - 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, - 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, -3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, -4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, -3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, - 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, -2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, -2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, -2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, - 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, -2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, - 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, - 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, - 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, -3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, -2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, -2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, -1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, - 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, -2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, - 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, - 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, -1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, -1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, - 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, - 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, -1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, -2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, -3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, -2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, -2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, -2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, -3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, -1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, -1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, -2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, -1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, -3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, -1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, -1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, -3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, - 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, -2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, -1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, -4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, -1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, -1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, -3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, -1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, - 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, - 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, -1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, - 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, -1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, -1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, - 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, -3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, -4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, -3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, -2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, -2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, -1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, -3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, -2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, -1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, -1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, - 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, -2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, -2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, -3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, -4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, -3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, - 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, -3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, -2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, -1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, - 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, - 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, -3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, -4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, -2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, -1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, -1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, - 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, -1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, -3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, - 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, - 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, -1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, - 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, -1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, - 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, -2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, - 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, -2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, -2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, -1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, -1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, -2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, - 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, -1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, -1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, -2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, -2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, -3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, -1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, -4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, - 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, - 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, -3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, -1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, - 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, -3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, -1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, -4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, -1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, -2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, -1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, - 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, -1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, -3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, - 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, -2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, - 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, -1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, -1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, -1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, -3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, -2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, -3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, -3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, -3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, - 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, -2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, - 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, -2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, - 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, -1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, - 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, - 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, -1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, -3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, -3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, -1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, -1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, -3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, -2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, -2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, -1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, -3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, - 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, -4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, -1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, -2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, -3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, -3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, -1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, - 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, - 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, -2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, - 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, -1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, - 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, -1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, -1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, -1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, -1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, -1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, - 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, - 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, # last 512 -#Everything below is of no interest for detection purpose -5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, -5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, -5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, -3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, -4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, -5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, -5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, -4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, -4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, -4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, -4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, -3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, -6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, -4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, -6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, -4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, -4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, -4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, -5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, -3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, -4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, -3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, -4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, -4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, -6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, -6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, -5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, -4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, -6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, -4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, -5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, -5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, -5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, -6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, -3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, -6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, -4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, -5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, -6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, -6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, -4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, -5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, -4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, -5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, -5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, -4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, -4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, -5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, -4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, -4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, -5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, -4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, -4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, -4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, -5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, -5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, -4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, -3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, -4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, -6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, -5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, -5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, -4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, -6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, -5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, -6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, -4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, -5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, -5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, -3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, -5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, -6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, -4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, -6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, -4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, -4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, -6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, -3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, -6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, -4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, -3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, -3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, -3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, -4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, -2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, -5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, -4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, -5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, -5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, -5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, -4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, -5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, -4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, -5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, -1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, -3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, -4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, -4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, -6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, -4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, -5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, -3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, -5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, -5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, -5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, -3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, -5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, -5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, -3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, -5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, -5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, -5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, -6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, -4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, -6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, -4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, -3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, -4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, -5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, -5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, -5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, -3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, -3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, -6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, -6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, -5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, -6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, -6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, -6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, -6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, -6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, -5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, -6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, -6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, -3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, -3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, -4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, -4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, -3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, -5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, -5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, -5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, -5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, -5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, -4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, -5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, -6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, -5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, -4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, -4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, -6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, -3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, -4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, -4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, -5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, -6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, -6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, -4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, -6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, -5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, -5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, -5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, -5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, -5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, -4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, -5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, -5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, -5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, -5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, -6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, -4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, -5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, -4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, -4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, -6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, -4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, -6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, -3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, -5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, -6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, -6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, -6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, -5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, -6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, -6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, -3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, -5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, -4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767) - -# flake8: noqa diff --git a/Contents/Libraries/Shared/requests/packages/chardet/gb2312prober.py b/Contents/Libraries/Shared/requests/packages/chardet/gb2312prober.py deleted file mode 100644 index 0325a2d86..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/gb2312prober.py +++ /dev/null @@ -1,41 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import GB2312DistributionAnalysis -from .mbcssm import GB2312SMModel - -class GB2312Prober(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(GB2312SMModel) - self._mDistributionAnalyzer = GB2312DistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "GB2312" diff --git a/Contents/Libraries/Shared/requests/packages/chardet/hebrewprober.py b/Contents/Libraries/Shared/requests/packages/chardet/hebrewprober.py deleted file mode 100644 index ba225c5ef..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/hebrewprober.py +++ /dev/null @@ -1,283 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Shy Shalom -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .constants import eNotMe, eDetecting -from .compat import wrap_ord - -# This prober doesn't actually recognize a language or a charset. -# It is a helper prober for the use of the Hebrew model probers - -### General ideas of the Hebrew charset recognition ### -# -# Four main charsets exist in Hebrew: -# "ISO-8859-8" - Visual Hebrew -# "windows-1255" - Logical Hebrew -# "ISO-8859-8-I" - Logical Hebrew -# "x-mac-hebrew" - ?? Logical Hebrew ?? -# -# Both "ISO" charsets use a completely identical set of code points, whereas -# "windows-1255" and "x-mac-hebrew" are two different proper supersets of -# these code points. windows-1255 defines additional characters in the range -# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific -# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. -# x-mac-hebrew defines similar additional code points but with a different -# mapping. -# -# As far as an average Hebrew text with no diacritics is concerned, all four -# charsets are identical with respect to code points. Meaning that for the -# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters -# (including final letters). -# -# The dominant difference between these charsets is their directionality. -# "Visual" directionality means that the text is ordered as if the renderer is -# not aware of a BIDI rendering algorithm. The renderer sees the text and -# draws it from left to right. The text itself when ordered naturally is read -# backwards. A buffer of Visual Hebrew generally looks like so: -# "[last word of first line spelled backwards] [whole line ordered backwards -# and spelled backwards] [first word of first line spelled backwards] -# [end of line] [last word of second line] ... etc' " -# adding punctuation marks, numbers and English text to visual text is -# naturally also "visual" and from left to right. -# -# "Logical" directionality means the text is ordered "naturally" according to -# the order it is read. It is the responsibility of the renderer to display -# the text from right to left. A BIDI algorithm is used to place general -# punctuation marks, numbers and English text in the text. -# -# Texts in x-mac-hebrew are almost impossible to find on the Internet. From -# what little evidence I could find, it seems that its general directionality -# is Logical. -# -# To sum up all of the above, the Hebrew probing mechanism knows about two -# charsets: -# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are -# backwards while line order is natural. For charset recognition purposes -# the line order is unimportant (In fact, for this implementation, even -# word order is unimportant). -# Logical Hebrew - "windows-1255" - normal, naturally ordered text. -# -# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be -# specifically identified. -# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew -# that contain special punctuation marks or diacritics is displayed with -# some unconverted characters showing as question marks. This problem might -# be corrected using another model prober for x-mac-hebrew. Due to the fact -# that x-mac-hebrew texts are so rare, writing another model prober isn't -# worth the effort and performance hit. -# -#### The Prober #### -# -# The prober is divided between two SBCharSetProbers and a HebrewProber, -# all of which are managed, created, fed data, inquired and deleted by the -# SBCSGroupProber. The two SBCharSetProbers identify that the text is in -# fact some kind of Hebrew, Logical or Visual. The final decision about which -# one is it is made by the HebrewProber by combining final-letter scores -# with the scores of the two SBCharSetProbers to produce a final answer. -# -# The SBCSGroupProber is responsible for stripping the original text of HTML -# tags, English characters, numbers, low-ASCII punctuation characters, spaces -# and new lines. It reduces any sequence of such characters to a single space. -# The buffer fed to each prober in the SBCS group prober is pure text in -# high-ASCII. -# The two SBCharSetProbers (model probers) share the same language model: -# Win1255Model. -# The first SBCharSetProber uses the model normally as any other -# SBCharSetProber does, to recognize windows-1255, upon which this model was -# built. The second SBCharSetProber is told to make the pair-of-letter -# lookup in the language model backwards. This in practice exactly simulates -# a visual Hebrew model using the windows-1255 logical Hebrew model. -# -# The HebrewProber is not using any language model. All it does is look for -# final-letter evidence suggesting the text is either logical Hebrew or visual -# Hebrew. Disjointed from the model probers, the results of the HebrewProber -# alone are meaningless. HebrewProber always returns 0.00 as confidence -# since it never identifies a charset by itself. Instead, the pointer to the -# HebrewProber is passed to the model probers as a helper "Name Prober". -# When the Group prober receives a positive identification from any prober, -# it asks for the name of the charset identified. If the prober queried is a -# Hebrew model prober, the model prober forwards the call to the -# HebrewProber to make the final decision. In the HebrewProber, the -# decision is made according to the final-letters scores maintained and Both -# model probers scores. The answer is returned in the form of the name of the -# charset identified, either "windows-1255" or "ISO-8859-8". - -# windows-1255 / ISO-8859-8 code points of interest -FINAL_KAF = 0xea -NORMAL_KAF = 0xeb -FINAL_MEM = 0xed -NORMAL_MEM = 0xee -FINAL_NUN = 0xef -NORMAL_NUN = 0xf0 -FINAL_PE = 0xf3 -NORMAL_PE = 0xf4 -FINAL_TSADI = 0xf5 -NORMAL_TSADI = 0xf6 - -# Minimum Visual vs Logical final letter score difference. -# If the difference is below this, don't rely solely on the final letter score -# distance. -MIN_FINAL_CHAR_DISTANCE = 5 - -# Minimum Visual vs Logical model score difference. -# If the difference is below this, don't rely at all on the model score -# distance. -MIN_MODEL_DISTANCE = 0.01 - -VISUAL_HEBREW_NAME = "ISO-8859-8" -LOGICAL_HEBREW_NAME = "windows-1255" - - -class HebrewProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mLogicalProber = None - self._mVisualProber = None - self.reset() - - def reset(self): - self._mFinalCharLogicalScore = 0 - self._mFinalCharVisualScore = 0 - # The two last characters seen in the previous buffer, - # mPrev and mBeforePrev are initialized to space in order to simulate - # a word delimiter at the beginning of the data - self._mPrev = ' ' - self._mBeforePrev = ' ' - # These probers are owned by the group prober. - - def set_model_probers(self, logicalProber, visualProber): - self._mLogicalProber = logicalProber - self._mVisualProber = visualProber - - def is_final(self, c): - return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, - FINAL_TSADI] - - def is_non_final(self, c): - # The normal Tsadi is not a good Non-Final letter due to words like - # 'lechotet' (to chat) containing an apostrophe after the tsadi. This - # apostrophe is converted to a space in FilterWithoutEnglishLetters - # causing the Non-Final tsadi to appear at an end of a word even - # though this is not the case in the original text. - # The letters Pe and Kaf rarely display a related behavior of not being - # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' - # for example legally end with a Non-Final Pe or Kaf. However, the - # benefit of these letters as Non-Final letters outweighs the damage - # since these words are quite rare. - return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE] - - def feed(self, aBuf): - # Final letter analysis for logical-visual decision. - # Look for evidence that the received buffer is either logical Hebrew - # or visual Hebrew. - # The following cases are checked: - # 1) A word longer than 1 letter, ending with a final letter. This is - # an indication that the text is laid out "naturally" since the - # final letter really appears at the end. +1 for logical score. - # 2) A word longer than 1 letter, ending with a Non-Final letter. In - # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, - # should not end with the Non-Final form of that letter. Exceptions - # to this rule are mentioned above in isNonFinal(). This is an - # indication that the text is laid out backwards. +1 for visual - # score - # 3) A word longer than 1 letter, starting with a final letter. Final - # letters should not appear at the beginning of a word. This is an - # indication that the text is laid out backwards. +1 for visual - # score. - # - # The visual score and logical score are accumulated throughout the - # text and are finally checked against each other in GetCharSetName(). - # No checking for final letters in the middle of words is done since - # that case is not an indication for either Logical or Visual text. - # - # We automatically filter out all 7-bit characters (replace them with - # spaces) so the word boundary detection works properly. [MAP] - - if self.get_state() == eNotMe: - # Both model probers say it's not them. No reason to continue. - return eNotMe - - aBuf = self.filter_high_bit_only(aBuf) - - for cur in aBuf: - if cur == ' ': - # We stand on a space - a word just ended - if self._mBeforePrev != ' ': - # next-to-last char was not a space so self._mPrev is not a - # 1 letter word - if self.is_final(self._mPrev): - # case (1) [-2:not space][-1:final letter][cur:space] - self._mFinalCharLogicalScore += 1 - elif self.is_non_final(self._mPrev): - # case (2) [-2:not space][-1:Non-Final letter][ - # cur:space] - self._mFinalCharVisualScore += 1 - else: - # Not standing on a space - if ((self._mBeforePrev == ' ') and - (self.is_final(self._mPrev)) and (cur != ' ')): - # case (3) [-2:space][-1:final letter][cur:not space] - self._mFinalCharVisualScore += 1 - self._mBeforePrev = self._mPrev - self._mPrev = cur - - # Forever detecting, till the end or until both model probers return - # eNotMe (handled above) - return eDetecting - - def get_charset_name(self): - # Make the decision: is it Logical or Visual? - # If the final letter score distance is dominant enough, rely on it. - finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore - if finalsub >= MIN_FINAL_CHAR_DISTANCE: - return LOGICAL_HEBREW_NAME - if finalsub <= -MIN_FINAL_CHAR_DISTANCE: - return VISUAL_HEBREW_NAME - - # It's not dominant enough, try to rely on the model scores instead. - modelsub = (self._mLogicalProber.get_confidence() - - self._mVisualProber.get_confidence()) - if modelsub > MIN_MODEL_DISTANCE: - return LOGICAL_HEBREW_NAME - if modelsub < -MIN_MODEL_DISTANCE: - return VISUAL_HEBREW_NAME - - # Still no good, back to final letter distance, maybe it'll save the - # day. - if finalsub < 0.0: - return VISUAL_HEBREW_NAME - - # (finalsub > 0 - Logical) or (don't know what to do) default to - # Logical. - return LOGICAL_HEBREW_NAME - - def get_state(self): - # Remain active as long as any of the model probers are active. - if (self._mLogicalProber.get_state() == eNotMe) and \ - (self._mVisualProber.get_state() == eNotMe): - return eNotMe - return eDetecting diff --git a/Contents/Libraries/Shared/requests/packages/chardet/jisfreq.py b/Contents/Libraries/Shared/requests/packages/chardet/jisfreq.py deleted file mode 100644 index 064345b08..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/jisfreq.py +++ /dev/null @@ -1,569 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology -# -# Japanese frequency table, applied to both S-JIS and EUC-JP -# They are sorted in order. - -# 128 --> 0.77094 -# 256 --> 0.85710 -# 512 --> 0.92635 -# 1024 --> 0.97130 -# 2048 --> 0.99431 -# -# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 -# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 -# -# Typical Distribution Ratio, 25% of IDR - -JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 - -# Char to FreqOrder table , -JIS_TABLE_SIZE = 4368 - -JISCharToFreqOrder = ( - 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 -3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 -1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 -2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 -2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 -5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 -1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 -5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 -5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 -5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 -5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 -5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 -5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 -1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 -1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 -1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 -2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 -3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 -3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 - 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 - 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 -1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 - 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 -5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 - 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 - 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 - 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 - 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 - 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 -5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 -5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 -5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 -4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 -5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 -5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 -5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 -5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 -5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 -5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 -5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 -5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 -5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 -3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 -5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 -5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 -5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 -5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 -5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 -5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 -5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 -5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 -5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 -5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 -5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 -5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 -5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 -5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 -5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 -5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 -5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 -5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 -5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 -5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 -5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 -5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 -5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 -5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 -5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 -5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 -5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 -5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 -5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 -5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 -5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 -5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 -5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 -5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 -5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 -5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 -6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 -6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 -6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 -6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 -6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 -6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 -6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 -6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 -4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 - 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 - 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 -1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 -1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 - 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 -3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 -3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 - 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 -3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 -3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 - 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 -2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 - 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 -3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 -1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 - 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 -1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 - 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 -2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 -2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 -2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 -2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 -1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 -1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 -1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 -1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 -2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 -1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 -2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 -1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 -1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 -1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 -1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 -1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 -1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 - 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 - 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 -1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 -2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 -2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 -2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 -3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 -3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 - 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 -3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 -1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 - 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 -2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 -1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 - 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 -3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 -4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 -2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 -1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 -2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 -1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 - 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 - 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 -1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 -2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 -2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 -2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 -3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 -1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 -2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 - 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 - 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 - 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 -1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 -2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 - 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 -1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 -1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 - 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 -1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 -1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 -1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 - 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 -2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 - 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 -2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 -3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 -2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 -1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 -6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 -1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 -2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 -1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 - 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 - 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 -3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 -3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 -1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 -1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 -1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 -1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 - 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 - 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 -2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 - 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 -3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 -2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 - 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 -1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 -2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 - 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 -1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 - 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 -4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 -2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 -1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 - 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 -1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 -2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 - 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 -6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 -1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 -1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 -2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 -3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 - 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 -3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 -1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 - 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 -1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 - 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 -3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 - 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 -2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 - 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 -4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 -2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 -1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 -1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 -1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 - 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 -1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 -3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 -1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 -3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 - 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 - 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 - 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 -2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 -1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 - 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 -1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 - 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 -1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 - 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 - 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 - 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 -1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 -1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 -2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 -4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 - 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 -1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 - 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 -1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 -3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 -1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 -2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 -2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 -1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 -1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 -2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 - 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 -2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 -1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 -1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 -1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 -1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 -3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 -2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 -2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 - 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 -3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 -3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 -1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 -2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 -1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 -2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 -#Everything below is of no interest for detection purpose -2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384 -6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400 -6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416 -6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432 -6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448 -4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464 -4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480 -3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496 -3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512 -4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528 -3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544 -6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560 -4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576 -6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592 -6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608 -6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624 -6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640 -6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656 -6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672 -3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688 -3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704 -6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720 -2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736 -4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752 -4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768 -4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784 -6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800 -3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816 -4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832 -4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848 -6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864 -4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880 -6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896 -3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912 -2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928 -4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944 -2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960 -6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976 -4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992 -6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008 -6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024 -6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040 -4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056 -6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072 -2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088 -6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104 -4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120 -6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136 -4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152 -4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168 -6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184 -6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200 -6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216 -3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232 -1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248 -3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264 -3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280 -4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296 -6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312 -3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328 -6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344 -3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360 -3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376 -2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392 -6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408 -6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424 -3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440 -6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456 -3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472 -6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488 -6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504 -6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520 -4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536 -6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552 -4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568 -3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584 -3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600 -6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616 -6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632 -4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648 -6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664 -6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680 -6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696 -6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712 -6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728 -6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744 -4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760 -4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776 -3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792 -6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808 -4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824 -2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840 -6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856 -6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872 -4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888 -2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904 -4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920 -2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936 -4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952 -4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968 -4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984 -6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000 -3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016 -6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032 -3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048 -6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064 -2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080 -3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096 -7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112 -2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128 -3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144 -3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160 -3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176 -3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192 -7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208 -7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224 -7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240 -7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256 -7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272 -4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288 -3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304 -3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320 -4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336 -3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352 -3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368 -7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384 -4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400 -7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416 -7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432 -7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448 -7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464 -7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480 -4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496 -4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512 -7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528 -3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544 -4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560 -7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576 -7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592 -4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608 -3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624 -3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640 -7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656 -4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672 -4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688 -4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704 -4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720 -4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736 -4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752 -7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768 -7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784 -7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800 -7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816 -7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832 -2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848 -3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864 -7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880 -7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896 -3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912 -4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928 -3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944 -3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960 -2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976 -7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992 -7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008 -4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024 -3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040 -3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056 -7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072 -7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088 -7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104 -4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120 -7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136 -2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152 -3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168 -4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184 -7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200 -4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216 -4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232 -7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248 -7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264 -5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280 -7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296 -7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312 -7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328 -7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344 -7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360 -5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376 -5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392 -7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408 -3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424 -7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440 -7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456 -3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472 -7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488 -7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504 -1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520 -3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536 -4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552 -2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568 -3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584 -2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600 -5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616 -4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632 -4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648 -5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664 -7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680 -7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696 -7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712 -7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728 -3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744 -7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760 -3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776 -7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792 -4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808 -7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824 -7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840 -7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856 -7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872 -7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888 -7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904 -7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920 -7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936 -7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952 -7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968 -7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984 -7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000 -8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016 -8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032 -8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048 -8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064 -8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080 -8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096 -8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112 -8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128 -8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144 -8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160 -8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176 -8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192 -8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208 -8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224 -8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240 -8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256 -8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272 - -# flake8: noqa diff --git a/Contents/Libraries/Shared/requests/packages/chardet/jpcntx.py b/Contents/Libraries/Shared/requests/packages/chardet/jpcntx.py deleted file mode 100644 index 59aeb6a87..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/jpcntx.py +++ /dev/null @@ -1,227 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .compat import wrap_ord - -NUM_OF_CATEGORY = 6 -DONT_KNOW = -1 -ENOUGH_REL_THRESHOLD = 100 -MAX_REL_THRESHOLD = 1000 -MINIMUM_DATA_THRESHOLD = 4 - -# This is hiragana 2-char sequence table, the number in each cell represents its frequency category -jp2CharContext = ( -(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), -(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), -(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), -(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), -(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), -(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), -(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), -(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), -(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), -(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), -(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), -(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), -(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), -(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), -(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), -(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), -(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), -(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), -(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), -(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), -(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), -(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), -(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), -(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), -(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), -(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), -(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), -(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), -(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), -(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), -(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), -(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), -(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), -(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), -(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), -(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), -(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), -(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), -(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), -(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), -(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), -(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), -(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), -(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), -(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), -(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), -(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), -(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), -(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), -(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), -(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), -(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), -(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), -(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), -(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), -(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), -(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), -(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), -(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), -(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), -(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), -(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), -(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), -(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), -(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), -(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), -(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), -(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), -(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), -(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), -(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), -(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), -(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), -(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), -) - -class JapaneseContextAnalysis: - def __init__(self): - self.reset() - - def reset(self): - self._mTotalRel = 0 # total sequence received - # category counters, each interger counts sequence in its category - self._mRelSample = [0] * NUM_OF_CATEGORY - # if last byte in current buffer is not the last byte of a character, - # we need to know how many bytes to skip in next buffer - self._mNeedToSkipCharNum = 0 - self._mLastCharOrder = -1 # The order of previous char - # If this flag is set to True, detection is done and conclusion has - # been made - self._mDone = False - - def feed(self, aBuf, aLen): - if self._mDone: - return - - # The buffer we got is byte oriented, and a character may span in more than one - # buffers. In case the last one or two byte in last buffer is not - # complete, we record how many byte needed to complete that character - # and skip these bytes here. We can choose to record those bytes as - # well and analyse the character once it is complete, but since a - # character will not make much difference, by simply skipping - # this character will simply our logic and improve performance. - i = self._mNeedToSkipCharNum - while i < aLen: - order, charLen = self.get_order(aBuf[i:i + 2]) - i += charLen - if i > aLen: - self._mNeedToSkipCharNum = i - aLen - self._mLastCharOrder = -1 - else: - if (order != -1) and (self._mLastCharOrder != -1): - self._mTotalRel += 1 - if self._mTotalRel > MAX_REL_THRESHOLD: - self._mDone = True - break - self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1 - self._mLastCharOrder = order - - def got_enough_data(self): - return self._mTotalRel > ENOUGH_REL_THRESHOLD - - def get_confidence(self): - # This is just one way to calculate confidence. It works well for me. - if self._mTotalRel > MINIMUM_DATA_THRESHOLD: - return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel - else: - return DONT_KNOW - - def get_order(self, aBuf): - return -1, 1 - -class SJISContextAnalysis(JapaneseContextAnalysis): - def __init__(self): - self.charset_name = "SHIFT_JIS" - - def get_charset_name(self): - return self.charset_name - - def get_order(self, aBuf): - if not aBuf: - return -1, 1 - # find out current char's byte length - first_char = wrap_ord(aBuf[0]) - if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)): - charLen = 2 - if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): - self.charset_name = "CP932" - else: - charLen = 1 - - # return its order if it is hiragana - if len(aBuf) > 1: - second_char = wrap_ord(aBuf[1]) - if (first_char == 202) and (0x9F <= second_char <= 0xF1): - return second_char - 0x9F, charLen - - return -1, charLen - -class EUCJPContextAnalysis(JapaneseContextAnalysis): - def get_order(self, aBuf): - if not aBuf: - return -1, 1 - # find out current char's byte length - first_char = wrap_ord(aBuf[0]) - if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): - charLen = 2 - elif first_char == 0x8F: - charLen = 3 - else: - charLen = 1 - - # return its order if it is hiragana - if len(aBuf) > 1: - second_char = wrap_ord(aBuf[1]) - if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): - return second_char - 0xA1, charLen - - return -1, charLen - -# flake8: noqa diff --git a/Contents/Libraries/Shared/requests/packages/chardet/langbulgarianmodel.py b/Contents/Libraries/Shared/requests/packages/chardet/langbulgarianmodel.py deleted file mode 100644 index e5788fc64..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/langbulgarianmodel.py +++ /dev/null @@ -1,229 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -# this table is modified base on win1251BulgarianCharToOrderMap, so -# only number <64 is sure valid - -Latin5_BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 -210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 - 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 - 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 -) - -win1251BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 -221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 - 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 - 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 96.9392% -# first 1024 sequences:3.0618% -# rest sequences: 0.2992% -# negative sequences: 0.0020% -BulgarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, -3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, -0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, -0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, -0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, -0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, -0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, -2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, -3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, -1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, -3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, -1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, -2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, -2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, -3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, -1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, -2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, -2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, -1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, -2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, -2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, -2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, -1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, -2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, -1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, -3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, -1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, -3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, -1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, -2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, -1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, -2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, -1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, -2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, -1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, -2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, -1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, -0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, -1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, -1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, -1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, -0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, -1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, -1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -) - -Latin5BulgarianModel = { - 'charToOrderMap': Latin5_BulgarianCharToOrderMap, - 'precedenceMatrix': BulgarianLangModel, - 'mTypicalPositiveRatio': 0.969392, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-5" -} - -Win1251BulgarianModel = { - 'charToOrderMap': win1251BulgarianCharToOrderMap, - 'precedenceMatrix': BulgarianLangModel, - 'mTypicalPositiveRatio': 0.969392, - 'keepEnglishLetter': False, - 'charsetName': "windows-1251" -} - - -# flake8: noqa diff --git a/Contents/Libraries/Shared/requests/packages/chardet/langcyrillicmodel.py b/Contents/Libraries/Shared/requests/packages/chardet/langcyrillicmodel.py deleted file mode 100644 index a86f54bd5..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/langcyrillicmodel.py +++ /dev/null @@ -1,329 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# KOI8-R language model -# Character Mapping Table: -KOI8R_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 -223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 -238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 - 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 - 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 - 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 - 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 -) - -win1251_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -) - -latin5_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -macCyrillic_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, -) - -IBM855_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, -206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, - 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, -220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, -230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, - 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, - 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, -250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, -) - -IBM866_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 97.6601% -# first 1024 sequences: 2.3389% -# rest sequences: 0.1237% -# negative sequences: 0.0009% -RussianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, -1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, -1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, -2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, -1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, -3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, -1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, -2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, -1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, -1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, -1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, -1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, -3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, -1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, -2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, -1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, -2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, -1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, -1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, -1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, -3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, -3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, -1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, -1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, -0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, -1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, -1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, -0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, -1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, -2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, -1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, -1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, -2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, -1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, -1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, -1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, -0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, -0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, -0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, -2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, -0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -) - -Koi8rModel = { - 'charToOrderMap': KOI8R_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "KOI8-R" -} - -Win1251CyrillicModel = { - 'charToOrderMap': win1251_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "windows-1251" -} - -Latin5CyrillicModel = { - 'charToOrderMap': latin5_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-5" -} - -MacCyrillicModel = { - 'charToOrderMap': macCyrillic_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "MacCyrillic" -}; - -Ibm866Model = { - 'charToOrderMap': IBM866_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "IBM866" -} - -Ibm855Model = { - 'charToOrderMap': IBM855_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "IBM855" -} - -# flake8: noqa diff --git a/Contents/Libraries/Shared/requests/packages/chardet/langgreekmodel.py b/Contents/Libraries/Shared/requests/packages/chardet/langgreekmodel.py deleted file mode 100644 index ddb583765..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/langgreekmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin7_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -win1253_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.2851% -# first 1024 sequences:1.7001% -# rest sequences: 0.0359% -# negative sequences: 0.0148% -GreekLangModel = ( -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, -2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, -2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, -2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, -0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, -3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, -2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, -0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, -0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, -0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, -0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, -0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, -0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, -0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, -0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, -0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, -0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, -0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, -0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, -0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, -0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, -0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, -0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, -0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -Latin7GreekModel = { - 'charToOrderMap': Latin7_CharToOrderMap, - 'precedenceMatrix': GreekLangModel, - 'mTypicalPositiveRatio': 0.982851, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-7" -} - -Win1253GreekModel = { - 'charToOrderMap': win1253_CharToOrderMap, - 'precedenceMatrix': GreekLangModel, - 'mTypicalPositiveRatio': 0.982851, - 'keepEnglishLetter': False, - 'charsetName': "windows-1253" -} - -# flake8: noqa diff --git a/Contents/Libraries/Shared/requests/packages/chardet/langhebrewmodel.py b/Contents/Libraries/Shared/requests/packages/chardet/langhebrewmodel.py deleted file mode 100644 index 75f2bc7fe..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/langhebrewmodel.py +++ /dev/null @@ -1,201 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Simon Montagu -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Shoshannah Forbes - original C code (?) -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Windows-1255 language model -# Character Mapping Table: -win1255_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 - 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 -253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 - 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 -124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, -215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, - 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, -106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, - 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, -238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, - 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, - 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.4004% -# first 1024 sequences: 1.5981% -# rest sequences: 0.087% -# negative sequences: 0.0015% -HebrewLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, -3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, -1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, -1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, -1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, -1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, -0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, -0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, -0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, -0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, -0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, -0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, -0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, -0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, -0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, -0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, -0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, -0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, -0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, -1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, -1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, -2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, -0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, -0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, -) - -Win1255HebrewModel = { - 'charToOrderMap': win1255_CharToOrderMap, - 'precedenceMatrix': HebrewLangModel, - 'mTypicalPositiveRatio': 0.984004, - 'keepEnglishLetter': False, - 'charsetName': "windows-1255" -} - -# flake8: noqa diff --git a/Contents/Libraries/Shared/requests/packages/chardet/langhungarianmodel.py b/Contents/Libraries/Shared/requests/packages/chardet/langhungarianmodel.py deleted file mode 100644 index 49d2f0fe7..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/langhungarianmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin2_HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, -175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, - 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, - 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, -245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -win1250HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, -177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, - 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, - 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, -245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 94.7368% -# first 1024 sequences:5.2623% -# rest sequences: 0.8894% -# negative sequences: 0.0009% -HungarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, -3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, -0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, -1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, -1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, -3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, -2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, -2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, -2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, -2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, -1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, -1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, -3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, -1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, -1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, -2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, -2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, -2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, -3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, -1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, -1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, -1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, -2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, -1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, -2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, -2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, -1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, -1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, -0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, -2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, -2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, -1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, -1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, -2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, -2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, -2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, -1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, -0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -) - -Latin2HungarianModel = { - 'charToOrderMap': Latin2_HungarianCharToOrderMap, - 'precedenceMatrix': HungarianLangModel, - 'mTypicalPositiveRatio': 0.947368, - 'keepEnglishLetter': True, - 'charsetName': "ISO-8859-2" -} - -Win1250HungarianModel = { - 'charToOrderMap': win1250HungarianCharToOrderMap, - 'precedenceMatrix': HungarianLangModel, - 'mTypicalPositiveRatio': 0.947368, - 'keepEnglishLetter': True, - 'charsetName': "windows-1250" -} - -# flake8: noqa diff --git a/Contents/Libraries/Shared/requests/packages/chardet/langthaimodel.py b/Contents/Libraries/Shared/requests/packages/chardet/langthaimodel.py deleted file mode 100644 index 0508b1b1a..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/langthaimodel.py +++ /dev/null @@ -1,200 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# The following result for thai was collected from a limited sample (1M). - -# Character Mapping Table: -TIS620CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 -188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 -253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 - 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 -209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, -223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, -236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, - 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, - 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, - 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, - 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, - 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 92.6386% -# first 1024 sequences:7.3177% -# rest sequences: 1.0230% -# negative sequences: 0.0436% -ThaiLangModel = ( -0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, -0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, -3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, -0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, -3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, -3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, -3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, -3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, -2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, -3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, -1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, -3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, -1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, -0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, -0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, -2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, -0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, -3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, -2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, -2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, -3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, -3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, -3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, -3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, -1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, -0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, -0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, -3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, -3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, -1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, -3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, -3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, -0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, -0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, -1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, -1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, -3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, -0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, -3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, -0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, -0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, -0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, -0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, -0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, -0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, -0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, -0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, -0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, -3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, -2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, -0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, -3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, -1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, -1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -TIS620ThaiModel = { - 'charToOrderMap': TIS620CharToOrderMap, - 'precedenceMatrix': ThaiLangModel, - 'mTypicalPositiveRatio': 0.926386, - 'keepEnglishLetter': False, - 'charsetName': "TIS-620" -} - -# flake8: noqa diff --git a/Contents/Libraries/Shared/requests/packages/chardet/latin1prober.py b/Contents/Libraries/Shared/requests/packages/chardet/latin1prober.py deleted file mode 100644 index eef357354..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/latin1prober.py +++ /dev/null @@ -1,139 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .constants import eNotMe -from .compat import wrap_ord - -FREQ_CAT_NUM = 4 - -UDF = 0 # undefined -OTH = 1 # other -ASC = 2 # ascii capital letter -ASS = 3 # ascii small letter -ACV = 4 # accent capital vowel -ACO = 5 # accent capital other -ASV = 6 # accent small vowel -ASO = 7 # accent small other -CLASS_NUM = 8 # total classes - -Latin1_CharToClass = ( - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F - OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 - ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F - OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 - ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F - OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 - OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F - UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 - OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF - ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 - ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF - ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 - ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF - ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 - ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF - ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 - ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF -) - -# 0 : illegal -# 1 : very unlikely -# 2 : normal -# 3 : very likely -Latin1ClassModel = ( - # UDF OTH ASC ASS ACV ACO ASV ASO - 0, 0, 0, 0, 0, 0, 0, 0, # UDF - 0, 3, 3, 3, 3, 3, 3, 3, # OTH - 0, 3, 3, 3, 3, 3, 3, 3, # ASC - 0, 3, 3, 3, 1, 1, 3, 3, # ASS - 0, 3, 3, 3, 1, 2, 1, 2, # ACV - 0, 3, 3, 3, 3, 3, 3, 3, # ACO - 0, 3, 1, 3, 1, 1, 1, 3, # ASV - 0, 3, 1, 3, 1, 1, 3, 3, # ASO -) - - -class Latin1Prober(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self.reset() - - def reset(self): - self._mLastCharClass = OTH - self._mFreqCounter = [0] * FREQ_CAT_NUM - CharSetProber.reset(self) - - def get_charset_name(self): - return "windows-1252" - - def feed(self, aBuf): - aBuf = self.filter_with_english_letters(aBuf) - for c in aBuf: - charClass = Latin1_CharToClass[wrap_ord(c)] - freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) - + charClass] - if freq == 0: - self._mState = eNotMe - break - self._mFreqCounter[freq] += 1 - self._mLastCharClass = charClass - - return self.get_state() - - def get_confidence(self): - if self.get_state() == eNotMe: - return 0.01 - - total = sum(self._mFreqCounter) - if total < 0.01: - confidence = 0.0 - else: - confidence = ((self._mFreqCounter[3] - self._mFreqCounter[1] * 20.0) - / total) - if confidence < 0.0: - confidence = 0.0 - # lower the confidence of latin1 so that other more accurate - # detector can take priority. - confidence = confidence * 0.73 - return confidence diff --git a/Contents/Libraries/Shared/requests/packages/chardet/mbcharsetprober.py b/Contents/Libraries/Shared/requests/packages/chardet/mbcharsetprober.py deleted file mode 100644 index bb42f2fb5..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/mbcharsetprober.py +++ /dev/null @@ -1,86 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .charsetprober import CharSetProber - - -class MultiByteCharSetProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mDistributionAnalyzer = None - self._mCodingSM = None - self._mLastChar = [0, 0] - - def reset(self): - CharSetProber.reset(self) - if self._mCodingSM: - self._mCodingSM.reset() - if self._mDistributionAnalyzer: - self._mDistributionAnalyzer.reset() - self._mLastChar = [0, 0] - - def get_charset_name(self): - pass - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mDistributionAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - return self._mDistributionAnalyzer.get_confidence() diff --git a/Contents/Libraries/Shared/requests/packages/chardet/mbcsgroupprober.py b/Contents/Libraries/Shared/requests/packages/chardet/mbcsgroupprober.py deleted file mode 100644 index 03c9dcf3e..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/mbcsgroupprober.py +++ /dev/null @@ -1,54 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .utf8prober import UTF8Prober -from .sjisprober import SJISProber -from .eucjpprober import EUCJPProber -from .gb2312prober import GB2312Prober -from .euckrprober import EUCKRProber -from .cp949prober import CP949Prober -from .big5prober import Big5Prober -from .euctwprober import EUCTWProber - - -class MBCSGroupProber(CharSetGroupProber): - def __init__(self): - CharSetGroupProber.__init__(self) - self._mProbers = [ - UTF8Prober(), - SJISProber(), - EUCJPProber(), - GB2312Prober(), - EUCKRProber(), - CP949Prober(), - Big5Prober(), - EUCTWProber() - ] - self.reset() diff --git a/Contents/Libraries/Shared/requests/packages/chardet/mbcssm.py b/Contents/Libraries/Shared/requests/packages/chardet/mbcssm.py deleted file mode 100644 index efe678ca0..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/mbcssm.py +++ /dev/null @@ -1,572 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart, eError, eItsMe - -# BIG5 - -BIG5_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 4,4,4,4,4,4,4,4, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 4,3,3,3,3,3,3,3, # a0 - a7 - 3,3,3,3,3,3,3,3, # a8 - af - 3,3,3,3,3,3,3,3, # b0 - b7 - 3,3,3,3,3,3,3,3, # b8 - bf - 3,3,3,3,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -BIG5_st = ( - eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 - eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f - eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart#10-17 -) - -Big5CharLenTable = (0, 1, 1, 2, 0) - -Big5SMModel = {'classTable': BIG5_cls, - 'classFactor': 5, - 'stateTable': BIG5_st, - 'charLenTable': Big5CharLenTable, - 'name': 'Big5'} - -# CP949 - -CP949_cls = ( - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f - 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f - 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f - 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f - 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f - 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f - 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f - 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f - 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af - 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf - 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff -) - -CP949_st = ( -#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = - eError,eStart, 3,eError,eStart,eStart, 4, 5,eError, 6, # eStart - eError,eError,eError,eError,eError,eError,eError,eError,eError,eError, # eError - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe, # eItsMe - eError,eError,eStart,eStart,eError,eError,eError,eStart,eStart,eStart, # 3 - eError,eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 4 - eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 5 - eError,eStart,eStart,eStart,eStart,eError,eError,eStart,eStart,eStart, # 6 -) - -CP949CharLenTable = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) - -CP949SMModel = {'classTable': CP949_cls, - 'classFactor': 10, - 'stateTable': CP949_st, - 'charLenTable': CP949CharLenTable, - 'name': 'CP949'} - -# EUC-JP - -EUCJP_cls = ( - 4,4,4,4,4,4,4,4, # 00 - 07 - 4,4,4,4,4,4,5,5, # 08 - 0f - 4,4,4,4,4,4,4,4, # 10 - 17 - 4,4,4,5,4,4,4,4, # 18 - 1f - 4,4,4,4,4,4,4,4, # 20 - 27 - 4,4,4,4,4,4,4,4, # 28 - 2f - 4,4,4,4,4,4,4,4, # 30 - 37 - 4,4,4,4,4,4,4,4, # 38 - 3f - 4,4,4,4,4,4,4,4, # 40 - 47 - 4,4,4,4,4,4,4,4, # 48 - 4f - 4,4,4,4,4,4,4,4, # 50 - 57 - 4,4,4,4,4,4,4,4, # 58 - 5f - 4,4,4,4,4,4,4,4, # 60 - 67 - 4,4,4,4,4,4,4,4, # 68 - 6f - 4,4,4,4,4,4,4,4, # 70 - 77 - 4,4,4,4,4,4,4,4, # 78 - 7f - 5,5,5,5,5,5,5,5, # 80 - 87 - 5,5,5,5,5,5,1,3, # 88 - 8f - 5,5,5,5,5,5,5,5, # 90 - 97 - 5,5,5,5,5,5,5,5, # 98 - 9f - 5,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,0,5 # f8 - ff -) - -EUCJP_st = ( - 3, 4, 3, 5,eStart,eError,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17 - eError,eError,eStart,eError,eError,eError, 3,eError,#18-1f - 3,eError,eError,eError,eStart,eStart,eStart,eStart#20-27 -) - -EUCJPCharLenTable = (2, 2, 2, 3, 1, 0) - -EUCJPSMModel = {'classTable': EUCJP_cls, - 'classFactor': 6, - 'stateTable': EUCJP_st, - 'charLenTable': EUCJPCharLenTable, - 'name': 'EUC-JP'} - -# EUC-KR - -EUCKR_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,3,3,3, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,3,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 2,2,2,2,2,2,2,2, # e0 - e7 - 2,2,2,2,2,2,2,2, # e8 - ef - 2,2,2,2,2,2,2,2, # f0 - f7 - 2,2,2,2,2,2,2,0 # f8 - ff -) - -EUCKR_st = ( - eError,eStart, 3,eError,eError,eError,eError,eError,#00-07 - eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart #08-0f -) - -EUCKRCharLenTable = (0, 1, 2, 0) - -EUCKRSMModel = {'classTable': EUCKR_cls, - 'classFactor': 4, - 'stateTable': EUCKR_st, - 'charLenTable': EUCKRCharLenTable, - 'name': 'EUC-KR'} - -# EUC-TW - -EUCTW_cls = ( - 2,2,2,2,2,2,2,2, # 00 - 07 - 2,2,2,2,2,2,0,0, # 08 - 0f - 2,2,2,2,2,2,2,2, # 10 - 17 - 2,2,2,0,2,2,2,2, # 18 - 1f - 2,2,2,2,2,2,2,2, # 20 - 27 - 2,2,2,2,2,2,2,2, # 28 - 2f - 2,2,2,2,2,2,2,2, # 30 - 37 - 2,2,2,2,2,2,2,2, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,2, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,6,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,3,4,4,4,4,4,4, # a0 - a7 - 5,5,1,1,1,1,1,1, # a8 - af - 1,1,1,1,1,1,1,1, # b0 - b7 - 1,1,1,1,1,1,1,1, # b8 - bf - 1,1,3,1,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -EUCTW_st = ( - eError,eError,eStart, 3, 3, 3, 4,eError,#00-07 - eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17 - eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f - 5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27 - eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f -) - -EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3) - -EUCTWSMModel = {'classTable': EUCTW_cls, - 'classFactor': 7, - 'stateTable': EUCTW_st, - 'charLenTable': EUCTWCharLenTable, - 'name': 'x-euc-tw'} - -# GB2312 - -GB2312_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 3,3,3,3,3,3,3,3, # 30 - 37 - 3,3,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,4, # 78 - 7f - 5,6,6,6,6,6,6,6, # 80 - 87 - 6,6,6,6,6,6,6,6, # 88 - 8f - 6,6,6,6,6,6,6,6, # 90 - 97 - 6,6,6,6,6,6,6,6, # 98 - 9f - 6,6,6,6,6,6,6,6, # a0 - a7 - 6,6,6,6,6,6,6,6, # a8 - af - 6,6,6,6,6,6,6,6, # b0 - b7 - 6,6,6,6,6,6,6,6, # b8 - bf - 6,6,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 6,6,6,6,6,6,6,6, # e0 - e7 - 6,6,6,6,6,6,6,6, # e8 - ef - 6,6,6,6,6,6,6,6, # f0 - f7 - 6,6,6,6,6,6,6,0 # f8 - ff -) - -GB2312_st = ( - eError,eStart,eStart,eStart,eStart,eStart, 3,eError,#00-07 - eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17 - 4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f - eError,eError, 5,eError,eError,eError,eItsMe,eError,#20-27 - eError,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f -) - -# To be accurate, the length of class 6 can be either 2 or 4. -# But it is not necessary to discriminate between the two since -# it is used for frequency analysis only, and we are validing -# each code range there as well. So it is safe to set it to be -# 2 here. -GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2) - -GB2312SMModel = {'classTable': GB2312_cls, - 'classFactor': 7, - 'stateTable': GB2312_st, - 'charLenTable': GB2312CharLenTable, - 'name': 'GB2312'} - -# Shift_JIS - -SJIS_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 3,3,3,3,3,2,2,3, # 80 - 87 - 3,3,3,3,3,3,3,3, # 88 - 8f - 3,3,3,3,3,3,3,3, # 90 - 97 - 3,3,3,3,3,3,3,3, # 98 - 9f - #0xa0 is illegal in sjis encoding, but some pages does - #contain such byte. We need to be more error forgiven. - 2,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,4,4,4, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,0,0,0) # f8 - ff - - -SJIS_st = ( - eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart #10-17 -) - -SJISCharLenTable = (0, 1, 1, 2, 0, 0) - -SJISSMModel = {'classTable': SJIS_cls, - 'classFactor': 6, - 'stateTable': SJIS_st, - 'charLenTable': SJISCharLenTable, - 'name': 'Shift_JIS'} - -# UCS2-BE - -UCS2BE_cls = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2BE_st = ( - 5, 7, 7,eError, 4, 3,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe, 6, 6, 6, 6,eError,eError,#10-17 - 6, 6, 6, 6, 6,eItsMe, 6, 6,#18-1f - 6, 6, 6, 6, 5, 7, 7,eError,#20-27 - 5, 8, 6, 6,eError, 6, 6, 6,#28-2f - 6, 6, 6, 6,eError,eError,eStart,eStart #30-37 -) - -UCS2BECharLenTable = (2, 2, 2, 0, 2, 2) - -UCS2BESMModel = {'classTable': UCS2BE_cls, - 'classFactor': 6, - 'stateTable': UCS2BE_st, - 'charLenTable': UCS2BECharLenTable, - 'name': 'UTF-16BE'} - -# UCS2-LE - -UCS2LE_cls = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2LE_st = ( - 6, 6, 7, 6, 4, 3,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe, 5, 5, 5,eError,eItsMe,eError,#10-17 - 5, 5, 5,eError, 5,eError, 6, 6,#18-1f - 7, 6, 8, 8, 5, 5, 5,eError,#20-27 - 5, 5, 5,eError,eError,eError, 5, 5,#28-2f - 5, 5, 5,eError, 5,eError,eStart,eStart #30-37 -) - -UCS2LECharLenTable = (2, 2, 2, 2, 2, 2) - -UCS2LESMModel = {'classTable': UCS2LE_cls, - 'classFactor': 6, - 'stateTable': UCS2LE_st, - 'charLenTable': UCS2LECharLenTable, - 'name': 'UTF-16LE'} - -# UTF-8 - -UTF8_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 2,2,2,2,3,3,3,3, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 5,5,5,5,5,5,5,5, # a0 - a7 - 5,5,5,5,5,5,5,5, # a8 - af - 5,5,5,5,5,5,5,5, # b0 - b7 - 5,5,5,5,5,5,5,5, # b8 - bf - 0,0,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 7,8,8,8,8,8,8,8, # e0 - e7 - 8,8,8,8,8,9,8,8, # e8 - ef - 10,11,11,11,11,11,11,11, # f0 - f7 - 12,13,13,13,14,15,0,0 # f8 - ff -) - -UTF8_st = ( - eError,eStart,eError,eError,eError,eError, 12, 10,#00-07 - 9, 11, 8, 7, 6, 5, 4, 3,#08-0f - eError,eError,eError,eError,eError,eError,eError,eError,#10-17 - eError,eError,eError,eError,eError,eError,eError,eError,#18-1f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27 - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f - eError,eError, 5, 5, 5, 5,eError,eError,#30-37 - eError,eError,eError,eError,eError,eError,eError,eError,#38-3f - eError,eError,eError, 5, 5, 5,eError,eError,#40-47 - eError,eError,eError,eError,eError,eError,eError,eError,#48-4f - eError,eError, 7, 7, 7, 7,eError,eError,#50-57 - eError,eError,eError,eError,eError,eError,eError,eError,#58-5f - eError,eError,eError,eError, 7, 7,eError,eError,#60-67 - eError,eError,eError,eError,eError,eError,eError,eError,#68-6f - eError,eError, 9, 9, 9, 9,eError,eError,#70-77 - eError,eError,eError,eError,eError,eError,eError,eError,#78-7f - eError,eError,eError,eError,eError, 9,eError,eError,#80-87 - eError,eError,eError,eError,eError,eError,eError,eError,#88-8f - eError,eError, 12, 12, 12, 12,eError,eError,#90-97 - eError,eError,eError,eError,eError,eError,eError,eError,#98-9f - eError,eError,eError,eError,eError, 12,eError,eError,#a0-a7 - eError,eError,eError,eError,eError,eError,eError,eError,#a8-af - eError,eError, 12, 12, 12,eError,eError,eError,#b0-b7 - eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf - eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7 - eError,eError,eError,eError,eError,eError,eError,eError #c8-cf -) - -UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) - -UTF8SMModel = {'classTable': UTF8_cls, - 'classFactor': 16, - 'stateTable': UTF8_st, - 'charLenTable': UTF8CharLenTable, - 'name': 'UTF-8'} diff --git a/Contents/Libraries/Shared/requests/packages/chardet/sbcharsetprober.py b/Contents/Libraries/Shared/requests/packages/chardet/sbcharsetprober.py deleted file mode 100644 index 37291bd27..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/sbcharsetprober.py +++ /dev/null @@ -1,120 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .charsetprober import CharSetProber -from .compat import wrap_ord - -SAMPLE_SIZE = 64 -SB_ENOUGH_REL_THRESHOLD = 1024 -POSITIVE_SHORTCUT_THRESHOLD = 0.95 -NEGATIVE_SHORTCUT_THRESHOLD = 0.05 -SYMBOL_CAT_ORDER = 250 -NUMBER_OF_SEQ_CAT = 4 -POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1 -#NEGATIVE_CAT = 0 - - -class SingleByteCharSetProber(CharSetProber): - def __init__(self, model, reversed=False, nameProber=None): - CharSetProber.__init__(self) - self._mModel = model - # TRUE if we need to reverse every pair in the model lookup - self._mReversed = reversed - # Optional auxiliary prober for name decision - self._mNameProber = nameProber - self.reset() - - def reset(self): - CharSetProber.reset(self) - # char order of last character - self._mLastOrder = 255 - self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT - self._mTotalSeqs = 0 - self._mTotalChar = 0 - # characters that fall in our sampling range - self._mFreqChar = 0 - - def get_charset_name(self): - if self._mNameProber: - return self._mNameProber.get_charset_name() - else: - return self._mModel['charsetName'] - - def feed(self, aBuf): - if not self._mModel['keepEnglishLetter']: - aBuf = self.filter_without_english_letters(aBuf) - aLen = len(aBuf) - if not aLen: - return self.get_state() - for c in aBuf: - order = self._mModel['charToOrderMap'][wrap_ord(c)] - if order < SYMBOL_CAT_ORDER: - self._mTotalChar += 1 - if order < SAMPLE_SIZE: - self._mFreqChar += 1 - if self._mLastOrder < SAMPLE_SIZE: - self._mTotalSeqs += 1 - if not self._mReversed: - i = (self._mLastOrder * SAMPLE_SIZE) + order - model = self._mModel['precedenceMatrix'][i] - else: # reverse the order of the letters in the lookup - i = (order * SAMPLE_SIZE) + self._mLastOrder - model = self._mModel['precedenceMatrix'][i] - self._mSeqCounters[model] += 1 - self._mLastOrder = order - - if self.get_state() == constants.eDetecting: - if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD: - cf = self.get_confidence() - if cf > POSITIVE_SHORTCUT_THRESHOLD: - if constants._debug: - sys.stderr.write('%s confidence = %s, we have a' - 'winner\n' % - (self._mModel['charsetName'], cf)) - self._mState = constants.eFoundIt - elif cf < NEGATIVE_SHORTCUT_THRESHOLD: - if constants._debug: - sys.stderr.write('%s confidence = %s, below negative' - 'shortcut threshhold %s\n' % - (self._mModel['charsetName'], cf, - NEGATIVE_SHORTCUT_THRESHOLD)) - self._mState = constants.eNotMe - - return self.get_state() - - def get_confidence(self): - r = 0.01 - if self._mTotalSeqs > 0: - r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs - / self._mModel['mTypicalPositiveRatio']) - r = r * self._mFreqChar / self._mTotalChar - if r >= 1.0: - r = 0.99 - return r diff --git a/Contents/Libraries/Shared/requests/packages/chardet/sbcsgroupprober.py b/Contents/Libraries/Shared/requests/packages/chardet/sbcsgroupprober.py deleted file mode 100644 index 1b6196cd1..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/sbcsgroupprober.py +++ /dev/null @@ -1,69 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .sbcharsetprober import SingleByteCharSetProber -from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, - Latin5CyrillicModel, MacCyrillicModel, - Ibm866Model, Ibm855Model) -from .langgreekmodel import Latin7GreekModel, Win1253GreekModel -from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel -from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel -from .langthaimodel import TIS620ThaiModel -from .langhebrewmodel import Win1255HebrewModel -from .hebrewprober import HebrewProber - - -class SBCSGroupProber(CharSetGroupProber): - def __init__(self): - CharSetGroupProber.__init__(self) - self._mProbers = [ - SingleByteCharSetProber(Win1251CyrillicModel), - SingleByteCharSetProber(Koi8rModel), - SingleByteCharSetProber(Latin5CyrillicModel), - SingleByteCharSetProber(MacCyrillicModel), - SingleByteCharSetProber(Ibm866Model), - SingleByteCharSetProber(Ibm855Model), - SingleByteCharSetProber(Latin7GreekModel), - SingleByteCharSetProber(Win1253GreekModel), - SingleByteCharSetProber(Latin5BulgarianModel), - SingleByteCharSetProber(Win1251BulgarianModel), - SingleByteCharSetProber(Latin2HungarianModel), - SingleByteCharSetProber(Win1250HungarianModel), - SingleByteCharSetProber(TIS620ThaiModel), - ] - hebrewProber = HebrewProber() - logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, - False, hebrewProber) - visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True, - hebrewProber) - hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber) - self._mProbers.extend([hebrewProber, logicalHebrewProber, - visualHebrewProber]) - - self.reset() diff --git a/Contents/Libraries/Shared/requests/packages/chardet/sjisprober.py b/Contents/Libraries/Shared/requests/packages/chardet/sjisprober.py deleted file mode 100644 index cd0e9e707..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/sjisprober.py +++ /dev/null @@ -1,91 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import SJISDistributionAnalysis -from .jpcntx import SJISContextAnalysis -from .mbcssm import SJISSMModel -from . import constants - - -class SJISProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(SJISSMModel) - self._mDistributionAnalyzer = SJISDistributionAnalysis() - self._mContextAnalyzer = SJISContextAnalysis() - self.reset() - - def reset(self): - MultiByteCharSetProber.reset(self) - self._mContextAnalyzer.reset() - - def get_charset_name(self): - return self._mContextAnalyzer.get_charset_name() - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mContextAnalyzer.feed(self._mLastChar[2 - charLen:], - charLen) - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mContextAnalyzer.feed(aBuf[i + 1 - charLen:i + 3 - - charLen], charLen) - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mContextAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - contxtCf = self._mContextAnalyzer.get_confidence() - distribCf = self._mDistributionAnalyzer.get_confidence() - return max(contxtCf, distribCf) diff --git a/Contents/Libraries/Shared/requests/packages/chardet/universaldetector.py b/Contents/Libraries/Shared/requests/packages/chardet/universaldetector.py deleted file mode 100644 index 476522b99..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/universaldetector.py +++ /dev/null @@ -1,170 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -import sys -import codecs -from .latin1prober import Latin1Prober # windows-1252 -from .mbcsgroupprober import MBCSGroupProber # multi-byte character sets -from .sbcsgroupprober import SBCSGroupProber # single-byte character sets -from .escprober import EscCharSetProber # ISO-2122, etc. -import re - -MINIMUM_THRESHOLD = 0.20 -ePureAscii = 0 -eEscAscii = 1 -eHighbyte = 2 - - -class UniversalDetector: - def __init__(self): - self._highBitDetector = re.compile(b'[\x80-\xFF]') - self._escDetector = re.compile(b'(\033|~{)') - self._mEscCharSetProber = None - self._mCharSetProbers = [] - self.reset() - - def reset(self): - self.result = {'encoding': None, 'confidence': 0.0} - self.done = False - self._mStart = True - self._mGotData = False - self._mInputState = ePureAscii - self._mLastChar = b'' - if self._mEscCharSetProber: - self._mEscCharSetProber.reset() - for prober in self._mCharSetProbers: - prober.reset() - - def feed(self, aBuf): - if self.done: - return - - aLen = len(aBuf) - if not aLen: - return - - if not self._mGotData: - # If the data starts with BOM, we know it is UTF - if aBuf[:3] == codecs.BOM_UTF8: - # EF BB BF UTF-8 with BOM - self.result = {'encoding': "UTF-8-SIG", 'confidence': 1.0} - elif aBuf[:4] == codecs.BOM_UTF32_LE: - # FF FE 00 00 UTF-32, little-endian BOM - self.result = {'encoding': "UTF-32LE", 'confidence': 1.0} - elif aBuf[:4] == codecs.BOM_UTF32_BE: - # 00 00 FE FF UTF-32, big-endian BOM - self.result = {'encoding': "UTF-32BE", 'confidence': 1.0} - elif aBuf[:4] == b'\xFE\xFF\x00\x00': - # FE FF 00 00 UCS-4, unusual octet order BOM (3412) - self.result = { - 'encoding': "X-ISO-10646-UCS-4-3412", - 'confidence': 1.0 - } - elif aBuf[:4] == b'\x00\x00\xFF\xFE': - # 00 00 FF FE UCS-4, unusual octet order BOM (2143) - self.result = { - 'encoding': "X-ISO-10646-UCS-4-2143", - 'confidence': 1.0 - } - elif aBuf[:2] == codecs.BOM_LE: - # FF FE UTF-16, little endian BOM - self.result = {'encoding': "UTF-16LE", 'confidence': 1.0} - elif aBuf[:2] == codecs.BOM_BE: - # FE FF UTF-16, big endian BOM - self.result = {'encoding': "UTF-16BE", 'confidence': 1.0} - - self._mGotData = True - if self.result['encoding'] and (self.result['confidence'] > 0.0): - self.done = True - return - - if self._mInputState == ePureAscii: - if self._highBitDetector.search(aBuf): - self._mInputState = eHighbyte - elif ((self._mInputState == ePureAscii) and - self._escDetector.search(self._mLastChar + aBuf)): - self._mInputState = eEscAscii - - self._mLastChar = aBuf[-1:] - - if self._mInputState == eEscAscii: - if not self._mEscCharSetProber: - self._mEscCharSetProber = EscCharSetProber() - if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt: - self.result = {'encoding': self._mEscCharSetProber.get_charset_name(), - 'confidence': self._mEscCharSetProber.get_confidence()} - self.done = True - elif self._mInputState == eHighbyte: - if not self._mCharSetProbers: - self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), - Latin1Prober()] - for prober in self._mCharSetProbers: - if prober.feed(aBuf) == constants.eFoundIt: - self.result = {'encoding': prober.get_charset_name(), - 'confidence': prober.get_confidence()} - self.done = True - break - - def close(self): - if self.done: - return - if not self._mGotData: - if constants._debug: - sys.stderr.write('no data received!\n') - return - self.done = True - - if self._mInputState == ePureAscii: - self.result = {'encoding': 'ascii', 'confidence': 1.0} - return self.result - - if self._mInputState == eHighbyte: - proberConfidence = None - maxProberConfidence = 0.0 - maxProber = None - for prober in self._mCharSetProbers: - if not prober: - continue - proberConfidence = prober.get_confidence() - if proberConfidence > maxProberConfidence: - maxProberConfidence = proberConfidence - maxProber = prober - if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD): - self.result = {'encoding': maxProber.get_charset_name(), - 'confidence': maxProber.get_confidence()} - return self.result - - if constants._debug: - sys.stderr.write('no probers hit minimum threshhold\n') - for prober in self._mCharSetProbers[0].mProbers: - if not prober: - continue - sys.stderr.write('%s confidence = %s\n' % - (prober.get_charset_name(), - prober.get_confidence())) diff --git a/Contents/Libraries/Shared/requests/packages/chardet/utf8prober.py b/Contents/Libraries/Shared/requests/packages/chardet/utf8prober.py deleted file mode 100644 index 1c0bb5d8f..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/utf8prober.py +++ /dev/null @@ -1,76 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .mbcssm import UTF8SMModel - -ONE_CHAR_PROB = 0.5 - - -class UTF8Prober(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(UTF8SMModel) - self.reset() - - def reset(self): - CharSetProber.reset(self) - self._mCodingSM.reset() - self._mNumOfMBChar = 0 - - def get_charset_name(self): - return "utf-8" - - def feed(self, aBuf): - for c in aBuf: - codingState = self._mCodingSM.next_state(c) - if codingState == constants.eError: - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - if self._mCodingSM.get_current_charlen() >= 2: - self._mNumOfMBChar += 1 - - if self.get_state() == constants.eDetecting: - if self.get_confidence() > constants.SHORTCUT_THRESHOLD: - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - unlike = 0.99 - if self._mNumOfMBChar < 6: - for i in range(0, self._mNumOfMBChar): - unlike = unlike * ONE_CHAR_PROB - return 1.0 - unlike - else: - return unlike diff --git a/Contents/Libraries/Shared/requests/packages/idna/__init__.py b/Contents/Libraries/Shared/requests/packages/idna/__init__.py deleted file mode 100644 index bb67a43fa..000000000 --- a/Contents/Libraries/Shared/requests/packages/idna/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .core import * diff --git a/Contents/Libraries/Shared/requests/packages/idna/codec.py b/Contents/Libraries/Shared/requests/packages/idna/codec.py deleted file mode 100644 index 98c65ead1..000000000 --- a/Contents/Libraries/Shared/requests/packages/idna/codec.py +++ /dev/null @@ -1,118 +0,0 @@ -from .core import encode, decode, alabel, ulabel, IDNAError -import codecs -import re - -_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') - -class Codec(codecs.Codec): - - def encode(self, data, errors='strict'): - - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return "", 0 - - return encode(data), len(data) - - def decode(self, data, errors='strict'): - - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return u"", 0 - - return decode(data), len(data) - -class IncrementalEncoder(codecs.BufferedIncrementalEncoder): - def _buffer_encode(self, data, errors, final): - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return ("", 0) - - labels = _unicode_dots_re.split(data) - trailing_dot = u'' - if labels: - if not labels[-1]: - trailing_dot = '.' - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = '.' - - result = [] - size = 0 - for label in labels: - result.append(alabel(label)) - if size: - size += 1 - size += len(label) - - # Join with U+002E - result = ".".join(result) + trailing_dot - size += len(trailing_dot) - return (result, size) - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def _buffer_decode(self, data, errors, final): - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return (u"", 0) - - # IDNA allows decoding to operate on Unicode strings, too. - if isinstance(data, unicode): - labels = _unicode_dots_re.split(data) - else: - # Must be ASCII string - data = str(data) - unicode(data, "ascii") - labels = data.split(".") - - trailing_dot = u'' - if labels: - if not labels[-1]: - trailing_dot = u'.' - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = u'.' - - result = [] - size = 0 - for label in labels: - result.append(ulabel(label)) - if size: - size += 1 - size += len(label) - - result = u".".join(result) + trailing_dot - size += len(trailing_dot) - return (result, size) - - -class StreamWriter(Codec, codecs.StreamWriter): - pass - -class StreamReader(Codec, codecs.StreamReader): - pass - -def getregentry(): - return codecs.CodecInfo( - name='idna', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) diff --git a/Contents/Libraries/Shared/requests/packages/idna/compat.py b/Contents/Libraries/Shared/requests/packages/idna/compat.py deleted file mode 100644 index 4d47f336d..000000000 --- a/Contents/Libraries/Shared/requests/packages/idna/compat.py +++ /dev/null @@ -1,12 +0,0 @@ -from .core import * -from .codec import * - -def ToASCII(label): - return encode(label) - -def ToUnicode(label): - return decode(label) - -def nameprep(s): - raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") - diff --git a/Contents/Libraries/Shared/requests/packages/idna/core.py b/Contents/Libraries/Shared/requests/packages/idna/core.py deleted file mode 100644 index ff3b38d64..000000000 --- a/Contents/Libraries/Shared/requests/packages/idna/core.py +++ /dev/null @@ -1,387 +0,0 @@ -from . import idnadata -import bisect -import unicodedata -import re -import sys -from .intranges import intranges_contain - -_virama_combining_class = 9 -_alabel_prefix = b'xn--' -_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') - -if sys.version_info[0] == 3: - unicode = str - unichr = chr - -class IDNAError(UnicodeError): - """ Base exception for all IDNA-encoding related problems """ - pass - - -class IDNABidiError(IDNAError): - """ Exception when bidirectional requirements are not satisfied """ - pass - - -class InvalidCodepoint(IDNAError): - """ Exception when a disallowed or unallocated codepoint is used """ - pass - - -class InvalidCodepointContext(IDNAError): - """ Exception when the codepoint is not valid in the context it is used """ - pass - - -def _combining_class(cp): - return unicodedata.combining(unichr(cp)) - -def _is_script(cp, script): - return intranges_contain(ord(cp), idnadata.scripts[script]) - -def _punycode(s): - return s.encode('punycode') - -def _unot(s): - return 'U+{0:04X}'.format(s) - - -def valid_label_length(label): - - if len(label) > 63: - return False - return True - - -def valid_string_length(label, trailing_dot): - - if len(label) > (254 if trailing_dot else 253): - return False - return True - - -def check_bidi(label, check_ltr=False): - - # Bidi rules should only be applied if string contains RTL characters - bidi_label = False - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - if direction == '': - # String likely comes from a newer version of Unicode - raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) - if direction in ['R', 'AL', 'AN']: - bidi_label = True - break - if not bidi_label and not check_ltr: - return True - - # Bidi rule 1 - direction = unicodedata.bidirectional(label[0]) - if direction in ['R', 'AL']: - rtl = True - elif direction == 'L': - rtl = False - else: - raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) - - valid_ending = False - number_type = False - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - - if rtl: - # Bidi rule 2 - if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) - # Bidi rule 3 - if direction in ['R', 'AL', 'EN', 'AN']: - valid_ending = True - elif direction != 'NSM': - valid_ending = False - # Bidi rule 4 - if direction in ['AN', 'EN']: - if not number_type: - number_type = direction - else: - if number_type != direction: - raise IDNABidiError('Can not mix numeral types in a right-to-left label') - else: - # Bidi rule 5 - if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) - # Bidi rule 6 - if direction in ['L', 'EN']: - valid_ending = True - elif direction != 'NSM': - valid_ending = False - - if not valid_ending: - raise IDNABidiError('Label ends with illegal codepoint directionality') - - return True - - -def check_initial_combiner(label): - - if unicodedata.category(label[0])[0] == 'M': - raise IDNAError('Label begins with an illegal combining character') - return True - - -def check_hyphen_ok(label): - - if label[2:4] == '--': - raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') - if label[0] == '-' or label[-1] == '-': - raise IDNAError('Label must not start or end with a hyphen') - return True - - -def check_nfc(label): - - if unicodedata.normalize('NFC', label) != label: - raise IDNAError('Label must be in Normalization Form C') - - -def valid_contextj(label, pos): - - cp_value = ord(label[pos]) - - if cp_value == 0x200c: - - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - - ok = False - for i in range(pos-1, -1, -1): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == 'T': - continue - if joining_type in ['L', 'D']: - ok = True - break - - if not ok: - return False - - ok = False - for i in range(pos+1, len(label)): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == 'T': - continue - if joining_type in ['R', 'D']: - ok = True - break - return ok - - if cp_value == 0x200d: - - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - return False - - else: - - return False - - -def valid_contexto(label, pos, exception=False): - - cp_value = ord(label[pos]) - - if cp_value == 0x00b7: - if 0 < pos < len(label)-1: - if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: - return True - return False - - elif cp_value == 0x0375: - if pos < len(label)-1 and len(label) > 1: - return _is_script(label[pos + 1], 'Greek') - return False - - elif cp_value == 0x05f3 or cp_value == 0x05f4: - if pos > 0: - return _is_script(label[pos - 1], 'Hebrew') - return False - - elif cp_value == 0x30fb: - for cp in label: - if cp == u'\u30fb': - continue - if not _is_script(cp, 'Hiragana') and not _is_script(cp, 'Katakana') and not _is_script(cp, 'Han'): - return False - return True - - elif 0x660 <= cp_value <= 0x669: - for cp in label: - if 0x6f0 <= ord(cp) <= 0x06f9: - return False - return True - - elif 0x6f0 <= cp_value <= 0x6f9: - for cp in label: - if 0x660 <= ord(cp) <= 0x0669: - return False - return True - - -def check_label(label): - - if isinstance(label, (bytes, bytearray)): - label = label.decode('utf-8') - if len(label) == 0: - raise IDNAError('Empty Label') - - check_nfc(label) - check_hyphen_ok(label) - check_initial_combiner(label) - - for (pos, cp) in enumerate(label): - cp_value = ord(cp) - if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): - continue - elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): - if not valid_contextj(label, pos): - raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) - elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): - if not valid_contexto(label, pos): - raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) - else: - raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) - - check_bidi(label) - - -def alabel(label): - - try: - label = label.encode('ascii') - try: - ulabel(label) - except: - raise IDNAError('The label {0} is not a valid A-label'.format(label)) - if not valid_label_length(label): - raise IDNAError('Label too long') - return label - except UnicodeError: - pass - - if not label: - raise IDNAError('No Input') - - label = unicode(label) - check_label(label) - label = _punycode(label) - label = _alabel_prefix + label - - if not valid_label_length(label): - raise IDNAError('Label too long') - - return label - - -def ulabel(label): - - if not isinstance(label, (bytes, bytearray)): - try: - label = label.encode('ascii') - except UnicodeError: - check_label(label) - return label - - label = label.lower() - if label.startswith(_alabel_prefix): - label = label[len(_alabel_prefix):] - else: - check_label(label) - return label.decode('ascii') - - label = label.decode('punycode') - check_label(label) - return label - - -def uts46_remap(domain, std3_rules=True, transitional=False): - """Re-map the characters in the string according to UTS46 processing.""" - from .uts46data import uts46data - output = u"" - try: - for pos, char in enumerate(domain): - code_point = ord(char) - uts46row = uts46data[code_point if code_point < 256 else - bisect.bisect_left(uts46data, (code_point, "Z")) - 1] - status = uts46row[1] - replacement = uts46row[2] if len(uts46row) == 3 else None - if (status == "V" or - (status == "D" and not transitional) or - (status == "3" and std3_rules and replacement is None)): - output += char - elif replacement is not None and (status == "M" or - (status == "3" and std3_rules) or - (status == "D" and transitional)): - output += replacement - elif status != "I": - raise IndexError() - return unicodedata.normalize("NFC", output) - except IndexError: - raise InvalidCodepoint( - "Codepoint {0} not allowed at position {1} in {2}".format( - _unot(code_point), pos + 1, repr(domain))) - - -def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): - - if isinstance(s, (bytes, bytearray)): - s = s.decode("ascii") - if uts46: - s = uts46_remap(s, std3_rules, transitional) - trailing_dot = False - result = [] - if strict: - labels = s.split('.') - else: - labels = _unicode_dots_re.split(s) - while labels and not labels[0]: - del labels[0] - if not labels: - raise IDNAError('Empty domain') - if labels[-1] == '': - del labels[-1] - trailing_dot = True - for label in labels: - result.append(alabel(label)) - if trailing_dot: - result.append(b'') - s = b'.'.join(result) - if not valid_string_length(s, trailing_dot): - raise IDNAError('Domain too long') - return s - - -def decode(s, strict=False, uts46=False, std3_rules=False): - - if isinstance(s, (bytes, bytearray)): - s = s.decode("ascii") - if uts46: - s = uts46_remap(s, std3_rules, False) - trailing_dot = False - result = [] - if not strict: - labels = _unicode_dots_re.split(s) - else: - labels = s.split(u'.') - while labels and not labels[0]: - del labels[0] - if not labels: - raise IDNAError('Empty domain') - if not labels[-1]: - del labels[-1] - trailing_dot = True - for label in labels: - result.append(ulabel(label)) - if trailing_dot: - result.append(u'') - return u'.'.join(result) diff --git a/Contents/Libraries/Shared/requests/packages/idna/idnadata.py b/Contents/Libraries/Shared/requests/packages/idna/idnadata.py deleted file mode 100644 index 2bffe527c..000000000 --- a/Contents/Libraries/Shared/requests/packages/idna/idnadata.py +++ /dev/null @@ -1,1584 +0,0 @@ -# This file is automatically generated by build-idnadata.py - -scripts = { - 'Greek': ( - (0x370, 0x374), - (0x375, 0x378), - (0x37a, 0x37e), - (0x384, 0x385), - (0x386, 0x387), - (0x388, 0x38b), - (0x38c, 0x38d), - (0x38e, 0x3a2), - (0x3a3, 0x3e2), - (0x3f0, 0x400), - (0x1d26, 0x1d2b), - (0x1d5d, 0x1d62), - (0x1d66, 0x1d6b), - (0x1dbf, 0x1dc0), - (0x1f00, 0x1f16), - (0x1f18, 0x1f1e), - (0x1f20, 0x1f46), - (0x1f48, 0x1f4e), - (0x1f50, 0x1f58), - (0x1f59, 0x1f5a), - (0x1f5b, 0x1f5c), - (0x1f5d, 0x1f5e), - (0x1f5f, 0x1f7e), - (0x1f80, 0x1fb5), - (0x1fb6, 0x1fc5), - (0x1fc6, 0x1fd4), - (0x1fd6, 0x1fdc), - (0x1fdd, 0x1ff0), - (0x1ff2, 0x1ff5), - (0x1ff6, 0x1fff), - (0x2126, 0x2127), - (0x10140, 0x1018b), - (0x1d200, 0x1d246), - ), - 'Han': ( - (0x2e80, 0x2e9a), - (0x2e9b, 0x2ef4), - (0x2f00, 0x2fd6), - (0x3005, 0x3006), - (0x3007, 0x3008), - (0x3021, 0x302a), - (0x3038, 0x303c), - (0x3400, 0x4db6), - (0x4e00, 0x9fcd), - (0xf900, 0xfa6e), - (0xfa70, 0xfada), - (0x20000, 0x2a6d7), - (0x2a700, 0x2b735), - (0x2b740, 0x2b81e), - (0x2f800, 0x2fa1e), - ), - 'Hebrew': ( - (0x591, 0x5c8), - (0x5d0, 0x5eb), - (0x5f0, 0x5f5), - (0xfb1d, 0xfb37), - (0xfb38, 0xfb3d), - (0xfb3e, 0xfb3f), - (0xfb40, 0xfb42), - (0xfb43, 0xfb45), - (0xfb46, 0xfb50), - ), - 'Hiragana': ( - (0x3041, 0x3097), - (0x309d, 0x30a0), - (0x1b001, 0x1b002), - (0x1f200, 0x1f201), - ), - 'Katakana': ( - (0x30a1, 0x30fb), - (0x30fd, 0x3100), - (0x31f0, 0x3200), - (0x32d0, 0x32ff), - (0x3300, 0x3358), - (0xff66, 0xff70), - (0xff71, 0xff9e), - (0x1b000, 0x1b001), - ), -} -joining_types = { - 0x600: 'U', - 0x601: 'U', - 0x602: 'U', - 0x603: 'U', - 0x604: 'U', - 0x608: 'U', - 0x60b: 'U', - 0x620: 'D', - 0x621: 'U', - 0x622: 'R', - 0x623: 'R', - 0x624: 'R', - 0x625: 'R', - 0x626: 'D', - 0x627: 'R', - 0x628: 'D', - 0x629: 'R', - 0x62a: 'D', - 0x62b: 'D', - 0x62c: 'D', - 0x62d: 'D', - 0x62e: 'D', - 0x62f: 'R', - 0x630: 'R', - 0x631: 'R', - 0x632: 'R', - 0x633: 'D', - 0x634: 'D', - 0x635: 'D', - 0x636: 'D', - 0x637: 'D', - 0x638: 'D', - 0x639: 'D', - 0x63a: 'D', - 0x63b: 'D', - 0x63c: 'D', - 0x63d: 'D', - 0x63e: 'D', - 0x63f: 'D', - 0x640: 'C', - 0x641: 'D', - 0x642: 'D', - 0x643: 'D', - 0x644: 'D', - 0x645: 'D', - 0x646: 'D', - 0x647: 'D', - 0x648: 'R', - 0x649: 'D', - 0x64a: 'D', - 0x66e: 'D', - 0x66f: 'D', - 0x671: 'R', - 0x672: 'R', - 0x673: 'R', - 0x674: 'U', - 0x675: 'R', - 0x676: 'R', - 0x677: 'R', - 0x678: 'D', - 0x679: 'D', - 0x67a: 'D', - 0x67b: 'D', - 0x67c: 'D', - 0x67d: 'D', - 0x67e: 'D', - 0x67f: 'D', - 0x680: 'D', - 0x681: 'D', - 0x682: 'D', - 0x683: 'D', - 0x684: 'D', - 0x685: 'D', - 0x686: 'D', - 0x687: 'D', - 0x688: 'R', - 0x689: 'R', - 0x68a: 'R', - 0x68b: 'R', - 0x68c: 'R', - 0x68d: 'R', - 0x68e: 'R', - 0x68f: 'R', - 0x690: 'R', - 0x691: 'R', - 0x692: 'R', - 0x693: 'R', - 0x694: 'R', - 0x695: 'R', - 0x696: 'R', - 0x697: 'R', - 0x698: 'R', - 0x699: 'R', - 0x69a: 'D', - 0x69b: 'D', - 0x69c: 'D', - 0x69d: 'D', - 0x69e: 'D', - 0x69f: 'D', - 0x6a0: 'D', - 0x6a1: 'D', - 0x6a2: 'D', - 0x6a3: 'D', - 0x6a4: 'D', - 0x6a5: 'D', - 0x6a6: 'D', - 0x6a7: 'D', - 0x6a8: 'D', - 0x6a9: 'D', - 0x6aa: 'D', - 0x6ab: 'D', - 0x6ac: 'D', - 0x6ad: 'D', - 0x6ae: 'D', - 0x6af: 'D', - 0x6b0: 'D', - 0x6b1: 'D', - 0x6b2: 'D', - 0x6b3: 'D', - 0x6b4: 'D', - 0x6b5: 'D', - 0x6b6: 'D', - 0x6b7: 'D', - 0x6b8: 'D', - 0x6b9: 'D', - 0x6ba: 'D', - 0x6bb: 'D', - 0x6bc: 'D', - 0x6bd: 'D', - 0x6be: 'D', - 0x6bf: 'D', - 0x6c0: 'R', - 0x6c1: 'D', - 0x6c2: 'D', - 0x6c3: 'R', - 0x6c4: 'R', - 0x6c5: 'R', - 0x6c6: 'R', - 0x6c7: 'R', - 0x6c8: 'R', - 0x6c9: 'R', - 0x6ca: 'R', - 0x6cb: 'R', - 0x6cc: 'D', - 0x6cd: 'R', - 0x6ce: 'D', - 0x6cf: 'R', - 0x6d0: 'D', - 0x6d1: 'D', - 0x6d2: 'R', - 0x6d3: 'R', - 0x6d5: 'R', - 0x6dd: 'U', - 0x6ee: 'R', - 0x6ef: 'R', - 0x6fa: 'D', - 0x6fb: 'D', - 0x6fc: 'D', - 0x6ff: 'D', - 0x710: 'R', - 0x712: 'D', - 0x713: 'D', - 0x714: 'D', - 0x715: 'R', - 0x716: 'R', - 0x717: 'R', - 0x718: 'R', - 0x719: 'R', - 0x71a: 'D', - 0x71b: 'D', - 0x71c: 'D', - 0x71d: 'D', - 0x71e: 'R', - 0x71f: 'D', - 0x720: 'D', - 0x721: 'D', - 0x722: 'D', - 0x723: 'D', - 0x724: 'D', - 0x725: 'D', - 0x726: 'D', - 0x727: 'D', - 0x728: 'R', - 0x729: 'D', - 0x72a: 'R', - 0x72b: 'D', - 0x72c: 'R', - 0x72d: 'D', - 0x72e: 'D', - 0x72f: 'R', - 0x74d: 'R', - 0x74e: 'D', - 0x74f: 'D', - 0x750: 'D', - 0x751: 'D', - 0x752: 'D', - 0x753: 'D', - 0x754: 'D', - 0x755: 'D', - 0x756: 'D', - 0x757: 'D', - 0x758: 'D', - 0x759: 'R', - 0x75a: 'R', - 0x75b: 'R', - 0x75c: 'D', - 0x75d: 'D', - 0x75e: 'D', - 0x75f: 'D', - 0x760: 'D', - 0x761: 'D', - 0x762: 'D', - 0x763: 'D', - 0x764: 'D', - 0x765: 'D', - 0x766: 'D', - 0x767: 'D', - 0x768: 'D', - 0x769: 'D', - 0x76a: 'D', - 0x76b: 'R', - 0x76c: 'R', - 0x76d: 'D', - 0x76e: 'D', - 0x76f: 'D', - 0x770: 'D', - 0x771: 'R', - 0x772: 'D', - 0x773: 'R', - 0x774: 'R', - 0x775: 'D', - 0x776: 'D', - 0x777: 'D', - 0x778: 'R', - 0x779: 'R', - 0x77a: 'D', - 0x77b: 'D', - 0x77c: 'D', - 0x77d: 'D', - 0x77e: 'D', - 0x77f: 'D', - 0x7ca: 'D', - 0x7cb: 'D', - 0x7cc: 'D', - 0x7cd: 'D', - 0x7ce: 'D', - 0x7cf: 'D', - 0x7d0: 'D', - 0x7d1: 'D', - 0x7d2: 'D', - 0x7d3: 'D', - 0x7d4: 'D', - 0x7d5: 'D', - 0x7d6: 'D', - 0x7d7: 'D', - 0x7d8: 'D', - 0x7d9: 'D', - 0x7da: 'D', - 0x7db: 'D', - 0x7dc: 'D', - 0x7dd: 'D', - 0x7de: 'D', - 0x7df: 'D', - 0x7e0: 'D', - 0x7e1: 'D', - 0x7e2: 'D', - 0x7e3: 'D', - 0x7e4: 'D', - 0x7e5: 'D', - 0x7e6: 'D', - 0x7e7: 'D', - 0x7e8: 'D', - 0x7e9: 'D', - 0x7ea: 'D', - 0x7fa: 'C', - 0x840: 'R', - 0x841: 'D', - 0x842: 'D', - 0x843: 'D', - 0x844: 'D', - 0x845: 'D', - 0x846: 'R', - 0x847: 'D', - 0x848: 'D', - 0x849: 'R', - 0x84a: 'D', - 0x84b: 'D', - 0x84c: 'D', - 0x84d: 'D', - 0x84e: 'D', - 0x84f: 'R', - 0x850: 'D', - 0x851: 'D', - 0x852: 'D', - 0x853: 'D', - 0x854: 'R', - 0x855: 'D', - 0x856: 'U', - 0x857: 'U', - 0x858: 'U', - 0x8a0: 'D', - 0x8a2: 'D', - 0x8a3: 'D', - 0x8a4: 'D', - 0x8a5: 'D', - 0x8a6: 'D', - 0x8a7: 'D', - 0x8a8: 'D', - 0x8a9: 'D', - 0x8aa: 'R', - 0x8ab: 'R', - 0x8ac: 'R', - 0x1806: 'U', - 0x1807: 'D', - 0x180a: 'C', - 0x180e: 'U', - 0x1820: 'D', - 0x1821: 'D', - 0x1822: 'D', - 0x1823: 'D', - 0x1824: 'D', - 0x1825: 'D', - 0x1826: 'D', - 0x1827: 'D', - 0x1828: 'D', - 0x1829: 'D', - 0x182a: 'D', - 0x182b: 'D', - 0x182c: 'D', - 0x182d: 'D', - 0x182e: 'D', - 0x182f: 'D', - 0x1830: 'D', - 0x1831: 'D', - 0x1832: 'D', - 0x1833: 'D', - 0x1834: 'D', - 0x1835: 'D', - 0x1836: 'D', - 0x1837: 'D', - 0x1838: 'D', - 0x1839: 'D', - 0x183a: 'D', - 0x183b: 'D', - 0x183c: 'D', - 0x183d: 'D', - 0x183e: 'D', - 0x183f: 'D', - 0x1840: 'D', - 0x1841: 'D', - 0x1842: 'D', - 0x1843: 'D', - 0x1844: 'D', - 0x1845: 'D', - 0x1846: 'D', - 0x1847: 'D', - 0x1848: 'D', - 0x1849: 'D', - 0x184a: 'D', - 0x184b: 'D', - 0x184c: 'D', - 0x184d: 'D', - 0x184e: 'D', - 0x184f: 'D', - 0x1850: 'D', - 0x1851: 'D', - 0x1852: 'D', - 0x1853: 'D', - 0x1854: 'D', - 0x1855: 'D', - 0x1856: 'D', - 0x1857: 'D', - 0x1858: 'D', - 0x1859: 'D', - 0x185a: 'D', - 0x185b: 'D', - 0x185c: 'D', - 0x185d: 'D', - 0x185e: 'D', - 0x185f: 'D', - 0x1860: 'D', - 0x1861: 'D', - 0x1862: 'D', - 0x1863: 'D', - 0x1864: 'D', - 0x1865: 'D', - 0x1866: 'D', - 0x1867: 'D', - 0x1868: 'D', - 0x1869: 'D', - 0x186a: 'D', - 0x186b: 'D', - 0x186c: 'D', - 0x186d: 'D', - 0x186e: 'D', - 0x186f: 'D', - 0x1870: 'D', - 0x1871: 'D', - 0x1872: 'D', - 0x1873: 'D', - 0x1874: 'D', - 0x1875: 'D', - 0x1876: 'D', - 0x1877: 'D', - 0x1880: 'U', - 0x1881: 'U', - 0x1882: 'U', - 0x1883: 'U', - 0x1884: 'U', - 0x1885: 'U', - 0x1886: 'U', - 0x1887: 'D', - 0x1888: 'D', - 0x1889: 'D', - 0x188a: 'D', - 0x188b: 'D', - 0x188c: 'D', - 0x188d: 'D', - 0x188e: 'D', - 0x188f: 'D', - 0x1890: 'D', - 0x1891: 'D', - 0x1892: 'D', - 0x1893: 'D', - 0x1894: 'D', - 0x1895: 'D', - 0x1896: 'D', - 0x1897: 'D', - 0x1898: 'D', - 0x1899: 'D', - 0x189a: 'D', - 0x189b: 'D', - 0x189c: 'D', - 0x189d: 'D', - 0x189e: 'D', - 0x189f: 'D', - 0x18a0: 'D', - 0x18a1: 'D', - 0x18a2: 'D', - 0x18a3: 'D', - 0x18a4: 'D', - 0x18a5: 'D', - 0x18a6: 'D', - 0x18a7: 'D', - 0x18a8: 'D', - 0x18aa: 'D', - 0x200c: 'U', - 0x200d: 'C', - 0x2066: 'U', - 0x2067: 'U', - 0x2068: 'U', - 0x2069: 'U', - 0xa840: 'D', - 0xa841: 'D', - 0xa842: 'D', - 0xa843: 'D', - 0xa844: 'D', - 0xa845: 'D', - 0xa846: 'D', - 0xa847: 'D', - 0xa848: 'D', - 0xa849: 'D', - 0xa84a: 'D', - 0xa84b: 'D', - 0xa84c: 'D', - 0xa84d: 'D', - 0xa84e: 'D', - 0xa84f: 'D', - 0xa850: 'D', - 0xa851: 'D', - 0xa852: 'D', - 0xa853: 'D', - 0xa854: 'D', - 0xa855: 'D', - 0xa856: 'D', - 0xa857: 'D', - 0xa858: 'D', - 0xa859: 'D', - 0xa85a: 'D', - 0xa85b: 'D', - 0xa85c: 'D', - 0xa85d: 'D', - 0xa85e: 'D', - 0xa85f: 'D', - 0xa860: 'D', - 0xa861: 'D', - 0xa862: 'D', - 0xa863: 'D', - 0xa864: 'D', - 0xa865: 'D', - 0xa866: 'D', - 0xa867: 'D', - 0xa868: 'D', - 0xa869: 'D', - 0xa86a: 'D', - 0xa86b: 'D', - 0xa86c: 'D', - 0xa86d: 'D', - 0xa86e: 'D', - 0xa86f: 'D', - 0xa870: 'D', - 0xa871: 'D', - 0xa872: 'L', - 0xa873: 'U', -} -codepoint_classes = { - 'PVALID': ( - (0x2d, 0x2e), - (0x30, 0x3a), - (0x61, 0x7b), - (0xdf, 0xf7), - (0xf8, 0x100), - (0x101, 0x102), - (0x103, 0x104), - (0x105, 0x106), - (0x107, 0x108), - (0x109, 0x10a), - (0x10b, 0x10c), - (0x10d, 0x10e), - (0x10f, 0x110), - (0x111, 0x112), - (0x113, 0x114), - (0x115, 0x116), - (0x117, 0x118), - (0x119, 0x11a), - (0x11b, 0x11c), - (0x11d, 0x11e), - (0x11f, 0x120), - (0x121, 0x122), - (0x123, 0x124), - (0x125, 0x126), - (0x127, 0x128), - (0x129, 0x12a), - (0x12b, 0x12c), - (0x12d, 0x12e), - (0x12f, 0x130), - (0x131, 0x132), - (0x135, 0x136), - (0x137, 0x139), - (0x13a, 0x13b), - (0x13c, 0x13d), - (0x13e, 0x13f), - (0x142, 0x143), - (0x144, 0x145), - (0x146, 0x147), - (0x148, 0x149), - (0x14b, 0x14c), - (0x14d, 0x14e), - (0x14f, 0x150), - (0x151, 0x152), - (0x153, 0x154), - (0x155, 0x156), - (0x157, 0x158), - (0x159, 0x15a), - (0x15b, 0x15c), - (0x15d, 0x15e), - (0x15f, 0x160), - (0x161, 0x162), - (0x163, 0x164), - (0x165, 0x166), - (0x167, 0x168), - (0x169, 0x16a), - (0x16b, 0x16c), - (0x16d, 0x16e), - (0x16f, 0x170), - (0x171, 0x172), - (0x173, 0x174), - (0x175, 0x176), - (0x177, 0x178), - (0x17a, 0x17b), - (0x17c, 0x17d), - (0x17e, 0x17f), - (0x180, 0x181), - (0x183, 0x184), - (0x185, 0x186), - (0x188, 0x189), - (0x18c, 0x18e), - (0x192, 0x193), - (0x195, 0x196), - (0x199, 0x19c), - (0x19e, 0x19f), - (0x1a1, 0x1a2), - (0x1a3, 0x1a4), - (0x1a5, 0x1a6), - (0x1a8, 0x1a9), - (0x1aa, 0x1ac), - (0x1ad, 0x1ae), - (0x1b0, 0x1b1), - (0x1b4, 0x1b5), - (0x1b6, 0x1b7), - (0x1b9, 0x1bc), - (0x1bd, 0x1c4), - (0x1ce, 0x1cf), - (0x1d0, 0x1d1), - (0x1d2, 0x1d3), - (0x1d4, 0x1d5), - (0x1d6, 0x1d7), - (0x1d8, 0x1d9), - (0x1da, 0x1db), - (0x1dc, 0x1de), - (0x1df, 0x1e0), - (0x1e1, 0x1e2), - (0x1e3, 0x1e4), - (0x1e5, 0x1e6), - (0x1e7, 0x1e8), - (0x1e9, 0x1ea), - (0x1eb, 0x1ec), - (0x1ed, 0x1ee), - (0x1ef, 0x1f1), - (0x1f5, 0x1f6), - (0x1f9, 0x1fa), - (0x1fb, 0x1fc), - (0x1fd, 0x1fe), - (0x1ff, 0x200), - (0x201, 0x202), - (0x203, 0x204), - (0x205, 0x206), - (0x207, 0x208), - (0x209, 0x20a), - (0x20b, 0x20c), - (0x20d, 0x20e), - (0x20f, 0x210), - (0x211, 0x212), - (0x213, 0x214), - (0x215, 0x216), - (0x217, 0x218), - (0x219, 0x21a), - (0x21b, 0x21c), - (0x21d, 0x21e), - (0x21f, 0x220), - (0x221, 0x222), - (0x223, 0x224), - (0x225, 0x226), - (0x227, 0x228), - (0x229, 0x22a), - (0x22b, 0x22c), - (0x22d, 0x22e), - (0x22f, 0x230), - (0x231, 0x232), - (0x233, 0x23a), - (0x23c, 0x23d), - (0x23f, 0x241), - (0x242, 0x243), - (0x247, 0x248), - (0x249, 0x24a), - (0x24b, 0x24c), - (0x24d, 0x24e), - (0x24f, 0x2b0), - (0x2b9, 0x2c2), - (0x2c6, 0x2d2), - (0x2ec, 0x2ed), - (0x2ee, 0x2ef), - (0x300, 0x340), - (0x342, 0x343), - (0x346, 0x34f), - (0x350, 0x370), - (0x371, 0x372), - (0x373, 0x374), - (0x377, 0x378), - (0x37b, 0x37e), - (0x390, 0x391), - (0x3ac, 0x3cf), - (0x3d7, 0x3d8), - (0x3d9, 0x3da), - (0x3db, 0x3dc), - (0x3dd, 0x3de), - (0x3df, 0x3e0), - (0x3e1, 0x3e2), - (0x3e3, 0x3e4), - (0x3e5, 0x3e6), - (0x3e7, 0x3e8), - (0x3e9, 0x3ea), - (0x3eb, 0x3ec), - (0x3ed, 0x3ee), - (0x3ef, 0x3f0), - (0x3f3, 0x3f4), - (0x3f8, 0x3f9), - (0x3fb, 0x3fd), - (0x430, 0x460), - (0x461, 0x462), - (0x463, 0x464), - (0x465, 0x466), - (0x467, 0x468), - (0x469, 0x46a), - (0x46b, 0x46c), - (0x46d, 0x46e), - (0x46f, 0x470), - (0x471, 0x472), - (0x473, 0x474), - (0x475, 0x476), - (0x477, 0x478), - (0x479, 0x47a), - (0x47b, 0x47c), - (0x47d, 0x47e), - (0x47f, 0x480), - (0x481, 0x482), - (0x483, 0x488), - (0x48b, 0x48c), - (0x48d, 0x48e), - (0x48f, 0x490), - (0x491, 0x492), - (0x493, 0x494), - (0x495, 0x496), - (0x497, 0x498), - (0x499, 0x49a), - (0x49b, 0x49c), - (0x49d, 0x49e), - (0x49f, 0x4a0), - (0x4a1, 0x4a2), - (0x4a3, 0x4a4), - (0x4a5, 0x4a6), - (0x4a7, 0x4a8), - (0x4a9, 0x4aa), - (0x4ab, 0x4ac), - (0x4ad, 0x4ae), - (0x4af, 0x4b0), - (0x4b1, 0x4b2), - (0x4b3, 0x4b4), - (0x4b5, 0x4b6), - (0x4b7, 0x4b8), - (0x4b9, 0x4ba), - (0x4bb, 0x4bc), - (0x4bd, 0x4be), - (0x4bf, 0x4c0), - (0x4c2, 0x4c3), - (0x4c4, 0x4c5), - (0x4c6, 0x4c7), - (0x4c8, 0x4c9), - (0x4ca, 0x4cb), - (0x4cc, 0x4cd), - (0x4ce, 0x4d0), - (0x4d1, 0x4d2), - (0x4d3, 0x4d4), - (0x4d5, 0x4d6), - (0x4d7, 0x4d8), - (0x4d9, 0x4da), - (0x4db, 0x4dc), - (0x4dd, 0x4de), - (0x4df, 0x4e0), - (0x4e1, 0x4e2), - (0x4e3, 0x4e4), - (0x4e5, 0x4e6), - (0x4e7, 0x4e8), - (0x4e9, 0x4ea), - (0x4eb, 0x4ec), - (0x4ed, 0x4ee), - (0x4ef, 0x4f0), - (0x4f1, 0x4f2), - (0x4f3, 0x4f4), - (0x4f5, 0x4f6), - (0x4f7, 0x4f8), - (0x4f9, 0x4fa), - (0x4fb, 0x4fc), - (0x4fd, 0x4fe), - (0x4ff, 0x500), - (0x501, 0x502), - (0x503, 0x504), - (0x505, 0x506), - (0x507, 0x508), - (0x509, 0x50a), - (0x50b, 0x50c), - (0x50d, 0x50e), - (0x50f, 0x510), - (0x511, 0x512), - (0x513, 0x514), - (0x515, 0x516), - (0x517, 0x518), - (0x519, 0x51a), - (0x51b, 0x51c), - (0x51d, 0x51e), - (0x51f, 0x520), - (0x521, 0x522), - (0x523, 0x524), - (0x525, 0x526), - (0x527, 0x528), - (0x559, 0x55a), - (0x561, 0x587), - (0x591, 0x5be), - (0x5bf, 0x5c0), - (0x5c1, 0x5c3), - (0x5c4, 0x5c6), - (0x5c7, 0x5c8), - (0x5d0, 0x5eb), - (0x5f0, 0x5f3), - (0x610, 0x61b), - (0x620, 0x640), - (0x641, 0x660), - (0x66e, 0x675), - (0x679, 0x6d4), - (0x6d5, 0x6dd), - (0x6df, 0x6e9), - (0x6ea, 0x6f0), - (0x6fa, 0x700), - (0x710, 0x74b), - (0x74d, 0x7b2), - (0x7c0, 0x7f6), - (0x800, 0x82e), - (0x840, 0x85c), - (0x8a0, 0x8a1), - (0x8a2, 0x8ad), - (0x8e4, 0x8ff), - (0x900, 0x958), - (0x960, 0x964), - (0x966, 0x970), - (0x971, 0x978), - (0x979, 0x980), - (0x981, 0x984), - (0x985, 0x98d), - (0x98f, 0x991), - (0x993, 0x9a9), - (0x9aa, 0x9b1), - (0x9b2, 0x9b3), - (0x9b6, 0x9ba), - (0x9bc, 0x9c5), - (0x9c7, 0x9c9), - (0x9cb, 0x9cf), - (0x9d7, 0x9d8), - (0x9e0, 0x9e4), - (0x9e6, 0x9f2), - (0xa01, 0xa04), - (0xa05, 0xa0b), - (0xa0f, 0xa11), - (0xa13, 0xa29), - (0xa2a, 0xa31), - (0xa32, 0xa33), - (0xa35, 0xa36), - (0xa38, 0xa3a), - (0xa3c, 0xa3d), - (0xa3e, 0xa43), - (0xa47, 0xa49), - (0xa4b, 0xa4e), - (0xa51, 0xa52), - (0xa5c, 0xa5d), - (0xa66, 0xa76), - (0xa81, 0xa84), - (0xa85, 0xa8e), - (0xa8f, 0xa92), - (0xa93, 0xaa9), - (0xaaa, 0xab1), - (0xab2, 0xab4), - (0xab5, 0xaba), - (0xabc, 0xac6), - (0xac7, 0xaca), - (0xacb, 0xace), - (0xad0, 0xad1), - (0xae0, 0xae4), - (0xae6, 0xaf0), - (0xb01, 0xb04), - (0xb05, 0xb0d), - (0xb0f, 0xb11), - (0xb13, 0xb29), - (0xb2a, 0xb31), - (0xb32, 0xb34), - (0xb35, 0xb3a), - (0xb3c, 0xb45), - (0xb47, 0xb49), - (0xb4b, 0xb4e), - (0xb56, 0xb58), - (0xb5f, 0xb64), - (0xb66, 0xb70), - (0xb71, 0xb72), - (0xb82, 0xb84), - (0xb85, 0xb8b), - (0xb8e, 0xb91), - (0xb92, 0xb96), - (0xb99, 0xb9b), - (0xb9c, 0xb9d), - (0xb9e, 0xba0), - (0xba3, 0xba5), - (0xba8, 0xbab), - (0xbae, 0xbba), - (0xbbe, 0xbc3), - (0xbc6, 0xbc9), - (0xbca, 0xbce), - (0xbd0, 0xbd1), - (0xbd7, 0xbd8), - (0xbe6, 0xbf0), - (0xc01, 0xc04), - (0xc05, 0xc0d), - (0xc0e, 0xc11), - (0xc12, 0xc29), - (0xc2a, 0xc34), - (0xc35, 0xc3a), - (0xc3d, 0xc45), - (0xc46, 0xc49), - (0xc4a, 0xc4e), - (0xc55, 0xc57), - (0xc58, 0xc5a), - (0xc60, 0xc64), - (0xc66, 0xc70), - (0xc82, 0xc84), - (0xc85, 0xc8d), - (0xc8e, 0xc91), - (0xc92, 0xca9), - (0xcaa, 0xcb4), - (0xcb5, 0xcba), - (0xcbc, 0xcc5), - (0xcc6, 0xcc9), - (0xcca, 0xcce), - (0xcd5, 0xcd7), - (0xcde, 0xcdf), - (0xce0, 0xce4), - (0xce6, 0xcf0), - (0xcf1, 0xcf3), - (0xd02, 0xd04), - (0xd05, 0xd0d), - (0xd0e, 0xd11), - (0xd12, 0xd3b), - (0xd3d, 0xd45), - (0xd46, 0xd49), - (0xd4a, 0xd4f), - (0xd57, 0xd58), - (0xd60, 0xd64), - (0xd66, 0xd70), - (0xd7a, 0xd80), - (0xd82, 0xd84), - (0xd85, 0xd97), - (0xd9a, 0xdb2), - (0xdb3, 0xdbc), - (0xdbd, 0xdbe), - (0xdc0, 0xdc7), - (0xdca, 0xdcb), - (0xdcf, 0xdd5), - (0xdd6, 0xdd7), - (0xdd8, 0xde0), - (0xdf2, 0xdf4), - (0xe01, 0xe33), - (0xe34, 0xe3b), - (0xe40, 0xe4f), - (0xe50, 0xe5a), - (0xe81, 0xe83), - (0xe84, 0xe85), - (0xe87, 0xe89), - (0xe8a, 0xe8b), - (0xe8d, 0xe8e), - (0xe94, 0xe98), - (0xe99, 0xea0), - (0xea1, 0xea4), - (0xea5, 0xea6), - (0xea7, 0xea8), - (0xeaa, 0xeac), - (0xead, 0xeb3), - (0xeb4, 0xeba), - (0xebb, 0xebe), - (0xec0, 0xec5), - (0xec6, 0xec7), - (0xec8, 0xece), - (0xed0, 0xeda), - (0xede, 0xee0), - (0xf00, 0xf01), - (0xf0b, 0xf0c), - (0xf18, 0xf1a), - (0xf20, 0xf2a), - (0xf35, 0xf36), - (0xf37, 0xf38), - (0xf39, 0xf3a), - (0xf3e, 0xf43), - (0xf44, 0xf48), - (0xf49, 0xf4d), - (0xf4e, 0xf52), - (0xf53, 0xf57), - (0xf58, 0xf5c), - (0xf5d, 0xf69), - (0xf6a, 0xf6d), - (0xf71, 0xf73), - (0xf74, 0xf75), - (0xf7a, 0xf81), - (0xf82, 0xf85), - (0xf86, 0xf93), - (0xf94, 0xf98), - (0xf99, 0xf9d), - (0xf9e, 0xfa2), - (0xfa3, 0xfa7), - (0xfa8, 0xfac), - (0xfad, 0xfb9), - (0xfba, 0xfbd), - (0xfc6, 0xfc7), - (0x1000, 0x104a), - (0x1050, 0x109e), - (0x10d0, 0x10fb), - (0x10fd, 0x1100), - (0x1200, 0x1249), - (0x124a, 0x124e), - (0x1250, 0x1257), - (0x1258, 0x1259), - (0x125a, 0x125e), - (0x1260, 0x1289), - (0x128a, 0x128e), - (0x1290, 0x12b1), - (0x12b2, 0x12b6), - (0x12b8, 0x12bf), - (0x12c0, 0x12c1), - (0x12c2, 0x12c6), - (0x12c8, 0x12d7), - (0x12d8, 0x1311), - (0x1312, 0x1316), - (0x1318, 0x135b), - (0x135d, 0x1360), - (0x1380, 0x1390), - (0x13a0, 0x13f5), - (0x1401, 0x166d), - (0x166f, 0x1680), - (0x1681, 0x169b), - (0x16a0, 0x16eb), - (0x1700, 0x170d), - (0x170e, 0x1715), - (0x1720, 0x1735), - (0x1740, 0x1754), - (0x1760, 0x176d), - (0x176e, 0x1771), - (0x1772, 0x1774), - (0x1780, 0x17b4), - (0x17b6, 0x17d4), - (0x17d7, 0x17d8), - (0x17dc, 0x17de), - (0x17e0, 0x17ea), - (0x1810, 0x181a), - (0x1820, 0x1878), - (0x1880, 0x18ab), - (0x18b0, 0x18f6), - (0x1900, 0x191d), - (0x1920, 0x192c), - (0x1930, 0x193c), - (0x1946, 0x196e), - (0x1970, 0x1975), - (0x1980, 0x19ac), - (0x19b0, 0x19ca), - (0x19d0, 0x19da), - (0x1a00, 0x1a1c), - (0x1a20, 0x1a5f), - (0x1a60, 0x1a7d), - (0x1a7f, 0x1a8a), - (0x1a90, 0x1a9a), - (0x1aa7, 0x1aa8), - (0x1b00, 0x1b4c), - (0x1b50, 0x1b5a), - (0x1b6b, 0x1b74), - (0x1b80, 0x1bf4), - (0x1c00, 0x1c38), - (0x1c40, 0x1c4a), - (0x1c4d, 0x1c7e), - (0x1cd0, 0x1cd3), - (0x1cd4, 0x1cf7), - (0x1d00, 0x1d2c), - (0x1d2f, 0x1d30), - (0x1d3b, 0x1d3c), - (0x1d4e, 0x1d4f), - (0x1d6b, 0x1d78), - (0x1d79, 0x1d9b), - (0x1dc0, 0x1de7), - (0x1dfc, 0x1e00), - (0x1e01, 0x1e02), - (0x1e03, 0x1e04), - (0x1e05, 0x1e06), - (0x1e07, 0x1e08), - (0x1e09, 0x1e0a), - (0x1e0b, 0x1e0c), - (0x1e0d, 0x1e0e), - (0x1e0f, 0x1e10), - (0x1e11, 0x1e12), - (0x1e13, 0x1e14), - (0x1e15, 0x1e16), - (0x1e17, 0x1e18), - (0x1e19, 0x1e1a), - (0x1e1b, 0x1e1c), - (0x1e1d, 0x1e1e), - (0x1e1f, 0x1e20), - (0x1e21, 0x1e22), - (0x1e23, 0x1e24), - (0x1e25, 0x1e26), - (0x1e27, 0x1e28), - (0x1e29, 0x1e2a), - (0x1e2b, 0x1e2c), - (0x1e2d, 0x1e2e), - (0x1e2f, 0x1e30), - (0x1e31, 0x1e32), - (0x1e33, 0x1e34), - (0x1e35, 0x1e36), - (0x1e37, 0x1e38), - (0x1e39, 0x1e3a), - (0x1e3b, 0x1e3c), - (0x1e3d, 0x1e3e), - (0x1e3f, 0x1e40), - (0x1e41, 0x1e42), - (0x1e43, 0x1e44), - (0x1e45, 0x1e46), - (0x1e47, 0x1e48), - (0x1e49, 0x1e4a), - (0x1e4b, 0x1e4c), - (0x1e4d, 0x1e4e), - (0x1e4f, 0x1e50), - (0x1e51, 0x1e52), - (0x1e53, 0x1e54), - (0x1e55, 0x1e56), - (0x1e57, 0x1e58), - (0x1e59, 0x1e5a), - (0x1e5b, 0x1e5c), - (0x1e5d, 0x1e5e), - (0x1e5f, 0x1e60), - (0x1e61, 0x1e62), - (0x1e63, 0x1e64), - (0x1e65, 0x1e66), - (0x1e67, 0x1e68), - (0x1e69, 0x1e6a), - (0x1e6b, 0x1e6c), - (0x1e6d, 0x1e6e), - (0x1e6f, 0x1e70), - (0x1e71, 0x1e72), - (0x1e73, 0x1e74), - (0x1e75, 0x1e76), - (0x1e77, 0x1e78), - (0x1e79, 0x1e7a), - (0x1e7b, 0x1e7c), - (0x1e7d, 0x1e7e), - (0x1e7f, 0x1e80), - (0x1e81, 0x1e82), - (0x1e83, 0x1e84), - (0x1e85, 0x1e86), - (0x1e87, 0x1e88), - (0x1e89, 0x1e8a), - (0x1e8b, 0x1e8c), - (0x1e8d, 0x1e8e), - (0x1e8f, 0x1e90), - (0x1e91, 0x1e92), - (0x1e93, 0x1e94), - (0x1e95, 0x1e9a), - (0x1e9c, 0x1e9e), - (0x1e9f, 0x1ea0), - (0x1ea1, 0x1ea2), - (0x1ea3, 0x1ea4), - (0x1ea5, 0x1ea6), - (0x1ea7, 0x1ea8), - (0x1ea9, 0x1eaa), - (0x1eab, 0x1eac), - (0x1ead, 0x1eae), - (0x1eaf, 0x1eb0), - (0x1eb1, 0x1eb2), - (0x1eb3, 0x1eb4), - (0x1eb5, 0x1eb6), - (0x1eb7, 0x1eb8), - (0x1eb9, 0x1eba), - (0x1ebb, 0x1ebc), - (0x1ebd, 0x1ebe), - (0x1ebf, 0x1ec0), - (0x1ec1, 0x1ec2), - (0x1ec3, 0x1ec4), - (0x1ec5, 0x1ec6), - (0x1ec7, 0x1ec8), - (0x1ec9, 0x1eca), - (0x1ecb, 0x1ecc), - (0x1ecd, 0x1ece), - (0x1ecf, 0x1ed0), - (0x1ed1, 0x1ed2), - (0x1ed3, 0x1ed4), - (0x1ed5, 0x1ed6), - (0x1ed7, 0x1ed8), - (0x1ed9, 0x1eda), - (0x1edb, 0x1edc), - (0x1edd, 0x1ede), - (0x1edf, 0x1ee0), - (0x1ee1, 0x1ee2), - (0x1ee3, 0x1ee4), - (0x1ee5, 0x1ee6), - (0x1ee7, 0x1ee8), - (0x1ee9, 0x1eea), - (0x1eeb, 0x1eec), - (0x1eed, 0x1eee), - (0x1eef, 0x1ef0), - (0x1ef1, 0x1ef2), - (0x1ef3, 0x1ef4), - (0x1ef5, 0x1ef6), - (0x1ef7, 0x1ef8), - (0x1ef9, 0x1efa), - (0x1efb, 0x1efc), - (0x1efd, 0x1efe), - (0x1eff, 0x1f08), - (0x1f10, 0x1f16), - (0x1f20, 0x1f28), - (0x1f30, 0x1f38), - (0x1f40, 0x1f46), - (0x1f50, 0x1f58), - (0x1f60, 0x1f68), - (0x1f70, 0x1f71), - (0x1f72, 0x1f73), - (0x1f74, 0x1f75), - (0x1f76, 0x1f77), - (0x1f78, 0x1f79), - (0x1f7a, 0x1f7b), - (0x1f7c, 0x1f7d), - (0x1fb0, 0x1fb2), - (0x1fb6, 0x1fb7), - (0x1fc6, 0x1fc7), - (0x1fd0, 0x1fd3), - (0x1fd6, 0x1fd8), - (0x1fe0, 0x1fe3), - (0x1fe4, 0x1fe8), - (0x1ff6, 0x1ff7), - (0x214e, 0x214f), - (0x2184, 0x2185), - (0x2c30, 0x2c5f), - (0x2c61, 0x2c62), - (0x2c65, 0x2c67), - (0x2c68, 0x2c69), - (0x2c6a, 0x2c6b), - (0x2c6c, 0x2c6d), - (0x2c71, 0x2c72), - (0x2c73, 0x2c75), - (0x2c76, 0x2c7c), - (0x2c81, 0x2c82), - (0x2c83, 0x2c84), - (0x2c85, 0x2c86), - (0x2c87, 0x2c88), - (0x2c89, 0x2c8a), - (0x2c8b, 0x2c8c), - (0x2c8d, 0x2c8e), - (0x2c8f, 0x2c90), - (0x2c91, 0x2c92), - (0x2c93, 0x2c94), - (0x2c95, 0x2c96), - (0x2c97, 0x2c98), - (0x2c99, 0x2c9a), - (0x2c9b, 0x2c9c), - (0x2c9d, 0x2c9e), - (0x2c9f, 0x2ca0), - (0x2ca1, 0x2ca2), - (0x2ca3, 0x2ca4), - (0x2ca5, 0x2ca6), - (0x2ca7, 0x2ca8), - (0x2ca9, 0x2caa), - (0x2cab, 0x2cac), - (0x2cad, 0x2cae), - (0x2caf, 0x2cb0), - (0x2cb1, 0x2cb2), - (0x2cb3, 0x2cb4), - (0x2cb5, 0x2cb6), - (0x2cb7, 0x2cb8), - (0x2cb9, 0x2cba), - (0x2cbb, 0x2cbc), - (0x2cbd, 0x2cbe), - (0x2cbf, 0x2cc0), - (0x2cc1, 0x2cc2), - (0x2cc3, 0x2cc4), - (0x2cc5, 0x2cc6), - (0x2cc7, 0x2cc8), - (0x2cc9, 0x2cca), - (0x2ccb, 0x2ccc), - (0x2ccd, 0x2cce), - (0x2ccf, 0x2cd0), - (0x2cd1, 0x2cd2), - (0x2cd3, 0x2cd4), - (0x2cd5, 0x2cd6), - (0x2cd7, 0x2cd8), - (0x2cd9, 0x2cda), - (0x2cdb, 0x2cdc), - (0x2cdd, 0x2cde), - (0x2cdf, 0x2ce0), - (0x2ce1, 0x2ce2), - (0x2ce3, 0x2ce5), - (0x2cec, 0x2ced), - (0x2cee, 0x2cf2), - (0x2cf3, 0x2cf4), - (0x2d00, 0x2d26), - (0x2d27, 0x2d28), - (0x2d2d, 0x2d2e), - (0x2d30, 0x2d68), - (0x2d7f, 0x2d97), - (0x2da0, 0x2da7), - (0x2da8, 0x2daf), - (0x2db0, 0x2db7), - (0x2db8, 0x2dbf), - (0x2dc0, 0x2dc7), - (0x2dc8, 0x2dcf), - (0x2dd0, 0x2dd7), - (0x2dd8, 0x2ddf), - (0x2de0, 0x2e00), - (0x2e2f, 0x2e30), - (0x3005, 0x3008), - (0x302a, 0x302e), - (0x303c, 0x303d), - (0x3041, 0x3097), - (0x3099, 0x309b), - (0x309d, 0x309f), - (0x30a1, 0x30fb), - (0x30fc, 0x30ff), - (0x3105, 0x312e), - (0x31a0, 0x31bb), - (0x31f0, 0x3200), - (0x3400, 0x4db6), - (0x4e00, 0x9fcd), - (0xa000, 0xa48d), - (0xa4d0, 0xa4fe), - (0xa500, 0xa60d), - (0xa610, 0xa62c), - (0xa641, 0xa642), - (0xa643, 0xa644), - (0xa645, 0xa646), - (0xa647, 0xa648), - (0xa649, 0xa64a), - (0xa64b, 0xa64c), - (0xa64d, 0xa64e), - (0xa64f, 0xa650), - (0xa651, 0xa652), - (0xa653, 0xa654), - (0xa655, 0xa656), - (0xa657, 0xa658), - (0xa659, 0xa65a), - (0xa65b, 0xa65c), - (0xa65d, 0xa65e), - (0xa65f, 0xa660), - (0xa661, 0xa662), - (0xa663, 0xa664), - (0xa665, 0xa666), - (0xa667, 0xa668), - (0xa669, 0xa66a), - (0xa66b, 0xa66c), - (0xa66d, 0xa670), - (0xa674, 0xa67e), - (0xa67f, 0xa680), - (0xa681, 0xa682), - (0xa683, 0xa684), - (0xa685, 0xa686), - (0xa687, 0xa688), - (0xa689, 0xa68a), - (0xa68b, 0xa68c), - (0xa68d, 0xa68e), - (0xa68f, 0xa690), - (0xa691, 0xa692), - (0xa693, 0xa694), - (0xa695, 0xa696), - (0xa697, 0xa698), - (0xa69f, 0xa6e6), - (0xa6f0, 0xa6f2), - (0xa717, 0xa720), - (0xa723, 0xa724), - (0xa725, 0xa726), - (0xa727, 0xa728), - (0xa729, 0xa72a), - (0xa72b, 0xa72c), - (0xa72d, 0xa72e), - (0xa72f, 0xa732), - (0xa733, 0xa734), - (0xa735, 0xa736), - (0xa737, 0xa738), - (0xa739, 0xa73a), - (0xa73b, 0xa73c), - (0xa73d, 0xa73e), - (0xa73f, 0xa740), - (0xa741, 0xa742), - (0xa743, 0xa744), - (0xa745, 0xa746), - (0xa747, 0xa748), - (0xa749, 0xa74a), - (0xa74b, 0xa74c), - (0xa74d, 0xa74e), - (0xa74f, 0xa750), - (0xa751, 0xa752), - (0xa753, 0xa754), - (0xa755, 0xa756), - (0xa757, 0xa758), - (0xa759, 0xa75a), - (0xa75b, 0xa75c), - (0xa75d, 0xa75e), - (0xa75f, 0xa760), - (0xa761, 0xa762), - (0xa763, 0xa764), - (0xa765, 0xa766), - (0xa767, 0xa768), - (0xa769, 0xa76a), - (0xa76b, 0xa76c), - (0xa76d, 0xa76e), - (0xa76f, 0xa770), - (0xa771, 0xa779), - (0xa77a, 0xa77b), - (0xa77c, 0xa77d), - (0xa77f, 0xa780), - (0xa781, 0xa782), - (0xa783, 0xa784), - (0xa785, 0xa786), - (0xa787, 0xa789), - (0xa78c, 0xa78d), - (0xa78e, 0xa78f), - (0xa791, 0xa792), - (0xa793, 0xa794), - (0xa7a1, 0xa7a2), - (0xa7a3, 0xa7a4), - (0xa7a5, 0xa7a6), - (0xa7a7, 0xa7a8), - (0xa7a9, 0xa7aa), - (0xa7fa, 0xa828), - (0xa840, 0xa874), - (0xa880, 0xa8c5), - (0xa8d0, 0xa8da), - (0xa8e0, 0xa8f8), - (0xa8fb, 0xa8fc), - (0xa900, 0xa92e), - (0xa930, 0xa954), - (0xa980, 0xa9c1), - (0xa9cf, 0xa9da), - (0xaa00, 0xaa37), - (0xaa40, 0xaa4e), - (0xaa50, 0xaa5a), - (0xaa60, 0xaa77), - (0xaa7a, 0xaa7c), - (0xaa80, 0xaac3), - (0xaadb, 0xaade), - (0xaae0, 0xaaf0), - (0xaaf2, 0xaaf7), - (0xab01, 0xab07), - (0xab09, 0xab0f), - (0xab11, 0xab17), - (0xab20, 0xab27), - (0xab28, 0xab2f), - (0xabc0, 0xabeb), - (0xabec, 0xabee), - (0xabf0, 0xabfa), - (0xac00, 0xd7a4), - (0xfa0e, 0xfa10), - (0xfa11, 0xfa12), - (0xfa13, 0xfa15), - (0xfa1f, 0xfa20), - (0xfa21, 0xfa22), - (0xfa23, 0xfa25), - (0xfa27, 0xfa2a), - (0xfb1e, 0xfb1f), - (0xfe20, 0xfe27), - (0xfe73, 0xfe74), - (0x10000, 0x1000c), - (0x1000d, 0x10027), - (0x10028, 0x1003b), - (0x1003c, 0x1003e), - (0x1003f, 0x1004e), - (0x10050, 0x1005e), - (0x10080, 0x100fb), - (0x101fd, 0x101fe), - (0x10280, 0x1029d), - (0x102a0, 0x102d1), - (0x10300, 0x1031f), - (0x10330, 0x10341), - (0x10342, 0x1034a), - (0x10380, 0x1039e), - (0x103a0, 0x103c4), - (0x103c8, 0x103d0), - (0x10428, 0x1049e), - (0x104a0, 0x104aa), - (0x10800, 0x10806), - (0x10808, 0x10809), - (0x1080a, 0x10836), - (0x10837, 0x10839), - (0x1083c, 0x1083d), - (0x1083f, 0x10856), - (0x10900, 0x10916), - (0x10920, 0x1093a), - (0x10980, 0x109b8), - (0x109be, 0x109c0), - (0x10a00, 0x10a04), - (0x10a05, 0x10a07), - (0x10a0c, 0x10a14), - (0x10a15, 0x10a18), - (0x10a19, 0x10a34), - (0x10a38, 0x10a3b), - (0x10a3f, 0x10a40), - (0x10a60, 0x10a7d), - (0x10b00, 0x10b36), - (0x10b40, 0x10b56), - (0x10b60, 0x10b73), - (0x10c00, 0x10c49), - (0x11000, 0x11047), - (0x11066, 0x11070), - (0x11080, 0x110bb), - (0x110d0, 0x110e9), - (0x110f0, 0x110fa), - (0x11100, 0x11135), - (0x11136, 0x11140), - (0x11180, 0x111c5), - (0x111d0, 0x111da), - (0x11680, 0x116b8), - (0x116c0, 0x116ca), - (0x12000, 0x1236f), - (0x13000, 0x1342f), - (0x16800, 0x16a39), - (0x16f00, 0x16f45), - (0x16f50, 0x16f7f), - (0x16f8f, 0x16fa0), - (0x1b000, 0x1b002), - (0x20000, 0x2a6d7), - (0x2a700, 0x2b735), - (0x2b740, 0x2b81e), - ), - 'CONTEXTJ': ( - (0x200c, 0x200e), - ), - 'CONTEXTO': ( - (0xb7, 0xb8), - (0x375, 0x376), - (0x5f3, 0x5f5), - (0x660, 0x66a), - (0x6f0, 0x6fa), - (0x30fb, 0x30fc), - ), -} diff --git a/Contents/Libraries/Shared/requests/packages/idna/intranges.py b/Contents/Libraries/Shared/requests/packages/idna/intranges.py deleted file mode 100644 index ee8a175d6..000000000 --- a/Contents/Libraries/Shared/requests/packages/idna/intranges.py +++ /dev/null @@ -1,46 +0,0 @@ -""" -Given a list of integers, made up of (hopefully) a small number of long runs -of consecutive integers, compute a representation of the form -((start1, end1), (start2, end2) ...). Then answer the question "was x present -in the original list?" in time O(log(# runs)). -""" - -import bisect - -def intranges_from_list(list_): - """Represent a list of integers as a sequence of ranges: - ((start_0, end_0), (start_1, end_1), ...), such that the original - integers are exactly those x such that start_i <= x < end_i for some i. - """ - - sorted_list = sorted(list_) - ranges = [] - last_write = -1 - for i in range(len(sorted_list)): - if i+1 < len(sorted_list): - if sorted_list[i] == sorted_list[i+1]-1: - continue - current_range = sorted_list[last_write+1:i+1] - range_tuple = (current_range[0], current_range[-1] + 1) - ranges.append(range_tuple) - last_write = i - - return tuple(ranges) - - -def intranges_contain(int_, ranges): - """Determine if `int_` falls into one of the ranges in `ranges`.""" - tuple_ = (int_, int_) - pos = bisect.bisect_left(ranges, tuple_) - # we could be immediately ahead of a tuple (start, end) - # with start < int_ <= end - if pos > 0: - left, right = ranges[pos-1] - if left <= int_ < right: - return True - # or we could be immediately behind a tuple (int_, end) - if pos < len(ranges): - left, _ = ranges[pos] - if left == int_: - return True - return False diff --git a/Contents/Libraries/Shared/requests/packages/idna/uts46data.py b/Contents/Libraries/Shared/requests/packages/idna/uts46data.py deleted file mode 100644 index 48da8408f..000000000 --- a/Contents/Libraries/Shared/requests/packages/idna/uts46data.py +++ /dev/null @@ -1,7633 +0,0 @@ -# This file is automatically generated by tools/build-uts46data.py -# vim: set fileencoding=utf-8 : - -"""IDNA Mapping Table from UTS46.""" - - -def _seg_0(): - return [ - (0x0, '3'), - (0x1, '3'), - (0x2, '3'), - (0x3, '3'), - (0x4, '3'), - (0x5, '3'), - (0x6, '3'), - (0x7, '3'), - (0x8, '3'), - (0x9, '3'), - (0xA, '3'), - (0xB, '3'), - (0xC, '3'), - (0xD, '3'), - (0xE, '3'), - (0xF, '3'), - (0x10, '3'), - (0x11, '3'), - (0x12, '3'), - (0x13, '3'), - (0x14, '3'), - (0x15, '3'), - (0x16, '3'), - (0x17, '3'), - (0x18, '3'), - (0x19, '3'), - (0x1A, '3'), - (0x1B, '3'), - (0x1C, '3'), - (0x1D, '3'), - (0x1E, '3'), - (0x1F, '3'), - (0x20, '3'), - (0x21, '3'), - (0x22, '3'), - (0x23, '3'), - (0x24, '3'), - (0x25, '3'), - (0x26, '3'), - (0x27, '3'), - (0x28, '3'), - (0x29, '3'), - (0x2A, '3'), - (0x2B, '3'), - (0x2C, '3'), - (0x2D, 'V'), - (0x2E, 'V'), - (0x2F, '3'), - (0x30, 'V'), - (0x31, 'V'), - (0x32, 'V'), - (0x33, 'V'), - (0x34, 'V'), - (0x35, 'V'), - (0x36, 'V'), - (0x37, 'V'), - (0x38, 'V'), - (0x39, 'V'), - (0x3A, '3'), - (0x3B, '3'), - (0x3C, '3'), - (0x3D, '3'), - (0x3E, '3'), - (0x3F, '3'), - (0x40, '3'), - (0x41, 'M', u'a'), - (0x42, 'M', u'b'), - (0x43, 'M', u'c'), - (0x44, 'M', u'd'), - (0x45, 'M', u'e'), - (0x46, 'M', u'f'), - (0x47, 'M', u'g'), - (0x48, 'M', u'h'), - (0x49, 'M', u'i'), - (0x4A, 'M', u'j'), - (0x4B, 'M', u'k'), - (0x4C, 'M', u'l'), - (0x4D, 'M', u'm'), - (0x4E, 'M', u'n'), - (0x4F, 'M', u'o'), - (0x50, 'M', u'p'), - (0x51, 'M', u'q'), - (0x52, 'M', u'r'), - (0x53, 'M', u's'), - (0x54, 'M', u't'), - (0x55, 'M', u'u'), - (0x56, 'M', u'v'), - (0x57, 'M', u'w'), - (0x58, 'M', u'x'), - (0x59, 'M', u'y'), - (0x5A, 'M', u'z'), - (0x5B, '3'), - (0x5C, '3'), - (0x5D, '3'), - (0x5E, '3'), - (0x5F, '3'), - (0x60, '3'), - (0x61, 'V'), - (0x62, 'V'), - (0x63, 'V'), - ] - -def _seg_1(): - return [ - (0x64, 'V'), - (0x65, 'V'), - (0x66, 'V'), - (0x67, 'V'), - (0x68, 'V'), - (0x69, 'V'), - (0x6A, 'V'), - (0x6B, 'V'), - (0x6C, 'V'), - (0x6D, 'V'), - (0x6E, 'V'), - (0x6F, 'V'), - (0x70, 'V'), - (0x71, 'V'), - (0x72, 'V'), - (0x73, 'V'), - (0x74, 'V'), - (0x75, 'V'), - (0x76, 'V'), - (0x77, 'V'), - (0x78, 'V'), - (0x79, 'V'), - (0x7A, 'V'), - (0x7B, '3'), - (0x7C, '3'), - (0x7D, '3'), - (0x7E, '3'), - (0x7F, '3'), - (0x80, 'X'), - (0x81, 'X'), - (0x82, 'X'), - (0x83, 'X'), - (0x84, 'X'), - (0x85, 'X'), - (0x86, 'X'), - (0x87, 'X'), - (0x88, 'X'), - (0x89, 'X'), - (0x8A, 'X'), - (0x8B, 'X'), - (0x8C, 'X'), - (0x8D, 'X'), - (0x8E, 'X'), - (0x8F, 'X'), - (0x90, 'X'), - (0x91, 'X'), - (0x92, 'X'), - (0x93, 'X'), - (0x94, 'X'), - (0x95, 'X'), - (0x96, 'X'), - (0x97, 'X'), - (0x98, 'X'), - (0x99, 'X'), - (0x9A, 'X'), - (0x9B, 'X'), - (0x9C, 'X'), - (0x9D, 'X'), - (0x9E, 'X'), - (0x9F, 'X'), - (0xA0, '3', u' '), - (0xA1, 'V'), - (0xA2, 'V'), - (0xA3, 'V'), - (0xA4, 'V'), - (0xA5, 'V'), - (0xA6, 'V'), - (0xA7, 'V'), - (0xA8, '3', u' ̈'), - (0xA9, 'V'), - (0xAA, 'M', u'a'), - (0xAB, 'V'), - (0xAC, 'V'), - (0xAD, 'I'), - (0xAE, 'V'), - (0xAF, '3', u' ̄'), - (0xB0, 'V'), - (0xB1, 'V'), - (0xB2, 'M', u'2'), - (0xB3, 'M', u'3'), - (0xB4, '3', u' ́'), - (0xB5, 'M', u'μ'), - (0xB6, 'V'), - (0xB7, 'V'), - (0xB8, '3', u' ̧'), - (0xB9, 'M', u'1'), - (0xBA, 'M', u'o'), - (0xBB, 'V'), - (0xBC, 'M', u'1⁄4'), - (0xBD, 'M', u'1⁄2'), - (0xBE, 'M', u'3⁄4'), - (0xBF, 'V'), - (0xC0, 'M', u'à'), - (0xC1, 'M', u'á'), - (0xC2, 'M', u'â'), - (0xC3, 'M', u'ã'), - (0xC4, 'M', u'ä'), - (0xC5, 'M', u'å'), - (0xC6, 'M', u'æ'), - (0xC7, 'M', u'ç'), - ] - -def _seg_2(): - return [ - (0xC8, 'M', u'è'), - (0xC9, 'M', u'é'), - (0xCA, 'M', u'ê'), - (0xCB, 'M', u'ë'), - (0xCC, 'M', u'ì'), - (0xCD, 'M', u'í'), - (0xCE, 'M', u'î'), - (0xCF, 'M', u'ï'), - (0xD0, 'M', u'ð'), - (0xD1, 'M', u'ñ'), - (0xD2, 'M', u'ò'), - (0xD3, 'M', u'ó'), - (0xD4, 'M', u'ô'), - (0xD5, 'M', u'õ'), - (0xD6, 'M', u'ö'), - (0xD7, 'V'), - (0xD8, 'M', u'ø'), - (0xD9, 'M', u'ù'), - (0xDA, 'M', u'ú'), - (0xDB, 'M', u'û'), - (0xDC, 'M', u'ü'), - (0xDD, 'M', u'ý'), - (0xDE, 'M', u'þ'), - (0xDF, 'D', u'ss'), - (0xE0, 'V'), - (0xE1, 'V'), - (0xE2, 'V'), - (0xE3, 'V'), - (0xE4, 'V'), - (0xE5, 'V'), - (0xE6, 'V'), - (0xE7, 'V'), - (0xE8, 'V'), - (0xE9, 'V'), - (0xEA, 'V'), - (0xEB, 'V'), - (0xEC, 'V'), - (0xED, 'V'), - (0xEE, 'V'), - (0xEF, 'V'), - (0xF0, 'V'), - (0xF1, 'V'), - (0xF2, 'V'), - (0xF3, 'V'), - (0xF4, 'V'), - (0xF5, 'V'), - (0xF6, 'V'), - (0xF7, 'V'), - (0xF8, 'V'), - (0xF9, 'V'), - (0xFA, 'V'), - (0xFB, 'V'), - (0xFC, 'V'), - (0xFD, 'V'), - (0xFE, 'V'), - (0xFF, 'V'), - (0x100, 'M', u'ā'), - (0x101, 'V'), - (0x102, 'M', u'ă'), - (0x103, 'V'), - (0x104, 'M', u'ą'), - (0x105, 'V'), - (0x106, 'M', u'ć'), - (0x107, 'V'), - (0x108, 'M', u'ĉ'), - (0x109, 'V'), - (0x10A, 'M', u'ċ'), - (0x10B, 'V'), - (0x10C, 'M', u'č'), - (0x10D, 'V'), - (0x10E, 'M', u'ď'), - (0x10F, 'V'), - (0x110, 'M', u'đ'), - (0x111, 'V'), - (0x112, 'M', u'ē'), - (0x113, 'V'), - (0x114, 'M', u'ĕ'), - (0x115, 'V'), - (0x116, 'M', u'ė'), - (0x117, 'V'), - (0x118, 'M', u'ę'), - (0x119, 'V'), - (0x11A, 'M', u'ě'), - (0x11B, 'V'), - (0x11C, 'M', u'ĝ'), - (0x11D, 'V'), - (0x11E, 'M', u'ğ'), - (0x11F, 'V'), - (0x120, 'M', u'ġ'), - (0x121, 'V'), - (0x122, 'M', u'ģ'), - (0x123, 'V'), - (0x124, 'M', u'ĥ'), - (0x125, 'V'), - (0x126, 'M', u'ħ'), - (0x127, 'V'), - (0x128, 'M', u'ĩ'), - (0x129, 'V'), - (0x12A, 'M', u'ī'), - (0x12B, 'V'), - ] - -def _seg_3(): - return [ - (0x12C, 'M', u'ĭ'), - (0x12D, 'V'), - (0x12E, 'M', u'į'), - (0x12F, 'V'), - (0x130, 'M', u'i̇'), - (0x131, 'V'), - (0x132, 'M', u'ij'), - (0x134, 'M', u'ĵ'), - (0x135, 'V'), - (0x136, 'M', u'ķ'), - (0x137, 'V'), - (0x139, 'M', u'ĺ'), - (0x13A, 'V'), - (0x13B, 'M', u'ļ'), - (0x13C, 'V'), - (0x13D, 'M', u'ľ'), - (0x13E, 'V'), - (0x13F, 'M', u'l·'), - (0x141, 'M', u'ł'), - (0x142, 'V'), - (0x143, 'M', u'ń'), - (0x144, 'V'), - (0x145, 'M', u'ņ'), - (0x146, 'V'), - (0x147, 'M', u'ň'), - (0x148, 'V'), - (0x149, 'M', u'ʼn'), - (0x14A, 'M', u'ŋ'), - (0x14B, 'V'), - (0x14C, 'M', u'ō'), - (0x14D, 'V'), - (0x14E, 'M', u'ŏ'), - (0x14F, 'V'), - (0x150, 'M', u'ő'), - (0x151, 'V'), - (0x152, 'M', u'œ'), - (0x153, 'V'), - (0x154, 'M', u'ŕ'), - (0x155, 'V'), - (0x156, 'M', u'ŗ'), - (0x157, 'V'), - (0x158, 'M', u'ř'), - (0x159, 'V'), - (0x15A, 'M', u'ś'), - (0x15B, 'V'), - (0x15C, 'M', u'ŝ'), - (0x15D, 'V'), - (0x15E, 'M', u'ş'), - (0x15F, 'V'), - (0x160, 'M', u'š'), - (0x161, 'V'), - (0x162, 'M', u'ţ'), - (0x163, 'V'), - (0x164, 'M', u'ť'), - (0x165, 'V'), - (0x166, 'M', u'ŧ'), - (0x167, 'V'), - (0x168, 'M', u'ũ'), - (0x169, 'V'), - (0x16A, 'M', u'ū'), - (0x16B, 'V'), - (0x16C, 'M', u'ŭ'), - (0x16D, 'V'), - (0x16E, 'M', u'ů'), - (0x16F, 'V'), - (0x170, 'M', u'ű'), - (0x171, 'V'), - (0x172, 'M', u'ų'), - (0x173, 'V'), - (0x174, 'M', u'ŵ'), - (0x175, 'V'), - (0x176, 'M', u'ŷ'), - (0x177, 'V'), - (0x178, 'M', u'ÿ'), - (0x179, 'M', u'ź'), - (0x17A, 'V'), - (0x17B, 'M', u'ż'), - (0x17C, 'V'), - (0x17D, 'M', u'ž'), - (0x17E, 'V'), - (0x17F, 'M', u's'), - (0x180, 'V'), - (0x181, 'M', u'ɓ'), - (0x182, 'M', u'ƃ'), - (0x183, 'V'), - (0x184, 'M', u'ƅ'), - (0x185, 'V'), - (0x186, 'M', u'ɔ'), - (0x187, 'M', u'ƈ'), - (0x188, 'V'), - (0x189, 'M', u'ɖ'), - (0x18A, 'M', u'ɗ'), - (0x18B, 'M', u'ƌ'), - (0x18C, 'V'), - (0x18E, 'M', u'ǝ'), - (0x18F, 'M', u'ə'), - (0x190, 'M', u'ɛ'), - (0x191, 'M', u'ƒ'), - (0x192, 'V'), - (0x193, 'M', u'ɠ'), - ] - -def _seg_4(): - return [ - (0x194, 'M', u'ɣ'), - (0x195, 'V'), - (0x196, 'M', u'ɩ'), - (0x197, 'M', u'ɨ'), - (0x198, 'M', u'ƙ'), - (0x199, 'V'), - (0x19C, 'M', u'ɯ'), - (0x19D, 'M', u'ɲ'), - (0x19E, 'V'), - (0x19F, 'M', u'ɵ'), - (0x1A0, 'M', u'ơ'), - (0x1A1, 'V'), - (0x1A2, 'M', u'ƣ'), - (0x1A3, 'V'), - (0x1A4, 'M', u'ƥ'), - (0x1A5, 'V'), - (0x1A6, 'M', u'ʀ'), - (0x1A7, 'M', u'ƨ'), - (0x1A8, 'V'), - (0x1A9, 'M', u'ʃ'), - (0x1AA, 'V'), - (0x1AC, 'M', u'ƭ'), - (0x1AD, 'V'), - (0x1AE, 'M', u'ʈ'), - (0x1AF, 'M', u'ư'), - (0x1B0, 'V'), - (0x1B1, 'M', u'ʊ'), - (0x1B2, 'M', u'ʋ'), - (0x1B3, 'M', u'ƴ'), - (0x1B4, 'V'), - (0x1B5, 'M', u'ƶ'), - (0x1B6, 'V'), - (0x1B7, 'M', u'ʒ'), - (0x1B8, 'M', u'ƹ'), - (0x1B9, 'V'), - (0x1BC, 'M', u'ƽ'), - (0x1BD, 'V'), - (0x1C4, 'M', u'dž'), - (0x1C7, 'M', u'lj'), - (0x1CA, 'M', u'nj'), - (0x1CD, 'M', u'ǎ'), - (0x1CE, 'V'), - (0x1CF, 'M', u'ǐ'), - (0x1D0, 'V'), - (0x1D1, 'M', u'ǒ'), - (0x1D2, 'V'), - (0x1D3, 'M', u'ǔ'), - (0x1D4, 'V'), - (0x1D5, 'M', u'ǖ'), - (0x1D6, 'V'), - (0x1D7, 'M', u'ǘ'), - (0x1D8, 'V'), - (0x1D9, 'M', u'ǚ'), - (0x1DA, 'V'), - (0x1DB, 'M', u'ǜ'), - (0x1DC, 'V'), - (0x1DE, 'M', u'ǟ'), - (0x1DF, 'V'), - (0x1E0, 'M', u'ǡ'), - (0x1E1, 'V'), - (0x1E2, 'M', u'ǣ'), - (0x1E3, 'V'), - (0x1E4, 'M', u'ǥ'), - (0x1E5, 'V'), - (0x1E6, 'M', u'ǧ'), - (0x1E7, 'V'), - (0x1E8, 'M', u'ǩ'), - (0x1E9, 'V'), - (0x1EA, 'M', u'ǫ'), - (0x1EB, 'V'), - (0x1EC, 'M', u'ǭ'), - (0x1ED, 'V'), - (0x1EE, 'M', u'ǯ'), - (0x1EF, 'V'), - (0x1F1, 'M', u'dz'), - (0x1F4, 'M', u'ǵ'), - (0x1F5, 'V'), - (0x1F6, 'M', u'ƕ'), - (0x1F7, 'M', u'ƿ'), - (0x1F8, 'M', u'ǹ'), - (0x1F9, 'V'), - (0x1FA, 'M', u'ǻ'), - (0x1FB, 'V'), - (0x1FC, 'M', u'ǽ'), - (0x1FD, 'V'), - (0x1FE, 'M', u'ǿ'), - (0x1FF, 'V'), - (0x200, 'M', u'ȁ'), - (0x201, 'V'), - (0x202, 'M', u'ȃ'), - (0x203, 'V'), - (0x204, 'M', u'ȅ'), - (0x205, 'V'), - (0x206, 'M', u'ȇ'), - (0x207, 'V'), - (0x208, 'M', u'ȉ'), - (0x209, 'V'), - (0x20A, 'M', u'ȋ'), - (0x20B, 'V'), - (0x20C, 'M', u'ȍ'), - ] - -def _seg_5(): - return [ - (0x20D, 'V'), - (0x20E, 'M', u'ȏ'), - (0x20F, 'V'), - (0x210, 'M', u'ȑ'), - (0x211, 'V'), - (0x212, 'M', u'ȓ'), - (0x213, 'V'), - (0x214, 'M', u'ȕ'), - (0x215, 'V'), - (0x216, 'M', u'ȗ'), - (0x217, 'V'), - (0x218, 'M', u'ș'), - (0x219, 'V'), - (0x21A, 'M', u'ț'), - (0x21B, 'V'), - (0x21C, 'M', u'ȝ'), - (0x21D, 'V'), - (0x21E, 'M', u'ȟ'), - (0x21F, 'V'), - (0x220, 'M', u'ƞ'), - (0x221, 'V'), - (0x222, 'M', u'ȣ'), - (0x223, 'V'), - (0x224, 'M', u'ȥ'), - (0x225, 'V'), - (0x226, 'M', u'ȧ'), - (0x227, 'V'), - (0x228, 'M', u'ȩ'), - (0x229, 'V'), - (0x22A, 'M', u'ȫ'), - (0x22B, 'V'), - (0x22C, 'M', u'ȭ'), - (0x22D, 'V'), - (0x22E, 'M', u'ȯ'), - (0x22F, 'V'), - (0x230, 'M', u'ȱ'), - (0x231, 'V'), - (0x232, 'M', u'ȳ'), - (0x233, 'V'), - (0x23A, 'M', u'ⱥ'), - (0x23B, 'M', u'ȼ'), - (0x23C, 'V'), - (0x23D, 'M', u'ƚ'), - (0x23E, 'M', u'ⱦ'), - (0x23F, 'V'), - (0x241, 'M', u'ɂ'), - (0x242, 'V'), - (0x243, 'M', u'ƀ'), - (0x244, 'M', u'ʉ'), - (0x245, 'M', u'ʌ'), - (0x246, 'M', u'ɇ'), - (0x247, 'V'), - (0x248, 'M', u'ɉ'), - (0x249, 'V'), - (0x24A, 'M', u'ɋ'), - (0x24B, 'V'), - (0x24C, 'M', u'ɍ'), - (0x24D, 'V'), - (0x24E, 'M', u'ɏ'), - (0x24F, 'V'), - (0x2B0, 'M', u'h'), - (0x2B1, 'M', u'ɦ'), - (0x2B2, 'M', u'j'), - (0x2B3, 'M', u'r'), - (0x2B4, 'M', u'ɹ'), - (0x2B5, 'M', u'ɻ'), - (0x2B6, 'M', u'ʁ'), - (0x2B7, 'M', u'w'), - (0x2B8, 'M', u'y'), - (0x2B9, 'V'), - (0x2D8, '3', u' ̆'), - (0x2D9, '3', u' ̇'), - (0x2DA, '3', u' ̊'), - (0x2DB, '3', u' ̨'), - (0x2DC, '3', u' ̃'), - (0x2DD, '3', u' ̋'), - (0x2DE, 'V'), - (0x2E0, 'M', u'ɣ'), - (0x2E1, 'M', u'l'), - (0x2E2, 'M', u's'), - (0x2E3, 'M', u'x'), - (0x2E4, 'M', u'ʕ'), - (0x2E5, 'V'), - (0x340, 'M', u'̀'), - (0x341, 'M', u'́'), - (0x342, 'V'), - (0x343, 'M', u'̓'), - (0x344, 'M', u'̈́'), - (0x345, 'M', u'ι'), - (0x346, 'V'), - (0x34F, 'I'), - (0x350, 'V'), - (0x370, 'M', u'ͱ'), - (0x371, 'V'), - (0x372, 'M', u'ͳ'), - (0x373, 'V'), - (0x374, 'M', u'ʹ'), - (0x375, 'V'), - (0x376, 'M', u'ͷ'), - (0x377, 'V'), - ] - -def _seg_6(): - return [ - (0x378, 'X'), - (0x37A, '3', u' ι'), - (0x37B, 'V'), - (0x37E, '3', u';'), - (0x37F, 'X'), - (0x384, '3', u' ́'), - (0x385, '3', u' ̈́'), - (0x386, 'M', u'ά'), - (0x387, 'M', u'·'), - (0x388, 'M', u'έ'), - (0x389, 'M', u'ή'), - (0x38A, 'M', u'ί'), - (0x38B, 'X'), - (0x38C, 'M', u'ό'), - (0x38D, 'X'), - (0x38E, 'M', u'ύ'), - (0x38F, 'M', u'ώ'), - (0x390, 'V'), - (0x391, 'M', u'α'), - (0x392, 'M', u'β'), - (0x393, 'M', u'γ'), - (0x394, 'M', u'δ'), - (0x395, 'M', u'ε'), - (0x396, 'M', u'ζ'), - (0x397, 'M', u'η'), - (0x398, 'M', u'θ'), - (0x399, 'M', u'ι'), - (0x39A, 'M', u'κ'), - (0x39B, 'M', u'λ'), - (0x39C, 'M', u'μ'), - (0x39D, 'M', u'ν'), - (0x39E, 'M', u'ξ'), - (0x39F, 'M', u'ο'), - (0x3A0, 'M', u'π'), - (0x3A1, 'M', u'ρ'), - (0x3A2, 'X'), - (0x3A3, 'M', u'σ'), - (0x3A4, 'M', u'τ'), - (0x3A5, 'M', u'υ'), - (0x3A6, 'M', u'φ'), - (0x3A7, 'M', u'χ'), - (0x3A8, 'M', u'ψ'), - (0x3A9, 'M', u'ω'), - (0x3AA, 'M', u'ϊ'), - (0x3AB, 'M', u'ϋ'), - (0x3AC, 'V'), - (0x3C2, 'D', u'σ'), - (0x3C3, 'V'), - (0x3CF, 'M', u'ϗ'), - (0x3D0, 'M', u'β'), - (0x3D1, 'M', u'θ'), - (0x3D2, 'M', u'υ'), - (0x3D3, 'M', u'ύ'), - (0x3D4, 'M', u'ϋ'), - (0x3D5, 'M', u'φ'), - (0x3D6, 'M', u'π'), - (0x3D7, 'V'), - (0x3D8, 'M', u'ϙ'), - (0x3D9, 'V'), - (0x3DA, 'M', u'ϛ'), - (0x3DB, 'V'), - (0x3DC, 'M', u'ϝ'), - (0x3DD, 'V'), - (0x3DE, 'M', u'ϟ'), - (0x3DF, 'V'), - (0x3E0, 'M', u'ϡ'), - (0x3E1, 'V'), - (0x3E2, 'M', u'ϣ'), - (0x3E3, 'V'), - (0x3E4, 'M', u'ϥ'), - (0x3E5, 'V'), - (0x3E6, 'M', u'ϧ'), - (0x3E7, 'V'), - (0x3E8, 'M', u'ϩ'), - (0x3E9, 'V'), - (0x3EA, 'M', u'ϫ'), - (0x3EB, 'V'), - (0x3EC, 'M', u'ϭ'), - (0x3ED, 'V'), - (0x3EE, 'M', u'ϯ'), - (0x3EF, 'V'), - (0x3F0, 'M', u'κ'), - (0x3F1, 'M', u'ρ'), - (0x3F2, 'M', u'σ'), - (0x3F3, 'V'), - (0x3F4, 'M', u'θ'), - (0x3F5, 'M', u'ε'), - (0x3F6, 'V'), - (0x3F7, 'M', u'ϸ'), - (0x3F8, 'V'), - (0x3F9, 'M', u'σ'), - (0x3FA, 'M', u'ϻ'), - (0x3FB, 'V'), - (0x3FD, 'M', u'ͻ'), - (0x3FE, 'M', u'ͼ'), - (0x3FF, 'M', u'ͽ'), - (0x400, 'M', u'ѐ'), - (0x401, 'M', u'ё'), - (0x402, 'M', u'ђ'), - (0x403, 'M', u'ѓ'), - ] - -def _seg_7(): - return [ - (0x404, 'M', u'є'), - (0x405, 'M', u'ѕ'), - (0x406, 'M', u'і'), - (0x407, 'M', u'ї'), - (0x408, 'M', u'ј'), - (0x409, 'M', u'љ'), - (0x40A, 'M', u'њ'), - (0x40B, 'M', u'ћ'), - (0x40C, 'M', u'ќ'), - (0x40D, 'M', u'ѝ'), - (0x40E, 'M', u'ў'), - (0x40F, 'M', u'џ'), - (0x410, 'M', u'а'), - (0x411, 'M', u'б'), - (0x412, 'M', u'в'), - (0x413, 'M', u'г'), - (0x414, 'M', u'д'), - (0x415, 'M', u'е'), - (0x416, 'M', u'ж'), - (0x417, 'M', u'з'), - (0x418, 'M', u'и'), - (0x419, 'M', u'й'), - (0x41A, 'M', u'к'), - (0x41B, 'M', u'л'), - (0x41C, 'M', u'м'), - (0x41D, 'M', u'н'), - (0x41E, 'M', u'о'), - (0x41F, 'M', u'п'), - (0x420, 'M', u'р'), - (0x421, 'M', u'с'), - (0x422, 'M', u'т'), - (0x423, 'M', u'у'), - (0x424, 'M', u'ф'), - (0x425, 'M', u'х'), - (0x426, 'M', u'ц'), - (0x427, 'M', u'ч'), - (0x428, 'M', u'ш'), - (0x429, 'M', u'щ'), - (0x42A, 'M', u'ъ'), - (0x42B, 'M', u'ы'), - (0x42C, 'M', u'ь'), - (0x42D, 'M', u'э'), - (0x42E, 'M', u'ю'), - (0x42F, 'M', u'я'), - (0x430, 'V'), - (0x460, 'M', u'ѡ'), - (0x461, 'V'), - (0x462, 'M', u'ѣ'), - (0x463, 'V'), - (0x464, 'M', u'ѥ'), - (0x465, 'V'), - (0x466, 'M', u'ѧ'), - (0x467, 'V'), - (0x468, 'M', u'ѩ'), - (0x469, 'V'), - (0x46A, 'M', u'ѫ'), - (0x46B, 'V'), - (0x46C, 'M', u'ѭ'), - (0x46D, 'V'), - (0x46E, 'M', u'ѯ'), - (0x46F, 'V'), - (0x470, 'M', u'ѱ'), - (0x471, 'V'), - (0x472, 'M', u'ѳ'), - (0x473, 'V'), - (0x474, 'M', u'ѵ'), - (0x475, 'V'), - (0x476, 'M', u'ѷ'), - (0x477, 'V'), - (0x478, 'M', u'ѹ'), - (0x479, 'V'), - (0x47A, 'M', u'ѻ'), - (0x47B, 'V'), - (0x47C, 'M', u'ѽ'), - (0x47D, 'V'), - (0x47E, 'M', u'ѿ'), - (0x47F, 'V'), - (0x480, 'M', u'ҁ'), - (0x481, 'V'), - (0x48A, 'M', u'ҋ'), - (0x48B, 'V'), - (0x48C, 'M', u'ҍ'), - (0x48D, 'V'), - (0x48E, 'M', u'ҏ'), - (0x48F, 'V'), - (0x490, 'M', u'ґ'), - (0x491, 'V'), - (0x492, 'M', u'ғ'), - (0x493, 'V'), - (0x494, 'M', u'ҕ'), - (0x495, 'V'), - (0x496, 'M', u'җ'), - (0x497, 'V'), - (0x498, 'M', u'ҙ'), - (0x499, 'V'), - (0x49A, 'M', u'қ'), - (0x49B, 'V'), - (0x49C, 'M', u'ҝ'), - (0x49D, 'V'), - (0x49E, 'M', u'ҟ'), - ] - -def _seg_8(): - return [ - (0x49F, 'V'), - (0x4A0, 'M', u'ҡ'), - (0x4A1, 'V'), - (0x4A2, 'M', u'ң'), - (0x4A3, 'V'), - (0x4A4, 'M', u'ҥ'), - (0x4A5, 'V'), - (0x4A6, 'M', u'ҧ'), - (0x4A7, 'V'), - (0x4A8, 'M', u'ҩ'), - (0x4A9, 'V'), - (0x4AA, 'M', u'ҫ'), - (0x4AB, 'V'), - (0x4AC, 'M', u'ҭ'), - (0x4AD, 'V'), - (0x4AE, 'M', u'ү'), - (0x4AF, 'V'), - (0x4B0, 'M', u'ұ'), - (0x4B1, 'V'), - (0x4B2, 'M', u'ҳ'), - (0x4B3, 'V'), - (0x4B4, 'M', u'ҵ'), - (0x4B5, 'V'), - (0x4B6, 'M', u'ҷ'), - (0x4B7, 'V'), - (0x4B8, 'M', u'ҹ'), - (0x4B9, 'V'), - (0x4BA, 'M', u'һ'), - (0x4BB, 'V'), - (0x4BC, 'M', u'ҽ'), - (0x4BD, 'V'), - (0x4BE, 'M', u'ҿ'), - (0x4BF, 'V'), - (0x4C0, 'X'), - (0x4C1, 'M', u'ӂ'), - (0x4C2, 'V'), - (0x4C3, 'M', u'ӄ'), - (0x4C4, 'V'), - (0x4C5, 'M', u'ӆ'), - (0x4C6, 'V'), - (0x4C7, 'M', u'ӈ'), - (0x4C8, 'V'), - (0x4C9, 'M', u'ӊ'), - (0x4CA, 'V'), - (0x4CB, 'M', u'ӌ'), - (0x4CC, 'V'), - (0x4CD, 'M', u'ӎ'), - (0x4CE, 'V'), - (0x4D0, 'M', u'ӑ'), - (0x4D1, 'V'), - (0x4D2, 'M', u'ӓ'), - (0x4D3, 'V'), - (0x4D4, 'M', u'ӕ'), - (0x4D5, 'V'), - (0x4D6, 'M', u'ӗ'), - (0x4D7, 'V'), - (0x4D8, 'M', u'ә'), - (0x4D9, 'V'), - (0x4DA, 'M', u'ӛ'), - (0x4DB, 'V'), - (0x4DC, 'M', u'ӝ'), - (0x4DD, 'V'), - (0x4DE, 'M', u'ӟ'), - (0x4DF, 'V'), - (0x4E0, 'M', u'ӡ'), - (0x4E1, 'V'), - (0x4E2, 'M', u'ӣ'), - (0x4E3, 'V'), - (0x4E4, 'M', u'ӥ'), - (0x4E5, 'V'), - (0x4E6, 'M', u'ӧ'), - (0x4E7, 'V'), - (0x4E8, 'M', u'ө'), - (0x4E9, 'V'), - (0x4EA, 'M', u'ӫ'), - (0x4EB, 'V'), - (0x4EC, 'M', u'ӭ'), - (0x4ED, 'V'), - (0x4EE, 'M', u'ӯ'), - (0x4EF, 'V'), - (0x4F0, 'M', u'ӱ'), - (0x4F1, 'V'), - (0x4F2, 'M', u'ӳ'), - (0x4F3, 'V'), - (0x4F4, 'M', u'ӵ'), - (0x4F5, 'V'), - (0x4F6, 'M', u'ӷ'), - (0x4F7, 'V'), - (0x4F8, 'M', u'ӹ'), - (0x4F9, 'V'), - (0x4FA, 'M', u'ӻ'), - (0x4FB, 'V'), - (0x4FC, 'M', u'ӽ'), - (0x4FD, 'V'), - (0x4FE, 'M', u'ӿ'), - (0x4FF, 'V'), - (0x500, 'M', u'ԁ'), - (0x501, 'V'), - (0x502, 'M', u'ԃ'), - (0x503, 'V'), - ] - -def _seg_9(): - return [ - (0x504, 'M', u'ԅ'), - (0x505, 'V'), - (0x506, 'M', u'ԇ'), - (0x507, 'V'), - (0x508, 'M', u'ԉ'), - (0x509, 'V'), - (0x50A, 'M', u'ԋ'), - (0x50B, 'V'), - (0x50C, 'M', u'ԍ'), - (0x50D, 'V'), - (0x50E, 'M', u'ԏ'), - (0x50F, 'V'), - (0x510, 'M', u'ԑ'), - (0x511, 'V'), - (0x512, 'M', u'ԓ'), - (0x513, 'V'), - (0x514, 'M', u'ԕ'), - (0x515, 'V'), - (0x516, 'M', u'ԗ'), - (0x517, 'V'), - (0x518, 'M', u'ԙ'), - (0x519, 'V'), - (0x51A, 'M', u'ԛ'), - (0x51B, 'V'), - (0x51C, 'M', u'ԝ'), - (0x51D, 'V'), - (0x51E, 'M', u'ԟ'), - (0x51F, 'V'), - (0x520, 'M', u'ԡ'), - (0x521, 'V'), - (0x522, 'M', u'ԣ'), - (0x523, 'V'), - (0x524, 'M', u'ԥ'), - (0x525, 'V'), - (0x526, 'M', u'ԧ'), - (0x527, 'V'), - (0x528, 'X'), - (0x531, 'M', u'ա'), - (0x532, 'M', u'բ'), - (0x533, 'M', u'գ'), - (0x534, 'M', u'դ'), - (0x535, 'M', u'ե'), - (0x536, 'M', u'զ'), - (0x537, 'M', u'է'), - (0x538, 'M', u'ը'), - (0x539, 'M', u'թ'), - (0x53A, 'M', u'ժ'), - (0x53B, 'M', u'ի'), - (0x53C, 'M', u'լ'), - (0x53D, 'M', u'խ'), - (0x53E, 'M', u'ծ'), - (0x53F, 'M', u'կ'), - (0x540, 'M', u'հ'), - (0x541, 'M', u'ձ'), - (0x542, 'M', u'ղ'), - (0x543, 'M', u'ճ'), - (0x544, 'M', u'մ'), - (0x545, 'M', u'յ'), - (0x546, 'M', u'ն'), - (0x547, 'M', u'շ'), - (0x548, 'M', u'ո'), - (0x549, 'M', u'չ'), - (0x54A, 'M', u'պ'), - (0x54B, 'M', u'ջ'), - (0x54C, 'M', u'ռ'), - (0x54D, 'M', u'ս'), - (0x54E, 'M', u'վ'), - (0x54F, 'M', u'տ'), - (0x550, 'M', u'ր'), - (0x551, 'M', u'ց'), - (0x552, 'M', u'ւ'), - (0x553, 'M', u'փ'), - (0x554, 'M', u'ք'), - (0x555, 'M', u'օ'), - (0x556, 'M', u'ֆ'), - (0x557, 'X'), - (0x559, 'V'), - (0x560, 'X'), - (0x561, 'V'), - (0x587, 'M', u'եւ'), - (0x588, 'X'), - (0x589, 'V'), - (0x58B, 'X'), - (0x58F, 'V'), - (0x590, 'X'), - (0x591, 'V'), - (0x5C8, 'X'), - (0x5D0, 'V'), - (0x5EB, 'X'), - (0x5F0, 'V'), - (0x5F5, 'X'), - (0x606, 'V'), - (0x61C, 'X'), - (0x61E, 'V'), - (0x675, 'M', u'اٴ'), - (0x676, 'M', u'وٴ'), - (0x677, 'M', u'ۇٴ'), - (0x678, 'M', u'يٴ'), - (0x679, 'V'), - (0x6DD, 'X'), - ] - -def _seg_10(): - return [ - (0x6DE, 'V'), - (0x70E, 'X'), - (0x710, 'V'), - (0x74B, 'X'), - (0x74D, 'V'), - (0x7B2, 'X'), - (0x7C0, 'V'), - (0x7FB, 'X'), - (0x800, 'V'), - (0x82E, 'X'), - (0x830, 'V'), - (0x83F, 'X'), - (0x840, 'V'), - (0x85C, 'X'), - (0x85E, 'V'), - (0x85F, 'X'), - (0x8A0, 'V'), - (0x8A1, 'X'), - (0x8A2, 'V'), - (0x8AD, 'X'), - (0x8E4, 'V'), - (0x8FF, 'X'), - (0x900, 'V'), - (0x958, 'M', u'क़'), - (0x959, 'M', u'ख़'), - (0x95A, 'M', u'ग़'), - (0x95B, 'M', u'ज़'), - (0x95C, 'M', u'ड़'), - (0x95D, 'M', u'ढ़'), - (0x95E, 'M', u'फ़'), - (0x95F, 'M', u'य़'), - (0x960, 'V'), - (0x978, 'X'), - (0x979, 'V'), - (0x980, 'X'), - (0x981, 'V'), - (0x984, 'X'), - (0x985, 'V'), - (0x98D, 'X'), - (0x98F, 'V'), - (0x991, 'X'), - (0x993, 'V'), - (0x9A9, 'X'), - (0x9AA, 'V'), - (0x9B1, 'X'), - (0x9B2, 'V'), - (0x9B3, 'X'), - (0x9B6, 'V'), - (0x9BA, 'X'), - (0x9BC, 'V'), - (0x9C5, 'X'), - (0x9C7, 'V'), - (0x9C9, 'X'), - (0x9CB, 'V'), - (0x9CF, 'X'), - (0x9D7, 'V'), - (0x9D8, 'X'), - (0x9DC, 'M', u'ড়'), - (0x9DD, 'M', u'ঢ়'), - (0x9DE, 'X'), - (0x9DF, 'M', u'য়'), - (0x9E0, 'V'), - (0x9E4, 'X'), - (0x9E6, 'V'), - (0x9FC, 'X'), - (0xA01, 'V'), - (0xA04, 'X'), - (0xA05, 'V'), - (0xA0B, 'X'), - (0xA0F, 'V'), - (0xA11, 'X'), - (0xA13, 'V'), - (0xA29, 'X'), - (0xA2A, 'V'), - (0xA31, 'X'), - (0xA32, 'V'), - (0xA33, 'M', u'ਲ਼'), - (0xA34, 'X'), - (0xA35, 'V'), - (0xA36, 'M', u'ਸ਼'), - (0xA37, 'X'), - (0xA38, 'V'), - (0xA3A, 'X'), - (0xA3C, 'V'), - (0xA3D, 'X'), - (0xA3E, 'V'), - (0xA43, 'X'), - (0xA47, 'V'), - (0xA49, 'X'), - (0xA4B, 'V'), - (0xA4E, 'X'), - (0xA51, 'V'), - (0xA52, 'X'), - (0xA59, 'M', u'ਖ਼'), - (0xA5A, 'M', u'ਗ਼'), - (0xA5B, 'M', u'ਜ਼'), - (0xA5C, 'V'), - (0xA5D, 'X'), - (0xA5E, 'M', u'ਫ਼'), - (0xA5F, 'X'), - ] - -def _seg_11(): - return [ - (0xA66, 'V'), - (0xA76, 'X'), - (0xA81, 'V'), - (0xA84, 'X'), - (0xA85, 'V'), - (0xA8E, 'X'), - (0xA8F, 'V'), - (0xA92, 'X'), - (0xA93, 'V'), - (0xAA9, 'X'), - (0xAAA, 'V'), - (0xAB1, 'X'), - (0xAB2, 'V'), - (0xAB4, 'X'), - (0xAB5, 'V'), - (0xABA, 'X'), - (0xABC, 'V'), - (0xAC6, 'X'), - (0xAC7, 'V'), - (0xACA, 'X'), - (0xACB, 'V'), - (0xACE, 'X'), - (0xAD0, 'V'), - (0xAD1, 'X'), - (0xAE0, 'V'), - (0xAE4, 'X'), - (0xAE6, 'V'), - (0xAF2, 'X'), - (0xB01, 'V'), - (0xB04, 'X'), - (0xB05, 'V'), - (0xB0D, 'X'), - (0xB0F, 'V'), - (0xB11, 'X'), - (0xB13, 'V'), - (0xB29, 'X'), - (0xB2A, 'V'), - (0xB31, 'X'), - (0xB32, 'V'), - (0xB34, 'X'), - (0xB35, 'V'), - (0xB3A, 'X'), - (0xB3C, 'V'), - (0xB45, 'X'), - (0xB47, 'V'), - (0xB49, 'X'), - (0xB4B, 'V'), - (0xB4E, 'X'), - (0xB56, 'V'), - (0xB58, 'X'), - (0xB5C, 'M', u'ଡ଼'), - (0xB5D, 'M', u'ଢ଼'), - (0xB5E, 'X'), - (0xB5F, 'V'), - (0xB64, 'X'), - (0xB66, 'V'), - (0xB78, 'X'), - (0xB82, 'V'), - (0xB84, 'X'), - (0xB85, 'V'), - (0xB8B, 'X'), - (0xB8E, 'V'), - (0xB91, 'X'), - (0xB92, 'V'), - (0xB96, 'X'), - (0xB99, 'V'), - (0xB9B, 'X'), - (0xB9C, 'V'), - (0xB9D, 'X'), - (0xB9E, 'V'), - (0xBA0, 'X'), - (0xBA3, 'V'), - (0xBA5, 'X'), - (0xBA8, 'V'), - (0xBAB, 'X'), - (0xBAE, 'V'), - (0xBBA, 'X'), - (0xBBE, 'V'), - (0xBC3, 'X'), - (0xBC6, 'V'), - (0xBC9, 'X'), - (0xBCA, 'V'), - (0xBCE, 'X'), - (0xBD0, 'V'), - (0xBD1, 'X'), - (0xBD7, 'V'), - (0xBD8, 'X'), - (0xBE6, 'V'), - (0xBFB, 'X'), - (0xC01, 'V'), - (0xC04, 'X'), - (0xC05, 'V'), - (0xC0D, 'X'), - (0xC0E, 'V'), - (0xC11, 'X'), - (0xC12, 'V'), - (0xC29, 'X'), - (0xC2A, 'V'), - (0xC34, 'X'), - (0xC35, 'V'), - ] - -def _seg_12(): - return [ - (0xC3A, 'X'), - (0xC3D, 'V'), - (0xC45, 'X'), - (0xC46, 'V'), - (0xC49, 'X'), - (0xC4A, 'V'), - (0xC4E, 'X'), - (0xC55, 'V'), - (0xC57, 'X'), - (0xC58, 'V'), - (0xC5A, 'X'), - (0xC60, 'V'), - (0xC64, 'X'), - (0xC66, 'V'), - (0xC70, 'X'), - (0xC78, 'V'), - (0xC80, 'X'), - (0xC82, 'V'), - (0xC84, 'X'), - (0xC85, 'V'), - (0xC8D, 'X'), - (0xC8E, 'V'), - (0xC91, 'X'), - (0xC92, 'V'), - (0xCA9, 'X'), - (0xCAA, 'V'), - (0xCB4, 'X'), - (0xCB5, 'V'), - (0xCBA, 'X'), - (0xCBC, 'V'), - (0xCC5, 'X'), - (0xCC6, 'V'), - (0xCC9, 'X'), - (0xCCA, 'V'), - (0xCCE, 'X'), - (0xCD5, 'V'), - (0xCD7, 'X'), - (0xCDE, 'V'), - (0xCDF, 'X'), - (0xCE0, 'V'), - (0xCE4, 'X'), - (0xCE6, 'V'), - (0xCF0, 'X'), - (0xCF1, 'V'), - (0xCF3, 'X'), - (0xD02, 'V'), - (0xD04, 'X'), - (0xD05, 'V'), - (0xD0D, 'X'), - (0xD0E, 'V'), - (0xD11, 'X'), - (0xD12, 'V'), - (0xD3B, 'X'), - (0xD3D, 'V'), - (0xD45, 'X'), - (0xD46, 'V'), - (0xD49, 'X'), - (0xD4A, 'V'), - (0xD4F, 'X'), - (0xD57, 'V'), - (0xD58, 'X'), - (0xD60, 'V'), - (0xD64, 'X'), - (0xD66, 'V'), - (0xD76, 'X'), - (0xD79, 'V'), - (0xD80, 'X'), - (0xD82, 'V'), - (0xD84, 'X'), - (0xD85, 'V'), - (0xD97, 'X'), - (0xD9A, 'V'), - (0xDB2, 'X'), - (0xDB3, 'V'), - (0xDBC, 'X'), - (0xDBD, 'V'), - (0xDBE, 'X'), - (0xDC0, 'V'), - (0xDC7, 'X'), - (0xDCA, 'V'), - (0xDCB, 'X'), - (0xDCF, 'V'), - (0xDD5, 'X'), - (0xDD6, 'V'), - (0xDD7, 'X'), - (0xDD8, 'V'), - (0xDE0, 'X'), - (0xDF2, 'V'), - (0xDF5, 'X'), - (0xE01, 'V'), - (0xE33, 'M', u'ํา'), - (0xE34, 'V'), - (0xE3B, 'X'), - (0xE3F, 'V'), - (0xE5C, 'X'), - (0xE81, 'V'), - (0xE83, 'X'), - (0xE84, 'V'), - (0xE85, 'X'), - (0xE87, 'V'), - ] - -def _seg_13(): - return [ - (0xE89, 'X'), - (0xE8A, 'V'), - (0xE8B, 'X'), - (0xE8D, 'V'), - (0xE8E, 'X'), - (0xE94, 'V'), - (0xE98, 'X'), - (0xE99, 'V'), - (0xEA0, 'X'), - (0xEA1, 'V'), - (0xEA4, 'X'), - (0xEA5, 'V'), - (0xEA6, 'X'), - (0xEA7, 'V'), - (0xEA8, 'X'), - (0xEAA, 'V'), - (0xEAC, 'X'), - (0xEAD, 'V'), - (0xEB3, 'M', u'ໍາ'), - (0xEB4, 'V'), - (0xEBA, 'X'), - (0xEBB, 'V'), - (0xEBE, 'X'), - (0xEC0, 'V'), - (0xEC5, 'X'), - (0xEC6, 'V'), - (0xEC7, 'X'), - (0xEC8, 'V'), - (0xECE, 'X'), - (0xED0, 'V'), - (0xEDA, 'X'), - (0xEDC, 'M', u'ຫນ'), - (0xEDD, 'M', u'ຫມ'), - (0xEDE, 'V'), - (0xEE0, 'X'), - (0xF00, 'V'), - (0xF0C, 'M', u'་'), - (0xF0D, 'V'), - (0xF43, 'M', u'གྷ'), - (0xF44, 'V'), - (0xF48, 'X'), - (0xF49, 'V'), - (0xF4D, 'M', u'ཌྷ'), - (0xF4E, 'V'), - (0xF52, 'M', u'དྷ'), - (0xF53, 'V'), - (0xF57, 'M', u'བྷ'), - (0xF58, 'V'), - (0xF5C, 'M', u'ཛྷ'), - (0xF5D, 'V'), - (0xF69, 'M', u'ཀྵ'), - (0xF6A, 'V'), - (0xF6D, 'X'), - (0xF71, 'V'), - (0xF73, 'M', u'ཱི'), - (0xF74, 'V'), - (0xF75, 'M', u'ཱུ'), - (0xF76, 'M', u'ྲྀ'), - (0xF77, 'M', u'ྲཱྀ'), - (0xF78, 'M', u'ླྀ'), - (0xF79, 'M', u'ླཱྀ'), - (0xF7A, 'V'), - (0xF81, 'M', u'ཱྀ'), - (0xF82, 'V'), - (0xF93, 'M', u'ྒྷ'), - (0xF94, 'V'), - (0xF98, 'X'), - (0xF99, 'V'), - (0xF9D, 'M', u'ྜྷ'), - (0xF9E, 'V'), - (0xFA2, 'M', u'ྡྷ'), - (0xFA3, 'V'), - (0xFA7, 'M', u'ྦྷ'), - (0xFA8, 'V'), - (0xFAC, 'M', u'ྫྷ'), - (0xFAD, 'V'), - (0xFB9, 'M', u'ྐྵ'), - (0xFBA, 'V'), - (0xFBD, 'X'), - (0xFBE, 'V'), - (0xFCD, 'X'), - (0xFCE, 'V'), - (0xFDB, 'X'), - (0x1000, 'V'), - (0x10A0, 'X'), - (0x10C7, 'M', u'ⴧ'), - (0x10C8, 'X'), - (0x10CD, 'M', u'ⴭ'), - (0x10CE, 'X'), - (0x10D0, 'V'), - (0x10FC, 'M', u'ნ'), - (0x10FD, 'V'), - (0x115F, 'X'), - (0x1161, 'V'), - (0x1249, 'X'), - (0x124A, 'V'), - (0x124E, 'X'), - (0x1250, 'V'), - (0x1257, 'X'), - (0x1258, 'V'), - ] - -def _seg_14(): - return [ - (0x1259, 'X'), - (0x125A, 'V'), - (0x125E, 'X'), - (0x1260, 'V'), - (0x1289, 'X'), - (0x128A, 'V'), - (0x128E, 'X'), - (0x1290, 'V'), - (0x12B1, 'X'), - (0x12B2, 'V'), - (0x12B6, 'X'), - (0x12B8, 'V'), - (0x12BF, 'X'), - (0x12C0, 'V'), - (0x12C1, 'X'), - (0x12C2, 'V'), - (0x12C6, 'X'), - (0x12C8, 'V'), - (0x12D7, 'X'), - (0x12D8, 'V'), - (0x1311, 'X'), - (0x1312, 'V'), - (0x1316, 'X'), - (0x1318, 'V'), - (0x135B, 'X'), - (0x135D, 'V'), - (0x137D, 'X'), - (0x1380, 'V'), - (0x139A, 'X'), - (0x13A0, 'V'), - (0x13F5, 'X'), - (0x1400, 'V'), - (0x1680, 'X'), - (0x1681, 'V'), - (0x169D, 'X'), - (0x16A0, 'V'), - (0x16F1, 'X'), - (0x1700, 'V'), - (0x170D, 'X'), - (0x170E, 'V'), - (0x1715, 'X'), - (0x1720, 'V'), - (0x1737, 'X'), - (0x1740, 'V'), - (0x1754, 'X'), - (0x1760, 'V'), - (0x176D, 'X'), - (0x176E, 'V'), - (0x1771, 'X'), - (0x1772, 'V'), - (0x1774, 'X'), - (0x1780, 'V'), - (0x17B4, 'X'), - (0x17B6, 'V'), - (0x17DE, 'X'), - (0x17E0, 'V'), - (0x17EA, 'X'), - (0x17F0, 'V'), - (0x17FA, 'X'), - (0x1800, 'V'), - (0x1806, 'X'), - (0x1807, 'V'), - (0x180B, 'I'), - (0x180E, 'X'), - (0x1810, 'V'), - (0x181A, 'X'), - (0x1820, 'V'), - (0x1878, 'X'), - (0x1880, 'V'), - (0x18AB, 'X'), - (0x18B0, 'V'), - (0x18F6, 'X'), - (0x1900, 'V'), - (0x191D, 'X'), - (0x1920, 'V'), - (0x192C, 'X'), - (0x1930, 'V'), - (0x193C, 'X'), - (0x1940, 'V'), - (0x1941, 'X'), - (0x1944, 'V'), - (0x196E, 'X'), - (0x1970, 'V'), - (0x1975, 'X'), - (0x1980, 'V'), - (0x19AC, 'X'), - (0x19B0, 'V'), - (0x19CA, 'X'), - (0x19D0, 'V'), - (0x19DB, 'X'), - (0x19DE, 'V'), - (0x1A1C, 'X'), - (0x1A1E, 'V'), - (0x1A5F, 'X'), - (0x1A60, 'V'), - (0x1A7D, 'X'), - (0x1A7F, 'V'), - (0x1A8A, 'X'), - (0x1A90, 'V'), - (0x1A9A, 'X'), - ] - -def _seg_15(): - return [ - (0x1AA0, 'V'), - (0x1AAE, 'X'), - (0x1B00, 'V'), - (0x1B4C, 'X'), - (0x1B50, 'V'), - (0x1B7D, 'X'), - (0x1B80, 'V'), - (0x1BF4, 'X'), - (0x1BFC, 'V'), - (0x1C38, 'X'), - (0x1C3B, 'V'), - (0x1C4A, 'X'), - (0x1C4D, 'V'), - (0x1C80, 'X'), - (0x1CC0, 'V'), - (0x1CC8, 'X'), - (0x1CD0, 'V'), - (0x1CF7, 'X'), - (0x1D00, 'V'), - (0x1D2C, 'M', u'a'), - (0x1D2D, 'M', u'æ'), - (0x1D2E, 'M', u'b'), - (0x1D2F, 'V'), - (0x1D30, 'M', u'd'), - (0x1D31, 'M', u'e'), - (0x1D32, 'M', u'ǝ'), - (0x1D33, 'M', u'g'), - (0x1D34, 'M', u'h'), - (0x1D35, 'M', u'i'), - (0x1D36, 'M', u'j'), - (0x1D37, 'M', u'k'), - (0x1D38, 'M', u'l'), - (0x1D39, 'M', u'm'), - (0x1D3A, 'M', u'n'), - (0x1D3B, 'V'), - (0x1D3C, 'M', u'o'), - (0x1D3D, 'M', u'ȣ'), - (0x1D3E, 'M', u'p'), - (0x1D3F, 'M', u'r'), - (0x1D40, 'M', u't'), - (0x1D41, 'M', u'u'), - (0x1D42, 'M', u'w'), - (0x1D43, 'M', u'a'), - (0x1D44, 'M', u'ɐ'), - (0x1D45, 'M', u'ɑ'), - (0x1D46, 'M', u'ᴂ'), - (0x1D47, 'M', u'b'), - (0x1D48, 'M', u'd'), - (0x1D49, 'M', u'e'), - (0x1D4A, 'M', u'ə'), - (0x1D4B, 'M', u'ɛ'), - (0x1D4C, 'M', u'ɜ'), - (0x1D4D, 'M', u'g'), - (0x1D4E, 'V'), - (0x1D4F, 'M', u'k'), - (0x1D50, 'M', u'm'), - (0x1D51, 'M', u'ŋ'), - (0x1D52, 'M', u'o'), - (0x1D53, 'M', u'ɔ'), - (0x1D54, 'M', u'ᴖ'), - (0x1D55, 'M', u'ᴗ'), - (0x1D56, 'M', u'p'), - (0x1D57, 'M', u't'), - (0x1D58, 'M', u'u'), - (0x1D59, 'M', u'ᴝ'), - (0x1D5A, 'M', u'ɯ'), - (0x1D5B, 'M', u'v'), - (0x1D5C, 'M', u'ᴥ'), - (0x1D5D, 'M', u'β'), - (0x1D5E, 'M', u'γ'), - (0x1D5F, 'M', u'δ'), - (0x1D60, 'M', u'φ'), - (0x1D61, 'M', u'χ'), - (0x1D62, 'M', u'i'), - (0x1D63, 'M', u'r'), - (0x1D64, 'M', u'u'), - (0x1D65, 'M', u'v'), - (0x1D66, 'M', u'β'), - (0x1D67, 'M', u'γ'), - (0x1D68, 'M', u'ρ'), - (0x1D69, 'M', u'φ'), - (0x1D6A, 'M', u'χ'), - (0x1D6B, 'V'), - (0x1D78, 'M', u'н'), - (0x1D79, 'V'), - (0x1D9B, 'M', u'ɒ'), - (0x1D9C, 'M', u'c'), - (0x1D9D, 'M', u'ɕ'), - (0x1D9E, 'M', u'ð'), - (0x1D9F, 'M', u'ɜ'), - (0x1DA0, 'M', u'f'), - (0x1DA1, 'M', u'ɟ'), - (0x1DA2, 'M', u'ɡ'), - (0x1DA3, 'M', u'ɥ'), - (0x1DA4, 'M', u'ɨ'), - (0x1DA5, 'M', u'ɩ'), - (0x1DA6, 'M', u'ɪ'), - (0x1DA7, 'M', u'ᵻ'), - (0x1DA8, 'M', u'ʝ'), - (0x1DA9, 'M', u'ɭ'), - ] - -def _seg_16(): - return [ - (0x1DAA, 'M', u'ᶅ'), - (0x1DAB, 'M', u'ʟ'), - (0x1DAC, 'M', u'ɱ'), - (0x1DAD, 'M', u'ɰ'), - (0x1DAE, 'M', u'ɲ'), - (0x1DAF, 'M', u'ɳ'), - (0x1DB0, 'M', u'ɴ'), - (0x1DB1, 'M', u'ɵ'), - (0x1DB2, 'M', u'ɸ'), - (0x1DB3, 'M', u'ʂ'), - (0x1DB4, 'M', u'ʃ'), - (0x1DB5, 'M', u'ƫ'), - (0x1DB6, 'M', u'ʉ'), - (0x1DB7, 'M', u'ʊ'), - (0x1DB8, 'M', u'ᴜ'), - (0x1DB9, 'M', u'ʋ'), - (0x1DBA, 'M', u'ʌ'), - (0x1DBB, 'M', u'z'), - (0x1DBC, 'M', u'ʐ'), - (0x1DBD, 'M', u'ʑ'), - (0x1DBE, 'M', u'ʒ'), - (0x1DBF, 'M', u'θ'), - (0x1DC0, 'V'), - (0x1DE7, 'X'), - (0x1DFC, 'V'), - (0x1E00, 'M', u'ḁ'), - (0x1E01, 'V'), - (0x1E02, 'M', u'ḃ'), - (0x1E03, 'V'), - (0x1E04, 'M', u'ḅ'), - (0x1E05, 'V'), - (0x1E06, 'M', u'ḇ'), - (0x1E07, 'V'), - (0x1E08, 'M', u'ḉ'), - (0x1E09, 'V'), - (0x1E0A, 'M', u'ḋ'), - (0x1E0B, 'V'), - (0x1E0C, 'M', u'ḍ'), - (0x1E0D, 'V'), - (0x1E0E, 'M', u'ḏ'), - (0x1E0F, 'V'), - (0x1E10, 'M', u'ḑ'), - (0x1E11, 'V'), - (0x1E12, 'M', u'ḓ'), - (0x1E13, 'V'), - (0x1E14, 'M', u'ḕ'), - (0x1E15, 'V'), - (0x1E16, 'M', u'ḗ'), - (0x1E17, 'V'), - (0x1E18, 'M', u'ḙ'), - (0x1E19, 'V'), - (0x1E1A, 'M', u'ḛ'), - (0x1E1B, 'V'), - (0x1E1C, 'M', u'ḝ'), - (0x1E1D, 'V'), - (0x1E1E, 'M', u'ḟ'), - (0x1E1F, 'V'), - (0x1E20, 'M', u'ḡ'), - (0x1E21, 'V'), - (0x1E22, 'M', u'ḣ'), - (0x1E23, 'V'), - (0x1E24, 'M', u'ḥ'), - (0x1E25, 'V'), - (0x1E26, 'M', u'ḧ'), - (0x1E27, 'V'), - (0x1E28, 'M', u'ḩ'), - (0x1E29, 'V'), - (0x1E2A, 'M', u'ḫ'), - (0x1E2B, 'V'), - (0x1E2C, 'M', u'ḭ'), - (0x1E2D, 'V'), - (0x1E2E, 'M', u'ḯ'), - (0x1E2F, 'V'), - (0x1E30, 'M', u'ḱ'), - (0x1E31, 'V'), - (0x1E32, 'M', u'ḳ'), - (0x1E33, 'V'), - (0x1E34, 'M', u'ḵ'), - (0x1E35, 'V'), - (0x1E36, 'M', u'ḷ'), - (0x1E37, 'V'), - (0x1E38, 'M', u'ḹ'), - (0x1E39, 'V'), - (0x1E3A, 'M', u'ḻ'), - (0x1E3B, 'V'), - (0x1E3C, 'M', u'ḽ'), - (0x1E3D, 'V'), - (0x1E3E, 'M', u'ḿ'), - (0x1E3F, 'V'), - (0x1E40, 'M', u'ṁ'), - (0x1E41, 'V'), - (0x1E42, 'M', u'ṃ'), - (0x1E43, 'V'), - (0x1E44, 'M', u'ṅ'), - (0x1E45, 'V'), - (0x1E46, 'M', u'ṇ'), - (0x1E47, 'V'), - (0x1E48, 'M', u'ṉ'), - (0x1E49, 'V'), - (0x1E4A, 'M', u'ṋ'), - ] - -def _seg_17(): - return [ - (0x1E4B, 'V'), - (0x1E4C, 'M', u'ṍ'), - (0x1E4D, 'V'), - (0x1E4E, 'M', u'ṏ'), - (0x1E4F, 'V'), - (0x1E50, 'M', u'ṑ'), - (0x1E51, 'V'), - (0x1E52, 'M', u'ṓ'), - (0x1E53, 'V'), - (0x1E54, 'M', u'ṕ'), - (0x1E55, 'V'), - (0x1E56, 'M', u'ṗ'), - (0x1E57, 'V'), - (0x1E58, 'M', u'ṙ'), - (0x1E59, 'V'), - (0x1E5A, 'M', u'ṛ'), - (0x1E5B, 'V'), - (0x1E5C, 'M', u'ṝ'), - (0x1E5D, 'V'), - (0x1E5E, 'M', u'ṟ'), - (0x1E5F, 'V'), - (0x1E60, 'M', u'ṡ'), - (0x1E61, 'V'), - (0x1E62, 'M', u'ṣ'), - (0x1E63, 'V'), - (0x1E64, 'M', u'ṥ'), - (0x1E65, 'V'), - (0x1E66, 'M', u'ṧ'), - (0x1E67, 'V'), - (0x1E68, 'M', u'ṩ'), - (0x1E69, 'V'), - (0x1E6A, 'M', u'ṫ'), - (0x1E6B, 'V'), - (0x1E6C, 'M', u'ṭ'), - (0x1E6D, 'V'), - (0x1E6E, 'M', u'ṯ'), - (0x1E6F, 'V'), - (0x1E70, 'M', u'ṱ'), - (0x1E71, 'V'), - (0x1E72, 'M', u'ṳ'), - (0x1E73, 'V'), - (0x1E74, 'M', u'ṵ'), - (0x1E75, 'V'), - (0x1E76, 'M', u'ṷ'), - (0x1E77, 'V'), - (0x1E78, 'M', u'ṹ'), - (0x1E79, 'V'), - (0x1E7A, 'M', u'ṻ'), - (0x1E7B, 'V'), - (0x1E7C, 'M', u'ṽ'), - (0x1E7D, 'V'), - (0x1E7E, 'M', u'ṿ'), - (0x1E7F, 'V'), - (0x1E80, 'M', u'ẁ'), - (0x1E81, 'V'), - (0x1E82, 'M', u'ẃ'), - (0x1E83, 'V'), - (0x1E84, 'M', u'ẅ'), - (0x1E85, 'V'), - (0x1E86, 'M', u'ẇ'), - (0x1E87, 'V'), - (0x1E88, 'M', u'ẉ'), - (0x1E89, 'V'), - (0x1E8A, 'M', u'ẋ'), - (0x1E8B, 'V'), - (0x1E8C, 'M', u'ẍ'), - (0x1E8D, 'V'), - (0x1E8E, 'M', u'ẏ'), - (0x1E8F, 'V'), - (0x1E90, 'M', u'ẑ'), - (0x1E91, 'V'), - (0x1E92, 'M', u'ẓ'), - (0x1E93, 'V'), - (0x1E94, 'M', u'ẕ'), - (0x1E95, 'V'), - (0x1E9A, 'M', u'aʾ'), - (0x1E9B, 'M', u'ṡ'), - (0x1E9C, 'V'), - (0x1E9E, 'M', u'ss'), - (0x1E9F, 'V'), - (0x1EA0, 'M', u'ạ'), - (0x1EA1, 'V'), - (0x1EA2, 'M', u'ả'), - (0x1EA3, 'V'), - (0x1EA4, 'M', u'ấ'), - (0x1EA5, 'V'), - (0x1EA6, 'M', u'ầ'), - (0x1EA7, 'V'), - (0x1EA8, 'M', u'ẩ'), - (0x1EA9, 'V'), - (0x1EAA, 'M', u'ẫ'), - (0x1EAB, 'V'), - (0x1EAC, 'M', u'ậ'), - (0x1EAD, 'V'), - (0x1EAE, 'M', u'ắ'), - (0x1EAF, 'V'), - (0x1EB0, 'M', u'ằ'), - (0x1EB1, 'V'), - (0x1EB2, 'M', u'ẳ'), - (0x1EB3, 'V'), - ] - -def _seg_18(): - return [ - (0x1EB4, 'M', u'ẵ'), - (0x1EB5, 'V'), - (0x1EB6, 'M', u'ặ'), - (0x1EB7, 'V'), - (0x1EB8, 'M', u'ẹ'), - (0x1EB9, 'V'), - (0x1EBA, 'M', u'ẻ'), - (0x1EBB, 'V'), - (0x1EBC, 'M', u'ẽ'), - (0x1EBD, 'V'), - (0x1EBE, 'M', u'ế'), - (0x1EBF, 'V'), - (0x1EC0, 'M', u'ề'), - (0x1EC1, 'V'), - (0x1EC2, 'M', u'ể'), - (0x1EC3, 'V'), - (0x1EC4, 'M', u'ễ'), - (0x1EC5, 'V'), - (0x1EC6, 'M', u'ệ'), - (0x1EC7, 'V'), - (0x1EC8, 'M', u'ỉ'), - (0x1EC9, 'V'), - (0x1ECA, 'M', u'ị'), - (0x1ECB, 'V'), - (0x1ECC, 'M', u'ọ'), - (0x1ECD, 'V'), - (0x1ECE, 'M', u'ỏ'), - (0x1ECF, 'V'), - (0x1ED0, 'M', u'ố'), - (0x1ED1, 'V'), - (0x1ED2, 'M', u'ồ'), - (0x1ED3, 'V'), - (0x1ED4, 'M', u'ổ'), - (0x1ED5, 'V'), - (0x1ED6, 'M', u'ỗ'), - (0x1ED7, 'V'), - (0x1ED8, 'M', u'ộ'), - (0x1ED9, 'V'), - (0x1EDA, 'M', u'ớ'), - (0x1EDB, 'V'), - (0x1EDC, 'M', u'ờ'), - (0x1EDD, 'V'), - (0x1EDE, 'M', u'ở'), - (0x1EDF, 'V'), - (0x1EE0, 'M', u'ỡ'), - (0x1EE1, 'V'), - (0x1EE2, 'M', u'ợ'), - (0x1EE3, 'V'), - (0x1EE4, 'M', u'ụ'), - (0x1EE5, 'V'), - (0x1EE6, 'M', u'ủ'), - (0x1EE7, 'V'), - (0x1EE8, 'M', u'ứ'), - (0x1EE9, 'V'), - (0x1EEA, 'M', u'ừ'), - (0x1EEB, 'V'), - (0x1EEC, 'M', u'ử'), - (0x1EED, 'V'), - (0x1EEE, 'M', u'ữ'), - (0x1EEF, 'V'), - (0x1EF0, 'M', u'ự'), - (0x1EF1, 'V'), - (0x1EF2, 'M', u'ỳ'), - (0x1EF3, 'V'), - (0x1EF4, 'M', u'ỵ'), - (0x1EF5, 'V'), - (0x1EF6, 'M', u'ỷ'), - (0x1EF7, 'V'), - (0x1EF8, 'M', u'ỹ'), - (0x1EF9, 'V'), - (0x1EFA, 'M', u'ỻ'), - (0x1EFB, 'V'), - (0x1EFC, 'M', u'ỽ'), - (0x1EFD, 'V'), - (0x1EFE, 'M', u'ỿ'), - (0x1EFF, 'V'), - (0x1F08, 'M', u'ἀ'), - (0x1F09, 'M', u'ἁ'), - (0x1F0A, 'M', u'ἂ'), - (0x1F0B, 'M', u'ἃ'), - (0x1F0C, 'M', u'ἄ'), - (0x1F0D, 'M', u'ἅ'), - (0x1F0E, 'M', u'ἆ'), - (0x1F0F, 'M', u'ἇ'), - (0x1F10, 'V'), - (0x1F16, 'X'), - (0x1F18, 'M', u'ἐ'), - (0x1F19, 'M', u'ἑ'), - (0x1F1A, 'M', u'ἒ'), - (0x1F1B, 'M', u'ἓ'), - (0x1F1C, 'M', u'ἔ'), - (0x1F1D, 'M', u'ἕ'), - (0x1F1E, 'X'), - (0x1F20, 'V'), - (0x1F28, 'M', u'ἠ'), - (0x1F29, 'M', u'ἡ'), - (0x1F2A, 'M', u'ἢ'), - (0x1F2B, 'M', u'ἣ'), - (0x1F2C, 'M', u'ἤ'), - (0x1F2D, 'M', u'ἥ'), - ] - -def _seg_19(): - return [ - (0x1F2E, 'M', u'ἦ'), - (0x1F2F, 'M', u'ἧ'), - (0x1F30, 'V'), - (0x1F38, 'M', u'ἰ'), - (0x1F39, 'M', u'ἱ'), - (0x1F3A, 'M', u'ἲ'), - (0x1F3B, 'M', u'ἳ'), - (0x1F3C, 'M', u'ἴ'), - (0x1F3D, 'M', u'ἵ'), - (0x1F3E, 'M', u'ἶ'), - (0x1F3F, 'M', u'ἷ'), - (0x1F40, 'V'), - (0x1F46, 'X'), - (0x1F48, 'M', u'ὀ'), - (0x1F49, 'M', u'ὁ'), - (0x1F4A, 'M', u'ὂ'), - (0x1F4B, 'M', u'ὃ'), - (0x1F4C, 'M', u'ὄ'), - (0x1F4D, 'M', u'ὅ'), - (0x1F4E, 'X'), - (0x1F50, 'V'), - (0x1F58, 'X'), - (0x1F59, 'M', u'ὑ'), - (0x1F5A, 'X'), - (0x1F5B, 'M', u'ὓ'), - (0x1F5C, 'X'), - (0x1F5D, 'M', u'ὕ'), - (0x1F5E, 'X'), - (0x1F5F, 'M', u'ὗ'), - (0x1F60, 'V'), - (0x1F68, 'M', u'ὠ'), - (0x1F69, 'M', u'ὡ'), - (0x1F6A, 'M', u'ὢ'), - (0x1F6B, 'M', u'ὣ'), - (0x1F6C, 'M', u'ὤ'), - (0x1F6D, 'M', u'ὥ'), - (0x1F6E, 'M', u'ὦ'), - (0x1F6F, 'M', u'ὧ'), - (0x1F70, 'V'), - (0x1F71, 'M', u'ά'), - (0x1F72, 'V'), - (0x1F73, 'M', u'έ'), - (0x1F74, 'V'), - (0x1F75, 'M', u'ή'), - (0x1F76, 'V'), - (0x1F77, 'M', u'ί'), - (0x1F78, 'V'), - (0x1F79, 'M', u'ό'), - (0x1F7A, 'V'), - (0x1F7B, 'M', u'ύ'), - (0x1F7C, 'V'), - (0x1F7D, 'M', u'ώ'), - (0x1F7E, 'X'), - (0x1F80, 'M', u'ἀι'), - (0x1F81, 'M', u'ἁι'), - (0x1F82, 'M', u'ἂι'), - (0x1F83, 'M', u'ἃι'), - (0x1F84, 'M', u'ἄι'), - (0x1F85, 'M', u'ἅι'), - (0x1F86, 'M', u'ἆι'), - (0x1F87, 'M', u'ἇι'), - (0x1F88, 'M', u'ἀι'), - (0x1F89, 'M', u'ἁι'), - (0x1F8A, 'M', u'ἂι'), - (0x1F8B, 'M', u'ἃι'), - (0x1F8C, 'M', u'ἄι'), - (0x1F8D, 'M', u'ἅι'), - (0x1F8E, 'M', u'ἆι'), - (0x1F8F, 'M', u'ἇι'), - (0x1F90, 'M', u'ἠι'), - (0x1F91, 'M', u'ἡι'), - (0x1F92, 'M', u'ἢι'), - (0x1F93, 'M', u'ἣι'), - (0x1F94, 'M', u'ἤι'), - (0x1F95, 'M', u'ἥι'), - (0x1F96, 'M', u'ἦι'), - (0x1F97, 'M', u'ἧι'), - (0x1F98, 'M', u'ἠι'), - (0x1F99, 'M', u'ἡι'), - (0x1F9A, 'M', u'ἢι'), - (0x1F9B, 'M', u'ἣι'), - (0x1F9C, 'M', u'ἤι'), - (0x1F9D, 'M', u'ἥι'), - (0x1F9E, 'M', u'ἦι'), - (0x1F9F, 'M', u'ἧι'), - (0x1FA0, 'M', u'ὠι'), - (0x1FA1, 'M', u'ὡι'), - (0x1FA2, 'M', u'ὢι'), - (0x1FA3, 'M', u'ὣι'), - (0x1FA4, 'M', u'ὤι'), - (0x1FA5, 'M', u'ὥι'), - (0x1FA6, 'M', u'ὦι'), - (0x1FA7, 'M', u'ὧι'), - (0x1FA8, 'M', u'ὠι'), - (0x1FA9, 'M', u'ὡι'), - (0x1FAA, 'M', u'ὢι'), - (0x1FAB, 'M', u'ὣι'), - (0x1FAC, 'M', u'ὤι'), - (0x1FAD, 'M', u'ὥι'), - (0x1FAE, 'M', u'ὦι'), - ] - -def _seg_20(): - return [ - (0x1FAF, 'M', u'ὧι'), - (0x1FB0, 'V'), - (0x1FB2, 'M', u'ὰι'), - (0x1FB3, 'M', u'αι'), - (0x1FB4, 'M', u'άι'), - (0x1FB5, 'X'), - (0x1FB6, 'V'), - (0x1FB7, 'M', u'ᾶι'), - (0x1FB8, 'M', u'ᾰ'), - (0x1FB9, 'M', u'ᾱ'), - (0x1FBA, 'M', u'ὰ'), - (0x1FBB, 'M', u'ά'), - (0x1FBC, 'M', u'αι'), - (0x1FBD, '3', u' ̓'), - (0x1FBE, 'M', u'ι'), - (0x1FBF, '3', u' ̓'), - (0x1FC0, '3', u' ͂'), - (0x1FC1, '3', u' ̈͂'), - (0x1FC2, 'M', u'ὴι'), - (0x1FC3, 'M', u'ηι'), - (0x1FC4, 'M', u'ήι'), - (0x1FC5, 'X'), - (0x1FC6, 'V'), - (0x1FC7, 'M', u'ῆι'), - (0x1FC8, 'M', u'ὲ'), - (0x1FC9, 'M', u'έ'), - (0x1FCA, 'M', u'ὴ'), - (0x1FCB, 'M', u'ή'), - (0x1FCC, 'M', u'ηι'), - (0x1FCD, '3', u' ̓̀'), - (0x1FCE, '3', u' ̓́'), - (0x1FCF, '3', u' ̓͂'), - (0x1FD0, 'V'), - (0x1FD3, 'M', u'ΐ'), - (0x1FD4, 'X'), - (0x1FD6, 'V'), - (0x1FD8, 'M', u'ῐ'), - (0x1FD9, 'M', u'ῑ'), - (0x1FDA, 'M', u'ὶ'), - (0x1FDB, 'M', u'ί'), - (0x1FDC, 'X'), - (0x1FDD, '3', u' ̔̀'), - (0x1FDE, '3', u' ̔́'), - (0x1FDF, '3', u' ̔͂'), - (0x1FE0, 'V'), - (0x1FE3, 'M', u'ΰ'), - (0x1FE4, 'V'), - (0x1FE8, 'M', u'ῠ'), - (0x1FE9, 'M', u'ῡ'), - (0x1FEA, 'M', u'ὺ'), - (0x1FEB, 'M', u'ύ'), - (0x1FEC, 'M', u'ῥ'), - (0x1FED, '3', u' ̈̀'), - (0x1FEE, '3', u' ̈́'), - (0x1FEF, '3', u'`'), - (0x1FF0, 'X'), - (0x1FF2, 'M', u'ὼι'), - (0x1FF3, 'M', u'ωι'), - (0x1FF4, 'M', u'ώι'), - (0x1FF5, 'X'), - (0x1FF6, 'V'), - (0x1FF7, 'M', u'ῶι'), - (0x1FF8, 'M', u'ὸ'), - (0x1FF9, 'M', u'ό'), - (0x1FFA, 'M', u'ὼ'), - (0x1FFB, 'M', u'ώ'), - (0x1FFC, 'M', u'ωι'), - (0x1FFD, '3', u' ́'), - (0x1FFE, '3', u' ̔'), - (0x1FFF, 'X'), - (0x2000, '3', u' '), - (0x200B, 'I'), - (0x200C, 'D', u''), - (0x200E, 'X'), - (0x2010, 'V'), - (0x2011, 'M', u'‐'), - (0x2012, 'V'), - (0x2017, '3', u' ̳'), - (0x2018, 'V'), - (0x2024, 'X'), - (0x2027, 'V'), - (0x2028, 'X'), - (0x202F, '3', u' '), - (0x2030, 'V'), - (0x2033, 'M', u'′′'), - (0x2034, 'M', u'′′′'), - (0x2035, 'V'), - (0x2036, 'M', u'‵‵'), - (0x2037, 'M', u'‵‵‵'), - (0x2038, 'V'), - (0x203C, '3', u'!!'), - (0x203D, 'V'), - (0x203E, '3', u' ̅'), - (0x203F, 'V'), - (0x2047, '3', u'??'), - (0x2048, '3', u'?!'), - (0x2049, '3', u'!?'), - (0x204A, 'V'), - (0x2057, 'M', u'′′′′'), - (0x2058, 'V'), - ] - -def _seg_21(): - return [ - (0x205F, '3', u' '), - (0x2060, 'I'), - (0x2061, 'X'), - (0x2064, 'I'), - (0x2065, 'X'), - (0x2070, 'M', u'0'), - (0x2071, 'M', u'i'), - (0x2072, 'X'), - (0x2074, 'M', u'4'), - (0x2075, 'M', u'5'), - (0x2076, 'M', u'6'), - (0x2077, 'M', u'7'), - (0x2078, 'M', u'8'), - (0x2079, 'M', u'9'), - (0x207A, '3', u'+'), - (0x207B, 'M', u'−'), - (0x207C, '3', u'='), - (0x207D, '3', u'('), - (0x207E, '3', u')'), - (0x207F, 'M', u'n'), - (0x2080, 'M', u'0'), - (0x2081, 'M', u'1'), - (0x2082, 'M', u'2'), - (0x2083, 'M', u'3'), - (0x2084, 'M', u'4'), - (0x2085, 'M', u'5'), - (0x2086, 'M', u'6'), - (0x2087, 'M', u'7'), - (0x2088, 'M', u'8'), - (0x2089, 'M', u'9'), - (0x208A, '3', u'+'), - (0x208B, 'M', u'−'), - (0x208C, '3', u'='), - (0x208D, '3', u'('), - (0x208E, '3', u')'), - (0x208F, 'X'), - (0x2090, 'M', u'a'), - (0x2091, 'M', u'e'), - (0x2092, 'M', u'o'), - (0x2093, 'M', u'x'), - (0x2094, 'M', u'ə'), - (0x2095, 'M', u'h'), - (0x2096, 'M', u'k'), - (0x2097, 'M', u'l'), - (0x2098, 'M', u'm'), - (0x2099, 'M', u'n'), - (0x209A, 'M', u'p'), - (0x209B, 'M', u's'), - (0x209C, 'M', u't'), - (0x209D, 'X'), - (0x20A0, 'V'), - (0x20A8, 'M', u'rs'), - (0x20A9, 'V'), - (0x20BB, 'X'), - (0x20D0, 'V'), - (0x20F1, 'X'), - (0x2100, '3', u'a/c'), - (0x2101, '3', u'a/s'), - (0x2102, 'M', u'c'), - (0x2103, 'M', u'°c'), - (0x2104, 'V'), - (0x2105, '3', u'c/o'), - (0x2106, '3', u'c/u'), - (0x2107, 'M', u'ɛ'), - (0x2108, 'V'), - (0x2109, 'M', u'°f'), - (0x210A, 'M', u'g'), - (0x210B, 'M', u'h'), - (0x210F, 'M', u'ħ'), - (0x2110, 'M', u'i'), - (0x2112, 'M', u'l'), - (0x2114, 'V'), - (0x2115, 'M', u'n'), - (0x2116, 'M', u'no'), - (0x2117, 'V'), - (0x2119, 'M', u'p'), - (0x211A, 'M', u'q'), - (0x211B, 'M', u'r'), - (0x211E, 'V'), - (0x2120, 'M', u'sm'), - (0x2121, 'M', u'tel'), - (0x2122, 'M', u'tm'), - (0x2123, 'V'), - (0x2124, 'M', u'z'), - (0x2125, 'V'), - (0x2126, 'M', u'ω'), - (0x2127, 'V'), - (0x2128, 'M', u'z'), - (0x2129, 'V'), - (0x212A, 'M', u'k'), - (0x212B, 'M', u'å'), - (0x212C, 'M', u'b'), - (0x212D, 'M', u'c'), - (0x212E, 'V'), - (0x212F, 'M', u'e'), - (0x2131, 'M', u'f'), - (0x2132, 'X'), - (0x2133, 'M', u'm'), - (0x2134, 'M', u'o'), - (0x2135, 'M', u'א'), - ] - -def _seg_22(): - return [ - (0x2136, 'M', u'ב'), - (0x2137, 'M', u'ג'), - (0x2138, 'M', u'ד'), - (0x2139, 'M', u'i'), - (0x213A, 'V'), - (0x213B, 'M', u'fax'), - (0x213C, 'M', u'π'), - (0x213D, 'M', u'γ'), - (0x213F, 'M', u'π'), - (0x2140, 'M', u'∑'), - (0x2141, 'V'), - (0x2145, 'M', u'd'), - (0x2147, 'M', u'e'), - (0x2148, 'M', u'i'), - (0x2149, 'M', u'j'), - (0x214A, 'V'), - (0x2150, 'M', u'1⁄7'), - (0x2151, 'M', u'1⁄9'), - (0x2152, 'M', u'1⁄10'), - (0x2153, 'M', u'1⁄3'), - (0x2154, 'M', u'2⁄3'), - (0x2155, 'M', u'1⁄5'), - (0x2156, 'M', u'2⁄5'), - (0x2157, 'M', u'3⁄5'), - (0x2158, 'M', u'4⁄5'), - (0x2159, 'M', u'1⁄6'), - (0x215A, 'M', u'5⁄6'), - (0x215B, 'M', u'1⁄8'), - (0x215C, 'M', u'3⁄8'), - (0x215D, 'M', u'5⁄8'), - (0x215E, 'M', u'7⁄8'), - (0x215F, 'M', u'1⁄'), - (0x2160, 'M', u'i'), - (0x2161, 'M', u'ii'), - (0x2162, 'M', u'iii'), - (0x2163, 'M', u'iv'), - (0x2164, 'M', u'v'), - (0x2165, 'M', u'vi'), - (0x2166, 'M', u'vii'), - (0x2167, 'M', u'viii'), - (0x2168, 'M', u'ix'), - (0x2169, 'M', u'x'), - (0x216A, 'M', u'xi'), - (0x216B, 'M', u'xii'), - (0x216C, 'M', u'l'), - (0x216D, 'M', u'c'), - (0x216E, 'M', u'd'), - (0x216F, 'M', u'm'), - (0x2170, 'M', u'i'), - (0x2171, 'M', u'ii'), - (0x2172, 'M', u'iii'), - (0x2173, 'M', u'iv'), - (0x2174, 'M', u'v'), - (0x2175, 'M', u'vi'), - (0x2176, 'M', u'vii'), - (0x2177, 'M', u'viii'), - (0x2178, 'M', u'ix'), - (0x2179, 'M', u'x'), - (0x217A, 'M', u'xi'), - (0x217B, 'M', u'xii'), - (0x217C, 'M', u'l'), - (0x217D, 'M', u'c'), - (0x217E, 'M', u'd'), - (0x217F, 'M', u'm'), - (0x2180, 'V'), - (0x2183, 'X'), - (0x2184, 'V'), - (0x2189, 'M', u'0⁄3'), - (0x218A, 'X'), - (0x2190, 'V'), - (0x222C, 'M', u'∫∫'), - (0x222D, 'M', u'∫∫∫'), - (0x222E, 'V'), - (0x222F, 'M', u'∮∮'), - (0x2230, 'M', u'∮∮∮'), - (0x2231, 'V'), - (0x2260, '3'), - (0x2261, 'V'), - (0x226E, '3'), - (0x2270, 'V'), - (0x2329, 'M', u'〈'), - (0x232A, 'M', u'〉'), - (0x232B, 'V'), - (0x23F4, 'X'), - (0x2400, 'V'), - (0x2427, 'X'), - (0x2440, 'V'), - (0x244B, 'X'), - (0x2460, 'M', u'1'), - (0x2461, 'M', u'2'), - (0x2462, 'M', u'3'), - (0x2463, 'M', u'4'), - (0x2464, 'M', u'5'), - (0x2465, 'M', u'6'), - (0x2466, 'M', u'7'), - (0x2467, 'M', u'8'), - (0x2468, 'M', u'9'), - (0x2469, 'M', u'10'), - (0x246A, 'M', u'11'), - (0x246B, 'M', u'12'), - ] - -def _seg_23(): - return [ - (0x246C, 'M', u'13'), - (0x246D, 'M', u'14'), - (0x246E, 'M', u'15'), - (0x246F, 'M', u'16'), - (0x2470, 'M', u'17'), - (0x2471, 'M', u'18'), - (0x2472, 'M', u'19'), - (0x2473, 'M', u'20'), - (0x2474, '3', u'(1)'), - (0x2475, '3', u'(2)'), - (0x2476, '3', u'(3)'), - (0x2477, '3', u'(4)'), - (0x2478, '3', u'(5)'), - (0x2479, '3', u'(6)'), - (0x247A, '3', u'(7)'), - (0x247B, '3', u'(8)'), - (0x247C, '3', u'(9)'), - (0x247D, '3', u'(10)'), - (0x247E, '3', u'(11)'), - (0x247F, '3', u'(12)'), - (0x2480, '3', u'(13)'), - (0x2481, '3', u'(14)'), - (0x2482, '3', u'(15)'), - (0x2483, '3', u'(16)'), - (0x2484, '3', u'(17)'), - (0x2485, '3', u'(18)'), - (0x2486, '3', u'(19)'), - (0x2487, '3', u'(20)'), - (0x2488, 'X'), - (0x249C, '3', u'(a)'), - (0x249D, '3', u'(b)'), - (0x249E, '3', u'(c)'), - (0x249F, '3', u'(d)'), - (0x24A0, '3', u'(e)'), - (0x24A1, '3', u'(f)'), - (0x24A2, '3', u'(g)'), - (0x24A3, '3', u'(h)'), - (0x24A4, '3', u'(i)'), - (0x24A5, '3', u'(j)'), - (0x24A6, '3', u'(k)'), - (0x24A7, '3', u'(l)'), - (0x24A8, '3', u'(m)'), - (0x24A9, '3', u'(n)'), - (0x24AA, '3', u'(o)'), - (0x24AB, '3', u'(p)'), - (0x24AC, '3', u'(q)'), - (0x24AD, '3', u'(r)'), - (0x24AE, '3', u'(s)'), - (0x24AF, '3', u'(t)'), - (0x24B0, '3', u'(u)'), - (0x24B1, '3', u'(v)'), - (0x24B2, '3', u'(w)'), - (0x24B3, '3', u'(x)'), - (0x24B4, '3', u'(y)'), - (0x24B5, '3', u'(z)'), - (0x24B6, 'M', u'a'), - (0x24B7, 'M', u'b'), - (0x24B8, 'M', u'c'), - (0x24B9, 'M', u'd'), - (0x24BA, 'M', u'e'), - (0x24BB, 'M', u'f'), - (0x24BC, 'M', u'g'), - (0x24BD, 'M', u'h'), - (0x24BE, 'M', u'i'), - (0x24BF, 'M', u'j'), - (0x24C0, 'M', u'k'), - (0x24C1, 'M', u'l'), - (0x24C2, 'M', u'm'), - (0x24C3, 'M', u'n'), - (0x24C4, 'M', u'o'), - (0x24C5, 'M', u'p'), - (0x24C6, 'M', u'q'), - (0x24C7, 'M', u'r'), - (0x24C8, 'M', u's'), - (0x24C9, 'M', u't'), - (0x24CA, 'M', u'u'), - (0x24CB, 'M', u'v'), - (0x24CC, 'M', u'w'), - (0x24CD, 'M', u'x'), - (0x24CE, 'M', u'y'), - (0x24CF, 'M', u'z'), - (0x24D0, 'M', u'a'), - (0x24D1, 'M', u'b'), - (0x24D2, 'M', u'c'), - (0x24D3, 'M', u'd'), - (0x24D4, 'M', u'e'), - (0x24D5, 'M', u'f'), - (0x24D6, 'M', u'g'), - (0x24D7, 'M', u'h'), - (0x24D8, 'M', u'i'), - (0x24D9, 'M', u'j'), - (0x24DA, 'M', u'k'), - (0x24DB, 'M', u'l'), - (0x24DC, 'M', u'm'), - (0x24DD, 'M', u'n'), - (0x24DE, 'M', u'o'), - (0x24DF, 'M', u'p'), - (0x24E0, 'M', u'q'), - (0x24E1, 'M', u'r'), - (0x24E2, 'M', u's'), - ] - -def _seg_24(): - return [ - (0x24E3, 'M', u't'), - (0x24E4, 'M', u'u'), - (0x24E5, 'M', u'v'), - (0x24E6, 'M', u'w'), - (0x24E7, 'M', u'x'), - (0x24E8, 'M', u'y'), - (0x24E9, 'M', u'z'), - (0x24EA, 'M', u'0'), - (0x24EB, 'V'), - (0x2700, 'X'), - (0x2701, 'V'), - (0x2A0C, 'M', u'∫∫∫∫'), - (0x2A0D, 'V'), - (0x2A74, '3', u'::='), - (0x2A75, '3', u'=='), - (0x2A76, '3', u'==='), - (0x2A77, 'V'), - (0x2ADC, 'M', u'⫝̸'), - (0x2ADD, 'V'), - (0x2B4D, 'X'), - (0x2B50, 'V'), - (0x2B5A, 'X'), - (0x2C00, 'M', u'ⰰ'), - (0x2C01, 'M', u'ⰱ'), - (0x2C02, 'M', u'ⰲ'), - (0x2C03, 'M', u'ⰳ'), - (0x2C04, 'M', u'ⰴ'), - (0x2C05, 'M', u'ⰵ'), - (0x2C06, 'M', u'ⰶ'), - (0x2C07, 'M', u'ⰷ'), - (0x2C08, 'M', u'ⰸ'), - (0x2C09, 'M', u'ⰹ'), - (0x2C0A, 'M', u'ⰺ'), - (0x2C0B, 'M', u'ⰻ'), - (0x2C0C, 'M', u'ⰼ'), - (0x2C0D, 'M', u'ⰽ'), - (0x2C0E, 'M', u'ⰾ'), - (0x2C0F, 'M', u'ⰿ'), - (0x2C10, 'M', u'ⱀ'), - (0x2C11, 'M', u'ⱁ'), - (0x2C12, 'M', u'ⱂ'), - (0x2C13, 'M', u'ⱃ'), - (0x2C14, 'M', u'ⱄ'), - (0x2C15, 'M', u'ⱅ'), - (0x2C16, 'M', u'ⱆ'), - (0x2C17, 'M', u'ⱇ'), - (0x2C18, 'M', u'ⱈ'), - (0x2C19, 'M', u'ⱉ'), - (0x2C1A, 'M', u'ⱊ'), - (0x2C1B, 'M', u'ⱋ'), - (0x2C1C, 'M', u'ⱌ'), - (0x2C1D, 'M', u'ⱍ'), - (0x2C1E, 'M', u'ⱎ'), - (0x2C1F, 'M', u'ⱏ'), - (0x2C20, 'M', u'ⱐ'), - (0x2C21, 'M', u'ⱑ'), - (0x2C22, 'M', u'ⱒ'), - (0x2C23, 'M', u'ⱓ'), - (0x2C24, 'M', u'ⱔ'), - (0x2C25, 'M', u'ⱕ'), - (0x2C26, 'M', u'ⱖ'), - (0x2C27, 'M', u'ⱗ'), - (0x2C28, 'M', u'ⱘ'), - (0x2C29, 'M', u'ⱙ'), - (0x2C2A, 'M', u'ⱚ'), - (0x2C2B, 'M', u'ⱛ'), - (0x2C2C, 'M', u'ⱜ'), - (0x2C2D, 'M', u'ⱝ'), - (0x2C2E, 'M', u'ⱞ'), - (0x2C2F, 'X'), - (0x2C30, 'V'), - (0x2C5F, 'X'), - (0x2C60, 'M', u'ⱡ'), - (0x2C61, 'V'), - (0x2C62, 'M', u'ɫ'), - (0x2C63, 'M', u'ᵽ'), - (0x2C64, 'M', u'ɽ'), - (0x2C65, 'V'), - (0x2C67, 'M', u'ⱨ'), - (0x2C68, 'V'), - (0x2C69, 'M', u'ⱪ'), - (0x2C6A, 'V'), - (0x2C6B, 'M', u'ⱬ'), - (0x2C6C, 'V'), - (0x2C6D, 'M', u'ɑ'), - (0x2C6E, 'M', u'ɱ'), - (0x2C6F, 'M', u'ɐ'), - (0x2C70, 'M', u'ɒ'), - (0x2C71, 'V'), - (0x2C72, 'M', u'ⱳ'), - (0x2C73, 'V'), - (0x2C75, 'M', u'ⱶ'), - (0x2C76, 'V'), - (0x2C7C, 'M', u'j'), - (0x2C7D, 'M', u'v'), - (0x2C7E, 'M', u'ȿ'), - (0x2C7F, 'M', u'ɀ'), - (0x2C80, 'M', u'ⲁ'), - (0x2C81, 'V'), - (0x2C82, 'M', u'ⲃ'), - ] - -def _seg_25(): - return [ - (0x2C83, 'V'), - (0x2C84, 'M', u'ⲅ'), - (0x2C85, 'V'), - (0x2C86, 'M', u'ⲇ'), - (0x2C87, 'V'), - (0x2C88, 'M', u'ⲉ'), - (0x2C89, 'V'), - (0x2C8A, 'M', u'ⲋ'), - (0x2C8B, 'V'), - (0x2C8C, 'M', u'ⲍ'), - (0x2C8D, 'V'), - (0x2C8E, 'M', u'ⲏ'), - (0x2C8F, 'V'), - (0x2C90, 'M', u'ⲑ'), - (0x2C91, 'V'), - (0x2C92, 'M', u'ⲓ'), - (0x2C93, 'V'), - (0x2C94, 'M', u'ⲕ'), - (0x2C95, 'V'), - (0x2C96, 'M', u'ⲗ'), - (0x2C97, 'V'), - (0x2C98, 'M', u'ⲙ'), - (0x2C99, 'V'), - (0x2C9A, 'M', u'ⲛ'), - (0x2C9B, 'V'), - (0x2C9C, 'M', u'ⲝ'), - (0x2C9D, 'V'), - (0x2C9E, 'M', u'ⲟ'), - (0x2C9F, 'V'), - (0x2CA0, 'M', u'ⲡ'), - (0x2CA1, 'V'), - (0x2CA2, 'M', u'ⲣ'), - (0x2CA3, 'V'), - (0x2CA4, 'M', u'ⲥ'), - (0x2CA5, 'V'), - (0x2CA6, 'M', u'ⲧ'), - (0x2CA7, 'V'), - (0x2CA8, 'M', u'ⲩ'), - (0x2CA9, 'V'), - (0x2CAA, 'M', u'ⲫ'), - (0x2CAB, 'V'), - (0x2CAC, 'M', u'ⲭ'), - (0x2CAD, 'V'), - (0x2CAE, 'M', u'ⲯ'), - (0x2CAF, 'V'), - (0x2CB0, 'M', u'ⲱ'), - (0x2CB1, 'V'), - (0x2CB2, 'M', u'ⲳ'), - (0x2CB3, 'V'), - (0x2CB4, 'M', u'ⲵ'), - (0x2CB5, 'V'), - (0x2CB6, 'M', u'ⲷ'), - (0x2CB7, 'V'), - (0x2CB8, 'M', u'ⲹ'), - (0x2CB9, 'V'), - (0x2CBA, 'M', u'ⲻ'), - (0x2CBB, 'V'), - (0x2CBC, 'M', u'ⲽ'), - (0x2CBD, 'V'), - (0x2CBE, 'M', u'ⲿ'), - (0x2CBF, 'V'), - (0x2CC0, 'M', u'ⳁ'), - (0x2CC1, 'V'), - (0x2CC2, 'M', u'ⳃ'), - (0x2CC3, 'V'), - (0x2CC4, 'M', u'ⳅ'), - (0x2CC5, 'V'), - (0x2CC6, 'M', u'ⳇ'), - (0x2CC7, 'V'), - (0x2CC8, 'M', u'ⳉ'), - (0x2CC9, 'V'), - (0x2CCA, 'M', u'ⳋ'), - (0x2CCB, 'V'), - (0x2CCC, 'M', u'ⳍ'), - (0x2CCD, 'V'), - (0x2CCE, 'M', u'ⳏ'), - (0x2CCF, 'V'), - (0x2CD0, 'M', u'ⳑ'), - (0x2CD1, 'V'), - (0x2CD2, 'M', u'ⳓ'), - (0x2CD3, 'V'), - (0x2CD4, 'M', u'ⳕ'), - (0x2CD5, 'V'), - (0x2CD6, 'M', u'ⳗ'), - (0x2CD7, 'V'), - (0x2CD8, 'M', u'ⳙ'), - (0x2CD9, 'V'), - (0x2CDA, 'M', u'ⳛ'), - (0x2CDB, 'V'), - (0x2CDC, 'M', u'ⳝ'), - (0x2CDD, 'V'), - (0x2CDE, 'M', u'ⳟ'), - (0x2CDF, 'V'), - (0x2CE0, 'M', u'ⳡ'), - (0x2CE1, 'V'), - (0x2CE2, 'M', u'ⳣ'), - (0x2CE3, 'V'), - (0x2CEB, 'M', u'ⳬ'), - (0x2CEC, 'V'), - (0x2CED, 'M', u'ⳮ'), - ] - -def _seg_26(): - return [ - (0x2CEE, 'V'), - (0x2CF2, 'M', u'ⳳ'), - (0x2CF3, 'V'), - (0x2CF4, 'X'), - (0x2CF9, 'V'), - (0x2D26, 'X'), - (0x2D27, 'V'), - (0x2D28, 'X'), - (0x2D2D, 'V'), - (0x2D2E, 'X'), - (0x2D30, 'V'), - (0x2D68, 'X'), - (0x2D6F, 'M', u'ⵡ'), - (0x2D70, 'V'), - (0x2D71, 'X'), - (0x2D7F, 'V'), - (0x2D97, 'X'), - (0x2DA0, 'V'), - (0x2DA7, 'X'), - (0x2DA8, 'V'), - (0x2DAF, 'X'), - (0x2DB0, 'V'), - (0x2DB7, 'X'), - (0x2DB8, 'V'), - (0x2DBF, 'X'), - (0x2DC0, 'V'), - (0x2DC7, 'X'), - (0x2DC8, 'V'), - (0x2DCF, 'X'), - (0x2DD0, 'V'), - (0x2DD7, 'X'), - (0x2DD8, 'V'), - (0x2DDF, 'X'), - (0x2DE0, 'V'), - (0x2E3C, 'X'), - (0x2E80, 'V'), - (0x2E9A, 'X'), - (0x2E9B, 'V'), - (0x2E9F, 'M', u'母'), - (0x2EA0, 'V'), - (0x2EF3, 'M', u'龟'), - (0x2EF4, 'X'), - (0x2F00, 'M', u'一'), - (0x2F01, 'M', u'丨'), - (0x2F02, 'M', u'丶'), - (0x2F03, 'M', u'丿'), - (0x2F04, 'M', u'乙'), - (0x2F05, 'M', u'亅'), - (0x2F06, 'M', u'二'), - (0x2F07, 'M', u'亠'), - (0x2F08, 'M', u'人'), - (0x2F09, 'M', u'儿'), - (0x2F0A, 'M', u'入'), - (0x2F0B, 'M', u'八'), - (0x2F0C, 'M', u'冂'), - (0x2F0D, 'M', u'冖'), - (0x2F0E, 'M', u'冫'), - (0x2F0F, 'M', u'几'), - (0x2F10, 'M', u'凵'), - (0x2F11, 'M', u'刀'), - (0x2F12, 'M', u'力'), - (0x2F13, 'M', u'勹'), - (0x2F14, 'M', u'匕'), - (0x2F15, 'M', u'匚'), - (0x2F16, 'M', u'匸'), - (0x2F17, 'M', u'十'), - (0x2F18, 'M', u'卜'), - (0x2F19, 'M', u'卩'), - (0x2F1A, 'M', u'厂'), - (0x2F1B, 'M', u'厶'), - (0x2F1C, 'M', u'又'), - (0x2F1D, 'M', u'口'), - (0x2F1E, 'M', u'囗'), - (0x2F1F, 'M', u'土'), - (0x2F20, 'M', u'士'), - (0x2F21, 'M', u'夂'), - (0x2F22, 'M', u'夊'), - (0x2F23, 'M', u'夕'), - (0x2F24, 'M', u'大'), - (0x2F25, 'M', u'女'), - (0x2F26, 'M', u'子'), - (0x2F27, 'M', u'宀'), - (0x2F28, 'M', u'寸'), - (0x2F29, 'M', u'小'), - (0x2F2A, 'M', u'尢'), - (0x2F2B, 'M', u'尸'), - (0x2F2C, 'M', u'屮'), - (0x2F2D, 'M', u'山'), - (0x2F2E, 'M', u'巛'), - (0x2F2F, 'M', u'工'), - (0x2F30, 'M', u'己'), - (0x2F31, 'M', u'巾'), - (0x2F32, 'M', u'干'), - (0x2F33, 'M', u'幺'), - (0x2F34, 'M', u'广'), - (0x2F35, 'M', u'廴'), - (0x2F36, 'M', u'廾'), - (0x2F37, 'M', u'弋'), - (0x2F38, 'M', u'弓'), - (0x2F39, 'M', u'彐'), - ] - -def _seg_27(): - return [ - (0x2F3A, 'M', u'彡'), - (0x2F3B, 'M', u'彳'), - (0x2F3C, 'M', u'心'), - (0x2F3D, 'M', u'戈'), - (0x2F3E, 'M', u'戶'), - (0x2F3F, 'M', u'手'), - (0x2F40, 'M', u'支'), - (0x2F41, 'M', u'攴'), - (0x2F42, 'M', u'文'), - (0x2F43, 'M', u'斗'), - (0x2F44, 'M', u'斤'), - (0x2F45, 'M', u'方'), - (0x2F46, 'M', u'无'), - (0x2F47, 'M', u'日'), - (0x2F48, 'M', u'曰'), - (0x2F49, 'M', u'月'), - (0x2F4A, 'M', u'木'), - (0x2F4B, 'M', u'欠'), - (0x2F4C, 'M', u'止'), - (0x2F4D, 'M', u'歹'), - (0x2F4E, 'M', u'殳'), - (0x2F4F, 'M', u'毋'), - (0x2F50, 'M', u'比'), - (0x2F51, 'M', u'毛'), - (0x2F52, 'M', u'氏'), - (0x2F53, 'M', u'气'), - (0x2F54, 'M', u'水'), - (0x2F55, 'M', u'火'), - (0x2F56, 'M', u'爪'), - (0x2F57, 'M', u'父'), - (0x2F58, 'M', u'爻'), - (0x2F59, 'M', u'爿'), - (0x2F5A, 'M', u'片'), - (0x2F5B, 'M', u'牙'), - (0x2F5C, 'M', u'牛'), - (0x2F5D, 'M', u'犬'), - (0x2F5E, 'M', u'玄'), - (0x2F5F, 'M', u'玉'), - (0x2F60, 'M', u'瓜'), - (0x2F61, 'M', u'瓦'), - (0x2F62, 'M', u'甘'), - (0x2F63, 'M', u'生'), - (0x2F64, 'M', u'用'), - (0x2F65, 'M', u'田'), - (0x2F66, 'M', u'疋'), - (0x2F67, 'M', u'疒'), - (0x2F68, 'M', u'癶'), - (0x2F69, 'M', u'白'), - (0x2F6A, 'M', u'皮'), - (0x2F6B, 'M', u'皿'), - (0x2F6C, 'M', u'目'), - (0x2F6D, 'M', u'矛'), - (0x2F6E, 'M', u'矢'), - (0x2F6F, 'M', u'石'), - (0x2F70, 'M', u'示'), - (0x2F71, 'M', u'禸'), - (0x2F72, 'M', u'禾'), - (0x2F73, 'M', u'穴'), - (0x2F74, 'M', u'立'), - (0x2F75, 'M', u'竹'), - (0x2F76, 'M', u'米'), - (0x2F77, 'M', u'糸'), - (0x2F78, 'M', u'缶'), - (0x2F79, 'M', u'网'), - (0x2F7A, 'M', u'羊'), - (0x2F7B, 'M', u'羽'), - (0x2F7C, 'M', u'老'), - (0x2F7D, 'M', u'而'), - (0x2F7E, 'M', u'耒'), - (0x2F7F, 'M', u'耳'), - (0x2F80, 'M', u'聿'), - (0x2F81, 'M', u'肉'), - (0x2F82, 'M', u'臣'), - (0x2F83, 'M', u'自'), - (0x2F84, 'M', u'至'), - (0x2F85, 'M', u'臼'), - (0x2F86, 'M', u'舌'), - (0x2F87, 'M', u'舛'), - (0x2F88, 'M', u'舟'), - (0x2F89, 'M', u'艮'), - (0x2F8A, 'M', u'色'), - (0x2F8B, 'M', u'艸'), - (0x2F8C, 'M', u'虍'), - (0x2F8D, 'M', u'虫'), - (0x2F8E, 'M', u'血'), - (0x2F8F, 'M', u'行'), - (0x2F90, 'M', u'衣'), - (0x2F91, 'M', u'襾'), - (0x2F92, 'M', u'見'), - (0x2F93, 'M', u'角'), - (0x2F94, 'M', u'言'), - (0x2F95, 'M', u'谷'), - (0x2F96, 'M', u'豆'), - (0x2F97, 'M', u'豕'), - (0x2F98, 'M', u'豸'), - (0x2F99, 'M', u'貝'), - (0x2F9A, 'M', u'赤'), - (0x2F9B, 'M', u'走'), - (0x2F9C, 'M', u'足'), - (0x2F9D, 'M', u'身'), - ] - -def _seg_28(): - return [ - (0x2F9E, 'M', u'車'), - (0x2F9F, 'M', u'辛'), - (0x2FA0, 'M', u'辰'), - (0x2FA1, 'M', u'辵'), - (0x2FA2, 'M', u'邑'), - (0x2FA3, 'M', u'酉'), - (0x2FA4, 'M', u'釆'), - (0x2FA5, 'M', u'里'), - (0x2FA6, 'M', u'金'), - (0x2FA7, 'M', u'長'), - (0x2FA8, 'M', u'門'), - (0x2FA9, 'M', u'阜'), - (0x2FAA, 'M', u'隶'), - (0x2FAB, 'M', u'隹'), - (0x2FAC, 'M', u'雨'), - (0x2FAD, 'M', u'靑'), - (0x2FAE, 'M', u'非'), - (0x2FAF, 'M', u'面'), - (0x2FB0, 'M', u'革'), - (0x2FB1, 'M', u'韋'), - (0x2FB2, 'M', u'韭'), - (0x2FB3, 'M', u'音'), - (0x2FB4, 'M', u'頁'), - (0x2FB5, 'M', u'風'), - (0x2FB6, 'M', u'飛'), - (0x2FB7, 'M', u'食'), - (0x2FB8, 'M', u'首'), - (0x2FB9, 'M', u'香'), - (0x2FBA, 'M', u'馬'), - (0x2FBB, 'M', u'骨'), - (0x2FBC, 'M', u'高'), - (0x2FBD, 'M', u'髟'), - (0x2FBE, 'M', u'鬥'), - (0x2FBF, 'M', u'鬯'), - (0x2FC0, 'M', u'鬲'), - (0x2FC1, 'M', u'鬼'), - (0x2FC2, 'M', u'魚'), - (0x2FC3, 'M', u'鳥'), - (0x2FC4, 'M', u'鹵'), - (0x2FC5, 'M', u'鹿'), - (0x2FC6, 'M', u'麥'), - (0x2FC7, 'M', u'麻'), - (0x2FC8, 'M', u'黃'), - (0x2FC9, 'M', u'黍'), - (0x2FCA, 'M', u'黑'), - (0x2FCB, 'M', u'黹'), - (0x2FCC, 'M', u'黽'), - (0x2FCD, 'M', u'鼎'), - (0x2FCE, 'M', u'鼓'), - (0x2FCF, 'M', u'鼠'), - (0x2FD0, 'M', u'鼻'), - (0x2FD1, 'M', u'齊'), - (0x2FD2, 'M', u'齒'), - (0x2FD3, 'M', u'龍'), - (0x2FD4, 'M', u'龜'), - (0x2FD5, 'M', u'龠'), - (0x2FD6, 'X'), - (0x3000, '3', u' '), - (0x3001, 'V'), - (0x3002, 'M', u'.'), - (0x3003, 'V'), - (0x3036, 'M', u'〒'), - (0x3037, 'V'), - (0x3038, 'M', u'十'), - (0x3039, 'M', u'卄'), - (0x303A, 'M', u'卅'), - (0x303B, 'V'), - (0x3040, 'X'), - (0x3041, 'V'), - (0x3097, 'X'), - (0x3099, 'V'), - (0x309B, '3', u' ゙'), - (0x309C, '3', u' ゚'), - (0x309D, 'V'), - (0x309F, 'M', u'より'), - (0x30A0, 'V'), - (0x30FF, 'M', u'コト'), - (0x3100, 'X'), - (0x3105, 'V'), - (0x312E, 'X'), - (0x3131, 'M', u'ᄀ'), - (0x3132, 'M', u'ᄁ'), - (0x3133, 'M', u'ᆪ'), - (0x3134, 'M', u'ᄂ'), - (0x3135, 'M', u'ᆬ'), - (0x3136, 'M', u'ᆭ'), - (0x3137, 'M', u'ᄃ'), - (0x3138, 'M', u'ᄄ'), - (0x3139, 'M', u'ᄅ'), - (0x313A, 'M', u'ᆰ'), - (0x313B, 'M', u'ᆱ'), - (0x313C, 'M', u'ᆲ'), - (0x313D, 'M', u'ᆳ'), - (0x313E, 'M', u'ᆴ'), - (0x313F, 'M', u'ᆵ'), - (0x3140, 'M', u'ᄚ'), - (0x3141, 'M', u'ᄆ'), - (0x3142, 'M', u'ᄇ'), - (0x3143, 'M', u'ᄈ'), - (0x3144, 'M', u'ᄡ'), - ] - -def _seg_29(): - return [ - (0x3145, 'M', u'ᄉ'), - (0x3146, 'M', u'ᄊ'), - (0x3147, 'M', u'ᄋ'), - (0x3148, 'M', u'ᄌ'), - (0x3149, 'M', u'ᄍ'), - (0x314A, 'M', u'ᄎ'), - (0x314B, 'M', u'ᄏ'), - (0x314C, 'M', u'ᄐ'), - (0x314D, 'M', u'ᄑ'), - (0x314E, 'M', u'ᄒ'), - (0x314F, 'M', u'ᅡ'), - (0x3150, 'M', u'ᅢ'), - (0x3151, 'M', u'ᅣ'), - (0x3152, 'M', u'ᅤ'), - (0x3153, 'M', u'ᅥ'), - (0x3154, 'M', u'ᅦ'), - (0x3155, 'M', u'ᅧ'), - (0x3156, 'M', u'ᅨ'), - (0x3157, 'M', u'ᅩ'), - (0x3158, 'M', u'ᅪ'), - (0x3159, 'M', u'ᅫ'), - (0x315A, 'M', u'ᅬ'), - (0x315B, 'M', u'ᅭ'), - (0x315C, 'M', u'ᅮ'), - (0x315D, 'M', u'ᅯ'), - (0x315E, 'M', u'ᅰ'), - (0x315F, 'M', u'ᅱ'), - (0x3160, 'M', u'ᅲ'), - (0x3161, 'M', u'ᅳ'), - (0x3162, 'M', u'ᅴ'), - (0x3163, 'M', u'ᅵ'), - (0x3164, 'X'), - (0x3165, 'M', u'ᄔ'), - (0x3166, 'M', u'ᄕ'), - (0x3167, 'M', u'ᇇ'), - (0x3168, 'M', u'ᇈ'), - (0x3169, 'M', u'ᇌ'), - (0x316A, 'M', u'ᇎ'), - (0x316B, 'M', u'ᇓ'), - (0x316C, 'M', u'ᇗ'), - (0x316D, 'M', u'ᇙ'), - (0x316E, 'M', u'ᄜ'), - (0x316F, 'M', u'ᇝ'), - (0x3170, 'M', u'ᇟ'), - (0x3171, 'M', u'ᄝ'), - (0x3172, 'M', u'ᄞ'), - (0x3173, 'M', u'ᄠ'), - (0x3174, 'M', u'ᄢ'), - (0x3175, 'M', u'ᄣ'), - (0x3176, 'M', u'ᄧ'), - (0x3177, 'M', u'ᄩ'), - (0x3178, 'M', u'ᄫ'), - (0x3179, 'M', u'ᄬ'), - (0x317A, 'M', u'ᄭ'), - (0x317B, 'M', u'ᄮ'), - (0x317C, 'M', u'ᄯ'), - (0x317D, 'M', u'ᄲ'), - (0x317E, 'M', u'ᄶ'), - (0x317F, 'M', u'ᅀ'), - (0x3180, 'M', u'ᅇ'), - (0x3181, 'M', u'ᅌ'), - (0x3182, 'M', u'ᇱ'), - (0x3183, 'M', u'ᇲ'), - (0x3184, 'M', u'ᅗ'), - (0x3185, 'M', u'ᅘ'), - (0x3186, 'M', u'ᅙ'), - (0x3187, 'M', u'ᆄ'), - (0x3188, 'M', u'ᆅ'), - (0x3189, 'M', u'ᆈ'), - (0x318A, 'M', u'ᆑ'), - (0x318B, 'M', u'ᆒ'), - (0x318C, 'M', u'ᆔ'), - (0x318D, 'M', u'ᆞ'), - (0x318E, 'M', u'ᆡ'), - (0x318F, 'X'), - (0x3190, 'V'), - (0x3192, 'M', u'一'), - (0x3193, 'M', u'二'), - (0x3194, 'M', u'三'), - (0x3195, 'M', u'四'), - (0x3196, 'M', u'上'), - (0x3197, 'M', u'中'), - (0x3198, 'M', u'下'), - (0x3199, 'M', u'甲'), - (0x319A, 'M', u'乙'), - (0x319B, 'M', u'丙'), - (0x319C, 'M', u'丁'), - (0x319D, 'M', u'天'), - (0x319E, 'M', u'地'), - (0x319F, 'M', u'人'), - (0x31A0, 'V'), - (0x31BB, 'X'), - (0x31C0, 'V'), - (0x31E4, 'X'), - (0x31F0, 'V'), - (0x3200, '3', u'(ᄀ)'), - (0x3201, '3', u'(ᄂ)'), - (0x3202, '3', u'(ᄃ)'), - (0x3203, '3', u'(ᄅ)'), - (0x3204, '3', u'(ᄆ)'), - ] - -def _seg_30(): - return [ - (0x3205, '3', u'(ᄇ)'), - (0x3206, '3', u'(ᄉ)'), - (0x3207, '3', u'(ᄋ)'), - (0x3208, '3', u'(ᄌ)'), - (0x3209, '3', u'(ᄎ)'), - (0x320A, '3', u'(ᄏ)'), - (0x320B, '3', u'(ᄐ)'), - (0x320C, '3', u'(ᄑ)'), - (0x320D, '3', u'(ᄒ)'), - (0x320E, '3', u'(가)'), - (0x320F, '3', u'(나)'), - (0x3210, '3', u'(다)'), - (0x3211, '3', u'(라)'), - (0x3212, '3', u'(마)'), - (0x3213, '3', u'(바)'), - (0x3214, '3', u'(사)'), - (0x3215, '3', u'(아)'), - (0x3216, '3', u'(자)'), - (0x3217, '3', u'(차)'), - (0x3218, '3', u'(카)'), - (0x3219, '3', u'(타)'), - (0x321A, '3', u'(파)'), - (0x321B, '3', u'(하)'), - (0x321C, '3', u'(주)'), - (0x321D, '3', u'(오전)'), - (0x321E, '3', u'(오후)'), - (0x321F, 'X'), - (0x3220, '3', u'(一)'), - (0x3221, '3', u'(二)'), - (0x3222, '3', u'(三)'), - (0x3223, '3', u'(四)'), - (0x3224, '3', u'(五)'), - (0x3225, '3', u'(六)'), - (0x3226, '3', u'(七)'), - (0x3227, '3', u'(八)'), - (0x3228, '3', u'(九)'), - (0x3229, '3', u'(十)'), - (0x322A, '3', u'(月)'), - (0x322B, '3', u'(火)'), - (0x322C, '3', u'(水)'), - (0x322D, '3', u'(木)'), - (0x322E, '3', u'(金)'), - (0x322F, '3', u'(土)'), - (0x3230, '3', u'(日)'), - (0x3231, '3', u'(株)'), - (0x3232, '3', u'(有)'), - (0x3233, '3', u'(社)'), - (0x3234, '3', u'(名)'), - (0x3235, '3', u'(特)'), - (0x3236, '3', u'(財)'), - (0x3237, '3', u'(祝)'), - (0x3238, '3', u'(労)'), - (0x3239, '3', u'(代)'), - (0x323A, '3', u'(呼)'), - (0x323B, '3', u'(学)'), - (0x323C, '3', u'(監)'), - (0x323D, '3', u'(企)'), - (0x323E, '3', u'(資)'), - (0x323F, '3', u'(協)'), - (0x3240, '3', u'(祭)'), - (0x3241, '3', u'(休)'), - (0x3242, '3', u'(自)'), - (0x3243, '3', u'(至)'), - (0x3244, 'M', u'問'), - (0x3245, 'M', u'幼'), - (0x3246, 'M', u'文'), - (0x3247, 'M', u'箏'), - (0x3248, 'V'), - (0x3250, 'M', u'pte'), - (0x3251, 'M', u'21'), - (0x3252, 'M', u'22'), - (0x3253, 'M', u'23'), - (0x3254, 'M', u'24'), - (0x3255, 'M', u'25'), - (0x3256, 'M', u'26'), - (0x3257, 'M', u'27'), - (0x3258, 'M', u'28'), - (0x3259, 'M', u'29'), - (0x325A, 'M', u'30'), - (0x325B, 'M', u'31'), - (0x325C, 'M', u'32'), - (0x325D, 'M', u'33'), - (0x325E, 'M', u'34'), - (0x325F, 'M', u'35'), - (0x3260, 'M', u'ᄀ'), - (0x3261, 'M', u'ᄂ'), - (0x3262, 'M', u'ᄃ'), - (0x3263, 'M', u'ᄅ'), - (0x3264, 'M', u'ᄆ'), - (0x3265, 'M', u'ᄇ'), - (0x3266, 'M', u'ᄉ'), - (0x3267, 'M', u'ᄋ'), - (0x3268, 'M', u'ᄌ'), - (0x3269, 'M', u'ᄎ'), - (0x326A, 'M', u'ᄏ'), - (0x326B, 'M', u'ᄐ'), - (0x326C, 'M', u'ᄑ'), - (0x326D, 'M', u'ᄒ'), - (0x326E, 'M', u'가'), - (0x326F, 'M', u'나'), - ] - -def _seg_31(): - return [ - (0x3270, 'M', u'다'), - (0x3271, 'M', u'라'), - (0x3272, 'M', u'마'), - (0x3273, 'M', u'바'), - (0x3274, 'M', u'사'), - (0x3275, 'M', u'아'), - (0x3276, 'M', u'자'), - (0x3277, 'M', u'차'), - (0x3278, 'M', u'카'), - (0x3279, 'M', u'타'), - (0x327A, 'M', u'파'), - (0x327B, 'M', u'하'), - (0x327C, 'M', u'참고'), - (0x327D, 'M', u'주의'), - (0x327E, 'M', u'우'), - (0x327F, 'V'), - (0x3280, 'M', u'一'), - (0x3281, 'M', u'二'), - (0x3282, 'M', u'三'), - (0x3283, 'M', u'四'), - (0x3284, 'M', u'五'), - (0x3285, 'M', u'六'), - (0x3286, 'M', u'七'), - (0x3287, 'M', u'八'), - (0x3288, 'M', u'九'), - (0x3289, 'M', u'十'), - (0x328A, 'M', u'月'), - (0x328B, 'M', u'火'), - (0x328C, 'M', u'水'), - (0x328D, 'M', u'木'), - (0x328E, 'M', u'金'), - (0x328F, 'M', u'土'), - (0x3290, 'M', u'日'), - (0x3291, 'M', u'株'), - (0x3292, 'M', u'有'), - (0x3293, 'M', u'社'), - (0x3294, 'M', u'名'), - (0x3295, 'M', u'特'), - (0x3296, 'M', u'財'), - (0x3297, 'M', u'祝'), - (0x3298, 'M', u'労'), - (0x3299, 'M', u'秘'), - (0x329A, 'M', u'男'), - (0x329B, 'M', u'女'), - (0x329C, 'M', u'適'), - (0x329D, 'M', u'優'), - (0x329E, 'M', u'印'), - (0x329F, 'M', u'注'), - (0x32A0, 'M', u'項'), - (0x32A1, 'M', u'休'), - (0x32A2, 'M', u'写'), - (0x32A3, 'M', u'正'), - (0x32A4, 'M', u'上'), - (0x32A5, 'M', u'中'), - (0x32A6, 'M', u'下'), - (0x32A7, 'M', u'左'), - (0x32A8, 'M', u'右'), - (0x32A9, 'M', u'医'), - (0x32AA, 'M', u'宗'), - (0x32AB, 'M', u'学'), - (0x32AC, 'M', u'監'), - (0x32AD, 'M', u'企'), - (0x32AE, 'M', u'資'), - (0x32AF, 'M', u'協'), - (0x32B0, 'M', u'夜'), - (0x32B1, 'M', u'36'), - (0x32B2, 'M', u'37'), - (0x32B3, 'M', u'38'), - (0x32B4, 'M', u'39'), - (0x32B5, 'M', u'40'), - (0x32B6, 'M', u'41'), - (0x32B7, 'M', u'42'), - (0x32B8, 'M', u'43'), - (0x32B9, 'M', u'44'), - (0x32BA, 'M', u'45'), - (0x32BB, 'M', u'46'), - (0x32BC, 'M', u'47'), - (0x32BD, 'M', u'48'), - (0x32BE, 'M', u'49'), - (0x32BF, 'M', u'50'), - (0x32C0, 'M', u'1月'), - (0x32C1, 'M', u'2月'), - (0x32C2, 'M', u'3月'), - (0x32C3, 'M', u'4月'), - (0x32C4, 'M', u'5月'), - (0x32C5, 'M', u'6月'), - (0x32C6, 'M', u'7月'), - (0x32C7, 'M', u'8月'), - (0x32C8, 'M', u'9月'), - (0x32C9, 'M', u'10月'), - (0x32CA, 'M', u'11月'), - (0x32CB, 'M', u'12月'), - (0x32CC, 'M', u'hg'), - (0x32CD, 'M', u'erg'), - (0x32CE, 'M', u'ev'), - (0x32CF, 'M', u'ltd'), - (0x32D0, 'M', u'ア'), - (0x32D1, 'M', u'イ'), - (0x32D2, 'M', u'ウ'), - (0x32D3, 'M', u'エ'), - ] - -def _seg_32(): - return [ - (0x32D4, 'M', u'オ'), - (0x32D5, 'M', u'カ'), - (0x32D6, 'M', u'キ'), - (0x32D7, 'M', u'ク'), - (0x32D8, 'M', u'ケ'), - (0x32D9, 'M', u'コ'), - (0x32DA, 'M', u'サ'), - (0x32DB, 'M', u'シ'), - (0x32DC, 'M', u'ス'), - (0x32DD, 'M', u'セ'), - (0x32DE, 'M', u'ソ'), - (0x32DF, 'M', u'タ'), - (0x32E0, 'M', u'チ'), - (0x32E1, 'M', u'ツ'), - (0x32E2, 'M', u'テ'), - (0x32E3, 'M', u'ト'), - (0x32E4, 'M', u'ナ'), - (0x32E5, 'M', u'ニ'), - (0x32E6, 'M', u'ヌ'), - (0x32E7, 'M', u'ネ'), - (0x32E8, 'M', u'ノ'), - (0x32E9, 'M', u'ハ'), - (0x32EA, 'M', u'ヒ'), - (0x32EB, 'M', u'フ'), - (0x32EC, 'M', u'ヘ'), - (0x32ED, 'M', u'ホ'), - (0x32EE, 'M', u'マ'), - (0x32EF, 'M', u'ミ'), - (0x32F0, 'M', u'ム'), - (0x32F1, 'M', u'メ'), - (0x32F2, 'M', u'モ'), - (0x32F3, 'M', u'ヤ'), - (0x32F4, 'M', u'ユ'), - (0x32F5, 'M', u'ヨ'), - (0x32F6, 'M', u'ラ'), - (0x32F7, 'M', u'リ'), - (0x32F8, 'M', u'ル'), - (0x32F9, 'M', u'レ'), - (0x32FA, 'M', u'ロ'), - (0x32FB, 'M', u'ワ'), - (0x32FC, 'M', u'ヰ'), - (0x32FD, 'M', u'ヱ'), - (0x32FE, 'M', u'ヲ'), - (0x32FF, 'X'), - (0x3300, 'M', u'アパート'), - (0x3301, 'M', u'アルファ'), - (0x3302, 'M', u'アンペア'), - (0x3303, 'M', u'アール'), - (0x3304, 'M', u'イニング'), - (0x3305, 'M', u'インチ'), - (0x3306, 'M', u'ウォン'), - (0x3307, 'M', u'エスクード'), - (0x3308, 'M', u'エーカー'), - (0x3309, 'M', u'オンス'), - (0x330A, 'M', u'オーム'), - (0x330B, 'M', u'カイリ'), - (0x330C, 'M', u'カラット'), - (0x330D, 'M', u'カロリー'), - (0x330E, 'M', u'ガロン'), - (0x330F, 'M', u'ガンマ'), - (0x3310, 'M', u'ギガ'), - (0x3311, 'M', u'ギニー'), - (0x3312, 'M', u'キュリー'), - (0x3313, 'M', u'ギルダー'), - (0x3314, 'M', u'キロ'), - (0x3315, 'M', u'キログラム'), - (0x3316, 'M', u'キロメートル'), - (0x3317, 'M', u'キロワット'), - (0x3318, 'M', u'グラム'), - (0x3319, 'M', u'グラムトン'), - (0x331A, 'M', u'クルゼイロ'), - (0x331B, 'M', u'クローネ'), - (0x331C, 'M', u'ケース'), - (0x331D, 'M', u'コルナ'), - (0x331E, 'M', u'コーポ'), - (0x331F, 'M', u'サイクル'), - (0x3320, 'M', u'サンチーム'), - (0x3321, 'M', u'シリング'), - (0x3322, 'M', u'センチ'), - (0x3323, 'M', u'セント'), - (0x3324, 'M', u'ダース'), - (0x3325, 'M', u'デシ'), - (0x3326, 'M', u'ドル'), - (0x3327, 'M', u'トン'), - (0x3328, 'M', u'ナノ'), - (0x3329, 'M', u'ノット'), - (0x332A, 'M', u'ハイツ'), - (0x332B, 'M', u'パーセント'), - (0x332C, 'M', u'パーツ'), - (0x332D, 'M', u'バーレル'), - (0x332E, 'M', u'ピアストル'), - (0x332F, 'M', u'ピクル'), - (0x3330, 'M', u'ピコ'), - (0x3331, 'M', u'ビル'), - (0x3332, 'M', u'ファラッド'), - (0x3333, 'M', u'フィート'), - (0x3334, 'M', u'ブッシェル'), - (0x3335, 'M', u'フラン'), - (0x3336, 'M', u'ヘクタール'), - (0x3337, 'M', u'ペソ'), - ] - -def _seg_33(): - return [ - (0x3338, 'M', u'ペニヒ'), - (0x3339, 'M', u'ヘルツ'), - (0x333A, 'M', u'ペンス'), - (0x333B, 'M', u'ページ'), - (0x333C, 'M', u'ベータ'), - (0x333D, 'M', u'ポイント'), - (0x333E, 'M', u'ボルト'), - (0x333F, 'M', u'ホン'), - (0x3340, 'M', u'ポンド'), - (0x3341, 'M', u'ホール'), - (0x3342, 'M', u'ホーン'), - (0x3343, 'M', u'マイクロ'), - (0x3344, 'M', u'マイル'), - (0x3345, 'M', u'マッハ'), - (0x3346, 'M', u'マルク'), - (0x3347, 'M', u'マンション'), - (0x3348, 'M', u'ミクロン'), - (0x3349, 'M', u'ミリ'), - (0x334A, 'M', u'ミリバール'), - (0x334B, 'M', u'メガ'), - (0x334C, 'M', u'メガトン'), - (0x334D, 'M', u'メートル'), - (0x334E, 'M', u'ヤード'), - (0x334F, 'M', u'ヤール'), - (0x3350, 'M', u'ユアン'), - (0x3351, 'M', u'リットル'), - (0x3352, 'M', u'リラ'), - (0x3353, 'M', u'ルピー'), - (0x3354, 'M', u'ルーブル'), - (0x3355, 'M', u'レム'), - (0x3356, 'M', u'レントゲン'), - (0x3357, 'M', u'ワット'), - (0x3358, 'M', u'0点'), - (0x3359, 'M', u'1点'), - (0x335A, 'M', u'2点'), - (0x335B, 'M', u'3点'), - (0x335C, 'M', u'4点'), - (0x335D, 'M', u'5点'), - (0x335E, 'M', u'6点'), - (0x335F, 'M', u'7点'), - (0x3360, 'M', u'8点'), - (0x3361, 'M', u'9点'), - (0x3362, 'M', u'10点'), - (0x3363, 'M', u'11点'), - (0x3364, 'M', u'12点'), - (0x3365, 'M', u'13点'), - (0x3366, 'M', u'14点'), - (0x3367, 'M', u'15点'), - (0x3368, 'M', u'16点'), - (0x3369, 'M', u'17点'), - (0x336A, 'M', u'18点'), - (0x336B, 'M', u'19点'), - (0x336C, 'M', u'20点'), - (0x336D, 'M', u'21点'), - (0x336E, 'M', u'22点'), - (0x336F, 'M', u'23点'), - (0x3370, 'M', u'24点'), - (0x3371, 'M', u'hpa'), - (0x3372, 'M', u'da'), - (0x3373, 'M', u'au'), - (0x3374, 'M', u'bar'), - (0x3375, 'M', u'ov'), - (0x3376, 'M', u'pc'), - (0x3377, 'M', u'dm'), - (0x3378, 'M', u'dm2'), - (0x3379, 'M', u'dm3'), - (0x337A, 'M', u'iu'), - (0x337B, 'M', u'平成'), - (0x337C, 'M', u'昭和'), - (0x337D, 'M', u'大正'), - (0x337E, 'M', u'明治'), - (0x337F, 'M', u'株式会社'), - (0x3380, 'M', u'pa'), - (0x3381, 'M', u'na'), - (0x3382, 'M', u'μa'), - (0x3383, 'M', u'ma'), - (0x3384, 'M', u'ka'), - (0x3385, 'M', u'kb'), - (0x3386, 'M', u'mb'), - (0x3387, 'M', u'gb'), - (0x3388, 'M', u'cal'), - (0x3389, 'M', u'kcal'), - (0x338A, 'M', u'pf'), - (0x338B, 'M', u'nf'), - (0x338C, 'M', u'μf'), - (0x338D, 'M', u'μg'), - (0x338E, 'M', u'mg'), - (0x338F, 'M', u'kg'), - (0x3390, 'M', u'hz'), - (0x3391, 'M', u'khz'), - (0x3392, 'M', u'mhz'), - (0x3393, 'M', u'ghz'), - (0x3394, 'M', u'thz'), - (0x3395, 'M', u'μl'), - (0x3396, 'M', u'ml'), - (0x3397, 'M', u'dl'), - (0x3398, 'M', u'kl'), - (0x3399, 'M', u'fm'), - (0x339A, 'M', u'nm'), - (0x339B, 'M', u'μm'), - ] - -def _seg_34(): - return [ - (0x339C, 'M', u'mm'), - (0x339D, 'M', u'cm'), - (0x339E, 'M', u'km'), - (0x339F, 'M', u'mm2'), - (0x33A0, 'M', u'cm2'), - (0x33A1, 'M', u'm2'), - (0x33A2, 'M', u'km2'), - (0x33A3, 'M', u'mm3'), - (0x33A4, 'M', u'cm3'), - (0x33A5, 'M', u'm3'), - (0x33A6, 'M', u'km3'), - (0x33A7, 'M', u'm∕s'), - (0x33A8, 'M', u'm∕s2'), - (0x33A9, 'M', u'pa'), - (0x33AA, 'M', u'kpa'), - (0x33AB, 'M', u'mpa'), - (0x33AC, 'M', u'gpa'), - (0x33AD, 'M', u'rad'), - (0x33AE, 'M', u'rad∕s'), - (0x33AF, 'M', u'rad∕s2'), - (0x33B0, 'M', u'ps'), - (0x33B1, 'M', u'ns'), - (0x33B2, 'M', u'μs'), - (0x33B3, 'M', u'ms'), - (0x33B4, 'M', u'pv'), - (0x33B5, 'M', u'nv'), - (0x33B6, 'M', u'μv'), - (0x33B7, 'M', u'mv'), - (0x33B8, 'M', u'kv'), - (0x33B9, 'M', u'mv'), - (0x33BA, 'M', u'pw'), - (0x33BB, 'M', u'nw'), - (0x33BC, 'M', u'μw'), - (0x33BD, 'M', u'mw'), - (0x33BE, 'M', u'kw'), - (0x33BF, 'M', u'mw'), - (0x33C0, 'M', u'kω'), - (0x33C1, 'M', u'mω'), - (0x33C2, 'X'), - (0x33C3, 'M', u'bq'), - (0x33C4, 'M', u'cc'), - (0x33C5, 'M', u'cd'), - (0x33C6, 'M', u'c∕kg'), - (0x33C7, 'X'), - (0x33C8, 'M', u'db'), - (0x33C9, 'M', u'gy'), - (0x33CA, 'M', u'ha'), - (0x33CB, 'M', u'hp'), - (0x33CC, 'M', u'in'), - (0x33CD, 'M', u'kk'), - (0x33CE, 'M', u'km'), - (0x33CF, 'M', u'kt'), - (0x33D0, 'M', u'lm'), - (0x33D1, 'M', u'ln'), - (0x33D2, 'M', u'log'), - (0x33D3, 'M', u'lx'), - (0x33D4, 'M', u'mb'), - (0x33D5, 'M', u'mil'), - (0x33D6, 'M', u'mol'), - (0x33D7, 'M', u'ph'), - (0x33D8, 'X'), - (0x33D9, 'M', u'ppm'), - (0x33DA, 'M', u'pr'), - (0x33DB, 'M', u'sr'), - (0x33DC, 'M', u'sv'), - (0x33DD, 'M', u'wb'), - (0x33DE, 'M', u'v∕m'), - (0x33DF, 'M', u'a∕m'), - (0x33E0, 'M', u'1日'), - (0x33E1, 'M', u'2日'), - (0x33E2, 'M', u'3日'), - (0x33E3, 'M', u'4日'), - (0x33E4, 'M', u'5日'), - (0x33E5, 'M', u'6日'), - (0x33E6, 'M', u'7日'), - (0x33E7, 'M', u'8日'), - (0x33E8, 'M', u'9日'), - (0x33E9, 'M', u'10日'), - (0x33EA, 'M', u'11日'), - (0x33EB, 'M', u'12日'), - (0x33EC, 'M', u'13日'), - (0x33ED, 'M', u'14日'), - (0x33EE, 'M', u'15日'), - (0x33EF, 'M', u'16日'), - (0x33F0, 'M', u'17日'), - (0x33F1, 'M', u'18日'), - (0x33F2, 'M', u'19日'), - (0x33F3, 'M', u'20日'), - (0x33F4, 'M', u'21日'), - (0x33F5, 'M', u'22日'), - (0x33F6, 'M', u'23日'), - (0x33F7, 'M', u'24日'), - (0x33F8, 'M', u'25日'), - (0x33F9, 'M', u'26日'), - (0x33FA, 'M', u'27日'), - (0x33FB, 'M', u'28日'), - (0x33FC, 'M', u'29日'), - (0x33FD, 'M', u'30日'), - (0x33FE, 'M', u'31日'), - (0x33FF, 'M', u'gal'), - ] - -def _seg_35(): - return [ - (0x3400, 'V'), - (0x4DB6, 'X'), - (0x4DC0, 'V'), - (0x9FCD, 'X'), - (0xA000, 'V'), - (0xA48D, 'X'), - (0xA490, 'V'), - (0xA4C7, 'X'), - (0xA4D0, 'V'), - (0xA62C, 'X'), - (0xA640, 'M', u'ꙁ'), - (0xA641, 'V'), - (0xA642, 'M', u'ꙃ'), - (0xA643, 'V'), - (0xA644, 'M', u'ꙅ'), - (0xA645, 'V'), - (0xA646, 'M', u'ꙇ'), - (0xA647, 'V'), - (0xA648, 'M', u'ꙉ'), - (0xA649, 'V'), - (0xA64A, 'M', u'ꙋ'), - (0xA64B, 'V'), - (0xA64C, 'M', u'ꙍ'), - (0xA64D, 'V'), - (0xA64E, 'M', u'ꙏ'), - (0xA64F, 'V'), - (0xA650, 'M', u'ꙑ'), - (0xA651, 'V'), - (0xA652, 'M', u'ꙓ'), - (0xA653, 'V'), - (0xA654, 'M', u'ꙕ'), - (0xA655, 'V'), - (0xA656, 'M', u'ꙗ'), - (0xA657, 'V'), - (0xA658, 'M', u'ꙙ'), - (0xA659, 'V'), - (0xA65A, 'M', u'ꙛ'), - (0xA65B, 'V'), - (0xA65C, 'M', u'ꙝ'), - (0xA65D, 'V'), - (0xA65E, 'M', u'ꙟ'), - (0xA65F, 'V'), - (0xA660, 'M', u'ꙡ'), - (0xA661, 'V'), - (0xA662, 'M', u'ꙣ'), - (0xA663, 'V'), - (0xA664, 'M', u'ꙥ'), - (0xA665, 'V'), - (0xA666, 'M', u'ꙧ'), - (0xA667, 'V'), - (0xA668, 'M', u'ꙩ'), - (0xA669, 'V'), - (0xA66A, 'M', u'ꙫ'), - (0xA66B, 'V'), - (0xA66C, 'M', u'ꙭ'), - (0xA66D, 'V'), - (0xA680, 'M', u'ꚁ'), - (0xA681, 'V'), - (0xA682, 'M', u'ꚃ'), - (0xA683, 'V'), - (0xA684, 'M', u'ꚅ'), - (0xA685, 'V'), - (0xA686, 'M', u'ꚇ'), - (0xA687, 'V'), - (0xA688, 'M', u'ꚉ'), - (0xA689, 'V'), - (0xA68A, 'M', u'ꚋ'), - (0xA68B, 'V'), - (0xA68C, 'M', u'ꚍ'), - (0xA68D, 'V'), - (0xA68E, 'M', u'ꚏ'), - (0xA68F, 'V'), - (0xA690, 'M', u'ꚑ'), - (0xA691, 'V'), - (0xA692, 'M', u'ꚓ'), - (0xA693, 'V'), - (0xA694, 'M', u'ꚕ'), - (0xA695, 'V'), - (0xA696, 'M', u'ꚗ'), - (0xA697, 'V'), - (0xA698, 'X'), - (0xA69F, 'V'), - (0xA6F8, 'X'), - (0xA700, 'V'), - (0xA722, 'M', u'ꜣ'), - (0xA723, 'V'), - (0xA724, 'M', u'ꜥ'), - (0xA725, 'V'), - (0xA726, 'M', u'ꜧ'), - (0xA727, 'V'), - (0xA728, 'M', u'ꜩ'), - (0xA729, 'V'), - (0xA72A, 'M', u'ꜫ'), - (0xA72B, 'V'), - (0xA72C, 'M', u'ꜭ'), - (0xA72D, 'V'), - (0xA72E, 'M', u'ꜯ'), - (0xA72F, 'V'), - (0xA732, 'M', u'ꜳ'), - (0xA733, 'V'), - ] - -def _seg_36(): - return [ - (0xA734, 'M', u'ꜵ'), - (0xA735, 'V'), - (0xA736, 'M', u'ꜷ'), - (0xA737, 'V'), - (0xA738, 'M', u'ꜹ'), - (0xA739, 'V'), - (0xA73A, 'M', u'ꜻ'), - (0xA73B, 'V'), - (0xA73C, 'M', u'ꜽ'), - (0xA73D, 'V'), - (0xA73E, 'M', u'ꜿ'), - (0xA73F, 'V'), - (0xA740, 'M', u'ꝁ'), - (0xA741, 'V'), - (0xA742, 'M', u'ꝃ'), - (0xA743, 'V'), - (0xA744, 'M', u'ꝅ'), - (0xA745, 'V'), - (0xA746, 'M', u'ꝇ'), - (0xA747, 'V'), - (0xA748, 'M', u'ꝉ'), - (0xA749, 'V'), - (0xA74A, 'M', u'ꝋ'), - (0xA74B, 'V'), - (0xA74C, 'M', u'ꝍ'), - (0xA74D, 'V'), - (0xA74E, 'M', u'ꝏ'), - (0xA74F, 'V'), - (0xA750, 'M', u'ꝑ'), - (0xA751, 'V'), - (0xA752, 'M', u'ꝓ'), - (0xA753, 'V'), - (0xA754, 'M', u'ꝕ'), - (0xA755, 'V'), - (0xA756, 'M', u'ꝗ'), - (0xA757, 'V'), - (0xA758, 'M', u'ꝙ'), - (0xA759, 'V'), - (0xA75A, 'M', u'ꝛ'), - (0xA75B, 'V'), - (0xA75C, 'M', u'ꝝ'), - (0xA75D, 'V'), - (0xA75E, 'M', u'ꝟ'), - (0xA75F, 'V'), - (0xA760, 'M', u'ꝡ'), - (0xA761, 'V'), - (0xA762, 'M', u'ꝣ'), - (0xA763, 'V'), - (0xA764, 'M', u'ꝥ'), - (0xA765, 'V'), - (0xA766, 'M', u'ꝧ'), - (0xA767, 'V'), - (0xA768, 'M', u'ꝩ'), - (0xA769, 'V'), - (0xA76A, 'M', u'ꝫ'), - (0xA76B, 'V'), - (0xA76C, 'M', u'ꝭ'), - (0xA76D, 'V'), - (0xA76E, 'M', u'ꝯ'), - (0xA76F, 'V'), - (0xA770, 'M', u'ꝯ'), - (0xA771, 'V'), - (0xA779, 'M', u'ꝺ'), - (0xA77A, 'V'), - (0xA77B, 'M', u'ꝼ'), - (0xA77C, 'V'), - (0xA77D, 'M', u'ᵹ'), - (0xA77E, 'M', u'ꝿ'), - (0xA77F, 'V'), - (0xA780, 'M', u'ꞁ'), - (0xA781, 'V'), - (0xA782, 'M', u'ꞃ'), - (0xA783, 'V'), - (0xA784, 'M', u'ꞅ'), - (0xA785, 'V'), - (0xA786, 'M', u'ꞇ'), - (0xA787, 'V'), - (0xA78B, 'M', u'ꞌ'), - (0xA78C, 'V'), - (0xA78D, 'M', u'ɥ'), - (0xA78E, 'V'), - (0xA78F, 'X'), - (0xA790, 'M', u'ꞑ'), - (0xA791, 'V'), - (0xA792, 'M', u'ꞓ'), - (0xA793, 'V'), - (0xA794, 'X'), - (0xA7A0, 'M', u'ꞡ'), - (0xA7A1, 'V'), - (0xA7A2, 'M', u'ꞣ'), - (0xA7A3, 'V'), - (0xA7A4, 'M', u'ꞥ'), - (0xA7A5, 'V'), - (0xA7A6, 'M', u'ꞧ'), - (0xA7A7, 'V'), - (0xA7A8, 'M', u'ꞩ'), - (0xA7A9, 'V'), - (0xA7AA, 'M', u'ɦ'), - (0xA7AB, 'X'), - (0xA7F8, 'M', u'ħ'), - ] - -def _seg_37(): - return [ - (0xA7F9, 'M', u'œ'), - (0xA7FA, 'V'), - (0xA82C, 'X'), - (0xA830, 'V'), - (0xA83A, 'X'), - (0xA840, 'V'), - (0xA878, 'X'), - (0xA880, 'V'), - (0xA8C5, 'X'), - (0xA8CE, 'V'), - (0xA8DA, 'X'), - (0xA8E0, 'V'), - (0xA8FC, 'X'), - (0xA900, 'V'), - (0xA954, 'X'), - (0xA95F, 'V'), - (0xA97D, 'X'), - (0xA980, 'V'), - (0xA9CE, 'X'), - (0xA9CF, 'V'), - (0xA9DA, 'X'), - (0xA9DE, 'V'), - (0xA9E0, 'X'), - (0xAA00, 'V'), - (0xAA37, 'X'), - (0xAA40, 'V'), - (0xAA4E, 'X'), - (0xAA50, 'V'), - (0xAA5A, 'X'), - (0xAA5C, 'V'), - (0xAA7C, 'X'), - (0xAA80, 'V'), - (0xAAC3, 'X'), - (0xAADB, 'V'), - (0xAAF7, 'X'), - (0xAB01, 'V'), - (0xAB07, 'X'), - (0xAB09, 'V'), - (0xAB0F, 'X'), - (0xAB11, 'V'), - (0xAB17, 'X'), - (0xAB20, 'V'), - (0xAB27, 'X'), - (0xAB28, 'V'), - (0xAB2F, 'X'), - (0xABC0, 'V'), - (0xABEE, 'X'), - (0xABF0, 'V'), - (0xABFA, 'X'), - (0xAC00, 'V'), - (0xD7A4, 'X'), - (0xD7B0, 'V'), - (0xD7C7, 'X'), - (0xD7CB, 'V'), - (0xD7FC, 'X'), - (0xF900, 'M', u'豈'), - (0xF901, 'M', u'更'), - (0xF902, 'M', u'車'), - (0xF903, 'M', u'賈'), - (0xF904, 'M', u'滑'), - (0xF905, 'M', u'串'), - (0xF906, 'M', u'句'), - (0xF907, 'M', u'龜'), - (0xF909, 'M', u'契'), - (0xF90A, 'M', u'金'), - (0xF90B, 'M', u'喇'), - (0xF90C, 'M', u'奈'), - (0xF90D, 'M', u'懶'), - (0xF90E, 'M', u'癩'), - (0xF90F, 'M', u'羅'), - (0xF910, 'M', u'蘿'), - (0xF911, 'M', u'螺'), - (0xF912, 'M', u'裸'), - (0xF913, 'M', u'邏'), - (0xF914, 'M', u'樂'), - (0xF915, 'M', u'洛'), - (0xF916, 'M', u'烙'), - (0xF917, 'M', u'珞'), - (0xF918, 'M', u'落'), - (0xF919, 'M', u'酪'), - (0xF91A, 'M', u'駱'), - (0xF91B, 'M', u'亂'), - (0xF91C, 'M', u'卵'), - (0xF91D, 'M', u'欄'), - (0xF91E, 'M', u'爛'), - (0xF91F, 'M', u'蘭'), - (0xF920, 'M', u'鸞'), - (0xF921, 'M', u'嵐'), - (0xF922, 'M', u'濫'), - (0xF923, 'M', u'藍'), - (0xF924, 'M', u'襤'), - (0xF925, 'M', u'拉'), - (0xF926, 'M', u'臘'), - (0xF927, 'M', u'蠟'), - (0xF928, 'M', u'廊'), - (0xF929, 'M', u'朗'), - (0xF92A, 'M', u'浪'), - (0xF92B, 'M', u'狼'), - (0xF92C, 'M', u'郎'), - (0xF92D, 'M', u'來'), - ] - -def _seg_38(): - return [ - (0xF92E, 'M', u'冷'), - (0xF92F, 'M', u'勞'), - (0xF930, 'M', u'擄'), - (0xF931, 'M', u'櫓'), - (0xF932, 'M', u'爐'), - (0xF933, 'M', u'盧'), - (0xF934, 'M', u'老'), - (0xF935, 'M', u'蘆'), - (0xF936, 'M', u'虜'), - (0xF937, 'M', u'路'), - (0xF938, 'M', u'露'), - (0xF939, 'M', u'魯'), - (0xF93A, 'M', u'鷺'), - (0xF93B, 'M', u'碌'), - (0xF93C, 'M', u'祿'), - (0xF93D, 'M', u'綠'), - (0xF93E, 'M', u'菉'), - (0xF93F, 'M', u'錄'), - (0xF940, 'M', u'鹿'), - (0xF941, 'M', u'論'), - (0xF942, 'M', u'壟'), - (0xF943, 'M', u'弄'), - (0xF944, 'M', u'籠'), - (0xF945, 'M', u'聾'), - (0xF946, 'M', u'牢'), - (0xF947, 'M', u'磊'), - (0xF948, 'M', u'賂'), - (0xF949, 'M', u'雷'), - (0xF94A, 'M', u'壘'), - (0xF94B, 'M', u'屢'), - (0xF94C, 'M', u'樓'), - (0xF94D, 'M', u'淚'), - (0xF94E, 'M', u'漏'), - (0xF94F, 'M', u'累'), - (0xF950, 'M', u'縷'), - (0xF951, 'M', u'陋'), - (0xF952, 'M', u'勒'), - (0xF953, 'M', u'肋'), - (0xF954, 'M', u'凜'), - (0xF955, 'M', u'凌'), - (0xF956, 'M', u'稜'), - (0xF957, 'M', u'綾'), - (0xF958, 'M', u'菱'), - (0xF959, 'M', u'陵'), - (0xF95A, 'M', u'讀'), - (0xF95B, 'M', u'拏'), - (0xF95C, 'M', u'樂'), - (0xF95D, 'M', u'諾'), - (0xF95E, 'M', u'丹'), - (0xF95F, 'M', u'寧'), - (0xF960, 'M', u'怒'), - (0xF961, 'M', u'率'), - (0xF962, 'M', u'異'), - (0xF963, 'M', u'北'), - (0xF964, 'M', u'磻'), - (0xF965, 'M', u'便'), - (0xF966, 'M', u'復'), - (0xF967, 'M', u'不'), - (0xF968, 'M', u'泌'), - (0xF969, 'M', u'數'), - (0xF96A, 'M', u'索'), - (0xF96B, 'M', u'參'), - (0xF96C, 'M', u'塞'), - (0xF96D, 'M', u'省'), - (0xF96E, 'M', u'葉'), - (0xF96F, 'M', u'說'), - (0xF970, 'M', u'殺'), - (0xF971, 'M', u'辰'), - (0xF972, 'M', u'沈'), - (0xF973, 'M', u'拾'), - (0xF974, 'M', u'若'), - (0xF975, 'M', u'掠'), - (0xF976, 'M', u'略'), - (0xF977, 'M', u'亮'), - (0xF978, 'M', u'兩'), - (0xF979, 'M', u'凉'), - (0xF97A, 'M', u'梁'), - (0xF97B, 'M', u'糧'), - (0xF97C, 'M', u'良'), - (0xF97D, 'M', u'諒'), - (0xF97E, 'M', u'量'), - (0xF97F, 'M', u'勵'), - (0xF980, 'M', u'呂'), - (0xF981, 'M', u'女'), - (0xF982, 'M', u'廬'), - (0xF983, 'M', u'旅'), - (0xF984, 'M', u'濾'), - (0xF985, 'M', u'礪'), - (0xF986, 'M', u'閭'), - (0xF987, 'M', u'驪'), - (0xF988, 'M', u'麗'), - (0xF989, 'M', u'黎'), - (0xF98A, 'M', u'力'), - (0xF98B, 'M', u'曆'), - (0xF98C, 'M', u'歷'), - (0xF98D, 'M', u'轢'), - (0xF98E, 'M', u'年'), - (0xF98F, 'M', u'憐'), - (0xF990, 'M', u'戀'), - (0xF991, 'M', u'撚'), - ] - -def _seg_39(): - return [ - (0xF992, 'M', u'漣'), - (0xF993, 'M', u'煉'), - (0xF994, 'M', u'璉'), - (0xF995, 'M', u'秊'), - (0xF996, 'M', u'練'), - (0xF997, 'M', u'聯'), - (0xF998, 'M', u'輦'), - (0xF999, 'M', u'蓮'), - (0xF99A, 'M', u'連'), - (0xF99B, 'M', u'鍊'), - (0xF99C, 'M', u'列'), - (0xF99D, 'M', u'劣'), - (0xF99E, 'M', u'咽'), - (0xF99F, 'M', u'烈'), - (0xF9A0, 'M', u'裂'), - (0xF9A1, 'M', u'說'), - (0xF9A2, 'M', u'廉'), - (0xF9A3, 'M', u'念'), - (0xF9A4, 'M', u'捻'), - (0xF9A5, 'M', u'殮'), - (0xF9A6, 'M', u'簾'), - (0xF9A7, 'M', u'獵'), - (0xF9A8, 'M', u'令'), - (0xF9A9, 'M', u'囹'), - (0xF9AA, 'M', u'寧'), - (0xF9AB, 'M', u'嶺'), - (0xF9AC, 'M', u'怜'), - (0xF9AD, 'M', u'玲'), - (0xF9AE, 'M', u'瑩'), - (0xF9AF, 'M', u'羚'), - (0xF9B0, 'M', u'聆'), - (0xF9B1, 'M', u'鈴'), - (0xF9B2, 'M', u'零'), - (0xF9B3, 'M', u'靈'), - (0xF9B4, 'M', u'領'), - (0xF9B5, 'M', u'例'), - (0xF9B6, 'M', u'禮'), - (0xF9B7, 'M', u'醴'), - (0xF9B8, 'M', u'隸'), - (0xF9B9, 'M', u'惡'), - (0xF9BA, 'M', u'了'), - (0xF9BB, 'M', u'僚'), - (0xF9BC, 'M', u'寮'), - (0xF9BD, 'M', u'尿'), - (0xF9BE, 'M', u'料'), - (0xF9BF, 'M', u'樂'), - (0xF9C0, 'M', u'燎'), - (0xF9C1, 'M', u'療'), - (0xF9C2, 'M', u'蓼'), - (0xF9C3, 'M', u'遼'), - (0xF9C4, 'M', u'龍'), - (0xF9C5, 'M', u'暈'), - (0xF9C6, 'M', u'阮'), - (0xF9C7, 'M', u'劉'), - (0xF9C8, 'M', u'杻'), - (0xF9C9, 'M', u'柳'), - (0xF9CA, 'M', u'流'), - (0xF9CB, 'M', u'溜'), - (0xF9CC, 'M', u'琉'), - (0xF9CD, 'M', u'留'), - (0xF9CE, 'M', u'硫'), - (0xF9CF, 'M', u'紐'), - (0xF9D0, 'M', u'類'), - (0xF9D1, 'M', u'六'), - (0xF9D2, 'M', u'戮'), - (0xF9D3, 'M', u'陸'), - (0xF9D4, 'M', u'倫'), - (0xF9D5, 'M', u'崙'), - (0xF9D6, 'M', u'淪'), - (0xF9D7, 'M', u'輪'), - (0xF9D8, 'M', u'律'), - (0xF9D9, 'M', u'慄'), - (0xF9DA, 'M', u'栗'), - (0xF9DB, 'M', u'率'), - (0xF9DC, 'M', u'隆'), - (0xF9DD, 'M', u'利'), - (0xF9DE, 'M', u'吏'), - (0xF9DF, 'M', u'履'), - (0xF9E0, 'M', u'易'), - (0xF9E1, 'M', u'李'), - (0xF9E2, 'M', u'梨'), - (0xF9E3, 'M', u'泥'), - (0xF9E4, 'M', u'理'), - (0xF9E5, 'M', u'痢'), - (0xF9E6, 'M', u'罹'), - (0xF9E7, 'M', u'裏'), - (0xF9E8, 'M', u'裡'), - (0xF9E9, 'M', u'里'), - (0xF9EA, 'M', u'離'), - (0xF9EB, 'M', u'匿'), - (0xF9EC, 'M', u'溺'), - (0xF9ED, 'M', u'吝'), - (0xF9EE, 'M', u'燐'), - (0xF9EF, 'M', u'璘'), - (0xF9F0, 'M', u'藺'), - (0xF9F1, 'M', u'隣'), - (0xF9F2, 'M', u'鱗'), - (0xF9F3, 'M', u'麟'), - (0xF9F4, 'M', u'林'), - (0xF9F5, 'M', u'淋'), - ] - -def _seg_40(): - return [ - (0xF9F6, 'M', u'臨'), - (0xF9F7, 'M', u'立'), - (0xF9F8, 'M', u'笠'), - (0xF9F9, 'M', u'粒'), - (0xF9FA, 'M', u'狀'), - (0xF9FB, 'M', u'炙'), - (0xF9FC, 'M', u'識'), - (0xF9FD, 'M', u'什'), - (0xF9FE, 'M', u'茶'), - (0xF9FF, 'M', u'刺'), - (0xFA00, 'M', u'切'), - (0xFA01, 'M', u'度'), - (0xFA02, 'M', u'拓'), - (0xFA03, 'M', u'糖'), - (0xFA04, 'M', u'宅'), - (0xFA05, 'M', u'洞'), - (0xFA06, 'M', u'暴'), - (0xFA07, 'M', u'輻'), - (0xFA08, 'M', u'行'), - (0xFA09, 'M', u'降'), - (0xFA0A, 'M', u'見'), - (0xFA0B, 'M', u'廓'), - (0xFA0C, 'M', u'兀'), - (0xFA0D, 'M', u'嗀'), - (0xFA0E, 'V'), - (0xFA10, 'M', u'塚'), - (0xFA11, 'V'), - (0xFA12, 'M', u'晴'), - (0xFA13, 'V'), - (0xFA15, 'M', u'凞'), - (0xFA16, 'M', u'猪'), - (0xFA17, 'M', u'益'), - (0xFA18, 'M', u'礼'), - (0xFA19, 'M', u'神'), - (0xFA1A, 'M', u'祥'), - (0xFA1B, 'M', u'福'), - (0xFA1C, 'M', u'靖'), - (0xFA1D, 'M', u'精'), - (0xFA1E, 'M', u'羽'), - (0xFA1F, 'V'), - (0xFA20, 'M', u'蘒'), - (0xFA21, 'V'), - (0xFA22, 'M', u'諸'), - (0xFA23, 'V'), - (0xFA25, 'M', u'逸'), - (0xFA26, 'M', u'都'), - (0xFA27, 'V'), - (0xFA2A, 'M', u'飯'), - (0xFA2B, 'M', u'飼'), - (0xFA2C, 'M', u'館'), - (0xFA2D, 'M', u'鶴'), - (0xFA2E, 'M', u'郞'), - (0xFA2F, 'M', u'隷'), - (0xFA30, 'M', u'侮'), - (0xFA31, 'M', u'僧'), - (0xFA32, 'M', u'免'), - (0xFA33, 'M', u'勉'), - (0xFA34, 'M', u'勤'), - (0xFA35, 'M', u'卑'), - (0xFA36, 'M', u'喝'), - (0xFA37, 'M', u'嘆'), - (0xFA38, 'M', u'器'), - (0xFA39, 'M', u'塀'), - (0xFA3A, 'M', u'墨'), - (0xFA3B, 'M', u'層'), - (0xFA3C, 'M', u'屮'), - (0xFA3D, 'M', u'悔'), - (0xFA3E, 'M', u'慨'), - (0xFA3F, 'M', u'憎'), - (0xFA40, 'M', u'懲'), - (0xFA41, 'M', u'敏'), - (0xFA42, 'M', u'既'), - (0xFA43, 'M', u'暑'), - (0xFA44, 'M', u'梅'), - (0xFA45, 'M', u'海'), - (0xFA46, 'M', u'渚'), - (0xFA47, 'M', u'漢'), - (0xFA48, 'M', u'煮'), - (0xFA49, 'M', u'爫'), - (0xFA4A, 'M', u'琢'), - (0xFA4B, 'M', u'碑'), - (0xFA4C, 'M', u'社'), - (0xFA4D, 'M', u'祉'), - (0xFA4E, 'M', u'祈'), - (0xFA4F, 'M', u'祐'), - (0xFA50, 'M', u'祖'), - (0xFA51, 'M', u'祝'), - (0xFA52, 'M', u'禍'), - (0xFA53, 'M', u'禎'), - (0xFA54, 'M', u'穀'), - (0xFA55, 'M', u'突'), - (0xFA56, 'M', u'節'), - (0xFA57, 'M', u'練'), - (0xFA58, 'M', u'縉'), - (0xFA59, 'M', u'繁'), - (0xFA5A, 'M', u'署'), - (0xFA5B, 'M', u'者'), - (0xFA5C, 'M', u'臭'), - (0xFA5D, 'M', u'艹'), - (0xFA5F, 'M', u'著'), - ] - -def _seg_41(): - return [ - (0xFA60, 'M', u'褐'), - (0xFA61, 'M', u'視'), - (0xFA62, 'M', u'謁'), - (0xFA63, 'M', u'謹'), - (0xFA64, 'M', u'賓'), - (0xFA65, 'M', u'贈'), - (0xFA66, 'M', u'辶'), - (0xFA67, 'M', u'逸'), - (0xFA68, 'M', u'難'), - (0xFA69, 'M', u'響'), - (0xFA6A, 'M', u'頻'), - (0xFA6B, 'M', u'恵'), - (0xFA6C, 'M', u'𤋮'), - (0xFA6D, 'M', u'舘'), - (0xFA6E, 'X'), - (0xFA70, 'M', u'並'), - (0xFA71, 'M', u'况'), - (0xFA72, 'M', u'全'), - (0xFA73, 'M', u'侀'), - (0xFA74, 'M', u'充'), - (0xFA75, 'M', u'冀'), - (0xFA76, 'M', u'勇'), - (0xFA77, 'M', u'勺'), - (0xFA78, 'M', u'喝'), - (0xFA79, 'M', u'啕'), - (0xFA7A, 'M', u'喙'), - (0xFA7B, 'M', u'嗢'), - (0xFA7C, 'M', u'塚'), - (0xFA7D, 'M', u'墳'), - (0xFA7E, 'M', u'奄'), - (0xFA7F, 'M', u'奔'), - (0xFA80, 'M', u'婢'), - (0xFA81, 'M', u'嬨'), - (0xFA82, 'M', u'廒'), - (0xFA83, 'M', u'廙'), - (0xFA84, 'M', u'彩'), - (0xFA85, 'M', u'徭'), - (0xFA86, 'M', u'惘'), - (0xFA87, 'M', u'慎'), - (0xFA88, 'M', u'愈'), - (0xFA89, 'M', u'憎'), - (0xFA8A, 'M', u'慠'), - (0xFA8B, 'M', u'懲'), - (0xFA8C, 'M', u'戴'), - (0xFA8D, 'M', u'揄'), - (0xFA8E, 'M', u'搜'), - (0xFA8F, 'M', u'摒'), - (0xFA90, 'M', u'敖'), - (0xFA91, 'M', u'晴'), - (0xFA92, 'M', u'朗'), - (0xFA93, 'M', u'望'), - (0xFA94, 'M', u'杖'), - (0xFA95, 'M', u'歹'), - (0xFA96, 'M', u'殺'), - (0xFA97, 'M', u'流'), - (0xFA98, 'M', u'滛'), - (0xFA99, 'M', u'滋'), - (0xFA9A, 'M', u'漢'), - (0xFA9B, 'M', u'瀞'), - (0xFA9C, 'M', u'煮'), - (0xFA9D, 'M', u'瞧'), - (0xFA9E, 'M', u'爵'), - (0xFA9F, 'M', u'犯'), - (0xFAA0, 'M', u'猪'), - (0xFAA1, 'M', u'瑱'), - (0xFAA2, 'M', u'甆'), - (0xFAA3, 'M', u'画'), - (0xFAA4, 'M', u'瘝'), - (0xFAA5, 'M', u'瘟'), - (0xFAA6, 'M', u'益'), - (0xFAA7, 'M', u'盛'), - (0xFAA8, 'M', u'直'), - (0xFAA9, 'M', u'睊'), - (0xFAAA, 'M', u'着'), - (0xFAAB, 'M', u'磌'), - (0xFAAC, 'M', u'窱'), - (0xFAAD, 'M', u'節'), - (0xFAAE, 'M', u'类'), - (0xFAAF, 'M', u'絛'), - (0xFAB0, 'M', u'練'), - (0xFAB1, 'M', u'缾'), - (0xFAB2, 'M', u'者'), - (0xFAB3, 'M', u'荒'), - (0xFAB4, 'M', u'華'), - (0xFAB5, 'M', u'蝹'), - (0xFAB6, 'M', u'襁'), - (0xFAB7, 'M', u'覆'), - (0xFAB8, 'M', u'視'), - (0xFAB9, 'M', u'調'), - (0xFABA, 'M', u'諸'), - (0xFABB, 'M', u'請'), - (0xFABC, 'M', u'謁'), - (0xFABD, 'M', u'諾'), - (0xFABE, 'M', u'諭'), - (0xFABF, 'M', u'謹'), - (0xFAC0, 'M', u'變'), - (0xFAC1, 'M', u'贈'), - (0xFAC2, 'M', u'輸'), - (0xFAC3, 'M', u'遲'), - (0xFAC4, 'M', u'醙'), - ] - -def _seg_42(): - return [ - (0xFAC5, 'M', u'鉶'), - (0xFAC6, 'M', u'陼'), - (0xFAC7, 'M', u'難'), - (0xFAC8, 'M', u'靖'), - (0xFAC9, 'M', u'韛'), - (0xFACA, 'M', u'響'), - (0xFACB, 'M', u'頋'), - (0xFACC, 'M', u'頻'), - (0xFACD, 'M', u'鬒'), - (0xFACE, 'M', u'龜'), - (0xFACF, 'M', u'𢡊'), - (0xFAD0, 'M', u'𢡄'), - (0xFAD1, 'M', u'𣏕'), - (0xFAD2, 'M', u'㮝'), - (0xFAD3, 'M', u'䀘'), - (0xFAD4, 'M', u'䀹'), - (0xFAD5, 'M', u'𥉉'), - (0xFAD6, 'M', u'𥳐'), - (0xFAD7, 'M', u'𧻓'), - (0xFAD8, 'M', u'齃'), - (0xFAD9, 'M', u'龎'), - (0xFADA, 'X'), - (0xFB00, 'M', u'ff'), - (0xFB01, 'M', u'fi'), - (0xFB02, 'M', u'fl'), - (0xFB03, 'M', u'ffi'), - (0xFB04, 'M', u'ffl'), - (0xFB05, 'M', u'st'), - (0xFB07, 'X'), - (0xFB13, 'M', u'մն'), - (0xFB14, 'M', u'մե'), - (0xFB15, 'M', u'մի'), - (0xFB16, 'M', u'վն'), - (0xFB17, 'M', u'մխ'), - (0xFB18, 'X'), - (0xFB1D, 'M', u'יִ'), - (0xFB1E, 'V'), - (0xFB1F, 'M', u'ײַ'), - (0xFB20, 'M', u'ע'), - (0xFB21, 'M', u'א'), - (0xFB22, 'M', u'ד'), - (0xFB23, 'M', u'ה'), - (0xFB24, 'M', u'כ'), - (0xFB25, 'M', u'ל'), - (0xFB26, 'M', u'ם'), - (0xFB27, 'M', u'ר'), - (0xFB28, 'M', u'ת'), - (0xFB29, '3', u'+'), - (0xFB2A, 'M', u'שׁ'), - (0xFB2B, 'M', u'שׂ'), - (0xFB2C, 'M', u'שּׁ'), - (0xFB2D, 'M', u'שּׂ'), - (0xFB2E, 'M', u'אַ'), - (0xFB2F, 'M', u'אָ'), - (0xFB30, 'M', u'אּ'), - (0xFB31, 'M', u'בּ'), - (0xFB32, 'M', u'גּ'), - (0xFB33, 'M', u'דּ'), - (0xFB34, 'M', u'הּ'), - (0xFB35, 'M', u'וּ'), - (0xFB36, 'M', u'זּ'), - (0xFB37, 'X'), - (0xFB38, 'M', u'טּ'), - (0xFB39, 'M', u'יּ'), - (0xFB3A, 'M', u'ךּ'), - (0xFB3B, 'M', u'כּ'), - (0xFB3C, 'M', u'לּ'), - (0xFB3D, 'X'), - (0xFB3E, 'M', u'מּ'), - (0xFB3F, 'X'), - (0xFB40, 'M', u'נּ'), - (0xFB41, 'M', u'סּ'), - (0xFB42, 'X'), - (0xFB43, 'M', u'ףּ'), - (0xFB44, 'M', u'פּ'), - (0xFB45, 'X'), - (0xFB46, 'M', u'צּ'), - (0xFB47, 'M', u'קּ'), - (0xFB48, 'M', u'רּ'), - (0xFB49, 'M', u'שּ'), - (0xFB4A, 'M', u'תּ'), - (0xFB4B, 'M', u'וֹ'), - (0xFB4C, 'M', u'בֿ'), - (0xFB4D, 'M', u'כֿ'), - (0xFB4E, 'M', u'פֿ'), - (0xFB4F, 'M', u'אל'), - (0xFB50, 'M', u'ٱ'), - (0xFB52, 'M', u'ٻ'), - (0xFB56, 'M', u'پ'), - (0xFB5A, 'M', u'ڀ'), - (0xFB5E, 'M', u'ٺ'), - (0xFB62, 'M', u'ٿ'), - (0xFB66, 'M', u'ٹ'), - (0xFB6A, 'M', u'ڤ'), - (0xFB6E, 'M', u'ڦ'), - (0xFB72, 'M', u'ڄ'), - (0xFB76, 'M', u'ڃ'), - (0xFB7A, 'M', u'چ'), - (0xFB7E, 'M', u'ڇ'), - (0xFB82, 'M', u'ڍ'), - ] - -def _seg_43(): - return [ - (0xFB84, 'M', u'ڌ'), - (0xFB86, 'M', u'ڎ'), - (0xFB88, 'M', u'ڈ'), - (0xFB8A, 'M', u'ژ'), - (0xFB8C, 'M', u'ڑ'), - (0xFB8E, 'M', u'ک'), - (0xFB92, 'M', u'گ'), - (0xFB96, 'M', u'ڳ'), - (0xFB9A, 'M', u'ڱ'), - (0xFB9E, 'M', u'ں'), - (0xFBA0, 'M', u'ڻ'), - (0xFBA4, 'M', u'ۀ'), - (0xFBA6, 'M', u'ہ'), - (0xFBAA, 'M', u'ھ'), - (0xFBAE, 'M', u'ے'), - (0xFBB0, 'M', u'ۓ'), - (0xFBB2, 'V'), - (0xFBC2, 'X'), - (0xFBD3, 'M', u'ڭ'), - (0xFBD7, 'M', u'ۇ'), - (0xFBD9, 'M', u'ۆ'), - (0xFBDB, 'M', u'ۈ'), - (0xFBDD, 'M', u'ۇٴ'), - (0xFBDE, 'M', u'ۋ'), - (0xFBE0, 'M', u'ۅ'), - (0xFBE2, 'M', u'ۉ'), - (0xFBE4, 'M', u'ې'), - (0xFBE8, 'M', u'ى'), - (0xFBEA, 'M', u'ئا'), - (0xFBEC, 'M', u'ئە'), - (0xFBEE, 'M', u'ئو'), - (0xFBF0, 'M', u'ئۇ'), - (0xFBF2, 'M', u'ئۆ'), - (0xFBF4, 'M', u'ئۈ'), - (0xFBF6, 'M', u'ئې'), - (0xFBF9, 'M', u'ئى'), - (0xFBFC, 'M', u'ی'), - (0xFC00, 'M', u'ئج'), - (0xFC01, 'M', u'ئح'), - (0xFC02, 'M', u'ئم'), - (0xFC03, 'M', u'ئى'), - (0xFC04, 'M', u'ئي'), - (0xFC05, 'M', u'بج'), - (0xFC06, 'M', u'بح'), - (0xFC07, 'M', u'بخ'), - (0xFC08, 'M', u'بم'), - (0xFC09, 'M', u'بى'), - (0xFC0A, 'M', u'بي'), - (0xFC0B, 'M', u'تج'), - (0xFC0C, 'M', u'تح'), - (0xFC0D, 'M', u'تخ'), - (0xFC0E, 'M', u'تم'), - (0xFC0F, 'M', u'تى'), - (0xFC10, 'M', u'تي'), - (0xFC11, 'M', u'ثج'), - (0xFC12, 'M', u'ثم'), - (0xFC13, 'M', u'ثى'), - (0xFC14, 'M', u'ثي'), - (0xFC15, 'M', u'جح'), - (0xFC16, 'M', u'جم'), - (0xFC17, 'M', u'حج'), - (0xFC18, 'M', u'حم'), - (0xFC19, 'M', u'خج'), - (0xFC1A, 'M', u'خح'), - (0xFC1B, 'M', u'خم'), - (0xFC1C, 'M', u'سج'), - (0xFC1D, 'M', u'سح'), - (0xFC1E, 'M', u'سخ'), - (0xFC1F, 'M', u'سم'), - (0xFC20, 'M', u'صح'), - (0xFC21, 'M', u'صم'), - (0xFC22, 'M', u'ضج'), - (0xFC23, 'M', u'ضح'), - (0xFC24, 'M', u'ضخ'), - (0xFC25, 'M', u'ضم'), - (0xFC26, 'M', u'طح'), - (0xFC27, 'M', u'طم'), - (0xFC28, 'M', u'ظم'), - (0xFC29, 'M', u'عج'), - (0xFC2A, 'M', u'عم'), - (0xFC2B, 'M', u'غج'), - (0xFC2C, 'M', u'غم'), - (0xFC2D, 'M', u'فج'), - (0xFC2E, 'M', u'فح'), - (0xFC2F, 'M', u'فخ'), - (0xFC30, 'M', u'فم'), - (0xFC31, 'M', u'فى'), - (0xFC32, 'M', u'في'), - (0xFC33, 'M', u'قح'), - (0xFC34, 'M', u'قم'), - (0xFC35, 'M', u'قى'), - (0xFC36, 'M', u'قي'), - (0xFC37, 'M', u'كا'), - (0xFC38, 'M', u'كج'), - (0xFC39, 'M', u'كح'), - (0xFC3A, 'M', u'كخ'), - (0xFC3B, 'M', u'كل'), - (0xFC3C, 'M', u'كم'), - (0xFC3D, 'M', u'كى'), - (0xFC3E, 'M', u'كي'), - ] - -def _seg_44(): - return [ - (0xFC3F, 'M', u'لج'), - (0xFC40, 'M', u'لح'), - (0xFC41, 'M', u'لخ'), - (0xFC42, 'M', u'لم'), - (0xFC43, 'M', u'لى'), - (0xFC44, 'M', u'لي'), - (0xFC45, 'M', u'مج'), - (0xFC46, 'M', u'مح'), - (0xFC47, 'M', u'مخ'), - (0xFC48, 'M', u'مم'), - (0xFC49, 'M', u'مى'), - (0xFC4A, 'M', u'مي'), - (0xFC4B, 'M', u'نج'), - (0xFC4C, 'M', u'نح'), - (0xFC4D, 'M', u'نخ'), - (0xFC4E, 'M', u'نم'), - (0xFC4F, 'M', u'نى'), - (0xFC50, 'M', u'ني'), - (0xFC51, 'M', u'هج'), - (0xFC52, 'M', u'هم'), - (0xFC53, 'M', u'هى'), - (0xFC54, 'M', u'هي'), - (0xFC55, 'M', u'يج'), - (0xFC56, 'M', u'يح'), - (0xFC57, 'M', u'يخ'), - (0xFC58, 'M', u'يم'), - (0xFC59, 'M', u'يى'), - (0xFC5A, 'M', u'يي'), - (0xFC5B, 'M', u'ذٰ'), - (0xFC5C, 'M', u'رٰ'), - (0xFC5D, 'M', u'ىٰ'), - (0xFC5E, '3', u' ٌّ'), - (0xFC5F, '3', u' ٍّ'), - (0xFC60, '3', u' َّ'), - (0xFC61, '3', u' ُّ'), - (0xFC62, '3', u' ِّ'), - (0xFC63, '3', u' ّٰ'), - (0xFC64, 'M', u'ئر'), - (0xFC65, 'M', u'ئز'), - (0xFC66, 'M', u'ئم'), - (0xFC67, 'M', u'ئن'), - (0xFC68, 'M', u'ئى'), - (0xFC69, 'M', u'ئي'), - (0xFC6A, 'M', u'بر'), - (0xFC6B, 'M', u'بز'), - (0xFC6C, 'M', u'بم'), - (0xFC6D, 'M', u'بن'), - (0xFC6E, 'M', u'بى'), - (0xFC6F, 'M', u'بي'), - (0xFC70, 'M', u'تر'), - (0xFC71, 'M', u'تز'), - (0xFC72, 'M', u'تم'), - (0xFC73, 'M', u'تن'), - (0xFC74, 'M', u'تى'), - (0xFC75, 'M', u'تي'), - (0xFC76, 'M', u'ثر'), - (0xFC77, 'M', u'ثز'), - (0xFC78, 'M', u'ثم'), - (0xFC79, 'M', u'ثن'), - (0xFC7A, 'M', u'ثى'), - (0xFC7B, 'M', u'ثي'), - (0xFC7C, 'M', u'فى'), - (0xFC7D, 'M', u'في'), - (0xFC7E, 'M', u'قى'), - (0xFC7F, 'M', u'قي'), - (0xFC80, 'M', u'كا'), - (0xFC81, 'M', u'كل'), - (0xFC82, 'M', u'كم'), - (0xFC83, 'M', u'كى'), - (0xFC84, 'M', u'كي'), - (0xFC85, 'M', u'لم'), - (0xFC86, 'M', u'لى'), - (0xFC87, 'M', u'لي'), - (0xFC88, 'M', u'ما'), - (0xFC89, 'M', u'مم'), - (0xFC8A, 'M', u'نر'), - (0xFC8B, 'M', u'نز'), - (0xFC8C, 'M', u'نم'), - (0xFC8D, 'M', u'نن'), - (0xFC8E, 'M', u'نى'), - (0xFC8F, 'M', u'ني'), - (0xFC90, 'M', u'ىٰ'), - (0xFC91, 'M', u'ير'), - (0xFC92, 'M', u'يز'), - (0xFC93, 'M', u'يم'), - (0xFC94, 'M', u'ين'), - (0xFC95, 'M', u'يى'), - (0xFC96, 'M', u'يي'), - (0xFC97, 'M', u'ئج'), - (0xFC98, 'M', u'ئح'), - (0xFC99, 'M', u'ئخ'), - (0xFC9A, 'M', u'ئم'), - (0xFC9B, 'M', u'ئه'), - (0xFC9C, 'M', u'بج'), - (0xFC9D, 'M', u'بح'), - (0xFC9E, 'M', u'بخ'), - (0xFC9F, 'M', u'بم'), - (0xFCA0, 'M', u'به'), - (0xFCA1, 'M', u'تج'), - (0xFCA2, 'M', u'تح'), - ] - -def _seg_45(): - return [ - (0xFCA3, 'M', u'تخ'), - (0xFCA4, 'M', u'تم'), - (0xFCA5, 'M', u'ته'), - (0xFCA6, 'M', u'ثم'), - (0xFCA7, 'M', u'جح'), - (0xFCA8, 'M', u'جم'), - (0xFCA9, 'M', u'حج'), - (0xFCAA, 'M', u'حم'), - (0xFCAB, 'M', u'خج'), - (0xFCAC, 'M', u'خم'), - (0xFCAD, 'M', u'سج'), - (0xFCAE, 'M', u'سح'), - (0xFCAF, 'M', u'سخ'), - (0xFCB0, 'M', u'سم'), - (0xFCB1, 'M', u'صح'), - (0xFCB2, 'M', u'صخ'), - (0xFCB3, 'M', u'صم'), - (0xFCB4, 'M', u'ضج'), - (0xFCB5, 'M', u'ضح'), - (0xFCB6, 'M', u'ضخ'), - (0xFCB7, 'M', u'ضم'), - (0xFCB8, 'M', u'طح'), - (0xFCB9, 'M', u'ظم'), - (0xFCBA, 'M', u'عج'), - (0xFCBB, 'M', u'عم'), - (0xFCBC, 'M', u'غج'), - (0xFCBD, 'M', u'غم'), - (0xFCBE, 'M', u'فج'), - (0xFCBF, 'M', u'فح'), - (0xFCC0, 'M', u'فخ'), - (0xFCC1, 'M', u'فم'), - (0xFCC2, 'M', u'قح'), - (0xFCC3, 'M', u'قم'), - (0xFCC4, 'M', u'كج'), - (0xFCC5, 'M', u'كح'), - (0xFCC6, 'M', u'كخ'), - (0xFCC7, 'M', u'كل'), - (0xFCC8, 'M', u'كم'), - (0xFCC9, 'M', u'لج'), - (0xFCCA, 'M', u'لح'), - (0xFCCB, 'M', u'لخ'), - (0xFCCC, 'M', u'لم'), - (0xFCCD, 'M', u'له'), - (0xFCCE, 'M', u'مج'), - (0xFCCF, 'M', u'مح'), - (0xFCD0, 'M', u'مخ'), - (0xFCD1, 'M', u'مم'), - (0xFCD2, 'M', u'نج'), - (0xFCD3, 'M', u'نح'), - (0xFCD4, 'M', u'نخ'), - (0xFCD5, 'M', u'نم'), - (0xFCD6, 'M', u'نه'), - (0xFCD7, 'M', u'هج'), - (0xFCD8, 'M', u'هم'), - (0xFCD9, 'M', u'هٰ'), - (0xFCDA, 'M', u'يج'), - (0xFCDB, 'M', u'يح'), - (0xFCDC, 'M', u'يخ'), - (0xFCDD, 'M', u'يم'), - (0xFCDE, 'M', u'يه'), - (0xFCDF, 'M', u'ئم'), - (0xFCE0, 'M', u'ئه'), - (0xFCE1, 'M', u'بم'), - (0xFCE2, 'M', u'به'), - (0xFCE3, 'M', u'تم'), - (0xFCE4, 'M', u'ته'), - (0xFCE5, 'M', u'ثم'), - (0xFCE6, 'M', u'ثه'), - (0xFCE7, 'M', u'سم'), - (0xFCE8, 'M', u'سه'), - (0xFCE9, 'M', u'شم'), - (0xFCEA, 'M', u'شه'), - (0xFCEB, 'M', u'كل'), - (0xFCEC, 'M', u'كم'), - (0xFCED, 'M', u'لم'), - (0xFCEE, 'M', u'نم'), - (0xFCEF, 'M', u'نه'), - (0xFCF0, 'M', u'يم'), - (0xFCF1, 'M', u'يه'), - (0xFCF2, 'M', u'ـَّ'), - (0xFCF3, 'M', u'ـُّ'), - (0xFCF4, 'M', u'ـِّ'), - (0xFCF5, 'M', u'طى'), - (0xFCF6, 'M', u'طي'), - (0xFCF7, 'M', u'عى'), - (0xFCF8, 'M', u'عي'), - (0xFCF9, 'M', u'غى'), - (0xFCFA, 'M', u'غي'), - (0xFCFB, 'M', u'سى'), - (0xFCFC, 'M', u'سي'), - (0xFCFD, 'M', u'شى'), - (0xFCFE, 'M', u'شي'), - (0xFCFF, 'M', u'حى'), - (0xFD00, 'M', u'حي'), - (0xFD01, 'M', u'جى'), - (0xFD02, 'M', u'جي'), - (0xFD03, 'M', u'خى'), - (0xFD04, 'M', u'خي'), - (0xFD05, 'M', u'صى'), - (0xFD06, 'M', u'صي'), - ] - -def _seg_46(): - return [ - (0xFD07, 'M', u'ضى'), - (0xFD08, 'M', u'ضي'), - (0xFD09, 'M', u'شج'), - (0xFD0A, 'M', u'شح'), - (0xFD0B, 'M', u'شخ'), - (0xFD0C, 'M', u'شم'), - (0xFD0D, 'M', u'شر'), - (0xFD0E, 'M', u'سر'), - (0xFD0F, 'M', u'صر'), - (0xFD10, 'M', u'ضر'), - (0xFD11, 'M', u'طى'), - (0xFD12, 'M', u'طي'), - (0xFD13, 'M', u'عى'), - (0xFD14, 'M', u'عي'), - (0xFD15, 'M', u'غى'), - (0xFD16, 'M', u'غي'), - (0xFD17, 'M', u'سى'), - (0xFD18, 'M', u'سي'), - (0xFD19, 'M', u'شى'), - (0xFD1A, 'M', u'شي'), - (0xFD1B, 'M', u'حى'), - (0xFD1C, 'M', u'حي'), - (0xFD1D, 'M', u'جى'), - (0xFD1E, 'M', u'جي'), - (0xFD1F, 'M', u'خى'), - (0xFD20, 'M', u'خي'), - (0xFD21, 'M', u'صى'), - (0xFD22, 'M', u'صي'), - (0xFD23, 'M', u'ضى'), - (0xFD24, 'M', u'ضي'), - (0xFD25, 'M', u'شج'), - (0xFD26, 'M', u'شح'), - (0xFD27, 'M', u'شخ'), - (0xFD28, 'M', u'شم'), - (0xFD29, 'M', u'شر'), - (0xFD2A, 'M', u'سر'), - (0xFD2B, 'M', u'صر'), - (0xFD2C, 'M', u'ضر'), - (0xFD2D, 'M', u'شج'), - (0xFD2E, 'M', u'شح'), - (0xFD2F, 'M', u'شخ'), - (0xFD30, 'M', u'شم'), - (0xFD31, 'M', u'سه'), - (0xFD32, 'M', u'شه'), - (0xFD33, 'M', u'طم'), - (0xFD34, 'M', u'سج'), - (0xFD35, 'M', u'سح'), - (0xFD36, 'M', u'سخ'), - (0xFD37, 'M', u'شج'), - (0xFD38, 'M', u'شح'), - (0xFD39, 'M', u'شخ'), - (0xFD3A, 'M', u'طم'), - (0xFD3B, 'M', u'ظم'), - (0xFD3C, 'M', u'اً'), - (0xFD3E, 'V'), - (0xFD40, 'X'), - (0xFD50, 'M', u'تجم'), - (0xFD51, 'M', u'تحج'), - (0xFD53, 'M', u'تحم'), - (0xFD54, 'M', u'تخم'), - (0xFD55, 'M', u'تمج'), - (0xFD56, 'M', u'تمح'), - (0xFD57, 'M', u'تمخ'), - (0xFD58, 'M', u'جمح'), - (0xFD5A, 'M', u'حمي'), - (0xFD5B, 'M', u'حمى'), - (0xFD5C, 'M', u'سحج'), - (0xFD5D, 'M', u'سجح'), - (0xFD5E, 'M', u'سجى'), - (0xFD5F, 'M', u'سمح'), - (0xFD61, 'M', u'سمج'), - (0xFD62, 'M', u'سمم'), - (0xFD64, 'M', u'صحح'), - (0xFD66, 'M', u'صمم'), - (0xFD67, 'M', u'شحم'), - (0xFD69, 'M', u'شجي'), - (0xFD6A, 'M', u'شمخ'), - (0xFD6C, 'M', u'شمم'), - (0xFD6E, 'M', u'ضحى'), - (0xFD6F, 'M', u'ضخم'), - (0xFD71, 'M', u'طمح'), - (0xFD73, 'M', u'طمم'), - (0xFD74, 'M', u'طمي'), - (0xFD75, 'M', u'عجم'), - (0xFD76, 'M', u'عمم'), - (0xFD78, 'M', u'عمى'), - (0xFD79, 'M', u'غمم'), - (0xFD7A, 'M', u'غمي'), - (0xFD7B, 'M', u'غمى'), - (0xFD7C, 'M', u'فخم'), - (0xFD7E, 'M', u'قمح'), - (0xFD7F, 'M', u'قمم'), - (0xFD80, 'M', u'لحم'), - (0xFD81, 'M', u'لحي'), - (0xFD82, 'M', u'لحى'), - (0xFD83, 'M', u'لجج'), - (0xFD85, 'M', u'لخم'), - (0xFD87, 'M', u'لمح'), - (0xFD89, 'M', u'محج'), - (0xFD8A, 'M', u'محم'), - ] - -def _seg_47(): - return [ - (0xFD8B, 'M', u'محي'), - (0xFD8C, 'M', u'مجح'), - (0xFD8D, 'M', u'مجم'), - (0xFD8E, 'M', u'مخج'), - (0xFD8F, 'M', u'مخم'), - (0xFD90, 'X'), - (0xFD92, 'M', u'مجخ'), - (0xFD93, 'M', u'همج'), - (0xFD94, 'M', u'همم'), - (0xFD95, 'M', u'نحم'), - (0xFD96, 'M', u'نحى'), - (0xFD97, 'M', u'نجم'), - (0xFD99, 'M', u'نجى'), - (0xFD9A, 'M', u'نمي'), - (0xFD9B, 'M', u'نمى'), - (0xFD9C, 'M', u'يمم'), - (0xFD9E, 'M', u'بخي'), - (0xFD9F, 'M', u'تجي'), - (0xFDA0, 'M', u'تجى'), - (0xFDA1, 'M', u'تخي'), - (0xFDA2, 'M', u'تخى'), - (0xFDA3, 'M', u'تمي'), - (0xFDA4, 'M', u'تمى'), - (0xFDA5, 'M', u'جمي'), - (0xFDA6, 'M', u'جحى'), - (0xFDA7, 'M', u'جمى'), - (0xFDA8, 'M', u'سخى'), - (0xFDA9, 'M', u'صحي'), - (0xFDAA, 'M', u'شحي'), - (0xFDAB, 'M', u'ضحي'), - (0xFDAC, 'M', u'لجي'), - (0xFDAD, 'M', u'لمي'), - (0xFDAE, 'M', u'يحي'), - (0xFDAF, 'M', u'يجي'), - (0xFDB0, 'M', u'يمي'), - (0xFDB1, 'M', u'ممي'), - (0xFDB2, 'M', u'قمي'), - (0xFDB3, 'M', u'نحي'), - (0xFDB4, 'M', u'قمح'), - (0xFDB5, 'M', u'لحم'), - (0xFDB6, 'M', u'عمي'), - (0xFDB7, 'M', u'كمي'), - (0xFDB8, 'M', u'نجح'), - (0xFDB9, 'M', u'مخي'), - (0xFDBA, 'M', u'لجم'), - (0xFDBB, 'M', u'كمم'), - (0xFDBC, 'M', u'لجم'), - (0xFDBD, 'M', u'نجح'), - (0xFDBE, 'M', u'جحي'), - (0xFDBF, 'M', u'حجي'), - (0xFDC0, 'M', u'مجي'), - (0xFDC1, 'M', u'فمي'), - (0xFDC2, 'M', u'بحي'), - (0xFDC3, 'M', u'كمم'), - (0xFDC4, 'M', u'عجم'), - (0xFDC5, 'M', u'صمم'), - (0xFDC6, 'M', u'سخي'), - (0xFDC7, 'M', u'نجي'), - (0xFDC8, 'X'), - (0xFDF0, 'M', u'صلے'), - (0xFDF1, 'M', u'قلے'), - (0xFDF2, 'M', u'الله'), - (0xFDF3, 'M', u'اكبر'), - (0xFDF4, 'M', u'محمد'), - (0xFDF5, 'M', u'صلعم'), - (0xFDF6, 'M', u'رسول'), - (0xFDF7, 'M', u'عليه'), - (0xFDF8, 'M', u'وسلم'), - (0xFDF9, 'M', u'صلى'), - (0xFDFA, '3', u'صلى الله عليه وسلم'), - (0xFDFB, '3', u'جل جلاله'), - (0xFDFC, 'M', u'ریال'), - (0xFDFD, 'V'), - (0xFDFE, 'X'), - (0xFE00, 'I'), - (0xFE10, '3', u','), - (0xFE11, 'M', u'、'), - (0xFE12, 'X'), - (0xFE13, '3', u':'), - (0xFE14, '3', u';'), - (0xFE15, '3', u'!'), - (0xFE16, '3', u'?'), - (0xFE17, 'M', u'〖'), - (0xFE18, 'M', u'〗'), - (0xFE19, 'X'), - (0xFE20, 'V'), - (0xFE27, 'X'), - (0xFE31, 'M', u'—'), - (0xFE32, 'M', u'–'), - (0xFE33, '3', u'_'), - (0xFE35, '3', u'('), - (0xFE36, '3', u')'), - (0xFE37, '3', u'{'), - (0xFE38, '3', u'}'), - (0xFE39, 'M', u'〔'), - (0xFE3A, 'M', u'〕'), - (0xFE3B, 'M', u'【'), - (0xFE3C, 'M', u'】'), - (0xFE3D, 'M', u'《'), - (0xFE3E, 'M', u'》'), - ] - -def _seg_48(): - return [ - (0xFE3F, 'M', u'〈'), - (0xFE40, 'M', u'〉'), - (0xFE41, 'M', u'「'), - (0xFE42, 'M', u'」'), - (0xFE43, 'M', u'『'), - (0xFE44, 'M', u'』'), - (0xFE45, 'V'), - (0xFE47, '3', u'['), - (0xFE48, '3', u']'), - (0xFE49, '3', u' ̅'), - (0xFE4D, '3', u'_'), - (0xFE50, '3', u','), - (0xFE51, 'M', u'、'), - (0xFE52, 'X'), - (0xFE54, '3', u';'), - (0xFE55, '3', u':'), - (0xFE56, '3', u'?'), - (0xFE57, '3', u'!'), - (0xFE58, 'M', u'—'), - (0xFE59, '3', u'('), - (0xFE5A, '3', u')'), - (0xFE5B, '3', u'{'), - (0xFE5C, '3', u'}'), - (0xFE5D, 'M', u'〔'), - (0xFE5E, 'M', u'〕'), - (0xFE5F, '3', u'#'), - (0xFE60, '3', u'&'), - (0xFE61, '3', u'*'), - (0xFE62, '3', u'+'), - (0xFE63, 'M', u'-'), - (0xFE64, '3', u'<'), - (0xFE65, '3', u'>'), - (0xFE66, '3', u'='), - (0xFE67, 'X'), - (0xFE68, '3', u'\\'), - (0xFE69, '3', u'$'), - (0xFE6A, '3', u'%'), - (0xFE6B, '3', u'@'), - (0xFE6C, 'X'), - (0xFE70, '3', u' ً'), - (0xFE71, 'M', u'ـً'), - (0xFE72, '3', u' ٌ'), - (0xFE73, 'V'), - (0xFE74, '3', u' ٍ'), - (0xFE75, 'X'), - (0xFE76, '3', u' َ'), - (0xFE77, 'M', u'ـَ'), - (0xFE78, '3', u' ُ'), - (0xFE79, 'M', u'ـُ'), - (0xFE7A, '3', u' ِ'), - (0xFE7B, 'M', u'ـِ'), - (0xFE7C, '3', u' ّ'), - (0xFE7D, 'M', u'ـّ'), - (0xFE7E, '3', u' ْ'), - (0xFE7F, 'M', u'ـْ'), - (0xFE80, 'M', u'ء'), - (0xFE81, 'M', u'آ'), - (0xFE83, 'M', u'أ'), - (0xFE85, 'M', u'ؤ'), - (0xFE87, 'M', u'إ'), - (0xFE89, 'M', u'ئ'), - (0xFE8D, 'M', u'ا'), - (0xFE8F, 'M', u'ب'), - (0xFE93, 'M', u'ة'), - (0xFE95, 'M', u'ت'), - (0xFE99, 'M', u'ث'), - (0xFE9D, 'M', u'ج'), - (0xFEA1, 'M', u'ح'), - (0xFEA5, 'M', u'خ'), - (0xFEA9, 'M', u'د'), - (0xFEAB, 'M', u'ذ'), - (0xFEAD, 'M', u'ر'), - (0xFEAF, 'M', u'ز'), - (0xFEB1, 'M', u'س'), - (0xFEB5, 'M', u'ش'), - (0xFEB9, 'M', u'ص'), - (0xFEBD, 'M', u'ض'), - (0xFEC1, 'M', u'ط'), - (0xFEC5, 'M', u'ظ'), - (0xFEC9, 'M', u'ع'), - (0xFECD, 'M', u'غ'), - (0xFED1, 'M', u'ف'), - (0xFED5, 'M', u'ق'), - (0xFED9, 'M', u'ك'), - (0xFEDD, 'M', u'ل'), - (0xFEE1, 'M', u'م'), - (0xFEE5, 'M', u'ن'), - (0xFEE9, 'M', u'ه'), - (0xFEED, 'M', u'و'), - (0xFEEF, 'M', u'ى'), - (0xFEF1, 'M', u'ي'), - (0xFEF5, 'M', u'لآ'), - (0xFEF7, 'M', u'لأ'), - (0xFEF9, 'M', u'لإ'), - (0xFEFB, 'M', u'لا'), - (0xFEFD, 'X'), - (0xFEFF, 'I'), - (0xFF00, 'X'), - (0xFF01, '3', u'!'), - (0xFF02, '3', u'"'), - ] - -def _seg_49(): - return [ - (0xFF03, '3', u'#'), - (0xFF04, '3', u'$'), - (0xFF05, '3', u'%'), - (0xFF06, '3', u'&'), - (0xFF07, '3', u'\''), - (0xFF08, '3', u'('), - (0xFF09, '3', u')'), - (0xFF0A, '3', u'*'), - (0xFF0B, '3', u'+'), - (0xFF0C, '3', u','), - (0xFF0D, 'M', u'-'), - (0xFF0E, 'M', u'.'), - (0xFF0F, '3', u'/'), - (0xFF10, 'M', u'0'), - (0xFF11, 'M', u'1'), - (0xFF12, 'M', u'2'), - (0xFF13, 'M', u'3'), - (0xFF14, 'M', u'4'), - (0xFF15, 'M', u'5'), - (0xFF16, 'M', u'6'), - (0xFF17, 'M', u'7'), - (0xFF18, 'M', u'8'), - (0xFF19, 'M', u'9'), - (0xFF1A, '3', u':'), - (0xFF1B, '3', u';'), - (0xFF1C, '3', u'<'), - (0xFF1D, '3', u'='), - (0xFF1E, '3', u'>'), - (0xFF1F, '3', u'?'), - (0xFF20, '3', u'@'), - (0xFF21, 'M', u'a'), - (0xFF22, 'M', u'b'), - (0xFF23, 'M', u'c'), - (0xFF24, 'M', u'd'), - (0xFF25, 'M', u'e'), - (0xFF26, 'M', u'f'), - (0xFF27, 'M', u'g'), - (0xFF28, 'M', u'h'), - (0xFF29, 'M', u'i'), - (0xFF2A, 'M', u'j'), - (0xFF2B, 'M', u'k'), - (0xFF2C, 'M', u'l'), - (0xFF2D, 'M', u'm'), - (0xFF2E, 'M', u'n'), - (0xFF2F, 'M', u'o'), - (0xFF30, 'M', u'p'), - (0xFF31, 'M', u'q'), - (0xFF32, 'M', u'r'), - (0xFF33, 'M', u's'), - (0xFF34, 'M', u't'), - (0xFF35, 'M', u'u'), - (0xFF36, 'M', u'v'), - (0xFF37, 'M', u'w'), - (0xFF38, 'M', u'x'), - (0xFF39, 'M', u'y'), - (0xFF3A, 'M', u'z'), - (0xFF3B, '3', u'['), - (0xFF3C, '3', u'\\'), - (0xFF3D, '3', u']'), - (0xFF3E, '3', u'^'), - (0xFF3F, '3', u'_'), - (0xFF40, '3', u'`'), - (0xFF41, 'M', u'a'), - (0xFF42, 'M', u'b'), - (0xFF43, 'M', u'c'), - (0xFF44, 'M', u'd'), - (0xFF45, 'M', u'e'), - (0xFF46, 'M', u'f'), - (0xFF47, 'M', u'g'), - (0xFF48, 'M', u'h'), - (0xFF49, 'M', u'i'), - (0xFF4A, 'M', u'j'), - (0xFF4B, 'M', u'k'), - (0xFF4C, 'M', u'l'), - (0xFF4D, 'M', u'm'), - (0xFF4E, 'M', u'n'), - (0xFF4F, 'M', u'o'), - (0xFF50, 'M', u'p'), - (0xFF51, 'M', u'q'), - (0xFF52, 'M', u'r'), - (0xFF53, 'M', u's'), - (0xFF54, 'M', u't'), - (0xFF55, 'M', u'u'), - (0xFF56, 'M', u'v'), - (0xFF57, 'M', u'w'), - (0xFF58, 'M', u'x'), - (0xFF59, 'M', u'y'), - (0xFF5A, 'M', u'z'), - (0xFF5B, '3', u'{'), - (0xFF5C, '3', u'|'), - (0xFF5D, '3', u'}'), - (0xFF5E, '3', u'~'), - (0xFF5F, 'M', u'⦅'), - (0xFF60, 'M', u'⦆'), - (0xFF61, 'M', u'.'), - (0xFF62, 'M', u'「'), - (0xFF63, 'M', u'」'), - (0xFF64, 'M', u'、'), - (0xFF65, 'M', u'・'), - (0xFF66, 'M', u'ヲ'), - ] - -def _seg_50(): - return [ - (0xFF67, 'M', u'ァ'), - (0xFF68, 'M', u'ィ'), - (0xFF69, 'M', u'ゥ'), - (0xFF6A, 'M', u'ェ'), - (0xFF6B, 'M', u'ォ'), - (0xFF6C, 'M', u'ャ'), - (0xFF6D, 'M', u'ュ'), - (0xFF6E, 'M', u'ョ'), - (0xFF6F, 'M', u'ッ'), - (0xFF70, 'M', u'ー'), - (0xFF71, 'M', u'ア'), - (0xFF72, 'M', u'イ'), - (0xFF73, 'M', u'ウ'), - (0xFF74, 'M', u'エ'), - (0xFF75, 'M', u'オ'), - (0xFF76, 'M', u'カ'), - (0xFF77, 'M', u'キ'), - (0xFF78, 'M', u'ク'), - (0xFF79, 'M', u'ケ'), - (0xFF7A, 'M', u'コ'), - (0xFF7B, 'M', u'サ'), - (0xFF7C, 'M', u'シ'), - (0xFF7D, 'M', u'ス'), - (0xFF7E, 'M', u'セ'), - (0xFF7F, 'M', u'ソ'), - (0xFF80, 'M', u'タ'), - (0xFF81, 'M', u'チ'), - (0xFF82, 'M', u'ツ'), - (0xFF83, 'M', u'テ'), - (0xFF84, 'M', u'ト'), - (0xFF85, 'M', u'ナ'), - (0xFF86, 'M', u'ニ'), - (0xFF87, 'M', u'ヌ'), - (0xFF88, 'M', u'ネ'), - (0xFF89, 'M', u'ノ'), - (0xFF8A, 'M', u'ハ'), - (0xFF8B, 'M', u'ヒ'), - (0xFF8C, 'M', u'フ'), - (0xFF8D, 'M', u'ヘ'), - (0xFF8E, 'M', u'ホ'), - (0xFF8F, 'M', u'マ'), - (0xFF90, 'M', u'ミ'), - (0xFF91, 'M', u'ム'), - (0xFF92, 'M', u'メ'), - (0xFF93, 'M', u'モ'), - (0xFF94, 'M', u'ヤ'), - (0xFF95, 'M', u'ユ'), - (0xFF96, 'M', u'ヨ'), - (0xFF97, 'M', u'ラ'), - (0xFF98, 'M', u'リ'), - (0xFF99, 'M', u'ル'), - (0xFF9A, 'M', u'レ'), - (0xFF9B, 'M', u'ロ'), - (0xFF9C, 'M', u'ワ'), - (0xFF9D, 'M', u'ン'), - (0xFF9E, 'M', u'゙'), - (0xFF9F, 'M', u'゚'), - (0xFFA0, 'X'), - (0xFFA1, 'M', u'ᄀ'), - (0xFFA2, 'M', u'ᄁ'), - (0xFFA3, 'M', u'ᆪ'), - (0xFFA4, 'M', u'ᄂ'), - (0xFFA5, 'M', u'ᆬ'), - (0xFFA6, 'M', u'ᆭ'), - (0xFFA7, 'M', u'ᄃ'), - (0xFFA8, 'M', u'ᄄ'), - (0xFFA9, 'M', u'ᄅ'), - (0xFFAA, 'M', u'ᆰ'), - (0xFFAB, 'M', u'ᆱ'), - (0xFFAC, 'M', u'ᆲ'), - (0xFFAD, 'M', u'ᆳ'), - (0xFFAE, 'M', u'ᆴ'), - (0xFFAF, 'M', u'ᆵ'), - (0xFFB0, 'M', u'ᄚ'), - (0xFFB1, 'M', u'ᄆ'), - (0xFFB2, 'M', u'ᄇ'), - (0xFFB3, 'M', u'ᄈ'), - (0xFFB4, 'M', u'ᄡ'), - (0xFFB5, 'M', u'ᄉ'), - (0xFFB6, 'M', u'ᄊ'), - (0xFFB7, 'M', u'ᄋ'), - (0xFFB8, 'M', u'ᄌ'), - (0xFFB9, 'M', u'ᄍ'), - (0xFFBA, 'M', u'ᄎ'), - (0xFFBB, 'M', u'ᄏ'), - (0xFFBC, 'M', u'ᄐ'), - (0xFFBD, 'M', u'ᄑ'), - (0xFFBE, 'M', u'ᄒ'), - (0xFFBF, 'X'), - (0xFFC2, 'M', u'ᅡ'), - (0xFFC3, 'M', u'ᅢ'), - (0xFFC4, 'M', u'ᅣ'), - (0xFFC5, 'M', u'ᅤ'), - (0xFFC6, 'M', u'ᅥ'), - (0xFFC7, 'M', u'ᅦ'), - (0xFFC8, 'X'), - (0xFFCA, 'M', u'ᅧ'), - (0xFFCB, 'M', u'ᅨ'), - (0xFFCC, 'M', u'ᅩ'), - (0xFFCD, 'M', u'ᅪ'), - ] - -def _seg_51(): - return [ - (0xFFCE, 'M', u'ᅫ'), - (0xFFCF, 'M', u'ᅬ'), - (0xFFD0, 'X'), - (0xFFD2, 'M', u'ᅭ'), - (0xFFD3, 'M', u'ᅮ'), - (0xFFD4, 'M', u'ᅯ'), - (0xFFD5, 'M', u'ᅰ'), - (0xFFD6, 'M', u'ᅱ'), - (0xFFD7, 'M', u'ᅲ'), - (0xFFD8, 'X'), - (0xFFDA, 'M', u'ᅳ'), - (0xFFDB, 'M', u'ᅴ'), - (0xFFDC, 'M', u'ᅵ'), - (0xFFDD, 'X'), - (0xFFE0, 'M', u'¢'), - (0xFFE1, 'M', u'£'), - (0xFFE2, 'M', u'¬'), - (0xFFE3, '3', u' ̄'), - (0xFFE4, 'M', u'¦'), - (0xFFE5, 'M', u'¥'), - (0xFFE6, 'M', u'₩'), - (0xFFE7, 'X'), - (0xFFE8, 'M', u'│'), - (0xFFE9, 'M', u'←'), - (0xFFEA, 'M', u'↑'), - (0xFFEB, 'M', u'→'), - (0xFFEC, 'M', u'↓'), - (0xFFED, 'M', u'■'), - (0xFFEE, 'M', u'○'), - (0xFFEF, 'X'), - (0x10000, 'V'), - (0x1000C, 'X'), - (0x1000D, 'V'), - (0x10027, 'X'), - (0x10028, 'V'), - (0x1003B, 'X'), - (0x1003C, 'V'), - (0x1003E, 'X'), - (0x1003F, 'V'), - (0x1004E, 'X'), - (0x10050, 'V'), - (0x1005E, 'X'), - (0x10080, 'V'), - (0x100FB, 'X'), - (0x10100, 'V'), - (0x10103, 'X'), - (0x10107, 'V'), - (0x10134, 'X'), - (0x10137, 'V'), - (0x1018B, 'X'), - (0x10190, 'V'), - (0x1019C, 'X'), - (0x101D0, 'V'), - (0x101FE, 'X'), - (0x10280, 'V'), - (0x1029D, 'X'), - (0x102A0, 'V'), - (0x102D1, 'X'), - (0x10300, 'V'), - (0x1031F, 'X'), - (0x10320, 'V'), - (0x10324, 'X'), - (0x10330, 'V'), - (0x1034B, 'X'), - (0x10380, 'V'), - (0x1039E, 'X'), - (0x1039F, 'V'), - (0x103C4, 'X'), - (0x103C8, 'V'), - (0x103D6, 'X'), - (0x10400, 'M', u'𐐨'), - (0x10401, 'M', u'𐐩'), - (0x10402, 'M', u'𐐪'), - (0x10403, 'M', u'𐐫'), - (0x10404, 'M', u'𐐬'), - (0x10405, 'M', u'𐐭'), - (0x10406, 'M', u'𐐮'), - (0x10407, 'M', u'𐐯'), - (0x10408, 'M', u'𐐰'), - (0x10409, 'M', u'𐐱'), - (0x1040A, 'M', u'𐐲'), - (0x1040B, 'M', u'𐐳'), - (0x1040C, 'M', u'𐐴'), - (0x1040D, 'M', u'𐐵'), - (0x1040E, 'M', u'𐐶'), - (0x1040F, 'M', u'𐐷'), - (0x10410, 'M', u'𐐸'), - (0x10411, 'M', u'𐐹'), - (0x10412, 'M', u'𐐺'), - (0x10413, 'M', u'𐐻'), - (0x10414, 'M', u'𐐼'), - (0x10415, 'M', u'𐐽'), - (0x10416, 'M', u'𐐾'), - (0x10417, 'M', u'𐐿'), - (0x10418, 'M', u'𐑀'), - (0x10419, 'M', u'𐑁'), - (0x1041A, 'M', u'𐑂'), - (0x1041B, 'M', u'𐑃'), - (0x1041C, 'M', u'𐑄'), - (0x1041D, 'M', u'𐑅'), - ] - -def _seg_52(): - return [ - (0x1041E, 'M', u'𐑆'), - (0x1041F, 'M', u'𐑇'), - (0x10420, 'M', u'𐑈'), - (0x10421, 'M', u'𐑉'), - (0x10422, 'M', u'𐑊'), - (0x10423, 'M', u'𐑋'), - (0x10424, 'M', u'𐑌'), - (0x10425, 'M', u'𐑍'), - (0x10426, 'M', u'𐑎'), - (0x10427, 'M', u'𐑏'), - (0x10428, 'V'), - (0x1049E, 'X'), - (0x104A0, 'V'), - (0x104AA, 'X'), - (0x10800, 'V'), - (0x10806, 'X'), - (0x10808, 'V'), - (0x10809, 'X'), - (0x1080A, 'V'), - (0x10836, 'X'), - (0x10837, 'V'), - (0x10839, 'X'), - (0x1083C, 'V'), - (0x1083D, 'X'), - (0x1083F, 'V'), - (0x10856, 'X'), - (0x10857, 'V'), - (0x10860, 'X'), - (0x10900, 'V'), - (0x1091C, 'X'), - (0x1091F, 'V'), - (0x1093A, 'X'), - (0x1093F, 'V'), - (0x10940, 'X'), - (0x10980, 'V'), - (0x109B8, 'X'), - (0x109BE, 'V'), - (0x109C0, 'X'), - (0x10A00, 'V'), - (0x10A04, 'X'), - (0x10A05, 'V'), - (0x10A07, 'X'), - (0x10A0C, 'V'), - (0x10A14, 'X'), - (0x10A15, 'V'), - (0x10A18, 'X'), - (0x10A19, 'V'), - (0x10A34, 'X'), - (0x10A38, 'V'), - (0x10A3B, 'X'), - (0x10A3F, 'V'), - (0x10A48, 'X'), - (0x10A50, 'V'), - (0x10A59, 'X'), - (0x10A60, 'V'), - (0x10A80, 'X'), - (0x10B00, 'V'), - (0x10B36, 'X'), - (0x10B39, 'V'), - (0x10B56, 'X'), - (0x10B58, 'V'), - (0x10B73, 'X'), - (0x10B78, 'V'), - (0x10B80, 'X'), - (0x10C00, 'V'), - (0x10C49, 'X'), - (0x10E60, 'V'), - (0x10E7F, 'X'), - (0x11000, 'V'), - (0x1104E, 'X'), - (0x11052, 'V'), - (0x11070, 'X'), - (0x11080, 'V'), - (0x110BD, 'X'), - (0x110BE, 'V'), - (0x110C2, 'X'), - (0x110D0, 'V'), - (0x110E9, 'X'), - (0x110F0, 'V'), - (0x110FA, 'X'), - (0x11100, 'V'), - (0x11135, 'X'), - (0x11136, 'V'), - (0x11144, 'X'), - (0x11180, 'V'), - (0x111C9, 'X'), - (0x111D0, 'V'), - (0x111DA, 'X'), - (0x11680, 'V'), - (0x116B8, 'X'), - (0x116C0, 'V'), - (0x116CA, 'X'), - (0x12000, 'V'), - (0x1236F, 'X'), - (0x12400, 'V'), - (0x12463, 'X'), - (0x12470, 'V'), - (0x12474, 'X'), - (0x13000, 'V'), - (0x1342F, 'X'), - ] - -def _seg_53(): - return [ - (0x16800, 'V'), - (0x16A39, 'X'), - (0x16F00, 'V'), - (0x16F45, 'X'), - (0x16F50, 'V'), - (0x16F7F, 'X'), - (0x16F8F, 'V'), - (0x16FA0, 'X'), - (0x1B000, 'V'), - (0x1B002, 'X'), - (0x1D000, 'V'), - (0x1D0F6, 'X'), - (0x1D100, 'V'), - (0x1D127, 'X'), - (0x1D129, 'V'), - (0x1D15E, 'M', u'𝅗𝅥'), - (0x1D15F, 'M', u'𝅘𝅥'), - (0x1D160, 'M', u'𝅘𝅥𝅮'), - (0x1D161, 'M', u'𝅘𝅥𝅯'), - (0x1D162, 'M', u'𝅘𝅥𝅰'), - (0x1D163, 'M', u'𝅘𝅥𝅱'), - (0x1D164, 'M', u'𝅘𝅥𝅲'), - (0x1D165, 'V'), - (0x1D173, 'X'), - (0x1D17B, 'V'), - (0x1D1BB, 'M', u'𝆹𝅥'), - (0x1D1BC, 'M', u'𝆺𝅥'), - (0x1D1BD, 'M', u'𝆹𝅥𝅮'), - (0x1D1BE, 'M', u'𝆺𝅥𝅮'), - (0x1D1BF, 'M', u'𝆹𝅥𝅯'), - (0x1D1C0, 'M', u'𝆺𝅥𝅯'), - (0x1D1C1, 'V'), - (0x1D1DE, 'X'), - (0x1D200, 'V'), - (0x1D246, 'X'), - (0x1D300, 'V'), - (0x1D357, 'X'), - (0x1D360, 'V'), - (0x1D372, 'X'), - (0x1D400, 'M', u'a'), - (0x1D401, 'M', u'b'), - (0x1D402, 'M', u'c'), - (0x1D403, 'M', u'd'), - (0x1D404, 'M', u'e'), - (0x1D405, 'M', u'f'), - (0x1D406, 'M', u'g'), - (0x1D407, 'M', u'h'), - (0x1D408, 'M', u'i'), - (0x1D409, 'M', u'j'), - (0x1D40A, 'M', u'k'), - (0x1D40B, 'M', u'l'), - (0x1D40C, 'M', u'm'), - (0x1D40D, 'M', u'n'), - (0x1D40E, 'M', u'o'), - (0x1D40F, 'M', u'p'), - (0x1D410, 'M', u'q'), - (0x1D411, 'M', u'r'), - (0x1D412, 'M', u's'), - (0x1D413, 'M', u't'), - (0x1D414, 'M', u'u'), - (0x1D415, 'M', u'v'), - (0x1D416, 'M', u'w'), - (0x1D417, 'M', u'x'), - (0x1D418, 'M', u'y'), - (0x1D419, 'M', u'z'), - (0x1D41A, 'M', u'a'), - (0x1D41B, 'M', u'b'), - (0x1D41C, 'M', u'c'), - (0x1D41D, 'M', u'd'), - (0x1D41E, 'M', u'e'), - (0x1D41F, 'M', u'f'), - (0x1D420, 'M', u'g'), - (0x1D421, 'M', u'h'), - (0x1D422, 'M', u'i'), - (0x1D423, 'M', u'j'), - (0x1D424, 'M', u'k'), - (0x1D425, 'M', u'l'), - (0x1D426, 'M', u'm'), - (0x1D427, 'M', u'n'), - (0x1D428, 'M', u'o'), - (0x1D429, 'M', u'p'), - (0x1D42A, 'M', u'q'), - (0x1D42B, 'M', u'r'), - (0x1D42C, 'M', u's'), - (0x1D42D, 'M', u't'), - (0x1D42E, 'M', u'u'), - (0x1D42F, 'M', u'v'), - (0x1D430, 'M', u'w'), - (0x1D431, 'M', u'x'), - (0x1D432, 'M', u'y'), - (0x1D433, 'M', u'z'), - (0x1D434, 'M', u'a'), - (0x1D435, 'M', u'b'), - (0x1D436, 'M', u'c'), - (0x1D437, 'M', u'd'), - (0x1D438, 'M', u'e'), - (0x1D439, 'M', u'f'), - (0x1D43A, 'M', u'g'), - (0x1D43B, 'M', u'h'), - (0x1D43C, 'M', u'i'), - ] - -def _seg_54(): - return [ - (0x1D43D, 'M', u'j'), - (0x1D43E, 'M', u'k'), - (0x1D43F, 'M', u'l'), - (0x1D440, 'M', u'm'), - (0x1D441, 'M', u'n'), - (0x1D442, 'M', u'o'), - (0x1D443, 'M', u'p'), - (0x1D444, 'M', u'q'), - (0x1D445, 'M', u'r'), - (0x1D446, 'M', u's'), - (0x1D447, 'M', u't'), - (0x1D448, 'M', u'u'), - (0x1D449, 'M', u'v'), - (0x1D44A, 'M', u'w'), - (0x1D44B, 'M', u'x'), - (0x1D44C, 'M', u'y'), - (0x1D44D, 'M', u'z'), - (0x1D44E, 'M', u'a'), - (0x1D44F, 'M', u'b'), - (0x1D450, 'M', u'c'), - (0x1D451, 'M', u'd'), - (0x1D452, 'M', u'e'), - (0x1D453, 'M', u'f'), - (0x1D454, 'M', u'g'), - (0x1D455, 'X'), - (0x1D456, 'M', u'i'), - (0x1D457, 'M', u'j'), - (0x1D458, 'M', u'k'), - (0x1D459, 'M', u'l'), - (0x1D45A, 'M', u'm'), - (0x1D45B, 'M', u'n'), - (0x1D45C, 'M', u'o'), - (0x1D45D, 'M', u'p'), - (0x1D45E, 'M', u'q'), - (0x1D45F, 'M', u'r'), - (0x1D460, 'M', u's'), - (0x1D461, 'M', u't'), - (0x1D462, 'M', u'u'), - (0x1D463, 'M', u'v'), - (0x1D464, 'M', u'w'), - (0x1D465, 'M', u'x'), - (0x1D466, 'M', u'y'), - (0x1D467, 'M', u'z'), - (0x1D468, 'M', u'a'), - (0x1D469, 'M', u'b'), - (0x1D46A, 'M', u'c'), - (0x1D46B, 'M', u'd'), - (0x1D46C, 'M', u'e'), - (0x1D46D, 'M', u'f'), - (0x1D46E, 'M', u'g'), - (0x1D46F, 'M', u'h'), - (0x1D470, 'M', u'i'), - (0x1D471, 'M', u'j'), - (0x1D472, 'M', u'k'), - (0x1D473, 'M', u'l'), - (0x1D474, 'M', u'm'), - (0x1D475, 'M', u'n'), - (0x1D476, 'M', u'o'), - (0x1D477, 'M', u'p'), - (0x1D478, 'M', u'q'), - (0x1D479, 'M', u'r'), - (0x1D47A, 'M', u's'), - (0x1D47B, 'M', u't'), - (0x1D47C, 'M', u'u'), - (0x1D47D, 'M', u'v'), - (0x1D47E, 'M', u'w'), - (0x1D47F, 'M', u'x'), - (0x1D480, 'M', u'y'), - (0x1D481, 'M', u'z'), - (0x1D482, 'M', u'a'), - (0x1D483, 'M', u'b'), - (0x1D484, 'M', u'c'), - (0x1D485, 'M', u'd'), - (0x1D486, 'M', u'e'), - (0x1D487, 'M', u'f'), - (0x1D488, 'M', u'g'), - (0x1D489, 'M', u'h'), - (0x1D48A, 'M', u'i'), - (0x1D48B, 'M', u'j'), - (0x1D48C, 'M', u'k'), - (0x1D48D, 'M', u'l'), - (0x1D48E, 'M', u'm'), - (0x1D48F, 'M', u'n'), - (0x1D490, 'M', u'o'), - (0x1D491, 'M', u'p'), - (0x1D492, 'M', u'q'), - (0x1D493, 'M', u'r'), - (0x1D494, 'M', u's'), - (0x1D495, 'M', u't'), - (0x1D496, 'M', u'u'), - (0x1D497, 'M', u'v'), - (0x1D498, 'M', u'w'), - (0x1D499, 'M', u'x'), - (0x1D49A, 'M', u'y'), - (0x1D49B, 'M', u'z'), - (0x1D49C, 'M', u'a'), - (0x1D49D, 'X'), - (0x1D49E, 'M', u'c'), - (0x1D49F, 'M', u'd'), - (0x1D4A0, 'X'), - ] - -def _seg_55(): - return [ - (0x1D4A2, 'M', u'g'), - (0x1D4A3, 'X'), - (0x1D4A5, 'M', u'j'), - (0x1D4A6, 'M', u'k'), - (0x1D4A7, 'X'), - (0x1D4A9, 'M', u'n'), - (0x1D4AA, 'M', u'o'), - (0x1D4AB, 'M', u'p'), - (0x1D4AC, 'M', u'q'), - (0x1D4AD, 'X'), - (0x1D4AE, 'M', u's'), - (0x1D4AF, 'M', u't'), - (0x1D4B0, 'M', u'u'), - (0x1D4B1, 'M', u'v'), - (0x1D4B2, 'M', u'w'), - (0x1D4B3, 'M', u'x'), - (0x1D4B4, 'M', u'y'), - (0x1D4B5, 'M', u'z'), - (0x1D4B6, 'M', u'a'), - (0x1D4B7, 'M', u'b'), - (0x1D4B8, 'M', u'c'), - (0x1D4B9, 'M', u'd'), - (0x1D4BA, 'X'), - (0x1D4BB, 'M', u'f'), - (0x1D4BC, 'X'), - (0x1D4BD, 'M', u'h'), - (0x1D4BE, 'M', u'i'), - (0x1D4BF, 'M', u'j'), - (0x1D4C0, 'M', u'k'), - (0x1D4C1, 'M', u'l'), - (0x1D4C2, 'M', u'm'), - (0x1D4C3, 'M', u'n'), - (0x1D4C4, 'X'), - (0x1D4C5, 'M', u'p'), - (0x1D4C6, 'M', u'q'), - (0x1D4C7, 'M', u'r'), - (0x1D4C8, 'M', u's'), - (0x1D4C9, 'M', u't'), - (0x1D4CA, 'M', u'u'), - (0x1D4CB, 'M', u'v'), - (0x1D4CC, 'M', u'w'), - (0x1D4CD, 'M', u'x'), - (0x1D4CE, 'M', u'y'), - (0x1D4CF, 'M', u'z'), - (0x1D4D0, 'M', u'a'), - (0x1D4D1, 'M', u'b'), - (0x1D4D2, 'M', u'c'), - (0x1D4D3, 'M', u'd'), - (0x1D4D4, 'M', u'e'), - (0x1D4D5, 'M', u'f'), - (0x1D4D6, 'M', u'g'), - (0x1D4D7, 'M', u'h'), - (0x1D4D8, 'M', u'i'), - (0x1D4D9, 'M', u'j'), - (0x1D4DA, 'M', u'k'), - (0x1D4DB, 'M', u'l'), - (0x1D4DC, 'M', u'm'), - (0x1D4DD, 'M', u'n'), - (0x1D4DE, 'M', u'o'), - (0x1D4DF, 'M', u'p'), - (0x1D4E0, 'M', u'q'), - (0x1D4E1, 'M', u'r'), - (0x1D4E2, 'M', u's'), - (0x1D4E3, 'M', u't'), - (0x1D4E4, 'M', u'u'), - (0x1D4E5, 'M', u'v'), - (0x1D4E6, 'M', u'w'), - (0x1D4E7, 'M', u'x'), - (0x1D4E8, 'M', u'y'), - (0x1D4E9, 'M', u'z'), - (0x1D4EA, 'M', u'a'), - (0x1D4EB, 'M', u'b'), - (0x1D4EC, 'M', u'c'), - (0x1D4ED, 'M', u'd'), - (0x1D4EE, 'M', u'e'), - (0x1D4EF, 'M', u'f'), - (0x1D4F0, 'M', u'g'), - (0x1D4F1, 'M', u'h'), - (0x1D4F2, 'M', u'i'), - (0x1D4F3, 'M', u'j'), - (0x1D4F4, 'M', u'k'), - (0x1D4F5, 'M', u'l'), - (0x1D4F6, 'M', u'm'), - (0x1D4F7, 'M', u'n'), - (0x1D4F8, 'M', u'o'), - (0x1D4F9, 'M', u'p'), - (0x1D4FA, 'M', u'q'), - (0x1D4FB, 'M', u'r'), - (0x1D4FC, 'M', u's'), - (0x1D4FD, 'M', u't'), - (0x1D4FE, 'M', u'u'), - (0x1D4FF, 'M', u'v'), - (0x1D500, 'M', u'w'), - (0x1D501, 'M', u'x'), - (0x1D502, 'M', u'y'), - (0x1D503, 'M', u'z'), - (0x1D504, 'M', u'a'), - (0x1D505, 'M', u'b'), - (0x1D506, 'X'), - (0x1D507, 'M', u'd'), - ] - -def _seg_56(): - return [ - (0x1D508, 'M', u'e'), - (0x1D509, 'M', u'f'), - (0x1D50A, 'M', u'g'), - (0x1D50B, 'X'), - (0x1D50D, 'M', u'j'), - (0x1D50E, 'M', u'k'), - (0x1D50F, 'M', u'l'), - (0x1D510, 'M', u'm'), - (0x1D511, 'M', u'n'), - (0x1D512, 'M', u'o'), - (0x1D513, 'M', u'p'), - (0x1D514, 'M', u'q'), - (0x1D515, 'X'), - (0x1D516, 'M', u's'), - (0x1D517, 'M', u't'), - (0x1D518, 'M', u'u'), - (0x1D519, 'M', u'v'), - (0x1D51A, 'M', u'w'), - (0x1D51B, 'M', u'x'), - (0x1D51C, 'M', u'y'), - (0x1D51D, 'X'), - (0x1D51E, 'M', u'a'), - (0x1D51F, 'M', u'b'), - (0x1D520, 'M', u'c'), - (0x1D521, 'M', u'd'), - (0x1D522, 'M', u'e'), - (0x1D523, 'M', u'f'), - (0x1D524, 'M', u'g'), - (0x1D525, 'M', u'h'), - (0x1D526, 'M', u'i'), - (0x1D527, 'M', u'j'), - (0x1D528, 'M', u'k'), - (0x1D529, 'M', u'l'), - (0x1D52A, 'M', u'm'), - (0x1D52B, 'M', u'n'), - (0x1D52C, 'M', u'o'), - (0x1D52D, 'M', u'p'), - (0x1D52E, 'M', u'q'), - (0x1D52F, 'M', u'r'), - (0x1D530, 'M', u's'), - (0x1D531, 'M', u't'), - (0x1D532, 'M', u'u'), - (0x1D533, 'M', u'v'), - (0x1D534, 'M', u'w'), - (0x1D535, 'M', u'x'), - (0x1D536, 'M', u'y'), - (0x1D537, 'M', u'z'), - (0x1D538, 'M', u'a'), - (0x1D539, 'M', u'b'), - (0x1D53A, 'X'), - (0x1D53B, 'M', u'd'), - (0x1D53C, 'M', u'e'), - (0x1D53D, 'M', u'f'), - (0x1D53E, 'M', u'g'), - (0x1D53F, 'X'), - (0x1D540, 'M', u'i'), - (0x1D541, 'M', u'j'), - (0x1D542, 'M', u'k'), - (0x1D543, 'M', u'l'), - (0x1D544, 'M', u'm'), - (0x1D545, 'X'), - (0x1D546, 'M', u'o'), - (0x1D547, 'X'), - (0x1D54A, 'M', u's'), - (0x1D54B, 'M', u't'), - (0x1D54C, 'M', u'u'), - (0x1D54D, 'M', u'v'), - (0x1D54E, 'M', u'w'), - (0x1D54F, 'M', u'x'), - (0x1D550, 'M', u'y'), - (0x1D551, 'X'), - (0x1D552, 'M', u'a'), - (0x1D553, 'M', u'b'), - (0x1D554, 'M', u'c'), - (0x1D555, 'M', u'd'), - (0x1D556, 'M', u'e'), - (0x1D557, 'M', u'f'), - (0x1D558, 'M', u'g'), - (0x1D559, 'M', u'h'), - (0x1D55A, 'M', u'i'), - (0x1D55B, 'M', u'j'), - (0x1D55C, 'M', u'k'), - (0x1D55D, 'M', u'l'), - (0x1D55E, 'M', u'm'), - (0x1D55F, 'M', u'n'), - (0x1D560, 'M', u'o'), - (0x1D561, 'M', u'p'), - (0x1D562, 'M', u'q'), - (0x1D563, 'M', u'r'), - (0x1D564, 'M', u's'), - (0x1D565, 'M', u't'), - (0x1D566, 'M', u'u'), - (0x1D567, 'M', u'v'), - (0x1D568, 'M', u'w'), - (0x1D569, 'M', u'x'), - (0x1D56A, 'M', u'y'), - (0x1D56B, 'M', u'z'), - (0x1D56C, 'M', u'a'), - (0x1D56D, 'M', u'b'), - (0x1D56E, 'M', u'c'), - ] - -def _seg_57(): - return [ - (0x1D56F, 'M', u'd'), - (0x1D570, 'M', u'e'), - (0x1D571, 'M', u'f'), - (0x1D572, 'M', u'g'), - (0x1D573, 'M', u'h'), - (0x1D574, 'M', u'i'), - (0x1D575, 'M', u'j'), - (0x1D576, 'M', u'k'), - (0x1D577, 'M', u'l'), - (0x1D578, 'M', u'm'), - (0x1D579, 'M', u'n'), - (0x1D57A, 'M', u'o'), - (0x1D57B, 'M', u'p'), - (0x1D57C, 'M', u'q'), - (0x1D57D, 'M', u'r'), - (0x1D57E, 'M', u's'), - (0x1D57F, 'M', u't'), - (0x1D580, 'M', u'u'), - (0x1D581, 'M', u'v'), - (0x1D582, 'M', u'w'), - (0x1D583, 'M', u'x'), - (0x1D584, 'M', u'y'), - (0x1D585, 'M', u'z'), - (0x1D586, 'M', u'a'), - (0x1D587, 'M', u'b'), - (0x1D588, 'M', u'c'), - (0x1D589, 'M', u'd'), - (0x1D58A, 'M', u'e'), - (0x1D58B, 'M', u'f'), - (0x1D58C, 'M', u'g'), - (0x1D58D, 'M', u'h'), - (0x1D58E, 'M', u'i'), - (0x1D58F, 'M', u'j'), - (0x1D590, 'M', u'k'), - (0x1D591, 'M', u'l'), - (0x1D592, 'M', u'm'), - (0x1D593, 'M', u'n'), - (0x1D594, 'M', u'o'), - (0x1D595, 'M', u'p'), - (0x1D596, 'M', u'q'), - (0x1D597, 'M', u'r'), - (0x1D598, 'M', u's'), - (0x1D599, 'M', u't'), - (0x1D59A, 'M', u'u'), - (0x1D59B, 'M', u'v'), - (0x1D59C, 'M', u'w'), - (0x1D59D, 'M', u'x'), - (0x1D59E, 'M', u'y'), - (0x1D59F, 'M', u'z'), - (0x1D5A0, 'M', u'a'), - (0x1D5A1, 'M', u'b'), - (0x1D5A2, 'M', u'c'), - (0x1D5A3, 'M', u'd'), - (0x1D5A4, 'M', u'e'), - (0x1D5A5, 'M', u'f'), - (0x1D5A6, 'M', u'g'), - (0x1D5A7, 'M', u'h'), - (0x1D5A8, 'M', u'i'), - (0x1D5A9, 'M', u'j'), - (0x1D5AA, 'M', u'k'), - (0x1D5AB, 'M', u'l'), - (0x1D5AC, 'M', u'm'), - (0x1D5AD, 'M', u'n'), - (0x1D5AE, 'M', u'o'), - (0x1D5AF, 'M', u'p'), - (0x1D5B0, 'M', u'q'), - (0x1D5B1, 'M', u'r'), - (0x1D5B2, 'M', u's'), - (0x1D5B3, 'M', u't'), - (0x1D5B4, 'M', u'u'), - (0x1D5B5, 'M', u'v'), - (0x1D5B6, 'M', u'w'), - (0x1D5B7, 'M', u'x'), - (0x1D5B8, 'M', u'y'), - (0x1D5B9, 'M', u'z'), - (0x1D5BA, 'M', u'a'), - (0x1D5BB, 'M', u'b'), - (0x1D5BC, 'M', u'c'), - (0x1D5BD, 'M', u'd'), - (0x1D5BE, 'M', u'e'), - (0x1D5BF, 'M', u'f'), - (0x1D5C0, 'M', u'g'), - (0x1D5C1, 'M', u'h'), - (0x1D5C2, 'M', u'i'), - (0x1D5C3, 'M', u'j'), - (0x1D5C4, 'M', u'k'), - (0x1D5C5, 'M', u'l'), - (0x1D5C6, 'M', u'm'), - (0x1D5C7, 'M', u'n'), - (0x1D5C8, 'M', u'o'), - (0x1D5C9, 'M', u'p'), - (0x1D5CA, 'M', u'q'), - (0x1D5CB, 'M', u'r'), - (0x1D5CC, 'M', u's'), - (0x1D5CD, 'M', u't'), - (0x1D5CE, 'M', u'u'), - (0x1D5CF, 'M', u'v'), - (0x1D5D0, 'M', u'w'), - (0x1D5D1, 'M', u'x'), - (0x1D5D2, 'M', u'y'), - ] - -def _seg_58(): - return [ - (0x1D5D3, 'M', u'z'), - (0x1D5D4, 'M', u'a'), - (0x1D5D5, 'M', u'b'), - (0x1D5D6, 'M', u'c'), - (0x1D5D7, 'M', u'd'), - (0x1D5D8, 'M', u'e'), - (0x1D5D9, 'M', u'f'), - (0x1D5DA, 'M', u'g'), - (0x1D5DB, 'M', u'h'), - (0x1D5DC, 'M', u'i'), - (0x1D5DD, 'M', u'j'), - (0x1D5DE, 'M', u'k'), - (0x1D5DF, 'M', u'l'), - (0x1D5E0, 'M', u'm'), - (0x1D5E1, 'M', u'n'), - (0x1D5E2, 'M', u'o'), - (0x1D5E3, 'M', u'p'), - (0x1D5E4, 'M', u'q'), - (0x1D5E5, 'M', u'r'), - (0x1D5E6, 'M', u's'), - (0x1D5E7, 'M', u't'), - (0x1D5E8, 'M', u'u'), - (0x1D5E9, 'M', u'v'), - (0x1D5EA, 'M', u'w'), - (0x1D5EB, 'M', u'x'), - (0x1D5EC, 'M', u'y'), - (0x1D5ED, 'M', u'z'), - (0x1D5EE, 'M', u'a'), - (0x1D5EF, 'M', u'b'), - (0x1D5F0, 'M', u'c'), - (0x1D5F1, 'M', u'd'), - (0x1D5F2, 'M', u'e'), - (0x1D5F3, 'M', u'f'), - (0x1D5F4, 'M', u'g'), - (0x1D5F5, 'M', u'h'), - (0x1D5F6, 'M', u'i'), - (0x1D5F7, 'M', u'j'), - (0x1D5F8, 'M', u'k'), - (0x1D5F9, 'M', u'l'), - (0x1D5FA, 'M', u'm'), - (0x1D5FB, 'M', u'n'), - (0x1D5FC, 'M', u'o'), - (0x1D5FD, 'M', u'p'), - (0x1D5FE, 'M', u'q'), - (0x1D5FF, 'M', u'r'), - (0x1D600, 'M', u's'), - (0x1D601, 'M', u't'), - (0x1D602, 'M', u'u'), - (0x1D603, 'M', u'v'), - (0x1D604, 'M', u'w'), - (0x1D605, 'M', u'x'), - (0x1D606, 'M', u'y'), - (0x1D607, 'M', u'z'), - (0x1D608, 'M', u'a'), - (0x1D609, 'M', u'b'), - (0x1D60A, 'M', u'c'), - (0x1D60B, 'M', u'd'), - (0x1D60C, 'M', u'e'), - (0x1D60D, 'M', u'f'), - (0x1D60E, 'M', u'g'), - (0x1D60F, 'M', u'h'), - (0x1D610, 'M', u'i'), - (0x1D611, 'M', u'j'), - (0x1D612, 'M', u'k'), - (0x1D613, 'M', u'l'), - (0x1D614, 'M', u'm'), - (0x1D615, 'M', u'n'), - (0x1D616, 'M', u'o'), - (0x1D617, 'M', u'p'), - (0x1D618, 'M', u'q'), - (0x1D619, 'M', u'r'), - (0x1D61A, 'M', u's'), - (0x1D61B, 'M', u't'), - (0x1D61C, 'M', u'u'), - (0x1D61D, 'M', u'v'), - (0x1D61E, 'M', u'w'), - (0x1D61F, 'M', u'x'), - (0x1D620, 'M', u'y'), - (0x1D621, 'M', u'z'), - (0x1D622, 'M', u'a'), - (0x1D623, 'M', u'b'), - (0x1D624, 'M', u'c'), - (0x1D625, 'M', u'd'), - (0x1D626, 'M', u'e'), - (0x1D627, 'M', u'f'), - (0x1D628, 'M', u'g'), - (0x1D629, 'M', u'h'), - (0x1D62A, 'M', u'i'), - (0x1D62B, 'M', u'j'), - (0x1D62C, 'M', u'k'), - (0x1D62D, 'M', u'l'), - (0x1D62E, 'M', u'm'), - (0x1D62F, 'M', u'n'), - (0x1D630, 'M', u'o'), - (0x1D631, 'M', u'p'), - (0x1D632, 'M', u'q'), - (0x1D633, 'M', u'r'), - (0x1D634, 'M', u's'), - (0x1D635, 'M', u't'), - (0x1D636, 'M', u'u'), - ] - -def _seg_59(): - return [ - (0x1D637, 'M', u'v'), - (0x1D638, 'M', u'w'), - (0x1D639, 'M', u'x'), - (0x1D63A, 'M', u'y'), - (0x1D63B, 'M', u'z'), - (0x1D63C, 'M', u'a'), - (0x1D63D, 'M', u'b'), - (0x1D63E, 'M', u'c'), - (0x1D63F, 'M', u'd'), - (0x1D640, 'M', u'e'), - (0x1D641, 'M', u'f'), - (0x1D642, 'M', u'g'), - (0x1D643, 'M', u'h'), - (0x1D644, 'M', u'i'), - (0x1D645, 'M', u'j'), - (0x1D646, 'M', u'k'), - (0x1D647, 'M', u'l'), - (0x1D648, 'M', u'm'), - (0x1D649, 'M', u'n'), - (0x1D64A, 'M', u'o'), - (0x1D64B, 'M', u'p'), - (0x1D64C, 'M', u'q'), - (0x1D64D, 'M', u'r'), - (0x1D64E, 'M', u's'), - (0x1D64F, 'M', u't'), - (0x1D650, 'M', u'u'), - (0x1D651, 'M', u'v'), - (0x1D652, 'M', u'w'), - (0x1D653, 'M', u'x'), - (0x1D654, 'M', u'y'), - (0x1D655, 'M', u'z'), - (0x1D656, 'M', u'a'), - (0x1D657, 'M', u'b'), - (0x1D658, 'M', u'c'), - (0x1D659, 'M', u'd'), - (0x1D65A, 'M', u'e'), - (0x1D65B, 'M', u'f'), - (0x1D65C, 'M', u'g'), - (0x1D65D, 'M', u'h'), - (0x1D65E, 'M', u'i'), - (0x1D65F, 'M', u'j'), - (0x1D660, 'M', u'k'), - (0x1D661, 'M', u'l'), - (0x1D662, 'M', u'm'), - (0x1D663, 'M', u'n'), - (0x1D664, 'M', u'o'), - (0x1D665, 'M', u'p'), - (0x1D666, 'M', u'q'), - (0x1D667, 'M', u'r'), - (0x1D668, 'M', u's'), - (0x1D669, 'M', u't'), - (0x1D66A, 'M', u'u'), - (0x1D66B, 'M', u'v'), - (0x1D66C, 'M', u'w'), - (0x1D66D, 'M', u'x'), - (0x1D66E, 'M', u'y'), - (0x1D66F, 'M', u'z'), - (0x1D670, 'M', u'a'), - (0x1D671, 'M', u'b'), - (0x1D672, 'M', u'c'), - (0x1D673, 'M', u'd'), - (0x1D674, 'M', u'e'), - (0x1D675, 'M', u'f'), - (0x1D676, 'M', u'g'), - (0x1D677, 'M', u'h'), - (0x1D678, 'M', u'i'), - (0x1D679, 'M', u'j'), - (0x1D67A, 'M', u'k'), - (0x1D67B, 'M', u'l'), - (0x1D67C, 'M', u'm'), - (0x1D67D, 'M', u'n'), - (0x1D67E, 'M', u'o'), - (0x1D67F, 'M', u'p'), - (0x1D680, 'M', u'q'), - (0x1D681, 'M', u'r'), - (0x1D682, 'M', u's'), - (0x1D683, 'M', u't'), - (0x1D684, 'M', u'u'), - (0x1D685, 'M', u'v'), - (0x1D686, 'M', u'w'), - (0x1D687, 'M', u'x'), - (0x1D688, 'M', u'y'), - (0x1D689, 'M', u'z'), - (0x1D68A, 'M', u'a'), - (0x1D68B, 'M', u'b'), - (0x1D68C, 'M', u'c'), - (0x1D68D, 'M', u'd'), - (0x1D68E, 'M', u'e'), - (0x1D68F, 'M', u'f'), - (0x1D690, 'M', u'g'), - (0x1D691, 'M', u'h'), - (0x1D692, 'M', u'i'), - (0x1D693, 'M', u'j'), - (0x1D694, 'M', u'k'), - (0x1D695, 'M', u'l'), - (0x1D696, 'M', u'm'), - (0x1D697, 'M', u'n'), - (0x1D698, 'M', u'o'), - (0x1D699, 'M', u'p'), - (0x1D69A, 'M', u'q'), - ] - -def _seg_60(): - return [ - (0x1D69B, 'M', u'r'), - (0x1D69C, 'M', u's'), - (0x1D69D, 'M', u't'), - (0x1D69E, 'M', u'u'), - (0x1D69F, 'M', u'v'), - (0x1D6A0, 'M', u'w'), - (0x1D6A1, 'M', u'x'), - (0x1D6A2, 'M', u'y'), - (0x1D6A3, 'M', u'z'), - (0x1D6A4, 'M', u'ı'), - (0x1D6A5, 'M', u'ȷ'), - (0x1D6A6, 'X'), - (0x1D6A8, 'M', u'α'), - (0x1D6A9, 'M', u'β'), - (0x1D6AA, 'M', u'γ'), - (0x1D6AB, 'M', u'δ'), - (0x1D6AC, 'M', u'ε'), - (0x1D6AD, 'M', u'ζ'), - (0x1D6AE, 'M', u'η'), - (0x1D6AF, 'M', u'θ'), - (0x1D6B0, 'M', u'ι'), - (0x1D6B1, 'M', u'κ'), - (0x1D6B2, 'M', u'λ'), - (0x1D6B3, 'M', u'μ'), - (0x1D6B4, 'M', u'ν'), - (0x1D6B5, 'M', u'ξ'), - (0x1D6B6, 'M', u'ο'), - (0x1D6B7, 'M', u'π'), - (0x1D6B8, 'M', u'ρ'), - (0x1D6B9, 'M', u'θ'), - (0x1D6BA, 'M', u'σ'), - (0x1D6BB, 'M', u'τ'), - (0x1D6BC, 'M', u'υ'), - (0x1D6BD, 'M', u'φ'), - (0x1D6BE, 'M', u'χ'), - (0x1D6BF, 'M', u'ψ'), - (0x1D6C0, 'M', u'ω'), - (0x1D6C1, 'M', u'∇'), - (0x1D6C2, 'M', u'α'), - (0x1D6C3, 'M', u'β'), - (0x1D6C4, 'M', u'γ'), - (0x1D6C5, 'M', u'δ'), - (0x1D6C6, 'M', u'ε'), - (0x1D6C7, 'M', u'ζ'), - (0x1D6C8, 'M', u'η'), - (0x1D6C9, 'M', u'θ'), - (0x1D6CA, 'M', u'ι'), - (0x1D6CB, 'M', u'κ'), - (0x1D6CC, 'M', u'λ'), - (0x1D6CD, 'M', u'μ'), - (0x1D6CE, 'M', u'ν'), - (0x1D6CF, 'M', u'ξ'), - (0x1D6D0, 'M', u'ο'), - (0x1D6D1, 'M', u'π'), - (0x1D6D2, 'M', u'ρ'), - (0x1D6D3, 'M', u'σ'), - (0x1D6D5, 'M', u'τ'), - (0x1D6D6, 'M', u'υ'), - (0x1D6D7, 'M', u'φ'), - (0x1D6D8, 'M', u'χ'), - (0x1D6D9, 'M', u'ψ'), - (0x1D6DA, 'M', u'ω'), - (0x1D6DB, 'M', u'∂'), - (0x1D6DC, 'M', u'ε'), - (0x1D6DD, 'M', u'θ'), - (0x1D6DE, 'M', u'κ'), - (0x1D6DF, 'M', u'φ'), - (0x1D6E0, 'M', u'ρ'), - (0x1D6E1, 'M', u'π'), - (0x1D6E2, 'M', u'α'), - (0x1D6E3, 'M', u'β'), - (0x1D6E4, 'M', u'γ'), - (0x1D6E5, 'M', u'δ'), - (0x1D6E6, 'M', u'ε'), - (0x1D6E7, 'M', u'ζ'), - (0x1D6E8, 'M', u'η'), - (0x1D6E9, 'M', u'θ'), - (0x1D6EA, 'M', u'ι'), - (0x1D6EB, 'M', u'κ'), - (0x1D6EC, 'M', u'λ'), - (0x1D6ED, 'M', u'μ'), - (0x1D6EE, 'M', u'ν'), - (0x1D6EF, 'M', u'ξ'), - (0x1D6F0, 'M', u'ο'), - (0x1D6F1, 'M', u'π'), - (0x1D6F2, 'M', u'ρ'), - (0x1D6F3, 'M', u'θ'), - (0x1D6F4, 'M', u'σ'), - (0x1D6F5, 'M', u'τ'), - (0x1D6F6, 'M', u'υ'), - (0x1D6F7, 'M', u'φ'), - (0x1D6F8, 'M', u'χ'), - (0x1D6F9, 'M', u'ψ'), - (0x1D6FA, 'M', u'ω'), - (0x1D6FB, 'M', u'∇'), - (0x1D6FC, 'M', u'α'), - (0x1D6FD, 'M', u'β'), - (0x1D6FE, 'M', u'γ'), - (0x1D6FF, 'M', u'δ'), - (0x1D700, 'M', u'ε'), - ] - -def _seg_61(): - return [ - (0x1D701, 'M', u'ζ'), - (0x1D702, 'M', u'η'), - (0x1D703, 'M', u'θ'), - (0x1D704, 'M', u'ι'), - (0x1D705, 'M', u'κ'), - (0x1D706, 'M', u'λ'), - (0x1D707, 'M', u'μ'), - (0x1D708, 'M', u'ν'), - (0x1D709, 'M', u'ξ'), - (0x1D70A, 'M', u'ο'), - (0x1D70B, 'M', u'π'), - (0x1D70C, 'M', u'ρ'), - (0x1D70D, 'M', u'σ'), - (0x1D70F, 'M', u'τ'), - (0x1D710, 'M', u'υ'), - (0x1D711, 'M', u'φ'), - (0x1D712, 'M', u'χ'), - (0x1D713, 'M', u'ψ'), - (0x1D714, 'M', u'ω'), - (0x1D715, 'M', u'∂'), - (0x1D716, 'M', u'ε'), - (0x1D717, 'M', u'θ'), - (0x1D718, 'M', u'κ'), - (0x1D719, 'M', u'φ'), - (0x1D71A, 'M', u'ρ'), - (0x1D71B, 'M', u'π'), - (0x1D71C, 'M', u'α'), - (0x1D71D, 'M', u'β'), - (0x1D71E, 'M', u'γ'), - (0x1D71F, 'M', u'δ'), - (0x1D720, 'M', u'ε'), - (0x1D721, 'M', u'ζ'), - (0x1D722, 'M', u'η'), - (0x1D723, 'M', u'θ'), - (0x1D724, 'M', u'ι'), - (0x1D725, 'M', u'κ'), - (0x1D726, 'M', u'λ'), - (0x1D727, 'M', u'μ'), - (0x1D728, 'M', u'ν'), - (0x1D729, 'M', u'ξ'), - (0x1D72A, 'M', u'ο'), - (0x1D72B, 'M', u'π'), - (0x1D72C, 'M', u'ρ'), - (0x1D72D, 'M', u'θ'), - (0x1D72E, 'M', u'σ'), - (0x1D72F, 'M', u'τ'), - (0x1D730, 'M', u'υ'), - (0x1D731, 'M', u'φ'), - (0x1D732, 'M', u'χ'), - (0x1D733, 'M', u'ψ'), - (0x1D734, 'M', u'ω'), - (0x1D735, 'M', u'∇'), - (0x1D736, 'M', u'α'), - (0x1D737, 'M', u'β'), - (0x1D738, 'M', u'γ'), - (0x1D739, 'M', u'δ'), - (0x1D73A, 'M', u'ε'), - (0x1D73B, 'M', u'ζ'), - (0x1D73C, 'M', u'η'), - (0x1D73D, 'M', u'θ'), - (0x1D73E, 'M', u'ι'), - (0x1D73F, 'M', u'κ'), - (0x1D740, 'M', u'λ'), - (0x1D741, 'M', u'μ'), - (0x1D742, 'M', u'ν'), - (0x1D743, 'M', u'ξ'), - (0x1D744, 'M', u'ο'), - (0x1D745, 'M', u'π'), - (0x1D746, 'M', u'ρ'), - (0x1D747, 'M', u'σ'), - (0x1D749, 'M', u'τ'), - (0x1D74A, 'M', u'υ'), - (0x1D74B, 'M', u'φ'), - (0x1D74C, 'M', u'χ'), - (0x1D74D, 'M', u'ψ'), - (0x1D74E, 'M', u'ω'), - (0x1D74F, 'M', u'∂'), - (0x1D750, 'M', u'ε'), - (0x1D751, 'M', u'θ'), - (0x1D752, 'M', u'κ'), - (0x1D753, 'M', u'φ'), - (0x1D754, 'M', u'ρ'), - (0x1D755, 'M', u'π'), - (0x1D756, 'M', u'α'), - (0x1D757, 'M', u'β'), - (0x1D758, 'M', u'γ'), - (0x1D759, 'M', u'δ'), - (0x1D75A, 'M', u'ε'), - (0x1D75B, 'M', u'ζ'), - (0x1D75C, 'M', u'η'), - (0x1D75D, 'M', u'θ'), - (0x1D75E, 'M', u'ι'), - (0x1D75F, 'M', u'κ'), - (0x1D760, 'M', u'λ'), - (0x1D761, 'M', u'μ'), - (0x1D762, 'M', u'ν'), - (0x1D763, 'M', u'ξ'), - (0x1D764, 'M', u'ο'), - (0x1D765, 'M', u'π'), - (0x1D766, 'M', u'ρ'), - ] - -def _seg_62(): - return [ - (0x1D767, 'M', u'θ'), - (0x1D768, 'M', u'σ'), - (0x1D769, 'M', u'τ'), - (0x1D76A, 'M', u'υ'), - (0x1D76B, 'M', u'φ'), - (0x1D76C, 'M', u'χ'), - (0x1D76D, 'M', u'ψ'), - (0x1D76E, 'M', u'ω'), - (0x1D76F, 'M', u'∇'), - (0x1D770, 'M', u'α'), - (0x1D771, 'M', u'β'), - (0x1D772, 'M', u'γ'), - (0x1D773, 'M', u'δ'), - (0x1D774, 'M', u'ε'), - (0x1D775, 'M', u'ζ'), - (0x1D776, 'M', u'η'), - (0x1D777, 'M', u'θ'), - (0x1D778, 'M', u'ι'), - (0x1D779, 'M', u'κ'), - (0x1D77A, 'M', u'λ'), - (0x1D77B, 'M', u'μ'), - (0x1D77C, 'M', u'ν'), - (0x1D77D, 'M', u'ξ'), - (0x1D77E, 'M', u'ο'), - (0x1D77F, 'M', u'π'), - (0x1D780, 'M', u'ρ'), - (0x1D781, 'M', u'σ'), - (0x1D783, 'M', u'τ'), - (0x1D784, 'M', u'υ'), - (0x1D785, 'M', u'φ'), - (0x1D786, 'M', u'χ'), - (0x1D787, 'M', u'ψ'), - (0x1D788, 'M', u'ω'), - (0x1D789, 'M', u'∂'), - (0x1D78A, 'M', u'ε'), - (0x1D78B, 'M', u'θ'), - (0x1D78C, 'M', u'κ'), - (0x1D78D, 'M', u'φ'), - (0x1D78E, 'M', u'ρ'), - (0x1D78F, 'M', u'π'), - (0x1D790, 'M', u'α'), - (0x1D791, 'M', u'β'), - (0x1D792, 'M', u'γ'), - (0x1D793, 'M', u'δ'), - (0x1D794, 'M', u'ε'), - (0x1D795, 'M', u'ζ'), - (0x1D796, 'M', u'η'), - (0x1D797, 'M', u'θ'), - (0x1D798, 'M', u'ι'), - (0x1D799, 'M', u'κ'), - (0x1D79A, 'M', u'λ'), - (0x1D79B, 'M', u'μ'), - (0x1D79C, 'M', u'ν'), - (0x1D79D, 'M', u'ξ'), - (0x1D79E, 'M', u'ο'), - (0x1D79F, 'M', u'π'), - (0x1D7A0, 'M', u'ρ'), - (0x1D7A1, 'M', u'θ'), - (0x1D7A2, 'M', u'σ'), - (0x1D7A3, 'M', u'τ'), - (0x1D7A4, 'M', u'υ'), - (0x1D7A5, 'M', u'φ'), - (0x1D7A6, 'M', u'χ'), - (0x1D7A7, 'M', u'ψ'), - (0x1D7A8, 'M', u'ω'), - (0x1D7A9, 'M', u'∇'), - (0x1D7AA, 'M', u'α'), - (0x1D7AB, 'M', u'β'), - (0x1D7AC, 'M', u'γ'), - (0x1D7AD, 'M', u'δ'), - (0x1D7AE, 'M', u'ε'), - (0x1D7AF, 'M', u'ζ'), - (0x1D7B0, 'M', u'η'), - (0x1D7B1, 'M', u'θ'), - (0x1D7B2, 'M', u'ι'), - (0x1D7B3, 'M', u'κ'), - (0x1D7B4, 'M', u'λ'), - (0x1D7B5, 'M', u'μ'), - (0x1D7B6, 'M', u'ν'), - (0x1D7B7, 'M', u'ξ'), - (0x1D7B8, 'M', u'ο'), - (0x1D7B9, 'M', u'π'), - (0x1D7BA, 'M', u'ρ'), - (0x1D7BB, 'M', u'σ'), - (0x1D7BD, 'M', u'τ'), - (0x1D7BE, 'M', u'υ'), - (0x1D7BF, 'M', u'φ'), - (0x1D7C0, 'M', u'χ'), - (0x1D7C1, 'M', u'ψ'), - (0x1D7C2, 'M', u'ω'), - (0x1D7C3, 'M', u'∂'), - (0x1D7C4, 'M', u'ε'), - (0x1D7C5, 'M', u'θ'), - (0x1D7C6, 'M', u'κ'), - (0x1D7C7, 'M', u'φ'), - (0x1D7C8, 'M', u'ρ'), - (0x1D7C9, 'M', u'π'), - (0x1D7CA, 'M', u'ϝ'), - (0x1D7CC, 'X'), - (0x1D7CE, 'M', u'0'), - ] - -def _seg_63(): - return [ - (0x1D7CF, 'M', u'1'), - (0x1D7D0, 'M', u'2'), - (0x1D7D1, 'M', u'3'), - (0x1D7D2, 'M', u'4'), - (0x1D7D3, 'M', u'5'), - (0x1D7D4, 'M', u'6'), - (0x1D7D5, 'M', u'7'), - (0x1D7D6, 'M', u'8'), - (0x1D7D7, 'M', u'9'), - (0x1D7D8, 'M', u'0'), - (0x1D7D9, 'M', u'1'), - (0x1D7DA, 'M', u'2'), - (0x1D7DB, 'M', u'3'), - (0x1D7DC, 'M', u'4'), - (0x1D7DD, 'M', u'5'), - (0x1D7DE, 'M', u'6'), - (0x1D7DF, 'M', u'7'), - (0x1D7E0, 'M', u'8'), - (0x1D7E1, 'M', u'9'), - (0x1D7E2, 'M', u'0'), - (0x1D7E3, 'M', u'1'), - (0x1D7E4, 'M', u'2'), - (0x1D7E5, 'M', u'3'), - (0x1D7E6, 'M', u'4'), - (0x1D7E7, 'M', u'5'), - (0x1D7E8, 'M', u'6'), - (0x1D7E9, 'M', u'7'), - (0x1D7EA, 'M', u'8'), - (0x1D7EB, 'M', u'9'), - (0x1D7EC, 'M', u'0'), - (0x1D7ED, 'M', u'1'), - (0x1D7EE, 'M', u'2'), - (0x1D7EF, 'M', u'3'), - (0x1D7F0, 'M', u'4'), - (0x1D7F1, 'M', u'5'), - (0x1D7F2, 'M', u'6'), - (0x1D7F3, 'M', u'7'), - (0x1D7F4, 'M', u'8'), - (0x1D7F5, 'M', u'9'), - (0x1D7F6, 'M', u'0'), - (0x1D7F7, 'M', u'1'), - (0x1D7F8, 'M', u'2'), - (0x1D7F9, 'M', u'3'), - (0x1D7FA, 'M', u'4'), - (0x1D7FB, 'M', u'5'), - (0x1D7FC, 'M', u'6'), - (0x1D7FD, 'M', u'7'), - (0x1D7FE, 'M', u'8'), - (0x1D7FF, 'M', u'9'), - (0x1D800, 'X'), - (0x1EE00, 'M', u'ا'), - (0x1EE01, 'M', u'ب'), - (0x1EE02, 'M', u'ج'), - (0x1EE03, 'M', u'د'), - (0x1EE04, 'X'), - (0x1EE05, 'M', u'و'), - (0x1EE06, 'M', u'ز'), - (0x1EE07, 'M', u'ح'), - (0x1EE08, 'M', u'ط'), - (0x1EE09, 'M', u'ي'), - (0x1EE0A, 'M', u'ك'), - (0x1EE0B, 'M', u'ل'), - (0x1EE0C, 'M', u'م'), - (0x1EE0D, 'M', u'ن'), - (0x1EE0E, 'M', u'س'), - (0x1EE0F, 'M', u'ع'), - (0x1EE10, 'M', u'ف'), - (0x1EE11, 'M', u'ص'), - (0x1EE12, 'M', u'ق'), - (0x1EE13, 'M', u'ر'), - (0x1EE14, 'M', u'ش'), - (0x1EE15, 'M', u'ت'), - (0x1EE16, 'M', u'ث'), - (0x1EE17, 'M', u'خ'), - (0x1EE18, 'M', u'ذ'), - (0x1EE19, 'M', u'ض'), - (0x1EE1A, 'M', u'ظ'), - (0x1EE1B, 'M', u'غ'), - (0x1EE1C, 'M', u'ٮ'), - (0x1EE1D, 'M', u'ں'), - (0x1EE1E, 'M', u'ڡ'), - (0x1EE1F, 'M', u'ٯ'), - (0x1EE20, 'X'), - (0x1EE21, 'M', u'ب'), - (0x1EE22, 'M', u'ج'), - (0x1EE23, 'X'), - (0x1EE24, 'M', u'ه'), - (0x1EE25, 'X'), - (0x1EE27, 'M', u'ح'), - (0x1EE28, 'X'), - (0x1EE29, 'M', u'ي'), - (0x1EE2A, 'M', u'ك'), - (0x1EE2B, 'M', u'ل'), - (0x1EE2C, 'M', u'م'), - (0x1EE2D, 'M', u'ن'), - (0x1EE2E, 'M', u'س'), - (0x1EE2F, 'M', u'ع'), - (0x1EE30, 'M', u'ف'), - (0x1EE31, 'M', u'ص'), - (0x1EE32, 'M', u'ق'), - ] - -def _seg_64(): - return [ - (0x1EE33, 'X'), - (0x1EE34, 'M', u'ش'), - (0x1EE35, 'M', u'ت'), - (0x1EE36, 'M', u'ث'), - (0x1EE37, 'M', u'خ'), - (0x1EE38, 'X'), - (0x1EE39, 'M', u'ض'), - (0x1EE3A, 'X'), - (0x1EE3B, 'M', u'غ'), - (0x1EE3C, 'X'), - (0x1EE42, 'M', u'ج'), - (0x1EE43, 'X'), - (0x1EE47, 'M', u'ح'), - (0x1EE48, 'X'), - (0x1EE49, 'M', u'ي'), - (0x1EE4A, 'X'), - (0x1EE4B, 'M', u'ل'), - (0x1EE4C, 'X'), - (0x1EE4D, 'M', u'ن'), - (0x1EE4E, 'M', u'س'), - (0x1EE4F, 'M', u'ع'), - (0x1EE50, 'X'), - (0x1EE51, 'M', u'ص'), - (0x1EE52, 'M', u'ق'), - (0x1EE53, 'X'), - (0x1EE54, 'M', u'ش'), - (0x1EE55, 'X'), - (0x1EE57, 'M', u'خ'), - (0x1EE58, 'X'), - (0x1EE59, 'M', u'ض'), - (0x1EE5A, 'X'), - (0x1EE5B, 'M', u'غ'), - (0x1EE5C, 'X'), - (0x1EE5D, 'M', u'ں'), - (0x1EE5E, 'X'), - (0x1EE5F, 'M', u'ٯ'), - (0x1EE60, 'X'), - (0x1EE61, 'M', u'ب'), - (0x1EE62, 'M', u'ج'), - (0x1EE63, 'X'), - (0x1EE64, 'M', u'ه'), - (0x1EE65, 'X'), - (0x1EE67, 'M', u'ح'), - (0x1EE68, 'M', u'ط'), - (0x1EE69, 'M', u'ي'), - (0x1EE6A, 'M', u'ك'), - (0x1EE6B, 'X'), - (0x1EE6C, 'M', u'م'), - (0x1EE6D, 'M', u'ن'), - (0x1EE6E, 'M', u'س'), - (0x1EE6F, 'M', u'ع'), - (0x1EE70, 'M', u'ف'), - (0x1EE71, 'M', u'ص'), - (0x1EE72, 'M', u'ق'), - (0x1EE73, 'X'), - (0x1EE74, 'M', u'ش'), - (0x1EE75, 'M', u'ت'), - (0x1EE76, 'M', u'ث'), - (0x1EE77, 'M', u'خ'), - (0x1EE78, 'X'), - (0x1EE79, 'M', u'ض'), - (0x1EE7A, 'M', u'ظ'), - (0x1EE7B, 'M', u'غ'), - (0x1EE7C, 'M', u'ٮ'), - (0x1EE7D, 'X'), - (0x1EE7E, 'M', u'ڡ'), - (0x1EE7F, 'X'), - (0x1EE80, 'M', u'ا'), - (0x1EE81, 'M', u'ب'), - (0x1EE82, 'M', u'ج'), - (0x1EE83, 'M', u'د'), - (0x1EE84, 'M', u'ه'), - (0x1EE85, 'M', u'و'), - (0x1EE86, 'M', u'ز'), - (0x1EE87, 'M', u'ح'), - (0x1EE88, 'M', u'ط'), - (0x1EE89, 'M', u'ي'), - (0x1EE8A, 'X'), - (0x1EE8B, 'M', u'ل'), - (0x1EE8C, 'M', u'م'), - (0x1EE8D, 'M', u'ن'), - (0x1EE8E, 'M', u'س'), - (0x1EE8F, 'M', u'ع'), - (0x1EE90, 'M', u'ف'), - (0x1EE91, 'M', u'ص'), - (0x1EE92, 'M', u'ق'), - (0x1EE93, 'M', u'ر'), - (0x1EE94, 'M', u'ش'), - (0x1EE95, 'M', u'ت'), - (0x1EE96, 'M', u'ث'), - (0x1EE97, 'M', u'خ'), - (0x1EE98, 'M', u'ذ'), - (0x1EE99, 'M', u'ض'), - (0x1EE9A, 'M', u'ظ'), - (0x1EE9B, 'M', u'غ'), - (0x1EE9C, 'X'), - (0x1EEA1, 'M', u'ب'), - (0x1EEA2, 'M', u'ج'), - (0x1EEA3, 'M', u'د'), - (0x1EEA4, 'X'), - ] - -def _seg_65(): - return [ - (0x1EEA5, 'M', u'و'), - (0x1EEA6, 'M', u'ز'), - (0x1EEA7, 'M', u'ح'), - (0x1EEA8, 'M', u'ط'), - (0x1EEA9, 'M', u'ي'), - (0x1EEAA, 'X'), - (0x1EEAB, 'M', u'ل'), - (0x1EEAC, 'M', u'م'), - (0x1EEAD, 'M', u'ن'), - (0x1EEAE, 'M', u'س'), - (0x1EEAF, 'M', u'ع'), - (0x1EEB0, 'M', u'ف'), - (0x1EEB1, 'M', u'ص'), - (0x1EEB2, 'M', u'ق'), - (0x1EEB3, 'M', u'ر'), - (0x1EEB4, 'M', u'ش'), - (0x1EEB5, 'M', u'ت'), - (0x1EEB6, 'M', u'ث'), - (0x1EEB7, 'M', u'خ'), - (0x1EEB8, 'M', u'ذ'), - (0x1EEB9, 'M', u'ض'), - (0x1EEBA, 'M', u'ظ'), - (0x1EEBB, 'M', u'غ'), - (0x1EEBC, 'X'), - (0x1EEF0, 'V'), - (0x1EEF2, 'X'), - (0x1F000, 'V'), - (0x1F02C, 'X'), - (0x1F030, 'V'), - (0x1F094, 'X'), - (0x1F0A0, 'V'), - (0x1F0AF, 'X'), - (0x1F0B1, 'V'), - (0x1F0BF, 'X'), - (0x1F0C1, 'V'), - (0x1F0D0, 'X'), - (0x1F0D1, 'V'), - (0x1F0E0, 'X'), - (0x1F101, '3', u'0,'), - (0x1F102, '3', u'1,'), - (0x1F103, '3', u'2,'), - (0x1F104, '3', u'3,'), - (0x1F105, '3', u'4,'), - (0x1F106, '3', u'5,'), - (0x1F107, '3', u'6,'), - (0x1F108, '3', u'7,'), - (0x1F109, '3', u'8,'), - (0x1F10A, '3', u'9,'), - (0x1F10B, 'X'), - (0x1F110, '3', u'(a)'), - (0x1F111, '3', u'(b)'), - (0x1F112, '3', u'(c)'), - (0x1F113, '3', u'(d)'), - (0x1F114, '3', u'(e)'), - (0x1F115, '3', u'(f)'), - (0x1F116, '3', u'(g)'), - (0x1F117, '3', u'(h)'), - (0x1F118, '3', u'(i)'), - (0x1F119, '3', u'(j)'), - (0x1F11A, '3', u'(k)'), - (0x1F11B, '3', u'(l)'), - (0x1F11C, '3', u'(m)'), - (0x1F11D, '3', u'(n)'), - (0x1F11E, '3', u'(o)'), - (0x1F11F, '3', u'(p)'), - (0x1F120, '3', u'(q)'), - (0x1F121, '3', u'(r)'), - (0x1F122, '3', u'(s)'), - (0x1F123, '3', u'(t)'), - (0x1F124, '3', u'(u)'), - (0x1F125, '3', u'(v)'), - (0x1F126, '3', u'(w)'), - (0x1F127, '3', u'(x)'), - (0x1F128, '3', u'(y)'), - (0x1F129, '3', u'(z)'), - (0x1F12A, 'M', u'〔s〕'), - (0x1F12B, 'M', u'c'), - (0x1F12C, 'M', u'r'), - (0x1F12D, 'M', u'cd'), - (0x1F12E, 'M', u'wz'), - (0x1F12F, 'X'), - (0x1F130, 'M', u'a'), - (0x1F131, 'M', u'b'), - (0x1F132, 'M', u'c'), - (0x1F133, 'M', u'd'), - (0x1F134, 'M', u'e'), - (0x1F135, 'M', u'f'), - (0x1F136, 'M', u'g'), - (0x1F137, 'M', u'h'), - (0x1F138, 'M', u'i'), - (0x1F139, 'M', u'j'), - (0x1F13A, 'M', u'k'), - (0x1F13B, 'M', u'l'), - (0x1F13C, 'M', u'm'), - (0x1F13D, 'M', u'n'), - (0x1F13E, 'M', u'o'), - (0x1F13F, 'M', u'p'), - (0x1F140, 'M', u'q'), - (0x1F141, 'M', u'r'), - (0x1F142, 'M', u's'), - ] - -def _seg_66(): - return [ - (0x1F143, 'M', u't'), - (0x1F144, 'M', u'u'), - (0x1F145, 'M', u'v'), - (0x1F146, 'M', u'w'), - (0x1F147, 'M', u'x'), - (0x1F148, 'M', u'y'), - (0x1F149, 'M', u'z'), - (0x1F14A, 'M', u'hv'), - (0x1F14B, 'M', u'mv'), - (0x1F14C, 'M', u'sd'), - (0x1F14D, 'M', u'ss'), - (0x1F14E, 'M', u'ppv'), - (0x1F14F, 'M', u'wc'), - (0x1F150, 'V'), - (0x1F16A, 'M', u'mc'), - (0x1F16B, 'M', u'md'), - (0x1F16C, 'X'), - (0x1F170, 'V'), - (0x1F190, 'M', u'dj'), - (0x1F191, 'V'), - (0x1F19B, 'X'), - (0x1F1E6, 'V'), - (0x1F200, 'M', u'ほか'), - (0x1F201, 'M', u'ココ'), - (0x1F202, 'M', u'サ'), - (0x1F203, 'X'), - (0x1F210, 'M', u'手'), - (0x1F211, 'M', u'字'), - (0x1F212, 'M', u'双'), - (0x1F213, 'M', u'デ'), - (0x1F214, 'M', u'二'), - (0x1F215, 'M', u'多'), - (0x1F216, 'M', u'解'), - (0x1F217, 'M', u'天'), - (0x1F218, 'M', u'交'), - (0x1F219, 'M', u'映'), - (0x1F21A, 'M', u'無'), - (0x1F21B, 'M', u'料'), - (0x1F21C, 'M', u'前'), - (0x1F21D, 'M', u'後'), - (0x1F21E, 'M', u'再'), - (0x1F21F, 'M', u'新'), - (0x1F220, 'M', u'初'), - (0x1F221, 'M', u'終'), - (0x1F222, 'M', u'生'), - (0x1F223, 'M', u'販'), - (0x1F224, 'M', u'声'), - (0x1F225, 'M', u'吹'), - (0x1F226, 'M', u'演'), - (0x1F227, 'M', u'投'), - (0x1F228, 'M', u'捕'), - (0x1F229, 'M', u'一'), - (0x1F22A, 'M', u'三'), - (0x1F22B, 'M', u'遊'), - (0x1F22C, 'M', u'左'), - (0x1F22D, 'M', u'中'), - (0x1F22E, 'M', u'右'), - (0x1F22F, 'M', u'指'), - (0x1F230, 'M', u'走'), - (0x1F231, 'M', u'打'), - (0x1F232, 'M', u'禁'), - (0x1F233, 'M', u'空'), - (0x1F234, 'M', u'合'), - (0x1F235, 'M', u'満'), - (0x1F236, 'M', u'有'), - (0x1F237, 'M', u'月'), - (0x1F238, 'M', u'申'), - (0x1F239, 'M', u'割'), - (0x1F23A, 'M', u'営'), - (0x1F23B, 'X'), - (0x1F240, 'M', u'〔本〕'), - (0x1F241, 'M', u'〔三〕'), - (0x1F242, 'M', u'〔二〕'), - (0x1F243, 'M', u'〔安〕'), - (0x1F244, 'M', u'〔点〕'), - (0x1F245, 'M', u'〔打〕'), - (0x1F246, 'M', u'〔盗〕'), - (0x1F247, 'M', u'〔勝〕'), - (0x1F248, 'M', u'〔敗〕'), - (0x1F249, 'X'), - (0x1F250, 'M', u'得'), - (0x1F251, 'M', u'可'), - (0x1F252, 'X'), - (0x1F300, 'V'), - (0x1F321, 'X'), - (0x1F330, 'V'), - (0x1F336, 'X'), - (0x1F337, 'V'), - (0x1F37D, 'X'), - (0x1F380, 'V'), - (0x1F394, 'X'), - (0x1F3A0, 'V'), - (0x1F3C5, 'X'), - (0x1F3C6, 'V'), - (0x1F3CB, 'X'), - (0x1F3E0, 'V'), - (0x1F3F1, 'X'), - (0x1F400, 'V'), - (0x1F43F, 'X'), - (0x1F440, 'V'), - ] - -def _seg_67(): - return [ - (0x1F441, 'X'), - (0x1F442, 'V'), - (0x1F4F8, 'X'), - (0x1F4F9, 'V'), - (0x1F4FD, 'X'), - (0x1F500, 'V'), - (0x1F53E, 'X'), - (0x1F540, 'V'), - (0x1F544, 'X'), - (0x1F550, 'V'), - (0x1F568, 'X'), - (0x1F5FB, 'V'), - (0x1F641, 'X'), - (0x1F645, 'V'), - (0x1F650, 'X'), - (0x1F680, 'V'), - (0x1F6C6, 'X'), - (0x1F700, 'V'), - (0x1F774, 'X'), - (0x20000, 'V'), - (0x2A6D7, 'X'), - (0x2A700, 'V'), - (0x2B735, 'X'), - (0x2B740, 'V'), - (0x2B81E, 'X'), - (0x2F800, 'M', u'丽'), - (0x2F801, 'M', u'丸'), - (0x2F802, 'M', u'乁'), - (0x2F803, 'M', u'𠄢'), - (0x2F804, 'M', u'你'), - (0x2F805, 'M', u'侮'), - (0x2F806, 'M', u'侻'), - (0x2F807, 'M', u'倂'), - (0x2F808, 'M', u'偺'), - (0x2F809, 'M', u'備'), - (0x2F80A, 'M', u'僧'), - (0x2F80B, 'M', u'像'), - (0x2F80C, 'M', u'㒞'), - (0x2F80D, 'M', u'𠘺'), - (0x2F80E, 'M', u'免'), - (0x2F80F, 'M', u'兔'), - (0x2F810, 'M', u'兤'), - (0x2F811, 'M', u'具'), - (0x2F812, 'M', u'𠔜'), - (0x2F813, 'M', u'㒹'), - (0x2F814, 'M', u'內'), - (0x2F815, 'M', u'再'), - (0x2F816, 'M', u'𠕋'), - (0x2F817, 'M', u'冗'), - (0x2F818, 'M', u'冤'), - (0x2F819, 'M', u'仌'), - (0x2F81A, 'M', u'冬'), - (0x2F81B, 'M', u'况'), - (0x2F81C, 'M', u'𩇟'), - (0x2F81D, 'M', u'凵'), - (0x2F81E, 'M', u'刃'), - (0x2F81F, 'M', u'㓟'), - (0x2F820, 'M', u'刻'), - (0x2F821, 'M', u'剆'), - (0x2F822, 'M', u'割'), - (0x2F823, 'M', u'剷'), - (0x2F824, 'M', u'㔕'), - (0x2F825, 'M', u'勇'), - (0x2F826, 'M', u'勉'), - (0x2F827, 'M', u'勤'), - (0x2F828, 'M', u'勺'), - (0x2F829, 'M', u'包'), - (0x2F82A, 'M', u'匆'), - (0x2F82B, 'M', u'北'), - (0x2F82C, 'M', u'卉'), - (0x2F82D, 'M', u'卑'), - (0x2F82E, 'M', u'博'), - (0x2F82F, 'M', u'即'), - (0x2F830, 'M', u'卽'), - (0x2F831, 'M', u'卿'), - (0x2F834, 'M', u'𠨬'), - (0x2F835, 'M', u'灰'), - (0x2F836, 'M', u'及'), - (0x2F837, 'M', u'叟'), - (0x2F838, 'M', u'𠭣'), - (0x2F839, 'M', u'叫'), - (0x2F83A, 'M', u'叱'), - (0x2F83B, 'M', u'吆'), - (0x2F83C, 'M', u'咞'), - (0x2F83D, 'M', u'吸'), - (0x2F83E, 'M', u'呈'), - (0x2F83F, 'M', u'周'), - (0x2F840, 'M', u'咢'), - (0x2F841, 'M', u'哶'), - (0x2F842, 'M', u'唐'), - (0x2F843, 'M', u'啓'), - (0x2F844, 'M', u'啣'), - (0x2F845, 'M', u'善'), - (0x2F847, 'M', u'喙'), - (0x2F848, 'M', u'喫'), - (0x2F849, 'M', u'喳'), - (0x2F84A, 'M', u'嗂'), - (0x2F84B, 'M', u'圖'), - (0x2F84C, 'M', u'嘆'), - (0x2F84D, 'M', u'圗'), - ] - -def _seg_68(): - return [ - (0x2F84E, 'M', u'噑'), - (0x2F84F, 'M', u'噴'), - (0x2F850, 'M', u'切'), - (0x2F851, 'M', u'壮'), - (0x2F852, 'M', u'城'), - (0x2F853, 'M', u'埴'), - (0x2F854, 'M', u'堍'), - (0x2F855, 'M', u'型'), - (0x2F856, 'M', u'堲'), - (0x2F857, 'M', u'報'), - (0x2F858, 'M', u'墬'), - (0x2F859, 'M', u'𡓤'), - (0x2F85A, 'M', u'売'), - (0x2F85B, 'M', u'壷'), - (0x2F85C, 'M', u'夆'), - (0x2F85D, 'M', u'多'), - (0x2F85E, 'M', u'夢'), - (0x2F85F, 'M', u'奢'), - (0x2F860, 'M', u'𡚨'), - (0x2F861, 'M', u'𡛪'), - (0x2F862, 'M', u'姬'), - (0x2F863, 'M', u'娛'), - (0x2F864, 'M', u'娧'), - (0x2F865, 'M', u'姘'), - (0x2F866, 'M', u'婦'), - (0x2F867, 'M', u'㛮'), - (0x2F868, 'X'), - (0x2F869, 'M', u'嬈'), - (0x2F86A, 'M', u'嬾'), - (0x2F86C, 'M', u'𡧈'), - (0x2F86D, 'M', u'寃'), - (0x2F86E, 'M', u'寘'), - (0x2F86F, 'M', u'寧'), - (0x2F870, 'M', u'寳'), - (0x2F871, 'M', u'𡬘'), - (0x2F872, 'M', u'寿'), - (0x2F873, 'M', u'将'), - (0x2F874, 'X'), - (0x2F875, 'M', u'尢'), - (0x2F876, 'M', u'㞁'), - (0x2F877, 'M', u'屠'), - (0x2F878, 'M', u'屮'), - (0x2F879, 'M', u'峀'), - (0x2F87A, 'M', u'岍'), - (0x2F87B, 'M', u'𡷤'), - (0x2F87C, 'M', u'嵃'), - (0x2F87D, 'M', u'𡷦'), - (0x2F87E, 'M', u'嵮'), - (0x2F87F, 'M', u'嵫'), - (0x2F880, 'M', u'嵼'), - (0x2F881, 'M', u'巡'), - (0x2F882, 'M', u'巢'), - (0x2F883, 'M', u'㠯'), - (0x2F884, 'M', u'巽'), - (0x2F885, 'M', u'帨'), - (0x2F886, 'M', u'帽'), - (0x2F887, 'M', u'幩'), - (0x2F888, 'M', u'㡢'), - (0x2F889, 'M', u'𢆃'), - (0x2F88A, 'M', u'㡼'), - (0x2F88B, 'M', u'庰'), - (0x2F88C, 'M', u'庳'), - (0x2F88D, 'M', u'庶'), - (0x2F88E, 'M', u'廊'), - (0x2F88F, 'M', u'𪎒'), - (0x2F890, 'M', u'廾'), - (0x2F891, 'M', u'𢌱'), - (0x2F893, 'M', u'舁'), - (0x2F894, 'M', u'弢'), - (0x2F896, 'M', u'㣇'), - (0x2F897, 'M', u'𣊸'), - (0x2F898, 'M', u'𦇚'), - (0x2F899, 'M', u'形'), - (0x2F89A, 'M', u'彫'), - (0x2F89B, 'M', u'㣣'), - (0x2F89C, 'M', u'徚'), - (0x2F89D, 'M', u'忍'), - (0x2F89E, 'M', u'志'), - (0x2F89F, 'M', u'忹'), - (0x2F8A0, 'M', u'悁'), - (0x2F8A1, 'M', u'㤺'), - (0x2F8A2, 'M', u'㤜'), - (0x2F8A3, 'M', u'悔'), - (0x2F8A4, 'M', u'𢛔'), - (0x2F8A5, 'M', u'惇'), - (0x2F8A6, 'M', u'慈'), - (0x2F8A7, 'M', u'慌'), - (0x2F8A8, 'M', u'慎'), - (0x2F8A9, 'M', u'慌'), - (0x2F8AA, 'M', u'慺'), - (0x2F8AB, 'M', u'憎'), - (0x2F8AC, 'M', u'憲'), - (0x2F8AD, 'M', u'憤'), - (0x2F8AE, 'M', u'憯'), - (0x2F8AF, 'M', u'懞'), - (0x2F8B0, 'M', u'懲'), - (0x2F8B1, 'M', u'懶'), - (0x2F8B2, 'M', u'成'), - (0x2F8B3, 'M', u'戛'), - (0x2F8B4, 'M', u'扝'), - ] - -def _seg_69(): - return [ - (0x2F8B5, 'M', u'抱'), - (0x2F8B6, 'M', u'拔'), - (0x2F8B7, 'M', u'捐'), - (0x2F8B8, 'M', u'𢬌'), - (0x2F8B9, 'M', u'挽'), - (0x2F8BA, 'M', u'拼'), - (0x2F8BB, 'M', u'捨'), - (0x2F8BC, 'M', u'掃'), - (0x2F8BD, 'M', u'揤'), - (0x2F8BE, 'M', u'𢯱'), - (0x2F8BF, 'M', u'搢'), - (0x2F8C0, 'M', u'揅'), - (0x2F8C1, 'M', u'掩'), - (0x2F8C2, 'M', u'㨮'), - (0x2F8C3, 'M', u'摩'), - (0x2F8C4, 'M', u'摾'), - (0x2F8C5, 'M', u'撝'), - (0x2F8C6, 'M', u'摷'), - (0x2F8C7, 'M', u'㩬'), - (0x2F8C8, 'M', u'敏'), - (0x2F8C9, 'M', u'敬'), - (0x2F8CA, 'M', u'𣀊'), - (0x2F8CB, 'M', u'旣'), - (0x2F8CC, 'M', u'書'), - (0x2F8CD, 'M', u'晉'), - (0x2F8CE, 'M', u'㬙'), - (0x2F8CF, 'M', u'暑'), - (0x2F8D0, 'M', u'㬈'), - (0x2F8D1, 'M', u'㫤'), - (0x2F8D2, 'M', u'冒'), - (0x2F8D3, 'M', u'冕'), - (0x2F8D4, 'M', u'最'), - (0x2F8D5, 'M', u'暜'), - (0x2F8D6, 'M', u'肭'), - (0x2F8D7, 'M', u'䏙'), - (0x2F8D8, 'M', u'朗'), - (0x2F8D9, 'M', u'望'), - (0x2F8DA, 'M', u'朡'), - (0x2F8DB, 'M', u'杞'), - (0x2F8DC, 'M', u'杓'), - (0x2F8DD, 'M', u'𣏃'), - (0x2F8DE, 'M', u'㭉'), - (0x2F8DF, 'M', u'柺'), - (0x2F8E0, 'M', u'枅'), - (0x2F8E1, 'M', u'桒'), - (0x2F8E2, 'M', u'梅'), - (0x2F8E3, 'M', u'𣑭'), - (0x2F8E4, 'M', u'梎'), - (0x2F8E5, 'M', u'栟'), - (0x2F8E6, 'M', u'椔'), - (0x2F8E7, 'M', u'㮝'), - (0x2F8E8, 'M', u'楂'), - (0x2F8E9, 'M', u'榣'), - (0x2F8EA, 'M', u'槪'), - (0x2F8EB, 'M', u'檨'), - (0x2F8EC, 'M', u'𣚣'), - (0x2F8ED, 'M', u'櫛'), - (0x2F8EE, 'M', u'㰘'), - (0x2F8EF, 'M', u'次'), - (0x2F8F0, 'M', u'𣢧'), - (0x2F8F1, 'M', u'歔'), - (0x2F8F2, 'M', u'㱎'), - (0x2F8F3, 'M', u'歲'), - (0x2F8F4, 'M', u'殟'), - (0x2F8F5, 'M', u'殺'), - (0x2F8F6, 'M', u'殻'), - (0x2F8F7, 'M', u'𣪍'), - (0x2F8F8, 'M', u'𡴋'), - (0x2F8F9, 'M', u'𣫺'), - (0x2F8FA, 'M', u'汎'), - (0x2F8FB, 'M', u'𣲼'), - (0x2F8FC, 'M', u'沿'), - (0x2F8FD, 'M', u'泍'), - (0x2F8FE, 'M', u'汧'), - (0x2F8FF, 'M', u'洖'), - (0x2F900, 'M', u'派'), - (0x2F901, 'M', u'海'), - (0x2F902, 'M', u'流'), - (0x2F903, 'M', u'浩'), - (0x2F904, 'M', u'浸'), - (0x2F905, 'M', u'涅'), - (0x2F906, 'M', u'𣴞'), - (0x2F907, 'M', u'洴'), - (0x2F908, 'M', u'港'), - (0x2F909, 'M', u'湮'), - (0x2F90A, 'M', u'㴳'), - (0x2F90B, 'M', u'滋'), - (0x2F90C, 'M', u'滇'), - (0x2F90D, 'M', u'𣻑'), - (0x2F90E, 'M', u'淹'), - (0x2F90F, 'M', u'潮'), - (0x2F910, 'M', u'𣽞'), - (0x2F911, 'M', u'𣾎'), - (0x2F912, 'M', u'濆'), - (0x2F913, 'M', u'瀹'), - (0x2F914, 'M', u'瀞'), - (0x2F915, 'M', u'瀛'), - (0x2F916, 'M', u'㶖'), - (0x2F917, 'M', u'灊'), - (0x2F918, 'M', u'災'), - ] - -def _seg_70(): - return [ - (0x2F919, 'M', u'灷'), - (0x2F91A, 'M', u'炭'), - (0x2F91B, 'M', u'𠔥'), - (0x2F91C, 'M', u'煅'), - (0x2F91D, 'M', u'𤉣'), - (0x2F91E, 'M', u'熜'), - (0x2F91F, 'X'), - (0x2F920, 'M', u'爨'), - (0x2F921, 'M', u'爵'), - (0x2F922, 'M', u'牐'), - (0x2F923, 'M', u'𤘈'), - (0x2F924, 'M', u'犀'), - (0x2F925, 'M', u'犕'), - (0x2F926, 'M', u'𤜵'), - (0x2F927, 'M', u'𤠔'), - (0x2F928, 'M', u'獺'), - (0x2F929, 'M', u'王'), - (0x2F92A, 'M', u'㺬'), - (0x2F92B, 'M', u'玥'), - (0x2F92C, 'M', u'㺸'), - (0x2F92E, 'M', u'瑇'), - (0x2F92F, 'M', u'瑜'), - (0x2F930, 'M', u'瑱'), - (0x2F931, 'M', u'璅'), - (0x2F932, 'M', u'瓊'), - (0x2F933, 'M', u'㼛'), - (0x2F934, 'M', u'甤'), - (0x2F935, 'M', u'𤰶'), - (0x2F936, 'M', u'甾'), - (0x2F937, 'M', u'𤲒'), - (0x2F938, 'M', u'異'), - (0x2F939, 'M', u'𢆟'), - (0x2F93A, 'M', u'瘐'), - (0x2F93B, 'M', u'𤾡'), - (0x2F93C, 'M', u'𤾸'), - (0x2F93D, 'M', u'𥁄'), - (0x2F93E, 'M', u'㿼'), - (0x2F93F, 'M', u'䀈'), - (0x2F940, 'M', u'直'), - (0x2F941, 'M', u'𥃳'), - (0x2F942, 'M', u'𥃲'), - (0x2F943, 'M', u'𥄙'), - (0x2F944, 'M', u'𥄳'), - (0x2F945, 'M', u'眞'), - (0x2F946, 'M', u'真'), - (0x2F948, 'M', u'睊'), - (0x2F949, 'M', u'䀹'), - (0x2F94A, 'M', u'瞋'), - (0x2F94B, 'M', u'䁆'), - (0x2F94C, 'M', u'䂖'), - (0x2F94D, 'M', u'𥐝'), - (0x2F94E, 'M', u'硎'), - (0x2F94F, 'M', u'碌'), - (0x2F950, 'M', u'磌'), - (0x2F951, 'M', u'䃣'), - (0x2F952, 'M', u'𥘦'), - (0x2F953, 'M', u'祖'), - (0x2F954, 'M', u'𥚚'), - (0x2F955, 'M', u'𥛅'), - (0x2F956, 'M', u'福'), - (0x2F957, 'M', u'秫'), - (0x2F958, 'M', u'䄯'), - (0x2F959, 'M', u'穀'), - (0x2F95A, 'M', u'穊'), - (0x2F95B, 'M', u'穏'), - (0x2F95C, 'M', u'𥥼'), - (0x2F95D, 'M', u'𥪧'), - (0x2F95F, 'X'), - (0x2F960, 'M', u'䈂'), - (0x2F961, 'M', u'𥮫'), - (0x2F962, 'M', u'篆'), - (0x2F963, 'M', u'築'), - (0x2F964, 'M', u'䈧'), - (0x2F965, 'M', u'𥲀'), - (0x2F966, 'M', u'糒'), - (0x2F967, 'M', u'䊠'), - (0x2F968, 'M', u'糨'), - (0x2F969, 'M', u'糣'), - (0x2F96A, 'M', u'紀'), - (0x2F96B, 'M', u'𥾆'), - (0x2F96C, 'M', u'絣'), - (0x2F96D, 'M', u'䌁'), - (0x2F96E, 'M', u'緇'), - (0x2F96F, 'M', u'縂'), - (0x2F970, 'M', u'繅'), - (0x2F971, 'M', u'䌴'), - (0x2F972, 'M', u'𦈨'), - (0x2F973, 'M', u'𦉇'), - (0x2F974, 'M', u'䍙'), - (0x2F975, 'M', u'𦋙'), - (0x2F976, 'M', u'罺'), - (0x2F977, 'M', u'𦌾'), - (0x2F978, 'M', u'羕'), - (0x2F979, 'M', u'翺'), - (0x2F97A, 'M', u'者'), - (0x2F97B, 'M', u'𦓚'), - (0x2F97C, 'M', u'𦔣'), - (0x2F97D, 'M', u'聠'), - (0x2F97E, 'M', u'𦖨'), - (0x2F97F, 'M', u'聰'), - ] - -def _seg_71(): - return [ - (0x2F980, 'M', u'𣍟'), - (0x2F981, 'M', u'䏕'), - (0x2F982, 'M', u'育'), - (0x2F983, 'M', u'脃'), - (0x2F984, 'M', u'䐋'), - (0x2F985, 'M', u'脾'), - (0x2F986, 'M', u'媵'), - (0x2F987, 'M', u'𦞧'), - (0x2F988, 'M', u'𦞵'), - (0x2F989, 'M', u'𣎓'), - (0x2F98A, 'M', u'𣎜'), - (0x2F98B, 'M', u'舁'), - (0x2F98C, 'M', u'舄'), - (0x2F98D, 'M', u'辞'), - (0x2F98E, 'M', u'䑫'), - (0x2F98F, 'M', u'芑'), - (0x2F990, 'M', u'芋'), - (0x2F991, 'M', u'芝'), - (0x2F992, 'M', u'劳'), - (0x2F993, 'M', u'花'), - (0x2F994, 'M', u'芳'), - (0x2F995, 'M', u'芽'), - (0x2F996, 'M', u'苦'), - (0x2F997, 'M', u'𦬼'), - (0x2F998, 'M', u'若'), - (0x2F999, 'M', u'茝'), - (0x2F99A, 'M', u'荣'), - (0x2F99B, 'M', u'莭'), - (0x2F99C, 'M', u'茣'), - (0x2F99D, 'M', u'莽'), - (0x2F99E, 'M', u'菧'), - (0x2F99F, 'M', u'著'), - (0x2F9A0, 'M', u'荓'), - (0x2F9A1, 'M', u'菊'), - (0x2F9A2, 'M', u'菌'), - (0x2F9A3, 'M', u'菜'), - (0x2F9A4, 'M', u'𦰶'), - (0x2F9A5, 'M', u'𦵫'), - (0x2F9A6, 'M', u'𦳕'), - (0x2F9A7, 'M', u'䔫'), - (0x2F9A8, 'M', u'蓱'), - (0x2F9A9, 'M', u'蓳'), - (0x2F9AA, 'M', u'蔖'), - (0x2F9AB, 'M', u'𧏊'), - (0x2F9AC, 'M', u'蕤'), - (0x2F9AD, 'M', u'𦼬'), - (0x2F9AE, 'M', u'䕝'), - (0x2F9AF, 'M', u'䕡'), - (0x2F9B0, 'M', u'𦾱'), - (0x2F9B1, 'M', u'𧃒'), - (0x2F9B2, 'M', u'䕫'), - (0x2F9B3, 'M', u'虐'), - (0x2F9B4, 'M', u'虜'), - (0x2F9B5, 'M', u'虧'), - (0x2F9B6, 'M', u'虩'), - (0x2F9B7, 'M', u'蚩'), - (0x2F9B8, 'M', u'蚈'), - (0x2F9B9, 'M', u'蜎'), - (0x2F9BA, 'M', u'蛢'), - (0x2F9BB, 'M', u'蝹'), - (0x2F9BC, 'M', u'蜨'), - (0x2F9BD, 'M', u'蝫'), - (0x2F9BE, 'M', u'螆'), - (0x2F9BF, 'X'), - (0x2F9C0, 'M', u'蟡'), - (0x2F9C1, 'M', u'蠁'), - (0x2F9C2, 'M', u'䗹'), - (0x2F9C3, 'M', u'衠'), - (0x2F9C4, 'M', u'衣'), - (0x2F9C5, 'M', u'𧙧'), - (0x2F9C6, 'M', u'裗'), - (0x2F9C7, 'M', u'裞'), - (0x2F9C8, 'M', u'䘵'), - (0x2F9C9, 'M', u'裺'), - (0x2F9CA, 'M', u'㒻'), - (0x2F9CB, 'M', u'𧢮'), - (0x2F9CC, 'M', u'𧥦'), - (0x2F9CD, 'M', u'䚾'), - (0x2F9CE, 'M', u'䛇'), - (0x2F9CF, 'M', u'誠'), - (0x2F9D0, 'M', u'諭'), - (0x2F9D1, 'M', u'變'), - (0x2F9D2, 'M', u'豕'), - (0x2F9D3, 'M', u'𧲨'), - (0x2F9D4, 'M', u'貫'), - (0x2F9D5, 'M', u'賁'), - (0x2F9D6, 'M', u'贛'), - (0x2F9D7, 'M', u'起'), - (0x2F9D8, 'M', u'𧼯'), - (0x2F9D9, 'M', u'𠠄'), - (0x2F9DA, 'M', u'跋'), - (0x2F9DB, 'M', u'趼'), - (0x2F9DC, 'M', u'跰'), - (0x2F9DD, 'M', u'𠣞'), - (0x2F9DE, 'M', u'軔'), - (0x2F9DF, 'M', u'輸'), - (0x2F9E0, 'M', u'𨗒'), - (0x2F9E1, 'M', u'𨗭'), - (0x2F9E2, 'M', u'邔'), - (0x2F9E3, 'M', u'郱'), - ] - -def _seg_72(): - return [ - (0x2F9E4, 'M', u'鄑'), - (0x2F9E5, 'M', u'𨜮'), - (0x2F9E6, 'M', u'鄛'), - (0x2F9E7, 'M', u'鈸'), - (0x2F9E8, 'M', u'鋗'), - (0x2F9E9, 'M', u'鋘'), - (0x2F9EA, 'M', u'鉼'), - (0x2F9EB, 'M', u'鏹'), - (0x2F9EC, 'M', u'鐕'), - (0x2F9ED, 'M', u'𨯺'), - (0x2F9EE, 'M', u'開'), - (0x2F9EF, 'M', u'䦕'), - (0x2F9F0, 'M', u'閷'), - (0x2F9F1, 'M', u'𨵷'), - (0x2F9F2, 'M', u'䧦'), - (0x2F9F3, 'M', u'雃'), - (0x2F9F4, 'M', u'嶲'), - (0x2F9F5, 'M', u'霣'), - (0x2F9F6, 'M', u'𩅅'), - (0x2F9F7, 'M', u'𩈚'), - (0x2F9F8, 'M', u'䩮'), - (0x2F9F9, 'M', u'䩶'), - (0x2F9FA, 'M', u'韠'), - (0x2F9FB, 'M', u'𩐊'), - (0x2F9FC, 'M', u'䪲'), - (0x2F9FD, 'M', u'𩒖'), - (0x2F9FE, 'M', u'頋'), - (0x2FA00, 'M', u'頩'), - (0x2FA01, 'M', u'𩖶'), - (0x2FA02, 'M', u'飢'), - (0x2FA03, 'M', u'䬳'), - (0x2FA04, 'M', u'餩'), - (0x2FA05, 'M', u'馧'), - (0x2FA06, 'M', u'駂'), - (0x2FA07, 'M', u'駾'), - (0x2FA08, 'M', u'䯎'), - (0x2FA09, 'M', u'𩬰'), - (0x2FA0A, 'M', u'鬒'), - (0x2FA0B, 'M', u'鱀'), - (0x2FA0C, 'M', u'鳽'), - (0x2FA0D, 'M', u'䳎'), - (0x2FA0E, 'M', u'䳭'), - (0x2FA0F, 'M', u'鵧'), - (0x2FA10, 'M', u'𪃎'), - (0x2FA11, 'M', u'䳸'), - (0x2FA12, 'M', u'𪄅'), - (0x2FA13, 'M', u'𪈎'), - (0x2FA14, 'M', u'𪊑'), - (0x2FA15, 'M', u'麻'), - (0x2FA16, 'M', u'䵖'), - (0x2FA17, 'M', u'黹'), - (0x2FA18, 'M', u'黾'), - (0x2FA19, 'M', u'鼅'), - (0x2FA1A, 'M', u'鼏'), - (0x2FA1B, 'M', u'鼖'), - (0x2FA1C, 'M', u'鼻'), - (0x2FA1D, 'M', u'𪘀'), - (0x2FA1E, 'X'), - (0xE0100, 'I'), - (0xE01F0, 'X'), - ] - -uts46data = tuple( - _seg_0() - + _seg_1() - + _seg_2() - + _seg_3() - + _seg_4() - + _seg_5() - + _seg_6() - + _seg_7() - + _seg_8() - + _seg_9() - + _seg_10() - + _seg_11() - + _seg_12() - + _seg_13() - + _seg_14() - + _seg_15() - + _seg_16() - + _seg_17() - + _seg_18() - + _seg_19() - + _seg_20() - + _seg_21() - + _seg_22() - + _seg_23() - + _seg_24() - + _seg_25() - + _seg_26() - + _seg_27() - + _seg_28() - + _seg_29() - + _seg_30() - + _seg_31() - + _seg_32() - + _seg_33() - + _seg_34() - + _seg_35() - + _seg_36() - + _seg_37() - + _seg_38() - + _seg_39() - + _seg_40() - + _seg_41() - + _seg_42() - + _seg_43() - + _seg_44() - + _seg_45() - + _seg_46() - + _seg_47() - + _seg_48() - + _seg_49() - + _seg_50() - + _seg_51() - + _seg_52() - + _seg_53() - + _seg_54() - + _seg_55() - + _seg_56() - + _seg_57() - + _seg_58() - + _seg_59() - + _seg_60() - + _seg_61() - + _seg_62() - + _seg_63() - + _seg_64() - + _seg_65() - + _seg_66() - + _seg_67() - + _seg_68() - + _seg_69() - + _seg_70() - + _seg_71() - + _seg_72() -) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/__init__.py b/Contents/Libraries/Shared/requests/packages/urllib3/__init__.py deleted file mode 100644 index ac3ff838d..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/__init__.py +++ /dev/null @@ -1,97 +0,0 @@ -""" -urllib3 - Thread-safe connection pooling and re-using. -""" - -from __future__ import absolute_import -import warnings - -from .connectionpool import ( - HTTPConnectionPool, - HTTPSConnectionPool, - connection_from_url -) - -from . import exceptions -from .filepost import encode_multipart_formdata -from .poolmanager import PoolManager, ProxyManager, proxy_from_url -from .response import HTTPResponse -from .util.request import make_headers -from .util.url import get_host -from .util.timeout import Timeout -from .util.retry import Retry - - -# Set default logging handler to avoid "No handler found" warnings. -import logging -try: # Python 2.7+ - from logging import NullHandler -except ImportError: - class NullHandler(logging.Handler): - def emit(self, record): - pass - -__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' -__license__ = 'MIT' -__version__ = '1.20' - -__all__ = ( - 'HTTPConnectionPool', - 'HTTPSConnectionPool', - 'PoolManager', - 'ProxyManager', - 'HTTPResponse', - 'Retry', - 'Timeout', - 'add_stderr_logger', - 'connection_from_url', - 'disable_warnings', - 'encode_multipart_formdata', - 'get_host', - 'make_headers', - 'proxy_from_url', -) - -logging.getLogger(__name__).addHandler(NullHandler()) - - -def add_stderr_logger(level=logging.DEBUG): - """ - Helper for quickly adding a StreamHandler to the logger. Useful for - debugging. - - Returns the handler after adding it. - """ - # This method needs to be in this __init__.py to get the __name__ correct - # even if urllib3 is vendored within another package. - logger = logging.getLogger(__name__) - handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) - logger.addHandler(handler) - logger.setLevel(level) - logger.debug('Added a stderr logging handler to logger: %s', __name__) - return handler - - -# ... Clean up. -del NullHandler - - -# All warning filters *must* be appended unless you're really certain that they -# shouldn't be: otherwise, it's very hard for users to use most Python -# mechanisms to silence them. -# SecurityWarning's always go off by default. -warnings.simplefilter('always', exceptions.SecurityWarning, append=True) -# SubjectAltNameWarning's should go off once per host -warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) -# InsecurePlatformWarning's don't vary between requests, so we keep it default. -warnings.simplefilter('default', exceptions.InsecurePlatformWarning, - append=True) -# SNIMissingWarnings should go off only once. -warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) - - -def disable_warnings(category=exceptions.HTTPWarning): - """ - Helper for quickly disabling all urllib3 warnings. - """ - warnings.simplefilter('ignore', category) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/_collections.py b/Contents/Libraries/Shared/requests/packages/urllib3/_collections.py deleted file mode 100644 index 77cee0170..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/_collections.py +++ /dev/null @@ -1,324 +0,0 @@ -from __future__ import absolute_import -from collections import Mapping, MutableMapping -try: - from threading import RLock -except ImportError: # Platform-specific: No threads available - class RLock: - def __enter__(self): - pass - - def __exit__(self, exc_type, exc_value, traceback): - pass - - -try: # Python 2.7+ - from collections import OrderedDict -except ImportError: - from .packages.ordered_dict import OrderedDict -from .packages.six import iterkeys, itervalues, PY3 - - -__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] - - -_Null = object() - - -class RecentlyUsedContainer(MutableMapping): - """ - Provides a thread-safe dict-like container which maintains up to - ``maxsize`` keys while throwing away the least-recently-used keys beyond - ``maxsize``. - - :param maxsize: - Maximum number of recent elements to retain. - - :param dispose_func: - Every time an item is evicted from the container, - ``dispose_func(value)`` is called. Callback which will get called - """ - - ContainerCls = OrderedDict - - def __init__(self, maxsize=10, dispose_func=None): - self._maxsize = maxsize - self.dispose_func = dispose_func - - self._container = self.ContainerCls() - self.lock = RLock() - - def __getitem__(self, key): - # Re-insert the item, moving it to the end of the eviction line. - with self.lock: - item = self._container.pop(key) - self._container[key] = item - return item - - def __setitem__(self, key, value): - evicted_value = _Null - with self.lock: - # Possibly evict the existing value of 'key' - evicted_value = self._container.get(key, _Null) - self._container[key] = value - - # If we didn't evict an existing value, we might have to evict the - # least recently used item from the beginning of the container. - if len(self._container) > self._maxsize: - _key, evicted_value = self._container.popitem(last=False) - - if self.dispose_func and evicted_value is not _Null: - self.dispose_func(evicted_value) - - def __delitem__(self, key): - with self.lock: - value = self._container.pop(key) - - if self.dispose_func: - self.dispose_func(value) - - def __len__(self): - with self.lock: - return len(self._container) - - def __iter__(self): - raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') - - def clear(self): - with self.lock: - # Copy pointers to all values, then wipe the mapping - values = list(itervalues(self._container)) - self._container.clear() - - if self.dispose_func: - for value in values: - self.dispose_func(value) - - def keys(self): - with self.lock: - return list(iterkeys(self._container)) - - -class HTTPHeaderDict(MutableMapping): - """ - :param headers: - An iterable of field-value pairs. Must not contain multiple field names - when compared case-insensitively. - - :param kwargs: - Additional field-value pairs to pass in to ``dict.update``. - - A ``dict`` like container for storing HTTP Headers. - - Field names are stored and compared case-insensitively in compliance with - RFC 7230. Iteration provides the first case-sensitive key seen for each - case-insensitive pair. - - Using ``__setitem__`` syntax overwrites fields that compare equal - case-insensitively in order to maintain ``dict``'s api. For fields that - compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` - in a loop. - - If multiple fields that are equal case-insensitively are passed to the - constructor or ``.update``, the behavior is undefined and some will be - lost. - - >>> headers = HTTPHeaderDict() - >>> headers.add('Set-Cookie', 'foo=bar') - >>> headers.add('set-cookie', 'baz=quxx') - >>> headers['content-length'] = '7' - >>> headers['SET-cookie'] - 'foo=bar, baz=quxx' - >>> headers['Content-Length'] - '7' - """ - - def __init__(self, headers=None, **kwargs): - super(HTTPHeaderDict, self).__init__() - self._container = OrderedDict() - if headers is not None: - if isinstance(headers, HTTPHeaderDict): - self._copy_from(headers) - else: - self.extend(headers) - if kwargs: - self.extend(kwargs) - - def __setitem__(self, key, val): - self._container[key.lower()] = (key, val) - return self._container[key.lower()] - - def __getitem__(self, key): - val = self._container[key.lower()] - return ', '.join(val[1:]) - - def __delitem__(self, key): - del self._container[key.lower()] - - def __contains__(self, key): - return key.lower() in self._container - - def __eq__(self, other): - if not isinstance(other, Mapping) and not hasattr(other, 'keys'): - return False - if not isinstance(other, type(self)): - other = type(self)(other) - return (dict((k.lower(), v) for k, v in self.itermerged()) == - dict((k.lower(), v) for k, v in other.itermerged())) - - def __ne__(self, other): - return not self.__eq__(other) - - if not PY3: # Python 2 - iterkeys = MutableMapping.iterkeys - itervalues = MutableMapping.itervalues - - __marker = object() - - def __len__(self): - return len(self._container) - - def __iter__(self): - # Only provide the originally cased names - for vals in self._container.values(): - yield vals[0] - - def pop(self, key, default=__marker): - '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - ''' - # Using the MutableMapping function directly fails due to the private marker. - # Using ordinary dict.pop would expose the internal structures. - # So let's reinvent the wheel. - try: - value = self[key] - except KeyError: - if default is self.__marker: - raise - return default - else: - del self[key] - return value - - def discard(self, key): - try: - del self[key] - except KeyError: - pass - - def add(self, key, val): - """Adds a (name, value) pair, doesn't overwrite the value if it already - exists. - - >>> headers = HTTPHeaderDict(foo='bar') - >>> headers.add('Foo', 'baz') - >>> headers['foo'] - 'bar, baz' - """ - key_lower = key.lower() - new_vals = key, val - # Keep the common case aka no item present as fast as possible - vals = self._container.setdefault(key_lower, new_vals) - if new_vals is not vals: - # new_vals was not inserted, as there was a previous one - if isinstance(vals, list): - # If already several items got inserted, we have a list - vals.append(val) - else: - # vals should be a tuple then, i.e. only one item so far - # Need to convert the tuple to list for further extension - self._container[key_lower] = [vals[0], vals[1], val] - - def extend(self, *args, **kwargs): - """Generic import function for any type of header-like object. - Adapted version of MutableMapping.update in order to insert items - with self.add instead of self.__setitem__ - """ - if len(args) > 1: - raise TypeError("extend() takes at most 1 positional " - "arguments ({0} given)".format(len(args))) - other = args[0] if len(args) >= 1 else () - - if isinstance(other, HTTPHeaderDict): - for key, val in other.iteritems(): - self.add(key, val) - elif isinstance(other, Mapping): - for key in other: - self.add(key, other[key]) - elif hasattr(other, "keys"): - for key in other.keys(): - self.add(key, other[key]) - else: - for key, value in other: - self.add(key, value) - - for key, value in kwargs.items(): - self.add(key, value) - - def getlist(self, key): - """Returns a list of all the values for the named field. Returns an - empty list if the key doesn't exist.""" - try: - vals = self._container[key.lower()] - except KeyError: - return [] - else: - if isinstance(vals, tuple): - return [vals[1]] - else: - return vals[1:] - - # Backwards compatibility for httplib - getheaders = getlist - getallmatchingheaders = getlist - iget = getlist - - def __repr__(self): - return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) - - def _copy_from(self, other): - for key in other: - val = other.getlist(key) - if isinstance(val, list): - # Don't need to convert tuples - val = list(val) - self._container[key.lower()] = [key] + val - - def copy(self): - clone = type(self)() - clone._copy_from(self) - return clone - - def iteritems(self): - """Iterate over all header lines, including duplicate ones.""" - for key in self: - vals = self._container[key.lower()] - for val in vals[1:]: - yield vals[0], val - - def itermerged(self): - """Iterate over all headers, merging duplicate ones together.""" - for key in self: - val = self._container[key.lower()] - yield val[0], ', '.join(val[1:]) - - def items(self): - return list(self.iteritems()) - - @classmethod - def from_httplib(cls, message): # Python 2 - """Read headers from a Python 2 httplib message object.""" - # python2.7 does not expose a proper API for exporting multiheaders - # efficiently. This function re-reads raw lines from the message - # object and extracts the multiheaders properly. - headers = [] - - for line in message.headers: - if line.startswith((' ', '\t')): - key, value = headers[-1] - headers[-1] = (key, value + '\r\n' + line.rstrip()) - continue - - key, value = line.split(':', 1) - headers.append((key, value.strip())) - - return cls(headers) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/connection.py b/Contents/Libraries/Shared/requests/packages/urllib3/connection.py deleted file mode 100644 index 9f06c3958..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/connection.py +++ /dev/null @@ -1,369 +0,0 @@ -from __future__ import absolute_import -import datetime -import logging -import os -import sys -import socket -from socket import error as SocketError, timeout as SocketTimeout -import warnings -from .packages import six -from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection -from .packages.six.moves.http_client import HTTPException # noqa: F401 - -try: # Compiled with SSL? - import ssl - BaseSSLError = ssl.SSLError -except (ImportError, AttributeError): # Platform-specific: No SSL. - ssl = None - - class BaseSSLError(BaseException): - pass - - -try: # Python 3: - # Not a no-op, we're adding this to the namespace so it can be imported. - ConnectionError = ConnectionError -except NameError: # Python 2: - class ConnectionError(Exception): - pass - - -from .exceptions import ( - NewConnectionError, - ConnectTimeoutError, - SubjectAltNameWarning, - SystemTimeWarning, -) -from .packages.ssl_match_hostname import match_hostname, CertificateError - -from .util.ssl_ import ( - resolve_cert_reqs, - resolve_ssl_version, - assert_fingerprint, - create_urllib3_context, - ssl_wrap_socket -) - - -from .util import connection - -from ._collections import HTTPHeaderDict - -log = logging.getLogger(__name__) - -port_by_scheme = { - 'http': 80, - 'https': 443, -} - -# When updating RECENT_DATE, move it to -# within two years of the current date, and no -# earlier than 6 months ago. -RECENT_DATE = datetime.date(2016, 1, 1) - - -class DummyConnection(object): - """Used to detect a failed ConnectionCls import.""" - pass - - -class HTTPConnection(_HTTPConnection, object): - """ - Based on httplib.HTTPConnection but provides an extra constructor - backwards-compatibility layer between older and newer Pythons. - - Additional keyword parameters are used to configure attributes of the connection. - Accepted parameters include: - - - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` - - ``source_address``: Set the source address for the current connection. - - .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x - - - ``socket_options``: Set specific options on the underlying socket. If not specified, then - defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling - Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. - - For example, if you wish to enable TCP Keep Alive in addition to the defaults, - you might pass:: - - HTTPConnection.default_socket_options + [ - (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), - ] - - Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). - """ - - default_port = port_by_scheme['http'] - - #: Disable Nagle's algorithm by default. - #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` - default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] - - #: Whether this connection verifies the host's certificate. - is_verified = False - - def __init__(self, *args, **kw): - if six.PY3: # Python 3 - kw.pop('strict', None) - - # Pre-set source_address in case we have an older Python like 2.6. - self.source_address = kw.get('source_address') - - if sys.version_info < (2, 7): # Python 2.6 - # _HTTPConnection on Python 2.6 will balk at this keyword arg, but - # not newer versions. We can still use it when creating a - # connection though, so we pop it *after* we have saved it as - # self.source_address. - kw.pop('source_address', None) - - #: The socket options provided by the user. If no options are - #: provided, we use the default options. - self.socket_options = kw.pop('socket_options', self.default_socket_options) - - # Superclass also sets self.source_address in Python 2.7+. - _HTTPConnection.__init__(self, *args, **kw) - - def _new_conn(self): - """ Establish a socket connection and set nodelay settings on it. - - :return: New socket connection. - """ - extra_kw = {} - if self.source_address: - extra_kw['source_address'] = self.source_address - - if self.socket_options: - extra_kw['socket_options'] = self.socket_options - - try: - conn = connection.create_connection( - (self.host, self.port), self.timeout, **extra_kw) - - except SocketTimeout as e: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout)) - - except SocketError as e: - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e) - - return conn - - def _prepare_conn(self, conn): - self.sock = conn - # the _tunnel_host attribute was added in python 2.6.3 (via - # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do - # not have them. - if getattr(self, '_tunnel_host', None): - # TODO: Fix tunnel so it doesn't depend on self.sock state. - self._tunnel() - # Mark this connection as not reusable - self.auto_open = 0 - - def connect(self): - conn = self._new_conn() - self._prepare_conn(conn) - - def request_chunked(self, method, url, body=None, headers=None): - """ - Alternative to the common request method, which sends the - body with chunked encoding and not as one block - """ - headers = HTTPHeaderDict(headers if headers is not None else {}) - skip_accept_encoding = 'accept-encoding' in headers - skip_host = 'host' in headers - self.putrequest( - method, - url, - skip_accept_encoding=skip_accept_encoding, - skip_host=skip_host - ) - for header, value in headers.items(): - self.putheader(header, value) - if 'transfer-encoding' not in headers: - self.putheader('Transfer-Encoding', 'chunked') - self.endheaders() - - if body is not None: - stringish_types = six.string_types + (six.binary_type,) - if isinstance(body, stringish_types): - body = (body,) - for chunk in body: - if not chunk: - continue - if not isinstance(chunk, six.binary_type): - chunk = chunk.encode('utf8') - len_str = hex(len(chunk))[2:] - self.send(len_str.encode('utf-8')) - self.send(b'\r\n') - self.send(chunk) - self.send(b'\r\n') - - # After the if clause, to always have a closed body - self.send(b'0\r\n\r\n') - - -class HTTPSConnection(HTTPConnection): - default_port = port_by_scheme['https'] - - ssl_version = None - - def __init__(self, host, port=None, key_file=None, cert_file=None, - strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - ssl_context=None, **kw): - - HTTPConnection.__init__(self, host, port, strict=strict, - timeout=timeout, **kw) - - self.key_file = key_file - self.cert_file = cert_file - self.ssl_context = ssl_context - - # Required property for Google AppEngine 1.9.0 which otherwise causes - # HTTPS requests to go out as HTTP. (See Issue #356) - self._protocol = 'https' - - def connect(self): - conn = self._new_conn() - self._prepare_conn(conn) - - if self.ssl_context is None: - self.ssl_context = create_urllib3_context( - ssl_version=resolve_ssl_version(None), - cert_reqs=resolve_cert_reqs(None), - ) - - self.sock = ssl_wrap_socket( - sock=conn, - keyfile=self.key_file, - certfile=self.cert_file, - ssl_context=self.ssl_context, - ) - - -class VerifiedHTTPSConnection(HTTPSConnection): - """ - Based on httplib.HTTPSConnection but wraps the socket with - SSL certification. - """ - cert_reqs = None - ca_certs = None - ca_cert_dir = None - ssl_version = None - assert_fingerprint = None - - def set_cert(self, key_file=None, cert_file=None, - cert_reqs=None, ca_certs=None, - assert_hostname=None, assert_fingerprint=None, - ca_cert_dir=None): - """ - This method should only be called once, before the connection is used. - """ - # If cert_reqs is not provided, we can try to guess. If the user gave - # us a cert database, we assume they want to use it: otherwise, if - # they gave us an SSL Context object we should use whatever is set for - # it. - if cert_reqs is None: - if ca_certs or ca_cert_dir: - cert_reqs = 'CERT_REQUIRED' - elif self.ssl_context is not None: - cert_reqs = self.ssl_context.verify_mode - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - self.ca_certs = ca_certs and os.path.expanduser(ca_certs) - self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) - - def connect(self): - # Add certificate verification - conn = self._new_conn() - - hostname = self.host - if getattr(self, '_tunnel_host', None): - # _tunnel_host was added in Python 2.6.3 - # (See: http://hg.python.org/cpython/rev/0f57b30a152f) - - self.sock = conn - # Calls self._set_hostport(), so self.host is - # self._tunnel_host below. - self._tunnel() - # Mark this connection as not reusable - self.auto_open = 0 - - # Override the host with the one we're requesting data from. - hostname = self._tunnel_host - - is_time_off = datetime.date.today() < RECENT_DATE - if is_time_off: - warnings.warn(( - 'System time is way off (before {0}). This will probably ' - 'lead to SSL verification errors').format(RECENT_DATE), - SystemTimeWarning - ) - - # Wrap socket using verification with the root certs in - # trusted_root_certs - if self.ssl_context is None: - self.ssl_context = create_urllib3_context( - ssl_version=resolve_ssl_version(self.ssl_version), - cert_reqs=resolve_cert_reqs(self.cert_reqs), - ) - - context = self.ssl_context - context.verify_mode = resolve_cert_reqs(self.cert_reqs) - self.sock = ssl_wrap_socket( - sock=conn, - keyfile=self.key_file, - certfile=self.cert_file, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - server_hostname=hostname, - ssl_context=context) - - if self.assert_fingerprint: - assert_fingerprint(self.sock.getpeercert(binary_form=True), - self.assert_fingerprint) - elif context.verify_mode != ssl.CERT_NONE \ - and self.assert_hostname is not False: - cert = self.sock.getpeercert() - if not cert.get('subjectAltName', ()): - warnings.warn(( - 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' - '`commonName` for now. This feature is being removed by major browsers and ' - 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' - 'for details.)'.format(hostname)), - SubjectAltNameWarning - ) - _match_hostname(cert, self.assert_hostname or hostname) - - self.is_verified = ( - context.verify_mode == ssl.CERT_REQUIRED or - self.assert_fingerprint is not None - ) - - -def _match_hostname(cert, asserted_hostname): - try: - match_hostname(cert, asserted_hostname) - except CertificateError as e: - log.error( - 'Certificate did not match expected hostname: %s. ' - 'Certificate: %s', asserted_hostname, cert - ) - # Add cert to exception and reraise so client code can inspect - # the cert when catching the exception, if they want to - e._peer_cert = cert - raise - - -if ssl: - # Make a copy for testing. - UnverifiedHTTPSConnection = HTTPSConnection - HTTPSConnection = VerifiedHTTPSConnection -else: - HTTPSConnection = DummyConnection diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/connectionpool.py b/Contents/Libraries/Shared/requests/packages/urllib3/connectionpool.py deleted file mode 100644 index b4f1166a6..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/connectionpool.py +++ /dev/null @@ -1,899 +0,0 @@ -from __future__ import absolute_import -import errno -import logging -import sys -import warnings - -from socket import error as SocketError, timeout as SocketTimeout -import socket - - -from .exceptions import ( - ClosedPoolError, - ProtocolError, - EmptyPoolError, - HeaderParsingError, - HostChangedError, - LocationValueError, - MaxRetryError, - ProxyError, - ReadTimeoutError, - SSLError, - TimeoutError, - InsecureRequestWarning, - NewConnectionError, -) -from .packages.ssl_match_hostname import CertificateError -from .packages import six -from .packages.six.moves import queue -from .connection import ( - port_by_scheme, - DummyConnection, - HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, - HTTPException, BaseSSLError, -) -from .request import RequestMethods -from .response import HTTPResponse - -from .util.connection import is_connection_dropped -from .util.request import set_file_position -from .util.response import assert_header_parsing -from .util.retry import Retry -from .util.timeout import Timeout -from .util.url import get_host, Url - - -if six.PY2: - # Queue is imported for side effects on MS Windows - import Queue as _unused_module_Queue # noqa: F401 - -xrange = six.moves.xrange - -log = logging.getLogger(__name__) - -_Default = object() - - -# Pool objects -class ConnectionPool(object): - """ - Base class for all connection pools, such as - :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. - """ - - scheme = None - QueueCls = queue.LifoQueue - - def __init__(self, host, port=None): - if not host: - raise LocationValueError("No host specified.") - - self.host = _ipv6_host(host).lower() - self.port = port - - def __str__(self): - return '%s(host=%r, port=%r)' % (type(self).__name__, - self.host, self.port) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() - # Return False to re-raise any potential exceptions - return False - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - pass - - -# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 -_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK]) - - -class HTTPConnectionPool(ConnectionPool, RequestMethods): - """ - Thread-safe connection pool for one host. - - :param host: - Host used for this HTTP Connection (e.g. "localhost"), passed into - :class:`httplib.HTTPConnection`. - - :param port: - Port used for this HTTP Connection (None is equivalent to 80), passed - into :class:`httplib.HTTPConnection`. - - :param strict: - Causes BadStatusLine to be raised if the status line can't be parsed - as a valid HTTP/1.0 or 1.1 status line, passed into - :class:`httplib.HTTPConnection`. - - .. note:: - Only works in Python 2. This parameter is ignored in Python 3. - - :param timeout: - Socket timeout in seconds for each individual connection. This can - be a float or integer, which sets the timeout for the HTTP request, - or an instance of :class:`urllib3.util.Timeout` which gives you more - fine-grained control over request timeouts. After the constructor has - been parsed, this is always a `urllib3.util.Timeout` object. - - :param maxsize: - Number of connections to save that can be reused. More than 1 is useful - in multithreaded situations. If ``block`` is set to False, more - connections will be created but they will not be saved once they've - been used. - - :param block: - If set to True, no more than ``maxsize`` connections will be used at - a time. When no free connections are available, the call will block - until a connection has been released. This is a useful side effect for - particular multithreaded situations where one does not want to use more - than maxsize connections per host to prevent flooding. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param retries: - Retry configuration to use by default with requests in this pool. - - :param _proxy: - Parsed proxy URL, should not be used directly, instead, see - :class:`urllib3.connectionpool.ProxyManager`" - - :param _proxy_headers: - A dictionary with proxy headers, should not be used directly, - instead, see :class:`urllib3.connectionpool.ProxyManager`" - - :param \\**conn_kw: - Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, - :class:`urllib3.connection.HTTPSConnection` instances. - """ - - scheme = 'http' - ConnectionCls = HTTPConnection - ResponseCls = HTTPResponse - - def __init__(self, host, port=None, strict=False, - timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, - headers=None, retries=None, - _proxy=None, _proxy_headers=None, - **conn_kw): - ConnectionPool.__init__(self, host, port) - RequestMethods.__init__(self, headers) - - self.strict = strict - - if not isinstance(timeout, Timeout): - timeout = Timeout.from_float(timeout) - - if retries is None: - retries = Retry.DEFAULT - - self.timeout = timeout - self.retries = retries - - self.pool = self.QueueCls(maxsize) - self.block = block - - self.proxy = _proxy - self.proxy_headers = _proxy_headers or {} - - # Fill the queue up so that doing get() on it will block properly - for _ in xrange(maxsize): - self.pool.put(None) - - # These are mostly for testing and debugging purposes. - self.num_connections = 0 - self.num_requests = 0 - self.conn_kw = conn_kw - - if self.proxy: - # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. - # We cannot know if the user has added default socket options, so we cannot replace the - # list. - self.conn_kw.setdefault('socket_options', []) - - def _new_conn(self): - """ - Return a fresh :class:`HTTPConnection`. - """ - self.num_connections += 1 - log.debug("Starting new HTTP connection (%d): %s", - self.num_connections, self.host) - - conn = self.ConnectionCls(host=self.host, port=self.port, - timeout=self.timeout.connect_timeout, - strict=self.strict, **self.conn_kw) - return conn - - def _get_conn(self, timeout=None): - """ - Get a connection. Will return a pooled connection if one is available. - - If no connections are available and :prop:`.block` is ``False``, then a - fresh connection is returned. - - :param timeout: - Seconds to wait before giving up and raising - :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and - :prop:`.block` is ``True``. - """ - conn = None - try: - conn = self.pool.get(block=self.block, timeout=timeout) - - except AttributeError: # self.pool is None - raise ClosedPoolError(self, "Pool is closed.") - - except queue.Empty: - if self.block: - raise EmptyPoolError(self, - "Pool reached maximum size and no more " - "connections are allowed.") - pass # Oh well, we'll create a new connection then - - # If this is a persistent connection, check if it got disconnected - if conn and is_connection_dropped(conn): - log.debug("Resetting dropped connection: %s", self.host) - conn.close() - if getattr(conn, 'auto_open', 1) == 0: - # This is a proxied connection that has been mutated by - # httplib._tunnel() and cannot be reused (since it would - # attempt to bypass the proxy) - conn = None - - return conn or self._new_conn() - - def _put_conn(self, conn): - """ - Put a connection back into the pool. - - :param conn: - Connection object for the current host and port as returned by - :meth:`._new_conn` or :meth:`._get_conn`. - - If the pool is already full, the connection is closed and discarded - because we exceeded maxsize. If connections are discarded frequently, - then maxsize should be increased. - - If the pool is closed, then the connection will be closed and discarded. - """ - try: - self.pool.put(conn, block=False) - return # Everything is dandy, done. - except AttributeError: - # self.pool is None. - pass - except queue.Full: - # This should never happen if self.block == True - log.warning( - "Connection pool is full, discarding connection: %s", - self.host) - - # Connection never got put back into the pool, close it. - if conn: - conn.close() - - def _validate_conn(self, conn): - """ - Called right before a request is made, after the socket is created. - """ - pass - - def _prepare_proxy(self, conn): - # Nothing to do for HTTP connections. - pass - - def _get_timeout(self, timeout): - """ Helper that always returns a :class:`urllib3.util.Timeout` """ - if timeout is _Default: - return self.timeout.clone() - - if isinstance(timeout, Timeout): - return timeout.clone() - else: - # User passed us an int/float. This is for backwards compatibility, - # can be removed later - return Timeout.from_float(timeout) - - def _raise_timeout(self, err, url, timeout_value): - """Is the error actually a timeout? Will raise a ReadTimeout or pass""" - - if isinstance(err, SocketTimeout): - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - # See the above comment about EAGAIN in Python 3. In Python 2 we have - # to specifically catch it and throw the timeout error - if hasattr(err, 'errno') and err.errno in _blocking_errnos: - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - # Catch possible read timeouts thrown as SSL errors. If not the - # case, rethrow the original. We need to do this because of: - # http://bugs.python.org/issue10272 - if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python 2.6 - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - def _make_request(self, conn, method, url, timeout=_Default, chunked=False, - **httplib_request_kw): - """ - Perform a request on a given urllib connection object taken from our - pool. - - :param conn: - a connection from one of our connection pools - - :param timeout: - Socket timeout in seconds for the request. This can be a - float or integer, which will set the same timeout value for - the socket connect and the socket read, or an instance of - :class:`urllib3.util.Timeout`, which gives you more fine-grained - control over your timeouts. - """ - self.num_requests += 1 - - timeout_obj = self._get_timeout(timeout) - timeout_obj.start_connect() - conn.timeout = timeout_obj.connect_timeout - - # Trigger any extra validation we need to do. - try: - self._validate_conn(conn) - except (SocketTimeout, BaseSSLError) as e: - # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. - self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) - raise - - # conn.request() calls httplib.*.request, not the method in - # urllib3.request. It also calls makefile (recv) on the socket. - if chunked: - conn.request_chunked(method, url, **httplib_request_kw) - else: - conn.request(method, url, **httplib_request_kw) - - # Reset the timeout for the recv() on the socket - read_timeout = timeout_obj.read_timeout - - # App Engine doesn't have a sock attr - if getattr(conn, 'sock', None): - # In Python 3 socket.py will catch EAGAIN and return None when you - # try and read into the file pointer created by http.client, which - # instead raises a BadStatusLine exception. Instead of catching - # the exception and assuming all BadStatusLine exceptions are read - # timeouts, check for a zero timeout before making the request. - if read_timeout == 0: - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % read_timeout) - if read_timeout is Timeout.DEFAULT_TIMEOUT: - conn.sock.settimeout(socket.getdefaulttimeout()) - else: # None or a value - conn.sock.settimeout(read_timeout) - - # Receive the response from the server - try: - try: # Python 2.7, use buffering of HTTP responses - httplib_response = conn.getresponse(buffering=True) - except TypeError: # Python 2.6 and older, Python 3 - try: - httplib_response = conn.getresponse() - except Exception as e: - # Remove the TypeError from the exception chain in Python 3; - # otherwise it looks like a programming error was the cause. - six.raise_from(e, None) - except (SocketTimeout, BaseSSLError, SocketError) as e: - self._raise_timeout(err=e, url=url, timeout_value=read_timeout) - raise - - # AppEngine doesn't have a version attr. - http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') - log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port, - method, url, http_version, httplib_response.status, - httplib_response.length) - - try: - assert_header_parsing(httplib_response.msg) - except HeaderParsingError as hpe: # Platform-specific: Python 3 - log.warning( - 'Failed to parse headers (url=%s): %s', - self._absolute_url(url), hpe, exc_info=True) - - return httplib_response - - def _absolute_url(self, path): - return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - # Disable access to the pool - old_pool, self.pool = self.pool, None - - try: - while True: - conn = old_pool.get(block=False) - if conn: - conn.close() - - except queue.Empty: - pass # Done. - - def is_same_host(self, url): - """ - Check if the given ``url`` is a member of the same host as this - connection pool. - """ - if url.startswith('/'): - return True - - # TODO: Add optional support for socket.gethostbyname checking. - scheme, host, port = get_host(url) - - host = _ipv6_host(host).lower() - - # Use explicit default port for comparison when none is given - if self.port and not port: - port = port_by_scheme.get(scheme) - elif not self.port and port == port_by_scheme.get(scheme): - port = None - - return (scheme, host, port) == (self.scheme, self.host, self.port) - - def urlopen(self, method, url, body=None, headers=None, retries=None, - redirect=True, assert_same_host=True, timeout=_Default, - pool_timeout=None, release_conn=None, chunked=False, - body_pos=None, **response_kw): - """ - Get a connection from the pool and perform an HTTP request. This is the - lowest level call for making a request, so you'll need to specify all - the raw details. - - .. note:: - - More commonly, it's appropriate to use a convenience method provided - by :class:`.RequestMethods`, such as :meth:`request`. - - .. note:: - - `release_conn` will only behave as expected if - `preload_content=False` because we want to make - `preload_content=False` the default behaviour someday soon without - breaking backwards compatibility. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param body: - Data to send in the request body (useful for creating - POST requests, see HTTPConnectionPool.post_url for - more convenience). - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - - :param retries: - Configure the number of retries to allow before raising a - :class:`~urllib3.exceptions.MaxRetryError` exception. - - Pass ``None`` to retry until you receive a response. Pass a - :class:`~urllib3.util.retry.Retry` object for fine-grained control - over different types of retries. - Pass an integer number to retry connection errors that many times, - but no other types of errors. Pass zero to never retry. - - If ``False``, then retries are disabled and any exception is raised - immediately. Also, instead of raising a MaxRetryError on redirects, - the redirect response will be returned. - - :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. - - :param redirect: - If True, automatically handle redirects (status codes 301, 302, - 303, 307, 308). Each redirect counts as a retry. Disabling retries - will disable redirect, too. - - :param assert_same_host: - If ``True``, will make sure that the host of the pool requests is - consistent else will raise HostChangedError. When False, you can - use the pool on an HTTP proxy and request foreign hosts. - - :param timeout: - If specified, overrides the default timeout for this one - request. It may be a float (in seconds) or an instance of - :class:`urllib3.util.Timeout`. - - :param pool_timeout: - If set and the pool is set to block=True, then this method will - block for ``pool_timeout`` seconds and raise EmptyPoolError if no - connection is available within the time period. - - :param release_conn: - If False, then the urlopen call will not release the connection - back into the pool once a response is received (but will release if - you read the entire contents of the response such as when - `preload_content=True`). This is useful if you're not preloading - the response's content immediately. You will need to call - ``r.release_conn()`` on the response ``r`` to return the connection - back into the pool. If None, it takes the value of - ``response_kw.get('preload_content', True)``. - - :param chunked: - If True, urllib3 will send the body using chunked transfer - encoding. Otherwise, urllib3 will send the body using the standard - content-length form. Defaults to False. - - :param int body_pos: - Position to seek to in file-like body in the event of a retry or - redirect. Typically this won't need to be set because urllib3 will - auto-populate the value when needed. - - :param \\**response_kw: - Additional parameters are passed to - :meth:`urllib3.response.HTTPResponse.from_httplib` - """ - if headers is None: - headers = self.headers - - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect, default=self.retries) - - if release_conn is None: - release_conn = response_kw.get('preload_content', True) - - # Check host - if assert_same_host and not self.is_same_host(url): - raise HostChangedError(self, url, retries) - - conn = None - - # Track whether `conn` needs to be released before - # returning/raising/recursing. Update this variable if necessary, and - # leave `release_conn` constant throughout the function. That way, if - # the function recurses, the original value of `release_conn` will be - # passed down into the recursive call, and its value will be respected. - # - # See issue #651 [1] for details. - # - # [1] - release_this_conn = release_conn - - # Merge the proxy headers. Only do this in HTTP. We have to copy the - # headers dict so we can safely change it without those changes being - # reflected in anyone else's copy. - if self.scheme == 'http': - headers = headers.copy() - headers.update(self.proxy_headers) - - # Must keep the exception bound to a separate variable or else Python 3 - # complains about UnboundLocalError. - err = None - - # Keep track of whether we cleanly exited the except block. This - # ensures we do proper cleanup in finally. - clean_exit = False - - # Rewind body position, if needed. Record current position - # for future rewinds in the event of a redirect/retry. - body_pos = set_file_position(body, body_pos) - - try: - # Request a connection from the queue. - timeout_obj = self._get_timeout(timeout) - conn = self._get_conn(timeout=pool_timeout) - - conn.timeout = timeout_obj.connect_timeout - - is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) - if is_new_proxy_conn: - self._prepare_proxy(conn) - - # Make the request on the httplib connection object. - httplib_response = self._make_request(conn, method, url, - timeout=timeout_obj, - body=body, headers=headers, - chunked=chunked) - - # If we're going to release the connection in ``finally:``, then - # the response doesn't need to know about the connection. Otherwise - # it will also try to release it and we'll have a double-release - # mess. - response_conn = conn if not release_conn else None - - # Pass method to Response for length checking - response_kw['request_method'] = method - - # Import httplib's response into our own wrapper object - response = self.ResponseCls.from_httplib(httplib_response, - pool=self, - connection=response_conn, - retries=retries, - **response_kw) - - # Everything went great! - clean_exit = True - - except queue.Empty: - # Timed out by queue. - raise EmptyPoolError(self, "No pool connections are available.") - - except (BaseSSLError, CertificateError) as e: - # Close the connection. If a connection is reused on which there - # was a Certificate error, the next request will certainly raise - # another Certificate error. - clean_exit = False - raise SSLError(e) - - except SSLError: - # Treat SSLError separately from BaseSSLError to preserve - # traceback. - clean_exit = False - raise - - except (TimeoutError, HTTPException, SocketError, ProtocolError) as e: - # Discard the connection for these exceptions. It will be - # be replaced during the next _get_conn() call. - clean_exit = False - - if isinstance(e, (SocketError, NewConnectionError)) and self.proxy: - e = ProxyError('Cannot connect to proxy.', e) - elif isinstance(e, (SocketError, HTTPException)): - e = ProtocolError('Connection aborted.', e) - - retries = retries.increment(method, url, error=e, _pool=self, - _stacktrace=sys.exc_info()[2]) - retries.sleep() - - # Keep track of the error for the retry warning. - err = e - - finally: - if not clean_exit: - # We hit some kind of exception, handled or otherwise. We need - # to throw the connection away unless explicitly told not to. - # Close the connection, set the variable to None, and make sure - # we put the None back in the pool to avoid leaking it. - conn = conn and conn.close() - release_this_conn = True - - if release_this_conn: - # Put the connection back to be reused. If the connection is - # expired then it will be None, which will get replaced with a - # fresh connection during _get_conn. - self._put_conn(conn) - - if not conn: - # Try again - log.warning("Retrying (%r) after connection " - "broken by '%r': %s", retries, err, url) - return self.urlopen(method, url, body, headers, retries, - redirect, assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, body_pos=body_pos, - **response_kw) - - # Handle redirect? - redirect_location = redirect and response.get_redirect_location() - if redirect_location: - if response.status == 303: - method = 'GET' - - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_redirect: - # Release the connection for this response, since we're not - # returning it to be released manually. - response.release_conn() - raise - return response - - retries.sleep_for_retry(response) - log.debug("Redirecting %s -> %s", url, redirect_location) - return self.urlopen( - method, redirect_location, body, headers, - retries=retries, redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, body_pos=body_pos, - **response_kw) - - # Check if we should retry the HTTP response. - has_retry_after = bool(response.getheader('Retry-After')) - if retries.is_retry(method, response.status, has_retry_after): - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_status: - # Release the connection for this response, since we're not - # returning it to be released manually. - response.release_conn() - raise - return response - retries.sleep(response) - log.debug("Retry: %s", url) - return self.urlopen( - method, url, body, headers, - retries=retries, redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, - body_pos=body_pos, **response_kw) - - return response - - -class HTTPSConnectionPool(HTTPConnectionPool): - """ - Same as :class:`.HTTPConnectionPool`, but HTTPS. - - When Python is compiled with the :mod:`ssl` module, then - :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, - instead of :class:`.HTTPSConnection`. - - :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, - ``assert_hostname`` and ``host`` in this order to verify connections. - If ``assert_hostname`` is False, no verification is done. - - The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, - ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is - available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade - the connection socket into an SSL socket. - """ - - scheme = 'https' - ConnectionCls = HTTPSConnection - - def __init__(self, host, port=None, - strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, - block=False, headers=None, retries=None, - _proxy=None, _proxy_headers=None, - key_file=None, cert_file=None, cert_reqs=None, - ca_certs=None, ssl_version=None, - assert_hostname=None, assert_fingerprint=None, - ca_cert_dir=None, **conn_kw): - - HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, - block, headers, retries, _proxy, _proxy_headers, - **conn_kw) - - if ca_certs and cert_reqs is None: - cert_reqs = 'CERT_REQUIRED' - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.ca_certs = ca_certs - self.ca_cert_dir = ca_cert_dir - self.ssl_version = ssl_version - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - - def _prepare_conn(self, conn): - """ - Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` - and establish the tunnel if proxy is used. - """ - - if isinstance(conn, VerifiedHTTPSConnection): - conn.set_cert(key_file=self.key_file, - cert_file=self.cert_file, - cert_reqs=self.cert_reqs, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - assert_hostname=self.assert_hostname, - assert_fingerprint=self.assert_fingerprint) - conn.ssl_version = self.ssl_version - return conn - - def _prepare_proxy(self, conn): - """ - Establish tunnel connection early, because otherwise httplib - would improperly set Host: header to proxy's IP:port. - """ - # Python 2.7+ - try: - set_tunnel = conn.set_tunnel - except AttributeError: # Platform-specific: Python 2.6 - set_tunnel = conn._set_tunnel - - if sys.version_info <= (2, 6, 4) and not self.proxy_headers: # Python 2.6.4 and older - set_tunnel(self.host, self.port) - else: - set_tunnel(self.host, self.port, self.proxy_headers) - - conn.connect() - - def _new_conn(self): - """ - Return a fresh :class:`httplib.HTTPSConnection`. - """ - self.num_connections += 1 - log.debug("Starting new HTTPS connection (%d): %s", - self.num_connections, self.host) - - if not self.ConnectionCls or self.ConnectionCls is DummyConnection: - raise SSLError("Can't connect to HTTPS URL because the SSL " - "module is not available.") - - actual_host = self.host - actual_port = self.port - if self.proxy is not None: - actual_host = self.proxy.host - actual_port = self.proxy.port - - conn = self.ConnectionCls(host=actual_host, port=actual_port, - timeout=self.timeout.connect_timeout, - strict=self.strict, **self.conn_kw) - - return self._prepare_conn(conn) - - def _validate_conn(self, conn): - """ - Called right before a request is made, after the socket is created. - """ - super(HTTPSConnectionPool, self)._validate_conn(conn) - - # Force connect early to allow us to validate the connection. - if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` - conn.connect() - - if not conn.is_verified: - warnings.warn(( - 'Unverified HTTPS request is being made. ' - 'Adding certificate verification is strongly advised. See: ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings'), - InsecureRequestWarning) - - -def connection_from_url(url, **kw): - """ - Given a url, return an :class:`.ConnectionPool` instance of its host. - - This is a shortcut for not having to parse out the scheme, host, and port - of the url before creating an :class:`.ConnectionPool` instance. - - :param url: - Absolute URL string that must include the scheme. Port is optional. - - :param \\**kw: - Passes additional parameters to the constructor of the appropriate - :class:`.ConnectionPool`. Useful for specifying things like - timeout, maxsize, headers, etc. - - Example:: - - >>> conn = connection_from_url('http://google.com/') - >>> r = conn.request('GET', '/') - """ - scheme, host, port = get_host(url) - port = port or port_by_scheme.get(scheme, 80) - if scheme == 'https': - return HTTPSConnectionPool(host, port=port, **kw) - else: - return HTTPConnectionPool(host, port=port, **kw) - - -def _ipv6_host(host): - """ - Process IPv6 address literals - """ - - # httplib doesn't like it when we include brackets in IPv6 addresses - # Specifically, if we include brackets but also pass the port then - # httplib crazily doubles up the square brackets on the Host header. - # Instead, we need to make sure we never pass ``None`` as the port. - # However, for backward compatibility reasons we can't actually - # *assert* that. See http://bugs.python.org/issue28539 - # - # Also if an IPv6 address literal has a zone identifier, the - # percent sign might be URIencoded, convert it back into ASCII - if host.startswith('[') and host.endswith(']'): - host = host.replace('%25', '%').strip('[]') - return host diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/__init__.py b/Contents/Libraries/Shared/requests/packages/urllib3/contrib/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/appengine.py b/Contents/Libraries/Shared/requests/packages/urllib3/contrib/appengine.py deleted file mode 100644 index 814b0222d..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/appengine.py +++ /dev/null @@ -1,296 +0,0 @@ -""" -This module provides a pool manager that uses Google App Engine's -`URLFetch Service `_. - -Example usage:: - - from urllib3 import PoolManager - from urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox - - if is_appengine_sandbox(): - # AppEngineManager uses AppEngine's URLFetch API behind the scenes - http = AppEngineManager() - else: - # PoolManager uses a socket-level API behind the scenes - http = PoolManager() - - r = http.request('GET', 'https://google.com/') - -There are `limitations `_ to the URLFetch service and it may not be -the best choice for your application. There are three options for using -urllib3 on Google App Engine: - -1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is - cost-effective in many circumstances as long as your usage is within the - limitations. -2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. - Sockets also have `limitations and restrictions - `_ and have a lower free quota than URLFetch. - To use sockets, be sure to specify the following in your ``app.yaml``:: - - env_variables: - GAE_USE_SOCKETS_HTTPLIB : 'true' - -3. If you are using `App Engine Flexible -`_, you can use the standard -:class:`PoolManager` without any configuration or special environment variables. -""" - -from __future__ import absolute_import -import logging -import os -import warnings -from ..packages.six.moves.urllib.parse import urljoin - -from ..exceptions import ( - HTTPError, - HTTPWarning, - MaxRetryError, - ProtocolError, - TimeoutError, - SSLError -) - -from ..packages.six import BytesIO -from ..request import RequestMethods -from ..response import HTTPResponse -from ..util.timeout import Timeout -from ..util.retry import Retry - -try: - from google.appengine.api import urlfetch -except ImportError: - urlfetch = None - - -log = logging.getLogger(__name__) - - -class AppEnginePlatformWarning(HTTPWarning): - pass - - -class AppEnginePlatformError(HTTPError): - pass - - -class AppEngineManager(RequestMethods): - """ - Connection manager for Google App Engine sandbox applications. - - This manager uses the URLFetch service directly instead of using the - emulated httplib, and is subject to URLFetch limitations as described in - the App Engine documentation `here - `_. - - Notably it will raise an :class:`AppEnginePlatformError` if: - * URLFetch is not available. - * If you attempt to use this on App Engine Flexible, as full socket - support is available. - * If a request size is more than 10 megabytes. - * If a response size is more than 32 megabtyes. - * If you use an unsupported request method such as OPTIONS. - - Beyond those cases, it will raise normal urllib3 errors. - """ - - def __init__(self, headers=None, retries=None, validate_certificate=True, - urlfetch_retries=True): - if not urlfetch: - raise AppEnginePlatformError( - "URLFetch is not available in this environment.") - - if is_prod_appengine_mvms(): - raise AppEnginePlatformError( - "Use normal urllib3.PoolManager instead of AppEngineManager" - "on Managed VMs, as using URLFetch is not necessary in " - "this environment.") - - warnings.warn( - "urllib3 is using URLFetch on Google App Engine sandbox instead " - "of sockets. To use sockets directly instead of URLFetch see " - "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", - AppEnginePlatformWarning) - - RequestMethods.__init__(self, headers) - self.validate_certificate = validate_certificate - self.urlfetch_retries = urlfetch_retries - - self.retries = retries or Retry.DEFAULT - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - # Return False to re-raise any potential exceptions - return False - - def urlopen(self, method, url, body=None, headers=None, - retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, - **response_kw): - - retries = self._get_retries(retries, redirect) - - try: - follow_redirects = ( - redirect and - retries.redirect != 0 and - retries.total) - response = urlfetch.fetch( - url, - payload=body, - method=method, - headers=headers or {}, - allow_truncated=False, - follow_redirects=self.urlfetch_retries and follow_redirects, - deadline=self._get_absolute_timeout(timeout), - validate_certificate=self.validate_certificate, - ) - except urlfetch.DeadlineExceededError as e: - raise TimeoutError(self, e) - - except urlfetch.InvalidURLError as e: - if 'too large' in str(e): - raise AppEnginePlatformError( - "URLFetch request too large, URLFetch only " - "supports requests up to 10mb in size.", e) - raise ProtocolError(e) - - except urlfetch.DownloadError as e: - if 'Too many redirects' in str(e): - raise MaxRetryError(self, url, reason=e) - raise ProtocolError(e) - - except urlfetch.ResponseTooLargeError as e: - raise AppEnginePlatformError( - "URLFetch response too large, URLFetch only supports" - "responses up to 32mb in size.", e) - - except urlfetch.SSLCertificateError as e: - raise SSLError(e) - - except urlfetch.InvalidMethodError as e: - raise AppEnginePlatformError( - "URLFetch does not support method: %s" % method, e) - - http_response = self._urlfetch_response_to_http_response( - response, retries=retries, **response_kw) - - # Handle redirect? - redirect_location = redirect and http_response.get_redirect_location() - if redirect_location: - # Check for redirect response - if (self.urlfetch_retries and retries.raise_on_redirect): - raise MaxRetryError(self, url, "too many redirects") - else: - if http_response.status == 303: - method = 'GET' - - try: - retries = retries.increment(method, url, response=http_response, _pool=self) - except MaxRetryError: - if retries.raise_on_redirect: - raise MaxRetryError(self, url, "too many redirects") - return http_response - - retries.sleep_for_retry(http_response) - log.debug("Redirecting %s -> %s", url, redirect_location) - redirect_url = urljoin(url, redirect_location) - return self.urlopen( - method, redirect_url, body, headers, - retries=retries, redirect=redirect, - timeout=timeout, **response_kw) - - # Check if we should retry the HTTP response. - has_retry_after = bool(http_response.getheader('Retry-After')) - if retries.is_retry(method, http_response.status, has_retry_after): - retries = retries.increment( - method, url, response=http_response, _pool=self) - log.debug("Retry: %s", url) - retries.sleep(http_response) - return self.urlopen( - method, url, - body=body, headers=headers, - retries=retries, redirect=redirect, - timeout=timeout, **response_kw) - - return http_response - - def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): - - if is_prod_appengine(): - # Production GAE handles deflate encoding automatically, but does - # not remove the encoding header. - content_encoding = urlfetch_resp.headers.get('content-encoding') - - if content_encoding == 'deflate': - del urlfetch_resp.headers['content-encoding'] - - transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') - # We have a full response's content, - # so let's make sure we don't report ourselves as chunked data. - if transfer_encoding == 'chunked': - encodings = transfer_encoding.split(",") - encodings.remove('chunked') - urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) - - return HTTPResponse( - # In order for decoding to work, we must present the content as - # a file-like object. - body=BytesIO(urlfetch_resp.content), - headers=urlfetch_resp.headers, - status=urlfetch_resp.status_code, - **response_kw - ) - - def _get_absolute_timeout(self, timeout): - if timeout is Timeout.DEFAULT_TIMEOUT: - return None # Defer to URLFetch's default. - if isinstance(timeout, Timeout): - if timeout._read is not None or timeout._connect is not None: - warnings.warn( - "URLFetch does not support granular timeout settings, " - "reverting to total or default URLFetch timeout.", - AppEnginePlatformWarning) - return timeout.total - return timeout - - def _get_retries(self, retries, redirect): - if not isinstance(retries, Retry): - retries = Retry.from_int( - retries, redirect=redirect, default=self.retries) - - if retries.connect or retries.read or retries.redirect: - warnings.warn( - "URLFetch only supports total retries and does not " - "recognize connect, read, or redirect retry parameters.", - AppEnginePlatformWarning) - - return retries - - -def is_appengine(): - return (is_local_appengine() or - is_prod_appengine() or - is_prod_appengine_mvms()) - - -def is_appengine_sandbox(): - return is_appengine() and not is_prod_appengine_mvms() - - -def is_local_appengine(): - return ('APPENGINE_RUNTIME' in os.environ and - 'Development/' in os.environ['SERVER_SOFTWARE']) - - -def is_prod_appengine(): - return ('APPENGINE_RUNTIME' in os.environ and - 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and - not is_prod_appengine_mvms()) - - -def is_prod_appengine_mvms(): - return os.environ.get('GAE_VM', False) == 'true' diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/ntlmpool.py b/Contents/Libraries/Shared/requests/packages/urllib3/contrib/ntlmpool.py deleted file mode 100644 index 642e99ed2..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/ntlmpool.py +++ /dev/null @@ -1,112 +0,0 @@ -""" -NTLM authenticating pool, contributed by erikcederstran - -Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 -""" -from __future__ import absolute_import - -from logging import getLogger -from ntlm import ntlm - -from .. import HTTPSConnectionPool -from ..packages.six.moves.http_client import HTTPSConnection - - -log = getLogger(__name__) - - -class NTLMConnectionPool(HTTPSConnectionPool): - """ - Implements an NTLM authentication version of an urllib3 connection pool - """ - - scheme = 'https' - - def __init__(self, user, pw, authurl, *args, **kwargs): - """ - authurl is a random URL on the server that is protected by NTLM. - user is the Windows user, probably in the DOMAIN\\username format. - pw is the password for the user. - """ - super(NTLMConnectionPool, self).__init__(*args, **kwargs) - self.authurl = authurl - self.rawuser = user - user_parts = user.split('\\', 1) - self.domain = user_parts[0].upper() - self.user = user_parts[1] - self.pw = pw - - def _new_conn(self): - # Performs the NTLM handshake that secures the connection. The socket - # must be kept open while requests are performed. - self.num_connections += 1 - log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', - self.num_connections, self.host, self.authurl) - - headers = {} - headers['Connection'] = 'Keep-Alive' - req_header = 'Authorization' - resp_header = 'www-authenticate' - - conn = HTTPSConnection(host=self.host, port=self.port) - - # Send negotiation message - headers[req_header] = ( - 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) - log.debug('Request headers: %s', headers) - conn.request('GET', self.authurl, None, headers) - res = conn.getresponse() - reshdr = dict(res.getheaders()) - log.debug('Response status: %s %s', res.status, res.reason) - log.debug('Response headers: %s', reshdr) - log.debug('Response data: %s [...]', res.read(100)) - - # Remove the reference to the socket, so that it can not be closed by - # the response object (we want to keep the socket open) - res.fp = None - - # Server should respond with a challenge message - auth_header_values = reshdr[resp_header].split(', ') - auth_header_value = None - for s in auth_header_values: - if s[:5] == 'NTLM ': - auth_header_value = s[5:] - if auth_header_value is None: - raise Exception('Unexpected %s response header: %s' % - (resp_header, reshdr[resp_header])) - - # Send authentication message - ServerChallenge, NegotiateFlags = \ - ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) - auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, - self.user, - self.domain, - self.pw, - NegotiateFlags) - headers[req_header] = 'NTLM %s' % auth_msg - log.debug('Request headers: %s', headers) - conn.request('GET', self.authurl, None, headers) - res = conn.getresponse() - log.debug('Response status: %s %s', res.status, res.reason) - log.debug('Response headers: %s', dict(res.getheaders())) - log.debug('Response data: %s [...]', res.read()[:100]) - if res.status != 200: - if res.status == 401: - raise Exception('Server rejected request: wrong ' - 'username or password') - raise Exception('Wrong server response: %s %s' % - (res.status, res.reason)) - - res.fp = None - log.debug('Connection established') - return conn - - def urlopen(self, method, url, body=None, headers=None, retries=3, - redirect=True, assert_same_host=True): - if headers is None: - headers = {} - headers['Connection'] = 'Keep-Alive' - return super(NTLMConnectionPool, self).urlopen(method, url, body, - headers, retries, - redirect, - assert_same_host) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/pyopenssl.py b/Contents/Libraries/Shared/requests/packages/urllib3/contrib/pyopenssl.py deleted file mode 100644 index eb4d4765b..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/pyopenssl.py +++ /dev/null @@ -1,450 +0,0 @@ -""" -SSL with SNI_-support for Python 2. Follow these instructions if you would -like to verify SSL certificates in Python 2. Note, the default libraries do -*not* do certificate checking; you need to do additional work to validate -certificates yourself. - -This needs the following packages installed: - -* pyOpenSSL (tested with 16.0.0) -* cryptography (minimum 1.3.4, from pyopenssl) -* idna (minimum 2.0, from cryptography) - -However, pyopenssl depends on cryptography, which depends on idna, so while we -use all three directly here we end up having relatively few packages required. - -You can install them with the following command: - - pip install pyopenssl cryptography idna - -To activate certificate checking, call -:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code -before you begin making HTTP requests. This can be done in a ``sitecustomize`` -module, or at any other time before your application begins using ``urllib3``, -like this:: - - try: - import urllib3.contrib.pyopenssl - urllib3.contrib.pyopenssl.inject_into_urllib3() - except ImportError: - pass - -Now you can use :mod:`urllib3` as you normally would, and it will support SNI -when the required modules are installed. - -Activating this module also has the positive side effect of disabling SSL/TLS -compression in Python 2 (see `CRIME attack`_). - -If you want to configure the default list of supported cipher suites, you can -set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. - -.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication -.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) -""" -from __future__ import absolute_import - -import OpenSSL.SSL -from cryptography import x509 -from cryptography.hazmat.backends.openssl import backend as openssl_backend -from cryptography.hazmat.backends.openssl.x509 import _Certificate - -from socket import timeout, error as SocketError -from io import BytesIO - -try: # Platform-specific: Python 2 - from socket import _fileobject -except ImportError: # Platform-specific: Python 3 - _fileobject = None - from ..packages.backports.makefile import backport_makefile - -import logging -import ssl -import six -import sys - -from .. import util - -__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] - -# SNI always works. -HAS_SNI = True - -# Map from urllib3 to PyOpenSSL compatible parameter-values. -_openssl_versions = { - ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, - ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, -} - -if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): - _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD - -if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): - _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD - -try: - _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) -except AttributeError: - pass - -_stdlib_to_openssl_verify = { - ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, - ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, - ssl.CERT_REQUIRED: - OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, -} -_openssl_to_stdlib_verify = dict( - (v, k) for k, v in _stdlib_to_openssl_verify.items() -) - -# OpenSSL will only write 16K at a time -SSL_WRITE_BLOCKSIZE = 16384 - -orig_util_HAS_SNI = util.HAS_SNI -orig_util_SSLContext = util.ssl_.SSLContext - - -log = logging.getLogger(__name__) - - -def inject_into_urllib3(): - 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' - - _validate_dependencies_met() - - util.ssl_.SSLContext = PyOpenSSLContext - util.HAS_SNI = HAS_SNI - util.ssl_.HAS_SNI = HAS_SNI - util.IS_PYOPENSSL = True - util.ssl_.IS_PYOPENSSL = True - - -def extract_from_urllib3(): - 'Undo monkey-patching by :func:`inject_into_urllib3`.' - - util.ssl_.SSLContext = orig_util_SSLContext - util.HAS_SNI = orig_util_HAS_SNI - util.ssl_.HAS_SNI = orig_util_HAS_SNI - util.IS_PYOPENSSL = False - util.ssl_.IS_PYOPENSSL = False - - -def _validate_dependencies_met(): - """ - Verifies that PyOpenSSL's package-level dependencies have been met. - Throws `ImportError` if they are not met. - """ - # Method added in `cryptography==1.1`; not available in older versions - from cryptography.x509.extensions import Extensions - if getattr(Extensions, "get_extension_for_class", None) is None: - raise ImportError("'cryptography' module missing required functionality. " - "Try upgrading to v1.3.4 or newer.") - - # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 - # attribute is only present on those versions. - from OpenSSL.crypto import X509 - x509 = X509() - if getattr(x509, "_x509", None) is None: - raise ImportError("'pyOpenSSL' module missing required functionality. " - "Try upgrading to v0.14 or newer.") - - -def _dnsname_to_stdlib(name): - """ - Converts a dNSName SubjectAlternativeName field to the form used by the - standard library on the given Python version. - - Cryptography produces a dNSName as a unicode string that was idna-decoded - from ASCII bytes. We need to idna-encode that string to get it back, and - then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib - uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). - """ - def idna_encode(name): - """ - Borrowed wholesale from the Python Cryptography Project. It turns out - that we can't just safely call `idna.encode`: it can explode for - wildcard names. This avoids that problem. - """ - import idna - - for prefix in [u'*.', u'.']: - if name.startswith(prefix): - name = name[len(prefix):] - return prefix.encode('ascii') + idna.encode(name) - return idna.encode(name) - - name = idna_encode(name) - if sys.version_info >= (3, 0): - name = name.decode('utf-8') - return name - - -def get_subj_alt_name(peer_cert): - """ - Given an PyOpenSSL certificate, provides all the subject alternative names. - """ - # Pass the cert to cryptography, which has much better APIs for this. - # This is technically using private APIs, but should work across all - # relevant versions until PyOpenSSL gets something proper for this. - cert = _Certificate(openssl_backend, peer_cert._x509) - - # We want to find the SAN extension. Ask Cryptography to locate it (it's - # faster than looping in Python) - try: - ext = cert.extensions.get_extension_for_class( - x509.SubjectAlternativeName - ).value - except x509.ExtensionNotFound: - # No such extension, return the empty list. - return [] - except (x509.DuplicateExtension, x509.UnsupportedExtension, - x509.UnsupportedGeneralNameType, UnicodeError) as e: - # A problem has been found with the quality of the certificate. Assume - # no SAN field is present. - log.warning( - "A problem was encountered with the certificate that prevented " - "urllib3 from finding the SubjectAlternativeName field. This can " - "affect certificate validation. The error was %s", - e, - ) - return [] - - # We want to return dNSName and iPAddress fields. We need to cast the IPs - # back to strings because the match_hostname function wants them as - # strings. - # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 - # decoded. This is pretty frustrating, but that's what the standard library - # does with certificates, and so we need to attempt to do the same. - names = [ - ('DNS', _dnsname_to_stdlib(name)) - for name in ext.get_values_for_type(x509.DNSName) - ] - names.extend( - ('IP Address', str(name)) - for name in ext.get_values_for_type(x509.IPAddress) - ) - - return names - - -class WrappedSocket(object): - '''API-compatibility wrapper for Python OpenSSL's Connection-class. - - Note: _makefile_refs, _drop() and _reuse() are needed for the garbage - collector of pypy. - ''' - - def __init__(self, connection, socket, suppress_ragged_eofs=True): - self.connection = connection - self.socket = socket - self.suppress_ragged_eofs = suppress_ragged_eofs - self._makefile_refs = 0 - self._closed = False - - def fileno(self): - return self.socket.fileno() - - # Copy-pasted from Python 3.5 source code - def _decref_socketios(self): - if self._makefile_refs > 0: - self._makefile_refs -= 1 - if self._closed: - self.close() - - def recv(self, *args, **kwargs): - try: - data = self.connection.recv(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): - return b'' - else: - raise SocketError(str(e)) - except OpenSSL.SSL.ZeroReturnError as e: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return b'' - else: - raise - except OpenSSL.SSL.WantReadError: - rd = util.wait_for_read(self.socket, self.socket.gettimeout()) - if not rd: - raise timeout('The read operation timed out') - else: - return self.recv(*args, **kwargs) - else: - return data - - def recv_into(self, *args, **kwargs): - try: - return self.connection.recv_into(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): - return 0 - else: - raise SocketError(str(e)) - except OpenSSL.SSL.ZeroReturnError as e: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return 0 - else: - raise - except OpenSSL.SSL.WantReadError: - rd = util.wait_for_read(self.socket, self.socket.gettimeout()) - if not rd: - raise timeout('The read operation timed out') - else: - return self.recv_into(*args, **kwargs) - - def settimeout(self, timeout): - return self.socket.settimeout(timeout) - - def _send_until_done(self, data): - while True: - try: - return self.connection.send(data) - except OpenSSL.SSL.WantWriteError: - wr = util.wait_for_write(self.socket, self.socket.gettimeout()) - if not wr: - raise timeout() - continue - - def sendall(self, data): - total_sent = 0 - while total_sent < len(data): - sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) - total_sent += sent - - def shutdown(self): - # FIXME rethrow compatible exceptions should we ever use this - self.connection.shutdown() - - def close(self): - if self._makefile_refs < 1: - try: - self._closed = True - return self.connection.close() - except OpenSSL.SSL.Error: - return - else: - self._makefile_refs -= 1 - - def getpeercert(self, binary_form=False): - x509 = self.connection.get_peer_certificate() - - if not x509: - return x509 - - if binary_form: - return OpenSSL.crypto.dump_certificate( - OpenSSL.crypto.FILETYPE_ASN1, - x509) - - return { - 'subject': ( - (('commonName', x509.get_subject().CN),), - ), - 'subjectAltName': get_subj_alt_name(x509) - } - - def _reuse(self): - self._makefile_refs += 1 - - def _drop(self): - if self._makefile_refs < 1: - self.close() - else: - self._makefile_refs -= 1 - - -if _fileobject: # Platform-specific: Python 2 - def makefile(self, mode, bufsize=-1): - self._makefile_refs += 1 - return _fileobject(self, mode, bufsize, close=True) -else: # Platform-specific: Python 3 - makefile = backport_makefile - -WrappedSocket.makefile = makefile - - -class PyOpenSSLContext(object): - """ - I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible - for translating the interface of the standard library ``SSLContext`` object - to calls into PyOpenSSL. - """ - def __init__(self, protocol): - self.protocol = _openssl_versions[protocol] - self._ctx = OpenSSL.SSL.Context(self.protocol) - self._options = 0 - self.check_hostname = False - - @property - def options(self): - return self._options - - @options.setter - def options(self, value): - self._options = value - self._ctx.set_options(value) - - @property - def verify_mode(self): - return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] - - @verify_mode.setter - def verify_mode(self, value): - self._ctx.set_verify( - _stdlib_to_openssl_verify[value], - _verify_callback - ) - - def set_default_verify_paths(self): - self._ctx.set_default_verify_paths() - - def set_ciphers(self, ciphers): - if isinstance(ciphers, six.text_type): - ciphers = ciphers.encode('utf-8') - self._ctx.set_cipher_list(ciphers) - - def load_verify_locations(self, cafile=None, capath=None, cadata=None): - if cafile is not None: - cafile = cafile.encode('utf-8') - if capath is not None: - capath = capath.encode('utf-8') - self._ctx.load_verify_locations(cafile, capath) - if cadata is not None: - self._ctx.load_verify_locations(BytesIO(cadata)) - - def load_cert_chain(self, certfile, keyfile=None, password=None): - self._ctx.use_certificate_file(certfile) - if password is not None: - self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) - self._ctx.use_privatekey_file(keyfile or certfile) - - def wrap_socket(self, sock, server_side=False, - do_handshake_on_connect=True, suppress_ragged_eofs=True, - server_hostname=None): - cnx = OpenSSL.SSL.Connection(self._ctx, sock) - - if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 - server_hostname = server_hostname.encode('utf-8') - - if server_hostname is not None: - cnx.set_tlsext_host_name(server_hostname) - - cnx.set_connect_state() - - while True: - try: - cnx.do_handshake() - except OpenSSL.SSL.WantReadError: - rd = util.wait_for_read(sock, sock.gettimeout()) - if not rd: - raise timeout('select timed out') - continue - except OpenSSL.SSL.Error as e: - raise ssl.SSLError('bad handshake: %r' % e) - break - - return WrappedSocket(cnx, sock) - - -def _verify_callback(cnx, x509, err_no, err_depth, return_code): - return err_no == 0 diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/socks.py b/Contents/Libraries/Shared/requests/packages/urllib3/contrib/socks.py deleted file mode 100644 index 39e92fde1..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/socks.py +++ /dev/null @@ -1,188 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module contains provisional support for SOCKS proxies from within -urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and -SOCKS5. To enable its functionality, either install PySocks or install this -module with the ``socks`` extra. - -The SOCKS implementation supports the full range of urllib3 features. It also -supports the following SOCKS features: - -- SOCKS4 -- SOCKS4a -- SOCKS5 -- Usernames and passwords for the SOCKS proxy - -Known Limitations: - -- Currently PySocks does not support contacting remote websites via literal - IPv6 addresses. Any such connection attempt will fail. You must use a domain - name. -- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any - such connection attempt will fail. -""" -from __future__ import absolute_import - -try: - import socks -except ImportError: - import warnings - from ..exceptions import DependencyWarning - - warnings.warn(( - 'SOCKS support in urllib3 requires the installation of optional ' - 'dependencies: specifically, PySocks. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies' - ), - DependencyWarning - ) - raise - -from socket import error as SocketError, timeout as SocketTimeout - -from ..connection import ( - HTTPConnection, HTTPSConnection -) -from ..connectionpool import ( - HTTPConnectionPool, HTTPSConnectionPool -) -from ..exceptions import ConnectTimeoutError, NewConnectionError -from ..poolmanager import PoolManager -from ..util.url import parse_url - -try: - import ssl -except ImportError: - ssl = None - - -class SOCKSConnection(HTTPConnection): - """ - A plain-text HTTP connection that connects via a SOCKS proxy. - """ - def __init__(self, *args, **kwargs): - self._socks_options = kwargs.pop('_socks_options') - super(SOCKSConnection, self).__init__(*args, **kwargs) - - def _new_conn(self): - """ - Establish a new connection via the SOCKS proxy. - """ - extra_kw = {} - if self.source_address: - extra_kw['source_address'] = self.source_address - - if self.socket_options: - extra_kw['socket_options'] = self.socket_options - - try: - conn = socks.create_connection( - (self.host, self.port), - proxy_type=self._socks_options['socks_version'], - proxy_addr=self._socks_options['proxy_host'], - proxy_port=self._socks_options['proxy_port'], - proxy_username=self._socks_options['username'], - proxy_password=self._socks_options['password'], - proxy_rdns=self._socks_options['rdns'], - timeout=self.timeout, - **extra_kw - ) - - except SocketTimeout as e: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout)) - - except socks.ProxyError as e: - # This is fragile as hell, but it seems to be the only way to raise - # useful errors here. - if e.socket_err: - error = e.socket_err - if isinstance(error, SocketTimeout): - raise ConnectTimeoutError( - self, - "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout) - ) - else: - raise NewConnectionError( - self, - "Failed to establish a new connection: %s" % error - ) - else: - raise NewConnectionError( - self, - "Failed to establish a new connection: %s" % e - ) - - except SocketError as e: # Defensive: PySocks should catch all these. - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e) - - return conn - - -# We don't need to duplicate the Verified/Unverified distinction from -# urllib3/connection.py here because the HTTPSConnection will already have been -# correctly set to either the Verified or Unverified form by that module. This -# means the SOCKSHTTPSConnection will automatically be the correct type. -class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): - pass - - -class SOCKSHTTPConnectionPool(HTTPConnectionPool): - ConnectionCls = SOCKSConnection - - -class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): - ConnectionCls = SOCKSHTTPSConnection - - -class SOCKSProxyManager(PoolManager): - """ - A version of the urllib3 ProxyManager that routes connections via the - defined SOCKS proxy. - """ - pool_classes_by_scheme = { - 'http': SOCKSHTTPConnectionPool, - 'https': SOCKSHTTPSConnectionPool, - } - - def __init__(self, proxy_url, username=None, password=None, - num_pools=10, headers=None, **connection_pool_kw): - parsed = parse_url(proxy_url) - - if parsed.scheme == 'socks5': - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = False - elif parsed.scheme == 'socks5h': - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = True - elif parsed.scheme == 'socks4': - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = False - elif parsed.scheme == 'socks4a': - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = True - else: - raise ValueError( - "Unable to determine SOCKS version from %s" % proxy_url - ) - - self.proxy_url = proxy_url - - socks_options = { - 'socks_version': socks_version, - 'proxy_host': parsed.host, - 'proxy_port': parsed.port, - 'username': username, - 'password': password, - 'rdns': rdns - } - connection_pool_kw['_socks_options'] = socks_options - - super(SOCKSProxyManager, self).__init__( - num_pools, headers, **connection_pool_kw - ) - - self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/exceptions.py b/Contents/Libraries/Shared/requests/packages/urllib3/exceptions.py deleted file mode 100644 index 6c4be5810..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/exceptions.py +++ /dev/null @@ -1,246 +0,0 @@ -from __future__ import absolute_import -from .packages.six.moves.http_client import ( - IncompleteRead as httplib_IncompleteRead -) -# Base Exceptions - - -class HTTPError(Exception): - "Base exception used by this module." - pass - - -class HTTPWarning(Warning): - "Base warning used by this module." - pass - - -class PoolError(HTTPError): - "Base exception for errors caused within a pool." - def __init__(self, pool, message): - self.pool = pool - HTTPError.__init__(self, "%s: %s" % (pool, message)) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, None) - - -class RequestError(PoolError): - "Base exception for PoolErrors that have associated URLs." - def __init__(self, pool, url, message): - self.url = url - PoolError.__init__(self, pool, message) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, self.url, None) - - -class SSLError(HTTPError): - "Raised when SSL certificate fails in an HTTPS connection." - pass - - -class ProxyError(HTTPError): - "Raised when the connection to a proxy fails." - pass - - -class DecodeError(HTTPError): - "Raised when automatic decoding based on Content-Type fails." - pass - - -class ProtocolError(HTTPError): - "Raised when something unexpected happens mid-request/response." - pass - - -#: Renamed to ProtocolError but aliased for backwards compatibility. -ConnectionError = ProtocolError - - -# Leaf Exceptions - -class MaxRetryError(RequestError): - """Raised when the maximum number of retries is exceeded. - - :param pool: The connection pool - :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` - :param string url: The requested Url - :param exceptions.Exception reason: The underlying error - - """ - - def __init__(self, pool, url, reason=None): - self.reason = reason - - message = "Max retries exceeded with url: %s (Caused by %r)" % ( - url, reason) - - RequestError.__init__(self, pool, url, message) - - -class HostChangedError(RequestError): - "Raised when an existing pool gets a request for a foreign host." - - def __init__(self, pool, url, retries=3): - message = "Tried to open a foreign host with url: %s" % url - RequestError.__init__(self, pool, url, message) - self.retries = retries - - -class TimeoutStateError(HTTPError): - """ Raised when passing an invalid state to a timeout """ - pass - - -class TimeoutError(HTTPError): - """ Raised when a socket timeout error occurs. - - Catching this error will catch both :exc:`ReadTimeoutErrors - ` and :exc:`ConnectTimeoutErrors `. - """ - pass - - -class ReadTimeoutError(TimeoutError, RequestError): - "Raised when a socket timeout occurs while receiving data from a server" - pass - - -# This timeout error does not have a URL attached and needs to inherit from the -# base HTTPError -class ConnectTimeoutError(TimeoutError): - "Raised when a socket timeout occurs while connecting to a server" - pass - - -class NewConnectionError(ConnectTimeoutError, PoolError): - "Raised when we fail to establish a new connection. Usually ECONNREFUSED." - pass - - -class EmptyPoolError(PoolError): - "Raised when a pool runs out of connections and no more are allowed." - pass - - -class ClosedPoolError(PoolError): - "Raised when a request enters a pool after the pool has been closed." - pass - - -class LocationValueError(ValueError, HTTPError): - "Raised when there is something wrong with a given URL input." - pass - - -class LocationParseError(LocationValueError): - "Raised when get_host or similar fails to parse the URL input." - - def __init__(self, location): - message = "Failed to parse: %s" % location - HTTPError.__init__(self, message) - - self.location = location - - -class ResponseError(HTTPError): - "Used as a container for an error reason supplied in a MaxRetryError." - GENERIC_ERROR = 'too many error responses' - SPECIFIC_ERROR = 'too many {status_code} error responses' - - -class SecurityWarning(HTTPWarning): - "Warned when perfoming security reducing actions" - pass - - -class SubjectAltNameWarning(SecurityWarning): - "Warned when connecting to a host with a certificate missing a SAN." - pass - - -class InsecureRequestWarning(SecurityWarning): - "Warned when making an unverified HTTPS request." - pass - - -class SystemTimeWarning(SecurityWarning): - "Warned when system time is suspected to be wrong" - pass - - -class InsecurePlatformWarning(SecurityWarning): - "Warned when certain SSL configuration is not available on a platform." - pass - - -class SNIMissingWarning(HTTPWarning): - "Warned when making a HTTPS request without SNI available." - pass - - -class DependencyWarning(HTTPWarning): - """ - Warned when an attempt is made to import a module with missing optional - dependencies. - """ - pass - - -class ResponseNotChunked(ProtocolError, ValueError): - "Response needs to be chunked in order to read it as chunks." - pass - - -class BodyNotHttplibCompatible(HTTPError): - """ - Body should be httplib.HTTPResponse like (have an fp attribute which - returns raw chunks) for read_chunked(). - """ - pass - - -class IncompleteRead(HTTPError, httplib_IncompleteRead): - """ - Response length doesn't match expected Content-Length - - Subclass of http_client.IncompleteRead to allow int value - for `partial` to avoid creating large objects on streamed - reads. - """ - def __init__(self, partial, expected): - super(IncompleteRead, self).__init__(partial, expected) - - def __repr__(self): - return ('IncompleteRead(%i bytes read, ' - '%i more expected)' % (self.partial, self.expected)) - - -class InvalidHeader(HTTPError): - "The header provided was somehow invalid." - pass - - -class ProxySchemeUnknown(AssertionError, ValueError): - "ProxyManager does not support the supplied scheme" - # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. - - def __init__(self, scheme): - message = "Not supported proxy scheme %s" % scheme - super(ProxySchemeUnknown, self).__init__(message) - - -class HeaderParsingError(HTTPError): - "Raised by assert_header_parsing, but we convert it to a log.warning statement." - def __init__(self, defects, unparsed_data): - message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) - super(HeaderParsingError, self).__init__(message) - - -class UnrewindableBodyError(HTTPError): - "urllib3 encountered an error when trying to rewind a body" - pass diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/fields.py b/Contents/Libraries/Shared/requests/packages/urllib3/fields.py deleted file mode 100644 index 19b0ae0c8..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/fields.py +++ /dev/null @@ -1,178 +0,0 @@ -from __future__ import absolute_import -import email.utils -import mimetypes - -from .packages import six - - -def guess_content_type(filename, default='application/octet-stream'): - """ - Guess the "Content-Type" of a file. - - :param filename: - The filename to guess the "Content-Type" of using :mod:`mimetypes`. - :param default: - If no "Content-Type" can be guessed, default to `default`. - """ - if filename: - return mimetypes.guess_type(filename)[0] or default - return default - - -def format_header_param(name, value): - """ - Helper function to format and quote a single header parameter. - - Particularly useful for header parameters which might contain - non-ASCII values, like file names. This follows RFC 2231, as - suggested by RFC 2388 Section 4.4. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as a unicode string. - """ - if not any(ch in value for ch in '"\\\r\n'): - result = '%s="%s"' % (name, value) - try: - result.encode('ascii') - except (UnicodeEncodeError, UnicodeDecodeError): - pass - else: - return result - if not six.PY3 and isinstance(value, six.text_type): # Python 2: - value = value.encode('utf-8') - value = email.utils.encode_rfc2231(value, 'utf-8') - value = '%s*=%s' % (name, value) - return value - - -class RequestField(object): - """ - A data container for request body parameters. - - :param name: - The name of this request field. - :param data: - The data/value body. - :param filename: - An optional filename of the request field. - :param headers: - An optional dict-like object of headers to initially use for the field. - """ - def __init__(self, name, data, filename=None, headers=None): - self._name = name - self._filename = filename - self.data = data - self.headers = {} - if headers: - self.headers = dict(headers) - - @classmethod - def from_tuples(cls, fieldname, value): - """ - A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. - - Supports constructing :class:`~urllib3.fields.RequestField` from - parameter of key/value strings AND key/filetuple. A filetuple is a - (filename, data, MIME type) tuple where the MIME type is optional. - For example:: - - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - - Field names and filenames must be unicode. - """ - if isinstance(value, tuple): - if len(value) == 3: - filename, data, content_type = value - else: - filename, data = value - content_type = guess_content_type(filename) - else: - filename = None - content_type = None - data = value - - request_param = cls(fieldname, data, filename=filename) - request_param.make_multipart(content_type=content_type) - - return request_param - - def _render_part(self, name, value): - """ - Overridable helper function to format a single header parameter. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as a unicode string. - """ - return format_header_param(name, value) - - def _render_parts(self, header_parts): - """ - Helper function to format and quote a single header. - - Useful for single headers that are composed of multiple items. E.g., - 'Content-Disposition' fields. - - :param header_parts: - A sequence of (k, v) typles or a :class:`dict` of (k, v) to format - as `k1="v1"; k2="v2"; ...`. - """ - parts = [] - iterable = header_parts - if isinstance(header_parts, dict): - iterable = header_parts.items() - - for name, value in iterable: - if value is not None: - parts.append(self._render_part(name, value)) - - return '; '.join(parts) - - def render_headers(self): - """ - Renders the headers for this request field. - """ - lines = [] - - sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] - for sort_key in sort_keys: - if self.headers.get(sort_key, False): - lines.append('%s: %s' % (sort_key, self.headers[sort_key])) - - for header_name, header_value in self.headers.items(): - if header_name not in sort_keys: - if header_value: - lines.append('%s: %s' % (header_name, header_value)) - - lines.append('\r\n') - return '\r\n'.join(lines) - - def make_multipart(self, content_disposition=None, content_type=None, - content_location=None): - """ - Makes this request field into a multipart request field. - - This method overrides "Content-Disposition", "Content-Type" and - "Content-Location" headers to the request parameter. - - :param content_type: - The 'Content-Type' of the request body. - :param content_location: - The 'Content-Location' of the request body. - - """ - self.headers['Content-Disposition'] = content_disposition or 'form-data' - self.headers['Content-Disposition'] += '; '.join([ - '', self._render_parts( - (('name', self._name), ('filename', self._filename)) - ) - ]) - self.headers['Content-Type'] = content_type - self.headers['Content-Location'] = content_location diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/filepost.py b/Contents/Libraries/Shared/requests/packages/urllib3/filepost.py deleted file mode 100644 index cd11cee46..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/filepost.py +++ /dev/null @@ -1,94 +0,0 @@ -from __future__ import absolute_import -import codecs - -from uuid import uuid4 -from io import BytesIO - -from .packages import six -from .packages.six import b -from .fields import RequestField - -writer = codecs.lookup('utf-8')[3] - - -def choose_boundary(): - """ - Our embarrassingly-simple replacement for mimetools.choose_boundary. - """ - return uuid4().hex - - -def iter_field_objects(fields): - """ - Iterate over fields. - - Supports list of (k, v) tuples and dicts, and lists of - :class:`~urllib3.fields.RequestField`. - - """ - if isinstance(fields, dict): - i = six.iteritems(fields) - else: - i = iter(fields) - - for field in i: - if isinstance(field, RequestField): - yield field - else: - yield RequestField.from_tuples(*field) - - -def iter_fields(fields): - """ - .. deprecated:: 1.6 - - Iterate over fields. - - The addition of :class:`~urllib3.fields.RequestField` makes this function - obsolete. Instead, use :func:`iter_field_objects`, which returns - :class:`~urllib3.fields.RequestField` objects. - - Supports list of (k, v) tuples and dicts. - """ - if isinstance(fields, dict): - return ((k, v) for k, v in six.iteritems(fields)) - - return ((k, v) for k, v in fields) - - -def encode_multipart_formdata(fields, boundary=None): - """ - Encode a dictionary of ``fields`` using the multipart/form-data MIME format. - - :param fields: - Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). - - :param boundary: - If not specified, then a random boundary will be generated using - :func:`mimetools.choose_boundary`. - """ - body = BytesIO() - if boundary is None: - boundary = choose_boundary() - - for field in iter_field_objects(fields): - body.write(b('--%s\r\n' % (boundary))) - - writer(body).write(field.render_headers()) - data = field.data - - if isinstance(data, int): - data = str(data) # Backwards compatibility - - if isinstance(data, six.text_type): - writer(body).write(data) - else: - body.write(data) - - body.write(b'\r\n') - - body.write(b('--%s--\r\n' % (boundary))) - - content_type = str('multipart/form-data; boundary=%s' % boundary) - - return body.getvalue(), content_type diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/packages/__init__.py b/Contents/Libraries/Shared/requests/packages/urllib3/packages/__init__.py deleted file mode 100644 index 170e974c1..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/packages/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import absolute_import - -from . import ssl_match_hostname - -__all__ = ('ssl_match_hostname', ) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/__init__.py b/Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/makefile.py b/Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/makefile.py deleted file mode 100644 index 75b80dcf8..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/makefile.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -""" -backports.makefile -~~~~~~~~~~~~~~~~~~ - -Backports the Python 3 ``socket.makefile`` method for use with anything that -wants to create a "fake" socket object. -""" -import io - -from socket import SocketIO - - -def backport_makefile(self, mode="r", buffering=None, encoding=None, - errors=None, newline=None): - """ - Backport of ``socket.makefile`` from Python 3.5. - """ - if not set(mode) <= set(["r", "w", "b"]): - raise ValueError( - "invalid mode %r (only r, w, b allowed)" % (mode,) - ) - writing = "w" in mode - reading = "r" in mode or not writing - assert reading or writing - binary = "b" in mode - rawmode = "" - if reading: - rawmode += "r" - if writing: - rawmode += "w" - raw = SocketIO(self, rawmode) - self._makefile_refs += 1 - if buffering is None: - buffering = -1 - if buffering < 0: - buffering = io.DEFAULT_BUFFER_SIZE - if buffering == 0: - if not binary: - raise ValueError("unbuffered streams must be binary") - return raw - if reading and writing: - buffer = io.BufferedRWPair(raw, raw, buffering) - elif reading: - buffer = io.BufferedReader(raw, buffering) - else: - assert writing - buffer = io.BufferedWriter(raw, buffering) - if binary: - return buffer - text = io.TextIOWrapper(buffer, encoding, errors, newline) - text.mode = mode - return text diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/packages/ordered_dict.py b/Contents/Libraries/Shared/requests/packages/urllib3/packages/ordered_dict.py deleted file mode 100644 index 4479363cc..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/packages/ordered_dict.py +++ /dev/null @@ -1,259 +0,0 @@ -# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. -# Passes Python2.7's test suite and incorporates all the latest updates. -# Copyright 2009 Raymond Hettinger, released under the MIT License. -# http://code.activestate.com/recipes/576693/ -try: - from thread import get_ident as _get_ident -except ImportError: - from dummy_thread import get_ident as _get_ident - -try: - from _abcoll import KeysView, ValuesView, ItemsView -except ImportError: - pass - - -class OrderedDict(dict): - 'Dictionary that remembers insertion order' - # An inherited dict maps keys to values. - # The inherited dict provides __getitem__, __len__, __contains__, and get. - # The remaining methods are order-aware. - # Big-O running times for all methods are the same as for regular dictionaries. - - # The internal self.__map dictionary maps keys to links in a doubly linked list. - # The circular doubly linked list starts and ends with a sentinel element. - # The sentinel element never gets deleted (this simplifies the algorithm). - # Each link is stored as a list of length three: [PREV, NEXT, KEY]. - - def __init__(self, *args, **kwds): - '''Initialize an ordered dictionary. Signature is the same as for - regular dictionaries, but keyword arguments are not recommended - because their insertion order is arbitrary. - - ''' - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - try: - self.__root - except AttributeError: - self.__root = root = [] # sentinel node - root[:] = [root, root, None] - self.__map = {} - self.__update(*args, **kwds) - - def __setitem__(self, key, value, dict_setitem=dict.__setitem__): - 'od.__setitem__(i, y) <==> od[i]=y' - # Setting a new item creates a new link which goes at the end of the linked - # list, and the inherited dictionary is updated with the new key/value pair. - if key not in self: - root = self.__root - last = root[0] - last[1] = root[0] = self.__map[key] = [last, root, key] - dict_setitem(self, key, value) - - def __delitem__(self, key, dict_delitem=dict.__delitem__): - 'od.__delitem__(y) <==> del od[y]' - # Deleting an existing item uses self.__map to find the link which is - # then removed by updating the links in the predecessor and successor nodes. - dict_delitem(self, key) - link_prev, link_next, key = self.__map.pop(key) - link_prev[1] = link_next - link_next[0] = link_prev - - def __iter__(self): - 'od.__iter__() <==> iter(od)' - root = self.__root - curr = root[1] - while curr is not root: - yield curr[2] - curr = curr[1] - - def __reversed__(self): - 'od.__reversed__() <==> reversed(od)' - root = self.__root - curr = root[0] - while curr is not root: - yield curr[2] - curr = curr[0] - - def clear(self): - 'od.clear() -> None. Remove all items from od.' - try: - for node in self.__map.itervalues(): - del node[:] - root = self.__root - root[:] = [root, root, None] - self.__map.clear() - except AttributeError: - pass - dict.clear(self) - - def popitem(self, last=True): - '''od.popitem() -> (k, v), return and remove a (key, value) pair. - Pairs are returned in LIFO order if last is true or FIFO order if false. - - ''' - if not self: - raise KeyError('dictionary is empty') - root = self.__root - if last: - link = root[0] - link_prev = link[0] - link_prev[1] = root - root[0] = link_prev - else: - link = root[1] - link_next = link[1] - root[1] = link_next - link_next[0] = root - key = link[2] - del self.__map[key] - value = dict.pop(self, key) - return key, value - - # -- the following methods do not depend on the internal structure -- - - def keys(self): - 'od.keys() -> list of keys in od' - return list(self) - - def values(self): - 'od.values() -> list of values in od' - return [self[key] for key in self] - - def items(self): - 'od.items() -> list of (key, value) pairs in od' - return [(key, self[key]) for key in self] - - def iterkeys(self): - 'od.iterkeys() -> an iterator over the keys in od' - return iter(self) - - def itervalues(self): - 'od.itervalues -> an iterator over the values in od' - for k in self: - yield self[k] - - def iteritems(self): - 'od.iteritems -> an iterator over the (key, value) items in od' - for k in self: - yield (k, self[k]) - - def update(*args, **kwds): - '''od.update(E, **F) -> None. Update od from dict/iterable E and F. - - If E is a dict instance, does: for k in E: od[k] = E[k] - If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] - Or if E is an iterable of items, does: for k, v in E: od[k] = v - In either case, this is followed by: for k, v in F.items(): od[k] = v - - ''' - if len(args) > 2: - raise TypeError('update() takes at most 2 positional ' - 'arguments (%d given)' % (len(args),)) - elif not args: - raise TypeError('update() takes at least 1 argument (0 given)') - self = args[0] - # Make progressively weaker assumptions about "other" - other = () - if len(args) == 2: - other = args[1] - if isinstance(other, dict): - for key in other: - self[key] = other[key] - elif hasattr(other, 'keys'): - for key in other.keys(): - self[key] = other[key] - else: - for key, value in other: - self[key] = value - for key, value in kwds.items(): - self[key] = value - - __update = update # let subclasses override update without breaking __init__ - - __marker = object() - - def pop(self, key, default=__marker): - '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - - ''' - if key in self: - result = self[key] - del self[key] - return result - if default is self.__marker: - raise KeyError(key) - return default - - def setdefault(self, key, default=None): - 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' - if key in self: - return self[key] - self[key] = default - return default - - def __repr__(self, _repr_running={}): - 'od.__repr__() <==> repr(od)' - call_key = id(self), _get_ident() - if call_key in _repr_running: - return '...' - _repr_running[call_key] = 1 - try: - if not self: - return '%s()' % (self.__class__.__name__,) - return '%s(%r)' % (self.__class__.__name__, self.items()) - finally: - del _repr_running[call_key] - - def __reduce__(self): - 'Return state information for pickling' - items = [[k, self[k]] for k in self] - inst_dict = vars(self).copy() - for k in vars(OrderedDict()): - inst_dict.pop(k, None) - if inst_dict: - return (self.__class__, (items,), inst_dict) - return self.__class__, (items,) - - def copy(self): - 'od.copy() -> a shallow copy of od' - return self.__class__(self) - - @classmethod - def fromkeys(cls, iterable, value=None): - '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S - and values equal to v (which defaults to None). - - ''' - d = cls() - for key in iterable: - d[key] = value - return d - - def __eq__(self, other): - '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive - while comparison to a regular mapping is order-insensitive. - - ''' - if isinstance(other, OrderedDict): - return len(self)==len(other) and self.items() == other.items() - return dict.__eq__(self, other) - - def __ne__(self, other): - return not self == other - - # -- the following methods are only used in Python 2.7 -- - - def viewkeys(self): - "od.viewkeys() -> a set-like object providing a view on od's keys" - return KeysView(self) - - def viewvalues(self): - "od.viewvalues() -> an object providing a view on od's values" - return ValuesView(self) - - def viewitems(self): - "od.viewitems() -> a set-like object providing a view on od's items" - return ItemsView(self) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/packages/six.py b/Contents/Libraries/Shared/requests/packages/urllib3/packages/six.py deleted file mode 100644 index 190c0239c..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/packages/six.py +++ /dev/null @@ -1,868 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2015 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson " -__version__ = "1.10.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - unichr = chr - import struct - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" -else: - def b(s): - return s - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - - -if sys.version_info[:2] == (3, 2): - exec_("""def raise_from(value, from_value): - if from_value is None: - raise value - raise value from from_value -""") -elif sys.version_info[:2] > (3, 2): - exec_("""def raise_from(value, from_value): - raise value from from_value -""") -else: - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - def wrapper(f): - f = functools.wraps(wrapped, assigned, updated)(f) - f.__wrapped__ = wrapped - return f - return wrapper -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def python_2_unicode_compatible(klass): - """ - A decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if '__str__' not in klass.__dict__: - raise ValueError("@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % - klass.__name__) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode('utf-8') - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py b/Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py deleted file mode 100644 index d6594eb26..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -import sys - -try: - # Our match_hostname function is the same as 3.5's, so we only want to - # import the match_hostname function if it's at least that good. - if sys.version_info < (3, 5): - raise ImportError("Fallback to vendored code") - - from ssl import CertificateError, match_hostname -except ImportError: - try: - # Backport of the function from a pypi module - from backports.ssl_match_hostname import CertificateError, match_hostname - except ImportError: - # Our vendored copy - from ._implementation import CertificateError, match_hostname - -# Not needed, but documenting what we provide. -__all__ = ('CertificateError', 'match_hostname') diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py b/Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py deleted file mode 100644 index 1fd42f38a..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py +++ /dev/null @@ -1,157 +0,0 @@ -"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" - -# Note: This file is under the PSF license as the code comes from the python -# stdlib. http://docs.python.org/3/license.html - -import re -import sys - -# ipaddress has been backported to 2.6+ in pypi. If it is installed on the -# system, use it to handle IPAddress ServerAltnames (this was added in -# python-3.5) otherwise only do DNS matching. This allows -# backports.ssl_match_hostname to continue to be used all the way back to -# python-2.4. -try: - import ipaddress -except ImportError: - ipaddress = None - -__version__ = '3.5.0.1' - - -class CertificateError(ValueError): - pass - - -def _dnsname_match(dn, hostname, max_wildcards=1): - """Matching according to RFC 6125, section 6.4.3 - - http://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - # Ported from python3-syntax: - # leftmost, *remainder = dn.split(r'.') - parts = dn.split(r'.') - leftmost = parts[0] - remainder = parts[1:] - - wildcards = leftmost.count('*') - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - elif leftmost.startswith('xn--') or hostname.startswith('xn--'): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - return pat.match(hostname) - - -def _to_unicode(obj): - if isinstance(obj, str) and sys.version_info < (3,): - obj = unicode(obj, encoding='ascii', errors='strict') - return obj - -def _ipaddress_match(ipname, host_ip): - """Exact matching of IP addresses. - - RFC 6125 explicitly doesn't define an algorithm for this - (section 1.7.2 - "Out of Scope"). - """ - # OpenSSL may add a trailing newline to a subjectAltName's IP address - # Divergence from upstream: ipaddress can't handle byte str - ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) - return ip == host_ip - - -def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate, match_hostname needs a " - "SSL socket or SSL context with either " - "CERT_OPTIONAL or CERT_REQUIRED") - try: - # Divergence from upstream: ipaddress can't handle byte str - host_ip = ipaddress.ip_address(_to_unicode(hostname)) - except ValueError: - # Not an IP address (common case) - host_ip = None - except UnicodeError: - # Divergence from upstream: Have to deal with ipaddress not taking - # byte strings. addresses should be all ascii, so we consider it not - # an ipaddress in this case - host_ip = None - except AttributeError: - # Divergence from upstream: Make ipaddress library optional - if ipaddress is None: - host_ip = None - else: - raise - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if host_ip is None and _dnsname_match(value, hostname): - return - dnsnames.append(value) - elif key == 'IP Address': - if host_ip is not None and _ipaddress_match(value, host_ip): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/poolmanager.py b/Contents/Libraries/Shared/requests/packages/urllib3/poolmanager.py deleted file mode 100644 index cc5a00e4b..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/poolmanager.py +++ /dev/null @@ -1,363 +0,0 @@ -from __future__ import absolute_import -import collections -import functools -import logging - -from ._collections import RecentlyUsedContainer -from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool -from .connectionpool import port_by_scheme -from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown -from .packages.six.moves.urllib.parse import urljoin -from .request import RequestMethods -from .util.url import parse_url -from .util.retry import Retry - - -__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] - - -log = logging.getLogger(__name__) - -SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', - 'ssl_version', 'ca_cert_dir', 'ssl_context') - -# The base fields to use when determining what pool to get a connection from; -# these do not rely on the ``connection_pool_kw`` and can be determined by the -# URL and potentially the ``urllib3.connection.port_by_scheme`` dictionary. -# -# All custom key schemes should include the fields in this key at a minimum. -BasePoolKey = collections.namedtuple('BasePoolKey', ('scheme', 'host', 'port')) - -# The fields to use when determining what pool to get a HTTP and HTTPS -# connection from. All additional fields must be present in the PoolManager's -# ``connection_pool_kw`` instance variable. -HTTPPoolKey = collections.namedtuple( - 'HTTPPoolKey', BasePoolKey._fields + ('timeout', 'retries', 'strict', - 'block', 'source_address') -) -HTTPSPoolKey = collections.namedtuple( - 'HTTPSPoolKey', HTTPPoolKey._fields + SSL_KEYWORDS -) - - -def _default_key_normalizer(key_class, request_context): - """ - Create a pool key of type ``key_class`` for a request. - - According to RFC 3986, both the scheme and host are case-insensitive. - Therefore, this function normalizes both before constructing the pool - key for an HTTPS request. If you wish to change this behaviour, provide - alternate callables to ``key_fn_by_scheme``. - - :param key_class: - The class to use when constructing the key. This should be a namedtuple - with the ``scheme`` and ``host`` keys at a minimum. - - :param request_context: - A dictionary-like object that contain the context for a request. - It should contain a key for each field in the :class:`HTTPPoolKey` - """ - context = {} - for key in key_class._fields: - context[key] = request_context.get(key) - context['scheme'] = context['scheme'].lower() - context['host'] = context['host'].lower() - return key_class(**context) - - -# A dictionary that maps a scheme to a callable that creates a pool key. -# This can be used to alter the way pool keys are constructed, if desired. -# Each PoolManager makes a copy of this dictionary so they can be configured -# globally here, or individually on the instance. -key_fn_by_scheme = { - 'http': functools.partial(_default_key_normalizer, HTTPPoolKey), - 'https': functools.partial(_default_key_normalizer, HTTPSPoolKey), -} - -pool_classes_by_scheme = { - 'http': HTTPConnectionPool, - 'https': HTTPSConnectionPool, -} - - -class PoolManager(RequestMethods): - """ - Allows for arbitrary requests while transparently keeping track of - necessary connection pools for you. - - :param num_pools: - Number of connection pools to cache before discarding the least - recently used pool. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param \\**connection_pool_kw: - Additional parameters are used to create fresh - :class:`urllib3.connectionpool.ConnectionPool` instances. - - Example:: - - >>> manager = PoolManager(num_pools=2) - >>> r = manager.request('GET', 'http://google.com/') - >>> r = manager.request('GET', 'http://google.com/mail') - >>> r = manager.request('GET', 'http://yahoo.com/') - >>> len(manager.pools) - 2 - - """ - - proxy = None - - def __init__(self, num_pools=10, headers=None, **connection_pool_kw): - RequestMethods.__init__(self, headers) - self.connection_pool_kw = connection_pool_kw - self.pools = RecentlyUsedContainer(num_pools, - dispose_func=lambda p: p.close()) - - # Locally set the pool classes and keys so other PoolManagers can - # override them. - self.pool_classes_by_scheme = pool_classes_by_scheme - self.key_fn_by_scheme = key_fn_by_scheme.copy() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.clear() - # Return False to re-raise any potential exceptions - return False - - def _new_pool(self, scheme, host, port): - """ - Create a new :class:`ConnectionPool` based on host, port and scheme. - - This method is used to actually create the connection pools handed out - by :meth:`connection_from_url` and companion methods. It is intended - to be overridden for customization. - """ - pool_cls = self.pool_classes_by_scheme[scheme] - kwargs = self.connection_pool_kw - if scheme == 'http': - kwargs = self.connection_pool_kw.copy() - for kw in SSL_KEYWORDS: - kwargs.pop(kw, None) - - return pool_cls(host, port, **kwargs) - - def clear(self): - """ - Empty our store of pools and direct them all to close. - - This will not affect in-flight connections, but they will not be - re-used after completion. - """ - self.pools.clear() - - def connection_from_host(self, host, port=None, scheme='http'): - """ - Get a :class:`ConnectionPool` based on the host, port, and scheme. - - If ``port`` isn't given, it will be derived from the ``scheme`` using - ``urllib3.connectionpool.port_by_scheme``. - """ - - if not host: - raise LocationValueError("No host specified.") - - request_context = self.connection_pool_kw.copy() - request_context['scheme'] = scheme or 'http' - if not port: - port = port_by_scheme.get(request_context['scheme'].lower(), 80) - request_context['port'] = port - request_context['host'] = host - - return self.connection_from_context(request_context) - - def connection_from_context(self, request_context): - """ - Get a :class:`ConnectionPool` based on the request context. - - ``request_context`` must at least contain the ``scheme`` key and its - value must be a key in ``key_fn_by_scheme`` instance variable. - """ - scheme = request_context['scheme'].lower() - pool_key_constructor = self.key_fn_by_scheme[scheme] - pool_key = pool_key_constructor(request_context) - - return self.connection_from_pool_key(pool_key) - - def connection_from_pool_key(self, pool_key): - """ - Get a :class:`ConnectionPool` based on the provided pool key. - - ``pool_key`` should be a namedtuple that only contains immutable - objects. At a minimum it must have the ``scheme``, ``host``, and - ``port`` fields. - """ - with self.pools.lock: - # If the scheme, host, or port doesn't match existing open - # connections, open a new ConnectionPool. - pool = self.pools.get(pool_key) - if pool: - return pool - - # Make a fresh ConnectionPool of the desired type - pool = self._new_pool(pool_key.scheme, pool_key.host, pool_key.port) - self.pools[pool_key] = pool - - return pool - - def connection_from_url(self, url): - """ - Similar to :func:`urllib3.connectionpool.connection_from_url` but - doesn't pass any additional parameters to the - :class:`urllib3.connectionpool.ConnectionPool` constructor. - - Additional parameters are taken from the :class:`.PoolManager` - constructor. - """ - u = parse_url(url) - return self.connection_from_host(u.host, port=u.port, scheme=u.scheme) - - def urlopen(self, method, url, redirect=True, **kw): - """ - Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` - with custom cross-host redirect logic and only sends the request-uri - portion of the ``url``. - - The given ``url`` parameter must be absolute, such that an appropriate - :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. - """ - u = parse_url(url) - conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) - - kw['assert_same_host'] = False - kw['redirect'] = False - if 'headers' not in kw: - kw['headers'] = self.headers - - if self.proxy is not None and u.scheme == "http": - response = conn.urlopen(method, url, **kw) - else: - response = conn.urlopen(method, u.request_uri, **kw) - - redirect_location = redirect and response.get_redirect_location() - if not redirect_location: - return response - - # Support relative URLs for redirecting. - redirect_location = urljoin(url, redirect_location) - - # RFC 7231, Section 6.4.4 - if response.status == 303: - method = 'GET' - - retries = kw.get('retries') - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect) - - try: - retries = retries.increment(method, url, response=response, _pool=conn) - except MaxRetryError: - if retries.raise_on_redirect: - raise - return response - - kw['retries'] = retries - kw['redirect'] = redirect - - log.info("Redirecting %s -> %s", url, redirect_location) - return self.urlopen(method, redirect_location, **kw) - - -class ProxyManager(PoolManager): - """ - Behaves just like :class:`PoolManager`, but sends all requests through - the defined proxy, using the CONNECT method for HTTPS URLs. - - :param proxy_url: - The URL of the proxy to be used. - - :param proxy_headers: - A dictionary contaning headers that will be sent to the proxy. In case - of HTTP they are being sent with each request, while in the - HTTPS/CONNECT case they are sent only once. Could be used for proxy - authentication. - - Example: - >>> proxy = urllib3.ProxyManager('http://localhost:3128/') - >>> r1 = proxy.request('GET', 'http://google.com/') - >>> r2 = proxy.request('GET', 'http://httpbin.org/') - >>> len(proxy.pools) - 1 - >>> r3 = proxy.request('GET', 'https://httpbin.org/') - >>> r4 = proxy.request('GET', 'https://twitter.com/') - >>> len(proxy.pools) - 3 - - """ - - def __init__(self, proxy_url, num_pools=10, headers=None, - proxy_headers=None, **connection_pool_kw): - - if isinstance(proxy_url, HTTPConnectionPool): - proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, - proxy_url.port) - proxy = parse_url(proxy_url) - if not proxy.port: - port = port_by_scheme.get(proxy.scheme, 80) - proxy = proxy._replace(port=port) - - if proxy.scheme not in ("http", "https"): - raise ProxySchemeUnknown(proxy.scheme) - - self.proxy = proxy - self.proxy_headers = proxy_headers or {} - - connection_pool_kw['_proxy'] = self.proxy - connection_pool_kw['_proxy_headers'] = self.proxy_headers - - super(ProxyManager, self).__init__( - num_pools, headers, **connection_pool_kw) - - def connection_from_host(self, host, port=None, scheme='http'): - if scheme == "https": - return super(ProxyManager, self).connection_from_host( - host, port, scheme) - - return super(ProxyManager, self).connection_from_host( - self.proxy.host, self.proxy.port, self.proxy.scheme) - - def _set_proxy_headers(self, url, headers=None): - """ - Sets headers needed by proxies: specifically, the Accept and Host - headers. Only sets headers not provided by the user. - """ - headers_ = {'Accept': '*/*'} - - netloc = parse_url(url).netloc - if netloc: - headers_['Host'] = netloc - - if headers: - headers_.update(headers) - return headers_ - - def urlopen(self, method, url, redirect=True, **kw): - "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." - u = parse_url(url) - - if u.scheme == "http": - # For proxied HTTPS requests, httplib sets the necessary headers - # on the CONNECT to the proxy. For HTTP, we'll definitely - # need to set 'Host' at the very least. - headers = kw.get('headers', self.headers) - kw['headers'] = self._set_proxy_headers(url, headers) - - return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) - - -def proxy_from_url(url, **kw): - return ProxyManager(proxy_url=url, **kw) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/request.py b/Contents/Libraries/Shared/requests/packages/urllib3/request.py deleted file mode 100644 index c0fddff04..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/request.py +++ /dev/null @@ -1,148 +0,0 @@ -from __future__ import absolute_import - -from .filepost import encode_multipart_formdata -from .packages.six.moves.urllib.parse import urlencode - - -__all__ = ['RequestMethods'] - - -class RequestMethods(object): - """ - Convenience mixin for classes who implement a :meth:`urlopen` method, such - as :class:`~urllib3.connectionpool.HTTPConnectionPool` and - :class:`~urllib3.poolmanager.PoolManager`. - - Provides behavior for making common types of HTTP request methods and - decides which type of request field encoding to use. - - Specifically, - - :meth:`.request_encode_url` is for sending requests whose fields are - encoded in the URL (such as GET, HEAD, DELETE). - - :meth:`.request_encode_body` is for sending requests whose fields are - encoded in the *body* of the request using multipart or www-form-urlencoded - (such as for POST, PUT, PATCH). - - :meth:`.request` is for making any kind of request, it will look up the - appropriate encoding format and use one of the above two methods to make - the request. - - Initializer parameters: - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - """ - - _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS']) - - def __init__(self, headers=None): - self.headers = headers or {} - - def urlopen(self, method, url, body=None, headers=None, - encode_multipart=True, multipart_boundary=None, - **kw): # Abstract - raise NotImplemented("Classes extending RequestMethods must implement " - "their own ``urlopen`` method.") - - def request(self, method, url, fields=None, headers=None, **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the appropriate encoding of - ``fields`` based on the ``method`` used. - - This is a convenience method that requires the least amount of manual - effort. It can be used in most situations, while still having the - option to drop down to more specific methods when necessary, such as - :meth:`request_encode_url`, :meth:`request_encode_body`, - or even the lowest level :meth:`urlopen`. - """ - method = method.upper() - - if method in self._encode_url_methods: - return self.request_encode_url(method, url, fields=fields, - headers=headers, - **urlopen_kw) - else: - return self.request_encode_body(method, url, fields=fields, - headers=headers, - **urlopen_kw) - - def request_encode_url(self, method, url, fields=None, headers=None, - **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the url. This is useful for request methods like GET, HEAD, DELETE, etc. - """ - if headers is None: - headers = self.headers - - extra_kw = {'headers': headers} - extra_kw.update(urlopen_kw) - - if fields: - url += '?' + urlencode(fields) - - return self.urlopen(method, url, **extra_kw) - - def request_encode_body(self, method, url, fields=None, headers=None, - encode_multipart=True, multipart_boundary=None, - **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the body. This is useful for request methods like POST, PUT, PATCH, etc. - - When ``encode_multipart=True`` (default), then - :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode - the payload with the appropriate content type. Otherwise - :meth:`urllib.urlencode` is used with the - 'application/x-www-form-urlencoded' content type. - - Multipart encoding must be used when posting files, and it's reasonably - safe to use it in other times too. However, it may break request - signing, such as with OAuth. - - Supports an optional ``fields`` parameter of key/value strings AND - key/filetuple. A filetuple is a (filename, data, MIME type) tuple where - the MIME type is optional. For example:: - - fields = { - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), - 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - } - - When uploading a file, providing a filename (the first parameter of the - tuple) is optional but recommended to best mimick behavior of browsers. - - Note that if ``headers`` are supplied, the 'Content-Type' header will - be overwritten because it depends on the dynamic random boundary string - which is used to compose the body of the request. The random boundary - string can be explicitly set with the ``multipart_boundary`` parameter. - """ - if headers is None: - headers = self.headers - - extra_kw = {'headers': {}} - - if fields: - if 'body' in urlopen_kw: - raise TypeError( - "request got values for both 'fields' and 'body', can only specify one.") - - if encode_multipart: - body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) - else: - body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' - - extra_kw['body'] = body - extra_kw['headers'] = {'Content-Type': content_type} - - extra_kw['headers'].update(headers) - extra_kw.update(urlopen_kw) - - return self.urlopen(method, url, **extra_kw) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/response.py b/Contents/Libraries/Shared/requests/packages/urllib3/response.py deleted file mode 100644 index 6f1b63c8a..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/response.py +++ /dev/null @@ -1,618 +0,0 @@ -from __future__ import absolute_import -from contextlib import contextmanager -import zlib -import io -import logging -from socket import timeout as SocketTimeout -from socket import error as SocketError - -from ._collections import HTTPHeaderDict -from .exceptions import ( - BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, - ResponseNotChunked, IncompleteRead, InvalidHeader -) -from .packages.six import string_types as basestring, binary_type, PY3 -from .packages.six.moves import http_client as httplib -from .connection import HTTPException, BaseSSLError -from .util.response import is_fp_closed, is_response_to_head - -log = logging.getLogger(__name__) - - -class DeflateDecoder(object): - - def __init__(self): - self._first_try = True - self._data = binary_type() - self._obj = zlib.decompressobj() - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - if not data: - return data - - if not self._first_try: - return self._obj.decompress(data) - - self._data += data - try: - return self._obj.decompress(data) - except zlib.error: - self._first_try = False - self._obj = zlib.decompressobj(-zlib.MAX_WBITS) - try: - return self.decompress(self._data) - finally: - self._data = None - - -class GzipDecoder(object): - - def __init__(self): - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - if not data: - return data - return self._obj.decompress(data) - - -def _get_decoder(mode): - if mode == 'gzip': - return GzipDecoder() - - return DeflateDecoder() - - -class HTTPResponse(io.IOBase): - """ - HTTP Response container. - - Backwards-compatible to httplib's HTTPResponse but the response ``body`` is - loaded and decoded on-demand when the ``data`` property is accessed. This - class is also compatible with the Python standard library's :mod:`io` - module, and can hence be treated as a readable object in the context of that - framework. - - Extra parameters for behaviour not present in httplib.HTTPResponse: - - :param preload_content: - If True, the response's body will be preloaded during construction. - - :param decode_content: - If True, attempts to decode specific content-encoding's based on headers - (like 'gzip' and 'deflate') will be skipped and raw data will be used - instead. - - :param original_response: - When this HTTPResponse wrapper is generated from an httplib.HTTPResponse - object, it's convenient to include the original for debug purposes. It's - otherwise unused. - - :param retries: - The retries contains the last :class:`~urllib3.util.retry.Retry` that - was used during the request. - - :param enforce_content_length: - Enforce content length checking. Body returned by server must match - value of Content-Length header, if present. Otherwise, raise error. - """ - - CONTENT_DECODERS = ['gzip', 'deflate'] - REDIRECT_STATUSES = [301, 302, 303, 307, 308] - - def __init__(self, body='', headers=None, status=0, version=0, reason=None, - strict=0, preload_content=True, decode_content=True, - original_response=None, pool=None, connection=None, - retries=None, enforce_content_length=False, request_method=None): - - if isinstance(headers, HTTPHeaderDict): - self.headers = headers - else: - self.headers = HTTPHeaderDict(headers) - self.status = status - self.version = version - self.reason = reason - self.strict = strict - self.decode_content = decode_content - self.retries = retries - self.enforce_content_length = enforce_content_length - - self._decoder = None - self._body = None - self._fp = None - self._original_response = original_response - self._fp_bytes_read = 0 - - if body and isinstance(body, (basestring, binary_type)): - self._body = body - - self._pool = pool - self._connection = connection - - if hasattr(body, 'read'): - self._fp = body - - # Are we using the chunked-style of transfer encoding? - self.chunked = False - self.chunk_left = None - tr_enc = self.headers.get('transfer-encoding', '').lower() - # Don't incur the penalty of creating a list and then discarding it - encodings = (enc.strip() for enc in tr_enc.split(",")) - if "chunked" in encodings: - self.chunked = True - - # Determine length of response - self.length_remaining = self._init_length(request_method) - - # If requested, preload the body. - if preload_content and not self._body: - self._body = self.read(decode_content=decode_content) - - def get_redirect_location(self): - """ - Should we redirect and where to? - - :returns: Truthy redirect location string if we got a redirect status - code and valid location. ``None`` if redirect status and no - location. ``False`` if not a redirect status code. - """ - if self.status in self.REDIRECT_STATUSES: - return self.headers.get('location') - - return False - - def release_conn(self): - if not self._pool or not self._connection: - return - - self._pool._put_conn(self._connection) - self._connection = None - - @property - def data(self): - # For backwords-compat with earlier urllib3 0.4 and earlier. - if self._body: - return self._body - - if self._fp: - return self.read(cache_content=True) - - @property - def connection(self): - return self._connection - - def tell(self): - """ - Obtain the number of bytes pulled over the wire so far. May differ from - the amount of content returned by :meth:``HTTPResponse.read`` if bytes - are encoded on the wire (e.g, compressed). - """ - return self._fp_bytes_read - - def _init_length(self, request_method): - """ - Set initial length value for Response content if available. - """ - length = self.headers.get('content-length') - - if length is not None and self.chunked: - # This Response will fail with an IncompleteRead if it can't be - # received as chunked. This method falls back to attempt reading - # the response before raising an exception. - log.warning("Received response with both Content-Length and " - "Transfer-Encoding set. This is expressly forbidden " - "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " - "attempting to process response as Transfer-Encoding: " - "chunked.") - return None - - elif length is not None: - try: - # RFC 7230 section 3.3.2 specifies multiple content lengths can - # be sent in a single Content-Length header - # (e.g. Content-Length: 42, 42). This line ensures the values - # are all valid ints and that as long as the `set` length is 1, - # all values are the same. Otherwise, the header is invalid. - lengths = set([int(val) for val in length.split(',')]) - if len(lengths) > 1: - raise InvalidHeader("Content-Length contained multiple " - "unmatching values (%s)" % length) - length = lengths.pop() - except ValueError: - length = None - else: - if length < 0: - length = None - - # Convert status to int for comparison - # In some cases, httplib returns a status of "_UNKNOWN" - try: - status = int(self.status) - except ValueError: - status = 0 - - # Check for responses that shouldn't include a body - if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD': - length = 0 - - return length - - def _init_decoder(self): - """ - Set-up the _decoder attribute if necessary. - """ - # Note: content-encoding value should be case-insensitive, per RFC 7230 - # Section 3.2 - content_encoding = self.headers.get('content-encoding', '').lower() - if self._decoder is None and content_encoding in self.CONTENT_DECODERS: - self._decoder = _get_decoder(content_encoding) - - def _decode(self, data, decode_content, flush_decoder): - """ - Decode the data passed in and potentially flush the decoder. - """ - try: - if decode_content and self._decoder: - data = self._decoder.decompress(data) - except (IOError, zlib.error) as e: - content_encoding = self.headers.get('content-encoding', '').lower() - raise DecodeError( - "Received response with content-encoding: %s, but " - "failed to decode it." % content_encoding, e) - - if flush_decoder and decode_content: - data += self._flush_decoder() - - return data - - def _flush_decoder(self): - """ - Flushes the decoder. Should only be called if the decoder is actually - being used. - """ - if self._decoder: - buf = self._decoder.decompress(b'') - return buf + self._decoder.flush() - - return b'' - - @contextmanager - def _error_catcher(self): - """ - Catch low-level python exceptions, instead re-raising urllib3 - variants, so that low-level exceptions are not leaked in the - high-level api. - - On exit, release the connection back to the pool. - """ - clean_exit = False - - try: - try: - yield - - except SocketTimeout: - # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but - # there is yet no clean way to get at it from this context. - raise ReadTimeoutError(self._pool, None, 'Read timed out.') - - except BaseSSLError as e: - # FIXME: Is there a better way to differentiate between SSLErrors? - if 'read operation timed out' not in str(e): # Defensive: - # This shouldn't happen but just in case we're missing an edge - # case, let's avoid swallowing SSL errors. - raise - - raise ReadTimeoutError(self._pool, None, 'Read timed out.') - - except (HTTPException, SocketError) as e: - # This includes IncompleteRead. - raise ProtocolError('Connection broken: %r' % e, e) - - # If no exception is thrown, we should avoid cleaning up - # unnecessarily. - clean_exit = True - finally: - # If we didn't terminate cleanly, we need to throw away our - # connection. - if not clean_exit: - # The response may not be closed but we're not going to use it - # anymore so close it now to ensure that the connection is - # released back to the pool. - if self._original_response: - self._original_response.close() - - # Closing the response may not actually be sufficient to close - # everything, so if we have a hold of the connection close that - # too. - if self._connection: - self._connection.close() - - # If we hold the original response but it's closed now, we should - # return the connection back to the pool. - if self._original_response and self._original_response.isclosed(): - self.release_conn() - - def read(self, amt=None, decode_content=None, cache_content=False): - """ - Similar to :meth:`httplib.HTTPResponse.read`, but with two additional - parameters: ``decode_content`` and ``cache_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param cache_content: - If True, will save the returned data such that the same result is - returned despite of the state of the underlying file object. This - is useful if you want the ``.data`` property to continue working - after having ``.read()`` the file object. (Overridden if ``amt`` is - set.) - """ - self._init_decoder() - if decode_content is None: - decode_content = self.decode_content - - if self._fp is None: - return - - flush_decoder = False - data = None - - with self._error_catcher(): - if amt is None: - # cStringIO doesn't like amt=None - data = self._fp.read() - flush_decoder = True - else: - cache_content = False - data = self._fp.read(amt) - if amt != 0 and not data: # Platform-specific: Buggy versions of Python. - # Close the connection when no data is returned - # - # This is redundant to what httplib/http.client _should_ - # already do. However, versions of python released before - # December 15, 2012 (http://bugs.python.org/issue16298) do - # not properly close the connection in all cases. There is - # no harm in redundantly calling close. - self._fp.close() - flush_decoder = True - if self.enforce_content_length and self.length_remaining not in (0, None): - # This is an edge case that httplib failed to cover due - # to concerns of backward compatibility. We're - # addressing it here to make sure IncompleteRead is - # raised during streaming, so all calls with incorrect - # Content-Length are caught. - raise IncompleteRead(self._fp_bytes_read, self.length_remaining) - - if data: - self._fp_bytes_read += len(data) - if self.length_remaining is not None: - self.length_remaining -= len(data) - - data = self._decode(data, decode_content, flush_decoder) - - if cache_content: - self._body = data - - return data - - def stream(self, amt=2**16, decode_content=None): - """ - A generator wrapper for the read() method. A call will block until - ``amt`` bytes have been read from the connection or until the - connection is closed. - - :param amt: - How much of the content to read. The generator will return up to - much data per iteration, but may return less. This is particularly - likely when using compressed data. However, the empty string will - never be returned. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - if self.chunked and self.supports_chunked_reads(): - for line in self.read_chunked(amt, decode_content=decode_content): - yield line - else: - while not is_fp_closed(self._fp): - data = self.read(amt=amt, decode_content=decode_content) - - if data: - yield data - - @classmethod - def from_httplib(ResponseCls, r, **response_kw): - """ - Given an :class:`httplib.HTTPResponse` instance ``r``, return a - corresponding :class:`urllib3.response.HTTPResponse` object. - - Remaining parameters are passed to the HTTPResponse constructor, along - with ``original_response=r``. - """ - headers = r.msg - - if not isinstance(headers, HTTPHeaderDict): - if PY3: # Python 3 - headers = HTTPHeaderDict(headers.items()) - else: # Python 2 - headers = HTTPHeaderDict.from_httplib(headers) - - # HTTPResponse objects in Python 3 don't have a .strict attribute - strict = getattr(r, 'strict', 0) - resp = ResponseCls(body=r, - headers=headers, - status=r.status, - version=r.version, - reason=r.reason, - strict=strict, - original_response=r, - **response_kw) - return resp - - # Backwards-compatibility methods for httplib.HTTPResponse - def getheaders(self): - return self.headers - - def getheader(self, name, default=None): - return self.headers.get(name, default) - - # Overrides from io.IOBase - def close(self): - if not self.closed: - self._fp.close() - - if self._connection: - self._connection.close() - - @property - def closed(self): - if self._fp is None: - return True - elif hasattr(self._fp, 'isclosed'): - return self._fp.isclosed() - elif hasattr(self._fp, 'closed'): - return self._fp.closed - else: - return True - - def fileno(self): - if self._fp is None: - raise IOError("HTTPResponse has no file to get a fileno from") - elif hasattr(self._fp, "fileno"): - return self._fp.fileno() - else: - raise IOError("The file-like object this HTTPResponse is wrapped " - "around has no file descriptor") - - def flush(self): - if self._fp is not None and hasattr(self._fp, 'flush'): - return self._fp.flush() - - def readable(self): - # This method is required for `io` module compatibility. - return True - - def readinto(self, b): - # This method is required for `io` module compatibility. - temp = self.read(len(b)) - if len(temp) == 0: - return 0 - else: - b[:len(temp)] = temp - return len(temp) - - def supports_chunked_reads(self): - """ - Checks if the underlying file-like object looks like a - httplib.HTTPResponse object. We do this by testing for the fp - attribute. If it is present we assume it returns raw chunks as - processed by read_chunked(). - """ - return hasattr(self._fp, 'fp') - - def _update_chunk_length(self): - # First, we'll figure out length of a chunk and then - # we'll try to read it from socket. - if self.chunk_left is not None: - return - line = self._fp.fp.readline() - line = line.split(b';', 1)[0] - try: - self.chunk_left = int(line, 16) - except ValueError: - # Invalid chunked protocol response, abort. - self.close() - raise httplib.IncompleteRead(line) - - def _handle_chunk(self, amt): - returned_chunk = None - if amt is None: - chunk = self._fp._safe_read(self.chunk_left) - returned_chunk = chunk - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - elif amt < self.chunk_left: - value = self._fp._safe_read(amt) - self.chunk_left = self.chunk_left - amt - returned_chunk = value - elif amt == self.chunk_left: - value = self._fp._safe_read(amt) - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - returned_chunk = value - else: # amt > self.chunk_left - returned_chunk = self._fp._safe_read(self.chunk_left) - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - return returned_chunk - - def read_chunked(self, amt=None, decode_content=None): - """ - Similar to :meth:`HTTPResponse.read`, but with an additional - parameter: ``decode_content``. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - self._init_decoder() - # FIXME: Rewrite this method and make it a class with a better structured logic. - if not self.chunked: - raise ResponseNotChunked( - "Response is not chunked. " - "Header 'transfer-encoding: chunked' is missing.") - if not self.supports_chunked_reads(): - raise BodyNotHttplibCompatible( - "Body should be httplib.HTTPResponse like. " - "It should have have an fp attribute which returns raw chunks.") - - # Don't bother reading the body of a HEAD request. - if self._original_response and is_response_to_head(self._original_response): - self._original_response.close() - return - - with self._error_catcher(): - while True: - self._update_chunk_length() - if self.chunk_left == 0: - break - chunk = self._handle_chunk(amt) - decoded = self._decode(chunk, decode_content=decode_content, - flush_decoder=False) - if decoded: - yield decoded - - if decode_content: - # On CPython and PyPy, we should never need to flush the - # decoder. However, on Jython we *might* need to, so - # lets defensively do it anyway. - decoded = self._flush_decoder() - if decoded: # Platform-specific: Jython. - yield decoded - - # Chunk content ends with \r\n: discard it. - while True: - line = self._fp.fp.readline() - if not line: - # Some sites may not end with '\r\n'. - break - if line == b'\r\n': - break - - # We read everything; close the "file". - if self._original_response: - self._original_response.close() diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/__init__.py b/Contents/Libraries/Shared/requests/packages/urllib3/util/__init__.py deleted file mode 100644 index 5ced5a446..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/__init__.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import absolute_import -# For backwards compatibility, provide imports that used to be here. -from .connection import is_connection_dropped -from .request import make_headers -from .response import is_fp_closed -from .ssl_ import ( - SSLContext, - HAS_SNI, - IS_PYOPENSSL, - assert_fingerprint, - resolve_cert_reqs, - resolve_ssl_version, - ssl_wrap_socket, -) -from .timeout import ( - current_time, - Timeout, -) - -from .retry import Retry -from .url import ( - get_host, - parse_url, - split_first, - Url, -) -from .wait import ( - wait_for_read, - wait_for_write -) - -__all__ = ( - 'HAS_SNI', - 'IS_PYOPENSSL', - 'SSLContext', - 'Retry', - 'Timeout', - 'Url', - 'assert_fingerprint', - 'current_time', - 'is_connection_dropped', - 'is_fp_closed', - 'get_host', - 'parse_url', - 'make_headers', - 'resolve_cert_reqs', - 'resolve_ssl_version', - 'split_first', - 'ssl_wrap_socket', - 'wait_for_read', - 'wait_for_write' -) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/connection.py b/Contents/Libraries/Shared/requests/packages/urllib3/util/connection.py deleted file mode 100644 index bf699cfd0..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/connection.py +++ /dev/null @@ -1,130 +0,0 @@ -from __future__ import absolute_import -import socket -from .wait import wait_for_read -from .selectors import HAS_SELECT, SelectorError - - -def is_connection_dropped(conn): # Platform-specific - """ - Returns True if the connection is dropped and should be closed. - - :param conn: - :class:`httplib.HTTPConnection` object. - - Note: For platforms like AppEngine, this will always return ``False`` to - let the platform handle connection recycling transparently for us. - """ - sock = getattr(conn, 'sock', False) - if sock is False: # Platform-specific: AppEngine - return False - if sock is None: # Connection already closed (such as by httplib). - return True - - if not HAS_SELECT: - return False - - try: - return bool(wait_for_read(sock, timeout=0.0)) - except SelectorError: - return True - - -# This function is copied from socket.py in the Python 2.7 standard -# library test suite. Added to its signature is only `socket_options`. -# One additional modification is that we avoid binding to IPv6 servers -# discovered in DNS if the system doesn't have IPv6 functionality. -def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - source_address=None, socket_options=None): - """Connect to *address* and return the socket object. - - Convenience function. Connect to *address* (a 2-tuple ``(host, - port)``) and return the socket object. Passing the optional - *timeout* parameter will set the timeout on the socket instance - before attempting to connect. If no *timeout* is supplied, the - global default timeout setting returned by :func:`getdefaulttimeout` - is used. If *source_address* is set it must be a tuple of (host, port) - for the socket to bind as a source address before making the connection. - An host of '' or port 0 tells the OS to use the default. - """ - - host, port = address - if host.startswith('['): - host = host.strip('[]') - err = None - - # Using the value from allowed_gai_family() in the context of getaddrinfo lets - # us select whether to work with IPv4 DNS records, IPv6 records, or both. - # The original create_connection function always returns all records. - family = allowed_gai_family() - - for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): - af, socktype, proto, canonname, sa = res - sock = None - try: - sock = socket.socket(af, socktype, proto) - - # If provided, set socket level options before connecting. - _set_socket_options(sock, socket_options) - - if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: - sock.settimeout(timeout) - if source_address: - sock.bind(source_address) - sock.connect(sa) - return sock - - except socket.error as e: - err = e - if sock is not None: - sock.close() - sock = None - - if err is not None: - raise err - - raise socket.error("getaddrinfo returns an empty list") - - -def _set_socket_options(sock, options): - if options is None: - return - - for opt in options: - sock.setsockopt(*opt) - - -def allowed_gai_family(): - """This function is designed to work in the context of - getaddrinfo, where family=socket.AF_UNSPEC is the default and - will perform a DNS search for both IPv6 and IPv4 records.""" - - family = socket.AF_INET - if HAS_IPV6: - family = socket.AF_UNSPEC - return family - - -def _has_ipv6(host): - """ Returns True if the system can bind an IPv6 address. """ - sock = None - has_ipv6 = False - - if socket.has_ipv6: - # has_ipv6 returns true if cPython was compiled with IPv6 support. - # It does not tell us if the system has IPv6 support enabled. To - # determine that we must bind to an IPv6 address. - # https://github.com/shazow/urllib3/pull/611 - # https://bugs.python.org/issue658327 - try: - sock = socket.socket(socket.AF_INET6) - sock.bind((host, 0)) - has_ipv6 = True - except Exception: - pass - - if sock: - sock.close() - return has_ipv6 - - -HAS_IPV6 = _has_ipv6('::1') diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/request.py b/Contents/Libraries/Shared/requests/packages/urllib3/util/request.py deleted file mode 100644 index 974fc40a7..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/request.py +++ /dev/null @@ -1,118 +0,0 @@ -from __future__ import absolute_import -from base64 import b64encode - -from ..packages.six import b, integer_types -from ..exceptions import UnrewindableBodyError - -ACCEPT_ENCODING = 'gzip,deflate' -_FAILEDTELL = object() - - -def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, - basic_auth=None, proxy_basic_auth=None, disable_cache=None): - """ - Shortcuts for generating request headers. - - :param keep_alive: - If ``True``, adds 'connection: keep-alive' header. - - :param accept_encoding: - Can be a boolean, list, or string. - ``True`` translates to 'gzip,deflate'. - List will get joined by comma. - String will be used as provided. - - :param user_agent: - String representing the user-agent you want, such as - "python-urllib3/0.6" - - :param basic_auth: - Colon-separated username:password string for 'authorization: basic ...' - auth header. - - :param proxy_basic_auth: - Colon-separated username:password string for 'proxy-authorization: basic ...' - auth header. - - :param disable_cache: - If ``True``, adds 'cache-control: no-cache' header. - - Example:: - - >>> make_headers(keep_alive=True, user_agent="Batman/1.0") - {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} - >>> make_headers(accept_encoding=True) - {'accept-encoding': 'gzip,deflate'} - """ - headers = {} - if accept_encoding: - if isinstance(accept_encoding, str): - pass - elif isinstance(accept_encoding, list): - accept_encoding = ','.join(accept_encoding) - else: - accept_encoding = ACCEPT_ENCODING - headers['accept-encoding'] = accept_encoding - - if user_agent: - headers['user-agent'] = user_agent - - if keep_alive: - headers['connection'] = 'keep-alive' - - if basic_auth: - headers['authorization'] = 'Basic ' + \ - b64encode(b(basic_auth)).decode('utf-8') - - if proxy_basic_auth: - headers['proxy-authorization'] = 'Basic ' + \ - b64encode(b(proxy_basic_auth)).decode('utf-8') - - if disable_cache: - headers['cache-control'] = 'no-cache' - - return headers - - -def set_file_position(body, pos): - """ - If a position is provided, move file to that point. - Otherwise, we'll attempt to record a position for future use. - """ - if pos is not None: - rewind_body(body, pos) - elif getattr(body, 'tell', None) is not None: - try: - pos = body.tell() - except (IOError, OSError): - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body. - pos = _FAILEDTELL - - return pos - - -def rewind_body(body, body_pos): - """ - Attempt to rewind body to a certain position. - Primarily used for request redirects and retries. - - :param body: - File-like object that supports seek. - - :param int pos: - Position to seek to in file. - """ - body_seek = getattr(body, 'seek', None) - if body_seek is not None and isinstance(body_pos, integer_types): - try: - body_seek(body_pos) - except (IOError, OSError): - raise UnrewindableBodyError("An error occured when rewinding request " - "body for redirect/retry.") - elif body_pos is _FAILEDTELL: - raise UnrewindableBodyError("Unable to record file position for rewinding " - "request body during a redirect/retry.") - else: - raise ValueError("body_pos must be of type integer, " - "instead it was %s." % type(body_pos)) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/response.py b/Contents/Libraries/Shared/requests/packages/urllib3/util/response.py deleted file mode 100644 index 67cf730ab..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/response.py +++ /dev/null @@ -1,81 +0,0 @@ -from __future__ import absolute_import -from ..packages.six.moves import http_client as httplib - -from ..exceptions import HeaderParsingError - - -def is_fp_closed(obj): - """ - Checks whether a given file-like object is closed. - - :param obj: - The file-like object to check. - """ - - try: - # Check `isclosed()` first, in case Python3 doesn't set `closed`. - # GH Issue #928 - return obj.isclosed() - except AttributeError: - pass - - try: - # Check via the official file-like-object way. - return obj.closed - except AttributeError: - pass - - try: - # Check if the object is a container for another file-like object that - # gets released on exhaustion (e.g. HTTPResponse). - return obj.fp is None - except AttributeError: - pass - - raise ValueError("Unable to determine whether fp is closed.") - - -def assert_header_parsing(headers): - """ - Asserts whether all headers have been successfully parsed. - Extracts encountered errors from the result of parsing headers. - - Only works on Python 3. - - :param headers: Headers to verify. - :type headers: `httplib.HTTPMessage`. - - :raises urllib3.exceptions.HeaderParsingError: - If parsing errors are found. - """ - - # This will fail silently if we pass in the wrong kind of parameter. - # To make debugging easier add an explicit check. - if not isinstance(headers, httplib.HTTPMessage): - raise TypeError('expected httplib.Message, got {0}.'.format( - type(headers))) - - defects = getattr(headers, 'defects', None) - get_payload = getattr(headers, 'get_payload', None) - - unparsed_data = None - if get_payload: # Platform-specific: Python 3. - unparsed_data = get_payload() - - if defects or unparsed_data: - raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) - - -def is_response_to_head(response): - """ - Checks whether the request of a response has been a HEAD-request. - Handles the quirks of AppEngine. - - :param conn: - :type conn: :class:`httplib.HTTPResponse` - """ - # FIXME: Can we do this somehow without accessing private httplib _method? - method = response._method - if isinstance(method, int): # Platform-specific: Appengine - return method == 3 - return method.upper() == 'HEAD' diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/retry.py b/Contents/Libraries/Shared/requests/packages/urllib3/util/retry.py deleted file mode 100644 index c9e7d2873..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/retry.py +++ /dev/null @@ -1,389 +0,0 @@ -from __future__ import absolute_import -import time -import logging -from collections import namedtuple -from itertools import takewhile -import email -import re - -from ..exceptions import ( - ConnectTimeoutError, - MaxRetryError, - ProtocolError, - ReadTimeoutError, - ResponseError, - InvalidHeader, -) -from ..packages import six - - -log = logging.getLogger(__name__) - -# Data structure for representing the metadata of requests that result in a retry. -RequestHistory = namedtuple('RequestHistory', ["method", "url", "error", - "status", "redirect_location"]) - - -class Retry(object): - """ Retry configuration. - - Each retry attempt will create a new Retry object with updated values, so - they can be safely reused. - - Retries can be defined as a default for a pool:: - - retries = Retry(connect=5, read=2, redirect=5) - http = PoolManager(retries=retries) - response = http.request('GET', 'http://example.com/') - - Or per-request (which overrides the default for the pool):: - - response = http.request('GET', 'http://example.com/', retries=Retry(10)) - - Retries can be disabled by passing ``False``:: - - response = http.request('GET', 'http://example.com/', retries=False) - - Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless - retries are disabled, in which case the causing exception will be raised. - - :param int total: - Total number of retries to allow. Takes precedence over other counts. - - Set to ``None`` to remove this constraint and fall back on other - counts. It's a good idea to set this to some sensibly-high value to - account for unexpected edge cases and avoid infinite retry loops. - - Set to ``0`` to fail on the first retry. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int connect: - How many connection-related errors to retry on. - - These are errors raised before the request is sent to the remote server, - which we assume has not triggered the server to process the request. - - Set to ``0`` to fail on the first retry of this type. - - :param int read: - How many times to retry on read errors. - - These errors are raised after the request was sent to the server, so the - request may have side-effects. - - Set to ``0`` to fail on the first retry of this type. - - :param int redirect: - How many redirects to perform. Limit this to avoid infinite redirect - loops. - - A redirect is a HTTP response with a status code 301, 302, 303, 307 or - 308. - - Set to ``0`` to fail on the first retry of this type. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param iterable method_whitelist: - Set of uppercased HTTP method verbs that we should retry on. - - By default, we only retry on methods which are considered to be - idempotent (multiple requests with the same parameters end with the - same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. - - Set to a ``False`` value to retry on any verb. - - :param iterable status_forcelist: - A set of integer HTTP status codes that we should force a retry on. - A retry is initiated if the request method is in ``method_whitelist`` - and the response status code is in ``status_forcelist``. - - By default, this is disabled with ``None``. - - :param float backoff_factor: - A backoff factor to apply between attempts after the second try - (most errors are resolved immediately by a second try without a - delay). urllib3 will sleep for:: - - {backoff factor} * (2 ^ ({number of total retries} - 1)) - - seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep - for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer - than :attr:`Retry.BACKOFF_MAX`. - - By default, backoff is disabled (set to 0). - - :param bool raise_on_redirect: Whether, if the number of redirects is - exhausted, to raise a MaxRetryError, or to return a response with a - response code in the 3xx range. - - :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: - whether we should raise an exception, or return a response, - if status falls in ``status_forcelist`` range and retries have - been exhausted. - - :param tuple history: The history of the request encountered during - each call to :meth:`~Retry.increment`. The list is in the order - the requests occurred. Each list item is of class :class:`RequestHistory`. - - :param bool respect_retry_after_header: - Whether to respect Retry-After header on status codes defined as - :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. - - """ - - DEFAULT_METHOD_WHITELIST = frozenset([ - 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) - - RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) - - #: Maximum backoff time. - BACKOFF_MAX = 120 - - def __init__(self, total=10, connect=None, read=None, redirect=None, - method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, - backoff_factor=0, raise_on_redirect=True, raise_on_status=True, - history=None, respect_retry_after_header=True): - - self.total = total - self.connect = connect - self.read = read - - if redirect is False or total is False: - redirect = 0 - raise_on_redirect = False - - self.redirect = redirect - self.status_forcelist = status_forcelist or set() - self.method_whitelist = method_whitelist - self.backoff_factor = backoff_factor - self.raise_on_redirect = raise_on_redirect - self.raise_on_status = raise_on_status - self.history = history or tuple() - self.respect_retry_after_header = respect_retry_after_header - - def new(self, **kw): - params = dict( - total=self.total, - connect=self.connect, read=self.read, redirect=self.redirect, - method_whitelist=self.method_whitelist, - status_forcelist=self.status_forcelist, - backoff_factor=self.backoff_factor, - raise_on_redirect=self.raise_on_redirect, - raise_on_status=self.raise_on_status, - history=self.history, - ) - params.update(kw) - return type(self)(**params) - - @classmethod - def from_int(cls, retries, redirect=True, default=None): - """ Backwards-compatibility for the old retries format.""" - if retries is None: - retries = default if default is not None else cls.DEFAULT - - if isinstance(retries, Retry): - return retries - - redirect = bool(redirect) and None - new_retries = cls(retries, redirect=redirect) - log.debug("Converted retries value: %r -> %r", retries, new_retries) - return new_retries - - def get_backoff_time(self): - """ Formula for computing the current backoff - - :rtype: float - """ - # We want to consider only the last consecutive errors sequence (Ignore redirects). - consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, - reversed(self.history)))) - if consecutive_errors_len <= 1: - return 0 - - backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) - return min(self.BACKOFF_MAX, backoff_value) - - def parse_retry_after(self, retry_after): - # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 - if re.match(r"^\s*[0-9]+\s*$", retry_after): - seconds = int(retry_after) - else: - retry_date_tuple = email.utils.parsedate(retry_after) - if retry_date_tuple is None: - raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) - retry_date = time.mktime(retry_date_tuple) - seconds = retry_date - time.time() - - if seconds < 0: - seconds = 0 - - return seconds - - def get_retry_after(self, response): - """ Get the value of Retry-After in seconds. """ - - retry_after = response.getheader("Retry-After") - - if retry_after is None: - return None - - return self.parse_retry_after(retry_after) - - def sleep_for_retry(self, response=None): - retry_after = self.get_retry_after(response) - if retry_after: - time.sleep(retry_after) - return True - - return False - - def _sleep_backoff(self): - backoff = self.get_backoff_time() - if backoff <= 0: - return - time.sleep(backoff) - - def sleep(self, response=None): - """ Sleep between retry attempts. - - This method will respect a server's ``Retry-After`` response header - and sleep the duration of the time requested. If that is not present, it - will use an exponential backoff. By default, the backoff factor is 0 and - this method will return immediately. - """ - - if response: - slept = self.sleep_for_retry(response) - if slept: - return - - self._sleep_backoff() - - def _is_connection_error(self, err): - """ Errors when we're fairly sure that the server did not receive the - request, so it should be safe to retry. - """ - return isinstance(err, ConnectTimeoutError) - - def _is_read_error(self, err): - """ Errors that occur after the request has been started, so we should - assume that the server began processing it. - """ - return isinstance(err, (ReadTimeoutError, ProtocolError)) - - def _is_method_retryable(self, method): - """ Checks if a given HTTP method should be retried upon, depending if - it is included on the method whitelist. - """ - if self.method_whitelist and method.upper() not in self.method_whitelist: - return False - - return True - - def is_retry(self, method, status_code, has_retry_after=False): - """ Is this method/status code retryable? (Based on whitelists and control - variables such as the number of total retries to allow, whether to - respect the Retry-After header, whether this header is present, and - whether the returned status code is on the list of status codes to - be retried upon on the presence of the aforementioned header) - """ - if not self._is_method_retryable(method): - return False - - if self.status_forcelist and status_code in self.status_forcelist: - return True - - return (self.total and self.respect_retry_after_header and - has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES)) - - def is_exhausted(self): - """ Are we out of retries? """ - retry_counts = (self.total, self.connect, self.read, self.redirect) - retry_counts = list(filter(None, retry_counts)) - if not retry_counts: - return False - - return min(retry_counts) < 0 - - def increment(self, method=None, url=None, response=None, error=None, - _pool=None, _stacktrace=None): - """ Return a new Retry object with incremented retry counters. - - :param response: A response object, or None, if the server did not - return a response. - :type response: :class:`~urllib3.response.HTTPResponse` - :param Exception error: An error encountered during the request, or - None if the response was received successfully. - - :return: A new ``Retry`` object. - """ - if self.total is False and error: - # Disabled, indicate to re-raise the error. - raise six.reraise(type(error), error, _stacktrace) - - total = self.total - if total is not None: - total -= 1 - - connect = self.connect - read = self.read - redirect = self.redirect - cause = 'unknown' - status = None - redirect_location = None - - if error and self._is_connection_error(error): - # Connect retry? - if connect is False: - raise six.reraise(type(error), error, _stacktrace) - elif connect is not None: - connect -= 1 - - elif error and self._is_read_error(error): - # Read retry? - if read is False or not self._is_method_retryable(method): - raise six.reraise(type(error), error, _stacktrace) - elif read is not None: - read -= 1 - - elif response and response.get_redirect_location(): - # Redirect retry? - if redirect is not None: - redirect -= 1 - cause = 'too many redirects' - redirect_location = response.get_redirect_location() - status = response.status - - else: - # Incrementing because of a server error like a 500 in - # status_forcelist and a the given method is in the whitelist - cause = ResponseError.GENERIC_ERROR - if response and response.status: - cause = ResponseError.SPECIFIC_ERROR.format( - status_code=response.status) - status = response.status - - history = self.history + (RequestHistory(method, url, error, status, redirect_location),) - - new_retry = self.new( - total=total, - connect=connect, read=read, redirect=redirect, - history=history) - - if new_retry.is_exhausted(): - raise MaxRetryError(_pool, url, error or ResponseError(cause)) - - log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) - - return new_retry - - def __repr__(self): - return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' - 'read={self.read}, redirect={self.redirect})').format( - cls=type(self), self=self) - - -# For backwards compatibility (equivalent to pre-v1.9): -Retry.DEFAULT = Retry(3) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/selectors.py b/Contents/Libraries/Shared/requests/packages/urllib3/util/selectors.py deleted file mode 100644 index 51208b69a..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/selectors.py +++ /dev/null @@ -1,524 +0,0 @@ -# Backport of selectors.py from Python 3.5+ to support Python < 3.4 -# Also has the behavior specified in PEP 475 which is to retry syscalls -# in the case of an EINTR error. This module is required because selectors34 -# does not follow this behavior and instead returns that no dile descriptor -# events have occurred rather than retry the syscall. The decision to drop -# support for select.devpoll is made to maintain 100% test coverage. - -import errno -import math -import select -from collections import namedtuple, Mapping - -import time -try: - monotonic = time.monotonic -except (AttributeError, ImportError): # Python 3.3< - monotonic = time.time - -EVENT_READ = (1 << 0) -EVENT_WRITE = (1 << 1) - -HAS_SELECT = True # Variable that shows whether the platform has a selector. -_SYSCALL_SENTINEL = object() # Sentinel in case a system call returns None. - - -class SelectorError(Exception): - def __init__(self, errcode): - super(SelectorError, self).__init__() - self.errno = errcode - - def __repr__(self): - return "".format(self.errno) - - def __str__(self): - return self.__repr__() - - -def _fileobj_to_fd(fileobj): - """ Return a file descriptor from a file object. If - given an integer will simply return that integer back. """ - if isinstance(fileobj, int): - fd = fileobj - else: - try: - fd = int(fileobj.fileno()) - except (AttributeError, TypeError, ValueError): - raise ValueError("Invalid file object: {0!r}".format(fileobj)) - if fd < 0: - raise ValueError("Invalid file descriptor: {0}".format(fd)) - return fd - - -def _syscall_wrapper(func, recalc_timeout, *args, **kwargs): - """ Wrapper function for syscalls that could fail due to EINTR. - All functions should be retried if there is time left in the timeout - in accordance with PEP 475. """ - timeout = kwargs.get("timeout", None) - if timeout is None: - expires = None - recalc_timeout = False - else: - timeout = float(timeout) - if timeout < 0.0: # Timeout less than 0 treated as no timeout. - expires = None - else: - expires = monotonic() + timeout - - args = list(args) - if recalc_timeout and "timeout" not in kwargs: - raise ValueError( - "Timeout must be in args or kwargs to be recalculated") - - result = _SYSCALL_SENTINEL - while result is _SYSCALL_SENTINEL: - try: - result = func(*args, **kwargs) - # OSError is thrown by select.select - # IOError is thrown by select.epoll.poll - # select.error is thrown by select.poll.poll - # Aren't we thankful for Python 3.x rework for exceptions? - except (OSError, IOError, select.error) as e: - # select.error wasn't a subclass of OSError in the past. - errcode = None - if hasattr(e, "errno"): - errcode = e.errno - elif hasattr(e, "args"): - errcode = e.args[0] - - # Also test for the Windows equivalent of EINTR. - is_interrupt = (errcode == errno.EINTR or (hasattr(errno, "WSAEINTR") and - errcode == errno.WSAEINTR)) - - if is_interrupt: - if expires is not None: - current_time = monotonic() - if current_time > expires: - raise OSError(errno=errno.ETIMEDOUT) - if recalc_timeout: - if "timeout" in kwargs: - kwargs["timeout"] = expires - current_time - continue - if errcode: - raise SelectorError(errcode) - else: - raise - return result - - -SelectorKey = namedtuple('SelectorKey', ['fileobj', 'fd', 'events', 'data']) - - -class _SelectorMapping(Mapping): - """ Mapping of file objects to selector keys """ - - def __init__(self, selector): - self._selector = selector - - def __len__(self): - return len(self._selector._fd_to_key) - - def __getitem__(self, fileobj): - try: - fd = self._selector._fileobj_lookup(fileobj) - return self._selector._fd_to_key[fd] - except KeyError: - raise KeyError("{0!r} is not registered.".format(fileobj)) - - def __iter__(self): - return iter(self._selector._fd_to_key) - - -class BaseSelector(object): - """ Abstract Selector class - - A selector supports registering file objects to be monitored - for specific I/O events. - - A file object is a file descriptor or any object with a - `fileno()` method. An arbitrary object can be attached to the - file object which can be used for example to store context info, - a callback, etc. - - A selector can use various implementations (select(), poll(), epoll(), - and kqueue()) depending on the platform. The 'DefaultSelector' class uses - the most efficient implementation for the current platform. - """ - def __init__(self): - # Maps file descriptors to keys. - self._fd_to_key = {} - - # Read-only mapping returned by get_map() - self._map = _SelectorMapping(self) - - def _fileobj_lookup(self, fileobj): - """ Return a file descriptor from a file object. - This wraps _fileobj_to_fd() to do an exhaustive - search in case the object is invalid but we still - have it in our map. Used by unregister() so we can - unregister an object that was previously registered - even if it is closed. It is also used by _SelectorMapping - """ - try: - return _fileobj_to_fd(fileobj) - except ValueError: - - # Search through all our mapped keys. - for key in self._fd_to_key.values(): - if key.fileobj is fileobj: - return key.fd - - # Raise ValueError after all. - raise - - def register(self, fileobj, events, data=None): - """ Register a file object for a set of events to monitor. """ - if (not events) or (events & ~(EVENT_READ | EVENT_WRITE)): - raise ValueError("Invalid events: {0!r}".format(events)) - - key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data) - - if key.fd in self._fd_to_key: - raise KeyError("{0!r} (FD {1}) is already registered" - .format(fileobj, key.fd)) - - self._fd_to_key[key.fd] = key - return key - - def unregister(self, fileobj): - """ Unregister a file object from being monitored. """ - try: - key = self._fd_to_key.pop(self._fileobj_lookup(fileobj)) - except KeyError: - raise KeyError("{0!r} is not registered".format(fileobj)) - return key - - def modify(self, fileobj, events, data=None): - """ Change a registered file object monitored events and data. """ - # NOTE: Some subclasses optimize this operation even further. - try: - key = self._fd_to_key[self._fileobj_lookup(fileobj)] - except KeyError: - raise KeyError("{0!r} is not registered".format(fileobj)) - - if events != key.events: - self.unregister(fileobj) - key = self.register(fileobj, events, data) - - elif data != key.data: - # Use a shortcut to update the data. - key = key._replace(data=data) - self._fd_to_key[key.fd] = key - - return key - - def select(self, timeout=None): - """ Perform the actual selection until some monitored file objects - are ready or the timeout expires. """ - raise NotImplementedError() - - def close(self): - """ Close the selector. This must be called to ensure that all - underlying resources are freed. """ - self._fd_to_key.clear() - self._map = None - - def get_key(self, fileobj): - """ Return the key associated with a registered file object. """ - mapping = self.get_map() - if mapping is None: - raise RuntimeError("Selector is closed") - try: - return mapping[fileobj] - except KeyError: - raise KeyError("{0!r} is not registered".format(fileobj)) - - def get_map(self): - """ Return a mapping of file objects to selector keys """ - return self._map - - def _key_from_fd(self, fd): - """ Return the key associated to a given file descriptor - Return None if it is not found. """ - try: - return self._fd_to_key[fd] - except KeyError: - return None - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - -# Almost all platforms have select.select() -if hasattr(select, "select"): - class SelectSelector(BaseSelector): - """ Select-based selector. """ - def __init__(self): - super(SelectSelector, self).__init__() - self._readers = set() - self._writers = set() - - def register(self, fileobj, events, data=None): - key = super(SelectSelector, self).register(fileobj, events, data) - if events & EVENT_READ: - self._readers.add(key.fd) - if events & EVENT_WRITE: - self._writers.add(key.fd) - return key - - def unregister(self, fileobj): - key = super(SelectSelector, self).unregister(fileobj) - self._readers.discard(key.fd) - self._writers.discard(key.fd) - return key - - def _select(self, r, w, timeout=None): - """ Wrapper for select.select because timeout is a positional arg """ - return select.select(r, w, [], timeout) - - def select(self, timeout=None): - # Selecting on empty lists on Windows errors out. - if not len(self._readers) and not len(self._writers): - return [] - - timeout = None if timeout is None else max(timeout, 0.0) - ready = [] - r, w, _ = _syscall_wrapper(self._select, True, self._readers, - self._writers, timeout) - r = set(r) - w = set(w) - for fd in r | w: - events = 0 - if fd in r: - events |= EVENT_READ - if fd in w: - events |= EVENT_WRITE - - key = self._key_from_fd(fd) - if key: - ready.append((key, events & key.events)) - return ready - - -if hasattr(select, "poll"): - class PollSelector(BaseSelector): - """ Poll-based selector """ - def __init__(self): - super(PollSelector, self).__init__() - self._poll = select.poll() - - def register(self, fileobj, events, data=None): - key = super(PollSelector, self).register(fileobj, events, data) - event_mask = 0 - if events & EVENT_READ: - event_mask |= select.POLLIN - if events & EVENT_WRITE: - event_mask |= select.POLLOUT - self._poll.register(key.fd, event_mask) - return key - - def unregister(self, fileobj): - key = super(PollSelector, self).unregister(fileobj) - self._poll.unregister(key.fd) - return key - - def _wrap_poll(self, timeout=None): - """ Wrapper function for select.poll.poll() so that - _syscall_wrapper can work with only seconds. """ - if timeout is not None: - if timeout <= 0: - timeout = 0 - else: - # select.poll.poll() has a resolution of 1 millisecond, - # round away from zero to wait *at least* timeout seconds. - timeout = math.ceil(timeout * 1e3) - - result = self._poll.poll(timeout) - return result - - def select(self, timeout=None): - ready = [] - fd_events = _syscall_wrapper(self._wrap_poll, True, timeout=timeout) - for fd, event_mask in fd_events: - events = 0 - if event_mask & ~select.POLLIN: - events |= EVENT_WRITE - if event_mask & ~select.POLLOUT: - events |= EVENT_READ - - key = self._key_from_fd(fd) - if key: - ready.append((key, events & key.events)) - - return ready - - -if hasattr(select, "epoll"): - class EpollSelector(BaseSelector): - """ Epoll-based selector """ - def __init__(self): - super(EpollSelector, self).__init__() - self._epoll = select.epoll() - - def fileno(self): - return self._epoll.fileno() - - def register(self, fileobj, events, data=None): - key = super(EpollSelector, self).register(fileobj, events, data) - events_mask = 0 - if events & EVENT_READ: - events_mask |= select.EPOLLIN - if events & EVENT_WRITE: - events_mask |= select.EPOLLOUT - _syscall_wrapper(self._epoll.register, False, key.fd, events_mask) - return key - - def unregister(self, fileobj): - key = super(EpollSelector, self).unregister(fileobj) - try: - _syscall_wrapper(self._epoll.unregister, False, key.fd) - except SelectorError: - # This can occur when the fd was closed since registry. - pass - return key - - def select(self, timeout=None): - if timeout is not None: - if timeout <= 0: - timeout = 0.0 - else: - # select.epoll.poll() has a resolution of 1 millisecond - # but luckily takes seconds so we don't need a wrapper - # like PollSelector. Just for better rounding. - timeout = math.ceil(timeout * 1e3) * 1e-3 - timeout = float(timeout) - else: - timeout = -1.0 # epoll.poll() must have a float. - - # We always want at least 1 to ensure that select can be called - # with no file descriptors registered. Otherwise will fail. - max_events = max(len(self._fd_to_key), 1) - - ready = [] - fd_events = _syscall_wrapper(self._epoll.poll, True, - timeout=timeout, - maxevents=max_events) - for fd, event_mask in fd_events: - events = 0 - if event_mask & ~select.EPOLLIN: - events |= EVENT_WRITE - if event_mask & ~select.EPOLLOUT: - events |= EVENT_READ - - key = self._key_from_fd(fd) - if key: - ready.append((key, events & key.events)) - return ready - - def close(self): - self._epoll.close() - super(EpollSelector, self).close() - - -if hasattr(select, "kqueue"): - class KqueueSelector(BaseSelector): - """ Kqueue / Kevent-based selector """ - def __init__(self): - super(KqueueSelector, self).__init__() - self._kqueue = select.kqueue() - - def fileno(self): - return self._kqueue.fileno() - - def register(self, fileobj, events, data=None): - key = super(KqueueSelector, self).register(fileobj, events, data) - if events & EVENT_READ: - kevent = select.kevent(key.fd, - select.KQ_FILTER_READ, - select.KQ_EV_ADD) - - _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) - - if events & EVENT_WRITE: - kevent = select.kevent(key.fd, - select.KQ_FILTER_WRITE, - select.KQ_EV_ADD) - - _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) - - return key - - def unregister(self, fileobj): - key = super(KqueueSelector, self).unregister(fileobj) - if key.events & EVENT_READ: - kevent = select.kevent(key.fd, - select.KQ_FILTER_READ, - select.KQ_EV_DELETE) - try: - _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) - except SelectorError: - pass - if key.events & EVENT_WRITE: - kevent = select.kevent(key.fd, - select.KQ_FILTER_WRITE, - select.KQ_EV_DELETE) - try: - _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) - except SelectorError: - pass - - return key - - def select(self, timeout=None): - if timeout is not None: - timeout = max(timeout, 0) - - max_events = len(self._fd_to_key) * 2 - ready_fds = {} - - kevent_list = _syscall_wrapper(self._kqueue.control, True, - None, max_events, timeout) - - for kevent in kevent_list: - fd = kevent.ident - event_mask = kevent.filter - events = 0 - if event_mask == select.KQ_FILTER_READ: - events |= EVENT_READ - if event_mask == select.KQ_FILTER_WRITE: - events |= EVENT_WRITE - - key = self._key_from_fd(fd) - if key: - if key.fd not in ready_fds: - ready_fds[key.fd] = (key, events & key.events) - else: - old_events = ready_fds[key.fd][1] - ready_fds[key.fd] = (key, (events | old_events) & key.events) - - return list(ready_fds.values()) - - def close(self): - self._kqueue.close() - super(KqueueSelector, self).close() - - -# Choose the best implementation, roughly: -# kqueue == epoll > poll > select. Devpoll not supported. (See above) -# select() also can't accept a FD > FD_SETSIZE (usually around 1024) -if 'KqueueSelector' in globals(): # Platform-specific: Mac OS and BSD - DefaultSelector = KqueueSelector -elif 'EpollSelector' in globals(): # Platform-specific: Linux - DefaultSelector = EpollSelector -elif 'PollSelector' in globals(): # Platform-specific: Linux - DefaultSelector = PollSelector -elif 'SelectSelector' in globals(): # Platform-specific: Windows - DefaultSelector = SelectSelector -else: # Platform-specific: AppEngine - def no_selector(_): - raise ValueError("Platform does not have a selector") - DefaultSelector = no_selector - HAS_SELECT = False diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/ssl_.py b/Contents/Libraries/Shared/requests/packages/urllib3/util/ssl_.py deleted file mode 100644 index c4c55df63..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/ssl_.py +++ /dev/null @@ -1,336 +0,0 @@ -from __future__ import absolute_import -import errno -import warnings -import hmac - -from binascii import hexlify, unhexlify -from hashlib import md5, sha1, sha256 - -from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning - - -SSLContext = None -HAS_SNI = False -IS_PYOPENSSL = False - -# Maps the length of a digest to a possible hash function producing this digest -HASHFUNC_MAP = { - 32: md5, - 40: sha1, - 64: sha256, -} - - -def _const_compare_digest_backport(a, b): - """ - Compare two digests of equal length in constant time. - - The digests must be of type str/bytes. - Returns True if the digests match, and False otherwise. - """ - result = abs(len(a) - len(b)) - for l, r in zip(bytearray(a), bytearray(b)): - result |= l ^ r - return result == 0 - - -_const_compare_digest = getattr(hmac, 'compare_digest', - _const_compare_digest_backport) - - -try: # Test for SSL features - import ssl - from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 - from ssl import HAS_SNI # Has SNI? -except ImportError: - pass - - -try: - from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION -except ImportError: - OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 - OP_NO_COMPRESSION = 0x20000 - -# A secure default. -# Sources for more information on TLS ciphers: -# -# - https://wiki.mozilla.org/Security/Server_Side_TLS -# - https://www.ssllabs.com/projects/best-practices/index.html -# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ -# -# The general intent is: -# - Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), -# - prefer ECDHE over DHE for better performance, -# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and -# security, -# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, -# - disable NULL authentication, MD5 MACs and DSS for security reasons. -DEFAULT_CIPHERS = ':'.join([ - 'ECDH+AESGCM', - 'ECDH+CHACHA20', - 'DH+AESGCM', - 'DH+CHACHA20', - 'ECDH+AES256', - 'DH+AES256', - 'ECDH+AES128', - 'DH+AES', - 'RSA+AESGCM', - 'RSA+AES', - '!aNULL', - '!eNULL', - '!MD5', -]) - -try: - from ssl import SSLContext # Modern SSL? -except ImportError: - import sys - - class SSLContext(object): # Platform-specific: Python 2 & 3.1 - supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or - (3, 2) <= sys.version_info) - - def __init__(self, protocol_version): - self.protocol = protocol_version - # Use default values from a real SSLContext - self.check_hostname = False - self.verify_mode = ssl.CERT_NONE - self.ca_certs = None - self.options = 0 - self.certfile = None - self.keyfile = None - self.ciphers = None - - def load_cert_chain(self, certfile, keyfile): - self.certfile = certfile - self.keyfile = keyfile - - def load_verify_locations(self, cafile=None, capath=None): - self.ca_certs = cafile - - if capath is not None: - raise SSLError("CA directories not supported in older Pythons") - - def set_ciphers(self, cipher_suite): - if not self.supports_set_ciphers: - raise TypeError( - 'Your version of Python does not support setting ' - 'a custom cipher suite. Please upgrade to Python ' - '2.7, 3.2, or later if you need this functionality.' - ) - self.ciphers = cipher_suite - - def wrap_socket(self, socket, server_hostname=None, server_side=False): - warnings.warn( - 'A true SSLContext object is not available. This prevents ' - 'urllib3 from configuring SSL appropriately and may cause ' - 'certain SSL connections to fail. You can upgrade to a newer ' - 'version of Python to solve this. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings', - InsecurePlatformWarning - ) - kwargs = { - 'keyfile': self.keyfile, - 'certfile': self.certfile, - 'ca_certs': self.ca_certs, - 'cert_reqs': self.verify_mode, - 'ssl_version': self.protocol, - 'server_side': server_side, - } - if self.supports_set_ciphers: # Platform-specific: Python 2.7+ - return wrap_socket(socket, ciphers=self.ciphers, **kwargs) - else: # Platform-specific: Python 2.6 - return wrap_socket(socket, **kwargs) - - -def assert_fingerprint(cert, fingerprint): - """ - Checks if given fingerprint matches the supplied certificate. - - :param cert: - Certificate as bytes object. - :param fingerprint: - Fingerprint as string of hexdigits, can be interspersed by colons. - """ - - fingerprint = fingerprint.replace(':', '').lower() - digest_length = len(fingerprint) - hashfunc = HASHFUNC_MAP.get(digest_length) - if not hashfunc: - raise SSLError( - 'Fingerprint of invalid length: {0}'.format(fingerprint)) - - # We need encode() here for py32; works on py2 and p33. - fingerprint_bytes = unhexlify(fingerprint.encode()) - - cert_digest = hashfunc(cert).digest() - - if not _const_compare_digest(cert_digest, fingerprint_bytes): - raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' - .format(fingerprint, hexlify(cert_digest))) - - -def resolve_cert_reqs(candidate): - """ - Resolves the argument to a numeric constant, which can be passed to - the wrap_socket function/method from the ssl module. - Defaults to :data:`ssl.CERT_NONE`. - If given a string it is assumed to be the name of the constant in the - :mod:`ssl` module or its abbrevation. - (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. - If it's neither `None` nor a string we assume it is already the numeric - constant which can directly be passed to wrap_socket. - """ - if candidate is None: - return CERT_NONE - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, 'CERT_' + candidate) - return res - - return candidate - - -def resolve_ssl_version(candidate): - """ - like resolve_cert_reqs - """ - if candidate is None: - return PROTOCOL_SSLv23 - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, 'PROTOCOL_' + candidate) - return res - - return candidate - - -def create_urllib3_context(ssl_version=None, cert_reqs=None, - options=None, ciphers=None): - """All arguments have the same meaning as ``ssl_wrap_socket``. - - By default, this function does a lot of the same work that - ``ssl.create_default_context`` does on Python 3.4+. It: - - - Disables SSLv2, SSLv3, and compression - - Sets a restricted set of server ciphers - - If you wish to enable SSLv3, you can do:: - - from urllib3.util import ssl_ - context = ssl_.create_urllib3_context() - context.options &= ~ssl_.OP_NO_SSLv3 - - You can do the same to enable compression (substituting ``COMPRESSION`` - for ``SSLv3`` in the last line above). - - :param ssl_version: - The desired protocol version to use. This will default to - PROTOCOL_SSLv23 which will negotiate the highest protocol that both - the server and your installation of OpenSSL support. - :param cert_reqs: - Whether to require the certificate verification. This defaults to - ``ssl.CERT_REQUIRED``. - :param options: - Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, - ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. - :param ciphers: - Which cipher suites to allow the server to select. - :returns: - Constructed SSLContext object with specified options - :rtype: SSLContext - """ - context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) - - # Setting the default here, as we may have no ssl module on import - cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs - - if options is None: - options = 0 - # SSLv2 is easily broken and is considered harmful and dangerous - options |= OP_NO_SSLv2 - # SSLv3 has several problems and is now dangerous - options |= OP_NO_SSLv3 - # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ - # (issue #309) - options |= OP_NO_COMPRESSION - - context.options |= options - - if getattr(context, 'supports_set_ciphers', True): # Platform-specific: Python 2.6 - context.set_ciphers(ciphers or DEFAULT_CIPHERS) - - context.verify_mode = cert_reqs - if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 - # We do our own verification, including fingerprints and alternative - # hostnames. So disable it here - context.check_hostname = False - return context - - -def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, - ca_certs=None, server_hostname=None, - ssl_version=None, ciphers=None, ssl_context=None, - ca_cert_dir=None): - """ - All arguments except for server_hostname, ssl_context, and ca_cert_dir have - the same meaning as they do when using :func:`ssl.wrap_socket`. - - :param server_hostname: - When SNI is supported, the expected hostname of the certificate - :param ssl_context: - A pre-made :class:`SSLContext` object. If none is provided, one will - be created using :func:`create_urllib3_context`. - :param ciphers: - A string of ciphers we wish the client to support. This is not - supported on Python 2.6 as the ssl module does not support it. - :param ca_cert_dir: - A directory containing CA certificates in multiple separate files, as - supported by OpenSSL's -CApath flag or the capath argument to - SSLContext.load_verify_locations(). - """ - context = ssl_context - if context is None: - # Note: This branch of code and all the variables in it are no longer - # used by urllib3 itself. We should consider deprecating and removing - # this code. - context = create_urllib3_context(ssl_version, cert_reqs, - ciphers=ciphers) - - if ca_certs or ca_cert_dir: - try: - context.load_verify_locations(ca_certs, ca_cert_dir) - except IOError as e: # Platform-specific: Python 2.6, 2.7, 3.2 - raise SSLError(e) - # Py33 raises FileNotFoundError which subclasses OSError - # These are not equivalent unless we check the errno attribute - except OSError as e: # Platform-specific: Python 3.3 and beyond - if e.errno == errno.ENOENT: - raise SSLError(e) - raise - elif getattr(context, 'load_default_certs', None) is not None: - # try to load OS default certs; works well on Windows (require Python3.4+) - context.load_default_certs() - - if certfile: - context.load_cert_chain(certfile, keyfile) - if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI - return context.wrap_socket(sock, server_hostname=server_hostname) - - warnings.warn( - 'An HTTPS request has been made, but the SNI (Subject Name ' - 'Indication) extension to TLS is not available on this platform. ' - 'This may cause the server to present an incorrect TLS ' - 'certificate, which can cause validation failures. You can upgrade to ' - 'a newer version of Python to solve this. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings', - SNIMissingWarning - ) - return context.wrap_socket(sock) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/timeout.py b/Contents/Libraries/Shared/requests/packages/urllib3/util/timeout.py deleted file mode 100644 index cec817e6e..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/timeout.py +++ /dev/null @@ -1,242 +0,0 @@ -from __future__ import absolute_import -# The default socket timeout, used by httplib to indicate that no timeout was -# specified by the user -from socket import _GLOBAL_DEFAULT_TIMEOUT -import time - -from ..exceptions import TimeoutStateError - -# A sentinel value to indicate that no timeout was specified by the user in -# urllib3 -_Default = object() - - -# Use time.monotonic if available. -current_time = getattr(time, "monotonic", time.time) - - -class Timeout(object): - """ Timeout configuration. - - Timeouts can be defined as a default for a pool:: - - timeout = Timeout(connect=2.0, read=7.0) - http = PoolManager(timeout=timeout) - response = http.request('GET', 'http://example.com/') - - Or per-request (which overrides the default for the pool):: - - response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) - - Timeouts can be disabled by setting all the parameters to ``None``:: - - no_timeout = Timeout(connect=None, read=None) - response = http.request('GET', 'http://example.com/, timeout=no_timeout) - - - :param total: - This combines the connect and read timeouts into one; the read timeout - will be set to the time leftover from the connect attempt. In the - event that both a connect timeout and a total are specified, or a read - timeout and a total are specified, the shorter timeout will be applied. - - Defaults to None. - - :type total: integer, float, or None - - :param connect: - The maximum amount of time to wait for a connection attempt to a server - to succeed. Omitting the parameter will default the connect timeout to - the system default, probably `the global default timeout in socket.py - `_. - None will set an infinite timeout for connection attempts. - - :type connect: integer, float, or None - - :param read: - The maximum amount of time to wait between consecutive - read operations for a response from the server. Omitting - the parameter will default the read timeout to the system - default, probably `the global default timeout in socket.py - `_. - None will set an infinite timeout. - - :type read: integer, float, or None - - .. note:: - - Many factors can affect the total amount of time for urllib3 to return - an HTTP response. - - For example, Python's DNS resolver does not obey the timeout specified - on the socket. Other factors that can affect total request time include - high CPU load, high swap, the program running at a low priority level, - or other behaviors. - - In addition, the read and total timeouts only measure the time between - read operations on the socket connecting the client and the server, - not the total amount of time for the request to return a complete - response. For most requests, the timeout is raised because the server - has not sent the first byte in the specified time. This is not always - the case; if a server streams one byte every fifteen seconds, a timeout - of 20 seconds will not trigger, even though the request will take - several minutes to complete. - - If your goal is to cut off any request after a set amount of wall clock - time, consider having a second "watcher" thread to cut off a slow - request. - """ - - #: A sentinel object representing the default timeout value - DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT - - def __init__(self, total=None, connect=_Default, read=_Default): - self._connect = self._validate_timeout(connect, 'connect') - self._read = self._validate_timeout(read, 'read') - self.total = self._validate_timeout(total, 'total') - self._start_connect = None - - def __str__(self): - return '%s(connect=%r, read=%r, total=%r)' % ( - type(self).__name__, self._connect, self._read, self.total) - - @classmethod - def _validate_timeout(cls, value, name): - """ Check that a timeout attribute is valid. - - :param value: The timeout value to validate - :param name: The name of the timeout attribute to validate. This is - used to specify in error messages. - :return: The validated and casted version of the given value. - :raises ValueError: If it is a numeric value less than or equal to - zero, or the type is not an integer, float, or None. - """ - if value is _Default: - return cls.DEFAULT_TIMEOUT - - if value is None or value is cls.DEFAULT_TIMEOUT: - return value - - if isinstance(value, bool): - raise ValueError("Timeout cannot be a boolean value. It must " - "be an int, float or None.") - try: - float(value) - except (TypeError, ValueError): - raise ValueError("Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value)) - - try: - if value <= 0: - raise ValueError("Attempted to set %s timeout to %s, but the " - "timeout cannot be set to a value less " - "than or equal to 0." % (name, value)) - except TypeError: # Python 3 - raise ValueError("Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value)) - - return value - - @classmethod - def from_float(cls, timeout): - """ Create a new Timeout from a legacy timeout value. - - The timeout value used by httplib.py sets the same timeout on the - connect(), and recv() socket requests. This creates a :class:`Timeout` - object that sets the individual timeouts to the ``timeout`` value - passed to this function. - - :param timeout: The legacy timeout value. - :type timeout: integer, float, sentinel default object, or None - :return: Timeout object - :rtype: :class:`Timeout` - """ - return Timeout(read=timeout, connect=timeout) - - def clone(self): - """ Create a copy of the timeout object - - Timeout properties are stored per-pool but each request needs a fresh - Timeout object to ensure each one has its own start/stop configured. - - :return: a copy of the timeout object - :rtype: :class:`Timeout` - """ - # We can't use copy.deepcopy because that will also create a new object - # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to - # detect the user default. - return Timeout(connect=self._connect, read=self._read, - total=self.total) - - def start_connect(self): - """ Start the timeout clock, used during a connect() attempt - - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to start a timer that has been started already. - """ - if self._start_connect is not None: - raise TimeoutStateError("Timeout timer has already been started.") - self._start_connect = current_time() - return self._start_connect - - def get_connect_duration(self): - """ Gets the time elapsed since the call to :meth:`start_connect`. - - :return: Elapsed time. - :rtype: float - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to get duration for a timer that hasn't been started. - """ - if self._start_connect is None: - raise TimeoutStateError("Can't get connect duration for timer " - "that has not started.") - return current_time() - self._start_connect - - @property - def connect_timeout(self): - """ Get the value to use when setting a connection timeout. - - This will be a positive float or integer, the value None - (never timeout), or the default system timeout. - - :return: Connect timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - """ - if self.total is None: - return self._connect - - if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: - return self.total - - return min(self._connect, self.total) - - @property - def read_timeout(self): - """ Get the value for the read timeout. - - This assumes some time has elapsed in the connection timeout and - computes the read timeout appropriately. - - If self.total is set, the read timeout is dependent on the amount of - time taken by the connect timeout. If the connection time has not been - established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be - raised. - - :return: Value to use for the read timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` - has not yet been called on this object. - """ - if (self.total is not None and - self.total is not self.DEFAULT_TIMEOUT and - self._read is not None and - self._read is not self.DEFAULT_TIMEOUT): - # In case the connect timeout has not yet been established. - if self._start_connect is None: - return self._read - return max(0, min(self.total - self.get_connect_duration(), - self._read)) - elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: - return max(0, self.total - self.get_connect_duration()) - else: - return self._read diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/url.py b/Contents/Libraries/Shared/requests/packages/urllib3/util/url.py deleted file mode 100644 index 61a326e44..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/url.py +++ /dev/null @@ -1,226 +0,0 @@ -from __future__ import absolute_import -from collections import namedtuple - -from ..exceptions import LocationParseError - - -url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] - - -class Url(namedtuple('Url', url_attrs)): - """ - Datastructure for representing an HTTP URL. Used as a return value for - :func:`parse_url`. Both the scheme and host are normalized as they are - both case-insensitive according to RFC 3986. - """ - __slots__ = () - - def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, - query=None, fragment=None): - if path and not path.startswith('/'): - path = '/' + path - if scheme: - scheme = scheme.lower() - if host: - host = host.lower() - return super(Url, cls).__new__(cls, scheme, auth, host, port, path, - query, fragment) - - @property - def hostname(self): - """For backwards-compatibility with urlparse. We're nice like that.""" - return self.host - - @property - def request_uri(self): - """Absolute path including the query string.""" - uri = self.path or '/' - - if self.query is not None: - uri += '?' + self.query - - return uri - - @property - def netloc(self): - """Network location including host and port""" - if self.port: - return '%s:%d' % (self.host, self.port) - return self.host - - @property - def url(self): - """ - Convert self into a url - - This function should more or less round-trip with :func:`.parse_url`. The - returned url may not be exactly the same as the url inputted to - :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls - with a blank port will have : removed). - - Example: :: - - >>> U = parse_url('http://google.com/mail/') - >>> U.url - 'http://google.com/mail/' - >>> Url('http', 'username:password', 'host.com', 80, - ... '/path', 'query', 'fragment').url - 'http://username:password@host.com:80/path?query#fragment' - """ - scheme, auth, host, port, path, query, fragment = self - url = '' - - # We use "is not None" we want things to happen with empty strings (or 0 port) - if scheme is not None: - url += scheme + '://' - if auth is not None: - url += auth + '@' - if host is not None: - url += host - if port is not None: - url += ':' + str(port) - if path is not None: - url += path - if query is not None: - url += '?' + query - if fragment is not None: - url += '#' + fragment - - return url - - def __str__(self): - return self.url - - -def split_first(s, delims): - """ - Given a string and an iterable of delimiters, split on the first found - delimiter. Return two split parts and the matched delimiter. - - If not found, then the first part is the full input string. - - Example:: - - >>> split_first('foo/bar?baz', '?/=') - ('foo', 'bar?baz', '/') - >>> split_first('foo/bar?baz', '123') - ('foo/bar?baz', '', None) - - Scales linearly with number of delims. Not ideal for large number of delims. - """ - min_idx = None - min_delim = None - for d in delims: - idx = s.find(d) - if idx < 0: - continue - - if min_idx is None or idx < min_idx: - min_idx = idx - min_delim = d - - if min_idx is None or min_idx < 0: - return s, '', None - - return s[:min_idx], s[min_idx + 1:], min_delim - - -def parse_url(url): - """ - Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is - performed to parse incomplete urls. Fields not provided will be None. - - Partly backwards-compatible with :mod:`urlparse`. - - Example:: - - >>> parse_url('http://google.com/mail/') - Url(scheme='http', host='google.com', port=None, path='/mail/', ...) - >>> parse_url('google.com:80') - Url(scheme=None, host='google.com', port=80, path=None, ...) - >>> parse_url('/foo?bar') - Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) - """ - - # While this code has overlap with stdlib's urlparse, it is much - # simplified for our needs and less annoying. - # Additionally, this implementations does silly things to be optimal - # on CPython. - - if not url: - # Empty - return Url() - - scheme = None - auth = None - host = None - port = None - path = None - fragment = None - query = None - - # Scheme - if '://' in url: - scheme, url = url.split('://', 1) - - # Find the earliest Authority Terminator - # (http://tools.ietf.org/html/rfc3986#section-3.2) - url, path_, delim = split_first(url, ['/', '?', '#']) - - if delim: - # Reassemble the path - path = delim + path_ - - # Auth - if '@' in url: - # Last '@' denotes end of auth part - auth, url = url.rsplit('@', 1) - - # IPv6 - if url and url[0] == '[': - host, url = url.split(']', 1) - host += ']' - - # Port - if ':' in url: - _host, port = url.split(':', 1) - - if not host: - host = _host - - if port: - # If given, ports must be integers. No whitespace, no plus or - # minus prefixes, no non-integer digits such as ^2 (superscript). - if not port.isdigit(): - raise LocationParseError(url) - try: - port = int(port) - except ValueError: - raise LocationParseError(url) - else: - # Blank ports are cool, too. (rfc3986#section-3.2.3) - port = None - - elif not host and url: - host = url - - if not path: - return Url(scheme, auth, host, port, path, query, fragment) - - # Fragment - if '#' in path: - path, fragment = path.split('#', 1) - - # Query - if '?' in path: - path, query = path.split('?', 1) - - return Url(scheme, auth, host, port, path, query, fragment) - - -def get_host(url): - """ - Deprecated. Use :func:`parse_url` instead. - """ - p = parse_url(url) - return p.scheme or 'http', p.hostname, p.port diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/wait.py b/Contents/Libraries/Shared/requests/packages/urllib3/util/wait.py deleted file mode 100644 index cb396e508..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/wait.py +++ /dev/null @@ -1,40 +0,0 @@ -from .selectors import ( - HAS_SELECT, - DefaultSelector, - EVENT_READ, - EVENT_WRITE -) - - -def _wait_for_io_events(socks, events, timeout=None): - """ Waits for IO events to be available from a list of sockets - or optionally a single socket if passed in. Returns a list of - sockets that can be interacted with immediately. """ - if not HAS_SELECT: - raise ValueError('Platform does not have a selector') - if not isinstance(socks, list): - # Probably just a single socket. - if hasattr(socks, "fileno"): - socks = [socks] - # Otherwise it might be a non-list iterable. - else: - socks = list(socks) - with DefaultSelector() as selector: - for sock in socks: - selector.register(sock, events) - return [key[0].fileobj for key in - selector.select(timeout) if key[1] & events] - - -def wait_for_read(socks, timeout=None): - """ Waits for reading to be available from a list of sockets - or optionally a single socket if passed in. Returns a list of - sockets that can be read from immediately. """ - return _wait_for_io_events(socks, EVENT_READ, timeout) - - -def wait_for_write(socks, timeout=None): - """ Waits for writing to be available from a list of sockets - or optionally a single socket if passed in. Returns a list of - sockets that can be written to immediately. """ - return _wait_for_io_events(socks, EVENT_WRITE, timeout) diff --git a/Contents/Libraries/Shared/requests/sessions.py b/Contents/Libraries/Shared/requests/sessions.py index 7983282a6..a448bd83f 100644 --- a/Contents/Libraries/Shared/requests/sessions.py +++ b/Contents/Libraries/Shared/requests/sessions.py @@ -8,11 +8,12 @@ requests (cookies, auth, proxies). """ import os -from collections import Mapping -from datetime import datetime +import sys +import time +from datetime import timedelta from .auth import _basic_auth_str -from .compat import cookielib, OrderedDict, urljoin, urlparse +from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse, Mapping from .cookies import ( cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT @@ -21,9 +22,8 @@ from .utils import to_key_val_list, default_headers from .exceptions import ( TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) -from .packages.urllib3._collections import RecentlyUsedContainer -from .structures import CaseInsensitiveDict +from .structures import CaseInsensitiveDict from .adapters import HTTPAdapter from .utils import ( @@ -36,7 +36,14 @@ # formerly defined here, reexposed here for backward compatibility from .models import REDIRECT_STATI -REDIRECT_CACHE_SIZE = 1000 +# Preferred clock, based on which one is more accurate on a given system. +if sys.platform == 'win32': + try: # Python 3.4+ + preferred_clock = time.perf_counter + except AttributeError: # Earlier than Python 3. + preferred_clock = time.clock +else: + preferred_clock = time.time def merge_setting(request_setting, session_setting, dict_class=OrderedDict): @@ -86,42 +93,82 @@ def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): class SessionRedirectMixin(object): + + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers['location'] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + if is_py3: + location = location.encode('latin1') + return to_native_string(location, 'utf8') + return None + + def should_strip_auth(self, old_url, new_url): + """Decide whether Authorization header should be removed when redirecting""" + old_parsed = urlparse(old_url) + new_parsed = urlparse(new_url) + if old_parsed.hostname != new_parsed.hostname: + return True + # Special case: allow http -> https redirect when using the standard + # ports. This isn't specified by RFC 7235, but is kept to avoid + # breaking backwards compatibility with older versions of requests + # that allowed any redirects on the same host. + if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) + and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): + return False + # Standard case: root URI must match + return old_parsed.port != new_parsed.port or old_parsed.scheme != new_parsed.scheme + def resolve_redirects(self, resp, req, stream=False, timeout=None, - verify=True, cert=None, proxies=None, **adapter_kwargs): - """Receives a Response. Returns a generator of Responses.""" + verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): + """Receives a Response. Returns a generator of Responses or Requests.""" - i = 0 - hist = [] # keep track of history + hist = [] # keep track of history - while resp.is_redirect: + url = self.get_redirect_target(resp) + previous_fragment = urlparse(req.url).fragment + while url: prepared_request = req.copy() - if i > 0: - # Update history and keep track of redirects. - hist.append(resp) - new_hist = list(hist) - resp.history = new_hist + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] try: resp.content # Consume socket so it can be released except (ChunkedEncodingError, ContentDecodingError, RuntimeError): resp.raw.read(decode_content=False) - if i >= self.max_redirects: + if len(resp.history) >= self.max_redirects: raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) # Release the connection back into the pool. resp.close() - url = resp.headers['location'] - # Handle redirection without scheme (see: RFC 1808 Section 4) if url.startswith('//'): parsed_rurl = urlparse(resp.url) - url = '%s:%s' % (parsed_rurl.scheme, url) + url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) - # The scheme should be lower case... + # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) parsed = urlparse(url) + if parsed.fragment == '' and previous_fragment: + parsed = parsed._replace(fragment=previous_fragment) + elif parsed.fragment: + previous_fragment = parsed.fragment url = parsed.geturl() # Facilitate relative 'location' headers, as allowed by RFC 7231. @@ -133,15 +180,12 @@ def resolve_redirects(self, resp, req, stream=False, timeout=None, url = requote_uri(url) prepared_request.url = to_native_string(url) - # Cache the url, unless it redirects to itself. - if resp.is_permanent_redirect and req.url != prepared_request.url: - self.redirect_cache[req.url] = prepared_request.url self.rebuild_method(prepared_request, resp) - # https://github.com/kennethreitz/requests/issues/1084 + # https://github.com/requests/requests/issues/1084 if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): - # https://github.com/kennethreitz/requests/issues/3490 + # https://github.com/requests/requests/issues/3490 purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') for header in purged_headers: prepared_request.headers.pop(header, None) @@ -179,21 +223,26 @@ def resolve_redirects(self, resp, req, stream=False, timeout=None, # Override the original request. req = prepared_request - resp = self.send( - req, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - allow_redirects=False, - **adapter_kwargs - ) + if yield_requests: + yield req + else: + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs + ) - extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) - i += 1 - yield resp + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp def rebuild_auth(self, prepared_request, response): """When being redirected we may want to strip authentication from the @@ -203,14 +252,10 @@ def rebuild_auth(self, prepared_request, response): headers = prepared_request.headers url = prepared_request.url - if 'Authorization' in headers: + if 'Authorization' in headers and self.should_strip_auth(response.request.url, url): # If we get redirected to a new host, we should strip out any # authentication headers. - original_parsed = urlparse(response.request.url) - redirect_parsed = urlparse(url) - - if (original_parsed.hostname != redirect_parsed.hostname): - del headers['Authorization'] + del headers['Authorization'] # .netrc might have more auth for us on our new host. new_auth = get_netrc_auth(url) if self.trust_env else None @@ -231,13 +276,16 @@ def rebuild_proxies(self, prepared_request, proxies): :rtype: dict """ + proxies = proxies if proxies is not None else {} headers = prepared_request.headers url = prepared_request.url scheme = urlparse(url).scheme - new_proxies = proxies.copy() if proxies is not None else {} + new_proxies = proxies.copy() + no_proxy = proxies.get('no_proxy') - if self.trust_env and not should_bypass_proxies(url): - environ_proxies = get_environ_proxies(url) + bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) + if self.trust_env and not bypass_proxy: + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) proxy = environ_proxies.get(scheme, environ_proxies.get('all')) @@ -263,7 +311,7 @@ def rebuild_method(self, prepared_request, response): """ method = prepared_request.method - # http://tools.ietf.org/html/rfc7231#section-6.4.4 + # https://tools.ietf.org/html/rfc7231#section-6.4.4 if response.status_code == codes.see_other and method != 'HEAD': method = 'GET' @@ -289,13 +337,13 @@ class Session(SessionRedirectMixin): >>> import requests >>> s = requests.Session() - >>> s.get('http://httpbin.org/get') + >>> s.get('https://httpbin.org/get') Or as a context manager:: >>> with requests.Session() as s: - >>> s.get('http://httpbin.org/get') + >>> s.get('https://httpbin.org/get') """ @@ -335,7 +383,8 @@ def __init__(self): #: SSL Verification default. self.verify = True - #: SSL client certificate default. + #: SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. self.cert = None #: Maximum number of redirects allowed. If the request exceeds this @@ -359,9 +408,6 @@ def __init__(self): self.mount('https://', HTTPAdapter()) self.mount('http://', HTTPAdapter()) - # Only store 1000 redirects to prevent using infinite memory - self.redirect_cache = RecentlyUsedContainer(REDIRECT_CACHE_SIZE) - def __enter__(self): return self @@ -409,20 +455,9 @@ def prepare_request(self, request): return p def request(self, method, url, - params=None, - data=None, - headers=None, - cookies=None, - files=None, - auth=None, - timeout=None, - allow_redirects=True, - proxies=None, - hooks=None, - stream=None, - verify=None, - cert=None, - json=None): + params=None, data=None, headers=None, cookies=None, files=None, + auth=None, timeout=None, allow_redirects=True, proxies=None, + hooks=None, stream=None, verify=None, cert=None, json=None): """Constructs a :class:`Request `, prepares it and sends it. Returns :class:`Response ` object. @@ -430,8 +465,8 @@ def request(self, method, url, :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. - :param data: (optional) Dictionary, bytes, or file-like object to send - in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param json: (optional) json to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the @@ -452,24 +487,25 @@ def request(self, method, url, hostname to the URL of the proxy. :param stream: (optional) whether to immediately download the response content. Defaults to ``False``. - :param verify: (optional) whether the SSL cert will be verified. - A CA_BUNDLE path can also be provided. Defaults to ``True``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. :rtype: requests.Response """ # Create the Request. req = Request( - method = method.upper(), - url = url, - headers = headers, - files = files, - data = data or {}, - json = json, - params = params or {}, - auth = auth, - cookies = cookies, - hooks = hooks, + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, ) prep = self.prepare_request(req) @@ -490,7 +526,7 @@ def request(self, method, url, return resp def get(self, url, **kwargs): - """Sends a GET request. Returns :class:`Response` object. + r"""Sends a GET request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. @@ -501,7 +537,7 @@ def get(self, url, **kwargs): return self.request('GET', url, **kwargs) def options(self, url, **kwargs): - """Sends a OPTIONS request. Returns :class:`Response` object. + r"""Sends a OPTIONS request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. @@ -512,7 +548,7 @@ def options(self, url, **kwargs): return self.request('OPTIONS', url, **kwargs) def head(self, url, **kwargs): - """Sends a HEAD request. Returns :class:`Response` object. + r"""Sends a HEAD request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. @@ -523,10 +559,11 @@ def head(self, url, **kwargs): return self.request('HEAD', url, **kwargs) def post(self, url, data=None, json=None, **kwargs): - """Sends a POST request. Returns :class:`Response` object. + r"""Sends a POST request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param json: (optional) json to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response @@ -535,10 +572,11 @@ def post(self, url, data=None, json=None, **kwargs): return self.request('POST', url, data=data, json=json, **kwargs) def put(self, url, data=None, **kwargs): - """Sends a PUT request. Returns :class:`Response` object. + r"""Sends a PUT request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response """ @@ -546,18 +584,19 @@ def put(self, url, data=None, **kwargs): return self.request('PUT', url, data=data, **kwargs) def patch(self, url, data=None, **kwargs): - """Sends a PATCH request. Returns :class:`Response` object. + r"""Sends a PATCH request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response """ - return self.request('PATCH', url, data=data, **kwargs) + return self.request('PATCH', url, data=data, **kwargs) def delete(self, url, **kwargs): - """Sends a DELETE request. Returns :class:`Response` object. + r"""Sends a DELETE request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. @@ -567,8 +606,7 @@ def delete(self, url, **kwargs): return self.request('DELETE', url, **kwargs) def send(self, request, **kwargs): - """ - Send a given PreparedRequest. + """Send a given PreparedRequest. :rtype: requests.Response """ @@ -589,27 +627,18 @@ def send(self, request, **kwargs): stream = kwargs.get('stream') hooks = request.hooks - # Resolve URL in redirect cache, if available. - if allow_redirects: - checked_urls = set() - while request.url in self.redirect_cache: - checked_urls.add(request.url) - new_url = self.redirect_cache.get(request.url) - if new_url in checked_urls: - break - request.url = new_url - # Get the appropriate adapter to use adapter = self.get_adapter(url=request.url) # Start time (approximately) of the request - start = datetime.utcnow() + start = preferred_clock() # Send the request r = adapter.send(request, **kwargs) # Total elapsed time of the request (approximately) - r.elapsed = datetime.utcnow() - start + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) # Response manipulation hooks r = dispatch_hook('response', hooks, r, **kwargs) @@ -637,6 +666,13 @@ def send(self, request, **kwargs): r = history.pop() r.history = history + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) + except StopIteration: + pass + if not stream: r.content @@ -651,7 +687,8 @@ def merge_environment_settings(self, url, proxies, stream, verify, cert): # Gather clues from the surrounding environment. if self.trust_env: # Set environment's proxies. - env_proxies = get_environ_proxies(url) or {} + no_proxy = proxies.get('no_proxy') if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) for (k, v) in env_proxies.items(): proxies.setdefault(k, v) @@ -678,7 +715,7 @@ def get_adapter(self, url): """ for (prefix, adapter) in self.adapters.items(): - if url.lower().startswith(prefix): + if url.lower().startswith(prefix.lower()): return adapter # Nothing matches :-/ @@ -692,7 +729,7 @@ def close(self): def mount(self, prefix, adapter): """Registers a connection adapter to a prefix. - Adapters are sorted in descending order by key length. + Adapters are sorted in descending order by prefix length. """ self.adapters[prefix] = adapter keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] @@ -701,25 +738,24 @@ def mount(self, prefix, adapter): self.adapters[key] = self.adapters.pop(key) def __getstate__(self): - state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) - state['redirect_cache'] = dict(self.redirect_cache) + state = {attr: getattr(self, attr, None) for attr in self.__attrs__} return state def __setstate__(self, state): - redirect_cache = state.pop('redirect_cache', {}) for attr, value in state.items(): setattr(self, attr, value) - self.redirect_cache = RecentlyUsedContainer(REDIRECT_CACHE_SIZE) - for redirect, to in redirect_cache.items(): - self.redirect_cache[redirect] = to - def session(): """ Returns a :class:`Session` for context-management. + .. deprecated:: 1.0.0 + + This method has been deprecated since version 1.0.0 and is only kept for + backwards compatibility. New code should use :class:`~requests.sessions.Session` + to create a session. This may be removed at a future date. + :rtype: Session """ - return Session() diff --git a/Contents/Libraries/Shared/requests/status_codes.py b/Contents/Libraries/Shared/requests/status_codes.py index db2986bb1..813e8c4e6 100644 --- a/Contents/Libraries/Shared/requests/status_codes.py +++ b/Contents/Libraries/Shared/requests/status_codes.py @@ -1,5 +1,22 @@ # -*- coding: utf-8 -*- +r""" +The ``codes`` object defines a mapping from common names for HTTP statuses +to their numerical codes, accessible either as attributes or as dictionary +items. + +>>> requests.codes['temporary_redirect'] +307 +>>> requests.codes.teapot +418 +>>> requests.codes['\o/'] +200 + +Some codes have multiple names, and both upper- and lower-case versions of +the names are allowed. For example, ``codes.ok``, ``codes.OK``, and +``codes.okay`` all correspond to the HTTP status code 200. +""" + from .structures import LookupDict _codes = { @@ -84,8 +101,20 @@ codes = LookupDict(name='status_codes') -for code, titles in _codes.items(): - for title in titles: - setattr(codes, title, code) - if not title.startswith('\\'): - setattr(codes, title.upper(), code) +def _init(): + for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(('\\', '/')): + setattr(codes, title.upper(), code) + + def doc(code): + names = ', '.join('``%s``' % n for n in _codes[code]) + return '* %d: %s' % (code, names) + + global __doc__ + __doc__ = (__doc__ + '\n' + + '\n'.join(doc(code) for code in sorted(_codes)) + if __doc__ is not None else None) + +_init() diff --git a/Contents/Libraries/Shared/requests/structures.py b/Contents/Libraries/Shared/requests/structures.py index 05d2b3f57..da930e285 100644 --- a/Contents/Libraries/Shared/requests/structures.py +++ b/Contents/Libraries/Shared/requests/structures.py @@ -7,16 +7,14 @@ Data structures that power Requests. """ -import collections +from .compat import OrderedDict, Mapping, MutableMapping -from .compat import OrderedDict - -class CaseInsensitiveDict(collections.MutableMapping): +class CaseInsensitiveDict(MutableMapping): """A case-insensitive ``dict``-like object. Implements all methods and operations of - ``collections.MutableMapping`` as well as dict's ``copy``. Also + ``MutableMapping`` as well as dict's ``copy``. Also provides ``lower_items``. All keys are expected to be strings. The structure remembers the @@ -71,7 +69,7 @@ def lower_items(self): ) def __eq__(self, other): - if isinstance(other, collections.Mapping): + if isinstance(other, Mapping): other = CaseInsensitiveDict(other) else: return NotImplemented diff --git a/Contents/Libraries/Shared/requests/utils.py b/Contents/Libraries/Shared/requests/utils.py index 47325090c..0ce7fe115 100644 --- a/Contents/Libraries/Shared/requests/utils.py +++ b/Contents/Libraries/Shared/requests/utils.py @@ -8,36 +8,91 @@ that are also useful for external consumption. """ -import cgi import codecs -import collections +import contextlib import io import os import re import socket import struct +import sys +import tempfile import warnings +import zipfile -from . import __version__ +from .__version__ import __version__ from . import certs # to_native_string is unused here, but imported here for backwards compatibility from ._internal_utils import to_native_string from .compat import parse_http_list as _parse_list_header from .compat import ( quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, - proxy_bypass, urlunparse, basestring, integer_types) -from .cookies import RequestsCookieJar, cookiejar_from_dict + proxy_bypass, urlunparse, basestring, integer_types, is_py3, + proxy_bypass_environment, getproxies_environment, Mapping) +from .cookies import cookiejar_from_dict from .structures import CaseInsensitiveDict from .exceptions import ( InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) -_hush_pyflakes = (RequestsCookieJar,) - NETRC_FILES = ('.netrc', '_netrc') DEFAULT_CA_BUNDLE_PATH = certs.where() +if sys.platform == 'win32': + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + try: + if is_py3: + import winreg + else: + import _winreg as winreg + except ImportError: + return False + + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it + proxyEnable = int(winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0]) + # ProxyOverride is almost always a string + proxyOverride = winreg.QueryValueEx(internetSettings, + 'ProxyOverride')[0] + except OSError: + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(';') + # now check if we match one of the registry values. + for test in proxyOverride: + if test == '': + if '.' not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + def dict_to_sequence(d): """Returns an internal sequence dictionary update.""" @@ -91,14 +146,16 @@ def super_len(o): else: if hasattr(o, 'seek') and total_length is None: # StringIO and BytesIO have seek but no useable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() - # seek to end of file - o.seek(0, 2) - total_length = o.tell() - - # seek back to current position to support - # partially read file-like objects - o.seek(current_position or 0) + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except (OSError, IOError): + total_length = 0 if total_length is None: total_length = 0 @@ -116,11 +173,11 @@ def get_netrc_auth(url, raise_errors=False): for f in NETRC_FILES: try: - loc = os.path.expanduser('~/{0}'.format(f)) + loc = os.path.expanduser('~/{}'.format(f)) except KeyError: # os.path.expanduser can fail when $HOME is undefined and - # getpwuid fails. See http://bugs.python.org/issue20164 & - # https://github.com/kennethreitz/requests/issues/1846 + # getpwuid fails. See https://bugs.python.org/issue20164 & + # https://github.com/requests/requests/issues/1846 return if os.path.exists(loc): @@ -165,6 +222,38 @@ def guess_filename(obj): return os.path.basename(name) +def extract_zipped_paths(path): + """Replace nonexistent paths that look like they refer to a member of a zip + archive with the location of an extracted copy of the target, or else + just return the provided path unchanged. + """ + if os.path.exists(path): + # this is already a valid path, no need to do anything further + return path + + # find the first valid part of the provided path and treat that as a zip archive + # assume the rest of the path is the name of a member in the archive + archive, member = os.path.split(path) + while archive and not os.path.exists(archive): + archive, prefix = os.path.split(archive) + member = '/'.join([prefix, member]) + + if not zipfile.is_zipfile(archive): + return path + + zip_file = zipfile.ZipFile(archive) + if member not in zip_file.namelist(): + return path + + # we have a valid zip archive and a valid member of that archive + tmp = tempfile.gettempdir() + extracted_path = os.path.join(tmp, *member.split('/')) + if not os.path.exists(extracted_path): + extracted_path = zip_file.extract(member, path=tmp) + + return extracted_path + + def from_key_val_list(value): """Take an object and test to see if it can be represented as a dictionary. Unless it can not be represented as such, return an @@ -211,7 +300,7 @@ def to_key_val_list(value): if isinstance(value, (str, bytes, bool, int)): raise ValueError('cannot encode objects that are not 2-tuples') - if isinstance(value, collections.Mapping): + if isinstance(value, Mapping): value = value.items() return list(value) @@ -356,6 +445,31 @@ def get_encodings_from_content(content): xml_re.findall(content)) +def _parse_content_type_header(header): + """Returns content type and parameters from given header + + :param header: string + :return: tuple containing content type and dictionary of + parameters + """ + + tokens = header.split(';') + content_type, params = tokens[0].strip(), tokens[1:] + params_dict = {} + items_to_strip = "\"' " + + for param in params: + param = param.strip() + if param: + key, value = param, True + index_of_equals = param.find("=") + if index_of_equals != -1: + key = param[:index_of_equals].strip(items_to_strip) + value = param[index_of_equals + 1:].strip(items_to_strip) + params_dict[key.lower()] = value + return content_type, params_dict + + def get_encoding_from_headers(headers): """Returns encodings from given HTTP Header Dict. @@ -368,7 +482,7 @@ def get_encoding_from_headers(headers): if not content_type: return None - content_type, params = cgi.parse_header(content_type) + content_type, params = _parse_content_type_header(content_type) if 'charset' in params: return params['charset'].strip("'\"") @@ -443,8 +557,7 @@ def get_unicode_from_response(r): # The unreserved URI characters (RFC 3986) UNRESERVED_SET = frozenset( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - + "0123456789-._~") + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") def unquote_unreserved(uri): @@ -494,7 +607,7 @@ def requote_uri(uri): def address_in_network(ip, net): - """This function allows you to check if on IP belongs to a network subnet + """This function allows you to check if an IP belongs to a network subnet Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 @@ -554,53 +667,82 @@ def is_valid_cidr(string_network): return True -def should_bypass_proxies(url): +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): """ Returns whether we should bypass proxies or not. :rtype: bool """ + # Prioritize lowercase environment variables over uppercase + # to keep a consistent behaviour with other http projects (curl, wget). get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) # First check whether no_proxy is defined. If it is, check that the URL # we're getting isn't in the no_proxy list. - no_proxy = get_proxy('no_proxy') - netloc = urlparse(url).netloc + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy('no_proxy') + parsed = urlparse(url) + + if parsed.hostname is None: + # URLs don't always have hostnames, e.g. file:/// urls. + return True if no_proxy: # We need to check whether we match here. We need to see if we match - # the end of the netloc, both with and without the port. + # the end of the hostname, both with and without the port. no_proxy = ( host for host in no_proxy.replace(' ', '').split(',') if host ) - ip = netloc.split(':')[0] - if is_ipv4_address(ip): + if is_ipv4_address(parsed.hostname): for proxy_ip in no_proxy: if is_valid_cidr(proxy_ip): - if address_in_network(ip, proxy_ip): + if address_in_network(parsed.hostname, proxy_ip): return True - elif ip == proxy_ip: + elif parsed.hostname == proxy_ip: # If no_proxy ip was defined in plain IP notation instead of cidr notation & # matches the IP of the index return True else: + host_with_port = parsed.hostname + if parsed.port: + host_with_port += ':{}'.format(parsed.port) + for host in no_proxy: - if netloc.endswith(host) or netloc.split(':')[0].endswith(host): + if parsed.hostname.endswith(host) or host_with_port.endswith(host): # The URL does match something in no_proxy, so we don't want # to apply the proxies on this URL. return True - # If the system proxy settings indicate that this URL should be bypassed, - # don't proxy. - # The proxy_bypass function is incredibly buggy on OS X in early versions - # of Python 2.6, so allow this call to fail. Only catch the specific - # exceptions we've seen, though: this call failing in other ways can reveal - # legitimate problems. - try: - bypass = proxy_bypass(netloc) - except (TypeError, socket.gaierror): - bypass = False + with set_environ('no_proxy', no_proxy_arg): + # parsed.hostname can be `None` in cases such as a file URI. + try: + bypass = proxy_bypass(parsed.hostname) + except (TypeError, socket.gaierror): + bypass = False if bypass: return True @@ -608,13 +750,13 @@ def should_bypass_proxies(url): return False -def get_environ_proxies(url): +def get_environ_proxies(url, no_proxy=None): """ Return a dict of environment proxies. :rtype: dict """ - if should_bypass_proxies(url): + if should_bypass_proxies(url, no_proxy=no_proxy): return {} else: return getproxies() @@ -668,7 +810,7 @@ def default_headers(): def parse_header_links(value): - """Return a dict of parsed link headers proxies. + """Return a list of parsed link headers proxies. i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" @@ -679,6 +821,10 @@ def parse_header_links(value): replace_chars = ' \'"' + value = value.strip(replace_chars) + if not value: + return links + for val in re.split(', *<', value): try: url, params = val.split(';', 1) @@ -775,6 +921,7 @@ def get_auth_from_url(url): _CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') _CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') + def check_header_validity(header): """Verifies that header value is a string which doesn't contain leading whitespace or return characters. This prevents unintended @@ -792,8 +939,8 @@ def check_header_validity(header): if not pat.match(value): raise InvalidHeader("Invalid return character or leading space in header: %s" % name) except TypeError: - raise InvalidHeader("Header value %s must be of type str or bytes, " - "not %s" % (value, type(value))) + raise InvalidHeader("Value for header {%s: %s} must be of type str or " + "bytes, not %s" % (name, value, type(value))) def urldefragauth(url): @@ -812,6 +959,7 @@ def urldefragauth(url): return urlunparse((scheme, netloc, path, params, query, '')) + def rewind_body(prepared_request): """Move file pointer back to its recorded starting position so it can be read again on redirect. @@ -821,7 +969,7 @@ def rewind_body(prepared_request): try: body_seek(prepared_request._body_position) except (IOError, OSError): - raise UnrewindableBodyError("An error occured when rewinding request " + raise UnrewindableBodyError("An error occurred when rewinding request " "body for redirect.") else: raise UnrewindableBodyError("Unable to rewind request body for redirect.") From 80560c8eba2d11286c0ec092338fa28bb50c4286 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 30 Oct 2018 16:57:12 +0100 Subject: [PATCH 278/710] core: add urllib3 1.24 --- Contents/Libraries/Shared/urllib3/__init__.py | 92 ++ .../Libraries/Shared/urllib3/_collections.py | 329 +++++++ .../Libraries/Shared/urllib3/connection.py | 391 ++++++++ .../Shared/urllib3/connectionpool.py | 896 ++++++++++++++++++ .../Shared/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 30 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 593 ++++++++++++ .../contrib/_securetransport/low_level.py | 346 +++++++ .../Shared/urllib3/contrib/appengine.py | 289 ++++++ .../Shared/urllib3/contrib/ntlmpool.py | 111 +++ .../Shared/urllib3/contrib/pyopenssl.py | 466 +++++++++ .../Shared/urllib3/contrib/securetransport.py | 804 ++++++++++++++++ .../Libraries/Shared/urllib3/contrib/socks.py | 192 ++++ .../Libraries/Shared/urllib3/exceptions.py | 246 +++++ Contents/Libraries/Shared/urllib3/fields.py | 178 ++++ Contents/Libraries/Shared/urllib3/filepost.py | 98 ++ .../Shared/urllib3/packages/__init__.py | 5 + .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 53 ++ .../Libraries/Shared/urllib3/packages/six.py | 868 +++++++++++++++++ .../packages/ssl_match_hostname/__init__.py | 19 + .../ssl_match_hostname/_implementation.py | 156 +++ .../Libraries/Shared/urllib3/poolmanager.py | 450 +++++++++ Contents/Libraries/Shared/urllib3/request.py | 150 +++ Contents/Libraries/Shared/urllib3/response.py | 705 ++++++++++++++ .../Libraries/Shared/urllib3/util/__init__.py | 54 ++ .../Shared/urllib3/util/connection.py | 134 +++ .../Libraries/Shared/urllib3/util/queue.py | 21 + .../Libraries/Shared/urllib3/util/request.py | 118 +++ .../Libraries/Shared/urllib3/util/response.py | 87 ++ .../Libraries/Shared/urllib3/util/retry.py | 411 ++++++++ .../Libraries/Shared/urllib3/util/ssl_.py | 379 ++++++++ .../Libraries/Shared/urllib3/util/timeout.py | 242 +++++ Contents/Libraries/Shared/urllib3/util/url.py | 230 +++++ .../Libraries/Shared/urllib3/util/wait.py | 150 +++ 36 files changed, 9293 insertions(+) create mode 100644 Contents/Libraries/Shared/urllib3/__init__.py create mode 100644 Contents/Libraries/Shared/urllib3/_collections.py create mode 100644 Contents/Libraries/Shared/urllib3/connection.py create mode 100644 Contents/Libraries/Shared/urllib3/connectionpool.py create mode 100644 Contents/Libraries/Shared/urllib3/contrib/__init__.py create mode 100644 Contents/Libraries/Shared/urllib3/contrib/_appengine_environ.py create mode 100644 Contents/Libraries/Shared/urllib3/contrib/_securetransport/__init__.py create mode 100644 Contents/Libraries/Shared/urllib3/contrib/_securetransport/bindings.py create mode 100644 Contents/Libraries/Shared/urllib3/contrib/_securetransport/low_level.py create mode 100644 Contents/Libraries/Shared/urllib3/contrib/appengine.py create mode 100644 Contents/Libraries/Shared/urllib3/contrib/ntlmpool.py create mode 100644 Contents/Libraries/Shared/urllib3/contrib/pyopenssl.py create mode 100644 Contents/Libraries/Shared/urllib3/contrib/securetransport.py create mode 100644 Contents/Libraries/Shared/urllib3/contrib/socks.py create mode 100644 Contents/Libraries/Shared/urllib3/exceptions.py create mode 100644 Contents/Libraries/Shared/urllib3/fields.py create mode 100644 Contents/Libraries/Shared/urllib3/filepost.py create mode 100644 Contents/Libraries/Shared/urllib3/packages/__init__.py create mode 100644 Contents/Libraries/Shared/urllib3/packages/backports/__init__.py create mode 100644 Contents/Libraries/Shared/urllib3/packages/backports/makefile.py create mode 100644 Contents/Libraries/Shared/urllib3/packages/six.py create mode 100644 Contents/Libraries/Shared/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 Contents/Libraries/Shared/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 Contents/Libraries/Shared/urllib3/poolmanager.py create mode 100644 Contents/Libraries/Shared/urllib3/request.py create mode 100644 Contents/Libraries/Shared/urllib3/response.py create mode 100644 Contents/Libraries/Shared/urllib3/util/__init__.py create mode 100644 Contents/Libraries/Shared/urllib3/util/connection.py create mode 100644 Contents/Libraries/Shared/urllib3/util/queue.py create mode 100644 Contents/Libraries/Shared/urllib3/util/request.py create mode 100644 Contents/Libraries/Shared/urllib3/util/response.py create mode 100644 Contents/Libraries/Shared/urllib3/util/retry.py create mode 100644 Contents/Libraries/Shared/urllib3/util/ssl_.py create mode 100644 Contents/Libraries/Shared/urllib3/util/timeout.py create mode 100644 Contents/Libraries/Shared/urllib3/util/url.py create mode 100644 Contents/Libraries/Shared/urllib3/util/wait.py diff --git a/Contents/Libraries/Shared/urllib3/__init__.py b/Contents/Libraries/Shared/urllib3/__init__.py new file mode 100644 index 000000000..75725167e --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/__init__.py @@ -0,0 +1,92 @@ +""" +urllib3 - Thread-safe connection pooling and re-using. +""" + +from __future__ import absolute_import +import warnings + +from .connectionpool import ( + HTTPConnectionPool, + HTTPSConnectionPool, + connection_from_url +) + +from . import exceptions +from .filepost import encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import HTTPResponse +from .util.request import make_headers +from .util.url import get_host +from .util.timeout import Timeout +from .util.retry import Retry + + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = '1.24' + +__all__ = ( + 'HTTPConnectionPool', + 'HTTPSConnectionPool', + 'PoolManager', + 'ProxyManager', + 'HTTPResponse', + 'Retry', + 'Timeout', + 'add_stderr_logger', + 'connection_from_url', + 'disable_warnings', + 'encode_multipart_formdata', + 'get_host', + 'make_headers', + 'proxy_from_url', +) + +logging.getLogger(__name__).addHandler(NullHandler()) + + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug('Added a stderr logging handler to logger: %s', __name__) + return handler + + +# ... Clean up. +del NullHandler + + +# All warning filters *must* be appended unless you're really certain that they +# shouldn't be: otherwise, it's very hard for users to use most Python +# mechanisms to silence them. +# SecurityWarning's always go off by default. +warnings.simplefilter('always', exceptions.SecurityWarning, append=True) +# SubjectAltNameWarning's should go off once per host +warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) +# InsecurePlatformWarning's don't vary between requests, so we keep it default. +warnings.simplefilter('default', exceptions.InsecurePlatformWarning, + append=True) +# SNIMissingWarnings should go off only once. +warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) + + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter('ignore', category) diff --git a/Contents/Libraries/Shared/urllib3/_collections.py b/Contents/Libraries/Shared/urllib3/_collections.py new file mode 100644 index 000000000..34f23811c --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/_collections.py @@ -0,0 +1,329 @@ +from __future__ import absolute_import +try: + from collections.abc import Mapping, MutableMapping +except ImportError: + from collections import Mapping, MutableMapping +try: + from threading import RLock +except ImportError: # Platform-specific: No threads available + class RLock: + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_value, traceback): + pass + + +from collections import OrderedDict +from .exceptions import InvalidHeader +from .packages.six import iterkeys, itervalues, PY3 + + +__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] + + +_Null = object() + + +class RecentlyUsedContainer(MutableMapping): + """ + Provides a thread-safe dict-like container which maintains up to + ``maxsize`` keys while throwing away the least-recently-used keys beyond + ``maxsize``. + + :param maxsize: + Maximum number of recent elements to retain. + + :param dispose_func: + Every time an item is evicted from the container, + ``dispose_func(value)`` is called. Callback which will get called + """ + + ContainerCls = OrderedDict + + def __init__(self, maxsize=10, dispose_func=None): + self._maxsize = maxsize + self.dispose_func = dispose_func + + self._container = self.ContainerCls() + self.lock = RLock() + + def __getitem__(self, key): + # Re-insert the item, moving it to the end of the eviction line. + with self.lock: + item = self._container.pop(key) + self._container[key] = item + return item + + def __setitem__(self, key, value): + evicted_value = _Null + with self.lock: + # Possibly evict the existing value of 'key' + evicted_value = self._container.get(key, _Null) + self._container[key] = value + + # If we didn't evict an existing value, we might have to evict the + # least recently used item from the beginning of the container. + if len(self._container) > self._maxsize: + _key, evicted_value = self._container.popitem(last=False) + + if self.dispose_func and evicted_value is not _Null: + self.dispose_func(evicted_value) + + def __delitem__(self, key): + with self.lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self): + with self.lock: + return len(self._container) + + def __iter__(self): + raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') + + def clear(self): + with self.lock: + # Copy pointers to all values, then wipe the mapping + values = list(itervalues(self._container)) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self): + with self.lock: + return list(iterkeys(self._container)) + + +class HTTPHeaderDict(MutableMapping): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + """ + + def __init__(self, headers=None, **kwargs): + super(HTTPHeaderDict, self).__init__() + self._container = OrderedDict() + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key, val): + self._container[key.lower()] = [key, val] + return self._container[key.lower()] + + def __getitem__(self, key): + val = self._container[key.lower()] + return ', '.join(val[1:]) + + def __delitem__(self, key): + del self._container[key.lower()] + + def __contains__(self, key): + return key.lower() in self._container + + def __eq__(self, other): + if not isinstance(other, Mapping) and not hasattr(other, 'keys'): + return False + if not isinstance(other, type(self)): + other = type(self)(other) + return (dict((k.lower(), v) for k, v in self.itermerged()) == + dict((k.lower(), v) for k, v in other.itermerged())) + + def __ne__(self, other): + return not self.__eq__(other) + + if not PY3: # Python 2 + iterkeys = MutableMapping.iterkeys + itervalues = MutableMapping.itervalues + + __marker = object() + + def __len__(self): + return len(self._container) + + def __iter__(self): + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def pop(self, key, default=__marker): + '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + ''' + # Using the MutableMapping function directly fails due to the private marker. + # Using ordinary dict.pop would expose the internal structures. + # So let's reinvent the wheel. + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def discard(self, key): + try: + del self[key] + except KeyError: + pass + + def add(self, key, val): + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + """ + key_lower = key.lower() + new_vals = [key, val] + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + vals.append(val) + + def extend(self, *args, **kwargs): + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError("extend() takes at most 1 positional " + "arguments ({0} given)".format(len(args))) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, Mapping): + for key in other: + self.add(key, other[key]) + elif hasattr(other, "keys"): + for key in other.keys(): + self.add(key, other[key]) + else: + for key, value in other: + self.add(key, value) + + for key, value in kwargs.items(): + self.add(key, value) + + def getlist(self, key, default=__marker): + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + try: + vals = self._container[key.lower()] + except KeyError: + if default is self.__marker: + return [] + return default + else: + return vals[1:] + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + # Backwards compatibility for http.cookiejar + get_all = getlist + + def __repr__(self): + return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) + + def _copy_from(self, other): + for key in other: + val = other.getlist(key) + if isinstance(val, list): + # Don't need to convert tuples + val = list(val) + self._container[key.lower()] = [key] + val + + def copy(self): + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self): + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self): + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ', '.join(val[1:]) + + def items(self): + return list(self.iteritems()) + + @classmethod + def from_httplib(cls, message): # Python 2 + """Read headers from a Python 2 httplib message object.""" + # python2.7 does not expose a proper API for exporting multiheaders + # efficiently. This function re-reads raw lines from the message + # object and extracts the multiheaders properly. + obs_fold_continued_leaders = (' ', '\t') + headers = [] + + for line in message.headers: + if line.startswith(obs_fold_continued_leaders): + if not headers: + # We received a header line that starts with OWS as described + # in RFC-7230 S3.2.4. This indicates a multiline header, but + # there exists no previous header to which we can attach it. + raise InvalidHeader( + 'Header continuation with no previous header: %s' % line + ) + else: + key, value = headers[-1] + headers[-1] = (key, value + ' ' + line.strip()) + continue + + key, value = line.split(':', 1) + headers.append((key, value.strip())) + + return cls(headers) diff --git a/Contents/Libraries/Shared/urllib3/connection.py b/Contents/Libraries/Shared/urllib3/connection.py new file mode 100644 index 000000000..02b36654b --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/connection.py @@ -0,0 +1,391 @@ +from __future__ import absolute_import +import datetime +import logging +import os +import socket +from socket import error as SocketError, timeout as SocketTimeout +import warnings +from .packages import six +from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection +from .packages.six.moves.http_client import HTTPException # noqa: F401 + +try: # Compiled with SSL? + import ssl + BaseSSLError = ssl.SSLError +except (ImportError, AttributeError): # Platform-specific: No SSL. + ssl = None + + class BaseSSLError(BaseException): + pass + + +try: # Python 3: + # Not a no-op, we're adding this to the namespace so it can be imported. + ConnectionError = ConnectionError +except NameError: # Python 2: + class ConnectionError(Exception): + pass + + +from .exceptions import ( + NewConnectionError, + ConnectTimeoutError, + SubjectAltNameWarning, + SystemTimeWarning, +) +from .packages.ssl_match_hostname import match_hostname, CertificateError + +from .util.ssl_ import ( + resolve_cert_reqs, + resolve_ssl_version, + assert_fingerprint, + create_urllib3_context, + ssl_wrap_socket +) + + +from .util import connection + +from ._collections import HTTPHeaderDict + +log = logging.getLogger(__name__) + +port_by_scheme = { + 'http': 80, + 'https': 443, +} + +# When updating RECENT_DATE, move it to within two years of the current date, +# and not less than 6 months ago. +# Example: if Today is 2018-01-01, then RECENT_DATE should be any date on or +# after 2016-01-01 (today - 2 years) AND before 2017-07-01 (today - 6 months) +RECENT_DATE = datetime.date(2017, 6, 30) + + +class DummyConnection(object): + """Used to detect a failed ConnectionCls import.""" + pass + + +class HTTPConnection(_HTTPConnection, object): + """ + Based on httplib.HTTPConnection but provides an extra constructor + backwards-compatibility layer between older and newer Pythons. + + Additional keyword parameters are used to configure attributes of the connection. + Accepted parameters include: + + - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` + - ``source_address``: Set the source address for the current connection. + - ``socket_options``: Set specific options on the underlying socket. If not specified, then + defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling + Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. + + For example, if you wish to enable TCP Keep Alive in addition to the defaults, + you might pass:: + + HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + ] + + Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). + """ + + default_port = port_by_scheme['http'] + + #: Disable Nagle's algorithm by default. + #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` + default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + + #: Whether this connection verifies the host's certificate. + is_verified = False + + def __init__(self, *args, **kw): + if six.PY3: # Python 3 + kw.pop('strict', None) + + # Pre-set source_address. + self.source_address = kw.get('source_address') + + #: The socket options provided by the user. If no options are + #: provided, we use the default options. + self.socket_options = kw.pop('socket_options', self.default_socket_options) + + _HTTPConnection.__init__(self, *args, **kw) + + @property + def host(self): + """ + Getter method to remove any trailing dots that indicate the hostname is an FQDN. + + In general, SSL certificates don't include the trailing dot indicating a + fully-qualified domain name, and thus, they don't validate properly when + checked against a domain name that includes the dot. In addition, some + servers may not expect to receive the trailing dot when provided. + + However, the hostname with trailing dot is critical to DNS resolution; doing a + lookup with the trailing dot will properly only resolve the appropriate FQDN, + whereas a lookup without a trailing dot will search the system's search domain + list. Thus, it's important to keep the original host around for use only in + those cases where it's appropriate (i.e., when doing DNS lookup to establish the + actual TCP connection across which we're going to send HTTP requests). + """ + return self._dns_host.rstrip('.') + + @host.setter + def host(self, value): + """ + Setter for the `host` property. + + We assume that only urllib3 uses the _dns_host attribute; httplib itself + only uses `host`, and it seems reasonable that other libraries follow suit. + """ + self._dns_host = value + + def _new_conn(self): + """ Establish a socket connection and set nodelay settings on it. + + :return: New socket connection. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = connection.create_connection( + (self._dns_host, self.port), self.timeout, **extra_kw) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except SocketError as e: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + def _prepare_conn(self, conn): + self.sock = conn + if self._tunnel_host: + # TODO: Fix tunnel so it doesn't depend on self.sock state. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + def request_chunked(self, method, url, body=None, headers=None): + """ + Alternative to the common request method, which sends the + body with chunked encoding and not as one block + """ + headers = HTTPHeaderDict(headers if headers is not None else {}) + skip_accept_encoding = 'accept-encoding' in headers + skip_host = 'host' in headers + self.putrequest( + method, + url, + skip_accept_encoding=skip_accept_encoding, + skip_host=skip_host + ) + for header, value in headers.items(): + self.putheader(header, value) + if 'transfer-encoding' not in headers: + self.putheader('Transfer-Encoding', 'chunked') + self.endheaders() + + if body is not None: + stringish_types = six.string_types + (bytes,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, bytes): + chunk = chunk.encode('utf8') + len_str = hex(len(chunk))[2:] + self.send(len_str.encode('utf-8')) + self.send(b'\r\n') + self.send(chunk) + self.send(b'\r\n') + + # After the if clause, to always have a closed body + self.send(b'0\r\n\r\n') + + +class HTTPSConnection(HTTPConnection): + default_port = port_by_scheme['https'] + + ssl_version = None + + def __init__(self, host, port=None, key_file=None, cert_file=None, + strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + ssl_context=None, server_hostname=None, **kw): + + HTTPConnection.__init__(self, host, port, strict=strict, + timeout=timeout, **kw) + + self.key_file = key_file + self.cert_file = cert_file + self.ssl_context = ssl_context + self.server_hostname = server_hostname + + # Required property for Google AppEngine 1.9.0 which otherwise causes + # HTTPS requests to go out as HTTP. (See Issue #356) + self._protocol = 'https' + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(None), + cert_reqs=resolve_cert_reqs(None), + ) + + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ssl_context=self.ssl_context, + server_hostname=self.server_hostname + ) + + +class VerifiedHTTPSConnection(HTTPSConnection): + """ + Based on httplib.HTTPSConnection but wraps the socket with + SSL certification. + """ + cert_reqs = None + ca_certs = None + ca_cert_dir = None + ssl_version = None + assert_fingerprint = None + + def set_cert(self, key_file=None, cert_file=None, + cert_reqs=None, ca_certs=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None): + """ + This method should only be called once, before the connection is used. + """ + # If cert_reqs is not provided, we can try to guess. If the user gave + # us a cert database, we assume they want to use it: otherwise, if + # they gave us an SSL Context object we should use whatever is set for + # it. + if cert_reqs is None: + if ca_certs or ca_cert_dir: + cert_reqs = 'CERT_REQUIRED' + elif self.ssl_context is not None: + cert_reqs = self.ssl_context.verify_mode + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) + + def connect(self): + # Add certificate verification + conn = self._new_conn() + hostname = self.host + + if self._tunnel_host: + self.sock = conn + # Calls self._set_hostport(), so self.host is + # self._tunnel_host below. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + # Override the host with the one we're requesting data from. + hostname = self._tunnel_host + + server_hostname = hostname + if self.server_hostname is not None: + server_hostname = self.server_hostname + + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn(( + 'System time is way off (before {0}). This will probably ' + 'lead to SSL verification errors').format(RECENT_DATE), + SystemTimeWarning + ) + + # Wrap socket using verification with the root certs in + # trusted_root_certs + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(self.ssl_version), + cert_reqs=resolve_cert_reqs(self.cert_reqs), + ) + + context = self.ssl_context + context.verify_mode = resolve_cert_reqs(self.cert_reqs) + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + server_hostname=server_hostname, + ssl_context=context) + + if self.assert_fingerprint: + assert_fingerprint(self.sock.getpeercert(binary_form=True), + self.assert_fingerprint) + elif context.verify_mode != ssl.CERT_NONE \ + and not getattr(context, 'check_hostname', False) \ + and self.assert_hostname is not False: + # While urllib3 attempts to always turn off hostname matching from + # the TLS library, this cannot always be done. So we check whether + # the TLS Library still thinks it's matching hostnames. + cert = self.sock.getpeercert() + if not cert.get('subjectAltName', ()): + warnings.warn(( + 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' + '`commonName` for now. This feature is being removed by major browsers and ' + 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' + 'for details.)'.format(hostname)), + SubjectAltNameWarning + ) + _match_hostname(cert, self.assert_hostname or server_hostname) + + self.is_verified = ( + context.verify_mode == ssl.CERT_REQUIRED or + self.assert_fingerprint is not None + ) + + +def _match_hostname(cert, asserted_hostname): + try: + match_hostname(cert, asserted_hostname) + except CertificateError as e: + log.error( + 'Certificate did not match expected hostname: %s. ' + 'Certificate: %s', asserted_hostname, cert + ) + # Add cert to exception and reraise so client code can inspect + # the cert when catching the exception, if they want to + e._peer_cert = cert + raise + + +if ssl: + # Make a copy for testing. + UnverifiedHTTPSConnection = HTTPSConnection + HTTPSConnection = VerifiedHTTPSConnection +else: + HTTPSConnection = DummyConnection diff --git a/Contents/Libraries/Shared/urllib3/connectionpool.py b/Contents/Libraries/Shared/urllib3/connectionpool.py new file mode 100644 index 000000000..f7a8f193d --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/connectionpool.py @@ -0,0 +1,896 @@ +from __future__ import absolute_import +import errno +import logging +import sys +import warnings + +from socket import error as SocketError, timeout as SocketTimeout +import socket + + +from .exceptions import ( + ClosedPoolError, + ProtocolError, + EmptyPoolError, + HeaderParsingError, + HostChangedError, + LocationValueError, + MaxRetryError, + ProxyError, + ReadTimeoutError, + SSLError, + TimeoutError, + InsecureRequestWarning, + NewConnectionError, +) +from .packages.ssl_match_hostname import CertificateError +from .packages import six +from .packages.six.moves import queue +from .connection import ( + port_by_scheme, + DummyConnection, + HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, + HTTPException, BaseSSLError, +) +from .request import RequestMethods +from .response import HTTPResponse + +from .util.connection import is_connection_dropped +from .util.request import set_file_position +from .util.response import assert_header_parsing +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import get_host, Url, NORMALIZABLE_SCHEMES +from .util.queue import LifoQueue + + +xrange = six.moves.xrange + +log = logging.getLogger(__name__) + +_Default = object() + + +# Pool objects +class ConnectionPool(object): + """ + Base class for all connection pools, such as + :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. + """ + + scheme = None + QueueCls = LifoQueue + + def __init__(self, host, port=None): + if not host: + raise LocationValueError("No host specified.") + + self.host = _ipv6_host(host, self.scheme) + self._proxy_host = host.lower() + self.port = port + + def __str__(self): + return '%s(host=%r, port=%r)' % (type(self).__name__, + self.host, self.port) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + # Return False to re-raise any potential exceptions + return False + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + pass + + +# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 +_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} + + +class HTTPConnectionPool(ConnectionPool, RequestMethods): + """ + Thread-safe connection pool for one host. + + :param host: + Host used for this HTTP Connection (e.g. "localhost"), passed into + :class:`httplib.HTTPConnection`. + + :param port: + Port used for this HTTP Connection (None is equivalent to 80), passed + into :class:`httplib.HTTPConnection`. + + :param strict: + Causes BadStatusLine to be raised if the status line can't be parsed + as a valid HTTP/1.0 or 1.1 status line, passed into + :class:`httplib.HTTPConnection`. + + .. note:: + Only works in Python 2. This parameter is ignored in Python 3. + + :param timeout: + Socket timeout in seconds for each individual connection. This can + be a float or integer, which sets the timeout for the HTTP request, + or an instance of :class:`urllib3.util.Timeout` which gives you more + fine-grained control over request timeouts. After the constructor has + been parsed, this is always a `urllib3.util.Timeout` object. + + :param maxsize: + Number of connections to save that can be reused. More than 1 is useful + in multithreaded situations. If ``block`` is set to False, more + connections will be created but they will not be saved once they've + been used. + + :param block: + If set to True, no more than ``maxsize`` connections will be used at + a time. When no free connections are available, the call will block + until a connection has been released. This is a useful side effect for + particular multithreaded situations where one does not want to use more + than maxsize connections per host to prevent flooding. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param retries: + Retry configuration to use by default with requests in this pool. + + :param _proxy: + Parsed proxy URL, should not be used directly, instead, see + :class:`urllib3.connectionpool.ProxyManager`" + + :param _proxy_headers: + A dictionary with proxy headers, should not be used directly, + instead, see :class:`urllib3.connectionpool.ProxyManager`" + + :param \\**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. + """ + + scheme = 'http' + ConnectionCls = HTTPConnection + ResponseCls = HTTPResponse + + def __init__(self, host, port=None, strict=False, + timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, + headers=None, retries=None, + _proxy=None, _proxy_headers=None, + **conn_kw): + ConnectionPool.__init__(self, host, port) + RequestMethods.__init__(self, headers) + + self.strict = strict + + if not isinstance(timeout, Timeout): + timeout = Timeout.from_float(timeout) + + if retries is None: + retries = Retry.DEFAULT + + self.timeout = timeout + self.retries = retries + + self.pool = self.QueueCls(maxsize) + self.block = block + + self.proxy = _proxy + self.proxy_headers = _proxy_headers or {} + + # Fill the queue up so that doing get() on it will block properly + for _ in xrange(maxsize): + self.pool.put(None) + + # These are mostly for testing and debugging purposes. + self.num_connections = 0 + self.num_requests = 0 + self.conn_kw = conn_kw + + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault('socket_options', []) + + def _new_conn(self): + """ + Return a fresh :class:`HTTPConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTP connection (%d): %s:%s", + self.num_connections, self.host, self.port or "80") + + conn = self.ConnectionCls(host=self.host, port=self.port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + return conn + + def _get_conn(self, timeout=None): + """ + Get a connection. Will return a pooled connection if one is available. + + If no connections are available and :prop:`.block` is ``False``, then a + fresh connection is returned. + + :param timeout: + Seconds to wait before giving up and raising + :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and + :prop:`.block` is ``True``. + """ + conn = None + try: + conn = self.pool.get(block=self.block, timeout=timeout) + + except AttributeError: # self.pool is None + raise ClosedPoolError(self, "Pool is closed.") + + except queue.Empty: + if self.block: + raise EmptyPoolError(self, + "Pool reached maximum size and no more " + "connections are allowed.") + pass # Oh well, we'll create a new connection then + + # If this is a persistent connection, check if it got disconnected + if conn and is_connection_dropped(conn): + log.debug("Resetting dropped connection: %s", self.host) + conn.close() + if getattr(conn, 'auto_open', 1) == 0: + # This is a proxied connection that has been mutated by + # httplib._tunnel() and cannot be reused (since it would + # attempt to bypass the proxy) + conn = None + + return conn or self._new_conn() + + def _put_conn(self, conn): + """ + Put a connection back into the pool. + + :param conn: + Connection object for the current host and port as returned by + :meth:`._new_conn` or :meth:`._get_conn`. + + If the pool is already full, the connection is closed and discarded + because we exceeded maxsize. If connections are discarded frequently, + then maxsize should be increased. + + If the pool is closed, then the connection will be closed and discarded. + """ + try: + self.pool.put(conn, block=False) + return # Everything is dandy, done. + except AttributeError: + # self.pool is None. + pass + except queue.Full: + # This should never happen if self.block == True + log.warning( + "Connection pool is full, discarding connection: %s", + self.host) + + # Connection never got put back into the pool, close it. + if conn: + conn.close() + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + pass + + def _prepare_proxy(self, conn): + # Nothing to do for HTTP connections. + pass + + def _get_timeout(self, timeout): + """ Helper that always returns a :class:`urllib3.util.Timeout` """ + if timeout is _Default: + return self.timeout.clone() + + if isinstance(timeout, Timeout): + return timeout.clone() + else: + # User passed us an int/float. This is for backwards compatibility, + # can be removed later + return Timeout.from_float(timeout) + + def _raise_timeout(self, err, url, timeout_value): + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # See the above comment about EAGAIN in Python 3. In Python 2 we have + # to specifically catch it and throw the timeout error + if hasattr(err, 'errno') and err.errno in _blocking_errnos: + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # Catch possible read timeouts thrown as SSL errors. If not the + # case, rethrow the original. We need to do this because of: + # http://bugs.python.org/issue10272 + if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python < 2.7.4 + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + def _make_request(self, conn, method, url, timeout=_Default, chunked=False, + **httplib_request_kw): + """ + Perform a request on a given urllib connection object taken from our + pool. + + :param conn: + a connection from one of our connection pools + + :param timeout: + Socket timeout in seconds for the request. This can be a + float or integer, which will set the same timeout value for + the socket connect and the socket read, or an instance of + :class:`urllib3.util.Timeout`, which gives you more fine-grained + control over your timeouts. + """ + self.num_requests += 1 + + timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = timeout_obj.connect_timeout + + # Trigger any extra validation we need to do. + try: + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # conn.request() calls httplib.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + if chunked: + conn.request_chunked(method, url, **httplib_request_kw) + else: + conn.request(method, url, **httplib_request_kw) + + # Reset the timeout for the recv() on the socket + read_timeout = timeout_obj.read_timeout + + # App Engine doesn't have a sock attr + if getattr(conn, 'sock', None): + # In Python 3 socket.py will catch EAGAIN and return None when you + # try and read into the file pointer created by http.client, which + # instead raises a BadStatusLine exception. Instead of catching + # the exception and assuming all BadStatusLine exceptions are read + # timeouts, check for a zero timeout before making the request. + if read_timeout == 0: + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % read_timeout) + if read_timeout is Timeout.DEFAULT_TIMEOUT: + conn.sock.settimeout(socket.getdefaulttimeout()) + else: # None or a value + conn.sock.settimeout(read_timeout) + + # Receive the response from the server + try: + try: # Python 2.7, use buffering of HTTP responses + httplib_response = conn.getresponse(buffering=True) + except TypeError: # Python 3 + try: + httplib_response = conn.getresponse() + except Exception as e: + # Remove the TypeError from the exception chain in Python 3; + # otherwise it looks like a programming error was the cause. + six.raise_from(e, None) + except (SocketTimeout, BaseSSLError, SocketError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + raise + + # AppEngine doesn't have a version attr. + http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') + log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port, + method, url, http_version, httplib_response.status, + httplib_response.length) + + try: + assert_header_parsing(httplib_response.msg) + except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 + log.warning( + 'Failed to parse headers (url=%s): %s', + self._absolute_url(url), hpe, exc_info=True) + + return httplib_response + + def _absolute_url(self, path): + return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + if self.pool is None: + return + # Disable access to the pool + old_pool, self.pool = self.pool, None + + try: + while True: + conn = old_pool.get(block=False) + if conn: + conn.close() + + except queue.Empty: + pass # Done. + + def is_same_host(self, url): + """ + Check if the given ``url`` is a member of the same host as this + connection pool. + """ + if url.startswith('/'): + return True + + # TODO: Add optional support for socket.gethostbyname checking. + scheme, host, port = get_host(url) + + host = _ipv6_host(host, self.scheme) + + # Use explicit default port for comparison when none is given + if self.port and not port: + port = port_by_scheme.get(scheme) + elif not self.port and port == port_by_scheme.get(scheme): + port = None + + return (scheme, host, port) == (self.scheme, self.host, self.port) + + def urlopen(self, method, url, body=None, headers=None, retries=None, + redirect=True, assert_same_host=True, timeout=_Default, + pool_timeout=None, release_conn=None, chunked=False, + body_pos=None, **response_kw): + """ + Get a connection from the pool and perform an HTTP request. This is the + lowest level call for making a request, so you'll need to specify all + the raw details. + + .. note:: + + More commonly, it's appropriate to use a convenience method provided + by :class:`.RequestMethods`, such as :meth:`request`. + + .. note:: + + `release_conn` will only behave as expected if + `preload_content=False` because we want to make + `preload_content=False` the default behaviour someday soon without + breaking backwards compatibility. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param body: + Data to send in the request body (useful for creating + POST requests, see HTTPConnectionPool.post_url for + more convenience). + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. + + :param assert_same_host: + If ``True``, will make sure that the host of the pool requests is + consistent else will raise HostChangedError. When False, you can + use the pool on an HTTP proxy and request foreign hosts. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param pool_timeout: + If set and the pool is set to block=True, then this method will + block for ``pool_timeout`` seconds and raise EmptyPoolError if no + connection is available within the time period. + + :param release_conn: + If False, then the urlopen call will not release the connection + back into the pool once a response is received (but will release if + you read the entire contents of the response such as when + `preload_content=True`). This is useful if you're not preloading + the response's content immediately. You will need to call + ``r.release_conn()`` on the response ``r`` to return the connection + back into the pool. If None, it takes the value of + ``response_kw.get('preload_content', True)``. + + :param chunked: + If True, urllib3 will send the body using chunked transfer + encoding. Otherwise, urllib3 will send the body using the standard + content-length form. Defaults to False. + + :param int body_pos: + Position to seek to in file-like body in the event of a retry or + redirect. Typically this won't need to be set because urllib3 will + auto-populate the value when needed. + + :param \\**response_kw: + Additional parameters are passed to + :meth:`urllib3.response.HTTPResponse.from_httplib` + """ + if headers is None: + headers = self.headers + + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if release_conn is None: + release_conn = response_kw.get('preload_content', True) + + # Check host + if assert_same_host and not self.is_same_host(url): + raise HostChangedError(self, url, retries) + + conn = None + + # Track whether `conn` needs to be released before + # returning/raising/recursing. Update this variable if necessary, and + # leave `release_conn` constant throughout the function. That way, if + # the function recurses, the original value of `release_conn` will be + # passed down into the recursive call, and its value will be respected. + # + # See issue #651 [1] for details. + # + # [1] + release_this_conn = release_conn + + # Merge the proxy headers. Only do this in HTTP. We have to copy the + # headers dict so we can safely change it without those changes being + # reflected in anyone else's copy. + if self.scheme == 'http': + headers = headers.copy() + headers.update(self.proxy_headers) + + # Must keep the exception bound to a separate variable or else Python 3 + # complains about UnboundLocalError. + err = None + + # Keep track of whether we cleanly exited the except block. This + # ensures we do proper cleanup in finally. + clean_exit = False + + # Rewind body position, if needed. Record current position + # for future rewinds in the event of a redirect/retry. + body_pos = set_file_position(body, body_pos) + + try: + # Request a connection from the queue. + timeout_obj = self._get_timeout(timeout) + conn = self._get_conn(timeout=pool_timeout) + + conn.timeout = timeout_obj.connect_timeout + + is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) + if is_new_proxy_conn: + self._prepare_proxy(conn) + + # Make the request on the httplib connection object. + httplib_response = self._make_request(conn, method, url, + timeout=timeout_obj, + body=body, headers=headers, + chunked=chunked) + + # If we're going to release the connection in ``finally:``, then + # the response doesn't need to know about the connection. Otherwise + # it will also try to release it and we'll have a double-release + # mess. + response_conn = conn if not release_conn else None + + # Pass method to Response for length checking + response_kw['request_method'] = method + + # Import httplib's response into our own wrapper object + response = self.ResponseCls.from_httplib(httplib_response, + pool=self, + connection=response_conn, + retries=retries, + **response_kw) + + # Everything went great! + clean_exit = True + + except queue.Empty: + # Timed out by queue. + raise EmptyPoolError(self, "No pool connections are available.") + + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError, CertificateError) as e: + # Discard the connection for these exceptions. It will be + # replaced during the next _get_conn() call. + clean_exit = False + if isinstance(e, (BaseSSLError, CertificateError)): + e = SSLError(e) + elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: + e = ProxyError('Cannot connect to proxy.', e) + elif isinstance(e, (SocketError, HTTPException)): + e = ProtocolError('Connection aborted.', e) + + retries = retries.increment(method, url, error=e, _pool=self, + _stacktrace=sys.exc_info()[2]) + retries.sleep() + + # Keep track of the error for the retry warning. + err = e + + finally: + if not clean_exit: + # We hit some kind of exception, handled or otherwise. We need + # to throw the connection away unless explicitly told not to. + # Close the connection, set the variable to None, and make sure + # we put the None back in the pool to avoid leaking it. + conn = conn and conn.close() + release_this_conn = True + + if release_this_conn: + # Put the connection back to be reused. If the connection is + # expired then it will be None, which will get replaced with a + # fresh connection during _get_conn. + self._put_conn(conn) + + if not conn: + # Try again + log.warning("Retrying (%r) after connection " + "broken by '%r': %s", retries, err, url) + return self.urlopen(method, url, body, headers, retries, + redirect, assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + def drain_and_release_conn(response): + try: + # discard any remaining response body, the connection will be + # released back to the pool once the entire response is read + response.read() + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError) as e: + pass + + # Handle redirect? + redirect_location = redirect and response.get_redirect_location() + if redirect_location: + if response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep_for_retry(response) + log.debug("Redirecting %s -> %s", url, redirect_location) + return self.urlopen( + method, redirect_location, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(response.getheader('Retry-After')) + if retries.is_retry(method, response.status, has_retry_after): + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_status: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep(response) + log.debug("Retry: %s", url) + return self.urlopen( + method, url, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, + body_pos=body_pos, **response_kw) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + When Python is compiled with the :mod:`ssl` module, then + :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, + instead of :class:`.HTTPSConnection`. + + :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, + ``assert_hostname`` and ``host`` in this order to verify connections. + If ``assert_hostname`` is False, no verification is done. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, + ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is + available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade + the connection socket into an SSL socket. + """ + + scheme = 'https' + ConnectionCls = HTTPSConnection + + def __init__(self, host, port=None, + strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, + block=False, headers=None, retries=None, + _proxy=None, _proxy_headers=None, + key_file=None, cert_file=None, cert_reqs=None, + ca_certs=None, ssl_version=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None, **conn_kw): + + HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, + block, headers, retries, _proxy, _proxy_headers, + **conn_kw) + + if ca_certs and cert_reqs is None: + cert_reqs = 'CERT_REQUIRED' + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.ca_certs = ca_certs + self.ca_cert_dir = ca_cert_dir + self.ssl_version = ssl_version + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def _prepare_conn(self, conn): + """ + Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` + and establish the tunnel if proxy is used. + """ + + if isinstance(conn, VerifiedHTTPSConnection): + conn.set_cert(key_file=self.key_file, + cert_file=self.cert_file, + cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint) + conn.ssl_version = self.ssl_version + return conn + + def _prepare_proxy(self, conn): + """ + Establish tunnel connection early, because otherwise httplib + would improperly set Host: header to proxy's IP:port. + """ + conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) + conn.connect() + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPSConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTPS connection (%d): %s:%s", + self.num_connections, self.host, self.port or "443") + + if not self.ConnectionCls or self.ConnectionCls is DummyConnection: + raise SSLError("Can't connect to HTTPS URL because the SSL " + "module is not available.") + + actual_host = self.host + actual_port = self.port + if self.proxy is not None: + actual_host = self.proxy.host + actual_port = self.proxy.port + + conn = self.ConnectionCls(host=actual_host, port=actual_port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + + return self._prepare_conn(conn) + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + super(HTTPSConnectionPool, self)._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` + conn.connect() + + if not conn.is_verified: + warnings.warn(( + 'Unverified HTTPS request is being made. ' + 'Adding certificate verification is strongly advised. See: ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings'), + InsecureRequestWarning) + + +def connection_from_url(url, **kw): + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \\**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example:: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, host, port = get_host(url) + port = port or port_by_scheme.get(scheme, 80) + if scheme == 'https': + return HTTPSConnectionPool(host, port=port, **kw) + else: + return HTTPConnectionPool(host, port=port, **kw) + + +def _ipv6_host(host, scheme): + """ + Process IPv6 address literals + """ + + # httplib doesn't like it when we include brackets in IPv6 addresses + # Specifically, if we include brackets but also pass the port then + # httplib crazily doubles up the square brackets on the Host header. + # Instead, we need to make sure we never pass ``None`` as the port. + # However, for backward compatibility reasons we can't actually + # *assert* that. See http://bugs.python.org/issue28539 + # + # Also if an IPv6 address literal has a zone identifier, the + # percent sign might be URIencoded, convert it back into ASCII + if host.startswith('[') and host.endswith(']'): + host = host.replace('%25', '%').strip('[]') + if scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return host diff --git a/Contents/Libraries/Shared/urllib3/contrib/__init__.py b/Contents/Libraries/Shared/urllib3/contrib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/urllib3/contrib/_appengine_environ.py b/Contents/Libraries/Shared/urllib3/contrib/_appengine_environ.py new file mode 100644 index 000000000..f3e00942c --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/contrib/_appengine_environ.py @@ -0,0 +1,30 @@ +""" +This module provides means to detect the App Engine environment. +""" + +import os + + +def is_appengine(): + return (is_local_appengine() or + is_prod_appengine() or + is_prod_appengine_mvms()) + + +def is_appengine_sandbox(): + return is_appengine() and not is_prod_appengine_mvms() + + +def is_local_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Development/' in os.environ['SERVER_SOFTWARE']) + + +def is_prod_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and + not is_prod_appengine_mvms()) + + +def is_prod_appengine_mvms(): + return os.environ.get('GAE_VM', False) == 'true' diff --git a/Contents/Libraries/Shared/urllib3/contrib/_securetransport/__init__.py b/Contents/Libraries/Shared/urllib3/contrib/_securetransport/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/urllib3/contrib/_securetransport/bindings.py b/Contents/Libraries/Shared/urllib3/contrib/_securetransport/bindings.py new file mode 100644 index 000000000..bcf41c02b --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/contrib/_securetransport/bindings.py @@ -0,0 +1,593 @@ +""" +This module uses ctypes to bind a whole bunch of functions and constants from +SecureTransport. The goal here is to provide the low-level API to +SecureTransport. These are essentially the C-level functions and constants, and +they're pretty gross to work with. + +This code is a bastardised version of the code found in Will Bond's oscrypto +library. An enormous debt is owed to him for blazing this trail for us. For +that reason, this code should be considered to be covered both by urllib3's +license and by oscrypto's: + + Copyright (c) 2015-2016 Will Bond + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +""" +from __future__ import absolute_import + +import platform +from ctypes.util import find_library +from ctypes import ( + c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, + c_bool +) +from ctypes import CDLL, POINTER, CFUNCTYPE + + +security_path = find_library('Security') +if not security_path: + raise ImportError('The library Security could not be found') + + +core_foundation_path = find_library('CoreFoundation') +if not core_foundation_path: + raise ImportError('The library CoreFoundation could not be found') + + +version = platform.mac_ver()[0] +version_info = tuple(map(int, version.split('.'))) +if version_info < (10, 8): + raise OSError( + 'Only OS X 10.8 and newer are supported, not %s.%s' % ( + version_info[0], version_info[1] + ) + ) + +Security = CDLL(security_path, use_errno=True) +CoreFoundation = CDLL(core_foundation_path, use_errno=True) + +Boolean = c_bool +CFIndex = c_long +CFStringEncoding = c_uint32 +CFData = c_void_p +CFString = c_void_p +CFArray = c_void_p +CFMutableArray = c_void_p +CFDictionary = c_void_p +CFError = c_void_p +CFType = c_void_p +CFTypeID = c_ulong + +CFTypeRef = POINTER(CFType) +CFAllocatorRef = c_void_p + +OSStatus = c_int32 + +CFDataRef = POINTER(CFData) +CFStringRef = POINTER(CFString) +CFArrayRef = POINTER(CFArray) +CFMutableArrayRef = POINTER(CFMutableArray) +CFDictionaryRef = POINTER(CFDictionary) +CFArrayCallBacks = c_void_p +CFDictionaryKeyCallBacks = c_void_p +CFDictionaryValueCallBacks = c_void_p + +SecCertificateRef = POINTER(c_void_p) +SecExternalFormat = c_uint32 +SecExternalItemType = c_uint32 +SecIdentityRef = POINTER(c_void_p) +SecItemImportExportFlags = c_uint32 +SecItemImportExportKeyParameters = c_void_p +SecKeychainRef = POINTER(c_void_p) +SSLProtocol = c_uint32 +SSLCipherSuite = c_uint32 +SSLContextRef = POINTER(c_void_p) +SecTrustRef = POINTER(c_void_p) +SSLConnectionRef = c_uint32 +SecTrustResultType = c_uint32 +SecTrustOptionFlags = c_uint32 +SSLProtocolSide = c_uint32 +SSLConnectionType = c_uint32 +SSLSessionOption = c_uint32 + + +try: + Security.SecItemImport.argtypes = [ + CFDataRef, + CFStringRef, + POINTER(SecExternalFormat), + POINTER(SecExternalItemType), + SecItemImportExportFlags, + POINTER(SecItemImportExportKeyParameters), + SecKeychainRef, + POINTER(CFArrayRef), + ] + Security.SecItemImport.restype = OSStatus + + Security.SecCertificateGetTypeID.argtypes = [] + Security.SecCertificateGetTypeID.restype = CFTypeID + + Security.SecIdentityGetTypeID.argtypes = [] + Security.SecIdentityGetTypeID.restype = CFTypeID + + Security.SecKeyGetTypeID.argtypes = [] + Security.SecKeyGetTypeID.restype = CFTypeID + + Security.SecCertificateCreateWithData.argtypes = [ + CFAllocatorRef, + CFDataRef + ] + Security.SecCertificateCreateWithData.restype = SecCertificateRef + + Security.SecCertificateCopyData.argtypes = [ + SecCertificateRef + ] + Security.SecCertificateCopyData.restype = CFDataRef + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SecIdentityCreateWithCertificate.argtypes = [ + CFTypeRef, + SecCertificateRef, + POINTER(SecIdentityRef) + ] + Security.SecIdentityCreateWithCertificate.restype = OSStatus + + Security.SecKeychainCreate.argtypes = [ + c_char_p, + c_uint32, + c_void_p, + Boolean, + c_void_p, + POINTER(SecKeychainRef) + ] + Security.SecKeychainCreate.restype = OSStatus + + Security.SecKeychainDelete.argtypes = [ + SecKeychainRef + ] + Security.SecKeychainDelete.restype = OSStatus + + Security.SecPKCS12Import.argtypes = [ + CFDataRef, + CFDictionaryRef, + POINTER(CFArrayRef) + ] + Security.SecPKCS12Import.restype = OSStatus + + SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) + SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) + + Security.SSLSetIOFuncs.argtypes = [ + SSLContextRef, + SSLReadFunc, + SSLWriteFunc + ] + Security.SSLSetIOFuncs.restype = OSStatus + + Security.SSLSetPeerID.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerID.restype = OSStatus + + Security.SSLSetCertificate.argtypes = [ + SSLContextRef, + CFArrayRef + ] + Security.SSLSetCertificate.restype = OSStatus + + Security.SSLSetCertificateAuthorities.argtypes = [ + SSLContextRef, + CFTypeRef, + Boolean + ] + Security.SSLSetCertificateAuthorities.restype = OSStatus + + Security.SSLSetConnection.argtypes = [ + SSLContextRef, + SSLConnectionRef + ] + Security.SSLSetConnection.restype = OSStatus + + Security.SSLSetPeerDomainName.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerDomainName.restype = OSStatus + + Security.SSLHandshake.argtypes = [ + SSLContextRef + ] + Security.SSLHandshake.restype = OSStatus + + Security.SSLRead.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLRead.restype = OSStatus + + Security.SSLWrite.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLWrite.restype = OSStatus + + Security.SSLClose.argtypes = [ + SSLContextRef + ] + Security.SSLClose.restype = OSStatus + + Security.SSLGetNumberSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberSupportedCiphers.restype = OSStatus + + Security.SSLGetSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetSupportedCiphers.restype = OSStatus + + Security.SSLSetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + c_size_t + ] + Security.SSLSetEnabledCiphers.restype = OSStatus + + Security.SSLGetNumberEnabledCiphers.argtype = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberEnabledCiphers.restype = OSStatus + + Security.SSLGetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetEnabledCiphers.restype = OSStatus + + Security.SSLGetNegotiatedCipher.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite) + ] + Security.SSLGetNegotiatedCipher.restype = OSStatus + + Security.SSLGetNegotiatedProtocolVersion.argtypes = [ + SSLContextRef, + POINTER(SSLProtocol) + ] + Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus + + Security.SSLCopyPeerTrust.argtypes = [ + SSLContextRef, + POINTER(SecTrustRef) + ] + Security.SSLCopyPeerTrust.restype = OSStatus + + Security.SecTrustSetAnchorCertificates.argtypes = [ + SecTrustRef, + CFArrayRef + ] + Security.SecTrustSetAnchorCertificates.restype = OSStatus + + Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ + SecTrustRef, + Boolean + ] + Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus + + Security.SecTrustEvaluate.argtypes = [ + SecTrustRef, + POINTER(SecTrustResultType) + ] + Security.SecTrustEvaluate.restype = OSStatus + + Security.SecTrustGetCertificateCount.argtypes = [ + SecTrustRef + ] + Security.SecTrustGetCertificateCount.restype = CFIndex + + Security.SecTrustGetCertificateAtIndex.argtypes = [ + SecTrustRef, + CFIndex + ] + Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef + + Security.SSLCreateContext.argtypes = [ + CFAllocatorRef, + SSLProtocolSide, + SSLConnectionType + ] + Security.SSLCreateContext.restype = SSLContextRef + + Security.SSLSetSessionOption.argtypes = [ + SSLContextRef, + SSLSessionOption, + Boolean + ] + Security.SSLSetSessionOption.restype = OSStatus + + Security.SSLSetProtocolVersionMin.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMin.restype = OSStatus + + Security.SSLSetProtocolVersionMax.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMax.restype = OSStatus + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SSLReadFunc = SSLReadFunc + Security.SSLWriteFunc = SSLWriteFunc + Security.SSLContextRef = SSLContextRef + Security.SSLProtocol = SSLProtocol + Security.SSLCipherSuite = SSLCipherSuite + Security.SecIdentityRef = SecIdentityRef + Security.SecKeychainRef = SecKeychainRef + Security.SecTrustRef = SecTrustRef + Security.SecTrustResultType = SecTrustResultType + Security.SecExternalFormat = SecExternalFormat + Security.OSStatus = OSStatus + + Security.kSecImportExportPassphrase = CFStringRef.in_dll( + Security, 'kSecImportExportPassphrase' + ) + Security.kSecImportItemIdentity = CFStringRef.in_dll( + Security, 'kSecImportItemIdentity' + ) + + # CoreFoundation time! + CoreFoundation.CFRetain.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRetain.restype = CFTypeRef + + CoreFoundation.CFRelease.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRelease.restype = None + + CoreFoundation.CFGetTypeID.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFGetTypeID.restype = CFTypeID + + CoreFoundation.CFStringCreateWithCString.argtypes = [ + CFAllocatorRef, + c_char_p, + CFStringEncoding + ] + CoreFoundation.CFStringCreateWithCString.restype = CFStringRef + + CoreFoundation.CFStringGetCStringPtr.argtypes = [ + CFStringRef, + CFStringEncoding + ] + CoreFoundation.CFStringGetCStringPtr.restype = c_char_p + + CoreFoundation.CFStringGetCString.argtypes = [ + CFStringRef, + c_char_p, + CFIndex, + CFStringEncoding + ] + CoreFoundation.CFStringGetCString.restype = c_bool + + CoreFoundation.CFDataCreate.argtypes = [ + CFAllocatorRef, + c_char_p, + CFIndex + ] + CoreFoundation.CFDataCreate.restype = CFDataRef + + CoreFoundation.CFDataGetLength.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetLength.restype = CFIndex + + CoreFoundation.CFDataGetBytePtr.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetBytePtr.restype = c_void_p + + CoreFoundation.CFDictionaryCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + POINTER(CFTypeRef), + CFIndex, + CFDictionaryKeyCallBacks, + CFDictionaryValueCallBacks + ] + CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef + + CoreFoundation.CFDictionaryGetValue.argtypes = [ + CFDictionaryRef, + CFTypeRef + ] + CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef + + CoreFoundation.CFArrayCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreate.restype = CFArrayRef + + CoreFoundation.CFArrayCreateMutable.argtypes = [ + CFAllocatorRef, + CFIndex, + CFArrayCallBacks + ] + CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef + + CoreFoundation.CFArrayAppendValue.argtypes = [ + CFMutableArrayRef, + c_void_p + ] + CoreFoundation.CFArrayAppendValue.restype = None + + CoreFoundation.CFArrayGetCount.argtypes = [ + CFArrayRef + ] + CoreFoundation.CFArrayGetCount.restype = CFIndex + + CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ + CFArrayRef, + CFIndex + ] + CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p + + CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( + CoreFoundation, 'kCFAllocatorDefault' + ) + CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') + CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' + ) + CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryValueCallBacks' + ) + + CoreFoundation.CFTypeRef = CFTypeRef + CoreFoundation.CFArrayRef = CFArrayRef + CoreFoundation.CFStringRef = CFStringRef + CoreFoundation.CFDictionaryRef = CFDictionaryRef + +except (AttributeError): + raise ImportError('Error initializing ctypes') + + +class CFConst(object): + """ + A class object that acts as essentially a namespace for CoreFoundation + constants. + """ + kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) + + +class SecurityConst(object): + """ + A class object that acts as essentially a namespace for Security constants. + """ + kSSLSessionOptionBreakOnServerAuth = 0 + + kSSLProtocol2 = 1 + kSSLProtocol3 = 2 + kTLSProtocol1 = 4 + kTLSProtocol11 = 7 + kTLSProtocol12 = 8 + + kSSLClientSide = 1 + kSSLStreamType = 0 + + kSecFormatPEMSequence = 10 + + kSecTrustResultInvalid = 0 + kSecTrustResultProceed = 1 + # This gap is present on purpose: this was kSecTrustResultConfirm, which + # is deprecated. + kSecTrustResultDeny = 3 + kSecTrustResultUnspecified = 4 + kSecTrustResultRecoverableTrustFailure = 5 + kSecTrustResultFatalTrustFailure = 6 + kSecTrustResultOtherError = 7 + + errSSLProtocol = -9800 + errSSLWouldBlock = -9803 + errSSLClosedGraceful = -9805 + errSSLClosedNoNotify = -9816 + errSSLClosedAbort = -9806 + + errSSLXCertChainInvalid = -9807 + errSSLCrypto = -9809 + errSSLInternal = -9810 + errSSLCertExpired = -9814 + errSSLCertNotYetValid = -9815 + errSSLUnknownRootCert = -9812 + errSSLNoRootCert = -9813 + errSSLHostNameMismatch = -9843 + errSSLPeerHandshakeFail = -9824 + errSSLPeerUserCancelled = -9839 + errSSLWeakPeerEphemeralDHKey = -9850 + errSSLServerAuthCompleted = -9841 + errSSLRecordOverflow = -9847 + + errSecVerifyFailed = -67808 + errSecNoTrustSettings = -25263 + errSecItemNotFound = -25300 + errSecInvalidTrustSettings = -25262 + + # Cipher suites. We only pick the ones our default cipher string allows. + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F + TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 + TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F + TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B + TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A + TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 + TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 + TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D + TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C + TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D + TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C + TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 + TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F + TLS_AES_128_GCM_SHA256 = 0x1301 + TLS_AES_256_GCM_SHA384 = 0x1302 + TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/Contents/Libraries/Shared/urllib3/contrib/_securetransport/low_level.py b/Contents/Libraries/Shared/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 000000000..b13cd9e72 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/contrib/_securetransport/low_level.py @@ -0,0 +1,346 @@ +""" +Low-level helpers for the SecureTransport bindings. + +These are Python functions that are not directly related to the high-level APIs +but are necessary to get them to work. They include a whole bunch of low-level +CoreFoundation messing about and memory management. The concerns in this module +are almost entirely about trying to avoid memory leaks and providing +appropriate and useful assistance to the higher-level code. +""" +import base64 +import ctypes +import itertools +import re +import os +import ssl +import tempfile + +from .bindings import Security, CoreFoundation, CFConst + + +# This regular expression is used to grab PEM data out of a PEM bundle. +_PEM_CERTS_RE = re.compile( + b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL +) + + +def _cf_data_from_bytes(bytestring): + """ + Given a bytestring, create a CFData object from it. This CFData object must + be CFReleased by the caller. + """ + return CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) + ) + + +def _cf_dictionary_from_tuples(tuples): + """ + Given a list of Python tuples, create an associated CFDictionary. + """ + dictionary_size = len(tuples) + + # We need to get the dictionary keys and values out in the same order. + keys = (t[0] for t in tuples) + values = (t[1] for t in tuples) + cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) + cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) + + return CoreFoundation.CFDictionaryCreate( + CoreFoundation.kCFAllocatorDefault, + cf_keys, + cf_values, + dictionary_size, + CoreFoundation.kCFTypeDictionaryKeyCallBacks, + CoreFoundation.kCFTypeDictionaryValueCallBacks, + ) + + +def _cf_string_to_unicode(value): + """ + Creates a Unicode string from a CFString object. Used entirely for error + reporting. + + Yes, it annoys me quite a lot that this function is this complex. + """ + value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) + + string = CoreFoundation.CFStringGetCStringPtr( + value_as_void_p, + CFConst.kCFStringEncodingUTF8 + ) + if string is None: + buffer = ctypes.create_string_buffer(1024) + result = CoreFoundation.CFStringGetCString( + value_as_void_p, + buffer, + 1024, + CFConst.kCFStringEncodingUTF8 + ) + if not result: + raise OSError('Error copying C string from CFStringRef') + string = buffer.value + if string is not None: + string = string.decode('utf-8') + return string + + +def _assert_no_error(error, exception_class=None): + """ + Checks the return code and throws an exception if there is an error to + report + """ + if error == 0: + return + + cf_error_string = Security.SecCopyErrorMessageString(error, None) + output = _cf_string_to_unicode(cf_error_string) + CoreFoundation.CFRelease(cf_error_string) + + if output is None or output == u'': + output = u'OSStatus %s' % error + + if exception_class is None: + exception_class = ssl.SSLError + + raise exception_class(output) + + +def _cert_array_from_pem(pem_bundle): + """ + Given a bundle of certs in PEM format, turns them into a CFArray of certs + that can be used to validate a cert chain. + """ + # Normalize the PEM bundle's line endings. + pem_bundle = pem_bundle.replace(b"\r\n", b"\n") + + der_certs = [ + base64.b64decode(match.group(1)) + for match in _PEM_CERTS_RE.finditer(pem_bundle) + ] + if not der_certs: + raise ssl.SSLError("No root certificates specified") + + cert_array = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks) + ) + if not cert_array: + raise ssl.SSLError("Unable to allocate memory!") + + try: + for der_bytes in der_certs: + certdata = _cf_data_from_bytes(der_bytes) + if not certdata: + raise ssl.SSLError("Unable to allocate memory!") + cert = Security.SecCertificateCreateWithData( + CoreFoundation.kCFAllocatorDefault, certdata + ) + CoreFoundation.CFRelease(certdata) + if not cert: + raise ssl.SSLError("Unable to build cert object!") + + CoreFoundation.CFArrayAppendValue(cert_array, cert) + CoreFoundation.CFRelease(cert) + except Exception: + # We need to free the array before the exception bubbles further. + # We only want to do that if an error occurs: otherwise, the caller + # should free. + CoreFoundation.CFRelease(cert_array) + + return cert_array + + +def _is_cert(item): + """ + Returns True if a given CFTypeRef is a certificate. + """ + expected = Security.SecCertificateGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _is_identity(item): + """ + Returns True if a given CFTypeRef is an identity. + """ + expected = Security.SecIdentityGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _temporary_keychain(): + """ + This function creates a temporary Mac keychain that we can use to work with + credentials. This keychain uses a one-time password and a temporary file to + store the data. We expect to have one keychain per socket. The returned + SecKeychainRef must be freed by the caller, including calling + SecKeychainDelete. + + Returns a tuple of the SecKeychainRef and the path to the temporary + directory that contains it. + """ + # Unfortunately, SecKeychainCreate requires a path to a keychain. This + # means we cannot use mkstemp to use a generic temporary file. Instead, + # we're going to create a temporary directory and a filename to use there. + # This filename will be 8 random bytes expanded into base64. We also need + # some random bytes to password-protect the keychain we're creating, so we + # ask for 40 random bytes. + random_bytes = os.urandom(40) + filename = base64.b16encode(random_bytes[:8]).decode('utf-8') + password = base64.b16encode(random_bytes[8:]) # Must be valid UTF-8 + tempdirectory = tempfile.mkdtemp() + + keychain_path = os.path.join(tempdirectory, filename).encode('utf-8') + + # We now want to create the keychain itself. + keychain = Security.SecKeychainRef() + status = Security.SecKeychainCreate( + keychain_path, + len(password), + password, + False, + None, + ctypes.byref(keychain) + ) + _assert_no_error(status) + + # Having created the keychain, we want to pass it off to the caller. + return keychain, tempdirectory + + +def _load_items_from_file(keychain, path): + """ + Given a single file, loads all the trust objects from it into arrays and + the keychain. + Returns a tuple of lists: the first list is a list of identities, the + second a list of certs. + """ + certificates = [] + identities = [] + result_array = None + + with open(path, 'rb') as f: + raw_filedata = f.read() + + try: + filedata = CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, + raw_filedata, + len(raw_filedata) + ) + result_array = CoreFoundation.CFArrayRef() + result = Security.SecItemImport( + filedata, # cert data + None, # Filename, leaving it out for now + None, # What the type of the file is, we don't care + None, # what's in the file, we don't care + 0, # import flags + None, # key params, can include passphrase in the future + keychain, # The keychain to insert into + ctypes.byref(result_array) # Results + ) + _assert_no_error(result) + + # A CFArray is not very useful to us as an intermediary + # representation, so we are going to extract the objects we want + # and then free the array. We don't need to keep hold of keys: the + # keychain already has them! + result_count = CoreFoundation.CFArrayGetCount(result_array) + for index in range(result_count): + item = CoreFoundation.CFArrayGetValueAtIndex( + result_array, index + ) + item = ctypes.cast(item, CoreFoundation.CFTypeRef) + + if _is_cert(item): + CoreFoundation.CFRetain(item) + certificates.append(item) + elif _is_identity(item): + CoreFoundation.CFRetain(item) + identities.append(item) + finally: + if result_array: + CoreFoundation.CFRelease(result_array) + + CoreFoundation.CFRelease(filedata) + + return (identities, certificates) + + +def _load_client_cert_chain(keychain, *paths): + """ + Load certificates and maybe keys from a number of files. Has the end goal + of returning a CFArray containing one SecIdentityRef, and then zero or more + SecCertificateRef objects, suitable for use as a client certificate trust + chain. + """ + # Ok, the strategy. + # + # This relies on knowing that macOS will not give you a SecIdentityRef + # unless you have imported a key into a keychain. This is a somewhat + # artificial limitation of macOS (for example, it doesn't necessarily + # affect iOS), but there is nothing inside Security.framework that lets you + # get a SecIdentityRef without having a key in a keychain. + # + # So the policy here is we take all the files and iterate them in order. + # Each one will use SecItemImport to have one or more objects loaded from + # it. We will also point at a keychain that macOS can use to work with the + # private key. + # + # Once we have all the objects, we'll check what we actually have. If we + # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, + # we'll take the first certificate (which we assume to be our leaf) and + # ask the keychain to give us a SecIdentityRef with that cert's associated + # key. + # + # We'll then return a CFArray containing the trust chain: one + # SecIdentityRef and then zero-or-more SecCertificateRef objects. The + # responsibility for freeing this CFArray will be with the caller. This + # CFArray must remain alive for the entire connection, so in practice it + # will be stored with a single SSLSocket, along with the reference to the + # keychain. + certificates = [] + identities = [] + + # Filter out bad paths. + paths = (path for path in paths if path) + + try: + for file_path in paths: + new_identities, new_certs = _load_items_from_file( + keychain, file_path + ) + identities.extend(new_identities) + certificates.extend(new_certs) + + # Ok, we have everything. The question is: do we have an identity? If + # not, we want to grab one from the first cert we have. + if not identities: + new_identity = Security.SecIdentityRef() + status = Security.SecIdentityCreateWithCertificate( + keychain, + certificates[0], + ctypes.byref(new_identity) + ) + _assert_no_error(status) + identities.append(new_identity) + + # We now want to release the original certificate, as we no longer + # need it. + CoreFoundation.CFRelease(certificates.pop(0)) + + # We now need to build a new CFArray that holds the trust chain. + trust_chain = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + for item in itertools.chain(identities, certificates): + # ArrayAppendValue does a CFRetain on the item. That's fine, + # because the finally block will release our other refs to them. + CoreFoundation.CFArrayAppendValue(trust_chain, item) + + return trust_chain + finally: + for obj in itertools.chain(identities, certificates): + CoreFoundation.CFRelease(obj) diff --git a/Contents/Libraries/Shared/urllib3/contrib/appengine.py b/Contents/Libraries/Shared/urllib3/contrib/appengine.py new file mode 100644 index 000000000..2952f114d --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/contrib/appengine.py @@ -0,0 +1,289 @@ +""" +This module provides a pool manager that uses Google App Engine's +`URLFetch Service `_. + +Example usage:: + + from urllib3 import PoolManager + from urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox + + if is_appengine_sandbox(): + # AppEngineManager uses AppEngine's URLFetch API behind the scenes + http = AppEngineManager() + else: + # PoolManager uses a socket-level API behind the scenes + http = PoolManager() + + r = http.request('GET', 'https://google.com/') + +There are `limitations `_ to the URLFetch service and it may not be +the best choice for your application. There are three options for using +urllib3 on Google App Engine: + +1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is + cost-effective in many circumstances as long as your usage is within the + limitations. +2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. + Sockets also have `limitations and restrictions + `_ and have a lower free quota than URLFetch. + To use sockets, be sure to specify the following in your ``app.yaml``:: + + env_variables: + GAE_USE_SOCKETS_HTTPLIB : 'true' + +3. If you are using `App Engine Flexible +`_, you can use the standard +:class:`PoolManager` without any configuration or special environment variables. +""" + +from __future__ import absolute_import +import io +import logging +import warnings +from ..packages.six.moves.urllib.parse import urljoin + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + TimeoutError, + SSLError +) + +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.timeout import Timeout +from ..util.retry import Retry +from . import _appengine_environ + +try: + from google.appengine.api import urlfetch +except ImportError: + urlfetch = None + + +log = logging.getLogger(__name__) + + +class AppEnginePlatformWarning(HTTPWarning): + pass + + +class AppEnginePlatformError(HTTPError): + pass + + +class AppEngineManager(RequestMethods): + """ + Connection manager for Google App Engine sandbox applications. + + This manager uses the URLFetch service directly instead of using the + emulated httplib, and is subject to URLFetch limitations as described in + the App Engine documentation `here + `_. + + Notably it will raise an :class:`AppEnginePlatformError` if: + * URLFetch is not available. + * If you attempt to use this on App Engine Flexible, as full socket + support is available. + * If a request size is more than 10 megabytes. + * If a response size is more than 32 megabtyes. + * If you use an unsupported request method such as OPTIONS. + + Beyond those cases, it will raise normal urllib3 errors. + """ + + def __init__(self, headers=None, retries=None, validate_certificate=True, + urlfetch_retries=True): + if not urlfetch: + raise AppEnginePlatformError( + "URLFetch is not available in this environment.") + + if is_prod_appengine_mvms(): + raise AppEnginePlatformError( + "Use normal urllib3.PoolManager instead of AppEngineManager" + "on Managed VMs, as using URLFetch is not necessary in " + "this environment.") + + warnings.warn( + "urllib3 is using URLFetch on Google App Engine sandbox instead " + "of sockets. To use sockets directly instead of URLFetch see " + "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", + AppEnginePlatformWarning) + + RequestMethods.__init__(self, headers) + self.validate_certificate = validate_certificate + self.urlfetch_retries = urlfetch_retries + + self.retries = retries or Retry.DEFAULT + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # Return False to re-raise any potential exceptions + return False + + def urlopen(self, method, url, body=None, headers=None, + retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, + **response_kw): + + retries = self._get_retries(retries, redirect) + + try: + follow_redirects = ( + redirect and + retries.redirect != 0 and + retries.total) + response = urlfetch.fetch( + url, + payload=body, + method=method, + headers=headers or {}, + allow_truncated=False, + follow_redirects=self.urlfetch_retries and follow_redirects, + deadline=self._get_absolute_timeout(timeout), + validate_certificate=self.validate_certificate, + ) + except urlfetch.DeadlineExceededError as e: + raise TimeoutError(self, e) + + except urlfetch.InvalidURLError as e: + if 'too large' in str(e): + raise AppEnginePlatformError( + "URLFetch request too large, URLFetch only " + "supports requests up to 10mb in size.", e) + raise ProtocolError(e) + + except urlfetch.DownloadError as e: + if 'Too many redirects' in str(e): + raise MaxRetryError(self, url, reason=e) + raise ProtocolError(e) + + except urlfetch.ResponseTooLargeError as e: + raise AppEnginePlatformError( + "URLFetch response too large, URLFetch only supports" + "responses up to 32mb in size.", e) + + except urlfetch.SSLCertificateError as e: + raise SSLError(e) + + except urlfetch.InvalidMethodError as e: + raise AppEnginePlatformError( + "URLFetch does not support method: %s" % method, e) + + http_response = self._urlfetch_response_to_http_response( + response, retries=retries, **response_kw) + + # Handle redirect? + redirect_location = redirect and http_response.get_redirect_location() + if redirect_location: + # Check for redirect response + if (self.urlfetch_retries and retries.raise_on_redirect): + raise MaxRetryError(self, url, "too many redirects") + else: + if http_response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=http_response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + raise MaxRetryError(self, url, "too many redirects") + return http_response + + retries.sleep_for_retry(http_response) + log.debug("Redirecting %s -> %s", url, redirect_location) + redirect_url = urljoin(url, redirect_location) + return self.urlopen( + method, redirect_url, body, headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(http_response.getheader('Retry-After')) + if retries.is_retry(method, http_response.status, has_retry_after): + retries = retries.increment( + method, url, response=http_response, _pool=self) + log.debug("Retry: %s", url) + retries.sleep(http_response) + return self.urlopen( + method, url, + body=body, headers=headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + return http_response + + def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): + + if is_prod_appengine(): + # Production GAE handles deflate encoding automatically, but does + # not remove the encoding header. + content_encoding = urlfetch_resp.headers.get('content-encoding') + + if content_encoding == 'deflate': + del urlfetch_resp.headers['content-encoding'] + + transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') + # We have a full response's content, + # so let's make sure we don't report ourselves as chunked data. + if transfer_encoding == 'chunked': + encodings = transfer_encoding.split(",") + encodings.remove('chunked') + urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) + + original_response = HTTPResponse( + # In order for decoding to work, we must present the content as + # a file-like object. + body=io.BytesIO(urlfetch_resp.content), + msg=urlfetch_resp.header_msg, + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + return HTTPResponse( + body=io.BytesIO(urlfetch_resp.content), + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + original_response=original_response, + **response_kw + ) + + def _get_absolute_timeout(self, timeout): + if timeout is Timeout.DEFAULT_TIMEOUT: + return None # Defer to URLFetch's default. + if isinstance(timeout, Timeout): + if timeout._read is not None or timeout._connect is not None: + warnings.warn( + "URLFetch does not support granular timeout settings, " + "reverting to total or default URLFetch timeout.", + AppEnginePlatformWarning) + return timeout.total + return timeout + + def _get_retries(self, retries, redirect): + if not isinstance(retries, Retry): + retries = Retry.from_int( + retries, redirect=redirect, default=self.retries) + + if retries.connect or retries.read or retries.redirect: + warnings.warn( + "URLFetch only supports total retries and does not " + "recognize connect, read, or redirect retry parameters.", + AppEnginePlatformWarning) + + return retries + + +# Alias methods from _appengine_environ to maintain public API interface. + +is_appengine = _appengine_environ.is_appengine +is_appengine_sandbox = _appengine_environ.is_appengine_sandbox +is_local_appengine = _appengine_environ.is_local_appengine +is_prod_appengine = _appengine_environ.is_prod_appengine +is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/Contents/Libraries/Shared/urllib3/contrib/ntlmpool.py b/Contents/Libraries/Shared/urllib3/contrib/ntlmpool.py new file mode 100644 index 000000000..8ea127c58 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/contrib/ntlmpool.py @@ -0,0 +1,111 @@ +""" +NTLM authenticating pool, contributed by erikcederstran + +Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 +""" +from __future__ import absolute_import + +from logging import getLogger +from ntlm import ntlm + +from .. import HTTPSConnectionPool +from ..packages.six.moves.http_client import HTTPSConnection + + +log = getLogger(__name__) + + +class NTLMConnectionPool(HTTPSConnectionPool): + """ + Implements an NTLM authentication version of an urllib3 connection pool + """ + + scheme = 'https' + + def __init__(self, user, pw, authurl, *args, **kwargs): + """ + authurl is a random URL on the server that is protected by NTLM. + user is the Windows user, probably in the DOMAIN\\username format. + pw is the password for the user. + """ + super(NTLMConnectionPool, self).__init__(*args, **kwargs) + self.authurl = authurl + self.rawuser = user + user_parts = user.split('\\', 1) + self.domain = user_parts[0].upper() + self.user = user_parts[1] + self.pw = pw + + def _new_conn(self): + # Performs the NTLM handshake that secures the connection. The socket + # must be kept open while requests are performed. + self.num_connections += 1 + log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', + self.num_connections, self.host, self.authurl) + + headers = {'Connection': 'Keep-Alive'} + req_header = 'Authorization' + resp_header = 'www-authenticate' + + conn = HTTPSConnection(host=self.host, port=self.port) + + # Send negotiation message + headers[req_header] = ( + 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + reshdr = dict(res.getheaders()) + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', reshdr) + log.debug('Response data: %s [...]', res.read(100)) + + # Remove the reference to the socket, so that it can not be closed by + # the response object (we want to keep the socket open) + res.fp = None + + # Server should respond with a challenge message + auth_header_values = reshdr[resp_header].split(', ') + auth_header_value = None + for s in auth_header_values: + if s[:5] == 'NTLM ': + auth_header_value = s[5:] + if auth_header_value is None: + raise Exception('Unexpected %s response header: %s' % + (resp_header, reshdr[resp_header])) + + # Send authentication message + ServerChallenge, NegotiateFlags = \ + ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) + auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, + self.user, + self.domain, + self.pw, + NegotiateFlags) + headers[req_header] = 'NTLM %s' % auth_msg + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', dict(res.getheaders())) + log.debug('Response data: %s [...]', res.read()[:100]) + if res.status != 200: + if res.status == 401: + raise Exception('Server rejected request: wrong ' + 'username or password') + raise Exception('Wrong server response: %s %s' % + (res.status, res.reason)) + + res.fp = None + log.debug('Connection established') + return conn + + def urlopen(self, method, url, body=None, headers=None, retries=3, + redirect=True, assert_same_host=True): + if headers is None: + headers = {} + headers['Connection'] = 'Keep-Alive' + return super(NTLMConnectionPool, self).urlopen(method, url, body, + headers, retries, + redirect, + assert_same_host) diff --git a/Contents/Libraries/Shared/urllib3/contrib/pyopenssl.py b/Contents/Libraries/Shared/urllib3/contrib/pyopenssl.py new file mode 100644 index 000000000..7c0e9465d --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/contrib/pyopenssl.py @@ -0,0 +1,466 @@ +""" +SSL with SNI_-support for Python 2. Follow these instructions if you would +like to verify SSL certificates in Python 2. Note, the default libraries do +*not* do certificate checking; you need to do additional work to validate +certificates yourself. + +This needs the following packages installed: + +* pyOpenSSL (tested with 16.0.0) +* cryptography (minimum 1.3.4, from pyopenssl) +* idna (minimum 2.0, from cryptography) + +However, pyopenssl depends on cryptography, which depends on idna, so while we +use all three directly here we end up having relatively few packages required. + +You can install them with the following command: + + pip install pyopenssl cryptography idna + +To activate certificate checking, call +:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code +before you begin making HTTP requests. This can be done in a ``sitecustomize`` +module, or at any other time before your application begins using ``urllib3``, +like this:: + + try: + import urllib3.contrib.pyopenssl + urllib3.contrib.pyopenssl.inject_into_urllib3() + except ImportError: + pass + +Now you can use :mod:`urllib3` as you normally would, and it will support SNI +when the required modules are installed. + +Activating this module also has the positive side effect of disabling SSL/TLS +compression in Python 2 (see `CRIME attack`_). + +If you want to configure the default list of supported cipher suites, you can +set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. + +.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication +.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) +""" +from __future__ import absolute_import + +import OpenSSL.SSL +from cryptography import x509 +from cryptography.hazmat.backends.openssl import backend as openssl_backend +from cryptography.hazmat.backends.openssl.x509 import _Certificate +try: + from cryptography.x509 import UnsupportedExtension +except ImportError: + # UnsupportedExtension is gone in cryptography >= 2.1.0 + class UnsupportedExtension(Exception): + pass + +from socket import timeout, error as SocketError +from io import BytesIO + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +import logging +import ssl +from ..packages import six +import sys + +from .. import util + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works. +HAS_SNI = True + +# Map from urllib3 to PyOpenSSL compatible parameter-values. +_openssl_versions = { + ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, + ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, +} + +if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD + +if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD + +try: + _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) +except AttributeError: + pass + +_stdlib_to_openssl_verify = { + ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, + ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, + ssl.CERT_REQUIRED: + OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, +} +_openssl_to_stdlib_verify = dict( + (v, k) for k, v in _stdlib_to_openssl_verify.items() +) + +# OpenSSL will only write 16K at a time +SSL_WRITE_BLOCKSIZE = 16384 + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + + +log = logging.getLogger(__name__) + + +def inject_into_urllib3(): + 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' + + _validate_dependencies_met() + + util.ssl_.SSLContext = PyOpenSSLContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_PYOPENSSL = True + util.ssl_.IS_PYOPENSSL = True + + +def extract_from_urllib3(): + 'Undo monkey-patching by :func:`inject_into_urllib3`.' + + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_PYOPENSSL = False + util.ssl_.IS_PYOPENSSL = False + + +def _validate_dependencies_met(): + """ + Verifies that PyOpenSSL's package-level dependencies have been met. + Throws `ImportError` if they are not met. + """ + # Method added in `cryptography==1.1`; not available in older versions + from cryptography.x509.extensions import Extensions + if getattr(Extensions, "get_extension_for_class", None) is None: + raise ImportError("'cryptography' module missing required functionality. " + "Try upgrading to v1.3.4 or newer.") + + # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 + # attribute is only present on those versions. + from OpenSSL.crypto import X509 + x509 = X509() + if getattr(x509, "_x509", None) is None: + raise ImportError("'pyOpenSSL' module missing required functionality. " + "Try upgrading to v0.14 or newer.") + + +def _dnsname_to_stdlib(name): + """ + Converts a dNSName SubjectAlternativeName field to the form used by the + standard library on the given Python version. + + Cryptography produces a dNSName as a unicode string that was idna-decoded + from ASCII bytes. We need to idna-encode that string to get it back, and + then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib + uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). + + If the name cannot be idna-encoded then we return None signalling that + the name given should be skipped. + """ + def idna_encode(name): + """ + Borrowed wholesale from the Python Cryptography Project. It turns out + that we can't just safely call `idna.encode`: it can explode for + wildcard names. This avoids that problem. + """ + import idna + + try: + for prefix in [u'*.', u'.']: + if name.startswith(prefix): + name = name[len(prefix):] + return prefix.encode('ascii') + idna.encode(name) + return idna.encode(name) + except idna.core.IDNAError: + return None + + name = idna_encode(name) + if name is None: + return None + elif sys.version_info >= (3, 0): + name = name.decode('utf-8') + return name + + +def get_subj_alt_name(peer_cert): + """ + Given an PyOpenSSL certificate, provides all the subject alternative names. + """ + # Pass the cert to cryptography, which has much better APIs for this. + if hasattr(peer_cert, "to_cryptography"): + cert = peer_cert.to_cryptography() + else: + # This is technically using private APIs, but should work across all + # relevant versions before PyOpenSSL got a proper API for this. + cert = _Certificate(openssl_backend, peer_cert._x509) + + # We want to find the SAN extension. Ask Cryptography to locate it (it's + # faster than looping in Python) + try: + ext = cert.extensions.get_extension_for_class( + x509.SubjectAlternativeName + ).value + except x509.ExtensionNotFound: + # No such extension, return the empty list. + return [] + except (x509.DuplicateExtension, UnsupportedExtension, + x509.UnsupportedGeneralNameType, UnicodeError) as e: + # A problem has been found with the quality of the certificate. Assume + # no SAN field is present. + log.warning( + "A problem was encountered with the certificate that prevented " + "urllib3 from finding the SubjectAlternativeName field. This can " + "affect certificate validation. The error was %s", + e, + ) + return [] + + # We want to return dNSName and iPAddress fields. We need to cast the IPs + # back to strings because the match_hostname function wants them as + # strings. + # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 + # decoded. This is pretty frustrating, but that's what the standard library + # does with certificates, and so we need to attempt to do the same. + # We also want to skip over names which cannot be idna encoded. + names = [ + ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) + if name is not None + ] + names.extend( + ('IP Address', str(name)) + for name in ext.get_values_for_type(x509.IPAddress) + ) + + return names + + +class WrappedSocket(object): + '''API-compatibility wrapper for Python OpenSSL's Connection-class. + + Note: _makefile_refs, _drop() and _reuse() are needed for the garbage + collector of pypy. + ''' + + def __init__(self, connection, socket, suppress_ragged_eofs=True): + self.connection = connection + self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._makefile_refs = 0 + self._closed = False + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, *args, **kwargs): + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return b'' + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return b'' + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout('The read operation timed out') + else: + return self.recv(*args, **kwargs) + else: + return data + + def recv_into(self, *args, **kwargs): + try: + return self.connection.recv_into(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return 0 + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return 0 + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout('The read operation timed out') + else: + return self.recv_into(*args, **kwargs) + + def settimeout(self, timeout): + return self.socket.settimeout(timeout) + + def _send_until_done(self, data): + while True: + try: + return self.connection.send(data) + except OpenSSL.SSL.WantWriteError: + if not util.wait_for_write(self.socket, self.socket.gettimeout()): + raise timeout() + continue + except OpenSSL.SSL.SysCallError as e: + raise SocketError(str(e)) + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + # FIXME rethrow compatible exceptions should we ever use this + self.connection.shutdown() + + def close(self): + if self._makefile_refs < 1: + try: + self._closed = True + return self.connection.close() + except OpenSSL.SSL.Error: + return + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + x509 = self.connection.get_peer_certificate() + + if not x509: + return x509 + + if binary_form: + return OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_ASN1, + x509) + + return { + 'subject': ( + (('commonName', x509.get_subject().CN),), + ), + 'subjectAltName': get_subj_alt_name(x509) + } + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + makefile = backport_makefile + +WrappedSocket.makefile = makefile + + +class PyOpenSSLContext(object): + """ + I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible + for translating the interface of the standard library ``SSLContext`` object + to calls into PyOpenSSL. + """ + def __init__(self, protocol): + self.protocol = _openssl_versions[protocol] + self._ctx = OpenSSL.SSL.Context(self.protocol) + self._options = 0 + self.check_hostname = False + + @property + def options(self): + return self._options + + @options.setter + def options(self, value): + self._options = value + self._ctx.set_options(value) + + @property + def verify_mode(self): + return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] + + @verify_mode.setter + def verify_mode(self, value): + self._ctx.set_verify( + _stdlib_to_openssl_verify[value], + _verify_callback + ) + + def set_default_verify_paths(self): + self._ctx.set_default_verify_paths() + + def set_ciphers(self, ciphers): + if isinstance(ciphers, six.text_type): + ciphers = ciphers.encode('utf-8') + self._ctx.set_cipher_list(ciphers) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + if cafile is not None: + cafile = cafile.encode('utf-8') + if capath is not None: + capath = capath.encode('utf-8') + self._ctx.load_verify_locations(cafile, capath) + if cadata is not None: + self._ctx.load_verify_locations(BytesIO(cadata)) + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._ctx.use_certificate_chain_file(certfile) + if password is not None: + self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) + self._ctx.use_privatekey_file(keyfile or certfile) + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + cnx = OpenSSL.SSL.Connection(self._ctx, sock) + + if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 + server_hostname = server_hostname.encode('utf-8') + + if server_hostname is not None: + cnx.set_tlsext_host_name(server_hostname) + + cnx.set_connect_state() + + while True: + try: + cnx.do_handshake() + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(sock, sock.gettimeout()): + raise timeout('select timed out') + continue + except OpenSSL.SSL.Error as e: + raise ssl.SSLError('bad handshake: %r' % e) + break + + return WrappedSocket(cnx, sock) + + +def _verify_callback(cnx, x509, err_no, err_depth, return_code): + return err_no == 0 diff --git a/Contents/Libraries/Shared/urllib3/contrib/securetransport.py b/Contents/Libraries/Shared/urllib3/contrib/securetransport.py new file mode 100644 index 000000000..77cb59ed7 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/contrib/securetransport.py @@ -0,0 +1,804 @@ +""" +SecureTranport support for urllib3 via ctypes. + +This makes platform-native TLS available to urllib3 users on macOS without the +use of a compiler. This is an important feature because the Python Package +Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL +that ships with macOS is not capable of doing TLSv1.2. The only way to resolve +this is to give macOS users an alternative solution to the problem, and that +solution is to use SecureTransport. + +We use ctypes here because this solution must not require a compiler. That's +because pip is not allowed to require a compiler either. + +This is not intended to be a seriously long-term solution to this problem. +The hope is that PEP 543 will eventually solve this issue for us, at which +point we can retire this contrib module. But in the short term, we need to +solve the impending tire fire that is Python on Mac without this kind of +contrib module. So...here we are. + +To use this module, simply import and inject it:: + + import urllib3.contrib.securetransport + urllib3.contrib.securetransport.inject_into_urllib3() + +Happy TLSing! +""" +from __future__ import absolute_import + +import contextlib +import ctypes +import errno +import os.path +import shutil +import socket +import ssl +import threading +import weakref + +from .. import util +from ._securetransport.bindings import ( + Security, SecurityConst, CoreFoundation +) +from ._securetransport.low_level import ( + _assert_no_error, _cert_array_from_pem, _temporary_keychain, + _load_client_cert_chain +) + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works +HAS_SNI = True + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + +# This dictionary is used by the read callback to obtain a handle to the +# calling wrapped socket. This is a pretty silly approach, but for now it'll +# do. I feel like I should be able to smuggle a handle to the wrapped socket +# directly in the SSLConnectionRef, but for now this approach will work I +# guess. +# +# We need to lock around this structure for inserts, but we don't do it for +# reads/writes in the callbacks. The reasoning here goes as follows: +# +# 1. It is not possible to call into the callbacks before the dictionary is +# populated, so once in the callback the id must be in the dictionary. +# 2. The callbacks don't mutate the dictionary, they only read from it, and +# so cannot conflict with any of the insertions. +# +# This is good: if we had to lock in the callbacks we'd drastically slow down +# the performance of this code. +_connection_refs = weakref.WeakValueDictionary() +_connection_ref_lock = threading.Lock() + +# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over +# for no better reason than we need *a* limit, and this one is right there. +SSL_WRITE_BLOCKSIZE = 16384 + +# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to +# individual cipher suites. We need to do this because this is how +# SecureTransport wants them. +CIPHER_SUITES = [ + SecurityConst.TLS_AES_256_GCM_SHA384, + SecurityConst.TLS_CHACHA20_POLY1305_SHA256, + SecurityConst.TLS_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, +] + +# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of +# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. +_protocol_to_min_max = { + ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), +} + +if hasattr(ssl, "PROTOCOL_SSLv2"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( + SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2 + ) +if hasattr(ssl, "PROTOCOL_SSLv3"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( + SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3 + ) +if hasattr(ssl, "PROTOCOL_TLSv1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( + SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( + SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_2"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( + SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12 + ) +if hasattr(ssl, "PROTOCOL_TLS"): + _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23] + + +def inject_into_urllib3(): + """ + Monkey-patch urllib3 with SecureTransport-backed SSL-support. + """ + util.ssl_.SSLContext = SecureTransportContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_SECURETRANSPORT = True + util.ssl_.IS_SECURETRANSPORT = True + + +def extract_from_urllib3(): + """ + Undo monkey-patching by :func:`inject_into_urllib3`. + """ + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_SECURETRANSPORT = False + util.ssl_.IS_SECURETRANSPORT = False + + +def _read_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport read callback. This is called by ST to request that data + be returned from the socket. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + requested_length = data_length_pointer[0] + + timeout = wrapped_socket.gettimeout() + error = None + read_count = 0 + + try: + while read_count < requested_length: + if timeout is None or timeout >= 0: + if not util.wait_for_read(base_socket, timeout): + raise socket.error(errno.EAGAIN, 'timed out') + + remaining = requested_length - read_count + buffer = (ctypes.c_char * remaining).from_address( + data_buffer + read_count + ) + chunk_size = base_socket.recv_into(buffer, remaining) + read_count += chunk_size + if not chunk_size: + if not read_count: + return SecurityConst.errSSLClosedGraceful + break + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = read_count + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = read_count + + if read_count != requested_length: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +def _write_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport write callback. This is called by ST to request that data + actually be sent on the network. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + bytes_to_write = data_length_pointer[0] + data = ctypes.string_at(data_buffer, bytes_to_write) + + timeout = wrapped_socket.gettimeout() + error = None + sent = 0 + + try: + while sent < bytes_to_write: + if timeout is None or timeout >= 0: + if not util.wait_for_write(base_socket, timeout): + raise socket.error(errno.EAGAIN, 'timed out') + chunk_sent = base_socket.send(data) + sent += chunk_sent + + # This has some needless copying here, but I'm not sure there's + # much value in optimising this data path. + data = data[chunk_sent:] + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = sent + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = sent + + if sent != bytes_to_write: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +# We need to keep these two objects references alive: if they get GC'd while +# in use then SecureTransport could attempt to call a function that is in freed +# memory. That would be...uh...bad. Yeah, that's the word. Bad. +_read_callback_pointer = Security.SSLReadFunc(_read_callback) +_write_callback_pointer = Security.SSLWriteFunc(_write_callback) + + +class WrappedSocket(object): + """ + API-compatibility wrapper for Python's OpenSSL wrapped socket object. + + Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage + collector of PyPy. + """ + def __init__(self, socket): + self.socket = socket + self.context = None + self._makefile_refs = 0 + self._closed = False + self._exception = None + self._keychain = None + self._keychain_dir = None + self._client_cert_chain = None + + # We save off the previously-configured timeout and then set it to + # zero. This is done because we use select and friends to handle the + # timeouts, but if we leave the timeout set on the lower socket then + # Python will "kindly" call select on that socket again for us. Avoid + # that by forcing the timeout to zero. + self._timeout = self.socket.gettimeout() + self.socket.settimeout(0) + + @contextlib.contextmanager + def _raise_on_error(self): + """ + A context manager that can be used to wrap calls that do I/O from + SecureTransport. If any of the I/O callbacks hit an exception, this + context manager will correctly propagate the exception after the fact. + This avoids silently swallowing those exceptions. + + It also correctly forces the socket closed. + """ + self._exception = None + + # We explicitly don't catch around this yield because in the unlikely + # event that an exception was hit in the block we don't want to swallow + # it. + yield + if self._exception is not None: + exception, self._exception = self._exception, None + self.close() + raise exception + + def _set_ciphers(self): + """ + Sets up the allowed ciphers. By default this matches the set in + util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done + custom and doesn't allow changing at this time, mostly because parsing + OpenSSL cipher strings is going to be a freaking nightmare. + """ + ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) + result = Security.SSLSetEnabledCiphers( + self.context, ciphers, len(CIPHER_SUITES) + ) + _assert_no_error(result) + + def _custom_validate(self, verify, trust_bundle): + """ + Called when we have set custom validation. We do this in two cases: + first, when cert validation is entirely disabled; and second, when + using a custom trust DB. + """ + # If we disabled cert validation, just say: cool. + if not verify: + return + + # We want data in memory, so load it up. + if os.path.isfile(trust_bundle): + with open(trust_bundle, 'rb') as f: + trust_bundle = f.read() + + cert_array = None + trust = Security.SecTrustRef() + + try: + # Get a CFArray that contains the certs we want. + cert_array = _cert_array_from_pem(trust_bundle) + + # Ok, now the hard part. We want to get the SecTrustRef that ST has + # created for this connection, shove our CAs into it, tell ST to + # ignore everything else it knows, and then ask if it can build a + # chain. This is a buuuunch of code. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + raise ssl.SSLError("Failed to copy trust reference") + + result = Security.SecTrustSetAnchorCertificates(trust, cert_array) + _assert_no_error(result) + + result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) + _assert_no_error(result) + + trust_result = Security.SecTrustResultType() + result = Security.SecTrustEvaluate( + trust, ctypes.byref(trust_result) + ) + _assert_no_error(result) + finally: + if trust: + CoreFoundation.CFRelease(trust) + + if cert_array is not None: + CoreFoundation.CFRelease(cert_array) + + # Ok, now we can look at what the result was. + successes = ( + SecurityConst.kSecTrustResultUnspecified, + SecurityConst.kSecTrustResultProceed + ) + if trust_result.value not in successes: + raise ssl.SSLError( + "certificate verify failed, error code: %d" % + trust_result.value + ) + + def handshake(self, + server_hostname, + verify, + trust_bundle, + min_version, + max_version, + client_cert, + client_key, + client_key_passphrase): + """ + Actually performs the TLS handshake. This is run automatically by + wrapped socket, and shouldn't be needed in user code. + """ + # First, we do the initial bits of connection setup. We need to create + # a context, set its I/O funcs, and set the connection reference. + self.context = Security.SSLCreateContext( + None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType + ) + result = Security.SSLSetIOFuncs( + self.context, _read_callback_pointer, _write_callback_pointer + ) + _assert_no_error(result) + + # Here we need to compute the handle to use. We do this by taking the + # id of self modulo 2**31 - 1. If this is already in the dictionary, we + # just keep incrementing by one until we find a free space. + with _connection_ref_lock: + handle = id(self) % 2147483647 + while handle in _connection_refs: + handle = (handle + 1) % 2147483647 + _connection_refs[handle] = self + + result = Security.SSLSetConnection(self.context, handle) + _assert_no_error(result) + + # If we have a server hostname, we should set that too. + if server_hostname: + if not isinstance(server_hostname, bytes): + server_hostname = server_hostname.encode('utf-8') + + result = Security.SSLSetPeerDomainName( + self.context, server_hostname, len(server_hostname) + ) + _assert_no_error(result) + + # Setup the ciphers. + self._set_ciphers() + + # Set the minimum and maximum TLS versions. + result = Security.SSLSetProtocolVersionMin(self.context, min_version) + _assert_no_error(result) + result = Security.SSLSetProtocolVersionMax(self.context, max_version) + _assert_no_error(result) + + # If there's a trust DB, we need to use it. We do that by telling + # SecureTransport to break on server auth. We also do that if we don't + # want to validate the certs at all: we just won't actually do any + # authing in that case. + if not verify or trust_bundle is not None: + result = Security.SSLSetSessionOption( + self.context, + SecurityConst.kSSLSessionOptionBreakOnServerAuth, + True + ) + _assert_no_error(result) + + # If there's a client cert, we need to use it. + if client_cert: + self._keychain, self._keychain_dir = _temporary_keychain() + self._client_cert_chain = _load_client_cert_chain( + self._keychain, client_cert, client_key + ) + result = Security.SSLSetCertificate( + self.context, self._client_cert_chain + ) + _assert_no_error(result) + + while True: + with self._raise_on_error(): + result = Security.SSLHandshake(self.context) + + if result == SecurityConst.errSSLWouldBlock: + raise socket.timeout("handshake timed out") + elif result == SecurityConst.errSSLServerAuthCompleted: + self._custom_validate(verify, trust_bundle) + continue + else: + _assert_no_error(result) + break + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, bufsiz): + buffer = ctypes.create_string_buffer(bufsiz) + bytes_read = self.recv_into(buffer, bufsiz) + data = buffer[:bytes_read] + return data + + def recv_into(self, buffer, nbytes=None): + # Read short on EOF. + if self._closed: + return 0 + + if nbytes is None: + nbytes = len(buffer) + + buffer = (ctypes.c_char * nbytes).from_buffer(buffer) + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLRead( + self.context, buffer, nbytes, ctypes.byref(processed_bytes) + ) + + # There are some result codes that we want to treat as "not always + # errors". Specifically, those are errSSLWouldBlock, + # errSSLClosedGraceful, and errSSLClosedNoNotify. + if (result == SecurityConst.errSSLWouldBlock): + # If we didn't process any bytes, then this was just a time out. + # However, we can get errSSLWouldBlock in situations when we *did* + # read some data, and in those cases we should just read "short" + # and return. + if processed_bytes.value == 0: + # Timed out, no data read. + raise socket.timeout("recv timed out") + elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify): + # The remote peer has closed this connection. We should do so as + # well. Note that we don't actually return here because in + # principle this could actually be fired along with return data. + # It's unlikely though. + self.close() + else: + _assert_no_error(result) + + # Ok, we read and probably succeeded. We should return whatever data + # was actually read. + return processed_bytes.value + + def settimeout(self, timeout): + self._timeout = timeout + + def gettimeout(self): + return self._timeout + + def send(self, data): + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLWrite( + self.context, data, len(data), ctypes.byref(processed_bytes) + ) + + if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: + # Timed out + raise socket.timeout("send timed out") + else: + _assert_no_error(result) + + # We sent, and probably succeeded. Tell them how much we sent. + return processed_bytes.value + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + with self._raise_on_error(): + Security.SSLClose(self.context) + + def close(self): + # TODO: should I do clean shutdown here? Do I have to? + if self._makefile_refs < 1: + self._closed = True + if self.context: + CoreFoundation.CFRelease(self.context) + self.context = None + if self._client_cert_chain: + CoreFoundation.CFRelease(self._client_cert_chain) + self._client_cert_chain = None + if self._keychain: + Security.SecKeychainDelete(self._keychain) + CoreFoundation.CFRelease(self._keychain) + shutil.rmtree(self._keychain_dir) + self._keychain = self._keychain_dir = None + return self.socket.close() + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + # Urgh, annoying. + # + # Here's how we do this: + # + # 1. Call SSLCopyPeerTrust to get hold of the trust object for this + # connection. + # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. + # 3. To get the CN, call SecCertificateCopyCommonName and process that + # string so that it's of the appropriate type. + # 4. To get the SAN, we need to do something a bit more complex: + # a. Call SecCertificateCopyValues to get the data, requesting + # kSecOIDSubjectAltName. + # b. Mess about with this dictionary to try to get the SANs out. + # + # This is gross. Really gross. It's going to be a few hundred LoC extra + # just to repeat something that SecureTransport can *already do*. So my + # operating assumption at this time is that what we want to do is + # instead to just flag to urllib3 that it shouldn't do its own hostname + # validation when using SecureTransport. + if not binary_form: + raise ValueError( + "SecureTransport only supports dumping binary certs" + ) + trust = Security.SecTrustRef() + certdata = None + der_bytes = None + + try: + # Grab the trust store. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + # Probably we haven't done the handshake yet. No biggie. + return None + + cert_count = Security.SecTrustGetCertificateCount(trust) + if not cert_count: + # Also a case that might happen if we haven't handshaked. + # Handshook? Handshaken? + return None + + leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) + assert leaf + + # Ok, now we want the DER bytes. + certdata = Security.SecCertificateCopyData(leaf) + assert certdata + + data_length = CoreFoundation.CFDataGetLength(certdata) + data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) + der_bytes = ctypes.string_at(data_buffer, data_length) + finally: + if certdata: + CoreFoundation.CFRelease(certdata) + if trust: + CoreFoundation.CFRelease(trust) + + return der_bytes + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + def makefile(self, mode="r", buffering=None, *args, **kwargs): + # We disable buffering with SecureTransport because it conflicts with + # the buffering that ST does internally (see issue #1153 for more). + buffering = 0 + return backport_makefile(self, mode, buffering, *args, **kwargs) + +WrappedSocket.makefile = makefile + + +class SecureTransportContext(object): + """ + I am a wrapper class for the SecureTransport library, to translate the + interface of the standard library ``SSLContext`` object to calls into + SecureTransport. + """ + def __init__(self, protocol): + self._min_version, self._max_version = _protocol_to_min_max[protocol] + self._options = 0 + self._verify = False + self._trust_bundle = None + self._client_cert = None + self._client_key = None + self._client_key_passphrase = None + + @property + def check_hostname(self): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + return True + + @check_hostname.setter + def check_hostname(self, value): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + pass + + @property + def options(self): + # TODO: Well, crap. + # + # So this is the bit of the code that is the most likely to cause us + # trouble. Essentially we need to enumerate all of the SSL options that + # users might want to use and try to see if we can sensibly translate + # them, or whether we should just ignore them. + return self._options + + @options.setter + def options(self, value): + # TODO: Update in line with above. + self._options = value + + @property + def verify_mode(self): + return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE + + @verify_mode.setter + def verify_mode(self, value): + self._verify = True if value == ssl.CERT_REQUIRED else False + + def set_default_verify_paths(self): + # So, this has to do something a bit weird. Specifically, what it does + # is nothing. + # + # This means that, if we had previously had load_verify_locations + # called, this does not undo that. We need to do that because it turns + # out that the rest of the urllib3 code will attempt to load the + # default verify paths if it hasn't been told about any paths, even if + # the context itself was sometime earlier. We resolve that by just + # ignoring it. + pass + + def load_default_certs(self): + return self.set_default_verify_paths() + + def set_ciphers(self, ciphers): + # For now, we just require the default cipher string. + if ciphers != util.ssl_.DEFAULT_CIPHERS: + raise ValueError( + "SecureTransport doesn't support custom cipher strings" + ) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + # OK, we only really support cadata and cafile. + if capath is not None: + raise ValueError( + "SecureTransport does not support cert directories" + ) + + self._trust_bundle = cafile or cadata + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._client_cert = certfile + self._client_key = keyfile + self._client_cert_passphrase = password + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + # So, what do we do here? Firstly, we assert some properties. This is a + # stripped down shim, so there is some functionality we don't support. + # See PEP 543 for the real deal. + assert not server_side + assert do_handshake_on_connect + assert suppress_ragged_eofs + + # Ok, we're good to go. Now we want to create the wrapped socket object + # and store it in the appropriate place. + wrapped_socket = WrappedSocket(sock) + + # Now we can handshake + wrapped_socket.handshake( + server_hostname, self._verify, self._trust_bundle, + self._min_version, self._max_version, self._client_cert, + self._client_key, self._client_key_passphrase + ) + return wrapped_socket diff --git a/Contents/Libraries/Shared/urllib3/contrib/socks.py b/Contents/Libraries/Shared/urllib3/contrib/socks.py new file mode 100644 index 000000000..811e312ec --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/contrib/socks.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- +""" +This module contains provisional support for SOCKS proxies from within +urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and +SOCKS5. To enable its functionality, either install PySocks or install this +module with the ``socks`` extra. + +The SOCKS implementation supports the full range of urllib3 features. It also +supports the following SOCKS features: + +- SOCKS4 +- SOCKS4a +- SOCKS5 +- Usernames and passwords for the SOCKS proxy + +Known Limitations: + +- Currently PySocks does not support contacting remote websites via literal + IPv6 addresses. Any such connection attempt will fail. You must use a domain + name. +- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any + such connection attempt will fail. +""" +from __future__ import absolute_import + +try: + import socks +except ImportError: + import warnings + from ..exceptions import DependencyWarning + + warnings.warn(( + 'SOCKS support in urllib3 requires the installation of optional ' + 'dependencies: specifically, PySocks. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies' + ), + DependencyWarning + ) + raise + +from socket import error as SocketError, timeout as SocketTimeout + +from ..connection import ( + HTTPConnection, HTTPSConnection +) +from ..connectionpool import ( + HTTPConnectionPool, HTTPSConnectionPool +) +from ..exceptions import ConnectTimeoutError, NewConnectionError +from ..poolmanager import PoolManager +from ..util.url import parse_url + +try: + import ssl +except ImportError: + ssl = None + + +class SOCKSConnection(HTTPConnection): + """ + A plain-text HTTP connection that connects via a SOCKS proxy. + """ + def __init__(self, *args, **kwargs): + self._socks_options = kwargs.pop('_socks_options') + super(SOCKSConnection, self).__init__(*args, **kwargs) + + def _new_conn(self): + """ + Establish a new connection via the SOCKS proxy. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = socks.create_connection( + (self.host, self.port), + proxy_type=self._socks_options['socks_version'], + proxy_addr=self._socks_options['proxy_host'], + proxy_port=self._socks_options['proxy_port'], + proxy_username=self._socks_options['username'], + proxy_password=self._socks_options['password'], + proxy_rdns=self._socks_options['rdns'], + timeout=self.timeout, + **extra_kw + ) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except socks.ProxyError as e: + # This is fragile as hell, but it seems to be the only way to raise + # useful errors here. + if e.socket_err: + error = e.socket_err + if isinstance(error, SocketTimeout): + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout) + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % error + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % e + ) + + except SocketError as e: # Defensive: PySocks should catch all these. + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + +# We don't need to duplicate the Verified/Unverified distinction from +# urllib3/connection.py here because the HTTPSConnection will already have been +# correctly set to either the Verified or Unverified form by that module. This +# means the SOCKSHTTPSConnection will automatically be the correct type. +class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): + pass + + +class SOCKSHTTPConnectionPool(HTTPConnectionPool): + ConnectionCls = SOCKSConnection + + +class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): + ConnectionCls = SOCKSHTTPSConnection + + +class SOCKSProxyManager(PoolManager): + """ + A version of the urllib3 ProxyManager that routes connections via the + defined SOCKS proxy. + """ + pool_classes_by_scheme = { + 'http': SOCKSHTTPConnectionPool, + 'https': SOCKSHTTPSConnectionPool, + } + + def __init__(self, proxy_url, username=None, password=None, + num_pools=10, headers=None, **connection_pool_kw): + parsed = parse_url(proxy_url) + + if username is None and password is None and parsed.auth is not None: + split = parsed.auth.split(':') + if len(split) == 2: + username, password = split + if parsed.scheme == 'socks5': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = False + elif parsed.scheme == 'socks5h': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = True + elif parsed.scheme == 'socks4': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = False + elif parsed.scheme == 'socks4a': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = True + else: + raise ValueError( + "Unable to determine SOCKS version from %s" % proxy_url + ) + + self.proxy_url = proxy_url + + socks_options = { + 'socks_version': socks_version, + 'proxy_host': parsed.host, + 'proxy_port': parsed.port, + 'username': username, + 'password': password, + 'rdns': rdns + } + connection_pool_kw['_socks_options'] = socks_options + + super(SOCKSProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw + ) + + self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/Contents/Libraries/Shared/urllib3/exceptions.py b/Contents/Libraries/Shared/urllib3/exceptions.py new file mode 100644 index 000000000..7bbaa9871 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/exceptions.py @@ -0,0 +1,246 @@ +from __future__ import absolute_import +from .packages.six.moves.http_client import ( + IncompleteRead as httplib_IncompleteRead +) +# Base Exceptions + + +class HTTPError(Exception): + "Base exception used by this module." + pass + + +class HTTPWarning(Warning): + "Base warning used by this module." + pass + + +class PoolError(HTTPError): + "Base exception for errors caused within a pool." + def __init__(self, pool, message): + self.pool = pool + HTTPError.__init__(self, "%s: %s" % (pool, message)) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, None) + + +class RequestError(PoolError): + "Base exception for PoolErrors that have associated URLs." + def __init__(self, pool, url, message): + self.url = url + PoolError.__init__(self, pool, message) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, self.url, None) + + +class SSLError(HTTPError): + "Raised when SSL certificate fails in an HTTPS connection." + pass + + +class ProxyError(HTTPError): + "Raised when the connection to a proxy fails." + pass + + +class DecodeError(HTTPError): + "Raised when automatic decoding based on Content-Type fails." + pass + + +class ProtocolError(HTTPError): + "Raised when something unexpected happens mid-request/response." + pass + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + +# Leaf Exceptions + +class MaxRetryError(RequestError): + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param string url: The requested Url + :param exceptions.Exception reason: The underlying error + + """ + + def __init__(self, pool, url, reason=None): + self.reason = reason + + message = "Max retries exceeded with url: %s (Caused by %r)" % ( + url, reason) + + RequestError.__init__(self, pool, url, message) + + +class HostChangedError(RequestError): + "Raised when an existing pool gets a request for a foreign host." + + def __init__(self, pool, url, retries=3): + message = "Tried to open a foreign host with url: %s" % url + RequestError.__init__(self, pool, url, message) + self.retries = retries + + +class TimeoutStateError(HTTPError): + """ Raised when passing an invalid state to a timeout """ + pass + + +class TimeoutError(HTTPError): + """ Raised when a socket timeout error occurs. + + Catching this error will catch both :exc:`ReadTimeoutErrors + ` and :exc:`ConnectTimeoutErrors `. + """ + pass + + +class ReadTimeoutError(TimeoutError, RequestError): + "Raised when a socket timeout occurs while receiving data from a server" + pass + + +# This timeout error does not have a URL attached and needs to inherit from the +# base HTTPError +class ConnectTimeoutError(TimeoutError): + "Raised when a socket timeout occurs while connecting to a server" + pass + + +class NewConnectionError(ConnectTimeoutError, PoolError): + "Raised when we fail to establish a new connection. Usually ECONNREFUSED." + pass + + +class EmptyPoolError(PoolError): + "Raised when a pool runs out of connections and no more are allowed." + pass + + +class ClosedPoolError(PoolError): + "Raised when a request enters a pool after the pool has been closed." + pass + + +class LocationValueError(ValueError, HTTPError): + "Raised when there is something wrong with a given URL input." + pass + + +class LocationParseError(LocationValueError): + "Raised when get_host or similar fails to parse the URL input." + + def __init__(self, location): + message = "Failed to parse: %s" % location + HTTPError.__init__(self, message) + + self.location = location + + +class ResponseError(HTTPError): + "Used as a container for an error reason supplied in a MaxRetryError." + GENERIC_ERROR = 'too many error responses' + SPECIFIC_ERROR = 'too many {status_code} error responses' + + +class SecurityWarning(HTTPWarning): + "Warned when performing security reducing actions" + pass + + +class SubjectAltNameWarning(SecurityWarning): + "Warned when connecting to a host with a certificate missing a SAN." + pass + + +class InsecureRequestWarning(SecurityWarning): + "Warned when making an unverified HTTPS request." + pass + + +class SystemTimeWarning(SecurityWarning): + "Warned when system time is suspected to be wrong" + pass + + +class InsecurePlatformWarning(SecurityWarning): + "Warned when certain SSL configuration is not available on a platform." + pass + + +class SNIMissingWarning(HTTPWarning): + "Warned when making a HTTPS request without SNI available." + pass + + +class DependencyWarning(HTTPWarning): + """ + Warned when an attempt is made to import a module with missing optional + dependencies. + """ + pass + + +class ResponseNotChunked(ProtocolError, ValueError): + "Response needs to be chunked in order to read it as chunks." + pass + + +class BodyNotHttplibCompatible(HTTPError): + """ + Body should be httplib.HTTPResponse like (have an fp attribute which + returns raw chunks) for read_chunked(). + """ + pass + + +class IncompleteRead(HTTPError, httplib_IncompleteRead): + """ + Response length doesn't match expected Content-Length + + Subclass of http_client.IncompleteRead to allow int value + for `partial` to avoid creating large objects on streamed + reads. + """ + def __init__(self, partial, expected): + super(IncompleteRead, self).__init__(partial, expected) + + def __repr__(self): + return ('IncompleteRead(%i bytes read, ' + '%i more expected)' % (self.partial, self.expected)) + + +class InvalidHeader(HTTPError): + "The header provided was somehow invalid." + pass + + +class ProxySchemeUnknown(AssertionError, ValueError): + "ProxyManager does not support the supplied scheme" + # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. + + def __init__(self, scheme): + message = "Not supported proxy scheme %s" % scheme + super(ProxySchemeUnknown, self).__init__(message) + + +class HeaderParsingError(HTTPError): + "Raised by assert_header_parsing, but we convert it to a log.warning statement." + def __init__(self, defects, unparsed_data): + message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) + super(HeaderParsingError, self).__init__(message) + + +class UnrewindableBodyError(HTTPError): + "urllib3 encountered an error when trying to rewind a body" + pass diff --git a/Contents/Libraries/Shared/urllib3/fields.py b/Contents/Libraries/Shared/urllib3/fields.py new file mode 100644 index 000000000..37fe64a3e --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/fields.py @@ -0,0 +1,178 @@ +from __future__ import absolute_import +import email.utils +import mimetypes + +from .packages import six + + +def guess_content_type(filename, default='application/octet-stream'): + """ + Guess the "Content-Type" of a file. + + :param filename: + The filename to guess the "Content-Type" of using :mod:`mimetypes`. + :param default: + If no "Content-Type" can be guessed, default to `default`. + """ + if filename: + return mimetypes.guess_type(filename)[0] or default + return default + + +def format_header_param(name, value): + """ + Helper function to format and quote a single header parameter. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows RFC 2231, as + suggested by RFC 2388 Section 4.4. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + if not any(ch in value for ch in '"\\\r\n'): + result = '%s="%s"' % (name, value) + try: + result.encode('ascii') + except (UnicodeEncodeError, UnicodeDecodeError): + pass + else: + return result + if not six.PY3 and isinstance(value, six.text_type): # Python 2: + value = value.encode('utf-8') + value = email.utils.encode_rfc2231(value, 'utf-8') + value = '%s*=%s' % (name, value) + return value + + +class RequestField(object): + """ + A data container for request body parameters. + + :param name: + The name of this request field. + :param data: + The data/value body. + :param filename: + An optional filename of the request field. + :param headers: + An optional dict-like object of headers to initially use for the field. + """ + def __init__(self, name, data, filename=None, headers=None): + self._name = name + self._filename = filename + self.data = data + self.headers = {} + if headers: + self.headers = dict(headers) + + @classmethod + def from_tuples(cls, fieldname, value): + """ + A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. + + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: + + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + + Field names and filenames must be unicode. + """ + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = guess_content_type(filename) + else: + filename = None + content_type = None + data = value + + request_param = cls(fieldname, data, filename=filename) + request_param.make_multipart(content_type=content_type) + + return request_param + + def _render_part(self, name, value): + """ + Overridable helper function to format a single header parameter. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + return format_header_param(name, value) + + def _render_parts(self, header_parts): + """ + Helper function to format and quote a single header. + + Useful for single headers that are composed of multiple items. E.g., + 'Content-Disposition' fields. + + :param header_parts: + A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. + """ + parts = [] + iterable = header_parts + if isinstance(header_parts, dict): + iterable = header_parts.items() + + for name, value in iterable: + if value is not None: + parts.append(self._render_part(name, value)) + + return '; '.join(parts) + + def render_headers(self): + """ + Renders the headers for this request field. + """ + lines = [] + + sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] + for sort_key in sort_keys: + if self.headers.get(sort_key, False): + lines.append('%s: %s' % (sort_key, self.headers[sort_key])) + + for header_name, header_value in self.headers.items(): + if header_name not in sort_keys: + if header_value: + lines.append('%s: %s' % (header_name, header_value)) + + lines.append('\r\n') + return '\r\n'.join(lines) + + def make_multipart(self, content_disposition=None, content_type=None, + content_location=None): + """ + Makes this request field into a multipart request field. + + This method overrides "Content-Disposition", "Content-Type" and + "Content-Location" headers to the request parameter. + + :param content_type: + The 'Content-Type' of the request body. + :param content_location: + The 'Content-Location' of the request body. + + """ + self.headers['Content-Disposition'] = content_disposition or 'form-data' + self.headers['Content-Disposition'] += '; '.join([ + '', self._render_parts( + (('name', self._name), ('filename', self._filename)) + ) + ]) + self.headers['Content-Type'] = content_type + self.headers['Content-Location'] = content_location diff --git a/Contents/Libraries/Shared/urllib3/filepost.py b/Contents/Libraries/Shared/urllib3/filepost.py new file mode 100644 index 000000000..78f1e19b0 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/filepost.py @@ -0,0 +1,98 @@ +from __future__ import absolute_import +import binascii +import codecs +import os + +from io import BytesIO + +from .packages import six +from .packages.six import b +from .fields import RequestField + +writer = codecs.lookup('utf-8')[3] + + +def choose_boundary(): + """ + Our embarrassingly-simple replacement for mimetools.choose_boundary. + """ + boundary = binascii.hexlify(os.urandom(16)) + if six.PY3: + boundary = boundary.decode('ascii') + return boundary + + +def iter_field_objects(fields): + """ + Iterate over fields. + + Supports list of (k, v) tuples and dicts, and lists of + :class:`~urllib3.fields.RequestField`. + + """ + if isinstance(fields, dict): + i = six.iteritems(fields) + else: + i = iter(fields) + + for field in i: + if isinstance(field, RequestField): + yield field + else: + yield RequestField.from_tuples(*field) + + +def iter_fields(fields): + """ + .. deprecated:: 1.6 + + Iterate over fields. + + The addition of :class:`~urllib3.fields.RequestField` makes this function + obsolete. Instead, use :func:`iter_field_objects`, which returns + :class:`~urllib3.fields.RequestField` objects. + + Supports list of (k, v) tuples and dicts. + """ + if isinstance(fields, dict): + return ((k, v) for k, v in six.iteritems(fields)) + + return ((k, v) for k, v in fields) + + +def encode_multipart_formdata(fields, boundary=None): + """ + Encode a dictionary of ``fields`` using the multipart/form-data MIME format. + + :param fields: + Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). + + :param boundary: + If not specified, then a random boundary will be generated using + :func:`urllib3.filepost.choose_boundary`. + """ + body = BytesIO() + if boundary is None: + boundary = choose_boundary() + + for field in iter_field_objects(fields): + body.write(b('--%s\r\n' % (boundary))) + + writer(body).write(field.render_headers()) + data = field.data + + if isinstance(data, int): + data = str(data) # Backwards compatibility + + if isinstance(data, six.text_type): + writer(body).write(data) + else: + body.write(data) + + body.write(b'\r\n') + + body.write(b('--%s--\r\n' % (boundary))) + + content_type = str('multipart/form-data; boundary=%s' % boundary) + + return body.getvalue(), content_type diff --git a/Contents/Libraries/Shared/urllib3/packages/__init__.py b/Contents/Libraries/Shared/urllib3/packages/__init__.py new file mode 100644 index 000000000..170e974c1 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/packages/__init__.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import + +from . import ssl_match_hostname + +__all__ = ('ssl_match_hostname', ) diff --git a/Contents/Libraries/Shared/urllib3/packages/backports/__init__.py b/Contents/Libraries/Shared/urllib3/packages/backports/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/urllib3/packages/backports/makefile.py b/Contents/Libraries/Shared/urllib3/packages/backports/makefile.py new file mode 100644 index 000000000..740db377d --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/packages/backports/makefile.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +""" +backports.makefile +~~~~~~~~~~~~~~~~~~ + +Backports the Python 3 ``socket.makefile`` method for use with anything that +wants to create a "fake" socket object. +""" +import io + +from socket import SocketIO + + +def backport_makefile(self, mode="r", buffering=None, encoding=None, + errors=None, newline=None): + """ + Backport of ``socket.makefile`` from Python 3.5. + """ + if not set(mode) <= {"r", "w", "b"}: + raise ValueError( + "invalid mode %r (only r, w, b allowed)" % (mode,) + ) + writing = "w" in mode + reading = "r" in mode or not writing + assert reading or writing + binary = "b" in mode + rawmode = "" + if reading: + rawmode += "r" + if writing: + rawmode += "w" + raw = SocketIO(self, rawmode) + self._makefile_refs += 1 + if buffering is None: + buffering = -1 + if buffering < 0: + buffering = io.DEFAULT_BUFFER_SIZE + if buffering == 0: + if not binary: + raise ValueError("unbuffered streams must be binary") + return raw + if reading and writing: + buffer = io.BufferedRWPair(raw, raw, buffering) + elif reading: + buffer = io.BufferedReader(raw, buffering) + else: + assert writing + buffer = io.BufferedWriter(raw, buffering) + if binary: + return buffer + text = io.TextIOWrapper(buffer, encoding, errors, newline) + text.mode = mode + return text diff --git a/Contents/Libraries/Shared/urllib3/packages/six.py b/Contents/Libraries/Shared/urllib3/packages/six.py new file mode 100644 index 000000000..190c0239c --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/packages/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson " +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/Contents/Libraries/Shared/urllib3/packages/ssl_match_hostname/__init__.py b/Contents/Libraries/Shared/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 000000000..d6594eb26 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/packages/ssl_match_hostname/__init__.py @@ -0,0 +1,19 @@ +import sys + +try: + # Our match_hostname function is the same as 3.5's, so we only want to + # import the match_hostname function if it's at least that good. + if sys.version_info < (3, 5): + raise ImportError("Fallback to vendored code") + + from ssl import CertificateError, match_hostname +except ImportError: + try: + # Backport of the function from a pypi module + from backports.ssl_match_hostname import CertificateError, match_hostname + except ImportError: + # Our vendored copy + from ._implementation import CertificateError, match_hostname + +# Not needed, but documenting what we provide. +__all__ = ('CertificateError', 'match_hostname') diff --git a/Contents/Libraries/Shared/urllib3/packages/ssl_match_hostname/_implementation.py b/Contents/Libraries/Shared/urllib3/packages/ssl_match_hostname/_implementation.py new file mode 100644 index 000000000..d6e66c019 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/packages/ssl_match_hostname/_implementation.py @@ -0,0 +1,156 @@ +"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" + +# Note: This file is under the PSF license as the code comes from the python +# stdlib. http://docs.python.org/3/license.html + +import re +import sys + +# ipaddress has been backported to 2.6+ in pypi. If it is installed on the +# system, use it to handle IPAddress ServerAltnames (this was added in +# python-3.5) otherwise only do DNS matching. This allows +# backports.ssl_match_hostname to continue to be used in Python 2.7. +try: + import ipaddress +except ImportError: + ipaddress = None + +__version__ = '3.5.0.1' + + +class CertificateError(ValueError): + pass + + +def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r'.') + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + +def _to_unicode(obj): + if isinstance(obj, str) and sys.version_info < (3,): + obj = unicode(obj, encoding='ascii', errors='strict') + return obj + +def _ipaddress_match(ipname, host_ip): + """Exact matching of IP addresses. + + RFC 6125 explicitly doesn't define an algorithm for this + (section 1.7.2 - "Out of Scope"). + """ + # OpenSSL may add a trailing newline to a subjectAltName's IP address + # Divergence from upstream: ipaddress can't handle byte str + ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) + return ip == host_ip + + +def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + try: + # Divergence from upstream: ipaddress can't handle byte str + host_ip = ipaddress.ip_address(_to_unicode(hostname)) + except ValueError: + # Not an IP address (common case) + host_ip = None + except UnicodeError: + # Divergence from upstream: Have to deal with ipaddress not taking + # byte strings. addresses should be all ascii, so we consider it not + # an ipaddress in this case + host_ip = None + except AttributeError: + # Divergence from upstream: Make ipaddress library optional + if ipaddress is None: + host_ip = None + else: + raise + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if host_ip is None and _dnsname_match(value, hostname): + return + dnsnames.append(value) + elif key == 'IP Address': + if host_ip is not None and _ipaddress_match(value, host_ip): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") diff --git a/Contents/Libraries/Shared/urllib3/poolmanager.py b/Contents/Libraries/Shared/urllib3/poolmanager.py new file mode 100644 index 000000000..fe5491cfd --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/poolmanager.py @@ -0,0 +1,450 @@ +from __future__ import absolute_import +import collections +import functools +import logging + +from ._collections import RecentlyUsedContainer +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool +from .connectionpool import port_by_scheme +from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown +from .packages.six.moves.urllib.parse import urljoin +from .request import RequestMethods +from .util.url import parse_url +from .util.retry import Retry + + +__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] + + +log = logging.getLogger(__name__) + +SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', + 'ssl_version', 'ca_cert_dir', 'ssl_context') + +# All known keyword arguments that could be provided to the pool manager, its +# pools, or the underlying connections. This is used to construct a pool key. +_key_fields = ( + 'key_scheme', # str + 'key_host', # str + 'key_port', # int + 'key_timeout', # int or float or Timeout + 'key_retries', # int or Retry + 'key_strict', # bool + 'key_block', # bool + 'key_source_address', # str + 'key_key_file', # str + 'key_cert_file', # str + 'key_cert_reqs', # str + 'key_ca_certs', # str + 'key_ssl_version', # str + 'key_ca_cert_dir', # str + 'key_ssl_context', # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext + 'key_maxsize', # int + 'key_headers', # dict + 'key__proxy', # parsed proxy url + 'key__proxy_headers', # dict + 'key_socket_options', # list of (level (int), optname (int), value (int or str)) tuples + 'key__socks_options', # dict + 'key_assert_hostname', # bool or string + 'key_assert_fingerprint', # str + 'key_server_hostname', #str +) + +#: The namedtuple class used to construct keys for the connection pool. +#: All custom key schemes should include the fields in this key at a minimum. +PoolKey = collections.namedtuple('PoolKey', _key_fields) + + +def _default_key_normalizer(key_class, request_context): + """ + Create a pool key out of a request context dictionary. + + According to RFC 3986, both the scheme and host are case-insensitive. + Therefore, this function normalizes both before constructing the pool + key for an HTTPS request. If you wish to change this behaviour, provide + alternate callables to ``key_fn_by_scheme``. + + :param key_class: + The class to use when constructing the key. This should be a namedtuple + with the ``scheme`` and ``host`` keys at a minimum. + :type key_class: namedtuple + :param request_context: + A dictionary-like object that contain the context for a request. + :type request_context: dict + + :return: A namedtuple that can be used as a connection pool key. + :rtype: PoolKey + """ + # Since we mutate the dictionary, make a copy first + context = request_context.copy() + context['scheme'] = context['scheme'].lower() + context['host'] = context['host'].lower() + + # These are both dictionaries and need to be transformed into frozensets + for key in ('headers', '_proxy_headers', '_socks_options'): + if key in context and context[key] is not None: + context[key] = frozenset(context[key].items()) + + # The socket_options key may be a list and needs to be transformed into a + # tuple. + socket_opts = context.get('socket_options') + if socket_opts is not None: + context['socket_options'] = tuple(socket_opts) + + # Map the kwargs to the names in the namedtuple - this is necessary since + # namedtuples can't have fields starting with '_'. + for key in list(context.keys()): + context['key_' + key] = context.pop(key) + + # Default to ``None`` for keys missing from the context + for field in key_class._fields: + if field not in context: + context[field] = None + + return key_class(**context) + + +#: A dictionary that maps a scheme to a callable that creates a pool key. +#: This can be used to alter the way pool keys are constructed, if desired. +#: Each PoolManager makes a copy of this dictionary so they can be configured +#: globally here, or individually on the instance. +key_fn_by_scheme = { + 'http': functools.partial(_default_key_normalizer, PoolKey), + 'https': functools.partial(_default_key_normalizer, PoolKey), +} + +pool_classes_by_scheme = { + 'http': HTTPConnectionPool, + 'https': HTTPSConnectionPool, +} + + +class PoolManager(RequestMethods): + """ + Allows for arbitrary requests while transparently keeping track of + necessary connection pools for you. + + :param num_pools: + Number of connection pools to cache before discarding the least + recently used pool. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param \\**connection_pool_kw: + Additional parameters are used to create fresh + :class:`urllib3.connectionpool.ConnectionPool` instances. + + Example:: + + >>> manager = PoolManager(num_pools=2) + >>> r = manager.request('GET', 'http://google.com/') + >>> r = manager.request('GET', 'http://google.com/mail') + >>> r = manager.request('GET', 'http://yahoo.com/') + >>> len(manager.pools) + 2 + + """ + + proxy = None + + def __init__(self, num_pools=10, headers=None, **connection_pool_kw): + RequestMethods.__init__(self, headers) + self.connection_pool_kw = connection_pool_kw + self.pools = RecentlyUsedContainer(num_pools, + dispose_func=lambda p: p.close()) + + # Locally set the pool classes and keys so other PoolManagers can + # override them. + self.pool_classes_by_scheme = pool_classes_by_scheme + self.key_fn_by_scheme = key_fn_by_scheme.copy() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.clear() + # Return False to re-raise any potential exceptions + return False + + def _new_pool(self, scheme, host, port, request_context=None): + """ + Create a new :class:`ConnectionPool` based on host, port, scheme, and + any additional pool keyword arguments. + + If ``request_context`` is provided, it is provided as keyword arguments + to the pool class used. This method is used to actually create the + connection pools handed out by :meth:`connection_from_url` and + companion methods. It is intended to be overridden for customization. + """ + pool_cls = self.pool_classes_by_scheme[scheme] + if request_context is None: + request_context = self.connection_pool_kw.copy() + + # Although the context has everything necessary to create the pool, + # this function has historically only used the scheme, host, and port + # in the positional args. When an API change is acceptable these can + # be removed. + for key in ('scheme', 'host', 'port'): + request_context.pop(key, None) + + if scheme == 'http': + for kw in SSL_KEYWORDS: + request_context.pop(kw, None) + + return pool_cls(host, port, **request_context) + + def clear(self): + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + """ + Get a :class:`ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is + provided, it is merged with the instance's ``connection_pool_kw`` + variable and used to create the new connection pool, if one is + needed. + """ + + if not host: + raise LocationValueError("No host specified.") + + request_context = self._merge_pool_kwargs(pool_kwargs) + request_context['scheme'] = scheme or 'http' + if not port: + port = port_by_scheme.get(request_context['scheme'].lower(), 80) + request_context['port'] = port + request_context['host'] = host + + return self.connection_from_context(request_context) + + def connection_from_context(self, request_context): + """ + Get a :class:`ConnectionPool` based on the request context. + + ``request_context`` must at least contain the ``scheme`` key and its + value must be a key in ``key_fn_by_scheme`` instance variable. + """ + scheme = request_context['scheme'].lower() + pool_key_constructor = self.key_fn_by_scheme[scheme] + pool_key = pool_key_constructor(request_context) + + return self.connection_from_pool_key(pool_key, request_context=request_context) + + def connection_from_pool_key(self, pool_key, request_context=None): + """ + Get a :class:`ConnectionPool` based on the provided pool key. + + ``pool_key`` should be a namedtuple that only contains immutable + objects. At a minimum it must have the ``scheme``, ``host``, and + ``port`` fields. + """ + with self.pools.lock: + # If the scheme, host, or port doesn't match existing open + # connections, open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + scheme = request_context['scheme'] + host = request_context['host'] + port = request_context['port'] + pool = self._new_pool(scheme, host, port, request_context=request_context) + self.pools[pool_key] = pool + + return pool + + def connection_from_url(self, url, pool_kwargs=None): + """ + Similar to :func:`urllib3.connectionpool.connection_from_url`. + + If ``pool_kwargs`` is not provided and a new pool needs to be + constructed, ``self.connection_pool_kw`` is used to initialize + the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` + is provided, it is used instead. Note that if a new pool does not + need to be created for the request, the provided ``pool_kwargs`` are + not used. + """ + u = parse_url(url) + return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, + pool_kwargs=pool_kwargs) + + def _merge_pool_kwargs(self, override): + """ + Merge a dictionary of override values for self.connection_pool_kw. + + This does not modify self.connection_pool_kw and returns a new dict. + Any keys in the override dictionary with a value of ``None`` are + removed from the merged dictionary. + """ + base_pool_kwargs = self.connection_pool_kw.copy() + if override: + for key, value in override.items(): + if value is None: + try: + del base_pool_kwargs[key] + except KeyError: + pass + else: + base_pool_kwargs[key] = value + return base_pool_kwargs + + def urlopen(self, method, url, redirect=True, **kw): + """ + Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw['assert_same_host'] = False + kw['redirect'] = False + + if 'headers' not in kw: + kw['headers'] = self.headers.copy() + + if self.proxy is not None and u.scheme == "http": + response = conn.urlopen(method, url, **kw) + else: + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + # Support relative URLs for redirecting. + redirect_location = urljoin(url, redirect_location) + + # RFC 7231, Section 6.4.4 + if response.status == 303: + method = 'GET' + + retries = kw.get('retries') + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + # Strip headers marked as unsafe to forward to the redirected location. + # Check remove_headers_on_redirect to avoid a potential network call within + # conn.is_same_host() which may use socket.gethostbyname() in the future. + if (retries.remove_headers_on_redirect + and not conn.is_same_host(redirect_location)): + for header in retries.remove_headers_on_redirect: + kw['headers'].pop(header, None) + + try: + retries = retries.increment(method, url, response=response, _pool=conn) + except MaxRetryError: + if retries.raise_on_redirect: + raise + return response + + kw['retries'] = retries + kw['redirect'] = redirect + + log.info("Redirecting %s -> %s", url, redirect_location) + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(PoolManager): + """ + Behaves just like :class:`PoolManager`, but sends all requests through + the defined proxy, using the CONNECT method for HTTPS URLs. + + :param proxy_url: + The URL of the proxy to be used. + + :param proxy_headers: + A dictionary containing headers that will be sent to the proxy. In case + of HTTP they are being sent with each request, while in the + HTTPS/CONNECT case they are sent only once. Could be used for proxy + authentication. + + Example: + >>> proxy = urllib3.ProxyManager('http://localhost:3128/') + >>> r1 = proxy.request('GET', 'http://google.com/') + >>> r2 = proxy.request('GET', 'http://httpbin.org/') + >>> len(proxy.pools) + 1 + >>> r3 = proxy.request('GET', 'https://httpbin.org/') + >>> r4 = proxy.request('GET', 'https://twitter.com/') + >>> len(proxy.pools) + 3 + + """ + + def __init__(self, proxy_url, num_pools=10, headers=None, + proxy_headers=None, **connection_pool_kw): + + if isinstance(proxy_url, HTTPConnectionPool): + proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, + proxy_url.port) + proxy = parse_url(proxy_url) + if not proxy.port: + port = port_by_scheme.get(proxy.scheme, 80) + proxy = proxy._replace(port=port) + + if proxy.scheme not in ("http", "https"): + raise ProxySchemeUnknown(proxy.scheme) + + self.proxy = proxy + self.proxy_headers = proxy_headers or {} + + connection_pool_kw['_proxy'] = self.proxy + connection_pool_kw['_proxy_headers'] = self.proxy_headers + + super(ProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw) + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + if scheme == "https": + return super(ProxyManager, self).connection_from_host( + host, port, scheme, pool_kwargs=pool_kwargs) + + return super(ProxyManager, self).connection_from_host( + self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {'Accept': '*/*'} + + netloc = parse_url(url).netloc + if netloc: + headers_['Host'] = netloc + + if headers: + headers_.update(headers) + return headers_ + + def urlopen(self, method, url, redirect=True, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + u = parse_url(url) + + if u.scheme == "http": + # For proxied HTTPS requests, httplib sets the necessary headers + # on the CONNECT to the proxy. For HTTP, we'll definitely + # need to set 'Host' at the very least. + headers = kw.get('headers', self.headers) + kw['headers'] = self._set_proxy_headers(url, headers) + + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) + + +def proxy_from_url(url, **kw): + return ProxyManager(proxy_url=url, **kw) diff --git a/Contents/Libraries/Shared/urllib3/request.py b/Contents/Libraries/Shared/urllib3/request.py new file mode 100644 index 000000000..8f2f44bb2 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/request.py @@ -0,0 +1,150 @@ +from __future__ import absolute_import + +from .filepost import encode_multipart_formdata +from .packages.six.moves.urllib.parse import urlencode + + +__all__ = ['RequestMethods'] + + +class RequestMethods(object): + """ + Convenience mixin for classes who implement a :meth:`urlopen` method, such + as :class:`~urllib3.connectionpool.HTTPConnectionPool` and + :class:`~urllib3.poolmanager.PoolManager`. + + Provides behavior for making common types of HTTP request methods and + decides which type of request field encoding to use. + + Specifically, + + :meth:`.request_encode_url` is for sending requests whose fields are + encoded in the URL (such as GET, HEAD, DELETE). + + :meth:`.request_encode_body` is for sending requests whose fields are + encoded in the *body* of the request using multipart or www-form-urlencoded + (such as for POST, PUT, PATCH). + + :meth:`.request` is for making any kind of request, it will look up the + appropriate encoding format and use one of the above two methods to make + the request. + + Initializer parameters: + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + """ + + _encode_url_methods = {'DELETE', 'GET', 'HEAD', 'OPTIONS'} + + def __init__(self, headers=None): + self.headers = headers or {} + + def urlopen(self, method, url, body=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **kw): # Abstract + raise NotImplementedError("Classes extending RequestMethods must implement " + "their own ``urlopen`` method.") + + def request(self, method, url, fields=None, headers=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the appropriate encoding of + ``fields`` based on the ``method`` used. + + This is a convenience method that requires the least amount of manual + effort. It can be used in most situations, while still having the + option to drop down to more specific methods when necessary, such as + :meth:`request_encode_url`, :meth:`request_encode_body`, + or even the lowest level :meth:`urlopen`. + """ + method = method.upper() + + urlopen_kw['request_url'] = url + + if method in self._encode_url_methods: + return self.request_encode_url(method, url, fields=fields, + headers=headers, + **urlopen_kw) + else: + return self.request_encode_body(method, url, fields=fields, + headers=headers, + **urlopen_kw) + + def request_encode_url(self, method, url, fields=None, headers=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the url. This is useful for request methods like GET, HEAD, DELETE, etc. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': headers} + extra_kw.update(urlopen_kw) + + if fields: + url += '?' + urlencode(fields) + + return self.urlopen(method, url, **extra_kw) + + def request_encode_body(self, method, url, fields=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the body. This is useful for request methods like POST, PUT, PATCH, etc. + + When ``encode_multipart=True`` (default), then + :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode + the payload with the appropriate content type. Otherwise + :meth:`urllib.urlencode` is used with the + 'application/x-www-form-urlencoded' content type. + + Multipart encoding must be used when posting files, and it's reasonably + safe to use it in other times too. However, it may break request + signing, such as with OAuth. + + Supports an optional ``fields`` parameter of key/value strings AND + key/filetuple. A filetuple is a (filename, data, MIME type) tuple where + the MIME type is optional. For example:: + + fields = { + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), + 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + } + + When uploading a file, providing a filename (the first parameter of the + tuple) is optional but recommended to best mimic behavior of browsers. + + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string + which is used to compose the body of the request. The random boundary + string can be explicitly set with the ``multipart_boundary`` parameter. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': {}} + + if fields: + if 'body' in urlopen_kw: + raise TypeError( + "request got values for both 'fields' and 'body', can only specify one.") + + if encode_multipart: + body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) + else: + body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' + + extra_kw['body'] = body + extra_kw['headers'] = {'Content-Type': content_type} + + extra_kw['headers'].update(headers) + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) diff --git a/Contents/Libraries/Shared/urllib3/response.py b/Contents/Libraries/Shared/urllib3/response.py new file mode 100644 index 000000000..f0cfbb549 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/response.py @@ -0,0 +1,705 @@ +from __future__ import absolute_import +from contextlib import contextmanager +import zlib +import io +import logging +from socket import timeout as SocketTimeout +from socket import error as SocketError + +from ._collections import HTTPHeaderDict +from .exceptions import ( + BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, + ResponseNotChunked, IncompleteRead, InvalidHeader +) +from .packages.six import string_types as basestring, PY3 +from .packages.six.moves import http_client as httplib +from .connection import HTTPException, BaseSSLError +from .util.response import is_fp_closed, is_response_to_head + +log = logging.getLogger(__name__) + + +class DeflateDecoder(object): + + def __init__(self): + self._first_try = True + self._data = b'' + self._obj = zlib.decompressobj() + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + + if not self._first_try: + return self._obj.decompress(data) + + self._data += data + try: + decompressed = self._obj.decompress(data) + if decompressed: + self._first_try = False + self._data = None + return decompressed + except zlib.error: + self._first_try = False + self._obj = zlib.decompressobj(-zlib.MAX_WBITS) + try: + return self.decompress(self._data) + finally: + self._data = None + + +class GzipDecoderState(object): + + FIRST_MEMBER = 0 + OTHER_MEMBERS = 1 + SWALLOW_DATA = 2 + + +class GzipDecoder(object): + + def __init__(self): + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + self._state = GzipDecoderState.FIRST_MEMBER + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + ret = b'' + if self._state == GzipDecoderState.SWALLOW_DATA or not data: + return ret + while True: + try: + ret += self._obj.decompress(data) + except zlib.error: + previous_state = self._state + # Ignore data after the first error + self._state = GzipDecoderState.SWALLOW_DATA + if previous_state == GzipDecoderState.OTHER_MEMBERS: + # Allow trailing garbage acceptable in other gzip clients + return ret + raise + data = self._obj.unused_data + if not data: + return ret + self._state = GzipDecoderState.OTHER_MEMBERS + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + +class MultiDecoder(object): + """ + From RFC7231: + If one or more encodings have been applied to a representation, the + sender that applied the encodings MUST generate a Content-Encoding + header field that lists the content codings in the order in which + they were applied. + """ + + def __init__(self, modes): + self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')] + + def flush(self): + return self._decoders[0].flush() + + def decompress(self, data): + for d in reversed(self._decoders): + data = d.decompress(data) + return data + + +def _get_decoder(mode): + if ',' in mode: + return MultiDecoder(mode) + + if mode == 'gzip': + return GzipDecoder() + + return DeflateDecoder() + + +class HTTPResponse(io.IOBase): + """ + HTTP Response container. + + Backwards-compatible to httplib's HTTPResponse but the response ``body`` is + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. + + Extra parameters for behaviour not present in httplib.HTTPResponse: + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param original_response: + When this HTTPResponse wrapper is generated from an httplib.HTTPResponse + object, it's convenient to include the original for debug purposes. It's + otherwise unused. + + :param retries: + The retries contains the last :class:`~urllib3.util.retry.Retry` that + was used during the request. + + :param enforce_content_length: + Enforce content length checking. Body returned by server must match + value of Content-Length header, if present. Otherwise, raise error. + """ + + CONTENT_DECODERS = ['gzip', 'deflate'] + REDIRECT_STATUSES = [301, 302, 303, 307, 308] + + def __init__(self, body='', headers=None, status=0, version=0, reason=None, + strict=0, preload_content=True, decode_content=True, + original_response=None, pool=None, connection=None, msg=None, + retries=None, enforce_content_length=False, + request_method=None, request_url=None): + + if isinstance(headers, HTTPHeaderDict): + self.headers = headers + else: + self.headers = HTTPHeaderDict(headers) + self.status = status + self.version = version + self.reason = reason + self.strict = strict + self.decode_content = decode_content + self.retries = retries + self.enforce_content_length = enforce_content_length + + self._decoder = None + self._body = None + self._fp = None + self._original_response = original_response + self._fp_bytes_read = 0 + self.msg = msg + self._request_url = request_url + + if body and isinstance(body, (basestring, bytes)): + self._body = body + + self._pool = pool + self._connection = connection + + if hasattr(body, 'read'): + self._fp = body + + # Are we using the chunked-style of transfer encoding? + self.chunked = False + self.chunk_left = None + tr_enc = self.headers.get('transfer-encoding', '').lower() + # Don't incur the penalty of creating a list and then discarding it + encodings = (enc.strip() for enc in tr_enc.split(",")) + if "chunked" in encodings: + self.chunked = True + + # Determine length of response + self.length_remaining = self._init_length(request_method) + + # If requested, preload the body. + if preload_content and not self._body: + self._body = self.read(decode_content=decode_content) + + def get_redirect_location(self): + """ + Should we redirect and where to? + + :returns: Truthy redirect location string if we got a redirect status + code and valid location. ``None`` if redirect status and no + location. ``False`` if not a redirect status code. + """ + if self.status in self.REDIRECT_STATUSES: + return self.headers.get('location') + + return False + + def release_conn(self): + if not self._pool or not self._connection: + return + + self._pool._put_conn(self._connection) + self._connection = None + + @property + def data(self): + # For backwords-compat with earlier urllib3 0.4 and earlier. + if self._body: + return self._body + + if self._fp: + return self.read(cache_content=True) + + @property + def connection(self): + return self._connection + + def isclosed(self): + return is_fp_closed(self._fp) + + def tell(self): + """ + Obtain the number of bytes pulled over the wire so far. May differ from + the amount of content returned by :meth:``HTTPResponse.read`` if bytes + are encoded on the wire (e.g, compressed). + """ + return self._fp_bytes_read + + def _init_length(self, request_method): + """ + Set initial length value for Response content if available. + """ + length = self.headers.get('content-length') + + if length is not None: + if self.chunked: + # This Response will fail with an IncompleteRead if it can't be + # received as chunked. This method falls back to attempt reading + # the response before raising an exception. + log.warning("Received response with both Content-Length and " + "Transfer-Encoding set. This is expressly forbidden " + "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " + "attempting to process response as Transfer-Encoding: " + "chunked.") + return None + + try: + # RFC 7230 section 3.3.2 specifies multiple content lengths can + # be sent in a single Content-Length header + # (e.g. Content-Length: 42, 42). This line ensures the values + # are all valid ints and that as long as the `set` length is 1, + # all values are the same. Otherwise, the header is invalid. + lengths = set([int(val) for val in length.split(',')]) + if len(lengths) > 1: + raise InvalidHeader("Content-Length contained multiple " + "unmatching values (%s)" % length) + length = lengths.pop() + except ValueError: + length = None + else: + if length < 0: + length = None + + # Convert status to int for comparison + # In some cases, httplib returns a status of "_UNKNOWN" + try: + status = int(self.status) + except ValueError: + status = 0 + + # Check for responses that shouldn't include a body + if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD': + length = 0 + + return length + + def _init_decoder(self): + """ + Set-up the _decoder attribute if necessary. + """ + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 + content_encoding = self.headers.get('content-encoding', '').lower() + if self._decoder is None: + if content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + elif ',' in content_encoding: + encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS] + if len(encodings): + self._decoder = _get_decoder(content_encoding) + + def _decode(self, data, decode_content, flush_decoder): + """ + Decode the data passed in and potentially flush the decoder. + """ + try: + if decode_content and self._decoder: + data = self._decoder.decompress(data) + except (IOError, zlib.error) as e: + content_encoding = self.headers.get('content-encoding', '').lower() + raise DecodeError( + "Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding, e) + + if flush_decoder and decode_content: + data += self._flush_decoder() + + return data + + def _flush_decoder(self): + """ + Flushes the decoder. Should only be called if the decoder is actually + being used. + """ + if self._decoder: + buf = self._decoder.decompress(b'') + return buf + self._decoder.flush() + + return b'' + + @contextmanager + def _error_catcher(self): + """ + Catch low-level python exceptions, instead re-raising urllib3 + variants, so that low-level exceptions are not leaked in the + high-level api. + + On exit, release the connection back to the pool. + """ + clean_exit = False + + try: + try: + yield + + except SocketTimeout: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if 'read operation timed out' not in str(e): # Defensive: + # This shouldn't happen but just in case we're missing an edge + # case, let's avoid swallowing SSL errors. + raise + + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except (HTTPException, SocketError) as e: + # This includes IncompleteRead. + raise ProtocolError('Connection broken: %r' % e, e) + + # If no exception is thrown, we should avoid cleaning up + # unnecessarily. + clean_exit = True + finally: + # If we didn't terminate cleanly, we need to throw away our + # connection. + if not clean_exit: + # The response may not be closed but we're not going to use it + # anymore so close it now to ensure that the connection is + # released back to the pool. + if self._original_response: + self._original_response.close() + + # Closing the response may not actually be sufficient to close + # everything, so if we have a hold of the connection close that + # too. + if self._connection: + self._connection.close() + + # If we hold the original response but it's closed now, we should + # return the connection back to the pool. + if self._original_response and self._original_response.isclosed(): + self.release_conn() + + def read(self, amt=None, decode_content=None, cache_content=False): + """ + Similar to :meth:`httplib.HTTPResponse.read`, but with two additional + parameters: ``decode_content`` and ``cache_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param cache_content: + If True, will save the returned data such that the same result is + returned despite of the state of the underlying file object. This + is useful if you want the ``.data`` property to continue working + after having ``.read()`` the file object. (Overridden if ``amt`` is + set.) + """ + self._init_decoder() + if decode_content is None: + decode_content = self.decode_content + + if self._fp is None: + return + + flush_decoder = False + data = None + + with self._error_catcher(): + if amt is None: + # cStringIO doesn't like amt=None + data = self._fp.read() + flush_decoder = True + else: + cache_content = False + data = self._fp.read(amt) + if amt != 0 and not data: # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. + self._fp.close() + flush_decoder = True + if self.enforce_content_length and self.length_remaining not in (0, None): + # This is an edge case that httplib failed to cover due + # to concerns of backward compatibility. We're + # addressing it here to make sure IncompleteRead is + # raised during streaming, so all calls with incorrect + # Content-Length are caught. + raise IncompleteRead(self._fp_bytes_read, self.length_remaining) + + if data: + self._fp_bytes_read += len(data) + if self.length_remaining is not None: + self.length_remaining -= len(data) + + data = self._decode(data, decode_content, flush_decoder) + + if cache_content: + self._body = data + + return data + + def stream(self, amt=2**16, decode_content=None): + """ + A generator wrapper for the read() method. A call will block until + ``amt`` bytes have been read from the connection or until the + connection is closed. + + :param amt: + How much of the content to read. The generator will return up to + much data per iteration, but may return less. This is particularly + likely when using compressed data. However, the empty string will + never be returned. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + if self.chunked and self.supports_chunked_reads(): + for line in self.read_chunked(amt, decode_content=decode_content): + yield line + else: + while not is_fp_closed(self._fp): + data = self.read(amt=amt, decode_content=decode_content) + + if data: + yield data + + @classmethod + def from_httplib(ResponseCls, r, **response_kw): + """ + Given an :class:`httplib.HTTPResponse` instance ``r``, return a + corresponding :class:`urllib3.response.HTTPResponse` object. + + Remaining parameters are passed to the HTTPResponse constructor, along + with ``original_response=r``. + """ + headers = r.msg + + if not isinstance(headers, HTTPHeaderDict): + if PY3: # Python 3 + headers = HTTPHeaderDict(headers.items()) + else: # Python 2 + headers = HTTPHeaderDict.from_httplib(headers) + + # HTTPResponse objects in Python 3 don't have a .strict attribute + strict = getattr(r, 'strict', 0) + resp = ResponseCls(body=r, + headers=headers, + status=r.status, + version=r.version, + reason=r.reason, + strict=strict, + original_response=r, + **response_kw) + return resp + + # Backwards-compatibility methods for httplib.HTTPResponse + def getheaders(self): + return self.headers + + def getheader(self, name, default=None): + return self.headers.get(name, default) + + # Backwards compatibility for http.cookiejar + def info(self): + return self.headers + + # Overrides from io.IOBase + def close(self): + if not self.closed: + self._fp.close() + + if self._connection: + self._connection.close() + + @property + def closed(self): + if self._fp is None: + return True + elif hasattr(self._fp, 'isclosed'): + return self._fp.isclosed() + elif hasattr(self._fp, 'closed'): + return self._fp.closed + else: + return True + + def fileno(self): + if self._fp is None: + raise IOError("HTTPResponse has no file to get a fileno from") + elif hasattr(self._fp, "fileno"): + return self._fp.fileno() + else: + raise IOError("The file-like object this HTTPResponse is wrapped " + "around has no file descriptor") + + def flush(self): + if self._fp is not None and hasattr(self._fp, 'flush'): + return self._fp.flush() + + def readable(self): + # This method is required for `io` module compatibility. + return True + + def readinto(self, b): + # This method is required for `io` module compatibility. + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[:len(temp)] = temp + return len(temp) + + def supports_chunked_reads(self): + """ + Checks if the underlying file-like object looks like a + httplib.HTTPResponse object. We do this by testing for the fp + attribute. If it is present we assume it returns raw chunks as + processed by read_chunked(). + """ + return hasattr(self._fp, 'fp') + + def _update_chunk_length(self): + # First, we'll figure out length of a chunk and then + # we'll try to read it from socket. + if self.chunk_left is not None: + return + line = self._fp.fp.readline() + line = line.split(b';', 1)[0] + try: + self.chunk_left = int(line, 16) + except ValueError: + # Invalid chunked protocol response, abort. + self.close() + raise httplib.IncompleteRead(line) + + def _handle_chunk(self, amt): + returned_chunk = None + if amt is None: + chunk = self._fp._safe_read(self.chunk_left) + returned_chunk = chunk + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + elif amt < self.chunk_left: + value = self._fp._safe_read(amt) + self.chunk_left = self.chunk_left - amt + returned_chunk = value + elif amt == self.chunk_left: + value = self._fp._safe_read(amt) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + returned_chunk = value + else: # amt > self.chunk_left + returned_chunk = self._fp._safe_read(self.chunk_left) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + return returned_chunk + + def read_chunked(self, amt=None, decode_content=None): + """ + Similar to :meth:`HTTPResponse.read`, but with an additional + parameter: ``decode_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + self._init_decoder() + # FIXME: Rewrite this method and make it a class with a better structured logic. + if not self.chunked: + raise ResponseNotChunked( + "Response is not chunked. " + "Header 'transfer-encoding: chunked' is missing.") + if not self.supports_chunked_reads(): + raise BodyNotHttplibCompatible( + "Body should be httplib.HTTPResponse like. " + "It should have have an fp attribute which returns raw chunks.") + + with self._error_catcher(): + # Don't bother reading the body of a HEAD request. + if self._original_response and is_response_to_head(self._original_response): + self._original_response.close() + return + + # If a response is already read and closed + # then return immediately. + if self._fp.fp is None: + return + + while True: + self._update_chunk_length() + if self.chunk_left == 0: + break + chunk = self._handle_chunk(amt) + decoded = self._decode(chunk, decode_content=decode_content, + flush_decoder=False) + if decoded: + yield decoded + + if decode_content: + # On CPython and PyPy, we should never need to flush the + # decoder. However, on Jython we *might* need to, so + # lets defensively do it anyway. + decoded = self._flush_decoder() + if decoded: # Platform-specific: Jython. + yield decoded + + # Chunk content ends with \r\n: discard it. + while True: + line = self._fp.fp.readline() + if not line: + # Some sites may not end with '\r\n'. + break + if line == b'\r\n': + break + + # We read everything; close the "file". + if self._original_response: + self._original_response.close() + + def geturl(self): + """ + Returns the URL that was the source of this response. + If the request that generated this response redirected, this method + will return the final redirect location. + """ + if self.retries is not None and len(self.retries.history): + return self.retries.history[-1].redirect_location + else: + return self._request_url diff --git a/Contents/Libraries/Shared/urllib3/util/__init__.py b/Contents/Libraries/Shared/urllib3/util/__init__.py new file mode 100644 index 000000000..2f2770b62 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/util/__init__.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import +# For backwards compatibility, provide imports that used to be here. +from .connection import is_connection_dropped +from .request import make_headers +from .response import is_fp_closed +from .ssl_ import ( + SSLContext, + HAS_SNI, + IS_PYOPENSSL, + IS_SECURETRANSPORT, + assert_fingerprint, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .timeout import ( + current_time, + Timeout, +) + +from .retry import Retry +from .url import ( + get_host, + parse_url, + split_first, + Url, +) +from .wait import ( + wait_for_read, + wait_for_write +) + +__all__ = ( + 'HAS_SNI', + 'IS_PYOPENSSL', + 'IS_SECURETRANSPORT', + 'SSLContext', + 'Retry', + 'Timeout', + 'Url', + 'assert_fingerprint', + 'current_time', + 'is_connection_dropped', + 'is_fp_closed', + 'get_host', + 'parse_url', + 'make_headers', + 'resolve_cert_reqs', + 'resolve_ssl_version', + 'split_first', + 'ssl_wrap_socket', + 'wait_for_read', + 'wait_for_write' +) diff --git a/Contents/Libraries/Shared/urllib3/util/connection.py b/Contents/Libraries/Shared/urllib3/util/connection.py new file mode 100644 index 000000000..5ad70b2f1 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/util/connection.py @@ -0,0 +1,134 @@ +from __future__ import absolute_import +import socket +from .wait import NoWayToWaitForSocketError, wait_for_read +from ..contrib import _appengine_environ + + +def is_connection_dropped(conn): # Platform-specific + """ + Returns True if the connection is dropped and should be closed. + + :param conn: + :class:`httplib.HTTPConnection` object. + + Note: For platforms like AppEngine, this will always return ``False`` to + let the platform handle connection recycling transparently for us. + """ + sock = getattr(conn, 'sock', False) + if sock is False: # Platform-specific: AppEngine + return False + if sock is None: # Connection already closed (such as by httplib). + return True + try: + # Returns True if readable, which here means it's been dropped + return wait_for_read(sock, timeout=0.0) + except NoWayToWaitForSocketError: # Platform-specific: AppEngine + return False + + +# This function is copied from socket.py in the Python 2.7 standard +# library test suite. Added to its signature is only `socket_options`. +# One additional modification is that we avoid binding to IPv6 servers +# discovered in DNS if the system doesn't have IPv6 functionality. +def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + source_address=None, socket_options=None): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + + host, port = address + if host.startswith('['): + host = host.strip('[]') + err = None + + # Using the value from allowed_gai_family() in the context of getaddrinfo lets + # us select whether to work with IPv4 DNS records, IPv6 records, or both. + # The original create_connection function always returns all records. + family = allowed_gai_family() + + for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + + # If provided, set socket level options before connecting. + _set_socket_options(sock, socket_options) + + if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except socket.error as e: + err = e + if sock is not None: + sock.close() + sock = None + + if err is not None: + raise err + + raise socket.error("getaddrinfo returns an empty list") + + +def _set_socket_options(sock, options): + if options is None: + return + + for opt in options: + sock.setsockopt(*opt) + + +def allowed_gai_family(): + """This function is designed to work in the context of + getaddrinfo, where family=socket.AF_UNSPEC is the default and + will perform a DNS search for both IPv6 and IPv4 records.""" + + family = socket.AF_INET + if HAS_IPV6: + family = socket.AF_UNSPEC + return family + + +def _has_ipv6(host): + """ Returns True if the system can bind an IPv6 address. """ + sock = None + has_ipv6 = False + + # App Engine doesn't support IPV6 sockets and actually has a quota on the + # number of sockets that can be used, so just early out here instead of + # creating a socket needlessly. + # See https://github.com/urllib3/urllib3/issues/1446 + if _appengine_environ.is_appengine_sandbox(): + return False + + if socket.has_ipv6: + # has_ipv6 returns true if cPython was compiled with IPv6 support. + # It does not tell us if the system has IPv6 support enabled. To + # determine that we must bind to an IPv6 address. + # https://github.com/shazow/urllib3/pull/611 + # https://bugs.python.org/issue658327 + try: + sock = socket.socket(socket.AF_INET6) + sock.bind((host, 0)) + has_ipv6 = True + except Exception: + pass + + if sock: + sock.close() + return has_ipv6 + + +HAS_IPV6 = _has_ipv6('::1') diff --git a/Contents/Libraries/Shared/urllib3/util/queue.py b/Contents/Libraries/Shared/urllib3/util/queue.py new file mode 100644 index 000000000..d3d379a19 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/util/queue.py @@ -0,0 +1,21 @@ +import collections +from ..packages import six +from ..packages.six.moves import queue + +if six.PY2: + # Queue is imported for side effects on MS Windows. See issue #229. + import Queue as _unused_module_Queue # noqa: F401 + + +class LifoQueue(queue.Queue): + def _init(self, _): + self.queue = collections.deque() + + def _qsize(self, len=len): + return len(self.queue) + + def _put(self, item): + self.queue.append(item) + + def _get(self): + return self.queue.pop() diff --git a/Contents/Libraries/Shared/urllib3/util/request.py b/Contents/Libraries/Shared/urllib3/util/request.py new file mode 100644 index 000000000..3ddfcd559 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/util/request.py @@ -0,0 +1,118 @@ +from __future__ import absolute_import +from base64 import b64encode + +from ..packages.six import b, integer_types +from ..exceptions import UnrewindableBodyError + +ACCEPT_ENCODING = 'gzip,deflate' +_FAILEDTELL = object() + + +def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, + basic_auth=None, proxy_basic_auth=None, disable_cache=None): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + :param proxy_basic_auth: + Colon-separated username:password string for 'proxy-authorization: basic ...' + auth header. + + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example:: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ','.join(accept_encoding) + else: + accept_encoding = ACCEPT_ENCODING + headers['accept-encoding'] = accept_encoding + + if user_agent: + headers['user-agent'] = user_agent + + if keep_alive: + headers['connection'] = 'keep-alive' + + if basic_auth: + headers['authorization'] = 'Basic ' + \ + b64encode(b(basic_auth)).decode('utf-8') + + if proxy_basic_auth: + headers['proxy-authorization'] = 'Basic ' + \ + b64encode(b(proxy_basic_auth)).decode('utf-8') + + if disable_cache: + headers['cache-control'] = 'no-cache' + + return headers + + +def set_file_position(body, pos): + """ + If a position is provided, move file to that point. + Otherwise, we'll attempt to record a position for future use. + """ + if pos is not None: + rewind_body(body, pos) + elif getattr(body, 'tell', None) is not None: + try: + pos = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body. + pos = _FAILEDTELL + + return pos + + +def rewind_body(body, body_pos): + """ + Attempt to rewind body to a certain position. + Primarily used for request redirects and retries. + + :param body: + File-like object that supports seek. + + :param int pos: + Position to seek to in file. + """ + body_seek = getattr(body, 'seek', None) + if body_seek is not None and isinstance(body_pos, integer_types): + try: + body_seek(body_pos) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect/retry.") + elif body_pos is _FAILEDTELL: + raise UnrewindableBodyError("Unable to record file position for rewinding " + "request body during a redirect/retry.") + else: + raise ValueError("body_pos must be of type integer, " + "instead it was %s." % type(body_pos)) diff --git a/Contents/Libraries/Shared/urllib3/util/response.py b/Contents/Libraries/Shared/urllib3/util/response.py new file mode 100644 index 000000000..3d5486485 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/util/response.py @@ -0,0 +1,87 @@ +from __future__ import absolute_import +from ..packages.six.moves import http_client as httplib + +from ..exceptions import HeaderParsingError + + +def is_fp_closed(obj): + """ + Checks whether a given file-like object is closed. + + :param obj: + The file-like object to check. + """ + + try: + # Check `isclosed()` first, in case Python3 doesn't set `closed`. + # GH Issue #928 + return obj.isclosed() + except AttributeError: + pass + + try: + # Check via the official file-like-object way. + return obj.closed + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") + + +def assert_header_parsing(headers): + """ + Asserts whether all headers have been successfully parsed. + Extracts encountered errors from the result of parsing headers. + + Only works on Python 3. + + :param headers: Headers to verify. + :type headers: `httplib.HTTPMessage`. + + :raises urllib3.exceptions.HeaderParsingError: + If parsing errors are found. + """ + + # This will fail silently if we pass in the wrong kind of parameter. + # To make debugging easier add an explicit check. + if not isinstance(headers, httplib.HTTPMessage): + raise TypeError('expected httplib.Message, got {0}.'.format( + type(headers))) + + defects = getattr(headers, 'defects', None) + get_payload = getattr(headers, 'get_payload', None) + + unparsed_data = None + if get_payload: + # get_payload is actually email.message.Message.get_payload; + # we're only interested in the result if it's not a multipart message + if not headers.is_multipart(): + payload = get_payload() + + if isinstance(payload, (bytes, str)): + unparsed_data = payload + + if defects or unparsed_data: + raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) + + +def is_response_to_head(response): + """ + Checks whether the request of a response has been a HEAD-request. + Handles the quirks of AppEngine. + + :param conn: + :type conn: :class:`httplib.HTTPResponse` + """ + # FIXME: Can we do this somehow without accessing private httplib _method? + method = response._method + if isinstance(method, int): # Platform-specific: Appengine + return method == 3 + return method.upper() == 'HEAD' diff --git a/Contents/Libraries/Shared/urllib3/util/retry.py b/Contents/Libraries/Shared/urllib3/util/retry.py new file mode 100644 index 000000000..e7d0abd61 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/util/retry.py @@ -0,0 +1,411 @@ +from __future__ import absolute_import +import time +import logging +from collections import namedtuple +from itertools import takewhile +import email +import re + +from ..exceptions import ( + ConnectTimeoutError, + MaxRetryError, + ProtocolError, + ReadTimeoutError, + ResponseError, + InvalidHeader, +) +from ..packages import six + + +log = logging.getLogger(__name__) + + +# Data structure for representing the metadata of requests that result in a retry. +RequestHistory = namedtuple('RequestHistory', ["method", "url", "error", + "status", "redirect_location"]) + + +class Retry(object): + """ Retry configuration. + + Each retry attempt will create a new Retry object with updated values, so + they can be safely reused. + + Retries can be defined as a default for a pool:: + + retries = Retry(connect=5, read=2, redirect=5) + http = PoolManager(retries=retries) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', retries=Retry(10)) + + Retries can be disabled by passing ``False``:: + + response = http.request('GET', 'http://example.com/', retries=False) + + Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless + retries are disabled, in which case the causing exception will be raised. + + :param int total: + Total number of retries to allow. Takes precedence over other counts. + + Set to ``None`` to remove this constraint and fall back on other + counts. It's a good idea to set this to some sensibly-high value to + account for unexpected edge cases and avoid infinite retry loops. + + Set to ``0`` to fail on the first retry. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int connect: + How many connection-related errors to retry on. + + These are errors raised before the request is sent to the remote server, + which we assume has not triggered the server to process the request. + + Set to ``0`` to fail on the first retry of this type. + + :param int read: + How many times to retry on read errors. + + These errors are raised after the request was sent to the server, so the + request may have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + :param int redirect: + How many redirects to perform. Limit this to avoid infinite redirect + loops. + + A redirect is a HTTP response with a status code 301, 302, 303, 307 or + 308. + + Set to ``0`` to fail on the first retry of this type. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int status: + How many times to retry on bad status codes. + + These are retries made on responses, where status code matches + ``status_forcelist``. + + Set to ``0`` to fail on the first retry of this type. + + :param iterable method_whitelist: + Set of uppercased HTTP method verbs that we should retry on. + + By default, we only retry on methods which are considered to be + idempotent (multiple requests with the same parameters end with the + same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. + + Set to a ``False`` value to retry on any verb. + + :param iterable status_forcelist: + A set of integer HTTP status codes that we should force a retry on. + A retry is initiated if the request method is in ``method_whitelist`` + and the response status code is in ``status_forcelist``. + + By default, this is disabled with ``None``. + + :param float backoff_factor: + A backoff factor to apply between attempts after the second try + (most errors are resolved immediately by a second try without a + delay). urllib3 will sleep for:: + + {backoff factor} * (2 ** ({number of total retries} - 1)) + + seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep + for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer + than :attr:`Retry.BACKOFF_MAX`. + + By default, backoff is disabled (set to 0). + + :param bool raise_on_redirect: Whether, if the number of redirects is + exhausted, to raise a MaxRetryError, or to return a response with a + response code in the 3xx range. + + :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: + whether we should raise an exception, or return a response, + if status falls in ``status_forcelist`` range and retries have + been exhausted. + + :param tuple history: The history of the request encountered during + each call to :meth:`~Retry.increment`. The list is in the order + the requests occurred. Each list item is of class :class:`RequestHistory`. + + :param bool respect_retry_after_header: + Whether to respect Retry-After header on status codes defined as + :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. + + :param iterable remove_headers_on_redirect: + Sequence of headers to remove from the request when a response + indicating a redirect is returned before firing off the redirected + request. + """ + + DEFAULT_METHOD_WHITELIST = frozenset([ + 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) + + RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) + + DEFAULT_REDIRECT_HEADERS_BLACKLIST = frozenset(['Authorization']) + + #: Maximum backoff time. + BACKOFF_MAX = 120 + + def __init__(self, total=10, connect=None, read=None, redirect=None, status=None, + method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, + backoff_factor=0, raise_on_redirect=True, raise_on_status=True, + history=None, respect_retry_after_header=True, + remove_headers_on_redirect=DEFAULT_REDIRECT_HEADERS_BLACKLIST): + + self.total = total + self.connect = connect + self.read = read + self.status = status + + if redirect is False or total is False: + redirect = 0 + raise_on_redirect = False + + self.redirect = redirect + self.status_forcelist = status_forcelist or set() + self.method_whitelist = method_whitelist + self.backoff_factor = backoff_factor + self.raise_on_redirect = raise_on_redirect + self.raise_on_status = raise_on_status + self.history = history or tuple() + self.respect_retry_after_header = respect_retry_after_header + self.remove_headers_on_redirect = remove_headers_on_redirect + + def new(self, **kw): + params = dict( + total=self.total, + connect=self.connect, read=self.read, redirect=self.redirect, status=self.status, + method_whitelist=self.method_whitelist, + status_forcelist=self.status_forcelist, + backoff_factor=self.backoff_factor, + raise_on_redirect=self.raise_on_redirect, + raise_on_status=self.raise_on_status, + history=self.history, + remove_headers_on_redirect=self.remove_headers_on_redirect + ) + params.update(kw) + return type(self)(**params) + + @classmethod + def from_int(cls, retries, redirect=True, default=None): + """ Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r", retries, new_retries) + return new_retries + + def get_backoff_time(self): + """ Formula for computing the current backoff + + :rtype: float + """ + # We want to consider only the last consecutive errors sequence (Ignore redirects). + consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, + reversed(self.history)))) + if consecutive_errors_len <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) + return min(self.BACKOFF_MAX, backoff_value) + + def parse_retry_after(self, retry_after): + # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 + if re.match(r"^\s*[0-9]+\s*$", retry_after): + seconds = int(retry_after) + else: + retry_date_tuple = email.utils.parsedate(retry_after) + if retry_date_tuple is None: + raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) + retry_date = time.mktime(retry_date_tuple) + seconds = retry_date - time.time() + + if seconds < 0: + seconds = 0 + + return seconds + + def get_retry_after(self, response): + """ Get the value of Retry-After in seconds. """ + + retry_after = response.getheader("Retry-After") + + if retry_after is None: + return None + + return self.parse_retry_after(retry_after) + + def sleep_for_retry(self, response=None): + retry_after = self.get_retry_after(response) + if retry_after: + time.sleep(retry_after) + return True + + return False + + def _sleep_backoff(self): + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def sleep(self, response=None): + """ Sleep between retry attempts. + + This method will respect a server's ``Retry-After`` response header + and sleep the duration of the time requested. If that is not present, it + will use an exponential backoff. By default, the backoff factor is 0 and + this method will return immediately. + """ + + if response: + slept = self.sleep_for_retry(response) + if slept: + return + + self._sleep_backoff() + + def _is_connection_error(self, err): + """ Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err): + """ Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def _is_method_retryable(self, method): + """ Checks if a given HTTP method should be retried upon, depending if + it is included on the method whitelist. + """ + if self.method_whitelist and method.upper() not in self.method_whitelist: + return False + + return True + + def is_retry(self, method, status_code, has_retry_after=False): + """ Is this method/status code retryable? (Based on whitelists and control + variables such as the number of total retries to allow, whether to + respect the Retry-After header, whether this header is present, and + whether the returned status code is on the list of status codes to + be retried upon on the presence of the aforementioned header) + """ + if not self._is_method_retryable(method): + return False + + if self.status_forcelist and status_code in self.status_forcelist: + return True + + return (self.total and self.respect_retry_after_header and + has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES)) + + def is_exhausted(self): + """ Are we out of retries? """ + retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment(self, method=None, url=None, response=None, error=None, + _pool=None, _stacktrace=None): + """ Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.HTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise six.reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + connect = self.connect + read = self.read + redirect = self.redirect + status_count = self.status + cause = 'unknown' + status = None + redirect_location = None + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise six.reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False or not self._is_method_retryable(method): + raise six.reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = 'too many redirects' + redirect_location = response.get_redirect_location() + status = response.status + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and a the given method is in the whitelist + cause = ResponseError.GENERIC_ERROR + if response and response.status: + if status_count is not None: + status_count -= 1 + cause = ResponseError.SPECIFIC_ERROR.format( + status_code=response.status) + status = response.status + + history = self.history + (RequestHistory(method, url, error, status, redirect_location),) + + new_retry = self.new( + total=total, + connect=connect, read=read, redirect=redirect, status=status_count, + history=history) + + if new_retry.is_exhausted(): + raise MaxRetryError(_pool, url, error or ResponseError(cause)) + + log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) + + return new_retry + + def __repr__(self): + return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' + 'read={self.read}, redirect={self.redirect}, status={self.status})').format( + cls=type(self), self=self) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/Contents/Libraries/Shared/urllib3/util/ssl_.py b/Contents/Libraries/Shared/urllib3/util/ssl_.py new file mode 100644 index 000000000..24ee26d63 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/util/ssl_.py @@ -0,0 +1,379 @@ +from __future__ import absolute_import +import errno +import warnings +import hmac +import socket + +from binascii import hexlify, unhexlify +from hashlib import md5, sha1, sha256 + +from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning +from ..packages import six + + +SSLContext = None +HAS_SNI = False +IS_PYOPENSSL = False +IS_SECURETRANSPORT = False + +# Maps the length of a digest to a possible hash function producing this digest +HASHFUNC_MAP = { + 32: md5, + 40: sha1, + 64: sha256, +} + + +def _const_compare_digest_backport(a, b): + """ + Compare two digests of equal length in constant time. + + The digests must be of type str/bytes. + Returns True if the digests match, and False otherwise. + """ + result = abs(len(a) - len(b)) + for l, r in zip(bytearray(a), bytearray(b)): + result |= l ^ r + return result == 0 + + +_const_compare_digest = getattr(hmac, 'compare_digest', + _const_compare_digest_backport) + + +try: # Test for SSL features + import ssl + from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + + +try: + from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION +except ImportError: + OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 + OP_NO_COMPRESSION = 0x20000 + + +# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in +# those cases. This means that we can only detect IPv4 addresses in this case. +if hasattr(socket, 'inet_pton'): + inet_pton = socket.inet_pton +else: + # Maybe we can use ipaddress if the user has urllib3[secure]? + try: + import ipaddress + + def inet_pton(_, host): + if isinstance(host, bytes): + host = host.decode('ascii') + return ipaddress.ip_address(host) + + except ImportError: # Platform-specific: Non-Linux + def inet_pton(_, host): + return socket.inet_aton(host) + + +# A secure default. +# Sources for more information on TLS ciphers: +# +# - https://wiki.mozilla.org/Security/Server_Side_TLS +# - https://www.ssllabs.com/projects/best-practices/index.html +# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ +# +# The general intent is: +# - Prefer TLS 1.3 cipher suites +# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), +# - prefer ECDHE over DHE for better performance, +# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and +# security, +# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, +# - disable NULL authentication, MD5 MACs and DSS for security reasons. +DEFAULT_CIPHERS = ':'.join([ + 'TLS13-AES-256-GCM-SHA384', + 'TLS13-CHACHA20-POLY1305-SHA256', + 'TLS13-AES-128-GCM-SHA256', + 'ECDH+AESGCM', + 'ECDH+CHACHA20', + 'DH+AESGCM', + 'DH+CHACHA20', + 'ECDH+AES256', + 'DH+AES256', + 'ECDH+AES128', + 'DH+AES', + 'RSA+AESGCM', + 'RSA+AES', + '!aNULL', + '!eNULL', + '!MD5', +]) + +try: + from ssl import SSLContext # Modern SSL? +except ImportError: + import sys + + class SSLContext(object): # Platform-specific: Python 2 + def __init__(self, protocol_version): + self.protocol = protocol_version + # Use default values from a real SSLContext + self.check_hostname = False + self.verify_mode = ssl.CERT_NONE + self.ca_certs = None + self.options = 0 + self.certfile = None + self.keyfile = None + self.ciphers = None + + def load_cert_chain(self, certfile, keyfile): + self.certfile = certfile + self.keyfile = keyfile + + def load_verify_locations(self, cafile=None, capath=None): + self.ca_certs = cafile + + if capath is not None: + raise SSLError("CA directories not supported in older Pythons") + + def set_ciphers(self, cipher_suite): + self.ciphers = cipher_suite + + def wrap_socket(self, socket, server_hostname=None, server_side=False): + warnings.warn( + 'A true SSLContext object is not available. This prevents ' + 'urllib3 from configuring SSL appropriately and may cause ' + 'certain SSL connections to fail. You can upgrade to a newer ' + 'version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + InsecurePlatformWarning + ) + kwargs = { + 'keyfile': self.keyfile, + 'certfile': self.certfile, + 'ca_certs': self.ca_certs, + 'cert_reqs': self.verify_mode, + 'ssl_version': self.protocol, + 'server_side': server_side, + } + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + + +def assert_fingerprint(cert, fingerprint): + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + fingerprint = fingerprint.replace(':', '').lower() + digest_length = len(fingerprint) + hashfunc = HASHFUNC_MAP.get(digest_length) + if not hashfunc: + raise SSLError( + 'Fingerprint of invalid length: {0}'.format(fingerprint)) + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + cert_digest = hashfunc(cert).digest() + + if not _const_compare_digest(cert_digest, fingerprint_bytes): + raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' + .format(fingerprint, hexlify(cert_digest))) + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_NONE`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbreviation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_NONE + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'CERT_' + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_SSLv23 + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'PROTOCOL_' + candidate) + return res + + return candidate + + +def create_urllib3_context(ssl_version=None, cert_reqs=None, + options=None, ciphers=None): + """All arguments have the same meaning as ``ssl_wrap_socket``. + + By default, this function does a lot of the same work that + ``ssl.create_default_context`` does on Python 3.4+. It: + + - Disables SSLv2, SSLv3, and compression + - Sets a restricted set of server ciphers + + If you wish to enable SSLv3, you can do:: + + from urllib3.util import ssl_ + context = ssl_.create_urllib3_context() + context.options &= ~ssl_.OP_NO_SSLv3 + + You can do the same to enable compression (substituting ``COMPRESSION`` + for ``SSLv3`` in the last line above). + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. + :param ciphers: + Which cipher suites to allow the server to select. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + + # Setting the default here, as we may have no ssl module on import + cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + + context.options |= options + + context.verify_mode = cert_reqs + if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 + # We do our own verification, including fingerprints and alternative + # hostnames. So disable it here + context.check_hostname = False + return context + + +def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None, ciphers=None, ssl_context=None, + ca_cert_dir=None): + """ + All arguments except for server_hostname, ssl_context, and ca_cert_dir have + the same meaning as they do when using :func:`ssl.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. + :param ca_cert_dir: + A directory containing CA certificates in multiple separate files, as + supported by OpenSSL's -CApath flag or the capath argument to + SSLContext.load_verify_locations(). + """ + context = ssl_context + if context is None: + # Note: This branch of code and all the variables in it are no longer + # used by urllib3 itself. We should consider deprecating and removing + # this code. + context = create_urllib3_context(ssl_version, cert_reqs, + ciphers=ciphers) + + if ca_certs or ca_cert_dir: + try: + context.load_verify_locations(ca_certs, ca_cert_dir) + except IOError as e: # Platform-specific: Python 2.7 + raise SSLError(e) + # Py33 raises FileNotFoundError which subclasses OSError + # These are not equivalent unless we check the errno attribute + except OSError as e: # Platform-specific: Python 3.3 and beyond + if e.errno == errno.ENOENT: + raise SSLError(e) + raise + elif getattr(context, 'load_default_certs', None) is not None: + # try to load OS default certs; works well on Windows (require Python3.4+) + context.load_default_certs() + + if certfile: + context.load_cert_chain(certfile, keyfile) + + # If we detect server_hostname is an IP address then the SNI + # extension should not be used according to RFC3546 Section 3.1 + # We shouldn't warn the user if SNI isn't available but we would + # not be using SNI anyways due to IP address for server_hostname. + if ((server_hostname is not None and not is_ipaddress(server_hostname)) + or IS_SECURETRANSPORT): + if HAS_SNI and server_hostname is not None: + return context.wrap_socket(sock, server_hostname=server_hostname) + + warnings.warn( + 'An HTTPS request has been made, but the SNI (Server Name ' + 'Indication) extension to TLS is not available on this platform. ' + 'This may cause the server to present an incorrect TLS ' + 'certificate, which can cause validation failures. You can upgrade to ' + 'a newer version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + SNIMissingWarning + ) + + return context.wrap_socket(sock) + + +def is_ipaddress(hostname): + """Detects whether the hostname given is an IP address. + + :param str hostname: Hostname to examine. + :return: True if the hostname is an IP address, False otherwise. + """ + if six.PY3 and isinstance(hostname, bytes): + # IDN A-label bytes are ASCII compatible. + hostname = hostname.decode('ascii') + + families = [socket.AF_INET] + if hasattr(socket, 'AF_INET6'): + families.append(socket.AF_INET6) + + for af in families: + try: + inet_pton(af, hostname) + except (socket.error, ValueError, OSError): + pass + else: + return True + return False diff --git a/Contents/Libraries/Shared/urllib3/util/timeout.py b/Contents/Libraries/Shared/urllib3/util/timeout.py new file mode 100644 index 000000000..cec817e6e --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/util/timeout.py @@ -0,0 +1,242 @@ +from __future__ import absolute_import +# The default socket timeout, used by httplib to indicate that no timeout was +# specified by the user +from socket import _GLOBAL_DEFAULT_TIMEOUT +import time + +from ..exceptions import TimeoutStateError + +# A sentinel value to indicate that no timeout was specified by the user in +# urllib3 +_Default = object() + + +# Use time.monotonic if available. +current_time = getattr(time, "monotonic", time.time) + + +class Timeout(object): + """ Timeout configuration. + + Timeouts can be defined as a default for a pool:: + + timeout = Timeout(connect=2.0, read=7.0) + http = PoolManager(timeout=timeout) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``:: + + no_timeout = Timeout(connect=None, read=None) + response = http.request('GET', 'http://example.com/, timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: integer, float, or None + + :param connect: + The maximum amount of time to wait for a connection attempt to a server + to succeed. Omitting the parameter will default the connect timeout to + the system default, probably `the global default timeout in socket.py + `_. + None will set an infinite timeout for connection attempts. + + :type connect: integer, float, or None + + :param read: + The maximum amount of time to wait between consecutive + read operations for a response from the server. Omitting + the parameter will default the read timeout to the system + default, probably `the global default timeout in socket.py + `_. + None will set an infinite timeout. + + :type read: integer, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + + If your goal is to cut off any request after a set amount of wall clock + time, consider having a second "watcher" thread to cut off a slow + request. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT + + def __init__(self, total=None, connect=_Default, read=_Default): + self._connect = self._validate_timeout(connect, 'connect') + self._read = self._validate_timeout(read, 'read') + self.total = self._validate_timeout(total, 'total') + self._start_connect = None + + def __str__(self): + return '%s(connect=%r, read=%r, total=%r)' % ( + type(self).__name__, self._connect, self._read, self.total) + + @classmethod + def _validate_timeout(cls, value, name): + """ Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If it is a numeric value less than or equal to + zero, or the type is not an integer, float, or None. + """ + if value is _Default: + return cls.DEFAULT_TIMEOUT + + if value is None or value is cls.DEFAULT_TIMEOUT: + return value + + if isinstance(value, bool): + raise ValueError("Timeout cannot be a boolean value. It must " + "be an int, float or None.") + try: + float(value) + except (TypeError, ValueError): + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + try: + if value <= 0: + raise ValueError("Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than or equal to 0." % (name, value)) + except TypeError: # Python 3 + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + return value + + @classmethod + def from_float(cls, timeout): + """ Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, sentinel default object, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self): + """ Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, + total=self.total) + + def start_connect(self): + """ Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = current_time() + return self._start_connect + + def get_connect_duration(self): + """ Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError("Can't get connect duration for timer " + "that has not started.") + return current_time() - self._start_connect + + @property + def connect_timeout(self): + """ Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) + + @property + def read_timeout(self): + """ Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if (self.total is not None and + self.total is not self.DEFAULT_TIMEOUT and + self._read is not None and + self._read is not self.DEFAULT_TIMEOUT): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), + self._read)) + elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self._read diff --git a/Contents/Libraries/Shared/urllib3/util/url.py b/Contents/Libraries/Shared/urllib3/util/url.py new file mode 100644 index 000000000..6b6f9968d --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/util/url.py @@ -0,0 +1,230 @@ +from __future__ import absolute_import +from collections import namedtuple + +from ..exceptions import LocationParseError + + +url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] + +# We only want to normalize urls with an HTTP(S) scheme. +# urllib3 infers URLs without a scheme (None) to be http. +NORMALIZABLE_SCHEMES = ('http', 'https', None) + + +class Url(namedtuple('Url', url_attrs)): + """ + Datastructure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. Both the scheme and host are normalized as they are + both case-insensitive according to RFC 3986. + """ + __slots__ = () + + def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, + query=None, fragment=None): + if path and not path.startswith('/'): + path = '/' + path + if scheme: + scheme = scheme.lower() + if host and scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return super(Url, cls).__new__(cls, scheme, auth, host, port, path, + query, fragment) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or '/' + + if self.query is not None: + uri += '?' + self.query + + return uri + + @property + def netloc(self): + """Network location including host and port""" + if self.port: + return '%s:%d' % (self.host, self.port) + return self.host + + @property + def url(self): + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: :: + + >>> U = parse_url('http://google.com/mail/') + >>> U.url + 'http://google.com/mail/' + >>> Url('http', 'username:password', 'host.com', 80, + ... '/path', 'query', 'fragment').url + 'http://username:password@host.com:80/path?query#fragment' + """ + scheme, auth, host, port, path, query, fragment = self + url = '' + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + '://' + if auth is not None: + url += auth + '@' + if host is not None: + url += host + if port is not None: + url += ':' + str(port) + if path is not None: + url += path + if query is not None: + url += '?' + query + if fragment is not None: + url += '#' + fragment + + return url + + def __str__(self): + return self.url + + +def split_first(s, delims): + """ + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example:: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, '', None + + return s[:min_idx], s[min_idx + 1:], min_delim + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + + Partly backwards-compatible with :mod:`urlparse`. + + Example:: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/mail/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + + # While this code has overlap with stdlib's urlparse, it is much + # simplified for our needs and less annoying. + # Additionally, this implementations does silly things to be optimal + # on CPython. + + if not url: + # Empty + return Url() + + scheme = None + auth = None + host = None + port = None + path = None + fragment = None + query = None + + # Scheme + if '://' in url: + scheme, url = url.split('://', 1) + + # Find the earliest Authority Terminator + # (http://tools.ietf.org/html/rfc3986#section-3.2) + url, path_, delim = split_first(url, ['/', '?', '#']) + + if delim: + # Reassemble the path + path = delim + path_ + + # Auth + if '@' in url: + # Last '@' denotes end of auth part + auth, url = url.rsplit('@', 1) + + # IPv6 + if url and url[0] == '[': + host, url = url.split(']', 1) + host += ']' + + # Port + if ':' in url: + _host, port = url.split(':', 1) + + if not host: + host = _host + + if port: + # If given, ports must be integers. No whitespace, no plus or + # minus prefixes, no non-integer digits such as ^2 (superscript). + if not port.isdigit(): + raise LocationParseError(url) + try: + port = int(port) + except ValueError: + raise LocationParseError(url) + else: + # Blank ports are cool, too. (rfc3986#section-3.2.3) + port = None + + elif not host and url: + host = url + + if not path: + return Url(scheme, auth, host, port, path, query, fragment) + + # Fragment + if '#' in path: + path, fragment = path.split('#', 1) + + # Query + if '?' in path: + path, query = path.split('?', 1) + + return Url(scheme, auth, host, port, path, query, fragment) + + +def get_host(url): + """ + Deprecated. Use :func:`parse_url` instead. + """ + p = parse_url(url) + return p.scheme or 'http', p.hostname, p.port diff --git a/Contents/Libraries/Shared/urllib3/util/wait.py b/Contents/Libraries/Shared/urllib3/util/wait.py new file mode 100644 index 000000000..4db71bafd --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/util/wait.py @@ -0,0 +1,150 @@ +import errno +from functools import partial +import select +import sys +try: + from time import monotonic +except ImportError: + from time import time as monotonic + +__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] + + +class NoWayToWaitForSocketError(Exception): + pass + + +# How should we wait on sockets? +# +# There are two types of APIs you can use for waiting on sockets: the fancy +# modern stateful APIs like epoll/kqueue, and the older stateless APIs like +# select/poll. The stateful APIs are more efficient when you have a lots of +# sockets to keep track of, because you can set them up once and then use them +# lots of times. But we only ever want to wait on a single socket at a time +# and don't want to keep track of state, so the stateless APIs are actually +# more efficient. So we want to use select() or poll(). +# +# Now, how do we choose between select() and poll()? On traditional Unixes, +# select() has a strange calling convention that makes it slow, or fail +# altogether, for high-numbered file descriptors. The point of poll() is to fix +# that, so on Unixes, we prefer poll(). +# +# On Windows, there is no poll() (or at least Python doesn't provide a wrapper +# for it), but that's OK, because on Windows, select() doesn't have this +# strange calling convention; plain select() works fine. +# +# So: on Windows we use select(), and everywhere else we use poll(). We also +# fall back to select() in case poll() is somehow broken or missing. + +if sys.version_info >= (3, 5): + # Modern Python, that retries syscalls by default + def _retry_on_intr(fn, timeout): + return fn(timeout) +else: + # Old and broken Pythons. + def _retry_on_intr(fn, timeout): + if timeout is None: + deadline = float("inf") + else: + deadline = monotonic() + timeout + + while True: + try: + return fn(timeout) + # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 + except (OSError, select.error) as e: + # 'e.args[0]' incantation works for both OSError and select.error + if e.args[0] != errno.EINTR: + raise + else: + timeout = deadline - monotonic() + if timeout < 0: + timeout = 0 + if timeout == float("inf"): + timeout = None + continue + + +def select_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + rcheck = [] + wcheck = [] + if read: + rcheck.append(sock) + if write: + wcheck.append(sock) + # When doing a non-blocking connect, most systems signal success by + # marking the socket writable. Windows, though, signals success by marked + # it as "exceptional". We paper over the difference by checking the write + # sockets for both conditions. (The stdlib selectors module does the same + # thing.) + fn = partial(select.select, rcheck, wcheck, wcheck) + rready, wready, xready = _retry_on_intr(fn, timeout) + return bool(rready or wready or xready) + + +def poll_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + mask = 0 + if read: + mask |= select.POLLIN + if write: + mask |= select.POLLOUT + poll_obj = select.poll() + poll_obj.register(sock, mask) + + # For some reason, poll() takes timeout in milliseconds + def do_poll(t): + if t is not None: + t *= 1000 + return poll_obj.poll(t) + + return bool(_retry_on_intr(do_poll, timeout)) + + +def null_wait_for_socket(*args, **kwargs): + raise NoWayToWaitForSocketError("no select-equivalent available") + + +def _have_working_poll(): + # Apparently some systems have a select.poll that fails as soon as you try + # to use it, either due to strange configuration or broken monkeypatching + # from libraries like eventlet/greenlet. + try: + poll_obj = select.poll() + _retry_on_intr(poll_obj.poll, 0) + except (AttributeError, OSError): + return False + else: + return True + + +def wait_for_socket(*args, **kwargs): + # We delay choosing which implementation to use until the first time we're + # called. We could do it at import time, but then we might make the wrong + # decision if someone goes wild with monkeypatching select.poll after + # we're imported. + global wait_for_socket + if _have_working_poll(): + wait_for_socket = poll_wait_for_socket + elif hasattr(select, "select"): + wait_for_socket = select_wait_for_socket + else: # Platform-specific: Appengine. + wait_for_socket = null_wait_for_socket + return wait_for_socket(*args, **kwargs) + + +def wait_for_read(sock, timeout=None): + """ Waits for reading to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, read=True, timeout=timeout) + + +def wait_for_write(sock, timeout=None): + """ Waits for writing to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, write=True, timeout=timeout) From 0c54f0e36f715aa786f7048d1b617bbf48242674 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 30 Oct 2018 16:58:25 +0100 Subject: [PATCH 279/710] add license for urllib3, update license for requests --- Licenses/requests/LICENSE | 4 ++-- Licenses/urllib3/LICENSE.txt | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 Licenses/urllib3/LICENSE.txt diff --git a/Licenses/requests/LICENSE b/Licenses/requests/LICENSE index db78ea69f..841c6023b 100644 --- a/Licenses/requests/LICENSE +++ b/Licenses/requests/LICENSE @@ -1,10 +1,10 @@ -Copyright 2017 Kenneth Reitz +Copyright 2018 Kenneth Reitz Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/Licenses/urllib3/LICENSE.txt b/Licenses/urllib3/LICENSE.txt new file mode 100644 index 000000000..1c3283ee5 --- /dev/null +++ b/Licenses/urllib3/LICENSE.txt @@ -0,0 +1,19 @@ +This is the MIT license: http://www.opensource.org/licenses/mit-license.php + +Copyright 2008-2016 Andrey Petrov and contributors (see CONTRIBUTORS.txt) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. From 72b7e6b06dadd51c999d4dfaffe8019010b91e16 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 30 Oct 2018 16:59:48 +0100 Subject: [PATCH 280/710] core: update certifi to 2018.10.15 --- Contents/Libraries/Shared/certifi/__init__.py | 2 +- Contents/Libraries/Shared/certifi/cacert.pem | 289 +- .../Libraries/Shared/certifi/old_root.pem | 414 -- Contents/Libraries/Shared/certifi/weak.pem | 5019 ----------------- 4 files changed, 64 insertions(+), 5660 deletions(-) delete mode 100644 Contents/Libraries/Shared/certifi/old_root.pem delete mode 100644 Contents/Libraries/Shared/certifi/weak.pem diff --git a/Contents/Libraries/Shared/certifi/__init__.py b/Contents/Libraries/Shared/certifi/__init__.py index 556193cef..50f2e1301 100644 --- a/Contents/Libraries/Shared/certifi/__init__.py +++ b/Contents/Libraries/Shared/certifi/__init__.py @@ -1,3 +1,3 @@ from .core import where, old_where -__version__ = "2018.01.18" +__version__ = "2018.10.15" diff --git a/Contents/Libraries/Shared/certifi/cacert.pem b/Contents/Libraries/Shared/certifi/cacert.pem index 101ac98fa..e75d85b38 100644 --- a/Contents/Libraries/Shared/certifi/cacert.pem +++ b/Contents/Libraries/Shared/certifi/cacert.pem @@ -326,36 +326,6 @@ OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- -# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Label: "Visa eCommerce Root" -# Serial: 25952180776285836048024890241505565794 -# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 -# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 -# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - # Issuer: CN=AAA Certificate Services O=Comodo CA Limited # Subject: CN=AAA Certificate Services O=Comodo CA Limited # Label: "Comodo AAA Services root" @@ -3483,39 +3453,6 @@ AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ 5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- -# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. -# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. -# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" -# Serial: 156233699172481 -# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e -# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb -# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 ------BEGIN CERTIFICATE----- -MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE -BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn -aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg -QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg -SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 -MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD -VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom -/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR -Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 -4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z -5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 -hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID -AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX -SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l -VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq -URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf -peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF -Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW -+qtB4Uu2NQvAmxU= ------END CERTIFICATE----- - # Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 # Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 # Label: "Certinomis - Root CA" @@ -3725,169 +3662,6 @@ lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR -----END CERTIFICATE----- -# Issuer: CN=Certplus Root CA G1 O=Certplus -# Subject: CN=Certplus Root CA G1 O=Certplus -# Label: "Certplus Root CA G1" -# Serial: 1491911565779898356709731176965615564637713 -# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 -# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 -# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a -iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt -6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP -0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f -6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE -EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN -1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc -h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT -mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV -4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO -WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud -DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd -Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq -hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh -66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 -/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS -S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j -2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R -Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr -RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy -6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV -V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 -g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl -++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= ------END CERTIFICATE----- - -# Issuer: CN=Certplus Root CA G2 O=Certplus -# Subject: CN=Certplus Root CA G2 O=Certplus -# Label: "Certplus Root CA G2" -# Serial: 1492087096131536844209563509228951875861589 -# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 -# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a -# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 ------BEGIN CERTIFICATE----- -MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat -93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x -Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P -AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj -FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG -SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch -p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal -U5ORGpOucGpnutee5WEaXw== ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust -# Subject: CN=OpenTrust Root CA G1 O=OpenTrust -# Label: "OpenTrust Root CA G1" -# Serial: 1492036577811947013770400127034825178844775 -# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da -# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e -# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b -wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX -/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 -77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP -uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx -p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx -Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 -TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W -G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw -vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY -EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 -2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw -DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E -PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf -gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS -FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 -V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P -XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I -i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t -TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 -09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky -Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ -AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj -1oxx ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust -# Subject: CN=OpenTrust Root CA G2 O=OpenTrust -# Label: "OpenTrust Root CA G2" -# Serial: 1492012448042702096986875987676935573415441 -# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb -# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b -# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh -/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e -CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 -1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE -FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS -gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X -G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy -YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH -vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 -t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ -gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 -5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w -DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz -Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 -nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT -RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT -wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 -t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa -TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 -o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU -3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA -iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f -WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM -S1IK ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust -# Subject: CN=OpenTrust Root CA G3 O=OpenTrust -# Label: "OpenTrust Root CA G3" -# Serial: 1492104908271485653071219941864171170455615 -# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 -# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 -# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 ------BEGIN CERTIFICATE----- -MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx -CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U -cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow -QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl -blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm -3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d -oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G -A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 -DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK -BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q -j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx -4nxp5V2a+EEfOzmTk51V6s2N8fvB ------END CERTIFICATE----- - # Issuer: CN=ISRG Root X1 O=Internet Security Research Group # Subject: CN=ISRG Root X1 O=Internet Security Research Group # Label: "ISRG Root X1" @@ -4431,3 +4205,66 @@ MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- diff --git a/Contents/Libraries/Shared/certifi/old_root.pem b/Contents/Libraries/Shared/certifi/old_root.pem deleted file mode 100644 index af30ea711..000000000 --- a/Contents/Libraries/Shared/certifi/old_root.pem +++ /dev/null @@ -1,414 +0,0 @@ -# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Secure Server CA" -# Serial: 927650371 -# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee -# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 -# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Label: "ValiCert Class 2 VA" -# Serial: 1 -# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 -# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 -# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- - -# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Express (Class C) Root" -# Serial: 104 -# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 -# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b -# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Business (Class B) Root" -# Serial: 105 -# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 -# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af -# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Label: "RSA Root Certificate 1" -# Serial: 1 -# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 -# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb -# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Label: "ValiCert Class 1 VA" -# Serial: 1 -# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb -# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e -# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure eBusiness CA 1" -# Serial: 4 -# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d -# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 -# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure Global eBusiness CA" -# Serial: 1 -# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc -# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 -# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Premium Server CA" -# Serial: 1 -# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a -# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a -# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Server CA" -# Serial: 1 -# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d -# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c -# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 149843929435818692848040365716851702463 -# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 -# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 -# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 80507572722862485515306429940691309246 -# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 -# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b -# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Label: "Verisign Class 3 Public Primary Certification Authority - G2" -# Serial: 167285380242319648451154478808036881606 -# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 -# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f -# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- - -# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Label: "GTE CyberTrust Global Root" -# Serial: 421 -# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db -# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 -# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -# Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Label: "Equifax Secure Certificate Authority" -# Serial: 903804111 -# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 -# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a -# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- diff --git a/Contents/Libraries/Shared/certifi/weak.pem b/Contents/Libraries/Shared/certifi/weak.pem deleted file mode 100644 index 4426034f4..000000000 --- a/Contents/Libraries/Shared/certifi/weak.pem +++ /dev/null @@ -1,5019 +0,0 @@ - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Label: "GeoTrust Universal CA" -# Serial: 1 -# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 -# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 -# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Universal CA 2" -# Serial: 1 -# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 -# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 -# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Label: "Visa eCommerce Root" -# Serial: 25952180776285836048024890241505565794 -# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 -# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 -# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - -# Issuer: CN=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Chambers of Commerce Root" -# Serial: 0 -# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84 -# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1 -# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3 ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg -b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa -MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB -ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw -IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B -AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb -unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d -BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq -7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 -0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX -roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG -A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j -aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA -BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud -EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN -BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB -AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd -p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi -1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc -XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 -eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu -tGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Global Chambersign Root" -# Serial: 0 -# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19 -# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9 -# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo -YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 -MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy -NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G -A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA -A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 -Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s -QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV -eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 -B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh -z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T -AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i -ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH -MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD -VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE -VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B -AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM -bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi -ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG -VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c -ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ -AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Label: "XRamp Global CA Root" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: O=Government Root Certification Authority -# Subject: O=Government Root Certification Authority -# Label: "Taiwan GRCA" -# Serial: 42023070807708724159991140556527066870 -# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e -# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 -# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Label: "DST ACES CA X6" -# Serial: 17771143917277623872238992636097467865 -# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8 -# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d -# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40 ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx -ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w -MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD -VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx -FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu -ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 -gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH -fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a -ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT -ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk -c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto -dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI -hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk -QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ -h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR -rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 -9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu -IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow -RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY -U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv -Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br -YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF -nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH -6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt -eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ -c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ -MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH -HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf -jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c -wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB -AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp -WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 -xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ -2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ -IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 -aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X -em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR -dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ -OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ -hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy -tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Label: "GeoTrust Primary Certification Authority" -# Serial: 32798226551256963324313806436981982369 -# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf -# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 -# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA" -# Serial: 69529181992039203566298953787712940909 -# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 -# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 -# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" -# Serial: 33037644167568058970164719475676101450 -# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c -# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 -# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Label: "Security Communication EV RootCA1" -# Serial: 0 -# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3 -# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d -# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37 ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz -MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N -IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 -bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE -RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO -zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 -bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF -MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 -VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC -OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW -tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ -q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb -EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ -Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O -VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GA CA" -# Serial: 86718877871133159090080555911823548314 -# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 -# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 -# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G3" -# Serial: 28809105769928564313984085209975885599 -# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 -# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd -# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G2" -# Serial: 71758320672825410020661621085256472406 -# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f -# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 -# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G3" -# Serial: 127614157056681299805556476275995414779 -# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 -# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 -# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" -# Serial: 63143484348153506665311985501458640051 -# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 -# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a -# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 -MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 -ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD -VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j -b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq -scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO -xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H -LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX -uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD -yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ -JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q -rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN -BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L -hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB -QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ -HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu -Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg -QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB -BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA -A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb -laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 -awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo -JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw -LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT -VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk -LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb -UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ -QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ -naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls -QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Label: "EE Certification Centre Root CA" -# Serial: 112324828676200291871926431888494945866 -# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f -# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 -# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 -czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG -CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy -MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl -ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS -b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy -euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO -bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw -WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d -MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE -1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ -zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF -BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV -v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG -E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW -iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v -GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R1 O=Disig a.s. -# Subject: CN=CA Disig Root R1 O=Disig a.s. -# Label: "CA Disig Root R1" -# Serial: 14052245610670616104 -# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a -# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6 -# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy -MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk -D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o -OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A -fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe -IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n -oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK -/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj -rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD -3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE -7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC -yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd -qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI -hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR -xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA -SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo -HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB -emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC -AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb -7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x -DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk -F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF -a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT -Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 14367148294922964480859022125800977897474 -# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e -# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb -# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G3" -# Serial: 10003001 -# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 -# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc -# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX -DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP -cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW -IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX -xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy -KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR -9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az -5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 -6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 -Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP -bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt -BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt -XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd -INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp -LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 -Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp -gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh -/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw -0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A -fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq -4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR -1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ -QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM -94B7IWcnMFk= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden EV Root CA" -# Serial: 10000013 -# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba -# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb -# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. -# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. -# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" -# Serial: 156233699172481 -# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e -# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb -# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 ------BEGIN CERTIFICATE----- -MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE -BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn -aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg -QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg -SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 -MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD -VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom -/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR -Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 -4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z -5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 -hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID -AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX -SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l -VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq -URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf -peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF -Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW -+qtB4Uu2NQvAmxU= ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Root CA" -# Serial: 1 -# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f -# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 -# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 ------BEGIN CERTIFICATE----- -MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb -BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz -MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx -FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g -Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 -fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl -LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV -WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF -TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb -5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc -CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri -wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ -wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG -m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 -F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng -WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 -2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF -AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ -0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw -F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS -g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj -qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN -h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ -ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V -btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj -Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ -8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW -gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=Certplus Root CA G1 O=Certplus -# Subject: CN=Certplus Root CA G1 O=Certplus -# Label: "Certplus Root CA G1" -# Serial: 1491911565779898356709731176965615564637713 -# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 -# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 -# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a -iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt -6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP -0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f -6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE -EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN -1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc -h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT -mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV -4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO -WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud -DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd -Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq -hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh -66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 -/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS -S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j -2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R -Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr -RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy -6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV -V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 -g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl -++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= ------END CERTIFICATE----- - -# Issuer: CN=Certplus Root CA G2 O=Certplus -# Subject: CN=Certplus Root CA G2 O=Certplus -# Label: "Certplus Root CA G2" -# Serial: 1492087096131536844209563509228951875861589 -# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 -# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a -# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 ------BEGIN CERTIFICATE----- -MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat -93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x -Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P -AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj -FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG -SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch -p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal -U5ORGpOucGpnutee5WEaXw== ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust -# Subject: CN=OpenTrust Root CA G1 O=OpenTrust -# Label: "OpenTrust Root CA G1" -# Serial: 1492036577811947013770400127034825178844775 -# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da -# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e -# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b -wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX -/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 -77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP -uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx -p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx -Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 -TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W -G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw -vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY -EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 -2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw -DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E -PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf -gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS -FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 -V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P -XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I -i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t -TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 -09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky -Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ -AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj -1oxx ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust -# Subject: CN=OpenTrust Root CA G2 O=OpenTrust -# Label: "OpenTrust Root CA G2" -# Serial: 1492012448042702096986875987676935573415441 -# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb -# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b -# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh -/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e -CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 -1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE -FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS -gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X -G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy -YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH -vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 -t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ -gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 -5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w -DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz -Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 -nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT -RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT -wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 -t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa -TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 -o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU -3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA -iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f -WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM -S1IK ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust -# Subject: CN=OpenTrust Root CA G3 O=OpenTrust -# Label: "OpenTrust Root CA G3" -# Serial: 1492104908271485653071219941864171170455615 -# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 -# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 -# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 ------BEGIN CERTIFICATE----- -MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx -CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U -cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow -QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl -blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm -3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d -oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G -A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 -DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK -BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q -j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx -4nxp5V2a+EEfOzmTk51V6s2N8fvB ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Label: "LuxTrust Global Root 2" -# Serial: 59914338225734147123941058376788110305822489521 -# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c -# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f -# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 ------BEGIN CERTIFICATE----- -MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL -BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV -BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw -MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B -LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F -ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem -hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 -EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn -Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 -zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ -96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m -j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g -DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ -8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j -X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH -hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB -KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 -Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT -+Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL -BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 -BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO -jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 -loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c -qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ -2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ -JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre -zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf -LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ -x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 -oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- - -# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Label: "GDCA TrustAUTH R5 ROOT" -# Serial: 9009899650740120186 -# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 -# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 -# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-1" -# Serial: 15752444095811006489 -# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 -# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a -# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y -IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB -pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h -IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG -A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU -cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid -RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V -seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme -9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV -EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW -hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ -DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD -ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I -/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ -yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts -L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN -zl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-2" -# Serial: 2711694510199101698 -# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 -# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 -# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig -Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk -MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg -Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD -VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy -dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ -QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq -1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp -2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK -DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape -az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF -3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 -oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM -g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 -mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd -BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U -nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw -DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX -dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ -MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL -/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX -CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa -ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW -2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 -N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 -Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB -As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp -5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu -1uwJ ------END CERTIFICATE----- - -# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor ECA-1" -# Serial: 9548242946988625984 -# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c -# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd -# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y -IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig -RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb -3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA -BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 -3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou -owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ -wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF -ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf -BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv -civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 -AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 -soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI -WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi -tJ/X5g== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Label: "SSL.com Root Certification Authority RSA" -# Serial: 8875640296558310041 -# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 -# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb -# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com Root Certification Authority ECC" -# Serial: 8495723813297216424 -# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e -# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a -# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority RSA R2" -# Serial: 6248227494352943350 -# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 -# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a -# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority ECC" -# Serial: 3182246526754555285 -# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 -# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d -# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- -# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Secure Server CA" -# Serial: 927650371 -# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee -# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 -# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Label: "ValiCert Class 2 VA" -# Serial: 1 -# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 -# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 -# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- - -# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Express (Class C) Root" -# Serial: 104 -# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 -# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b -# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Business (Class B) Root" -# Serial: 105 -# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 -# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af -# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Label: "RSA Root Certificate 1" -# Serial: 1 -# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 -# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb -# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Label: "ValiCert Class 1 VA" -# Serial: 1 -# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb -# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e -# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure eBusiness CA 1" -# Serial: 4 -# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d -# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 -# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure Global eBusiness CA" -# Serial: 1 -# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc -# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 -# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Premium Server CA" -# Serial: 1 -# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a -# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a -# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Server CA" -# Serial: 1 -# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d -# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c -# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 149843929435818692848040365716851702463 -# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 -# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 -# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 80507572722862485515306429940691309246 -# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 -# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b -# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Label: "Verisign Class 3 Public Primary Certification Authority - G2" -# Serial: 167285380242319648451154478808036881606 -# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 -# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f -# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- - -# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Label: "GTE CyberTrust Global Root" -# Serial: 421 -# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db -# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 -# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -# Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Label: "Equifax Secure Certificate Authority" -# Serial: 903804111 -# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 -# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a -# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- From ea7eecccb19be6475e370d4566489cbaf491fa9b Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 30 Oct 2018 17:04:53 +0100 Subject: [PATCH 281/710] core: update chardet to 3.0.4 --- Contents/Libraries/Shared/chardet/LICENSE | 504 ------------ Contents/Libraries/Shared/chardet/README.rst | 46 -- Contents/Libraries/Shared/chardet/__init__.py | 31 +- Contents/Libraries/Shared/chardet/big5freq.py | 545 +------------ .../Libraries/Shared/chardet/big5prober.py | 15 +- .../Shared/chardet/chardistribution.py | 146 ++-- .../Shared/chardet/charsetgroupprober.py | 110 +-- .../Libraries/Shared/chardet/charsetprober.py | 119 ++- .../Libraries/Shared/chardet/cli/__init__.py | 1 + .../Shared/chardet/{ => cli}/chardetect.py | 21 +- .../Shared/chardet/codingstatemachine.py | 67 +- Contents/Libraries/Shared/chardet/compat.py | 16 +- .../Libraries/Shared/chardet/constants.py | 39 - .../Libraries/Shared/chardet/cp949prober.py | 19 +- Contents/Libraries/Shared/chardet/enums.py | 76 ++ .../Libraries/Shared/chardet/escprober.py | 97 ++- Contents/Libraries/Shared/chardet/escsm.py | 128 ++-- .../Libraries/Shared/chardet/eucjpprober.py | 82 +- .../Libraries/Shared/chardet/euckrfreq.py | 415 +--------- .../Libraries/Shared/chardet/euckrprober.py | 15 +- .../Libraries/Shared/chardet/euctwfreq.py | 719 +++++++++--------- .../Libraries/Shared/chardet/euctwprober.py | 19 +- .../Libraries/Shared/chardet/gb2312freq.py | 195 +---- .../Libraries/Shared/chardet/gb2312prober.py | 19 +- .../Libraries/Shared/chardet/hebrewprober.py | 157 ++-- Contents/Libraries/Shared/chardet/jisfreq.py | 250 +----- Contents/Libraries/Shared/chardet/jpcntx.py | 124 +-- .../Shared/chardet/langbulgarianmodel.py | 25 +- .../Shared/chardet/langcyrillicmodel.py | 82 +- .../Shared/chardet/langgreekmodel.py | 28 +- .../Shared/chardet/langhebrewmodel.py | 17 +- .../Shared/chardet/langhungarianmodel.py | 24 +- .../Libraries/Shared/chardet/langthaimodel.py | 13 +- .../Shared/chardet/langturkishmodel.py | 193 +++++ .../Libraries/Shared/chardet/latin1prober.py | 48 +- .../Shared/chardet/mbcharsetprober.py | 85 ++- .../Shared/chardet/mbcsgroupprober.py | 6 +- Contents/Libraries/Shared/chardet/mbcssm.py | 298 ++++---- .../Shared/chardet/sbcharsetprober.py | 150 ++-- .../Shared/chardet/sbcsgroupprober.py | 30 +- .../Libraries/Shared/chardet/sjisprober.py | 85 ++- .../Shared/chardet/universaldetector.py | 326 +++++--- .../Libraries/Shared/chardet/utf8prober.py | 58 +- Contents/Libraries/Shared/chardet/version.py | 9 + 44 files changed, 2032 insertions(+), 3420 deletions(-) delete mode 100644 Contents/Libraries/Shared/chardet/LICENSE delete mode 100644 Contents/Libraries/Shared/chardet/README.rst create mode 100644 Contents/Libraries/Shared/chardet/cli/__init__.py rename Contents/Libraries/Shared/chardet/{ => cli}/chardetect.py (83%) delete mode 100644 Contents/Libraries/Shared/chardet/constants.py create mode 100644 Contents/Libraries/Shared/chardet/enums.py create mode 100644 Contents/Libraries/Shared/chardet/langturkishmodel.py create mode 100644 Contents/Libraries/Shared/chardet/version.py diff --git a/Contents/Libraries/Shared/chardet/LICENSE b/Contents/Libraries/Shared/chardet/LICENSE deleted file mode 100644 index 8add30ad5..000000000 --- a/Contents/Libraries/Shared/chardet/LICENSE +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/Contents/Libraries/Shared/chardet/README.rst b/Contents/Libraries/Shared/chardet/README.rst deleted file mode 100644 index 7df8f56d5..000000000 --- a/Contents/Libraries/Shared/chardet/README.rst +++ /dev/null @@ -1,46 +0,0 @@ -Chardet: The Universal Character Encoding Detector --------------------------------------------------- - -Detects - - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants) - - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese) - - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese) - - EUC-KR, ISO-2022-KR (Korean) - - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic) - - ISO-8859-2, windows-1250 (Hungarian) - - ISO-8859-5, windows-1251 (Bulgarian) - - windows-1252 (English) - - ISO-8859-7, windows-1253 (Greek) - - ISO-8859-8, windows-1255 (Visual and Logical Hebrew) - - TIS-620 (Thai) - -Requires Python 2.6 or later - -Installation ------------- - -Install from `PyPI `_:: - - pip install chardet - - -Command-line Tool ------------------ - -chardet comes with a command-line script which reports on the encodings of one -or more files:: - - % chardetect somefile someotherfile - somefile: windows-1252 with confidence 0.5 - someotherfile: ascii with confidence 1.0 - -About ------ - -This is a continuation of Mark Pilgrim's excellent chardet. Previously, two -versions needed to be maintained: one that supported python 2.x and one that -supported python 3.x. We've recently merged with `Ian Cordasco `_'s -`charade `_ fork, so now we have one -coherent version that works for Python 2.6+. - -:maintainer: Dan Blanchard diff --git a/Contents/Libraries/Shared/chardet/__init__.py b/Contents/Libraries/Shared/chardet/__init__.py index 82c2a48d2..0f9f820ef 100644 --- a/Contents/Libraries/Shared/chardet/__init__.py +++ b/Contents/Libraries/Shared/chardet/__init__.py @@ -15,18 +15,25 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -__version__ = "2.3.0" -from sys import version_info +from .compat import PY2, PY3 +from .universaldetector import UniversalDetector +from .version import __version__, VERSION -def detect(aBuf): - if ((version_info < (3, 0) and isinstance(aBuf, unicode)) or - (version_info >= (3, 0) and not isinstance(aBuf, bytes))): - raise ValueError('Expected a bytes object, not a unicode object') - from . import universaldetector - u = universaldetector.UniversalDetector() - u.reset() - u.feed(aBuf) - u.close() - return u.result +def detect(byte_str): + """ + Detect the encoding of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError('Expected object of type bytes or bytearray, got: ' + '{0}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() diff --git a/Contents/Libraries/Shared/chardet/big5freq.py b/Contents/Libraries/Shared/chardet/big5freq.py index 65bffc04b..38f32517a 100644 --- a/Contents/Libraries/Shared/chardet/big5freq.py +++ b/Contents/Libraries/Shared/chardet/big5freq.py @@ -45,7 +45,7 @@ #Char to FreqOrder table BIG5_TABLE_SIZE = 5376 -Big5CharToFreqOrder = ( +BIG5_CHAR_TO_FREQ_ORDER = ( 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 @@ -381,545 +381,6 @@ 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 -2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 #last 512 -#Everything below is of no interest for detection purpose -2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392 -2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408 -5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424 -5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440 -5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456 -5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472 -5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488 -5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504 -5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520 -5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536 -5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552 -5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568 -5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584 -5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600 -6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616 -6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632 -6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648 -6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664 -6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680 -6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696 -6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712 -6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728 -6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744 -6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760 -6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776 -6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792 -6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808 -6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824 -6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840 -6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856 -6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872 -6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888 -6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904 -6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920 -6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936 -6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952 -6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968 -6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984 -6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000 -6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016 -6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032 -6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048 -6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064 -6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080 -6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096 -6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112 -6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128 -6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144 -6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160 -6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176 -6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192 -6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208 -6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224 -6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240 -6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256 -3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272 -6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288 -6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304 -3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320 -6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336 -6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352 -6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368 -6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384 -6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400 -6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416 -6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432 -4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448 -6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464 -6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480 -3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496 -6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512 -6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528 -6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544 -6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560 -6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576 -6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592 -6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608 -6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624 -6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640 -6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656 -6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672 -7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688 -7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704 -7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720 -7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736 -7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752 -7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768 -7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784 -7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800 -7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816 -7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832 -7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848 -7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864 -7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880 -7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896 -7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912 -7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928 -7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944 -7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960 -7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976 -7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992 -7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008 -7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024 -7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040 -7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056 -7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072 -7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088 -7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104 -7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120 -7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136 -7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152 -7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168 -7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184 -7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200 -7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216 -7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232 -7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248 -7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264 -7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280 -7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296 -7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312 -7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328 -7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344 -7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360 -7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376 -7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392 -7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408 -7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424 -7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440 -3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456 -7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472 -7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488 -7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504 -7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520 -4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536 -7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552 -7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568 -7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584 -7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600 -7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616 -7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632 -7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648 -7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664 -7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680 -7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696 -7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712 -8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728 -8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744 -8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760 -8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776 -8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792 -8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808 -8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824 -8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840 -8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856 -8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872 -8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888 -8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904 -8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920 -8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936 -8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952 -8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968 -8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984 -8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000 -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016 -8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032 -8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048 -8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064 -8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080 -8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096 -8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112 -8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128 -8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144 -8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160 -8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176 -8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192 -8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208 -8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224 -8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240 -8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256 -8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272 -8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288 -8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304 -8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320 -8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336 -8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352 -8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368 -8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384 -8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400 -8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416 -8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432 -8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448 -8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464 -8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480 -8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496 -8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512 -8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528 -8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544 -8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560 -8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576 -8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592 -8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608 -8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624 -8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640 -8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656 -8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672 -8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688 -4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704 -8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720 -8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736 -8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752 -8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768 -9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784 -9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800 -9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816 -9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832 -9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848 -9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864 -9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880 -9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896 -9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912 -9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928 -9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944 -9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960 -9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976 -9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992 -9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008 -9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024 -9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040 -9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056 -9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072 -9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088 -9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104 -9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120 -9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136 -9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152 -9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168 -9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184 -9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200 -9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216 -9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232 -9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248 -9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264 -9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280 -9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296 -9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312 -9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328 -9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344 -9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360 -9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376 -3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392 -9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408 -9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424 -9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440 -4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456 -9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472 -9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488 -9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504 -9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520 -9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536 -9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552 -9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568 -9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584 -9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600 -9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616 -9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632 -9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648 -9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664 -9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680 -9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696 -9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712 -9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728 -9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744 -9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760 -9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776 -9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792 -9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808 -9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824 -10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840 -10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856 -10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872 -10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888 -10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904 -10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920 -10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936 -10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952 -10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968 -4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984 -10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000 -10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016 -10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032 -10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048 -10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064 -10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080 -10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096 -10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112 -4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128 -10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144 -10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160 -10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176 -10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192 -10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208 -10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224 -10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240 -10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256 -10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272 -10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288 -10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304 -10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320 -10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336 -10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352 -10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368 -10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384 -10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400 -4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416 -10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432 -10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448 -10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464 -10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480 -10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496 -10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512 -10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528 -10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544 -10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560 -10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576 -10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592 -10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608 -10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624 -10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640 -10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656 -10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672 -10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688 -10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704 -10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720 -10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736 -10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752 -10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768 -10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784 -10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800 -10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816 -10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832 -10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848 -10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864 -10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880 -10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896 -11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912 -11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928 -11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944 -4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960 -11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976 -11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992 -11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008 -11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024 -11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040 -11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056 -11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072 -11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088 -11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104 -11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120 -11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136 -11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152 -11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168 -11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184 -11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200 -11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216 -11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232 -11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248 -11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264 -11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280 -11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296 -11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312 -11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328 -11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344 -11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360 -11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376 -11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392 -11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408 -11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424 -11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440 -11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456 -11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472 -4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488 -11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504 -11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520 -11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536 -11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552 -11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568 -11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584 -11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600 -11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616 -11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632 -11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648 -11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664 -11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680 -11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696 -11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712 -11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728 -11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744 -11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760 -11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776 -11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792 -11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808 -11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824 -11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840 -11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856 -11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872 -11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888 -11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904 -11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920 -11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936 -12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952 -12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968 -12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984 -12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000 -12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016 -12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032 -12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048 -12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064 -12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080 -12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096 -12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112 -12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128 -12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144 -12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160 -12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176 -4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192 -4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208 -4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224 -12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240 -12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256 -12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272 -12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288 -12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304 -12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320 -12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336 -12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352 -12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368 -12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384 -12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400 -12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416 -12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432 -12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448 -12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464 -12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480 -12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496 -12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512 -12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528 -12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544 -12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560 -12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576 -12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592 -12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608 -12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624 -12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640 -12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656 -12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672 -12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688 -12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704 -12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720 -12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736 -12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752 -12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768 -12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784 -12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800 -12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816 -12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832 -12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848 -12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864 -12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880 -12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896 -12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912 -12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928 -12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944 -12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960 -12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976 -4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992 -13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008 -13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024 -13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040 -13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056 -13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072 -13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088 -13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104 -4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120 -13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136 -13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152 -13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168 -13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184 -13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200 -13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216 -13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232 -13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248 -13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264 -13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280 -13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296 -13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312 -13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328 -13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344 -13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360 -5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376 -13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392 -13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408 -13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424 -13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440 -13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456 -13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472 -13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488 -13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504 -13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520 -13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536 -13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552 -13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568 -13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584 -13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600 -13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616 -13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632 -13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648 -13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664 -13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680 -13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696 -13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712 -13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728 -13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744 -13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760 -13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776 -13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792 -13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808 -13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824 -13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840 -13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856 -13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872 -13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888 -13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904 -13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920 -13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936 -13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952 -13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968 -13968,13969,13970,13971,13972) #13973 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/big5prober.py b/Contents/Libraries/Shared/chardet/big5prober.py index becce81e5..98f997012 100644 --- a/Contents/Libraries/Shared/chardet/big5prober.py +++ b/Contents/Libraries/Shared/chardet/big5prober.py @@ -28,15 +28,20 @@ from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import Big5DistributionAnalysis -from .mbcssm import Big5SMModel +from .mbcssm import BIG5_SM_MODEL class Big5Prober(MultiByteCharSetProber): def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(Big5SMModel) - self._mDistributionAnalyzer = Big5DistributionAnalysis() + super(Big5Prober, self).__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() self.reset() - def get_charset_name(self): + @property + def charset_name(self): return "Big5" + + @property + def language(self): + return "Chinese" diff --git a/Contents/Libraries/Shared/chardet/chardistribution.py b/Contents/Libraries/Shared/chardet/chardistribution.py index 4e64a00be..c0395f4a4 100644 --- a/Contents/Libraries/Shared/chardet/chardistribution.py +++ b/Contents/Libraries/Shared/chardet/chardistribution.py @@ -25,82 +25,84 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, +from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, EUCTW_TYPICAL_DISTRIBUTION_RATIO) -from .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, +from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, EUCKR_TYPICAL_DISTRIBUTION_RATIO) -from .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE, +from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, GB2312_TYPICAL_DISTRIBUTION_RATIO) -from .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE, +from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, BIG5_TYPICAL_DISTRIBUTION_RATIO) -from .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE, +from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, JIS_TYPICAL_DISTRIBUTION_RATIO) -from .compat import wrap_ord -ENOUGH_DATA_THRESHOLD = 1024 -SURE_YES = 0.99 -SURE_NO = 0.01 -MINIMUM_DATA_THRESHOLD = 3 +class CharDistributionAnalysis(object): + ENOUGH_DATA_THRESHOLD = 1024 + SURE_YES = 0.99 + SURE_NO = 0.01 + MINIMUM_DATA_THRESHOLD = 3 -class CharDistributionAnalysis: def __init__(self): # Mapping table to get frequency order from char order (get from # GetOrder()) - self._mCharToFreqOrder = None - self._mTableSize = None # Size of above table + self._char_to_freq_order = None + self._table_size = None # Size of above table # This is a constant value which varies from language to language, # used in calculating confidence. See # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html # for further detail. - self._mTypicalDistributionRatio = None + self.typical_distribution_ratio = None + self._done = None + self._total_chars = None + self._freq_chars = None self.reset() def reset(self): """reset analyser, clear any state""" # If this flag is set to True, detection is done and conclusion has # been made - self._mDone = False - self._mTotalChars = 0 # Total characters encountered + self._done = False + self._total_chars = 0 # Total characters encountered # The number of characters whose frequency order is less than 512 - self._mFreqChars = 0 + self._freq_chars = 0 - def feed(self, aBuf, aCharLen): + def feed(self, char, char_len): """feed a character with known length""" - if aCharLen == 2: + if char_len == 2: # we only care about 2-bytes character in our distribution analysis - order = self.get_order(aBuf) + order = self.get_order(char) else: order = -1 if order >= 0: - self._mTotalChars += 1 + self._total_chars += 1 # order is valid - if order < self._mTableSize: - if 512 > self._mCharToFreqOrder[order]: - self._mFreqChars += 1 + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 def get_confidence(self): """return confidence based on existing data""" # if we didn't receive any character in our consideration range, # return negative answer - if self._mTotalChars <= 0 or self._mFreqChars <= MINIMUM_DATA_THRESHOLD: - return SURE_NO + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO - if self._mTotalChars != self._mFreqChars: - r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars) - * self._mTypicalDistributionRatio)) - if r < SURE_YES: + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: return r # normalize confidence (we don't want to be 100% sure) - return SURE_YES + return self.SURE_YES def got_enough_data(self): # It is not necessary to receive all data to draw conclusion. # For charset detection, certain amount of data is enough - return self._mTotalChars > ENOUGH_DATA_THRESHOLD + return self._total_chars > self.ENOUGH_DATA_THRESHOLD - def get_order(self, aBuf): + def get_order(self, byte_str): # We do not handle characters based on the original encoding string, # but convert this encoding string to a number, here called order. # This allows multiple encodings of a language to share one frequency @@ -110,55 +112,55 @@ def get_order(self, aBuf): class EUCTWDistributionAnalysis(CharDistributionAnalysis): def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = EUCTWCharToFreqOrder - self._mTableSize = EUCTW_TABLE_SIZE - self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, aBuf): + def get_order(self, byte_str): # for euc-TW encoding, we are interested # first byte range: 0xc4 -- 0xfe # second byte range: 0xa1 -- 0xfe # no validation needed here. State machine has done that - first_char = wrap_ord(aBuf[0]) + first_char = byte_str[0] if first_char >= 0xC4: - return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1 + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 else: return -1 class EUCKRDistributionAnalysis(CharDistributionAnalysis): def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = EUCKRCharToFreqOrder - self._mTableSize = EUCKR_TABLE_SIZE - self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, aBuf): + def get_order(self, byte_str): # for euc-KR encoding, we are interested # first byte range: 0xb0 -- 0xfe # second byte range: 0xa1 -- 0xfe # no validation needed here. State machine has done that - first_char = wrap_ord(aBuf[0]) + first_char = byte_str[0] if first_char >= 0xB0: - return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1 + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 else: return -1 class GB2312DistributionAnalysis(CharDistributionAnalysis): def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = GB2312CharToFreqOrder - self._mTableSize = GB2312_TABLE_SIZE - self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, aBuf): + def get_order(self, byte_str): # for GB2312 encoding, we are interested # first byte range: 0xb0 -- 0xfe # second byte range: 0xa1 -- 0xfe # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + first_char, second_char = byte_str[0], byte_str[1] if (first_char >= 0xB0) and (second_char >= 0xA1): return 94 * (first_char - 0xB0) + second_char - 0xA1 else: @@ -167,17 +169,17 @@ def get_order(self, aBuf): class Big5DistributionAnalysis(CharDistributionAnalysis): def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = Big5CharToFreqOrder - self._mTableSize = BIG5_TABLE_SIZE - self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, aBuf): + def get_order(self, byte_str): # for big5 encoding, we are interested # first byte range: 0xa4 -- 0xfe # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + first_char, second_char = byte_str[0], byte_str[1] if first_char >= 0xA4: if second_char >= 0xA1: return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 @@ -189,17 +191,17 @@ def get_order(self, aBuf): class SJISDistributionAnalysis(CharDistributionAnalysis): def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = JISCharToFreqOrder - self._mTableSize = JIS_TABLE_SIZE - self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, aBuf): + def get_order(self, byte_str): # for sjis encoding, we are interested # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + first_char, second_char = byte_str[0], byte_str[1] if (first_char >= 0x81) and (first_char <= 0x9F): order = 188 * (first_char - 0x81) elif (first_char >= 0xE0) and (first_char <= 0xEF): @@ -214,18 +216,18 @@ def get_order(self, aBuf): class EUCJPDistributionAnalysis(CharDistributionAnalysis): def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = JISCharToFreqOrder - self._mTableSize = JIS_TABLE_SIZE - self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, aBuf): + def get_order(self, byte_str): # for euc-JP encoding, we are interested # first byte range: 0xa0 -- 0xfe # second byte range: 0xa1 -- 0xfe # no validation needed here. State machine has done that - char = wrap_ord(aBuf[0]) + char = byte_str[0] if char >= 0xA0: - return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1 + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 else: return -1 diff --git a/Contents/Libraries/Shared/chardet/charsetgroupprober.py b/Contents/Libraries/Shared/chardet/charsetgroupprober.py index 85e7a1c67..8b3738efd 100644 --- a/Contents/Libraries/Shared/chardet/charsetgroupprober.py +++ b/Contents/Libraries/Shared/chardet/charsetgroupprober.py @@ -1,11 +1,11 @@ ######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Communicator client code. -# +# # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. -# +# # Contributor(s): # Mark Pilgrim - port to Python # @@ -13,94 +13,94 @@ # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. -# +# # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. -# +# # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from . import constants -import sys +from .enums import ProbingState from .charsetprober import CharSetProber class CharSetGroupProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mActiveNum = 0 - self._mProbers = [] - self._mBestGuessProber = None + def __init__(self, lang_filter=None): + super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) + self._active_num = 0 + self.probers = [] + self._best_guess_prober = None def reset(self): - CharSetProber.reset(self) - self._mActiveNum = 0 - for prober in self._mProbers: + super(CharSetGroupProber, self).reset() + self._active_num = 0 + for prober in self.probers: if prober: prober.reset() prober.active = True - self._mActiveNum += 1 - self._mBestGuessProber = None + self._active_num += 1 + self._best_guess_prober = None + + @property + def charset_name(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.charset_name - def get_charset_name(self): - if not self._mBestGuessProber: + @property + def language(self): + if not self._best_guess_prober: self.get_confidence() - if not self._mBestGuessProber: + if not self._best_guess_prober: return None -# self._mBestGuessProber = self._mProbers[0] - return self._mBestGuessProber.get_charset_name() + return self._best_guess_prober.language - def feed(self, aBuf): - for prober in self._mProbers: + def feed(self, byte_str): + for prober in self.probers: if not prober: continue if not prober.active: continue - st = prober.feed(aBuf) - if not st: + state = prober.feed(byte_str) + if not state: continue - if st == constants.eFoundIt: - self._mBestGuessProber = prober - return self.get_state() - elif st == constants.eNotMe: + if state == ProbingState.FOUND_IT: + self._best_guess_prober = prober + return self.state + elif state == ProbingState.NOT_ME: prober.active = False - self._mActiveNum -= 1 - if self._mActiveNum <= 0: - self._mState = constants.eNotMe - return self.get_state() - return self.get_state() + self._active_num -= 1 + if self._active_num <= 0: + self._state = ProbingState.NOT_ME + return self.state + return self.state def get_confidence(self): - st = self.get_state() - if st == constants.eFoundIt: + state = self.state + if state == ProbingState.FOUND_IT: return 0.99 - elif st == constants.eNotMe: + elif state == ProbingState.NOT_ME: return 0.01 - bestConf = 0.0 - self._mBestGuessProber = None - for prober in self._mProbers: + best_conf = 0.0 + self._best_guess_prober = None + for prober in self.probers: if not prober: continue if not prober.active: - if constants._debug: - sys.stderr.write(prober.get_charset_name() - + ' not active\n') + self.logger.debug('%s not active', prober.charset_name) continue - cf = prober.get_confidence() - if constants._debug: - sys.stderr.write('%s confidence = %s\n' % - (prober.get_charset_name(), cf)) - if bestConf < cf: - bestConf = cf - self._mBestGuessProber = prober - if not self._mBestGuessProber: + conf = prober.get_confidence() + self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) + if best_conf < conf: + best_conf = conf + self._best_guess_prober = prober + if not self._best_guess_prober: return 0.0 - return bestConf -# else: -# self._mBestGuessProber = self._mProbers[0] -# return self._mBestGuessProber.get_confidence() + return best_conf diff --git a/Contents/Libraries/Shared/chardet/charsetprober.py b/Contents/Libraries/Shared/chardet/charsetprober.py index 97581712c..eac4e5986 100644 --- a/Contents/Libraries/Shared/chardet/charsetprober.py +++ b/Contents/Libraries/Shared/chardet/charsetprober.py @@ -26,37 +26,120 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from . import constants +import logging import re +from .enums import ProbingState -class CharSetProber: - def __init__(self): - pass + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) def reset(self): - self._mState = constants.eDetecting + self._state = ProbingState.DETECTING - def get_charset_name(self): + @property + def charset_name(self): return None - def feed(self, aBuf): + def feed(self, buf): pass - def get_state(self): - return self._mState + @property + def state(self): + return self._state def get_confidence(self): return 0.0 - def filter_high_bit_only(self, aBuf): - aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf) - return aBuf + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 - def filter_without_english_letters(self, aBuf): - aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf) - return aBuf + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) - def filter_with_english_letters(self, aBuf): - # TODO - return aBuf + return filtered diff --git a/Contents/Libraries/Shared/chardet/cli/__init__.py b/Contents/Libraries/Shared/chardet/cli/__init__.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Contents/Libraries/Shared/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/Contents/Libraries/Shared/chardet/chardetect.py b/Contents/Libraries/Shared/chardet/cli/chardetect.py similarity index 83% rename from Contents/Libraries/Shared/chardet/chardetect.py rename to Contents/Libraries/Shared/chardet/cli/chardetect.py index ffe892f25..f0a4cc5d7 100644 --- a/Contents/Libraries/Shared/chardet/chardetect.py +++ b/Contents/Libraries/Shared/chardet/cli/chardetect.py @@ -17,9 +17,9 @@ import argparse import sys -from io import open from chardet import __version__ +from chardet.compat import PY2 from chardet.universaldetector import UniversalDetector @@ -35,9 +35,15 @@ def description_of(lines, name='stdin'): """ u = UniversalDetector() for line in lines: + line = bytearray(line) u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break u.close() result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') if result['encoding']: return '{0}: {1} with confidence {2}'.format(name, result['encoding'], result['confidence']) @@ -46,23 +52,22 @@ def description_of(lines, name='stdin'): def main(argv=None): - ''' + """ Handles command line arguments and gets things started. :param argv: List of arguments, as if specified on the command-line. If None, ``sys.argv[1:]`` is used instead. :type argv: list of str - ''' + """ # Get command line arguments parser = argparse.ArgumentParser( description="Takes one or more file paths and reports their detected \ - encodings", - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - conflict_handler='resolve') + encodings") parser.add_argument('input', - help='File whose encoding we would like to determine.', + help='File whose encoding we would like to determine. \ + (default: stdin)', type=argparse.FileType('rb'), nargs='*', - default=[sys.stdin]) + default=[sys.stdin if PY2 else sys.stdin.buffer]) parser.add_argument('--version', action='version', version='%(prog)s {0}'.format(__version__)) args = parser.parse_args(argv) diff --git a/Contents/Libraries/Shared/chardet/codingstatemachine.py b/Contents/Libraries/Shared/chardet/codingstatemachine.py index 8dd8c9179..68fba44f1 100644 --- a/Contents/Libraries/Shared/chardet/codingstatemachine.py +++ b/Contents/Libraries/Shared/chardet/codingstatemachine.py @@ -25,37 +25,64 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .constants import eStart -from .compat import wrap_ord +import logging +from .enums import MachineState -class CodingStateMachine: + +class CodingStateMachine(object): + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ def __init__(self, sm): - self._mModel = sm - self._mCurrentBytePos = 0 - self._mCurrentCharLen = 0 + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = None + self.logger = logging.getLogger(__name__) self.reset() def reset(self): - self._mCurrentState = eStart + self._curr_state = MachineState.START def next_state(self, c): # for each byte we get its class # if it is first byte, we also get byte length - # PY3K: aBuf is a byte stream, so c is an int, not a byte - byteCls = self._mModel['classTable'][wrap_ord(c)] - if self._mCurrentState == eStart: - self._mCurrentBytePos = 0 - self._mCurrentCharLen = self._mModel['charLenTable'][byteCls] - # from byte's class and stateTable, we get its next state - curr_state = (self._mCurrentState * self._mModel['classFactor'] - + byteCls) - self._mCurrentState = self._mModel['stateTable'][curr_state] - self._mCurrentBytePos += 1 - return self._mCurrentState + byte_class = self._model['class_table'][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model['char_len_table'][byte_class] + # from byte's class and state_table, we get its next state + curr_state = (self._curr_state * self._model['class_factor'] + + byte_class) + self._curr_state = self._model['state_table'][curr_state] + self._curr_byte_pos += 1 + return self._curr_state def get_current_charlen(self): - return self._mCurrentCharLen + return self._curr_char_len def get_coding_state_machine(self): - return self._mModel['name'] + return self._model['name'] + + @property + def language(self): + return self._model['language'] diff --git a/Contents/Libraries/Shared/chardet/compat.py b/Contents/Libraries/Shared/chardet/compat.py index d9e30addf..ddd74687c 100644 --- a/Contents/Libraries/Shared/chardet/compat.py +++ b/Contents/Libraries/Shared/chardet/compat.py @@ -1,6 +1,7 @@ ######################## BEGIN LICENSE BLOCK ######################## # Contributor(s): -# Ian Cordasco - port to Python +# Dan Blanchard +# Ian Cordasco # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -22,13 +23,12 @@ if sys.version_info < (3, 0): + PY2 = True + PY3 = False base_str = (str, unicode) + text_type = unicode else: + PY2 = False + PY3 = True base_str = (bytes, str) - - -def wrap_ord(a): - if sys.version_info < (3, 0) and isinstance(a, base_str): - return ord(a) - else: - return a + text_type = str diff --git a/Contents/Libraries/Shared/chardet/constants.py b/Contents/Libraries/Shared/chardet/constants.py deleted file mode 100644 index e4d148b3c..000000000 --- a/Contents/Libraries/Shared/chardet/constants.py +++ /dev/null @@ -1,39 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -_debug = 0 - -eDetecting = 0 -eFoundIt = 1 -eNotMe = 2 - -eStart = 0 -eError = 1 -eItsMe = 2 - -SHORTCUT_THRESHOLD = 0.95 diff --git a/Contents/Libraries/Shared/chardet/cp949prober.py b/Contents/Libraries/Shared/chardet/cp949prober.py index ff4272f82..efd793abc 100644 --- a/Contents/Libraries/Shared/chardet/cp949prober.py +++ b/Contents/Libraries/Shared/chardet/cp949prober.py @@ -25,20 +25,25 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import CP949SMModel +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL class CP949Prober(MultiByteCharSetProber): def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(CP949SMModel) + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) # NOTE: CP949 is a superset of EUC-KR, so the distribution should be # not different. - self._mDistributionAnalyzer = EUCKRDistributionAnalysis() + self.distribution_analyzer = EUCKRDistributionAnalysis() self.reset() - def get_charset_name(self): + @property + def charset_name(self): return "CP949" + + @property + def language(self): + return "Korean" diff --git a/Contents/Libraries/Shared/chardet/enums.py b/Contents/Libraries/Shared/chardet/enums.py new file mode 100644 index 000000000..045120722 --- /dev/null +++ b/Contents/Libraries/Shared/chardet/enums.py @@ -0,0 +1,76 @@ +""" +All of the Enums that are used throughout the chardet package. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + + +class InputState(object): + """ + This enum represents the different states a universal detector can be in. + """ + PURE_ASCII = 0 + ESC_ASCII = 1 + HIGH_BYTE = 2 + + +class LanguageFilter(object): + """ + This enum represents the different language filters we can apply to a + ``UniversalDetector``. + """ + CHINESE_SIMPLIFIED = 0x01 + CHINESE_TRADITIONAL = 0x02 + JAPANESE = 0x04 + KOREAN = 0x08 + NON_CJK = 0x10 + ALL = 0x1F + CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL + CJK = CHINESE | JAPANESE | KOREAN + + +class ProbingState(object): + """ + This enum represents the different states a prober can be in. + """ + DETECTING = 0 + FOUND_IT = 1 + NOT_ME = 2 + + +class MachineState(object): + """ + This enum represents the different states a state machine can be in. + """ + START = 0 + ERROR = 1 + ITS_ME = 2 + + +class SequenceLikelihood(object): + """ + This enum represents the likelihood of a character following the previous one. + """ + NEGATIVE = 0 + UNLIKELY = 1 + LIKELY = 2 + POSITIVE = 3 + + @classmethod + def get_num_categories(cls): + """:returns: The number of likelihood categories in the enum.""" + return 4 + + +class CharacterCategory(object): + """ + This enum represents the different categories language models for + ``SingleByteCharsetProber`` put characters into. + + Anything less than CONTROL is considered a letter. + """ + UNDEFINED = 255 + LINE_BREAK = 254 + SYMBOL = 253 + DIGIT = 252 + CONTROL = 251 diff --git a/Contents/Libraries/Shared/chardet/escprober.py b/Contents/Libraries/Shared/chardet/escprober.py index 80a844ff3..c70493f2b 100644 --- a/Contents/Libraries/Shared/chardet/escprober.py +++ b/Contents/Libraries/Shared/chardet/escprober.py @@ -25,62 +25,77 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from . import constants -from .escsm import (HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel, - ISO2022KRSMModel) from .charsetprober import CharSetProber from .codingstatemachine import CodingStateMachine -from .compat import wrap_ord +from .enums import LanguageFilter, ProbingState, MachineState +from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL) class EscCharSetProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mCodingSM = [ - CodingStateMachine(HZSMModel), - CodingStateMachine(ISO2022CNSMModel), - CodingStateMachine(ISO2022JPSMModel), - CodingStateMachine(ISO2022KRSMModel) - ] + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter=None): + super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = None + self._detected_charset = None + self._detected_language = None + self._state = None self.reset() def reset(self): - CharSetProber.reset(self) - for codingSM in self._mCodingSM: - if not codingSM: + super(EscCharSetProber, self).reset() + for coding_sm in self.coding_sm: + if not coding_sm: continue - codingSM.active = True - codingSM.reset() - self._mActiveSM = len(self._mCodingSM) - self._mDetectedCharset = None + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self): + return self._detected_charset - def get_charset_name(self): - return self._mDetectedCharset + @property + def language(self): + return self._detected_language def get_confidence(self): - if self._mDetectedCharset: + if self._detected_charset: return 0.99 else: return 0.00 - def feed(self, aBuf): - for c in aBuf: - # PY3K: aBuf is a byte array, so c is an int, not a byte - for codingSM in self._mCodingSM: - if not codingSM: - continue - if not codingSM.active: + def feed(self, byte_str): + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm or not coding_sm.active: continue - codingState = codingSM.next_state(wrap_ord(c)) - if codingState == constants.eError: - codingSM.active = False - self._mActiveSM -= 1 - if self._mActiveSM <= 0: - self._mState = constants.eNotMe - return self.get_state() - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - self._mDetectedCharset = codingSM.get_coding_state_machine() # nopep8 - return self.get_state() + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state - return self.get_state() + return self.state diff --git a/Contents/Libraries/Shared/chardet/escsm.py b/Contents/Libraries/Shared/chardet/escsm.py index bd302b4c6..0069523a0 100644 --- a/Contents/Libraries/Shared/chardet/escsm.py +++ b/Contents/Libraries/Shared/chardet/escsm.py @@ -25,9 +25,9 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .constants import eStart, eError, eItsMe +from .enums import MachineState -HZ_cls = ( +HZ_CLS = ( 1,0,0,0,0,0,0,0, # 00 - 07 0,0,0,0,0,0,0,0, # 08 - 0f 0,0,0,0,0,0,0,0, # 10 - 17 @@ -62,24 +62,25 @@ 1,1,1,1,1,1,1,1, # f8 - ff ) -HZ_st = ( -eStart,eError, 3,eStart,eStart,eStart,eError,eError,# 00-07 -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f -eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError,# 10-17 - 5,eError, 6,eError, 5, 5, 4,eError,# 18-1f - 4,eError, 4, 4, 4,eError, 4,eError,# 20-27 - 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f ) -HZCharLenTable = (0, 0, 0, 0, 0, 0) +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) -HZSMModel = {'classTable': HZ_cls, - 'classFactor': 6, - 'stateTable': HZ_st, - 'charLenTable': HZCharLenTable, - 'name': "HZ-GB-2312"} +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} -ISO2022CN_cls = ( +ISO2022CN_CLS = ( 2,0,0,0,0,0,0,0, # 00 - 07 0,0,0,0,0,0,0,0, # 08 - 0f 0,0,0,0,0,0,0,0, # 10 - 17 @@ -114,26 +115,27 @@ 2,2,2,2,2,2,2,2, # f8 - ff ) -ISO2022CN_st = ( -eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 -eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f -eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 -eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError,# 18-1f -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 - 5, 6,eError,eError,eError,eError,eError,eError,# 28-2f -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 -eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f ) -ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0) +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) -ISO2022CNSMModel = {'classTable': ISO2022CN_cls, - 'classFactor': 9, - 'stateTable': ISO2022CN_st, - 'charLenTable': ISO2022CNCharLenTable, - 'name': "ISO-2022-CN"} +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} -ISO2022JP_cls = ( +ISO2022JP_CLS = ( 2,0,0,0,0,0,0,0, # 00 - 07 0,0,0,0,0,0,2,2, # 08 - 0f 0,0,0,0,0,0,0,0, # 10 - 17 @@ -168,27 +170,28 @@ 2,2,2,2,2,2,2,2, # f8 - ff ) -ISO2022JP_st = ( -eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 -eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 -eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f -eError, 5,eError,eError,eError, 4,eError,eError,# 20-27 -eError,eError,eError, 6,eItsMe,eError,eItsMe,eError,# 28-2f -eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f -eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 ) -ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) -ISO2022JPSMModel = {'classTable': ISO2022JP_cls, - 'classFactor': 10, - 'stateTable': ISO2022JP_st, - 'charLenTable': ISO2022JPCharLenTable, - 'name': "ISO-2022-JP"} +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} -ISO2022KR_cls = ( +ISO2022KR_CLS = ( 2,0,0,0,0,0,0,0, # 00 - 07 0,0,0,0,0,0,0,0, # 08 - 0f 0,0,0,0,0,0,0,0, # 10 - 17 @@ -223,20 +226,21 @@ 2,2,2,2,2,2,2,2, # f8 - ff ) -ISO2022KR_st = ( -eStart, 3,eError,eStart,eStart,eStart,eError,eError,# 00-07 -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f -eItsMe,eItsMe,eError,eError,eError, 4,eError,eError,# 10-17 -eError,eError,eError,eError, 5,eError,eError,eError,# 18-1f -eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 ) -ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0) +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} -ISO2022KRSMModel = {'classTable': ISO2022KR_cls, - 'classFactor': 6, - 'stateTable': ISO2022KR_st, - 'charLenTable': ISO2022KRCharLenTable, - 'name': "ISO-2022-KR"} -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/eucjpprober.py b/Contents/Libraries/Shared/chardet/eucjpprober.py index 8e64fdcc2..20ce8f7d1 100644 --- a/Contents/Libraries/Shared/chardet/eucjpprober.py +++ b/Contents/Libraries/Shared/chardet/eucjpprober.py @@ -25,66 +25,68 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -import sys -from . import constants +from .enums import ProbingState, MachineState from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import EUCJPDistributionAnalysis from .jpcntx import EUCJPContextAnalysis -from .mbcssm import EUCJPSMModel +from .mbcssm import EUCJP_SM_MODEL class EUCJPProber(MultiByteCharSetProber): def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCJPSMModel) - self._mDistributionAnalyzer = EUCJPDistributionAnalysis() - self._mContextAnalyzer = EUCJPContextAnalysis() + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() self.reset() def reset(self): - MultiByteCharSetProber.reset(self) - self._mContextAnalyzer.reset() + super(EUCJPProber, self).reset() + self.context_analyzer.reset() - def get_charset_name(self): + @property + def charset_name(self): return "EUC-JP" - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() if i == 0: - self._mLastChar[1] = aBuf[0] - self._mContextAnalyzer.feed(self._mLastChar, charLen) - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) else: - self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen) - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) - self._mLastChar[0] = aBuf[aLen - 1] + self._last_char[0] = byte_str[-1] - if self.get_state() == constants.eDetecting: - if (self._mContextAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT - return self.get_state() + return self.state def get_confidence(self): - contxtCf = self._mContextAnalyzer.get_confidence() - distribCf = self._mDistributionAnalyzer.get_confidence() - return max(contxtCf, distribCf) + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/Contents/Libraries/Shared/chardet/euckrfreq.py b/Contents/Libraries/Shared/chardet/euckrfreq.py index a179e4c21..b68078cb9 100644 --- a/Contents/Libraries/Shared/chardet/euckrfreq.py +++ b/Contents/Libraries/Shared/chardet/euckrfreq.py @@ -13,12 +13,12 @@ # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. -# +# # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. -# +# # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA @@ -35,15 +35,15 @@ # # Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 # Random Distribution Ration = 512 / (2350-512) = 0.279. -# -# Typical Distribution Ratio +# +# Typical Distribution Ratio EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 EUCKR_TABLE_SIZE = 2352 -# Char to FreqOrder table , -EUCKRCharToFreqOrder = ( \ +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, 1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, 1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, @@ -191,406 +191,5 @@ 1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, 2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 -#Everything below is of no interest for detection purpose -2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, -2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, -2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, -2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, -2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, -2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, -2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, -2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, -2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, -2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, -2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, -2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, -2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, -2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, -1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, -2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, -2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, -2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, -2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, -2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, -2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, -2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, -2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, -2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, -3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, -3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, -3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, -3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, -3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, -3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, -3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, -3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, -3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, -3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, -3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, -3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, -3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, -3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, -3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, -3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, -3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, -3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, -3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, -3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, -3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, -3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, -3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, -3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, -3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, -3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, -3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, -3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, -3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, -3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, -3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, -3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, -1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, -1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, -3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, -3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, -3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, -3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, -3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, -3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, -3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, -3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, -3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, -3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, -3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, -3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, -3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, -1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, -3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, -3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, -3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, -3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, -3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, -3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, -3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, -1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, -3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, -3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, -3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, -3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, -1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, -3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, -3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, -3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, -3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, -3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, -3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, -3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, -4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, -4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, -1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, -4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, -4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, -4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, -4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, -4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, -4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, -4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, -4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, -4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, -4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, -4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, -4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, -4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, -4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, -4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, -4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, -4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, -4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, -4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, -4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, -4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, -4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, -4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, -4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, -4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, -4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, -4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, -4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, -4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, -4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, -4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, -4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, -4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, -4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, -4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, -4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, -4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, -4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, -4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, -4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, -4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, -4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, -1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, -4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, -4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, -4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, -4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, -4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, -4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, -4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, -4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, -4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, -4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, -4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, -4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, -4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, -4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, -4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, -4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, -4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, -4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, -4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, -4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, -5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, -5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, -1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, -5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, -5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, -5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, -5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, -5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, -1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, -5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, -5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, -5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, -5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, -5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, -1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, -5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, -5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, -5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, -5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, -5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, -5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, -5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, -5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, -5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, -5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, -5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, -5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, -5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, -5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, -5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, -5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, -5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, -5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, -5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, -5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, -5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, -5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, -5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, -1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, -5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, -5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, -5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, -5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, -1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, -5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, -5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, -5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, -5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, -5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, -1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, -5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, -1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, -5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, -5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, -5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, -5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, -5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, -5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, -5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, -5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, -5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, -5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, -5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, -5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, -5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, -5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, -6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, -6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, -6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, -6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, -6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, -6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, -6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, -6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, -6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, -6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, -6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, -6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, -6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, -6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, -6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, -6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, -6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, #1024 -6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, -6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, -6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, -6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, -6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, -6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, -6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, -6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, -6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, -6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, -6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, -6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, -6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, -6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, -6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, -6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, -6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, -6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, -1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, -6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, -6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, -6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, -6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, -6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, -1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, -6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, -1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, -6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, -6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, -6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, -1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, -6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, -6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, -6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, -6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, -6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, -6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, -6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, -6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, -6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, -6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, -6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, -6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, -6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, -6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, -6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, -6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, -6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, -7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, -7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, -7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, -7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, -7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, -7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, -7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, -7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, -7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, -7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, -7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, -7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, -7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, -7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, -7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, -7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, -7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, -7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, -7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, -7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, -7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, -7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, -7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, -7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, -7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, -7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, -7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, -7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, -7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, -7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, -7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, -7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, -7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, -7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, -7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, -7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, -7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, -7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, -7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, -7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, -7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, -7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, -7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, -7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, -7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, -7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, -7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, -7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, -7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, -7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, -7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, -7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, -7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, -7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, -7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, -7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, -7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, -7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, -7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, -7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, -7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, -7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, -8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, -8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, -8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, -8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, -8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, -8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, -8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, -8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, -8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, -8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, -8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, -8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, -8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, -8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, -8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, -8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, -8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, -8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, -8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, -8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, -8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, -8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, -8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, -8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, -8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, -8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, -8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, -8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, -8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, -8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, -8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, -8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, -8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, -8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, -8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, -8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, -8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, -8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, -8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, -8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, -8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, -8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, -8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, -8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, -8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, -8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, -8736,8737,8738,8739,8740,8741) +) -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/euckrprober.py b/Contents/Libraries/Shared/chardet/euckrprober.py index 5982a46b6..345a060d0 100644 --- a/Contents/Libraries/Shared/chardet/euckrprober.py +++ b/Contents/Libraries/Shared/chardet/euckrprober.py @@ -28,15 +28,20 @@ from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import EUCKRSMModel +from .mbcssm import EUCKR_SM_MODEL class EUCKRProber(MultiByteCharSetProber): def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCKRSMModel) - self._mDistributionAnalyzer = EUCKRDistributionAnalysis() + super(EUCKRProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) + self.distribution_analyzer = EUCKRDistributionAnalysis() self.reset() - def get_charset_name(self): + @property + def charset_name(self): return "EUC-KR" + + @property + def language(self): + return "Korean" diff --git a/Contents/Libraries/Shared/chardet/euctwfreq.py b/Contents/Libraries/Shared/chardet/euctwfreq.py index 576e7504d..ed7a995a3 100644 --- a/Contents/Libraries/Shared/chardet/euctwfreq.py +++ b/Contents/Libraries/Shared/chardet/euctwfreq.py @@ -44,385 +44,344 @@ EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 # Char to FreqOrder table , -EUCTW_TABLE_SIZE = 8102 +EUCTW_TABLE_SIZE = 5376 -EUCTWCharToFreqOrder = ( - 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 -3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 -1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 - 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 -3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 -4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 -7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 - 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 - 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 - 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 -2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 -1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 -3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 - 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 -3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 -2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 - 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 -3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 -1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 -7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 - 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 -7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 -1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 - 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 - 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 -3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 -3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 - 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 -2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 -2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 - 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 - 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 -3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 -1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 -1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 -1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 -2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 - 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 -4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 -1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 -7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 -2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 - 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 - 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 - 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 - 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 -7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 - 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 -1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 - 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 - 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 -7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 -1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 - 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 -3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 -4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 -3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 - 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 - 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 -1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 -4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 -3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 -3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 -2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 -7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 -3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 -7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 -1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 -2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 -1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 - 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 -1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 -4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 -3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 - 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 - 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 - 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 -2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 -7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 -1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 -2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 -1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 -1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 -7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 -7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 -7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 -3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 -4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 -1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 -7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 -2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 -7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 -3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 -3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 -7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 -2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 -7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 - 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 -4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 -2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 -7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 -3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 -2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 -2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 - 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 -2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 -1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 -1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 -2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 -1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 -7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 -7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 -2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 -4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 -1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 -7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 - 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 -4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 - 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 -2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 - 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 -1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 -1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 - 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 -3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 -3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 -1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 -3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 -7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 -7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 -1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 -2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 -1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 -3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 -2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 -3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 -2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 -4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 -4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 -3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 - 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 -3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 - 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 -3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 -3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 -3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 -1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 -7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 - 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 -7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 -1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 - 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 -4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 -3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 - 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 -2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 -2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 -3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 -1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 -4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 -2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 -1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 -1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 -2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 -3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 -1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 -7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 -1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 -4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 -1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 - 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 -1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 -3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 -3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 -2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 -1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 -4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 - 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 -7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 -2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 -3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 -4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 - 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 -7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 -7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 -1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 -4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 -3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 -2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 -3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 -3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 -2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 -1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 -4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 -3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 -3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 -2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 -4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 -7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 -3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 -2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 -3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 -1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 -2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 -3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 -4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 -2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 -2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 -7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 -1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 -2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 -1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 -3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 -4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 -2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 -3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 -3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 -2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 -4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 -2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 -3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 -4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 -7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 -3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 - 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 -1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 -4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 -1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 -4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 -7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 - 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 -7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 -2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 -1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 -1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 -3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 - 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 - 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 - 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 -3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 -2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 - 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 -7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 -1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 -3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 -7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 -1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 -7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 -4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 -1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 -2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 -2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 -4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 - 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 - 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 -3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 -3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 -1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 -2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 -7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 -1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 -1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 -3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 - 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 -1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 -4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 -7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 -2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 -3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 - 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 -1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 -2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 -2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 -7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 -7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 -7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 -2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 -2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 -1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 -4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 -3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 -3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 -4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 -4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 -2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 -2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 -7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 -4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 -7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 -2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 -1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 -3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 -4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 -2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 - 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 -2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 -1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 -2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 -2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 -4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 -7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 -1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 -3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 -7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 -1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 -8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 -2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 -8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 -2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 -2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 -8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 -8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 -8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 - 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 -8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 -4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 -3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 -8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 -1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 -8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 - 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 -1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 - 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 -4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 -1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 -4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 -1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 - 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 -3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 -4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 -8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 - 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 -3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 - 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 -2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 -#Everything below is of no interest for detection purpose -2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118 -2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134 -8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150 -8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166 -8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182 -8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198 -8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214 -8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230 -8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246 -8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262 -8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278 -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294 -8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310 -8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326 -8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342 -8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358 -8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374 -8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390 -8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406 -8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422 -8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438 -8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454 -8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470 -8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486 -8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502 -8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518 -8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534 -8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550 -8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566 -8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582 -8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598 -8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614 -8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630 -8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646 -8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662 -8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678 -8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694 -8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710 -8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726 -8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742 +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/euctwprober.py b/Contents/Libraries/Shared/chardet/euctwprober.py index fe652fe37..35669cc4d 100644 --- a/Contents/Libraries/Shared/chardet/euctwprober.py +++ b/Contents/Libraries/Shared/chardet/euctwprober.py @@ -13,12 +13,12 @@ # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. -# +# # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. -# +# # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA @@ -28,14 +28,19 @@ from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import EUCTWDistributionAnalysis -from .mbcssm import EUCTWSMModel +from .mbcssm import EUCTW_SM_MODEL class EUCTWProber(MultiByteCharSetProber): def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCTWSMModel) - self._mDistributionAnalyzer = EUCTWDistributionAnalysis() + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() self.reset() - def get_charset_name(self): + @property + def charset_name(self): return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/Contents/Libraries/Shared/chardet/gb2312freq.py b/Contents/Libraries/Shared/chardet/gb2312freq.py index 1238f510f..697837bd9 100644 --- a/Contents/Libraries/Shared/chardet/gb2312freq.py +++ b/Contents/Libraries/Shared/chardet/gb2312freq.py @@ -43,7 +43,7 @@ GB2312_TABLE_SIZE = 3760 -GB2312CharToFreqOrder = ( +GB2312_CHAR_TO_FREQ_ORDER = ( 1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, 2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, 2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, @@ -278,195 +278,6 @@ 1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, 1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, - 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, # last 512 -#Everything below is of no interest for detection purpose -5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, -5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, -5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, -3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, -4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, -5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, -5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, -4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, -4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, -4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, -4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, -3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, -6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, -4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, -6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, -4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, -4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, -4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, -5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, -3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, -4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, -3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, -4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, -4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, -6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, -6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, -5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, -4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, -6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, -4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, -5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, -5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, -5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, -6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, -3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, -6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, -4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, -5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, -6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, -6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, -4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, -5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, -4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, -5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, -5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, -4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, -4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, -5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, -4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, -4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, -5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, -4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, -4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, -4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, -5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, -5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, -4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, -3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, -4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, -6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, -5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, -5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, -4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, -6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, -5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, -6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, -4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, -5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, -5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, -3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, -5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, -6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, -4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, -6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, -4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, -4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, -6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, -3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, -6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, -4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, -3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, -3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, -3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, -4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, -2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, -5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, -4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, -5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, -5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, -5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, -4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, -5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, -4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, -5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, -1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, -3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, -4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, -4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, -6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, -4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, -5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, -3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, -5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, -5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, -5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, -3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, -5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, -5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, -3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, -5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, -5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, -5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, -6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, -4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, -6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, -4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, -3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, -4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, -5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, -5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, -5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, -3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, -3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, -6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, -6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, -5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, -6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, -6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, -6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, -6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, -6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, -5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, -6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, -6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, -3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, -3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, -4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, -4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, -3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, -5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, -5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, -5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, -5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, -5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, -4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, -5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, -6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, -5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, -4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, -4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, -6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, -3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, -4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, -4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, -5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, -6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, -6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, -4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, -6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, -5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, -5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, -5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, -5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, -5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, -4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, -5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, -5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, -5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, -5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, -6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, -4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, -5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, -4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, -4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, -6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, -4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, -6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, -3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, -5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, -6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, -6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, -6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, -5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, -6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, -6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, -3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, -5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, -4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767) + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/gb2312prober.py b/Contents/Libraries/Shared/chardet/gb2312prober.py index 0325a2d86..8446d2dd9 100644 --- a/Contents/Libraries/Shared/chardet/gb2312prober.py +++ b/Contents/Libraries/Shared/chardet/gb2312prober.py @@ -13,12 +13,12 @@ # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. -# +# # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. -# +# # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA @@ -28,14 +28,19 @@ from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import GB2312DistributionAnalysis -from .mbcssm import GB2312SMModel +from .mbcssm import GB2312_SM_MODEL class GB2312Prober(MultiByteCharSetProber): def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(GB2312SMModel) - self._mDistributionAnalyzer = GB2312DistributionAnalysis() + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() self.reset() - def get_charset_name(self): + @property + def charset_name(self): return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/Contents/Libraries/Shared/chardet/hebrewprober.py b/Contents/Libraries/Shared/chardet/hebrewprober.py index ba225c5ef..b0e1bf492 100644 --- a/Contents/Libraries/Shared/chardet/hebrewprober.py +++ b/Contents/Libraries/Shared/chardet/hebrewprober.py @@ -26,8 +26,7 @@ ######################### END LICENSE BLOCK ######################### from .charsetprober import CharSetProber -from .constants import eNotMe, eDetecting -from .compat import wrap_ord +from .enums import ProbingState # This prober doesn't actually recognize a language or a charset. # It is a helper prober for the use of the Hebrew model probers @@ -126,56 +125,59 @@ # model probers scores. The answer is returned in the form of the name of the # charset identified, either "windows-1255" or "ISO-8859-8". -# windows-1255 / ISO-8859-8 code points of interest -FINAL_KAF = 0xea -NORMAL_KAF = 0xeb -FINAL_MEM = 0xed -NORMAL_MEM = 0xee -FINAL_NUN = 0xef -NORMAL_NUN = 0xf0 -FINAL_PE = 0xf3 -NORMAL_PE = 0xf4 -FINAL_TSADI = 0xf5 -NORMAL_TSADI = 0xf6 - -# Minimum Visual vs Logical final letter score difference. -# If the difference is below this, don't rely solely on the final letter score -# distance. -MIN_FINAL_CHAR_DISTANCE = 5 +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 -# Minimum Visual vs Logical model score difference. -# If the difference is below this, don't rely at all on the model score -# distance. -MIN_MODEL_DISTANCE = 0.01 + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 -VISUAL_HEBREW_NAME = "ISO-8859-8" -LOGICAL_HEBREW_NAME = "windows-1255" + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" -class HebrewProber(CharSetProber): def __init__(self): - CharSetProber.__init__(self) - self._mLogicalProber = None - self._mVisualProber = None + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None self.reset() def reset(self): - self._mFinalCharLogicalScore = 0 - self._mFinalCharVisualScore = 0 + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 # The two last characters seen in the previous buffer, # mPrev and mBeforePrev are initialized to space in order to simulate # a word delimiter at the beginning of the data - self._mPrev = ' ' - self._mBeforePrev = ' ' + self._prev = ' ' + self._before_prev = ' ' # These probers are owned by the group prober. def set_model_probers(self, logicalProber, visualProber): - self._mLogicalProber = logicalProber - self._mVisualProber = visualProber + self._logical_prober = logicalProber + self._visual_prober = visualProber def is_final(self, c): - return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, - FINAL_TSADI] + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] def is_non_final(self, c): # The normal Tsadi is not a good Non-Final letter due to words like @@ -188,9 +190,10 @@ def is_non_final(self, c): # for example legally end with a Non-Final Pe or Kaf. However, the # benefit of these letters as Non-Final letters outweighs the damage # since these words are quite rare. - return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE] + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] - def feed(self, aBuf): + def feed(self, byte_str): # Final letter analysis for logical-visual decision. # Look for evidence that the received buffer is either logical Hebrew # or visual Hebrew. @@ -217,67 +220,73 @@ def feed(self, aBuf): # We automatically filter out all 7-bit characters (replace them with # spaces) so the word boundary detection works properly. [MAP] - if self.get_state() == eNotMe: + if self.state == ProbingState.NOT_ME: # Both model probers say it's not them. No reason to continue. - return eNotMe + return ProbingState.NOT_ME - aBuf = self.filter_high_bit_only(aBuf) + byte_str = self.filter_high_byte_only(byte_str) - for cur in aBuf: + for cur in byte_str: if cur == ' ': # We stand on a space - a word just ended - if self._mBeforePrev != ' ': - # next-to-last char was not a space so self._mPrev is not a + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a # 1 letter word - if self.is_final(self._mPrev): + if self.is_final(self._prev): # case (1) [-2:not space][-1:final letter][cur:space] - self._mFinalCharLogicalScore += 1 - elif self.is_non_final(self._mPrev): + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): # case (2) [-2:not space][-1:Non-Final letter][ # cur:space] - self._mFinalCharVisualScore += 1 + self._final_char_visual_score += 1 else: # Not standing on a space - if ((self._mBeforePrev == ' ') and - (self.is_final(self._mPrev)) and (cur != ' ')): + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): # case (3) [-2:space][-1:final letter][cur:not space] - self._mFinalCharVisualScore += 1 - self._mBeforePrev = self._mPrev - self._mPrev = cur + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur # Forever detecting, till the end or until both model probers return - # eNotMe (handled above) - return eDetecting + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING - def get_charset_name(self): + @property + def charset_name(self): # Make the decision: is it Logical or Visual? # If the final letter score distance is dominant enough, rely on it. - finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore - if finalsub >= MIN_FINAL_CHAR_DISTANCE: - return LOGICAL_HEBREW_NAME - if finalsub <= -MIN_FINAL_CHAR_DISTANCE: - return VISUAL_HEBREW_NAME + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME # It's not dominant enough, try to rely on the model scores instead. - modelsub = (self._mLogicalProber.get_confidence() - - self._mVisualProber.get_confidence()) - if modelsub > MIN_MODEL_DISTANCE: - return LOGICAL_HEBREW_NAME - if modelsub < -MIN_MODEL_DISTANCE: - return VISUAL_HEBREW_NAME + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME # Still no good, back to final letter distance, maybe it'll save the # day. if finalsub < 0.0: - return VISUAL_HEBREW_NAME + return self.VISUAL_HEBREW_NAME # (finalsub > 0 - Logical) or (don't know what to do) default to # Logical. - return LOGICAL_HEBREW_NAME + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' - def get_state(self): + @property + def state(self): # Remain active as long as any of the model probers are active. - if (self._mLogicalProber.get_state() == eNotMe) and \ - (self._mVisualProber.get_state() == eNotMe): - return eNotMe - return eDetecting + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/Contents/Libraries/Shared/chardet/jisfreq.py b/Contents/Libraries/Shared/chardet/jisfreq.py index 064345b08..83fc082b5 100644 --- a/Contents/Libraries/Shared/chardet/jisfreq.py +++ b/Contents/Libraries/Shared/chardet/jisfreq.py @@ -46,7 +46,7 @@ # Char to FreqOrder table , JIS_TABLE_SIZE = 4368 -JISCharToFreqOrder = ( +JIS_CHAR_TO_FREQ_ORDER = ( 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 @@ -320,250 +320,6 @@ 2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 -#Everything below is of no interest for detection purpose -2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384 -6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400 -6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416 -6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432 -6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448 -4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464 -4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480 -3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496 -3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512 -4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528 -3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544 -6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560 -4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576 -6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592 -6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608 -6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624 -6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640 -6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656 -6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672 -3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688 -3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704 -6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720 -2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736 -4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752 -4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768 -4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784 -6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800 -3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816 -4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832 -4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848 -6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864 -4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880 -6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896 -3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912 -2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928 -4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944 -2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960 -6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976 -4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992 -6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008 -6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024 -6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040 -4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056 -6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072 -2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088 -6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104 -4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120 -6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136 -4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152 -4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168 -6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184 -6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200 -6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216 -3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232 -1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248 -3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264 -3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280 -4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296 -6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312 -3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328 -6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344 -3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360 -3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376 -2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392 -6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408 -6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424 -3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440 -6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456 -3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472 -6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488 -6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504 -6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520 -4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536 -6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552 -4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568 -3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584 -3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600 -6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616 -6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632 -4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648 -6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664 -6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680 -6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696 -6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712 -6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728 -6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744 -4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760 -4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776 -3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792 -6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808 -4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824 -2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840 -6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856 -6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872 -4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888 -2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904 -4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920 -2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936 -4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952 -4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968 -4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984 -6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000 -3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016 -6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032 -3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048 -6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064 -2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080 -3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096 -7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112 -2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128 -3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144 -3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160 -3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176 -3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192 -7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208 -7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224 -7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240 -7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256 -7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272 -4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288 -3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304 -3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320 -4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336 -3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352 -3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368 -7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384 -4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400 -7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416 -7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432 -7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448 -7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464 -7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480 -4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496 -4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512 -7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528 -3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544 -4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560 -7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576 -7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592 -4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608 -3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624 -3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640 -7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656 -4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672 -4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688 -4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704 -4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720 -4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736 -4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752 -7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768 -7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784 -7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800 -7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816 -7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832 -2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848 -3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864 -7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880 -7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896 -3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912 -4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928 -3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944 -3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960 -2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976 -7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992 -7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008 -4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024 -3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040 -3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056 -7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072 -7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088 -7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104 -4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120 -7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136 -2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152 -3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168 -4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184 -7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200 -4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216 -4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232 -7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248 -7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264 -5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280 -7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296 -7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312 -7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328 -7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344 -7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360 -5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376 -5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392 -7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408 -3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424 -7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440 -7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456 -3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472 -7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488 -7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504 -1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520 -3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536 -4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552 -2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568 -3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584 -2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600 -5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616 -4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632 -4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648 -5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664 -7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680 -7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696 -7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712 -7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728 -3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744 -7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760 -3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776 -7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792 -4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808 -7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824 -7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840 -7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856 -7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872 -7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888 -7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904 -7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920 -7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936 -7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952 -7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968 -7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984 -7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000 -8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016 -8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032 -8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048 -8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064 -8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080 -8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096 -8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112 -8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128 -8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144 -8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160 -8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176 -8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192 -8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208 -8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224 -8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240 -8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256 -8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272 +) + -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/jpcntx.py b/Contents/Libraries/Shared/chardet/jpcntx.py index 59aeb6a87..20044e4bc 100644 --- a/Contents/Libraries/Shared/chardet/jpcntx.py +++ b/Contents/Libraries/Shared/chardet/jpcntx.py @@ -25,13 +25,6 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .compat import wrap_ord - -NUM_OF_CATEGORY = 6 -DONT_KNOW = -1 -ENOUGH_REL_THRESHOLD = 100 -MAX_REL_THRESHOLD = 1000 -MINIMUM_DATA_THRESHOLD = 4 # This is hiragana 2-char sequence table, the number in each cell represents its frequency category jp2CharContext = ( @@ -120,24 +113,35 @@ (0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), ) -class JapaneseContextAnalysis: +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None self.reset() def reset(self): - self._mTotalRel = 0 # total sequence received - # category counters, each interger counts sequence in its category - self._mRelSample = [0] * NUM_OF_CATEGORY + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY # if last byte in current buffer is not the last byte of a character, # we need to know how many bytes to skip in next buffer - self._mNeedToSkipCharNum = 0 - self._mLastCharOrder = -1 # The order of previous char + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char # If this flag is set to True, detection is done and conclusion has # been made - self._mDone = False + self._done = False - def feed(self, aBuf, aLen): - if self._mDone: + def feed(self, byte_str, num_bytes): + if self._done: return # The buffer we got is byte oriented, and a character may span in more than one @@ -147,81 +151,83 @@ def feed(self, aBuf, aLen): # well and analyse the character once it is complete, but since a # character will not make much difference, by simply skipping # this character will simply our logic and improve performance. - i = self._mNeedToSkipCharNum - while i < aLen: - order, charLen = self.get_order(aBuf[i:i + 2]) - i += charLen - if i > aLen: - self._mNeedToSkipCharNum = i - aLen - self._mLastCharOrder = -1 + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 else: - if (order != -1) and (self._mLastCharOrder != -1): - self._mTotalRel += 1 - if self._mTotalRel > MAX_REL_THRESHOLD: - self._mDone = True + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True break - self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1 - self._mLastCharOrder = order + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order def got_enough_data(self): - return self._mTotalRel > ENOUGH_REL_THRESHOLD + return self._total_rel > self.ENOUGH_REL_THRESHOLD def get_confidence(self): # This is just one way to calculate confidence. It works well for me. - if self._mTotalRel > MINIMUM_DATA_THRESHOLD: - return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel else: - return DONT_KNOW + return self.DONT_KNOW - def get_order(self, aBuf): + def get_order(self, byte_str): return -1, 1 class SJISContextAnalysis(JapaneseContextAnalysis): def __init__(self): - self.charset_name = "SHIFT_JIS" + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" - def get_charset_name(self): - return self.charset_name + @property + def charset_name(self): + return self._charset_name - def get_order(self, aBuf): - if not aBuf: + def get_order(self, byte_str): + if not byte_str: return -1, 1 # find out current char's byte length - first_char = wrap_ord(aBuf[0]) - if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)): - charLen = 2 + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): - self.charset_name = "CP932" + self._charset_name = "CP932" else: - charLen = 1 + char_len = 1 # return its order if it is hiragana - if len(aBuf) > 1: - second_char = wrap_ord(aBuf[1]) + if len(byte_str) > 1: + second_char = byte_str[1] if (first_char == 202) and (0x9F <= second_char <= 0xF1): - return second_char - 0x9F, charLen + return second_char - 0x9F, char_len - return -1, charLen + return -1, char_len class EUCJPContextAnalysis(JapaneseContextAnalysis): - def get_order(self, aBuf): - if not aBuf: + def get_order(self, byte_str): + if not byte_str: return -1, 1 # find out current char's byte length - first_char = wrap_ord(aBuf[0]) + first_char = byte_str[0] if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): - charLen = 2 + char_len = 2 elif first_char == 0x8F: - charLen = 3 + char_len = 3 else: - charLen = 1 + char_len = 1 # return its order if it is hiragana - if len(aBuf) > 1: - second_char = wrap_ord(aBuf[1]) + if len(byte_str) > 1: + second_char = byte_str[1] if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): - return second_char - 0xA1, charLen + return second_char - 0xA1, char_len + + return -1, char_len - return -1, charLen -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/langbulgarianmodel.py b/Contents/Libraries/Shared/chardet/langbulgarianmodel.py index e5788fc64..2aa4fb2e2 100644 --- a/Contents/Libraries/Shared/chardet/langbulgarianmodel.py +++ b/Contents/Libraries/Shared/chardet/langbulgarianmodel.py @@ -210,20 +210,19 @@ ) Latin5BulgarianModel = { - 'charToOrderMap': Latin5_BulgarianCharToOrderMap, - 'precedenceMatrix': BulgarianLangModel, - 'mTypicalPositiveRatio': 0.969392, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-5" + 'char_to_order_map': Latin5_BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Bulgairan', } Win1251BulgarianModel = { - 'charToOrderMap': win1251BulgarianCharToOrderMap, - 'precedenceMatrix': BulgarianLangModel, - 'mTypicalPositiveRatio': 0.969392, - 'keepEnglishLetter': False, - 'charsetName': "windows-1251" + 'char_to_order_map': win1251BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Bulgarian', } - - -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/langcyrillicmodel.py b/Contents/Libraries/Shared/chardet/langcyrillicmodel.py index a86f54bd5..e5f9a1fd1 100644 --- a/Contents/Libraries/Shared/chardet/langcyrillicmodel.py +++ b/Contents/Libraries/Shared/chardet/langcyrillicmodel.py @@ -27,7 +27,7 @@ # KOI8-R language model # Character Mapping Table: -KOI8R_CharToOrderMap = ( +KOI8R_char_to_order_map = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 @@ -46,7 +46,7 @@ 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 ) -win1251_CharToOrderMap = ( +win1251_char_to_order_map = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 @@ -65,7 +65,7 @@ 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, ) -latin5_CharToOrderMap = ( +latin5_char_to_order_map = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 @@ -84,7 +84,7 @@ 239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, ) -macCyrillic_CharToOrderMap = ( +macCyrillic_char_to_order_map = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 @@ -103,7 +103,7 @@ 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, ) -IBM855_CharToOrderMap = ( +IBM855_char_to_order_map = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 @@ -122,7 +122,7 @@ 250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, ) -IBM866_CharToOrderMap = ( +IBM866_char_to_order_map = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 @@ -279,51 +279,55 @@ ) Koi8rModel = { - 'charToOrderMap': KOI8R_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "KOI8-R" + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', } Win1251CyrillicModel = { - 'charToOrderMap': win1251_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "windows-1251" + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', } Latin5CyrillicModel = { - 'charToOrderMap': latin5_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-5" + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', } MacCyrillicModel = { - 'charToOrderMap': macCyrillic_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "MacCyrillic" -}; + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} Ibm866Model = { - 'charToOrderMap': IBM866_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "IBM866" + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', } Ibm855Model = { - 'charToOrderMap': IBM855_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "IBM855" + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', } - -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/langgreekmodel.py b/Contents/Libraries/Shared/chardet/langgreekmodel.py index ddb583765..533222166 100644 --- a/Contents/Libraries/Shared/chardet/langgreekmodel.py +++ b/Contents/Libraries/Shared/chardet/langgreekmodel.py @@ -31,7 +31,7 @@ # 252: 0 - 9 # Character Mapping Table: -Latin7_CharToOrderMap = ( +Latin7_char_to_order_map = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 @@ -50,7 +50,7 @@ 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 ) -win1253_CharToOrderMap = ( +win1253_char_to_order_map = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 @@ -207,19 +207,19 @@ ) Latin7GreekModel = { - 'charToOrderMap': Latin7_CharToOrderMap, - 'precedenceMatrix': GreekLangModel, - 'mTypicalPositiveRatio': 0.982851, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-7" + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', } Win1253GreekModel = { - 'charToOrderMap': win1253_CharToOrderMap, - 'precedenceMatrix': GreekLangModel, - 'mTypicalPositiveRatio': 0.982851, - 'keepEnglishLetter': False, - 'charsetName': "windows-1253" + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', } - -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/langhebrewmodel.py b/Contents/Libraries/Shared/chardet/langhebrewmodel.py index 75f2bc7fe..58f4c875e 100644 --- a/Contents/Libraries/Shared/chardet/langhebrewmodel.py +++ b/Contents/Libraries/Shared/chardet/langhebrewmodel.py @@ -34,7 +34,7 @@ # Windows-1255 language model # Character Mapping Table: -win1255_CharToOrderMap = ( +WIN1255_CHAR_TO_ORDER_MAP = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 @@ -59,7 +59,7 @@ # first 1024 sequences: 1.5981% # rest sequences: 0.087% # negative sequences: 0.0015% -HebrewLangModel = ( +HEBREW_LANG_MODEL = ( 0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, 3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, @@ -191,11 +191,10 @@ ) Win1255HebrewModel = { - 'charToOrderMap': win1255_CharToOrderMap, - 'precedenceMatrix': HebrewLangModel, - 'mTypicalPositiveRatio': 0.984004, - 'keepEnglishLetter': False, - 'charsetName': "windows-1255" + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', } - -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/langhungarianmodel.py b/Contents/Libraries/Shared/chardet/langhungarianmodel.py index 49d2f0fe7..bb7c095e1 100644 --- a/Contents/Libraries/Shared/chardet/langhungarianmodel.py +++ b/Contents/Libraries/Shared/chardet/langhungarianmodel.py @@ -207,19 +207,19 @@ ) Latin2HungarianModel = { - 'charToOrderMap': Latin2_HungarianCharToOrderMap, - 'precedenceMatrix': HungarianLangModel, - 'mTypicalPositiveRatio': 0.947368, - 'keepEnglishLetter': True, - 'charsetName': "ISO-8859-2" + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', } Win1250HungarianModel = { - 'charToOrderMap': win1250HungarianCharToOrderMap, - 'precedenceMatrix': HungarianLangModel, - 'mTypicalPositiveRatio': 0.947368, - 'keepEnglishLetter': True, - 'charsetName': "windows-1250" + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', } - -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/langthaimodel.py b/Contents/Libraries/Shared/chardet/langthaimodel.py index 0508b1b1a..15f94c2df 100644 --- a/Contents/Libraries/Shared/chardet/langthaimodel.py +++ b/Contents/Libraries/Shared/chardet/langthaimodel.py @@ -190,11 +190,10 @@ ) TIS620ThaiModel = { - 'charToOrderMap': TIS620CharToOrderMap, - 'precedenceMatrix': ThaiLangModel, - 'mTypicalPositiveRatio': 0.926386, - 'keepEnglishLetter': False, - 'charsetName': "TIS-620" + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', } - -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/langturkishmodel.py b/Contents/Libraries/Shared/chardet/langturkishmodel.py new file mode 100644 index 000000000..a427a4573 --- /dev/null +++ b/Contents/Libraries/Shared/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Özgür Baskın - Turkish Language Model +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/Contents/Libraries/Shared/chardet/latin1prober.py b/Contents/Libraries/Shared/chardet/latin1prober.py index eef357354..7d1e8c20f 100644 --- a/Contents/Libraries/Shared/chardet/latin1prober.py +++ b/Contents/Libraries/Shared/chardet/latin1prober.py @@ -27,8 +27,7 @@ ######################### END LICENSE BLOCK ######################### from .charsetprober import CharSetProber -from .constants import eNotMe -from .compat import wrap_ord +from .enums import ProbingState FREQ_CAT_NUM = 4 @@ -82,7 +81,7 @@ # 2 : normal # 3 : very likely Latin1ClassModel = ( - # UDF OTH ASC ASS ACV ACO ASV ASO +# UDF OTH ASC ASS ACV ACO ASV ASO 0, 0, 0, 0, 0, 0, 0, 0, # UDF 0, 3, 3, 3, 3, 3, 3, 3, # OTH 0, 3, 3, 3, 3, 3, 3, 3, # ASC @@ -96,40 +95,47 @@ class Latin1Prober(CharSetProber): def __init__(self): - CharSetProber.__init__(self) + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None self.reset() def reset(self): - self._mLastCharClass = OTH - self._mFreqCounter = [0] * FREQ_CAT_NUM + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM CharSetProber.reset(self) - def get_charset_name(self): - return "windows-1252" + @property + def charset_name(self): + return "ISO-8859-1" - def feed(self, aBuf): - aBuf = self.filter_with_english_letters(aBuf) - for c in aBuf: - charClass = Latin1_CharToClass[wrap_ord(c)] - freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) - + charClass] + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] if freq == 0: - self._mState = eNotMe + self._state = ProbingState.NOT_ME break - self._mFreqCounter[freq] += 1 - self._mLastCharClass = charClass + self._freq_counter[freq] += 1 + self._last_char_class = char_class - return self.get_state() + return self.state def get_confidence(self): - if self.get_state() == eNotMe: + if self.state == ProbingState.NOT_ME: return 0.01 - total = sum(self._mFreqCounter) + total = sum(self._freq_counter) if total < 0.01: confidence = 0.0 else: - confidence = ((self._mFreqCounter[3] - self._mFreqCounter[1] * 20.0) + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) / total) if confidence < 0.0: confidence = 0.0 diff --git a/Contents/Libraries/Shared/chardet/mbcharsetprober.py b/Contents/Libraries/Shared/chardet/mbcharsetprober.py index bb42f2fb5..6256ecfd1 100644 --- a/Contents/Libraries/Shared/chardet/mbcharsetprober.py +++ b/Contents/Libraries/Shared/chardet/mbcharsetprober.py @@ -27,60 +27,65 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -import sys -from . import constants from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState class MultiByteCharSetProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mDistributionAnalyzer = None - self._mCodingSM = None - self._mLastChar = [0, 0] + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] def reset(self): - CharSetProber.reset(self) - if self._mCodingSM: - self._mCodingSM.reset() - if self._mDistributionAnalyzer: - self._mDistributionAnalyzer.reset() - self._mLastChar = [0, 0] + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError - def get_charset_name(self): - pass + @property + def language(self): + raise NotImplementedError - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() if i == 0: - self._mLastChar[1] = aBuf[0] - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) else: - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) - self._mLastChar[0] = aBuf[aLen - 1] + self._last_char[0] = byte_str[-1] - if self.get_state() == constants.eDetecting: - if (self._mDistributionAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT - return self.get_state() + return self.state def get_confidence(self): - return self._mDistributionAnalyzer.get_confidence() + return self.distribution_analyzer.get_confidence() diff --git a/Contents/Libraries/Shared/chardet/mbcsgroupprober.py b/Contents/Libraries/Shared/chardet/mbcsgroupprober.py index 03c9dcf3e..530abe75e 100644 --- a/Contents/Libraries/Shared/chardet/mbcsgroupprober.py +++ b/Contents/Libraries/Shared/chardet/mbcsgroupprober.py @@ -39,9 +39,9 @@ class MBCSGroupProber(CharSetGroupProber): - def __init__(self): - CharSetGroupProber.__init__(self) - self._mProbers = [ + def __init__(self, lang_filter=None): + super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + self.probers = [ UTF8Prober(), SJISProber(), EUCJPProber(), diff --git a/Contents/Libraries/Shared/chardet/mbcssm.py b/Contents/Libraries/Shared/chardet/mbcssm.py index efe678ca0..8360d0f28 100644 --- a/Contents/Libraries/Shared/chardet/mbcssm.py +++ b/Contents/Libraries/Shared/chardet/mbcssm.py @@ -25,11 +25,11 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .constants import eStart, eError, eItsMe +from .enums import MachineState # BIG5 -BIG5_cls = ( +BIG5_CLS = ( 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value 1,1,1,1,1,1,0,0, # 08 - 0f 1,1,1,1,1,1,1,1, # 10 - 17 @@ -64,23 +64,23 @@ 3,3,3,3,3,3,3,0 # f8 - ff ) -BIG5_st = ( - eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 - eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f - eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart#10-17 +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 ) -Big5CharLenTable = (0, 1, 1, 2, 0) +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) -Big5SMModel = {'classTable': BIG5_cls, - 'classFactor': 5, - 'stateTable': BIG5_st, - 'charLenTable': Big5CharLenTable, - 'name': 'Big5'} +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} # CP949 -CP949_cls = ( +CP949_CLS = ( 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f @@ -99,28 +99,28 @@ 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff ) -CP949_st = ( +CP949_ST = ( #cls= 0 1 2 3 4 5 6 7 8 9 # previous state = - eError,eStart, 3,eError,eStart,eStart, 4, 5,eError, 6, # eStart - eError,eError,eError,eError,eError,eError,eError,eError,eError,eError, # eError - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe, # eItsMe - eError,eError,eStart,eStart,eError,eError,eError,eStart,eStart,eStart, # 3 - eError,eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 4 - eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 5 - eError,eStart,eStart,eStart,eStart,eError,eError,eStart,eStart,eStart, # 6 + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 ) -CP949CharLenTable = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) -CP949SMModel = {'classTable': CP949_cls, - 'classFactor': 10, - 'stateTable': CP949_st, - 'charLenTable': CP949CharLenTable, - 'name': 'CP949'} +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} # EUC-JP -EUCJP_cls = ( +EUCJP_CLS = ( 4,4,4,4,4,4,4,4, # 00 - 07 4,4,4,4,4,4,5,5, # 08 - 0f 4,4,4,4,4,4,4,4, # 10 - 17 @@ -155,25 +155,25 @@ 0,0,0,0,0,0,0,5 # f8 - ff ) -EUCJP_st = ( - 3, 4, 3, 5,eStart,eError,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17 - eError,eError,eStart,eError,eError,eError, 3,eError,#18-1f - 3,eError,eError,eError,eStart,eStart,eStart,eStart#20-27 +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 ) -EUCJPCharLenTable = (2, 2, 2, 3, 1, 0) +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) -EUCJPSMModel = {'classTable': EUCJP_cls, - 'classFactor': 6, - 'stateTable': EUCJP_st, - 'charLenTable': EUCJPCharLenTable, - 'name': 'EUC-JP'} +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} # EUC-KR -EUCKR_cls = ( +EUCKR_CLS = ( 1,1,1,1,1,1,1,1, # 00 - 07 1,1,1,1,1,1,0,0, # 08 - 0f 1,1,1,1,1,1,1,1, # 10 - 17 @@ -208,22 +208,22 @@ 2,2,2,2,2,2,2,0 # f8 - ff ) -EUCKR_st = ( - eError,eStart, 3,eError,eError,eError,eError,eError,#00-07 - eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart #08-0f +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f ) -EUCKRCharLenTable = (0, 1, 2, 0) +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) -EUCKRSMModel = {'classTable': EUCKR_cls, - 'classFactor': 4, - 'stateTable': EUCKR_st, - 'charLenTable': EUCKRCharLenTable, +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, 'name': 'EUC-KR'} # EUC-TW -EUCTW_cls = ( +EUCTW_CLS = ( 2,2,2,2,2,2,2,2, # 00 - 07 2,2,2,2,2,2,0,0, # 08 - 0f 2,2,2,2,2,2,2,2, # 10 - 17 @@ -258,26 +258,26 @@ 3,3,3,3,3,3,3,0 # f8 - ff ) -EUCTW_st = ( - eError,eError,eStart, 3, 3, 3, 4,eError,#00-07 - eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17 - eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f - 5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27 - eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f ) -EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3) +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) -EUCTWSMModel = {'classTable': EUCTW_cls, - 'classFactor': 7, - 'stateTable': EUCTW_st, - 'charLenTable': EUCTWCharLenTable, +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, 'name': 'x-euc-tw'} # GB2312 -GB2312_cls = ( +GB2312_CLS = ( 1,1,1,1,1,1,1,1, # 00 - 07 1,1,1,1,1,1,0,0, # 08 - 0f 1,1,1,1,1,1,1,1, # 10 - 17 @@ -312,31 +312,31 @@ 6,6,6,6,6,6,6,0 # f8 - ff ) -GB2312_st = ( - eError,eStart,eStart,eStart,eStart,eStart, 3,eError,#00-07 - eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17 - 4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f - eError,eError, 5,eError,eError,eError,eItsMe,eError,#20-27 - eError,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f ) # To be accurate, the length of class 6 can be either 2 or 4. # But it is not necessary to discriminate between the two since -# it is used for frequency analysis only, and we are validing +# it is used for frequency analysis only, and we are validating # each code range there as well. So it is safe to set it to be # 2 here. -GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2) +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) -GB2312SMModel = {'classTable': GB2312_cls, - 'classFactor': 7, - 'stateTable': GB2312_st, - 'charLenTable': GB2312CharLenTable, - 'name': 'GB2312'} +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} # Shift_JIS -SJIS_cls = ( +SJIS_CLS = ( 1,1,1,1,1,1,1,1, # 00 - 07 1,1,1,1,1,1,0,0, # 08 - 0f 1,1,1,1,1,1,1,1, # 10 - 17 @@ -373,23 +373,23 @@ 3,3,3,3,3,0,0,0) # f8 - ff -SJIS_st = ( - eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart #10-17 +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 ) -SJISCharLenTable = (0, 1, 1, 2, 0, 0) +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) -SJISSMModel = {'classTable': SJIS_cls, - 'classFactor': 6, - 'stateTable': SJIS_st, - 'charLenTable': SJISCharLenTable, +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, 'name': 'Shift_JIS'} # UCS2-BE -UCS2BE_cls = ( +UCS2BE_CLS = ( 0,0,0,0,0,0,0,0, # 00 - 07 0,0,1,0,0,2,0,0, # 08 - 0f 0,0,0,0,0,0,0,0, # 10 - 17 @@ -424,27 +424,27 @@ 0,0,0,0,0,0,4,5 # f8 - ff ) -UCS2BE_st = ( - 5, 7, 7,eError, 4, 3,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe, 6, 6, 6, 6,eError,eError,#10-17 - 6, 6, 6, 6, 6,eItsMe, 6, 6,#18-1f - 6, 6, 6, 6, 5, 7, 7,eError,#20-27 - 5, 8, 6, 6,eError, 6, 6, 6,#28-2f - 6, 6, 6, 6,eError,eError,eStart,eStart #30-37 +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 ) -UCS2BECharLenTable = (2, 2, 2, 0, 2, 2) +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) -UCS2BESMModel = {'classTable': UCS2BE_cls, - 'classFactor': 6, - 'stateTable': UCS2BE_st, - 'charLenTable': UCS2BECharLenTable, - 'name': 'UTF-16BE'} +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} # UCS2-LE -UCS2LE_cls = ( +UCS2LE_CLS = ( 0,0,0,0,0,0,0,0, # 00 - 07 0,0,1,0,0,2,0,0, # 08 - 0f 0,0,0,0,0,0,0,0, # 10 - 17 @@ -479,27 +479,27 @@ 0,0,0,0,0,0,4,5 # f8 - ff ) -UCS2LE_st = ( - 6, 6, 7, 6, 4, 3,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe, 5, 5, 5,eError,eItsMe,eError,#10-17 - 5, 5, 5,eError, 5,eError, 6, 6,#18-1f - 7, 6, 8, 8, 5, 5, 5,eError,#20-27 - 5, 5, 5,eError,eError,eError, 5, 5,#28-2f - 5, 5, 5,eError, 5,eError,eStart,eStart #30-37 +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 ) -UCS2LECharLenTable = (2, 2, 2, 2, 2, 2) +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) -UCS2LESMModel = {'classTable': UCS2LE_cls, - 'classFactor': 6, - 'stateTable': UCS2LE_st, - 'charLenTable': UCS2LECharLenTable, +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, 'name': 'UTF-16LE'} # UTF-8 -UTF8_cls = ( +UTF8_CLS = ( 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value 1,1,1,1,1,1,0,0, # 08 - 0f 1,1,1,1,1,1,1,1, # 10 - 17 @@ -534,39 +534,39 @@ 12,13,13,13,14,15,0,0 # f8 - ff ) -UTF8_st = ( - eError,eStart,eError,eError,eError,eError, 12, 10,#00-07 +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 9, 11, 8, 7, 6, 5, 4, 3,#08-0f - eError,eError,eError,eError,eError,eError,eError,eError,#10-17 - eError,eError,eError,eError,eError,eError,eError,eError,#18-1f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27 - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f - eError,eError, 5, 5, 5, 5,eError,eError,#30-37 - eError,eError,eError,eError,eError,eError,eError,eError,#38-3f - eError,eError,eError, 5, 5, 5,eError,eError,#40-47 - eError,eError,eError,eError,eError,eError,eError,eError,#48-4f - eError,eError, 7, 7, 7, 7,eError,eError,#50-57 - eError,eError,eError,eError,eError,eError,eError,eError,#58-5f - eError,eError,eError,eError, 7, 7,eError,eError,#60-67 - eError,eError,eError,eError,eError,eError,eError,eError,#68-6f - eError,eError, 9, 9, 9, 9,eError,eError,#70-77 - eError,eError,eError,eError,eError,eError,eError,eError,#78-7f - eError,eError,eError,eError,eError, 9,eError,eError,#80-87 - eError,eError,eError,eError,eError,eError,eError,eError,#88-8f - eError,eError, 12, 12, 12, 12,eError,eError,#90-97 - eError,eError,eError,eError,eError,eError,eError,eError,#98-9f - eError,eError,eError,eError,eError, 12,eError,eError,#a0-a7 - eError,eError,eError,eError,eError,eError,eError,eError,#a8-af - eError,eError, 12, 12, 12,eError,eError,eError,#b0-b7 - eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf - eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7 - eError,eError,eError,eError,eError,eError,eError,eError #c8-cf + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf ) -UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) -UTF8SMModel = {'classTable': UTF8_cls, - 'classFactor': 16, - 'stateTable': UTF8_st, - 'charLenTable': UTF8CharLenTable, - 'name': 'UTF-8'} +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/Contents/Libraries/Shared/chardet/sbcharsetprober.py b/Contents/Libraries/Shared/chardet/sbcharsetprober.py index 37291bd27..0adb51de5 100644 --- a/Contents/Libraries/Shared/chardet/sbcharsetprober.py +++ b/Contents/Libraries/Shared/chardet/sbcharsetprober.py @@ -26,95 +26,107 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -import sys -from . import constants from .charsetprober import CharSetProber -from .compat import wrap_ord - -SAMPLE_SIZE = 64 -SB_ENOUGH_REL_THRESHOLD = 1024 -POSITIVE_SHORTCUT_THRESHOLD = 0.95 -NEGATIVE_SHORTCUT_THRESHOLD = 0.05 -SYMBOL_CAT_ORDER = 250 -NUMBER_OF_SEQ_CAT = 4 -POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1 -#NEGATIVE_CAT = 0 +from .enums import CharacterCategory, ProbingState, SequenceLikelihood class SingleByteCharSetProber(CharSetProber): - def __init__(self, model, reversed=False, nameProber=None): - CharSetProber.__init__(self) - self._mModel = model + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model # TRUE if we need to reverse every pair in the model lookup - self._mReversed = reversed + self._reversed = reversed # Optional auxiliary prober for name decision - self._mNameProber = nameProber + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None self.reset() def reset(self): - CharSetProber.reset(self) + super(SingleByteCharSetProber, self).reset() # char order of last character - self._mLastOrder = 255 - self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT - self._mTotalSeqs = 0 - self._mTotalChar = 0 + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 # characters that fall in our sampling range - self._mFreqChar = 0 + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] - def get_charset_name(self): - if self._mNameProber: - return self._mNameProber.get_charset_name() + @property + def language(self): + if self._name_prober: + return self._name_prober.language else: - return self._mModel['charsetName'] + return self._model.get('language') - def feed(self, aBuf): - if not self._mModel['keepEnglishLetter']: - aBuf = self.filter_without_english_letters(aBuf) - aLen = len(aBuf) - if not aLen: - return self.get_state() - for c in aBuf: - order = self._mModel['charToOrderMap'][wrap_ord(c)] - if order < SYMBOL_CAT_ORDER: - self._mTotalChar += 1 - if order < SAMPLE_SIZE: - self._mFreqChar += 1 - if self._mLastOrder < SAMPLE_SIZE: - self._mTotalSeqs += 1 - if not self._mReversed: - i = (self._mLastOrder * SAMPLE_SIZE) + order - model = self._mModel['precedenceMatrix'][i] + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] else: # reverse the order of the letters in the lookup - i = (order * SAMPLE_SIZE) + self._mLastOrder - model = self._mModel['precedenceMatrix'][i] - self._mSeqCounters[model] += 1 - self._mLastOrder = order + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = order - if self.get_state() == constants.eDetecting: - if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD: - cf = self.get_confidence() - if cf > POSITIVE_SHORTCUT_THRESHOLD: - if constants._debug: - sys.stderr.write('%s confidence = %s, we have a' - 'winner\n' % - (self._mModel['charsetName'], cf)) - self._mState = constants.eFoundIt - elif cf < NEGATIVE_SHORTCUT_THRESHOLD: - if constants._debug: - sys.stderr.write('%s confidence = %s, below negative' - 'shortcut threshhold %s\n' % - (self._mModel['charsetName'], cf, - NEGATIVE_SHORTCUT_THRESHOLD)) - self._mState = constants.eNotMe + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME - return self.get_state() + return self.state def get_confidence(self): r = 0.01 - if self._mTotalSeqs > 0: - r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs - / self._mModel['mTypicalPositiveRatio']) - r = r * self._mFreqChar / self._mTotalChar + if self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char if r >= 1.0: r = 0.99 return r diff --git a/Contents/Libraries/Shared/chardet/sbcsgroupprober.py b/Contents/Libraries/Shared/chardet/sbcsgroupprober.py index 1b6196cd1..98e95dc1a 100644 --- a/Contents/Libraries/Shared/chardet/sbcsgroupprober.py +++ b/Contents/Libraries/Shared/chardet/sbcsgroupprober.py @@ -33,16 +33,17 @@ Ibm866Model, Ibm855Model) from .langgreekmodel import Latin7GreekModel, Win1253GreekModel from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel -from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel from .langthaimodel import TIS620ThaiModel from .langhebrewmodel import Win1255HebrewModel from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel class SBCSGroupProber(CharSetGroupProber): def __init__(self): - CharSetGroupProber.__init__(self) - self._mProbers = [ + super(SBCSGroupProber, self).__init__() + self.probers = [ SingleByteCharSetProber(Win1251CyrillicModel), SingleByteCharSetProber(Koi8rModel), SingleByteCharSetProber(Latin5CyrillicModel), @@ -53,17 +54,20 @@ def __init__(self): SingleByteCharSetProber(Win1253GreekModel), SingleByteCharSetProber(Latin5BulgarianModel), SingleByteCharSetProber(Win1251BulgarianModel), - SingleByteCharSetProber(Latin2HungarianModel), - SingleByteCharSetProber(Win1250HungarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), ] - hebrewProber = HebrewProber() - logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, - False, hebrewProber) - visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True, - hebrewProber) - hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber) - self._mProbers.extend([hebrewProber, logicalHebrewProber, - visualHebrewProber]) + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) self.reset() diff --git a/Contents/Libraries/Shared/chardet/sjisprober.py b/Contents/Libraries/Shared/chardet/sjisprober.py index cd0e9e707..9e29623bd 100644 --- a/Contents/Libraries/Shared/chardet/sjisprober.py +++ b/Contents/Libraries/Shared/chardet/sjisprober.py @@ -25,67 +25,68 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -import sys from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import SJISDistributionAnalysis from .jpcntx import SJISContextAnalysis -from .mbcssm import SJISSMModel -from . import constants +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState class SJISProber(MultiByteCharSetProber): def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(SJISSMModel) - self._mDistributionAnalyzer = SJISDistributionAnalysis() - self._mContextAnalyzer = SJISContextAnalysis() + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() self.reset() def reset(self): - MultiByteCharSetProber.reset(self) - self._mContextAnalyzer.reset() + super(SJISProber, self).reset() + self.context_analyzer.reset() - def get_charset_name(self): - return self._mContextAnalyzer.get_charset_name() + @property + def charset_name(self): + return self.context_analyzer.charset_name - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() if i == 0: - self._mLastChar[1] = aBuf[0] - self._mContextAnalyzer.feed(self._mLastChar[2 - charLen:], - charLen) - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) else: - self._mContextAnalyzer.feed(aBuf[i + 1 - charLen:i + 3 - - charLen], charLen) - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) - self._mLastChar[0] = aBuf[aLen - 1] + self._last_char[0] = byte_str[-1] - if self.get_state() == constants.eDetecting: - if (self._mContextAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT - return self.get_state() + return self.state def get_confidence(self): - contxtCf = self._mContextAnalyzer.get_confidence() - distribCf = self._mDistributionAnalyzer.get_confidence() - return max(contxtCf, distribCf) + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/Contents/Libraries/Shared/chardet/universaldetector.py b/Contents/Libraries/Shared/chardet/universaldetector.py index 476522b99..7b4e92d61 100644 --- a/Contents/Libraries/Shared/chardet/universaldetector.py +++ b/Contents/Libraries/Shared/chardet/universaldetector.py @@ -25,146 +25,262 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + -from . import constants -import sys import codecs -from .latin1prober import Latin1Prober # windows-1252 -from .mbcsgroupprober import MBCSGroupProber # multi-byte character sets -from .sbcsgroupprober import SBCSGroupProber # single-byte character sets -from .escprober import EscCharSetProber # ISO-2122, etc. +import logging import re -MINIMUM_THRESHOLD = 0.20 -ePureAscii = 0 -eEscAscii = 1 -eHighbyte = 2 +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result -class UniversalDetector: - def __init__(self): - self._highBitDetector = re.compile(b'[\x80-\xFF]') - self._escDetector = re.compile(b'(\033|~{)') - self._mEscCharSetProber = None - self._mCharSetProbers = [] + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None self.reset() def reset(self): - self.result = {'encoding': None, 'confidence': 0.0} + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} self.done = False - self._mStart = True - self._mGotData = False - self._mInputState = ePureAscii - self._mLastChar = b'' - if self._mEscCharSetProber: - self._mEscCharSetProber.reset() - for prober in self._mCharSetProbers: + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: prober.reset() - def feed(self, aBuf): + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ if self.done: return - aLen = len(aBuf) - if not aLen: + if not len(byte_str): return - if not self._mGotData: + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: # If the data starts with BOM, we know it is UTF - if aBuf[:3] == codecs.BOM_UTF8: + if byte_str.startswith(codecs.BOM_UTF8): # EF BB BF UTF-8 with BOM - self.result = {'encoding': "UTF-8-SIG", 'confidence': 1.0} - elif aBuf[:4] == codecs.BOM_UTF32_LE: + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): # FF FE 00 00 UTF-32, little-endian BOM - self.result = {'encoding': "UTF-32LE", 'confidence': 1.0} - elif aBuf[:4] == codecs.BOM_UTF32_BE: # 00 00 FE FF UTF-32, big-endian BOM - self.result = {'encoding': "UTF-32BE", 'confidence': 1.0} - elif aBuf[:4] == b'\xFE\xFF\x00\x00': + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\xFE\xFF\x00\x00'): # FE FF 00 00 UCS-4, unusual octet order BOM (3412) - self.result = { - 'encoding': "X-ISO-10646-UCS-4-3412", - 'confidence': 1.0 - } - elif aBuf[:4] == b'\x00\x00\xFF\xFE': + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\x00\x00\xFF\xFE'): # 00 00 FF FE UCS-4, unusual octet order BOM (2143) - self.result = { - 'encoding': "X-ISO-10646-UCS-4-2143", - 'confidence': 1.0 - } - elif aBuf[:2] == codecs.BOM_LE: + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): # FF FE UTF-16, little endian BOM - self.result = {'encoding': "UTF-16LE", 'confidence': 1.0} - elif aBuf[:2] == codecs.BOM_BE: # FE FF UTF-16, big endian BOM - self.result = {'encoding': "UTF-16BE", 'confidence': 1.0} + self.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} - self._mGotData = True - if self.result['encoding'] and (self.result['confidence'] > 0.0): - self.done = True - return + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] - if self._mInputState == ePureAscii: - if self._highBitDetector.search(aBuf): - self._mInputState = eHighbyte - elif ((self._mInputState == ePureAscii) and - self._escDetector.search(self._mLastChar + aBuf)): - self._mInputState = eEscAscii - - self._mLastChar = aBuf[-1:] - - if self._mInputState == eEscAscii: - if not self._mEscCharSetProber: - self._mEscCharSetProber = EscCharSetProber() - if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt: - self.result = {'encoding': self._mEscCharSetProber.get_charset_name(), - 'confidence': self._mEscCharSetProber.get_confidence()} + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} self.done = True - elif self._mInputState == eHighbyte: - if not self._mCharSetProbers: - self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), - Latin1Prober()] - for prober in self._mCharSetProbers: - if prober.feed(aBuf) == constants.eFoundIt: - self.result = {'encoding': prober.get_charset_name(), - 'confidence': prober.get_confidence()} + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} self.done = True break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done if self.done: - return - if not self._mGotData: - if constants._debug: - sys.stderr.write('no data received!\n') - return + return self.result self.done = True - if self._mInputState == ePureAscii: - self.result = {'encoding': 'ascii', 'confidence': 1.0} - return self.result + if not self._got_data: + self.logger.debug('no data received!') - if self._mInputState == eHighbyte: - proberConfidence = None - maxProberConfidence = 0.0 - maxProber = None - for prober in self._mCharSetProbers: - if not prober: - continue - proberConfidence = prober.get_confidence() - if proberConfidence > maxProberConfidence: - maxProberConfidence = proberConfidence - maxProber = prober - if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD): - self.result = {'encoding': maxProber.get_charset_name(), - 'confidence': maxProber.get_confidence()} - return self.result - - if constants._debug: - sys.stderr.write('no probers hit minimum threshhold\n') - for prober in self._mCharSetProbers[0].mProbers: + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: if not prober: continue - sys.stderr.write('%s confidence = %s\n' % - (prober.get_charset_name(), - prober.get_confidence())) + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/Contents/Libraries/Shared/chardet/utf8prober.py b/Contents/Libraries/Shared/chardet/utf8prober.py index 1c0bb5d8f..6c3196cc2 100644 --- a/Contents/Libraries/Shared/chardet/utf8prober.py +++ b/Contents/Libraries/Shared/chardet/utf8prober.py @@ -25,52 +25,58 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from . import constants from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState from .codingstatemachine import CodingStateMachine -from .mbcssm import UTF8SMModel +from .mbcssm import UTF8_SM_MODEL -ONE_CHAR_PROB = 0.5 class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + def __init__(self): - CharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(UTF8SMModel) + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None self.reset() def reset(self): - CharSetProber.reset(self) - self._mCodingSM.reset() - self._mNumOfMBChar = 0 + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 - def get_charset_name(self): + @property + def charset_name(self): return "utf-8" - def feed(self, aBuf): - for c in aBuf: - codingState = self._mCodingSM.next_state(c) - if codingState == constants.eError: - self._mState = constants.eNotMe + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT break - elif codingState == constants.eStart: - if self._mCodingSM.get_current_charlen() >= 2: - self._mNumOfMBChar += 1 + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 - if self.get_state() == constants.eDetecting: - if self.get_confidence() > constants.SHORTCUT_THRESHOLD: - self._mState = constants.eFoundIt + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT - return self.get_state() + return self.state def get_confidence(self): unlike = 0.99 - if self._mNumOfMBChar < 6: - for i in range(0, self._mNumOfMBChar): - unlike = unlike * ONE_CHAR_PROB + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars return 1.0 - unlike else: return unlike diff --git a/Contents/Libraries/Shared/chardet/version.py b/Contents/Libraries/Shared/chardet/version.py new file mode 100644 index 000000000..bb2a34a70 --- /dev/null +++ b/Contents/Libraries/Shared/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "3.0.4" +VERSION = __version__.split('.') From 43f51d44f2f7315197053948b7e9bc63dddebb4d Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 30 Oct 2018 17:13:57 +0100 Subject: [PATCH 282/710] core: add idna==2.7 --- Contents/Info.plist | 2 +- Contents/Libraries/Shared/idna/__init__.py | 2 + Contents/Libraries/Shared/idna/codec.py | 118 + Contents/Libraries/Shared/idna/compat.py | 12 + Contents/Libraries/Shared/idna/core.py | 399 + Contents/Libraries/Shared/idna/idnadata.py | 1893 ++++ Contents/Libraries/Shared/idna/intranges.py | 53 + .../Libraries/Shared/idna/package_data.py | 2 + Contents/Libraries/Shared/idna/uts46data.py | 8179 +++++++++++++++++ .../Libraries/Shared/subliminal_patch/http.py | 2 +- Licenses/idna/LICENSE.rst | 80 + 11 files changed, 10740 insertions(+), 2 deletions(-) create mode 100644 Contents/Libraries/Shared/idna/__init__.py create mode 100644 Contents/Libraries/Shared/idna/codec.py create mode 100644 Contents/Libraries/Shared/idna/compat.py create mode 100644 Contents/Libraries/Shared/idna/core.py create mode 100644 Contents/Libraries/Shared/idna/idnadata.py create mode 100644 Contents/Libraries/Shared/idna/intranges.py create mode 100644 Contents/Libraries/Shared/idna/package_data.py create mode 100644 Contents/Libraries/Shared/idna/uts46data.py create mode 100644 Licenses/idna/LICENSE.rst diff --git a/Contents/Info.plist b/Contents/Info.plist index 5f03f6114..df5fdf226 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -21,7 +21,7 @@ PlexPluginMode Daemon PlexPluginConsoleLogging - 0 + 1 PlexPluginDevMode 1 PlexPluginCodePolicy diff --git a/Contents/Libraries/Shared/idna/__init__.py b/Contents/Libraries/Shared/idna/__init__.py new file mode 100644 index 000000000..847bf9354 --- /dev/null +++ b/Contents/Libraries/Shared/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/Contents/Libraries/Shared/idna/codec.py b/Contents/Libraries/Shared/idna/codec.py new file mode 100644 index 000000000..98c65ead1 --- /dev/null +++ b/Contents/Libraries/Shared/idna/codec.py @@ -0,0 +1,118 @@ +from .core import encode, decode, alabel, ulabel, IDNAError +import codecs +import re + +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +class Codec(codecs.Codec): + + def encode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return "", 0 + + return encode(data), len(data) + + def decode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return u"", 0 + + return decode(data), len(data) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return ("", 0) + + labels = _unicode_dots_re.split(data) + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return (u"", 0) + + # IDNA allows decoding to operate on Unicode strings, too. + if isinstance(data, unicode): + labels = _unicode_dots_re.split(data) + else: + # Must be ASCII string + data = str(data) + unicode(data, "ascii") + labels = data.split(".") + + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = u'.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = u'.' + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result = u".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + +class StreamReader(Codec, codecs.StreamReader): + pass + +def getregentry(): + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/Contents/Libraries/Shared/idna/compat.py b/Contents/Libraries/Shared/idna/compat.py new file mode 100644 index 000000000..4d47f336d --- /dev/null +++ b/Contents/Libraries/Shared/idna/compat.py @@ -0,0 +1,12 @@ +from .core import * +from .codec import * + +def ToASCII(label): + return encode(label) + +def ToUnicode(label): + return decode(label) + +def nameprep(s): + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") + diff --git a/Contents/Libraries/Shared/idna/core.py b/Contents/Libraries/Shared/idna/core.py new file mode 100644 index 000000000..090c2c18d --- /dev/null +++ b/Contents/Libraries/Shared/idna/core.py @@ -0,0 +1,399 @@ +from . import idnadata +import bisect +import unicodedata +import re +import sys +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b'xn--' +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +if sys.version_info[0] == 3: + unicode = str + unichr = chr + +class IDNAError(UnicodeError): + """ Base exception for all IDNA-encoding related problems """ + pass + + +class IDNABidiError(IDNAError): + """ Exception when bidirectional requirements are not satisfied """ + pass + + +class InvalidCodepoint(IDNAError): + """ Exception when a disallowed or unallocated codepoint is used """ + pass + + +class InvalidCodepointContext(IDNAError): + """ Exception when the codepoint is not valid in the context it is used """ + pass + + +def _combining_class(cp): + v = unicodedata.combining(unichr(cp)) + if v == 0: + if not unicodedata.name(unichr(cp)): + raise ValueError("Unknown character in unicodedata") + return v + +def _is_script(cp, script): + return intranges_contain(ord(cp), idnadata.scripts[script]) + +def _punycode(s): + return s.encode('punycode') + +def _unot(s): + return 'U+{0:04X}'.format(s) + + +def valid_label_length(label): + + if len(label) > 63: + return False + return True + + +def valid_string_length(label, trailing_dot): + + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label, check_ltr=False): + + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == '': + # String likely comes from a newer version of Unicode + raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) + if direction in ['R', 'AL', 'AN']: + bidi_label = True + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ['R', 'AL']: + rtl = True + elif direction == 'L': + rtl = False + else: + raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) + + valid_ending = False + number_type = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) + # Bidi rule 3 + if direction in ['R', 'AL', 'EN', 'AN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + # Bidi rule 4 + if direction in ['AN', 'EN']: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError('Can not mix numeral types in a right-to-left label') + else: + # Bidi rule 5 + if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) + # Bidi rule 6 + if direction in ['L', 'EN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + + if not valid_ending: + raise IDNABidiError('Label ends with illegal codepoint directionality') + + return True + + +def check_initial_combiner(label): + + if unicodedata.category(label[0])[0] == 'M': + raise IDNAError('Label begins with an illegal combining character') + return True + + +def check_hyphen_ok(label): + + if label[2:4] == '--': + raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') + if label[0] == '-' or label[-1] == '-': + raise IDNAError('Label must not start or end with a hyphen') + return True + + +def check_nfc(label): + + if unicodedata.normalize('NFC', label) != label: + raise IDNAError('Label must be in Normalization Form C') + + +def valid_contextj(label, pos): + + cp_value = ord(label[pos]) + + if cp_value == 0x200c: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos-1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('L'), ord('D')]: + ok = True + break + + if not ok: + return False + + ok = False + for i in range(pos+1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('R'), ord('D')]: + ok = True + break + return ok + + if cp_value == 0x200d: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + + return False + + +def valid_contexto(label, pos, exception=False): + + cp_value = ord(label[pos]) + + if cp_value == 0x00b7: + if 0 < pos < len(label)-1: + if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label)-1 and len(label) > 1: + return _is_script(label[pos + 1], 'Greek') + return False + + elif cp_value == 0x05f3 or cp_value == 0x05f4: + if pos > 0: + return _is_script(label[pos - 1], 'Hebrew') + return False + + elif cp_value == 0x30fb: + for cp in label: + if cp == u'\u30fb': + continue + if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6f0 <= ord(cp) <= 0x06f9: + return False + return True + + elif 0x6f0 <= cp_value <= 0x6f9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + +def check_label(label): + + if isinstance(label, (bytes, bytearray)): + label = label.decode('utf-8') + if len(label) == 0: + raise IDNAError('Empty Label') + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for (pos, cp) in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + except ValueError: + raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + if not valid_contexto(label, pos): + raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) + else: + raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) + + check_bidi(label) + + +def alabel(label): + + try: + label = label.encode('ascii') + try: + ulabel(label) + except IDNAError: + raise IDNAError('The label {0} is not a valid A-label'.format(label)) + if not valid_label_length(label): + raise IDNAError('Label too long') + return label + except UnicodeEncodeError: + pass + + if not label: + raise IDNAError('No Input') + + label = unicode(label) + check_label(label) + label = _punycode(label) + label = _alabel_prefix + label + + if not valid_label_length(label): + raise IDNAError('Label too long') + + return label + + +def ulabel(label): + + if not isinstance(label, (bytes, bytearray)): + try: + label = label.encode('ascii') + except UnicodeEncodeError: + check_label(label) + return label + + label = label.lower() + if label.startswith(_alabel_prefix): + label = label[len(_alabel_prefix):] + else: + check_label(label) + return label.decode('ascii') + + label = label.decode('punycode') + check_label(label) + return label + + +def uts46_remap(domain, std3_rules=True, transitional=False): + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + output = u"" + try: + for pos, char in enumerate(domain): + code_point = ord(char) + uts46row = uts46data[code_point if code_point < 256 else + bisect.bisect_left(uts46data, (code_point, "Z")) - 1] + status = uts46row[1] + replacement = uts46row[2] if len(uts46row) == 3 else None + if (status == "V" or + (status == "D" and not transitional) or + (status == "3" and not std3_rules and replacement is None)): + output += char + elif replacement is not None and (status == "M" or + (status == "3" and not std3_rules) or + (status == "D" and transitional)): + output += replacement + elif status != "I": + raise IndexError() + return unicodedata.normalize("NFC", output) + except IndexError: + raise InvalidCodepoint( + "Codepoint {0} not allowed at position {1} in {2}".format( + _unot(code_point), pos + 1, repr(domain))) + + +def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split('.') + else: + labels = _unicode_dots_re.split(s) + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if labels[-1] == '': + del labels[-1] + trailing_dot = True + for label in labels: + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(b'') + s = b'.'.join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError('Domain too long') + return s + + +def decode(s, strict=False, uts46=False, std3_rules=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split(u'.') + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(u'') + return u'.'.join(result) diff --git a/Contents/Libraries/Shared/idna/idnadata.py b/Contents/Libraries/Shared/idna/idnadata.py new file mode 100644 index 000000000..17974e233 --- /dev/null +++ b/Contents/Libraries/Shared/idna/idnadata.py @@ -0,0 +1,1893 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "10.0.0" +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 0x37f00000380, + 0x38400000385, + 0x38600000387, + 0x3880000038b, + 0x38c0000038d, + 0x38e000003a2, + 0x3a3000003e2, + 0x3f000000400, + 0x1d2600001d2b, + 0x1d5d00001d62, + 0x1d6600001d6b, + 0x1dbf00001dc0, + 0x1f0000001f16, + 0x1f1800001f1e, + 0x1f2000001f46, + 0x1f4800001f4e, + 0x1f5000001f58, + 0x1f5900001f5a, + 0x1f5b00001f5c, + 0x1f5d00001f5e, + 0x1f5f00001f7e, + 0x1f8000001fb5, + 0x1fb600001fc5, + 0x1fc600001fd4, + 0x1fd600001fdc, + 0x1fdd00001ff0, + 0x1ff200001ff5, + 0x1ff600001fff, + 0x212600002127, + 0xab650000ab66, + 0x101400001018f, + 0x101a0000101a1, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004db6, + 0x4e0000009feb, + 0xf9000000fa6e, + 0xfa700000fada, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x2f8000002fa1e, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5f0000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b11f, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1b0000001b001, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 85, + 0x605: 85, + 0x608: 85, + 0x60b: 85, + 0x620: 68, + 0x621: 85, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62a: 68, + 0x62b: 68, + 0x62c: 68, + 0x62d: 68, + 0x62e: 68, + 0x62f: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63a: 68, + 0x63b: 68, + 0x63c: 68, + 0x63d: 68, + 0x63e: 68, + 0x63f: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64a: 68, + 0x66e: 68, + 0x66f: 68, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x674: 85, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67a: 68, + 0x67b: 68, + 0x67c: 68, + 0x67d: 68, + 0x67e: 68, + 0x67f: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68a: 82, + 0x68b: 82, + 0x68c: 82, + 0x68d: 82, + 0x68e: 82, + 0x68f: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69a: 68, + 0x69b: 68, + 0x69c: 68, + 0x69d: 68, + 0x69e: 68, + 0x69f: 68, + 0x6a0: 68, + 0x6a1: 68, + 0x6a2: 68, + 0x6a3: 68, + 0x6a4: 68, + 0x6a5: 68, + 0x6a6: 68, + 0x6a7: 68, + 0x6a8: 68, + 0x6a9: 68, + 0x6aa: 68, + 0x6ab: 68, + 0x6ac: 68, + 0x6ad: 68, + 0x6ae: 68, + 0x6af: 68, + 0x6b0: 68, + 0x6b1: 68, + 0x6b2: 68, + 0x6b3: 68, + 0x6b4: 68, + 0x6b5: 68, + 0x6b6: 68, + 0x6b7: 68, + 0x6b8: 68, + 0x6b9: 68, + 0x6ba: 68, + 0x6bb: 68, + 0x6bc: 68, + 0x6bd: 68, + 0x6be: 68, + 0x6bf: 68, + 0x6c0: 82, + 0x6c1: 68, + 0x6c2: 68, + 0x6c3: 82, + 0x6c4: 82, + 0x6c5: 82, + 0x6c6: 82, + 0x6c7: 82, + 0x6c8: 82, + 0x6c9: 82, + 0x6ca: 82, + 0x6cb: 82, + 0x6cc: 68, + 0x6cd: 82, + 0x6ce: 68, + 0x6cf: 82, + 0x6d0: 68, + 0x6d1: 68, + 0x6d2: 82, + 0x6d3: 82, + 0x6d5: 82, + 0x6dd: 85, + 0x6ee: 82, + 0x6ef: 82, + 0x6fa: 68, + 0x6fb: 68, + 0x6fc: 68, + 0x6ff: 68, + 0x710: 82, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71a: 68, + 0x71b: 68, + 0x71c: 68, + 0x71d: 68, + 0x71e: 82, + 0x71f: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72a: 82, + 0x72b: 68, + 0x72c: 82, + 0x72d: 68, + 0x72e: 68, + 0x72f: 82, + 0x74d: 82, + 0x74e: 68, + 0x74f: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75a: 82, + 0x75b: 82, + 0x75c: 68, + 0x75d: 68, + 0x75e: 68, + 0x75f: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76a: 68, + 0x76b: 82, + 0x76c: 82, + 0x76d: 68, + 0x76e: 68, + 0x76f: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77a: 68, + 0x77b: 68, + 0x77c: 68, + 0x77d: 68, + 0x77e: 68, + 0x77f: 68, + 0x7ca: 68, + 0x7cb: 68, + 0x7cc: 68, + 0x7cd: 68, + 0x7ce: 68, + 0x7cf: 68, + 0x7d0: 68, + 0x7d1: 68, + 0x7d2: 68, + 0x7d3: 68, + 0x7d4: 68, + 0x7d5: 68, + 0x7d6: 68, + 0x7d7: 68, + 0x7d8: 68, + 0x7d9: 68, + 0x7da: 68, + 0x7db: 68, + 0x7dc: 68, + 0x7dd: 68, + 0x7de: 68, + 0x7df: 68, + 0x7e0: 68, + 0x7e1: 68, + 0x7e2: 68, + 0x7e3: 68, + 0x7e4: 68, + 0x7e5: 68, + 0x7e6: 68, + 0x7e7: 68, + 0x7e8: 68, + 0x7e9: 68, + 0x7ea: 68, + 0x7fa: 67, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 82, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 85, + 0x857: 85, + 0x858: 85, + 0x860: 68, + 0x861: 85, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x866: 85, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86a: 82, + 0x8a0: 68, + 0x8a1: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 0x8ad: 85, + 0x8ae: 82, + 0x8af: 68, + 0x8b0: 68, + 0x8b1: 82, + 0x8b2: 82, + 0x8b3: 68, + 0x8b4: 68, + 0x8b6: 68, + 0x8b7: 68, + 0x8b8: 68, + 0x8b9: 82, + 0x8ba: 68, + 0x8bb: 68, + 0x8bc: 68, + 0x8bd: 68, + 0x8e2: 85, + 0x1806: 85, + 0x1807: 68, + 0x180a: 67, + 0x180e: 85, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182a: 68, + 0x182b: 68, + 0x182c: 68, + 0x182d: 68, + 0x182e: 68, + 0x182f: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183a: 68, + 0x183b: 68, + 0x183c: 68, + 0x183d: 68, + 0x183e: 68, + 0x183f: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184a: 68, + 0x184b: 68, + 0x184c: 68, + 0x184d: 68, + 0x184e: 68, + 0x184f: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185a: 68, + 0x185b: 68, + 0x185c: 68, + 0x185d: 68, + 0x185e: 68, + 0x185f: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186a: 68, + 0x186b: 68, + 0x186c: 68, + 0x186d: 68, + 0x186e: 68, + 0x186f: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188a: 68, + 0x188b: 68, + 0x188c: 68, + 0x188d: 68, + 0x188e: 68, + 0x188f: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189a: 68, + 0x189b: 68, + 0x189c: 68, + 0x189d: 68, + 0x189e: 68, + 0x189f: 68, + 0x18a0: 68, + 0x18a1: 68, + 0x18a2: 68, + 0x18a3: 68, + 0x18a4: 68, + 0x18a5: 68, + 0x18a6: 68, + 0x18a7: 68, + 0x18a8: 68, + 0x18aa: 68, + 0x200c: 85, + 0x200d: 67, + 0x202f: 85, + 0x2066: 85, + 0x2067: 85, + 0x2068: 85, + 0x2069: 85, + 0xa840: 68, + 0xa841: 68, + 0xa842: 68, + 0xa843: 68, + 0xa844: 68, + 0xa845: 68, + 0xa846: 68, + 0xa847: 68, + 0xa848: 68, + 0xa849: 68, + 0xa84a: 68, + 0xa84b: 68, + 0xa84c: 68, + 0xa84d: 68, + 0xa84e: 68, + 0xa84f: 68, + 0xa850: 68, + 0xa851: 68, + 0xa852: 68, + 0xa853: 68, + 0xa854: 68, + 0xa855: 68, + 0xa856: 68, + 0xa857: 68, + 0xa858: 68, + 0xa859: 68, + 0xa85a: 68, + 0xa85b: 68, + 0xa85c: 68, + 0xa85d: 68, + 0xa85e: 68, + 0xa85f: 68, + 0xa860: 68, + 0xa861: 68, + 0xa862: 68, + 0xa863: 68, + 0xa864: 68, + 0xa865: 68, + 0xa866: 68, + 0xa867: 68, + 0xa868: 68, + 0xa869: 68, + 0xa86a: 68, + 0xa86b: 68, + 0xa86c: 68, + 0xa86d: 68, + 0xa86e: 68, + 0xa86f: 68, + 0xa870: 68, + 0xa871: 68, + 0xa872: 76, + 0xa873: 85, + 0x10ac0: 68, + 0x10ac1: 68, + 0x10ac2: 68, + 0x10ac3: 68, + 0x10ac4: 68, + 0x10ac5: 82, + 0x10ac6: 85, + 0x10ac7: 82, + 0x10ac8: 85, + 0x10ac9: 82, + 0x10aca: 82, + 0x10acb: 85, + 0x10acc: 85, + 0x10acd: 76, + 0x10ace: 82, + 0x10acf: 82, + 0x10ad0: 82, + 0x10ad1: 82, + 0x10ad2: 82, + 0x10ad3: 68, + 0x10ad4: 68, + 0x10ad5: 68, + 0x10ad6: 68, + 0x10ad7: 76, + 0x10ad8: 68, + 0x10ad9: 68, + 0x10ada: 68, + 0x10adb: 68, + 0x10adc: 68, + 0x10add: 82, + 0x10ade: 68, + 0x10adf: 68, + 0x10ae0: 68, + 0x10ae1: 82, + 0x10ae2: 85, + 0x10ae3: 85, + 0x10ae4: 82, + 0x10aeb: 68, + 0x10aec: 68, + 0x10aed: 68, + 0x10aee: 68, + 0x10aef: 82, + 0x10b80: 68, + 0x10b81: 82, + 0x10b82: 68, + 0x10b83: 82, + 0x10b84: 82, + 0x10b85: 82, + 0x10b86: 68, + 0x10b87: 68, + 0x10b88: 68, + 0x10b89: 82, + 0x10b8a: 68, + 0x10b8b: 68, + 0x10b8c: 82, + 0x10b8d: 68, + 0x10b8e: 82, + 0x10b8f: 82, + 0x10b90: 68, + 0x10b91: 82, + 0x10ba9: 82, + 0x10baa: 82, + 0x10bab: 82, + 0x10bac: 82, + 0x10bad: 68, + 0x10bae: 68, + 0x10baf: 85, + 0x1e900: 68, + 0x1e901: 68, + 0x1e902: 68, + 0x1e903: 68, + 0x1e904: 68, + 0x1e905: 68, + 0x1e906: 68, + 0x1e907: 68, + 0x1e908: 68, + 0x1e909: 68, + 0x1e90a: 68, + 0x1e90b: 68, + 0x1e90c: 68, + 0x1e90d: 68, + 0x1e90e: 68, + 0x1e90f: 68, + 0x1e910: 68, + 0x1e911: 68, + 0x1e912: 68, + 0x1e913: 68, + 0x1e914: 68, + 0x1e915: 68, + 0x1e916: 68, + 0x1e917: 68, + 0x1e918: 68, + 0x1e919: 68, + 0x1e91a: 68, + 0x1e91b: 68, + 0x1e91c: 68, + 0x1e91d: 68, + 0x1e91e: 68, + 0x1e91f: 68, + 0x1e920: 68, + 0x1e921: 68, + 0x1e922: 68, + 0x1e923: 68, + 0x1e924: 68, + 0x1e925: 68, + 0x1e926: 68, + 0x1e927: 68, + 0x1e928: 68, + 0x1e929: 68, + 0x1e92a: 68, + 0x1e92b: 68, + 0x1e92c: 68, + 0x1e92d: 68, + 0x1e92e: 68, + 0x1e92f: 68, + 0x1e930: 68, + 0x1e931: 68, + 0x1e932: 68, + 0x1e933: 68, + 0x1e934: 68, + 0x1e935: 68, + 0x1e936: 68, + 0x1e937: 68, + 0x1e938: 68, + 0x1e939: 68, + 0x1e93a: 68, + 0x1e93b: 68, + 0x1e93c: 68, + 0x1e93d: 68, + 0x1e93e: 68, + 0x1e93f: 68, + 0x1e940: 68, + 0x1e941: 68, + 0x1e942: 68, + 0x1e943: 68, +} +codepoint_classes = { + 'PVALID': ( + 0x2d0000002e, + 0x300000003a, + 0x610000007b, + 0xdf000000f7, + 0xf800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010a, + 0x10b0000010c, + 0x10d0000010e, + 0x10f00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011a, + 0x11b0000011c, + 0x11d0000011e, + 0x11f00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012a, + 0x12b0000012c, + 0x12d0000012e, + 0x12f00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13a0000013b, + 0x13c0000013d, + 0x13e0000013f, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14b0000014c, + 0x14d0000014e, + 0x14f00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015a, + 0x15b0000015c, + 0x15d0000015e, + 0x15f00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016a, + 0x16b0000016c, + 0x16d0000016e, + 0x16f00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17a0000017b, + 0x17c0000017d, + 0x17e0000017f, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18c0000018e, + 0x19200000193, + 0x19500000196, + 0x1990000019c, + 0x19e0000019f, + 0x1a1000001a2, + 0x1a3000001a4, + 0x1a5000001a6, + 0x1a8000001a9, + 0x1aa000001ac, + 0x1ad000001ae, + 0x1b0000001b1, + 0x1b4000001b5, + 0x1b6000001b7, + 0x1b9000001bc, + 0x1bd000001c4, + 0x1ce000001cf, + 0x1d0000001d1, + 0x1d2000001d3, + 0x1d4000001d5, + 0x1d6000001d7, + 0x1d8000001d9, + 0x1da000001db, + 0x1dc000001de, + 0x1df000001e0, + 0x1e1000001e2, + 0x1e3000001e4, + 0x1e5000001e6, + 0x1e7000001e8, + 0x1e9000001ea, + 0x1eb000001ec, + 0x1ed000001ee, + 0x1ef000001f1, + 0x1f5000001f6, + 0x1f9000001fa, + 0x1fb000001fc, + 0x1fd000001fe, + 0x1ff00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020a, + 0x20b0000020c, + 0x20d0000020e, + 0x20f00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021a, + 0x21b0000021c, + 0x21d0000021e, + 0x21f00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022a, + 0x22b0000022c, + 0x22d0000022e, + 0x22f00000230, + 0x23100000232, + 0x2330000023a, + 0x23c0000023d, + 0x23f00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024a, + 0x24b0000024c, + 0x24d0000024e, + 0x24f000002b0, + 0x2b9000002c2, + 0x2c6000002d2, + 0x2ec000002ed, + 0x2ee000002ef, + 0x30000000340, + 0x34200000343, + 0x3460000034f, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37b0000037e, + 0x39000000391, + 0x3ac000003cf, + 0x3d7000003d8, + 0x3d9000003da, + 0x3db000003dc, + 0x3dd000003de, + 0x3df000003e0, + 0x3e1000003e2, + 0x3e3000003e4, + 0x3e5000003e6, + 0x3e7000003e8, + 0x3e9000003ea, + 0x3eb000003ec, + 0x3ed000003ee, + 0x3ef000003f0, + 0x3f3000003f4, + 0x3f8000003f9, + 0x3fb000003fd, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046a, + 0x46b0000046c, + 0x46d0000046e, + 0x46f00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047a, + 0x47b0000047c, + 0x47d0000047e, + 0x47f00000480, + 0x48100000482, + 0x48300000488, + 0x48b0000048c, + 0x48d0000048e, + 0x48f00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049a, + 0x49b0000049c, + 0x49d0000049e, + 0x49f000004a0, + 0x4a1000004a2, + 0x4a3000004a4, + 0x4a5000004a6, + 0x4a7000004a8, + 0x4a9000004aa, + 0x4ab000004ac, + 0x4ad000004ae, + 0x4af000004b0, + 0x4b1000004b2, + 0x4b3000004b4, + 0x4b5000004b6, + 0x4b7000004b8, + 0x4b9000004ba, + 0x4bb000004bc, + 0x4bd000004be, + 0x4bf000004c0, + 0x4c2000004c3, + 0x4c4000004c5, + 0x4c6000004c7, + 0x4c8000004c9, + 0x4ca000004cb, + 0x4cc000004cd, + 0x4ce000004d0, + 0x4d1000004d2, + 0x4d3000004d4, + 0x4d5000004d6, + 0x4d7000004d8, + 0x4d9000004da, + 0x4db000004dc, + 0x4dd000004de, + 0x4df000004e0, + 0x4e1000004e2, + 0x4e3000004e4, + 0x4e5000004e6, + 0x4e7000004e8, + 0x4e9000004ea, + 0x4eb000004ec, + 0x4ed000004ee, + 0x4ef000004f0, + 0x4f1000004f2, + 0x4f3000004f4, + 0x4f5000004f6, + 0x4f7000004f8, + 0x4f9000004fa, + 0x4fb000004fc, + 0x4fd000004fe, + 0x4ff00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050a, + 0x50b0000050c, + 0x50d0000050e, + 0x50f00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051a, + 0x51b0000051c, + 0x51d0000051e, + 0x51f00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5290000052a, + 0x52b0000052c, + 0x52d0000052e, + 0x52f00000530, + 0x5590000055a, + 0x56100000587, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5f0000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x8000000082e, + 0x8400000085c, + 0x8600000086b, + 0x8a0000008b5, + 0x8b6000008be, + 0x8d4000008e2, + 0x8e300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0x9fc000009fd, + 0xa0100000a04, + 0xa0500000a0b, + 0xa0f00000a11, + 0xa1300000a29, + 0xa2a00000a31, + 0xa3200000a33, + 0xa3500000a36, + 0xa3800000a3a, + 0xa3c00000a3d, + 0xa3e00000a43, + 0xa4700000a49, + 0xa4b00000a4e, + 0xa5100000a52, + 0xa5c00000a5d, + 0xa6600000a76, + 0xa8100000a84, + 0xa8500000a8e, + 0xa8f00000a92, + 0xa9300000aa9, + 0xaaa00000ab1, + 0xab200000ab4, + 0xab500000aba, + 0xabc00000ac6, + 0xac700000aca, + 0xacb00000ace, + 0xad000000ad1, + 0xae000000ae4, + 0xae600000af0, + 0xaf900000b00, + 0xb0100000b04, + 0xb0500000b0d, + 0xb0f00000b11, + 0xb1300000b29, + 0xb2a00000b31, + 0xb3200000b34, + 0xb3500000b3a, + 0xb3c00000b45, + 0xb4700000b49, + 0xb4b00000b4e, + 0xb5600000b58, + 0xb5f00000b64, + 0xb6600000b70, + 0xb7100000b72, + 0xb8200000b84, + 0xb8500000b8b, + 0xb8e00000b91, + 0xb9200000b96, + 0xb9900000b9b, + 0xb9c00000b9d, + 0xb9e00000ba0, + 0xba300000ba5, + 0xba800000bab, + 0xbae00000bba, + 0xbbe00000bc3, + 0xbc600000bc9, + 0xbca00000bce, + 0xbd000000bd1, + 0xbd700000bd8, + 0xbe600000bf0, + 0xc0000000c04, + 0xc0500000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c3a, + 0xc3d00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5b, + 0xc6000000c64, + 0xc6600000c70, + 0xc8000000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcde00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, + 0xd0000000d04, + 0xd0500000d0d, + 0xd0e00000d11, + 0xd1200000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5400000d58, + 0xd5f00000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8200000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 0xde600000df0, + 0xdf200000df4, + 0xe0100000e33, + 0xe3400000e3b, + 0xe4000000e4f, + 0xe5000000e5a, + 0xe8100000e83, + 0xe8400000e85, + 0xe8700000e89, + 0xe8a00000e8b, + 0xe8d00000e8e, + 0xe9400000e98, + 0xe9900000ea0, + 0xea100000ea4, + 0xea500000ea6, + 0xea700000ea8, + 0xeaa00000eac, + 0xead00000eb3, + 0xeb400000eba, + 0xebb00000ebe, + 0xec000000ec5, + 0xec600000ec7, + 0xec800000ece, + 0xed000000eda, + 0xede00000ee0, + 0xf0000000f01, + 0xf0b00000f0c, + 0xf1800000f1a, + 0xf2000000f2a, + 0xf3500000f36, + 0xf3700000f38, + 0xf3900000f3a, + 0xf3e00000f43, + 0xf4400000f48, + 0xf4900000f4d, + 0xf4e00000f52, + 0xf5300000f57, + 0xf5800000f5c, + 0xf5d00000f69, + 0xf6a00000f6d, + 0xf7100000f73, + 0xf7400000f75, + 0xf7a00000f81, + 0xf8200000f85, + 0xf8600000f93, + 0xf9400000f98, + 0xf9900000f9d, + 0xf9e00000fa2, + 0xfa300000fa7, + 0xfa800000fac, + 0xfad00000fb9, + 0xfba00000fbd, + 0xfc600000fc7, + 0x10000000104a, + 0x10500000109e, + 0x10d0000010fb, + 0x10fd00001100, + 0x120000001249, + 0x124a0000124e, + 0x125000001257, + 0x125800001259, + 0x125a0000125e, + 0x126000001289, + 0x128a0000128e, + 0x1290000012b1, + 0x12b2000012b6, + 0x12b8000012bf, + 0x12c0000012c1, + 0x12c2000012c6, + 0x12c8000012d7, + 0x12d800001311, + 0x131200001316, + 0x13180000135b, + 0x135d00001360, + 0x138000001390, + 0x13a0000013f6, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x16f1000016f9, + 0x17000000170d, + 0x170e00001715, + 0x172000001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001878, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191f, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1ab000001abe, + 0x1b0000001b4c, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cfa, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001dfa, + 0x1dfb00001e00, + 0x1e0100001e02, + 0x1e0300001e04, + 0x1e0500001e06, + 0x1e0700001e08, + 0x1e0900001e0a, + 0x1e0b00001e0c, + 0x1e0d00001e0e, + 0x1e0f00001e10, + 0x1e1100001e12, + 0x1e1300001e14, + 0x1e1500001e16, + 0x1e1700001e18, + 0x1e1900001e1a, + 0x1e1b00001e1c, + 0x1e1d00001e1e, + 0x1e1f00001e20, + 0x1e2100001e22, + 0x1e2300001e24, + 0x1e2500001e26, + 0x1e2700001e28, + 0x1e2900001e2a, + 0x1e2b00001e2c, + 0x1e2d00001e2e, + 0x1e2f00001e30, + 0x1e3100001e32, + 0x1e3300001e34, + 0x1e3500001e36, + 0x1e3700001e38, + 0x1e3900001e3a, + 0x1e3b00001e3c, + 0x1e3d00001e3e, + 0x1e3f00001e40, + 0x1e4100001e42, + 0x1e4300001e44, + 0x1e4500001e46, + 0x1e4700001e48, + 0x1e4900001e4a, + 0x1e4b00001e4c, + 0x1e4d00001e4e, + 0x1e4f00001e50, + 0x1e5100001e52, + 0x1e5300001e54, + 0x1e5500001e56, + 0x1e5700001e58, + 0x1e5900001e5a, + 0x1e5b00001e5c, + 0x1e5d00001e5e, + 0x1e5f00001e60, + 0x1e6100001e62, + 0x1e6300001e64, + 0x1e6500001e66, + 0x1e6700001e68, + 0x1e6900001e6a, + 0x1e6b00001e6c, + 0x1e6d00001e6e, + 0x1e6f00001e70, + 0x1e7100001e72, + 0x1e7300001e74, + 0x1e7500001e76, + 0x1e7700001e78, + 0x1e7900001e7a, + 0x1e7b00001e7c, + 0x1e7d00001e7e, + 0x1e7f00001e80, + 0x1e8100001e82, + 0x1e8300001e84, + 0x1e8500001e86, + 0x1e8700001e88, + 0x1e8900001e8a, + 0x1e8b00001e8c, + 0x1e8d00001e8e, + 0x1e8f00001e90, + 0x1e9100001e92, + 0x1e9300001e94, + 0x1e9500001e9a, + 0x1e9c00001e9e, + 0x1e9f00001ea0, + 0x1ea100001ea2, + 0x1ea300001ea4, + 0x1ea500001ea6, + 0x1ea700001ea8, + 0x1ea900001eaa, + 0x1eab00001eac, + 0x1ead00001eae, + 0x1eaf00001eb0, + 0x1eb100001eb2, + 0x1eb300001eb4, + 0x1eb500001eb6, + 0x1eb700001eb8, + 0x1eb900001eba, + 0x1ebb00001ebc, + 0x1ebd00001ebe, + 0x1ebf00001ec0, + 0x1ec100001ec2, + 0x1ec300001ec4, + 0x1ec500001ec6, + 0x1ec700001ec8, + 0x1ec900001eca, + 0x1ecb00001ecc, + 0x1ecd00001ece, + 0x1ecf00001ed0, + 0x1ed100001ed2, + 0x1ed300001ed4, + 0x1ed500001ed6, + 0x1ed700001ed8, + 0x1ed900001eda, + 0x1edb00001edc, + 0x1edd00001ede, + 0x1edf00001ee0, + 0x1ee100001ee2, + 0x1ee300001ee4, + 0x1ee500001ee6, + 0x1ee700001ee8, + 0x1ee900001eea, + 0x1eeb00001eec, + 0x1eed00001eee, + 0x1eef00001ef0, + 0x1ef100001ef2, + 0x1ef300001ef4, + 0x1ef500001ef6, + 0x1ef700001ef8, + 0x1ef900001efa, + 0x1efb00001efc, + 0x1efd00001efe, + 0x1eff00001f08, + 0x1f1000001f16, + 0x1f2000001f28, + 0x1f3000001f38, + 0x1f4000001f46, + 0x1f5000001f58, + 0x1f6000001f68, + 0x1f7000001f71, + 0x1f7200001f73, + 0x1f7400001f75, + 0x1f7600001f77, + 0x1f7800001f79, + 0x1f7a00001f7b, + 0x1f7c00001f7d, + 0x1fb000001fb2, + 0x1fb600001fb7, + 0x1fc600001fc7, + 0x1fd000001fd3, + 0x1fd600001fd8, + 0x1fe000001fe3, + 0x1fe400001fe8, + 0x1ff600001ff7, + 0x214e0000214f, + 0x218400002185, + 0x2c3000002c5f, + 0x2c6100002c62, + 0x2c6500002c67, + 0x2c6800002c69, + 0x2c6a00002c6b, + 0x2c6c00002c6d, + 0x2c7100002c72, + 0x2c7300002c75, + 0x2c7600002c7c, + 0x2c8100002c82, + 0x2c8300002c84, + 0x2c8500002c86, + 0x2c8700002c88, + 0x2c8900002c8a, + 0x2c8b00002c8c, + 0x2c8d00002c8e, + 0x2c8f00002c90, + 0x2c9100002c92, + 0x2c9300002c94, + 0x2c9500002c96, + 0x2c9700002c98, + 0x2c9900002c9a, + 0x2c9b00002c9c, + 0x2c9d00002c9e, + 0x2c9f00002ca0, + 0x2ca100002ca2, + 0x2ca300002ca4, + 0x2ca500002ca6, + 0x2ca700002ca8, + 0x2ca900002caa, + 0x2cab00002cac, + 0x2cad00002cae, + 0x2caf00002cb0, + 0x2cb100002cb2, + 0x2cb300002cb4, + 0x2cb500002cb6, + 0x2cb700002cb8, + 0x2cb900002cba, + 0x2cbb00002cbc, + 0x2cbd00002cbe, + 0x2cbf00002cc0, + 0x2cc100002cc2, + 0x2cc300002cc4, + 0x2cc500002cc6, + 0x2cc700002cc8, + 0x2cc900002cca, + 0x2ccb00002ccc, + 0x2ccd00002cce, + 0x2ccf00002cd0, + 0x2cd100002cd2, + 0x2cd300002cd4, + 0x2cd500002cd6, + 0x2cd700002cd8, + 0x2cd900002cda, + 0x2cdb00002cdc, + 0x2cdd00002cde, + 0x2cdf00002ce0, + 0x2ce100002ce2, + 0x2ce300002ce5, + 0x2cec00002ced, + 0x2cee00002cf2, + 0x2cf300002cf4, + 0x2d0000002d26, + 0x2d2700002d28, + 0x2d2d00002d2e, + 0x2d3000002d68, + 0x2d7f00002d97, + 0x2da000002da7, + 0x2da800002daf, + 0x2db000002db7, + 0x2db800002dbf, + 0x2dc000002dc7, + 0x2dc800002dcf, + 0x2dd000002dd7, + 0x2dd800002ddf, + 0x2de000002e00, + 0x2e2f00002e30, + 0x300500003008, + 0x302a0000302e, + 0x303c0000303d, + 0x304100003097, + 0x30990000309b, + 0x309d0000309f, + 0x30a1000030fb, + 0x30fc000030ff, + 0x31050000312f, + 0x31a0000031bb, + 0x31f000003200, + 0x340000004db6, + 0x4e0000009feb, + 0xa0000000a48d, + 0xa4d00000a4fe, + 0xa5000000a60d, + 0xa6100000a62c, + 0xa6410000a642, + 0xa6430000a644, + 0xa6450000a646, + 0xa6470000a648, + 0xa6490000a64a, + 0xa64b0000a64c, + 0xa64d0000a64e, + 0xa64f0000a650, + 0xa6510000a652, + 0xa6530000a654, + 0xa6550000a656, + 0xa6570000a658, + 0xa6590000a65a, + 0xa65b0000a65c, + 0xa65d0000a65e, + 0xa65f0000a660, + 0xa6610000a662, + 0xa6630000a664, + 0xa6650000a666, + 0xa6670000a668, + 0xa6690000a66a, + 0xa66b0000a66c, + 0xa66d0000a670, + 0xa6740000a67e, + 0xa67f0000a680, + 0xa6810000a682, + 0xa6830000a684, + 0xa6850000a686, + 0xa6870000a688, + 0xa6890000a68a, + 0xa68b0000a68c, + 0xa68d0000a68e, + 0xa68f0000a690, + 0xa6910000a692, + 0xa6930000a694, + 0xa6950000a696, + 0xa6970000a698, + 0xa6990000a69a, + 0xa69b0000a69c, + 0xa69e0000a6e6, + 0xa6f00000a6f2, + 0xa7170000a720, + 0xa7230000a724, + 0xa7250000a726, + 0xa7270000a728, + 0xa7290000a72a, + 0xa72b0000a72c, + 0xa72d0000a72e, + 0xa72f0000a732, + 0xa7330000a734, + 0xa7350000a736, + 0xa7370000a738, + 0xa7390000a73a, + 0xa73b0000a73c, + 0xa73d0000a73e, + 0xa73f0000a740, + 0xa7410000a742, + 0xa7430000a744, + 0xa7450000a746, + 0xa7470000a748, + 0xa7490000a74a, + 0xa74b0000a74c, + 0xa74d0000a74e, + 0xa74f0000a750, + 0xa7510000a752, + 0xa7530000a754, + 0xa7550000a756, + 0xa7570000a758, + 0xa7590000a75a, + 0xa75b0000a75c, + 0xa75d0000a75e, + 0xa75f0000a760, + 0xa7610000a762, + 0xa7630000a764, + 0xa7650000a766, + 0xa7670000a768, + 0xa7690000a76a, + 0xa76b0000a76c, + 0xa76d0000a76e, + 0xa76f0000a770, + 0xa7710000a779, + 0xa77a0000a77b, + 0xa77c0000a77d, + 0xa77f0000a780, + 0xa7810000a782, + 0xa7830000a784, + 0xa7850000a786, + 0xa7870000a789, + 0xa78c0000a78d, + 0xa78e0000a790, + 0xa7910000a792, + 0xa7930000a796, + 0xa7970000a798, + 0xa7990000a79a, + 0xa79b0000a79c, + 0xa79d0000a79e, + 0xa79f0000a7a0, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7b50000a7b6, + 0xa7b70000a7b8, + 0xa7f70000a7f8, + 0xa7fa0000a828, + 0xa8400000a874, + 0xa8800000a8c6, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa8fd0000a8fe, + 0xa9000000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xa9e00000a9ff, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xab300000ab5b, + 0xab600000ab66, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe30, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x102e0000102e1, + 0x1030000010320, + 0x1032d00010341, + 0x103420001034a, + 0x103500001037b, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x104d8000104fc, + 0x1050000010528, + 0x1053000010564, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1086000010877, + 0x108800001089f, + 0x108e0000108f3, + 0x108f4000108f6, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a34, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10a8000010a9d, + 0x10ac000010ac8, + 0x10ac900010ae7, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10b8000010b92, + 0x10c0000010c49, + 0x10cc000010cf3, + 0x1100000011047, + 0x1106600011070, + 0x1107f000110bb, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x1115000011174, + 0x1117600011177, + 0x11180000111c5, + 0x111ca000111cd, + 0x111d0000111db, + 0x111dc000111dd, + 0x1120000011212, + 0x1121300011238, + 0x1123e0001123f, + 0x1128000011287, + 0x1128800011289, + 0x1128a0001128e, + 0x1128f0001129e, + 0x1129f000112a9, + 0x112b0000112eb, + 0x112f0000112fa, + 0x1130000011304, + 0x113050001130d, + 0x1130f00011311, + 0x1131300011329, + 0x1132a00011331, + 0x1133200011334, + 0x113350001133a, + 0x1133c00011345, + 0x1134700011349, + 0x1134b0001134e, + 0x1135000011351, + 0x1135700011358, + 0x1135d00011364, + 0x113660001136d, + 0x1137000011375, + 0x114000001144b, + 0x114500001145a, + 0x11480000114c6, + 0x114c7000114c8, + 0x114d0000114da, + 0x11580000115b6, + 0x115b8000115c1, + 0x115d8000115de, + 0x1160000011641, + 0x1164400011645, + 0x116500001165a, + 0x11680000116b8, + 0x116c0000116ca, + 0x117000001171a, + 0x1171d0001172c, + 0x117300001173a, + 0x118c0000118ea, + 0x118ff00011900, + 0x11a0000011a3f, + 0x11a4700011a48, + 0x11a5000011a84, + 0x11a8600011a9a, + 0x11ac000011af9, + 0x11c0000011c09, + 0x11c0a00011c37, + 0x11c3800011c41, + 0x11c5000011c5a, + 0x11c7200011c90, + 0x11c9200011ca8, + 0x11ca900011cb7, + 0x11d0000011d07, + 0x11d0800011d0a, + 0x11d0b00011d37, + 0x11d3a00011d3b, + 0x11d3c00011d3e, + 0x11d3f00011d48, + 0x11d5000011d5a, + 0x120000001239a, + 0x1248000012544, + 0x130000001342f, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, + 0x16a6000016a6a, + 0x16ad000016aee, + 0x16af000016af5, + 0x16b0000016b37, + 0x16b4000016b44, + 0x16b5000016b5a, + 0x16b6300016b78, + 0x16b7d00016b90, + 0x16f0000016f45, + 0x16f5000016f7f, + 0x16f8f00016fa0, + 0x16fe000016fe2, + 0x17000000187ed, + 0x1880000018af3, + 0x1b0000001b11f, + 0x1b1700001b2fc, + 0x1bc000001bc6b, + 0x1bc700001bc7d, + 0x1bc800001bc89, + 0x1bc900001bc9a, + 0x1bc9d0001bc9f, + 0x1da000001da37, + 0x1da3b0001da6d, + 0x1da750001da76, + 0x1da840001da85, + 0x1da9b0001daa0, + 0x1daa10001dab0, + 0x1e0000001e007, + 0x1e0080001e019, + 0x1e01b0001e022, + 0x1e0230001e025, + 0x1e0260001e02b, + 0x1e8000001e8c5, + 0x1e8d00001e8d7, + 0x1e9220001e94b, + 0x1e9500001e95a, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/Contents/Libraries/Shared/idna/intranges.py b/Contents/Libraries/Shared/idna/intranges.py new file mode 100644 index 000000000..fa8a73566 --- /dev/null +++ b/Contents/Libraries/Shared/idna/intranges.py @@ -0,0 +1,53 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect + +def intranges_from_list(list_): + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i+1 < len(sorted_list): + if sorted_list[i] == sorted_list[i+1]-1: + continue + current_range = sorted_list[last_write+1:i+1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + +def _encode_range(start, end): + return (start << 32) | end + +def _decode_range(r): + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_, ranges): + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos-1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/Contents/Libraries/Shared/idna/package_data.py b/Contents/Libraries/Shared/idna/package_data.py new file mode 100644 index 000000000..39c192bae --- /dev/null +++ b/Contents/Libraries/Shared/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.7' + diff --git a/Contents/Libraries/Shared/idna/uts46data.py b/Contents/Libraries/Shared/idna/uts46data.py new file mode 100644 index 000000000..79731cb9e --- /dev/null +++ b/Contents/Libraries/Shared/idna/uts46data.py @@ -0,0 +1,8179 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "10.0.0" +def _seg_0(): + return [ + (0x0, '3'), + (0x1, '3'), + (0x2, '3'), + (0x3, '3'), + (0x4, '3'), + (0x5, '3'), + (0x6, '3'), + (0x7, '3'), + (0x8, '3'), + (0x9, '3'), + (0xA, '3'), + (0xB, '3'), + (0xC, '3'), + (0xD, '3'), + (0xE, '3'), + (0xF, '3'), + (0x10, '3'), + (0x11, '3'), + (0x12, '3'), + (0x13, '3'), + (0x14, '3'), + (0x15, '3'), + (0x16, '3'), + (0x17, '3'), + (0x18, '3'), + (0x19, '3'), + (0x1A, '3'), + (0x1B, '3'), + (0x1C, '3'), + (0x1D, '3'), + (0x1E, '3'), + (0x1F, '3'), + (0x20, '3'), + (0x21, '3'), + (0x22, '3'), + (0x23, '3'), + (0x24, '3'), + (0x25, '3'), + (0x26, '3'), + (0x27, '3'), + (0x28, '3'), + (0x29, '3'), + (0x2A, '3'), + (0x2B, '3'), + (0x2C, '3'), + (0x2D, 'V'), + (0x2E, 'V'), + (0x2F, '3'), + (0x30, 'V'), + (0x31, 'V'), + (0x32, 'V'), + (0x33, 'V'), + (0x34, 'V'), + (0x35, 'V'), + (0x36, 'V'), + (0x37, 'V'), + (0x38, 'V'), + (0x39, 'V'), + (0x3A, '3'), + (0x3B, '3'), + (0x3C, '3'), + (0x3D, '3'), + (0x3E, '3'), + (0x3F, '3'), + (0x40, '3'), + (0x41, 'M', u'a'), + (0x42, 'M', u'b'), + (0x43, 'M', u'c'), + (0x44, 'M', u'd'), + (0x45, 'M', u'e'), + (0x46, 'M', u'f'), + (0x47, 'M', u'g'), + (0x48, 'M', u'h'), + (0x49, 'M', u'i'), + (0x4A, 'M', u'j'), + (0x4B, 'M', u'k'), + (0x4C, 'M', u'l'), + (0x4D, 'M', u'm'), + (0x4E, 'M', u'n'), + (0x4F, 'M', u'o'), + (0x50, 'M', u'p'), + (0x51, 'M', u'q'), + (0x52, 'M', u'r'), + (0x53, 'M', u's'), + (0x54, 'M', u't'), + (0x55, 'M', u'u'), + (0x56, 'M', u'v'), + (0x57, 'M', u'w'), + (0x58, 'M', u'x'), + (0x59, 'M', u'y'), + (0x5A, 'M', u'z'), + (0x5B, '3'), + (0x5C, '3'), + (0x5D, '3'), + (0x5E, '3'), + (0x5F, '3'), + (0x60, '3'), + (0x61, 'V'), + (0x62, 'V'), + (0x63, 'V'), + ] + +def _seg_1(): + return [ + (0x64, 'V'), + (0x65, 'V'), + (0x66, 'V'), + (0x67, 'V'), + (0x68, 'V'), + (0x69, 'V'), + (0x6A, 'V'), + (0x6B, 'V'), + (0x6C, 'V'), + (0x6D, 'V'), + (0x6E, 'V'), + (0x6F, 'V'), + (0x70, 'V'), + (0x71, 'V'), + (0x72, 'V'), + (0x73, 'V'), + (0x74, 'V'), + (0x75, 'V'), + (0x76, 'V'), + (0x77, 'V'), + (0x78, 'V'), + (0x79, 'V'), + (0x7A, 'V'), + (0x7B, '3'), + (0x7C, '3'), + (0x7D, '3'), + (0x7E, '3'), + (0x7F, '3'), + (0x80, 'X'), + (0x81, 'X'), + (0x82, 'X'), + (0x83, 'X'), + (0x84, 'X'), + (0x85, 'X'), + (0x86, 'X'), + (0x87, 'X'), + (0x88, 'X'), + (0x89, 'X'), + (0x8A, 'X'), + (0x8B, 'X'), + (0x8C, 'X'), + (0x8D, 'X'), + (0x8E, 'X'), + (0x8F, 'X'), + (0x90, 'X'), + (0x91, 'X'), + (0x92, 'X'), + (0x93, 'X'), + (0x94, 'X'), + (0x95, 'X'), + (0x96, 'X'), + (0x97, 'X'), + (0x98, 'X'), + (0x99, 'X'), + (0x9A, 'X'), + (0x9B, 'X'), + (0x9C, 'X'), + (0x9D, 'X'), + (0x9E, 'X'), + (0x9F, 'X'), + (0xA0, '3', u' '), + (0xA1, 'V'), + (0xA2, 'V'), + (0xA3, 'V'), + (0xA4, 'V'), + (0xA5, 'V'), + (0xA6, 'V'), + (0xA7, 'V'), + (0xA8, '3', u' ̈'), + (0xA9, 'V'), + (0xAA, 'M', u'a'), + (0xAB, 'V'), + (0xAC, 'V'), + (0xAD, 'I'), + (0xAE, 'V'), + (0xAF, '3', u' ̄'), + (0xB0, 'V'), + (0xB1, 'V'), + (0xB2, 'M', u'2'), + (0xB3, 'M', u'3'), + (0xB4, '3', u' ́'), + (0xB5, 'M', u'μ'), + (0xB6, 'V'), + (0xB7, 'V'), + (0xB8, '3', u' ̧'), + (0xB9, 'M', u'1'), + (0xBA, 'M', u'o'), + (0xBB, 'V'), + (0xBC, 'M', u'1⁄4'), + (0xBD, 'M', u'1⁄2'), + (0xBE, 'M', u'3⁄4'), + (0xBF, 'V'), + (0xC0, 'M', u'à'), + (0xC1, 'M', u'á'), + (0xC2, 'M', u'â'), + (0xC3, 'M', u'ã'), + (0xC4, 'M', u'ä'), + (0xC5, 'M', u'å'), + (0xC6, 'M', u'æ'), + (0xC7, 'M', u'ç'), + ] + +def _seg_2(): + return [ + (0xC8, 'M', u'è'), + (0xC9, 'M', u'é'), + (0xCA, 'M', u'ê'), + (0xCB, 'M', u'ë'), + (0xCC, 'M', u'ì'), + (0xCD, 'M', u'í'), + (0xCE, 'M', u'î'), + (0xCF, 'M', u'ï'), + (0xD0, 'M', u'ð'), + (0xD1, 'M', u'ñ'), + (0xD2, 'M', u'ò'), + (0xD3, 'M', u'ó'), + (0xD4, 'M', u'ô'), + (0xD5, 'M', u'õ'), + (0xD6, 'M', u'ö'), + (0xD7, 'V'), + (0xD8, 'M', u'ø'), + (0xD9, 'M', u'ù'), + (0xDA, 'M', u'ú'), + (0xDB, 'M', u'û'), + (0xDC, 'M', u'ü'), + (0xDD, 'M', u'ý'), + (0xDE, 'M', u'þ'), + (0xDF, 'D', u'ss'), + (0xE0, 'V'), + (0xE1, 'V'), + (0xE2, 'V'), + (0xE3, 'V'), + (0xE4, 'V'), + (0xE5, 'V'), + (0xE6, 'V'), + (0xE7, 'V'), + (0xE8, 'V'), + (0xE9, 'V'), + (0xEA, 'V'), + (0xEB, 'V'), + (0xEC, 'V'), + (0xED, 'V'), + (0xEE, 'V'), + (0xEF, 'V'), + (0xF0, 'V'), + (0xF1, 'V'), + (0xF2, 'V'), + (0xF3, 'V'), + (0xF4, 'V'), + (0xF5, 'V'), + (0xF6, 'V'), + (0xF7, 'V'), + (0xF8, 'V'), + (0xF9, 'V'), + (0xFA, 'V'), + (0xFB, 'V'), + (0xFC, 'V'), + (0xFD, 'V'), + (0xFE, 'V'), + (0xFF, 'V'), + (0x100, 'M', u'ā'), + (0x101, 'V'), + (0x102, 'M', u'ă'), + (0x103, 'V'), + (0x104, 'M', u'ą'), + (0x105, 'V'), + (0x106, 'M', u'ć'), + (0x107, 'V'), + (0x108, 'M', u'ĉ'), + (0x109, 'V'), + (0x10A, 'M', u'ċ'), + (0x10B, 'V'), + (0x10C, 'M', u'č'), + (0x10D, 'V'), + (0x10E, 'M', u'ď'), + (0x10F, 'V'), + (0x110, 'M', u'đ'), + (0x111, 'V'), + (0x112, 'M', u'ē'), + (0x113, 'V'), + (0x114, 'M', u'ĕ'), + (0x115, 'V'), + (0x116, 'M', u'ė'), + (0x117, 'V'), + (0x118, 'M', u'ę'), + (0x119, 'V'), + (0x11A, 'M', u'ě'), + (0x11B, 'V'), + (0x11C, 'M', u'ĝ'), + (0x11D, 'V'), + (0x11E, 'M', u'ğ'), + (0x11F, 'V'), + (0x120, 'M', u'ġ'), + (0x121, 'V'), + (0x122, 'M', u'ģ'), + (0x123, 'V'), + (0x124, 'M', u'ĥ'), + (0x125, 'V'), + (0x126, 'M', u'ħ'), + (0x127, 'V'), + (0x128, 'M', u'ĩ'), + (0x129, 'V'), + (0x12A, 'M', u'ī'), + (0x12B, 'V'), + ] + +def _seg_3(): + return [ + (0x12C, 'M', u'ĭ'), + (0x12D, 'V'), + (0x12E, 'M', u'į'), + (0x12F, 'V'), + (0x130, 'M', u'i̇'), + (0x131, 'V'), + (0x132, 'M', u'ij'), + (0x134, 'M', u'ĵ'), + (0x135, 'V'), + (0x136, 'M', u'ķ'), + (0x137, 'V'), + (0x139, 'M', u'ĺ'), + (0x13A, 'V'), + (0x13B, 'M', u'ļ'), + (0x13C, 'V'), + (0x13D, 'M', u'ľ'), + (0x13E, 'V'), + (0x13F, 'M', u'l·'), + (0x141, 'M', u'ł'), + (0x142, 'V'), + (0x143, 'M', u'ń'), + (0x144, 'V'), + (0x145, 'M', u'ņ'), + (0x146, 'V'), + (0x147, 'M', u'ň'), + (0x148, 'V'), + (0x149, 'M', u'ʼn'), + (0x14A, 'M', u'ŋ'), + (0x14B, 'V'), + (0x14C, 'M', u'ō'), + (0x14D, 'V'), + (0x14E, 'M', u'ŏ'), + (0x14F, 'V'), + (0x150, 'M', u'ő'), + (0x151, 'V'), + (0x152, 'M', u'œ'), + (0x153, 'V'), + (0x154, 'M', u'ŕ'), + (0x155, 'V'), + (0x156, 'M', u'ŗ'), + (0x157, 'V'), + (0x158, 'M', u'ř'), + (0x159, 'V'), + (0x15A, 'M', u'ś'), + (0x15B, 'V'), + (0x15C, 'M', u'ŝ'), + (0x15D, 'V'), + (0x15E, 'M', u'ş'), + (0x15F, 'V'), + (0x160, 'M', u'š'), + (0x161, 'V'), + (0x162, 'M', u'ţ'), + (0x163, 'V'), + (0x164, 'M', u'ť'), + (0x165, 'V'), + (0x166, 'M', u'ŧ'), + (0x167, 'V'), + (0x168, 'M', u'ũ'), + (0x169, 'V'), + (0x16A, 'M', u'ū'), + (0x16B, 'V'), + (0x16C, 'M', u'ŭ'), + (0x16D, 'V'), + (0x16E, 'M', u'ů'), + (0x16F, 'V'), + (0x170, 'M', u'ű'), + (0x171, 'V'), + (0x172, 'M', u'ų'), + (0x173, 'V'), + (0x174, 'M', u'ŵ'), + (0x175, 'V'), + (0x176, 'M', u'ŷ'), + (0x177, 'V'), + (0x178, 'M', u'ÿ'), + (0x179, 'M', u'ź'), + (0x17A, 'V'), + (0x17B, 'M', u'ż'), + (0x17C, 'V'), + (0x17D, 'M', u'ž'), + (0x17E, 'V'), + (0x17F, 'M', u's'), + (0x180, 'V'), + (0x181, 'M', u'ɓ'), + (0x182, 'M', u'ƃ'), + (0x183, 'V'), + (0x184, 'M', u'ƅ'), + (0x185, 'V'), + (0x186, 'M', u'ɔ'), + (0x187, 'M', u'ƈ'), + (0x188, 'V'), + (0x189, 'M', u'ɖ'), + (0x18A, 'M', u'ɗ'), + (0x18B, 'M', u'ƌ'), + (0x18C, 'V'), + (0x18E, 'M', u'ǝ'), + (0x18F, 'M', u'ə'), + (0x190, 'M', u'ɛ'), + (0x191, 'M', u'ƒ'), + (0x192, 'V'), + (0x193, 'M', u'ɠ'), + ] + +def _seg_4(): + return [ + (0x194, 'M', u'ɣ'), + (0x195, 'V'), + (0x196, 'M', u'ɩ'), + (0x197, 'M', u'ɨ'), + (0x198, 'M', u'ƙ'), + (0x199, 'V'), + (0x19C, 'M', u'ɯ'), + (0x19D, 'M', u'ɲ'), + (0x19E, 'V'), + (0x19F, 'M', u'ɵ'), + (0x1A0, 'M', u'ơ'), + (0x1A1, 'V'), + (0x1A2, 'M', u'ƣ'), + (0x1A3, 'V'), + (0x1A4, 'M', u'ƥ'), + (0x1A5, 'V'), + (0x1A6, 'M', u'ʀ'), + (0x1A7, 'M', u'ƨ'), + (0x1A8, 'V'), + (0x1A9, 'M', u'ʃ'), + (0x1AA, 'V'), + (0x1AC, 'M', u'ƭ'), + (0x1AD, 'V'), + (0x1AE, 'M', u'ʈ'), + (0x1AF, 'M', u'ư'), + (0x1B0, 'V'), + (0x1B1, 'M', u'ʊ'), + (0x1B2, 'M', u'ʋ'), + (0x1B3, 'M', u'ƴ'), + (0x1B4, 'V'), + (0x1B5, 'M', u'ƶ'), + (0x1B6, 'V'), + (0x1B7, 'M', u'ʒ'), + (0x1B8, 'M', u'ƹ'), + (0x1B9, 'V'), + (0x1BC, 'M', u'ƽ'), + (0x1BD, 'V'), + (0x1C4, 'M', u'dž'), + (0x1C7, 'M', u'lj'), + (0x1CA, 'M', u'nj'), + (0x1CD, 'M', u'ǎ'), + (0x1CE, 'V'), + (0x1CF, 'M', u'ǐ'), + (0x1D0, 'V'), + (0x1D1, 'M', u'ǒ'), + (0x1D2, 'V'), + (0x1D3, 'M', u'ǔ'), + (0x1D4, 'V'), + (0x1D5, 'M', u'ǖ'), + (0x1D6, 'V'), + (0x1D7, 'M', u'ǘ'), + (0x1D8, 'V'), + (0x1D9, 'M', u'ǚ'), + (0x1DA, 'V'), + (0x1DB, 'M', u'ǜ'), + (0x1DC, 'V'), + (0x1DE, 'M', u'ǟ'), + (0x1DF, 'V'), + (0x1E0, 'M', u'ǡ'), + (0x1E1, 'V'), + (0x1E2, 'M', u'ǣ'), + (0x1E3, 'V'), + (0x1E4, 'M', u'ǥ'), + (0x1E5, 'V'), + (0x1E6, 'M', u'ǧ'), + (0x1E7, 'V'), + (0x1E8, 'M', u'ǩ'), + (0x1E9, 'V'), + (0x1EA, 'M', u'ǫ'), + (0x1EB, 'V'), + (0x1EC, 'M', u'ǭ'), + (0x1ED, 'V'), + (0x1EE, 'M', u'ǯ'), + (0x1EF, 'V'), + (0x1F1, 'M', u'dz'), + (0x1F4, 'M', u'ǵ'), + (0x1F5, 'V'), + (0x1F6, 'M', u'ƕ'), + (0x1F7, 'M', u'ƿ'), + (0x1F8, 'M', u'ǹ'), + (0x1F9, 'V'), + (0x1FA, 'M', u'ǻ'), + (0x1FB, 'V'), + (0x1FC, 'M', u'ǽ'), + (0x1FD, 'V'), + (0x1FE, 'M', u'ǿ'), + (0x1FF, 'V'), + (0x200, 'M', u'ȁ'), + (0x201, 'V'), + (0x202, 'M', u'ȃ'), + (0x203, 'V'), + (0x204, 'M', u'ȅ'), + (0x205, 'V'), + (0x206, 'M', u'ȇ'), + (0x207, 'V'), + (0x208, 'M', u'ȉ'), + (0x209, 'V'), + (0x20A, 'M', u'ȋ'), + (0x20B, 'V'), + (0x20C, 'M', u'ȍ'), + ] + +def _seg_5(): + return [ + (0x20D, 'V'), + (0x20E, 'M', u'ȏ'), + (0x20F, 'V'), + (0x210, 'M', u'ȑ'), + (0x211, 'V'), + (0x212, 'M', u'ȓ'), + (0x213, 'V'), + (0x214, 'M', u'ȕ'), + (0x215, 'V'), + (0x216, 'M', u'ȗ'), + (0x217, 'V'), + (0x218, 'M', u'ș'), + (0x219, 'V'), + (0x21A, 'M', u'ț'), + (0x21B, 'V'), + (0x21C, 'M', u'ȝ'), + (0x21D, 'V'), + (0x21E, 'M', u'ȟ'), + (0x21F, 'V'), + (0x220, 'M', u'ƞ'), + (0x221, 'V'), + (0x222, 'M', u'ȣ'), + (0x223, 'V'), + (0x224, 'M', u'ȥ'), + (0x225, 'V'), + (0x226, 'M', u'ȧ'), + (0x227, 'V'), + (0x228, 'M', u'ȩ'), + (0x229, 'V'), + (0x22A, 'M', u'ȫ'), + (0x22B, 'V'), + (0x22C, 'M', u'ȭ'), + (0x22D, 'V'), + (0x22E, 'M', u'ȯ'), + (0x22F, 'V'), + (0x230, 'M', u'ȱ'), + (0x231, 'V'), + (0x232, 'M', u'ȳ'), + (0x233, 'V'), + (0x23A, 'M', u'ⱥ'), + (0x23B, 'M', u'ȼ'), + (0x23C, 'V'), + (0x23D, 'M', u'ƚ'), + (0x23E, 'M', u'ⱦ'), + (0x23F, 'V'), + (0x241, 'M', u'ɂ'), + (0x242, 'V'), + (0x243, 'M', u'ƀ'), + (0x244, 'M', u'ʉ'), + (0x245, 'M', u'ʌ'), + (0x246, 'M', u'ɇ'), + (0x247, 'V'), + (0x248, 'M', u'ɉ'), + (0x249, 'V'), + (0x24A, 'M', u'ɋ'), + (0x24B, 'V'), + (0x24C, 'M', u'ɍ'), + (0x24D, 'V'), + (0x24E, 'M', u'ɏ'), + (0x24F, 'V'), + (0x2B0, 'M', u'h'), + (0x2B1, 'M', u'ɦ'), + (0x2B2, 'M', u'j'), + (0x2B3, 'M', u'r'), + (0x2B4, 'M', u'ɹ'), + (0x2B5, 'M', u'ɻ'), + (0x2B6, 'M', u'ʁ'), + (0x2B7, 'M', u'w'), + (0x2B8, 'M', u'y'), + (0x2B9, 'V'), + (0x2D8, '3', u' ̆'), + (0x2D9, '3', u' ̇'), + (0x2DA, '3', u' ̊'), + (0x2DB, '3', u' ̨'), + (0x2DC, '3', u' ̃'), + (0x2DD, '3', u' ̋'), + (0x2DE, 'V'), + (0x2E0, 'M', u'ɣ'), + (0x2E1, 'M', u'l'), + (0x2E2, 'M', u's'), + (0x2E3, 'M', u'x'), + (0x2E4, 'M', u'ʕ'), + (0x2E5, 'V'), + (0x340, 'M', u'̀'), + (0x341, 'M', u'́'), + (0x342, 'V'), + (0x343, 'M', u'̓'), + (0x344, 'M', u'̈́'), + (0x345, 'M', u'ι'), + (0x346, 'V'), + (0x34F, 'I'), + (0x350, 'V'), + (0x370, 'M', u'ͱ'), + (0x371, 'V'), + (0x372, 'M', u'ͳ'), + (0x373, 'V'), + (0x374, 'M', u'ʹ'), + (0x375, 'V'), + (0x376, 'M', u'ͷ'), + (0x377, 'V'), + ] + +def _seg_6(): + return [ + (0x378, 'X'), + (0x37A, '3', u' ι'), + (0x37B, 'V'), + (0x37E, '3', u';'), + (0x37F, 'M', u'ϳ'), + (0x380, 'X'), + (0x384, '3', u' ́'), + (0x385, '3', u' ̈́'), + (0x386, 'M', u'ά'), + (0x387, 'M', u'·'), + (0x388, 'M', u'έ'), + (0x389, 'M', u'ή'), + (0x38A, 'M', u'ί'), + (0x38B, 'X'), + (0x38C, 'M', u'ό'), + (0x38D, 'X'), + (0x38E, 'M', u'ύ'), + (0x38F, 'M', u'ώ'), + (0x390, 'V'), + (0x391, 'M', u'α'), + (0x392, 'M', u'β'), + (0x393, 'M', u'γ'), + (0x394, 'M', u'δ'), + (0x395, 'M', u'ε'), + (0x396, 'M', u'ζ'), + (0x397, 'M', u'η'), + (0x398, 'M', u'θ'), + (0x399, 'M', u'ι'), + (0x39A, 'M', u'κ'), + (0x39B, 'M', u'λ'), + (0x39C, 'M', u'μ'), + (0x39D, 'M', u'ν'), + (0x39E, 'M', u'ξ'), + (0x39F, 'M', u'ο'), + (0x3A0, 'M', u'π'), + (0x3A1, 'M', u'ρ'), + (0x3A2, 'X'), + (0x3A3, 'M', u'σ'), + (0x3A4, 'M', u'τ'), + (0x3A5, 'M', u'υ'), + (0x3A6, 'M', u'φ'), + (0x3A7, 'M', u'χ'), + (0x3A8, 'M', u'ψ'), + (0x3A9, 'M', u'ω'), + (0x3AA, 'M', u'ϊ'), + (0x3AB, 'M', u'ϋ'), + (0x3AC, 'V'), + (0x3C2, 'D', u'σ'), + (0x3C3, 'V'), + (0x3CF, 'M', u'ϗ'), + (0x3D0, 'M', u'β'), + (0x3D1, 'M', u'θ'), + (0x3D2, 'M', u'υ'), + (0x3D3, 'M', u'ύ'), + (0x3D4, 'M', u'ϋ'), + (0x3D5, 'M', u'φ'), + (0x3D6, 'M', u'π'), + (0x3D7, 'V'), + (0x3D8, 'M', u'ϙ'), + (0x3D9, 'V'), + (0x3DA, 'M', u'ϛ'), + (0x3DB, 'V'), + (0x3DC, 'M', u'ϝ'), + (0x3DD, 'V'), + (0x3DE, 'M', u'ϟ'), + (0x3DF, 'V'), + (0x3E0, 'M', u'ϡ'), + (0x3E1, 'V'), + (0x3E2, 'M', u'ϣ'), + (0x3E3, 'V'), + (0x3E4, 'M', u'ϥ'), + (0x3E5, 'V'), + (0x3E6, 'M', u'ϧ'), + (0x3E7, 'V'), + (0x3E8, 'M', u'ϩ'), + (0x3E9, 'V'), + (0x3EA, 'M', u'ϫ'), + (0x3EB, 'V'), + (0x3EC, 'M', u'ϭ'), + (0x3ED, 'V'), + (0x3EE, 'M', u'ϯ'), + (0x3EF, 'V'), + (0x3F0, 'M', u'κ'), + (0x3F1, 'M', u'ρ'), + (0x3F2, 'M', u'σ'), + (0x3F3, 'V'), + (0x3F4, 'M', u'θ'), + (0x3F5, 'M', u'ε'), + (0x3F6, 'V'), + (0x3F7, 'M', u'ϸ'), + (0x3F8, 'V'), + (0x3F9, 'M', u'σ'), + (0x3FA, 'M', u'ϻ'), + (0x3FB, 'V'), + (0x3FD, 'M', u'ͻ'), + (0x3FE, 'M', u'ͼ'), + (0x3FF, 'M', u'ͽ'), + (0x400, 'M', u'ѐ'), + (0x401, 'M', u'ё'), + (0x402, 'M', u'ђ'), + ] + +def _seg_7(): + return [ + (0x403, 'M', u'ѓ'), + (0x404, 'M', u'є'), + (0x405, 'M', u'ѕ'), + (0x406, 'M', u'і'), + (0x407, 'M', u'ї'), + (0x408, 'M', u'ј'), + (0x409, 'M', u'љ'), + (0x40A, 'M', u'њ'), + (0x40B, 'M', u'ћ'), + (0x40C, 'M', u'ќ'), + (0x40D, 'M', u'ѝ'), + (0x40E, 'M', u'ў'), + (0x40F, 'M', u'џ'), + (0x410, 'M', u'а'), + (0x411, 'M', u'б'), + (0x412, 'M', u'в'), + (0x413, 'M', u'г'), + (0x414, 'M', u'д'), + (0x415, 'M', u'е'), + (0x416, 'M', u'ж'), + (0x417, 'M', u'з'), + (0x418, 'M', u'и'), + (0x419, 'M', u'й'), + (0x41A, 'M', u'к'), + (0x41B, 'M', u'л'), + (0x41C, 'M', u'м'), + (0x41D, 'M', u'н'), + (0x41E, 'M', u'о'), + (0x41F, 'M', u'п'), + (0x420, 'M', u'р'), + (0x421, 'M', u'с'), + (0x422, 'M', u'т'), + (0x423, 'M', u'у'), + (0x424, 'M', u'ф'), + (0x425, 'M', u'х'), + (0x426, 'M', u'ц'), + (0x427, 'M', u'ч'), + (0x428, 'M', u'ш'), + (0x429, 'M', u'щ'), + (0x42A, 'M', u'ъ'), + (0x42B, 'M', u'ы'), + (0x42C, 'M', u'ь'), + (0x42D, 'M', u'э'), + (0x42E, 'M', u'ю'), + (0x42F, 'M', u'я'), + (0x430, 'V'), + (0x460, 'M', u'ѡ'), + (0x461, 'V'), + (0x462, 'M', u'ѣ'), + (0x463, 'V'), + (0x464, 'M', u'ѥ'), + (0x465, 'V'), + (0x466, 'M', u'ѧ'), + (0x467, 'V'), + (0x468, 'M', u'ѩ'), + (0x469, 'V'), + (0x46A, 'M', u'ѫ'), + (0x46B, 'V'), + (0x46C, 'M', u'ѭ'), + (0x46D, 'V'), + (0x46E, 'M', u'ѯ'), + (0x46F, 'V'), + (0x470, 'M', u'ѱ'), + (0x471, 'V'), + (0x472, 'M', u'ѳ'), + (0x473, 'V'), + (0x474, 'M', u'ѵ'), + (0x475, 'V'), + (0x476, 'M', u'ѷ'), + (0x477, 'V'), + (0x478, 'M', u'ѹ'), + (0x479, 'V'), + (0x47A, 'M', u'ѻ'), + (0x47B, 'V'), + (0x47C, 'M', u'ѽ'), + (0x47D, 'V'), + (0x47E, 'M', u'ѿ'), + (0x47F, 'V'), + (0x480, 'M', u'ҁ'), + (0x481, 'V'), + (0x48A, 'M', u'ҋ'), + (0x48B, 'V'), + (0x48C, 'M', u'ҍ'), + (0x48D, 'V'), + (0x48E, 'M', u'ҏ'), + (0x48F, 'V'), + (0x490, 'M', u'ґ'), + (0x491, 'V'), + (0x492, 'M', u'ғ'), + (0x493, 'V'), + (0x494, 'M', u'ҕ'), + (0x495, 'V'), + (0x496, 'M', u'җ'), + (0x497, 'V'), + (0x498, 'M', u'ҙ'), + (0x499, 'V'), + (0x49A, 'M', u'қ'), + (0x49B, 'V'), + (0x49C, 'M', u'ҝ'), + (0x49D, 'V'), + ] + +def _seg_8(): + return [ + (0x49E, 'M', u'ҟ'), + (0x49F, 'V'), + (0x4A0, 'M', u'ҡ'), + (0x4A1, 'V'), + (0x4A2, 'M', u'ң'), + (0x4A3, 'V'), + (0x4A4, 'M', u'ҥ'), + (0x4A5, 'V'), + (0x4A6, 'M', u'ҧ'), + (0x4A7, 'V'), + (0x4A8, 'M', u'ҩ'), + (0x4A9, 'V'), + (0x4AA, 'M', u'ҫ'), + (0x4AB, 'V'), + (0x4AC, 'M', u'ҭ'), + (0x4AD, 'V'), + (0x4AE, 'M', u'ү'), + (0x4AF, 'V'), + (0x4B0, 'M', u'ұ'), + (0x4B1, 'V'), + (0x4B2, 'M', u'ҳ'), + (0x4B3, 'V'), + (0x4B4, 'M', u'ҵ'), + (0x4B5, 'V'), + (0x4B6, 'M', u'ҷ'), + (0x4B7, 'V'), + (0x4B8, 'M', u'ҹ'), + (0x4B9, 'V'), + (0x4BA, 'M', u'һ'), + (0x4BB, 'V'), + (0x4BC, 'M', u'ҽ'), + (0x4BD, 'V'), + (0x4BE, 'M', u'ҿ'), + (0x4BF, 'V'), + (0x4C0, 'X'), + (0x4C1, 'M', u'ӂ'), + (0x4C2, 'V'), + (0x4C3, 'M', u'ӄ'), + (0x4C4, 'V'), + (0x4C5, 'M', u'ӆ'), + (0x4C6, 'V'), + (0x4C7, 'M', u'ӈ'), + (0x4C8, 'V'), + (0x4C9, 'M', u'ӊ'), + (0x4CA, 'V'), + (0x4CB, 'M', u'ӌ'), + (0x4CC, 'V'), + (0x4CD, 'M', u'ӎ'), + (0x4CE, 'V'), + (0x4D0, 'M', u'ӑ'), + (0x4D1, 'V'), + (0x4D2, 'M', u'ӓ'), + (0x4D3, 'V'), + (0x4D4, 'M', u'ӕ'), + (0x4D5, 'V'), + (0x4D6, 'M', u'ӗ'), + (0x4D7, 'V'), + (0x4D8, 'M', u'ә'), + (0x4D9, 'V'), + (0x4DA, 'M', u'ӛ'), + (0x4DB, 'V'), + (0x4DC, 'M', u'ӝ'), + (0x4DD, 'V'), + (0x4DE, 'M', u'ӟ'), + (0x4DF, 'V'), + (0x4E0, 'M', u'ӡ'), + (0x4E1, 'V'), + (0x4E2, 'M', u'ӣ'), + (0x4E3, 'V'), + (0x4E4, 'M', u'ӥ'), + (0x4E5, 'V'), + (0x4E6, 'M', u'ӧ'), + (0x4E7, 'V'), + (0x4E8, 'M', u'ө'), + (0x4E9, 'V'), + (0x4EA, 'M', u'ӫ'), + (0x4EB, 'V'), + (0x4EC, 'M', u'ӭ'), + (0x4ED, 'V'), + (0x4EE, 'M', u'ӯ'), + (0x4EF, 'V'), + (0x4F0, 'M', u'ӱ'), + (0x4F1, 'V'), + (0x4F2, 'M', u'ӳ'), + (0x4F3, 'V'), + (0x4F4, 'M', u'ӵ'), + (0x4F5, 'V'), + (0x4F6, 'M', u'ӷ'), + (0x4F7, 'V'), + (0x4F8, 'M', u'ӹ'), + (0x4F9, 'V'), + (0x4FA, 'M', u'ӻ'), + (0x4FB, 'V'), + (0x4FC, 'M', u'ӽ'), + (0x4FD, 'V'), + (0x4FE, 'M', u'ӿ'), + (0x4FF, 'V'), + (0x500, 'M', u'ԁ'), + (0x501, 'V'), + (0x502, 'M', u'ԃ'), + ] + +def _seg_9(): + return [ + (0x503, 'V'), + (0x504, 'M', u'ԅ'), + (0x505, 'V'), + (0x506, 'M', u'ԇ'), + (0x507, 'V'), + (0x508, 'M', u'ԉ'), + (0x509, 'V'), + (0x50A, 'M', u'ԋ'), + (0x50B, 'V'), + (0x50C, 'M', u'ԍ'), + (0x50D, 'V'), + (0x50E, 'M', u'ԏ'), + (0x50F, 'V'), + (0x510, 'M', u'ԑ'), + (0x511, 'V'), + (0x512, 'M', u'ԓ'), + (0x513, 'V'), + (0x514, 'M', u'ԕ'), + (0x515, 'V'), + (0x516, 'M', u'ԗ'), + (0x517, 'V'), + (0x518, 'M', u'ԙ'), + (0x519, 'V'), + (0x51A, 'M', u'ԛ'), + (0x51B, 'V'), + (0x51C, 'M', u'ԝ'), + (0x51D, 'V'), + (0x51E, 'M', u'ԟ'), + (0x51F, 'V'), + (0x520, 'M', u'ԡ'), + (0x521, 'V'), + (0x522, 'M', u'ԣ'), + (0x523, 'V'), + (0x524, 'M', u'ԥ'), + (0x525, 'V'), + (0x526, 'M', u'ԧ'), + (0x527, 'V'), + (0x528, 'M', u'ԩ'), + (0x529, 'V'), + (0x52A, 'M', u'ԫ'), + (0x52B, 'V'), + (0x52C, 'M', u'ԭ'), + (0x52D, 'V'), + (0x52E, 'M', u'ԯ'), + (0x52F, 'V'), + (0x530, 'X'), + (0x531, 'M', u'ա'), + (0x532, 'M', u'բ'), + (0x533, 'M', u'գ'), + (0x534, 'M', u'դ'), + (0x535, 'M', u'ե'), + (0x536, 'M', u'զ'), + (0x537, 'M', u'է'), + (0x538, 'M', u'ը'), + (0x539, 'M', u'թ'), + (0x53A, 'M', u'ժ'), + (0x53B, 'M', u'ի'), + (0x53C, 'M', u'լ'), + (0x53D, 'M', u'խ'), + (0x53E, 'M', u'ծ'), + (0x53F, 'M', u'կ'), + (0x540, 'M', u'հ'), + (0x541, 'M', u'ձ'), + (0x542, 'M', u'ղ'), + (0x543, 'M', u'ճ'), + (0x544, 'M', u'մ'), + (0x545, 'M', u'յ'), + (0x546, 'M', u'ն'), + (0x547, 'M', u'շ'), + (0x548, 'M', u'ո'), + (0x549, 'M', u'չ'), + (0x54A, 'M', u'պ'), + (0x54B, 'M', u'ջ'), + (0x54C, 'M', u'ռ'), + (0x54D, 'M', u'ս'), + (0x54E, 'M', u'վ'), + (0x54F, 'M', u'տ'), + (0x550, 'M', u'ր'), + (0x551, 'M', u'ց'), + (0x552, 'M', u'ւ'), + (0x553, 'M', u'փ'), + (0x554, 'M', u'ք'), + (0x555, 'M', u'օ'), + (0x556, 'M', u'ֆ'), + (0x557, 'X'), + (0x559, 'V'), + (0x560, 'X'), + (0x561, 'V'), + (0x587, 'M', u'եւ'), + (0x588, 'X'), + (0x589, 'V'), + (0x58B, 'X'), + (0x58D, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5F0, 'V'), + (0x5F5, 'X'), + ] + +def _seg_10(): + return [ + (0x606, 'V'), + (0x61C, 'X'), + (0x61E, 'V'), + (0x675, 'M', u'اٴ'), + (0x676, 'M', u'وٴ'), + (0x677, 'M', u'ۇٴ'), + (0x678, 'M', u'يٴ'), + (0x679, 'V'), + (0x6DD, 'X'), + (0x6DE, 'V'), + (0x70E, 'X'), + (0x710, 'V'), + (0x74B, 'X'), + (0x74D, 'V'), + (0x7B2, 'X'), + (0x7C0, 'V'), + (0x7FB, 'X'), + (0x800, 'V'), + (0x82E, 'X'), + (0x830, 'V'), + (0x83F, 'X'), + (0x840, 'V'), + (0x85C, 'X'), + (0x85E, 'V'), + (0x85F, 'X'), + (0x860, 'V'), + (0x86B, 'X'), + (0x8A0, 'V'), + (0x8B5, 'X'), + (0x8B6, 'V'), + (0x8BE, 'X'), + (0x8D4, 'V'), + (0x8E2, 'X'), + (0x8E3, 'V'), + (0x958, 'M', u'क़'), + (0x959, 'M', u'ख़'), + (0x95A, 'M', u'ग़'), + (0x95B, 'M', u'ज़'), + (0x95C, 'M', u'ड़'), + (0x95D, 'M', u'ढ़'), + (0x95E, 'M', u'फ़'), + (0x95F, 'M', u'य़'), + (0x960, 'V'), + (0x984, 'X'), + (0x985, 'V'), + (0x98D, 'X'), + (0x98F, 'V'), + (0x991, 'X'), + (0x993, 'V'), + (0x9A9, 'X'), + (0x9AA, 'V'), + (0x9B1, 'X'), + (0x9B2, 'V'), + (0x9B3, 'X'), + (0x9B6, 'V'), + (0x9BA, 'X'), + (0x9BC, 'V'), + (0x9C5, 'X'), + (0x9C7, 'V'), + (0x9C9, 'X'), + (0x9CB, 'V'), + (0x9CF, 'X'), + (0x9D7, 'V'), + (0x9D8, 'X'), + (0x9DC, 'M', u'ড়'), + (0x9DD, 'M', u'ঢ়'), + (0x9DE, 'X'), + (0x9DF, 'M', u'য়'), + (0x9E0, 'V'), + (0x9E4, 'X'), + (0x9E6, 'V'), + (0x9FE, 'X'), + (0xA01, 'V'), + (0xA04, 'X'), + (0xA05, 'V'), + (0xA0B, 'X'), + (0xA0F, 'V'), + (0xA11, 'X'), + (0xA13, 'V'), + (0xA29, 'X'), + (0xA2A, 'V'), + (0xA31, 'X'), + (0xA32, 'V'), + (0xA33, 'M', u'ਲ਼'), + (0xA34, 'X'), + (0xA35, 'V'), + (0xA36, 'M', u'ਸ਼'), + (0xA37, 'X'), + (0xA38, 'V'), + (0xA3A, 'X'), + (0xA3C, 'V'), + (0xA3D, 'X'), + (0xA3E, 'V'), + (0xA43, 'X'), + (0xA47, 'V'), + (0xA49, 'X'), + (0xA4B, 'V'), + (0xA4E, 'X'), + (0xA51, 'V'), + (0xA52, 'X'), + ] + +def _seg_11(): + return [ + (0xA59, 'M', u'ਖ਼'), + (0xA5A, 'M', u'ਗ਼'), + (0xA5B, 'M', u'ਜ਼'), + (0xA5C, 'V'), + (0xA5D, 'X'), + (0xA5E, 'M', u'ਫ਼'), + (0xA5F, 'X'), + (0xA66, 'V'), + (0xA76, 'X'), + (0xA81, 'V'), + (0xA84, 'X'), + (0xA85, 'V'), + (0xA8E, 'X'), + (0xA8F, 'V'), + (0xA92, 'X'), + (0xA93, 'V'), + (0xAA9, 'X'), + (0xAAA, 'V'), + (0xAB1, 'X'), + (0xAB2, 'V'), + (0xAB4, 'X'), + (0xAB5, 'V'), + (0xABA, 'X'), + (0xABC, 'V'), + (0xAC6, 'X'), + (0xAC7, 'V'), + (0xACA, 'X'), + (0xACB, 'V'), + (0xACE, 'X'), + (0xAD0, 'V'), + (0xAD1, 'X'), + (0xAE0, 'V'), + (0xAE4, 'X'), + (0xAE6, 'V'), + (0xAF2, 'X'), + (0xAF9, 'V'), + (0xB00, 'X'), + (0xB01, 'V'), + (0xB04, 'X'), + (0xB05, 'V'), + (0xB0D, 'X'), + (0xB0F, 'V'), + (0xB11, 'X'), + (0xB13, 'V'), + (0xB29, 'X'), + (0xB2A, 'V'), + (0xB31, 'X'), + (0xB32, 'V'), + (0xB34, 'X'), + (0xB35, 'V'), + (0xB3A, 'X'), + (0xB3C, 'V'), + (0xB45, 'X'), + (0xB47, 'V'), + (0xB49, 'X'), + (0xB4B, 'V'), + (0xB4E, 'X'), + (0xB56, 'V'), + (0xB58, 'X'), + (0xB5C, 'M', u'ଡ଼'), + (0xB5D, 'M', u'ଢ଼'), + (0xB5E, 'X'), + (0xB5F, 'V'), + (0xB64, 'X'), + (0xB66, 'V'), + (0xB78, 'X'), + (0xB82, 'V'), + (0xB84, 'X'), + (0xB85, 'V'), + (0xB8B, 'X'), + (0xB8E, 'V'), + (0xB91, 'X'), + (0xB92, 'V'), + (0xB96, 'X'), + (0xB99, 'V'), + (0xB9B, 'X'), + (0xB9C, 'V'), + (0xB9D, 'X'), + (0xB9E, 'V'), + (0xBA0, 'X'), + (0xBA3, 'V'), + (0xBA5, 'X'), + (0xBA8, 'V'), + (0xBAB, 'X'), + (0xBAE, 'V'), + (0xBBA, 'X'), + (0xBBE, 'V'), + (0xBC3, 'X'), + (0xBC6, 'V'), + (0xBC9, 'X'), + (0xBCA, 'V'), + (0xBCE, 'X'), + (0xBD0, 'V'), + (0xBD1, 'X'), + (0xBD7, 'V'), + (0xBD8, 'X'), + (0xBE6, 'V'), + (0xBFB, 'X'), + (0xC00, 'V'), + (0xC04, 'X'), + ] + +def _seg_12(): + return [ + (0xC05, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + (0xC29, 'X'), + (0xC2A, 'V'), + (0xC3A, 'X'), + (0xC3D, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), + (0xC4A, 'V'), + (0xC4E, 'X'), + (0xC55, 'V'), + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5B, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), + (0xC70, 'X'), + (0xC78, 'V'), + (0xC84, 'X'), + (0xC85, 'V'), + (0xC8D, 'X'), + (0xC8E, 'V'), + (0xC91, 'X'), + (0xC92, 'V'), + (0xCA9, 'X'), + (0xCAA, 'V'), + (0xCB4, 'X'), + (0xCB5, 'V'), + (0xCBA, 'X'), + (0xCBC, 'V'), + (0xCC5, 'X'), + (0xCC6, 'V'), + (0xCC9, 'X'), + (0xCCA, 'V'), + (0xCCE, 'X'), + (0xCD5, 'V'), + (0xCD7, 'X'), + (0xCDE, 'V'), + (0xCDF, 'X'), + (0xCE0, 'V'), + (0xCE4, 'X'), + (0xCE6, 'V'), + (0xCF0, 'X'), + (0xCF1, 'V'), + (0xCF3, 'X'), + (0xD00, 'V'), + (0xD04, 'X'), + (0xD05, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), + (0xD11, 'X'), + (0xD12, 'V'), + (0xD45, 'X'), + (0xD46, 'V'), + (0xD49, 'X'), + (0xD4A, 'V'), + (0xD50, 'X'), + (0xD54, 'V'), + (0xD64, 'X'), + (0xD66, 'V'), + (0xD80, 'X'), + (0xD82, 'V'), + (0xD84, 'X'), + (0xD85, 'V'), + (0xD97, 'X'), + (0xD9A, 'V'), + (0xDB2, 'X'), + (0xDB3, 'V'), + (0xDBC, 'X'), + (0xDBD, 'V'), + (0xDBE, 'X'), + (0xDC0, 'V'), + (0xDC7, 'X'), + (0xDCA, 'V'), + (0xDCB, 'X'), + (0xDCF, 'V'), + (0xDD5, 'X'), + (0xDD6, 'V'), + (0xDD7, 'X'), + (0xDD8, 'V'), + (0xDE0, 'X'), + (0xDE6, 'V'), + (0xDF0, 'X'), + (0xDF2, 'V'), + (0xDF5, 'X'), + (0xE01, 'V'), + (0xE33, 'M', u'ํา'), + (0xE34, 'V'), + (0xE3B, 'X'), + (0xE3F, 'V'), + (0xE5C, 'X'), + (0xE81, 'V'), + (0xE83, 'X'), + (0xE84, 'V'), + (0xE85, 'X'), + ] + +def _seg_13(): + return [ + (0xE87, 'V'), + (0xE89, 'X'), + (0xE8A, 'V'), + (0xE8B, 'X'), + (0xE8D, 'V'), + (0xE8E, 'X'), + (0xE94, 'V'), + (0xE98, 'X'), + (0xE99, 'V'), + (0xEA0, 'X'), + (0xEA1, 'V'), + (0xEA4, 'X'), + (0xEA5, 'V'), + (0xEA6, 'X'), + (0xEA7, 'V'), + (0xEA8, 'X'), + (0xEAA, 'V'), + (0xEAC, 'X'), + (0xEAD, 'V'), + (0xEB3, 'M', u'ໍາ'), + (0xEB4, 'V'), + (0xEBA, 'X'), + (0xEBB, 'V'), + (0xEBE, 'X'), + (0xEC0, 'V'), + (0xEC5, 'X'), + (0xEC6, 'V'), + (0xEC7, 'X'), + (0xEC8, 'V'), + (0xECE, 'X'), + (0xED0, 'V'), + (0xEDA, 'X'), + (0xEDC, 'M', u'ຫນ'), + (0xEDD, 'M', u'ຫມ'), + (0xEDE, 'V'), + (0xEE0, 'X'), + (0xF00, 'V'), + (0xF0C, 'M', u'་'), + (0xF0D, 'V'), + (0xF43, 'M', u'གྷ'), + (0xF44, 'V'), + (0xF48, 'X'), + (0xF49, 'V'), + (0xF4D, 'M', u'ཌྷ'), + (0xF4E, 'V'), + (0xF52, 'M', u'དྷ'), + (0xF53, 'V'), + (0xF57, 'M', u'བྷ'), + (0xF58, 'V'), + (0xF5C, 'M', u'ཛྷ'), + (0xF5D, 'V'), + (0xF69, 'M', u'ཀྵ'), + (0xF6A, 'V'), + (0xF6D, 'X'), + (0xF71, 'V'), + (0xF73, 'M', u'ཱི'), + (0xF74, 'V'), + (0xF75, 'M', u'ཱུ'), + (0xF76, 'M', u'ྲྀ'), + (0xF77, 'M', u'ྲཱྀ'), + (0xF78, 'M', u'ླྀ'), + (0xF79, 'M', u'ླཱྀ'), + (0xF7A, 'V'), + (0xF81, 'M', u'ཱྀ'), + (0xF82, 'V'), + (0xF93, 'M', u'ྒྷ'), + (0xF94, 'V'), + (0xF98, 'X'), + (0xF99, 'V'), + (0xF9D, 'M', u'ྜྷ'), + (0xF9E, 'V'), + (0xFA2, 'M', u'ྡྷ'), + (0xFA3, 'V'), + (0xFA7, 'M', u'ྦྷ'), + (0xFA8, 'V'), + (0xFAC, 'M', u'ྫྷ'), + (0xFAD, 'V'), + (0xFB9, 'M', u'ྐྵ'), + (0xFBA, 'V'), + (0xFBD, 'X'), + (0xFBE, 'V'), + (0xFCD, 'X'), + (0xFCE, 'V'), + (0xFDB, 'X'), + (0x1000, 'V'), + (0x10A0, 'X'), + (0x10C7, 'M', u'ⴧ'), + (0x10C8, 'X'), + (0x10CD, 'M', u'ⴭ'), + (0x10CE, 'X'), + (0x10D0, 'V'), + (0x10FC, 'M', u'ნ'), + (0x10FD, 'V'), + (0x115F, 'X'), + (0x1161, 'V'), + (0x1249, 'X'), + (0x124A, 'V'), + (0x124E, 'X'), + (0x1250, 'V'), + (0x1257, 'X'), + ] + +def _seg_14(): + return [ + (0x1258, 'V'), + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + (0x128E, 'X'), + (0x1290, 'V'), + (0x12B1, 'X'), + (0x12B2, 'V'), + (0x12B6, 'X'), + (0x12B8, 'V'), + (0x12BF, 'X'), + (0x12C0, 'V'), + (0x12C1, 'X'), + (0x12C2, 'V'), + (0x12C6, 'X'), + (0x12C8, 'V'), + (0x12D7, 'X'), + (0x12D8, 'V'), + (0x1311, 'X'), + (0x1312, 'V'), + (0x1316, 'X'), + (0x1318, 'V'), + (0x135B, 'X'), + (0x135D, 'V'), + (0x137D, 'X'), + (0x1380, 'V'), + (0x139A, 'X'), + (0x13A0, 'V'), + (0x13F6, 'X'), + (0x13F8, 'M', u'Ᏸ'), + (0x13F9, 'M', u'Ᏹ'), + (0x13FA, 'M', u'Ᏺ'), + (0x13FB, 'M', u'Ᏻ'), + (0x13FC, 'M', u'Ᏼ'), + (0x13FD, 'M', u'Ᏽ'), + (0x13FE, 'X'), + (0x1400, 'V'), + (0x1680, 'X'), + (0x1681, 'V'), + (0x169D, 'X'), + (0x16A0, 'V'), + (0x16F9, 'X'), + (0x1700, 'V'), + (0x170D, 'X'), + (0x170E, 'V'), + (0x1715, 'X'), + (0x1720, 'V'), + (0x1737, 'X'), + (0x1740, 'V'), + (0x1754, 'X'), + (0x1760, 'V'), + (0x176D, 'X'), + (0x176E, 'V'), + (0x1771, 'X'), + (0x1772, 'V'), + (0x1774, 'X'), + (0x1780, 'V'), + (0x17B4, 'X'), + (0x17B6, 'V'), + (0x17DE, 'X'), + (0x17E0, 'V'), + (0x17EA, 'X'), + (0x17F0, 'V'), + (0x17FA, 'X'), + (0x1800, 'V'), + (0x1806, 'X'), + (0x1807, 'V'), + (0x180B, 'I'), + (0x180E, 'X'), + (0x1810, 'V'), + (0x181A, 'X'), + (0x1820, 'V'), + (0x1878, 'X'), + (0x1880, 'V'), + (0x18AB, 'X'), + (0x18B0, 'V'), + (0x18F6, 'X'), + (0x1900, 'V'), + (0x191F, 'X'), + (0x1920, 'V'), + (0x192C, 'X'), + (0x1930, 'V'), + (0x193C, 'X'), + (0x1940, 'V'), + (0x1941, 'X'), + (0x1944, 'V'), + (0x196E, 'X'), + (0x1970, 'V'), + (0x1975, 'X'), + (0x1980, 'V'), + (0x19AC, 'X'), + (0x19B0, 'V'), + (0x19CA, 'X'), + (0x19D0, 'V'), + (0x19DB, 'X'), + (0x19DE, 'V'), + (0x1A1C, 'X'), + ] + +def _seg_15(): + return [ + (0x1A1E, 'V'), + (0x1A5F, 'X'), + (0x1A60, 'V'), + (0x1A7D, 'X'), + (0x1A7F, 'V'), + (0x1A8A, 'X'), + (0x1A90, 'V'), + (0x1A9A, 'X'), + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1AB0, 'V'), + (0x1ABF, 'X'), + (0x1B00, 'V'), + (0x1B4C, 'X'), + (0x1B50, 'V'), + (0x1B7D, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'M', u'в'), + (0x1C81, 'M', u'д'), + (0x1C82, 'M', u'о'), + (0x1C83, 'M', u'с'), + (0x1C84, 'M', u'т'), + (0x1C86, 'M', u'ъ'), + (0x1C87, 'M', u'ѣ'), + (0x1C88, 'M', u'ꙋ'), + (0x1C89, 'X'), + (0x1CC0, 'V'), + (0x1CC8, 'X'), + (0x1CD0, 'V'), + (0x1CFA, 'X'), + (0x1D00, 'V'), + (0x1D2C, 'M', u'a'), + (0x1D2D, 'M', u'æ'), + (0x1D2E, 'M', u'b'), + (0x1D2F, 'V'), + (0x1D30, 'M', u'd'), + (0x1D31, 'M', u'e'), + (0x1D32, 'M', u'ǝ'), + (0x1D33, 'M', u'g'), + (0x1D34, 'M', u'h'), + (0x1D35, 'M', u'i'), + (0x1D36, 'M', u'j'), + (0x1D37, 'M', u'k'), + (0x1D38, 'M', u'l'), + (0x1D39, 'M', u'm'), + (0x1D3A, 'M', u'n'), + (0x1D3B, 'V'), + (0x1D3C, 'M', u'o'), + (0x1D3D, 'M', u'ȣ'), + (0x1D3E, 'M', u'p'), + (0x1D3F, 'M', u'r'), + (0x1D40, 'M', u't'), + (0x1D41, 'M', u'u'), + (0x1D42, 'M', u'w'), + (0x1D43, 'M', u'a'), + (0x1D44, 'M', u'ɐ'), + (0x1D45, 'M', u'ɑ'), + (0x1D46, 'M', u'ᴂ'), + (0x1D47, 'M', u'b'), + (0x1D48, 'M', u'd'), + (0x1D49, 'M', u'e'), + (0x1D4A, 'M', u'ə'), + (0x1D4B, 'M', u'ɛ'), + (0x1D4C, 'M', u'ɜ'), + (0x1D4D, 'M', u'g'), + (0x1D4E, 'V'), + (0x1D4F, 'M', u'k'), + (0x1D50, 'M', u'm'), + (0x1D51, 'M', u'ŋ'), + (0x1D52, 'M', u'o'), + (0x1D53, 'M', u'ɔ'), + (0x1D54, 'M', u'ᴖ'), + (0x1D55, 'M', u'ᴗ'), + (0x1D56, 'M', u'p'), + (0x1D57, 'M', u't'), + (0x1D58, 'M', u'u'), + (0x1D59, 'M', u'ᴝ'), + (0x1D5A, 'M', u'ɯ'), + (0x1D5B, 'M', u'v'), + (0x1D5C, 'M', u'ᴥ'), + (0x1D5D, 'M', u'β'), + (0x1D5E, 'M', u'γ'), + (0x1D5F, 'M', u'δ'), + (0x1D60, 'M', u'φ'), + (0x1D61, 'M', u'χ'), + (0x1D62, 'M', u'i'), + (0x1D63, 'M', u'r'), + (0x1D64, 'M', u'u'), + (0x1D65, 'M', u'v'), + (0x1D66, 'M', u'β'), + (0x1D67, 'M', u'γ'), + (0x1D68, 'M', u'ρ'), + (0x1D69, 'M', u'φ'), + (0x1D6A, 'M', u'χ'), + ] + +def _seg_16(): + return [ + (0x1D6B, 'V'), + (0x1D78, 'M', u'н'), + (0x1D79, 'V'), + (0x1D9B, 'M', u'ɒ'), + (0x1D9C, 'M', u'c'), + (0x1D9D, 'M', u'ɕ'), + (0x1D9E, 'M', u'ð'), + (0x1D9F, 'M', u'ɜ'), + (0x1DA0, 'M', u'f'), + (0x1DA1, 'M', u'ɟ'), + (0x1DA2, 'M', u'ɡ'), + (0x1DA3, 'M', u'ɥ'), + (0x1DA4, 'M', u'ɨ'), + (0x1DA5, 'M', u'ɩ'), + (0x1DA6, 'M', u'ɪ'), + (0x1DA7, 'M', u'ᵻ'), + (0x1DA8, 'M', u'ʝ'), + (0x1DA9, 'M', u'ɭ'), + (0x1DAA, 'M', u'ᶅ'), + (0x1DAB, 'M', u'ʟ'), + (0x1DAC, 'M', u'ɱ'), + (0x1DAD, 'M', u'ɰ'), + (0x1DAE, 'M', u'ɲ'), + (0x1DAF, 'M', u'ɳ'), + (0x1DB0, 'M', u'ɴ'), + (0x1DB1, 'M', u'ɵ'), + (0x1DB2, 'M', u'ɸ'), + (0x1DB3, 'M', u'ʂ'), + (0x1DB4, 'M', u'ʃ'), + (0x1DB5, 'M', u'ƫ'), + (0x1DB6, 'M', u'ʉ'), + (0x1DB7, 'M', u'ʊ'), + (0x1DB8, 'M', u'ᴜ'), + (0x1DB9, 'M', u'ʋ'), + (0x1DBA, 'M', u'ʌ'), + (0x1DBB, 'M', u'z'), + (0x1DBC, 'M', u'ʐ'), + (0x1DBD, 'M', u'ʑ'), + (0x1DBE, 'M', u'ʒ'), + (0x1DBF, 'M', u'θ'), + (0x1DC0, 'V'), + (0x1DFA, 'X'), + (0x1DFB, 'V'), + (0x1E00, 'M', u'ḁ'), + (0x1E01, 'V'), + (0x1E02, 'M', u'ḃ'), + (0x1E03, 'V'), + (0x1E04, 'M', u'ḅ'), + (0x1E05, 'V'), + (0x1E06, 'M', u'ḇ'), + (0x1E07, 'V'), + (0x1E08, 'M', u'ḉ'), + (0x1E09, 'V'), + (0x1E0A, 'M', u'ḋ'), + (0x1E0B, 'V'), + (0x1E0C, 'M', u'ḍ'), + (0x1E0D, 'V'), + (0x1E0E, 'M', u'ḏ'), + (0x1E0F, 'V'), + (0x1E10, 'M', u'ḑ'), + (0x1E11, 'V'), + (0x1E12, 'M', u'ḓ'), + (0x1E13, 'V'), + (0x1E14, 'M', u'ḕ'), + (0x1E15, 'V'), + (0x1E16, 'M', u'ḗ'), + (0x1E17, 'V'), + (0x1E18, 'M', u'ḙ'), + (0x1E19, 'V'), + (0x1E1A, 'M', u'ḛ'), + (0x1E1B, 'V'), + (0x1E1C, 'M', u'ḝ'), + (0x1E1D, 'V'), + (0x1E1E, 'M', u'ḟ'), + (0x1E1F, 'V'), + (0x1E20, 'M', u'ḡ'), + (0x1E21, 'V'), + (0x1E22, 'M', u'ḣ'), + (0x1E23, 'V'), + (0x1E24, 'M', u'ḥ'), + (0x1E25, 'V'), + (0x1E26, 'M', u'ḧ'), + (0x1E27, 'V'), + (0x1E28, 'M', u'ḩ'), + (0x1E29, 'V'), + (0x1E2A, 'M', u'ḫ'), + (0x1E2B, 'V'), + (0x1E2C, 'M', u'ḭ'), + (0x1E2D, 'V'), + (0x1E2E, 'M', u'ḯ'), + (0x1E2F, 'V'), + (0x1E30, 'M', u'ḱ'), + (0x1E31, 'V'), + (0x1E32, 'M', u'ḳ'), + (0x1E33, 'V'), + (0x1E34, 'M', u'ḵ'), + (0x1E35, 'V'), + (0x1E36, 'M', u'ḷ'), + (0x1E37, 'V'), + (0x1E38, 'M', u'ḹ'), + ] + +def _seg_17(): + return [ + (0x1E39, 'V'), + (0x1E3A, 'M', u'ḻ'), + (0x1E3B, 'V'), + (0x1E3C, 'M', u'ḽ'), + (0x1E3D, 'V'), + (0x1E3E, 'M', u'ḿ'), + (0x1E3F, 'V'), + (0x1E40, 'M', u'ṁ'), + (0x1E41, 'V'), + (0x1E42, 'M', u'ṃ'), + (0x1E43, 'V'), + (0x1E44, 'M', u'ṅ'), + (0x1E45, 'V'), + (0x1E46, 'M', u'ṇ'), + (0x1E47, 'V'), + (0x1E48, 'M', u'ṉ'), + (0x1E49, 'V'), + (0x1E4A, 'M', u'ṋ'), + (0x1E4B, 'V'), + (0x1E4C, 'M', u'ṍ'), + (0x1E4D, 'V'), + (0x1E4E, 'M', u'ṏ'), + (0x1E4F, 'V'), + (0x1E50, 'M', u'ṑ'), + (0x1E51, 'V'), + (0x1E52, 'M', u'ṓ'), + (0x1E53, 'V'), + (0x1E54, 'M', u'ṕ'), + (0x1E55, 'V'), + (0x1E56, 'M', u'ṗ'), + (0x1E57, 'V'), + (0x1E58, 'M', u'ṙ'), + (0x1E59, 'V'), + (0x1E5A, 'M', u'ṛ'), + (0x1E5B, 'V'), + (0x1E5C, 'M', u'ṝ'), + (0x1E5D, 'V'), + (0x1E5E, 'M', u'ṟ'), + (0x1E5F, 'V'), + (0x1E60, 'M', u'ṡ'), + (0x1E61, 'V'), + (0x1E62, 'M', u'ṣ'), + (0x1E63, 'V'), + (0x1E64, 'M', u'ṥ'), + (0x1E65, 'V'), + (0x1E66, 'M', u'ṧ'), + (0x1E67, 'V'), + (0x1E68, 'M', u'ṩ'), + (0x1E69, 'V'), + (0x1E6A, 'M', u'ṫ'), + (0x1E6B, 'V'), + (0x1E6C, 'M', u'ṭ'), + (0x1E6D, 'V'), + (0x1E6E, 'M', u'ṯ'), + (0x1E6F, 'V'), + (0x1E70, 'M', u'ṱ'), + (0x1E71, 'V'), + (0x1E72, 'M', u'ṳ'), + (0x1E73, 'V'), + (0x1E74, 'M', u'ṵ'), + (0x1E75, 'V'), + (0x1E76, 'M', u'ṷ'), + (0x1E77, 'V'), + (0x1E78, 'M', u'ṹ'), + (0x1E79, 'V'), + (0x1E7A, 'M', u'ṻ'), + (0x1E7B, 'V'), + (0x1E7C, 'M', u'ṽ'), + (0x1E7D, 'V'), + (0x1E7E, 'M', u'ṿ'), + (0x1E7F, 'V'), + (0x1E80, 'M', u'ẁ'), + (0x1E81, 'V'), + (0x1E82, 'M', u'ẃ'), + (0x1E83, 'V'), + (0x1E84, 'M', u'ẅ'), + (0x1E85, 'V'), + (0x1E86, 'M', u'ẇ'), + (0x1E87, 'V'), + (0x1E88, 'M', u'ẉ'), + (0x1E89, 'V'), + (0x1E8A, 'M', u'ẋ'), + (0x1E8B, 'V'), + (0x1E8C, 'M', u'ẍ'), + (0x1E8D, 'V'), + (0x1E8E, 'M', u'ẏ'), + (0x1E8F, 'V'), + (0x1E90, 'M', u'ẑ'), + (0x1E91, 'V'), + (0x1E92, 'M', u'ẓ'), + (0x1E93, 'V'), + (0x1E94, 'M', u'ẕ'), + (0x1E95, 'V'), + (0x1E9A, 'M', u'aʾ'), + (0x1E9B, 'M', u'ṡ'), + (0x1E9C, 'V'), + (0x1E9E, 'M', u'ss'), + (0x1E9F, 'V'), + (0x1EA0, 'M', u'ạ'), + (0x1EA1, 'V'), + ] + +def _seg_18(): + return [ + (0x1EA2, 'M', u'ả'), + (0x1EA3, 'V'), + (0x1EA4, 'M', u'ấ'), + (0x1EA5, 'V'), + (0x1EA6, 'M', u'ầ'), + (0x1EA7, 'V'), + (0x1EA8, 'M', u'ẩ'), + (0x1EA9, 'V'), + (0x1EAA, 'M', u'ẫ'), + (0x1EAB, 'V'), + (0x1EAC, 'M', u'ậ'), + (0x1EAD, 'V'), + (0x1EAE, 'M', u'ắ'), + (0x1EAF, 'V'), + (0x1EB0, 'M', u'ằ'), + (0x1EB1, 'V'), + (0x1EB2, 'M', u'ẳ'), + (0x1EB3, 'V'), + (0x1EB4, 'M', u'ẵ'), + (0x1EB5, 'V'), + (0x1EB6, 'M', u'ặ'), + (0x1EB7, 'V'), + (0x1EB8, 'M', u'ẹ'), + (0x1EB9, 'V'), + (0x1EBA, 'M', u'ẻ'), + (0x1EBB, 'V'), + (0x1EBC, 'M', u'ẽ'), + (0x1EBD, 'V'), + (0x1EBE, 'M', u'ế'), + (0x1EBF, 'V'), + (0x1EC0, 'M', u'ề'), + (0x1EC1, 'V'), + (0x1EC2, 'M', u'ể'), + (0x1EC3, 'V'), + (0x1EC4, 'M', u'ễ'), + (0x1EC5, 'V'), + (0x1EC6, 'M', u'ệ'), + (0x1EC7, 'V'), + (0x1EC8, 'M', u'ỉ'), + (0x1EC9, 'V'), + (0x1ECA, 'M', u'ị'), + (0x1ECB, 'V'), + (0x1ECC, 'M', u'ọ'), + (0x1ECD, 'V'), + (0x1ECE, 'M', u'ỏ'), + (0x1ECF, 'V'), + (0x1ED0, 'M', u'ố'), + (0x1ED1, 'V'), + (0x1ED2, 'M', u'ồ'), + (0x1ED3, 'V'), + (0x1ED4, 'M', u'ổ'), + (0x1ED5, 'V'), + (0x1ED6, 'M', u'ỗ'), + (0x1ED7, 'V'), + (0x1ED8, 'M', u'ộ'), + (0x1ED9, 'V'), + (0x1EDA, 'M', u'ớ'), + (0x1EDB, 'V'), + (0x1EDC, 'M', u'ờ'), + (0x1EDD, 'V'), + (0x1EDE, 'M', u'ở'), + (0x1EDF, 'V'), + (0x1EE0, 'M', u'ỡ'), + (0x1EE1, 'V'), + (0x1EE2, 'M', u'ợ'), + (0x1EE3, 'V'), + (0x1EE4, 'M', u'ụ'), + (0x1EE5, 'V'), + (0x1EE6, 'M', u'ủ'), + (0x1EE7, 'V'), + (0x1EE8, 'M', u'ứ'), + (0x1EE9, 'V'), + (0x1EEA, 'M', u'ừ'), + (0x1EEB, 'V'), + (0x1EEC, 'M', u'ử'), + (0x1EED, 'V'), + (0x1EEE, 'M', u'ữ'), + (0x1EEF, 'V'), + (0x1EF0, 'M', u'ự'), + (0x1EF1, 'V'), + (0x1EF2, 'M', u'ỳ'), + (0x1EF3, 'V'), + (0x1EF4, 'M', u'ỵ'), + (0x1EF5, 'V'), + (0x1EF6, 'M', u'ỷ'), + (0x1EF7, 'V'), + (0x1EF8, 'M', u'ỹ'), + (0x1EF9, 'V'), + (0x1EFA, 'M', u'ỻ'), + (0x1EFB, 'V'), + (0x1EFC, 'M', u'ỽ'), + (0x1EFD, 'V'), + (0x1EFE, 'M', u'ỿ'), + (0x1EFF, 'V'), + (0x1F08, 'M', u'ἀ'), + (0x1F09, 'M', u'ἁ'), + (0x1F0A, 'M', u'ἂ'), + (0x1F0B, 'M', u'ἃ'), + (0x1F0C, 'M', u'ἄ'), + (0x1F0D, 'M', u'ἅ'), + ] + +def _seg_19(): + return [ + (0x1F0E, 'M', u'ἆ'), + (0x1F0F, 'M', u'ἇ'), + (0x1F10, 'V'), + (0x1F16, 'X'), + (0x1F18, 'M', u'ἐ'), + (0x1F19, 'M', u'ἑ'), + (0x1F1A, 'M', u'ἒ'), + (0x1F1B, 'M', u'ἓ'), + (0x1F1C, 'M', u'ἔ'), + (0x1F1D, 'M', u'ἕ'), + (0x1F1E, 'X'), + (0x1F20, 'V'), + (0x1F28, 'M', u'ἠ'), + (0x1F29, 'M', u'ἡ'), + (0x1F2A, 'M', u'ἢ'), + (0x1F2B, 'M', u'ἣ'), + (0x1F2C, 'M', u'ἤ'), + (0x1F2D, 'M', u'ἥ'), + (0x1F2E, 'M', u'ἦ'), + (0x1F2F, 'M', u'ἧ'), + (0x1F30, 'V'), + (0x1F38, 'M', u'ἰ'), + (0x1F39, 'M', u'ἱ'), + (0x1F3A, 'M', u'ἲ'), + (0x1F3B, 'M', u'ἳ'), + (0x1F3C, 'M', u'ἴ'), + (0x1F3D, 'M', u'ἵ'), + (0x1F3E, 'M', u'ἶ'), + (0x1F3F, 'M', u'ἷ'), + (0x1F40, 'V'), + (0x1F46, 'X'), + (0x1F48, 'M', u'ὀ'), + (0x1F49, 'M', u'ὁ'), + (0x1F4A, 'M', u'ὂ'), + (0x1F4B, 'M', u'ὃ'), + (0x1F4C, 'M', u'ὄ'), + (0x1F4D, 'M', u'ὅ'), + (0x1F4E, 'X'), + (0x1F50, 'V'), + (0x1F58, 'X'), + (0x1F59, 'M', u'ὑ'), + (0x1F5A, 'X'), + (0x1F5B, 'M', u'ὓ'), + (0x1F5C, 'X'), + (0x1F5D, 'M', u'ὕ'), + (0x1F5E, 'X'), + (0x1F5F, 'M', u'ὗ'), + (0x1F60, 'V'), + (0x1F68, 'M', u'ὠ'), + (0x1F69, 'M', u'ὡ'), + (0x1F6A, 'M', u'ὢ'), + (0x1F6B, 'M', u'ὣ'), + (0x1F6C, 'M', u'ὤ'), + (0x1F6D, 'M', u'ὥ'), + (0x1F6E, 'M', u'ὦ'), + (0x1F6F, 'M', u'ὧ'), + (0x1F70, 'V'), + (0x1F71, 'M', u'ά'), + (0x1F72, 'V'), + (0x1F73, 'M', u'έ'), + (0x1F74, 'V'), + (0x1F75, 'M', u'ή'), + (0x1F76, 'V'), + (0x1F77, 'M', u'ί'), + (0x1F78, 'V'), + (0x1F79, 'M', u'ό'), + (0x1F7A, 'V'), + (0x1F7B, 'M', u'ύ'), + (0x1F7C, 'V'), + (0x1F7D, 'M', u'ώ'), + (0x1F7E, 'X'), + (0x1F80, 'M', u'ἀι'), + (0x1F81, 'M', u'ἁι'), + (0x1F82, 'M', u'ἂι'), + (0x1F83, 'M', u'ἃι'), + (0x1F84, 'M', u'ἄι'), + (0x1F85, 'M', u'ἅι'), + (0x1F86, 'M', u'ἆι'), + (0x1F87, 'M', u'ἇι'), + (0x1F88, 'M', u'ἀι'), + (0x1F89, 'M', u'ἁι'), + (0x1F8A, 'M', u'ἂι'), + (0x1F8B, 'M', u'ἃι'), + (0x1F8C, 'M', u'ἄι'), + (0x1F8D, 'M', u'ἅι'), + (0x1F8E, 'M', u'ἆι'), + (0x1F8F, 'M', u'ἇι'), + (0x1F90, 'M', u'ἠι'), + (0x1F91, 'M', u'ἡι'), + (0x1F92, 'M', u'ἢι'), + (0x1F93, 'M', u'ἣι'), + (0x1F94, 'M', u'ἤι'), + (0x1F95, 'M', u'ἥι'), + (0x1F96, 'M', u'ἦι'), + (0x1F97, 'M', u'ἧι'), + (0x1F98, 'M', u'ἠι'), + (0x1F99, 'M', u'ἡι'), + (0x1F9A, 'M', u'ἢι'), + (0x1F9B, 'M', u'ἣι'), + (0x1F9C, 'M', u'ἤι'), + ] + +def _seg_20(): + return [ + (0x1F9D, 'M', u'ἥι'), + (0x1F9E, 'M', u'ἦι'), + (0x1F9F, 'M', u'ἧι'), + (0x1FA0, 'M', u'ὠι'), + (0x1FA1, 'M', u'ὡι'), + (0x1FA2, 'M', u'ὢι'), + (0x1FA3, 'M', u'ὣι'), + (0x1FA4, 'M', u'ὤι'), + (0x1FA5, 'M', u'ὥι'), + (0x1FA6, 'M', u'ὦι'), + (0x1FA7, 'M', u'ὧι'), + (0x1FA8, 'M', u'ὠι'), + (0x1FA9, 'M', u'ὡι'), + (0x1FAA, 'M', u'ὢι'), + (0x1FAB, 'M', u'ὣι'), + (0x1FAC, 'M', u'ὤι'), + (0x1FAD, 'M', u'ὥι'), + (0x1FAE, 'M', u'ὦι'), + (0x1FAF, 'M', u'ὧι'), + (0x1FB0, 'V'), + (0x1FB2, 'M', u'ὰι'), + (0x1FB3, 'M', u'αι'), + (0x1FB4, 'M', u'άι'), + (0x1FB5, 'X'), + (0x1FB6, 'V'), + (0x1FB7, 'M', u'ᾶι'), + (0x1FB8, 'M', u'ᾰ'), + (0x1FB9, 'M', u'ᾱ'), + (0x1FBA, 'M', u'ὰ'), + (0x1FBB, 'M', u'ά'), + (0x1FBC, 'M', u'αι'), + (0x1FBD, '3', u' ̓'), + (0x1FBE, 'M', u'ι'), + (0x1FBF, '3', u' ̓'), + (0x1FC0, '3', u' ͂'), + (0x1FC1, '3', u' ̈͂'), + (0x1FC2, 'M', u'ὴι'), + (0x1FC3, 'M', u'ηι'), + (0x1FC4, 'M', u'ήι'), + (0x1FC5, 'X'), + (0x1FC6, 'V'), + (0x1FC7, 'M', u'ῆι'), + (0x1FC8, 'M', u'ὲ'), + (0x1FC9, 'M', u'έ'), + (0x1FCA, 'M', u'ὴ'), + (0x1FCB, 'M', u'ή'), + (0x1FCC, 'M', u'ηι'), + (0x1FCD, '3', u' ̓̀'), + (0x1FCE, '3', u' ̓́'), + (0x1FCF, '3', u' ̓͂'), + (0x1FD0, 'V'), + (0x1FD3, 'M', u'ΐ'), + (0x1FD4, 'X'), + (0x1FD6, 'V'), + (0x1FD8, 'M', u'ῐ'), + (0x1FD9, 'M', u'ῑ'), + (0x1FDA, 'M', u'ὶ'), + (0x1FDB, 'M', u'ί'), + (0x1FDC, 'X'), + (0x1FDD, '3', u' ̔̀'), + (0x1FDE, '3', u' ̔́'), + (0x1FDF, '3', u' ̔͂'), + (0x1FE0, 'V'), + (0x1FE3, 'M', u'ΰ'), + (0x1FE4, 'V'), + (0x1FE8, 'M', u'ῠ'), + (0x1FE9, 'M', u'ῡ'), + (0x1FEA, 'M', u'ὺ'), + (0x1FEB, 'M', u'ύ'), + (0x1FEC, 'M', u'ῥ'), + (0x1FED, '3', u' ̈̀'), + (0x1FEE, '3', u' ̈́'), + (0x1FEF, '3', u'`'), + (0x1FF0, 'X'), + (0x1FF2, 'M', u'ὼι'), + (0x1FF3, 'M', u'ωι'), + (0x1FF4, 'M', u'ώι'), + (0x1FF5, 'X'), + (0x1FF6, 'V'), + (0x1FF7, 'M', u'ῶι'), + (0x1FF8, 'M', u'ὸ'), + (0x1FF9, 'M', u'ό'), + (0x1FFA, 'M', u'ὼ'), + (0x1FFB, 'M', u'ώ'), + (0x1FFC, 'M', u'ωι'), + (0x1FFD, '3', u' ́'), + (0x1FFE, '3', u' ̔'), + (0x1FFF, 'X'), + (0x2000, '3', u' '), + (0x200B, 'I'), + (0x200C, 'D', u''), + (0x200E, 'X'), + (0x2010, 'V'), + (0x2011, 'M', u'‐'), + (0x2012, 'V'), + (0x2017, '3', u' ̳'), + (0x2018, 'V'), + (0x2024, 'X'), + (0x2027, 'V'), + (0x2028, 'X'), + ] + +def _seg_21(): + return [ + (0x202F, '3', u' '), + (0x2030, 'V'), + (0x2033, 'M', u'′′'), + (0x2034, 'M', u'′′′'), + (0x2035, 'V'), + (0x2036, 'M', u'‵‵'), + (0x2037, 'M', u'‵‵‵'), + (0x2038, 'V'), + (0x203C, '3', u'!!'), + (0x203D, 'V'), + (0x203E, '3', u' ̅'), + (0x203F, 'V'), + (0x2047, '3', u'??'), + (0x2048, '3', u'?!'), + (0x2049, '3', u'!?'), + (0x204A, 'V'), + (0x2057, 'M', u'′′′′'), + (0x2058, 'V'), + (0x205F, '3', u' '), + (0x2060, 'I'), + (0x2061, 'X'), + (0x2064, 'I'), + (0x2065, 'X'), + (0x2070, 'M', u'0'), + (0x2071, 'M', u'i'), + (0x2072, 'X'), + (0x2074, 'M', u'4'), + (0x2075, 'M', u'5'), + (0x2076, 'M', u'6'), + (0x2077, 'M', u'7'), + (0x2078, 'M', u'8'), + (0x2079, 'M', u'9'), + (0x207A, '3', u'+'), + (0x207B, 'M', u'−'), + (0x207C, '3', u'='), + (0x207D, '3', u'('), + (0x207E, '3', u')'), + (0x207F, 'M', u'n'), + (0x2080, 'M', u'0'), + (0x2081, 'M', u'1'), + (0x2082, 'M', u'2'), + (0x2083, 'M', u'3'), + (0x2084, 'M', u'4'), + (0x2085, 'M', u'5'), + (0x2086, 'M', u'6'), + (0x2087, 'M', u'7'), + (0x2088, 'M', u'8'), + (0x2089, 'M', u'9'), + (0x208A, '3', u'+'), + (0x208B, 'M', u'−'), + (0x208C, '3', u'='), + (0x208D, '3', u'('), + (0x208E, '3', u')'), + (0x208F, 'X'), + (0x2090, 'M', u'a'), + (0x2091, 'M', u'e'), + (0x2092, 'M', u'o'), + (0x2093, 'M', u'x'), + (0x2094, 'M', u'ə'), + (0x2095, 'M', u'h'), + (0x2096, 'M', u'k'), + (0x2097, 'M', u'l'), + (0x2098, 'M', u'm'), + (0x2099, 'M', u'n'), + (0x209A, 'M', u'p'), + (0x209B, 'M', u's'), + (0x209C, 'M', u't'), + (0x209D, 'X'), + (0x20A0, 'V'), + (0x20A8, 'M', u'rs'), + (0x20A9, 'V'), + (0x20C0, 'X'), + (0x20D0, 'V'), + (0x20F1, 'X'), + (0x2100, '3', u'a/c'), + (0x2101, '3', u'a/s'), + (0x2102, 'M', u'c'), + (0x2103, 'M', u'°c'), + (0x2104, 'V'), + (0x2105, '3', u'c/o'), + (0x2106, '3', u'c/u'), + (0x2107, 'M', u'ɛ'), + (0x2108, 'V'), + (0x2109, 'M', u'°f'), + (0x210A, 'M', u'g'), + (0x210B, 'M', u'h'), + (0x210F, 'M', u'ħ'), + (0x2110, 'M', u'i'), + (0x2112, 'M', u'l'), + (0x2114, 'V'), + (0x2115, 'M', u'n'), + (0x2116, 'M', u'no'), + (0x2117, 'V'), + (0x2119, 'M', u'p'), + (0x211A, 'M', u'q'), + (0x211B, 'M', u'r'), + (0x211E, 'V'), + (0x2120, 'M', u'sm'), + (0x2121, 'M', u'tel'), + (0x2122, 'M', u'tm'), + ] + +def _seg_22(): + return [ + (0x2123, 'V'), + (0x2124, 'M', u'z'), + (0x2125, 'V'), + (0x2126, 'M', u'ω'), + (0x2127, 'V'), + (0x2128, 'M', u'z'), + (0x2129, 'V'), + (0x212A, 'M', u'k'), + (0x212B, 'M', u'å'), + (0x212C, 'M', u'b'), + (0x212D, 'M', u'c'), + (0x212E, 'V'), + (0x212F, 'M', u'e'), + (0x2131, 'M', u'f'), + (0x2132, 'X'), + (0x2133, 'M', u'm'), + (0x2134, 'M', u'o'), + (0x2135, 'M', u'א'), + (0x2136, 'M', u'ב'), + (0x2137, 'M', u'ג'), + (0x2138, 'M', u'ד'), + (0x2139, 'M', u'i'), + (0x213A, 'V'), + (0x213B, 'M', u'fax'), + (0x213C, 'M', u'π'), + (0x213D, 'M', u'γ'), + (0x213F, 'M', u'π'), + (0x2140, 'M', u'∑'), + (0x2141, 'V'), + (0x2145, 'M', u'd'), + (0x2147, 'M', u'e'), + (0x2148, 'M', u'i'), + (0x2149, 'M', u'j'), + (0x214A, 'V'), + (0x2150, 'M', u'1⁄7'), + (0x2151, 'M', u'1⁄9'), + (0x2152, 'M', u'1⁄10'), + (0x2153, 'M', u'1⁄3'), + (0x2154, 'M', u'2⁄3'), + (0x2155, 'M', u'1⁄5'), + (0x2156, 'M', u'2⁄5'), + (0x2157, 'M', u'3⁄5'), + (0x2158, 'M', u'4⁄5'), + (0x2159, 'M', u'1⁄6'), + (0x215A, 'M', u'5⁄6'), + (0x215B, 'M', u'1⁄8'), + (0x215C, 'M', u'3⁄8'), + (0x215D, 'M', u'5⁄8'), + (0x215E, 'M', u'7⁄8'), + (0x215F, 'M', u'1⁄'), + (0x2160, 'M', u'i'), + (0x2161, 'M', u'ii'), + (0x2162, 'M', u'iii'), + (0x2163, 'M', u'iv'), + (0x2164, 'M', u'v'), + (0x2165, 'M', u'vi'), + (0x2166, 'M', u'vii'), + (0x2167, 'M', u'viii'), + (0x2168, 'M', u'ix'), + (0x2169, 'M', u'x'), + (0x216A, 'M', u'xi'), + (0x216B, 'M', u'xii'), + (0x216C, 'M', u'l'), + (0x216D, 'M', u'c'), + (0x216E, 'M', u'd'), + (0x216F, 'M', u'm'), + (0x2170, 'M', u'i'), + (0x2171, 'M', u'ii'), + (0x2172, 'M', u'iii'), + (0x2173, 'M', u'iv'), + (0x2174, 'M', u'v'), + (0x2175, 'M', u'vi'), + (0x2176, 'M', u'vii'), + (0x2177, 'M', u'viii'), + (0x2178, 'M', u'ix'), + (0x2179, 'M', u'x'), + (0x217A, 'M', u'xi'), + (0x217B, 'M', u'xii'), + (0x217C, 'M', u'l'), + (0x217D, 'M', u'c'), + (0x217E, 'M', u'd'), + (0x217F, 'M', u'm'), + (0x2180, 'V'), + (0x2183, 'X'), + (0x2184, 'V'), + (0x2189, 'M', u'0⁄3'), + (0x218A, 'V'), + (0x218C, 'X'), + (0x2190, 'V'), + (0x222C, 'M', u'∫∫'), + (0x222D, 'M', u'∫∫∫'), + (0x222E, 'V'), + (0x222F, 'M', u'∮∮'), + (0x2230, 'M', u'∮∮∮'), + (0x2231, 'V'), + (0x2260, '3'), + (0x2261, 'V'), + (0x226E, '3'), + (0x2270, 'V'), + (0x2329, 'M', u'〈'), + ] + +def _seg_23(): + return [ + (0x232A, 'M', u'〉'), + (0x232B, 'V'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', u'1'), + (0x2461, 'M', u'2'), + (0x2462, 'M', u'3'), + (0x2463, 'M', u'4'), + (0x2464, 'M', u'5'), + (0x2465, 'M', u'6'), + (0x2466, 'M', u'7'), + (0x2467, 'M', u'8'), + (0x2468, 'M', u'9'), + (0x2469, 'M', u'10'), + (0x246A, 'M', u'11'), + (0x246B, 'M', u'12'), + (0x246C, 'M', u'13'), + (0x246D, 'M', u'14'), + (0x246E, 'M', u'15'), + (0x246F, 'M', u'16'), + (0x2470, 'M', u'17'), + (0x2471, 'M', u'18'), + (0x2472, 'M', u'19'), + (0x2473, 'M', u'20'), + (0x2474, '3', u'(1)'), + (0x2475, '3', u'(2)'), + (0x2476, '3', u'(3)'), + (0x2477, '3', u'(4)'), + (0x2478, '3', u'(5)'), + (0x2479, '3', u'(6)'), + (0x247A, '3', u'(7)'), + (0x247B, '3', u'(8)'), + (0x247C, '3', u'(9)'), + (0x247D, '3', u'(10)'), + (0x247E, '3', u'(11)'), + (0x247F, '3', u'(12)'), + (0x2480, '3', u'(13)'), + (0x2481, '3', u'(14)'), + (0x2482, '3', u'(15)'), + (0x2483, '3', u'(16)'), + (0x2484, '3', u'(17)'), + (0x2485, '3', u'(18)'), + (0x2486, '3', u'(19)'), + (0x2487, '3', u'(20)'), + (0x2488, 'X'), + (0x249C, '3', u'(a)'), + (0x249D, '3', u'(b)'), + (0x249E, '3', u'(c)'), + (0x249F, '3', u'(d)'), + (0x24A0, '3', u'(e)'), + (0x24A1, '3', u'(f)'), + (0x24A2, '3', u'(g)'), + (0x24A3, '3', u'(h)'), + (0x24A4, '3', u'(i)'), + (0x24A5, '3', u'(j)'), + (0x24A6, '3', u'(k)'), + (0x24A7, '3', u'(l)'), + (0x24A8, '3', u'(m)'), + (0x24A9, '3', u'(n)'), + (0x24AA, '3', u'(o)'), + (0x24AB, '3', u'(p)'), + (0x24AC, '3', u'(q)'), + (0x24AD, '3', u'(r)'), + (0x24AE, '3', u'(s)'), + (0x24AF, '3', u'(t)'), + (0x24B0, '3', u'(u)'), + (0x24B1, '3', u'(v)'), + (0x24B2, '3', u'(w)'), + (0x24B3, '3', u'(x)'), + (0x24B4, '3', u'(y)'), + (0x24B5, '3', u'(z)'), + (0x24B6, 'M', u'a'), + (0x24B7, 'M', u'b'), + (0x24B8, 'M', u'c'), + (0x24B9, 'M', u'd'), + (0x24BA, 'M', u'e'), + (0x24BB, 'M', u'f'), + (0x24BC, 'M', u'g'), + (0x24BD, 'M', u'h'), + (0x24BE, 'M', u'i'), + (0x24BF, 'M', u'j'), + (0x24C0, 'M', u'k'), + (0x24C1, 'M', u'l'), + (0x24C2, 'M', u'm'), + (0x24C3, 'M', u'n'), + (0x24C4, 'M', u'o'), + (0x24C5, 'M', u'p'), + (0x24C6, 'M', u'q'), + (0x24C7, 'M', u'r'), + (0x24C8, 'M', u's'), + (0x24C9, 'M', u't'), + (0x24CA, 'M', u'u'), + (0x24CB, 'M', u'v'), + (0x24CC, 'M', u'w'), + (0x24CD, 'M', u'x'), + (0x24CE, 'M', u'y'), + (0x24CF, 'M', u'z'), + (0x24D0, 'M', u'a'), + (0x24D1, 'M', u'b'), + ] + +def _seg_24(): + return [ + (0x24D2, 'M', u'c'), + (0x24D3, 'M', u'd'), + (0x24D4, 'M', u'e'), + (0x24D5, 'M', u'f'), + (0x24D6, 'M', u'g'), + (0x24D7, 'M', u'h'), + (0x24D8, 'M', u'i'), + (0x24D9, 'M', u'j'), + (0x24DA, 'M', u'k'), + (0x24DB, 'M', u'l'), + (0x24DC, 'M', u'm'), + (0x24DD, 'M', u'n'), + (0x24DE, 'M', u'o'), + (0x24DF, 'M', u'p'), + (0x24E0, 'M', u'q'), + (0x24E1, 'M', u'r'), + (0x24E2, 'M', u's'), + (0x24E3, 'M', u't'), + (0x24E4, 'M', u'u'), + (0x24E5, 'M', u'v'), + (0x24E6, 'M', u'w'), + (0x24E7, 'M', u'x'), + (0x24E8, 'M', u'y'), + (0x24E9, 'M', u'z'), + (0x24EA, 'M', u'0'), + (0x24EB, 'V'), + (0x2A0C, 'M', u'∫∫∫∫'), + (0x2A0D, 'V'), + (0x2A74, '3', u'::='), + (0x2A75, '3', u'=='), + (0x2A76, '3', u'==='), + (0x2A77, 'V'), + (0x2ADC, 'M', u'⫝̸'), + (0x2ADD, 'V'), + (0x2B74, 'X'), + (0x2B76, 'V'), + (0x2B96, 'X'), + (0x2B98, 'V'), + (0x2BBA, 'X'), + (0x2BBD, 'V'), + (0x2BC9, 'X'), + (0x2BCA, 'V'), + (0x2BD3, 'X'), + (0x2BEC, 'V'), + (0x2BF0, 'X'), + (0x2C00, 'M', u'ⰰ'), + (0x2C01, 'M', u'ⰱ'), + (0x2C02, 'M', u'ⰲ'), + (0x2C03, 'M', u'ⰳ'), + (0x2C04, 'M', u'ⰴ'), + (0x2C05, 'M', u'ⰵ'), + (0x2C06, 'M', u'ⰶ'), + (0x2C07, 'M', u'ⰷ'), + (0x2C08, 'M', u'ⰸ'), + (0x2C09, 'M', u'ⰹ'), + (0x2C0A, 'M', u'ⰺ'), + (0x2C0B, 'M', u'ⰻ'), + (0x2C0C, 'M', u'ⰼ'), + (0x2C0D, 'M', u'ⰽ'), + (0x2C0E, 'M', u'ⰾ'), + (0x2C0F, 'M', u'ⰿ'), + (0x2C10, 'M', u'ⱀ'), + (0x2C11, 'M', u'ⱁ'), + (0x2C12, 'M', u'ⱂ'), + (0x2C13, 'M', u'ⱃ'), + (0x2C14, 'M', u'ⱄ'), + (0x2C15, 'M', u'ⱅ'), + (0x2C16, 'M', u'ⱆ'), + (0x2C17, 'M', u'ⱇ'), + (0x2C18, 'M', u'ⱈ'), + (0x2C19, 'M', u'ⱉ'), + (0x2C1A, 'M', u'ⱊ'), + (0x2C1B, 'M', u'ⱋ'), + (0x2C1C, 'M', u'ⱌ'), + (0x2C1D, 'M', u'ⱍ'), + (0x2C1E, 'M', u'ⱎ'), + (0x2C1F, 'M', u'ⱏ'), + (0x2C20, 'M', u'ⱐ'), + (0x2C21, 'M', u'ⱑ'), + (0x2C22, 'M', u'ⱒ'), + (0x2C23, 'M', u'ⱓ'), + (0x2C24, 'M', u'ⱔ'), + (0x2C25, 'M', u'ⱕ'), + (0x2C26, 'M', u'ⱖ'), + (0x2C27, 'M', u'ⱗ'), + (0x2C28, 'M', u'ⱘ'), + (0x2C29, 'M', u'ⱙ'), + (0x2C2A, 'M', u'ⱚ'), + (0x2C2B, 'M', u'ⱛ'), + (0x2C2C, 'M', u'ⱜ'), + (0x2C2D, 'M', u'ⱝ'), + (0x2C2E, 'M', u'ⱞ'), + (0x2C2F, 'X'), + (0x2C30, 'V'), + (0x2C5F, 'X'), + (0x2C60, 'M', u'ⱡ'), + (0x2C61, 'V'), + (0x2C62, 'M', u'ɫ'), + (0x2C63, 'M', u'ᵽ'), + (0x2C64, 'M', u'ɽ'), + ] + +def _seg_25(): + return [ + (0x2C65, 'V'), + (0x2C67, 'M', u'ⱨ'), + (0x2C68, 'V'), + (0x2C69, 'M', u'ⱪ'), + (0x2C6A, 'V'), + (0x2C6B, 'M', u'ⱬ'), + (0x2C6C, 'V'), + (0x2C6D, 'M', u'ɑ'), + (0x2C6E, 'M', u'ɱ'), + (0x2C6F, 'M', u'ɐ'), + (0x2C70, 'M', u'ɒ'), + (0x2C71, 'V'), + (0x2C72, 'M', u'ⱳ'), + (0x2C73, 'V'), + (0x2C75, 'M', u'ⱶ'), + (0x2C76, 'V'), + (0x2C7C, 'M', u'j'), + (0x2C7D, 'M', u'v'), + (0x2C7E, 'M', u'ȿ'), + (0x2C7F, 'M', u'ɀ'), + (0x2C80, 'M', u'ⲁ'), + (0x2C81, 'V'), + (0x2C82, 'M', u'ⲃ'), + (0x2C83, 'V'), + (0x2C84, 'M', u'ⲅ'), + (0x2C85, 'V'), + (0x2C86, 'M', u'ⲇ'), + (0x2C87, 'V'), + (0x2C88, 'M', u'ⲉ'), + (0x2C89, 'V'), + (0x2C8A, 'M', u'ⲋ'), + (0x2C8B, 'V'), + (0x2C8C, 'M', u'ⲍ'), + (0x2C8D, 'V'), + (0x2C8E, 'M', u'ⲏ'), + (0x2C8F, 'V'), + (0x2C90, 'M', u'ⲑ'), + (0x2C91, 'V'), + (0x2C92, 'M', u'ⲓ'), + (0x2C93, 'V'), + (0x2C94, 'M', u'ⲕ'), + (0x2C95, 'V'), + (0x2C96, 'M', u'ⲗ'), + (0x2C97, 'V'), + (0x2C98, 'M', u'ⲙ'), + (0x2C99, 'V'), + (0x2C9A, 'M', u'ⲛ'), + (0x2C9B, 'V'), + (0x2C9C, 'M', u'ⲝ'), + (0x2C9D, 'V'), + (0x2C9E, 'M', u'ⲟ'), + (0x2C9F, 'V'), + (0x2CA0, 'M', u'ⲡ'), + (0x2CA1, 'V'), + (0x2CA2, 'M', u'ⲣ'), + (0x2CA3, 'V'), + (0x2CA4, 'M', u'ⲥ'), + (0x2CA5, 'V'), + (0x2CA6, 'M', u'ⲧ'), + (0x2CA7, 'V'), + (0x2CA8, 'M', u'ⲩ'), + (0x2CA9, 'V'), + (0x2CAA, 'M', u'ⲫ'), + (0x2CAB, 'V'), + (0x2CAC, 'M', u'ⲭ'), + (0x2CAD, 'V'), + (0x2CAE, 'M', u'ⲯ'), + (0x2CAF, 'V'), + (0x2CB0, 'M', u'ⲱ'), + (0x2CB1, 'V'), + (0x2CB2, 'M', u'ⲳ'), + (0x2CB3, 'V'), + (0x2CB4, 'M', u'ⲵ'), + (0x2CB5, 'V'), + (0x2CB6, 'M', u'ⲷ'), + (0x2CB7, 'V'), + (0x2CB8, 'M', u'ⲹ'), + (0x2CB9, 'V'), + (0x2CBA, 'M', u'ⲻ'), + (0x2CBB, 'V'), + (0x2CBC, 'M', u'ⲽ'), + (0x2CBD, 'V'), + (0x2CBE, 'M', u'ⲿ'), + (0x2CBF, 'V'), + (0x2CC0, 'M', u'ⳁ'), + (0x2CC1, 'V'), + (0x2CC2, 'M', u'ⳃ'), + (0x2CC3, 'V'), + (0x2CC4, 'M', u'ⳅ'), + (0x2CC5, 'V'), + (0x2CC6, 'M', u'ⳇ'), + (0x2CC7, 'V'), + (0x2CC8, 'M', u'ⳉ'), + (0x2CC9, 'V'), + (0x2CCA, 'M', u'ⳋ'), + (0x2CCB, 'V'), + (0x2CCC, 'M', u'ⳍ'), + (0x2CCD, 'V'), + (0x2CCE, 'M', u'ⳏ'), + (0x2CCF, 'V'), + ] + +def _seg_26(): + return [ + (0x2CD0, 'M', u'ⳑ'), + (0x2CD1, 'V'), + (0x2CD2, 'M', u'ⳓ'), + (0x2CD3, 'V'), + (0x2CD4, 'M', u'ⳕ'), + (0x2CD5, 'V'), + (0x2CD6, 'M', u'ⳗ'), + (0x2CD7, 'V'), + (0x2CD8, 'M', u'ⳙ'), + (0x2CD9, 'V'), + (0x2CDA, 'M', u'ⳛ'), + (0x2CDB, 'V'), + (0x2CDC, 'M', u'ⳝ'), + (0x2CDD, 'V'), + (0x2CDE, 'M', u'ⳟ'), + (0x2CDF, 'V'), + (0x2CE0, 'M', u'ⳡ'), + (0x2CE1, 'V'), + (0x2CE2, 'M', u'ⳣ'), + (0x2CE3, 'V'), + (0x2CEB, 'M', u'ⳬ'), + (0x2CEC, 'V'), + (0x2CED, 'M', u'ⳮ'), + (0x2CEE, 'V'), + (0x2CF2, 'M', u'ⳳ'), + (0x2CF3, 'V'), + (0x2CF4, 'X'), + (0x2CF9, 'V'), + (0x2D26, 'X'), + (0x2D27, 'V'), + (0x2D28, 'X'), + (0x2D2D, 'V'), + (0x2D2E, 'X'), + (0x2D30, 'V'), + (0x2D68, 'X'), + (0x2D6F, 'M', u'ⵡ'), + (0x2D70, 'V'), + (0x2D71, 'X'), + (0x2D7F, 'V'), + (0x2D97, 'X'), + (0x2DA0, 'V'), + (0x2DA7, 'X'), + (0x2DA8, 'V'), + (0x2DAF, 'X'), + (0x2DB0, 'V'), + (0x2DB7, 'X'), + (0x2DB8, 'V'), + (0x2DBF, 'X'), + (0x2DC0, 'V'), + (0x2DC7, 'X'), + (0x2DC8, 'V'), + (0x2DCF, 'X'), + (0x2DD0, 'V'), + (0x2DD7, 'X'), + (0x2DD8, 'V'), + (0x2DDF, 'X'), + (0x2DE0, 'V'), + (0x2E4A, 'X'), + (0x2E80, 'V'), + (0x2E9A, 'X'), + (0x2E9B, 'V'), + (0x2E9F, 'M', u'母'), + (0x2EA0, 'V'), + (0x2EF3, 'M', u'龟'), + (0x2EF4, 'X'), + (0x2F00, 'M', u'一'), + (0x2F01, 'M', u'丨'), + (0x2F02, 'M', u'丶'), + (0x2F03, 'M', u'丿'), + (0x2F04, 'M', u'乙'), + (0x2F05, 'M', u'亅'), + (0x2F06, 'M', u'二'), + (0x2F07, 'M', u'亠'), + (0x2F08, 'M', u'人'), + (0x2F09, 'M', u'儿'), + (0x2F0A, 'M', u'入'), + (0x2F0B, 'M', u'八'), + (0x2F0C, 'M', u'冂'), + (0x2F0D, 'M', u'冖'), + (0x2F0E, 'M', u'冫'), + (0x2F0F, 'M', u'几'), + (0x2F10, 'M', u'凵'), + (0x2F11, 'M', u'刀'), + (0x2F12, 'M', u'力'), + (0x2F13, 'M', u'勹'), + (0x2F14, 'M', u'匕'), + (0x2F15, 'M', u'匚'), + (0x2F16, 'M', u'匸'), + (0x2F17, 'M', u'十'), + (0x2F18, 'M', u'卜'), + (0x2F19, 'M', u'卩'), + (0x2F1A, 'M', u'厂'), + (0x2F1B, 'M', u'厶'), + (0x2F1C, 'M', u'又'), + (0x2F1D, 'M', u'口'), + (0x2F1E, 'M', u'囗'), + (0x2F1F, 'M', u'土'), + (0x2F20, 'M', u'士'), + (0x2F21, 'M', u'夂'), + (0x2F22, 'M', u'夊'), + ] + +def _seg_27(): + return [ + (0x2F23, 'M', u'夕'), + (0x2F24, 'M', u'大'), + (0x2F25, 'M', u'女'), + (0x2F26, 'M', u'子'), + (0x2F27, 'M', u'宀'), + (0x2F28, 'M', u'寸'), + (0x2F29, 'M', u'小'), + (0x2F2A, 'M', u'尢'), + (0x2F2B, 'M', u'尸'), + (0x2F2C, 'M', u'屮'), + (0x2F2D, 'M', u'山'), + (0x2F2E, 'M', u'巛'), + (0x2F2F, 'M', u'工'), + (0x2F30, 'M', u'己'), + (0x2F31, 'M', u'巾'), + (0x2F32, 'M', u'干'), + (0x2F33, 'M', u'幺'), + (0x2F34, 'M', u'广'), + (0x2F35, 'M', u'廴'), + (0x2F36, 'M', u'廾'), + (0x2F37, 'M', u'弋'), + (0x2F38, 'M', u'弓'), + (0x2F39, 'M', u'彐'), + (0x2F3A, 'M', u'彡'), + (0x2F3B, 'M', u'彳'), + (0x2F3C, 'M', u'心'), + (0x2F3D, 'M', u'戈'), + (0x2F3E, 'M', u'戶'), + (0x2F3F, 'M', u'手'), + (0x2F40, 'M', u'支'), + (0x2F41, 'M', u'攴'), + (0x2F42, 'M', u'文'), + (0x2F43, 'M', u'斗'), + (0x2F44, 'M', u'斤'), + (0x2F45, 'M', u'方'), + (0x2F46, 'M', u'无'), + (0x2F47, 'M', u'日'), + (0x2F48, 'M', u'曰'), + (0x2F49, 'M', u'月'), + (0x2F4A, 'M', u'木'), + (0x2F4B, 'M', u'欠'), + (0x2F4C, 'M', u'止'), + (0x2F4D, 'M', u'歹'), + (0x2F4E, 'M', u'殳'), + (0x2F4F, 'M', u'毋'), + (0x2F50, 'M', u'比'), + (0x2F51, 'M', u'毛'), + (0x2F52, 'M', u'氏'), + (0x2F53, 'M', u'气'), + (0x2F54, 'M', u'水'), + (0x2F55, 'M', u'火'), + (0x2F56, 'M', u'爪'), + (0x2F57, 'M', u'父'), + (0x2F58, 'M', u'爻'), + (0x2F59, 'M', u'爿'), + (0x2F5A, 'M', u'片'), + (0x2F5B, 'M', u'牙'), + (0x2F5C, 'M', u'牛'), + (0x2F5D, 'M', u'犬'), + (0x2F5E, 'M', u'玄'), + (0x2F5F, 'M', u'玉'), + (0x2F60, 'M', u'瓜'), + (0x2F61, 'M', u'瓦'), + (0x2F62, 'M', u'甘'), + (0x2F63, 'M', u'生'), + (0x2F64, 'M', u'用'), + (0x2F65, 'M', u'田'), + (0x2F66, 'M', u'疋'), + (0x2F67, 'M', u'疒'), + (0x2F68, 'M', u'癶'), + (0x2F69, 'M', u'白'), + (0x2F6A, 'M', u'皮'), + (0x2F6B, 'M', u'皿'), + (0x2F6C, 'M', u'目'), + (0x2F6D, 'M', u'矛'), + (0x2F6E, 'M', u'矢'), + (0x2F6F, 'M', u'石'), + (0x2F70, 'M', u'示'), + (0x2F71, 'M', u'禸'), + (0x2F72, 'M', u'禾'), + (0x2F73, 'M', u'穴'), + (0x2F74, 'M', u'立'), + (0x2F75, 'M', u'竹'), + (0x2F76, 'M', u'米'), + (0x2F77, 'M', u'糸'), + (0x2F78, 'M', u'缶'), + (0x2F79, 'M', u'网'), + (0x2F7A, 'M', u'羊'), + (0x2F7B, 'M', u'羽'), + (0x2F7C, 'M', u'老'), + (0x2F7D, 'M', u'而'), + (0x2F7E, 'M', u'耒'), + (0x2F7F, 'M', u'耳'), + (0x2F80, 'M', u'聿'), + (0x2F81, 'M', u'肉'), + (0x2F82, 'M', u'臣'), + (0x2F83, 'M', u'自'), + (0x2F84, 'M', u'至'), + (0x2F85, 'M', u'臼'), + (0x2F86, 'M', u'舌'), + ] + +def _seg_28(): + return [ + (0x2F87, 'M', u'舛'), + (0x2F88, 'M', u'舟'), + (0x2F89, 'M', u'艮'), + (0x2F8A, 'M', u'色'), + (0x2F8B, 'M', u'艸'), + (0x2F8C, 'M', u'虍'), + (0x2F8D, 'M', u'虫'), + (0x2F8E, 'M', u'血'), + (0x2F8F, 'M', u'行'), + (0x2F90, 'M', u'衣'), + (0x2F91, 'M', u'襾'), + (0x2F92, 'M', u'見'), + (0x2F93, 'M', u'角'), + (0x2F94, 'M', u'言'), + (0x2F95, 'M', u'谷'), + (0x2F96, 'M', u'豆'), + (0x2F97, 'M', u'豕'), + (0x2F98, 'M', u'豸'), + (0x2F99, 'M', u'貝'), + (0x2F9A, 'M', u'赤'), + (0x2F9B, 'M', u'走'), + (0x2F9C, 'M', u'足'), + (0x2F9D, 'M', u'身'), + (0x2F9E, 'M', u'車'), + (0x2F9F, 'M', u'辛'), + (0x2FA0, 'M', u'辰'), + (0x2FA1, 'M', u'辵'), + (0x2FA2, 'M', u'邑'), + (0x2FA3, 'M', u'酉'), + (0x2FA4, 'M', u'釆'), + (0x2FA5, 'M', u'里'), + (0x2FA6, 'M', u'金'), + (0x2FA7, 'M', u'長'), + (0x2FA8, 'M', u'門'), + (0x2FA9, 'M', u'阜'), + (0x2FAA, 'M', u'隶'), + (0x2FAB, 'M', u'隹'), + (0x2FAC, 'M', u'雨'), + (0x2FAD, 'M', u'靑'), + (0x2FAE, 'M', u'非'), + (0x2FAF, 'M', u'面'), + (0x2FB0, 'M', u'革'), + (0x2FB1, 'M', u'韋'), + (0x2FB2, 'M', u'韭'), + (0x2FB3, 'M', u'音'), + (0x2FB4, 'M', u'頁'), + (0x2FB5, 'M', u'風'), + (0x2FB6, 'M', u'飛'), + (0x2FB7, 'M', u'食'), + (0x2FB8, 'M', u'首'), + (0x2FB9, 'M', u'香'), + (0x2FBA, 'M', u'馬'), + (0x2FBB, 'M', u'骨'), + (0x2FBC, 'M', u'高'), + (0x2FBD, 'M', u'髟'), + (0x2FBE, 'M', u'鬥'), + (0x2FBF, 'M', u'鬯'), + (0x2FC0, 'M', u'鬲'), + (0x2FC1, 'M', u'鬼'), + (0x2FC2, 'M', u'魚'), + (0x2FC3, 'M', u'鳥'), + (0x2FC4, 'M', u'鹵'), + (0x2FC5, 'M', u'鹿'), + (0x2FC6, 'M', u'麥'), + (0x2FC7, 'M', u'麻'), + (0x2FC8, 'M', u'黃'), + (0x2FC9, 'M', u'黍'), + (0x2FCA, 'M', u'黑'), + (0x2FCB, 'M', u'黹'), + (0x2FCC, 'M', u'黽'), + (0x2FCD, 'M', u'鼎'), + (0x2FCE, 'M', u'鼓'), + (0x2FCF, 'M', u'鼠'), + (0x2FD0, 'M', u'鼻'), + (0x2FD1, 'M', u'齊'), + (0x2FD2, 'M', u'齒'), + (0x2FD3, 'M', u'龍'), + (0x2FD4, 'M', u'龜'), + (0x2FD5, 'M', u'龠'), + (0x2FD6, 'X'), + (0x3000, '3', u' '), + (0x3001, 'V'), + (0x3002, 'M', u'.'), + (0x3003, 'V'), + (0x3036, 'M', u'〒'), + (0x3037, 'V'), + (0x3038, 'M', u'十'), + (0x3039, 'M', u'卄'), + (0x303A, 'M', u'卅'), + (0x303B, 'V'), + (0x3040, 'X'), + (0x3041, 'V'), + (0x3097, 'X'), + (0x3099, 'V'), + (0x309B, '3', u' ゙'), + (0x309C, '3', u' ゚'), + (0x309D, 'V'), + (0x309F, 'M', u'より'), + (0x30A0, 'V'), + (0x30FF, 'M', u'コト'), + ] + +def _seg_29(): + return [ + (0x3100, 'X'), + (0x3105, 'V'), + (0x312F, 'X'), + (0x3131, 'M', u'ᄀ'), + (0x3132, 'M', u'ᄁ'), + (0x3133, 'M', u'ᆪ'), + (0x3134, 'M', u'ᄂ'), + (0x3135, 'M', u'ᆬ'), + (0x3136, 'M', u'ᆭ'), + (0x3137, 'M', u'ᄃ'), + (0x3138, 'M', u'ᄄ'), + (0x3139, 'M', u'ᄅ'), + (0x313A, 'M', u'ᆰ'), + (0x313B, 'M', u'ᆱ'), + (0x313C, 'M', u'ᆲ'), + (0x313D, 'M', u'ᆳ'), + (0x313E, 'M', u'ᆴ'), + (0x313F, 'M', u'ᆵ'), + (0x3140, 'M', u'ᄚ'), + (0x3141, 'M', u'ᄆ'), + (0x3142, 'M', u'ᄇ'), + (0x3143, 'M', u'ᄈ'), + (0x3144, 'M', u'ᄡ'), + (0x3145, 'M', u'ᄉ'), + (0x3146, 'M', u'ᄊ'), + (0x3147, 'M', u'ᄋ'), + (0x3148, 'M', u'ᄌ'), + (0x3149, 'M', u'ᄍ'), + (0x314A, 'M', u'ᄎ'), + (0x314B, 'M', u'ᄏ'), + (0x314C, 'M', u'ᄐ'), + (0x314D, 'M', u'ᄑ'), + (0x314E, 'M', u'ᄒ'), + (0x314F, 'M', u'ᅡ'), + (0x3150, 'M', u'ᅢ'), + (0x3151, 'M', u'ᅣ'), + (0x3152, 'M', u'ᅤ'), + (0x3153, 'M', u'ᅥ'), + (0x3154, 'M', u'ᅦ'), + (0x3155, 'M', u'ᅧ'), + (0x3156, 'M', u'ᅨ'), + (0x3157, 'M', u'ᅩ'), + (0x3158, 'M', u'ᅪ'), + (0x3159, 'M', u'ᅫ'), + (0x315A, 'M', u'ᅬ'), + (0x315B, 'M', u'ᅭ'), + (0x315C, 'M', u'ᅮ'), + (0x315D, 'M', u'ᅯ'), + (0x315E, 'M', u'ᅰ'), + (0x315F, 'M', u'ᅱ'), + (0x3160, 'M', u'ᅲ'), + (0x3161, 'M', u'ᅳ'), + (0x3162, 'M', u'ᅴ'), + (0x3163, 'M', u'ᅵ'), + (0x3164, 'X'), + (0x3165, 'M', u'ᄔ'), + (0x3166, 'M', u'ᄕ'), + (0x3167, 'M', u'ᇇ'), + (0x3168, 'M', u'ᇈ'), + (0x3169, 'M', u'ᇌ'), + (0x316A, 'M', u'ᇎ'), + (0x316B, 'M', u'ᇓ'), + (0x316C, 'M', u'ᇗ'), + (0x316D, 'M', u'ᇙ'), + (0x316E, 'M', u'ᄜ'), + (0x316F, 'M', u'ᇝ'), + (0x3170, 'M', u'ᇟ'), + (0x3171, 'M', u'ᄝ'), + (0x3172, 'M', u'ᄞ'), + (0x3173, 'M', u'ᄠ'), + (0x3174, 'M', u'ᄢ'), + (0x3175, 'M', u'ᄣ'), + (0x3176, 'M', u'ᄧ'), + (0x3177, 'M', u'ᄩ'), + (0x3178, 'M', u'ᄫ'), + (0x3179, 'M', u'ᄬ'), + (0x317A, 'M', u'ᄭ'), + (0x317B, 'M', u'ᄮ'), + (0x317C, 'M', u'ᄯ'), + (0x317D, 'M', u'ᄲ'), + (0x317E, 'M', u'ᄶ'), + (0x317F, 'M', u'ᅀ'), + (0x3180, 'M', u'ᅇ'), + (0x3181, 'M', u'ᅌ'), + (0x3182, 'M', u'ᇱ'), + (0x3183, 'M', u'ᇲ'), + (0x3184, 'M', u'ᅗ'), + (0x3185, 'M', u'ᅘ'), + (0x3186, 'M', u'ᅙ'), + (0x3187, 'M', u'ᆄ'), + (0x3188, 'M', u'ᆅ'), + (0x3189, 'M', u'ᆈ'), + (0x318A, 'M', u'ᆑ'), + (0x318B, 'M', u'ᆒ'), + (0x318C, 'M', u'ᆔ'), + (0x318D, 'M', u'ᆞ'), + (0x318E, 'M', u'ᆡ'), + (0x318F, 'X'), + (0x3190, 'V'), + (0x3192, 'M', u'一'), + ] + +def _seg_30(): + return [ + (0x3193, 'M', u'二'), + (0x3194, 'M', u'三'), + (0x3195, 'M', u'四'), + (0x3196, 'M', u'上'), + (0x3197, 'M', u'中'), + (0x3198, 'M', u'下'), + (0x3199, 'M', u'甲'), + (0x319A, 'M', u'乙'), + (0x319B, 'M', u'丙'), + (0x319C, 'M', u'丁'), + (0x319D, 'M', u'天'), + (0x319E, 'M', u'地'), + (0x319F, 'M', u'人'), + (0x31A0, 'V'), + (0x31BB, 'X'), + (0x31C0, 'V'), + (0x31E4, 'X'), + (0x31F0, 'V'), + (0x3200, '3', u'(ᄀ)'), + (0x3201, '3', u'(ᄂ)'), + (0x3202, '3', u'(ᄃ)'), + (0x3203, '3', u'(ᄅ)'), + (0x3204, '3', u'(ᄆ)'), + (0x3205, '3', u'(ᄇ)'), + (0x3206, '3', u'(ᄉ)'), + (0x3207, '3', u'(ᄋ)'), + (0x3208, '3', u'(ᄌ)'), + (0x3209, '3', u'(ᄎ)'), + (0x320A, '3', u'(ᄏ)'), + (0x320B, '3', u'(ᄐ)'), + (0x320C, '3', u'(ᄑ)'), + (0x320D, '3', u'(ᄒ)'), + (0x320E, '3', u'(가)'), + (0x320F, '3', u'(나)'), + (0x3210, '3', u'(다)'), + (0x3211, '3', u'(라)'), + (0x3212, '3', u'(마)'), + (0x3213, '3', u'(바)'), + (0x3214, '3', u'(사)'), + (0x3215, '3', u'(아)'), + (0x3216, '3', u'(자)'), + (0x3217, '3', u'(차)'), + (0x3218, '3', u'(카)'), + (0x3219, '3', u'(타)'), + (0x321A, '3', u'(파)'), + (0x321B, '3', u'(하)'), + (0x321C, '3', u'(주)'), + (0x321D, '3', u'(오전)'), + (0x321E, '3', u'(오후)'), + (0x321F, 'X'), + (0x3220, '3', u'(一)'), + (0x3221, '3', u'(二)'), + (0x3222, '3', u'(三)'), + (0x3223, '3', u'(四)'), + (0x3224, '3', u'(五)'), + (0x3225, '3', u'(六)'), + (0x3226, '3', u'(七)'), + (0x3227, '3', u'(八)'), + (0x3228, '3', u'(九)'), + (0x3229, '3', u'(十)'), + (0x322A, '3', u'(月)'), + (0x322B, '3', u'(火)'), + (0x322C, '3', u'(水)'), + (0x322D, '3', u'(木)'), + (0x322E, '3', u'(金)'), + (0x322F, '3', u'(土)'), + (0x3230, '3', u'(日)'), + (0x3231, '3', u'(株)'), + (0x3232, '3', u'(有)'), + (0x3233, '3', u'(社)'), + (0x3234, '3', u'(名)'), + (0x3235, '3', u'(特)'), + (0x3236, '3', u'(財)'), + (0x3237, '3', u'(祝)'), + (0x3238, '3', u'(労)'), + (0x3239, '3', u'(代)'), + (0x323A, '3', u'(呼)'), + (0x323B, '3', u'(学)'), + (0x323C, '3', u'(監)'), + (0x323D, '3', u'(企)'), + (0x323E, '3', u'(資)'), + (0x323F, '3', u'(協)'), + (0x3240, '3', u'(祭)'), + (0x3241, '3', u'(休)'), + (0x3242, '3', u'(自)'), + (0x3243, '3', u'(至)'), + (0x3244, 'M', u'問'), + (0x3245, 'M', u'幼'), + (0x3246, 'M', u'文'), + (0x3247, 'M', u'箏'), + (0x3248, 'V'), + (0x3250, 'M', u'pte'), + (0x3251, 'M', u'21'), + (0x3252, 'M', u'22'), + (0x3253, 'M', u'23'), + (0x3254, 'M', u'24'), + (0x3255, 'M', u'25'), + (0x3256, 'M', u'26'), + (0x3257, 'M', u'27'), + (0x3258, 'M', u'28'), + ] + +def _seg_31(): + return [ + (0x3259, 'M', u'29'), + (0x325A, 'M', u'30'), + (0x325B, 'M', u'31'), + (0x325C, 'M', u'32'), + (0x325D, 'M', u'33'), + (0x325E, 'M', u'34'), + (0x325F, 'M', u'35'), + (0x3260, 'M', u'ᄀ'), + (0x3261, 'M', u'ᄂ'), + (0x3262, 'M', u'ᄃ'), + (0x3263, 'M', u'ᄅ'), + (0x3264, 'M', u'ᄆ'), + (0x3265, 'M', u'ᄇ'), + (0x3266, 'M', u'ᄉ'), + (0x3267, 'M', u'ᄋ'), + (0x3268, 'M', u'ᄌ'), + (0x3269, 'M', u'ᄎ'), + (0x326A, 'M', u'ᄏ'), + (0x326B, 'M', u'ᄐ'), + (0x326C, 'M', u'ᄑ'), + (0x326D, 'M', u'ᄒ'), + (0x326E, 'M', u'가'), + (0x326F, 'M', u'나'), + (0x3270, 'M', u'다'), + (0x3271, 'M', u'라'), + (0x3272, 'M', u'마'), + (0x3273, 'M', u'바'), + (0x3274, 'M', u'사'), + (0x3275, 'M', u'아'), + (0x3276, 'M', u'자'), + (0x3277, 'M', u'차'), + (0x3278, 'M', u'카'), + (0x3279, 'M', u'타'), + (0x327A, 'M', u'파'), + (0x327B, 'M', u'하'), + (0x327C, 'M', u'참고'), + (0x327D, 'M', u'주의'), + (0x327E, 'M', u'우'), + (0x327F, 'V'), + (0x3280, 'M', u'一'), + (0x3281, 'M', u'二'), + (0x3282, 'M', u'三'), + (0x3283, 'M', u'四'), + (0x3284, 'M', u'五'), + (0x3285, 'M', u'六'), + (0x3286, 'M', u'七'), + (0x3287, 'M', u'八'), + (0x3288, 'M', u'九'), + (0x3289, 'M', u'十'), + (0x328A, 'M', u'月'), + (0x328B, 'M', u'火'), + (0x328C, 'M', u'水'), + (0x328D, 'M', u'木'), + (0x328E, 'M', u'金'), + (0x328F, 'M', u'土'), + (0x3290, 'M', u'日'), + (0x3291, 'M', u'株'), + (0x3292, 'M', u'有'), + (0x3293, 'M', u'社'), + (0x3294, 'M', u'名'), + (0x3295, 'M', u'特'), + (0x3296, 'M', u'財'), + (0x3297, 'M', u'祝'), + (0x3298, 'M', u'労'), + (0x3299, 'M', u'秘'), + (0x329A, 'M', u'男'), + (0x329B, 'M', u'女'), + (0x329C, 'M', u'適'), + (0x329D, 'M', u'優'), + (0x329E, 'M', u'印'), + (0x329F, 'M', u'注'), + (0x32A0, 'M', u'項'), + (0x32A1, 'M', u'休'), + (0x32A2, 'M', u'写'), + (0x32A3, 'M', u'正'), + (0x32A4, 'M', u'上'), + (0x32A5, 'M', u'中'), + (0x32A6, 'M', u'下'), + (0x32A7, 'M', u'左'), + (0x32A8, 'M', u'右'), + (0x32A9, 'M', u'医'), + (0x32AA, 'M', u'宗'), + (0x32AB, 'M', u'学'), + (0x32AC, 'M', u'監'), + (0x32AD, 'M', u'企'), + (0x32AE, 'M', u'資'), + (0x32AF, 'M', u'協'), + (0x32B0, 'M', u'夜'), + (0x32B1, 'M', u'36'), + (0x32B2, 'M', u'37'), + (0x32B3, 'M', u'38'), + (0x32B4, 'M', u'39'), + (0x32B5, 'M', u'40'), + (0x32B6, 'M', u'41'), + (0x32B7, 'M', u'42'), + (0x32B8, 'M', u'43'), + (0x32B9, 'M', u'44'), + (0x32BA, 'M', u'45'), + (0x32BB, 'M', u'46'), + (0x32BC, 'M', u'47'), + ] + +def _seg_32(): + return [ + (0x32BD, 'M', u'48'), + (0x32BE, 'M', u'49'), + (0x32BF, 'M', u'50'), + (0x32C0, 'M', u'1月'), + (0x32C1, 'M', u'2月'), + (0x32C2, 'M', u'3月'), + (0x32C3, 'M', u'4月'), + (0x32C4, 'M', u'5月'), + (0x32C5, 'M', u'6月'), + (0x32C6, 'M', u'7月'), + (0x32C7, 'M', u'8月'), + (0x32C8, 'M', u'9月'), + (0x32C9, 'M', u'10月'), + (0x32CA, 'M', u'11月'), + (0x32CB, 'M', u'12月'), + (0x32CC, 'M', u'hg'), + (0x32CD, 'M', u'erg'), + (0x32CE, 'M', u'ev'), + (0x32CF, 'M', u'ltd'), + (0x32D0, 'M', u'ア'), + (0x32D1, 'M', u'イ'), + (0x32D2, 'M', u'ウ'), + (0x32D3, 'M', u'エ'), + (0x32D4, 'M', u'オ'), + (0x32D5, 'M', u'カ'), + (0x32D6, 'M', u'キ'), + (0x32D7, 'M', u'ク'), + (0x32D8, 'M', u'ケ'), + (0x32D9, 'M', u'コ'), + (0x32DA, 'M', u'サ'), + (0x32DB, 'M', u'シ'), + (0x32DC, 'M', u'ス'), + (0x32DD, 'M', u'セ'), + (0x32DE, 'M', u'ソ'), + (0x32DF, 'M', u'タ'), + (0x32E0, 'M', u'チ'), + (0x32E1, 'M', u'ツ'), + (0x32E2, 'M', u'テ'), + (0x32E3, 'M', u'ト'), + (0x32E4, 'M', u'ナ'), + (0x32E5, 'M', u'ニ'), + (0x32E6, 'M', u'ヌ'), + (0x32E7, 'M', u'ネ'), + (0x32E8, 'M', u'ノ'), + (0x32E9, 'M', u'ハ'), + (0x32EA, 'M', u'ヒ'), + (0x32EB, 'M', u'フ'), + (0x32EC, 'M', u'ヘ'), + (0x32ED, 'M', u'ホ'), + (0x32EE, 'M', u'マ'), + (0x32EF, 'M', u'ミ'), + (0x32F0, 'M', u'ム'), + (0x32F1, 'M', u'メ'), + (0x32F2, 'M', u'モ'), + (0x32F3, 'M', u'ヤ'), + (0x32F4, 'M', u'ユ'), + (0x32F5, 'M', u'ヨ'), + (0x32F6, 'M', u'ラ'), + (0x32F7, 'M', u'リ'), + (0x32F8, 'M', u'ル'), + (0x32F9, 'M', u'レ'), + (0x32FA, 'M', u'ロ'), + (0x32FB, 'M', u'ワ'), + (0x32FC, 'M', u'ヰ'), + (0x32FD, 'M', u'ヱ'), + (0x32FE, 'M', u'ヲ'), + (0x32FF, 'X'), + (0x3300, 'M', u'アパート'), + (0x3301, 'M', u'アルファ'), + (0x3302, 'M', u'アンペア'), + (0x3303, 'M', u'アール'), + (0x3304, 'M', u'イニング'), + (0x3305, 'M', u'インチ'), + (0x3306, 'M', u'ウォン'), + (0x3307, 'M', u'エスクード'), + (0x3308, 'M', u'エーカー'), + (0x3309, 'M', u'オンス'), + (0x330A, 'M', u'オーム'), + (0x330B, 'M', u'カイリ'), + (0x330C, 'M', u'カラット'), + (0x330D, 'M', u'カロリー'), + (0x330E, 'M', u'ガロン'), + (0x330F, 'M', u'ガンマ'), + (0x3310, 'M', u'ギガ'), + (0x3311, 'M', u'ギニー'), + (0x3312, 'M', u'キュリー'), + (0x3313, 'M', u'ギルダー'), + (0x3314, 'M', u'キロ'), + (0x3315, 'M', u'キログラム'), + (0x3316, 'M', u'キロメートル'), + (0x3317, 'M', u'キロワット'), + (0x3318, 'M', u'グラム'), + (0x3319, 'M', u'グラムトン'), + (0x331A, 'M', u'クルゼイロ'), + (0x331B, 'M', u'クローネ'), + (0x331C, 'M', u'ケース'), + (0x331D, 'M', u'コルナ'), + (0x331E, 'M', u'コーポ'), + (0x331F, 'M', u'サイクル'), + (0x3320, 'M', u'サンチーム'), + ] + +def _seg_33(): + return [ + (0x3321, 'M', u'シリング'), + (0x3322, 'M', u'センチ'), + (0x3323, 'M', u'セント'), + (0x3324, 'M', u'ダース'), + (0x3325, 'M', u'デシ'), + (0x3326, 'M', u'ドル'), + (0x3327, 'M', u'トン'), + (0x3328, 'M', u'ナノ'), + (0x3329, 'M', u'ノット'), + (0x332A, 'M', u'ハイツ'), + (0x332B, 'M', u'パーセント'), + (0x332C, 'M', u'パーツ'), + (0x332D, 'M', u'バーレル'), + (0x332E, 'M', u'ピアストル'), + (0x332F, 'M', u'ピクル'), + (0x3330, 'M', u'ピコ'), + (0x3331, 'M', u'ビル'), + (0x3332, 'M', u'ファラッド'), + (0x3333, 'M', u'フィート'), + (0x3334, 'M', u'ブッシェル'), + (0x3335, 'M', u'フラン'), + (0x3336, 'M', u'ヘクタール'), + (0x3337, 'M', u'ペソ'), + (0x3338, 'M', u'ペニヒ'), + (0x3339, 'M', u'ヘルツ'), + (0x333A, 'M', u'ペンス'), + (0x333B, 'M', u'ページ'), + (0x333C, 'M', u'ベータ'), + (0x333D, 'M', u'ポイント'), + (0x333E, 'M', u'ボルト'), + (0x333F, 'M', u'ホン'), + (0x3340, 'M', u'ポンド'), + (0x3341, 'M', u'ホール'), + (0x3342, 'M', u'ホーン'), + (0x3343, 'M', u'マイクロ'), + (0x3344, 'M', u'マイル'), + (0x3345, 'M', u'マッハ'), + (0x3346, 'M', u'マルク'), + (0x3347, 'M', u'マンション'), + (0x3348, 'M', u'ミクロン'), + (0x3349, 'M', u'ミリ'), + (0x334A, 'M', u'ミリバール'), + (0x334B, 'M', u'メガ'), + (0x334C, 'M', u'メガトン'), + (0x334D, 'M', u'メートル'), + (0x334E, 'M', u'ヤード'), + (0x334F, 'M', u'ヤール'), + (0x3350, 'M', u'ユアン'), + (0x3351, 'M', u'リットル'), + (0x3352, 'M', u'リラ'), + (0x3353, 'M', u'ルピー'), + (0x3354, 'M', u'ルーブル'), + (0x3355, 'M', u'レム'), + (0x3356, 'M', u'レントゲン'), + (0x3357, 'M', u'ワット'), + (0x3358, 'M', u'0点'), + (0x3359, 'M', u'1点'), + (0x335A, 'M', u'2点'), + (0x335B, 'M', u'3点'), + (0x335C, 'M', u'4点'), + (0x335D, 'M', u'5点'), + (0x335E, 'M', u'6点'), + (0x335F, 'M', u'7点'), + (0x3360, 'M', u'8点'), + (0x3361, 'M', u'9点'), + (0x3362, 'M', u'10点'), + (0x3363, 'M', u'11点'), + (0x3364, 'M', u'12点'), + (0x3365, 'M', u'13点'), + (0x3366, 'M', u'14点'), + (0x3367, 'M', u'15点'), + (0x3368, 'M', u'16点'), + (0x3369, 'M', u'17点'), + (0x336A, 'M', u'18点'), + (0x336B, 'M', u'19点'), + (0x336C, 'M', u'20点'), + (0x336D, 'M', u'21点'), + (0x336E, 'M', u'22点'), + (0x336F, 'M', u'23点'), + (0x3370, 'M', u'24点'), + (0x3371, 'M', u'hpa'), + (0x3372, 'M', u'da'), + (0x3373, 'M', u'au'), + (0x3374, 'M', u'bar'), + (0x3375, 'M', u'ov'), + (0x3376, 'M', u'pc'), + (0x3377, 'M', u'dm'), + (0x3378, 'M', u'dm2'), + (0x3379, 'M', u'dm3'), + (0x337A, 'M', u'iu'), + (0x337B, 'M', u'平成'), + (0x337C, 'M', u'昭和'), + (0x337D, 'M', u'大正'), + (0x337E, 'M', u'明治'), + (0x337F, 'M', u'株式会社'), + (0x3380, 'M', u'pa'), + (0x3381, 'M', u'na'), + (0x3382, 'M', u'μa'), + (0x3383, 'M', u'ma'), + (0x3384, 'M', u'ka'), + ] + +def _seg_34(): + return [ + (0x3385, 'M', u'kb'), + (0x3386, 'M', u'mb'), + (0x3387, 'M', u'gb'), + (0x3388, 'M', u'cal'), + (0x3389, 'M', u'kcal'), + (0x338A, 'M', u'pf'), + (0x338B, 'M', u'nf'), + (0x338C, 'M', u'μf'), + (0x338D, 'M', u'μg'), + (0x338E, 'M', u'mg'), + (0x338F, 'M', u'kg'), + (0x3390, 'M', u'hz'), + (0x3391, 'M', u'khz'), + (0x3392, 'M', u'mhz'), + (0x3393, 'M', u'ghz'), + (0x3394, 'M', u'thz'), + (0x3395, 'M', u'μl'), + (0x3396, 'M', u'ml'), + (0x3397, 'M', u'dl'), + (0x3398, 'M', u'kl'), + (0x3399, 'M', u'fm'), + (0x339A, 'M', u'nm'), + (0x339B, 'M', u'μm'), + (0x339C, 'M', u'mm'), + (0x339D, 'M', u'cm'), + (0x339E, 'M', u'km'), + (0x339F, 'M', u'mm2'), + (0x33A0, 'M', u'cm2'), + (0x33A1, 'M', u'm2'), + (0x33A2, 'M', u'km2'), + (0x33A3, 'M', u'mm3'), + (0x33A4, 'M', u'cm3'), + (0x33A5, 'M', u'm3'), + (0x33A6, 'M', u'km3'), + (0x33A7, 'M', u'm∕s'), + (0x33A8, 'M', u'm∕s2'), + (0x33A9, 'M', u'pa'), + (0x33AA, 'M', u'kpa'), + (0x33AB, 'M', u'mpa'), + (0x33AC, 'M', u'gpa'), + (0x33AD, 'M', u'rad'), + (0x33AE, 'M', u'rad∕s'), + (0x33AF, 'M', u'rad∕s2'), + (0x33B0, 'M', u'ps'), + (0x33B1, 'M', u'ns'), + (0x33B2, 'M', u'μs'), + (0x33B3, 'M', u'ms'), + (0x33B4, 'M', u'pv'), + (0x33B5, 'M', u'nv'), + (0x33B6, 'M', u'μv'), + (0x33B7, 'M', u'mv'), + (0x33B8, 'M', u'kv'), + (0x33B9, 'M', u'mv'), + (0x33BA, 'M', u'pw'), + (0x33BB, 'M', u'nw'), + (0x33BC, 'M', u'μw'), + (0x33BD, 'M', u'mw'), + (0x33BE, 'M', u'kw'), + (0x33BF, 'M', u'mw'), + (0x33C0, 'M', u'kω'), + (0x33C1, 'M', u'mω'), + (0x33C2, 'X'), + (0x33C3, 'M', u'bq'), + (0x33C4, 'M', u'cc'), + (0x33C5, 'M', u'cd'), + (0x33C6, 'M', u'c∕kg'), + (0x33C7, 'X'), + (0x33C8, 'M', u'db'), + (0x33C9, 'M', u'gy'), + (0x33CA, 'M', u'ha'), + (0x33CB, 'M', u'hp'), + (0x33CC, 'M', u'in'), + (0x33CD, 'M', u'kk'), + (0x33CE, 'M', u'km'), + (0x33CF, 'M', u'kt'), + (0x33D0, 'M', u'lm'), + (0x33D1, 'M', u'ln'), + (0x33D2, 'M', u'log'), + (0x33D3, 'M', u'lx'), + (0x33D4, 'M', u'mb'), + (0x33D5, 'M', u'mil'), + (0x33D6, 'M', u'mol'), + (0x33D7, 'M', u'ph'), + (0x33D8, 'X'), + (0x33D9, 'M', u'ppm'), + (0x33DA, 'M', u'pr'), + (0x33DB, 'M', u'sr'), + (0x33DC, 'M', u'sv'), + (0x33DD, 'M', u'wb'), + (0x33DE, 'M', u'v∕m'), + (0x33DF, 'M', u'a∕m'), + (0x33E0, 'M', u'1日'), + (0x33E1, 'M', u'2日'), + (0x33E2, 'M', u'3日'), + (0x33E3, 'M', u'4日'), + (0x33E4, 'M', u'5日'), + (0x33E5, 'M', u'6日'), + (0x33E6, 'M', u'7日'), + (0x33E7, 'M', u'8日'), + (0x33E8, 'M', u'9日'), + ] + +def _seg_35(): + return [ + (0x33E9, 'M', u'10日'), + (0x33EA, 'M', u'11日'), + (0x33EB, 'M', u'12日'), + (0x33EC, 'M', u'13日'), + (0x33ED, 'M', u'14日'), + (0x33EE, 'M', u'15日'), + (0x33EF, 'M', u'16日'), + (0x33F0, 'M', u'17日'), + (0x33F1, 'M', u'18日'), + (0x33F2, 'M', u'19日'), + (0x33F3, 'M', u'20日'), + (0x33F4, 'M', u'21日'), + (0x33F5, 'M', u'22日'), + (0x33F6, 'M', u'23日'), + (0x33F7, 'M', u'24日'), + (0x33F8, 'M', u'25日'), + (0x33F9, 'M', u'26日'), + (0x33FA, 'M', u'27日'), + (0x33FB, 'M', u'28日'), + (0x33FC, 'M', u'29日'), + (0x33FD, 'M', u'30日'), + (0x33FE, 'M', u'31日'), + (0x33FF, 'M', u'gal'), + (0x3400, 'V'), + (0x4DB6, 'X'), + (0x4DC0, 'V'), + (0x9FEB, 'X'), + (0xA000, 'V'), + (0xA48D, 'X'), + (0xA490, 'V'), + (0xA4C7, 'X'), + (0xA4D0, 'V'), + (0xA62C, 'X'), + (0xA640, 'M', u'ꙁ'), + (0xA641, 'V'), + (0xA642, 'M', u'ꙃ'), + (0xA643, 'V'), + (0xA644, 'M', u'ꙅ'), + (0xA645, 'V'), + (0xA646, 'M', u'ꙇ'), + (0xA647, 'V'), + (0xA648, 'M', u'ꙉ'), + (0xA649, 'V'), + (0xA64A, 'M', u'ꙋ'), + (0xA64B, 'V'), + (0xA64C, 'M', u'ꙍ'), + (0xA64D, 'V'), + (0xA64E, 'M', u'ꙏ'), + (0xA64F, 'V'), + (0xA650, 'M', u'ꙑ'), + (0xA651, 'V'), + (0xA652, 'M', u'ꙓ'), + (0xA653, 'V'), + (0xA654, 'M', u'ꙕ'), + (0xA655, 'V'), + (0xA656, 'M', u'ꙗ'), + (0xA657, 'V'), + (0xA658, 'M', u'ꙙ'), + (0xA659, 'V'), + (0xA65A, 'M', u'ꙛ'), + (0xA65B, 'V'), + (0xA65C, 'M', u'ꙝ'), + (0xA65D, 'V'), + (0xA65E, 'M', u'ꙟ'), + (0xA65F, 'V'), + (0xA660, 'M', u'ꙡ'), + (0xA661, 'V'), + (0xA662, 'M', u'ꙣ'), + (0xA663, 'V'), + (0xA664, 'M', u'ꙥ'), + (0xA665, 'V'), + (0xA666, 'M', u'ꙧ'), + (0xA667, 'V'), + (0xA668, 'M', u'ꙩ'), + (0xA669, 'V'), + (0xA66A, 'M', u'ꙫ'), + (0xA66B, 'V'), + (0xA66C, 'M', u'ꙭ'), + (0xA66D, 'V'), + (0xA680, 'M', u'ꚁ'), + (0xA681, 'V'), + (0xA682, 'M', u'ꚃ'), + (0xA683, 'V'), + (0xA684, 'M', u'ꚅ'), + (0xA685, 'V'), + (0xA686, 'M', u'ꚇ'), + (0xA687, 'V'), + (0xA688, 'M', u'ꚉ'), + (0xA689, 'V'), + (0xA68A, 'M', u'ꚋ'), + (0xA68B, 'V'), + (0xA68C, 'M', u'ꚍ'), + (0xA68D, 'V'), + (0xA68E, 'M', u'ꚏ'), + (0xA68F, 'V'), + (0xA690, 'M', u'ꚑ'), + (0xA691, 'V'), + (0xA692, 'M', u'ꚓ'), + (0xA693, 'V'), + (0xA694, 'M', u'ꚕ'), + ] + +def _seg_36(): + return [ + (0xA695, 'V'), + (0xA696, 'M', u'ꚗ'), + (0xA697, 'V'), + (0xA698, 'M', u'ꚙ'), + (0xA699, 'V'), + (0xA69A, 'M', u'ꚛ'), + (0xA69B, 'V'), + (0xA69C, 'M', u'ъ'), + (0xA69D, 'M', u'ь'), + (0xA69E, 'V'), + (0xA6F8, 'X'), + (0xA700, 'V'), + (0xA722, 'M', u'ꜣ'), + (0xA723, 'V'), + (0xA724, 'M', u'ꜥ'), + (0xA725, 'V'), + (0xA726, 'M', u'ꜧ'), + (0xA727, 'V'), + (0xA728, 'M', u'ꜩ'), + (0xA729, 'V'), + (0xA72A, 'M', u'ꜫ'), + (0xA72B, 'V'), + (0xA72C, 'M', u'ꜭ'), + (0xA72D, 'V'), + (0xA72E, 'M', u'ꜯ'), + (0xA72F, 'V'), + (0xA732, 'M', u'ꜳ'), + (0xA733, 'V'), + (0xA734, 'M', u'ꜵ'), + (0xA735, 'V'), + (0xA736, 'M', u'ꜷ'), + (0xA737, 'V'), + (0xA738, 'M', u'ꜹ'), + (0xA739, 'V'), + (0xA73A, 'M', u'ꜻ'), + (0xA73B, 'V'), + (0xA73C, 'M', u'ꜽ'), + (0xA73D, 'V'), + (0xA73E, 'M', u'ꜿ'), + (0xA73F, 'V'), + (0xA740, 'M', u'ꝁ'), + (0xA741, 'V'), + (0xA742, 'M', u'ꝃ'), + (0xA743, 'V'), + (0xA744, 'M', u'ꝅ'), + (0xA745, 'V'), + (0xA746, 'M', u'ꝇ'), + (0xA747, 'V'), + (0xA748, 'M', u'ꝉ'), + (0xA749, 'V'), + (0xA74A, 'M', u'ꝋ'), + (0xA74B, 'V'), + (0xA74C, 'M', u'ꝍ'), + (0xA74D, 'V'), + (0xA74E, 'M', u'ꝏ'), + (0xA74F, 'V'), + (0xA750, 'M', u'ꝑ'), + (0xA751, 'V'), + (0xA752, 'M', u'ꝓ'), + (0xA753, 'V'), + (0xA754, 'M', u'ꝕ'), + (0xA755, 'V'), + (0xA756, 'M', u'ꝗ'), + (0xA757, 'V'), + (0xA758, 'M', u'ꝙ'), + (0xA759, 'V'), + (0xA75A, 'M', u'ꝛ'), + (0xA75B, 'V'), + (0xA75C, 'M', u'ꝝ'), + (0xA75D, 'V'), + (0xA75E, 'M', u'ꝟ'), + (0xA75F, 'V'), + (0xA760, 'M', u'ꝡ'), + (0xA761, 'V'), + (0xA762, 'M', u'ꝣ'), + (0xA763, 'V'), + (0xA764, 'M', u'ꝥ'), + (0xA765, 'V'), + (0xA766, 'M', u'ꝧ'), + (0xA767, 'V'), + (0xA768, 'M', u'ꝩ'), + (0xA769, 'V'), + (0xA76A, 'M', u'ꝫ'), + (0xA76B, 'V'), + (0xA76C, 'M', u'ꝭ'), + (0xA76D, 'V'), + (0xA76E, 'M', u'ꝯ'), + (0xA76F, 'V'), + (0xA770, 'M', u'ꝯ'), + (0xA771, 'V'), + (0xA779, 'M', u'ꝺ'), + (0xA77A, 'V'), + (0xA77B, 'M', u'ꝼ'), + (0xA77C, 'V'), + (0xA77D, 'M', u'ᵹ'), + (0xA77E, 'M', u'ꝿ'), + (0xA77F, 'V'), + (0xA780, 'M', u'ꞁ'), + (0xA781, 'V'), + (0xA782, 'M', u'ꞃ'), + ] + +def _seg_37(): + return [ + (0xA783, 'V'), + (0xA784, 'M', u'ꞅ'), + (0xA785, 'V'), + (0xA786, 'M', u'ꞇ'), + (0xA787, 'V'), + (0xA78B, 'M', u'ꞌ'), + (0xA78C, 'V'), + (0xA78D, 'M', u'ɥ'), + (0xA78E, 'V'), + (0xA790, 'M', u'ꞑ'), + (0xA791, 'V'), + (0xA792, 'M', u'ꞓ'), + (0xA793, 'V'), + (0xA796, 'M', u'ꞗ'), + (0xA797, 'V'), + (0xA798, 'M', u'ꞙ'), + (0xA799, 'V'), + (0xA79A, 'M', u'ꞛ'), + (0xA79B, 'V'), + (0xA79C, 'M', u'ꞝ'), + (0xA79D, 'V'), + (0xA79E, 'M', u'ꞟ'), + (0xA79F, 'V'), + (0xA7A0, 'M', u'ꞡ'), + (0xA7A1, 'V'), + (0xA7A2, 'M', u'ꞣ'), + (0xA7A3, 'V'), + (0xA7A4, 'M', u'ꞥ'), + (0xA7A5, 'V'), + (0xA7A6, 'M', u'ꞧ'), + (0xA7A7, 'V'), + (0xA7A8, 'M', u'ꞩ'), + (0xA7A9, 'V'), + (0xA7AA, 'M', u'ɦ'), + (0xA7AB, 'M', u'ɜ'), + (0xA7AC, 'M', u'ɡ'), + (0xA7AD, 'M', u'ɬ'), + (0xA7AE, 'M', u'ɪ'), + (0xA7AF, 'X'), + (0xA7B0, 'M', u'ʞ'), + (0xA7B1, 'M', u'ʇ'), + (0xA7B2, 'M', u'ʝ'), + (0xA7B3, 'M', u'ꭓ'), + (0xA7B4, 'M', u'ꞵ'), + (0xA7B5, 'V'), + (0xA7B6, 'M', u'ꞷ'), + (0xA7B7, 'V'), + (0xA7B8, 'X'), + (0xA7F7, 'V'), + (0xA7F8, 'M', u'ħ'), + (0xA7F9, 'M', u'œ'), + (0xA7FA, 'V'), + (0xA82C, 'X'), + (0xA830, 'V'), + (0xA83A, 'X'), + (0xA840, 'V'), + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C6, 'X'), + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), + (0xA8FE, 'X'), + (0xA900, 'V'), + (0xA954, 'X'), + (0xA95F, 'V'), + (0xA97D, 'X'), + (0xA980, 'V'), + (0xA9CE, 'X'), + (0xA9CF, 'V'), + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9FF, 'X'), + (0xAA00, 'V'), + (0xAA37, 'X'), + (0xAA40, 'V'), + (0xAA4E, 'X'), + (0xAA50, 'V'), + (0xAA5A, 'X'), + (0xAA5C, 'V'), + (0xAAC3, 'X'), + (0xAADB, 'V'), + (0xAAF7, 'X'), + (0xAB01, 'V'), + (0xAB07, 'X'), + (0xAB09, 'V'), + (0xAB0F, 'X'), + (0xAB11, 'V'), + (0xAB17, 'X'), + (0xAB20, 'V'), + (0xAB27, 'X'), + (0xAB28, 'V'), + (0xAB2F, 'X'), + (0xAB30, 'V'), + (0xAB5C, 'M', u'ꜧ'), + (0xAB5D, 'M', u'ꬷ'), + (0xAB5E, 'M', u'ɫ'), + (0xAB5F, 'M', u'ꭒ'), + (0xAB60, 'V'), + (0xAB66, 'X'), + ] + +def _seg_38(): + return [ + (0xAB70, 'M', u'Ꭰ'), + (0xAB71, 'M', u'Ꭱ'), + (0xAB72, 'M', u'Ꭲ'), + (0xAB73, 'M', u'Ꭳ'), + (0xAB74, 'M', u'Ꭴ'), + (0xAB75, 'M', u'Ꭵ'), + (0xAB76, 'M', u'Ꭶ'), + (0xAB77, 'M', u'Ꭷ'), + (0xAB78, 'M', u'Ꭸ'), + (0xAB79, 'M', u'Ꭹ'), + (0xAB7A, 'M', u'Ꭺ'), + (0xAB7B, 'M', u'Ꭻ'), + (0xAB7C, 'M', u'Ꭼ'), + (0xAB7D, 'M', u'Ꭽ'), + (0xAB7E, 'M', u'Ꭾ'), + (0xAB7F, 'M', u'Ꭿ'), + (0xAB80, 'M', u'Ꮀ'), + (0xAB81, 'M', u'Ꮁ'), + (0xAB82, 'M', u'Ꮂ'), + (0xAB83, 'M', u'Ꮃ'), + (0xAB84, 'M', u'Ꮄ'), + (0xAB85, 'M', u'Ꮅ'), + (0xAB86, 'M', u'Ꮆ'), + (0xAB87, 'M', u'Ꮇ'), + (0xAB88, 'M', u'Ꮈ'), + (0xAB89, 'M', u'Ꮉ'), + (0xAB8A, 'M', u'Ꮊ'), + (0xAB8B, 'M', u'Ꮋ'), + (0xAB8C, 'M', u'Ꮌ'), + (0xAB8D, 'M', u'Ꮍ'), + (0xAB8E, 'M', u'Ꮎ'), + (0xAB8F, 'M', u'Ꮏ'), + (0xAB90, 'M', u'Ꮐ'), + (0xAB91, 'M', u'Ꮑ'), + (0xAB92, 'M', u'Ꮒ'), + (0xAB93, 'M', u'Ꮓ'), + (0xAB94, 'M', u'Ꮔ'), + (0xAB95, 'M', u'Ꮕ'), + (0xAB96, 'M', u'Ꮖ'), + (0xAB97, 'M', u'Ꮗ'), + (0xAB98, 'M', u'Ꮘ'), + (0xAB99, 'M', u'Ꮙ'), + (0xAB9A, 'M', u'Ꮚ'), + (0xAB9B, 'M', u'Ꮛ'), + (0xAB9C, 'M', u'Ꮜ'), + (0xAB9D, 'M', u'Ꮝ'), + (0xAB9E, 'M', u'Ꮞ'), + (0xAB9F, 'M', u'Ꮟ'), + (0xABA0, 'M', u'Ꮠ'), + (0xABA1, 'M', u'Ꮡ'), + (0xABA2, 'M', u'Ꮢ'), + (0xABA3, 'M', u'Ꮣ'), + (0xABA4, 'M', u'Ꮤ'), + (0xABA5, 'M', u'Ꮥ'), + (0xABA6, 'M', u'Ꮦ'), + (0xABA7, 'M', u'Ꮧ'), + (0xABA8, 'M', u'Ꮨ'), + (0xABA9, 'M', u'Ꮩ'), + (0xABAA, 'M', u'Ꮪ'), + (0xABAB, 'M', u'Ꮫ'), + (0xABAC, 'M', u'Ꮬ'), + (0xABAD, 'M', u'Ꮭ'), + (0xABAE, 'M', u'Ꮮ'), + (0xABAF, 'M', u'Ꮯ'), + (0xABB0, 'M', u'Ꮰ'), + (0xABB1, 'M', u'Ꮱ'), + (0xABB2, 'M', u'Ꮲ'), + (0xABB3, 'M', u'Ꮳ'), + (0xABB4, 'M', u'Ꮴ'), + (0xABB5, 'M', u'Ꮵ'), + (0xABB6, 'M', u'Ꮶ'), + (0xABB7, 'M', u'Ꮷ'), + (0xABB8, 'M', u'Ꮸ'), + (0xABB9, 'M', u'Ꮹ'), + (0xABBA, 'M', u'Ꮺ'), + (0xABBB, 'M', u'Ꮻ'), + (0xABBC, 'M', u'Ꮼ'), + (0xABBD, 'M', u'Ꮽ'), + (0xABBE, 'M', u'Ꮾ'), + (0xABBF, 'M', u'Ꮿ'), + (0xABC0, 'V'), + (0xABEE, 'X'), + (0xABF0, 'V'), + (0xABFA, 'X'), + (0xAC00, 'V'), + (0xD7A4, 'X'), + (0xD7B0, 'V'), + (0xD7C7, 'X'), + (0xD7CB, 'V'), + (0xD7FC, 'X'), + (0xF900, 'M', u'豈'), + (0xF901, 'M', u'更'), + (0xF902, 'M', u'車'), + (0xF903, 'M', u'賈'), + (0xF904, 'M', u'滑'), + (0xF905, 'M', u'串'), + (0xF906, 'M', u'句'), + (0xF907, 'M', u'龜'), + (0xF909, 'M', u'契'), + (0xF90A, 'M', u'金'), + ] + +def _seg_39(): + return [ + (0xF90B, 'M', u'喇'), + (0xF90C, 'M', u'奈'), + (0xF90D, 'M', u'懶'), + (0xF90E, 'M', u'癩'), + (0xF90F, 'M', u'羅'), + (0xF910, 'M', u'蘿'), + (0xF911, 'M', u'螺'), + (0xF912, 'M', u'裸'), + (0xF913, 'M', u'邏'), + (0xF914, 'M', u'樂'), + (0xF915, 'M', u'洛'), + (0xF916, 'M', u'烙'), + (0xF917, 'M', u'珞'), + (0xF918, 'M', u'落'), + (0xF919, 'M', u'酪'), + (0xF91A, 'M', u'駱'), + (0xF91B, 'M', u'亂'), + (0xF91C, 'M', u'卵'), + (0xF91D, 'M', u'欄'), + (0xF91E, 'M', u'爛'), + (0xF91F, 'M', u'蘭'), + (0xF920, 'M', u'鸞'), + (0xF921, 'M', u'嵐'), + (0xF922, 'M', u'濫'), + (0xF923, 'M', u'藍'), + (0xF924, 'M', u'襤'), + (0xF925, 'M', u'拉'), + (0xF926, 'M', u'臘'), + (0xF927, 'M', u'蠟'), + (0xF928, 'M', u'廊'), + (0xF929, 'M', u'朗'), + (0xF92A, 'M', u'浪'), + (0xF92B, 'M', u'狼'), + (0xF92C, 'M', u'郎'), + (0xF92D, 'M', u'來'), + (0xF92E, 'M', u'冷'), + (0xF92F, 'M', u'勞'), + (0xF930, 'M', u'擄'), + (0xF931, 'M', u'櫓'), + (0xF932, 'M', u'爐'), + (0xF933, 'M', u'盧'), + (0xF934, 'M', u'老'), + (0xF935, 'M', u'蘆'), + (0xF936, 'M', u'虜'), + (0xF937, 'M', u'路'), + (0xF938, 'M', u'露'), + (0xF939, 'M', u'魯'), + (0xF93A, 'M', u'鷺'), + (0xF93B, 'M', u'碌'), + (0xF93C, 'M', u'祿'), + (0xF93D, 'M', u'綠'), + (0xF93E, 'M', u'菉'), + (0xF93F, 'M', u'錄'), + (0xF940, 'M', u'鹿'), + (0xF941, 'M', u'論'), + (0xF942, 'M', u'壟'), + (0xF943, 'M', u'弄'), + (0xF944, 'M', u'籠'), + (0xF945, 'M', u'聾'), + (0xF946, 'M', u'牢'), + (0xF947, 'M', u'磊'), + (0xF948, 'M', u'賂'), + (0xF949, 'M', u'雷'), + (0xF94A, 'M', u'壘'), + (0xF94B, 'M', u'屢'), + (0xF94C, 'M', u'樓'), + (0xF94D, 'M', u'淚'), + (0xF94E, 'M', u'漏'), + (0xF94F, 'M', u'累'), + (0xF950, 'M', u'縷'), + (0xF951, 'M', u'陋'), + (0xF952, 'M', u'勒'), + (0xF953, 'M', u'肋'), + (0xF954, 'M', u'凜'), + (0xF955, 'M', u'凌'), + (0xF956, 'M', u'稜'), + (0xF957, 'M', u'綾'), + (0xF958, 'M', u'菱'), + (0xF959, 'M', u'陵'), + (0xF95A, 'M', u'讀'), + (0xF95B, 'M', u'拏'), + (0xF95C, 'M', u'樂'), + (0xF95D, 'M', u'諾'), + (0xF95E, 'M', u'丹'), + (0xF95F, 'M', u'寧'), + (0xF960, 'M', u'怒'), + (0xF961, 'M', u'率'), + (0xF962, 'M', u'異'), + (0xF963, 'M', u'北'), + (0xF964, 'M', u'磻'), + (0xF965, 'M', u'便'), + (0xF966, 'M', u'復'), + (0xF967, 'M', u'不'), + (0xF968, 'M', u'泌'), + (0xF969, 'M', u'數'), + (0xF96A, 'M', u'索'), + (0xF96B, 'M', u'參'), + (0xF96C, 'M', u'塞'), + (0xF96D, 'M', u'省'), + (0xF96E, 'M', u'葉'), + ] + +def _seg_40(): + return [ + (0xF96F, 'M', u'說'), + (0xF970, 'M', u'殺'), + (0xF971, 'M', u'辰'), + (0xF972, 'M', u'沈'), + (0xF973, 'M', u'拾'), + (0xF974, 'M', u'若'), + (0xF975, 'M', u'掠'), + (0xF976, 'M', u'略'), + (0xF977, 'M', u'亮'), + (0xF978, 'M', u'兩'), + (0xF979, 'M', u'凉'), + (0xF97A, 'M', u'梁'), + (0xF97B, 'M', u'糧'), + (0xF97C, 'M', u'良'), + (0xF97D, 'M', u'諒'), + (0xF97E, 'M', u'量'), + (0xF97F, 'M', u'勵'), + (0xF980, 'M', u'呂'), + (0xF981, 'M', u'女'), + (0xF982, 'M', u'廬'), + (0xF983, 'M', u'旅'), + (0xF984, 'M', u'濾'), + (0xF985, 'M', u'礪'), + (0xF986, 'M', u'閭'), + (0xF987, 'M', u'驪'), + (0xF988, 'M', u'麗'), + (0xF989, 'M', u'黎'), + (0xF98A, 'M', u'力'), + (0xF98B, 'M', u'曆'), + (0xF98C, 'M', u'歷'), + (0xF98D, 'M', u'轢'), + (0xF98E, 'M', u'年'), + (0xF98F, 'M', u'憐'), + (0xF990, 'M', u'戀'), + (0xF991, 'M', u'撚'), + (0xF992, 'M', u'漣'), + (0xF993, 'M', u'煉'), + (0xF994, 'M', u'璉'), + (0xF995, 'M', u'秊'), + (0xF996, 'M', u'練'), + (0xF997, 'M', u'聯'), + (0xF998, 'M', u'輦'), + (0xF999, 'M', u'蓮'), + (0xF99A, 'M', u'連'), + (0xF99B, 'M', u'鍊'), + (0xF99C, 'M', u'列'), + (0xF99D, 'M', u'劣'), + (0xF99E, 'M', u'咽'), + (0xF99F, 'M', u'烈'), + (0xF9A0, 'M', u'裂'), + (0xF9A1, 'M', u'說'), + (0xF9A2, 'M', u'廉'), + (0xF9A3, 'M', u'念'), + (0xF9A4, 'M', u'捻'), + (0xF9A5, 'M', u'殮'), + (0xF9A6, 'M', u'簾'), + (0xF9A7, 'M', u'獵'), + (0xF9A8, 'M', u'令'), + (0xF9A9, 'M', u'囹'), + (0xF9AA, 'M', u'寧'), + (0xF9AB, 'M', u'嶺'), + (0xF9AC, 'M', u'怜'), + (0xF9AD, 'M', u'玲'), + (0xF9AE, 'M', u'瑩'), + (0xF9AF, 'M', u'羚'), + (0xF9B0, 'M', u'聆'), + (0xF9B1, 'M', u'鈴'), + (0xF9B2, 'M', u'零'), + (0xF9B3, 'M', u'靈'), + (0xF9B4, 'M', u'領'), + (0xF9B5, 'M', u'例'), + (0xF9B6, 'M', u'禮'), + (0xF9B7, 'M', u'醴'), + (0xF9B8, 'M', u'隸'), + (0xF9B9, 'M', u'惡'), + (0xF9BA, 'M', u'了'), + (0xF9BB, 'M', u'僚'), + (0xF9BC, 'M', u'寮'), + (0xF9BD, 'M', u'尿'), + (0xF9BE, 'M', u'料'), + (0xF9BF, 'M', u'樂'), + (0xF9C0, 'M', u'燎'), + (0xF9C1, 'M', u'療'), + (0xF9C2, 'M', u'蓼'), + (0xF9C3, 'M', u'遼'), + (0xF9C4, 'M', u'龍'), + (0xF9C5, 'M', u'暈'), + (0xF9C6, 'M', u'阮'), + (0xF9C7, 'M', u'劉'), + (0xF9C8, 'M', u'杻'), + (0xF9C9, 'M', u'柳'), + (0xF9CA, 'M', u'流'), + (0xF9CB, 'M', u'溜'), + (0xF9CC, 'M', u'琉'), + (0xF9CD, 'M', u'留'), + (0xF9CE, 'M', u'硫'), + (0xF9CF, 'M', u'紐'), + (0xF9D0, 'M', u'類'), + (0xF9D1, 'M', u'六'), + (0xF9D2, 'M', u'戮'), + ] + +def _seg_41(): + return [ + (0xF9D3, 'M', u'陸'), + (0xF9D4, 'M', u'倫'), + (0xF9D5, 'M', u'崙'), + (0xF9D6, 'M', u'淪'), + (0xF9D7, 'M', u'輪'), + (0xF9D8, 'M', u'律'), + (0xF9D9, 'M', u'慄'), + (0xF9DA, 'M', u'栗'), + (0xF9DB, 'M', u'率'), + (0xF9DC, 'M', u'隆'), + (0xF9DD, 'M', u'利'), + (0xF9DE, 'M', u'吏'), + (0xF9DF, 'M', u'履'), + (0xF9E0, 'M', u'易'), + (0xF9E1, 'M', u'李'), + (0xF9E2, 'M', u'梨'), + (0xF9E3, 'M', u'泥'), + (0xF9E4, 'M', u'理'), + (0xF9E5, 'M', u'痢'), + (0xF9E6, 'M', u'罹'), + (0xF9E7, 'M', u'裏'), + (0xF9E8, 'M', u'裡'), + (0xF9E9, 'M', u'里'), + (0xF9EA, 'M', u'離'), + (0xF9EB, 'M', u'匿'), + (0xF9EC, 'M', u'溺'), + (0xF9ED, 'M', u'吝'), + (0xF9EE, 'M', u'燐'), + (0xF9EF, 'M', u'璘'), + (0xF9F0, 'M', u'藺'), + (0xF9F1, 'M', u'隣'), + (0xF9F2, 'M', u'鱗'), + (0xF9F3, 'M', u'麟'), + (0xF9F4, 'M', u'林'), + (0xF9F5, 'M', u'淋'), + (0xF9F6, 'M', u'臨'), + (0xF9F7, 'M', u'立'), + (0xF9F8, 'M', u'笠'), + (0xF9F9, 'M', u'粒'), + (0xF9FA, 'M', u'狀'), + (0xF9FB, 'M', u'炙'), + (0xF9FC, 'M', u'識'), + (0xF9FD, 'M', u'什'), + (0xF9FE, 'M', u'茶'), + (0xF9FF, 'M', u'刺'), + (0xFA00, 'M', u'切'), + (0xFA01, 'M', u'度'), + (0xFA02, 'M', u'拓'), + (0xFA03, 'M', u'糖'), + (0xFA04, 'M', u'宅'), + (0xFA05, 'M', u'洞'), + (0xFA06, 'M', u'暴'), + (0xFA07, 'M', u'輻'), + (0xFA08, 'M', u'行'), + (0xFA09, 'M', u'降'), + (0xFA0A, 'M', u'見'), + (0xFA0B, 'M', u'廓'), + (0xFA0C, 'M', u'兀'), + (0xFA0D, 'M', u'嗀'), + (0xFA0E, 'V'), + (0xFA10, 'M', u'塚'), + (0xFA11, 'V'), + (0xFA12, 'M', u'晴'), + (0xFA13, 'V'), + (0xFA15, 'M', u'凞'), + (0xFA16, 'M', u'猪'), + (0xFA17, 'M', u'益'), + (0xFA18, 'M', u'礼'), + (0xFA19, 'M', u'神'), + (0xFA1A, 'M', u'祥'), + (0xFA1B, 'M', u'福'), + (0xFA1C, 'M', u'靖'), + (0xFA1D, 'M', u'精'), + (0xFA1E, 'M', u'羽'), + (0xFA1F, 'V'), + (0xFA20, 'M', u'蘒'), + (0xFA21, 'V'), + (0xFA22, 'M', u'諸'), + (0xFA23, 'V'), + (0xFA25, 'M', u'逸'), + (0xFA26, 'M', u'都'), + (0xFA27, 'V'), + (0xFA2A, 'M', u'飯'), + (0xFA2B, 'M', u'飼'), + (0xFA2C, 'M', u'館'), + (0xFA2D, 'M', u'鶴'), + (0xFA2E, 'M', u'郞'), + (0xFA2F, 'M', u'隷'), + (0xFA30, 'M', u'侮'), + (0xFA31, 'M', u'僧'), + (0xFA32, 'M', u'免'), + (0xFA33, 'M', u'勉'), + (0xFA34, 'M', u'勤'), + (0xFA35, 'M', u'卑'), + (0xFA36, 'M', u'喝'), + (0xFA37, 'M', u'嘆'), + (0xFA38, 'M', u'器'), + (0xFA39, 'M', u'塀'), + (0xFA3A, 'M', u'墨'), + (0xFA3B, 'M', u'層'), + ] + +def _seg_42(): + return [ + (0xFA3C, 'M', u'屮'), + (0xFA3D, 'M', u'悔'), + (0xFA3E, 'M', u'慨'), + (0xFA3F, 'M', u'憎'), + (0xFA40, 'M', u'懲'), + (0xFA41, 'M', u'敏'), + (0xFA42, 'M', u'既'), + (0xFA43, 'M', u'暑'), + (0xFA44, 'M', u'梅'), + (0xFA45, 'M', u'海'), + (0xFA46, 'M', u'渚'), + (0xFA47, 'M', u'漢'), + (0xFA48, 'M', u'煮'), + (0xFA49, 'M', u'爫'), + (0xFA4A, 'M', u'琢'), + (0xFA4B, 'M', u'碑'), + (0xFA4C, 'M', u'社'), + (0xFA4D, 'M', u'祉'), + (0xFA4E, 'M', u'祈'), + (0xFA4F, 'M', u'祐'), + (0xFA50, 'M', u'祖'), + (0xFA51, 'M', u'祝'), + (0xFA52, 'M', u'禍'), + (0xFA53, 'M', u'禎'), + (0xFA54, 'M', u'穀'), + (0xFA55, 'M', u'突'), + (0xFA56, 'M', u'節'), + (0xFA57, 'M', u'練'), + (0xFA58, 'M', u'縉'), + (0xFA59, 'M', u'繁'), + (0xFA5A, 'M', u'署'), + (0xFA5B, 'M', u'者'), + (0xFA5C, 'M', u'臭'), + (0xFA5D, 'M', u'艹'), + (0xFA5F, 'M', u'著'), + (0xFA60, 'M', u'褐'), + (0xFA61, 'M', u'視'), + (0xFA62, 'M', u'謁'), + (0xFA63, 'M', u'謹'), + (0xFA64, 'M', u'賓'), + (0xFA65, 'M', u'贈'), + (0xFA66, 'M', u'辶'), + (0xFA67, 'M', u'逸'), + (0xFA68, 'M', u'難'), + (0xFA69, 'M', u'響'), + (0xFA6A, 'M', u'頻'), + (0xFA6B, 'M', u'恵'), + (0xFA6C, 'M', u'𤋮'), + (0xFA6D, 'M', u'舘'), + (0xFA6E, 'X'), + (0xFA70, 'M', u'並'), + (0xFA71, 'M', u'况'), + (0xFA72, 'M', u'全'), + (0xFA73, 'M', u'侀'), + (0xFA74, 'M', u'充'), + (0xFA75, 'M', u'冀'), + (0xFA76, 'M', u'勇'), + (0xFA77, 'M', u'勺'), + (0xFA78, 'M', u'喝'), + (0xFA79, 'M', u'啕'), + (0xFA7A, 'M', u'喙'), + (0xFA7B, 'M', u'嗢'), + (0xFA7C, 'M', u'塚'), + (0xFA7D, 'M', u'墳'), + (0xFA7E, 'M', u'奄'), + (0xFA7F, 'M', u'奔'), + (0xFA80, 'M', u'婢'), + (0xFA81, 'M', u'嬨'), + (0xFA82, 'M', u'廒'), + (0xFA83, 'M', u'廙'), + (0xFA84, 'M', u'彩'), + (0xFA85, 'M', u'徭'), + (0xFA86, 'M', u'惘'), + (0xFA87, 'M', u'慎'), + (0xFA88, 'M', u'愈'), + (0xFA89, 'M', u'憎'), + (0xFA8A, 'M', u'慠'), + (0xFA8B, 'M', u'懲'), + (0xFA8C, 'M', u'戴'), + (0xFA8D, 'M', u'揄'), + (0xFA8E, 'M', u'搜'), + (0xFA8F, 'M', u'摒'), + (0xFA90, 'M', u'敖'), + (0xFA91, 'M', u'晴'), + (0xFA92, 'M', u'朗'), + (0xFA93, 'M', u'望'), + (0xFA94, 'M', u'杖'), + (0xFA95, 'M', u'歹'), + (0xFA96, 'M', u'殺'), + (0xFA97, 'M', u'流'), + (0xFA98, 'M', u'滛'), + (0xFA99, 'M', u'滋'), + (0xFA9A, 'M', u'漢'), + (0xFA9B, 'M', u'瀞'), + (0xFA9C, 'M', u'煮'), + (0xFA9D, 'M', u'瞧'), + (0xFA9E, 'M', u'爵'), + (0xFA9F, 'M', u'犯'), + (0xFAA0, 'M', u'猪'), + (0xFAA1, 'M', u'瑱'), + ] + +def _seg_43(): + return [ + (0xFAA2, 'M', u'甆'), + (0xFAA3, 'M', u'画'), + (0xFAA4, 'M', u'瘝'), + (0xFAA5, 'M', u'瘟'), + (0xFAA6, 'M', u'益'), + (0xFAA7, 'M', u'盛'), + (0xFAA8, 'M', u'直'), + (0xFAA9, 'M', u'睊'), + (0xFAAA, 'M', u'着'), + (0xFAAB, 'M', u'磌'), + (0xFAAC, 'M', u'窱'), + (0xFAAD, 'M', u'節'), + (0xFAAE, 'M', u'类'), + (0xFAAF, 'M', u'絛'), + (0xFAB0, 'M', u'練'), + (0xFAB1, 'M', u'缾'), + (0xFAB2, 'M', u'者'), + (0xFAB3, 'M', u'荒'), + (0xFAB4, 'M', u'華'), + (0xFAB5, 'M', u'蝹'), + (0xFAB6, 'M', u'襁'), + (0xFAB7, 'M', u'覆'), + (0xFAB8, 'M', u'視'), + (0xFAB9, 'M', u'調'), + (0xFABA, 'M', u'諸'), + (0xFABB, 'M', u'請'), + (0xFABC, 'M', u'謁'), + (0xFABD, 'M', u'諾'), + (0xFABE, 'M', u'諭'), + (0xFABF, 'M', u'謹'), + (0xFAC0, 'M', u'變'), + (0xFAC1, 'M', u'贈'), + (0xFAC2, 'M', u'輸'), + (0xFAC3, 'M', u'遲'), + (0xFAC4, 'M', u'醙'), + (0xFAC5, 'M', u'鉶'), + (0xFAC6, 'M', u'陼'), + (0xFAC7, 'M', u'難'), + (0xFAC8, 'M', u'靖'), + (0xFAC9, 'M', u'韛'), + (0xFACA, 'M', u'響'), + (0xFACB, 'M', u'頋'), + (0xFACC, 'M', u'頻'), + (0xFACD, 'M', u'鬒'), + (0xFACE, 'M', u'龜'), + (0xFACF, 'M', u'𢡊'), + (0xFAD0, 'M', u'𢡄'), + (0xFAD1, 'M', u'𣏕'), + (0xFAD2, 'M', u'㮝'), + (0xFAD3, 'M', u'䀘'), + (0xFAD4, 'M', u'䀹'), + (0xFAD5, 'M', u'𥉉'), + (0xFAD6, 'M', u'𥳐'), + (0xFAD7, 'M', u'𧻓'), + (0xFAD8, 'M', u'齃'), + (0xFAD9, 'M', u'龎'), + (0xFADA, 'X'), + (0xFB00, 'M', u'ff'), + (0xFB01, 'M', u'fi'), + (0xFB02, 'M', u'fl'), + (0xFB03, 'M', u'ffi'), + (0xFB04, 'M', u'ffl'), + (0xFB05, 'M', u'st'), + (0xFB07, 'X'), + (0xFB13, 'M', u'մն'), + (0xFB14, 'M', u'մե'), + (0xFB15, 'M', u'մի'), + (0xFB16, 'M', u'վն'), + (0xFB17, 'M', u'մխ'), + (0xFB18, 'X'), + (0xFB1D, 'M', u'יִ'), + (0xFB1E, 'V'), + (0xFB1F, 'M', u'ײַ'), + (0xFB20, 'M', u'ע'), + (0xFB21, 'M', u'א'), + (0xFB22, 'M', u'ד'), + (0xFB23, 'M', u'ה'), + (0xFB24, 'M', u'כ'), + (0xFB25, 'M', u'ל'), + (0xFB26, 'M', u'ם'), + (0xFB27, 'M', u'ר'), + (0xFB28, 'M', u'ת'), + (0xFB29, '3', u'+'), + (0xFB2A, 'M', u'שׁ'), + (0xFB2B, 'M', u'שׂ'), + (0xFB2C, 'M', u'שּׁ'), + (0xFB2D, 'M', u'שּׂ'), + (0xFB2E, 'M', u'אַ'), + (0xFB2F, 'M', u'אָ'), + (0xFB30, 'M', u'אּ'), + (0xFB31, 'M', u'בּ'), + (0xFB32, 'M', u'גּ'), + (0xFB33, 'M', u'דּ'), + (0xFB34, 'M', u'הּ'), + (0xFB35, 'M', u'וּ'), + (0xFB36, 'M', u'זּ'), + (0xFB37, 'X'), + (0xFB38, 'M', u'טּ'), + (0xFB39, 'M', u'יּ'), + (0xFB3A, 'M', u'ךּ'), + ] + +def _seg_44(): + return [ + (0xFB3B, 'M', u'כּ'), + (0xFB3C, 'M', u'לּ'), + (0xFB3D, 'X'), + (0xFB3E, 'M', u'מּ'), + (0xFB3F, 'X'), + (0xFB40, 'M', u'נּ'), + (0xFB41, 'M', u'סּ'), + (0xFB42, 'X'), + (0xFB43, 'M', u'ףּ'), + (0xFB44, 'M', u'פּ'), + (0xFB45, 'X'), + (0xFB46, 'M', u'צּ'), + (0xFB47, 'M', u'קּ'), + (0xFB48, 'M', u'רּ'), + (0xFB49, 'M', u'שּ'), + (0xFB4A, 'M', u'תּ'), + (0xFB4B, 'M', u'וֹ'), + (0xFB4C, 'M', u'בֿ'), + (0xFB4D, 'M', u'כֿ'), + (0xFB4E, 'M', u'פֿ'), + (0xFB4F, 'M', u'אל'), + (0xFB50, 'M', u'ٱ'), + (0xFB52, 'M', u'ٻ'), + (0xFB56, 'M', u'پ'), + (0xFB5A, 'M', u'ڀ'), + (0xFB5E, 'M', u'ٺ'), + (0xFB62, 'M', u'ٿ'), + (0xFB66, 'M', u'ٹ'), + (0xFB6A, 'M', u'ڤ'), + (0xFB6E, 'M', u'ڦ'), + (0xFB72, 'M', u'ڄ'), + (0xFB76, 'M', u'ڃ'), + (0xFB7A, 'M', u'چ'), + (0xFB7E, 'M', u'ڇ'), + (0xFB82, 'M', u'ڍ'), + (0xFB84, 'M', u'ڌ'), + (0xFB86, 'M', u'ڎ'), + (0xFB88, 'M', u'ڈ'), + (0xFB8A, 'M', u'ژ'), + (0xFB8C, 'M', u'ڑ'), + (0xFB8E, 'M', u'ک'), + (0xFB92, 'M', u'گ'), + (0xFB96, 'M', u'ڳ'), + (0xFB9A, 'M', u'ڱ'), + (0xFB9E, 'M', u'ں'), + (0xFBA0, 'M', u'ڻ'), + (0xFBA4, 'M', u'ۀ'), + (0xFBA6, 'M', u'ہ'), + (0xFBAA, 'M', u'ھ'), + (0xFBAE, 'M', u'ے'), + (0xFBB0, 'M', u'ۓ'), + (0xFBB2, 'V'), + (0xFBC2, 'X'), + (0xFBD3, 'M', u'ڭ'), + (0xFBD7, 'M', u'ۇ'), + (0xFBD9, 'M', u'ۆ'), + (0xFBDB, 'M', u'ۈ'), + (0xFBDD, 'M', u'ۇٴ'), + (0xFBDE, 'M', u'ۋ'), + (0xFBE0, 'M', u'ۅ'), + (0xFBE2, 'M', u'ۉ'), + (0xFBE4, 'M', u'ې'), + (0xFBE8, 'M', u'ى'), + (0xFBEA, 'M', u'ئا'), + (0xFBEC, 'M', u'ئە'), + (0xFBEE, 'M', u'ئو'), + (0xFBF0, 'M', u'ئۇ'), + (0xFBF2, 'M', u'ئۆ'), + (0xFBF4, 'M', u'ئۈ'), + (0xFBF6, 'M', u'ئې'), + (0xFBF9, 'M', u'ئى'), + (0xFBFC, 'M', u'ی'), + (0xFC00, 'M', u'ئج'), + (0xFC01, 'M', u'ئح'), + (0xFC02, 'M', u'ئم'), + (0xFC03, 'M', u'ئى'), + (0xFC04, 'M', u'ئي'), + (0xFC05, 'M', u'بج'), + (0xFC06, 'M', u'بح'), + (0xFC07, 'M', u'بخ'), + (0xFC08, 'M', u'بم'), + (0xFC09, 'M', u'بى'), + (0xFC0A, 'M', u'بي'), + (0xFC0B, 'M', u'تج'), + (0xFC0C, 'M', u'تح'), + (0xFC0D, 'M', u'تخ'), + (0xFC0E, 'M', u'تم'), + (0xFC0F, 'M', u'تى'), + (0xFC10, 'M', u'تي'), + (0xFC11, 'M', u'ثج'), + (0xFC12, 'M', u'ثم'), + (0xFC13, 'M', u'ثى'), + (0xFC14, 'M', u'ثي'), + (0xFC15, 'M', u'جح'), + (0xFC16, 'M', u'جم'), + (0xFC17, 'M', u'حج'), + (0xFC18, 'M', u'حم'), + (0xFC19, 'M', u'خج'), + (0xFC1A, 'M', u'خح'), + (0xFC1B, 'M', u'خم'), + ] + +def _seg_45(): + return [ + (0xFC1C, 'M', u'سج'), + (0xFC1D, 'M', u'سح'), + (0xFC1E, 'M', u'سخ'), + (0xFC1F, 'M', u'سم'), + (0xFC20, 'M', u'صح'), + (0xFC21, 'M', u'صم'), + (0xFC22, 'M', u'ضج'), + (0xFC23, 'M', u'ضح'), + (0xFC24, 'M', u'ضخ'), + (0xFC25, 'M', u'ضم'), + (0xFC26, 'M', u'طح'), + (0xFC27, 'M', u'طم'), + (0xFC28, 'M', u'ظم'), + (0xFC29, 'M', u'عج'), + (0xFC2A, 'M', u'عم'), + (0xFC2B, 'M', u'غج'), + (0xFC2C, 'M', u'غم'), + (0xFC2D, 'M', u'فج'), + (0xFC2E, 'M', u'فح'), + (0xFC2F, 'M', u'فخ'), + (0xFC30, 'M', u'فم'), + (0xFC31, 'M', u'فى'), + (0xFC32, 'M', u'في'), + (0xFC33, 'M', u'قح'), + (0xFC34, 'M', u'قم'), + (0xFC35, 'M', u'قى'), + (0xFC36, 'M', u'قي'), + (0xFC37, 'M', u'كا'), + (0xFC38, 'M', u'كج'), + (0xFC39, 'M', u'كح'), + (0xFC3A, 'M', u'كخ'), + (0xFC3B, 'M', u'كل'), + (0xFC3C, 'M', u'كم'), + (0xFC3D, 'M', u'كى'), + (0xFC3E, 'M', u'كي'), + (0xFC3F, 'M', u'لج'), + (0xFC40, 'M', u'لح'), + (0xFC41, 'M', u'لخ'), + (0xFC42, 'M', u'لم'), + (0xFC43, 'M', u'لى'), + (0xFC44, 'M', u'لي'), + (0xFC45, 'M', u'مج'), + (0xFC46, 'M', u'مح'), + (0xFC47, 'M', u'مخ'), + (0xFC48, 'M', u'مم'), + (0xFC49, 'M', u'مى'), + (0xFC4A, 'M', u'مي'), + (0xFC4B, 'M', u'نج'), + (0xFC4C, 'M', u'نح'), + (0xFC4D, 'M', u'نخ'), + (0xFC4E, 'M', u'نم'), + (0xFC4F, 'M', u'نى'), + (0xFC50, 'M', u'ني'), + (0xFC51, 'M', u'هج'), + (0xFC52, 'M', u'هم'), + (0xFC53, 'M', u'هى'), + (0xFC54, 'M', u'هي'), + (0xFC55, 'M', u'يج'), + (0xFC56, 'M', u'يح'), + (0xFC57, 'M', u'يخ'), + (0xFC58, 'M', u'يم'), + (0xFC59, 'M', u'يى'), + (0xFC5A, 'M', u'يي'), + (0xFC5B, 'M', u'ذٰ'), + (0xFC5C, 'M', u'رٰ'), + (0xFC5D, 'M', u'ىٰ'), + (0xFC5E, '3', u' ٌّ'), + (0xFC5F, '3', u' ٍّ'), + (0xFC60, '3', u' َّ'), + (0xFC61, '3', u' ُّ'), + (0xFC62, '3', u' ِّ'), + (0xFC63, '3', u' ّٰ'), + (0xFC64, 'M', u'ئر'), + (0xFC65, 'M', u'ئز'), + (0xFC66, 'M', u'ئم'), + (0xFC67, 'M', u'ئن'), + (0xFC68, 'M', u'ئى'), + (0xFC69, 'M', u'ئي'), + (0xFC6A, 'M', u'بر'), + (0xFC6B, 'M', u'بز'), + (0xFC6C, 'M', u'بم'), + (0xFC6D, 'M', u'بن'), + (0xFC6E, 'M', u'بى'), + (0xFC6F, 'M', u'بي'), + (0xFC70, 'M', u'تر'), + (0xFC71, 'M', u'تز'), + (0xFC72, 'M', u'تم'), + (0xFC73, 'M', u'تن'), + (0xFC74, 'M', u'تى'), + (0xFC75, 'M', u'تي'), + (0xFC76, 'M', u'ثر'), + (0xFC77, 'M', u'ثز'), + (0xFC78, 'M', u'ثم'), + (0xFC79, 'M', u'ثن'), + (0xFC7A, 'M', u'ثى'), + (0xFC7B, 'M', u'ثي'), + (0xFC7C, 'M', u'فى'), + (0xFC7D, 'M', u'في'), + (0xFC7E, 'M', u'قى'), + (0xFC7F, 'M', u'قي'), + ] + +def _seg_46(): + return [ + (0xFC80, 'M', u'كا'), + (0xFC81, 'M', u'كل'), + (0xFC82, 'M', u'كم'), + (0xFC83, 'M', u'كى'), + (0xFC84, 'M', u'كي'), + (0xFC85, 'M', u'لم'), + (0xFC86, 'M', u'لى'), + (0xFC87, 'M', u'لي'), + (0xFC88, 'M', u'ما'), + (0xFC89, 'M', u'مم'), + (0xFC8A, 'M', u'نر'), + (0xFC8B, 'M', u'نز'), + (0xFC8C, 'M', u'نم'), + (0xFC8D, 'M', u'نن'), + (0xFC8E, 'M', u'نى'), + (0xFC8F, 'M', u'ني'), + (0xFC90, 'M', u'ىٰ'), + (0xFC91, 'M', u'ير'), + (0xFC92, 'M', u'يز'), + (0xFC93, 'M', u'يم'), + (0xFC94, 'M', u'ين'), + (0xFC95, 'M', u'يى'), + (0xFC96, 'M', u'يي'), + (0xFC97, 'M', u'ئج'), + (0xFC98, 'M', u'ئح'), + (0xFC99, 'M', u'ئخ'), + (0xFC9A, 'M', u'ئم'), + (0xFC9B, 'M', u'ئه'), + (0xFC9C, 'M', u'بج'), + (0xFC9D, 'M', u'بح'), + (0xFC9E, 'M', u'بخ'), + (0xFC9F, 'M', u'بم'), + (0xFCA0, 'M', u'به'), + (0xFCA1, 'M', u'تج'), + (0xFCA2, 'M', u'تح'), + (0xFCA3, 'M', u'تخ'), + (0xFCA4, 'M', u'تم'), + (0xFCA5, 'M', u'ته'), + (0xFCA6, 'M', u'ثم'), + (0xFCA7, 'M', u'جح'), + (0xFCA8, 'M', u'جم'), + (0xFCA9, 'M', u'حج'), + (0xFCAA, 'M', u'حم'), + (0xFCAB, 'M', u'خج'), + (0xFCAC, 'M', u'خم'), + (0xFCAD, 'M', u'سج'), + (0xFCAE, 'M', u'سح'), + (0xFCAF, 'M', u'سخ'), + (0xFCB0, 'M', u'سم'), + (0xFCB1, 'M', u'صح'), + (0xFCB2, 'M', u'صخ'), + (0xFCB3, 'M', u'صم'), + (0xFCB4, 'M', u'ضج'), + (0xFCB5, 'M', u'ضح'), + (0xFCB6, 'M', u'ضخ'), + (0xFCB7, 'M', u'ضم'), + (0xFCB8, 'M', u'طح'), + (0xFCB9, 'M', u'ظم'), + (0xFCBA, 'M', u'عج'), + (0xFCBB, 'M', u'عم'), + (0xFCBC, 'M', u'غج'), + (0xFCBD, 'M', u'غم'), + (0xFCBE, 'M', u'فج'), + (0xFCBF, 'M', u'فح'), + (0xFCC0, 'M', u'فخ'), + (0xFCC1, 'M', u'فم'), + (0xFCC2, 'M', u'قح'), + (0xFCC3, 'M', u'قم'), + (0xFCC4, 'M', u'كج'), + (0xFCC5, 'M', u'كح'), + (0xFCC6, 'M', u'كخ'), + (0xFCC7, 'M', u'كل'), + (0xFCC8, 'M', u'كم'), + (0xFCC9, 'M', u'لج'), + (0xFCCA, 'M', u'لح'), + (0xFCCB, 'M', u'لخ'), + (0xFCCC, 'M', u'لم'), + (0xFCCD, 'M', u'له'), + (0xFCCE, 'M', u'مج'), + (0xFCCF, 'M', u'مح'), + (0xFCD0, 'M', u'مخ'), + (0xFCD1, 'M', u'مم'), + (0xFCD2, 'M', u'نج'), + (0xFCD3, 'M', u'نح'), + (0xFCD4, 'M', u'نخ'), + (0xFCD5, 'M', u'نم'), + (0xFCD6, 'M', u'نه'), + (0xFCD7, 'M', u'هج'), + (0xFCD8, 'M', u'هم'), + (0xFCD9, 'M', u'هٰ'), + (0xFCDA, 'M', u'يج'), + (0xFCDB, 'M', u'يح'), + (0xFCDC, 'M', u'يخ'), + (0xFCDD, 'M', u'يم'), + (0xFCDE, 'M', u'يه'), + (0xFCDF, 'M', u'ئم'), + (0xFCE0, 'M', u'ئه'), + (0xFCE1, 'M', u'بم'), + (0xFCE2, 'M', u'به'), + (0xFCE3, 'M', u'تم'), + ] + +def _seg_47(): + return [ + (0xFCE4, 'M', u'ته'), + (0xFCE5, 'M', u'ثم'), + (0xFCE6, 'M', u'ثه'), + (0xFCE7, 'M', u'سم'), + (0xFCE8, 'M', u'سه'), + (0xFCE9, 'M', u'شم'), + (0xFCEA, 'M', u'شه'), + (0xFCEB, 'M', u'كل'), + (0xFCEC, 'M', u'كم'), + (0xFCED, 'M', u'لم'), + (0xFCEE, 'M', u'نم'), + (0xFCEF, 'M', u'نه'), + (0xFCF0, 'M', u'يم'), + (0xFCF1, 'M', u'يه'), + (0xFCF2, 'M', u'ـَّ'), + (0xFCF3, 'M', u'ـُّ'), + (0xFCF4, 'M', u'ـِّ'), + (0xFCF5, 'M', u'طى'), + (0xFCF6, 'M', u'طي'), + (0xFCF7, 'M', u'عى'), + (0xFCF8, 'M', u'عي'), + (0xFCF9, 'M', u'غى'), + (0xFCFA, 'M', u'غي'), + (0xFCFB, 'M', u'سى'), + (0xFCFC, 'M', u'سي'), + (0xFCFD, 'M', u'شى'), + (0xFCFE, 'M', u'شي'), + (0xFCFF, 'M', u'حى'), + (0xFD00, 'M', u'حي'), + (0xFD01, 'M', u'جى'), + (0xFD02, 'M', u'جي'), + (0xFD03, 'M', u'خى'), + (0xFD04, 'M', u'خي'), + (0xFD05, 'M', u'صى'), + (0xFD06, 'M', u'صي'), + (0xFD07, 'M', u'ضى'), + (0xFD08, 'M', u'ضي'), + (0xFD09, 'M', u'شج'), + (0xFD0A, 'M', u'شح'), + (0xFD0B, 'M', u'شخ'), + (0xFD0C, 'M', u'شم'), + (0xFD0D, 'M', u'شر'), + (0xFD0E, 'M', u'سر'), + (0xFD0F, 'M', u'صر'), + (0xFD10, 'M', u'ضر'), + (0xFD11, 'M', u'طى'), + (0xFD12, 'M', u'طي'), + (0xFD13, 'M', u'عى'), + (0xFD14, 'M', u'عي'), + (0xFD15, 'M', u'غى'), + (0xFD16, 'M', u'غي'), + (0xFD17, 'M', u'سى'), + (0xFD18, 'M', u'سي'), + (0xFD19, 'M', u'شى'), + (0xFD1A, 'M', u'شي'), + (0xFD1B, 'M', u'حى'), + (0xFD1C, 'M', u'حي'), + (0xFD1D, 'M', u'جى'), + (0xFD1E, 'M', u'جي'), + (0xFD1F, 'M', u'خى'), + (0xFD20, 'M', u'خي'), + (0xFD21, 'M', u'صى'), + (0xFD22, 'M', u'صي'), + (0xFD23, 'M', u'ضى'), + (0xFD24, 'M', u'ضي'), + (0xFD25, 'M', u'شج'), + (0xFD26, 'M', u'شح'), + (0xFD27, 'M', u'شخ'), + (0xFD28, 'M', u'شم'), + (0xFD29, 'M', u'شر'), + (0xFD2A, 'M', u'سر'), + (0xFD2B, 'M', u'صر'), + (0xFD2C, 'M', u'ضر'), + (0xFD2D, 'M', u'شج'), + (0xFD2E, 'M', u'شح'), + (0xFD2F, 'M', u'شخ'), + (0xFD30, 'M', u'شم'), + (0xFD31, 'M', u'سه'), + (0xFD32, 'M', u'شه'), + (0xFD33, 'M', u'طم'), + (0xFD34, 'M', u'سج'), + (0xFD35, 'M', u'سح'), + (0xFD36, 'M', u'سخ'), + (0xFD37, 'M', u'شج'), + (0xFD38, 'M', u'شح'), + (0xFD39, 'M', u'شخ'), + (0xFD3A, 'M', u'طم'), + (0xFD3B, 'M', u'ظم'), + (0xFD3C, 'M', u'اً'), + (0xFD3E, 'V'), + (0xFD40, 'X'), + (0xFD50, 'M', u'تجم'), + (0xFD51, 'M', u'تحج'), + (0xFD53, 'M', u'تحم'), + (0xFD54, 'M', u'تخم'), + (0xFD55, 'M', u'تمج'), + (0xFD56, 'M', u'تمح'), + (0xFD57, 'M', u'تمخ'), + (0xFD58, 'M', u'جمح'), + (0xFD5A, 'M', u'حمي'), + ] + +def _seg_48(): + return [ + (0xFD5B, 'M', u'حمى'), + (0xFD5C, 'M', u'سحج'), + (0xFD5D, 'M', u'سجح'), + (0xFD5E, 'M', u'سجى'), + (0xFD5F, 'M', u'سمح'), + (0xFD61, 'M', u'سمج'), + (0xFD62, 'M', u'سمم'), + (0xFD64, 'M', u'صحح'), + (0xFD66, 'M', u'صمم'), + (0xFD67, 'M', u'شحم'), + (0xFD69, 'M', u'شجي'), + (0xFD6A, 'M', u'شمخ'), + (0xFD6C, 'M', u'شمم'), + (0xFD6E, 'M', u'ضحى'), + (0xFD6F, 'M', u'ضخم'), + (0xFD71, 'M', u'طمح'), + (0xFD73, 'M', u'طمم'), + (0xFD74, 'M', u'طمي'), + (0xFD75, 'M', u'عجم'), + (0xFD76, 'M', u'عمم'), + (0xFD78, 'M', u'عمى'), + (0xFD79, 'M', u'غمم'), + (0xFD7A, 'M', u'غمي'), + (0xFD7B, 'M', u'غمى'), + (0xFD7C, 'M', u'فخم'), + (0xFD7E, 'M', u'قمح'), + (0xFD7F, 'M', u'قمم'), + (0xFD80, 'M', u'لحم'), + (0xFD81, 'M', u'لحي'), + (0xFD82, 'M', u'لحى'), + (0xFD83, 'M', u'لجج'), + (0xFD85, 'M', u'لخم'), + (0xFD87, 'M', u'لمح'), + (0xFD89, 'M', u'محج'), + (0xFD8A, 'M', u'محم'), + (0xFD8B, 'M', u'محي'), + (0xFD8C, 'M', u'مجح'), + (0xFD8D, 'M', u'مجم'), + (0xFD8E, 'M', u'مخج'), + (0xFD8F, 'M', u'مخم'), + (0xFD90, 'X'), + (0xFD92, 'M', u'مجخ'), + (0xFD93, 'M', u'همج'), + (0xFD94, 'M', u'همم'), + (0xFD95, 'M', u'نحم'), + (0xFD96, 'M', u'نحى'), + (0xFD97, 'M', u'نجم'), + (0xFD99, 'M', u'نجى'), + (0xFD9A, 'M', u'نمي'), + (0xFD9B, 'M', u'نمى'), + (0xFD9C, 'M', u'يمم'), + (0xFD9E, 'M', u'بخي'), + (0xFD9F, 'M', u'تجي'), + (0xFDA0, 'M', u'تجى'), + (0xFDA1, 'M', u'تخي'), + (0xFDA2, 'M', u'تخى'), + (0xFDA3, 'M', u'تمي'), + (0xFDA4, 'M', u'تمى'), + (0xFDA5, 'M', u'جمي'), + (0xFDA6, 'M', u'جحى'), + (0xFDA7, 'M', u'جمى'), + (0xFDA8, 'M', u'سخى'), + (0xFDA9, 'M', u'صحي'), + (0xFDAA, 'M', u'شحي'), + (0xFDAB, 'M', u'ضحي'), + (0xFDAC, 'M', u'لجي'), + (0xFDAD, 'M', u'لمي'), + (0xFDAE, 'M', u'يحي'), + (0xFDAF, 'M', u'يجي'), + (0xFDB0, 'M', u'يمي'), + (0xFDB1, 'M', u'ممي'), + (0xFDB2, 'M', u'قمي'), + (0xFDB3, 'M', u'نحي'), + (0xFDB4, 'M', u'قمح'), + (0xFDB5, 'M', u'لحم'), + (0xFDB6, 'M', u'عمي'), + (0xFDB7, 'M', u'كمي'), + (0xFDB8, 'M', u'نجح'), + (0xFDB9, 'M', u'مخي'), + (0xFDBA, 'M', u'لجم'), + (0xFDBB, 'M', u'كمم'), + (0xFDBC, 'M', u'لجم'), + (0xFDBD, 'M', u'نجح'), + (0xFDBE, 'M', u'جحي'), + (0xFDBF, 'M', u'حجي'), + (0xFDC0, 'M', u'مجي'), + (0xFDC1, 'M', u'فمي'), + (0xFDC2, 'M', u'بحي'), + (0xFDC3, 'M', u'كمم'), + (0xFDC4, 'M', u'عجم'), + (0xFDC5, 'M', u'صمم'), + (0xFDC6, 'M', u'سخي'), + (0xFDC7, 'M', u'نجي'), + (0xFDC8, 'X'), + (0xFDF0, 'M', u'صلے'), + (0xFDF1, 'M', u'قلے'), + (0xFDF2, 'M', u'الله'), + (0xFDF3, 'M', u'اكبر'), + (0xFDF4, 'M', u'محمد'), + (0xFDF5, 'M', u'صلعم'), + ] + +def _seg_49(): + return [ + (0xFDF6, 'M', u'رسول'), + (0xFDF7, 'M', u'عليه'), + (0xFDF8, 'M', u'وسلم'), + (0xFDF9, 'M', u'صلى'), + (0xFDFA, '3', u'صلى الله عليه وسلم'), + (0xFDFB, '3', u'جل جلاله'), + (0xFDFC, 'M', u'ریال'), + (0xFDFD, 'V'), + (0xFDFE, 'X'), + (0xFE00, 'I'), + (0xFE10, '3', u','), + (0xFE11, 'M', u'、'), + (0xFE12, 'X'), + (0xFE13, '3', u':'), + (0xFE14, '3', u';'), + (0xFE15, '3', u'!'), + (0xFE16, '3', u'?'), + (0xFE17, 'M', u'〖'), + (0xFE18, 'M', u'〗'), + (0xFE19, 'X'), + (0xFE20, 'V'), + (0xFE30, 'X'), + (0xFE31, 'M', u'—'), + (0xFE32, 'M', u'–'), + (0xFE33, '3', u'_'), + (0xFE35, '3', u'('), + (0xFE36, '3', u')'), + (0xFE37, '3', u'{'), + (0xFE38, '3', u'}'), + (0xFE39, 'M', u'〔'), + (0xFE3A, 'M', u'〕'), + (0xFE3B, 'M', u'【'), + (0xFE3C, 'M', u'】'), + (0xFE3D, 'M', u'《'), + (0xFE3E, 'M', u'》'), + (0xFE3F, 'M', u'〈'), + (0xFE40, 'M', u'〉'), + (0xFE41, 'M', u'「'), + (0xFE42, 'M', u'」'), + (0xFE43, 'M', u'『'), + (0xFE44, 'M', u'』'), + (0xFE45, 'V'), + (0xFE47, '3', u'['), + (0xFE48, '3', u']'), + (0xFE49, '3', u' ̅'), + (0xFE4D, '3', u'_'), + (0xFE50, '3', u','), + (0xFE51, 'M', u'、'), + (0xFE52, 'X'), + (0xFE54, '3', u';'), + (0xFE55, '3', u':'), + (0xFE56, '3', u'?'), + (0xFE57, '3', u'!'), + (0xFE58, 'M', u'—'), + (0xFE59, '3', u'('), + (0xFE5A, '3', u')'), + (0xFE5B, '3', u'{'), + (0xFE5C, '3', u'}'), + (0xFE5D, 'M', u'〔'), + (0xFE5E, 'M', u'〕'), + (0xFE5F, '3', u'#'), + (0xFE60, '3', u'&'), + (0xFE61, '3', u'*'), + (0xFE62, '3', u'+'), + (0xFE63, 'M', u'-'), + (0xFE64, '3', u'<'), + (0xFE65, '3', u'>'), + (0xFE66, '3', u'='), + (0xFE67, 'X'), + (0xFE68, '3', u'\\'), + (0xFE69, '3', u'$'), + (0xFE6A, '3', u'%'), + (0xFE6B, '3', u'@'), + (0xFE6C, 'X'), + (0xFE70, '3', u' ً'), + (0xFE71, 'M', u'ـً'), + (0xFE72, '3', u' ٌ'), + (0xFE73, 'V'), + (0xFE74, '3', u' ٍ'), + (0xFE75, 'X'), + (0xFE76, '3', u' َ'), + (0xFE77, 'M', u'ـَ'), + (0xFE78, '3', u' ُ'), + (0xFE79, 'M', u'ـُ'), + (0xFE7A, '3', u' ِ'), + (0xFE7B, 'M', u'ـِ'), + (0xFE7C, '3', u' ّ'), + (0xFE7D, 'M', u'ـّ'), + (0xFE7E, '3', u' ْ'), + (0xFE7F, 'M', u'ـْ'), + (0xFE80, 'M', u'ء'), + (0xFE81, 'M', u'آ'), + (0xFE83, 'M', u'أ'), + (0xFE85, 'M', u'ؤ'), + (0xFE87, 'M', u'إ'), + (0xFE89, 'M', u'ئ'), + (0xFE8D, 'M', u'ا'), + (0xFE8F, 'M', u'ب'), + (0xFE93, 'M', u'ة'), + (0xFE95, 'M', u'ت'), + ] + +def _seg_50(): + return [ + (0xFE99, 'M', u'ث'), + (0xFE9D, 'M', u'ج'), + (0xFEA1, 'M', u'ح'), + (0xFEA5, 'M', u'خ'), + (0xFEA9, 'M', u'د'), + (0xFEAB, 'M', u'ذ'), + (0xFEAD, 'M', u'ر'), + (0xFEAF, 'M', u'ز'), + (0xFEB1, 'M', u'س'), + (0xFEB5, 'M', u'ش'), + (0xFEB9, 'M', u'ص'), + (0xFEBD, 'M', u'ض'), + (0xFEC1, 'M', u'ط'), + (0xFEC5, 'M', u'ظ'), + (0xFEC9, 'M', u'ع'), + (0xFECD, 'M', u'غ'), + (0xFED1, 'M', u'ف'), + (0xFED5, 'M', u'ق'), + (0xFED9, 'M', u'ك'), + (0xFEDD, 'M', u'ل'), + (0xFEE1, 'M', u'م'), + (0xFEE5, 'M', u'ن'), + (0xFEE9, 'M', u'ه'), + (0xFEED, 'M', u'و'), + (0xFEEF, 'M', u'ى'), + (0xFEF1, 'M', u'ي'), + (0xFEF5, 'M', u'لآ'), + (0xFEF7, 'M', u'لأ'), + (0xFEF9, 'M', u'لإ'), + (0xFEFB, 'M', u'لا'), + (0xFEFD, 'X'), + (0xFEFF, 'I'), + (0xFF00, 'X'), + (0xFF01, '3', u'!'), + (0xFF02, '3', u'"'), + (0xFF03, '3', u'#'), + (0xFF04, '3', u'$'), + (0xFF05, '3', u'%'), + (0xFF06, '3', u'&'), + (0xFF07, '3', u'\''), + (0xFF08, '3', u'('), + (0xFF09, '3', u')'), + (0xFF0A, '3', u'*'), + (0xFF0B, '3', u'+'), + (0xFF0C, '3', u','), + (0xFF0D, 'M', u'-'), + (0xFF0E, 'M', u'.'), + (0xFF0F, '3', u'/'), + (0xFF10, 'M', u'0'), + (0xFF11, 'M', u'1'), + (0xFF12, 'M', u'2'), + (0xFF13, 'M', u'3'), + (0xFF14, 'M', u'4'), + (0xFF15, 'M', u'5'), + (0xFF16, 'M', u'6'), + (0xFF17, 'M', u'7'), + (0xFF18, 'M', u'8'), + (0xFF19, 'M', u'9'), + (0xFF1A, '3', u':'), + (0xFF1B, '3', u';'), + (0xFF1C, '3', u'<'), + (0xFF1D, '3', u'='), + (0xFF1E, '3', u'>'), + (0xFF1F, '3', u'?'), + (0xFF20, '3', u'@'), + (0xFF21, 'M', u'a'), + (0xFF22, 'M', u'b'), + (0xFF23, 'M', u'c'), + (0xFF24, 'M', u'd'), + (0xFF25, 'M', u'e'), + (0xFF26, 'M', u'f'), + (0xFF27, 'M', u'g'), + (0xFF28, 'M', u'h'), + (0xFF29, 'M', u'i'), + (0xFF2A, 'M', u'j'), + (0xFF2B, 'M', u'k'), + (0xFF2C, 'M', u'l'), + (0xFF2D, 'M', u'm'), + (0xFF2E, 'M', u'n'), + (0xFF2F, 'M', u'o'), + (0xFF30, 'M', u'p'), + (0xFF31, 'M', u'q'), + (0xFF32, 'M', u'r'), + (0xFF33, 'M', u's'), + (0xFF34, 'M', u't'), + (0xFF35, 'M', u'u'), + (0xFF36, 'M', u'v'), + (0xFF37, 'M', u'w'), + (0xFF38, 'M', u'x'), + (0xFF39, 'M', u'y'), + (0xFF3A, 'M', u'z'), + (0xFF3B, '3', u'['), + (0xFF3C, '3', u'\\'), + (0xFF3D, '3', u']'), + (0xFF3E, '3', u'^'), + (0xFF3F, '3', u'_'), + (0xFF40, '3', u'`'), + (0xFF41, 'M', u'a'), + (0xFF42, 'M', u'b'), + (0xFF43, 'M', u'c'), + ] + +def _seg_51(): + return [ + (0xFF44, 'M', u'd'), + (0xFF45, 'M', u'e'), + (0xFF46, 'M', u'f'), + (0xFF47, 'M', u'g'), + (0xFF48, 'M', u'h'), + (0xFF49, 'M', u'i'), + (0xFF4A, 'M', u'j'), + (0xFF4B, 'M', u'k'), + (0xFF4C, 'M', u'l'), + (0xFF4D, 'M', u'm'), + (0xFF4E, 'M', u'n'), + (0xFF4F, 'M', u'o'), + (0xFF50, 'M', u'p'), + (0xFF51, 'M', u'q'), + (0xFF52, 'M', u'r'), + (0xFF53, 'M', u's'), + (0xFF54, 'M', u't'), + (0xFF55, 'M', u'u'), + (0xFF56, 'M', u'v'), + (0xFF57, 'M', u'w'), + (0xFF58, 'M', u'x'), + (0xFF59, 'M', u'y'), + (0xFF5A, 'M', u'z'), + (0xFF5B, '3', u'{'), + (0xFF5C, '3', u'|'), + (0xFF5D, '3', u'}'), + (0xFF5E, '3', u'~'), + (0xFF5F, 'M', u'⦅'), + (0xFF60, 'M', u'⦆'), + (0xFF61, 'M', u'.'), + (0xFF62, 'M', u'「'), + (0xFF63, 'M', u'」'), + (0xFF64, 'M', u'、'), + (0xFF65, 'M', u'・'), + (0xFF66, 'M', u'ヲ'), + (0xFF67, 'M', u'ァ'), + (0xFF68, 'M', u'ィ'), + (0xFF69, 'M', u'ゥ'), + (0xFF6A, 'M', u'ェ'), + (0xFF6B, 'M', u'ォ'), + (0xFF6C, 'M', u'ャ'), + (0xFF6D, 'M', u'ュ'), + (0xFF6E, 'M', u'ョ'), + (0xFF6F, 'M', u'ッ'), + (0xFF70, 'M', u'ー'), + (0xFF71, 'M', u'ア'), + (0xFF72, 'M', u'イ'), + (0xFF73, 'M', u'ウ'), + (0xFF74, 'M', u'エ'), + (0xFF75, 'M', u'オ'), + (0xFF76, 'M', u'カ'), + (0xFF77, 'M', u'キ'), + (0xFF78, 'M', u'ク'), + (0xFF79, 'M', u'ケ'), + (0xFF7A, 'M', u'コ'), + (0xFF7B, 'M', u'サ'), + (0xFF7C, 'M', u'シ'), + (0xFF7D, 'M', u'ス'), + (0xFF7E, 'M', u'セ'), + (0xFF7F, 'M', u'ソ'), + (0xFF80, 'M', u'タ'), + (0xFF81, 'M', u'チ'), + (0xFF82, 'M', u'ツ'), + (0xFF83, 'M', u'テ'), + (0xFF84, 'M', u'ト'), + (0xFF85, 'M', u'ナ'), + (0xFF86, 'M', u'ニ'), + (0xFF87, 'M', u'ヌ'), + (0xFF88, 'M', u'ネ'), + (0xFF89, 'M', u'ノ'), + (0xFF8A, 'M', u'ハ'), + (0xFF8B, 'M', u'ヒ'), + (0xFF8C, 'M', u'フ'), + (0xFF8D, 'M', u'ヘ'), + (0xFF8E, 'M', u'ホ'), + (0xFF8F, 'M', u'マ'), + (0xFF90, 'M', u'ミ'), + (0xFF91, 'M', u'ム'), + (0xFF92, 'M', u'メ'), + (0xFF93, 'M', u'モ'), + (0xFF94, 'M', u'ヤ'), + (0xFF95, 'M', u'ユ'), + (0xFF96, 'M', u'ヨ'), + (0xFF97, 'M', u'ラ'), + (0xFF98, 'M', u'リ'), + (0xFF99, 'M', u'ル'), + (0xFF9A, 'M', u'レ'), + (0xFF9B, 'M', u'ロ'), + (0xFF9C, 'M', u'ワ'), + (0xFF9D, 'M', u'ン'), + (0xFF9E, 'M', u'゙'), + (0xFF9F, 'M', u'゚'), + (0xFFA0, 'X'), + (0xFFA1, 'M', u'ᄀ'), + (0xFFA2, 'M', u'ᄁ'), + (0xFFA3, 'M', u'ᆪ'), + (0xFFA4, 'M', u'ᄂ'), + (0xFFA5, 'M', u'ᆬ'), + (0xFFA6, 'M', u'ᆭ'), + (0xFFA7, 'M', u'ᄃ'), + ] + +def _seg_52(): + return [ + (0xFFA8, 'M', u'ᄄ'), + (0xFFA9, 'M', u'ᄅ'), + (0xFFAA, 'M', u'ᆰ'), + (0xFFAB, 'M', u'ᆱ'), + (0xFFAC, 'M', u'ᆲ'), + (0xFFAD, 'M', u'ᆳ'), + (0xFFAE, 'M', u'ᆴ'), + (0xFFAF, 'M', u'ᆵ'), + (0xFFB0, 'M', u'ᄚ'), + (0xFFB1, 'M', u'ᄆ'), + (0xFFB2, 'M', u'ᄇ'), + (0xFFB3, 'M', u'ᄈ'), + (0xFFB4, 'M', u'ᄡ'), + (0xFFB5, 'M', u'ᄉ'), + (0xFFB6, 'M', u'ᄊ'), + (0xFFB7, 'M', u'ᄋ'), + (0xFFB8, 'M', u'ᄌ'), + (0xFFB9, 'M', u'ᄍ'), + (0xFFBA, 'M', u'ᄎ'), + (0xFFBB, 'M', u'ᄏ'), + (0xFFBC, 'M', u'ᄐ'), + (0xFFBD, 'M', u'ᄑ'), + (0xFFBE, 'M', u'ᄒ'), + (0xFFBF, 'X'), + (0xFFC2, 'M', u'ᅡ'), + (0xFFC3, 'M', u'ᅢ'), + (0xFFC4, 'M', u'ᅣ'), + (0xFFC5, 'M', u'ᅤ'), + (0xFFC6, 'M', u'ᅥ'), + (0xFFC7, 'M', u'ᅦ'), + (0xFFC8, 'X'), + (0xFFCA, 'M', u'ᅧ'), + (0xFFCB, 'M', u'ᅨ'), + (0xFFCC, 'M', u'ᅩ'), + (0xFFCD, 'M', u'ᅪ'), + (0xFFCE, 'M', u'ᅫ'), + (0xFFCF, 'M', u'ᅬ'), + (0xFFD0, 'X'), + (0xFFD2, 'M', u'ᅭ'), + (0xFFD3, 'M', u'ᅮ'), + (0xFFD4, 'M', u'ᅯ'), + (0xFFD5, 'M', u'ᅰ'), + (0xFFD6, 'M', u'ᅱ'), + (0xFFD7, 'M', u'ᅲ'), + (0xFFD8, 'X'), + (0xFFDA, 'M', u'ᅳ'), + (0xFFDB, 'M', u'ᅴ'), + (0xFFDC, 'M', u'ᅵ'), + (0xFFDD, 'X'), + (0xFFE0, 'M', u'¢'), + (0xFFE1, 'M', u'£'), + (0xFFE2, 'M', u'¬'), + (0xFFE3, '3', u' ̄'), + (0xFFE4, 'M', u'¦'), + (0xFFE5, 'M', u'¥'), + (0xFFE6, 'M', u'₩'), + (0xFFE7, 'X'), + (0xFFE8, 'M', u'│'), + (0xFFE9, 'M', u'←'), + (0xFFEA, 'M', u'↑'), + (0xFFEB, 'M', u'→'), + (0xFFEC, 'M', u'↓'), + (0xFFED, 'M', u'■'), + (0xFFEE, 'M', u'○'), + (0xFFEF, 'X'), + (0x10000, 'V'), + (0x1000C, 'X'), + (0x1000D, 'V'), + (0x10027, 'X'), + (0x10028, 'V'), + (0x1003B, 'X'), + (0x1003C, 'V'), + (0x1003E, 'X'), + (0x1003F, 'V'), + (0x1004E, 'X'), + (0x10050, 'V'), + (0x1005E, 'X'), + (0x10080, 'V'), + (0x100FB, 'X'), + (0x10100, 'V'), + (0x10103, 'X'), + (0x10107, 'V'), + (0x10134, 'X'), + (0x10137, 'V'), + (0x1018F, 'X'), + (0x10190, 'V'), + (0x1019C, 'X'), + (0x101A0, 'V'), + (0x101A1, 'X'), + (0x101D0, 'V'), + (0x101FE, 'X'), + (0x10280, 'V'), + (0x1029D, 'X'), + (0x102A0, 'V'), + (0x102D1, 'X'), + (0x102E0, 'V'), + (0x102FC, 'X'), + (0x10300, 'V'), + (0x10324, 'X'), + (0x1032D, 'V'), + ] + +def _seg_53(): + return [ + (0x1034B, 'X'), + (0x10350, 'V'), + (0x1037B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', u'𐐨'), + (0x10401, 'M', u'𐐩'), + (0x10402, 'M', u'𐐪'), + (0x10403, 'M', u'𐐫'), + (0x10404, 'M', u'𐐬'), + (0x10405, 'M', u'𐐭'), + (0x10406, 'M', u'𐐮'), + (0x10407, 'M', u'𐐯'), + (0x10408, 'M', u'𐐰'), + (0x10409, 'M', u'𐐱'), + (0x1040A, 'M', u'𐐲'), + (0x1040B, 'M', u'𐐳'), + (0x1040C, 'M', u'𐐴'), + (0x1040D, 'M', u'𐐵'), + (0x1040E, 'M', u'𐐶'), + (0x1040F, 'M', u'𐐷'), + (0x10410, 'M', u'𐐸'), + (0x10411, 'M', u'𐐹'), + (0x10412, 'M', u'𐐺'), + (0x10413, 'M', u'𐐻'), + (0x10414, 'M', u'𐐼'), + (0x10415, 'M', u'𐐽'), + (0x10416, 'M', u'𐐾'), + (0x10417, 'M', u'𐐿'), + (0x10418, 'M', u'𐑀'), + (0x10419, 'M', u'𐑁'), + (0x1041A, 'M', u'𐑂'), + (0x1041B, 'M', u'𐑃'), + (0x1041C, 'M', u'𐑄'), + (0x1041D, 'M', u'𐑅'), + (0x1041E, 'M', u'𐑆'), + (0x1041F, 'M', u'𐑇'), + (0x10420, 'M', u'𐑈'), + (0x10421, 'M', u'𐑉'), + (0x10422, 'M', u'𐑊'), + (0x10423, 'M', u'𐑋'), + (0x10424, 'M', u'𐑌'), + (0x10425, 'M', u'𐑍'), + (0x10426, 'M', u'𐑎'), + (0x10427, 'M', u'𐑏'), + (0x10428, 'V'), + (0x1049E, 'X'), + (0x104A0, 'V'), + (0x104AA, 'X'), + (0x104B0, 'M', u'𐓘'), + (0x104B1, 'M', u'𐓙'), + (0x104B2, 'M', u'𐓚'), + (0x104B3, 'M', u'𐓛'), + (0x104B4, 'M', u'𐓜'), + (0x104B5, 'M', u'𐓝'), + (0x104B6, 'M', u'𐓞'), + (0x104B7, 'M', u'𐓟'), + (0x104B8, 'M', u'𐓠'), + (0x104B9, 'M', u'𐓡'), + (0x104BA, 'M', u'𐓢'), + (0x104BB, 'M', u'𐓣'), + (0x104BC, 'M', u'𐓤'), + (0x104BD, 'M', u'𐓥'), + (0x104BE, 'M', u'𐓦'), + (0x104BF, 'M', u'𐓧'), + (0x104C0, 'M', u'𐓨'), + (0x104C1, 'M', u'𐓩'), + (0x104C2, 'M', u'𐓪'), + (0x104C3, 'M', u'𐓫'), + (0x104C4, 'M', u'𐓬'), + (0x104C5, 'M', u'𐓭'), + (0x104C6, 'M', u'𐓮'), + (0x104C7, 'M', u'𐓯'), + (0x104C8, 'M', u'𐓰'), + (0x104C9, 'M', u'𐓱'), + (0x104CA, 'M', u'𐓲'), + (0x104CB, 'M', u'𐓳'), + (0x104CC, 'M', u'𐓴'), + (0x104CD, 'M', u'𐓵'), + (0x104CE, 'M', u'𐓶'), + (0x104CF, 'M', u'𐓷'), + (0x104D0, 'M', u'𐓸'), + (0x104D1, 'M', u'𐓹'), + (0x104D2, 'M', u'𐓺'), + (0x104D3, 'M', u'𐓻'), + (0x104D4, 'X'), + (0x104D8, 'V'), + (0x104FC, 'X'), + (0x10500, 'V'), + (0x10528, 'X'), + (0x10530, 'V'), + (0x10564, 'X'), + (0x1056F, 'V'), + (0x10570, 'X'), + (0x10600, 'V'), + (0x10737, 'X'), + ] + +def _seg_54(): + return [ + (0x10740, 'V'), + (0x10756, 'X'), + (0x10760, 'V'), + (0x10768, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + (0x10839, 'X'), + (0x1083C, 'V'), + (0x1083D, 'X'), + (0x1083F, 'V'), + (0x10856, 'X'), + (0x10857, 'V'), + (0x1089F, 'X'), + (0x108A7, 'V'), + (0x108B0, 'X'), + (0x108E0, 'V'), + (0x108F3, 'X'), + (0x108F4, 'V'), + (0x108F6, 'X'), + (0x108FB, 'V'), + (0x1091C, 'X'), + (0x1091F, 'V'), + (0x1093A, 'X'), + (0x1093F, 'V'), + (0x10940, 'X'), + (0x10980, 'V'), + (0x109B8, 'X'), + (0x109BC, 'V'), + (0x109D0, 'X'), + (0x109D2, 'V'), + (0x10A04, 'X'), + (0x10A05, 'V'), + (0x10A07, 'X'), + (0x10A0C, 'V'), + (0x10A14, 'X'), + (0x10A15, 'V'), + (0x10A18, 'X'), + (0x10A19, 'V'), + (0x10A34, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A48, 'X'), + (0x10A50, 'V'), + (0x10A59, 'X'), + (0x10A60, 'V'), + (0x10AA0, 'X'), + (0x10AC0, 'V'), + (0x10AE7, 'X'), + (0x10AEB, 'V'), + (0x10AF7, 'X'), + (0x10B00, 'V'), + (0x10B36, 'X'), + (0x10B39, 'V'), + (0x10B56, 'X'), + (0x10B58, 'V'), + (0x10B73, 'X'), + (0x10B78, 'V'), + (0x10B92, 'X'), + (0x10B99, 'V'), + (0x10B9D, 'X'), + (0x10BA9, 'V'), + (0x10BB0, 'X'), + (0x10C00, 'V'), + (0x10C49, 'X'), + (0x10C80, 'M', u'𐳀'), + (0x10C81, 'M', u'𐳁'), + (0x10C82, 'M', u'𐳂'), + (0x10C83, 'M', u'𐳃'), + (0x10C84, 'M', u'𐳄'), + (0x10C85, 'M', u'𐳅'), + (0x10C86, 'M', u'𐳆'), + (0x10C87, 'M', u'𐳇'), + (0x10C88, 'M', u'𐳈'), + (0x10C89, 'M', u'𐳉'), + (0x10C8A, 'M', u'𐳊'), + (0x10C8B, 'M', u'𐳋'), + (0x10C8C, 'M', u'𐳌'), + (0x10C8D, 'M', u'𐳍'), + (0x10C8E, 'M', u'𐳎'), + (0x10C8F, 'M', u'𐳏'), + (0x10C90, 'M', u'𐳐'), + (0x10C91, 'M', u'𐳑'), + (0x10C92, 'M', u'𐳒'), + (0x10C93, 'M', u'𐳓'), + (0x10C94, 'M', u'𐳔'), + (0x10C95, 'M', u'𐳕'), + (0x10C96, 'M', u'𐳖'), + (0x10C97, 'M', u'𐳗'), + (0x10C98, 'M', u'𐳘'), + (0x10C99, 'M', u'𐳙'), + (0x10C9A, 'M', u'𐳚'), + (0x10C9B, 'M', u'𐳛'), + (0x10C9C, 'M', u'𐳜'), + (0x10C9D, 'M', u'𐳝'), + ] + +def _seg_55(): + return [ + (0x10C9E, 'M', u'𐳞'), + (0x10C9F, 'M', u'𐳟'), + (0x10CA0, 'M', u'𐳠'), + (0x10CA1, 'M', u'𐳡'), + (0x10CA2, 'M', u'𐳢'), + (0x10CA3, 'M', u'𐳣'), + (0x10CA4, 'M', u'𐳤'), + (0x10CA5, 'M', u'𐳥'), + (0x10CA6, 'M', u'𐳦'), + (0x10CA7, 'M', u'𐳧'), + (0x10CA8, 'M', u'𐳨'), + (0x10CA9, 'M', u'𐳩'), + (0x10CAA, 'M', u'𐳪'), + (0x10CAB, 'M', u'𐳫'), + (0x10CAC, 'M', u'𐳬'), + (0x10CAD, 'M', u'𐳭'), + (0x10CAE, 'M', u'𐳮'), + (0x10CAF, 'M', u'𐳯'), + (0x10CB0, 'M', u'𐳰'), + (0x10CB1, 'M', u'𐳱'), + (0x10CB2, 'M', u'𐳲'), + (0x10CB3, 'X'), + (0x10CC0, 'V'), + (0x10CF3, 'X'), + (0x10CFA, 'V'), + (0x10D00, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), + (0x11070, 'X'), + (0x1107F, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), + (0x110C2, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), + (0x110FA, 'X'), + (0x11100, 'V'), + (0x11135, 'X'), + (0x11136, 'V'), + (0x11144, 'X'), + (0x11150, 'V'), + (0x11177, 'X'), + (0x11180, 'V'), + (0x111CE, 'X'), + (0x111D0, 'V'), + (0x111E0, 'X'), + (0x111E1, 'V'), + (0x111F5, 'X'), + (0x11200, 'V'), + (0x11212, 'X'), + (0x11213, 'V'), + (0x1123F, 'X'), + (0x11280, 'V'), + (0x11287, 'X'), + (0x11288, 'V'), + (0x11289, 'X'), + (0x1128A, 'V'), + (0x1128E, 'X'), + (0x1128F, 'V'), + (0x1129E, 'X'), + (0x1129F, 'V'), + (0x112AA, 'X'), + (0x112B0, 'V'), + (0x112EB, 'X'), + (0x112F0, 'V'), + (0x112FA, 'X'), + (0x11300, 'V'), + (0x11304, 'X'), + (0x11305, 'V'), + (0x1130D, 'X'), + (0x1130F, 'V'), + (0x11311, 'X'), + (0x11313, 'V'), + (0x11329, 'X'), + (0x1132A, 'V'), + (0x11331, 'X'), + (0x11332, 'V'), + (0x11334, 'X'), + (0x11335, 'V'), + (0x1133A, 'X'), + (0x1133C, 'V'), + (0x11345, 'X'), + (0x11347, 'V'), + (0x11349, 'X'), + (0x1134B, 'V'), + (0x1134E, 'X'), + (0x11350, 'V'), + (0x11351, 'X'), + (0x11357, 'V'), + (0x11358, 'X'), + (0x1135D, 'V'), + (0x11364, 'X'), + (0x11366, 'V'), + (0x1136D, 'X'), + (0x11370, 'V'), + (0x11375, 'X'), + ] + +def _seg_56(): + return [ + (0x11400, 'V'), + (0x1145A, 'X'), + (0x1145B, 'V'), + (0x1145C, 'X'), + (0x1145D, 'V'), + (0x1145E, 'X'), + (0x11480, 'V'), + (0x114C8, 'X'), + (0x114D0, 'V'), + (0x114DA, 'X'), + (0x11580, 'V'), + (0x115B6, 'X'), + (0x115B8, 'V'), + (0x115DE, 'X'), + (0x11600, 'V'), + (0x11645, 'X'), + (0x11650, 'V'), + (0x1165A, 'X'), + (0x11660, 'V'), + (0x1166D, 'X'), + (0x11680, 'V'), + (0x116B8, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x11700, 'V'), + (0x1171A, 'X'), + (0x1171D, 'V'), + (0x1172C, 'X'), + (0x11730, 'V'), + (0x11740, 'X'), + (0x118A0, 'M', u'𑣀'), + (0x118A1, 'M', u'𑣁'), + (0x118A2, 'M', u'𑣂'), + (0x118A3, 'M', u'𑣃'), + (0x118A4, 'M', u'𑣄'), + (0x118A5, 'M', u'𑣅'), + (0x118A6, 'M', u'𑣆'), + (0x118A7, 'M', u'𑣇'), + (0x118A8, 'M', u'𑣈'), + (0x118A9, 'M', u'𑣉'), + (0x118AA, 'M', u'𑣊'), + (0x118AB, 'M', u'𑣋'), + (0x118AC, 'M', u'𑣌'), + (0x118AD, 'M', u'𑣍'), + (0x118AE, 'M', u'𑣎'), + (0x118AF, 'M', u'𑣏'), + (0x118B0, 'M', u'𑣐'), + (0x118B1, 'M', u'𑣑'), + (0x118B2, 'M', u'𑣒'), + (0x118B3, 'M', u'𑣓'), + (0x118B4, 'M', u'𑣔'), + (0x118B5, 'M', u'𑣕'), + (0x118B6, 'M', u'𑣖'), + (0x118B7, 'M', u'𑣗'), + (0x118B8, 'M', u'𑣘'), + (0x118B9, 'M', u'𑣙'), + (0x118BA, 'M', u'𑣚'), + (0x118BB, 'M', u'𑣛'), + (0x118BC, 'M', u'𑣜'), + (0x118BD, 'M', u'𑣝'), + (0x118BE, 'M', u'𑣞'), + (0x118BF, 'M', u'𑣟'), + (0x118C0, 'V'), + (0x118F3, 'X'), + (0x118FF, 'V'), + (0x11900, 'X'), + (0x11A00, 'V'), + (0x11A48, 'X'), + (0x11A50, 'V'), + (0x11A84, 'X'), + (0x11A86, 'V'), + (0x11A9D, 'X'), + (0x11A9E, 'V'), + (0x11AA3, 'X'), + (0x11AC0, 'V'), + (0x11AF9, 'X'), + (0x11C00, 'V'), + (0x11C09, 'X'), + (0x11C0A, 'V'), + (0x11C37, 'X'), + (0x11C38, 'V'), + (0x11C46, 'X'), + (0x11C50, 'V'), + (0x11C6D, 'X'), + (0x11C70, 'V'), + (0x11C90, 'X'), + (0x11C92, 'V'), + (0x11CA8, 'X'), + (0x11CA9, 'V'), + (0x11CB7, 'X'), + (0x11D00, 'V'), + (0x11D07, 'X'), + (0x11D08, 'V'), + (0x11D0A, 'X'), + (0x11D0B, 'V'), + (0x11D37, 'X'), + (0x11D3A, 'V'), + (0x11D3B, 'X'), + (0x11D3C, 'V'), + (0x11D3E, 'X'), + ] + +def _seg_57(): + return [ + (0x11D3F, 'V'), + (0x11D48, 'X'), + (0x11D50, 'V'), + (0x11D5A, 'X'), + (0x12000, 'V'), + (0x1239A, 'X'), + (0x12400, 'V'), + (0x1246F, 'X'), + (0x12470, 'V'), + (0x12475, 'X'), + (0x12480, 'V'), + (0x12544, 'X'), + (0x13000, 'V'), + (0x1342F, 'X'), + (0x14400, 'V'), + (0x14647, 'X'), + (0x16800, 'V'), + (0x16A39, 'X'), + (0x16A40, 'V'), + (0x16A5F, 'X'), + (0x16A60, 'V'), + (0x16A6A, 'X'), + (0x16A6E, 'V'), + (0x16A70, 'X'), + (0x16AD0, 'V'), + (0x16AEE, 'X'), + (0x16AF0, 'V'), + (0x16AF6, 'X'), + (0x16B00, 'V'), + (0x16B46, 'X'), + (0x16B50, 'V'), + (0x16B5A, 'X'), + (0x16B5B, 'V'), + (0x16B62, 'X'), + (0x16B63, 'V'), + (0x16B78, 'X'), + (0x16B7D, 'V'), + (0x16B90, 'X'), + (0x16F00, 'V'), + (0x16F45, 'X'), + (0x16F50, 'V'), + (0x16F7F, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x16FE0, 'V'), + (0x16FE2, 'X'), + (0x17000, 'V'), + (0x187ED, 'X'), + (0x18800, 'V'), + (0x18AF3, 'X'), + (0x1B000, 'V'), + (0x1B11F, 'X'), + (0x1B170, 'V'), + (0x1B2FC, 'X'), + (0x1BC00, 'V'), + (0x1BC6B, 'X'), + (0x1BC70, 'V'), + (0x1BC7D, 'X'), + (0x1BC80, 'V'), + (0x1BC89, 'X'), + (0x1BC90, 'V'), + (0x1BC9A, 'X'), + (0x1BC9C, 'V'), + (0x1BCA0, 'I'), + (0x1BCA4, 'X'), + (0x1D000, 'V'), + (0x1D0F6, 'X'), + (0x1D100, 'V'), + (0x1D127, 'X'), + (0x1D129, 'V'), + (0x1D15E, 'M', u'𝅗𝅥'), + (0x1D15F, 'M', u'𝅘𝅥'), + (0x1D160, 'M', u'𝅘𝅥𝅮'), + (0x1D161, 'M', u'𝅘𝅥𝅯'), + (0x1D162, 'M', u'𝅘𝅥𝅰'), + (0x1D163, 'M', u'𝅘𝅥𝅱'), + (0x1D164, 'M', u'𝅘𝅥𝅲'), + (0x1D165, 'V'), + (0x1D173, 'X'), + (0x1D17B, 'V'), + (0x1D1BB, 'M', u'𝆹𝅥'), + (0x1D1BC, 'M', u'𝆺𝅥'), + (0x1D1BD, 'M', u'𝆹𝅥𝅮'), + (0x1D1BE, 'M', u'𝆺𝅥𝅮'), + (0x1D1BF, 'M', u'𝆹𝅥𝅯'), + (0x1D1C0, 'M', u'𝆺𝅥𝅯'), + (0x1D1C1, 'V'), + (0x1D1E9, 'X'), + (0x1D200, 'V'), + (0x1D246, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D372, 'X'), + (0x1D400, 'M', u'a'), + (0x1D401, 'M', u'b'), + (0x1D402, 'M', u'c'), + (0x1D403, 'M', u'd'), + (0x1D404, 'M', u'e'), + (0x1D405, 'M', u'f'), + ] + +def _seg_58(): + return [ + (0x1D406, 'M', u'g'), + (0x1D407, 'M', u'h'), + (0x1D408, 'M', u'i'), + (0x1D409, 'M', u'j'), + (0x1D40A, 'M', u'k'), + (0x1D40B, 'M', u'l'), + (0x1D40C, 'M', u'm'), + (0x1D40D, 'M', u'n'), + (0x1D40E, 'M', u'o'), + (0x1D40F, 'M', u'p'), + (0x1D410, 'M', u'q'), + (0x1D411, 'M', u'r'), + (0x1D412, 'M', u's'), + (0x1D413, 'M', u't'), + (0x1D414, 'M', u'u'), + (0x1D415, 'M', u'v'), + (0x1D416, 'M', u'w'), + (0x1D417, 'M', u'x'), + (0x1D418, 'M', u'y'), + (0x1D419, 'M', u'z'), + (0x1D41A, 'M', u'a'), + (0x1D41B, 'M', u'b'), + (0x1D41C, 'M', u'c'), + (0x1D41D, 'M', u'd'), + (0x1D41E, 'M', u'e'), + (0x1D41F, 'M', u'f'), + (0x1D420, 'M', u'g'), + (0x1D421, 'M', u'h'), + (0x1D422, 'M', u'i'), + (0x1D423, 'M', u'j'), + (0x1D424, 'M', u'k'), + (0x1D425, 'M', u'l'), + (0x1D426, 'M', u'm'), + (0x1D427, 'M', u'n'), + (0x1D428, 'M', u'o'), + (0x1D429, 'M', u'p'), + (0x1D42A, 'M', u'q'), + (0x1D42B, 'M', u'r'), + (0x1D42C, 'M', u's'), + (0x1D42D, 'M', u't'), + (0x1D42E, 'M', u'u'), + (0x1D42F, 'M', u'v'), + (0x1D430, 'M', u'w'), + (0x1D431, 'M', u'x'), + (0x1D432, 'M', u'y'), + (0x1D433, 'M', u'z'), + (0x1D434, 'M', u'a'), + (0x1D435, 'M', u'b'), + (0x1D436, 'M', u'c'), + (0x1D437, 'M', u'd'), + (0x1D438, 'M', u'e'), + (0x1D439, 'M', u'f'), + (0x1D43A, 'M', u'g'), + (0x1D43B, 'M', u'h'), + (0x1D43C, 'M', u'i'), + (0x1D43D, 'M', u'j'), + (0x1D43E, 'M', u'k'), + (0x1D43F, 'M', u'l'), + (0x1D440, 'M', u'm'), + (0x1D441, 'M', u'n'), + (0x1D442, 'M', u'o'), + (0x1D443, 'M', u'p'), + (0x1D444, 'M', u'q'), + (0x1D445, 'M', u'r'), + (0x1D446, 'M', u's'), + (0x1D447, 'M', u't'), + (0x1D448, 'M', u'u'), + (0x1D449, 'M', u'v'), + (0x1D44A, 'M', u'w'), + (0x1D44B, 'M', u'x'), + (0x1D44C, 'M', u'y'), + (0x1D44D, 'M', u'z'), + (0x1D44E, 'M', u'a'), + (0x1D44F, 'M', u'b'), + (0x1D450, 'M', u'c'), + (0x1D451, 'M', u'd'), + (0x1D452, 'M', u'e'), + (0x1D453, 'M', u'f'), + (0x1D454, 'M', u'g'), + (0x1D455, 'X'), + (0x1D456, 'M', u'i'), + (0x1D457, 'M', u'j'), + (0x1D458, 'M', u'k'), + (0x1D459, 'M', u'l'), + (0x1D45A, 'M', u'm'), + (0x1D45B, 'M', u'n'), + (0x1D45C, 'M', u'o'), + (0x1D45D, 'M', u'p'), + (0x1D45E, 'M', u'q'), + (0x1D45F, 'M', u'r'), + (0x1D460, 'M', u's'), + (0x1D461, 'M', u't'), + (0x1D462, 'M', u'u'), + (0x1D463, 'M', u'v'), + (0x1D464, 'M', u'w'), + (0x1D465, 'M', u'x'), + (0x1D466, 'M', u'y'), + (0x1D467, 'M', u'z'), + (0x1D468, 'M', u'a'), + (0x1D469, 'M', u'b'), + ] + +def _seg_59(): + return [ + (0x1D46A, 'M', u'c'), + (0x1D46B, 'M', u'd'), + (0x1D46C, 'M', u'e'), + (0x1D46D, 'M', u'f'), + (0x1D46E, 'M', u'g'), + (0x1D46F, 'M', u'h'), + (0x1D470, 'M', u'i'), + (0x1D471, 'M', u'j'), + (0x1D472, 'M', u'k'), + (0x1D473, 'M', u'l'), + (0x1D474, 'M', u'm'), + (0x1D475, 'M', u'n'), + (0x1D476, 'M', u'o'), + (0x1D477, 'M', u'p'), + (0x1D478, 'M', u'q'), + (0x1D479, 'M', u'r'), + (0x1D47A, 'M', u's'), + (0x1D47B, 'M', u't'), + (0x1D47C, 'M', u'u'), + (0x1D47D, 'M', u'v'), + (0x1D47E, 'M', u'w'), + (0x1D47F, 'M', u'x'), + (0x1D480, 'M', u'y'), + (0x1D481, 'M', u'z'), + (0x1D482, 'M', u'a'), + (0x1D483, 'M', u'b'), + (0x1D484, 'M', u'c'), + (0x1D485, 'M', u'd'), + (0x1D486, 'M', u'e'), + (0x1D487, 'M', u'f'), + (0x1D488, 'M', u'g'), + (0x1D489, 'M', u'h'), + (0x1D48A, 'M', u'i'), + (0x1D48B, 'M', u'j'), + (0x1D48C, 'M', u'k'), + (0x1D48D, 'M', u'l'), + (0x1D48E, 'M', u'm'), + (0x1D48F, 'M', u'n'), + (0x1D490, 'M', u'o'), + (0x1D491, 'M', u'p'), + (0x1D492, 'M', u'q'), + (0x1D493, 'M', u'r'), + (0x1D494, 'M', u's'), + (0x1D495, 'M', u't'), + (0x1D496, 'M', u'u'), + (0x1D497, 'M', u'v'), + (0x1D498, 'M', u'w'), + (0x1D499, 'M', u'x'), + (0x1D49A, 'M', u'y'), + (0x1D49B, 'M', u'z'), + (0x1D49C, 'M', u'a'), + (0x1D49D, 'X'), + (0x1D49E, 'M', u'c'), + (0x1D49F, 'M', u'd'), + (0x1D4A0, 'X'), + (0x1D4A2, 'M', u'g'), + (0x1D4A3, 'X'), + (0x1D4A5, 'M', u'j'), + (0x1D4A6, 'M', u'k'), + (0x1D4A7, 'X'), + (0x1D4A9, 'M', u'n'), + (0x1D4AA, 'M', u'o'), + (0x1D4AB, 'M', u'p'), + (0x1D4AC, 'M', u'q'), + (0x1D4AD, 'X'), + (0x1D4AE, 'M', u's'), + (0x1D4AF, 'M', u't'), + (0x1D4B0, 'M', u'u'), + (0x1D4B1, 'M', u'v'), + (0x1D4B2, 'M', u'w'), + (0x1D4B3, 'M', u'x'), + (0x1D4B4, 'M', u'y'), + (0x1D4B5, 'M', u'z'), + (0x1D4B6, 'M', u'a'), + (0x1D4B7, 'M', u'b'), + (0x1D4B8, 'M', u'c'), + (0x1D4B9, 'M', u'd'), + (0x1D4BA, 'X'), + (0x1D4BB, 'M', u'f'), + (0x1D4BC, 'X'), + (0x1D4BD, 'M', u'h'), + (0x1D4BE, 'M', u'i'), + (0x1D4BF, 'M', u'j'), + (0x1D4C0, 'M', u'k'), + (0x1D4C1, 'M', u'l'), + (0x1D4C2, 'M', u'm'), + (0x1D4C3, 'M', u'n'), + (0x1D4C4, 'X'), + (0x1D4C5, 'M', u'p'), + (0x1D4C6, 'M', u'q'), + (0x1D4C7, 'M', u'r'), + (0x1D4C8, 'M', u's'), + (0x1D4C9, 'M', u't'), + (0x1D4CA, 'M', u'u'), + (0x1D4CB, 'M', u'v'), + (0x1D4CC, 'M', u'w'), + (0x1D4CD, 'M', u'x'), + (0x1D4CE, 'M', u'y'), + (0x1D4CF, 'M', u'z'), + (0x1D4D0, 'M', u'a'), + ] + +def _seg_60(): + return [ + (0x1D4D1, 'M', u'b'), + (0x1D4D2, 'M', u'c'), + (0x1D4D3, 'M', u'd'), + (0x1D4D4, 'M', u'e'), + (0x1D4D5, 'M', u'f'), + (0x1D4D6, 'M', u'g'), + (0x1D4D7, 'M', u'h'), + (0x1D4D8, 'M', u'i'), + (0x1D4D9, 'M', u'j'), + (0x1D4DA, 'M', u'k'), + (0x1D4DB, 'M', u'l'), + (0x1D4DC, 'M', u'm'), + (0x1D4DD, 'M', u'n'), + (0x1D4DE, 'M', u'o'), + (0x1D4DF, 'M', u'p'), + (0x1D4E0, 'M', u'q'), + (0x1D4E1, 'M', u'r'), + (0x1D4E2, 'M', u's'), + (0x1D4E3, 'M', u't'), + (0x1D4E4, 'M', u'u'), + (0x1D4E5, 'M', u'v'), + (0x1D4E6, 'M', u'w'), + (0x1D4E7, 'M', u'x'), + (0x1D4E8, 'M', u'y'), + (0x1D4E9, 'M', u'z'), + (0x1D4EA, 'M', u'a'), + (0x1D4EB, 'M', u'b'), + (0x1D4EC, 'M', u'c'), + (0x1D4ED, 'M', u'd'), + (0x1D4EE, 'M', u'e'), + (0x1D4EF, 'M', u'f'), + (0x1D4F0, 'M', u'g'), + (0x1D4F1, 'M', u'h'), + (0x1D4F2, 'M', u'i'), + (0x1D4F3, 'M', u'j'), + (0x1D4F4, 'M', u'k'), + (0x1D4F5, 'M', u'l'), + (0x1D4F6, 'M', u'm'), + (0x1D4F7, 'M', u'n'), + (0x1D4F8, 'M', u'o'), + (0x1D4F9, 'M', u'p'), + (0x1D4FA, 'M', u'q'), + (0x1D4FB, 'M', u'r'), + (0x1D4FC, 'M', u's'), + (0x1D4FD, 'M', u't'), + (0x1D4FE, 'M', u'u'), + (0x1D4FF, 'M', u'v'), + (0x1D500, 'M', u'w'), + (0x1D501, 'M', u'x'), + (0x1D502, 'M', u'y'), + (0x1D503, 'M', u'z'), + (0x1D504, 'M', u'a'), + (0x1D505, 'M', u'b'), + (0x1D506, 'X'), + (0x1D507, 'M', u'd'), + (0x1D508, 'M', u'e'), + (0x1D509, 'M', u'f'), + (0x1D50A, 'M', u'g'), + (0x1D50B, 'X'), + (0x1D50D, 'M', u'j'), + (0x1D50E, 'M', u'k'), + (0x1D50F, 'M', u'l'), + (0x1D510, 'M', u'm'), + (0x1D511, 'M', u'n'), + (0x1D512, 'M', u'o'), + (0x1D513, 'M', u'p'), + (0x1D514, 'M', u'q'), + (0x1D515, 'X'), + (0x1D516, 'M', u's'), + (0x1D517, 'M', u't'), + (0x1D518, 'M', u'u'), + (0x1D519, 'M', u'v'), + (0x1D51A, 'M', u'w'), + (0x1D51B, 'M', u'x'), + (0x1D51C, 'M', u'y'), + (0x1D51D, 'X'), + (0x1D51E, 'M', u'a'), + (0x1D51F, 'M', u'b'), + (0x1D520, 'M', u'c'), + (0x1D521, 'M', u'd'), + (0x1D522, 'M', u'e'), + (0x1D523, 'M', u'f'), + (0x1D524, 'M', u'g'), + (0x1D525, 'M', u'h'), + (0x1D526, 'M', u'i'), + (0x1D527, 'M', u'j'), + (0x1D528, 'M', u'k'), + (0x1D529, 'M', u'l'), + (0x1D52A, 'M', u'm'), + (0x1D52B, 'M', u'n'), + (0x1D52C, 'M', u'o'), + (0x1D52D, 'M', u'p'), + (0x1D52E, 'M', u'q'), + (0x1D52F, 'M', u'r'), + (0x1D530, 'M', u's'), + (0x1D531, 'M', u't'), + (0x1D532, 'M', u'u'), + (0x1D533, 'M', u'v'), + (0x1D534, 'M', u'w'), + (0x1D535, 'M', u'x'), + ] + +def _seg_61(): + return [ + (0x1D536, 'M', u'y'), + (0x1D537, 'M', u'z'), + (0x1D538, 'M', u'a'), + (0x1D539, 'M', u'b'), + (0x1D53A, 'X'), + (0x1D53B, 'M', u'd'), + (0x1D53C, 'M', u'e'), + (0x1D53D, 'M', u'f'), + (0x1D53E, 'M', u'g'), + (0x1D53F, 'X'), + (0x1D540, 'M', u'i'), + (0x1D541, 'M', u'j'), + (0x1D542, 'M', u'k'), + (0x1D543, 'M', u'l'), + (0x1D544, 'M', u'm'), + (0x1D545, 'X'), + (0x1D546, 'M', u'o'), + (0x1D547, 'X'), + (0x1D54A, 'M', u's'), + (0x1D54B, 'M', u't'), + (0x1D54C, 'M', u'u'), + (0x1D54D, 'M', u'v'), + (0x1D54E, 'M', u'w'), + (0x1D54F, 'M', u'x'), + (0x1D550, 'M', u'y'), + (0x1D551, 'X'), + (0x1D552, 'M', u'a'), + (0x1D553, 'M', u'b'), + (0x1D554, 'M', u'c'), + (0x1D555, 'M', u'd'), + (0x1D556, 'M', u'e'), + (0x1D557, 'M', u'f'), + (0x1D558, 'M', u'g'), + (0x1D559, 'M', u'h'), + (0x1D55A, 'M', u'i'), + (0x1D55B, 'M', u'j'), + (0x1D55C, 'M', u'k'), + (0x1D55D, 'M', u'l'), + (0x1D55E, 'M', u'm'), + (0x1D55F, 'M', u'n'), + (0x1D560, 'M', u'o'), + (0x1D561, 'M', u'p'), + (0x1D562, 'M', u'q'), + (0x1D563, 'M', u'r'), + (0x1D564, 'M', u's'), + (0x1D565, 'M', u't'), + (0x1D566, 'M', u'u'), + (0x1D567, 'M', u'v'), + (0x1D568, 'M', u'w'), + (0x1D569, 'M', u'x'), + (0x1D56A, 'M', u'y'), + (0x1D56B, 'M', u'z'), + (0x1D56C, 'M', u'a'), + (0x1D56D, 'M', u'b'), + (0x1D56E, 'M', u'c'), + (0x1D56F, 'M', u'd'), + (0x1D570, 'M', u'e'), + (0x1D571, 'M', u'f'), + (0x1D572, 'M', u'g'), + (0x1D573, 'M', u'h'), + (0x1D574, 'M', u'i'), + (0x1D575, 'M', u'j'), + (0x1D576, 'M', u'k'), + (0x1D577, 'M', u'l'), + (0x1D578, 'M', u'm'), + (0x1D579, 'M', u'n'), + (0x1D57A, 'M', u'o'), + (0x1D57B, 'M', u'p'), + (0x1D57C, 'M', u'q'), + (0x1D57D, 'M', u'r'), + (0x1D57E, 'M', u's'), + (0x1D57F, 'M', u't'), + (0x1D580, 'M', u'u'), + (0x1D581, 'M', u'v'), + (0x1D582, 'M', u'w'), + (0x1D583, 'M', u'x'), + (0x1D584, 'M', u'y'), + (0x1D585, 'M', u'z'), + (0x1D586, 'M', u'a'), + (0x1D587, 'M', u'b'), + (0x1D588, 'M', u'c'), + (0x1D589, 'M', u'd'), + (0x1D58A, 'M', u'e'), + (0x1D58B, 'M', u'f'), + (0x1D58C, 'M', u'g'), + (0x1D58D, 'M', u'h'), + (0x1D58E, 'M', u'i'), + (0x1D58F, 'M', u'j'), + (0x1D590, 'M', u'k'), + (0x1D591, 'M', u'l'), + (0x1D592, 'M', u'm'), + (0x1D593, 'M', u'n'), + (0x1D594, 'M', u'o'), + (0x1D595, 'M', u'p'), + (0x1D596, 'M', u'q'), + (0x1D597, 'M', u'r'), + (0x1D598, 'M', u's'), + (0x1D599, 'M', u't'), + (0x1D59A, 'M', u'u'), + (0x1D59B, 'M', u'v'), + ] + +def _seg_62(): + return [ + (0x1D59C, 'M', u'w'), + (0x1D59D, 'M', u'x'), + (0x1D59E, 'M', u'y'), + (0x1D59F, 'M', u'z'), + (0x1D5A0, 'M', u'a'), + (0x1D5A1, 'M', u'b'), + (0x1D5A2, 'M', u'c'), + (0x1D5A3, 'M', u'd'), + (0x1D5A4, 'M', u'e'), + (0x1D5A5, 'M', u'f'), + (0x1D5A6, 'M', u'g'), + (0x1D5A7, 'M', u'h'), + (0x1D5A8, 'M', u'i'), + (0x1D5A9, 'M', u'j'), + (0x1D5AA, 'M', u'k'), + (0x1D5AB, 'M', u'l'), + (0x1D5AC, 'M', u'm'), + (0x1D5AD, 'M', u'n'), + (0x1D5AE, 'M', u'o'), + (0x1D5AF, 'M', u'p'), + (0x1D5B0, 'M', u'q'), + (0x1D5B1, 'M', u'r'), + (0x1D5B2, 'M', u's'), + (0x1D5B3, 'M', u't'), + (0x1D5B4, 'M', u'u'), + (0x1D5B5, 'M', u'v'), + (0x1D5B6, 'M', u'w'), + (0x1D5B7, 'M', u'x'), + (0x1D5B8, 'M', u'y'), + (0x1D5B9, 'M', u'z'), + (0x1D5BA, 'M', u'a'), + (0x1D5BB, 'M', u'b'), + (0x1D5BC, 'M', u'c'), + (0x1D5BD, 'M', u'd'), + (0x1D5BE, 'M', u'e'), + (0x1D5BF, 'M', u'f'), + (0x1D5C0, 'M', u'g'), + (0x1D5C1, 'M', u'h'), + (0x1D5C2, 'M', u'i'), + (0x1D5C3, 'M', u'j'), + (0x1D5C4, 'M', u'k'), + (0x1D5C5, 'M', u'l'), + (0x1D5C6, 'M', u'm'), + (0x1D5C7, 'M', u'n'), + (0x1D5C8, 'M', u'o'), + (0x1D5C9, 'M', u'p'), + (0x1D5CA, 'M', u'q'), + (0x1D5CB, 'M', u'r'), + (0x1D5CC, 'M', u's'), + (0x1D5CD, 'M', u't'), + (0x1D5CE, 'M', u'u'), + (0x1D5CF, 'M', u'v'), + (0x1D5D0, 'M', u'w'), + (0x1D5D1, 'M', u'x'), + (0x1D5D2, 'M', u'y'), + (0x1D5D3, 'M', u'z'), + (0x1D5D4, 'M', u'a'), + (0x1D5D5, 'M', u'b'), + (0x1D5D6, 'M', u'c'), + (0x1D5D7, 'M', u'd'), + (0x1D5D8, 'M', u'e'), + (0x1D5D9, 'M', u'f'), + (0x1D5DA, 'M', u'g'), + (0x1D5DB, 'M', u'h'), + (0x1D5DC, 'M', u'i'), + (0x1D5DD, 'M', u'j'), + (0x1D5DE, 'M', u'k'), + (0x1D5DF, 'M', u'l'), + (0x1D5E0, 'M', u'm'), + (0x1D5E1, 'M', u'n'), + (0x1D5E2, 'M', u'o'), + (0x1D5E3, 'M', u'p'), + (0x1D5E4, 'M', u'q'), + (0x1D5E5, 'M', u'r'), + (0x1D5E6, 'M', u's'), + (0x1D5E7, 'M', u't'), + (0x1D5E8, 'M', u'u'), + (0x1D5E9, 'M', u'v'), + (0x1D5EA, 'M', u'w'), + (0x1D5EB, 'M', u'x'), + (0x1D5EC, 'M', u'y'), + (0x1D5ED, 'M', u'z'), + (0x1D5EE, 'M', u'a'), + (0x1D5EF, 'M', u'b'), + (0x1D5F0, 'M', u'c'), + (0x1D5F1, 'M', u'd'), + (0x1D5F2, 'M', u'e'), + (0x1D5F3, 'M', u'f'), + (0x1D5F4, 'M', u'g'), + (0x1D5F5, 'M', u'h'), + (0x1D5F6, 'M', u'i'), + (0x1D5F7, 'M', u'j'), + (0x1D5F8, 'M', u'k'), + (0x1D5F9, 'M', u'l'), + (0x1D5FA, 'M', u'm'), + (0x1D5FB, 'M', u'n'), + (0x1D5FC, 'M', u'o'), + (0x1D5FD, 'M', u'p'), + (0x1D5FE, 'M', u'q'), + (0x1D5FF, 'M', u'r'), + ] + +def _seg_63(): + return [ + (0x1D600, 'M', u's'), + (0x1D601, 'M', u't'), + (0x1D602, 'M', u'u'), + (0x1D603, 'M', u'v'), + (0x1D604, 'M', u'w'), + (0x1D605, 'M', u'x'), + (0x1D606, 'M', u'y'), + (0x1D607, 'M', u'z'), + (0x1D608, 'M', u'a'), + (0x1D609, 'M', u'b'), + (0x1D60A, 'M', u'c'), + (0x1D60B, 'M', u'd'), + (0x1D60C, 'M', u'e'), + (0x1D60D, 'M', u'f'), + (0x1D60E, 'M', u'g'), + (0x1D60F, 'M', u'h'), + (0x1D610, 'M', u'i'), + (0x1D611, 'M', u'j'), + (0x1D612, 'M', u'k'), + (0x1D613, 'M', u'l'), + (0x1D614, 'M', u'm'), + (0x1D615, 'M', u'n'), + (0x1D616, 'M', u'o'), + (0x1D617, 'M', u'p'), + (0x1D618, 'M', u'q'), + (0x1D619, 'M', u'r'), + (0x1D61A, 'M', u's'), + (0x1D61B, 'M', u't'), + (0x1D61C, 'M', u'u'), + (0x1D61D, 'M', u'v'), + (0x1D61E, 'M', u'w'), + (0x1D61F, 'M', u'x'), + (0x1D620, 'M', u'y'), + (0x1D621, 'M', u'z'), + (0x1D622, 'M', u'a'), + (0x1D623, 'M', u'b'), + (0x1D624, 'M', u'c'), + (0x1D625, 'M', u'd'), + (0x1D626, 'M', u'e'), + (0x1D627, 'M', u'f'), + (0x1D628, 'M', u'g'), + (0x1D629, 'M', u'h'), + (0x1D62A, 'M', u'i'), + (0x1D62B, 'M', u'j'), + (0x1D62C, 'M', u'k'), + (0x1D62D, 'M', u'l'), + (0x1D62E, 'M', u'm'), + (0x1D62F, 'M', u'n'), + (0x1D630, 'M', u'o'), + (0x1D631, 'M', u'p'), + (0x1D632, 'M', u'q'), + (0x1D633, 'M', u'r'), + (0x1D634, 'M', u's'), + (0x1D635, 'M', u't'), + (0x1D636, 'M', u'u'), + (0x1D637, 'M', u'v'), + (0x1D638, 'M', u'w'), + (0x1D639, 'M', u'x'), + (0x1D63A, 'M', u'y'), + (0x1D63B, 'M', u'z'), + (0x1D63C, 'M', u'a'), + (0x1D63D, 'M', u'b'), + (0x1D63E, 'M', u'c'), + (0x1D63F, 'M', u'd'), + (0x1D640, 'M', u'e'), + (0x1D641, 'M', u'f'), + (0x1D642, 'M', u'g'), + (0x1D643, 'M', u'h'), + (0x1D644, 'M', u'i'), + (0x1D645, 'M', u'j'), + (0x1D646, 'M', u'k'), + (0x1D647, 'M', u'l'), + (0x1D648, 'M', u'm'), + (0x1D649, 'M', u'n'), + (0x1D64A, 'M', u'o'), + (0x1D64B, 'M', u'p'), + (0x1D64C, 'M', u'q'), + (0x1D64D, 'M', u'r'), + (0x1D64E, 'M', u's'), + (0x1D64F, 'M', u't'), + (0x1D650, 'M', u'u'), + (0x1D651, 'M', u'v'), + (0x1D652, 'M', u'w'), + (0x1D653, 'M', u'x'), + (0x1D654, 'M', u'y'), + (0x1D655, 'M', u'z'), + (0x1D656, 'M', u'a'), + (0x1D657, 'M', u'b'), + (0x1D658, 'M', u'c'), + (0x1D659, 'M', u'd'), + (0x1D65A, 'M', u'e'), + (0x1D65B, 'M', u'f'), + (0x1D65C, 'M', u'g'), + (0x1D65D, 'M', u'h'), + (0x1D65E, 'M', u'i'), + (0x1D65F, 'M', u'j'), + (0x1D660, 'M', u'k'), + (0x1D661, 'M', u'l'), + (0x1D662, 'M', u'm'), + (0x1D663, 'M', u'n'), + ] + +def _seg_64(): + return [ + (0x1D664, 'M', u'o'), + (0x1D665, 'M', u'p'), + (0x1D666, 'M', u'q'), + (0x1D667, 'M', u'r'), + (0x1D668, 'M', u's'), + (0x1D669, 'M', u't'), + (0x1D66A, 'M', u'u'), + (0x1D66B, 'M', u'v'), + (0x1D66C, 'M', u'w'), + (0x1D66D, 'M', u'x'), + (0x1D66E, 'M', u'y'), + (0x1D66F, 'M', u'z'), + (0x1D670, 'M', u'a'), + (0x1D671, 'M', u'b'), + (0x1D672, 'M', u'c'), + (0x1D673, 'M', u'd'), + (0x1D674, 'M', u'e'), + (0x1D675, 'M', u'f'), + (0x1D676, 'M', u'g'), + (0x1D677, 'M', u'h'), + (0x1D678, 'M', u'i'), + (0x1D679, 'M', u'j'), + (0x1D67A, 'M', u'k'), + (0x1D67B, 'M', u'l'), + (0x1D67C, 'M', u'm'), + (0x1D67D, 'M', u'n'), + (0x1D67E, 'M', u'o'), + (0x1D67F, 'M', u'p'), + (0x1D680, 'M', u'q'), + (0x1D681, 'M', u'r'), + (0x1D682, 'M', u's'), + (0x1D683, 'M', u't'), + (0x1D684, 'M', u'u'), + (0x1D685, 'M', u'v'), + (0x1D686, 'M', u'w'), + (0x1D687, 'M', u'x'), + (0x1D688, 'M', u'y'), + (0x1D689, 'M', u'z'), + (0x1D68A, 'M', u'a'), + (0x1D68B, 'M', u'b'), + (0x1D68C, 'M', u'c'), + (0x1D68D, 'M', u'd'), + (0x1D68E, 'M', u'e'), + (0x1D68F, 'M', u'f'), + (0x1D690, 'M', u'g'), + (0x1D691, 'M', u'h'), + (0x1D692, 'M', u'i'), + (0x1D693, 'M', u'j'), + (0x1D694, 'M', u'k'), + (0x1D695, 'M', u'l'), + (0x1D696, 'M', u'm'), + (0x1D697, 'M', u'n'), + (0x1D698, 'M', u'o'), + (0x1D699, 'M', u'p'), + (0x1D69A, 'M', u'q'), + (0x1D69B, 'M', u'r'), + (0x1D69C, 'M', u's'), + (0x1D69D, 'M', u't'), + (0x1D69E, 'M', u'u'), + (0x1D69F, 'M', u'v'), + (0x1D6A0, 'M', u'w'), + (0x1D6A1, 'M', u'x'), + (0x1D6A2, 'M', u'y'), + (0x1D6A3, 'M', u'z'), + (0x1D6A4, 'M', u'ı'), + (0x1D6A5, 'M', u'ȷ'), + (0x1D6A6, 'X'), + (0x1D6A8, 'M', u'α'), + (0x1D6A9, 'M', u'β'), + (0x1D6AA, 'M', u'γ'), + (0x1D6AB, 'M', u'δ'), + (0x1D6AC, 'M', u'ε'), + (0x1D6AD, 'M', u'ζ'), + (0x1D6AE, 'M', u'η'), + (0x1D6AF, 'M', u'θ'), + (0x1D6B0, 'M', u'ι'), + (0x1D6B1, 'M', u'κ'), + (0x1D6B2, 'M', u'λ'), + (0x1D6B3, 'M', u'μ'), + (0x1D6B4, 'M', u'ν'), + (0x1D6B5, 'M', u'ξ'), + (0x1D6B6, 'M', u'ο'), + (0x1D6B7, 'M', u'π'), + (0x1D6B8, 'M', u'ρ'), + (0x1D6B9, 'M', u'θ'), + (0x1D6BA, 'M', u'σ'), + (0x1D6BB, 'M', u'τ'), + (0x1D6BC, 'M', u'υ'), + (0x1D6BD, 'M', u'φ'), + (0x1D6BE, 'M', u'χ'), + (0x1D6BF, 'M', u'ψ'), + (0x1D6C0, 'M', u'ω'), + (0x1D6C1, 'M', u'∇'), + (0x1D6C2, 'M', u'α'), + (0x1D6C3, 'M', u'β'), + (0x1D6C4, 'M', u'γ'), + (0x1D6C5, 'M', u'δ'), + (0x1D6C6, 'M', u'ε'), + (0x1D6C7, 'M', u'ζ'), + (0x1D6C8, 'M', u'η'), + ] + +def _seg_65(): + return [ + (0x1D6C9, 'M', u'θ'), + (0x1D6CA, 'M', u'ι'), + (0x1D6CB, 'M', u'κ'), + (0x1D6CC, 'M', u'λ'), + (0x1D6CD, 'M', u'μ'), + (0x1D6CE, 'M', u'ν'), + (0x1D6CF, 'M', u'ξ'), + (0x1D6D0, 'M', u'ο'), + (0x1D6D1, 'M', u'π'), + (0x1D6D2, 'M', u'ρ'), + (0x1D6D3, 'M', u'σ'), + (0x1D6D5, 'M', u'τ'), + (0x1D6D6, 'M', u'υ'), + (0x1D6D7, 'M', u'φ'), + (0x1D6D8, 'M', u'χ'), + (0x1D6D9, 'M', u'ψ'), + (0x1D6DA, 'M', u'ω'), + (0x1D6DB, 'M', u'∂'), + (0x1D6DC, 'M', u'ε'), + (0x1D6DD, 'M', u'θ'), + (0x1D6DE, 'M', u'κ'), + (0x1D6DF, 'M', u'φ'), + (0x1D6E0, 'M', u'ρ'), + (0x1D6E1, 'M', u'π'), + (0x1D6E2, 'M', u'α'), + (0x1D6E3, 'M', u'β'), + (0x1D6E4, 'M', u'γ'), + (0x1D6E5, 'M', u'δ'), + (0x1D6E6, 'M', u'ε'), + (0x1D6E7, 'M', u'ζ'), + (0x1D6E8, 'M', u'η'), + (0x1D6E9, 'M', u'θ'), + (0x1D6EA, 'M', u'ι'), + (0x1D6EB, 'M', u'κ'), + (0x1D6EC, 'M', u'λ'), + (0x1D6ED, 'M', u'μ'), + (0x1D6EE, 'M', u'ν'), + (0x1D6EF, 'M', u'ξ'), + (0x1D6F0, 'M', u'ο'), + (0x1D6F1, 'M', u'π'), + (0x1D6F2, 'M', u'ρ'), + (0x1D6F3, 'M', u'θ'), + (0x1D6F4, 'M', u'σ'), + (0x1D6F5, 'M', u'τ'), + (0x1D6F6, 'M', u'υ'), + (0x1D6F7, 'M', u'φ'), + (0x1D6F8, 'M', u'χ'), + (0x1D6F9, 'M', u'ψ'), + (0x1D6FA, 'M', u'ω'), + (0x1D6FB, 'M', u'∇'), + (0x1D6FC, 'M', u'α'), + (0x1D6FD, 'M', u'β'), + (0x1D6FE, 'M', u'γ'), + (0x1D6FF, 'M', u'δ'), + (0x1D700, 'M', u'ε'), + (0x1D701, 'M', u'ζ'), + (0x1D702, 'M', u'η'), + (0x1D703, 'M', u'θ'), + (0x1D704, 'M', u'ι'), + (0x1D705, 'M', u'κ'), + (0x1D706, 'M', u'λ'), + (0x1D707, 'M', u'μ'), + (0x1D708, 'M', u'ν'), + (0x1D709, 'M', u'ξ'), + (0x1D70A, 'M', u'ο'), + (0x1D70B, 'M', u'π'), + (0x1D70C, 'M', u'ρ'), + (0x1D70D, 'M', u'σ'), + (0x1D70F, 'M', u'τ'), + (0x1D710, 'M', u'υ'), + (0x1D711, 'M', u'φ'), + (0x1D712, 'M', u'χ'), + (0x1D713, 'M', u'ψ'), + (0x1D714, 'M', u'ω'), + (0x1D715, 'M', u'∂'), + (0x1D716, 'M', u'ε'), + (0x1D717, 'M', u'θ'), + (0x1D718, 'M', u'κ'), + (0x1D719, 'M', u'φ'), + (0x1D71A, 'M', u'ρ'), + (0x1D71B, 'M', u'π'), + (0x1D71C, 'M', u'α'), + (0x1D71D, 'M', u'β'), + (0x1D71E, 'M', u'γ'), + (0x1D71F, 'M', u'δ'), + (0x1D720, 'M', u'ε'), + (0x1D721, 'M', u'ζ'), + (0x1D722, 'M', u'η'), + (0x1D723, 'M', u'θ'), + (0x1D724, 'M', u'ι'), + (0x1D725, 'M', u'κ'), + (0x1D726, 'M', u'λ'), + (0x1D727, 'M', u'μ'), + (0x1D728, 'M', u'ν'), + (0x1D729, 'M', u'ξ'), + (0x1D72A, 'M', u'ο'), + (0x1D72B, 'M', u'π'), + (0x1D72C, 'M', u'ρ'), + (0x1D72D, 'M', u'θ'), + (0x1D72E, 'M', u'σ'), + ] + +def _seg_66(): + return [ + (0x1D72F, 'M', u'τ'), + (0x1D730, 'M', u'υ'), + (0x1D731, 'M', u'φ'), + (0x1D732, 'M', u'χ'), + (0x1D733, 'M', u'ψ'), + (0x1D734, 'M', u'ω'), + (0x1D735, 'M', u'∇'), + (0x1D736, 'M', u'α'), + (0x1D737, 'M', u'β'), + (0x1D738, 'M', u'γ'), + (0x1D739, 'M', u'δ'), + (0x1D73A, 'M', u'ε'), + (0x1D73B, 'M', u'ζ'), + (0x1D73C, 'M', u'η'), + (0x1D73D, 'M', u'θ'), + (0x1D73E, 'M', u'ι'), + (0x1D73F, 'M', u'κ'), + (0x1D740, 'M', u'λ'), + (0x1D741, 'M', u'μ'), + (0x1D742, 'M', u'ν'), + (0x1D743, 'M', u'ξ'), + (0x1D744, 'M', u'ο'), + (0x1D745, 'M', u'π'), + (0x1D746, 'M', u'ρ'), + (0x1D747, 'M', u'σ'), + (0x1D749, 'M', u'τ'), + (0x1D74A, 'M', u'υ'), + (0x1D74B, 'M', u'φ'), + (0x1D74C, 'M', u'χ'), + (0x1D74D, 'M', u'ψ'), + (0x1D74E, 'M', u'ω'), + (0x1D74F, 'M', u'∂'), + (0x1D750, 'M', u'ε'), + (0x1D751, 'M', u'θ'), + (0x1D752, 'M', u'κ'), + (0x1D753, 'M', u'φ'), + (0x1D754, 'M', u'ρ'), + (0x1D755, 'M', u'π'), + (0x1D756, 'M', u'α'), + (0x1D757, 'M', u'β'), + (0x1D758, 'M', u'γ'), + (0x1D759, 'M', u'δ'), + (0x1D75A, 'M', u'ε'), + (0x1D75B, 'M', u'ζ'), + (0x1D75C, 'M', u'η'), + (0x1D75D, 'M', u'θ'), + (0x1D75E, 'M', u'ι'), + (0x1D75F, 'M', u'κ'), + (0x1D760, 'M', u'λ'), + (0x1D761, 'M', u'μ'), + (0x1D762, 'M', u'ν'), + (0x1D763, 'M', u'ξ'), + (0x1D764, 'M', u'ο'), + (0x1D765, 'M', u'π'), + (0x1D766, 'M', u'ρ'), + (0x1D767, 'M', u'θ'), + (0x1D768, 'M', u'σ'), + (0x1D769, 'M', u'τ'), + (0x1D76A, 'M', u'υ'), + (0x1D76B, 'M', u'φ'), + (0x1D76C, 'M', u'χ'), + (0x1D76D, 'M', u'ψ'), + (0x1D76E, 'M', u'ω'), + (0x1D76F, 'M', u'∇'), + (0x1D770, 'M', u'α'), + (0x1D771, 'M', u'β'), + (0x1D772, 'M', u'γ'), + (0x1D773, 'M', u'δ'), + (0x1D774, 'M', u'ε'), + (0x1D775, 'M', u'ζ'), + (0x1D776, 'M', u'η'), + (0x1D777, 'M', u'θ'), + (0x1D778, 'M', u'ι'), + (0x1D779, 'M', u'κ'), + (0x1D77A, 'M', u'λ'), + (0x1D77B, 'M', u'μ'), + (0x1D77C, 'M', u'ν'), + (0x1D77D, 'M', u'ξ'), + (0x1D77E, 'M', u'ο'), + (0x1D77F, 'M', u'π'), + (0x1D780, 'M', u'ρ'), + (0x1D781, 'M', u'σ'), + (0x1D783, 'M', u'τ'), + (0x1D784, 'M', u'υ'), + (0x1D785, 'M', u'φ'), + (0x1D786, 'M', u'χ'), + (0x1D787, 'M', u'ψ'), + (0x1D788, 'M', u'ω'), + (0x1D789, 'M', u'∂'), + (0x1D78A, 'M', u'ε'), + (0x1D78B, 'M', u'θ'), + (0x1D78C, 'M', u'κ'), + (0x1D78D, 'M', u'φ'), + (0x1D78E, 'M', u'ρ'), + (0x1D78F, 'M', u'π'), + (0x1D790, 'M', u'α'), + (0x1D791, 'M', u'β'), + (0x1D792, 'M', u'γ'), + (0x1D793, 'M', u'δ'), + (0x1D794, 'M', u'ε'), + ] + +def _seg_67(): + return [ + (0x1D795, 'M', u'ζ'), + (0x1D796, 'M', u'η'), + (0x1D797, 'M', u'θ'), + (0x1D798, 'M', u'ι'), + (0x1D799, 'M', u'κ'), + (0x1D79A, 'M', u'λ'), + (0x1D79B, 'M', u'μ'), + (0x1D79C, 'M', u'ν'), + (0x1D79D, 'M', u'ξ'), + (0x1D79E, 'M', u'ο'), + (0x1D79F, 'M', u'π'), + (0x1D7A0, 'M', u'ρ'), + (0x1D7A1, 'M', u'θ'), + (0x1D7A2, 'M', u'σ'), + (0x1D7A3, 'M', u'τ'), + (0x1D7A4, 'M', u'υ'), + (0x1D7A5, 'M', u'φ'), + (0x1D7A6, 'M', u'χ'), + (0x1D7A7, 'M', u'ψ'), + (0x1D7A8, 'M', u'ω'), + (0x1D7A9, 'M', u'∇'), + (0x1D7AA, 'M', u'α'), + (0x1D7AB, 'M', u'β'), + (0x1D7AC, 'M', u'γ'), + (0x1D7AD, 'M', u'δ'), + (0x1D7AE, 'M', u'ε'), + (0x1D7AF, 'M', u'ζ'), + (0x1D7B0, 'M', u'η'), + (0x1D7B1, 'M', u'θ'), + (0x1D7B2, 'M', u'ι'), + (0x1D7B3, 'M', u'κ'), + (0x1D7B4, 'M', u'λ'), + (0x1D7B5, 'M', u'μ'), + (0x1D7B6, 'M', u'ν'), + (0x1D7B7, 'M', u'ξ'), + (0x1D7B8, 'M', u'ο'), + (0x1D7B9, 'M', u'π'), + (0x1D7BA, 'M', u'ρ'), + (0x1D7BB, 'M', u'σ'), + (0x1D7BD, 'M', u'τ'), + (0x1D7BE, 'M', u'υ'), + (0x1D7BF, 'M', u'φ'), + (0x1D7C0, 'M', u'χ'), + (0x1D7C1, 'M', u'ψ'), + (0x1D7C2, 'M', u'ω'), + (0x1D7C3, 'M', u'∂'), + (0x1D7C4, 'M', u'ε'), + (0x1D7C5, 'M', u'θ'), + (0x1D7C6, 'M', u'κ'), + (0x1D7C7, 'M', u'φ'), + (0x1D7C8, 'M', u'ρ'), + (0x1D7C9, 'M', u'π'), + (0x1D7CA, 'M', u'ϝ'), + (0x1D7CC, 'X'), + (0x1D7CE, 'M', u'0'), + (0x1D7CF, 'M', u'1'), + (0x1D7D0, 'M', u'2'), + (0x1D7D1, 'M', u'3'), + (0x1D7D2, 'M', u'4'), + (0x1D7D3, 'M', u'5'), + (0x1D7D4, 'M', u'6'), + (0x1D7D5, 'M', u'7'), + (0x1D7D6, 'M', u'8'), + (0x1D7D7, 'M', u'9'), + (0x1D7D8, 'M', u'0'), + (0x1D7D9, 'M', u'1'), + (0x1D7DA, 'M', u'2'), + (0x1D7DB, 'M', u'3'), + (0x1D7DC, 'M', u'4'), + (0x1D7DD, 'M', u'5'), + (0x1D7DE, 'M', u'6'), + (0x1D7DF, 'M', u'7'), + (0x1D7E0, 'M', u'8'), + (0x1D7E1, 'M', u'9'), + (0x1D7E2, 'M', u'0'), + (0x1D7E3, 'M', u'1'), + (0x1D7E4, 'M', u'2'), + (0x1D7E5, 'M', u'3'), + (0x1D7E6, 'M', u'4'), + (0x1D7E7, 'M', u'5'), + (0x1D7E8, 'M', u'6'), + (0x1D7E9, 'M', u'7'), + (0x1D7EA, 'M', u'8'), + (0x1D7EB, 'M', u'9'), + (0x1D7EC, 'M', u'0'), + (0x1D7ED, 'M', u'1'), + (0x1D7EE, 'M', u'2'), + (0x1D7EF, 'M', u'3'), + (0x1D7F0, 'M', u'4'), + (0x1D7F1, 'M', u'5'), + (0x1D7F2, 'M', u'6'), + (0x1D7F3, 'M', u'7'), + (0x1D7F4, 'M', u'8'), + (0x1D7F5, 'M', u'9'), + (0x1D7F6, 'M', u'0'), + (0x1D7F7, 'M', u'1'), + (0x1D7F8, 'M', u'2'), + (0x1D7F9, 'M', u'3'), + (0x1D7FA, 'M', u'4'), + (0x1D7FB, 'M', u'5'), + ] + +def _seg_68(): + return [ + (0x1D7FC, 'M', u'6'), + (0x1D7FD, 'M', u'7'), + (0x1D7FE, 'M', u'8'), + (0x1D7FF, 'M', u'9'), + (0x1D800, 'V'), + (0x1DA8C, 'X'), + (0x1DA9B, 'V'), + (0x1DAA0, 'X'), + (0x1DAA1, 'V'), + (0x1DAB0, 'X'), + (0x1E000, 'V'), + (0x1E007, 'X'), + (0x1E008, 'V'), + (0x1E019, 'X'), + (0x1E01B, 'V'), + (0x1E022, 'X'), + (0x1E023, 'V'), + (0x1E025, 'X'), + (0x1E026, 'V'), + (0x1E02B, 'X'), + (0x1E800, 'V'), + (0x1E8C5, 'X'), + (0x1E8C7, 'V'), + (0x1E8D7, 'X'), + (0x1E900, 'M', u'𞤢'), + (0x1E901, 'M', u'𞤣'), + (0x1E902, 'M', u'𞤤'), + (0x1E903, 'M', u'𞤥'), + (0x1E904, 'M', u'𞤦'), + (0x1E905, 'M', u'𞤧'), + (0x1E906, 'M', u'𞤨'), + (0x1E907, 'M', u'𞤩'), + (0x1E908, 'M', u'𞤪'), + (0x1E909, 'M', u'𞤫'), + (0x1E90A, 'M', u'𞤬'), + (0x1E90B, 'M', u'𞤭'), + (0x1E90C, 'M', u'𞤮'), + (0x1E90D, 'M', u'𞤯'), + (0x1E90E, 'M', u'𞤰'), + (0x1E90F, 'M', u'𞤱'), + (0x1E910, 'M', u'𞤲'), + (0x1E911, 'M', u'𞤳'), + (0x1E912, 'M', u'𞤴'), + (0x1E913, 'M', u'𞤵'), + (0x1E914, 'M', u'𞤶'), + (0x1E915, 'M', u'𞤷'), + (0x1E916, 'M', u'𞤸'), + (0x1E917, 'M', u'𞤹'), + (0x1E918, 'M', u'𞤺'), + (0x1E919, 'M', u'𞤻'), + (0x1E91A, 'M', u'𞤼'), + (0x1E91B, 'M', u'𞤽'), + (0x1E91C, 'M', u'𞤾'), + (0x1E91D, 'M', u'𞤿'), + (0x1E91E, 'M', u'𞥀'), + (0x1E91F, 'M', u'𞥁'), + (0x1E920, 'M', u'𞥂'), + (0x1E921, 'M', u'𞥃'), + (0x1E922, 'V'), + (0x1E94B, 'X'), + (0x1E950, 'V'), + (0x1E95A, 'X'), + (0x1E95E, 'V'), + (0x1E960, 'X'), + (0x1EE00, 'M', u'ا'), + (0x1EE01, 'M', u'ب'), + (0x1EE02, 'M', u'ج'), + (0x1EE03, 'M', u'د'), + (0x1EE04, 'X'), + (0x1EE05, 'M', u'و'), + (0x1EE06, 'M', u'ز'), + (0x1EE07, 'M', u'ح'), + (0x1EE08, 'M', u'ط'), + (0x1EE09, 'M', u'ي'), + (0x1EE0A, 'M', u'ك'), + (0x1EE0B, 'M', u'ل'), + (0x1EE0C, 'M', u'م'), + (0x1EE0D, 'M', u'ن'), + (0x1EE0E, 'M', u'س'), + (0x1EE0F, 'M', u'ع'), + (0x1EE10, 'M', u'ف'), + (0x1EE11, 'M', u'ص'), + (0x1EE12, 'M', u'ق'), + (0x1EE13, 'M', u'ر'), + (0x1EE14, 'M', u'ش'), + (0x1EE15, 'M', u'ت'), + (0x1EE16, 'M', u'ث'), + (0x1EE17, 'M', u'خ'), + (0x1EE18, 'M', u'ذ'), + (0x1EE19, 'M', u'ض'), + (0x1EE1A, 'M', u'ظ'), + (0x1EE1B, 'M', u'غ'), + (0x1EE1C, 'M', u'ٮ'), + (0x1EE1D, 'M', u'ں'), + (0x1EE1E, 'M', u'ڡ'), + (0x1EE1F, 'M', u'ٯ'), + (0x1EE20, 'X'), + (0x1EE21, 'M', u'ب'), + (0x1EE22, 'M', u'ج'), + (0x1EE23, 'X'), + ] + +def _seg_69(): + return [ + (0x1EE24, 'M', u'ه'), + (0x1EE25, 'X'), + (0x1EE27, 'M', u'ح'), + (0x1EE28, 'X'), + (0x1EE29, 'M', u'ي'), + (0x1EE2A, 'M', u'ك'), + (0x1EE2B, 'M', u'ل'), + (0x1EE2C, 'M', u'م'), + (0x1EE2D, 'M', u'ن'), + (0x1EE2E, 'M', u'س'), + (0x1EE2F, 'M', u'ع'), + (0x1EE30, 'M', u'ف'), + (0x1EE31, 'M', u'ص'), + (0x1EE32, 'M', u'ق'), + (0x1EE33, 'X'), + (0x1EE34, 'M', u'ش'), + (0x1EE35, 'M', u'ت'), + (0x1EE36, 'M', u'ث'), + (0x1EE37, 'M', u'خ'), + (0x1EE38, 'X'), + (0x1EE39, 'M', u'ض'), + (0x1EE3A, 'X'), + (0x1EE3B, 'M', u'غ'), + (0x1EE3C, 'X'), + (0x1EE42, 'M', u'ج'), + (0x1EE43, 'X'), + (0x1EE47, 'M', u'ح'), + (0x1EE48, 'X'), + (0x1EE49, 'M', u'ي'), + (0x1EE4A, 'X'), + (0x1EE4B, 'M', u'ل'), + (0x1EE4C, 'X'), + (0x1EE4D, 'M', u'ن'), + (0x1EE4E, 'M', u'س'), + (0x1EE4F, 'M', u'ع'), + (0x1EE50, 'X'), + (0x1EE51, 'M', u'ص'), + (0x1EE52, 'M', u'ق'), + (0x1EE53, 'X'), + (0x1EE54, 'M', u'ش'), + (0x1EE55, 'X'), + (0x1EE57, 'M', u'خ'), + (0x1EE58, 'X'), + (0x1EE59, 'M', u'ض'), + (0x1EE5A, 'X'), + (0x1EE5B, 'M', u'غ'), + (0x1EE5C, 'X'), + (0x1EE5D, 'M', u'ں'), + (0x1EE5E, 'X'), + (0x1EE5F, 'M', u'ٯ'), + (0x1EE60, 'X'), + (0x1EE61, 'M', u'ب'), + (0x1EE62, 'M', u'ج'), + (0x1EE63, 'X'), + (0x1EE64, 'M', u'ه'), + (0x1EE65, 'X'), + (0x1EE67, 'M', u'ح'), + (0x1EE68, 'M', u'ط'), + (0x1EE69, 'M', u'ي'), + (0x1EE6A, 'M', u'ك'), + (0x1EE6B, 'X'), + (0x1EE6C, 'M', u'م'), + (0x1EE6D, 'M', u'ن'), + (0x1EE6E, 'M', u'س'), + (0x1EE6F, 'M', u'ع'), + (0x1EE70, 'M', u'ف'), + (0x1EE71, 'M', u'ص'), + (0x1EE72, 'M', u'ق'), + (0x1EE73, 'X'), + (0x1EE74, 'M', u'ش'), + (0x1EE75, 'M', u'ت'), + (0x1EE76, 'M', u'ث'), + (0x1EE77, 'M', u'خ'), + (0x1EE78, 'X'), + (0x1EE79, 'M', u'ض'), + (0x1EE7A, 'M', u'ظ'), + (0x1EE7B, 'M', u'غ'), + (0x1EE7C, 'M', u'ٮ'), + (0x1EE7D, 'X'), + (0x1EE7E, 'M', u'ڡ'), + (0x1EE7F, 'X'), + (0x1EE80, 'M', u'ا'), + (0x1EE81, 'M', u'ب'), + (0x1EE82, 'M', u'ج'), + (0x1EE83, 'M', u'د'), + (0x1EE84, 'M', u'ه'), + (0x1EE85, 'M', u'و'), + (0x1EE86, 'M', u'ز'), + (0x1EE87, 'M', u'ح'), + (0x1EE88, 'M', u'ط'), + (0x1EE89, 'M', u'ي'), + (0x1EE8A, 'X'), + (0x1EE8B, 'M', u'ل'), + (0x1EE8C, 'M', u'م'), + (0x1EE8D, 'M', u'ن'), + (0x1EE8E, 'M', u'س'), + (0x1EE8F, 'M', u'ع'), + (0x1EE90, 'M', u'ف'), + (0x1EE91, 'M', u'ص'), + (0x1EE92, 'M', u'ق'), + ] + +def _seg_70(): + return [ + (0x1EE93, 'M', u'ر'), + (0x1EE94, 'M', u'ش'), + (0x1EE95, 'M', u'ت'), + (0x1EE96, 'M', u'ث'), + (0x1EE97, 'M', u'خ'), + (0x1EE98, 'M', u'ذ'), + (0x1EE99, 'M', u'ض'), + (0x1EE9A, 'M', u'ظ'), + (0x1EE9B, 'M', u'غ'), + (0x1EE9C, 'X'), + (0x1EEA1, 'M', u'ب'), + (0x1EEA2, 'M', u'ج'), + (0x1EEA3, 'M', u'د'), + (0x1EEA4, 'X'), + (0x1EEA5, 'M', u'و'), + (0x1EEA6, 'M', u'ز'), + (0x1EEA7, 'M', u'ح'), + (0x1EEA8, 'M', u'ط'), + (0x1EEA9, 'M', u'ي'), + (0x1EEAA, 'X'), + (0x1EEAB, 'M', u'ل'), + (0x1EEAC, 'M', u'م'), + (0x1EEAD, 'M', u'ن'), + (0x1EEAE, 'M', u'س'), + (0x1EEAF, 'M', u'ع'), + (0x1EEB0, 'M', u'ف'), + (0x1EEB1, 'M', u'ص'), + (0x1EEB2, 'M', u'ق'), + (0x1EEB3, 'M', u'ر'), + (0x1EEB4, 'M', u'ش'), + (0x1EEB5, 'M', u'ت'), + (0x1EEB6, 'M', u'ث'), + (0x1EEB7, 'M', u'خ'), + (0x1EEB8, 'M', u'ذ'), + (0x1EEB9, 'M', u'ض'), + (0x1EEBA, 'M', u'ظ'), + (0x1EEBB, 'M', u'غ'), + (0x1EEBC, 'X'), + (0x1EEF0, 'V'), + (0x1EEF2, 'X'), + (0x1F000, 'V'), + (0x1F02C, 'X'), + (0x1F030, 'V'), + (0x1F094, 'X'), + (0x1F0A0, 'V'), + (0x1F0AF, 'X'), + (0x1F0B1, 'V'), + (0x1F0C0, 'X'), + (0x1F0C1, 'V'), + (0x1F0D0, 'X'), + (0x1F0D1, 'V'), + (0x1F0F6, 'X'), + (0x1F101, '3', u'0,'), + (0x1F102, '3', u'1,'), + (0x1F103, '3', u'2,'), + (0x1F104, '3', u'3,'), + (0x1F105, '3', u'4,'), + (0x1F106, '3', u'5,'), + (0x1F107, '3', u'6,'), + (0x1F108, '3', u'7,'), + (0x1F109, '3', u'8,'), + (0x1F10A, '3', u'9,'), + (0x1F10B, 'V'), + (0x1F10D, 'X'), + (0x1F110, '3', u'(a)'), + (0x1F111, '3', u'(b)'), + (0x1F112, '3', u'(c)'), + (0x1F113, '3', u'(d)'), + (0x1F114, '3', u'(e)'), + (0x1F115, '3', u'(f)'), + (0x1F116, '3', u'(g)'), + (0x1F117, '3', u'(h)'), + (0x1F118, '3', u'(i)'), + (0x1F119, '3', u'(j)'), + (0x1F11A, '3', u'(k)'), + (0x1F11B, '3', u'(l)'), + (0x1F11C, '3', u'(m)'), + (0x1F11D, '3', u'(n)'), + (0x1F11E, '3', u'(o)'), + (0x1F11F, '3', u'(p)'), + (0x1F120, '3', u'(q)'), + (0x1F121, '3', u'(r)'), + (0x1F122, '3', u'(s)'), + (0x1F123, '3', u'(t)'), + (0x1F124, '3', u'(u)'), + (0x1F125, '3', u'(v)'), + (0x1F126, '3', u'(w)'), + (0x1F127, '3', u'(x)'), + (0x1F128, '3', u'(y)'), + (0x1F129, '3', u'(z)'), + (0x1F12A, 'M', u'〔s〕'), + (0x1F12B, 'M', u'c'), + (0x1F12C, 'M', u'r'), + (0x1F12D, 'M', u'cd'), + (0x1F12E, 'M', u'wz'), + (0x1F12F, 'X'), + (0x1F130, 'M', u'a'), + (0x1F131, 'M', u'b'), + (0x1F132, 'M', u'c'), + (0x1F133, 'M', u'd'), + ] + +def _seg_71(): + return [ + (0x1F134, 'M', u'e'), + (0x1F135, 'M', u'f'), + (0x1F136, 'M', u'g'), + (0x1F137, 'M', u'h'), + (0x1F138, 'M', u'i'), + (0x1F139, 'M', u'j'), + (0x1F13A, 'M', u'k'), + (0x1F13B, 'M', u'l'), + (0x1F13C, 'M', u'm'), + (0x1F13D, 'M', u'n'), + (0x1F13E, 'M', u'o'), + (0x1F13F, 'M', u'p'), + (0x1F140, 'M', u'q'), + (0x1F141, 'M', u'r'), + (0x1F142, 'M', u's'), + (0x1F143, 'M', u't'), + (0x1F144, 'M', u'u'), + (0x1F145, 'M', u'v'), + (0x1F146, 'M', u'w'), + (0x1F147, 'M', u'x'), + (0x1F148, 'M', u'y'), + (0x1F149, 'M', u'z'), + (0x1F14A, 'M', u'hv'), + (0x1F14B, 'M', u'mv'), + (0x1F14C, 'M', u'sd'), + (0x1F14D, 'M', u'ss'), + (0x1F14E, 'M', u'ppv'), + (0x1F14F, 'M', u'wc'), + (0x1F150, 'V'), + (0x1F16A, 'M', u'mc'), + (0x1F16B, 'M', u'md'), + (0x1F16C, 'X'), + (0x1F170, 'V'), + (0x1F190, 'M', u'dj'), + (0x1F191, 'V'), + (0x1F1AD, 'X'), + (0x1F1E6, 'V'), + (0x1F200, 'M', u'ほか'), + (0x1F201, 'M', u'ココ'), + (0x1F202, 'M', u'サ'), + (0x1F203, 'X'), + (0x1F210, 'M', u'手'), + (0x1F211, 'M', u'字'), + (0x1F212, 'M', u'双'), + (0x1F213, 'M', u'デ'), + (0x1F214, 'M', u'二'), + (0x1F215, 'M', u'多'), + (0x1F216, 'M', u'解'), + (0x1F217, 'M', u'天'), + (0x1F218, 'M', u'交'), + (0x1F219, 'M', u'映'), + (0x1F21A, 'M', u'無'), + (0x1F21B, 'M', u'料'), + (0x1F21C, 'M', u'前'), + (0x1F21D, 'M', u'後'), + (0x1F21E, 'M', u'再'), + (0x1F21F, 'M', u'新'), + (0x1F220, 'M', u'初'), + (0x1F221, 'M', u'終'), + (0x1F222, 'M', u'生'), + (0x1F223, 'M', u'販'), + (0x1F224, 'M', u'声'), + (0x1F225, 'M', u'吹'), + (0x1F226, 'M', u'演'), + (0x1F227, 'M', u'投'), + (0x1F228, 'M', u'捕'), + (0x1F229, 'M', u'一'), + (0x1F22A, 'M', u'三'), + (0x1F22B, 'M', u'遊'), + (0x1F22C, 'M', u'左'), + (0x1F22D, 'M', u'中'), + (0x1F22E, 'M', u'右'), + (0x1F22F, 'M', u'指'), + (0x1F230, 'M', u'走'), + (0x1F231, 'M', u'打'), + (0x1F232, 'M', u'禁'), + (0x1F233, 'M', u'空'), + (0x1F234, 'M', u'合'), + (0x1F235, 'M', u'満'), + (0x1F236, 'M', u'有'), + (0x1F237, 'M', u'月'), + (0x1F238, 'M', u'申'), + (0x1F239, 'M', u'割'), + (0x1F23A, 'M', u'営'), + (0x1F23B, 'M', u'配'), + (0x1F23C, 'X'), + (0x1F240, 'M', u'〔本〕'), + (0x1F241, 'M', u'〔三〕'), + (0x1F242, 'M', u'〔二〕'), + (0x1F243, 'M', u'〔安〕'), + (0x1F244, 'M', u'〔点〕'), + (0x1F245, 'M', u'〔打〕'), + (0x1F246, 'M', u'〔盗〕'), + (0x1F247, 'M', u'〔勝〕'), + (0x1F248, 'M', u'〔敗〕'), + (0x1F249, 'X'), + (0x1F250, 'M', u'得'), + (0x1F251, 'M', u'可'), + (0x1F252, 'X'), + (0x1F260, 'V'), + ] + +def _seg_72(): + return [ + (0x1F266, 'X'), + (0x1F300, 'V'), + (0x1F6D5, 'X'), + (0x1F6E0, 'V'), + (0x1F6ED, 'X'), + (0x1F6F0, 'V'), + (0x1F6F9, 'X'), + (0x1F700, 'V'), + (0x1F774, 'X'), + (0x1F780, 'V'), + (0x1F7D5, 'X'), + (0x1F800, 'V'), + (0x1F80C, 'X'), + (0x1F810, 'V'), + (0x1F848, 'X'), + (0x1F850, 'V'), + (0x1F85A, 'X'), + (0x1F860, 'V'), + (0x1F888, 'X'), + (0x1F890, 'V'), + (0x1F8AE, 'X'), + (0x1F900, 'V'), + (0x1F90C, 'X'), + (0x1F910, 'V'), + (0x1F93F, 'X'), + (0x1F940, 'V'), + (0x1F94D, 'X'), + (0x1F950, 'V'), + (0x1F96C, 'X'), + (0x1F980, 'V'), + (0x1F998, 'X'), + (0x1F9C0, 'V'), + (0x1F9C1, 'X'), + (0x1F9D0, 'V'), + (0x1F9E7, 'X'), + (0x20000, 'V'), + (0x2A6D7, 'X'), + (0x2A700, 'V'), + (0x2B735, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2B820, 'V'), + (0x2CEA2, 'X'), + (0x2CEB0, 'V'), + (0x2EBE1, 'X'), + (0x2F800, 'M', u'丽'), + (0x2F801, 'M', u'丸'), + (0x2F802, 'M', u'乁'), + (0x2F803, 'M', u'𠄢'), + (0x2F804, 'M', u'你'), + (0x2F805, 'M', u'侮'), + (0x2F806, 'M', u'侻'), + (0x2F807, 'M', u'倂'), + (0x2F808, 'M', u'偺'), + (0x2F809, 'M', u'備'), + (0x2F80A, 'M', u'僧'), + (0x2F80B, 'M', u'像'), + (0x2F80C, 'M', u'㒞'), + (0x2F80D, 'M', u'𠘺'), + (0x2F80E, 'M', u'免'), + (0x2F80F, 'M', u'兔'), + (0x2F810, 'M', u'兤'), + (0x2F811, 'M', u'具'), + (0x2F812, 'M', u'𠔜'), + (0x2F813, 'M', u'㒹'), + (0x2F814, 'M', u'內'), + (0x2F815, 'M', u'再'), + (0x2F816, 'M', u'𠕋'), + (0x2F817, 'M', u'冗'), + (0x2F818, 'M', u'冤'), + (0x2F819, 'M', u'仌'), + (0x2F81A, 'M', u'冬'), + (0x2F81B, 'M', u'况'), + (0x2F81C, 'M', u'𩇟'), + (0x2F81D, 'M', u'凵'), + (0x2F81E, 'M', u'刃'), + (0x2F81F, 'M', u'㓟'), + (0x2F820, 'M', u'刻'), + (0x2F821, 'M', u'剆'), + (0x2F822, 'M', u'割'), + (0x2F823, 'M', u'剷'), + (0x2F824, 'M', u'㔕'), + (0x2F825, 'M', u'勇'), + (0x2F826, 'M', u'勉'), + (0x2F827, 'M', u'勤'), + (0x2F828, 'M', u'勺'), + (0x2F829, 'M', u'包'), + (0x2F82A, 'M', u'匆'), + (0x2F82B, 'M', u'北'), + (0x2F82C, 'M', u'卉'), + (0x2F82D, 'M', u'卑'), + (0x2F82E, 'M', u'博'), + (0x2F82F, 'M', u'即'), + (0x2F830, 'M', u'卽'), + (0x2F831, 'M', u'卿'), + (0x2F834, 'M', u'𠨬'), + (0x2F835, 'M', u'灰'), + (0x2F836, 'M', u'及'), + (0x2F837, 'M', u'叟'), + (0x2F838, 'M', u'𠭣'), + ] + +def _seg_73(): + return [ + (0x2F839, 'M', u'叫'), + (0x2F83A, 'M', u'叱'), + (0x2F83B, 'M', u'吆'), + (0x2F83C, 'M', u'咞'), + (0x2F83D, 'M', u'吸'), + (0x2F83E, 'M', u'呈'), + (0x2F83F, 'M', u'周'), + (0x2F840, 'M', u'咢'), + (0x2F841, 'M', u'哶'), + (0x2F842, 'M', u'唐'), + (0x2F843, 'M', u'啓'), + (0x2F844, 'M', u'啣'), + (0x2F845, 'M', u'善'), + (0x2F847, 'M', u'喙'), + (0x2F848, 'M', u'喫'), + (0x2F849, 'M', u'喳'), + (0x2F84A, 'M', u'嗂'), + (0x2F84B, 'M', u'圖'), + (0x2F84C, 'M', u'嘆'), + (0x2F84D, 'M', u'圗'), + (0x2F84E, 'M', u'噑'), + (0x2F84F, 'M', u'噴'), + (0x2F850, 'M', u'切'), + (0x2F851, 'M', u'壮'), + (0x2F852, 'M', u'城'), + (0x2F853, 'M', u'埴'), + (0x2F854, 'M', u'堍'), + (0x2F855, 'M', u'型'), + (0x2F856, 'M', u'堲'), + (0x2F857, 'M', u'報'), + (0x2F858, 'M', u'墬'), + (0x2F859, 'M', u'𡓤'), + (0x2F85A, 'M', u'売'), + (0x2F85B, 'M', u'壷'), + (0x2F85C, 'M', u'夆'), + (0x2F85D, 'M', u'多'), + (0x2F85E, 'M', u'夢'), + (0x2F85F, 'M', u'奢'), + (0x2F860, 'M', u'𡚨'), + (0x2F861, 'M', u'𡛪'), + (0x2F862, 'M', u'姬'), + (0x2F863, 'M', u'娛'), + (0x2F864, 'M', u'娧'), + (0x2F865, 'M', u'姘'), + (0x2F866, 'M', u'婦'), + (0x2F867, 'M', u'㛮'), + (0x2F868, 'X'), + (0x2F869, 'M', u'嬈'), + (0x2F86A, 'M', u'嬾'), + (0x2F86C, 'M', u'𡧈'), + (0x2F86D, 'M', u'寃'), + (0x2F86E, 'M', u'寘'), + (0x2F86F, 'M', u'寧'), + (0x2F870, 'M', u'寳'), + (0x2F871, 'M', u'𡬘'), + (0x2F872, 'M', u'寿'), + (0x2F873, 'M', u'将'), + (0x2F874, 'X'), + (0x2F875, 'M', u'尢'), + (0x2F876, 'M', u'㞁'), + (0x2F877, 'M', u'屠'), + (0x2F878, 'M', u'屮'), + (0x2F879, 'M', u'峀'), + (0x2F87A, 'M', u'岍'), + (0x2F87B, 'M', u'𡷤'), + (0x2F87C, 'M', u'嵃'), + (0x2F87D, 'M', u'𡷦'), + (0x2F87E, 'M', u'嵮'), + (0x2F87F, 'M', u'嵫'), + (0x2F880, 'M', u'嵼'), + (0x2F881, 'M', u'巡'), + (0x2F882, 'M', u'巢'), + (0x2F883, 'M', u'㠯'), + (0x2F884, 'M', u'巽'), + (0x2F885, 'M', u'帨'), + (0x2F886, 'M', u'帽'), + (0x2F887, 'M', u'幩'), + (0x2F888, 'M', u'㡢'), + (0x2F889, 'M', u'𢆃'), + (0x2F88A, 'M', u'㡼'), + (0x2F88B, 'M', u'庰'), + (0x2F88C, 'M', u'庳'), + (0x2F88D, 'M', u'庶'), + (0x2F88E, 'M', u'廊'), + (0x2F88F, 'M', u'𪎒'), + (0x2F890, 'M', u'廾'), + (0x2F891, 'M', u'𢌱'), + (0x2F893, 'M', u'舁'), + (0x2F894, 'M', u'弢'), + (0x2F896, 'M', u'㣇'), + (0x2F897, 'M', u'𣊸'), + (0x2F898, 'M', u'𦇚'), + (0x2F899, 'M', u'形'), + (0x2F89A, 'M', u'彫'), + (0x2F89B, 'M', u'㣣'), + (0x2F89C, 'M', u'徚'), + (0x2F89D, 'M', u'忍'), + (0x2F89E, 'M', u'志'), + (0x2F89F, 'M', u'忹'), + (0x2F8A0, 'M', u'悁'), + ] + +def _seg_74(): + return [ + (0x2F8A1, 'M', u'㤺'), + (0x2F8A2, 'M', u'㤜'), + (0x2F8A3, 'M', u'悔'), + (0x2F8A4, 'M', u'𢛔'), + (0x2F8A5, 'M', u'惇'), + (0x2F8A6, 'M', u'慈'), + (0x2F8A7, 'M', u'慌'), + (0x2F8A8, 'M', u'慎'), + (0x2F8A9, 'M', u'慌'), + (0x2F8AA, 'M', u'慺'), + (0x2F8AB, 'M', u'憎'), + (0x2F8AC, 'M', u'憲'), + (0x2F8AD, 'M', u'憤'), + (0x2F8AE, 'M', u'憯'), + (0x2F8AF, 'M', u'懞'), + (0x2F8B0, 'M', u'懲'), + (0x2F8B1, 'M', u'懶'), + (0x2F8B2, 'M', u'成'), + (0x2F8B3, 'M', u'戛'), + (0x2F8B4, 'M', u'扝'), + (0x2F8B5, 'M', u'抱'), + (0x2F8B6, 'M', u'拔'), + (0x2F8B7, 'M', u'捐'), + (0x2F8B8, 'M', u'𢬌'), + (0x2F8B9, 'M', u'挽'), + (0x2F8BA, 'M', u'拼'), + (0x2F8BB, 'M', u'捨'), + (0x2F8BC, 'M', u'掃'), + (0x2F8BD, 'M', u'揤'), + (0x2F8BE, 'M', u'𢯱'), + (0x2F8BF, 'M', u'搢'), + (0x2F8C0, 'M', u'揅'), + (0x2F8C1, 'M', u'掩'), + (0x2F8C2, 'M', u'㨮'), + (0x2F8C3, 'M', u'摩'), + (0x2F8C4, 'M', u'摾'), + (0x2F8C5, 'M', u'撝'), + (0x2F8C6, 'M', u'摷'), + (0x2F8C7, 'M', u'㩬'), + (0x2F8C8, 'M', u'敏'), + (0x2F8C9, 'M', u'敬'), + (0x2F8CA, 'M', u'𣀊'), + (0x2F8CB, 'M', u'旣'), + (0x2F8CC, 'M', u'書'), + (0x2F8CD, 'M', u'晉'), + (0x2F8CE, 'M', u'㬙'), + (0x2F8CF, 'M', u'暑'), + (0x2F8D0, 'M', u'㬈'), + (0x2F8D1, 'M', u'㫤'), + (0x2F8D2, 'M', u'冒'), + (0x2F8D3, 'M', u'冕'), + (0x2F8D4, 'M', u'最'), + (0x2F8D5, 'M', u'暜'), + (0x2F8D6, 'M', u'肭'), + (0x2F8D7, 'M', u'䏙'), + (0x2F8D8, 'M', u'朗'), + (0x2F8D9, 'M', u'望'), + (0x2F8DA, 'M', u'朡'), + (0x2F8DB, 'M', u'杞'), + (0x2F8DC, 'M', u'杓'), + (0x2F8DD, 'M', u'𣏃'), + (0x2F8DE, 'M', u'㭉'), + (0x2F8DF, 'M', u'柺'), + (0x2F8E0, 'M', u'枅'), + (0x2F8E1, 'M', u'桒'), + (0x2F8E2, 'M', u'梅'), + (0x2F8E3, 'M', u'𣑭'), + (0x2F8E4, 'M', u'梎'), + (0x2F8E5, 'M', u'栟'), + (0x2F8E6, 'M', u'椔'), + (0x2F8E7, 'M', u'㮝'), + (0x2F8E8, 'M', u'楂'), + (0x2F8E9, 'M', u'榣'), + (0x2F8EA, 'M', u'槪'), + (0x2F8EB, 'M', u'檨'), + (0x2F8EC, 'M', u'𣚣'), + (0x2F8ED, 'M', u'櫛'), + (0x2F8EE, 'M', u'㰘'), + (0x2F8EF, 'M', u'次'), + (0x2F8F0, 'M', u'𣢧'), + (0x2F8F1, 'M', u'歔'), + (0x2F8F2, 'M', u'㱎'), + (0x2F8F3, 'M', u'歲'), + (0x2F8F4, 'M', u'殟'), + (0x2F8F5, 'M', u'殺'), + (0x2F8F6, 'M', u'殻'), + (0x2F8F7, 'M', u'𣪍'), + (0x2F8F8, 'M', u'𡴋'), + (0x2F8F9, 'M', u'𣫺'), + (0x2F8FA, 'M', u'汎'), + (0x2F8FB, 'M', u'𣲼'), + (0x2F8FC, 'M', u'沿'), + (0x2F8FD, 'M', u'泍'), + (0x2F8FE, 'M', u'汧'), + (0x2F8FF, 'M', u'洖'), + (0x2F900, 'M', u'派'), + (0x2F901, 'M', u'海'), + (0x2F902, 'M', u'流'), + (0x2F903, 'M', u'浩'), + (0x2F904, 'M', u'浸'), + ] + +def _seg_75(): + return [ + (0x2F905, 'M', u'涅'), + (0x2F906, 'M', u'𣴞'), + (0x2F907, 'M', u'洴'), + (0x2F908, 'M', u'港'), + (0x2F909, 'M', u'湮'), + (0x2F90A, 'M', u'㴳'), + (0x2F90B, 'M', u'滋'), + (0x2F90C, 'M', u'滇'), + (0x2F90D, 'M', u'𣻑'), + (0x2F90E, 'M', u'淹'), + (0x2F90F, 'M', u'潮'), + (0x2F910, 'M', u'𣽞'), + (0x2F911, 'M', u'𣾎'), + (0x2F912, 'M', u'濆'), + (0x2F913, 'M', u'瀹'), + (0x2F914, 'M', u'瀞'), + (0x2F915, 'M', u'瀛'), + (0x2F916, 'M', u'㶖'), + (0x2F917, 'M', u'灊'), + (0x2F918, 'M', u'災'), + (0x2F919, 'M', u'灷'), + (0x2F91A, 'M', u'炭'), + (0x2F91B, 'M', u'𠔥'), + (0x2F91C, 'M', u'煅'), + (0x2F91D, 'M', u'𤉣'), + (0x2F91E, 'M', u'熜'), + (0x2F91F, 'X'), + (0x2F920, 'M', u'爨'), + (0x2F921, 'M', u'爵'), + (0x2F922, 'M', u'牐'), + (0x2F923, 'M', u'𤘈'), + (0x2F924, 'M', u'犀'), + (0x2F925, 'M', u'犕'), + (0x2F926, 'M', u'𤜵'), + (0x2F927, 'M', u'𤠔'), + (0x2F928, 'M', u'獺'), + (0x2F929, 'M', u'王'), + (0x2F92A, 'M', u'㺬'), + (0x2F92B, 'M', u'玥'), + (0x2F92C, 'M', u'㺸'), + (0x2F92E, 'M', u'瑇'), + (0x2F92F, 'M', u'瑜'), + (0x2F930, 'M', u'瑱'), + (0x2F931, 'M', u'璅'), + (0x2F932, 'M', u'瓊'), + (0x2F933, 'M', u'㼛'), + (0x2F934, 'M', u'甤'), + (0x2F935, 'M', u'𤰶'), + (0x2F936, 'M', u'甾'), + (0x2F937, 'M', u'𤲒'), + (0x2F938, 'M', u'異'), + (0x2F939, 'M', u'𢆟'), + (0x2F93A, 'M', u'瘐'), + (0x2F93B, 'M', u'𤾡'), + (0x2F93C, 'M', u'𤾸'), + (0x2F93D, 'M', u'𥁄'), + (0x2F93E, 'M', u'㿼'), + (0x2F93F, 'M', u'䀈'), + (0x2F940, 'M', u'直'), + (0x2F941, 'M', u'𥃳'), + (0x2F942, 'M', u'𥃲'), + (0x2F943, 'M', u'𥄙'), + (0x2F944, 'M', u'𥄳'), + (0x2F945, 'M', u'眞'), + (0x2F946, 'M', u'真'), + (0x2F948, 'M', u'睊'), + (0x2F949, 'M', u'䀹'), + (0x2F94A, 'M', u'瞋'), + (0x2F94B, 'M', u'䁆'), + (0x2F94C, 'M', u'䂖'), + (0x2F94D, 'M', u'𥐝'), + (0x2F94E, 'M', u'硎'), + (0x2F94F, 'M', u'碌'), + (0x2F950, 'M', u'磌'), + (0x2F951, 'M', u'䃣'), + (0x2F952, 'M', u'𥘦'), + (0x2F953, 'M', u'祖'), + (0x2F954, 'M', u'𥚚'), + (0x2F955, 'M', u'𥛅'), + (0x2F956, 'M', u'福'), + (0x2F957, 'M', u'秫'), + (0x2F958, 'M', u'䄯'), + (0x2F959, 'M', u'穀'), + (0x2F95A, 'M', u'穊'), + (0x2F95B, 'M', u'穏'), + (0x2F95C, 'M', u'𥥼'), + (0x2F95D, 'M', u'𥪧'), + (0x2F95F, 'X'), + (0x2F960, 'M', u'䈂'), + (0x2F961, 'M', u'𥮫'), + (0x2F962, 'M', u'篆'), + (0x2F963, 'M', u'築'), + (0x2F964, 'M', u'䈧'), + (0x2F965, 'M', u'𥲀'), + (0x2F966, 'M', u'糒'), + (0x2F967, 'M', u'䊠'), + (0x2F968, 'M', u'糨'), + (0x2F969, 'M', u'糣'), + (0x2F96A, 'M', u'紀'), + (0x2F96B, 'M', u'𥾆'), + ] + +def _seg_76(): + return [ + (0x2F96C, 'M', u'絣'), + (0x2F96D, 'M', u'䌁'), + (0x2F96E, 'M', u'緇'), + (0x2F96F, 'M', u'縂'), + (0x2F970, 'M', u'繅'), + (0x2F971, 'M', u'䌴'), + (0x2F972, 'M', u'𦈨'), + (0x2F973, 'M', u'𦉇'), + (0x2F974, 'M', u'䍙'), + (0x2F975, 'M', u'𦋙'), + (0x2F976, 'M', u'罺'), + (0x2F977, 'M', u'𦌾'), + (0x2F978, 'M', u'羕'), + (0x2F979, 'M', u'翺'), + (0x2F97A, 'M', u'者'), + (0x2F97B, 'M', u'𦓚'), + (0x2F97C, 'M', u'𦔣'), + (0x2F97D, 'M', u'聠'), + (0x2F97E, 'M', u'𦖨'), + (0x2F97F, 'M', u'聰'), + (0x2F980, 'M', u'𣍟'), + (0x2F981, 'M', u'䏕'), + (0x2F982, 'M', u'育'), + (0x2F983, 'M', u'脃'), + (0x2F984, 'M', u'䐋'), + (0x2F985, 'M', u'脾'), + (0x2F986, 'M', u'媵'), + (0x2F987, 'M', u'𦞧'), + (0x2F988, 'M', u'𦞵'), + (0x2F989, 'M', u'𣎓'), + (0x2F98A, 'M', u'𣎜'), + (0x2F98B, 'M', u'舁'), + (0x2F98C, 'M', u'舄'), + (0x2F98D, 'M', u'辞'), + (0x2F98E, 'M', u'䑫'), + (0x2F98F, 'M', u'芑'), + (0x2F990, 'M', u'芋'), + (0x2F991, 'M', u'芝'), + (0x2F992, 'M', u'劳'), + (0x2F993, 'M', u'花'), + (0x2F994, 'M', u'芳'), + (0x2F995, 'M', u'芽'), + (0x2F996, 'M', u'苦'), + (0x2F997, 'M', u'𦬼'), + (0x2F998, 'M', u'若'), + (0x2F999, 'M', u'茝'), + (0x2F99A, 'M', u'荣'), + (0x2F99B, 'M', u'莭'), + (0x2F99C, 'M', u'茣'), + (0x2F99D, 'M', u'莽'), + (0x2F99E, 'M', u'菧'), + (0x2F99F, 'M', u'著'), + (0x2F9A0, 'M', u'荓'), + (0x2F9A1, 'M', u'菊'), + (0x2F9A2, 'M', u'菌'), + (0x2F9A3, 'M', u'菜'), + (0x2F9A4, 'M', u'𦰶'), + (0x2F9A5, 'M', u'𦵫'), + (0x2F9A6, 'M', u'𦳕'), + (0x2F9A7, 'M', u'䔫'), + (0x2F9A8, 'M', u'蓱'), + (0x2F9A9, 'M', u'蓳'), + (0x2F9AA, 'M', u'蔖'), + (0x2F9AB, 'M', u'𧏊'), + (0x2F9AC, 'M', u'蕤'), + (0x2F9AD, 'M', u'𦼬'), + (0x2F9AE, 'M', u'䕝'), + (0x2F9AF, 'M', u'䕡'), + (0x2F9B0, 'M', u'𦾱'), + (0x2F9B1, 'M', u'𧃒'), + (0x2F9B2, 'M', u'䕫'), + (0x2F9B3, 'M', u'虐'), + (0x2F9B4, 'M', u'虜'), + (0x2F9B5, 'M', u'虧'), + (0x2F9B6, 'M', u'虩'), + (0x2F9B7, 'M', u'蚩'), + (0x2F9B8, 'M', u'蚈'), + (0x2F9B9, 'M', u'蜎'), + (0x2F9BA, 'M', u'蛢'), + (0x2F9BB, 'M', u'蝹'), + (0x2F9BC, 'M', u'蜨'), + (0x2F9BD, 'M', u'蝫'), + (0x2F9BE, 'M', u'螆'), + (0x2F9BF, 'X'), + (0x2F9C0, 'M', u'蟡'), + (0x2F9C1, 'M', u'蠁'), + (0x2F9C2, 'M', u'䗹'), + (0x2F9C3, 'M', u'衠'), + (0x2F9C4, 'M', u'衣'), + (0x2F9C5, 'M', u'𧙧'), + (0x2F9C6, 'M', u'裗'), + (0x2F9C7, 'M', u'裞'), + (0x2F9C8, 'M', u'䘵'), + (0x2F9C9, 'M', u'裺'), + (0x2F9CA, 'M', u'㒻'), + (0x2F9CB, 'M', u'𧢮'), + (0x2F9CC, 'M', u'𧥦'), + (0x2F9CD, 'M', u'䚾'), + (0x2F9CE, 'M', u'䛇'), + (0x2F9CF, 'M', u'誠'), + ] + +def _seg_77(): + return [ + (0x2F9D0, 'M', u'諭'), + (0x2F9D1, 'M', u'變'), + (0x2F9D2, 'M', u'豕'), + (0x2F9D3, 'M', u'𧲨'), + (0x2F9D4, 'M', u'貫'), + (0x2F9D5, 'M', u'賁'), + (0x2F9D6, 'M', u'贛'), + (0x2F9D7, 'M', u'起'), + (0x2F9D8, 'M', u'𧼯'), + (0x2F9D9, 'M', u'𠠄'), + (0x2F9DA, 'M', u'跋'), + (0x2F9DB, 'M', u'趼'), + (0x2F9DC, 'M', u'跰'), + (0x2F9DD, 'M', u'𠣞'), + (0x2F9DE, 'M', u'軔'), + (0x2F9DF, 'M', u'輸'), + (0x2F9E0, 'M', u'𨗒'), + (0x2F9E1, 'M', u'𨗭'), + (0x2F9E2, 'M', u'邔'), + (0x2F9E3, 'M', u'郱'), + (0x2F9E4, 'M', u'鄑'), + (0x2F9E5, 'M', u'𨜮'), + (0x2F9E6, 'M', u'鄛'), + (0x2F9E7, 'M', u'鈸'), + (0x2F9E8, 'M', u'鋗'), + (0x2F9E9, 'M', u'鋘'), + (0x2F9EA, 'M', u'鉼'), + (0x2F9EB, 'M', u'鏹'), + (0x2F9EC, 'M', u'鐕'), + (0x2F9ED, 'M', u'𨯺'), + (0x2F9EE, 'M', u'開'), + (0x2F9EF, 'M', u'䦕'), + (0x2F9F0, 'M', u'閷'), + (0x2F9F1, 'M', u'𨵷'), + (0x2F9F2, 'M', u'䧦'), + (0x2F9F3, 'M', u'雃'), + (0x2F9F4, 'M', u'嶲'), + (0x2F9F5, 'M', u'霣'), + (0x2F9F6, 'M', u'𩅅'), + (0x2F9F7, 'M', u'𩈚'), + (0x2F9F8, 'M', u'䩮'), + (0x2F9F9, 'M', u'䩶'), + (0x2F9FA, 'M', u'韠'), + (0x2F9FB, 'M', u'𩐊'), + (0x2F9FC, 'M', u'䪲'), + (0x2F9FD, 'M', u'𩒖'), + (0x2F9FE, 'M', u'頋'), + (0x2FA00, 'M', u'頩'), + (0x2FA01, 'M', u'𩖶'), + (0x2FA02, 'M', u'飢'), + (0x2FA03, 'M', u'䬳'), + (0x2FA04, 'M', u'餩'), + (0x2FA05, 'M', u'馧'), + (0x2FA06, 'M', u'駂'), + (0x2FA07, 'M', u'駾'), + (0x2FA08, 'M', u'䯎'), + (0x2FA09, 'M', u'𩬰'), + (0x2FA0A, 'M', u'鬒'), + (0x2FA0B, 'M', u'鱀'), + (0x2FA0C, 'M', u'鳽'), + (0x2FA0D, 'M', u'䳎'), + (0x2FA0E, 'M', u'䳭'), + (0x2FA0F, 'M', u'鵧'), + (0x2FA10, 'M', u'𪃎'), + (0x2FA11, 'M', u'䳸'), + (0x2FA12, 'M', u'𪄅'), + (0x2FA13, 'M', u'𪈎'), + (0x2FA14, 'M', u'𪊑'), + (0x2FA15, 'M', u'麻'), + (0x2FA16, 'M', u'䵖'), + (0x2FA17, 'M', u'黹'), + (0x2FA18, 'M', u'黾'), + (0x2FA19, 'M', u'鼅'), + (0x2FA1A, 'M', u'鼏'), + (0x2FA1B, 'M', u'鼖'), + (0x2FA1C, 'M', u'鼻'), + (0x2FA1D, 'M', u'𪘀'), + (0x2FA1E, 'X'), + (0xE0100, 'I'), + (0xE01F0, 'X'), + ] + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() +) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index f82c3b9d6..5b6b308af 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -9,7 +9,7 @@ import dns.resolver from requests import Session, exceptions -from requests.packages.urllib3.util import connection +from urllib3.util import connection from retry.api import retry_call from exceptions import APIThrottled diff --git a/Licenses/idna/LICENSE.rst b/Licenses/idna/LICENSE.rst new file mode 100644 index 000000000..3ee64fba2 --- /dev/null +++ b/Licenses/idna/LICENSE.rst @@ -0,0 +1,80 @@ +License +------- + +Copyright (c) 2013-2018, Kim Davies. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +#. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +#. Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided with + the distribution. + +#. Neither the name of the copyright holder nor the names of the + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +#. THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS "AS IS" AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE. + +Portions of the codec implementation and unit tests are derived from the +Python standard library, which carries the `Python Software Foundation +License `_: + + Copyright (c) 2001-2014 Python Software Foundation; All Rights Reserved + +Portions of the unit tests are derived from the Unicode standard, which +is subject to the Unicode, Inc. License Agreement: + + Copyright (c) 1991-2014 Unicode, Inc. All rights reserved. + Distributed under the Terms of Use in + . + + Permission is hereby granted, free of charge, to any person obtaining + a copy of the Unicode data files and any associated documentation + (the "Data Files") or Unicode software and any associated documentation + (the "Software") to deal in the Data Files or Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, and/or sell copies of + the Data Files or Software, and to permit persons to whom the Data Files + or Software are furnished to do so, provided that + + (a) this copyright and permission notice appear with all copies + of the Data Files or Software, + + (b) this copyright and permission notice appear in associated + documentation, and + + (c) there is clear notice in each modified Data File or in the Software + as well as in the documentation associated with the Data File(s) or + Software that the data or software has been modified. + + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF + ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS + NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL + DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THE DATA FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in these Data Files or Software without prior + written authorization of the copyright holder. From 5a48886bccbb1e9e659e690969e92f455a583e13 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 30 Oct 2018 17:16:52 +0100 Subject: [PATCH 283/710] bump dev --- Contents/Info.plist | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index df5fdf226..6e9b0ddf9 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2806 + 2.6.1.2818 PlexFrameworkVersion 2 PlexPluginClass @@ -21,7 +21,7 @@ PlexPluginMode Daemon PlexPluginConsoleLogging - 1 + 0 PlexPluginDevMode 1 PlexPluginCodePolicy @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2806 DEV +Version 2.6.1.2818 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From aaa1eb95edb296590ad3c5f9faddcbab7834cbdd Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 30 Oct 2018 17:28:03 +0100 Subject: [PATCH 284/710] submod: common: better fix for music symbols --- Contents/Libraries/Shared/subzero/modification/mods/common.py | 2 +- Contents/Libraries/Shared/test.srt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 4793914a0..697f98326 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -37,7 +37,7 @@ class CommonFixes(SubtitleTextModification): NReProcessor(re.compile(r'(?u)(\s{2,})'), " ", name="CM_multi_space"), # fix music symbols - NReProcessor(re.compile(ur'(?u)(^[*#¶\s]*[*#¶]+[*#¶\s]*$)'), u"♪", name="CM_music_symbols"), + NReProcessor(re.compile(ur'(?u)(?:^[-\s]*[*#¶]+)|(?:[*#¶]+\s*$)'), u"♪", name="CM_music_symbols"), # '' = " NReProcessor(re.compile(ur'(?u)([\'’ʼ❜‘‛][\'’ʼ❜‘‛]+)'), u'"', name="CM_double_apostrophe"), diff --git a/Contents/Libraries/Shared/test.srt b/Contents/Libraries/Shared/test.srt index 37aed6972..9e97d3d5b 100644 --- a/Contents/Libraries/Shared/test.srt +++ b/Contents/Libraries/Shared/test.srt @@ -18,6 +18,7 @@ I can't keep running. L can't! 00:00:12,679 --> 00:00:16,097 i don't know. Some kind of wrong "1 00" number--- of signal, drawing the Tardis off.... course. +# I'm singing in the rain 4 00:00:16,099 --> 00:00:17,224 @@ -25,6 +26,7 @@ this is a"subtitle" test "with a"text before colons Mah numbar is wrong: 1 91 7 : : Peter is funny! +¶ You're singing in the rain # 5 00:00:17,225 --> 00:00:19,684 @@ -32,6 +34,7 @@ Mah numbar is wrong: 1 91 7 MUSIC PLAYS What is that sound?! ls it , and a punctuation issue ? lol take them balls it. L like turtles !! ! this, . is bad . +All singing in the rain # 6 00:00:19,686 --> 00:00:21,103 From ea9b0cb827ebb43100e8a0adec5d6c62bedae505 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 30 Oct 2018 22:08:38 +0100 Subject: [PATCH 285/710] submod: common: less destroying fix for music symbols --- Contents/Libraries/Shared/subzero/modification/mods/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 697f98326..1a6985ce1 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -37,7 +37,7 @@ class CommonFixes(SubtitleTextModification): NReProcessor(re.compile(r'(?u)(\s{2,})'), " ", name="CM_multi_space"), # fix music symbols - NReProcessor(re.compile(ur'(?u)(?:^[-\s]*[*#¶]+)|(?:[*#¶]+\s*$)'), u"♪", name="CM_music_symbols"), + NReProcessor(re.compile(ur'(?u)(?:^[-\s]*[*#¶]+(?![^\s-]))|(?:[*#¶]+\s*$)'), u"♪", name="CM_music_symbols"), # '' = " NReProcessor(re.compile(ur'(?u)([\'’ʼ❜‘‛][\'’ʼ❜‘‛]+)'), u'"', name="CM_double_apostrophe"), From e650089e8cfc964bd276ca888ede39a59c2db73b Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 30 Oct 2018 22:09:50 +0100 Subject: [PATCH 286/710] submod: common: even less destroying fix for music symbols --- Contents/Libraries/Shared/subzero/modification/mods/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 1a6985ce1..d824e3579 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -37,7 +37,7 @@ class CommonFixes(SubtitleTextModification): NReProcessor(re.compile(r'(?u)(\s{2,})'), " ", name="CM_multi_space"), # fix music symbols - NReProcessor(re.compile(ur'(?u)(?:^[-\s]*[*#¶]+(?![^\s-]))|(?:[*#¶]+\s*$)'), u"♪", name="CM_music_symbols"), + NReProcessor(re.compile(ur'(?u)(?:^[-\s]*[*#¶]+(?![^\s-*#¶]))|(?:[*#¶]+\s*$)'), u"♪", name="CM_music_symbols"), # '' = " NReProcessor(re.compile(ur'(?u)([\'’ʼ❜‘‛][\'’ʼ❜‘‛]+)'), u'"', name="CM_double_apostrophe"), From b5d9773704265322bb907d194c89f8b46cb6868d Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 31 Oct 2018 01:24:52 +0100 Subject: [PATCH 287/710] submod: common: music symbols: fix bad character range --- Contents/Libraries/Shared/subzero/modification/mods/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index d824e3579..896a1f2f8 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -37,7 +37,7 @@ class CommonFixes(SubtitleTextModification): NReProcessor(re.compile(r'(?u)(\s{2,})'), " ", name="CM_multi_space"), # fix music symbols - NReProcessor(re.compile(ur'(?u)(?:^[-\s]*[*#¶]+(?![^\s-*#¶]))|(?:[*#¶]+\s*$)'), u"♪", name="CM_music_symbols"), + NReProcessor(re.compile(ur'(?u)(?:^[-\s]*[*#¶]+(?![^\s\-*#¶]))|(?:[*#¶]+\s*$)'), u"♪", name="CM_music_symbols"), # '' = " NReProcessor(re.compile(ur'(?u)([\'’ʼ❜‘‛][\'’ʼ❜‘‛]+)'), u'"', name="CM_double_apostrophe"), From 29a4bb42f43666103aad23333a5cbf430b1333e9 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 6 Nov 2018 13:16:40 +0100 Subject: [PATCH 288/710] core: clean up update_local_media --- Contents/Code/__init__.py | 38 ++++++++++---------------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index aa75a18cd..ba6c911d2 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -94,27 +94,9 @@ def Start(): track_usage("General", "plugin", "start", config.version) -def update_local_media(metadata, media, media_type="movies", ignore_parts_cleanup=None): - # Look for subtitles - if media_type == "movies": - for item in media.items: - for part in item.parts: - support.localmedia.find_subtitles(part, ignore_parts_cleanup=ignore_parts_cleanup) - return - - # Look for subtitles for each episode. - for s in media.seasons: - # If we've got a date based season, ignore it for now, otherwise it'll collide with S/E folders/XML and PMS - # prefers date-based (why?) - if int(s) < 1900 or metadata.guid.startswith(PERSONAL_MEDIA_IDENTIFIER): - for e in media.seasons[s].episodes: - for i in media.seasons[s].episodes[e].items: - - # Look for subtitles. - for part in i.parts: - support.localmedia.find_subtitles(part, ignore_parts_cleanup=ignore_parts_cleanup) - else: - pass +def update_local_media(videos, ignore_parts_cleanup=None): + for video in videos: + support.localmedia.find_subtitles(video["plex_part"], ignore_parts_cleanup=ignore_parts_cleanup) def agent_extract_embedded(video_part_map, history_storage=None): @@ -197,22 +179,22 @@ def update(self, metadata, media, lang): item_ids = [] try: config.init_subliminal_patches() - videos = media_to_videos(media, kind=self.agent_type) + all_videos = media_to_videos(media, kind=self.agent_type) # media ignored? - use_any_parts = False ignore_parts_cleanup = [] - for video in videos: + videos = [] + for video in all_videos: if not is_wanted(video["id"], item=video["item"]): Log.Debug(u'Skipping "%s"' % video["filename"]) ignore_parts_cleanup.append(video["path"]) continue - use_any_parts = True + videos.append(video) # find local media - update_local_media(metadata, media, media_type=self.agent_type, ignore_parts_cleanup=ignore_parts_cleanup) + update_local_media(videos, ignore_parts_cleanup=ignore_parts_cleanup) - if not use_any_parts: + if not videos: Log.Debug(u"Nothing to do.") return @@ -301,7 +283,7 @@ def update(self, metadata, media, lang): # store SZ meta info even if we've downloaded none self.store_blank_subtitle_metadata(scanned_video_part_map) - update_local_media(metadata, media, media_type=self.agent_type) + update_local_media(videos) finally: # update the menu state From 3d4a166b2c789c31ac79c4663ad5509cc8061ae4 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 6 Nov 2018 14:09:31 +0100 Subject: [PATCH 289/710] core: still find locally available subtitles for ignored media --- Contents/Code/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index ba6c911d2..cb58b6d6f 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -192,7 +192,7 @@ def update(self, metadata, media, lang): videos.append(video) # find local media - update_local_media(videos, ignore_parts_cleanup=ignore_parts_cleanup) + update_local_media(all_videos, ignore_parts_cleanup=ignore_parts_cleanup) if not videos: Log.Debug(u"Nothing to do.") From e7981c2e59dfea6825f245434bb9b7cd3ac53229 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 6 Nov 2018 14:51:39 +0100 Subject: [PATCH 290/710] core: auto extract: don't overwrite local sub even if unknown to SZ --- Contents/Code/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index cb58b6d6f..29f22edb3 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -119,7 +119,9 @@ def agent_extract_embedded(video_part_map, history_storage=None): item_count = item_count + 1 for requested_language in config.lang_list: embedded_subs = stored_subs.get_by_provider(plexapi_part.id, requested_language, "embedded") - current = stored_subs.get_any(plexapi_part.id, requested_language) + current = stored_subs.get_any(plexapi_part.id, requested_language) or \ + requested_language in scanned_video.subtitle_languages + if not embedded_subs: stream_data = get_embedded_subtitle_streams(plexapi_part, requested_language=requested_language) From 878cdb31fdd10adb3c251cd348184f7e817c416d Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 6 Nov 2018 14:53:47 +0100 Subject: [PATCH 291/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 6e9b0ddf9..ce018e0da 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.1.2818 + 2.6.1.2826 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2818 DEV +Version 2.6.1.2826 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 6423a7f89de01ac4a6d32a2edb6065cb2451bc64 Mon Sep 17 00:00:00 2001 From: pannal Date: Wed, 7 Nov 2018 13:53:25 +0100 Subject: [PATCH 292/710] Update da.json (POEditor.com) --- Contents/Strings/da.json | 48 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/Contents/Strings/da.json b/Contents/Strings/da.json index 24cf12cf4..ad6fbcb40 100644 --- a/Contents/Strings/da.json +++ b/Contents/Strings/da.json @@ -97,7 +97,7 @@ "< Back to %s": "< Tilbage til %s", "Back to %s > %s": "Tilbage til %s > %s", "Refresh: %s": "Opdater: %s", - "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Start en tvungen opdatering, ignorer kendte undertekster, og søg for nye", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Start en tvungen opdatering som ignorer kendte undertekster og søger efter nye", "Extract and activate embedded subtitle streams": "Extrakt og aktiver undertekster fra selve mediet", "Inspect currently blacklisted subtitles": "Undersøg nuværende undertekster i karantæne", "Subtitle saved to disk": "Undertekster gemt på disk", @@ -310,7 +310,7 @@ "WARNING": "ADVARSEL", "INFO": "INFO", "DEBUG": "DEBUG", - "Force-find subtitles: %(item_title)s": "Gennentving-find undertekster: %s (titler)", + "Force-find subtitles: %(item_title)s": "Gennemtving-find undertekster: %(item_title)s", "File %(file_part_index)s: ": "Fil %(file_part_index)s:␣", "%(part_summary)sNo current subtitle in storage": "%(part_summary)s Ingen undertekster for nuværende gemt", "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sNuværende undertekst: %(provider_name)s (tilføjet: %(date_added)s, %(mode)s), Sprog: %(language)s, Score: %(score)i, Lager: %(storage_type)s", @@ -396,5 +396,47 @@ "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Tilføj eller fjern en vis tid fra underteksten så den matcher din medie", "Available": "Tilgængelig", "Current": "Nuværende", - "Custom path to advanced_settings.json": "Bruger defineret sti til advanced_settings.json" + "Custom path to advanced_settings.json": "Bruger defineret sti til advanced_settings.json", + "zh-hant": "Kinesisk (Traditionelt)", + "zh-hans": "Kinesisk (Simpel)", + "Reset the plugin's menu history storage": "Reset plugin'ens meny historie lager ", + "forced": "gennemtvunget", + "%s in %s (%s, score: %s), %s": "%s i %s (%s, score: %s), %s", + "Extract embedded subtitle streams": "Udtræk indlejrede undertekster", + "Display %(incl_excl_list_name)s (%(count)d)": "Vis %(incl_excl_list_name)s liste (%(count)d)", + "include list": "inkluder liste", + "ignore list": "ignorer liste", + "Include list": "Inkluder lsite", + "Ignore list": "Ignorer liste", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "Vis den aktuelle %(incl_excl_list_name)s liste (mest brugt af det automatiske job)", + "Didn't change the %(incl_excl_list_name)s": "Ændrede ikke %(incl_excl_list_name)s", + "%(title)s added to the include list": "%(title)s føjet til listen som skal indsættes", + "%(title)s removed from the include list": "%(title)s fjernet fra listen som skal indsættes", + "Enable Sub-Zero for %(kind)s \"%(title)s\"": "Aktiver Sub-Zero for %(kind)s \"%(title)s\"", + "Disable Sub-Zero for %(kind)s \"%(title)s\"": "Deaktiver Sub-Zero for %(kind)s \"%(title)s\"", + "Download subtitles": "Download undertekster", + "Never": "Aldrig", + "Always": "Altid", + "When main audio stream is not Subtitle Language (1)": "Når primær lyd ikke er undertekst sprog (1)", + "When main audio stream is not any configured language": "Når primær lyd ikke er det indstillede sprog", + "When any audio stream is not Subtitle Language (1)": "Når ingen lyd er Undertekst sprog (1)", + "When any audio stream is not any configured language": "Når ingen lyd er det indstillede sprog", + "Download foreign/forced subtitles": "Download fremmede/tvungne undertekster", + "Only for Subtitle Language (1)": "Kun for Undertekst Sprog (1)", + "Only for Subtitle Language (2)": "Kun for Undertekst Sprog (2)", + "Only for Subtitle Language (3)": "Kun for Undertekst Sprog (3)", + "Embedded streams: Treat \"Undefined\" (und) as language 1": "Indlejrede stream: Behandl \"Udefineret\" (und) som sprog 1", + "Reverse punctuation in RTL languages (heb, ara, fas)": "Fortryd tegnsætning i RTL sprog (heb, ara, fas)", + "Fix only uppercase downloaded subtitles": "Ændre kun for store-bogstaver undertekster", + "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "Skal SZ være aktiveret eller ikke aktiveret som standard? (har indflydelse på indstillinger nedenfor og i plugin's meny)", + "enable SZ for all items by default, use ignore mode": "aktiver SZ for alle titler som standard og brug ignorer modus", + "disable SZ for all items by default, use include mode": "deaktiver SZ for alle titler som standard og brug inkluder modus", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "Brug \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) eller \"subzero.include/.subzero.include/.sz\" (include mode) på filer i biblioteker", + "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "Aktiver/deaktiver Sub-Zero i følgende stier (komma-spareret; ovenstående indstilling har indflydelse på det)", + "auto": "Auto", + "manual": "Manuelt", + "auto-better": "Auto-bedre", + "Unknown": "Ukendt", + "embedded": "Indlejret", + "Use Google DNS (for \"problematic\" countries)": "Benyt Google DNS (For lande med restriktive DNS servere)" } \ No newline at end of file From 8a44a798aaa3c21ec262eeb9c186ff02a32da473 Mon Sep 17 00:00:00 2001 From: pannal Date: Wed, 7 Nov 2018 13:53:28 +0100 Subject: [PATCH 293/710] Update nl.json (POEditor.com) --- Contents/Strings/nl.json | 78 ++++++++++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 18 deletions(-) diff --git a/Contents/Strings/nl.json b/Contents/Strings/nl.json index ff8b4f78d..3a0d8e808 100644 --- a/Contents/Strings/nl.json +++ b/Contents/Strings/nl.json @@ -53,7 +53,7 @@ "The owner has restricted the access to this menu. Please enter the correct pin": "De eigenaar heeft de toegang beperkt tot dit menu. Vul a.u.b. de correcte PIN in.", "Restart the plugin": "Herstart de plugin", "Get my logs (copy the appearing link and open it in your browser, please)": "Haal mijn logs op (kopieer de link en open deze in je browser, a.u.b.)", - "Copy the appearing link and open it in your browser, please": "kopieer de link en open deze in je browser, a.u.b.", + "Copy the appearing link and open it in your browser, please": "Kopieer a.u.b. de link en open deze in je browser.", "Trigger find better subtitles": "Activeer zoek betere ondertiteling", "Skip next find better subtitles (sets last run to now)": "Sla volgende zoek beter ondertiteling over (stelt de laatste uitvoering op nu)", "Trigger subtitle storage maintenance": "Activeer ondertiteling opslag onderhoud", @@ -67,7 +67,7 @@ "Reset the plugin's scheduled tasks state storage": "Reset de plugin's geplande takenstaat opslag", "Reset the plugin's internal ignorelist storage": "Reset de plugin's interne negeerlijst opslag", "Invalidate Sub-Zero metadata caches (subliminal)": "Invalideer Sub-Zero metadata caches (subliminal)", - "Reset provider throttle states": "Reset provider pauze staten", + "Reset provider throttle states": "Reset pauze status van providers", "Restarting the plugin": "Plugin herstarten", "Restart triggered, please wait about 5 seconds": "Herstart geactiveerd, wacht a.u.b. ongeveer 5 seconden", "Reset subtitle storage": "Reset ondertiteling opslag", @@ -79,11 +79,11 @@ "SubtitleStorageMaintenance triggered": "OndertitelingOpslagOnderhoud geactiveerd", "MigrateSubtitleStorage triggered": "MigreerOndertitelingOpslag geactiveerd", "TriggerCacheMaintenance triggered": "CacheOnderhoud geactiveerd", - "This may take some time ...": "Dit kan een tijd duren...", + "This may take some time ...": "Dit kan even duren...", "Download Logs": "Download Logs", "Sorry, feature unavailable": "Sorry, eigenschap is niet beschikbaar", "Universal Plex token not available": "Universele Plex token niet beschikbaar", - "Copy this link and open this in your browser, please": "Kopieer deze link en open deze in je browser, a.u.b.", + "Copy this link and open this in your browser, please": "Kopieer a.u.b. deze link en open deze in je browser.", "Cache invalidated": "Cache is geinvalideerd", "Enter PIN number ": "Voer PIN nummer in ", "PIN correct": "PIN is correct", @@ -98,14 +98,14 @@ "Back to %s > %s": "Terug naar %s > %s", "Refresh: %s": "Ververs: %s", "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Voert een geforceerde vernieuwing uit, negeert bekende ondertiteling en zoekt naar nieuwe", - "Extract and activate embedded subtitle streams": "Geëmbedde ondertiteling streams extraheren en activeren", + "Extract and activate embedded subtitle streams": "Geëmbedde ondertiteling streams exporteren en activeren", "Inspect currently blacklisted subtitles": "Inspecteer de ondertiteling op de zwarte lijst", "Subtitle saved to disk": "Ondertitel opgeslagen op schijf", "Remove subtitle from blacklist": "Verwijder ondertitel van zwarte lijst", "No subtitles found": "Geen ondertiteling gevonden", " (unknown)": " (onbekend)", " (forced)": " (geforceerd)", - "Extracting of embedded subtitle %s of part %s:%s triggered": "Extraheren van geëmbedde ondertitel %s van deel %s:%s geactiveerd", + "Extracting of embedded subtitle %s of part %s:%s triggered": "Exporteren van geëmbedde ondertitel %s van deel %s:%s geactiveerd", "Insufficient permissions": "Niet genoeg rechten", "I'm not enabled!": "Ik ben niet ingeschakeld!", "Please enable me for some of your libraries in your server settings; currently I do nothing": "Schakel me alstublieft in voor enkele van uw bibliotheken in uw serverinstellingen; momenteel doe ik niets", @@ -144,7 +144,7 @@ "movie": "film", "<< Back to home": "<< Terug naar start", "Auto-Find subtitles: %s": "Auto-Vind ondertiteling: %s", - "Extracting of embedded subtitles for %s triggered": "Extraheren van geëmbedde ondertiteling voor %s is geactiveerd", + "Extracting of embedded subtitles for %s triggered": "Exporteren van geëmbedde ondertiteling voor %s is geactiveerd", "< Back to subtitle options for: %s": "< Teug naar ondertitel opties voor: %s", "Remove last applied mod (%s)": "Verwijder laatst toegepaste modificatie (%s)", "none": "geen", @@ -191,8 +191,8 @@ "Provider: Enable hosszupuskasub.com (Hungarian)": "Provider: hosszupuskasub.com inschakelen (Hongaars)", "Provider: Enable aRGENTeaM (Spanish)": "Provider: aRGENTeaM inschakelen (Spaans)", "Search enabled providers simultaneously (multithreading)": "Zoek gelijkertijd bij ingeschakelde providers (multithreading)", - "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Extraheer en gebruik geëmbedde ondertiteling automatisch bij media toevoeging (met geconfigureerde standaard modificaties)", - "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "Na het automatisch extraheren van geëmbedde ondertiteling, ook gelijk zoeken naar beschikbare ondertiteling?", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Exporteer en gebruik geëmbedde ondertiteling automatisch bij media toevoeging (met geconfigureerde standaard modificaties)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "Na het automatisch exporteren van geëmbedde ondertiteling, ook gelijk zoeken naar beschikbare ondertiteling?", "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "Niet zoeken naar ondertiteling van een taal als er al geëmbedde ondertiteling bestaat in het media bestand (MKV/MP4)?", "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "Niet zoeken naar ondertiteling van een taal als er ondertiteling bestaat op het bestandssysteem (metadata/bestandssysteem)?", "How strict should these subtitles existing on the filesystem be detected?": "Hoe strikt moet deze ondertiteling op het bestandssysteem worden gedetecteerd?", @@ -203,7 +203,7 @@ "Remove Hearing Impaired tags from downloaded subtitles": "Verwijder slecthorende-tags uit ondertiteling", "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Verwijder stijl-tags uit de ondertiteling (dik gedrukt, schuin, onderlijnt, kleuren, ...)", "Fix common issues in subtitles": "Repareer veel voorkomende fouten in ondertiteling", - "Fix common OCR errors in downloaded subtitles": "Repareer veel voorkomende OCR fouten om gedownloade ondertiteling", + "Fix common OCR errors in downloaded subtitles": "Repareer veel voorkomende OCR fouten in gedownloade ondertiteling", "Reverse punctuation in RTL languages (heb)": "Draai leestekens in RTL (rechts naar links) talen om (Hebreeuws)", "Change colors of subtitles to": "Wijzig kleur van ondertiteling naar", "Store subtitles next to media files (instead of metadata)": "Sla ondertiteling naast de media bestanden op (in plaats van in de metadata)", @@ -337,16 +337,16 @@ "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", "Release: %(release_info)s, Matches: %(matches)s": "Uitgave: %(release_info)s, Overeenkomst: %(matches)s", "Downloading subtitle for %(title_or_id)s": "Ondertitel downloaden voor %(title_or_id)s", - "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Extraheer stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s met standaard modificaties", - "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "Extraheer stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Exporteer stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s met standaard modificaties", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "Exporteer stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (Toegevoegd: %(date_added)s, %(mode)s), Taal: %(language)s, Score: %(score)i, Opslag: %(storage_type)s", "Insufficient permissions on library %(title)s, folder: %(path)s": "Niet genoeg rechten op bibliotheek %(title)s, map: %(path)s", "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Uitvoeren: %(items_done)s/%(items_searching)s (%(percentage)s%%)", "Display ignore list (%(ignored_count)d)": "Negeerlijst weergeven (%(ignored_count)d)", "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s tot %(until_date)s (%(reason)s)", - "Extracting subtitle %(stream_index)s of %(filename)s": "Extraheren van ondertitel %(stream_index)s van %(filename)s", - "Extract missing %(language)s embedded subtitles": "Extraheer missende %(language)s geëmbedde ondertiteling", - "Extract and activate %(language)s embedded subtitles": "Extraheer en activeer %(language)s geëmbedde ondertiteling", + "Extracting subtitle %(stream_index)s of %(filename)s": "Exporteren van ondertitel %(stream_index)s van %(filename)s", + "Extract missing %(language)s embedded subtitles": "Exporteer missende %(language)s geëmbedde ondertiteling", + "Extract and activate %(language)s embedded subtitles": "Exporteer en activeer %(language)s geëmbedde ondertiteling", "None": "Geen", "Idle": "Idle", "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", @@ -371,8 +371,8 @@ "Un-ignore %(kind)s \"%(title)s\"": "%(kind)s \"%(title)s\" niet meer negeren", "Refreshing %(title)s": "%(title)s aan het verversen", "Force-refreshing %(title)s": "%(title)s aan het geforceerd verversen", - "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Extraheert de nog niet geëxtraheerde geëmbedde ondertiteling van alle afleveringen voor het huidige seizoen met alle geconfigureerde standaard modificaties", - "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "Extraheert geëmbedde ondertiteling van alle afleveringen voor het huidig seizoen met alle geconfigureerde standaard modificaties", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Exporteert de nog niet geëxporteerde geëmbedde ondertiteling van alle afleveringen voor het huidige seizoen met alle geconfigureerde standaard modificaties", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "Exporteert geëmbedde ondertiteling van alle afleveringen voor het huidig seizoen met alle geconfigureerde standaard modificaties", "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Ververst %(the_movie_series_season_episode)s, mogelijk zoeken naar missende ondertiteling en nieuwe ondertiteling op schijf", "the movie": "de film", "the series": "de serie", @@ -396,5 +396,47 @@ "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Voegt een bepaalde hoeveelheid tijd toe of trekt een bepaalde tijd af van de hele ondertitel zodat deze overeenkomt met uw media", "Available": "Beschikbaar", "Current": "Huidig", - "Custom path to advanced_settings.json": "Aangepast pad naar advanced_settings.json" + "Custom path to advanced_settings.json": "Aangepast pad naar advanced_settings.json", + "zh-hant": "Chinees (Traditioneel)", + "zh-hans": "Chinees (Versimpeld)", + "Reset the plugin's menu history storage": "Reset geschiedenis opslag", + "forced": "geforceerd", + "%s in %s (%s, score: %s), %s": "%s in %s (%s, score: %s), %s", + "Extract embedded subtitle streams": "Geëmbedde ondertiteling streams exporteren", + "Display %(incl_excl_list_name)s (%(count)d)": "%(incl_excl_list_name)s weergeven (%(count)d)", + "include list": "gebruiklijst", + "ignore list": "negeerlijst", + "Include list": "Gerbuiklijst", + "Ignore list": "Negeerlijst", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "Laat de huidige %(incl_excl_list_name)s zien (hoofdzakelijk gebruikt voor automatische taken)", + "Didn't change the %(incl_excl_list_name)s": "%(incl_excl_list_name)s is niet veranderd", + "%(title)s added to the include list": "%(title)s toegevoegd aan de gebruiklijst", + "%(title)s removed from the include list": "%(title)s verwijderd van de gebruiklijst", + "Enable Sub-Zero for %(kind)s \"%(title)s\"": "Sub-Zero inschakelen voor %(kind)s \"%(title)s\"", + "Disable Sub-Zero for %(kind)s \"%(title)s\"": "Sub-Zero uitschakelen voor %(kind)s \"%(title)s\"", + "Download subtitles": "Download ondertiteling", + "Never": "Nooit", + "Always": "Altijd", + "When main audio stream is not Subtitle Language (1)": "Wanneer de hoofd audio stream niet Ondertitel taal (1) is", + "When main audio stream is not any configured language": "Wanneer de hoofd audio stream niet een geconfigureerde taal is", + "When any audio stream is not Subtitle Language (1)": "Wanneer een audio stream niet Ondertitel taal (1) is", + "When any audio stream is not any configured language": "Wanneer een audio stream niet een geconfigureerde taal is", + "Download foreign/forced subtitles": "Download vreemde/geforceerde ondertiteling", + "Only for Subtitle Language (1)": "Alleen voor Ondertitel taal (1)", + "Only for Subtitle Language (2)": "Alleen voor Ondertitel taal (2)", + "Only for Subtitle Language (3)": "Alleen voor Ondertitel taal (3)", + "Embedded streams: Treat \"Undefined\" (und) as language 1": "Geëmbedde streams: Behandel \"Undefined\" (und) als Ondertitel taal (1)", + "Reverse punctuation in RTL languages (heb, ara, fas)": "Draai leestekens in RTL (rechts naar links) talen om (Hebreeuws, Arabisch, Perzisch)", + "Fix only uppercase downloaded subtitles": "Repareer enkel gedownloade ondertiteling met hoofdletters", + "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "Moet SZ standaard ingeschakeld of uitgeschakeld zijn? (beïnvloedt de instellingen hieronder en het plug-in menu)", + "enable SZ for all items by default, use ignore mode": "SZ standaard inschakelen voor alle items, gebruik negeerlijst", + "disable SZ for all items by default, use include mode": "SZ standaard uitschakelen voor alle items, gebruik gebruiklijst", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "Gebruik \"subzero.ignore/.subzero.ignore/.nosz\" (negeer modus) of \"subzero.include/.subzero.include/.sz\" (gebruik modus) bestanden in mappen", + "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "Sub-Zero inschakelen/uitschakelen voor de volgende paden (kommagescheiden; de instelling hierboven beïnvloedt dit)", + "auto": "automatisch", + "manual": "handmatig", + "auto-better": "automatisch-verbeter", + "Unknown": "Onbekend", + "embedded": "geëmbedde", + "Use Google DNS (for \"problematic\" countries)": "Gebruik Google DNS (voor \"probleematische\" landen)" } \ No newline at end of file From 4bc8e5031a908c546be788e3fa4f17c810fe4235 Mon Sep 17 00:00:00 2001 From: pannal Date: Wed, 7 Nov 2018 13:53:30 +0100 Subject: [PATCH 294/710] Update en.json (POEditor.com) --- Contents/Strings/en.json | 874 ++++++++++++++++++++------------------- 1 file changed, 441 insertions(+), 433 deletions(-) diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index c528640f6..4e50fed8b 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -1,434 +1,442 @@ { - "sq":"Albanian", - "ar":"Arabic", - "be":"Belarusian", - "bs":"Bosnian", - "bg":"Bulgarian", - "ca":"Catalan", - "zh":"Chinese", - "zh-hant":"Chinese (Traditional)", - "zh-hans":"Chinese (Simplified)", - "hr":"Croatian", - "cs":"Czech", - "da":"Danish", - "nl":"Dutch", - "en":"English", - "et":"Estonian", - "fa":"Persian (Farsi)", - "fi":"Finnish", - "fr":"French", - "de":"German", - "el":"Greek", - "he":"Hebrew", - "hi":"Hindi", - "hu":"Hungarian", - "is":"Icelandic", - "id":"Indonesian", - "it":"Italian", - "ja":"Japanese", - "ko":"Korean", - "lv":"Latvian", - "lt":"Lithuanian", - "mk":"Macedonian", - "ms":"Malay", - "no":"Norwegian", - "pl":"Polish", - "pt":"Portuguese", - "pt-br":"Portuguese (Brasil)", - "ro":"Romanian", - "ru":"Russian", - "sr":"Serbian", - "sr-cyrl":"Serbian (Cyrillic)", - "sr-latn":"Serbian (Latin)", - "sk":"Slovak", - "sl":"Slovenian", - "es":"Spanish", - "sv":"Swedish", - "th":"Thai", - "tr":"Turkish", - "uk":"Ukranian", - "vi":"Vietnamese", - "Internal stuff, pay attention!":"Internal stuff, pay attention!", - "Advanced":"Advanced", - "advanced":"advanced", - "Enter PIN":"Enter PIN", - "The owner has restricted the access to this menu. Please enter the correct pin":"The owner has restricted the access to this menu. Please enter the correct pin", - "Restart the plugin":"Restart the plugin", - "Get my logs (copy the appearing link and open it in your browser, please)":"Get my logs (copy the appearing link and open it in your browser, please)", - "Copy the appearing link and open it in your browser, please":"Copy the appearing link and open it in your browser, please", - "Trigger find better subtitles":"Trigger find better subtitles", - "Skip next find better subtitles (sets last run to now)":"Skip next find better subtitles (sets last run to now)", - "Trigger subtitle storage maintenance":"Trigger subtitle storage maintenance", - "Trigger subtitle storage migration (expensive)":"Trigger subtitle storage migration (expensive)", - "Trigger cache maintenance (refiners, providers and packs/archives)":"Trigger cache maintenance (refiners, providers and packs/archives)", - "Apply configured default subtitle mods to all (active) stored subtitles":"Apply configured default subtitle mods to all (active) stored subtitles", - "Re-Apply mods of all stored subtitles":"Re-Apply mods of all stored subtitles", - "Log the plugin's scheduled tasks state storage":"Log the plugin's scheduled tasks state storage", - "Log the plugin's internal ignorelist storage":"Log the plugin's internal ignorelist storage", - "Log the plugin's complete state storage":"Log the plugin's complete state storage", - "Reset the plugin's scheduled tasks state storage":"Reset the plugin's scheduled tasks state storage", - "Reset the plugin's internal ignorelist storage":"Reset the plugin's internal ignorelist storage", - "Reset the plugin's menu history storage": "Reset the plugin's menu history storage", - "Invalidate Sub-Zero metadata caches (subliminal)":"Invalidate Sub-Zero metadata caches (subliminal)", - "Reset provider throttle states":"Reset provider throttle states", - "Restarting the plugin":"Restarting the plugin", - "Restart triggered, please wait about 5 seconds":"Restart triggered, please wait about 5 seconds", - "Reset subtitle storage":"Reset subtitle storage", - "Are you sure?":"Are you sure?", - "Are you really sure?":"Are you really sure?", - "Success":"Success", - "Information Storage (%s) reset":"Information Storage (%s) reset", - "Information Storage (%s) logged":"Information Storage (%s) logged", - "FindBetterSubtitles triggered":"FindBetterSubtitles triggered", - "FindBetterSubtitles skipped":"FindBetterSubtitles skipped", - "SubtitleStorageMaintenance triggered":"SubtitleStorageMaintenance triggered", - "MigrateSubtitleStorage triggered":"MigrateSubtitleStorage triggered", - "TriggerCacheMaintenance triggered":"TriggerCacheMaintenance triggered", - "This may take some time ...":"This may take some time ...", - "Download Logs":"Download Logs", - "Sorry, feature unavailable":"Sorry, feature unavailable", - "Universal Plex token not available":"Universal Plex token not available", - "Copy this link and open this in your browser, please":"Copy this link and open this in your browser, please", - "Cache invalidated":"Cache invalidated", - "Enter PIN number ":"Enter PIN number ", - "PIN correct":"PIN correct", - "Reset":"Reset", - "Menu locked":"Menu locked", - "Provider throttles reset":"Provider throttles reset", - "Plex didn't return any information about the item, please refresh it and come back later":"Plex didn't return any information about the item, please refresh it and come back later", - "Item not found: %s!":"Item not found: %s!", - "< Back to %s":"< Back to %s", - "Back to %s > %s":"Back to %s > %s", - "Refresh: %s":"Refresh: %s", - "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk":"Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk", - "the movie":"the movie", - "the series":"the series", - "the episode":"the episode", - "the season":"the season", - "forced": "forced", - "Force-find subtitles: %(item_title)s":"Force-find subtitles: %(item_title)s", - "Issues a forced refresh, ignoring known subtitles and searching for new ones":"Issues a forced refresh, ignoring known subtitles and searching for new ones", - "File %(file_part_index)s: ":"File %(file_part_index)s: ", - "%(part_summary)sNo current subtitle in storage":"%(part_summary)sNo current subtitle in storage", - "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "%(part_summary)sManage %(language)s subtitle":"%(part_summary)sManage %(language)s subtitle", - "%(part_summary)sList %(language)s subtitles":"%(part_summary)sList %(language)s subtitles", - "%(part_summary)sEmbedded subtitles (%(languages)s)":"%(part_summary)sEmbedded subtitles (%(languages)s)", - "%s in %s (%s, score: %s), %s": "%s in %s (%s, score: %s), %s", - "Extract embedded subtitle streams": "Extract embedded subtitle streams", - "Extract and activate embedded subtitle streams":"Extract and activate embedded subtitle streams", - "Select active %(language)s subtitle":"Select active %(language)s subtitle", - "%(count)d subtitles in storage":"%(count)d subtitles in storage", - "List available %(language)s subtitles":"List available %(language)s subtitles", - "Modify current %(language)s subtitle":"Modify current %(language)s subtitle", - "Currently applied mods: %(mod_list)s":"Currently applied mods: %(mod_list)s", - "Blacklist current %(language)s subtitle and search for a new one":"Blacklist current %(language)s subtitle and search for a new one", - "Manage blacklist (%(amount)s contained)":"Manage blacklist (%(amount)s contained)", - "Inspect currently blacklisted subtitles":"Inspect currently blacklisted subtitles", - "%(current_state)s%(subtitle_name)s, Score: %(score)s":"%(current_state)s%(subtitle_name)s, Score: %(score)s", - "Current: ":"Current: ", - "Stored: ":"Stored: ", - "Subtitle saved to disk":"Subtitle saved to disk", - "Remove subtitle from blacklist":"Remove subtitle from blacklist", - "by %(release_group)s":"by %(release_group)s", - "Current: %(provider_name)s (%(score)s) ":"Current: %(provider_name)s (%(score)s) ", - "Search for %(language)s subs (%(video_data)s)":"Search for %(language)s subs (%(video_data)s)", - "%(current_info)sFilename: %(filename)s":"%(current_info)sFilename: %(filename)s", - "No subtitles found":"No subtitles found", - "Searching for %(language)s subs (%(video_data)s), refresh here ...":"Searching for %(language)s subs (%(video_data)s), refresh here ...", - " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)":" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", - " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)":" (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", - "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s":"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", - "Release: %(release_info)s, Matches: %(matches)s":"Release: %(release_info)s, Matches: %(matches)s", - "Downloading subtitle for %(title_or_id)s":"Downloading subtitle for %(title_or_id)s", - "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods", - " (unknown)":" (unknown)", - " (forced)":" (forced)", - "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s":"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", - "Extracting of embedded subtitle %s of part %s:%s triggered":"Extracting of embedded subtitle %s of part %s:%s triggered", - "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "Insufficient permissions":"Insufficient permissions", - "Insufficient permissions on library %(title)s, folder: %(path)s":"Insufficient permissions on library %(title)s, folder: %(path)s", - "I'm not enabled!":"I'm not enabled!", - "Please enable me for some of your libraries in your server settings; currently I do nothing":"Please enable me for some of your libraries in your server settings; currently I do nothing", - "Working ... refresh here":"Working ... refresh here", - "Current state: %s; Last state: %s":"Current state: %s; Last state: %s", - "On-deck items":"On-deck items", - "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.", - "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.":"Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", - "Recently-added items":"Recently-added items", - "Recently played items":"Recently played items", - "Shows the recently added items per section.":"Shows the recently added items per section.", - "Show recently added items with missing subtitles":"Show recently added items with missing subtitles", - "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list":"Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list", - "Browse all items":"Browse all items", - "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.":"Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.", - "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)":"Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", - "Last run: %s; Next scheduled run: %s; Last runtime: %s":"Last run: %s; Next scheduled run: %s; Last runtime: %s", - "Search for missing subtitles (in recently-added items, max-age: %s)":"Search for missing subtitles (in recently-added items, max-age: %s)", - "Automatically run periodically by the scheduler, if configured. %s":"Automatically run periodically by the scheduler, if configured. %s", - "Display %(incl_excl_list_name)s (%(count)d)":"Display %(incl_excl_list_name)s list (%(count)d)", - "include list": "include list", - "ignore list": "ignore list", - "Include list": "Include list", - "Ignore list": "Ignore list", - "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)":"Show the current %(incl_excl_list_name)s list (mainly used for the automatic tasks)", - "History":"History", - "Show the last %i downloaded subtitles":"Show the last %i downloaded subtitles", - "Refresh":"Refresh", - "Re-lock menu(s)":"Re-lock menu(s)", - "Enabled the PIN again for menu(s)":"Enabled the PIN again for menu(s)", - "%(throttled_provider)s until %(until_date)s (%(reason)s)":"%(throttled_provider)s until %(until_date)s (%(reason)s)", - "Throttled providers: %s":"Throttled providers: %s", - "Advanced functions":"Advanced functions", - "Use at your own risk":"Use at your own risk", - "Items On Deck":"Items On Deck", - "Recently Played":"Recently Played", - "Items with missing subtitles":"Items with missing subtitles", - "Find recent items with missing subtitles":"Find recent items with missing subtitles", - "Updating, refresh here ...":"Updating, refresh here ...", - "Missing: %s":"Missing: %s", - "Add %(kind)s %(title)s to the ignore list":"Add %(kind)s %(title)s to the ignore list", - "Remove %(kind)s %(title)s from the ignore list":"Remove %(kind)s %(title)s from the ignore list", - "Didn't change the %(incl_excl_list_name)s":"Didn't change the %(incl_excl_list_name)s", - "%(title)s added to the ignore list":"%(title)s added to the ignore list", - "%(title)s removed from the ignore list":"%(title)s removed from the ignore list", - "%(title)s added to the include list":"%(title)s added to the include list", - "%(title)s removed from the include list":"%(title)s removed from the include list", - "Sections":"Sections", - "All":"All", - "Ignore %(kind)s \"%(title)s\"":"Ignore %(kind)s \"%(title)s\"", - "Un-ignore %(kind)s \"%(title)s\"":"Un-ignore %(kind)s \"%(title)s\"", - "Enable Sub-Zero for %(kind)s \"%(title)s\"": "Enable Sub-Zero for %(kind)s \"%(title)s\"", - "Disable Sub-Zero for %(kind)s \"%(title)s\"": "Disable Sub-Zero for %(kind)s \"%(title)s\"", - "show":"show", - "movie":"movie", - "Refreshing %(title)s":"Refreshing %(title)s", - "Force-refreshing %(title)s":"Force-refreshing %(title)s", - "Extracting subtitle %(stream_index)s of %(filename)s":"Extracting subtitle %(stream_index)s of %(filename)s", - "<< Back to home":"<< Back to home", - "Extract missing %(language)s embedded subtitles":"Extract missing %(language)s embedded subtitles", - "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications", - "Extract and activate %(language)s embedded subtitles":"Extract and activate %(language)s embedded subtitles", - "Extracts embedded subtitles of all episodes for the current season with all configured default modifications":"Extracts embedded subtitles of all episodes for the current season with all configured default modifications", - "Auto-Find subtitles: %s":"Auto-Find subtitles: %s", - "Extracting of embedded subtitles for %s triggered":"Extracting of embedded subtitles for %s triggered", - "Triggering refresh for %(title)s":"Triggering refresh for %(title)s", - "Triggering forced refresh for %(title)s":"Triggering forced refresh for %(title)s", - "Refresh of item %(item_id)s triggered":"Refresh of item %(item_id)s triggered", - "Forced refresh of item %(item_id)s triggered":"Forced refresh of item %(item_id)s triggered", - "< Back to subtitle options for: %s":"< Back to subtitle options for: %s", - "Remove last applied mod (%s)":"Remove last applied mod (%s)", - "none":"none", - "None":"None", - "Idle":"Idle", - "Manage applied mods":"Manage applied mods", - "Reapply applied mods":"Reapply applied mods", - "Restore original version":"Restore original version", - "< Back to subtitle modification menu":"< Back to subtitle modification menu", - "subs constantly getting faster":"subs constantly getting faster", - "subs constantly getting slower":"subs constantly getting slower", - "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)":"%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", - "< Back to subtitle modifications":"< Back to subtitle modifications", - "Adjust by %(time_and_unit)s":"Adjust by %(time_and_unit)s", - "< Back to unit selection":"< Back to unit selection", - "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s":"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", - "Remove: %(mod_name)s":"Remove: %(mod_name)s", - "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Subtitle download failed (%(item_id)s)", - "Subtitle Language (1)":"Subtitle Language (1)", - "Subtitle Language (2)":"Subtitle Language (2)", - "Subtitle Language (3)":"Subtitle Language (3)", - "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)":"Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)", - "Download subtitles":"Download subtitles", - "Never": "Never", - "Always": "Always", - "When main audio stream is not Subtitle Language (1)": "When main audio stream is not Subtitle Language (1)", - "When main audio stream is not any configured language": "When main audio stream is not any configured language", - "When any audio stream is not Subtitle Language (1)": "When any audio stream is not Subtitle Language (1)", - "When any audio stream is not any configured language": "When any audio stream is not any configured language", - "Download foreign/forced subtitles": "Download foreign/forced subtitles", - "Only for Subtitle Language (1)": "Only for Subtitle Language (1)", - "Only for Subtitle Language (2)": "Only for Subtitle Language (2)", - "Only for Subtitle Language (3)": "Only for Subtitle Language (3)", - "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)":"Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", - "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)":"Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)", - "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")":"Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")", - "Embedded streams: Treat \"Undefined\" (und) as language 1":"Embedded streams: Treat \"Undefined\" (und) as language 1", - "I rename my files using":"I rename my files using", - "Retrieve original filename from .file_info/file_info index files (see wiki)":"Retrieve original filename from .file_info/file_info index files (see wiki)", - "Sonarr URL (add URL base if configured)":"Sonarr URL (add URL base if configured)", - "Sonarr API key":"Sonarr API key", - "Radarr URL (add URL base if configured, min. version: 0.2.0.897)":"Radarr URL (add URL base if configured, min. version: 0.2.0.897)", - "Radarr API key":"Radarr API key", - "Provider: Enable OpenSubtitles":"Provider: Enable OpenSubtitles", - "Opensubtitles Username":"Opensubtitles Username", - "Opensubtitles Password":"Opensubtitles Password", - "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)":"OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)", - "Provider: Enable Podnapisi.NET":"Provider: Enable Podnapisi.NET", - "Provider: Enable Titlovi.com":"Provider: Enable Titlovi.com", - "Provider: Enable Addic7ed":"Provider: Enable Addic7ed", - "Addic7ed Username":"Addic7ed Username", - "Addic7ed Password":"Addic7ed Password", - "Addic7ed: boost score (if requirements met)":"Addic7ed: boost score (if requirements met)", - "Addic7ed: Use random user agents":"Addic7ed: Use random user agents", - "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)":"Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", - "Legendas TV Username":"Legendas TV Username", - "Legendas TV Password":"Legendas TV Password", - "Provider: Enable TVsubtitles.net":"Provider: Enable TVsubtitles.net", - "Provider: Enable NapiProjekt.pl (Polish)":"Provider: Enable NapiProjekt.pl (Polish)", - "Provider: Enable SubScene (TV shows)":"Provider: Enable SubScene (TV shows)", - "Provider: Enable hosszupuskasub.com (Hungarian)":"Provider: Enable hosszupuskasub.com (Hungarian)", - "Provider: Enable aRGENTeaM (Spanish)":"Provider: Enable aRGENTeaM (Spanish)", - "Search enabled providers simultaneously (multithreading)":"Search enabled providers simultaneously (multithreading)", - "Automatically extract and use embedded subtitles upon media addition (with configured default mods)":"Automatically extract and use embedded subtitles upon media addition (with configured default mods)", - "After automatic extraction of embedded subtitles, also immediately search for available subtitles?":"After automatic extraction of embedded subtitles, also immediately search for available subtitles?", - "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?":"Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?", - "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?":"Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?", - "How strict should these subtitles existing on the filesystem be detected?":"How strict should these subtitles existing on the filesystem be detected?", - "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?":"Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?", - "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)":"Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)", - "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)":"Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)", - "Download hearing impaired subtitles.":"Download hearing impaired subtitles.", - "Remove Hearing Impaired tags from downloaded subtitles":"Remove Hearing Impaired tags from downloaded subtitles", - "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)":"Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)", - "Fix common issues in subtitles":"Fix common issues in subtitles", - "Fix common OCR errors in downloaded subtitles":"Fix common OCR errors in downloaded subtitles", - "Reverse punctuation in RTL languages (heb, ara, fas)":"Reverse punctuation in RTL languages (heb, ara, fas)", - "Fix only uppercase downloaded subtitles": "Fix only uppercase downloaded subtitles", - "Change colors of subtitles to":"Change colors of subtitles to", - "Store subtitles next to media files (instead of metadata)":"Store subtitles next to media files (instead of metadata)", - "Subtitle formats to save (non-SRT only works if the previous option is enabled)":"Subtitle formats to save (non-SRT only works if the previous option is enabled)", - "Subtitle Folder (\"current folder\" is the folder the current media file lives in)":"Subtitle Folder (\"current folder\" is the folder the current media file lives in)", - "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)":"Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)", - "Fall back to metadata storage if filesystem storage failed":"Fall back to metadata storage if filesystem storage failed", - "Set subtitle file permissions to (integer, e.g.: 0775)":"Set subtitle file permissions to (integer, e.g.: 0775)", - "Automatically delete leftover/unused (externally saved) subtitles":"Automatically delete leftover/unused (externally saved) subtitles", - "On media playback: search for missing subtitles (refresh item)":"On media playback: search for missing subtitles (refresh item)", - "Scheduler: Periodically search for recent items with missing subtitles":"Scheduler: Periodically search for recent items with missing subtitles", - "Scheduler: Item age to be considered recent":"Scheduler: Item age to be considered recent", - "Scheduler: Recent items to consider per library":"Scheduler: Recent items to consider per library", - "Scheduler: Periodically search for better subtitles":"Scheduler: Periodically search for better subtitles", - "Scheduler: Days to search for better subtitles (max: 30 days)":"Scheduler: Days to search for better subtitles (max: 30 days)", - "Scheduler: Don't search for better subtitles if the item's air date is older than":"Scheduler: Don't search for better subtitles if the item's air date is older than", - "Scheduler: Overwrite manually selected subtitles when better found":"Scheduler: Overwrite manually selected subtitles when better found", - "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found":"Scheduler: Overwrite subtitles with non-default subtitle modifications when better found", - "History: amount of items to store historical data for":"History: amount of items to store historical data for", - "How many download tries per subtitle (on timeout or error)":"How many download tries per subtitle (on timeout or error)", - "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)", - "enable SZ for all items by default, use ignore mode": "enable SZ for all items by default, use ignore mode", - "disable SZ for all items by default, use include mode": "disable SZ for all items by default, use include mode", - "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders", - "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)":"Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)", - "Sub-Zero mode":"Sub-Zero mode", - "Access PIN (any amount of numbers, 0-9)":"Access PIN (any amount of numbers, 0-9)", - "Access PIN valid for minutes":"Access PIN valid for minutes", - "Use PIN to restrict access to (needs plugin or PMS restart)":"Use PIN to restrict access to (needs plugin or PMS restart)", - "Call this executable upon successful subtitle download (see Wiki for details)":"Call this executable upon successful subtitle download (see Wiki for details)", - "Check for correct folder permissions of every library on plugin start":"Check for correct folder permissions of every library on plugin start", - "Use new style caching (for subliminal)":"Use new style caching (for subliminal)", - "Low impact mode (for remote filesystems)":"Low impact mode (for remote filesystems)", - "Timeout for API requests sent to the PMS":"Timeout for API requests sent to the PMS", - "Use Google DNS (for \"problematic\" countries)": "Use Google DNS (for \"problematic\" countries)", - "HTTP proxy to use for providers (supports credentials)":"HTTP proxy to use for providers (supports credentials)", - "How verbose should the logging be?":"How verbose should the logging be?", - "How many log backups to keep?":"How many log backups to keep?", - "Log subtitle modification (debug)":"Log subtitle modification (debug)", - "Log to console (for development/debugging)":"Log to console (for development/debugging)", - "Collect anonymous usage statistics":"Collect anonymous usage statistics", - "Sonarr/Radarr (fill api info below)":"Sonarr/Radarr (fill api info below)", - "Filebot":"Filebot", - "Sonarr/Radarr/Filebot":"Sonarr/Radarr/Filebot", - "Symlink to original file":"Symlink to original file", - "I keep the original filenames":"I keep the original filenames", - "none of the above":"none of the above", - "exact: media filename match":"exact: media filename match", - "loose: filename contains media filename":"loose: filename contains media filename", - "any":"any", - "prefer":"prefer", - "don't prefer":"don't prefer", - "force HI":"force HI", - "force non-HI":"force non-HI", - "don't change":"don't change", - "white":"white", - "light-grey":"light-grey", - "red":"red", - "green":"green", - "yellow":"yellow", - "blue":"blue", - "magenta":"magenta", - "cyan":"cyan", - "black":"black", - "dark-red":"dark-red", - "dark-green":"dark-green", - "dark-yellow":"dark-yellow", - "dark-blue":"dark-blue", - "dark-magenta":"dark-magenta", - "dark-cyan":"dark-cyan", - "dark-grey":"dark-grey", - "current folder":"current folder", - "never":"never", - "current media item":"current media item", - "next episode (series)":"next episode (series)", - "hybrid: current item or next episode":"hybrid: current item or next episode", - "hybrid-plus: current item and next episode":"hybrid-plus: current item and next episode", - "every 6 hours":"every 6 hours", - "every 12 hours":"every 12 hours", - "every 24 hours":"every 24 hours", - "1 days":"1 days", - "2 days":"2 days", - "3 days":"3 days", - "4 days":"4 days", - "1 weeks":"1 weeks", - "2 weeks":"2 weeks", - "3 weeks":"3 weeks", - "4 weeks":"4 weeks", - "5 weeks":"5 weeks", - "6 weeks":"6 weeks", - "12 weeks":"12 weeks", - "don't limit":"don't limit", - "1 year":"1 year", - "2 years":"2 years", - "3 years":"3 years", - "4 years":"4 years", - "5 years":"5 years", - "6 years":"6 years", - "7 years":"7 years", - "8 years":"8 years", - "9 years":"9 years", - "10 years":"10 years", - "agent + interface":"agent + interface", - "only agent":"only agent", - "only interface":"only interface", - "disabled":"disabled", - "interface":"interface", - "advanced menu":"advanced menu", - "CRITICAL":"CRITICAL", - "ERROR":"ERROR", - "WARNING":"WARNING", - "INFO":"INFO", - "DEBUG":"DEBUG", - "Change the color of the subtitle":"Change the color of the subtitle", - "Adds the requested color to every line of the subtitle. Support depends on player.":"Adds the requested color to every line of the subtitle. Support depends on player.", - "Basic common fixes":"Basic common fixes", - "Fix common and whitespace/punctuation issues in subtitles":"Fix common and whitespace/punctuation issues in subtitles", - "Remove all style tags":"Remove all style tags", - "Removes all possible style tags from the subtitle, such as font, bold, color etc.":"Removes all possible style tags from the subtitle, such as font, bold, color etc.", - "Reverse punctuation in RTL languages":"Reverse punctuation in RTL languages", - "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew":"Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew", - "Change the FPS of the subtitle":"Change the FPS of the subtitle", - "Re-syncs the subtitle to the framerate of the current media file.":"Re-syncs the subtitle to the framerate of the current media file.", - "Remove Hearing Impaired tags":"Remove Hearing Impaired tags", - "Removes tags, text and characters from subtitles that are meant for hearing impaired people":"Removes tags, text and characters from subtitles that are meant for hearing impaired people", - "Fix common OCR issues":"Fix common OCR issues", - "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR":"Fix issues that happen when a subtitle gets converted from bitmap to text through OCR", - "Change the timing of the subtitle":"Change the timing of the subtitle", - "Adds or substracts a certain amount of time from the whole subtitle to match your media":"Adds or substracts a certain amount of time from the whole subtitle to match your media", - "Available":"Available", - "Current":"Current", - "Custom path to advanced_settings.json":"Custom path to advanced_settings.json", - "auto": "auto", - "manual": "manual", - "auto-better": "auto-better", - "Unknown": "Unknown", - "embedded": "embedded" -} + "sq": "Albanian", + "ar": "Arabic", + "be": "Belarusian", + "bs": "Bosnian", + "bg": "Bulgarian", + "ca": "Catalan", + "zh": "Chinese", + "hr": "Croatian", + "cs": "Czech", + "da": "Danish", + "nl": "Dutch", + "en": "English", + "et": "Estonian", + "fa": "Persian (Farsi)", + "fi": "Finnish", + "fr": "French", + "de": "German", + "el": "Greek", + "he": "Hebrew", + "hi": "Hindi", + "hu": "Hungarian", + "is": "Icelandic", + "id": "Indonesian", + "it": "Italian", + "ja": "Japanese", + "ko": "Korean", + "lv": "Latvian", + "lt": "Lithuanian", + "mk": "Macedonian", + "ms": "Malay", + "no": "Norwegian", + "pl": "Polish", + "pt": "Portuguese", + "pt-br": "Portuguese (Brasil)", + "ro": "Romanian", + "ru": "Russian", + "sr": "Serbian", + "sr-cyrl": "Serbian (Cyrillic)", + "sr-latn": "Serbian (Latin)", + "sk": "Slovak", + "sl": "Slovenian", + "es": "Spanish", + "sv": "Swedish", + "th": "Thai", + "tr": "Turkish", + "uk": "Ukranian", + "vi": "Vietnamese", + "Internal stuff, pay attention!": "Internal stuff, pay attention!", + "Advanced": "Advanced", + "advanced": "advanced", + "Enter PIN": "Enter PIN", + "The owner has restricted the access to this menu. Please enter the correct pin": "The owner has restricted the access to this menu. Please enter the correct pin", + "Restart the plugin": "Restart the plugin", + "Get my logs (copy the appearing link and open it in your browser, please)": "Get my logs (copy the appearing link and open it in your browser, please)", + "Copy the appearing link and open it in your browser, please": "Copy the appearing link and open it in your browser, please", + "Trigger find better subtitles": "Trigger find better subtitles", + "Skip next find better subtitles (sets last run to now)": "Skip next find better subtitles (sets last run to now)", + "Trigger subtitle storage maintenance": "Trigger subtitle storage maintenance", + "Trigger subtitle storage migration (expensive)": "Trigger subtitle storage migration (expensive)", + "Trigger cache maintenance (refiners, providers and packs/archives)": "Trigger cache maintenance (refiners, providers and packs/archives)", + "Apply configured default subtitle mods to all (active) stored subtitles": "Apply configured default subtitle mods to all (active) stored subtitles", + "Re-Apply mods of all stored subtitles": "Re-Apply mods of all stored subtitles", + "Log the plugin's scheduled tasks state storage": "Log the plugin's scheduled tasks state storage", + "Log the plugin's internal ignorelist storage": "Log the plugin's internal ignorelist storage", + "Log the plugin's complete state storage": "Log the plugin's complete state storage", + "Reset the plugin's scheduled tasks state storage": "Reset the plugin's scheduled tasks state storage", + "Reset the plugin's internal ignorelist storage": "Reset the plugin's internal ignorelist storage", + "Invalidate Sub-Zero metadata caches (subliminal)": "Invalidate Sub-Zero metadata caches (subliminal)", + "Reset provider throttle states": "Reset provider throttle states", + "Restarting the plugin": "Restarting the plugin", + "Restart triggered, please wait about 5 seconds": "Restart triggered, please wait about 5 seconds", + "Reset subtitle storage": "Reset subtitle storage", + "Are you sure?": "Are you sure?", + "Are you really sure?": "Are you really sure?", + "Success": "Success", + "FindBetterSubtitles triggered": "FindBetterSubtitles triggered", + "FindBetterSubtitles skipped": "FindBetterSubtitles skipped", + "SubtitleStorageMaintenance triggered": "SubtitleStorageMaintenance triggered", + "MigrateSubtitleStorage triggered": "MigrateSubtitleStorage triggered", + "TriggerCacheMaintenance triggered": "TriggerCacheMaintenance triggered", + "This may take some time ...": "This may take some time ...", + "Download Logs": "Download Logs", + "Sorry, feature unavailable": "Sorry, feature unavailable", + "Universal Plex token not available": "Universal Plex token not available", + "Copy this link and open this in your browser, please": "Copy this link and open this in your browser, please", + "Cache invalidated": "Cache invalidated", + "Enter PIN number ": "Enter PIN number ", + "PIN correct": "PIN correct", + "Reset": "Reset", + "Menu locked": "Menu locked", + "Provider throttles reset": "Provider throttles reset", + "Information Storage (%s) reset": "Information Storage (%s) reset", + "Information Storage (%s) logged": "Information Storage (%s) logged", + "Plex didn't return any information about the item, please refresh it and come back later": "Plex didn't return any information about the item, please refresh it and come back later", + "Item not found: %s!": "Item not found: %s!", + "< Back to %s": "< Back to %s", + "Back to %s > %s": "Back to %s > %s", + "Refresh: %s": "Refresh: %s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Issues a forced refresh, ignoring known subtitles and searching for new ones", + "Extract and activate embedded subtitle streams": "Extract and activate embedded subtitle streams", + "Inspect currently blacklisted subtitles": "Inspect currently blacklisted subtitles", + "Subtitle saved to disk": "Subtitle saved to disk", + "Remove subtitle from blacklist": "Remove subtitle from blacklist", + "No subtitles found": "No subtitles found", + " (unknown)": " (unknown)", + " (forced)": " (forced)", + "Extracting of embedded subtitle %s of part %s:%s triggered": "Extracting of embedded subtitle %s of part %s:%s triggered", + "Insufficient permissions": "Insufficient permissions", + "I'm not enabled!": "I'm not enabled!", + "Please enable me for some of your libraries in your server settings; currently I do nothing": "Please enable me for some of your libraries in your server settings; currently I do nothing", + "Working ... refresh here": "Working ... refresh here", + "Current state: %s; Last state: %s": "Current state: %s; Last state: %s", + "On-deck items": "On-deck items", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", + "Recently-added items": "Recently-added items", + "Recently played items": "Recently played items", + "Shows the recently added items per section.": "Shows the recently added items per section.", + "Show recently added items with missing subtitles": "Show recently added items with missing subtitles", + "Browse all items": "Browse all items", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.", + "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Last run: %s; Next scheduled run: %s; Last runtime: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)": "Search for missing subtitles (in recently-added items, max-age: %s)", + "Automatically run periodically by the scheduler, if configured. %s": "Automatically run periodically by the scheduler, if configured. %s", + "Show the current ignore list (mainly used for the automatic tasks)": "Show the current ignore list (mainly used for the automatic tasks)", + "History": "History", + "Show the last %i downloaded subtitles": "Show the last %i downloaded subtitles", + "Refresh": "Refresh", + "Re-lock menu(s)": "Re-lock menu(s)", + "Enabled the PIN again for menu(s)": "Enabled the PIN again for menu(s)", + "Throttled providers: %s": "Throttled providers: %s", + "Advanced functions": "Advanced functions", + "Use at your own risk": "Use at your own risk", + "Items On Deck": "Items On Deck", + "Recently Played": "Recently Played", + "Items with missing subtitles": "Items with missing subtitles", + "Find recent items with missing subtitles": "Find recent items with missing subtitles", + "Updating, refresh here ...": "Updating, refresh here ...", + "Missing: %s": "Missing: %s", + "Didn't change the ignore list": "Didn't change the ignore list", + "Sections": "Sections", + "All": "All", + "show": "show", + "movie": "movie", + "<< Back to home": "<< Back to home", + "Auto-Find subtitles: %s": "Auto-Find subtitles: %s", + "Extracting of embedded subtitles for %s triggered": "Extracting of embedded subtitles for %s triggered", + "< Back to subtitle options for: %s": "< Back to subtitle options for: %s", + "Remove last applied mod (%s)": "Remove last applied mod (%s)", + "none": "none", + "Manage applied mods": "Manage applied mods", + "Reapply applied mods": "Reapply applied mods", + "Restore original version": "Restore original version", + "< Back to subtitle modification menu": "< Back to subtitle modification menu", + "subs constantly getting faster": "subs constantly getting faster", + "subs constantly getting slower": "subs constantly getting slower", + "< Back to subtitle modifications": "< Back to subtitle modifications", + "< Back to unit selection": "< Back to unit selection", + "Subtitle Language (1)": "Subtitle Language (1)", + "Subtitle Language (2)": "Subtitle Language (2)", + "Subtitle Language (3)": "Subtitle Language (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)", + "Only download foreign/forced subtitles": "Only download foreign/forced subtitles", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Embedded subtitles: Treat \"Undefined\" (und) as language 1", + "I rename my files using": "I rename my files using", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "Retrieve original filename from .file_info/file_info index files (see wiki)", + "Sonarr URL (add URL base if configured)": "Sonarr URL (add URL base if configured)", + "Sonarr API key": "Sonarr API key", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "Radarr URL (add URL base if configured, min. version: 0.2.0.897)", + "Radarr API key": "Radarr API key", + "Provider: Enable OpenSubtitles": "Provider: Enable OpenSubtitles", + "Opensubtitles Username": "Opensubtitles Username", + "Opensubtitles Password": "Opensubtitles Password", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET": "Provider: Enable Podnapisi.NET", + "Provider: Enable Titlovi.com": "Provider: Enable Titlovi.com", + "Provider: Enable Addic7ed": "Provider: Enable Addic7ed", + "Addic7ed Username": "Addic7ed Username", + "Addic7ed Password": "Addic7ed Password", + "Addic7ed: boost score (if requirements met)": "Addic7ed: boost score (if requirements met)", + "Addic7ed: Use random user agents": "Addic7ed: Use random user agents", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", + "Legendas TV Username": "Legendas TV Username", + "Legendas TV Password": "Legendas TV Password", + "Provider: Enable TVsubtitles.net": "Provider: Enable TVsubtitles.net", + "Provider: Enable NapiProjekt.pl (Polish)": "Provider: Enable NapiProjekt.pl (Polish)", + "Provider: Enable SubScene (TV shows)": "Provider: Enable SubScene (TV shows)", + "Provider: Enable hosszupuskasub.com (Hungarian)": "Provider: Enable hosszupuskasub.com (Hungarian)", + "Provider: Enable aRGENTeaM (Spanish)": "Provider: Enable aRGENTeaM (Spanish)", + "Search enabled providers simultaneously (multithreading)": "Search enabled providers simultaneously (multithreading)", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Automatically extract and use embedded subtitles upon media addition (with configured default mods)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "After automatic extraction of embedded subtitles, also immediately search for available subtitles?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?", + "How strict should these subtitles existing on the filesystem be detected?": "How strict should these subtitles existing on the filesystem be detected?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)", + "Download hearing impaired subtitles.": "Download hearing impaired subtitles.", + "Remove Hearing Impaired tags from downloaded subtitles": "Remove Hearing Impaired tags from downloaded subtitles", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)", + "Fix common issues in subtitles": "Fix common issues in subtitles", + "Fix common OCR errors in downloaded subtitles": "Fix common OCR errors in downloaded subtitles", + "Reverse punctuation in RTL languages (heb)": "Reverse punctuation in RTL languages (heb)", + "Change colors of subtitles to": "Change colors of subtitles to", + "Store subtitles next to media files (instead of metadata)": "Store subtitles next to media files (instead of metadata)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Subtitle formats to save (non-SRT only works if the previous option is enabled)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "Subtitle Folder (\"current folder\" is the folder the current media file lives in)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)", + "Fall back to metadata storage if filesystem storage failed": "Fall back to metadata storage if filesystem storage failed", + "Set subtitle file permissions to (integer, e.g.: 0775)": "Set subtitle file permissions to (integer, e.g.: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles": "Automatically delete leftover/unused (externally saved) subtitles", + "On media playback: search for missing subtitles (refresh item)": "On media playback: search for missing subtitles (refresh item)", + "Scheduler: Periodically search for recent items with missing subtitles": "Scheduler: Periodically search for recent items with missing subtitles", + "Scheduler: Item age to be considered recent": "Scheduler: Item age to be considered recent", + "Scheduler: Recent items to consider per library": "Scheduler: Recent items to consider per library", + "Scheduler: Periodically search for better subtitles": "Scheduler: Periodically search for better subtitles", + "Scheduler: Days to search for better subtitles (max: 30 days)": "Scheduler: Days to search for better subtitles (max: 30 days)", + "Scheduler: Don't search for better subtitles if the item's air date is older than": "Scheduler: Don't search for better subtitles if the item's air date is older than", + "Scheduler: Overwrite manually selected subtitles when better found": "Scheduler: Overwrite manually selected subtitles when better found", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found", + "History: amount of items to store historical data for": "History: amount of items to store historical data for", + "How many download tries per subtitle (on timeout or error)": "How many download tries per subtitle (on timeout or error)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)", + "Ignore anything in the following paths (comma-separated)": "Ignore anything in the following paths (comma-separated)", + "Sub-Zero mode": "Sub-Zero mode", + "Access PIN (any amount of numbers, 0-9)": "Access PIN (any amount of numbers, 0-9)", + "Access PIN valid for minutes": "Access PIN valid for minutes", + "Use PIN to restrict access to (needs plugin or PMS restart)": "Use PIN to restrict access to (needs plugin or PMS restart)", + "Call this executable upon successful subtitle download (see Wiki for details)": "Call this executable upon successful subtitle download (see Wiki for details)", + "Check for correct folder permissions of every library on plugin start": "Check for correct folder permissions of every library on plugin start", + "Use new style caching (for subliminal)": "Use new style caching (for subliminal)", + "Low impact mode (for remote filesystems)": "Low impact mode (for remote filesystems)", + "Timeout for API requests sent to the PMS": "Timeout for API requests sent to the PMS", + "HTTP proxy to use for providers (supports credentials)": "HTTP proxy to use for providers (supports credentials)", + "How verbose should the logging be?": "How verbose should the logging be?", + "How many log backups to keep?": "How many log backups to keep?", + "Log subtitle modification (debug)": "Log subtitle modification (debug)", + "Log to console (for development/debugging)": "Log to console (for development/debugging)", + "Collect anonymous usage statistics": "Collect anonymous usage statistics", + "Sonarr/Radarr (fill api info below)": "Sonarr/Radarr (fill api info below)", + "Filebot": "Filebot", + "Sonarr/Radarr/Filebot": "Sonarr/Radarr/Filebot", + "Symlink to original file": "Symlink to original file", + "I keep the original filenames": "I keep the original filenames", + "none of the above": "none of the above", + "exact: media filename match": "exact: media filename match", + "loose: filename contains media filename": "loose: filename contains media filename", + "any": "any", + "prefer": "prefer", + "don't prefer": "don't prefer", + "force HI": "force HI", + "force non-HI": "force non-HI", + "don't change": "don't change", + "white": "white", + "light-grey": "light-grey", + "red": "red", + "green": "green", + "yellow": "yellow", + "blue": "blue", + "magenta": "magenta", + "cyan": "cyan", + "black": "black", + "dark-red": "dark-red", + "dark-green": "dark-green", + "dark-yellow": "dark-yellow", + "dark-blue": "dark-blue", + "dark-magenta": "dark-magenta", + "dark-cyan": "dark-cyan", + "dark-grey": "dark-grey", + "current folder": "current folder", + "never": "never", + "current media item": "current media item", + "next episode (series)": "next episode (series)", + "hybrid: current item or next episode": "hybrid: current item or next episode", + "hybrid-plus: current item and next episode": "hybrid-plus: current item and next episode", + "every 6 hours": "every 6 hours", + "every 12 hours": "every 12 hours", + "every 24 hours": "every 24 hours", + "1 days": "1 days", + "2 days": "2 days", + "3 days": "3 days", + "4 days": "4 days", + "1 weeks": "1 weeks", + "2 weeks": "2 weeks", + "3 weeks": "3 weeks", + "4 weeks": "4 weeks", + "5 weeks": "5 weeks", + "6 weeks": "6 weeks", + "12 weeks": "12 weeks", + "don't limit": "don't limit", + "1 year": "1 year", + "2 years": "2 years", + "3 years": "3 years", + "4 years": "4 years", + "5 years": "5 years", + "6 years": "6 years", + "7 years": "7 years", + "8 years": "8 years", + "9 years": "9 years", + "10 years": "10 years", + "only agent": "only agent", + "disabled": "disabled", + "advanced menu": "advanced menu", + "CRITICAL": "CRITICAL", + "ERROR": "ERROR", + "WARNING": "WARNING", + "INFO": "INFO", + "DEBUG": "DEBUG", + "Force-find subtitles: %(item_title)s": "Force-find subtitles: %(item_title)s", + "File %(file_part_index)s: ": "File %(file_part_index)s: ", + "%(part_summary)sNo current subtitle in storage": "%(part_summary)sNo current subtitle in storage", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)sManage %(language)s subtitle", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)sList %(language)s subtitles", + "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sEmbedded subtitles (%(languages)s)", + "Select active %(language)s subtitle": "Select active %(language)s subtitle", + "%(count)d subtitles in storage": "%(count)d subtitles in storage", + "List available %(language)s subtitles": "List available %(language)s subtitles", + "Modify current %(language)s subtitle": "Modify current %(language)s subtitle", + "Currently applied mods: %(mod_list)s": "Currently applied mods: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one": "Blacklist current %(language)s subtitle and search for a new one", + "Manage blacklist (%(amount)s contained)": "Manage blacklist (%(amount)s contained)", + "%(current_state)s%(subtitle_name)s, Score: %(score)s": "%(current_state)s%(subtitle_name)s, Score: %(score)s", + "Current: ": "Current: ", + "Stored: ": "Stored: ", + "by %(release_group)s": "by %(release_group)s", + "Current: %(provider_name)s (%(score)s) ": "Current: %(provider_name)s (%(score)s) ", + "Search for %(language)s subs (%(video_data)s)": "Search for %(language)s subs (%(video_data)s)", + "%(current_info)sFilename: %(filename)s": "%(current_info)sFilename: %(filename)s", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "Searching for %(language)s subs (%(video_data)s), refresh here ...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s": "Release: %(release_info)s, Matches: %(matches)s", + "Downloading subtitle for %(title_or_id)s": "Downloading subtitle for %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "Insufficient permissions on library %(title)s, folder: %(path)s": "Insufficient permissions on library %(title)s, folder: %(path)s", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Display ignore list (%(ignored_count)d)": "Display ignore list (%(ignored_count)d)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s until %(until_date)s (%(reason)s)", + "Extracting subtitle %(stream_index)s of %(filename)s": "Extracting subtitle %(stream_index)s of %(filename)s", + "Extract missing %(language)s embedded subtitles": "Extract missing %(language)s embedded subtitles", + "Extract and activate %(language)s embedded subtitles": "Extract and activate %(language)s embedded subtitles", + "None": "None", + "Idle": "Idle", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "Adjust by %(time_and_unit)s": "Adjust by %(time_and_unit)s", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "Remove: %(mod_name)s": "Remove: %(mod_name)s", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Subtitle download failed (%(item_id)s)", + "agent + interface": "agent + interface", + "only interface": "only interface", + "interface": "interface", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list", + "Add %(kind)s %(title)s to the ignore list": "Add %(kind)s %(title)s to the ignore list", + "Remove %(kind)s %(title)s from the ignore list": "Remove %(kind)s %(title)s from the ignore list", + "%(title)s added to the ignore list": "%(title)s added to the ignore list", + "%(title)s removed from the ignore list": "%(title)s removed from the ignore list", + "Triggering refresh for %(title)s": "Triggering refresh for %(title)s", + "Triggering forced refresh for %(title)s": "Triggering forced refresh for %(title)s", + "Refresh of item %(item_id)s triggered": "Refresh of item %(item_id)s triggered", + "Forced refresh of item %(item_id)s triggered": "Forced refresh of item %(item_id)s triggered", + "Ignore %(kind)s \"%(title)s\"": "Ignore %(kind)s \"%(title)s\"", + "Un-ignore %(kind)s \"%(title)s\"": "Un-ignore %(kind)s \"%(title)s\"", + "Refreshing %(title)s": "Refreshing %(title)s", + "Force-refreshing %(title)s": "Force-refreshing %(title)s", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "Extracts embedded subtitles of all episodes for the current season with all configured default modifications", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk", + "the movie": "the movie", + "the series": "the series", + "the episode": "the episode", + "the season": "the season", + "Change the color of the subtitle": "Change the color of the subtitle", + "Adds the requested color to every line of the subtitle. Support depends on player.": "Adds the requested color to every line of the subtitle. Support depends on player.", + "Basic common fixes": "Basic common fixes", + "Fix common and whitespace/punctuation issues in subtitles": "Fix common and whitespace/punctuation issues in subtitles", + "Remove all style tags": "Remove all style tags", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.": "Removes all possible style tags from the subtitle, such as font, bold, color etc.", + "Reverse punctuation in RTL languages": "Reverse punctuation in RTL languages", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew": "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew", + "Change the FPS of the subtitle": "Change the FPS of the subtitle", + "Re-syncs the subtitle to the framerate of the current media file.": "Re-syncs the subtitle to the framerate of the current media file.", + "Remove Hearing Impaired tags": "Remove Hearing Impaired tags", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people": "Removes tags, text and characters from subtitles that are meant for hearing impaired people", + "Fix common OCR issues": "Fix common OCR issues", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR": "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR", + "Change the timing of the subtitle": "Change the timing of the subtitle", + "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Adds or substracts a certain amount of time from the whole subtitle to match your media", + "Available": "Available", + "Current": "Current", + "Custom path to advanced_settings.json": "Custom path to advanced_settings.json", + "zh-hant": "Chinese (Traditional)", + "zh-hans": "Chinese (Simplified)", + "Reset the plugin's menu history storage": "Reset the plugin's menu history storage", + "forced": "forced", + "%s in %s (%s, score: %s), %s": "%s in %s (%s, score: %s), %s", + "Extract embedded subtitle streams": "Extract embedded subtitle streams", + "Display %(incl_excl_list_name)s (%(count)d)": "Display %(incl_excl_list_name)s list (%(count)d)", + "include list": "include list", + "ignore list": "ignore list", + "Include list": "Include list", + "Ignore list": "Ignore list", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "Show the current %(incl_excl_list_name)s list (mainly used for the automatic tasks)", + "Didn't change the %(incl_excl_list_name)s": "Didn't change the %(incl_excl_list_name)s", + "%(title)s added to the include list": "%(title)s added to the include list", + "%(title)s removed from the include list": "%(title)s removed from the include list", + "Enable Sub-Zero for %(kind)s \"%(title)s\"": "Enable Sub-Zero for %(kind)s \"%(title)s\"", + "Disable Sub-Zero for %(kind)s \"%(title)s\"": "Disable Sub-Zero for %(kind)s \"%(title)s\"", + "Download subtitles": "Download subtitles", + "Never": "Never", + "Always": "Always", + "When main audio stream is not Subtitle Language (1)": "When main audio stream is not Subtitle Language (1)", + "When main audio stream is not any configured language": "When main audio stream is not any configured language", + "When any audio stream is not Subtitle Language (1)": "When any audio stream is not Subtitle Language (1)", + "When any audio stream is not any configured language": "When any audio stream is not any configured language", + "Download foreign/forced subtitles": "Download foreign/forced subtitles", + "Only for Subtitle Language (1)": "Only for Subtitle Language (1)", + "Only for Subtitle Language (2)": "Only for Subtitle Language (2)", + "Only for Subtitle Language (3)": "Only for Subtitle Language (3)", + "Embedded streams: Treat \"Undefined\" (und) as language 1": "Embedded streams: Treat \"Undefined\" (und) as language 1", + "Reverse punctuation in RTL languages (heb, ara, fas)": "Reverse punctuation in RTL languages (heb, ara, fas)", + "Fix only uppercase downloaded subtitles": "Fix only uppercase downloaded subtitles", + "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)", + "enable SZ for all items by default, use ignore mode": "enable SZ for all items by default, use ignore mode", + "disable SZ for all items by default, use include mode": "disable SZ for all items by default, use include mode", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders", + "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)", + "auto": "auto", + "manual": "manual", + "auto-better": "auto-better", + "Unknown": "Unknown", + "embedded": "embedded", + "Use Google DNS (for \"problematic\" countries)": "Use Google DNS (for \"problematic\" countries)" +} \ No newline at end of file From e504a6b97ad75f8c9d07871358a0f8e0bf2536cd Mon Sep 17 00:00:00 2001 From: pannal Date: Wed, 7 Nov 2018 13:53:33 +0100 Subject: [PATCH 295/710] Update de.json (POEditor.com) --- Contents/Strings/de.json | 80 ++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 36 deletions(-) diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index b49a359d9..8af2c20bc 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -66,7 +66,6 @@ "Log the plugin's complete state storage": "Den kompletten internen State-Speicher protokollieren", "Reset the plugin's scheduled tasks state storage": "Den Geplante-Aufgaben-Status-Speicher zurücksetzen", "Reset the plugin's internal ignorelist storage": "Den internen Ignore-Listen-Speicher zurücksetzen", - "Reset the plugin's menu history storage": "Den internen Menühistorie-Speicher zurücksetzen", "Invalidate Sub-Zero metadata caches (subliminal)": "Die Sub-Zero Metadaten-Caches invalidieren (subliminal)", "Reset provider throttle states": "Den Anbieter-Drosselungsstatus zurücksetzen", "Restarting the plugin": "Starte das Plugin neu", @@ -123,7 +122,7 @@ "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Letzter Durchlauf: %s; Nächster geplanter Durchlauf: %s; Letzte Laufzeit: %s", "Search for missing subtitles (in recently-added items, max-age: %s)": "Nach fehlenden Untertiteln suchen (für zuletzt hinzugefügte Medien, maximales Alter: %s)", "Automatically run periodically by the scheduler, if configured. %s": "Automatisch regelmäßig vom Scheduler ausgeführt, wenn konfiguriert. %s", - "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "Zeige die aktuelle %(incl_excl_list_name)s (hauptsächlich für Hintergrundaufgaben genutzt)", + "Show the current ignore list (mainly used for the automatic tasks)": "Zeige die aktuelle Ignore-Liste (hauptsächlich für Hintergrundaufgaben genutzt)", "History": "Verlauf", "Show the last %i downloaded subtitles": "Zeige die letzten %i heruntergeladenen Untertitel", "Refresh": "Aktualisieren", @@ -138,7 +137,7 @@ "Find recent items with missing subtitles": "Finde zuletzt hinzugefügte Medien mit fehlenden Untertiteln", "Updating, refresh here ...": "Update, hier aktualisieren ...", "Missing: %s": "Fehlt: %s", - "Didn't change the %(incl_excl_list_name)s": "%(incl_excl_list_name)s wurde nicht verändert", + "Didn't change the ignore list": "Ignore-Liste wurde nicht verändert", "Sections": "Bereiche", "All": "Alle", "show": "Serie", @@ -161,21 +160,11 @@ "Subtitle Language (2)": "Untertitel-Sprache (2)", "Subtitle Language (3)": "Untertitel-Sprache (3)", "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "Weitere Untertitel-Sprachen (ISO-639-1 Kodierung benutzen, kommagetrennt)", - "Download subtitles": "Untertitel herunterladen", - "Never": "Nie", - "Always": "Immer", - "When main audio stream is not Subtitle Language (1)": "Wenn der Haupt-Audiostream nicht Subtitle Sprache (1) entspricht", - "When main audio stream is not any configured language": "Wenn der Haupt-Audiostream nicht irgendeiner konfigurierten Sprache entspricht", - "When any audio stream is not Subtitle Language (1)": "Wenn keiner der Audiostreams Subtitle Sprache (1) entspricht", - "When any audio stream is not any configured language": "Wenn keiner der Audiostreams irgendeiner konfigurierten Sprache entspricht", - "Download foreign/forced subtitles": "Erzwungende/fremdsprachige Untertitel herunterladen", - "Only for Subtitle Language (1)": "Nur für Untertitel Sprache (1)", - "Only for Subtitle Language (2)": "Nur für Untertitel Sprache (2)", - "Only for Subtitle Language (3)": "Nur für Untertitel Sprache (3)", + "Only download foreign/forced subtitles": "Nur erzwungende/fremdsprachige Untertitel herunterladen", "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Sprachen mit Landesattribut als ISO 639-1 anzeigen (z. B. pt-BR = pt)", "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Sprachen mit Landesattribut als ISO 639-1 behandeln (pt-BR nicht herunterladen, wenn ein pt Untertitel existiert)", "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Auf eine Sprache beschränken (fügt dem Dateinamen kein \".lang.\"-Suffix hinzu; benutzt nur \"Untertitel Sprache (1)\")", - "Embedded streams: Treat \"Undefined\" (und) as language 1": "Eingebettete Streams: behandle Unbekannte Sprache als Sprache 1", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Eingebettete Untertitel: behandle Unbekannte Sprache als Sprache 1", "I rename my files using": "Ich benenne meine Dateien um, mit:", "Retrieve original filename from .file_info/file_info index files (see wiki)": "Originale Dateinamen von .file_info/file_info Indexdateien beziehen (siehe Wiki)", "Sonarr URL (add URL base if configured)": "Sonarr URL (URL-Basis hinzufügen, wenn konfiguriert)", @@ -215,8 +204,7 @@ "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Textformatierungen von heruntergeladenen Untertiteln entfernen (fett, kursiv, unterstrichen, Farben, ...)", "Fix common issues in subtitles": "Häufige Probleme in Untertiteln beheben", "Fix common OCR errors in downloaded subtitles": "Häufige Texterkennungsfehler in Untertiteln beheben", - "Reverse punctuation in RTL languages (heb, ara, fas)": "Zeichensetzung in linksläufigen Schriften umkehren (heb, ara, fas)", - "Fix only uppercase downloaded subtitles": "Nur-Großschreibung in Untertiteln beheben", + "Reverse punctuation in RTL languages (heb)": "Zeichensetzung in linksläufigen Schriften umkehren (heb)", "Change colors of subtitles to": "Farbe der Untertitel ändern zu", "Store subtitles next to media files (instead of metadata)": "Speichere Untertitel neben den Medien (anstatt im Metadatenspeicher)", "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Zu speichernde Untertitelformate (Nicht-SRT funktioniert nur, wenn die vorherige Option aktiv ist)", @@ -236,11 +224,8 @@ "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Hintergrundaufgaben: Untertitel mit Nicht-Standard-Modifikationen überschreiben, wenn bessere gefunden wurden", "History: amount of items to store historical data for": "Verlauf: Anzahl der Elemente", "How many download tries per subtitle (on timeout or error)": "Wie oft soll der Download pro Untertitel versucht werden (bei Fehlern)", - "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "Soll SZ standardmäßig aktiviert oder deaktiviert sein? (Beeinflusst Einstellungen und Menü)", - "enable SZ for all items by default, use ignore mode": "SZ standardmäßig für alle Medien aktivieren, benutze Ignore-Modus", - "disable SZ for all items by default, use include mode": "SZ standardmäßig für alle Medien deaktivieren, benutze Include-Modus", - "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "Benutze \"subzero.ignore/.subzero.ignore/.nosz\" (Ignore-Modus) oder \"subzero.include/.subzero.include/.sz\" (Include-Modus) Dateien in Ordnern", - "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "Aktiviere/deaktiviere Sub-Zero für folgende Pfade (kommasepariert; siehe Einstellung oben)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "Ignoriere Ordner mit \"subzero.ignore/.subzero.ignore/.nosz\"-Dateien", + "Ignore anything in the following paths (comma-separated)": "Ignoriere folgende Pfade", "Sub-Zero mode": "Sub-Zero Modus", "Access PIN (any amount of numbers, 0-9)": "Zugriffs-PIN (beliebige Anzahl Zahlen, 0-9)", "Access PIN valid for minutes": "Zugriffs-PIN gültig für Minuten", @@ -250,7 +235,6 @@ "Use new style caching (for subliminal)": "Modernes Caching benutzen (für subliminal)", "Low impact mode (for remote filesystems)": "Belastungsarmer Modus (für rechnerferne Dateisysteme)", "Timeout for API requests sent to the PMS": "Timeout für Plex-API-Anfragen", - "Use Google DNS (for \"problematic\" countries)": "Google DNS benutzen (für \"problematische\" Länder)", "HTTP proxy to use for providers (supports credentials)": "Benutze HTTP-Proxy für Untertitel-Anbieter (unterstützt Anmeldeinformationen)", "How verbose should the logging be?": "Wie ausführlich soll die Protokollierung sein?", "How many log backups to keep?": "Wie viele Protokoll-Sicherungen sollen behalten werden?", @@ -333,8 +317,6 @@ "%(part_summary)sManage %(language)s subtitle": "%(part_summary)s%(language)s: Untertitel verwalten", "%(part_summary)sList %(language)s subtitles": "%(part_summary)s%(language)s: Untertitel auflisten", "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sEingebettete Untertitel (%(languages)s)", - "%s in %s (%s, score: %s), %s": "%s in %s (%s, Punktzahl: %s), %s", - "Extract embedded subtitle streams": "Eingebettete Untertitel extrahieren", "Select active %(language)s subtitle": "%(language)s: Aktiven Untertitel auswählen", "%(count)d subtitles in storage": "%(count)d Untertitel im Speicher", "List available %(language)s subtitles": "%(language)s: Verfügbare Untertitel auflisten", @@ -360,11 +342,7 @@ "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (hinzugefügt: %(date_added)s, %(mode)s), Sprache: %(language)s, Punktzahl: %(score)i, Speicher: %(storage_type)s", "Insufficient permissions on library %(title)s, folder: %(path)s": "Ungenügende Berechtigungen der Bibliothek %(title)s, Ordner: %(path)s", "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Läuft: %(items_done)s/%(items_searching)s (%(percentage)s%%)", - "Display %(incl_excl_list_name)s (%(count)d)": "%(incl_excl_list_name)s anzeigen (%(count)d)", - "include list": "Include-Liste", - "ignore list": "Ignore-Liste", - "Include list": "Include-Liste", - "Ignore list": "Ignore-Liste", + "Display ignore list (%(ignored_count)d)": "Ignore-Liste anzeigen (%(ignored_count)d)", "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s bis %(until_date)s (%(reason)s)", "Extracting subtitle %(stream_index)s of %(filename)s": "Extrahiere Untertitel %(stream_index)s von %(filename)s", "Extract missing %(language)s embedded subtitles": "%(language)s: Extrahiere fehlende, eingebettete Untertitel", @@ -385,16 +363,12 @@ "Remove %(kind)s %(title)s from the ignore list": "Entferne %(kind)s %(title)s von der Ignore-Liste", "%(title)s added to the ignore list": "%(title)s zur Ignore-Liste hinzugefügt", "%(title)s removed from the ignore list": "%(title)s von der Ignore-Liste entfernt", - "%(title)s added to the include list":"%(title)s zur Include-Liste hinzugefügt", - "%(title)s removed from the include list":"%(title)s von der Include-Liste entfernt", "Triggering refresh for %(title)s": "Stoße Aktualisierung an, für: %(title)s", "Triggering forced refresh for %(title)s": "Stoße erzwungene Aktualisieren an, für %(title)s", "Refresh of item %(item_id)s triggered": "Aktualisierung von %(item_id)s angestoßen", "Forced refresh of item %(item_id)s triggered": "Erzwungene Aktualisierung von %(item_id)s angestoßen", "Ignore %(kind)s \"%(title)s\"": "%(kind)s \"%(title)s\" ignorieren", "Un-ignore %(kind)s \"%(title)s\"": "%(kind)s \"%(title)s\" nicht mehr ignorieren", - "Enable Sub-Zero for %(kind)s \"%(title)s\"": "Aktiviere Sub-Zero für %(kind)s \"%(title)s\"", - "Disable Sub-Zero for %(kind)s \"%(title)s\"": "Deaktiviere Sub-Zero für %(kind)s \"%(title)s\"", "Refreshing %(title)s": "Aktualisiere %(title)s", "Force-refreshing %(title)s": "Erzwinge Aktualisierung von %(title)s", "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Extrahiert die noch nicht extrahierten, eingebetteten Untertitel aller Episoden der aktuellen Staffel, mit allen konfigurierten Standard-Modifikationen", @@ -404,7 +378,6 @@ "the series": "die Serie", "the episode": "die Episode", "the season": "die Staffel", - "forced": "erzwungen", "Change the color of the subtitle": "Untertitel-Farben ändern", "Adds the requested color to every line of the subtitle. Support depends on player.": "Fügt die gewählte Farbe zu jeder Untertitelzeile hinzu. Wird nicht von jedem Abspielgerät unterstützt", "Basic common fixes": "Behebe häufige Probleme in Untertiteln", @@ -426,9 +399,44 @@ "Custom path to advanced_settings.json": "Spezifischer Pfad zu advanced_settings.json", "zh-hant": "Chinesisch (traditionell)", "zh-hans": "Chinesisch (vereinfacht)", + "Reset the plugin's menu history storage": "Den internen Menühistorie-Speicher zurücksetzen", + "forced": "erzwungen", + "%s in %s (%s, score: %s), %s": "%s in %s (%s, Punktzahl: %s), %s", + "Extract embedded subtitle streams": "Eingebettete Untertitel extrahieren", + "Display %(incl_excl_list_name)s (%(count)d)": "%(incl_excl_list_name)s anzeigen (%(count)d)", + "include list": "Include-Liste", + "ignore list": "Ignore-Liste", + "Include list": "Include-Liste", + "Ignore list": "Ignore-Liste", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "Zeige die aktuelle %(incl_excl_list_name)s (hauptsächlich für Hintergrundaufgaben genutzt)", + "Didn't change the %(incl_excl_list_name)s": "%(incl_excl_list_name)s wurde nicht verändert", + "%(title)s added to the include list": "%(title)s zur Include-Liste hinzugefügt", + "%(title)s removed from the include list": "%(title)s von der Include-Liste entfernt", + "Enable Sub-Zero for %(kind)s \"%(title)s\"": "Aktiviere Sub-Zero für %(kind)s \"%(title)s\"", + "Disable Sub-Zero for %(kind)s \"%(title)s\"": "Deaktiviere Sub-Zero für %(kind)s \"%(title)s\"", + "Download subtitles": "Untertitel herunterladen", + "Never": "Nie", + "Always": "Immer", + "When main audio stream is not Subtitle Language (1)": "Wenn der Haupt-Audiostream nicht Subtitle Sprache (1) entspricht", + "When main audio stream is not any configured language": "Wenn der Haupt-Audiostream nicht irgendeiner konfigurierten Sprache entspricht", + "When any audio stream is not Subtitle Language (1)": "Wenn keiner der Audiostreams Subtitle Sprache (1) entspricht", + "When any audio stream is not any configured language": "Wenn keiner der Audiostreams irgendeiner konfigurierten Sprache entspricht", + "Download foreign/forced subtitles": "Erzwungende/fremdsprachige Untertitel herunterladen", + "Only for Subtitle Language (1)": "Nur für Untertitel Sprache (1)", + "Only for Subtitle Language (2)": "Nur für Untertitel Sprache (2)", + "Only for Subtitle Language (3)": "Nur für Untertitel Sprache (3)", + "Embedded streams: Treat \"Undefined\" (und) as language 1": "Eingebettete Streams: behandle Unbekannte Sprache als Sprache 1", + "Reverse punctuation in RTL languages (heb, ara, fas)": "Zeichensetzung in linksläufigen Schriften umkehren (heb, ara, fas)", + "Fix only uppercase downloaded subtitles": "Nur-Großschreibung in Untertiteln beheben", + "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "Soll SZ standardmäßig aktiviert oder deaktiviert sein? (Beeinflusst Einstellungen und Menü)", + "enable SZ for all items by default, use ignore mode": "SZ standardmäßig für alle Medien aktivieren, benutze Ignore-Modus", + "disable SZ for all items by default, use include mode": "SZ standardmäßig für alle Medien deaktivieren, benutze Include-Modus", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "Benutze \"subzero.ignore/.subzero.ignore/.nosz\" (Ignore-Modus) oder \"subzero.include/.subzero.include/.sz\" (Include-Modus) Dateien in Ordnern", + "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "Aktiviere/deaktiviere Sub-Zero für folgende Pfade (kommasepariert; siehe Einstellung oben)", "auto": "auto", "manual": "manuell", "auto-better": "auto-besser", "Unknown": "Unbekannt", - "embedded": "eingebettet" + "embedded": "eingebettet", + "Use Google DNS (for \"problematic\" countries)": "Google DNS benutzen (für \"problematische\" Länder)" } \ No newline at end of file From b8ceeab46e99272609658f5fbf406064eed65fc5 Mon Sep 17 00:00:00 2001 From: pannal Date: Wed, 7 Nov 2018 13:53:35 +0100 Subject: [PATCH 296/710] Update hu.json (POEditor.com) --- Contents/Strings/hu.json | 44 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/Contents/Strings/hu.json b/Contents/Strings/hu.json index 555722ac1..6d2809787 100644 --- a/Contents/Strings/hu.json +++ b/Contents/Strings/hu.json @@ -396,5 +396,47 @@ "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Hozzáad vagy elvesz a feliratból egy bizonyos időtartamot hogy illeszkedjen a médiához.", "Available": "Elérhető", "Current": "Jelenlegi", - "Custom path to advanced_settings.json": "Egyéni útvonal az advanced_settings.json fájlhoz" + "Custom path to advanced_settings.json": "Egyéni útvonal az advanced_settings.json fájlhoz", + "zh-hant": "Kínai (Tradicionális)", + "zh-hans": "Kínai (Egyszerűsített)", + "Reset the plugin's menu history storage": "", + "forced": "", + "%s in %s (%s, score: %s), %s": "", + "Extract embedded subtitle streams": "", + "Display %(incl_excl_list_name)s (%(count)d)": "", + "include list": "", + "ignore list": "", + "Include list": "", + "Ignore list": "", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "", + "Didn't change the %(incl_excl_list_name)s": "", + "%(title)s added to the include list": "", + "%(title)s removed from the include list": "", + "Enable Sub-Zero for %(kind)s \"%(title)s\"": "", + "Disable Sub-Zero for %(kind)s \"%(title)s\"": "", + "Download subtitles": "", + "Never": "", + "Always": "", + "When main audio stream is not Subtitle Language (1)": "", + "When main audio stream is not any configured language": "", + "When any audio stream is not Subtitle Language (1)": "", + "When any audio stream is not any configured language": "", + "Download foreign/forced subtitles": "", + "Only for Subtitle Language (1)": "", + "Only for Subtitle Language (2)": "", + "Only for Subtitle Language (3)": "", + "Embedded streams: Treat \"Undefined\" (und) as language 1": "", + "Reverse punctuation in RTL languages (heb, ara, fas)": "", + "Fix only uppercase downloaded subtitles": "", + "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "", + "enable SZ for all items by default, use ignore mode": "", + "disable SZ for all items by default, use include mode": "", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "", + "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "", + "auto": "", + "manual": "", + "auto-better": "", + "Unknown": "", + "embedded": "", + "Use Google DNS (for \"problematic\" countries)": "" } \ No newline at end of file From 2ccd568ea2abbd5315970dfdf3453b2f21601cc0 Mon Sep 17 00:00:00 2001 From: pannal Date: Wed, 7 Nov 2018 13:53:37 +0100 Subject: [PATCH 297/710] Update es.json (POEditor.com) --- Contents/Strings/es.json | 92 +++++++++++++++++++++++++++++----------- 1 file changed, 67 insertions(+), 25 deletions(-) diff --git a/Contents/Strings/es.json b/Contents/Strings/es.json index 69d91505d..6fb547bdb 100644 --- a/Contents/Strings/es.json +++ b/Contents/Strings/es.json @@ -59,7 +59,7 @@ "Trigger subtitle storage maintenance": "Provocar el mantenimiento del almacenamiento de subtítulos", "Trigger subtitle storage migration (expensive)": "Provocar la migración del almacenamiento de subtítulos (lento)", "Trigger cache maintenance (refiners, providers and packs/archives)": "Provocar el mantenimiento de la caché (refinadores, proveedores y paquetes)", - "Apply configured default subtitle mods to all (active) stored subtitles": "Aplicar las modificaciones de la configuración de subtítulos a todos los almacenados y activos", + "Apply configured default subtitle mods to all (active) stored subtitles": "Aplicar las modificaciones de la configuración de subtítulos a todos los subtítulos \nalmacenados y activos", "Re-Apply mods of all stored subtitles": "Reaplicar modificaciones a todos los subtítulos almacenados", "Log the plugin's scheduled tasks state storage": "Anotar en el log las tareas de las descargar programadas del plugin", "Log the plugin's internal ignorelist storage": "Anotar en el log la lista a ignorar en las descargas", @@ -96,7 +96,7 @@ "Item not found: %s!": "¡Elemento no encontrado: %s!", "< Back to %s": "< Regresar a %s", "Back to %s > %s": "Regresar a %s > %s", - "Refresh: %s": "Actualizar: %s", + "Refresh: %s": "Refrescar: %s", "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Ejecuta una actualización forzada, ignorando subtítulos presentes y buscando nuevos", "Extract and activate embedded subtitle streams": "Extraer y activar subtítulos integrados", "Inspect currently blacklisted subtitles": "Inspeccionar la actual lista de bloqueados", @@ -112,26 +112,26 @@ "Working ... refresh here": "Trabajando... refresque aquí", "Current state: %s; Last state: %s": "Estado actual: %s; Último estado: %s", "On-deck items": "Archivos On-deck", - "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "Muestra los últimos %s elementos reproducidos y permite actualizar individualmente sus metadatos y subtítulos.", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "Muestra los últimos %s elementos reproducidos y permite refrescar individualmente sus metadatos y subtítulos.", "Recently-added items": "Elementos recién añadidos", "Recently played items": "Elementos recién reproducidos", "Shows the recently added items per section.": "Muestra los elementos recién añadidos por sección.", - "Show recently added items with missing subtitles": "Muestra los elementos recién añadidos sin subtítulos", + "Show recently added items with missing subtitles": "Mostrar los elementos recién añadidos sin subtítulos", "Browse all items": "Ver todos los elementos", - "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Navega a través de la colección completa y gestiona la Lista de Ignorados. Puede además actualizar individualmente sus metadatos y subtítulos", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Navega a través de la colección completa y gestiona la Lista de Ignorados. Puede además refrescar individualmente sus metadatos y subtítulos", "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Última ejecución: %s; Próxima ejecución: %s; Duración de la última ejecución: %s", "Search for missing subtitles (in recently-added items, max-age: %s)": "Buscar subtítulos faltantes (en elementos recién añadidos, antigüedad máxima: %s)", "Automatically run periodically by the scheduler, if configured. %s": "Ejecuta automáticamente las tareas programadas, si están configuradas. %s", "Show the current ignore list (mainly used for the automatic tasks)": "Muestra la Lista de Ignorados actual (principalmente usado por tareas automáticas)", "History": "Historial", "Show the last %i downloaded subtitles": "Muestra lo últimos %i subtítulos descargados", - "Refresh": "Actualizar", + "Refresh": "Refrescar", "Re-lock menu(s)": "Bloquear menús", "Enabled the PIN again for menu(s)": "Habilitado el PIN de nuevo en los menús", "Throttled providers: %s": "Proveedores ralentizados: %s", "Advanced functions": "Funciones avanzadas", "Use at your own risk": "Use bajo su responsabilidad", - "Items On Deck": "Elementos On Deck", + "Items On Deck": "Elementos En Progreso", "Recently Played": "Recién Reproducidos", "Items with missing subtitles": "Elementos sin subtítulos", "Find recent items with missing subtitles": "Buscar elementos recientes sin subtítulos", @@ -161,15 +161,15 @@ "Subtitle Language (3)": "Idioma del Subtítulo (3)", "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "Idiomas adicionales de subtítulos (use códigos ISO-639-1 separados por comas)", "Only download foreign/forced subtitles": "Descargar sólo subtítulos extranjeros o forzados", - "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Mostar idiomas con atributos de país tipo ISO 639-1 (p. ej. pt-BR = pt)", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Mostrar idiomas con atributos de país tipo ISO 639-1 (p. ej. pt-BR = pt)", "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Tratar idiomas con atributos de país como ISO 639-1 (es decir, no descargar pt-BR si existe un subtítulo pt)", - "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Restringir a un idioma (evita añadir \".lang\" al nombre del fichero del subtítulo; solo usa el \"Idioma del Subtítulo (1)\"", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Restringir a un idioma (evita añadir \".lang\" al nombre del fichero del subtítulo; solo usa el \"Idioma del Subtítulo (1)\")", "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Subtítulos integrados: tratar \"Undefined\" (und) como primer idioma", "I rename my files using": "Renombro los archivos usando", - "Retrieve original filename from .file_info/file_info index files (see wiki)": "Obtener el nombre original del archivo del los archivos tipo \"file_info\" (ver wiki)", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "Obtener el nombre original del archivo de los archivos tipo \"file_info\" (ver wiki)", "Sonarr URL (add URL base if configured)": "URL de Sonarr (añadir la URL base si está configurada)", "Sonarr API key": "Clave API de Sonarr", - "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "URL de Radar (añadir la URL base si está configurada, versión mínima: 0.2.0.897)", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "URL de Radarr (añadir la URL base si está configurada, versión mínima: 0.2.0.897)", "Radarr API key": "Clave API de Radarr", "Provider: Enable OpenSubtitles": "Proveedor: Habilitar OpenSubtitles", "Opensubtitles Username": "Usuario de OpenSubtitles", @@ -191,8 +191,8 @@ "Provider: Enable hosszupuskasub.com (Hungarian)": "Proveedor: Habilitar hosszupuskasub.com (húngaro)", "Provider: Enable aRGENTeaM (Spanish)": "Proveedor: Habilitar aRGENTeaM (español)", "Search enabled providers simultaneously (multithreading)": "Buscar proveedores habilitados simultáneamente (multihebra)", - "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Extraer automáticamente y usar subtítulos integrados al añadir contenidos (con las modificaciones configuradas por defecto)", - "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "Después de extraer automáticamente subtítulos integrados ¿buscar inmediatamente subtítulos disponibles?", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Extraer automáticamente y usar subtítulos integrados al añadir contenido (con las modificaciones que ha configurado)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "Después de la extracción automática de subtítulos integrados ¿buscar inmediatamente los subtítulos disponibles?", "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "¿No buscar subtítulos de un idioma si existen subtítulos integrados dentro del archivo (MKV/MP4)?", "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "¿No buscar subtítulos de un idioma si ya existen en el sistema de ficheros o en los metadatos?", "How strict should these subtitles existing on the filesystem be detected?": "¿Cómo de estricta debe ser la detección de estos subtítulos en el sistema de archivos?", @@ -206,7 +206,7 @@ "Fix common OCR errors in downloaded subtitles": "Arreglar errores comunes de OCR en los subtítulos descargados", "Reverse punctuation in RTL languages (heb)": "Invertir puntuación en idiomas RTL (heb)", "Change colors of subtitles to": "Cambiar color de los subtítulos a", - "Store subtitles next to media files (instead of metadata)": "Almacenar los subtítulos junto a los archivos de video (en lugar de en los metadatos)", + "Store subtitles next to media files (instead of metadata)": "Almacenar los subtítulos junto a los archivos de video (en lugar de incluirlos en los metadatos)", "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Formatos de subtítulos a guardar (lo que no sean SRT sólo funcionan si la opción anterior está habilitada)", "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "Carpeta de subtítulos (\"carpeta actual\" es la carpeta donde los archivos de video están guardados)", "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "Carpeta de subtítulos personalizada (sustituye a la \"Carpeta de subtítulos\", calculada con las rutas reales)", @@ -313,17 +313,17 @@ "Force-find subtitles: %(item_title)s": "Forzar búsqueda de subtítulos: %(item_title)s", "File %(file_part_index)s: ": "Archivo %(file_part_index)s:␣", "%(part_summary)sNo current subtitle in storage": "%(part_summary)sNo hay un subtítulo guardado", - "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sSubtítulos actual: %(provider_name)s (añadido: %(date_added)s, %(mode)s), Idioma: %(language)s, Puntuación: %(score)i, Almacenamiento: %(storage_type)s", - "%(part_summary)sManage %(language)s subtitle": "%(part_summary)sGestiona subtítulos en %(language)s", - "%(part_summary)sList %(language)s subtitles": "%(part_summary)sMuestra subtítulos en %(language)s", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)s Subtítulo actual: %(provider_name)s (añadido: %(date_added)s, %(mode)s), Idioma: %(language)s, Puntuación: %(score)i, Almacenamiento: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)s Gestionar subtítulo en %(language)s", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)s Mostrar subtítulo en %(language)s", "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sSubtítulos integrados en (%(languages)s)", - "Select active %(language)s subtitle": "Selecciona subtítulos activos en %(language)s subtitle", + "Select active %(language)s subtitle": "Elegir subtítulo activo en %(language)s", "%(count)d subtitles in storage": "%(count)d subtítulos almacenados", - "List available %(language)s subtitles": "Muestra subtítulos disponibles en %(language)s", + "List available %(language)s subtitles": "Mostrar subtítulos disponibles en %(language)s", "Modify current %(language)s subtitle": "Modificar el subtítulo actual en %(language)s", "Currently applied mods: %(mod_list)s": "Modificaciones aplicadas actualmente: %(mod_list)s", "Blacklist current %(language)s subtitle and search for a new one": "Bloquear el actual subtítulo en %(language)s y buscar uno nuevo ", - "Manage blacklist (%(amount)s contained)": "Gestionar lista de bloqueados (total: %(amount)s) ", + "Manage blacklist (%(amount)s contained)": "Gestionar lista de bloqueados (total: %(amount)s)", "%(current_state)s%(subtitle_name)s, Score: %(score)s": "%(current_state)s%(subtitle_name)s, Puntuación: %(score)s", "Current: ": "Actual: ", "Stored: ": "Almacenado: ", @@ -357,7 +357,7 @@ "agent + interface": "agente + interfaz", "only interface": "sólo interfaz", "interface": "interfaz", - "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "Mostrar los elementos En Progreso y permite actualiza individualmente los metadatos y subtítulos", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "Muestra los elementos En Progreso y permite actualiza individualmente los metadatos y subtítulos", "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "Muestra elementos sin subtítulos. Haz clic en \"Buscar elementos recientes sin subtítulos\" para actualizar la lista", "Add %(kind)s %(title)s to the ignore list": "Añadir %(kind)s %(title)s a la lista de ignorados", "Remove %(kind)s %(title)s from the ignore list": "Eliminar %(kind)s %(title)s de la lista de ignorados", @@ -369,11 +369,11 @@ "Forced refresh of item %(item_id)s triggered": "Actualización de elementos %(item_id)s forzada", "Ignore %(kind)s \"%(title)s\"": "Ignorar %(kind)s \"%(title)s\"", "Un-ignore %(kind)s \"%(title)s\"": "Dejar de ignorar %(kind)s \"%(title)s\"", - "Refreshing %(title)s": "Actualizando %(title)s", - "Force-refreshing %(title)s": "Actualizando forzosamente %(title)s", + "Refreshing %(title)s": "Refrescando %(title)s", + "Force-refreshing %(title)s": "Forzando refresco de %(title)s", "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Extraer los subtítulos integrados no extraídos de todos los episodios de la actual temporada con las modificaciones configuradas por defecto", "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "Extraer los subtítulos integrados de todos los episodios de la actual temporada con las modificaciones configuradas por defecto", - "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Actualiza %(the_movie_series_season_episode)s, posiblemente buscando y tomando nuevos subtítulos del disco", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Actualiza %(the_movie_series_season_episode)s, tratando de localizar nuevos subtítulos almacenados", "the movie": "la película", "the series": "la serie", "the episode": "el episodio", @@ -396,5 +396,47 @@ "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Añadir o quitar cierta cantidad de tiempo de todo el subtítulos para emparejarlo con el vídeo", "Available": "Disponible", "Current": "Actual", - "Custom path to advanced_settings.json": "Ruta personalizada para advanced_settings.json" + "Custom path to advanced_settings.json": "Ruta personalizada para advanced_settings.json", + "zh-hant": "Chino (Tradicional)", + "zh-hans": "Chino (Simplificado)", + "Reset the plugin's menu history storage": "Vaciar el historial de almacenamiento del plugin", + "forced": "forzadp", + "%s in %s (%s, score: %s), %s": "%s en %s (%s, puntuación: %s), %s", + "Extract embedded subtitle streams": "Extraer la cola de subtítulos integrados", + "Display %(incl_excl_list_name)s (%(count)d)": "Mostrar la lista de %(incl_excl_list_name)s (%(count)d)", + "include list": "lista de inclusión", + "ignore list": "lista de ignorados", + "Include list": "Lista de inclusión", + "Ignore list": "Lista de ignorados", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "Mostrar la lista %(incl_excl_list_name)s actuar (utilizado principalmente para tarea automáticas)", + "Didn't change the %(incl_excl_list_name)s": "No se cambió la %(incl_excl_list_name)s", + "%(title)s added to the include list": "%(title)s añadido/s a la lista de inclusión", + "%(title)s removed from the include list": "%(title)s eliminados de la lista de inclusión", + "Enable Sub-Zero for %(kind)s \"%(title)s\"": "Habilitar Sub-Zero para %(kind)s \"%(title)s\"", + "Disable Sub-Zero for %(kind)s \"%(title)s\"": "Deshabilitar Sub-Zero para %(kind)s \"%(title)s\"", + "Download subtitles": "Descargar subtítulos", + "Never": "Nunca", + "Always": "Siempre", + "When main audio stream is not Subtitle Language (1)": "Cuando el audio principal no equivale al Idioma del Subtítulo (1)", + "When main audio stream is not any configured language": "Cuando el audio principal no equivale a ningún idioma configurado", + "When any audio stream is not Subtitle Language (1)": "Cuando ninguna pista de audio equivale al Idioma del Subtítulo (1)", + "When any audio stream is not any configured language": "Cuando ninguna pista de audio coincide con ningún idioma configurado", + "Download foreign/forced subtitles": "Descargar subtítulos forzados/extranjeros", + "Only for Subtitle Language (1)": "Solo para el Idioma del Subtítulo (1)", + "Only for Subtitle Language (2)": "Solo para el Idioma del Subtítulo (2)", + "Only for Subtitle Language (3)": "Solo para el Idioma del Subtítulo (3)", + "Embedded streams: Treat \"Undefined\" (und) as language 1": "Pistas integradas: tratar \"Undefined\" (und) como primer idioma", + "Reverse punctuation in RTL languages (heb, ara, fas)": "Invertir puntuación en idiomas RTL (heb, ara, fas)", + "Fix only uppercase downloaded subtitles": "Arreglar solo las letras capitales en los subtítulos descargados", + "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "¿Debe SZ habilitarse o deshabilitarse por defecto? (Impacta en los ajustes de debajo y del menu del plugin)", + "enable SZ for all items by default, use ignore mode": "Habilitar SZ para todos los elementos por defecto, usar Modo Ignorar", + "disable SZ for all items by default, use include mode": "Deshabilitar SZ para todos los elementos por defecto, usar Modo Incluir", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "Usar \"subzero.ignore/.subzero.ignore/.nosz\" (Modo Ignorar) o \"subzero.include/.subzero.include/.sz\" (Modo Incluir) en los archivos dentro de las carpetas", + "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "Habilitar/deshabilitar Sub-Zero en las siguientes rutas (separadas por coma; los ajustes de arriba afectan a esto)", + "auto": "auto", + "manual": "manual", + "auto-better": "auto-mejorar", + "Unknown": "Desconocido", + "embedded": "Integrado", + "Use Google DNS (for \"problematic\" countries)": "Usar DNS de Google (para países problemáticos)" } \ No newline at end of file From 4497b522f7b56b2747a10ffe0b7152cf5b8d027c Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 7 Nov 2018 14:59:45 +0100 Subject: [PATCH 298/710] update changelog for 2.6.4.2834 --- CHANGELOG.md | 18 +++++++++ Contents/Info.plist | 6 +-- README.md | 92 +++++++++++++++++++++++++++++++++++---------- 3 files changed, 93 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 588f33a24..3a495facc 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,22 @@ +2.5.7.2663 +- implement translations for the channel and the settings +- i18n: German (myself) +- i18n: Danish (thanks Uthman, Claus Møller, dane22) +- i18n: Dutch (thanks jippo015, Semi Doludizgin, Rafael) +- i18n: Hungarian (thanks Morpheus1333, sugarman402) +- i18n: Spanish LA&C (thanks Yamil.llanos, Notorius28) +- core: notify executable: support spaces in path, fixes #520 +- core: notify executable: fix usage with python scripts (drops inherited PYTHONPATH), fixes #355 +- core: fix plugin_pin_mode +- refiners: filebot: fix usage on OSX +- providers: add assrt.net (Chinese) - thanks @dimotsai! +- providers: add supersubtitles (feliratok.info, Hungarian) - thanks @morpheus133! +- providers: addic7ed: cache login data instead of re-login per search +- submod: HI: support "&" and "+" in hi_before_colon +- submod: HI: be less aggressive with HI_before_colon_noncaps; fixes #510 + + 2.5.4.2541 - core: try retrieving advanced_settings.json from the path given, which may be a file path or a directory diff --git a/Contents/Info.plist b/Contents/Info.plist index ce018e0da..dec4582f5 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -9,11 +9,11 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleShortVersionString - 2.6.1 + 2.6.4 CFBundleSignature ???? CFBundleVersion - 2.6.1.2826 + 2.6.4.2834 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.1.2826 DEV +Version 2.6.4.2834 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index bcc7a4768..d453197e7 100644 --- a/README.md +++ b/README.md @@ -54,11 +54,13 @@ They currently consist of six individual mods: - **FPS**: Your subtitle is getting slower over time, or faster over time? Maybe the framerate is wrong. The FPS mod can fix that. - **Hearing Impaired**: Removes HI-tags from subtitles (such as `(SIRENS WAIL)`, `DOCTOR: Rose!`) - **Color**: Adds color to your subtitles (for playback devices/software that don't ship their own color modes; only works for players that support color tags) -- **Common**: fixes common issues in subtitles, such as punctuation (`-- I don't know!` -> `... I don't know!`; `over 9 000!` -> `over 9000!`) -- **OCR**: fixes problems in subtitles introduced by OCR (custom implementation of [SubtitleEdit](https://github.com/SubtitleEdit/subtitleedit)'s dictionaries) (`hands agaInst the waII!` -> `hands against the wall!`) -- **Remove Tags**: removes any font style tags from the subtitles (bold, italic, underline, colors, ...) +- **Common**: Fixes common issues in subtitles, such as punctuation (`-- I don't know!` -> `... I don't know!`; `over 9 000!` -> `over 9000!`) +- **OCR**: Fixes problems in subtitles introduced by OCR (custom implementation of [SubtitleEdit](https://github.com/SubtitleEdit/subtitleedit)'s dictionaries) (`hands agaInst the waII!` -> `hands against the wall!`) +- **Remove Tags**: Removes any font style tags from the subtitles (bold, italic, underline, colors, ...) +- **Reverse RTL**: Reverses the punctuation in right-to-left subtitles for problematic playback devices +- **Fix Uppercase**: Tries to make subtitles that are completely uppercase readable -Hearing Impaired, Common, OCR and Color can be applied automatically on every subtitle downloaded. All mods are manually managable via the interface. +Hearing Impaired, Common, OCR, Fix Uppercase, Reverse RTL and Color can be applied automatically on every subtitle downloaded. All mods are manually managable via the interface. Mods are applied on-the-fly, the original content of the subtitle stays available, so mods are completely reversible. @@ -77,22 +79,72 @@ Jacob K, Ninjouz, chopeta, fvb, Jose ## Changelog -2.5.7.2663 -- implement translations for the channel and the settings -- i18n: German (myself) -- i18n: Danish (thanks Uthman, Claus Møller, dane22) -- i18n: Dutch (thanks jippo015, Semi Doludizgin, Rafael) -- i18n: Hungarian (thanks Morpheus1333, sugarman402) -- i18n: Spanish LA&C (thanks Yamil.llanos, Notorius28) -- core: notify executable: support spaces in path, fixes #520 -- core: notify executable: fix usage with python scripts (drops inherited PYTHONPATH), fixes #355 -- core: fix plugin_pin_mode -- refiners: filebot: fix usage on OSX -- providers: add assrt.net (Chinese) - thanks @dimotsai! -- providers: add supersubtitles (feliratok.info, Hungarian) - thanks @morpheus133! -- providers: addic7ed: cache login data instead of re-login per search -- submod: HI: support "&" and "+" in hi_before_colon -- submod: HI: be less aggressive with HI_before_colon_noncaps; fixes #510 +2.6.4.2834 +- core: add option to use custom (Google, Cloudflare) DNS to resolve provider hosts in problematic countries; fixes #547 +- core: add support for downloading subtitles only when the audio streams don't match (any?) configured languages; fixes #519 +- core: add support for an include list instead of an ignore list; add the option to disable SZ by default, then enable it per item/series/section (inverse ignore list) +- core/menu/config: support forced/foreign subtitles independently +- core: fallback for OSError on scandir, should fix #532 +- core: add config versioning/migration system +- core: correctly force non-foreign-only-capable providers off; remove subscene from foreign-only capable providers +- core: scanning: collect information about audio streams +- core: use correct storage path when storing subtitle info, when only VTT is used +- core: fix disabled channel mode +- core/menu: extract embedded: add extracted embedded subtitles to history +- core: embedded subtitle streams: don't try parsing the language if inexistant +- core: subtitle: fix log call, fixes #569 +- core: download best subtitles: only use actually languages searched for +- core: refiners: tvdb: warn instead of error when no matching series was found +- core: scanning: re-add expected title to guessit for narrowing down the video title +- core: resolve #583 +- core: archives: explicitly skip forced subtitles if not searched for, when picking from an archive +- core: activities/auto-refresh: fix hybrid-plus for movies +- core: don't disable plugin if all providers throttled; fix #585 #574 +- core: skip cleanup for ignored paths +- core: update requests to 2.20.0 (fixes security issue) +- core: update certifi to 2018.10.15 +- core: auto extract: don't overwrite local sub even if unknown to SZ +- config: set autoclean leftover/unused to off by default +- providers: opensubtitles: respect rate limit (40 hits/10s); should fix long throttling behaviour +- providers: opensubtitles: handle bad/inexistant responses +- providers: opensubtitles: log bad response data +- providers: opensubtitles: treat empty response as ServiceUnavailable for now +- providers: opensubtitles: log reason for ServiceUnavailable +- providers: legendastv: match second title and imdb id +- providers: titlovi: fix language handling (thanks @viking1304) +- providers: titlovi: proper handling of archives with both cyrlic and latin subtitles (thanks @viking1304) +- providers: titlovi: allow direct subtitle downloads as fallback (when a subtitle, not an archive was returned) +- providers: hosszupuska: implement site change (thanks @morpheus133) +- providers: supersubtitles: add base properties to subtitle +- providers: opensubtitles, podnapisi: fix foreign/forced handling +- providers: subscene: use original/sceneName if possible +- menu: fix plugin not responding when ignoring an item in certain menus; fixes #535 +- menu: select active subtitle: return to item details afterwards; correctly set current +- menu: add item thumbnails to history and a couple of submenus +- menu: history: use series thumbnail instead of episode screenshot +- menu: add full soft include/exclude menu handling +- menu: add support for separate forced and not-forced subtitles +- menu: fix order of embedded subtitle streams in item detail +- menu: support S00E00 and equivalent +- submod: add option to fix only-uppercase subtitles and make them readable +- submod: keep track of actually applied mods +- submod: correctly merge mods of the same kind (offset) +- submod: OCR: add dictionaries for bosnian and norwegian bokmal; update dicts for dan, eng, hrv, spa, srp, swe +- submod: OCR/HI: skip certain processors for all-caps subs +- submod: HI: only remove caps before colon if the colon is followed by whitespace or EOL; fixes #542 +- submod: HI: remove MAN: +- submod: common: improve detection and normalization of quotes, apostrophes +- submod: common: fix double quotes that are meant to be single quotes inside words +- submod: common: normalize small hyphens to dash +- submod: common: remove line only consisting of colon; remove empty colon at start of line +- submod: common: add space after punctuation +- submod: common: fix lowercase i for english language +- submod: common: better fix for music symbols +- submod: reverse_RTL: also reverse ":,'-" chars in CM_RTL_reverse (thanks @doopler) +- submod: reverse_RTL: enable mod for arabic, farsi and persian besides hebrew +- i18n: fix not used translation for recently added missing subtitles menu +- i18n: fix spanish translation, fixes #543 +- i18n: Hungarian translation is incomplete From 60d9d2c1b3f383ec3003d9e1163a49e1625916c6 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 7 Nov 2018 15:01:51 +0100 Subject: [PATCH 299/710] release 2.6.4.2834 --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index dec4582f5..f08ee1188 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ PlexPluginConsoleLogging 0 PlexPluginDevMode - 1 + 0 PlexPluginCodePolicy Elevated @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2834 DEV +Version 2.6.4.2834 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 68229fdd7205031e0bd617bf6dd20ba68119dd3b Mon Sep 17 00:00:00 2001 From: pannal Date: Wed, 7 Nov 2018 15:15:08 +0100 Subject: [PATCH 300/710] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2c45a07d8..6b3f7c1c9 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ For further help or manual installation, [please go to the wiki](https://github. ## Big thanks to the beta testing team (in no particular order)! the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, eherberg, tywilliams_88, Swanny, Jippo, Joost1991 / joost, Marik, Jon, AmbyDK, -Clay, mmgoodnow, Abenlog, michael, smikwily, shoghicp, Zuikkis, Isilorn, +Clay, Abenlog, michael, smikwily, shoghicp, Zuikkis, Isilorn, Jacob K, Ninjouz, chopeta, fvb, Jose ## Changelog From 838ef0cdc732af1352394e68dc99ff1702769254 Mon Sep 17 00:00:00 2001 From: pannal Date: Wed, 7 Nov 2018 15:55:41 +0100 Subject: [PATCH 301/710] Update README.md --- README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6b3f7c1c9..1da673d3c 100644 --- a/README.md +++ b/README.md @@ -79,11 +79,8 @@ Ever had broken music icons in a subtitle? Nordic characters like `Å` which tur Simply go to the Plex Plugins in your Plex Media Server, search for Sub-Zero and install it. For further help or manual installation, [please go to the wiki](https://github.com/pannal/Sub-Zero.bundle/wiki). -## Big thanks to the beta testing team (in no particular order)! -the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, -eherberg, tywilliams_88, Swanny, Jippo, Joost1991 / joost, Marik, Jon, AmbyDK, -Clay, Abenlog, michael, smikwily, shoghicp, Zuikkis, Isilorn, -Jacob K, Ninjouz, chopeta, fvb, Jose +## Big thanks to the beta/i18n testing team (in no particular order)! +the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, eherberg, tywilliams_88, Swanny, Jippo, Joost1991 / joost, Marik, Jon, AmbyDK, Clay, mmgoodnow, Abenlog, michael, smikwily, shoghicp, Zuikkis, Isilorn, Jacob K, Ninjouz, chopeta, fvb, Uthman, Claus Møller, Semi Doludizgin, Rafael, sugarman402, Morpheus1333, Yamil.llanos, Notorius28 ## Changelog From 3c2c71a7dafba5a8475bc153e5512cc2fd19849a Mon Sep 17 00:00:00 2001 From: pannal Date: Wed, 7 Nov 2018 15:56:07 +0100 Subject: [PATCH 302/710] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1da673d3c..a6b87559e 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ Simply go to the Plex Plugins in your Plex Media Server, search for Sub-Zero and For further help or manual installation, [please go to the wiki](https://github.com/pannal/Sub-Zero.bundle/wiki). ## Big thanks to the beta/i18n testing team (in no particular order)! -the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, eherberg, tywilliams_88, Swanny, Jippo, Joost1991 / joost, Marik, Jon, AmbyDK, Clay, mmgoodnow, Abenlog, michael, smikwily, shoghicp, Zuikkis, Isilorn, Jacob K, Ninjouz, chopeta, fvb, Uthman, Claus Møller, Semi Doludizgin, Rafael, sugarman402, Morpheus1333, Yamil.llanos, Notorius28 +the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, eherberg, tywilliams_88, Swanny, Jippo, Joost1991 / joost, Marik, Jon, AmbyDK, Clay, Abenlog, michael, smikwily, shoghicp, Zuikkis, Isilorn, Jacob K, Ninjouz, chopeta, fvb, Uthman, Claus Møller, Semi Doludizgin, Rafael, sugarman402, Morpheus1333, Yamil.llanos, Notorius28 ## Changelog From 2a5db95ef2adb3053d0a0b99cdab5efb772321f5 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 7 Nov 2018 22:05:18 +0100 Subject: [PATCH 303/710] don't pass history storage across threads --- Contents/Code/__init__.py | 16 +++++++++------- Contents/Code/interface/menu_helpers.py | 11 +++-------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 29f22edb3..25ff7b1d9 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -99,7 +99,7 @@ def update_local_media(videos, ignore_parts_cleanup=None): support.localmedia.find_subtitles(video["plex_part"], ignore_parts_cleanup=ignore_parts_cleanup) -def agent_extract_embedded(video_part_map, history_storage=None): +def agent_extract_embedded(video_part_map): try: subtitle_storage = get_subtitle_storage() @@ -139,7 +139,7 @@ def agent_extract_embedded(video_part_map, history_storage=None): if to_extract: Log.Info("Triggering extraction of %d embedded subtitles of %d items", len(to_extract), item_count) Thread.Create(multi_extract_embedded, stream_list=to_extract, refresh=True, with_mods=True, - single_thread=not config.advanced.auto_extract_multithread, history_storage=history_storage) + single_thread=not config.advanced.auto_extract_multithread) except: Log.Error("Something went wrong when auto-extracting subtitles, continuing: %s", traceback.format_exc()) @@ -176,7 +176,7 @@ def update(self, metadata, media, lang): return intent = get_intent() - history = get_history() + history = None item_ids = [] try: @@ -222,7 +222,7 @@ def update(self, metadata, media, lang): # auto extract embedded if config.embedded_auto_extract: if config.plex_transcoder: - agent_extract_embedded(scanned_video_part_map, history_storage=history) + agent_extract_embedded(scanned_video_part_map) else: Log.Warning("Plex Transcoder not found, can't auto extract") @@ -258,6 +258,8 @@ def update(self, metadata, media, lang): if downloaded_subtitles: downloaded_any = any(downloaded_subtitles.values()) + history = get_history() + if downloaded_any: save_successful = False try: @@ -280,7 +282,6 @@ def update(self, metadata, media, lang): history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], thumb=video.plexapi_metadata["super_thumb"], subtitle=subtitle) - history.destroy() else: # store SZ meta info even if we've downloaded none self.store_blank_subtitle_metadata(scanned_video_part_map) @@ -291,8 +292,9 @@ def update(self, metadata, media, lang): # update the menu state set_refresh_menu_state(None) - history.destroy() - history = None + if history: + history.destroy() + history = None # notify any running tasks about our finished update for item_id in item_ids: diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 24ffd5bab..3ff2fe739 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -169,11 +169,12 @@ def extract_embedded_sub(**kwargs): part = kwargs.pop("part", get_part(plex_item, part_id)) scanned_videos = kwargs.pop("scanned_videos", None) extract_mode = kwargs.pop("extract_mode", "a") - history_storage = kwargs.pop("history_storage", None) any_successful = False if part: + history = get_history() + if not scanned_videos: metadata = get_plex_metadata(rating_key, part_id, item_type, plex_item=plex_item) scanned_videos = scan_videos([metadata], ignore_all=True, skip_hashing=True) @@ -220,19 +221,13 @@ def extract_embedded_sub(**kwargs): # add item to history item_title = get_title_for_video_metadata(video.plexapi_metadata, add_section_title=False, add_episode_title=True) - if history_storage: - history = history_storage - else: - history = get_history() history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], thumb=video.plexapi_metadata["super_thumb"], subtitle=subtitle, mode=extract_mode) - if not history_storage: - history.destroy() - any_successful = True + history.destroy() return any_successful From acd556d6f1aea77bdf9c54ef6413beb893eadab4 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 8 Nov 2018 01:19:07 +0100 Subject: [PATCH 304/710] core: fix thread.lock error by reverting previous change --- Contents/Code/__init__.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 25ff7b1d9..1787781a4 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -109,8 +109,9 @@ def agent_extract_embedded(video_part_map): for scanned_video, part_info in video_part_map.iteritems(): plexapi_item = scanned_video.plexapi_metadata["item"] stored_subs = subtitle_storage.load_or_new(plexapi_item) + valid_langs_in_media = audio_streams_match_languages(scanned_video, config.get_lang_list(ordered=True)) - if audio_streams_match_languages(scanned_video, list(config.lang_list)): + if not config.lang_list.difference(valid_langs_in_media): Log.Debug("Skipping embedded subtitle extraction for %s, audio streams are in correct language(s)", plexapi_item.rating_key) continue @@ -176,7 +177,6 @@ def update(self, metadata, media, lang): return intent = get_intent() - history = None item_ids = [] try: @@ -258,8 +258,6 @@ def update(self, metadata, media, lang): if downloaded_subtitles: downloaded_any = any(downloaded_subtitles.values()) - history = get_history() - if downloaded_any: save_successful = False try: @@ -278,10 +276,12 @@ def update(self, metadata, media, lang): for video, video_subtitles in downloaded_subtitles.items(): # store item(s) in history for subtitle in video_subtitles: + history = get_history() item_title = get_title_for_video_metadata(video.plexapi_metadata, add_section_title=False) history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], thumb=video.plexapi_metadata["super_thumb"], subtitle=subtitle) + history.destroy() else: # store SZ meta info even if we've downloaded none self.store_blank_subtitle_metadata(scanned_video_part_map) @@ -292,10 +292,6 @@ def update(self, metadata, media, lang): # update the menu state set_refresh_menu_state(None) - if history: - history.destroy() - history = None - # notify any running tasks about our finished update for item_id in item_ids: #scheduler.signal("updated_metadata", item_id) From 16b69ef3cccbf768bfe085001050d49d1f5f15ea Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 8 Nov 2018 01:29:07 +0100 Subject: [PATCH 305/710] core: fix audio-based conditional subtitle decision making; fixes #592 --- Contents/Code/support/config.py | 28 ++++++++++++----------- Contents/Code/support/download.py | 12 ++++++++-- Contents/Code/support/helpers.py | 37 ++++++++++++++----------------- 3 files changed, 42 insertions(+), 35 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 45692cc4c..942ac49cc 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -633,7 +633,7 @@ def check_enabled_sections(self): return enabled_sections # Prepare a list of languages we want subs for - def get_lang_list(self, provider=None): + def get_lang_list(self, provider=None, ordered=False): # advanced settings if provider and self.advanced.providers and provider in self.advanced.providers: adv_languages = self.advanced.providers[provider].get("languages", None) @@ -654,21 +654,21 @@ def get_lang_list(self, provider=None): if adv_out: return adv_out - l = {Language.fromietf(Prefs["langPref1a"])} + l = [Language.fromietf(Prefs["langPref1a"])] lang_custom = Prefs["langPrefCustom"].strip() if Prefs['subtitles.only_one']: - return l + return set(l) if not ordered else l if Prefs["langPref2a"] != "None": try: - l.update({Language.fromietf(Prefs["langPref2a"])}) + l.append(Language.fromietf(Prefs["langPref2a"])) except: pass if Prefs["langPref3a"] != "None": try: - l.update({Language.fromietf(Prefs["langPref3a"])}) + l.append(Language.fromietf(Prefs["langPref3a"])) except: pass @@ -682,12 +682,12 @@ def get_lang_list(self, provider=None): real_lang = Language.fromname(lang) except: continue - l.update({real_lang}) + l.append(real_lang) if self.forced_also: - langs_to_force = [] if Prefs["subtitles.when_forced"] == "Always": - langs_to_force = list(l) + for lang in list(l): + l.append(Language.rebuild(lang, forced=True)) else: for (setting, index) in (("Only for Subtitle Language (1)", 0), @@ -695,19 +695,21 @@ def get_lang_list(self, provider=None): ("Only for Subtitle Language (3)", 2)): if Prefs["subtitles.when_forced"] == setting: try: - langs_to_force.append(list(l)[index]) + l.append(Language.rebuild(list(l)[index], forced=True)) break except: pass - for lang in langs_to_force: - l.add(Language.rebuild(lang, forced=True)) - elif self.forced_only: for lang in l: lang.forced = True - return l + if not self.normal_subs: + for lang in l[:]: + if not lang.forced: + l.remove(lang) + + return set(l) if not ordered else l lang_list = property(get_lang_list) diff --git a/Contents/Code/support/download.py b/Contents/Code/support/download.py index c61c2c2a3..b8b3e950a 100644 --- a/Contents/Code/support/download.py +++ b/Contents/Code/support/download.py @@ -15,9 +15,17 @@ def get_missing_languages(video, part): - languages = set([Language.rebuild(l) for l in config.lang_list]) + languages_list = config.get_lang_list(ordered=True) + languages = set(languages_list) + valid_langs_in_media = set() + + if Prefs["subtitles.when"] != "Always": + valid_langs_in_media = audio_streams_match_languages(video, languages_list) + languages = languages.difference(valid_langs_in_media) + if languages: + Log.Debug("Languages missing after taking the audio streams into account: %s" % languages) - if audio_streams_match_languages(video, list(config.lang_list)): + if valid_langs_in_media and not languages: Log.Debug("Skipping subtitle search for %s, audio streams are in correct language(s)", video) return set() diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 501a2feae..7418d2ea8 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -389,39 +389,36 @@ def get_language_from_stream(lang_code): def audio_streams_match_languages(video, languages): + without_forced = filter(lambda x: not x.forced, languages) if video.audio_languages: - decision = [] - if Prefs["subtitles.when"] == "Always": - decision.append(False) + return set() elif Prefs["subtitles.when"] == "When main audio stream is not Subtitle Language (1)": if video.audio_languages[0] == languages[0]: - decision.append(True) + return set(without_forced) elif Prefs["subtitles.when"] == "When any audio stream is not Subtitle Language (1)": if languages[0] in video.audio_languages: - decision.append(True) + return set(without_forced) elif Prefs["subtitles.when"] == "When main audio stream is not any configured language": if video.audio_languages[0] in languages: - decision.append(True) + return set(without_forced) elif Prefs["subtitles.when"] == "When any audio stream is not any configured language": - if set(video.audio_languages).intersection(set(languages)): - decision.append(True) - - if Prefs["subtitles.when_forced"] in [ - "Always", - "Only for Subtitle Language (1)", - "Only for Subtitle Language (2)", - "Only for Subtitle Language (3)" - ]: - decision.append(False) - - return all(decision) - - return False + matching = set(video.audio_languages).intersection(set(languages)) + if matching: + return set(without_forced) + + # if Prefs["subtitles.when_forced"] in [ + # "Always", + # "Only for Subtitle Language (1)", + # "Only for Subtitle Language (2)", + # "Only for Subtitle Language (3)" + # ]: + + return set() def get_language(lang_short): From 0b8eace5bb2b64b2434a08d6937c938c2c804015 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 8 Nov 2018 01:32:51 +0100 Subject: [PATCH 306/710] cleanup --- Contents/Code/support/helpers.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 7418d2ea8..f4c3a0c99 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -390,24 +390,24 @@ def get_language_from_stream(lang_code): def audio_streams_match_languages(video, languages): without_forced = filter(lambda x: not x.forced, languages) - if video.audio_languages: + if video.audio_languages and without_forced: if Prefs["subtitles.when"] == "Always": return set() elif Prefs["subtitles.when"] == "When main audio stream is not Subtitle Language (1)": - if video.audio_languages[0] == languages[0]: + if video.audio_languages[0] == without_forced[0]: return set(without_forced) elif Prefs["subtitles.when"] == "When any audio stream is not Subtitle Language (1)": - if languages[0] in video.audio_languages: + if without_forced[0] in video.audio_languages: return set(without_forced) elif Prefs["subtitles.when"] == "When main audio stream is not any configured language": - if video.audio_languages[0] in languages: + if video.audio_languages[0] in without_forced: return set(without_forced) elif Prefs["subtitles.when"] == "When any audio stream is not any configured language": - matching = set(video.audio_languages).intersection(set(languages)) + matching = set(video.audio_languages).intersection(set(without_forced)) if matching: return set(without_forced) From 9abb018fe8baa4b808a69080843027d9ad4c105d Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 8 Nov 2018 01:34:04 +0100 Subject: [PATCH 307/710] bump dev --- Contents/Info.plist | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index f08ee1188..94f616215 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.4.2834 + 2.6.4.2838 PlexFrameworkVersion 2 PlexPluginClass @@ -23,7 +23,7 @@ PlexPluginConsoleLogging 0 PlexPluginDevMode - 0 + 1 PlexPluginCodePolicy Elevated @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2834 +Version 2.6.4.2838 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From dd40f272cbe97d58b4cd83acbd1d25932dd2125c Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 8 Nov 2018 01:34:48 +0100 Subject: [PATCH 308/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 94f616215..1a4adbeda 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.4.2838 + 2.6.4.2850 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2838 DEV +Version 2.6.4.2850 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 5f9010e4b901cbd4f93fbae967049443bd0238ef Mon Sep 17 00:00:00 2001 From: pannal Date: Thu, 8 Nov 2018 01:43:39 +0100 Subject: [PATCH 309/710] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a6b87559e..1939e97a8 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ Ever had broken music icons in a subtitle? Nordic characters like `Å` which tur ## Installation Simply go to the Plex Plugins in your Plex Media Server, search for Sub-Zero and install it. -For further help or manual installation, [please go to the wiki](https://github.com/pannal/Sub-Zero.bundle/wiki). +For further help or manual installation, [please go to the wiki](https://github.com/pannal/Sub-Zero.bundle/wiki/Installation). ## Big thanks to the beta/i18n testing team (in no particular order)! the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, eherberg, tywilliams_88, Swanny, Jippo, Joost1991 / joost, Marik, Jon, AmbyDK, Clay, Abenlog, michael, smikwily, shoghicp, Zuikkis, Isilorn, Jacob K, Ninjouz, chopeta, fvb, Uthman, Claus Møller, Semi Doludizgin, Rafael, sugarman402, Morpheus1333, Yamil.llanos, Notorius28 From e0e5e29ba15ae38801f6b06cc6c603baa4c53cb0 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 8 Nov 2018 15:09:16 +0100 Subject: [PATCH 310/710] core: refine metadata subtitle storage to support forced and non-forced subs at the same time --- Contents/Code/support/storage.py | 17 +++++++++++++++-- Contents/Code/support/subtitlehelpers.py | 7 ++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Contents/Code/support/storage.py b/Contents/Code/support/storage.py index e0fbd7ce8..911a1f00d 100644 --- a/Contents/Code/support/storage.py +++ b/Contents/Code/support/storage.py @@ -143,9 +143,22 @@ def save_subtitles_to_metadata(videos, subtitles): else: mp = mediaPart pm = Proxy.Media(content, ext="srt", forced="1" if subtitle.language.forced else None) + new_key = "subzero_md" + ("_forced" if subtitle.language.forced else "") lang = Locale.Language.Match(subtitle.language.alpha2) - mp.subtitles[lang].validate_keys({}) - mp.subtitles[lang]["subzero"] = pm + + Log.Debug("Existing metadata subs for %s: %s", lang, getattr(mp.subtitles[lang], "_proxies", {}).keys()) + + for key, proxy in getattr(mp.subtitles[lang], "_proxies").iteritems(): + if not proxy or not len(proxy) >= 5: + Log.Debug("Can't parse metadata: %s" % repr(proxy)) + continue + if proxy[0] == "Media" and not key.startswith("subzero_"): + if key == "subzero": + Log.Debug("Removing legacy metadata subtitle for %s", lang) + del mp.subtitles[lang][key] + + Log.Debug("Adding metadata sub for %s: %s", lang, subtitle) + mp.subtitles[lang][new_key] = pm return True diff --git a/Contents/Code/support/subtitlehelpers.py b/Contents/Code/support/subtitlehelpers.py index f0af945d6..63efa96f2 100644 --- a/Contents/Code/support/subtitlehelpers.py +++ b/Contents/Code/support/subtitlehelpers.py @@ -174,10 +174,11 @@ def process_subtitles(self, part): Log('Found subtitle file: ' + self.filename + ' language: ' + language + ' codec: ' + str( codec) + ' format: ' + str(format) + ' default: ' + default + ' forced: ' + forced) - part.subtitles[language][basename] = Proxy.LocalFile(self.filename, codec=codec, format=format, default=default, + key = ("subzero_ex" + "_forced" if forced else "") + basename + part.subtitles[language][key] = Proxy.LocalFile(self.filename, codec=codec, format=format, default=default, forced=forced) - lang_sub_map[language] = [basename] + lang_sub_map[language] = [key] return lang_sub_map @@ -195,7 +196,7 @@ def get_subtitles_from_metadata(part): if p_type == "Media": # metadata subtitle - Log.Debug(u"Found metadata subtitle: %s, %s" % (language, repr(proxy))) + Log.Debug(u"Found metadata subtitle: %s, %s, %s" % (language, key, repr(proxy))) subs[language] = [key] return subs From 66f7019bf3edb265176540088a7a146906db50ed Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 8 Nov 2018 15:38:09 +0100 Subject: [PATCH 311/710] core: fix thread.lock error when extracting multiple subtitles --- Contents/Code/interface/menu_helpers.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 3ff2fe739..2d05c315d 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -173,8 +173,6 @@ def extract_embedded_sub(**kwargs): any_successful = False if part: - history = get_history() - if not scanned_videos: metadata = get_plex_metadata(rating_key, part_id, item_type, plex_item=plex_item) scanned_videos = scan_videos([metadata], ignore_all=True, skip_hashing=True) @@ -222,12 +220,13 @@ def extract_embedded_sub(**kwargs): item_title = get_title_for_video_metadata(video.plexapi_metadata, add_section_title=False, add_episode_title=True) + history = get_history() history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], thumb=video.plexapi_metadata["super_thumb"], subtitle=subtitle, mode=extract_mode) + history.destroy() any_successful = True - history.destroy() return any_successful From 90422448aa66a0b0bd328493d287f0840800af37 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 8 Nov 2018 15:38:49 +0100 Subject: [PATCH 312/710] providers: opensubtitles: skip non-forced results when searching for forced --- .../Shared/subliminal_patch/providers/opensubtitles.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index 23e82c833..b8474997c 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -299,6 +299,9 @@ def query(self, languages, hash=None, size=None, imdb_id=None, query=None, seaso elif also_foreign and foreign_parts_only: language = Language.rebuild(language, forced=True) + if language not in languages: + continue + query_parameters = _subtitle_item.get("QueryParameters") subtitle = self.subtitle_class(language, hearing_impaired, page_link, subtitle_id, matched_by, From c3f5a6f9e2b993758f4e6fc0a0c21083a2e7404a Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 8 Nov 2018 15:46:29 +0100 Subject: [PATCH 313/710] providers: podnapisi: skip non-forced results when searching for forced --- .../Shared/subliminal_patch/providers/podnapisi.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py b/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py index 128973ea7..f55d08429 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py @@ -175,7 +175,7 @@ def query(self, language, keyword, video, season=None, episode=None, year=None, if pid in pids: continue - language = Language.fromietf(subtitle_xml.find('language').text) + _language = Language.fromietf(subtitle_xml.find('language').text) hearing_impaired = 'n' in (subtitle_xml.find('flags').text or '') foreign = 'f' in (subtitle_xml.find('flags').text or '') if only_foreign and not foreign: @@ -185,7 +185,10 @@ def query(self, language, keyword, video, season=None, episode=None, year=None, continue elif also_foreign and foreign: - language = Language.rebuild(language, forced=True) + _language = Language.rebuild(_language, forced=True) + + if language != _language: + continue page_link = subtitle_xml.find('url').text releases = [] @@ -198,12 +201,12 @@ def query(self, language, keyword, video, season=None, episode=None, year=None, r_year = int(subtitle_xml.find('year').text) if is_episode: - subtitle = self.subtitle_class(language, hearing_impaired, page_link, pid, releases, title, + subtitle = self.subtitle_class(_language, hearing_impaired, page_link, pid, releases, title, season=r_season, episode=r_episode, year=r_year, asked_for_release_group=video.release_group, asked_for_episode=episode) else: - subtitle = self.subtitle_class(language, hearing_impaired, page_link, pid, releases, title, + subtitle = self.subtitle_class(_language, hearing_impaired, page_link, pid, releases, title, year=r_year, asked_for_release_group=video.release_group) From c58a438ad2f6e670b353a6635c4a2b42e1e56458 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 8 Nov 2018 16:17:41 +0100 Subject: [PATCH 314/710] core: massively improve usage of metadata subtitle storage --- Contents/Code/support/download.py | 11 +---------- Contents/Code/support/scanning.py | 20 +++++++++++++++++--- Contents/Code/support/storage.py | 12 ++++++------ Contents/Code/support/subtitlehelpers.py | 7 +++++-- Contents/Libraries/Shared/subzero/video.py | 11 ++++++++--- 5 files changed, 37 insertions(+), 24 deletions(-) diff --git a/Contents/Code/support/download.py b/Contents/Code/support/download.py index b8b3e950a..4ba1de696 100644 --- a/Contents/Code/support/download.py +++ b/Contents/Code/support/download.py @@ -6,8 +6,7 @@ import subliminal_patch as subliminal from support.config import config -from support.helpers import cast_bool, audio_streams_match_languages -from subtitlehelpers import get_subtitles_from_metadata +from support.helpers import audio_streams_match_languages from subliminal_patch import compute_score from support.plex_media import get_blacklist_from_part_map from subzero.video import refine_video @@ -38,14 +37,6 @@ def get_missing_languages(video, part): alpha3_map[language.alpha3] = language.country language.country = None - if not Prefs['subtitles.save.filesystem']: - # scan for existing metadata subtitles - meta_subs = get_subtitles_from_metadata(part) - for language, subList in meta_subs.iteritems(): - if subList: - video.subtitle_languages.add(language) - Log.Debug("Found metadata subtitle %s for %s", language, video) - have_languages = video.subtitle_languages.copy() if config.ietf_as_alpha3: for language in have_languages: diff --git a/Contents/Code/support/scanning.py b/Contents/Code/support/scanning.py index 1fe48ef55..e3431a78b 100644 --- a/Contents/Code/support/scanning.py +++ b/Contents/Code/support/scanning.py @@ -7,7 +7,7 @@ from support.plex_media import get_stream_fps from support.storage import get_subtitle_storage from support.config import config, TEXT_SUBTITLE_EXTS - +from support.subtitlehelpers import get_subtitles_from_metadata from subzero.video import parse_video, set_existing_languages from subzero.language import language_from_stream, Language @@ -86,7 +86,21 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr else: Log.Warn("Part %s missing of %s, not able to scan internal streams", plex_part.id, rating_key) - Log.Debug("Known embedded: %r", known_embedded) + # metadata subtitles + known_metadata_subs = set() + meta_subs = get_subtitles_from_metadata(plex_part) + for language, subList in meta_subs.iteritems(): + lang = Language.fromietf(Locale.Language.Match(language)) + if subList: + for key in subList: + if key.startswith("subzero_md_forced"): + lang = Language.rebuild(lang, forced=True) + + known_metadata_subs.add(lang) + Log.Debug("Found metadata subtitle %r:%s for %s", lang, key, plex_part.file) + + Log.Debug("Known metadata subtitles: %r", known_metadata_subs) + Log.Debug("Known embedded subtitles: %r", known_embedded) subtitle_storage = get_subtitle_storage() stored_subs = subtitle_storage.load(rating_key) @@ -106,7 +120,7 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr set_existing_languages(video, pms_video_info, external_subtitles=external_subtitles, embedded_subtitles=embedded_subtitles, known_embedded=known_embedded, stored_subs=stored_subs, languages=config.lang_list, - only_one=config.only_one) + only_one=config.only_one, known_metadata_subs=known_metadata_subs) # add video fps info video.fps = plex_part.fps diff --git a/Contents/Code/support/storage.py b/Contents/Code/support/storage.py index 911a1f00d..d7edc5cb2 100644 --- a/Contents/Code/support/storage.py +++ b/Contents/Code/support/storage.py @@ -146,16 +146,16 @@ def save_subtitles_to_metadata(videos, subtitles): new_key = "subzero_md" + ("_forced" if subtitle.language.forced else "") lang = Locale.Language.Match(subtitle.language.alpha2) - Log.Debug("Existing metadata subs for %s: %s", lang, getattr(mp.subtitles[lang], "_proxies", {}).keys()) - for key, proxy in getattr(mp.subtitles[lang], "_proxies").iteritems(): if not proxy or not len(proxy) >= 5: Log.Debug("Can't parse metadata: %s" % repr(proxy)) continue - if proxy[0] == "Media" and not key.startswith("subzero_"): - if key == "subzero": - Log.Debug("Removing legacy metadata subtitle for %s", lang) - del mp.subtitles[lang][key] + if proxy[0] == "Media": + if not key.startswith("subzero_"): + if key == "subzero": + Log.Debug("Removing legacy metadata subtitle for %s", lang) + del mp.subtitles[lang][key] + Log.Debug("Existing metadata subtitle for %s: %s", lang, key) Log.Debug("Adding metadata sub for %s: %s", lang, subtitle) mp.subtitles[lang][new_key] = pm diff --git a/Contents/Code/support/subtitlehelpers.py b/Contents/Code/support/subtitlehelpers.py index 63efa96f2..a2086f3aa 100644 --- a/Contents/Code/support/subtitlehelpers.py +++ b/Contents/Code/support/subtitlehelpers.py @@ -195,9 +195,12 @@ def get_subtitles_from_metadata(part): p_type = proxy[0] if p_type == "Media": + if not key.startswith("subzero"): + continue + # metadata subtitle - Log.Debug(u"Found metadata subtitle: %s, %s, %s" % (language, key, repr(proxy))) - subs[language] = [key] + #Log.Debug(u"Found metadata subtitle: %s, %s, %s" % (language, key, repr(proxy))) + subs[language].append(key) return subs diff --git a/Contents/Libraries/Shared/subzero/video.py b/Contents/Libraries/Shared/subzero/video.py index cb5b8d172..b12f38669 100644 --- a/Contents/Libraries/Shared/subzero/video.py +++ b/Contents/Libraries/Shared/subzero/video.py @@ -17,12 +17,17 @@ def has_external_subtitle(part_id, stored_subs, language): def set_existing_languages(video, video_info, external_subtitles=False, embedded_subtitles=False, known_embedded=None, - stored_subs=None, languages=None, only_one=False): + stored_subs=None, languages=None, only_one=False, known_metadata_subs=None): logger.debug(u"Determining existing subtitles for %s", video.name) + external_langs_found = set() # scan for external subtitles - external_langs_found = set(search_external_subtitles(video.name, languages=languages, - only_one=only_one).values()) + if known_metadata_subs: + # existing metadata subtitles + external_langs_found = known_metadata_subs + + external_langs_found.update(set(search_external_subtitles(video.name, languages=languages, + only_one=only_one).values())) # found external subtitles should be considered? if external_subtitles: From 67b322025d0ad6225c437a69df2b43d827875d5f Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 8 Nov 2018 16:18:05 +0100 Subject: [PATCH 315/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 1a4adbeda..e194d0258 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.4.2850 + 2.6.4.2856 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2850 DEV +Version 2.6.4.2856 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 5af10f1c6b2baea762f8adad9660e5b6e5e23ced Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 9 Nov 2018 17:08:43 +0100 Subject: [PATCH 316/710] submod: common: correctly pad music symbols on either side --- .../subzero/modification/dictionaries/data.py | 32 +++++++++---------- .../modification/dictionaries/make_data.py | 4 --- .../subzero/modification/mods/common.py | 7 ++-- Contents/Libraries/Shared/test.srt | 2 +- 4 files changed, 20 insertions(+), 25 deletions(-) diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py b/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py index 2ec9253f7..7524cbc04 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py @@ -6,7 +6,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict([(u'da nadjem', u'na\u0107i'), (u'da nadjes', u'na\u0107i'), (u'da budes', u'biti'), (u'da ides', u'i\u0107i'), (u'da prodemo', u'pro\u0107i'), (u'da udem', u'u\u0107i'), (u'gdje ides', u'kamo ide\u0161'), (u'Gdje ides', u'Kamo ide\u0161'), (u'hocu da budem', u'\u017eelim biti'), (u'Hocu da budem', u'\u017delim biti'), (u'hocu da kazem', u'\u017eelim re\u0107i'), (u'hoces da kazes', u'\u017eeli\u0161 re\u0107i'), (u'hoce da kaze', u'\u017eeli re\u0107i'), (u'kao sto sam', u'kao \u0161to sam'), (u'me leda', u'me le\u0111a'), (u'medu nama', u'me\u0111u nama'), (u'moramo da idemo', u'moramo i\u0107i'), (u'moras da ides', u'mora\u0161 i\u0107i'), (u'na vecer', u'nave\u010der'), (u'Na vecer', u'Nave\u010der'), (u'ne cu', u'ne\u0107u'), (u'ne ces', u'ne\u0107e\u0161'), (u'ne\u0161to sto', u'ne\u0161to \u0161to'), (u'ono sto', u'ono \u0161to'), (u'Ono sto', u'Ono \u0161to'), (u'reci \u0107u', u're\u0107i \u0107u'), (u'sto ti se ne', u'\u0161to ti se ne'), (u'sto vise', u'\u0161to vi\u0161e'), (u'sve sto', u'sve \u0161to'), (u'Zao mi', u'\u017dao mi'), (u'zao mi', u'\u017eao mi'), (u'Zato sto', u'Zato \u0161to'), (u'zato sto', u'zato \u0161to'), (u'znas sto', u'zna\u0161 \u0161to'), (u'zna\u0161 sto', u'zna\u0161 \u0161to')]), 'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:da\\ nadjem|da\\ nadjes|da\\ budes|da\\ ides|da\\ prodemo|da\\ udem|gdje\\ ides|Gdje\\ ides|hocu\\ da\\ budem|Hocu\\ da\\ budem|hocu\\ da\\ kazem|hoces\\ da\\ kazes|hoce\\ da\\ kaze|kao\\ sto\\ sam|me\\ leda|medu\\ nama|moramo\\ da\\ idemo|moras\\ da\\ ides|na\\ vecer|Na\\ vecer|ne\\ cu|ne\\ ces|ne\\\u0161to\\ sto|ono\\ sto|Ono\\ sto|reci\\ \\\u0107u|sto\\ ti\\ se\\ ne|sto\\ vise|sve\\ sto|Zao\\ mi|zao\\ mi|Zato\\ sto|zato\\ sto|znas\\ sto|zna\\\u0161\\ sto)(?:(?=\\s)|(?=$)|(?=\\b))'}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -18,7 +18,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xa4', u'o'), (u'IVI', u'M'), (u'lVI', u'M'), (u'IVl', u'M'), (u'lVl', u'M'), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict([(u'\xa4', u'o'), (u'IVI', u'M'), (u'lVI', u'M'), (u'IVl', u'M'), (u'lVl', u'M')]), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -30,7 +30,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'IVI', u'M'), (u'IVl', u'M'), (u'I\\/I', u'M'), (u'I\\/l', u'M'), (u'lVI', u'M'), (u'lVl', u'M'), (u'l\\/I', u'M'), (u'l\\/l', u'M'), (u'\xa4', u'o'), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict([(u'IVI', u'M'), (u'IVl', u'M'), (u'I\\/I', u'M'), (u'I\\/l', u'M'), (u'lVI', u'M'), (u'lVl', u'M'), (u'l\\/I', u'M'), (u'l\\/l', u'M'), (u'\xa4', u'o')]), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -42,7 +42,7 @@ 'pattern': u"(?um)(?:\\,\\ sin|\\ mothen|\\ can\\'t\\_|\\ openiL|\\ of\\\ufb02|pshycol|\\ i\\.\\.\\.|\\ L\\.)$"}, 'PartialLines': {'data': OrderedDict([(u' /be ', u' I be '), (u" aren '1'", u" aren't"), (u" aren'tyou", u" aren't you"), (u" doesn '1'", u" doesn't"), (u" fr/eno'", u' friend'), (u" fr/eno'.", u' friend.'), (u" haven 'z' ", u" haven't "), (u" haven 'z'.", u" haven't."), (u' I ha ve ', u' I have '), (u" I']I ", u" I'll "), (u' L am', u' I am'), (u' L can', u' I can'), (u" L don't ", u" I don't "), (u' L hate ', u' I hate '), (u' L have ', u' I have '), (u' L like ', u' I like '), (u' L will', u' I will'), (u' L would', u' I would'), (u" L'll ", u" I'll "), (u" L've ", u" I've "), (u' m y family', u' my family'), (u" 's ", u"'s "), (u" shou/dn '1 ", u" shouldn't "), (u" won 'z' ", u" won't "), (u" won 'z'.", u" won't."), (u" wou/c/n 'z' ", u" wouldn't "), (u" wou/c/n 'z'.", u" wouldn't."), (u" wou/dn 'z' ", u" wouldn't "), (u" wou/dn 'z'.", u" wouldn't."), (u'/ did', u'I did'), (u'/ have ', u'I have '), (u'/ just ', u'I just '), (u'/ loved ', u'I loved '), (u'/ need', u'I need'), (u'|was11', u'I was 11'), (u'at Hrst', u'at first'), (u"B ullshiz'", u'Bullshit'), (u'big lunk', u'love you'), (u"can 't", u"can't"), (u"can' t ", u"can't "), (u"can 't ", u"can't "), (u'CHA TTERING', u'CHATTERING'), (u'come 0n', u'come on'), (u'Come 0n', u'Come on'), (u"couldn 't", u"couldn't"), (u"couldn' t ", u"couldn't "), (u"couldn 't ", u"couldn't "), (u"Destin y's", u"Destiny's"), (u"didn 't", u"didn't"), (u"didn' t ", u"didn't "), (u"didn 't ", u"didn't "), (u"Doesn '1'", u"Doesn't"), (u"doesn '1' ", u"doesn't "), (u"doesn '1\u2018 ", u"doesn't "), (u"doesn 't", u"doesn't"), (u"doesn'1' ", u"doesn't "), (u"doesn'1\u2018 ", u"doesn't "), (u"don '1' ", u"don't "), (u"don '1\u2018 ", u"don't "), (u"don '2' ", u"don't "), (u" aren '2'", u" aren't"), (u"aren '2' ", u"aren't "), (u"don '2\u2018 ", u"don't "), (u"don 't", u"don't"), (u"Don' t ", u"Don't "), (u"Don 't ", u"Don't "), (u"don'1' ", u"don't "), (u"don'1\u2018 ", u"don't "), (u"there '5 ", u"there's "), (u'E very', u'Every'), (u'get 0n', u'get on'), (u'go 0n', u'go on'), (u'Go 0n', u'Go on'), (u"H3993' birthday", u'Happy birthday'), (u"hadn 't", u"hadn't"), (u"he 's", u"he's"), (u"He 's", u"He's"), (u'He y', u'Hey'), (u'he)/', u'hey'), (u'He)/', u'Hey'), (u'HEA VY', u'HEAVY'), (u'Henry ll', u'Henry II'), (u'Henry lll', u'Henry III'), (u'Henry Vlll', u'Henry VIII'), (u'Henry Vll', u'Henry VII'), (u'Henry Vl', u'Henry VI'), (u'Hold 0n', u'Hold on'), (u'I am. ls', u'I am. Is'), (u'I d0', u'I do'), (u"I 'm", u"I'm"), (u"I 'rn ", u"I'm "), (u"I 've", u"I've"), (u'I0 ve her', u'love her'), (u'I0 ve you', u'love you'), (u"I02'", u'lot'), (u"I'm sony", u"I'm sorry"), (u"isn' t ", u"isn't "), (u"isn 't ", u"isn't "), (u'K)/le', u'Kyle'), (u'L ook', u'Look'), (u'let me 90', u'let me go'), (u'Let me 90', u'Let me go'), (u"let's 90", u"let's go"), (u"Let's 90", u"Let's go"), (u'lfl had', u'If I had'), (u'lova you', u'love you'), (u'Lova you', u'love you'), (u'lovo you', u'love you'), (u'Lovo you', u'love you'), (u'ls anyone', u'Is anyone'), (u'ls he', u'Is he'), (u'-ls he', u'- Is he'), (u'ls it', u'Is it'), (u'-ls it', u'- Is it'), (u'ls she', u'Is she'), (u'-ls she', u'- Is she'), (u'ls that', u'Is that'), (u'-ls that', u'- Is that'), (u'ls this', u'Is this'), (u'-ls this', u'- Is this'), (u'Maze] tov', u'Mazel tov'), (u"N02' ", u'Not '), (u' of 0ur ', u' of our '), (u' ot mine ', u' of mine '), (u'PLA YING', u'PLAYING'), (u'REPEA TING ', u'REPEATING '), (u'Sa y', u'Say'), (u"she 's", u"she's"), (u"She 's", u"She's"), (u"shouldn 't", u"shouldn't"), (u'sta y', u'stay'), (u'Sta y', u'Stay'), (u'SWO rd', u'Sword'), (u'taka care', u'take care'), (u'Taka care', u'Take care'), (u'the Hrst', u'the first'), (u'toc late', u'too late'), (u'uf me', u'of me'), (u'uf our', u'of our'), (u'wa y', u'way'), (u'Wal-I\\/Iart', u'Wal-Mart'), (u"wasn '1' ", u"wasn't "), (u"Wasn '1' ", u"Wasn't "), (u"wasn '1\u2018 ", u"wasn't "), (u"Wasn '1\u2018 ", u"Wasn't "), (u"wasn 't", u"wasn't"), (u"Wasn 't", u"Wasn't"), (u"we 've", u"we've"), (u"We 've", u"We've"), (u"wem' off", u'went off'), (u"weren 't", u"weren't"), (u"who 's", u"who's"), (u"won 't", u"won't"), (u'would ha ve', u'would have '), (u"wouldn 't", u"wouldn't"), (u"Wouldn 't", u"Wouldn't"), (u'y()u', u'you'), (u'you QUYS', u'you guys'), (u"you' re ", u"you're "), (u"you 're ", u"you're "), (u"you 've", u"you've"), (u"You 've", u"You've"), (u"you' ve ", u"you've "), (u"you 've ", u"you've "), (u'aftera while', u'after a while'), (u'Aftera while', u'After a while'), (u'THUN DERCLAPS', u'THUNDERCLAPS'), (u'(BUZZI N G)', u'(BUZZING)'), (u'[BUZZI N G]', u'[BUZZING]'), (u'(G RU NTING', u'(GRUNTING'), (u'[G RU NTING', u'[GRUNTING'), (u'(G ROWLING', u'(GROWLING'), (u'[G ROWLING', u'[GROWLING'), (u' WAI LS)', u'WAILS)'), (u' WAI LS]', u'WAILS]'), (u'(scu RRYING)', u'(SCURRYING)'), (u'[scu RRYING]', u'[SCURRYING]'), (u'(GRUNT5)', u'(GRUNTS)'), (u'[GRUNT5]', u'[GRUNTS]'), (u'NARRA TOR:', u'NARRATOR:'), (u'(GROAN ING', u'(GROANING'), (u'[GROAN ING', u'[GROANING'), (u'GROAN ING)', u'GROANING)'), (u'GROAN ING]', u'GROANING]'), (u'(LAUGH ING', u'(LAUGHING'), (u'[LAUGH ING', u'[LAUGHING'), (u'LAUGH ING)', u'LAUGHING)'), (u'LAUGH ING]', u'LAUGHING]'), (u'(BU BBLING', u'(BUBBLING'), (u'[BU BBLING', u'[BUBBLING'), (u'BU BBLING)', u'BUBBLING)'), (u'BU BBLING]', u'BUBBLING]'), (u'(SH USHING', u'(SHUSHING'), (u'[SH USHING', u'[SHUSHING'), (u'SH USHING)', u'SHUSHING)'), (u'SH USHING]', u'SHUSHING]'), (u'(CH ILDREN', u'(CHILDREN'), (u'[CH ILDREN', u'[CHILDREN'), (u'CH ILDREN)', u'CHILDREN)'), (u'CH ILDREN]', u'CHILDREN]'), (u'(MURMU RING', u'(MURMURING'), (u'[MURMU RING', u'[MURMURING'), (u'MURMU RING)', u'MURMURING)'), (u'MURMU RING]', u'MURMURING]'), (u'(GU N ', u'(GUN '), (u'[GU N ', u'[GUN '), (u'GU N)', u'GUN)'), (u'GU N]', u'GUN]'), (u'CH ILDREN:', u'CHILDREN:'), (u'STU DENTS:', u'STUDENTS:'), (u'(WH ISTLE', u'(WHISTLE'), (u'[WH ISTLE', u'[WHISTLE'), (u'WH ISTLE)', u'WHISTLE)'), (u'WH ISTLE]', u'WHISTLE]'), (u'U LU LATING', u'ULULATING'), (u'AU DIENCE:', u'AUDIENCE:'), (u'HA WAIIAN', u'HAWAIIAN'), (u'(ARTH UR', u'(ARTHUR'), (u'[ARTH UR', u'[ARTHUR'), (u'ARTH UR)', u'ARTHUR)'), (u'ARTH UR]', u'ARTHUR]'), (u'J EREMY:', u'JEREMY:'), (u'(ELEVA TOR', u'(ELEVATOR'), (u'[ELEVA TOR', u'[ELEVATOR'), (u'ELEVA TOR)', u'ELEVATOR)'), (u'ELEVA TOR]', u'ELEVATOR]'), (u'CONTIN U ES', u'CONTINUES'), (u'WIN D HOWLING', u'WIND HOWLING'), (u'telis me', u'tells me'), (u'Telis me', u'Tells me'), (u'. Ls ', u'. Is '), (u'! Ls ', u'! Is '), (u'? Ls ', u'? Is '), (u'. Lt ', u'. It '), (u'! Lt ', u'! It '), (u'? Lt ', u'? It '), (u'SQMEWH ERE ELSE', u'SOMEWHERE ELSE'), (u' I,m ', u" I'm "), (u' I,ve ', u" I've "), (u' you,re ', u" you're "), (u' you,ll ', u" you'll "), (u' doesn,t ', u" doesn't "), (u' let,s ', u" let's "), (u' he,s ', u" he's "), (u' it,s ', u" it's "), (u' can,t ', u" can't "), (u' Can,t ', u" Can't "), (u' don,t ', u" don't "), (u' Don,t ', u" Don't "), (u"wouldn 'tyou", u"wouldn't you"), (u' lgot it', u' I got it'), (u' you,ve ', u" you've "), (u' I ve ', u" I've "), (u' I ii ', u" I'll "), (u' I m ', u" I'm "), (u' why d ', u" why'd "), (u' couldn t ', u" couldn't "), (u' that s ', u" that's "), (u' i... ', u' I... '), (u"L don't", u"I don't"), (u"L won't", u"I won't"), (u'L should', u'I should'), (u'L had', u'I had'), (u'L happen', u'I happen'), (u"L wasn't", u"I wasnt't"), (u'H i', u'Hi'), (u"L didn't", u"I didn't"), (u'L do', u'I do'), (u'L could', u'I could'), (u'L will', u'I will'), (u'L suggest', u'I suggest'), (u'L reckon', u'I reckon'), (u'L am', u'I am'), (u"L couldn't", u"I couldn't"), (u'L might', u'I might'), (u'L would', u'I would'), (u'L was', u'I was'), (u'L know', u'I know'), (u'L think', u'I think'), (u"L haven't", u"I haven't"), (u'L have ', u'I have'), (u'L want', u'I want'), (u'L can', u'I can'), (u'L love', u'I love'), (u'L like', u'I like')]), 'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:\\ \\/be\\ |\\ aren\\ \\'1\\'|\\ aren\\'tyou|\\ doesn\\ \\'1\\'|\\ fr\\/eno\\'|\\ fr\\/eno\\'\\.|\\ haven\\ \\'z\\'\\ |\\ haven\\ \\'z\\'\\.|\\ I\\ ha\\ ve\\ |\\ I\\'\\]I\\ |\\ L\\ am|\\ L\\ can|\\ L\\ don\\'t\\ |\\ L\\ hate\\ |\\ L\\ have\\ |\\ L\\ like\\ |\\ L\\ will|\\ L\\ would|\\ L\\'ll\\ |\\ L\\'ve\\ |\\ m\\ y\\ family|\\ \\'s\\ |\\ shou\\/dn\\ \\'1\\ |\\ won\\ \\'z\\'\\ |\\ won\\ \\'z\\'\\.|\\ wou\\/c\\/n\\ \\'z\\'\\ |\\ wou\\/c\\/n\\ \\'z\\'\\.|\\ wou\\/dn\\ \\'z\\'\\ |\\ wou\\/dn\\ \\'z\\'\\.|\\/\\ did|\\/\\ have\\ |\\/\\ just\\ |\\/\\ loved\\ |\\/\\ need|\\|was11|at\\ Hrst|B\\ ullshiz\\'|big\\ lunk|can\\ \\'t|can\\'\\ t\\ |can\\ \\'t\\ |CHA\\ TTERING|come\\ 0n|Come\\ 0n|couldn\\ \\'t|couldn\\'\\ t\\ |couldn\\ \\'t\\ |Destin\\ y\\'s|didn\\ \\'t|didn\\'\\ t\\ |didn\\ \\'t\\ |Doesn\\ \\'1\\'|doesn\\ \\'1\\'\\ |doesn\\ \\'1\\\u2018\\ |doesn\\ \\'t|doesn\\'1\\'\\ |doesn\\'1\\\u2018\\ |don\\ \\'1\\'\\ |don\\ \\'1\\\u2018\\ |don\\ \\'2\\'\\ |\\ aren\\ \\'2\\'|aren\\ \\'2\\'\\ |don\\ \\'2\\\u2018\\ |don\\ \\'t|Don\\'\\ t\\ |Don\\ \\'t\\ |don\\'1\\'\\ |don\\'1\\\u2018\\ |there\\ \\'5\\ |E\\ very|get\\ 0n|go\\ 0n|Go\\ 0n|H3993\\'\\ birthday|hadn\\ \\'t|he\\ \\'s|He\\ \\'s|He\\ y|he\\)\\/|He\\)\\/|HEA\\ VY|Henry\\ ll|Henry\\ lll|Henry\\ Vlll|Henry\\ Vll|Henry\\ Vl|Hold\\ 0n|I\\ am\\.\\ ls|I\\ d0|I\\ \\'m|I\\ \\'rn\\ |I\\ \\'ve|I0\\ ve\\ her|I0\\ ve\\ you|I02\\'|I\\'m\\ sony|isn\\'\\ t\\ |isn\\ \\'t\\ |K\\)\\/le|L\\ ook|let\\ me\\ 90|Let\\ me\\ 90|let\\'s\\ 90|Let\\'s\\ 90|lfl\\ had|lova\\ you|Lova\\ you|lovo\\ you|Lovo\\ you|ls\\ anyone|ls\\ he|\\-ls\\ he|ls\\ it|\\-ls\\ it|ls\\ she|\\-ls\\ she|ls\\ that|\\-ls\\ that|ls\\ this|\\-ls\\ this|Maze\\]\\ tov|N02\\'\\ |\\ of\\ 0ur\\ |\\ ot\\ mine\\ |PLA\\ YING|REPEA\\ TING\\ |Sa\\ y|she\\ \\'s|She\\ \\'s|shouldn\\ \\'t|sta\\ y|Sta\\ y|SWO\\ rd|taka\\ care|Taka\\ care|the\\ Hrst|toc\\ late|uf\\ me|uf\\ our|wa\\ y|Wal\\-I\\\\\\/Iart|wasn\\ \\'1\\'\\ |Wasn\\ \\'1\\'\\ |wasn\\ \\'1\\\u2018\\ |Wasn\\ \\'1\\\u2018\\ |wasn\\ \\'t|Wasn\\ \\'t|we\\ \\'ve|We\\ \\'ve|wem\\'\\ off|weren\\ \\'t|who\\ \\'s|won\\ \\'t|would\\ ha\\ ve|wouldn\\ \\'t|Wouldn\\ \\'t|y\\(\\)u|you\\ QUYS|you\\'\\ re\\ |you\\ \\'re\\ |you\\ \\'ve|You\\ \\'ve|you\\'\\ ve\\ |you\\ \\'ve\\ |aftera\\ while|Aftera\\ while|THUN\\ DERCLAPS|\\(BUZZI\\ N\\ G\\)|\\[BUZZI\\ N\\ G\\]|\\(G\\ RU\\ NTING|\\[G\\ RU\\ NTING|\\(G\\ ROWLING|\\[G\\ ROWLING|\\ WAI\\ LS\\)|\\ WAI\\ LS\\]|\\(scu\\ RRYING\\)|\\[scu\\ RRYING\\]|\\(GRUNT5\\)|\\[GRUNT5\\]|NARRA\\ TOR\\:|\\(GROAN\\ ING|\\[GROAN\\ ING|GROAN\\ ING\\)|GROAN\\ ING\\]|\\(LAUGH\\ ING|\\[LAUGH\\ ING|LAUGH\\ ING\\)|LAUGH\\ ING\\]|\\(BU\\ BBLING|\\[BU\\ BBLING|BU\\ BBLING\\)|BU\\ BBLING\\]|\\(SH\\ USHING|\\[SH\\ USHING|SH\\ USHING\\)|SH\\ USHING\\]|\\(CH\\ ILDREN|\\[CH\\ ILDREN|CH\\ ILDREN\\)|CH\\ ILDREN\\]|\\(MURMU\\ RING|\\[MURMU\\ RING|MURMU\\ RING\\)|MURMU\\ RING\\]|\\(GU\\ N\\ |\\[GU\\ N\\ |GU\\ N\\)|GU\\ N\\]|CH\\ ILDREN\\:|STU\\ DENTS\\:|\\(WH\\ ISTLE|\\[WH\\ ISTLE|WH\\ ISTLE\\)|WH\\ ISTLE\\]|U\\ LU\\ LATING|AU\\ DIENCE\\:|HA\\ WAIIAN|\\(ARTH\\ UR|\\[ARTH\\ UR|ARTH\\ UR\\)|ARTH\\ UR\\]|J\\ EREMY\\:|\\(ELEVA\\ TOR|\\[ELEVA\\ TOR|ELEVA\\ TOR\\)|ELEVA\\ TOR\\]|CONTIN\\ U\\ ES|WIN\\ D\\ HOWLING|telis\\ me|Telis\\ me|\\.\\ Ls\\ |\\!\\ Ls\\ |\\?\\ Ls\\ |\\.\\ Lt\\ |\\!\\ Lt\\ |\\?\\ Lt\\ |SQMEWH\\ ERE\\ ELSE|\\ I\\,m\\ |\\ I\\,ve\\ |\\ you\\,re\\ |\\ you\\,ll\\ |\\ doesn\\,t\\ |\\ let\\,s\\ |\\ he\\,s\\ |\\ it\\,s\\ |\\ can\\,t\\ |\\ Can\\,t\\ |\\ don\\,t\\ |\\ Don\\,t\\ |wouldn\\ \\'tyou|\\ lgot\\ it|\\ you\\,ve\\ |\\ I\\ ve\\ |\\ I\\ ii\\ |\\ I\\ m\\ |\\ why\\ d\\ |\\ couldn\\ t\\ |\\ that\\ s\\ |\\ i\\.\\.\\.\\ |L\\ don\\'t|L\\ won\\'t|L\\ should|L\\ had|L\\ happen|L\\ wasn\\'t|H\\ i|L\\ didn\\'t|L\\ do|L\\ could|L\\ will|L\\ suggest|L\\ reckon|L\\ am|L\\ couldn\\'t|L\\ might|L\\ would|L\\ was|L\\ know|L\\ think|L\\ haven\\'t|L\\ have\\ |L\\ want|L\\ can|L\\ love|L\\ like)(?:(?=\\s)|(?=$)|(?=\\b))"}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xa4', u'o'), (u'lVI', u'M'), (u'IVl', u'M'), (u'lVl', u'M'), (u'I\\/I', u'M'), (u'l\\/I', u'M'), (u'I\\/l', u'M'), (u'l\\/l', u'M'), (u'IVIa', u'Ma'), (u'IVIe', u'Me'), (u'IVIi', u'Mi'), (u'IVIo', u'Mo'), (u'IVIu', u'Mu'), (u'IVIy', u'My'), (u' l ', u' I '), (u'l/an', u'lian'), (u'\xb0x\xb0', u'%'), (u'\xc3\xc2s', u"'s"), (u'at/on', u'ation'), (u'lljust', u'll just'), (u"'sjust", u"'s just"), (u'compiete', u'complete'), (u' L ', u' I '), (u'a/ion', u'ation'), (u'\xc2s', u"'s"), (u"'tjust", u"'t just"), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict([(u'\xa4', u'o'), (u'lVI', u'M'), (u'IVl', u'M'), (u'lVl', u'M'), (u'I\\/I', u'M'), (u'l\\/I', u'M'), (u'I\\/l', u'M'), (u'l\\/l', u'M'), (u'IVIa', u'Ma'), (u'IVIe', u'Me'), (u'IVIi', u'Mi'), (u'IVIo', u'Mo'), (u'IVIu', u'Mu'), (u'IVIy', u'My'), (u' l ', u' I '), (u'l/an', u'lian'), (u'\xb0x\xb0', u'%'), (u'\xc3\xc2s', u"'s"), (u'at/on', u'ation'), (u'lljust', u'll just'), (u"'sjust", u"'s just"), (u'compiete', u'complete'), (u' L ', u' I '), (u'a/ion', u'ation'), (u'\xc2s', u"'s"), (u"'tjust", u"'t just")]), 'pattern': None}, 'WholeLines': {'data': OrderedDict([(u'H ey.', u'Hey.'), (u'He)\u2019-', u'Hey.'), (u'N0.', u'No.'), (u'-N0.', u'-No.'), (u'Noll', u'No!!'), (u'(G ROANS)', u'(GROANS)'), (u'[G ROANS]', u'[GROANS]'), (u'(M EOWS)', u'(MEOWS)'), (u'[M EOWS]', u'[MEOWS]'), (u'Uaughs]', u'[laughs]'), (u'[chitte rs]', u'[chitters]'), (u'Hil\u2018 it!', u'Hit it!'), (u'Hil\u2018 it!', u'Hit it!'), (u'ISIGHS]', u'[SIGHS]')]), 'pattern': None}, @@ -54,7 +54,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict([(u'Katsokaa pa.', u'Katsokaapa.'), (u'Mik!\r\n""e\u201c9ir\xe4\u0131', u'Mik!\r\n-Hengit\xe4!'), (u'Tu lta!', u'Tulta!'), (u'...0I1...', u'...on...'), (u'Ken g\xe4n nauh oja?', u'Keng\xe4nnauhoja?'), (u'k\xe3mmott\xe3V\xe3ll\xe3 mUiStoll\xe3.', u'kammottavana muistona.'), (u'H\xe4n n\xe4ki naisen menev\xe4n\r\nkellarikerroksen ksen asun to o ns\xe4.', u'H\xe4n n\xe4ki naisen menev\xe4n\r\nkellarikerroksen asuntoonsa.'), (u'Min\xe4 etsin k\xe4siini miehen, joka\r\non aurtanutiestradea ja minua:', u'Min\xe4 etsin k\xe4siini miehen, joka\r\non auttanut Lestradea ja minua:'), (u'Huomaa erityisesti\r\npunaisella merkitty "kitoris.', u'Huomaa erityisesti\r\npunaisella merkitty "klitoris".'), (u'Tulkaa, meill\xe4 on\r\nHa va\u0131ji-bileet suihkussa', u'Tulkaa, meill\xe4 on\r\nHavaiji-bileet suihkussa'), (u'Ta rkoitatko ett\xe4\r\nh\xe4net myrkytettiin?', u'Tarkoitatko ett\xe4\r\nh\xe4net myrkytettiin?'), (u'Odotta kaa soittoani\r\nIev\xe4hdyspaikalla.', u'Odottakaa soittoani\r\nlev\xe4hdyspaikalla.'), (u'Nyt kuuntelet, perska rva.', u'Nyt kuuntelet, perskarva.'), (u'Ta patko h\xe4net sitten?', u'Tapatko h\xe4net sitten?'), (u'Seuraa vissa va/oissa.', u'Seuraavissa valoissa.'), (u'A\u0131o\u0131t rapattaa minut.\r\n- En.', u'Aioit tapattaa minut.\r\n- En.'), (u'Todella vaku uttavaa.', u'Todella vakuuttavaa.'), (u'I-le ovat tuolla alhaalla', u'He ovat tuolla alhaalla'), (u'Nainen kuuluu minulle.\r\n- I-I\xe0ivy siit\xe4, ylikasvuinen hyttynen!', u'Nainen kuuluu minulle.\r\n- H\xe4ivy siit\xe4, ylikasvuinen hyttynen!'), (u'I-Ialuatte k\xe4ytt\xe4\xe4 pyh\xe0\xe0 kive\xe4\r\ndynastian aarteen l\xf6yt\xe4miseksi.', u'Haluatte k\xe4ytt\xe4\xe4 pyh\xe0\xe0 kive\xe4\r\ndynastian aarteen l\xf6yt\xe4miseksi.'), (u'Mit\xe4f?', u'Mit\xe4.. ?'), (u'Kuuluuko Hiru ko-klaanista mit\xe4\xe4n?\r\n- Ninjasoturit ovat edell\xe4mme.', u'Kuuluuko Hiruko-klaanista mit\xe4\xe4n?\r\n- Ninjasoturit ovat edell\xe4mme.'), (u'Anteeks\u0131} painoin kai... -', u'Anteeksi, painoin kai... -'), (u'ja Rea! Ho usew\xedves.', u'ja Real Housewives.'), (u'Et halu n n ut Julkkistansseihinkaan.', u'Et halunnut Julkkistansseihinkaan.'), (u'Laard i k\xe4si?', u'Laardik\xe4si?'), (u'Varo kaa!', u'Varokaa!'), (u'N\xe4ytt\xe4v\xe4t k\xf6 tyt\xf6t v\xe4h \xe4n\r\nh uorahtavi m m i lta?', u'N\xe4ytt\xe4v\xe4tk\xf6 tyt\xf6t v\xe4h\xe4n\r\nhuorahtavimmilta?'), (u'Stif... Ier.', u'Stif... ler.'), (u'J u mantsu kka! M it\xe4?', u'Jumantsukka! Mit\xe4?'), (u'Varasin Ch u m bawam ban,', u'Varasin Chumbawamban,'), (u'J u malavita!', u'Jumalavita!'), (u'S', u'Isi...'), (u'Haluan kertoa jotai n', u'Haluan kertoa jotain'), (u'I-Ialuatte', u'Haluatte')]), 'pattern': None}, @@ -66,7 +66,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict([(u" I'", u" l'"), (u" |'", u" l'")]), 'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:\\ I\\'|\\ \\|\\')(?:(?=\\s)|(?=$)|(?=\\b))"}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict([(u'"D\'ac:c:ord."', u'"D\'accord."'), (u'\u201ci QU\xce gagne, qui perd,', u'ni qui gagne, qui perd,'), (u"L'ac:c:ent est mis \r\n \r\n sur son trajet jusqu'en Suisse.", u"L'accent est mis \r\n \r\n sur son trajet jusqu'en Suisse."), (u"C'est la plus gentille chose \r\n \r\n qu'Hitchc:oc:k m'ait jamais dite.", u"C'est la plus gentille chose \r\n \r\n qu'Hitchcock m'ait jamais dite."), (u"Tout le monde, en revanche, qualifie \r\n \r\n Goldfinger d'aventu re structur\xe9e,", u"Tout le monde, en revanche, qualifie \r\n \r\n Goldfinger d'aventure structur\xe9e,"), (u'et le film Shadow of a man \r\n \r\n a lanc\xe9 sa carri\xe8re au cin\xe9ma.', u'et le film Shadow of a man \r\n \r\n a lanc\xe9 sa carri\xe8re au cin\xe9ma.'), (u'En 1948, Young est pass\xe9 \xe0 la r\xe9alisation \r\n \r\n avec One night with you.', u'En 1948, Young est pass\xe9 \xe0 la r\xe9alisation \r\n \r\n avec One night with you.'), (u'Il a construit tous ces v\xe9hicules \r\n \r\n \xe0 C)c:ala, en Floride.', u'Il a construit tous ces v\xe9hicules \r\n \r\n \xe0 Ocala, en Floride.'), (u'Tokyo Pop et A Taxing Woman? Return.', u"Tokyo Pop et A Taxing Woman's Return."), (u'Peter H u nt.', u'Peter Hunt.'), (u'"C\'est bien mieux dans Peau. \r\n \r\n On peut s\ufb02\xe9clabousser, faire du bruit."', u'"C\'est bien mieux dans l\'eau. \r\n \r\n On peut s\'\xe9clabousser, faire du bruit."')]), 'pattern': None}, @@ -78,7 +78,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict([(u'Ako ej', u'Ako je'), (u'ako ej', u'ako je'), (u'bez svesti', u'bez svijesti'), (u'Bi\u0107u uz', u'Bit \u0107u uz'), (u'bi ja', u'bih ja'), (u'bi la', u'bila'), (u'biti uredu', u'biti u redu'), (u'bi da bude', u'bi biti'), (u'Bi ste', u'Biste'), (u'Bilo ko', u'Bilo tko'), (u'bilo ko', u'bilo tko'), (u'\u0107e da do\u0111e', u'\u0107e do\u0107i'), (u'Da li \u0107e', u'Ho\u0107e li'), (u'Da li \u0107emo', u'Ho\u0107emo li'), (u'Da li \u0107u', u'Ho\u0107u li'), (u'da li \u0107u', u'ho\u0107u li'), (u'dali \u0107u', u'ho\u0107u li'), (u'Da li je', u'Je li'), (u'da li je', u'je li'), (u'dali je', u'je li'), (u'Da li ste', u'Jeste li'), (u'Da li si', u'Jesi li'), (u'dali si', u'jesi li'), (u'da li \u0107e', u'ho\u0107e li'), (u'dali \u0107e', u'ho\u0107e li'), (u'do srede', u'do srijede'), (u'Dobro ve\u010de', u'Dobra ve\u010der'), (u'Dobro ve\u010der', u'Dobra ve\u010der'), (u'Dobar ve\u010der', u'Dobra ve\u010der'), (u'gdje ide\u0161', u'kamo ide\u0161'), (u'Gdje ide\u0161', u'Kamo ide\u0161'), (u'Gdje sada', u'Kamo sada'), (u'gle ko', u'gle tko'), (u'ho\u0107u da budem', u'\u017eelim biti'), (u'Ho\u0107u da budem', u'\u017delim biti'), (u'ho\u0107u da ka\u017eem', u'\u017eelim re\u0107i'), (u'ho\u0107e\u0161 da ka\u017ee\u0161', u'\u017eeli\u0161 re\u0107i'), (u'ho\u0107e da ka\u017ee', u'\u017eeli re\u0107i'), (u'ho\u0107u da \u017eivim', u'\u017eelim \u017eivjeti'), (u'Izvini se', u'Ispri\u010daj se'), (u'izvini se', u'ispri\u010daj se'), (u'Izvinite me', u'Ispri\u010dajte me'), (u'Izvinite nas', u'Ispri\u010dajte nas'), (u'izvinite nas', u'ispri\u010dajte nas'), (u'Izvinjavamo se', u'Ispri\u010davamo se'), (u'ja bi', u'ja bih'), (u'Ja bi', u'Ja bih'), (u'Jel sam ti', u'Jesam li ti'), (u'Jeli se', u'Je li se'), (u'Jeli sve', u'Je li sve'), (u'Jeli ti', u'Je li ti'), (u'ko je', u'tko je'), (u'ko si', u'tko si'), (u'ko ti je', u'tko ti je'), (u'ko te je', u'tko te je'), (u'ko zna', u'tko zna'), (u'mo\u0107i da idemo', u'mo\u0107i i\u0107i'), (u'moglo da bude', u'moglo biti'), (u'moje sau\u010de\u0161\u0107e', u'moja su\u0107ut'), (u'mora da bude', u'mora biti'), (u'moram da budem', u'moram biti'), (u'Moram da idem', u'Moram i\u0107i'), (u'moram da idem', u'moram i\u0107i'), (u'Mora\u0161 da ide\u0161', u'Mora\u0161 i\u0107i'), (u'Moramo da idemo', u'Moramo i\u0107i'), (u'moram da vidim', u'moram vidjeti'), (u'moram da zaboravim', u'moram zaboraviti'), (u'mora\u0161 da zaboravi\u0161', u'mora\u0161 zaboraviti'), (u'mora da zna', u'mora znati'), (u'moram da znam', u'moram znati'), (u'Moram da znam', u'Moram znati'), (u'mora\u0161 da zna\u0161', u'mora\u0161 znati'), (u'mora\u0161 da ide\u0161', u'mora\u0161 i\u0107i'), (u'mo\u017ee da bude', u'mo\u017ee biti'), (u'mo\u017ee\u0161 da bude\u0161', u'mo\u017ee\u0161 biti'), (u'mo\u017ee da di\u0161e', u'mo\u017ee disati'), (u'mo\u017ee\u0161 da dobije\u0161', u'mo\u017ee\u0161 dobiti'), (u'mo\u017eemo da imamo', u'mo\u017eemo imati'), (u'na ve\u010der', u'nave\u010der'), (u'Na ve\u010der', u'Nave\u010der'), (u'ne\u0107e da bude', u'ne\u0107e biti'), (u'ne\u0107e\u0161 da bude\u0161', u'ne\u0107e\u0161 biti'), (u'ne\u0107e\u0161 da po\u017eali\u0161', u'ne\u0107e\u0161 po\u017ealiti'), (u'Neko ko', u'Netko tko'), (u'neko ko', u'netko tko'), (u'neko ne\u0161to', u'netko ne\u0161to'), (u'nedjelju dana', u'tjedan dana'), (u'Ne mogu da verujem', u'Ne mogu vjerovati'), (u'new yor\u0161ki', u'njujor\u0161ki'), (u'nju jor\u0161ki', u'njujor\u0161ki'), (u'od kako', u'otkako'), (u'Pla\u0161im se', u'Bojim se'), (u'pla\u0161im se', u'bojim se'), (u'pravo u o\u010di', u'ravno u o\u010di'), (u'sa njim', u's njim'), (u'sa njima', u's njima'), (u'sa njom', u's njom'), (u'sa tim', u's tim'), (u'sa tom', u's tom'), (u'sa tobom', u's tobom'), (u'sa vama', u's vama'), (u'sam da budem', u'sam biti'), (u'si\u0107i dolje', u'si\u0107i'), (u'Si dobro', u'Jesi li dobro'), (u'Svako ko', u'Svatko tko'), (u'Svo vreme', u'Sve vrijeme'), (u'Svo vrijeme', u'Sve vrijeme'), (u'smeo da', u'smio'), (u'smeli da', u'smjeli'), (u'\u0160to ej', u'\u0160to je'), (u'\u0161to ej', u'\u0161to je'), (u'to j', u'to je'), (u'to ej', u'to je'), (u'To ej', u'To je'), (u'tamo natrag', u'tamo iza'), (u'tamo je natrag', u'tamo je iza'), (u'Tamo je natrag', u'Tamo je iza'), (u'treba da bude', u'treba biti'), (u'u jutro', u'ujutro'), (u'u\u0107i unutra', u'u\u0107i'), (u'vas je lagao', u'vam je lagao'), (u'za uvijek', u'zauvijek'), (u'zato sto', u'zato \u0161to'), (u'zna da bude', u'zna biti'), (u'zna ko', u'zna tko'), (u'znati ko', u'znati tko'), (u'\u017eele da budu', u'\u017eele biti'), (u'\u017eeli da bude', u'\u017eeli biti'), (u'\u017eelio da budem', u'\u017eelio biti'), (u'\u017eelim da budem', u'\u017eelim biti'), (u'\u017delim da budem', u'\u017delim biti'), (u'\u017eeli\u0161 da bude\u0161', u'\u017eeli\u0161 biti'), (u'\u017eelim da idem', u'\u017eelim i\u0107i'), (u'\u017eelim da odem', u'\u017eelim oti\u0107i'), (u'\u017eeli\u0161 da ode\u0161', u'\u017eeli\u0161 oti\u0107i'), (u'\u017eeli\u0161 da u\u0111e\u0161', u'\u017eeli\u0161 u\u0107i'), (u'\u017eelim da umrem', u'\u017eelim umrijeti'), (u'\u017delim da znam', u'\u017delim znati'), (u'\u017eelim da znam', u'\u017eelim znati'), (u'\u017eeli\u0161 da zna\u0161', u'\u017eeli\u0161 znati')]), 'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:Ako\\ ej|ako\\ ej|bez\\ svesti|Bi\\\u0107u\\ uz|bi\\ ja|bi\\ la|biti\\ uredu|bi\\ da\\ bude|Bi\\ ste|Bilo\\ ko|bilo\\ ko|\\\u0107e\\ da\\ do\\\u0111e|Da\\ li\\ \\\u0107e|Da\\ li\\ \\\u0107emo|Da\\ li\\ \\\u0107u|da\\ li\\ \\\u0107u|dali\\ \\\u0107u|Da\\ li\\ je|da\\ li\\ je|dali\\ je|Da\\ li\\ ste|Da\\ li\\ si|dali\\ si|da\\ li\\ \\\u0107e|dali\\ \\\u0107e|do\\ srede|Dobro\\ ve\\\u010de|Dobro\\ ve\\\u010der|Dobar\\ ve\\\u010der|gdje\\ ide\\\u0161|Gdje\\ ide\\\u0161|Gdje\\ sada|gle\\ ko|ho\\\u0107u\\ da\\ budem|Ho\\\u0107u\\ da\\ budem|ho\\\u0107u\\ da\\ ka\\\u017eem|ho\\\u0107e\\\u0161\\ da\\ ka\\\u017ee\\\u0161|ho\\\u0107e\\ da\\ ka\\\u017ee|ho\\\u0107u\\ da\\ \\\u017eivim|Izvini\\ se|izvini\\ se|Izvinite\\ me|Izvinite\\ nas|izvinite\\ nas|Izvinjavamo\\ se|ja\\ bi|Ja\\ bi|Jel\\ sam\\ ti|Jeli\\ se|Jeli\\ sve|Jeli\\ ti|ko\\ je|ko\\ si|ko\\ ti\\ je|ko\\ te\\ je|ko\\ zna|mo\\\u0107i\\ da\\ idemo|moglo\\ da\\ bude|moje\\ sau\\\u010de\\\u0161\\\u0107e|mora\\ da\\ bude|moram\\ da\\ budem|Moram\\ da\\ idem|moram\\ da\\ idem|Mora\\\u0161\\ da\\ ide\\\u0161|Moramo\\ da\\ idemo|moram\\ da\\ vidim|moram\\ da\\ zaboravim|mora\\\u0161\\ da\\ zaboravi\\\u0161|mora\\ da\\ zna|moram\\ da\\ znam|Moram\\ da\\ znam|mora\\\u0161\\ da\\ zna\\\u0161|mora\\\u0161\\ da\\ ide\\\u0161|mo\\\u017ee\\ da\\ bude|mo\\\u017ee\\\u0161\\ da\\ bude\\\u0161|mo\\\u017ee\\ da\\ di\\\u0161e|mo\\\u017ee\\\u0161\\ da\\ dobije\\\u0161|mo\\\u017eemo\\ da\\ imamo|na\\ ve\\\u010der|Na\\ ve\\\u010der|ne\\\u0107e\\ da\\ bude|ne\\\u0107e\\\u0161\\ da\\ bude\\\u0161|ne\\\u0107e\\\u0161\\ da\\ po\\\u017eali\\\u0161|Neko\\ ko|neko\\ ko|neko\\ ne\\\u0161to|nedjelju\\ dana|Ne\\ mogu\\ da\\ verujem|new\\ yor\\\u0161ki|nju\\ jor\\\u0161ki|od\\ kako|Pla\\\u0161im\\ se|pla\\\u0161im\\ se|pravo\\ u\\ o\\\u010di|sa\\ njim|sa\\ njima|sa\\ njom|sa\\ tim|sa\\ tom|sa\\ tobom|sa\\ vama|sam\\ da\\ budem|si\\\u0107i\\ dolje|Si\\ dobro|Svako\\ ko|Svo\\ vreme|Svo\\ vrijeme|smeo\\ da|smeli\\ da|\\\u0160to\\ ej|\\\u0161to\\ ej|to\\ j|to\\ ej|To\\ ej|tamo\\ natrag|tamo\\ je\\ natrag|Tamo\\ je\\ natrag|treba\\ da\\ bude|u\\ jutro|u\\\u0107i\\ unutra|vas\\ je\\ lagao|za\\ uvijek|zato\\ sto|zna\\ da\\ bude|zna\\ ko|znati\\ ko|\\\u017eele\\ da\\ budu|\\\u017eeli\\ da\\ bude|\\\u017eelio\\ da\\ budem|\\\u017eelim\\ da\\ budem|\\\u017delim\\ da\\ budem|\\\u017eeli\\\u0161\\ da\\ bude\\\u0161|\\\u017eelim\\ da\\ idem|\\\u017eelim\\ da\\ odem|\\\u017eeli\\\u0161\\ da\\ ode\\\u0161|\\\u017eeli\\\u0161\\ da\\ u\\\u0111e\\\u0161|\\\u017eelim\\ da\\ umrem|\\\u017delim\\ da\\ znam|\\\u017eelim\\ da\\ znam|\\\u017eeli\\\u0161\\ da\\ zna\\\u0161)(?:(?=\\s)|(?=$)|(?=\\b))'}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -90,7 +90,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -102,7 +102,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\u010d', u'\xe8'), (u'I\u05bb', u'I'), (u'\u05d0', u'\xe0'), (u'\u05d9', u'\xe9'), (u'\u05d8', u'\xe8'), (u'\u05db', u'\xeb'), (u'\u05dd', u'i'), (u'\u05df', u'\xef'), (u'\u05e3', u'\xf3'), (u'\u05e4', u'o'), (u'\u05e6', u'\xeb'), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict([(u'\u010d', u'\xe8'), (u'I\u05bb', u'I'), (u'\u05d0', u'\xe0'), (u'\u05d9', u'\xe9'), (u'\u05d8', u'\xe8'), (u'\u05db', u'\xeb'), (u'\u05dd', u'i'), (u'\u05df', u'\xef'), (u'\u05e3', u'\xf3'), (u'\u05e4', u'o'), (u'\u05e6', u'\xeb')]), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -114,7 +114,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -126,7 +126,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -138,7 +138,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict([(u'IN 6-E', u'N 6 E'), (u'in tegrar-se', u'integrar-se'), (u'in teresse', u'interesse'), (u'in testinos', u'intestinos'), (u'indica \xe7\xe3o', u'indica\xe7\xe3o'), (u'inte tino', u'intestino'), (u'intes tinos', u'intestinos'), (u'L da', u'Lda'), (u'mal estar', u'mal-estar'), (u'mastiga \xe7\xe1o', u'mastiga\xe7\xe3o'), (u'm\xe9di cas', u'm\xe9dicas'), (u'mineo rais', u'minerais'), (u'mola res', u'molares'), (u'movi mentos', u'movimentos'), (u'movimen to', u'movimento'), (u'N 5-Estendido', u'N\xba 5 Estendido'), (u'oxig\xe9 nio', u'oxig\xe9nio'), (u'pod mos', u'podemos'), (u'poder-se ia', u'poder-se-ia'), (u'pos sibilidade', u'possibilidade'), (u'possibi lidades', u'possibilidades'), (u'pro duto', u'produto'), (u'procu rar', u'procurar'), (u'Q u e', u'Que'), (u'qualifi cam', u'qualificam'), (u'R egi\xe3o', u'Regi\xe3o'), (u'unsuficien temente', u'insuficientemente')]), 'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:IN\\ 6\\-E|in\\ tegrar\\-se|in\\ teresse|in\\ testinos|indica\\ \\\xe7\\\xe3o|inte\\ tino|intes\\ tinos|L\\ da|mal\\ estar|mastiga\\ \\\xe7\\\xe1o|m\\\xe9di\\ cas|mineo\\ rais|mola\\ res|movi\\ mentos|movimen\\ to|N\\ 5\\-Estendido|oxig\\\xe9\\ nio|pod\\ mos|poder\\-se\\ ia|pos\\ sibilidade|possibi\\ lidades|pro\\ duto|procu\\ rar|Q\\ u\\ e|qualifi\\ cam|R\\ egi\\\xe3o|unsuficien\\ temente)(?:(?=\\s)|(?=$)|(?=\\b))'}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -150,7 +150,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -162,7 +162,7 @@ 'pattern': u'(?um)(?:\\.\\\xbb\\.)$'}, 'PartialLines': {'data': OrderedDict([(u'de gratis', u'gratis'), (u'si quiera', u'siquiera'), (u'Cada una de los', u'Cada uno de los'), (u'Cada uno de las', u'Cada una de las'), (u'haber que', u'a ver qu\xe9'), (u'haber qu\xe9', u'a ver qu\xe9'), (u'Haber si', u'A ver si'), (u' que hora', u' qu\xe9 hora'), (u'yo que se', u'yo qu\xe9 s\xe9'), (u'Yo que se', u'Yo qu\xe9 s\xe9'), (u' tu!', u' t\xfa!'), (u' si!', u' s\xed!'), (u' mi!', u' m\xed!'), (u' el!', u' \xe9l!'), (u' tu?', u' t\xfa?'), (u' si?', u' s\xed?'), (u' mi?', u' m\xed?'), (u' el?', u' \xe9l?'), (u' aun?', u' a\xfan?'), (u' mas?', u' m\xe1s?'), (u' que?', u' qu\xe9?'), (u' paso?', u' pas\xf3?'), (u' cuando?', u' cu\xe1ndo?'), (u' cuanto?', u' cu\xe1nto?'), (u' cuanta?', u' cu\xe1nta?'), (u' cuantas?', u' cu\xe1ntas?'), (u' cuantos?', u' cu\xe1ntos?'), (u' donde?', u' d\xf3nde?'), (u' quien?', u' qui\xe9n?'), (u' como?', u' c\xf3mo?'), (u' adonde?', u' ad\xf3nde?'), (u' cual?', u' cu\xe1l?'), (u'\xbfSi?', u'\xbfS\xed?'), (u'\xbfesta bien?', u'\xbfest\xe1 bien?'), (u'\xbfPero qu\xe9 haces?', u'\xa1\xbfPero qu\xe9 haces?!'), (u'\xbfpero qu\xe9 haces?', u'\xa1\xbfpero qu\xe9 haces?!'), (u'\xbfEs que no me has escuchado?', u'\xa1\xbfEs que no me has escuchado?!'), (u'\xa1\xbfes que no me has escuchado?!', u'\xa1\xbfes que no me has escuchado?!'), (u'\xbfaun', u'\xbfa\xfan'), (u'\xbftu ', u'\xbft\xfa '), (u'\xbfque ', u'\xbfqu\xe9 '), (u'\xbfsabes que', u'\xbfsabes qu\xe9'), (u'\xbfsabes adonde', u'\xbfsabes ad\xf3nde'), (u'\xbfsabes cual', u'\xbfsabes cu\xe1l'), (u'\xbfsabes quien', u'\xbfsabes qui\xe9n'), (u'\xbfsabes como', u'\xbfsabes c\xf3mo'), (u'\xbfsabes cuan', u'\xbfsabes cu\xe1n'), (u'\xbfsabes cuanto', u'\xbfsabes cu\xe1nto'), (u'\xbfsabes cuanta', u'\xbfsabes cu\xe1nta'), (u'\xbfsabes cuantos', u'\xbfsabes cu\xe1ntos'), (u'\xbfsabes cuantas', u'\xbfsabes cu\xe1ntas'), (u'\xbfsabes cuando', u'\xbfsabes cu\xe1ndo'), (u'\xbfsabes donde', u'\xbfsabes d\xf3nde'), (u'\xbfsabe que', u'\xbfsabe qu\xe9'), (u'\xbfsabe adonde', u'\xbfsabe ad\xf3nde'), (u'\xbfsabe cual', u'\xbfsabe cu\xe1l'), (u'\xbfsabe quien', u'\xbfsabe qui\xe9n'), (u'\xbfsabe como', u'\xbfsabe c\xf3mo'), (u'\xbfsabe cuan', u'\xbfsabe cu\xe1n'), (u'\xbfsabe cuanto', u'\xbfsabe cu\xe1nto'), (u'\xbfsabe cuanta', u'\xbfsabe cu\xe1nta'), (u'\xbfsabe cuantos', u'\xbfsabe cu\xe1ntos'), (u'\xbfsabe cuantas', u'\xbfsabe cu\xe1ntas'), (u'\xbfsabe cuando', u'\xbfsabe cu\xe1ndo'), (u'\xbfsabe donde', u'\xbfsabe d\xf3nde'), (u'\xbfsaben que', u'\xbfsaben qu\xe9'), (u'\xbfsaben adonde', u'\xbfsaben ad\xf3nde'), (u'\xbfsaben cual', u'\xbfsaben cu\xe1l'), (u'\xbfsaben quien', u'\xbfsaben qui\xe9n'), (u'\xbfsaben como', u'\xbfsaben c\xf3mo'), (u'\xbfsaben cuan', u'\xbfsaben cu\xe1n'), (u'\xbfsaben cuanto', u'\xbfsaben cu\xe1nto'), (u'\xbfsaben cuanta', u'\xbfsaben cu\xe1nta'), (u'\xbfsaben cuantos', u'\xbfsaben cu\xe1ntos'), (u'\xbfsaben cuantas', u'\xbfsaben cu\xe1ntas'), (u'\xbfsaben cuando', u'\xbfsaben cu\xe1ndo'), (u'\xbfsaben donde', u'\xbfsaben d\xf3nde'), (u'\xbfde que', u'\xbfde qu\xe9'), (u'\xbfde donde', u'\xbfde d\xf3nde'), (u'\xbfde cual', u'\xbfde cu\xe1l'), (u'\xbfde quien', u'\xbfde qui\xe9n'), (u'\xbfde cuanto', u'\xbfde cu\xe1nto'), (u'\xbfde cuanta', u'\xbfde cu\xe1nta'), (u'\xbfde cuantos', u'\xbfde cu\xe1ntos'), (u'\xbfde cuantas', u'\xbfde cu\xe1ntas'), (u'\xbfde cuando', u'\xbfde cu\xe1ndo'), (u'\xbfsobre que', u'\xbfsobre qu\xe9'), (u'\xbfcomo ', u'\xbfc\xf3mo '), (u'\xbfcual ', u'\xbfcu\xe1l '), (u'\xbfen cual', u'\xbfen cu\xe1l'), (u'\xbfcuando', u'\xbfcu\xe1ndo'), (u'\xbfhasta cual', u'\xbfhasta cu\xe1l'), (u'\xbfhasta quien', u'\xbfhasta qui\xe9n'), (u'\xbfhasta cuanto', u'\xbfhasta cu\xe1nto'), (u'\xbfhasta cuantas', u'\xbfhasta cu\xe1ntas'), (u'\xbfhasta cuantos', u'\xbfhasta cu\xe1ntos'), (u'\xbfhasta cuando', u'\xbfhasta cu\xe1ndo'), (u'\xbfhasta donde', u'\xbfhasta d\xf3nde'), (u'\xbfhasta que', u'\xbfhasta qu\xe9'), (u'\xbfhasta adonde', u'\xbfhasta ad\xf3nde'), (u'\xbfdesde que', u'\xbfdesde qu\xe9'), (u'\xbfdesde cuando', u'\xbfdesde cu\xe1ndo'), (u'\xbfdesde quien', u'\xbfdesde qui\xe9n'), (u'\xbfdesde donde', u'\xbfdesde d\xf3nde'), (u'\xbfcuanto', u'\xbfcu\xe1nto'), (u'\xbfcuantos', u'\xbfcu\xe1ntos'), (u'\xbfdonde', u'\xbfd\xf3nde'), (u'\xbfadonde', u'\xbfad\xf3nde'), (u'\xbfcon que', u'\xbfcon qu\xe9'), (u'\xbfcon cual', u'\xbfcon cu\xe1l'), (u'\xbfcon quien', u'\xbfcon qui\xe9n'), (u'\xbfcon cuantos', u'\xbfcon cu\xe1ntos'), (u'\xbfcon cuantas', u'\xbfcon cu\xe1ntas'), (u'\xbfcon cuanta', u'\xbfcon cu\xe1nta'), (u'\xbfcon cuanto', u'\xbfcon cu\xe1nto'), (u'\xbfpara donde', u'\xbfpara d\xf3nde'), (u'\xbfpara adonde', u'\xbfpara ad\xf3nde'), (u'\xbfpara cuando', u'\xbfpara cu\xe1ndo'), (u'\xbfpara que', u'\xbfpara qu\xe9'), (u'\xbfpara quien', u'\xbfpara qui\xe9n'), (u'\xbfpara cuanto', u'\xbfpara cu\xe1nto'), (u'\xbfpara cuanta', u'\xbfpara cu\xe1nta'), (u'\xbfpara cuantos', u'\xbfpara cu\xe1ntos'), (u'\xbfpara cuantas', u'\xbfpara cu\xe1ntas'), (u'\xbfa donde', u'\xbfa d\xf3nde'), (u'\xbfa que', u'\xbfa qu\xe9'), (u'\xbfa cual', u'\xbfa cu\xe1l'), (u'\xbfa quien', u'\xbfa quien'), (u'\xbfa como', u'\xbfa c\xf3mo'), (u'\xbfa cuanto', u'\xbfa cu\xe1nto'), (u'\xbfa cuanta', u'\xbfa cu\xe1nta'), (u'\xbfa cuantos', u'\xbfa cu\xe1ntos'), (u'\xbfa cuantas', u'\xbfa cu\xe1ntas'), (u'\xbfpor que', u'\xbfpor qu\xe9'), (u'\xbfpor cual', u'\xbfpor cu\xe1l'), (u'\xbfpor quien', u'\xbfpor qui\xe9n'), (u'\xbfpor cuanto', u'\xbfpor cu\xe1nto'), (u'\xbfpor cuanta', u'\xbfpor cu\xe1nta'), (u'\xbfpor cuantos', u'\xbfpor cu\xe1ntos'), (u'\xbfpor cuantas', u'\xbfpor cu\xe1ntas'), (u'\xbfpor donde', u'\xbfpor d\xf3nde'), (u'\xbfporque', u'\xbfpor qu\xe9'), (u'\xbfporqu\xe9', u'\xbfpor qu\xe9'), (u'\xbfy que', u'\xbfy qu\xe9'), (u'\xbfy como', u'\xbfy c\xf3mo'), (u'\xbfy cuando', u'\xbfy cu\xe1ndo'), (u'\xbfy cual', u'\xbfy cu\xe1l'), (u'\xbfy quien', u'\xbfy qui\xe9n'), (u'\xbfy cuanto', u'\xbfy cu\xe1nto'), (u'\xbfy cuanta', u'\xbfy cu\xe1nta'), (u'\xbfy cuantos', u'\xbfy cu\xe1ntos'), (u'\xbfy cuantas', u'\xbfy cu\xe1ntas'), (u'\xbfy donde', u'\xbfy d\xf3nde'), (u'\xbfy adonde', u'\xbfy ad\xf3nde'), (u'\xbfquien ', u'\xbfqui\xe9n '), (u'\xbfesta ', u'\xbfest\xe1 '), (u'\xbfestas ', u'\xbfest\xe1s '), (u'\xbfAun', u'\xbfA\xfan'), (u'\xbfQue ', u'\xbfQu\xe9 '), (u'\xbfSabes que', u'\xbfSabes qu\xe9'), (u'\xbfSabes adonde', u'\xbfSabes ad\xf3nde'), (u'\xbfSabes cual', u'\xbfSabes cu\xe1l'), (u'\xbfSabes quien', u'\xbfSabes qui\xe9n'), (u'\xbfSabes como', u'\xbfSabes c\xf3mo'), (u'\xbfSabes cuan', u'\xbfSabes cu\xe1n'), (u'\xbfSabes cuanto', u'\xbfSabes cu\xe1nto'), (u'\xbfSabes cuanta', u'\xbfSabes cu\xe1nta'), (u'\xbfSabes cuantos', u'\xbfSabes cu\xe1ntos'), (u'\xbfSabes cuantas', u'\xbfSabes cu\xe1ntas'), (u'\xbfSabes cuando', u'\xbfSabes cu\xe1ndo'), (u'\xbfSabes donde', u'\xbfSabes d\xf3nde'), (u'\xbfSabe que', u'\xbfSabe qu\xe9'), (u'\xbfSabe adonde', u'\xbfSabe ad\xf3nde'), (u'\xbfSabe cual', u'\xbfSabe cu\xe1l'), (u'\xbfSabe quien', u'\xbfSabe qui\xe9n'), (u'\xbfSabe como', u'\xbfSabe c\xf3mo'), (u'\xbfSabe cuan', u'\xbfSabe cu\xe1n'), (u'\xbfSabe cuanto', u'\xbfSabe cu\xe1nto'), (u'\xbfSabe cuanta', u'\xbfSabe cu\xe1nta'), (u'\xbfSabe cuantos', u'\xbfSabe cu\xe1ntos'), (u'\xbfSabe cuantas', u'\xbfSabe cu\xe1ntas'), (u'\xbfSabe cuando', u'\xbfSabe cu\xe1ndo'), (u'\xbfSabe donde', u'\xbfSabe d\xf3nde'), (u'\xbfSaben que', u'\xbfSaben qu\xe9'), (u'\xbfSaben adonde', u'\xbfSaben ad\xf3nde'), (u'\xbfSaben cual', u'\xbfSaben cu\xe1l'), (u'\xbfSaben quien', u'\xbfSaben qui\xe9n'), (u'\xbfSaben como', u'\xbfSaben c\xf3mo'), (u'\xbfSaben cuan', u'\xbfSaben cu\xe1n'), (u'\xbfSaben cuanto', u'\xbfSaben cu\xe1nto'), (u'\xbfSaben cuanta', u'\xbfSaben cu\xe1nta'), (u'\xbfSaben cuantos', u'\xbfSaben cu\xe1ntos'), (u'\xbfSaben cuantas', u'\xbfSaben cu\xe1ntas'), (u'\xbfSaben cuando', u'\xbfSaben cu\xe1ndo'), (u'\xbfSaben donde', u'\xbfSaben d\xf3nde'), (u'\xbfDe que', u'\xbfDe qu\xe9'), (u'\xbfDe donde', u'\xbfDe d\xf3nde'), (u'\xbfDe cual', u'\xbfDe cu\xe1l'), (u'\xbfDe quien', u'\xbfDe qui\xe9n'), (u'\xbfDe cuanto', u'\xbfDe cu\xe1nto'), (u'\xbfDe cuanta', u'\xbfDe cu\xe1nta'), (u'\xbfDe cuantos', u'\xbfDe cu\xe1ntos'), (u'\xbfDe cuantas', u'\xbfDe cu\xe1ntas'), (u'\xbfDe cuando', u'\xbfDe cu\xe1ndo'), (u'\xbfDesde que', u'\xbfDesde qu\xe9'), (u'\xbfDesde cuando', u'\xbfDesde cu\xe1ndo'), (u'\xbfDesde quien', u'\xbfDesde qui\xe9n'), (u'\xbfDesde donde', u'\xbfDesde d\xf3nde'), (u'\xbfSobre que', u'\xbfSobre qu\xe9'), (u'\xbfComo ', u'\xbfC\xf3mo '), (u'\xbfCual ', u'\xbfCu\xe1l '), (u'\xbfEn cual', u'\xbfEn cu\xe1l'), (u'\xbfCuando', u'\xbfCu\xe1ndo'), (u'\xbfHasta cual', u'\xbfHasta cu\xe1l'), (u'\xbfHasta quien', u'\xbfHasta qui\xe9n'), (u'\xbfHasta cuanto', u'\xbfHasta cu\xe1nto'), (u'\xbfHasta cuantas', u'\xbfHasta cu\xe1ntas'), (u'\xbfHasta cuantos', u'\xbfHasta cu\xe1ntos'), (u'\xbfHasta cuando', u'\xbfHasta cu\xe1ndo'), (u'\xbfHasta donde', u'\xbfHasta d\xf3nde'), (u'\xbfHasta que', u'\xbfHasta qu\xe9'), (u'\xbfHasta adonde', u'\xbfHasta ad\xf3nde'), (u'\xbfCuanto', u'\xbfCu\xe1nto'), (u'\xbfCuantos', u'\xbfCu\xe1ntos'), (u'\xbfDonde', u'\xbfD\xf3nde'), (u'\xbfAdonde', u'\xbfAd\xf3nde'), (u'\xbfCon que', u'\xbfCon qu\xe9'), (u'\xbfCon cual', u'\xbfCon cu\xe1l'), (u'\xbfCon quien', u'\xbfCon qui\xe9n'), (u'\xbfCon cuantos', u'\xbfCon cu\xe1ntos'), (u'\xbfCon cuanta', u'\xbfCon cu\xe1nta'), (u'\xbfCon cuanto', u'\xbfCon cu\xe1nto'), (u'\xbfPara donde', u'\xbfPara d\xf3nde'), (u'\xbfPara adonde', u'\xbfPara ad\xf3nde'), (u'\xbfPara cuando', u'\xbfPara cu\xe1ndo'), (u'\xbfPara que', u'\xbfPara qu\xe9'), (u'\xbfPara quien', u'\xbfPara qui\xe9n'), (u'\xbfPara cuanto', u'\xbfPara cu\xe1nto'), (u'\xbfPara cuanta', u'\xbfPara cu\xe1nta'), (u'\xbfPara cuantos', u'\xbfPara cu\xe1ntos'), (u'\xbfPara cuantas', u'\xbfPara cu\xe1ntas'), (u'\xbfA donde', u'\xbfA d\xf3nde'), (u'\xbfA que', u'\xbfA qu\xe9'), (u'\xbfA cual', u'\xbfA cu\xe1l'), (u'\xbfA quien', u'\xbfA quien'), (u'\xbfA como', u'\xbfA c\xf3mo'), (u'\xbfA cuanto', u'\xbfA cu\xe1nto'), (u'\xbfA cuanta', u'\xbfA cu\xe1nta'), (u'\xbfA cuantos', u'\xbfA cu\xe1ntos'), (u'\xbfA cuantas', u'\xbfA cu\xe1ntas'), (u'\xbfPor que', u'\xbfPor qu\xe9'), (u'\xbfPor cual', u'\xbfPor cu\xe1l'), (u'\xbfPor quien', u'\xbfPor qui\xe9n'), (u'\xbfPor cuanto', u'\xbfPor cu\xe1nto'), (u'\xbfPor cuanta', u'\xbfPor cu\xe1nta'), (u'\xbfPor cuantos', u'\xbfPor cu\xe1ntos'), (u'\xbfPor cuantas', u'\xbfPor cu\xe1ntas'), (u'\xbfPor donde', u'\xbfPor d\xf3nde'), (u'\xbfPorque', u'\xbfPor qu\xe9'), (u'\xbfPorqu\xe9', u'\xbfPor qu\xe9'), (u'\xbfY que', u'\xbfY qu\xe9'), (u'\xbfY como', u'\xbfY c\xf3mo'), (u'\xbfY cuando', u'\xbfY cu\xe1ndo'), (u'\xbfY cual', u'\xbfY cu\xe1l'), (u'\xbfY quien', u'\xbfY qui\xe9n'), (u'\xbfY cuanto', u'\xbfY cu\xe1nto'), (u'\xbfY cuanta', u'\xbfY cu\xe1nta'), (u'\xbfY cuantos', u'\xbfY cu\xe1ntos'), (u'\xbfY cuantas', u'\xbfY cu\xe1ntas'), (u'\xbfY donde', u'\xbfY d\xf3nde'), (u'\xbfY adonde', u'\xbfY ad\xf3nde'), (u'\xbfQuien ', u'\xbfQui\xe9n '), (u'\xbfEsta ', u'\xbfEst\xe1 '), (u'el porque', u'el porqu\xe9'), (u'su porque', u'su porqu\xe9'), (u'los porqu\xe9s', u'los porqu\xe9s'), (u'aun,', u'a\xfan,'), (u'aun no', u'a\xfan no'), (u' de y ', u' d\xe9 y '), (u' nos de ', u' nos d\xe9 '), (u' tu ya ', u' t\xfa ya '), (u'Tu ya ', u'T\xfa ya '), (u' de, ', u' d\xe9,'), (u' mi, ', u' m\xed,'), (u' tu, ', u' t\xfa,'), (u' el, ', u' \xe9l,'), (u' te, ', u' t\xe9,'), (u' mas, ', u' m\xe1s,'), (u' quien, ', u' qui\xe9n,'), (u' cual,', u' cu\xe1l,'), (u'porque, ', u'porqu\xe9,'), (u'cuanto, ', u'cu\xe1nto,'), (u'cuando, ', u'cu\xe1ndo,'), (u' se,', u' s\xe9,'), (u'se donde', u's\xe9 d\xf3nde'), (u'se cuando', u's\xe9 cu\xe1ndo'), (u'se adonde', u's\xe9 ad\xf3nde'), (u'se como', u's\xe9 c\xf3mo'), (u'se cual', u's\xe9 cu\xe1l'), (u'se quien', u's\xe9 qui\xe9n'), (u'se cuanto', u's\xe9 cu\xe1nto'), (u'se cuanta', u's\xe9 cu\xe1nta'), (u'se cuantos', u's\xe9 cu\xe1ntos'), (u'se cuantas', u's\xe9 cu\xe1ntas'), (u'se cuan', u's\xe9 cu\xe1n'), (u' el si ', u' el s\xed '), (u'si mismo', u's\xed mismo'), (u'si misma', u's\xed misma'), (u' llegal', u' ilegal'), (u' lluminar', u' iluminar'), (u'sllbato', u'silbato'), (u'sllenclo', u'silencio'), (u'clemencla', u'clemencia'), (u'socledad', u'sociedad'), (u'tlene', u'tiene'), (u'tlempo', u'tiempo'), (u'equlvocaba', u'equivocaba'), (u'qulnce', u'quince'), (u'comlen', u'comien'), (u'historl', u'histori'), (u'misterl', u'misteri'), (u'vivencl', u'vivenci')]), 'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:de\\ gratis|si\\ quiera|Cada\\ una\\ de\\ los|Cada\\ uno\\ de\\ las|haber\\ que|haber\\ qu\\\xe9|Haber\\ si|\\ que\\ hora|yo\\ que\\ se|Yo\\ que\\ se|\\ tu\\!|\\ si\\!|\\ mi\\!|\\ el\\!|\\ tu\\?|\\ si\\?|\\ mi\\?|\\ el\\?|\\ aun\\?|\\ mas\\?|\\ que\\?|\\ paso\\?|\\ cuando\\?|\\ cuanto\\?|\\ cuanta\\?|\\ cuantas\\?|\\ cuantos\\?|\\ donde\\?|\\ quien\\?|\\ como\\?|\\ adonde\\?|\\ cual\\?|\\\xbfSi\\?|\\\xbfesta\\ bien\\?|\\\xbfPero\\ qu\\\xe9\\ haces\\?|\\\xbfpero\\ qu\\\xe9\\ haces\\?|\\\xbfEs\\ que\\ no\\ me\\ has\\ escuchado\\?|\\\xa1\\\xbfes\\ que\\ no\\ me\\ has\\ escuchado\\?\\!|\\\xbfaun|\\\xbftu\\ |\\\xbfque\\ |\\\xbfsabes\\ que|\\\xbfsabes\\ adonde|\\\xbfsabes\\ cual|\\\xbfsabes\\ quien|\\\xbfsabes\\ como|\\\xbfsabes\\ cuan|\\\xbfsabes\\ cuanto|\\\xbfsabes\\ cuanta|\\\xbfsabes\\ cuantos|\\\xbfsabes\\ cuantas|\\\xbfsabes\\ cuando|\\\xbfsabes\\ donde|\\\xbfsabe\\ que|\\\xbfsabe\\ adonde|\\\xbfsabe\\ cual|\\\xbfsabe\\ quien|\\\xbfsabe\\ como|\\\xbfsabe\\ cuan|\\\xbfsabe\\ cuanto|\\\xbfsabe\\ cuanta|\\\xbfsabe\\ cuantos|\\\xbfsabe\\ cuantas|\\\xbfsabe\\ cuando|\\\xbfsabe\\ donde|\\\xbfsaben\\ que|\\\xbfsaben\\ adonde|\\\xbfsaben\\ cual|\\\xbfsaben\\ quien|\\\xbfsaben\\ como|\\\xbfsaben\\ cuan|\\\xbfsaben\\ cuanto|\\\xbfsaben\\ cuanta|\\\xbfsaben\\ cuantos|\\\xbfsaben\\ cuantas|\\\xbfsaben\\ cuando|\\\xbfsaben\\ donde|\\\xbfde\\ que|\\\xbfde\\ donde|\\\xbfde\\ cual|\\\xbfde\\ quien|\\\xbfde\\ cuanto|\\\xbfde\\ cuanta|\\\xbfde\\ cuantos|\\\xbfde\\ cuantas|\\\xbfde\\ cuando|\\\xbfsobre\\ que|\\\xbfcomo\\ |\\\xbfcual\\ |\\\xbfen\\ cual|\\\xbfcuando|\\\xbfhasta\\ cual|\\\xbfhasta\\ quien|\\\xbfhasta\\ cuanto|\\\xbfhasta\\ cuantas|\\\xbfhasta\\ cuantos|\\\xbfhasta\\ cuando|\\\xbfhasta\\ donde|\\\xbfhasta\\ que|\\\xbfhasta\\ adonde|\\\xbfdesde\\ que|\\\xbfdesde\\ cuando|\\\xbfdesde\\ quien|\\\xbfdesde\\ donde|\\\xbfcuanto|\\\xbfcuantos|\\\xbfdonde|\\\xbfadonde|\\\xbfcon\\ que|\\\xbfcon\\ cual|\\\xbfcon\\ quien|\\\xbfcon\\ cuantos|\\\xbfcon\\ cuantas|\\\xbfcon\\ cuanta|\\\xbfcon\\ cuanto|\\\xbfpara\\ donde|\\\xbfpara\\ adonde|\\\xbfpara\\ cuando|\\\xbfpara\\ que|\\\xbfpara\\ quien|\\\xbfpara\\ cuanto|\\\xbfpara\\ cuanta|\\\xbfpara\\ cuantos|\\\xbfpara\\ cuantas|\\\xbfa\\ donde|\\\xbfa\\ que|\\\xbfa\\ cual|\\\xbfa\\ quien|\\\xbfa\\ como|\\\xbfa\\ cuanto|\\\xbfa\\ cuanta|\\\xbfa\\ cuantos|\\\xbfa\\ cuantas|\\\xbfpor\\ que|\\\xbfpor\\ cual|\\\xbfpor\\ quien|\\\xbfpor\\ cuanto|\\\xbfpor\\ cuanta|\\\xbfpor\\ cuantos|\\\xbfpor\\ cuantas|\\\xbfpor\\ donde|\\\xbfporque|\\\xbfporqu\\\xe9|\\\xbfy\\ que|\\\xbfy\\ como|\\\xbfy\\ cuando|\\\xbfy\\ cual|\\\xbfy\\ quien|\\\xbfy\\ cuanto|\\\xbfy\\ cuanta|\\\xbfy\\ cuantos|\\\xbfy\\ cuantas|\\\xbfy\\ donde|\\\xbfy\\ adonde|\\\xbfquien\\ |\\\xbfesta\\ |\\\xbfestas\\ |\\\xbfAun|\\\xbfQue\\ |\\\xbfSabes\\ que|\\\xbfSabes\\ adonde|\\\xbfSabes\\ cual|\\\xbfSabes\\ quien|\\\xbfSabes\\ como|\\\xbfSabes\\ cuan|\\\xbfSabes\\ cuanto|\\\xbfSabes\\ cuanta|\\\xbfSabes\\ cuantos|\\\xbfSabes\\ cuantas|\\\xbfSabes\\ cuando|\\\xbfSabes\\ donde|\\\xbfSabe\\ que|\\\xbfSabe\\ adonde|\\\xbfSabe\\ cual|\\\xbfSabe\\ quien|\\\xbfSabe\\ como|\\\xbfSabe\\ cuan|\\\xbfSabe\\ cuanto|\\\xbfSabe\\ cuanta|\\\xbfSabe\\ cuantos|\\\xbfSabe\\ cuantas|\\\xbfSabe\\ cuando|\\\xbfSabe\\ donde|\\\xbfSaben\\ que|\\\xbfSaben\\ adonde|\\\xbfSaben\\ cual|\\\xbfSaben\\ quien|\\\xbfSaben\\ como|\\\xbfSaben\\ cuan|\\\xbfSaben\\ cuanto|\\\xbfSaben\\ cuanta|\\\xbfSaben\\ cuantos|\\\xbfSaben\\ cuantas|\\\xbfSaben\\ cuando|\\\xbfSaben\\ donde|\\\xbfDe\\ que|\\\xbfDe\\ donde|\\\xbfDe\\ cual|\\\xbfDe\\ quien|\\\xbfDe\\ cuanto|\\\xbfDe\\ cuanta|\\\xbfDe\\ cuantos|\\\xbfDe\\ cuantas|\\\xbfDe\\ cuando|\\\xbfDesde\\ que|\\\xbfDesde\\ cuando|\\\xbfDesde\\ quien|\\\xbfDesde\\ donde|\\\xbfSobre\\ que|\\\xbfComo\\ |\\\xbfCual\\ |\\\xbfEn\\ cual|\\\xbfCuando|\\\xbfHasta\\ cual|\\\xbfHasta\\ quien|\\\xbfHasta\\ cuanto|\\\xbfHasta\\ cuantas|\\\xbfHasta\\ cuantos|\\\xbfHasta\\ cuando|\\\xbfHasta\\ donde|\\\xbfHasta\\ que|\\\xbfHasta\\ adonde|\\\xbfCuanto|\\\xbfCuantos|\\\xbfDonde|\\\xbfAdonde|\\\xbfCon\\ que|\\\xbfCon\\ cual|\\\xbfCon\\ quien|\\\xbfCon\\ cuantos|\\\xbfCon\\ cuanta|\\\xbfCon\\ cuanto|\\\xbfPara\\ donde|\\\xbfPara\\ adonde|\\\xbfPara\\ cuando|\\\xbfPara\\ que|\\\xbfPara\\ quien|\\\xbfPara\\ cuanto|\\\xbfPara\\ cuanta|\\\xbfPara\\ cuantos|\\\xbfPara\\ cuantas|\\\xbfA\\ donde|\\\xbfA\\ que|\\\xbfA\\ cual|\\\xbfA\\ quien|\\\xbfA\\ como|\\\xbfA\\ cuanto|\\\xbfA\\ cuanta|\\\xbfA\\ cuantos|\\\xbfA\\ cuantas|\\\xbfPor\\ que|\\\xbfPor\\ cual|\\\xbfPor\\ quien|\\\xbfPor\\ cuanto|\\\xbfPor\\ cuanta|\\\xbfPor\\ cuantos|\\\xbfPor\\ cuantas|\\\xbfPor\\ donde|\\\xbfPorque|\\\xbfPorqu\\\xe9|\\\xbfY\\ que|\\\xbfY\\ como|\\\xbfY\\ cuando|\\\xbfY\\ cual|\\\xbfY\\ quien|\\\xbfY\\ cuanto|\\\xbfY\\ cuanta|\\\xbfY\\ cuantos|\\\xbfY\\ cuantas|\\\xbfY\\ donde|\\\xbfY\\ adonde|\\\xbfQuien\\ |\\\xbfEsta\\ |el\\ porque|su\\ porque|los\\ porqu\\\xe9s|aun\\,|aun\\ no|\\ de\\ y\\ |\\ nos\\ de\\ |\\ tu\\ ya\\ |Tu\\ ya\\ |\\ de\\,\\ |\\ mi\\,\\ |\\ tu\\,\\ |\\ el\\,\\ |\\ te\\,\\ |\\ mas\\,\\ |\\ quien\\,\\ |\\ cual\\,|porque\\,\\ |cuanto\\,\\ |cuando\\,\\ |\\ se\\,|se\\ donde|se\\ cuando|se\\ adonde|se\\ como|se\\ cual|se\\ quien|se\\ cuanto|se\\ cuanta|se\\ cuantos|se\\ cuantas|se\\ cuan|\\ el\\ si\\ |si\\ mismo|si\\ misma|\\ llegal|\\ lluminar|sllbato|sllenclo|clemencla|socledad|tlene|tlempo|equlvocaba|qulnce|comlen|historl|misterl|vivencl)(?:(?=\\s)|(?=$)|(?=\\b))'}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict([(u'No', u'No.')]), 'pattern': None}, @@ -174,7 +174,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict([(u'bi smo', u'bismo'), (u'dali je', u'da li je'), (u'dali si', u'da li si'), (u'Dali si', u'Da li si'), (u'Jel sam ti', u'Jesam li ti'), (u'Jel si', u'Jesi li'), (u"Jel' si", u'Jesi li'), (u"Je I'", u'Jesi li'), (u'Jel si to', u'Jesi li to'), (u"Jel' si to", u'Da li si to'), (u'jel si to', u'da li si to'), (u"jel' si to", u'jesi li to'), (u'Jel si ti', u'Da li si ti'), (u"Jel' si ti", u'Da li si ti'), (u'jel si ti', u'da li si ti'), (u"jel' si ti", u'da li si ti'), (u'jel ste ', u'jeste li '), (u'Jel ste', u'Jeste li'), (u"jel' ste ", u'jeste li '), (u"Jel' ste ", u'Jeste li '), (u'Jel su ', u'Jesu li '), (u'Jel da ', u'Zar ne'), (u'jel da ', u'zar ne'), (u"jel'da ", u'zar ne'), (u'Jeli sve ', u'Je li sve'), (u'Jeli on ', u'Je li on'), (u'Jeli ti ', u'Je li ti'), (u'jeli ti ', u'je li ti'), (u'Jeli to ', u'Je li to'), (u'Nebrini', u'Ne brini'), (u'ne \u0107u', u'ne\u0107u'), (u'od kako', u'otkako'), (u'Si dobro', u'Jesi li dobro'), (u'Svo vreme', u'Sve vrijeme'), (u'Svo vrijeme', u'Sve vrijeme'), (u'Cijelo vrijeme', u'Sve vrijeme')]), 'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:bi\\ smo|dali\\ je|dali\\ si|Dali\\ si|Jel\\ sam\\ ti|Jel\\ si|Jel\\'\\ si|Je\\ I\\'|Jel\\ si\\ to|Jel\\'\\ si\\ to|jel\\ si\\ to|jel\\'\\ si\\ to|Jel\\ si\\ ti|Jel\\'\\ si\\ ti|jel\\ si\\ ti|jel\\'\\ si\\ ti|jel\\ ste\\ |Jel\\ ste|jel\\'\\ ste\\ |Jel\\'\\ ste\\ |Jel\\ su\\ |Jel\\ da\\ |jel\\ da\\ |jel\\'da\\ |Jeli\\ sve\\ |Jeli\\ on\\ |Jeli\\ ti\\ |jeli\\ ti\\ |Jeli\\ to\\ |Nebrini|ne\\ \\\u0107u|od\\ kako|Si\\ dobro|Svo\\ vreme|Svo\\ vrijeme|Cijelo\\ vrijeme)(?:(?=\\s)|(?=$)|(?=\\b))"}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -186,7 +186,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\u0139', u'\xc5'), (u'\u013a', u'\xe5'), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict([(u'\u0139', u'\xc5'), (u'\u013a', u'\xe5')]), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/make_data.py b/Contents/Libraries/Shared/subzero/modification/dictionaries/make_data.py index 1ac99b6e6..f6e6ac048 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/make_data.py +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/make_data.py @@ -117,10 +117,6 @@ } SZ_FIX_DATA_GLOBAL = { - "PartialWordsAlways": { - u"¶¶": u"♫", - u"¶": u"♪" - } } if __name__ == "__main__": diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 896a1f2f8..b1d83c703 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -33,11 +33,10 @@ class CommonFixes(SubtitleTextModification): # line = : text NReProcessor(re.compile(r'(?u)(^\W*:\s*(?=\w+))'), "", name="CM_empty_colon_start"), - # multi space - NReProcessor(re.compile(r'(?u)(\s{2,})'), " ", name="CM_multi_space"), - # fix music symbols - NReProcessor(re.compile(ur'(?u)(?:^[-\s]*[*#¶]+(?![^\s\-*#¶]))|(?:[*#¶]+\s*$)'), u"♪", name="CM_music_symbols"), + NReProcessor(re.compile(ur'(?u)(^[-\s]*[*#¶]+\s*)|(\s*[*#¶]+\s*$)'), + lambda x: u"♪ " if x.group(1) else u" ♪", + name="CM_music_symbols"), # '' = " NReProcessor(re.compile(ur'(?u)([\'’ʼ❜‘‛][\'’ʼ❜‘‛]+)'), u'"', name="CM_double_apostrophe"), diff --git a/Contents/Libraries/Shared/test.srt b/Contents/Libraries/Shared/test.srt index 9e97d3d5b..cfff81cf7 100644 --- a/Contents/Libraries/Shared/test.srt +++ b/Contents/Libraries/Shared/test.srt @@ -26,7 +26,7 @@ this is a"subtitle" test "with a"text before colons Mah numbar is wrong: 1 91 7 : : Peter is funny! -¶ You're singing in the rain # +¶You're singing in the rain# 5 00:00:17,225 --> 00:00:19,684 From 22f0f8cd6049b2b03a574887071da3855a9a1a74 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 10 Nov 2018 02:33:31 +0100 Subject: [PATCH 317/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index e194d0258..2a544e187 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.4.2856 + 2.6.4.2858 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2856 DEV +Version 2.6.4.2858 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From c2c0df0e888419f2e2325325110aea06fa784673 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 10 Nov 2018 04:33:21 +0100 Subject: [PATCH 318/710] update changelog --- CHANGELOG.md | 69 ++++++++++++++++++++++++++++++++++++++++++ Contents/Info.plist | 4 +-- README.md | 74 +++++---------------------------------------- 3 files changed, 78 insertions(+), 69 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a495facc..339c1a988 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,73 @@ +2.6.4.2834 +- core: add option to use custom (Google, Cloudflare) DNS to resolve provider hosts in problematic countries; fixes #547 +- core: add support for downloading subtitles only when the audio streams don't match (any?) configured languages; fixes #519 +- core: add support for an include list instead of an ignore list; add the option to disable SZ by default, then enable it per item/series/section (inverse ignore list) +- core/menu/config: support forced/foreign subtitles independently +- core: fallback for OSError on scandir, should fix #532 +- core: add config versioning/migration system +- core: correctly force non-foreign-only-capable providers off; remove subscene from foreign-only capable providers +- core: scanning: collect information about audio streams +- core: use correct storage path when storing subtitle info, when only VTT is used +- core: fix disabled channel mode +- core/menu: extract embedded: add extracted embedded subtitles to history +- core: embedded subtitle streams: don't try parsing the language if inexistant +- core: subtitle: fix log call, fixes #569 +- core: download best subtitles: only use actually languages searched for +- core: refiners: tvdb: warn instead of error when no matching series was found +- core: scanning: re-add expected title to guessit for narrowing down the video title +- core: resolve #583 +- core: archives: explicitly skip forced subtitles if not searched for, when picking from an archive +- core: activities/auto-refresh: fix hybrid-plus for movies +- core: don't disable plugin if all providers throttled; fix #585 #574 +- core: skip cleanup for ignored paths +- core: update requests to 2.20.0 (fixes security issue) +- core: update certifi to 2018.10.15 +- core: auto extract: don't overwrite local sub even if unknown to SZ +- config: set autoclean leftover/unused to off by default +- providers: opensubtitles: respect rate limit (40 hits/10s); should fix long throttling behaviour +- providers: opensubtitles: handle bad/inexistant responses +- providers: opensubtitles: log bad response data +- providers: opensubtitles: treat empty response as ServiceUnavailable for now +- providers: opensubtitles: log reason for ServiceUnavailable +- providers: legendastv: match second title and imdb id +- providers: titlovi: fix language handling (thanks @viking1304) +- providers: titlovi: proper handling of archives with both cyrlic and latin subtitles (thanks @viking1304) +- providers: titlovi: allow direct subtitle downloads as fallback (when a subtitle, not an archive was returned) +- providers: hosszupuska: implement site change (thanks @morpheus133) +- providers: supersubtitles: add base properties to subtitle +- providers: opensubtitles, podnapisi: fix foreign/forced handling +- providers: subscene: use original/sceneName if possible +- menu: fix plugin not responding when ignoring an item in certain menus; fixes #535 +- menu: select active subtitle: return to item details afterwards; correctly set current +- menu: add item thumbnails to history and a couple of submenus +- menu: history: use series thumbnail instead of episode screenshot +- menu: add full soft include/exclude menu handling +- menu: add support for separate forced and not-forced subtitles +- menu: fix order of embedded subtitle streams in item detail +- menu: support S00E00 and equivalent +- submod: add option to fix only-uppercase subtitles and make them readable +- submod: keep track of actually applied mods +- submod: correctly merge mods of the same kind (offset) +- submod: OCR: add dictionaries for bosnian and norwegian bokmal; update dicts for dan, eng, hrv, spa, srp, swe +- submod: OCR/HI: skip certain processors for all-caps subs +- submod: HI: only remove caps before colon if the colon is followed by whitespace or EOL; fixes #542 +- submod: HI: remove MAN: +- submod: common: improve detection and normalization of quotes, apostrophes +- submod: common: fix double quotes that are meant to be single quotes inside words +- submod: common: normalize small hyphens to dash +- submod: common: remove line only consisting of colon; remove empty colon at start of line +- submod: common: add space after punctuation +- submod: common: fix lowercase i for english language +- submod: common: better fix for music symbols +- submod: reverse_RTL: also reverse ":,'-" chars in CM_RTL_reverse (thanks @doopler) +- submod: reverse_RTL: enable mod for arabic, farsi and persian besides hebrew +- i18n: fix not used translation for recently added missing subtitles menu +- i18n: fix spanish translation, fixes #543 +- i18n: Hungarian translation is incomplete + + + 2.5.7.2663 - implement translations for the channel and the settings - i18n: German (myself) diff --git a/Contents/Info.plist b/Contents/Info.plist index 2a544e187..137337854 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.4.2858 + 2.6.4.2859 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2858 DEV +Version 2.6.4.2859 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index a6b87559e..a937b02ca 100644 --- a/README.md +++ b/README.md @@ -84,73 +84,13 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.4.2834 -- core: add option to use custom (Google, Cloudflare) DNS to resolve provider hosts in problematic countries; fixes #547 -- core: add support for downloading subtitles only when the audio streams don't match (any?) configured languages; fixes #519 -- core: add support for an include list instead of an ignore list; add the option to disable SZ by default, then enable it per item/series/section (inverse ignore list) -- core/menu/config: support forced/foreign subtitles independently -- core: fallback for OSError on scandir, should fix #532 -- core: add config versioning/migration system -- core: correctly force non-foreign-only-capable providers off; remove subscene from foreign-only capable providers -- core: scanning: collect information about audio streams -- core: use correct storage path when storing subtitle info, when only VTT is used -- core: fix disabled channel mode -- core/menu: extract embedded: add extracted embedded subtitles to history -- core: embedded subtitle streams: don't try parsing the language if inexistant -- core: subtitle: fix log call, fixes #569 -- core: download best subtitles: only use actually languages searched for -- core: refiners: tvdb: warn instead of error when no matching series was found -- core: scanning: re-add expected title to guessit for narrowing down the video title -- core: resolve #583 -- core: archives: explicitly skip forced subtitles if not searched for, when picking from an archive -- core: activities/auto-refresh: fix hybrid-plus for movies -- core: don't disable plugin if all providers throttled; fix #585 #574 -- core: skip cleanup for ignored paths -- core: update requests to 2.20.0 (fixes security issue) -- core: update certifi to 2018.10.15 -- core: auto extract: don't overwrite local sub even if unknown to SZ -- config: set autoclean leftover/unused to off by default -- providers: opensubtitles: respect rate limit (40 hits/10s); should fix long throttling behaviour -- providers: opensubtitles: handle bad/inexistant responses -- providers: opensubtitles: log bad response data -- providers: opensubtitles: treat empty response as ServiceUnavailable for now -- providers: opensubtitles: log reason for ServiceUnavailable -- providers: legendastv: match second title and imdb id -- providers: titlovi: fix language handling (thanks @viking1304) -- providers: titlovi: proper handling of archives with both cyrlic and latin subtitles (thanks @viking1304) -- providers: titlovi: allow direct subtitle downloads as fallback (when a subtitle, not an archive was returned) -- providers: hosszupuska: implement site change (thanks @morpheus133) -- providers: supersubtitles: add base properties to subtitle -- providers: opensubtitles, podnapisi: fix foreign/forced handling -- providers: subscene: use original/sceneName if possible -- menu: fix plugin not responding when ignoring an item in certain menus; fixes #535 -- menu: select active subtitle: return to item details afterwards; correctly set current -- menu: add item thumbnails to history and a couple of submenus -- menu: history: use series thumbnail instead of episode screenshot -- menu: add full soft include/exclude menu handling -- menu: add support for separate forced and not-forced subtitles -- menu: fix order of embedded subtitle streams in item detail -- menu: support S00E00 and equivalent -- submod: add option to fix only-uppercase subtitles and make them readable -- submod: keep track of actually applied mods -- submod: correctly merge mods of the same kind (offset) -- submod: OCR: add dictionaries for bosnian and norwegian bokmal; update dicts for dan, eng, hrv, spa, srp, swe -- submod: OCR/HI: skip certain processors for all-caps subs -- submod: HI: only remove caps before colon if the colon is followed by whitespace or EOL; fixes #542 -- submod: HI: remove MAN: -- submod: common: improve detection and normalization of quotes, apostrophes -- submod: common: fix double quotes that are meant to be single quotes inside words -- submod: common: normalize small hyphens to dash -- submod: common: remove line only consisting of colon; remove empty colon at start of line -- submod: common: add space after punctuation -- submod: common: fix lowercase i for english language -- submod: common: better fix for music symbols -- submod: reverse_RTL: also reverse ":,'-" chars in CM_RTL_reverse (thanks @doopler) -- submod: reverse_RTL: enable mod for arabic, farsi and persian besides hebrew -- i18n: fix not used translation for recently added missing subtitles menu -- i18n: fix spanish translation, fixes #543 -- i18n: Hungarian translation is incomplete - +2.6.4.2859 +- core: fix thread.lock error (only affected the history menu, not the actual functionality) +- core: fix audio-based conditional subtitle decision making; fixes #592 +- core: massively improve metadata subtitle storage +- providers: opensubtitles: skip non-forced results when searching for forced +- providers: podnapisi: skip non-forced results when searching for forced +- submod: common: correctly pad music symbols on either side From 47bb8563ca7548b5c6ee21a5d63396f84989d83f Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 10 Nov 2018 04:33:58 +0100 Subject: [PATCH 319/710] release 2.6.4.2859 --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 137337854..4956bf2e0 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ PlexPluginConsoleLogging 0 PlexPluginDevMode - 1 + 0 PlexPluginCodePolicy Elevated @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2859 DEV +Version 2.6.4.2859 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 3b50b58aac02adf9c616ad82d4d551f994e761f0 Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 15 Nov 2018 22:28:10 +0100 Subject: [PATCH 320/710] menu: fix "ignore list list" --- Contents/Strings/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 4e50fed8b..89734af4b 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -403,12 +403,12 @@ "forced": "forced", "%s in %s (%s, score: %s), %s": "%s in %s (%s, score: %s), %s", "Extract embedded subtitle streams": "Extract embedded subtitle streams", - "Display %(incl_excl_list_name)s (%(count)d)": "Display %(incl_excl_list_name)s list (%(count)d)", + "Display %(incl_excl_list_name)s (%(count)d)": "Display %(incl_excl_list_name)s (%(count)d)", "include list": "include list", "ignore list": "ignore list", "Include list": "Include list", "Ignore list": "Ignore list", - "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "Show the current %(incl_excl_list_name)s list (mainly used for the automatic tasks)", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)", "Didn't change the %(incl_excl_list_name)s": "Didn't change the %(incl_excl_list_name)s", "%(title)s added to the include list": "%(title)s added to the include list", "%(title)s removed from the include list": "%(title)s removed from the include list", From b770a40150b151f8609c5da65b908515849be0a4 Mon Sep 17 00:00:00 2001 From: morpheus133 Date: Mon, 19 Nov 2018 15:18:22 +0100 Subject: [PATCH 321/710] Modification based on comment: Please modify this PR: don't remove the sanitize call to not break other providers add no_sanitize=False to the function to return the unsanitized result --- .../Shared/subliminal_patch/providers/hosszupuska.py | 2 +- .../Libraries/Shared/subliminal_patch/providers/titlovi.py | 4 ++-- Contents/Libraries/Shared/subliminal_patch/utils.py | 7 ++++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py b/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py index 4d4d4d9f1..8f4f6c4fa 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py @@ -34,7 +34,7 @@ def fix_inconsistent_naming(title): """ return _fix_inconsistent_naming(title, {"Stargate Origins": "Stargate: Origins", "Marvel's Agents of S.H.I.E.L.D.": "Marvels+Agents+of+S.H.I.E.L.D", - "Mayans M.C.": "Mayans MC"}) + "Mayans M.C.": "Mayans MC"}, True ) logger = logging.getLogger(__name__) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index b4d61423c..162330cb0 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -41,8 +41,8 @@ def fix_inconsistent_naming(title): :rtype: str """ - return sanitize(_fix_inconsistent_naming(title, {"DC's Legends of Tomorrow": "Legends of Tomorrow", - "Marvel's Jessica Jones": "Jessica Jones"})) + return _fix_inconsistent_naming(title, {"DC's Legends of Tomorrow": "Legends of Tomorrow", + "Marvel's Jessica Jones": "Jessica Jones"}) logger = logging.getLogger(__name__) diff --git a/Contents/Libraries/Shared/subliminal_patch/utils.py b/Contents/Libraries/Shared/subliminal_patch/utils.py index 9bee59ab8..17720334e 100644 --- a/Contents/Libraries/Shared/subliminal_patch/utils.py +++ b/Contents/Libraries/Shared/subliminal_patch/utils.py @@ -35,11 +35,12 @@ def sanitize(string, ignore_characters=None, default_characters={'-', ':', '(', return string.strip().lower() -def fix_inconsistent_naming(title, inconsistent_titles_dict=None): +def fix_inconsistent_naming(title, inconsistent_titles_dict=None, no_sanitize=False): """Fix titles with inconsistent naming using dictionary and sanitize them. :param str title: original title. :param dict inconsistent_titles_dict: dictionary of titles with inconsistent naming. + :param bool no_sanitize: indication to not sanitize title. :return: new title. :rtype: str @@ -54,5 +55,9 @@ def fix_inconsistent_naming(title, inconsistent_titles_dict=None): pattern = re.compile('|'.join(re.escape(key) for key in inconsistent_titles_dict.keys())) title = pattern.sub(lambda x: inconsistent_titles_dict[x.group()], title) + if no_sanitize: + return title + else: + return sanitize(title) # return fixed and sanitized title return title From 3bafcb6b4e501ab632060c8fead9649dea157132 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 19 Nov 2018 17:01:35 +0100 Subject: [PATCH 322/710] menu: advanced: add skip next search all recently missing subtitles entry --- Contents/Code/interface/advanced.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Contents/Code/interface/advanced.py b/Contents/Code/interface/advanced.py index ba47b0955..c9a25af63 100644 --- a/Contents/Code/interface/advanced.py +++ b/Contents/Code/interface/advanced.py @@ -61,6 +61,10 @@ def AdvancedMenu(randomize=None, header=None, message=None): key=Callback(SkipFindBetterSubtitles, randomize=timestamp()), title=pad_title(_("Skip next find better subtitles (sets last run to now)")), )) + oc.add(DirectoryObject( + key=Callback(SkipRecentlyAddedMissing, randomize=timestamp()), + title=pad_title(_("Skip next find recently added with missing subtitles (sets last run to now)")), + )) oc.add(DirectoryObject( key=Callback(TriggerStorageMaintenance, randomize=timestamp()), title=pad_title(_("Trigger subtitle storage maintenance")), @@ -207,6 +211,19 @@ def SkipFindBetterSubtitles(randomize=None): ) +@route(PREFIX + '/skipram') +@debounce +def SkipRecentlyAddedMissing(randomize=None): + task = scheduler.task("SearchAllRecentlyAddedMissing") + task.last_run = datetime.datetime.now() + + return AdvancedMenu( + randomize=timestamp(), + header=_("Success"), + message=_("SearchAllRecentlyAddedMissing skipped") + ) + + @route(PREFIX + '/triggermaintenance') @debounce def TriggerStorageMaintenance(randomize=None): From 9e270bb53fb6b12b2ffc54f72aa38942bf807361 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 19 Nov 2018 17:05:23 +0100 Subject: [PATCH 323/710] providers: legendastv, napiprojekt, subscenter, tvsubtitles: fix "No language to search for" issue; fixes #596 --- .../Shared/subliminal_patch/providers/legendastv.py | 4 +++- .../Shared/subliminal_patch/providers/napiprojekt.py | 2 ++ .../Shared/subliminal_patch/providers/subscenter.py | 2 ++ .../Shared/subliminal_patch/providers/tvsubtitles.py | 4 ++++ Contents/Libraries/Shared/subzero/language.py | 10 ++++++++-- 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py b/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py index cffde9064..0661b5f4d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py @@ -7,7 +7,8 @@ from subliminal.providers.legendastv import LegendasTVSubtitle as _LegendasTVSubtitle, \ LegendasTVProvider as _LegendasTVProvider, Episode, Movie, guess_matches, guessit, sanitize, region, type_map, \ raise_for_status, json, SHOW_EXPIRATION_TIME, title_re, season_re, datetime, pytz, NO_VALUE, releases_key, \ - SUBTITLE_EXTENSIONS + SUBTITLE_EXTENSIONS, language_converters +from subzero.language import Language logger = logging.getLogger(__name__) @@ -63,6 +64,7 @@ def get_matches(self, video, hearing_impaired=False): class LegendasTVProvider(_LegendasTVProvider): + languages = {Language(*l) for l in language_converters['legendastv'].to_legendastv.keys()} subtitle_class = LegendasTVSubtitle def __init__(self, username=None, password=None): diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/napiprojekt.py b/Contents/Libraries/Shared/subliminal_patch/providers/napiprojekt.py index e4fefae46..0b80f821d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/napiprojekt.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/napiprojekt.py @@ -3,6 +3,7 @@ from subliminal.providers.napiprojekt import NapiProjektProvider as _NapiProjektProvider, \ NapiProjektSubtitle as _NapiProjektSubtitle, get_subhash +from subzero.language import Language logger = logging.getLogger(__name__) @@ -18,6 +19,7 @@ def __repr__(self): class NapiProjektProvider(_NapiProjektProvider): + languages = {Language.fromalpha2(l) for l in ['pl']} subtitle_class = NapiProjektSubtitle def query(self, language, hash): diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscenter.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscenter.py index a8b9844b4..5626c9935 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscenter.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscenter.py @@ -2,6 +2,7 @@ from subliminal.providers.subscenter import SubsCenterProvider as _SubsCenterProvider, \ SubsCenterSubtitle as _SubsCenterSubtitle +from subzero.language import Language class SubsCenterSubtitle(_SubsCenterSubtitle): @@ -21,6 +22,7 @@ def __repr__(self): class SubsCenterProvider(_SubsCenterProvider): + languages = {Language.fromalpha2(l) for l in ['he']} subtitle_class = SubsCenterSubtitle hearing_impaired_verifiable = True server_url = 'http://www.subscenter.info/he/' diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/tvsubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/tvsubtitles.py index d09a6adc5..7f359772d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/tvsubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/tvsubtitles.py @@ -21,6 +21,10 @@ def __init__(self, language, page_link, subtitle_id, series, season, episode, ye class TVsubtitlesProvider(_TVsubtitlesProvider): + languages = {Language('por', 'BR')} | {Language(l) for l in [ + 'ara', 'bul', 'ces', 'dan', 'deu', 'ell', 'eng', 'fin', 'fra', 'hun', 'ita', 'jpn', 'kor', 'nld', 'pol', 'por', + 'ron', 'rus', 'spa', 'swe', 'tur', 'ukr', 'zho' + ]} subtitle_class = TVsubtitlesSubtitle @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME) diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index af486c4ed..f520f6dad 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -1,6 +1,7 @@ # coding=utf-8 -from babelfish.exceptions import LanguageError +import types +from babelfish.exceptions import LanguageError from babelfish import Language as Language_, basestr @@ -34,7 +35,12 @@ def inner(*args, **kwargs): cls = args[0] args = args[1:] s = args.pop(0) - base, forced = s.split(":") if ":" in s else (s, False) + forced = None + if isinstance(s, types.StringTypes): + base, forced = s.split(":") if ":" in s else (s, False) + else: + base = s + instance = f(cls, base, *args, **kwargs) if isinstance(instance, Language): instance.forced = forced == "forced" From 63cf4a2d67de32ffdafb4d5c13b3d29c37802e6f Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 19 Nov 2018 17:11:02 +0100 Subject: [PATCH 324/710] core: scanning: don't fail on metadata subtitles with bad language code; fixes #596 --- Contents/Code/support/scanning.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Contents/Code/support/scanning.py b/Contents/Code/support/scanning.py index e3431a78b..fee1c6517 100644 --- a/Contents/Code/support/scanning.py +++ b/Contents/Code/support/scanning.py @@ -90,7 +90,14 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr known_metadata_subs = set() meta_subs = get_subtitles_from_metadata(plex_part) for language, subList in meta_subs.iteritems(): - lang = Language.fromietf(Locale.Language.Match(language)) + try: + lang = Language.fromietf(Locale.Language.Match(language)) + except LanguageError: + if config.treat_und_as_first: + lang = Language.rebuild(list(config.lang_list)[0]) + else: + continue + if subList: for key in subList: if key.startswith("subzero_md_forced"): From f785ba8932186109d70d28cbdcb3495d104ee43f Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 19 Nov 2018 17:13:55 +0100 Subject: [PATCH 325/710] update changelog --- Contents/Info.plist | 4 ++-- README.md | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 137337854..522525cf0 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.4.2859 + 2.6.4.2864 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2859 DEV +Version 2.6.4.2864 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index a937b02ca..a01496e76 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,13 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog +2.6.4.2864 +- core: scanning: don't fail on metadata subtitles with bad language code; fixes #596 +- providers: legendastv, napiprojekt, subscenter, tvsubtitles: fix "No language to search for" issue; fixes #596 +- menu: fix "ignore list list" +- menu: advanced: add skip next search all recently missing subtitles entry + + 2.6.4.2859 - core: fix thread.lock error (only affected the history menu, not the actual functionality) - core: fix audio-based conditional subtitle decision making; fixes #592 From eb4fa8d85d1d9fde32bf7cb34c782d6a727b9999 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 19 Nov 2018 17:14:27 +0100 Subject: [PATCH 326/710] release 2.6.4.2864 --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 522525cf0..1af39228a 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ PlexPluginConsoleLogging 0 PlexPluginDevMode - 1 + 0 PlexPluginCodePolicy Elevated @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2864 DEV +Version 2.6.4.2864 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 79d16b98f1680a448a8a1a1ee100aee07c14dcba Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 19 Nov 2018 17:39:07 +0100 Subject: [PATCH 327/710] core: scanning: add expected title to series/episodes as well; fix Narcos: Mexico --- Contents/Code/support/helpers.py | 2 ++ Contents/Libraries/Shared/subliminal_patch/core.py | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index f4c3a0c99..1e5d4493f 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -274,6 +274,8 @@ def get_item_hints(data): "title": data["original_title"] or data["series"], } ) + if hints["title"]: + hints["title"] = hints["title"].replace(":", "") return hints diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 5f3158195..28e3df5ad 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -514,8 +514,7 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski # guess hints["single_value"] = True - if video_type == "movie": - hints["expected_title"] = [hints["title"]] + hints["expected_title"] = [hints["title"]] guessed_result = guessit(guess_from, options=hints) logger.debug('GuessIt found: %s', json.dumps(guessed_result, cls=GuessitEncoder, indent=4, ensure_ascii=False)) From 9e730a2b8541d096989c8840f019e6f83fb71a97 Mon Sep 17 00:00:00 2001 From: panni Date: Mon, 19 Nov 2018 17:40:59 +0100 Subject: [PATCH 328/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 1af39228a..522525cf0 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ PlexPluginConsoleLogging 0 PlexPluginDevMode - 0 + 1 PlexPluginCodePolicy Elevated @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2864 +Version 2.6.4.2864 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 01fd66c35a743a1a90d014f6a74fe9b01c8b1c2b Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 23 Nov 2018 05:15:52 +0100 Subject: [PATCH 329/710] core: check sonarr/radarr connectivity without blocking the main thread; fixes #597 --- Contents/Code/interface/menu.py | 60 +++++++++++-------- .../Libraries/Shared/subliminal_patch/http.py | 7 +++ .../Shared/subliminal_patch/refiners/drone.py | 8 +-- 3 files changed, 47 insertions(+), 28 deletions(-) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index db77e3d59..3eadd2cbd 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -276,6 +276,41 @@ def replace_item(obj, key, replace_value): return obj +def check_connections(): + # debug drone + if "sonarr" in config.refiner_settings or "radarr" in config.refiner_settings: + Log.Debug("Checking connections ...") + log_buffer = [] + try: + from subliminal_patch.refiners.drone import SonarrClient, RadarrClient + log_buffer.append(["----- Connections -----"]) + for key, cls in [("sonarr", SonarrClient), ("radarr", RadarrClient)]: + if key in config.refiner_settings: + cname = key.capitalize() + try: + status = cls(**config.refiner_settings[key]).status(timeout=5) + except HTTPError, e: + if e.response.status_code == 401: + log_buffer.append(("%s: NOT WORKING - BAD API KEY", cname)) + else: + log_buffer.append(("%s: NOT WORKING - %s", cname, traceback.format_exc())) + except: + log_buffer.append(("%s: NOT WORKING - %s", cname, traceback.format_exc())) + else: + if status and status["version"]: + log_buffer.append(("%s: OK - %s", cname, status["version"])) + else: + log_buffer.append(("%s: NOT WORKING - %s", cname)) + except: + log_buffer.append(("Something went really wrong when evaluating Sonarr/Radarr: %s", traceback.format_exc())) + finally: + Core.log.setLevel(logging.DEBUG) + for entry in log_buffer: + Log.Debug(*entry) + + Core.log.setLevel(logging.getLevelName(Prefs["log_level"])) + + @route(PREFIX + '/ValidatePrefs', enforce_route=True) def ValidatePrefs(): Core.log.setLevel(logging.DEBUG) @@ -362,30 +397,7 @@ def ValidatePrefs(): "subtitles.save.filesystem", ]: Log.Debug("Pref.%s: %s", attr, Prefs[attr]) - # debug drone - if "sonarr" in config.refiner_settings or "radarr" in config.refiner_settings: - Log.Debug("----- Connections -----") - try: - from subliminal_patch.refiners.drone import SonarrClient, RadarrClient - for key, cls in [("sonarr", SonarrClient), ("radarr", RadarrClient)]: - if key in config.refiner_settings: - cname = key.capitalize() - try: - status = cls(**config.refiner_settings[key]).status() - except HTTPError, e: - if e.response.status_code == 401: - Log.Debug("%s: NOT WORKING - BAD API KEY", cname) - else: - Log.Debug("%s: NOT WORKING - %s", cname, traceback.format_exc()) - except: - Log.Debug("%s: NOT WORKING - %s", cname, traceback.format_exc()) - else: - if status and status["version"]: - Log.Debug("%s: OK - %s", cname, status["version"]) - else: - Log.Debug("%s: NOT WORKING - %s", cname) - except: - Log.Debug("Something went really wrong when evaluating Sonarr/Radarr: %s", traceback.format_exc()) + Thread.Create(check_connections) # fixme: check existance of and os access of logs Log.Debug("----- Environment -----") diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 5b6b308af..d6fddb358 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -31,10 +31,17 @@ class CertifiSession(Session): + timeout = 10 + def __init__(self): super(CertifiSession, self).__init__() self.verify = pem_file + def request(self, *args, **kwargs): + if kwargs.get('timeout') is None: + kwargs['timeout'] = self.timeout + return super(CertifiSession, self).request(*args, **kwargs) + class RetryingSession(CertifiSession): proxied_functions = ("get", "post") diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/drone.py b/Contents/Libraries/Shared/subliminal_patch/refiners/drone.py index d0a5cb628..ae96e26c9 100644 --- a/Contents/Libraries/Shared/subliminal_patch/refiners/drone.py +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/drone.py @@ -63,12 +63,12 @@ def build_params(self, params): out[key] = quote(value) return out - def get(self, endpoint, **params): + def get(self, endpoint, requests_kwargs=None, **params): url = urljoin(self.api_url, endpoint) params = self.build_params(params) # perform the request - r = self.session.get(url, params=params) + r = self.session.get(url, params=params, **(requests_kwargs or {})) r.raise_for_status() # get the response as json @@ -79,8 +79,8 @@ def get(self, endpoint, **params): return j return [] - def status(self): - return self.get("system/status") + def status(self, **kwargs): + return self.get("system/status", requests_kwargs=kwargs) def update_video(self, video, scene_name): """ From ccfc40f6fcedb213d5d40c616d7ac6fcf4846efa Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 23 Nov 2018 05:18:42 +0100 Subject: [PATCH 330/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 522525cf0..f3c5c4b2d 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.4.2864 + 2.6.4.2878 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2864 DEV +Version 2.6.4.2878 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From e14402c6a0581a9867830b74c069ae4eef74b66e Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 25 Nov 2018 03:03:22 +0100 Subject: [PATCH 331/710] core: extract embedded: fix #598 --- Contents/Code/__init__.py | 2 +- Contents/Libraries/Shared/subliminal_patch/video.py | 2 ++ Contents/Libraries/Shared/subzero/video.py | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 1787781a4..84005ec5a 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -121,7 +121,7 @@ def agent_extract_embedded(video_part_map): for requested_language in config.lang_list: embedded_subs = stored_subs.get_by_provider(plexapi_part.id, requested_language, "embedded") current = stored_subs.get_any(plexapi_part.id, requested_language) or \ - requested_language in scanned_video.subtitle_languages + requested_language in scanned_video.external_subtitle_languages if not embedded_subs: stream_data = get_embedded_subtitle_streams(plexapi_part, requested_language=requested_language) diff --git a/Contents/Libraries/Shared/subliminal_patch/video.py b/Contents/Libraries/Shared/subliminal_patch/video.py index df615c849..a53b09ead 100644 --- a/Contents/Libraries/Shared/subliminal_patch/video.py +++ b/Contents/Libraries/Shared/subliminal_patch/video.py @@ -12,6 +12,7 @@ class Video(Video_): hints = None season_fully_aired = None audio_languages = None + external_subtitle_languages = None def __init__(self, name, format=None, release_group=None, resolution=None, video_codec=None, audio_codec=None, imdb_id=None, hashes=None, size=None, subtitle_languages=None, audio_languages=None): @@ -22,3 +23,4 @@ def __init__(self, name, format=None, release_group=None, resolution=None, video self.plexapi_metadata = {} self.hints = {} self.audio_languages = audio_languages or set() + self.external_subtitle_languages = set() diff --git a/Contents/Libraries/Shared/subzero/video.py b/Contents/Libraries/Shared/subzero/video.py index b12f38669..fc6dc99de 100644 --- a/Contents/Libraries/Shared/subzero/video.py +++ b/Contents/Libraries/Shared/subzero/video.py @@ -33,6 +33,7 @@ def set_existing_languages(video, video_info, external_subtitles=False, embedded if external_subtitles: # |= is update, thanks plex video.subtitle_languages.update(external_langs_found) + video.external_subtitle_languages.update(external_langs_found) else: # did we already download subtitles for this? From 565987fafff293f99182af7c520de1737f19717b Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 25 Nov 2018 03:21:59 +0100 Subject: [PATCH 332/710] providers: opensubtitles: add advanced setting to optionally not skip subtitles with wrong FPS --- Contents/Code/support/config.py | 6 +++++- Contents/advanced_settings.json.template | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 942ac49cc..2d5b01cf0 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -817,7 +817,10 @@ def get_providers(self, media_type="series"): def get_provider_settings(self): os_use_https = self.advanced.providers.opensubtitles.use_https \ - if self.advanced.providers.opensubtitles.use_https != None else True + if self.advanced.providers.opensubtitles.use_https is not None else True + + os_skip_wrong_fps = self.advanced.providers.opensubtitles.skip_wrong_fps \ + if self.advanced.providers.opensubtitles.skip_wrong_fps is not None else True provider_settings = {'addic7ed': {'username': Prefs['provider.addic7ed.username'], 'password': Prefs['provider.addic7ed.password'], @@ -831,6 +834,7 @@ def get_provider_settings(self): 'is_vip': cast_bool(Prefs['provider.opensubtitles.is_vip']), 'use_ssl': os_use_https, 'timeout': self.advanced.providers.opensubtitles.timeout or 15, + 'skip_wrong_fps': os_skip_wrong_fps, }, 'podnapisi': { 'only_foreign': self.forced_only, diff --git a/Contents/advanced_settings.json.template b/Contents/advanced_settings.json.template index 8efe5231a..b9c14c470 100644 --- a/Contents/advanced_settings.json.template +++ b/Contents/advanced_settings.json.template @@ -44,6 +44,9 @@ Don't expect support if you mess this up. "enabled_for": ["series", "movies"], "use_https": true, "timeout": 15, + // skip subtitles with a mismatched FPS value; might lead to more results when disabled + // but also to more false-positives + "skip_wrong_fps": true, }, "podnapisi": { "enabled_for": ["series", "movies"], From 2488d4db53e9138bee0bf7bac193b332b0d520a0 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 25 Nov 2018 03:23:21 +0100 Subject: [PATCH 333/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index f3c5c4b2d..92314915b 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.4.2878 + 2.6.4.2881 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2878 DEV +Version 2.6.4.2881 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 4c76439f4e2bc6b07bcee6e0d93e142c7752c019 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 25 Nov 2018 03:23:51 +0100 Subject: [PATCH 334/710] release 2.6.4.2881 --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 92314915b..3c664862b 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ PlexPluginConsoleLogging 0 PlexPluginDevMode - 1 + 0 PlexPluginCodePolicy Elevated @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2881 DEV +Version 2.6.4.2881 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 734e0f7128c05c0f639e11e7dfc77daa1014064b Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 25 Nov 2018 03:30:31 +0100 Subject: [PATCH 335/710] release 2.6.4.2881 --- CHANGELOG.md | 10 ++++++++++ README.md | 16 ++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 339c1a988..846b2e648 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,14 @@ +2.6.4.2859 +- core: fix thread.lock error (only affected the history menu, not the actual functionality) +- core: fix audio-based conditional subtitle decision making; fixes #592 +- core: massively improve metadata subtitle storage +- providers: opensubtitles: skip non-forced results when searching for forced +- providers: podnapisi: skip non-forced results when searching for forced +- submod: common: correctly pad music symbols on either side + + + 2.6.4.2834 - core: add option to use custom (Google, Cloudflare) DNS to resolve provider hosts in problematic countries; fixes #547 - core: add support for downloading subtitles only when the audio streams don't match (any?) configured languages; fixes #519 diff --git a/README.md b/README.md index eb8a738f0..6edbe3523 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,12 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog +2.6.4.2881 +- core: extract embedded: fix automatic extraction not actually writing the subtitles to disk under certain circumstances; fixes #598 +- core: sonarr/radarr: don't block the main thread while checking connectivity; fixes #597 +- providers: hosszupuska: fix inconsistent series naming (thanks @morpheus133) +- providers: opensubtitles: add advanced setting to optionally not skip subtitles with wrong FPS; fixes #578 + 2.6.4.2864 - core: scanning: don't fail on metadata subtitles with bad language code; fixes #596 - providers: legendastv, napiprojekt, subscenter, tvsubtitles: fix "No language to search for" issue; fixes #596 @@ -91,16 +97,6 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe - menu: advanced: add skip next search all recently missing subtitles entry -2.6.4.2859 -- core: fix thread.lock error (only affected the history menu, not the actual functionality) -- core: fix audio-based conditional subtitle decision making; fixes #592 -- core: massively improve metadata subtitle storage -- providers: opensubtitles: skip non-forced results when searching for forced -- providers: podnapisi: skip non-forced results when searching for forced -- submod: common: correctly pad music symbols on either side - - - [older changes](CHANGELOG.md) From cae120cfd4c2f432068775f4bbda207bb025fca8 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 25 Nov 2018 03:30:55 +0100 Subject: [PATCH 336/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 3c664862b..92314915b 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ PlexPluginConsoleLogging 0 PlexPluginDevMode - 0 + 1 PlexPluginCodePolicy Elevated @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2881 +Version 2.6.4.2881 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 6e8ce9d23d61ff3fc7826e7447c4f7a64df5a942 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 27 Nov 2018 07:45:18 +0100 Subject: [PATCH 337/710] providers: opensubtitles: improve token logging --- .../Shared/subliminal_patch/providers/opensubtitles.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index b8474997c..376c8ce19 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -163,12 +163,13 @@ def initialize(self): token = region.get("os_token", expiration_time=3600) if token is not NO_VALUE: try: - logger.debug('Trying previous token') + logger.debug('Trying previous token: %r', token[:10]+"X"*(len(token)-10)) checked(lambda: self.server.NoOperation(token)) self.token = token - logger.debug("Using previous login token: %s", self.token) + logger.debug("Using previous login token: %r", token[:10]+"X"*(len(token)-10)) return except: + logger.debug('Token not valid.') pass try: From 3a5effaa521b1f135f78b4817cf5052b17da58f4 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 27 Nov 2018 07:45:46 +0100 Subject: [PATCH 338/710] core: don't log "Checking connections ..." when sonarr/radarr not activated --- Contents/Code/interface/menu.py | 58 ++++++++++++++++----------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 3eadd2cbd..75d569a16 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -278,37 +278,36 @@ def replace_item(obj, key, replace_value): def check_connections(): # debug drone - if "sonarr" in config.refiner_settings or "radarr" in config.refiner_settings: - Log.Debug("Checking connections ...") - log_buffer = [] - try: - from subliminal_patch.refiners.drone import SonarrClient, RadarrClient - log_buffer.append(["----- Connections -----"]) - for key, cls in [("sonarr", SonarrClient), ("radarr", RadarrClient)]: - if key in config.refiner_settings: - cname = key.capitalize() - try: - status = cls(**config.refiner_settings[key]).status(timeout=5) - except HTTPError, e: - if e.response.status_code == 401: - log_buffer.append(("%s: NOT WORKING - BAD API KEY", cname)) - else: - log_buffer.append(("%s: NOT WORKING - %s", cname, traceback.format_exc())) - except: + Log.Debug("Checking connections ...") + log_buffer = [] + try: + from subliminal_patch.refiners.drone import SonarrClient, RadarrClient + log_buffer.append(["----- Connections -----"]) + for key, cls in [("sonarr", SonarrClient), ("radarr", RadarrClient)]: + if key in config.refiner_settings: + cname = key.capitalize() + try: + status = cls(**config.refiner_settings[key]).status(timeout=5) + except HTTPError, e: + if e.response.status_code == 401: + log_buffer.append(("%s: NOT WORKING - BAD API KEY", cname)) + else: log_buffer.append(("%s: NOT WORKING - %s", cname, traceback.format_exc())) + except: + log_buffer.append(("%s: NOT WORKING - %s", cname, traceback.format_exc())) + else: + if status and status["version"]: + log_buffer.append(("%s: OK - %s", cname, status["version"])) else: - if status and status["version"]: - log_buffer.append(("%s: OK - %s", cname, status["version"])) - else: - log_buffer.append(("%s: NOT WORKING - %s", cname)) - except: - log_buffer.append(("Something went really wrong when evaluating Sonarr/Radarr: %s", traceback.format_exc())) - finally: - Core.log.setLevel(logging.DEBUG) - for entry in log_buffer: - Log.Debug(*entry) + log_buffer.append(("%s: NOT WORKING - %s", cname)) + except: + log_buffer.append(("Something went really wrong when evaluating Sonarr/Radarr: %s", traceback.format_exc())) + finally: + Core.log.setLevel(logging.DEBUG) + for entry in log_buffer: + Log.Debug(*entry) - Core.log.setLevel(logging.getLevelName(Prefs["log_level"])) + Core.log.setLevel(logging.getLevelName(Prefs["log_level"])) @route(PREFIX + '/ValidatePrefs', enforce_route=True) @@ -397,7 +396,8 @@ def ValidatePrefs(): "subtitles.save.filesystem", ]: Log.Debug("Pref.%s: %s", attr, Prefs[attr]) - Thread.Create(check_connections) + if "sonarr" in config.refiner_settings or "radarr" in config.refiner_settings: + Thread.Create(check_connections) # fixme: check existance of and os access of logs Log.Debug("----- Environment -----") From 817a6300eafb2ccba19889fbb7767cc42c5bf481 Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 27 Nov 2018 07:46:22 +0100 Subject: [PATCH 339/710] core: improve file cache; use fixed-length cache filenames; fixes #600 --- Contents/Code/support/config.py | 26 ++++++++--- Contents/Libraries/Shared/fcache/cache.py | 55 +++++++++++++++++------ 2 files changed, 61 insertions(+), 20 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 2d5b01cf0..e95eb7e25 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -79,7 +79,7 @@ def int_or_default(s, default): class Config(object): - config_version = 2 + config_version = 3 libraries_root = None plugin_info = "" version = None @@ -172,6 +172,8 @@ def initialize(self): self.data_items_path = os.path.join(self.data_path, "DataItems") self.universal_plex_token = self.get_universal_plex_token() self.plex_token = os.environ.get("PLEXTOKEN", self.universal_plex_token) + self.new_style_cache = cast_bool(Prefs['new_style_cache']) + self.pack_cache_dir = self.get_pack_cache_dir() try: self.migrate_prefs() except: @@ -180,8 +182,6 @@ def initialize(self): subzero.constants.DEFAULT_TIMEOUT = lib.DEFAULT_TIMEOUT = self.pms_request_timeout = \ min(cast_int(Prefs['pms_request_timeout'], 15), 45) self.low_impact_mode = cast_bool(Prefs['low_impact_mode']) - self.new_style_cache = cast_bool(Prefs['new_style_cache']) - self.pack_cache_dir = self.get_pack_cache_dir() self.advanced = self.get_advanced_config() self.debug_i18n = self.advanced.debug_i18n @@ -256,6 +256,9 @@ def migrate_prefs(self): if update_prefs: update_user_prefs(update_prefs, Prefs, Log) + else: + Dict["config_version"] = self.config_version + Dict.Save() def migrate_prefs_to_1(self, user_prefs, **kwargs): update_prefs = {} @@ -275,6 +278,15 @@ def migrate_prefs_to_2(self, user_prefs, **kwargs): return update_prefs + def migrate_prefs_to_3(self, user_prefs, **kwargs): + if config.new_style_cache: + self.init_cache() + try: + subliminal.region.backend.clear() + except: + pass + return {} + def init_libraries(self): try_executables = [] custom_unrar = os.environ.get("SZ_UNRAR_TOOL") @@ -319,7 +331,8 @@ def init_cache(self): if self.new_style_cache: subliminal.region.configure('subzero.cache.file', expiration_time=datetime.timedelta(days=30), arguments={'appname': "sz_cache", - 'app_cache_dir': self.data_path}) + 'app_cache_dir': self.data_path}, + replace_existing_backend=True) Log.Info("Using new style file based cache!") return @@ -359,14 +372,15 @@ def init_cache(self): try: subliminal.region.configure('dogpile.cache.dbm', expiration_time=datetime.timedelta(days=30), arguments={'filename': dbfn, - 'lock_factory': MutexLock}) + 'lock_factory': MutexLock}, + replace_existing_backend=True) Log.Info("Using file based cache!") return except: self.dbm_supported = False Log.Warn("Not using file based cache!") - subliminal.region.configure('dogpile.cache.memory') + subliminal.region.configure('dogpile.cache.memory', replace_existing_backend=True) def sync_cache(self): if not self.new_style_cache: diff --git a/Contents/Libraries/Shared/fcache/cache.py b/Contents/Libraries/Shared/fcache/cache.py index 3eaf62777..695f916c3 100644 --- a/Contents/Libraries/Shared/fcache/cache.py +++ b/Contents/Libraries/Shared/fcache/cache.py @@ -5,6 +5,7 @@ import shutil import tempfile import traceback +import hashlib import appdirs @@ -89,7 +90,7 @@ class FileCache(MutableMapping): """ def __init__(self, appname, flag='c', mode=0o666, keyencoding='utf-8', - serialize=True, app_cache_dir=None): + serialize=True, app_cache_dir=None, key_file_ext=".txt"): """Initialize a :class:`FileCache` object.""" if not isinstance(flag, str): raise TypeError("flag must be str not '{}'".format(type(flag))) @@ -130,6 +131,7 @@ def __init__(self, appname, flag='c', mode=0o666, keyencoding='utf-8', self._mode = mode self._keyencoding = keyencoding self._serialize = serialize + self.key_file_ext = key_file_ext def _parse_appname(self, appname): """Splits an appname into the appname and subcache components.""" @@ -188,6 +190,11 @@ def sync(self): except: logger.error("Couldn't write content from %r to cache file: %r: %s", ekey, filename, traceback.format_exc()) + try: + self.__write_to_file(filename + self.key_file_ext, ekey) + except: + logger.error("Couldn't write content from %r to cache file: %r: %s", ekey, filename, + traceback.format_exc()) self._buffer.clear() self._sync = False @@ -196,8 +203,7 @@ def _closed(self, *args, **kwargs): raise ValueError("invalid operation on closed cache") def _encode_key(self, key): - """Encode key using *hex_codec* for constructing a cache filename. - + """ Keys are implicitly converted to :class:`bytes` if passed as :class:`str`. @@ -206,16 +212,15 @@ def _encode_key(self, key): key = key.encode(self._keyencoding) elif not isinstance(key, bytes): raise TypeError("key must be bytes or str") - return codecs.encode(key, 'hex_codec').decode(self._keyencoding) + return key.decode(self._keyencoding) def _decode_key(self, key): - """Decode key using hex_codec to retrieve the original key. - + """ Keys are returned as :class:`str` if serialization is enabled. Keys are returned as :class:`bytes` if serialization is disabled. """ - bkey = codecs.decode(key.encode(self._keyencoding), 'hex_codec') + bkey = key.encode(self._keyencoding) return bkey.decode(self._keyencoding) if self._serialize else bkey def _dumps(self, value): @@ -226,18 +231,24 @@ def _loads(self, value): def _key_to_filename(self, key): """Convert an encoded key to an absolute cache filename.""" - return os.path.join(self.cache_dir, key) + if isinstance(key, unicode): + key = key.encode(self._keyencoding) + return os.path.join(self.cache_dir, hashlib.md5(key).hexdigest()) def _filename_to_key(self, absfilename): """Convert an absolute cache filename to a key name.""" - return os.path.split(absfilename)[1] + hkey_hdr_fn = absfilename + self.key_file_ext + if os.path.isfile(hkey_hdr_fn): + with open(hkey_hdr_fn, 'rb') as f: + key = f.read() + return key.decode(self._keyencoding) if self._serialize else key def _all_filenames(self, scandir_generic=True): """Return a list of absolute cache filenames""" _scandir = _scandir_generic if scandir_generic else scandir try: for entry in _scandir(self.cache_dir): - if entry.is_file(follow_symlinks=False): + if entry.is_file(follow_symlinks=False) and not entry.name.endswith(self.key_file_ext): yield os.path.join(self.cache_dir, entry.name) except (FileNotFoundError, OSError): raise StopIteration @@ -250,14 +261,17 @@ def _all_keys(self): else: return set(file_keys + list(self._buffer)) - def _write_to_file(self, filename, bytesvalue): + def __write_to_file(self, filename, value): """Write bytesvalue to filename.""" fh, tmp = tempfile.mkstemp() with os.fdopen(fh, self._flag) as f: - f.write(self._dumps(bytesvalue)) + f.write(value) rename(tmp, filename) os.chmod(filename, self._mode) + def _write_to_file(self, filename, bytesvalue): + self.__write_to_file(filename, self._dumps(bytesvalue)) + def _read_from_file(self, filename): """Read data from filename.""" try: @@ -274,6 +288,7 @@ def __setitem__(self, key, value): else: filename = self._key_to_filename(ekey) self._write_to_file(filename, value) + self.__write_to_file(filename + self.key_file_ext, ekey) def __getitem__(self, key): ekey = self._encode_key(key) @@ -283,8 +298,9 @@ def __getitem__(self, key): except KeyError: pass filename = self._key_to_filename(ekey) - if filename not in self._all_filenames(): + if not os.path.isfile(filename): raise KeyError(key) + return self._read_from_file(filename) def __delitem__(self, key): @@ -301,6 +317,11 @@ def __delitem__(self, key): except (IOError, OSError): pass + try: + os.remove(filename + self.key_file_ext) + except (IOError, OSError): + pass + def __iter__(self): for key in self._all_keys(): yield self._decode_key(key) @@ -310,4 +331,10 @@ def __len__(self): def __contains__(self, key): ekey = self._encode_key(key) - return ekey in self._all_keys() + if not self._sync: + try: + return ekey in self._buffer + except KeyError: + pass + filename = self._key_to_filename(ekey) + return os.path.isfile(filename) From 839146b8c755131f4d5cbf4b59da3280c995544d Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 27 Nov 2018 07:46:52 +0100 Subject: [PATCH 340/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 92314915b..40ae88a22 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.4.2881 + 2.6.4.2888 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2881 DEV +Version 2.6.4.2888 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 6310b8f4aabff406e3bf7fa0a6190292ffd80a94 Mon Sep 17 00:00:00 2001 From: panni Date: Wed, 28 Nov 2018 13:34:19 +0100 Subject: [PATCH 341/710] core: don't assume hints["title"] exists --- Contents/Libraries/Shared/subliminal_patch/core.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 28e3df5ad..3787b9fb3 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -514,7 +514,8 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski # guess hints["single_value"] = True - hints["expected_title"] = [hints["title"]] + if "title" in hints: + hints["expected_title"] = [hints["title"]] guessed_result = guessit(guess_from, options=hints) logger.debug('GuessIt found: %s', json.dumps(guessed_result, cls=GuessitEncoder, indent=4, ensure_ascii=False)) From 1f855a7fd7de1b86762ac22c8e2bed35e60fc6bd Mon Sep 17 00:00:00 2001 From: panni Date: Thu, 29 Nov 2018 12:34:53 +0100 Subject: [PATCH 342/710] providers: podnapisi: fix searching for Marvel series --- .../subliminal_patch/providers/hosszupuska.py | 2 +- .../subliminal_patch/providers/podnapisi.py | 23 ++++++++++++++++--- .../Shared/subliminal_patch/utils.py | 1 - 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py b/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py index ad8a5a7f2..85f070566 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py @@ -35,7 +35,7 @@ def fix_inconsistent_naming(title): """ return _fix_inconsistent_naming(title, {"Stargate Origins": "Stargate: Origins", "Marvel's Agents of S.H.I.E.L.D.": "Marvels+Agents+of+S.H.I.E.L.D", - "Mayans M.C.": "Mayans MC"}, True ) + "Mayans M.C.": "Mayans MC"}, True) logger = logging.getLogger(__name__) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py b/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py index f55d08429..409a6708c 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py @@ -24,11 +24,28 @@ from subliminal import Movie from subliminal.providers.podnapisi import PodnapisiProvider as _PodnapisiProvider, \ PodnapisiSubtitle as _PodnapisiSubtitle +from subliminal_patch.utils import sanitize, fix_inconsistent_naming as _fix_inconsistent_naming from subzero.language import Language logger = logging.getLogger(__name__) +def fix_inconsistent_naming(title): + """Fix titles with inconsistent naming using dictionary and sanitize them. + + :param str title: original title. + :return: new title. + :rtype: str + + """ + d = {} + nt = title.replace("Marvels", "").replace("Marvel's", "") + if nt != title: + d[title] = nt + + return _fix_inconsistent_naming(title, d) + + class PodnapisiSubtitle(_PodnapisiSubtitle): provider_name = 'podnapisi' hearing_impaired_verifiable = True @@ -53,8 +70,8 @@ def get_matches(self, video): # episode if isinstance(video, Episode): # series - if video.series and (sanitize(self.title) in ( - sanitize(name) for name in [video.series] + video.alternative_series)): + if video.series and (fix_inconsistent_naming(self.title) in ( + fix_inconsistent_naming(name) for name in [video.series] + video.alternative_series)): matches.add('series') # year if video.original_series and self.year is None or video.year and video.year == self.year: @@ -113,7 +130,7 @@ def list_subtitles(self, video, languages): season = episode = None if isinstance(video, Episode): - titles = [video.series] + video.alternative_series + titles = [fix_inconsistent_naming(title) for title in [video.series] + video.alternative_series] season = video.season episode = video.episode else: diff --git a/Contents/Libraries/Shared/subliminal_patch/utils.py b/Contents/Libraries/Shared/subliminal_patch/utils.py index 17720334e..410b7a2be 100644 --- a/Contents/Libraries/Shared/subliminal_patch/utils.py +++ b/Contents/Libraries/Shared/subliminal_patch/utils.py @@ -60,4 +60,3 @@ def fix_inconsistent_naming(title, inconsistent_titles_dict=None, no_sanitize=Fa else: return sanitize(title) # return fixed and sanitized title - return title From 9d17e2ce9a448f9ff8250e40e44e149fba4fbad5 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 30 Nov 2018 10:16:36 +0100 Subject: [PATCH 343/710] providers: podnapisi: loosen lxml requirement --- .../Libraries/Shared/subliminal_patch/providers/podnapisi.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py b/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py index 409a6708c..16b7c2d7e 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py @@ -5,7 +5,6 @@ import io from zipfile import ZipFile -from lxml.etree import XMLSyntaxError from guessit import guessit from subliminal.subtitle import guess_matches @@ -175,7 +174,7 @@ def query(self, language, keyword, video, season=None, episode=None, year=None, try: content = self.session.get(self.server_url + 'search/old', params=params, timeout=10).content xml = etree.fromstring(content) - except XMLSyntaxError: + except etree.ParseError: logger.error("Wrong data returned: %r", content) break From 8047c66869a3ee2d3e4b8eabb1c518d2feb2871b Mon Sep 17 00:00:00 2001 From: viking1304 Date: Mon, 3 Dec 2018 03:31:22 +0100 Subject: [PATCH 344/710] Update titlovi.py --- .../Libraries/Shared/subliminal_patch/providers/titlovi.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index 4cf6d124a..6029e06fe 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -134,8 +134,8 @@ class TitloviProvider(Provider, ProviderSubtitleArchiveMixin): def initialize(self): self.session = Session() - self.session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' \ - '(KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' + self.session.headers['User-Agent'] = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3)' \ + 'Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)' logger.debug('User-Agent set to %s', self.session.headers['User-Agent']) self.session.headers['Referer'] = self.server_url logger.debug('Referer set to %s', self.session.headers['Referer']) From 7a3bc7086ec733a22567046c8b14e517ae1442e6 Mon Sep 17 00:00:00 2001 From: viking1304 Date: Mon, 3 Dec 2018 04:48:50 +0100 Subject: [PATCH 345/710] Fix subtitle detection in HTML Skip list elements that are not related to subtitles --- Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index 6029e06fe..482b2a7df 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -202,7 +202,7 @@ def query(self, languages, title, season=None, episode=None, year=None, video=No current_page = int(params['pg']) try: - sublist = soup.select('section.titlovi > ul.titlovi > li') + sublist = soup.select('section.titlovi > ul.titlovi > li.subtitleContainer.canEdit'') for sub in sublist: # subtitle id sid = sub.find(attrs={'data-id': True}).attrs['data-id'] From cbf03250f9906fafd0130709d278a4130ed66c41 Mon Sep 17 00:00:00 2001 From: viking1304 Date: Mon, 3 Dec 2018 05:03:07 +0100 Subject: [PATCH 346/710] Fix typo in code --- Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index 482b2a7df..8e2a31c65 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -202,7 +202,7 @@ def query(self, languages, title, season=None, episode=None, year=None, video=No current_page = int(params['pg']) try: - sublist = soup.select('section.titlovi > ul.titlovi > li.subtitleContainer.canEdit'') + sublist = soup.select('section.titlovi > ul.titlovi > li.subtitleContainer.canEdit') for sub in sublist: # subtitle id sid = sub.find(attrs={'data-id': True}).attrs['data-id'] From 557348831dc15dcba0738b011851094d32e520a1 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 7 Dec 2018 22:26:30 +0100 Subject: [PATCH 347/710] submod: HI: correctly remove uppercase at start of a sentence when lead by a crocodile (>>); correctly remove lowercase inside brackets when HI matched as well --- .../modification/mods/hearing_impaired.py | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py index 10dade9ee..367e63ae8 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py @@ -29,6 +29,22 @@ class HearingImpaired(SubtitleTextModification): FullBracketEntryProcessor(re.compile(ur'(?sux)^-?%(t)s[([].+(?=[^)\]]{3,}).+[)\]]%(t)s$' % {"t": TAG}), "", name="HI_brackets_full"), + # uppercase text before colon (at least 3 uppercase chars); at start or after a sentence, + # possibly with a dash in front; ignore anything ending with a quote + NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"\']))([\s\->~]*(?=[A-ZÀ-Ž&+]\s*[A-ZÀ-Ž&+]\s*[A-ZÀ-Ž&+])' + ur'[A-zÀ-ž-_0-9\s\"\'&+()\[\]]+:(?![\"\'’ʼ❜‘‛”“‟„])(?:\s+|$))(?![0-9])'), "", + name="HI_before_colon_caps"), + + # any text before colon (at least 3 chars); at start or after a sentence, + # possibly with a dash in front; try not breaking actual sentences with a colon at the end by not matching if + # a space is inside the text; ignore anything ending with a quote + NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"]))([\s\->~]*((?=[A-zÀ-ž&+]\s*[A-zÀ-ž&+]\s*[A-zÀ-ž&+])' + ur'[A-zÀ-ž-_0-9\s\"\'&+()\[\]]+:)(?![\"’ʼ❜‘‛”“‟„])\s*)(?![0-9])'), + lambda match: + match.group(1) if (match.group(2).count(" ") > 0 or match.group(1).count("-") > 0) + else "" if not match.group(1).startswith(" ") else " ", + name="HI_before_colon_noncaps"), + # brackets (only remove if at least 3 chars in brackets) NReProcessor(re.compile(ur'(?sux)-?%(t)s[([][^([)\]]+?(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+[)\]][\s:]*%(t)s' % {"t": TAG}), "", name="HI_brackets"), @@ -46,21 +62,6 @@ class HearingImpaired(SubtitleTextModification): #NReProcessor(re.compile(ur'(?u)(\b|^)([\s-]*(?=[A-zÀ-ž-_0-9"\']{3,})[A-zÀ-ž-_0-9"\']+:\s*)'), "", # name="HI_before_colon"), - # uppercase text before colon (at least 3 uppercase chars); at start or after a sentence, - # possibly with a dash in front; ignore anything ending with a quote - NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"\']))([\s-]*(?=[A-ZÀ-Ž&+]\s*[A-ZÀ-Ž&+]\s*[A-ZÀ-Ž&+])' - ur'[A-ZÀ-Ž-_0-9\s\"\'&+]+:(?![\"\'’ʼ❜‘‛”“‟„])(?:\s+|$))(?![0-9])'), "", - name="HI_before_colon_caps"), - - # any text before colon (at least 3 chars); at start or after a sentence, - # possibly with a dash in front; try not breaking actual sentences with a colon at the end by not matching if - # a space is inside the text; ignore anything ending with a quote - NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"]))([\s-]*((?=[A-zÀ-ž&+]\s*[A-zÀ-ž&+]\s*[A-zÀ-ž&+])' - ur'[A-zÀ-ž-_0-9\s\"\'&+]+:)(?![\"’ʼ❜‘‛”“‟„])\s*)(?![0-9])'), - lambda match: - match.group(1) if (match.group(2).count(" ") > 0 or match.group(1).count("-") > 0) - else "" if not match.group(1).startswith(" ") else " ", - name="HI_before_colon_noncaps"), # text in brackets at start, after optional dash, before colon or at end of line # fixme: may be too aggressive From c2781e834f21e57a741959829fdbd09469662054 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 8 Dec 2018 04:00:59 +0100 Subject: [PATCH 348/710] submod: HI: remove multiple HI_before_colon_caps before one colon --- .../Shared/subzero/modification/mods/hearing_impaired.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py index 367e63ae8..8912834d7 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py @@ -32,7 +32,7 @@ class HearingImpaired(SubtitleTextModification): # uppercase text before colon (at least 3 uppercase chars); at start or after a sentence, # possibly with a dash in front; ignore anything ending with a quote NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"\']))([\s\->~]*(?=[A-ZÀ-Ž&+]\s*[A-ZÀ-Ž&+]\s*[A-ZÀ-Ž&+])' - ur'[A-zÀ-ž-_0-9\s\"\'&+()\[\]]+:(?![\"\'’ʼ❜‘‛”“‟„])(?:\s+|$))(?![0-9])'), "", + ur'[A-zÀ-ž-_0-9\s\"\'&+()\[\],:]+:(?![\"\'’ʼ❜‘‛”“‟„])(?:\s+|$))(?![0-9])'), "", name="HI_before_colon_caps"), # any text before colon (at least 3 chars); at start or after a sentence, From 05e03b3ea4721e3232695cbab1849c20c71b33ae Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 8 Dec 2018 04:01:46 +0100 Subject: [PATCH 349/710] submod: common: also match music symbols after a crocodile; move crocodile removal up the chain --- .../Shared/subzero/modification/mods/common.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index b1d83c703..eba386b1d 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -28,13 +28,16 @@ class CommonFixes(SubtitleTextModification): NReProcessor(re.compile(r'(?u)(\w|\b|\s|^)(-\s?-{1,2})'), ur"\1—", name="CM_multidash"), # line = _/-/\s - NReProcessor(re.compile(r'(?u)(^\W*[-_.:]+\W*$)'), "", name="CM_non_word_only"), + NReProcessor(re.compile(r'(?u)(^\W*[-_.:>~]+\W*$)'), "", name="CM_non_word_only"), + + # remove >> + NReProcessor(re.compile(r'(?u)^\s?>>\s*'), "", name="CM_leading_crocodiles"), # line = : text NReProcessor(re.compile(r'(?u)(^\W*:\s*(?=\w+))'), "", name="CM_empty_colon_start"), # fix music symbols - NReProcessor(re.compile(ur'(?u)(^[-\s]*[*#¶]+\s*)|(\s*[*#¶]+\s*$)'), + NReProcessor(re.compile(ur'(?u)(^[-\s>~]*[*#¶]+\s*)|(\s*[*#¶]+\s*$)'), lambda x: u"♪ " if x.group(1) else u" ♪", name="CM_music_symbols"), @@ -85,9 +88,6 @@ class CommonFixes(SubtitleTextModification): # space before ending doublequote? - # remove >> - NReProcessor(re.compile(r'(?u)^\s?>>\s*'), "", name="CM_leading_crocodiles"), - # replace uppercase I with lowercase L in words NReProcessor(re.compile(ur'(?u)([a-zà-ž]+)(I+)'), lambda match: ur'%s%s' % (match.group(1), "l" * len(match.group(2))), From 8da007f4eb5404999810b2e4c833f7e50070cd83 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 8 Dec 2018 15:00:03 +0100 Subject: [PATCH 350/710] core: make logging for scanning/parsing/preparing videos more clear --- Contents/Code/support/scanning.py | 10 +++++----- Contents/Libraries/Shared/subliminal_patch/core.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Contents/Code/support/scanning.py b/Contents/Code/support/scanning.py index fee1c6517..b97dc2555 100644 --- a/Contents/Code/support/scanning.py +++ b/Contents/Code/support/scanning.py @@ -12,7 +12,7 @@ from subzero.language import language_from_stream, Language -def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, providers=None, skip_hashing=False): +def prepare_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, providers=None, skip_hashing=False): """ returnes a subliminal/guessit-refined parsed video :param pms_video_info: @@ -29,7 +29,7 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr if ignore_all: Log.Debug("Force refresh intended.") - Log.Debug("Scanning video: %s, external_subtitles=%s, embedded_subtitles=%s" % ( + Log.Debug("Detecting streams: %s, external_subtitles=%s, embedded_subtitles=%s" % ( plex_part.file, external_subtitles, embedded_subtitles)) known_embedded = [] @@ -154,9 +154,9 @@ def scan_videos(videos, ignore_all=False, providers=None, skip_hashing=False): hints = helpers.get_item_hints(video) video["plex_part"].fps = get_stream_fps(video["plex_part"].streams) p = providers or config.get_providers(media_type="series" if video["type"] == "episode" else "movies") - scanned_video = scan_video(video, ignore_all=force_refresh or ignore_all, hints=hints, - rating_key=video["id"], providers=p, - skip_hashing=skip_hashing) + scanned_video = prepare_video(video, ignore_all=force_refresh or ignore_all, hints=hints, + rating_key=video["id"], providers=p, + skip_hashing=skip_hashing) if not scanned_video: continue diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 3787b9fb3..9fe8587d9 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -493,7 +493,7 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski raise ValueError('%r is not a valid video extension' % os.path.splitext(path)[1]) dirpath, filename = os.path.split(path) - logger.info('Scanning video %r in %r', filename, dirpath) + logger.info('Determining basic video properties for %r in %r', filename, dirpath) # hint guessit the filename itself and its 2 parent directories if we're an episode (most likely # Series name/Season/filename), else only one From 25714acd3871d43ac4ad7026235b1bcdb900ad35 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 8 Dec 2018 15:00:45 +0100 Subject: [PATCH 351/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 40ae88a22..aaf21e938 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.4.2888 + 2.6.4.2901 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2888 DEV +Version 2.6.4.2901 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From d5da52d0fb3a9d99b406d288a3fcae3288901315 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 9 Dec 2018 16:45:18 +0100 Subject: [PATCH 352/710] providers: addic7ed: fix not using user credentials; fixes #605 --- .../subliminal_patch/providers/addic7ed.py | 53 ++++++++++--------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 269dd6aa9..51913d887 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -84,32 +84,35 @@ def initialize(self): # login if self.username and self.password: ccks = region.get("addic7ed_cookies", expiration_time=86400) - do_login = False if ccks != NO_VALUE: - self.session.cookies.update(ccks) - r = self.session.get(self.server_url + 'panel.php', allow_redirects=False, timeout=10) - if r.status_code == 302: - logger.info('Addic7ed: Login expired') - do_login = True - else: - logger.info('Addic7ed: Reusing old login') - self.logged_in = True - - if do_login: - logger.info('Addic7ed: Logging in') - data = {'username': self.username, 'password': self.password, 'Submit': 'Log in'} - r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10) - - if "relax, slow down" in r.content: - raise TooManyRequests(self.username) - - if r.status_code != 302: - raise AuthenticationError(self.username) - - region.set("addic7ed_cookies", r.cookies) - - logger.debug('Addic7ed: Logged in') - self.logged_in = True + try: + self.session.cookies._cookies.update(ccks) + r = self.session.get(self.server_url + 'panel.php', allow_redirects=False, timeout=10) + if r.status_code == 302: + logger.info('Addic7ed: Login expired') + region.delete("addic7ed_cookies") + else: + logger.info('Addic7ed: Reusing old login') + self.logged_in = True + return + except: + pass + + logger.info('Addic7ed: Logging in') + data = {'username': self.username, 'password': self.password, 'Submit': 'Log in'} + r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10, + headers={"Referer": self.server_url + "login.php"}) + + if "relax, slow down" in r.content: + raise TooManyRequests(self.username) + + if r.status_code != 302: + raise AuthenticationError(self.username) + + region.set("addic7ed_cookies", self.session.cookies._cookies) + + logger.debug('Addic7ed: Logged in') + self.logged_in = True @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME) From d03afb5d4787edaf5914a94a0d159f93b55c33ce Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 9 Dec 2018 16:56:45 +0100 Subject: [PATCH 353/710] core: add inflect==2.1.0 --- Contents/Libraries/Shared/inflect.py | 3801 ++++++++++++++++++++++++++ Licenses/inflect/LICENSE | 7 + 2 files changed, 3808 insertions(+) create mode 100644 Contents/Libraries/Shared/inflect.py create mode 100644 Licenses/inflect/LICENSE diff --git a/Contents/Libraries/Shared/inflect.py b/Contents/Libraries/Shared/inflect.py new file mode 100644 index 000000000..be61aa341 --- /dev/null +++ b/Contents/Libraries/Shared/inflect.py @@ -0,0 +1,3801 @@ +""" + inflect.py: correctly generate plurals, ordinals, indefinite articles; + convert numbers to words + Copyright (C) 2010 Paul Dyson + + Based upon the Perl module Lingua::EN::Inflect by Damian Conway. + + The original Perl module Lingua::EN::Inflect by Damian Conway is + available from http://search.cpan.org/~dconway/ + + This module can be downloaded at http://pypi.org/project/inflect + +methods: + classical inflect + plural plural_noun plural_verb plural_adj singular_noun no num a an + compare compare_nouns compare_verbs compare_adjs + present_participle + ordinal + number_to_words + join + defnoun defverb defadj defa defan + + INFLECTIONS: classical inflect + plural plural_noun plural_verb plural_adj singular_noun compare + no num a an present_participle + + PLURALS: classical inflect + plural plural_noun plural_verb plural_adj singular_noun no num + compare compare_nouns compare_verbs compare_adjs + + COMPARISONS: classical + compare compare_nouns compare_verbs compare_adjs + + ARTICLES: classical inflect num a an + + NUMERICAL: ordinal number_to_words + + USER_DEFINED: defnoun defverb defadj defa defan + +Exceptions: + UnknownClassicalModeError + BadNumValueError + BadChunkingOptionError + NumOutOfRangeError + BadUserDefinedPatternError + BadRcFileError + BadGenderError + +""" + +from __future__ import unicode_literals + +import ast +import sys +import re + + +class UnknownClassicalModeError(Exception): + pass + + +class BadNumValueError(Exception): + pass + + +class BadChunkingOptionError(Exception): + pass + + +class NumOutOfRangeError(Exception): + pass + + +class BadUserDefinedPatternError(Exception): + pass + + +class BadRcFileError(Exception): + pass + + +class BadGenderError(Exception): + pass + + +__version__ = "2.1.0" + + +STDOUT_ON = False + + +def print3(txt): + if STDOUT_ON: + print(txt) + + +def enclose(s): + return "(?:%s)" % s + + +def joinstem(cutpoint=0, words=""): + """ + join stem of each word in words into a string for regex + each word is truncated at cutpoint + cutpoint is usually negative indicating the number of letters to remove + from the end of each word + + e.g. + joinstem(-2, ["ephemeris", "iris", ".*itis"]) returns + (?:ephemer|ir|.*it) + + """ + return enclose("|".join(w[:cutpoint] for w in words)) + + +def bysize(words): + """ + take a list of words and return a dict of sets sorted by word length + e.g. + ret[3]=set(['ant', 'cat', 'dog', 'pig']) + ret[4]=set(['frog', 'goat']) + ret[5]=set(['horse']) + ret[8]=set(['elephant']) + """ + ret = {} + for w in words: + if len(w) not in ret: + ret[len(w)] = set() + ret[len(w)].add(w) + return ret + + +def make_pl_si_lists(lst, plending, siendingsize, dojoinstem=True): + """ + given a list of singular words: lst + an ending to append to make the plural: plending + the number of characters to remove from the singular + before appending plending: siendingsize + a flag whether to create a joinstem: dojoinstem + + return: + a list of pluralised words: si_list (called si because this is what you need to + look for to make the singular) + the pluralised words as a dict of sets sorted by word length: si_bysize + the singular words as a dict of sets sorted by word length: pl_bysize + if dojoinstem is True: a regular expression that matches any of the stems: stem + """ + if siendingsize is not None: + siendingsize = -siendingsize + si_list = [w[:siendingsize] + plending for w in lst] + pl_bysize = bysize(lst) + si_bysize = bysize(si_list) + if dojoinstem: + stem = joinstem(siendingsize, lst) + return si_list, si_bysize, pl_bysize, stem + else: + return si_list, si_bysize, pl_bysize + + +# 1. PLURALS + +pl_sb_irregular_s = { + "corpus": "corpuses|corpora", + "opus": "opuses|opera", + "genus": "genera", + "mythos": "mythoi", + "penis": "penises|penes", + "testis": "testes", + "atlas": "atlases|atlantes", + "yes": "yeses", +} + +pl_sb_irregular = { + "child": "children", + "brother": "brothers|brethren", + "loaf": "loaves", + "hoof": "hoofs|hooves", + "beef": "beefs|beeves", + "thief": "thiefs|thieves", + "money": "monies", + "mongoose": "mongooses", + "ox": "oxen", + "cow": "cows|kine", + "graffito": "graffiti", + "octopus": "octopuses|octopodes", + "genie": "genies|genii", + "ganglion": "ganglions|ganglia", + "trilby": "trilbys", + "turf": "turfs|turves", + "numen": "numina", + "atman": "atmas", + "occiput": "occiputs|occipita", + "sabretooth": "sabretooths", + "sabertooth": "sabertooths", + "lowlife": "lowlifes", + "flatfoot": "flatfoots", + "tenderfoot": "tenderfoots", + "romany": "romanies", + "jerry": "jerries", + "mary": "maries", + "talouse": "talouses", + "blouse": "blouses", + "rom": "roma", + "carmen": "carmina", +} + +pl_sb_irregular.update(pl_sb_irregular_s) +# pl_sb_irregular_keys = enclose('|'.join(pl_sb_irregular.keys())) + +pl_sb_irregular_caps = { + "Romany": "Romanies", + "Jerry": "Jerrys", + "Mary": "Marys", + "Rom": "Roma", +} + +pl_sb_irregular_compound = {"prima donna": "prima donnas|prime donne"} + +si_sb_irregular = {v: k for (k, v) in pl_sb_irregular.items()} +keys = list(si_sb_irregular.keys()) +for k in keys: + if "|" in k: + k1, k2 = k.split("|") + si_sb_irregular[k1] = si_sb_irregular[k2] = si_sb_irregular[k] + del si_sb_irregular[k] +si_sb_irregular_caps = {v: k for (k, v) in pl_sb_irregular_caps.items()} +si_sb_irregular_compound = {v: k for (k, v) in pl_sb_irregular_compound.items()} +keys = list(si_sb_irregular_compound.keys()) +for k in keys: + if "|" in k: + k1, k2 = k.split("|") + si_sb_irregular_compound[k1] = si_sb_irregular_compound[ + k2 + ] = si_sb_irregular_compound[k] + del si_sb_irregular_compound[k] + +# si_sb_irregular_keys = enclose('|'.join(si_sb_irregular.keys())) + +# Z's that don't double + +pl_sb_z_zes_list = ("quartz", "topaz") +pl_sb_z_zes_bysize = bysize(pl_sb_z_zes_list) + +pl_sb_ze_zes_list = ("snooze",) +pl_sb_ze_zes_bysize = bysize(pl_sb_ze_zes_list) + + +# CLASSICAL "..is" -> "..ides" + +pl_sb_C_is_ides_complete = [ + # GENERAL WORDS... + "ephemeris", + "iris", + "clitoris", + "chrysalis", + "epididymis", +] + +pl_sb_C_is_ides_endings = [ + # INFLAMATIONS... + "itis" +] + +pl_sb_C_is_ides = joinstem( + -2, pl_sb_C_is_ides_complete + [".*%s" % w for w in pl_sb_C_is_ides_endings] +) + +pl_sb_C_is_ides_list = pl_sb_C_is_ides_complete + pl_sb_C_is_ides_endings + +( + si_sb_C_is_ides_list, + si_sb_C_is_ides_bysize, + pl_sb_C_is_ides_bysize, +) = make_pl_si_lists(pl_sb_C_is_ides_list, "ides", 2, dojoinstem=False) + + +# CLASSICAL "..a" -> "..ata" + +pl_sb_C_a_ata_list = ( + "anathema", + "bema", + "carcinoma", + "charisma", + "diploma", + "dogma", + "drama", + "edema", + "enema", + "enigma", + "lemma", + "lymphoma", + "magma", + "melisma", + "miasma", + "oedema", + "sarcoma", + "schema", + "soma", + "stigma", + "stoma", + "trauma", + "gumma", + "pragma", +) + +( + si_sb_C_a_ata_list, + si_sb_C_a_ata_bysize, + pl_sb_C_a_ata_bysize, + pl_sb_C_a_ata, +) = make_pl_si_lists(pl_sb_C_a_ata_list, "ata", 1) + +# UNCONDITIONAL "..a" -> "..ae" + +pl_sb_U_a_ae_list = ("alumna", "alga", "vertebra", "persona") +( + si_sb_U_a_ae_list, + si_sb_U_a_ae_bysize, + pl_sb_U_a_ae_bysize, + pl_sb_U_a_ae, +) = make_pl_si_lists(pl_sb_U_a_ae_list, "e", None) + +# CLASSICAL "..a" -> "..ae" + +pl_sb_C_a_ae_list = ( + "amoeba", + "antenna", + "formula", + "hyperbola", + "medusa", + "nebula", + "parabola", + "abscissa", + "hydra", + "nova", + "lacuna", + "aurora", + "umbra", + "flora", + "fauna", +) +( + si_sb_C_a_ae_list, + si_sb_C_a_ae_bysize, + pl_sb_C_a_ae_bysize, + pl_sb_C_a_ae, +) = make_pl_si_lists(pl_sb_C_a_ae_list, "e", None) + + +# CLASSICAL "..en" -> "..ina" + +pl_sb_C_en_ina_list = ("stamen", "foramen", "lumen") + +( + si_sb_C_en_ina_list, + si_sb_C_en_ina_bysize, + pl_sb_C_en_ina_bysize, + pl_sb_C_en_ina, +) = make_pl_si_lists(pl_sb_C_en_ina_list, "ina", 2) + + +# UNCONDITIONAL "..um" -> "..a" + +pl_sb_U_um_a_list = ( + "bacterium", + "agendum", + "desideratum", + "erratum", + "stratum", + "datum", + "ovum", + "extremum", + "candelabrum", +) +( + si_sb_U_um_a_list, + si_sb_U_um_a_bysize, + pl_sb_U_um_a_bysize, + pl_sb_U_um_a, +) = make_pl_si_lists(pl_sb_U_um_a_list, "a", 2) + +# CLASSICAL "..um" -> "..a" + +pl_sb_C_um_a_list = ( + "maximum", + "minimum", + "momentum", + "optimum", + "quantum", + "cranium", + "curriculum", + "dictum", + "phylum", + "aquarium", + "compendium", + "emporium", + "enconium", + "gymnasium", + "honorarium", + "interregnum", + "lustrum", + "memorandum", + "millennium", + "rostrum", + "spectrum", + "speculum", + "stadium", + "trapezium", + "ultimatum", + "medium", + "vacuum", + "velum", + "consortium", + "arboretum", +) + +( + si_sb_C_um_a_list, + si_sb_C_um_a_bysize, + pl_sb_C_um_a_bysize, + pl_sb_C_um_a, +) = make_pl_si_lists(pl_sb_C_um_a_list, "a", 2) + + +# UNCONDITIONAL "..us" -> "i" + +pl_sb_U_us_i_list = ( + "alumnus", + "alveolus", + "bacillus", + "bronchus", + "locus", + "nucleus", + "stimulus", + "meniscus", + "sarcophagus", +) +( + si_sb_U_us_i_list, + si_sb_U_us_i_bysize, + pl_sb_U_us_i_bysize, + pl_sb_U_us_i, +) = make_pl_si_lists(pl_sb_U_us_i_list, "i", 2) + +# CLASSICAL "..us" -> "..i" + +pl_sb_C_us_i_list = ( + "focus", + "radius", + "genius", + "incubus", + "succubus", + "nimbus", + "fungus", + "nucleolus", + "stylus", + "torus", + "umbilicus", + "uterus", + "hippopotamus", + "cactus", +) + +( + si_sb_C_us_i_list, + si_sb_C_us_i_bysize, + pl_sb_C_us_i_bysize, + pl_sb_C_us_i, +) = make_pl_si_lists(pl_sb_C_us_i_list, "i", 2) + + +# CLASSICAL "..us" -> "..us" (ASSIMILATED 4TH DECLENSION LATIN NOUNS) + +pl_sb_C_us_us = ( + "status", + "apparatus", + "prospectus", + "sinus", + "hiatus", + "impetus", + "plexus", +) +pl_sb_C_us_us_bysize = bysize(pl_sb_C_us_us) + +# UNCONDITIONAL "..on" -> "a" + +pl_sb_U_on_a_list = ( + "criterion", + "perihelion", + "aphelion", + "phenomenon", + "prolegomenon", + "noumenon", + "organon", + "asyndeton", + "hyperbaton", +) +( + si_sb_U_on_a_list, + si_sb_U_on_a_bysize, + pl_sb_U_on_a_bysize, + pl_sb_U_on_a, +) = make_pl_si_lists(pl_sb_U_on_a_list, "a", 2) + +# CLASSICAL "..on" -> "..a" + +pl_sb_C_on_a_list = ("oxymoron",) + +( + si_sb_C_on_a_list, + si_sb_C_on_a_bysize, + pl_sb_C_on_a_bysize, + pl_sb_C_on_a, +) = make_pl_si_lists(pl_sb_C_on_a_list, "a", 2) + + +# CLASSICAL "..o" -> "..i" (BUT NORMALLY -> "..os") + +pl_sb_C_o_i = [ + "solo", + "soprano", + "basso", + "alto", + "contralto", + "tempo", + "piano", + "virtuoso", +] # list not tuple so can concat for pl_sb_U_o_os + +pl_sb_C_o_i_bysize = bysize(pl_sb_C_o_i) +si_sb_C_o_i_bysize = bysize(["%si" % w[:-1] for w in pl_sb_C_o_i]) + +pl_sb_C_o_i_stems = joinstem(-1, pl_sb_C_o_i) + +# ALWAYS "..o" -> "..os" + +pl_sb_U_o_os_complete = {"ado", "ISO", "NATO", "NCO", "NGO", "oto"} +si_sb_U_o_os_complete = {"%ss" % w for w in pl_sb_U_o_os_complete} + + +pl_sb_U_o_os_endings = [ + "aficionado", + "aggro", + "albino", + "allegro", + "ammo", + "Antananarivo", + "archipelago", + "armadillo", + "auto", + "avocado", + "Bamako", + "Barquisimeto", + "bimbo", + "bingo", + "Biro", + "bolero", + "Bolzano", + "bongo", + "Boto", + "burro", + "Cairo", + "canto", + "cappuccino", + "casino", + "cello", + "Chicago", + "Chimango", + "cilantro", + "cochito", + "coco", + "Colombo", + "Colorado", + "commando", + "concertino", + "contango", + "credo", + "crescendo", + "cyano", + "demo", + "ditto", + "Draco", + "dynamo", + "embryo", + "Esperanto", + "espresso", + "euro", + "falsetto", + "Faro", + "fiasco", + "Filipino", + "flamenco", + "furioso", + "generalissimo", + "Gestapo", + "ghetto", + "gigolo", + "gizmo", + "Greensboro", + "gringo", + "Guaiabero", + "guano", + "gumbo", + "gyro", + "hairdo", + "hippo", + "Idaho", + "impetigo", + "inferno", + "info", + "intermezzo", + "intertrigo", + "Iquico", + "jumbo", + "junto", + "Kakapo", + "kilo", + "Kinkimavo", + "Kokako", + "Kosovo", + "Lesotho", + "libero", + "libido", + "libretto", + "lido", + "Lilo", + "limbo", + "limo", + "lineno", + "lingo", + "lino", + "livedo", + "loco", + "logo", + "lumbago", + "macho", + "macro", + "mafioso", + "magneto", + "magnifico", + "Majuro", + "Malabo", + "manifesto", + "Maputo", + "Maracaibo", + "medico", + "memo", + "metro", + "Mexico", + "micro", + "Milano", + "Monaco", + "mono", + "Montenegro", + "Morocco", + "Muqdisho", + "myo", + "neutrino", + "Ningbo", + "octavo", + "oregano", + "Orinoco", + "Orlando", + "Oslo", + "panto", + "Paramaribo", + "Pardusco", + "pedalo", + "photo", + "pimento", + "pinto", + "pleco", + "Pluto", + "pogo", + "polo", + "poncho", + "Porto-Novo", + "Porto", + "pro", + "psycho", + "pueblo", + "quarto", + "Quito", + "rhino", + "risotto", + "rococo", + "rondo", + "Sacramento", + "saddo", + "sago", + "salvo", + "Santiago", + "Sapporo", + "Sarajevo", + "scherzando", + "scherzo", + "silo", + "sirocco", + "sombrero", + "staccato", + "sterno", + "stucco", + "stylo", + "sumo", + "Taiko", + "techno", + "terrazzo", + "testudo", + "timpano", + "tiro", + "tobacco", + "Togo", + "Tokyo", + "torero", + "Torino", + "Toronto", + "torso", + "tremolo", + "typo", + "tyro", + "ufo", + "UNESCO", + "vaquero", + "vermicello", + "verso", + "vibrato", + "violoncello", + "Virgo", + "weirdo", + "WHO", + "WTO", + "Yamoussoukro", + "yo-yo", + "zero", + "Zibo", +] + pl_sb_C_o_i + +pl_sb_U_o_os_bysize = bysize(pl_sb_U_o_os_endings) +si_sb_U_o_os_bysize = bysize(["%ss" % w for w in pl_sb_U_o_os_endings]) + + +# UNCONDITIONAL "..ch" -> "..chs" + +pl_sb_U_ch_chs_list = ("czech", "eunuch", "stomach") + +( + si_sb_U_ch_chs_list, + si_sb_U_ch_chs_bysize, + pl_sb_U_ch_chs_bysize, + pl_sb_U_ch_chs, +) = make_pl_si_lists(pl_sb_U_ch_chs_list, "s", None) + + +# UNCONDITIONAL "..[ei]x" -> "..ices" + +pl_sb_U_ex_ices_list = ("codex", "murex", "silex") +( + si_sb_U_ex_ices_list, + si_sb_U_ex_ices_bysize, + pl_sb_U_ex_ices_bysize, + pl_sb_U_ex_ices, +) = make_pl_si_lists(pl_sb_U_ex_ices_list, "ices", 2) + +pl_sb_U_ix_ices_list = ("radix", "helix") +( + si_sb_U_ix_ices_list, + si_sb_U_ix_ices_bysize, + pl_sb_U_ix_ices_bysize, + pl_sb_U_ix_ices, +) = make_pl_si_lists(pl_sb_U_ix_ices_list, "ices", 2) + +# CLASSICAL "..[ei]x" -> "..ices" + +pl_sb_C_ex_ices_list = ( + "vortex", + "vertex", + "cortex", + "latex", + "pontifex", + "apex", + "index", + "simplex", +) + +( + si_sb_C_ex_ices_list, + si_sb_C_ex_ices_bysize, + pl_sb_C_ex_ices_bysize, + pl_sb_C_ex_ices, +) = make_pl_si_lists(pl_sb_C_ex_ices_list, "ices", 2) + + +pl_sb_C_ix_ices_list = ("appendix",) + +( + si_sb_C_ix_ices_list, + si_sb_C_ix_ices_bysize, + pl_sb_C_ix_ices_bysize, + pl_sb_C_ix_ices, +) = make_pl_si_lists(pl_sb_C_ix_ices_list, "ices", 2) + + +# ARABIC: ".." -> "..i" + +pl_sb_C_i_list = ("afrit", "afreet", "efreet") + +(si_sb_C_i_list, si_sb_C_i_bysize, pl_sb_C_i_bysize, pl_sb_C_i) = make_pl_si_lists( + pl_sb_C_i_list, "i", None +) + + +# HEBREW: ".." -> "..im" + +pl_sb_C_im_list = ("goy", "seraph", "cherub") + +(si_sb_C_im_list, si_sb_C_im_bysize, pl_sb_C_im_bysize, pl_sb_C_im) = make_pl_si_lists( + pl_sb_C_im_list, "im", None +) + + +# UNCONDITIONAL "..man" -> "..mans" + +pl_sb_U_man_mans_list = """ + ataman caiman cayman ceriman + desman dolman farman harman hetman + human leman ottoman shaman talisman +""".split() +pl_sb_U_man_mans_caps_list = """ + Alabaman Bahaman Burman German + Hiroshiman Liman Nakayaman Norman Oklahoman + Panaman Roman Selman Sonaman Tacoman Yakiman + Yokohaman Yuman +""".split() + +( + si_sb_U_man_mans_list, + si_sb_U_man_mans_bysize, + pl_sb_U_man_mans_bysize, +) = make_pl_si_lists(pl_sb_U_man_mans_list, "s", None, dojoinstem=False) +( + si_sb_U_man_mans_caps_list, + si_sb_U_man_mans_caps_bysize, + pl_sb_U_man_mans_caps_bysize, +) = make_pl_si_lists(pl_sb_U_man_mans_caps_list, "s", None, dojoinstem=False) + + +pl_sb_uninflected_s_complete = [ + # PAIRS OR GROUPS SUBSUMED TO A SINGULAR... + "breeches", + "britches", + "pajamas", + "pyjamas", + "clippers", + "gallows", + "hijinks", + "headquarters", + "pliers", + "scissors", + "testes", + "herpes", + "pincers", + "shears", + "proceedings", + "trousers", + # UNASSIMILATED LATIN 4th DECLENSION + "cantus", + "coitus", + "nexus", + # RECENT IMPORTS... + "contretemps", + "corps", + "debris", + "siemens", + # DISEASES + "mumps", + # MISCELLANEOUS OTHERS... + "diabetes", + "jackanapes", + "series", + "species", + "subspecies", + "rabies", + "chassis", + "innings", + "news", + "mews", + "haggis", +] + +pl_sb_uninflected_s_endings = [ + # RECENT IMPORTS... + "ois", + # DISEASES + "measles", +] + +pl_sb_uninflected_s = pl_sb_uninflected_s_complete + [ + ".*%s" % w for w in pl_sb_uninflected_s_endings +] + +pl_sb_uninflected_herd = ( + # DON'T INFLECT IN CLASSICAL MODE, OTHERWISE NORMAL INFLECTION + "wildebeest", + "swine", + "eland", + "bison", + "buffalo", + "elk", + "rhinoceros", + "zucchini", + "caribou", + "dace", + "grouse", + "guinea fowl", + "guinea-fowl", + "haddock", + "hake", + "halibut", + "herring", + "mackerel", + "pickerel", + "pike", + "roe", + "seed", + "shad", + "snipe", + "teal", + "turbot", + "water fowl", + "water-fowl", +) + +pl_sb_uninflected_complete = [ + # SOME FISH AND HERD ANIMALS + "tuna", + "salmon", + "mackerel", + "trout", + "bream", + "sea-bass", + "sea bass", + "carp", + "cod", + "flounder", + "whiting", + "moose", + # OTHER ODDITIES + "graffiti", + "djinn", + "samuri", + "offspring", + "pence", + "quid", + "hertz", +] + pl_sb_uninflected_s_complete +# SOME WORDS ENDING IN ...s (OFTEN PAIRS TAKEN AS A WHOLE) + +pl_sb_uninflected_caps = [ + # ALL NATIONALS ENDING IN -ese + "Portuguese", + "Amoyese", + "Borghese", + "Congoese", + "Faroese", + "Foochowese", + "Genevese", + "Genoese", + "Gilbertese", + "Hottentotese", + "Kiplingese", + "Kongoese", + "Lucchese", + "Maltese", + "Nankingese", + "Niasese", + "Pekingese", + "Piedmontese", + "Pistoiese", + "Sarawakese", + "Shavese", + "Vermontese", + "Wenchowese", + "Yengeese", +] + + +pl_sb_uninflected_endings = [ + # SOME FISH AND HERD ANIMALS + "fish", + "deer", + "sheep", + # ALL NATIONALS ENDING IN -ese + "nese", + "rese", + "lese", + "mese", + # DISEASES + "pox", + # OTHER ODDITIES + "craft", +] + pl_sb_uninflected_s_endings +# SOME WORDS ENDING IN ...s (OFTEN PAIRS TAKEN AS A WHOLE) + + +pl_sb_uninflected_bysize = bysize(pl_sb_uninflected_endings) + + +# SINGULAR WORDS ENDING IN ...s (ALL INFLECT WITH ...es) + +pl_sb_singular_s_complete = [ + "acropolis", + "aegis", + "alias", + "asbestos", + "bathos", + "bias", + "bronchitis", + "bursitis", + "caddis", + "cannabis", + "canvas", + "chaos", + "cosmos", + "dais", + "digitalis", + "epidermis", + "ethos", + "eyas", + "gas", + "glottis", + "hubris", + "ibis", + "lens", + "mantis", + "marquis", + "metropolis", + "pathos", + "pelvis", + "polis", + "rhinoceros", + "sassafras", + "trellis", +] + pl_sb_C_is_ides_complete + + +pl_sb_singular_s_endings = ["ss", "us"] + pl_sb_C_is_ides_endings + +pl_sb_singular_s_bysize = bysize(pl_sb_singular_s_endings) + +si_sb_singular_s_complete = ["%ses" % w for w in pl_sb_singular_s_complete] +si_sb_singular_s_endings = ["%ses" % w for w in pl_sb_singular_s_endings] +si_sb_singular_s_bysize = bysize(si_sb_singular_s_endings) + +pl_sb_singular_s_es = ["[A-Z].*es"] + +pl_sb_singular_s = enclose( + "|".join( + pl_sb_singular_s_complete + + [".*%s" % w for w in pl_sb_singular_s_endings] + + pl_sb_singular_s_es + ) +) + + +# PLURALS ENDING IN uses -> use + + +si_sb_ois_oi_case = ("Bolshois", "Hanois") + +si_sb_uses_use_case = ("Betelgeuses", "Duses", "Meuses", "Syracuses", "Toulouses") + +si_sb_uses_use = ( + "abuses", + "applauses", + "blouses", + "carouses", + "causes", + "chartreuses", + "clauses", + "contuses", + "douses", + "excuses", + "fuses", + "grouses", + "hypotenuses", + "masseuses", + "menopauses", + "misuses", + "muses", + "overuses", + "pauses", + "peruses", + "profuses", + "recluses", + "reuses", + "ruses", + "souses", + "spouses", + "suffuses", + "transfuses", + "uses", +) + +si_sb_ies_ie_case = ( + "Addies", + "Aggies", + "Allies", + "Amies", + "Angies", + "Annies", + "Annmaries", + "Archies", + "Arties", + "Aussies", + "Barbies", + "Barries", + "Basies", + "Bennies", + "Bernies", + "Berties", + "Bessies", + "Betties", + "Billies", + "Blondies", + "Bobbies", + "Bonnies", + "Bowies", + "Brandies", + "Bries", + "Brownies", + "Callies", + "Carnegies", + "Carries", + "Cassies", + "Charlies", + "Cheries", + "Christies", + "Connies", + "Curies", + "Dannies", + "Debbies", + "Dixies", + "Dollies", + "Donnies", + "Drambuies", + "Eddies", + "Effies", + "Ellies", + "Elsies", + "Eries", + "Ernies", + "Essies", + "Eugenies", + "Fannies", + "Flossies", + "Frankies", + "Freddies", + "Gillespies", + "Goldies", + "Gracies", + "Guthries", + "Hallies", + "Hatties", + "Hetties", + "Hollies", + "Jackies", + "Jamies", + "Janies", + "Jannies", + "Jeanies", + "Jeannies", + "Jennies", + "Jessies", + "Jimmies", + "Jodies", + "Johnies", + "Johnnies", + "Josies", + "Julies", + "Kalgoorlies", + "Kathies", + "Katies", + "Kellies", + "Kewpies", + "Kristies", + "Laramies", + "Lassies", + "Lauries", + "Leslies", + "Lessies", + "Lillies", + "Lizzies", + "Lonnies", + "Lories", + "Lorries", + "Lotties", + "Louies", + "Mackenzies", + "Maggies", + "Maisies", + "Mamies", + "Marcies", + "Margies", + "Maries", + "Marjories", + "Matties", + "McKenzies", + "Melanies", + "Mickies", + "Millies", + "Minnies", + "Mollies", + "Mounties", + "Nannies", + "Natalies", + "Nellies", + "Netties", + "Ollies", + "Ozzies", + "Pearlies", + "Pottawatomies", + "Reggies", + "Richies", + "Rickies", + "Robbies", + "Ronnies", + "Rosalies", + "Rosemaries", + "Rosies", + "Roxies", + "Rushdies", + "Ruthies", + "Sadies", + "Sallies", + "Sammies", + "Scotties", + "Selassies", + "Sherries", + "Sophies", + "Stacies", + "Stefanies", + "Stephanies", + "Stevies", + "Susies", + "Sylvies", + "Tammies", + "Terries", + "Tessies", + "Tommies", + "Tracies", + "Trekkies", + "Valaries", + "Valeries", + "Valkyries", + "Vickies", + "Virgies", + "Willies", + "Winnies", + "Wylies", + "Yorkies", +) + +si_sb_ies_ie = ( + "aeries", + "baggies", + "belies", + "biggies", + "birdies", + "bogies", + "bonnies", + "boogies", + "bookies", + "bourgeoisies", + "brownies", + "budgies", + "caddies", + "calories", + "camaraderies", + "cockamamies", + "collies", + "cookies", + "coolies", + "cooties", + "coteries", + "crappies", + "curies", + "cutesies", + "dogies", + "eyrie", + "floozies", + "footsies", + "freebies", + "genies", + "goalies", + "groupies", + "hies", + "jalousies", + "junkies", + "kiddies", + "laddies", + "lassies", + "lies", + "lingeries", + "magpies", + "menageries", + "mommies", + "movies", + "neckties", + "newbies", + "nighties", + "oldies", + "organdies", + "overlies", + "pies", + "pinkies", + "pixies", + "potpies", + "prairies", + "quickies", + "reveries", + "rookies", + "rotisseries", + "softies", + "sorties", + "species", + "stymies", + "sweeties", + "ties", + "underlies", + "unties", + "veggies", + "vies", + "yuppies", + "zombies", +) + + +si_sb_oes_oe_case = ( + "Chloes", + "Crusoes", + "Defoes", + "Faeroes", + "Ivanhoes", + "Joes", + "McEnroes", + "Moes", + "Monroes", + "Noes", + "Poes", + "Roscoes", + "Tahoes", + "Tippecanoes", + "Zoes", +) + +si_sb_oes_oe = ( + "aloes", + "backhoes", + "canoes", + "does", + "floes", + "foes", + "hoes", + "mistletoes", + "oboes", + "pekoes", + "roes", + "sloes", + "throes", + "tiptoes", + "toes", + "woes", +) + +si_sb_z_zes = ("quartzes", "topazes") + +si_sb_zzes_zz = ("buzzes", "fizzes", "frizzes", "razzes") + +si_sb_ches_che_case = ( + "Andromaches", + "Apaches", + "Blanches", + "Comanches", + "Nietzsches", + "Porsches", + "Roches", +) + +si_sb_ches_che = ( + "aches", + "avalanches", + "backaches", + "bellyaches", + "caches", + "cloches", + "creches", + "douches", + "earaches", + "fiches", + "headaches", + "heartaches", + "microfiches", + "niches", + "pastiches", + "psyches", + "quiches", + "stomachaches", + "toothaches", +) + +si_sb_xes_xe = ("annexes", "axes", "deluxes", "pickaxes") + +si_sb_sses_sse_case = ("Hesses", "Jesses", "Larousses", "Matisses") +si_sb_sses_sse = ( + "bouillabaisses", + "crevasses", + "demitasses", + "impasses", + "mousses", + "posses", +) + +si_sb_ves_ve_case = ( + # *[nwl]ives -> [nwl]live + "Clives", + "Palmolives", +) +si_sb_ves_ve = ( + # *[^d]eaves -> eave + "interweaves", + "weaves", + # *[nwl]ives -> [nwl]live + "olives", + # *[eoa]lves -> [eoa]lve + "bivalves", + "dissolves", + "resolves", + "salves", + "twelves", + "valves", +) + + +plverb_special_s = enclose( + "|".join( + [pl_sb_singular_s] + + pl_sb_uninflected_s + + list(pl_sb_irregular_s.keys()) + + ["(.*[csx])is", "(.*)ceps", "[A-Z].*s"] + ) +) + +pl_sb_postfix_adj = { + "general": [r"(?!major|lieutenant|brigadier|adjutant|.*star)\S+"], + "martial": ["court"], + "force": ["pound"], +} + +for k in list(pl_sb_postfix_adj.keys()): + pl_sb_postfix_adj[k] = enclose( + enclose("|".join(pl_sb_postfix_adj[k])) + "(?=(?:-|\\s+)%s)" % k + ) + +pl_sb_postfix_adj_stems = "(" + "|".join(list(pl_sb_postfix_adj.values())) + ")(.*)" + + +# PLURAL WORDS ENDING IS es GO TO SINGULAR is + +si_sb_es_is = ( + "amanuenses", + "amniocenteses", + "analyses", + "antitheses", + "apotheoses", + "arterioscleroses", + "atheroscleroses", + "axes", + # 'bases', # bases -> basis + "catalyses", + "catharses", + "chasses", + "cirrhoses", + "cocces", + "crises", + "diagnoses", + "dialyses", + "diereses", + "electrolyses", + "emphases", + "exegeses", + "geneses", + "halitoses", + "hydrolyses", + "hypnoses", + "hypotheses", + "hystereses", + "metamorphoses", + "metastases", + "misdiagnoses", + "mitoses", + "mononucleoses", + "narcoses", + "necroses", + "nemeses", + "neuroses", + "oases", + "osmoses", + "osteoporoses", + "paralyses", + "parentheses", + "parthenogeneses", + "periphrases", + "photosyntheses", + "probosces", + "prognoses", + "prophylaxes", + "prostheses", + "preces", + "psoriases", + "psychoanalyses", + "psychokineses", + "psychoses", + "scleroses", + "scolioses", + "sepses", + "silicoses", + "symbioses", + "synopses", + "syntheses", + "taxes", + "telekineses", + "theses", + "thromboses", + "tuberculoses", + "urinalyses", +) + +pl_prep_list = """ + about above across after among around at athwart before behind + below beneath beside besides between betwixt beyond but by + during except for from in into near of off on onto out over + since till to under until unto upon with""".split() + +pl_prep_list_da = pl_prep_list + ["de", "du", "da"] + +pl_prep_bysize = bysize(pl_prep_list_da) + +pl_prep = enclose("|".join(pl_prep_list_da)) + +pl_sb_prep_dual_compound = ( + r"(.*?)((?:-|\s+)(?:" + pl_prep + r")(?:-|\s+))a(?:-|\s+)(.*)" +) + + +singular_pronoun_genders = { + "neuter", + "feminine", + "masculine", + "gender-neutral", + "feminine or masculine", + "masculine or feminine", +} + +pl_pron_nom = { + # NOMINATIVE REFLEXIVE + "i": "we", + "myself": "ourselves", + "you": "you", + "yourself": "yourselves", + "she": "they", + "herself": "themselves", + "he": "they", + "himself": "themselves", + "it": "they", + "itself": "themselves", + "they": "they", + "themself": "themselves", + # POSSESSIVE + "mine": "ours", + "yours": "yours", + "hers": "theirs", + "his": "theirs", + "its": "theirs", + "theirs": "theirs", +} + +si_pron = {} +si_pron["nom"] = {v: k for (k, v) in pl_pron_nom.items()} +si_pron["nom"]["we"] = "I" + + +pl_pron_acc = { + # ACCUSATIVE REFLEXIVE + "me": "us", + "myself": "ourselves", + "you": "you", + "yourself": "yourselves", + "her": "them", + "herself": "themselves", + "him": "them", + "himself": "themselves", + "it": "them", + "itself": "themselves", + "them": "them", + "themself": "themselves", +} + +pl_pron_acc_keys = enclose("|".join(list(pl_pron_acc.keys()))) +pl_pron_acc_keys_bysize = bysize(list(pl_pron_acc.keys())) + +si_pron["acc"] = {v: k for (k, v) in pl_pron_acc.items()} + +for thecase, plur, gend, sing in ( + ("nom", "they", "neuter", "it"), + ("nom", "they", "feminine", "she"), + ("nom", "they", "masculine", "he"), + ("nom", "they", "gender-neutral", "they"), + ("nom", "they", "feminine or masculine", "she or he"), + ("nom", "they", "masculine or feminine", "he or she"), + ("nom", "themselves", "neuter", "itself"), + ("nom", "themselves", "feminine", "herself"), + ("nom", "themselves", "masculine", "himself"), + ("nom", "themselves", "gender-neutral", "themself"), + ("nom", "themselves", "feminine or masculine", "herself or himself"), + ("nom", "themselves", "masculine or feminine", "himself or herself"), + ("nom", "theirs", "neuter", "its"), + ("nom", "theirs", "feminine", "hers"), + ("nom", "theirs", "masculine", "his"), + ("nom", "theirs", "gender-neutral", "theirs"), + ("nom", "theirs", "feminine or masculine", "hers or his"), + ("nom", "theirs", "masculine or feminine", "his or hers"), + ("acc", "them", "neuter", "it"), + ("acc", "them", "feminine", "her"), + ("acc", "them", "masculine", "him"), + ("acc", "them", "gender-neutral", "them"), + ("acc", "them", "feminine or masculine", "her or him"), + ("acc", "them", "masculine or feminine", "him or her"), + ("acc", "themselves", "neuter", "itself"), + ("acc", "themselves", "feminine", "herself"), + ("acc", "themselves", "masculine", "himself"), + ("acc", "themselves", "gender-neutral", "themself"), + ("acc", "themselves", "feminine or masculine", "herself or himself"), + ("acc", "themselves", "masculine or feminine", "himself or herself"), +): + try: + si_pron[thecase][plur][gend] = sing + except TypeError: + si_pron[thecase][plur] = {} + si_pron[thecase][plur][gend] = sing + + +si_pron_acc_keys = enclose("|".join(list(si_pron["acc"].keys()))) +si_pron_acc_keys_bysize = bysize(list(si_pron["acc"].keys())) + + +def get_si_pron(thecase, word, gender): + try: + sing = si_pron[thecase][word] + except KeyError: + raise # not a pronoun + try: + return sing[gender] # has several types due to gender + except TypeError: + return sing # answer independent of gender + + +plverb_irregular_pres = { + # 1st PERS. SING. 2ND PERS. SING. 3RD PERS. SINGULAR + # 3RD PERS. (INDET.) + "am": "are", + "are": "are", + "is": "are", + "was": "were", + "were": "were", + "was": "were", + "have": "have", + "have": "have", + "has": "have", + "do": "do", + "do": "do", + "does": "do", +} + +plverb_ambiguous_pres = { + # 1st PERS. SING. 2ND PERS. SING. 3RD PERS. SINGULAR + # 3RD PERS. (INDET.) + "act": "act", + "act": "act", + "acts": "act", + "blame": "blame", + "blame": "blame", + "blames": "blame", + "can": "can", + "can": "can", + "can": "can", + "must": "must", + "must": "must", + "must": "must", + "fly": "fly", + "fly": "fly", + "flies": "fly", + "copy": "copy", + "copy": "copy", + "copies": "copy", + "drink": "drink", + "drink": "drink", + "drinks": "drink", + "fight": "fight", + "fight": "fight", + "fights": "fight", + "fire": "fire", + "fire": "fire", + "fires": "fire", + "like": "like", + "like": "like", + "likes": "like", + "look": "look", + "look": "look", + "looks": "look", + "make": "make", + "make": "make", + "makes": "make", + "reach": "reach", + "reach": "reach", + "reaches": "reach", + "run": "run", + "run": "run", + "runs": "run", + "sink": "sink", + "sink": "sink", + "sinks": "sink", + "sleep": "sleep", + "sleep": "sleep", + "sleeps": "sleep", + "view": "view", + "view": "view", + "views": "view", +} + +plverb_ambiguous_pres_keys = enclose("|".join(list(plverb_ambiguous_pres.keys()))) + + +plverb_irregular_non_pres = ( + "did", + "had", + "ate", + "made", + "put", + "spent", + "fought", + "sank", + "gave", + "sought", + "shall", + "could", + "ought", + "should", +) + +plverb_ambiguous_non_pres = enclose( + "|".join(("thought", "saw", "bent", "will", "might", "cut")) +) + +# "..oes" -> "..oe" (the rest are "..oes" -> "o") + +pl_v_oes_oe = ("canoes", "floes", "oboes", "roes", "throes", "woes") +pl_v_oes_oe_endings_size4 = ("hoes", "toes") +pl_v_oes_oe_endings_size5 = ("shoes",) + + +pl_count_zero = ("0", "no", "zero", "nil") + + +pl_count_one = ("1", "a", "an", "one", "each", "every", "this", "that") + +pl_adj_special = {"a": "some", "an": "some", "this": "these", "that": "those"} + +pl_adj_special_keys = enclose("|".join(list(pl_adj_special.keys()))) + +pl_adj_poss = { + "my": "our", + "your": "your", + "its": "their", + "her": "their", + "his": "their", + "their": "their", +} + +pl_adj_poss_keys = enclose("|".join(list(pl_adj_poss.keys()))) + + +# 2. INDEFINITE ARTICLES + +# THIS PATTERN MATCHES STRINGS OF CAPITALS STARTING WITH A "VOWEL-SOUND" +# CONSONANT FOLLOWED BY ANOTHER CONSONANT, AND WHICH ARE NOT LIKELY +# TO BE REAL WORDS (OH, ALL RIGHT THEN, IT'S JUST MAGIC!) + +A_abbrev = r""" +(?! FJO | [HLMNS]Y. | RY[EO] | SQU + | ( F[LR]? | [HL] | MN? | N | RH? | S[CHKLMNPTVW]? | X(YL)?) [AEIOU]) +[FHLMNRSX][A-Z] +""" + +# THIS PATTERN CODES THE BEGINNINGS OF ALL ENGLISH WORDS BEGINING WITH A +# 'y' FOLLOWED BY A CONSONANT. ANY OTHER Y-CONSONANT PREFIX THEREFORE +# IMPLIES AN ABBREVIATION. + +A_y_cons = "y(b[lor]|cl[ea]|fere|gg|p[ios]|rou|tt)" + +# EXCEPTIONS TO EXCEPTIONS + +A_explicit_a = enclose("|".join(("unabomber", "unanimous", "US"))) + +A_explicit_an = enclose( + "|".join(("euler", "hour(?!i)", "heir", "honest", "hono[ur]", "mpeg")) +) + +A_ordinal_an = enclose("|".join(("[aefhilmnorsx]-?th",))) + +A_ordinal_a = enclose("|".join(("[bcdgjkpqtuvwyz]-?th",))) + + +# NUMERICAL INFLECTIONS + +nth = { + 0: "th", + 1: "st", + 2: "nd", + 3: "rd", + 4: "th", + 5: "th", + 6: "th", + 7: "th", + 8: "th", + 9: "th", + 11: "th", + 12: "th", + 13: "th", +} + +ordinal = dict( + ty="tieth", + one="first", + two="second", + three="third", + five="fifth", + eight="eighth", + nine="ninth", + twelve="twelfth", +) + +ordinal_suff = "|".join(list(ordinal.keys())) + + +# NUMBERS + +unit = ["", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"] +teen = [ + "ten", + "eleven", + "twelve", + "thirteen", + "fourteen", + "fifteen", + "sixteen", + "seventeen", + "eighteen", + "nineteen", +] +ten = [ + "", + "", + "twenty", + "thirty", + "forty", + "fifty", + "sixty", + "seventy", + "eighty", + "ninety", +] +mill = [ + " ", + " thousand", + " million", + " billion", + " trillion", + " quadrillion", + " quintillion", + " sextillion", + " septillion", + " octillion", + " nonillion", + " decillion", +] + + +# SUPPORT CLASSICAL PLURALIZATIONS + +def_classical = dict( + all=False, zero=False, herd=False, names=True, persons=False, ancient=False +) + +all_classical = {k: True for k in list(def_classical.keys())} +no_classical = {k: False for k in list(def_classical.keys())} + + +# Maps strings to built-in constant types +string_to_constant = {"True": True, "False": False, "None": None} + + +class engine: + def __init__(self): + + self.classical_dict = def_classical.copy() + self.persistent_count = None + self.mill_count = 0 + self.pl_sb_user_defined = [] + self.pl_v_user_defined = [] + self.pl_adj_user_defined = [] + self.si_sb_user_defined = [] + self.A_a_user_defined = [] + self.thegender = "neuter" + + deprecated_methods = dict( + pl="plural", + plnoun="plural_noun", + plverb="plural_verb", + pladj="plural_adj", + sinoun="single_noun", + prespart="present_participle", + numwords="number_to_words", + plequal="compare", + plnounequal="compare_nouns", + plverbequal="compare_verbs", + pladjequal="compare_adjs", + wordlist="join", + ) + + def __getattr__(self, meth): + if meth in self.deprecated_methods: + print3( + "{}() deprecated, use {}()".format(meth, self.deprecated_methods[meth]) + ) + raise DeprecationWarning + raise AttributeError + + def defnoun(self, singular, plural): + """ + Set the noun plural of singular to plural. + + """ + self.checkpat(singular) + self.checkpatplural(plural) + self.pl_sb_user_defined.extend((singular, plural)) + self.si_sb_user_defined.extend((plural, singular)) + return 1 + + def defverb(self, s1, p1, s2, p2, s3, p3): + """ + Set the verb plurals for s1, s2 and s3 to p1, p2 and p3 respectively. + + Where 1, 2 and 3 represent the 1st, 2nd and 3rd person forms of the verb. + + """ + self.checkpat(s1) + self.checkpat(s2) + self.checkpat(s3) + self.checkpatplural(p1) + self.checkpatplural(p2) + self.checkpatplural(p3) + self.pl_v_user_defined.extend((s1, p1, s2, p2, s3, p3)) + return 1 + + def defadj(self, singular, plural): + """ + Set the adjective plural of singular to plural. + + """ + self.checkpat(singular) + self.checkpatplural(plural) + self.pl_adj_user_defined.extend((singular, plural)) + return 1 + + def defa(self, pattern): + """ + Define the indefinate article as 'a' for words matching pattern. + + """ + self.checkpat(pattern) + self.A_a_user_defined.extend((pattern, "a")) + return 1 + + def defan(self, pattern): + """ + Define the indefinate article as 'an' for words matching pattern. + + """ + self.checkpat(pattern) + self.A_a_user_defined.extend((pattern, "an")) + return 1 + + def checkpat(self, pattern): + """ + check for errors in a regex pattern + """ + if pattern is None: + return + try: + re.match(pattern, "") + except re.error: + print3("\nBad user-defined singular pattern:\n\t%s\n" % pattern) + raise BadUserDefinedPatternError + + def checkpatplural(self, pattern): + """ + check for errors in a regex replace pattern + """ + return + + def ud_match(self, word, wordlist): + for i in range(len(wordlist) - 2, -2, -2): # backwards through even elements + mo = re.search(r"^%s$" % wordlist[i], word, re.IGNORECASE) + if mo: + if wordlist[i + 1] is None: + return None + pl = re.sub( + r"\$(\d+)", r"\\1", wordlist[i + 1] + ) # change $n to \n for expand + return mo.expand(pl) + return None + + def classical(self, **kwargs): + """ + turn classical mode on and off for various categories + + turn on all classical modes: + classical() + classical(all=True) + + turn on or off specific claassical modes: + e.g. + classical(herd=True) + classical(names=False) + + By default all classical modes are off except names. + + unknown value in args or key in kwargs rasies + exception: UnknownClasicalModeError + + """ + classical_mode = list(def_classical.keys()) + if not kwargs: + self.classical_dict = all_classical.copy() + return + if "all" in kwargs: + if kwargs["all"]: + self.classical_dict = all_classical.copy() + else: + self.classical_dict = no_classical.copy() + + for k, v in list(kwargs.items()): + if k in classical_mode: + self.classical_dict[k] = v + else: + raise UnknownClassicalModeError + + def num(self, count=None, show=None): # (;$count,$show) + """ + Set the number to be used in other method calls. + + Returns count. + + Set show to False to return '' instead. + + """ + if count is not None: + try: + self.persistent_count = int(count) + except ValueError: + raise BadNumValueError + if (show is None) or show: + return str(count) + else: + self.persistent_count = None + return "" + + def gender(self, gender): + """ + set the gender for the singular of plural pronouns + + can be one of: + 'neuter' ('they' -> 'it') + 'feminine' ('they' -> 'she') + 'masculine' ('they' -> 'he') + 'gender-neutral' ('they' -> 'they') + 'feminine or masculine' ('they' -> 'she or he') + 'masculine or feminine' ('they' -> 'he or she') + """ + if gender in singular_pronoun_genders: + self.thegender = gender + else: + raise BadGenderError + + def _get_value_from_ast(self, obj): + """ + Return the value of the ast object. + """ + if isinstance(obj, ast.Num): + return obj.n + elif isinstance(obj, ast.Str): + return obj.s + elif isinstance(obj, ast.List): + return [self._get_value_from_ast(e) for e in obj.elts] + elif isinstance(obj, ast.Tuple): + return tuple([self._get_value_from_ast(e) for e in obj.elts]) + + # None, True and False are NameConstants in Py3.4 and above. + elif sys.version_info.major >= 3 and isinstance(obj, ast.NameConstant): + return obj.value + + # For python versions below 3.4 + elif isinstance(obj, ast.Name) and (obj.id in ["True", "False", "None"]): + return string_to_constant[obj.id] + + # Probably passed a variable name. + # Or passed a single word without wrapping it in quotes as an argument + # ex: p.inflect("I plural(see)") instead of p.inflect("I plural('see')") + raise NameError("name '%s' is not defined" % obj.id) + + def _string_to_substitute(self, mo, methods_dict): + """ + Return the string to be substituted for the match. + """ + matched_text, f_name = mo.groups() + # matched_text is the complete match string. e.g. plural_noun(cat) + # f_name is the function name. e.g. plural_noun + + # Return matched_text if function name is not in methods_dict + if f_name not in methods_dict: + return matched_text + + # Parse the matched text + a_tree = ast.parse(matched_text) + + # get the args and kwargs from ast objects + args_list = [self._get_value_from_ast(a) for a in a_tree.body[0].value.args] + kwargs_list = { + kw.arg: self._get_value_from_ast(kw.value) + for kw in a_tree.body[0].value.keywords + } + + # Call the corresponding function + return methods_dict[f_name](*args_list, **kwargs_list) + + # 0. PERFORM GENERAL INFLECTIONS IN A STRING + + def inflect(self, text): + """ + Perform inflections in a string. + + e.g. inflect('The plural of cat is plural(cat)') returns + 'The plural of cat is cats' + + can use plural, plural_noun, plural_verb, plural_adj, + singular_noun, a, an, no, ordinal, number_to_words, + and prespart + + """ + save_persistent_count = self.persistent_count + + # Dictionary of allowed methods + methods_dict = { + "plural": self.plural, + "plural_adj": self.plural_adj, + "plural_noun": self.plural_noun, + "plural_verb": self.plural_verb, + "singular_noun": self.singular_noun, + "a": self.a, + "an": self.a, + "no": self.no, + "ordinal": self.ordinal, + "number_to_words": self.number_to_words, + "present_participle": self.present_participle, + "num": self.num, + } + + # Regular expression to find Python's function call syntax + functions_re = re.compile(r"((\w+)\([^)]*\)*)", re.IGNORECASE) + output = functions_re.sub( + lambda mo: self._string_to_substitute(mo, methods_dict), text + ) + self.persistent_count = save_persistent_count + return output + + # ## PLURAL SUBROUTINES + + def postprocess(self, orig, inflected): + if "|" in inflected: + inflected = inflected.split("|")[self.classical_dict["all"]] + result = inflected.split(" ") + # Try to fix word wise capitalization + for index, word in enumerate(orig.split(" ")): + if word == "I": + # Is this the only word for exceptions like this + # Where the original is fully capitalized + # without 'meaning' capitalization? + # Also this fails to handle a capitalizaion in context + continue + if word.capitalize() == word: + result[index] = result[index].capitalize() + if word == word.upper(): + result[index] = result[index].upper() + return " ".join(result) + + def partition_word(self, text): + mo = re.search(r"\A(\s*)(.+?)(\s*)\Z", text) + try: + return mo.group(1), mo.group(2), mo.group(3) + except AttributeError: # empty string + return "", "", "" + + def plural(self, text, count=None): + """ + Return the plural of text. + + If count supplied, then return text if count is one of: + 1, a, an, one, each, every, this, that + otherwise return the plural. + + Whitespace at the start and end is preserved. + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + plural = self.postprocess( + word, + self._pl_special_adjective(word, count) + or self._pl_special_verb(word, count) + or self._plnoun(word, count), + ) + return "{}{}{}".format(pre, plural, post) + + def plural_noun(self, text, count=None): + """ + Return the plural of text, where text is a noun. + + If count supplied, then return text if count is one of: + 1, a, an, one, each, every, this, that + otherwise return the plural. + + Whitespace at the start and end is preserved. + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + plural = self.postprocess(word, self._plnoun(word, count)) + return "{}{}{}".format(pre, plural, post) + + def plural_verb(self, text, count=None): + """ + Return the plural of text, where text is a verb. + + If count supplied, then return text if count is one of: + 1, a, an, one, each, every, this, that + otherwise return the plural. + + Whitespace at the start and end is preserved. + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + plural = self.postprocess( + word, + self._pl_special_verb(word, count) or self._pl_general_verb(word, count), + ) + return "{}{}{}".format(pre, plural, post) + + def plural_adj(self, text, count=None): + """ + Return the plural of text, where text is an adjective. + + If count supplied, then return text if count is one of: + 1, a, an, one, each, every, this, that + otherwise return the plural. + + Whitespace at the start and end is preserved. + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + plural = self.postprocess(word, self._pl_special_adjective(word, count) or word) + return "{}{}{}".format(pre, plural, post) + + def compare(self, word1, word2): + """ + compare word1 and word2 for equality regardless of plurality + + return values: + eq - the strings are equal + p:s - word1 is the plural of word2 + s:p - word2 is the plural of word1 + p:p - word1 and word2 are two different plural forms of the one word + False - otherwise + + """ + return ( + self._plequal(word1, word2, self.plural_noun) + or self._plequal(word1, word2, self.plural_verb) + or self._plequal(word1, word2, self.plural_adj) + ) + + def compare_nouns(self, word1, word2): + """ + compare word1 and word2 for equality regardless of plurality + word1 and word2 are to be treated as nouns + + return values: + eq - the strings are equal + p:s - word1 is the plural of word2 + s:p - word2 is the plural of word1 + p:p - word1 and word2 are two different plural forms of the one word + False - otherwise + + """ + return self._plequal(word1, word2, self.plural_noun) + + def compare_verbs(self, word1, word2): + """ + compare word1 and word2 for equality regardless of plurality + word1 and word2 are to be treated as verbs + + return values: + eq - the strings are equal + p:s - word1 is the plural of word2 + s:p - word2 is the plural of word1 + p:p - word1 and word2 are two different plural forms of the one word + False - otherwise + + """ + return self._plequal(word1, word2, self.plural_verb) + + def compare_adjs(self, word1, word2): + """ + compare word1 and word2 for equality regardless of plurality + word1 and word2 are to be treated as adjectives + + return values: + eq - the strings are equal + p:s - word1 is the plural of word2 + s:p - word2 is the plural of word1 + p:p - word1 and word2 are two different plural forms of the one word + False - otherwise + + """ + return self._plequal(word1, word2, self.plural_adj) + + def singular_noun(self, text, count=None, gender=None): + """ + Return the singular of text, where text is a plural noun. + + If count supplied, then return the singular if count is one of: + 1, a, an, one, each, every, this, that or if count is None + otherwise return text unchanged. + + Whitespace at the start and end is preserved. + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + sing = self._sinoun(word, count=count, gender=gender) + if sing is not False: + plural = self.postprocess( + word, self._sinoun(word, count=count, gender=gender) + ) + return "{}{}{}".format(pre, plural, post) + return False + + def _plequal(self, word1, word2, pl): + classval = self.classical_dict.copy() + self.classical_dict = all_classical.copy() + if word1 == word2: + return "eq" + if word1 == pl(word2): + return "p:s" + if pl(word1) == word2: + return "s:p" + self.classical_dict = no_classical.copy() + if word1 == pl(word2): + return "p:s" + if pl(word1) == word2: + return "s:p" + self.classical_dict = classval.copy() + + if pl == self.plural or pl == self.plural_noun: + if self._pl_check_plurals_N(word1, word2): + return "p:p" + if self._pl_check_plurals_N(word2, word1): + return "p:p" + if pl == self.plural or pl == self.plural_adj: + if self._pl_check_plurals_adj(word1, word2): + return "p:p" + return False + + def _pl_reg_plurals(self, pair, stems, end1, end2): + pattern = r"({})({}\|\1{}|{}\|\1{})".format(stems, end1, end2, end2, end1) + return bool(re.search(pattern, pair)) + + def _pl_check_plurals_N(self, word1, word2): + stem_endings = ( + (pl_sb_C_a_ata, "as", "ata"), + (pl_sb_C_is_ides, "is", "ides"), + (pl_sb_C_a_ae, "s", "e"), + (pl_sb_C_en_ina, "ens", "ina"), + (pl_sb_C_um_a, "ums", "a"), + (pl_sb_C_us_i, "uses", "i"), + (pl_sb_C_on_a, "ons", "a"), + (pl_sb_C_o_i_stems, "os", "i"), + (pl_sb_C_ex_ices, "exes", "ices"), + (pl_sb_C_ix_ices, "ixes", "ices"), + (pl_sb_C_i, "s", "i"), + (pl_sb_C_im, "s", "im"), + (".*eau", "s", "x"), + (".*ieu", "s", "x"), + (".*tri", "xes", "ces"), + (".{2,}[yia]n", "xes", "ges"), + ) + pair = "{}|{}".format(word1, word2) + + return ( + pair in pl_sb_irregular_s.values() + or pair in pl_sb_irregular.values() + or pair in pl_sb_irregular_caps.values() + or any( + self._pl_reg_plurals(pair, stems, end1, end2) + for stems, end1, end2 in stem_endings + ) + ) + + def _pl_check_plurals_adj(self, word1, word2): + word1a = word1[: word1.rfind("'")] if word1.endswith(("'s", "'")) else "" + word2a = word2[: word2.rfind("'")] if word2.endswith(("'s", "'")) else "" + + return ( + word1a + and word2a + and ( + self._pl_check_plurals_N(word1a, word2a) + or self._pl_check_plurals_N(word2a, word1a) + ) + ) + + def get_count(self, count=None): + if count is None and self.persistent_count is not None: + count = self.persistent_count + + if count is not None: + count = ( + 1 + if ( + (str(count) in pl_count_one) + or ( + self.classical_dict["zero"] + and str(count).lower() in pl_count_zero + ) + ) + else 2 + ) + else: + count = "" + return count + + # @profile + def _plnoun(self, word, count=None): + count = self.get_count(count) + + # DEFAULT TO PLURAL + + if count == 1: + return word + + # HANDLE USER-DEFINED NOUNS + + value = self.ud_match(word, self.pl_sb_user_defined) + if value is not None: + return value + + # HANDLE EMPTY WORD, SINGULAR COUNT AND UNINFLECTED PLURALS + + if word == "": + return word + + lowerword = word.lower() + + if lowerword in pl_sb_uninflected_complete: + return word + + if word in pl_sb_uninflected_caps: + return word + + for k, v in pl_sb_uninflected_bysize.items(): + if lowerword[-k:] in v: + return word + + if self.classical_dict["herd"] and lowerword in pl_sb_uninflected_herd: + return word + + # HANDLE COMPOUNDS ("Governor General", "mother-in-law", "aide-de-camp", ETC.) + + mo = re.search(r"^(?:%s)$" % pl_sb_postfix_adj_stems, word, re.IGNORECASE) + if mo and mo.group(2) != "": + return "{}{}".format(self._plnoun(mo.group(1), 2), mo.group(2)) + + if " a " in lowerword or "-a-" in lowerword: + mo = re.search(r"^(?:%s)$" % pl_sb_prep_dual_compound, word, re.IGNORECASE) + if mo and mo.group(2) != "" and mo.group(3) != "": + return "{}{}{}".format( + self._plnoun(mo.group(1), 2), mo.group(2), self._plnoun(mo.group(3)) + ) + + lowersplit = lowerword.split(" ") + if len(lowersplit) >= 3: + for numword in range(1, len(lowersplit) - 1): + if lowersplit[numword] in pl_prep_list_da: + return " ".join( + lowersplit[: numword - 1] + + [self._plnoun(lowersplit[numword - 1], 2)] + + lowersplit[numword:] + ) + + # only pluralize denominators in units + mo = re.search( + r"(?P.+)( (%s) .+)" % "|".join(["per", "a"]), lowerword + ) + if mo: + index = len(mo.group("denominator")) + return "{}{}".format(self._plnoun(word[:index]), word[index:]) + + # handle units given in degrees (only accept if + # there is no more than one word following) + # degree Celsius => degrees Celsius but degree + # fahrenheit hour => degree fahrenheit hours + if len(lowersplit) >= 2 and lowersplit[-2] in ["degree"]: + return " ".join([self._plnoun(lowersplit[0])] + lowersplit[1:]) + + lowersplit = lowerword.split("-") + if len(lowersplit) >= 3: + for numword in range(1, len(lowersplit) - 1): + if lowersplit[numword] in pl_prep_list_da: + return " ".join( + lowersplit[: numword - 1] + + [ + self._plnoun(lowersplit[numword - 1], 2) + + "-" + + lowersplit[numword] + + "-" + ] + ) + " ".join(lowersplit[(numword + 1) :]) + + # HANDLE PRONOUNS + + for k, v in pl_pron_acc_keys_bysize.items(): + if lowerword[-k:] in v: # ends with accusivate pronoun + for pk, pv in pl_prep_bysize.items(): + if lowerword[:pk] in pv: # starts with a prep + if lowerword.split() == [lowerword[:pk], lowerword[-k:]]: + # only whitespace in between + return lowerword[:-k] + pl_pron_acc[lowerword[-k:]] + + try: + return pl_pron_nom[word.lower()] + except KeyError: + pass + + try: + return pl_pron_acc[word.lower()] + except KeyError: + pass + + # HANDLE ISOLATED IRREGULAR PLURALS + + wordsplit = word.split() + wordlast = wordsplit[-1] + lowerwordlast = wordlast.lower() + + if wordlast in list(pl_sb_irregular_caps.keys()): + llen = len(wordlast) + return "{}{}".format(word[:-llen], pl_sb_irregular_caps[wordlast]) + + if lowerwordlast in list(pl_sb_irregular.keys()): + llen = len(lowerwordlast) + return "{}{}".format(word[:-llen], pl_sb_irregular[lowerwordlast]) + + if (" ".join(wordsplit[-2:])).lower() in list(pl_sb_irregular_compound.keys()): + llen = len( + " ".join(wordsplit[-2:]) + ) # TODO: what if 2 spaces between these words? + return "{}{}".format( + word[:-llen], + pl_sb_irregular_compound[(" ".join(wordsplit[-2:])).lower()], + ) + + if lowerword[-3:] == "quy": + return word[:-1] + "ies" + + if lowerword[-6:] == "person": + if self.classical_dict["persons"]: + return word + "s" + else: + return word[:-4] + "ople" + + # HANDLE FAMILIES OF IRREGULAR PLURALS + + if lowerword[-3:] == "man": + for k, v in pl_sb_U_man_mans_bysize.items(): + if lowerword[-k:] in v: + return word + "s" + for k, v in pl_sb_U_man_mans_caps_bysize.items(): + if word[-k:] in v: + return word + "s" + return word[:-3] + "men" + if lowerword[-5:] == "mouse": + return word[:-5] + "mice" + if lowerword[-5:] == "louse": + return word[:-5] + "lice" + if lowerword[-5:] == "goose": + return word[:-5] + "geese" + if lowerword[-5:] == "tooth": + return word[:-5] + "teeth" + if lowerword[-4:] == "foot": + return word[:-4] + "feet" + if lowerword[-4:] == "taco": + return word[:-5] + "tacos" + + if lowerword == "die": + return "dice" + + # HANDLE UNASSIMILATED IMPORTS + + if lowerword[-4:] == "ceps": + return word + if lowerword[-4:] == "zoon": + return word[:-2] + "a" + if lowerword[-3:] in ("cis", "sis", "xis"): + return word[:-2] + "es" + + for lastlet, d, numend, post in ( + ("h", pl_sb_U_ch_chs_bysize, None, "s"), + ("x", pl_sb_U_ex_ices_bysize, -2, "ices"), + ("x", pl_sb_U_ix_ices_bysize, -2, "ices"), + ("m", pl_sb_U_um_a_bysize, -2, "a"), + ("s", pl_sb_U_us_i_bysize, -2, "i"), + ("n", pl_sb_U_on_a_bysize, -2, "a"), + ("a", pl_sb_U_a_ae_bysize, None, "e"), + ): + if lowerword[-1] == lastlet: # this test to add speed + for k, v in d.items(): + if lowerword[-k:] in v: + return word[:numend] + post + + # HANDLE INCOMPLETELY ASSIMILATED IMPORTS + + if self.classical_dict["ancient"]: + if lowerword[-4:] == "trix": + return word[:-1] + "ces" + if lowerword[-3:] in ("eau", "ieu"): + return word + "x" + if lowerword[-3:] in ("ynx", "inx", "anx") and len(word) > 4: + return word[:-1] + "ges" + + for lastlet, d, numend, post in ( + ("n", pl_sb_C_en_ina_bysize, -2, "ina"), + ("x", pl_sb_C_ex_ices_bysize, -2, "ices"), + ("x", pl_sb_C_ix_ices_bysize, -2, "ices"), + ("m", pl_sb_C_um_a_bysize, -2, "a"), + ("s", pl_sb_C_us_i_bysize, -2, "i"), + ("s", pl_sb_C_us_us_bysize, None, ""), + ("a", pl_sb_C_a_ae_bysize, None, "e"), + ("a", pl_sb_C_a_ata_bysize, None, "ta"), + ("s", pl_sb_C_is_ides_bysize, -1, "des"), + ("o", pl_sb_C_o_i_bysize, -1, "i"), + ("n", pl_sb_C_on_a_bysize, -2, "a"), + ): + if lowerword[-1] == lastlet: # this test to add speed + for k, v in d.items(): + if lowerword[-k:] in v: + return word[:numend] + post + + for d, numend, post in ( + (pl_sb_C_i_bysize, None, "i"), + (pl_sb_C_im_bysize, None, "im"), + ): + for k, v in d.items(): + if lowerword[-k:] in v: + return word[:numend] + post + + # HANDLE SINGULAR NOUNS ENDING IN ...s OR OTHER SILIBANTS + + if lowerword in pl_sb_singular_s_complete: + return word + "es" + + for k, v in pl_sb_singular_s_bysize.items(): + if lowerword[-k:] in v: + return word + "es" + + if lowerword[-2:] == "es" and word[0] == word[0].upper(): + return word + "es" + + if lowerword[-1] == "z": + for k, v in pl_sb_z_zes_bysize.items(): + if lowerword[-k:] in v: + return word + "es" + + if lowerword[-2:-1] != "z": + return word + "zes" + + if lowerword[-2:] == "ze": + for k, v in pl_sb_ze_zes_bysize.items(): + if lowerword[-k:] in v: + return word + "s" + + if lowerword[-2:] in ("ch", "sh", "zz", "ss") or lowerword[-1] == "x": + return word + "es" + + # HANDLE ...f -> ...ves + + if lowerword[-3:] in ("elf", "alf", "olf"): + return word[:-1] + "ves" + if lowerword[-3:] == "eaf" and lowerword[-4:-3] != "d": + return word[:-1] + "ves" + if lowerword[-4:] in ("nife", "life", "wife"): + return word[:-2] + "ves" + if lowerword[-3:] == "arf": + return word[:-1] + "ves" + + # HANDLE ...y + + if lowerword[-1] == "y": + if lowerword[-2:-1] in "aeiou" or len(word) == 1: + return word + "s" + + if self.classical_dict["names"]: + if lowerword[-1] == "y" and word[0] == word[0].upper(): + return word + "s" + + return word[:-1] + "ies" + + # HANDLE ...o + + if lowerword in pl_sb_U_o_os_complete: + return word + "s" + + for k, v in pl_sb_U_o_os_bysize.items(): + if lowerword[-k:] in v: + return word + "s" + + if lowerword[-2:] in ("ao", "eo", "io", "oo", "uo"): + return word + "s" + + if lowerword[-1] == "o": + return word + "es" + + # OTHERWISE JUST ADD ...s + + return "%ss" % word + + def _pl_special_verb(self, word, count=None): + if self.classical_dict["zero"] and str(count).lower() in pl_count_zero: + return False + count = self.get_count(count) + + if count == 1: + return word + + # HANDLE USER-DEFINED VERBS + + value = self.ud_match(word, self.pl_v_user_defined) + if value is not None: + return value + + # HANDLE IRREGULAR PRESENT TENSE (SIMPLE AND COMPOUND) + + lowerword = word.lower() + try: + firstword = lowerword.split()[0] + except IndexError: + return False # word is '' + + if firstword in list(plverb_irregular_pres.keys()): + return "{}{}".format( + plverb_irregular_pres[firstword], word[len(firstword) :] + ) + + # HANDLE IRREGULAR FUTURE, PRETERITE AND PERFECT TENSES + + if firstword in plverb_irregular_non_pres: + return word + + # HANDLE PRESENT NEGATIONS (SIMPLE AND COMPOUND) + + if firstword.endswith("n't") and firstword[:-3] in list( + plverb_irregular_pres.keys() + ): + return "{}n't{}".format( + plverb_irregular_pres[firstword[:-3]], word[len(firstword) :] + ) + + if firstword.endswith("n't"): + return word + + # HANDLE SPECIAL CASES + + mo = re.search(r"^(%s)$" % plverb_special_s, word) + if mo: + return False + if re.search(r"\s", word): + return False + if lowerword == "quizzes": + return "quiz" + + # HANDLE STANDARD 3RD PERSON (CHOP THE ...(e)s OFF SINGLE WORDS) + + if ( + lowerword[-4:] in ("ches", "shes", "zzes", "sses") + or lowerword[-3:] == "xes" + ): + return word[:-2] + + if lowerword[-3:] == "ies" and len(word) > 3: + return lowerword[:-3] + "y" + + if ( + lowerword in pl_v_oes_oe + or lowerword[-4:] in pl_v_oes_oe_endings_size4 + or lowerword[-5:] in pl_v_oes_oe_endings_size5 + ): + return word[:-1] + + if lowerword.endswith("oes") and len(word) > 3: + return lowerword[:-2] + + mo = re.search(r"^(.*[^s])s$", word, re.IGNORECASE) + if mo: + return mo.group(1) + + # OTHERWISE, A REGULAR VERB (HANDLE ELSEWHERE) + + return False + + def _pl_general_verb(self, word, count=None): + count = self.get_count(count) + + if count == 1: + return word + + # HANDLE AMBIGUOUS PRESENT TENSES (SIMPLE AND COMPOUND) + + mo = re.search( + r"^(%s)((\s.*)?)$" % plverb_ambiguous_pres_keys, word, re.IGNORECASE + ) + if mo: + return "{}{}".format( + plverb_ambiguous_pres[mo.group(1).lower()], mo.group(2) + ) + + # HANDLE AMBIGUOUS PRETERITE AND PERFECT TENSES + + mo = re.search( + r"^(%s)((\s.*)?)$" % plverb_ambiguous_non_pres, word, re.IGNORECASE + ) + if mo: + return word + + # OTHERWISE, 1st OR 2ND PERSON IS UNINFLECTED + + return word + + def _pl_special_adjective(self, word, count=None): + count = self.get_count(count) + + if count == 1: + return word + + # HANDLE USER-DEFINED ADJECTIVES + + value = self.ud_match(word, self.pl_adj_user_defined) + if value is not None: + return value + + # HANDLE KNOWN CASES + + mo = re.search(r"^(%s)$" % pl_adj_special_keys, word, re.IGNORECASE) + if mo: + return "%s" % (pl_adj_special[mo.group(1).lower()]) + + # HANDLE POSSESSIVES + + mo = re.search(r"^(%s)$" % pl_adj_poss_keys, word, re.IGNORECASE) + if mo: + return "%s" % (pl_adj_poss[mo.group(1).lower()]) + + mo = re.search(r"^(.*)'s?$", word) + if mo: + pl = self.plural_noun(mo.group(1)) + trailing_s = "" if pl[-1] == "s" else "s" + return "{}'{}".format(pl, trailing_s) + + # OTHERWISE, NO IDEA + + return False + + # @profile + def _sinoun(self, word, count=None, gender=None): + count = self.get_count(count) + + # DEFAULT TO PLURAL + + if count == 2: + return word + + # SET THE GENDER + + try: + if gender is None: + gender = self.thegender + elif gender not in singular_pronoun_genders: + raise BadGenderError + except (TypeError, IndexError): + raise BadGenderError + + # HANDLE USER-DEFINED NOUNS + + value = self.ud_match(word, self.si_sb_user_defined) + if value is not None: + return value + + # HANDLE EMPTY WORD, SINGULAR COUNT AND UNINFLECTED PLURALS + + if word == "": + return word + + lowerword = word.lower() + + if word in si_sb_ois_oi_case: + return word[:-1] + + if lowerword in pl_sb_uninflected_complete: + return word + + if word in pl_sb_uninflected_caps: + return word + + for k, v in pl_sb_uninflected_bysize.items(): + if lowerword[-k:] in v: + return word + + if self.classical_dict["herd"] and lowerword in pl_sb_uninflected_herd: + return word + + if lowerword in pl_sb_C_us_us: + return word + + # HANDLE COMPOUNDS ("Governor General", "mother-in-law", "aide-de-camp", ETC.) + + mo = re.search(r"^(?:%s)$" % pl_sb_postfix_adj_stems, word, re.IGNORECASE) + if mo and mo.group(2) != "": + return "{}{}".format( + self._sinoun(mo.group(1), 1, gender=gender), mo.group(2) + ) + + lowersplit = lowerword.split(" ") + if len(lowersplit) >= 3: + for numword in range(1, len(lowersplit) - 1): + if lowersplit[numword] in pl_prep_list_da: + return " ".join( + lowersplit[: numword - 1] + + [ + self._sinoun(lowersplit[numword - 1], 1, gender=gender) + or lowersplit[numword - 1] + ] + + lowersplit[numword:] + ) + + lowersplit = lowerword.split("-") + if len(lowersplit) >= 3: + for numword in range(1, len(lowersplit) - 1): + if lowersplit[numword] in pl_prep_list_da: + return " ".join( + lowersplit[: numword - 1] + + [ + ( + self._sinoun(lowersplit[numword - 1], 1, gender=gender) + or lowersplit[numword - 1] + ) + + "-" + + lowersplit[numword] + + "-" + ] + ) + " ".join(lowersplit[(numword + 1) :]) + + # HANDLE PRONOUNS + + for k, v in si_pron_acc_keys_bysize.items(): + if lowerword[-k:] in v: # ends with accusivate pronoun + for pk, pv in pl_prep_bysize.items(): + if lowerword[:pk] in pv: # starts with a prep + if lowerword.split() == [lowerword[:pk], lowerword[-k:]]: + # only whitespace in between + return lowerword[:-k] + get_si_pron( + "acc", lowerword[-k:], gender + ) + + try: + return get_si_pron("nom", word.lower(), gender) + except KeyError: + pass + + try: + return get_si_pron("acc", word.lower(), gender) + except KeyError: + pass + + # HANDLE ISOLATED IRREGULAR PLURALS + + wordsplit = word.split() + wordlast = wordsplit[-1] + lowerwordlast = wordlast.lower() + + if wordlast in list(si_sb_irregular_caps.keys()): + llen = len(wordlast) + return "{}{}".format(word[:-llen], si_sb_irregular_caps[wordlast]) + + if lowerwordlast in list(si_sb_irregular.keys()): + llen = len(lowerwordlast) + return "{}{}".format(word[:-llen], si_sb_irregular[lowerwordlast]) + + if (" ".join(wordsplit[-2:])).lower() in list(si_sb_irregular_compound.keys()): + llen = len( + " ".join(wordsplit[-2:]) + ) # TODO: what if 2 spaces between these words? + return "{}{}".format( + word[:-llen], + si_sb_irregular_compound[(" ".join(wordsplit[-2:])).lower()], + ) + + if lowerword[-5:] == "quies": + return word[:-3] + "y" + + if lowerword[-7:] == "persons": + return word[:-1] + if lowerword[-6:] == "people": + return word[:-4] + "rson" + + # HANDLE FAMILIES OF IRREGULAR PLURALS + + if lowerword[-4:] == "mans": + for k, v in si_sb_U_man_mans_bysize.items(): + if lowerword[-k:] in v: + return word[:-1] + for k, v in si_sb_U_man_mans_caps_bysize.items(): + if word[-k:] in v: + return word[:-1] + if lowerword[-3:] == "men": + return word[:-3] + "man" + if lowerword[-4:] == "mice": + return word[:-4] + "mouse" + if lowerword[-4:] == "lice": + return word[:-4] + "louse" + if lowerword[-5:] == "geese": + return word[:-5] + "goose" + if lowerword[-5:] == "teeth": + return word[:-5] + "tooth" + if lowerword[-4:] == "feet": + return word[:-4] + "foot" + + if lowerword == "dice": + return "die" + + # HANDLE UNASSIMILATED IMPORTS + + if lowerword[-4:] == "ceps": + return word + if lowerword[-3:] == "zoa": + return word[:-1] + "on" + + for lastlet, d, numend, post in ( + ("s", si_sb_U_ch_chs_bysize, -1, ""), + ("s", si_sb_U_ex_ices_bysize, -4, "ex"), + ("s", si_sb_U_ix_ices_bysize, -4, "ix"), + ("a", si_sb_U_um_a_bysize, -1, "um"), + ("i", si_sb_U_us_i_bysize, -1, "us"), + ("a", si_sb_U_on_a_bysize, -1, "on"), + ("e", si_sb_U_a_ae_bysize, -1, ""), + ): + if lowerword[-1] == lastlet: # this test to add speed + for k, v in d.items(): + if lowerword[-k:] in v: + return word[:numend] + post + + # HANDLE INCOMPLETELY ASSIMILATED IMPORTS + + if self.classical_dict["ancient"]: + + if lowerword[-6:] == "trices": + return word[:-3] + "x" + if lowerword[-4:] in ("eaux", "ieux"): + return word[:-1] + if lowerword[-5:] in ("ynges", "inges", "anges") and len(word) > 6: + return word[:-3] + "x" + + for lastlet, d, numend, post in ( + ("a", si_sb_C_en_ina_bysize, -3, "en"), + ("s", si_sb_C_ex_ices_bysize, -4, "ex"), + ("s", si_sb_C_ix_ices_bysize, -4, "ix"), + ("a", si_sb_C_um_a_bysize, -1, "um"), + ("i", si_sb_C_us_i_bysize, -1, "us"), + ("s", pl_sb_C_us_us_bysize, None, ""), + ("e", si_sb_C_a_ae_bysize, -1, ""), + ("a", si_sb_C_a_ata_bysize, -2, ""), + ("s", si_sb_C_is_ides_bysize, -3, "s"), + ("i", si_sb_C_o_i_bysize, -1, "o"), + ("a", si_sb_C_on_a_bysize, -1, "on"), + ("m", si_sb_C_im_bysize, -2, ""), + ("i", si_sb_C_i_bysize, -1, ""), + ): + if lowerword[-1] == lastlet: # this test to add speed + for k, v in d.items(): + if lowerword[-k:] in v: + return word[:numend] + post + + # HANDLE PLURLS ENDING IN uses -> use + + if ( + lowerword[-6:] == "houses" + or word in si_sb_uses_use_case + or lowerword in si_sb_uses_use + ): + return word[:-1] + + # HANDLE PLURLS ENDING IN ies -> ie + + if word in si_sb_ies_ie_case or lowerword in si_sb_ies_ie: + return word[:-1] + + # HANDLE PLURLS ENDING IN oes -> oe + + if ( + lowerword[-5:] == "shoes" + or word in si_sb_oes_oe_case + or lowerword in si_sb_oes_oe + ): + return word[:-1] + + # HANDLE SINGULAR NOUNS ENDING IN ...s OR OTHER SILIBANTS + + if word in si_sb_sses_sse_case or lowerword in si_sb_sses_sse: + return word[:-1] + + if lowerword in si_sb_singular_s_complete: + return word[:-2] + + for k, v in si_sb_singular_s_bysize.items(): + if lowerword[-k:] in v: + return word[:-2] + + if lowerword[-4:] == "eses" and word[0] == word[0].upper(): + return word[:-2] + + if lowerword in si_sb_z_zes: + return word[:-2] + + if lowerword in si_sb_zzes_zz: + return word[:-2] + + if lowerword[-4:] == "zzes": + return word[:-3] + + if word in si_sb_ches_che_case or lowerword in si_sb_ches_che: + return word[:-1] + + if lowerword[-4:] in ("ches", "shes"): + return word[:-2] + + if lowerword in si_sb_xes_xe: + return word[:-1] + + if lowerword[-3:] == "xes": + return word[:-2] + + # HANDLE ...f -> ...ves + + if word in si_sb_ves_ve_case or lowerword in si_sb_ves_ve: + return word[:-1] + + if lowerword[-3:] == "ves": + if lowerword[-5:-3] in ("el", "al", "ol"): + return word[:-3] + "f" + if lowerword[-5:-3] == "ea" and word[-6:-5] != "d": + return word[:-3] + "f" + if lowerword[-5:-3] in ("ni", "li", "wi"): + return word[:-3] + "fe" + if lowerword[-5:-3] == "ar": + return word[:-3] + "f" + + # HANDLE ...y + + if lowerword[-2:] == "ys": + if len(lowerword) > 2 and lowerword[-3] in "aeiou": + return word[:-1] + + if self.classical_dict["names"]: + if lowerword[-2:] == "ys" and word[0] == word[0].upper(): + return word[:-1] + + if lowerword[-3:] == "ies": + return word[:-3] + "y" + + # HANDLE ...o + + if lowerword[-2:] == "os": + + if lowerword in si_sb_U_o_os_complete: + return word[:-1] + + for k, v in si_sb_U_o_os_bysize.items(): + if lowerword[-k:] in v: + return word[:-1] + + if lowerword[-3:] in ("aos", "eos", "ios", "oos", "uos"): + return word[:-1] + + if lowerword[-3:] == "oes": + return word[:-2] + + # UNASSIMILATED IMPORTS FINAL RULE + + if word in si_sb_es_is: + return word[:-2] + "is" + + # OTHERWISE JUST REMOVE ...s + + if lowerword[-1] == "s": + return word[:-1] + + # COULD NOT FIND SINGULAR + + return False + + # ADJECTIVES + + def a(self, text, count=1): + """ + Return the appropriate indefinite article followed by text. + + The indefinite article is either 'a' or 'an'. + + If count is not one, then return count followed by text + instead of 'a' or 'an'. + + Whitespace at the start and end is preserved. + + """ + mo = re.search(r"\A(\s*)(?:an?\s+)?(.+?)(\s*)\Z", text, re.IGNORECASE) + if mo: + word = mo.group(2) + if not word: + return text + pre = mo.group(1) + post = mo.group(3) + result = self._indef_article(word, count) + return "{}{}{}".format(pre, result, post) + return "" + + an = a + + def _indef_article(self, word, count): + mycount = self.get_count(count) + + if mycount != 1: + return "{} {}".format(count, word) + + # HANDLE USER-DEFINED VARIANTS + + value = self.ud_match(word, self.A_a_user_defined) + if value is not None: + return "{} {}".format(value, word) + + # HANDLE ORDINAL FORMS + + for a in ((r"^(%s)" % A_ordinal_a, "a"), (r"^(%s)" % A_ordinal_an, "an")): + mo = re.search(a[0], word, re.IGNORECASE) + if mo: + return "{} {}".format(a[1], word) + + # HANDLE SPECIAL CASES + + for a in ( + (r"^(%s)" % A_explicit_an, "an"), + (r"^[aefhilmnorsx]$", "an"), + (r"^[bcdgjkpqtuvwyz]$", "a"), + ): + mo = re.search(a[0], word, re.IGNORECASE) + if mo: + return "{} {}".format(a[1], word) + + # HANDLE ABBREVIATIONS + + for a in ( + (r"(%s)" % A_abbrev, "an", re.VERBOSE), + (r"^[aefhilmnorsx][.-]", "an", re.IGNORECASE), + (r"^[a-z][.-]", "a", re.IGNORECASE), + ): + mo = re.search(a[0], word, a[2]) + if mo: + return "{} {}".format(a[1], word) + + # HANDLE CONSONANTS + + mo = re.search(r"^[^aeiouy]", word, re.IGNORECASE) + if mo: + return "a %s" % word + + # HANDLE SPECIAL VOWEL-FORMS + + for a in ( + (r"^e[uw]", "a"), + (r"^onc?e\b", "a"), + (r"^onetime\b", "a"), + (r"^uni([^nmd]|mo)", "a"), + (r"^u[bcfghjkqrst][aeiou]", "a"), + (r"^ukr", "a"), + (r"^(%s)" % A_explicit_a, "a"), + ): + mo = re.search(a[0], word, re.IGNORECASE) + if mo: + return "{} {}".format(a[1], word) + + # HANDLE SPECIAL CAPITALS + + mo = re.search(r"^U[NK][AIEO]?", word) + if mo: + return "a %s" % word + + # HANDLE VOWELS + + mo = re.search(r"^[aeiou]", word, re.IGNORECASE) + if mo: + return "an %s" % word + + # HANDLE y... (BEFORE CERTAIN CONSONANTS IMPLIES (UNNATURALIZED) "i.." SOUND) + + mo = re.search(r"^(%s)" % A_y_cons, word, re.IGNORECASE) + if mo: + return "an %s" % word + + # OTHERWISE, GUESS "a" + return "a %s" % word + + # 2. TRANSLATE ZERO-QUANTIFIED $word TO "no plural($word)" + + def no(self, text, count=None): + """ + If count is 0, no, zero or nil, return 'no' followed by the plural + of text. + + If count is one of: + 1, a, an, one, each, every, this, that + return count followed by text. + + Otherwise return count follow by the plural of text. + + In the return value count is always followed by a space. + + Whitespace at the start and end is preserved. + + """ + if count is None and self.persistent_count is not None: + count = self.persistent_count + + if count is None: + count = 0 + mo = re.search(r"\A(\s*)(.+?)(\s*)\Z", text) + pre = mo.group(1) + word = mo.group(2) + post = mo.group(3) + + if str(count).lower() in pl_count_zero: + return "{}no {}{}".format(pre, self.plural(word, 0), post) + else: + return "{}{} {}{}".format(pre, count, self.plural(word, count), post) + + # PARTICIPLES + + def present_participle(self, word): + """ + Return the present participle for word. + + word is the 3rd person singular verb. + + """ + plv = self.plural_verb(word, 2) + + for pat, repl in ( + (r"ie$", r"y"), + (r"ue$", r"u"), # TODO: isn't ue$ -> u encompassed in the following rule? + (r"([auy])e$", r"\g<1>"), + (r"ski$", r"ski"), + (r"[^b]i$", r""), + (r"^(are|were)$", r"be"), + (r"^(had)$", r"hav"), + (r"^(hoe)$", r"\g<1>"), + (r"([^e])e$", r"\g<1>"), + (r"er$", r"er"), + (r"([^aeiou][aeiouy]([bdgmnprst]))$", r"\g<1>\g<2>"), + ): + (ans, num) = re.subn(pat, repl, plv) + if num: + return "%sing" % ans + return "%sing" % ans + + # NUMERICAL INFLECTIONS + + def ordinal(self, num): + """ + Return the ordinal of num. + + num can be an integer or text + + e.g. ordinal(1) returns '1st' + ordinal('one') returns 'first' + + """ + if re.match(r"\d", str(num)): + try: + num % 2 + n = num + except TypeError: + if "." in str(num): + try: + # numbers after decimal, + # so only need last one for ordinal + n = int(num[-1]) + + except ValueError: # ends with '.', so need to use whole string + n = int(num[:-1]) + else: + n = int(num) + try: + post = nth[n % 100] + except KeyError: + post = nth[n % 10] + return "{}{}".format(num, post) + else: + mo = re.search(r"(%s)\Z" % ordinal_suff, num) + try: + post = ordinal[mo.group(1)] + return re.sub(r"(%s)\Z" % ordinal_suff, post, num) + except AttributeError: + return "%sth" % num + + def millfn(self, ind=0): + if ind > len(mill) - 1: + print3("number out of range") + raise NumOutOfRangeError + return mill[ind] + + def unitfn(self, units, mindex=0): + return "{}{}".format(unit[units], self.millfn(mindex)) + + def tenfn(self, tens, units, mindex=0): + if tens != 1: + return "{}{}{}{}".format( + ten[tens], + "-" if tens and units else "", + unit[units], + self.millfn(mindex), + ) + return "{}{}".format(teen[units], mill[mindex]) + + def hundfn(self, hundreds, tens, units, mindex): + if hundreds: + andword = " %s " % self.number_args["andword"] if tens or units else "" + return "{} hundred{}{}{}, ".format( + unit[hundreds], # use unit not unitfn as simpler + andword, + self.tenfn(tens, units), + self.millfn(mindex), + ) + if tens or units: + return "{}{}, ".format(self.tenfn(tens, units), self.millfn(mindex)) + return "" + + def group1sub(self, mo): + units = int(mo.group(1)) + if units == 1: + return " %s, " % self.number_args["one"] + elif units: + return "%s, " % unit[units] + else: + return " %s, " % self.number_args["zero"] + + def group1bsub(self, mo): + units = int(mo.group(1)) + if units: + return "%s, " % unit[units] + else: + return " %s, " % self.number_args["zero"] + + def group2sub(self, mo): + tens = int(mo.group(1)) + units = int(mo.group(2)) + if tens: + return "%s, " % self.tenfn(tens, units) + if units: + return " {} {}, ".format(self.number_args["zero"], unit[units]) + return " {} {}, ".format(self.number_args["zero"], self.number_args["zero"]) + + def group3sub(self, mo): + hundreds = int(mo.group(1)) + tens = int(mo.group(2)) + units = int(mo.group(3)) + if hundreds == 1: + hunword = " %s" % self.number_args["one"] + elif hundreds: + hunword = "%s" % unit[hundreds] + else: + hunword = " %s" % self.number_args["zero"] + if tens: + tenword = self.tenfn(tens, units) + elif units: + tenword = " {} {}".format(self.number_args["zero"], unit[units]) + else: + tenword = " {} {}".format( + self.number_args["zero"], self.number_args["zero"] + ) + return "{} {}, ".format(hunword, tenword) + + def hundsub(self, mo): + ret = self.hundfn( + int(mo.group(1)), int(mo.group(2)), int(mo.group(3)), self.mill_count + ) + self.mill_count += 1 + return ret + + def tensub(self, mo): + return "%s, " % self.tenfn(int(mo.group(1)), int(mo.group(2)), self.mill_count) + + def unitsub(self, mo): + return "%s, " % self.unitfn(int(mo.group(1)), self.mill_count) + + def enword(self, num, group): + # import pdb + # pdb.set_trace() + + if group == 1: + num = re.sub(r"(\d)", self.group1sub, num) + elif group == 2: + num = re.sub(r"(\d)(\d)", self.group2sub, num) + num = re.sub(r"(\d)", self.group1bsub, num, 1) + elif group == 3: + num = re.sub(r"(\d)(\d)(\d)", self.group3sub, num) + num = re.sub(r"(\d)(\d)", self.group2sub, num, 1) + num = re.sub(r"(\d)", self.group1sub, num, 1) + elif int(num) == 0: + num = self.number_args["zero"] + elif int(num) == 1: + num = self.number_args["one"] + else: + num = num.lstrip().lstrip("0") + self.mill_count = 0 + # surely there's a better way to do the next bit + mo = re.search(r"(\d)(\d)(\d)(?=\D*\Z)", num) + while mo: + num = re.sub(r"(\d)(\d)(\d)(?=\D*\Z)", self.hundsub, num, 1) + mo = re.search(r"(\d)(\d)(\d)(?=\D*\Z)", num) + num = re.sub(r"(\d)(\d)(?=\D*\Z)", self.tensub, num, 1) + num = re.sub(r"(\d)(?=\D*\Z)", self.unitsub, num, 1) + return num + + def blankfn(self, mo): + """ do a global blank replace + TODO: surely this can be done with an option to re.sub + rather than this fn + """ + return "" + + def commafn(self, mo): + """ do a global ',' replace + TODO: surely this can be done with an option to re.sub + rather than this fn + """ + return "," + + def spacefn(self, mo): + """ do a global ' ' replace + TODO: surely this can be done with an option to re.sub + rather than this fn + """ + return " " + + def number_to_words( + self, + num, + wantlist=False, + group=0, + comma=",", + andword="and", + zero="zero", + one="one", + decimal="point", + threshold=None, + ): + """ + Return a number in words. + + group = 1, 2 or 3 to group numbers before turning into words + comma: define comma + andword: word for 'and'. Can be set to ''. + e.g. "one hundred and one" vs "one hundred one" + zero: word for '0' + one: word for '1' + decimal: word for decimal point + threshold: numbers above threshold not turned into words + + parameters not remembered from last call. Departure from Perl version. + """ + self.number_args = dict(andword=andword, zero=zero, one=one) + num = "%s" % num + + # Handle "stylistic" conversions (up to a given threshold)... + if threshold is not None and float(num) > threshold: + spnum = num.split(".", 1) + while comma: + (spnum[0], n) = re.subn(r"(\d)(\d{3}(?:,|\Z))", r"\1,\2", spnum[0]) + if n == 0: + break + try: + return "{}.{}".format(spnum[0], spnum[1]) + except IndexError: + return "%s" % spnum[0] + + if group < 0 or group > 3: + raise BadChunkingOptionError + nowhite = num.lstrip() + if nowhite[0] == "+": + sign = "plus" + elif nowhite[0] == "-": + sign = "minus" + else: + sign = "" + + myord = num[-2:] in ("st", "nd", "rd", "th") + if myord: + num = num[:-2] + finalpoint = False + if decimal: + if group != 0: + chunks = num.split(".") + else: + chunks = num.split(".", 1) + if chunks[-1] == "": # remove blank string if nothing after decimal + chunks = chunks[:-1] + finalpoint = True # add 'point' to end of output + else: + chunks = [num] + + first = 1 + loopstart = 0 + + if chunks[0] == "": + first = 0 + if len(chunks) > 1: + loopstart = 1 + + for i in range(loopstart, len(chunks)): + chunk = chunks[i] + # remove all non numeric \D + chunk = re.sub(r"\D", self.blankfn, chunk) + if chunk == "": + chunk = "0" + + if group == 0 and (first == 0 or first == ""): + chunk = self.enword(chunk, 1) + else: + chunk = self.enword(chunk, group) + + if chunk[-2:] == ", ": + chunk = chunk[:-2] + chunk = re.sub(r"\s+,", self.commafn, chunk) + + if group == 0 and first: + chunk = re.sub(r", (\S+)\s+\Z", " %s \\1" % andword, chunk) + chunk = re.sub(r"\s+", self.spacefn, chunk) + # chunk = re.sub(r"(\A\s|\s\Z)", self.blankfn, chunk) + chunk = chunk.strip() + if first: + first = "" + chunks[i] = chunk + + numchunks = [] + if first != 0: + numchunks = chunks[0].split("%s " % comma) + + if myord and numchunks: + # TODO: can this be just one re as it is in perl? + mo = re.search(r"(%s)\Z" % ordinal_suff, numchunks[-1]) + if mo: + numchunks[-1] = re.sub( + r"(%s)\Z" % ordinal_suff, ordinal[mo.group(1)], numchunks[-1] + ) + else: + numchunks[-1] += "th" + + for chunk in chunks[1:]: + numchunks.append(decimal) + numchunks.extend(chunk.split("%s " % comma)) + + if finalpoint: + numchunks.append(decimal) + + # wantlist: Perl list context. can explictly specify in Python + if wantlist: + if sign: + numchunks = [sign] + numchunks + return numchunks + elif group: + signout = "%s " % sign if sign else "" + return "{}{}".format(signout, ", ".join(numchunks)) + else: + signout = "%s " % sign if sign else "" + num = "{}{}".format(signout, numchunks.pop(0)) + if decimal is None: + first = True + else: + first = not num.endswith(decimal) + for nc in numchunks: + if nc == decimal: + num += " %s" % nc + first = 0 + elif first: + num += "{} {}".format(comma, nc) + else: + num += " %s" % nc + return num + + # Join words with commas and a trailing 'and' (when appropriate)... + + def join( + self, + words, + sep=None, + sep_spaced=True, + final_sep=None, + conj="and", + conj_spaced=True, + ): + """ + Join words into a list. + + e.g. join(['ant', 'bee', 'fly']) returns 'ant, bee, and fly' + + options: + conj: replacement for 'and' + sep: separator. default ',', unless ',' is in the list then ';' + final_sep: final separator. default ',', unless ',' is in the list then ';' + conj_spaced: boolean. Should conj have spaces around it + + """ + if not words: + return "" + if len(words) == 1: + return words[0] + + if conj_spaced: + if conj == "": + conj = " " + else: + conj = " %s " % conj + + if len(words) == 2: + return "{}{}{}".format(words[0], conj, words[1]) + + if sep is None: + if "," in "".join(words): + sep = ";" + else: + sep = "," + if final_sep is None: + final_sep = sep + + final_sep = "{}{}".format(final_sep, conj) + + if sep_spaced: + sep += " " + + return "{}{}{}".format(sep.join(words[0:-1]), final_sep, words[-1]) diff --git a/Licenses/inflect/LICENSE b/Licenses/inflect/LICENSE new file mode 100644 index 000000000..5e795a61f --- /dev/null +++ b/Licenses/inflect/LICENSE @@ -0,0 +1,7 @@ +Copyright Jason R. Coombs + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From 45d723348504ca5174343f649419fce46832d156 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 9 Dec 2018 17:29:48 +0100 Subject: [PATCH 354/710] providers: subscene: fix searching; search by release name is currently broken; support year hint for movies --- .../subliminal_patch/providers/subscene.py | 23 ++++++++++++----- .../Libraries/Shared/subscene_api/subscene.py | 25 +++++++++++++++---- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 9f00975d6..27632ddfe 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -4,6 +4,7 @@ import logging import os import time +import inflect from random import randint from zipfile import ZipFile @@ -20,6 +21,8 @@ from subscene_api.subscene import search, Subtitle as APISubtitle from subzero.language import Language +p = inflect.engine() + language_converters.register('subscene = subliminal_patch.converters.subscene:SubsceneConverter') logger = logging.getLogger(__name__) @@ -191,17 +194,20 @@ def parse_results(self, video, film): return subtitles def query(self, video): - vfn = get_video_filename(video) - logger.debug(u"Searching for: %s", vfn) - film = search(vfn, session=self.session) + #vfn = get_video_filename(video) + + # logger.debug(u"Searching for: %s", vfn) + # film = search(vfn, session=self.session) + # if film and film.subtitles: + # subtitles = self.parse_results(video, film) subtitles = [] - if film and film.subtitles: - subtitles = self.parse_results(video, film) # re-search for episodes without explicit release name + # fixme: searching by release name and pack is currently broken if isinstance(video, Episode): - term = u"%s S%02iE%02i" % (video.series, video.season, video.episode) + #term = u"%s S%02iE%02i" % (video.series, video.season, video.episode) + term = u"%s - %s Season" % (video.series, p.number_to_words("%sth" % video.season).capitalize()) time.sleep(self.search_throttle) logger.debug('Searching for alternative results: %s', term) film = search(term, session=self.session) @@ -218,6 +224,11 @@ def query(self, video): subtitles += self.parse_results(video, film) else: logger.debug("Not searching for packs, because the season hasn't fully aired") + else: + logger.debug('Searching for movie results: %s', video.title) + film = search(video.title, year=video.year, session=self.session, limit_to=None) + if film and film.subtitles: + subtitles += self.parse_results(video, film) logger.info("%s subtitles found" % len(subtitles)) return subtitles diff --git a/Contents/Libraries/Shared/subscene_api/subscene.py b/Contents/Libraries/Shared/subscene_api/subscene.py index b59783a4b..490c52196 100644 --- a/Contents/Libraries/Shared/subscene_api/subscene.py +++ b/Contents/Libraries/Shared/subscene_api/subscene.py @@ -25,6 +25,7 @@ # imports import re + import enum import sys @@ -36,7 +37,7 @@ from contextlib import suppress from urllib2.request import Request, urlopen -from bs4 import BeautifulSoup +from bs4 import BeautifulSoup, NavigableString # constants HEADERS = { @@ -207,7 +208,7 @@ def section_exists(soup, section): return False -def get_first_film(soup, section, session=None): +def get_first_film(soup, section, year=None, session=None): tag_part = SectionsParts[section] tag = None @@ -220,11 +221,25 @@ def get_first_film(soup, section, session=None): if not tag: return - url = SITE_DOMAIN + tag.findNext("ul").find("li").div.a.get("href") + url = None + + if not year: + url = SITE_DOMAIN + tag.findNext("ul").find("li").div.a.get("href") + else: + for t in tag.findNext("ul").findAll("li"): + if isinstance(t, NavigableString) or not t.div: + continue + + if str(year) in t.div.a.string: + url = SITE_DOMAIN + t.div.a.get("href") + break + if not url: + return + return Film.from_url(url, session=session) -def search(term, session=None, limit_to=SearchTypes.Exact): +def search(term, session=None, year=None, limit_to=SearchTypes.Exact): soup = soup_for("%s/subtitles/title?q=%s" % (SITE_DOMAIN, term), session=session) if "Subtitle search by" in str(soup): @@ -234,7 +249,7 @@ def search(term, session=None, limit_to=SearchTypes.Exact): for junk, search_type in SearchTypes.__members__.items(): if section_exists(soup, search_type): - return get_first_film(soup, search_type) + return get_first_film(soup, search_type, year=year, session=session) if limit_to == search_type: return From 7d77870dafe297dcd10bfa0aca00eed361c0197d Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 9 Dec 2018 17:31:20 +0100 Subject: [PATCH 355/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index aaf21e938..95d43fa8f 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.4.2901 + 2.6.4.2905 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2901 DEV +Version 2.6.4.2905 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From a32a2cabd8442b24fcb7b6b2fda9fd8392d30e17 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 9 Dec 2018 17:55:36 +0100 Subject: [PATCH 356/710] providers: subscene: remove temporarily obsolete season pack search --- .../subliminal_patch/providers/subscene.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 27632ddfe..42499eccd 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -215,15 +215,15 @@ def query(self, video): subtitles += self.parse_results(video, film) # packs - if video.season_fully_aired: - term = u"%s S%02i" % (video.series, video.season) - logger.debug('Searching for packs: %s', term) - time.sleep(self.search_throttle) - film = search(term, session=self.session) - if film and film.subtitles: - subtitles += self.parse_results(video, film) - else: - logger.debug("Not searching for packs, because the season hasn't fully aired") + # if video.season_fully_aired: + # term = u"%s S%02i" % (video.series, video.season) + # logger.debug('Searching for packs: %s', term) + # time.sleep(self.search_throttle) + # film = search(term, session=self.session) + # if film and film.subtitles: + # subtitles += self.parse_results(video, film) + # else: + # logger.debug("Not searching for packs, because the season hasn't fully aired") else: logger.debug('Searching for movie results: %s', video.title) film = search(video.title, year=video.year, session=self.session, limit_to=None) From 10a7c327f088af49975defea3b88e4e82e792c03 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 16 Dec 2018 05:21:45 +0100 Subject: [PATCH 357/710] providers: subscene: re-enable search-features for subscene --- .../subliminal_patch/providers/subscene.py | 44 +++++++++++-------- .../Libraries/Shared/subscene_api/subscene.py | 4 +- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 42499eccd..38a97c579 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -194,39 +194,45 @@ def parse_results(self, video, film): return subtitles def query(self, video): - #vfn = get_video_filename(video) - - # logger.debug(u"Searching for: %s", vfn) - # film = search(vfn, session=self.session) - # if film and film.subtitles: - # subtitles = self.parse_results(video, film) - + vfn = get_video_filename(video) subtitles = [] + logger.debug(u"Searching for: %s", vfn) + film = search(vfn, session=self.session) + if film and film.subtitles: + logger.debug('Release results found: %s', len(film.subtitles)) + subtitles = self.parse_results(video, film) + else: + logger.debug('No release results found') # re-search for episodes without explicit release name - # fixme: searching by release name and pack is currently broken if isinstance(video, Episode): #term = u"%s S%02iE%02i" % (video.series, video.season, video.episode) term = u"%s - %s Season" % (video.series, p.number_to_words("%sth" % video.season).capitalize()) time.sleep(self.search_throttle) logger.debug('Searching for alternative results: %s', term) - film = search(term, session=self.session) + film = search(term, session=self.session, release=False) if film and film.subtitles: + logger.debug('Alternative results found: %s', len(film.subtitles)) subtitles += self.parse_results(video, film) + else: + logger.debug('No alternative results found') # packs - # if video.season_fully_aired: - # term = u"%s S%02i" % (video.series, video.season) - # logger.debug('Searching for packs: %s', term) - # time.sleep(self.search_throttle) - # film = search(term, session=self.session) - # if film and film.subtitles: - # subtitles += self.parse_results(video, film) - # else: - # logger.debug("Not searching for packs, because the season hasn't fully aired") + if video.season_fully_aired: + term = u"%s S%02i" % (video.series, video.season) + logger.debug('Searching for packs: %s', term) + time.sleep(self.search_throttle) + film = search(term, session=self.session) + if film and film.subtitles: + logger.debug('Pack results found: %s', len(film.subtitles)) + subtitles += self.parse_results(video, film) + else: + logger.debug('No pack results found') + else: + logger.debug("Not searching for packs, because the season hasn't fully aired") else: logger.debug('Searching for movie results: %s', video.title) - film = search(video.title, year=video.year, session=self.session, limit_to=None) + film = search(video.title, year=video.year, session=self.session, limit_to=None, release=False) if film and film.subtitles: subtitles += self.parse_results(video, film) diff --git a/Contents/Libraries/Shared/subscene_api/subscene.py b/Contents/Libraries/Shared/subscene_api/subscene.py index 490c52196..e57db3c44 100644 --- a/Contents/Libraries/Shared/subscene_api/subscene.py +++ b/Contents/Libraries/Shared/subscene_api/subscene.py @@ -239,8 +239,8 @@ def get_first_film(soup, section, year=None, session=None): return Film.from_url(url, session=session) -def search(term, session=None, year=None, limit_to=SearchTypes.Exact): - soup = soup_for("%s/subtitles/title?q=%s" % (SITE_DOMAIN, term), session=session) +def search(term, release=True, session=None, year=None, limit_to=SearchTypes.Exact): + soup = soup_for("%s/subtitles/%s?q=%s" % (SITE_DOMAIN, "release" if release else "title", term), session=session) if "Subtitle search by" in str(soup): rows = soup.find("table").tbody.find_all("tr") From 7ffe41ae9bf810e8828e1364be06e608c269aacc Mon Sep 17 00:00:00 2001 From: jippo015 <33925555+jippo015@users.noreply.github.com> Date: Wed, 26 Dec 2018 16:07:37 +0100 Subject: [PATCH 358/710] Fix: continue searching for embbeded subs after und is found --- Contents/Code/support/plex_media.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index 28b227b2a..b5e0e9e90 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -176,6 +176,7 @@ def get_all_parts(plex_item): def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_unknown=True): streams = [] + streams_unkown = [] has_unknown = False for stream in part.streams: # subtitle stream @@ -196,14 +197,19 @@ def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_ language = Language.rebuild(list(config.lang_list)[0], forced=is_forced) is_unknown = True has_unknown = True + streams_unkown.append({"stream": stream, "is_unknown": is_unknown, "language": language, + "is_forced": is_forced}) - if not requested_language or found_requested_language or has_unknown: + if not requested_language or found_requested_language: streams.append({"stream": stream, "is_unknown": is_unknown, "language": language, "is_forced": is_forced}) if found_requested_language: break + if has_unknown and not found_requested_language: + streams=streams_unkown + return streams From f64e7c1a613c089d6acd504f428c4109740a151e Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 5 Jan 2019 04:39:13 +0100 Subject: [PATCH 359/710] cleanup #608 --- Contents/Code/support/plex_media.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index b5e0e9e90..e1bc36ee6 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -176,8 +176,9 @@ def get_all_parts(plex_item): def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_unknown=True): streams = [] - streams_unkown = [] + streams_unknown = [] has_unknown = False + found_requested_language = False for stream in part.streams: # subtitle stream if stream.stream_type == 3 and not stream.stream_key and stream.codec in TEXT_SUBTITLE_EXTS: @@ -197,8 +198,8 @@ def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_ language = Language.rebuild(list(config.lang_list)[0], forced=is_forced) is_unknown = True has_unknown = True - streams_unkown.append({"stream": stream, "is_unknown": is_unknown, "language": language, - "is_forced": is_forced}) + streams_unknown.append({"stream": stream, "is_unknown": is_unknown, "language": language, + "is_forced": is_forced}) if not requested_language or found_requested_language: streams.append({"stream": stream, "is_unknown": is_unknown, "language": language, @@ -207,8 +208,8 @@ def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_ if found_requested_language: break - if has_unknown and not found_requested_language: - streams=streams_unkown + if streams_unknown and not found_requested_language: + streams = streams_unknown return streams From 2e808321545f9de5cbc236face506f44b0719b78 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 5 Jan 2019 04:48:28 +0100 Subject: [PATCH 360/710] release 2.6.4.2911 --- CHANGELOG.md | 14 ++++++++++++++ Contents/Info.plist | 4 ++-- README.md | 28 +++++++++++++++++----------- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 846b2e648..d1761cf79 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,18 @@ +2.6.4.2881 +- core: extract embedded: fix automatic extraction not actually writing the subtitles to disk under certain circumstances; fixes #598 +- core: sonarr/radarr: don't block the main thread while checking connectivity; fixes #597 +- providers: hosszupuska: fix inconsistent series naming (thanks @morpheus133) +- providers: opensubtitles: add advanced setting to optionally not skip subtitles with wrong FPS; fixes #578 + + +2.6.4.2864 +- core: scanning: don't fail on metadata subtitles with bad language code; fixes #596 +- providers: legendastv, napiprojekt, subscenter, tvsubtitles: fix "No language to search for" issue; fixes #596 +- menu: fix "ignore list list" +- menu: advanced: add skip next search all recently missing subtitles entry + + 2.6.4.2859 - core: fix thread.lock error (only affected the history menu, not the actual functionality) - core: fix audio-based conditional subtitle decision making; fixes #592 diff --git a/Contents/Info.plist b/Contents/Info.plist index 95d43fa8f..9711e853d 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.4.2905 + 2.6.4.2911 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2905 DEV +Version 2.6.4.2911 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 6edbe3523..a179ffce1 100644 --- a/README.md +++ b/README.md @@ -84,17 +84,23 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.4.2881 -- core: extract embedded: fix automatic extraction not actually writing the subtitles to disk under certain circumstances; fixes #598 -- core: sonarr/radarr: don't block the main thread while checking connectivity; fixes #597 -- providers: hosszupuska: fix inconsistent series naming (thanks @morpheus133) -- providers: opensubtitles: add advanced setting to optionally not skip subtitles with wrong FPS; fixes #578 - -2.6.4.2864 -- core: scanning: don't fail on metadata subtitles with bad language code; fixes #596 -- providers: legendastv, napiprojekt, subscenter, tvsubtitles: fix "No language to search for" issue; fixes #596 -- menu: fix "ignore list list" -- menu: advanced: add skip next search all recently missing subtitles entry +2.6.4.2911 +- core: improve file cache (windows especially); use fixed-length cache filenames; fixes #600 +- core: don't log "Checking connections ..." when sonarr/radarr not activated +- core: make logging for scanning/parsing/preparing videos more clear +- core: extract embedded: continue searching for embbedded subs after undefined language is found (thanks @jippo015) +- compat: core: don't assume hints["title"] exists +- compat: providers: podnapisi: loosen lxml requirement +- providers: addic7ed: fix not using user credentials; fixes #605 +- providers: titlovi: fix provider (thanks @viking1304) +- providers: subscene: fix provider +- providers: opensubtitles: improve token logging +- providers: podnapisi: fix searching for Marvel series +- submod: HI: correctly remove uppercase at start of a sentence when lead by a crocodile (>>) +- submod: HI: correctly remove lowercase inside brackets when HI matched as well +- submod: HI: remove multiple HI_before_colon_caps before one colon +- submod: common: also match music symbols after a crocodile; move crocodile removal up the chain + [older changes](CHANGELOG.md) From 2bf590b6c4277a2eebeed4011ef4b400a031ff24 Mon Sep 17 00:00:00 2001 From: panni Date: Sat, 5 Jan 2019 04:49:07 +0100 Subject: [PATCH 361/710] back from dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 9711e853d..f907e00b0 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ PlexPluginConsoleLogging 0 PlexPluginDevMode - 1 + 0 PlexPluginCodePolicy Elevated @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2911 DEV +Version 2.6.4.2911 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 39d442c2b3f24e6aa50ca673e007fd166a39766d Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 8 Jan 2019 13:05:04 +0100 Subject: [PATCH 362/710] core: SRT parsing: handle ASS color tag in SRT --- Contents/Libraries/Shared/pysubs2/ssastyle.py | 2 +- Contents/Libraries/Shared/pysubs2/substation.py | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/pysubs2/ssastyle.py b/Contents/Libraries/Shared/pysubs2/ssastyle.py index e43e1ff07..522f8ce0d 100644 --- a/Contents/Libraries/Shared/pysubs2/ssastyle.py +++ b/Contents/Libraries/Shared/pysubs2/ssastyle.py @@ -56,7 +56,7 @@ def __init__(self, **fields): self.encoding = 1 #: Charset for k, v in fields.items(): - if k in self.FIELDS: + if k in self.FIELDS and v is not None: setattr(self, k, v) else: raise ValueError("SSAStyle has no field named %r" % k) diff --git a/Contents/Libraries/Shared/pysubs2/substation.py b/Contents/Libraries/Shared/pysubs2/substation.py index 0e5a1b707..fc4172a49 100644 --- a/Contents/Libraries/Shared/pysubs2/substation.py +++ b/Contents/Libraries/Shared/pysubs2/substation.py @@ -150,7 +150,14 @@ def string_to_field(f, v): if format_ == "ass": return ass_rgba_to_color(v) else: - return ssa_rgb_to_color(v) + try: + return ssa_rgb_to_color(v) + except ValueError: + try: + return ass_rgba_to_color(v) + except: + return Color(255, 255, 255, 0) + elif f in {"bold", "underline", "italic", "strikeout"}: return v == "-1" elif f in {"borderstyle", "encoding", "marginl", "marginr", "marginv", "layer", "alphalevel"}: From 48cafadbdd63ff13e3628bc5e023f05c782095b3 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 13 Jan 2019 04:36:03 +0100 Subject: [PATCH 363/710] core: auto extract embedded: only use one unknown sub for first language --- Contents/Code/__init__.py | 6 +++++- Contents/Code/support/plex_media.py | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 84005ec5a..5d86b80d1 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -118,16 +118,20 @@ def agent_extract_embedded(video_part_map): for plexapi_part in get_all_parts(plexapi_item): item_count = item_count + 1 + used_one_unknown_stream = False for requested_language in config.lang_list: embedded_subs = stored_subs.get_by_provider(plexapi_part.id, requested_language, "embedded") current = stored_subs.get_any(plexapi_part.id, requested_language) or \ requested_language in scanned_video.external_subtitle_languages if not embedded_subs: - stream_data = get_embedded_subtitle_streams(plexapi_part, requested_language=requested_language) + stream_data = get_embedded_subtitle_streams(plexapi_part, requested_language=requested_language, + skip_unknown=used_one_unknown_stream) if stream_data: stream = stream_data[0]["stream"] + if stream_data["is_unknown"]: + used_one_unknown_stream = True to_extract.append(({scanned_video: part_info}, plexapi_part, str(stream.index), str(requested_language), not current)) diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index e1bc36ee6..1dd8a4db3 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -174,7 +174,7 @@ def get_all_parts(plex_item): return parts -def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_unknown=True): +def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_unknown=True, skip_unknown=False): streams = [] streams_unknown = [] has_unknown = False @@ -208,7 +208,7 @@ def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_ if found_requested_language: break - if streams_unknown and not found_requested_language: + if streams_unknown and not found_requested_language and not skip_unknown: streams = streams_unknown return streams From 535b1aaba907a4dcb124d6b8691c44a8d3eed58a Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 13 Jan 2019 04:51:13 +0100 Subject: [PATCH 364/710] core: better embedded streams language detection --- Contents/Code/support/helpers.py | 4 +++- Contents/Libraries/Shared/subzero/language.py | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 1e5d4493f..6c42f3564 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -15,7 +15,7 @@ import chardet from bs4 import UnicodeDammit -from subzero.language import Language +from subzero.language import Language, language_from_stream from subzero.analytics import track_event mswindows = (sys.platform == "win32") @@ -388,6 +388,8 @@ def get_language_from_stream(lang_code): if lang and lang != "xx": # Log.Debug("Found language: %r", lang) return Language.fromietf(lang) + elif lang: + return language_from_stream(lang) def audio_streams_match_languages(video, languages): diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index f520f6dad..8d096e19d 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -4,7 +4,6 @@ from babelfish.exceptions import LanguageError from babelfish import Language as Language_, basestr - repl_map = { "dk": "da", "nld": "nl", From 291e210e63fb5f554f924e55a0a23d22af0a7b73 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 13 Jan 2019 04:52:05 +0100 Subject: [PATCH 365/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 9711e853d..4e9455634 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.4.2911 + 2.6.4.2915 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2911 DEV +Version 2.6.4.2915 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From d3279ef923ff7dab4e330ae496e05236d873f278 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 13 Jan 2019 05:07:10 +0100 Subject: [PATCH 366/710] return None on LanguageError --- Contents/Code/support/helpers.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 6c42f3564..e7f4fd612 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -12,6 +12,8 @@ import sys from collections import OrderedDict +from babelfish.exceptions import LanguageError + import chardet from bs4 import UnicodeDammit @@ -389,7 +391,10 @@ def get_language_from_stream(lang_code): # Log.Debug("Found language: %r", lang) return Language.fromietf(lang) elif lang: - return language_from_stream(lang) + try: + return language_from_stream(lang) + except LanguageError: + pass def audio_streams_match_languages(video, languages): From 29bafc621566f1fab826556adfd08256fad03a7b Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 15 Jan 2019 13:41:58 +0100 Subject: [PATCH 367/710] core: add is_valid shortcut --- Contents/Libraries/Shared/subliminal_patch/subtitle.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index d2b25674b..4475c8893 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -44,6 +44,7 @@ class Subtitle(Subtitle_): pack_data = None _guessed_encoding = None + _is_valid = False def __init__(self, language, hearing_impaired=False, page_link=None, encoding=None, mods=None): super(Subtitle, self).__init__(language, hearing_impaired=hearing_impaired, page_link=page_link, @@ -212,6 +213,9 @@ def is_valid(self): :rtype: bool """ + if self._is_valid: + return True + text = self.text if not text: return False @@ -222,6 +226,7 @@ def is_valid(self): except Exception: logger.error("PySRT-parsing failed, trying pysubs2") else: + self._is_valid = True return True # something else, try to return srt @@ -247,6 +252,7 @@ def is_valid(self): logger.exception("Couldn't convert subtitle %s to .srt format: %s", self, traceback.format_exc()) return False + self._is_valid = True return True @classmethod From 20c04f32be5078800cf0d9422cb0cecb7bc73eac Mon Sep 17 00:00:00 2001 From: panni Date: Tue, 15 Jan 2019 13:43:33 +0100 Subject: [PATCH 368/710] core: set _is_valid to False by default --- Contents/Libraries/Shared/subliminal_patch/subtitle.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 4475c8893..9a165fe4b 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -50,6 +50,7 @@ def __init__(self, language, hearing_impaired=False, page_link=None, encoding=No super(Subtitle, self).__init__(language, hearing_impaired=hearing_impaired, page_link=page_link, encoding=encoding) self.mods = mods + self._is_valid = False def __repr__(self): return '<%s %r [%s:%s]>' % ( From 6c3bf03bc39914492c35e78dc07f33f6ef36d2e6 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 Jan 2019 11:59:01 +0100 Subject: [PATCH 369/710] core: extract embedded: fix is_unknown check --- Contents/Code/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 5d86b80d1..00e1f5a8f 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -130,7 +130,7 @@ def agent_extract_embedded(video_part_map): if stream_data: stream = stream_data[0]["stream"] - if stream_data["is_unknown"]: + if stream_data[0]["is_unknown"]: used_one_unknown_stream = True to_extract.append(({scanned_video: part_info}, plexapi_part, str(stream.index), From d725c87caedbc33dd94f090ee84410d34bae9ea2 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 Jan 2019 14:00:15 +0100 Subject: [PATCH 370/710] providers: subscene: don't fail on missing cover --- Contents/Libraries/Shared/subscene_api/subscene.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subscene_api/subscene.py b/Contents/Libraries/Shared/subscene_api/subscene.py index e57db3c44..e2b14ea26 100644 --- a/Contents/Libraries/Shared/subscene_api/subscene.py +++ b/Contents/Libraries/Shared/subscene_api/subscene.py @@ -176,8 +176,12 @@ def from_url(cls, url, session=None): content = soup.find("div", "subtitles") header = content.find("div", "box clearfix") + cover = None - cover = header.find("div", "poster").img.get("src") + try: + cover = header.find("div", "poster").img.get("src") + except AttributeError: + pass title = header.find("div", "header").h2.text[:-12].strip() From 9e3227ba0b001e4be464895467885dd717f78227 Mon Sep 17 00:00:00 2001 From: panni Date: Fri, 25 Jan 2019 14:00:53 +0100 Subject: [PATCH 371/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 4e9455634..5b3877207 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ CFBundleSignature ???? CFBundleVersion - 2.6.4.2915 + 2.6.4.2921 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2915 DEV +Version 2.6.4.2921 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 95ad5b6fbeed0a575c16e8da71b176b9a9e1ad67 Mon Sep 17 00:00:00 2001 From: panni Date: Sun, 27 Jan 2019 04:09:43 +0100 Subject: [PATCH 372/710] core: don't raise exception when subtitle not found inside archive --- Contents/Libraries/Shared/subliminal_patch/providers/mixins.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/mixins.py b/Contents/Libraries/Shared/subliminal_patch/providers/mixins.py index 8e1f06fd4..255caa447 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/mixins.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/mixins.py @@ -148,7 +148,8 @@ def get_subtitle_from_archive(self, subtitle, archive): subs_fallback.append(sub_name) if not matching_sub and not subs_unsure and not subs_fallback: - raise ProviderError("None of expected subtitle found in archive") + logger.error("None of expected subtitle found in archive") + return elif subs_unsure: matching_sub = subs_unsure[0] From 5a5aa510c55239717184bc49635393cb529af98e Mon Sep 17 00:00:00 2001 From: viking1304 Date: Mon, 4 Feb 2019 23:41:19 +0100 Subject: [PATCH 373/710] Log exceptions that might happen while getting search results Use random user agent string --- .../Shared/subliminal_patch/providers/titlovi.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index 8e2a31c65..67a308396 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -25,6 +25,9 @@ from subliminal.subtitle import fix_line_ending from subzero.language import Language +from random import randint +from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST + # parsing regex definitions title_re = re.compile(r'(?P(?:.+(?= [Aa][Kk][Aa] ))|.+)(?:(?:.+)(?P<altitle>(?<= [Aa][Kk][Aa] ).+))?') lang_re = re.compile(r'(?<=flags/)(?P<lang>.{2})(?:.)(?P<script>c?)(?:.+)') @@ -134,8 +137,8 @@ class TitloviProvider(Provider, ProviderSubtitleArchiveMixin): def initialize(self): self.session = Session() - self.session.headers['User-Agent'] = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3)' \ - 'Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)' + logger.debug("Using random user agents") + self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)] logger.debug('User-Agent set to %s', self.session.headers['User-Agent']) self.session.headers['Referer'] = self.server_url logger.debug('Referer set to %s', self.session.headers['Referer']) @@ -178,7 +181,10 @@ def query(self, languages, title, season=None, episode=None, year=None, video=No try: r = self.session.get(self.search_url, params=params, timeout=10) r.raise_for_status() + except r.exceptions.RequestException as e: + logger.exception('RequestException %s', e) + try: soup = BeautifulSoup(r.content, 'lxml') # number of results From dc6770ecaae3bfc026dffcb7e0e9ad8cc8d50b54 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 8 Feb 2019 17:33:02 +0100 Subject: [PATCH 374/710] providers: titlovi: fix possibly inexistant reference; break loop on exception --- .../Libraries/Shared/subliminal_patch/providers/titlovi.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index 67a308396..ec339fef8 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -11,7 +11,7 @@ from zipfile import ZipFile, is_zipfile from rarfile import RarFile, is_rarfile from babelfish import language_converters, Script -from requests import Session +from requests import Session, RequestException from guessit import guessit from subliminal_patch.providers import Provider from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin @@ -181,8 +181,9 @@ def query(self, languages, title, season=None, episode=None, year=None, video=No try: r = self.session.get(self.search_url, params=params, timeout=10) r.raise_for_status() - except r.exceptions.RequestException as e: + except RequestException as e: logger.exception('RequestException %s', e) + break try: soup = BeautifulSoup(r.content, 'lxml') From 508810d5c7617efe8b1d5c7453070232f761bd62 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 8 Feb 2019 17:38:41 +0100 Subject: [PATCH 375/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 5b3877207..a52e9cc61 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.4.2921</string> + <string>2.6.4.2927</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2921 DEV +Version 2.6.4.2927 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From df2bc9767c5f15239e446027ab93a94c3f0a48ea Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 27 Feb 2019 22:03:19 +0100 Subject: [PATCH 376/710] core: search external subtitles: fix condition --- Contents/Libraries/Shared/subliminal_patch/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 9fe8587d9..16e8f22c0 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -600,7 +600,7 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen logger.error('Cannot parse language code %r', language_code) language = None - if not language and only_one: + elif not language_code and only_one: language = Language.rebuild(list(languages)[0], forced=forced) subtitles[p] = language From d9b36c0616cbe06959123a314da36706bdeba0cf Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 2 Mar 2019 01:34:02 +0100 Subject: [PATCH 377/710] core: better plex transcoder path detection --- Contents/Code/support/config.py | 37 ++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index e95eb7e25..e6a796de6 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -988,27 +988,34 @@ def set_activity_modes(self): self.activity_mode = "next_episode" def get_plex_transcoder(self): + paths = [] base_path = os.environ.get("PLEX_MEDIA_SERVER_HOME", None) - if not base_path: - # fall back to bundled plugins path - bundle_path = os.environ.get("PLEXBUNDLEDPLUGINSPATH", None) - if bundle_path: - base_path = os.path.normpath(os.path.join(bundle_path, "..", "..")) + if base_path: + paths.append(base_path) + + bundle_path = os.environ.get("PLEXBUNDLEDPLUGINSPATH", None) + if bundle_path: + paths.append(os.path.normpath(os.path.join(bundle_path, "..", ".."))) + + paths.append(self.app_support_path) + bn = ("Plex Transcoder",) if sys.platform == "darwin": - fn = os.path.join(base_path, "MacOS", "Plex Transcoder") + bn = ("MacOS", bn) elif mswindows: - fn = os.path.join(base_path, "plextranscoder.exe") - else: - fn = os.path.join(base_path, "Plex Transcoder") + bn = ("plextranscoder.exe",) + + for path in paths: + fn = os.path.join(path, *bn) - if os.path.isfile(fn): - return fn + if os.path.isfile(fn): + return fn - # look inside Resources folder as fallback, as well - fn = os.path.join(base_path, "Resources", "Plex Transcoder") - if os.path.isfile(fn): - return fn + # look inside Resources folder as fallback, as well + for vbn in ("Plex Transcoder", "plextranscoder.exe"): + fn = os.path.join(path, "Resources", vbn) + if os.path.isfile(fn): + return fn def parse_rename_mode(self): # fixme: exact_filenames should be determined via callback combined with info about the current video From 6f87037c7897054254fb8f0dfc56ddd8294291b2 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 2 Mar 2019 01:35:54 +0100 Subject: [PATCH 378/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index a52e9cc61..df505098b 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.4.2927</string> + <string>2.6.4.2930</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2927 DEV +Version 2.6.4.2930 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 089618b8a6a80d8d5746d7748a88763dc906aa3d Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 2 Mar 2019 02:47:49 +0100 Subject: [PATCH 379/710] core: use Log.Warn instead of Log.Warning --- Contents/Code/__init__.py | 2 +- Contents/Code/support/storage.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 00e1f5a8f..833801fd2 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -228,7 +228,7 @@ def update(self, metadata, media, lang): if config.plex_transcoder: agent_extract_embedded(scanned_video_part_map) else: - Log.Warning("Plex Transcoder not found, can't auto extract") + Log.Warn("Plex Transcoder not found, can't auto extract") # clear missing subtitles menu data if not scheduler.is_task_running("MissingSubtitles"): diff --git a/Contents/Code/support/storage.py b/Contents/Code/support/storage.py index d7edc5cb2..1adfa733c 100644 --- a/Contents/Code/support/storage.py +++ b/Contents/Code/support/storage.py @@ -33,7 +33,7 @@ def store_subtitle_info(scanned_video_part_map, downloaded_subtitles, storage_ty video_id = str(video.id) plex_item = get_item(video_id) if not plex_item: - Log.Warning("Plex item not found: %s", video_id) + Log.Warn("Plex item not found: %s", video_id) continue metadata = video.plexapi_metadata From 8f6540118bd412ba781ef2955ad8c8cc8eb17729 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 2 Mar 2019 22:37:00 +0100 Subject: [PATCH 380/710] core: also check for "plex transcoder.exe" in case of windows --- Contents/Code/support/config.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index e6a796de6..47752e404 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -999,24 +999,27 @@ def get_plex_transcoder(self): paths.append(self.app_support_path) - bn = ("Plex Transcoder",) + bns = [] if sys.platform == "darwin": - bn = ("MacOS", bn) + bns.append(("MacOS", "Plex Transcoder")) elif mswindows: - bn = ("plextranscoder.exe",) + bns = [("plextranscoder.exe",), ("plex transcoder.exe",)] + else: + bns.append(("Plex Transcoder",)) for path in paths: - fn = os.path.join(path, *bn) - - if os.path.isfile(fn): - return fn + for bn in bns: + fn = os.path.join(path, *bn) - # look inside Resources folder as fallback, as well - for vbn in ("Plex Transcoder", "plextranscoder.exe"): - fn = os.path.join(path, "Resources", vbn) if os.path.isfile(fn): return fn + # look inside Resources folder as fallback, as well + for vbn in ("Plex Transcoder", "plextranscoder.exe"): + fn = os.path.join(path, "Resources", vbn) + if os.path.isfile(fn): + return fn + def parse_rename_mode(self): # fixme: exact_filenames should be determined via callback combined with info about the current video # (original_name) From 4f11fa53cde9c72d9dfeebb5c25628587991b30c Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 2 Mar 2019 22:56:17 +0100 Subject: [PATCH 381/710] core: indentation fix --- Contents/Code/support/config.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 47752e404..40ef85d06 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -1014,11 +1014,11 @@ def get_plex_transcoder(self): if os.path.isfile(fn): return fn - # look inside Resources folder as fallback, as well - for vbn in ("Plex Transcoder", "plextranscoder.exe"): - fn = os.path.join(path, "Resources", vbn) - if os.path.isfile(fn): - return fn + # look inside Resources folder as fallback, as well + for vbn in ("Plex Transcoder", "plextranscoder.exe", "plex transcoder.exe"): + fn = os.path.join(path, "Resources", vbn) + if os.path.isfile(fn): + return fn def parse_rename_mode(self): # fixme: exact_filenames should be determined via callback combined with info about the current video From 01a5d71b4a18886ff76fd232c406fc5189b5f5f1 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 2 Mar 2019 23:01:00 +0100 Subject: [PATCH 382/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index df505098b..1b3e275b2 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.4.2930</string> + <string>2.6.4.2934</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2930 DEV +Version 2.6.4.2934 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 1d9a2ff6fcf06ef29b97446f0327aa5e9be7ac7a Mon Sep 17 00:00:00 2001 From: GJ <gertjancom@gmail.com> Date: Mon, 4 Mar 2019 17:01:35 +0100 Subject: [PATCH 383/710] Fix issue scandir not returning the name of the file inside Docker images on ARM systems. --- Contents/Libraries/Shared/subliminal_patch/core.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 16e8f22c0..32a7fb6be 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -559,6 +559,9 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen subtitles = {} _scandir = _scandir_generic if scandir_generic else scandir for entry in _scandir(dirpath): + if not entry.name and not scandir_generic: + logger.debug('Could not determine the name of the file, retrying with scandir_generic') + return _search_external_subtitles(path, languages, only_one, True) if not entry.is_file(follow_symlinks=False): continue From a70f9c0673f763453872d7b72669247a3d5f6e02 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Mon, 4 Mar 2019 18:02:06 +0100 Subject: [PATCH 384/710] compat: use lowercase paths on subtitle detection --- Contents/Libraries/Shared/subliminal_patch/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 32a7fb6be..5dda9fb3c 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -568,7 +568,7 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen p = entry.name # keep only valid subtitle filenames - if not p.startswith(fileroot) or not p.endswith(SUBTITLE_EXTENSIONS): + if not p.lower().startswith(fileroot.lower()) or not p.lower().endswith(SUBTITLE_EXTENSIONS): continue p_root, p_ext = os.path.splitext(p) From 2c4b68d7190811bedb353e623f42a4958e36e74d Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 17 Mar 2019 22:32:46 +0100 Subject: [PATCH 385/710] core: also clean PYTHONHOME when calling external notification app --- Contents/Code/support/helpers.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index e7f4fd612..ca37a7fbf 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -286,6 +286,7 @@ def notify_executable(exe_info, videos, subtitles, storage): "subtitle_language", "subtitle_path", "subtitle_filename", "provider", "score", "storage", "series_id", "series", "title", "section", "filename", "path", "folder", "season_id", "type", "id", "season" ) + to_clean = ("PYTHONPATH", "PYTHONHOME") exe, arguments = exe_info for video, video_subtitles in subtitles.items(): for subtitle in video_subtitles: @@ -321,8 +322,9 @@ def notify_executable(exe_info, videos, subtitles, storage): env = dict(os.environ) # clean out any Plex-PYTHONPATH that may bleed through the spawned process - if "PYTHONPATH" in env and "plex" in env["PYTHONPATH"].lower(): - del env["PYTHONPATH"] + for v in to_clean: + if v in env and "plex" in env[v].lower(): + del env[v] try: proc = subprocess.Popen(quote_args([exe] + prepared_arguments), stdout=subprocess.PIPE, From 2ea27f2597c3ee1cf03f73ab57fe8772915e8a1a Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 3 Apr 2019 15:49:46 +0200 Subject: [PATCH 386/710] providers: drop support for addic7ed for now --- Contents/Code/support/config.py | 12 +++---- Contents/DefaultPrefs.json | 58 --------------------------------- 2 files changed, 6 insertions(+), 64 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 40ef85d06..5a1d0e9d4 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -751,7 +751,7 @@ def providers_by_prefs(self): # 'thesubdb': Prefs['provider.thesubdb.enabled'], 'podnapisi': cast_bool(Prefs['provider.podnapisi.enabled']), 'titlovi': cast_bool(Prefs['provider.titlovi.enabled']), - 'addic7ed': cast_bool(Prefs['provider.addic7ed.enabled']), + #'addic7ed': cast_bool(Prefs['provider.addic7ed.enabled']), 'tvsubtitles': cast_bool(Prefs['provider.tvsubtitles.enabled']), 'legendastv': cast_bool(Prefs['provider.legendastv.enabled']), 'napiprojekt': cast_bool(Prefs['provider.napiprojekt.enabled']), @@ -779,7 +779,7 @@ def get_providers(self, media_type="series"): # ditch non-forced-subtitles-reporting providers providers_forced_off = {} if self.forced_only: - providers["addic7ed"] = False + #providers["addic7ed"] = False providers["tvsubtitles"] = False providers["legendastv"] = False providers["napiprojekt"] = False @@ -836,10 +836,10 @@ def get_provider_settings(self): os_skip_wrong_fps = self.advanced.providers.opensubtitles.skip_wrong_fps \ if self.advanced.providers.opensubtitles.skip_wrong_fps is not None else True - provider_settings = {'addic7ed': {'username': Prefs['provider.addic7ed.username'], - 'password': Prefs['provider.addic7ed.password'], - 'use_random_agents': cast_bool(Prefs['provider.addic7ed.use_random_agents1']), - }, + provider_settings = {#'addic7ed': {'username': Prefs['provider.addic7ed.username'], + # 'password': Prefs['provider.addic7ed.password'], + # 'use_random_agents': cast_bool(Prefs['provider.addic7ed.use_random_agents1']), + # }, 'opensubtitles': {'username': Prefs['provider.opensubtitles.username'], 'password': Prefs['provider.opensubtitles.password'], 'use_tag_search': self.exact_filenames, diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 2f34c753c..cde426987 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -311,64 +311,6 @@ "type": "bool", "default": "true" }, - { - "id": "provider.addic7ed.enabled", - "label": "Provider: Enable Addic7ed", - "type": "bool", - "default": "true" - }, - { - "id": "provider.addic7ed.username", - "label": "Addic7ed Username", - "type": "text", - "default": "" - }, - { - "id": "provider.addic7ed.password", - "label": "Addic7ed Password", - "type": "text", - "option": "hidden", - "default": "", - "secure": "true" - }, - { - "id": "provider.addic7ed.boost_by2", - "label": "Addic7ed: boost score (if requirements met)", - "type": "enum", - "values": [ - "100", - "95", - "90", - "85", - "80", - "75", - "70", - "67", - "65", - "60", - "55", - "50", - "45", - "40", - "35", - "30", - "25", - "21", - "20", - "19", - "15", - "10", - "5", - "0" - ], - "default": "19" - }, - { - "id": "provider.addic7ed.use_random_agents1", - "label": "Addic7ed: Use random user agents", - "type": "bool", - "default": "true" - }, { "id": "provider.legendastv.enabled", "label": "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", From 253d09973851fdee5f3b436bc01a56c23e951bf7 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 3 Apr 2019 15:50:39 +0200 Subject: [PATCH 387/710] providers: opensubtitles: fix only_foreign handling --- .../Shared/subliminal_patch/providers/opensubtitles.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index 376c8ce19..032b89058 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -296,8 +296,8 @@ def query(self, languages, hash=None, size=None, imdb_id=None, query=None, seaso elif not only_foreign and not also_foreign and foreign_parts_only: continue - # foreign/forced *also* wanted - elif also_foreign and foreign_parts_only: + # set subtitle language to forced if it's foreign_parts_only + elif (also_foreign or only_foreign) and foreign_parts_only: language = Language.rebuild(language, forced=True) if language not in languages: From 63545ee7327bbd4ac18761da5422a26a1e2652c1 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 3 Apr 2019 15:51:06 +0200 Subject: [PATCH 388/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 1b3e275b2..8f6cab9d0 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.4.2934</string> + <string>2.6.4.2941</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2934 DEV +Version 2.6.4.2941 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From b0443dc81259396251dec2c7902257c9e00f2521 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 3 Apr 2019 21:18:04 +0200 Subject: [PATCH 389/710] forgot patch --- Contents/Code/support/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 5a1d0e9d4..d3688453b 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -1079,7 +1079,7 @@ def init_subliminal_patches(self): subliminal_patch.core.INCLUDE_EXOTIC_SUBS = self.exotic_ext subliminal_patch.core.DOWNLOAD_TRIES = int(Prefs['subtitles.try_downloads']) - subliminal.score.episode_scores["addic7ed_boost"] = int(Prefs['provider.addic7ed.boost_by2']) + #subliminal.score.episode_scores["addic7ed_boost"] = int(Prefs['provider.addic7ed.boost_by2']) if self.use_custom_dns: subliminal_patch.http.set_custom_resolver() From df65bae58fa73866f4fe7e5c5e56171adb0da03a Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 02:47:07 +0200 Subject: [PATCH 390/710] core: update certifi to 2019.3.9 (may fix #610) --- Contents/Libraries/Shared/certifi/__init__.py | 4 +- Contents/Libraries/Shared/certifi/cacert.pem | 388 ++++++++++++++++++ Contents/Libraries/Shared/certifi/core.py | 22 - 3 files changed, 390 insertions(+), 24 deletions(-) diff --git a/Contents/Libraries/Shared/certifi/__init__.py b/Contents/Libraries/Shared/certifi/__init__.py index 50f2e1301..632db8e13 100644 --- a/Contents/Libraries/Shared/certifi/__init__.py +++ b/Contents/Libraries/Shared/certifi/__init__.py @@ -1,3 +1,3 @@ -from .core import where, old_where +from .core import where -__version__ = "2018.10.15" +__version__ = "2019.03.09" diff --git a/Contents/Libraries/Shared/certifi/cacert.pem b/Contents/Libraries/Shared/certifi/cacert.pem index e75d85b38..84636dde7 100644 --- a/Contents/Libraries/Shared/certifi/cacert.pem +++ b/Contents/Libraries/Shared/certifi/cacert.pem @@ -4268,3 +4268,391 @@ rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV 57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 -----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 146587175971765017618439757810265552097 +# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 +# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 +# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX +mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 +zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P +fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc +vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 +Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp +zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO +Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW +k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ +DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF +lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW +Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z +XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR +gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 +d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv +J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg +DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM ++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy +F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 +SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws +E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 146587176055767053814479386953112547951 +# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b +# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d +# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg +GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu +XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd +re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu +PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 +mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K +8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj +x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR +nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 +kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok +twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp +8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT +z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA +pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb +pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB +R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R +RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk +0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC +5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF +izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn +yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 146587176140553309517047991083707763997 +# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 +# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 +# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A +DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk +fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA +njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 146587176229350439916519468929765261721 +# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 +# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb +# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l +xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 +CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx +sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL +BQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ +SG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n +a29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5 +NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT +CUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u +Z2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO +dem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI +VoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV +9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY +2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY +vLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt +bNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb +x39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+ +l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK +TE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj +Hno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e +i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw +DQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG +7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk +MpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr +gZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk +GMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS +3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm +Ozj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+ +l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c +JfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP +L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa +LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG +mpv0 +-----END CERTIFICATE----- diff --git a/Contents/Libraries/Shared/certifi/core.py b/Contents/Libraries/Shared/certifi/core.py index eab9d1d17..7271acf40 100644 --- a/Contents/Libraries/Shared/certifi/core.py +++ b/Contents/Libraries/Shared/certifi/core.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- """ @@ -8,30 +7,9 @@ This module returns the installation location of cacert.pem. """ import os -import warnings - - -class DeprecatedBundleWarning(DeprecationWarning): - """ - The weak security bundle is being deprecated. Please bother your service - provider to get them to stop using cross-signed roots. - """ def where(): f = os.path.dirname(__file__) return os.path.join(f, 'cacert.pem') - - -def old_where(): - warnings.warn( - "The weak security bundle has been removed. certifi.old_where() is now an alias " - "of certifi.where(). Please update your code to use certifi.where() instead. " - "certifi.old_where() will be removed in 2018.", - DeprecatedBundleWarning - ) - return where() - -if __name__ == '__main__': - print(where()) From 0eefe3200c9e452aa77ca79da979dff76f713a6c Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 02:51:03 +0200 Subject: [PATCH 391/710] update changelog --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index a179ffce1..eac85113a 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,28 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog +2.6.4.xxxx +- core: SRT parsing: handle (bad) ASS color tag in SRT +- core: auto extract embedded: only use one unknown sub for first language +- core: better embedded streams language detection +- core: optimizations +- core: extract embedded: fix is_unknown check +- core: don't raise exception when subtitle not found inside archive +- core: search external subtitles: fix condition +- core: better plex transcoder path detection +- core: use Log.Warn instead of Log.Warning +- core: also check for "plex transcoder.exe" in case of windows (fixes #619) +- core: Fix issue scandir not returning the name of the file inside Docker images on ARM systems. (thanks @giejay) +- core: also clean PYTHONHOME when calling external notification app +- core: update certifi to 2019.3.9 +- windows: fix compatibility issues with plex transcoder +- compat: use lowercase paths on subtitle detection +- providers: addic7ed: drop support for now (they added reCAPTCHA; waiting for API; #612) +- providers: subscene: don't fail on missing cover +- providers: titlovi: fix provider (thanks @viking1304) +- providers: opensubtitles: fix only_foreign handling + + 2.6.4.2911 - core: improve file cache (windows especially); use fixed-length cache filenames; fixes #600 - core: don't log "Checking connections ..." when sonarr/radarr not activated From deaa164f25da144a6936184fa77946df2f363129 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 02:53:09 +0200 Subject: [PATCH 392/710] release 2.6.4.2947 --- CHANGELOG.md | 18 ++++++++++++++++++ Contents/Info.plist | 4 ++-- README.md | 20 +------------------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1761cf79..57a8ad919 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,22 @@ +2.6.4.2911 +- core: improve file cache (windows especially); use fixed-length cache filenames; fixes #600 +- core: don't log "Checking connections ..." when sonarr/radarr not activated +- core: make logging for scanning/parsing/preparing videos more clear +- core: extract embedded: continue searching for embbedded subs after undefined language is found (thanks @jippo015) +- compat: core: don't assume hints["title"] exists +- compat: providers: podnapisi: loosen lxml requirement +- providers: addic7ed: fix not using user credentials; fixes #605 +- providers: titlovi: fix provider (thanks @viking1304) +- providers: subscene: fix provider +- providers: opensubtitles: improve token logging +- providers: podnapisi: fix searching for Marvel series +- submod: HI: correctly remove uppercase at start of a sentence when lead by a crocodile (>>) +- submod: HI: correctly remove lowercase inside brackets when HI matched as well +- submod: HI: remove multiple HI_before_colon_caps before one colon +- submod: common: also match music symbols after a crocodile; move crocodile removal up the chain + + 2.6.4.2881 - core: extract embedded: fix automatic extraction not actually writing the subtitles to disk under certain circumstances; fixes #598 - core: sonarr/radarr: don't block the main thread while checking connectivity; fixes #597 diff --git a/Contents/Info.plist b/Contents/Info.plist index 1ea24444b..6823d17be 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.4.2941</string> + <string>2.6.4.2947</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2941 DEV +Version 2.6.4.2947 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index eac85113a..a036b4c32 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.4.xxxx +2.6.4.2947 - core: SRT parsing: handle (bad) ASS color tag in SRT - core: auto extract embedded: only use one unknown sub for first language - core: better embedded streams language detection @@ -106,24 +106,6 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe - providers: opensubtitles: fix only_foreign handling -2.6.4.2911 -- core: improve file cache (windows especially); use fixed-length cache filenames; fixes #600 -- core: don't log "Checking connections ..." when sonarr/radarr not activated -- core: make logging for scanning/parsing/preparing videos more clear -- core: extract embedded: continue searching for embbedded subs after undefined language is found (thanks @jippo015) -- compat: core: don't assume hints["title"] exists -- compat: providers: podnapisi: loosen lxml requirement -- providers: addic7ed: fix not using user credentials; fixes #605 -- providers: titlovi: fix provider (thanks @viking1304) -- providers: subscene: fix provider -- providers: opensubtitles: improve token logging -- providers: podnapisi: fix searching for Marvel series -- submod: HI: correctly remove uppercase at start of a sentence when lead by a crocodile (>>) -- submod: HI: correctly remove lowercase inside brackets when HI matched as well -- submod: HI: remove multiple HI_before_colon_caps before one colon -- submod: common: also match music symbols after a crocodile; move crocodile removal up the chain - - [older changes](CHANGELOG.md) From 3cee69d23a51397b8115ead82339102f309b1667 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 02:53:43 +0200 Subject: [PATCH 393/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 6823d17be..0cb113b3a 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2947 +Version 2.6.4.2947 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From ac940ab25d0e2bc3b82ea77781d759a3d9ed4ccf Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 04:00:46 +0200 Subject: [PATCH 394/710] providers: opensubtitles: show subtitles with possibly mismatched series when manually listing subs --- Contents/Code/interface/item_details.py | 10 ++++++++-- Contents/Code/support/tasks.py | 5 ++--- Contents/Libraries/Shared/provider_test.sh | 3 +++ Contents/Libraries/Shared/subliminal_patch/subtitle.py | 1 + Contents/Strings/en.json | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index a6e19aec4..455cbc435 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -580,6 +580,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item bl_addon = "Blacklisted " wrong_fps_addon = "" + wrong_series_addon = "" if subtitle.wrong_fps: if plex_part: wrong_fps_addon = _(" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", @@ -589,15 +590,20 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item wrong_fps_addon = _(" (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", subtitle_fps=subtitle.fps) + if subtitle.wrong_series: + wrong_series_addon = _(" (possibly wrong series)") + oc.add(DirectoryObject( key=Callback(TriggerDownloadSubtitle, rating_key=rating_key, randomize=timestamp(), item_title=item_title, subtitle_id=str(subtitle.id), language=language), - title=_(u"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", + title=_(u"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s" + u"%(wrong_series_state)s", blacklisted_state=bl_addon, current_state=_("Available") if current_id != subtitle.id else _("Current"), provider_name=_(subtitle.provider_name), score=subtitle.score, - wrong_fps_state=wrong_fps_addon), + wrong_fps_state=wrong_fps_addon, + wrong_series_state=wrong_series_addon), summary=_(u"Release: %(release_info)s, Matches: %(matches)s", release_info=subtitle.release_info, matches=", ".join(subtitle.matches)), diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index 6a0813146..5fcc5fdec 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -165,8 +165,7 @@ def list_subtitles(self, rating_key, item_type, part_id, language, skip_wrong_fp can_verify_series = False if can_verify_series and not {"series", "season", "episode"}.issubset(matches): - Log.Debug(u"%s: Skipping %s, because it doesn't match our series/episode", self.name, s) - continue + s.wrong_series = True unsorted_subtitles.append( (s, compute_score(matches, s, video, hearing_impaired=use_hearing_impaired), matches)) @@ -175,7 +174,7 @@ def list_subtitles(self, rating_key, item_type, part_id, language, skip_wrong_fp subtitles = [] for subtitle, score, matches in scored_subtitles: # check score - if score < min_score: + if score < min_score and not subtitle.wrong_series: Log.Info(u'%s: Score %d is below min_score (%d)', self.name, score, min_score) continue subtitle.score = score diff --git a/Contents/Libraries/Shared/provider_test.sh b/Contents/Libraries/Shared/provider_test.sh index 67fc66b57..12b16ed3c 100644 --- a/Contents/Libraries/Shared/provider_test.sh +++ b/Contents/Libraries/Shared/provider_test.sh @@ -10,6 +10,9 @@ python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.get # opensubtitles:download python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subliminal_patch.core import SZProviderPool, download_best_subtitles; from subliminal_patch.score import compute_score; from babelfish import Language; from subzero.video import parse_video; video = parse_video('FILE_NAME', hints={'type': 'movie'}, dry_run=True); download_best_subtitles([video], pool_class=SZProviderPool, compute_score=compute_score, providers=['opensubtitles'], languages={Language('srp')} )" +# opensubtitles:full +python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subliminal_patch.core import SZProviderPool, download_best_subtitles; from subliminal_patch.score import compute_score; from subzero.language import Language; from subzero.video import parse_video, refine_video; import os; os.environ['U1pfT01EQl9LRVk'] = '789CF30DAC2C8B0AF433F5C9AD34290A712DF30D7135F12D0FB3E502006FDE081E'; video = parse_video('SUBPATH_TO_FILE', hints={'episode_title': 'EPISODE_TITLE', 'type': 'episode', 'title': 'SERIES_TITLE'}, dry_run=True); refine_video(video); download_best_subtitles([video], pool_class=SZProviderPool, compute_score=compute_score, providers=['opensubtitles'], languages={Language('eng')} )" + # podnapisi python -c "import logging; logging.basicConfig(level=logging.DEBUG); import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subliminal_patch.core import SZProviderPool; from babelfish import Language; SZProviderPool(providers=['podnapisi'], )['podnapisi'].query([Language('eng')], 'Game of Thrones', season=2, episode=1)" diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 9a165fe4b..06bec861f 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -38,6 +38,7 @@ class Subtitle(Subtitle_): plex_media_fps = None skip_wrong_fps = False wrong_fps = False + wrong_series = False is_pack = False asked_for_release_group = None asked_for_episode = None diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 89734af4b..f8b45810e 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -334,7 +334,7 @@ "Searching for %(language)s subs (%(video_data)s), refresh here ...": "Searching for %(language)s subs (%(video_data)s), refresh here ...", " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", - "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s%(wrong_series_state)s", "Release: %(release_info)s, Matches: %(matches)s": "Release: %(release_info)s, Matches: %(matches)s", "Downloading subtitle for %(title_or_id)s": "Downloading subtitle for %(title_or_id)s", "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods", From 768046e88977b0f34b2336cae5006c9f693a25d7 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 04:13:25 +0200 Subject: [PATCH 395/710] scan_video: add series/title as alternative by scanning filename itself without parent folders --- Contents/Libraries/Shared/subliminal_patch/core.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 5dda9fb3c..df38b4e09 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -518,10 +518,20 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski hints["expected_title"] = [hints["title"]] guessed_result = guessit(guess_from, options=hints) + logger.debug('GuessIt found: %s', json.dumps(guessed_result, cls=GuessitEncoder, indent=4, ensure_ascii=False)) video = Video.fromguess(path, guessed_result) video.hints = hints + # get possibly alternative title from the filename itself + alt_guess = guessit(filename, options=hints) + if "title" in alt_guess and alt_guess["title"] != guessed_result["title"]: + if video_type == "episode": + video.alternative_series.append(alt_guess["title"]) + else: + video.alternative_titles.append(alt_guess["title"]) + logger.debug("Adding alternative title: %s", alt_guess["title"]) + if dont_use_actual_file: return video From 0d46b3fa197c10a7713dae1c0ecb88a489b8737e Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 05:33:14 +0200 Subject: [PATCH 396/710] core: add cf magic providers: subscene: use alternative titles/series for searching; use cf magic providers: subscene/opensubtitles: use alternative titles/series for searching --- Contents/Libraries/Shared/cfscrape.py | 258 ++++++++++++++++++ .../providers/opensubtitles.py | 29 +- .../subliminal_patch/providers/subscene.py | 62 +++-- .../Shared/subliminal_patch/subtitle.py | 6 +- 4 files changed, 322 insertions(+), 33 deletions(-) create mode 100644 Contents/Libraries/Shared/cfscrape.py diff --git a/Contents/Libraries/Shared/cfscrape.py b/Contents/Libraries/Shared/cfscrape.py new file mode 100644 index 000000000..beafc0e94 --- /dev/null +++ b/Contents/Libraries/Shared/cfscrape.py @@ -0,0 +1,258 @@ +import logging +import random +import time +import re + +''''''''' +Disables InsecureRequestWarning: Unverified HTTPS request is being made warnings. +''''''''' +import requests +from requests.packages.urllib3.exceptions import InsecureRequestWarning + +requests.packages.urllib3.disable_warnings(InsecureRequestWarning) +'''''' +from requests.sessions import Session +from copy import deepcopy + +try: + from urlparse import urlparse +except ImportError: + from urllib.parse import urlparse + +DEFAULT_USER_AGENTS = [ + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/65.0.3325.181 Chrome/65.0.3325.181 Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.0; Moto G (5) Build/NPPS25.137-93-8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0" +] + +DEFAULT_USER_AGENT = random.choice(DEFAULT_USER_AGENTS) + +BUG_REPORT = ( + "Cloudflare may have changed their technique, or there may be a bug in the script.\n\nPlease read " "https://github.com/Anorov/cloudflare-scrape#updates, then file a " + "bug report at https://github.com/Anorov/cloudflare-scrape/issues.") + + +class CloudflareScraper(Session): + def __init__(self, *args, **kwargs): + super(CloudflareScraper, self).__init__(*args, **kwargs) + + if "requests" in self.headers["User-Agent"]: + # Spoof Firefox on Linux if no custom User-Agent has been set + self.headers["User-Agent"] = DEFAULT_USER_AGENT + + def request(self, method, url, *args, **kwargs): + resp = super(CloudflareScraper, self).request(method, url, *args, **kwargs) + + # Check if Cloudflare anti-bot is on + if (resp.status_code == 503 + and resp.headers.get("Server", "").startswith("cloudflare") + and b"jschl_answer" in resp.content + ): + return self.solve_cf_challenge(resp, **kwargs) + + # Otherwise, no Cloudflare anti-bot detected + return resp + + def solve_cf_challenge(self, resp, **original_kwargs): + body = resp.text + parsed_url = urlparse(resp.url) + domain = parsed_url.netloc + submit_url = "%s://%s/cdn-cgi/l/chk_jschl" % (parsed_url.scheme, domain) + + cloudflare_kwargs = deepcopy(original_kwargs) + params = cloudflare_kwargs.setdefault("params", {}) + headers = cloudflare_kwargs.setdefault("headers", {}) + headers["Referer"] = resp.url + + try: + cf_delay = float(re.search('submit.*?(\d+)', body, re.DOTALL).group(1)) / 1000.0 + + form_index = body.find('id="challenge-form"') + if form_index == -1: + raise Exception('CF form not found') + sub_body = body[form_index:] + + s_match = re.search('name="s" value="(.+?)"', sub_body) + if s_match: + params["s"] = s_match.group(1) # On older variants this parameter is absent. + params["jschl_vc"] = re.search(r'name="jschl_vc" value="(\w+)"', sub_body).group(1) + params["pass"] = re.search(r'name="pass" value="(.+?)"', sub_body).group(1) + + if body.find('id="cf-dn-', form_index) != -1: + extra_div_expression = re.search('id="cf-dn-.*?>(.+?)<', sub_body).group(1) + + # Initial value. + js_answer = self.cf_parse_expression( + re.search('setTimeout\(function\(.*?:(.*?)}', body, re.DOTALL).group(1) + ) + # Extract the arithmetic operations. + builder = re.search("challenge-form'\);\s*;(.*);a.value", body, re.DOTALL).group(1) + # Remove a function semicolon before splitting on semicolons, else it messes the order. + lines = builder.replace(' return +(p)}();', '', 1).split(';') + + for line in lines: + if len(line) and '=' in line: + heading, expression = line.split('=', 1) + if 'eval(eval(atob' in expression: + # Uses the expression in an external <div>. + expression_value = self.cf_parse_expression(extra_div_expression) + elif '(function(p' in expression: + # Expression + domain sampling function. + expression_value = self.cf_parse_expression(expression, domain) + else: + expression_value = self.cf_parse_expression(expression) + js_answer = self.cf_arithmetic_op(heading[-1], js_answer, expression_value) + + if '+ t.length' in body: + js_answer += len(domain) # Only older variants add the domain length. + + params["jschl_answer"] = '%.10f' % js_answer + + except Exception as e: + # Something is wrong with the page. + # This may indicate Cloudflare has changed their anti-bot + # technique. If you see this and are running the latest version, + # please open a GitHub issue so I can update the code accordingly. + logging.error("[!] %s Unable to parse Cloudflare anti-bots page. " + "Try upgrading cloudflare-scrape, or submit a bug report " + "if you are running the latest version. Please read " + "https://github.com/Anorov/cloudflare-scrape#updates " + "before submitting a bug report." % e) + raise + + # Cloudflare requires a delay before solving the challenge. + # Always wait the full delay + 1s because of 'time.sleep()' imprecision. + time.sleep(cf_delay + 1.0) + + # Requests transforms any request into a GET after a redirect, + # so the redirect has to be handled manually here to allow for + # performing other types of requests even as the first request. + method = resp.request.method + cloudflare_kwargs["allow_redirects"] = False + + redirect = self.request(method, submit_url, **cloudflare_kwargs) + + if 'Location' in redirect.headers: + redirect_location = urlparse(redirect.headers["Location"]) + if not redirect_location.netloc: + redirect_url = "%s://%s%s" % (parsed_url.scheme, domain, redirect_location.path) + return self.request(method, redirect_url, **original_kwargs) + return self.request(method, redirect.headers["Location"], **original_kwargs) + else: + return redirect + + def cf_sample_domain_function(self, func_expression, domain): + parameter_start_index = func_expression.find('}(') + 2 + # Send the expression with the "+" char and enclosing parenthesis included, as they are + # stripped inside ".cf_parse_expression()'. + sample_index = self.cf_parse_expression( + func_expression[parameter_start_index: func_expression.rfind(')))')] + ) + return ord(domain[int(sample_index)]) + + def cf_arithmetic_op(self, op, a, b): + if op == '+': + return a + b + elif op == '/': + return a / float(b) + elif op == '*': + return a * float(b) + elif op == '-': + return a - b + else: + raise Exception('Unknown operation') + + def cf_parse_expression(self, expression, domain=None): + + def _get_jsfuck_number(section): + digit_expressions = section.replace('!+[]', '1').replace('+!![]', '1').replace('+[]', '0').split('+') + return int( + # Form a number string, with each digit as the sum of the values inside each parenthesis block. + ''.join( + str(sum(int(digit_char) for digit_char in digit_expression[1:-1])) # Strip the parenthesis. + for digit_expression in digit_expressions + ) + ) + + if '/' in expression: + dividend, divisor = expression.split('/') + dividend = dividend[2:-1] # Strip the leading '+' char and the enclosing parenthesis. + + if domain: + # 2019-04-02: At this moment, this extra domain sampling function always appears on the + # divisor side, at the end. + divisor_a, divisor_b = divisor.split('))+(') + divisor_a = _get_jsfuck_number(divisor_a[5:]) # Left-strip the sequence of "(+(+(". + divisor_b = self.cf_sample_domain_function(divisor_b, domain) + return _get_jsfuck_number(dividend) / float(divisor_a + divisor_b) + else: + divisor = divisor[2:-1] + return _get_jsfuck_number(dividend) / float(_get_jsfuck_number(divisor)) + else: + return _get_jsfuck_number(expression[2:-1]) + + @classmethod + def create_scraper(cls, sess=None, **kwargs): + """ + Convenience function for creating a ready-to-go requests.Session (subclass) object. + """ + scraper = cls() + + if sess: + attrs = ["auth", "cert", "cookies", "headers", "hooks", "params", "proxies", "data"] + for attr in attrs: + val = getattr(sess, attr, None) + if val: + setattr(scraper, attr, val) + + return scraper + + ## Functions for integrating cloudflare-scrape with other applications and scripts + + @classmethod + def get_tokens(cls, url, user_agent=None, **kwargs): + scraper = cls.create_scraper() + if user_agent: + scraper.headers["User-Agent"] = user_agent + + try: + resp = scraper.get(url, **kwargs) + resp.raise_for_status() + except Exception as e: + logging.error("'%s' returned an error. Could not collect tokens." % url) + raise + + domain = urlparse(resp.url).netloc + cookie_domain = None + + for d in scraper.cookies.list_domains(): + if d.startswith(".") and d in ("." + domain): + cookie_domain = d + break + else: + raise ValueError( + "Unable to find Cloudflare cookies. Does the site actually have Cloudflare IUAM (\"I'm Under Attack Mode\") enabled?") + + return ({ + "__cfduid": scraper.cookies.get("__cfduid", "", domain=cookie_domain), + "cf_clearance": scraper.cookies.get("cf_clearance", "", domain=cookie_domain) + }, + scraper.headers["User-Agent"] + ) + + @classmethod + def get_cookie_string(cls, url, user_agent=None, **kwargs): + """ + Convenience function for building a Cookie HTTP header value. + """ + tokens, user_agent = cls.get_tokens(url, user_agent=user_agent, **kwargs) + return "; ".join("=".join(pair) for pair in tokens.items()), user_agent + + +create_scraper = CloudflareScraper.create_scraper +get_tokens = CloudflareScraper.get_tokens +get_cookie_string = CloudflareScraper.get_cookie_string diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index 032b89058..4ce3aacea 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -11,8 +11,8 @@ from dogpile.cache.api import NO_VALUE from subliminal.exceptions import ConfigurationError, ServiceUnavailable from subliminal.providers.opensubtitles import OpenSubtitlesProvider as _OpenSubtitlesProvider,\ - OpenSubtitlesSubtitle as _OpenSubtitlesSubtitle, Episode, ServerProxy, Unauthorized, NoSession, \ - DownloadLimitReached, InvalidImdbid, UnknownUserAgent, DisabledUserAgent, OpenSubtitlesError + OpenSubtitlesSubtitle as _OpenSubtitlesSubtitle, Episode, Movie, ServerProxy, Unauthorized, NoSession, \ + DownloadLimitReached, InvalidImdbid, UnknownUserAgent, DisabledUserAgent, OpenSubtitlesError, sanitize from mixins import ProviderRetryMixin from subliminal.subtitle import fix_line_ending from subliminal_patch.http import SubZeroRequestsTransport @@ -45,6 +45,19 @@ def __init__(self, language, hearing_impaired, page_link, subtitle_id, matched_b def get_matches(self, video, hearing_impaired=False): matches = super(OpenSubtitlesSubtitle, self).get_matches(video) + # episode + if isinstance(video, Episode) and self.movie_kind == 'episode': + # series + if video.series and (sanitize(self.series_name) in ( + sanitize(name) for name in [video.series] + video.alternative_series)): + matches.add('series') + # movie + elif isinstance(video, Movie) and self.movie_kind == 'movie': + # title + if video.title and (sanitize(self.movie_name) in ( + sanitize(name) for name in [video.title] + video.alternative_titles)): + matches.add('title') + sub_fps = None try: sub_fps = float(self.fps) @@ -205,19 +218,19 @@ def list_subtitles(self, video, languages): season = episode = None if isinstance(video, Episode): - query = video.series + query = [video.series] + video.alternative_series season = video.season episode = episode = min(video.episode) if isinstance(video.episode, list) else video.episode if video.is_special: season = None episode = None - query = u"%s %s" % (video.series, video.title) + query = [u"%s %s" % (series, video.title) for series in [video.series] + video.alternative_series] logger.info("%s: Searching for special: %r", self.__class__, query) # elif ('opensubtitles' not in video.hashes or not video.size) and not video.imdb_id: # query = video.name.split(os.sep)[-1] else: - query = video.title + query = [video.title] + video.alternative_titles return self.query(languages, hash=video.hashes.get('opensubtitles'), size=video.size, imdb_id=video.imdb_id, query=query, season=season, episode=episode, tag=video.original_name, @@ -238,9 +251,11 @@ def query(self, languages, hash=None, size=None, imdb_id=None, query=None, seaso else: criteria.append({'imdbid': imdb_id[2:]}) if query and season and episode: - criteria.append({'query': query.replace('\'', ''), 'season': season, 'episode': episode}) + for q in query: + criteria.append({'query': q.replace('\'', ''), 'season': season, 'episode': episode}) elif query: - criteria.append({'query': query.replace('\'', '')}) + for q in query: + criteria.append({'query': q.replace('\'', '')}) if not criteria: raise ValueError('Not enough information') diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 38a97c579..5bb9b620f 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -5,6 +5,7 @@ import os import time import inflect +import cfscrape from random import randint from zipfile import ZipFile @@ -122,9 +123,17 @@ def __init__(self, only_foreign=False): def initialize(self): logger.info("Creating session") - self.session = Session() + self.session = cfscrape.create_scraper() + self.session.headers.update({ + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'en-US,en;q=0.5', + 'Cache-Control': 'no-cache', + 'Pragma': 'no-cache', + 'DNT': '1' + }) from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)] + self.session.headers['Referer'] = "https://subscene.com" def terminate(self): logger.info("Closing session") @@ -197,6 +206,7 @@ def query(self, video): vfn = get_video_filename(video) subtitles = [] logger.debug(u"Searching for: %s", vfn) + film = search(vfn, session=self.session) if film and film.subtitles: logger.debug('Release results found: %s', len(film.subtitles)) @@ -204,37 +214,41 @@ def query(self, video): else: logger.debug('No release results found') + time.sleep(self.search_throttle) + # re-search for episodes without explicit release name if isinstance(video, Episode): #term = u"%s S%02iE%02i" % (video.series, video.season, video.episode) - term = u"%s - %s Season" % (video.series, p.number_to_words("%sth" % video.season).capitalize()) - time.sleep(self.search_throttle) - logger.debug('Searching for alternative results: %s', term) - film = search(term, session=self.session, release=False) - if film and film.subtitles: - logger.debug('Alternative results found: %s', len(film.subtitles)) - subtitles += self.parse_results(video, film) - else: - logger.debug('No alternative results found') - - # packs - if video.season_fully_aired: - term = u"%s S%02i" % (video.series, video.season) - logger.debug('Searching for packs: %s', term) + for series in [video.series] + video.alternative_series: + term = u"%s - %s Season" % (series, p.number_to_words("%sth" % video.season).capitalize()) time.sleep(self.search_throttle) - film = search(term, session=self.session) + logger.debug('Searching for alternative results: %s', term) + film = search(term, session=self.session, release=False) if film and film.subtitles: - logger.debug('Pack results found: %s', len(film.subtitles)) + logger.debug('Alternative results found: %s', len(film.subtitles)) subtitles += self.parse_results(video, film) else: - logger.debug('No pack results found') - else: - logger.debug("Not searching for packs, because the season hasn't fully aired") + logger.debug('No alternative results found') + + # packs + if video.season_fully_aired: + term = u"%s S%02i" % (video.series, video.season) + logger.debug('Searching for packs: %s', term) + time.sleep(self.search_throttle) + film = search(term, session=self.session) + if film and film.subtitles: + logger.debug('Pack results found: %s', len(film.subtitles)) + subtitles += self.parse_results(video, film) + else: + logger.debug('No pack results found') + else: + logger.debug("Not searching for packs, because the season hasn't fully aired") else: - logger.debug('Searching for movie results: %s', video.title) - film = search(video.title, year=video.year, session=self.session, limit_to=None, release=False) - if film and film.subtitles: - subtitles += self.parse_results(video, film) + for title in [video.title] + video.alternative_titles: + logger.debug('Searching for movie results: %s', title) + film = search(title, year=video.year, session=self.session, limit_to=None, release=False) + if film and film.subtitles: + subtitles += self.parse_results(video, film) logger.info("%s subtitles found" % len(subtitles)) return subtitles diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 06bec861f..9d3301626 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -357,7 +357,8 @@ def guess_matches(video, guess, partial=False): matches = set() if isinstance(video, Episode): # series - if video.series and 'title' in guess and sanitize(guess['title']) == sanitize(video.series): + if video.series and 'title' in guess and sanitize(guess['title']) in ( + sanitize(name) for name in [video.series] + video.alternative_series): matches.add('series') # title if video.title and 'episode_title' in guess and sanitize(guess['episode_title']) == sanitize(video.title): @@ -385,7 +386,8 @@ def guess_matches(video, guess, partial=False): if video.year and 'year' in guess and guess['year'] == video.year: matches.add('year') # title - if video.title and 'title' in guess and sanitize(guess['title']) == sanitize(video.title): + if video.title and 'title' in guess and sanitize(guess['title']) in ( + sanitize(name) for name in [video.title] + video.alternative_titles): matches.add('title') # release_group From cf2f3d0dcac854177a372fd097f0cc4f3c2ae0cd Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 05:35:32 +0200 Subject: [PATCH 397/710] core: cf: add credits --- Contents/Libraries/Shared/cfscrape.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Contents/Libraries/Shared/cfscrape.py b/Contents/Libraries/Shared/cfscrape.py index beafc0e94..240336d25 100644 --- a/Contents/Libraries/Shared/cfscrape.py +++ b/Contents/Libraries/Shared/cfscrape.py @@ -3,6 +3,9 @@ import time import re +# based off of https://gist.github.com/doko-desuka/58d9212461f62583f8df9bc6387fade2 +# and https://github.com/Anorov/cloudflare-scrape + ''''''''' Disables InsecureRequestWarning: Unverified HTTPS request is being made warnings. ''''''''' From db5f85272f7d3669f095a1aa24a7bdffe42b2e94 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 16:09:49 +0200 Subject: [PATCH 398/710] core: cf: support 429 and jschl_vc --- Contents/Libraries/Shared/cfscrape.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/cfscrape.py b/Contents/Libraries/Shared/cfscrape.py index 240336d25..926117c0b 100644 --- a/Contents/Libraries/Shared/cfscrape.py +++ b/Contents/Libraries/Shared/cfscrape.py @@ -5,6 +5,7 @@ # based off of https://gist.github.com/doko-desuka/58d9212461f62583f8df9bc6387fade2 # and https://github.com/Anorov/cloudflare-scrape +# and https://github.com/VeNoMouS/cloudflare-scrape-js2py ''''''''' Disables InsecureRequestWarning: Unverified HTTPS request is being made warnings. @@ -51,8 +52,9 @@ def request(self, method, url, *args, **kwargs): resp = super(CloudflareScraper, self).request(method, url, *args, **kwargs) # Check if Cloudflare anti-bot is on - if (resp.status_code == 503 + if (resp.status_code in (503, 429) and resp.headers.get("Server", "").startswith("cloudflare") + and b"jschl_vc" in resp.content and b"jschl_answer" in resp.content ): return self.solve_cf_challenge(resp, **kwargs) From 9e09de5f1e0895f4d9e4f22bee2500d93b231f12 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 16:13:04 +0200 Subject: [PATCH 399/710] core: cf: randomize user agent on init, not on import --- Contents/Libraries/Shared/cfscrape.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/cfscrape.py b/Contents/Libraries/Shared/cfscrape.py index 926117c0b..41b4b2b0c 100644 --- a/Contents/Libraries/Shared/cfscrape.py +++ b/Contents/Libraries/Shared/cfscrape.py @@ -46,7 +46,7 @@ def __init__(self, *args, **kwargs): if "requests" in self.headers["User-Agent"]: # Spoof Firefox on Linux if no custom User-Agent has been set - self.headers["User-Agent"] = DEFAULT_USER_AGENT + self.headers["User-Agent"] = random.choice(DEFAULT_USER_AGENTS) def request(self, method, url, *args, **kwargs): resp = super(CloudflareScraper, self).request(method, url, *args, **kwargs) From 265804a834b7856fe86410739a34b155f0b6aa42 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 16:13:21 +0200 Subject: [PATCH 400/710] core: http: use cfscrape as base session --- Contents/Libraries/Shared/subliminal_patch/http.py | 10 +++++++++- .../Shared/subliminal_patch/providers/subscene.py | 7 ------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index d6fddb358..b74719a52 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -12,6 +12,7 @@ from urllib3.util import connection from retry.api import retry_call from exceptions import APIThrottled +from cfscrape import CloudflareScraper from subzero.lib.io import get_viable_encoding @@ -30,12 +31,19 @@ custom_resolver.nameservers = ['8.8.8.8', '1.1.1.1'] -class CertifiSession(Session): +class CertifiSession(CloudflareScraper): timeout = 10 def __init__(self): super(CertifiSession, self).__init__() self.verify = pem_file + self.headers.update({ + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'en-US,en;q=0.5', + 'Cache-Control': 'no-cache', + 'Pragma': 'no-cache', + 'DNT': '1' + }) def request(self, *args, **kwargs): if kwargs.get('timeout') is None: diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 5bb9b620f..b81e72ef5 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -124,13 +124,6 @@ def __init__(self, only_foreign=False): def initialize(self): logger.info("Creating session") self.session = cfscrape.create_scraper() - self.session.headers.update({ - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'Accept-Language': 'en-US,en;q=0.5', - 'Cache-Control': 'no-cache', - 'Pragma': 'no-cache', - 'DNT': '1' - }) from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)] self.session.headers['Referer'] = "https://subscene.com" From b6185cc2cc46062eab11a92cd2e58bd771dd64fc Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 16:24:34 +0200 Subject: [PATCH 401/710] core: http: fix mro --- Contents/Libraries/Shared/subliminal_patch/http.py | 4 ++-- .../Libraries/Shared/subliminal_patch/providers/subscene.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index b74719a52..d859cd31d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -55,7 +55,7 @@ class RetryingSession(CertifiSession): proxied_functions = ("get", "post") def __init__(self): - super(CertifiSession, self).__init__() + super(RetryingSession, self).__init__() self.verify = pem_file proxy = os.environ.get('SZ_HTTP_PROXY') @@ -70,7 +70,7 @@ def retry_method(self, method, *args, **kwargs): # fixme: may be a little loud logger.debug("Using proxy %s for: %s", self.proxies["http"], args[0]) - return retry_call(getattr(super(CertifiSession, self), method), fargs=args, fkwargs=kwargs, tries=3, delay=5, + return retry_call(getattr(super(RetryingSession, self), method), fargs=args, fkwargs=kwargs, tries=3, delay=5, exceptions=(exceptions.ConnectionError, exceptions.ProxyError, exceptions.SSLError, diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index b81e72ef5..dd9110b43 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -123,7 +123,7 @@ def __init__(self, only_foreign=False): def initialize(self): logger.info("Creating session") - self.session = cfscrape.create_scraper() + self.session = Session() from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)] self.session.headers['Referer'] = "https://subscene.com" From 20f18fc3911a2930f560eac8b9d1ea7ae00462c3 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 16:45:53 +0200 Subject: [PATCH 402/710] providers: subscene: try reusing cf cookies after successful bypass --- .../subliminal_patch/providers/subscene.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index dd9110b43..fe6f48528 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -13,7 +13,9 @@ from babelfish import language_converters from guessit import guessit from requests import Session +from dogpile.cache.api import NO_VALUE from subliminal import Episode, ProviderError +from subliminal.cache import region from subliminal.utils import sanitize_release_group from subliminal_patch.providers import Provider from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin @@ -200,7 +202,23 @@ def query(self, video): subtitles = [] logger.debug(u"Searching for: %s", vfn) + cf_data = region.get("cf_data") + if cf_data is not NO_VALUE: + cf_cookies, user_agent = cf_data + logger.debug("Trying to use old cf cookies") + self.session.cookies.update(cf_cookies) + self.session.headers['User-Agent'] = user_agent + film = search(vfn, session=self.session) + + try: + cf_data = self.session.get_live_tokens("subscene.com") + except: + pass + else: + logger.debug("Storing cf cookies") + region.set("cf_data", cf_data) + if film and film.subtitles: logger.debug('Release results found: %s', len(film.subtitles)) subtitles = self.parse_results(video, film) From b7f12e4291dd16a294c26b17b4f35928a0a7178f Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 16:46:22 +0200 Subject: [PATCH 403/710] core: cf: add get_live_tokens method for retrieving cookies --- Contents/Libraries/Shared/cfscrape.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Contents/Libraries/Shared/cfscrape.py b/Contents/Libraries/Shared/cfscrape.py index 41b4b2b0c..15986f03a 100644 --- a/Contents/Libraries/Shared/cfscrape.py +++ b/Contents/Libraries/Shared/cfscrape.py @@ -249,6 +249,22 @@ def get_tokens(cls, url, user_agent=None, **kwargs): scraper.headers["User-Agent"] ) + def get_live_tokens(self, domain): + for d in self.cookies.list_domains(): + if d.startswith(".") and d in ("." + domain): + cookie_domain = d + break + else: + raise ValueError( + "Unable to find Cloudflare cookies. Does the site actually have Cloudflare IUAM (\"I'm Under Attack Mode\") enabled?") + + return ({ + "__cfduid": self.cookies.get("__cfduid", "", domain=cookie_domain), + "cf_clearance": self.cookies.get("cf_clearance", "", domain=cookie_domain) + }, + self.headers["User-Agent"] + ) + @classmethod def get_cookie_string(cls, url, user_agent=None, **kwargs): """ From 71db2ae1c9c069c6e8986cdbb3fd81888034fe1a Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 16:56:09 +0200 Subject: [PATCH 404/710] menu: list subtitles: show subtitles with bad season/episode values as well --- Contents/Code/interface/item_details.py | 9 +++++++-- Contents/Code/support/tasks.py | 5 ++++- .../Shared/subliminal_patch/providers/subscene.py | 2 +- Contents/Libraries/Shared/subliminal_patch/subtitle.py | 1 + Contents/Strings/en.json | 2 +- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index 455cbc435..f422b4046 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -581,6 +581,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item wrong_fps_addon = "" wrong_series_addon = "" + wrong_season_ep_addon = "" if subtitle.wrong_fps: if plex_part: wrong_fps_addon = _(" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", @@ -593,17 +594,21 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item if subtitle.wrong_series: wrong_series_addon = _(" (possibly wrong series)") + if subtitle.wrong_season_ep: + wrong_season_ep_addon = _(" (possibly wrong season/episode)") + oc.add(DirectoryObject( key=Callback(TriggerDownloadSubtitle, rating_key=rating_key, randomize=timestamp(), item_title=item_title, subtitle_id=str(subtitle.id), language=language), title=_(u"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s" - u"%(wrong_series_state)s", + u"%(wrong_series_state)s%(wrong_season_ep_state)s", blacklisted_state=bl_addon, current_state=_("Available") if current_id != subtitle.id else _("Current"), provider_name=_(subtitle.provider_name), score=subtitle.score, wrong_fps_state=wrong_fps_addon, - wrong_series_state=wrong_series_addon), + wrong_series_state=wrong_series_addon, + wrong_season_ep_state=wrong_season_ep_addon), summary=_(u"Release: %(release_info)s, Matches: %(matches)s", release_info=subtitle.release_info, matches=", ".join(subtitle.matches)), diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index 5fcc5fdec..0c6d12e40 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -165,7 +165,10 @@ def list_subtitles(self, rating_key, item_type, part_id, language, skip_wrong_fp can_verify_series = False if can_verify_series and not {"series", "season", "episode"}.issubset(matches): - s.wrong_series = True + if "series" not in matches: + s.wrong_series = True + else: + s.wrong_season_ep = True unsorted_subtitles.append( (s, compute_score(matches, s, video, hearing_impaired=use_hearing_impaired), matches)) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index fe6f48528..7a17e1365 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -243,7 +243,7 @@ def query(self, video): # packs if video.season_fully_aired: - term = u"%s S%02i" % (video.series, video.season) + term = u"%s S%02i" % (series, video.season) logger.debug('Searching for packs: %s', term) time.sleep(self.search_throttle) film = search(term, session=self.session) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 9d3301626..69a3c1e5b 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -39,6 +39,7 @@ class Subtitle(Subtitle_): skip_wrong_fps = False wrong_fps = False wrong_series = False + wrong_season_ep = False is_pack = False asked_for_release_group = None asked_for_episode = None diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index f8b45810e..620200159 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -334,7 +334,7 @@ "Searching for %(language)s subs (%(video_data)s), refresh here ...": "Searching for %(language)s subs (%(video_data)s), refresh here ...", " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", - "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s%(wrong_series_state)s", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s%(wrong_series_state)s%(wrong_season_ep_state)s", "Release: %(release_info)s, Matches: %(matches)s": "Release: %(release_info)s, Matches: %(matches)s", "Downloading subtitle for %(title_or_id)s": "Downloading subtitle for %(title_or_id)s", "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods", From e3825fbf961da255959954d28f3dfe8922920682 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 16:57:11 +0200 Subject: [PATCH 405/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 0cb113b3a..615ea0212 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.4.2947</string> + <string>2.6.4.2960</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2947 DEV +Version 2.6.4.2960 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 5d7f9ced17118b99ec3786113b77ed451860a602 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 17:32:17 +0200 Subject: [PATCH 406/710] providers: disable titlovi (reCAPTCHA) --- Contents/Code/support/config.py | 4 +++- Contents/DefaultPrefs.json | 6 ------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index d3688453b..43f2a5a0a 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -750,8 +750,10 @@ def providers_by_prefs(self): return {'opensubtitles': cast_bool(Prefs['provider.opensubtitles.enabled']), # 'thesubdb': Prefs['provider.thesubdb.enabled'], 'podnapisi': cast_bool(Prefs['provider.podnapisi.enabled']), - 'titlovi': cast_bool(Prefs['provider.titlovi.enabled']), + #'titlovi': cast_bool(Prefs['provider.titlovi.enabled']), + 'titlovi': False, #'addic7ed': cast_bool(Prefs['provider.addic7ed.enabled']), + 'addic7ed': False, 'tvsubtitles': cast_bool(Prefs['provider.tvsubtitles.enabled']), 'legendastv': cast_bool(Prefs['provider.legendastv.enabled']), 'napiprojekt': cast_bool(Prefs['provider.napiprojekt.enabled']), diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index cde426987..b08486856 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -305,12 +305,6 @@ "type": "bool", "default": "true" }, - { - "id": "provider.titlovi.enabled", - "label": "Provider: Enable Titlovi.com", - "type": "bool", - "default": "true" - }, { "id": "provider.legendastv.enabled", "label": "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", From db9da543913ea6705b6ffa723e38928db93577b4 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 19:14:34 +0200 Subject: [PATCH 407/710] core: http: use implicit cf handling; remove cf handling from providers --- .../Libraries/Shared/subliminal_patch/http.py | 40 +++++++++++++++++-- .../subliminal_patch/providers/subscene.py | 16 -------- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index d859cd31d..465d5555e 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -8,12 +8,19 @@ import xmlrpclib import dns.resolver -from requests import Session, exceptions +from requests import exceptions from urllib3.util import connection from retry.api import retry_call from exceptions import APIThrottled +from dogpile.cache.api import NO_VALUE +from subliminal.cache import region from cfscrape import CloudflareScraper +try: + from urlparse import urlparse +except ImportError: + from urllib.parse import urlparse + from subzero.lib.io import get_viable_encoding logger = logging.getLogger(__name__) @@ -45,10 +52,37 @@ def __init__(self): 'DNT': '1' }) - def request(self, *args, **kwargs): + def request(self, method, url, *args, **kwargs): if kwargs.get('timeout') is None: kwargs['timeout'] = self.timeout - return super(CertifiSession, self).request(*args, **kwargs) + + parsed_url = urlparse(url) + domain = parsed_url.netloc + + cache_key = "cf_data_%s" % domain + + if not self.cookies.get("__cfduid", "", domain=domain) or not self.cookies.get("cf_clearance", "", + domain=domain): + cf_data = region.get(cache_key) + if cf_data is not NO_VALUE: + cf_cookies, user_agent = cf_data + logger.debug("Trying to use old cf data for %s: %s", domain, cf_data) + for cookie, value in cf_cookies.iteritems(): + self.cookies.set(cookie, value, domain=domain) + + self.headers['User-Agent'] = user_agent + + ret = super(CertifiSession, self).request(method, url, *args, **kwargs) + try: + cf_data = self.get_live_tokens(domain) + except: + pass + else: + if cf_data != region.get(cache_key): + logger.debug("Storing cf data for %s: %s", domain, cf_data) + region.set(cache_key, cf_data) + + return ret class RetryingSession(CertifiSession): diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 7a17e1365..d6a294cdb 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -201,24 +201,8 @@ def query(self, video): vfn = get_video_filename(video) subtitles = [] logger.debug(u"Searching for: %s", vfn) - - cf_data = region.get("cf_data") - if cf_data is not NO_VALUE: - cf_cookies, user_agent = cf_data - logger.debug("Trying to use old cf cookies") - self.session.cookies.update(cf_cookies) - self.session.headers['User-Agent'] = user_agent - film = search(vfn, session=self.session) - try: - cf_data = self.session.get_live_tokens("subscene.com") - except: - pass - else: - logger.debug("Storing cf cookies") - region.set("cf_data", cf_data) - if film and film.subtitles: logger.debug('Release results found: %s', len(film.subtitles)) subtitles = self.parse_results(video, film) From cbee0bd6c89437ff847557e8a0ac7bbf3a0aa52f Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 4 Apr 2019 19:15:16 +0200 Subject: [PATCH 408/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 615ea0212..336859638 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.4.2960</string> + <string>2.6.4.2963</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2960 DEV +Version 2.6.4.2963 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 60eb08c834a3ae38b4c81cf916aea3eb81ae42e2 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Thu, 4 Apr 2019 19:31:16 +0200 Subject: [PATCH 409/710] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a036b4c32..d3ea12dd2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Sub-Zero for Plex [![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle.svg?style=flat&label=stable)](https://github.com/pannal/Sub-Zero.bundle/releases/latest)<!--[![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle/all.svg?maxAge=2592000&label=testing+2.0+RC9)](https://github.com/pannal/Sub-Zero.bundle/releases)--> [![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)]() -[![Maintenance](https://img.shields.io/maintenance/yes/2018.svg)]() +[![Maintenance](https://img.shields.io/maintenance/yes/2019.svg)]() [![Slack Status](https://szslack.fragstore.net/badge.svg)](https://szslack.fragstore.net) <img src="https://raw.githubusercontent.com/pannal/Sub-Zero.bundle/master/Contents/Resources/subzero.gif" align="left" height="100"> <font size="5"><b>Subtitles done right!</b></font><br /> From 6338757a9b46d6cba45299057de3099a8d61a5ff Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 5 Apr 2019 05:21:06 +0200 Subject: [PATCH 410/710] core/providers: re-add addic7ed; add anti-captcha.com solving service --- Contents/Code/interface/menu.py | 6 +- Contents/Code/support/config.py | 18 +- Contents/DefaultPrefs.json | 64 ++++++ .../Shared/python_anticaptcha/__init__.py | 7 + .../Shared/python_anticaptcha/base.py | 114 ++++++++++ .../Shared/python_anticaptcha/exceptions.py | 23 ++ .../Shared/python_anticaptcha/fields.py | 199 ++++++++++++++++++ .../Shared/python_anticaptcha/proxy.py | 28 +++ .../Shared/python_anticaptcha/tasks.py | 128 +++++++++++ .../Shared/subliminal/providers/addic7ed.py | 6 +- .../subliminal_patch/providers/addic7ed.py | 101 +++++++-- 11 files changed, 662 insertions(+), 32 deletions(-) create mode 100644 Contents/Libraries/Shared/python_anticaptcha/__init__.py create mode 100644 Contents/Libraries/Shared/python_anticaptcha/base.py create mode 100644 Contents/Libraries/Shared/python_anticaptcha/exceptions.py create mode 100644 Contents/Libraries/Shared/python_anticaptcha/fields.py create mode 100644 Contents/Libraries/Shared/python_anticaptcha/proxy.py create mode 100644 Contents/Libraries/Shared/python_anticaptcha/tasks.py diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 75d569a16..9adc83c27 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -367,7 +367,8 @@ def ValidatePrefs(): "enable_channel", "permissions_ok", "missing_permissions", "fs_encoding", "subtitle_destination_folder", "include", "include_exclude_paths", "include_exclude_sz_files", "new_style_cache", "dbm_supported", "lang_list", "providers", "normal_subs", "forced_only", "forced_also", - "plex_transcoder", "refiner_settings", "unrar", "adv_cfg_path", "use_custom_dns"]: + "plex_transcoder", "refiner_settings", "unrar", "adv_cfg_path", "use_custom_dns", + "anticaptcha_token"]: value = getattr(config, attr) if isinstance(value, dict): @@ -375,6 +376,9 @@ def ValidatePrefs(): Log.Debug("config.%s: %s", attr, d) continue + if attr in ("api_key", "anticaptcha_token"): + value = "xxxxxxxxxxxxxxxxxxxxxxxxx" + Log.Debug("config.%s: %s", attr, value) for attr in ["plugin_log_path", "server_log_path"]: diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 43f2a5a0a..9b462bda9 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -148,6 +148,7 @@ class Config(object): unrar = None adv_cfg_path = None use_custom_dns = False + anticaptcha_token = None store_recently_played_amount = 40 @@ -186,6 +187,7 @@ def initialize(self): self.debug_i18n = self.advanced.debug_i18n os.environ["SZ_USER_AGENT"] = self.get_user_agent() + os.environ["ANTICAPTCHA_ACCOUNT_KEY"] = self.anticaptcha_token = str(Prefs["anticaptcha.api_key"]) or "" self.setup_proxies() self.set_plugin_mode() @@ -752,8 +754,8 @@ def providers_by_prefs(self): 'podnapisi': cast_bool(Prefs['provider.podnapisi.enabled']), #'titlovi': cast_bool(Prefs['provider.titlovi.enabled']), 'titlovi': False, - #'addic7ed': cast_bool(Prefs['provider.addic7ed.enabled']), - 'addic7ed': False, + 'addic7ed': cast_bool(Prefs['provider.addic7ed.enabled']) and self.anticaptcha_token, + #'addic7ed': False, 'tvsubtitles': cast_bool(Prefs['provider.tvsubtitles.enabled']), 'legendastv': cast_bool(Prefs['provider.legendastv.enabled']), 'napiprojekt': cast_bool(Prefs['provider.napiprojekt.enabled']), @@ -781,7 +783,7 @@ def get_providers(self, media_type="series"): # ditch non-forced-subtitles-reporting providers providers_forced_off = {} if self.forced_only: - #providers["addic7ed"] = False + providers["addic7ed"] = False providers["tvsubtitles"] = False providers["legendastv"] = False providers["napiprojekt"] = False @@ -838,10 +840,10 @@ def get_provider_settings(self): os_skip_wrong_fps = self.advanced.providers.opensubtitles.skip_wrong_fps \ if self.advanced.providers.opensubtitles.skip_wrong_fps is not None else True - provider_settings = {#'addic7ed': {'username': Prefs['provider.addic7ed.username'], - # 'password': Prefs['provider.addic7ed.password'], - # 'use_random_agents': cast_bool(Prefs['provider.addic7ed.use_random_agents1']), - # }, + provider_settings = {'addic7ed': {'username': Prefs['provider.addic7ed.username'], + 'password': Prefs['provider.addic7ed.password'], + 'use_random_agents': cast_bool(Prefs['provider.addic7ed.use_random_agents1']), + }, 'opensubtitles': {'username': Prefs['provider.opensubtitles.username'], 'password': Prefs['provider.opensubtitles.password'], 'use_tag_search': self.exact_filenames, @@ -1081,7 +1083,7 @@ def init_subliminal_patches(self): subliminal_patch.core.INCLUDE_EXOTIC_SUBS = self.exotic_ext subliminal_patch.core.DOWNLOAD_TRIES = int(Prefs['subtitles.try_downloads']) - #subliminal.score.episode_scores["addic7ed_boost"] = int(Prefs['provider.addic7ed.boost_by2']) + subliminal.score.episode_scores["addic7ed_boost"] = int(Prefs['provider.addic7ed.boost_by2']) if self.use_custom_dns: subliminal_patch.http.set_custom_resolver() diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index b08486856..4b94e1d12 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -273,6 +273,12 @@ "type": "text", "default": "" }, + { + "id": "anticaptcha.api_key", + "label": "AntiCaptcha account key (anti-captcha.com, needs credits, for Addic7ed)", + "type": "text", + "default": "" + }, { "id": "provider.opensubtitles.enabled", "label": "Provider: Enable OpenSubtitles", @@ -305,6 +311,64 @@ "type": "bool", "default": "true" }, + { + "id": "provider.addic7ed.enabled", + "label": "Provider: Enable Addic7ed (needs AntiCaptcha key)", + "type": "bool", + "default": "true" + }, + { + "id": "provider.addic7ed.username", + "label": "Addic7ed Username", + "type": "text", + "default": "" + }, + { + "id": "provider.addic7ed.password", + "label": "Addic7ed Password", + "type": "text", + "option": "hidden", + "default": "", + "secure": "true" + }, + { + "id": "provider.addic7ed.boost_by2", + "label": "Addic7ed: boost score (if requirements met)", + "type": "enum", + "values": [ + "100", + "95", + "90", + "85", + "80", + "75", + "70", + "67", + "65", + "60", + "55", + "50", + "45", + "40", + "35", + "30", + "25", + "21", + "20", + "19", + "15", + "10", + "5", + "0" + ], + "default": "19" + }, + { + "id": "provider.addic7ed.use_random_agents1", + "label": "Addic7ed: Use random user agents", + "type": "bool", + "default": "true" + }, { "id": "provider.legendastv.enabled", "label": "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", diff --git a/Contents/Libraries/Shared/python_anticaptcha/__init__.py b/Contents/Libraries/Shared/python_anticaptcha/__init__.py new file mode 100644 index 000000000..ac9f0550f --- /dev/null +++ b/Contents/Libraries/Shared/python_anticaptcha/__init__.py @@ -0,0 +1,7 @@ +from .base import AnticaptchaClient +from .tasks import NoCaptchaTask, NoCaptchaTaskProxylessTask, ImageToTextTask, FunCaptchaTask +from .proxy import Proxy +from .exceptions import AnticaptchaException +from .fields import SimpleText, Image, WebLink, TextInput, Textarea, Checkbox, Select, Radio, ImageUpload + +AnticatpchaException = AnticaptchaException \ No newline at end of file diff --git a/Contents/Libraries/Shared/python_anticaptcha/base.py b/Contents/Libraries/Shared/python_anticaptcha/base.py new file mode 100644 index 000000000..fca8cdf53 --- /dev/null +++ b/Contents/Libraries/Shared/python_anticaptcha/base.py @@ -0,0 +1,114 @@ +import requests +import time + +from six.moves.urllib_parse import urljoin +from .exceptions import AnticaptchaException + +SLEEP_EVERY_CHECK_FINISHED = 3 +MAXIMUM_JOIN_TIME = 60 * 5 + + +class Job(object): + client = None + task_id = None + _last_result = None + + def __init__(self, client, task_id): + self.client = client + self.task_id = task_id + + def _update(self): + self._last_result = self.client.getTaskResult(self.task_id) + + def check_is_ready(self): + self._update() + return self._last_result['status'] == 'ready' + + def get_solution_response(self): # Recaptcha + return self._last_result['solution']['gRecaptchaResponse'] + + def get_token_response(self): # Funcaptcha + return self._last_result['solution']['token'] + + def get_answers(self): + return self._last_result['solution']['answers'] + + def get_captcha_text(self): # Image + return self._last_result['solution']['text'] + + def report_incorrect(self): + return self.client.reportIncorrectImage(self.task_id) + + def join(self, maximum_time=None): + elapsed_time = 0 + maximum_time = maximum_time or MAXIMUM_JOIN_TIME + while not self.check_is_ready(): + time.sleep(SLEEP_EVERY_CHECK_FINISHED) + elapsed_time += SLEEP_EVERY_CHECK_FINISHED + if elapsed_time is not None and elapsed_time > maximum_time: + raise AnticaptchaException(None, 250, + "The execution time exceeded a maximum time of {} seconds. It takes {} seconds.".format( + maximum_time, elapsed_time)) + + +class AnticaptchaClient(object): + client_key = None + CREATE_TASK_URL = "/createTask" + TASK_RESULT_URL = "/getTaskResult" + BALANCE_URL = "/getBalance" + REPORT_IMAGE_URL = "/reportIncorrectImageCaptcha" + SOFT_ID = 847 + language_pool = "en" + + def __init__(self, client_key, language_pool="en", host="api.anti-captcha.com", use_ssl=True): + self.client_key = client_key + self.language_pool = language_pool + self.base_url = "{proto}://{host}/".format(proto="https" if use_ssl else "http", + host=host) + self.session = requests.Session() + + @property + def client_ip(self): + if not hasattr(self, '_client_ip'): + self._client_ip = self.session.get('http://httpbin.org/ip').json()['origin'] + return self._client_ip + + def _check_response(self, response): + if response.get('errorId', False) == 11: + response['errorDescription'] = "{} Your missing IP address is {}.".format(response['errorDescription'], + self.client_ip) + if response.get('errorId', False): + raise AnticaptchaException(response['errorId'], + response['errorCode'], + response['errorDescription']) + + def createTask(self, task): + request = {"clientKey": self.client_key, + "task": task.serialize(), + "softId": self.SOFT_ID, + "languagePool": self.language_pool, + } + response = self.session.post(urljoin(self.base_url, self.CREATE_TASK_URL), json=request).json() + self._check_response(response) + return Job(self, response['taskId']) + + def getTaskResult(self, task_id): + request = {"clientKey": self.client_key, + "taskId": task_id} + response = self.session.post(urljoin(self.base_url, self.TASK_RESULT_URL), json=request).json() + self._check_response(response) + return response + + def getBalance(self): + request = {"clientKey": self.client_key} + response = self.session.post(urljoin(self.base_url, self.BALANCE_URL), json=request).json() + self._check_response(response) + return response['balance'] + + def reportIncorrectImage(self, task_id): + request = {"clientKey": self.client_key, + "taskId": task_id + } + response = self.session.post(urljoin(self.base_url, self.REPORT_IMAGE_URL), json=request).json() + self._check_response(response) + return response.get('status', False) != False diff --git a/Contents/Libraries/Shared/python_anticaptcha/exceptions.py b/Contents/Libraries/Shared/python_anticaptcha/exceptions.py new file mode 100644 index 000000000..f37eb372c --- /dev/null +++ b/Contents/Libraries/Shared/python_anticaptcha/exceptions.py @@ -0,0 +1,23 @@ +class AnticaptchaException(Exception): + def __init__(self, error_id, error_code, error_description, *args): + super(AnticaptchaException, self).__init__("[{}:{}]{}".format(error_code, error_id, error_description)) + self.error_description = error_description + self.error_id = error_id + self.error_code = error_code + + +AnticatpchaException = AnticaptchaException + + +class InvalidWidthException(AnticaptchaException): + def __init__(self, width): + self.width = width + msg = 'Invalid width (%s). Can be one of these: 100, 50, 33, 25.' % (self.width,) + super(InvalidWidthException, self).__init__("AC-1", 1, msg) + + +class MissingNameException(AnticaptchaException): + def __init__(self, cls): + self.cls = cls + msg = 'Missing name data in {0}. Provide {0}.__init__(name="X") or {0}.serialize(name="X")'.format(str(self.cls)) + super(MissingNameException, self).__init__("AC-2", 2, msg) diff --git a/Contents/Libraries/Shared/python_anticaptcha/fields.py b/Contents/Libraries/Shared/python_anticaptcha/fields.py new file mode 100644 index 000000000..9e6245946 --- /dev/null +++ b/Contents/Libraries/Shared/python_anticaptcha/fields.py @@ -0,0 +1,199 @@ +import six +from python_anticaptcha.exceptions import InvalidWidthException, MissingNameException + + +class BaseField(object): + label = None + labelHint = None + + def serialize(self, name=None): + data = {} + if self.label: + data['label'] = self.label or False + if self.labelHint: + data['labelHint'] = self.labelHint or False + return data + + +class NameBaseField(BaseField): + name = None + + def serialize(self, name=None): + data = super(NameBaseField, self).serialize(name) + if name: + data['name'] = name + elif self.name: + data['name'] = self.name + else: + raise MissingNameException(cls=self.__class__) + return data + + +class SimpleText(BaseField): + contentType = 'text' + + def __init__(self, content, label=None, labelHint=None, width=None): + self.label = label + self.labelHint = labelHint + + self.content = content + self.width = width + + def serialize(self, name=None): + data = super(SimpleText, self).serialize(name) + data['contentType'] = self.contentType + data['content'] = self.content + + if self.width: + if self.width not in [100, 50, 33, 25]: + raise InvalidWidthException(self.width) + data['inputOptions'] = {} + data['width'] = self.width + return data + + +class Image(BaseField): + contentType = 'image' + + def __init__(self, imageUrl, label=None, labelHint=None): + self.label = label + self.labelHint = labelHint + self.imageUrl = imageUrl + + def serialize(self, name=None): + data = super(Image, self).serialize(name) + data['contentType'] = self.contentType + data['content'] = self.imageUrl + return data + + +class WebLink(BaseField): + contentType = 'link' + + def __init__(self, linkText, linkUrl, label=None, labelHint=None, width=None): + self.label = label + self.labelHint = labelHint + + self.linkText = linkText + self.linkUrl = linkUrl + + self.width = width + + def serialize(self, name=None): + data = super(WebLink, self).serialize(name) + data['contentType'] = self.contentType + + if self.width: + if self.width not in [100, 50, 33, 25]: + raise InvalidWidthException(self.width) + data['inputOptions'] = {} + data['width'] = self.width + + data.update({'content': {'url': self.linkUrl, + 'text': self.linkText}}) + + return data + + +class TextInput(NameBaseField): + def __init__(self, placeHolder=None, label=None, labelHint=None, width=None): + self.label = label + self.labelHint = labelHint + + self.placeHolder = placeHolder + + self.width = width + + def serialize(self, name=None): + data = super(TextInput, self).serialize(name) + data['inputType'] = 'text' + + data['inputOptions'] = {} + + if self.width: + if self.width not in [100, 50, 33, 25]: + raise InvalidWidthException(self.width) + + data['inputOptions']['width'] = str(self.width) + + if self.placeHolder: + data['inputOptions']['placeHolder'] = self.placeHolder + return data + + +class Textarea(NameBaseField): + def __init__(self, placeHolder=None, rows=None, label=None, width=None, labelHint=None): + self.label = label + self.labelHint = labelHint + + self.placeHolder = placeHolder + self.rows = rows + self.width = width + + def serialize(self, name=None): + data = super(Textarea, self).serialize(name) + data['inputType'] = 'textarea' + data['inputOptions'] = {} + if self.rows: + data['inputOptions']['rows'] = str(self.rows) + if self.placeHolder: + data['inputOptions']['placeHolder'] = self.placeHolder + if self.width: + data['inputOptions']['width'] = str(self.width) + return data + + +class Checkbox(NameBaseField): + def __init__(self, text, label=None, labelHint=None): + self.label = label + self.labelHint = labelHint + + self.text = text + + def serialize(self, name=None): + data = super(Checkbox, self).serialize(name) + data['inputType'] = 'checkbox' + data['inputOptions'] = {'label': self.text} + return data + + +class Select(NameBaseField): + type = 'select' + + def __init__(self, label=None, choices=None, labelHint=None): + self.label = label + self.labelHint = labelHint + self.choices = choices or () + + def get_choices(self): + for choice in self.choices: + if isinstance(choice, six.text_type): + yield choice, choice + else: + yield choice + + def serialize(self, name=None): + data = super(Select, self).serialize(name) + data['inputType'] = self.type + + data['inputOptions'] = [] + for value, caption in self.get_choices(): + data['inputOptions'].append({"value": value, + "caption": caption}) + + return data + + +class Radio(Select): + type = 'radio' + + +class ImageUpload(NameBaseField): + def __init__(self, label=None, labelHint=None): + self.label = label + self.labelHint = labelHint + + def serialize(self, name=None): + data = super(ImageUpload, self).serialize(name) + data['inputType'] = 'imageUpload' + return data diff --git a/Contents/Libraries/Shared/python_anticaptcha/proxy.py b/Contents/Libraries/Shared/python_anticaptcha/proxy.py new file mode 100644 index 000000000..907232f7e --- /dev/null +++ b/Contents/Libraries/Shared/python_anticaptcha/proxy.py @@ -0,0 +1,28 @@ +from six.moves.urllib_parse import urlparse + + +class Proxy(object): + def __init__(self, proxy_type, proxy_address, proxy_port, proxy_login, proxy_password): + self.proxyType = proxy_type + self.proxyAddress = proxy_address + self.proxyPort = proxy_port + self.proxyLogin = proxy_login + self.proxyPassword = proxy_password + + def serialize(self): + result = {'proxyType': self.proxyType, + 'proxyAddress': self.proxyAddress, + 'proxyPort': self.proxyPort} + if self.proxyLogin or self.proxyPassword: + result['proxyLogin'] = self.proxyLogin + result['proxyPassword'] = self.proxyPassword + return result + + @classmethod + def parse_url(cls, url): + parsed = urlparse(url) + return cls(proxy_type=parsed.scheme, + proxy_address=parsed.hostname, + proxy_port=parsed.port, + proxy_login=parsed.username, + proxy_password=parsed.password) diff --git a/Contents/Libraries/Shared/python_anticaptcha/tasks.py b/Contents/Libraries/Shared/python_anticaptcha/tasks.py new file mode 100644 index 000000000..57462763f --- /dev/null +++ b/Contents/Libraries/Shared/python_anticaptcha/tasks.py @@ -0,0 +1,128 @@ +import base64 +from .fields import BaseField + + +class BaseTask(object): + def serialize(self, **result): + return result + + +class ProxyMixin(BaseTask): + def __init__(self, *args, **kwargs): + self.proxy = kwargs.pop('proxy') + self.userAgent = kwargs.pop('user_agent') + self.cookies = kwargs.pop('cookies', '') + super(ProxyMixin, self).__init__(*args, **kwargs) + + def serialize(self, **result): + result = super(ProxyMixin, self).serialize(**result) + result.update(self.proxy.serialize()) + result['userAgent'] = self.userAgent + if self.cookies: + result['cookies'] = self.cookies + return result + + +class NoCaptchaTaskProxylessTask(BaseTask): + type = "NoCaptchaTaskProxyless" + websiteURL = None + websiteKey = None + websiteSToken = None + + def __init__(self, website_url, website_key, website_s_token=None, is_invisible=None): + self.websiteURL = website_url + self.websiteKey = website_key + self.websiteSToken = website_s_token + self.isInvisible = is_invisible + + def serialize(self): + data = {'type': self.type, + 'websiteURL': self.websiteURL, + 'websiteKey': self.websiteKey} + if self.websiteSToken is not None: + data['websiteSToken'] = self.websiteSToken + if self.isInvisible is not None: + data['isInvisible'] = self.isInvisible + return data + + +class FunCaptchaTask(ProxyMixin): + type = "FunCaptchaTask" + websiteURL = None + websiteKey = None + + def __init__(self, website_url, website_key, *args, **kwargs): + self.websiteURL = website_url + self.websiteKey = website_key + super(FunCaptchaTask, self).__init__(*args, **kwargs) + + def serialize(self, **result): + result = super(FunCaptchaTask, self).serialize(**result) + result.update({'type': self.type, + 'websiteURL': self.websiteURL, + 'websitePublicKey': self.websiteKey}) + return result + + +class NoCaptchaTask(ProxyMixin, NoCaptchaTaskProxylessTask): + type = "NoCaptchaTask" + + +class ImageToTextTask(object): + type = "ImageToTextTask" + fp = None + phrase = None + case = None + numeric = None + math = None + minLength = None + maxLength = None + + def __init__(self, fp, phrase=None, case=None, numeric=None, math=None, min_length=None, max_length=None): + self.fp = fp + self.phrase = phrase + self.case = case + self.numeric = numeric + self.math = math + self.minLength = min_length + self.maxLength = max_length + + def serialize(self): + return {'type': self.type, + 'body': base64.b64encode(self.fp.read()).decode('utf-8'), + 'phrase': self.phrase, + 'case': self.case, + 'numeric': self.numeric, + 'math': self.math, + 'minLength': self.minLength, + 'maxLength': self.maxLength} + + +class CustomCaptchaTask(BaseTask): + type = 'CustomCaptchaTask' + imageUrl = None + assignment = None + form = None + + def __init__(self, imageUrl, form=None, assignment=None): + self.imageUrl = imageUrl + self.form = form or {} + self.assignment = assignment + + def serialize(self): + data = super(CustomCaptchaTask, self).serialize() + data.update({'type': self.type, + 'imageUrl': self.imageUrl}) + if self.form: + forms = [] + for name, field in self.form.items(): + if isinstance(field, BaseField): + forms.append(field.serialize(name)) + else: + field = field.copy() + field['name'] = name + forms.append(field) + data['forms'] = forms + if self.assignment: + data['assignment'] = self.assignment + return data diff --git a/Contents/Libraries/Shared/subliminal/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal/providers/addic7ed.py index 2926081e0..6d367ae84 100644 --- a/Contents/Libraries/Shared/subliminal/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal/providers/addic7ed.py @@ -230,9 +230,9 @@ def get_show_id(self, series, year=None, country_code=None): show_id = show_ids.get(series_sanitized) # search as last resort - if not show_id: - logger.warning('Series %s not found in show ids', series) - show_id = self._search_show_id(series) + # if not show_id: + # logger.warning('Series %s not found in show ids', series) + # show_id = self._search_show_id(series) return show_id diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 51913d887..319d74bbb 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -1,13 +1,14 @@ # coding=utf-8 import logging import re +import os import datetime import subliminal import time from random import randint from dogpile.cache.api import NO_VALUE from requests import Session - +from python_anticaptcha import AnticaptchaClient, NoCaptchaTaskProxylessTask, NoCaptchaTask, AnticaptchaException from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded, AuthenticationError from subliminal.providers.addic7ed import Addic7edProvider as _Addic7edProvider, \ Addic7edSubtitle as _Addic7edSubtitle, ParserBeautifulSoup, show_cells_re @@ -64,6 +65,7 @@ class Addic7edProvider(_Addic7edProvider): USE_ADDICTED_RANDOM_AGENTS = False hearing_impaired_verifiable = True subtitle_class = Addic7edSubtitle + server_url = 'https://www.addic7ed.com/' sanitize_characters = {'-', ':', '(', ')', '.', '/'} @@ -83,37 +85,96 @@ def initialize(self): # login if self.username and self.password: - ccks = region.get("addic7ed_cookies", expiration_time=86400) + ccks = region.get("addic7ed_data", expiration_time=86400) if ccks != NO_VALUE: + cookies, user_agent = ccks + logger.debug("Addic7ed: Re-using previous user agent") + self.session.headers["User-Agent"] = user_agent try: - self.session.cookies._cookies.update(ccks) - r = self.session.get(self.server_url + 'panel.php', allow_redirects=False, timeout=10) + self.session.cookies._cookies.update(cookies) + r = self.session.get(self.server_url + 'panel.php', allow_redirects=False, timeout=10, + headers={"Referer": self.server_url}) if r.status_code == 302: logger.info('Addic7ed: Login expired') - region.delete("addic7ed_cookies") + region.delete("addic7ed_data") else: - logger.info('Addic7ed: Reusing old login') + logger.info('Addic7ed: Re-using old login') self.logged_in = True return except: pass - logger.info('Addic7ed: Logging in') - data = {'username': self.username, 'password': self.password, 'Submit': 'Log in'} - r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10, - headers={"Referer": self.server_url + "login.php"}) - - if "relax, slow down" in r.content: - raise TooManyRequests(self.username) - - if r.status_code != 302: - raise AuthenticationError(self.username) + for tries in range(3): + logger.info('Addic7ed: Logging in') + data = {'username': self.username, 'password': self.password, 'Submit': 'Log in', 'url': ''} - region.set("addic7ed_cookies", self.session.cookies._cookies) + r = self.session.get(self.server_url + 'login.php', timeout=10, headers={"Referer": self.server_url}) + if "grecaptcha" in r.content: + logger.info('Addic7ed: Solving captcha') + anticaptcha_key = os.environ.get("ANTICAPTCHA_ACCOUNT_KEY") + if not anticaptcha_key: + logger.error("AntiCaptcha key not given, exiting") + return - logger.debug('Addic7ed: Logged in') - self.logged_in = True + client = AnticaptchaClient(anticaptcha_key) + site_key = re.search(r'grecaptcha.execute\(\'(.+?)\',', r.content).group(1) + logger.debug('Addic7ed: Using site-key: %s', site_key) + try: + task = NoCaptchaTaskProxylessTask(website_url=self.server_url + 'login.php', + website_key=site_key) + job = client.createTask(task) + job.join() + data["recaptcha_response"] = job.get_solution_response() + except AnticaptchaException as e: + if tries >= 2: + logger.error("Addic7ed: Captcha solving finally failed. Exiting") + return + + if e.error_code == 'ERROR_ZERO_BALANCE': + logger.error("Addic7ed: No balance left on captcha solving service. Exiting") + return + + elif e.error_code == 'ERROR_NO_SLOT_AVAILABLE': + logger.info("Addic7ed: No captcha solving slot available, retrying") + time.sleep(5.0) + continue + + elif e.error_code == 'ERROR_KEY_DOES_NOT_EXIST': + logger.error("Addic7ed: Bad AntiCaptcha API key") + return + + elif e.error_id is None and e.error_code == 250: + # timeout + if tries < 3: + logger.info("Addic7ed: Captcha solving timed out, retrying") + time.sleep(1.0) + continue + else: + logger.error("Addic7ed: Captcha solving timed out three times; bailing out") + return + raise + + r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10, + headers={"Referer": self.server_url + "login.php"}) + + if "relax, slow down" in r.content: + raise TooManyRequests(self.username) + + if r.status_code != 302: + if tries < 3: + time.sleep(1.0) + continue + + raise AuthenticationError(self.username) + + region.set("addic7ed_data", (self.session.cookies._cookies, self.session.headers["User-Agent"])) + + logger.debug('Addic7ed: Logged in') + self.logged_in = True + break + def terminate(self): + pass @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME) def _get_show_ids(self): @@ -140,7 +201,7 @@ def _get_show_ids(self): # populate the show ids show_ids = {} - for show in soup.select('td.version > h3 > a[href^="/show/"]'): + for show in soup.select('td > h3 > a[href^="/show/"]'): show_clean = sanitize(show.text, default_characters=self.sanitize_characters) try: show_id = int(show['href'][6:]) From cae64feaf9b7bd9e520cf94b71252c72b02348f4 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 5 Apr 2019 05:22:06 +0200 Subject: [PATCH 411/710] bump dev --- Contents/Info.plist | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 336859638..ede5222da 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -9,11 +9,11 @@ <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleShortVersionString</key> - <string>2.6.4</string> + <string>2.6.5</string> <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.4.2963</string> + <string>2.6.5.2965</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.4.2963 DEV +Version 2.6.5.2965 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From fe2f5b2d8f3325071c9a30625491f07c8591fd64 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 5 Apr 2019 05:41:56 +0200 Subject: [PATCH 412/710] providers: addic7ed: clarify log --- .../Libraries/Shared/subliminal_patch/providers/addic7ed.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 319d74bbb..184392449 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -110,7 +110,8 @@ def initialize(self): r = self.session.get(self.server_url + 'login.php', timeout=10, headers={"Referer": self.server_url}) if "grecaptcha" in r.content: - logger.info('Addic7ed: Solving captcha') + logger.info('Addic7ed: Solving captcha. This might take a couple of minutes, but should only ' + 'happen once every so often') anticaptcha_key = os.environ.get("ANTICAPTCHA_ACCOUNT_KEY") if not anticaptcha_key: logger.error("AntiCaptcha key not given, exiting") From a85d9e54424f00bff59e1b338b8b10cc6789c6c8 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 5 Apr 2019 05:42:14 +0200 Subject: [PATCH 413/710] refiners: omdb: fix imdb ids with spaces --- .../Libraries/Shared/subliminal_patch/refiners/omdb.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/omdb.py b/Contents/Libraries/Shared/subliminal_patch/refiners/omdb.py index 9ecb5155b..bef212f75 100644 --- a/Contents/Libraries/Shared/subliminal_patch/refiners/omdb.py +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/omdb.py @@ -4,7 +4,7 @@ import base64 import zlib from subliminal import __short_version__ -from subliminal.refiners.omdb import OMDBClient, refine +from subliminal.refiners.omdb import OMDBClient, refine as refine_orig, Episode, Movie class SZOMDBClient(OMDBClient): @@ -63,5 +63,13 @@ def search(self, title, type=None, year=None, page=1): return j +def refine(video, **kwargs): + refine_orig(video, **kwargs) + if isinstance(video, Episode) and video.series_imdb_id: + video.series_imdb_id = video.series_imdb_id.strip() + elif isinstance(video, Movie) and video.imdb_id: + video.imdb_id = video.imdb_id.strip() + + omdb_client = SZOMDBClient(headers={'User-Agent': 'Subliminal/%s' % __short_version__}) subliminal.refiners.omdb.omdb_client = omdb_client From 1912881d05d0a178447883fde142706907c7aa2e Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 5 Apr 2019 16:28:08 +0200 Subject: [PATCH 414/710] core: add subliminal_patch.pitcher providers: addic7ed: slim down solving --- .../Shared/subliminal_patch/pitcher.py | 108 +++++++++++++++++ .../subliminal_patch/providers/addic7ed.py | 110 +++++++----------- 2 files changed, 148 insertions(+), 70 deletions(-) create mode 100644 Contents/Libraries/Shared/subliminal_patch/pitcher.py diff --git a/Contents/Libraries/Shared/subliminal_patch/pitcher.py b/Contents/Libraries/Shared/subliminal_patch/pitcher.py new file mode 100644 index 000000000..332f3e698 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/pitcher.py @@ -0,0 +1,108 @@ +# coding=utf-8 + +import time +import logging +from python_anticaptcha import AnticaptchaClient, NoCaptchaTaskProxylessTask, NoCaptchaTask, AnticaptchaException + + +logger = logging.getLogger(__name__) + + +class PitcherRegistry(object): + pitchers = {} + + def register(self, cls): + self.pitchers[cls.name] = cls + return cls + + def get_pitcher(self, name): + return self.pitchers[name] + + +registry = pitchers = PitcherRegistry() + + +class Pitcher(object): + name = None + tries = 3 + client_key = None + job = None + client = None + + def __init__(self, client_key, tries=3): + self.client_key = client_key + self.tries = tries + + def get_client(self): + raise NotImplementedError + + def get_job(self): + raise NotImplementedError + + def throw(self): + self.client = self.get_client() + self.job = self.get_job() + + +@registry.register +class AntiCaptchaProxyLessPitcher(Pitcher): + name = "AntiCaptchaProxyLess" + host = "api.anti-captcha.com" + language_pool = "en" + use_ssl = True + website_url = None + website_key = None + website_name = None + + def __init__(self, website_name, client_key, website_url, website_key, tries=3, host=None, language_pool=None, + use_ssl=True): + super(AntiCaptchaProxyLessPitcher, self).__init__(client_key, tries=tries) + self.host = host or self.host + self.language_pool = language_pool or self.language_pool + self.use_ssl = use_ssl + self.website_name = website_name + self.website_key = website_key + self.website_url = website_url + + def get_client(self): + return AnticaptchaClient(self.client_key, self.language_pool, self.host, self.use_ssl) + + def get_job(self): + task = NoCaptchaTaskProxylessTask(website_url=self.website_url, website_key=self.website_key) + return self.client.createTask(task) + + def throw(self): + for i in range(self.tries): + super(AntiCaptchaProxyLessPitcher, self).throw() + try: + self.job.join() + return self.job.get_solution_response() + except AnticaptchaException as e: + if i >= self.tries - 1: + logger.error("%s: Captcha solving finally failed. Exiting", self.website_name) + return + + if e.error_code == 'ERROR_ZERO_BALANCE': + logger.error("%s: No balance left on captcha solving service. Exiting", self.website_name) + return + + elif e.error_code == 'ERROR_NO_SLOT_AVAILABLE': + logger.info("%s: No captcha solving slot available, retrying", self.website_name) + time.sleep(5.0) + continue + + elif e.error_code == 'ERROR_KEY_DOES_NOT_EXIST': + logger.error("%s: Bad AntiCaptcha API key", self.website_name) + return + + elif e.error_id is None and e.error_code == 250: + # timeout + if i < self.tries: + logger.info("%s: Captcha solving timed out, retrying", self.website_name) + time.sleep(1.0) + continue + else: + logger.error("%s: Captcha solving timed out three times; bailing out", self.website_name) + return + raise + diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 184392449..887e12ac7 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -16,7 +16,7 @@ from subliminal.subtitle import fix_line_ending from subliminal_patch.utils import sanitize from subliminal_patch.exceptions import TooManyRequests - +from subliminal_patch.pitcher import pitchers from subzero.language import Language logger = logging.getLogger(__name__) @@ -85,7 +85,7 @@ def initialize(self): # login if self.username and self.password: - ccks = region.get("addic7ed_data", expiration_time=86400) + ccks = region.get("addic7ed_data", expiration_time=15552000) # 6m if ccks != NO_VALUE: cookies, user_agent = ccks logger.debug("Addic7ed: Re-using previous user agent") @@ -104,75 +104,45 @@ def initialize(self): except: pass - for tries in range(3): - logger.info('Addic7ed: Logging in') - data = {'username': self.username, 'password': self.password, 'Submit': 'Log in', 'url': ''} - - r = self.session.get(self.server_url + 'login.php', timeout=10, headers={"Referer": self.server_url}) - if "grecaptcha" in r.content: - logger.info('Addic7ed: Solving captcha. This might take a couple of minutes, but should only ' - 'happen once every so often') - anticaptcha_key = os.environ.get("ANTICAPTCHA_ACCOUNT_KEY") - if not anticaptcha_key: - logger.error("AntiCaptcha key not given, exiting") - return + logger.info('Addic7ed: Logging in') + data = {'username': self.username, 'password': self.password, 'Submit': 'Log in', 'url': ''} - client = AnticaptchaClient(anticaptcha_key) - site_key = re.search(r'grecaptcha.execute\(\'(.+?)\',', r.content).group(1) - logger.debug('Addic7ed: Using site-key: %s', site_key) - try: - task = NoCaptchaTaskProxylessTask(website_url=self.server_url + 'login.php', - website_key=site_key) - job = client.createTask(task) - job.join() - data["recaptcha_response"] = job.get_solution_response() - except AnticaptchaException as e: - if tries >= 2: - logger.error("Addic7ed: Captcha solving finally failed. Exiting") - return - - if e.error_code == 'ERROR_ZERO_BALANCE': - logger.error("Addic7ed: No balance left on captcha solving service. Exiting") - return - - elif e.error_code == 'ERROR_NO_SLOT_AVAILABLE': - logger.info("Addic7ed: No captcha solving slot available, retrying") - time.sleep(5.0) - continue - - elif e.error_code == 'ERROR_KEY_DOES_NOT_EXIST': - logger.error("Addic7ed: Bad AntiCaptcha API key") - return - - elif e.error_id is None and e.error_code == 250: - # timeout - if tries < 3: - logger.info("Addic7ed: Captcha solving timed out, retrying") - time.sleep(1.0) - continue - else: - logger.error("Addic7ed: Captcha solving timed out three times; bailing out") - return - raise - - r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10, - headers={"Referer": self.server_url + "login.php"}) - - if "relax, slow down" in r.content: - raise TooManyRequests(self.username) - - if r.status_code != 302: - if tries < 3: - time.sleep(1.0) - continue - - raise AuthenticationError(self.username) - - region.set("addic7ed_data", (self.session.cookies._cookies, self.session.headers["User-Agent"])) - - logger.debug('Addic7ed: Logged in') - self.logged_in = True - break + r = self.session.get(self.server_url + 'login.php', timeout=10, headers={"Referer": self.server_url}) + if "grecaptcha" in r.content: + logger.info('Addic7ed: Solving captcha. This might take a couple of minutes, but should only ' + 'happen once every so often') + anticaptcha_key = os.environ.get("ANTICAPTCHA_ACCOUNT_KEY") + if not anticaptcha_key: + logger.error("AntiCaptcha key not given, exiting") + return + + site_key = re.search(r'grecaptcha.execute\(\'(.+?)\',', r.content).group(1) + if not site_key: + logger.error("Addic7ed: Captcha site-key not found!") + return + + pitcher_cls = pitchers.get_pitcher("AntiCaptchaProxyLess") + pitcher = pitcher_cls("Addic7ed", anticaptcha_key, self.server_url + 'login.php', site_key) + result = pitcher.throw() + if not result: + logger.error("Addic7ed: Couldn't solve captcha!") + return + + data["recaptcha_response"] = result + + r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10, + headers={"Referer": self.server_url + "login.php"}) + + if "relax, slow down" in r.content: + raise TooManyRequests(self.username) + + if r.status_code != 302: + raise AuthenticationError(self.username) + + region.set("addic7ed_data", (self.session.cookies._cookies, self.session.headers["User-Agent"])) + + logger.debug('Addic7ed: Logged in') + self.logged_in = True def terminate(self): pass From d415f6a9f27b3bae915471785aa27bac26731bc4 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 5 Apr 2019 22:24:53 +0200 Subject: [PATCH 415/710] core: pitchers: add DBCProxyLessPitcher providers: addic7ed: fixes --- .../Shared/subliminal_patch/pitcher.py | 80 +++++++++++++++---- .../subliminal_patch/providers/addic7ed.py | 73 +++++++++-------- 2 files changed, 106 insertions(+), 47 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/pitcher.py b/Contents/Libraries/Shared/subliminal_patch/pitcher.py index 332f3e698..5837574ae 100644 --- a/Contents/Libraries/Shared/subliminal_patch/pitcher.py +++ b/Contents/Libraries/Shared/subliminal_patch/pitcher.py @@ -2,7 +2,9 @@ import time import logging +import json from python_anticaptcha import AnticaptchaClient, NoCaptchaTaskProxylessTask, NoCaptchaTask, AnticaptchaException +from deathbycaptcha import SocketClient as DBCClient, DEFAULT_TOKEN_TIMEOUT logger = logging.getLogger(__name__) @@ -25,13 +27,21 @@ def get_pitcher(self, name): class Pitcher(object): name = None tries = 3 - client_key = None job = None client = None + website_url = None + website_key = None + website_name = None + solve_time = None + success = False - def __init__(self, client_key, tries=3): - self.client_key = client_key + def __init__(self, website_name, website_url, website_key, tries=3): self.tries = tries + self.website_name = website_name + self.website_key = website_key + self.website_url = website_url + self.success = False + self.solve_time = None def get_client(self): raise NotImplementedError @@ -39,30 +49,34 @@ def get_client(self): def get_job(self): raise NotImplementedError - def throw(self): + def _throw(self): self.client = self.get_client() self.job = self.get_job() + def throw(self): + t = time.time() + data = self._throw() + if self.success: + self.solve_time = time.time() - t + logger.info("%s: Solving took %ss", self.website_name, int(self.solve_time)) + return data + @registry.register class AntiCaptchaProxyLessPitcher(Pitcher): name = "AntiCaptchaProxyLess" host = "api.anti-captcha.com" language_pool = "en" + client_key = None use_ssl = True - website_url = None - website_key = None - website_name = None def __init__(self, website_name, client_key, website_url, website_key, tries=3, host=None, language_pool=None, use_ssl=True): - super(AntiCaptchaProxyLessPitcher, self).__init__(client_key, tries=tries) + super(AntiCaptchaProxyLessPitcher, self).__init__(website_name, website_url, website_key, tries=tries) + self.client_key = client_key self.host = host or self.host self.language_pool = language_pool or self.language_pool self.use_ssl = use_ssl - self.website_name = website_name - self.website_key = website_key - self.website_url = website_url def get_client(self): return AnticaptchaClient(self.client_key, self.language_pool, self.host, self.use_ssl) @@ -71,12 +85,15 @@ def get_job(self): task = NoCaptchaTaskProxylessTask(website_url=self.website_url, website_key=self.website_key) return self.client.createTask(task) - def throw(self): + def _throw(self): for i in range(self.tries): - super(AntiCaptchaProxyLessPitcher, self).throw() try: + super(AntiCaptchaProxyLessPitcher, self)._throw() self.job.join() - return self.job.get_solution_response() + ret = self.job.get_solution_response() + if ret: + self.success = True + return ret except AnticaptchaException as e: if i >= self.tries - 1: logger.error("%s: Captcha solving finally failed. Exiting", self.website_name) @@ -106,3 +123,38 @@ def throw(self): return raise + +@registry.register +class DBCProxyLessPitcher(Pitcher): + name = "DeathByCaptchaProxyLess" + username = None + password = None + + def __init__(self, website_name, username, password, website_url, website_key, + timeout=DEFAULT_TOKEN_TIMEOUT, tries=3): + super(DBCProxyLessPitcher, self).__init__(website_name, website_url, website_key, tries=tries) + self.username = username + self.password = password + self.timeout = timeout + + def get_client(self): + return DBCClient(self.username, self.password) + + def get_job(self): + pass + + def _throw(self): + super(DBCProxyLessPitcher, self)._throw() + payload = json.dumps({ + "googlekey": self.website_key, + "pageurl": self.website_url + }) + try: + #balance = self.client.get_balance() + data = self.client.decode(timeout=self.timeout, type=4, token_params=payload) + if data and data["is_correct"]: + self.success = True + return data["text"] + except: + raise + diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 887e12ac7..dcfb5f5f9 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -105,39 +105,46 @@ def initialize(self): pass logger.info('Addic7ed: Logging in') - data = {'username': self.username, 'password': self.password, 'Submit': 'Log in', 'url': ''} - - r = self.session.get(self.server_url + 'login.php', timeout=10, headers={"Referer": self.server_url}) - if "grecaptcha" in r.content: - logger.info('Addic7ed: Solving captcha. This might take a couple of minutes, but should only ' - 'happen once every so often') - anticaptcha_key = os.environ.get("ANTICAPTCHA_ACCOUNT_KEY") - if not anticaptcha_key: - logger.error("AntiCaptcha key not given, exiting") - return - - site_key = re.search(r'grecaptcha.execute\(\'(.+?)\',', r.content).group(1) - if not site_key: - logger.error("Addic7ed: Captcha site-key not found!") - return - - pitcher_cls = pitchers.get_pitcher("AntiCaptchaProxyLess") - pitcher = pitcher_cls("Addic7ed", anticaptcha_key, self.server_url + 'login.php', site_key) - result = pitcher.throw() - if not result: - logger.error("Addic7ed: Couldn't solve captcha!") - return - - data["recaptcha_response"] = result - - r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10, - headers={"Referer": self.server_url + "login.php"}) - - if "relax, slow down" in r.content: - raise TooManyRequests(self.username) - - if r.status_code != 302: - raise AuthenticationError(self.username) + data = {'username': self.username, 'password': self.password, 'Submit': 'Log in', 'url': '', + 'remember': 'true'} + + tries = 0 + while tries < 3: + r = self.session.get(self.server_url + 'login.php', timeout=10, headers={"Referer": self.server_url}) + if "grecaptcha" in r.content: + logger.info('Addic7ed: Solving captcha. This might take a couple of minutes, but should only ' + 'happen once every so often') + anticaptcha_key = os.environ.get("ANTICAPTCHA_ACCOUNT_KEY") + if not anticaptcha_key: + logger.error("AntiCaptcha key not given, exiting") + return + + site_key = re.search(r'grecaptcha.execute\(\'(.+?)\',', r.content).group(1) + if not site_key: + logger.error("Addic7ed: Captcha site-key not found!") + return + + pitcher_cls = pitchers.get_pitcher("AntiCaptchaProxyLess") + pitcher = pitcher_cls("Addic7ed", anticaptcha_key, self.server_url + 'login.php', site_key) + + result = pitcher.throw() + if not result: + raise Exception("Addic7ed: Couldn't solve captcha!") + + data["recaptcha_response"] = result + + r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10, + headers={"Referer": self.server_url + "login.php"}) + + if "relax, slow down" in r.content: + raise TooManyRequests(self.username) + + if r.status_code != 302: + if "User <b></b> doesn't exist" in r.content and tries <= 2: + continue + + raise AuthenticationError(self.username) + tries += 1 region.set("addic7ed_data", (self.session.cookies._cookies, self.session.headers["User-Agent"])) From bbf5d6712c7c64910daa81b4ae4da58252d94ec0 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 5 Apr 2019 23:57:13 +0200 Subject: [PATCH 416/710] providers: addic7ed: fix forced triple loop --- .../Libraries/Shared/subliminal_patch/providers/addic7ed.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index dcfb5f5f9..83d225922 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -141,10 +141,12 @@ def initialize(self): if r.status_code != 302: if "User <b></b> doesn't exist" in r.content and tries <= 2: + logger.info("Addic7ed: Error, trying again. (%s/%s)", tries+1, 3) + tries += 1 continue raise AuthenticationError(self.username) - tries += 1 + break region.set("addic7ed_data", (self.session.cookies._cookies, self.session.headers["User-Agent"])) From 247ae71777ba3698cfa75a8de8780cd805d399bf Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 6 Apr 2019 05:07:06 +0200 Subject: [PATCH 417/710] wip --- Contents/Code/support/config.py | 1 - Contents/DefaultPrefs.json | 25 +- Contents/Libraries/Shared/deathbycaptcha.py | 516 ++++++++++++++++++ .../Shared/subliminal_patch/pitcher.py | 78 ++- .../subliminal_patch/providers/addic7ed.py | 20 +- 5 files changed, 613 insertions(+), 27 deletions(-) create mode 100644 Contents/Libraries/Shared/deathbycaptcha.py diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 9b462bda9..246439c1d 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -842,7 +842,6 @@ def get_provider_settings(self): provider_settings = {'addic7ed': {'username': Prefs['provider.addic7ed.username'], 'password': Prefs['provider.addic7ed.password'], - 'use_random_agents': cast_bool(Prefs['provider.addic7ed.use_random_agents1']), }, 'opensubtitles': {'username': Prefs['provider.opensubtitles.username'], 'password': Prefs['provider.opensubtitles.password'], diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 4b94e1d12..c0e4fa74c 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -273,9 +273,26 @@ "type": "text", "default": "" }, + { + "id": "anticaptcha.service", + "label": "AntiCaptcha-Service", + "type": "enum", + "values": [ + "none", + "anti-captcha.com", + "deathbycaptcha.com" + ], + "default": "none" + }, { "id": "anticaptcha.api_key", - "label": "AntiCaptcha account key (anti-captcha.com, needs credits, for Addic7ed)", + "label": "AntiCaptcha-Service key (anti-captcha.com: account key; deathbycaptcha.com: username:password; for Addic7ed)", + "type": "text", + "default": "" + }, + { + "id": "anticaptcha.proxy", + "label": "AntiCaptcha-Service proxy (type://[username:password@]addr.loc:port; type: http(s),socks4,socks5; DBC only HTTP)", "type": "text", "default": "" }, @@ -363,12 +380,6 @@ ], "default": "19" }, - { - "id": "provider.addic7ed.use_random_agents1", - "label": "Addic7ed: Use random user agents", - "type": "bool", - "default": "true" - }, { "id": "provider.legendastv.enabled", "label": "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", diff --git a/Contents/Libraries/Shared/deathbycaptcha.py b/Contents/Libraries/Shared/deathbycaptcha.py new file mode 100644 index 000000000..3c2fafb77 --- /dev/null +++ b/Contents/Libraries/Shared/deathbycaptcha.py @@ -0,0 +1,516 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +"""Death by Captcha HTTP and socket API clients. + +There are two types of Death by Captcha (DBC hereinafter) API: HTTP and +socket ones. Both offer the same functionalily, with the socket API +sporting faster responses and using way less connections. + +To access the socket API, use SocketClient class; for the HTTP API, use +HttpClient class. Both are thread-safe. SocketClient keeps a persistent +connection opened and serializes all API requests sent through it, thus +it is advised to keep a pool of them if you're script is heavily +multithreaded. + +Both SocketClient and HttpClient give you the following methods: + +get_user() + Returns your DBC account details as a dict with the following keys: + + "user": your account numeric ID; if login fails, it will be the only + item with the value of 0; + "rate": your CAPTCHA rate, i.e. how much you will be charged for one + solved CAPTCHA in US cents; + "balance": your DBC account balance in US cents; + "is_banned": flag indicating whether your account is suspended or not. + +get_balance() + Returns your DBC account balance in US cents. + +get_captcha(cid) + Returns an uploaded CAPTCHA details as a dict with the following keys: + + "captcha": the CAPTCHA numeric ID; if no such CAPTCHAs found, it will + be the only item with the value of 0; + "text": the CAPTCHA text, if solved, otherwise None; + "is_correct": flag indicating whether the CAPTCHA was solved correctly + (DBC can detect that in rare cases). + + The only argument `cid` is the CAPTCHA numeric ID. + +get_text(cid) + Returns an uploaded CAPTCHA text (None if not solved). The only argument + `cid` is the CAPTCHA numeric ID. + +report(cid) + Reports an incorrectly solved CAPTCHA. The only argument `cid` is the + CAPTCHA numeric ID. Returns True on success, False otherwise. + +upload(captcha) + Uploads a CAPTCHA. The only argument `captcha` can be either file-like + object (any object with `read` method defined, actually, so StringIO + will do), or CAPTCHA image file name. On successul upload you'll get + the CAPTCHA details dict (see get_captcha() method). + + NOTE: AT THIS POINT THE UPLOADED CAPTCHA IS NOT SOLVED YET! You have + to poll for its status periodically using get_captcha() or get_text() + method until the CAPTCHA is solved and you get the text. + +decode(captcha, timeout=DEFAULT_TIMEOUT) + A convenient method that uploads a CAPTCHA and polls for its status + periodically, but no longer than `timeout` (defaults to 60 seconds). + If solved, you'll get the CAPTCHA details dict (see get_captcha() + method for details). See upload() method for details on `captcha` + argument. + +Visit http://www.deathbycaptcha.com/user/api for updates. + +""" + +import base64 +import binascii +import errno +import imghdr +import random +import os +import select +import socket +import sys +import threading +import time +import urllib +import urllib2 +try: + from json import read as json_decode, write as json_encode +except ImportError: + try: + from json import loads as json_decode, dumps as json_encode + except ImportError: + from simplejson import loads as json_decode, dumps as json_encode + + +# API version and unique software ID +API_VERSION = 'DBC/Python v4.6' + +# Default CAPTCHA timeout and decode() polling interval +DEFAULT_TIMEOUT = 60 +DEFAULT_TOKEN_TIMEOUT = 120 +POLLS_INTERVAL = [1, 1, 2, 3, 2, 2, 3, 2, 2] +DFLT_POLL_INTERVAL = 3 + +# Base HTTP API url +HTTP_BASE_URL = 'http://api.dbcapi.me/api' + +# Preferred HTTP API server's response content type, do not change +HTTP_RESPONSE_TYPE = 'application/json' + +# Socket API server's host & ports range +SOCKET_HOST = 'api.dbcapi.me' +SOCKET_PORTS = range(8123, 8131) + + +def _load_image(captcha): + if hasattr(captcha, 'read'): + img = captcha.read() + elif type(captcha) == bytearray: + img = captcha + else: + img = '' + try: + captcha_file = open(captcha, 'rb') + except Exception: + raise + else: + img = captcha_file.read() + captcha_file.close() + if not len(img): + raise ValueError('CAPTCHA image is empty') + elif imghdr.what(None, img) is None: + raise TypeError('Unknown CAPTCHA image type') + else: + return img + + +class AccessDeniedException(Exception): + pass + + +class Client(object): + + """Death by Captcha API Client.""" + + def __init__(self, username, password): + self.is_verbose = False + self.userpwd = {'username': username, 'password': password} + + def _log(self, cmd, msg=''): + if self.is_verbose: + print '%d %s %s' % (time.time(), cmd, msg.rstrip()) + return self + + def close(self): + pass + + def connect(self): + pass + + def get_user(self): + """Fetch user details -- ID, balance, rate and banned status.""" + raise NotImplementedError() + + def get_balance(self): + """Fetch user balance (in US cents).""" + return self.get_user().get('balance') + + def get_captcha(self, cid): + """Fetch a CAPTCHA details -- ID, text and correctness flag.""" + raise NotImplementedError() + + def get_text(self, cid): + """Fetch a CAPTCHA text.""" + return self.get_captcha(cid).get('text') or None + + def report(self, cid): + """Report a CAPTCHA as incorrectly solved.""" + raise NotImplementedError() + + def upload(self, captcha): + """Upload a CAPTCHA. + + Accepts file names and file-like objects. Returns CAPTCHA details + dict on success. + + """ + raise NotImplementedError() + + def decode(self, captcha=None, timeout=None, **kwargs): + """ + Try to solve a CAPTCHA. + + See Client.upload() for arguments details. + + Uploads a CAPTCHA, polls for its status periodically with arbitrary + timeout (in seconds), returns CAPTCHA details if (correctly) solved. + """ + if not timeout: + if not captcha: + timeout = DEFAULT_TOKEN_TIMEOUT + else: + timeout = DEFAULT_TIMEOUT + + deadline = time.time() + (max(0, timeout) or DEFAULT_TIMEOUT) + uploaded_captcha = self.upload(captcha, **kwargs) + if uploaded_captcha: + intvl_idx = 0 # POLL_INTERVAL index + while deadline > time.time() and not uploaded_captcha.get('text'): + intvl, intvl_idx = self._get_poll_interval(intvl_idx) + time.sleep(intvl) + pulled = self.get_captcha(uploaded_captcha['captcha']) + if pulled['captcha'] == uploaded_captcha['captcha']: + uploaded_captcha = pulled + if uploaded_captcha.get('text') and \ + uploaded_captcha.get('is_correct'): + return uploaded_captcha + + def _get_poll_interval(self, idx): + """Returns poll interval and next index depending on index provided""" + + if len(POLLS_INTERVAL) > idx: + intvl = POLLS_INTERVAL[idx] + else: + intvl = DFLT_POLL_INTERVAL + idx += 1 + + return intvl, idx + + +class HttpClient(Client): + + """Death by Captcha HTTP API client.""" + + def __init__(self, *args): + Client.__init__(self, *args) + self.opener = urllib2.build_opener(urllib2.HTTPRedirectHandler()) + + def _call(self, cmd, payload=None, headers=None): + if headers is None: + headers = {} + headers['Accept'] = HTTP_RESPONSE_TYPE + headers['User-Agent'] = API_VERSION + if hasattr(payload, 'items'): + payload = urllib.urlencode(payload) + self._log('SEND', '%s %d %s' % (cmd, len(payload), payload)) + else: + self._log('SEND', '%s' % cmd) + if payload is not None: + headers['Content-Length'] = len(payload) + try: + response = self.opener.open(urllib2.Request( + HTTP_BASE_URL + '/' + cmd.strip('/'), + data=payload, + headers=headers + )).read() + except urllib2.HTTPError, err: + if 403 == err.code: + raise AccessDeniedException('Access denied, please check' + ' your credentials and/or balance') + elif 400 == err.code or 413 == err.code: + raise ValueError("CAPTCHA was rejected by the service, check" + " if it's a valid image") + elif 503 == err.code: + raise OverflowError("CAPTCHA was rejected due to service" + " overload, try again later") + else: + raise err + else: + self._log('RECV', '%d %s' % (len(response), response)) + try: + return json_decode(response) + except Exception: + raise RuntimeError('Invalid API response') + return {} + + def get_user(self): + return self._call('user', self.userpwd.copy()) or {'user': 0} + + def get_captcha(self, cid): + return self._call('captcha/%d' % cid) or {'captcha': 0} + + def report(self, cid): + return not self._call('captcha/%d/report' % cid, + self.userpwd.copy()).get('is_correct') + + def upload(self, captcha=None, **kwargs): + boundary = binascii.hexlify(os.urandom(16)) + banner = kwargs.get('banner', '') + if banner: + kwargs['banner'] = 'base64:' + base64.b64encode(_load_image(banner)) + body = '\r\n'.join(('\r\n'.join(( + '--%s' % boundary, + 'Content-Disposition: form-data; name="%s"' % k, + 'Content-Type: text/plain', + 'Content-Length: %d' % len(str(v)), + '', + str(v) + ))) for k, v in self.userpwd.items()) + + body += '\r\n'.join(('\r\n'.join(( + '--%s' % boundary, + 'Content-Disposition: form-data; name="%s"' % k, + 'Content-Type: text/plain', + 'Content-Length: %d' % len(str(v)), + '', + str(v) + ))) for k, v in kwargs.items()) + + if captcha: + img = _load_image(captcha) + body += '\r\n'.join(( + '', + '--%s' % boundary, + 'Content-Disposition: form-data; name="captchafile"; ' + 'filename="captcha"', + 'Content-Type: application/octet-stream', + 'Content-Length: %d' % len(img), + '', + img, + '--%s--' % boundary, + '' + )) + + response = self._call('captcha', body, { + 'Content-Type': 'multipart/form-data; boundary="%s"' % boundary + }) or {} + if response.get('captcha'): + return response + + +class SocketClient(Client): + + """Death by Captcha socket API client.""" + + TERMINATOR = '\r\n' + + def __init__(self, *args): + Client.__init__(self, *args) + self.socket_lock = threading.Lock() + self.socket = None + + def close(self): + if self.socket: + self._log('CLOSE') + try: + self.socket.shutdown(socket.SHUT_RDWR) + except socket.error: + pass + finally: + self.socket.close() + self.socket = None + + def connect(self): + if not self.socket: + self._log('CONN') + host = (socket.gethostbyname(SOCKET_HOST), + random.choice(SOCKET_PORTS)) + self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.socket.settimeout(0) + try: + self.socket.connect(host) + except socket.error, err: + if (err.args[0] not in + (errno.EAGAIN, errno.EWOULDBLOCK, errno.EINPROGRESS)): + self.close() + raise err + return self.socket + + def __del__(self): + self.close() + + def _sendrecv(self, sock, buf): + self._log('SEND', buf) + fds = [sock] + buf += self.TERMINATOR + response = '' + intvl_idx = 0 + while True: + intvl, intvl_idx = self._get_poll_interval(intvl_idx) + rds, wrs, exs = select.select((not buf and fds) or [], + (buf and fds) or [], + fds, + intvl) + if exs: + raise IOError('select() failed') + try: + if wrs: + while buf: + buf = buf[wrs[0].send(buf):] + elif rds: + while True: + s = rds[0].recv(256) + if not s: + raise IOError('recv(): connection lost') + else: + response += s + except socket.error, err: + if (err.args[0] not in + (errno.EAGAIN, errno.EWOULDBLOCK, errno.EINPROGRESS)): + raise err + if response.endswith(self.TERMINATOR): + self._log('RECV', response) + return response.rstrip(self.TERMINATOR) + raise IOError('send/recv timed out') + + def _call(self, cmd, data=None): + if data is None: + data = {} + data['cmd'] = cmd + data['version'] = API_VERSION + request = json_encode(data) + + response = None + for _ in range(2): + if not self.socket and cmd != 'login': + self._call('login', self.userpwd.copy()) + self.socket_lock.acquire() + try: + sock = self.connect() + response = self._sendrecv(sock, request) + except IOError, err: + sys.stderr.write(str(err) + "\n") + self.close() + except socket.error, err: + sys.stderr.write(str(err) + "\n") + self.close() + raise IOError('Connection refused') + else: + break + finally: + self.socket_lock.release() + + if response is None: + raise IOError('Connection lost or timed out during API request') + + try: + response = json_decode(response) + except Exception: + raise RuntimeError('Invalid API response') + + if not response.get('error'): + return response + + error = response['error'] + if error in ('not-logged-in', 'invalid-credentials'): + raise AccessDeniedException('Access denied, check your credentials') + elif 'banned' == error: + raise AccessDeniedException('Access denied, account is suspended') + elif 'insufficient-funds' == error: + raise AccessDeniedException( + 'CAPTCHA was rejected due to low balance') + elif 'invalid-captcha' == error: + raise ValueError('CAPTCHA is not a valid image') + elif 'service-overload' == error: + raise OverflowError( + 'CAPTCHA was rejected due to service overload, try again later') + else: + self.socket_lock.acquire() + self.close() + self.socket_lock.release() + raise RuntimeError('API server error occured: %s' % error) + + def get_user(self): + return self._call('user') or {'user': 0} + + def get_captcha(self, cid): + return self._call('captcha', {'captcha': cid}) or {'captcha': 0} + + def upload(self, captcha=None, **kwargs): + data = {} + if captcha: + data['captcha'] = base64.b64encode(_load_image(captcha)) + if kwargs: + banner = kwargs.get('banner', '') + if banner: + kwargs['banner'] = base64.b64encode(_load_image(banner)) + data.update(kwargs) + response = self._call('upload', data) + if response.get('captcha'): + uploaded_captcha = dict( + (k, response.get(k)) + for k in ('captcha', 'text', 'is_correct') + ) + if not uploaded_captcha['text']: + uploaded_captcha['text'] = None + return uploaded_captcha + + def report(self, cid): + return not self._call('report', {'captcha': cid}).get('is_correct') + + +if '__main__' == __name__: + # Put your DBC username & password here: + # client = HttpClient(sys.argv[1], sys.argv[2]) + client = SocketClient(sys.argv[1], sys.argv[2]) + client.is_verbose = True + + print 'Your balance is %s US cents' % client.get_balance() + + for fn in sys.argv[3:]: + try: + # Put your CAPTCHA image file name or file-like object, and optional + # solving timeout (in seconds) here: + captcha = client.decode(fn, DEFAULT_TIMEOUT) + except Exception, e: + sys.stderr.write('Failed uploading CAPTCHA: %s\n' % (e, )) + captcha = None + + if captcha: + print 'CAPTCHA %d solved: %s' % \ + (captcha['captcha'], captcha['text']) + + # Report as incorrectly solved if needed. Make sure the CAPTCHA was + # in fact incorrectly solved! + # try: + # client.report(captcha['captcha']) + # except Exception, e: + # sys.stderr.write('Failed reporting CAPTCHA: %s\n' % (e, )) diff --git a/Contents/Libraries/Shared/subliminal_patch/pitcher.py b/Contents/Libraries/Shared/subliminal_patch/pitcher.py index 5837574ae..12be90384 100644 --- a/Contents/Libraries/Shared/subliminal_patch/pitcher.py +++ b/Contents/Libraries/Shared/subliminal_patch/pitcher.py @@ -3,7 +3,9 @@ import time import logging import json -from python_anticaptcha import AnticaptchaClient, NoCaptchaTaskProxylessTask, NoCaptchaTask, AnticaptchaException +import requests +from python_anticaptcha import AnticaptchaClient, NoCaptchaTaskProxylessTask, NoCaptchaTask, AnticaptchaException,\ + Proxy from deathbycaptcha import SocketClient as DBCClient, DEFAULT_TOKEN_TIMEOUT @@ -35,7 +37,7 @@ class Pitcher(object): solve_time = None success = False - def __init__(self, website_name, website_url, website_key, tries=3): + def __init__(self, website_name, website_url, website_key, tries=3, *args, **kwargs): self.tries = tries self.website_name = website_name self.website_key = website_key @@ -69,20 +71,24 @@ class AntiCaptchaProxyLessPitcher(Pitcher): language_pool = "en" client_key = None use_ssl = True + is_invisible = False def __init__(self, website_name, client_key, website_url, website_key, tries=3, host=None, language_pool=None, - use_ssl=True): - super(AntiCaptchaProxyLessPitcher, self).__init__(website_name, website_url, website_key, tries=tries) + use_ssl=True, is_invisible=False, *args, **kwargs): + super(AntiCaptchaProxyLessPitcher, self).__init__(website_name, website_url, website_key, tries=tries, *args, + **kwargs) self.client_key = client_key self.host = host or self.host self.language_pool = language_pool or self.language_pool self.use_ssl = use_ssl + self.is_invisible = is_invisible def get_client(self): return AnticaptchaClient(self.client_key, self.language_pool, self.host, self.use_ssl) def get_job(self): - task = NoCaptchaTaskProxylessTask(website_url=self.website_url, website_key=self.website_key) + task = NoCaptchaTaskProxylessTask(website_url=self.website_url, website_key=self.website_key, + is_invisible=self.is_invisible) return self.client.createTask(task) def _throw(self): @@ -124,17 +130,40 @@ def _throw(self): raise +@registry.register +class AntiCaptchaPitcher(AntiCaptchaProxyLessPitcher): + name = "AntiCaptcha" + proxy = None + user_agent = None + cookies = None + + def __init__(self, *args, **kwargs): + self.proxy = Proxy.parse_url(kwargs.pop("proxy")) + print self.proxy.__dict__ + self.user_agent = kwargs.pop("user_agent") + cookies = kwargs.pop("cookies", {}) + if isinstance(cookies, dict): + self.cookies = ";".join(["%s=%s" % (k, v) for k, v in cookies.iteritems()]) + + super(AntiCaptchaPitcher, self).__init__(*args, **kwargs) + + def get_job(self): + task = NoCaptchaTask(website_url=self.website_url, website_key=self.website_key, proxy=self.proxy, + user_agent=self.user_agent, cookies=self.cookies, is_invisible=self.is_invisible) + return self.client.createTask(task) + + @registry.register class DBCProxyLessPitcher(Pitcher): name = "DeathByCaptchaProxyLess" username = None password = None - def __init__(self, website_name, username, password, website_url, website_key, - timeout=DEFAULT_TOKEN_TIMEOUT, tries=3): + def __init__(self, website_name, client_key, website_url, website_key, + timeout=DEFAULT_TOKEN_TIMEOUT, tries=3, *args, **kwargs): super(DBCProxyLessPitcher, self).__init__(website_name, website_url, website_key, tries=tries) - self.username = username - self.password = password + + self.username, self.password = client_key.split(":", 1) self.timeout = timeout def get_client(self): @@ -143,12 +172,16 @@ def get_client(self): def get_job(self): pass - def _throw(self): - super(DBCProxyLessPitcher, self)._throw() - payload = json.dumps({ + @property + def payload_dict(self): + return { "googlekey": self.website_key, "pageurl": self.website_url - }) + } + + def _throw(self): + super(DBCProxyLessPitcher, self)._throw() + payload = json.dumps(self.payload_dict) try: #balance = self.client.get_balance() data = self.client.decode(timeout=self.timeout, type=4, token_params=payload) @@ -158,3 +191,22 @@ def _throw(self): except: raise + +@registry.register +class DBCPitcher(DBCProxyLessPitcher): + proxy = None + proxy_type = "HTTP" + + def __init__(self, *args, **kwargs): + self.proxy = kwargs.pop("proxy") + super(DBCPitcher, self).__init__(*args, **kwargs) + + @property + def payload_dict(self): + payload = super(DBCPitcher, self).payload_dict + payload.update({ + "proxytype": self.proxy_type, + "proxy": self.proxy + }) + return payload + diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 83d225922..086343e98 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -5,6 +5,8 @@ import datetime import subliminal import time +import requests + from random import randint from dogpile.cache.api import NO_VALUE from requests import Session @@ -77,11 +79,10 @@ def initialize(self): self.session = Session() self.session.headers['User-Agent'] = 'Subliminal/%s' % subliminal.__short_version__ - if self.USE_ADDICTED_RANDOM_AGENTS: - from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST - logger.debug("Addic7ed: using random user agents") - self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)] - self.session.headers['Referer'] = self.server_url + from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST + logger.debug("Addic7ed: using random user agents") + self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)] + self.session.headers['Referer'] = self.server_url # login if self.username and self.password: @@ -119,13 +120,20 @@ def initialize(self): logger.error("AntiCaptcha key not given, exiting") return + anticaptcha_proxy = os.environ.get("ANTICAPTCHA_PROXY") + site_key = re.search(r'grecaptcha.execute\(\'(.+?)\',', r.content).group(1) if not site_key: logger.error("Addic7ed: Captcha site-key not found!") return + #pitcher_cls = pitchers.get_pitcher("AntiCaptchaProxyLess") + #pitcher = pitcher_cls("Addic7ed", anticaptcha_key, self.server_url + 'login.php', site_key) pitcher_cls = pitchers.get_pitcher("AntiCaptchaProxyLess") - pitcher = pitcher_cls("Addic7ed", anticaptcha_key, self.server_url + 'login.php', site_key) + pitcher = pitcher_cls("Addic7ed", anticaptcha_key, self.server_url + 'login.php', site_key, + user_agent=self.session.headers["User-Agent"], + cookies=self.session.cookies.get_dict(), + is_invisible=True) result = pitcher.throw() if not result: From 72aa6150b5b9792f38cbb6b406de90910dcc4d94 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 7 Apr 2019 06:06:30 +0200 Subject: [PATCH 418/710] prefs: anticaptcha: remove proxy option (for now) core: pitchers: finalize providrs: titlovi: implement anticaptcha --- Contents/Code/support/config.py | 8 +- Contents/DefaultPrefs.json | 8 +- .../Libraries/Shared/subliminal_patch/http.py | 6 +- .../Shared/subliminal_patch/pitcher.py | 85 +++++-- .../subliminal_patch/providers/addic7ed.py | 60 ++--- .../subliminal_patch/providers/titlovi.py | 239 ++++++++++-------- 6 files changed, 235 insertions(+), 171 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 246439c1d..8a5397918 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -149,6 +149,8 @@ class Config(object): adv_cfg_path = None use_custom_dns = False anticaptcha_token = None + anticaptcha_cls = None + has_anticaptcha = False store_recently_played_amount = 40 @@ -188,6 +190,10 @@ def initialize(self): os.environ["SZ_USER_AGENT"] = self.get_user_agent() os.environ["ANTICAPTCHA_ACCOUNT_KEY"] = self.anticaptcha_token = str(Prefs["anticaptcha.api_key"]) or "" + acs = str(Prefs["anticaptcha.service"]) + if acs and acs != "none": + os.environ["ANTICAPTCHA_CLASS"] = self.anticaptcha_cls = acs + self.has_anticaptcha = self.anticaptcha_token and self.anticaptcha_cls self.setup_proxies() self.set_plugin_mode() @@ -754,7 +760,7 @@ def providers_by_prefs(self): 'podnapisi': cast_bool(Prefs['provider.podnapisi.enabled']), #'titlovi': cast_bool(Prefs['provider.titlovi.enabled']), 'titlovi': False, - 'addic7ed': cast_bool(Prefs['provider.addic7ed.enabled']) and self.anticaptcha_token, + 'addic7ed': cast_bool(Prefs['provider.addic7ed.enabled']) and self.has_anticaptcha, #'addic7ed': False, 'tvsubtitles': cast_bool(Prefs['provider.tvsubtitles.enabled']), 'legendastv': cast_bool(Prefs['provider.legendastv.enabled']), diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index c0e4fa74c..7c0e3c09b 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -286,13 +286,7 @@ }, { "id": "anticaptcha.api_key", - "label": "AntiCaptcha-Service key (anti-captcha.com: account key; deathbycaptcha.com: username:password; for Addic7ed)", - "type": "text", - "default": "" - }, - { - "id": "anticaptcha.proxy", - "label": "AntiCaptcha-Service proxy (type://[username:password@]addr.loc:port; type: http(s),socks4,socks5; DBC only HTTP)", + "label": "AntiCaptcha-Service key (anti-captcha.com: account key; deathbycaptcha.com: username:password; enables Addic7ed, titlovi)", "type": "text", "default": "" }, diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 465d5555e..c813f5585 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -61,8 +61,7 @@ def request(self, method, url, *args, **kwargs): cache_key = "cf_data_%s" % domain - if not self.cookies.get("__cfduid", "", domain=domain) or not self.cookies.get("cf_clearance", "", - domain=domain): + if not self.cookies.get("__cfduid", "", domain=domain): cf_data = region.get(cache_key) if cf_data is not NO_VALUE: cf_cookies, user_agent = cf_data @@ -78,7 +77,8 @@ def request(self, method, url, *args, **kwargs): except: pass else: - if cf_data != region.get(cache_key): + if cf_data != region.get(cache_key) and self.cookies.get("__cfduid", "", domain=domain)\ + and self.cookies.get("cf_clearance", "", domain=domain): logger.debug("Storing cf data for %s: %s", domain, cf_data) region.set(cache_key, cf_data) diff --git a/Contents/Libraries/Shared/subliminal_patch/pitcher.py b/Contents/Libraries/Shared/subliminal_patch/pitcher.py index 12be90384..c8e810c2e 100644 --- a/Contents/Libraries/Shared/subliminal_patch/pitcher.py +++ b/Contents/Libraries/Shared/subliminal_patch/pitcher.py @@ -1,9 +1,11 @@ # coding=utf-8 +import os import time import logging import json -import requests +from subliminal.cache import region +from dogpile.cache.api import NO_VALUE from python_anticaptcha import AnticaptchaClient, NoCaptchaTaskProxylessTask, NoCaptchaTask, AnticaptchaException,\ Proxy from deathbycaptcha import SocketClient as DBCClient, DEFAULT_TOKEN_TIMEOUT @@ -13,14 +15,29 @@ class PitcherRegistry(object): - pitchers = {} + pitchers = [] + pitchers_by_key = {} def register(self, cls): - self.pitchers[cls.name] = cls + idx = len(self.pitchers) + self.pitchers.append(cls) + key = "%s_%s" % (cls.name, cls.needs_proxy) + key_by_source = "%s_%s" % (cls.source, cls.needs_proxy) + self.pitchers_by_key[key] = idx + self.pitchers_by_key[key_by_source] = idx return cls - def get_pitcher(self, name): - return self.pitchers[name] + def get_pitcher(self, name_or_site=None, with_proxy=False): + name_or_site = name_or_site or os.environ.get("ANTICAPTCHA_CLASS") + if not name_or_site: + raise Exception("AntiCaptcha class not given, exiting") + + key = "%s_%s" % (name_or_site, with_proxy) + + if key not in self.pitchers_by_key: + raise Exception("Pitcher %s not found (proxy: %s)" % (name_or_site, with_proxy)) + + return self.pitchers[self.pitchers_by_key.get(key)] registry = pitchers = PitcherRegistry() @@ -28,17 +45,24 @@ def get_pitcher(self, name): class Pitcher(object): name = None + source = None + needs_proxy = False tries = 3 job = None client = None + client_key = None website_url = None website_key = None website_name = None solve_time = None success = False - def __init__(self, website_name, website_url, website_key, tries=3, *args, **kwargs): + def __init__(self, website_name, website_url, website_key, tries=3, client_key=None, *args, **kwargs): self.tries = tries + self.client_key = client_key or os.environ.get("ANTICAPTCHA_ACCOUNT_KEY") + if not self.client_key: + raise Exception("AntiCaptcha key not given, exiting") + self.website_name = website_name self.website_key = website_key self.website_url = website_url @@ -67,17 +91,17 @@ def throw(self): @registry.register class AntiCaptchaProxyLessPitcher(Pitcher): name = "AntiCaptchaProxyLess" + source = "anti-captcha.com" host = "api.anti-captcha.com" language_pool = "en" - client_key = None + tries = 5 use_ssl = True is_invisible = False - def __init__(self, website_name, client_key, website_url, website_key, tries=3, host=None, language_pool=None, + def __init__(self, website_name, website_url, website_key, tries=3, host=None, language_pool=None, use_ssl=True, is_invisible=False, *args, **kwargs): super(AntiCaptchaProxyLessPitcher, self).__init__(website_name, website_url, website_key, tries=tries, *args, **kwargs) - self.client_key = client_key self.host = host or self.host self.language_pool = language_pool or self.language_pool self.use_ssl = use_ssl @@ -134,12 +158,12 @@ def _throw(self): class AntiCaptchaPitcher(AntiCaptchaProxyLessPitcher): name = "AntiCaptcha" proxy = None + needs_proxy = True user_agent = None cookies = None def __init__(self, *args, **kwargs): self.proxy = Proxy.parse_url(kwargs.pop("proxy")) - print self.proxy.__dict__ self.user_agent = kwargs.pop("user_agent") cookies = kwargs.pop("cookies", {}) if isinstance(cookies, dict): @@ -156,14 +180,15 @@ def get_job(self): @registry.register class DBCProxyLessPitcher(Pitcher): name = "DeathByCaptchaProxyLess" + source = "deathbycaptcha.com" username = None password = None - def __init__(self, website_name, client_key, website_url, website_key, + def __init__(self, website_name, website_url, website_key, timeout=DEFAULT_TOKEN_TIMEOUT, tries=3, *args, **kwargs): super(DBCProxyLessPitcher, self).__init__(website_name, website_url, website_key, tries=tries) - self.username, self.password = client_key.split(":", 1) + self.username, self.password = self.client_key.split(":", 1) self.timeout = timeout def get_client(self): @@ -182,19 +207,22 @@ def payload_dict(self): def _throw(self): super(DBCProxyLessPitcher, self)._throw() payload = json.dumps(self.payload_dict) - try: - #balance = self.client.get_balance() - data = self.client.decode(timeout=self.timeout, type=4, token_params=payload) - if data and data["is_correct"]: - self.success = True - return data["text"] - except: - raise + for i in range(self.tries): + try: + #balance = self.client.get_balance() + data = self.client.decode(timeout=self.timeout, type=4, token_params=payload) + if data and data["is_correct"] and data["text"]: + self.success = True + return data["text"] + except: + raise @registry.register class DBCPitcher(DBCProxyLessPitcher): + name = "DeathByCaptcha" proxy = None + needs_proxy = True proxy_type = "HTTP" def __init__(self, *args, **kwargs): @@ -210,3 +238,20 @@ def payload_dict(self): }) return payload + +def load_verification(site_name, session, callback=lambda x: None): + ccks = region.get("%s_data" % site_name, expiration_time=15552000) # 6m + if ccks != NO_VALUE: + cookies, user_agent = ccks + logger.debug("%s: Re-using previous user agent" % site_name.capitalize()) + session.headers["User-Agent"] = user_agent + try: + session.cookies._cookies.update(cookies) + return callback(region) + except: + return False + return False + + +def store_verification(site_name, session): + region.set("%s_data" % site_name, (session.cookies._cookies, session.headers["User-Agent"])) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 086343e98..ac070cdf5 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -1,24 +1,20 @@ # coding=utf-8 import logging import re -import os import datetime import subliminal import time -import requests from random import randint -from dogpile.cache.api import NO_VALUE from requests import Session -from python_anticaptcha import AnticaptchaClient, NoCaptchaTaskProxylessTask, NoCaptchaTask, AnticaptchaException -from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded, AuthenticationError +from subliminal.cache import region +from subliminal.exceptions import DownloadLimitExceeded, AuthenticationError from subliminal.providers.addic7ed import Addic7edProvider as _Addic7edProvider, \ Addic7edSubtitle as _Addic7edSubtitle, ParserBeautifulSoup, show_cells_re -from subliminal.cache import region from subliminal.subtitle import fix_line_ending from subliminal_patch.utils import sanitize from subliminal_patch.exceptions import TooManyRequests -from subliminal_patch.pitcher import pitchers +from subliminal_patch.pitcher import pitchers, load_verification, store_verification from subzero.language import Language logger = logging.getLogger(__name__) @@ -86,24 +82,19 @@ def initialize(self): # login if self.username and self.password: - ccks = region.get("addic7ed_data", expiration_time=15552000) # 6m - if ccks != NO_VALUE: - cookies, user_agent = ccks - logger.debug("Addic7ed: Re-using previous user agent") - self.session.headers["User-Agent"] = user_agent - try: - self.session.cookies._cookies.update(cookies) - r = self.session.get(self.server_url + 'panel.php', allow_redirects=False, timeout=10, - headers={"Referer": self.server_url}) - if r.status_code == 302: - logger.info('Addic7ed: Login expired') - region.delete("addic7ed_data") - else: - logger.info('Addic7ed: Re-using old login') - self.logged_in = True - return - except: - pass + def check_verification(cache_region): + rr = self.session.get(self.server_url + 'panel.php', allow_redirects=False, timeout=10, + headers={"Referer": self.server_url}) + if rr.status_code == 302: + logger.info('Addic7ed: Login expired') + cache_region.delete("addic7ed_data") + else: + logger.info('Addic7ed: Re-using old login') + self.logged_in = True + return True + + if load_verification("addic7ed", self.session, callback=check_verification): + return logger.info('Addic7ed: Logging in') data = {'username': self.username, 'password': self.password, 'Submit': 'Log in', 'url': '', @@ -115,25 +106,16 @@ def initialize(self): if "grecaptcha" in r.content: logger.info('Addic7ed: Solving captcha. This might take a couple of minutes, but should only ' 'happen once every so often') - anticaptcha_key = os.environ.get("ANTICAPTCHA_ACCOUNT_KEY") - if not anticaptcha_key: - logger.error("AntiCaptcha key not given, exiting") - return - - anticaptcha_proxy = os.environ.get("ANTICAPTCHA_PROXY") site_key = re.search(r'grecaptcha.execute\(\'(.+?)\',', r.content).group(1) if not site_key: logger.error("Addic7ed: Captcha site-key not found!") return - #pitcher_cls = pitchers.get_pitcher("AntiCaptchaProxyLess") - #pitcher = pitcher_cls("Addic7ed", anticaptcha_key, self.server_url + 'login.php', site_key) - pitcher_cls = pitchers.get_pitcher("AntiCaptchaProxyLess") - pitcher = pitcher_cls("Addic7ed", anticaptcha_key, self.server_url + 'login.php', site_key, - user_agent=self.session.headers["User-Agent"], - cookies=self.session.cookies.get_dict(), - is_invisible=True) + pitcher = pitchers.get_pitcher()("Addic7ed", self.server_url + 'login.php', site_key, + user_agent=self.session.headers["User-Agent"], + cookies=self.session.cookies.get_dict(), + is_invisible=True) result = pitcher.throw() if not result: @@ -156,7 +138,7 @@ def initialize(self): raise AuthenticationError(self.username) break - region.set("addic7ed_data", (self.session.cookies._cookies, self.session.headers["User-Agent"])) + store_verification("addic7ed", self.session) logger.debug('Addic7ed: Logged in') self.logged_in = True diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index ec339fef8..f368654c4 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -4,6 +4,7 @@ import logging import math import re +import time import rarfile @@ -23,6 +24,7 @@ from subliminal.subtitle import guess_matches from subliminal.video import Episode, Movie from subliminal.subtitle import fix_line_ending +from subliminal_patch.pitcher import pitchers, load_verification, store_verification from subzero.language import Language from random import randint @@ -179,113 +181,148 @@ def query(self, languages, title, season=None, episode=None, year=None, video=No while True: # query the server try: + load_verification("titlovi", self.session) r = self.session.get(self.search_url, params=params, timeout=10) r.raise_for_status() except RequestException as e: - logger.exception('RequestException %s', e) - break - - try: - soup = BeautifulSoup(r.content, 'lxml') - - # number of results - result_count = int(soup.select_one('.results_count b').string) - except: - result_count = None - - # exit if no results - if not result_count: - if not subtitles: - logger.debug('No subtitles found') - else: - logger.debug("No more subtitles found") - break - - # number of pages with results - pages = int(math.ceil(result_count / float(items_per_page))) - - # get current page - if 'pg' in params: - current_page = int(params['pg']) - - try: - sublist = soup.select('section.titlovi > ul.titlovi > li.subtitleContainer.canEdit') - for sub in sublist: - # subtitle id - sid = sub.find(attrs={'data-id': True}).attrs['data-id'] - # get download link - download_link = self.download_url + sid - # title and alternate title - match = title_re.search(sub.a.string) - if match: - _title = match.group('title') - alt_title = match.group('altitle') + captcha_passed = False + if e.response.status_code == 403 and "data-sitekey" in e.response.content: + logger.info('titlovi: Solving captcha. This might take a couple of minutes, but should only ' + 'happen once every so often') + + site_key = re.search(r'data-sitekey="(.+?)"', e.response.content).group(1) + challenge_s = re.search(r'type="hidden" name="s" value="(.+?)"', e.response.content).group(1) + challenge_ray = re.search(r'data-ray="(.+?)"', e.response.content).group(1) + if not all([site_key, challenge_s, challenge_ray]): + raise Exception("titlovi: Captcha site-key not found!") + + pitcher = pitchers.get_pitcher()("titlovi", e.request.url, site_key, + user_agent=self.session.headers["User-Agent"], + cookies=self.session.cookies.get_dict(), + is_invisible=True) + + result = pitcher.throw() + if not result: + raise Exception("titlovi: Couldn't solve captcha!") + + s_params = { + "s": challenge_s, + "id": challenge_ray, + "g-recaptcha-response": result, + } + r = self.session.get(self.server_url + "/cdn-cgi/l/chk_captcha", params=s_params, timeout=10, + allow_redirects=False) + r.raise_for_status() + r = self.session.get(self.search_url, params=params, timeout=10) + r.raise_for_status() + store_verification("titlovi", self.session) + captcha_passed = True + + if not captcha_passed: + logger.exception('RequestException %s', e) + break + else: + try: + soup = BeautifulSoup(r.content, 'lxml') + + # number of results + result_count = int(soup.select_one('.results_count b').string) + except: + result_count = None + + # exit if no results + if not result_count: + if not subtitles: + logger.debug('No subtitles found') else: - continue - - # page link - page_link = self.server_url + sub.a.attrs['href'] - # subtitle language - match = lang_re.search(sub.select_one('.lang').attrs['src']) - if match: - try: - # decode language - lang = Language.fromtitlovi(match.group('lang')+match.group('script')) - except ValueError: + logger.debug("No more subtitles found") + break + + # number of pages with results + pages = int(math.ceil(result_count / float(items_per_page))) + + # get current page + if 'pg' in params: + current_page = int(params['pg']) + + try: + sublist = soup.select('section.titlovi > ul.titlovi > li.subtitleContainer.canEdit') + for sub in sublist: + # subtitle id + sid = sub.find(attrs={'data-id': True}).attrs['data-id'] + # get download link + download_link = self.download_url + sid + # title and alternate title + match = title_re.search(sub.a.string) + if match: + _title = match.group('title') + alt_title = match.group('altitle') + else: continue - # relase year or series start year - match = year_re.search(sub.find(attrs={'data-id': True}).parent.i.string) - if match: - r_year = int(match.group('year')) - # fps - match = fps_re.search(sub.select_one('.fps').string) - if match: - fps = match.group('fps') - # releases - releases = str(sub.select_one('.fps').parent.contents[0].string) - - # handle movies and series separately - if is_episode: - # season and episode info - sxe = sub.select_one('.s0xe0y').string - r_season = None - r_episode = None - if sxe: - match = season_re.search(sxe) - if match: - r_season = int(match.group('season')) - match = episode_re.search(sxe) - if match: - r_episode = int(match.group('episode')) - - subtitle = self.subtitle_class(lang, page_link, download_link, sid, releases, _title, - alt_title=alt_title, season=r_season, episode=r_episode, - year=r_year, fps=fps, - asked_for_release_group=video.release_group, - asked_for_episode=episode) - else: - subtitle = self.subtitle_class(lang, page_link, download_link, sid, releases, _title, - alt_title=alt_title, year=r_year, fps=fps, - asked_for_release_group=video.release_group) - logger.debug('Found subtitle %r', subtitle) - - # prime our matches so we can use the values later - subtitle.get_matches(video) - - # add found subtitles - subtitles.append(subtitle) - - finally: - soup.decompose() - - # stop on last page - if current_page >= pages: - break - - # increment current page - params['pg'] = current_page + 1 - logger.debug('Getting page %d', params['pg']) + # page link + page_link = self.server_url + sub.a.attrs['href'] + # subtitle language + match = lang_re.search(sub.select_one('.lang').attrs['src']) + if match: + try: + # decode language + lang = Language.fromtitlovi(match.group('lang')+match.group('script')) + except ValueError: + continue + + # relase year or series start year + match = year_re.search(sub.find(attrs={'data-id': True}).parent.i.string) + if match: + r_year = int(match.group('year')) + # fps + match = fps_re.search(sub.select_one('.fps').string) + if match: + fps = match.group('fps') + # releases + releases = str(sub.select_one('.fps').parent.contents[0].string) + + # handle movies and series separately + if is_episode: + # season and episode info + sxe = sub.select_one('.s0xe0y').string + r_season = None + r_episode = None + if sxe: + match = season_re.search(sxe) + if match: + r_season = int(match.group('season')) + match = episode_re.search(sxe) + if match: + r_episode = int(match.group('episode')) + + subtitle = self.subtitle_class(lang, page_link, download_link, sid, releases, _title, + alt_title=alt_title, season=r_season, episode=r_episode, + year=r_year, fps=fps, + asked_for_release_group=video.release_group, + asked_for_episode=episode) + else: + subtitle = self.subtitle_class(lang, page_link, download_link, sid, releases, _title, + alt_title=alt_title, year=r_year, fps=fps, + asked_for_release_group=video.release_group) + logger.debug('Found subtitle %r', subtitle) + + # prime our matches so we can use the values later + subtitle.get_matches(video) + + # add found subtitles + subtitles.append(subtitle) + + finally: + soup.decompose() + + # stop on last page + if current_page >= pages: + break + + # increment current page + params['pg'] = current_page + 1 + logger.debug('Getting page %d', params['pg']) return subtitles From 1867aed76962eaca97b4f641f5c4da9087b808d3 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 7 Apr 2019 06:12:31 +0200 Subject: [PATCH 419/710] core: increase cache time --- Contents/Code/support/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 8a5397918..428117742 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -337,7 +337,7 @@ def init_libraries(self): def init_cache(self): if self.new_style_cache: - subliminal.region.configure('subzero.cache.file', expiration_time=datetime.timedelta(days=30), + subliminal.region.configure('subzero.cache.file', expiration_time=datetime.timedelta(days=180), arguments={'appname': "sz_cache", 'app_cache_dir': self.data_path}, replace_existing_backend=True) From 663fdf6e2fe43061b3d681b241c1ba19bad8dca2 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 7 Apr 2019 06:21:04 +0200 Subject: [PATCH 420/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index ede5222da..e522ff706 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.2965</string> + <string>2.6.5.2974</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.2965 DEV +Version 2.6.5.2974 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 7856cc5bb30341d8d7358701b4d95fb129d9ff19 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 7 Apr 2019 06:40:48 +0200 Subject: [PATCH 421/710] providers: titlovi: re-enable titlovi --- Contents/Code/interface/menu.py | 4 ++-- Contents/Code/support/config.py | 4 +--- Contents/DefaultPrefs.json | 12 +++++++++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 9adc83c27..27ee890b3 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -368,7 +368,7 @@ def ValidatePrefs(): "subtitle_destination_folder", "include", "include_exclude_paths", "include_exclude_sz_files", "new_style_cache", "dbm_supported", "lang_list", "providers", "normal_subs", "forced_only", "forced_also", "plex_transcoder", "refiner_settings", "unrar", "adv_cfg_path", "use_custom_dns", - "anticaptcha_token"]: + "has_anticaptcha", "anticaptcha_cls"]: value = getattr(config, attr) if isinstance(value, dict): @@ -376,7 +376,7 @@ def ValidatePrefs(): Log.Debug("config.%s: %s", attr, d) continue - if attr in ("api_key", "anticaptcha_token"): + if attr in ("api_key",): value = "xxxxxxxxxxxxxxxxxxxxxxxxx" Log.Debug("config.%s: %s", attr, value) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 428117742..f9eda93d9 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -758,10 +758,8 @@ def providers_by_prefs(self): return {'opensubtitles': cast_bool(Prefs['provider.opensubtitles.enabled']), # 'thesubdb': Prefs['provider.thesubdb.enabled'], 'podnapisi': cast_bool(Prefs['provider.podnapisi.enabled']), - #'titlovi': cast_bool(Prefs['provider.titlovi.enabled']), - 'titlovi': False, + 'titlovi': cast_bool(Prefs['provider.titlovi.enabled']) and self.has_anticaptcha, 'addic7ed': cast_bool(Prefs['provider.addic7ed.enabled']) and self.has_anticaptcha, - #'addic7ed': False, 'tvsubtitles': cast_bool(Prefs['provider.tvsubtitles.enabled']), 'legendastv': cast_bool(Prefs['provider.legendastv.enabled']), 'napiprojekt': cast_bool(Prefs['provider.napiprojekt.enabled']), diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 7c0e3c09b..27e70f5cf 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -275,7 +275,7 @@ }, { "id": "anticaptcha.service", - "label": "AntiCaptcha-Service", + "label": "AntiCaptcha-Service (needs paid account; enables Addic7ed, titlovi)", "type": "enum", "values": [ "none", @@ -286,7 +286,7 @@ }, { "id": "anticaptcha.api_key", - "label": "AntiCaptcha-Service key (anti-captcha.com: account key; deathbycaptcha.com: username:password; enables Addic7ed, titlovi)", + "label": "AntiCaptcha-Service key (anti-captcha.com: account_key; deathbycaptcha.com: username:password)", "type": "text", "default": "" }, @@ -324,7 +324,7 @@ }, { "id": "provider.addic7ed.enabled", - "label": "Provider: Enable Addic7ed (needs AntiCaptcha key)", + "label": "Provider: Enable Addic7ed (needs AntiCaptcha)", "type": "bool", "default": "true" }, @@ -374,6 +374,12 @@ ], "default": "19" }, + { + "id": "provider.titlovi.enabled", + "label": "Provider: Enable Titlovi.com (might need AntiCaptcha)", + "type": "bool", + "default": "true" + }, { "id": "provider.legendastv.enabled", "label": "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", From e20f102cb936eae58bfa456d574300a88d0791ee Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 7 Apr 2019 06:54:42 +0200 Subject: [PATCH 422/710] core: pitchers: add current user agent to debug log providers: titlovi: generally load previous verification(s) providers: addic7ed: close session on terminate --- Contents/Libraries/Shared/subliminal_patch/pitcher.py | 2 +- .../Libraries/Shared/subliminal_patch/providers/addic7ed.py | 2 +- Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/pitcher.py b/Contents/Libraries/Shared/subliminal_patch/pitcher.py index c8e810c2e..b2cef63b3 100644 --- a/Contents/Libraries/Shared/subliminal_patch/pitcher.py +++ b/Contents/Libraries/Shared/subliminal_patch/pitcher.py @@ -243,7 +243,7 @@ def load_verification(site_name, session, callback=lambda x: None): ccks = region.get("%s_data" % site_name, expiration_time=15552000) # 6m if ccks != NO_VALUE: cookies, user_agent = ccks - logger.debug("%s: Re-using previous user agent" % site_name.capitalize()) + logger.debug("%s: Re-using previous user agent: %s", site_name.capitalize(), user_agent) session.headers["User-Agent"] = user_agent try: session.cookies._cookies.update(cookies) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index ac070cdf5..2d556d877 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -144,7 +144,7 @@ def check_verification(cache_region): self.logged_in = True def terminate(self): - pass + self.session.close() @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME) def _get_show_ids(self): diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index f368654c4..860932ca5 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -144,6 +144,7 @@ def initialize(self): logger.debug('User-Agent set to %s', self.session.headers['User-Agent']) self.session.headers['Referer'] = self.server_url logger.debug('Referer set to %s', self.session.headers['Referer']) + load_verification("titlovi", self.session) def terminate(self): self.session.close() @@ -181,7 +182,6 @@ def query(self, languages, title, season=None, episode=None, year=None, video=No while True: # query the server try: - load_verification("titlovi", self.session) r = self.session.get(self.search_url, params=params, timeout=10) r.raise_for_status() except RequestException as e: From b7c9530ac05fb71d9a4e2ad55413027c74cadb3a Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 7 Apr 2019 06:55:13 +0200 Subject: [PATCH 423/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index e522ff706..5daf64006 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.2974</string> + <string>2.6.5.2977</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.2974 DEV +Version 2.6.5.2977 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 0c166ff36a3c0c729f4806703cae2f330bc62d29 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 11 Apr 2019 01:57:27 +0200 Subject: [PATCH 424/710] add pyjsparser==2.2.0; tzlocal; js2py==7a3a1ff; cfscrape==83ebd10; requests-toolbelt==bc1b273; remove old cfscrape core: update cf stuff --- Contents/Libraries/Shared/cfscrape.py | 279 - .../Libraries/Shared/cfscrape/__init__.py | 326 + Contents/Libraries/Shared/cfscrape/jsfuck.py | 97 + Contents/Libraries/Shared/js2py/__init__.py | 75 + Contents/Libraries/Shared/js2py/base.py | 3280 + .../Shared/js2py/constructors/__init__.py | 1 + .../Shared/js2py/constructors/jsarray.py | 48 + .../js2py/constructors/jsarraybuffer.py | 41 + .../Shared/js2py/constructors/jsboolean.py | 16 + .../Shared/js2py/constructors/jsdate.py | 405 + .../js2py/constructors/jsfloat32array.py | 87 + .../js2py/constructors/jsfloat64array.py | 87 + .../Shared/js2py/constructors/jsfunction.py | 52 + .../Shared/js2py/constructors/jsint16array.py | 87 + .../Shared/js2py/constructors/jsint32array.py | 87 + .../Shared/js2py/constructors/jsint8array.py | 79 + .../Shared/js2py/constructors/jsmath.py | 157 + .../Shared/js2py/constructors/jsnumber.py | 23 + .../Shared/js2py/constructors/jsobject.py | 198 + .../Shared/js2py/constructors/jsregexp.py | 16 + .../Shared/js2py/constructors/jsstring.py | 40 + .../js2py/constructors/jsuint16array.py | 87 + .../js2py/constructors/jsuint32array.py | 95 + .../Shared/js2py/constructors/jsuint8array.py | 79 + .../js2py/constructors/jsuint8clampedarray.py | 79 + .../Shared/js2py/constructors/time_helpers.py | 207 + .../Libraries/Shared/js2py/es6/__init__.py | 41 + Contents/Libraries/Shared/js2py/es6/babel.js | 6 + Contents/Libraries/Shared/js2py/es6/babel.py | 52077 ++++++++++++++++ .../Libraries/Shared/js2py/es6/buildBabel | 12 + Contents/Libraries/Shared/js2py/evaljs.py | 265 + .../Libraries/Shared/js2py/host/__init__.py | 0 .../Libraries/Shared/js2py/host/console.py | 15 + .../Shared/js2py/host/dom/__init__.py | 0 .../Libraries/Shared/js2py/host/jseval.py | 51 + .../Shared/js2py/host/jsfunctions.py | 176 + .../Shared/js2py/internals/__init__.py | 0 .../Libraries/Shared/js2py/internals/base.py | 925 + .../Shared/js2py/internals/byte_trans.py | 752 + .../Libraries/Shared/js2py/internals/code.py | 197 + .../js2py/internals/constructors/__init__.py | 1 + .../js2py/internals/constructors/jsarray.py | 28 + .../js2py/internals/constructors/jsboolean.py | 14 + .../js2py/internals/constructors/jsconsole.py | 11 + .../js2py/internals/constructors/jsdate.py | 405 + .../internals/constructors/jsfunction.py | 75 + .../js2py/internals/constructors/jsmath.py | 157 + .../js2py/internals/constructors/jsnumber.py | 27 + .../js2py/internals/constructors/jsobject.py | 204 + .../js2py/internals/constructors/jsregexp.py | 41 + .../js2py/internals/constructors/jsstring.py | 23 + .../internals/constructors/time_helpers.py | 209 + .../Shared/js2py/internals/conversions.py | 148 + .../Libraries/Shared/js2py/internals/desc.py | 90 + .../Shared/js2py/internals/fill_space.py | 284 + .../Shared/js2py/internals/func_utils.py | 73 + .../Libraries/Shared/js2py/internals/gen.py | 0 .../Shared/js2py/internals/opcodes.py | 805 + .../Shared/js2py/internals/operations.py | 314 + .../js2py/internals/prototypes/__init__.py | 1 + .../js2py/internals/prototypes/jsarray.py | 489 + .../js2py/internals/prototypes/jsboolean.py | 22 + .../js2py/internals/prototypes/jserror.py | 15 + .../js2py/internals/prototypes/jsfunction.py | 61 + .../js2py/internals/prototypes/jsjson.py | 205 + .../js2py/internals/prototypes/jsnumber.py | 163 + .../js2py/internals/prototypes/jsobject.py | 48 + .../js2py/internals/prototypes/jsregexp.py | 56 + .../js2py/internals/prototypes/jsstring.py | 323 + .../js2py/internals/prototypes/jsutils.py | 149 + .../Libraries/Shared/js2py/internals/seval.py | 32 + .../Shared/js2py/internals/simplex.py | 133 + .../Libraries/Shared/js2py/internals/space.py | 92 + .../Libraries/Shared/js2py/internals/speed.py | 62 + .../Shared/js2py/internals/trans_utils.py | 28 + .../js2py/legecy_translators/__init__.py | 1 + .../js2py/legecy_translators/constants.py | 308 + .../Shared/js2py/legecy_translators/exps.py | 83 + .../Shared/js2py/legecy_translators/flow.py | 480 + .../js2py/legecy_translators/functions.py | 98 + .../js2py/legecy_translators/jsparser.py | 326 + .../js2py/legecy_translators/nodevisitor.py | 562 + .../js2py/legecy_translators/nparser.py | 3209 + .../js2py/legecy_translators/objects.py | 300 + .../js2py/legecy_translators/tokenize.py | 4 + .../js2py/legecy_translators/translator.py | 151 + .../Shared/js2py/legecy_translators/utils.py | 91 + .../Libraries/Shared/js2py/node_import.py | 113 + .../Shared/js2py/prototypes/__init__.py | 1 + .../Shared/js2py/prototypes/jsarray.py | 476 + .../Shared/js2py/prototypes/jsarraybuffer.py | 19 + .../Shared/js2py/prototypes/jsboolean.py | 10 + .../Shared/js2py/prototypes/jserror.py | 10 + .../Shared/js2py/prototypes/jsfunction.py | 52 + .../Shared/js2py/prototypes/jsjson.py | 219 + .../Shared/js2py/prototypes/jsnumber.py | 146 + .../Shared/js2py/prototypes/jsobject.py | 28 + .../Shared/js2py/prototypes/jsregexp.py | 45 + .../Shared/js2py/prototypes/jsstring.py | 306 + .../Shared/js2py/prototypes/jstypedarray.py | 344 + .../Shared/js2py/py_node_modules/__init__.py | 1 + Contents/Libraries/Shared/js2py/pyjs.py | 100 + .../Libraries/Shared/js2py/test_internals.py | 9 + .../Shared/js2py/translators/__init__.py | 38 + .../js2py/translators/friendly_nodes.py | 375 + .../Shared/js2py/translators/jsregexps.py | 211 + .../js2py/translators/translating_nodes.py | 688 + .../Shared/js2py/translators/translator.py | 189 + .../Libraries/Shared/js2py/utils/__init__.py | 0 .../Libraries/Shared/js2py/utils/injector.py | 235 + .../Libraries/Shared/pyjsparser/__init__.py | 4 + .../Libraries/Shared/pyjsparser/parser.py | 2898 + .../Shared/pyjsparser/pyjsparserdata.py | 303 + .../Libraries/Shared/pyjsparser/std_nodes.py | 471 + .../Shared/requests_toolbelt/__init__.py | 34 + .../Shared/requests_toolbelt/_compat.py | 324 + .../requests_toolbelt/adapters/__init__.py | 15 + .../requests_toolbelt/adapters/appengine.py | 206 + .../requests_toolbelt/adapters/fingerprint.py | 48 + .../adapters/host_header_ssl.py | 43 + .../adapters/socket_options.py | 129 + .../requests_toolbelt/adapters/source.py | 67 + .../Shared/requests_toolbelt/adapters/ssl.py | 66 + .../Shared/requests_toolbelt/adapters/x509.py | 178 + .../Shared/requests_toolbelt/auth/__init__.py | 0 .../auth/_digest_auth_compat.py | 29 + .../Shared/requests_toolbelt/auth/guess.py | 146 + .../Shared/requests_toolbelt/auth/handler.py | 142 + .../auth/http_proxy_digest.py | 103 + .../requests_toolbelt/cookies/__init__.py | 0 .../requests_toolbelt/cookies/forgetful.py | 7 + .../downloadutils/__init__.py | 0 .../requests_toolbelt/downloadutils/stream.py | 176 + .../requests_toolbelt/downloadutils/tee.py | 123 + .../Shared/requests_toolbelt/exceptions.py | 37 + .../requests_toolbelt/multipart/__init__.py | 31 + .../requests_toolbelt/multipart/decoder.py | 156 + .../requests_toolbelt/multipart/encoder.py | 655 + .../Shared/requests_toolbelt/sessions.py | 70 + .../requests_toolbelt/streaming_iterator.py | 116 + .../requests_toolbelt/threaded/__init__.py | 97 + .../Shared/requests_toolbelt/threaded/pool.py | 211 + .../requests_toolbelt/threaded/thread.py | 53 + .../requests_toolbelt/utils/__init__.py | 0 .../requests_toolbelt/utils/deprecated.py | 91 + .../Shared/requests_toolbelt/utils/dump.py | 197 + .../requests_toolbelt/utils/formdata.py | 108 + .../requests_toolbelt/utils/user_agent.py | 143 + Contents/Libraries/Shared/tzlocal/__init__.py | 5 + Contents/Libraries/Shared/tzlocal/unix.py | 164 + Contents/Libraries/Shared/tzlocal/utils.py | 38 + Contents/Libraries/Shared/tzlocal/win32.py | 104 + .../Libraries/Shared/tzlocal/windows_tz.py | 693 + 153 files changed, 82763 insertions(+), 279 deletions(-) delete mode 100644 Contents/Libraries/Shared/cfscrape.py create mode 100644 Contents/Libraries/Shared/cfscrape/__init__.py create mode 100644 Contents/Libraries/Shared/cfscrape/jsfuck.py create mode 100644 Contents/Libraries/Shared/js2py/__init__.py create mode 100644 Contents/Libraries/Shared/js2py/base.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/__init__.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsarray.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsarraybuffer.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsboolean.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsdate.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsfloat32array.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsfloat64array.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsfunction.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsint16array.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsint32array.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsint8array.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsmath.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsnumber.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsobject.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsregexp.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsstring.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsuint16array.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsuint32array.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsuint8array.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/jsuint8clampedarray.py create mode 100644 Contents/Libraries/Shared/js2py/constructors/time_helpers.py create mode 100644 Contents/Libraries/Shared/js2py/es6/__init__.py create mode 100644 Contents/Libraries/Shared/js2py/es6/babel.js create mode 100644 Contents/Libraries/Shared/js2py/es6/babel.py create mode 100644 Contents/Libraries/Shared/js2py/es6/buildBabel create mode 100644 Contents/Libraries/Shared/js2py/evaljs.py create mode 100644 Contents/Libraries/Shared/js2py/host/__init__.py create mode 100644 Contents/Libraries/Shared/js2py/host/console.py create mode 100644 Contents/Libraries/Shared/js2py/host/dom/__init__.py create mode 100644 Contents/Libraries/Shared/js2py/host/jseval.py create mode 100644 Contents/Libraries/Shared/js2py/host/jsfunctions.py create mode 100644 Contents/Libraries/Shared/js2py/internals/__init__.py create mode 100644 Contents/Libraries/Shared/js2py/internals/base.py create mode 100644 Contents/Libraries/Shared/js2py/internals/byte_trans.py create mode 100644 Contents/Libraries/Shared/js2py/internals/code.py create mode 100644 Contents/Libraries/Shared/js2py/internals/constructors/__init__.py create mode 100644 Contents/Libraries/Shared/js2py/internals/constructors/jsarray.py create mode 100644 Contents/Libraries/Shared/js2py/internals/constructors/jsboolean.py create mode 100644 Contents/Libraries/Shared/js2py/internals/constructors/jsconsole.py create mode 100644 Contents/Libraries/Shared/js2py/internals/constructors/jsdate.py create mode 100644 Contents/Libraries/Shared/js2py/internals/constructors/jsfunction.py create mode 100644 Contents/Libraries/Shared/js2py/internals/constructors/jsmath.py create mode 100644 Contents/Libraries/Shared/js2py/internals/constructors/jsnumber.py create mode 100644 Contents/Libraries/Shared/js2py/internals/constructors/jsobject.py create mode 100644 Contents/Libraries/Shared/js2py/internals/constructors/jsregexp.py create mode 100644 Contents/Libraries/Shared/js2py/internals/constructors/jsstring.py create mode 100644 Contents/Libraries/Shared/js2py/internals/constructors/time_helpers.py create mode 100644 Contents/Libraries/Shared/js2py/internals/conversions.py create mode 100644 Contents/Libraries/Shared/js2py/internals/desc.py create mode 100644 Contents/Libraries/Shared/js2py/internals/fill_space.py create mode 100644 Contents/Libraries/Shared/js2py/internals/func_utils.py create mode 100644 Contents/Libraries/Shared/js2py/internals/gen.py create mode 100644 Contents/Libraries/Shared/js2py/internals/opcodes.py create mode 100644 Contents/Libraries/Shared/js2py/internals/operations.py create mode 100644 Contents/Libraries/Shared/js2py/internals/prototypes/__init__.py create mode 100644 Contents/Libraries/Shared/js2py/internals/prototypes/jsarray.py create mode 100644 Contents/Libraries/Shared/js2py/internals/prototypes/jsboolean.py create mode 100644 Contents/Libraries/Shared/js2py/internals/prototypes/jserror.py create mode 100644 Contents/Libraries/Shared/js2py/internals/prototypes/jsfunction.py create mode 100644 Contents/Libraries/Shared/js2py/internals/prototypes/jsjson.py create mode 100644 Contents/Libraries/Shared/js2py/internals/prototypes/jsnumber.py create mode 100644 Contents/Libraries/Shared/js2py/internals/prototypes/jsobject.py create mode 100644 Contents/Libraries/Shared/js2py/internals/prototypes/jsregexp.py create mode 100644 Contents/Libraries/Shared/js2py/internals/prototypes/jsstring.py create mode 100644 Contents/Libraries/Shared/js2py/internals/prototypes/jsutils.py create mode 100644 Contents/Libraries/Shared/js2py/internals/seval.py create mode 100644 Contents/Libraries/Shared/js2py/internals/simplex.py create mode 100644 Contents/Libraries/Shared/js2py/internals/space.py create mode 100644 Contents/Libraries/Shared/js2py/internals/speed.py create mode 100644 Contents/Libraries/Shared/js2py/internals/trans_utils.py create mode 100644 Contents/Libraries/Shared/js2py/legecy_translators/__init__.py create mode 100644 Contents/Libraries/Shared/js2py/legecy_translators/constants.py create mode 100644 Contents/Libraries/Shared/js2py/legecy_translators/exps.py create mode 100644 Contents/Libraries/Shared/js2py/legecy_translators/flow.py create mode 100644 Contents/Libraries/Shared/js2py/legecy_translators/functions.py create mode 100644 Contents/Libraries/Shared/js2py/legecy_translators/jsparser.py create mode 100644 Contents/Libraries/Shared/js2py/legecy_translators/nodevisitor.py create mode 100644 Contents/Libraries/Shared/js2py/legecy_translators/nparser.py create mode 100644 Contents/Libraries/Shared/js2py/legecy_translators/objects.py create mode 100644 Contents/Libraries/Shared/js2py/legecy_translators/tokenize.py create mode 100644 Contents/Libraries/Shared/js2py/legecy_translators/translator.py create mode 100644 Contents/Libraries/Shared/js2py/legecy_translators/utils.py create mode 100644 Contents/Libraries/Shared/js2py/node_import.py create mode 100644 Contents/Libraries/Shared/js2py/prototypes/__init__.py create mode 100644 Contents/Libraries/Shared/js2py/prototypes/jsarray.py create mode 100644 Contents/Libraries/Shared/js2py/prototypes/jsarraybuffer.py create mode 100644 Contents/Libraries/Shared/js2py/prototypes/jsboolean.py create mode 100644 Contents/Libraries/Shared/js2py/prototypes/jserror.py create mode 100644 Contents/Libraries/Shared/js2py/prototypes/jsfunction.py create mode 100644 Contents/Libraries/Shared/js2py/prototypes/jsjson.py create mode 100644 Contents/Libraries/Shared/js2py/prototypes/jsnumber.py create mode 100644 Contents/Libraries/Shared/js2py/prototypes/jsobject.py create mode 100644 Contents/Libraries/Shared/js2py/prototypes/jsregexp.py create mode 100644 Contents/Libraries/Shared/js2py/prototypes/jsstring.py create mode 100644 Contents/Libraries/Shared/js2py/prototypes/jstypedarray.py create mode 100644 Contents/Libraries/Shared/js2py/py_node_modules/__init__.py create mode 100644 Contents/Libraries/Shared/js2py/pyjs.py create mode 100644 Contents/Libraries/Shared/js2py/test_internals.py create mode 100644 Contents/Libraries/Shared/js2py/translators/__init__.py create mode 100644 Contents/Libraries/Shared/js2py/translators/friendly_nodes.py create mode 100644 Contents/Libraries/Shared/js2py/translators/jsregexps.py create mode 100644 Contents/Libraries/Shared/js2py/translators/translating_nodes.py create mode 100644 Contents/Libraries/Shared/js2py/translators/translator.py create mode 100644 Contents/Libraries/Shared/js2py/utils/__init__.py create mode 100644 Contents/Libraries/Shared/js2py/utils/injector.py create mode 100644 Contents/Libraries/Shared/pyjsparser/__init__.py create mode 100644 Contents/Libraries/Shared/pyjsparser/parser.py create mode 100644 Contents/Libraries/Shared/pyjsparser/pyjsparserdata.py create mode 100644 Contents/Libraries/Shared/pyjsparser/std_nodes.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/__init__.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/_compat.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/adapters/__init__.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/adapters/appengine.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/adapters/fingerprint.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/adapters/host_header_ssl.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/adapters/socket_options.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/adapters/source.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/adapters/ssl.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/adapters/x509.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/auth/__init__.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/auth/_digest_auth_compat.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/auth/guess.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/auth/handler.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/auth/http_proxy_digest.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/cookies/__init__.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/cookies/forgetful.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/downloadutils/__init__.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/downloadutils/stream.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/downloadutils/tee.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/exceptions.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/multipart/__init__.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/multipart/decoder.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/multipart/encoder.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/sessions.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/streaming_iterator.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/threaded/__init__.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/threaded/pool.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/threaded/thread.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/utils/__init__.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/utils/deprecated.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/utils/dump.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/utils/formdata.py create mode 100644 Contents/Libraries/Shared/requests_toolbelt/utils/user_agent.py create mode 100644 Contents/Libraries/Shared/tzlocal/__init__.py create mode 100644 Contents/Libraries/Shared/tzlocal/unix.py create mode 100644 Contents/Libraries/Shared/tzlocal/utils.py create mode 100644 Contents/Libraries/Shared/tzlocal/win32.py create mode 100644 Contents/Libraries/Shared/tzlocal/windows_tz.py diff --git a/Contents/Libraries/Shared/cfscrape.py b/Contents/Libraries/Shared/cfscrape.py deleted file mode 100644 index 15986f03a..000000000 --- a/Contents/Libraries/Shared/cfscrape.py +++ /dev/null @@ -1,279 +0,0 @@ -import logging -import random -import time -import re - -# based off of https://gist.github.com/doko-desuka/58d9212461f62583f8df9bc6387fade2 -# and https://github.com/Anorov/cloudflare-scrape -# and https://github.com/VeNoMouS/cloudflare-scrape-js2py - -''''''''' -Disables InsecureRequestWarning: Unverified HTTPS request is being made warnings. -''''''''' -import requests -from requests.packages.urllib3.exceptions import InsecureRequestWarning - -requests.packages.urllib3.disable_warnings(InsecureRequestWarning) -'''''' -from requests.sessions import Session -from copy import deepcopy - -try: - from urlparse import urlparse -except ImportError: - from urllib.parse import urlparse - -DEFAULT_USER_AGENTS = [ - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/65.0.3325.181 Chrome/65.0.3325.181 Safari/537.36", - "Mozilla/5.0 (Linux; Android 7.0; Moto G (5) Build/NPPS25.137-93-8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36", - "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53", - "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0" -] - -DEFAULT_USER_AGENT = random.choice(DEFAULT_USER_AGENTS) - -BUG_REPORT = ( - "Cloudflare may have changed their technique, or there may be a bug in the script.\n\nPlease read " "https://github.com/Anorov/cloudflare-scrape#updates, then file a " - "bug report at https://github.com/Anorov/cloudflare-scrape/issues.") - - -class CloudflareScraper(Session): - def __init__(self, *args, **kwargs): - super(CloudflareScraper, self).__init__(*args, **kwargs) - - if "requests" in self.headers["User-Agent"]: - # Spoof Firefox on Linux if no custom User-Agent has been set - self.headers["User-Agent"] = random.choice(DEFAULT_USER_AGENTS) - - def request(self, method, url, *args, **kwargs): - resp = super(CloudflareScraper, self).request(method, url, *args, **kwargs) - - # Check if Cloudflare anti-bot is on - if (resp.status_code in (503, 429) - and resp.headers.get("Server", "").startswith("cloudflare") - and b"jschl_vc" in resp.content - and b"jschl_answer" in resp.content - ): - return self.solve_cf_challenge(resp, **kwargs) - - # Otherwise, no Cloudflare anti-bot detected - return resp - - def solve_cf_challenge(self, resp, **original_kwargs): - body = resp.text - parsed_url = urlparse(resp.url) - domain = parsed_url.netloc - submit_url = "%s://%s/cdn-cgi/l/chk_jschl" % (parsed_url.scheme, domain) - - cloudflare_kwargs = deepcopy(original_kwargs) - params = cloudflare_kwargs.setdefault("params", {}) - headers = cloudflare_kwargs.setdefault("headers", {}) - headers["Referer"] = resp.url - - try: - cf_delay = float(re.search('submit.*?(\d+)', body, re.DOTALL).group(1)) / 1000.0 - - form_index = body.find('id="challenge-form"') - if form_index == -1: - raise Exception('CF form not found') - sub_body = body[form_index:] - - s_match = re.search('name="s" value="(.+?)"', sub_body) - if s_match: - params["s"] = s_match.group(1) # On older variants this parameter is absent. - params["jschl_vc"] = re.search(r'name="jschl_vc" value="(\w+)"', sub_body).group(1) - params["pass"] = re.search(r'name="pass" value="(.+?)"', sub_body).group(1) - - if body.find('id="cf-dn-', form_index) != -1: - extra_div_expression = re.search('id="cf-dn-.*?>(.+?)<', sub_body).group(1) - - # Initial value. - js_answer = self.cf_parse_expression( - re.search('setTimeout\(function\(.*?:(.*?)}', body, re.DOTALL).group(1) - ) - # Extract the arithmetic operations. - builder = re.search("challenge-form'\);\s*;(.*);a.value", body, re.DOTALL).group(1) - # Remove a function semicolon before splitting on semicolons, else it messes the order. - lines = builder.replace(' return +(p)}();', '', 1).split(';') - - for line in lines: - if len(line) and '=' in line: - heading, expression = line.split('=', 1) - if 'eval(eval(atob' in expression: - # Uses the expression in an external <div>. - expression_value = self.cf_parse_expression(extra_div_expression) - elif '(function(p' in expression: - # Expression + domain sampling function. - expression_value = self.cf_parse_expression(expression, domain) - else: - expression_value = self.cf_parse_expression(expression) - js_answer = self.cf_arithmetic_op(heading[-1], js_answer, expression_value) - - if '+ t.length' in body: - js_answer += len(domain) # Only older variants add the domain length. - - params["jschl_answer"] = '%.10f' % js_answer - - except Exception as e: - # Something is wrong with the page. - # This may indicate Cloudflare has changed their anti-bot - # technique. If you see this and are running the latest version, - # please open a GitHub issue so I can update the code accordingly. - logging.error("[!] %s Unable to parse Cloudflare anti-bots page. " - "Try upgrading cloudflare-scrape, or submit a bug report " - "if you are running the latest version. Please read " - "https://github.com/Anorov/cloudflare-scrape#updates " - "before submitting a bug report." % e) - raise - - # Cloudflare requires a delay before solving the challenge. - # Always wait the full delay + 1s because of 'time.sleep()' imprecision. - time.sleep(cf_delay + 1.0) - - # Requests transforms any request into a GET after a redirect, - # so the redirect has to be handled manually here to allow for - # performing other types of requests even as the first request. - method = resp.request.method - cloudflare_kwargs["allow_redirects"] = False - - redirect = self.request(method, submit_url, **cloudflare_kwargs) - - if 'Location' in redirect.headers: - redirect_location = urlparse(redirect.headers["Location"]) - if not redirect_location.netloc: - redirect_url = "%s://%s%s" % (parsed_url.scheme, domain, redirect_location.path) - return self.request(method, redirect_url, **original_kwargs) - return self.request(method, redirect.headers["Location"], **original_kwargs) - else: - return redirect - - def cf_sample_domain_function(self, func_expression, domain): - parameter_start_index = func_expression.find('}(') + 2 - # Send the expression with the "+" char and enclosing parenthesis included, as they are - # stripped inside ".cf_parse_expression()'. - sample_index = self.cf_parse_expression( - func_expression[parameter_start_index: func_expression.rfind(')))')] - ) - return ord(domain[int(sample_index)]) - - def cf_arithmetic_op(self, op, a, b): - if op == '+': - return a + b - elif op == '/': - return a / float(b) - elif op == '*': - return a * float(b) - elif op == '-': - return a - b - else: - raise Exception('Unknown operation') - - def cf_parse_expression(self, expression, domain=None): - - def _get_jsfuck_number(section): - digit_expressions = section.replace('!+[]', '1').replace('+!![]', '1').replace('+[]', '0').split('+') - return int( - # Form a number string, with each digit as the sum of the values inside each parenthesis block. - ''.join( - str(sum(int(digit_char) for digit_char in digit_expression[1:-1])) # Strip the parenthesis. - for digit_expression in digit_expressions - ) - ) - - if '/' in expression: - dividend, divisor = expression.split('/') - dividend = dividend[2:-1] # Strip the leading '+' char and the enclosing parenthesis. - - if domain: - # 2019-04-02: At this moment, this extra domain sampling function always appears on the - # divisor side, at the end. - divisor_a, divisor_b = divisor.split('))+(') - divisor_a = _get_jsfuck_number(divisor_a[5:]) # Left-strip the sequence of "(+(+(". - divisor_b = self.cf_sample_domain_function(divisor_b, domain) - return _get_jsfuck_number(dividend) / float(divisor_a + divisor_b) - else: - divisor = divisor[2:-1] - return _get_jsfuck_number(dividend) / float(_get_jsfuck_number(divisor)) - else: - return _get_jsfuck_number(expression[2:-1]) - - @classmethod - def create_scraper(cls, sess=None, **kwargs): - """ - Convenience function for creating a ready-to-go requests.Session (subclass) object. - """ - scraper = cls() - - if sess: - attrs = ["auth", "cert", "cookies", "headers", "hooks", "params", "proxies", "data"] - for attr in attrs: - val = getattr(sess, attr, None) - if val: - setattr(scraper, attr, val) - - return scraper - - ## Functions for integrating cloudflare-scrape with other applications and scripts - - @classmethod - def get_tokens(cls, url, user_agent=None, **kwargs): - scraper = cls.create_scraper() - if user_agent: - scraper.headers["User-Agent"] = user_agent - - try: - resp = scraper.get(url, **kwargs) - resp.raise_for_status() - except Exception as e: - logging.error("'%s' returned an error. Could not collect tokens." % url) - raise - - domain = urlparse(resp.url).netloc - cookie_domain = None - - for d in scraper.cookies.list_domains(): - if d.startswith(".") and d in ("." + domain): - cookie_domain = d - break - else: - raise ValueError( - "Unable to find Cloudflare cookies. Does the site actually have Cloudflare IUAM (\"I'm Under Attack Mode\") enabled?") - - return ({ - "__cfduid": scraper.cookies.get("__cfduid", "", domain=cookie_domain), - "cf_clearance": scraper.cookies.get("cf_clearance", "", domain=cookie_domain) - }, - scraper.headers["User-Agent"] - ) - - def get_live_tokens(self, domain): - for d in self.cookies.list_domains(): - if d.startswith(".") and d in ("." + domain): - cookie_domain = d - break - else: - raise ValueError( - "Unable to find Cloudflare cookies. Does the site actually have Cloudflare IUAM (\"I'm Under Attack Mode\") enabled?") - - return ({ - "__cfduid": self.cookies.get("__cfduid", "", domain=cookie_domain), - "cf_clearance": self.cookies.get("cf_clearance", "", domain=cookie_domain) - }, - self.headers["User-Agent"] - ) - - @classmethod - def get_cookie_string(cls, url, user_agent=None, **kwargs): - """ - Convenience function for building a Cookie HTTP header value. - """ - tokens, user_agent = cls.get_tokens(url, user_agent=user_agent, **kwargs) - return "; ".join("=".join(pair) for pair in tokens.items()), user_agent - - -create_scraper = CloudflareScraper.create_scraper -get_tokens = CloudflareScraper.get_tokens -get_cookie_string = CloudflareScraper.get_cookie_string diff --git a/Contents/Libraries/Shared/cfscrape/__init__.py b/Contents/Libraries/Shared/cfscrape/__init__.py new file mode 100644 index 000000000..57afe4312 --- /dev/null +++ b/Contents/Libraries/Shared/cfscrape/__init__.py @@ -0,0 +1,326 @@ +import logging +import random +import re + +import base64 + +from copy import deepcopy +from time import sleep +from collections import OrderedDict +from .jsfuck import jsunfuck + +import js2py +from requests.sessions import Session + +try: + from requests_toolbelt.utils import dump +except ImportError: + pass + +try: + from urlparse import urlparse + from urlparse import urlunparse +except ImportError: + from urllib.parse import urlparse + from urllib.parse import urlunparse + +__version__ = "2.0.3" + +# Orignally written by https://github.com/Anorov/cloudflare-scrape +# Rewritten by VeNoMouS - <venom@gen-x.co.nz> for https://github.com/VeNoMouS/Sick-Beard - 24/3/2018 NZDT + +DEFAULT_USER_AGENTS = [ + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/65.0.3325.181 Chrome/65.0.3325.181 Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.0; Moto G (5) Build/NPPS25.137-93-8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0", +] + +BUG_REPORT = """\ +Cloudflare may have changed their technique, or there may be a bug in the script. +""" + +class CloudflareScraper(Session): + def __init__(self, *args, **kwargs): + self.delay = kwargs.pop('delay', 8) + self.debug = False + + super(CloudflareScraper, self).__init__(*args, **kwargs) + + if 'requests' in self.headers['User-Agent']: + # Set a random User-Agent if no custom User-Agent has been set + self.headers['User-Agent'] = random.choice(DEFAULT_USER_AGENTS) + + def set_cloudflare_challenge_delay(self, delay): + if isinstance(delay, (int, float)) and delay > 0: + self.delay = delay + + def is_cloudflare_challenge(self, resp): + if resp.headers.get('Server', '').startswith('cloudflare'): + if b'why_captcha' in resp.content or b'/cdn-cgi/l/chk_captcha' in resp.content: + raise ValueError('Captcha') + + return ( + resp.status_code in [429, 503] + and b"jschl_vc" in resp.content + and b"jschl_answer" in resp.content + ) + return False + + def debugRequest(self, req): + try: + print (dump.dump_all(req).decode('utf-8')) + except: + pass + + def request(self, method, url, *args, **kwargs): + self.headers = ( + OrderedDict( + [ + ('User-Agent', self.headers['User-Agent']), + ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), + ('Accept-Language', 'en-US,en;q=0.5'), + ('Accept-Encoding', 'gzip, deflate'), + ('Connection', 'close'), + ('Upgrade-Insecure-Requests', '1') + ] + ) + ) + + resp = super(CloudflareScraper, self).request(method, url, *args, **kwargs) + + # Debug request + if self.debug: + self.debugRequest(resp) + + # Check if Cloudflare anti-bot is on + if self.is_cloudflare_challenge(resp): + # Work around if the initial request is not a GET, + # Superseed with a GET then re-request the orignal METHOD. + if resp.request.method != 'GET': + self.request('GET', resp.url) + resp = self.request(method, url, *args, **kwargs) + else: + resp = self.solve_cf_challenge(resp, **kwargs) + + return resp + + def solve_cf_challenge(self, resp, **original_kwargs): + body = resp.text + + # Cloudflare requires a delay before solving the challenge + if self.delay == 8: + try: + delay = float(re.search(r'submit\(\);\r?\n\s*},\s*([0-9]+)', body).group(1)) / float(1000) + if isinstance(delay, (int, float)): + self.delay = delay + except: + pass + + sleep(self.delay) + + parsed_url = urlparse(resp.url) + domain = parsed_url.netloc + submit_url = '{}://{}/cdn-cgi/l/chk_jschl'.format(parsed_url.scheme, domain) + + cloudflare_kwargs = deepcopy(original_kwargs) + headers = cloudflare_kwargs.setdefault('headers', {'Referer': resp.url}) + + try: + params = cloudflare_kwargs.setdefault( + 'params', OrderedDict( + [ + ('s', re.search(r'name="s"\svalue="(?P<s_value>[^"]+)', body).group('s_value')), + ('jschl_vc', re.search(r'name="jschl_vc" value="(\w+)"', body).group(1)), + ('pass', re.search(r'name="pass" value="(.+?)"', body).group(1)), + ] + ) + ) + + except Exception as e: + # Something is wrong with the page. + # This may indicate Cloudflare has changed their anti-bot + # technique. If you see this and are running the latest version, + # please open a GitHub issue so I can update the code accordingly. + raise ValueError("Unable to parse Cloudflare anti-bots page: {} {}".format(e.message, BUG_REPORT)) + + # Solve the Javascript challenge + params['jschl_answer'] = self.solve_challenge(body, domain) + + # Requests transforms any request into a GET after a redirect, + # so the redirect has to be handled manually here to allow for + # performing other types of requests even as the first request. + method = resp.request.method + + cloudflare_kwargs['allow_redirects'] = False + + redirect = self.request(method, submit_url, **cloudflare_kwargs) + redirect_location = urlparse(redirect.headers['Location']) + if not redirect_location.netloc: + redirect_url = urlunparse( + ( + parsed_url.scheme, + domain, + redirect_location.path, + redirect_location.params, + redirect_location.query, + redirect_location.fragment + ) + ) + return self.request(method, redirect_url, **original_kwargs) + + return self.request(method, redirect.headers['Location'], **original_kwargs) + + def solve_challenge(self, body, domain): + try: + js = re.search( + r"setTimeout\(function\(\){\s+(var s,t,o,p,b,r,e,a,k,i,n,g,f.+?\r?\n[\s\S]+?a\.value =.+?)\r?\n", + body + ).group(1) + except Exception: + raise ValueError("Unable to identify Cloudflare IUAM Javascript on website. {}".format(BUG_REPORT)) + + js = re.sub(r"a\.value = ((.+).toFixed\(10\))?", r"\1", js) + js = re.sub(r'(e\s=\sfunction\(s\)\s{.*?};)', '', js, flags=re.DOTALL|re.MULTILINE) + js = re.sub(r"\s{3,}[a-z](?: = |\.).+", "", js).replace("t.length", str(len(domain))) + + js = js.replace('; 121', '') + + # Strip characters that could be used to exit the string context + # These characters are not currently used in Cloudflare's arithmetic snippet + js = re.sub(r"[\n\\']", "", js) + + if 'toFixed' not in js: + raise ValueError("Error parsing Cloudflare IUAM Javascript challenge. {}".format(BUG_REPORT)) + + try: + jsEnv = """ + var t = "{domain}"; + var g = String.fromCharCode; + + o = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + e = function(s) {{ + s += "==".slice(2 - (s.length & 3)); + var bm, r = "", r1, r2, i = 0; + for (; i < s.length;) {{ + bm = o.indexOf(s.charAt(i++)) << 18 | o.indexOf(s.charAt(i++)) << 12 | (r1 = o.indexOf(s.charAt(i++))) << 6 | (r2 = o.indexOf(s.charAt(i++))); + r += r1 === 64 ? g(bm >> 16 & 255) : r2 === 64 ? g(bm >> 16 & 255, bm >> 8 & 255) : g(bm >> 16 & 255, bm >> 8 & 255, bm & 255); + }} + return r; + }}; + + function italics (str) {{ return '<i>' + this + '</i>'; }}; + var document = {{ + getElementById: function () {{ + return {{'innerHTML': '{innerHTML}'}}; + }} + }}; + {js} + """ + + innerHTML = re.search( + '<div(?: [^<>]*)? id="([^<>]*?)">([^<>]*?)<\/div>', + body, + re.MULTILINE | re.DOTALL + ) + innerHTML = innerHTML.group(2).replace("'", r"\'") if innerHTML else "" + + js = jsunfuck(jsEnv.format(domain=domain, innerHTML=innerHTML, js=js)) + + def atob(s): + return base64.b64decode('{}'.format(s)).decode('utf-8') + + js2py.disable_pyimport() + context = js2py.EvalJs({'atob': atob}) + result = context.eval(js) + except Exception: + logging.error("Error executing Cloudflare IUAM Javascript. {}".format(BUG_REPORT)) + raise + + try: + float(result) + except Exception: + raise ValueError("Cloudflare IUAM challenge returned unexpected answer. {}".format(BUG_REPORT)) + + return result + + @classmethod + def create_scraper(cls, sess=None, **kwargs): + """ + Convenience function for creating a ready-to-go CloudflareScraper object. + """ + scraper = cls(**kwargs) + + if sess: + attrs = ['auth', 'cert', 'cookies', 'headers', 'hooks', 'params', 'proxies', 'data'] + for attr in attrs: + val = getattr(sess, attr, None) + if val: + setattr(scraper, attr, val) + + return scraper + + # Functions for integrating cloudflare-scrape with other applications and scripts + @classmethod + def get_tokens(cls, url, user_agent=None, debug=False, **kwargs): + scraper = cls.create_scraper() + scraper.debug = debug + + if user_agent: + scraper.headers['User-Agent'] = user_agent + + try: + resp = scraper.get(url, **kwargs) + resp.raise_for_status() + except Exception as e: + logging.error("'{}' returned an error. Could not collect tokens.".format(url)) + raise + + domain = urlparse(resp.url).netloc + cookie_domain = None + + for d in scraper.cookies.list_domains(): + if d.startswith('.') and d in ('.{}'.format(domain)): + cookie_domain = d + break + else: + raise ValueError("Unable to find Cloudflare cookies. Does the site actually have Cloudflare IUAM (\"I'm Under Attack Mode\") enabled?") + + return ( + { + '__cfduid': scraper.cookies.get('__cfduid', '', domain=cookie_domain), + 'cf_clearance': scraper.cookies.get('cf_clearance', '', domain=cookie_domain) + }, + scraper.headers['User-Agent'] + ) + + def get_live_tokens(self, domain): + for d in self.cookies.list_domains(): + if d.startswith(".") and d in ("." + domain): + cookie_domain = d + break + else: + raise ValueError( + "Unable to find Cloudflare cookies. Does the site actually have Cloudflare IUAM (\"I'm Under Attack Mode\") enabled?") + + return ({ + "__cfduid": self.cookies.get("__cfduid", "", domain=cookie_domain), + "cf_clearance": self.cookies.get("cf_clearance", "", domain=cookie_domain) + }, + self.headers["User-Agent"] + ) + + @classmethod + def get_cookie_string(cls, url, user_agent=None, debug=False, **kwargs): + """ + Convenience function for building a Cookie HTTP header value. + """ + tokens, user_agent = cls.get_tokens(url, user_agent=user_agent, debug=debug, **kwargs) + return "; ".join("=".join(pair) for pair in tokens.items()), user_agent + +create_scraper = CloudflareScraper.create_scraper +get_tokens = CloudflareScraper.get_tokens +get_cookie_string = CloudflareScraper.get_cookie_string diff --git a/Contents/Libraries/Shared/cfscrape/jsfuck.py b/Contents/Libraries/Shared/cfscrape/jsfuck.py new file mode 100644 index 000000000..9538a0ee1 --- /dev/null +++ b/Contents/Libraries/Shared/cfscrape/jsfuck.py @@ -0,0 +1,97 @@ +MAPPING = { + 'a': '(false+"")[1]', + 'b': '([]["entries"]()+"")[2]', + 'c': '([]["fill"]+"")[3]', + 'd': '(undefined+"")[2]', + 'e': '(true+"")[3]', + 'f': '(false+"")[0]', + 'g': '(false+[0]+String)[20]', + 'h': '(+(101))["to"+String["name"]](21)[1]', + 'i': '([false]+undefined)[10]', + 'j': '([]["entries"]()+"")[3]', + 'k': '(+(20))["to"+String["name"]](21)', + 'l': '(false+"")[2]', + 'm': '(Number+"")[11]', + 'n': '(undefined+"")[1]', + 'o': '(true+[]["fill"])[10]', + 'p': '(+(211))["to"+String["name"]](31)[1]', + 'q': '(+(212))["to"+String["name"]](31)[1]', + 'r': '(true+"")[1]', + 's': '(false+"")[3]', + 't': '(true+"")[0]', + 'u': '(undefined+"")[0]', + 'v': '(+(31))["to"+String["name"]](32)', + 'w': '(+(32))["to"+String["name"]](33)', + 'x': '(+(101))["to"+String["name"]](34)[1]', + 'y': '(NaN+[Infinity])[10]', + 'z': '(+(35))["to"+String["name"]](36)', + 'A': '(+[]+Array)[10]', + 'B': '(+[]+Boolean)[10]', + 'C': 'Function("return escape")()(("")["italics"]())[2]', + 'D': 'Function("return escape")()([]["fill"])["slice"]("-1")', + 'E': '(RegExp+"")[12]', + 'F': '(+[]+Function)[10]', + 'G': '(false+Function("return Date")()())[30]', + 'I': '(Infinity+"")[0]', + 'M': '(true+Function("return Date")()())[30]', + 'N': '(NaN+"")[0]', + 'O': '(NaN+Function("return{}")())[11]', + 'R': '(+[]+RegExp)[10]', + 'S': '(+[]+String)[10]', + 'T': '(NaN+Function("return Date")()())[30]', + 'U': '(NaN+Function("return{}")()["to"+String["name"]]["call"]())[11]', + ' ': '(NaN+[]["fill"])[11]', + '"': '("")["fontcolor"]()[12]', + '%': 'Function("return escape")()([]["fill"])[21]', + '&': '("")["link"](0+")[10]', + '(': '(undefined+[]["fill"])[22]', + ')': '([0]+false+[]["fill"])[20]', + '+': '(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[2]', + ',': '([]["slice"]["call"](false+"")+"")[1]', + '-': '(+(.+[0000000001])+"")[2]', + '.': '(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]', + '/': '(false+[0])["italics"]()[10]', + ':': '(RegExp()+"")[3]', + ';': '("")["link"](")[14]', + '<': '("")["italics"]()[0]', + '=': '("")["fontcolor"]()[11]', + '>': '("")["italics"]()[2]', + '?': '(RegExp()+"")[2]', + '[': '([]["entries"]()+"")[0]', + ']': '([]["entries"]()+"")[22]', + '{': '(true+[]["fill"])[20]', + '}': '([]["fill"]+"")["slice"]("-1")' +} + +SIMPLE = { + 'false': '![]', + 'true': '!![]', + 'undefined': '[][[]]', + 'NaN': '+[![]]', + 'Infinity': '+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])' # +"1e1000" +} + +CONSTRUCTORS = { + 'Array': '[]', + 'Number': '(+[])', + 'String': '([]+[])', + 'Boolean': '(![])', + 'Function': '[]["fill"]', + 'RegExp': 'Function("return/"+false+"/")()' +} + +def jsunfuck(jsfuckString): + + for key in sorted(MAPPING, key=lambda k: len(MAPPING[k]), reverse=True): + if MAPPING.get(key) in jsfuckString: + jsfuckString = jsfuckString.replace(MAPPING.get(key), '"{}"'.format(key)) + + for key in sorted(SIMPLE, key=lambda k: len(SIMPLE[k]), reverse=True): + if SIMPLE.get(key) in jsfuckString: + jsfuckString = jsfuckString.replace(SIMPLE.get(key), '{}'.format(key)) + + #for key in sorted(CONSTRUCTORS, key=lambda k: len(CONSTRUCTORS[k]), reverse=True): + # if CONSTRUCTORS.get(key) in jsfuckString: + # jsfuckString = jsfuckString.replace(CONSTRUCTORS.get(key), '{}'.format(key)) + + return jsfuckString \ No newline at end of file diff --git a/Contents/Libraries/Shared/js2py/__init__.py b/Contents/Libraries/Shared/js2py/__init__.py new file mode 100644 index 000000000..a7fe5979c --- /dev/null +++ b/Contents/Libraries/Shared/js2py/__init__.py @@ -0,0 +1,75 @@ +# The MIT License +# +# Copyright 2014, 2015 Piotr Dabkowski +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the 'Software'), +# to deal in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, subject +# to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies or +# substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +# LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +# OR THE USE OR OTHER DEALINGS IN THE SOFTWARE +""" This module allows you to translate and execute Javascript in pure python. + Basically its implementation of ECMAScript 5.1 in pure python. + + Use eval_js method to execute javascript code and get resulting python object (builtin if possible). + + EXAMPLE: + >>> import js2py + >>> add = js2py.eval_js('function add(a, b) {return a + b}') + >>> add(1, 2) + 3 + 6 + >>> add('1', 2, 3) + u'12' + >>> add.constructor + function Function() { [python code] } + + + Or use EvalJs to execute many javascript code fragments under same context - you would be able to get any + variable from the context! + + >>> js = js2py.EvalJs() + >>> js.execute('var a = 10; function f(x) {return x*x};') + >>> js.f(9) + 81 + >>> js.a + 10 + + Also you can use its console method to play with interactive javascript console. + + + Use parse_js to parse (syntax tree is just like in esprima.js) and translate_js to trasnlate JavaScript. + + Finally, you can use pyimport statement from inside JS code to import and use python libraries. + + >>> js2py.eval_js('pyimport urllib; urllib.urlopen("https://www.google.com")') + + NOTE: This module is still not fully finished: + + Date and JSON builtin objects are not implemented + Array prototype is not fully finished (will be soon) + + Other than that everything should work fine. + +""" + +__author__ = 'Piotr Dabkowski' +__all__ = [ + 'EvalJs', 'translate_js', 'import_js', 'eval_js', 'parse_js', + 'translate_file', 'run_file', 'disable_pyimport', 'eval_js6', + 'translate_js6', 'PyJsException', 'get_file_contents', + 'write_file_contents', 'require' +] + +from .base import PyJsException +from .evaljs import * +from .translators import parse as parse_js +from .node_import import require diff --git a/Contents/Libraries/Shared/js2py/base.py b/Contents/Libraries/Shared/js2py/base.py new file mode 100644 index 000000000..67c80d599 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/base.py @@ -0,0 +1,3280 @@ +'''Most important file in Js2Py implementation: PyJs class - father of all PyJs objects''' +from copy import copy +import re + +from .translators.friendly_nodes import REGEXP_CONVERTER +from .utils.injector import fix_js_args +from types import FunctionType, ModuleType, GeneratorType, BuiltinFunctionType, MethodType, BuiltinMethodType +import traceback +try: + import numpy + NUMPY_AVAILABLE = True +except: + NUMPY_AVAILABLE = False + +# python 3 support +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + + +def str_repr(s): + if six.PY2: + return repr(s.encode('utf-8')) + else: + return repr(s) + + +def MakeError(name, message): + """Returns PyJsException with PyJsError inside""" + return JsToPyException(ERRORS[name](Js(message))) + + +def to_python(val): + if not isinstance(val, PyJs): + return val + if isinstance(val, PyJsUndefined) or isinstance(val, PyJsNull): + return None + elif isinstance(val, PyJsNumber): + # this can be either float or long/int better to assume its int/long when a whole number... + v = val.value + try: + i = int(v) if v == v else v # nan... + return v if i != v else i + except: + return v + elif isinstance(val, (PyJsString, PyJsBoolean)): + return val.value + elif isinstance(val, PyObjectWrapper): + return val.__dict__['obj'] + elif isinstance(val, PyJsArray) and val.CONVERT_TO_PY_PRIMITIVES: + return to_list(val) + elif isinstance(val, PyJsObject) and val.CONVERT_TO_PY_PRIMITIVES: + return to_dict(val) + else: + return JsObjectWrapper(val) + + +def to_dict(js_obj, + known=None): # fixed recursion error in self referencing objects + res = {} + if known is None: + known = {} + if js_obj in known: + return known[js_obj] + known[js_obj] = res + for k in js_obj: + name = k.value + input = js_obj.get(name) + output = to_python(input) + if isinstance(output, JsObjectWrapper): + if output._obj.Class == 'Object': + output = to_dict(output._obj, known) + known[input] = output + elif output._obj.Class in [ + 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', + 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', + 'Float32Array', 'Float64Array' + ]: + output = to_list(output._obj) + known[input] = output + res[name] = output + return res + + +def to_list(js_obj, known=None): + res = len(js_obj) * [None] + if known is None: + known = {} + if js_obj in known: + return known[js_obj] + known[js_obj] = res + for k in js_obj: + try: + name = int(k.value) + except: + continue + input = js_obj.get(str(name)) + output = to_python(input) + if isinstance(output, JsObjectWrapper): + if output._obj.Class in [ + 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', + 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', + 'Float32Array', 'Float64Array', 'Arguments' + ]: + output = to_list(output._obj, known) + known[input] = output + elif output._obj.Class in ['Object']: + output = to_dict(output._obj) + known[input] = output + res[name] = output + return res + + +def HJs(val): + if hasattr(val, '__call__'): # + + @Js + def PyWrapper(this, arguments, var=None): + args = tuple(to_python(e) for e in arguments.to_list()) + try: + py_res = val.__call__(*args) + except Exception as e: + message = 'your Python function failed! ' + try: + message += e.message + except: + pass + raise MakeError('Error', message) + return py_wrap(py_res) + + try: + PyWrapper.func_name = val.__name__ + except: + pass + return PyWrapper + if isinstance(val, tuple): + val = list(val) + return Js(val) + + +def Js(val, Clamped=False): + '''Converts Py type to PyJs type''' + if isinstance(val, PyJs): + return val + elif val is None: + return undefined + elif isinstance(val, basestring): + return PyJsString(val, StringPrototype) + elif isinstance(val, bool): + return true if val else false + elif isinstance(val, float) or isinstance(val, int) or isinstance( + val, long) or (NUMPY_AVAILABLE and isinstance( + val, + (numpy.int8, numpy.uint8, numpy.int16, numpy.uint16, + numpy.int32, numpy.uint32, numpy.float32, numpy.float64))): + # This is supposed to speed things up. may not be the case + if val in NUM_BANK: + return NUM_BANK[val] + return PyJsNumber(float(val), NumberPrototype) + elif isinstance(val, FunctionType): + return PyJsFunction(val, FunctionPrototype) + #elif isinstance(val, ModuleType): + # mod = {} + # for name in dir(val): + # value = getattr(val, name) + # if isinstance(value, ModuleType): + # continue # prevent recursive module conversion + # try: + # jsval = HJs(value) + # except RuntimeError: + # print 'Could not convert %s to PyJs object!' % name + # continue + # mod[name] = jsval + # return Js(mod) + #elif isintance(val, ClassType): + + elif isinstance(val, dict): # convert to object + temp = PyJsObject({}, ObjectPrototype) + for k, v in six.iteritems(val): + temp.put(Js(k), Js(v)) + return temp + elif isinstance(val, (list, tuple)): #Convert to array + return PyJsArray(val, ArrayPrototype) + # convert to typedarray + elif isinstance(val, JsObjectWrapper): + return val.__dict__['_obj'] + elif NUMPY_AVAILABLE and isinstance(val, numpy.ndarray): + if val.dtype == numpy.int8: + return PyJsInt8Array(val, Int8ArrayPrototype) + elif val.dtype == numpy.uint8 and not Clamped: + return PyJsUint8Array(val, Uint8ArrayPrototype) + elif val.dtype == numpy.uint8 and Clamped: + return PyJsUint8ClampedArray(val, Uint8ClampedArrayPrototype) + elif val.dtype == numpy.int16: + return PyJsInt16Array(val, Int16ArrayPrototype) + elif val.dtype == numpy.uint16: + return PyJsUint16Array(val, Uint16ArrayPrototype) + + elif val.dtype == numpy.int32: + return PyJsInt32Array(val, Int32ArrayPrototype) + elif val.dtype == numpy.uint32: + return PyJsUint16Array(val, Uint32ArrayPrototype) + + elif val.dtype == numpy.float32: + return PyJsFloat32Array(val, Float32ArrayPrototype) + elif val.dtype == numpy.float64: + return PyJsFloat64Array(val, Float64ArrayPrototype) + else: # try to convert to js object + return py_wrap(val) + #raise RuntimeError('Cant convert python type to js (%s)' % repr(val)) + #try: + # obj = {} + # for name in dir(val): + # if name.startswith('_'): #dont wrap attrs that start with _ + # continue + # value = getattr(val, name) + # import types + # if not isinstance(value, (FunctionType, BuiltinFunctionType, MethodType, BuiltinMethodType, + # dict, int, basestring, bool, float, long, list, tuple)): + # continue + # obj[name] = HJs(value) + # return Js(obj) + #except: + # raise RuntimeError('Cant convert python type to js (%s)' % repr(val)) + + +def Type(val): + try: + return val.TYPE + except: + raise RuntimeError('Invalid type: ' + str(val)) + + +def is_data_descriptor(desc): + return desc and ('value' in desc or 'writable' in desc) + + +def is_accessor_descriptor(desc): + return desc and ('get' in desc or 'set' in desc) + + +def is_generic_descriptor(desc): + return desc and not (is_data_descriptor(desc) + or is_accessor_descriptor(desc)) + + +############################################################################## + + +class PyJs(object): + PRIMITIVES = frozenset( + ['String', 'Number', 'Boolean', 'Undefined', 'Null']) + TYPE = 'Object' + Class = None + extensible = True + prototype = None + own = {} + GlobalObject = None + IS_CHILD_SCOPE = False + CONVERT_TO_PY_PRIMITIVES = False + value = None + buff = None + + def __init__(self, value=None, prototype=None, extensible=False): + '''Constructor for Number String and Boolean''' + # I dont think this is needed anymore + # if self.Class=='String' and not isinstance(value, basestring): + # raise TypeError + # if self.Class=='Number': + # if not isinstance(value, float): + # if not (isinstance(value, int) or isinstance(value, long)): + # raise TypeError + # value = float(value) + # if self.Class=='Boolean' and not isinstance(value, bool): + # raise TypeError + self.value = value + self.extensible = extensible + self.prototype = prototype + self.own = {} + self.buff = None + + def is_undefined(self): + return self.Class == 'Undefined' + + def is_null(self): + return self.Class == 'Null' + + def is_primitive(self): + return self.TYPE in self.PRIMITIVES + + def is_object(self): + return not self.is_primitive() + + def _type(self): + return Type(self) + + def is_callable(self): + return hasattr(self, 'call') + + def get_own_property(self, prop): + return self.own.get(prop) + + def get_property(self, prop): + cand = self.get_own_property(prop) + if cand: + return cand + if self.prototype is not None: + return self.prototype.get_property(prop) + + def update_array(self): + for i in range(self.get('length').to_uint32()): + self.put(str(i), Js(self.buff[i])) + + def get(self, prop): #external use! + #prop = prop.value + if self.Class == 'Undefined' or self.Class == 'Null': + raise MakeError('TypeError', + 'Undefined and null dont have properties!') + if not isinstance(prop, basestring): + prop = prop.to_string().value + if not isinstance(prop, basestring): raise RuntimeError('Bug') + if NUMPY_AVAILABLE and prop.isdigit(): + if isinstance(self.buff, numpy.ndarray): + self.update_array() + cand = self.get_property(prop) + if cand is None: + return Js(None) + if is_data_descriptor(cand): + return cand['value'] + if cand['get'].is_undefined(): + return cand['get'] + return cand['get'].call(self) + + def can_put(self, prop): #to check + desc = self.get_own_property(prop) + if desc: #if we have this property + if is_accessor_descriptor(desc): + return desc['set'].is_callable( + ) # Check if setter method is defined + else: #data desc + return desc['writable'] + if self.prototype is not None: + return self.extensible + inherited = self.get_property(prop) + if inherited is None: + return self.extensible + if is_accessor_descriptor(inherited): + return not inherited['set'].is_undefined() + elif self.extensible: + return inherited['writable'] + return False + + def put(self, prop, val, op=None): #external use! + '''Just like in js: self.prop op= val + for example when op is '+' it will be self.prop+=val + op can be either None for simple assignment or one of: + * / % + - << >> & ^ |''' + if self.Class == 'Undefined' or self.Class == 'Null': + raise MakeError('TypeError', + 'Undefined and null dont have properties!') + if not isinstance(prop, basestring): + prop = prop.to_string().value + if NUMPY_AVAILABLE and prop.isdigit(): + if self.Class == 'Int8Array': + val = Js(numpy.int8(val.to_number().value)) + elif self.Class == 'Uint8Array': + val = Js(numpy.uint8(val.to_number().value)) + elif self.Class == 'Uint8ClampedArray': + if val < Js(numpy.uint8(0)): + val = Js(numpy.uint8(0)) + elif val > Js(numpy.uint8(255)): + val = Js(numpy.uint8(255)) + else: + val = Js(numpy.uint8(val.to_number().value)) + elif self.Class == 'Int16Array': + val = Js(numpy.int16(val.to_number().value)) + elif self.Class == 'Uint16Array': + val = Js(numpy.uint16(val.to_number().value)) + elif self.Class == 'Int32Array': + val = Js(numpy.int32(val.to_number().value)) + elif self.Class == 'Uint32Array': + val = Js(numpy.uint32(val.to_number().value)) + elif self.Class == 'Float32Array': + val = Js(numpy.float32(val.to_number().value)) + elif self.Class == 'Float64Array': + val = Js(numpy.float64(val.to_number().value)) + if isinstance(self.buff, numpy.ndarray): + self.buff[int(prop)] = int(val.to_number().value) + #we need to set the value to the incremented one + if op is not None: + val = getattr(self.get(prop), OP_METHODS[op])(val) + if not self.can_put(prop): + return val + own_desc = self.get_own_property(prop) + if is_data_descriptor(own_desc): + if self.Class in [ + 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', + 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', + 'Float32Array', 'Float64Array' + ]: + self.define_own_property(prop, {'value': val}) + else: + self.own[prop]['value'] = val + return val + desc = self.get_property(prop) + if is_accessor_descriptor(desc): + desc['set'].call(self, (val, )) + else: + new = { + 'value': val, + 'writable': True, + 'configurable': True, + 'enumerable': True + } + if self.Class in [ + 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', + 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', + 'Float32Array', 'Float64Array' + ]: + self.define_own_property(prop, new) + else: + self.own[prop] = new + return val + + def has_property(self, prop): + return self.get_property(prop) is not None + + def delete(self, prop): + if not isinstance(prop, basestring): + prop = prop.to_string().value + desc = self.get_own_property(prop) + if desc is None: + return Js(True) + if desc['configurable']: + del self.own[prop] + return Js(True) + return Js(False) + + def default_value( + self, hint=None + ): # made a mistake at the very early stage and made it to prefer string... caused lots! of problems + order = ('valueOf', 'toString') + if hint == 'String' or (hint is None and self.Class == 'Date'): + order = ('toString', 'valueOf') + for meth_name in order: + method = self.get(meth_name) + if method is not None and method.is_callable(): + cand = method.call(self) + if cand.is_primitive(): + return cand + raise MakeError('TypeError', + 'Cannot convert object to primitive value') + + def define_own_property(self, prop, + desc): #Internal use only. External through Object + # prop must be a Py string. Desc is either a descriptor or accessor. + #Messy method - raw translation from Ecma spec to prevent any bugs. # todo check this + current = self.get_own_property(prop) + + extensible = self.extensible + if not current: #We are creating a new property + if not extensible: + return False + if is_data_descriptor(desc) or is_generic_descriptor(desc): + DEFAULT_DATA_DESC = { + 'value': undefined, #undefined + 'writable': False, + 'enumerable': False, + 'configurable': False + } + DEFAULT_DATA_DESC.update(desc) + self.own[prop] = DEFAULT_DATA_DESC + else: + DEFAULT_ACCESSOR_DESC = { + 'get': undefined, #undefined + 'set': undefined, #undefined + 'enumerable': False, + 'configurable': False + } + DEFAULT_ACCESSOR_DESC.update(desc) + self.own[prop] = DEFAULT_ACCESSOR_DESC + return True + if not desc or desc == current: #We dont need to change anything. + return True + configurable = current['configurable'] + if not configurable: #Prevent changing configurable or enumerable + if desc.get('configurable'): + return False + if 'enumerable' in desc and desc['enumerable'] != current[ + 'enumerable']: + return False + if is_generic_descriptor(desc): + pass + elif is_data_descriptor(current) != is_data_descriptor(desc): + if not configurable: + return False + if is_data_descriptor(current): + del current['value'] + del current['writable'] + current['set'] = undefined #undefined + current['get'] = undefined #undefined + else: + del current['set'] + del current['get'] + current['value'] = undefined #undefined + current['writable'] = False + elif is_data_descriptor(current) and is_data_descriptor(desc): + if not configurable: + if not current['writable'] and desc.get('writable'): + return False + if not current['writable'] and 'value' in desc and current[ + 'value'] != desc['value']: + return False + elif is_accessor_descriptor(current) and is_accessor_descriptor(desc): + if not configurable: + if 'set' in desc and desc['set'] is not current['set']: + return False + if 'get' in desc and desc['get'] is not current['get']: + return False + current.update(desc) + return True + + #these methods will work only for Number class + def is_infinity(self): + assert self.Class == 'Number' + return self.value == float('inf') or self.value == -float('inf') + + def is_nan(self): + assert self.Class == 'Number' + return self.value != self.value #nan!=nan evaluates to true + + def is_finite(self): + return not (self.is_nan() or self.is_infinity()) + + #Type Conversions. to_type. All must return pyjs subclass instance + + def to_primitive(self, hint=None): + if self.is_primitive(): + return self + if hint is None and ( + self.Class == 'Number' or self.Class == 'Boolean' + ): # favour number for Class== Number or Boolean default = String + hint = 'Number' + return self.default_value(hint) + + def to_boolean(self): + typ = Type(self) + if typ == 'Boolean': #no need to convert + return self + elif typ == 'Null' or typ == 'Undefined': #they are both always false + return false + elif typ == 'Number' or typ == 'String': #false only for 0, '' and NaN + return Js(bool( + self.value + and self.value == self.value)) # test for nan (nan -> flase) + else: #object - always true + return true + + def to_number(self): + typ = Type(self) + if typ == 'Null': #null is 0 + return Js(0) + elif typ == 'Undefined': # undefined is NaN + return NaN + elif typ == 'Boolean': # 1 for true 0 for false + return Js(int(self.value)) + elif typ == 'Number': # or self.Class=='Number': # no need to convert + return self + elif typ == 'String': + s = self.value.strip() #Strip white space + if not s: # '' is simply 0 + return Js(0) + if 'x' in s or 'X' in s[:3]: #hex (positive only) + try: # try to convert + num = int(s, 16) + except ValueError: # could not convert > NaN + return NaN + return Js(num) + sign = 1 #get sign + if s[0] in '+-': + if s[0] == '-': + sign = -1 + s = s[1:] + if s == 'Infinity': #Check for infinity keyword. 'NaN' will be NaN anyway. + return Js(sign * float('inf')) + try: #decimal try + num = sign * float(s) # Converted + except ValueError: + return NaN # could not convert to decimal > return NaN + return Js(num) + else: #object - most likely it will be NaN. + return self.to_primitive('Number').to_number() + + def to_string(self): + typ = Type(self) + if typ == 'Null': + return Js('null') + elif typ == 'Undefined': + return Js('undefined') + elif typ == 'Boolean': + return Js('true') if self.value else Js('false') + elif typ == 'Number': #or self.Class=='Number': + if self.is_nan(): + return Js('NaN') + elif self.is_infinity(): + sign = '-' if self.value < 0 else '' + return Js(sign + 'Infinity') + elif isinstance(self.value, + long) or self.value.is_integer(): # dont print .0 + return Js(unicode(int(self.value))) + return Js(unicode(self.value)) # accurate enough + elif typ == 'String': + return self + else: #object + return self.to_primitive('String').to_string() + + def to_object(self): + typ = self.TYPE + if typ == 'Null' or typ == 'Undefined': + raise MakeError('TypeError', + 'undefined or null can\'t be converted to object') + elif typ == 'Boolean': # Unsure here... todo repair here + return Boolean.create(self) + elif typ == 'Number': #? + return Number.create(self) + elif typ == 'String': #? + return String.create(self) + else: #object + return self + + def to_int32(self): + num = self.to_number() + if num.is_nan() or num.is_infinity(): + return 0 + int32 = int(num.value) % 2**32 + return int(int32 - 2**32 if int32 >= 2**31 else int32) + + def strict_equality_comparison(self, other): + return PyJsStrictEq(self, other) + + def cok(self): + """Check object coercible""" + if self.Class in ('Undefined', 'Null'): + raise MakeError('TypeError', + 'undefined or null can\'t be converted to object') + + def to_int(self): + num = self.to_number() + if num.is_nan(): + return 0 + elif num.is_infinity(): + return 10**20 if num.value > 0 else -10**20 + return int(num.value) + + def to_uint32(self): + num = self.to_number() + if num.is_nan() or num.is_infinity(): + return 0 + return int(num.value) % 2**32 + + def to_uint16(self): + num = self.to_number() + if num.is_nan() or num.is_infinity(): + return 0 + return int(num.value) % 2**16 + + def to_int16(self): + num = self.to_number() + if num.is_nan() or num.is_infinity(): + return 0 + int16 = int(num.value) % 2**16 + return int(int16 - 2**16 if int16 >= 2**15 else int16) + + def same_as(self, other): + typ = Type(self) + if typ != other.Class: + return False + if typ == 'Undefined' or typ == 'Null': + return True + if typ == 'Boolean' or typ == 'Number' or typ == 'String': + return self.value == other.value + else: #object + return self is other #Id compare. + + #Not to be used by translation (only internal use) + def __getitem__(self, item): + return self.get( + str(item) if not isinstance(item, PyJs) else item.to_string(). + value) + + def __setitem__(self, item, value): + self.put( + str(item) if not isinstance(item, PyJs) else + item.to_string().value, Js(value)) + + def __len__(self): + try: + return self.get('length').to_uint32() + except: + raise TypeError( + 'This object (%s) does not have length property' % self.Class) + + #Oprators------------- + #Unary, other will be implemented as functions. Increments and decrements + # will be methods of Number class + def __neg__(self): #-u + return Js(-self.to_number().value) + + def __pos__(self): #+u + return self.to_number() + + def __invert__(self): #~u + return Js(Js(~self.to_int32()).to_int32()) + + def neg(self): # !u cant do 'not u' :( + return Js(not self.to_boolean().value) + + def __nonzero__(self): + return self.to_boolean().value + + def __bool__(self): + return self.to_boolean().value + + def typeof(self): + if self.is_callable(): + return Js('function') + typ = Type(self).lower() + if typ == 'null': + typ = 'object' + return Js(typ) + + #Bitwise operators + # <<, >>, &, ^, | + + # << + def __lshift__(self, other): + lnum = self.to_int32() + rnum = other.to_uint32() + shiftCount = rnum & 0x1F + return Js(Js(lnum << shiftCount).to_int32()) + + # >> + def __rshift__(self, other): + lnum = self.to_int32() + rnum = other.to_uint32() + shiftCount = rnum & 0x1F + return Js(Js(lnum >> shiftCount).to_int32()) + + # >>> + def pyjs_bshift(self, other): + lnum = self.to_uint32() + rnum = other.to_uint32() + shiftCount = rnum & 0x1F + return Js(Js(lnum >> shiftCount).to_uint32()) + + # & + def __and__(self, other): + lnum = self.to_int32() + rnum = other.to_int32() + return Js(Js(lnum & rnum).to_int32()) + + # ^ + def __xor__(self, other): + lnum = self.to_int32() + rnum = other.to_int32() + return Js(Js(lnum ^ rnum).to_int32()) + + # | + def __or__(self, other): + lnum = self.to_int32() + rnum = other.to_int32() + return Js(Js(lnum | rnum).to_int32()) + + # Additive operators + # + and - are implemented here + + # + + def __add__(self, other): + a = self.to_primitive() + b = other.to_primitive() + if a.TYPE == 'String' or b.TYPE == 'String': + return Js(a.to_string().value + b.to_string().value) + a = a.to_number() + b = b.to_number() + return Js(a.value + b.value) + + # - + def __sub__(self, other): + return Js(self.to_number().value - other.to_number().value) + + #Multiplicative operators + # *, / and % are implemented here + + # * + def __mul__(self, other): + return Js(self.to_number().value * other.to_number().value) + + # / + def __div__(self, other): + a = self.to_number().value + b = other.to_number().value + if b: + return Js(a / b) + if not a or a != a: + return NaN + return Infinity if a > 0 else -Infinity + + # % + def __mod__(self, other): + a = self.to_number().value + b = other.to_number().value + if abs(a) == float('inf') or not b: + return NaN + if abs(b) == float('inf'): + return Js(a) + pyres = Js(a % b) #different signs in python and javascript + #python has the same sign as b and js has the same + #sign as a. + if a < 0 and pyres.value > 0: + pyres.value -= abs(b) + elif a > 0 and pyres.value < 0: + pyres.value += abs(b) + return Js(pyres) + + #Comparisons (I dont implement === and !== here, these + # will be implemented as external functions later) + # <, <=, !=, ==, >=, > are implemented here. + + def abstract_relational_comparison(self, other, self_first=True): + ''' self<other if self_first else other<self. + Returns the result of the question: is self smaller than other? + in case self_first is false it returns the answer of: + is other smaller than self. + result is PyJs type: bool or undefined''' + px = self.to_primitive('Number') + py = other.to_primitive('Number') + if not self_first: #reverse order + px, py = py, px + if not (px.Class == 'String' and py.Class == 'String'): + px, py = px.to_number(), py.to_number() + if px.is_nan() or py.is_nan(): + return undefined + return Js(px.value < py.value) # same cmp algorithm + else: + # I am pretty sure that python has the same + # string cmp algorithm but I have to confirm it + return Js(px.value < py.value) + + #< + def __lt__(self, other): + res = self.abstract_relational_comparison(other, True) + if res.is_undefined(): + return false + return res + + #<= + def __le__(self, other): + res = self.abstract_relational_comparison(other, False) + if res.is_undefined(): + return false + return res.neg() + + #>= + def __ge__(self, other): + res = self.abstract_relational_comparison(other, True) + if res.is_undefined(): + return false + return res.neg() + + #> + def __gt__(self, other): + res = self.abstract_relational_comparison(other, False) + if res.is_undefined(): + return false + return res + + def abstract_equality_comparison(self, other): + ''' returns the result of JS == compare. + result is PyJs type: bool''' + tx, ty = self.TYPE, other.TYPE + if tx == ty: + if tx == 'Undefined' or tx == 'Null': + return true + if tx == 'Number' or tx == 'String' or tx == 'Boolean': + return Js(self.value == other.value) + return Js(self is other) # Object + elif (tx == 'Undefined' and ty == 'Null') or (ty == 'Undefined' + and tx == 'Null'): + return true + elif tx == 'Number' and ty == 'String': + return self.abstract_equality_comparison(other.to_number()) + elif tx == 'String' and ty == 'Number': + return self.to_number().abstract_equality_comparison(other) + elif tx == 'Boolean': + return self.to_number().abstract_equality_comparison(other) + elif ty == 'Boolean': + return self.abstract_equality_comparison(other.to_number()) + elif (tx == 'String' or tx == 'Number') and other.is_object(): + return self.abstract_equality_comparison(other.to_primitive()) + elif (ty == 'String' or ty == 'Number') and self.is_object(): + return self.to_primitive().abstract_equality_comparison(other) + else: + return false + + #== + def __eq__(self, other): + return self.abstract_equality_comparison(other) + + #!= + def __ne__(self, other): + return self.abstract_equality_comparison(other).neg() + + #Other methods (instanceof) + + def instanceof(self, other): + '''checks if self is instance of other''' + if not hasattr(other, 'has_instance'): + return false + return other.has_instance(self) + + #iteration + def __iter__(self): + #Returns a generator of all own enumerable properties + # since the size od self.own can change we need to use different method of iteration. + # SLOW! New items will NOT show up. + returned = {} + if not self.IS_CHILD_SCOPE: + cands = sorted( + name for name in self.own if self.own[name]['enumerable']) + else: + cands = sorted(name for name in self.own) + for cand in cands: + check = self.own.get(cand) + if check and check['enumerable']: + yield Js(cand) + + def contains(self, other): + if not self.is_object(): + raise MakeError( + 'TypeError', + "You can\'t use 'in' operator to search in non-objects") + return Js(self.has_property(other.to_string().value)) + + #Other Special methods + def __call__(self, *args): + '''Call a property prop as a function (this will be global object). + + NOTE: dont pass this and arguments here, these will be added + automatically!''' + if not self.is_callable(): + raise MakeError('TypeError', + '%s is not a function' % self.typeof()) + return self.call(self.GlobalObject, args) + + def create(self, *args): + '''Generally not a constructor, raise an error''' + raise MakeError('TypeError', '%s is not a constructor' % self.Class) + + def __unicode__(self): + return self.to_string().value + + def __repr__(self): + if self.Class == 'Object': + res = [] + for e in self: + res.append(str_repr(e.value) + ': ' + str_repr(self.get(e))) + return '{%s}' % ', '.join(res) + elif self.Class == 'String': + return str_repr(self.value) + elif self.Class in [ + 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', + 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', + 'Float32Array', 'Float64Array' + ]: + res = [] + for e in self: + res.append(repr(self.get(e))) + return '[%s]' % ', '.join(res) + else: + val = str_repr(self.to_string().value) + return val + + def _fuck_python3( + self + ): # hack to make object hashable in python 3 (__eq__ causes problems) + return object.__hash__(self) + + def callprop(self, prop, *args): + '''Call a property prop as a method (this will be self). + + NOTE: dont pass this and arguments here, these will be added + automatically!''' + if not isinstance(prop, basestring): + prop = prop.to_string().value + cand = self.get(prop) + if not cand.is_callable(): + raise MakeError('TypeError', + '%s is not a function' % cand.typeof()) + return cand.call(self, args) + + def to_python(self): + """returns equivalent python object. + for example if this object is javascript array then this method will return equivalent python array""" + return to_python(self) + + def to_py(self): + """returns equivalent python object. + for example if this object is javascript array then this method will return equivalent python array""" + return self.to_python() + + +if six.PY3: + PyJs.__hash__ = PyJs._fuck_python3 + PyJs.__truediv__ = PyJs.__div__ +#Define some more classes representing operators: + + +def PyJsStrictEq(a, b): + '''a===b''' + tx, ty = Type(a), Type(b) + if tx != ty: + return false + if tx == 'Undefined' or tx == 'Null': + return true + if a.is_primitive(): #string bool and number case + return Js(a.value == b.value) + if a.Class == b.Class == 'PyObjectWrapper': + return Js(a.obj == b.obj) + return Js(a is b) # object comparison + + +def PyJsStrictNeq(a, b): + ''' a!==b''' + return PyJsStrictEq(a, b).neg() + + +def PyJsBshift(a, b): + """a>>>b""" + return a.pyjs_bshift(b) + + +def PyJsComma(a, b): + return b + + +from .internals.simplex import JsException as PyJsException +import pyjsparser +pyjsparser.parser.ENABLE_JS2PY_ERRORS = lambda msg: MakeError('SyntaxError', msg) + + +class PyJsSwitchException(Exception): + pass + + +PyJs.MakeError = staticmethod(MakeError) + + +def JsToPyException(js): + temp = PyJsException() + temp.mes = js + return temp + + +def PyExceptionToJs(py): + return py.mes + + +#Scope class it will hold all the variables accessible to user +class Scope(PyJs): + Class = 'global' + extensible = True + IS_CHILD_SCOPE = True + + # todo speed up + # in order to speed up this very important class the top scope should behave differently than + # child scopes, child scope should not have this property descriptor thing because they cant be changed anyway + # they are all confugurable= False + + def __init__(self, scope, closure=None): + """Doc""" + self.prototype = closure + if closure is None: + # global, top level scope + self.own = {} + for k, v in six.iteritems(scope): + # set all the global items + self.define_own_property( + k, { + 'value': v, + 'configurable': False, + 'writable': False, + 'enumerable': False + }) + else: + # not global, less powerful but faster closure. + self.own = scope # simple dictionary which maps name directly to js object. + + def register(self, lval): + # registered keeps only global registered variables + if self.prototype is None: + # define in global scope + if lval in self.own: + self.own[lval]['configurable'] = False + else: + self.define_own_property( + lval, { + 'value': undefined, + 'configurable': False, + 'writable': True, + 'enumerable': True + }) + elif lval not in self.own: + # define in local scope since it has not been defined yet + self.own[lval] = undefined # default value + + def registers(self, lvals): + """register multiple variables""" + for lval in lvals: + self.register(lval) + + def put(self, lval, val, op=None): + if self.prototype is None: + # global scope put, simple + return PyJs.put(self, lval, val, op) + else: + # trying to put in local scope + # we dont know yet in which scope we should place this var + if lval in self.own: + if op: # increment operation + val = getattr(self.own[lval], OP_METHODS[op])(val) + self.own[lval] = val + return val + else: + #try to put in the lower scope since we cant put in this one (var wasn't registered) + return self.prototype.put(lval, val, op) + + def force_own_put(self, prop, val, configurable=False): + if self.prototype is None: # global scope + self.own[prop] = { + 'value': val, + 'writable': True, + 'enumerable': True, + 'configurable': configurable + } + else: + self.own[prop] = val + + def get(self, prop, throw=True): + #note prop is always a Py String + if not isinstance(prop, basestring): + prop = prop.to_string().value + if self.prototype is not None: + # fast local scope + cand = self.own.get(prop) + if cand is None: + return self.prototype.get(prop, throw) + return cand + # slow, global scope + if prop not in self.own: + if throw: + raise MakeError('ReferenceError', '%s is not defined' % prop) + return undefined + return PyJs.get(self, prop) + + def delete(self, lval): + if self.prototype is not None: + if lval in self.own: + return false + return self.prototype.delete(lval) + # we are in global scope here. Must exist and be configurable to delete + if lval not in self.own: + # this lval does not exist, why do you want to delete it??? + return true + if self.own[lval]['configurable']: + del self.own[lval] + return true + # not configurable, cant delete + return false + + def pyimport(self, name, module): + self.register(name) + self.put(name, py_wrap(module)) + + def __repr__(self): + return u'[Object Global]' + + def to_python(self): + return to_python(self) + + +class This(Scope): + IS_CHILD_SCOPE = False + + def get(self, prop, throw=False): + return Scope.get(self, prop, throw) + + +class JsObjectWrapper(object): + def __init__(self, obj): + self.__dict__['_obj'] = obj + + def __call__(self, *args): + args = tuple(Js(e) for e in args) + if '_prop_of' in self.__dict__: + parent, meth = self.__dict__['_prop_of'] + return to_python(parent._obj.callprop(meth, *args)) + return to_python(self._obj(*args)) + + def __getattr__(self, item): + if item == 'new' and self._obj.is_callable(): + # return instance initializer + def PyJsInstanceInit(*args): + args = tuple(Js(e) for e in args) + return self._obj.create(*args).to_python() + + return PyJsInstanceInit + cand = to_python(self._obj.get(str(item))) + # handling method calling... obj.meth(). Value of this in meth should be self + if isinstance(cand, self.__class__): + cand.__dict__['_prop_of'] = self, str(item) + return cand + + def __setattr__(self, item, value): + self._obj.put(str(item), Js(value)) + + def __getitem__(self, item): + cand = to_python(self._obj.get(str(item))) + if isinstance(cand, self.__class__): + cand.__dict__['_prop_of'] = self, str(item) + return cand + + def __setitem__(self, item, value): + self._obj.put(str(item), Js(value)) + + def __iter__(self): + if self._obj.Class in [ + 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', + 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', + 'Float32Array', 'Float64Array' + ]: + return iter(self.to_list()) + elif self._obj.Class == 'Object': + return iter(self.to_dict()) + else: + raise MakeError('TypeError', + '%s is not iterable in Python' % self._obj.Class) + + def __repr__(self): + if self._obj.is_primitive() or self._obj.is_callable(): + return repr(self._obj) + elif self._obj.Class in ('Array', 'Int8Array', 'Uint8Array', + 'Uint8ClampedArray', 'Int16Array', + 'Uint16Array', 'Int32Array', 'Uint32Array', + 'Float32Array', 'Float64Array', 'Arguments'): + return repr(self.to_list()) + return repr(self.to_dict()) + + def __len__(self): + return len(self._obj) + + def __nonzero__(self): + return bool(self._obj) + + def __bool__(self): + return bool(self._obj) + + def to_dict(self): + return to_dict(self.__dict__['_obj']) + + def to_list(self): + return to_list(self.__dict__['_obj']) + + +class PyObjectWrapper(PyJs): + Class = 'PyObjectWrapper' + + def __init__(self, obj): + self.obj = obj + + def get(self, prop): + if not isinstance(prop, basestring): + prop = prop.to_string().value + try: + if prop.isdigit(): + return py_wrap(self.obj[int(prop)]) + return py_wrap(getattr(self.obj, prop)) + except: + return undefined + + def put(self, prop, val, op=None, throw=False): + if not isinstance(prop, basestring): + prop = prop.to_string().value + try: + if isinstance(op, bool): + raise ValueError("Op must be a string") + elif op is not None: + if op: # increment operation + val = getattr(self.get(prop), OP_METHODS[op])(val) + setattr(self.obj, prop, to_python(val)) + except AttributeError: + raise MakeError('TypeError', 'Read only object probably...') + return val + + def __call__(self, *args): + py_args = tuple(to_python(e) for e in args) + try: + py_res = self.obj.__call__(*py_args) + except Exception as e: + message = 'your Python function failed! ' + try: + message += e.message + except: + pass + raise MakeError('Error', message) + return py_wrap(py_res) + + def callprop(self, prop, *args): + py_args = tuple(to_python(e) for e in args) + if not isinstance(prop, basestring): + prop = prop.to_string().value + return self.get(prop)(*py_args) + + def delete(self, prop): + if not isinstance(prop, basestring): + prop = prop.to_string().value + try: + if prop.isdigit(): + del self.obj[int(prop)] + else: + delattr(self.obj, prop) + return true + except: + return false + + def __repr__(self): + return 'PyObjectWrapper(%s)' % str(self.obj) + + def to_python(self): + return self.obj + + def to_py(self): + return self.obj + + +def py_wrap(py): + if isinstance(py, (FunctionType, BuiltinFunctionType, MethodType, + BuiltinMethodType, dict, int, str, bool, float, list, + tuple, long, basestring)) or py is None: + return HJs(py) + return PyObjectWrapper(py) + + +############################################################################## +#Define types + + +#Object +class PyJsObject(PyJs): + Class = 'Object' + + def __init__(self, prop_descs={}, prototype=None, extensible=True): + self.prototype = prototype + self.extensible = extensible + self.own = {} + for prop, desc in six.iteritems(prop_descs): + self.define_own_property(prop, desc) + + def __repr__(self): + return repr(self.to_python().to_dict()) + + +ObjectPrototype = PyJsObject() + + +#Function +class PyJsFunction(PyJs): + Class = 'Function' + + def __init__(self, func, prototype=None, extensible=True, source=None): + cand = fix_js_args(func) + has_scope = cand is func + func = cand + self.argcount = six.get_function_code(func).co_argcount - 2 - has_scope + self.code = func + self.source = source if source else '{ [python code] }' + self.func_name = func.__name__ if not func.__name__.startswith( + 'PyJs_anonymous') else '' + self.extensible = extensible + self.prototype = prototype + self.own = {} + #set own property length to the number of arguments + self.define_own_property( + 'length', { + 'value': Js(self.argcount), + 'writable': False, + 'enumerable': False, + 'configurable': False + }) + + if self.func_name: + self.define_own_property( + 'name', { + 'value': Js(self.func_name), + 'writable': False, + 'enumerable': False, + 'configurable': True + }) + + # set own prototype + proto = Js({}) + # constructor points to this function + proto.define_own_property( + 'constructor', { + 'value': self, + 'writable': True, + 'enumerable': False, + 'configurable': True + }) + self.define_own_property( + 'prototype', { + 'value': proto, + 'writable': True, + 'enumerable': False, + 'configurable': False + }) + + def _set_name(self, name): + '''name is py type''' + if self.own.get('name'): + self.func_name = name + self.own['name']['value'] = Js(name) + + def construct(self, *args): + proto = self.get('prototype') + if not proto.is_object(): # set to standard prototype + proto = ObjectPrototype + obj = PyJsObject(prototype=proto) + cand = self.call(obj, *args) + return cand if cand.is_object() else obj + + def call(self, this, args=()): + '''Calls this function and returns a result + (converted to PyJs type so func can return python types) + + this must be a PyJs object and args must be a python tuple of PyJs objects. + + arguments object is passed automatically and will be equal to Js(args) + (tuple converted to arguments object).You dont need to worry about number + of arguments you provide if you supply less then missing ones will be set + to undefined (but not present in arguments object). + And if you supply too much then excess will not be passed + (but they will be present in arguments object). + ''' + if not hasattr(args, '__iter__'): #get rid of it later + args = (args, ) + args = tuple(Js(e) for e in args) # this wont be needed later + + arguments = PyJsArguments( + args, self) # tuple will be converted to arguments object. + arglen = self.argcount #function expects this number of args. + if len(args) > arglen: + args = args[0:arglen] + elif len(args) < arglen: + args += (undefined, ) * (arglen - len(args)) + args += this, arguments #append extra params to the arg list + try: + return Js(self.code(*args)) + except NotImplementedError: + raise + except RuntimeError as e: # maximum recursion + raise MakeError( + 'RangeError', e.message if + not isinstance(e, NotImplementedError) else 'Not implemented!') + + def has_instance(self, other): + # I am not sure here so instanceof may not work lol. + if not other.is_object(): + return false + proto = self.get('prototype') + if not proto.is_object(): + raise TypeError( + 'Function has non-object prototype in instanceof check') + while True: + other = other.prototype + if not other: # todo make sure that the condition is not None or null + return false + if other is proto: + return true + + def create(self, *args): + proto = self.get('prototype') + if not proto.is_object(): + proto = ObjectPrototype + new = PyJsObject(prototype=proto) + res = self.call(new, args) + if res.is_object(): + return res + return new + + +class PyJsBoundFunction(PyJsFunction): + def __init__(self, target, bound_this, bound_args): + self.target = target + self.bound_this = bound_this + self.bound_args = bound_args + self.argcount = target.argcount + self.code = target.code + self.source = target.source + self.func_name = target.func_name + self.extensible = True + self.prototype = FunctionPrototype + self.own = {} + # set own property length to the number of arguments + self.define_own_property( + 'length', { + 'value': target.get('length') - Js(len(self.bound_args)), + 'writable': False, + 'enumerable': False, + 'configurable': False + }) + + if self.func_name: + self.define_own_property( + 'name', { + 'value': Js(self.func_name), + 'writable': False, + 'enumerable': False, + 'configurable': True + }) + + # set own prototype + proto = Js({}) + # constructor points to this function + proto.define_own_property( + 'constructor', { + 'value': self, + 'writable': True, + 'enumerable': False, + 'configurable': True + }) + self.define_own_property( + 'prototype', { + 'value': proto, + 'writable': True, + 'enumerable': False, + 'configurable': False + }) + + def call(self, this, args=()): + return self.target.call(self.bound_this, self.bound_args + args) + + def has_instance(self, other): + return self.target.has_instance(other) + + +PyJs.PyJsBoundFunction = PyJsBoundFunction + +OP_METHODS = { + '*': '__mul__', + '/': '__div__', + '%': '__mod__', + '+': '__add__', + '-': '__sub__', + '<<': '__lshift__', + '>>': '__rshift__', + '&': '__and__', + '^': '__xor__', + '|': '__or__', + '>>>': 'pyjs_bshift' +} + + +def Empty(): + return Js(None) + + +#Number +class PyJsNumber(PyJs): #Note i dont implement +0 and -0. Just 0. + TYPE = 'Number' + Class = 'Number' + + +NumberPrototype = PyJsObject({}, ObjectPrototype) +NumberPrototype.Class = 'Number' +NumberPrototype.value = 0 + +Infinity = PyJsNumber(float('inf'), NumberPrototype) +NaN = PyJsNumber(float('nan'), NumberPrototype) +PyJs.NaN = NaN +PyJs.Infinity = Infinity + +# This dict aims to increase speed of string creation by storing character instances +CHAR_BANK = {} +NUM_BANK = {} +PyJs.CHAR_BANK = CHAR_BANK + + +#String +# Different than implementation design in order to improve performance +#for example I dont create separate property for each character in string, it would take ages. +class PyJsString(PyJs): + TYPE = 'String' + Class = 'String' + extensible = False + + def __init__(self, value=None, prototype=None): + '''Constructor for Number String and Boolean''' + if not isinstance(value, basestring): + raise TypeError # this will be internal error + self.value = value + self.prototype = prototype + self.own = {} + # this should be optimized because its mych slower than python str creation (about 50 times!) + # Dont create separate properties for every index. Just + self.own['length'] = { + 'value': Js(len(value)), + 'writable': False, + 'enumerable': False, + 'configurable': False + } + if len(value) == 1: + CHAR_BANK[value] = self #, 'writable': False, + # 'enumerable': True, 'configurable': False} + + def get(self, prop): + if not isinstance(prop, basestring): + prop = prop.to_string().value + try: + index = int(prop) + if index < 0: + return undefined + char = self.value[index] + if char not in CHAR_BANK: + Js(char) # this will add char to CHAR BANK + return CHAR_BANK[char] + except Exception: + pass + return PyJs.get(self, prop) + + def can_put(self, prop): + return False + + def __iter__(self): + for i in xrange(len(self.value)): + yield Js(i) # maybe create an int bank? + + +StringPrototype = PyJsObject({}, ObjectPrototype) +StringPrototype.Class = 'String' +StringPrototype.value = '' + +CHAR_BANK[''] = Js('') + + +#Boolean +class PyJsBoolean(PyJs): + TYPE = 'Boolean' + Class = 'Boolean' + + +BooleanPrototype = PyJsObject({}, ObjectPrototype) +BooleanPrototype.Class = 'Boolean' +BooleanPrototype.value = False + +true = PyJsBoolean(True, BooleanPrototype) +false = PyJsBoolean(False, BooleanPrototype) + + +#Undefined +class PyJsUndefined(PyJs): + TYPE = 'Undefined' + Class = 'Undefined' + + def __init__(self): + pass + + +undefined = PyJsUndefined() + + +#Null +class PyJsNull(PyJs): + TYPE = 'Null' + Class = 'Null' + + def __init__(self): + pass + + +null = PyJsNull() +PyJs.null = null + + +class PyJsArray(PyJs): + Class = 'Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsArrayBuffer(PyJs): + Class = 'ArrayBuffer' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsInt8Array(PyJs): + Class = 'Int8Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsUint8Array(PyJs): + Class = 'Uint8Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsUint8ClampedArray(PyJs): + Class = 'Uint8ClampedArray' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsInt16Array(PyJs): + Class = 'Int16Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsUint16Array(PyJs): + Class = 'Uint16Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsInt32Array(PyJs): + Class = 'Int32Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsUint32Array(PyJs): + Class = 'Uint32Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsFloat32Array(PyJs): + Class = 'Float32Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsFloat64Array(PyJs): + Class = 'Float64Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +ArrayPrototype = PyJsArray([], ObjectPrototype) + +ArrayBufferPrototype = PyJsArrayBuffer([], ObjectPrototype) + +Int8ArrayPrototype = PyJsInt8Array([], ObjectPrototype) + +Uint8ArrayPrototype = PyJsUint8Array([], ObjectPrototype) + +Uint8ClampedArrayPrototype = PyJsUint8ClampedArray([], ObjectPrototype) + +Int16ArrayPrototype = PyJsInt16Array([], ObjectPrototype) + +Uint16ArrayPrototype = PyJsUint16Array([], ObjectPrototype) + +Int32ArrayPrototype = PyJsInt32Array([], ObjectPrototype) + +Uint32ArrayPrototype = PyJsUint32Array([], ObjectPrototype) + +Float32ArrayPrototype = PyJsFloat32Array([], ObjectPrototype) + +Float64ArrayPrototype = PyJsFloat64Array([], ObjectPrototype) + + +class PyJsArguments(PyJs): + Class = 'Arguments' + + def __init__(self, args, callee): + self.own = {} + self.extensible = True + self.prototype = ObjectPrototype + self.define_own_property( + 'length', { + 'value': Js(len(args)), + 'writable': True, + 'enumerable': False, + 'configurable': True + }) + self.define_own_property( + 'callee', { + 'value': callee, + 'writable': True, + 'enumerable': False, + 'configurable': True + }) + for i, e in enumerate(args): + self.put(str(i), Js(e)) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + +#We can define function proto after number proto because func uses number in its init +FunctionPrototype = PyJsFunction(Empty, ObjectPrototype) +FunctionPrototype.own['name']['value'] = Js('') + +# I will not rewrite RegExp engine from scratch. I will use re because its much faster. +# I have to only make sure that I am handling all the differences correctly. +REGEXP_DB = {} + + +class PyJsRegExp(PyJs): + Class = 'RegExp' + extensible = True + + def __init__(self, regexp, prototype=None): + + self.prototype = prototype + self.glob = False + self.ignore_case = 0 + self.multiline = 0 + # self._cache = {'str':'NoStringEmpty23093', + # 'iterator': None, + # 'lastpos': -1, + # 'matches': {}} + flags = '' + if not regexp[-1] == '/': + #contains some flags (allowed are i, g, m + spl = regexp.rfind('/') + flags = set(regexp[spl + 1:]) + self.value = regexp[1:spl] + if 'g' in flags: + self.glob = True + if 'i' in flags: + self.ignore_case = re.IGNORECASE + if 'm' in flags: + self.multiline = re.MULTILINE + else: + self.value = regexp[1:-1] + + try: + if self.value in REGEXP_DB: + self.pat = REGEXP_DB[regexp] + else: + comp = 'None' + # we have to check whether pattern is valid. + # also this will speed up matching later + # todo critical fix patter conversion etc. ..!!!!! + # ugly hacks porting js reg exp to py reg exp works in 99% of cases ;) + possible_fixes = [(u'[]', u'[\0]'), (u'[^]', u'[^\0]'), + (u'nofix1791', u'nofix1791')] + reg = self.value + for fix, rep in possible_fixes: + comp = REGEXP_CONVERTER._interpret_regexp(reg, flags) + #print 'reg -> comp', reg, '->', comp + try: + self.pat = re.compile( + comp, self.ignore_case | self.multiline) + #print reg, '->', comp + break + except: + reg = reg.replace(fix, rep) + # print 'Fix', fix, '->', rep, '=', reg + else: + raise + REGEXP_DB[regexp] = self.pat + except: + #print 'Invalid pattern but fuck it', self.value, comp + raise MakeError( + 'SyntaxError', + 'Invalid RegExp pattern: %s -> %s' % (repr(self.value), + repr(comp))) + # now set own properties: + self.own = { + 'source': { + 'value': Js(self.value), + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'global': { + 'value': Js(self.glob), + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'ignoreCase': { + 'value': Js(bool(self.ignore_case)), + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'multiline': { + 'value': Js(bool(self.multiline)), + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'lastIndex': { + 'value': Js(0), + 'enumerable': False, + 'writable': True, + 'configurable': False + } + } + + def match(self, string, pos): + '''string is of course py string''' + return self.pat.match(string, pos) # way easier :) + # assert 0<=pos <= len(string) + # if not pos: + # return re.match(self.pat, string) + # else: + # if self._cache['str']==string: + # if pos>self._cache['lastpos']: + # for m in self._cache['iterator']: + # start = m.start() + # self._cache['lastpos'] = start + # self._cache['matches'][start] = m + # if start==pos: + # return m + # elif start>pos: + # return None + # self._cache['lastpos'] = len(string) + # return None + # else: + # return self._cache['matches'].get(pos) + # else: + # self._cache['str'] = string + # self._cache['matches'] = {} + # self._cache['lastpos'] = -1 + # self._cache['iterator'] = re.finditer(self.pat, string) + # return self.match(string, pos) + + +def JsRegExp(source): + # Takes regexp literal! + return PyJsRegExp(source, RegExpPrototype) + + +RegExpPrototype = PyJsRegExp('/(?:)/', ObjectPrototype) + +####Exceptions: +default_attrs = {'writable': True, 'enumerable': False, 'configurable': True} + + +def fill_in_props(obj, props, default_desc): + for prop, value in props.items(): + default_desc['value'] = Js(value) + obj.define_own_property(prop, default_desc) + + +class PyJsError(PyJs): + Class = 'Error' + extensible = True + + def __init__(self, message=None, prototype=None): + self.prototype = prototype + self.own = {} + if message is not None: + self.put('message', Js(message).to_string()) + self.own['message']['enumerable'] = False + + +ErrorPrototype = PyJsError(Js(''), ObjectPrototype) + + +@Js +def Error(message): + return PyJsError(None if message.is_undefined() else message, + ErrorPrototype) + + +Error.create = Error +err = {'name': 'Error', 'constructor': Error} +fill_in_props(ErrorPrototype, err, default_attrs) +Error.define_own_property( + 'prototype', { + 'value': ErrorPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + + +def define_error_type(name): + TypeErrorPrototype = PyJsError(None, ErrorPrototype) + + @Js + def TypeError(message): + return PyJsError(None if message.is_undefined() else message, + TypeErrorPrototype) + + err = {'name': name, 'constructor': TypeError} + fill_in_props(TypeErrorPrototype, err, default_attrs) + TypeError.define_own_property( + 'prototype', { + 'value': TypeErrorPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + ERRORS[name] = TypeError + + +ERRORS = {'Error': Error} +ERROR_NAMES = ['Eval', 'Type', 'Range', 'Reference', 'Syntax', 'URI'] + +for e in ERROR_NAMES: + define_error_type(e + 'Error') + +############################################################################## +# Import and fill prototypes here. + + +#this works only for data properties +def fill_prototype(prototype, Class, attrs, constructor=False): + for i in dir(Class): + e = getattr(Class, i) + if six.PY2: + if hasattr(e, '__func__'): + temp = PyJsFunction(e.__func__, FunctionPrototype) + attrs = dict((k, v) for k, v in attrs.iteritems()) + attrs['value'] = temp + prototype.define_own_property(i, attrs) + else: + if hasattr(e, '__call__') and not i.startswith('__'): + temp = PyJsFunction(e, FunctionPrototype) + attrs = dict((k, v) for k, v in attrs.items()) + attrs['value'] = temp + prototype.define_own_property(i, attrs) + if constructor: + attrs['value'] = constructor + prototype.define_own_property('constructor', attrs) + + +PyJs.undefined = undefined +PyJs.Js = staticmethod(Js) + +from .prototypes import jsfunction, jsobject, jsnumber, jsstring, jsboolean, jsarray, jsregexp, jserror, jsarraybuffer, jstypedarray + +#Object proto +fill_prototype(ObjectPrototype, jsobject.ObjectPrototype, default_attrs) + + +#Define __proto__ accessor (this cant be done by fill_prototype since) +@Js +def __proto__(): + return this.prototype if this.prototype is not None else null + + +getter = __proto__ + + +@Js +def __proto__(val): + if val.is_object(): + this.prototype = val + + +setter = __proto__ +ObjectPrototype.define_own_property('__proto__', { + 'set': setter, + 'get': getter, + 'enumerable': False, + 'configurable': True +}) + +#Function proto +fill_prototype(FunctionPrototype, jsfunction.FunctionPrototype, default_attrs) +#Number proto +fill_prototype(NumberPrototype, jsnumber.NumberPrototype, default_attrs) +#String proto +fill_prototype(StringPrototype, jsstring.StringPrototype, default_attrs) +#Boolean proto +fill_prototype(BooleanPrototype, jsboolean.BooleanPrototype, default_attrs) +#Array proto +fill_prototype(ArrayPrototype, jsarray.ArrayPrototype, default_attrs) +# ArrayBuffer proto +fill_prototype(ArrayBufferPrototype, jsarraybuffer.ArrayBufferPrototype, + default_attrs) +# Int8Array proto +fill_prototype(Int8ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Uint8Array proto +fill_prototype(Uint8ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Uint8ClampedArray proto +fill_prototype(Uint8ClampedArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Int16Array proto +fill_prototype(Int16ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Uint16Array proto +fill_prototype(Uint16ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Int32Array proto +fill_prototype(Int32ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Uint32Array proto +fill_prototype(Uint32ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Float32Array proto +fill_prototype(Float32ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Float64Array proto +fill_prototype(Float64ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +#Error proto +fill_prototype(ErrorPrototype, jserror.ErrorPrototype, default_attrs) +#RegExp proto +fill_prototype(RegExpPrototype, jsregexp.RegExpPrototype, default_attrs) +# add exec to regexpfunction (cant add it automatically because of its name :( +RegExpPrototype.own['exec'] = RegExpPrototype.own['exec2'] +del RegExpPrototype.own['exec2'] + +######################################################################### +# Constructors + + +# String +@Js +def String(st): + if not len(arguments): + return Js('') + return arguments[0].to_string() + + +@Js +def string_constructor(): + temp = PyJsObject(prototype=StringPrototype) + temp.Class = 'String' + #temp.TYPE = 'String' + if not len(arguments): + temp.value = '' + else: + temp.value = arguments[0].to_string().value + for i, ch in enumerate(temp.value): # this will make things long... + temp.own[str(i)] = { + 'value': Js(ch), + 'writable': False, + 'enumerable': True, + 'configurable': True + } + temp.own['length'] = { + 'value': Js(len(temp.value)), + 'writable': False, + 'enumerable': False, + 'configurable': False + } + return temp + + +String.create = string_constructor + +# RegExp +REG_EXP_FLAGS = ('g', 'i', 'm') + + +@Js +def RegExp(pattern, flags): + if pattern.Class == 'RegExp': + if not flags.is_undefined(): + raise MakeError( + 'TypeError', + 'Cannot supply flags when constructing one RegExp from another' + ) + # return unchanged + return pattern + #pattern is not a regexp + if pattern.is_undefined(): + pattern = '' + else: + pattern = pattern.to_string().value + # try: + # pattern = REGEXP_CONVERTER._unescape_string(pattern.to_string().value) + # except: + # raise MakeError('SyntaxError', 'Invalid regexp') + flags = flags.to_string().value if not flags.is_undefined() else '' + for flag in flags: + if flag not in REG_EXP_FLAGS: + raise MakeError( + 'SyntaxError', + 'Invalid flags supplied to RegExp constructor "%s"' % flag) + if len(set(flags)) != len(flags): + raise MakeError( + 'SyntaxError', + 'Invalid flags supplied to RegExp constructor "%s"' % flags) + pattern = '/%s/' % (pattern if pattern else '(?:)') + flags + return JsRegExp(pattern) + + +RegExp.create = RegExp +PyJs.RegExp = RegExp + +# Number + + +@Js +def Number(): + if len(arguments): + return arguments[0].to_number() + else: + return Js(0) + + +@Js +def number_constructor(): + temp = PyJsObject(prototype=NumberPrototype) + temp.Class = 'Number' + #temp.TYPE = 'Number' + if len(arguments): + temp.value = arguments[0].to_number().value + else: + temp.value = 0 + return temp + + +Number.create = number_constructor + +# Boolean + + +@Js +def Boolean(value): + return value.to_boolean() + + +@Js +def boolean_constructor(value): + temp = PyJsObject(prototype=BooleanPrototype) + temp.Class = 'Boolean' + #temp.TYPE = 'Boolean' + temp.value = value.to_boolean().value + return temp + + +Boolean.create = boolean_constructor + +############################################################################## + + +def appengine(code): + try: + return translator.translate_js(code.decode('utf-8')) + except: + return traceback.format_exc() + + +builtins = ('true', 'false', 'null', 'undefined', 'Infinity', 'NaN') + +scope = dict(zip(builtins, [eval(e) for e in builtins])) + +JS_BUILTINS = dict((k, v) for k, v in scope.items()) + +# Fill in NUM_BANK +for e in xrange(-2**10, 2**14): + NUM_BANK[e] = Js(e) + +if __name__ == '__main__': + print(ObjectPrototype.get('toString').callprop('call')) + print(FunctionPrototype.own) + a = null - Js(49404) + x = a.put('ser', Js('der')) + print(Js(0) or Js('p') and Js(4.0000000000050000001)) + FunctionPrototype.put('Chuj', Js(409)) + for e in FunctionPrototype: + print('Obk', e.get('__proto__').get('__proto__').get('__proto__'), e) + import code + s = Js(4) + b = Js(6) + + s2 = Js(4) + o = ObjectPrototype + o.put('x', Js(100)) + var = Scope(scope) + e = code.InteractiveConsole(globals()) + #e.raw_input = interactor + e.interact() diff --git a/Contents/Libraries/Shared/js2py/constructors/__init__.py b/Contents/Libraries/Shared/js2py/constructors/__init__.py new file mode 100644 index 000000000..4bf956237 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/__init__.py @@ -0,0 +1 @@ +__author__ = 'Piotr Dabkowski' \ No newline at end of file diff --git a/Contents/Libraries/Shared/js2py/constructors/jsarray.py b/Contents/Libraries/Shared/js2py/constructors/jsarray.py new file mode 100644 index 000000000..1550589d7 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsarray.py @@ -0,0 +1,48 @@ +from ..base import * + + +@Js +def Array(): + if len(arguments) == 0 or len(arguments) > 1: + return arguments.to_list() + a = arguments[0] + if isinstance(a, PyJsNumber): + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js([]) + temp.put('length', a) + return temp + return [a] + + +Array.create = Array +Array.own['length']['value'] = Js(1) + + +@Js +def isArray(arg): + return arg.Class == 'Array' + + +Array.define_own_property('isArray', { + 'value': isArray, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + +Array.define_own_property( + 'prototype', { + 'value': ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +ArrayPrototype.define_own_property('constructor', { + 'value': Array, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsarraybuffer.py b/Contents/Libraries/Shared/js2py/constructors/jsarraybuffer.py new file mode 100644 index 000000000..6da71aab3 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsarraybuffer.py @@ -0,0 +1,41 @@ +# this is based on jsarray.py + +# todo check everything :) + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def ArrayBuffer(): + a = arguments[0] + if isinstance(a, PyJsNumber): + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(bytearray([0] * length)) + return temp + return Js(bytearray([0])) + + +ArrayBuffer.create = ArrayBuffer +ArrayBuffer.own['length']['value'] = Js(None) + +ArrayBuffer.define_own_property( + 'prototype', { + 'value': ArrayBufferPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +ArrayBufferPrototype.define_own_property( + 'constructor', { + 'value': ArrayBuffer, + 'enumerable': False, + 'writable': False, + 'configurable': True + }) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsboolean.py b/Contents/Libraries/Shared/js2py/constructors/jsboolean.py new file mode 100644 index 000000000..743b110d6 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsboolean.py @@ -0,0 +1,16 @@ +from ..base import * + +BooleanPrototype.define_own_property('constructor', { + 'value': Boolean, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + +Boolean.define_own_property( + 'prototype', { + 'value': BooleanPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsdate.py b/Contents/Libraries/Shared/js2py/constructors/jsdate.py new file mode 100644 index 000000000..98de64319 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsdate.py @@ -0,0 +1,405 @@ +from ..base import * +from .time_helpers import * + +TZ_OFFSET = (time.altzone // 3600) +ABS_OFFSET = abs(TZ_OFFSET) +TZ_NAME = time.tzname[1] +ISO_FORMAT = '%s-%s-%sT%s:%s:%s.%sZ' + + +@Js +def Date(year, month, date, hours, minutes, seconds, ms): + return now().to_string() + + +Date.Class = 'Date' + + +def now(): + return PyJsDate(int(time.time() * 1000), prototype=DatePrototype) + + +@Js +def UTC(year, month, date, hours, minutes, seconds, ms): # todo complete this + args = arguments + y = args[0].to_number() + m = args[1].to_number() + l = len(args) + dt = args[2].to_number() if l > 2 else Js(1) + h = args[3].to_number() if l > 3 else Js(0) + mi = args[4].to_number() if l > 4 else Js(0) + sec = args[5].to_number() if l > 5 else Js(0) + mili = args[6].to_number() if l > 6 else Js(0) + if not y.is_nan() and 0 <= y.value <= 99: + y = y + Js(1900) + t = TimeClip(MakeDate(MakeDay(y, m, dt), MakeTime(h, mi, sec, mili))) + return PyJsDate(t, prototype=DatePrototype) + + +@Js +def parse(string): + return PyJsDate( + TimeClip(parse_date(string.to_string().value)), + prototype=DatePrototype) + + +Date.define_own_property('now', { + 'value': Js(now), + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + +Date.define_own_property('parse', { + 'value': parse, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + +Date.define_own_property('UTC', { + 'value': UTC, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + + +class PyJsDate(PyJs): + Class = 'Date' + extensible = True + + def __init__(self, value, prototype=None): + self.value = value + self.own = {} + self.prototype = prototype + + # todo fix this problematic datetime part + def to_local_dt(self): + return datetime.datetime.utcfromtimestamp( + UTCToLocal(self.value) // 1000) + + def to_utc_dt(self): + return datetime.datetime.utcfromtimestamp(self.value // 1000) + + def local_strftime(self, pattern): + if self.value is NaN: + return 'Invalid Date' + try: + dt = self.to_local_dt() + except: + raise MakeError( + 'TypeError', + 'unsupported date range. Will fix in future versions') + try: + return dt.strftime(pattern) + except: + raise MakeError( + 'TypeError', + 'Could not generate date string from this date (limitations of python.datetime)' + ) + + def utc_strftime(self, pattern): + if self.value is NaN: + return 'Invalid Date' + try: + dt = self.to_utc_dt() + except: + raise MakeError( + 'TypeError', + 'unsupported date range. Will fix in future versions') + try: + return dt.strftime(pattern) + except: + raise MakeError( + 'TypeError', + 'Could not generate date string from this date (limitations of python.datetime)' + ) + + +def parse_date(py_string): # todo support all date string formats + try: + try: + dt = datetime.datetime.strptime(py_string, "%Y-%m-%dT%H:%M:%S.%fZ") + except: + dt = datetime.datetime.strptime(py_string, "%Y-%m-%dT%H:%M:%SZ") + return MakeDate( + MakeDay(Js(dt.year), Js(dt.month - 1), Js(dt.day)), + MakeTime( + Js(dt.hour), Js(dt.minute), Js(dt.second), + Js(dt.microsecond // 1000))) + except: + raise MakeError( + 'TypeError', + 'Could not parse date %s - unsupported date format. Currently only supported format is RFC3339 utc. Sorry!' + % py_string) + + +def date_constructor(*args): + if len(args) >= 2: + return date_constructor2(*args) + elif len(args) == 1: + return date_constructor1(args[0]) + else: + return date_constructor0() + + +def date_constructor0(): + return now() + + +def date_constructor1(value): + v = value.to_primitive() + if v._type() == 'String': + v = parse_date(v.value) + else: + v = v.to_int() + return PyJsDate(TimeClip(v), prototype=DatePrototype) + + +def date_constructor2(*args): + y = args[0].to_number() + m = args[1].to_number() + l = len(args) + dt = args[2].to_number() if l > 2 else Js(1) + h = args[3].to_number() if l > 3 else Js(0) + mi = args[4].to_number() if l > 4 else Js(0) + sec = args[5].to_number() if l > 5 else Js(0) + mili = args[6].to_number() if l > 6 else Js(0) + if not y.is_nan() and 0 <= y.value <= 99: + y = y + Js(1900) + t = TimeClip( + LocalToUTC(MakeDate(MakeDay(y, m, dt), MakeTime(h, mi, sec, mili)))) + return PyJsDate(t, prototype=DatePrototype) + + +Date.create = date_constructor + +DatePrototype = PyJsDate(float('nan'), prototype=ObjectPrototype) + + +def check_date(obj): + if obj.Class != 'Date': + raise MakeError('TypeError', 'this is not a Date object') + + +class DateProto: + def toString(): + check_date(this) + if this.value is NaN: + return 'Invalid Date' + offset = (UTCToLocal(this.value) - this.value) // msPerHour + return this.local_strftime( + '%a %b %d %Y %H:%M:%S GMT') + '%s00 (%s)' % (pad( + offset, 2, True), GetTimeZoneName(this.value)) + + def toDateString(): + check_date(this) + return this.local_strftime('%d %B %Y') + + def toTimeString(): + check_date(this) + return this.local_strftime('%H:%M:%S') + + def toLocaleString(): + check_date(this) + return this.local_strftime('%d %B %Y %H:%M:%S') + + def toLocaleDateString(): + check_date(this) + return this.local_strftime('%d %B %Y') + + def toLocaleTimeString(): + check_date(this) + return this.local_strftime('%H:%M:%S') + + def valueOf(): + check_date(this) + return this.value + + def getTime(): + check_date(this) + return this.value + + def getFullYear(): + check_date(this) + if this.value is NaN: + return NaN + return YearFromTime(UTCToLocal(this.value)) + + def getUTCFullYear(): + check_date(this) + if this.value is NaN: + return NaN + return YearFromTime(this.value) + + def getMonth(): + check_date(this) + if this.value is NaN: + return NaN + return MonthFromTime(UTCToLocal(this.value)) + + def getDate(): + check_date(this) + if this.value is NaN: + return NaN + return DateFromTime(UTCToLocal(this.value)) + + def getUTCMonth(): + check_date(this) + if this.value is NaN: + return NaN + return MonthFromTime(this.value) + + def getUTCDate(): + check_date(this) + if this.value is NaN: + return NaN + return DateFromTime(this.value) + + def getDay(): + check_date(this) + if this.value is NaN: + return NaN + return WeekDay(UTCToLocal(this.value)) + + def getUTCDay(): + check_date(this) + if this.value is NaN: + return NaN + return WeekDay(this.value) + + def getHours(): + check_date(this) + if this.value is NaN: + return NaN + return HourFromTime(UTCToLocal(this.value)) + + def getUTCHours(): + check_date(this) + if this.value is NaN: + return NaN + return HourFromTime(this.value) + + def getMinutes(): + check_date(this) + if this.value is NaN: + return NaN + return MinFromTime(UTCToLocal(this.value)) + + def getUTCMinutes(): + check_date(this) + if this.value is NaN: + return NaN + return MinFromTime(this.value) + + def getSeconds(): + check_date(this) + if this.value is NaN: + return NaN + return SecFromTime(UTCToLocal(this.value)) + + def getUTCSeconds(): + check_date(this) + if this.value is NaN: + return NaN + return SecFromTime(this.value) + + def getMilliseconds(): + check_date(this) + if this.value is NaN: + return NaN + return msFromTime(UTCToLocal(this.value)) + + def getUTCMilliseconds(): + check_date(this) + if this.value is NaN: + return NaN + return msFromTime(this.value) + + def getTimezoneOffset(): + check_date(this) + if this.value is NaN: + return NaN + return (this.value - UTCToLocal(this.value)) // 60000 + + def setTime(time): + check_date(this) + this.value = TimeClip(time.to_number().to_int()) + return this.value + + def setMilliseconds(ms): + check_date(this) + t = UTCToLocal(this.value) + tim = MakeTime( + HourFromTime(t), MinFromTime(t), SecFromTime(t), ms.to_int()) + u = TimeClip(LocalToUTC(MakeDate(Day(t), tim))) + this.value = u + return u + + def setUTCMilliseconds(ms): + check_date(this) + t = this.value + tim = MakeTime( + HourFromTime(t), MinFromTime(t), SecFromTime(t), ms.to_int()) + u = TimeClip(MakeDate(Day(t), tim)) + this.value = u + return u + + # todo Complete all setters! + + def toUTCString(): + check_date(this) + return this.utc_strftime('%d %B %Y %H:%M:%S') + + def toISOString(): + check_date(this) + t = this.value + year = YearFromTime(t) + month, day, hour, minute, second, milli = pad( + MonthFromTime(t) + 1), pad(DateFromTime(t)), pad( + HourFromTime(t)), pad(MinFromTime(t)), pad( + SecFromTime(t)), pad(msFromTime(t)) + return ISO_FORMAT % (unicode(year) if 0 <= year <= 9999 else pad( + year, 6, True), month, day, hour, minute, second, milli) + + def toJSON(key): + o = this.to_object() + tv = o.to_primitive('Number') + if tv.Class == 'Number' and not tv.is_finite(): + return this.null + toISO = o.get('toISOString') + if not toISO.is_callable(): + raise this.MakeError('TypeError', 'toISOString is not callable') + return toISO.call(o, ()) + + +def pad(num, n=2, sign=False): + '''returns n digit string representation of the num''' + s = unicode(abs(num)) + if len(s) < n: + s = '0' * (n - len(s)) + s + if not sign: + return s + if num >= 0: + return '+' + s + else: + return '-' + s + + +fill_prototype(DatePrototype, DateProto, default_attrs) + +Date.define_own_property( + 'prototype', { + 'value': DatePrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +DatePrototype.define_own_property('constructor', { + 'value': Date, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsfloat32array.py b/Contents/Libraries/Shared/js2py/constructors/jsfloat32array.py new file mode 100644 index 000000000..3a1219167 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsfloat32array.py @@ -0,0 +1,87 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Float32Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.float32)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.float32)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.float32)) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(a.obj) % 4 != 0: + raise MakeError( + 'RangeError', + 'Byte length of Float32Array should be a multiple of 4') + if len(arguments) > 1: + offset = int(arguments[1].value) + if offset % 4 != 0: + raise MakeError( + 'RangeError', + 'Start offset of Float32Array should be a multiple of 4') + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int((len(a.obj) - offset) / 4) + array = numpy.frombuffer( + a.obj, dtype=numpy.float32, count=length, offset=offset) + temp = Js(array) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.float32)) + temp.put('length', Js(0)) + return temp + + +Float32Array.create = Float32Array +Float32Array.own['length']['value'] = Js(3) + +Float32Array.define_own_property( + 'prototype', { + 'value': Float32ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Float32ArrayPrototype.define_own_property( + 'constructor', { + 'value': Float32Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Float32ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(4), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsfloat64array.py b/Contents/Libraries/Shared/js2py/constructors/jsfloat64array.py new file mode 100644 index 000000000..9ea5f052a --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsfloat64array.py @@ -0,0 +1,87 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Float64Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.float64)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.float64)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.float64)) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(a.obj) % 8 != 0: + raise MakeError( + 'RangeError', + 'Byte length of Float64Array should be a multiple of 8') + if len(arguments) > 1: + offset = int(arguments[1].value) + if offset % 8 != 0: + raise MakeError( + 'RangeError', + 'Start offset of Float64Array should be a multiple of 8') + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int((len(a.obj) - offset) / 8) + array = numpy.frombuffer( + a.obj, dtype=numpy.float64, count=length, offset=offset) + temp = Js(array) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.float64)) + temp.put('length', Js(0)) + return temp + + +Float64Array.create = Float64Array +Float64Array.own['length']['value'] = Js(3) + +Float64Array.define_own_property( + 'prototype', { + 'value': Float64ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Float64ArrayPrototype.define_own_property( + 'constructor', { + 'value': Float64Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Float64ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(8), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsfunction.py b/Contents/Libraries/Shared/js2py/constructors/jsfunction.py new file mode 100644 index 000000000..c4ace2c39 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsfunction.py @@ -0,0 +1,52 @@ +from ..base import * +try: + from ..translators.translator import translate_js +except: + pass + + +@Js +def Function(): + # convert arguments to python list of strings + a = [e.to_string().value for e in arguments.to_list()] + body = ';' + args = () + if len(a): + body = '%s;' % a[-1] + args = a[:-1] + # translate this function to js inline function + js_func = '(function (%s) {%s})' % (','.join(args), body) + # now translate js inline to python function + py_func = translate_js(js_func, '') + # add set func scope to global scope + # a but messy solution but works :) + globals()['var'] = PyJs.GlobalObject + # define py function and return it + temp = executor(py_func, globals()) + temp.source = '{%s}' % body + temp.func_name = 'anonymous' + return temp + + +def executor(f, glob): + exec (f, globals()) + return globals()['PyJs_anonymous_0_'] + + +#new statement simply calls Function +Function.create = Function + +#set constructor property inside FunctionPrototype + +fill_in_props(FunctionPrototype, {'constructor': Function}, default_attrs) + +#attach prototype to Function constructor +Function.define_own_property( + 'prototype', { + 'value': FunctionPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) +#Fix Function length (its 0 and should be 1) +Function.own['length']['value'] = Js(1) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsint16array.py b/Contents/Libraries/Shared/js2py/constructors/jsint16array.py new file mode 100644 index 000000000..c2864105d --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsint16array.py @@ -0,0 +1,87 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Int16Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.int16)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.int16)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.int16)) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(a.obj) % 2 != 0: + raise MakeError( + 'RangeError', + 'Byte length of Int16Array should be a multiple of 2') + if len(arguments) > 1: + offset = int(arguments[1].value) + if offset % 2 != 0: + raise MakeError( + 'RangeError', + 'Start offset of Int16Array should be a multiple of 2') + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int((len(a.obj) - offset) / 2) + array = numpy.frombuffer( + a.obj, dtype=numpy.int16, count=length, offset=offset) + temp = Js(array) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.int16)) + temp.put('length', Js(0)) + return temp + + +Int16Array.create = Int16Array +Int16Array.own['length']['value'] = Js(3) + +Int16Array.define_own_property( + 'prototype', { + 'value': Int16ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Int16ArrayPrototype.define_own_property( + 'constructor', { + 'value': Int16Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Int16ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(2), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsint32array.py b/Contents/Libraries/Shared/js2py/constructors/jsint32array.py new file mode 100644 index 000000000..2e8c4e846 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsint32array.py @@ -0,0 +1,87 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Int32Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.int32)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.int32)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.int32)) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(a.obj) % 4 != 0: + raise MakeError( + 'RangeError', + 'Byte length of Int32Array should be a multiple of 4') + if len(arguments) > 1: + offset = int(arguments[1].value) + if offset % 4 != 0: + raise MakeError( + 'RangeError', + 'Start offset of Int32Array should be a multiple of 4') + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int((len(a.obj) - offset) / 4) + array = numpy.frombuffer( + a.obj, dtype=numpy.int32, count=length, offset=offset) + temp = Js(array) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.int32)) + temp.put('length', Js(0)) + return temp + + +Int32Array.create = Int32Array +Int32Array.own['length']['value'] = Js(3) + +Int32Array.define_own_property( + 'prototype', { + 'value': Int32ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Int32ArrayPrototype.define_own_property( + 'constructor', { + 'value': Int32Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Int32ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(4), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsint8array.py b/Contents/Libraries/Shared/js2py/constructors/jsint8array.py new file mode 100644 index 000000000..3396afea0 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsint8array.py @@ -0,0 +1,79 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Int8Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.int8)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.int8)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.int8)) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(arguments) > 1: + offset = int(arguments[1].value) + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int(len(a.obj) - offset) + array = numpy.frombuffer( + a.obj, dtype=numpy.int8, count=length, offset=offset) + temp = Js(array) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.int8)) + temp.put('length', Js(0)) + return temp + + +Int8Array.create = Int8Array +Int8Array.own['length']['value'] = Js(3) + +Int8Array.define_own_property( + 'prototype', { + 'value': Int8ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Int8ArrayPrototype.define_own_property( + 'constructor', { + 'value': Int8Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Int8ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(1), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsmath.py b/Contents/Libraries/Shared/js2py/constructors/jsmath.py new file mode 100644 index 000000000..06751a3b2 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsmath.py @@ -0,0 +1,157 @@ +from ..base import * +import math +import random + +Math = PyJsObject(prototype=ObjectPrototype) +Math.Class = 'Math' + +CONSTANTS = { + 'E': 2.7182818284590452354, + 'LN10': 2.302585092994046, + 'LN2': 0.6931471805599453, + 'LOG2E': 1.4426950408889634, + 'LOG10E': 0.4342944819032518, + 'PI': 3.1415926535897932, + 'SQRT1_2': 0.7071067811865476, + 'SQRT2': 1.4142135623730951 +} + +for constant, value in CONSTANTS.items(): + Math.define_own_property( + constant, { + 'value': Js(value), + 'writable': False, + 'enumerable': False, + 'configurable': False + }) + + +class MathFunctions: + def abs(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return abs(a) + + def acos(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + try: + return math.acos(a) + except: + return NaN + + def asin(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + try: + return math.asin(a) + except: + return NaN + + def atan(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return math.atan(a) + + def atan2(y, x): + a = x.to_number().value + b = y.to_number().value + if a != a or b != b: # it must be a nan + return NaN + return math.atan2(b, a) + + def ceil(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return math.ceil(a) + + def floor(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return math.floor(a) + + def round(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return round(a) + + def sin(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return math.sin(a) + + def cos(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return math.cos(a) + + def tan(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return math.tan(a) + + def log(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + try: + return math.log(a) + except: + return NaN + + def exp(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return math.exp(a) + + def pow(x, y): + a = x.to_number().value + b = y.to_number().value + if a != a or b != b: # it must be a nan + return NaN + try: + return a**b + except: + return NaN + + def sqrt(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + try: + return a**0.5 + except: + return NaN + + def min(): + if not len(arguments): + return Infinity + lis = tuple(e.to_number().value for e in arguments.to_list()) + if any(e != e for e in lis): # we dont want NaNs + return NaN + return min(*lis) + + def max(): + if not len(arguments): + return -Infinity + lis = tuple(e.to_number().value for e in arguments.to_list()) + if any(e != e for e in lis): # we dont want NaNs + return NaN + return max(*lis) + + def random(): + return random.random() + + +fill_prototype(Math, MathFunctions, default_attrs) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsnumber.py b/Contents/Libraries/Shared/js2py/constructors/jsnumber.py new file mode 100644 index 000000000..9ba7c7c79 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsnumber.py @@ -0,0 +1,23 @@ +from ..base import * + +CONSTS = { + 'prototype': NumberPrototype, + 'MAX_VALUE': 1.7976931348623157e308, + 'MIN_VALUE': 5.0e-324, + 'NaN': NaN, + 'NEGATIVE_INFINITY': float('-inf'), + 'POSITIVE_INFINITY': float('inf') +} + +fill_in_props(Number, CONSTS, { + 'enumerable': False, + 'writable': False, + 'configurable': False +}) + +NumberPrototype.define_own_property('constructor', { + 'value': Number, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsobject.py b/Contents/Libraries/Shared/js2py/constructors/jsobject.py new file mode 100644 index 000000000..c4e0ada39 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsobject.py @@ -0,0 +1,198 @@ +from ..base import * +import six + +#todo Double check everything is OK + + +@Js +def Object(): + val = arguments.get('0') + if val.is_null() or val.is_undefined(): + return PyJsObject(prototype=ObjectPrototype) + return val.to_object() + + +@Js +def object_constructor(): + if len(arguments): + val = arguments.get('0') + if val.TYPE == 'Object': + #Implementation dependent, but my will simply return :) + return val + elif val.TYPE in ('Number', 'String', 'Boolean'): + return val.to_object() + return PyJsObject(prototype=ObjectPrototype) + + +Object.create = object_constructor +Object.own['length']['value'] = Js(1) + + +class ObjectMethods: + def getPrototypeOf(obj): + if not obj.is_object(): + raise MakeError('TypeError', + 'Object.getPrototypeOf called on non-object') + return null if obj.prototype is None else obj.prototype + + def getOwnPropertyDescriptor(obj, prop): + if not obj.is_object(): + raise MakeError( + 'TypeError', + 'Object.getOwnPropertyDescriptor called on non-object') + return obj.own.get( + prop.to_string(). + value) # will return undefined if we dont have this prop + + def getOwnPropertyNames(obj): + if not obj.is_object(): + raise MakeError( + 'TypeError', + 'Object.getOwnPropertyDescriptor called on non-object') + return obj.own.keys() + + def create(obj): + if not (obj.is_object() or obj.is_null()): + raise MakeError('TypeError', + 'Object prototype may only be an Object or null') + temp = PyJsObject(prototype=(None if obj.is_null() else obj)) + if len(arguments) > 1 and not arguments[1].is_undefined(): + if six.PY2: + ObjectMethods.defineProperties.__func__(temp, arguments[1]) + else: + ObjectMethods.defineProperties(temp, arguments[1]) + return temp + + def defineProperty(obj, prop, attrs): + if not obj.is_object(): + raise MakeError('TypeError', + 'Object.defineProperty called on non-object') + name = prop.to_string().value + if not obj.define_own_property(name, ToPropertyDescriptor(attrs)): + raise MakeError('TypeError', 'Cannot redefine property: %s' % name) + return obj + + def defineProperties(obj, properties): + if not obj.is_object(): + raise MakeError('TypeError', + 'Object.defineProperties called on non-object') + props = properties.to_object() + for name in props: + desc = ToPropertyDescriptor(props.get(name.value)) + if not obj.define_own_property(name.value, desc): + raise MakeError( + 'TypeError', + 'Failed to define own property: %s' % name.value) + return obj + + def seal(obj): + if not obj.is_object(): + raise MakeError('TypeError', 'Object.seal called on non-object') + for desc in obj.own.values(): + desc['configurable'] = False + obj.extensible = False + return obj + + def freeze(obj): + if not obj.is_object(): + raise MakeError('TypeError', 'Object.freeze called on non-object') + for desc in obj.own.values(): + desc['configurable'] = False + if is_data_descriptor(desc): + desc['writable'] = False + obj.extensible = False + return obj + + def preventExtensions(obj): + if not obj.is_object(): + raise MakeError('TypeError', + 'Object.preventExtensions on non-object') + obj.extensible = False + return obj + + def isSealed(obj): + if not obj.is_object(): + raise MakeError('TypeError', + 'Object.isSealed called on non-object') + if obj.extensible: + return False + for desc in obj.own.values(): + if desc['configurable']: + return False + return True + + def isFrozen(obj): + if not obj.is_object(): + raise MakeError('TypeError', + 'Object.isFrozen called on non-object') + if obj.extensible: + return False + for desc in obj.own.values(): + if desc['configurable']: + return False + if is_data_descriptor(desc) and desc['writable']: + return False + return True + + def isExtensible(obj): + if not obj.is_object(): + raise MakeError('TypeError', + 'Object.isExtensible called on non-object') + return obj.extensible + + def keys(obj): + if not obj.is_object(): + raise MakeError('TypeError', 'Object.keys called on non-object') + return [e for e, d in six.iteritems(obj.own) if d.get('enumerable')] + + +# add methods attached to Object constructor +fill_prototype(Object, ObjectMethods, default_attrs) +# add constructor to prototype +fill_in_props(ObjectPrototype, {'constructor': Object}, default_attrs) +# add prototype property to the constructor. +Object.define_own_property( + 'prototype', { + 'value': ObjectPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +# some utility functions: + + +def ToPropertyDescriptor(obj): # page 38 (50 absolute) + if obj.TYPE != 'Object': + raise MakeError('TypeError', + 'Can\'t convert non-object to property descriptor') + desc = {} + if obj.has_property('enumerable'): + desc['enumerable'] = obj.get('enumerable').to_boolean().value + if obj.has_property('configurable'): + desc['configurable'] = obj.get('configurable').to_boolean().value + if obj.has_property('value'): + desc['value'] = obj.get('value') + if obj.has_property('writable'): + desc['writable'] = obj.get('writable').to_boolean().value + if obj.has_property('get'): + cand = obj.get('get') + if not (cand.is_undefined() or cand.is_callable()): + raise MakeError( + 'TypeError', + 'Invalid getter (it has to be a function or undefined)') + desc['get'] = cand + if obj.has_property('set'): + cand = obj.get('set') + if not (cand.is_undefined() or cand.is_callable()): + raise MakeError( + 'TypeError', + 'Invalid setter (it has to be a function or undefined)') + desc['set'] = cand + if ('get' in desc or 'set' in desc) and ('value' in desc + or 'writable' in desc): + raise MakeError( + 'TypeError', + 'Invalid property. A property cannot both have accessors and be writable or have a value.' + ) + return desc diff --git a/Contents/Libraries/Shared/js2py/constructors/jsregexp.py b/Contents/Libraries/Shared/js2py/constructors/jsregexp.py new file mode 100644 index 000000000..2dfc25cb9 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsregexp.py @@ -0,0 +1,16 @@ +from ..base import * + +RegExpPrototype.define_own_property('constructor', { + 'value': RegExp, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + +RegExp.define_own_property( + 'prototype', { + 'value': RegExpPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsstring.py b/Contents/Libraries/Shared/js2py/constructors/jsstring.py new file mode 100644 index 000000000..0650d0f59 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsstring.py @@ -0,0 +1,40 @@ +from ..base import * +# python 3 support +import six +if six.PY3: + unichr = chr + + +@Js +def fromCharCode(): + args = arguments.to_list() + res = u'' + for e in args: + res += unichr(e.to_uint16()) + return this.Js(res) + + +fromCharCode.own['length']['value'] = Js(1) + +String.define_own_property( + 'fromCharCode', { + 'value': fromCharCode, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +String.define_own_property( + 'prototype', { + 'value': StringPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +StringPrototype.define_own_property('constructor', { + 'value': String, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsuint16array.py b/Contents/Libraries/Shared/js2py/constructors/jsuint16array.py new file mode 100644 index 000000000..a61be246d --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsuint16array.py @@ -0,0 +1,87 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Uint16Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.uint16)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.uint16)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.uint16)) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(a.obj) % 2 != 0: + raise MakeError( + 'RangeError', + 'Byte length of Uint16Array should be a multiple of 2') + if len(arguments) > 1: + offset = int(arguments[1].value) + if offset % 2 != 0: + raise MakeError( + 'RangeError', + 'Start offset of Uint16Array should be a multiple of 2') + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int((len(a.obj) - offset) / 2) + array = numpy.frombuffer( + a.obj, dtype=numpy.uint16, count=length, offset=offset) + temp = Js(array) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.uint16)) + temp.put('length', Js(0)) + return temp + + +Uint16Array.create = Uint16Array +Uint16Array.own['length']['value'] = Js(3) + +Uint16Array.define_own_property( + 'prototype', { + 'value': Uint16ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Uint16ArrayPrototype.define_own_property( + 'constructor', { + 'value': Uint16Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Uint16ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(2), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsuint32array.py b/Contents/Libraries/Shared/js2py/constructors/jsuint32array.py new file mode 100644 index 000000000..c6f57c94d --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsuint32array.py @@ -0,0 +1,95 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Uint32Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.uint32)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.uint32)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + if len(arguments) > 1: + offset = int(arguments[1].value) + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = len(array) - offset + temp = Js( + numpy.array(array[offset:offset + length], dtype=numpy.uint32)) + temp.put('length', Js(length)) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(a.obj) % 4 != 0: + raise MakeError( + 'RangeError', + 'Byte length of Uint32Array should be a multiple of 4') + if len(arguments) > 1: + offset = int(arguments[1].value) + if offset % 4 != 0: + raise MakeError( + 'RangeError', + 'Start offset of Uint32Array should be a multiple of 4') + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int((len(a.obj) - offset) / 4) + temp = Js( + numpy.frombuffer( + a.obj, dtype=numpy.uint32, count=length, offset=offset)) + temp.put('length', Js(length)) + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.uint32)) + temp.put('length', Js(0)) + return temp + + +Uint32Array.create = Uint32Array +Uint32Array.own['length']['value'] = Js(3) + +Uint32Array.define_own_property( + 'prototype', { + 'value': Uint32ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Uint32ArrayPrototype.define_own_property( + 'constructor', { + 'value': Uint32Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Uint32ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(4), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsuint8array.py b/Contents/Libraries/Shared/js2py/constructors/jsuint8array.py new file mode 100644 index 000000000..4b2199da2 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsuint8array.py @@ -0,0 +1,79 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Uint8Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.uint8)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.uint8)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.uint8)) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(arguments) > 1: + offset = int(arguments[1].value) + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int(len(a.obj) - offset) + array = numpy.frombuffer( + a.obj, dtype=numpy.uint8, count=length, offset=offset) + temp = Js(array) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.uint8)) + temp.put('length', Js(0)) + return temp + + +Uint8Array.create = Uint8Array +Uint8Array.own['length']['value'] = Js(3) + +Uint8Array.define_own_property( + 'prototype', { + 'value': Uint8ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Uint8ArrayPrototype.define_own_property( + 'constructor', { + 'value': Uint8Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Uint8ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(1), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsuint8clampedarray.py b/Contents/Libraries/Shared/js2py/constructors/jsuint8clampedarray.py new file mode 100644 index 000000000..7b5e350b2 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsuint8clampedarray.py @@ -0,0 +1,79 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Uint8ClampedArray(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.uint8), Clamped=True) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.uint8), Clamped=True) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.uint8), Clamped=True) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(arguments) > 1: + offset = int(arguments[1].value) + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int(len(a.obj) - offset) + array = numpy.frombuffer( + a.obj, dtype=numpy.uint8, count=length, offset=offset) + temp = Js(array, Clamped=True) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.uint8), Clamped=True) + temp.put('length', Js(0)) + return temp + + +Uint8ClampedArray.create = Uint8ClampedArray +Uint8ClampedArray.own['length']['value'] = Js(3) + +Uint8ClampedArray.define_own_property( + 'prototype', { + 'value': Uint8ClampedArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Uint8ClampedArrayPrototype.define_own_property( + 'constructor', { + 'value': Uint8ClampedArray, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Uint8ClampedArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(1), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/time_helpers.py b/Contents/Libraries/Shared/js2py/constructors/time_helpers.py new file mode 100644 index 000000000..a744d8cac --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/time_helpers.py @@ -0,0 +1,207 @@ +# NOTE: t must be INT!!! +import time +import datetime +import warnings + +try: + from tzlocal import get_localzone + LOCAL_ZONE = get_localzone() +except: # except all problems... + warnings.warn( + 'Please install or fix tzlocal library (pip install tzlocal) in order to make Date object work better. Otherwise I will assume DST is in effect all the time' + ) + + class LOCAL_ZONE: + @staticmethod + def dst(*args): + return 1 + + +from js2py.base import MakeError +CUM = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365) +msPerDay = 86400000 +msPerYear = int(86400000 * 365.242) +msPerSecond = 1000 +msPerMinute = 60000 +msPerHour = 3600000 +HoursPerDay = 24 +MinutesPerHour = 60 +SecondsPerMinute = 60 +NaN = float('nan') +LocalTZA = -time.timezone * msPerSecond + + +def DaylightSavingTA(t): + if t is NaN: + return t + try: + return int( + LOCAL_ZONE.dst(datetime.datetime.utcfromtimestamp( + t // 1000)).seconds) * 1000 + except: + warnings.warn( + 'Invalid datetime date, assumed DST time, may be inaccurate...', + Warning) + return 1 + #raise MakeError('TypeError', 'date not supported by python.datetime. I will solve it in future versions') + + +def GetTimeZoneName(t): + return time.tzname[DaylightSavingTA(t) > 0] + + +def LocalToUTC(t): + return t - LocalTZA - DaylightSavingTA(t - LocalTZA) + + +def UTCToLocal(t): + return t + LocalTZA + DaylightSavingTA(t) + + +def Day(t): + return t // 86400000 + + +def TimeWithinDay(t): + return t % 86400000 + + +def DaysInYear(y): + if y % 4: + return 365 + elif y % 100: + return 366 + elif y % 400: + return 365 + else: + return 366 + + +def DayFromYear(y): + return 365 * (y - 1970) + (y - 1969) // 4 - (y - 1901) // 100 + ( + y - 1601) // 400 + + +def TimeFromYear(y): + return 86400000 * DayFromYear(y) + + +def YearFromTime(t): + guess = 1970 - t // 31556908800 # msPerYear + gt = TimeFromYear(guess) + if gt <= t: + while gt <= t: + guess += 1 + gt = TimeFromYear(guess) + return guess - 1 + else: + while gt > t: + guess -= 1 + gt = TimeFromYear(guess) + return guess + + +def DayWithinYear(t): + return Day(t) - DayFromYear(YearFromTime(t)) + + +def InLeapYear(t): + y = YearFromTime(t) + if y % 4: + return 0 + elif y % 100: + return 1 + elif y % 400: + return 0 + else: + return 1 + + +def MonthFromTime(t): + day = DayWithinYear(t) + leap = InLeapYear(t) + if day < 31: + return 0 + day -= leap + if day < 59: + return 1 + elif day < 90: + return 2 + elif day < 120: + return 3 + elif day < 151: + return 4 + elif day < 181: + return 5 + elif day < 212: + return 6 + elif day < 243: + return 7 + elif day < 273: + return 8 + elif day < 304: + return 9 + elif day < 334: + return 10 + else: + return 11 + + +def DateFromTime(t): + mon = MonthFromTime(t) + day = DayWithinYear(t) + return day - CUM[mon] - (1 if InLeapYear(t) and mon >= 2 else 0) + 1 + + +def WeekDay(t): + # 0 == sunday + return (Day(t) + 4) % 7 + + +def msFromTime(t): + return t % 1000 + + +def SecFromTime(t): + return (t // 1000) % 60 + + +def MinFromTime(t): + return (t // 60000) % 60 + + +def HourFromTime(t): + return (t // 3600000) % 24 + + +def MakeTime(hour, Min, sec, ms): + # takes PyJs objects and returns t + if not (hour.is_finite() and Min.is_finite() and sec.is_finite() + and ms.is_finite()): + return NaN + h, m, s, milli = hour.to_int(), Min.to_int(), sec.to_int(), ms.to_int() + return h * 3600000 + m * 60000 + s * 1000 + milli + + +def MakeDay(year, month, date): + # takes PyJs objects and returns t + if not (year.is_finite() and month.is_finite() and date.is_finite()): + return NaN + y, m, dt = year.to_int(), month.to_int(), date.to_int() + y += m // 12 + mn = m % 12 + d = DayFromYear(y) + CUM[mn] + dt - 1 + (1 if DaysInYear(y) == 366 + and mn >= 2 else 0) + return d # ms per day + + +def MakeDate(day, time): + return 86400000 * day + time + + +def TimeClip(t): + if t != t or abs(t) == float('inf'): + return NaN + if abs(t) > 8.64 * 10**15: + return NaN + return int(t) diff --git a/Contents/Libraries/Shared/js2py/es6/__init__.py b/Contents/Libraries/Shared/js2py/es6/__init__.py new file mode 100644 index 000000000..4a58d3f0b --- /dev/null +++ b/Contents/Libraries/Shared/js2py/es6/__init__.py @@ -0,0 +1,41 @@ +INITIALISED = False +babel = None +babelPresetEs2015 = None + + +def js6_to_js5(code): + global INITIALISED, babel, babelPresetEs2015 + if not INITIALISED: + import signal, warnings, time + warnings.warn( + '\nImporting babel.py for the first time - this can take some time. \nPlease note that currently Javascript 6 in Js2Py is unstable and slow. Use only for tiny scripts!' + ) + + from .babel import babel as _babel + babel = _babel.Object.babel + babelPresetEs2015 = _babel.Object.babelPresetEs2015 + + # very weird hack. Somehow this helps babel to initialise properly! + try: + babel.transform('warmup', {'presets': {}}) + signal.alarm(2) + + def kill_it(a, b): + raise KeyboardInterrupt('Better work next time!') + + signal.signal(signal.SIGALRM, kill_it) + babel.transform('stuckInALoop', { + 'presets': babelPresetEs2015 + }).code + for n in range(3): + time.sleep(1) + except: + print("Initialised babel!") + INITIALISED = True + return babel.transform(code, {'presets': babelPresetEs2015}).code + + +if __name__ == '__main__': + print(js6_to_js5('obj={}; obj.x = function() {return () => this}')) + print() + print(js6_to_js5('const a = 1;')) diff --git a/Contents/Libraries/Shared/js2py/es6/babel.js b/Contents/Libraries/Shared/js2py/es6/babel.js new file mode 100644 index 000000000..e088e470c --- /dev/null +++ b/Contents/Libraries/Shared/js2py/es6/babel.js @@ -0,0 +1,6 @@ +// run buildBabel in this folder to convert this code to python! +var babel = require("babel-core"); +var babelPresetEs2015 = require("babel-preset-es2015"); + +Object.babelPresetEs2015 = babelPresetEs2015; +Object.babel = babel; diff --git a/Contents/Libraries/Shared/js2py/es6/babel.py b/Contents/Libraries/Shared/js2py/es6/babel.py new file mode 100644 index 000000000..24623e64c --- /dev/null +++ b/Contents/Libraries/Shared/js2py/es6/babel.py @@ -0,0 +1,52077 @@ +__all__ = ['babel'] + +# Don't look below, you will not understand this Python code :) I don't. + +from js2py.pyjs import * +# setting scope +var = Scope( JS_BUILTINS ) +set_global_object(var) + +# Code follows: +var.registers([]) +@Js +def PyJs_anonymous_1_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'babel', u'require', u'babelPresetEs2015', u'exports', u'module']) + Js(u'use strict') + var.put(u'babel', var.get(u'require')(Js(u'babel-core'))) + var.put(u'babelPresetEs2015', var.get(u'require')(Js(u'babel-preset-es2015'))) + var.get(u'Object').put(u'babelPresetEs2015', var.get(u'babelPresetEs2015')) + var.get(u'Object').put(u'babel', var.get(u'babel')) +PyJs_anonymous_1_._set_name(u'anonymous') +PyJs_Object_2_ = Js({u'babel-core':Js(5.0),u'babel-preset-es2015':Js(95.0)}) +@Js +def PyJs_anonymous_3_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + @Js + def PyJs_anonymous_4_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return JsRegExp(u'/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g') + PyJs_anonymous_4_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_4_) +PyJs_anonymous_3_._set_name(u'anonymous') +PyJs_Object_5_ = Js({}) +@Js +def PyJs_anonymous_6_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'assembleStyles', u'require', u'exports', u'module']) + @Js + def PyJsHoisted_assembleStyles_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'styles']) + PyJs_Object_8_ = Js({u'reset':Js([Js(0.0), Js(0.0)]),u'bold':Js([Js(1.0), Js(22.0)]),u'dim':Js([Js(2.0), Js(22.0)]),u'italic':Js([Js(3.0), Js(23.0)]),u'underline':Js([Js(4.0), Js(24.0)]),u'inverse':Js([Js(7.0), Js(27.0)]),u'hidden':Js([Js(8.0), Js(28.0)]),u'strikethrough':Js([Js(9.0), Js(29.0)])}) + PyJs_Object_9_ = Js({u'black':Js([Js(30.0), Js(39.0)]),u'red':Js([Js(31.0), Js(39.0)]),u'green':Js([Js(32.0), Js(39.0)]),u'yellow':Js([Js(33.0), Js(39.0)]),u'blue':Js([Js(34.0), Js(39.0)]),u'magenta':Js([Js(35.0), Js(39.0)]),u'cyan':Js([Js(36.0), Js(39.0)]),u'white':Js([Js(37.0), Js(39.0)]),u'gray':Js([Js(90.0), Js(39.0)])}) + PyJs_Object_10_ = Js({u'bgBlack':Js([Js(40.0), Js(49.0)]),u'bgRed':Js([Js(41.0), Js(49.0)]),u'bgGreen':Js([Js(42.0), Js(49.0)]),u'bgYellow':Js([Js(43.0), Js(49.0)]),u'bgBlue':Js([Js(44.0), Js(49.0)]),u'bgMagenta':Js([Js(45.0), Js(49.0)]),u'bgCyan':Js([Js(46.0), Js(49.0)]),u'bgWhite':Js([Js(47.0), Js(49.0)])}) + PyJs_Object_7_ = Js({u'modifiers':PyJs_Object_8_,u'colors':PyJs_Object_9_,u'bgColors':PyJs_Object_10_}) + var.put(u'styles', PyJs_Object_7_) + var.get(u'styles').get(u'colors').put(u'grey', var.get(u'styles').get(u'colors').get(u'gray')) + @Js + def PyJs_anonymous_11_(groupName, this, arguments, var=var): + var = Scope({u'this':this, u'groupName':groupName, u'arguments':arguments}, var) + var.registers([u'groupName', u'group']) + var.put(u'group', var.get(u'styles').get(var.get(u'groupName'))) + @Js + def PyJs_anonymous_12_(styleName, this, arguments, var=var): + var = Scope({u'this':this, u'styleName':styleName, u'arguments':arguments}, var) + var.registers([u'style', u'styleName']) + var.put(u'style', var.get(u'group').get(var.get(u'styleName'))) + PyJs_Object_13_ = Js({u'open':((Js(u'\x1b[')+var.get(u'style').get(u'0'))+Js(u'm')),u'close':((Js(u'\x1b[')+var.get(u'style').get(u'1'))+Js(u'm'))}) + var.get(u'styles').put(var.get(u'styleName'), var.get(u'group').put(var.get(u'styleName'), PyJs_Object_13_)) + PyJs_anonymous_12_._set_name(u'anonymous') + var.get(u'Object').callprop(u'keys', var.get(u'group')).callprop(u'forEach', PyJs_anonymous_12_) + PyJs_Object_14_ = Js({u'value':var.get(u'group'),u'enumerable':Js(False)}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'styles'), var.get(u'groupName'), PyJs_Object_14_) + PyJs_anonymous_11_._set_name(u'anonymous') + var.get(u'Object').callprop(u'keys', var.get(u'styles')).callprop(u'forEach', PyJs_anonymous_11_) + return var.get(u'styles') + PyJsHoisted_assembleStyles_.func_name = u'assembleStyles' + var.put(u'assembleStyles', PyJsHoisted_assembleStyles_) + Js(u'use strict') + pass + PyJs_Object_15_ = Js({u'enumerable':var.get(u'true'),u'get':var.get(u'assembleStyles')}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'module'), Js(u'exports'), PyJs_Object_15_) +PyJs_anonymous_6_._set_name(u'anonymous') +PyJs_Object_16_ = Js({}) +@Js +def PyJs_anonymous_17_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'defs', u'_esutils2', u'exports', u'_jsTokens2', u'_esutils', u'require', u'NEWLINE', u'module', u'BRACKET', u'JSX_TAG', u'_chalk', u'getTokenType', u'_interopRequireDefault', u'highlight', u'_jsTokens', u'_chalk2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_22_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_22_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_highlight_(text, this, arguments, var=var): + var = Scope({u'this':this, u'text':text, u'arguments':arguments}, var) + var.registers([u'text']) + @Js + def PyJs_anonymous_24_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_len', u'_key', u'args', u'type', u'colorize']) + #for JS loop + var.put(u'_len', var.get(u'arguments').get(u'length')) + var.put(u'args', var.get(u'Array')(var.get(u'_len'))) + var.put(u'_key', Js(0.0)) + while (var.get(u'_key')<var.get(u'_len')): + try: + var.get(u'args').put(var.get(u'_key'), var.get(u'arguments').get(var.get(u'_key'))) + finally: + (var.put(u'_key',Js(var.get(u'_key').to_number())+Js(1))-Js(1)) + var.put(u'type', var.get(u'getTokenType')(var.get(u'args'))) + var.put(u'colorize', var.get(u'defs').get(var.get(u'type'))) + if var.get(u'colorize'): + @Js + def PyJs_anonymous_25_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return var.get(u'colorize')(var.get(u'str')) + PyJs_anonymous_25_._set_name(u'anonymous') + return var.get(u'args').get(u'0').callprop(u'split', var.get(u'NEWLINE')).callprop(u'map', PyJs_anonymous_25_).callprop(u'join', Js(u'\n')) + else: + return var.get(u'args').get(u'0') + PyJs_anonymous_24_._set_name(u'anonymous') + return var.get(u'text').callprop(u'replace', var.get(u'_jsTokens2').get(u'default'), PyJs_anonymous_24_) + PyJsHoisted_highlight_.func_name = u'highlight' + var.put(u'highlight', PyJsHoisted_highlight_) + @Js + def PyJsHoisted_getTokenType_(match, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'match':match}, var) + var.registers([u'_match$slice', u'text', u'token', u'match', u'offset']) + var.put(u'_match$slice', var.get(u'match').callprop(u'slice', (-Js(2.0)))) + var.put(u'offset', var.get(u'_match$slice').get(u'0')) + var.put(u'text', var.get(u'_match$slice').get(u'1')) + var.put(u'token', var.get(u'_jsTokens2').get(u'default').callprop(u'matchToToken', var.get(u'match'))) + if PyJsStrictEq(var.get(u'token').get(u'type'),Js(u'name')): + if var.get(u'_esutils2').get(u'default').get(u'keyword').callprop(u'isReservedWordES6', var.get(u'token').get(u'value')): + return Js(u'keyword') + if (var.get(u'JSX_TAG').callprop(u'test', var.get(u'token').get(u'value')) and (PyJsStrictEq(var.get(u'text').get((var.get(u'offset')-Js(1.0))),Js(u'<')) or (var.get(u'text').callprop(u'substr', (var.get(u'offset')-Js(2.0)), Js(2.0))==Js(u'</')))): + return Js(u'jsx_tag') + if PyJsStrictNeq(var.get(u'token').get(u'value').get(u'0'),var.get(u'token').get(u'value').get(u'0').callprop(u'toLowerCase')): + return Js(u'capitalized') + if (PyJsStrictEq(var.get(u'token').get(u'type'),Js(u'punctuator')) and var.get(u'BRACKET').callprop(u'test', var.get(u'token').get(u'value'))): + return Js(u'bracket') + return var.get(u'token').get(u'type') + PyJsHoisted_getTokenType_.func_name = u'getTokenType' + var.put(u'getTokenType', PyJsHoisted_getTokenType_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_18_(rawLines, lineNumber, colNumber, this, arguments, var=var): + var = Scope({u'this':this, u'lineNumber':lineNumber, u'colNumber':colNumber, u'arguments':arguments, u'rawLines':rawLines}, var) + var.registers([u'end', u'rawLines', u'linesBelow', u'lines', u'highlighted', u'start', u'colNumber', u'frame', u'lineNumber', u'maybeHighlight', u'numberMaxWidth', u'linesAbove', u'opts']) + PyJs_Object_19_ = Js({}) + var.put(u'opts', (PyJs_Object_19_ if ((var.get(u'arguments').get(u'length')<=Js(3.0)) or PyJsStrictEq(var.get(u'arguments').get(u'3'),var.get(u'undefined'))) else var.get(u'arguments').get(u'3'))) + var.put(u'colNumber', var.get(u'Math').callprop(u'max', var.get(u'colNumber'), Js(0.0))) + var.put(u'highlighted', (var.get(u'opts').get(u'highlightCode') and var.get(u'_chalk2').get(u'default').get(u'supportsColor'))) + @Js + def PyJs_maybeHighlight_20_(chalkFn, string, this, arguments, var=var): + var = Scope({u'this':this, u'chalkFn':chalkFn, u'maybeHighlight':PyJs_maybeHighlight_20_, u'string':string, u'arguments':arguments}, var) + var.registers([u'chalkFn', u'string']) + return (var.get(u'chalkFn')(var.get(u'string')) if var.get(u'highlighted') else var.get(u'string')) + PyJs_maybeHighlight_20_._set_name(u'maybeHighlight') + var.put(u'maybeHighlight', PyJs_maybeHighlight_20_) + if var.get(u'highlighted'): + var.put(u'rawLines', var.get(u'highlight')(var.get(u'rawLines'))) + var.put(u'linesAbove', (var.get(u'opts').get(u'linesAbove') or Js(2.0))) + var.put(u'linesBelow', (var.get(u'opts').get(u'linesBelow') or Js(3.0))) + var.put(u'lines', var.get(u'rawLines').callprop(u'split', var.get(u'NEWLINE'))) + var.put(u'start', var.get(u'Math').callprop(u'max', (var.get(u'lineNumber')-(var.get(u'linesAbove')+Js(1.0))), Js(0.0))) + var.put(u'end', var.get(u'Math').callprop(u'min', var.get(u'lines').get(u'length'), (var.get(u'lineNumber')+var.get(u'linesBelow')))) + if (var.get(u'lineNumber').neg() and var.get(u'colNumber').neg()): + var.put(u'start', Js(0.0)) + var.put(u'end', var.get(u'lines').get(u'length')) + var.put(u'numberMaxWidth', var.get(u'String')(var.get(u'end')).get(u'length')) + @Js + def PyJs_anonymous_21_(line, index, this, arguments, var=var): + var = Scope({u'this':this, u'index':index, u'line':line, u'arguments':arguments}, var) + var.registers([u'markerSpacing', u'index', u'markerLine', u'gutter', u'number', u'paddedNumber', u'line']) + var.put(u'number', ((var.get(u'start')+Js(1.0))+var.get(u'index'))) + var.put(u'paddedNumber', (Js(u' ')+var.get(u'number')).callprop(u'slice', (-var.get(u'numberMaxWidth')))) + var.put(u'gutter', ((Js(u' ')+var.get(u'paddedNumber'))+Js(u' | '))) + if PyJsStrictEq(var.get(u'number'),var.get(u'lineNumber')): + var.put(u'markerLine', Js(u'')) + if var.get(u'colNumber'): + var.put(u'markerSpacing', var.get(u'line').callprop(u'slice', Js(0.0), (var.get(u'colNumber')-Js(1.0))).callprop(u'replace', JsRegExp(u'/[^\\t]/g'), Js(u' '))) + var.put(u'markerLine', Js([Js(u'\n '), var.get(u'maybeHighlight')(var.get(u'defs').get(u'gutter'), var.get(u'gutter').callprop(u'replace', JsRegExp(u'/\\d/g'), Js(u' '))), var.get(u'markerSpacing'), var.get(u'maybeHighlight')(var.get(u'defs').get(u'marker'), Js(u'^'))]).callprop(u'join', Js(u''))) + return Js([var.get(u'maybeHighlight')(var.get(u'defs').get(u'marker'), Js(u'>')), var.get(u'maybeHighlight')(var.get(u'defs').get(u'gutter'), var.get(u'gutter')), var.get(u'line'), var.get(u'markerLine')]).callprop(u'join', Js(u'')) + else: + return ((Js(u' ')+var.get(u'maybeHighlight')(var.get(u'defs').get(u'gutter'), var.get(u'gutter')))+var.get(u'line')) + PyJs_anonymous_21_._set_name(u'anonymous') + var.put(u'frame', var.get(u'lines').callprop(u'slice', var.get(u'start'), var.get(u'end')).callprop(u'map', PyJs_anonymous_21_).callprop(u'join', Js(u'\n'))) + if var.get(u'highlighted'): + return var.get(u'_chalk2').get(u'default').callprop(u'reset', var.get(u'frame')) + else: + return var.get(u'frame') + PyJs_anonymous_18_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_18_) + var.put(u'_jsTokens', var.get(u'require')(Js(u'js-tokens'))) + var.put(u'_jsTokens2', var.get(u'_interopRequireDefault')(var.get(u'_jsTokens'))) + var.put(u'_esutils', var.get(u'require')(Js(u'esutils'))) + var.put(u'_esutils2', var.get(u'_interopRequireDefault')(var.get(u'_esutils'))) + var.put(u'_chalk', var.get(u'require')(Js(u'chalk'))) + var.put(u'_chalk2', var.get(u'_interopRequireDefault')(var.get(u'_chalk'))) + pass + PyJs_Object_23_ = Js({u'keyword':var.get(u'_chalk2').get(u'default').get(u'cyan'),u'capitalized':var.get(u'_chalk2').get(u'default').get(u'yellow'),u'jsx_tag':var.get(u'_chalk2').get(u'default').get(u'yellow'),u'punctuator':var.get(u'_chalk2').get(u'default').get(u'yellow'),u'number':var.get(u'_chalk2').get(u'default').get(u'magenta'),u'string':var.get(u'_chalk2').get(u'default').get(u'green'),u'regex':var.get(u'_chalk2').get(u'default').get(u'magenta'),u'comment':var.get(u'_chalk2').get(u'default').get(u'grey'),u'invalid':var.get(u'_chalk2').get(u'default').get(u'white').get(u'bgRed').get(u'bold'),u'gutter':var.get(u'_chalk2').get(u'default').get(u'grey'),u'marker':var.get(u'_chalk2').get(u'default').get(u'red').get(u'bold')}) + var.put(u'defs', PyJs_Object_23_) + var.put(u'NEWLINE', JsRegExp(u'/\\r\\n|[\\n\\r\\u2028\\u2029]/')) + var.put(u'JSX_TAG', JsRegExp(u'/^[a-z][\\w-]*$/i')) + var.put(u'BRACKET', JsRegExp(u'/^[()\\[\\]{}]$/')) + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_17_._set_name(u'anonymous') +PyJs_Object_26_ = Js({u'chalk':Js(265.0),u'esutils':Js(276.0),u'js-tokens':Js(282.0)}) +@Js +def PyJs_anonymous_27_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./lib/api/node.js'))) +PyJs_anonymous_27_._set_name(u'anonymous') +PyJs_Object_28_ = Js({u'./lib/api/node.js':Js(6.0)}) +@Js +def PyJs_anonymous_29_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_isFunction', u'_fs', u'_pipeline2', u'_file', u'_babelTemplate', u'_buildExternalHelpers', u'transformFile', u'_interopRequireDefault', u'_babelTraverse', u'_pipeline', u'transform', u'_fs2', u'_babelMessages', u'exports', u'_babelTraverse2', u'_interopRequireWildcard', u'Plugin', u'_babelTypes', u'analyse', u'pipeline', u'_util', u'util', u'module', u'_optionManager2', u'_isFunction2', u'_config', u'transformFileSync', u'messages', u'_optionManager', u'transformFromAst', u't', u'_package', u'require']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_42_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_42_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_transformFileSync_(filename, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'filename':filename}, var) + var.registers([u'opts', u'filename']) + PyJs_Object_45_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_45_)) + var.get(u'opts').put(u'filename', var.get(u'filename')) + return var.get(u'transform')(var.get(u'_fs2').get(u'default').callprop(u'readFileSync', var.get(u'filename'), Js(u'utf8')), var.get(u'opts')) + PyJsHoisted_transformFileSync_.func_name = u'transformFileSync' + var.put(u'transformFileSync', PyJsHoisted_transformFileSync_) + @Js + def PyJsHoisted_transformFile_(filename, opts, callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'arguments':arguments, u'opts':opts, u'filename':filename}, var) + var.registers([u'callback', u'opts', u'filename']) + if PyJsComma(Js(0.0),var.get(u'_isFunction2').get(u'default'))(var.get(u'opts')): + var.put(u'callback', var.get(u'opts')) + PyJs_Object_43_ = Js({}) + var.put(u'opts', PyJs_Object_43_) + var.get(u'opts').put(u'filename', var.get(u'filename')) + @Js + def PyJs_anonymous_44_(err, code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'err':err}, var) + var.registers([u'code', u'result', u'err']) + var.put(u'result', PyJsComma(Js(0.0), Js(None))) + if var.get(u'err').neg(): + try: + var.put(u'result', var.get(u'transform')(var.get(u'code'), var.get(u'opts'))) + except PyJsException as PyJsTempException: + PyJsHolder_5f657272_67108312 = var.own.get(u'_err') + var.force_own_put(u'_err', PyExceptionToJs(PyJsTempException)) + try: + var.put(u'err', var.get(u'_err')) + finally: + if PyJsHolder_5f657272_67108312 is not None: + var.own[u'_err'] = PyJsHolder_5f657272_67108312 + else: + del var.own[u'_err'] + del PyJsHolder_5f657272_67108312 + if var.get(u'err'): + var.get(u'callback')(var.get(u'err')) + else: + var.get(u'callback')(var.get(u"null"), var.get(u'result')) + PyJs_anonymous_44_._set_name(u'anonymous') + var.get(u'_fs2').get(u'default').callprop(u'readFile', var.get(u'filename'), PyJs_anonymous_44_) + PyJsHoisted_transformFile_.func_name = u'transformFile' + var.put(u'transformFile', PyJsHoisted_transformFile_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_41_ = Js({}) + var.put(u'newObj', PyJs_Object_41_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_Plugin_(alias, this, arguments, var=var): + var = Scope({u'this':this, u'alias':alias, u'arguments':arguments}, var) + var.registers([u'alias']) + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'The (')+var.get(u'alias'))+Js(u') Babel 5 plugin is being run with Babel 6.')))) + raise PyJsTempException + PyJsHoisted_Plugin_.func_name = u'Plugin' + var.put(u'Plugin', PyJsHoisted_Plugin_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + def PyJs_LONG_30_(var=var): + return var.get(u'exports').put(u'OptionManager', var.get(u'exports').put(u'traverse', var.get(u'exports').put(u'types', var.get(u'exports').put(u'messages', var.get(u'exports').put(u'util', var.get(u'exports').put(u'version', var.get(u'exports').put(u'template', var.get(u'exports').put(u'buildExternalHelpers', var.get(u'exports').put(u'options', var.get(u'exports').put(u'File', var.get(u'undefined'))))))))))) + var.get(u'exports').put(u'transformFromAst', var.get(u'exports').put(u'transform', var.get(u'exports').put(u'analyse', var.get(u'exports').put(u'Pipeline', PyJs_LONG_30_())))) + var.put(u'_file', var.get(u'require')(Js(u'../transformation/file'))) + @Js + def PyJs_get_32_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_32_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_file')).get(u'default') + PyJs_get_32_._set_name(u'get') + PyJs_Object_31_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_32_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'File'), PyJs_Object_31_) + var.put(u'_config', var.get(u'require')(Js(u'../transformation/file/options/config'))) + @Js + def PyJs_get_34_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_34_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_config')).get(u'default') + PyJs_get_34_._set_name(u'get') + PyJs_Object_33_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_34_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'options'), PyJs_Object_33_) + var.put(u'_buildExternalHelpers', var.get(u'require')(Js(u'../tools/build-external-helpers'))) + @Js + def PyJs_get_36_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_36_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_buildExternalHelpers')).get(u'default') + PyJs_get_36_._set_name(u'get') + PyJs_Object_35_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_36_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'buildExternalHelpers'), PyJs_Object_35_) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + @Js + def PyJs_get_38_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_38_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate')).get(u'default') + PyJs_get_38_._set_name(u'get') + PyJs_Object_37_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_38_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'template'), PyJs_Object_37_) + var.put(u'_package', var.get(u'require')(Js(u'../../package'))) + @Js + def PyJs_get_40_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_40_}, var) + var.registers([]) + return var.get(u'_package').get(u'version') + PyJs_get_40_._set_name(u'get') + PyJs_Object_39_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_40_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'version'), PyJs_Object_39_) + var.get(u'exports').put(u'Plugin', var.get(u'Plugin')) + var.get(u'exports').put(u'transformFile', var.get(u'transformFile')) + var.get(u'exports').put(u'transformFileSync', var.get(u'transformFileSync')) + var.put(u'_isFunction', var.get(u'require')(Js(u'lodash/isFunction'))) + var.put(u'_isFunction2', var.get(u'_interopRequireDefault')(var.get(u'_isFunction'))) + var.put(u'_fs', var.get(u'require')(Js(u'fs'))) + var.put(u'_fs2', var.get(u'_interopRequireDefault')(var.get(u'_fs'))) + var.put(u'_util', var.get(u'require')(Js(u'../util'))) + var.put(u'util', var.get(u'_interopRequireWildcard')(var.get(u'_util'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_babelTraverse', var.get(u'require')(Js(u'babel-traverse'))) + var.put(u'_babelTraverse2', var.get(u'_interopRequireDefault')(var.get(u'_babelTraverse'))) + var.put(u'_optionManager', var.get(u'require')(Js(u'../transformation/file/options/option-manager'))) + var.put(u'_optionManager2', var.get(u'_interopRequireDefault')(var.get(u'_optionManager'))) + var.put(u'_pipeline', var.get(u'require')(Js(u'../transformation/pipeline'))) + var.put(u'_pipeline2', var.get(u'_interopRequireDefault')(var.get(u'_pipeline'))) + pass + pass + var.get(u'exports').put(u'util', var.get(u'util')) + var.get(u'exports').put(u'messages', var.get(u'messages')) + var.get(u'exports').put(u'types', var.get(u't')) + var.get(u'exports').put(u'traverse', var.get(u'_babelTraverse2').get(u'default')) + var.get(u'exports').put(u'OptionManager', var.get(u'_optionManager2').get(u'default')) + pass + var.get(u'exports').put(u'Pipeline', var.get(u'_pipeline2').get(u'default')) + var.put(u'pipeline', var.get(u'_pipeline2').get(u'default').create()) + var.put(u'analyse', var.get(u'exports').put(u'analyse', var.get(u'pipeline').get(u'analyse').callprop(u'bind', var.get(u'pipeline')))) + var.put(u'transform', var.get(u'exports').put(u'transform', var.get(u'pipeline').get(u'transform').callprop(u'bind', var.get(u'pipeline')))) + var.put(u'transformFromAst', var.get(u'exports').put(u'transformFromAst', var.get(u'pipeline').get(u'transformFromAst').callprop(u'bind', var.get(u'pipeline')))) + pass + pass +PyJs_anonymous_29_._set_name(u'anonymous') +PyJs_Object_46_ = Js({u'../../package':Js(28.0),u'../tools/build-external-helpers':Js(11.0),u'../transformation/file':Js(12.0),u'../transformation/file/options/config':Js(16.0),u'../transformation/file/options/option-manager':Js(18.0),u'../transformation/pipeline':Js(23.0),u'../util':Js(26.0),u'babel-messages':Js(57.0),u'babel-template':Js(221.0),u'babel-traverse':Js(225.0),u'babel-types':Js(258.0),u'fs':Js(523.0),u'lodash/isFunction':Js(463.0)}) +@Js +def PyJs_anonymous_47_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_mergeWith', u'require', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_mergeWith2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_50_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_50_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_48_(dest, src, this, arguments, var=var): + var = Scope({u'dest':dest, u'src':src, u'this':this, u'arguments':arguments}, var) + var.registers([u'dest', u'src']) + if (var.get(u'dest').neg() or var.get(u'src').neg()): + return var.get('undefined') + @Js + def PyJs_anonymous_49_(a, b, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'_isArray', u'b', u'_iterator', u'item', u'newArray', u'_i', u'_ref']) + if (var.get(u'b') and var.get(u'Array').callprop(u'isArray', var.get(u'a'))): + var.put(u'newArray', var.get(u'b').callprop(u'slice', Js(0.0))) + #for JS loop + var.put(u'_iterator', var.get(u'a')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'item', var.get(u'_ref')) + if (var.get(u'newArray').callprop(u'indexOf', var.get(u'item'))<Js(0.0)): + var.get(u'newArray').callprop(u'push', var.get(u'item')) + + return var.get(u'newArray') + PyJs_anonymous_49_._set_name(u'anonymous') + return PyJsComma(Js(0.0),var.get(u'_mergeWith2').get(u'default'))(var.get(u'dest'), var.get(u'src'), PyJs_anonymous_49_) + PyJs_anonymous_48_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_48_) + var.put(u'_mergeWith', var.get(u'require')(Js(u'lodash/mergeWith'))) + var.put(u'_mergeWith2', var.get(u'_interopRequireDefault')(var.get(u'_mergeWith'))) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_47_._set_name(u'anonymous') +PyJs_Object_51_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'lodash/mergeWith':Js(478.0)}) +@Js +def PyJs_anonymous_52_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'require', u'_babelTypes', u'module', u't']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_54_ = Js({}) + var.put(u'newObj', PyJs_Object_54_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_53_(ast, comments, tokens, this, arguments, var=var): + var = Scope({u'tokens':tokens, u'this':this, u'arguments':arguments, u'comments':comments, u'ast':ast}, var) + var.registers([u'tokens', u'comments', u'ast']) + if var.get(u'ast'): + if PyJsStrictEq(var.get(u'ast').get(u'type'),Js(u'Program')): + return var.get(u't').callprop(u'file', var.get(u'ast'), (var.get(u'comments') or Js([])), (var.get(u'tokens') or Js([]))) + else: + if PyJsStrictEq(var.get(u'ast').get(u'type'),Js(u'File')): + return var.get(u'ast') + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Not a valid ast?'))) + raise PyJsTempException + PyJs_anonymous_53_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_53_) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_52_._set_name(u'anonymous') +PyJs_Object_55_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_56_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_57_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'_module', u'_typeof2', u'_typeof3', u'process', u'relativeModules', u'_module2', u'_interopRequireDefault', u'_path2', u'_path']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_59_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_59_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + @Js + def PyJs_anonymous_58_(loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'arguments':arguments}, var) + var.registers([u'relative', u'loc', u'filename', u'relativeMod']) + var.put(u'relative', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else var.get(u'process').callprop(u'cwd'))) + if PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'_module2').get(u'default').typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'_module2').get(u'default'))),Js(u'object')): + return var.get(u"null") + var.put(u'relativeMod', var.get(u'relativeModules').get(var.get(u'relative'))) + if var.get(u'relativeMod').neg(): + var.put(u'relativeMod', var.get(u'_module2').get(u'default').create()) + var.put(u'filename', var.get(u'_path2').get(u'default').callprop(u'join', var.get(u'relative'), Js(u'.babelrc'))) + var.get(u'relativeMod').put(u'id', var.get(u'filename')) + var.get(u'relativeMod').put(u'filename', var.get(u'filename')) + var.get(u'relativeMod').put(u'paths', var.get(u'_module2').get(u'default').callprop(u'_nodeModulePaths', var.get(u'relative'))) + var.get(u'relativeModules').put(var.get(u'relative'), var.get(u'relativeMod')) + try: + return var.get(u'_module2').get(u'default').callprop(u'_resolveFilename', var.get(u'loc'), var.get(u'relativeMod')) + except PyJsException as PyJsTempException: + PyJsHolder_657272_57087007 = var.own.get(u'err') + var.force_own_put(u'err', PyExceptionToJs(PyJsTempException)) + try: + return var.get(u"null") + finally: + if PyJsHolder_657272_57087007 is not None: + var.own[u'err'] = PyJsHolder_657272_57087007 + else: + del var.own[u'err'] + del PyJsHolder_657272_57087007 + PyJs_anonymous_58_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_58_) + var.put(u'_module', var.get(u'require')(Js(u'module'))) + var.put(u'_module2', var.get(u'_interopRequireDefault')(var.get(u'_module'))) + var.put(u'_path', var.get(u'require')(Js(u'path'))) + var.put(u'_path2', var.get(u'_interopRequireDefault')(var.get(u'_path'))) + pass + PyJs_Object_60_ = Js({}) + var.put(u'relativeModules', PyJs_Object_60_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) + PyJs_anonymous_57_._set_name(u'anonymous') + PyJs_anonymous_57_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_56_._set_name(u'anonymous') +PyJs_Object_61_ = Js({u'_process':Js(531.0),u'babel-runtime/helpers/typeof':Js(114.0),u'module':Js(523.0),u'path':Js(530.0)}) +@Js +def PyJs_anonymous_62_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_map', u'_inherits3', u'_inherits2', u'require', u'_possibleConstructorReturn3', u'_possibleConstructorReturn2', u'module', u'Store', u'_interopRequireDefault', u'_classCallCheck3', u'_classCallCheck2', u'_map2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_63_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_63_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_map', var.get(u'require')(Js(u'babel-runtime/core-js/map'))) + var.put(u'_map2', var.get(u'_interopRequireDefault')(var.get(u'_map'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_possibleConstructorReturn2', var.get(u'require')(Js(u'babel-runtime/helpers/possibleConstructorReturn'))) + var.put(u'_possibleConstructorReturn3', var.get(u'_interopRequireDefault')(var.get(u'_possibleConstructorReturn2'))) + var.put(u'_inherits2', var.get(u'require')(Js(u'babel-runtime/helpers/inherits'))) + var.put(u'_inherits3', var.get(u'_interopRequireDefault')(var.get(u'_inherits2'))) + pass + @Js + def PyJs_anonymous_64_(_Map, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'_Map':_Map}, var) + var.registers([u'Store', u'_Map']) + @Js + def PyJsHoisted_Store_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_this']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Store')) + var.put(u'_this', PyJsComma(Js(0.0),var.get(u'_possibleConstructorReturn3').get(u'default'))(var.get(u"this"), var.get(u'_Map').callprop(u'call', var.get(u"this")))) + PyJs_Object_65_ = Js({}) + var.get(u'_this').put(u'dynamicData', PyJs_Object_65_) + return var.get(u'_this') + PyJsHoisted_Store_.func_name = u'Store' + var.put(u'Store', PyJsHoisted_Store_) + PyJsComma(Js(0.0),var.get(u'_inherits3').get(u'default'))(var.get(u'Store'), var.get(u'_Map')) + pass + @Js + def PyJs_setDynamic_66_(key, fn, this, arguments, var=var): + var = Scope({u'this':this, u'setDynamic':PyJs_setDynamic_66_, u'fn':fn, u'key':key, u'arguments':arguments}, var) + var.registers([u'fn', u'key']) + var.get(u"this").get(u'dynamicData').put(var.get(u'key'), var.get(u'fn')) + PyJs_setDynamic_66_._set_name(u'setDynamic') + var.get(u'Store').get(u'prototype').put(u'setDynamic', PyJs_setDynamic_66_) + @Js + def PyJs_get_67_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key, u'get':PyJs_get_67_}, var) + var.registers([u'key', u'val']) + if var.get(u"this").callprop(u'has', var.get(u'key')): + return var.get(u'_Map').get(u'prototype').get(u'get').callprop(u'call', var.get(u"this"), var.get(u'key')) + else: + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u"this").get(u'dynamicData'), var.get(u'key')): + var.put(u'val', var.get(u"this").get(u'dynamicData').callprop(var.get(u'key'))) + var.get(u"this").callprop(u'set', var.get(u'key'), var.get(u'val')) + return var.get(u'val') + PyJs_get_67_._set_name(u'get') + var.get(u'Store').get(u'prototype').put(u'get', PyJs_get_67_) + return var.get(u'Store') + PyJs_anonymous_64_._set_name(u'anonymous') + var.put(u'Store', PyJs_anonymous_64_(var.get(u'_map2').get(u'default'))) + var.get(u'exports').put(u'default', var.get(u'Store')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_62_._set_name(u'anonymous') +PyJs_Object_68_ = Js({u'babel-runtime/core-js/map':Js(98.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-runtime/helpers/inherits':Js(111.0),u'babel-runtime/helpers/possibleConstructorReturn':Js(113.0)}) +@Js +def PyJs_anonymous_69_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_each', u'_babelTemplate', u'module', u'_babelHelpers', u'buildGlobal', u'_interopRequireDefault', u'buildVar', u'_each2', u'_babelTemplate2', u'_babelMessages', u'exports', u'_interopRequireWildcard', u'buildUmd', u'_babelTypes', u'_babelGenerator', u'buildHelpers', u'_babelGenerator2', u'buildUmdWrapper', u'require', u'messages', u'helpers', u't']) + @Js + def PyJsHoisted_buildVar_(namespace, builder, this, arguments, var=var): + var = Scope({u'this':this, u'builder':builder, u'namespace':namespace, u'arguments':arguments}, var) + var.registers([u'body', u'builder', u'namespace']) + var.put(u'body', Js([])) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'namespace'), var.get(u't').callprop(u'objectExpression', Js([])))]))) + var.get(u'builder')(var.get(u'body')) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u'namespace'))) + return var.get(u't').callprop(u'program', var.get(u'body')) + PyJsHoisted_buildVar_.func_name = u'buildVar' + var.put(u'buildVar', PyJsHoisted_buildVar_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_74_ = Js({}) + var.put(u'newObj', PyJs_Object_74_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_buildUmd_(namespace, builder, this, arguments, var=var): + var = Scope({u'this':this, u'builder':builder, u'namespace':namespace, u'arguments':arguments}, var) + var.registers([u'body', u'builder', u'namespace']) + var.put(u'body', Js([])) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'namespace'), var.get(u't').callprop(u'identifier', Js(u'global')))]))) + var.get(u'builder')(var.get(u'body')) + PyJs_Object_77_ = Js({u'FACTORY_PARAMETERS':var.get(u't').callprop(u'identifier', Js(u'global')),u'BROWSER_ARGUMENTS':var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'root')), var.get(u'namespace')), var.get(u't').callprop(u'objectExpression', Js([]))),u'COMMON_ARGUMENTS':var.get(u't').callprop(u'identifier', Js(u'exports')),u'AMD_ARGUMENTS':var.get(u't').callprop(u'arrayExpression', Js([var.get(u't').callprop(u'stringLiteral', Js(u'exports'))])),u'FACTORY_BODY':var.get(u'body'),u'UMD_ROOT':var.get(u't').callprop(u'identifier', Js(u'this'))}) + return var.get(u't').callprop(u'program', Js([var.get(u'buildUmdWrapper')(PyJs_Object_77_)])) + PyJsHoisted_buildUmd_.func_name = u'buildUmd' + var.put(u'buildUmd', PyJsHoisted_buildUmd_) + @Js + def PyJsHoisted_buildHelpers_(body, namespace, whitelist, this, arguments, var=var): + var = Scope({u'body':body, u'this':this, u'whitelist':whitelist, u'namespace':namespace, u'arguments':arguments}, var) + var.registers([u'body', u'whitelist', u'namespace']) + @Js + def PyJs_anonymous_78_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name', u'key']) + if (var.get(u'whitelist') and (var.get(u'whitelist').callprop(u'indexOf', var.get(u'name'))<Js(0.0))): + return var.get('undefined') + var.put(u'key', var.get(u't').callprop(u'identifier', var.get(u'name'))) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u't').callprop(u'memberExpression', var.get(u'namespace'), var.get(u'key')), var.get(u'helpers').callprop(u'get', var.get(u'name'))))) + PyJs_anonymous_78_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(var.get(u'helpers').get(u'list'), PyJs_anonymous_78_) + PyJsHoisted_buildHelpers_.func_name = u'buildHelpers' + var.put(u'buildHelpers', PyJsHoisted_buildHelpers_) + @Js + def PyJsHoisted_buildGlobal_(namespace, builder, this, arguments, var=var): + var = Scope({u'this':this, u'builder':builder, u'namespace':namespace, u'arguments':arguments}, var) + var.registers([u'body', u'tree', u'builder', u'namespace', u'container']) + var.put(u'body', Js([])) + var.put(u'container', var.get(u't').callprop(u'functionExpression', var.get(u"null"), Js([var.get(u't').callprop(u'identifier', Js(u'global'))]), var.get(u't').callprop(u'blockStatement', var.get(u'body')))) + var.put(u'tree', var.get(u't').callprop(u'program', Js([var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u'container'), Js([var.get(u'helpers').callprop(u'get', Js(u'selfGlobal'))])))]))) + def PyJs_LONG_76_(var=var): + return var.get(u'body').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'namespace'), var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'global')), var.get(u'namespace')), var.get(u't').callprop(u'objectExpression', Js([]))))]))) + PyJs_LONG_76_() + var.get(u'builder')(var.get(u'body')) + return var.get(u'tree') + PyJsHoisted_buildGlobal_.func_name = u'buildGlobal' + var.put(u'buildGlobal', PyJsHoisted_buildGlobal_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_73_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_73_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_70_(whitelist, this, arguments, var=var): + var = Scope({u'this':this, u'whitelist':whitelist, u'arguments':arguments}, var) + var.registers([u'namespace', u'whitelist', u'tree', u'outputType', u'build', u'builder']) + var.put(u'outputType', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js(u'global'))) + var.put(u'namespace', var.get(u't').callprop(u'identifier', Js(u'babelHelpers'))) + @Js + def PyJs_builder_71_(body, this, arguments, var=var): + var = Scope({u'body':body, u'this':this, u'builder':PyJs_builder_71_, u'arguments':arguments}, var) + var.registers([u'body']) + return var.get(u'buildHelpers')(var.get(u'body'), var.get(u'namespace'), var.get(u'whitelist')) + PyJs_builder_71_._set_name(u'builder') + var.put(u'builder', PyJs_builder_71_) + var.put(u'tree', PyJsComma(Js(0.0), Js(None))) + PyJs_Object_72_ = Js({u'global':var.get(u'buildGlobal'),u'umd':var.get(u'buildUmd'),u'var':var.get(u'buildVar')}) + var.put(u'build', PyJs_Object_72_.get(var.get(u'outputType'))) + if var.get(u'build'): + var.put(u'tree', var.get(u'build')(var.get(u'namespace'), var.get(u'builder'))) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(var.get(u'messages').callprop(u'get', Js(u'unsupportedOutputType'), var.get(u'outputType')))) + raise PyJsTempException + return PyJsComma(Js(0.0),var.get(u'_babelGenerator2').get(u'default'))(var.get(u'tree')).get(u'code') + PyJs_anonymous_70_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_70_) + var.put(u'_babelHelpers', var.get(u'require')(Js(u'babel-helpers'))) + var.put(u'helpers', var.get(u'_interopRequireWildcard')(var.get(u'_babelHelpers'))) + var.put(u'_babelGenerator', var.get(u'require')(Js(u'babel-generator'))) + var.put(u'_babelGenerator2', var.get(u'_interopRequireDefault')(var.get(u'_babelGenerator'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + var.put(u'_each', var.get(u'require')(Js(u'lodash/each'))) + var.put(u'_each2', var.get(u'_interopRequireDefault')(var.get(u'_each'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + def PyJs_LONG_75_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (root, factory) {\n if (typeof define === "function" && define.amd) {\n define(AMD_ARGUMENTS, factory);\n } else if (typeof exports === "object") {\n factory(COMMON_ARGUMENTS);\n } else {\n factory(BROWSER_ARGUMENTS);\n }\n })(UMD_ROOT, function (FACTORY_PARAMETERS) {\n FACTORY_BODY\n });\n')) + var.put(u'buildUmdWrapper', PyJs_LONG_75_()) + pass + pass + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_69_._set_name(u'anonymous') +PyJs_Object_79_ = Js({u'babel-generator':Js(40.0),u'babel-helpers':Js(56.0),u'babel-messages':Js(57.0),u'babel-template':Js(221.0),u'babel-types':Js(258.0),u'lodash/each':Js(443.0)}) +@Js +def PyJs_anonymous_80_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_81_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'_resolve', u'_store', u'_sourceMap', u'_shadowFunctions2', u'_babelHelpers', u'_logger2', u'_interopRequireDefault', u'_convertSourceMap', u'_getIterator3', u'_getIterator2', u'_shadowFunctions', u'_babelCodeFrame2', u'_typeof2', u'_typeof3', u'metadataVisitor', u'INTERNAL_PLUGINS', u'_possibleConstructorReturn3', u'_possibleConstructorReturn2', u'_babylon', u'_create2', u'errorVisitor', u'_metadata', u'_store2', u'_assign2', u'shebangRegex', u'_blockHoist', u'_classCallCheck3', u'_classCallCheck2', u'_pluginPass2', u'_sourceMap2', u'_create', u'_convertSourceMap2', u'process', u'_babelTypes', u'_babelTraverse2', u'_interopRequireWildcard', u'_inherits3', u'_inherits2', u'_pluginPass', u'_assign', u'_babelCodeFrame', u'_babelGenerator', u'_logger', u'_util', u'_defaults2', u'_path2', u'_optionManager2', u'_babelTraverse', u'util', u'_babelGenerator2', u'_blockHoist2', u'_babelHelpers2', u'_defaults', u'_optionManager', u't', u'File', u'_resolve2', u'_path']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_83_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_83_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_82_ = Js({}) + var.put(u'newObj', PyJs_Object_82_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'File', var.get(u'undefined')) + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_create', var.get(u'require')(Js(u'babel-runtime/core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + var.put(u'_assign', var.get(u'require')(Js(u'babel-runtime/core-js/object/assign'))) + var.put(u'_assign2', var.get(u'_interopRequireDefault')(var.get(u'_assign'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_possibleConstructorReturn2', var.get(u'require')(Js(u'babel-runtime/helpers/possibleConstructorReturn'))) + var.put(u'_possibleConstructorReturn3', var.get(u'_interopRequireDefault')(var.get(u'_possibleConstructorReturn2'))) + var.put(u'_inherits2', var.get(u'require')(Js(u'babel-runtime/helpers/inherits'))) + var.put(u'_inherits3', var.get(u'_interopRequireDefault')(var.get(u'_inherits2'))) + var.put(u'_babelHelpers', var.get(u'require')(Js(u'babel-helpers'))) + var.put(u'_babelHelpers2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelpers'))) + var.put(u'_metadata', var.get(u'require')(Js(u'./metadata'))) + var.put(u'metadataVisitor', var.get(u'_interopRequireWildcard')(var.get(u'_metadata'))) + var.put(u'_convertSourceMap', var.get(u'require')(Js(u'convert-source-map'))) + var.put(u'_convertSourceMap2', var.get(u'_interopRequireDefault')(var.get(u'_convertSourceMap'))) + var.put(u'_optionManager', var.get(u'require')(Js(u'./options/option-manager'))) + var.put(u'_optionManager2', var.get(u'_interopRequireDefault')(var.get(u'_optionManager'))) + var.put(u'_pluginPass', var.get(u'require')(Js(u'../plugin-pass'))) + var.put(u'_pluginPass2', var.get(u'_interopRequireDefault')(var.get(u'_pluginPass'))) + var.put(u'_babelTraverse', var.get(u'require')(Js(u'babel-traverse'))) + var.put(u'_babelTraverse2', var.get(u'_interopRequireDefault')(var.get(u'_babelTraverse'))) + var.put(u'_sourceMap', var.get(u'require')(Js(u'source-map'))) + var.put(u'_sourceMap2', var.get(u'_interopRequireDefault')(var.get(u'_sourceMap'))) + var.put(u'_babelGenerator', var.get(u'require')(Js(u'babel-generator'))) + var.put(u'_babelGenerator2', var.get(u'_interopRequireDefault')(var.get(u'_babelGenerator'))) + var.put(u'_babelCodeFrame', var.get(u'require')(Js(u'babel-code-frame'))) + var.put(u'_babelCodeFrame2', var.get(u'_interopRequireDefault')(var.get(u'_babelCodeFrame'))) + var.put(u'_defaults', var.get(u'require')(Js(u'lodash/defaults'))) + var.put(u'_defaults2', var.get(u'_interopRequireDefault')(var.get(u'_defaults'))) + var.put(u'_logger', var.get(u'require')(Js(u'./logger'))) + var.put(u'_logger2', var.get(u'_interopRequireDefault')(var.get(u'_logger'))) + var.put(u'_store', var.get(u'require')(Js(u'../../store'))) + var.put(u'_store2', var.get(u'_interopRequireDefault')(var.get(u'_store'))) + var.put(u'_babylon', var.get(u'require')(Js(u'babylon'))) + var.put(u'_util', var.get(u'require')(Js(u'../../util'))) + var.put(u'util', var.get(u'_interopRequireWildcard')(var.get(u'_util'))) + var.put(u'_path', var.get(u'require')(Js(u'path'))) + var.put(u'_path2', var.get(u'_interopRequireDefault')(var.get(u'_path'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_resolve', var.get(u'require')(Js(u'../../helpers/resolve'))) + var.put(u'_resolve2', var.get(u'_interopRequireDefault')(var.get(u'_resolve'))) + var.put(u'_blockHoist', var.get(u'require')(Js(u'../internal-plugins/block-hoist'))) + var.put(u'_blockHoist2', var.get(u'_interopRequireDefault')(var.get(u'_blockHoist'))) + var.put(u'_shadowFunctions', var.get(u'require')(Js(u'../internal-plugins/shadow-functions'))) + var.put(u'_shadowFunctions2', var.get(u'_interopRequireDefault')(var.get(u'_shadowFunctions'))) + pass + pass + var.put(u'shebangRegex', JsRegExp(u'/^#!.*/')) + var.put(u'INTERNAL_PLUGINS', Js([Js([var.get(u'_blockHoist2').get(u'default')]), Js([var.get(u'_shadowFunctions2').get(u'default')])])) + @Js + def PyJs_enter_85_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'enter':PyJs_enter_85_}, var) + var.registers([u'loc', u'state', u'path']) + var.put(u'loc', var.get(u'path').get(u'node').get(u'loc')) + if var.get(u'loc'): + var.get(u'state').put(u'loc', var.get(u'loc')) + var.get(u'path').callprop(u'stop') + PyJs_enter_85_._set_name(u'enter') + PyJs_Object_84_ = Js({u'enter':PyJs_enter_85_}) + var.put(u'errorVisitor', PyJs_Object_84_) + @Js + def PyJs_anonymous_86_(_Store, this, arguments, var=var): + var = Scope({u'this':this, u'_Store':_Store, u'arguments':arguments}, var) + var.registers([u'_Store', u'File']) + @Js + def PyJsHoisted_File_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'pipeline', u'_this', u'opts']) + PyJs_Object_87_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else PyJs_Object_87_)) + var.put(u'pipeline', var.get(u'arguments').get(u'1')) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'File')) + var.put(u'_this', PyJsComma(Js(0.0),var.get(u'_possibleConstructorReturn3').get(u'default'))(var.get(u"this"), var.get(u'_Store').callprop(u'call', var.get(u"this")))) + var.get(u'_this').put(u'pipeline', var.get(u'pipeline')) + var.get(u'_this').put(u'log', var.get(u'_logger2').get(u'default').create(var.get(u'_this'), (var.get(u'opts').get(u'filename') or Js(u'unknown')))) + var.get(u'_this').put(u'opts', var.get(u'_this').callprop(u'initOptions', var.get(u'opts'))) + PyJs_Object_88_ = Js({u'sourceType':var.get(u'_this').get(u'opts').get(u'sourceType'),u'sourceFileName':var.get(u'_this').get(u'opts').get(u'filename'),u'plugins':Js([])}) + var.get(u'_this').put(u'parserOpts', PyJs_Object_88_) + var.get(u'_this').put(u'pluginVisitors', Js([])) + var.get(u'_this').put(u'pluginPasses', Js([])) + var.get(u'_this').callprop(u'buildPluginsForOptions', var.get(u'_this').get(u'opts')) + if var.get(u'_this').get(u'opts').get(u'passPerPreset'): + var.get(u'_this').put(u'perPresetOpts', Js([])) + @Js + def PyJs_anonymous_89_(presetOpts, this, arguments, var=var): + var = Scope({u'this':this, u'presetOpts':presetOpts, u'arguments':arguments}, var) + var.registers([u'presetOpts', u'perPresetOpts']) + var.put(u'perPresetOpts', PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u'_this').get(u'opts')), var.get(u'presetOpts'))) + var.get(u'_this').get(u'perPresetOpts').callprop(u'push', var.get(u'perPresetOpts')) + var.get(u'_this').callprop(u'buildPluginsForOptions', var.get(u'perPresetOpts')) + PyJs_anonymous_89_._set_name(u'anonymous') + var.get(u'_this').get(u'opts').get(u'presets').callprop(u'forEach', PyJs_anonymous_89_) + PyJs_Object_92_ = Js({u'exported':Js([]),u'specifiers':Js([])}) + PyJs_Object_91_ = Js({u'imports':Js([]),u'exports':PyJs_Object_92_}) + PyJs_Object_90_ = Js({u'usedHelpers':Js([]),u'marked':Js([]),u'modules':PyJs_Object_91_}) + var.get(u'_this').put(u'metadata', PyJs_Object_90_) + PyJs_Object_93_ = Js({}) + var.get(u'_this').put(u'dynamicImportTypes', PyJs_Object_93_) + PyJs_Object_94_ = Js({}) + var.get(u'_this').put(u'dynamicImportIds', PyJs_Object_94_) + var.get(u'_this').put(u'dynamicImports', Js([])) + PyJs_Object_95_ = Js({}) + var.get(u'_this').put(u'declarations', PyJs_Object_95_) + PyJs_Object_96_ = Js({}) + var.get(u'_this').put(u'usedHelpers', PyJs_Object_96_) + var.get(u'_this').put(u'path', var.get(u"null")) + PyJs_Object_97_ = Js({}) + var.get(u'_this').put(u'ast', PyJs_Object_97_) + var.get(u'_this').put(u'code', Js(u'')) + var.get(u'_this').put(u'shebang', Js(u'')) + var.get(u'_this').put(u'hub', var.get(u'_babelTraverse').get(u'Hub').create(var.get(u'_this'))) + return var.get(u'_this') + PyJsHoisted_File_.func_name = u'File' + var.put(u'File', PyJsHoisted_File_) + PyJsComma(Js(0.0),var.get(u'_inherits3').get(u'default'))(var.get(u'File'), var.get(u'_Store')) + pass + @Js + def PyJs_getMetadata_98_(this, arguments, var=var): + var = Scope({u'this':this, u'getMetadata':PyJs_getMetadata_98_, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'_i', u'_ref', u'has']) + var.put(u'has', Js(False)) + #for JS loop + var.put(u'_iterator', var.get(u"this").get(u'ast').get(u'program').get(u'body')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'node', var.get(u'_ref')) + if var.get(u't').callprop(u'isModuleDeclaration', var.get(u'node')): + var.put(u'has', var.get(u'true')) + break + + if var.get(u'has'): + var.get(u"this").get(u'path').callprop(u'traverse', var.get(u'metadataVisitor'), var.get(u"this")) + PyJs_getMetadata_98_._set_name(u'getMetadata') + var.get(u'File').get(u'prototype').put(u'getMetadata', PyJs_getMetadata_98_) + @Js + def PyJs_initOptions_99_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'opts':opts, u'initOptions':PyJs_initOptions_99_}, var) + var.registers([u'basenameRelative', u'opts']) + var.put(u'opts', var.get(u'_optionManager2').get(u'default').create(var.get(u"this").get(u'log'), var.get(u"this").get(u'pipeline')).callprop(u'init', var.get(u'opts'))) + if var.get(u'opts').get(u'inputSourceMap'): + var.get(u'opts').put(u'sourceMaps', var.get(u'true')) + if var.get(u'opts').get(u'moduleId'): + var.get(u'opts').put(u'moduleIds', var.get(u'true')) + var.get(u'opts').put(u'basename', var.get(u'_path2').get(u'default').callprop(u'basename', var.get(u'opts').get(u'filename'), var.get(u'_path2').get(u'default').callprop(u'extname', var.get(u'opts').get(u'filename')))) + var.get(u'opts').put(u'ignore', var.get(u'util').callprop(u'arrayify', var.get(u'opts').get(u'ignore'), var.get(u'util').get(u'regexify'))) + if var.get(u'opts').get(u'only'): + var.get(u'opts').put(u'only', var.get(u'util').callprop(u'arrayify', var.get(u'opts').get(u'only'), var.get(u'util').get(u'regexify'))) + PyJs_Object_100_ = Js({u'moduleRoot':var.get(u'opts').get(u'sourceRoot')}) + PyJsComma(Js(0.0),var.get(u'_defaults2').get(u'default'))(var.get(u'opts'), PyJs_Object_100_) + PyJs_Object_101_ = Js({u'sourceRoot':var.get(u'opts').get(u'moduleRoot')}) + PyJsComma(Js(0.0),var.get(u'_defaults2').get(u'default'))(var.get(u'opts'), PyJs_Object_101_) + PyJs_Object_102_ = Js({u'filenameRelative':var.get(u'opts').get(u'filename')}) + PyJsComma(Js(0.0),var.get(u'_defaults2').get(u'default'))(var.get(u'opts'), PyJs_Object_102_) + var.put(u'basenameRelative', var.get(u'_path2').get(u'default').callprop(u'basename', var.get(u'opts').get(u'filenameRelative'))) + PyJs_Object_103_ = Js({u'sourceFileName':var.get(u'basenameRelative'),u'sourceMapTarget':var.get(u'basenameRelative')}) + PyJsComma(Js(0.0),var.get(u'_defaults2').get(u'default'))(var.get(u'opts'), PyJs_Object_103_) + return var.get(u'opts') + PyJs_initOptions_99_._set_name(u'initOptions') + var.get(u'File').get(u'prototype').put(u'initOptions', PyJs_initOptions_99_) + @Js + def PyJs_buildPluginsForOptions_104_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'opts':opts, u'buildPluginsForOptions':PyJs_buildPluginsForOptions_104_}, var) + var.registers([u'pluginOpts', u'_isArray2', u'plugin', u'_i2', u'_ref2', u'opts', u'plugins', u'currentPluginPasses', u'ref', u'currentPluginVisitors', u'_iterator2']) + if var.get(u'Array').callprop(u'isArray', var.get(u'opts').get(u'plugins')).neg(): + return var.get('undefined') + var.put(u'plugins', var.get(u'opts').get(u'plugins').callprop(u'concat', var.get(u'INTERNAL_PLUGINS'))) + var.put(u'currentPluginVisitors', Js([])) + var.put(u'currentPluginPasses', Js([])) + #for JS loop + var.put(u'_iterator2', var.get(u'plugins')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'ref', var.get(u'_ref2')) + var.put(u'plugin', var.get(u'ref').get(u'0')) + var.put(u'pluginOpts', var.get(u'ref').get(u'1')) + var.get(u'currentPluginVisitors').callprop(u'push', var.get(u'plugin').get(u'visitor')) + var.get(u'currentPluginPasses').callprop(u'push', var.get(u'_pluginPass2').get(u'default').create(var.get(u"this"), var.get(u'plugin'), var.get(u'pluginOpts'))) + if var.get(u'plugin').get(u'manipulateOptions'): + var.get(u'plugin').callprop(u'manipulateOptions', var.get(u'opts'), var.get(u"this").get(u'parserOpts'), var.get(u"this")) + + var.get(u"this").get(u'pluginVisitors').callprop(u'push', var.get(u'currentPluginVisitors')) + var.get(u"this").get(u'pluginPasses').callprop(u'push', var.get(u'currentPluginPasses')) + PyJs_buildPluginsForOptions_104_._set_name(u'buildPluginsForOptions') + var.get(u'File').get(u'prototype').put(u'buildPluginsForOptions', PyJs_buildPluginsForOptions_104_) + @Js + def PyJs_getModuleName_105_(this, arguments, var=var): + var = Scope({u'this':this, u'getModuleName':PyJs_getModuleName_105_, u'arguments':arguments}, var) + var.registers([u'moduleName', u'sourceRootRegEx', u'opts', u'filenameRelative']) + var.put(u'opts', var.get(u"this").get(u'opts')) + if var.get(u'opts').get(u'moduleIds').neg(): + return var.get(u"null") + if ((var.get(u'opts').get(u'moduleId')!=var.get(u"null")) and var.get(u'opts').get(u'getModuleId').neg()): + return var.get(u'opts').get(u'moduleId') + var.put(u'filenameRelative', var.get(u'opts').get(u'filenameRelative')) + var.put(u'moduleName', Js(u'')) + if (var.get(u'opts').get(u'moduleRoot')!=var.get(u"null")): + var.put(u'moduleName', (var.get(u'opts').get(u'moduleRoot')+Js(u'/'))) + if var.get(u'opts').get(u'filenameRelative').neg(): + return (var.get(u'moduleName')+var.get(u'opts').get(u'filename').callprop(u'replace', JsRegExp(u'/^\\//'), Js(u''))) + if (var.get(u'opts').get(u'sourceRoot')!=var.get(u"null")): + var.put(u'sourceRootRegEx', var.get(u'RegExp').create(((Js(u'^')+var.get(u'opts').get(u'sourceRoot'))+Js(u'/?')))) + var.put(u'filenameRelative', var.get(u'filenameRelative').callprop(u'replace', var.get(u'sourceRootRegEx'), Js(u''))) + var.put(u'filenameRelative', var.get(u'filenameRelative').callprop(u'replace', JsRegExp(u'/\\.(\\w*?)$/'), Js(u''))) + var.put(u'moduleName', var.get(u'filenameRelative'), u'+') + var.put(u'moduleName', var.get(u'moduleName').callprop(u'replace', JsRegExp(u'/\\\\/g'), Js(u'/'))) + if var.get(u'opts').get(u'getModuleId'): + return (var.get(u'opts').callprop(u'getModuleId', var.get(u'moduleName')) or var.get(u'moduleName')) + else: + return var.get(u'moduleName') + PyJs_getModuleName_105_._set_name(u'getModuleName') + var.get(u'File').get(u'prototype').put(u'getModuleName', PyJs_getModuleName_105_) + @Js + def PyJs_resolveModuleSource_106_(source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'resolveModuleSource':PyJs_resolveModuleSource_106_, u'arguments':arguments}, var) + var.registers([u'resolveModuleSource', u'source']) + var.put(u'resolveModuleSource', var.get(u"this").get(u'opts').get(u'resolveModuleSource')) + if var.get(u'resolveModuleSource'): + var.put(u'source', var.get(u'resolveModuleSource')(var.get(u'source'), var.get(u"this").get(u'opts').get(u'filename'))) + return var.get(u'source') + PyJs_resolveModuleSource_106_._set_name(u'resolveModuleSource') + var.get(u'File').get(u'prototype').put(u'resolveModuleSource', PyJs_resolveModuleSource_106_) + @Js + def PyJs_addImport_107_(source, imported, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'imported':imported, u'arguments':arguments, u'addImport':PyJs_addImport_107_}, var) + var.registers([u'specifiers', u'imported', u'name', u'alias', u'source', u'declar', u'id']) + var.put(u'name', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else var.get(u'imported'))) + var.put(u'alias', ((var.get(u'source')+Js(u':'))+var.get(u'imported'))) + var.put(u'id', var.get(u"this").get(u'dynamicImportIds').get(var.get(u'alias'))) + if var.get(u'id').neg(): + var.put(u'source', var.get(u"this").callprop(u'resolveModuleSource', var.get(u'source'))) + var.put(u'id', var.get(u"this").get(u'dynamicImportIds').put(var.get(u'alias'), var.get(u"this").get(u'scope').callprop(u'generateUidIdentifier', var.get(u'name')))) + var.put(u'specifiers', Js([])) + if PyJsStrictEq(var.get(u'imported'),Js(u'*')): + var.get(u'specifiers').callprop(u'push', var.get(u't').callprop(u'importNamespaceSpecifier', var.get(u'id'))) + else: + if PyJsStrictEq(var.get(u'imported'),Js(u'default')): + var.get(u'specifiers').callprop(u'push', var.get(u't').callprop(u'importDefaultSpecifier', var.get(u'id'))) + else: + var.get(u'specifiers').callprop(u'push', var.get(u't').callprop(u'importSpecifier', var.get(u'id'), var.get(u't').callprop(u'identifier', var.get(u'imported')))) + var.put(u'declar', var.get(u't').callprop(u'importDeclaration', var.get(u'specifiers'), var.get(u't').callprop(u'stringLiteral', var.get(u'source')))) + var.get(u'declar').put(u'_blockHoist', Js(3.0)) + var.get(u"this").get(u'path').callprop(u'unshiftContainer', Js(u'body'), var.get(u'declar')) + return var.get(u'id') + PyJs_addImport_107_._set_name(u'addImport') + var.get(u'File').get(u'prototype').put(u'addImport', PyJs_addImport_107_) + @Js + def PyJs_addHelper_108_(name, this, arguments, var=var): + var = Scope({u'this':this, u'addHelper':PyJs_addHelper_108_, u'name':name, u'arguments':arguments}, var) + var.registers([u'uid', u'generator', u'res', u'declar', u'runtime', u'ref', u'name']) + var.put(u'declar', var.get(u"this").get(u'declarations').get(var.get(u'name'))) + if var.get(u'declar'): + return var.get(u'declar') + if var.get(u"this").get(u'usedHelpers').get(var.get(u'name')).neg(): + var.get(u"this").get(u'metadata').get(u'usedHelpers').callprop(u'push', var.get(u'name')) + var.get(u"this").get(u'usedHelpers').put(var.get(u'name'), var.get(u'true')) + var.put(u'generator', var.get(u"this").callprop(u'get', Js(u'helperGenerator'))) + var.put(u'runtime', var.get(u"this").callprop(u'get', Js(u'helpersNamespace'))) + if var.get(u'generator'): + var.put(u'res', var.get(u'generator')(var.get(u'name'))) + if var.get(u'res'): + return var.get(u'res') + else: + if var.get(u'runtime'): + return var.get(u't').callprop(u'memberExpression', var.get(u'runtime'), var.get(u't').callprop(u'identifier', var.get(u'name'))) + var.put(u'ref', PyJsComma(Js(0.0),var.get(u'_babelHelpers2').get(u'default'))(var.get(u'name'))) + var.put(u'uid', var.get(u"this").get(u'declarations').put(var.get(u'name'), var.get(u"this").get(u'scope').callprop(u'generateUidIdentifier', var.get(u'name')))) + if (var.get(u't').callprop(u'isFunctionExpression', var.get(u'ref')) and var.get(u'ref').get(u'id').neg()): + var.get(u'ref').get(u'body').put(u'_compact', var.get(u'true')) + var.get(u'ref').put(u'_generated', var.get(u'true')) + var.get(u'ref').put(u'id', var.get(u'uid')) + var.get(u'ref').put(u'type', Js(u'FunctionDeclaration')) + var.get(u"this").get(u'path').callprop(u'unshiftContainer', Js(u'body'), var.get(u'ref')) + else: + var.get(u'ref').put(u'_compact', var.get(u'true')) + PyJs_Object_109_ = Js({u'id':var.get(u'uid'),u'init':var.get(u'ref'),u'unique':var.get(u'true')}) + var.get(u"this").get(u'scope').callprop(u'push', PyJs_Object_109_) + return var.get(u'uid') + PyJs_addHelper_108_._set_name(u'addHelper') + var.get(u'File').get(u'prototype').put(u'addHelper', PyJs_addHelper_108_) + @Js + def PyJs_addTemplateObject_110_(helperName, strings, raw, this, arguments, var=var): + var = Scope({u'this':this, u'helperName':helperName, u'raw':raw, u'arguments':arguments, u'addTemplateObject':PyJs_addTemplateObject_110_, u'strings':strings}, var) + var.registers([u'name', u'helperName', u'raw', u'init', u'declar', u'stringIds', u'helperId', u'strings', u'uid']) + @Js + def PyJs_anonymous_111_(string, this, arguments, var=var): + var = Scope({u'this':this, u'string':string, u'arguments':arguments}, var) + var.registers([u'string']) + return var.get(u'string').get(u'value') + PyJs_anonymous_111_._set_name(u'anonymous') + var.put(u'stringIds', var.get(u'raw').get(u'elements').callprop(u'map', PyJs_anonymous_111_)) + var.put(u'name', ((((var.get(u'helperName')+Js(u'_'))+var.get(u'raw').get(u'elements').get(u'length'))+Js(u'_'))+var.get(u'stringIds').callprop(u'join', Js(u',')))) + var.put(u'declar', var.get(u"this").get(u'declarations').get(var.get(u'name'))) + if var.get(u'declar'): + return var.get(u'declar') + var.put(u'uid', var.get(u"this").get(u'declarations').put(var.get(u'name'), var.get(u"this").get(u'scope').callprop(u'generateUidIdentifier', Js(u'templateObject')))) + var.put(u'helperId', var.get(u"this").callprop(u'addHelper', var.get(u'helperName'))) + var.put(u'init', var.get(u't').callprop(u'callExpression', var.get(u'helperId'), Js([var.get(u'strings'), var.get(u'raw')]))) + var.get(u'init').put(u'_compact', var.get(u'true')) + PyJs_Object_112_ = Js({u'id':var.get(u'uid'),u'init':var.get(u'init'),u'_blockHoist':Js(1.9)}) + var.get(u"this").get(u'scope').callprop(u'push', PyJs_Object_112_) + return var.get(u'uid') + PyJs_addTemplateObject_110_._set_name(u'addTemplateObject') + var.get(u'File').get(u'prototype').put(u'addTemplateObject', PyJs_addTemplateObject_110_) + @Js + def PyJs_buildCodeFrameError_113_(node, msg, this, arguments, var=var): + var = Scope({u'node':node, u'msg':msg, u'buildCodeFrameError':PyJs_buildCodeFrameError_113_, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'loc', u'msg', u'err', u'Error']) + var.put(u'Error', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else var.get(u'SyntaxError'))) + var.put(u'loc', (var.get(u'node') and (var.get(u'node').get(u'loc') or var.get(u'node').get(u'_loc')))) + var.put(u'err', var.get(u'Error').create(var.get(u'msg'))) + if var.get(u'loc'): + var.get(u'err').put(u'loc', var.get(u'loc').get(u'start')) + else: + PyJsComma(Js(0.0),var.get(u'_babelTraverse2').get(u'default'))(var.get(u'node'), var.get(u'errorVisitor'), var.get(u"this").get(u'scope'), var.get(u'err')) + var.get(u'err').put(u'message', Js(u' (This is an error on an internal node. Probably an internal error'), u'+') + if var.get(u'err').get(u'loc'): + var.get(u'err').put(u'message', Js(u'. Location has been estimated.'), u'+') + var.get(u'err').put(u'message', Js(u')'), u'+') + return var.get(u'err') + PyJs_buildCodeFrameError_113_._set_name(u'buildCodeFrameError') + var.get(u'File').get(u'prototype').put(u'buildCodeFrameError', PyJs_buildCodeFrameError_113_) + @Js + def PyJs_mergeSourceMap_114_(map, this, arguments, var=var): + var = Scope({u'this':this, u'map':map, u'arguments':arguments, u'mergeSourceMap':PyJs_mergeSourceMap_114_}, var) + var.registers([u'_ret', u'map', u'inputMap']) + var.put(u'inputMap', var.get(u"this").get(u'opts').get(u'inputSourceMap')) + if var.get(u'inputMap'): + @Js + def PyJs_anonymous_115_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'mergedGenerator', u'source', u'mergedMap', u'outputMapConsumer', u'inputMapConsumer']) + var.put(u'inputMapConsumer', var.get(u'_sourceMap2').get(u'default').get(u'SourceMapConsumer').create(var.get(u'inputMap'))) + var.put(u'outputMapConsumer', var.get(u'_sourceMap2').get(u'default').get(u'SourceMapConsumer').create(var.get(u'map'))) + PyJs_Object_116_ = Js({u'file':var.get(u'inputMapConsumer').get(u'file'),u'sourceRoot':var.get(u'inputMapConsumer').get(u'sourceRoot')}) + var.put(u'mergedGenerator', var.get(u'_sourceMap2').get(u'default').get(u'SourceMapGenerator').create(PyJs_Object_116_)) + var.put(u'source', var.get(u'outputMapConsumer').get(u'sources').get(u'0')) + @Js + def PyJs_anonymous_117_(mapping, this, arguments, var=var): + var = Scope({u'this':this, u'mapping':mapping, u'arguments':arguments}, var) + var.registers([u'generatedPosition', u'mapping']) + PyJs_Object_118_ = Js({u'line':var.get(u'mapping').get(u'generatedLine'),u'column':var.get(u'mapping').get(u'generatedColumn'),u'source':var.get(u'source')}) + var.put(u'generatedPosition', var.get(u'outputMapConsumer').callprop(u'generatedPositionFor', PyJs_Object_118_)) + if (var.get(u'generatedPosition').get(u'column')!=var.get(u"null")): + PyJs_Object_120_ = Js({u'line':var.get(u'mapping').get(u'originalLine'),u'column':var.get(u'mapping').get(u'originalColumn')}) + PyJs_Object_119_ = Js({u'source':var.get(u'mapping').get(u'source'),u'original':(var.get(u"null") if (var.get(u'mapping').get(u'source')==var.get(u"null")) else PyJs_Object_120_),u'generated':var.get(u'generatedPosition')}) + var.get(u'mergedGenerator').callprop(u'addMapping', PyJs_Object_119_) + PyJs_anonymous_117_._set_name(u'anonymous') + var.get(u'inputMapConsumer').callprop(u'eachMapping', PyJs_anonymous_117_) + var.put(u'mergedMap', var.get(u'mergedGenerator').callprop(u'toJSON')) + var.get(u'inputMap').put(u'mappings', var.get(u'mergedMap').get(u'mappings')) + PyJs_Object_121_ = Js({u'v':var.get(u'inputMap')}) + return PyJs_Object_121_ + PyJs_anonymous_115_._set_name(u'anonymous') + var.put(u'_ret', PyJs_anonymous_115_()) + if PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'_ret',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'_ret'))),Js(u'object')): + return var.get(u'_ret').get(u'v') + else: + return var.get(u'map') + PyJs_mergeSourceMap_114_._set_name(u'mergeSourceMap') + var.get(u'File').get(u'prototype').put(u'mergeSourceMap', PyJs_mergeSourceMap_114_) + @Js + def PyJs_parse_122_(code, this, arguments, var=var): + var = Scope({u'this':this, u'parse':PyJs_parse_122_, u'code':code, u'arguments':arguments}, var) + var.registers([u'code', u'ast', u'parser', u'parseCode', u'dirname', u'parserOpts']) + var.put(u'parseCode', var.get(u'_babylon').get(u'parse')) + var.put(u'parserOpts', var.get(u"this").get(u'opts').get(u'parserOpts')) + if var.get(u'parserOpts'): + PyJs_Object_123_ = Js({}) + var.put(u'parserOpts', PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(PyJs_Object_123_, var.get(u"this").get(u'parserOpts'), var.get(u'parserOpts'))) + if var.get(u'parserOpts').get(u'parser'): + if PyJsStrictEq(var.get(u'parserOpts').get(u'parser').typeof(),Js(u'string')): + var.put(u'dirname', (var.get(u'_path2').get(u'default').callprop(u'dirname', var.get(u"this").get(u'opts').get(u'filename')) or var.get(u'process').callprop(u'cwd'))) + var.put(u'parser', PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))(var.get(u'parserOpts').get(u'parser'), var.get(u'dirname'))) + if var.get(u'parser'): + var.put(u'parseCode', var.get(u'require')(var.get(u'parser')).get(u'parse')) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create((((Js(u"Couldn't find parser ")+var.get(u'parserOpts').get(u'parser'))+Js(u' with "parse" method relative to directory '))+var.get(u'dirname')))) + raise PyJsTempException + else: + var.put(u'parseCode', var.get(u'parserOpts').get(u'parser')) + @Js + def PyJs_parse_125_(source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'parse':PyJs_parse_125_, u'arguments':arguments}, var) + var.registers([u'source']) + return PyJsComma(Js(0.0),var.get(u'_babylon').get(u'parse'))(var.get(u'source'), var.get(u'parserOpts')) + PyJs_parse_125_._set_name(u'parse') + PyJs_Object_124_ = Js({u'parse':PyJs_parse_125_}) + var.get(u'parserOpts').put(u'parser', PyJs_Object_124_) + var.get(u"this").get(u'log').callprop(u'debug', Js(u'Parse start')) + var.put(u'ast', var.get(u'parseCode')(var.get(u'code'), (var.get(u'parserOpts') or var.get(u"this").get(u'parserOpts')))) + var.get(u"this").get(u'log').callprop(u'debug', Js(u'Parse stop')) + return var.get(u'ast') + PyJs_parse_122_._set_name(u'parse') + var.get(u'File').get(u'prototype').put(u'parse', PyJs_parse_122_) + @Js + def PyJs__addAst_126_(ast, this, arguments, var=var): + var = Scope({u'this':this, u'_addAst':PyJs__addAst_126_, u'arguments':arguments, u'ast':ast}, var) + var.registers([u'ast']) + PyJs_Object_127_ = Js({u'hub':var.get(u"this").get(u'hub'),u'parentPath':var.get(u"null"),u'parent':var.get(u'ast'),u'container':var.get(u'ast'),u'key':Js(u'program')}) + var.get(u"this").put(u'path', var.get(u'_babelTraverse').get(u'NodePath').callprop(u'get', PyJs_Object_127_).callprop(u'setContext')) + var.get(u"this").put(u'scope', var.get(u"this").get(u'path').get(u'scope')) + var.get(u"this").put(u'ast', var.get(u'ast')) + var.get(u"this").callprop(u'getMetadata') + PyJs__addAst_126_._set_name(u'_addAst') + var.get(u'File').get(u'prototype').put(u'_addAst', PyJs__addAst_126_) + @Js + def PyJs_addAst_128_(ast, this, arguments, var=var): + var = Scope({u'this':this, u'addAst':PyJs_addAst_128_, u'arguments':arguments, u'ast':ast}, var) + var.registers([u'ast']) + var.get(u"this").get(u'log').callprop(u'debug', Js(u'Start set AST')) + var.get(u"this").callprop(u'_addAst', var.get(u'ast')) + var.get(u"this").get(u'log').callprop(u'debug', Js(u'End set AST')) + PyJs_addAst_128_._set_name(u'addAst') + var.get(u'File').get(u'prototype').put(u'addAst', PyJs_addAst_128_) + @Js + def PyJs_transform_129_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'transform':PyJs_transform_129_}, var) + var.registers([u'i', u'visitor', u'pluginPasses']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u"this").get(u'pluginPasses').get(u'length')): + try: + var.put(u'pluginPasses', var.get(u"this").get(u'pluginPasses').get(var.get(u'i'))) + var.get(u"this").callprop(u'call', Js(u'pre'), var.get(u'pluginPasses')) + var.get(u"this").get(u'log').callprop(u'debug', Js(u'Start transform traverse')) + var.put(u'visitor', var.get(u'_babelTraverse2').get(u'default').get(u'visitors').callprop(u'merge', var.get(u"this").get(u'pluginVisitors').get(var.get(u'i')), var.get(u'pluginPasses'), var.get(u"this").get(u'opts').get(u'wrapPluginVisitorMethod'))) + PyJsComma(Js(0.0),var.get(u'_babelTraverse2').get(u'default'))(var.get(u"this").get(u'ast'), var.get(u'visitor'), var.get(u"this").get(u'scope')) + var.get(u"this").get(u'log').callprop(u'debug', Js(u'End transform traverse')) + var.get(u"this").callprop(u'call', Js(u'post'), var.get(u'pluginPasses')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u"this").callprop(u'generate') + PyJs_transform_129_._set_name(u'transform') + var.get(u'File').get(u'prototype').put(u'transform', PyJs_transform_129_) + @Js + def PyJs_wrap_130_(code, callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'code':code, u'arguments':arguments, u'wrap':PyJs_wrap_130_}, var) + var.registers([u'loc', u'message', u'code', u'newStack', u'callback']) + var.put(u'code', (var.get(u'code')+Js(u''))) + try: + if var.get(u"this").callprop(u'shouldIgnore'): + PyJs_Object_131_ = Js({u'code':var.get(u'code'),u'ignored':var.get(u'true')}) + return var.get(u"this").callprop(u'makeResult', PyJs_Object_131_) + else: + return var.get(u'callback')() + except PyJsException as PyJsTempException: + PyJsHolder_657272_50892639 = var.own.get(u'err') + var.force_own_put(u'err', PyExceptionToJs(PyJsTempException)) + try: + if var.get(u'err').get(u'_babel'): + PyJsTempException = JsToPyException(var.get(u'err')) + raise PyJsTempException + else: + var.get(u'err').put(u'_babel', var.get(u'true')) + var.put(u'message', var.get(u'err').put(u'message', ((var.get(u"this").get(u'opts').get(u'filename')+Js(u': '))+var.get(u'err').get(u'message')))) + var.put(u'loc', var.get(u'err').get(u'loc')) + if var.get(u'loc'): + var.get(u'err').put(u'codeFrame', PyJsComma(Js(0.0),var.get(u'_babelCodeFrame2').get(u'default'))(var.get(u'code'), var.get(u'loc').get(u'line'), (var.get(u'loc').get(u'column')+Js(1.0)), var.get(u"this").get(u'opts'))) + var.put(u'message', (Js(u'\n')+var.get(u'err').get(u'codeFrame')), u'+') + if var.get(u'process').get(u'browser'): + var.get(u'err').put(u'message', var.get(u'message')) + if var.get(u'err').get(u'stack'): + var.put(u'newStack', var.get(u'err').get(u'stack').callprop(u'replace', var.get(u'err').get(u'message'), var.get(u'message'))) + var.get(u'err').put(u'stack', var.get(u'newStack')) + PyJsTempException = JsToPyException(var.get(u'err')) + raise PyJsTempException + finally: + if PyJsHolder_657272_50892639 is not None: + var.own[u'err'] = PyJsHolder_657272_50892639 + else: + del var.own[u'err'] + del PyJsHolder_657272_50892639 + PyJs_wrap_130_._set_name(u'wrap') + var.get(u'File').get(u'prototype').put(u'wrap', PyJs_wrap_130_) + @Js + def PyJs_addCode_132_(code, this, arguments, var=var): + var = Scope({u'this':this, u'addCode':PyJs_addCode_132_, u'code':code, u'arguments':arguments}, var) + var.registers([u'code']) + var.put(u'code', ((var.get(u'code') or Js(u''))+Js(u''))) + var.put(u'code', var.get(u"this").callprop(u'parseInputSourceMap', var.get(u'code'))) + var.get(u"this").put(u'code', var.get(u'code')) + PyJs_addCode_132_._set_name(u'addCode') + var.get(u'File').get(u'prototype').put(u'addCode', PyJs_addCode_132_) + @Js + def PyJs_parseCode_133_(this, arguments, var=var): + var = Scope({u'this':this, u'parseCode':PyJs_parseCode_133_, u'arguments':arguments}, var) + var.registers([u'ast']) + var.get(u"this").callprop(u'parseShebang') + var.put(u'ast', var.get(u"this").callprop(u'parse', var.get(u"this").get(u'code'))) + var.get(u"this").callprop(u'addAst', var.get(u'ast')) + PyJs_parseCode_133_._set_name(u'parseCode') + var.get(u'File').get(u'prototype').put(u'parseCode', PyJs_parseCode_133_) + @Js + def PyJs_shouldIgnore_134_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'shouldIgnore':PyJs_shouldIgnore_134_}, var) + var.registers([u'opts']) + var.put(u'opts', var.get(u"this").get(u'opts')) + return var.get(u'util').callprop(u'shouldIgnore', var.get(u'opts').get(u'filename'), var.get(u'opts').get(u'ignore'), var.get(u'opts').get(u'only')) + PyJs_shouldIgnore_134_._set_name(u'shouldIgnore') + var.get(u'File').get(u'prototype').put(u'shouldIgnore', PyJs_shouldIgnore_134_) + @Js + def PyJs_call_135_(key, pluginPasses, this, arguments, var=var): + var = Scope({u'this':this, u'call':PyJs_call_135_, u'pluginPasses':pluginPasses, u'key':key, u'arguments':arguments}, var) + var.registers([u'_isArray3', u'pluginPasses', u'plugin', u'_ref3', u'_i3', u'fn', u'key', u'pass', u'_iterator3']) + #for JS loop + var.put(u'_iterator3', var.get(u'pluginPasses')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'pass', var.get(u'_ref3')) + var.put(u'plugin', var.get(u'pass').get(u'plugin')) + var.put(u'fn', var.get(u'plugin').get(var.get(u'key'))) + if var.get(u'fn'): + var.get(u'fn').callprop(u'call', var.get(u'pass'), var.get(u"this")) + + PyJs_call_135_._set_name(u'call') + var.get(u'File').get(u'prototype').put(u'call', PyJs_call_135_) + @Js + def PyJs_parseInputSourceMap_136_(code, this, arguments, var=var): + var = Scope({u'this':this, u'parseInputSourceMap':PyJs_parseInputSourceMap_136_, u'code':code, u'arguments':arguments}, var) + var.registers([u'code', u'inputMap', u'opts']) + var.put(u'opts', var.get(u"this").get(u'opts')) + if PyJsStrictNeq(var.get(u'opts').get(u'inputSourceMap'),Js(False)): + var.put(u'inputMap', var.get(u'_convertSourceMap2').get(u'default').callprop(u'fromSource', var.get(u'code'))) + if var.get(u'inputMap'): + var.get(u'opts').put(u'inputSourceMap', var.get(u'inputMap').callprop(u'toObject')) + var.put(u'code', var.get(u'_convertSourceMap2').get(u'default').callprop(u'removeComments', var.get(u'code'))) + return var.get(u'code') + PyJs_parseInputSourceMap_136_._set_name(u'parseInputSourceMap') + var.get(u'File').get(u'prototype').put(u'parseInputSourceMap', PyJs_parseInputSourceMap_136_) + @Js + def PyJs_parseShebang_137_(this, arguments, var=var): + var = Scope({u'this':this, u'parseShebang':PyJs_parseShebang_137_, u'arguments':arguments}, var) + var.registers([u'shebangMatch']) + var.put(u'shebangMatch', var.get(u'shebangRegex').callprop(u'exec', var.get(u"this").get(u'code'))) + if var.get(u'shebangMatch'): + var.get(u"this").put(u'shebang', var.get(u'shebangMatch').get(u'0')) + var.get(u"this").put(u'code', var.get(u"this").get(u'code').callprop(u'replace', var.get(u'shebangRegex'), Js(u''))) + PyJs_parseShebang_137_._set_name(u'parseShebang') + var.get(u'File').get(u'prototype').put(u'parseShebang', PyJs_parseShebang_137_) + @Js + def PyJs_makeResult_138_(_ref4, this, arguments, var=var): + var = Scope({u'this':this, u'makeResult':PyJs_makeResult_138_, u'_ref4':_ref4, u'arguments':arguments}, var) + var.registers([u'ignored', u'code', u'map', u'_ref4', u'ast', u'result']) + var.put(u'code', var.get(u'_ref4').get(u'code')) + var.put(u'map', var.get(u'_ref4').get(u'map')) + var.put(u'ast', var.get(u'_ref4').get(u'ast')) + var.put(u'ignored', var.get(u'_ref4').get(u'ignored')) + PyJs_Object_139_ = Js({u'metadata':var.get(u"null"),u'options':var.get(u"this").get(u'opts'),u'ignored':var.get(u'ignored').neg().neg(),u'code':var.get(u"null"),u'ast':var.get(u"null"),u'map':(var.get(u'map') or var.get(u"null"))}) + var.put(u'result', PyJs_Object_139_) + if var.get(u"this").get(u'opts').get(u'code'): + var.get(u'result').put(u'code', var.get(u'code')) + if var.get(u"this").get(u'opts').get(u'ast'): + var.get(u'result').put(u'ast', var.get(u'ast')) + if var.get(u"this").get(u'opts').get(u'metadata'): + var.get(u'result').put(u'metadata', var.get(u"this").get(u'metadata')) + return var.get(u'result') + PyJs_makeResult_138_._set_name(u'makeResult') + var.get(u'File').get(u'prototype').put(u'makeResult', PyJs_makeResult_138_) + @Js + def PyJs_generate_140_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'generate':PyJs_generate_140_}, var) + var.registers([u'_result', u'generator', u'ast', u'result', u'dirname', u'gen', u'opts']) + var.put(u'opts', var.get(u"this").get(u'opts')) + var.put(u'ast', var.get(u"this").get(u'ast')) + PyJs_Object_141_ = Js({u'ast':var.get(u'ast')}) + var.put(u'result', PyJs_Object_141_) + if var.get(u'opts').get(u'code').neg(): + return var.get(u"this").callprop(u'makeResult', var.get(u'result')) + var.put(u'gen', var.get(u'_babelGenerator2').get(u'default')) + if var.get(u'opts').get(u'generatorOpts').get(u'generator'): + var.put(u'gen', var.get(u'opts').get(u'generatorOpts').get(u'generator')) + if PyJsStrictEq(var.get(u'gen',throw=False).typeof(),Js(u'string')): + var.put(u'dirname', (var.get(u'_path2').get(u'default').callprop(u'dirname', var.get(u"this").get(u'opts').get(u'filename')) or var.get(u'process').callprop(u'cwd'))) + var.put(u'generator', PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))(var.get(u'gen'), var.get(u'dirname'))) + if var.get(u'generator'): + var.put(u'gen', var.get(u'require')(var.get(u'generator')).get(u'print')) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create((((Js(u"Couldn't find generator ")+var.get(u'gen'))+Js(u' with "print" method relative to directory '))+var.get(u'dirname')))) + raise PyJsTempException + var.get(u"this").get(u'log').callprop(u'debug', Js(u'Generation start')) + var.put(u'_result', var.get(u'gen')(var.get(u'ast'), (PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'opts'), var.get(u'opts').get(u'generatorOpts')) if var.get(u'opts').get(u'generatorOpts') else var.get(u'opts')), var.get(u"this").get(u'code'))) + var.get(u'result').put(u'code', var.get(u'_result').get(u'code')) + var.get(u'result').put(u'map', var.get(u'_result').get(u'map')) + var.get(u"this").get(u'log').callprop(u'debug', Js(u'Generation end')) + if var.get(u"this").get(u'shebang'): + var.get(u'result').put(u'code', ((var.get(u"this").get(u'shebang')+Js(u'\n'))+var.get(u'result').get(u'code'))) + if var.get(u'result').get(u'map'): + var.get(u'result').put(u'map', var.get(u"this").callprop(u'mergeSourceMap', var.get(u'result').get(u'map'))) + if (PyJsStrictEq(var.get(u'opts').get(u'sourceMaps'),Js(u'inline')) or PyJsStrictEq(var.get(u'opts').get(u'sourceMaps'),Js(u'both'))): + var.get(u'result').put(u'code', (Js(u'\n')+var.get(u'_convertSourceMap2').get(u'default').callprop(u'fromObject', var.get(u'result').get(u'map')).callprop(u'toComment')), u'+') + if PyJsStrictEq(var.get(u'opts').get(u'sourceMaps'),Js(u'inline')): + var.get(u'result').put(u'map', var.get(u"null")) + return var.get(u"this").callprop(u'makeResult', var.get(u'result')) + PyJs_generate_140_._set_name(u'generate') + var.get(u'File').get(u'prototype').put(u'generate', PyJs_generate_140_) + return var.get(u'File') + PyJs_anonymous_86_._set_name(u'anonymous') + var.put(u'File', PyJs_anonymous_86_(var.get(u'_store2').get(u'default'))) + var.get(u'exports').put(u'default', var.get(u'File')) + var.get(u'exports').put(u'File', var.get(u'File')) + PyJs_anonymous_81_._set_name(u'anonymous') + PyJs_anonymous_81_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_80_._set_name(u'anonymous') +PyJs_Object_142_ = Js({u'../../helpers/resolve':Js(9.0),u'../../store':Js(10.0),u'../../util':Js(26.0),u'../internal-plugins/block-hoist':Js(21.0),u'../internal-plugins/shadow-functions':Js(22.0),u'../plugin-pass':Js(24.0),u'./logger':Js(13.0),u'./metadata':Js(14.0),u'./options/option-manager':Js(18.0),u'_process':Js(531.0),u'babel-code-frame':Js(4.0),u'babel-generator':Js(40.0),u'babel-helpers':Js(56.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/object/assign':Js(100.0),u'babel-runtime/core-js/object/create':Js(101.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-runtime/helpers/inherits':Js(111.0),u'babel-runtime/helpers/possibleConstructorReturn':Js(113.0),u'babel-runtime/helpers/typeof':Js(114.0),u'babel-traverse':Js(225.0),u'babel-types':Js(258.0),u'babylon':Js(262.0),u'convert-source-map':Js(267.0),u'lodash/defaults':Js(442.0),u'path':Js(530.0),u'source-map':Js(519.0)}) +@Js +def PyJs_anonymous_143_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'seenDeprecatedMessages', u'require', u'module', u'_node2', u'_node', u'verboseDebug', u'_interopRequireDefault', u'generalDebug', u'_classCallCheck3', u'_classCallCheck2', u'Logger']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_144_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_144_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_node', var.get(u'require')(Js(u'debug/node'))) + var.put(u'_node2', var.get(u'_interopRequireDefault')(var.get(u'_node'))) + pass + var.put(u'verboseDebug', PyJsComma(Js(0.0),var.get(u'_node2').get(u'default'))(Js(u'babel:verbose'))) + var.put(u'generalDebug', PyJsComma(Js(0.0),var.get(u'_node2').get(u'default'))(Js(u'babel'))) + var.put(u'seenDeprecatedMessages', Js([])) + @Js + def PyJs_anonymous_145_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Logger']) + @Js + def PyJsHoisted_Logger_(file, filename, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'file':file, u'filename':filename}, var) + var.registers([u'file', u'filename']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Logger')) + var.get(u"this").put(u'filename', var.get(u'filename')) + var.get(u"this").put(u'file', var.get(u'file')) + PyJsHoisted_Logger_.func_name = u'Logger' + var.put(u'Logger', PyJsHoisted_Logger_) + pass + @Js + def PyJs__buildMessage_146_(msg, this, arguments, var=var): + var = Scope({u'msg':msg, u'this':this, u'_buildMessage':PyJs__buildMessage_146_, u'arguments':arguments}, var) + var.registers([u'msg', u'parts']) + var.put(u'parts', (Js(u'[BABEL] ')+var.get(u"this").get(u'filename'))) + if var.get(u'msg'): + var.put(u'parts', (Js(u': ')+var.get(u'msg')), u'+') + return var.get(u'parts') + PyJs__buildMessage_146_._set_name(u'_buildMessage') + var.get(u'Logger').get(u'prototype').put(u'_buildMessage', PyJs__buildMessage_146_) + @Js + def PyJs_warn_147_(msg, this, arguments, var=var): + var = Scope({u'msg':msg, u'this':this, u'warn':PyJs_warn_147_, u'arguments':arguments}, var) + var.registers([u'msg']) + var.get(u'console').callprop(u'warn', var.get(u"this").callprop(u'_buildMessage', var.get(u'msg'))) + PyJs_warn_147_._set_name(u'warn') + var.get(u'Logger').get(u'prototype').put(u'warn', PyJs_warn_147_) + @Js + def PyJs_error_148_(msg, this, arguments, var=var): + var = Scope({u'msg':msg, u'this':this, u'arguments':arguments, u'error':PyJs_error_148_}, var) + var.registers([u'msg', u'Constructor']) + var.put(u'Constructor', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else var.get(u'Error'))) + PyJsTempException = JsToPyException(var.get(u'Constructor').create(var.get(u"this").callprop(u'_buildMessage', var.get(u'msg')))) + raise PyJsTempException + PyJs_error_148_._set_name(u'error') + var.get(u'Logger').get(u'prototype').put(u'error', PyJs_error_148_) + @Js + def PyJs_deprecate_149_(msg, this, arguments, var=var): + var = Scope({u'msg':msg, u'this':this, u'deprecate':PyJs_deprecate_149_, u'arguments':arguments}, var) + var.registers([u'msg']) + if (var.get(u"this").get(u'file').get(u'opts') and var.get(u"this").get(u'file').get(u'opts').get(u'suppressDeprecationMessages')): + return var.get('undefined') + var.put(u'msg', var.get(u"this").callprop(u'_buildMessage', var.get(u'msg'))) + if (var.get(u'seenDeprecatedMessages').callprop(u'indexOf', var.get(u'msg'))>=Js(0.0)): + return var.get('undefined') + var.get(u'seenDeprecatedMessages').callprop(u'push', var.get(u'msg')) + var.get(u'console').callprop(u'error', var.get(u'msg')) + PyJs_deprecate_149_._set_name(u'deprecate') + var.get(u'Logger').get(u'prototype').put(u'deprecate', PyJs_deprecate_149_) + @Js + def PyJs_verbose_150_(msg, this, arguments, var=var): + var = Scope({u'msg':msg, u'this':this, u'arguments':arguments, u'verbose':PyJs_verbose_150_}, var) + var.registers([u'msg']) + if var.get(u'verboseDebug').get(u'enabled'): + var.get(u'verboseDebug')(var.get(u"this").callprop(u'_buildMessage', var.get(u'msg'))) + PyJs_verbose_150_._set_name(u'verbose') + var.get(u'Logger').get(u'prototype').put(u'verbose', PyJs_verbose_150_) + @Js + def PyJs_debug_151_(msg, this, arguments, var=var): + var = Scope({u'msg':msg, u'this':this, u'arguments':arguments, u'debug':PyJs_debug_151_}, var) + var.registers([u'msg']) + if var.get(u'generalDebug').get(u'enabled'): + var.get(u'generalDebug')(var.get(u"this").callprop(u'_buildMessage', var.get(u'msg'))) + PyJs_debug_151_._set_name(u'debug') + var.get(u'Logger').get(u'prototype').put(u'debug', PyJs_debug_151_) + @Js + def PyJs_deopt_152_(node, msg, this, arguments, var=var): + var = Scope({u'node':node, u'msg':msg, u'this':this, u'arguments':arguments, u'deopt':PyJs_deopt_152_}, var) + var.registers([u'node', u'msg']) + var.get(u"this").callprop(u'debug', var.get(u'msg')) + PyJs_deopt_152_._set_name(u'deopt') + var.get(u'Logger').get(u'prototype').put(u'deopt', PyJs_deopt_152_) + return var.get(u'Logger') + PyJs_anonymous_145_._set_name(u'anonymous') + var.put(u'Logger', PyJs_anonymous_145_()) + var.get(u'exports').put(u'default', var.get(u'Logger')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_143_._set_name(u'anonymous') +PyJs_Object_153_ = Js({u'babel-runtime/helpers/classCallCheck':Js(110.0),u'debug/node':Js(270.0)}) +@Js +def PyJs_anonymous_154_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'ExportDeclaration', u'ModuleDeclaration', u'_interopRequireWildcard', u'ImportDeclaration', u'require', u'_babelTypes', u'module', u't', u'_interopRequireDefault', u'Scope', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_156_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_156_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_Scope_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJsHoisted_Scope_.func_name = u'Scope' + var.put(u'Scope', PyJsHoisted_Scope_) + @Js + def PyJsHoisted_ExportDeclaration_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file}, var) + var.registers([u'node', u'specifier', u'exports', u'name', u'_i2', u'_ref2', u'source', u'declar', u'_isArray2', u'exported', u'file', u'path', u'bindings', u'local', u'_iterator2']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'source', (var.get(u'node').get(u'source').get(u'value') if var.get(u'node').get(u'source') else var.get(u"null"))) + var.put(u'exports', var.get(u'file').get(u'metadata').get(u'modules').get(u'exports')) + var.put(u'declar', var.get(u'path').callprop(u'get', Js(u'declaration'))) + if var.get(u'declar').callprop(u'isStatement'): + var.put(u'bindings', var.get(u'declar').callprop(u'getBindingIdentifiers')) + for PyJsTemp in var.get(u'bindings'): + var.put(u'name', PyJsTemp) + var.get(u'exports').get(u'exported').callprop(u'push', var.get(u'name')) + PyJs_Object_165_ = Js({u'kind':Js(u'local'),u'local':var.get(u'name'),u'exported':(Js(u'default') if var.get(u'path').callprop(u'isExportDefaultDeclaration') else var.get(u'name'))}) + var.get(u'exports').get(u'specifiers').callprop(u'push', PyJs_Object_165_) + if (var.get(u'path').callprop(u'isExportNamedDeclaration') and var.get(u'node').get(u'specifiers')): + #for JS loop + var.put(u'_iterator2', var.get(u'node').get(u'specifiers')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'specifier', var.get(u'_ref2')) + var.put(u'exported', var.get(u'specifier').get(u'exported').get(u'name')) + var.get(u'exports').get(u'exported').callprop(u'push', var.get(u'exported')) + if var.get(u't').callprop(u'isExportDefaultSpecifier', var.get(u'specifier')): + PyJs_Object_166_ = Js({u'kind':Js(u'external'),u'local':var.get(u'exported'),u'exported':var.get(u'exported'),u'source':var.get(u'source')}) + var.get(u'exports').get(u'specifiers').callprop(u'push', PyJs_Object_166_) + if var.get(u't').callprop(u'isExportNamespaceSpecifier', var.get(u'specifier')): + PyJs_Object_167_ = Js({u'kind':Js(u'external-namespace'),u'exported':var.get(u'exported'),u'source':var.get(u'source')}) + var.get(u'exports').get(u'specifiers').callprop(u'push', PyJs_Object_167_) + var.put(u'local', var.get(u'specifier').get(u'local')) + if var.get(u'local').neg(): + continue + if var.get(u'source'): + PyJs_Object_168_ = Js({u'kind':Js(u'external'),u'local':var.get(u'local').get(u'name'),u'exported':var.get(u'exported'),u'source':var.get(u'source')}) + var.get(u'exports').get(u'specifiers').callprop(u'push', PyJs_Object_168_) + if var.get(u'source').neg(): + PyJs_Object_169_ = Js({u'kind':Js(u'local'),u'local':var.get(u'local').get(u'name'),u'exported':var.get(u'exported')}) + var.get(u'exports').get(u'specifiers').callprop(u'push', PyJs_Object_169_) + + if var.get(u'path').callprop(u'isExportAllDeclaration'): + PyJs_Object_170_ = Js({u'kind':Js(u'external-all'),u'source':var.get(u'source')}) + var.get(u'exports').get(u'specifiers').callprop(u'push', PyJs_Object_170_) + PyJsHoisted_ExportDeclaration_.func_name = u'ExportDeclaration' + var.put(u'ExportDeclaration', PyJsHoisted_ExportDeclaration_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_155_ = Js({}) + var.put(u'newObj', PyJs_Object_155_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'ImportDeclaration', var.get(u'exports').put(u'ModuleDeclaration', var.get(u'undefined'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'ExportDeclaration', var.get(u'ExportDeclaration')) + var.get(u'exports').put(u'Scope', var.get(u'Scope')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + @Js + def PyJs_enter_158_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file, u'enter':PyJs_enter_158_}, var) + var.registers([u'node', u'path', u'file']) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'node').get(u'source'): + var.get(u'node').get(u'source').put(u'value', var.get(u'file').callprop(u'resolveModuleSource', var.get(u'node').get(u'source').get(u'value'))) + PyJs_enter_158_._set_name(u'enter') + PyJs_Object_157_ = Js({u'enter':PyJs_enter_158_}) + var.put(u'ModuleDeclaration', var.get(u'exports').put(u'ModuleDeclaration', PyJs_Object_157_)) + @Js + def PyJs_exit_160_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_160_, u'arguments':arguments, u'file':file}, var) + var.registers([u'node', u'specifiers', u'_isArray', u'imported', u'file', u'specifier', u'_i', u'importedName', u'_iterator', u'_ref', u'path', u'local']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'specifiers', Js([])) + var.put(u'imported', Js([])) + PyJs_Object_161_ = Js({u'source':var.get(u'node').get(u'source').get(u'value'),u'imported':var.get(u'imported'),u'specifiers':var.get(u'specifiers')}) + var.get(u'file').get(u'metadata').get(u'modules').get(u'imports').callprop(u'push', PyJs_Object_161_) + #for JS loop + var.put(u'_iterator', var.get(u'path').callprop(u'get', Js(u'specifiers'))) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'specifier', var.get(u'_ref')) + var.put(u'local', var.get(u'specifier').get(u'node').get(u'local').get(u'name')) + if var.get(u'specifier').callprop(u'isImportDefaultSpecifier'): + var.get(u'imported').callprop(u'push', Js(u'default')) + PyJs_Object_162_ = Js({u'kind':Js(u'named'),u'imported':Js(u'default'),u'local':var.get(u'local')}) + var.get(u'specifiers').callprop(u'push', PyJs_Object_162_) + if var.get(u'specifier').callprop(u'isImportSpecifier'): + var.put(u'importedName', var.get(u'specifier').get(u'node').get(u'imported').get(u'name')) + var.get(u'imported').callprop(u'push', var.get(u'importedName')) + PyJs_Object_163_ = Js({u'kind':Js(u'named'),u'imported':var.get(u'importedName'),u'local':var.get(u'local')}) + var.get(u'specifiers').callprop(u'push', PyJs_Object_163_) + if var.get(u'specifier').callprop(u'isImportNamespaceSpecifier'): + var.get(u'imported').callprop(u'push', Js(u'*')) + PyJs_Object_164_ = Js({u'kind':Js(u'namespace'),u'local':var.get(u'local')}) + var.get(u'specifiers').callprop(u'push', PyJs_Object_164_) + + PyJs_exit_160_._set_name(u'exit') + PyJs_Object_159_ = Js({u'exit':PyJs_exit_160_}) + var.put(u'ImportDeclaration', var.get(u'exports').put(u'ImportDeclaration', PyJs_Object_159_)) + pass + pass +PyJs_anonymous_154_._set_name(u'anonymous') +PyJs_Object_171_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_172_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_173_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'_resolve', u'existsCache', u'exists', u'_fs', u'process', u'buildConfigChain', u'_json2', u'_interopRequireDefault', u'_fs2', u'BABELIGNORE_FILENAME', u'_json', u'PACKAGE_FILENAME', u'jsonCache', u'_classCallCheck3', u'_classCallCheck2', u'_assign', u'BABELRC_FILENAME', u'_pathIsAbsolute2', u'_path2', u'_assign2', u'_resolve2', u'_pathIsAbsolute', u'ConfigChainBuilder', u'_path']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_174_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_174_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_buildConfigChain_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'builder', u'log', u'opts', u'filename']) + PyJs_Object_177_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else PyJs_Object_177_)) + var.put(u'log', var.get(u'arguments').get(u'1')) + var.put(u'filename', var.get(u'opts').get(u'filename')) + var.put(u'builder', var.get(u'ConfigChainBuilder').create(var.get(u'log'))) + if PyJsStrictNeq(var.get(u'opts').get(u'babelrc'),Js(False)): + var.get(u'builder').callprop(u'findConfigs', var.get(u'filename')) + PyJs_Object_178_ = Js({u'options':var.get(u'opts'),u'alias':Js(u'base'),u'dirname':(var.get(u'filename') and var.get(u'_path2').get(u'default').callprop(u'dirname', var.get(u'filename')))}) + var.get(u'builder').callprop(u'mergeConfig', PyJs_Object_178_) + return var.get(u'builder').get(u'configs') + PyJsHoisted_buildConfigChain_.func_name = u'buildConfigChain' + var.put(u'buildConfigChain', PyJsHoisted_buildConfigChain_) + @Js + def PyJsHoisted_exists_(filename, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'filename':filename}, var) + var.registers([u'cached', u'filename']) + var.put(u'cached', var.get(u'existsCache').get(var.get(u'filename'))) + if (var.get(u'cached')==var.get(u"null")): + return var.get(u'existsCache').put(var.get(u'filename'), var.get(u'_fs2').get(u'default').callprop(u'existsSync', var.get(u'filename'))) + else: + return var.get(u'cached') + PyJsHoisted_exists_.func_name = u'exists' + var.put(u'exists', PyJsHoisted_exists_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_assign', var.get(u'require')(Js(u'babel-runtime/core-js/object/assign'))) + var.put(u'_assign2', var.get(u'_interopRequireDefault')(var.get(u'_assign'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.get(u'exports').put(u'default', var.get(u'buildConfigChain')) + var.put(u'_resolve', var.get(u'require')(Js(u'../../../helpers/resolve'))) + var.put(u'_resolve2', var.get(u'_interopRequireDefault')(var.get(u'_resolve'))) + var.put(u'_json', var.get(u'require')(Js(u'json5'))) + var.put(u'_json2', var.get(u'_interopRequireDefault')(var.get(u'_json'))) + var.put(u'_pathIsAbsolute', var.get(u'require')(Js(u'path-is-absolute'))) + var.put(u'_pathIsAbsolute2', var.get(u'_interopRequireDefault')(var.get(u'_pathIsAbsolute'))) + var.put(u'_path', var.get(u'require')(Js(u'path'))) + var.put(u'_path2', var.get(u'_interopRequireDefault')(var.get(u'_path'))) + var.put(u'_fs', var.get(u'require')(Js(u'fs'))) + var.put(u'_fs2', var.get(u'_interopRequireDefault')(var.get(u'_fs'))) + pass + PyJs_Object_175_ = Js({}) + var.put(u'existsCache', PyJs_Object_175_) + PyJs_Object_176_ = Js({}) + var.put(u'jsonCache', PyJs_Object_176_) + var.put(u'BABELIGNORE_FILENAME', Js(u'.babelignore')) + var.put(u'BABELRC_FILENAME', Js(u'.babelrc')) + var.put(u'PACKAGE_FILENAME', Js(u'package.json')) + pass + pass + @Js + def PyJs_anonymous_179_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'ConfigChainBuilder']) + @Js + def PyJsHoisted_ConfigChainBuilder_(log, this, arguments, var=var): + var = Scope({u'this':this, u'log':log, u'arguments':arguments}, var) + var.registers([u'log']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'ConfigChainBuilder')) + var.get(u"this").put(u'resolvedConfigs', Js([])) + var.get(u"this").put(u'configs', Js([])) + var.get(u"this").put(u'log', var.get(u'log')) + PyJsHoisted_ConfigChainBuilder_.func_name = u'ConfigChainBuilder' + var.put(u'ConfigChainBuilder', PyJsHoisted_ConfigChainBuilder_) + pass + @Js + def PyJs_findConfigs_180_(loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'arguments':arguments, u'findConfigs':PyJs_findConfigs_180_}, var) + var.registers([u'loc', u'ignoreLoc', u'foundIgnore', u'pkgLoc', u'foundConfig', u'configLoc']) + if var.get(u'loc').neg(): + return var.get('undefined') + if PyJsComma(Js(0.0),var.get(u'_pathIsAbsolute2').get(u'default'))(var.get(u'loc')).neg(): + var.put(u'loc', var.get(u'_path2').get(u'default').callprop(u'join', var.get(u'process').callprop(u'cwd'), var.get(u'loc'))) + var.put(u'foundConfig', Js(False)) + var.put(u'foundIgnore', Js(False)) + while PyJsStrictNeq(var.get(u'loc'),var.put(u'loc', var.get(u'_path2').get(u'default').callprop(u'dirname', var.get(u'loc')))): + if var.get(u'foundConfig').neg(): + var.put(u'configLoc', var.get(u'_path2').get(u'default').callprop(u'join', var.get(u'loc'), var.get(u'BABELRC_FILENAME'))) + if var.get(u'exists')(var.get(u'configLoc')): + var.get(u"this").callprop(u'addConfig', var.get(u'configLoc')) + var.put(u'foundConfig', var.get(u'true')) + var.put(u'pkgLoc', var.get(u'_path2').get(u'default').callprop(u'join', var.get(u'loc'), var.get(u'PACKAGE_FILENAME'))) + if (var.get(u'foundConfig').neg() and var.get(u'exists')(var.get(u'pkgLoc'))): + var.put(u'foundConfig', var.get(u"this").callprop(u'addConfig', var.get(u'pkgLoc'), Js(u'babel'), var.get(u'JSON'))) + if var.get(u'foundIgnore').neg(): + var.put(u'ignoreLoc', var.get(u'_path2').get(u'default').callprop(u'join', var.get(u'loc'), var.get(u'BABELIGNORE_FILENAME'))) + if var.get(u'exists')(var.get(u'ignoreLoc')): + var.get(u"this").callprop(u'addIgnoreConfig', var.get(u'ignoreLoc')) + var.put(u'foundIgnore', var.get(u'true')) + if (var.get(u'foundIgnore') and var.get(u'foundConfig')): + return var.get('undefined') + PyJs_findConfigs_180_._set_name(u'findConfigs') + var.get(u'ConfigChainBuilder').get(u'prototype').put(u'findConfigs', PyJs_findConfigs_180_) + @Js + def PyJs_addIgnoreConfig_181_(loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'arguments':arguments, u'addIgnoreConfig':PyJs_addIgnoreConfig_181_}, var) + var.registers([u'loc', u'lines', u'file']) + var.put(u'file', var.get(u'_fs2').get(u'default').callprop(u'readFileSync', var.get(u'loc'), Js(u'utf8'))) + var.put(u'lines', var.get(u'file').callprop(u'split', Js(u'\n'))) + @Js + def PyJs_anonymous_182_(line, this, arguments, var=var): + var = Scope({u'this':this, u'line':line, u'arguments':arguments}, var) + var.registers([u'line']) + return var.get(u'line').neg().neg() + PyJs_anonymous_182_._set_name(u'anonymous') + @Js + def PyJs_anonymous_183_(line, this, arguments, var=var): + var = Scope({u'this':this, u'line':line, u'arguments':arguments}, var) + var.registers([u'line']) + return var.get(u'line').callprop(u'replace', JsRegExp(u'/#(.*?)$/'), Js(u'')).callprop(u'trim') + PyJs_anonymous_183_._set_name(u'anonymous') + var.put(u'lines', var.get(u'lines').callprop(u'map', PyJs_anonymous_183_).callprop(u'filter', PyJs_anonymous_182_)) + if var.get(u'lines').get(u'length'): + PyJs_Object_185_ = Js({u'ignore':var.get(u'lines')}) + PyJs_Object_184_ = Js({u'options':PyJs_Object_185_,u'alias':var.get(u'loc'),u'dirname':var.get(u'_path2').get(u'default').callprop(u'dirname', var.get(u'loc'))}) + var.get(u"this").callprop(u'mergeConfig', PyJs_Object_184_) + PyJs_addIgnoreConfig_181_._set_name(u'addIgnoreConfig') + var.get(u'ConfigChainBuilder').get(u'prototype').put(u'addIgnoreConfig', PyJs_addIgnoreConfig_181_) + @Js + def PyJs_addConfig_186_(loc, key, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'addConfig':PyJs_addConfig_186_, u'arguments':arguments, u'key':key}, var) + var.registers([u'content', u'loc', u'json', u'options', u'key']) + var.put(u'json', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else var.get(u'_json2').get(u'default'))) + if (var.get(u"this").get(u'resolvedConfigs').callprop(u'indexOf', var.get(u'loc'))>=Js(0.0)): + return Js(False) + var.get(u"this").get(u'resolvedConfigs').callprop(u'push', var.get(u'loc')) + var.put(u'content', var.get(u'_fs2').get(u'default').callprop(u'readFileSync', var.get(u'loc'), Js(u'utf8'))) + var.put(u'options', PyJsComma(Js(0.0), Js(None))) + try: + var.put(u'options', var.get(u'jsonCache').put(var.get(u'content'), (var.get(u'jsonCache').get(var.get(u'content')) or var.get(u'json').callprop(u'parse', var.get(u'content'))))) + if var.get(u'key'): + var.put(u'options', var.get(u'options').get(var.get(u'key'))) + except PyJsException as PyJsTempException: + PyJsHolder_657272_93340872 = var.own.get(u'err') + var.force_own_put(u'err', PyExceptionToJs(PyJsTempException)) + try: + var.get(u'err').put(u'message', ((var.get(u'loc')+Js(u': Error while parsing JSON - '))+var.get(u'err').get(u'message'))) + PyJsTempException = JsToPyException(var.get(u'err')) + raise PyJsTempException + finally: + if PyJsHolder_657272_93340872 is not None: + var.own[u'err'] = PyJsHolder_657272_93340872 + else: + del var.own[u'err'] + del PyJsHolder_657272_93340872 + PyJs_Object_187_ = Js({u'options':var.get(u'options'),u'alias':var.get(u'loc'),u'dirname':var.get(u'_path2').get(u'default').callprop(u'dirname', var.get(u'loc'))}) + var.get(u"this").callprop(u'mergeConfig', PyJs_Object_187_) + return var.get(u'options').neg().neg() + PyJs_addConfig_186_._set_name(u'addConfig') + var.get(u'ConfigChainBuilder').get(u'prototype').put(u'addConfig', PyJs_addConfig_186_) + @Js + def PyJs_mergeConfig_188_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments, u'mergeConfig':PyJs_mergeConfig_188_}, var) + var.registers([u'loc', u'envOpts', u'alias', u'envKey', u'extendsLoc', u'_ref', u'dirname', u'options']) + var.put(u'options', var.get(u'_ref').get(u'options')) + var.put(u'alias', var.get(u'_ref').get(u'alias')) + var.put(u'loc', var.get(u'_ref').get(u'loc')) + var.put(u'dirname', var.get(u'_ref').get(u'dirname')) + if var.get(u'options').neg(): + return Js(False) + PyJs_Object_189_ = Js({}) + var.put(u'options', PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(PyJs_Object_189_, var.get(u'options'))) + var.put(u'dirname', (var.get(u'dirname') or var.get(u'process').callprop(u'cwd'))) + var.put(u'loc', (var.get(u'loc') or var.get(u'alias'))) + if var.get(u'options').get(u'extends'): + var.put(u'extendsLoc', PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))(var.get(u'options').get(u'extends'), var.get(u'dirname'))) + if var.get(u'extendsLoc'): + var.get(u"this").callprop(u'addConfig', var.get(u'extendsLoc')) + else: + if var.get(u"this").get(u'log'): + var.get(u"this").get(u'log').callprop(u'error', (((Js(u"Couldn't resolve extends clause of ")+var.get(u'options').get(u'extends'))+Js(u' in '))+var.get(u'alias'))) + var.get(u'options').delete(u'extends') + PyJs_Object_190_ = Js({u'options':var.get(u'options'),u'alias':var.get(u'alias'),u'loc':var.get(u'loc'),u'dirname':var.get(u'dirname')}) + var.get(u"this").get(u'configs').callprop(u'push', PyJs_Object_190_) + var.put(u'envOpts', PyJsComma(Js(0.0), Js(None))) + var.put(u'envKey', ((var.get(u'process').get(u'env').get(u'BABEL_ENV') or var.get(u'process').get(u'env').get(u'NODE_ENV')) or Js(u'development'))) + if var.get(u'options').get(u'env'): + var.put(u'envOpts', var.get(u'options').get(u'env').get(var.get(u'envKey'))) + var.get(u'options').delete(u'env') + PyJs_Object_191_ = Js({u'options':var.get(u'envOpts'),u'alias':((var.get(u'alias')+Js(u'.env.'))+var.get(u'envKey')),u'dirname':var.get(u'dirname')}) + var.get(u"this").callprop(u'mergeConfig', PyJs_Object_191_) + PyJs_mergeConfig_188_._set_name(u'mergeConfig') + var.get(u'ConfigChainBuilder').get(u'prototype').put(u'mergeConfig', PyJs_mergeConfig_188_) + return var.get(u'ConfigChainBuilder') + PyJs_anonymous_179_._set_name(u'anonymous') + var.put(u'ConfigChainBuilder', PyJs_anonymous_179_()) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) + PyJs_anonymous_173_._set_name(u'anonymous') + PyJs_anonymous_173_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_172_._set_name(u'anonymous') +PyJs_Object_192_ = Js({u'../../../helpers/resolve':Js(9.0),u'_process':Js(531.0),u'babel-runtime/core-js/object/assign':Js(100.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'fs':Js(523.0),u'json5':Js(284.0),u'path':Js(530.0),u'path-is-absolute':Js(499.0)}) +@Js +def PyJs_anonymous_193_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + PyJs_Object_195_ = Js({u'type':Js(u'filename'),u'description':Js(u'filename to use when reading from stdin - this will be used in source-maps, errors etc'),u'default':Js(u'unknown'),u'shorthand':Js(u'f')}) + PyJs_Object_196_ = Js({u'hidden':var.get(u'true'),u'type':Js(u'string')}) + PyJs_Object_197_ = Js({u'hidden':var.get(u'true')}) + PyJs_Object_199_ = Js({}) + PyJs_Object_198_ = Js({u'hidden':var.get(u'true'),u'default':PyJs_Object_199_}) + PyJs_Object_200_ = Js({u'description':Js(u''),u'hidden':var.get(u'true')}) + PyJs_Object_201_ = Js({u'type':Js(u'boolean'),u'default':Js(False),u'description':Js(u'retain line numbers - will result in really ugly code')}) + PyJs_Object_202_ = Js({u'description':Js(u'enable/disable ANSI syntax highlighting of code frames (on by default)'),u'type':Js(u'boolean'),u'default':var.get(u'true')}) + PyJs_Object_203_ = Js({u'type':Js(u'boolean'),u'default':Js(False),u'hidden':var.get(u'true')}) + PyJs_Object_204_ = Js({u'type':Js(u'list'),u'description':Js(u''),u'default':Js([])}) + PyJs_Object_205_ = Js({u'type':Js(u'list'),u'default':Js([]),u'description':Js(u'')}) + PyJs_Object_206_ = Js({u'type':Js(u'list'),u'description':Js(u'list of glob paths to **not** compile'),u'default':Js([])}) + PyJs_Object_207_ = Js({u'type':Js(u'list'),u'description':Js(u'list of glob paths to **only** compile')}) + PyJs_Object_208_ = Js({u'hidden':var.get(u'true'),u'default':var.get(u'true'),u'type':Js(u'boolean')}) + PyJs_Object_209_ = Js({u'hidden':var.get(u'true'),u'default':var.get(u'true'),u'type':Js(u'boolean')}) + PyJs_Object_210_ = Js({u'hidden':var.get(u'true'),u'default':var.get(u'true'),u'type':Js(u'boolean')}) + PyJs_Object_211_ = Js({u'type':Js(u'string'),u'hidden':var.get(u'true')}) + PyJs_Object_212_ = Js({u'type':Js(u'boolean'),u'default':var.get(u'true'),u'description':Js(u'write comments to generated output (true by default)')}) + PyJs_Object_213_ = Js({u'hidden':var.get(u'true'),u'description':Js(u'optional callback to control whether a comment should be inserted, when this is used the comments option is ignored')}) + PyJs_Object_214_ = Js({u'hidden':var.get(u'true'),u'description':Js(u'optional callback to wrap all visitor methods')}) + PyJs_Object_215_ = Js({u'type':Js(u'booleanString'),u'default':Js(u'auto'),u'description':Js(u'do not include superfluous whitespace characters and line terminators [true|false|auto]')}) + PyJs_Object_216_ = Js({u'type':Js(u'boolean'),u'default':Js(False),u'description':Js(u'save as much bytes when printing [true|false]')}) + PyJs_Object_217_ = Js({u'alias':Js(u'sourceMaps'),u'hidden':var.get(u'true')}) + PyJs_Object_218_ = Js({u'type':Js(u'booleanString'),u'description':Js(u'[true|false|inline]'),u'default':Js(False),u'shorthand':Js(u's')}) + PyJs_Object_219_ = Js({u'type':Js(u'string'),u'description':Js(u'set `file` on returned source map')}) + PyJs_Object_220_ = Js({u'type':Js(u'string'),u'description':Js(u'set `sources[0]` on returned source map')}) + PyJs_Object_221_ = Js({u'type':Js(u'filename'),u'description':Js(u'the root from which all sources are relative')}) + PyJs_Object_222_ = Js({u'description':Js(u'Whether or not to look up .babelrc and .babelignore files'),u'type':Js(u'boolean'),u'default':var.get(u'true')}) + PyJs_Object_223_ = Js({u'description':Js(u''),u'default':Js(u'module')}) + PyJs_Object_224_ = Js({u'type':Js(u'string'),u'description':Js(u'print a comment before any injected non-user code')}) + PyJs_Object_225_ = Js({u'type':Js(u'string'),u'description':Js(u'print a comment after any injected non-user code')}) + PyJs_Object_226_ = Js({u'hidden':var.get(u'true')}) + PyJs_Object_227_ = Js({u'hidden':var.get(u'true')}) + PyJs_Object_228_ = Js({u'type':Js(u'filename'),u'description':Js(u'optional prefix for the AMD module formatter that will be prepend to the filename on module definitions')}) + PyJs_Object_229_ = Js({u'type':Js(u'boolean'),u'default':Js(False),u'shorthand':Js(u'M'),u'description':Js(u'insert an explicit id for modules')}) + PyJs_Object_230_ = Js({u'description':Js(u'specify a custom name for module ids'),u'type':Js(u'string')}) + PyJs_Object_231_ = Js({u'description':Js(u'Whether to spawn a traversal pass per a preset. By default all presets are merged.'),u'type':Js(u'boolean'),u'default':Js(False),u'hidden':var.get(u'true')}) + PyJs_Object_232_ = Js({u'description':Js(u'Options to pass into the parser, or to change parsers (parserOpts.parser)'),u'default':Js(False)}) + PyJs_Object_233_ = Js({u'description':Js(u'Options to pass into the generator, or to change generators (generatorOpts.generator)'),u'default':Js(False)}) + PyJs_Object_194_ = Js({u'filename':PyJs_Object_195_,u'filenameRelative':PyJs_Object_196_,u'inputSourceMap':PyJs_Object_197_,u'env':PyJs_Object_198_,u'mode':PyJs_Object_200_,u'retainLines':PyJs_Object_201_,u'highlightCode':PyJs_Object_202_,u'suppressDeprecationMessages':PyJs_Object_203_,u'presets':PyJs_Object_204_,u'plugins':PyJs_Object_205_,u'ignore':PyJs_Object_206_,u'only':PyJs_Object_207_,u'code':PyJs_Object_208_,u'metadata':PyJs_Object_209_,u'ast':PyJs_Object_210_,u'extends':PyJs_Object_211_,u'comments':PyJs_Object_212_,u'shouldPrintComment':PyJs_Object_213_,u'wrapPluginVisitorMethod':PyJs_Object_214_,u'compact':PyJs_Object_215_,u'minified':PyJs_Object_216_,u'sourceMap':PyJs_Object_217_,u'sourceMaps':PyJs_Object_218_,u'sourceMapTarget':PyJs_Object_219_,u'sourceFileName':PyJs_Object_220_,u'sourceRoot':PyJs_Object_221_,u'babelrc':PyJs_Object_222_,u'sourceType':PyJs_Object_223_,u'auxiliaryCommentBefore':PyJs_Object_224_,u'auxiliaryCommentAfter':PyJs_Object_225_,u'resolveModuleSource':PyJs_Object_226_,u'getModuleId':PyJs_Object_227_,u'moduleRoot':PyJs_Object_228_,u'moduleIds':PyJs_Object_229_,u'moduleId':PyJs_Object_230_,u'passPerPreset':PyJs_Object_231_,u'parserOpts':PyJs_Object_232_,u'generatorOpts':PyJs_Object_233_}) + var.get(u'module').put(u'exports', PyJs_Object_194_) +PyJs_anonymous_193_._set_name(u'anonymous') +PyJs_Object_234_ = Js({}) +@Js +def PyJs_anonymous_235_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_config', u'_interopRequireWildcard', u'_parsers', u'require', u'exports', u'module', u'normaliseOptions', u'parsers', u'_config2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_236_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_236_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_normaliseOptions_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'opt', u'val', u'parser', u'options', u'key']) + PyJs_Object_238_ = Js({}) + var.put(u'options', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else PyJs_Object_238_)) + for PyJsTemp in var.get(u'options'): + var.put(u'key', PyJsTemp) + var.put(u'val', var.get(u'options').get(var.get(u'key'))) + if (var.get(u'val')==var.get(u"null")): + continue + var.put(u'opt', var.get(u'_config2').get(u'default').get(var.get(u'key'))) + if (var.get(u'opt') and var.get(u'opt').get(u'alias')): + var.put(u'opt', var.get(u'_config2').get(u'default').get(var.get(u'opt').get(u'alias'))) + if var.get(u'opt').neg(): + continue + var.put(u'parser', var.get(u'parsers').get(var.get(u'opt').get(u'type'))) + if var.get(u'parser'): + var.put(u'val', var.get(u'parser')(var.get(u'val'))) + var.get(u'options').put(var.get(u'key'), var.get(u'val')) + return var.get(u'options') + PyJsHoisted_normaliseOptions_.func_name = u'normaliseOptions' + var.put(u'normaliseOptions', PyJsHoisted_normaliseOptions_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_237_ = Js({}) + var.put(u'newObj', PyJs_Object_237_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'config', var.get(u'undefined')) + var.get(u'exports').put(u'normaliseOptions', var.get(u'normaliseOptions')) + var.put(u'_parsers', var.get(u'require')(Js(u'./parsers'))) + var.put(u'parsers', var.get(u'_interopRequireWildcard')(var.get(u'_parsers'))) + var.put(u'_config', var.get(u'require')(Js(u'./config'))) + var.put(u'_config2', var.get(u'_interopRequireDefault')(var.get(u'_config'))) + pass + pass + var.get(u'exports').put(u'config', var.get(u'_config2').get(u'default')) + pass +PyJs_anonymous_235_._set_name(u'anonymous') +PyJs_Object_239_ = Js({u'./config':Js(16.0),u'./parsers':Js(19.0)}) +@Js +def PyJs_anonymous_240_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_241_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'_resolve', u'_plugin2', u'_plugin3', u'_interopRequireDefault', u'_merge', u'_clone', u'_getIterator2', u'_getIterator3', u'_path2', u'_typeof2', u'_typeof3', u'process', u'_node', u'_removed', u'_objectWithoutProperties2', u'_classCallCheck3', u'_classCallCheck2', u'_babelMessages', u'_stringify2', u'OptionManager', u'_interopRequireWildcard', u'_assign', u'_config3', u'_config2', u'_buildConfigChain2', u'_merge2', u'_assign2', u'_resolve2', u'_index', u'messages', u'_cloneDeepWith2', u'_clone2', u'_stringify', u'_objectWithoutProperties3', u'context', u'_removed2', u'_path', u'_cloneDeepWith', u'_buildConfigChain']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_243_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_243_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_242_ = Js({}) + var.put(u'newObj', PyJs_Object_242_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_objectWithoutProperties2', var.get(u'require')(Js(u'babel-runtime/helpers/objectWithoutProperties'))) + var.put(u'_objectWithoutProperties3', var.get(u'_interopRequireDefault')(var.get(u'_objectWithoutProperties2'))) + var.put(u'_stringify', var.get(u'require')(Js(u'babel-runtime/core-js/json/stringify'))) + var.put(u'_stringify2', var.get(u'_interopRequireDefault')(var.get(u'_stringify'))) + var.put(u'_assign', var.get(u'require')(Js(u'babel-runtime/core-js/object/assign'))) + var.put(u'_assign2', var.get(u'_interopRequireDefault')(var.get(u'_assign'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_node', var.get(u'require')(Js(u'../../../api/node'))) + var.put(u'context', var.get(u'_interopRequireWildcard')(var.get(u'_node'))) + var.put(u'_plugin2', var.get(u'require')(Js(u'../../plugin'))) + var.put(u'_plugin3', var.get(u'_interopRequireDefault')(var.get(u'_plugin2'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_resolve', var.get(u'require')(Js(u'../../../helpers/resolve'))) + var.put(u'_resolve2', var.get(u'_interopRequireDefault')(var.get(u'_resolve'))) + var.put(u'_cloneDeepWith', var.get(u'require')(Js(u'lodash/cloneDeepWith'))) + var.put(u'_cloneDeepWith2', var.get(u'_interopRequireDefault')(var.get(u'_cloneDeepWith'))) + var.put(u'_clone', var.get(u'require')(Js(u'lodash/clone'))) + var.put(u'_clone2', var.get(u'_interopRequireDefault')(var.get(u'_clone'))) + var.put(u'_merge', var.get(u'require')(Js(u'../../../helpers/merge'))) + var.put(u'_merge2', var.get(u'_interopRequireDefault')(var.get(u'_merge'))) + var.put(u'_config2', var.get(u'require')(Js(u'./config'))) + var.put(u'_config3', var.get(u'_interopRequireDefault')(var.get(u'_config2'))) + var.put(u'_removed', var.get(u'require')(Js(u'./removed'))) + var.put(u'_removed2', var.get(u'_interopRequireDefault')(var.get(u'_removed'))) + var.put(u'_buildConfigChain', var.get(u'require')(Js(u'./build-config-chain'))) + var.put(u'_buildConfigChain2', var.get(u'_interopRequireDefault')(var.get(u'_buildConfigChain'))) + var.put(u'_path', var.get(u'require')(Js(u'path'))) + var.put(u'_path2', var.get(u'_interopRequireDefault')(var.get(u'_path'))) + pass + pass + @Js + def PyJs_anonymous_244_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'OptionManager']) + @Js + def PyJsHoisted_OptionManager_(log, this, arguments, var=var): + var = Scope({u'this':this, u'log':log, u'arguments':arguments}, var) + var.registers([u'log']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'OptionManager')) + var.get(u"this").put(u'resolvedConfigs', Js([])) + var.get(u"this").put(u'options', var.get(u'OptionManager').callprop(u'createBareOptions')) + var.get(u"this").put(u'log', var.get(u'log')) + PyJsHoisted_OptionManager_.func_name = u'OptionManager' + var.put(u'OptionManager', PyJsHoisted_OptionManager_) + pass + @Js + def PyJs_memoisePluginContainer_245_(fn, loc, i, alias, this, arguments, var=var): + var = Scope({u'loc':loc, u'arguments':arguments, u'alias':alias, u'i':i, u'memoisePluginContainer':PyJs_memoisePluginContainer_245_, u'this':this, u'fn':fn}, var) + var.registers([u'_plugin', u'_isArray', u'obj', u'loc', u'i', u'cache', u'alias', u'_i', u'_iterator', u'_ref', u'fn']) + #for JS loop + var.put(u'_iterator', var.get(u'OptionManager').get(u'memoisedPlugins')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'cache', var.get(u'_ref')) + if PyJsStrictEq(var.get(u'cache').get(u'container'),var.get(u'fn')): + return var.get(u'cache').get(u'plugin') + + var.put(u'obj', PyJsComma(Js(0.0), Js(None))) + if PyJsStrictEq(var.get(u'fn',throw=False).typeof(),Js(u'function')): + var.put(u'obj', var.get(u'fn')(var.get(u'context'))) + else: + var.put(u'obj', var.get(u'fn')) + if PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'obj',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'obj'))),Js(u'object')): + var.put(u'_plugin', var.get(u'_plugin3').get(u'default').create(var.get(u'obj'), var.get(u'alias'))) + PyJs_Object_246_ = Js({u'container':var.get(u'fn'),u'plugin':var.get(u'_plugin')}) + var.get(u'OptionManager').get(u'memoisedPlugins').callprop(u'push', PyJs_Object_246_) + return var.get(u'_plugin') + else: + PyJsTempException = JsToPyException(var.get(u'TypeError').create(((var.get(u'messages').callprop(u'get', Js(u'pluginNotObject'), var.get(u'loc'), var.get(u'i'), (Js(u'undefined') if PyJsStrictEq(var.get(u'obj',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'obj'))))+var.get(u'loc'))+var.get(u'i')))) + raise PyJsTempException + PyJs_memoisePluginContainer_245_._set_name(u'memoisePluginContainer') + var.get(u'OptionManager').put(u'memoisePluginContainer', PyJs_memoisePluginContainer_245_) + @Js + def PyJs_createBareOptions_247_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'createBareOptions':PyJs_createBareOptions_247_}, var) + var.registers([u'_key', u'opt', u'opts']) + PyJs_Object_248_ = Js({}) + var.put(u'opts', PyJs_Object_248_) + for PyJsTemp in var.get(u'_config3').get(u'default'): + var.put(u'_key', PyJsTemp) + var.put(u'opt', var.get(u'_config3').get(u'default').get(var.get(u'_key'))) + var.get(u'opts').put(var.get(u'_key'), PyJsComma(Js(0.0),var.get(u'_clone2').get(u'default'))(var.get(u'opt').get(u'default'))) + return var.get(u'opts') + PyJs_createBareOptions_247_._set_name(u'createBareOptions') + var.get(u'OptionManager').put(u'createBareOptions', PyJs_createBareOptions_247_) + @Js + def PyJs_normalisePlugin_249_(plugin, loc, i, alias, this, arguments, var=var): + var = Scope({u'loc':loc, u'normalisePlugin':PyJs_normalisePlugin_249_, u'arguments':arguments, u'alias':alias, u'i':i, u'plugin':plugin, u'this':this}, var) + var.registers([u'i', u'loc', u'alias', u'plugin']) + var.put(u'plugin', (var.get(u'plugin').get(u'default') if var.get(u'plugin').get(u'__esModule') else var.get(u'plugin'))) + if var.get(u'plugin').instanceof(var.get(u'_plugin3').get(u'default')).neg(): + if (PyJsStrictEq(var.get(u'plugin',throw=False).typeof(),Js(u'function')) or PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'plugin',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'plugin'))),Js(u'object'))): + var.put(u'plugin', var.get(u'OptionManager').callprop(u'memoisePluginContainer', var.get(u'plugin'), var.get(u'loc'), var.get(u'i'), var.get(u'alias'))) + else: + PyJsTempException = JsToPyException(var.get(u'TypeError').create(var.get(u'messages').callprop(u'get', Js(u'pluginNotFunction'), var.get(u'loc'), var.get(u'i'), (Js(u'undefined') if PyJsStrictEq(var.get(u'plugin',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'plugin')))))) + raise PyJsTempException + var.get(u'plugin').callprop(u'init', var.get(u'loc'), var.get(u'i')) + return var.get(u'plugin') + PyJs_normalisePlugin_249_._set_name(u'normalisePlugin') + var.get(u'OptionManager').put(u'normalisePlugin', PyJs_normalisePlugin_249_) + @Js + def PyJs_normalisePlugins_250_(loc, dirname, plugins, this, arguments, var=var): + var = Scope({u'loc':loc, u'this':this, u'normalisePlugins':PyJs_normalisePlugins_250_, u'arguments':arguments, u'plugins':plugins, u'dirname':dirname}, var) + var.registers([u'loc', u'dirname', u'plugins']) + @Js + def PyJs_anonymous_251_(val, i, this, arguments, var=var): + var = Scope({u'i':i, u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val', u'plugin', u'i', u'pluginLoc', u'alias', u'options']) + var.put(u'plugin', PyJsComma(Js(0.0), Js(None))) + var.put(u'options', PyJsComma(Js(0.0), Js(None))) + if var.get(u'val').neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Falsy value found in plugins'))) + raise PyJsTempException + if var.get(u'Array').callprop(u'isArray', var.get(u'val')): + var.put(u'plugin', var.get(u'val').get(u'0')) + var.put(u'options', var.get(u'val').get(u'1')) + else: + var.put(u'plugin', var.get(u'val')) + var.put(u'alias', (var.get(u'plugin') if PyJsStrictEq(var.get(u'plugin',throw=False).typeof(),Js(u'string')) else ((var.get(u'loc')+Js(u'$'))+var.get(u'i')))) + if PyJsStrictEq(var.get(u'plugin',throw=False).typeof(),Js(u'string')): + var.put(u'pluginLoc', (PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))((Js(u'babel-plugin-')+var.get(u'plugin')), var.get(u'dirname')) or PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))(var.get(u'plugin'), var.get(u'dirname')))) + if var.get(u'pluginLoc'): + var.put(u'plugin', var.get(u'require')(var.get(u'pluginLoc'))) + else: + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create(var.get(u'messages').callprop(u'get', Js(u'pluginUnknown'), var.get(u'plugin'), var.get(u'loc'), var.get(u'i'), var.get(u'dirname')))) + raise PyJsTempException + var.put(u'plugin', var.get(u'OptionManager').callprop(u'normalisePlugin', var.get(u'plugin'), var.get(u'loc'), var.get(u'i'), var.get(u'alias'))) + return Js([var.get(u'plugin'), var.get(u'options')]) + PyJs_anonymous_251_._set_name(u'anonymous') + return var.get(u'plugins').callprop(u'map', PyJs_anonymous_251_) + PyJs_normalisePlugins_250_._set_name(u'normalisePlugins') + var.get(u'OptionManager').put(u'normalisePlugins', PyJs_normalisePlugins_250_) + @Js + def PyJs_mergeOptions_252_(_ref2, this, arguments, var=var): + var = Scope({u'this':this, u'mergeOptions':PyJs_mergeOptions_252_, u'_ref2':_ref2, u'arguments':arguments}, var) + var.registers([u'loc', u'presetConfigErr', u'dirname', u'option', u'_this', u'unknownOptErr', u'_ref2', u'extendingOpts', u'alias', u'_key2', u'rawOpts', u'opts']) + var.put(u'_this', var.get(u"this")) + var.put(u'rawOpts', var.get(u'_ref2').get(u'options')) + var.put(u'extendingOpts', var.get(u'_ref2').get(u'extending')) + var.put(u'alias', var.get(u'_ref2').get(u'alias')) + var.put(u'loc', var.get(u'_ref2').get(u'loc')) + var.put(u'dirname', var.get(u'_ref2').get(u'dirname')) + var.put(u'alias', (var.get(u'alias') or Js(u'foreign'))) + if var.get(u'rawOpts').neg(): + return var.get('undefined') + if (PyJsStrictNeq((Js(u'undefined') if PyJsStrictEq(var.get(u'rawOpts',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'rawOpts'))),Js(u'object')) or var.get(u'Array').callprop(u'isArray', var.get(u'rawOpts'))): + var.get(u"this").get(u'log').callprop(u'error', (Js(u'Invalid options type for ')+var.get(u'alias')), var.get(u'TypeError')) + @Js + def PyJs_anonymous_253_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + if var.get(u'val').instanceof(var.get(u'_plugin3').get(u'default')): + return var.get(u'val') + PyJs_anonymous_253_._set_name(u'anonymous') + var.put(u'opts', PyJsComma(Js(0.0),var.get(u'_cloneDeepWith2').get(u'default'))(var.get(u'rawOpts'), PyJs_anonymous_253_)) + var.put(u'dirname', (var.get(u'dirname') or var.get(u'process').callprop(u'cwd'))) + var.put(u'loc', (var.get(u'loc') or var.get(u'alias'))) + for PyJsTemp in var.get(u'opts'): + var.put(u'_key2', PyJsTemp) + var.put(u'option', var.get(u'_config3').get(u'default').get(var.get(u'_key2'))) + if (var.get(u'option').neg() and var.get(u"this").get(u'log')): + if var.get(u'_removed2').get(u'default').get(var.get(u'_key2')): + var.get(u"this").get(u'log').callprop(u'error', (((((Js(u'Using removed Babel 5 option: ')+var.get(u'alias'))+Js(u'.'))+var.get(u'_key2'))+Js(u' - '))+var.get(u'_removed2').get(u'default').get(var.get(u'_key2')).get(u'message')), var.get(u'ReferenceError')) + else: + var.put(u'unknownOptErr', ((((Js(u'Unknown option: ')+var.get(u'alias'))+Js(u'.'))+var.get(u'_key2'))+Js(u'. Check out http://babeljs.io/docs/usage/options/ for more information about options.'))) + var.put(u'presetConfigErr', Js(u"A common cause of this error is the presence of a configuration options object without the corresponding preset name. Example:\n\nInvalid:\n `{ presets: [{option: value}] }`\nValid:\n `{ presets: [['presetName', {option: value}]] }`\n\nFor more detailed information on preset configuration, please see http://babeljs.io/docs/plugins/#pluginpresets-options.")) + var.get(u"this").get(u'log').callprop(u'error', ((var.get(u'unknownOptErr')+Js(u'\n\n'))+var.get(u'presetConfigErr')), var.get(u'ReferenceError')) + PyJsComma(Js(0.0),var.get(u'_index').get(u'normaliseOptions'))(var.get(u'opts')) + if var.get(u'opts').get(u'plugins'): + var.get(u'opts').put(u'plugins', var.get(u'OptionManager').callprop(u'normalisePlugins', var.get(u'loc'), var.get(u'dirname'), var.get(u'opts').get(u'plugins'))) + if var.get(u'opts').get(u'presets'): + if var.get(u'opts').get(u'passPerPreset'): + @Js + def PyJs_anonymous_254_(preset, presetLoc, this, arguments, var=var): + var = Scope({u'presetLoc':presetLoc, u'this':this, u'preset':preset, u'arguments':arguments}, var) + var.registers([u'presetLoc', u'preset']) + PyJs_Object_255_ = Js({u'options':var.get(u'preset'),u'extending':var.get(u'preset'),u'alias':var.get(u'presetLoc'),u'loc':var.get(u'presetLoc'),u'dirname':var.get(u'dirname')}) + var.get(u'_this').callprop(u'mergeOptions', PyJs_Object_255_) + PyJs_anonymous_254_._set_name(u'anonymous') + var.get(u'opts').put(u'presets', var.get(u"this").callprop(u'resolvePresets', var.get(u'opts').get(u'presets'), var.get(u'dirname'), PyJs_anonymous_254_)) + else: + var.get(u"this").callprop(u'mergePresets', var.get(u'opts').get(u'presets'), var.get(u'dirname')) + var.get(u'opts').delete(u'presets') + if PyJsStrictEq(var.get(u'rawOpts'),var.get(u'extendingOpts')): + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'extendingOpts'), var.get(u'opts')) + else: + PyJsComma(Js(0.0),var.get(u'_merge2').get(u'default'))((var.get(u'extendingOpts') or var.get(u"this").get(u'options')), var.get(u'opts')) + PyJs_mergeOptions_252_._set_name(u'mergeOptions') + var.get(u'OptionManager').get(u'prototype').put(u'mergeOptions', PyJs_mergeOptions_252_) + @Js + def PyJs_mergePresets_256_(presets, dirname, this, arguments, var=var): + var = Scope({u'this':this, u'mergePresets':PyJs_mergePresets_256_, u'presets':presets, u'dirname':dirname, u'arguments':arguments}, var) + var.registers([u'presets', u'dirname', u'_this2']) + var.put(u'_this2', var.get(u"this")) + @Js + def PyJs_anonymous_257_(presetOpts, presetLoc, this, arguments, var=var): + var = Scope({u'presetLoc':presetLoc, u'this':this, u'presetOpts':presetOpts, u'arguments':arguments}, var) + var.registers([u'presetLoc', u'presetOpts']) + PyJs_Object_258_ = Js({u'options':var.get(u'presetOpts'),u'alias':var.get(u'presetLoc'),u'loc':var.get(u'presetLoc'),u'dirname':var.get(u'_path2').get(u'default').callprop(u'dirname', (var.get(u'presetLoc') or Js(u'')))}) + var.get(u'_this2').callprop(u'mergeOptions', PyJs_Object_258_) + PyJs_anonymous_257_._set_name(u'anonymous') + var.get(u"this").callprop(u'resolvePresets', var.get(u'presets'), var.get(u'dirname'), PyJs_anonymous_257_) + PyJs_mergePresets_256_._set_name(u'mergePresets') + var.get(u'OptionManager').get(u'prototype').put(u'mergePresets', PyJs_mergePresets_256_) + @Js + def PyJs_resolvePresets_259_(presets, dirname, onResolve, this, arguments, var=var): + var = Scope({u'this':this, u'presets':presets, u'onResolve':onResolve, u'arguments':arguments, u'dirname':dirname, u'resolvePresets':PyJs_resolvePresets_259_}, var) + var.registers([u'onResolve', u'presets', u'dirname']) + @Js + def PyJs_anonymous_260_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val', u'_val', u'matches', u'rest', u'presetLoc', u'presetPath', u'_val2', u'__esModule', u'options', u'orgName']) + var.put(u'options', PyJsComma(Js(0.0), Js(None))) + if var.get(u'Array').callprop(u'isArray', var.get(u'val')): + if (var.get(u'val').get(u'length')>Js(2.0)): + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'Unexpected extra options ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'val').callprop(u'slice', Js(2.0))))+Js(u' passed to preset.')))) + raise PyJsTempException + var.put(u'_val', var.get(u'val')) + var.put(u'val', var.get(u'_val').get(u'0')) + var.put(u'options', var.get(u'_val').get(u'1')) + var.put(u'presetLoc', PyJsComma(Js(0.0), Js(None))) + try: + if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'string')): + var.put(u'presetLoc', (PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))((Js(u'babel-preset-')+var.get(u'val')), var.get(u'dirname')) or PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))(var.get(u'val'), var.get(u'dirname')))) + if var.get(u'presetLoc').neg(): + var.put(u'matches', var.get(u'val').callprop(u'match', JsRegExp(u'/^(@[^/]+)\\/(.+)$/'))) + if var.get(u'matches'): + var.put(u'orgName', var.get(u'matches').get(u'1')) + var.put(u'presetPath', var.get(u'matches').get(u'2')) + var.put(u'val', ((var.get(u'orgName')+Js(u'/babel-preset-'))+var.get(u'presetPath'))) + var.put(u'presetLoc', PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))(var.get(u'val'), var.get(u'dirname'))) + if var.get(u'presetLoc').neg(): + PyJsTempException = JsToPyException(var.get(u'Error').create((((Js(u"Couldn't find preset ")+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'val')))+Js(u' relative to directory '))+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'dirname'))))) + raise PyJsTempException + var.put(u'val', var.get(u'require')(var.get(u'presetLoc'))) + if (PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'val'))),Js(u'object')) and var.get(u'val').get(u'__esModule')): + if var.get(u'val').get(u'default'): + var.put(u'val', var.get(u'val').get(u'default')) + else: + var.put(u'_val2', var.get(u'val')) + var.put(u'__esModule', var.get(u'_val2').get(u'__esModule')) + var.put(u'rest', PyJsComma(Js(0.0),var.get(u'_objectWithoutProperties3').get(u'default'))(var.get(u'_val2'), Js([Js(u'__esModule')]))) + var.put(u'val', var.get(u'rest')) + if (PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'val'))),Js(u'object')) and var.get(u'val').get(u'buildPreset')): + var.put(u'val', var.get(u'val').get(u'buildPreset')) + if (PyJsStrictNeq(var.get(u'val',throw=False).typeof(),Js(u'function')) and PyJsStrictNeq(var.get(u'options'),var.get(u'undefined'))): + PyJsTempException = JsToPyException(var.get(u'Error').create(((((Js(u'Options ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'options')))+Js(u' passed to '))+(var.get(u'presetLoc') or Js(u'a preset')))+Js(u' which does not accept options.')))) + raise PyJsTempException + if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'function')): + var.put(u'val', var.get(u'val')(var.get(u'context'), var.get(u'options'))) + if PyJsStrictNeq((Js(u'undefined') if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'val'))),Js(u'object')): + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'Unsupported preset format: ')+var.get(u'val'))+Js(u'.')))) + raise PyJsTempException + (var.get(u'onResolve') and var.get(u'onResolve')(var.get(u'val'), var.get(u'presetLoc'))) + except PyJsException as PyJsTempException: + PyJsHolder_65_49729099 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + if var.get(u'presetLoc'): + var.get(u'e').put(u'message', ((Js(u' (While processing preset: ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'presetLoc')))+Js(u')')), u'+') + PyJsTempException = JsToPyException(var.get(u'e')) + raise PyJsTempException + finally: + if PyJsHolder_65_49729099 is not None: + var.own[u'e'] = PyJsHolder_65_49729099 + else: + del var.own[u'e'] + del PyJsHolder_65_49729099 + return var.get(u'val') + PyJs_anonymous_260_._set_name(u'anonymous') + return var.get(u'presets').callprop(u'map', PyJs_anonymous_260_) + PyJs_resolvePresets_259_._set_name(u'resolvePresets') + var.get(u'OptionManager').get(u'prototype').put(u'resolvePresets', PyJs_resolvePresets_259_) + @Js + def PyJs_normaliseOptions_261_(this, arguments, var=var): + var = Scope({u'this':this, u'normaliseOptions':PyJs_normaliseOptions_261_, u'arguments':arguments}, var) + var.registers([u'_key3', u'val', u'option', u'opts']) + var.put(u'opts', var.get(u"this").get(u'options')) + for PyJsTemp in var.get(u'_config3').get(u'default'): + var.put(u'_key3', PyJsTemp) + var.put(u'option', var.get(u'_config3').get(u'default').get(var.get(u'_key3'))) + var.put(u'val', var.get(u'opts').get(var.get(u'_key3'))) + if (var.get(u'val').neg() and var.get(u'option').get(u'optional')): + continue + if var.get(u'option').get(u'alias'): + var.get(u'opts').put(var.get(u'option').get(u'alias'), (var.get(u'opts').get(var.get(u'option').get(u'alias')) or var.get(u'val'))) + else: + var.get(u'opts').put(var.get(u'_key3'), var.get(u'val')) + PyJs_normaliseOptions_261_._set_name(u'normaliseOptions') + var.get(u'OptionManager').get(u'prototype').put(u'normaliseOptions', PyJs_normaliseOptions_261_) + @Js + def PyJs_init_262_(this, arguments, var=var): + var = Scope({u'this':this, u'init':PyJs_init_262_, u'arguments':arguments}, var) + var.registers([u'_config', u'_isArray2', u'_ref3', u'_i2', u'opts', u'_iterator2']) + PyJs_Object_263_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else PyJs_Object_263_)) + #for JS loop + var.put(u'_iterator2', PyJsComma(Js(0.0),var.get(u'_buildConfigChain2').get(u'default'))(var.get(u'opts'), var.get(u"this").get(u'log'))) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i2').get(u'value')) + var.put(u'_config', var.get(u'_ref3')) + var.get(u"this").callprop(u'mergeOptions', var.get(u'_config')) + + var.get(u"this").callprop(u'normaliseOptions', var.get(u'opts')) + return var.get(u"this").get(u'options') + PyJs_init_262_._set_name(u'init') + var.get(u'OptionManager').get(u'prototype').put(u'init', PyJs_init_262_) + return var.get(u'OptionManager') + PyJs_anonymous_244_._set_name(u'anonymous') + var.put(u'OptionManager', PyJs_anonymous_244_()) + var.get(u'exports').put(u'default', var.get(u'OptionManager')) + var.get(u'OptionManager').put(u'memoisedPlugins', Js([])) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) + PyJs_anonymous_241_._set_name(u'anonymous') + PyJs_anonymous_241_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_240_._set_name(u'anonymous') +PyJs_Object_264_ = Js({u'../../../api/node':Js(6.0),u'../../../helpers/merge':Js(7.0),u'../../../helpers/resolve':Js(9.0),u'../../plugin':Js(25.0),u'./build-config-chain':Js(15.0),u'./config':Js(16.0),u'./index':Js(17.0),u'./removed':Js(20.0),u'_process':Js(531.0),u'babel-messages':Js(57.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/json/stringify':Js(97.0),u'babel-runtime/core-js/object/assign':Js(100.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-runtime/helpers/objectWithoutProperties':Js(112.0),u'babel-runtime/helpers/typeof':Js(114.0),u'lodash/clone':Js(438.0),u'lodash/cloneDeepWith':Js(440.0),u'path':Js(530.0)}) +@Js +def PyJs_anonymous_265_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'util', u'exports', u'_interopRequireWildcard', u'require', u'list', u'_util', u'filename', u'_slash', u'booleanString', u'boolean', u'module', u'_slash2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_267_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_267_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_booleanString_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + return var.get(u'util').callprop(u'booleanify', var.get(u'val')) + PyJsHoisted_booleanString_.func_name = u'booleanString' + var.put(u'booleanString', PyJsHoisted_booleanString_) + @Js + def PyJsHoisted_boolean_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + return var.get(u'val').neg().neg() + PyJsHoisted_boolean_.func_name = u'boolean' + var.put(u'boolean', PyJsHoisted_boolean_) + @Js + def PyJsHoisted_list_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + return var.get(u'util').callprop(u'list', var.get(u'val')) + PyJsHoisted_list_.func_name = u'list' + var.put(u'list', PyJsHoisted_list_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_266_ = Js({}) + var.put(u'newObj', PyJs_Object_266_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'filename', var.get(u'undefined')) + var.get(u'exports').put(u'boolean', var.get(u'boolean')) + var.get(u'exports').put(u'booleanString', var.get(u'booleanString')) + var.get(u'exports').put(u'list', var.get(u'list')) + var.put(u'_slash', var.get(u'require')(Js(u'slash'))) + var.put(u'_slash2', var.get(u'_interopRequireDefault')(var.get(u'_slash'))) + var.put(u'_util', var.get(u'require')(Js(u'../../../util'))) + var.put(u'util', var.get(u'_interopRequireWildcard')(var.get(u'_util'))) + pass + pass + var.put(u'filename', var.get(u'exports').put(u'filename', var.get(u'_slash2').get(u'default'))) + pass + pass + pass +PyJs_anonymous_265_._set_name(u'anonymous') +PyJs_Object_268_ = Js({u'../../../util':Js(26.0),u'slash':Js(508.0)}) +@Js +def PyJs_anonymous_269_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + PyJs_Object_271_ = Js({u'message':Js(u'Use `auxiliaryCommentBefore` or `auxiliaryCommentAfter`')}) + PyJs_Object_272_ = Js({u'message':Js(u'Put the specific transforms you want in the `plugins` option')}) + PyJs_Object_273_ = Js({u'message':Js(u'This is not a necessary option in Babel 6')}) + PyJs_Object_274_ = Js({u'message':Js(u'Put the specific transforms you want in the `plugins` option')}) + PyJs_Object_275_ = Js({u'message':Js(u'Use the `external-helpers` plugin instead. Check out http://babeljs.io/docs/plugins/external-helpers/')}) + PyJs_Object_276_ = Js({u'message':Js(u'')}) + PyJs_Object_277_ = Js({u'message':Js(u'use the `pragma` option in the `react-jsx` plugin . Check out http://babeljs.io/docs/plugins/transform-react-jsx/')}) + PyJs_Object_278_ = Js({u'message':Js(u'Specify the `loose` option for the relevant plugin you are using or use a preset that sets the option.')}) + PyJs_Object_279_ = Js({u'message':Js(u'Not required anymore as this is enabled by default')}) + PyJs_Object_280_ = Js({u'message':Js(u'Use the corresponding module transform plugin in the `plugins` option. Check out http://babeljs.io/docs/plugins/#modules')}) + PyJs_Object_281_ = Js({u'message':Js(u'Use the `react-jsx` and `flow-strip-types` plugins to support JSX and Flow. Also check out the react preset http://babeljs.io/docs/plugins/preset-react/')}) + PyJs_Object_282_ = Js({u'message':Js(u'Put the specific transforms you want in the `plugins` option')}) + PyJs_Object_283_ = Js({u'message':Js(u'Use the `sourceMapTarget` option')}) + PyJs_Object_284_ = Js({u'message':Js(u'Check out the corresponding stage-x presets http://babeljs.io/docs/plugins/#presets')}) + PyJs_Object_285_ = Js({u'message':Js(u'Put the specific transforms you want in the `plugins` option')}) + PyJs_Object_270_ = Js({u'auxiliaryComment':PyJs_Object_271_,u'blacklist':PyJs_Object_272_,u'breakConfig':PyJs_Object_273_,u'experimental':PyJs_Object_274_,u'externalHelpers':PyJs_Object_275_,u'extra':PyJs_Object_276_,u'jsxPragma':PyJs_Object_277_,u'loose':PyJs_Object_278_,u'metadataUsedHelpers':PyJs_Object_279_,u'modules':PyJs_Object_280_,u'nonStandard':PyJs_Object_281_,u'optional':PyJs_Object_282_,u'sourceMapName':PyJs_Object_283_,u'stage':PyJs_Object_284_,u'whitelist':PyJs_Object_285_}) + var.get(u'module').put(u'exports', PyJs_Object_270_) +PyJs_anonymous_269_._set_name(u'anonymous') +PyJs_Object_286_ = Js({}) +@Js +def PyJs_anonymous_287_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_plugin', u'exports', u'_plugin2', u'require', u'module', u'_sortBy2', u'_interopRequireDefault', u'_sortBy']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_288_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_288_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_plugin', var.get(u'require')(Js(u'../plugin'))) + var.put(u'_plugin2', var.get(u'_interopRequireDefault')(var.get(u'_plugin'))) + var.put(u'_sortBy', var.get(u'require')(Js(u'lodash/sortBy'))) + var.put(u'_sortBy2', var.get(u'_interopRequireDefault')(var.get(u'_sortBy'))) + pass + @Js + def PyJs_exit_292_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'exit':PyJs_exit_292_, u'arguments':arguments}, var) + var.registers([u'node', u'hasChange', u'_ref', u'bodyNode', u'i']) + var.put(u'node', var.get(u'_ref').get(u'node')) + var.put(u'hasChange', Js(False)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'node').get(u'body').get(u'length')): + try: + var.put(u'bodyNode', var.get(u'node').get(u'body').get(var.get(u'i'))) + if (var.get(u'bodyNode') and (var.get(u'bodyNode').get(u'_blockHoist')!=var.get(u"null"))): + var.put(u'hasChange', var.get(u'true')) + break + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + if var.get(u'hasChange').neg(): + return var.get('undefined') + @Js + def PyJs_anonymous_293_(bodyNode, this, arguments, var=var): + var = Scope({u'bodyNode':bodyNode, u'this':this, u'arguments':arguments}, var) + var.registers([u'priority', u'bodyNode']) + var.put(u'priority', (var.get(u'bodyNode') and var.get(u'bodyNode').get(u'_blockHoist'))) + if (var.get(u'priority')==var.get(u"null")): + var.put(u'priority', Js(1.0)) + if PyJsStrictEq(var.get(u'priority'),var.get(u'true')): + var.put(u'priority', Js(2.0)) + return ((-Js(1.0))*var.get(u'priority')) + PyJs_anonymous_293_._set_name(u'anonymous') + var.get(u'node').put(u'body', PyJsComma(Js(0.0),var.get(u'_sortBy2').get(u'default'))(var.get(u'node').get(u'body'), PyJs_anonymous_293_)) + PyJs_exit_292_._set_name(u'exit') + PyJs_Object_291_ = Js({u'exit':PyJs_exit_292_}) + PyJs_Object_290_ = Js({u'Block':PyJs_Object_291_}) + PyJs_Object_289_ = Js({u'name':Js(u'internal.blockHoist'),u'visitor':PyJs_Object_290_}) + var.get(u'exports').put(u'default', var.get(u'_plugin2').get(u'default').create(PyJs_Object_289_)) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_287_._set_name(u'anonymous') +PyJs_Object_294_ = Js({u'../plugin':Js(25.0),u'lodash/sortBy':Js(485.0)}) +@Js +def PyJs_anonymous_295_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_plugin', u'remap', u'_symbol2', u'superVisitor', u'_interopRequireWildcard', u'_plugin2', u'SUPER_THIS_BOUND', u'require', u'_babelTypes', u'exports', u'module', u'_symbol', u't', u'_interopRequireDefault', u'shouldShadow']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_297_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_297_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_remap_(path, key, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'key':key}, var) + var.registers([u'passedShadowFunction', u'cached', u'shadowFunction', u'classPath', u'hasSuperClass', u'init', u'key', u'fnPath', u'path', u'shadowPath', u'currentFunction', u'id']) + var.put(u'shadowPath', var.get(u'path').callprop(u'inShadow', var.get(u'key'))) + if var.get(u'shouldShadow')(var.get(u'path'), var.get(u'shadowPath')).neg(): + return var.get('undefined') + var.put(u'shadowFunction', var.get(u'path').get(u'node').get(u'_shadowedFunctionLiteral')) + var.put(u'currentFunction', PyJsComma(Js(0.0), Js(None))) + var.put(u'passedShadowFunction', Js(False)) + @Js + def PyJs_anonymous_304_(innerPath, this, arguments, var=var): + var = Scope({u'this':this, u'innerPath':innerPath, u'arguments':arguments}, var) + var.registers([u'innerPath']) + if ((var.get(u'innerPath').get(u'parentPath') and var.get(u'innerPath').get(u'parentPath').callprop(u'isClassProperty')) and PyJsStrictEq(var.get(u'innerPath').get(u'key'),Js(u'value'))): + return var.get(u'true') + if PyJsStrictEq(var.get(u'path'),var.get(u'innerPath')): + return Js(False) + if (var.get(u'innerPath').callprop(u'isProgram') or var.get(u'innerPath').callprop(u'isFunction')): + var.put(u'currentFunction', (var.get(u'currentFunction') or var.get(u'innerPath'))) + if var.get(u'innerPath').callprop(u'isProgram'): + var.put(u'passedShadowFunction', var.get(u'true')) + return var.get(u'true') + else: + if (var.get(u'innerPath').callprop(u'isFunction') and var.get(u'innerPath').callprop(u'isArrowFunctionExpression').neg()): + if var.get(u'shadowFunction'): + if (PyJsStrictEq(var.get(u'innerPath'),var.get(u'shadowFunction')) or PyJsStrictEq(var.get(u'innerPath').get(u'node'),var.get(u'shadowFunction').get(u'node'))): + return var.get(u'true') + else: + if var.get(u'innerPath').callprop(u'is', Js(u'shadow')).neg(): + return var.get(u'true') + var.put(u'passedShadowFunction', var.get(u'true')) + return Js(False) + return Js(False) + PyJs_anonymous_304_._set_name(u'anonymous') + var.put(u'fnPath', var.get(u'path').callprop(u'find', PyJs_anonymous_304_)) + if ((var.get(u'shadowFunction') and var.get(u'fnPath').callprop(u'isProgram')) and var.get(u'shadowFunction').callprop(u'isProgram').neg()): + @Js + def PyJs_anonymous_305_(p, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments}, var) + var.registers([u'p']) + return (var.get(u'p').callprop(u'isProgram') or var.get(u'p').callprop(u'isFunction')) + PyJs_anonymous_305_._set_name(u'anonymous') + var.put(u'fnPath', var.get(u'path').callprop(u'findParent', PyJs_anonymous_305_)) + if PyJsStrictEq(var.get(u'fnPath'),var.get(u'currentFunction')): + return var.get('undefined') + if var.get(u'passedShadowFunction').neg(): + return var.get('undefined') + var.put(u'cached', var.get(u'fnPath').callprop(u'getData', var.get(u'key'))) + if var.get(u'cached'): + return var.get(u'path').callprop(u'replaceWith', var.get(u'cached')) + var.put(u'id', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', var.get(u'key'))) + var.get(u'fnPath').callprop(u'setData', var.get(u'key'), var.get(u'id')) + @Js + def PyJs_anonymous_306_(p, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments}, var) + var.registers([u'p']) + return var.get(u'p').callprop(u'isClass') + PyJs_anonymous_306_._set_name(u'anonymous') + var.put(u'classPath', var.get(u'fnPath').callprop(u'findParent', PyJs_anonymous_306_)) + var.put(u'hasSuperClass', ((var.get(u'classPath') and var.get(u'classPath').get(u'node')) and var.get(u'classPath').get(u'node').get(u'superClass')).neg().neg()) + PyJs_Object_307_ = Js({u'kind':Js(u'constructor')}) + if ((PyJsStrictEq(var.get(u'key'),Js(u'this')) and var.get(u'fnPath').callprop(u'isMethod', PyJs_Object_307_)) and var.get(u'hasSuperClass')): + PyJs_Object_308_ = Js({u'id':var.get(u'id')}) + var.get(u'fnPath').get(u'scope').callprop(u'push', PyJs_Object_308_) + PyJs_Object_309_ = Js({u'id':var.get(u'id')}) + var.get(u'fnPath').callprop(u'traverse', var.get(u'superVisitor'), PyJs_Object_309_) + else: + var.put(u'init', (var.get(u't').callprop(u'thisExpression') if PyJsStrictEq(var.get(u'key'),Js(u'this')) else var.get(u't').callprop(u'identifier', var.get(u'key')))) + if var.get(u'shadowFunction'): + var.get(u'init').put(u'_shadowedFunctionLiteral', var.get(u'shadowFunction')) + PyJs_Object_310_ = Js({u'id':var.get(u'id'),u'init':var.get(u'init')}) + var.get(u'fnPath').get(u'scope').callprop(u'push', PyJs_Object_310_) + return var.get(u'path').callprop(u'replaceWith', var.get(u'id')) + PyJsHoisted_remap_.func_name = u'remap' + var.put(u'remap', PyJsHoisted_remap_) + @Js + def PyJsHoisted_shouldShadow_(path, shadowPath, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'shadowPath':shadowPath, u'arguments':arguments}, var) + var.registers([u'path', u'shadowPath']) + if var.get(u'path').callprop(u'is', Js(u'_forceShadow')): + return var.get(u'true') + else: + return var.get(u'shadowPath') + PyJsHoisted_shouldShadow_.func_name = u'shouldShadow' + var.put(u'shouldShadow', PyJsHoisted_shouldShadow_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_296_ = Js({}) + var.put(u'newObj', PyJs_Object_296_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_symbol', var.get(u'require')(Js(u'babel-runtime/core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + var.put(u'_plugin', var.get(u'require')(Js(u'../plugin'))) + var.put(u'_plugin2', var.get(u'_interopRequireDefault')(var.get(u'_plugin'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'SUPER_THIS_BOUND', PyJsComma(Js(0.0),var.get(u'_symbol2').get(u'default'))(Js(u'super this bound'))) + @Js + def PyJs_CallExpression_299_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'CallExpression':PyJs_CallExpression_299_}, var) + var.registers([u'node', u'path']) + if var.get(u'path').callprop(u'get', Js(u'callee')).callprop(u'isSuper').neg(): + return var.get('undefined') + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'node').get(var.get(u'SUPER_THIS_BOUND')): + return var.get('undefined') + var.get(u'node').put(var.get(u'SUPER_THIS_BOUND'), var.get(u'true')) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u"this").get(u'id'), var.get(u'node'))) + PyJs_CallExpression_299_._set_name(u'CallExpression') + PyJs_Object_298_ = Js({u'CallExpression':PyJs_CallExpression_299_}) + var.put(u'superVisitor', PyJs_Object_298_) + @Js + def PyJs_ThisExpression_302_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ThisExpression':PyJs_ThisExpression_302_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'remap')(var.get(u'path'), Js(u'this')) + PyJs_ThisExpression_302_._set_name(u'ThisExpression') + @Js + def PyJs_ReferencedIdentifier_303_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_303_, u'arguments':arguments}, var) + var.registers([u'path']) + if PyJsStrictEq(var.get(u'path').get(u'node').get(u'name'),Js(u'arguments')): + var.get(u'remap')(var.get(u'path'), Js(u'arguments')) + PyJs_ReferencedIdentifier_303_._set_name(u'ReferencedIdentifier') + PyJs_Object_301_ = Js({u'ThisExpression':PyJs_ThisExpression_302_,u'ReferencedIdentifier':PyJs_ReferencedIdentifier_303_}) + PyJs_Object_300_ = Js({u'name':Js(u'internal.shadowFunctions'),u'visitor':PyJs_Object_301_}) + var.get(u'exports').put(u'default', var.get(u'_plugin2').get(u'default').create(PyJs_Object_300_)) + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_295_._set_name(u'anonymous') +PyJs_Object_311_ = Js({u'../plugin':Js(25.0),u'babel-runtime/core-js/symbol':Js(105.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_312_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_plugin', u'Pipeline', u'_plugin2', u'_file', u'require', u'_normalizeAst2', u'exports', u'module', u'_file2', u'_interopRequireDefault', u'_classCallCheck3', u'_classCallCheck2', u'_normalizeAst']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_313_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_313_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_normalizeAst', var.get(u'require')(Js(u'../helpers/normalize-ast'))) + var.put(u'_normalizeAst2', var.get(u'_interopRequireDefault')(var.get(u'_normalizeAst'))) + var.put(u'_plugin', var.get(u'require')(Js(u'./plugin'))) + var.put(u'_plugin2', var.get(u'_interopRequireDefault')(var.get(u'_plugin'))) + var.put(u'_file', var.get(u'require')(Js(u'./file'))) + var.put(u'_file2', var.get(u'_interopRequireDefault')(var.get(u'_file'))) + pass + @Js + def PyJs_anonymous_314_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Pipeline']) + @Js + def PyJsHoisted_Pipeline_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Pipeline')) + PyJsHoisted_Pipeline_.func_name = u'Pipeline' + var.put(u'Pipeline', PyJsHoisted_Pipeline_) + pass + @Js + def PyJs_lint_315_(code, this, arguments, var=var): + var = Scope({u'this':this, u'lint':PyJs_lint_315_, u'code':code, u'arguments':arguments}, var) + var.registers([u'code', u'opts']) + PyJs_Object_316_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_316_)) + var.get(u'opts').put(u'code', Js(False)) + var.get(u'opts').put(u'mode', Js(u'lint')) + return var.get(u"this").callprop(u'transform', var.get(u'code'), var.get(u'opts')) + PyJs_lint_315_._set_name(u'lint') + var.get(u'Pipeline').get(u'prototype').put(u'lint', PyJs_lint_315_) + @Js + def PyJs_pretransform_317_(code, opts, this, arguments, var=var): + var = Scope({u'this':this, u'pretransform':PyJs_pretransform_317_, u'code':code, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'code', u'opts', u'file']) + var.put(u'file', var.get(u'_file2').get(u'default').create(var.get(u'opts'), var.get(u"this"))) + @Js + def PyJs_anonymous_318_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'file').callprop(u'addCode', var.get(u'code')) + var.get(u'file').callprop(u'parseCode', var.get(u'code')) + return var.get(u'file') + PyJs_anonymous_318_._set_name(u'anonymous') + return var.get(u'file').callprop(u'wrap', var.get(u'code'), PyJs_anonymous_318_) + PyJs_pretransform_317_._set_name(u'pretransform') + var.get(u'Pipeline').get(u'prototype').put(u'pretransform', PyJs_pretransform_317_) + @Js + def PyJs_transform_319_(code, opts, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'opts':opts, u'transform':PyJs_transform_319_}, var) + var.registers([u'code', u'opts', u'file']) + var.put(u'file', var.get(u'_file2').get(u'default').create(var.get(u'opts'), var.get(u"this"))) + @Js + def PyJs_anonymous_320_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'file').callprop(u'addCode', var.get(u'code')) + var.get(u'file').callprop(u'parseCode', var.get(u'code')) + return var.get(u'file').callprop(u'transform') + PyJs_anonymous_320_._set_name(u'anonymous') + return var.get(u'file').callprop(u'wrap', var.get(u'code'), PyJs_anonymous_320_) + PyJs_transform_319_._set_name(u'transform') + var.get(u'Pipeline').get(u'prototype').put(u'transform', PyJs_transform_319_) + @Js + def PyJs_analyse_321_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'analyse':PyJs_analyse_321_, u'arguments':arguments}, var) + var.registers([u'visitor', u'code', u'opts']) + PyJs_Object_322_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_322_)) + var.put(u'visitor', var.get(u'arguments').get(u'2')) + var.get(u'opts').put(u'code', Js(False)) + if var.get(u'visitor'): + var.get(u'opts').put(u'plugins', (var.get(u'opts').get(u'plugins') or Js([]))) + PyJs_Object_323_ = Js({u'visitor':var.get(u'visitor')}) + var.get(u'opts').get(u'plugins').callprop(u'push', var.get(u'_plugin2').get(u'default').create(PyJs_Object_323_)) + return var.get(u"this").callprop(u'transform', var.get(u'code'), var.get(u'opts')).get(u'metadata') + PyJs_analyse_321_._set_name(u'analyse') + var.get(u'Pipeline').get(u'prototype').put(u'analyse', PyJs_analyse_321_) + @Js + def PyJs_transformFromAst_324_(ast, code, opts, this, arguments, var=var): + var = Scope({u'code':code, u'ast':ast, u'this':this, u'transformFromAst':PyJs_transformFromAst_324_, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'code', u'opts', u'file', u'ast']) + var.put(u'ast', PyJsComma(Js(0.0),var.get(u'_normalizeAst2').get(u'default'))(var.get(u'ast'))) + var.put(u'file', var.get(u'_file2').get(u'default').create(var.get(u'opts'), var.get(u"this"))) + @Js + def PyJs_anonymous_325_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'file').callprop(u'addCode', var.get(u'code')) + var.get(u'file').callprop(u'addAst', var.get(u'ast')) + return var.get(u'file').callprop(u'transform') + PyJs_anonymous_325_._set_name(u'anonymous') + return var.get(u'file').callprop(u'wrap', var.get(u'code'), PyJs_anonymous_325_) + PyJs_transformFromAst_324_._set_name(u'transformFromAst') + var.get(u'Pipeline').get(u'prototype').put(u'transformFromAst', PyJs_transformFromAst_324_) + return var.get(u'Pipeline') + PyJs_anonymous_314_._set_name(u'anonymous') + var.put(u'Pipeline', PyJs_anonymous_314_()) + var.get(u'exports').put(u'default', var.get(u'Pipeline')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_312_._set_name(u'anonymous') +PyJs_Object_326_ = Js({u'../helpers/normalize-ast':Js(8.0),u'./file':Js(12.0),u'./plugin':Js(25.0),u'babel-runtime/helpers/classCallCheck':Js(110.0)}) +@Js +def PyJs_anonymous_327_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_store', u'_inherits3', u'_inherits2', u'require', u'_file6', u'_possibleConstructorReturn3', u'_possibleConstructorReturn2', u'module', u'_file5', u'_store2', u'PluginPass', u'_interopRequireDefault', u'_classCallCheck3', u'_classCallCheck2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_328_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_328_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_possibleConstructorReturn2', var.get(u'require')(Js(u'babel-runtime/helpers/possibleConstructorReturn'))) + var.put(u'_possibleConstructorReturn3', var.get(u'_interopRequireDefault')(var.get(u'_possibleConstructorReturn2'))) + var.put(u'_inherits2', var.get(u'require')(Js(u'babel-runtime/helpers/inherits'))) + var.put(u'_inherits3', var.get(u'_interopRequireDefault')(var.get(u'_inherits2'))) + var.put(u'_store', var.get(u'require')(Js(u'../store'))) + var.put(u'_store2', var.get(u'_interopRequireDefault')(var.get(u'_store'))) + var.put(u'_file5', var.get(u'require')(Js(u'./file'))) + var.put(u'_file6', var.get(u'_interopRequireDefault')(var.get(u'_file5'))) + pass + @Js + def PyJs_anonymous_329_(_Store, this, arguments, var=var): + var = Scope({u'this':this, u'_Store':_Store, u'arguments':arguments}, var) + var.registers([u'PluginPass', u'_Store']) + @Js + def PyJsHoisted_PluginPass_(file, plugin, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'file':file, u'plugin':plugin}, var) + var.registers([u'file', u'options', u'_this', u'plugin']) + PyJs_Object_330_ = Js({}) + var.put(u'options', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else PyJs_Object_330_)) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'PluginPass')) + var.put(u'_this', PyJsComma(Js(0.0),var.get(u'_possibleConstructorReturn3').get(u'default'))(var.get(u"this"), var.get(u'_Store').callprop(u'call', var.get(u"this")))) + var.get(u'_this').put(u'plugin', var.get(u'plugin')) + var.get(u'_this').put(u'key', var.get(u'plugin').get(u'key')) + var.get(u'_this').put(u'file', var.get(u'file')) + var.get(u'_this').put(u'opts', var.get(u'options')) + return var.get(u'_this') + PyJsHoisted_PluginPass_.func_name = u'PluginPass' + var.put(u'PluginPass', PyJsHoisted_PluginPass_) + PyJsComma(Js(0.0),var.get(u'_inherits3').get(u'default'))(var.get(u'PluginPass'), var.get(u'_Store')) + pass + @Js + def PyJs_addHelper_331_(this, arguments, var=var): + var = Scope({u'this':this, u'addHelper':PyJs_addHelper_331_, u'arguments':arguments}, var) + var.registers([u'_file']) + pass + return var.put(u'_file', var.get(u"this").get(u'file')).get(u'addHelper').callprop(u'apply', var.get(u'_file'), var.get(u'arguments')) + PyJs_addHelper_331_._set_name(u'addHelper') + var.get(u'PluginPass').get(u'prototype').put(u'addHelper', PyJs_addHelper_331_) + @Js + def PyJs_addImport_332_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'addImport':PyJs_addImport_332_}, var) + var.registers([u'_file2']) + pass + return var.put(u'_file2', var.get(u"this").get(u'file')).get(u'addImport').callprop(u'apply', var.get(u'_file2'), var.get(u'arguments')) + PyJs_addImport_332_._set_name(u'addImport') + var.get(u'PluginPass').get(u'prototype').put(u'addImport', PyJs_addImport_332_) + @Js + def PyJs_getModuleName_333_(this, arguments, var=var): + var = Scope({u'this':this, u'getModuleName':PyJs_getModuleName_333_, u'arguments':arguments}, var) + var.registers([u'_file3']) + pass + return var.put(u'_file3', var.get(u"this").get(u'file')).get(u'getModuleName').callprop(u'apply', var.get(u'_file3'), var.get(u'arguments')) + PyJs_getModuleName_333_._set_name(u'getModuleName') + var.get(u'PluginPass').get(u'prototype').put(u'getModuleName', PyJs_getModuleName_333_) + @Js + def PyJs_buildCodeFrameError_334_(this, arguments, var=var): + var = Scope({u'this':this, u'buildCodeFrameError':PyJs_buildCodeFrameError_334_, u'arguments':arguments}, var) + var.registers([u'_file4']) + pass + return var.put(u'_file4', var.get(u"this").get(u'file')).get(u'buildCodeFrameError').callprop(u'apply', var.get(u'_file4'), var.get(u'arguments')) + PyJs_buildCodeFrameError_334_._set_name(u'buildCodeFrameError') + var.get(u'PluginPass').get(u'prototype').put(u'buildCodeFrameError', PyJs_buildCodeFrameError_334_) + return var.get(u'PluginPass') + PyJs_anonymous_329_._set_name(u'anonymous') + var.put(u'PluginPass', PyJs_anonymous_329_(var.get(u'_store2').get(u'default'))) + var.get(u'exports').put(u'default', var.get(u'PluginPass')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_327_._set_name(u'anonymous') +PyJs_Object_335_ = Js({u'../store':Js(10.0),u'./file':Js(12.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-runtime/helpers/inherits':Js(111.0),u'babel-runtime/helpers/possibleConstructorReturn':Js(113.0)}) +@Js +def PyJs_anonymous_336_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_store', u'module', u'_clone', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_babelTraverse', u'_possibleConstructorReturn3', u'_possibleConstructorReturn2', u'_store2', u'_optionManager2', u'_classCallCheck3', u'_classCallCheck2', u'_optionManager', u'exports', u'_babelTraverse2', u'_interopRequireWildcard', u'Plugin', u'_inherits3', u'_inherits2', u'_assign', u'_assign2', u'require', u'messages', u'GLOBAL_VISITOR_PROPS', u'_clone2', u'_babelMessages']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_338_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_338_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_337_ = Js({}) + var.put(u'newObj', PyJs_Object_337_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_possibleConstructorReturn2', var.get(u'require')(Js(u'babel-runtime/helpers/possibleConstructorReturn'))) + var.put(u'_possibleConstructorReturn3', var.get(u'_interopRequireDefault')(var.get(u'_possibleConstructorReturn2'))) + var.put(u'_inherits2', var.get(u'require')(Js(u'babel-runtime/helpers/inherits'))) + var.put(u'_inherits3', var.get(u'_interopRequireDefault')(var.get(u'_inherits2'))) + var.put(u'_optionManager', var.get(u'require')(Js(u'./file/options/option-manager'))) + var.put(u'_optionManager2', var.get(u'_interopRequireDefault')(var.get(u'_optionManager'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_store', var.get(u'require')(Js(u'../store'))) + var.put(u'_store2', var.get(u'_interopRequireDefault')(var.get(u'_store'))) + var.put(u'_babelTraverse', var.get(u'require')(Js(u'babel-traverse'))) + var.put(u'_babelTraverse2', var.get(u'_interopRequireDefault')(var.get(u'_babelTraverse'))) + var.put(u'_assign', var.get(u'require')(Js(u'lodash/assign'))) + var.put(u'_assign2', var.get(u'_interopRequireDefault')(var.get(u'_assign'))) + var.put(u'_clone', var.get(u'require')(Js(u'lodash/clone'))) + var.put(u'_clone2', var.get(u'_interopRequireDefault')(var.get(u'_clone'))) + pass + pass + var.put(u'GLOBAL_VISITOR_PROPS', Js([Js(u'enter'), Js(u'exit')])) + @Js + def PyJs_anonymous_339_(_Store, this, arguments, var=var): + var = Scope({u'this':this, u'_Store':_Store, u'arguments':arguments}, var) + var.registers([u'_Store', u'Plugin']) + @Js + def PyJsHoisted_Plugin_(plugin, key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key, u'plugin':plugin}, var) + var.registers([u'key', u'_this', u'plugin']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Plugin')) + var.put(u'_this', PyJsComma(Js(0.0),var.get(u'_possibleConstructorReturn3').get(u'default'))(var.get(u"this"), var.get(u'_Store').callprop(u'call', var.get(u"this")))) + var.get(u'_this').put(u'initialized', Js(False)) + PyJs_Object_340_ = Js({}) + var.get(u'_this').put(u'raw', PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(PyJs_Object_340_, var.get(u'plugin'))) + var.get(u'_this').put(u'key', (var.get(u'_this').callprop(u'take', Js(u'name')) or var.get(u'key'))) + var.get(u'_this').put(u'manipulateOptions', var.get(u'_this').callprop(u'take', Js(u'manipulateOptions'))) + var.get(u'_this').put(u'post', var.get(u'_this').callprop(u'take', Js(u'post'))) + var.get(u'_this').put(u'pre', var.get(u'_this').callprop(u'take', Js(u'pre'))) + PyJs_Object_341_ = Js({}) + var.get(u'_this').put(u'visitor', var.get(u'_this').callprop(u'normaliseVisitor', (PyJsComma(Js(0.0),var.get(u'_clone2').get(u'default'))(var.get(u'_this').callprop(u'take', Js(u'visitor'))) or PyJs_Object_341_))) + return var.get(u'_this') + PyJsHoisted_Plugin_.func_name = u'Plugin' + var.put(u'Plugin', PyJsHoisted_Plugin_) + PyJsComma(Js(0.0),var.get(u'_inherits3').get(u'default'))(var.get(u'Plugin'), var.get(u'_Store')) + pass + @Js + def PyJs_take_342_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key, u'take':PyJs_take_342_}, var) + var.registers([u'key', u'val']) + var.put(u'val', var.get(u"this").get(u'raw').get(var.get(u'key'))) + var.get(u"this").get(u'raw').delete(var.get(u'key')) + return var.get(u'val') + PyJs_take_342_._set_name(u'take') + var.get(u'Plugin').get(u'prototype').put(u'take', PyJs_take_342_) + @Js + def PyJs_chain_343_(target, key, this, arguments, var=var): + var = Scope({u'this':this, u'chain':PyJs_chain_343_, u'target':target, u'key':key, u'arguments':arguments}, var) + var.registers([u'fns', u'target', u'key']) + if var.get(u'target').get(var.get(u'key')).neg(): + return var.get(u"this").get(var.get(u'key')) + if var.get(u"this").get(var.get(u'key')).neg(): + return var.get(u'target').get(var.get(u'key')) + var.put(u'fns', Js([var.get(u'target').get(var.get(u'key')), var.get(u"this").get(var.get(u'key'))])) + @Js + def PyJs_anonymous_344_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_isArray', u'_iterator', u'val', u'_len', u'args', u'ret', u'_key', u'_i', u'_ref', u'fn']) + var.put(u'val', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'_len', var.get(u'arguments').get(u'length')) + var.put(u'args', var.get(u'Array')(var.get(u'_len'))) + var.put(u'_key', Js(0.0)) + while (var.get(u'_key')<var.get(u'_len')): + try: + var.get(u'args').put(var.get(u'_key'), var.get(u'arguments').get(var.get(u'_key'))) + finally: + (var.put(u'_key',Js(var.get(u'_key').to_number())+Js(1))-Js(1)) + #for JS loop + var.put(u'_iterator', var.get(u'fns')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'fn', var.get(u'_ref')) + if var.get(u'fn'): + var.put(u'ret', var.get(u'fn').callprop(u'apply', var.get(u"this"), var.get(u'args'))) + if (var.get(u'ret')!=var.get(u"null")): + var.put(u'val', var.get(u'ret')) + + return var.get(u'val') + PyJs_anonymous_344_._set_name(u'anonymous') + return PyJs_anonymous_344_ + PyJs_chain_343_._set_name(u'chain') + var.get(u'Plugin').get(u'prototype').put(u'chain', PyJs_chain_343_) + @Js + def PyJs_maybeInherit_345_(loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'arguments':arguments, u'maybeInherit':PyJs_maybeInherit_345_}, var) + var.registers([u'inherits', u'loc']) + var.put(u'inherits', var.get(u"this").callprop(u'take', Js(u'inherits'))) + if var.get(u'inherits').neg(): + return var.get('undefined') + var.put(u'inherits', var.get(u'_optionManager2').get(u'default').callprop(u'normalisePlugin', var.get(u'inherits'), var.get(u'loc'), Js(u'inherits'))) + var.get(u"this").put(u'manipulateOptions', var.get(u"this").callprop(u'chain', var.get(u'inherits'), Js(u'manipulateOptions'))) + var.get(u"this").put(u'post', var.get(u"this").callprop(u'chain', var.get(u'inherits'), Js(u'post'))) + var.get(u"this").put(u'pre', var.get(u"this").callprop(u'chain', var.get(u'inherits'), Js(u'pre'))) + var.get(u"this").put(u'visitor', var.get(u'_babelTraverse2').get(u'default').get(u'visitors').callprop(u'merge', Js([var.get(u'inherits').get(u'visitor'), var.get(u"this").get(u'visitor')]))) + PyJs_maybeInherit_345_._set_name(u'maybeInherit') + var.get(u'Plugin').get(u'prototype').put(u'maybeInherit', PyJs_maybeInherit_345_) + @Js + def PyJs_init_346_(loc, i, this, arguments, var=var): + var = Scope({u'i':i, u'loc':loc, u'init':PyJs_init_346_, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'loc', u'key']) + if var.get(u"this").get(u'initialized'): + return var.get('undefined') + var.get(u"this").put(u'initialized', var.get(u'true')) + var.get(u"this").callprop(u'maybeInherit', var.get(u'loc')) + for PyJsTemp in var.get(u"this").get(u'raw'): + var.put(u'key', PyJsTemp) + PyJsTempException = JsToPyException(var.get(u'Error').create(var.get(u'messages').callprop(u'get', Js(u'pluginInvalidProperty'), var.get(u'loc'), var.get(u'i'), var.get(u'key')))) + raise PyJsTempException + PyJs_init_346_._set_name(u'init') + var.get(u'Plugin').get(u'prototype').put(u'init', PyJs_init_346_) + @Js + def PyJs_normaliseVisitor_347_(visitor, this, arguments, var=var): + var = Scope({u'this':this, u'visitor':visitor, u'normaliseVisitor':PyJs_normaliseVisitor_347_, u'arguments':arguments}, var) + var.registers([u'_isArray2', u'visitor', u'_i2', u'_ref2', u'key', u'_iterator2']) + #for JS loop + var.put(u'_iterator2', var.get(u'GLOBAL_VISITOR_PROPS')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'key', var.get(u'_ref2')) + if var.get(u'visitor').get(var.get(u'key')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"Plugins aren't allowed to specify catch-all enter/exit handlers. Please target individual nodes."))) + raise PyJsTempException + + var.get(u'_babelTraverse2').get(u'default').callprop(u'explode', var.get(u'visitor')) + return var.get(u'visitor') + PyJs_normaliseVisitor_347_._set_name(u'normaliseVisitor') + var.get(u'Plugin').get(u'prototype').put(u'normaliseVisitor', PyJs_normaliseVisitor_347_) + return var.get(u'Plugin') + PyJs_anonymous_339_._set_name(u'anonymous') + var.put(u'Plugin', PyJs_anonymous_339_(var.get(u'_store2').get(u'default'))) + var.get(u'exports').put(u'default', var.get(u'Plugin')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_336_._set_name(u'anonymous') +PyJs_Object_348_ = Js({u'../store':Js(10.0),u'./file/options/option-manager':Js(18.0),u'babel-messages':Js(57.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-runtime/helpers/inherits':Js(111.0),u'babel-runtime/helpers/possibleConstructorReturn':Js(113.0),u'babel-traverse':Js(225.0),u'lodash/assign':Js(435.0),u'lodash/clone':Js(438.0)}) +@Js +def PyJs_anonymous_349_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_shouldIgnore', u'_startsWith', u'module', u'_isString2', u'_slash2', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_isBoolean', u'_isRegExp2', u'shouldIgnore', u'_slash', u'booleanify', u'_isRegExp', u'_minimatch2', u'exports', u'_escapeRegExp2', u'_minimatch', u'_includes2', u'_util', u'canCompile', u'_path2', u'arrayify', u'_escapeRegExp', u'_isString', u'_startsWith2', u'list', u'regexify', u'_includes', u'require', u'_isBoolean2', u'_path']) + @Js + def PyJsHoisted__shouldIgnore_(pattern, filename, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'arguments':arguments, u'filename':filename}, var) + var.registers([u'pattern', u'filename']) + if PyJsStrictEq(var.get(u'pattern',throw=False).typeof(),Js(u'function')): + return var.get(u'pattern')(var.get(u'filename')) + else: + return var.get(u'pattern').callprop(u'test', var.get(u'filename')) + PyJsHoisted__shouldIgnore_.func_name = u'_shouldIgnore' + var.put(u'_shouldIgnore', PyJsHoisted__shouldIgnore_) + @Js + def PyJsHoisted_shouldIgnore_(filename, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'filename':filename}, var) + var.registers([u'_isArray', u'_pattern', u'_iterator', u'_isArray2', u'pattern', u'_i2', u'_ref2', u'ignore', u'only', u'_i', u'_ref', u'filename', u'_iterator2']) + var.put(u'ignore', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js([]))) + var.put(u'only', var.get(u'arguments').get(u'2')) + var.put(u'filename', var.get(u'filename').callprop(u'replace', JsRegExp(u'/\\\\/g'), Js(u'/'))) + if var.get(u'only'): + #for JS loop + var.put(u'_iterator', var.get(u'only')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'pattern', var.get(u'_ref')) + if var.get(u'_shouldIgnore')(var.get(u'pattern'), var.get(u'filename')): + return Js(False) + + return var.get(u'true') + else: + if var.get(u'ignore').get(u'length'): + #for JS loop + var.put(u'_iterator2', var.get(u'ignore')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'_pattern', var.get(u'_ref2')) + if var.get(u'_shouldIgnore')(var.get(u'_pattern'), var.get(u'filename')): + return var.get(u'true') + + return Js(False) + PyJsHoisted_shouldIgnore_.func_name = u'shouldIgnore' + var.put(u'shouldIgnore', PyJsHoisted_shouldIgnore_) + @Js + def PyJsHoisted_list_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + if var.get(u'val').neg(): + return Js([]) + else: + if var.get(u'Array').callprop(u'isArray', var.get(u'val')): + return var.get(u'val') + else: + if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'string')): + return var.get(u'val').callprop(u'split', Js(u',')) + else: + return Js([var.get(u'val')]) + PyJsHoisted_list_.func_name = u'list' + var.put(u'list', PyJsHoisted_list_) + @Js + def PyJsHoisted_regexify_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'regex', u'val']) + if var.get(u'val').neg(): + return var.get(u'RegExp').create(JsRegExp(u'/.^/')) + if var.get(u'Array').callprop(u'isArray', var.get(u'val')): + var.put(u'val', var.get(u'RegExp').create(var.get(u'val').callprop(u'map', var.get(u'_escapeRegExp2').get(u'default')).callprop(u'join', Js(u'|')), Js(u'i'))) + if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'string')): + var.put(u'val', PyJsComma(Js(0.0),var.get(u'_slash2').get(u'default'))(var.get(u'val'))) + if (PyJsComma(Js(0.0),var.get(u'_startsWith2').get(u'default'))(var.get(u'val'), Js(u'./')) or PyJsComma(Js(0.0),var.get(u'_startsWith2').get(u'default'))(var.get(u'val'), Js(u'*/'))): + var.put(u'val', var.get(u'val').callprop(u'slice', Js(2.0))) + if PyJsComma(Js(0.0),var.get(u'_startsWith2').get(u'default'))(var.get(u'val'), Js(u'**/')): + var.put(u'val', var.get(u'val').callprop(u'slice', Js(3.0))) + PyJs_Object_355_ = Js({u'nocase':var.get(u'true')}) + var.put(u'regex', var.get(u'_minimatch2').get(u'default').callprop(u'makeRe', var.get(u'val'), PyJs_Object_355_)) + return var.get(u'RegExp').create(var.get(u'regex').get(u'source').callprop(u'slice', Js(1.0), (-Js(1.0))), Js(u'i')) + if PyJsComma(Js(0.0),var.get(u'_isRegExp2').get(u'default'))(var.get(u'val')): + return var.get(u'val') + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'illegal type for regexify'))) + raise PyJsTempException + PyJsHoisted_regexify_.func_name = u'regexify' + var.put(u'regexify', PyJsHoisted_regexify_) + @Js + def PyJsHoisted_booleanify_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + if (PyJsStrictEq(var.get(u'val'),Js(u'true')) or (var.get(u'val')==Js(1.0))): + return var.get(u'true') + if ((PyJsStrictEq(var.get(u'val'),Js(u'false')) or (var.get(u'val')==Js(0.0))) or var.get(u'val').neg()): + return Js(False) + return var.get(u'val') + PyJsHoisted_booleanify_.func_name = u'booleanify' + var.put(u'booleanify', PyJsHoisted_booleanify_) + @Js + def PyJsHoisted_canCompile_(filename, altExts, this, arguments, var=var): + var = Scope({u'this':this, u'altExts':altExts, u'arguments':arguments, u'filename':filename}, var) + var.registers([u'ext', u'exts', u'altExts', u'filename']) + var.put(u'exts', (var.get(u'altExts') or var.get(u'canCompile').get(u'EXTENSIONS'))) + var.put(u'ext', var.get(u'_path2').get(u'default').callprop(u'extname', var.get(u'filename'))) + return PyJsComma(Js(0.0),var.get(u'_includes2').get(u'default'))(var.get(u'exts'), var.get(u'ext')) + PyJsHoisted_canCompile_.func_name = u'canCompile' + var.put(u'canCompile', PyJsHoisted_canCompile_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_354_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_354_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_arrayify_(val, mapFn, this, arguments, var=var): + var = Scope({u'this':this, u'mapFn':mapFn, u'arguments':arguments, u'val':val}, var) + var.registers([u'mapFn', u'val']) + if var.get(u'val').neg(): + return Js([]) + if PyJsComma(Js(0.0),var.get(u'_isBoolean2').get(u'default'))(var.get(u'val')): + return var.get(u'arrayify')(Js([var.get(u'val')]), var.get(u'mapFn')) + if PyJsComma(Js(0.0),var.get(u'_isString2').get(u'default'))(var.get(u'val')): + return var.get(u'arrayify')(var.get(u'list')(var.get(u'val')), var.get(u'mapFn')) + if var.get(u'Array').callprop(u'isArray', var.get(u'val')): + if var.get(u'mapFn'): + var.put(u'val', var.get(u'val').callprop(u'map', var.get(u'mapFn'))) + return var.get(u'val') + return Js([var.get(u'val')]) + PyJsHoisted_arrayify_.func_name = u'arrayify' + var.put(u'arrayify', PyJsHoisted_arrayify_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'inspect', var.get(u'exports').put(u'inherits', var.get(u'undefined'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_util', var.get(u'require')(Js(u'util'))) + @Js + def PyJs_get_351_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_351_}, var) + var.registers([]) + return var.get(u'_util').get(u'inherits') + PyJs_get_351_._set_name(u'get') + PyJs_Object_350_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_351_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'inherits'), PyJs_Object_350_) + @Js + def PyJs_get_353_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_353_}, var) + var.registers([]) + return var.get(u'_util').get(u'inspect') + PyJs_get_353_._set_name(u'get') + PyJs_Object_352_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_353_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'inspect'), PyJs_Object_352_) + var.get(u'exports').put(u'canCompile', var.get(u'canCompile')) + var.get(u'exports').put(u'list', var.get(u'list')) + var.get(u'exports').put(u'regexify', var.get(u'regexify')) + var.get(u'exports').put(u'arrayify', var.get(u'arrayify')) + var.get(u'exports').put(u'booleanify', var.get(u'booleanify')) + var.get(u'exports').put(u'shouldIgnore', var.get(u'shouldIgnore')) + var.put(u'_escapeRegExp', var.get(u'require')(Js(u'lodash/escapeRegExp'))) + var.put(u'_escapeRegExp2', var.get(u'_interopRequireDefault')(var.get(u'_escapeRegExp'))) + var.put(u'_startsWith', var.get(u'require')(Js(u'lodash/startsWith'))) + var.put(u'_startsWith2', var.get(u'_interopRequireDefault')(var.get(u'_startsWith'))) + var.put(u'_isBoolean', var.get(u'require')(Js(u'lodash/isBoolean'))) + var.put(u'_isBoolean2', var.get(u'_interopRequireDefault')(var.get(u'_isBoolean'))) + var.put(u'_minimatch', var.get(u'require')(Js(u'minimatch'))) + var.put(u'_minimatch2', var.get(u'_interopRequireDefault')(var.get(u'_minimatch'))) + var.put(u'_includes', var.get(u'require')(Js(u'lodash/includes'))) + var.put(u'_includes2', var.get(u'_interopRequireDefault')(var.get(u'_includes'))) + var.put(u'_isString', var.get(u'require')(Js(u'lodash/isString'))) + var.put(u'_isString2', var.get(u'_interopRequireDefault')(var.get(u'_isString'))) + var.put(u'_isRegExp', var.get(u'require')(Js(u'lodash/isRegExp'))) + var.put(u'_isRegExp2', var.get(u'_interopRequireDefault')(var.get(u'_isRegExp'))) + var.put(u'_path', var.get(u'require')(Js(u'path'))) + var.put(u'_path2', var.get(u'_interopRequireDefault')(var.get(u'_path'))) + var.put(u'_slash', var.get(u'require')(Js(u'slash'))) + var.put(u'_slash2', var.get(u'_interopRequireDefault')(var.get(u'_slash'))) + pass + pass + var.get(u'canCompile').put(u'EXTENSIONS', Js([Js(u'.js'), Js(u'.jsx'), Js(u'.es6'), Js(u'.es')])) + pass + pass + pass + pass + pass + pass +PyJs_anonymous_349_._set_name(u'anonymous') +PyJs_Object_356_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'lodash/escapeRegExp':Js(445.0),u'lodash/includes':Js(456.0),u'lodash/isBoolean':Js(461.0),u'lodash/isRegExp':Js(470.0),u'lodash/isString':Js(471.0),u'lodash/startsWith':Js(486.0),u'minimatch':Js(27.0),u'path':Js(530.0),u'slash':Js(508.0),u'util':Js(534.0)}) +@Js +def PyJs_anonymous_357_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'Minimatch', u'qmark', u'module', u'parse', u'regExpEscape', u'path', u'minimatch', u'reSpecials', u'make', u'twoStarNoDot', u'match', u'exports', u'star', u'plTypes', u'charSet', u'parseNegate', u'twoStarDot', u'expand', u'SUBPARSE', u'globUnescape', u'braceExpand', u'makeRe', u'GLOBSTAR', u'slashSplit', u'filter', u'ext', u'require']) + @Js + def PyJsHoisted_minimatch_(p, pattern, options, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'options':options, u'arguments':arguments, u'pattern':pattern}, var) + var.registers([u'p', u'options', u'pattern']) + if PyJsStrictNeq(var.get(u'pattern',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'glob pattern string required'))) + raise PyJsTempException + if var.get(u'options').neg(): + PyJs_Object_379_ = Js({}) + var.put(u'options', PyJs_Object_379_) + if (var.get(u'options').get(u'nocomment').neg() and PyJsStrictEq(var.get(u'pattern').callprop(u'charAt', Js(0.0)),Js(u'#'))): + return Js(False) + if PyJsStrictEq(var.get(u'pattern').callprop(u'trim'),Js(u'')): + return PyJsStrictEq(var.get(u'p'),Js(u'')) + return var.get(u'Minimatch').create(var.get(u'pattern'), var.get(u'options')).callprop(u'match', var.get(u'p')) + PyJsHoisted_minimatch_.func_name = u'minimatch' + var.put(u'minimatch', PyJsHoisted_minimatch_) + @Js + def PyJsHoisted_globUnescape_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u's']) + return var.get(u's').callprop(u'replace', JsRegExp(u'/\\\\(.)/g'), Js(u'$1')) + PyJsHoisted_globUnescape_.func_name = u'globUnescape' + var.put(u'globUnescape', PyJsHoisted_globUnescape_) + @Js + def PyJsHoisted_makeRe_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'twoStar', u'set', u'flags', u'options', u're']) + if (var.get(u"this").get(u'regexp') or PyJsStrictEq(var.get(u"this").get(u'regexp'),Js(False))): + return var.get(u"this").get(u'regexp') + var.put(u'set', var.get(u"this").get(u'set')) + if var.get(u'set').get(u'length').neg(): + var.get(u"this").put(u'regexp', Js(False)) + return var.get(u"this").get(u'regexp') + var.put(u'options', var.get(u"this").get(u'options')) + var.put(u'twoStar', (var.get(u'star') if var.get(u'options').get(u'noglobstar') else (var.get(u'twoStarDot') if var.get(u'options').get(u'dot') else var.get(u'twoStarNoDot')))) + var.put(u'flags', (Js(u'i') if var.get(u'options').get(u'nocase') else Js(u''))) + @Js + def PyJs_anonymous_392_(pattern, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'arguments':arguments}, var) + var.registers([u'pattern']) + @Js + def PyJs_anonymous_393_(p, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments}, var) + var.registers([u'p']) + return (var.get(u'twoStar') if PyJsStrictEq(var.get(u'p'),var.get(u'GLOBSTAR')) else (var.get(u'regExpEscape')(var.get(u'p')) if PyJsStrictEq(var.get(u'p',throw=False).typeof(),Js(u'string')) else var.get(u'p').get(u'_src'))) + PyJs_anonymous_393_._set_name(u'anonymous') + return var.get(u'pattern').callprop(u'map', PyJs_anonymous_393_).callprop(u'join', Js(u'\\/')) + PyJs_anonymous_392_._set_name(u'anonymous') + var.put(u're', var.get(u'set').callprop(u'map', PyJs_anonymous_392_).callprop(u'join', Js(u'|'))) + var.put(u're', ((Js(u'^(?:')+var.get(u're'))+Js(u')$'))) + if var.get(u"this").get(u'negate'): + var.put(u're', ((Js(u'^(?!')+var.get(u're'))+Js(u').*$'))) + try: + var.get(u"this").put(u'regexp', var.get(u'RegExp').create(var.get(u're'), var.get(u'flags'))) + except PyJsException as PyJsTempException: + PyJsHolder_6578_58961032 = var.own.get(u'ex') + var.force_own_put(u'ex', PyExceptionToJs(PyJsTempException)) + try: + var.get(u"this").put(u'regexp', Js(False)) + finally: + if PyJsHolder_6578_58961032 is not None: + var.own[u'ex'] = PyJsHolder_6578_58961032 + else: + del var.own[u'ex'] + del PyJsHolder_6578_58961032 + return var.get(u"this").get(u'regexp') + PyJsHoisted_makeRe_.func_name = u'makeRe' + var.put(u'makeRe', PyJsHoisted_makeRe_) + @Js + def PyJsHoisted_regExpEscape_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u's']) + return var.get(u's').callprop(u'replace', JsRegExp(u'/[-[\\]{}()*+?.,\\\\^$|#\\s]/g'), Js(u'\\$&')) + PyJsHoisted_regExpEscape_.func_name = u'regExpEscape' + var.put(u'regExpEscape', PyJsHoisted_regExpEscape_) + @Js + def PyJsHoisted_Minimatch_(pattern, options, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'options':options, u'arguments':arguments}, var) + var.registers([u'pattern', u'options']) + if var.get(u"this").instanceof(var.get(u'Minimatch')).neg(): + return var.get(u'Minimatch').create(var.get(u'pattern'), var.get(u'options')) + if PyJsStrictNeq(var.get(u'pattern',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'glob pattern string required'))) + raise PyJsTempException + if var.get(u'options').neg(): + PyJs_Object_380_ = Js({}) + var.put(u'options', PyJs_Object_380_) + var.put(u'pattern', var.get(u'pattern').callprop(u'trim')) + if PyJsStrictNeq(var.get(u'path').get(u'sep'),Js(u'/')): + var.put(u'pattern', var.get(u'pattern').callprop(u'split', var.get(u'path').get(u'sep')).callprop(u'join', Js(u'/'))) + var.get(u"this").put(u'options', var.get(u'options')) + var.get(u"this").put(u'set', Js([])) + var.get(u"this").put(u'pattern', var.get(u'pattern')) + var.get(u"this").put(u'regexp', var.get(u"null")) + var.get(u"this").put(u'negate', Js(False)) + var.get(u"this").put(u'comment', Js(False)) + var.get(u"this").put(u'empty', Js(False)) + var.get(u"this").callprop(u'make') + PyJsHoisted_Minimatch_.func_name = u'Minimatch' + var.put(u'Minimatch', PyJsHoisted_Minimatch_) + @Js + def PyJsHoisted_make_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'pattern', u'set', u'options']) + if var.get(u"this").get(u'_made'): + return var.get('undefined') + var.put(u'pattern', var.get(u"this").get(u'pattern')) + var.put(u'options', var.get(u"this").get(u'options')) + if (var.get(u'options').get(u'nocomment').neg() and PyJsStrictEq(var.get(u'pattern').callprop(u'charAt', Js(0.0)),Js(u'#'))): + var.get(u"this").put(u'comment', var.get(u'true')) + return var.get('undefined') + if var.get(u'pattern').neg(): + var.get(u"this").put(u'empty', var.get(u'true')) + return var.get('undefined') + var.get(u"this").callprop(u'parseNegate') + var.put(u'set', var.get(u"this").put(u'globSet', var.get(u"this").callprop(u'braceExpand'))) + if var.get(u'options').get(u'debug'): + var.get(u"this").put(u'debug', var.get(u'console').get(u'error')) + var.get(u"this").callprop(u'debug', var.get(u"this").get(u'pattern'), var.get(u'set')) + @Js + def PyJs_anonymous_382_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u's']) + return var.get(u's').callprop(u'split', var.get(u'slashSplit')) + PyJs_anonymous_382_._set_name(u'anonymous') + var.put(u'set', var.get(u"this").put(u'globParts', var.get(u'set').callprop(u'map', PyJs_anonymous_382_))) + var.get(u"this").callprop(u'debug', var.get(u"this").get(u'pattern'), var.get(u'set')) + @Js + def PyJs_anonymous_383_(s, si, set, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'set':set, u'si':si, u'arguments':arguments}, var) + var.registers([u's', u'set', u'si']) + return var.get(u's').callprop(u'map', var.get(u"this").get(u'parse'), var.get(u"this")) + PyJs_anonymous_383_._set_name(u'anonymous') + var.put(u'set', var.get(u'set').callprop(u'map', PyJs_anonymous_383_, var.get(u"this"))) + var.get(u"this").callprop(u'debug', var.get(u"this").get(u'pattern'), var.get(u'set')) + @Js + def PyJs_anonymous_384_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u's']) + return PyJsStrictEq(var.get(u's').callprop(u'indexOf', Js(False)),(-Js(1.0))) + PyJs_anonymous_384_._set_name(u'anonymous') + var.put(u'set', var.get(u'set').callprop(u'filter', PyJs_anonymous_384_)) + var.get(u"this").callprop(u'debug', var.get(u"this").get(u'pattern'), var.get(u'set')) + var.get(u"this").put(u'set', var.get(u'set')) + PyJsHoisted_make_.func_name = u'make' + var.put(u'make', PyJsHoisted_make_) + @Js + def PyJsHoisted_charSet_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u's']) + @Js + def PyJs_anonymous_366_(set, c, this, arguments, var=var): + var = Scope({u'this':this, u'c':c, u'set':set, u'arguments':arguments}, var) + var.registers([u'c', u'set']) + var.get(u'set').put(var.get(u'c'), var.get(u'true')) + return var.get(u'set') + PyJs_anonymous_366_._set_name(u'anonymous') + PyJs_Object_367_ = Js({}) + return var.get(u's').callprop(u'split', Js(u'')).callprop(u'reduce', PyJs_anonymous_366_, PyJs_Object_367_) + PyJsHoisted_charSet_.func_name = u'charSet' + var.put(u'charSet', PyJsHoisted_charSet_) + @Js + def PyJsHoisted_filter_(pattern, options, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'options':options, u'arguments':arguments}, var) + var.registers([u'pattern', u'options']) + PyJs_Object_368_ = Js({}) + var.put(u'options', (var.get(u'options') or PyJs_Object_368_)) + @Js + def PyJs_anonymous_369_(p, i, list, this, arguments, var=var): + var = Scope({u'i':i, u'p':p, u'this':this, u'list':list, u'arguments':arguments}, var) + var.registers([u'i', u'p', u'list']) + return var.get(u'minimatch')(var.get(u'p'), var.get(u'pattern'), var.get(u'options')) + PyJs_anonymous_369_._set_name(u'anonymous') + return PyJs_anonymous_369_ + PyJsHoisted_filter_.func_name = u'filter' + var.put(u'filter', PyJsHoisted_filter_) + @Js + def PyJsHoisted_ext_(a, b, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'b', u't']) + PyJs_Object_370_ = Js({}) + var.put(u'a', (var.get(u'a') or PyJs_Object_370_)) + PyJs_Object_371_ = Js({}) + var.put(u'b', (var.get(u'b') or PyJs_Object_371_)) + PyJs_Object_372_ = Js({}) + var.put(u't', PyJs_Object_372_) + @Js + def PyJs_anonymous_373_(k, this, arguments, var=var): + var = Scope({u'this':this, u'k':k, u'arguments':arguments}, var) + var.registers([u'k']) + var.get(u't').put(var.get(u'k'), var.get(u'b').get(var.get(u'k'))) + PyJs_anonymous_373_._set_name(u'anonymous') + var.get(u'Object').callprop(u'keys', var.get(u'b')).callprop(u'forEach', PyJs_anonymous_373_) + @Js + def PyJs_anonymous_374_(k, this, arguments, var=var): + var = Scope({u'this':this, u'k':k, u'arguments':arguments}, var) + var.registers([u'k']) + var.get(u't').put(var.get(u'k'), var.get(u'a').get(var.get(u'k'))) + PyJs_anonymous_374_._set_name(u'anonymous') + var.get(u'Object').callprop(u'keys', var.get(u'a')).callprop(u'forEach', PyJs_anonymous_374_) + return var.get(u't') + PyJsHoisted_ext_.func_name = u'ext' + var.put(u'ext', PyJsHoisted_ext_) + @Js + def PyJsHoisted_parseNegate_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'pattern', u'l', u'negateOffset', u'negate', u'options']) + var.put(u'pattern', var.get(u"this").get(u'pattern')) + var.put(u'negate', Js(False)) + var.put(u'options', var.get(u"this").get(u'options')) + var.put(u'negateOffset', Js(0.0)) + if var.get(u'options').get(u'nonegate'): + return var.get('undefined') + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'l', var.get(u'pattern').get(u'length')) + while ((var.get(u'i')<var.get(u'l')) and PyJsStrictEq(var.get(u'pattern').callprop(u'charAt', var.get(u'i')),Js(u'!'))): + try: + var.put(u'negate', var.get(u'negate').neg()) + (var.put(u'negateOffset',Js(var.get(u'negateOffset').to_number())+Js(1))-Js(1)) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + if var.get(u'negateOffset'): + var.get(u"this").put(u'pattern', var.get(u'pattern').callprop(u'substr', var.get(u'negateOffset'))) + var.get(u"this").put(u'negate', var.get(u'negate')) + PyJsHoisted_parseNegate_.func_name = u'parseNegate' + var.put(u'parseNegate', PyJsHoisted_parseNegate_) + @Js + def PyJsHoisted_parse_(pattern, isSub, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'isSub':isSub, u'arguments':arguments}, var) + var.registers([u'hasMagic', u'newRe', u'patternStart', u'dollar', u'nlLast', u'cs', u'isSub', u'nl', u'cleanAfter', u'reClassStart', u'pattern', u'self', u'addPatternStart', u'nlFirst', u're', u'tail', u'classStart', u'clearStateChar', u'regExp', u'pl', u'patternListStack', u'escaping', u'stateChar', u'len', u'nlAfter', u'nlBefore', u'c', u'i', u'sp', u'inClass', u'n', u'openParensBefore', u'flags', u't', u'negativeLists', u'options']) + @Js + def PyJsHoisted_clearStateChar_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u'stateChar'): + while 1: + SWITCHED = False + CONDITION = (var.get(u'stateChar')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'*')): + SWITCHED = True + var.put(u're', var.get(u'star'), u'+') + var.put(u'hasMagic', var.get(u'true')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'?')): + SWITCHED = True + var.put(u're', var.get(u'qmark'), u'+') + var.put(u'hasMagic', var.get(u'true')) + break + if True: + SWITCHED = True + var.put(u're', (Js(u'\\')+var.get(u'stateChar')), u'+') + break + SWITCHED = True + break + var.get(u'self').callprop(u'debug', Js(u'clearStateChar %j %j'), var.get(u'stateChar'), var.get(u're')) + var.put(u'stateChar', Js(False)) + PyJsHoisted_clearStateChar_.func_name = u'clearStateChar' + var.put(u'clearStateChar', PyJsHoisted_clearStateChar_) + if (var.get(u'pattern').get(u'length')>(Js(1024.0)*Js(64.0))): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'pattern is too long'))) + raise PyJsTempException + var.put(u'options', var.get(u"this").get(u'options')) + if (var.get(u'options').get(u'noglobstar').neg() and PyJsStrictEq(var.get(u'pattern'),Js(u'**'))): + return var.get(u'GLOBSTAR') + if PyJsStrictEq(var.get(u'pattern'),Js(u'')): + return Js(u'') + var.put(u're', Js(u'')) + var.put(u'hasMagic', var.get(u'options').get(u'nocase').neg().neg()) + var.put(u'escaping', Js(False)) + var.put(u'patternListStack', Js([])) + var.put(u'negativeLists', Js([])) + pass + var.put(u'inClass', Js(False)) + var.put(u'reClassStart', (-Js(1.0))) + var.put(u'classStart', (-Js(1.0))) + var.put(u'patternStart', (Js(u'') if PyJsStrictEq(var.get(u'pattern').callprop(u'charAt', Js(0.0)),Js(u'.')) else (Js(u'(?!(?:^|\\/)\\.{1,2}(?:$|\\/))') if var.get(u'options').get(u'dot') else Js(u'(?!\\.)')))) + var.put(u'self', var.get(u"this")) + pass + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u'pattern').get(u'length')) + while ((var.get(u'i')<var.get(u'len')) and var.put(u'c', var.get(u'pattern').callprop(u'charAt', var.get(u'i')))): + try: + var.get(u"this").callprop(u'debug', Js(u'%s\t%s %s %j'), var.get(u'pattern'), var.get(u'i'), var.get(u're'), var.get(u'c')) + if (var.get(u'escaping') and var.get(u'reSpecials').get(var.get(u'c'))): + var.put(u're', (Js(u'\\')+var.get(u'c')), u'+') + var.put(u'escaping', Js(False)) + continue + while 1: + SWITCHED = False + CONDITION = (var.get(u'c')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'/')): + SWITCHED = True + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'\\')): + SWITCHED = True + var.get(u'clearStateChar')() + var.put(u'escaping', var.get(u'true')) + continue + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'?')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'*')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'+')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'@')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'!')): + SWITCHED = True + var.get(u"this").callprop(u'debug', Js(u'%s\t%s %s %j <-- stateChar'), var.get(u'pattern'), var.get(u'i'), var.get(u're'), var.get(u'c')) + if var.get(u'inClass'): + var.get(u"this").callprop(u'debug', Js(u' in class')) + if (PyJsStrictEq(var.get(u'c'),Js(u'!')) and PyJsStrictEq(var.get(u'i'),(var.get(u'classStart')+Js(1.0)))): + var.put(u'c', Js(u'^')) + var.put(u're', var.get(u'c'), u'+') + continue + var.get(u'self').callprop(u'debug', Js(u'call clearStateChar %j'), var.get(u'stateChar')) + var.get(u'clearStateChar')() + var.put(u'stateChar', var.get(u'c')) + if var.get(u'options').get(u'noext'): + var.get(u'clearStateChar')() + continue + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'(')): + SWITCHED = True + if var.get(u'inClass'): + var.put(u're', Js(u'('), u'+') + continue + if var.get(u'stateChar').neg(): + var.put(u're', Js(u'\\('), u'+') + continue + PyJs_Object_388_ = Js({u'type':var.get(u'stateChar'),u'start':(var.get(u'i')-Js(1.0)),u'reStart':var.get(u're').get(u'length'),u'open':var.get(u'plTypes').get(var.get(u'stateChar')).get(u'open'),u'close':var.get(u'plTypes').get(var.get(u'stateChar')).get(u'close')}) + var.get(u'patternListStack').callprop(u'push', PyJs_Object_388_) + var.put(u're', (Js(u'(?:(?!(?:') if PyJsStrictEq(var.get(u'stateChar'),Js(u'!')) else Js(u'(?:')), u'+') + var.get(u"this").callprop(u'debug', Js(u'plType %j %j'), var.get(u'stateChar'), var.get(u're')) + var.put(u'stateChar', Js(False)) + continue + if SWITCHED or PyJsStrictEq(CONDITION, Js(u')')): + SWITCHED = True + if (var.get(u'inClass') or var.get(u'patternListStack').get(u'length').neg()): + var.put(u're', Js(u'\\)'), u'+') + continue + var.get(u'clearStateChar')() + var.put(u'hasMagic', var.get(u'true')) + var.put(u'pl', var.get(u'patternListStack').callprop(u'pop')) + var.put(u're', var.get(u'pl').get(u'close'), u'+') + if PyJsStrictEq(var.get(u'pl').get(u'type'),Js(u'!')): + var.get(u'negativeLists').callprop(u'push', var.get(u'pl')) + var.get(u'pl').put(u'reEnd', var.get(u're').get(u'length')) + continue + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'|')): + SWITCHED = True + if ((var.get(u'inClass') or var.get(u'patternListStack').get(u'length').neg()) or var.get(u'escaping')): + var.put(u're', Js(u'\\|'), u'+') + var.put(u'escaping', Js(False)) + continue + var.get(u'clearStateChar')() + var.put(u're', Js(u'|'), u'+') + continue + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'[')): + SWITCHED = True + var.get(u'clearStateChar')() + if var.get(u'inClass'): + var.put(u're', (Js(u'\\')+var.get(u'c')), u'+') + continue + var.put(u'inClass', var.get(u'true')) + var.put(u'classStart', var.get(u'i')) + var.put(u'reClassStart', var.get(u're').get(u'length')) + var.put(u're', var.get(u'c'), u'+') + continue + if SWITCHED or PyJsStrictEq(CONDITION, Js(u']')): + SWITCHED = True + if (PyJsStrictEq(var.get(u'i'),(var.get(u'classStart')+Js(1.0))) or var.get(u'inClass').neg()): + var.put(u're', (Js(u'\\')+var.get(u'c')), u'+') + var.put(u'escaping', Js(False)) + continue + if var.get(u'inClass'): + var.put(u'cs', var.get(u'pattern').callprop(u'substring', (var.get(u'classStart')+Js(1.0)), var.get(u'i'))) + try: + var.get(u'RegExp')(((Js(u'[')+var.get(u'cs'))+Js(u']'))) + except PyJsException as PyJsTempException: + PyJsHolder_6572_91644122 = var.own.get(u'er') + var.force_own_put(u'er', PyExceptionToJs(PyJsTempException)) + try: + var.put(u'sp', var.get(u"this").callprop(u'parse', var.get(u'cs'), var.get(u'SUBPARSE'))) + var.put(u're', (((var.get(u're').callprop(u'substr', Js(0.0), var.get(u'reClassStart'))+Js(u'\\['))+var.get(u'sp').get(u'0'))+Js(u'\\]'))) + var.put(u'hasMagic', (var.get(u'hasMagic') or var.get(u'sp').get(u'1'))) + var.put(u'inClass', Js(False)) + continue + finally: + if PyJsHolder_6572_91644122 is not None: + var.own[u'er'] = PyJsHolder_6572_91644122 + else: + del var.own[u'er'] + del PyJsHolder_6572_91644122 + var.put(u'hasMagic', var.get(u'true')) + var.put(u'inClass', Js(False)) + var.put(u're', var.get(u'c'), u'+') + continue + if True: + SWITCHED = True + var.get(u'clearStateChar')() + if var.get(u'escaping'): + var.put(u'escaping', Js(False)) + else: + if (var.get(u'reSpecials').get(var.get(u'c')) and (PyJsStrictEq(var.get(u'c'),Js(u'^')) and var.get(u'inClass')).neg()): + var.put(u're', Js(u'\\'), u'+') + var.put(u're', var.get(u'c'), u'+') + SWITCHED = True + break + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + if var.get(u'inClass'): + var.put(u'cs', var.get(u'pattern').callprop(u'substr', (var.get(u'classStart')+Js(1.0)))) + var.put(u'sp', var.get(u"this").callprop(u'parse', var.get(u'cs'), var.get(u'SUBPARSE'))) + var.put(u're', ((var.get(u're').callprop(u'substr', Js(0.0), var.get(u'reClassStart'))+Js(u'\\['))+var.get(u'sp').get(u'0'))) + var.put(u'hasMagic', (var.get(u'hasMagic') or var.get(u'sp').get(u'1'))) + #for JS loop + var.put(u'pl', var.get(u'patternListStack').callprop(u'pop')) + while var.get(u'pl'): + try: + var.put(u'tail', var.get(u're').callprop(u'slice', (var.get(u'pl').get(u'reStart')+var.get(u'pl').get(u'open').get(u'length')))) + var.get(u"this").callprop(u'debug', Js(u'setting tail'), var.get(u're'), var.get(u'pl')) + @Js + def PyJs_anonymous_389_(_, PyJsArg_2431_, PyJsArg_2432_, this, arguments, var=var): + var = Scope({u'this':this, u'$2':PyJsArg_2432_, u'arguments':arguments, u'_':_, u'$1':PyJsArg_2431_}, var) + var.registers([u'$2', u'_', u'$1']) + if var.get(u'$2').neg(): + var.put(u'$2', Js(u'\\')) + return (((var.get(u'$1')+var.get(u'$1'))+var.get(u'$2'))+Js(u'|')) + PyJs_anonymous_389_._set_name(u'anonymous') + var.put(u'tail', var.get(u'tail').callprop(u'replace', JsRegExp(u'/((?:\\\\{2}){0,64})(\\\\?)\\|/g'), PyJs_anonymous_389_)) + var.get(u"this").callprop(u'debug', Js(u'tail=%j\n %s'), var.get(u'tail'), var.get(u'tail'), var.get(u'pl'), var.get(u're')) + var.put(u't', (var.get(u'star') if PyJsStrictEq(var.get(u'pl').get(u'type'),Js(u'*')) else (var.get(u'qmark') if PyJsStrictEq(var.get(u'pl').get(u'type'),Js(u'?')) else (Js(u'\\')+var.get(u'pl').get(u'type'))))) + var.put(u'hasMagic', var.get(u'true')) + var.put(u're', (((var.get(u're').callprop(u'slice', Js(0.0), var.get(u'pl').get(u'reStart'))+var.get(u't'))+Js(u'\\('))+var.get(u'tail'))) + finally: + var.put(u'pl', var.get(u'patternListStack').callprop(u'pop')) + var.get(u'clearStateChar')() + if var.get(u'escaping'): + var.put(u're', Js(u'\\\\'), u'+') + var.put(u'addPatternStart', Js(False)) + while 1: + SWITCHED = False + CONDITION = (var.get(u're').callprop(u'charAt', Js(0.0))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'.')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'[')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'(')): + SWITCHED = True + var.put(u'addPatternStart', var.get(u'true')) + SWITCHED = True + break + #for JS loop + var.put(u'n', (var.get(u'negativeLists').get(u'length')-Js(1.0))) + while (var.get(u'n')>(-Js(1.0))): + try: + var.put(u'nl', var.get(u'negativeLists').get(var.get(u'n'))) + var.put(u'nlBefore', var.get(u're').callprop(u'slice', Js(0.0), var.get(u'nl').get(u'reStart'))) + var.put(u'nlFirst', var.get(u're').callprop(u'slice', var.get(u'nl').get(u'reStart'), (var.get(u'nl').get(u'reEnd')-Js(8.0)))) + var.put(u'nlLast', var.get(u're').callprop(u'slice', (var.get(u'nl').get(u'reEnd')-Js(8.0)), var.get(u'nl').get(u'reEnd'))) + var.put(u'nlAfter', var.get(u're').callprop(u'slice', var.get(u'nl').get(u'reEnd'))) + var.put(u'nlLast', var.get(u'nlAfter'), u'+') + var.put(u'openParensBefore', (var.get(u'nlBefore').callprop(u'split', Js(u'(')).get(u'length')-Js(1.0))) + var.put(u'cleanAfter', var.get(u'nlAfter')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'openParensBefore')): + try: + var.put(u'cleanAfter', var.get(u'cleanAfter').callprop(u'replace', JsRegExp(u'/\\)[+*?]?/'), Js(u''))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.put(u'nlAfter', var.get(u'cleanAfter')) + var.put(u'dollar', Js(u'')) + if (PyJsStrictEq(var.get(u'nlAfter'),Js(u'')) and PyJsStrictNeq(var.get(u'isSub'),var.get(u'SUBPARSE'))): + var.put(u'dollar', Js(u'$')) + var.put(u'newRe', ((((var.get(u'nlBefore')+var.get(u'nlFirst'))+var.get(u'nlAfter'))+var.get(u'dollar'))+var.get(u'nlLast'))) + var.put(u're', var.get(u'newRe')) + finally: + (var.put(u'n',Js(var.get(u'n').to_number())-Js(1))+Js(1)) + if (PyJsStrictNeq(var.get(u're'),Js(u'')) and var.get(u'hasMagic')): + var.put(u're', (Js(u'(?=.)')+var.get(u're'))) + if var.get(u'addPatternStart'): + var.put(u're', (var.get(u'patternStart')+var.get(u're'))) + if PyJsStrictEq(var.get(u'isSub'),var.get(u'SUBPARSE')): + return Js([var.get(u're'), var.get(u'hasMagic')]) + if var.get(u'hasMagic').neg(): + return var.get(u'globUnescape')(var.get(u'pattern')) + var.put(u'flags', (Js(u'i') if var.get(u'options').get(u'nocase') else Js(u''))) + try: + var.put(u'regExp', var.get(u'RegExp').create(((Js(u'^')+var.get(u're'))+Js(u'$')), var.get(u'flags'))) + except PyJsException as PyJsTempException: + PyJsHolder_6572_96421937 = var.own.get(u'er') + var.force_own_put(u'er', PyExceptionToJs(PyJsTempException)) + try: + return var.get(u'RegExp').create(Js(u'$.')) + finally: + if PyJsHolder_6572_96421937 is not None: + var.own[u'er'] = PyJsHolder_6572_96421937 + else: + del var.own[u'er'] + del PyJsHolder_6572_96421937 + var.get(u'regExp').put(u'_glob', var.get(u'pattern')) + var.get(u'regExp').put(u'_src', var.get(u're')) + return var.get(u'regExp') + PyJsHoisted_parse_.func_name = u'parse' + var.put(u'parse', PyJsHoisted_parse_) + @Js + def PyJsHoisted_braceExpand_(pattern, options, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'options':options, u'arguments':arguments}, var) + var.registers([u'pattern', u'options']) + if var.get(u'options').neg(): + if var.get(u"this").instanceof(var.get(u'Minimatch')): + var.put(u'options', var.get(u"this").get(u'options')) + else: + PyJs_Object_386_ = Js({}) + var.put(u'options', PyJs_Object_386_) + var.put(u'pattern', (var.get(u"this").get(u'pattern') if PyJsStrictEq(var.get(u'pattern',throw=False).typeof(),Js(u'undefined')) else var.get(u'pattern'))) + if PyJsStrictEq(var.get(u'pattern',throw=False).typeof(),Js(u'undefined')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'undefined pattern'))) + raise PyJsTempException + if (var.get(u'options').get(u'nobrace') or var.get(u'pattern').callprop(u'match', JsRegExp(u'/\\{.*\\}/')).neg()): + return Js([var.get(u'pattern')]) + return var.get(u'expand')(var.get(u'pattern')) + PyJsHoisted_braceExpand_.func_name = u'braceExpand' + var.put(u'braceExpand', PyJsHoisted_braceExpand_) + @Js + def PyJsHoisted_match_(f, partial, this, arguments, var=var): + var = Scope({u'this':this, u'partial':partial, u'arguments':arguments, u'f':f}, var) + var.registers([u'set', u'hit', u'f', u'i', u'pattern', u'filename', u'file', u'partial', u'options']) + var.get(u"this").callprop(u'debug', Js(u'match'), var.get(u'f'), var.get(u"this").get(u'pattern')) + if var.get(u"this").get(u'comment'): + return Js(False) + if var.get(u"this").get(u'empty'): + return PyJsStrictEq(var.get(u'f'),Js(u'')) + if (PyJsStrictEq(var.get(u'f'),Js(u'/')) and var.get(u'partial')): + return var.get(u'true') + var.put(u'options', var.get(u"this").get(u'options')) + if PyJsStrictNeq(var.get(u'path').get(u'sep'),Js(u'/')): + var.put(u'f', var.get(u'f').callprop(u'split', var.get(u'path').get(u'sep')).callprop(u'join', Js(u'/'))) + var.put(u'f', var.get(u'f').callprop(u'split', var.get(u'slashSplit'))) + var.get(u"this").callprop(u'debug', var.get(u"this").get(u'pattern'), Js(u'split'), var.get(u'f')) + var.put(u'set', var.get(u"this").get(u'set')) + var.get(u"this").callprop(u'debug', var.get(u"this").get(u'pattern'), Js(u'set'), var.get(u'set')) + pass + pass + #for JS loop + var.put(u'i', (var.get(u'f').get(u'length')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + var.put(u'filename', var.get(u'f').get(var.get(u'i'))) + if var.get(u'filename'): + break + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'set').get(u'length')): + try: + var.put(u'pattern', var.get(u'set').get(var.get(u'i'))) + var.put(u'file', var.get(u'f')) + if (var.get(u'options').get(u'matchBase') and PyJsStrictEq(var.get(u'pattern').get(u'length'),Js(1.0))): + var.put(u'file', Js([var.get(u'filename')])) + var.put(u'hit', var.get(u"this").callprop(u'matchOne', var.get(u'file'), var.get(u'pattern'), var.get(u'partial'))) + if var.get(u'hit'): + if var.get(u'options').get(u'flipNegate'): + return var.get(u'true') + return var.get(u"this").get(u'negate').neg() + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + if var.get(u'options').get(u'flipNegate'): + return Js(False) + return var.get(u"this").get(u'negate') + PyJsHoisted_match_.func_name = u'match' + var.put(u'match', PyJsHoisted_match_) + var.get(u'module').put(u'exports', var.get(u'minimatch')) + var.get(u'minimatch').put(u'Minimatch', var.get(u'Minimatch')) + PyJs_Object_358_ = Js({u'sep':Js(u'/')}) + var.put(u'path', PyJs_Object_358_) + try: + var.put(u'path', var.get(u'require')(Js(u'path'))) + except PyJsException as PyJsTempException: + PyJsHolder_6572_32117432 = var.own.get(u'er') + var.force_own_put(u'er', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_6572_32117432 is not None: + var.own[u'er'] = PyJsHolder_6572_32117432 + else: + del var.own[u'er'] + del PyJsHolder_6572_32117432 + PyJs_Object_359_ = Js({}) + var.put(u'GLOBSTAR', var.get(u'minimatch').put(u'GLOBSTAR', var.get(u'Minimatch').put(u'GLOBSTAR', PyJs_Object_359_))) + var.put(u'expand', var.get(u'require')(Js(u'brace-expansion'))) + PyJs_Object_361_ = Js({u'open':Js(u'(?:(?!(?:'),u'close':Js(u'))[^/]*?)')}) + PyJs_Object_362_ = Js({u'open':Js(u'(?:'),u'close':Js(u')?')}) + PyJs_Object_363_ = Js({u'open':Js(u'(?:'),u'close':Js(u')+')}) + PyJs_Object_364_ = Js({u'open':Js(u'(?:'),u'close':Js(u')*')}) + PyJs_Object_365_ = Js({u'open':Js(u'(?:'),u'close':Js(u')')}) + PyJs_Object_360_ = Js({u'!':PyJs_Object_361_,u'?':PyJs_Object_362_,u'+':PyJs_Object_363_,u'*':PyJs_Object_364_,u'@':PyJs_Object_365_}) + var.put(u'plTypes', PyJs_Object_360_) + var.put(u'qmark', Js(u'[^/]')) + var.put(u'star', (var.get(u'qmark')+Js(u'*?'))) + var.put(u'twoStarDot', Js(u'(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?')) + var.put(u'twoStarNoDot', Js(u'(?:(?!(?:\\/|^)\\.).)*?')) + var.put(u'reSpecials', var.get(u'charSet')(Js(u'().*{}+?[]^$\\!'))) + pass + var.put(u'slashSplit', JsRegExp(u'/\\/+/')) + var.get(u'minimatch').put(u'filter', var.get(u'filter')) + pass + pass + @Js + def PyJs_anonymous_375_(PyJsArg_646566_, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'def':PyJsArg_646566_}, var) + var.registers([u'm', u'def', u'orig']) + if (var.get(u'def').neg() or var.get(u'Object').callprop(u'keys', var.get(u'def')).get(u'length').neg()): + return var.get(u'minimatch') + var.put(u'orig', var.get(u'minimatch')) + @Js + def PyJs_minimatch_376_(p, pattern, options, this, arguments, var=var): + var = Scope({u'minimatch':PyJs_minimatch_376_, u'this':this, u'pattern':pattern, u'p':p, u'arguments':arguments, u'options':options}, var) + var.registers([u'p', u'options', u'pattern']) + return var.get(u'orig').callprop(u'minimatch', var.get(u'p'), var.get(u'pattern'), var.get(u'ext')(var.get(u'def'), var.get(u'options'))) + PyJs_minimatch_376_._set_name(u'minimatch') + var.put(u'm', PyJs_minimatch_376_) + @Js + def PyJs_Minimatch_377_(pattern, options, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'Minimatch':PyJs_Minimatch_377_, u'options':options, u'arguments':arguments}, var) + var.registers([u'pattern', u'options']) + return var.get(u'orig').get(u'Minimatch').create(var.get(u'pattern'), var.get(u'ext')(var.get(u'def'), var.get(u'options'))) + PyJs_Minimatch_377_._set_name(u'Minimatch') + var.get(u'm').put(u'Minimatch', PyJs_Minimatch_377_) + return var.get(u'm') + PyJs_anonymous_375_._set_name(u'anonymous') + var.get(u'minimatch').put(u'defaults', PyJs_anonymous_375_) + @Js + def PyJs_anonymous_378_(PyJsArg_646566_, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'def':PyJsArg_646566_}, var) + var.registers([u'def']) + if (var.get(u'def').neg() or var.get(u'Object').callprop(u'keys', var.get(u'def')).get(u'length').neg()): + return var.get(u'Minimatch') + return var.get(u'minimatch').callprop(u'defaults', var.get(u'def')).get(u'Minimatch') + PyJs_anonymous_378_._set_name(u'anonymous') + var.get(u'Minimatch').put(u'defaults', PyJs_anonymous_378_) + pass + pass + @Js + def PyJs_anonymous_381_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJs_anonymous_381_._set_name(u'anonymous') + var.get(u'Minimatch').get(u'prototype').put(u'debug', PyJs_anonymous_381_) + var.get(u'Minimatch').get(u'prototype').put(u'make', var.get(u'make')) + pass + var.get(u'Minimatch').get(u'prototype').put(u'parseNegate', var.get(u'parseNegate')) + pass + @Js + def PyJs_anonymous_385_(pattern, options, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'options':options, u'arguments':arguments}, var) + var.registers([u'pattern', u'options']) + return var.get(u'braceExpand')(var.get(u'pattern'), var.get(u'options')) + PyJs_anonymous_385_._set_name(u'anonymous') + var.get(u'minimatch').put(u'braceExpand', PyJs_anonymous_385_) + var.get(u'Minimatch').get(u'prototype').put(u'braceExpand', var.get(u'braceExpand')) + pass + var.get(u'Minimatch').get(u'prototype').put(u'parse', var.get(u'parse')) + PyJs_Object_387_ = Js({}) + var.put(u'SUBPARSE', PyJs_Object_387_) + pass + @Js + def PyJs_anonymous_390_(pattern, options, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'options':options, u'arguments':arguments}, var) + var.registers([u'pattern', u'options']) + PyJs_Object_391_ = Js({}) + return var.get(u'Minimatch').create(var.get(u'pattern'), (var.get(u'options') or PyJs_Object_391_)).callprop(u'makeRe') + PyJs_anonymous_390_._set_name(u'anonymous') + var.get(u'minimatch').put(u'makeRe', PyJs_anonymous_390_) + var.get(u'Minimatch').get(u'prototype').put(u'makeRe', var.get(u'makeRe')) + pass + @Js + def PyJs_anonymous_394_(list, pattern, options, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'list':list, u'options':options, u'arguments':arguments}, var) + var.registers([u'mm', u'pattern', u'list', u'options']) + PyJs_Object_395_ = Js({}) + var.put(u'options', (var.get(u'options') or PyJs_Object_395_)) + var.put(u'mm', var.get(u'Minimatch').create(var.get(u'pattern'), var.get(u'options'))) + @Js + def PyJs_anonymous_396_(f, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'f':f}, var) + var.registers([u'f']) + return var.get(u'mm').callprop(u'match', var.get(u'f')) + PyJs_anonymous_396_._set_name(u'anonymous') + var.put(u'list', var.get(u'list').callprop(u'filter', PyJs_anonymous_396_)) + if (var.get(u'mm').get(u'options').get(u'nonull') and var.get(u'list').get(u'length').neg()): + var.get(u'list').callprop(u'push', var.get(u'pattern')) + return var.get(u'list') + PyJs_anonymous_394_._set_name(u'anonymous') + var.get(u'minimatch').put(u'match', PyJs_anonymous_394_) + var.get(u'Minimatch').get(u'prototype').put(u'match', var.get(u'match')) + pass + @Js + def PyJs_anonymous_397_(file, pattern, partial, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'partial':partial, u'arguments':arguments, u'file':file}, var) + var.registers([u'pr', u'emptyFileEnd', u'fr', u'hit', u'f', u'pattern', u'p', u'partial', u'file', u'fi', u'swallowee', u'pi', u'fl', u'options', u'pl']) + var.put(u'options', var.get(u"this").get(u'options')) + PyJs_Object_398_ = Js({u'this':var.get(u"this"),u'file':var.get(u'file'),u'pattern':var.get(u'pattern')}) + var.get(u"this").callprop(u'debug', Js(u'matchOne'), PyJs_Object_398_) + var.get(u"this").callprop(u'debug', Js(u'matchOne'), var.get(u'file').get(u'length'), var.get(u'pattern').get(u'length')) + #for JS loop + var.put(u'fi', Js(0.0)) + var.put(u'pi', Js(0.0)) + var.put(u'fl', var.get(u'file').get(u'length')) + var.put(u'pl', var.get(u'pattern').get(u'length')) + while ((var.get(u'fi')<var.get(u'fl')) and (var.get(u'pi')<var.get(u'pl'))): + try: + var.get(u"this").callprop(u'debug', Js(u'matchOne loop')) + var.put(u'p', var.get(u'pattern').get(var.get(u'pi'))) + var.put(u'f', var.get(u'file').get(var.get(u'fi'))) + var.get(u"this").callprop(u'debug', var.get(u'pattern'), var.get(u'p'), var.get(u'f')) + if PyJsStrictEq(var.get(u'p'),Js(False)): + return Js(False) + if PyJsStrictEq(var.get(u'p'),var.get(u'GLOBSTAR')): + var.get(u"this").callprop(u'debug', Js(u'GLOBSTAR'), Js([var.get(u'pattern'), var.get(u'p'), var.get(u'f')])) + var.put(u'fr', var.get(u'fi')) + var.put(u'pr', (var.get(u'pi')+Js(1.0))) + if PyJsStrictEq(var.get(u'pr'),var.get(u'pl')): + var.get(u"this").callprop(u'debug', Js(u'** at the end')) + #for JS loop + + while (var.get(u'fi')<var.get(u'fl')): + try: + if ((PyJsStrictEq(var.get(u'file').get(var.get(u'fi')),Js(u'.')) or PyJsStrictEq(var.get(u'file').get(var.get(u'fi')),Js(u'..'))) or (var.get(u'options').get(u'dot').neg() and PyJsStrictEq(var.get(u'file').get(var.get(u'fi')).callprop(u'charAt', Js(0.0)),Js(u'.')))): + return Js(False) + finally: + (var.put(u'fi',Js(var.get(u'fi').to_number())+Js(1))-Js(1)) + return var.get(u'true') + while (var.get(u'fr')<var.get(u'fl')): + var.put(u'swallowee', var.get(u'file').get(var.get(u'fr'))) + var.get(u"this").callprop(u'debug', Js(u'\nglobstar while'), var.get(u'file'), var.get(u'fr'), var.get(u'pattern'), var.get(u'pr'), var.get(u'swallowee')) + if var.get(u"this").callprop(u'matchOne', var.get(u'file').callprop(u'slice', var.get(u'fr')), var.get(u'pattern').callprop(u'slice', var.get(u'pr')), var.get(u'partial')): + var.get(u"this").callprop(u'debug', Js(u'globstar found match!'), var.get(u'fr'), var.get(u'fl'), var.get(u'swallowee')) + return var.get(u'true') + else: + if ((PyJsStrictEq(var.get(u'swallowee'),Js(u'.')) or PyJsStrictEq(var.get(u'swallowee'),Js(u'..'))) or (var.get(u'options').get(u'dot').neg() and PyJsStrictEq(var.get(u'swallowee').callprop(u'charAt', Js(0.0)),Js(u'.')))): + var.get(u"this").callprop(u'debug', Js(u'dot detected!'), var.get(u'file'), var.get(u'fr'), var.get(u'pattern'), var.get(u'pr')) + break + var.get(u"this").callprop(u'debug', Js(u'globstar swallow a segment, and continue')) + (var.put(u'fr',Js(var.get(u'fr').to_number())+Js(1))-Js(1)) + if var.get(u'partial'): + var.get(u"this").callprop(u'debug', Js(u'\n>>> no match, partial?'), var.get(u'file'), var.get(u'fr'), var.get(u'pattern'), var.get(u'pr')) + if PyJsStrictEq(var.get(u'fr'),var.get(u'fl')): + return var.get(u'true') + return Js(False) + pass + if PyJsStrictEq(var.get(u'p',throw=False).typeof(),Js(u'string')): + if var.get(u'options').get(u'nocase'): + var.put(u'hit', PyJsStrictEq(var.get(u'f').callprop(u'toLowerCase'),var.get(u'p').callprop(u'toLowerCase'))) + else: + var.put(u'hit', PyJsStrictEq(var.get(u'f'),var.get(u'p'))) + var.get(u"this").callprop(u'debug', Js(u'string match'), var.get(u'p'), var.get(u'f'), var.get(u'hit')) + else: + var.put(u'hit', var.get(u'f').callprop(u'match', var.get(u'p'))) + var.get(u"this").callprop(u'debug', Js(u'pattern match'), var.get(u'p'), var.get(u'f'), var.get(u'hit')) + if var.get(u'hit').neg(): + return Js(False) + finally: + PyJsComma((var.put(u'fi',Js(var.get(u'fi').to_number())+Js(1))-Js(1)),(var.put(u'pi',Js(var.get(u'pi').to_number())+Js(1))-Js(1))) + if (PyJsStrictEq(var.get(u'fi'),var.get(u'fl')) and PyJsStrictEq(var.get(u'pi'),var.get(u'pl'))): + return var.get(u'true') + else: + if PyJsStrictEq(var.get(u'fi'),var.get(u'fl')): + return var.get(u'partial') + else: + if PyJsStrictEq(var.get(u'pi'),var.get(u'pl')): + var.put(u'emptyFileEnd', (PyJsStrictEq(var.get(u'fi'),(var.get(u'fl')-Js(1.0))) and PyJsStrictEq(var.get(u'file').get(var.get(u'fi')),Js(u'')))) + return var.get(u'emptyFileEnd') + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'wtf?'))) + raise PyJsTempException + PyJs_anonymous_397_._set_name(u'anonymous') + var.get(u'Minimatch').get(u'prototype').put(u'matchOne', PyJs_anonymous_397_) + pass + pass +PyJs_anonymous_357_._set_name(u'anonymous') +PyJs_Object_399_ = Js({u'brace-expansion':Js(264.0),u'path':Js(530.0)}) +@Js +def PyJs_anonymous_400_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_402_ = Js({u'raw':Js(u'babel-core'),u'scope':var.get(u"null"),u'escapedName':Js(u'babel-core'),u'name':Js(u'babel-core'),u'rawSpec':Js(u''),u'spec':Js(u'latest'),u'type':Js(u'tag')}) + PyJs_Object_403_ = Js({u'host':Js(u'packages-18-east.internal.npmjs.com'),u'tmp':Js(u'tmp/babel-core-6.18.2.tgz_1478035855416_0.08754534856416285')}) + PyJs_Object_404_ = Js({u'name':Js(u'hzoo'),u'email':Js(u'hi@henryzoo.com')}) + PyJs_Object_405_ = Js({u'brace-expansion':Js(u'1.1.5')}) + PyJs_Object_406_ = Js({u'raw':Js(u'babel-core'),u'scope':var.get(u"null"),u'escapedName':Js(u'babel-core'),u'name':Js(u'babel-core'),u'rawSpec':Js(u''),u'spec':Js(u'latest'),u'type':Js(u'tag')}) + PyJs_Object_407_ = Js({u'name':Js(u'Sebastian McKenzie'),u'email':Js(u'sebmck@gmail.com')}) + PyJs_Object_408_ = Js({u'babel-code-frame':Js(u'^6.16.0'),u'babel-generator':Js(u'^6.18.0'),u'babel-helpers':Js(u'^6.16.0'),u'babel-messages':Js(u'^6.8.0'),u'babel-register':Js(u'^6.18.0'),u'babel-runtime':Js(u'^6.9.1'),u'babel-template':Js(u'^6.16.0'),u'babel-traverse':Js(u'^6.18.0'),u'babel-types':Js(u'^6.18.0'),u'babylon':Js(u'^6.11.0'),u'convert-source-map':Js(u'^1.1.0'),u'debug':Js(u'^2.1.1'),u'json5':Js(u'^0.5.0'),u'lodash':Js(u'^4.2.0'),u'minimatch':Js(u'^3.0.2'),u'path-is-absolute':Js(u'^1.0.0'),u'private':Js(u'^0.1.6'),u'slash':Js(u'^1.0.0'),u'source-map':Js(u'^0.5.0')}) + PyJs_Object_409_ = Js({u'babel-helper-fixtures':Js(u'^6.18.2'),u'babel-helper-transform-fixture-test-runner':Js(u'^6.18.2'),u'babel-polyfill':Js(u'^6.16.0')}) + PyJs_Object_410_ = Js({}) + PyJs_Object_411_ = Js({u'shasum':Js(u'd8bb14dd6986fa4f3566a26ceda3964fa0e04e5b'),u'tarball':Js(u'https://registry.npmjs.org/babel-core/-/babel-core-6.18.2.tgz')}) + PyJs_Object_412_ = Js({u'name':Js(u'amasad'),u'email':Js(u'amjad.masad@gmail.com')}) + PyJs_Object_413_ = Js({u'name':Js(u'hzoo'),u'email':Js(u'hi@henryzoo.com')}) + PyJs_Object_414_ = Js({u'name':Js(u'jmm'),u'email':Js(u'npm-public@jessemccarthy.net')}) + PyJs_Object_415_ = Js({u'name':Js(u'loganfsmyth'),u'email':Js(u'loganfsmyth@gmail.com')}) + PyJs_Object_416_ = Js({u'name':Js(u'sebmck'),u'email':Js(u'sebmck@gmail.com')}) + PyJs_Object_417_ = Js({u'name':Js(u'thejameskyle'),u'email':Js(u'me@thejameskyle.com')}) + PyJs_Object_418_ = Js({}) + PyJs_Object_419_ = Js({u'type':Js(u'git'),u'url':Js(u'https://github.com/babel/babel/tree/master/packages/babel-core')}) + PyJs_Object_420_ = Js({u'bench':Js(u'make bench'),u'test':Js(u'make test')}) + PyJs_Object_401_ = Js({u'_args':Js([Js([PyJs_Object_402_, Js(u'/Users/PiotrDabkowski/PycharmProjects/Js2Py/js2py/es6')])]),u'_from':Js(u'babel-core@latest'),u'_id':Js(u'babel-core@6.18.2'),u'_inCache':var.get(u'true'),u'_location':Js(u'/babel-core'),u'_nodeVersion':Js(u'6.8.1'),u'_npmOperationalInternal':PyJs_Object_403_,u'_npmUser':PyJs_Object_404_,u'_npmVersion':Js(u'3.10.9'),u'_phantomChildren':PyJs_Object_405_,u'_requested':PyJs_Object_406_,u'_requiredBy':Js([Js(u'#USER'), Js(u'/babel-cli'), Js(u'/babel-register'), Js(u'/babelify')]),u'_resolved':Js(u'https://registry.npmjs.org/babel-core/-/babel-core-6.18.2.tgz'),u'_shasum':Js(u'd8bb14dd6986fa4f3566a26ceda3964fa0e04e5b'),u'_shrinkwrap':var.get(u"null"),u'_spec':Js(u'babel-core'),u'_where':Js(u'/Users/PiotrDabkowski/PycharmProjects/Js2Py/js2py/es6'),u'author':PyJs_Object_407_,u'dependencies':PyJs_Object_408_,u'description':Js(u'Babel compiler core.'),u'devDependencies':PyJs_Object_409_,u'directories':PyJs_Object_410_,u'dist':PyJs_Object_411_,u'homepage':Js(u'https://babeljs.io/'),u'keywords':Js([Js(u'6to5'), Js(u'babel'), Js(u'classes'), Js(u'const'), Js(u'es6'), Js(u'harmony'), Js(u'let'), Js(u'modules'), Js(u'transpile'), Js(u'transpiler'), Js(u'var')]),u'license':Js(u'MIT'),u'maintainers':Js([PyJs_Object_412_, PyJs_Object_413_, PyJs_Object_414_, PyJs_Object_415_, PyJs_Object_416_, PyJs_Object_417_]),u'name':Js(u'babel-core'),u'optionalDependencies':PyJs_Object_418_,u'readme':Js(u'ERROR: No README data found!'),u'repository':PyJs_Object_419_,u'scripts':PyJs_Object_420_,u'version':Js(u'6.18.2')}) + var.get(u'module').put(u'exports', PyJs_Object_401_) +PyJs_anonymous_400_._set_name(u'anonymous') +PyJs_Object_421_ = Js({}) +@Js +def PyJs_anonymous_422_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'Buffer', u'require', u'_trimEnd2', u'module', u'_trimEnd', u'_interopRequireDefault', u'SPACES_RE', u'_classCallCheck2', u'_classCallCheck3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_423_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_423_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_trimEnd', var.get(u'require')(Js(u'lodash/trimEnd'))) + var.put(u'_trimEnd2', var.get(u'_interopRequireDefault')(var.get(u'_trimEnd'))) + pass + var.put(u'SPACES_RE', JsRegExp(u'/^[ \\t]+$/')) + @Js + def PyJs_anonymous_424_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Buffer']) + @Js + def PyJsHoisted_Buffer_(map, this, arguments, var=var): + var = Scope({u'this':this, u'map':map, u'arguments':arguments}, var) + var.registers([u'map']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Buffer')) + var.get(u"this").put(u'_map', var.get(u"null")) + var.get(u"this").put(u'_buf', Js([])) + var.get(u"this").put(u'_last', Js(u'')) + var.get(u"this").put(u'_queue', Js([])) + PyJs_Object_425_ = Js({u'line':Js(1.0),u'column':Js(0.0)}) + var.get(u"this").put(u'_position', PyJs_Object_425_) + PyJs_Object_426_ = Js({u'identifierName':var.get(u"null"),u'line':var.get(u"null"),u'column':var.get(u"null"),u'filename':var.get(u"null")}) + var.get(u"this").put(u'_sourcePosition', PyJs_Object_426_) + var.get(u"this").put(u'_map', var.get(u'map')) + PyJsHoisted_Buffer_.func_name = u'Buffer' + var.put(u'Buffer', PyJsHoisted_Buffer_) + pass + @Js + def PyJs_get_427_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_427_}, var) + var.registers([]) + var.get(u"this").callprop(u'_flush') + PyJs_Object_428_ = Js({u'code':PyJsComma(Js(0.0),var.get(u'_trimEnd2').get(u'default'))(var.get(u"this").get(u'_buf').callprop(u'join', Js(u''))),u'map':(var.get(u"this").get(u'_map').callprop(u'get') if var.get(u"this").get(u'_map') else var.get(u"null"))}) + return PyJs_Object_428_ + PyJs_get_427_._set_name(u'get') + var.get(u'Buffer').get(u'prototype').put(u'get', PyJs_get_427_) + @Js + def PyJs_append_429_(str, this, arguments, var=var): + var = Scope({u'this':this, u'append':PyJs_append_429_, u'arguments':arguments, u'str':str}, var) + var.registers([u'identifierName', u'column', u'filename', u'str', u'line', u'_sourcePosition']) + var.get(u"this").callprop(u'_flush') + var.put(u'_sourcePosition', var.get(u"this").get(u'_sourcePosition')) + var.put(u'line', var.get(u'_sourcePosition').get(u'line')) + var.put(u'column', var.get(u'_sourcePosition').get(u'column')) + var.put(u'filename', var.get(u'_sourcePosition').get(u'filename')) + var.put(u'identifierName', var.get(u'_sourcePosition').get(u'identifierName')) + var.get(u"this").callprop(u'_append', var.get(u'str'), var.get(u'line'), var.get(u'column'), var.get(u'identifierName'), var.get(u'filename')) + PyJs_append_429_._set_name(u'append') + var.get(u'Buffer').get(u'prototype').put(u'append', PyJs_append_429_) + @Js + def PyJs_queue_430_(str, this, arguments, var=var): + var = Scope({u'this':this, u'queue':PyJs_queue_430_, u'arguments':arguments, u'str':str}, var) + var.registers([u'identifierName', u'column', u'filename', u'_sourcePosition2', u'str', u'line']) + if PyJsStrictEq(var.get(u'str'),Js(u'\n')): + while ((var.get(u"this").get(u'_queue').get(u'length')>Js(0.0)) and var.get(u'SPACES_RE').callprop(u'test', var.get(u"this").get(u'_queue').get(u'0').get(u'0'))): + var.get(u"this").get(u'_queue').callprop(u'shift') + var.put(u'_sourcePosition2', var.get(u"this").get(u'_sourcePosition')) + var.put(u'line', var.get(u'_sourcePosition2').get(u'line')) + var.put(u'column', var.get(u'_sourcePosition2').get(u'column')) + var.put(u'filename', var.get(u'_sourcePosition2').get(u'filename')) + var.put(u'identifierName', var.get(u'_sourcePosition2').get(u'identifierName')) + var.get(u"this").get(u'_queue').callprop(u'unshift', Js([var.get(u'str'), var.get(u'line'), var.get(u'column'), var.get(u'identifierName'), var.get(u'filename')])) + PyJs_queue_430_._set_name(u'queue') + var.get(u'Buffer').get(u'prototype').put(u'queue', PyJs_queue_430_) + @Js + def PyJs__flush_431_(this, arguments, var=var): + var = Scope({u'this':this, u'_flush':PyJs__flush_431_, u'arguments':arguments}, var) + var.registers([u'item']) + var.put(u'item', PyJsComma(Js(0.0), Js(None))) + while var.put(u'item', var.get(u"this").get(u'_queue').callprop(u'pop')): + var.get(u"this").get(u'_append').callprop(u'apply', var.get(u"this"), var.get(u'item')) + PyJs__flush_431_._set_name(u'_flush') + var.get(u'Buffer').get(u'prototype').put(u'_flush', PyJs__flush_431_) + @Js + def PyJs__append_432_(str, line, column, identifierName, filename, this, arguments, var=var): + var = Scope({u'this':this, u'_append':PyJs__append_432_, u'str':str, u'identifierName':identifierName, u'column':column, u'arguments':arguments, u'line':line, u'filename':filename}, var) + var.registers([u'identifierName', u'i', u'filename', u'column', u'str', u'line']) + if (var.get(u"this").get(u'_map') and PyJsStrictNeq(var.get(u'str').get(u'0'),Js(u'\n'))): + var.get(u"this").get(u'_map').callprop(u'mark', var.get(u"this").get(u'_position').get(u'line'), var.get(u"this").get(u'_position').get(u'column'), var.get(u'line'), var.get(u'column'), var.get(u'identifierName'), var.get(u'filename')) + var.get(u"this").get(u'_buf').callprop(u'push', var.get(u'str')) + var.get(u"this").put(u'_last', var.get(u'str').get((var.get(u'str').get(u'length')-Js(1.0)))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'str').get(u'length')): + try: + if PyJsStrictEq(var.get(u'str').get(var.get(u'i')),Js(u'\n')): + (var.get(u"this").get(u'_position').put(u'line',Js(var.get(u"this").get(u'_position').get(u'line').to_number())+Js(1))-Js(1)) + var.get(u"this").get(u'_position').put(u'column', Js(0.0)) + else: + (var.get(u"this").get(u'_position').put(u'column',Js(var.get(u"this").get(u'_position').get(u'column').to_number())+Js(1))-Js(1)) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJs__append_432_._set_name(u'_append') + var.get(u'Buffer').get(u'prototype').put(u'_append', PyJs__append_432_) + @Js + def PyJs_removeTrailingNewline_433_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'removeTrailingNewline':PyJs_removeTrailingNewline_433_}, var) + var.registers([]) + if ((var.get(u"this").get(u'_queue').get(u'length')>Js(0.0)) and PyJsStrictEq(var.get(u"this").get(u'_queue').get(u'0').get(u'0'),Js(u'\n'))): + var.get(u"this").get(u'_queue').callprop(u'shift') + PyJs_removeTrailingNewline_433_._set_name(u'removeTrailingNewline') + var.get(u'Buffer').get(u'prototype').put(u'removeTrailingNewline', PyJs_removeTrailingNewline_433_) + @Js + def PyJs_removeLastSemicolon_434_(this, arguments, var=var): + var = Scope({u'this':this, u'removeLastSemicolon':PyJs_removeLastSemicolon_434_, u'arguments':arguments}, var) + var.registers([]) + if ((var.get(u"this").get(u'_queue').get(u'length')>Js(0.0)) and PyJsStrictEq(var.get(u"this").get(u'_queue').get(u'0').get(u'0'),Js(u';'))): + var.get(u"this").get(u'_queue').callprop(u'shift') + PyJs_removeLastSemicolon_434_._set_name(u'removeLastSemicolon') + var.get(u'Buffer').get(u'prototype').put(u'removeLastSemicolon', PyJs_removeLastSemicolon_434_) + @Js + def PyJs_endsWith_435_(suffix, this, arguments, var=var): + var = Scope({u'this':this, u'endsWith':PyJs_endsWith_435_, u'suffix':suffix, u'arguments':arguments}, var) + var.registers([u'end', u'last', u'suffix', u'str']) + if PyJsStrictEq(var.get(u'suffix').get(u'length'),Js(1.0)): + var.put(u'last', PyJsComma(Js(0.0), Js(None))) + if (var.get(u"this").get(u'_queue').get(u'length')>Js(0.0)): + var.put(u'str', var.get(u"this").get(u'_queue').get(u'0').get(u'0')) + var.put(u'last', var.get(u'str').get((var.get(u'str').get(u'length')-Js(1.0)))) + else: + var.put(u'last', var.get(u"this").get(u'_last')) + return PyJsStrictEq(var.get(u'last'),var.get(u'suffix')) + @Js + def PyJs_anonymous_436_(acc, item, this, arguments, var=var): + var = Scope({u'acc':acc, u'item':item, u'this':this, u'arguments':arguments}, var) + var.registers([u'acc', u'item']) + return (var.get(u'item').get(u'0')+var.get(u'acc')) + PyJs_anonymous_436_._set_name(u'anonymous') + var.put(u'end', (var.get(u"this").get(u'_last')+var.get(u"this").get(u'_queue').callprop(u'reduce', PyJs_anonymous_436_, Js(u'')))) + if (var.get(u'suffix').get(u'length')<=var.get(u'end').get(u'length')): + return PyJsStrictEq(var.get(u'end').callprop(u'slice', (-var.get(u'suffix').get(u'length'))),var.get(u'suffix')) + return Js(False) + PyJs_endsWith_435_._set_name(u'endsWith') + var.get(u'Buffer').get(u'prototype').put(u'endsWith', PyJs_endsWith_435_) + @Js + def PyJs_hasContent_437_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'hasContent':PyJs_hasContent_437_}, var) + var.registers([]) + return ((var.get(u"this").get(u'_queue').get(u'length')>Js(0.0)) or var.get(u"this").get(u'_last').neg().neg()) + PyJs_hasContent_437_._set_name(u'hasContent') + var.get(u'Buffer').get(u'prototype').put(u'hasContent', PyJs_hasContent_437_) + @Js + def PyJs_source_438_(prop, loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'source':PyJs_source_438_, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'loc', u'pos', u'prop']) + if (var.get(u'prop') and var.get(u'loc').neg()): + return var.get('undefined') + var.put(u'pos', (var.get(u'loc').get(var.get(u'prop')) if var.get(u'loc') else var.get(u"null"))) + var.get(u"this").get(u'_sourcePosition').put(u'identifierName', ((var.get(u'loc') and var.get(u'loc').get(u'identifierName')) or var.get(u"null"))) + var.get(u"this").get(u'_sourcePosition').put(u'line', (var.get(u'pos').get(u'line') if var.get(u'pos') else var.get(u"null"))) + var.get(u"this").get(u'_sourcePosition').put(u'column', (var.get(u'pos').get(u'column') if var.get(u'pos') else var.get(u"null"))) + var.get(u"this").get(u'_sourcePosition').put(u'filename', ((var.get(u'loc') and var.get(u'loc').get(u'filename')) or var.get(u"null"))) + PyJs_source_438_._set_name(u'source') + var.get(u'Buffer').get(u'prototype').put(u'source', PyJs_source_438_) + @Js + def PyJs_withSource_439_(prop, loc, cb, this, arguments, var=var): + var = Scope({u'loc':loc, u'this':this, u'cb':cb, u'prop':prop, u'withSource':PyJs_withSource_439_, u'arguments':arguments}, var) + var.registers([u'originalColumn', u'originalIdentifierName', u'loc', u'cb', u'prop', u'originalLine', u'originalFilename']) + if var.get(u"this").get(u'_map').neg(): + return var.get(u'cb')() + var.put(u'originalLine', var.get(u"this").get(u'_sourcePosition').get(u'line')) + var.put(u'originalColumn', var.get(u"this").get(u'_sourcePosition').get(u'column')) + var.put(u'originalFilename', var.get(u"this").get(u'_sourcePosition').get(u'filename')) + var.put(u'originalIdentifierName', var.get(u"this").get(u'_sourcePosition').get(u'identifierName')) + var.get(u"this").callprop(u'source', var.get(u'prop'), var.get(u'loc')) + var.get(u'cb')() + var.get(u"this").get(u'_sourcePosition').put(u'line', var.get(u'originalLine')) + var.get(u"this").get(u'_sourcePosition').put(u'column', var.get(u'originalColumn')) + var.get(u"this").get(u'_sourcePosition').put(u'filename', var.get(u'originalFilename')) + var.get(u"this").get(u'_sourcePosition').put(u'identifierName', var.get(u'originalIdentifierName')) + PyJs_withSource_439_._set_name(u'withSource') + var.get(u'Buffer').get(u'prototype').put(u'withSource', PyJs_withSource_439_) + @Js + def PyJs_getCurrentColumn_440_(this, arguments, var=var): + var = Scope({u'this':this, u'getCurrentColumn':PyJs_getCurrentColumn_440_, u'arguments':arguments}, var) + var.registers([u'lastIndex', u'extra']) + @Js + def PyJs_anonymous_441_(acc, item, this, arguments, var=var): + var = Scope({u'acc':acc, u'item':item, u'this':this, u'arguments':arguments}, var) + var.registers([u'acc', u'item']) + return (var.get(u'item').get(u'0')+var.get(u'acc')) + PyJs_anonymous_441_._set_name(u'anonymous') + var.put(u'extra', var.get(u"this").get(u'_queue').callprop(u'reduce', PyJs_anonymous_441_, Js(u''))) + var.put(u'lastIndex', var.get(u'extra').callprop(u'lastIndexOf', Js(u'\n'))) + return ((var.get(u"this").get(u'_position').get(u'column')+var.get(u'extra').get(u'length')) if PyJsStrictEq(var.get(u'lastIndex'),(-Js(1.0))) else ((var.get(u'extra').get(u'length')-Js(1.0))-var.get(u'lastIndex'))) + PyJs_getCurrentColumn_440_._set_name(u'getCurrentColumn') + var.get(u'Buffer').get(u'prototype').put(u'getCurrentColumn', PyJs_getCurrentColumn_440_) + @Js + def PyJs_getCurrentLine_442_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getCurrentLine':PyJs_getCurrentLine_442_}, var) + var.registers([u'count', u'i', u'extra']) + @Js + def PyJs_anonymous_443_(acc, item, this, arguments, var=var): + var = Scope({u'acc':acc, u'item':item, u'this':this, u'arguments':arguments}, var) + var.registers([u'acc', u'item']) + return (var.get(u'item').get(u'0')+var.get(u'acc')) + PyJs_anonymous_443_._set_name(u'anonymous') + var.put(u'extra', var.get(u"this").get(u'_queue').callprop(u'reduce', PyJs_anonymous_443_, Js(u''))) + var.put(u'count', Js(0.0)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'extra').get(u'length')): + try: + if PyJsStrictEq(var.get(u'extra').get(var.get(u'i')),Js(u'\n')): + (var.put(u'count',Js(var.get(u'count').to_number())+Js(1))-Js(1)) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return (var.get(u"this").get(u'_position').get(u'line')+var.get(u'count')) + PyJs_getCurrentLine_442_._set_name(u'getCurrentLine') + var.get(u'Buffer').get(u'prototype').put(u'getCurrentLine', PyJs_getCurrentLine_442_) + return var.get(u'Buffer') + PyJs_anonymous_424_._set_name(u'anonymous') + var.put(u'Buffer', PyJs_anonymous_424_()) + var.get(u'exports').put(u'default', var.get(u'Buffer')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_422_._set_name(u'anonymous') +PyJs_Object_444_ = Js({u'babel-runtime/helpers/classCallCheck':Js(110.0),u'lodash/trimEnd':Js(494.0)}) +@Js +def PyJs_anonymous_445_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_types', u'exports', u'Directive', u'require', u'module', u'Program', u'Noop', u'File', u'BlockStatement']) + @Js + def PyJsHoisted_BlockStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'{')) + var.get(u"this").callprop(u'printInnerComments', var.get(u'node')) + if var.get(u'node').get(u'body').get(u'length'): + var.get(u"this").callprop(u'newline') + PyJs_Object_448_ = Js({u'indent':var.get(u'true')}) + var.get(u"this").callprop(u'printSequence', var.get(u'node').get(u'directives'), var.get(u'node'), PyJs_Object_448_) + if (var.get(u'node').get(u'directives') and var.get(u'node').get(u'directives').get(u'length')): + var.get(u"this").callprop(u'newline') + PyJs_Object_449_ = Js({u'indent':var.get(u'true')}) + var.get(u"this").callprop(u'printSequence', var.get(u'node').get(u'body'), var.get(u'node'), PyJs_Object_449_) + var.get(u"this").callprop(u'removeTrailingNewline') + var.get(u"this").callprop(u'source', Js(u'end'), var.get(u'node').get(u'loc')) + if var.get(u"this").callprop(u'endsWith', Js(u'\n')).neg(): + var.get(u"this").callprop(u'newline') + var.get(u"this").callprop(u'rightBrace') + else: + var.get(u"this").callprop(u'source', Js(u'end'), var.get(u'node').get(u'loc')) + var.get(u"this").callprop(u'token', Js(u'}')) + PyJsHoisted_BlockStatement_.func_name = u'BlockStatement' + var.put(u'BlockStatement', PyJsHoisted_BlockStatement_) + @Js + def PyJsHoisted_Program_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'printInnerComments', var.get(u'node'), Js(False)) + var.get(u"this").callprop(u'printSequence', var.get(u'node').get(u'directives'), var.get(u'node')) + if (var.get(u'node').get(u'directives') and var.get(u'node').get(u'directives').get(u'length')): + var.get(u"this").callprop(u'newline') + var.get(u"this").callprop(u'printSequence', var.get(u'node').get(u'body'), var.get(u'node')) + PyJsHoisted_Program_.func_name = u'Program' + var.put(u'Program', PyJsHoisted_Program_) + @Js + def PyJsHoisted_Noop_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJsHoisted_Noop_.func_name = u'Noop' + var.put(u'Noop', PyJsHoisted_Noop_) + @Js + def PyJsHoisted_Directive_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'value'), var.get(u'node')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_Directive_.func_name = u'Directive' + var.put(u'Directive', PyJsHoisted_Directive_) + @Js + def PyJsHoisted_File_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'program'), var.get(u'node')) + PyJsHoisted_File_.func_name = u'File' + var.put(u'File', PyJsHoisted_File_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'File', var.get(u'File')) + var.get(u'exports').put(u'Program', var.get(u'Program')) + var.get(u'exports').put(u'BlockStatement', var.get(u'BlockStatement')) + var.get(u'exports').put(u'Noop', var.get(u'Noop')) + var.get(u'exports').put(u'Directive', var.get(u'Directive')) + var.put(u'_types', var.get(u'require')(Js(u'./types'))) + @Js + def PyJs_get_447_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_447_}, var) + var.registers([]) + return var.get(u'_types').get(u'StringLiteral') + PyJs_get_447_._set_name(u'get') + PyJs_Object_446_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_447_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'DirectiveLiteral'), PyJs_Object_446_) + pass + pass + pass + pass + pass +PyJs_anonymous_445_._set_name(u'anonymous') +PyJs_Object_450_ = Js({u'./types':Js(39.0)}) +@Js +def PyJs_anonymous_451_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'ClassProperty', u'ClassMethod', u'require', u'module', u'ClassDeclaration', u'ClassBody']) + @Js + def PyJsHoisted_ClassMethod_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'printJoin', var.get(u'node').get(u'decorators'), var.get(u'node')) + if var.get(u'node').get(u'static'): + var.get(u"this").callprop(u'word', Js(u'static')) + var.get(u"this").callprop(u'space') + if PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'constructorCall')): + var.get(u"this").callprop(u'word', Js(u'call')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'_method', var.get(u'node')) + PyJsHoisted_ClassMethod_.func_name = u'ClassMethod' + var.put(u'ClassMethod', PyJsHoisted_ClassMethod_) + @Js + def PyJsHoisted_ClassDeclaration_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'printJoin', var.get(u'node').get(u'decorators'), var.get(u'node')) + var.get(u"this").callprop(u'word', Js(u'class')) + if var.get(u'node').get(u'id'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id'), var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeParameters'), var.get(u'node')) + if var.get(u'node').get(u'superClass'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'extends')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'superClass'), var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'superTypeParameters'), var.get(u'node')) + if var.get(u'node').get(u'implements'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'implements')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'implements'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'body'), var.get(u'node')) + PyJsHoisted_ClassDeclaration_.func_name = u'ClassDeclaration' + var.put(u'ClassDeclaration', PyJsHoisted_ClassDeclaration_) + @Js + def PyJsHoisted_ClassBody_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'{')) + var.get(u"this").callprop(u'printInnerComments', var.get(u'node')) + if PyJsStrictEq(var.get(u'node').get(u'body').get(u'length'),Js(0.0)): + var.get(u"this").callprop(u'token', Js(u'}')) + else: + var.get(u"this").callprop(u'newline') + var.get(u"this").callprop(u'indent') + var.get(u"this").callprop(u'printSequence', var.get(u'node').get(u'body'), var.get(u'node')) + var.get(u"this").callprop(u'dedent') + if var.get(u"this").callprop(u'endsWith', Js(u'\n')).neg(): + var.get(u"this").callprop(u'newline') + var.get(u"this").callprop(u'rightBrace') + PyJsHoisted_ClassBody_.func_name = u'ClassBody' + var.put(u'ClassBody', PyJsHoisted_ClassBody_) + @Js + def PyJsHoisted_ClassProperty_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'printJoin', var.get(u'node').get(u'decorators'), var.get(u'node')) + if var.get(u'node').get(u'static'): + var.get(u"this").callprop(u'word', Js(u'static')) + var.get(u"this").callprop(u'space') + if var.get(u'node').get(u'computed'): + var.get(u"this").callprop(u'token', Js(u'[')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'key'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u']')) + else: + var.get(u"this").callprop(u'_variance', var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'key'), var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeAnnotation'), var.get(u'node')) + if var.get(u'node').get(u'value'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'=')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'value'), var.get(u'node')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_ClassProperty_.func_name = u'ClassProperty' + var.put(u'ClassProperty', PyJsHoisted_ClassProperty_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'ClassDeclaration', var.get(u'ClassDeclaration')) + var.get(u'exports').put(u'ClassBody', var.get(u'ClassBody')) + var.get(u'exports').put(u'ClassProperty', var.get(u'ClassProperty')) + var.get(u'exports').put(u'ClassMethod', var.get(u'ClassMethod')) + pass + var.get(u'exports').put(u'ClassExpression', var.get(u'ClassDeclaration')) + pass + pass + pass +PyJs_anonymous_451_._set_name(u'anonymous') +PyJs_Object_452_ = Js({}) +@Js +def PyJs_anonymous_453_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'ParenthesizedExpression', u'MetaProperty', u'CallExpression', u'ExpressionStatement', u'UpdateExpression', u'module', u'_interopRequireDefault', u'_isNumber', u'_node', u'Super', u'Decorator', u'_isNumber2', u'AssignmentExpression', u'exports', u'commaSeparatorNewline', u'buildYieldAwait', u'_interopRequireWildcard', u'_babelTypes', u'ConditionalExpression', u'DoExpression', u'MemberExpression', u'SequenceExpression', u'UnaryExpression', u'AwaitExpression', u'NewExpression', u'require', u'BindExpression', u'n', u'ThisExpression', u'YieldExpression', u't', u'AssignmentPattern', u'EmptyStatement']) + @Js + def PyJsHoisted_ParenthesizedExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'expression'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + PyJsHoisted_ParenthesizedExpression_.func_name = u'ParenthesizedExpression' + var.put(u'ParenthesizedExpression', PyJsHoisted_ParenthesizedExpression_) + @Js + def PyJsHoisted_MetaProperty_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'meta'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'.')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'property'), var.get(u'node')) + PyJsHoisted_MetaProperty_.func_name = u'MetaProperty' + var.put(u'MetaProperty', PyJsHoisted_MetaProperty_) + @Js + def PyJsHoisted_CallExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'separator', u'isPrettyCall']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'callee'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'(')) + var.put(u'isPrettyCall', var.get(u'node').get(u'_prettyCall')) + var.put(u'separator', PyJsComma(Js(0.0), Js(None))) + if var.get(u'isPrettyCall'): + var.put(u'separator', var.get(u'commaSeparatorNewline')) + var.get(u"this").callprop(u'newline') + var.get(u"this").callprop(u'indent') + PyJs_Object_457_ = Js({u'separator':var.get(u'separator')}) + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'arguments'), var.get(u'node'), PyJs_Object_457_) + if var.get(u'isPrettyCall'): + var.get(u"this").callprop(u'newline') + var.get(u"this").callprop(u'dedent') + var.get(u"this").callprop(u'token', Js(u')')) + PyJsHoisted_CallExpression_.func_name = u'CallExpression' + var.put(u'CallExpression', PyJsHoisted_CallExpression_) + @Js + def PyJsHoisted_ExpressionStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'expression'), var.get(u'node')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_ExpressionStatement_.func_name = u'ExpressionStatement' + var.put(u'ExpressionStatement', PyJsHoisted_ExpressionStatement_) + @Js + def PyJsHoisted_UpdateExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u'node').get(u'prefix'): + var.get(u"this").callprop(u'token', var.get(u'node').get(u'operator')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'argument'), var.get(u'node')) + else: + var.get(u"this").callprop(u'print', var.get(u'node').get(u'argument'), var.get(u'node')) + var.get(u"this").callprop(u'token', var.get(u'node').get(u'operator')) + PyJsHoisted_UpdateExpression_.func_name = u'UpdateExpression' + var.put(u'UpdateExpression', PyJsHoisted_UpdateExpression_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_455_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_455_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_Super_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'super')) + PyJsHoisted_Super_.func_name = u'Super' + var.put(u'Super', PyJsHoisted_Super_) + @Js + def PyJsHoisted_Decorator_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'@')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'expression'), var.get(u'node')) + var.get(u"this").callprop(u'newline') + PyJsHoisted_Decorator_.func_name = u'Decorator' + var.put(u'Decorator', PyJsHoisted_Decorator_) + @Js + def PyJsHoisted_AssignmentExpression_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parens', u'parent']) + var.put(u'parens', ((var.get(u"this").get(u'inForStatementInitCounter') and PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'in'))) and var.get(u'n').callprop(u'needsParens', var.get(u'node'), var.get(u'parent')).neg())) + if var.get(u'parens'): + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'left'), var.get(u'node')) + var.get(u"this").callprop(u'space') + if (PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'in')) or PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'instanceof'))): + var.get(u"this").callprop(u'word', var.get(u'node').get(u'operator')) + else: + var.get(u"this").callprop(u'token', var.get(u'node').get(u'operator')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'right'), var.get(u'node')) + if var.get(u'parens'): + var.get(u"this").callprop(u'token', Js(u')')) + PyJsHoisted_AssignmentExpression_.func_name = u'AssignmentExpression' + var.put(u'AssignmentExpression', PyJsHoisted_AssignmentExpression_) + @Js + def PyJsHoisted_commaSeparatorNewline_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'token', Js(u',')) + var.get(u"this").callprop(u'newline') + if var.get(u"this").callprop(u'endsWith', Js(u'\n')).neg(): + var.get(u"this").callprop(u'space') + PyJsHoisted_commaSeparatorNewline_.func_name = u'commaSeparatorNewline' + var.put(u'commaSeparatorNewline', PyJsHoisted_commaSeparatorNewline_) + @Js + def PyJsHoisted_buildYieldAwait_(keyword, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'keyword':keyword}, var) + var.registers([u'keyword']) + @Js + def PyJs_anonymous_458_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'terminatorState']) + var.get(u"this").callprop(u'word', var.get(u'keyword')) + if var.get(u'node').get(u'delegate'): + var.get(u"this").callprop(u'token', Js(u'*')) + if var.get(u'node').get(u'argument'): + var.get(u"this").callprop(u'space') + var.put(u'terminatorState', var.get(u"this").callprop(u'startTerminatorless')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'argument'), var.get(u'node')) + var.get(u"this").callprop(u'endTerminatorless', var.get(u'terminatorState')) + PyJs_anonymous_458_._set_name(u'anonymous') + return PyJs_anonymous_458_ + PyJsHoisted_buildYieldAwait_.func_name = u'buildYieldAwait' + var.put(u'buildYieldAwait', PyJsHoisted_buildYieldAwait_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_454_ = Js({}) + var.put(u'newObj', PyJs_Object_454_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_ThisExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'this')) + PyJsHoisted_ThisExpression_.func_name = u'ThisExpression' + var.put(u'ThisExpression', PyJsHoisted_ThisExpression_) + @Js + def PyJsHoisted_ConditionalExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'test'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'?')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'consequent'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u':')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'alternate'), var.get(u'node')) + PyJsHoisted_ConditionalExpression_.func_name = u'ConditionalExpression' + var.put(u'ConditionalExpression', PyJsHoisted_ConditionalExpression_) + @Js + def PyJsHoisted_DoExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'do')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'body'), var.get(u'node')) + PyJsHoisted_DoExpression_.func_name = u'DoExpression' + var.put(u'DoExpression', PyJsHoisted_DoExpression_) + @Js + def PyJsHoisted_MemberExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'computed']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'object'), var.get(u'node')) + if (var.get(u'node').get(u'computed').neg() and var.get(u't').callprop(u'isMemberExpression', var.get(u'node').get(u'property'))): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Got a MemberExpression for MemberExpression property'))) + raise PyJsTempException + var.put(u'computed', var.get(u'node').get(u'computed')) + if (var.get(u't').callprop(u'isLiteral', var.get(u'node').get(u'property')) and PyJsComma(Js(0.0),var.get(u'_isNumber2').get(u'default'))(var.get(u'node').get(u'property').get(u'value'))): + var.put(u'computed', var.get(u'true')) + if var.get(u'computed'): + var.get(u"this").callprop(u'token', Js(u'[')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'property'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u']')) + else: + var.get(u"this").callprop(u'token', Js(u'.')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'property'), var.get(u'node')) + PyJsHoisted_MemberExpression_.func_name = u'MemberExpression' + var.put(u'MemberExpression', PyJsHoisted_MemberExpression_) + @Js + def PyJsHoisted_SequenceExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'expressions'), var.get(u'node')) + PyJsHoisted_SequenceExpression_.func_name = u'SequenceExpression' + var.put(u'SequenceExpression', PyJsHoisted_SequenceExpression_) + @Js + def PyJsHoisted_UnaryExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if ((PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'void')) or PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'delete'))) or PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'typeof'))): + var.get(u"this").callprop(u'word', var.get(u'node').get(u'operator')) + var.get(u"this").callprop(u'space') + else: + var.get(u"this").callprop(u'token', var.get(u'node').get(u'operator')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'argument'), var.get(u'node')) + PyJsHoisted_UnaryExpression_.func_name = u'UnaryExpression' + var.put(u'UnaryExpression', PyJsHoisted_UnaryExpression_) + @Js + def PyJsHoisted_NewExpression_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + var.get(u"this").callprop(u'word', Js(u'new')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'callee'), var.get(u'node')) + PyJs_Object_456_ = Js({u'callee':var.get(u'node')}) + if ((((PyJsStrictEq(var.get(u'node').get(u'arguments').get(u'length'),Js(0.0)) and var.get(u"this").get(u'format').get(u'minified')) and var.get(u't').callprop(u'isCallExpression', var.get(u'parent'), PyJs_Object_456_).neg()) and var.get(u't').callprop(u'isMemberExpression', var.get(u'parent')).neg()) and var.get(u't').callprop(u'isNewExpression', var.get(u'parent')).neg()): + return var.get('undefined') + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'arguments'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + PyJsHoisted_NewExpression_.func_name = u'NewExpression' + var.put(u'NewExpression', PyJsHoisted_NewExpression_) + @Js + def PyJsHoisted_BindExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'object'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'::')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'callee'), var.get(u'node')) + PyJsHoisted_BindExpression_.func_name = u'BindExpression' + var.put(u'BindExpression', PyJsHoisted_BindExpression_) + @Js + def PyJsHoisted_AssignmentPattern_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'left'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'=')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'right'), var.get(u'node')) + PyJsHoisted_AssignmentPattern_.func_name = u'AssignmentPattern' + var.put(u'AssignmentPattern', PyJsHoisted_AssignmentPattern_) + @Js + def PyJsHoisted_EmptyStatement_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'semicolon', var.get(u'true')) + PyJsHoisted_EmptyStatement_.func_name = u'EmptyStatement' + var.put(u'EmptyStatement', PyJsHoisted_EmptyStatement_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'LogicalExpression', var.get(u'exports').put(u'BinaryExpression', var.get(u'exports').put(u'AwaitExpression', var.get(u'exports').put(u'YieldExpression', var.get(u'undefined'))))) + var.get(u'exports').put(u'UnaryExpression', var.get(u'UnaryExpression')) + var.get(u'exports').put(u'DoExpression', var.get(u'DoExpression')) + var.get(u'exports').put(u'ParenthesizedExpression', var.get(u'ParenthesizedExpression')) + var.get(u'exports').put(u'UpdateExpression', var.get(u'UpdateExpression')) + var.get(u'exports').put(u'ConditionalExpression', var.get(u'ConditionalExpression')) + var.get(u'exports').put(u'NewExpression', var.get(u'NewExpression')) + var.get(u'exports').put(u'SequenceExpression', var.get(u'SequenceExpression')) + var.get(u'exports').put(u'ThisExpression', var.get(u'ThisExpression')) + var.get(u'exports').put(u'Super', var.get(u'Super')) + var.get(u'exports').put(u'Decorator', var.get(u'Decorator')) + var.get(u'exports').put(u'CallExpression', var.get(u'CallExpression')) + var.get(u'exports').put(u'EmptyStatement', var.get(u'EmptyStatement')) + var.get(u'exports').put(u'ExpressionStatement', var.get(u'ExpressionStatement')) + var.get(u'exports').put(u'AssignmentPattern', var.get(u'AssignmentPattern')) + var.get(u'exports').put(u'AssignmentExpression', var.get(u'AssignmentExpression')) + var.get(u'exports').put(u'BindExpression', var.get(u'BindExpression')) + var.get(u'exports').put(u'MemberExpression', var.get(u'MemberExpression')) + var.get(u'exports').put(u'MetaProperty', var.get(u'MetaProperty')) + var.put(u'_isNumber', var.get(u'require')(Js(u'lodash/isNumber'))) + var.put(u'_isNumber2', var.get(u'_interopRequireDefault')(var.get(u'_isNumber'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_node', var.get(u'require')(Js(u'../node'))) + var.put(u'n', var.get(u'_interopRequireWildcard')(var.get(u'_node'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + var.put(u'YieldExpression', var.get(u'exports').put(u'YieldExpression', var.get(u'buildYieldAwait')(Js(u'yield')))) + var.put(u'AwaitExpression', var.get(u'exports').put(u'AwaitExpression', var.get(u'buildYieldAwait')(Js(u'await')))) + pass + pass + pass + pass + pass + var.get(u'exports').put(u'BinaryExpression', var.get(u'AssignmentExpression')) + var.get(u'exports').put(u'LogicalExpression', var.get(u'AssignmentExpression')) + pass + pass +PyJs_anonymous_453_._set_name(u'anonymous') +PyJs_Object_459_ = Js({u'../node':Js(41.0),u'babel-types':Js(258.0),u'lodash/isNumber':Js(466.0)}) +@Js +def PyJs_anonymous_460_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_interfaceish', u'QualifiedTypeIdentifier', u'DeclareFunction', u'exports', u'module', u'StringTypeAnnotation', u'InterfaceDeclaration', u'InterfaceExtends', u'EmptyTypeAnnotation', u'AnyTypeAnnotation', u'ThisTypeAnnotation', u'ObjectTypeIndexer', u'ObjectTypeAnnotation', u'DeclareClass', u'NumberTypeAnnotation', u'ArrayTypeAnnotation', u'MixedTypeAnnotation', u'DeclareInterface', u'DeclareTypeAlias', u'TypeAlias', u'TypeofTypeAnnotation', u'DeclareVariable', u'NullLiteralTypeAnnotation', u'TypeParameterInstantiation', u'TypeParameter', u'ExistentialTypeParam', u'FunctionTypeParam', u'orSeparator', u'UnionTypeAnnotation', u'DeclareModuleExports', u'TypeCastExpression', u'BooleanLiteralTypeAnnotation', u'VoidTypeAnnotation', u'ObjectTypeProperty', u'IntersectionTypeAnnotation', u'ObjectTypeCallProperty', u'TupleTypeAnnotation', u'_types', u'TypeAnnotation', u'require', u'_variance', u'FunctionTypeAnnotation', u'DeclareModule', u'NullableTypeAnnotation', u'andSeparator', u'BooleanTypeAnnotation']) + @Js + def PyJsHoisted__interfaceish_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id'), var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeParameters'), var.get(u'node')) + if var.get(u'node').get(u'extends').get(u'length'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'extends')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'extends'), var.get(u'node')) + if (var.get(u'node').get(u'mixins') and var.get(u'node').get(u'mixins').get(u'length')): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'mixins')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'mixins'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'body'), var.get(u'node')) + PyJsHoisted__interfaceish_.func_name = u'_interfaceish' + var.put(u'_interfaceish', PyJsHoisted__interfaceish_) + @Js + def PyJsHoisted_QualifiedTypeIdentifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'qualification'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'.')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id'), var.get(u'node')) + PyJsHoisted_QualifiedTypeIdentifier_.func_name = u'QualifiedTypeIdentifier' + var.put(u'QualifiedTypeIdentifier', PyJsHoisted_QualifiedTypeIdentifier_) + @Js + def PyJsHoisted_DeclareFunction_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'declare')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'function')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id'), var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id').get(u'typeAnnotation').get(u'typeAnnotation'), var.get(u'node')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_DeclareFunction_.func_name = u'DeclareFunction' + var.put(u'DeclareFunction', PyJsHoisted_DeclareFunction_) + @Js + def PyJsHoisted_StringTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'string')) + PyJsHoisted_StringTypeAnnotation_.func_name = u'StringTypeAnnotation' + var.put(u'StringTypeAnnotation', PyJsHoisted_StringTypeAnnotation_) + @Js + def PyJsHoisted_InterfaceDeclaration_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'interface')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'_interfaceish', var.get(u'node')) + PyJsHoisted_InterfaceDeclaration_.func_name = u'InterfaceDeclaration' + var.put(u'InterfaceDeclaration', PyJsHoisted_InterfaceDeclaration_) + @Js + def PyJsHoisted_InterfaceExtends_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id'), var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeParameters'), var.get(u'node')) + PyJsHoisted_InterfaceExtends_.func_name = u'InterfaceExtends' + var.put(u'InterfaceExtends', PyJsHoisted_InterfaceExtends_) + @Js + def PyJsHoisted_EmptyTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'empty')) + PyJsHoisted_EmptyTypeAnnotation_.func_name = u'EmptyTypeAnnotation' + var.put(u'EmptyTypeAnnotation', PyJsHoisted_EmptyTypeAnnotation_) + @Js + def PyJsHoisted_AnyTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'any')) + PyJsHoisted_AnyTypeAnnotation_.func_name = u'AnyTypeAnnotation' + var.put(u'AnyTypeAnnotation', PyJsHoisted_AnyTypeAnnotation_) + @Js + def PyJsHoisted_ThisTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'this')) + PyJsHoisted_ThisTypeAnnotation_.func_name = u'ThisTypeAnnotation' + var.put(u'ThisTypeAnnotation', PyJsHoisted_ThisTypeAnnotation_) + @Js + def PyJsHoisted_ObjectTypeIndexer_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u'node').get(u'static'): + var.get(u"this").callprop(u'word', Js(u'static')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'_variance', var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'[')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u':')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'key'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u']')) + var.get(u"this").callprop(u'token', Js(u':')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'value'), var.get(u'node')) + PyJsHoisted_ObjectTypeIndexer_.func_name = u'ObjectTypeIndexer' + var.put(u'ObjectTypeIndexer', PyJsHoisted_ObjectTypeIndexer_) + @Js + def PyJsHoisted_ObjectTypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_this', u'props']) + var.put(u'_this', var.get(u"this")) + if var.get(u'node').get(u'exact'): + var.get(u"this").callprop(u'token', Js(u'{|')) + else: + var.get(u"this").callprop(u'token', Js(u'{')) + var.put(u'props', var.get(u'node').get(u'properties').callprop(u'concat', var.get(u'node').get(u'callProperties'), var.get(u'node').get(u'indexers'))) + if var.get(u'props').get(u'length'): + var.get(u"this").callprop(u'space') + @Js + def PyJs_iterator_468_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'iterator':PyJs_iterator_468_}, var) + var.registers([]) + if PyJsStrictNeq(var.get(u'props').get(u'length'),Js(1.0)): + var.get(u'_this').callprop(u'semicolon') + var.get(u'_this').callprop(u'space') + PyJs_iterator_468_._set_name(u'iterator') + PyJs_Object_467_ = Js({u'indent':var.get(u'true'),u'statement':var.get(u'true'),u'iterator':PyJs_iterator_468_}) + var.get(u"this").callprop(u'printJoin', var.get(u'props'), var.get(u'node'), PyJs_Object_467_) + var.get(u"this").callprop(u'space') + if var.get(u'node').get(u'exact'): + var.get(u"this").callprop(u'token', Js(u'|}')) + else: + var.get(u"this").callprop(u'token', Js(u'}')) + PyJsHoisted_ObjectTypeAnnotation_.func_name = u'ObjectTypeAnnotation' + var.put(u'ObjectTypeAnnotation', PyJsHoisted_ObjectTypeAnnotation_) + @Js + def PyJsHoisted_DeclareClass_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'declare')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'class')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'_interfaceish', var.get(u'node')) + PyJsHoisted_DeclareClass_.func_name = u'DeclareClass' + var.put(u'DeclareClass', PyJsHoisted_DeclareClass_) + @Js + def PyJsHoisted_NumberTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'number')) + PyJsHoisted_NumberTypeAnnotation_.func_name = u'NumberTypeAnnotation' + var.put(u'NumberTypeAnnotation', PyJsHoisted_NumberTypeAnnotation_) + @Js + def PyJsHoisted_ArrayTypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'elementType'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'[')) + var.get(u"this").callprop(u'token', Js(u']')) + PyJsHoisted_ArrayTypeAnnotation_.func_name = u'ArrayTypeAnnotation' + var.put(u'ArrayTypeAnnotation', PyJsHoisted_ArrayTypeAnnotation_) + @Js + def PyJsHoisted_MixedTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'mixed')) + PyJsHoisted_MixedTypeAnnotation_.func_name = u'MixedTypeAnnotation' + var.put(u'MixedTypeAnnotation', PyJsHoisted_MixedTypeAnnotation_) + @Js + def PyJsHoisted_DeclareInterface_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'declare')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'InterfaceDeclaration', var.get(u'node')) + PyJsHoisted_DeclareInterface_.func_name = u'DeclareInterface' + var.put(u'DeclareInterface', PyJsHoisted_DeclareInterface_) + @Js + def PyJsHoisted_DeclareTypeAlias_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'declare')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'TypeAlias', var.get(u'node')) + PyJsHoisted_DeclareTypeAlias_.func_name = u'DeclareTypeAlias' + var.put(u'DeclareTypeAlias', PyJsHoisted_DeclareTypeAlias_) + @Js + def PyJsHoisted_TypeAlias_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'type')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id'), var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeParameters'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'=')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'right'), var.get(u'node')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_TypeAlias_.func_name = u'TypeAlias' + var.put(u'TypeAlias', PyJsHoisted_TypeAlias_) + @Js + def PyJsHoisted_TypeofTypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'typeof')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'argument'), var.get(u'node')) + PyJsHoisted_TypeofTypeAnnotation_.func_name = u'TypeofTypeAnnotation' + var.put(u'TypeofTypeAnnotation', PyJsHoisted_TypeofTypeAnnotation_) + @Js + def PyJsHoisted_DeclareVariable_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'declare')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'var')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id'), var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id').get(u'typeAnnotation'), var.get(u'node')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_DeclareVariable_.func_name = u'DeclareVariable' + var.put(u'DeclareVariable', PyJsHoisted_DeclareVariable_) + @Js + def PyJsHoisted_NullLiteralTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'null')) + PyJsHoisted_NullLiteralTypeAnnotation_.func_name = u'NullLiteralTypeAnnotation' + var.put(u'NullLiteralTypeAnnotation', PyJsHoisted_NullLiteralTypeAnnotation_) + @Js + def PyJsHoisted_TypeParameterInstantiation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'<')) + PyJs_Object_466_ = Js({}) + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'params'), var.get(u'node'), PyJs_Object_466_) + var.get(u"this").callprop(u'token', Js(u'>')) + PyJsHoisted_TypeParameterInstantiation_.func_name = u'TypeParameterInstantiation' + var.put(u'TypeParameterInstantiation', PyJsHoisted_TypeParameterInstantiation_) + @Js + def PyJsHoisted_TypeParameter_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'_variance', var.get(u'node')) + var.get(u"this").callprop(u'word', var.get(u'node').get(u'name')) + if var.get(u'node').get(u'bound'): + var.get(u"this").callprop(u'print', var.get(u'node').get(u'bound'), var.get(u'node')) + if var.get(u'node').get(u'default'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'=')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'default'), var.get(u'node')) + PyJsHoisted_TypeParameter_.func_name = u'TypeParameter' + var.put(u'TypeParameter', PyJsHoisted_TypeParameter_) + @Js + def PyJsHoisted_ExistentialTypeParam_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'token', Js(u'*')) + PyJsHoisted_ExistentialTypeParam_.func_name = u'ExistentialTypeParam' + var.put(u'ExistentialTypeParam', PyJsHoisted_ExistentialTypeParam_) + @Js + def PyJsHoisted_FunctionTypeParam_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'name'), var.get(u'node')) + if var.get(u'node').get(u'optional'): + var.get(u"this").callprop(u'token', Js(u'?')) + var.get(u"this").callprop(u'token', Js(u':')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeAnnotation'), var.get(u'node')) + PyJsHoisted_FunctionTypeParam_.func_name = u'FunctionTypeParam' + var.put(u'FunctionTypeParam', PyJsHoisted_FunctionTypeParam_) + @Js + def PyJsHoisted_orSeparator_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'|')) + var.get(u"this").callprop(u'space') + PyJsHoisted_orSeparator_.func_name = u'orSeparator' + var.put(u'orSeparator', PyJsHoisted_orSeparator_) + @Js + def PyJsHoisted_UnionTypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + PyJs_Object_469_ = Js({u'separator':var.get(u'orSeparator')}) + var.get(u"this").callprop(u'printJoin', var.get(u'node').get(u'types'), var.get(u'node'), PyJs_Object_469_) + PyJsHoisted_UnionTypeAnnotation_.func_name = u'UnionTypeAnnotation' + var.put(u'UnionTypeAnnotation', PyJsHoisted_UnionTypeAnnotation_) + @Js + def PyJsHoisted_DeclareModuleExports_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'declare')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'module')) + var.get(u"this").callprop(u'token', Js(u'.')) + var.get(u"this").callprop(u'word', Js(u'exports')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeAnnotation'), var.get(u'node')) + PyJsHoisted_DeclareModuleExports_.func_name = u'DeclareModuleExports' + var.put(u'DeclareModuleExports', PyJsHoisted_DeclareModuleExports_) + @Js + def PyJsHoisted_TypeCastExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'expression'), var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeAnnotation'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + PyJsHoisted_TypeCastExpression_.func_name = u'TypeCastExpression' + var.put(u'TypeCastExpression', PyJsHoisted_TypeCastExpression_) + @Js + def PyJsHoisted_BooleanLiteralTypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', (Js(u'true') if var.get(u'node').get(u'value') else Js(u'false'))) + PyJsHoisted_BooleanLiteralTypeAnnotation_.func_name = u'BooleanLiteralTypeAnnotation' + var.put(u'BooleanLiteralTypeAnnotation', PyJsHoisted_BooleanLiteralTypeAnnotation_) + @Js + def PyJsHoisted_VoidTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'void')) + PyJsHoisted_VoidTypeAnnotation_.func_name = u'VoidTypeAnnotation' + var.put(u'VoidTypeAnnotation', PyJsHoisted_VoidTypeAnnotation_) + @Js + def PyJsHoisted_ObjectTypeProperty_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u'node').get(u'static'): + var.get(u"this").callprop(u'word', Js(u'static')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'_variance', var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'key'), var.get(u'node')) + if var.get(u'node').get(u'optional'): + var.get(u"this").callprop(u'token', Js(u'?')) + var.get(u"this").callprop(u'token', Js(u':')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'value'), var.get(u'node')) + PyJsHoisted_ObjectTypeProperty_.func_name = u'ObjectTypeProperty' + var.put(u'ObjectTypeProperty', PyJsHoisted_ObjectTypeProperty_) + @Js + def PyJsHoisted_IntersectionTypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + PyJs_Object_465_ = Js({u'separator':var.get(u'andSeparator')}) + var.get(u"this").callprop(u'printJoin', var.get(u'node').get(u'types'), var.get(u'node'), PyJs_Object_465_) + PyJsHoisted_IntersectionTypeAnnotation_.func_name = u'IntersectionTypeAnnotation' + var.put(u'IntersectionTypeAnnotation', PyJsHoisted_IntersectionTypeAnnotation_) + @Js + def PyJsHoisted_ObjectTypeCallProperty_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u'node').get(u'static'): + var.get(u"this").callprop(u'word', Js(u'static')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'value'), var.get(u'node')) + PyJsHoisted_ObjectTypeCallProperty_.func_name = u'ObjectTypeCallProperty' + var.put(u'ObjectTypeCallProperty', PyJsHoisted_ObjectTypeCallProperty_) + @Js + def PyJsHoisted_TupleTypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'[')) + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'types'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u']')) + PyJsHoisted_TupleTypeAnnotation_.func_name = u'TupleTypeAnnotation' + var.put(u'TupleTypeAnnotation', PyJsHoisted_TupleTypeAnnotation_) + @Js + def PyJsHoisted_TypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u':')) + var.get(u"this").callprop(u'space') + if var.get(u'node').get(u'optional'): + var.get(u"this").callprop(u'token', Js(u'?')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeAnnotation'), var.get(u'node')) + PyJsHoisted_TypeAnnotation_.func_name = u'TypeAnnotation' + var.put(u'TypeAnnotation', PyJsHoisted_TypeAnnotation_) + @Js + def PyJsHoisted__variance_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if PyJsStrictEq(var.get(u'node').get(u'variance'),Js(u'plus')): + var.get(u"this").callprop(u'token', Js(u'+')) + else: + if PyJsStrictEq(var.get(u'node').get(u'variance'),Js(u'minus')): + var.get(u"this").callprop(u'token', Js(u'-')) + PyJsHoisted__variance_.func_name = u'_variance' + var.put(u'_variance', PyJsHoisted__variance_) + @Js + def PyJsHoisted_FunctionTypeAnnotation_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeParameters'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'params'), var.get(u'node')) + if var.get(u'node').get(u'rest'): + if var.get(u'node').get(u'params').get(u'length'): + var.get(u"this").callprop(u'token', Js(u',')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'...')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'rest'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + if (PyJsStrictEq(var.get(u'parent').get(u'type'),Js(u'ObjectTypeCallProperty')) or PyJsStrictEq(var.get(u'parent').get(u'type'),Js(u'DeclareFunction'))): + var.get(u"this").callprop(u'token', Js(u':')) + else: + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'=>')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'returnType'), var.get(u'node')) + PyJsHoisted_FunctionTypeAnnotation_.func_name = u'FunctionTypeAnnotation' + var.put(u'FunctionTypeAnnotation', PyJsHoisted_FunctionTypeAnnotation_) + @Js + def PyJsHoisted_DeclareModule_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'declare')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'module')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'body'), var.get(u'node')) + PyJsHoisted_DeclareModule_.func_name = u'DeclareModule' + var.put(u'DeclareModule', PyJsHoisted_DeclareModule_) + @Js + def PyJsHoisted_NullableTypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'?')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeAnnotation'), var.get(u'node')) + PyJsHoisted_NullableTypeAnnotation_.func_name = u'NullableTypeAnnotation' + var.put(u'NullableTypeAnnotation', PyJsHoisted_NullableTypeAnnotation_) + @Js + def PyJsHoisted_andSeparator_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'&')) + var.get(u"this").callprop(u'space') + PyJsHoisted_andSeparator_.func_name = u'andSeparator' + var.put(u'andSeparator', PyJsHoisted_andSeparator_) + @Js + def PyJsHoisted_BooleanTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'boolean')) + PyJsHoisted_BooleanTypeAnnotation_.func_name = u'BooleanTypeAnnotation' + var.put(u'BooleanTypeAnnotation', PyJsHoisted_BooleanTypeAnnotation_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'AnyTypeAnnotation', var.get(u'AnyTypeAnnotation')) + var.get(u'exports').put(u'ArrayTypeAnnotation', var.get(u'ArrayTypeAnnotation')) + var.get(u'exports').put(u'BooleanTypeAnnotation', var.get(u'BooleanTypeAnnotation')) + var.get(u'exports').put(u'BooleanLiteralTypeAnnotation', var.get(u'BooleanLiteralTypeAnnotation')) + var.get(u'exports').put(u'NullLiteralTypeAnnotation', var.get(u'NullLiteralTypeAnnotation')) + var.get(u'exports').put(u'DeclareClass', var.get(u'DeclareClass')) + var.get(u'exports').put(u'DeclareFunction', var.get(u'DeclareFunction')) + var.get(u'exports').put(u'DeclareInterface', var.get(u'DeclareInterface')) + var.get(u'exports').put(u'DeclareModule', var.get(u'DeclareModule')) + var.get(u'exports').put(u'DeclareModuleExports', var.get(u'DeclareModuleExports')) + var.get(u'exports').put(u'DeclareTypeAlias', var.get(u'DeclareTypeAlias')) + var.get(u'exports').put(u'DeclareVariable', var.get(u'DeclareVariable')) + var.get(u'exports').put(u'ExistentialTypeParam', var.get(u'ExistentialTypeParam')) + var.get(u'exports').put(u'FunctionTypeAnnotation', var.get(u'FunctionTypeAnnotation')) + var.get(u'exports').put(u'FunctionTypeParam', var.get(u'FunctionTypeParam')) + var.get(u'exports').put(u'InterfaceExtends', var.get(u'InterfaceExtends')) + var.get(u'exports').put(u'_interfaceish', var.get(u'_interfaceish')) + var.get(u'exports').put(u'_variance', var.get(u'_variance')) + var.get(u'exports').put(u'InterfaceDeclaration', var.get(u'InterfaceDeclaration')) + var.get(u'exports').put(u'IntersectionTypeAnnotation', var.get(u'IntersectionTypeAnnotation')) + var.get(u'exports').put(u'MixedTypeAnnotation', var.get(u'MixedTypeAnnotation')) + var.get(u'exports').put(u'EmptyTypeAnnotation', var.get(u'EmptyTypeAnnotation')) + var.get(u'exports').put(u'NullableTypeAnnotation', var.get(u'NullableTypeAnnotation')) + var.put(u'_types', var.get(u'require')(Js(u'./types'))) + @Js + def PyJs_get_462_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_462_}, var) + var.registers([]) + return var.get(u'_types').get(u'NumericLiteral') + PyJs_get_462_._set_name(u'get') + PyJs_Object_461_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_462_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'NumericLiteralTypeAnnotation'), PyJs_Object_461_) + @Js + def PyJs_get_464_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_464_}, var) + var.registers([]) + return var.get(u'_types').get(u'StringLiteral') + PyJs_get_464_._set_name(u'get') + PyJs_Object_463_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_464_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'StringLiteralTypeAnnotation'), PyJs_Object_463_) + var.get(u'exports').put(u'NumberTypeAnnotation', var.get(u'NumberTypeAnnotation')) + var.get(u'exports').put(u'StringTypeAnnotation', var.get(u'StringTypeAnnotation')) + var.get(u'exports').put(u'ThisTypeAnnotation', var.get(u'ThisTypeAnnotation')) + var.get(u'exports').put(u'TupleTypeAnnotation', var.get(u'TupleTypeAnnotation')) + var.get(u'exports').put(u'TypeofTypeAnnotation', var.get(u'TypeofTypeAnnotation')) + var.get(u'exports').put(u'TypeAlias', var.get(u'TypeAlias')) + var.get(u'exports').put(u'TypeAnnotation', var.get(u'TypeAnnotation')) + var.get(u'exports').put(u'TypeParameter', var.get(u'TypeParameter')) + var.get(u'exports').put(u'TypeParameterInstantiation', var.get(u'TypeParameterInstantiation')) + var.get(u'exports').put(u'ObjectTypeAnnotation', var.get(u'ObjectTypeAnnotation')) + var.get(u'exports').put(u'ObjectTypeCallProperty', var.get(u'ObjectTypeCallProperty')) + var.get(u'exports').put(u'ObjectTypeIndexer', var.get(u'ObjectTypeIndexer')) + var.get(u'exports').put(u'ObjectTypeProperty', var.get(u'ObjectTypeProperty')) + var.get(u'exports').put(u'QualifiedTypeIdentifier', var.get(u'QualifiedTypeIdentifier')) + var.get(u'exports').put(u'UnionTypeAnnotation', var.get(u'UnionTypeAnnotation')) + var.get(u'exports').put(u'TypeCastExpression', var.get(u'TypeCastExpression')) + var.get(u'exports').put(u'VoidTypeAnnotation', var.get(u'VoidTypeAnnotation')) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + var.get(u'exports').put(u'ClassImplements', var.get(u'InterfaceExtends')) + var.get(u'exports').put(u'GenericTypeAnnotation', var.get(u'InterfaceExtends')) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + var.get(u'exports').put(u'TypeParameterDeclaration', var.get(u'TypeParameterInstantiation')) + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_460_._set_name(u'anonymous') +PyJs_Object_470_ = Js({u'./types':Js(39.0)}) +@Js +def PyJs_anonymous_471_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'JSXSpreadAttribute', u'exports', u'JSXOpeningElement', u'JSXMemberExpression', u'JSXClosingElement', u'module', u'JSXElement', u'JSXAttribute', u'JSXNamespacedName', u'JSXText', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'JSXExpressionContainer', u'spaceSeparator', u'JSXEmptyExpression', u'JSXIdentifier']) + @Js + def PyJsHoisted_JSXSpreadAttribute_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'{')) + var.get(u"this").callprop(u'token', Js(u'...')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'argument'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'}')) + PyJsHoisted_JSXSpreadAttribute_.func_name = u'JSXSpreadAttribute' + var.put(u'JSXSpreadAttribute', PyJsHoisted_JSXSpreadAttribute_) + @Js + def PyJsHoisted_JSXOpeningElement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'<')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'name'), var.get(u'node')) + if (var.get(u'node').get(u'attributes').get(u'length')>Js(0.0)): + var.get(u"this").callprop(u'space') + PyJs_Object_473_ = Js({u'separator':var.get(u'spaceSeparator')}) + var.get(u"this").callprop(u'printJoin', var.get(u'node').get(u'attributes'), var.get(u'node'), PyJs_Object_473_) + if var.get(u'node').get(u'selfClosing'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'/>')) + else: + var.get(u"this").callprop(u'token', Js(u'>')) + PyJsHoisted_JSXOpeningElement_.func_name = u'JSXOpeningElement' + var.put(u'JSXOpeningElement', PyJsHoisted_JSXOpeningElement_) + @Js + def PyJsHoisted_JSXMemberExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'object'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'.')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'property'), var.get(u'node')) + PyJsHoisted_JSXMemberExpression_.func_name = u'JSXMemberExpression' + var.put(u'JSXMemberExpression', PyJsHoisted_JSXMemberExpression_) + @Js + def PyJsHoisted_JSXClosingElement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'</')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'name'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'>')) + PyJsHoisted_JSXClosingElement_.func_name = u'JSXClosingElement' + var.put(u'JSXClosingElement', PyJsHoisted_JSXClosingElement_) + @Js + def PyJsHoisted_JSXElement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'_i', u'child', u'_ref', u'open']) + var.put(u'open', var.get(u'node').get(u'openingElement')) + var.get(u"this").callprop(u'print', var.get(u'open'), var.get(u'node')) + if var.get(u'open').get(u'selfClosing'): + return var.get('undefined') + var.get(u"this").callprop(u'indent') + #for JS loop + var.put(u'_iterator', var.get(u'node').get(u'children')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'child', var.get(u'_ref')) + var.get(u"this").callprop(u'print', var.get(u'child'), var.get(u'node')) + + var.get(u"this").callprop(u'dedent') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'closingElement'), var.get(u'node')) + PyJsHoisted_JSXElement_.func_name = u'JSXElement' + var.put(u'JSXElement', PyJsHoisted_JSXElement_) + @Js + def PyJsHoisted_JSXAttribute_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'name'), var.get(u'node')) + if var.get(u'node').get(u'value'): + var.get(u"this").callprop(u'token', Js(u'=')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'value'), var.get(u'node')) + PyJsHoisted_JSXAttribute_.func_name = u'JSXAttribute' + var.put(u'JSXAttribute', PyJsHoisted_JSXAttribute_) + @Js + def PyJsHoisted_JSXNamespacedName_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'namespace'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u':')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'name'), var.get(u'node')) + PyJsHoisted_JSXNamespacedName_.func_name = u'JSXNamespacedName' + var.put(u'JSXNamespacedName', PyJsHoisted_JSXNamespacedName_) + @Js + def PyJsHoisted_JSXText_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', var.get(u'node').get(u'value')) + PyJsHoisted_JSXText_.func_name = u'JSXText' + var.put(u'JSXText', PyJsHoisted_JSXText_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_472_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_472_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_JSXExpressionContainer_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'{')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'expression'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'}')) + PyJsHoisted_JSXExpressionContainer_.func_name = u'JSXExpressionContainer' + var.put(u'JSXExpressionContainer', PyJsHoisted_JSXExpressionContainer_) + @Js + def PyJsHoisted_spaceSeparator_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'space') + PyJsHoisted_spaceSeparator_.func_name = u'spaceSeparator' + var.put(u'spaceSeparator', PyJsHoisted_spaceSeparator_) + @Js + def PyJsHoisted_JSXEmptyExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJsHoisted_JSXEmptyExpression_.func_name = u'JSXEmptyExpression' + var.put(u'JSXEmptyExpression', PyJsHoisted_JSXEmptyExpression_) + @Js + def PyJsHoisted_JSXIdentifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', var.get(u'node').get(u'name')) + PyJsHoisted_JSXIdentifier_.func_name = u'JSXIdentifier' + var.put(u'JSXIdentifier', PyJsHoisted_JSXIdentifier_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'JSXAttribute', var.get(u'JSXAttribute')) + var.get(u'exports').put(u'JSXIdentifier', var.get(u'JSXIdentifier')) + var.get(u'exports').put(u'JSXNamespacedName', var.get(u'JSXNamespacedName')) + var.get(u'exports').put(u'JSXMemberExpression', var.get(u'JSXMemberExpression')) + var.get(u'exports').put(u'JSXSpreadAttribute', var.get(u'JSXSpreadAttribute')) + var.get(u'exports').put(u'JSXExpressionContainer', var.get(u'JSXExpressionContainer')) + var.get(u'exports').put(u'JSXText', var.get(u'JSXText')) + var.get(u'exports').put(u'JSXElement', var.get(u'JSXElement')) + var.get(u'exports').put(u'JSXOpeningElement', var.get(u'JSXOpeningElement')) + var.get(u'exports').put(u'JSXClosingElement', var.get(u'JSXClosingElement')) + var.get(u'exports').put(u'JSXEmptyExpression', var.get(u'JSXEmptyExpression')) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_471_._set_name(u'anonymous') +PyJs_Object_474_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_475_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'ArrowFunctionExpression', u'_interopRequireWildcard', u'require', u'_babelTypes', u'FunctionExpression', u'module', u't', u'hasTypes', u'_params', u'_method']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_476_ = Js({}) + var.put(u'newObj', PyJs_Object_476_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_ArrowFunctionExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'firstParam']) + if var.get(u'node').get(u'async'): + var.get(u"this").callprop(u'word', Js(u'async')) + var.get(u"this").callprop(u'space') + var.put(u'firstParam', var.get(u'node').get(u'params').get(u'0')) + if ((PyJsStrictEq(var.get(u'node').get(u'params').get(u'length'),Js(1.0)) and var.get(u't').callprop(u'isIdentifier', var.get(u'firstParam'))) and var.get(u'hasTypes')(var.get(u'node'), var.get(u'firstParam')).neg()): + var.get(u"this").callprop(u'print', var.get(u'firstParam'), var.get(u'node')) + else: + var.get(u"this").callprop(u'_params', var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'=>')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'body'), var.get(u'node')) + PyJsHoisted_ArrowFunctionExpression_.func_name = u'ArrowFunctionExpression' + var.put(u'ArrowFunctionExpression', PyJsHoisted_ArrowFunctionExpression_) + @Js + def PyJsHoisted_FunctionExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u'node').get(u'async'): + var.get(u"this").callprop(u'word', Js(u'async')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'function')) + if var.get(u'node').get(u'generator'): + var.get(u"this").callprop(u'token', Js(u'*')) + if var.get(u'node').get(u'id'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id'), var.get(u'node')) + else: + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'_params', var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'body'), var.get(u'node')) + PyJsHoisted_FunctionExpression_.func_name = u'FunctionExpression' + var.put(u'FunctionExpression', PyJsHoisted_FunctionExpression_) + @Js + def PyJsHoisted_hasTypes_(node, param, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'param':param}, var) + var.registers([u'node', u'param']) + return ((((var.get(u'node').get(u'typeParameters') or var.get(u'node').get(u'returnType')) or var.get(u'param').get(u'typeAnnotation')) or var.get(u'param').get(u'optional')) or var.get(u'param').get(u'trailingComments')) + PyJsHoisted_hasTypes_.func_name = u'hasTypes' + var.put(u'hasTypes', PyJsHoisted_hasTypes_) + @Js + def PyJsHoisted__params_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_this']) + var.put(u'_this', var.get(u"this")) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeParameters'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'(')) + @Js + def PyJs_iterator_478_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'iterator':PyJs_iterator_478_}, var) + var.registers([u'node']) + if var.get(u'node').get(u'optional'): + var.get(u'_this').callprop(u'token', Js(u'?')) + var.get(u'_this').callprop(u'print', var.get(u'node').get(u'typeAnnotation'), var.get(u'node')) + PyJs_iterator_478_._set_name(u'iterator') + PyJs_Object_477_ = Js({u'iterator':PyJs_iterator_478_}) + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'params'), var.get(u'node'), PyJs_Object_477_) + var.get(u"this").callprop(u'token', Js(u')')) + if var.get(u'node').get(u'returnType'): + var.get(u"this").callprop(u'print', var.get(u'node').get(u'returnType'), var.get(u'node')) + PyJsHoisted__params_.func_name = u'_params' + var.put(u'_params', PyJsHoisted__params_) + @Js + def PyJsHoisted__method_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'kind', u'key']) + var.put(u'kind', var.get(u'node').get(u'kind')) + var.put(u'key', var.get(u'node').get(u'key')) + if (PyJsStrictEq(var.get(u'kind'),Js(u'method')) or PyJsStrictEq(var.get(u'kind'),Js(u'init'))): + if var.get(u'node').get(u'generator'): + var.get(u"this").callprop(u'token', Js(u'*')) + if (PyJsStrictEq(var.get(u'kind'),Js(u'get')) or PyJsStrictEq(var.get(u'kind'),Js(u'set'))): + var.get(u"this").callprop(u'word', var.get(u'kind')) + var.get(u"this").callprop(u'space') + if var.get(u'node').get(u'async'): + var.get(u"this").callprop(u'word', Js(u'async')) + var.get(u"this").callprop(u'space') + if var.get(u'node').get(u'computed'): + var.get(u"this").callprop(u'token', Js(u'[')) + var.get(u"this").callprop(u'print', var.get(u'key'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u']')) + else: + var.get(u"this").callprop(u'print', var.get(u'key'), var.get(u'node')) + var.get(u"this").callprop(u'_params', var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'body'), var.get(u'node')) + PyJsHoisted__method_.func_name = u'_method' + var.put(u'_method', PyJsHoisted__method_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'FunctionDeclaration', var.get(u'undefined')) + var.get(u'exports').put(u'_params', var.get(u'_params')) + var.get(u'exports').put(u'_method', var.get(u'_method')) + var.get(u'exports').put(u'FunctionExpression', var.get(u'FunctionExpression')) + var.get(u'exports').put(u'ArrowFunctionExpression', var.get(u'ArrowFunctionExpression')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + var.get(u'exports').put(u'FunctionDeclaration', var.get(u'FunctionExpression')) + pass + pass +PyJs_anonymous_475_._set_name(u'anonymous') +PyJs_Object_479_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_480_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'ExportDeclaration', u'ExportNamespaceSpecifier', u'_interopRequireWildcard', u'ExportDefaultDeclaration', u'ImportDeclaration', u'ExportSpecifier', u'ImportSpecifier', u'_babelTypes', u'require', u'module', u'ImportDefaultSpecifier', u'ExportNamedDeclaration', u't', u'ImportNamespaceSpecifier', u'ExportDefaultSpecifier', u'ExportAllDeclaration']) + @Js + def PyJsHoisted_ExportNamespaceSpecifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'*')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'as')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'exported'), var.get(u'node')) + PyJsHoisted_ExportNamespaceSpecifier_.func_name = u'ExportNamespaceSpecifier' + var.put(u'ExportNamespaceSpecifier', PyJsHoisted_ExportNamespaceSpecifier_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_481_ = Js({}) + var.put(u'newObj', PyJs_Object_481_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_ExportDefaultDeclaration_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'export')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'default')) + var.get(u"this").callprop(u'space') + var.get(u'ExportDeclaration').callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + PyJsHoisted_ExportDefaultDeclaration_.func_name = u'ExportDefaultDeclaration' + var.put(u'ExportDefaultDeclaration', PyJsHoisted_ExportDefaultDeclaration_) + @Js + def PyJsHoisted_ImportDeclaration_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'specifiers', u'first']) + var.get(u"this").callprop(u'word', Js(u'import')) + var.get(u"this").callprop(u'space') + if (PyJsStrictEq(var.get(u'node').get(u'importKind'),Js(u'type')) or PyJsStrictEq(var.get(u'node').get(u'importKind'),Js(u'typeof'))): + var.get(u"this").callprop(u'word', var.get(u'node').get(u'importKind')) + var.get(u"this").callprop(u'space') + var.put(u'specifiers', var.get(u'node').get(u'specifiers').callprop(u'slice', Js(0.0))) + if (var.get(u'specifiers') and var.get(u'specifiers').get(u'length')): + while var.get(u'true'): + var.put(u'first', var.get(u'specifiers').get(u'0')) + if (var.get(u't').callprop(u'isImportDefaultSpecifier', var.get(u'first')) or var.get(u't').callprop(u'isImportNamespaceSpecifier', var.get(u'first'))): + var.get(u"this").callprop(u'print', var.get(u'specifiers').callprop(u'shift'), var.get(u'node')) + if var.get(u'specifiers').get(u'length'): + var.get(u"this").callprop(u'token', Js(u',')) + var.get(u"this").callprop(u'space') + else: + break + if var.get(u'specifiers').get(u'length'): + var.get(u"this").callprop(u'token', Js(u'{')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'printList', var.get(u'specifiers'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'}')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'from')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'source'), var.get(u'node')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_ImportDeclaration_.func_name = u'ImportDeclaration' + var.put(u'ImportDeclaration', PyJsHoisted_ImportDeclaration_) + @Js + def PyJsHoisted_ExportSpecifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'local'), var.get(u'node')) + if (var.get(u'node').get(u'exported') and PyJsStrictNeq(var.get(u'node').get(u'local').get(u'name'),var.get(u'node').get(u'exported').get(u'name'))): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'as')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'exported'), var.get(u'node')) + PyJsHoisted_ExportSpecifier_.func_name = u'ExportSpecifier' + var.put(u'ExportSpecifier', PyJsHoisted_ExportSpecifier_) + @Js + def PyJsHoisted_ImportSpecifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'imported'), var.get(u'node')) + if (var.get(u'node').get(u'local') and PyJsStrictNeq(var.get(u'node').get(u'local').get(u'name'),var.get(u'node').get(u'imported').get(u'name'))): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'as')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'local'), var.get(u'node')) + PyJsHoisted_ImportSpecifier_.func_name = u'ImportSpecifier' + var.put(u'ImportSpecifier', PyJsHoisted_ImportSpecifier_) + @Js + def PyJsHoisted_ExportDeclaration_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'specifiers', u'declar', u'first', u'hasSpecial']) + if var.get(u'node').get(u'declaration'): + var.put(u'declar', var.get(u'node').get(u'declaration')) + var.get(u"this").callprop(u'print', var.get(u'declar'), var.get(u'node')) + if var.get(u't').callprop(u'isStatement', var.get(u'declar')).neg(): + var.get(u"this").callprop(u'semicolon') + else: + if PyJsStrictEq(var.get(u'node').get(u'exportKind'),Js(u'type')): + var.get(u"this").callprop(u'word', Js(u'type')) + var.get(u"this").callprop(u'space') + var.put(u'specifiers', var.get(u'node').get(u'specifiers').callprop(u'slice', Js(0.0))) + var.put(u'hasSpecial', Js(False)) + while var.get(u'true'): + var.put(u'first', var.get(u'specifiers').get(u'0')) + if (var.get(u't').callprop(u'isExportDefaultSpecifier', var.get(u'first')) or var.get(u't').callprop(u'isExportNamespaceSpecifier', var.get(u'first'))): + var.put(u'hasSpecial', var.get(u'true')) + var.get(u"this").callprop(u'print', var.get(u'specifiers').callprop(u'shift'), var.get(u'node')) + if var.get(u'specifiers').get(u'length'): + var.get(u"this").callprop(u'token', Js(u',')) + var.get(u"this").callprop(u'space') + else: + break + if (var.get(u'specifiers').get(u'length') or (var.get(u'specifiers').get(u'length').neg() and var.get(u'hasSpecial').neg())): + var.get(u"this").callprop(u'token', Js(u'{')) + if var.get(u'specifiers').get(u'length'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'printList', var.get(u'specifiers'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'}')) + if var.get(u'node').get(u'source'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'from')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'source'), var.get(u'node')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_ExportDeclaration_.func_name = u'ExportDeclaration' + var.put(u'ExportDeclaration', PyJsHoisted_ExportDeclaration_) + @Js + def PyJsHoisted_ImportDefaultSpecifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'local'), var.get(u'node')) + PyJsHoisted_ImportDefaultSpecifier_.func_name = u'ImportDefaultSpecifier' + var.put(u'ImportDefaultSpecifier', PyJsHoisted_ImportDefaultSpecifier_) + @Js + def PyJsHoisted_ExportNamedDeclaration_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'export')) + var.get(u"this").callprop(u'space') + var.get(u'ExportDeclaration').callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + PyJsHoisted_ExportNamedDeclaration_.func_name = u'ExportNamedDeclaration' + var.put(u'ExportNamedDeclaration', PyJsHoisted_ExportNamedDeclaration_) + @Js + def PyJsHoisted_ExportAllDeclaration_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'export')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'*')) + if var.get(u'node').get(u'exported'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'as')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'exported'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'from')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'source'), var.get(u'node')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_ExportAllDeclaration_.func_name = u'ExportAllDeclaration' + var.put(u'ExportAllDeclaration', PyJsHoisted_ExportAllDeclaration_) + @Js + def PyJsHoisted_ImportNamespaceSpecifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'*')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'as')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'local'), var.get(u'node')) + PyJsHoisted_ImportNamespaceSpecifier_.func_name = u'ImportNamespaceSpecifier' + var.put(u'ImportNamespaceSpecifier', PyJsHoisted_ImportNamespaceSpecifier_) + @Js + def PyJsHoisted_ExportDefaultSpecifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'exported'), var.get(u'node')) + PyJsHoisted_ExportDefaultSpecifier_.func_name = u'ExportDefaultSpecifier' + var.put(u'ExportDefaultSpecifier', PyJsHoisted_ExportDefaultSpecifier_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'ImportSpecifier', var.get(u'ImportSpecifier')) + var.get(u'exports').put(u'ImportDefaultSpecifier', var.get(u'ImportDefaultSpecifier')) + var.get(u'exports').put(u'ExportDefaultSpecifier', var.get(u'ExportDefaultSpecifier')) + var.get(u'exports').put(u'ExportSpecifier', var.get(u'ExportSpecifier')) + var.get(u'exports').put(u'ExportNamespaceSpecifier', var.get(u'ExportNamespaceSpecifier')) + var.get(u'exports').put(u'ExportAllDeclaration', var.get(u'ExportAllDeclaration')) + var.get(u'exports').put(u'ExportNamedDeclaration', var.get(u'ExportNamedDeclaration')) + var.get(u'exports').put(u'ExportDefaultDeclaration', var.get(u'ExportDefaultDeclaration')) + var.get(u'exports').put(u'ImportDeclaration', var.get(u'ImportDeclaration')) + var.get(u'exports').put(u'ImportNamespaceSpecifier', var.get(u'ImportNamespaceSpecifier')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_480_._set_name(u'anonymous') +PyJs_Object_482_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_483_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'ForOfStatement', u'LabeledStatement', u'ForAwaitStatement', u'module', u'DebuggerStatement', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'VariableDeclaration', u'ForStatement', u'getLastStatement', u'ContinueStatement', u'DoWhileStatement', u'SwitchStatement', u'CatchClause', u'buildLabelStatement', u'BreakStatement', u'buildForXStatement', u'exports', u'_interopRequireWildcard', u'_babelTypes', u'TryStatement', u'ForInStatement', u'SwitchCase', u'constDeclarationIdent', u'ThrowStatement', u'WithStatement', u'WhileStatement', u'variableDeclarationIdent', u't', u'ReturnStatement', u'VariableDeclarator', u'require', u'IfStatement']) + @Js + def PyJsHoisted_ForStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'for')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'(')) + (var.get(u"this").put(u'inForStatementInitCounter',Js(var.get(u"this").get(u'inForStatementInitCounter').to_number())+Js(1))-Js(1)) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'init'), var.get(u'node')) + (var.get(u"this").put(u'inForStatementInitCounter',Js(var.get(u"this").get(u'inForStatementInitCounter').to_number())-Js(1))+Js(1)) + var.get(u"this").callprop(u'token', Js(u';')) + if var.get(u'node').get(u'test'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'test'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u';')) + if var.get(u'node').get(u'update'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'update'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + var.get(u"this").callprop(u'printBlock', var.get(u'node')) + PyJsHoisted_ForStatement_.func_name = u'ForStatement' + var.put(u'ForStatement', PyJsHoisted_ForStatement_) + @Js + def PyJsHoisted_constDeclarationIdent_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i']) + var.get(u"this").callprop(u'token', Js(u',')) + var.get(u"this").callprop(u'newline') + if var.get(u"this").callprop(u'endsWith', Js(u'\n')): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<Js(6.0)): + try: + var.get(u"this").callprop(u'space', var.get(u'true')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJsHoisted_constDeclarationIdent_.func_name = u'constDeclarationIdent' + var.put(u'constDeclarationIdent', PyJsHoisted_constDeclarationIdent_) + @Js + def PyJsHoisted_getLastStatement_(statement, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'statement':statement}, var) + var.registers([u'statement']) + if var.get(u't').callprop(u'isStatement', var.get(u'statement').get(u'body')).neg(): + return var.get(u'statement') + return var.get(u'getLastStatement')(var.get(u'statement').get(u'body')) + PyJsHoisted_getLastStatement_.func_name = u'getLastStatement' + var.put(u'getLastStatement', PyJsHoisted_getLastStatement_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_484_ = Js({}) + var.put(u'newObj', PyJs_Object_484_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_DoWhileStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'do')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'body'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'while')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'test'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_DoWhileStatement_.func_name = u'DoWhileStatement' + var.put(u'DoWhileStatement', PyJsHoisted_DoWhileStatement_) + @Js + def PyJsHoisted_WithStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'with')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'object'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + var.get(u"this").callprop(u'printBlock', var.get(u'node')) + PyJsHoisted_WithStatement_.func_name = u'WithStatement' + var.put(u'WithStatement', PyJsHoisted_WithStatement_) + @Js + def PyJsHoisted_WhileStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'while')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'test'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + var.get(u"this").callprop(u'printBlock', var.get(u'node')) + PyJsHoisted_WhileStatement_.func_name = u'WhileStatement' + var.put(u'WhileStatement', PyJsHoisted_WhileStatement_) + @Js + def PyJsHoisted_CatchClause_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'catch')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'param'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'body'), var.get(u'node')) + PyJsHoisted_CatchClause_.func_name = u'CatchClause' + var.put(u'CatchClause', PyJsHoisted_CatchClause_) + @Js + def PyJsHoisted_buildLabelStatement_(prefix, this, arguments, var=var): + var = Scope({u'this':this, u'prefix':prefix, u'arguments':arguments}, var) + var.registers([u'prefix', u'key']) + var.put(u'key', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js(u'label'))) + @Js + def PyJs_anonymous_488_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'terminatorState', u'label']) + var.get(u"this").callprop(u'word', var.get(u'prefix')) + var.put(u'label', var.get(u'node').get(var.get(u'key'))) + if var.get(u'label'): + var.get(u"this").callprop(u'space') + var.put(u'terminatorState', var.get(u"this").callprop(u'startTerminatorless')) + var.get(u"this").callprop(u'print', var.get(u'label'), var.get(u'node')) + var.get(u"this").callprop(u'endTerminatorless', var.get(u'terminatorState')) + var.get(u"this").callprop(u'semicolon') + PyJs_anonymous_488_._set_name(u'anonymous') + return PyJs_anonymous_488_ + PyJsHoisted_buildLabelStatement_.func_name = u'buildLabelStatement' + var.put(u'buildLabelStatement', PyJsHoisted_buildLabelStatement_) + @Js + def PyJsHoisted_TryStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'try')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'block'), var.get(u'node')) + var.get(u"this").callprop(u'space') + if var.get(u'node').get(u'handlers'): + var.get(u"this").callprop(u'print', var.get(u'node').get(u'handlers').get(u'0'), var.get(u'node')) + else: + var.get(u"this").callprop(u'print', var.get(u'node').get(u'handler'), var.get(u'node')) + if var.get(u'node').get(u'finalizer'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'finally')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'finalizer'), var.get(u'node')) + PyJsHoisted_TryStatement_.func_name = u'TryStatement' + var.put(u'TryStatement', PyJsHoisted_TryStatement_) + @Js + def PyJsHoisted_DebuggerStatement_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'debugger')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_DebuggerStatement_.func_name = u'DebuggerStatement' + var.put(u'DebuggerStatement', PyJsHoisted_DebuggerStatement_) + @Js + def PyJsHoisted_SwitchStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'switch')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'discriminant'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'{')) + @Js + def PyJs_addNewlines_490_(leading, cas, this, arguments, var=var): + var = Scope({u'cas':cas, u'leading':leading, u'this':this, u'arguments':arguments, u'addNewlines':PyJs_addNewlines_490_}, var) + var.registers([u'cas', u'leading']) + if (var.get(u'leading').neg() and PyJsStrictEq(var.get(u'node').get(u'cases').get((var.get(u'node').get(u'cases').get(u'length')-Js(1.0))),var.get(u'cas'))): + return (-Js(1.0)) + PyJs_addNewlines_490_._set_name(u'addNewlines') + PyJs_Object_489_ = Js({u'indent':var.get(u'true'),u'addNewlines':PyJs_addNewlines_490_}) + var.get(u"this").callprop(u'printSequence', var.get(u'node').get(u'cases'), var.get(u'node'), PyJs_Object_489_) + var.get(u"this").callprop(u'token', Js(u'}')) + PyJsHoisted_SwitchStatement_.func_name = u'SwitchStatement' + var.put(u'SwitchStatement', PyJsHoisted_SwitchStatement_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_485_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_485_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_variableDeclarationIdent_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i']) + var.get(u"this").callprop(u'token', Js(u',')) + var.get(u"this").callprop(u'newline') + if var.get(u"this").callprop(u'endsWith', Js(u'\n')): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<Js(4.0)): + try: + var.get(u"this").callprop(u'space', var.get(u'true')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJsHoisted_variableDeclarationIdent_.func_name = u'variableDeclarationIdent' + var.put(u'variableDeclarationIdent', PyJsHoisted_variableDeclarationIdent_) + @Js + def PyJsHoisted_LabeledStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'label'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u':')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'body'), var.get(u'node')) + PyJsHoisted_LabeledStatement_.func_name = u'LabeledStatement' + var.put(u'LabeledStatement', PyJsHoisted_LabeledStatement_) + @Js + def PyJsHoisted_VariableDeclaration_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'hasInits', u'_isArray', u'_iterator', u'parent', u'declar', u'separator', u'_i', u'_ref']) + var.get(u"this").callprop(u'word', var.get(u'node').get(u'kind')) + var.get(u"this").callprop(u'space') + var.put(u'hasInits', Js(False)) + if var.get(u't').callprop(u'isFor', var.get(u'parent')).neg(): + #for JS loop + var.put(u'_iterator', var.get(u'node').get(u'declarations')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'declar', var.get(u'_ref')) + if var.get(u'declar').get(u'init'): + var.put(u'hasInits', var.get(u'true')) + + var.put(u'separator', PyJsComma(Js(0.0), Js(None))) + if var.get(u'hasInits'): + var.put(u'separator', (var.get(u'constDeclarationIdent') if PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'const')) else var.get(u'variableDeclarationIdent'))) + PyJs_Object_492_ = Js({u'separator':var.get(u'separator')}) + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'declarations'), var.get(u'node'), PyJs_Object_492_) + if var.get(u't').callprop(u'isFor', var.get(u'parent')): + if (PyJsStrictEq(var.get(u'parent').get(u'left'),var.get(u'node')) or PyJsStrictEq(var.get(u'parent').get(u'init'),var.get(u'node'))): + return var.get('undefined') + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_VariableDeclaration_.func_name = u'VariableDeclaration' + var.put(u'VariableDeclaration', PyJsHoisted_VariableDeclaration_) + @Js + def PyJsHoisted_SwitchCase_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u'node').get(u'test'): + var.get(u"this").callprop(u'word', Js(u'case')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'test'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u':')) + else: + var.get(u"this").callprop(u'word', Js(u'default')) + var.get(u"this").callprop(u'token', Js(u':')) + if var.get(u'node').get(u'consequent').get(u'length'): + var.get(u"this").callprop(u'newline') + PyJs_Object_491_ = Js({u'indent':var.get(u'true')}) + var.get(u"this").callprop(u'printSequence', var.get(u'node').get(u'consequent'), var.get(u'node'), PyJs_Object_491_) + PyJsHoisted_SwitchCase_.func_name = u'SwitchCase' + var.put(u'SwitchCase', PyJsHoisted_SwitchCase_) + @Js + def PyJsHoisted_VariableDeclarator_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id'), var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id').get(u'typeAnnotation'), var.get(u'node')) + if var.get(u'node').get(u'init'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'=')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'init'), var.get(u'node')) + PyJsHoisted_VariableDeclarator_.func_name = u'VariableDeclarator' + var.put(u'VariableDeclarator', PyJsHoisted_VariableDeclarator_) + @Js + def PyJsHoisted_IfStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'needsBlock']) + var.get(u"this").callprop(u'word', Js(u'if')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'test'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + var.get(u"this").callprop(u'space') + var.put(u'needsBlock', (var.get(u'node').get(u'alternate') and var.get(u't').callprop(u'isIfStatement', var.get(u'getLastStatement')(var.get(u'node').get(u'consequent'))))) + if var.get(u'needsBlock'): + var.get(u"this").callprop(u'token', Js(u'{')) + var.get(u"this").callprop(u'newline') + var.get(u"this").callprop(u'indent') + var.get(u"this").callprop(u'printAndIndentOnComments', var.get(u'node').get(u'consequent'), var.get(u'node')) + if var.get(u'needsBlock'): + var.get(u"this").callprop(u'dedent') + var.get(u"this").callprop(u'newline') + var.get(u"this").callprop(u'token', Js(u'}')) + if var.get(u'node').get(u'alternate'): + if var.get(u"this").callprop(u'endsWith', Js(u'}')): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'else')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'printAndIndentOnComments', var.get(u'node').get(u'alternate'), var.get(u'node')) + PyJsHoisted_IfStatement_.func_name = u'IfStatement' + var.put(u'IfStatement', PyJsHoisted_IfStatement_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'ThrowStatement', var.get(u'exports').put(u'BreakStatement', var.get(u'exports').put(u'ReturnStatement', var.get(u'exports').put(u'ContinueStatement', var.get(u'exports').put(u'ForAwaitStatement', var.get(u'exports').put(u'ForOfStatement', var.get(u'exports').put(u'ForInStatement', var.get(u'undefined')))))))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'WithStatement', var.get(u'WithStatement')) + var.get(u'exports').put(u'IfStatement', var.get(u'IfStatement')) + var.get(u'exports').put(u'ForStatement', var.get(u'ForStatement')) + var.get(u'exports').put(u'WhileStatement', var.get(u'WhileStatement')) + var.get(u'exports').put(u'DoWhileStatement', var.get(u'DoWhileStatement')) + var.get(u'exports').put(u'LabeledStatement', var.get(u'LabeledStatement')) + var.get(u'exports').put(u'TryStatement', var.get(u'TryStatement')) + var.get(u'exports').put(u'CatchClause', var.get(u'CatchClause')) + var.get(u'exports').put(u'SwitchStatement', var.get(u'SwitchStatement')) + var.get(u'exports').put(u'SwitchCase', var.get(u'SwitchCase')) + var.get(u'exports').put(u'DebuggerStatement', var.get(u'DebuggerStatement')) + var.get(u'exports').put(u'VariableDeclaration', var.get(u'VariableDeclaration')) + var.get(u'exports').put(u'VariableDeclarator', var.get(u'VariableDeclarator')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + pass + pass + @Js + def PyJs_buildForXStatement_486_(op, this, arguments, var=var): + var = Scope({u'this':this, u'buildForXStatement':PyJs_buildForXStatement_486_, u'arguments':arguments, u'op':op}, var) + var.registers([u'op']) + @Js + def PyJs_anonymous_487_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'for')) + var.get(u"this").callprop(u'space') + if PyJsStrictEq(var.get(u'op'),Js(u'await')): + var.get(u"this").callprop(u'word', Js(u'await')) + var.get(u"this").callprop(u'space') + var.put(u'op', Js(u'of')) + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'left'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', var.get(u'op')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'right'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + var.get(u"this").callprop(u'printBlock', var.get(u'node')) + PyJs_anonymous_487_._set_name(u'anonymous') + return PyJs_anonymous_487_ + PyJs_buildForXStatement_486_._set_name(u'buildForXStatement') + var.put(u'buildForXStatement', PyJs_buildForXStatement_486_) + var.put(u'ForInStatement', var.get(u'exports').put(u'ForInStatement', var.get(u'buildForXStatement')(Js(u'in')))) + var.put(u'ForOfStatement', var.get(u'exports').put(u'ForOfStatement', var.get(u'buildForXStatement')(Js(u'of')))) + var.put(u'ForAwaitStatement', var.get(u'exports').put(u'ForAwaitStatement', var.get(u'buildForXStatement')(Js(u'await')))) + pass + pass + var.put(u'ContinueStatement', var.get(u'exports').put(u'ContinueStatement', var.get(u'buildLabelStatement')(Js(u'continue')))) + var.put(u'ReturnStatement', var.get(u'exports').put(u'ReturnStatement', var.get(u'buildLabelStatement')(Js(u'return'), Js(u'argument')))) + var.put(u'BreakStatement', var.get(u'exports').put(u'BreakStatement', var.get(u'buildLabelStatement')(Js(u'break')))) + var.put(u'ThrowStatement', var.get(u'exports').put(u'ThrowStatement', var.get(u'buildLabelStatement')(Js(u'throw'), Js(u'argument')))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_483_._set_name(u'anonymous') +PyJs_Object_493_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_494_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'TaggedTemplateExpression', u'TemplateElement', u'TemplateLiteral']) + @Js + def PyJsHoisted_TemplateElement_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'value', u'parent', u'isFirst', u'isLast']) + var.put(u'isFirst', PyJsStrictEq(var.get(u'parent').get(u'quasis').get(u'0'),var.get(u'node'))) + var.put(u'isLast', PyJsStrictEq(var.get(u'parent').get(u'quasis').get((var.get(u'parent').get(u'quasis').get(u'length')-Js(1.0))),var.get(u'node'))) + var.put(u'value', (((Js(u'`') if var.get(u'isFirst') else Js(u'}'))+var.get(u'node').get(u'value').get(u'raw'))+(Js(u'`') if var.get(u'isLast') else Js(u'${')))) + if var.get(u'isFirst').neg(): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', var.get(u'value')) + if var.get(u'isLast').neg(): + var.get(u"this").callprop(u'space') + PyJsHoisted_TemplateElement_.func_name = u'TemplateElement' + var.put(u'TemplateElement', PyJsHoisted_TemplateElement_) + @Js + def PyJsHoisted_TaggedTemplateExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'tag'), var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'quasi'), var.get(u'node')) + PyJsHoisted_TaggedTemplateExpression_.func_name = u'TaggedTemplateExpression' + var.put(u'TaggedTemplateExpression', PyJsHoisted_TaggedTemplateExpression_) + @Js + def PyJsHoisted_TemplateLiteral_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'quasis', u'i', u'node']) + var.put(u'quasis', var.get(u'node').get(u'quasis')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'quasis').get(u'length')): + try: + var.get(u"this").callprop(u'print', var.get(u'quasis').get(var.get(u'i')), var.get(u'node')) + if ((var.get(u'i')+Js(1.0))<var.get(u'quasis').get(u'length')): + var.get(u"this").callprop(u'print', var.get(u'node').get(u'expressions').get(var.get(u'i')), var.get(u'node')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJsHoisted_TemplateLiteral_.func_name = u'TemplateLiteral' + var.put(u'TemplateLiteral', PyJsHoisted_TemplateLiteral_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'TaggedTemplateExpression', var.get(u'TaggedTemplateExpression')) + var.get(u'exports').put(u'TemplateElement', var.get(u'TemplateElement')) + var.get(u'exports').put(u'TemplateLiteral', var.get(u'TemplateLiteral')) + pass + pass + pass +PyJs_anonymous_494_._set_name(u'anonymous') +PyJs_Object_495_ = Js({}) +@Js +def PyJs_anonymous_496_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'NumericLiteral', u'exports', u'ObjectMethod', u'module', u'_jsesc2', u'_interopRequireWildcard', u'RestElement', u'require', u'_babelTypes', u'ObjectProperty', u'StringLiteral', u'ArrayExpression', u'BooleanLiteral', u'RegExpLiteral', u'ObjectExpression', u't', u'_jsesc', u'_interopRequireDefault', u'Identifier', u'NullLiteral']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_498_ = Js({}) + var.put(u'newObj', PyJs_Object_498_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_ObjectMethod_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'printJoin', var.get(u'node').get(u'decorators'), var.get(u'node')) + var.get(u"this").callprop(u'_method', var.get(u'node')) + PyJsHoisted_ObjectMethod_.func_name = u'ObjectMethod' + var.put(u'ObjectMethod', PyJsHoisted_ObjectMethod_) + @Js + def PyJsHoisted_RestElement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'...')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'argument'), var.get(u'node')) + PyJsHoisted_RestElement_.func_name = u'RestElement' + var.put(u'RestElement', PyJsHoisted_RestElement_) + @Js + def PyJsHoisted_ObjectProperty_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'printJoin', var.get(u'node').get(u'decorators'), var.get(u'node')) + if var.get(u'node').get(u'computed'): + var.get(u"this").callprop(u'token', Js(u'[')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'key'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u']')) + else: + if ((var.get(u't').callprop(u'isAssignmentPattern', var.get(u'node').get(u'value')) and var.get(u't').callprop(u'isIdentifier', var.get(u'node').get(u'key'))) and PyJsStrictEq(var.get(u'node').get(u'key').get(u'name'),var.get(u'node').get(u'value').get(u'left').get(u'name'))): + var.get(u"this").callprop(u'print', var.get(u'node').get(u'value'), var.get(u'node')) + return var.get('undefined') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'key'), var.get(u'node')) + if (((var.get(u'node').get(u'shorthand') and var.get(u't').callprop(u'isIdentifier', var.get(u'node').get(u'key'))) and var.get(u't').callprop(u'isIdentifier', var.get(u'node').get(u'value'))) and PyJsStrictEq(var.get(u'node').get(u'key').get(u'name'),var.get(u'node').get(u'value').get(u'name'))): + return var.get('undefined') + var.get(u"this").callprop(u'token', Js(u':')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'value'), var.get(u'node')) + PyJsHoisted_ObjectProperty_.func_name = u'ObjectProperty' + var.put(u'ObjectProperty', PyJsHoisted_ObjectProperty_) + @Js + def PyJsHoisted_StringLiteral_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'raw', u'parent', u'val']) + var.put(u'raw', var.get(u"this").callprop(u'getPossibleRaw', var.get(u'node'))) + if (var.get(u'raw')!=var.get(u"null")): + var.get(u"this").callprop(u'token', var.get(u'raw')) + return var.get('undefined') + PyJs_Object_500_ = Js({u'quotes':(Js(u'double') if var.get(u't').callprop(u'isJSX', var.get(u'parent')) else var.get(u"this").get(u'format').get(u'quotes')),u'wrap':var.get(u'true')}) + var.put(u'val', PyJsComma(Js(0.0),var.get(u'_jsesc2').get(u'default'))(var.get(u'node').get(u'value'), PyJs_Object_500_)) + return var.get(u"this").callprop(u'token', var.get(u'val')) + PyJsHoisted_StringLiteral_.func_name = u'StringLiteral' + var.put(u'StringLiteral', PyJsHoisted_StringLiteral_) + @Js + def PyJsHoisted_ArrayExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'node', u'elems', u'len', u'elem']) + var.put(u'elems', var.get(u'node').get(u'elements')) + var.put(u'len', var.get(u'elems').get(u'length')) + var.get(u"this").callprop(u'token', Js(u'[')) + var.get(u"this").callprop(u'printInnerComments', var.get(u'node')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'elems').get(u'length')): + try: + var.put(u'elem', var.get(u'elems').get(var.get(u'i'))) + if var.get(u'elem'): + if (var.get(u'i')>Js(0.0)): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'elem'), var.get(u'node')) + if (var.get(u'i')<(var.get(u'len')-Js(1.0))): + var.get(u"this").callprop(u'token', Js(u',')) + else: + var.get(u"this").callprop(u'token', Js(u',')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.get(u"this").callprop(u'token', Js(u']')) + PyJsHoisted_ArrayExpression_.func_name = u'ArrayExpression' + var.put(u'ArrayExpression', PyJsHoisted_ArrayExpression_) + @Js + def PyJsHoisted_BooleanLiteral_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', (Js(u'true') if var.get(u'node').get(u'value') else Js(u'false'))) + PyJsHoisted_BooleanLiteral_.func_name = u'BooleanLiteral' + var.put(u'BooleanLiteral', PyJsHoisted_BooleanLiteral_) + @Js + def PyJsHoisted_NumericLiteral_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'raw']) + var.put(u'raw', var.get(u"this").callprop(u'getPossibleRaw', var.get(u'node'))) + var.get(u"this").callprop(u'number', ((var.get(u'node').get(u'value')+Js(u'')) if (var.get(u'raw')==var.get(u"null")) else var.get(u'raw'))) + PyJsHoisted_NumericLiteral_.func_name = u'NumericLiteral' + var.put(u'NumericLiteral', PyJsHoisted_NumericLiteral_) + @Js + def PyJsHoisted_ObjectExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'props']) + var.put(u'props', var.get(u'node').get(u'properties')) + var.get(u"this").callprop(u'token', Js(u'{')) + var.get(u"this").callprop(u'printInnerComments', var.get(u'node')) + if var.get(u'props').get(u'length'): + var.get(u"this").callprop(u'space') + PyJs_Object_499_ = Js({u'indent':var.get(u'true'),u'statement':var.get(u'true')}) + var.get(u"this").callprop(u'printList', var.get(u'props'), var.get(u'node'), PyJs_Object_499_) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'}')) + PyJsHoisted_ObjectExpression_.func_name = u'ObjectExpression' + var.put(u'ObjectExpression', PyJsHoisted_ObjectExpression_) + @Js + def PyJsHoisted_RegExpLiteral_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', (((Js(u'/')+var.get(u'node').get(u'pattern'))+Js(u'/'))+var.get(u'node').get(u'flags'))) + PyJsHoisted_RegExpLiteral_.func_name = u'RegExpLiteral' + var.put(u'RegExpLiteral', PyJsHoisted_RegExpLiteral_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_497_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_497_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_Identifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u'node').get(u'variance'): + if PyJsStrictEq(var.get(u'node').get(u'variance'),Js(u'plus')): + var.get(u"this").callprop(u'token', Js(u'+')) + else: + if PyJsStrictEq(var.get(u'node').get(u'variance'),Js(u'minus')): + var.get(u"this").callprop(u'token', Js(u'-')) + var.get(u"this").callprop(u'word', var.get(u'node').get(u'name')) + PyJsHoisted_Identifier_.func_name = u'Identifier' + var.put(u'Identifier', PyJsHoisted_Identifier_) + @Js + def PyJsHoisted_NullLiteral_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'null')) + PyJsHoisted_NullLiteral_.func_name = u'NullLiteral' + var.put(u'NullLiteral', PyJsHoisted_NullLiteral_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'ArrayPattern', var.get(u'exports').put(u'ObjectPattern', var.get(u'exports').put(u'RestProperty', var.get(u'exports').put(u'SpreadProperty', var.get(u'exports').put(u'SpreadElement', var.get(u'undefined')))))) + var.get(u'exports').put(u'Identifier', var.get(u'Identifier')) + var.get(u'exports').put(u'RestElement', var.get(u'RestElement')) + var.get(u'exports').put(u'ObjectExpression', var.get(u'ObjectExpression')) + var.get(u'exports').put(u'ObjectMethod', var.get(u'ObjectMethod')) + var.get(u'exports').put(u'ObjectProperty', var.get(u'ObjectProperty')) + var.get(u'exports').put(u'ArrayExpression', var.get(u'ArrayExpression')) + var.get(u'exports').put(u'RegExpLiteral', var.get(u'RegExpLiteral')) + var.get(u'exports').put(u'BooleanLiteral', var.get(u'BooleanLiteral')) + var.get(u'exports').put(u'NullLiteral', var.get(u'NullLiteral')) + var.get(u'exports').put(u'NumericLiteral', var.get(u'NumericLiteral')) + var.get(u'exports').put(u'StringLiteral', var.get(u'StringLiteral')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_jsesc', var.get(u'require')(Js(u'jsesc'))) + var.put(u'_jsesc2', var.get(u'_interopRequireDefault')(var.get(u'_jsesc'))) + pass + pass + pass + pass + var.get(u'exports').put(u'SpreadElement', var.get(u'RestElement')) + var.get(u'exports').put(u'SpreadProperty', var.get(u'RestElement')) + var.get(u'exports').put(u'RestProperty', var.get(u'RestElement')) + pass + var.get(u'exports').put(u'ObjectPattern', var.get(u'ObjectExpression')) + pass + pass + pass + var.get(u'exports').put(u'ArrayPattern', var.get(u'ArrayExpression')) + pass + pass + pass + pass + pass +PyJs_anonymous_496_._set_name(u'anonymous') +PyJs_Object_501_ = Js({u'babel-types':Js(258.0),u'jsesc':Js(283.0)}) +@Js +def PyJs_anonymous_502_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'Generator', u'_sourceMap', u'_detectIndent2', u'module', u'_interopRequireDefault', u'_printer2', u'normalizeOptions', u'findCommonStringDelimiter', u'_possibleConstructorReturn3', u'_possibleConstructorReturn2', u'_classCallCheck3', u'_classCallCheck2', u'_detectIndent', u'_babelMessages', u'exports', u'_printer', u'_interopRequireWildcard', u'_inherits3', u'_inherits2', u'require', u'CodeGenerator', u'messages', u'_sourceMap2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_505_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_505_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_findCommonStringDelimiter_(code, tokens, this, arguments, var=var): + var = Scope({u'tokens':tokens, u'this':this, u'code':code, u'arguments':arguments}, var) + var.registers([u'code', u'checked', u'i', u'tokens', u'raw', u'token', u'DEFAULT_STRING_DELIMITER', u'occurences']) + var.put(u'DEFAULT_STRING_DELIMITER', Js(u'double')) + if var.get(u'code').neg(): + return var.get(u'DEFAULT_STRING_DELIMITER') + PyJs_Object_513_ = Js({u'single':Js(0.0),u'double':Js(0.0)}) + var.put(u'occurences', PyJs_Object_513_) + var.put(u'checked', Js(0.0)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'tokens').get(u'length')): + try: + var.put(u'token', var.get(u'tokens').get(var.get(u'i'))) + if PyJsStrictNeq(var.get(u'token').get(u'type').get(u'label'),Js(u'string')): + continue + var.put(u'raw', var.get(u'code').callprop(u'slice', var.get(u'token').get(u'start'), var.get(u'token').get(u'end'))) + if PyJsStrictEq(var.get(u'raw').get(u'0'),Js(u"'")): + (var.get(u'occurences').put(u'single',Js(var.get(u'occurences').get(u'single').to_number())+Js(1))-Js(1)) + else: + (var.get(u'occurences').put(u'double',Js(var.get(u'occurences').get(u'double').to_number())+Js(1))-Js(1)) + (var.put(u'checked',Js(var.get(u'checked').to_number())+Js(1))-Js(1)) + if (var.get(u'checked')>=Js(3.0)): + break + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + if (var.get(u'occurences').get(u'single')>var.get(u'occurences').get(u'double')): + return Js(u'single') + else: + return Js(u'double') + PyJsHoisted_findCommonStringDelimiter_.func_name = u'findCommonStringDelimiter' + var.put(u'findCommonStringDelimiter', PyJsHoisted_findCommonStringDelimiter_) + @Js + def PyJsHoisted_normalizeOptions_(code, opts, tokens, this, arguments, var=var): + var = Scope({u'tokens':tokens, u'this':this, u'code':code, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'style', u'code', u'indent', u'format', u'tokens', u'opts']) + var.put(u'style', Js(u' ')) + if (var.get(u'code') and PyJsStrictEq(var.get(u'code',throw=False).typeof(),Js(u'string'))): + var.put(u'indent', PyJsComma(Js(0.0),var.get(u'_detectIndent2').get(u'default'))(var.get(u'code')).get(u'indent')) + if (var.get(u'indent') and PyJsStrictNeq(var.get(u'indent'),Js(u' '))): + var.put(u'style', var.get(u'indent')) + PyJs_Object_510_ = Js({u'adjustMultilineComment':var.get(u'true'),u'style':var.get(u'style'),u'base':Js(0.0)}) + PyJs_Object_509_ = Js({u'auxiliaryCommentBefore':var.get(u'opts').get(u'auxiliaryCommentBefore'),u'auxiliaryCommentAfter':var.get(u'opts').get(u'auxiliaryCommentAfter'),u'shouldPrintComment':var.get(u'opts').get(u'shouldPrintComment'),u'retainLines':var.get(u'opts').get(u'retainLines'),u'retainFunctionParens':var.get(u'opts').get(u'retainFunctionParens'),u'comments':((var.get(u'opts').get(u'comments')==var.get(u"null")) or var.get(u'opts').get(u'comments')),u'compact':var.get(u'opts').get(u'compact'),u'minified':var.get(u'opts').get(u'minified'),u'concise':var.get(u'opts').get(u'concise'),u'quotes':(var.get(u'opts').get(u'quotes') or var.get(u'findCommonStringDelimiter')(var.get(u'code'), var.get(u'tokens'))),u'indent':PyJs_Object_510_}) + var.put(u'format', PyJs_Object_509_) + if var.get(u'format').get(u'minified'): + var.get(u'format').put(u'compact', var.get(u'true')) + @Js + def PyJs_anonymous_511_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'format').get(u'comments') + PyJs_anonymous_511_._set_name(u'anonymous') + var.get(u'format').put(u'shouldPrintComment', (var.get(u'format').get(u'shouldPrintComment') or PyJs_anonymous_511_)) + else: + @Js + def PyJs_anonymous_512_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'format').get(u'comments') or (var.get(u'value').callprop(u'indexOf', Js(u'@license'))>=Js(0.0))) or (var.get(u'value').callprop(u'indexOf', Js(u'@preserve'))>=Js(0.0))) + PyJs_anonymous_512_._set_name(u'anonymous') + var.get(u'format').put(u'shouldPrintComment', (var.get(u'format').get(u'shouldPrintComment') or PyJs_anonymous_512_)) + if PyJsStrictEq(var.get(u'format').get(u'compact'),Js(u'auto')): + var.get(u'format').put(u'compact', (var.get(u'code').get(u'length')>Js(100000.0))) + if var.get(u'format').get(u'compact'): + var.get(u'console').callprop(u'error', (Js(u'[BABEL] ')+var.get(u'messages').callprop(u'get', Js(u'codeGeneratorDeopt'), var.get(u'opts').get(u'filename'), Js(u'100KB')))) + if var.get(u'format').get(u'compact'): + var.get(u'format').get(u'indent').put(u'adjustMultilineComment', Js(False)) + return var.get(u'format') + PyJsHoisted_normalizeOptions_.func_name = u'normalizeOptions' + var.put(u'normalizeOptions', PyJsHoisted_normalizeOptions_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_504_ = Js({}) + var.put(u'newObj', PyJs_Object_504_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'CodeGenerator', var.get(u'undefined')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_possibleConstructorReturn2', var.get(u'require')(Js(u'babel-runtime/helpers/possibleConstructorReturn'))) + var.put(u'_possibleConstructorReturn3', var.get(u'_interopRequireDefault')(var.get(u'_possibleConstructorReturn2'))) + var.put(u'_inherits2', var.get(u'require')(Js(u'babel-runtime/helpers/inherits'))) + var.put(u'_inherits3', var.get(u'_interopRequireDefault')(var.get(u'_inherits2'))) + @Js + def PyJs_anonymous_503_(ast, opts, code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'opts':opts, u'ast':ast}, var) + var.registers([u'code', u'gen', u'opts', u'ast']) + var.put(u'gen', var.get(u'Generator').create(var.get(u'ast'), var.get(u'opts'), var.get(u'code'))) + return var.get(u'gen').callprop(u'generate') + PyJs_anonymous_503_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_503_) + var.put(u'_detectIndent', var.get(u'require')(Js(u'detect-indent'))) + var.put(u'_detectIndent2', var.get(u'_interopRequireDefault')(var.get(u'_detectIndent'))) + var.put(u'_sourceMap', var.get(u'require')(Js(u'./source-map'))) + var.put(u'_sourceMap2', var.get(u'_interopRequireDefault')(var.get(u'_sourceMap'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_printer', var.get(u'require')(Js(u'./printer'))) + var.put(u'_printer2', var.get(u'_interopRequireDefault')(var.get(u'_printer'))) + pass + pass + @Js + def PyJs_anonymous_506_(_Printer, this, arguments, var=var): + var = Scope({u'this':this, u'_Printer':_Printer, u'arguments':arguments}, var) + var.registers([u'_Printer', u'Generator']) + @Js + def PyJsHoisted_Generator_(ast, opts, code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'opts':opts, u'ast':ast}, var) + var.registers([u'map', u'code', u'_this', u'ast', u'format', u'tokens', u'opts']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Generator')) + PyJs_Object_507_ = Js({}) + var.put(u'opts', (var.get(u'opts') or PyJs_Object_507_)) + var.put(u'tokens', (var.get(u'ast').get(u'tokens') or Js([]))) + var.put(u'format', var.get(u'normalizeOptions')(var.get(u'code'), var.get(u'opts'), var.get(u'tokens'))) + var.put(u'map', (var.get(u'_sourceMap2').get(u'default').create(var.get(u'opts'), var.get(u'code')) if var.get(u'opts').get(u'sourceMaps') else var.get(u"null"))) + var.put(u'_this', PyJsComma(Js(0.0),var.get(u'_possibleConstructorReturn3').get(u'default'))(var.get(u"this"), var.get(u'_Printer').callprop(u'call', var.get(u"this"), var.get(u'format'), var.get(u'map'), var.get(u'tokens')))) + var.get(u'_this').put(u'ast', var.get(u'ast')) + return var.get(u'_this') + PyJsHoisted_Generator_.func_name = u'Generator' + var.put(u'Generator', PyJsHoisted_Generator_) + PyJsComma(Js(0.0),var.get(u'_inherits3').get(u'default'))(var.get(u'Generator'), var.get(u'_Printer')) + pass + @Js + def PyJs_generate_508_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'generate':PyJs_generate_508_}, var) + var.registers([]) + return var.get(u'_Printer').get(u'prototype').get(u'generate').callprop(u'call', var.get(u"this"), var.get(u"this").get(u'ast')) + PyJs_generate_508_._set_name(u'generate') + var.get(u'Generator').get(u'prototype').put(u'generate', PyJs_generate_508_) + return var.get(u'Generator') + PyJs_anonymous_506_._set_name(u'anonymous') + var.put(u'Generator', PyJs_anonymous_506_(var.get(u'_printer2').get(u'default'))) + pass + pass + @Js + def PyJs_anonymous_514_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'CodeGenerator']) + @Js + def PyJsHoisted_CodeGenerator_(ast, opts, code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'opts':opts, u'ast':ast}, var) + var.registers([u'code', u'opts', u'ast']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'CodeGenerator')) + var.get(u"this").put(u'_generator', var.get(u'Generator').create(var.get(u'ast'), var.get(u'opts'), var.get(u'code'))) + PyJsHoisted_CodeGenerator_.func_name = u'CodeGenerator' + var.put(u'CodeGenerator', PyJsHoisted_CodeGenerator_) + pass + @Js + def PyJs_generate_515_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'generate':PyJs_generate_515_}, var) + var.registers([]) + return var.get(u"this").get(u'_generator').callprop(u'generate') + PyJs_generate_515_._set_name(u'generate') + var.get(u'CodeGenerator').get(u'prototype').put(u'generate', PyJs_generate_515_) + return var.get(u'CodeGenerator') + PyJs_anonymous_514_._set_name(u'anonymous') + var.put(u'CodeGenerator', var.get(u'exports').put(u'CodeGenerator', PyJs_anonymous_514_())) +PyJs_anonymous_502_._set_name(u'anonymous') +PyJs_Object_516_ = Js({u'./printer':Js(44.0),u'./source-map':Js(45.0),u'babel-messages':Js(57.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-runtime/helpers/inherits':Js(111.0),u'babel-runtime/helpers/possibleConstructorReturn':Js(113.0),u'detect-indent':Js(271.0)}) +@Js +def PyJs_anonymous_517_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'needsParens', u'module', u'_parentheses', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'find', u'needsWhitespaceBefore', u'_keys', u'parens', u'exports', u'expandedWhitespaceNodes', u'_interopRequireWildcard', u'_babelTypes', u'expandAliases', u'needsWhitespace', u'_keys2', u'_whitespace2', u'expandedParens', u'expandedWhitespaceList', u'require', u'isOrHasCallExpression', u'_whitespace', u't', u'needsWhitespaceAfter']) + @Js + def PyJsHoisted_needsParens_(node, parent, printStack, this, arguments, var=var): + var = Scope({u'node':node, u'printStack':printStack, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'printStack', u'parent']) + if var.get(u'parent').neg(): + return Js(False) + if (var.get(u't').callprop(u'isNewExpression', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'callee'),var.get(u'node'))): + if var.get(u'isOrHasCallExpression')(var.get(u'node')): + return var.get(u'true') + return var.get(u'find')(var.get(u'expandedParens'), var.get(u'node'), var.get(u'parent'), var.get(u'printStack')) + PyJsHoisted_needsParens_.func_name = u'needsParens' + var.put(u'needsParens', PyJsHoisted_needsParens_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_518_ = Js({}) + var.put(u'newObj', PyJs_Object_518_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_needsWhitespaceBefore_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + return var.get(u'needsWhitespace')(var.get(u'node'), var.get(u'parent'), Js(u'before')) + PyJsHoisted_needsWhitespaceBefore_.func_name = u'needsWhitespaceBefore' + var.put(u'needsWhitespaceBefore', PyJsHoisted_needsWhitespaceBefore_) + @Js + def PyJsHoisted_expandAliases_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'_isArray', u'_iterator', u'_isArray2', u'_ref2', u'_i2', u'newObj', u'alias', u'add', u'_i', u'obj', u'_ref', u'_iterator2', u'type', u'aliases']) + @Js + def PyJsHoisted_add_(type, func, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'func':func}, var) + var.registers([u'type', u'func', u'fn']) + var.put(u'fn', var.get(u'newObj').get(var.get(u'type'))) + @Js + def PyJs_anonymous_521_(node, parent, stack, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'stack':stack, u'parent':parent, u'arguments':arguments}, var) + var.registers([u'node', u'result', u'parent', u'stack']) + var.put(u'result', var.get(u'fn')(var.get(u'node'), var.get(u'parent'), var.get(u'stack'))) + return (var.get(u'func')(var.get(u'node'), var.get(u'parent'), var.get(u'stack')) if (var.get(u'result')==var.get(u"null")) else var.get(u'result')) + PyJs_anonymous_521_._set_name(u'anonymous') + var.get(u'newObj').put(var.get(u'type'), (PyJs_anonymous_521_ if var.get(u'fn') else var.get(u'func'))) + PyJsHoisted_add_.func_name = u'add' + var.put(u'add', PyJsHoisted_add_) + PyJs_Object_520_ = Js({}) + var.put(u'newObj', PyJs_Object_520_) + pass + #for JS loop + var.put(u'_iterator', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'obj'))) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'type', var.get(u'_ref')) + var.put(u'aliases', var.get(u't').get(u'FLIPPED_ALIAS_KEYS').get(var.get(u'type'))) + if var.get(u'aliases'): + #for JS loop + var.put(u'_iterator2', var.get(u'aliases')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'alias', var.get(u'_ref2')) + var.get(u'add')(var.get(u'alias'), var.get(u'obj').get(var.get(u'type'))) + + else: + var.get(u'add')(var.get(u'type'), var.get(u'obj').get(var.get(u'type'))) + + return var.get(u'newObj') + PyJsHoisted_expandAliases_.func_name = u'expandAliases' + var.put(u'expandAliases', PyJsHoisted_expandAliases_) + @Js + def PyJsHoisted_needsWhitespace_(node, parent, type, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'type':type, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent', u'i', u'items', u'linesInfo', u'type']) + if var.get(u'node').neg(): + return Js(0.0) + if var.get(u't').callprop(u'isExpressionStatement', var.get(u'node')): + var.put(u'node', var.get(u'node').get(u'expression')) + var.put(u'linesInfo', var.get(u'find')(var.get(u'expandedWhitespaceNodes'), var.get(u'node'), var.get(u'parent'))) + if var.get(u'linesInfo').neg(): + var.put(u'items', var.get(u'find')(var.get(u'expandedWhitespaceList'), var.get(u'node'), var.get(u'parent'))) + if var.get(u'items'): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'items').get(u'length')): + try: + var.put(u'linesInfo', var.get(u'needsWhitespace')(var.get(u'items').get(var.get(u'i')), var.get(u'node'), var.get(u'type'))) + if var.get(u'linesInfo'): + break + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return ((var.get(u'linesInfo') and var.get(u'linesInfo').get(var.get(u'type'))) or Js(0.0)) + PyJsHoisted_needsWhitespace_.func_name = u'needsWhitespace' + var.put(u'needsWhitespace', PyJsHoisted_needsWhitespace_) + @Js + def PyJsHoisted_isOrHasCallExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u't').callprop(u'isCallExpression', var.get(u'node')): + return var.get(u'true') + if var.get(u't').callprop(u'isMemberExpression', var.get(u'node')): + return (var.get(u'isOrHasCallExpression')(var.get(u'node').get(u'object')) or (var.get(u'node').get(u'computed').neg() and var.get(u'isOrHasCallExpression')(var.get(u'node').get(u'property')))) + else: + return Js(False) + PyJsHoisted_isOrHasCallExpression_.func_name = u'isOrHasCallExpression' + var.put(u'isOrHasCallExpression', PyJsHoisted_isOrHasCallExpression_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_519_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_519_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_needsWhitespaceAfter_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + return var.get(u'needsWhitespace')(var.get(u'node'), var.get(u'parent'), Js(u'after')) + PyJsHoisted_needsWhitespaceAfter_.func_name = u'needsWhitespaceAfter' + var.put(u'needsWhitespaceAfter', PyJsHoisted_needsWhitespaceAfter_) + @Js + def PyJsHoisted_find_(obj, node, parent, printStack, this, arguments, var=var): + var = Scope({u'node':node, u'obj':obj, u'arguments':arguments, u'parent':parent, u'this':this, u'printStack':printStack}, var) + var.registers([u'node', u'printStack', u'obj', u'parent', u'fn']) + var.put(u'fn', var.get(u'obj').get(var.get(u'node').get(u'type'))) + return (var.get(u'fn')(var.get(u'node'), var.get(u'parent'), var.get(u'printStack')) if var.get(u'fn') else var.get(u"null")) + PyJsHoisted_find_.func_name = u'find' + var.put(u'find', PyJsHoisted_find_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_keys', var.get(u'require')(Js(u'babel-runtime/core-js/object/keys'))) + var.put(u'_keys2', var.get(u'_interopRequireDefault')(var.get(u'_keys'))) + var.get(u'exports').put(u'needsWhitespace', var.get(u'needsWhitespace')) + var.get(u'exports').put(u'needsWhitespaceBefore', var.get(u'needsWhitespaceBefore')) + var.get(u'exports').put(u'needsWhitespaceAfter', var.get(u'needsWhitespaceAfter')) + var.get(u'exports').put(u'needsParens', var.get(u'needsParens')) + var.put(u'_whitespace', var.get(u'require')(Js(u'./whitespace'))) + var.put(u'_whitespace2', var.get(u'_interopRequireDefault')(var.get(u'_whitespace'))) + var.put(u'_parentheses', var.get(u'require')(Js(u'./parentheses'))) + var.put(u'parens', var.get(u'_interopRequireWildcard')(var.get(u'_parentheses'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + var.put(u'expandedParens', var.get(u'expandAliases')(var.get(u'parens'))) + var.put(u'expandedWhitespaceNodes', var.get(u'expandAliases')(var.get(u'_whitespace2').get(u'default').get(u'nodes'))) + var.put(u'expandedWhitespaceList', var.get(u'expandAliases')(var.get(u'_whitespace2').get(u'default').get(u'list'))) + pass + pass + pass + pass + pass + pass +PyJs_anonymous_517_._set_name(u'anonymous') +PyJs_Object_522_ = Js({u'./parentheses':Js(42.0),u'./whitespace':Js(43.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/object/keys':Js(103.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_523_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'ArrowFunctionExpression', u'Binary', u'exports', u'SequenceExpression', u'ConditionalExpression', u'_interopRequireWildcard', u'PRECEDENCE', u'ClassExpression', u'require', u'_babelTypes', u'FunctionExpression', u'UpdateExpression', u'module', u'YieldExpression', u'ObjectExpression', u't', u'BinaryExpression', u'AssignmentExpression', u'isFirstInStatement', u'UnaryLike', u'NullableTypeAnnotation']) + @Js + def PyJsHoisted_Binary_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'nodePos', u'parent', u'parentPos', u'parentOp', u'nodeOp']) + if ((var.get(u't').callprop(u'isCallExpression', var.get(u'parent')) or var.get(u't').callprop(u'isNewExpression', var.get(u'parent'))) and PyJsStrictEq(var.get(u'parent').get(u'callee'),var.get(u'node'))): + return var.get(u'true') + if var.get(u't').callprop(u'isUnaryLike', var.get(u'parent')): + return var.get(u'true') + if (var.get(u't').callprop(u'isMemberExpression', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'object'),var.get(u'node'))): + return var.get(u'true') + if var.get(u't').callprop(u'isBinary', var.get(u'parent')): + var.put(u'parentOp', var.get(u'parent').get(u'operator')) + var.put(u'parentPos', var.get(u'PRECEDENCE').get(var.get(u'parentOp'))) + var.put(u'nodeOp', var.get(u'node').get(u'operator')) + var.put(u'nodePos', var.get(u'PRECEDENCE').get(var.get(u'nodeOp'))) + if (var.get(u'parentPos')>var.get(u'nodePos')): + return var.get(u'true') + if ((PyJsStrictEq(var.get(u'parentPos'),var.get(u'nodePos')) and PyJsStrictEq(var.get(u'parent').get(u'right'),var.get(u'node'))) and var.get(u't').callprop(u'isLogicalExpression', var.get(u'parent')).neg()): + return var.get(u'true') + return Js(False) + PyJsHoisted_Binary_.func_name = u'Binary' + var.put(u'Binary', PyJsHoisted_Binary_) + @Js + def PyJsHoisted_SequenceExpression_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + if var.get(u't').callprop(u'isForStatement', var.get(u'parent')): + return Js(False) + if (var.get(u't').callprop(u'isExpressionStatement', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'expression'),var.get(u'node'))): + return Js(False) + if var.get(u't').callprop(u'isReturnStatement', var.get(u'parent')): + return Js(False) + if var.get(u't').callprop(u'isThrowStatement', var.get(u'parent')): + return Js(False) + if (var.get(u't').callprop(u'isSwitchStatement', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'discriminant'),var.get(u'node'))): + return Js(False) + if (var.get(u't').callprop(u'isWhileStatement', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'test'),var.get(u'node'))): + return Js(False) + if (var.get(u't').callprop(u'isIfStatement', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'test'),var.get(u'node'))): + return Js(False) + if (var.get(u't').callprop(u'isForInStatement', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'right'),var.get(u'node'))): + return Js(False) + return var.get(u'true') + PyJsHoisted_SequenceExpression_.func_name = u'SequenceExpression' + var.put(u'SequenceExpression', PyJsHoisted_SequenceExpression_) + @Js + def PyJsHoisted_ArrowFunctionExpression_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + if var.get(u't').callprop(u'isExportDeclaration', var.get(u'parent')): + return var.get(u'true') + if (var.get(u't').callprop(u'isBinaryExpression', var.get(u'parent')) or var.get(u't').callprop(u'isLogicalExpression', var.get(u'parent'))): + return var.get(u'true') + if var.get(u't').callprop(u'isUnaryExpression', var.get(u'parent')): + return var.get(u'true') + return var.get(u'UnaryLike')(var.get(u'node'), var.get(u'parent')) + PyJsHoisted_ArrowFunctionExpression_.func_name = u'ArrowFunctionExpression' + var.put(u'ArrowFunctionExpression', PyJsHoisted_ArrowFunctionExpression_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_524_ = Js({}) + var.put(u'newObj', PyJs_Object_524_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_ClassExpression_(node, parent, printStack, this, arguments, var=var): + var = Scope({u'node':node, u'printStack':printStack, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'printStack', u'parent']) + PyJs_Object_528_ = Js({u'considerDefaultExports':var.get(u'true')}) + return var.get(u'isFirstInStatement')(var.get(u'printStack'), PyJs_Object_528_) + PyJsHoisted_ClassExpression_.func_name = u'ClassExpression' + var.put(u'ClassExpression', PyJsHoisted_ClassExpression_) + @Js + def PyJsHoisted_ConditionalExpression_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + if var.get(u't').callprop(u'isUnaryLike', var.get(u'parent')): + return var.get(u'true') + if var.get(u't').callprop(u'isBinary', var.get(u'parent')): + return var.get(u'true') + PyJs_Object_533_ = Js({u'test':var.get(u'node')}) + if var.get(u't').callprop(u'isConditionalExpression', var.get(u'parent'), PyJs_Object_533_): + return var.get(u'true') + return var.get(u'UnaryLike')(var.get(u'node'), var.get(u'parent')) + PyJsHoisted_ConditionalExpression_.func_name = u'ConditionalExpression' + var.put(u'ConditionalExpression', PyJsHoisted_ConditionalExpression_) + @Js + def PyJsHoisted_FunctionExpression_(node, parent, printStack, this, arguments, var=var): + var = Scope({u'node':node, u'printStack':printStack, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'printStack', u'parent']) + PyJs_Object_532_ = Js({u'considerDefaultExports':var.get(u'true')}) + return var.get(u'isFirstInStatement')(var.get(u'printStack'), PyJs_Object_532_) + PyJsHoisted_FunctionExpression_.func_name = u'FunctionExpression' + var.put(u'FunctionExpression', PyJsHoisted_FunctionExpression_) + @Js + def PyJsHoisted_UpdateExpression_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + if (var.get(u't').callprop(u'isMemberExpression', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'object'),var.get(u'node'))): + return var.get(u'true') + return Js(False) + PyJsHoisted_UpdateExpression_.func_name = u'UpdateExpression' + var.put(u'UpdateExpression', PyJsHoisted_UpdateExpression_) + @Js + def PyJsHoisted_YieldExpression_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + def PyJs_LONG_527_(var=var): + return (((((var.get(u't').callprop(u'isBinary', var.get(u'parent')) or var.get(u't').callprop(u'isUnaryLike', var.get(u'parent'))) or var.get(u't').callprop(u'isCallExpression', var.get(u'parent'))) or var.get(u't').callprop(u'isMemberExpression', var.get(u'parent'))) or var.get(u't').callprop(u'isNewExpression', var.get(u'parent'))) or (var.get(u't').callprop(u'isConditionalExpression', var.get(u'parent')) and PyJsStrictEq(var.get(u'node'),var.get(u'parent').get(u'test')))) + return PyJs_LONG_527_() + PyJsHoisted_YieldExpression_.func_name = u'YieldExpression' + var.put(u'YieldExpression', PyJsHoisted_YieldExpression_) + @Js + def PyJsHoisted_ObjectExpression_(node, parent, printStack, this, arguments, var=var): + var = Scope({u'node':node, u'printStack':printStack, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'printStack', u'parent']) + PyJs_Object_526_ = Js({u'considerArrow':var.get(u'true')}) + return var.get(u'isFirstInStatement')(var.get(u'printStack'), PyJs_Object_526_) + PyJsHoisted_ObjectExpression_.func_name = u'ObjectExpression' + var.put(u'ObjectExpression', PyJsHoisted_ObjectExpression_) + @Js + def PyJsHoisted_BinaryExpression_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + if PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'in')): + if var.get(u't').callprop(u'isVariableDeclarator', var.get(u'parent')): + return var.get(u'true') + if var.get(u't').callprop(u'isFor', var.get(u'parent')): + return var.get(u'true') + return Js(False) + PyJsHoisted_BinaryExpression_.func_name = u'BinaryExpression' + var.put(u'BinaryExpression', PyJsHoisted_BinaryExpression_) + @Js + def PyJsHoisted_AssignmentExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u't').callprop(u'isObjectPattern', var.get(u'node').get(u'left')): + return var.get(u'true') + else: + return var.get(u'ConditionalExpression').callprop(u'apply', var.get(u'undefined'), var.get(u'arguments')) + PyJsHoisted_AssignmentExpression_.func_name = u'AssignmentExpression' + var.put(u'AssignmentExpression', PyJsHoisted_AssignmentExpression_) + @Js + def PyJsHoisted_isFirstInStatement_(printStack, this, arguments, var=var): + var = Scope({u'this':this, u'printStack':printStack, u'arguments':arguments}, var) + var.registers([u'_ref$considerArrow', u'node', u'considerDefaultExports', u'parent', u'i', u'printStack', u'_ref$considerDefaultE', u'considerArrow', u'_ref']) + PyJs_Object_534_ = Js({}) + var.put(u'_ref', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_534_)) + var.put(u'_ref$considerArrow', var.get(u'_ref').get(u'considerArrow')) + var.put(u'considerArrow', (Js(False) if PyJsStrictEq(var.get(u'_ref$considerArrow'),var.get(u'undefined')) else var.get(u'_ref$considerArrow'))) + var.put(u'_ref$considerDefaultE', var.get(u'_ref').get(u'considerDefaultExports')) + var.put(u'considerDefaultExports', (Js(False) if PyJsStrictEq(var.get(u'_ref$considerDefaultE'),var.get(u'undefined')) else var.get(u'_ref$considerDefaultE'))) + var.put(u'i', (var.get(u'printStack').get(u'length')-Js(1.0))) + var.put(u'node', var.get(u'printStack').get(var.get(u'i'))) + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + var.put(u'parent', var.get(u'printStack').get(var.get(u'i'))) + while (var.get(u'i')>Js(0.0)): + PyJs_Object_535_ = Js({u'expression':var.get(u'node')}) + if var.get(u't').callprop(u'isExpressionStatement', var.get(u'parent'), PyJs_Object_535_): + return var.get(u'true') + PyJs_Object_536_ = Js({u'declaration':var.get(u'node')}) + if (var.get(u'considerDefaultExports') and var.get(u't').callprop(u'isExportDefaultDeclaration', var.get(u'parent'), PyJs_Object_536_)): + return var.get(u'true') + PyJs_Object_537_ = Js({u'body':var.get(u'node')}) + if (var.get(u'considerArrow') and var.get(u't').callprop(u'isArrowFunctionExpression', var.get(u'parent'), PyJs_Object_537_)): + return var.get(u'true') + def PyJs_LONG_541_(var=var): + PyJs_Object_538_ = Js({u'callee':var.get(u'node')}) + PyJs_Object_539_ = Js({u'object':var.get(u'node')}) + PyJs_Object_540_ = Js({u'test':var.get(u'node')}) + return (((var.get(u't').callprop(u'isCallExpression', var.get(u'parent'), PyJs_Object_538_) or (var.get(u't').callprop(u'isSequenceExpression', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'expressions').get(u'0'),var.get(u'node')))) or var.get(u't').callprop(u'isMemberExpression', var.get(u'parent'), PyJs_Object_539_)) or var.get(u't').callprop(u'isConditional', var.get(u'parent'), PyJs_Object_540_)) + PyJs_Object_542_ = Js({u'left':var.get(u'node')}) + PyJs_Object_543_ = Js({u'left':var.get(u'node')}) + if ((PyJs_LONG_541_() or var.get(u't').callprop(u'isBinary', var.get(u'parent'), PyJs_Object_542_)) or var.get(u't').callprop(u'isAssignmentExpression', var.get(u'parent'), PyJs_Object_543_)): + var.put(u'node', var.get(u'parent')) + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + var.put(u'parent', var.get(u'printStack').get(var.get(u'i'))) + else: + return Js(False) + return Js(False) + PyJsHoisted_isFirstInStatement_.func_name = u'isFirstInStatement' + var.put(u'isFirstInStatement', PyJsHoisted_isFirstInStatement_) + @Js + def PyJsHoisted_UnaryLike_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + PyJs_Object_529_ = Js({u'object':var.get(u'node')}) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'parent'), PyJs_Object_529_): + return var.get(u'true') + PyJs_Object_530_ = Js({u'callee':var.get(u'node')}) + PyJs_Object_531_ = Js({u'callee':var.get(u'node')}) + if (var.get(u't').callprop(u'isCallExpression', var.get(u'parent'), PyJs_Object_530_) or var.get(u't').callprop(u'isNewExpression', var.get(u'parent'), PyJs_Object_531_)): + return var.get(u'true') + return Js(False) + PyJsHoisted_UnaryLike_.func_name = u'UnaryLike' + var.put(u'UnaryLike', PyJsHoisted_UnaryLike_) + @Js + def PyJsHoisted_NullableTypeAnnotation_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + return var.get(u't').callprop(u'isArrayTypeAnnotation', var.get(u'parent')) + PyJsHoisted_NullableTypeAnnotation_.func_name = u'NullableTypeAnnotation' + var.put(u'NullableTypeAnnotation', PyJsHoisted_NullableTypeAnnotation_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'AwaitExpression', var.get(u'exports').put(u'FunctionTypeAnnotation', var.get(u'undefined'))) + var.get(u'exports').put(u'NullableTypeAnnotation', var.get(u'NullableTypeAnnotation')) + var.get(u'exports').put(u'UpdateExpression', var.get(u'UpdateExpression')) + var.get(u'exports').put(u'ObjectExpression', var.get(u'ObjectExpression')) + var.get(u'exports').put(u'Binary', var.get(u'Binary')) + var.get(u'exports').put(u'BinaryExpression', var.get(u'BinaryExpression')) + var.get(u'exports').put(u'SequenceExpression', var.get(u'SequenceExpression')) + var.get(u'exports').put(u'YieldExpression', var.get(u'YieldExpression')) + var.get(u'exports').put(u'ClassExpression', var.get(u'ClassExpression')) + var.get(u'exports').put(u'UnaryLike', var.get(u'UnaryLike')) + var.get(u'exports').put(u'FunctionExpression', var.get(u'FunctionExpression')) + var.get(u'exports').put(u'ArrowFunctionExpression', var.get(u'ArrowFunctionExpression')) + var.get(u'exports').put(u'ConditionalExpression', var.get(u'ConditionalExpression')) + var.get(u'exports').put(u'AssignmentExpression', var.get(u'AssignmentExpression')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + PyJs_Object_525_ = Js({u'||':Js(0.0),u'&&':Js(1.0),u'|':Js(2.0),u'^':Js(3.0),u'&':Js(4.0),u'==':Js(5.0),u'===':Js(5.0),u'!=':Js(5.0),u'!==':Js(5.0),u'<':Js(6.0),u'>':Js(6.0),u'<=':Js(6.0),u'>=':Js(6.0),u'in':Js(6.0),u'instanceof':Js(6.0),u'>>':Js(7.0),u'<<':Js(7.0),u'>>>':Js(7.0),u'+':Js(8.0),u'-':Js(8.0),u'*':Js(9.0),u'/':Js(9.0),u'%':Js(9.0),u'**':Js(10.0)}) + var.put(u'PRECEDENCE', PyJs_Object_525_) + pass + var.get(u'exports').put(u'FunctionTypeAnnotation', var.get(u'NullableTypeAnnotation')) + pass + pass + pass + pass + pass + pass + var.get(u'exports').put(u'AwaitExpression', var.get(u'YieldExpression')) + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_523_._set_name(u'anonymous') +PyJs_Object_544_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_545_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isHelper', u'exports', u'_babelTypes', u'_each', u'_interopRequireWildcard', u'_map', u'require', u'_isBoolean', u'module', u'_each2', u'_isBoolean2', u'isType', u'_interopRequireDefault', u'crawl', u'_map2', u't']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_547_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_547_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_isHelper_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'node')): + return (var.get(u'isHelper')(var.get(u'node').get(u'object')) or var.get(u'isHelper')(var.get(u'node').get(u'property'))) + else: + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + return (PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'require')) or PyJsStrictEq(var.get(u'node').get(u'name').get(u'0'),Js(u'_'))) + else: + if var.get(u't').callprop(u'isCallExpression', var.get(u'node')): + return var.get(u'isHelper')(var.get(u'node').get(u'callee')) + else: + if (var.get(u't').callprop(u'isBinary', var.get(u'node')) or var.get(u't').callprop(u'isAssignmentExpression', var.get(u'node'))): + return ((var.get(u't').callprop(u'isIdentifier', var.get(u'node').get(u'left')) and var.get(u'isHelper')(var.get(u'node').get(u'left'))) or var.get(u'isHelper')(var.get(u'node').get(u'right'))) + else: + return Js(False) + PyJsHoisted_isHelper_.func_name = u'isHelper' + var.put(u'isHelper', PyJsHoisted_isHelper_) + @Js + def PyJsHoisted_crawl_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'state']) + PyJs_Object_548_ = Js({}) + var.put(u'state', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_548_)) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'node')): + var.get(u'crawl')(var.get(u'node').get(u'object'), var.get(u'state')) + if var.get(u'node').get(u'computed'): + var.get(u'crawl')(var.get(u'node').get(u'property'), var.get(u'state')) + else: + if (var.get(u't').callprop(u'isBinary', var.get(u'node')) or var.get(u't').callprop(u'isAssignmentExpression', var.get(u'node'))): + var.get(u'crawl')(var.get(u'node').get(u'left'), var.get(u'state')) + var.get(u'crawl')(var.get(u'node').get(u'right'), var.get(u'state')) + else: + if var.get(u't').callprop(u'isCallExpression', var.get(u'node')): + var.get(u'state').put(u'hasCall', var.get(u'true')) + var.get(u'crawl')(var.get(u'node').get(u'callee'), var.get(u'state')) + else: + if var.get(u't').callprop(u'isFunction', var.get(u'node')): + var.get(u'state').put(u'hasFunction', var.get(u'true')) + else: + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + var.get(u'state').put(u'hasHelper', (var.get(u'state').get(u'hasHelper') or var.get(u'isHelper')(var.get(u'node').get(u'callee')))) + return var.get(u'state') + PyJsHoisted_crawl_.func_name = u'crawl' + var.put(u'crawl', PyJsHoisted_crawl_) + @Js + def PyJsHoisted_isType_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return ((((var.get(u't').callprop(u'isLiteral', var.get(u'node')) or var.get(u't').callprop(u'isObjectExpression', var.get(u'node'))) or var.get(u't').callprop(u'isArrayExpression', var.get(u'node'))) or var.get(u't').callprop(u'isIdentifier', var.get(u'node'))) or var.get(u't').callprop(u'isMemberExpression', var.get(u'node'))) + PyJsHoisted_isType_.func_name = u'isType' + var.put(u'isType', PyJsHoisted_isType_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_546_ = Js({}) + var.put(u'newObj', PyJs_Object_546_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.put(u'_isBoolean', var.get(u'require')(Js(u'lodash/isBoolean'))) + var.put(u'_isBoolean2', var.get(u'_interopRequireDefault')(var.get(u'_isBoolean'))) + var.put(u'_each', var.get(u'require')(Js(u'lodash/each'))) + var.put(u'_each2', var.get(u'_interopRequireDefault')(var.get(u'_each'))) + var.put(u'_map', var.get(u'require')(Js(u'lodash/map'))) + var.put(u'_map2', var.get(u'_interopRequireDefault')(var.get(u'_map'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + @Js + def PyJs_AssignmentExpression_550_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'AssignmentExpression':PyJs_AssignmentExpression_550_}, var) + var.registers([u'node', u'state']) + var.put(u'state', var.get(u'crawl')(var.get(u'node').get(u'right'))) + if ((var.get(u'state').get(u'hasCall') and var.get(u'state').get(u'hasHelper')) or var.get(u'state').get(u'hasFunction')): + PyJs_Object_551_ = Js({u'before':var.get(u'state').get(u'hasFunction'),u'after':var.get(u'true')}) + return PyJs_Object_551_ + PyJs_AssignmentExpression_550_._set_name(u'AssignmentExpression') + @Js + def PyJs_SwitchCase_552_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'SwitchCase':PyJs_SwitchCase_552_, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + PyJs_Object_553_ = Js({u'before':(var.get(u'node').get(u'consequent').get(u'length') or PyJsStrictEq(var.get(u'parent').get(u'cases').get(u'0'),var.get(u'node')))}) + return PyJs_Object_553_ + PyJs_SwitchCase_552_._set_name(u'SwitchCase') + @Js + def PyJs_LogicalExpression_554_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'LogicalExpression':PyJs_LogicalExpression_554_}, var) + var.registers([u'node']) + if (var.get(u't').callprop(u'isFunction', var.get(u'node').get(u'left')) or var.get(u't').callprop(u'isFunction', var.get(u'node').get(u'right'))): + PyJs_Object_555_ = Js({u'after':var.get(u'true')}) + return PyJs_Object_555_ + PyJs_LogicalExpression_554_._set_name(u'LogicalExpression') + @Js + def PyJs_Literal_556_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'Literal':PyJs_Literal_556_, u'arguments':arguments}, var) + var.registers([u'node']) + if PyJsStrictEq(var.get(u'node').get(u'value'),Js(u'use strict')): + PyJs_Object_557_ = Js({u'after':var.get(u'true')}) + return PyJs_Object_557_ + PyJs_Literal_556_._set_name(u'Literal') + @Js + def PyJs_CallExpression_558_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'CallExpression':PyJs_CallExpression_558_}, var) + var.registers([u'node']) + if (var.get(u't').callprop(u'isFunction', var.get(u'node').get(u'callee')) or var.get(u'isHelper')(var.get(u'node'))): + PyJs_Object_559_ = Js({u'before':var.get(u'true'),u'after':var.get(u'true')}) + return PyJs_Object_559_ + PyJs_CallExpression_558_._set_name(u'CallExpression') + @Js + def PyJs_VariableDeclaration_560_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'VariableDeclaration':PyJs_VariableDeclaration_560_}, var) + var.registers([u'i', u'node', u'state', u'declar', u'enabled']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'node').get(u'declarations').get(u'length')): + try: + var.put(u'declar', var.get(u'node').get(u'declarations').get(var.get(u'i'))) + var.put(u'enabled', (var.get(u'isHelper')(var.get(u'declar').get(u'id')) and var.get(u'isType')(var.get(u'declar').get(u'init')).neg())) + if var.get(u'enabled').neg(): + var.put(u'state', var.get(u'crawl')(var.get(u'declar').get(u'init'))) + var.put(u'enabled', ((var.get(u'isHelper')(var.get(u'declar').get(u'init')) and var.get(u'state').get(u'hasCall')) or var.get(u'state').get(u'hasFunction'))) + if var.get(u'enabled'): + PyJs_Object_561_ = Js({u'before':var.get(u'true'),u'after':var.get(u'true')}) + return PyJs_Object_561_ + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJs_VariableDeclaration_560_._set_name(u'VariableDeclaration') + @Js + def PyJs_IfStatement_562_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'IfStatement':PyJs_IfStatement_562_}, var) + var.registers([u'node']) + if var.get(u't').callprop(u'isBlockStatement', var.get(u'node').get(u'consequent')): + PyJs_Object_563_ = Js({u'before':var.get(u'true'),u'after':var.get(u'true')}) + return PyJs_Object_563_ + PyJs_IfStatement_562_._set_name(u'IfStatement') + PyJs_Object_549_ = Js({u'AssignmentExpression':PyJs_AssignmentExpression_550_,u'SwitchCase':PyJs_SwitchCase_552_,u'LogicalExpression':PyJs_LogicalExpression_554_,u'Literal':PyJs_Literal_556_,u'CallExpression':PyJs_CallExpression_558_,u'VariableDeclaration':PyJs_VariableDeclaration_560_,u'IfStatement':PyJs_IfStatement_562_}) + var.get(u'exports').put(u'nodes', PyJs_Object_549_) + @Js + def PyJs_anonymous_564_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + if PyJsStrictEq(var.get(u'parent').get(u'properties').get(u'0'),var.get(u'node')): + PyJs_Object_565_ = Js({u'before':var.get(u'true')}) + return PyJs_Object_565_ + PyJs_anonymous_564_._set_name(u'anonymous') + var.get(u'exports').get(u'nodes').put(u'ObjectProperty', var.get(u'exports').get(u'nodes').put(u'ObjectTypeProperty', var.get(u'exports').get(u'nodes').put(u'ObjectMethod', var.get(u'exports').get(u'nodes').put(u'SpreadProperty', PyJs_anonymous_564_)))) + @Js + def PyJs_VariableDeclaration_567_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'VariableDeclaration':PyJs_VariableDeclaration_567_}, var) + var.registers([u'node']) + return PyJsComma(Js(0.0),var.get(u'_map2').get(u'default'))(var.get(u'node').get(u'declarations'), Js(u'init')) + PyJs_VariableDeclaration_567_._set_name(u'VariableDeclaration') + @Js + def PyJs_ArrayExpression_568_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'ArrayExpression':PyJs_ArrayExpression_568_}, var) + var.registers([u'node']) + return var.get(u'node').get(u'elements') + PyJs_ArrayExpression_568_._set_name(u'ArrayExpression') + @Js + def PyJs_ObjectExpression_569_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'ObjectExpression':PyJs_ObjectExpression_569_, u'arguments':arguments}, var) + var.registers([u'node']) + return var.get(u'node').get(u'properties') + PyJs_ObjectExpression_569_._set_name(u'ObjectExpression') + PyJs_Object_566_ = Js({u'VariableDeclaration':PyJs_VariableDeclaration_567_,u'ArrayExpression':PyJs_ArrayExpression_568_,u'ObjectExpression':PyJs_ObjectExpression_569_}) + var.get(u'exports').put(u'list', PyJs_Object_566_) + PyJs_Object_570_ = Js({u'Function':var.get(u'true'),u'Class':var.get(u'true'),u'Loop':var.get(u'true'),u'LabeledStatement':var.get(u'true'),u'SwitchStatement':var.get(u'true'),u'TryStatement':var.get(u'true')}) + @Js + def PyJs_anonymous_571_(amounts, type, this, arguments, var=var): + var = Scope({u'amounts':amounts, u'this':this, u'type':type, u'arguments':arguments}, var) + var.registers([u'amounts', u'type']) + if PyJsComma(Js(0.0),var.get(u'_isBoolean2').get(u'default'))(var.get(u'amounts')): + PyJs_Object_572_ = Js({u'after':var.get(u'amounts'),u'before':var.get(u'amounts')}) + var.put(u'amounts', PyJs_Object_572_) + @Js + def PyJs_anonymous_573_(type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments}, var) + var.registers([u'type']) + @Js + def PyJs_anonymous_574_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'amounts') + PyJs_anonymous_574_._set_name(u'anonymous') + var.get(u'exports').get(u'nodes').put(var.get(u'type'), PyJs_anonymous_574_) + PyJs_anonymous_573_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(Js([var.get(u'type')]).callprop(u'concat', (var.get(u't').get(u'FLIPPED_ALIAS_KEYS').get(var.get(u'type')) or Js([]))), PyJs_anonymous_573_) + PyJs_anonymous_571_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(PyJs_Object_570_, PyJs_anonymous_571_) +PyJs_anonymous_545_._set_name(u'anonymous') +PyJs_Object_575_ = Js({u'babel-types':Js(258.0),u'lodash/each':Js(443.0),u'lodash/isBoolean':Js(461.0),u'lodash/map':Js(476.0)}) +@Js +def PyJs_anonymous_576_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_findLast', u'exports', u'module', u'_find', u'_isInteger2', u'_interopRequireDefault', u'_buffer2', u'_getIterator2', u'_getIterator3', u'Printer', u'_arr', u'_buffer', u'_i2', u'_node', u'_weakSet', u'SCIENTIFIC_NOTATION', u'_classCallCheck3', u'_classCallCheck2', u'_findLast2', u'_babelTypes', u'_stringify2', u'_isInteger', u'_interopRequireWildcard', u'_assign', u'_weakSet2', u'_whitespace2', u'_repeat2', u'_assign2', u'commaSeparator', u'generator', u'require', u'n', u'_repeat', u'_whitespace', u'_stringify', u't', u'_find2', u'NON_DECIMAL_LITERAL', u'ZERO_DECIMAL_INTEGER']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_578_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_578_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_commaSeparator_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'token', Js(u',')) + var.get(u"this").callprop(u'space') + PyJsHoisted_commaSeparator_.func_name = u'commaSeparator' + var.put(u'commaSeparator', PyJsHoisted_commaSeparator_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_577_ = Js({}) + var.put(u'newObj', PyJs_Object_577_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_assign', var.get(u'require')(Js(u'babel-runtime/core-js/object/assign'))) + var.put(u'_assign2', var.get(u'_interopRequireDefault')(var.get(u'_assign'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_stringify', var.get(u'require')(Js(u'babel-runtime/core-js/json/stringify'))) + var.put(u'_stringify2', var.get(u'_interopRequireDefault')(var.get(u'_stringify'))) + var.put(u'_weakSet', var.get(u'require')(Js(u'babel-runtime/core-js/weak-set'))) + var.put(u'_weakSet2', var.get(u'_interopRequireDefault')(var.get(u'_weakSet'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_find', var.get(u'require')(Js(u'lodash/find'))) + var.put(u'_find2', var.get(u'_interopRequireDefault')(var.get(u'_find'))) + var.put(u'_findLast', var.get(u'require')(Js(u'lodash/findLast'))) + var.put(u'_findLast2', var.get(u'_interopRequireDefault')(var.get(u'_findLast'))) + var.put(u'_isInteger', var.get(u'require')(Js(u'lodash/isInteger'))) + var.put(u'_isInteger2', var.get(u'_interopRequireDefault')(var.get(u'_isInteger'))) + var.put(u'_repeat', var.get(u'require')(Js(u'lodash/repeat'))) + var.put(u'_repeat2', var.get(u'_interopRequireDefault')(var.get(u'_repeat'))) + var.put(u'_buffer', var.get(u'require')(Js(u'./buffer'))) + var.put(u'_buffer2', var.get(u'_interopRequireDefault')(var.get(u'_buffer'))) + var.put(u'_node', var.get(u'require')(Js(u'./node'))) + var.put(u'n', var.get(u'_interopRequireWildcard')(var.get(u'_node'))) + var.put(u'_whitespace', var.get(u'require')(Js(u'./whitespace'))) + var.put(u'_whitespace2', var.get(u'_interopRequireDefault')(var.get(u'_whitespace'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'SCIENTIFIC_NOTATION', JsRegExp(u'/e/i')) + var.put(u'ZERO_DECIMAL_INTEGER', JsRegExp(u'/\\.0+$/')) + var.put(u'NON_DECIMAL_LITERAL', JsRegExp(u'/^0[box]/')) + @Js + def PyJs_anonymous_579_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Printer']) + @Js + def PyJsHoisted_Printer_(format, map, tokens, this, arguments, var=var): + var = Scope({u'tokens':tokens, u'map':map, u'this':this, u'arguments':arguments, u'format':format}, var) + var.registers([u'tokens', u'map', u'format']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Printer')) + var.get(u"this").put(u'inForStatementInitCounter', Js(0.0)) + var.get(u"this").put(u'_printStack', Js([])) + var.get(u"this").put(u'_indent', Js(0.0)) + var.get(u"this").put(u'_insideAux', Js(False)) + PyJs_Object_580_ = Js({}) + var.get(u"this").put(u'_printedCommentStarts', PyJs_Object_580_) + var.get(u"this").put(u'_parenPushNewlineState', var.get(u"null")) + var.get(u"this").put(u'_printAuxAfterOnNextUserNode', Js(False)) + var.get(u"this").put(u'_printedComments', var.get(u'_weakSet2').get(u'default').create()) + var.get(u"this").put(u'_endsWithInteger', Js(False)) + var.get(u"this").put(u'_endsWithWord', Js(False)) + PyJs_Object_581_ = Js({}) + var.get(u"this").put(u'format', (var.get(u'format') or PyJs_Object_581_)) + var.get(u"this").put(u'_buf', var.get(u'_buffer2').get(u'default').create(var.get(u'map'))) + var.get(u"this").put(u'_whitespace', (var.get(u'_whitespace2').get(u'default').create(var.get(u'tokens')) if (var.get(u'tokens').get(u'length')>Js(0.0)) else var.get(u"null"))) + PyJsHoisted_Printer_.func_name = u'Printer' + var.put(u'Printer', PyJsHoisted_Printer_) + pass + @Js + def PyJs_generate_582_(ast, this, arguments, var=var): + var = Scope({u'this':this, u'generate':PyJs_generate_582_, u'arguments':arguments, u'ast':ast}, var) + var.registers([u'ast']) + var.get(u"this").callprop(u'print', var.get(u'ast')) + var.get(u"this").callprop(u'_maybeAddAuxComment') + return var.get(u"this").get(u'_buf').callprop(u'get') + PyJs_generate_582_._set_name(u'generate') + var.get(u'Printer').get(u'prototype').put(u'generate', PyJs_generate_582_) + @Js + def PyJs_indent_583_(this, arguments, var=var): + var = Scope({u'this':this, u'indent':PyJs_indent_583_, u'arguments':arguments}, var) + var.registers([]) + if (var.get(u"this").get(u'format').get(u'compact') or var.get(u"this").get(u'format').get(u'concise')): + return var.get('undefined') + (var.get(u"this").put(u'_indent',Js(var.get(u"this").get(u'_indent').to_number())+Js(1))-Js(1)) + PyJs_indent_583_._set_name(u'indent') + var.get(u'Printer').get(u'prototype').put(u'indent', PyJs_indent_583_) + @Js + def PyJs_dedent_584_(this, arguments, var=var): + var = Scope({u'this':this, u'dedent':PyJs_dedent_584_, u'arguments':arguments}, var) + var.registers([]) + if (var.get(u"this").get(u'format').get(u'compact') or var.get(u"this").get(u'format').get(u'concise')): + return var.get('undefined') + (var.get(u"this").put(u'_indent',Js(var.get(u"this").get(u'_indent').to_number())-Js(1))+Js(1)) + PyJs_dedent_584_._set_name(u'dedent') + var.get(u'Printer').get(u'prototype').put(u'dedent', PyJs_dedent_584_) + @Js + def PyJs_semicolon_585_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'semicolon':PyJs_semicolon_585_}, var) + var.registers([u'force']) + var.put(u'force', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else Js(False))) + var.get(u"this").callprop(u'_maybeAddAuxComment') + var.get(u"this").callprop(u'_append', Js(u';'), var.get(u'force').neg()) + PyJs_semicolon_585_._set_name(u'semicolon') + var.get(u'Printer').get(u'prototype').put(u'semicolon', PyJs_semicolon_585_) + @Js + def PyJs_rightBrace_586_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'rightBrace':PyJs_rightBrace_586_}, var) + var.registers([]) + if var.get(u"this").get(u'format').get(u'minified'): + var.get(u"this").get(u'_buf').callprop(u'removeLastSemicolon') + var.get(u"this").callprop(u'token', Js(u'}')) + PyJs_rightBrace_586_._set_name(u'rightBrace') + var.get(u'Printer').get(u'prototype').put(u'rightBrace', PyJs_rightBrace_586_) + @Js + def PyJs_space_587_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'space':PyJs_space_587_}, var) + var.registers([u'force']) + var.put(u'force', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else Js(False))) + if var.get(u"this").get(u'format').get(u'compact'): + return var.get('undefined') + if (((var.get(u"this").get(u'_buf').callprop(u'hasContent') and var.get(u"this").callprop(u'endsWith', Js(u' ')).neg()) and var.get(u"this").callprop(u'endsWith', Js(u'\n')).neg()) or var.get(u'force')): + var.get(u"this").callprop(u'_space') + PyJs_space_587_._set_name(u'space') + var.get(u'Printer').get(u'prototype').put(u'space', PyJs_space_587_) + @Js + def PyJs_word_588_(str, this, arguments, var=var): + var = Scope({u'this':this, u'word':PyJs_word_588_, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + if var.get(u"this").get(u'_endsWithWord'): + var.get(u"this").callprop(u'_space') + var.get(u"this").callprop(u'_maybeAddAuxComment') + var.get(u"this").callprop(u'_append', var.get(u'str')) + var.get(u"this").put(u'_endsWithWord', var.get(u'true')) + PyJs_word_588_._set_name(u'word') + var.get(u'Printer').get(u'prototype').put(u'word', PyJs_word_588_) + @Js + def PyJs_number_589_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str, u'number':PyJs_number_589_}, var) + var.registers([u'str']) + var.get(u"this").callprop(u'word', var.get(u'str')) + def PyJs_LONG_590_(var=var): + return ((((PyJsComma(Js(0.0),var.get(u'_isInteger2').get(u'default'))((+var.get(u'str'))) and var.get(u'NON_DECIMAL_LITERAL').callprop(u'test', var.get(u'str')).neg()) and var.get(u'SCIENTIFIC_NOTATION').callprop(u'test', var.get(u'str')).neg()) and var.get(u'ZERO_DECIMAL_INTEGER').callprop(u'test', var.get(u'str')).neg()) and PyJsStrictNeq(var.get(u'str').get((var.get(u'str').get(u'length')-Js(1.0))),Js(u'.'))) + var.get(u"this").put(u'_endsWithInteger', PyJs_LONG_590_()) + PyJs_number_589_._set_name(u'number') + var.get(u'Printer').get(u'prototype').put(u'number', PyJs_number_589_) + @Js + def PyJs_token_591_(str, this, arguments, var=var): + var = Scope({u'this':this, u'token':PyJs_token_591_, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + def PyJs_LONG_592_(var=var): + return ((((PyJsStrictEq(var.get(u'str'),Js(u'--')) and var.get(u"this").callprop(u'endsWith', Js(u'!'))) or (PyJsStrictEq(var.get(u'str').get(u'0'),Js(u'+')) and var.get(u"this").callprop(u'endsWith', Js(u'+')))) or (PyJsStrictEq(var.get(u'str').get(u'0'),Js(u'-')) and var.get(u"this").callprop(u'endsWith', Js(u'-')))) or (PyJsStrictEq(var.get(u'str').get(u'0'),Js(u'.')) and var.get(u"this").get(u'_endsWithInteger'))) + if PyJs_LONG_592_(): + var.get(u"this").callprop(u'_space') + var.get(u"this").callprop(u'_maybeAddAuxComment') + var.get(u"this").callprop(u'_append', var.get(u'str')) + PyJs_token_591_._set_name(u'token') + var.get(u'Printer').get(u'prototype').put(u'token', PyJs_token_591_) + @Js + def PyJs_newline_593_(i, this, arguments, var=var): + var = Scope({u'i':i, u'this':this, u'newline':PyJs_newline_593_, u'arguments':arguments}, var) + var.registers([u'i', u'j']) + if (var.get(u"this").get(u'format').get(u'retainLines') or var.get(u"this").get(u'format').get(u'compact')): + return var.get('undefined') + if var.get(u"this").get(u'format').get(u'concise'): + var.get(u"this").callprop(u'space') + return var.get('undefined') + if var.get(u"this").callprop(u'endsWith', Js(u'\n\n')): + return var.get('undefined') + if PyJsStrictNeq(var.get(u'i',throw=False).typeof(),Js(u'number')): + var.put(u'i', Js(1.0)) + var.put(u'i', var.get(u'Math').callprop(u'min', Js(2.0), var.get(u'i'))) + if (var.get(u"this").callprop(u'endsWith', Js(u'{\n')) or var.get(u"this").callprop(u'endsWith', Js(u':\n'))): + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + if (var.get(u'i')<=Js(0.0)): + return var.get('undefined') + #for JS loop + var.put(u'j', Js(0.0)) + while (var.get(u'j')<var.get(u'i')): + try: + var.get(u"this").callprop(u'_newline') + finally: + (var.put(u'j',Js(var.get(u'j').to_number())+Js(1))-Js(1)) + PyJs_newline_593_._set_name(u'newline') + var.get(u'Printer').get(u'prototype').put(u'newline', PyJs_newline_593_) + @Js + def PyJs_endsWith_594_(str, this, arguments, var=var): + var = Scope({u'this':this, u'endsWith':PyJs_endsWith_594_, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return var.get(u"this").get(u'_buf').callprop(u'endsWith', var.get(u'str')) + PyJs_endsWith_594_._set_name(u'endsWith') + var.get(u'Printer').get(u'prototype').put(u'endsWith', PyJs_endsWith_594_) + @Js + def PyJs_removeTrailingNewline_595_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'removeTrailingNewline':PyJs_removeTrailingNewline_595_}, var) + var.registers([]) + var.get(u"this").get(u'_buf').callprop(u'removeTrailingNewline') + PyJs_removeTrailingNewline_595_._set_name(u'removeTrailingNewline') + var.get(u'Printer').get(u'prototype').put(u'removeTrailingNewline', PyJs_removeTrailingNewline_595_) + @Js + def PyJs_source_596_(prop, loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'source':PyJs_source_596_, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'loc', u'prop']) + var.get(u"this").callprop(u'_catchUp', var.get(u'prop'), var.get(u'loc')) + var.get(u"this").get(u'_buf').callprop(u'source', var.get(u'prop'), var.get(u'loc')) + PyJs_source_596_._set_name(u'source') + var.get(u'Printer').get(u'prototype').put(u'source', PyJs_source_596_) + @Js + def PyJs_withSource_597_(prop, loc, cb, this, arguments, var=var): + var = Scope({u'loc':loc, u'this':this, u'cb':cb, u'prop':prop, u'withSource':PyJs_withSource_597_, u'arguments':arguments}, var) + var.registers([u'loc', u'cb', u'prop']) + var.get(u"this").callprop(u'_catchUp', var.get(u'prop'), var.get(u'loc')) + var.get(u"this").get(u'_buf').callprop(u'withSource', var.get(u'prop'), var.get(u'loc'), var.get(u'cb')) + PyJs_withSource_597_._set_name(u'withSource') + var.get(u'Printer').get(u'prototype').put(u'withSource', PyJs_withSource_597_) + @Js + def PyJs__space_598_(this, arguments, var=var): + var = Scope({u'this':this, u'_space':PyJs__space_598_, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'_append', Js(u' '), var.get(u'true')) + PyJs__space_598_._set_name(u'_space') + var.get(u'Printer').get(u'prototype').put(u'_space', PyJs__space_598_) + @Js + def PyJs__newline_599_(this, arguments, var=var): + var = Scope({u'this':this, u'_newline':PyJs__newline_599_, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'_append', Js(u'\n'), var.get(u'true')) + PyJs__newline_599_._set_name(u'_newline') + var.get(u'Printer').get(u'prototype').put(u'_newline', PyJs__newline_599_) + @Js + def PyJs__append_600_(str, this, arguments, var=var): + var = Scope({u'this':this, u'_append':PyJs__append_600_, u'arguments':arguments, u'str':str}, var) + var.registers([u'queue', u'str']) + var.put(u'queue', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js(False))) + var.get(u"this").callprop(u'_maybeAddParen', var.get(u'str')) + var.get(u"this").callprop(u'_maybeIndent', var.get(u'str')) + if var.get(u'queue'): + var.get(u"this").get(u'_buf').callprop(u'queue', var.get(u'str')) + else: + var.get(u"this").get(u'_buf').callprop(u'append', var.get(u'str')) + var.get(u"this").put(u'_endsWithWord', Js(False)) + var.get(u"this").put(u'_endsWithInteger', Js(False)) + PyJs__append_600_._set_name(u'_append') + var.get(u'Printer').get(u'prototype').put(u'_append', PyJs__append_600_) + @Js + def PyJs__maybeIndent_601_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str, u'_maybeIndent':PyJs__maybeIndent_601_}, var) + var.registers([u'str']) + if ((var.get(u"this").get(u'_indent') and var.get(u"this").callprop(u'endsWith', Js(u'\n'))) and PyJsStrictNeq(var.get(u'str').get(u'0'),Js(u'\n'))): + var.get(u"this").get(u'_buf').callprop(u'queue', var.get(u"this").callprop(u'_getIndent')) + PyJs__maybeIndent_601_._set_name(u'_maybeIndent') + var.get(u'Printer').get(u'prototype').put(u'_maybeIndent', PyJs__maybeIndent_601_) + @Js + def PyJs__maybeAddParen_602_(str, this, arguments, var=var): + var = Scope({u'this':this, u'_maybeAddParen':PyJs__maybeAddParen_602_, u'arguments':arguments, u'str':str}, var) + var.registers([u'i', u'cha', u'str', u'parenPushNewlineState']) + var.put(u'parenPushNewlineState', var.get(u"this").get(u'_parenPushNewlineState')) + if var.get(u'parenPushNewlineState').neg(): + return var.get('undefined') + var.get(u"this").put(u'_parenPushNewlineState', var.get(u"null")) + var.put(u'i', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'i', Js(0.0)) + while ((var.get(u'i')<var.get(u'str').get(u'length')) and PyJsStrictEq(var.get(u'str').get(var.get(u'i')),Js(u' '))): + try: + continue + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + if PyJsStrictEq(var.get(u'i'),var.get(u'str').get(u'length')): + return var.get('undefined') + var.put(u'cha', var.get(u'str').get(var.get(u'i'))) + if (PyJsStrictEq(var.get(u'cha'),Js(u'\n')) or PyJsStrictEq(var.get(u'cha'),Js(u'/'))): + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'indent') + var.get(u'parenPushNewlineState').put(u'printed', var.get(u'true')) + PyJs__maybeAddParen_602_._set_name(u'_maybeAddParen') + var.get(u'Printer').get(u'prototype').put(u'_maybeAddParen', PyJs__maybeAddParen_602_) + @Js + def PyJs__catchUp_603_(prop, loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'_catchUp':PyJs__catchUp_603_, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'count', u'i', u'loc', u'pos', u'prop']) + if var.get(u"this").get(u'format').get(u'retainLines').neg(): + return var.get('undefined') + var.put(u'pos', (var.get(u'loc').get(var.get(u'prop')) if var.get(u'loc') else var.get(u"null"))) + if (var.get(u'pos') and PyJsStrictNeq(var.get(u'pos').get(u'line'),var.get(u"null"))): + var.put(u'count', (var.get(u'pos').get(u'line')-var.get(u"this").get(u'_buf').callprop(u'getCurrentLine'))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'count')): + try: + var.get(u"this").callprop(u'_newline') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJs__catchUp_603_._set_name(u'_catchUp') + var.get(u'Printer').get(u'prototype').put(u'_catchUp', PyJs__catchUp_603_) + @Js + def PyJs__getIndent_604_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'_getIndent':PyJs__getIndent_604_}, var) + var.registers([]) + return PyJsComma(Js(0.0),var.get(u'_repeat2').get(u'default'))(var.get(u"this").get(u'format').get(u'indent').get(u'style'), var.get(u"this").get(u'_indent')) + PyJs__getIndent_604_._set_name(u'_getIndent') + var.get(u'Printer').get(u'prototype').put(u'_getIndent', PyJs__getIndent_604_) + @Js + def PyJs_startTerminatorless_605_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'startTerminatorless':PyJs_startTerminatorless_605_}, var) + var.registers([]) + PyJs_Object_606_ = Js({u'printed':Js(False)}) + return var.get(u"this").put(u'_parenPushNewlineState', PyJs_Object_606_) + PyJs_startTerminatorless_605_._set_name(u'startTerminatorless') + var.get(u'Printer').get(u'prototype').put(u'startTerminatorless', PyJs_startTerminatorless_605_) + @Js + def PyJs_endTerminatorless_607_(state, this, arguments, var=var): + var = Scope({u'this':this, u'state':state, u'endTerminatorless':PyJs_endTerminatorless_607_, u'arguments':arguments}, var) + var.registers([u'state']) + if var.get(u'state').get(u'printed'): + var.get(u"this").callprop(u'dedent') + var.get(u"this").callprop(u'newline') + var.get(u"this").callprop(u'token', Js(u')')) + PyJs_endTerminatorless_607_._set_name(u'endTerminatorless') + var.get(u'Printer').get(u'prototype').put(u'endTerminatorless', PyJs_endTerminatorless_607_) + @Js + def PyJs_InlineNonPyName_608_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'print':PyJs_InlineNonPyName_608_, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'loc', u'needsParens', u'parent', u'_this', u'printMethod', u'oldInAux', u'oldConcise']) + var.put(u'_this', var.get(u"this")) + if var.get(u'node').neg(): + return var.get('undefined') + var.put(u'oldConcise', var.get(u"this").get(u'format').get(u'concise')) + if var.get(u'node').get(u'_compact'): + var.get(u"this").get(u'format').put(u'concise', var.get(u'true')) + var.put(u'printMethod', var.get(u"this").get(var.get(u'node').get(u'type'))) + if var.get(u'printMethod').neg(): + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create((((Js(u'unknown node of type ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'node').get(u'type')))+Js(u' with constructor '))+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))((var.get(u'node') and var.get(u'node').get(u'constructor').get(u'name')))))) + raise PyJsTempException + var.get(u"this").get(u'_printStack').callprop(u'push', var.get(u'node')) + var.put(u'oldInAux', var.get(u"this").get(u'_insideAux')) + var.get(u"this").put(u'_insideAux', var.get(u'node').get(u'loc').neg()) + var.get(u"this").callprop(u'_maybeAddAuxComment', (var.get(u"this").get(u'_insideAux') and var.get(u'oldInAux').neg())) + var.put(u'needsParens', var.get(u'n').callprop(u'needsParens', var.get(u'node'), var.get(u'parent'), var.get(u"this").get(u'_printStack'))) + if (((var.get(u"this").get(u'format').get(u'retainFunctionParens') and PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'FunctionExpression'))) and var.get(u'node').get(u'extra')) and var.get(u'node').get(u'extra').get(u'parenthesized')): + var.put(u'needsParens', var.get(u'true')) + if var.get(u'needsParens'): + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'_printLeadingComments', var.get(u'node'), var.get(u'parent')) + var.put(u'loc', (var.get(u"null") if (var.get(u't').callprop(u'isProgram', var.get(u'node')) or var.get(u't').callprop(u'isFile', var.get(u'node'))) else var.get(u'node').get(u'loc'))) + @Js + def PyJs_anonymous_609_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'_this').callprop(var.get(u'node').get(u'type'), var.get(u'node'), var.get(u'parent')) + PyJs_anonymous_609_._set_name(u'anonymous') + var.get(u"this").callprop(u'withSource', Js(u'start'), var.get(u'loc'), PyJs_anonymous_609_) + var.get(u"this").callprop(u'_printTrailingComments', var.get(u'node'), var.get(u'parent')) + if var.get(u'needsParens'): + var.get(u"this").callprop(u'token', Js(u')')) + var.get(u"this").get(u'_printStack').callprop(u'pop') + var.get(u"this").get(u'format').put(u'concise', var.get(u'oldConcise')) + var.get(u"this").put(u'_insideAux', var.get(u'oldInAux')) + PyJs_InlineNonPyName_608_._set_name(u'print') + var.get(u'Printer').get(u'prototype').put(u'print', PyJs_InlineNonPyName_608_) + @Js + def PyJs__maybeAddAuxComment_610_(enteredPositionlessNode, this, arguments, var=var): + var = Scope({u'enteredPositionlessNode':enteredPositionlessNode, u'this':this, u'_maybeAddAuxComment':PyJs__maybeAddAuxComment_610_, u'arguments':arguments}, var) + var.registers([u'enteredPositionlessNode']) + if var.get(u'enteredPositionlessNode'): + var.get(u"this").callprop(u'_printAuxBeforeComment') + if var.get(u"this").get(u'_insideAux').neg(): + var.get(u"this").callprop(u'_printAuxAfterComment') + PyJs__maybeAddAuxComment_610_._set_name(u'_maybeAddAuxComment') + var.get(u'Printer').get(u'prototype').put(u'_maybeAddAuxComment', PyJs__maybeAddAuxComment_610_) + @Js + def PyJs__printAuxBeforeComment_611_(this, arguments, var=var): + var = Scope({u'this':this, u'_printAuxBeforeComment':PyJs__printAuxBeforeComment_611_, u'arguments':arguments}, var) + var.registers([u'comment']) + if var.get(u"this").get(u'_printAuxAfterOnNextUserNode'): + return var.get('undefined') + var.get(u"this").put(u'_printAuxAfterOnNextUserNode', var.get(u'true')) + var.put(u'comment', var.get(u"this").get(u'format').get(u'auxiliaryCommentBefore')) + if var.get(u'comment'): + PyJs_Object_612_ = Js({u'type':Js(u'CommentBlock'),u'value':var.get(u'comment')}) + var.get(u"this").callprop(u'_printComment', PyJs_Object_612_) + PyJs__printAuxBeforeComment_611_._set_name(u'_printAuxBeforeComment') + var.get(u'Printer').get(u'prototype').put(u'_printAuxBeforeComment', PyJs__printAuxBeforeComment_611_) + @Js + def PyJs__printAuxAfterComment_613_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'_printAuxAfterComment':PyJs__printAuxAfterComment_613_}, var) + var.registers([u'comment']) + if var.get(u"this").get(u'_printAuxAfterOnNextUserNode').neg(): + return var.get('undefined') + var.get(u"this").put(u'_printAuxAfterOnNextUserNode', Js(False)) + var.put(u'comment', var.get(u"this").get(u'format').get(u'auxiliaryCommentAfter')) + if var.get(u'comment'): + PyJs_Object_614_ = Js({u'type':Js(u'CommentBlock'),u'value':var.get(u'comment')}) + var.get(u"this").callprop(u'_printComment', PyJs_Object_614_) + PyJs__printAuxAfterComment_613_._set_name(u'_printAuxAfterComment') + var.get(u'Printer').get(u'prototype').put(u'_printAuxAfterComment', PyJs__printAuxAfterComment_613_) + @Js + def PyJs_getPossibleRaw_615_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'getPossibleRaw':PyJs_getPossibleRaw_615_}, var) + var.registers([u'node', u'extra']) + if var.get(u"this").get(u'format').get(u'minified'): + return var.get('undefined') + var.put(u'extra', var.get(u'node').get(u'extra')) + if (((var.get(u'extra') and (var.get(u'extra').get(u'raw')!=var.get(u"null"))) and (var.get(u'extra').get(u'rawValue')!=var.get(u"null"))) and PyJsStrictEq(var.get(u'node').get(u'value'),var.get(u'extra').get(u'rawValue'))): + return var.get(u'extra').get(u'raw') + PyJs_getPossibleRaw_615_._set_name(u'getPossibleRaw') + var.get(u'Printer').get(u'prototype').put(u'getPossibleRaw', PyJs_getPossibleRaw_615_) + @Js + def PyJs_printJoin_616_(nodes, parent, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'printJoin':PyJs_printJoin_616_, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent', u'i', u'newlineOpts', u'nodes', u'opts']) + PyJs_Object_617_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else PyJs_Object_617_)) + if (var.get(u'nodes').neg() or var.get(u'nodes').get(u'length').neg()): + return var.get('undefined') + if var.get(u'opts').get(u'indent'): + var.get(u"this").callprop(u'indent') + PyJs_Object_618_ = Js({u'addNewlines':var.get(u'opts').get(u'addNewlines')}) + var.put(u'newlineOpts', PyJs_Object_618_) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'nodes').get(u'length')): + try: + var.put(u'node', var.get(u'nodes').get(var.get(u'i'))) + if var.get(u'node').neg(): + continue + if var.get(u'opts').get(u'statement'): + var.get(u"this").callprop(u'_printNewline', var.get(u'true'), var.get(u'node'), var.get(u'parent'), var.get(u'newlineOpts')) + var.get(u"this").callprop(u'print', var.get(u'node'), var.get(u'parent')) + if var.get(u'opts').get(u'iterator'): + var.get(u'opts').callprop(u'iterator', var.get(u'node'), var.get(u'i')) + if (var.get(u'opts').get(u'separator') and (var.get(u'i')<(var.get(u'nodes').get(u'length')-Js(1.0)))): + var.get(u'opts').get(u'separator').callprop(u'call', var.get(u"this")) + if var.get(u'opts').get(u'statement'): + var.get(u"this").callprop(u'_printNewline', Js(False), var.get(u'node'), var.get(u'parent'), var.get(u'newlineOpts')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + if var.get(u'opts').get(u'indent'): + var.get(u"this").callprop(u'dedent') + PyJs_printJoin_616_._set_name(u'printJoin') + var.get(u'Printer').get(u'prototype').put(u'printJoin', PyJs_printJoin_616_) + @Js + def PyJs_printAndIndentOnComments_619_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'printAndIndentOnComments':PyJs_printAndIndentOnComments_619_, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'indent', u'parent']) + var.put(u'indent', var.get(u'node').get(u'leadingComments').neg().neg()) + if var.get(u'indent'): + var.get(u"this").callprop(u'indent') + var.get(u"this").callprop(u'print', var.get(u'node'), var.get(u'parent')) + if var.get(u'indent'): + var.get(u"this").callprop(u'dedent') + PyJs_printAndIndentOnComments_619_._set_name(u'printAndIndentOnComments') + var.get(u'Printer').get(u'prototype').put(u'printAndIndentOnComments', PyJs_printAndIndentOnComments_619_) + @Js + def PyJs_printBlock_620_(parent, this, arguments, var=var): + var = Scope({u'this':this, u'printBlock':PyJs_printBlock_620_, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + var.put(u'node', var.get(u'parent').get(u'body')) + if var.get(u't').callprop(u'isEmptyStatement', var.get(u'node')).neg(): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node'), var.get(u'parent')) + PyJs_printBlock_620_._set_name(u'printBlock') + var.get(u'Printer').get(u'prototype').put(u'printBlock', PyJs_printBlock_620_) + @Js + def PyJs__printTrailingComments_621_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'_printTrailingComments':PyJs__printTrailingComments_621_, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + var.get(u"this").callprop(u'_printComments', var.get(u"this").callprop(u'_getComments', Js(False), var.get(u'node'), var.get(u'parent'))) + PyJs__printTrailingComments_621_._set_name(u'_printTrailingComments') + var.get(u'Printer').get(u'prototype').put(u'_printTrailingComments', PyJs__printTrailingComments_621_) + @Js + def PyJs__printLeadingComments_622_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent, u'_printLeadingComments':PyJs__printLeadingComments_622_}, var) + var.registers([u'node', u'parent']) + var.get(u"this").callprop(u'_printComments', var.get(u"this").callprop(u'_getComments', var.get(u'true'), var.get(u'node'), var.get(u'parent'))) + PyJs__printLeadingComments_622_._set_name(u'_printLeadingComments') + var.get(u'Printer').get(u'prototype').put(u'_printLeadingComments', PyJs__printLeadingComments_622_) + @Js + def PyJs_printInnerComments_623_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'printInnerComments':PyJs_printInnerComments_623_, u'arguments':arguments}, var) + var.registers([u'node', u'indent']) + var.put(u'indent', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else var.get(u'true'))) + if var.get(u'node').get(u'innerComments').neg(): + return var.get('undefined') + if var.get(u'indent'): + var.get(u"this").callprop(u'indent') + var.get(u"this").callprop(u'_printComments', var.get(u'node').get(u'innerComments')) + if var.get(u'indent'): + var.get(u"this").callprop(u'dedent') + PyJs_printInnerComments_623_._set_name(u'printInnerComments') + var.get(u'Printer').get(u'prototype').put(u'printInnerComments', PyJs_printInnerComments_623_) + @Js + def PyJs_printSequence_624_(nodes, parent, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments, u'parent':parent, u'printSequence':PyJs_printSequence_624_}, var) + var.registers([u'nodes', u'parent', u'opts']) + PyJs_Object_625_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else PyJs_Object_625_)) + var.get(u'opts').put(u'statement', var.get(u'true')) + return var.get(u"this").callprop(u'printJoin', var.get(u'nodes'), var.get(u'parent'), var.get(u'opts')) + PyJs_printSequence_624_._set_name(u'printSequence') + var.get(u'Printer').get(u'prototype').put(u'printSequence', PyJs_printSequence_624_) + @Js + def PyJs_printList_626_(items, parent, this, arguments, var=var): + var = Scope({u'this':this, u'items':items, u'printList':PyJs_printList_626_, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'items', u'parent', u'opts']) + PyJs_Object_627_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else PyJs_Object_627_)) + if (var.get(u'opts').get(u'separator')==var.get(u"null")): + var.get(u'opts').put(u'separator', var.get(u'commaSeparator')) + return var.get(u"this").callprop(u'printJoin', var.get(u'items'), var.get(u'parent'), var.get(u'opts')) + PyJs_printList_626_._set_name(u'printList') + var.get(u'Printer').get(u'prototype').put(u'printList', PyJs_printList_626_) + @Js + def PyJs__printNewline_628_(leading, node, parent, opts, this, arguments, var=var): + var = Scope({u'node':node, u'_printNewline':PyJs__printNewline_628_, u'arguments':arguments, u'parent':parent, u'this':this, u'leading':leading, u'opts':opts}, var) + var.registers([u'node', u'needs', u'parent', u'_comments2', u'leading', u'_comment', u'lines', u'_this2', u'_comments', u'_comment2', u'opts']) + var.put(u'_this2', var.get(u"this")) + if (var.get(u"this").get(u'format').get(u'retainLines') or var.get(u"this").get(u'format').get(u'compact')): + return var.get('undefined') + if var.get(u"this").get(u'format').get(u'concise'): + var.get(u"this").callprop(u'space') + return var.get('undefined') + var.put(u'lines', Js(0.0)) + if (((var.get(u'node').get(u'start')!=var.get(u"null")) and var.get(u'node').get(u'_ignoreUserWhitespace').neg()) and var.get(u"this").get(u'_whitespace')): + if var.get(u'leading'): + var.put(u'_comments', var.get(u'node').get(u'leadingComments')) + @Js + def PyJs_anonymous_629_(comment, this, arguments, var=var): + var = Scope({u'comment':comment, u'this':this, u'arguments':arguments}, var) + var.registers([u'comment']) + return (var.get(u'comment').get(u'loc').neg().neg() and var.get(u'_this2').get(u'format').callprop(u'shouldPrintComment', var.get(u'comment').get(u'value'))) + PyJs_anonymous_629_._set_name(u'anonymous') + var.put(u'_comment', (var.get(u'_comments') and PyJsComma(Js(0.0),var.get(u'_find2').get(u'default'))(var.get(u'_comments'), PyJs_anonymous_629_))) + var.put(u'lines', var.get(u"this").get(u'_whitespace').callprop(u'getNewlinesBefore', (var.get(u'_comment') or var.get(u'node')))) + else: + var.put(u'_comments2', var.get(u'node').get(u'trailingComments')) + @Js + def PyJs_anonymous_630_(comment, this, arguments, var=var): + var = Scope({u'comment':comment, u'this':this, u'arguments':arguments}, var) + var.registers([u'comment']) + return (var.get(u'comment').get(u'loc').neg().neg() and var.get(u'_this2').get(u'format').callprop(u'shouldPrintComment', var.get(u'comment').get(u'value'))) + PyJs_anonymous_630_._set_name(u'anonymous') + var.put(u'_comment2', (var.get(u'_comments2') and PyJsComma(Js(0.0),var.get(u'_findLast2').get(u'default'))(var.get(u'_comments2'), PyJs_anonymous_630_))) + var.put(u'lines', var.get(u"this").get(u'_whitespace').callprop(u'getNewlinesAfter', (var.get(u'_comment2') or var.get(u'node')))) + else: + if var.get(u'leading').neg(): + (var.put(u'lines',Js(var.get(u'lines').to_number())+Js(1))-Js(1)) + if var.get(u'opts').get(u'addNewlines'): + var.put(u'lines', (var.get(u'opts').callprop(u'addNewlines', var.get(u'leading'), var.get(u'node')) or Js(0.0)), u'+') + var.put(u'needs', var.get(u'n').get(u'needsWhitespaceAfter')) + if var.get(u'leading'): + var.put(u'needs', var.get(u'n').get(u'needsWhitespaceBefore')) + if var.get(u'needs')(var.get(u'node'), var.get(u'parent')): + (var.put(u'lines',Js(var.get(u'lines').to_number())+Js(1))-Js(1)) + if var.get(u"this").get(u'_buf').callprop(u'hasContent').neg(): + var.put(u'lines', Js(0.0)) + var.get(u"this").callprop(u'newline', var.get(u'lines')) + PyJs__printNewline_628_._set_name(u'_printNewline') + var.get(u'Printer').get(u'prototype').put(u'_printNewline', PyJs__printNewline_628_) + @Js + def PyJs__getComments_631_(leading, node, this, arguments, var=var): + var = Scope({u'node':node, u'leading':leading, u'this':this, u'arguments':arguments, u'_getComments':PyJs__getComments_631_}, var) + var.registers([u'node', u'leading']) + return ((var.get(u'node') and (var.get(u'node').get(u'leadingComments') if var.get(u'leading') else var.get(u'node').get(u'trailingComments'))) or Js([])) + PyJs__getComments_631_._set_name(u'_getComments') + var.get(u'Printer').get(u'prototype').put(u'_getComments', PyJs__getComments_631_) + @Js + def PyJs__printComment_632_(comment, this, arguments, var=var): + var = Scope({u'comment':comment, u'this':this, u'_printComment':PyJs__printComment_632_, u'arguments':arguments}, var) + var.registers([u'comment', u'val', u'indentSize', u'newlineRegex', u'offset', u'_this3']) + var.put(u'_this3', var.get(u"this")) + if var.get(u"this").get(u'format').callprop(u'shouldPrintComment', var.get(u'comment').get(u'value')).neg(): + return var.get('undefined') + if var.get(u'comment').get(u'ignore'): + return var.get('undefined') + if var.get(u"this").get(u'_printedComments').callprop(u'has', var.get(u'comment')): + return var.get('undefined') + var.get(u"this").get(u'_printedComments').callprop(u'add', var.get(u'comment')) + if (var.get(u'comment').get(u'start')!=var.get(u"null")): + if var.get(u"this").get(u'_printedCommentStarts').get(var.get(u'comment').get(u'start')): + return var.get('undefined') + var.get(u"this").get(u'_printedCommentStarts').put(var.get(u'comment').get(u'start'), var.get(u'true')) + var.get(u"this").callprop(u'newline', (var.get(u"this").get(u'_whitespace').callprop(u'getNewlinesBefore', var.get(u'comment')) if var.get(u"this").get(u'_whitespace') else Js(0.0))) + if (var.get(u"this").callprop(u'endsWith', Js(u'[')).neg() and var.get(u"this").callprop(u'endsWith', Js(u'{')).neg()): + var.get(u"this").callprop(u'space') + var.put(u'val', (((Js(u'//')+var.get(u'comment').get(u'value'))+Js(u'\n')) if PyJsStrictEq(var.get(u'comment').get(u'type'),Js(u'CommentLine')) else ((Js(u'/*')+var.get(u'comment').get(u'value'))+Js(u'*/')))) + if (PyJsStrictEq(var.get(u'comment').get(u'type'),Js(u'CommentBlock')) and var.get(u"this").get(u'format').get(u'indent').get(u'adjustMultilineComment')): + var.put(u'offset', (var.get(u'comment').get(u'loc') and var.get(u'comment').get(u'loc').get(u'start').get(u'column'))) + if var.get(u'offset'): + var.put(u'newlineRegex', var.get(u'RegExp').create(((Js(u'\\n\\s{1,')+var.get(u'offset'))+Js(u'}')), Js(u'g'))) + var.put(u'val', var.get(u'val').callprop(u'replace', var.get(u'newlineRegex'), Js(u'\n'))) + var.put(u'indentSize', var.get(u'Math').callprop(u'max', var.get(u"this").callprop(u'_getIndent').get(u'length'), var.get(u"this").get(u'_buf').callprop(u'getCurrentColumn'))) + var.put(u'val', var.get(u'val').callprop(u'replace', JsRegExp(u'/\\n(?!$)/g'), (Js(u'\n')+PyJsComma(Js(0.0),var.get(u'_repeat2').get(u'default'))(Js(u' '), var.get(u'indentSize'))))) + @Js + def PyJs_anonymous_633_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'_this3').callprop(u'_append', var.get(u'val')) + PyJs_anonymous_633_._set_name(u'anonymous') + var.get(u"this").callprop(u'withSource', Js(u'start'), var.get(u'comment').get(u'loc'), PyJs_anonymous_633_) + var.get(u"this").callprop(u'newline', ((var.get(u"this").get(u'_whitespace').callprop(u'getNewlinesAfter', var.get(u'comment')) if var.get(u"this").get(u'_whitespace') else Js(0.0))+((-Js(1.0)) if PyJsStrictEq(var.get(u'comment').get(u'type'),Js(u'CommentLine')) else Js(0.0)))) + PyJs__printComment_632_._set_name(u'_printComment') + var.get(u'Printer').get(u'prototype').put(u'_printComment', PyJs__printComment_632_) + @Js + def PyJs__printComments_634_(comments, this, arguments, var=var): + var = Scope({u'this':this, u'_printComments':PyJs__printComments_634_, u'arguments':arguments, u'comments':comments}, var) + var.registers([u'_isArray', u'_iterator', u'comments', u'_i', u'_ref', u'_comment3']) + if (var.get(u'comments').neg() or var.get(u'comments').get(u'length').neg()): + return var.get('undefined') + #for JS loop + var.put(u'_iterator', var.get(u'comments')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'_comment3', var.get(u'_ref')) + var.get(u"this").callprop(u'_printComment', var.get(u'_comment3')) + + PyJs__printComments_634_._set_name(u'_printComments') + var.get(u'Printer').get(u'prototype').put(u'_printComments', PyJs__printComments_634_) + return var.get(u'Printer') + PyJs_anonymous_579_._set_name(u'anonymous') + var.put(u'Printer', PyJs_anonymous_579_()) + var.get(u'exports').put(u'default', var.get(u'Printer')) + pass + var.put(u'_arr', Js([var.get(u'require')(Js(u'./generators/template-literals')), var.get(u'require')(Js(u'./generators/expressions')), var.get(u'require')(Js(u'./generators/statements')), var.get(u'require')(Js(u'./generators/classes')), var.get(u'require')(Js(u'./generators/methods')), var.get(u'require')(Js(u'./generators/modules')), var.get(u'require')(Js(u'./generators/types')), var.get(u'require')(Js(u'./generators/flow')), var.get(u'require')(Js(u'./generators/base')), var.get(u'require')(Js(u'./generators/jsx'))])) + #for JS loop + var.put(u'_i2', Js(0.0)) + while (var.get(u'_i2')<var.get(u'_arr').get(u'length')): + try: + var.put(u'generator', var.get(u'_arr').get(var.get(u'_i2'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'Printer').get(u'prototype'), var.get(u'generator')) + finally: + (var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_576_._set_name(u'anonymous') +PyJs_Object_635_ = Js({u'./buffer':Js(29.0),u'./generators/base':Js(30.0),u'./generators/classes':Js(31.0),u'./generators/expressions':Js(32.0),u'./generators/flow':Js(33.0),u'./generators/jsx':Js(34.0),u'./generators/methods':Js(35.0),u'./generators/modules':Js(36.0),u'./generators/statements':Js(37.0),u'./generators/template-literals':Js(38.0),u'./generators/types':Js(39.0),u'./node':Js(41.0),u'./whitespace':Js(46.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/json/stringify':Js(97.0),u'babel-runtime/core-js/object/assign':Js(100.0),u'babel-runtime/core-js/weak-set':Js(109.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-types':Js(258.0),u'lodash/find':Js(447.0),u'lodash/findLast':Js(449.0),u'lodash/isInteger':Js(464.0),u'lodash/repeat':Js(483.0)}) +@Js +def PyJs_anonymous_636_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_typeof2', u'_typeof3', u'exports', u'_sourceMap', u'require', u'SourceMap', u'module', u'_keys2', u'_keys', u'_interopRequireDefault', u'_classCallCheck3', u'_classCallCheck2', u'_sourceMap2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_637_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_637_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_keys', var.get(u'require')(Js(u'babel-runtime/core-js/object/keys'))) + var.put(u'_keys2', var.get(u'_interopRequireDefault')(var.get(u'_keys'))) + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_sourceMap', var.get(u'require')(Js(u'source-map'))) + var.put(u'_sourceMap2', var.get(u'_interopRequireDefault')(var.get(u'_sourceMap'))) + pass + @Js + def PyJs_anonymous_638_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'SourceMap']) + @Js + def PyJsHoisted_SourceMap_(opts, code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'code', u'opts', u'_this']) + var.put(u'_this', var.get(u"this")) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'SourceMap')) + var.get(u"this").put(u'_opts', var.get(u'opts')) + PyJs_Object_639_ = Js({u'file':var.get(u'opts').get(u'sourceMapTarget'),u'sourceRoot':var.get(u'opts').get(u'sourceRoot')}) + var.get(u"this").put(u'_map', var.get(u'_sourceMap2').get(u'default').get(u'SourceMapGenerator').create(PyJs_Object_639_)) + if PyJsStrictEq(var.get(u'code',throw=False).typeof(),Js(u'string')): + var.get(u"this").get(u'_map').callprop(u'setSourceContent', var.get(u'opts').get(u'sourceFileName'), var.get(u'code')) + else: + if PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'code',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'code'))),Js(u'object')): + @Js + def PyJs_anonymous_640_(sourceFileName, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'sourceFileName':sourceFileName}, var) + var.registers([u'sourceFileName']) + var.get(u'_this').get(u'_map').callprop(u'setSourceContent', var.get(u'sourceFileName'), var.get(u'code').get(var.get(u'sourceFileName'))) + PyJs_anonymous_640_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'code')).callprop(u'forEach', PyJs_anonymous_640_) + PyJsHoisted_SourceMap_.func_name = u'SourceMap' + var.put(u'SourceMap', PyJsHoisted_SourceMap_) + pass + @Js + def PyJs_get_641_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_641_}, var) + var.registers([]) + return var.get(u"this").get(u'_map').callprop(u'toJSON') + PyJs_get_641_._set_name(u'get') + var.get(u'SourceMap').get(u'prototype').put(u'get', PyJs_get_641_) + @Js + def PyJs_mark_642_(generatedLine, generatedColumn, line, column, identifierName, filename, this, arguments, var=var): + var = Scope({u'generatedColumn':generatedColumn, u'identifierName':identifierName, u'column':column, u'filename':filename, u'this':this, u'generatedLine':generatedLine, u'arguments':arguments, u'line':line, u'mark':PyJs_mark_642_}, var) + var.registers([u'generatedColumn', u'identifierName', u'column', u'filename', u'generatedLine', u'line']) + if (PyJsStrictNeq(var.get(u"this").get(u'_lastGenLine'),var.get(u'generatedLine')) and PyJsStrictEq(var.get(u'line'),var.get(u"null"))): + return var.get('undefined') + if ((PyJsStrictEq(var.get(u"this").get(u'_lastGenLine'),var.get(u'generatedLine')) and PyJsStrictEq(var.get(u"this").get(u'_lastSourceLine'),var.get(u'line'))) and PyJsStrictEq(var.get(u"this").get(u'_lastSourceColumn'),var.get(u'column'))): + return var.get('undefined') + var.get(u"this").put(u'_lastGenLine', var.get(u'generatedLine')) + var.get(u"this").put(u'_lastSourceLine', var.get(u'line')) + var.get(u"this").put(u'_lastSourceColumn', var.get(u'column')) + PyJs_Object_644_ = Js({u'line':var.get(u'generatedLine'),u'column':var.get(u'generatedColumn')}) + PyJs_Object_645_ = Js({u'line':var.get(u'line'),u'column':var.get(u'column')}) + PyJs_Object_643_ = Js({u'name':var.get(u'identifierName'),u'generated':PyJs_Object_644_,u'source':(var.get(u"null") if (var.get(u'line')==var.get(u"null")) else (var.get(u'filename') or var.get(u"this").get(u'_opts').get(u'sourceFileName'))),u'original':(var.get(u"null") if (var.get(u'line')==var.get(u"null")) else PyJs_Object_645_)}) + var.get(u"this").get(u'_map').callprop(u'addMapping', PyJs_Object_643_) + PyJs_mark_642_._set_name(u'mark') + var.get(u'SourceMap').get(u'prototype').put(u'mark', PyJs_mark_642_) + return var.get(u'SourceMap') + PyJs_anonymous_638_._set_name(u'anonymous') + var.put(u'SourceMap', PyJs_anonymous_638_()) + var.get(u'exports').put(u'default', var.get(u'SourceMap')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_636_._set_name(u'anonymous') +PyJs_Object_646_ = Js({u'babel-runtime/core-js/object/keys':Js(103.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-runtime/helpers/typeof':Js(114.0),u'source-map':Js(519.0)}) +@Js +def PyJs_anonymous_647_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'Whitespace', u'require', u'module', u'_interopRequireDefault', u'_classCallCheck3', u'_classCallCheck2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_648_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_648_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + pass + @Js + def PyJs_anonymous_649_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Whitespace']) + @Js + def PyJsHoisted_Whitespace_(tokens, this, arguments, var=var): + var = Scope({u'tokens':tokens, u'this':this, u'arguments':arguments}, var) + var.registers([u'tokens']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Whitespace')) + var.get(u"this").put(u'tokens', var.get(u'tokens')) + PyJs_Object_650_ = Js({}) + var.get(u"this").put(u'used', PyJs_Object_650_) + PyJsHoisted_Whitespace_.func_name = u'Whitespace' + var.put(u'Whitespace', PyJsHoisted_Whitespace_) + pass + @Js + def PyJs_getNewlinesBefore_651_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'getNewlinesBefore':PyJs_getNewlinesBefore_651_}, var) + var.registers([u'tokens', u'startToken', u'node', u'endToken', u'index']) + var.put(u'startToken', PyJsComma(Js(0.0), Js(None))) + var.put(u'endToken', PyJsComma(Js(0.0), Js(None))) + var.put(u'tokens', var.get(u"this").get(u'tokens')) + @Js + def PyJs_anonymous_652_(token, this, arguments, var=var): + var = Scope({u'this':this, u'token':token, u'arguments':arguments}, var) + var.registers([u'token']) + return (var.get(u'token').get(u'start')-var.get(u'node').get(u'start')) + PyJs_anonymous_652_._set_name(u'anonymous') + var.put(u'index', var.get(u"this").callprop(u'_findToken', PyJs_anonymous_652_, Js(0.0), var.get(u'tokens').get(u'length'))) + if (var.get(u'index')>=Js(0.0)): + while (var.get(u'index') and PyJsStrictEq(var.get(u'node').get(u'start'),var.get(u'tokens').get((var.get(u'index')-Js(1.0))).get(u'start'))): + var.put(u'index',Js(var.get(u'index').to_number())-Js(1)) + var.put(u'startToken', var.get(u'tokens').get((var.get(u'index')-Js(1.0)))) + var.put(u'endToken', var.get(u'tokens').get(var.get(u'index'))) + return var.get(u"this").callprop(u'_getNewlinesBetween', var.get(u'startToken'), var.get(u'endToken')) + PyJs_getNewlinesBefore_651_._set_name(u'getNewlinesBefore') + var.get(u'Whitespace').get(u'prototype').put(u'getNewlinesBefore', PyJs_getNewlinesBefore_651_) + @Js + def PyJs_getNewlinesAfter_653_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'getNewlinesAfter':PyJs_getNewlinesAfter_653_}, var) + var.registers([u'tokens', u'startToken', u'node', u'endToken', u'index']) + var.put(u'startToken', PyJsComma(Js(0.0), Js(None))) + var.put(u'endToken', PyJsComma(Js(0.0), Js(None))) + var.put(u'tokens', var.get(u"this").get(u'tokens')) + @Js + def PyJs_anonymous_654_(token, this, arguments, var=var): + var = Scope({u'this':this, u'token':token, u'arguments':arguments}, var) + var.registers([u'token']) + return (var.get(u'token').get(u'end')-var.get(u'node').get(u'end')) + PyJs_anonymous_654_._set_name(u'anonymous') + var.put(u'index', var.get(u"this").callprop(u'_findToken', PyJs_anonymous_654_, Js(0.0), var.get(u'tokens').get(u'length'))) + if (var.get(u'index')>=Js(0.0)): + while (var.get(u'index') and PyJsStrictEq(var.get(u'node').get(u'end'),var.get(u'tokens').get((var.get(u'index')-Js(1.0))).get(u'end'))): + var.put(u'index',Js(var.get(u'index').to_number())-Js(1)) + var.put(u'startToken', var.get(u'tokens').get(var.get(u'index'))) + var.put(u'endToken', var.get(u'tokens').get((var.get(u'index')+Js(1.0)))) + if PyJsStrictEq(var.get(u'endToken').get(u'type').get(u'label'),Js(u',')): + var.put(u'endToken', var.get(u'tokens').get((var.get(u'index')+Js(2.0)))) + if (var.get(u'endToken') and PyJsStrictEq(var.get(u'endToken').get(u'type').get(u'label'),Js(u'eof'))): + return Js(1.0) + else: + return var.get(u"this").callprop(u'_getNewlinesBetween', var.get(u'startToken'), var.get(u'endToken')) + PyJs_getNewlinesAfter_653_._set_name(u'getNewlinesAfter') + var.get(u'Whitespace').get(u'prototype').put(u'getNewlinesAfter', PyJs_getNewlinesAfter_653_) + @Js + def PyJs__getNewlinesBetween_655_(startToken, endToken, this, arguments, var=var): + var = Scope({u'this':this, u'startToken':startToken, u'arguments':arguments, u'endToken':endToken, u'_getNewlinesBetween':PyJs__getNewlinesBetween_655_}, var) + var.registers([u'end', u'startToken', u'lines', u'start', u'line', u'endToken']) + if (var.get(u'endToken').neg() or var.get(u'endToken').get(u'loc').neg()): + return Js(0.0) + var.put(u'start', (var.get(u'startToken').get(u'loc').get(u'end').get(u'line') if var.get(u'startToken') else Js(1.0))) + var.put(u'end', var.get(u'endToken').get(u'loc').get(u'start').get(u'line')) + var.put(u'lines', Js(0.0)) + #for JS loop + var.put(u'line', var.get(u'start')) + while (var.get(u'line')<var.get(u'end')): + try: + if PyJsStrictEq(var.get(u"this").get(u'used').get(var.get(u'line')).typeof(),Js(u'undefined')): + var.get(u"this").get(u'used').put(var.get(u'line'), var.get(u'true')) + (var.put(u'lines',Js(var.get(u'lines').to_number())+Js(1))-Js(1)) + finally: + (var.put(u'line',Js(var.get(u'line').to_number())+Js(1))-Js(1)) + return var.get(u'lines') + PyJs__getNewlinesBetween_655_._set_name(u'_getNewlinesBetween') + var.get(u'Whitespace').get(u'prototype').put(u'_getNewlinesBetween', PyJs__getNewlinesBetween_655_) + @Js + def PyJs__findToken_656_(test, start, end, this, arguments, var=var): + var = Scope({u'end':end, u'_findToken':PyJs__findToken_656_, u'this':this, u'start':start, u'arguments':arguments, u'test':test}, var) + var.registers([u'test', u'middle', u'end', u'match', u'start']) + if (var.get(u'start')>=var.get(u'end')): + return (-Js(1.0)) + var.put(u'middle', PyJsBshift((var.get(u'start')+var.get(u'end')),Js(1.0))) + var.put(u'match', var.get(u'test')(var.get(u"this").get(u'tokens').get(var.get(u'middle')))) + if (var.get(u'match')<Js(0.0)): + return var.get(u"this").callprop(u'_findToken', var.get(u'test'), (var.get(u'middle')+Js(1.0)), var.get(u'end')) + else: + if (var.get(u'match')>Js(0.0)): + return var.get(u"this").callprop(u'_findToken', var.get(u'test'), var.get(u'start'), var.get(u'middle')) + else: + if PyJsStrictEq(var.get(u'match'),Js(0.0)): + return var.get(u'middle') + return (-Js(1.0)) + PyJs__findToken_656_._set_name(u'_findToken') + var.get(u'Whitespace').get(u'prototype').put(u'_findToken', PyJs__findToken_656_) + return var.get(u'Whitespace') + PyJs_anonymous_649_._set_name(u'anonymous') + var.put(u'Whitespace', PyJs_anonymous_649_()) + var.get(u'exports').put(u'default', var.get(u'Whitespace')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_647_._set_name(u'anonymous') +PyJs_Object_657_ = Js({u'babel-runtime/helpers/classCallCheck':Js(110.0)}) +@Js +def PyJs_anonymous_658_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'visitor', u'require', u'_babelTypes', u'module', u'_babelHelperHoistVariables', u't', u'_babelHelperHoistVariables2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_664_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_664_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_663_ = Js({}) + var.put(u'newObj', PyJs_Object_663_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_659_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'node', u'container', u'args', u'state', u'call', u'path', u'scope', u'callee']) + var.put(u'scope', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else var.get(u'path').get(u'scope'))) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'container', var.get(u't').callprop(u'functionExpression', var.get(u"null"), Js([]), var.get(u'node').get(u'body'), var.get(u'node').get(u'generator'), var.get(u'node').get(u'async'))) + var.put(u'callee', var.get(u'container')) + var.put(u'args', Js([])) + @Js + def PyJs_anonymous_660_(id, this, arguments, var=var): + var = Scope({u'this':this, u'id':id, u'arguments':arguments}, var) + var.registers([u'id']) + PyJs_Object_661_ = Js({u'id':var.get(u'id')}) + return var.get(u'scope').callprop(u'push', PyJs_Object_661_) + PyJs_anonymous_660_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_babelHelperHoistVariables2').get(u'default'))(var.get(u'path'), PyJs_anonymous_660_) + PyJs_Object_662_ = Js({u'foundThis':Js(False),u'foundArguments':Js(False)}) + var.put(u'state', PyJs_Object_662_) + var.get(u'path').callprop(u'traverse', var.get(u'visitor'), var.get(u'state')) + if var.get(u'state').get(u'foundArguments'): + var.put(u'callee', var.get(u't').callprop(u'memberExpression', var.get(u'container'), var.get(u't').callprop(u'identifier', Js(u'apply')))) + var.put(u'args', Js([])) + if var.get(u'state').get(u'foundThis'): + var.get(u'args').callprop(u'push', var.get(u't').callprop(u'thisExpression')) + if var.get(u'state').get(u'foundArguments'): + if var.get(u'state').get(u'foundThis').neg(): + var.get(u'args').callprop(u'push', var.get(u't').callprop(u'nullLiteral')) + var.get(u'args').callprop(u'push', var.get(u't').callprop(u'identifier', Js(u'arguments'))) + var.put(u'call', var.get(u't').callprop(u'callExpression', var.get(u'callee'), var.get(u'args'))) + if var.get(u'node').get(u'generator'): + var.put(u'call', var.get(u't').callprop(u'yieldExpression', var.get(u'call'), var.get(u'true'))) + return var.get(u't').callprop(u'returnStatement', var.get(u'call')) + PyJs_anonymous_659_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_659_) + var.put(u'_babelHelperHoistVariables', var.get(u'require')(Js(u'babel-helper-hoist-variables'))) + var.put(u'_babelHelperHoistVariables2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperHoistVariables'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + @Js + def PyJs_enter_666_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'enter':PyJs_enter_666_}, var) + var.registers([u'path', u'state']) + if var.get(u'path').callprop(u'isThisExpression'): + var.get(u'state').put(u'foundThis', var.get(u'true')) + PyJs_Object_667_ = Js({u'name':Js(u'arguments')}) + if var.get(u'path').callprop(u'isReferencedIdentifier', PyJs_Object_667_): + var.get(u'state').put(u'foundArguments', var.get(u'true')) + PyJs_enter_666_._set_name(u'enter') + @Js + def PyJs_Function_668_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_668_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_Function_668_._set_name(u'Function') + PyJs_Object_665_ = Js({u'enter':PyJs_enter_666_,u'Function':PyJs_Function_668_}) + var.put(u'visitor', PyJs_Object_665_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_658_._set_name(u'anonymous') +PyJs_Object_669_ = Js({u'babel-helper-hoist-variables':Js(51.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_670_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'toDefineObject', u'exports', u'toComputedObjectFromClass', u'_each', u'_interopRequireWildcard', u'_babelHelperFunctionName', u'require', u'_babelTypes', u'_has2', u'_has', u'hasComputed', u'push', u'module', u'_each2', u't', u'_babelHelperFunctionName2', u'_interopRequireDefault', u'toKind', u'toClassObject']) + @Js + def PyJsHoisted_toDefineObject_(mutatorMap, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'mutatorMap':mutatorMap}, var) + var.registers([u'mutatorMap']) + @Js + def PyJs_anonymous_678_(map, this, arguments, var=var): + var = Scope({u'this':this, u'map':map, u'arguments':arguments}, var) + var.registers([u'map']) + if var.get(u'map').get(u'value'): + var.get(u'map').put(u'writable', var.get(u't').callprop(u'booleanLiteral', var.get(u'true'))) + var.get(u'map').put(u'configurable', var.get(u't').callprop(u'booleanLiteral', var.get(u'true'))) + var.get(u'map').put(u'enumerable', var.get(u't').callprop(u'booleanLiteral', var.get(u'true'))) + PyJs_anonymous_678_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(var.get(u'mutatorMap'), PyJs_anonymous_678_) + return var.get(u'toClassObject')(var.get(u'mutatorMap')) + PyJsHoisted_toDefineObject_.func_name = u'toDefineObject' + var.put(u'toDefineObject', PyJsHoisted_toDefineObject_) + @Js + def PyJsHoisted_toComputedObjectFromClass_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'i', u'obj', u'objExpr', u'val', u'prop']) + var.put(u'objExpr', var.get(u't').callprop(u'arrayExpression', Js([]))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'obj').get(u'properties').get(u'length')): + try: + var.put(u'prop', var.get(u'obj').get(u'properties').get(var.get(u'i'))) + var.put(u'val', var.get(u'prop').get(u'value')) + var.get(u'val').get(u'properties').callprop(u'unshift', var.get(u't').callprop(u'objectProperty', var.get(u't').callprop(u'identifier', Js(u'key')), var.get(u't').callprop(u'toComputedKey', var.get(u'prop')))) + var.get(u'objExpr').get(u'elements').callprop(u'push', var.get(u'val')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'objExpr') + PyJsHoisted_toComputedObjectFromClass_.func_name = u'toComputedObjectFromClass' + var.put(u'toComputedObjectFromClass', PyJsHoisted_toComputedObjectFromClass_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_671_ = Js({}) + var.put(u'newObj', PyJs_Object_671_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_hasComputed_(mutatorMap, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'mutatorMap':mutatorMap}, var) + var.registers([u'mutatorMap', u'key']) + for PyJsTemp in var.get(u'mutatorMap'): + var.put(u'key', PyJsTemp) + if var.get(u'mutatorMap').get(var.get(u'key')).get(u'_computed'): + return var.get(u'true') + return Js(False) + PyJsHoisted_hasComputed_.func_name = u'hasComputed' + var.put(u'hasComputed', PyJsHoisted_hasComputed_) + @Js + def PyJsHoisted_push_(mutatorMap, node, kind, file, scope, this, arguments, var=var): + var = Scope({u'node':node, u'kind':kind, u'arguments':arguments, u'file':file, u'this':this, u'scope':scope, u'mutatorMap':mutatorMap}, var) + var.registers([u'node', u'map', u'kind', u'file', u'inheritedKind', u'value', u'alias', u'key', u'scope', u'decorators', u'mutatorMap']) + var.put(u'alias', var.get(u't').callprop(u'toKeyAlias', var.get(u'node'))) + PyJs_Object_673_ = Js({}) + var.put(u'map', PyJs_Object_673_) + if PyJsComma(Js(0.0),var.get(u'_has2').get(u'default'))(var.get(u'mutatorMap'), var.get(u'alias')): + var.put(u'map', var.get(u'mutatorMap').get(var.get(u'alias'))) + var.get(u'mutatorMap').put(var.get(u'alias'), var.get(u'map')) + var.get(u'map').put(u'_inherits', (var.get(u'map').get(u'_inherits') or Js([]))) + var.get(u'map').get(u'_inherits').callprop(u'push', var.get(u'node')) + var.get(u'map').put(u'_key', var.get(u'node').get(u'key')) + if var.get(u'node').get(u'computed'): + var.get(u'map').put(u'_computed', var.get(u'true')) + if var.get(u'node').get(u'decorators'): + var.put(u'decorators', var.get(u'map').put(u'decorators', (var.get(u'map').get(u'decorators') or var.get(u't').callprop(u'arrayExpression', Js([]))))) + @Js + def PyJs_anonymous_674_(dec, this, arguments, var=var): + var = Scope({u'this':this, u'dec':dec, u'arguments':arguments}, var) + var.registers([u'dec']) + return var.get(u'dec').get(u'expression') + PyJs_anonymous_674_._set_name(u'anonymous') + var.get(u'decorators').put(u'elements', var.get(u'decorators').get(u'elements').callprop(u'concat', var.get(u'node').get(u'decorators').callprop(u'map', PyJs_anonymous_674_).callprop(u'reverse'))) + if (var.get(u'map').get(u'value') or var.get(u'map').get(u'initializer')): + PyJsTempException = JsToPyException(var.get(u'file').callprop(u'buildCodeFrameError', var.get(u'node'), Js(u'Key conflict with sibling node'))) + raise PyJsTempException + var.put(u'key', PyJsComma(Js(0.0), Js(None))) + var.put(u'value', PyJsComma(Js(0.0), Js(None))) + if ((var.get(u't').callprop(u'isObjectProperty', var.get(u'node')) or var.get(u't').callprop(u'isObjectMethod', var.get(u'node'))) or var.get(u't').callprop(u'isClassMethod', var.get(u'node'))): + var.put(u'key', var.get(u't').callprop(u'toComputedKey', var.get(u'node'), var.get(u'node').get(u'key'))) + if (var.get(u't').callprop(u'isObjectProperty', var.get(u'node')) or var.get(u't').callprop(u'isClassProperty', var.get(u'node'))): + var.put(u'value', var.get(u'node').get(u'value')) + else: + if (var.get(u't').callprop(u'isObjectMethod', var.get(u'node')) or var.get(u't').callprop(u'isClassMethod', var.get(u'node'))): + var.put(u'value', var.get(u't').callprop(u'functionExpression', var.get(u"null"), var.get(u'node').get(u'params'), var.get(u'node').get(u'body'), var.get(u'node').get(u'generator'), var.get(u'node').get(u'async'))) + var.get(u'value').put(u'returnType', var.get(u'node').get(u'returnType')) + var.put(u'inheritedKind', var.get(u'toKind')(var.get(u'node'))) + if (var.get(u'kind').neg() or PyJsStrictNeq(var.get(u'inheritedKind'),Js(u'value'))): + var.put(u'kind', var.get(u'inheritedKind')) + if (((var.get(u'scope') and var.get(u't').callprop(u'isStringLiteral', var.get(u'key'))) and (PyJsStrictEq(var.get(u'kind'),Js(u'value')) or PyJsStrictEq(var.get(u'kind'),Js(u'initializer')))) and var.get(u't').callprop(u'isFunctionExpression', var.get(u'value'))): + PyJs_Object_675_ = Js({u'id':var.get(u'key'),u'node':var.get(u'value'),u'scope':var.get(u'scope')}) + var.put(u'value', PyJsComma(Js(0.0),var.get(u'_babelHelperFunctionName2').get(u'default'))(PyJs_Object_675_)) + if var.get(u'value'): + var.get(u't').callprop(u'inheritsComments', var.get(u'value'), var.get(u'node')) + var.get(u'map').put(var.get(u'kind'), var.get(u'value')) + return var.get(u'map') + PyJsHoisted_push_.func_name = u'push' + var.put(u'push', PyJsHoisted_push_) + @Js + def PyJsHoisted_toClassObject_(mutatorMap, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'mutatorMap':mutatorMap}, var) + var.registers([u'objExpr', u'mutatorMap']) + var.put(u'objExpr', var.get(u't').callprop(u'objectExpression', Js([]))) + @Js + def PyJs_anonymous_676_(map, this, arguments, var=var): + var = Scope({u'this':this, u'map':map, u'arguments':arguments}, var) + var.registers([u'mapNode', u'propNode', u'map']) + var.put(u'mapNode', var.get(u't').callprop(u'objectExpression', Js([]))) + var.put(u'propNode', var.get(u't').callprop(u'objectProperty', var.get(u'map').get(u'_key'), var.get(u'mapNode'), var.get(u'map').get(u'_computed'))) + @Js + def PyJs_anonymous_677_(node, key, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'node', u'inheritNode', u'key', u'prop']) + if PyJsStrictEq(var.get(u'key').get(u'0'),Js(u'_')): + return var.get('undefined') + var.put(u'inheritNode', var.get(u'node')) + if (var.get(u't').callprop(u'isClassMethod', var.get(u'node')) or var.get(u't').callprop(u'isClassProperty', var.get(u'node'))): + var.put(u'node', var.get(u'node').get(u'value')) + var.put(u'prop', var.get(u't').callprop(u'objectProperty', var.get(u't').callprop(u'identifier', var.get(u'key')), var.get(u'node'))) + var.get(u't').callprop(u'inheritsComments', var.get(u'prop'), var.get(u'inheritNode')) + var.get(u't').callprop(u'removeComments', var.get(u'inheritNode')) + var.get(u'mapNode').get(u'properties').callprop(u'push', var.get(u'prop')) + PyJs_anonymous_677_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(var.get(u'map'), PyJs_anonymous_677_) + var.get(u'objExpr').get(u'properties').callprop(u'push', var.get(u'propNode')) + PyJs_anonymous_676_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(var.get(u'mutatorMap'), PyJs_anonymous_676_) + return var.get(u'objExpr') + PyJsHoisted_toClassObject_.func_name = u'toClassObject' + var.put(u'toClassObject', PyJsHoisted_toClassObject_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_672_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_672_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_toKind_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if (var.get(u't').callprop(u'isClassMethod', var.get(u'node')) or var.get(u't').callprop(u'isObjectMethod', var.get(u'node'))): + if (PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'get')) or PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'set'))): + return var.get(u'node').get(u'kind') + return Js(u'value') + PyJsHoisted_toKind_.func_name = u'toKind' + var.put(u'toKind', PyJsHoisted_toKind_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'push', var.get(u'push')) + var.get(u'exports').put(u'hasComputed', var.get(u'hasComputed')) + var.get(u'exports').put(u'toComputedObjectFromClass', var.get(u'toComputedObjectFromClass')) + var.get(u'exports').put(u'toClassObject', var.get(u'toClassObject')) + var.get(u'exports').put(u'toDefineObject', var.get(u'toDefineObject')) + var.put(u'_babelHelperFunctionName', var.get(u'require')(Js(u'babel-helper-function-name'))) + var.put(u'_babelHelperFunctionName2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperFunctionName'))) + var.put(u'_each', var.get(u'require')(Js(u'lodash/each'))) + var.put(u'_each2', var.get(u'_interopRequireDefault')(var.get(u'_each'))) + var.put(u'_has', var.get(u'require')(Js(u'lodash/has'))) + var.put(u'_has2', var.get(u'_interopRequireDefault')(var.get(u'_has'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_670_._set_name(u'anonymous') +PyJs_Object_679_ = Js({u'babel-helper-function-name':Js(49.0),u'babel-types':Js(258.0),u'lodash/each':Js(443.0),u'lodash/has':Js(453.0)}) +@Js +def PyJs_anonymous_680_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'exports', u'_interopRequireWildcard', u'visitor', u'_babelHelperGetFunctionArity', u'_babelTypes', u'visit', u'_babelHelperGetFunctionArity2', u'wrap', u'_babelTemplate', u'buildPropertyMethodAssignmentWrapper', u'_babelTemplate2', u't', u'_interopRequireDefault', u'require', u'buildGeneratorPropertyMethodAssignmentWrapper']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_684_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_684_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_wrap_(state, method, id, scope, this, arguments, var=var): + var = Scope({u'state':state, u'arguments':arguments, u'this':this, u'scope':scope, u'method':method, u'id':id}, var) + var.registers([u'i', u'len', u'id', u'state', u'params', u'build', u'_template', u'scope', u'method']) + if var.get(u'state').get(u'selfReference'): + if (var.get(u'scope').callprop(u'hasBinding', var.get(u'id').get(u'name')) and var.get(u'scope').callprop(u'hasGlobal', var.get(u'id').get(u'name')).neg()): + var.get(u'scope').callprop(u'rename', var.get(u'id').get(u'name')) + else: + if var.get(u't').callprop(u'isFunction', var.get(u'method')).neg(): + return var.get('undefined') + var.put(u'build', var.get(u'buildPropertyMethodAssignmentWrapper')) + if var.get(u'method').get(u'generator'): + var.put(u'build', var.get(u'buildGeneratorPropertyMethodAssignmentWrapper')) + PyJs_Object_687_ = Js({u'FUNCTION':var.get(u'method'),u'FUNCTION_ID':var.get(u'id'),u'FUNCTION_KEY':var.get(u'scope').callprop(u'generateUidIdentifier', var.get(u'id').get(u'name'))}) + var.put(u'_template', var.get(u'build')(PyJs_Object_687_).get(u'expression')) + var.get(u'_template').get(u'callee').put(u'_skipModulesRemap', var.get(u'true')) + var.put(u'params', var.get(u'_template').get(u'callee').get(u'body').get(u'body').get(u'0').get(u'params')) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', PyJsComma(Js(0.0),var.get(u'_babelHelperGetFunctionArity2').get(u'default'))(var.get(u'method'))) + while (var.get(u'i')<var.get(u'len')): + try: + var.get(u'params').callprop(u'push', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'x'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'_template') + var.get(u'method').put(u'id', var.get(u'id')) + var.get(u'scope').callprop(u'getProgramParent').get(u'references').put(var.get(u'id').get(u'name'), var.get(u'true')) + PyJsHoisted_wrap_.func_name = u'wrap' + var.put(u'wrap', PyJsHoisted_wrap_) + @Js + def PyJsHoisted_visit_(node, name, scope, this, arguments, var=var): + var = Scope({u'node':node, u'scope':scope, u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'node', u'scope', u'state', u'binding', u'name']) + PyJs_Object_688_ = Js({u'selfAssignment':Js(False),u'selfReference':Js(False),u'outerDeclar':var.get(u'scope').callprop(u'getBindingIdentifier', var.get(u'name')),u'references':Js([]),u'name':var.get(u'name')}) + var.put(u'state', PyJs_Object_688_) + var.put(u'binding', var.get(u'scope').callprop(u'getOwnBinding', var.get(u'name'))) + if var.get(u'binding'): + if PyJsStrictEq(var.get(u'binding').get(u'kind'),Js(u'param')): + var.get(u'state').put(u'selfReference', var.get(u'true')) + else: + pass + else: + if (var.get(u'state').get(u'outerDeclar') or var.get(u'scope').callprop(u'hasGlobal', var.get(u'name'))): + var.get(u'scope').callprop(u'traverse', var.get(u'node'), var.get(u'visitor'), var.get(u'state')) + return var.get(u'state') + PyJsHoisted_visit_.func_name = u'visit' + var.put(u'visit', PyJsHoisted_visit_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_683_ = Js({}) + var.put(u'newObj', PyJs_Object_683_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_681_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'node', u'name', u'parent', u'binding', u'state', u'scope', u'_ref', u'id']) + var.put(u'node', var.get(u'_ref').get(u'node')) + var.put(u'parent', var.get(u'_ref').get(u'parent')) + var.put(u'scope', var.get(u'_ref').get(u'scope')) + var.put(u'id', var.get(u'_ref').get(u'id')) + if var.get(u'node').get(u'id'): + return var.get('undefined') + PyJs_Object_682_ = Js({u'kind':Js(u'method')}) + if ((var.get(u't').callprop(u'isObjectProperty', var.get(u'parent')) or var.get(u't').callprop(u'isObjectMethod', var.get(u'parent'), PyJs_Object_682_)) and (var.get(u'parent').get(u'computed').neg() or var.get(u't').callprop(u'isLiteral', var.get(u'parent').get(u'key')))): + var.put(u'id', var.get(u'parent').get(u'key')) + else: + if var.get(u't').callprop(u'isVariableDeclarator', var.get(u'parent')): + var.put(u'id', var.get(u'parent').get(u'id')) + if var.get(u't').callprop(u'isIdentifier', var.get(u'id')): + var.put(u'binding', var.get(u'scope').get(u'parent').callprop(u'getBinding', var.get(u'id').get(u'name'))) + if ((var.get(u'binding') and var.get(u'binding').get(u'constant')) and PyJsStrictEq(var.get(u'scope').callprop(u'getBinding', var.get(u'id').get(u'name')),var.get(u'binding'))): + var.get(u'node').put(u'id', var.get(u'id')) + var.get(u'node').get(u'id').put(var.get(u't').get(u'NOT_LOCAL_BINDING'), var.get(u'true')) + return var.get('undefined') + else: + if var.get(u't').callprop(u'isAssignmentExpression', var.get(u'parent')): + var.put(u'id', var.get(u'parent').get(u'left')) + else: + if var.get(u'id').neg(): + return var.get('undefined') + var.put(u'name', PyJsComma(Js(0.0), Js(None))) + if (var.get(u'id') and var.get(u't').callprop(u'isLiteral', var.get(u'id'))): + var.put(u'name', var.get(u'id').get(u'value')) + else: + if (var.get(u'id') and var.get(u't').callprop(u'isIdentifier', var.get(u'id'))): + var.put(u'name', var.get(u'id').get(u'name')) + else: + return var.get('undefined') + var.put(u'name', var.get(u't').callprop(u'toBindingIdentifierName', var.get(u'name'))) + var.put(u'id', var.get(u't').callprop(u'identifier', var.get(u'name'))) + var.get(u'id').put(var.get(u't').get(u'NOT_LOCAL_BINDING'), var.get(u'true')) + var.put(u'state', var.get(u'visit')(var.get(u'node'), var.get(u'name'), var.get(u'scope'))) + return (var.get(u'wrap')(var.get(u'state'), var.get(u'node'), var.get(u'id'), var.get(u'scope')) or var.get(u'node')) + PyJs_anonymous_681_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_681_) + var.put(u'_babelHelperGetFunctionArity', var.get(u'require')(Js(u'babel-helper-get-function-arity'))) + var.put(u'_babelHelperGetFunctionArity2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperGetFunctionArity'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'buildPropertyMethodAssignmentWrapper', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (FUNCTION_KEY) {\n function FUNCTION_ID() {\n return FUNCTION_KEY.apply(this, arguments);\n }\n\n FUNCTION_ID.toString = function () {\n return FUNCTION_KEY.toString();\n }\n\n return FUNCTION_ID;\n })(FUNCTION)\n'))) + var.put(u'buildGeneratorPropertyMethodAssignmentWrapper', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (FUNCTION_KEY) {\n function* FUNCTION_ID() {\n return yield* FUNCTION_KEY.apply(this, arguments);\n }\n\n FUNCTION_ID.toString = function () {\n return FUNCTION_KEY.toString();\n };\n\n return FUNCTION_ID;\n })(FUNCTION)\n'))) + @Js + def PyJs_ReferencedIdentifierBindingIdentifier_686_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifierBindingIdentifier':PyJs_ReferencedIdentifierBindingIdentifier_686_, u'arguments':arguments}, var) + var.registers([u'path', u'state', u'localDeclar']) + if PyJsStrictNeq(var.get(u'path').get(u'node').get(u'name'),var.get(u'state').get(u'name')): + return var.get('undefined') + var.put(u'localDeclar', var.get(u'path').get(u'scope').callprop(u'getBindingIdentifier', var.get(u'state').get(u'name'))) + if PyJsStrictNeq(var.get(u'localDeclar'),var.get(u'state').get(u'outerDeclar')): + return var.get('undefined') + var.get(u'state').put(u'selfReference', var.get(u'true')) + var.get(u'path').callprop(u'stop') + PyJs_ReferencedIdentifierBindingIdentifier_686_._set_name(u'ReferencedIdentifierBindingIdentifier') + PyJs_Object_685_ = Js({u'ReferencedIdentifier|BindingIdentifier':PyJs_ReferencedIdentifierBindingIdentifier_686_}) + var.put(u'visitor', PyJs_Object_685_) + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_680_._set_name(u'anonymous') +PyJs_Object_689_ = Js({u'babel-helper-get-function-arity':Js(50.0),u'babel-template':Js(221.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_690_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'require', u'_babelTypes', u'module', u't']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_692_ = Js({}) + var.put(u'newObj', PyJs_Object_692_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_691_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'node', u'params', u'param']) + var.put(u'params', var.get(u'node').get(u'params')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'params').get(u'length')): + try: + var.put(u'param', var.get(u'params').get(var.get(u'i'))) + if (var.get(u't').callprop(u'isAssignmentPattern', var.get(u'param')) or var.get(u't').callprop(u'isRestElement', var.get(u'param'))): + return var.get(u'i') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'params').get(u'length') + PyJs_anonymous_691_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_691_) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_690_._set_name(u'anonymous') +PyJs_Object_693_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_694_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'visitor', u'require', u'_babelTypes', u'module', u't', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_698_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_698_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_697_ = Js({}) + var.put(u'newObj', PyJs_Object_697_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_695_(path, emit, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'emit':emit, u'arguments':arguments}, var) + var.registers([u'path', u'kind', u'emit']) + var.put(u'kind', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else Js(u'var'))) + PyJs_Object_696_ = Js({u'kind':var.get(u'kind'),u'emit':var.get(u'emit')}) + var.get(u'path').callprop(u'traverse', var.get(u'visitor'), PyJs_Object_696_) + PyJs_anonymous_695_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_695_) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + @Js + def PyJs_Scope_700_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'Scope':PyJs_Scope_700_}, var) + var.registers([u'path', u'state']) + if PyJsStrictEq(var.get(u'state').get(u'kind'),Js(u'let')): + var.get(u'path').callprop(u'skip') + PyJs_Scope_700_._set_name(u'Scope') + @Js + def PyJs_Function_701_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_701_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_Function_701_._set_name(u'Function') + @Js + def PyJs_VariableDeclaration_702_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'VariableDeclaration':PyJs_VariableDeclaration_702_}, var) + var.registers([u'_isArray', u'_iterator', u'firstId', u'declarations', u'state', u'declar', u'_i', u'path', u'nodes', u'_ref', u'name']) + if (var.get(u'state').get(u'kind') and PyJsStrictNeq(var.get(u'path').get(u'node').get(u'kind'),var.get(u'state').get(u'kind'))): + return var.get('undefined') + var.put(u'nodes', Js([])) + var.put(u'declarations', var.get(u'path').callprop(u'get', Js(u'declarations'))) + var.put(u'firstId', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'_iterator', var.get(u'declarations')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'declar', var.get(u'_ref')) + var.put(u'firstId', var.get(u'declar').get(u'node').get(u'id')) + if var.get(u'declar').get(u'node').get(u'init'): + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'declar').get(u'node').get(u'id'), var.get(u'declar').get(u'node').get(u'init')))) + for PyJsTemp in var.get(u'declar').callprop(u'getBindingIdentifiers'): + var.put(u'name', PyJsTemp) + var.get(u'state').callprop(u'emit', var.get(u't').callprop(u'identifier', var.get(u'name')), var.get(u'name')) + + PyJs_Object_703_ = Js({u'left':var.get(u'path').get(u'node')}) + if var.get(u'path').get(u'parentPath').callprop(u'isFor', PyJs_Object_703_): + var.get(u'path').callprop(u'replaceWith', var.get(u'firstId')) + else: + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'nodes')) + PyJs_VariableDeclaration_702_._set_name(u'VariableDeclaration') + PyJs_Object_699_ = Js({u'Scope':PyJs_Scope_700_,u'Function':PyJs_Function_701_,u'VariableDeclaration':PyJs_VariableDeclaration_702_}) + var.put(u'visitor', PyJs_Object_699_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_694_._set_name(u'anonymous') +PyJs_Object_704_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_705_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'require', u'_babelTypes', u'module', u't']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_708_ = Js({}) + var.put(u'newObj', PyJs_Object_708_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_706_(callee, thisNode, args, this, arguments, var=var): + var = Scope({u'thisNode':thisNode, u'this':this, u'args':args, u'callee':callee, u'arguments':arguments}, var) + var.registers([u'thisNode', u'args', u'callee']) + PyJs_Object_707_ = Js({u'name':Js(u'arguments')}) + if ((PyJsStrictEq(var.get(u'args').get(u'length'),Js(1.0)) and var.get(u't').callprop(u'isSpreadElement', var.get(u'args').get(u'0'))) and var.get(u't').callprop(u'isIdentifier', var.get(u'args').get(u'0').get(u'argument'), PyJs_Object_707_)): + return var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u'callee'), var.get(u't').callprop(u'identifier', Js(u'apply'))), Js([var.get(u'thisNode'), var.get(u'args').get(u'0').get(u'argument')])) + else: + return var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u'callee'), var.get(u't').callprop(u'identifier', Js(u'call'))), Js([var.get(u'thisNode')]).callprop(u'concat', var.get(u'args'))) + PyJs_anonymous_706_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_706_) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_705_._set_name(u'anonymous') +PyJs_Object_709_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_710_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'pullFlag', u'_interopRequireWildcard', u'_pull', u'is', u'_babelTypes', u'module', u'_pull2', u't', u'_interopRequireDefault', u'require']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_712_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_712_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_is_(node, flag, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'flag':flag, u'arguments':arguments}, var) + var.registers([u'node', u'flag']) + return (var.get(u't').callprop(u'isRegExpLiteral', var.get(u'node')) and (var.get(u'node').get(u'flags').callprop(u'indexOf', var.get(u'flag'))>=Js(0.0))) + PyJsHoisted_is_.func_name = u'is' + var.put(u'is', PyJsHoisted_is_) + @Js + def PyJsHoisted_pullFlag_(node, flag, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'flag':flag, u'arguments':arguments}, var) + var.registers([u'node', u'flag', u'flags']) + var.put(u'flags', var.get(u'node').get(u'flags').callprop(u'split', Js(u''))) + if (var.get(u'node').get(u'flags').callprop(u'indexOf', var.get(u'flag'))<Js(0.0)): + return var.get('undefined') + PyJsComma(Js(0.0),var.get(u'_pull2').get(u'default'))(var.get(u'flags'), var.get(u'flag')) + var.get(u'node').put(u'flags', var.get(u'flags').callprop(u'join', Js(u''))) + PyJsHoisted_pullFlag_.func_name = u'pullFlag' + var.put(u'pullFlag', PyJsHoisted_pullFlag_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_711_ = Js({}) + var.put(u'newObj', PyJs_Object_711_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'is', var.get(u'is')) + var.get(u'exports').put(u'pullFlag', var.get(u'pullFlag')) + var.put(u'_pull', var.get(u'require')(Js(u'lodash/pull'))) + var.put(u'_pull2', var.get(u'_interopRequireDefault')(var.get(u'_pull'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass +PyJs_anonymous_710_._set_name(u'anonymous') +PyJs_Object_713_ = Js({u'babel-types':Js(258.0),u'lodash/pull':Js(481.0)}) +@Js +def PyJs_anonymous_714_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'getPrototypeOfExpression', u'exports', u'_symbol2', u'isMemberExpressionSuper', u'_interopRequireWildcard', u'visitor', u'require', u'_babelTypes', u'messages', u'ReplaceSupers', u'module', u'_babelHelperOptimiseCallExpression', u'HARDCORE_THIS_REF', u'_symbol', u't', u'_babelHelperOptimiseCallExpression2', u'_interopRequireDefault', u'isIllegalBareSuper', u'_classCallCheck3', u'_classCallCheck2', u'_babelMessages']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_716_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_716_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_isIllegalBareSuper_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + if var.get(u't').callprop(u'isSuper', var.get(u'node')).neg(): + return Js(False) + PyJs_Object_717_ = Js({u'computed':Js(False)}) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'parent'), PyJs_Object_717_): + return Js(False) + PyJs_Object_718_ = Js({u'callee':var.get(u'node')}) + if var.get(u't').callprop(u'isCallExpression', var.get(u'parent'), PyJs_Object_718_): + return Js(False) + return var.get(u'true') + PyJsHoisted_isIllegalBareSuper_.func_name = u'isIllegalBareSuper' + var.put(u'isIllegalBareSuper', PyJsHoisted_isIllegalBareSuper_) + @Js + def PyJsHoisted_isMemberExpressionSuper_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return (var.get(u't').callprop(u'isMemberExpression', var.get(u'node')) and var.get(u't').callprop(u'isSuper', var.get(u'node').get(u'object'))) + PyJsHoisted_isMemberExpressionSuper_.func_name = u'isMemberExpressionSuper' + var.put(u'isMemberExpressionSuper', PyJsHoisted_isMemberExpressionSuper_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_715_ = Js({}) + var.put(u'newObj', PyJs_Object_715_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_getPrototypeOfExpression_(objectRef, isStatic, this, arguments, var=var): + var = Scope({u'this':this, u'objectRef':objectRef, u'isStatic':isStatic, u'arguments':arguments}, var) + var.registers([u'objectRef', u'isStatic', u'targetRef']) + var.put(u'targetRef', (var.get(u'objectRef') if var.get(u'isStatic') else var.get(u't').callprop(u'memberExpression', var.get(u'objectRef'), var.get(u't').callprop(u'identifier', Js(u'prototype'))))) + def PyJs_LONG_719_(var=var): + return var.get(u't').callprop(u'logicalExpression', Js(u'||'), var.get(u't').callprop(u'memberExpression', var.get(u'targetRef'), var.get(u't').callprop(u'identifier', Js(u'__proto__'))), var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'Object')), var.get(u't').callprop(u'identifier', Js(u'getPrototypeOf'))), Js([var.get(u'targetRef')]))) + return PyJs_LONG_719_() + PyJsHoisted_getPrototypeOfExpression_.func_name = u'getPrototypeOfExpression' + var.put(u'getPrototypeOfExpression', PyJsHoisted_getPrototypeOfExpression_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_symbol', var.get(u'require')(Js(u'babel-runtime/core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + var.put(u'_babelHelperOptimiseCallExpression', var.get(u'require')(Js(u'babel-helper-optimise-call-expression'))) + var.put(u'_babelHelperOptimiseCallExpression2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperOptimiseCallExpression'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'HARDCORE_THIS_REF', PyJsComma(Js(0.0),var.get(u'_symbol2').get(u'default'))()) + pass + pass + pass + @Js + def PyJs_Function_721_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_721_, u'arguments':arguments}, var) + var.registers([u'path']) + if var.get(u'path').callprop(u'inShadow', Js(u'this')).neg(): + var.get(u'path').callprop(u'skip') + PyJs_Function_721_._set_name(u'Function') + @Js + def PyJs_ReturnStatement_722_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReturnStatement':PyJs_ReturnStatement_722_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if var.get(u'path').callprop(u'inShadow', Js(u'this')).neg(): + var.get(u'state').get(u'returns').callprop(u'push', var.get(u'path')) + PyJs_ReturnStatement_722_._set_name(u'ReturnStatement') + @Js + def PyJs_ThisExpression_723_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ThisExpression':PyJs_ThisExpression_723_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if var.get(u'path').get(u'node').get(var.get(u'HARDCORE_THIS_REF')).neg(): + var.get(u'state').get(u'thises').callprop(u'push', var.get(u'path')) + PyJs_ThisExpression_723_._set_name(u'ThisExpression') + @Js + def PyJs_enter_724_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'enter':PyJs_enter_724_}, var) + var.registers([u'callback', u'isBareSuper', u'state', u'result', u'path']) + var.put(u'callback', var.get(u'state').get(u'specHandle')) + if var.get(u'state').get(u'isLoose'): + var.put(u'callback', var.get(u'state').get(u'looseHandle')) + var.put(u'isBareSuper', (var.get(u'path').callprop(u'isCallExpression') and var.get(u'path').callprop(u'get', Js(u'callee')).callprop(u'isSuper'))) + var.put(u'result', var.get(u'callback').callprop(u'call', var.get(u'state'), var.get(u'path'))) + if var.get(u'result'): + var.get(u'state').put(u'hasSuper', var.get(u'true')) + if var.get(u'isBareSuper'): + var.get(u'state').get(u'bareSupers').callprop(u'push', var.get(u'path')) + if PyJsStrictEq(var.get(u'result'),var.get(u'true')): + var.get(u'path').callprop(u'requeue') + if (PyJsStrictNeq(var.get(u'result'),var.get(u'true')) and var.get(u'result')): + if var.get(u'Array').callprop(u'isArray', var.get(u'result')): + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'result')) + else: + var.get(u'path').callprop(u'replaceWith', var.get(u'result')) + PyJs_enter_724_._set_name(u'enter') + PyJs_Object_720_ = Js({u'Function':PyJs_Function_721_,u'ReturnStatement':PyJs_ReturnStatement_722_,u'ThisExpression':PyJs_ThisExpression_723_,u'enter':PyJs_enter_724_}) + var.put(u'visitor', PyJs_Object_720_) + @Js + def PyJs_anonymous_725_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'ReplaceSupers']) + @Js + def PyJsHoisted_ReplaceSupers_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'inClass', u'opts']) + var.put(u'inClass', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js(False))) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'ReplaceSupers')) + var.get(u"this").put(u'forceSuperMemoisation', var.get(u'opts').get(u'forceSuperMemoisation')) + var.get(u"this").put(u'methodPath', var.get(u'opts').get(u'methodPath')) + var.get(u"this").put(u'methodNode', var.get(u'opts').get(u'methodNode')) + var.get(u"this").put(u'superRef', var.get(u'opts').get(u'superRef')) + var.get(u"this").put(u'isStatic', var.get(u'opts').get(u'isStatic')) + var.get(u"this").put(u'hasSuper', Js(False)) + var.get(u"this").put(u'inClass', var.get(u'inClass')) + var.get(u"this").put(u'isLoose', var.get(u'opts').get(u'isLoose')) + var.get(u"this").put(u'scope', var.get(u"this").get(u'methodPath').get(u'scope')) + var.get(u"this").put(u'file', var.get(u'opts').get(u'file')) + var.get(u"this").put(u'opts', var.get(u'opts')) + var.get(u"this").put(u'bareSupers', Js([])) + var.get(u"this").put(u'returns', Js([])) + var.get(u"this").put(u'thises', Js([])) + PyJsHoisted_ReplaceSupers_.func_name = u'ReplaceSupers' + var.put(u'ReplaceSupers', PyJsHoisted_ReplaceSupers_) + pass + @Js + def PyJs_getObjectRef_726_(this, arguments, var=var): + var = Scope({u'this':this, u'getObjectRef':PyJs_getObjectRef_726_, u'arguments':arguments}, var) + var.registers([]) + return (var.get(u"this").get(u'opts').get(u'objectRef') or var.get(u"this").get(u'opts').callprop(u'getObjectRef')) + PyJs_getObjectRef_726_._set_name(u'getObjectRef') + var.get(u'ReplaceSupers').get(u'prototype').put(u'getObjectRef', PyJs_getObjectRef_726_) + @Js + def PyJs_setSuperProperty_727_(property, value, isComputed, this, arguments, var=var): + var = Scope({u'setSuperProperty':PyJs_setSuperProperty_727_, u'this':this, u'value':value, u'arguments':arguments, u'property':property, u'isComputed':isComputed}, var) + var.registers([u'property', u'value', u'isComputed']) + def PyJs_LONG_728_(var=var): + return var.get(u't').callprop(u'callExpression', var.get(u"this").get(u'file').callprop(u'addHelper', Js(u'set')), Js([var.get(u'getPrototypeOfExpression')(var.get(u"this").callprop(u'getObjectRef'), var.get(u"this").get(u'isStatic')), (var.get(u'property') if var.get(u'isComputed') else var.get(u't').callprop(u'stringLiteral', var.get(u'property').get(u'name'))), var.get(u'value'), var.get(u't').callprop(u'thisExpression')])) + return PyJs_LONG_728_() + PyJs_setSuperProperty_727_._set_name(u'setSuperProperty') + var.get(u'ReplaceSupers').get(u'prototype').put(u'setSuperProperty', PyJs_setSuperProperty_727_) + @Js + def PyJs_getSuperProperty_729_(property, isComputed, this, arguments, var=var): + var = Scope({u'this':this, u'getSuperProperty':PyJs_getSuperProperty_729_, u'property':property, u'arguments':arguments, u'isComputed':isComputed}, var) + var.registers([u'property', u'isComputed']) + def PyJs_LONG_730_(var=var): + return var.get(u't').callprop(u'callExpression', var.get(u"this").get(u'file').callprop(u'addHelper', Js(u'get')), Js([var.get(u'getPrototypeOfExpression')(var.get(u"this").callprop(u'getObjectRef'), var.get(u"this").get(u'isStatic')), (var.get(u'property') if var.get(u'isComputed') else var.get(u't').callprop(u'stringLiteral', var.get(u'property').get(u'name'))), var.get(u't').callprop(u'thisExpression')])) + return PyJs_LONG_730_() + PyJs_getSuperProperty_729_._set_name(u'getSuperProperty') + var.get(u'ReplaceSupers').get(u'prototype').put(u'getSuperProperty', PyJs_getSuperProperty_729_) + @Js + def PyJs_replace_731_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'replace':PyJs_replace_731_}, var) + var.registers([]) + var.get(u"this").get(u'methodPath').callprop(u'traverse', var.get(u'visitor'), var.get(u"this")) + PyJs_replace_731_._set_name(u'replace') + var.get(u'ReplaceSupers').get(u'prototype').put(u'replace', PyJs_replace_731_) + @Js + def PyJs_getLooseSuperProperty_732_(id, parent, this, arguments, var=var): + var = Scope({u'this':this, u'getLooseSuperProperty':PyJs_getLooseSuperProperty_732_, u'id':id, u'parent':parent, u'arguments':arguments}, var) + var.registers([u'methodNode', u'superRef', u'id', u'parent']) + var.put(u'methodNode', var.get(u"this").get(u'methodNode')) + var.put(u'superRef', (var.get(u"this").get(u'superRef') or var.get(u't').callprop(u'identifier', Js(u'Function')))) + if PyJsStrictEq(var.get(u'parent').get(u'property'),var.get(u'id')): + return var.get('undefined') + else: + PyJs_Object_733_ = Js({u'callee':var.get(u'id')}) + if var.get(u't').callprop(u'isCallExpression', var.get(u'parent'), PyJs_Object_733_): + return var.get('undefined') + else: + if (var.get(u't').callprop(u'isMemberExpression', var.get(u'parent')) and var.get(u'methodNode').get(u'static').neg()): + return var.get(u't').callprop(u'memberExpression', var.get(u'superRef'), var.get(u't').callprop(u'identifier', Js(u'prototype'))) + else: + return var.get(u'superRef') + PyJs_getLooseSuperProperty_732_._set_name(u'getLooseSuperProperty') + var.get(u'ReplaceSupers').get(u'prototype').put(u'getLooseSuperProperty', PyJs_getLooseSuperProperty_732_) + @Js + def PyJs_looseHandle_734_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'looseHandle':PyJs_looseHandle_734_}, var) + var.registers([u'node', u'path', u'callee']) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'path').callprop(u'isSuper'): + return var.get(u"this").callprop(u'getLooseSuperProperty', var.get(u'node'), var.get(u'path').get(u'parent')) + else: + if var.get(u'path').callprop(u'isCallExpression'): + var.put(u'callee', var.get(u'node').get(u'callee')) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'callee')).neg(): + return var.get('undefined') + if var.get(u't').callprop(u'isSuper', var.get(u'callee').get(u'object')).neg(): + return var.get('undefined') + var.get(u't').callprop(u'appendToMemberExpression', var.get(u'callee'), var.get(u't').callprop(u'identifier', Js(u'call'))) + var.get(u'node').get(u'arguments').callprop(u'unshift', var.get(u't').callprop(u'thisExpression')) + return var.get(u'true') + PyJs_looseHandle_734_._set_name(u'looseHandle') + var.get(u'ReplaceSupers').get(u'prototype').put(u'looseHandle', PyJs_looseHandle_734_) + @Js + def PyJs_specHandleAssignmentExpression_735_(ref, path, node, this, arguments, var=var): + var = Scope({u'node':node, u'specHandleAssignmentExpression':PyJs_specHandleAssignmentExpression_735_, u'this':this, u'arguments':arguments, u'path':path, u'ref':ref}, var) + var.registers([u'node', u'path', u'ref']) + if PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'=')): + return var.get(u"this").callprop(u'setSuperProperty', var.get(u'node').get(u'left').get(u'property'), var.get(u'node').get(u'right'), var.get(u'node').get(u'left').get(u'computed')) + else: + var.put(u'ref', (var.get(u'ref') or var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref')))) + return Js([var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'ref'), var.get(u'node').get(u'left'))])), var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'node').get(u'left'), var.get(u't').callprop(u'binaryExpression', var.get(u'node').get(u'operator').get(u'0'), var.get(u'ref'), var.get(u'node').get(u'right'))))]) + PyJs_specHandleAssignmentExpression_735_._set_name(u'specHandleAssignmentExpression') + var.get(u'ReplaceSupers').get(u'prototype').put(u'specHandleAssignmentExpression', PyJs_specHandleAssignmentExpression_735_) + @Js + def PyJs_specHandle_736_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'specHandle':PyJs_specHandle_736_}, var) + var.registers([u'node', u'binary', u'superProperty', u'computed', u'parent', u'ref', u'args', u'path', u'property', u'callee']) + var.put(u'property', PyJsComma(Js(0.0), Js(None))) + var.put(u'computed', PyJsComma(Js(0.0), Js(None))) + var.put(u'args', PyJsComma(Js(0.0), Js(None))) + var.put(u'parent', var.get(u'path').get(u'parent')) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'isIllegalBareSuper')(var.get(u'node'), var.get(u'parent')): + PyJsTempException = JsToPyException(var.get(u'path').callprop(u'buildCodeFrameError', var.get(u'messages').callprop(u'get', Js(u'classesIllegalBareSuper')))) + raise PyJsTempException + if var.get(u't').callprop(u'isCallExpression', var.get(u'node')): + var.put(u'callee', var.get(u'node').get(u'callee')) + if var.get(u't').callprop(u'isSuper', var.get(u'callee')): + return var.get('undefined') + else: + if var.get(u'isMemberExpressionSuper')(var.get(u'callee')): + var.put(u'property', var.get(u'callee').get(u'property')) + var.put(u'computed', var.get(u'callee').get(u'computed')) + var.put(u'args', var.get(u'node').get(u'arguments')) + else: + if (var.get(u't').callprop(u'isMemberExpression', var.get(u'node')) and var.get(u't').callprop(u'isSuper', var.get(u'node').get(u'object'))): + var.put(u'property', var.get(u'node').get(u'property')) + var.put(u'computed', var.get(u'node').get(u'computed')) + else: + if (var.get(u't').callprop(u'isUpdateExpression', var.get(u'node')) and var.get(u'isMemberExpressionSuper')(var.get(u'node').get(u'argument'))): + var.put(u'binary', var.get(u't').callprop(u'binaryExpression', var.get(u'node').get(u'operator').get(u'0'), var.get(u'node').get(u'argument'), var.get(u't').callprop(u'numericLiteral', Js(1.0)))) + if var.get(u'node').get(u'prefix'): + return var.get(u"this").callprop(u'specHandleAssignmentExpression', var.get(u"null"), var.get(u'path'), var.get(u'binary')) + else: + var.put(u'ref', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref'))) + return var.get(u"this").callprop(u'specHandleAssignmentExpression', var.get(u'ref'), var.get(u'path'), var.get(u'binary')).callprop(u'concat', var.get(u't').callprop(u'expressionStatement', var.get(u'ref'))) + else: + if (var.get(u't').callprop(u'isAssignmentExpression', var.get(u'node')) and var.get(u'isMemberExpressionSuper')(var.get(u'node').get(u'left'))): + return var.get(u"this").callprop(u'specHandleAssignmentExpression', var.get(u"null"), var.get(u'path'), var.get(u'node')) + if var.get(u'property').neg(): + return var.get('undefined') + var.put(u'superProperty', var.get(u"this").callprop(u'getSuperProperty', var.get(u'property'), var.get(u'computed'))) + if var.get(u'args'): + return var.get(u"this").callprop(u'optimiseCall', var.get(u'superProperty'), var.get(u'args')) + else: + return var.get(u'superProperty') + PyJs_specHandle_736_._set_name(u'specHandle') + var.get(u'ReplaceSupers').get(u'prototype').put(u'specHandle', PyJs_specHandle_736_) + @Js + def PyJs_optimiseCall_737_(callee, args, this, arguments, var=var): + var = Scope({u'this':this, u'args':args, u'callee':callee, u'arguments':arguments, u'optimiseCall':PyJs_optimiseCall_737_}, var) + var.registers([u'thisNode', u'args', u'callee']) + var.put(u'thisNode', var.get(u't').callprop(u'thisExpression')) + var.get(u'thisNode').put(var.get(u'HARDCORE_THIS_REF'), var.get(u'true')) + return PyJsComma(Js(0.0),var.get(u'_babelHelperOptimiseCallExpression2').get(u'default'))(var.get(u'callee'), var.get(u'thisNode'), var.get(u'args')) + PyJs_optimiseCall_737_._set_name(u'optimiseCall') + var.get(u'ReplaceSupers').get(u'prototype').put(u'optimiseCall', PyJs_optimiseCall_737_) + return var.get(u'ReplaceSupers') + PyJs_anonymous_725_._set_name(u'anonymous') + var.put(u'ReplaceSupers', PyJs_anonymous_725_()) + var.get(u'exports').put(u'default', var.get(u'ReplaceSupers')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_714_._set_name(u'anonymous') +PyJs_Object_738_ = Js({u'babel-helper-optimise-call-expression':Js(52.0),u'babel-messages':Js(57.0),u'babel-runtime/core-js/symbol':Js(105.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_739_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'_babelTemplate', u'module', u'helpers', u'_interopRequireDefault', u'_babelTemplate2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_740_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_740_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + pass + PyJs_Object_741_ = Js({}) + var.put(u'helpers', PyJs_Object_741_) + var.get(u'exports').put(u'default', var.get(u'helpers')) + def PyJs_LONG_742_(var=var): + return var.get(u'helpers').put(u'typeof', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (typeof Symbol === "function" && typeof Symbol.iterator === "symbol")\n ? function (obj) { return typeof obj; }\n : function (obj) {\n return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype\n ? "symbol"\n : typeof obj;\n };\n'))) + PyJs_LONG_742_() + def PyJs_LONG_743_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function () {\n var REACT_ELEMENT_TYPE = (typeof Symbol === "function" && Symbol.for && Symbol.for("react.element")) || 0xeac7;\n\n return function createRawReactElement (type, props, key, children) {\n var defaultProps = type && type.defaultProps;\n var childrenLength = arguments.length - 3;\n\n if (!props && childrenLength !== 0) {\n // If we\'re going to assign props.children, we create a new object now\n // to avoid mutating defaultProps.\n props = {};\n }\n if (props && defaultProps) {\n for (var propName in defaultProps) {\n if (props[propName] === void 0) {\n props[propName] = defaultProps[propName];\n }\n }\n } else if (!props) {\n props = defaultProps || {};\n }\n\n if (childrenLength === 1) {\n props.children = children;\n } else if (childrenLength > 1) {\n var childArray = Array(childrenLength);\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 3];\n }\n props.children = childArray;\n }\n\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key === undefined ? null : \'\' + key,\n ref: null,\n props: props,\n _owner: null,\n };\n };\n\n })()\n')) + var.get(u'helpers').put(u'jsx', PyJs_LONG_743_()) + def PyJs_LONG_744_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (iterable) {\n if (typeof Symbol === "function") {\n if (Symbol.asyncIterator) {\n var method = iterable[Symbol.asyncIterator];\n if (method != null) return method.call(iterable);\n }\n if (Symbol.iterator) {\n return iterable[Symbol.iterator]();\n }\n }\n throw new TypeError("Object is not async iterable");\n })\n')) + var.get(u'helpers').put(u'asyncIterator', PyJs_LONG_744_()) + def PyJs_LONG_745_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function () {\n function AwaitValue(value) {\n this.value = value;\n }\n\n function AsyncGenerator(gen) {\n var front, back;\n\n function send(key, arg) {\n return new Promise(function (resolve, reject) {\n var request = {\n key: key,\n arg: arg,\n resolve: resolve,\n reject: reject,\n next: null\n };\n\n if (back) {\n back = back.next = request;\n } else {\n front = back = request;\n resume(key, arg);\n }\n });\n }\n\n function resume(key, arg) {\n try {\n var result = gen[key](arg)\n var value = result.value;\n if (value instanceof AwaitValue) {\n Promise.resolve(value.value).then(\n function (arg) { resume("next", arg); },\n function (arg) { resume("throw", arg); });\n } else {\n settle(result.done ? "return" : "normal", result.value);\n }\n } catch (err) {\n settle("throw", err);\n }\n }\n\n function settle(type, value) {\n switch (type) {\n case "return":\n front.resolve({ value: value, done: true });\n break;\n case "throw":\n front.reject(value);\n break;\n default:\n front.resolve({ value: value, done: false });\n break;\n }\n\n front = front.next;\n if (front) {\n resume(front.key, front.arg);\n } else {\n back = null;\n }\n }\n\n this._invoke = send;\n\n // Hide "return" method if generator return is not supported\n if (typeof gen.return !== "function") {\n this.return = undefined;\n }\n }\n\n if (typeof Symbol === "function" && Symbol.asyncIterator) {\n AsyncGenerator.prototype[Symbol.asyncIterator] = function () { return this; };\n }\n\n AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); };\n AsyncGenerator.prototype.throw = function (arg) { return this._invoke("throw", arg); };\n AsyncGenerator.prototype.return = function (arg) { return this._invoke("return", arg); };\n\n return {\n wrap: function (fn) {\n return function () {\n return new AsyncGenerator(fn.apply(this, arguments));\n };\n },\n await: function (value) {\n return new AwaitValue(value);\n }\n };\n\n })()\n')) + var.get(u'helpers').put(u'asyncGenerator', PyJs_LONG_745_()) + def PyJs_LONG_746_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (inner, awaitWrap) {\n var iter = {}, waiting = false;\n\n function pump(key, value) {\n waiting = true;\n value = new Promise(function (resolve) { resolve(inner[key](value)); });\n return { done: false, value: awaitWrap(value) };\n };\n\n if (typeof Symbol === "function" && Symbol.iterator) {\n iter[Symbol.iterator] = function () { return this; };\n }\n\n iter.next = function (value) {\n if (waiting) {\n waiting = false;\n return value;\n }\n return pump("next", value);\n };\n\n if (typeof inner.throw === "function") {\n iter.throw = function (value) {\n if (waiting) {\n waiting = false;\n throw value;\n }\n return pump("throw", value);\n };\n }\n\n if (typeof inner.return === "function") {\n iter.return = function (value) {\n return pump("return", value);\n };\n }\n\n return iter;\n })\n')) + var.get(u'helpers').put(u'asyncGeneratorDelegate', PyJs_LONG_746_()) + def PyJs_LONG_747_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (fn) {\n return function () {\n var gen = fn.apply(this, arguments);\n return new Promise(function (resolve, reject) {\n function step(key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n return Promise.resolve(value).then(function (value) {\n step("next", value);\n }, function (err) {\n step("throw", err);\n });\n }\n }\n\n return step("next");\n });\n };\n })\n')) + var.get(u'helpers').put(u'asyncToGenerator', PyJs_LONG_747_()) + var.get(u'helpers').put(u'classCallCheck', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n });\n'))) + def PyJs_LONG_748_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function() {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i ++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ("value" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n })()\n')) + var.get(u'helpers').put(u'createClass', PyJs_LONG_748_()) + var.get(u'helpers').put(u'defineEnumerableProperties', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (obj, descs) {\n for (var key in descs) {\n var desc = descs[key];\n desc.configurable = desc.enumerable = true;\n if ("value" in desc) desc.writable = true;\n Object.defineProperty(obj, key, desc);\n }\n return obj;\n })\n'))) + def PyJs_LONG_749_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = Object.getOwnPropertyDescriptor(defaults, key);\n if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }\n return obj;\n })\n')) + var.get(u'helpers').put(u'defaults', PyJs_LONG_749_()) + def PyJs_LONG_750_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (obj, key, value) {\n // Shortcircuit the slow defineProperty path when possible.\n // We are trying to avoid issues where setters defined on the\n // prototype cause side effects under the fast path of simple\n // assignment. By checking for existence of the property with\n // the in operator, we can optimize most of this overhead away.\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n });\n')) + var.get(u'helpers').put(u'defineProperty', PyJs_LONG_750_()) + def PyJs_LONG_751_(var=var): + return var.get(u'helpers').put(u'extends', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n Object.assign || (function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n })\n'))) + PyJs_LONG_751_() + def PyJs_LONG_752_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if ("value" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n });\n')) + var.get(u'helpers').put(u'get', PyJs_LONG_752_()) + def PyJs_LONG_753_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (subClass, superClass) {\n if (typeof superClass !== "function" && superClass !== null) {\n throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n })\n')) + var.get(u'helpers').put(u'inherits', PyJs_LONG_753_()) + var.get(u'helpers').put(u'instanceof', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (left, right) {\n if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {\n return right[Symbol.hasInstance](left);\n } else {\n return left instanceof right;\n }\n });\n'))) + var.get(u'helpers').put(u'interopRequireDefault', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n })\n'))) + def PyJs_LONG_754_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (obj) {\n if (obj && obj.__esModule) {\n return obj;\n } else {\n var newObj = {};\n if (obj != null) {\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];\n }\n }\n newObj.default = obj;\n return newObj;\n }\n })\n')) + var.get(u'helpers').put(u'interopRequireWildcard', PyJs_LONG_754_()) + var.get(u'helpers').put(u'newArrowCheck', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (innerThis, boundThis) {\n if (innerThis !== boundThis) {\n throw new TypeError("Cannot instantiate an arrow function");\n }\n });\n'))) + var.get(u'helpers').put(u'objectDestructuringEmpty', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (obj) {\n if (obj == null) throw new TypeError("Cannot destructure undefined");\n });\n'))) + var.get(u'helpers').put(u'objectWithoutProperties', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (obj, keys) {\n var target = {};\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n return target;\n })\n'))) + var.get(u'helpers').put(u'possibleConstructorReturn', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (self, call) {\n if (!self) {\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n }\n return call && (typeof call === "object" || typeof call === "function") ? call : self;\n });\n'))) + var.get(u'helpers').put(u'selfGlobal', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n typeof global === "undefined" ? self : global\n'))) + def PyJs_LONG_755_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function set(object, property, value, receiver) {\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent !== null) {\n set(parent, property, value, receiver);\n }\n } else if ("value" in desc && desc.writable) {\n desc.value = value;\n } else {\n var setter = desc.set;\n\n if (setter !== undefined) {\n setter.call(receiver, value);\n }\n }\n\n return value;\n });\n')) + var.get(u'helpers').put(u'set', PyJs_LONG_755_()) + def PyJs_LONG_756_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function () {\n // Broken out into a separate function to avoid deoptimizations due to the try/catch for the\n // array iterator case.\n function sliceIterator(arr, i) {\n // this is an expanded form of `for...of` that properly supports abrupt completions of\n // iterators etc. variable names have been minimised to reduce the size of this massive\n // helper. sometimes spec compliancy is annoying :(\n //\n // _n = _iteratorNormalCompletion\n // _d = _didIteratorError\n // _e = _iteratorError\n // _i = _iterator\n // _s = _step\n\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i["return"]) _i["return"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n }\n\n return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError("Invalid attempt to destructure non-iterable instance");\n }\n };\n })();\n')) + var.get(u'helpers').put(u'slicedToArray', PyJs_LONG_756_()) + def PyJs_LONG_757_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n var _arr = [];\n for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {\n _arr.push(_step.value);\n if (i && _arr.length === i) break;\n }\n return _arr;\n } else {\n throw new TypeError("Invalid attempt to destructure non-iterable instance");\n }\n });\n')) + var.get(u'helpers').put(u'slicedToArrayLoose', PyJs_LONG_757_()) + var.get(u'helpers').put(u'taggedTemplateLiteral', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (strings, raw) {\n return Object.freeze(Object.defineProperties(strings, {\n raw: { value: Object.freeze(raw) }\n }));\n });\n'))) + var.get(u'helpers').put(u'taggedTemplateLiteralLoose', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (strings, raw) {\n strings.raw = raw;\n return strings;\n });\n'))) + var.get(u'helpers').put(u'temporalRef', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (val, name, undef) {\n if (val === undef) {\n throw new ReferenceError(name + " is not defined - temporal dead zone");\n } else {\n return val;\n }\n })\n'))) + var.get(u'helpers').put(u'temporalUndefined', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n ({})\n'))) + var.get(u'helpers').put(u'toArray', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (arr) {\n return Array.isArray(arr) ? arr : Array.from(arr);\n });\n'))) + var.get(u'helpers').put(u'toConsumableArray', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n return arr2;\n } else {\n return Array.from(arr);\n }\n });\n'))) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_739_._set_name(u'anonymous') +PyJs_Object_758_ = Js({u'babel-template':Js(221.0)}) +@Js +def PyJs_anonymous_759_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'get', u'_helpers2', u'require', u'list', u'_helpers', u'_keys2', u'_keys', u'module', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_760_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_760_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_get_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name', u'fn']) + var.put(u'fn', var.get(u'_helpers2').get(u'default').get(var.get(u'name'))) + if var.get(u'fn').neg(): + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create((Js(u'Unknown helper ')+var.get(u'name')))) + raise PyJsTempException + return var.get(u'fn')().get(u'expression') + PyJsHoisted_get_.func_name = u'get' + var.put(u'get', PyJsHoisted_get_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'list', var.get(u'undefined')) + var.put(u'_keys', var.get(u'require')(Js(u'babel-runtime/core-js/object/keys'))) + var.put(u'_keys2', var.get(u'_interopRequireDefault')(var.get(u'_keys'))) + var.get(u'exports').put(u'get', var.get(u'get')) + var.put(u'_helpers', var.get(u'require')(Js(u'./helpers'))) + var.put(u'_helpers2', var.get(u'_interopRequireDefault')(var.get(u'_helpers'))) + pass + pass + @Js + def PyJs_anonymous_761_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return PyJsStrictNeq(var.get(u'name'),Js(u'__esModule')) + PyJs_anonymous_761_._set_name(u'anonymous') + @Js + def PyJs_anonymous_762_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return (var.get(u'name').callprop(u'slice', Js(1.0)) if PyJsStrictEq(var.get(u'name').get(u'0'),Js(u'_')) else var.get(u'name')) + PyJs_anonymous_762_._set_name(u'anonymous') + var.put(u'list', var.get(u'exports').put(u'list', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'_helpers2').get(u'default')).callprop(u'map', PyJs_anonymous_762_).callprop(u'filter', PyJs_anonymous_761_))) + var.get(u'exports').put(u'default', var.get(u'get')) +PyJs_anonymous_759_._set_name(u'anonymous') +PyJs_Object_763_ = Js({u'./helpers':Js(55.0),u'babel-runtime/core-js/object/keys':Js(103.0)}) +@Js +def PyJs_anonymous_764_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_stringify2', u'_interopRequireWildcard', u'get', u'require', u'parseArgs', u'MESSAGES', u'_util', u'util', u'_stringify', u'module', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_766_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_766_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_parseArgs_(args, this, arguments, var=var): + var = Scope({u'this':this, u'args':args, u'arguments':arguments}, var) + var.registers([u'args']) + @Js + def PyJs_anonymous_769_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + if ((var.get(u'val')!=var.get(u"null")) and var.get(u'val').get(u'inspect')): + return var.get(u'val').callprop(u'inspect') + else: + try: + return (PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'val')) or (var.get(u'val')+Js(u''))) + except PyJsException as PyJsTempException: + PyJsHolder_65_98138155 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + return var.get(u'util').callprop(u'inspect', var.get(u'val')) + finally: + if PyJsHolder_65_98138155 is not None: + var.own[u'e'] = PyJsHolder_65_98138155 + else: + del var.own[u'e'] + del PyJsHolder_65_98138155 + PyJs_anonymous_769_._set_name(u'anonymous') + return var.get(u'args').callprop(u'map', PyJs_anonymous_769_) + PyJsHoisted_parseArgs_.func_name = u'parseArgs' + var.put(u'parseArgs', PyJsHoisted_parseArgs_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_765_ = Js({}) + var.put(u'newObj', PyJs_Object_765_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_get_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'_len', u'_key', u'args', u'key', u'msg']) + #for JS loop + var.put(u'_len', var.get(u'arguments').get(u'length')) + var.put(u'args', var.get(u'Array')(((var.get(u'_len')-Js(1.0)) if (var.get(u'_len')>Js(1.0)) else Js(0.0)))) + var.put(u'_key', Js(1.0)) + while (var.get(u'_key')<var.get(u'_len')): + try: + var.get(u'args').put((var.get(u'_key')-Js(1.0)), var.get(u'arguments').get(var.get(u'_key'))) + finally: + (var.put(u'_key',Js(var.get(u'_key').to_number())+Js(1))-Js(1)) + var.put(u'msg', var.get(u'MESSAGES').get(var.get(u'key'))) + if var.get(u'msg').neg(): + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create((Js(u'Unknown message ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'key'))))) + raise PyJsTempException + var.put(u'args', var.get(u'parseArgs')(var.get(u'args'))) + @Js + def PyJs_anonymous_768_(str, i, this, arguments, var=var): + var = Scope({u'i':i, u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'i', u'str']) + return var.get(u'args').get((var.get(u'i')-Js(1.0))) + PyJs_anonymous_768_._set_name(u'anonymous') + return var.get(u'msg').callprop(u'replace', JsRegExp(u'/\\$(\\d+)/g'), PyJs_anonymous_768_) + PyJsHoisted_get_.func_name = u'get' + var.put(u'get', PyJsHoisted_get_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'MESSAGES', var.get(u'undefined')) + var.put(u'_stringify', var.get(u'require')(Js(u'babel-runtime/core-js/json/stringify'))) + var.put(u'_stringify2', var.get(u'_interopRequireDefault')(var.get(u'_stringify'))) + var.get(u'exports').put(u'get', var.get(u'get')) + var.get(u'exports').put(u'parseArgs', var.get(u'parseArgs')) + var.put(u'_util', var.get(u'require')(Js(u'util'))) + var.put(u'util', var.get(u'_interopRequireWildcard')(var.get(u'_util'))) + pass + pass + PyJs_Object_767_ = Js({u'tailCallReassignmentDeopt':Js(u"Function reference has been reassigned, so it will probably be dereferenced, therefore we can't optimise this with confidence"),u'classesIllegalBareSuper':Js(u'Illegal use of bare super'),u'classesIllegalSuperCall':Js(u'Direct super call is illegal in non-constructor, use super.$1() instead'),u'scopeDuplicateDeclaration':Js(u'Duplicate declaration $1'),u'settersNoRest':Js(u"Setters aren't allowed to have a rest"),u'noAssignmentsInForHead':Js(u'No assignments allowed in for-in/of head'),u'expectedMemberExpressionOrIdentifier':Js(u'Expected type MemberExpression or Identifier'),u'invalidParentForThisNode':Js(u"We don't know how to handle this node within the current parent - please open an issue"),u'readOnly':Js(u'$1 is read-only'),u'unknownForHead':Js(u'Unknown node type $1 in ForStatement'),u'didYouMean':Js(u'Did you mean $1?'),u'codeGeneratorDeopt':Js(u'Note: The code generator has deoptimised the styling of $1 as it exceeds the max of $2.'),u'missingTemplatesDirectory':Js(u'no templates directory - this is most likely the result of a broken `npm publish`. Please report to https://github.com/babel/babel/issues'),u'unsupportedOutputType':Js(u'Unsupported output type $1'),u'illegalMethodName':Js(u'Illegal method name $1'),u'lostTrackNodePath':Js(u"We lost track of this node's position, likely because the AST was directly manipulated"),u'modulesIllegalExportName':Js(u'Illegal export $1'),u'modulesDuplicateDeclarations':Js(u'Duplicate module declarations with the same source but in different scopes'),u'undeclaredVariable':Js(u'Reference to undeclared variable $1'),u'undeclaredVariableType':Js(u'Referencing a type alias outside of a type annotation'),u'undeclaredVariableSuggestion':Js(u'Reference to undeclared variable $1 - did you mean $2?'),u'traverseNeedsParent':Js(u'You must pass a scope and parentPath unless traversing a Program/File. Instead of that you tried to traverse a $1 node without passing scope and parentPath.'),u'traverseVerifyRootFunction':Js(u"You passed `traverse()` a function when it expected a visitor object, are you sure you didn't mean `{ enter: Function }`?"),u'traverseVerifyVisitorProperty':Js(u'You passed `traverse()` a visitor object with the property $1 that has the invalid property $2'),u'traverseVerifyNodeType':Js(u"You gave us a visitor for the node type $1 but it's not a valid type"),u'pluginNotObject':Js(u'Plugin $2 specified in $1 was expected to return an object when invoked but returned $3'),u'pluginNotFunction':Js(u'Plugin $2 specified in $1 was expected to return a function but returned $3'),u'pluginUnknown':Js(u'Unknown plugin $1 specified in $2 at $3, attempted to resolve relative to $4'),u'pluginInvalidProperty':Js(u'Plugin $2 specified in $1 provided an invalid property of $3')}) + var.put(u'MESSAGES', var.get(u'exports').put(u'MESSAGES', PyJs_Object_767_)) + pass + pass +PyJs_anonymous_764_._set_name(u'anonymous') +PyJs_Object_770_ = Js({u'babel-runtime/core-js/json/stringify':Js(97.0),u'util':Js(534.0)}) +@Js +def PyJs_anonymous_771_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_776_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_776_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_772_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u'messages']) + var.put(u'messages', var.get(u'_ref').get(u'messages')) + @Js + def PyJs_Scope_775_(_ref2, this, arguments, var=var): + var = Scope({u'this':this, u'Scope':PyJs_Scope_775_, u'_ref2':_ref2, u'arguments':arguments}, var) + var.registers([u'_isArray', u'_iterator', u'name', u'violation', u'_ref3', u'binding', u'_ref2', u'_i', u'scope']) + var.put(u'scope', var.get(u'_ref2').get(u'scope')) + for PyJsTemp in var.get(u'scope').get(u'bindings'): + var.put(u'name', PyJsTemp) + var.put(u'binding', var.get(u'scope').get(u'bindings').get(var.get(u'name'))) + if (PyJsStrictNeq(var.get(u'binding').get(u'kind'),Js(u'const')) and PyJsStrictNeq(var.get(u'binding').get(u'kind'),Js(u'module'))): + continue + #for JS loop + var.put(u'_iterator', var.get(u'binding').get(u'constantViolations')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i').get(u'value')) + var.put(u'violation', var.get(u'_ref3')) + PyJsTempException = JsToPyException(var.get(u'violation').callprop(u'buildCodeFrameError', var.get(u'messages').callprop(u'get', Js(u'readOnly'), var.get(u'name')))) + raise PyJsTempException + + PyJs_Scope_775_._set_name(u'Scope') + PyJs_Object_774_ = Js({u'Scope':PyJs_Scope_775_}) + PyJs_Object_773_ = Js({u'visitor':PyJs_Object_774_}) + return PyJs_Object_773_ + PyJs_anonymous_772_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_772_) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_771_._set_name(u'anonymous') +PyJs_Object_777_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_778_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_779_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u't']) + var.put(u't', var.get(u'_ref').get(u'types')) + @Js + def PyJs_ArrowFunctionExpression_782_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'ArrowFunctionExpression':PyJs_ArrowFunctionExpression_782_}, var) + var.registers([u'node', u'path', u'state', u'boundThis']) + if var.get(u'state').get(u'opts').get(u'spec'): + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'node').get(u'shadow'): + return var.get('undefined') + PyJs_Object_783_ = Js({u'this':Js(False)}) + var.get(u'node').put(u'shadow', PyJs_Object_783_) + var.get(u'node').put(u'type', Js(u'FunctionExpression')) + var.put(u'boundThis', var.get(u't').callprop(u'thisExpression')) + var.get(u'boundThis').put(u'_forceShadow', var.get(u'path')) + var.get(u'path').callprop(u'ensureBlock') + var.get(u'path').callprop(u'get', Js(u'body')).callprop(u'unshiftContainer', Js(u'body'), var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u'state').callprop(u'addHelper', Js(u'newArrowCheck')), Js([var.get(u't').callprop(u'thisExpression'), var.get(u'boundThis')])))) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u'node'), var.get(u't').callprop(u'identifier', Js(u'bind'))), Js([var.get(u't').callprop(u'thisExpression')]))) + else: + var.get(u'path').callprop(u'arrowFunctionToShadowed') + PyJs_ArrowFunctionExpression_782_._set_name(u'ArrowFunctionExpression') + PyJs_Object_781_ = Js({u'ArrowFunctionExpression':PyJs_ArrowFunctionExpression_782_}) + PyJs_Object_780_ = Js({u'visitor':PyJs_Object_781_}) + return PyJs_Object_780_ + PyJs_anonymous_779_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_779_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_778_._set_name(u'anonymous') +PyJs_Object_784_ = Js({}) +@Js +def PyJs_anonymous_785_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_792_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_792_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_786_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u't', u'statementList']) + @Js + def PyJsHoisted_statementList_(key, path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'key':key}, var) + var.registers([u'key', u'paths', u'_isArray', u'_iterator', u'func', u'_ref2', u'declar', u'_i', u'path', u'_path']) + var.put(u'paths', var.get(u'path').callprop(u'get', var.get(u'key'))) + #for JS loop + var.put(u'_iterator', var.get(u'paths')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'_path', var.get(u'_ref2')) + var.put(u'func', var.get(u'_path').get(u'node')) + if var.get(u'_path').callprop(u'isFunctionDeclaration').neg(): + continue + var.put(u'declar', var.get(u't').callprop(u'variableDeclaration', Js(u'let'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'func').get(u'id'), var.get(u't').callprop(u'toExpression', var.get(u'func')))]))) + var.get(u'declar').put(u'_blockHoist', Js(2.0)) + var.get(u'func').put(u'id', var.get(u"null")) + var.get(u'_path').callprop(u'replaceWith', var.get(u'declar')) + + PyJsHoisted_statementList_.func_name = u'statementList' + var.put(u'statementList', PyJsHoisted_statementList_) + var.put(u't', var.get(u'_ref').get(u'types')) + pass + @Js + def PyJs_BlockStatement_789_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'BlockStatement':PyJs_BlockStatement_789_}, var) + var.registers([u'node', u'path', u'parent']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'parent', var.get(u'path').get(u'parent')) + PyJs_Object_790_ = Js({u'body':var.get(u'node')}) + if (var.get(u't').callprop(u'isFunction', var.get(u'parent'), PyJs_Object_790_) or var.get(u't').callprop(u'isExportDeclaration', var.get(u'parent'))): + return var.get('undefined') + var.get(u'statementList')(Js(u'body'), var.get(u'path')) + PyJs_BlockStatement_789_._set_name(u'BlockStatement') + @Js + def PyJs_SwitchCase_791_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'SwitchCase':PyJs_SwitchCase_791_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'statementList')(Js(u'consequent'), var.get(u'path')) + PyJs_SwitchCase_791_._set_name(u'SwitchCase') + PyJs_Object_788_ = Js({u'BlockStatement':PyJs_BlockStatement_789_,u'SwitchCase':PyJs_SwitchCase_791_}) + PyJs_Object_787_ = Js({u'visitor':PyJs_Object_788_}) + return PyJs_Object_787_ + PyJs_anonymous_786_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_786_) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_785_._set_name(u'anonymous') +PyJs_Object_793_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_794_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_symbol2', u'continuationVisitor', u'loopLabelVisitor', u'_babelTemplate', u'module', u'letReferenceFunctionVisitor', u'isVar', u'_interopRequireDefault', u'loopNodeTo', u'_extend', u'_babelTraverse', u'convertBlockScopedToVar', u'_tdz', u'BlockScoping', u'ignoreBlock', u'hoistVarDeclarationsVisitor', u'_values2', u'_extend2', u'_create2', u'buildRetCheck', u'_classCallCheck3', u'_classCallCheck2', u'_create', u'exports', u'_babelTraverse2', u'_interopRequireWildcard', u'_babelTypes', u'_symbol', u'isBlockScoped', u'loopVisitor', u'require', u'_babelTemplate2', u't', u'_values', u'letReferenceBlockVisitor']) + @Js + def PyJsHoisted_convertBlockScopedToVar_(path, node, parent, scope, this, arguments, var=var): + var = Scope({u'node':node, u'arguments':arguments, u'parent':parent, u'scope':scope, u'this':this, u'path':path}, var) + var.registers([u'node', u'name', u'moveBindingsToParent', u'i', u'binding', u'ids', u'declar', u'parent', u'parentScope', u'path', u'scope']) + var.put(u'moveBindingsToParent', (var.get(u'arguments').get(u'4') if ((var.get(u'arguments').get(u'length')>Js(4.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'4'),var.get(u'undefined'))) else Js(False))) + if var.get(u'node').neg(): + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u't').callprop(u'isFor', var.get(u'parent')).neg(): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'node').get(u'declarations').get(u'length')): + try: + var.put(u'declar', var.get(u'node').get(u'declarations').get(var.get(u'i'))) + var.get(u'declar').put(u'init', (var.get(u'declar').get(u'init') or var.get(u'scope').callprop(u'buildUndefinedNode'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.get(u'node').put(var.get(u't').get(u'BLOCK_SCOPED_SYMBOL'), var.get(u'true')) + var.get(u'node').put(u'kind', Js(u'var')) + if var.get(u'moveBindingsToParent'): + var.put(u'parentScope', var.get(u'scope').callprop(u'getFunctionParent')) + var.put(u'ids', var.get(u'path').callprop(u'getBindingIdentifiers')) + for PyJsTemp in var.get(u'ids'): + var.put(u'name', PyJsTemp) + var.put(u'binding', var.get(u'scope').callprop(u'getOwnBinding', var.get(u'name'))) + if var.get(u'binding'): + var.get(u'binding').put(u'kind', Js(u'var')) + var.get(u'scope').callprop(u'moveBindingTo', var.get(u'name'), var.get(u'parentScope')) + PyJsHoisted_convertBlockScopedToVar_.func_name = u'convertBlockScopedToVar' + var.put(u'convertBlockScopedToVar', PyJsHoisted_convertBlockScopedToVar_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_802_ = Js({}) + var.put(u'newObj', PyJs_Object_802_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_ignoreBlock_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u't').callprop(u'isLoop', var.get(u'path').get(u'parent')) or var.get(u't').callprop(u'isCatchClause', var.get(u'path').get(u'parent'))) + PyJsHoisted_ignoreBlock_.func_name = u'ignoreBlock' + var.put(u'ignoreBlock', PyJsHoisted_ignoreBlock_) + @Js + def PyJsHoisted_loopNodeTo_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u't').callprop(u'isBreakStatement', var.get(u'node')): + return Js(u'break') + else: + if var.get(u't').callprop(u'isContinueStatement', var.get(u'node')): + return Js(u'continue') + PyJsHoisted_loopNodeTo_.func_name = u'loopNodeTo' + var.put(u'loopNodeTo', PyJsHoisted_loopNodeTo_) + @Js + def PyJsHoisted_isVar_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + PyJs_Object_804_ = Js({u'kind':Js(u'var')}) + return (var.get(u't').callprop(u'isVariableDeclaration', var.get(u'node'), PyJs_Object_804_) and var.get(u'isBlockScoped')(var.get(u'node')).neg()) + PyJsHoisted_isVar_.func_name = u'isVar' + var.put(u'isVar', PyJsHoisted_isVar_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_803_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_803_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_isBlockScoped_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'node')).neg(): + return Js(False) + if var.get(u'node').get(var.get(u't').get(u'BLOCK_SCOPED_SYMBOL')): + return var.get(u'true') + if (PyJsStrictNeq(var.get(u'node').get(u'kind'),Js(u'let')) and PyJsStrictNeq(var.get(u'node').get(u'kind'),Js(u'const'))): + return Js(False) + return var.get(u'true') + PyJsHoisted_isBlockScoped_.func_name = u'isBlockScoped' + var.put(u'isBlockScoped', PyJsHoisted_isBlockScoped_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_symbol', var.get(u'require')(Js(u'babel-runtime/core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + var.put(u'_create', var.get(u'require')(Js(u'babel-runtime/core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + @Js + def PyJs_anonymous_795_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_VariableDeclaration_798_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file, u'VariableDeclaration':PyJs_VariableDeclaration_798_}, var) + var.registers([u'node', u'decl', u'parent', u'i', u'file', u'path', u'scope', u'nodes', u'assign']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'parent', var.get(u'path').get(u'parent')) + var.put(u'scope', var.get(u'path').get(u'scope')) + if var.get(u'isBlockScoped')(var.get(u'node')).neg(): + return var.get('undefined') + var.get(u'convertBlockScopedToVar')(var.get(u'path'), var.get(u"null"), var.get(u'parent'), var.get(u'scope'), var.get(u'true')) + if var.get(u'node').get(u'_tdzThis'): + var.put(u'nodes', Js([var.get(u'node')])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'node').get(u'declarations').get(u'length')): + try: + var.put(u'decl', var.get(u'node').get(u'declarations').get(var.get(u'i'))) + if var.get(u'decl').get(u'init'): + var.put(u'assign', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'decl').get(u'id'), var.get(u'decl').get(u'init'))) + var.get(u'assign').put(u'_ignoreBlockScopingTDZ', var.get(u'true')) + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u'assign'))) + var.get(u'decl').put(u'init', var.get(u'file').callprop(u'addHelper', Js(u'temporalUndefined'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.get(u'node').put(u'_blockHoist', Js(2.0)) + if var.get(u'path').callprop(u'isCompletionRecord'): + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u'scope').callprop(u'buildUndefinedNode'))) + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'nodes')) + PyJs_VariableDeclaration_798_._set_name(u'VariableDeclaration') + @Js + def PyJs_Loop_799_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Loop':PyJs_Loop_799_, u'arguments':arguments, u'file':file}, var) + var.registers([u'node', u'blockScoping', u'parent', u'replace', u'file', u'path', u'scope']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'parent', var.get(u'path').get(u'parent')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.get(u't').callprop(u'ensureBlock', var.get(u'node')) + var.put(u'blockScoping', var.get(u'BlockScoping').create(var.get(u'path'), var.get(u'path').callprop(u'get', Js(u'body')), var.get(u'parent'), var.get(u'scope'), var.get(u'file'))) + var.put(u'replace', var.get(u'blockScoping').callprop(u'run')) + if var.get(u'replace'): + var.get(u'path').callprop(u'replaceWith', var.get(u'replace')) + PyJs_Loop_799_._set_name(u'Loop') + @Js + def PyJs_CatchClause_800_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file, u'CatchClause':PyJs_CatchClause_800_}, var) + var.registers([u'scope', u'blockScoping', u'file', u'parent', u'path']) + var.put(u'parent', var.get(u'path').get(u'parent')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'blockScoping', var.get(u'BlockScoping').create(var.get(u"null"), var.get(u'path').callprop(u'get', Js(u'body')), var.get(u'parent'), var.get(u'scope'), var.get(u'file'))) + var.get(u'blockScoping').callprop(u'run') + PyJs_CatchClause_800_._set_name(u'CatchClause') + @Js + def PyJs_BlockStatementSwitchStatementProgram_801_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'BlockStatementSwitchStatementProgram':PyJs_BlockStatementSwitchStatementProgram_801_, u'arguments':arguments, u'file':file}, var) + var.registers([u'path', u'blockScoping', u'file']) + if var.get(u'ignoreBlock')(var.get(u'path')).neg(): + var.put(u'blockScoping', var.get(u'BlockScoping').create(var.get(u"null"), var.get(u'path'), var.get(u'path').get(u'parent'), var.get(u'path').get(u'scope'), var.get(u'file'))) + var.get(u'blockScoping').callprop(u'run') + PyJs_BlockStatementSwitchStatementProgram_801_._set_name(u'BlockStatementSwitchStatementProgram') + PyJs_Object_797_ = Js({u'VariableDeclaration':PyJs_VariableDeclaration_798_,u'Loop':PyJs_Loop_799_,u'CatchClause':PyJs_CatchClause_800_,u'BlockStatement|SwitchStatement|Program':PyJs_BlockStatementSwitchStatementProgram_801_}) + PyJs_Object_796_ = Js({u'visitor':PyJs_Object_797_}) + return PyJs_Object_796_ + PyJs_anonymous_795_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_795_) + var.put(u'_babelTraverse', var.get(u'require')(Js(u'babel-traverse'))) + var.put(u'_babelTraverse2', var.get(u'_interopRequireDefault')(var.get(u'_babelTraverse'))) + var.put(u'_tdz', var.get(u'require')(Js(u'./tdz'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_values', var.get(u'require')(Js(u'lodash/values'))) + var.put(u'_values2', var.get(u'_interopRequireDefault')(var.get(u'_values'))) + var.put(u'_extend', var.get(u'require')(Js(u'lodash/extend'))) + var.put(u'_extend2', var.get(u'_interopRequireDefault')(var.get(u'_extend'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + pass + pass + pass + var.put(u'buildRetCheck', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n if (typeof RETURN === "object") return RETURN.v;\n'))) + pass + pass + pass + @Js + def PyJs_Function_806_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'Function':PyJs_Function_806_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + var.get(u'path').callprop(u'traverse', var.get(u'letReferenceFunctionVisitor'), var.get(u'state')) + return var.get(u'path').callprop(u'skip') + PyJs_Function_806_._set_name(u'Function') + PyJs_Object_805_ = Js({u'Function':PyJs_Function_806_}) + var.put(u'letReferenceBlockVisitor', var.get(u'_babelTraverse2').get(u'default').get(u'visitors').callprop(u'merge', Js([PyJs_Object_805_, var.get(u'_tdz').get(u'visitor')]))) + @Js + def PyJs_ReferencedIdentifier_808_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_808_, u'arguments':arguments}, var) + var.registers([u'localBinding', u'path', u'state', u'ref']) + var.put(u'ref', var.get(u'state').get(u'letReferences').get(var.get(u'path').get(u'node').get(u'name'))) + if var.get(u'ref').neg(): + return var.get('undefined') + var.put(u'localBinding', var.get(u'path').get(u'scope').callprop(u'getBindingIdentifier', var.get(u'path').get(u'node').get(u'name'))) + if (var.get(u'localBinding') and PyJsStrictNeq(var.get(u'localBinding'),var.get(u'ref'))): + return var.get('undefined') + var.get(u'state').put(u'closurify', var.get(u'true')) + PyJs_ReferencedIdentifier_808_._set_name(u'ReferencedIdentifier') + PyJs_Object_807_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_808_}) + var.put(u'letReferenceFunctionVisitor', var.get(u'_babelTraverse2').get(u'default').get(u'visitors').callprop(u'merge', Js([PyJs_Object_807_, var.get(u'_tdz').get(u'visitor')]))) + @Js + def PyJs_enter_810_(path, self, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'self':self, u'arguments':arguments, u'enter':PyJs_enter_810_}, var) + var.registers([u'node', u'path', u'nodes', u'self', u'parent']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'parent', var.get(u'path').get(u'parent')) + if var.get(u'path').callprop(u'isForStatement'): + if var.get(u'isVar')(var.get(u'node').get(u'init'), var.get(u'node')): + var.put(u'nodes', var.get(u'self').callprop(u'pushDeclar', var.get(u'node').get(u'init'))) + if PyJsStrictEq(var.get(u'nodes').get(u'length'),Js(1.0)): + var.get(u'node').put(u'init', var.get(u'nodes').get(u'0')) + else: + var.get(u'node').put(u'init', var.get(u't').callprop(u'sequenceExpression', var.get(u'nodes'))) + else: + if var.get(u'path').callprop(u'isFor'): + if var.get(u'isVar')(var.get(u'node').get(u'left'), var.get(u'node')): + var.get(u'self').callprop(u'pushDeclar', var.get(u'node').get(u'left')) + var.get(u'node').put(u'left', var.get(u'node').get(u'left').get(u'declarations').get(u'0').get(u'id')) + else: + if var.get(u'isVar')(var.get(u'node'), var.get(u'parent')): + @Js + def PyJs_anonymous_811_(expr, this, arguments, var=var): + var = Scope({u'this':this, u'expr':expr, u'arguments':arguments}, var) + var.registers([u'expr']) + return var.get(u't').callprop(u'expressionStatement', var.get(u'expr')) + PyJs_anonymous_811_._set_name(u'anonymous') + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'self').callprop(u'pushDeclar', var.get(u'node')).callprop(u'map', PyJs_anonymous_811_)) + else: + if var.get(u'path').callprop(u'isFunction'): + return var.get(u'path').callprop(u'skip') + PyJs_enter_810_._set_name(u'enter') + PyJs_Object_809_ = Js({u'enter':PyJs_enter_810_}) + var.put(u'hoistVarDeclarationsVisitor', PyJs_Object_809_) + @Js + def PyJs_LabeledStatement_813_(_ref, state, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'LabeledStatement':PyJs_LabeledStatement_813_, u'state':state, u'arguments':arguments}, var) + var.registers([u'node', u'_ref', u'state']) + var.put(u'node', var.get(u'_ref').get(u'node')) + var.get(u'state').get(u'innerLabels').callprop(u'push', var.get(u'node').get(u'label').get(u'name')) + PyJs_LabeledStatement_813_._set_name(u'LabeledStatement') + PyJs_Object_812_ = Js({u'LabeledStatement':PyJs_LabeledStatement_813_}) + var.put(u'loopLabelVisitor', PyJs_Object_812_) + @Js + def PyJs_enter_815_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'enter':PyJs_enter_815_}, var) + var.registers([u'path', u'bindings', u'name', u'state']) + if (var.get(u'path').callprop(u'isAssignmentExpression') or var.get(u'path').callprop(u'isUpdateExpression')): + var.put(u'bindings', var.get(u'path').callprop(u'getBindingIdentifiers')) + for PyJsTemp in var.get(u'bindings'): + var.put(u'name', PyJsTemp) + if PyJsStrictNeq(var.get(u'state').get(u'outsideReferences').get(var.get(u'name')),var.get(u'path').get(u'scope').callprop(u'getBindingIdentifier', var.get(u'name'))): + continue + var.get(u'state').get(u'reassignments').put(var.get(u'name'), var.get(u'true')) + PyJs_enter_815_._set_name(u'enter') + PyJs_Object_814_ = Js({u'enter':PyJs_enter_815_}) + var.put(u'continuationVisitor', PyJs_Object_814_) + pass + @Js + def PyJs_Loop_817_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'Loop':PyJs_Loop_817_}, var) + var.registers([u'oldIgnoreLabeless', u'state', u'path']) + var.put(u'oldIgnoreLabeless', var.get(u'state').get(u'ignoreLabeless')) + var.get(u'state').put(u'ignoreLabeless', var.get(u'true')) + var.get(u'path').callprop(u'traverse', var.get(u'loopVisitor'), var.get(u'state')) + var.get(u'state').put(u'ignoreLabeless', var.get(u'oldIgnoreLabeless')) + var.get(u'path').callprop(u'skip') + PyJs_Loop_817_._set_name(u'Loop') + @Js + def PyJs_Function_818_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_818_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_Function_818_._set_name(u'Function') + @Js + def PyJs_SwitchCase_819_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'SwitchCase':PyJs_SwitchCase_819_}, var) + var.registers([u'oldInSwitchCase', u'state', u'path']) + var.put(u'oldInSwitchCase', var.get(u'state').get(u'inSwitchCase')) + var.get(u'state').put(u'inSwitchCase', var.get(u'true')) + var.get(u'path').callprop(u'traverse', var.get(u'loopVisitor'), var.get(u'state')) + var.get(u'state').put(u'inSwitchCase', var.get(u'oldInSwitchCase')) + var.get(u'path').callprop(u'skip') + PyJs_SwitchCase_819_._set_name(u'SwitchCase') + @Js + def PyJs_BreakStatementContinueStatementReturnStatement_820_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'BreakStatementContinueStatementReturnStatement':PyJs_BreakStatementContinueStatementReturnStatement_820_}, var) + var.registers([u'node', u'parent', u'loopText', u'replace', u'state', u'path', u'scope']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'parent', var.get(u'path').get(u'parent')) + var.put(u'scope', var.get(u'path').get(u'scope')) + if var.get(u'node').get(var.get(u"this").get(u'LOOP_IGNORE')): + return var.get('undefined') + var.put(u'replace', PyJsComma(Js(0.0), Js(None))) + var.put(u'loopText', var.get(u'loopNodeTo')(var.get(u'node'))) + if var.get(u'loopText'): + if var.get(u'node').get(u'label'): + if (var.get(u'state').get(u'innerLabels').callprop(u'indexOf', var.get(u'node').get(u'label').get(u'name'))>=Js(0.0)): + return var.get('undefined') + var.put(u'loopText', ((var.get(u'loopText')+Js(u'|'))+var.get(u'node').get(u'label').get(u'name'))) + else: + if var.get(u'state').get(u'ignoreLabeless'): + return var.get('undefined') + if var.get(u'state').get(u'inSwitchCase'): + return var.get('undefined') + if (var.get(u't').callprop(u'isBreakStatement', var.get(u'node')) and var.get(u't').callprop(u'isSwitchCase', var.get(u'parent'))): + return var.get('undefined') + var.get(u'state').put(u'hasBreakContinue', var.get(u'true')) + var.get(u'state').get(u'map').put(var.get(u'loopText'), var.get(u'node')) + var.put(u'replace', var.get(u't').callprop(u'stringLiteral', var.get(u'loopText'))) + if var.get(u'path').callprop(u'isReturnStatement'): + var.get(u'state').put(u'hasReturn', var.get(u'true')) + var.put(u'replace', var.get(u't').callprop(u'objectExpression', Js([var.get(u't').callprop(u'objectProperty', var.get(u't').callprop(u'identifier', Js(u'v')), (var.get(u'node').get(u'argument') or var.get(u'scope').callprop(u'buildUndefinedNode')))]))) + if var.get(u'replace'): + var.put(u'replace', var.get(u't').callprop(u'returnStatement', var.get(u'replace'))) + var.get(u'replace').put(var.get(u"this").get(u'LOOP_IGNORE'), var.get(u'true')) + var.get(u'path').callprop(u'skip') + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'inherits', var.get(u'replace'), var.get(u'node'))) + PyJs_BreakStatementContinueStatementReturnStatement_820_._set_name(u'BreakStatementContinueStatementReturnStatement') + PyJs_Object_816_ = Js({u'Loop':PyJs_Loop_817_,u'Function':PyJs_Function_818_,u'SwitchCase':PyJs_SwitchCase_819_,u'BreakStatement|ContinueStatement|ReturnStatement':PyJs_BreakStatementContinueStatementReturnStatement_820_}) + var.put(u'loopVisitor', PyJs_Object_816_) + @Js + def PyJs_anonymous_821_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'BlockScoping']) + @Js + def PyJsHoisted_BlockScoping_(loopPath, blockPath, parent, scope, file, this, arguments, var=var): + var = Scope({u'arguments':arguments, u'parent':parent, u'file':file, u'blockPath':blockPath, u'this':this, u'scope':scope, u'loopPath':loopPath}, var) + var.registers([u'scope', u'blockPath', u'file', u'parent', u'loopPath']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'BlockScoping')) + var.get(u"this").put(u'parent', var.get(u'parent')) + var.get(u"this").put(u'scope', var.get(u'scope')) + var.get(u"this").put(u'file', var.get(u'file')) + var.get(u"this").put(u'blockPath', var.get(u'blockPath')) + var.get(u"this").put(u'block', var.get(u'blockPath').get(u'node')) + var.get(u"this").put(u'outsideLetReferences', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.get(u"this").put(u'hasLetReferences', Js(False)) + var.get(u"this").put(u'letReferences', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.get(u"this").put(u'body', Js([])) + if var.get(u'loopPath'): + var.get(u"this").put(u'loopParent', var.get(u'loopPath').get(u'parent')) + var.get(u"this").put(u'loopLabel', (var.get(u't').callprop(u'isLabeledStatement', var.get(u"this").get(u'loopParent')) and var.get(u"this").get(u'loopParent').get(u'label'))) + var.get(u"this").put(u'loopPath', var.get(u'loopPath')) + var.get(u"this").put(u'loop', var.get(u'loopPath').get(u'node')) + PyJsHoisted_BlockScoping_.func_name = u'BlockScoping' + var.put(u'BlockScoping', PyJsHoisted_BlockScoping_) + pass + @Js + def PyJs_run_822_(this, arguments, var=var): + var = Scope({u'this':this, u'run':PyJs_run_822_, u'arguments':arguments}, var) + var.registers([u'needsClosure', u'block']) + var.put(u'block', var.get(u"this").get(u'block')) + if var.get(u'block').get(u'_letDone'): + return var.get('undefined') + var.get(u'block').put(u'_letDone', var.get(u'true')) + var.put(u'needsClosure', var.get(u"this").callprop(u'getLetReferences')) + if (var.get(u't').callprop(u'isFunction', var.get(u"this").get(u'parent')) or var.get(u't').callprop(u'isProgram', var.get(u"this").get(u'block'))): + var.get(u"this").callprop(u'updateScopeInfo') + return var.get('undefined') + if var.get(u"this").get(u'hasLetReferences').neg(): + return var.get('undefined') + if var.get(u'needsClosure'): + var.get(u"this").callprop(u'wrapClosure') + else: + var.get(u"this").callprop(u'remap') + var.get(u"this").callprop(u'updateScopeInfo') + if (var.get(u"this").get(u'loopLabel') and var.get(u't').callprop(u'isLabeledStatement', var.get(u"this").get(u'loopParent')).neg()): + return var.get(u't').callprop(u'labeledStatement', var.get(u"this").get(u'loopLabel'), var.get(u"this").get(u'loop')) + PyJs_run_822_._set_name(u'run') + var.get(u'BlockScoping').get(u'prototype').put(u'run', PyJs_run_822_) + @Js + def PyJs_updateScopeInfo_823_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'updateScopeInfo':PyJs_updateScopeInfo_823_}, var) + var.registers([u'letRefs', u'binding', u'key', u'parentScope', u'scope', u'ref']) + var.put(u'scope', var.get(u"this").get(u'scope')) + var.put(u'parentScope', var.get(u'scope').callprop(u'getFunctionParent')) + var.put(u'letRefs', var.get(u"this").get(u'letReferences')) + for PyJsTemp in var.get(u'letRefs'): + var.put(u'key', PyJsTemp) + var.put(u'ref', var.get(u'letRefs').get(var.get(u'key'))) + var.put(u'binding', var.get(u'scope').callprop(u'getBinding', var.get(u'ref').get(u'name'))) + if var.get(u'binding').neg(): + continue + if (PyJsStrictEq(var.get(u'binding').get(u'kind'),Js(u'let')) or PyJsStrictEq(var.get(u'binding').get(u'kind'),Js(u'const'))): + var.get(u'binding').put(u'kind', Js(u'var')) + var.get(u'scope').callprop(u'moveBindingTo', var.get(u'ref').get(u'name'), var.get(u'parentScope')) + PyJs_updateScopeInfo_823_._set_name(u'updateScopeInfo') + var.get(u'BlockScoping').get(u'prototype').put(u'updateScopeInfo', PyJs_updateScopeInfo_823_) + @Js + def PyJs_remap_824_(this, arguments, var=var): + var = Scope({u'this':this, u'remap':PyJs_remap_824_, u'arguments':arguments}, var) + var.registers([u'scope', u'ref', u'key', u'letRefs']) + var.put(u'letRefs', var.get(u"this").get(u'letReferences')) + var.put(u'scope', var.get(u"this").get(u'scope')) + for PyJsTemp in var.get(u'letRefs'): + var.put(u'key', PyJsTemp) + var.put(u'ref', var.get(u'letRefs').get(var.get(u'key'))) + if (var.get(u'scope').callprop(u'parentHasBinding', var.get(u'key')) or var.get(u'scope').callprop(u'hasGlobal', var.get(u'key'))): + if var.get(u'scope').callprop(u'hasOwnBinding', var.get(u'key')): + var.get(u'scope').callprop(u'rename', var.get(u'ref').get(u'name')) + if var.get(u"this").get(u'blockPath').get(u'scope').callprop(u'hasOwnBinding', var.get(u'key')): + var.get(u"this").get(u'blockPath').get(u'scope').callprop(u'rename', var.get(u'ref').get(u'name')) + PyJs_remap_824_._set_name(u'remap') + var.get(u'BlockScoping').get(u'prototype').put(u'remap', PyJs_remap_824_) + @Js + def PyJs_wrapClosure_825_(this, arguments, var=var): + var = Scope({u'this':this, u'wrapClosure':PyJs_wrapClosure_825_, u'arguments':arguments}, var) + var.registers([u'hasYield', u'name', u'call', u'args', u'hasAsync', u'ret', u'params', u'fn', u'outsideRefs', u'isSwitch', u'ref', u'id', u'block']) + var.put(u'block', var.get(u"this").get(u'block')) + var.put(u'outsideRefs', var.get(u"this").get(u'outsideLetReferences')) + if var.get(u"this").get(u'loop'): + for PyJsTemp in var.get(u'outsideRefs'): + var.put(u'name', PyJsTemp) + var.put(u'id', var.get(u'outsideRefs').get(var.get(u'name'))) + if (var.get(u"this").get(u'scope').callprop(u'hasGlobal', var.get(u'id').get(u'name')) or var.get(u"this").get(u'scope').callprop(u'parentHasBinding', var.get(u'id').get(u'name'))): + var.get(u'outsideRefs').delete(var.get(u'id').get(u'name')) + var.get(u"this").get(u'letReferences').delete(var.get(u'id').get(u'name')) + var.get(u"this").get(u'scope').callprop(u'rename', var.get(u'id').get(u'name')) + var.get(u"this").get(u'letReferences').put(var.get(u'id').get(u'name'), var.get(u'id')) + var.get(u'outsideRefs').put(var.get(u'id').get(u'name'), var.get(u'id')) + var.get(u"this").put(u'has', var.get(u"this").callprop(u'checkLoop')) + var.get(u"this").callprop(u'hoistVarDeclarations') + var.put(u'params', PyJsComma(Js(0.0),var.get(u'_values2').get(u'default'))(var.get(u'outsideRefs'))) + var.put(u'args', PyJsComma(Js(0.0),var.get(u'_values2').get(u'default'))(var.get(u'outsideRefs'))) + var.put(u'isSwitch', var.get(u"this").get(u'blockPath').callprop(u'isSwitchStatement')) + var.put(u'fn', var.get(u't').callprop(u'functionExpression', var.get(u"null"), var.get(u'params'), var.get(u't').callprop(u'blockStatement', (Js([var.get(u'block')]) if var.get(u'isSwitch') else var.get(u'block').get(u'body'))))) + var.get(u'fn').put(u'shadow', var.get(u'true')) + var.get(u"this").callprop(u'addContinuations', var.get(u'fn')) + var.put(u'ref', var.get(u'fn')) + if var.get(u"this").get(u'loop'): + var.put(u'ref', var.get(u"this").get(u'scope').callprop(u'generateUidIdentifier', Js(u'loop'))) + var.get(u"this").get(u'loopPath').callprop(u'insertBefore', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'ref'), var.get(u'fn'))]))) + var.put(u'call', var.get(u't').callprop(u'callExpression', var.get(u'ref'), var.get(u'args'))) + var.put(u'ret', var.get(u"this").get(u'scope').callprop(u'generateUidIdentifier', Js(u'ret'))) + var.put(u'hasYield', var.get(u'_babelTraverse2').get(u'default').callprop(u'hasType', var.get(u'fn').get(u'body'), var.get(u"this").get(u'scope'), Js(u'YieldExpression'), var.get(u't').get(u'FUNCTION_TYPES'))) + if var.get(u'hasYield'): + var.get(u'fn').put(u'generator', var.get(u'true')) + var.put(u'call', var.get(u't').callprop(u'yieldExpression', var.get(u'call'), var.get(u'true'))) + var.put(u'hasAsync', var.get(u'_babelTraverse2').get(u'default').callprop(u'hasType', var.get(u'fn').get(u'body'), var.get(u"this").get(u'scope'), Js(u'AwaitExpression'), var.get(u't').get(u'FUNCTION_TYPES'))) + if var.get(u'hasAsync'): + var.get(u'fn').put(u'async', var.get(u'true')) + var.put(u'call', var.get(u't').callprop(u'awaitExpression', var.get(u'call'))) + var.get(u"this").callprop(u'buildClosure', var.get(u'ret'), var.get(u'call')) + if var.get(u'isSwitch'): + var.get(u"this").get(u'blockPath').callprop(u'replaceWithMultiple', var.get(u"this").get(u'body')) + else: + var.get(u'block').put(u'body', var.get(u"this").get(u'body')) + PyJs_wrapClosure_825_._set_name(u'wrapClosure') + var.get(u'BlockScoping').get(u'prototype').put(u'wrapClosure', PyJs_wrapClosure_825_) + @Js + def PyJs_buildClosure_826_(ret, call, this, arguments, var=var): + var = Scope({u'this':this, u'buildClosure':PyJs_buildClosure_826_, u'call':call, u'arguments':arguments, u'ret':ret}, var) + var.registers([u'has', u'call', u'ret']) + var.put(u'has', var.get(u"this").get(u'has')) + if (var.get(u'has').get(u'hasReturn') or var.get(u'has').get(u'hasBreakContinue')): + var.get(u"this").callprop(u'buildHas', var.get(u'ret'), var.get(u'call')) + else: + var.get(u"this").get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u'call'))) + PyJs_buildClosure_826_._set_name(u'buildClosure') + var.get(u'BlockScoping').get(u'prototype').put(u'buildClosure', PyJs_buildClosure_826_) + @Js + def PyJs_addContinuations_827_(fn, this, arguments, var=var): + var = Scope({u'this':this, u'addContinuations':PyJs_addContinuations_827_, u'arguments':arguments, u'fn':fn}, var) + var.registers([u'i', u'state', u'newParam', u'param', u'fn']) + PyJs_Object_829_ = Js({}) + PyJs_Object_828_ = Js({u'reassignments':PyJs_Object_829_,u'outsideReferences':var.get(u"this").get(u'outsideLetReferences')}) + var.put(u'state', PyJs_Object_828_) + var.get(u"this").get(u'scope').callprop(u'traverse', var.get(u'fn'), var.get(u'continuationVisitor'), var.get(u'state')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'fn').get(u'params').get(u'length')): + try: + var.put(u'param', var.get(u'fn').get(u'params').get(var.get(u'i'))) + if var.get(u'state').get(u'reassignments').get(var.get(u'param').get(u'name')).neg(): + continue + var.put(u'newParam', var.get(u"this").get(u'scope').callprop(u'generateUidIdentifier', var.get(u'param').get(u'name'))) + var.get(u'fn').get(u'params').put(var.get(u'i'), var.get(u'newParam')) + var.get(u"this").get(u'scope').callprop(u'rename', var.get(u'param').get(u'name'), var.get(u'newParam').get(u'name'), var.get(u'fn')) + var.get(u'fn').get(u'body').get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'param'), var.get(u'newParam')))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJs_addContinuations_827_._set_name(u'addContinuations') + var.get(u'BlockScoping').get(u'prototype').put(u'addContinuations', PyJs_addContinuations_827_) + @Js + def PyJs_getLetReferences_830_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getLetReferences':PyJs_getLetReferences_830_}, var) + var.registers([u'_this', u'state', u'i', u'_i2', u'j', u'declarPath', u'declarators', u'keys', u'init', u'declar', u'addDeclarationsFromChild', u'_i', u'consequents', u'_declarPath', u'_declar', u'block']) + var.put(u'_this', var.get(u"this")) + var.put(u'block', var.get(u"this").get(u'block')) + var.put(u'declarators', Js([])) + if var.get(u"this").get(u'loop'): + var.put(u'init', (var.get(u"this").get(u'loop').get(u'left') or var.get(u"this").get(u'loop').get(u'init'))) + if var.get(u'isBlockScoped')(var.get(u'init')): + var.get(u'declarators').callprop(u'push', var.get(u'init')) + PyJsComma(Js(0.0),var.get(u'_extend2').get(u'default'))(var.get(u"this").get(u'outsideLetReferences'), var.get(u't').callprop(u'getBindingIdentifiers', var.get(u'init'))) + @Js + def PyJs_addDeclarationsFromChild_831_(path, node, this, arguments, var=var): + var = Scope({u'node':node, u'path':path, u'this':this, u'arguments':arguments, u'addDeclarationsFromChild':PyJs_addDeclarationsFromChild_831_}, var) + var.registers([u'node', u'path']) + var.put(u'node', (var.get(u'node') or var.get(u'path').get(u'node'))) + if ((var.get(u't').callprop(u'isClassDeclaration', var.get(u'node')) or var.get(u't').callprop(u'isFunctionDeclaration', var.get(u'node'))) or var.get(u'isBlockScoped')(var.get(u'node'))): + if var.get(u'isBlockScoped')(var.get(u'node')): + var.get(u'convertBlockScopedToVar')(var.get(u'path'), var.get(u'node'), var.get(u'block'), var.get(u'_this').get(u'scope')) + var.put(u'declarators', var.get(u'declarators').callprop(u'concat', (var.get(u'node').get(u'declarations') or var.get(u'node')))) + if var.get(u't').callprop(u'isLabeledStatement', var.get(u'node')): + var.get(u'addDeclarationsFromChild')(var.get(u'path').callprop(u'get', Js(u'body')), var.get(u'node').get(u'body')) + PyJs_addDeclarationsFromChild_831_._set_name(u'addDeclarationsFromChild') + var.put(u'addDeclarationsFromChild', PyJs_addDeclarationsFromChild_831_) + if var.get(u'block').get(u'body'): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'block').get(u'body').get(u'length')): + try: + var.put(u'declarPath', var.get(u"this").get(u'blockPath').callprop(u'get', Js(u'body')).get(var.get(u'i'))) + var.get(u'addDeclarationsFromChild')(var.get(u'declarPath')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + if var.get(u'block').get(u'cases'): + #for JS loop + var.put(u'_i', Js(0.0)) + while (var.get(u'_i')<var.get(u'block').get(u'cases').get(u'length')): + try: + var.put(u'consequents', var.get(u'block').get(u'cases').get(var.get(u'_i')).get(u'consequent')) + #for JS loop + var.put(u'j', Js(0.0)) + while (var.get(u'j')<var.get(u'consequents').get(u'length')): + try: + var.put(u'_declarPath', var.get(u"this").get(u'blockPath').callprop(u'get', Js(u'cases')).get(var.get(u'_i'))) + var.put(u'declar', var.get(u'consequents').get(var.get(u'j'))) + var.get(u'addDeclarationsFromChild')(var.get(u'_declarPath'), var.get(u'declar')) + finally: + (var.put(u'j',Js(var.get(u'j').to_number())+Js(1))-Js(1)) + finally: + (var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)) + #for JS loop + var.put(u'_i2', Js(0.0)) + while (var.get(u'_i2')<var.get(u'declarators').get(u'length')): + try: + var.put(u'_declar', var.get(u'declarators').get(var.get(u'_i2'))) + var.put(u'keys', var.get(u't').callprop(u'getBindingIdentifiers', var.get(u'_declar'))) + PyJsComma(Js(0.0),var.get(u'_extend2').get(u'default'))(var.get(u"this").get(u'letReferences'), var.get(u'keys')) + var.get(u"this").put(u'hasLetReferences', var.get(u'true')) + finally: + (var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)) + if var.get(u"this").get(u'hasLetReferences').neg(): + return var.get('undefined') + PyJs_Object_832_ = Js({u'letReferences':var.get(u"this").get(u'letReferences'),u'closurify':Js(False),u'file':var.get(u"this").get(u'file')}) + var.put(u'state', PyJs_Object_832_) + var.get(u"this").get(u'blockPath').callprop(u'traverse', var.get(u'letReferenceBlockVisitor'), var.get(u'state')) + return var.get(u'state').get(u'closurify') + PyJs_getLetReferences_830_._set_name(u'getLetReferences') + var.get(u'BlockScoping').get(u'prototype').put(u'getLetReferences', PyJs_getLetReferences_830_) + @Js + def PyJs_checkLoop_833_(this, arguments, var=var): + var = Scope({u'this':this, u'checkLoop':PyJs_checkLoop_833_, u'arguments':arguments}, var) + var.registers([u'state']) + PyJs_Object_835_ = Js({}) + PyJs_Object_834_ = Js({u'hasBreakContinue':Js(False),u'ignoreLabeless':Js(False),u'inSwitchCase':Js(False),u'innerLabels':Js([]),u'hasReturn':Js(False),u'isLoop':var.get(u"this").get(u'loop').neg().neg(),u'map':PyJs_Object_835_,u'LOOP_IGNORE':PyJsComma(Js(0.0),var.get(u'_symbol2').get(u'default'))()}) + var.put(u'state', PyJs_Object_834_) + var.get(u"this").get(u'blockPath').callprop(u'traverse', var.get(u'loopLabelVisitor'), var.get(u'state')) + var.get(u"this").get(u'blockPath').callprop(u'traverse', var.get(u'loopVisitor'), var.get(u'state')) + return var.get(u'state') + PyJs_checkLoop_833_._set_name(u'checkLoop') + var.get(u'BlockScoping').get(u'prototype').put(u'checkLoop', PyJs_checkLoop_833_) + @Js + def PyJs_hoistVarDeclarations_836_(this, arguments, var=var): + var = Scope({u'this':this, u'hoistVarDeclarations':PyJs_hoistVarDeclarations_836_, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").get(u'blockPath').callprop(u'traverse', var.get(u'hoistVarDeclarationsVisitor'), var.get(u"this")) + PyJs_hoistVarDeclarations_836_._set_name(u'hoistVarDeclarations') + var.get(u'BlockScoping').get(u'prototype').put(u'hoistVarDeclarations', PyJs_hoistVarDeclarations_836_) + @Js + def PyJs_pushDeclar_837_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'pushDeclar':PyJs_pushDeclar_837_, u'arguments':arguments}, var) + var.registers([u'node', u'name', u'i', u'expr', u'declars', u'replace', u'declar', u'names']) + var.put(u'declars', Js([])) + var.put(u'names', var.get(u't').callprop(u'getBindingIdentifiers', var.get(u'node'))) + for PyJsTemp in var.get(u'names'): + var.put(u'name', PyJsTemp) + var.get(u'declars').callprop(u'push', var.get(u't').callprop(u'variableDeclarator', var.get(u'names').get(var.get(u'name')))) + var.get(u"this").get(u'body').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', var.get(u'node').get(u'kind'), var.get(u'declars'))) + var.put(u'replace', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'node').get(u'declarations').get(u'length')): + try: + var.put(u'declar', var.get(u'node').get(u'declarations').get(var.get(u'i'))) + if var.get(u'declar').get(u'init').neg(): + continue + var.put(u'expr', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'declar').get(u'id'), var.get(u'declar').get(u'init'))) + var.get(u'replace').callprop(u'push', var.get(u't').callprop(u'inherits', var.get(u'expr'), var.get(u'declar'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'replace') + PyJs_pushDeclar_837_._set_name(u'pushDeclar') + var.get(u'BlockScoping').get(u'prototype').put(u'pushDeclar', PyJs_pushDeclar_837_) + @Js + def PyJs_buildHas_838_(ret, call, this, arguments, var=var): + var = Scope({u'this':this, u'buildHas':PyJs_buildHas_838_, u'call':call, u'arguments':arguments, u'ret':ret}, var) + var.registers([u'body', u'i', u'retCheck', u'ret', u'caseConsequent', u'single', u'call', u'key', u'cases', u'has']) + var.put(u'body', var.get(u"this").get(u'body')) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'ret'), var.get(u'call'))]))) + var.put(u'retCheck', PyJsComma(Js(0.0), Js(None))) + var.put(u'has', var.get(u"this").get(u'has')) + var.put(u'cases', Js([])) + if var.get(u'has').get(u'hasReturn'): + PyJs_Object_839_ = Js({u'RETURN':var.get(u'ret')}) + var.put(u'retCheck', var.get(u'buildRetCheck')(PyJs_Object_839_)) + if var.get(u'has').get(u'hasBreakContinue'): + for PyJsTemp in var.get(u'has').get(u'map'): + var.put(u'key', PyJsTemp) + var.get(u'cases').callprop(u'push', var.get(u't').callprop(u'switchCase', var.get(u't').callprop(u'stringLiteral', var.get(u'key')), Js([var.get(u'has').get(u'map').get(var.get(u'key'))]))) + if var.get(u'has').get(u'hasReturn'): + var.get(u'cases').callprop(u'push', var.get(u't').callprop(u'switchCase', var.get(u"null"), Js([var.get(u'retCheck')]))) + if PyJsStrictEq(var.get(u'cases').get(u'length'),Js(1.0)): + var.put(u'single', var.get(u'cases').get(u'0')) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'ifStatement', var.get(u't').callprop(u'binaryExpression', Js(u'==='), var.get(u'ret'), var.get(u'single').get(u'test')), var.get(u'single').get(u'consequent').get(u'0'))) + else: + if var.get(u"this").get(u'loop'): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'cases').get(u'length')): + try: + var.put(u'caseConsequent', var.get(u'cases').get(var.get(u'i')).get(u'consequent').get(u'0')) + if (var.get(u't').callprop(u'isBreakStatement', var.get(u'caseConsequent')) and var.get(u'caseConsequent').get(u'label').neg()): + var.get(u'caseConsequent').put(u'label', var.get(u"this").put(u'loopLabel', (var.get(u"this").get(u'loopLabel') or var.get(u"this").get(u'scope').callprop(u'generateUidIdentifier', Js(u'loop'))))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'switchStatement', var.get(u'ret'), var.get(u'cases'))) + else: + if var.get(u'has').get(u'hasReturn'): + var.get(u'body').callprop(u'push', var.get(u'retCheck')) + PyJs_buildHas_838_._set_name(u'buildHas') + var.get(u'BlockScoping').get(u'prototype').put(u'buildHas', PyJs_buildHas_838_) + return var.get(u'BlockScoping') + PyJs_anonymous_821_._set_name(u'anonymous') + var.put(u'BlockScoping', PyJs_anonymous_821_()) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_794_._set_name(u'anonymous') +PyJs_Object_840_ = Js({u'./tdz':Js(62.0),u'babel-runtime/core-js/object/create':Js(101.0),u'babel-runtime/core-js/symbol':Js(105.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-template':Js(221.0),u'babel-traverse':Js(225.0),u'babel-types':Js(258.0),u'lodash/extend':Js(446.0),u'lodash/values':Js(496.0)}) +@Js +def PyJs_anonymous_841_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'visitor', u'require', u'_babelTypes', u'module', u'getTDZStatus', u't', u'buildTDZAssert', u'isReference']) + @Js + def PyJsHoisted_getTDZStatus_(refPath, bindingPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'refPath':refPath, u'bindingPath':bindingPath}, var) + var.registers([u'refPath', u'bindingPath', u'executionStatus']) + var.put(u'executionStatus', var.get(u'bindingPath').callprop(u'_guessExecutionStatusRelativeTo', var.get(u'refPath'))) + if PyJsStrictEq(var.get(u'executionStatus'),Js(u'before')): + return Js(u'inside') + else: + if PyJsStrictEq(var.get(u'executionStatus'),Js(u'after')): + return Js(u'outside') + else: + return Js(u'maybe') + PyJsHoisted_getTDZStatus_.func_name = u'getTDZStatus' + var.put(u'getTDZStatus', PyJsHoisted_getTDZStatus_) + @Js + def PyJsHoisted_buildTDZAssert_(node, file, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'file':file}, var) + var.registers([u'node', u'file']) + return var.get(u't').callprop(u'callExpression', var.get(u'file').callprop(u'addHelper', Js(u'temporalRef')), Js([var.get(u'node'), var.get(u't').callprop(u'stringLiteral', var.get(u'node').get(u'name')), var.get(u'file').callprop(u'addHelper', Js(u'temporalUndefined'))])) + PyJsHoisted_buildTDZAssert_.func_name = u'buildTDZAssert' + var.put(u'buildTDZAssert', PyJsHoisted_buildTDZAssert_) + @Js + def PyJsHoisted_isReference_(node, scope, state, this, arguments, var=var): + var = Scope({u'node':node, u'scope':scope, u'state':state, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'scope', u'declared', u'state']) + var.put(u'declared', var.get(u'state').get(u'letReferences').get(var.get(u'node').get(u'name'))) + if var.get(u'declared').neg(): + return Js(False) + return PyJsStrictEq(var.get(u'scope').callprop(u'getBindingIdentifier', var.get(u'node').get(u'name')),var.get(u'declared')) + PyJsHoisted_isReference_.func_name = u'isReference' + var.put(u'isReference', PyJsHoisted_isReference_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_842_ = Js({}) + var.put(u'newObj', PyJs_Object_842_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'visitor', var.get(u'undefined')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + @Js + def PyJs_ReferencedIdentifier_844_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_844_, u'arguments':arguments}, var) + var.registers([u'node', u'status', u'bindingPath', u'parent', u'assert', u'state', u'path', u'scope']) + if var.get(u"this").get(u'file').get(u'opts').get(u'tdz').neg(): + return var.get('undefined') + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'parent', var.get(u'path').get(u'parent')) + var.put(u'scope', var.get(u'path').get(u'scope')) + PyJs_Object_845_ = Js({u'left':var.get(u'node')}) + if var.get(u'path').get(u'parentPath').callprop(u'isFor', PyJs_Object_845_): + return var.get('undefined') + if var.get(u'isReference')(var.get(u'node'), var.get(u'scope'), var.get(u'state')).neg(): + return var.get('undefined') + var.put(u'bindingPath', var.get(u'scope').callprop(u'getBinding', var.get(u'node').get(u'name')).get(u'path')) + var.put(u'status', var.get(u'getTDZStatus')(var.get(u'path'), var.get(u'bindingPath'))) + if PyJsStrictEq(var.get(u'status'),Js(u'inside')): + return var.get('undefined') + if PyJsStrictEq(var.get(u'status'),Js(u'maybe')): + var.put(u'assert', var.get(u'buildTDZAssert')(var.get(u'node'), var.get(u'state').get(u'file'))) + var.get(u'bindingPath').get(u'parent').put(u'_tdzThis', var.get(u'true')) + var.get(u'path').callprop(u'skip') + if var.get(u'path').get(u'parentPath').callprop(u'isUpdateExpression'): + if var.get(u'parent').get(u'_ignoreBlockScopingTDZ'): + return var.get('undefined') + var.get(u'path').get(u'parentPath').callprop(u'replaceWith', var.get(u't').callprop(u'sequenceExpression', Js([var.get(u'assert'), var.get(u'parent')]))) + else: + var.get(u'path').callprop(u'replaceWith', var.get(u'assert')) + else: + if PyJsStrictEq(var.get(u'status'),Js(u'outside')): + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'throwStatement', var.get(u't').callprop(u'inherits', var.get(u't').callprop(u'newExpression', var.get(u't').callprop(u'identifier', Js(u'ReferenceError')), Js([var.get(u't').callprop(u'stringLiteral', (var.get(u'node').get(u'name')+Js(u' is not defined - temporal dead zone')))])), var.get(u'node')))) + PyJs_ReferencedIdentifier_844_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_exit_847_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'exit':PyJs_exit_847_, u'arguments':arguments}, var) + var.registers([u'node', u'name', u'ids', u'state', u'path', u'nodes', u'id']) + if var.get(u"this").get(u'file').get(u'opts').get(u'tdz').neg(): + return var.get('undefined') + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'node').get(u'_ignoreBlockScopingTDZ'): + return var.get('undefined') + var.put(u'nodes', Js([])) + var.put(u'ids', var.get(u'path').callprop(u'getBindingIdentifiers')) + for PyJsTemp in var.get(u'ids'): + var.put(u'name', PyJsTemp) + var.put(u'id', var.get(u'ids').get(var.get(u'name'))) + if var.get(u'isReference')(var.get(u'id'), var.get(u'path').get(u'scope'), var.get(u'state')): + var.get(u'nodes').callprop(u'push', var.get(u'buildTDZAssert')(var.get(u'id'), var.get(u'state').get(u'file'))) + if var.get(u'nodes').get(u'length'): + var.get(u'node').put(u'_ignoreBlockScopingTDZ', var.get(u'true')) + var.get(u'nodes').callprop(u'push', var.get(u'node')) + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'nodes').callprop(u'map', var.get(u't').get(u'expressionStatement'))) + PyJs_exit_847_._set_name(u'exit') + PyJs_Object_846_ = Js({u'exit':PyJs_exit_847_}) + PyJs_Object_843_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_844_,u'AssignmentExpression':PyJs_Object_846_}) + var.put(u'visitor', var.get(u'exports').put(u'visitor', PyJs_Object_843_)) +PyJs_anonymous_841_._set_name(u'anonymous') +PyJs_Object_848_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_849_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_vanilla', u'exports', u'_symbol2', u'_loose', u'require', u'_babelHelperFunctionName', u'module', u'_vanilla2', u'_symbol', u'_babelHelperFunctionName2', u'_interopRequireDefault', u'_loose2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_856_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_856_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_symbol', var.get(u'require')(Js(u'babel-runtime/core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + @Js + def PyJs_anonymous_850_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'VISITED', u'_ref', u't']) + var.put(u't', var.get(u'_ref').get(u'types')) + var.put(u'VISITED', PyJsComma(Js(0.0),var.get(u'_symbol2').get(u'default'))()) + @Js + def PyJs_ExportDefaultDeclaration_853_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'ExportDefaultDeclaration':PyJs_ExportDefaultDeclaration_853_}, var) + var.registers([u'node', u'path', u'ref']) + if var.get(u'path').callprop(u'get', Js(u'declaration')).callprop(u'isClassDeclaration').neg(): + return var.get('undefined') + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'ref', (var.get(u'node').get(u'declaration').get(u'id') or var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'class')))) + var.get(u'node').get(u'declaration').put(u'id', var.get(u'ref')) + var.get(u'path').callprop(u'replaceWith', var.get(u'node').get(u'declaration')) + var.get(u'path').callprop(u'insertAfter', var.get(u't').callprop(u'exportDefaultDeclaration', var.get(u'ref'))) + PyJs_ExportDefaultDeclaration_853_._set_name(u'ExportDefaultDeclaration') + @Js + def PyJs_ClassDeclaration_854_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ClassDeclaration':PyJs_ClassDeclaration_854_, u'arguments':arguments}, var) + var.registers([u'node', u'path', u'ref']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'ref', (var.get(u'node').get(u'id') or var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'class')))) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'variableDeclaration', Js(u'let'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'ref'), var.get(u't').callprop(u'toExpression', var.get(u'node')))]))) + PyJs_ClassDeclaration_854_._set_name(u'ClassDeclaration') + @Js + def PyJs_ClassExpression_855_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'ClassExpression':PyJs_ClassExpression_855_}, var) + var.registers([u'node', u'path', u'state', u'inferred', u'Constructor']) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'node').get(var.get(u'VISITED')): + return var.get('undefined') + var.put(u'inferred', PyJsComma(Js(0.0),var.get(u'_babelHelperFunctionName2').get(u'default'))(var.get(u'path'))) + if (var.get(u'inferred') and PyJsStrictNeq(var.get(u'inferred'),var.get(u'node'))): + return var.get(u'path').callprop(u'replaceWith', var.get(u'inferred')) + var.get(u'node').put(var.get(u'VISITED'), var.get(u'true')) + var.put(u'Constructor', var.get(u'_vanilla2').get(u'default')) + if var.get(u'state').get(u'opts').get(u'loose'): + var.put(u'Constructor', var.get(u'_loose2').get(u'default')) + var.get(u'path').callprop(u'replaceWith', var.get(u'Constructor').create(var.get(u'path'), var.get(u'state').get(u'file')).callprop(u'run')) + PyJs_ClassExpression_855_._set_name(u'ClassExpression') + PyJs_Object_852_ = Js({u'ExportDefaultDeclaration':PyJs_ExportDefaultDeclaration_853_,u'ClassDeclaration':PyJs_ClassDeclaration_854_,u'ClassExpression':PyJs_ClassExpression_855_}) + PyJs_Object_851_ = Js({u'visitor':PyJs_Object_852_}) + return PyJs_Object_851_ + PyJs_anonymous_850_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_850_) + var.put(u'_loose', var.get(u'require')(Js(u'./loose'))) + var.put(u'_loose2', var.get(u'_interopRequireDefault')(var.get(u'_loose'))) + var.put(u'_vanilla', var.get(u'require')(Js(u'./vanilla'))) + var.put(u'_vanilla2', var.get(u'_interopRequireDefault')(var.get(u'_vanilla'))) + var.put(u'_babelHelperFunctionName', var.get(u'require')(Js(u'babel-helper-function-name'))) + var.put(u'_babelHelperFunctionName2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperFunctionName'))) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_849_._set_name(u'anonymous') +PyJs_Object_857_ = Js({u'./loose':Js(64.0),u'./vanilla':Js(65.0),u'babel-helper-function-name':Js(49.0),u'babel-runtime/core-js/symbol':Js(105.0)}) +@Js +def PyJs_anonymous_858_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_vanilla', u'LooseClassTransformer', u'_vanilla2', u'exports', u'_interopRequireWildcard', u'_inherits3', u'_inherits2', u'require', u'_babelTypes', u'_possibleConstructorReturn3', u'_possibleConstructorReturn2', u'module', u't', u'_babelHelperFunctionName', u'_babelHelperFunctionName2', u'_interopRequireDefault', u'_classCallCheck3', u'_classCallCheck2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_860_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_860_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_859_ = Js({}) + var.put(u'newObj', PyJs_Object_859_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_possibleConstructorReturn2', var.get(u'require')(Js(u'babel-runtime/helpers/possibleConstructorReturn'))) + var.put(u'_possibleConstructorReturn3', var.get(u'_interopRequireDefault')(var.get(u'_possibleConstructorReturn2'))) + var.put(u'_inherits2', var.get(u'require')(Js(u'babel-runtime/helpers/inherits'))) + var.put(u'_inherits3', var.get(u'_interopRequireDefault')(var.get(u'_inherits2'))) + var.put(u'_babelHelperFunctionName', var.get(u'require')(Js(u'babel-helper-function-name'))) + var.put(u'_babelHelperFunctionName2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperFunctionName'))) + var.put(u'_vanilla', var.get(u'require')(Js(u'./vanilla'))) + var.put(u'_vanilla2', var.get(u'_interopRequireDefault')(var.get(u'_vanilla'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + @Js + def PyJs_anonymous_861_(_VanillaTransformer, this, arguments, var=var): + var = Scope({u'this':this, u'_VanillaTransformer':_VanillaTransformer, u'arguments':arguments}, var) + var.registers([u'LooseClassTransformer', u'_VanillaTransformer']) + @Js + def PyJsHoisted_LooseClassTransformer_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_this']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'LooseClassTransformer')) + var.put(u'_this', PyJsComma(Js(0.0),var.get(u'_possibleConstructorReturn3').get(u'default'))(var.get(u"this"), var.get(u'_VanillaTransformer').callprop(u'apply', var.get(u"this"), var.get(u'arguments')))) + var.get(u'_this').put(u'isLoose', var.get(u'true')) + return var.get(u'_this') + PyJsHoisted_LooseClassTransformer_.func_name = u'LooseClassTransformer' + var.put(u'LooseClassTransformer', PyJsHoisted_LooseClassTransformer_) + PyJsComma(Js(0.0),var.get(u'_inherits3').get(u'default'))(var.get(u'LooseClassTransformer'), var.get(u'_VanillaTransformer')) + pass + @Js + def PyJs__processMethod_862_(node, scope, this, arguments, var=var): + var = Scope({u'node':node, u'scope':scope, u'_processMethod':PyJs__processMethod_862_, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'methodName', u'func', u'expr', u'classRef', u'key', u'scope']) + if var.get(u'node').get(u'decorators').neg(): + var.put(u'classRef', var.get(u"this").get(u'classRef')) + if var.get(u'node').get(u'static').neg(): + var.put(u'classRef', var.get(u't').callprop(u'memberExpression', var.get(u'classRef'), var.get(u't').callprop(u'identifier', Js(u'prototype')))) + var.put(u'methodName', var.get(u't').callprop(u'memberExpression', var.get(u'classRef'), var.get(u'node').get(u'key'), (var.get(u'node').get(u'computed') or var.get(u't').callprop(u'isLiteral', var.get(u'node').get(u'key'))))) + var.put(u'func', var.get(u't').callprop(u'functionExpression', var.get(u"null"), var.get(u'node').get(u'params'), var.get(u'node').get(u'body'), var.get(u'node').get(u'generator'), var.get(u'node').get(u'async'))) + var.get(u'func').put(u'returnType', var.get(u'node').get(u'returnType')) + var.put(u'key', var.get(u't').callprop(u'toComputedKey', var.get(u'node'), var.get(u'node').get(u'key'))) + if var.get(u't').callprop(u'isStringLiteral', var.get(u'key')): + PyJs_Object_863_ = Js({u'node':var.get(u'func'),u'id':var.get(u'key'),u'scope':var.get(u'scope')}) + var.put(u'func', PyJsComma(Js(0.0),var.get(u'_babelHelperFunctionName2').get(u'default'))(PyJs_Object_863_)) + var.put(u'expr', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'methodName'), var.get(u'func')))) + var.get(u't').callprop(u'inheritsComments', var.get(u'expr'), var.get(u'node')) + var.get(u"this").get(u'body').callprop(u'push', var.get(u'expr')) + return var.get(u'true') + PyJs__processMethod_862_._set_name(u'_processMethod') + var.get(u'LooseClassTransformer').get(u'prototype').put(u'_processMethod', PyJs__processMethod_862_) + return var.get(u'LooseClassTransformer') + PyJs_anonymous_861_._set_name(u'anonymous') + var.put(u'LooseClassTransformer', PyJs_anonymous_861_(var.get(u'_vanilla2').get(u'default'))) + var.get(u'exports').put(u'default', var.get(u'LooseClassTransformer')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_858_._set_name(u'anonymous') +PyJs_Object_864_ = Js({u'./vanilla':Js(65.0),u'babel-helper-function-name':Js(49.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-runtime/helpers/inherits':Js(111.0),u'babel-runtime/helpers/possibleConstructorReturn':Js(113.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_865_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'defineMap', u'_babelHelperDefineMap', u'verifyConstructorVisitor', u'_babelTemplate', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_babelTraverse', u'findThisesVisitor', u'noMethodVisitor', u'_babelHelperOptimiseCallExpression2', u'_classCallCheck3', u'_classCallCheck2', u'exports', u'_interopRequireWildcard', u'_babelTypes', u'buildDerivedConstructor', u'_babelHelperReplaceSupers', u'_babelHelperReplaceSupers2', u'require', u'_babelHelperOptimiseCallExpression', u'ClassTransformer', u'_babelTemplate2', u't']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_867_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_867_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_866_ = Js({}) + var.put(u'newObj', PyJs_Object_866_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_babelTraverse', var.get(u'require')(Js(u'babel-traverse'))) + var.put(u'_babelHelperReplaceSupers', var.get(u'require')(Js(u'babel-helper-replace-supers'))) + var.put(u'_babelHelperReplaceSupers2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperReplaceSupers'))) + var.put(u'_babelHelperOptimiseCallExpression', var.get(u'require')(Js(u'babel-helper-optimise-call-expression'))) + var.put(u'_babelHelperOptimiseCallExpression2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperOptimiseCallExpression'))) + var.put(u'_babelHelperDefineMap', var.get(u'require')(Js(u'babel-helper-define-map'))) + var.put(u'defineMap', var.get(u'_interopRequireWildcard')(var.get(u'_babelHelperDefineMap'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'buildDerivedConstructor', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function () {\n super(...arguments);\n })\n'))) + @Js + def PyJs_FunctionExpressionFunctionDeclaration_869_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'FunctionExpressionFunctionDeclaration':PyJs_FunctionExpressionFunctionDeclaration_869_}, var) + var.registers([u'path']) + if var.get(u'path').callprop(u'is', Js(u'shadow')).neg(): + var.get(u'path').callprop(u'skip') + PyJs_FunctionExpressionFunctionDeclaration_869_._set_name(u'FunctionExpressionFunctionDeclaration') + @Js + def PyJs_Method_870_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'Method':PyJs_Method_870_}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_Method_870_._set_name(u'Method') + PyJs_Object_868_ = Js({u'FunctionExpression|FunctionDeclaration':PyJs_FunctionExpressionFunctionDeclaration_869_,u'Method':PyJs_Method_870_}) + var.put(u'noMethodVisitor', PyJs_Object_868_) + @Js + def PyJs_Super_872_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Super':PyJs_Super_872_, u'arguments':arguments}, var) + var.registers([u'path']) + PyJs_Object_873_ = Js({u'callee':var.get(u'path').get(u'node')}) + if ((var.get(u"this").get(u'isDerived') and var.get(u"this").get(u'hasBareSuper').neg()) and var.get(u'path').get(u'parentPath').callprop(u'isCallExpression', PyJs_Object_873_).neg()): + PyJsTempException = JsToPyException(var.get(u'path').callprop(u'buildCodeFrameError', Js(u"'super.*' is not allowed before super()"))) + raise PyJsTempException + PyJs_Super_872_._set_name(u'Super') + @Js + def PyJs_exit_875_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_875_, u'arguments':arguments}, var) + var.registers([u'path']) + if var.get(u'path').callprop(u'get', Js(u'callee')).callprop(u'isSuper'): + var.get(u"this").put(u'hasBareSuper', var.get(u'true')) + if var.get(u"this").get(u'isDerived').neg(): + PyJsTempException = JsToPyException(var.get(u'path').callprop(u'buildCodeFrameError', Js(u'super() is only allowed in a derived constructor'))) + raise PyJsTempException + PyJs_exit_875_._set_name(u'exit') + PyJs_Object_874_ = Js({u'exit':PyJs_exit_875_}) + @Js + def PyJs_ThisExpression_876_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ThisExpression':PyJs_ThisExpression_876_, u'arguments':arguments}, var) + var.registers([u'path']) + if (var.get(u"this").get(u'isDerived') and var.get(u"this").get(u'hasBareSuper').neg()): + if var.get(u'path').callprop(u'inShadow', Js(u'this')).neg(): + PyJsTempException = JsToPyException(var.get(u'path').callprop(u'buildCodeFrameError', Js(u"'this' is not allowed before super()"))) + raise PyJsTempException + PyJs_ThisExpression_876_._set_name(u'ThisExpression') + PyJs_Object_871_ = Js({u'Super':PyJs_Super_872_,u'CallExpression':PyJs_Object_874_,u'ThisExpression':PyJs_ThisExpression_876_}) + var.put(u'verifyConstructorVisitor', var.get(u'_babelTraverse').get(u'visitors').callprop(u'merge', Js([var.get(u'noMethodVisitor'), PyJs_Object_871_]))) + @Js + def PyJs_ThisExpression_878_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ThisExpression':PyJs_ThisExpression_878_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u"this").get(u'superThises').callprop(u'push', var.get(u'path')) + PyJs_ThisExpression_878_._set_name(u'ThisExpression') + PyJs_Object_877_ = Js({u'ThisExpression':PyJs_ThisExpression_878_}) + var.put(u'findThisesVisitor', var.get(u'_babelTraverse').get(u'visitors').callprop(u'merge', Js([var.get(u'noMethodVisitor'), PyJs_Object_877_]))) + @Js + def PyJs_anonymous_879_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'ClassTransformer']) + @Js + def PyJsHoisted_ClassTransformer_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file}, var) + var.registers([u'path', u'file']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'ClassTransformer')) + var.get(u"this").put(u'parent', var.get(u'path').get(u'parent')) + var.get(u"this").put(u'scope', var.get(u'path').get(u'scope')) + var.get(u"this").put(u'node', var.get(u'path').get(u'node')) + var.get(u"this").put(u'path', var.get(u'path')) + var.get(u"this").put(u'file', var.get(u'file')) + var.get(u"this").callprop(u'clearDescriptors') + var.get(u"this").put(u'instancePropBody', Js([])) + PyJs_Object_880_ = Js({}) + var.get(u"this").put(u'instancePropRefs', PyJs_Object_880_) + var.get(u"this").put(u'staticPropBody', Js([])) + var.get(u"this").put(u'body', Js([])) + var.get(u"this").put(u'bareSuperAfter', Js([])) + var.get(u"this").put(u'bareSupers', Js([])) + var.get(u"this").put(u'pushedConstructor', Js(False)) + var.get(u"this").put(u'pushedInherits', Js(False)) + var.get(u"this").put(u'isLoose', Js(False)) + var.get(u"this").put(u'superThises', Js([])) + var.get(u"this").put(u'classId', var.get(u"this").get(u'node').get(u'id')) + var.get(u"this").put(u'classRef', (var.get(u't').callprop(u'identifier', var.get(u"this").get(u'node').get(u'id').get(u'name')) if var.get(u"this").get(u'node').get(u'id') else var.get(u"this").get(u'scope').callprop(u'generateUidIdentifier', Js(u'class')))) + var.get(u"this").put(u'superName', (var.get(u"this").get(u'node').get(u'superClass') or var.get(u't').callprop(u'identifier', Js(u'Function')))) + var.get(u"this").put(u'isDerived', var.get(u"this").get(u'node').get(u'superClass').neg().neg()) + PyJsHoisted_ClassTransformer_.func_name = u'ClassTransformer' + var.put(u'ClassTransformer', PyJsHoisted_ClassTransformer_) + pass + @Js + def PyJs_run_881_(this, arguments, var=var): + var = Scope({u'this':this, u'run':PyJs_run_881_, u'arguments':arguments}, var) + var.registers([u'body', u'container', u'_this', u'file', u'superName', u'closureArgs', u'closureParams', u'constructorBody']) + var.put(u'_this', var.get(u"this")) + var.put(u'superName', var.get(u"this").get(u'superName')) + var.put(u'file', var.get(u"this").get(u'file')) + var.put(u'body', var.get(u"this").get(u'body')) + var.put(u'constructorBody', var.get(u"this").put(u'constructorBody', var.get(u't').callprop(u'blockStatement', Js([])))) + var.get(u"this").put(u'constructor', var.get(u"this").callprop(u'buildConstructor')) + var.put(u'closureParams', Js([])) + var.put(u'closureArgs', Js([])) + if var.get(u"this").get(u'isDerived'): + var.get(u'closureArgs').callprop(u'push', var.get(u'superName')) + var.put(u'superName', var.get(u"this").get(u'scope').callprop(u'generateUidIdentifierBasedOnNode', var.get(u'superName'))) + var.get(u'closureParams').callprop(u'push', var.get(u'superName')) + var.get(u"this").put(u'superName', var.get(u'superName')) + var.get(u"this").callprop(u'buildBody') + var.get(u'constructorBody').get(u'body').callprop(u'unshift', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u'file').callprop(u'addHelper', Js(u'classCallCheck')), Js([var.get(u't').callprop(u'thisExpression'), var.get(u"this").get(u'classRef')])))) + @Js + def PyJs_anonymous_882_(fn, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'fn':fn}, var) + var.registers([u'fn']) + return var.get(u'fn')(var.get(u'_this').get(u'classRef')) + PyJs_anonymous_882_._set_name(u'anonymous') + var.put(u'body', var.get(u'body').callprop(u'concat', var.get(u"this").get(u'staticPropBody').callprop(u'map', PyJs_anonymous_882_))) + if var.get(u"this").get(u'classId'): + if PyJsStrictEq(var.get(u'body').get(u'length'),Js(1.0)): + return var.get(u't').callprop(u'toExpression', var.get(u'body').get(u'0')) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'returnStatement', var.get(u"this").get(u'classRef'))) + var.put(u'container', var.get(u't').callprop(u'functionExpression', var.get(u"null"), var.get(u'closureParams'), var.get(u't').callprop(u'blockStatement', var.get(u'body')))) + var.get(u'container').put(u'shadow', var.get(u'true')) + return var.get(u't').callprop(u'callExpression', var.get(u'container'), var.get(u'closureArgs')) + PyJs_run_881_._set_name(u'run') + var.get(u'ClassTransformer').get(u'prototype').put(u'run', PyJs_run_881_) + @Js + def PyJs_buildConstructor_883_(this, arguments, var=var): + var = Scope({u'this':this, u'buildConstructor':PyJs_buildConstructor_883_, u'arguments':arguments}, var) + var.registers([u'func']) + var.put(u'func', var.get(u't').callprop(u'functionDeclaration', var.get(u"this").get(u'classRef'), Js([]), var.get(u"this").get(u'constructorBody'))) + var.get(u't').callprop(u'inherits', var.get(u'func'), var.get(u"this").get(u'node')) + return var.get(u'func') + PyJs_buildConstructor_883_._set_name(u'buildConstructor') + var.get(u'ClassTransformer').get(u'prototype').put(u'buildConstructor', PyJs_buildConstructor_883_) + @Js + def PyJs_pushToMap_884_(node, enumerable, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'pushToMap':PyJs_pushToMap_884_, u'enumerable':enumerable, u'arguments':arguments}, var) + var.registers([u'node', u'map', u'kind', u'scope', u'enumerable', u'mutatorMap']) + var.put(u'kind', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else Js(u'value'))) + var.put(u'scope', var.get(u'arguments').get(u'3')) + var.put(u'mutatorMap', PyJsComma(Js(0.0), Js(None))) + if var.get(u'node').get(u'static'): + var.get(u"this").put(u'hasStaticDescriptors', var.get(u'true')) + var.put(u'mutatorMap', var.get(u"this").get(u'staticMutatorMap')) + else: + var.get(u"this").put(u'hasInstanceDescriptors', var.get(u'true')) + var.put(u'mutatorMap', var.get(u"this").get(u'instanceMutatorMap')) + var.put(u'map', var.get(u'defineMap').callprop(u'push', var.get(u'mutatorMap'), var.get(u'node'), var.get(u'kind'), var.get(u"this").get(u'file'), var.get(u'scope'))) + if var.get(u'enumerable'): + var.get(u'map').put(u'enumerable', var.get(u't').callprop(u'booleanLiteral', var.get(u'true'))) + return var.get(u'map') + PyJs_pushToMap_884_._set_name(u'pushToMap') + var.get(u'ClassTransformer').get(u'prototype').put(u'pushToMap', PyJs_pushToMap_884_) + @Js + def PyJs_constructorMeMaybe_885_(this, arguments, var=var): + var = Scope({u'this':this, u'constructorMeMaybe':PyJs_constructorMeMaybe_885_, u'arguments':arguments}, var) + var.registers([u'body', u'paths', u'_isArray', u'_iterator', u'_constructor', u'params', u'_i', u'path', u'hasConstructor', u'_ref']) + var.put(u'hasConstructor', Js(False)) + var.put(u'paths', var.get(u"this").get(u'path').callprop(u'get', Js(u'body.body'))) + #for JS loop + var.put(u'_iterator', var.get(u'paths')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'path', var.get(u'_ref')) + var.put(u'hasConstructor', var.get(u'path').callprop(u'equals', Js(u'kind'), Js(u'constructor'))) + if var.get(u'hasConstructor'): + break + + if var.get(u'hasConstructor'): + return var.get('undefined') + var.put(u'params', PyJsComma(Js(0.0), Js(None))) + var.put(u'body', PyJsComma(Js(0.0), Js(None))) + if var.get(u"this").get(u'isDerived'): + var.put(u'_constructor', var.get(u'buildDerivedConstructor')().get(u'expression')) + var.put(u'params', var.get(u'_constructor').get(u'params')) + var.put(u'body', var.get(u'_constructor').get(u'body')) + else: + var.put(u'params', Js([])) + var.put(u'body', var.get(u't').callprop(u'blockStatement', Js([]))) + var.get(u"this").get(u'path').callprop(u'get', Js(u'body')).callprop(u'unshiftContainer', Js(u'body'), var.get(u't').callprop(u'classMethod', Js(u'constructor'), var.get(u't').callprop(u'identifier', Js(u'constructor')), var.get(u'params'), var.get(u'body'))) + PyJs_constructorMeMaybe_885_._set_name(u'constructorMeMaybe') + var.get(u'ClassTransformer').get(u'prototype').put(u'constructorMeMaybe', PyJs_constructorMeMaybe_885_) + @Js + def PyJs_buildBody_886_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'buildBody':PyJs_buildBody_886_}, var) + var.registers([u'constructorBody']) + var.get(u"this").callprop(u'constructorMeMaybe') + var.get(u"this").callprop(u'pushBody') + var.get(u"this").callprop(u'verifyConstructor') + if var.get(u"this").get(u'userConstructor'): + var.put(u'constructorBody', var.get(u"this").get(u'constructorBody')) + var.get(u'constructorBody').put(u'body', var.get(u'constructorBody').get(u'body').callprop(u'concat', var.get(u"this").get(u'userConstructor').get(u'body').get(u'body'))) + var.get(u't').callprop(u'inherits', var.get(u"this").get(u'constructor'), var.get(u"this").get(u'userConstructor')) + var.get(u't').callprop(u'inherits', var.get(u'constructorBody'), var.get(u"this").get(u'userConstructor').get(u'body')) + var.get(u"this").callprop(u'pushDescriptors') + PyJs_buildBody_886_._set_name(u'buildBody') + var.get(u'ClassTransformer').get(u'prototype').put(u'buildBody', PyJs_buildBody_886_) + @Js + def PyJs_pushBody_887_(this, arguments, var=var): + var = Scope({u'this':this, u'pushBody':PyJs_pushBody_887_, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray2', u'isConstructor', u'_i2', u'classBodyPaths', u'_ref2', u'replaceSupers', u'path', u'_iterator2']) + var.put(u'classBodyPaths', var.get(u"this").get(u'path').callprop(u'get', Js(u'body.body'))) + #for JS loop + var.put(u'_iterator2', var.get(u'classBodyPaths')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'path', var.get(u'_ref2')) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'path').callprop(u'isClassProperty'): + PyJsTempException = JsToPyException(var.get(u'path').callprop(u'buildCodeFrameError', Js(u'Missing class properties transform.'))) + raise PyJsTempException + if var.get(u'node').get(u'decorators'): + PyJsTempException = JsToPyException(var.get(u'path').callprop(u'buildCodeFrameError', Js(u'Method has decorators, put the decorator plugin before the classes one.'))) + raise PyJsTempException + if var.get(u't').callprop(u'isClassMethod', var.get(u'node')): + var.put(u'isConstructor', PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'constructor'))) + if var.get(u'isConstructor'): + var.get(u'path').callprop(u'traverse', var.get(u'verifyConstructorVisitor'), var.get(u"this")) + if (var.get(u"this").get(u'hasBareSuper').neg() and var.get(u"this").get(u'isDerived')): + PyJsTempException = JsToPyException(var.get(u'path').callprop(u'buildCodeFrameError', Js(u'missing super() call in constructor'))) + raise PyJsTempException + PyJs_Object_888_ = Js({u'forceSuperMemoisation':var.get(u'isConstructor'),u'methodPath':var.get(u'path'),u'methodNode':var.get(u'node'),u'objectRef':var.get(u"this").get(u'classRef'),u'superRef':var.get(u"this").get(u'superName'),u'isStatic':var.get(u'node').get(u'static'),u'isLoose':var.get(u"this").get(u'isLoose'),u'scope':var.get(u"this").get(u'scope'),u'file':var.get(u"this").get(u'file')}) + var.put(u'replaceSupers', var.get(u'_babelHelperReplaceSupers2').get(u'default').create(PyJs_Object_888_, var.get(u'true'))) + var.get(u'replaceSupers').callprop(u'replace') + if var.get(u'isConstructor'): + var.get(u"this").callprop(u'pushConstructor', var.get(u'replaceSupers'), var.get(u'node'), var.get(u'path')) + else: + var.get(u"this").callprop(u'pushMethod', var.get(u'node'), var.get(u'path')) + + PyJs_pushBody_887_._set_name(u'pushBody') + var.get(u'ClassTransformer').get(u'prototype').put(u'pushBody', PyJs_pushBody_887_) + @Js + def PyJs_clearDescriptors_889_(this, arguments, var=var): + var = Scope({u'this':this, u'clearDescriptors':PyJs_clearDescriptors_889_, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'hasInstanceDescriptors', Js(False)) + var.get(u"this").put(u'hasStaticDescriptors', Js(False)) + PyJs_Object_890_ = Js({}) + var.get(u"this").put(u'instanceMutatorMap', PyJs_Object_890_) + PyJs_Object_891_ = Js({}) + var.get(u"this").put(u'staticMutatorMap', PyJs_Object_891_) + PyJs_clearDescriptors_889_._set_name(u'clearDescriptors') + var.get(u'ClassTransformer').get(u'prototype').put(u'clearDescriptors', PyJs_clearDescriptors_889_) + @Js + def PyJs_pushDescriptors_892_(this, arguments, var=var): + var = Scope({u'this':this, u'pushDescriptors':PyJs_pushDescriptors_892_, u'arguments':arguments}, var) + var.registers([u'body', u'i', u'args', u'lastNonNullIndex', u'staticProps', u'instanceProps', u'nullNode']) + var.get(u"this").callprop(u'pushInherits') + var.put(u'body', var.get(u"this").get(u'body')) + var.put(u'instanceProps', PyJsComma(Js(0.0), Js(None))) + var.put(u'staticProps', PyJsComma(Js(0.0), Js(None))) + if var.get(u"this").get(u'hasInstanceDescriptors'): + var.put(u'instanceProps', var.get(u'defineMap').callprop(u'toClassObject', var.get(u"this").get(u'instanceMutatorMap'))) + if var.get(u"this").get(u'hasStaticDescriptors'): + var.put(u'staticProps', var.get(u'defineMap').callprop(u'toClassObject', var.get(u"this").get(u'staticMutatorMap'))) + if (var.get(u'instanceProps') or var.get(u'staticProps')): + if var.get(u'instanceProps'): + var.put(u'instanceProps', var.get(u'defineMap').callprop(u'toComputedObjectFromClass', var.get(u'instanceProps'))) + if var.get(u'staticProps'): + var.put(u'staticProps', var.get(u'defineMap').callprop(u'toComputedObjectFromClass', var.get(u'staticProps'))) + var.put(u'nullNode', var.get(u't').callprop(u'nullLiteral')) + var.put(u'args', Js([var.get(u"this").get(u'classRef'), var.get(u'nullNode'), var.get(u'nullNode'), var.get(u'nullNode'), var.get(u'nullNode')])) + if var.get(u'instanceProps'): + var.get(u'args').put(u'1', var.get(u'instanceProps')) + if var.get(u'staticProps'): + var.get(u'args').put(u'2', var.get(u'staticProps')) + if var.get(u"this").get(u'instanceInitializersId'): + var.get(u'args').put(u'3', var.get(u"this").get(u'instanceInitializersId')) + var.get(u'body').callprop(u'unshift', var.get(u"this").callprop(u'buildObjectAssignment', var.get(u"this").get(u'instanceInitializersId'))) + if var.get(u"this").get(u'staticInitializersId'): + var.get(u'args').put(u'4', var.get(u"this").get(u'staticInitializersId')) + var.get(u'body').callprop(u'unshift', var.get(u"this").callprop(u'buildObjectAssignment', var.get(u"this").get(u'staticInitializersId'))) + var.put(u'lastNonNullIndex', Js(0.0)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'args').get(u'length')): + try: + if PyJsStrictNeq(var.get(u'args').get(var.get(u'i')),var.get(u'nullNode')): + var.put(u'lastNonNullIndex', var.get(u'i')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.put(u'args', var.get(u'args').callprop(u'slice', Js(0.0), (var.get(u'lastNonNullIndex')+Js(1.0)))) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u"this").get(u'file').callprop(u'addHelper', Js(u'createClass')), var.get(u'args')))) + var.get(u"this").callprop(u'clearDescriptors') + PyJs_pushDescriptors_892_._set_name(u'pushDescriptors') + var.get(u'ClassTransformer').get(u'prototype').put(u'pushDescriptors', PyJs_pushDescriptors_892_) + @Js + def PyJs_buildObjectAssignment_893_(id, this, arguments, var=var): + var = Scope({u'this':this, u'buildObjectAssignment':PyJs_buildObjectAssignment_893_, u'id':id, u'arguments':arguments}, var) + var.registers([u'id']) + return var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'id'), var.get(u't').callprop(u'objectExpression', Js([])))])) + PyJs_buildObjectAssignment_893_._set_name(u'buildObjectAssignment') + var.get(u'ClassTransformer').get(u'prototype').put(u'buildObjectAssignment', PyJs_buildObjectAssignment_893_) + @Js + def PyJs_wrapSuperCall_894_(bareSuper, superRef, thisRef, body, this, arguments, var=var): + var = Scope({u'bareSuper':bareSuper, u'body':body, u'thisRef':thisRef, u'arguments':arguments, u'this':this, u'superRef':superRef, u'wrapSuperCall':PyJs_wrapSuperCall_894_}, var) + var.registers([u'bareSuper', u'body', u'superRef', u'call', u'bareSuperNode', u'thisRef', u'bareSuperAfter']) + var.put(u'bareSuperNode', var.get(u'bareSuper').get(u'node')) + if var.get(u"this").get(u'isLoose'): + var.get(u'bareSuperNode').get(u'arguments').callprop(u'unshift', var.get(u't').callprop(u'thisExpression')) + PyJs_Object_895_ = Js({u'name':Js(u'arguments')}) + if ((PyJsStrictEq(var.get(u'bareSuperNode').get(u'arguments').get(u'length'),Js(2.0)) and var.get(u't').callprop(u'isSpreadElement', var.get(u'bareSuperNode').get(u'arguments').get(u'1'))) and var.get(u't').callprop(u'isIdentifier', var.get(u'bareSuperNode').get(u'arguments').get(u'1').get(u'argument'), PyJs_Object_895_)): + var.get(u'bareSuperNode').get(u'arguments').put(u'1', var.get(u'bareSuperNode').get(u'arguments').get(u'1').get(u'argument')) + var.get(u'bareSuperNode').put(u'callee', var.get(u't').callprop(u'memberExpression', var.get(u'superRef'), var.get(u't').callprop(u'identifier', Js(u'apply')))) + else: + var.get(u'bareSuperNode').put(u'callee', var.get(u't').callprop(u'memberExpression', var.get(u'superRef'), var.get(u't').callprop(u'identifier', Js(u'call')))) + else: + def PyJs_LONG_896_(var=var): + return var.get(u't').callprop(u'logicalExpression', Js(u'||'), var.get(u't').callprop(u'memberExpression', var.get(u"this").get(u'classRef'), var.get(u't').callprop(u'identifier', Js(u'__proto__'))), var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'Object')), var.get(u't').callprop(u'identifier', Js(u'getPrototypeOf'))), Js([var.get(u"this").get(u'classRef')]))) + var.put(u'bareSuperNode', PyJsComma(Js(0.0),var.get(u'_babelHelperOptimiseCallExpression2').get(u'default'))(PyJs_LONG_896_(), var.get(u't').callprop(u'thisExpression'), var.get(u'bareSuperNode').get(u'arguments'))) + var.put(u'call', var.get(u't').callprop(u'callExpression', var.get(u"this").get(u'file').callprop(u'addHelper', Js(u'possibleConstructorReturn')), Js([var.get(u't').callprop(u'thisExpression'), var.get(u'bareSuperNode')]))) + @Js + def PyJs_anonymous_897_(fn, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'fn':fn}, var) + var.registers([u'fn']) + return var.get(u'fn')(var.get(u'thisRef')) + PyJs_anonymous_897_._set_name(u'anonymous') + var.put(u'bareSuperAfter', var.get(u"this").get(u'bareSuperAfter').callprop(u'map', PyJs_anonymous_897_)) + if ((var.get(u'bareSuper').get(u'parentPath').callprop(u'isExpressionStatement') and PyJsStrictEq(var.get(u'bareSuper').get(u'parentPath').get(u'container'),var.get(u'body').get(u'node').get(u'body'))) and PyJsStrictEq((var.get(u'body').get(u'node').get(u'body').get(u'length')-Js(1.0)),var.get(u'bareSuper').get(u'parentPath').get(u'key'))): + if (var.get(u"this").get(u'superThises').get(u'length') or var.get(u'bareSuperAfter').get(u'length')): + PyJs_Object_898_ = Js({u'id':var.get(u'thisRef')}) + var.get(u'bareSuper').get(u'scope').callprop(u'push', PyJs_Object_898_) + var.put(u'call', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'thisRef'), var.get(u'call'))) + if var.get(u'bareSuperAfter').get(u'length'): + var.put(u'call', var.get(u't').callprop(u'toSequenceExpression', Js([var.get(u'call')]).callprop(u'concat', var.get(u'bareSuperAfter'), Js([var.get(u'thisRef')])))) + var.get(u'bareSuper').get(u'parentPath').callprop(u'replaceWith', var.get(u't').callprop(u'returnStatement', var.get(u'call'))) + else: + var.get(u'bareSuper').callprop(u'replaceWithMultiple', Js([var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'thisRef'), var.get(u'call'))]))]).callprop(u'concat', var.get(u'bareSuperAfter'), Js([var.get(u't').callprop(u'expressionStatement', var.get(u'thisRef'))]))) + PyJs_wrapSuperCall_894_._set_name(u'wrapSuperCall') + var.get(u'ClassTransformer').get(u'prototype').put(u'wrapSuperCall', PyJs_wrapSuperCall_894_) + @Js + def PyJs_verifyConstructor_899_(this, arguments, var=var): + var = Scope({u'this':this, u'verifyConstructor':PyJs_verifyConstructor_899_, u'arguments':arguments}, var) + var.registers([u'_isArray5', u'_isArray4', u'wrapReturn', u'_isArray3', u'bareSuper', u'superRef', u'_i5', u'_i4', u'_i3', u'returnPath', u'ref', u'body', u'bodyPaths', u'thisPath', u'guaranteedSuperBeforeFinish', u'thisRef', u'path', u'_ref5', u'_ref4', u'_ref3', u'_iterator5', u'_iterator4', u'_this2', u'_iterator3']) + var.put(u'_this2', var.get(u"this")) + if var.get(u"this").get(u'isDerived').neg(): + return var.get('undefined') + var.put(u'path', var.get(u"this").get(u'userConstructorPath')) + var.put(u'body', var.get(u'path').callprop(u'get', Js(u'body'))) + var.get(u'path').callprop(u'traverse', var.get(u'findThisesVisitor'), var.get(u"this")) + var.put(u'guaranteedSuperBeforeFinish', var.get(u"this").get(u'bareSupers').get(u'length').neg().neg()) + var.put(u'superRef', (var.get(u"this").get(u'superName') or var.get(u't').callprop(u'identifier', Js(u'Function')))) + var.put(u'thisRef', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'this'))) + #for JS loop + var.put(u'_iterator3', var.get(u"this").get(u'bareSupers')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'bareSuper', var.get(u'_ref3')) + var.get(u"this").callprop(u'wrapSuperCall', var.get(u'bareSuper'), var.get(u'superRef'), var.get(u'thisRef'), var.get(u'body')) + if var.get(u'guaranteedSuperBeforeFinish'): + @Js + def PyJs_anonymous_900_(parentPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parentPath':parentPath}, var) + var.registers([u'parentPath']) + if PyJsStrictEq(var.get(u'parentPath'),var.get(u'path')): + return var.get(u'true') + if (var.get(u'parentPath').callprop(u'isLoop') or var.get(u'parentPath').callprop(u'isConditional')): + var.put(u'guaranteedSuperBeforeFinish', Js(False)) + return var.get(u'true') + PyJs_anonymous_900_._set_name(u'anonymous') + var.get(u'bareSuper').callprop(u'find', PyJs_anonymous_900_) + + #for JS loop + var.put(u'_iterator4', var.get(u"this").get(u'superThises')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i4').get(u'value')) + var.put(u'thisPath', var.get(u'_ref4')) + var.get(u'thisPath').callprop(u'replaceWith', var.get(u'thisRef')) + + @Js + def PyJs_wrapReturn_901_(returnArg, this, arguments, var=var): + var = Scope({u'this':this, u'returnArg':returnArg, u'wrapReturn':PyJs_wrapReturn_901_, u'arguments':arguments}, var) + var.registers([u'returnArg']) + return var.get(u't').callprop(u'callExpression', var.get(u'_this2').get(u'file').callprop(u'addHelper', Js(u'possibleConstructorReturn')), Js([var.get(u'thisRef')]).callprop(u'concat', (var.get(u'returnArg') or Js([])))) + PyJs_wrapReturn_901_._set_name(u'wrapReturn') + var.put(u'wrapReturn', PyJs_wrapReturn_901_) + var.put(u'bodyPaths', var.get(u'body').callprop(u'get', Js(u'body'))) + if (var.get(u'bodyPaths').get(u'length') and var.get(u'bodyPaths').callprop(u'pop').callprop(u'isReturnStatement').neg()): + var.get(u'body').callprop(u'pushContainer', Js(u'body'), var.get(u't').callprop(u'returnStatement', (var.get(u'thisRef') if var.get(u'guaranteedSuperBeforeFinish') else var.get(u'wrapReturn')()))) + #for JS loop + var.put(u'_iterator5', var.get(u"this").get(u'superReturns')) + var.put(u'_isArray5', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator5'))) + var.put(u'_i5', Js(0.0)) + var.put(u'_iterator5', (var.get(u'_iterator5') if var.get(u'_isArray5') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator5')))) + while 1: + pass + if var.get(u'_isArray5'): + if (var.get(u'_i5')>=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i5').get(u'value')) + var.put(u'returnPath', var.get(u'_ref5')) + if var.get(u'returnPath').get(u'node').get(u'argument'): + var.put(u'ref', var.get(u'returnPath').get(u'scope').callprop(u'generateDeclaredUidIdentifier', Js(u'ret'))) + var.get(u'returnPath').callprop(u'get', Js(u'argument')).callprop(u'replaceWithMultiple', Js([var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'ref'), var.get(u'returnPath').get(u'node').get(u'argument')), var.get(u'wrapReturn')(var.get(u'ref'))])) + else: + var.get(u'returnPath').callprop(u'get', Js(u'argument')).callprop(u'replaceWith', var.get(u'wrapReturn')()) + + PyJs_verifyConstructor_899_._set_name(u'verifyConstructor') + var.get(u'ClassTransformer').get(u'prototype').put(u'verifyConstructor', PyJs_verifyConstructor_899_) + @Js + def PyJs_pushMethod_902_(node, path, this, arguments, var=var): + var = Scope({u'node':node, u'path':path, u'this':this, u'arguments':arguments, u'pushMethod':PyJs_pushMethod_902_}, var) + var.registers([u'node', u'scope', u'path']) + var.put(u'scope', (var.get(u'path').get(u'scope') if var.get(u'path') else var.get(u"this").get(u'scope'))) + if PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'method')): + if var.get(u"this").callprop(u'_processMethod', var.get(u'node'), var.get(u'scope')): + return var.get('undefined') + var.get(u"this").callprop(u'pushToMap', var.get(u'node'), Js(False), var.get(u"null"), var.get(u'scope')) + PyJs_pushMethod_902_._set_name(u'pushMethod') + var.get(u'ClassTransformer').get(u'prototype').put(u'pushMethod', PyJs_pushMethod_902_) + @Js + def PyJs__processMethod_903_(this, arguments, var=var): + var = Scope({u'this':this, u'_processMethod':PyJs__processMethod_903_, u'arguments':arguments}, var) + var.registers([]) + return Js(False) + PyJs__processMethod_903_._set_name(u'_processMethod') + var.get(u'ClassTransformer').get(u'prototype').put(u'_processMethod', PyJs__processMethod_903_) + @Js + def PyJs_pushConstructor_904_(replaceSupers, method, path, this, arguments, var=var): + var = Scope({u'this':this, u'replaceSupers':replaceSupers, u'arguments':arguments, u'path':path, u'method':method, u'pushConstructor':PyJs_pushConstructor_904_}, var) + var.registers([u'path', u'replaceSupers', u'construct', u'method']) + var.get(u"this").put(u'bareSupers', var.get(u'replaceSupers').get(u'bareSupers')) + var.get(u"this").put(u'superReturns', var.get(u'replaceSupers').get(u'returns')) + if var.get(u'path').get(u'scope').callprop(u'hasOwnBinding', var.get(u"this").get(u'classRef').get(u'name')): + var.get(u'path').get(u'scope').callprop(u'rename', var.get(u"this").get(u'classRef').get(u'name')) + var.put(u'construct', var.get(u"this").get(u'constructor')) + var.get(u"this").put(u'userConstructorPath', var.get(u'path')) + var.get(u"this").put(u'userConstructor', var.get(u'method')) + var.get(u"this").put(u'hasConstructor', var.get(u'true')) + var.get(u't').callprop(u'inheritsComments', var.get(u'construct'), var.get(u'method')) + var.get(u'construct').put(u'_ignoreUserWhitespace', var.get(u'true')) + var.get(u'construct').put(u'params', var.get(u'method').get(u'params')) + var.get(u't').callprop(u'inherits', var.get(u'construct').get(u'body'), var.get(u'method').get(u'body')) + var.get(u'construct').get(u'body').put(u'directives', var.get(u'method').get(u'body').get(u'directives')) + var.get(u"this").callprop(u'_pushConstructor') + PyJs_pushConstructor_904_._set_name(u'pushConstructor') + var.get(u'ClassTransformer').get(u'prototype').put(u'pushConstructor', PyJs_pushConstructor_904_) + @Js + def PyJs__pushConstructor_905_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'_pushConstructor':PyJs__pushConstructor_905_}, var) + var.registers([]) + if var.get(u"this").get(u'pushedConstructor'): + return var.get('undefined') + var.get(u"this").put(u'pushedConstructor', var.get(u'true')) + if (var.get(u"this").get(u'hasInstanceDescriptors') or var.get(u"this").get(u'hasStaticDescriptors')): + var.get(u"this").callprop(u'pushDescriptors') + var.get(u"this").get(u'body').callprop(u'push', var.get(u"this").get(u'constructor')) + var.get(u"this").callprop(u'pushInherits') + PyJs__pushConstructor_905_._set_name(u'_pushConstructor') + var.get(u'ClassTransformer').get(u'prototype').put(u'_pushConstructor', PyJs__pushConstructor_905_) + @Js + def PyJs_pushInherits_906_(this, arguments, var=var): + var = Scope({u'this':this, u'pushInherits':PyJs_pushInherits_906_, u'arguments':arguments}, var) + var.registers([]) + if (var.get(u"this").get(u'isDerived').neg() or var.get(u"this").get(u'pushedInherits')): + return var.get('undefined') + var.get(u"this").put(u'pushedInherits', var.get(u'true')) + var.get(u"this").get(u'body').callprop(u'unshift', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u"this").get(u'file').callprop(u'addHelper', Js(u'inherits')), Js([var.get(u"this").get(u'classRef'), var.get(u"this").get(u'superName')])))) + PyJs_pushInherits_906_._set_name(u'pushInherits') + var.get(u'ClassTransformer').get(u'prototype').put(u'pushInherits', PyJs_pushInherits_906_) + return var.get(u'ClassTransformer') + PyJs_anonymous_879_._set_name(u'anonymous') + var.put(u'ClassTransformer', PyJs_anonymous_879_()) + var.get(u'exports').put(u'default', var.get(u'ClassTransformer')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_865_._set_name(u'anonymous') +PyJs_Object_907_ = Js({u'babel-helper-define-map':Js(48.0),u'babel-helper-optimise-call-expression':Js(52.0),u'babel-helper-replace-supers':Js(54.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-template':Js(221.0),u'babel-traverse':Js(225.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_908_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_918_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_918_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_909_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u'loose', u'pushAssign', u'getValue', u'pushMutatorDefine', u't', u'template', u'buildMutatorMapAssign', u'spec']) + @Js + def PyJsHoisted_spec_(info, this, arguments, var=var): + var = Scope({u'info':info, u'this':this, u'arguments':arguments}, var) + var.registers([u'body', u'info', u'_isArray2', u'_ref4', u'_i2', u'prop', u'state', u'computedProps', u'objId', u'key', u'_iterator2']) + var.put(u'objId', var.get(u'info').get(u'objId')) + var.put(u'body', var.get(u'info').get(u'body')) + var.put(u'computedProps', var.get(u'info').get(u'computedProps')) + var.put(u'state', var.get(u'info').get(u'state')) + #for JS loop + var.put(u'_iterator2', var.get(u'computedProps')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i2').get(u'value')) + var.put(u'prop', var.get(u'_ref4')) + var.put(u'key', var.get(u't').callprop(u'toComputedKey', var.get(u'prop'))) + if (PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'get')) or PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'set'))): + var.get(u'pushMutatorDefine')(var.get(u'info'), var.get(u'prop')) + else: + PyJs_Object_911_ = Js({u'value':Js(u'__proto__')}) + if var.get(u't').callprop(u'isStringLiteral', var.get(u'key'), PyJs_Object_911_): + var.get(u'pushAssign')(var.get(u'objId'), var.get(u'prop'), var.get(u'body')) + else: + if PyJsStrictEq(var.get(u'computedProps').get(u'length'),Js(1.0)): + return var.get(u't').callprop(u'callExpression', var.get(u'state').callprop(u'addHelper', Js(u'defineProperty')), Js([var.get(u'info').get(u'initPropExpression'), var.get(u'key'), var.get(u'getValue')(var.get(u'prop'))])) + else: + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u'state').callprop(u'addHelper', Js(u'defineProperty')), Js([var.get(u'objId'), var.get(u'key'), var.get(u'getValue')(var.get(u'prop'))])))) + + PyJsHoisted_spec_.func_name = u'spec' + var.put(u'spec', PyJsHoisted_spec_) + @Js + def PyJsHoisted_pushMutatorDefine_(_ref2, prop, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'_ref2':_ref2, u'prop':prop}, var) + var.registers([u'body', u'maybeMemoise', u'_ref2', u'prop', u'objId', u'key', u'scope', u'getMutatorId']) + var.put(u'objId', var.get(u'_ref2').get(u'objId')) + var.put(u'body', var.get(u'_ref2').get(u'body')) + var.put(u'getMutatorId', var.get(u'_ref2').get(u'getMutatorId')) + var.put(u'scope', var.get(u'_ref2').get(u'scope')) + var.put(u'key', (var.get(u't').callprop(u'stringLiteral', var.get(u'prop').get(u'key').get(u'name')) if (var.get(u'prop').get(u'computed').neg() and var.get(u't').callprop(u'isIdentifier', var.get(u'prop').get(u'key'))) else var.get(u'prop').get(u'key'))) + var.put(u'maybeMemoise', var.get(u'scope').callprop(u'maybeGenerateMemoised', var.get(u'key'))) + if var.get(u'maybeMemoise'): + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'maybeMemoise'), var.get(u'key')))) + var.put(u'key', var.get(u'maybeMemoise')) + PyJs_Object_910_ = Js({u'MUTATOR_MAP_REF':var.get(u'getMutatorId')(),u'KEY':var.get(u'key'),u'VALUE':var.get(u'getValue')(var.get(u'prop')),u'KIND':var.get(u't').callprop(u'identifier', var.get(u'prop').get(u'kind'))}) + var.get(u'body').get(u'push').callprop(u'apply', var.get(u'body'), var.get(u'buildMutatorMapAssign')(PyJs_Object_910_)) + PyJsHoisted_pushMutatorDefine_.func_name = u'pushMutatorDefine' + var.put(u'pushMutatorDefine', PyJsHoisted_pushMutatorDefine_) + @Js + def PyJsHoisted_loose_(info, this, arguments, var=var): + var = Scope({u'info':info, u'this':this, u'arguments':arguments}, var) + var.registers([u'info', u'_isArray', u'_iterator', u'_ref3', u'prop', u'_i']) + #for JS loop + var.put(u'_iterator', var.get(u'info').get(u'computedProps')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i').get(u'value')) + var.put(u'prop', var.get(u'_ref3')) + if (PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'get')) or PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'set'))): + var.get(u'pushMutatorDefine')(var.get(u'info'), var.get(u'prop')) + else: + var.get(u'pushAssign')(var.get(u'info').get(u'objId'), var.get(u'prop'), var.get(u'info').get(u'body')) + + PyJsHoisted_loose_.func_name = u'loose' + var.put(u'loose', PyJsHoisted_loose_) + @Js + def PyJsHoisted_pushAssign_(objId, prop, body, this, arguments, var=var): + var = Scope({u'body':body, u'this':this, u'objId':objId, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'body', u'objId', u'prop']) + if (PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'get')) and PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'set'))): + var.get(u'pushMutatorDefine')(var.get(u'objId'), var.get(u'prop'), var.get(u'body')) + else: + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u't').callprop(u'memberExpression', var.get(u'objId'), var.get(u'prop').get(u'key'), (var.get(u'prop').get(u'computed') or var.get(u't').callprop(u'isLiteral', var.get(u'prop').get(u'key')))), var.get(u'getValue')(var.get(u'prop'))))) + PyJsHoisted_pushAssign_.func_name = u'pushAssign' + var.put(u'pushAssign', PyJsHoisted_pushAssign_) + @Js + def PyJsHoisted_getValue_(prop, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'prop']) + if var.get(u't').callprop(u'isObjectProperty', var.get(u'prop')): + return var.get(u'prop').get(u'value') + else: + if var.get(u't').callprop(u'isObjectMethod', var.get(u'prop')): + return var.get(u't').callprop(u'functionExpression', var.get(u"null"), var.get(u'prop').get(u'params'), var.get(u'prop').get(u'body'), var.get(u'prop').get(u'generator'), var.get(u'prop').get(u'async')) + PyJsHoisted_getValue_.func_name = u'getValue' + var.put(u'getValue', PyJsHoisted_getValue_) + var.put(u't', var.get(u'_ref').get(u'types')) + var.put(u'template', var.get(u'_ref').get(u'template')) + var.put(u'buildMutatorMapAssign', var.get(u'template')(Js(u'\n MUTATOR_MAP_REF[KEY] = MUTATOR_MAP_REF[KEY] || {};\n MUTATOR_MAP_REF[KEY].KIND = VALUE;\n '))) + pass + pass + pass + pass + pass + @Js + def PyJs_exit_915_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'exit':PyJs_exit_915_, u'arguments':arguments}, var) + var.registers([u'body', u'_isArray4', u'_isArray3', u'initProps', u'single', u'computedProps', u'_i4', u'_i3', u'hasComputed', u'prop', u'state', u'scope', u'getMutatorId', u'node', u'parent', u'initPropExpression', u'mutatorRef', u'foundComputed', u'objId', u'path', u'_prop', u'_ref6', u'_ref5', u'callback', u'_iterator4', u'_iterator3']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'parent', var.get(u'path').get(u'parent')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'hasComputed', Js(False)) + #for JS loop + var.put(u'_iterator3', var.get(u'node').get(u'properties')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i3').get(u'value')) + var.put(u'prop', var.get(u'_ref5')) + var.put(u'hasComputed', PyJsStrictEq(var.get(u'prop').get(u'computed'),var.get(u'true'))) + if var.get(u'hasComputed'): + break + + if var.get(u'hasComputed').neg(): + return var.get('undefined') + var.put(u'initProps', Js([])) + var.put(u'computedProps', Js([])) + var.put(u'foundComputed', Js(False)) + #for JS loop + var.put(u'_iterator4', var.get(u'node').get(u'properties')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref6', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref6', var.get(u'_i4').get(u'value')) + var.put(u'_prop', var.get(u'_ref6')) + if var.get(u'_prop').get(u'computed'): + var.put(u'foundComputed', var.get(u'true')) + if var.get(u'foundComputed'): + var.get(u'computedProps').callprop(u'push', var.get(u'_prop')) + else: + var.get(u'initProps').callprop(u'push', var.get(u'_prop')) + + var.put(u'objId', var.get(u'scope').callprop(u'generateUidIdentifierBasedOnNode', var.get(u'parent'))) + var.put(u'initPropExpression', var.get(u't').callprop(u'objectExpression', var.get(u'initProps'))) + var.put(u'body', Js([])) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'objId'), var.get(u'initPropExpression'))]))) + var.put(u'callback', var.get(u'spec')) + if var.get(u'state').get(u'opts').get(u'loose'): + var.put(u'callback', var.get(u'loose')) + var.put(u'mutatorRef', PyJsComma(Js(0.0), Js(None))) + @Js + def PyJs_getMutatorId_916_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getMutatorId':PyJs_getMutatorId_916_}, var) + var.registers([]) + if var.get(u'mutatorRef').neg(): + var.put(u'mutatorRef', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'mutatorMap'))) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'mutatorRef'), var.get(u't').callprop(u'objectExpression', Js([])))]))) + return var.get(u'mutatorRef') + PyJs_getMutatorId_916_._set_name(u'getMutatorId') + var.put(u'getMutatorId', PyJs_getMutatorId_916_) + PyJs_Object_917_ = Js({u'scope':var.get(u'scope'),u'objId':var.get(u'objId'),u'body':var.get(u'body'),u'computedProps':var.get(u'computedProps'),u'initPropExpression':var.get(u'initPropExpression'),u'getMutatorId':var.get(u'getMutatorId'),u'state':var.get(u'state')}) + var.put(u'single', var.get(u'callback')(PyJs_Object_917_)) + if var.get(u'mutatorRef'): + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u'state').callprop(u'addHelper', Js(u'defineEnumerableProperties')), Js([var.get(u'objId'), var.get(u'mutatorRef')])))) + if var.get(u'single'): + var.get(u'path').callprop(u'replaceWith', var.get(u'single')) + else: + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u'objId'))) + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'body')) + PyJs_exit_915_._set_name(u'exit') + PyJs_Object_914_ = Js({u'exit':PyJs_exit_915_}) + PyJs_Object_913_ = Js({u'ObjectExpression':PyJs_Object_914_}) + PyJs_Object_912_ = Js({u'visitor':PyJs_Object_913_}) + return PyJs_Object_912_ + PyJs_anonymous_909_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_909_) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_908_._set_name(u'anonymous') +PyJs_Object_919_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_920_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_classCallCheck2', u'require', u'module', u'_interopRequireDefault', u'_classCallCheck3', u'_getIterator3', u'_getIterator2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_950_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_950_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_921_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'DestructuringTransformer', u'hasRest', u'variableDeclarationHasPattern', u't', u'_ref', u'arrayUnpackVisitor']) + @Js + def PyJsHoisted_hasRest_(pattern, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'arguments':arguments}, var) + var.registers([u'_isArray2', u'pattern', u'_ref3', u'_i2', u'elem', u'_iterator2']) + #for JS loop + var.put(u'_iterator2', var.get(u'pattern').get(u'elements')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i2').get(u'value')) + var.put(u'elem', var.get(u'_ref3')) + if var.get(u't').callprop(u'isRestElement', var.get(u'elem')): + return var.get(u'true') + + return Js(False) + PyJsHoisted_hasRest_.func_name = u'hasRest' + var.put(u'hasRest', PyJsHoisted_hasRest_) + @Js + def PyJsHoisted_variableDeclarationHasPattern_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'_ref2', u'declar', u'_i']) + #for JS loop + var.put(u'_iterator', var.get(u'node').get(u'declarations')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'declar', var.get(u'_ref2')) + if var.get(u't').callprop(u'isPattern', var.get(u'declar').get(u'id')): + return var.get(u'true') + + return Js(False) + PyJsHoisted_variableDeclarationHasPattern_.func_name = u'variableDeclarationHasPattern' + var.put(u'variableDeclarationHasPattern', PyJsHoisted_variableDeclarationHasPattern_) + var.put(u't', var.get(u'_ref').get(u'types')) + pass + pass + @Js + def PyJs_ReferencedIdentifier_923_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_923_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if var.get(u'state').get(u'bindings').get(var.get(u'path').get(u'node').get(u'name')): + var.get(u'state').put(u'deopt', var.get(u'true')) + var.get(u'path').callprop(u'stop') + PyJs_ReferencedIdentifier_923_._set_name(u'ReferencedIdentifier') + PyJs_Object_922_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_923_}) + var.put(u'arrayUnpackVisitor', PyJs_Object_922_) + @Js + def PyJs_anonymous_924_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'DestructuringTransformer']) + @Js + def PyJsHoisted_DestructuringTransformer_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'opts']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'DestructuringTransformer')) + var.get(u"this").put(u'blockHoist', var.get(u'opts').get(u'blockHoist')) + var.get(u"this").put(u'operator', var.get(u'opts').get(u'operator')) + PyJs_Object_925_ = Js({}) + var.get(u"this").put(u'arrays', PyJs_Object_925_) + var.get(u"this").put(u'nodes', (var.get(u'opts').get(u'nodes') or Js([]))) + var.get(u"this").put(u'scope', var.get(u'opts').get(u'scope')) + var.get(u"this").put(u'file', var.get(u'opts').get(u'file')) + var.get(u"this").put(u'kind', var.get(u'opts').get(u'kind')) + PyJsHoisted_DestructuringTransformer_.func_name = u'DestructuringTransformer' + var.put(u'DestructuringTransformer', PyJsHoisted_DestructuringTransformer_) + pass + @Js + def PyJs_buildVariableAssignment_926_(id, init, this, arguments, var=var): + var = Scope({u'this':this, u'init':init, u'buildVariableAssignment':PyJs_buildVariableAssignment_926_, u'id':id, u'arguments':arguments}, var) + var.registers([u'node', u'init', u'id', u'op']) + var.put(u'op', var.get(u"this").get(u'operator')) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'id')): + var.put(u'op', Js(u'=')) + var.put(u'node', PyJsComma(Js(0.0), Js(None))) + if var.get(u'op'): + var.put(u'node', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', var.get(u'op'), var.get(u'id'), var.get(u'init')))) + else: + var.put(u'node', var.get(u't').callprop(u'variableDeclaration', var.get(u"this").get(u'kind'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'id'), var.get(u'init'))]))) + var.get(u'node').put(u'_blockHoist', var.get(u"this").get(u'blockHoist')) + return var.get(u'node') + PyJs_buildVariableAssignment_926_._set_name(u'buildVariableAssignment') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'buildVariableAssignment', PyJs_buildVariableAssignment_926_) + @Js + def PyJs_buildVariableDeclaration_927_(id, init, this, arguments, var=var): + var = Scope({u'this':this, u'init':init, u'buildVariableDeclaration':PyJs_buildVariableDeclaration_927_, u'id':id, u'arguments':arguments}, var) + var.registers([u'init', u'declar', u'id']) + var.put(u'declar', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'id'), var.get(u'init'))]))) + var.get(u'declar').put(u'_blockHoist', var.get(u"this").get(u'blockHoist')) + return var.get(u'declar') + PyJs_buildVariableDeclaration_927_._set_name(u'buildVariableDeclaration') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'buildVariableDeclaration', PyJs_buildVariableDeclaration_927_) + @Js + def PyJs_push_928_(id, init, this, arguments, var=var): + var = Scope({u'this':this, u'push':PyJs_push_928_, u'init':init, u'id':id, u'arguments':arguments}, var) + var.registers([u'init', u'id']) + if var.get(u't').callprop(u'isObjectPattern', var.get(u'id')): + var.get(u"this").callprop(u'pushObjectPattern', var.get(u'id'), var.get(u'init')) + else: + if var.get(u't').callprop(u'isArrayPattern', var.get(u'id')): + var.get(u"this").callprop(u'pushArrayPattern', var.get(u'id'), var.get(u'init')) + else: + if var.get(u't').callprop(u'isAssignmentPattern', var.get(u'id')): + var.get(u"this").callprop(u'pushAssignmentPattern', var.get(u'id'), var.get(u'init')) + else: + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'buildVariableAssignment', var.get(u'id'), var.get(u'init'))) + PyJs_push_928_._set_name(u'push') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'push', PyJs_push_928_) + @Js + def PyJs_toArray_929_(node, count, this, arguments, var=var): + var = Scope({u'node':node, u'count':count, u'this':this, u'arguments':arguments, u'toArray':PyJs_toArray_929_}, var) + var.registers([u'node', u'count']) + if (var.get(u"this").get(u'file').get(u'opts').get(u'loose') or (var.get(u't').callprop(u'isIdentifier', var.get(u'node')) and var.get(u"this").get(u'arrays').get(var.get(u'node').get(u'name')))): + return var.get(u'node') + else: + return var.get(u"this").get(u'scope').callprop(u'toArray', var.get(u'node'), var.get(u'count')) + PyJs_toArray_929_._set_name(u'toArray') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'toArray', PyJs_toArray_929_) + @Js + def PyJs_pushAssignmentPattern_930_(pattern, valueRef, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'valueRef':valueRef, u'arguments':arguments, u'pushAssignmentPattern':PyJs_pushAssignmentPattern_930_}, var) + var.registers([u'pattern', u'tempValueDefault', u'declar', u'tempValueRef', u'tempConditional', u'valueRef', u'left']) + var.put(u'tempValueRef', var.get(u"this").get(u'scope').callprop(u'generateUidIdentifierBasedOnNode', var.get(u'valueRef'))) + var.put(u'declar', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'tempValueRef'), var.get(u'valueRef'))]))) + var.get(u'declar').put(u'_blockHoist', var.get(u"this").get(u'blockHoist')) + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u'declar')) + var.put(u'tempConditional', var.get(u't').callprop(u'conditionalExpression', var.get(u't').callprop(u'binaryExpression', Js(u'==='), var.get(u'tempValueRef'), var.get(u't').callprop(u'identifier', Js(u'undefined'))), var.get(u'pattern').get(u'right'), var.get(u'tempValueRef'))) + var.put(u'left', var.get(u'pattern').get(u'left')) + if var.get(u't').callprop(u'isPattern', var.get(u'left')): + var.put(u'tempValueDefault', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'tempValueRef'), var.get(u'tempConditional')))) + var.get(u'tempValueDefault').put(u'_blockHoist', var.get(u"this").get(u'blockHoist')) + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u'tempValueDefault')) + var.get(u"this").callprop(u'push', var.get(u'left'), var.get(u'tempValueRef')) + else: + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'buildVariableAssignment', var.get(u'left'), var.get(u'tempConditional'))) + PyJs_pushAssignmentPattern_930_._set_name(u'pushAssignmentPattern') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'pushAssignmentPattern', PyJs_pushAssignmentPattern_930_) + @Js + def PyJs_pushObjectRest_931_(pattern, objRef, spreadProp, spreadPropIndex, this, arguments, var=var): + var = Scope({u'objRef':objRef, u'arguments':arguments, u'pushObjectRest':PyJs_pushObjectRest_931_, u'this':this, u'pattern':pattern, u'spreadProp':spreadProp, u'spreadPropIndex':spreadPropIndex}, var) + var.registers([u'keys', u'pattern', u'spreadProp', u'value', u'prop', u'objRef', u'i', u'key', u'spreadPropIndex']) + var.put(u'keys', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'pattern').get(u'properties').get(u'length')): + try: + var.put(u'prop', var.get(u'pattern').get(u'properties').get(var.get(u'i'))) + if (var.get(u'i')>=var.get(u'spreadPropIndex')): + break + if var.get(u't').callprop(u'isRestProperty', var.get(u'prop')): + continue + var.put(u'key', var.get(u'prop').get(u'key')) + if (var.get(u't').callprop(u'isIdentifier', var.get(u'key')) and var.get(u'prop').get(u'computed').neg()): + var.put(u'key', var.get(u't').callprop(u'stringLiteral', var.get(u'prop').get(u'key').get(u'name'))) + var.get(u'keys').callprop(u'push', var.get(u'key')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.put(u'keys', var.get(u't').callprop(u'arrayExpression', var.get(u'keys'))) + var.put(u'value', var.get(u't').callprop(u'callExpression', var.get(u"this").get(u'file').callprop(u'addHelper', Js(u'objectWithoutProperties')), Js([var.get(u'objRef'), var.get(u'keys')]))) + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'buildVariableAssignment', var.get(u'spreadProp').get(u'argument'), var.get(u'value'))) + PyJs_pushObjectRest_931_._set_name(u'pushObjectRest') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'pushObjectRest', PyJs_pushObjectRest_931_) + @Js + def PyJs_pushObjectProperty_932_(prop, propRef, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'pushObjectProperty':PyJs_pushObjectProperty_932_, u'propRef':propRef, u'prop':prop}, var) + var.registers([u'objRef', u'pattern', u'propRef', u'prop']) + if var.get(u't').callprop(u'isLiteral', var.get(u'prop').get(u'key')): + var.get(u'prop').put(u'computed', var.get(u'true')) + var.put(u'pattern', var.get(u'prop').get(u'value')) + var.put(u'objRef', var.get(u't').callprop(u'memberExpression', var.get(u'propRef'), var.get(u'prop').get(u'key'), var.get(u'prop').get(u'computed'))) + if var.get(u't').callprop(u'isPattern', var.get(u'pattern')): + var.get(u"this").callprop(u'push', var.get(u'pattern'), var.get(u'objRef')) + else: + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'buildVariableAssignment', var.get(u'pattern'), var.get(u'objRef'))) + PyJs_pushObjectProperty_932_._set_name(u'pushObjectProperty') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'pushObjectProperty', PyJs_pushObjectProperty_932_) + @Js + def PyJs_pushObjectPattern_933_(pattern, objRef, this, arguments, var=var): + var = Scope({u'objRef':objRef, u'pattern':pattern, u'pushObjectPattern':PyJs_pushObjectPattern_933_, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'pattern', u'objRef', u'temp', u'prop']) + if var.get(u'pattern').get(u'properties').get(u'length').neg(): + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u"this").get(u'file').callprop(u'addHelper', Js(u'objectDestructuringEmpty')), Js([var.get(u'objRef')])))) + if ((var.get(u'pattern').get(u'properties').get(u'length')>Js(1.0)) and var.get(u"this").get(u'scope').callprop(u'isStatic', var.get(u'objRef')).neg()): + var.put(u'temp', var.get(u"this").get(u'scope').callprop(u'generateUidIdentifierBasedOnNode', var.get(u'objRef'))) + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'buildVariableDeclaration', var.get(u'temp'), var.get(u'objRef'))) + var.put(u'objRef', var.get(u'temp')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'pattern').get(u'properties').get(u'length')): + try: + var.put(u'prop', var.get(u'pattern').get(u'properties').get(var.get(u'i'))) + if var.get(u't').callprop(u'isRestProperty', var.get(u'prop')): + var.get(u"this").callprop(u'pushObjectRest', var.get(u'pattern'), var.get(u'objRef'), var.get(u'prop'), var.get(u'i')) + else: + var.get(u"this").callprop(u'pushObjectProperty', var.get(u'prop'), var.get(u'objRef')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJs_pushObjectPattern_933_._set_name(u'pushObjectPattern') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'pushObjectPattern', PyJs_pushObjectPattern_933_) + @Js + def PyJs_canUnpackArrayPattern_934_(pattern, arr, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'arr':arr, u'canUnpackArrayPattern':PyJs_canUnpackArrayPattern_934_, u'arguments':arguments}, var) + var.registers([u'_i4', u'arr', u'_isArray4', u'_isArray3', u'pattern', u'_ref5', u'_ref4', u'_i3', u'elem', u'state', u'_elem', u'_iterator4', u'bindings', u'_iterator3']) + if var.get(u't').callprop(u'isArrayExpression', var.get(u'arr')).neg(): + return Js(False) + if (var.get(u'pattern').get(u'elements').get(u'length')>var.get(u'arr').get(u'elements').get(u'length')): + return var.get('undefined') + if ((var.get(u'pattern').get(u'elements').get(u'length')<var.get(u'arr').get(u'elements').get(u'length')) and var.get(u'hasRest')(var.get(u'pattern')).neg()): + return Js(False) + #for JS loop + var.put(u'_iterator3', var.get(u'pattern').get(u'elements')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i3').get(u'value')) + var.put(u'elem', var.get(u'_ref4')) + if var.get(u'elem').neg(): + return Js(False) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'elem')): + return Js(False) + + #for JS loop + var.put(u'_iterator4', var.get(u'arr').get(u'elements')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i4').get(u'value')) + var.put(u'_elem', var.get(u'_ref5')) + if var.get(u't').callprop(u'isSpreadElement', var.get(u'_elem')): + return Js(False) + if var.get(u't').callprop(u'isCallExpression', var.get(u'_elem')): + return Js(False) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'_elem')): + return Js(False) + + var.put(u'bindings', var.get(u't').callprop(u'getBindingIdentifiers', var.get(u'pattern'))) + PyJs_Object_935_ = Js({u'deopt':Js(False),u'bindings':var.get(u'bindings')}) + var.put(u'state', PyJs_Object_935_) + var.get(u"this").get(u'scope').callprop(u'traverse', var.get(u'arr'), var.get(u'arrayUnpackVisitor'), var.get(u'state')) + return var.get(u'state').get(u'deopt').neg() + PyJs_canUnpackArrayPattern_934_._set_name(u'canUnpackArrayPattern') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'canUnpackArrayPattern', PyJs_canUnpackArrayPattern_934_) + @Js + def PyJs_pushUnpackedArrayPattern_936_(pattern, arr, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'arr':arr, u'arguments':arguments, u'pushUnpackedArrayPattern':PyJs_pushUnpackedArrayPattern_936_}, var) + var.registers([u'i', u'pattern', u'arr', u'elem']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'pattern').get(u'elements').get(u'length')): + try: + var.put(u'elem', var.get(u'pattern').get(u'elements').get(var.get(u'i'))) + if var.get(u't').callprop(u'isRestElement', var.get(u'elem')): + var.get(u"this").callprop(u'push', var.get(u'elem').get(u'argument'), var.get(u't').callprop(u'arrayExpression', var.get(u'arr').get(u'elements').callprop(u'slice', var.get(u'i')))) + else: + var.get(u"this").callprop(u'push', var.get(u'elem'), var.get(u'arr').get(u'elements').get(var.get(u'i'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJs_pushUnpackedArrayPattern_936_._set_name(u'pushUnpackedArrayPattern') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'pushUnpackedArrayPattern', PyJs_pushUnpackedArrayPattern_936_) + @Js + def PyJs_pushArrayPattern_937_(pattern, arrayRef, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'arguments':arguments, u'arrayRef':arrayRef, u'pushArrayPattern':PyJs_pushArrayPattern_937_}, var) + var.registers([u'count', u'toArray', u'i', u'pattern', u'elem', u'arrayRef', u'elemRef']) + if var.get(u'pattern').get(u'elements').neg(): + return var.get('undefined') + if var.get(u"this").callprop(u'canUnpackArrayPattern', var.get(u'pattern'), var.get(u'arrayRef')): + return var.get(u"this").callprop(u'pushUnpackedArrayPattern', var.get(u'pattern'), var.get(u'arrayRef')) + var.put(u'count', (var.get(u'hasRest')(var.get(u'pattern')).neg() and var.get(u'pattern').get(u'elements').get(u'length'))) + var.put(u'toArray', var.get(u"this").callprop(u'toArray', var.get(u'arrayRef'), var.get(u'count'))) + if var.get(u't').callprop(u'isIdentifier', var.get(u'toArray')): + var.put(u'arrayRef', var.get(u'toArray')) + else: + var.put(u'arrayRef', var.get(u"this").get(u'scope').callprop(u'generateUidIdentifierBasedOnNode', var.get(u'arrayRef'))) + var.get(u"this").get(u'arrays').put(var.get(u'arrayRef').get(u'name'), var.get(u'true')) + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'buildVariableDeclaration', var.get(u'arrayRef'), var.get(u'toArray'))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'pattern').get(u'elements').get(u'length')): + try: + var.put(u'elem', var.get(u'pattern').get(u'elements').get(var.get(u'i'))) + if var.get(u'elem').neg(): + continue + var.put(u'elemRef', PyJsComma(Js(0.0), Js(None))) + if var.get(u't').callprop(u'isRestElement', var.get(u'elem')): + var.put(u'elemRef', var.get(u"this").callprop(u'toArray', var.get(u'arrayRef'))) + if (var.get(u'i')>Js(0.0)): + var.put(u'elemRef', var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u'elemRef'), var.get(u't').callprop(u'identifier', Js(u'slice'))), Js([var.get(u't').callprop(u'numericLiteral', var.get(u'i'))]))) + var.put(u'elem', var.get(u'elem').get(u'argument')) + else: + var.put(u'elemRef', var.get(u't').callprop(u'memberExpression', var.get(u'arrayRef'), var.get(u't').callprop(u'numericLiteral', var.get(u'i')), var.get(u'true'))) + var.get(u"this").callprop(u'push', var.get(u'elem'), var.get(u'elemRef')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJs_pushArrayPattern_937_._set_name(u'pushArrayPattern') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'pushArrayPattern', PyJs_pushArrayPattern_937_) + @Js + def PyJs_init_938_(pattern, ref, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'init':PyJs_init_938_, u'ref':ref, u'arguments':arguments}, var) + var.registers([u'pattern', u'memo', u'ref']) + if (var.get(u't').callprop(u'isArrayExpression', var.get(u'ref')).neg() and var.get(u't').callprop(u'isMemberExpression', var.get(u'ref')).neg()): + var.put(u'memo', var.get(u"this").get(u'scope').callprop(u'maybeGenerateMemoised', var.get(u'ref'), var.get(u'true'))) + if var.get(u'memo'): + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'buildVariableDeclaration', var.get(u'memo'), var.get(u'ref'))) + var.put(u'ref', var.get(u'memo')) + var.get(u"this").callprop(u'push', var.get(u'pattern'), var.get(u'ref')) + return var.get(u"this").get(u'nodes') + PyJs_init_938_._set_name(u'init') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'init', PyJs_init_938_) + return var.get(u'DestructuringTransformer') + PyJs_anonymous_924_._set_name(u'anonymous') + var.put(u'DestructuringTransformer', PyJs_anonymous_924_()) + @Js + def PyJs_ExportNamedDeclaration_941_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'ExportNamedDeclaration':PyJs_ExportNamedDeclaration_941_}, var) + var.registers([u'id', u'specifiers', u'path', u'name', u'declaration']) + var.put(u'declaration', var.get(u'path').callprop(u'get', Js(u'declaration'))) + if var.get(u'declaration').callprop(u'isVariableDeclaration').neg(): + return var.get('undefined') + if var.get(u'variableDeclarationHasPattern')(var.get(u'declaration').get(u'node')).neg(): + return var.get('undefined') + var.put(u'specifiers', Js([])) + for PyJsTemp in var.get(u'path').callprop(u'getOuterBindingIdentifiers', var.get(u'path')): + var.put(u'name', PyJsTemp) + var.put(u'id', var.get(u't').callprop(u'identifier', var.get(u'name'))) + var.get(u'specifiers').callprop(u'push', var.get(u't').callprop(u'exportSpecifier', var.get(u'id'), var.get(u'id'))) + var.get(u'path').callprop(u'replaceWith', var.get(u'declaration').get(u'node')) + var.get(u'path').callprop(u'insertAfter', var.get(u't').callprop(u'exportNamedDeclaration', var.get(u"null"), var.get(u'specifiers'))) + PyJs_ExportNamedDeclaration_941_._set_name(u'ExportNamedDeclaration') + @Js + def PyJs_ForXStatement_942_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file, u'ForXStatement':PyJs_ForXStatement_942_}, var) + var.registers([u'node', u'destructuring', u'file', u'temp', u'pattern', u'key', u'path', u'scope', u'nodes', u'block', u'left']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'left', var.get(u'node').get(u'left')) + if var.get(u't').callprop(u'isPattern', var.get(u'left')): + var.put(u'temp', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref'))) + var.get(u'node').put(u'left', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'temp'))]))) + var.get(u'path').callprop(u'ensureBlock') + var.get(u'node').get(u'body').get(u'body').callprop(u'unshift', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'left'), var.get(u'temp'))]))) + return var.get('undefined') + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'left')).neg(): + return var.get('undefined') + var.put(u'pattern', var.get(u'left').get(u'declarations').get(u'0').get(u'id')) + if var.get(u't').callprop(u'isPattern', var.get(u'pattern')).neg(): + return var.get('undefined') + var.put(u'key', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref'))) + var.get(u'node').put(u'left', var.get(u't').callprop(u'variableDeclaration', var.get(u'left').get(u'kind'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'key'), var.get(u"null"))]))) + var.put(u'nodes', Js([])) + PyJs_Object_943_ = Js({u'kind':var.get(u'left').get(u'kind'),u'file':var.get(u'file'),u'scope':var.get(u'scope'),u'nodes':var.get(u'nodes')}) + var.put(u'destructuring', var.get(u'DestructuringTransformer').create(PyJs_Object_943_)) + var.get(u'destructuring').callprop(u'init', var.get(u'pattern'), var.get(u'key')) + var.get(u'path').callprop(u'ensureBlock') + var.put(u'block', var.get(u'node').get(u'body')) + var.get(u'block').put(u'body', var.get(u'nodes').callprop(u'concat', var.get(u'block').get(u'body'))) + PyJs_ForXStatement_942_._set_name(u'ForXStatement') + @Js + def PyJs_CatchClause_944_(_ref6, file, this, arguments, var=var): + var = Scope({u'this':this, u'_ref6':_ref6, u'arguments':arguments, u'file':file, u'CatchClause':PyJs_CatchClause_944_}, var) + var.registers([u'node', u'destructuring', u'pattern', u'file', u'_ref6', u'scope', u'nodes', u'ref']) + var.put(u'node', var.get(u'_ref6').get(u'node')) + var.put(u'scope', var.get(u'_ref6').get(u'scope')) + var.put(u'pattern', var.get(u'node').get(u'param')) + if var.get(u't').callprop(u'isPattern', var.get(u'pattern')).neg(): + return var.get('undefined') + var.put(u'ref', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref'))) + var.get(u'node').put(u'param', var.get(u'ref')) + var.put(u'nodes', Js([])) + PyJs_Object_945_ = Js({u'kind':Js(u'let'),u'file':var.get(u'file'),u'scope':var.get(u'scope'),u'nodes':var.get(u'nodes')}) + var.put(u'destructuring', var.get(u'DestructuringTransformer').create(PyJs_Object_945_)) + var.get(u'destructuring').callprop(u'init', var.get(u'pattern'), var.get(u'ref')) + var.get(u'node').get(u'body').put(u'body', var.get(u'nodes').callprop(u'concat', var.get(u'node').get(u'body').get(u'body'))) + PyJs_CatchClause_944_._set_name(u'CatchClause') + @Js + def PyJs_AssignmentExpression_946_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file, u'AssignmentExpression':PyJs_AssignmentExpression_946_}, var) + var.registers([u'node', u'destructuring', u'file', u'path', u'scope', u'nodes', u'ref']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + if var.get(u't').callprop(u'isPattern', var.get(u'node').get(u'left')).neg(): + return var.get('undefined') + var.put(u'nodes', Js([])) + PyJs_Object_947_ = Js({u'operator':var.get(u'node').get(u'operator'),u'file':var.get(u'file'),u'scope':var.get(u'scope'),u'nodes':var.get(u'nodes')}) + var.put(u'destructuring', var.get(u'DestructuringTransformer').create(PyJs_Object_947_)) + var.put(u'ref', PyJsComma(Js(0.0), Js(None))) + if (var.get(u'path').callprop(u'isCompletionRecord') or var.get(u'path').get(u'parentPath').callprop(u'isExpressionStatement').neg()): + var.put(u'ref', var.get(u'scope').callprop(u'generateUidIdentifierBasedOnNode', var.get(u'node').get(u'right'), Js(u'ref'))) + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'ref'), var.get(u'node').get(u'right'))]))) + if var.get(u't').callprop(u'isArrayExpression', var.get(u'node').get(u'right')): + var.get(u'destructuring').get(u'arrays').put(var.get(u'ref').get(u'name'), var.get(u'true')) + var.get(u'destructuring').callprop(u'init', var.get(u'node').get(u'left'), (var.get(u'ref') or var.get(u'node').get(u'right'))) + if var.get(u'ref'): + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u'ref'))) + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'nodes')) + PyJs_AssignmentExpression_946_._set_name(u'AssignmentExpression') + @Js + def PyJs_VariableDeclaration_948_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file, u'VariableDeclaration':PyJs_VariableDeclaration_948_}, var) + var.registers([u'node', u'_isArray5', u'patternId', u'_ref7', u'parent', u'i', u'pattern', u'_i5', u'tail', u'_iterator5', u'_node', u'declar', u'nodesOut', u'file', u'path', u'destructuring', u'scope', u'nodes', u'_tail$declarations']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'parent', var.get(u'path').get(u'parent')) + if var.get(u't').callprop(u'isForXStatement', var.get(u'parent')): + return var.get('undefined') + if (var.get(u'parent').neg() or var.get(u'path').get(u'container').neg()): + return var.get('undefined') + if var.get(u'variableDeclarationHasPattern')(var.get(u'node')).neg(): + return var.get('undefined') + var.put(u'nodes', Js([])) + var.put(u'declar', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'node').get(u'declarations').get(u'length')): + try: + var.put(u'declar', var.get(u'node').get(u'declarations').get(var.get(u'i'))) + var.put(u'patternId', var.get(u'declar').get(u'init')) + var.put(u'pattern', var.get(u'declar').get(u'id')) + PyJs_Object_949_ = Js({u'blockHoist':var.get(u'node').get(u'_blockHoist'),u'nodes':var.get(u'nodes'),u'scope':var.get(u'scope'),u'kind':var.get(u'node').get(u'kind'),u'file':var.get(u'file')}) + var.put(u'destructuring', var.get(u'DestructuringTransformer').create(PyJs_Object_949_)) + if var.get(u't').callprop(u'isPattern', var.get(u'pattern')): + var.get(u'destructuring').callprop(u'init', var.get(u'pattern'), var.get(u'patternId')) + if PyJsStrictNeq((+var.get(u'i')),(var.get(u'node').get(u'declarations').get(u'length')-Js(1.0))): + var.get(u't').callprop(u'inherits', var.get(u'nodes').get((var.get(u'nodes').get(u'length')-Js(1.0))), var.get(u'declar')) + else: + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'inherits', var.get(u'destructuring').callprop(u'buildVariableAssignment', var.get(u'declar').get(u'id'), var.get(u'declar').get(u'init')), var.get(u'declar'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.put(u'nodesOut', Js([])) + #for JS loop + var.put(u'_iterator5', var.get(u'nodes')) + var.put(u'_isArray5', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator5'))) + var.put(u'_i5', Js(0.0)) + var.put(u'_iterator5', (var.get(u'_iterator5') if var.get(u'_isArray5') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator5')))) + while 1: + pass + if var.get(u'_isArray5'): + if (var.get(u'_i5')>=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref7', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref7', var.get(u'_i5').get(u'value')) + var.put(u'_node', var.get(u'_ref7')) + var.put(u'tail', var.get(u'nodesOut').get((var.get(u'nodesOut').get(u'length')-Js(1.0)))) + if (((var.get(u'tail') and var.get(u't').callprop(u'isVariableDeclaration', var.get(u'tail'))) and var.get(u't').callprop(u'isVariableDeclaration', var.get(u'_node'))) and PyJsStrictEq(var.get(u'tail').get(u'kind'),var.get(u'_node').get(u'kind'))): + pass + var.put(u'_tail$declarations', var.get(u'tail').get(u'declarations')).get(u'push').callprop(u'apply', var.get(u'_tail$declarations'), var.get(u'_node').get(u'declarations')) + else: + var.get(u'nodesOut').callprop(u'push', var.get(u'_node')) + + if PyJsStrictEq(var.get(u'nodesOut').get(u'length'),Js(1.0)): + var.get(u'path').callprop(u'replaceWith', var.get(u'nodesOut').get(u'0')) + else: + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'nodesOut')) + PyJs_VariableDeclaration_948_._set_name(u'VariableDeclaration') + PyJs_Object_940_ = Js({u'ExportNamedDeclaration':PyJs_ExportNamedDeclaration_941_,u'ForXStatement':PyJs_ForXStatement_942_,u'CatchClause':PyJs_CatchClause_944_,u'AssignmentExpression':PyJs_AssignmentExpression_946_,u'VariableDeclaration':PyJs_VariableDeclaration_948_}) + PyJs_Object_939_ = Js({u'visitor':PyJs_Object_940_}) + return PyJs_Object_939_ + PyJs_anonymous_921_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_921_) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_920_._set_name(u'anonymous') +PyJs_Object_951_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/classCallCheck':Js(110.0)}) +@Js +def PyJs_anonymous_952_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_create', u'exports', u'_interopRequireWildcard', u'getName', u'_babelTypes', u'module', u'_create2', u't', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'require']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_959_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_959_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_getName_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + if var.get(u't').callprop(u'isIdentifier', var.get(u'key')): + return var.get(u'key').get(u'name') + return var.get(u'key').get(u'value').callprop(u'toString') + PyJsHoisted_getName_.func_name = u'getName' + var.put(u'getName', PyJsHoisted_getName_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_958_ = Js({}) + var.put(u'newObj', PyJs_Object_958_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_create', var.get(u'require')(Js(u'babel-runtime/core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + @Js + def PyJs_anonymous_953_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_ObjectExpression_956_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ObjectExpression':PyJs_ObjectExpression_956_, u'arguments':arguments}, var) + var.registers([u'node', u'alreadySeenGetters', u'_isArray', u'plainProps', u'name', u'alreadySeenSetters', u'alreadySeenData', u'prop', u'_i', u'path', u'isDuplicate', u'_iterator', u'_ref']) + var.put(u'node', var.get(u'path').get(u'node')) + @Js + def PyJs_anonymous_957_(prop, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'prop']) + return (var.get(u't').callprop(u'isSpreadProperty', var.get(u'prop')).neg() and var.get(u'prop').get(u'computed').neg()) + PyJs_anonymous_957_._set_name(u'anonymous') + var.put(u'plainProps', var.get(u'node').get(u'properties').callprop(u'filter', PyJs_anonymous_957_)) + var.put(u'alreadySeenData', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'alreadySeenGetters', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'alreadySeenSetters', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + #for JS loop + var.put(u'_iterator', var.get(u'plainProps')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'prop', var.get(u'_ref')) + var.put(u'name', var.get(u'getName')(var.get(u'prop').get(u'key'))) + var.put(u'isDuplicate', Js(False)) + while 1: + SWITCHED = False + CONDITION = (var.get(u'prop').get(u'kind')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'get')): + SWITCHED = True + if (var.get(u'alreadySeenData').get(var.get(u'name')) or var.get(u'alreadySeenGetters').get(var.get(u'name'))): + var.put(u'isDuplicate', var.get(u'true')) + var.get(u'alreadySeenGetters').put(var.get(u'name'), var.get(u'true')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'set')): + SWITCHED = True + if (var.get(u'alreadySeenData').get(var.get(u'name')) or var.get(u'alreadySeenSetters').get(var.get(u'name'))): + var.put(u'isDuplicate', var.get(u'true')) + var.get(u'alreadySeenSetters').put(var.get(u'name'), var.get(u'true')) + break + if True: + SWITCHED = True + if ((var.get(u'alreadySeenData').get(var.get(u'name')) or var.get(u'alreadySeenGetters').get(var.get(u'name'))) or var.get(u'alreadySeenSetters').get(var.get(u'name'))): + var.put(u'isDuplicate', var.get(u'true')) + var.get(u'alreadySeenData').put(var.get(u'name'), var.get(u'true')) + SWITCHED = True + break + if var.get(u'isDuplicate'): + var.get(u'prop').put(u'computed', var.get(u'true')) + var.get(u'prop').put(u'key', var.get(u't').callprop(u'stringLiteral', var.get(u'name'))) + + PyJs_ObjectExpression_956_._set_name(u'ObjectExpression') + PyJs_Object_955_ = Js({u'ObjectExpression':PyJs_ObjectExpression_956_}) + PyJs_Object_954_ = Js({u'visitor':PyJs_Object_955_}) + return PyJs_Object_954_ + PyJs_anonymous_953_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_953_) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_952_._set_name(u'anonymous') +PyJs_Object_960_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/object/create':Js(101.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_961_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_962_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'loose', u'messages', u'_ForOfStatementArray', u'buildForOfArray', u'buildForOfLoose', u't', u'template', u'_ref', u'buildForOf', u'spec']) + @Js + def PyJsHoisted_loose_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file}, var) + var.registers([u'node', u'iteratorKey', u'isArrayKey', u'declar', u'file', u'path', u'scope', u'id', u'loop', u'left']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'left', var.get(u'node').get(u'left')) + var.put(u'declar', PyJsComma(Js(0.0), Js(None))) + var.put(u'id', PyJsComma(Js(0.0), Js(None))) + if ((var.get(u't').callprop(u'isIdentifier', var.get(u'left')) or var.get(u't').callprop(u'isPattern', var.get(u'left'))) or var.get(u't').callprop(u'isMemberExpression', var.get(u'left'))): + var.put(u'id', var.get(u'left')) + else: + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'left')): + var.put(u'id', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref'))) + var.put(u'declar', var.get(u't').callprop(u'variableDeclaration', var.get(u'left').get(u'kind'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'left').get(u'declarations').get(u'0').get(u'id'), var.get(u'id'))]))) + else: + PyJsTempException = JsToPyException(var.get(u'file').callprop(u'buildCodeFrameError', var.get(u'left'), var.get(u'messages').callprop(u'get', Js(u'unknownForHead'), var.get(u'left').get(u'type')))) + raise PyJsTempException + var.put(u'iteratorKey', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'iterator'))) + var.put(u'isArrayKey', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'isArray'))) + PyJs_Object_969_ = Js({u'LOOP_OBJECT':var.get(u'iteratorKey'),u'IS_ARRAY':var.get(u'isArrayKey'),u'OBJECT':var.get(u'node').get(u'right'),u'INDEX':var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'i')),u'ID':var.get(u'id')}) + var.put(u'loop', var.get(u'buildForOfLoose')(PyJs_Object_969_)) + if var.get(u'declar').neg(): + var.get(u'loop').get(u'body').get(u'body').callprop(u'shift') + PyJs_Object_970_ = Js({u'declar':var.get(u'declar'),u'node':var.get(u'loop'),u'loop':var.get(u'loop')}) + return PyJs_Object_970_ + PyJsHoisted_loose_.func_name = u'loose' + var.put(u'loose', PyJsHoisted_loose_) + @Js + def PyJsHoisted__ForOfStatementArray_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'node', u'iterationValue', u'right', u'uid', u'iterationKey', u'path', u'scope', u'nodes', u'loop', u'left']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'nodes', Js([])) + var.put(u'right', var.get(u'node').get(u'right')) + if (var.get(u't').callprop(u'isIdentifier', var.get(u'right')).neg() or var.get(u'scope').callprop(u'hasBinding', var.get(u'right').get(u'name')).neg()): + var.put(u'uid', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'arr'))) + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'uid'), var.get(u'right'))]))) + var.put(u'right', var.get(u'uid')) + var.put(u'iterationKey', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'i'))) + PyJs_Object_965_ = Js({u'BODY':var.get(u'node').get(u'body'),u'KEY':var.get(u'iterationKey'),u'ARR':var.get(u'right')}) + var.put(u'loop', var.get(u'buildForOfArray')(PyJs_Object_965_)) + var.get(u't').callprop(u'inherits', var.get(u'loop'), var.get(u'node')) + var.get(u't').callprop(u'ensureBlock', var.get(u'loop')) + var.put(u'iterationValue', var.get(u't').callprop(u'memberExpression', var.get(u'right'), var.get(u'iterationKey'), var.get(u'true'))) + var.put(u'left', var.get(u'node').get(u'left')) + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'left')): + var.get(u'left').get(u'declarations').get(u'0').put(u'init', var.get(u'iterationValue')) + var.get(u'loop').get(u'body').get(u'body').callprop(u'unshift', var.get(u'left')) + else: + var.get(u'loop').get(u'body').get(u'body').callprop(u'unshift', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'left'), var.get(u'iterationValue')))) + if var.get(u'path').get(u'parentPath').callprop(u'isLabeledStatement'): + var.put(u'loop', var.get(u't').callprop(u'labeledStatement', var.get(u'path').get(u'parentPath').get(u'node').get(u'label'), var.get(u'loop'))) + var.get(u'nodes').callprop(u'push', var.get(u'loop')) + return var.get(u'nodes') + PyJsHoisted__ForOfStatementArray_.func_name = u'_ForOfStatementArray' + var.put(u'_ForOfStatementArray', PyJsHoisted__ForOfStatementArray_) + @Js + def PyJsHoisted_spec_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file}, var) + var.registers([u'node', u'stepValue', u'isLabeledParent', u'stepKey', u'file', u'parent', u'tryBody', u'declar', u'template', u'path', u'scope', u'iteratorKey', u'loop', u'left']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'parent', var.get(u'path').get(u'parent')) + var.put(u'left', var.get(u'node').get(u'left')) + var.put(u'declar', PyJsComma(Js(0.0), Js(None))) + var.put(u'stepKey', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'step'))) + var.put(u'stepValue', var.get(u't').callprop(u'memberExpression', var.get(u'stepKey'), var.get(u't').callprop(u'identifier', Js(u'value')))) + if ((var.get(u't').callprop(u'isIdentifier', var.get(u'left')) or var.get(u't').callprop(u'isPattern', var.get(u'left'))) or var.get(u't').callprop(u'isMemberExpression', var.get(u'left'))): + var.put(u'declar', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'left'), var.get(u'stepValue')))) + else: + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'left')): + var.put(u'declar', var.get(u't').callprop(u'variableDeclaration', var.get(u'left').get(u'kind'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'left').get(u'declarations').get(u'0').get(u'id'), var.get(u'stepValue'))]))) + else: + PyJsTempException = JsToPyException(var.get(u'file').callprop(u'buildCodeFrameError', var.get(u'left'), var.get(u'messages').callprop(u'get', Js(u'unknownForHead'), var.get(u'left').get(u'type')))) + raise PyJsTempException + var.put(u'iteratorKey', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'iterator'))) + PyJs_Object_971_ = Js({u'ITERATOR_HAD_ERROR_KEY':var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'didIteratorError')),u'ITERATOR_COMPLETION':var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'iteratorNormalCompletion')),u'ITERATOR_ERROR_KEY':var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'iteratorError')),u'ITERATOR_KEY':var.get(u'iteratorKey'),u'STEP_KEY':var.get(u'stepKey'),u'OBJECT':var.get(u'node').get(u'right'),u'BODY':var.get(u"null")}) + var.put(u'template', var.get(u'buildForOf')(PyJs_Object_971_)) + var.put(u'isLabeledParent', var.get(u't').callprop(u'isLabeledStatement', var.get(u'parent'))) + var.put(u'tryBody', var.get(u'template').get(u'3').get(u'block').get(u'body')) + var.put(u'loop', var.get(u'tryBody').get(u'0')) + if var.get(u'isLabeledParent'): + var.get(u'tryBody').put(u'0', var.get(u't').callprop(u'labeledStatement', var.get(u'parent').get(u'label'), var.get(u'loop'))) + PyJs_Object_972_ = Js({u'replaceParent':var.get(u'isLabeledParent'),u'declar':var.get(u'declar'),u'loop':var.get(u'loop'),u'node':var.get(u'template')}) + return PyJs_Object_972_ + PyJsHoisted_spec_.func_name = u'spec' + var.put(u'spec', PyJsHoisted_spec_) + var.put(u'messages', var.get(u'_ref').get(u'messages')) + var.put(u'template', var.get(u'_ref').get(u'template')) + var.put(u't', var.get(u'_ref').get(u'types')) + var.put(u'buildForOfArray', var.get(u'template')(Js(u'\n for (var KEY = 0; KEY < ARR.length; KEY++) BODY;\n '))) + def PyJs_LONG_963_(var=var): + return var.get(u'template')(Js(u'\n for (var LOOP_OBJECT = OBJECT,\n IS_ARRAY = Array.isArray(LOOP_OBJECT),\n INDEX = 0,\n LOOP_OBJECT = IS_ARRAY ? LOOP_OBJECT : LOOP_OBJECT[Symbol.iterator]();;) {\n var ID;\n if (IS_ARRAY) {\n if (INDEX >= LOOP_OBJECT.length) break;\n ID = LOOP_OBJECT[INDEX++];\n } else {\n INDEX = LOOP_OBJECT.next();\n if (INDEX.done) break;\n ID = INDEX.value;\n }\n }\n ')) + var.put(u'buildForOfLoose', PyJs_LONG_963_()) + def PyJs_LONG_964_(var=var): + return var.get(u'template')(Js(u'\n var ITERATOR_COMPLETION = true;\n var ITERATOR_HAD_ERROR_KEY = false;\n var ITERATOR_ERROR_KEY = undefined;\n try {\n for (var ITERATOR_KEY = OBJECT[Symbol.iterator](), STEP_KEY; !(ITERATOR_COMPLETION = (STEP_KEY = ITERATOR_KEY.next()).done); ITERATOR_COMPLETION = true) {\n }\n } catch (err) {\n ITERATOR_HAD_ERROR_KEY = true;\n ITERATOR_ERROR_KEY = err;\n } finally {\n try {\n if (!ITERATOR_COMPLETION && ITERATOR_KEY.return) {\n ITERATOR_KEY.return();\n }\n } finally {\n if (ITERATOR_HAD_ERROR_KEY) {\n throw ITERATOR_ERROR_KEY;\n }\n }\n }\n ')) + var.put(u'buildForOf', PyJs_LONG_964_()) + pass + @Js + def PyJs_ForOfStatement_968_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'ForOfStatement':PyJs_ForOfStatement_968_}, var) + var.registers([u'node', u'callback', u'state', u'declar', u'build', u'loop', u'path', u'block']) + if var.get(u'path').callprop(u'get', Js(u'right')).callprop(u'isArrayExpression'): + if var.get(u'path').get(u'parentPath').callprop(u'isLabeledStatement'): + return var.get(u'path').get(u'parentPath').callprop(u'replaceWithMultiple', var.get(u'_ForOfStatementArray')(var.get(u'path'))) + else: + return var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'_ForOfStatementArray')(var.get(u'path'))) + var.put(u'callback', var.get(u'spec')) + if var.get(u'state').get(u'opts').get(u'loose'): + var.put(u'callback', var.get(u'loose')) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'build', var.get(u'callback')(var.get(u'path'), var.get(u'state'))) + var.put(u'declar', var.get(u'build').get(u'declar')) + var.put(u'loop', var.get(u'build').get(u'loop')) + var.put(u'block', var.get(u'loop').get(u'body')) + var.get(u'path').callprop(u'ensureBlock') + if var.get(u'declar'): + var.get(u'block').get(u'body').callprop(u'push', var.get(u'declar')) + var.get(u'block').put(u'body', var.get(u'block').get(u'body').callprop(u'concat', var.get(u'node').get(u'body').get(u'body'))) + var.get(u't').callprop(u'inherits', var.get(u'loop'), var.get(u'node')) + var.get(u't').callprop(u'inherits', var.get(u'loop').get(u'body'), var.get(u'node').get(u'body')) + if var.get(u'build').get(u'replaceParent'): + var.get(u'path').get(u'parentPath').callprop(u'replaceWithMultiple', var.get(u'build').get(u'node')) + var.get(u'path').callprop(u'remove') + else: + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'build').get(u'node')) + PyJs_ForOfStatement_968_._set_name(u'ForOfStatement') + PyJs_Object_967_ = Js({u'ForOfStatement':PyJs_ForOfStatement_968_}) + PyJs_Object_966_ = Js({u'visitor':PyJs_Object_967_}) + return PyJs_Object_966_ + pass + pass + PyJs_anonymous_962_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_962_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_961_._set_name(u'anonymous') +PyJs_Object_973_ = Js({}) +@Js +def PyJs_anonymous_974_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'_babelHelperFunctionName', u'module', u'_babelHelperFunctionName2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_981_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_981_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_975_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_exit_979_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_979_, u'arguments':arguments}, var) + var.registers([u'path', u'replacement']) + if (PyJsStrictNeq(var.get(u'path').get(u'key'),Js(u'value')) and var.get(u'path').get(u'parentPath').callprop(u'isObjectProperty').neg()): + var.put(u'replacement', PyJsComma(Js(0.0),var.get(u'_babelHelperFunctionName2').get(u'default'))(var.get(u'path'))) + if var.get(u'replacement'): + var.get(u'path').callprop(u'replaceWith', var.get(u'replacement')) + PyJs_exit_979_._set_name(u'exit') + PyJs_Object_978_ = Js({u'exit':PyJs_exit_979_}) + @Js + def PyJs_ObjectProperty_980_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ObjectProperty':PyJs_ObjectProperty_980_, u'arguments':arguments}, var) + var.registers([u'newNode', u'value', u'path']) + var.put(u'value', var.get(u'path').callprop(u'get', Js(u'value'))) + if var.get(u'value').callprop(u'isFunction'): + var.put(u'newNode', PyJsComma(Js(0.0),var.get(u'_babelHelperFunctionName2').get(u'default'))(var.get(u'value'))) + if var.get(u'newNode'): + var.get(u'value').callprop(u'replaceWith', var.get(u'newNode')) + PyJs_ObjectProperty_980_._set_name(u'ObjectProperty') + PyJs_Object_977_ = Js({u'ArrowFunctionExpression|FunctionExpression':PyJs_Object_978_,u'ObjectProperty':PyJs_ObjectProperty_980_}) + PyJs_Object_976_ = Js({u'visitor':PyJs_Object_977_}) + return PyJs_Object_976_ + PyJs_anonymous_975_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_975_) + var.put(u'_babelHelperFunctionName', var.get(u'require')(Js(u'babel-helper-function-name'))) + var.put(u'_babelHelperFunctionName2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperFunctionName'))) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_974_._set_name(u'anonymous') +PyJs_Object_982_ = Js({u'babel-helper-function-name':Js(49.0)}) +@Js +def PyJs_anonymous_983_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_984_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_NumericLiteral_987_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'NumericLiteral':PyJs_NumericLiteral_987_, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'node', u'_ref']) + var.put(u'node', var.get(u'_ref').get(u'node')) + if (var.get(u'node').get(u'extra') and JsRegExp(u'/^0[ob]/i').callprop(u'test', var.get(u'node').get(u'extra').get(u'raw'))): + var.get(u'node').put(u'extra', var.get(u'undefined')) + PyJs_NumericLiteral_987_._set_name(u'NumericLiteral') + @Js + def PyJs_StringLiteral_988_(_ref2, this, arguments, var=var): + var = Scope({u'this':this, u'StringLiteral':PyJs_StringLiteral_988_, u'_ref2':_ref2, u'arguments':arguments}, var) + var.registers([u'node', u'_ref2']) + var.put(u'node', var.get(u'_ref2').get(u'node')) + if (var.get(u'node').get(u'extra') and JsRegExp(u'/\\\\[u]/gi').callprop(u'test', var.get(u'node').get(u'extra').get(u'raw'))): + var.get(u'node').put(u'extra', var.get(u'undefined')) + PyJs_StringLiteral_988_._set_name(u'StringLiteral') + PyJs_Object_986_ = Js({u'NumericLiteral':PyJs_NumericLiteral_987_,u'StringLiteral':PyJs_StringLiteral_988_}) + PyJs_Object_985_ = Js({u'visitor':PyJs_Object_986_}) + return PyJs_Object_985_ + PyJs_anonymous_984_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_984_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_983_._set_name(u'anonymous') +PyJs_Object_989_ = Js({}) +@Js +def PyJs_anonymous_990_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_create', u'buildDefine', u'exports', u'require', u'_babelTemplate', u'module', u'_create2', u'_babelTemplate2', u'buildFactory', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1007_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1007_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_create', var.get(u'require')(Js(u'babel-runtime/core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + @Js + def PyJs_anonymous_991_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'isValidRequireCall', u'amdVisitor', u'_ref', u't']) + @Js + def PyJsHoisted_isValidRequireCall_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path', u'args', u'arg']) + if var.get(u'path').callprop(u'isCallExpression').neg(): + return Js(False) + PyJs_Object_992_ = Js({u'name':Js(u'require')}) + if var.get(u'path').callprop(u'get', Js(u'callee')).callprop(u'isIdentifier', PyJs_Object_992_).neg(): + return Js(False) + if var.get(u'path').get(u'scope').callprop(u'getBinding', Js(u'require')): + return Js(False) + var.put(u'args', var.get(u'path').callprop(u'get', Js(u'arguments'))) + if PyJsStrictNeq(var.get(u'args').get(u'length'),Js(1.0)): + return Js(False) + var.put(u'arg', var.get(u'args').get(u'0')) + if var.get(u'arg').callprop(u'isStringLiteral').neg(): + return Js(False) + return var.get(u'true') + PyJsHoisted_isValidRequireCall_.func_name = u'isValidRequireCall' + var.put(u'isValidRequireCall', PyJsHoisted_isValidRequireCall_) + var.put(u't', var.get(u'_ref').get(u'types')) + pass + @Js + def PyJs_ReferencedIdentifier_994_(_ref2, this, arguments, var=var): + var = Scope({u'this':this, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_994_, u'_ref2':_ref2, u'arguments':arguments}, var) + var.registers([u'node', u'scope', u'_ref2']) + var.put(u'node', var.get(u'_ref2').get(u'node')) + var.put(u'scope', var.get(u'_ref2').get(u'scope')) + if (PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'exports')) and var.get(u'scope').callprop(u'getBinding', Js(u'exports')).neg()): + var.get(u"this").put(u'hasExports', var.get(u'true')) + if (PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'module')) and var.get(u'scope').callprop(u'getBinding', Js(u'module')).neg()): + var.get(u"this").put(u'hasModule', var.get(u'true')) + PyJs_ReferencedIdentifier_994_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_CallExpression_995_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'CallExpression':PyJs_CallExpression_995_}, var) + var.registers([u'path']) + if var.get(u'isValidRequireCall')(var.get(u'path')).neg(): + return var.get('undefined') + var.get(u"this").get(u'bareSources').callprop(u'push', var.get(u'path').get(u'node').get(u'arguments').get(u'0')) + var.get(u'path').callprop(u'remove') + PyJs_CallExpression_995_._set_name(u'CallExpression') + @Js + def PyJs_VariableDeclarator_996_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'VariableDeclarator':PyJs_VariableDeclarator_996_}, var) + var.registers([u'source', u'init', u'id', u'path']) + var.put(u'id', var.get(u'path').callprop(u'get', Js(u'id'))) + if var.get(u'id').callprop(u'isIdentifier').neg(): + return var.get('undefined') + var.put(u'init', var.get(u'path').callprop(u'get', Js(u'init'))) + if var.get(u'isValidRequireCall')(var.get(u'init')).neg(): + return var.get('undefined') + var.put(u'source', var.get(u'init').get(u'node').get(u'arguments').get(u'0')) + var.get(u"this").get(u'sourceNames').put(var.get(u'source').get(u'value'), var.get(u'true')) + var.get(u"this").get(u'sources').callprop(u'push', Js([var.get(u'id').get(u'node'), var.get(u'source')])) + var.get(u'path').callprop(u'remove') + PyJs_VariableDeclarator_996_._set_name(u'VariableDeclarator') + PyJs_Object_993_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_994_,u'CallExpression':PyJs_CallExpression_995_,u'VariableDeclarator':PyJs_VariableDeclarator_996_}) + var.put(u'amdVisitor', PyJs_Object_993_) + @Js + def PyJs_pre_998_(this, arguments, var=var): + var = Scope({u'this':this, u'pre':PyJs_pre_998_, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'sources', Js([])) + var.get(u"this").put(u'sourceNames', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.get(u"this").put(u'bareSources', Js([])) + var.get(u"this").put(u'hasExports', Js(False)) + var.get(u"this").put(u'hasModule', Js(False)) + PyJs_pre_998_._set_name(u'pre') + @Js + def PyJs_exit_1001_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_1001_, u'arguments':arguments}, var) + var.registers([u'node', u'moduleName', u'_this', u'factory', u'sources', u'params', u'path']) + var.put(u'_this', var.get(u"this")) + if var.get(u"this").get(u'ran'): + return var.get('undefined') + var.get(u"this").put(u'ran', var.get(u'true')) + var.get(u'path').callprop(u'traverse', var.get(u'amdVisitor'), var.get(u"this")) + @Js + def PyJs_anonymous_1002_(source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'arguments':arguments}, var) + var.registers([u'source']) + return var.get(u'source').get(u'0') + PyJs_anonymous_1002_._set_name(u'anonymous') + var.put(u'params', var.get(u"this").get(u'sources').callprop(u'map', PyJs_anonymous_1002_)) + @Js + def PyJs_anonymous_1003_(source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'arguments':arguments}, var) + var.registers([u'source']) + return var.get(u'source').get(u'1') + PyJs_anonymous_1003_._set_name(u'anonymous') + var.put(u'sources', var.get(u"this").get(u'sources').callprop(u'map', PyJs_anonymous_1003_)) + @Js + def PyJs_anonymous_1004_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return var.get(u'_this').get(u'sourceNames').get(var.get(u'str').get(u'value')).neg() + PyJs_anonymous_1004_._set_name(u'anonymous') + var.put(u'sources', var.get(u'sources').callprop(u'concat', var.get(u"this").get(u'bareSources').callprop(u'filter', PyJs_anonymous_1004_))) + var.put(u'moduleName', var.get(u"this").callprop(u'getModuleName')) + if var.get(u'moduleName'): + var.put(u'moduleName', var.get(u't').callprop(u'stringLiteral', var.get(u'moduleName'))) + if var.get(u"this").get(u'hasExports'): + var.get(u'sources').callprop(u'unshift', var.get(u't').callprop(u'stringLiteral', Js(u'exports'))) + var.get(u'params').callprop(u'unshift', var.get(u't').callprop(u'identifier', Js(u'exports'))) + if var.get(u"this").get(u'hasModule'): + var.get(u'sources').callprop(u'unshift', var.get(u't').callprop(u'stringLiteral', Js(u'module'))) + var.get(u'params').callprop(u'unshift', var.get(u't').callprop(u'identifier', Js(u'module'))) + var.put(u'node', var.get(u'path').get(u'node')) + PyJs_Object_1005_ = Js({u'PARAMS':var.get(u'params'),u'BODY':var.get(u'node').get(u'body')}) + var.put(u'factory', var.get(u'buildFactory')(PyJs_Object_1005_)) + var.get(u'factory').get(u'expression').get(u'body').put(u'directives', var.get(u'node').get(u'directives')) + var.get(u'node').put(u'directives', Js([])) + PyJs_Object_1006_ = Js({u'MODULE_NAME':var.get(u'moduleName'),u'SOURCES':var.get(u'sources'),u'FACTORY':var.get(u'factory')}) + var.get(u'node').put(u'body', Js([var.get(u'buildDefine')(PyJs_Object_1006_)])) + PyJs_exit_1001_._set_name(u'exit') + PyJs_Object_1000_ = Js({u'exit':PyJs_exit_1001_}) + PyJs_Object_999_ = Js({u'Program':PyJs_Object_1000_}) + PyJs_Object_997_ = Js({u'inherits':var.get(u'require')(Js(u'babel-plugin-transform-es2015-modules-commonjs')),u'pre':PyJs_pre_998_,u'visitor':PyJs_Object_999_}) + return PyJs_Object_997_ + PyJs_anonymous_991_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_991_) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + pass + var.put(u'buildDefine', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n define(MODULE_NAME, [SOURCES], FACTORY);\n'))) + var.put(u'buildFactory', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (PARAMS) {\n BODY;\n })\n'))) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_990_._set_name(u'anonymous') +PyJs_Object_1008_ = Js({u'babel-plugin-transform-es2015-modules-commonjs':Js(73.0),u'babel-runtime/core-js/object/create':Js(101.0),u'babel-template':Js(221.0)}) +@Js +def PyJs_anonymous_1009_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_symbol2', u'_babelTemplate', u'module', u'buildLooseExportsModuleDeclaration', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'buildExportAll', u'_create2', u'_keys', u'buildExportsAssignment', u'THIS_BREAK_KEYS', u'_create', u'exports', u'_interopRequireWildcard', u'_babelTypes', u'buildRequire', u'buildExportsModuleDeclaration', u'_symbol', u'_path2', u'buildExportsFrom', u'_keys2', u'_babelTemplate2', u't', u'require']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1028_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1028_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1027_ = Js({}) + var.put(u'newObj', PyJs_Object_1027_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_keys', var.get(u'require')(Js(u'babel-runtime/core-js/object/keys'))) + var.put(u'_keys2', var.get(u'_interopRequireDefault')(var.get(u'_keys'))) + var.put(u'_create', var.get(u'require')(Js(u'babel-runtime/core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_symbol', var.get(u'require')(Js(u'babel-runtime/core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + @Js + def PyJs_anonymous_1010_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'reassignmentVisitor', u'REASSIGN_REMAP_SKIP']) + var.put(u'REASSIGN_REMAP_SKIP', PyJsComma(Js(0.0),var.get(u'_symbol2').get(u'default'))()) + @Js + def PyJs_ReferencedIdentifier_1012_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1012_, u'arguments':arguments}, var) + var.registers([u'property', u'remap', u'object', u'name', u'path']) + var.put(u'name', var.get(u'path').get(u'node').get(u'name')) + var.put(u'remap', var.get(u"this").get(u'remaps').get(var.get(u'name'))) + if var.get(u'remap').neg(): + return var.get('undefined') + if PyJsStrictNeq(var.get(u"this").get(u'scope').callprop(u'getBinding', var.get(u'name')),var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'name'))): + return var.get('undefined') + PyJs_Object_1013_ = Js({u'callee':var.get(u'path').get(u'node')}) + if var.get(u'path').get(u'parentPath').callprop(u'isCallExpression', PyJs_Object_1013_): + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'sequenceExpression', Js([var.get(u't').callprop(u'numericLiteral', Js(0.0)), var.get(u'remap')]))) + else: + if (var.get(u'path').callprop(u'isJSXIdentifier') and var.get(u't').callprop(u'isMemberExpression', var.get(u'remap'))): + var.put(u'object', var.get(u'remap').get(u'object')) + var.put(u'property', var.get(u'remap').get(u'property')) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'JSXMemberExpression', var.get(u't').callprop(u'JSXIdentifier', var.get(u'object').get(u'name')), var.get(u't').callprop(u'JSXIdentifier', var.get(u'property').get(u'name')))) + else: + var.get(u'path').callprop(u'replaceWith', var.get(u'remap')) + var.get(u"this").callprop(u'requeueInParent', var.get(u'path')) + PyJs_ReferencedIdentifier_1012_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_AssignmentExpression_1014_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'AssignmentExpression':PyJs_AssignmentExpression_1014_}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'name', u'exports', u'reid', u'_i', u'path', u'_ref', u'left']) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'node').get(var.get(u'REASSIGN_REMAP_SKIP')): + return var.get('undefined') + var.put(u'left', var.get(u'path').callprop(u'get', Js(u'left'))) + if var.get(u'left').callprop(u'isIdentifier').neg(): + return var.get('undefined') + var.put(u'name', var.get(u'left').get(u'node').get(u'name')) + var.put(u'exports', var.get(u"this").get(u'exports').get(var.get(u'name'))) + if var.get(u'exports').neg(): + return var.get('undefined') + if PyJsStrictNeq(var.get(u"this").get(u'scope').callprop(u'getBinding', var.get(u'name')),var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'name'))): + return var.get('undefined') + var.get(u'node').put(var.get(u'REASSIGN_REMAP_SKIP'), var.get(u'true')) + #for JS loop + var.put(u'_iterator', var.get(u'exports')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'reid', var.get(u'_ref')) + var.put(u'node', var.get(u'buildExportsAssignment')(var.get(u'reid'), var.get(u'node')).get(u'expression')) + + var.get(u'path').callprop(u'replaceWith', var.get(u'node')) + var.get(u"this").callprop(u'requeueInParent', var.get(u'path')) + PyJs_AssignmentExpression_1014_._set_name(u'AssignmentExpression') + @Js + def PyJs_UpdateExpression_1015_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'UpdateExpression':PyJs_UpdateExpression_1015_}, var) + var.registers([u'node', u'exports', u'name', u'arg', u'operator', u'path', u'nodes']) + var.put(u'arg', var.get(u'path').callprop(u'get', Js(u'argument'))) + if var.get(u'arg').callprop(u'isIdentifier').neg(): + return var.get('undefined') + var.put(u'name', var.get(u'arg').get(u'node').get(u'name')) + var.put(u'exports', var.get(u"this").get(u'exports').get(var.get(u'name'))) + if var.get(u'exports').neg(): + return var.get('undefined') + if PyJsStrictNeq(var.get(u"this").get(u'scope').callprop(u'getBinding', var.get(u'name')),var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'name'))): + return var.get('undefined') + var.put(u'node', var.get(u't').callprop(u'assignmentExpression', (var.get(u'path').get(u'node').get(u'operator').get(u'0')+Js(u'=')), var.get(u'arg').get(u'node'), var.get(u't').callprop(u'numericLiteral', Js(1.0)))) + if ((var.get(u'path').get(u'parentPath').callprop(u'isExpressionStatement') and var.get(u'path').callprop(u'isCompletionRecord').neg()) or var.get(u'path').get(u'node').get(u'prefix')): + var.get(u'path').callprop(u'replaceWith', var.get(u'node')) + var.get(u"this").callprop(u'requeueInParent', var.get(u'path')) + return var.get('undefined') + var.put(u'nodes', Js([])) + var.get(u'nodes').callprop(u'push', var.get(u'node')) + var.put(u'operator', PyJsComma(Js(0.0), Js(None))) + if PyJsStrictEq(var.get(u'path').get(u'node').get(u'operator'),Js(u'--')): + var.put(u'operator', Js(u'+')) + else: + var.put(u'operator', Js(u'-')) + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'binaryExpression', var.get(u'operator'), var.get(u'arg').get(u'node'), var.get(u't').callprop(u'numericLiteral', Js(1.0)))) + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u't').callprop(u'sequenceExpression', var.get(u'nodes'))) + PyJs_UpdateExpression_1015_._set_name(u'UpdateExpression') + PyJs_Object_1011_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1012_,u'AssignmentExpression':PyJs_AssignmentExpression_1014_,u'UpdateExpression':PyJs_UpdateExpression_1015_}) + var.put(u'reassignmentVisitor', PyJs_Object_1011_) + @Js + def PyJs_ThisExpression_1018_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ThisExpression':PyJs_ThisExpression_1018_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if var.get(u"this").get(u'ranCommonJS'): + return var.get('undefined') + @Js + def PyJs_anonymous_1019_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u'path').callprop(u'is', Js(u'shadow')).neg() and (var.get(u'THIS_BREAK_KEYS').callprop(u'indexOf', var.get(u'path').get(u'type'))>=Js(0.0))) + PyJs_anonymous_1019_._set_name(u'anonymous') + if (PyJsStrictNeq(var.get(u'state').get(u'opts').get(u'allowTopLevelThis'),var.get(u'true')) and var.get(u'path').callprop(u'findParent', PyJs_anonymous_1019_).neg()): + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'identifier', Js(u'undefined'))) + PyJs_ThisExpression_1018_._set_name(u'ThisExpression') + @Js + def PyJs_exit_1021_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_1021_, u'arguments':arguments}, var) + var.registers([u'decl', u'addRequire', u'_isArray5', u'_isArray4', u'_isArray3', u'_isArray2', u'_isArray6', u'imports', u'_specifiers', u'ids', u'_specifier4', u'_isArray7', u'hoistedExportsNode', u'_declaration', u'_specifier2', u'_specifier3', u'specifier', u'importsEntry', u'_specifier', u'_importsEntry$specifi', u'uid', u'_iterator6', u'i', u'_source', u'_i7', u'_i6', u'_i5', u'_i4', u'hasImports', u'_i2', u'id', u'strict', u'init', u'exportNode', u'scope', u'nodes', u'defNode', u'ref', u'addTo', u'body', u'exports', u'node', u'_i3', u'requireNode', u'nonHoistedExportNames', u'_varDecl', u'varDecl', u'declarators', u'topNodes', u'buildTemplate', u'key', u'declaration', u'_id4', u'path', u'name', u'_id2', u'_id3', u'remaps', u'specifiers', u'_id', u'_imports$source', u'hasExports', u'_defNode', u'_ref6', u'_ref5', u'_ref4', u'_ref3', u'_ref2', u'maxBlockHoist', u'_ref7', u'declar', u'source', u'wildcard', u'target', u'_iterator5', u'_iterator4', u'_iterator7', u'_iterator2', u'requires', u'_iterator3', u'_path']) + @Js + def PyJsHoisted_addRequire_(source, blockHoist, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'blockHoist':blockHoist, u'arguments':arguments}, var) + var.registers([u'cached', u'varDecl', u'blockHoist', u'ref', u'source']) + var.put(u'cached', var.get(u'requires').get(var.get(u'source'))) + if var.get(u'cached'): + return var.get(u'cached') + var.put(u'ref', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', PyJsComma(Js(0.0),var.get(u'_path2').get(u'basename'))(var.get(u'source'), PyJsComma(Js(0.0),var.get(u'_path2').get(u'extname'))(var.get(u'source'))))) + var.put(u'varDecl', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'ref'), var.get(u'buildRequire')(var.get(u't').callprop(u'stringLiteral', var.get(u'source'))).get(u'expression'))]))) + if var.get(u'imports').get(var.get(u'source')): + var.get(u'varDecl').put(u'loc', var.get(u'imports').get(var.get(u'source')).get(u'loc')) + if (PyJsStrictEq(var.get(u'blockHoist',throw=False).typeof(),Js(u'number')) and (var.get(u'blockHoist')>Js(0.0))): + var.get(u'varDecl').put(u'_blockHoist', var.get(u'blockHoist')) + var.get(u'topNodes').callprop(u'push', var.get(u'varDecl')) + return var.get(u'requires').put(var.get(u'source'), var.get(u'ref')) + PyJsHoisted_addRequire_.func_name = u'addRequire' + var.put(u'addRequire', PyJsHoisted_addRequire_) + @Js + def PyJsHoisted_addTo_(obj, key, arr, this, arguments, var=var): + var = Scope({u'this':this, u'arr':arr, u'obj':obj, u'arguments':arguments, u'key':key}, var) + var.registers([u'arr', u'obj', u'key', u'existing']) + var.put(u'existing', (var.get(u'obj').get(var.get(u'key')) or Js([]))) + var.get(u'obj').put(var.get(u'key'), var.get(u'existing').callprop(u'concat', var.get(u'arr'))) + PyJsHoisted_addTo_.func_name = u'addTo' + var.put(u'addTo', PyJsHoisted_addTo_) + var.get(u"this").put(u'ranCommonJS', var.get(u'true')) + var.put(u'strict', var.get(u"this").get(u'opts').get(u'strict').neg().neg()) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.get(u'scope').callprop(u'rename', Js(u'module')) + var.get(u'scope').callprop(u'rename', Js(u'exports')) + var.get(u'scope').callprop(u'rename', Js(u'require')) + var.put(u'hasExports', Js(False)) + var.put(u'hasImports', Js(False)) + var.put(u'body', var.get(u'path').callprop(u'get', Js(u'body'))) + var.put(u'imports', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'exports', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'nonHoistedExportNames', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'topNodes', Js([])) + var.put(u'remaps', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'requires', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + pass + pass + #for JS loop + var.put(u'_iterator2', var.get(u'body')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'_path', var.get(u'_ref2')) + if var.get(u'_path').callprop(u'isExportDeclaration'): + var.put(u'hasExports', var.get(u'true')) + var.put(u'specifiers', Js([]).callprop(u'concat', var.get(u'_path').callprop(u'get', Js(u'declaration')), var.get(u'_path').callprop(u'get', Js(u'specifiers')))) + #for JS loop + var.put(u'_iterator4', var.get(u'specifiers')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i4').get(u'value')) + var.put(u'_specifier2', var.get(u'_ref4')) + var.put(u'ids', var.get(u'_specifier2').callprop(u'getBindingIdentifiers')) + if var.get(u'ids').get(u'__esModule'): + PyJsTempException = JsToPyException(var.get(u'_specifier2').callprop(u'buildCodeFrameError', Js(u'Illegal export "__esModule"'))) + raise PyJsTempException + + if var.get(u'_path').callprop(u'isImportDeclaration'): + pass + var.put(u'hasImports', var.get(u'true')) + var.put(u'key', var.get(u'_path').get(u'node').get(u'source').get(u'value')) + PyJs_Object_1022_ = Js({u'specifiers':Js([]),u'maxBlockHoist':Js(0.0),u'loc':var.get(u'_path').get(u'node').get(u'loc')}) + var.put(u'importsEntry', (var.get(u'imports').get(var.get(u'key')) or PyJs_Object_1022_)) + var.put(u'_importsEntry$specifi', var.get(u'importsEntry').get(u'specifiers')).get(u'push').callprop(u'apply', var.get(u'_importsEntry$specifi'), var.get(u'_path').get(u'node').get(u'specifiers')) + if PyJsStrictEq(var.get(u'_path').get(u'node').get(u'_blockHoist').typeof(),Js(u'number')): + var.get(u'importsEntry').put(u'maxBlockHoist', var.get(u'Math').callprop(u'max', var.get(u'_path').get(u'node').get(u'_blockHoist'), var.get(u'importsEntry').get(u'maxBlockHoist'))) + var.get(u'imports').put(var.get(u'key'), var.get(u'importsEntry')) + var.get(u'_path').callprop(u'remove') + else: + if var.get(u'_path').callprop(u'isExportDefaultDeclaration'): + var.put(u'declaration', var.get(u'_path').callprop(u'get', Js(u'declaration'))) + if var.get(u'declaration').callprop(u'isFunctionDeclaration'): + var.put(u'id', var.get(u'declaration').get(u'node').get(u'id')) + var.put(u'defNode', var.get(u't').callprop(u'identifier', Js(u'default'))) + if var.get(u'id'): + var.get(u'addTo')(var.get(u'exports'), var.get(u'id').get(u'name'), var.get(u'defNode')) + var.get(u'topNodes').callprop(u'push', var.get(u'buildExportsAssignment')(var.get(u'defNode'), var.get(u'id'))) + var.get(u'_path').callprop(u'replaceWith', var.get(u'declaration').get(u'node')) + else: + var.get(u'topNodes').callprop(u'push', var.get(u'buildExportsAssignment')(var.get(u'defNode'), var.get(u't').callprop(u'toExpression', var.get(u'declaration').get(u'node')))) + var.get(u'_path').callprop(u'remove') + else: + if var.get(u'declaration').callprop(u'isClassDeclaration'): + var.put(u'_id', var.get(u'declaration').get(u'node').get(u'id')) + var.put(u'_defNode', var.get(u't').callprop(u'identifier', Js(u'default'))) + if var.get(u'_id'): + var.get(u'addTo')(var.get(u'exports'), var.get(u'_id').get(u'name'), var.get(u'_defNode')) + var.get(u'_path').callprop(u'replaceWithMultiple', Js([var.get(u'declaration').get(u'node'), var.get(u'buildExportsAssignment')(var.get(u'_defNode'), var.get(u'_id'))])) + else: + var.get(u'_path').callprop(u'replaceWith', var.get(u'buildExportsAssignment')(var.get(u'_defNode'), var.get(u't').callprop(u'toExpression', var.get(u'declaration').get(u'node')))) + var.get(u'_path').get(u'parentPath').callprop(u'requeue', var.get(u'_path').callprop(u'get', Js(u'expression.left'))) + else: + var.get(u'_path').callprop(u'replaceWith', var.get(u'buildExportsAssignment')(var.get(u't').callprop(u'identifier', Js(u'default')), var.get(u'declaration').get(u'node'))) + var.get(u'_path').get(u'parentPath').callprop(u'requeue', var.get(u'_path').callprop(u'get', Js(u'expression.left'))) + else: + if var.get(u'_path').callprop(u'isExportNamedDeclaration'): + var.put(u'_declaration', var.get(u'_path').callprop(u'get', Js(u'declaration'))) + if var.get(u'_declaration').get(u'node'): + if var.get(u'_declaration').callprop(u'isFunctionDeclaration'): + var.put(u'_id2', var.get(u'_declaration').get(u'node').get(u'id')) + var.get(u'addTo')(var.get(u'exports'), var.get(u'_id2').get(u'name'), var.get(u'_id2')) + var.get(u'topNodes').callprop(u'push', var.get(u'buildExportsAssignment')(var.get(u'_id2'), var.get(u'_id2'))) + var.get(u'_path').callprop(u'replaceWith', var.get(u'_declaration').get(u'node')) + else: + if var.get(u'_declaration').callprop(u'isClassDeclaration'): + var.put(u'_id3', var.get(u'_declaration').get(u'node').get(u'id')) + var.get(u'addTo')(var.get(u'exports'), var.get(u'_id3').get(u'name'), var.get(u'_id3')) + var.get(u'_path').callprop(u'replaceWithMultiple', Js([var.get(u'_declaration').get(u'node'), var.get(u'buildExportsAssignment')(var.get(u'_id3'), var.get(u'_id3'))])) + var.get(u'nonHoistedExportNames').put(var.get(u'_id3').get(u'name'), var.get(u'true')) + else: + if var.get(u'_declaration').callprop(u'isVariableDeclaration'): + var.put(u'declarators', var.get(u'_declaration').callprop(u'get', Js(u'declarations'))) + #for JS loop + var.put(u'_iterator5', var.get(u'declarators')) + var.put(u'_isArray5', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator5'))) + var.put(u'_i5', Js(0.0)) + var.put(u'_iterator5', (var.get(u'_iterator5') if var.get(u'_isArray5') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator5')))) + while 1: + pass + if var.get(u'_isArray5'): + if (var.get(u'_i5')>=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i5').get(u'value')) + var.put(u'decl', var.get(u'_ref5')) + var.put(u'_id4', var.get(u'decl').callprop(u'get', Js(u'id'))) + var.put(u'init', var.get(u'decl').callprop(u'get', Js(u'init'))) + if var.get(u'init').get(u'node').neg(): + var.get(u'init').callprop(u'replaceWith', var.get(u't').callprop(u'identifier', Js(u'undefined'))) + if var.get(u'_id4').callprop(u'isIdentifier'): + var.get(u'addTo')(var.get(u'exports'), var.get(u'_id4').get(u'node').get(u'name'), var.get(u'_id4').get(u'node')) + var.get(u'init').callprop(u'replaceWith', var.get(u'buildExportsAssignment')(var.get(u'_id4').get(u'node'), var.get(u'init').get(u'node')).get(u'expression')) + var.get(u'nonHoistedExportNames').put(var.get(u'_id4').get(u'node').get(u'name'), var.get(u'true')) + else: + pass + + var.get(u'_path').callprop(u'replaceWith', var.get(u'_declaration').get(u'node')) + continue + var.put(u'_specifiers', var.get(u'_path').callprop(u'get', Js(u'specifiers'))) + var.put(u'nodes', Js([])) + var.put(u'_source', var.get(u'_path').get(u'node').get(u'source')) + if var.get(u'_source'): + var.put(u'ref', var.get(u'addRequire')(var.get(u'_source').get(u'value'), var.get(u'_path').get(u'node').get(u'_blockHoist'))) + #for JS loop + var.put(u'_iterator6', var.get(u'_specifiers')) + var.put(u'_isArray6', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator6'))) + var.put(u'_i6', Js(0.0)) + var.put(u'_iterator6', (var.get(u'_iterator6') if var.get(u'_isArray6') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator6')))) + while 1: + pass + if var.get(u'_isArray6'): + if (var.get(u'_i6')>=var.get(u'_iterator6').get(u'length')): + break + var.put(u'_ref6', var.get(u'_iterator6').get((var.put(u'_i6',Js(var.get(u'_i6').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i6', var.get(u'_iterator6').callprop(u'next')) + if var.get(u'_i6').get(u'done'): + break + var.put(u'_ref6', var.get(u'_i6').get(u'value')) + var.put(u'_specifier3', var.get(u'_ref6')) + if var.get(u'_specifier3').callprop(u'isExportNamespaceSpecifier'): + pass + else: + if var.get(u'_specifier3').callprop(u'isExportDefaultSpecifier'): + pass + else: + if var.get(u'_specifier3').callprop(u'isExportSpecifier'): + if PyJsStrictEq(var.get(u'_specifier3').get(u'node').get(u'local').get(u'name'),Js(u'default')): + def PyJs_LONG_1023_(var=var): + return var.get(u'topNodes').callprop(u'push', var.get(u'buildExportsFrom')(var.get(u't').callprop(u'stringLiteral', var.get(u'_specifier3').get(u'node').get(u'exported').get(u'name')), var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'callExpression', var.get(u"this").callprop(u'addHelper', Js(u'interopRequireDefault')), Js([var.get(u'ref')])), var.get(u'_specifier3').get(u'node').get(u'local')))) + PyJs_LONG_1023_() + else: + var.get(u'topNodes').callprop(u'push', var.get(u'buildExportsFrom')(var.get(u't').callprop(u'stringLiteral', var.get(u'_specifier3').get(u'node').get(u'exported').get(u'name')), var.get(u't').callprop(u'memberExpression', var.get(u'ref'), var.get(u'_specifier3').get(u'node').get(u'local')))) + var.get(u'nonHoistedExportNames').put(var.get(u'_specifier3').get(u'node').get(u'exported').get(u'name'), var.get(u'true')) + + else: + #for JS loop + var.put(u'_iterator7', var.get(u'_specifiers')) + var.put(u'_isArray7', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator7'))) + var.put(u'_i7', Js(0.0)) + var.put(u'_iterator7', (var.get(u'_iterator7') if var.get(u'_isArray7') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator7')))) + while 1: + pass + if var.get(u'_isArray7'): + if (var.get(u'_i7')>=var.get(u'_iterator7').get(u'length')): + break + var.put(u'_ref7', var.get(u'_iterator7').get((var.put(u'_i7',Js(var.get(u'_i7').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i7', var.get(u'_iterator7').callprop(u'next')) + if var.get(u'_i7').get(u'done'): + break + var.put(u'_ref7', var.get(u'_i7').get(u'value')) + var.put(u'_specifier4', var.get(u'_ref7')) + if var.get(u'_specifier4').callprop(u'isExportSpecifier'): + var.get(u'addTo')(var.get(u'exports'), var.get(u'_specifier4').get(u'node').get(u'local').get(u'name'), var.get(u'_specifier4').get(u'node').get(u'exported')) + var.get(u'nonHoistedExportNames').put(var.get(u'_specifier4').get(u'node').get(u'exported').get(u'name'), var.get(u'true')) + var.get(u'nodes').callprop(u'push', var.get(u'buildExportsAssignment')(var.get(u'_specifier4').get(u'node').get(u'exported'), var.get(u'_specifier4').get(u'node').get(u'local'))) + + var.get(u'_path').callprop(u'replaceWithMultiple', var.get(u'nodes')) + else: + if var.get(u'_path').callprop(u'isExportAllDeclaration'): + PyJs_Object_1024_ = Js({u'OBJECT':var.get(u'addRequire')(var.get(u'_path').get(u'node').get(u'source').get(u'value'), var.get(u'_path').get(u'node').get(u'_blockHoist'))}) + var.put(u'exportNode', var.get(u'buildExportAll')(PyJs_Object_1024_)) + var.get(u'exportNode').put(u'loc', var.get(u'_path').get(u'node').get(u'loc')) + var.get(u'topNodes').callprop(u'push', var.get(u'exportNode')) + var.get(u'_path').callprop(u'remove') + + for PyJsTemp in var.get(u'imports'): + var.put(u'source', PyJsTemp) + var.put(u'_imports$source', var.get(u'imports').get(var.get(u'source'))) + var.put(u'specifiers', var.get(u'_imports$source').get(u'specifiers')) + var.put(u'maxBlockHoist', var.get(u'_imports$source').get(u'maxBlockHoist')) + if var.get(u'specifiers').get(u'length'): + var.put(u'uid', var.get(u'addRequire')(var.get(u'source'), var.get(u'maxBlockHoist'))) + var.put(u'wildcard', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'specifiers').get(u'length')): + try: + var.put(u'specifier', var.get(u'specifiers').get(var.get(u'i'))) + if var.get(u't').callprop(u'isImportNamespaceSpecifier', var.get(u'specifier')): + if var.get(u'strict'): + var.get(u'remaps').put(var.get(u'specifier').get(u'local').get(u'name'), var.get(u'uid')) + else: + var.put(u'varDecl', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'specifier').get(u'local'), var.get(u't').callprop(u'callExpression', var.get(u"this").callprop(u'addHelper', Js(u'interopRequireWildcard')), Js([var.get(u'uid')])))]))) + if (var.get(u'maxBlockHoist')>Js(0.0)): + var.get(u'varDecl').put(u'_blockHoist', var.get(u'maxBlockHoist')) + var.get(u'topNodes').callprop(u'push', var.get(u'varDecl')) + var.put(u'wildcard', var.get(u'specifier').get(u'local')) + else: + if var.get(u't').callprop(u'isImportDefaultSpecifier', var.get(u'specifier')): + var.get(u'specifiers').put(var.get(u'i'), var.get(u't').callprop(u'importSpecifier', var.get(u'specifier').get(u'local'), var.get(u't').callprop(u'identifier', Js(u'default')))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + #for JS loop + var.put(u'_iterator3', var.get(u'specifiers')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'_specifier', var.get(u'_ref3')) + if var.get(u't').callprop(u'isImportSpecifier', var.get(u'_specifier')): + var.put(u'target', var.get(u'uid')) + if PyJsStrictEq(var.get(u'_specifier').get(u'imported').get(u'name'),Js(u'default')): + if var.get(u'wildcard'): + var.put(u'target', var.get(u'wildcard')) + else: + var.put(u'target', var.put(u'wildcard', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', var.get(u'uid').get(u'name')))) + var.put(u'_varDecl', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'target'), var.get(u't').callprop(u'callExpression', var.get(u"this").callprop(u'addHelper', Js(u'interopRequireDefault')), Js([var.get(u'uid')])))]))) + if (var.get(u'maxBlockHoist')>Js(0.0)): + var.get(u'_varDecl').put(u'_blockHoist', var.get(u'maxBlockHoist')) + var.get(u'topNodes').callprop(u'push', var.get(u'_varDecl')) + var.get(u'remaps').put(var.get(u'_specifier').get(u'local').get(u'name'), var.get(u't').callprop(u'memberExpression', var.get(u'target'), var.get(u't').callprop(u'cloneWithoutLoc', var.get(u'_specifier').get(u'imported')))) + + else: + var.put(u'requireNode', var.get(u'buildRequire')(var.get(u't').callprop(u'stringLiteral', var.get(u'source')))) + var.get(u'requireNode').put(u'loc', var.get(u'imports').get(var.get(u'source')).get(u'loc')) + var.get(u'topNodes').callprop(u'push', var.get(u'requireNode')) + if (var.get(u'hasImports') and PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'nonHoistedExportNames')).get(u'length')): + var.put(u'hoistedExportsNode', var.get(u't').callprop(u'identifier', Js(u'undefined'))) + for PyJsTemp in var.get(u'nonHoistedExportNames'): + var.put(u'name', PyJsTemp) + var.put(u'hoistedExportsNode', var.get(u'buildExportsAssignment')(var.get(u't').callprop(u'identifier', var.get(u'name')), var.get(u'hoistedExportsNode')).get(u'expression')) + var.put(u'node', var.get(u't').callprop(u'expressionStatement', var.get(u'hoistedExportsNode'))) + var.get(u'node').put(u'_blockHoist', Js(3.0)) + var.get(u'topNodes').callprop(u'unshift', var.get(u'node')) + if (var.get(u'hasExports') and var.get(u'strict').neg()): + var.put(u'buildTemplate', var.get(u'buildExportsModuleDeclaration')) + if var.get(u"this").get(u'opts').get(u'loose'): + var.put(u'buildTemplate', var.get(u'buildLooseExportsModuleDeclaration')) + var.put(u'declar', var.get(u'buildTemplate')()) + var.get(u'declar').put(u'_blockHoist', Js(3.0)) + var.get(u'topNodes').callprop(u'unshift', var.get(u'declar')) + var.get(u'path').callprop(u'unshiftContainer', Js(u'body'), var.get(u'topNodes')) + @Js + def PyJs_requeueInParent_1026_(newPath, this, arguments, var=var): + var = Scope({u'newPath':newPath, u'this':this, u'arguments':arguments, u'requeueInParent':PyJs_requeueInParent_1026_}, var) + var.registers([u'newPath']) + return var.get(u'path').callprop(u'requeue', var.get(u'newPath')) + PyJs_requeueInParent_1026_._set_name(u'requeueInParent') + PyJs_Object_1025_ = Js({u'remaps':var.get(u'remaps'),u'scope':var.get(u'scope'),u'exports':var.get(u'exports'),u'requeueInParent':PyJs_requeueInParent_1026_}) + var.get(u'path').callprop(u'traverse', var.get(u'reassignmentVisitor'), PyJs_Object_1025_) + PyJs_exit_1021_._set_name(u'exit') + PyJs_Object_1020_ = Js({u'exit':PyJs_exit_1021_}) + PyJs_Object_1017_ = Js({u'ThisExpression':PyJs_ThisExpression_1018_,u'Program':PyJs_Object_1020_}) + PyJs_Object_1016_ = Js({u'inherits':var.get(u'require')(Js(u'babel-plugin-transform-strict-mode')),u'visitor':PyJs_Object_1017_}) + return PyJs_Object_1016_ + PyJs_anonymous_1010_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1010_) + var.put(u'_path2', var.get(u'require')(Js(u'path'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'buildRequire', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n require($0);\n'))) + var.put(u'buildExportsModuleDeclaration', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n'))) + var.put(u'buildExportsFrom', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n Object.defineProperty(exports, $0, {\n enumerable: true,\n get: function () {\n return $1;\n }\n });\n'))) + var.put(u'buildLooseExportsModuleDeclaration', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n exports.__esModule = true;\n'))) + var.put(u'buildExportsAssignment', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n exports.$0 = $1;\n'))) + var.put(u'buildExportAll', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n Object.keys(OBJECT).forEach(function (key) {\n if (key === "default" || key === "__esModule") return;\n Object.defineProperty(exports, key, {\n enumerable: true,\n get: function () {\n return OBJECT[key];\n }\n });\n });\n'))) + var.put(u'THIS_BREAK_KEYS', Js([Js(u'FunctionExpression'), Js(u'FunctionDeclaration'), Js(u'ClassProperty'), Js(u'ClassMethod'), Js(u'ObjectMethod')])) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1009_._set_name(u'anonymous') +PyJs_Object_1029_ = Js({u'babel-plugin-transform-strict-mode':Js(94.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/object/create':Js(101.0),u'babel-runtime/core-js/object/keys':Js(103.0),u'babel-runtime/core-js/symbol':Js(105.0),u'babel-template':Js(221.0),u'babel-types':Js(258.0),u'path':Js(530.0)}) +@Js +def PyJs_anonymous_1030_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_create', u'exports', u'_symbol2', u'_babelHelperHoistVariables', u'buildExportAll', u'require', u'_babelTemplate', u'module', u'_create2', u'buildTemplate', u'_symbol', u'_babelHelperHoistVariables2', u'_interopRequireDefault', u'_babelTemplate2', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1047_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1047_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_create', var.get(u'require')(Js(u'babel-runtime/core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_symbol', var.get(u'require')(Js(u'babel-runtime/core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + @Js + def PyJs_anonymous_1031_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'reassignmentVisitor', u'IGNORE_REASSIGNMENT_SYMBOL', u'_ref', u't']) + var.put(u't', var.get(u'_ref').get(u'types')) + var.put(u'IGNORE_REASSIGNMENT_SYMBOL', PyJsComma(Js(0.0),var.get(u'_symbol2').get(u'default'))()) + @Js + def PyJs_AssignmentExpressionUpdateExpression_1033_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'AssignmentExpressionUpdateExpression':PyJs_AssignmentExpressionUpdateExpression_1033_}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'name', u'exportedNames', u'_ref2', u'exportedName', u'_i', u'arg', u'isPostUpdateExpression', u'path']) + if var.get(u'path').get(u'node').get(var.get(u'IGNORE_REASSIGNMENT_SYMBOL')): + return var.get('undefined') + var.get(u'path').get(u'node').put(var.get(u'IGNORE_REASSIGNMENT_SYMBOL'), var.get(u'true')) + var.put(u'arg', var.get(u'path').callprop(u'get', (Js(u'left') if var.get(u'path').callprop(u'isAssignmentExpression') else Js(u'argument')))) + if var.get(u'arg').callprop(u'isIdentifier').neg(): + return var.get('undefined') + var.put(u'name', var.get(u'arg').get(u'node').get(u'name')) + if PyJsStrictNeq(var.get(u"this").get(u'scope').callprop(u'getBinding', var.get(u'name')),var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'name'))): + return var.get('undefined') + var.put(u'exportedNames', var.get(u"this").get(u'exports').get(var.get(u'name'))) + if var.get(u'exportedNames').neg(): + return var.get('undefined') + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'isPostUpdateExpression', (var.get(u'path').callprop(u'isUpdateExpression') and var.get(u'node').get(u'prefix').neg())) + if var.get(u'isPostUpdateExpression'): + if PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'++')): + var.put(u'node', var.get(u't').callprop(u'binaryExpression', Js(u'+'), var.get(u'node').get(u'argument'), var.get(u't').callprop(u'numericLiteral', Js(1.0)))) + else: + if PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'--')): + var.put(u'node', var.get(u't').callprop(u'binaryExpression', Js(u'-'), var.get(u'node').get(u'argument'), var.get(u't').callprop(u'numericLiteral', Js(1.0)))) + else: + var.put(u'isPostUpdateExpression', Js(False)) + #for JS loop + var.put(u'_iterator', var.get(u'exportedNames')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'exportedName', var.get(u'_ref2')) + var.put(u'node', var.get(u"this").callprop(u'buildCall', var.get(u'exportedName'), var.get(u'node')).get(u'expression')) + + if var.get(u'isPostUpdateExpression'): + var.put(u'node', var.get(u't').callprop(u'sequenceExpression', Js([var.get(u'node'), var.get(u'path').get(u'node')]))) + var.get(u'path').callprop(u'replaceWith', var.get(u'node')) + PyJs_AssignmentExpressionUpdateExpression_1033_._set_name(u'AssignmentExpressionUpdateExpression') + PyJs_Object_1032_ = Js({u'AssignmentExpression|UpdateExpression':PyJs_AssignmentExpressionUpdateExpression_1033_}) + var.put(u'reassignmentVisitor', PyJs_Object_1032_) + @Js + def PyJs_ReferencedIdentifier_1036_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1036_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if ((var.get(u'path').get(u'node').get(u'name')==Js(u'__moduleName')) and var.get(u'path').get(u'scope').callprop(u'hasBinding', Js(u'__moduleName')).neg()): + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'memberExpression', var.get(u'state').get(u'contextIdent'), var.get(u't').callprop(u'identifier', Js(u'id')))) + PyJs_ReferencedIdentifier_1036_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_enter_1038_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'enter':PyJs_enter_1038_}, var) + var.registers([u'path', u'state']) + var.get(u'state').put(u'contextIdent', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'context'))) + PyJs_enter_1038_._set_name(u'enter') + @Js + def PyJs_exit_1039_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'exit':PyJs_exit_1039_, u'arguments':arguments}, var) + var.registers([u'_isArray7', u'specifier', u'_isArray5', u'_isArray4', u'_isArray3', u'contextIdent', u'_isArray6', u'_i3', u'_name2', u'canHoist', u'_nodes', u'sources', u'variableIds', u'path', u'id', u'_isArray2', u'setterBody', u'_source', u'_i7', u'_i6', u'_i5', u'addExportName', u'removedPaths', u'_i2', u'_specifier', u'source', u'_node', u'_declar', u'nodes', u'_ref3', u'body', u'node', u'state', u'bindingIdentifiers', u'pushModule', u'setters', u'_path3', u'exportIdent', u'_specifiers', u'exportObjRef', u'_bindingIdentifiers', u'_path2', u'beforeBody', u'target', u'specifiers', u'moduleName', u'_iterator6', u'name', u'_ref8', u'_ref7', u'_ref6', u'_ref5', u'_ref4', u'modules', u'exportNames', u'_name', u'buildExportCall', u'_i4', u'declar', u'_nodes2', u'_iterator5', u'_iterator4', u'_iterator7', u'_iterator2', u'_iterator3', u'_path']) + @Js + def PyJsHoisted_buildExportCall_(name, val, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'val':val, u'arguments':arguments}, var) + var.registers([u'name', u'val']) + return var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u'exportIdent'), Js([var.get(u't').callprop(u'stringLiteral', var.get(u'name')), var.get(u'val')]))) + PyJsHoisted_buildExportCall_.func_name = u'buildExportCall' + var.put(u'buildExportCall', PyJsHoisted_buildExportCall_) + @Js + def PyJsHoisted_addExportName_(key, val, this, arguments, var=var): + var = Scope({u'this':this, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'val', u'key']) + var.get(u'exportNames').put(var.get(u'key'), (var.get(u'exportNames').get(var.get(u'key')) or Js([]))) + var.get(u'exportNames').get(var.get(u'key')).callprop(u'push', var.get(u'val')) + PyJsHoisted_addExportName_.func_name = u'addExportName' + var.put(u'addExportName', PyJsHoisted_addExportName_) + @Js + def PyJsHoisted_pushModule_(source, key, specifiers, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'arguments':arguments, u'key':key, u'specifiers':specifiers}, var) + var.registers([u'source', u'key', u'_modules', u'specifiers']) + PyJs_Object_1040_ = Js({u'imports':Js([]),u'exports':Js([])}) + var.put(u'_modules', var.get(u'modules').put(var.get(u'source'), (var.get(u'modules').get(var.get(u'source')) or PyJs_Object_1040_))) + var.get(u'_modules').put(var.get(u'key'), var.get(u'_modules').get(var.get(u'key')).callprop(u'concat', var.get(u'specifiers'))) + PyJsHoisted_pushModule_.func_name = u'pushModule' + var.put(u'pushModule', PyJsHoisted_pushModule_) + var.put(u'exportIdent', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'export'))) + var.put(u'contextIdent', var.get(u'state').get(u'contextIdent')) + var.put(u'exportNames', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'modules', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'beforeBody', Js([])) + var.put(u'setters', Js([])) + var.put(u'sources', Js([])) + var.put(u'variableIds', Js([])) + var.put(u'removedPaths', Js([])) + pass + pass + pass + var.put(u'body', var.get(u'path').callprop(u'get', Js(u'body'))) + var.put(u'canHoist', var.get(u'true')) + #for JS loop + var.put(u'_iterator2', var.get(u'body')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i2').get(u'value')) + var.put(u'_path', var.get(u'_ref3')) + if var.get(u'_path').callprop(u'isExportDeclaration'): + var.put(u'_path', var.get(u'_path').callprop(u'get', Js(u'declaration'))) + if (var.get(u'_path').callprop(u'isVariableDeclaration') and PyJsStrictNeq(var.get(u'_path').get(u'node').get(u'kind'),Js(u'var'))): + var.put(u'canHoist', Js(False)) + break + + #for JS loop + var.put(u'_iterator3', var.get(u'body')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i3').get(u'value')) + var.put(u'_path2', var.get(u'_ref4')) + if (var.get(u'canHoist') and var.get(u'_path2').callprop(u'isFunctionDeclaration')): + var.get(u'beforeBody').callprop(u'push', var.get(u'_path2').get(u'node')) + var.get(u'removedPaths').callprop(u'push', var.get(u'_path2')) + else: + if var.get(u'_path2').callprop(u'isImportDeclaration'): + var.put(u'_source', var.get(u'_path2').get(u'node').get(u'source').get(u'value')) + var.get(u'pushModule')(var.get(u'_source'), Js(u'imports'), var.get(u'_path2').get(u'node').get(u'specifiers')) + for PyJsTemp in var.get(u'_path2').callprop(u'getBindingIdentifiers'): + var.put(u'name', PyJsTemp) + var.get(u'_path2').get(u'scope').callprop(u'removeBinding', var.get(u'name')) + var.get(u'variableIds').callprop(u'push', var.get(u't').callprop(u'identifier', var.get(u'name'))) + var.get(u'_path2').callprop(u'remove') + else: + if var.get(u'_path2').callprop(u'isExportAllDeclaration'): + var.get(u'pushModule')(var.get(u'_path2').get(u'node').get(u'source').get(u'value'), Js(u'exports'), var.get(u'_path2').get(u'node')) + var.get(u'_path2').callprop(u'remove') + else: + if var.get(u'_path2').callprop(u'isExportDefaultDeclaration'): + var.put(u'declar', var.get(u'_path2').callprop(u'get', Js(u'declaration'))) + if (var.get(u'declar').callprop(u'isClassDeclaration') or var.get(u'declar').callprop(u'isFunctionDeclaration')): + var.put(u'id', var.get(u'declar').get(u'node').get(u'id')) + var.put(u'nodes', Js([])) + if var.get(u'id'): + var.get(u'nodes').callprop(u'push', var.get(u'declar').get(u'node')) + var.get(u'nodes').callprop(u'push', var.get(u'buildExportCall')(Js(u'default'), var.get(u'id'))) + var.get(u'addExportName')(var.get(u'id').get(u'name'), Js(u'default')) + else: + var.get(u'nodes').callprop(u'push', var.get(u'buildExportCall')(Js(u'default'), var.get(u't').callprop(u'toExpression', var.get(u'declar').get(u'node')))) + if (var.get(u'canHoist').neg() or var.get(u'declar').callprop(u'isClassDeclaration')): + var.get(u'_path2').callprop(u'replaceWithMultiple', var.get(u'nodes')) + else: + var.put(u'beforeBody', var.get(u'beforeBody').callprop(u'concat', var.get(u'nodes'))) + var.get(u'removedPaths').callprop(u'push', var.get(u'_path2')) + else: + var.get(u'_path2').callprop(u'replaceWith', var.get(u'buildExportCall')(Js(u'default'), var.get(u'declar').get(u'node'))) + else: + if var.get(u'_path2').callprop(u'isExportNamedDeclaration'): + var.put(u'_declar', var.get(u'_path2').callprop(u'get', Js(u'declaration'))) + if var.get(u'_declar').get(u'node'): + var.get(u'_path2').callprop(u'replaceWith', var.get(u'_declar')) + var.put(u'_nodes', Js([])) + var.put(u'bindingIdentifiers', PyJsComma(Js(0.0), Js(None))) + if var.get(u'_path2').callprop(u'isFunction'): + var.put(u'_node', var.get(u'_declar').get(u'node')) + var.put(u'_name', var.get(u'_node').get(u'id').get(u'name')) + if var.get(u'canHoist'): + var.get(u'addExportName')(var.get(u'_name'), var.get(u'_name')) + var.get(u'beforeBody').callprop(u'push', var.get(u'_node')) + var.get(u'beforeBody').callprop(u'push', var.get(u'buildExportCall')(var.get(u'_name'), var.get(u'_node').get(u'id'))) + var.get(u'removedPaths').callprop(u'push', var.get(u'_path2')) + else: + pass + PyJs_Object_1041_ = Js({}) + var.put(u'bindingIdentifiers', PyJsComma(PyJsComma(var.put(u'_bindingIdentifiers', PyJs_Object_1041_),var.get(u'_bindingIdentifiers').put(var.get(u'_name'), var.get(u'_node').get(u'id'))),var.get(u'_bindingIdentifiers'))) + else: + var.put(u'bindingIdentifiers', var.get(u'_declar').callprop(u'getBindingIdentifiers')) + for PyJsTemp in var.get(u'bindingIdentifiers'): + var.put(u'_name2', PyJsTemp) + var.get(u'addExportName')(var.get(u'_name2'), var.get(u'_name2')) + var.get(u'_nodes').callprop(u'push', var.get(u'buildExportCall')(var.get(u'_name2'), var.get(u't').callprop(u'identifier', var.get(u'_name2')))) + var.get(u'_path2').callprop(u'insertAfter', var.get(u'_nodes')) + else: + var.put(u'_specifiers', var.get(u'_path2').get(u'node').get(u'specifiers')) + if (var.get(u'_specifiers') and var.get(u'_specifiers').get(u'length')): + if var.get(u'_path2').get(u'node').get(u'source'): + var.get(u'pushModule')(var.get(u'_path2').get(u'node').get(u'source').get(u'value'), Js(u'exports'), var.get(u'_specifiers')) + var.get(u'_path2').callprop(u'remove') + else: + var.put(u'_nodes2', Js([])) + #for JS loop + var.put(u'_iterator7', var.get(u'_specifiers')) + var.put(u'_isArray7', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator7'))) + var.put(u'_i7', Js(0.0)) + var.put(u'_iterator7', (var.get(u'_iterator7') if var.get(u'_isArray7') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator7')))) + while 1: + pass + if var.get(u'_isArray7'): + if (var.get(u'_i7')>=var.get(u'_iterator7').get(u'length')): + break + var.put(u'_ref8', var.get(u'_iterator7').get((var.put(u'_i7',Js(var.get(u'_i7').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i7', var.get(u'_iterator7').callprop(u'next')) + if var.get(u'_i7').get(u'done'): + break + var.put(u'_ref8', var.get(u'_i7').get(u'value')) + var.put(u'_specifier', var.get(u'_ref8')) + var.get(u'_nodes2').callprop(u'push', var.get(u'buildExportCall')(var.get(u'_specifier').get(u'exported').get(u'name'), var.get(u'_specifier').get(u'local'))) + var.get(u'addExportName')(var.get(u'_specifier').get(u'local').get(u'name'), var.get(u'_specifier').get(u'exported').get(u'name')) + + var.get(u'_path2').callprop(u'replaceWithMultiple', var.get(u'_nodes2')) + + for PyJsTemp in var.get(u'modules'): + var.put(u'source', PyJsTemp) + var.put(u'specifiers', var.get(u'modules').get(var.get(u'source'))) + var.put(u'setterBody', Js([])) + var.put(u'target', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', var.get(u'source'))) + #for JS loop + var.put(u'_iterator4', var.get(u'specifiers').get(u'imports')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i4').get(u'value')) + var.put(u'specifier', var.get(u'_ref5')) + if var.get(u't').callprop(u'isImportNamespaceSpecifier', var.get(u'specifier')): + var.get(u'setterBody').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'specifier').get(u'local'), var.get(u'target')))) + else: + if var.get(u't').callprop(u'isImportDefaultSpecifier', var.get(u'specifier')): + var.put(u'specifier', var.get(u't').callprop(u'importSpecifier', var.get(u'specifier').get(u'local'), var.get(u't').callprop(u'identifier', Js(u'default')))) + if var.get(u't').callprop(u'isImportSpecifier', var.get(u'specifier')): + var.get(u'setterBody').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'specifier').get(u'local'), var.get(u't').callprop(u'memberExpression', var.get(u'target'), var.get(u'specifier').get(u'imported'))))) + + if var.get(u'specifiers').get(u'exports').get(u'length'): + var.put(u'exportObjRef', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'exportObj'))) + var.get(u'setterBody').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'exportObjRef'), var.get(u't').callprop(u'objectExpression', Js([])))]))) + #for JS loop + var.put(u'_iterator5', var.get(u'specifiers').get(u'exports')) + var.put(u'_isArray5', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator5'))) + var.put(u'_i5', Js(0.0)) + var.put(u'_iterator5', (var.get(u'_iterator5') if var.get(u'_isArray5') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator5')))) + while 1: + pass + if var.get(u'_isArray5'): + if (var.get(u'_i5')>=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref6', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref6', var.get(u'_i5').get(u'value')) + var.put(u'node', var.get(u'_ref6')) + if var.get(u't').callprop(u'isExportAllDeclaration', var.get(u'node')): + PyJs_Object_1042_ = Js({u'KEY':var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'key')),u'EXPORT_OBJ':var.get(u'exportObjRef'),u'TARGET':var.get(u'target')}) + var.get(u'setterBody').callprop(u'push', var.get(u'buildExportAll')(PyJs_Object_1042_)) + else: + if var.get(u't').callprop(u'isExportSpecifier', var.get(u'node')): + var.get(u'setterBody').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u't').callprop(u'memberExpression', var.get(u'exportObjRef'), var.get(u'node').get(u'exported')), var.get(u't').callprop(u'memberExpression', var.get(u'target'), var.get(u'node').get(u'local'))))) + else: + pass + + var.get(u'setterBody').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u'exportIdent'), Js([var.get(u'exportObjRef')])))) + var.get(u'sources').callprop(u'push', var.get(u't').callprop(u'stringLiteral', var.get(u'source'))) + var.get(u'setters').callprop(u'push', var.get(u't').callprop(u'functionExpression', var.get(u"null"), Js([var.get(u'target')]), var.get(u't').callprop(u'blockStatement', var.get(u'setterBody')))) + var.put(u'moduleName', var.get(u"this").callprop(u'getModuleName')) + if var.get(u'moduleName'): + var.put(u'moduleName', var.get(u't').callprop(u'stringLiteral', var.get(u'moduleName'))) + if var.get(u'canHoist'): + @Js + def PyJs_anonymous_1043_(id, this, arguments, var=var): + var = Scope({u'this':this, u'id':id, u'arguments':arguments}, var) + var.registers([u'id']) + return var.get(u'variableIds').callprop(u'push', var.get(u'id')) + PyJs_anonymous_1043_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_babelHelperHoistVariables2').get(u'default'))(var.get(u'path'), PyJs_anonymous_1043_) + if var.get(u'variableIds').get(u'length'): + @Js + def PyJs_anonymous_1044_(id, this, arguments, var=var): + var = Scope({u'this':this, u'id':id, u'arguments':arguments}, var) + var.registers([u'id']) + return var.get(u't').callprop(u'variableDeclarator', var.get(u'id')) + PyJs_anonymous_1044_._set_name(u'anonymous') + var.get(u'beforeBody').callprop(u'unshift', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), var.get(u'variableIds').callprop(u'map', PyJs_anonymous_1044_))) + PyJs_Object_1045_ = Js({u'exports':var.get(u'exportNames'),u'buildCall':var.get(u'buildExportCall'),u'scope':var.get(u'path').get(u'scope')}) + var.get(u'path').callprop(u'traverse', var.get(u'reassignmentVisitor'), PyJs_Object_1045_) + #for JS loop + var.put(u'_iterator6', var.get(u'removedPaths')) + var.put(u'_isArray6', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator6'))) + var.put(u'_i6', Js(0.0)) + var.put(u'_iterator6', (var.get(u'_iterator6') if var.get(u'_isArray6') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator6')))) + while 1: + pass + if var.get(u'_isArray6'): + if (var.get(u'_i6')>=var.get(u'_iterator6').get(u'length')): + break + var.put(u'_ref7', var.get(u'_iterator6').get((var.put(u'_i6',Js(var.get(u'_i6').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i6', var.get(u'_iterator6').callprop(u'next')) + if var.get(u'_i6').get(u'done'): + break + var.put(u'_ref7', var.get(u'_i6').get(u'value')) + var.put(u'_path3', var.get(u'_ref7')) + var.get(u'_path3').callprop(u'remove') + + PyJs_Object_1046_ = Js({u'SYSTEM_REGISTER':var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', (var.get(u'state').get(u'opts').get(u'systemGlobal') or Js(u'System'))), var.get(u't').callprop(u'identifier', Js(u'register'))),u'BEFORE_BODY':var.get(u'beforeBody'),u'MODULE_NAME':var.get(u'moduleName'),u'SETTERS':var.get(u'setters'),u'SOURCES':var.get(u'sources'),u'BODY':var.get(u'path').get(u'node').get(u'body'),u'EXPORT_IDENTIFIER':var.get(u'exportIdent'),u'CONTEXT_IDENTIFIER':var.get(u'contextIdent')}) + var.get(u'path').get(u'node').put(u'body', Js([var.get(u'buildTemplate')(PyJs_Object_1046_)])) + PyJs_exit_1039_._set_name(u'exit') + PyJs_Object_1037_ = Js({u'enter':PyJs_enter_1038_,u'exit':PyJs_exit_1039_}) + PyJs_Object_1035_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1036_,u'Program':PyJs_Object_1037_}) + PyJs_Object_1034_ = Js({u'visitor':PyJs_Object_1035_}) + return PyJs_Object_1034_ + PyJs_anonymous_1031_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1031_) + var.put(u'_babelHelperHoistVariables', var.get(u'require')(Js(u'babel-helper-hoist-variables'))) + var.put(u'_babelHelperHoistVariables2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperHoistVariables'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + pass + var.put(u'buildTemplate', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n SYSTEM_REGISTER(MODULE_NAME, [SOURCES], function (EXPORT_IDENTIFIER, CONTEXT_IDENTIFIER) {\n "use strict";\n BEFORE_BODY;\n return {\n setters: [SETTERS],\n execute: function () {\n BODY;\n }\n };\n });\n'))) + var.put(u'buildExportAll', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n for (var KEY in TARGET) {\n if (KEY !== "default" && KEY !== "__esModule") EXPORT_OBJ[KEY] = TARGET[KEY];\n }\n'))) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1030_._set_name(u'anonymous') +PyJs_Object_1048_ = Js({u'babel-helper-hoist-variables':Js(51.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/object/create':Js(101.0),u'babel-runtime/core-js/symbol':Js(105.0),u'babel-template':Js(221.0)}) +@Js +def PyJs_anonymous_1049_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'_babelTemplate', u'module', u'_babelTemplate2', u'buildWrapper', u'buildGlobalExport', u'_interopRequireDefault', u'buildPrerequisiteAssignment', u'_path']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1064_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1064_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_1050_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u'isValidDefine', u't']) + @Js + def PyJsHoisted_isValidDefine_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'expr', u'args', u'path']) + if var.get(u'path').callprop(u'isExpressionStatement').neg(): + return var.get('undefined') + var.put(u'expr', var.get(u'path').callprop(u'get', Js(u'expression'))) + if var.get(u'expr').callprop(u'isCallExpression').neg(): + return Js(False) + PyJs_Object_1051_ = Js({u'name':Js(u'define')}) + if var.get(u'expr').callprop(u'get', Js(u'callee')).callprop(u'isIdentifier', PyJs_Object_1051_).neg(): + return Js(False) + var.put(u'args', var.get(u'expr').callprop(u'get', Js(u'arguments'))) + if (PyJsStrictEq(var.get(u'args').get(u'length'),Js(3.0)) and var.get(u'args').callprop(u'shift').callprop(u'isStringLiteral').neg()): + return Js(False) + if PyJsStrictNeq(var.get(u'args').get(u'length'),Js(2.0)): + return Js(False) + if var.get(u'args').callprop(u'shift').callprop(u'isArrayExpression').neg(): + return Js(False) + if var.get(u'args').callprop(u'shift').callprop(u'isFunctionExpression').neg(): + return Js(False) + return var.get(u'true') + PyJsHoisted_isValidDefine_.func_name = u'isValidDefine' + var.put(u'isValidDefine', PyJsHoisted_isValidDefine_) + var.put(u't', var.get(u'_ref').get(u'types')) + pass + @Js + def PyJs_exit_1055_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'exit':PyJs_exit_1055_, u'arguments':arguments}, var) + var.registers([u'browserGlobals', u'moduleName', u'last', u'members', u'globalName', u'args', u'browserArgs', u'commonArgs', u'amdArgs', u'state', u'call', u'func', u'globalToAssign', u'moduleNameOrBasename', u'path', u'globalExport', u'prerequisiteAssignments']) + var.put(u'last', var.get(u'path').callprop(u'get', Js(u'body')).callprop(u'pop')) + if var.get(u'isValidDefine')(var.get(u'last')).neg(): + return var.get('undefined') + var.put(u'call', var.get(u'last').get(u'node').get(u'expression')) + var.put(u'args', var.get(u'call').get(u'arguments')) + var.put(u'moduleName', (var.get(u'args').callprop(u'shift') if PyJsStrictEq(var.get(u'args').get(u'length'),Js(3.0)) else var.get(u"null"))) + var.put(u'amdArgs', var.get(u'call').get(u'arguments').get(u'0')) + var.put(u'func', var.get(u'call').get(u'arguments').get(u'1')) + PyJs_Object_1056_ = Js({}) + var.put(u'browserGlobals', (var.get(u'state').get(u'opts').get(u'globals') or PyJs_Object_1056_)) + @Js + def PyJs_anonymous_1057_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + if (PyJsStrictEq(var.get(u'arg').get(u'value'),Js(u'module')) or PyJsStrictEq(var.get(u'arg').get(u'value'),Js(u'exports'))): + return var.get(u't').callprop(u'identifier', var.get(u'arg').get(u'value')) + else: + return var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'identifier', Js(u'require')), Js([var.get(u'arg')])) + PyJs_anonymous_1057_._set_name(u'anonymous') + var.put(u'commonArgs', var.get(u'amdArgs').get(u'elements').callprop(u'map', PyJs_anonymous_1057_)) + @Js + def PyJs_anonymous_1058_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'memberExpression', u'globalRef', u'arg', u'globalName', u'requireName']) + if PyJsStrictEq(var.get(u'arg').get(u'value'),Js(u'module')): + return var.get(u't').callprop(u'identifier', Js(u'mod')) + else: + if PyJsStrictEq(var.get(u'arg').get(u'value'),Js(u'exports')): + return var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'mod')), var.get(u't').callprop(u'identifier', Js(u'exports'))) + else: + var.put(u'memberExpression', PyJsComma(Js(0.0), Js(None))) + if var.get(u'state').get(u'opts').get(u'exactGlobals'): + var.put(u'globalRef', var.get(u'browserGlobals').get(var.get(u'arg').get(u'value'))) + if var.get(u'globalRef'): + @Js + def PyJs_anonymous_1059_(accum, curr, this, arguments, var=var): + var = Scope({u'this':this, u'curr':curr, u'accum':accum, u'arguments':arguments}, var) + var.registers([u'curr', u'accum']) + return var.get(u't').callprop(u'memberExpression', var.get(u'accum'), var.get(u't').callprop(u'identifier', var.get(u'curr'))) + PyJs_anonymous_1059_._set_name(u'anonymous') + var.put(u'memberExpression', var.get(u'globalRef').callprop(u'split', Js(u'.')).callprop(u'reduce', PyJs_anonymous_1059_, var.get(u't').callprop(u'identifier', Js(u'global')))) + else: + var.put(u'memberExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'global')), var.get(u't').callprop(u'identifier', var.get(u't').callprop(u'toIdentifier', var.get(u'arg').get(u'value'))))) + else: + var.put(u'requireName', PyJsComma(Js(0.0),var.get(u'_path').get(u'basename'))(var.get(u'arg').get(u'value'), PyJsComma(Js(0.0),var.get(u'_path').get(u'extname'))(var.get(u'arg').get(u'value')))) + var.put(u'globalName', (var.get(u'browserGlobals').get(var.get(u'requireName')) or var.get(u'requireName'))) + var.put(u'memberExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'global')), var.get(u't').callprop(u'identifier', var.get(u't').callprop(u'toIdentifier', var.get(u'globalName'))))) + return var.get(u'memberExpression') + PyJs_anonymous_1058_._set_name(u'anonymous') + var.put(u'browserArgs', var.get(u'amdArgs').get(u'elements').callprop(u'map', PyJs_anonymous_1058_)) + var.put(u'moduleNameOrBasename', (var.get(u'moduleName').get(u'value') if var.get(u'moduleName') else var.get(u"this").get(u'file').get(u'opts').get(u'basename'))) + var.put(u'globalToAssign', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'global')), var.get(u't').callprop(u'identifier', var.get(u't').callprop(u'toIdentifier', var.get(u'moduleNameOrBasename'))))) + var.put(u'prerequisiteAssignments', var.get(u"null")) + if var.get(u'state').get(u'opts').get(u'exactGlobals'): + var.put(u'globalName', var.get(u'browserGlobals').get(var.get(u'moduleNameOrBasename'))) + if var.get(u'globalName'): + var.put(u'prerequisiteAssignments', Js([])) + var.put(u'members', var.get(u'globalName').callprop(u'split', Js(u'.'))) + @Js + def PyJs_anonymous_1060_(accum, curr, this, arguments, var=var): + var = Scope({u'this':this, u'curr':curr, u'accum':accum, u'arguments':arguments}, var) + var.registers([u'curr', u'accum']) + PyJs_Object_1061_ = Js({u'GLOBAL_REFERENCE':var.get(u'accum')}) + var.get(u'prerequisiteAssignments').callprop(u'push', var.get(u'buildPrerequisiteAssignment')(PyJs_Object_1061_)) + return var.get(u't').callprop(u'memberExpression', var.get(u'accum'), var.get(u't').callprop(u'identifier', var.get(u'curr'))) + PyJs_anonymous_1060_._set_name(u'anonymous') + var.put(u'globalToAssign', var.get(u'members').callprop(u'slice', Js(1.0)).callprop(u'reduce', PyJs_anonymous_1060_, var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'global')), var.get(u't').callprop(u'identifier', var.get(u'members').get(u'0'))))) + PyJs_Object_1062_ = Js({u'BROWSER_ARGUMENTS':var.get(u'browserArgs'),u'PREREQUISITE_ASSIGNMENTS':var.get(u'prerequisiteAssignments'),u'GLOBAL_TO_ASSIGN':var.get(u'globalToAssign')}) + var.put(u'globalExport', var.get(u'buildGlobalExport')(PyJs_Object_1062_)) + PyJs_Object_1063_ = Js({u'MODULE_NAME':var.get(u'moduleName'),u'AMD_ARGUMENTS':var.get(u'amdArgs'),u'COMMON_ARGUMENTS':var.get(u'commonArgs'),u'GLOBAL_EXPORT':var.get(u'globalExport'),u'FUNC':var.get(u'func')}) + var.get(u'last').callprop(u'replaceWith', var.get(u'buildWrapper')(PyJs_Object_1063_)) + PyJs_exit_1055_._set_name(u'exit') + PyJs_Object_1054_ = Js({u'exit':PyJs_exit_1055_}) + PyJs_Object_1053_ = Js({u'Program':PyJs_Object_1054_}) + PyJs_Object_1052_ = Js({u'inherits':var.get(u'require')(Js(u'babel-plugin-transform-es2015-modules-amd')),u'visitor':PyJs_Object_1053_}) + return PyJs_Object_1052_ + PyJs_anonymous_1050_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1050_) + var.put(u'_path', var.get(u'require')(Js(u'path'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + pass + var.put(u'buildPrerequisiteAssignment', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n GLOBAL_REFERENCE = GLOBAL_REFERENCE || {}\n'))) + var.put(u'buildGlobalExport', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n var mod = { exports: {} };\n factory(BROWSER_ARGUMENTS);\n PREREQUISITE_ASSIGNMENTS\n GLOBAL_TO_ASSIGN = mod.exports;\n'))) + var.put(u'buildWrapper', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (global, factory) {\n if (typeof define === "function" && define.amd) {\n define(MODULE_NAME, AMD_ARGUMENTS, factory);\n } else if (typeof exports !== "undefined") {\n factory(COMMON_ARGUMENTS);\n } else {\n GLOBAL_EXPORT\n }\n })(this, FUNC);\n'))) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1049_._set_name(u'anonymous') +PyJs_Object_1065_ = Js({u'babel-plugin-transform-es2015-modules-amd':Js(72.0),u'babel-template':Js(221.0),u'path':Js(530.0)}) +@Js +def PyJs_anonymous_1066_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_babelHelperReplaceSupers2', u'exports', u'_symbol2', u'require', u'module', u'_symbol', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_babelHelperReplaceSupers']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1077_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1077_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_symbol', var.get(u'require')(Js(u'babel-runtime/core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + @Js + def PyJs_anonymous_1067_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u'Property', u't', u'CONTAINS_SUPER']) + @Js + def PyJsHoisted_Property_(path, node, scope, getObjectRef, file, this, arguments, var=var): + var = Scope({u'node':node, u'getObjectRef':getObjectRef, u'arguments':arguments, u'file':file, u'scope':scope, u'this':this, u'path':path}, var) + var.registers([u'node', u'getObjectRef', u'replaceSupers', u'file', u'scope', u'path']) + PyJs_Object_1068_ = Js({u'getObjectRef':var.get(u'getObjectRef'),u'methodNode':var.get(u'node'),u'methodPath':var.get(u'path'),u'isStatic':var.get(u'true'),u'scope':var.get(u'scope'),u'file':var.get(u'file')}) + var.put(u'replaceSupers', var.get(u'_babelHelperReplaceSupers2').get(u'default').create(PyJs_Object_1068_)) + var.get(u'replaceSupers').callprop(u'replace') + PyJsHoisted_Property_.func_name = u'Property' + var.put(u'Property', PyJsHoisted_Property_) + var.put(u't', var.get(u'_ref').get(u'types')) + pass + var.put(u'CONTAINS_SUPER', PyJsComma(Js(0.0),var.get(u'_symbol2').get(u'default'))()) + @Js + def PyJs_Super_1071_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Super':PyJs_Super_1071_, u'arguments':arguments}, var) + var.registers([u'path', u'parentObj']) + @Js + def PyJs_anonymous_1072_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u'path').callprop(u'isObjectExpression') + PyJs_anonymous_1072_._set_name(u'anonymous') + var.put(u'parentObj', var.get(u'path').callprop(u'findParent', PyJs_anonymous_1072_)) + if var.get(u'parentObj'): + var.get(u'parentObj').get(u'node').put(var.get(u'CONTAINS_SUPER'), var.get(u'true')) + PyJs_Super_1071_._set_name(u'Super') + @Js + def PyJs_exit_1074_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_1074_, u'arguments':arguments, u'file':file}, var) + var.registers([u'getObjectRef', u'objectRef', u'_isArray', u'_iterator', u'file', u'propPath', u'_ref2', u'propPaths', u'_i', u'path']) + if var.get(u'path').get(u'node').get(var.get(u'CONTAINS_SUPER')).neg(): + return var.get('undefined') + var.put(u'objectRef', PyJsComma(Js(0.0), Js(None))) + @Js + def PyJs_getObjectRef_1075_(this, arguments, var=var): + var = Scope({u'this':this, u'getObjectRef':PyJs_getObjectRef_1075_, u'arguments':arguments}, var) + var.registers([]) + return var.put(u'objectRef', (var.get(u'objectRef') or var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'obj')))) + PyJs_getObjectRef_1075_._set_name(u'getObjectRef') + var.put(u'getObjectRef', PyJs_getObjectRef_1075_) + var.put(u'propPaths', var.get(u'path').callprop(u'get', Js(u'properties'))) + #for JS loop + var.put(u'_iterator', var.get(u'propPaths')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'propPath', var.get(u'_ref2')) + if var.get(u'propPath').callprop(u'isObjectProperty'): + var.put(u'propPath', var.get(u'propPath').callprop(u'get', Js(u'value'))) + var.get(u'Property')(var.get(u'propPath'), var.get(u'propPath').get(u'node'), var.get(u'path').get(u'scope'), var.get(u'getObjectRef'), var.get(u'file')) + + if var.get(u'objectRef'): + PyJs_Object_1076_ = Js({u'id':var.get(u'objectRef')}) + var.get(u'path').get(u'scope').callprop(u'push', PyJs_Object_1076_) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'objectRef'), var.get(u'path').get(u'node'))) + PyJs_exit_1074_._set_name(u'exit') + PyJs_Object_1073_ = Js({u'exit':PyJs_exit_1074_}) + PyJs_Object_1070_ = Js({u'Super':PyJs_Super_1071_,u'ObjectExpression':PyJs_Object_1073_}) + PyJs_Object_1069_ = Js({u'visitor':PyJs_Object_1070_}) + return PyJs_Object_1069_ + PyJs_anonymous_1067_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1067_) + var.put(u'_babelHelperReplaceSupers', var.get(u'require')(Js(u'babel-helper-replace-supers'))) + var.put(u'_babelHelperReplaceSupers2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperReplaceSupers'))) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1066_._set_name(u'anonymous') +PyJs_Object_1078_ = Js({u'babel-helper-replace-supers':Js(54.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/symbol':Js(105.0)}) +@Js +def PyJs_anonymous_1079_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_babelHelperCallDelegate', u'module', u'require', u'_babelHelperCallDelegate2', u'exports', u'_interopRequireWildcard', u'visitor', u'_babelHelperGetFunctionArity', u'_babelTypes', u'_babelHelperGetFunctionArity2', u'iifeVisitor', u'_babelTemplate', u'isSafeBinding', u'_babelTemplate2', u't', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'buildCutOff', u'hasDefaults', u'buildDefaultParam']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1081_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1081_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_isSafeBinding_(scope, node, this, arguments, var=var): + var = Scope({u'node':node, u'scope':scope, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'scope', u'kind', u'_scope$getOwnBinding']) + if var.get(u'scope').callprop(u'hasOwnBinding', var.get(u'node').get(u'name')).neg(): + return var.get(u'true') + var.put(u'_scope$getOwnBinding', var.get(u'scope').callprop(u'getOwnBinding', var.get(u'node').get(u'name'))) + var.put(u'kind', var.get(u'_scope$getOwnBinding').get(u'kind')) + return (PyJsStrictEq(var.get(u'kind'),Js(u'param')) or PyJsStrictEq(var.get(u'kind'),Js(u'local'))) + PyJsHoisted_isSafeBinding_.func_name = u'isSafeBinding' + var.put(u'isSafeBinding', PyJsHoisted_isSafeBinding_) + @Js + def PyJsHoisted_hasDefaults_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'param', u'_i', u'_ref']) + #for JS loop + var.put(u'_iterator', var.get(u'node').get(u'params')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'param', var.get(u'_ref')) + if var.get(u't').callprop(u'isIdentifier', var.get(u'param')).neg(): + return var.get(u'true') + + return Js(False) + PyJsHoisted_hasDefaults_.func_name = u'hasDefaults' + var.put(u'hasDefaults', PyJsHoisted_hasDefaults_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1080_ = Js({}) + var.put(u'newObj', PyJs_Object_1080_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'visitor', var.get(u'undefined')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_babelHelperGetFunctionArity', var.get(u'require')(Js(u'babel-helper-get-function-arity'))) + var.put(u'_babelHelperGetFunctionArity2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperGetFunctionArity'))) + var.put(u'_babelHelperCallDelegate', var.get(u'require')(Js(u'babel-helper-call-delegate'))) + var.put(u'_babelHelperCallDelegate2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperCallDelegate'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'buildDefaultParam', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n let VARIABLE_NAME =\n ARGUMENTS.length > ARGUMENT_KEY && ARGUMENTS[ARGUMENT_KEY] !== undefined ?\n ARGUMENTS[ARGUMENT_KEY]\n :\n DEFAULT_VALUE;\n'))) + var.put(u'buildCutOff', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n let $0 = $1[$2];\n'))) + pass + pass + @Js + def PyJs_ReferencedIdentifier_1083_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1083_, u'arguments':arguments}, var) + var.registers([u'node', u'scope', u'state', u'path']) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'node', var.get(u'path').get(u'node')) + if (PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'eval')) or var.get(u'isSafeBinding')(var.get(u'scope'), var.get(u'node')).neg()): + var.get(u'state').put(u'iife', var.get(u'true')) + var.get(u'path').callprop(u'stop') + PyJs_ReferencedIdentifier_1083_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_Scope_1084_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'Scope':PyJs_Scope_1084_}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_Scope_1084_._set_name(u'Scope') + PyJs_Object_1082_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1083_,u'Scope':PyJs_Scope_1084_}) + var.put(u'iifeVisitor', PyJs_Object_1082_) + @Js + def PyJs_Function_1086_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_1086_, u'arguments':arguments}, var) + var.registers([u'node', u'body', u'pushDefNode', u'right', u'lastNonDefaultParam', u'i', u'argsIdentifier', u'_i2', u'param', u'_param', u'state', u'declar', u'params', u'path', u'scope', u'placeholder', u'left']) + @Js + def PyJsHoisted_pushDefNode_(left, right, i, this, arguments, var=var): + var = Scope({u'i':i, u'this':this, u'right':right, u'arguments':arguments, u'left':left}, var) + var.registers([u'i', u'defNode', u'right', u'left']) + PyJs_Object_1088_ = Js({u'VARIABLE_NAME':var.get(u'left'),u'DEFAULT_VALUE':var.get(u'right'),u'ARGUMENT_KEY':var.get(u't').callprop(u'numericLiteral', var.get(u'i')),u'ARGUMENTS':var.get(u'argsIdentifier')}) + var.put(u'defNode', var.get(u'buildDefaultParam')(PyJs_Object_1088_)) + var.get(u'defNode').put(u'_blockHoist', (var.get(u'node').get(u'params').get(u'length')-var.get(u'i'))) + var.get(u'body').callprop(u'push', var.get(u'defNode')) + PyJsHoisted_pushDefNode_.func_name = u'pushDefNode' + var.put(u'pushDefNode', PyJsHoisted_pushDefNode_) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + if var.get(u'hasDefaults')(var.get(u'node')).neg(): + return var.get('undefined') + var.get(u'path').callprop(u'ensureBlock') + PyJs_Object_1087_ = Js({u'iife':Js(False),u'scope':var.get(u'scope')}) + var.put(u'state', PyJs_Object_1087_) + var.put(u'body', Js([])) + var.put(u'argsIdentifier', var.get(u't').callprop(u'identifier', Js(u'arguments'))) + var.get(u'argsIdentifier').put(u'_shadowedFunctionLiteral', var.get(u'path')) + pass + var.put(u'lastNonDefaultParam', PyJsComma(Js(0.0),var.get(u'_babelHelperGetFunctionArity2').get(u'default'))(var.get(u'node'))) + var.put(u'params', var.get(u'path').callprop(u'get', Js(u'params'))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'params').get(u'length')): + try: + var.put(u'param', var.get(u'params').get(var.get(u'i'))) + if var.get(u'param').callprop(u'isAssignmentPattern').neg(): + if (var.get(u'state').get(u'iife').neg() and var.get(u'param').callprop(u'isIdentifier').neg()): + var.get(u'param').callprop(u'traverse', var.get(u'iifeVisitor'), var.get(u'state')) + continue + var.put(u'left', var.get(u'param').callprop(u'get', Js(u'left'))) + var.put(u'right', var.get(u'param').callprop(u'get', Js(u'right'))) + if ((var.get(u'i')>=var.get(u'lastNonDefaultParam')) or var.get(u'left').callprop(u'isPattern')): + var.put(u'placeholder', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'x'))) + var.get(u'placeholder').put(u'_isDefaultPlaceholder', var.get(u'true')) + var.get(u'node').get(u'params').put(var.get(u'i'), var.get(u'placeholder')) + else: + var.get(u'node').get(u'params').put(var.get(u'i'), var.get(u'left').get(u'node')) + if var.get(u'state').get(u'iife').neg(): + if (var.get(u'right').callprop(u'isIdentifier') and var.get(u'isSafeBinding')(var.get(u'scope'), var.get(u'right').get(u'node')).neg()): + var.get(u'state').put(u'iife', var.get(u'true')) + else: + var.get(u'right').callprop(u'traverse', var.get(u'iifeVisitor'), var.get(u'state')) + var.get(u'pushDefNode')(var.get(u'left').get(u'node'), var.get(u'right').get(u'node'), var.get(u'i')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + #for JS loop + var.put(u'_i2', (var.get(u'lastNonDefaultParam')+Js(1.0))) + while (var.get(u'_i2')<var.get(u'node').get(u'params').get(u'length')): + try: + var.put(u'_param', var.get(u'node').get(u'params').get(var.get(u'_i2'))) + if var.get(u'_param').get(u'_isDefaultPlaceholder'): + continue + var.put(u'declar', var.get(u'buildCutOff')(var.get(u'_param'), var.get(u'argsIdentifier'), var.get(u't').callprop(u'numericLiteral', var.get(u'_i2')))) + var.get(u'declar').put(u'_blockHoist', (var.get(u'node').get(u'params').get(u'length')-var.get(u'_i2'))) + var.get(u'body').callprop(u'push', var.get(u'declar')) + finally: + (var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)) + var.get(u'node').put(u'params', var.get(u'node').get(u'params').callprop(u'slice', Js(0.0), var.get(u'lastNonDefaultParam'))) + if var.get(u'state').get(u'iife'): + var.get(u'body').callprop(u'push', PyJsComma(Js(0.0),var.get(u'_babelHelperCallDelegate2').get(u'default'))(var.get(u'path'), var.get(u'scope'))) + var.get(u'path').callprop(u'set', Js(u'body'), var.get(u't').callprop(u'blockStatement', var.get(u'body'))) + else: + var.get(u'path').callprop(u'get', Js(u'body')).callprop(u'unshiftContainer', Js(u'body'), var.get(u'body')) + PyJs_Function_1086_._set_name(u'Function') + PyJs_Object_1085_ = Js({u'Function':PyJs_Function_1086_}) + var.put(u'visitor', var.get(u'exports').put(u'visitor', PyJs_Object_1085_)) +PyJs_anonymous_1079_._set_name(u'anonymous') +PyJs_Object_1089_ = Js({u'babel-helper-call-delegate':Js(47.0),u'babel-helper-get-function-arity':Js(50.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-template':Js(221.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1090_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'visitor', u'require', u'_babelTypes', u'module', u't']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1091_ = Js({}) + var.put(u'newObj', PyJs_Object_1091_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'visitor', var.get(u'undefined')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + @Js + def PyJs_Function_1093_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_1093_, u'arguments':arguments}, var) + var.registers([u'uid', u'i', u'param', u'outputParamsLength', u'params', u'path', u'hoistTweak', u'declar']) + var.put(u'params', var.get(u'path').callprop(u'get', Js(u'params'))) + var.put(u'hoistTweak', (Js(1.0) if var.get(u't').callprop(u'isRestElement', var.get(u'params').get((var.get(u'params').get(u'length')-Js(1.0)))) else Js(0.0))) + var.put(u'outputParamsLength', (var.get(u'params').get(u'length')-var.get(u'hoistTweak'))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'outputParamsLength')): + try: + var.put(u'param', var.get(u'params').get(var.get(u'i'))) + if (var.get(u'param').callprop(u'isArrayPattern') or var.get(u'param').callprop(u'isObjectPattern')): + var.put(u'uid', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref'))) + var.put(u'declar', var.get(u't').callprop(u'variableDeclaration', Js(u'let'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'param').get(u'node'), var.get(u'uid'))]))) + var.get(u'declar').put(u'_blockHoist', (var.get(u'outputParamsLength')-var.get(u'i'))) + var.get(u'path').callprop(u'ensureBlock') + var.get(u'path').callprop(u'get', Js(u'body')).callprop(u'unshiftContainer', Js(u'body'), var.get(u'declar')) + var.get(u'param').callprop(u'replaceWith', var.get(u'uid')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJs_Function_1093_._set_name(u'Function') + PyJs_Object_1092_ = Js({u'Function':PyJs_Function_1093_}) + var.put(u'visitor', var.get(u'exports').put(u'visitor', PyJs_Object_1092_)) +PyJs_anonymous_1090_._set_name(u'anonymous') +PyJs_Object_1094_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1095_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'destructuring', u'_interopRequireWildcard', u'_default', u'require', u'rest', u'_rest', u'_destructuring', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_babelTraverse', u'def']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1101_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1101_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1100_ = Js({}) + var.put(u'newObj', PyJs_Object_1100_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_1096_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_ArrowFunctionExpression_1099_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'ArrowFunctionExpression':PyJs_ArrowFunctionExpression_1099_}, var) + var.registers([u'_isArray', u'_iterator', u'param', u'params', u'_i', u'path', u'_ref']) + var.put(u'params', var.get(u'path').callprop(u'get', Js(u'params'))) + #for JS loop + var.put(u'_iterator', var.get(u'params')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'param', var.get(u'_ref')) + if (var.get(u'param').callprop(u'isRestElement') or var.get(u'param').callprop(u'isAssignmentPattern')): + var.get(u'path').callprop(u'arrowFunctionToShadowed') + break + + PyJs_ArrowFunctionExpression_1099_._set_name(u'ArrowFunctionExpression') + PyJs_Object_1098_ = Js({u'ArrowFunctionExpression':PyJs_ArrowFunctionExpression_1099_}) + PyJs_Object_1097_ = Js({u'visitor':var.get(u'_babelTraverse').get(u'visitors').callprop(u'merge', Js([PyJs_Object_1098_, var.get(u'destructuring').get(u'visitor'), var.get(u'rest').get(u'visitor'), var.get(u'def').get(u'visitor')]))}) + return PyJs_Object_1097_ + PyJs_anonymous_1096_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1096_) + var.put(u'_babelTraverse', var.get(u'require')(Js(u'babel-traverse'))) + var.put(u'_destructuring', var.get(u'require')(Js(u'./destructuring'))) + var.put(u'destructuring', var.get(u'_interopRequireWildcard')(var.get(u'_destructuring'))) + var.put(u'_default', var.get(u'require')(Js(u'./default'))) + var.put(u'def', var.get(u'_interopRequireWildcard')(var.get(u'_default'))) + var.put(u'_rest', var.get(u'require')(Js(u'./rest'))) + var.put(u'rest', var.get(u'_interopRequireWildcard')(var.get(u'_rest'))) + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1095_._set_name(u'anonymous') +PyJs_Object_1102_ = Js({u'./default':Js(77.0),u'./destructuring':Js(78.0),u'./rest':Js(80.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-traverse':Js(225.0)}) +@Js +def PyJs_anonymous_1103_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'restIndexImpure', u'exports', u'optimiseLengthGetter', u'hasRest', u'_interopRequireWildcard', u'visitor', u'require', u'_babelTypes', u'_babelTemplate', u'module', u'restIndex', u'buildRest', u'_babelTemplate2', u't', u'_interopRequireDefault', u'restLength', u'_getIterator2', u'_getIterator3', u'optimiseIndexGetter', u'memberExpressionOptimisationVisitor']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1105_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1105_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_optimiseLengthGetter_(path, argsId, offset, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'argsId':argsId, u'offset':offset}, var) + var.registers([u'path', u'argsId', u'offset']) + if var.get(u'offset'): + PyJs_Object_1121_ = Js({u'ARGUMENTS':var.get(u'argsId'),u'OFFSET':var.get(u't').callprop(u'numericLiteral', var.get(u'offset'))}) + var.get(u'path').get(u'parentPath').callprop(u'replaceWith', var.get(u'restLength')(PyJs_Object_1121_)) + else: + var.get(u'path').callprop(u'replaceWith', var.get(u'argsId')) + PyJsHoisted_optimiseLengthGetter_.func_name = u'optimiseLengthGetter' + var.put(u'optimiseLengthGetter', PyJsHoisted_optimiseLengthGetter_) + @Js + def PyJsHoisted_optimiseIndexGetter_(path, argsId, offset, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'argsId':argsId, u'offset':offset}, var) + var.registers([u'index', u'temp', u'argsId', u'offset', u'path', u'scope']) + var.put(u'index', PyJsComma(Js(0.0), Js(None))) + if var.get(u't').callprop(u'isNumericLiteral', var.get(u'path').get(u'parent').get(u'property')): + var.put(u'index', var.get(u't').callprop(u'numericLiteral', (var.get(u'path').get(u'parent').get(u'property').get(u'value')+var.get(u'offset')))) + else: + if PyJsStrictEq(var.get(u'offset'),Js(0.0)): + var.put(u'index', var.get(u'path').get(u'parent').get(u'property')) + else: + var.put(u'index', var.get(u't').callprop(u'binaryExpression', Js(u'+'), var.get(u'path').get(u'parent').get(u'property'), var.get(u't').callprop(u'numericLiteral', var.get(u'offset')))) + var.put(u'scope', var.get(u'path').get(u'scope')) + if var.get(u'scope').callprop(u'isPure', var.get(u'index')).neg(): + var.put(u'temp', var.get(u'scope').callprop(u'generateUidIdentifierBasedOnNode', var.get(u'index'))) + PyJs_Object_1118_ = Js({u'id':var.get(u'temp'),u'kind':Js(u'var')}) + var.get(u'scope').callprop(u'push', PyJs_Object_1118_) + PyJs_Object_1119_ = Js({u'ARGUMENTS':var.get(u'argsId'),u'INDEX':var.get(u'index'),u'REF':var.get(u'temp')}) + var.get(u'path').get(u'parentPath').callprop(u'replaceWith', var.get(u'restIndexImpure')(PyJs_Object_1119_)) + else: + PyJs_Object_1120_ = Js({u'ARGUMENTS':var.get(u'argsId'),u'INDEX':var.get(u'index')}) + var.get(u'path').get(u'parentPath').callprop(u'replaceWith', var.get(u'restIndex')(PyJs_Object_1120_)) + PyJsHoisted_optimiseIndexGetter_.func_name = u'optimiseIndexGetter' + var.put(u'optimiseIndexGetter', PyJsHoisted_optimiseIndexGetter_) + @Js + def PyJsHoisted_hasRest_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return var.get(u't').callprop(u'isRestElement', var.get(u'node').get(u'params').get((var.get(u'node').get(u'params').get(u'length')-Js(1.0)))) + PyJsHoisted_hasRest_.func_name = u'hasRest' + var.put(u'hasRest', PyJsHoisted_hasRest_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1104_ = Js({}) + var.put(u'newObj', PyJs_Object_1104_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'visitor', var.get(u'undefined')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'buildRest', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n for (var LEN = ARGUMENTS.length,\n ARRAY = Array(ARRAY_LEN),\n KEY = START;\n KEY < LEN;\n KEY++) {\n ARRAY[ARRAY_KEY] = ARGUMENTS[KEY];\n }\n'))) + var.put(u'restIndex', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n ARGUMENTS.length <= INDEX ? undefined : ARGUMENTS[INDEX]\n'))) + var.put(u'restIndexImpure', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n REF = INDEX, ARGUMENTS.length <= REF ? undefined : ARGUMENTS[REF]\n'))) + var.put(u'restLength', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n ARGUMENTS.length <= OFFSET ? 0 : ARGUMENTS.length - OFFSET\n'))) + @Js + def PyJs_Scope_1107_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'Scope':PyJs_Scope_1107_}, var) + var.registers([u'path', u'state']) + if var.get(u'path').get(u'scope').callprop(u'bindingIdentifierEquals', var.get(u'state').get(u'name'), var.get(u'state').get(u'outerBinding')).neg(): + var.get(u'path').callprop(u'skip') + PyJs_Scope_1107_._set_name(u'Scope') + @Js + def PyJs_Flow_1108_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Flow':PyJs_Flow_1108_, u'arguments':arguments}, var) + var.registers([u'path']) + if var.get(u'path').callprop(u'isTypeCastExpression'): + return var.get('undefined') + var.get(u'path').callprop(u'skip') + PyJs_Flow_1108_._set_name(u'Flow') + @Js + def PyJs_FunctionClassProperty_1109_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'FunctionClassProperty':PyJs_FunctionClassProperty_1109_}, var) + var.registers([u'oldNoOptimise', u'state', u'path']) + var.put(u'oldNoOptimise', var.get(u'state').get(u'noOptimise')) + var.get(u'state').put(u'noOptimise', var.get(u'true')) + var.get(u'path').callprop(u'traverse', var.get(u'memberExpressionOptimisationVisitor'), var.get(u'state')) + var.get(u'state').put(u'noOptimise', var.get(u'oldNoOptimise')) + var.get(u'path').callprop(u'skip') + PyJs_FunctionClassProperty_1109_._set_name(u'FunctionClassProperty') + @Js + def PyJs_ReferencedIdentifier_1110_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1110_, u'arguments':arguments}, var) + var.registers([u'node', u'grandparentPath', u'argsOptEligible', u'state', u'call', u'parentPath', u'path']) + var.put(u'node', var.get(u'path').get(u'node')) + if PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'arguments')): + var.get(u'state').put(u'deopted', var.get(u'true')) + if PyJsStrictNeq(var.get(u'node').get(u'name'),var.get(u'state').get(u'name')): + return var.get('undefined') + if var.get(u'state').get(u'noOptimise'): + var.get(u'state').put(u'deopted', var.get(u'true')) + else: + var.put(u'parentPath', var.get(u'path').get(u'parentPath')) + PyJs_Object_1111_ = Js({u'object':var.get(u'node')}) + if var.get(u'parentPath').callprop(u'isMemberExpression', PyJs_Object_1111_): + var.put(u'grandparentPath', var.get(u'parentPath').get(u'parentPath')) + def PyJs_LONG_1113_(var=var): + PyJs_Object_1112_ = Js({u'operator':Js(u'delete')}) + return (((((var.get(u'grandparentPath').callprop(u'isAssignmentExpression') and PyJsStrictEq(var.get(u'parentPath').get(u'node'),var.get(u'grandparentPath').get(u'node').get(u'left'))) or var.get(u'grandparentPath').callprop(u'isLVal')) or var.get(u'grandparentPath').callprop(u'isForXStatement')) or var.get(u'grandparentPath').callprop(u'isUpdateExpression')) or var.get(u'grandparentPath').callprop(u'isUnaryExpression', PyJs_Object_1112_)) + var.put(u'argsOptEligible', (var.get(u'state').get(u'deopted').neg() and (PyJs_LONG_1113_() or ((var.get(u'grandparentPath').callprop(u'isCallExpression') or var.get(u'grandparentPath').callprop(u'isNewExpression')) and PyJsStrictEq(var.get(u'parentPath').get(u'node'),var.get(u'grandparentPath').get(u'node').get(u'callee')))).neg())) + if var.get(u'argsOptEligible'): + if var.get(u'parentPath').get(u'node').get(u'computed'): + if var.get(u'parentPath').callprop(u'get', Js(u'property')).callprop(u'isBaseType', Js(u'number')): + PyJs_Object_1114_ = Js({u'cause':Js(u'indexGetter'),u'path':var.get(u'path')}) + var.get(u'state').get(u'candidates').callprop(u'push', PyJs_Object_1114_) + return var.get('undefined') + else: + if PyJsStrictEq(var.get(u'parentPath').get(u'node').get(u'property').get(u'name'),Js(u'length')): + PyJs_Object_1115_ = Js({u'cause':Js(u'lengthGetter'),u'path':var.get(u'path')}) + var.get(u'state').get(u'candidates').callprop(u'push', PyJs_Object_1115_) + return var.get('undefined') + if (PyJsStrictEq(var.get(u'state').get(u'offset'),Js(0.0)) and var.get(u'parentPath').callprop(u'isSpreadElement')): + var.put(u'call', var.get(u'parentPath').get(u'parentPath')) + if (var.get(u'call').callprop(u'isCallExpression') and PyJsStrictEq(var.get(u'call').get(u'node').get(u'arguments').get(u'length'),Js(1.0))): + PyJs_Object_1116_ = Js({u'cause':Js(u'argSpread'),u'path':var.get(u'path')}) + var.get(u'state').get(u'candidates').callprop(u'push', PyJs_Object_1116_) + return var.get('undefined') + var.get(u'state').get(u'references').callprop(u'push', var.get(u'path')) + PyJs_ReferencedIdentifier_1110_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_BindingIdentifier_1117_(_ref, state, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'BindingIdentifier':PyJs_BindingIdentifier_1117_, u'state':state, u'arguments':arguments}, var) + var.registers([u'node', u'_ref', u'state']) + var.put(u'node', var.get(u'_ref').get(u'node')) + if PyJsStrictEq(var.get(u'node').get(u'name'),var.get(u'state').get(u'name')): + var.get(u'state').put(u'deopted', var.get(u'true')) + PyJs_BindingIdentifier_1117_._set_name(u'BindingIdentifier') + PyJs_Object_1106_ = Js({u'Scope':PyJs_Scope_1107_,u'Flow':PyJs_Flow_1108_,u'Function|ClassProperty':PyJs_FunctionClassProperty_1109_,u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1110_,u'BindingIdentifier':PyJs_BindingIdentifier_1117_}) + var.put(u'memberExpressionOptimisationVisitor', PyJs_Object_1106_) + pass + pass + pass + @Js + def PyJs_Function_1123_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_1123_, u'arguments':arguments}, var) + var.registers([u'node', u'arrLen', u'_isArray', u'_iterator', u'key', u'arrKey', u'_ref3', u'_ref2', u'argsId', u'len', u'start', u'state', u'rest', u'_i', u'target', u'scope', u'path', u'cause', u'loop', u'_path']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + if var.get(u'hasRest')(var.get(u'node')).neg(): + return var.get('undefined') + var.put(u'rest', var.get(u'node').get(u'params').callprop(u'pop').get(u'argument')) + var.put(u'argsId', var.get(u't').callprop(u'identifier', Js(u'arguments'))) + var.get(u'argsId').put(u'_shadowedFunctionLiteral', var.get(u'path')) + PyJs_Object_1124_ = Js({u'references':Js([]),u'offset':var.get(u'node').get(u'params').get(u'length'),u'argumentsNode':var.get(u'argsId'),u'outerBinding':var.get(u'scope').callprop(u'getBindingIdentifier', var.get(u'rest').get(u'name')),u'candidates':Js([]),u'name':var.get(u'rest').get(u'name'),u'deopted':Js(False)}) + var.put(u'state', PyJs_Object_1124_) + var.get(u'path').callprop(u'traverse', var.get(u'memberExpressionOptimisationVisitor'), var.get(u'state')) + if (var.get(u'state').get(u'deopted').neg() and var.get(u'state').get(u'references').get(u'length').neg()): + #for JS loop + var.put(u'_iterator', var.get(u'state').get(u'candidates')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'_ref3', var.get(u'_ref2')) + var.put(u'_path', var.get(u'_ref3').get(u'path')) + var.put(u'cause', var.get(u'_ref3').get(u'cause')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'cause')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'indexGetter')): + SWITCHED = True + var.get(u'optimiseIndexGetter')(var.get(u'_path'), var.get(u'argsId'), var.get(u'state').get(u'offset')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'lengthGetter')): + SWITCHED = True + var.get(u'optimiseLengthGetter')(var.get(u'_path'), var.get(u'argsId'), var.get(u'state').get(u'offset')) + break + if True: + SWITCHED = True + var.get(u'_path').callprop(u'replaceWith', var.get(u'argsId')) + SWITCHED = True + break + + return var.get('undefined') + @Js + def PyJs_anonymous_1125_(_ref4, this, arguments, var=var): + var = Scope({u'this':this, u'_ref4':_ref4, u'arguments':arguments}, var) + var.registers([u'path', u'_ref4']) + var.put(u'path', var.get(u'_ref4').get(u'path')) + return var.get(u'path') + PyJs_anonymous_1125_._set_name(u'anonymous') + var.get(u'state').put(u'references', var.get(u'state').get(u'references').callprop(u'concat', var.get(u'state').get(u'candidates').callprop(u'map', PyJs_anonymous_1125_))) + var.get(u'state').put(u'deopted', (var.get(u'state').get(u'deopted') or var.get(u'node').get(u'shadow').neg().neg())) + var.put(u'start', var.get(u't').callprop(u'numericLiteral', var.get(u'node').get(u'params').get(u'length'))) + var.put(u'key', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'key'))) + var.put(u'len', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'len'))) + var.put(u'arrKey', var.get(u'key')) + var.put(u'arrLen', var.get(u'len')) + if var.get(u'node').get(u'params').get(u'length'): + var.put(u'arrKey', var.get(u't').callprop(u'binaryExpression', Js(u'-'), var.get(u'key'), var.get(u'start'))) + var.put(u'arrLen', var.get(u't').callprop(u'conditionalExpression', var.get(u't').callprop(u'binaryExpression', Js(u'>'), var.get(u'len'), var.get(u'start')), var.get(u't').callprop(u'binaryExpression', Js(u'-'), var.get(u'len'), var.get(u'start')), var.get(u't').callprop(u'numericLiteral', Js(0.0)))) + PyJs_Object_1126_ = Js({u'ARGUMENTS':var.get(u'argsId'),u'ARRAY_KEY':var.get(u'arrKey'),u'ARRAY_LEN':var.get(u'arrLen'),u'START':var.get(u'start'),u'ARRAY':var.get(u'rest'),u'KEY':var.get(u'key'),u'LEN':var.get(u'len')}) + var.put(u'loop', var.get(u'buildRest')(PyJs_Object_1126_)) + if var.get(u'state').get(u'deopted'): + var.get(u'loop').put(u'_blockHoist', (var.get(u'node').get(u'params').get(u'length')+Js(1.0))) + var.get(u'node').get(u'body').get(u'body').callprop(u'unshift', var.get(u'loop')) + else: + var.get(u'loop').put(u'_blockHoist', Js(1.0)) + var.put(u'target', var.get(u'path').callprop(u'getEarliestCommonAncestorFrom', var.get(u'state').get(u'references')).callprop(u'getStatementParent')) + @Js + def PyJs_anonymous_1127_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + if var.get(u'path').callprop(u'isLoop'): + var.put(u'target', var.get(u'path')) + else: + return var.get(u'path').callprop(u'isFunction') + PyJs_anonymous_1127_._set_name(u'anonymous') + var.get(u'target').callprop(u'findParent', PyJs_anonymous_1127_) + var.get(u'target').callprop(u'insertBefore', var.get(u'loop')) + PyJs_Function_1123_._set_name(u'Function') + PyJs_Object_1122_ = Js({u'Function':PyJs_Function_1123_}) + var.put(u'visitor', var.get(u'exports').put(u'visitor', PyJs_Object_1122_)) +PyJs_anonymous_1103_._set_name(u'anonymous') +PyJs_Object_1128_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-template':Js(221.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1129_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'require', u'_babelTypes', u'module', u't']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1135_ = Js({}) + var.put(u'newObj', PyJs_Object_1135_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_1130_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_ObjectMethod_1133_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'ObjectMethod':PyJs_ObjectMethod_1133_}, var) + var.registers([u'node', u'path', u'func']) + var.put(u'node', var.get(u'path').get(u'node')) + if PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'method')): + var.put(u'func', var.get(u't').callprop(u'functionExpression', var.get(u"null"), var.get(u'node').get(u'params'), var.get(u'node').get(u'body'), var.get(u'node').get(u'generator'), var.get(u'node').get(u'async'))) + var.get(u'func').put(u'returnType', var.get(u'node').get(u'returnType')) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'objectProperty', var.get(u'node').get(u'key'), var.get(u'func'), var.get(u'node').get(u'computed'))) + PyJs_ObjectMethod_1133_._set_name(u'ObjectMethod') + @Js + def PyJs_ObjectProperty_1134_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'ObjectProperty':PyJs_ObjectProperty_1134_, u'arguments':arguments}, var) + var.registers([u'node', u'_ref']) + var.put(u'node', var.get(u'_ref').get(u'node')) + if var.get(u'node').get(u'shorthand'): + var.get(u'node').put(u'shorthand', Js(False)) + PyJs_ObjectProperty_1134_._set_name(u'ObjectProperty') + PyJs_Object_1132_ = Js({u'ObjectMethod':PyJs_ObjectMethod_1133_,u'ObjectProperty':PyJs_ObjectProperty_1134_}) + PyJs_Object_1131_ = Js({u'visitor':PyJs_Object_1132_}) + return PyJs_Object_1131_ + PyJs_anonymous_1130_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1130_) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1129_._set_name(u'anonymous') +PyJs_Object_1136_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1137_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1146_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1146_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_1138_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u'hasSpread', u't', u'getSpreadLiteral', u'build']) + @Js + def PyJsHoisted_hasSpread_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'i', u'nodes']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'nodes').get(u'length')): + try: + if var.get(u't').callprop(u'isSpreadElement', var.get(u'nodes').get(var.get(u'i'))): + return var.get(u'true') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return Js(False) + PyJsHoisted_hasSpread_.func_name = u'hasSpread' + var.put(u'hasSpread', PyJsHoisted_hasSpread_) + @Js + def PyJsHoisted_build_(props, scope, state, this, arguments, var=var): + var = Scope({u'this':this, u'scope':scope, u'state':state, u'arguments':arguments, u'props':props}, var) + var.registers([u'_isArray', u'_iterator', u'_ref2', u'prop', u'state', u'_props', u'_i', u'props', u'push', u'scope', u'nodes']) + @Js + def PyJsHoisted_push_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u'_props').get(u'length').neg(): + return var.get('undefined') + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'arrayExpression', var.get(u'_props'))) + var.put(u'_props', Js([])) + PyJsHoisted_push_.func_name = u'push' + var.put(u'push', PyJsHoisted_push_) + var.put(u'nodes', Js([])) + var.put(u'_props', Js([])) + pass + #for JS loop + var.put(u'_iterator', var.get(u'props')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'prop', var.get(u'_ref2')) + if var.get(u't').callprop(u'isSpreadElement', var.get(u'prop')): + var.get(u'push')() + var.get(u'nodes').callprop(u'push', var.get(u'getSpreadLiteral')(var.get(u'prop'), var.get(u'scope'), var.get(u'state'))) + else: + var.get(u'_props').callprop(u'push', var.get(u'prop')) + + var.get(u'push')() + return var.get(u'nodes') + PyJsHoisted_build_.func_name = u'build' + var.put(u'build', PyJsHoisted_build_) + @Js + def PyJsHoisted_getSpreadLiteral_(spread, scope, state, this, arguments, var=var): + var = Scope({u'this':this, u'scope':scope, u'state':state, u'spread':spread, u'arguments':arguments}, var) + var.registers([u'scope', u'state', u'spread']) + PyJs_Object_1139_ = Js({u'name':Js(u'arguments')}) + if (var.get(u'state').get(u'opts').get(u'loose') and var.get(u't').callprop(u'isIdentifier', var.get(u'spread').get(u'argument'), PyJs_Object_1139_).neg()): + return var.get(u'spread').get(u'argument') + else: + return var.get(u'scope').callprop(u'toArray', var.get(u'spread').get(u'argument'), var.get(u'true')) + PyJsHoisted_getSpreadLiteral_.func_name = u'getSpreadLiteral' + var.put(u'getSpreadLiteral', PyJsHoisted_getSpreadLiteral_) + var.put(u't', var.get(u'_ref').get(u'types')) + pass + pass + pass + @Js + def PyJs_ArrayExpression_1142_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'ArrayExpression':PyJs_ArrayExpression_1142_}, var) + var.registers([u'node', u'elements', u'state', u'path', u'scope', u'nodes', u'first']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'elements', var.get(u'node').get(u'elements')) + if var.get(u'hasSpread')(var.get(u'elements')).neg(): + return var.get('undefined') + var.put(u'nodes', var.get(u'build')(var.get(u'elements'), var.get(u'scope'), var.get(u'state'))) + var.put(u'first', var.get(u'nodes').callprop(u'shift')) + if var.get(u't').callprop(u'isArrayExpression', var.get(u'first')).neg(): + var.get(u'nodes').callprop(u'unshift', var.get(u'first')) + var.put(u'first', var.get(u't').callprop(u'arrayExpression', Js([]))) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u'first'), var.get(u't').callprop(u'identifier', Js(u'concat'))), var.get(u'nodes'))) + PyJs_ArrayExpression_1142_._set_name(u'ArrayExpression') + @Js + def PyJs_CallExpression_1143_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'CallExpression':PyJs_CallExpression_1143_}, var) + var.registers([u'node', u'temp', u'contextLiteral', u'args', u'calleePath', u'state', u'path', u'scope', u'nodes', u'callee', u'first']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'args', var.get(u'node').get(u'arguments')) + if var.get(u'hasSpread')(var.get(u'args')).neg(): + return var.get('undefined') + var.put(u'calleePath', var.get(u'path').callprop(u'get', Js(u'callee'))) + if var.get(u'calleePath').callprop(u'isSuper'): + return var.get('undefined') + var.put(u'contextLiteral', var.get(u't').callprop(u'identifier', Js(u'undefined'))) + var.get(u'node').put(u'arguments', Js([])) + var.put(u'nodes', PyJsComma(Js(0.0), Js(None))) + if (PyJsStrictEq(var.get(u'args').get(u'length'),Js(1.0)) and PyJsStrictEq(var.get(u'args').get(u'0').get(u'argument').get(u'name'),Js(u'arguments'))): + var.put(u'nodes', Js([var.get(u'args').get(u'0').get(u'argument')])) + else: + var.put(u'nodes', var.get(u'build')(var.get(u'args'), var.get(u'scope'), var.get(u'state'))) + var.put(u'first', var.get(u'nodes').callprop(u'shift')) + if var.get(u'nodes').get(u'length'): + var.get(u'node').get(u'arguments').callprop(u'push', var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u'first'), var.get(u't').callprop(u'identifier', Js(u'concat'))), var.get(u'nodes'))) + else: + var.get(u'node').get(u'arguments').callprop(u'push', var.get(u'first')) + var.put(u'callee', var.get(u'node').get(u'callee')) + if var.get(u'calleePath').callprop(u'isMemberExpression'): + var.put(u'temp', var.get(u'scope').callprop(u'maybeGenerateMemoised', var.get(u'callee').get(u'object'))) + if var.get(u'temp'): + var.get(u'callee').put(u'object', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'temp'), var.get(u'callee').get(u'object'))) + var.put(u'contextLiteral', var.get(u'temp')) + else: + var.put(u'contextLiteral', var.get(u'callee').get(u'object')) + var.get(u't').callprop(u'appendToMemberExpression', var.get(u'callee'), var.get(u't').callprop(u'identifier', Js(u'apply'))) + else: + var.get(u'node').put(u'callee', var.get(u't').callprop(u'memberExpression', var.get(u'node').get(u'callee'), var.get(u't').callprop(u'identifier', Js(u'apply')))) + if var.get(u't').callprop(u'isSuper', var.get(u'contextLiteral')): + var.put(u'contextLiteral', var.get(u't').callprop(u'thisExpression')) + var.get(u'node').get(u'arguments').callprop(u'unshift', var.get(u'contextLiteral')) + PyJs_CallExpression_1143_._set_name(u'CallExpression') + @Js + def PyJs_NewExpression_1144_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'NewExpression':PyJs_NewExpression_1144_}, var) + var.registers([u'node', u'args', u'state', u'context', u'path', u'scope', u'nodes']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'args', var.get(u'node').get(u'arguments')) + if var.get(u'hasSpread')(var.get(u'args')).neg(): + return var.get('undefined') + var.put(u'nodes', var.get(u'build')(var.get(u'args'), var.get(u'scope'), var.get(u'state'))) + var.put(u'context', var.get(u't').callprop(u'arrayExpression', Js([var.get(u't').callprop(u'nullLiteral')]))) + var.put(u'args', var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u'context'), var.get(u't').callprop(u'identifier', Js(u'concat'))), var.get(u'nodes'))) + def PyJs_LONG_1145_(var=var): + return var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'Function')), var.get(u't').callprop(u'identifier', Js(u'prototype'))), var.get(u't').callprop(u'identifier', Js(u'bind'))), var.get(u't').callprop(u'identifier', Js(u'apply'))), Js([var.get(u'node').get(u'callee'), var.get(u'args')])) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'newExpression', PyJs_LONG_1145_(), Js([]))) + PyJs_NewExpression_1144_._set_name(u'NewExpression') + PyJs_Object_1141_ = Js({u'ArrayExpression':PyJs_ArrayExpression_1142_,u'CallExpression':PyJs_CallExpression_1143_,u'NewExpression':PyJs_NewExpression_1144_}) + PyJs_Object_1140_ = Js({u'visitor':PyJs_Object_1141_}) + return PyJs_Object_1140_ + PyJs_anonymous_1138_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1138_) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1137_._set_name(u'anonymous') +PyJs_Object_1147_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_1148_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'regex', u'exports', u'_babelHelperRegex', u'_interopRequireWildcard', u'require', u'_babelTypes', u'module', u't']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1153_ = Js({}) + var.put(u'newObj', PyJs_Object_1153_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_1149_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_RegExpLiteral_1152_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'RegExpLiteral':PyJs_RegExpLiteral_1152_}, var) + var.registers([u'node', u'path']) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'regex').callprop(u'is', var.get(u'node'), Js(u'y')).neg(): + return var.get('undefined') + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'newExpression', var.get(u't').callprop(u'identifier', Js(u'RegExp')), Js([var.get(u't').callprop(u'stringLiteral', var.get(u'node').get(u'pattern')), var.get(u't').callprop(u'stringLiteral', var.get(u'node').get(u'flags'))]))) + PyJs_RegExpLiteral_1152_._set_name(u'RegExpLiteral') + PyJs_Object_1151_ = Js({u'RegExpLiteral':PyJs_RegExpLiteral_1152_}) + PyJs_Object_1150_ = Js({u'visitor':PyJs_Object_1151_}) + return PyJs_Object_1150_ + PyJs_anonymous_1149_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1149_) + var.put(u'_babelHelperRegex', var.get(u'require')(Js(u'babel-helper-regex'))) + var.put(u'regex', var.get(u'_interopRequireWildcard')(var.get(u'_babelHelperRegex'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1148_._set_name(u'anonymous') +PyJs_Object_1154_ = Js({u'babel-helper-regex':Js(53.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1155_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1163_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1163_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_1156_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u'isString', u'buildBinaryExpression', u't']) + @Js + def PyJsHoisted_isString_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return (var.get(u't').callprop(u'isLiteral', var.get(u'node')) and PyJsStrictEq(var.get(u'node').get(u'value').typeof(),Js(u'string'))) + PyJsHoisted_isString_.func_name = u'isString' + var.put(u'isString', PyJsHoisted_isString_) + @Js + def PyJsHoisted_buildBinaryExpression_(left, right, this, arguments, var=var): + var = Scope({u'this':this, u'right':right, u'arguments':arguments, u'left':left}, var) + var.registers([u'right', u'left']) + return var.get(u't').callprop(u'binaryExpression', Js(u'+'), var.get(u'left'), var.get(u'right')) + PyJsHoisted_buildBinaryExpression_.func_name = u'buildBinaryExpression' + var.put(u'buildBinaryExpression', PyJsHoisted_buildBinaryExpression_) + var.put(u't', var.get(u'_ref').get(u'types')) + pass + pass + @Js + def PyJs_TaggedTemplateExpression_1159_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'TaggedTemplateExpression':PyJs_TaggedTemplateExpression_1159_, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'templateObject', u'templateName', u'args', u'_ref2', u'elem', u'raw', u'quasi', u'state', u'_i', u'path', u'strings']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'quasi', var.get(u'node').get(u'quasi')) + var.put(u'args', Js([])) + var.put(u'strings', Js([])) + var.put(u'raw', Js([])) + #for JS loop + var.put(u'_iterator', var.get(u'quasi').get(u'quasis')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'elem', var.get(u'_ref2')) + var.get(u'strings').callprop(u'push', var.get(u't').callprop(u'stringLiteral', var.get(u'elem').get(u'value').get(u'cooked'))) + var.get(u'raw').callprop(u'push', var.get(u't').callprop(u'stringLiteral', var.get(u'elem').get(u'value').get(u'raw'))) + + var.put(u'strings', var.get(u't').callprop(u'arrayExpression', var.get(u'strings'))) + var.put(u'raw', var.get(u't').callprop(u'arrayExpression', var.get(u'raw'))) + var.put(u'templateName', Js(u'taggedTemplateLiteral')) + if var.get(u'state').get(u'opts').get(u'loose'): + var.put(u'templateName', Js(u'Loose'), u'+') + var.put(u'templateObject', var.get(u'state').get(u'file').callprop(u'addTemplateObject', var.get(u'templateName'), var.get(u'strings'), var.get(u'raw'))) + var.get(u'args').callprop(u'push', var.get(u'templateObject')) + var.put(u'args', var.get(u'args').callprop(u'concat', var.get(u'quasi').get(u'expressions'))) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'callExpression', var.get(u'node').get(u'tag'), var.get(u'args'))) + PyJs_TaggedTemplateExpression_1159_._set_name(u'TaggedTemplateExpression') + @Js + def PyJs_TemplateLiteral_1160_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'TemplateLiteral':PyJs_TemplateLiteral_1160_, u'arguments':arguments}, var) + var.registers([u'node', u'_ref4', u'_isArray3', u'_isArray2', u'expr', u'_i3', u'_ref3', u'_i2', u'elem', u'state', u'path', u'nodes', u'root', u'expressions', u'_iterator3', u'_iterator2']) + var.put(u'nodes', Js([])) + var.put(u'expressions', var.get(u'path').callprop(u'get', Js(u'expressions'))) + #for JS loop + var.put(u'_iterator2', var.get(u'path').get(u'node').get(u'quasis')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i2').get(u'value')) + var.put(u'elem', var.get(u'_ref3')) + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'stringLiteral', var.get(u'elem').get(u'value').get(u'cooked'))) + var.put(u'expr', var.get(u'expressions').callprop(u'shift')) + if var.get(u'expr'): + if ((var.get(u'state').get(u'opts').get(u'spec') and var.get(u'expr').callprop(u'isBaseType', Js(u'string')).neg()) and var.get(u'expr').callprop(u'isBaseType', Js(u'number')).neg()): + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'identifier', Js(u'String')), Js([var.get(u'expr').get(u'node')]))) + else: + var.get(u'nodes').callprop(u'push', var.get(u'expr').get(u'node')) + + @Js + def PyJs_anonymous_1161_(n, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'n':n}, var) + var.registers([u'n']) + PyJs_Object_1162_ = Js({u'value':Js(u'')}) + return var.get(u't').callprop(u'isLiteral', var.get(u'n'), PyJs_Object_1162_).neg() + PyJs_anonymous_1161_._set_name(u'anonymous') + var.put(u'nodes', var.get(u'nodes').callprop(u'filter', PyJs_anonymous_1161_)) + if (var.get(u'isString')(var.get(u'nodes').get(u'0')).neg() and var.get(u'isString')(var.get(u'nodes').get(u'1')).neg()): + var.get(u'nodes').callprop(u'unshift', var.get(u't').callprop(u'stringLiteral', Js(u''))) + if (var.get(u'nodes').get(u'length')>Js(1.0)): + var.put(u'root', var.get(u'buildBinaryExpression')(var.get(u'nodes').callprop(u'shift'), var.get(u'nodes').callprop(u'shift'))) + #for JS loop + var.put(u'_iterator3', var.get(u'nodes')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i3').get(u'value')) + var.put(u'node', var.get(u'_ref4')) + var.put(u'root', var.get(u'buildBinaryExpression')(var.get(u'root'), var.get(u'node'))) + + var.get(u'path').callprop(u'replaceWith', var.get(u'root')) + else: + var.get(u'path').callprop(u'replaceWith', var.get(u'nodes').get(u'0')) + PyJs_TemplateLiteral_1160_._set_name(u'TemplateLiteral') + PyJs_Object_1158_ = Js({u'TaggedTemplateExpression':PyJs_TaggedTemplateExpression_1159_,u'TemplateLiteral':PyJs_TemplateLiteral_1160_}) + PyJs_Object_1157_ = Js({u'visitor':PyJs_Object_1158_}) + return PyJs_Object_1157_ + PyJs_anonymous_1156_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1156_) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1155_._set_name(u'anonymous') +PyJs_Object_1164_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_1165_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_symbol2', u'require', u'module', u'_symbol', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1172_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1172_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_symbol', var.get(u'require')(Js(u'babel-runtime/core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + @Js + def PyJs_anonymous_1166_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'IGNORE', u'_ref', u't']) + var.put(u't', var.get(u'_ref').get(u'types')) + var.put(u'IGNORE', PyJsComma(Js(0.0),var.get(u'_symbol2').get(u'default'))()) + @Js + def PyJs_Scope_1169_(_ref2, this, arguments, var=var): + var = Scope({u'this':this, u'Scope':PyJs_Scope_1169_, u'_ref2':_ref2, u'arguments':arguments}, var) + var.registers([u'scope', u'_ref2']) + var.put(u'scope', var.get(u'_ref2').get(u'scope')) + if var.get(u'scope').callprop(u'getBinding', Js(u'Symbol')).neg(): + return var.get('undefined') + var.get(u'scope').callprop(u'rename', Js(u'Symbol')) + PyJs_Scope_1169_._set_name(u'Scope') + @Js + def PyJs_UnaryExpression_1170_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'UnaryExpression':PyJs_UnaryExpression_1170_, u'arguments':arguments}, var) + var.registers([u'node', u'parent', u'opposite', u'unary', u'call', u'undefLiteral', u'path']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'parent', var.get(u'path').get(u'parent')) + if var.get(u'node').get(var.get(u'IGNORE')): + return var.get('undefined') + @Js + def PyJs_anonymous_1171_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u'path').get(u'node') and var.get(u'path').get(u'node').get(u'_generated').neg().neg()) + PyJs_anonymous_1171_._set_name(u'anonymous') + if var.get(u'path').callprop(u'find', PyJs_anonymous_1171_): + return var.get('undefined') + if (var.get(u'path').get(u'parentPath').callprop(u'isBinaryExpression') and (var.get(u't').get(u'EQUALITY_BINARY_OPERATORS').callprop(u'indexOf', var.get(u'parent').get(u'operator'))>=Js(0.0))): + var.put(u'opposite', var.get(u'path').callprop(u'getOpposite')) + if ((var.get(u'opposite').callprop(u'isLiteral') and PyJsStrictNeq(var.get(u'opposite').get(u'node').get(u'value'),Js(u'symbol'))) and PyJsStrictNeq(var.get(u'opposite').get(u'node').get(u'value'),Js(u'object'))): + return var.get('undefined') + if PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'typeof')): + var.put(u'call', var.get(u't').callprop(u'callExpression', var.get(u"this").callprop(u'addHelper', Js(u'typeof')), Js([var.get(u'node').get(u'argument')]))) + if var.get(u'path').callprop(u'get', Js(u'argument')).callprop(u'isIdentifier'): + var.put(u'undefLiteral', var.get(u't').callprop(u'stringLiteral', Js(u'undefined'))) + var.put(u'unary', var.get(u't').callprop(u'unaryExpression', Js(u'typeof'), var.get(u'node').get(u'argument'))) + var.get(u'unary').put(var.get(u'IGNORE'), var.get(u'true')) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'conditionalExpression', var.get(u't').callprop(u'binaryExpression', Js(u'==='), var.get(u'unary'), var.get(u'undefLiteral')), var.get(u'undefLiteral'), var.get(u'call'))) + else: + var.get(u'path').callprop(u'replaceWith', var.get(u'call')) + PyJs_UnaryExpression_1170_._set_name(u'UnaryExpression') + PyJs_Object_1168_ = Js({u'Scope':PyJs_Scope_1169_,u'UnaryExpression':PyJs_UnaryExpression_1170_}) + PyJs_Object_1167_ = Js({u'visitor':PyJs_Object_1168_}) + return PyJs_Object_1167_ + PyJs_anonymous_1166_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1166_) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1165_._set_name(u'anonymous') +PyJs_Object_1173_ = Js({u'babel-runtime/core-js/symbol':Js(105.0)}) +@Js +def PyJs_anonymous_1174_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_regexpuCore', u'regex', u'exports', u'_interopRequireWildcard', u'require', u'_babelHelperRegex', u'module', u'_interopRequireDefault', u'_regexpuCore2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1180_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1180_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1179_ = Js({}) + var.put(u'newObj', PyJs_Object_1179_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_1175_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_RegExpLiteral_1178_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'RegExpLiteral':PyJs_RegExpLiteral_1178_, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'node', u'_ref']) + var.put(u'node', var.get(u'_ref').get(u'node')) + if var.get(u'regex').callprop(u'is', var.get(u'node'), Js(u'u')).neg(): + return var.get('undefined') + var.get(u'node').put(u'pattern', PyJsComma(Js(0.0),var.get(u'_regexpuCore2').get(u'default'))(var.get(u'node').get(u'pattern'), var.get(u'node').get(u'flags'))) + var.get(u'regex').callprop(u'pullFlag', var.get(u'node'), Js(u'u')) + PyJs_RegExpLiteral_1178_._set_name(u'RegExpLiteral') + PyJs_Object_1177_ = Js({u'RegExpLiteral':PyJs_RegExpLiteral_1178_}) + PyJs_Object_1176_ = Js({u'visitor':PyJs_Object_1177_}) + return PyJs_Object_1176_ + PyJs_anonymous_1175_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1175_) + var.put(u'_regexpuCore', var.get(u'require')(Js(u'regexpu-core'))) + var.put(u'_regexpuCore2', var.get(u'_interopRequireDefault')(var.get(u'_regexpuCore'))) + var.put(u'_babelHelperRegex', var.get(u'require')(Js(u'babel-helper-regex'))) + var.put(u'regex', var.get(u'_interopRequireWildcard')(var.get(u'_babelHelperRegex'))) + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1174_._set_name(u'anonymous') +PyJs_Object_1181_ = Js({u'babel-helper-regex':Js(53.0),u'regexpu-core':Js(504.0)}) +@Js +def PyJs_anonymous_1182_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'meta', u'_assert', u'_interopRequireDefault', u'loc', u'_typeof2', u'_typeof3', u'_stringify2', u'getDeclError', u'leap', u'Emitter', u'isValidCompletion', u'exports', u'_babelTypes', u'_interopRequireWildcard', u'_assert2', u'catchParamVisitor', u'_util', u'util', u'_meta', u'require', u'hasOwn', u'_stringify', u't', u'_leap', u'Ep']) + @Js + def PyJsHoisted_loc_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'numericLiteral', (-Js(1.0))) + PyJsHoisted_loc_.func_name = u'loc' + var.put(u'loc', PyJsHoisted_loc_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1183_ = Js({}) + var.put(u'newObj', PyJs_Object_1183_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_isValidCompletion_(record, this, arguments, var=var): + var = Scope({u'this':this, u'record':record, u'arguments':arguments}, var) + var.registers([u'record', u'type']) + var.put(u'type', var.get(u'record').get(u'type')) + if PyJsStrictEq(var.get(u'type'),Js(u'normal')): + return var.get(u'hasOwn').callprop(u'call', var.get(u'record'), Js(u'target')).neg() + if (PyJsStrictEq(var.get(u'type'),Js(u'break')) or PyJsStrictEq(var.get(u'type'),Js(u'continue'))): + return (var.get(u'hasOwn').callprop(u'call', var.get(u'record'), Js(u'value')).neg() and var.get(u't').callprop(u'isLiteral', var.get(u'record').get(u'target'))) + if (PyJsStrictEq(var.get(u'type'),Js(u'return')) or PyJsStrictEq(var.get(u'type'),Js(u'throw'))): + return (var.get(u'hasOwn').callprop(u'call', var.get(u'record'), Js(u'value')) and var.get(u'hasOwn').callprop(u'call', var.get(u'record'), Js(u'target')).neg()) + return Js(False) + PyJsHoisted_isValidCompletion_.func_name = u'isValidCompletion' + var.put(u'isValidCompletion', PyJsHoisted_isValidCompletion_) + @Js + def PyJsHoisted_getDeclError_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return var.get(u'Error').create(((Js(u'all declarations should have been transformed into ')+Js(u'assignments before the Exploder began its work: '))+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'node')))) + PyJsHoisted_getDeclError_.func_name = u'getDeclError' + var.put(u'getDeclError', PyJsHoisted_getDeclError_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1184_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1184_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_Emitter_(contextId, this, arguments, var=var): + var = Scope({u'this':this, u'contextId':contextId, u'arguments':arguments}, var) + var.registers([u'contextId']) + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u"this").instanceof(var.get(u'Emitter'))) + var.get(u't').callprop(u'assertIdentifier', var.get(u'contextId')) + var.get(u"this").put(u'nextTempId', Js(0.0)) + var.get(u"this").put(u'contextId', var.get(u'contextId')) + var.get(u"this").put(u'listing', Js([])) + var.get(u"this").put(u'marked', Js([var.get(u'true')])) + var.get(u"this").put(u'finalLoc', var.get(u'loc')()) + var.get(u"this").put(u'tryEntries', Js([])) + var.get(u"this").put(u'leapManager', var.get(u'leap').get(u'LeapManager').create(var.get(u"this"))) + PyJsHoisted_Emitter_.func_name = u'Emitter' + var.put(u'Emitter', PyJsHoisted_Emitter_) + Js(u'use strict') + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + var.put(u'_stringify', var.get(u'require')(Js(u'babel-runtime/core-js/json/stringify'))) + var.put(u'_stringify2', var.get(u'_interopRequireDefault')(var.get(u'_stringify'))) + var.put(u'_assert', var.get(u'require')(Js(u'assert'))) + var.put(u'_assert2', var.get(u'_interopRequireDefault')(var.get(u'_assert'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_leap', var.get(u'require')(Js(u'./leap'))) + var.put(u'leap', var.get(u'_interopRequireWildcard')(var.get(u'_leap'))) + var.put(u'_meta', var.get(u'require')(Js(u'./meta'))) + var.put(u'meta', var.get(u'_interopRequireWildcard')(var.get(u'_meta'))) + var.put(u'_util', var.get(u'require')(Js(u'./util'))) + var.put(u'util', var.get(u'_interopRequireWildcard')(var.get(u'_util'))) + pass + pass + var.put(u'hasOwn', var.get(u'Object').get(u'prototype').get(u'hasOwnProperty')) + pass + var.put(u'Ep', var.get(u'Emitter').get(u'prototype')) + var.get(u'exports').put(u'Emitter', var.get(u'Emitter')) + pass + @Js + def PyJs_anonymous_1185_(loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'arguments':arguments}, var) + var.registers([u'index', u'loc']) + var.get(u't').callprop(u'assertLiteral', var.get(u'loc')) + var.put(u'index', var.get(u"this").get(u'listing').get(u'length')) + if PyJsStrictEq(var.get(u'loc').get(u'value'),(-Js(1.0))): + var.get(u'loc').put(u'value', var.get(u'index')) + else: + var.get(u'_assert2').get(u'default').callprop(u'strictEqual', var.get(u'loc').get(u'value'), var.get(u'index')) + var.get(u"this").get(u'marked').put(var.get(u'index'), var.get(u'true')) + return var.get(u'loc') + PyJs_anonymous_1185_._set_name(u'anonymous') + var.get(u'Ep').put(u'mark', PyJs_anonymous_1185_) + @Js + def PyJs_anonymous_1186_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u't').callprop(u'isExpression', var.get(u'node')): + var.put(u'node', var.get(u't').callprop(u'expressionStatement', var.get(u'node'))) + var.get(u't').callprop(u'assertStatement', var.get(u'node')) + var.get(u"this").get(u'listing').callprop(u'push', var.get(u'node')) + PyJs_anonymous_1186_._set_name(u'anonymous') + var.get(u'Ep').put(u'emit', PyJs_anonymous_1186_) + @Js + def PyJs_anonymous_1187_(lhs, rhs, this, arguments, var=var): + var = Scope({u'this':this, u'rhs':rhs, u'lhs':lhs, u'arguments':arguments}, var) + var.registers([u'rhs', u'lhs']) + var.get(u"this").callprop(u'emit', var.get(u"this").callprop(u'assign', var.get(u'lhs'), var.get(u'rhs'))) + return var.get(u'lhs') + PyJs_anonymous_1187_._set_name(u'anonymous') + var.get(u'Ep').put(u'emitAssign', PyJs_anonymous_1187_) + @Js + def PyJs_anonymous_1188_(lhs, rhs, this, arguments, var=var): + var = Scope({u'this':this, u'rhs':rhs, u'lhs':lhs, u'arguments':arguments}, var) + var.registers([u'rhs', u'lhs']) + return var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'lhs'), var.get(u'rhs'))) + PyJs_anonymous_1188_._set_name(u'anonymous') + var.get(u'Ep').put(u'assign', PyJs_anonymous_1188_) + @Js + def PyJs_anonymous_1189_(name, computed, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'name':name, u'computed':computed}, var) + var.registers([u'name', u'computed']) + return var.get(u't').callprop(u'memberExpression', var.get(u"this").get(u'contextId'), (var.get(u't').callprop(u'stringLiteral', var.get(u'name')) if var.get(u'computed') else var.get(u't').callprop(u'identifier', var.get(u'name'))), var.get(u'computed').neg().neg()) + PyJs_anonymous_1189_._set_name(u'anonymous') + var.get(u'Ep').put(u'contextProperty', PyJs_anonymous_1189_) + @Js + def PyJs_anonymous_1190_(rval, this, arguments, var=var): + var = Scope({u'this':this, u'rval':rval, u'arguments':arguments}, var) + var.registers([u'rval']) + if var.get(u'rval'): + var.get(u"this").callprop(u'setReturnValue', var.get(u'rval')) + var.get(u"this").callprop(u'jump', var.get(u"this").get(u'finalLoc')) + PyJs_anonymous_1190_._set_name(u'anonymous') + var.get(u'Ep').put(u'stop', PyJs_anonymous_1190_) + @Js + def PyJs_anonymous_1191_(valuePath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'valuePath':valuePath}, var) + var.registers([u'valuePath']) + var.get(u't').callprop(u'assertExpression', var.get(u'valuePath').get(u'value')) + var.get(u"this").callprop(u'emitAssign', var.get(u"this").callprop(u'contextProperty', Js(u'rval')), var.get(u"this").callprop(u'explodeExpression', var.get(u'valuePath'))) + PyJs_anonymous_1191_._set_name(u'anonymous') + var.get(u'Ep').put(u'setReturnValue', PyJs_anonymous_1191_) + @Js + def PyJs_anonymous_1192_(tryLoc, assignee, this, arguments, var=var): + var = Scope({u'this':this, u'assignee':assignee, u'tryLoc':tryLoc, u'arguments':arguments}, var) + var.registers([u'assignee', u'catchCall', u'tryLoc']) + var.get(u't').callprop(u'assertLiteral', var.get(u'tryLoc')) + var.put(u'catchCall', var.get(u't').callprop(u'callExpression', var.get(u"this").callprop(u'contextProperty', Js(u'catch'), var.get(u'true')), Js([var.get(u'tryLoc')]))) + if var.get(u'assignee'): + var.get(u"this").callprop(u'emitAssign', var.get(u'assignee'), var.get(u'catchCall')) + else: + var.get(u"this").callprop(u'emit', var.get(u'catchCall')) + PyJs_anonymous_1192_._set_name(u'anonymous') + var.get(u'Ep').put(u'clearPendingException', PyJs_anonymous_1192_) + @Js + def PyJs_anonymous_1193_(toLoc, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'toLoc':toLoc}, var) + var.registers([u'toLoc']) + var.get(u"this").callprop(u'emitAssign', var.get(u"this").callprop(u'contextProperty', Js(u'next')), var.get(u'toLoc')) + var.get(u"this").callprop(u'emit', var.get(u't').callprop(u'breakStatement')) + PyJs_anonymous_1193_._set_name(u'anonymous') + var.get(u'Ep').put(u'jump', PyJs_anonymous_1193_) + @Js + def PyJs_anonymous_1194_(test, toLoc, this, arguments, var=var): + var = Scope({u'test':test, u'this':this, u'arguments':arguments, u'toLoc':toLoc}, var) + var.registers([u'test', u'toLoc']) + var.get(u't').callprop(u'assertExpression', var.get(u'test')) + var.get(u't').callprop(u'assertLiteral', var.get(u'toLoc')) + var.get(u"this").callprop(u'emit', var.get(u't').callprop(u'ifStatement', var.get(u'test'), var.get(u't').callprop(u'blockStatement', Js([var.get(u"this").callprop(u'assign', var.get(u"this").callprop(u'contextProperty', Js(u'next')), var.get(u'toLoc')), var.get(u't').callprop(u'breakStatement')])))) + PyJs_anonymous_1194_._set_name(u'anonymous') + var.get(u'Ep').put(u'jumpIf', PyJs_anonymous_1194_) + @Js + def PyJs_anonymous_1195_(test, toLoc, this, arguments, var=var): + var = Scope({u'test':test, u'this':this, u'arguments':arguments, u'toLoc':toLoc}, var) + var.registers([u'test', u'negatedTest', u'toLoc']) + var.get(u't').callprop(u'assertExpression', var.get(u'test')) + var.get(u't').callprop(u'assertLiteral', var.get(u'toLoc')) + var.put(u'negatedTest', PyJsComma(Js(0.0), Js(None))) + if (var.get(u't').callprop(u'isUnaryExpression', var.get(u'test')) and PyJsStrictEq(var.get(u'test').get(u'operator'),Js(u'!'))): + var.put(u'negatedTest', var.get(u'test').get(u'argument')) + else: + var.put(u'negatedTest', var.get(u't').callprop(u'unaryExpression', Js(u'!'), var.get(u'test'))) + var.get(u"this").callprop(u'emit', var.get(u't').callprop(u'ifStatement', var.get(u'negatedTest'), var.get(u't').callprop(u'blockStatement', Js([var.get(u"this").callprop(u'assign', var.get(u"this").callprop(u'contextProperty', Js(u'next')), var.get(u'toLoc')), var.get(u't').callprop(u'breakStatement')])))) + PyJs_anonymous_1195_._set_name(u'anonymous') + var.get(u'Ep').put(u'jumpIfNot', PyJs_anonymous_1195_) + @Js + def PyJs_anonymous_1196_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'contextProperty', (Js(u't')+(var.get(u"this").put(u'nextTempId',Js(var.get(u"this").get(u'nextTempId').to_number())+Js(1))-Js(1)))) + PyJs_anonymous_1196_._set_name(u'anonymous') + var.get(u'Ep').put(u'makeTempVar', PyJs_anonymous_1196_) + @Js + def PyJs_anonymous_1197_(id, this, arguments, var=var): + var = Scope({u'this':this, u'id':id, u'arguments':arguments}, var) + var.registers([u'id']) + return var.get(u't').callprop(u'functionExpression', (var.get(u'id') or var.get(u"null")), Js([var.get(u"this").get(u'contextId')]), var.get(u't').callprop(u'blockStatement', Js([var.get(u"this").callprop(u'getDispatchLoop')])), Js(False), Js(False)) + PyJs_anonymous_1197_._set_name(u'anonymous') + var.get(u'Ep').put(u'getContextFunction', PyJs_anonymous_1197_) + @Js + def PyJs_anonymous_1198_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'current', u'self', u'alreadyEnded', u'cases']) + var.put(u'self', var.get(u"this")) + var.put(u'cases', Js([])) + var.put(u'current', PyJsComma(Js(0.0), Js(None))) + var.put(u'alreadyEnded', Js(False)) + @Js + def PyJs_anonymous_1199_(stmt, i, this, arguments, var=var): + var = Scope({u'i':i, u'this':this, u'arguments':arguments, u'stmt':stmt}, var) + var.registers([u'i', u'stmt']) + if var.get(u'self').get(u'marked').callprop(u'hasOwnProperty', var.get(u'i')): + var.get(u'cases').callprop(u'push', var.get(u't').callprop(u'switchCase', var.get(u't').callprop(u'numericLiteral', var.get(u'i')), var.put(u'current', Js([])))) + var.put(u'alreadyEnded', Js(False)) + if var.get(u'alreadyEnded').neg(): + var.get(u'current').callprop(u'push', var.get(u'stmt')) + if var.get(u't').callprop(u'isCompletionStatement', var.get(u'stmt')): + var.put(u'alreadyEnded', var.get(u'true')) + PyJs_anonymous_1199_._set_name(u'anonymous') + var.get(u'self').get(u'listing').callprop(u'forEach', PyJs_anonymous_1199_) + var.get(u"this").get(u'finalLoc').put(u'value', var.get(u"this").get(u'listing').get(u'length')) + var.get(u'cases').callprop(u'push', var.get(u't').callprop(u'switchCase', var.get(u"this").get(u'finalLoc'), Js([])), var.get(u't').callprop(u'switchCase', var.get(u't').callprop(u'stringLiteral', Js(u'end')), Js([var.get(u't').callprop(u'returnStatement', var.get(u't').callprop(u'callExpression', var.get(u"this").callprop(u'contextProperty', Js(u'stop')), Js([])))]))) + return var.get(u't').callprop(u'whileStatement', var.get(u't').callprop(u'numericLiteral', Js(1.0)), var.get(u't').callprop(u'switchStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u"this").callprop(u'contextProperty', Js(u'prev')), var.get(u"this").callprop(u'contextProperty', Js(u'next'))), var.get(u'cases'))) + PyJs_anonymous_1198_._set_name(u'anonymous') + var.get(u'Ep').put(u'getDispatchLoop', PyJs_anonymous_1198_) + @Js + def PyJs_anonymous_1200_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'lastLocValue']) + if PyJsStrictEq(var.get(u"this").get(u'tryEntries').get(u'length'),Js(0.0)): + return var.get(u"null") + var.put(u'lastLocValue', Js(0.0)) + @Js + def PyJs_anonymous_1201_(tryEntry, this, arguments, var=var): + var = Scope({u'this':this, u'tryEntry':tryEntry, u'arguments':arguments}, var) + var.registers([u'locs', u'tryEntry', u'thisLocValue', u'ce', u'fe']) + var.put(u'thisLocValue', var.get(u'tryEntry').get(u'firstLoc').get(u'value')) + var.get(u'_assert2').get(u'default').callprop(u'ok', (var.get(u'thisLocValue')>=var.get(u'lastLocValue')), Js(u'try entries out of order')) + var.put(u'lastLocValue', var.get(u'thisLocValue')) + var.put(u'ce', var.get(u'tryEntry').get(u'catchEntry')) + var.put(u'fe', var.get(u'tryEntry').get(u'finallyEntry')) + var.put(u'locs', Js([var.get(u'tryEntry').get(u'firstLoc'), (var.get(u'ce').get(u'firstLoc') if var.get(u'ce') else var.get(u"null"))])) + if var.get(u'fe'): + var.get(u'locs').put(u'2', var.get(u'fe').get(u'firstLoc')) + var.get(u'locs').put(u'3', var.get(u'fe').get(u'afterLoc')) + return var.get(u't').callprop(u'arrayExpression', var.get(u'locs')) + PyJs_anonymous_1201_._set_name(u'anonymous') + return var.get(u't').callprop(u'arrayExpression', var.get(u"this").get(u'tryEntries').callprop(u'map', PyJs_anonymous_1201_)) + PyJs_anonymous_1200_._set_name(u'anonymous') + var.get(u'Ep').put(u'getTryLocsList', PyJs_anonymous_1200_) + @Js + def PyJs_anonymous_1202_(path, ignoreResult, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ignoreResult':ignoreResult, u'arguments':arguments}, var) + var.registers([u'node', u'path', u'self', u'ignoreResult']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'self', var.get(u"this")) + var.get(u't').callprop(u'assertNode', var.get(u'node')) + if var.get(u't').callprop(u'isDeclaration', var.get(u'node')): + PyJsTempException = JsToPyException(var.get(u'getDeclError')(var.get(u'node'))) + raise PyJsTempException + if var.get(u't').callprop(u'isStatement', var.get(u'node')): + return var.get(u'self').callprop(u'explodeStatement', var.get(u'path')) + if var.get(u't').callprop(u'isExpression', var.get(u'node')): + return var.get(u'self').callprop(u'explodeExpression', var.get(u'path'), var.get(u'ignoreResult')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'Program')): + SWITCHED = True + return var.get(u'path').callprop(u'get', Js(u'body')).callprop(u'map', var.get(u'self').get(u'explodeStatement'), var.get(u'self')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'VariableDeclarator')): + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'getDeclError')(var.get(u'node'))) + raise PyJsTempException + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'Property')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'SwitchCase')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'CatchClause')): + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error').create((var.get(u'node').get(u'type')+Js(u' nodes should be handled by their parents')))) + raise PyJsTempException + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'unknown Node of type ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'node').get(u'type'))))) + raise PyJsTempException + SWITCHED = True + break + PyJs_anonymous_1202_._set_name(u'anonymous') + var.get(u'Ep').put(u'explode', PyJs_anonymous_1202_) + pass + @Js + def PyJs_anonymous_1203_(path, labelId, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'labelId':labelId}, var) + var.registers([u'head', u'labelId', u'_ret', u'self', u'after', u'stmt', u'path', u'before']) + var.put(u'stmt', var.get(u'path').get(u'node')) + var.put(u'self', var.get(u"this")) + var.put(u'before', PyJsComma(Js(0.0), Js(None))) + var.put(u'after', PyJsComma(Js(0.0), Js(None))) + var.put(u'head', PyJsComma(Js(0.0), Js(None))) + var.get(u't').callprop(u'assertStatement', var.get(u'stmt')) + if var.get(u'labelId'): + var.get(u't').callprop(u'assertIdentifier', var.get(u'labelId')) + else: + var.put(u'labelId', var.get(u"null")) + if var.get(u't').callprop(u'isBlockStatement', var.get(u'stmt')): + @Js + def PyJs_anonymous_1204_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path')) + PyJs_anonymous_1204_._set_name(u'anonymous') + var.get(u'path').callprop(u'get', Js(u'body')).callprop(u'forEach', PyJs_anonymous_1204_) + return var.get('undefined') + if var.get(u'meta').callprop(u'containsLeap', var.get(u'stmt')).neg(): + var.get(u'self').callprop(u'emit', var.get(u'stmt')) + return var.get('undefined') + @Js + def PyJs_anonymous_1205_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'catchLoc', u'catchEntry', u'c', u'tryEntry', u'keyInfoTmpVar', u'discriminant', u'i', u'keyIterNextFn', u'finallyLoc', u'update', u'defaultLoc', u'caseLocs', u'disc', u'test', u'cases', u'finallyEntry', u'elseLoc', u'handler', u'condition', u'first']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'stmt').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ExpressionStatement')): + SWITCHED = True + var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'expression')), var.get(u'true')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'LabeledStatement')): + SWITCHED = True + var.put(u'after', var.get(u'loc')()) + @Js + def PyJs_anonymous_1206_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'body')), var.get(u'stmt').get(u'label')) + PyJs_anonymous_1206_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'leap').get(u'LabeledEntry').create(var.get(u'after'), var.get(u'stmt').get(u'label')), PyJs_anonymous_1206_) + var.get(u'self').callprop(u'mark', var.get(u'after')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'WhileStatement')): + SWITCHED = True + var.put(u'before', var.get(u'loc')()) + var.put(u'after', var.get(u'loc')()) + var.get(u'self').callprop(u'mark', var.get(u'before')) + var.get(u'self').callprop(u'jumpIfNot', var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'test'))), var.get(u'after')) + @Js + def PyJs_anonymous_1207_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'body'))) + PyJs_anonymous_1207_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'leap').get(u'LoopEntry').create(var.get(u'after'), var.get(u'before'), var.get(u'labelId')), PyJs_anonymous_1207_) + var.get(u'self').callprop(u'jump', var.get(u'before')) + var.get(u'self').callprop(u'mark', var.get(u'after')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'DoWhileStatement')): + SWITCHED = True + var.put(u'first', var.get(u'loc')()) + var.put(u'test', var.get(u'loc')()) + var.put(u'after', var.get(u'loc')()) + var.get(u'self').callprop(u'mark', var.get(u'first')) + @Js + def PyJs_anonymous_1208_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explode', var.get(u'path').callprop(u'get', Js(u'body'))) + PyJs_anonymous_1208_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'leap').get(u'LoopEntry').create(var.get(u'after'), var.get(u'test'), var.get(u'labelId')), PyJs_anonymous_1208_) + var.get(u'self').callprop(u'mark', var.get(u'test')) + var.get(u'self').callprop(u'jumpIf', var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'test'))), var.get(u'first')) + var.get(u'self').callprop(u'mark', var.get(u'after')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForStatement')): + SWITCHED = True + var.put(u'head', var.get(u'loc')()) + var.put(u'update', var.get(u'loc')()) + var.put(u'after', var.get(u'loc')()) + if var.get(u'stmt').get(u'init'): + var.get(u'self').callprop(u'explode', var.get(u'path').callprop(u'get', Js(u'init')), var.get(u'true')) + var.get(u'self').callprop(u'mark', var.get(u'head')) + if var.get(u'stmt').get(u'test'): + var.get(u'self').callprop(u'jumpIfNot', var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'test'))), var.get(u'after')) + else: + pass + @Js + def PyJs_anonymous_1209_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'body'))) + PyJs_anonymous_1209_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'leap').get(u'LoopEntry').create(var.get(u'after'), var.get(u'update'), var.get(u'labelId')), PyJs_anonymous_1209_) + var.get(u'self').callprop(u'mark', var.get(u'update')) + if var.get(u'stmt').get(u'update'): + var.get(u'self').callprop(u'explode', var.get(u'path').callprop(u'get', Js(u'update')), var.get(u'true')) + var.get(u'self').callprop(u'jump', var.get(u'head')) + var.get(u'self').callprop(u'mark', var.get(u'after')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'TypeCastExpression')): + SWITCHED = True + PyJs_Object_1210_ = Js({u'v':var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'expression')))}) + return PyJs_Object_1210_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForInStatement')): + SWITCHED = True + var.put(u'head', var.get(u'loc')()) + var.put(u'after', var.get(u'loc')()) + var.put(u'keyIterNextFn', var.get(u'self').callprop(u'makeTempVar')) + var.get(u'self').callprop(u'emitAssign', var.get(u'keyIterNextFn'), var.get(u't').callprop(u'callExpression', var.get(u'util').callprop(u'runtimeProperty', Js(u'keys')), Js([var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'right')))]))) + var.get(u'self').callprop(u'mark', var.get(u'head')) + var.put(u'keyInfoTmpVar', var.get(u'self').callprop(u'makeTempVar')) + var.get(u'self').callprop(u'jumpIf', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'keyInfoTmpVar'), var.get(u't').callprop(u'callExpression', var.get(u'keyIterNextFn'), Js([]))), var.get(u't').callprop(u'identifier', Js(u'done')), Js(False)), var.get(u'after')) + var.get(u'self').callprop(u'emitAssign', var.get(u'stmt').get(u'left'), var.get(u't').callprop(u'memberExpression', var.get(u'keyInfoTmpVar'), var.get(u't').callprop(u'identifier', Js(u'value')), Js(False))) + @Js + def PyJs_anonymous_1211_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'body'))) + PyJs_anonymous_1211_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'leap').get(u'LoopEntry').create(var.get(u'after'), var.get(u'head'), var.get(u'labelId')), PyJs_anonymous_1211_) + var.get(u'self').callprop(u'jump', var.get(u'head')) + var.get(u'self').callprop(u'mark', var.get(u'after')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'BreakStatement')): + SWITCHED = True + PyJs_Object_1212_ = Js({u'type':Js(u'break'),u'target':var.get(u'self').get(u'leapManager').callprop(u'getBreakLoc', var.get(u'stmt').get(u'label'))}) + var.get(u'self').callprop(u'emitAbruptCompletion', PyJs_Object_1212_) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ContinueStatement')): + SWITCHED = True + PyJs_Object_1213_ = Js({u'type':Js(u'continue'),u'target':var.get(u'self').get(u'leapManager').callprop(u'getContinueLoc', var.get(u'stmt').get(u'label'))}) + var.get(u'self').callprop(u'emitAbruptCompletion', PyJs_Object_1213_) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'SwitchStatement')): + SWITCHED = True + var.put(u'disc', var.get(u'self').callprop(u'emitAssign', var.get(u'self').callprop(u'makeTempVar'), var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'discriminant'))))) + var.put(u'after', var.get(u'loc')()) + var.put(u'defaultLoc', var.get(u'loc')()) + var.put(u'condition', var.get(u'defaultLoc')) + var.put(u'caseLocs', Js([])) + var.put(u'cases', (var.get(u'stmt').get(u'cases') or Js([]))) + #for JS loop + var.put(u'i', (var.get(u'cases').get(u'length')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + var.put(u'c', var.get(u'cases').get(var.get(u'i'))) + var.get(u't').callprop(u'assertSwitchCase', var.get(u'c')) + if var.get(u'c').get(u'test'): + var.put(u'condition', var.get(u't').callprop(u'conditionalExpression', var.get(u't').callprop(u'binaryExpression', Js(u'==='), var.get(u'disc'), var.get(u'c').get(u'test')), var.get(u'caseLocs').put(var.get(u'i'), var.get(u'loc')()), var.get(u'condition'))) + else: + var.get(u'caseLocs').put(var.get(u'i'), var.get(u'defaultLoc')) + finally: + var.put(u'i',Js(var.get(u'i').to_number())-Js(1)) + var.put(u'discriminant', var.get(u'path').callprop(u'get', Js(u'discriminant'))) + var.get(u'discriminant').callprop(u'replaceWith', var.get(u'condition')) + var.get(u'self').callprop(u'jump', var.get(u'self').callprop(u'explodeExpression', var.get(u'discriminant'))) + @Js + def PyJs_anonymous_1214_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_anonymous_1215_(casePath, this, arguments, var=var): + var = Scope({u'this':this, u'casePath':casePath, u'arguments':arguments}, var) + var.registers([u'i', u'casePath']) + var.put(u'i', var.get(u'casePath').get(u'key')) + var.get(u'self').callprop(u'mark', var.get(u'caseLocs').get(var.get(u'i'))) + @Js + def PyJs_anonymous_1216_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path')) + PyJs_anonymous_1216_._set_name(u'anonymous') + var.get(u'casePath').callprop(u'get', Js(u'consequent')).callprop(u'forEach', PyJs_anonymous_1216_) + PyJs_anonymous_1215_._set_name(u'anonymous') + var.get(u'path').callprop(u'get', Js(u'cases')).callprop(u'forEach', PyJs_anonymous_1215_) + PyJs_anonymous_1214_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'leap').get(u'SwitchEntry').create(var.get(u'after')), PyJs_anonymous_1214_) + var.get(u'self').callprop(u'mark', var.get(u'after')) + if PyJsStrictEq(var.get(u'defaultLoc').get(u'value'),(-Js(1.0))): + var.get(u'self').callprop(u'mark', var.get(u'defaultLoc')) + var.get(u'_assert2').get(u'default').callprop(u'strictEqual', var.get(u'after').get(u'value'), var.get(u'defaultLoc').get(u'value')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'IfStatement')): + SWITCHED = True + var.put(u'elseLoc', (var.get(u'stmt').get(u'alternate') and var.get(u'loc')())) + var.put(u'after', var.get(u'loc')()) + var.get(u'self').callprop(u'jumpIfNot', var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'test'))), (var.get(u'elseLoc') or var.get(u'after'))) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'consequent'))) + if var.get(u'elseLoc'): + var.get(u'self').callprop(u'jump', var.get(u'after')) + var.get(u'self').callprop(u'mark', var.get(u'elseLoc')) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'alternate'))) + var.get(u'self').callprop(u'mark', var.get(u'after')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ReturnStatement')): + SWITCHED = True + PyJs_Object_1217_ = Js({u'type':Js(u'return'),u'value':var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'argument')))}) + var.get(u'self').callprop(u'emitAbruptCompletion', PyJs_Object_1217_) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'WithStatement')): + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'WithStatement not supported in generator functions.'))) + raise PyJsTempException + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'TryStatement')): + SWITCHED = True + var.put(u'after', var.get(u'loc')()) + var.put(u'handler', var.get(u'stmt').get(u'handler')) + var.put(u'catchLoc', (var.get(u'handler') and var.get(u'loc')())) + var.put(u'catchEntry', (var.get(u'catchLoc') and var.get(u'leap').get(u'CatchEntry').create(var.get(u'catchLoc'), var.get(u'handler').get(u'param')))) + var.put(u'finallyLoc', (var.get(u'stmt').get(u'finalizer') and var.get(u'loc')())) + var.put(u'finallyEntry', (var.get(u'finallyLoc') and var.get(u'leap').get(u'FinallyEntry').create(var.get(u'finallyLoc'), var.get(u'after')))) + var.put(u'tryEntry', var.get(u'leap').get(u'TryEntry').create(var.get(u'self').callprop(u'getUnmarkedCurrentLoc'), var.get(u'catchEntry'), var.get(u'finallyEntry'))) + var.get(u'self').get(u'tryEntries').callprop(u'push', var.get(u'tryEntry')) + var.get(u'self').callprop(u'updateContextPrevLoc', var.get(u'tryEntry').get(u'firstLoc')) + @Js + def PyJs_anonymous_1218_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'block'))) + if var.get(u'catchLoc'): + @Js + def PyJs_anonymous_1219_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'bodyPath', u'safeParam']) + if var.get(u'finallyLoc'): + var.get(u'self').callprop(u'jump', var.get(u'finallyLoc')) + else: + var.get(u'self').callprop(u'jump', var.get(u'after')) + var.get(u'self').callprop(u'updateContextPrevLoc', var.get(u'self').callprop(u'mark', var.get(u'catchLoc'))) + var.put(u'bodyPath', var.get(u'path').callprop(u'get', Js(u'handler.body'))) + var.put(u'safeParam', var.get(u'self').callprop(u'makeTempVar')) + var.get(u'self').callprop(u'clearPendingException', var.get(u'tryEntry').get(u'firstLoc'), var.get(u'safeParam')) + PyJs_Object_1220_ = Js({u'safeParam':var.get(u'safeParam'),u'catchParamName':var.get(u'handler').get(u'param').get(u'name')}) + var.get(u'bodyPath').callprop(u'traverse', var.get(u'catchParamVisitor'), PyJs_Object_1220_) + @Js + def PyJs_anonymous_1221_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explodeStatement', var.get(u'bodyPath')) + PyJs_anonymous_1221_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'catchEntry'), PyJs_anonymous_1221_) + PyJs_anonymous_1219_._set_name(u'anonymous') + PyJs_anonymous_1219_() + if var.get(u'finallyLoc'): + var.get(u'self').callprop(u'updateContextPrevLoc', var.get(u'self').callprop(u'mark', var.get(u'finallyLoc'))) + @Js + def PyJs_anonymous_1222_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'finalizer'))) + PyJs_anonymous_1222_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'finallyEntry'), PyJs_anonymous_1222_) + var.get(u'self').callprop(u'emit', var.get(u't').callprop(u'returnStatement', var.get(u't').callprop(u'callExpression', var.get(u'self').callprop(u'contextProperty', Js(u'finish')), Js([var.get(u'finallyEntry').get(u'firstLoc')])))) + PyJs_anonymous_1218_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'tryEntry'), PyJs_anonymous_1218_) + var.get(u'self').callprop(u'mark', var.get(u'after')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ThrowStatement')): + SWITCHED = True + var.get(u'self').callprop(u'emit', var.get(u't').callprop(u'throwStatement', var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'argument'))))) + break + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'unknown Statement of type ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'stmt').get(u'type'))))) + raise PyJsTempException + SWITCHED = True + break + PyJs_anonymous_1205_._set_name(u'anonymous') + var.put(u'_ret', PyJs_anonymous_1205_()) + if PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'_ret',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'_ret'))),Js(u'object')): + return var.get(u'_ret').get(u'v') + PyJs_anonymous_1203_._set_name(u'anonymous') + var.get(u'Ep').put(u'explodeStatement', PyJs_anonymous_1203_) + @Js + def PyJs_Identifier_1224_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'Identifier':PyJs_Identifier_1224_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if (PyJsStrictEq(var.get(u'path').get(u'node').get(u'name'),var.get(u'state').get(u'catchParamName')) and var.get(u'util').callprop(u'isReference', var.get(u'path'))): + var.get(u'path').callprop(u'replaceWith', var.get(u'state').get(u'safeParam')) + PyJs_Identifier_1224_._set_name(u'Identifier') + @Js + def PyJs_Scope_1225_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'Scope':PyJs_Scope_1225_}, var) + var.registers([u'path', u'state']) + if var.get(u'path').get(u'scope').callprop(u'hasOwnBinding', var.get(u'state').get(u'catchParamName')): + var.get(u'path').callprop(u'skip') + PyJs_Scope_1225_._set_name(u'Scope') + PyJs_Object_1223_ = Js({u'Identifier':PyJs_Identifier_1224_,u'Scope':PyJs_Scope_1225_}) + var.put(u'catchParamVisitor', PyJs_Object_1223_) + @Js + def PyJs_anonymous_1226_(record, this, arguments, var=var): + var = Scope({u'this':this, u'record':record, u'arguments':arguments}, var) + var.registers([u'record', u'abruptArgs']) + if var.get(u'isValidCompletion')(var.get(u'record')).neg(): + var.get(u'_assert2').get(u'default').callprop(u'ok', Js(False), (Js(u'invalid completion record: ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'record')))) + var.get(u'_assert2').get(u'default').callprop(u'notStrictEqual', var.get(u'record').get(u'type'), Js(u'normal'), Js(u'normal completions are not abrupt')) + var.put(u'abruptArgs', Js([var.get(u't').callprop(u'stringLiteral', var.get(u'record').get(u'type'))])) + if (PyJsStrictEq(var.get(u'record').get(u'type'),Js(u'break')) or PyJsStrictEq(var.get(u'record').get(u'type'),Js(u'continue'))): + var.get(u't').callprop(u'assertLiteral', var.get(u'record').get(u'target')) + var.get(u'abruptArgs').put(u'1', var.get(u'record').get(u'target')) + else: + if (PyJsStrictEq(var.get(u'record').get(u'type'),Js(u'return')) or PyJsStrictEq(var.get(u'record').get(u'type'),Js(u'throw'))): + if var.get(u'record').get(u'value'): + var.get(u't').callprop(u'assertExpression', var.get(u'record').get(u'value')) + var.get(u'abruptArgs').put(u'1', var.get(u'record').get(u'value')) + var.get(u"this").callprop(u'emit', var.get(u't').callprop(u'returnStatement', var.get(u't').callprop(u'callExpression', var.get(u"this").callprop(u'contextProperty', Js(u'abrupt')), var.get(u'abruptArgs')))) + PyJs_anonymous_1226_._set_name(u'anonymous') + var.get(u'Ep').put(u'emitAbruptCompletion', PyJs_anonymous_1226_) + pass + @Js + def PyJs_anonymous_1227_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'numericLiteral', var.get(u"this").get(u'listing').get(u'length')) + PyJs_anonymous_1227_._set_name(u'anonymous') + var.get(u'Ep').put(u'getUnmarkedCurrentLoc', PyJs_anonymous_1227_) + @Js + def PyJs_anonymous_1228_(loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'arguments':arguments}, var) + var.registers([u'loc']) + if var.get(u'loc'): + var.get(u't').callprop(u'assertLiteral', var.get(u'loc')) + if PyJsStrictEq(var.get(u'loc').get(u'value'),(-Js(1.0))): + var.get(u'loc').put(u'value', var.get(u"this").get(u'listing').get(u'length')) + else: + var.get(u'_assert2').get(u'default').callprop(u'strictEqual', var.get(u'loc').get(u'value'), var.get(u"this").get(u'listing').get(u'length')) + else: + var.put(u'loc', var.get(u"this").callprop(u'getUnmarkedCurrentLoc')) + var.get(u"this").callprop(u'emitAssign', var.get(u"this").callprop(u'contextProperty', Js(u'prev')), var.get(u'loc')) + PyJs_anonymous_1228_._set_name(u'anonymous') + var.get(u'Ep').put(u'updateContextPrevLoc', PyJs_anonymous_1228_) + @Js + def PyJs_anonymous_1229_(path, ignoreResult, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ignoreResult':ignoreResult, u'arguments':arguments}, var) + var.registers([u'finish', u'ignoreResult', u'expr', u'self', u'after', u'_ret3', u'result', u'hasLeapingChildren', u'path', u'explodeViaTempVar']) + @Js + def PyJsHoisted_explodeViaTempVar_(tempVar, childPath, ignoreChildResult, this, arguments, var=var): + var = Scope({u'this':this, u'ignoreChildResult':ignoreChildResult, u'childPath':childPath, u'tempVar':tempVar, u'arguments':arguments}, var) + var.registers([u'childPath', u'ignoreChildResult', u'result', u'tempVar']) + var.get(u'_assert2').get(u'default').callprop(u'ok', (var.get(u'ignoreChildResult').neg() or var.get(u'tempVar').neg()), (Js(u'Ignoring the result of a child expression but forcing it to ')+Js(u'be assigned to a temporary variable?'))) + var.put(u'result', var.get(u'self').callprop(u'explodeExpression', var.get(u'childPath'), var.get(u'ignoreChildResult'))) + if var.get(u'ignoreChildResult'): + pass + else: + if (var.get(u'tempVar') or (var.get(u'hasLeapingChildren') and var.get(u't').callprop(u'isLiteral', var.get(u'result')).neg())): + var.put(u'result', var.get(u'self').callprop(u'emitAssign', (var.get(u'tempVar') or var.get(u'self').callprop(u'makeTempVar')), var.get(u'result'))) + return var.get(u'result') + PyJsHoisted_explodeViaTempVar_.func_name = u'explodeViaTempVar' + var.put(u'explodeViaTempVar', PyJsHoisted_explodeViaTempVar_) + @Js + def PyJsHoisted_finish_(expr, this, arguments, var=var): + var = Scope({u'this':this, u'expr':expr, u'arguments':arguments}, var) + var.registers([u'expr']) + var.get(u't').callprop(u'assertExpression', var.get(u'expr')) + if var.get(u'ignoreResult'): + var.get(u'self').callprop(u'emit', var.get(u'expr')) + else: + return var.get(u'expr') + PyJsHoisted_finish_.func_name = u'finish' + var.put(u'finish', PyJsHoisted_finish_) + var.put(u'expr', var.get(u'path').get(u'node')) + if var.get(u'expr'): + var.get(u't').callprop(u'assertExpression', var.get(u'expr')) + else: + return var.get(u'expr') + var.put(u'self', var.get(u"this")) + var.put(u'result', PyJsComma(Js(0.0), Js(None))) + var.put(u'after', PyJsComma(Js(0.0), Js(None))) + pass + if var.get(u'meta').callprop(u'containsLeap', var.get(u'expr')).neg(): + return var.get(u'finish')(var.get(u'expr')) + var.put(u'hasLeapingChildren', var.get(u'meta').get(u'containsLeap').callprop(u'onlyChildren', var.get(u'expr'))) + pass + @Js + def PyJs_anonymous_1230_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'argsPath', u'_result', u'hasLeapingArgs', u'calleePath', u'lastIndex', u'newProperty', u'newObject', u'arg', u'test', u'newCallee', u'newArgs', u'elseLoc', u'left']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'expr').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'MemberExpression')): + SWITCHED = True + PyJs_Object_1231_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'memberExpression', var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'object'))), (var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'path').callprop(u'get', Js(u'property'))) if var.get(u'expr').get(u'computed') else var.get(u'expr').get(u'property')), var.get(u'expr').get(u'computed')))}) + return PyJs_Object_1231_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'CallExpression')): + SWITCHED = True + var.put(u'calleePath', var.get(u'path').callprop(u'get', Js(u'callee'))) + var.put(u'argsPath', var.get(u'path').callprop(u'get', Js(u'arguments'))) + var.put(u'newCallee', PyJsComma(Js(0.0), Js(None))) + var.put(u'newArgs', Js([])) + var.put(u'hasLeapingArgs', Js(False)) + @Js + def PyJs_anonymous_1232_(argPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'argPath':argPath}, var) + var.registers([u'argPath']) + var.put(u'hasLeapingArgs', (var.get(u'hasLeapingArgs') or var.get(u'meta').callprop(u'containsLeap', var.get(u'argPath').get(u'node')))) + PyJs_anonymous_1232_._set_name(u'anonymous') + var.get(u'argsPath').callprop(u'forEach', PyJs_anonymous_1232_) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'calleePath').get(u'node')): + if var.get(u'hasLeapingArgs'): + var.put(u'newObject', var.get(u'explodeViaTempVar')(var.get(u'self').callprop(u'makeTempVar'), var.get(u'calleePath').callprop(u'get', Js(u'object')))) + var.put(u'newProperty', (var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'calleePath').callprop(u'get', Js(u'property'))) if var.get(u'calleePath').get(u'node').get(u'computed') else var.get(u'calleePath').get(u'node').get(u'property'))) + var.get(u'newArgs').callprop(u'unshift', var.get(u'newObject')) + var.put(u'newCallee', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'memberExpression', var.get(u'newObject'), var.get(u'newProperty'), var.get(u'calleePath').get(u'node').get(u'computed')), var.get(u't').callprop(u'identifier', Js(u'call')), Js(False))) + else: + var.put(u'newCallee', var.get(u'self').callprop(u'explodeExpression', var.get(u'calleePath'))) + else: + var.put(u'newCallee', var.get(u'self').callprop(u'explodeExpression', var.get(u'calleePath'))) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'newCallee')): + var.put(u'newCallee', var.get(u't').callprop(u'sequenceExpression', Js([var.get(u't').callprop(u'numericLiteral', Js(0.0)), var.get(u'newCallee')]))) + @Js + def PyJs_anonymous_1233_(argPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'argPath':argPath}, var) + var.registers([u'argPath']) + var.get(u'newArgs').callprop(u'push', var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'argPath'))) + PyJs_anonymous_1233_._set_name(u'anonymous') + var.get(u'argsPath').callprop(u'forEach', PyJs_anonymous_1233_) + PyJs_Object_1234_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'callExpression', var.get(u'newCallee'), var.get(u'newArgs')))}) + return PyJs_Object_1234_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'NewExpression')): + SWITCHED = True + @Js + def PyJs_anonymous_1236_(argPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'argPath':argPath}, var) + var.registers([u'argPath']) + return var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'argPath')) + PyJs_anonymous_1236_._set_name(u'anonymous') + PyJs_Object_1235_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'newExpression', var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'path').callprop(u'get', Js(u'callee'))), var.get(u'path').callprop(u'get', Js(u'arguments')).callprop(u'map', PyJs_anonymous_1236_)))}) + return PyJs_Object_1235_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectExpression')): + SWITCHED = True + @Js + def PyJs_anonymous_1238_(propPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'propPath':propPath}, var) + var.registers([u'propPath']) + if var.get(u'propPath').callprop(u'isObjectProperty'): + return var.get(u't').callprop(u'objectProperty', var.get(u'propPath').get(u'node').get(u'key'), var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'propPath').callprop(u'get', Js(u'value'))), var.get(u'propPath').get(u'node').get(u'computed')) + else: + return var.get(u'propPath').get(u'node') + PyJs_anonymous_1238_._set_name(u'anonymous') + PyJs_Object_1237_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'objectExpression', var.get(u'path').callprop(u'get', Js(u'properties')).callprop(u'map', PyJs_anonymous_1238_)))}) + return PyJs_Object_1237_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ArrayExpression')): + SWITCHED = True + @Js + def PyJs_anonymous_1240_(elemPath, this, arguments, var=var): + var = Scope({u'this':this, u'elemPath':elemPath, u'arguments':arguments}, var) + var.registers([u'elemPath']) + return var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'elemPath')) + PyJs_anonymous_1240_._set_name(u'anonymous') + PyJs_Object_1239_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'arrayExpression', var.get(u'path').callprop(u'get', Js(u'elements')).callprop(u'map', PyJs_anonymous_1240_)))}) + return PyJs_Object_1239_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'SequenceExpression')): + SWITCHED = True + var.put(u'lastIndex', (var.get(u'expr').get(u'expressions').get(u'length')-Js(1.0))) + @Js + def PyJs_anonymous_1241_(exprPath, this, arguments, var=var): + var = Scope({u'exprPath':exprPath, u'this':this, u'arguments':arguments}, var) + var.registers([u'exprPath']) + if PyJsStrictEq(var.get(u'exprPath').get(u'key'),var.get(u'lastIndex')): + var.put(u'result', var.get(u'self').callprop(u'explodeExpression', var.get(u'exprPath'), var.get(u'ignoreResult'))) + else: + var.get(u'self').callprop(u'explodeExpression', var.get(u'exprPath'), var.get(u'true')) + PyJs_anonymous_1241_._set_name(u'anonymous') + var.get(u'path').callprop(u'get', Js(u'expressions')).callprop(u'forEach', PyJs_anonymous_1241_) + PyJs_Object_1242_ = Js({u'v':var.get(u'result')}) + return PyJs_Object_1242_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'LogicalExpression')): + SWITCHED = True + var.put(u'after', var.get(u'loc')()) + if var.get(u'ignoreResult').neg(): + var.put(u'result', var.get(u'self').callprop(u'makeTempVar')) + var.put(u'left', var.get(u'explodeViaTempVar')(var.get(u'result'), var.get(u'path').callprop(u'get', Js(u'left')))) + if PyJsStrictEq(var.get(u'expr').get(u'operator'),Js(u'&&')): + var.get(u'self').callprop(u'jumpIfNot', var.get(u'left'), var.get(u'after')) + else: + var.get(u'_assert2').get(u'default').callprop(u'strictEqual', var.get(u'expr').get(u'operator'), Js(u'||')) + var.get(u'self').callprop(u'jumpIf', var.get(u'left'), var.get(u'after')) + var.get(u'explodeViaTempVar')(var.get(u'result'), var.get(u'path').callprop(u'get', Js(u'right')), var.get(u'ignoreResult')) + var.get(u'self').callprop(u'mark', var.get(u'after')) + PyJs_Object_1243_ = Js({u'v':var.get(u'result')}) + return PyJs_Object_1243_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ConditionalExpression')): + SWITCHED = True + var.put(u'elseLoc', var.get(u'loc')()) + var.put(u'after', var.get(u'loc')()) + var.put(u'test', var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'test')))) + var.get(u'self').callprop(u'jumpIfNot', var.get(u'test'), var.get(u'elseLoc')) + if var.get(u'ignoreResult').neg(): + var.put(u'result', var.get(u'self').callprop(u'makeTempVar')) + var.get(u'explodeViaTempVar')(var.get(u'result'), var.get(u'path').callprop(u'get', Js(u'consequent')), var.get(u'ignoreResult')) + var.get(u'self').callprop(u'jump', var.get(u'after')) + var.get(u'self').callprop(u'mark', var.get(u'elseLoc')) + var.get(u'explodeViaTempVar')(var.get(u'result'), var.get(u'path').callprop(u'get', Js(u'alternate')), var.get(u'ignoreResult')) + var.get(u'self').callprop(u'mark', var.get(u'after')) + PyJs_Object_1244_ = Js({u'v':var.get(u'result')}) + return PyJs_Object_1244_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'UnaryExpression')): + SWITCHED = True + PyJs_Object_1245_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'unaryExpression', var.get(u'expr').get(u'operator'), var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'argument'))), var.get(u'expr').get(u'prefix').neg().neg()))}) + return PyJs_Object_1245_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'BinaryExpression')): + SWITCHED = True + PyJs_Object_1246_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'binaryExpression', var.get(u'expr').get(u'operator'), var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'path').callprop(u'get', Js(u'left'))), var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'path').callprop(u'get', Js(u'right')))))}) + return PyJs_Object_1246_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'AssignmentExpression')): + SWITCHED = True + PyJs_Object_1247_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'assignmentExpression', var.get(u'expr').get(u'operator'), var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'left'))), var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'right')))))}) + return PyJs_Object_1247_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'UpdateExpression')): + SWITCHED = True + PyJs_Object_1248_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'updateExpression', var.get(u'expr').get(u'operator'), var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'argument'))), var.get(u'expr').get(u'prefix')))}) + return PyJs_Object_1248_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'YieldExpression')): + SWITCHED = True + var.put(u'after', var.get(u'loc')()) + var.put(u'arg', (var.get(u'expr').get(u'argument') and var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'argument'))))) + if (var.get(u'arg') and var.get(u'expr').get(u'delegate')): + var.put(u'_result', var.get(u'self').callprop(u'makeTempVar')) + var.get(u'self').callprop(u'emit', var.get(u't').callprop(u'returnStatement', var.get(u't').callprop(u'callExpression', var.get(u'self').callprop(u'contextProperty', Js(u'delegateYield')), Js([var.get(u'arg'), var.get(u't').callprop(u'stringLiteral', var.get(u'_result').get(u'property').get(u'name')), var.get(u'after')])))) + var.get(u'self').callprop(u'mark', var.get(u'after')) + PyJs_Object_1249_ = Js({u'v':var.get(u'_result')}) + return PyJs_Object_1249_ + var.get(u'self').callprop(u'emitAssign', var.get(u'self').callprop(u'contextProperty', Js(u'next')), var.get(u'after')) + var.get(u'self').callprop(u'emit', var.get(u't').callprop(u'returnStatement', (var.get(u'arg') or var.get(u"null")))) + var.get(u'self').callprop(u'mark', var.get(u'after')) + PyJs_Object_1250_ = Js({u'v':var.get(u'self').callprop(u'contextProperty', Js(u'sent'))}) + return PyJs_Object_1250_ + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'unknown Expression of type ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'expr').get(u'type'))))) + raise PyJsTempException + SWITCHED = True + break + PyJs_anonymous_1230_._set_name(u'anonymous') + var.put(u'_ret3', PyJs_anonymous_1230_()) + if PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'_ret3',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'_ret3'))),Js(u'object')): + return var.get(u'_ret3').get(u'v') + PyJs_anonymous_1229_._set_name(u'anonymous') + var.get(u'Ep').put(u'explodeExpression', PyJs_anonymous_1229_) +PyJs_anonymous_1182_._set_name(u'anonymous') +PyJs_Object_1251_ = Js({u'./leap':Js(90.0),u'./meta':Js(91.0),u'./util':Js(92.0),u'assert':Js(524.0),u'babel-runtime/core-js/json/stringify':Js(97.0),u'babel-runtime/helpers/typeof':Js(114.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1252_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'exports', u'_interopRequireWildcard', u'require', u'_babelTypes', u'hasOwn', u'_keys2', u'_keys', u't', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1254_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1254_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1253_ = Js({}) + var.put(u'newObj', PyJs_Object_1253_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.put(u'_keys', var.get(u'require')(Js(u'babel-runtime/core-js/object/keys'))) + var.put(u'_keys2', var.get(u'_interopRequireDefault')(var.get(u'_keys'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'hasOwn', var.get(u'Object').get(u'prototype').get(u'hasOwnProperty')) + @Js + def PyJs_anonymous_1255_(funPath, this, arguments, var=var): + var = Scope({u'this':this, u'funPath':funPath, u'arguments':arguments}, var) + var.registers([u'varDeclToExpr', u'funPath', u'paramNames', u'declarations', u'vars']) + @Js + def PyJsHoisted_varDeclToExpr_(vdec, includeIdentifiers, this, arguments, var=var): + var = Scope({u'this':this, u'vdec':vdec, u'arguments':arguments, u'includeIdentifiers':includeIdentifiers}, var) + var.registers([u'exprs', u'vdec', u'includeIdentifiers']) + var.get(u't').callprop(u'assertVariableDeclaration', var.get(u'vdec')) + var.put(u'exprs', Js([])) + @Js + def PyJs_anonymous_1257_(dec, this, arguments, var=var): + var = Scope({u'this':this, u'dec':dec, u'arguments':arguments}, var) + var.registers([u'dec']) + var.get(u'vars').put(var.get(u'dec').get(u'id').get(u'name'), var.get(u't').callprop(u'identifier', var.get(u'dec').get(u'id').get(u'name'))) + if var.get(u'dec').get(u'init'): + var.get(u'exprs').callprop(u'push', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'dec').get(u'id'), var.get(u'dec').get(u'init'))) + else: + if var.get(u'includeIdentifiers'): + var.get(u'exprs').callprop(u'push', var.get(u'dec').get(u'id')) + PyJs_anonymous_1257_._set_name(u'anonymous') + var.get(u'vdec').get(u'declarations').callprop(u'forEach', PyJs_anonymous_1257_) + if PyJsStrictEq(var.get(u'exprs').get(u'length'),Js(0.0)): + return var.get(u"null") + if PyJsStrictEq(var.get(u'exprs').get(u'length'),Js(1.0)): + return var.get(u'exprs').get(u'0') + return var.get(u't').callprop(u'sequenceExpression', var.get(u'exprs')) + PyJsHoisted_varDeclToExpr_.func_name = u'varDeclToExpr' + var.put(u'varDeclToExpr', PyJsHoisted_varDeclToExpr_) + var.get(u't').callprop(u'assertFunction', var.get(u'funPath').get(u'node')) + PyJs_Object_1256_ = Js({}) + var.put(u'vars', PyJs_Object_1256_) + pass + @Js + def PyJs_exit_1260_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_1260_, u'arguments':arguments}, var) + var.registers([u'expr', u'path']) + var.put(u'expr', var.get(u'varDeclToExpr')(var.get(u'path').get(u'node'), Js(False))) + if PyJsStrictEq(var.get(u'expr'),var.get(u"null")): + var.get(u'path').callprop(u'remove') + else: + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'expressionStatement', var.get(u'expr'))) + var.get(u'path').callprop(u'skip') + PyJs_exit_1260_._set_name(u'exit') + PyJs_Object_1259_ = Js({u'exit':PyJs_exit_1260_}) + @Js + def PyJs_ForStatement_1261_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'ForStatement':PyJs_ForStatement_1261_}, var) + var.registers([u'path', u'init']) + var.put(u'init', var.get(u'path').get(u'node').get(u'init')) + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'init')): + var.get(u'path').callprop(u'get', Js(u'init')).callprop(u'replaceWith', var.get(u'varDeclToExpr')(var.get(u'init'), Js(False))) + PyJs_ForStatement_1261_._set_name(u'ForStatement') + @Js + def PyJs_ForXStatement_1262_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'ForXStatement':PyJs_ForXStatement_1262_}, var) + var.registers([u'path', u'left']) + var.put(u'left', var.get(u'path').callprop(u'get', Js(u'left'))) + if var.get(u'left').callprop(u'isVariableDeclaration'): + var.get(u'left').callprop(u'replaceWith', var.get(u'varDeclToExpr')(var.get(u'left').get(u'node'), var.get(u'true'))) + PyJs_ForXStatement_1262_._set_name(u'ForXStatement') + @Js + def PyJs_FunctionDeclaration_1263_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'FunctionDeclaration':PyJs_FunctionDeclaration_1263_}, var) + var.registers([u'node', u'assignment', u'path']) + var.put(u'node', var.get(u'path').get(u'node')) + var.get(u'vars').put(var.get(u'node').get(u'id').get(u'name'), var.get(u'node').get(u'id')) + var.put(u'assignment', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'node').get(u'id'), var.get(u't').callprop(u'functionExpression', var.get(u'node').get(u'id'), var.get(u'node').get(u'params'), var.get(u'node').get(u'body'), var.get(u'node').get(u'generator'), var.get(u'node').get(u'expression'))))) + if var.get(u'path').get(u'parentPath').callprop(u'isBlockStatement'): + var.get(u'path').get(u'parentPath').callprop(u'unshiftContainer', Js(u'body'), var.get(u'assignment')) + var.get(u'path').callprop(u'remove') + else: + var.get(u'path').callprop(u'replaceWith', var.get(u'assignment')) + var.get(u'path').callprop(u'skip') + PyJs_FunctionDeclaration_1263_._set_name(u'FunctionDeclaration') + @Js + def PyJs_FunctionExpression_1264_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'FunctionExpression':PyJs_FunctionExpression_1264_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_FunctionExpression_1264_._set_name(u'FunctionExpression') + PyJs_Object_1258_ = Js({u'VariableDeclaration':PyJs_Object_1259_,u'ForStatement':PyJs_ForStatement_1261_,u'ForXStatement':PyJs_ForXStatement_1262_,u'FunctionDeclaration':PyJs_FunctionDeclaration_1263_,u'FunctionExpression':PyJs_FunctionExpression_1264_}) + var.get(u'funPath').callprop(u'get', Js(u'body')).callprop(u'traverse', PyJs_Object_1258_) + PyJs_Object_1265_ = Js({}) + var.put(u'paramNames', PyJs_Object_1265_) + @Js + def PyJs_anonymous_1266_(paramPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'paramPath':paramPath}, var) + var.registers([u'param', u'paramPath']) + var.put(u'param', var.get(u'paramPath').get(u'node')) + if var.get(u't').callprop(u'isIdentifier', var.get(u'param')): + var.get(u'paramNames').put(var.get(u'param').get(u'name'), var.get(u'param')) + else: + pass + PyJs_anonymous_1266_._set_name(u'anonymous') + var.get(u'funPath').callprop(u'get', Js(u'params')).callprop(u'forEach', PyJs_anonymous_1266_) + var.put(u'declarations', Js([])) + @Js + def PyJs_anonymous_1267_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + if var.get(u'hasOwn').callprop(u'call', var.get(u'paramNames'), var.get(u'name')).neg(): + var.get(u'declarations').callprop(u'push', var.get(u't').callprop(u'variableDeclarator', var.get(u'vars').get(var.get(u'name')), var.get(u"null"))) + PyJs_anonymous_1267_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'vars')).callprop(u'forEach', PyJs_anonymous_1267_) + if PyJsStrictEq(var.get(u'declarations').get(u'length'),Js(0.0)): + return var.get(u"null") + return var.get(u't').callprop(u'variableDeclaration', Js(u'var'), var.get(u'declarations')) + PyJs_anonymous_1255_._set_name(u'anonymous') + var.get(u'exports').put(u'hoist', PyJs_anonymous_1255_) +PyJs_anonymous_1252_._set_name(u'anonymous') +PyJs_Object_1268_ = Js({u'babel-runtime/core-js/object/keys':Js(103.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1269_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_1270_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'require')(Js(u'./visit')) + PyJs_anonymous_1270_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1270_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1269_._set_name(u'anonymous') +PyJs_Object_1271_ = Js({u'./visit':Js(93.0)}) +@Js +def PyJs_anonymous_1272_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'CatchEntry', u'LabeledEntry', u'SwitchEntry', u'module', u'TryEntry', u'_interopRequireWildcard', u'LMp', u'_assert2', u'require', u'_babelTypes', u'exports', u'_util', u'LeapManager', u't', u'_assert', u'FunctionEntry', u'_interopRequireDefault', u'Entry', u'LoopEntry', u'FinallyEntry']) + @Js + def PyJsHoisted_CatchEntry_(firstLoc, paramId, this, arguments, var=var): + var = Scope({u'firstLoc':firstLoc, u'this':this, u'paramId':paramId, u'arguments':arguments}, var) + var.registers([u'firstLoc', u'paramId']) + var.get(u'Entry').callprop(u'call', var.get(u"this")) + var.get(u't').callprop(u'assertLiteral', var.get(u'firstLoc')) + var.get(u't').callprop(u'assertIdentifier', var.get(u'paramId')) + var.get(u"this").put(u'firstLoc', var.get(u'firstLoc')) + var.get(u"this").put(u'paramId', var.get(u'paramId')) + PyJsHoisted_CatchEntry_.func_name = u'CatchEntry' + var.put(u'CatchEntry', PyJsHoisted_CatchEntry_) + @Js + def PyJsHoisted_LabeledEntry_(breakLoc, label, this, arguments, var=var): + var = Scope({u'this':this, u'breakLoc':breakLoc, u'arguments':arguments, u'label':label}, var) + var.registers([u'breakLoc', u'label']) + var.get(u'Entry').callprop(u'call', var.get(u"this")) + var.get(u't').callprop(u'assertLiteral', var.get(u'breakLoc')) + var.get(u't').callprop(u'assertIdentifier', var.get(u'label')) + var.get(u"this").put(u'breakLoc', var.get(u'breakLoc')) + var.get(u"this").put(u'label', var.get(u'label')) + PyJsHoisted_LabeledEntry_.func_name = u'LabeledEntry' + var.put(u'LabeledEntry', PyJsHoisted_LabeledEntry_) + @Js + def PyJsHoisted_SwitchEntry_(breakLoc, this, arguments, var=var): + var = Scope({u'this':this, u'breakLoc':breakLoc, u'arguments':arguments}, var) + var.registers([u'breakLoc']) + var.get(u'Entry').callprop(u'call', var.get(u"this")) + var.get(u't').callprop(u'assertLiteral', var.get(u'breakLoc')) + var.get(u"this").put(u'breakLoc', var.get(u'breakLoc')) + PyJsHoisted_SwitchEntry_.func_name = u'SwitchEntry' + var.put(u'SwitchEntry', PyJsHoisted_SwitchEntry_) + @Js + def PyJsHoisted_TryEntry_(firstLoc, catchEntry, finallyEntry, this, arguments, var=var): + var = Scope({u'firstLoc':firstLoc, u'catchEntry':catchEntry, u'this':this, u'arguments':arguments, u'finallyEntry':finallyEntry}, var) + var.registers([u'firstLoc', u'catchEntry', u'finallyEntry']) + var.get(u'Entry').callprop(u'call', var.get(u"this")) + var.get(u't').callprop(u'assertLiteral', var.get(u'firstLoc')) + if var.get(u'catchEntry'): + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u'catchEntry').instanceof(var.get(u'CatchEntry'))) + else: + var.put(u'catchEntry', var.get(u"null")) + if var.get(u'finallyEntry'): + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u'finallyEntry').instanceof(var.get(u'FinallyEntry'))) + else: + var.put(u'finallyEntry', var.get(u"null")) + var.get(u'_assert2').get(u'default').callprop(u'ok', (var.get(u'catchEntry') or var.get(u'finallyEntry'))) + var.get(u"this").put(u'firstLoc', var.get(u'firstLoc')) + var.get(u"this").put(u'catchEntry', var.get(u'catchEntry')) + var.get(u"this").put(u'finallyEntry', var.get(u'finallyEntry')) + PyJsHoisted_TryEntry_.func_name = u'TryEntry' + var.put(u'TryEntry', PyJsHoisted_TryEntry_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1273_ = Js({}) + var.put(u'newObj', PyJs_Object_1273_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_LeapManager_(emitter, this, arguments, var=var): + var = Scope({u'this':this, u'emitter':emitter, u'arguments':arguments}, var) + var.registers([u'Emitter', u'emitter']) + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u"this").instanceof(var.get(u'LeapManager'))) + var.put(u'Emitter', var.get(u'require')(Js(u'./emit')).get(u'Emitter')) + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u'emitter').instanceof(var.get(u'Emitter'))) + var.get(u"this").put(u'emitter', var.get(u'emitter')) + var.get(u"this").put(u'entryStack', Js([var.get(u'FunctionEntry').create(var.get(u'emitter').get(u'finalLoc'))])) + PyJsHoisted_LeapManager_.func_name = u'LeapManager' + var.put(u'LeapManager', PyJsHoisted_LeapManager_) + @Js + def PyJsHoisted_FunctionEntry_(returnLoc, this, arguments, var=var): + var = Scope({u'this':this, u'returnLoc':returnLoc, u'arguments':arguments}, var) + var.registers([u'returnLoc']) + var.get(u'Entry').callprop(u'call', var.get(u"this")) + var.get(u't').callprop(u'assertLiteral', var.get(u'returnLoc')) + var.get(u"this").put(u'returnLoc', var.get(u'returnLoc')) + PyJsHoisted_FunctionEntry_.func_name = u'FunctionEntry' + var.put(u'FunctionEntry', PyJsHoisted_FunctionEntry_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1274_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1274_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_Entry_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u"this").instanceof(var.get(u'Entry'))) + PyJsHoisted_Entry_.func_name = u'Entry' + var.put(u'Entry', PyJsHoisted_Entry_) + @Js + def PyJsHoisted_LoopEntry_(breakLoc, continueLoc, label, this, arguments, var=var): + var = Scope({u'continueLoc':continueLoc, u'breakLoc':breakLoc, u'this':this, u'arguments':arguments, u'label':label}, var) + var.registers([u'continueLoc', u'breakLoc', u'label']) + var.get(u'Entry').callprop(u'call', var.get(u"this")) + var.get(u't').callprop(u'assertLiteral', var.get(u'breakLoc')) + var.get(u't').callprop(u'assertLiteral', var.get(u'continueLoc')) + if var.get(u'label'): + var.get(u't').callprop(u'assertIdentifier', var.get(u'label')) + else: + var.put(u'label', var.get(u"null")) + var.get(u"this").put(u'breakLoc', var.get(u'breakLoc')) + var.get(u"this").put(u'continueLoc', var.get(u'continueLoc')) + var.get(u"this").put(u'label', var.get(u'label')) + PyJsHoisted_LoopEntry_.func_name = u'LoopEntry' + var.put(u'LoopEntry', PyJsHoisted_LoopEntry_) + @Js + def PyJsHoisted_FinallyEntry_(firstLoc, afterLoc, this, arguments, var=var): + var = Scope({u'firstLoc':firstLoc, u'this':this, u'afterLoc':afterLoc, u'arguments':arguments}, var) + var.registers([u'firstLoc', u'afterLoc']) + var.get(u'Entry').callprop(u'call', var.get(u"this")) + var.get(u't').callprop(u'assertLiteral', var.get(u'firstLoc')) + var.get(u't').callprop(u'assertLiteral', var.get(u'afterLoc')) + var.get(u"this").put(u'firstLoc', var.get(u'firstLoc')) + var.get(u"this").put(u'afterLoc', var.get(u'afterLoc')) + PyJsHoisted_FinallyEntry_.func_name = u'FinallyEntry' + var.put(u'FinallyEntry', PyJsHoisted_FinallyEntry_) + Js(u'use strict') + var.put(u'_assert', var.get(u'require')(Js(u'assert'))) + var.put(u'_assert2', var.get(u'_interopRequireDefault')(var.get(u'_assert'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_util', var.get(u'require')(Js(u'util'))) + pass + pass + pass + pass + PyJsComma(Js(0.0),var.get(u'_util').get(u'inherits'))(var.get(u'FunctionEntry'), var.get(u'Entry')) + var.get(u'exports').put(u'FunctionEntry', var.get(u'FunctionEntry')) + pass + PyJsComma(Js(0.0),var.get(u'_util').get(u'inherits'))(var.get(u'LoopEntry'), var.get(u'Entry')) + var.get(u'exports').put(u'LoopEntry', var.get(u'LoopEntry')) + pass + PyJsComma(Js(0.0),var.get(u'_util').get(u'inherits'))(var.get(u'SwitchEntry'), var.get(u'Entry')) + var.get(u'exports').put(u'SwitchEntry', var.get(u'SwitchEntry')) + pass + PyJsComma(Js(0.0),var.get(u'_util').get(u'inherits'))(var.get(u'TryEntry'), var.get(u'Entry')) + var.get(u'exports').put(u'TryEntry', var.get(u'TryEntry')) + pass + PyJsComma(Js(0.0),var.get(u'_util').get(u'inherits'))(var.get(u'CatchEntry'), var.get(u'Entry')) + var.get(u'exports').put(u'CatchEntry', var.get(u'CatchEntry')) + pass + PyJsComma(Js(0.0),var.get(u'_util').get(u'inherits'))(var.get(u'FinallyEntry'), var.get(u'Entry')) + var.get(u'exports').put(u'FinallyEntry', var.get(u'FinallyEntry')) + pass + PyJsComma(Js(0.0),var.get(u'_util').get(u'inherits'))(var.get(u'LabeledEntry'), var.get(u'Entry')) + var.get(u'exports').put(u'LabeledEntry', var.get(u'LabeledEntry')) + pass + var.put(u'LMp', var.get(u'LeapManager').get(u'prototype')) + var.get(u'exports').put(u'LeapManager', var.get(u'LeapManager')) + @Js + def PyJs_anonymous_1275_(entry, callback, this, arguments, var=var): + var = Scope({u'this':this, u'entry':entry, u'arguments':arguments, u'callback':callback}, var) + var.registers([u'entry', u'popped', u'callback']) + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u'entry').instanceof(var.get(u'Entry'))) + var.get(u"this").get(u'entryStack').callprop(u'push', var.get(u'entry')) + try: + var.get(u'callback').callprop(u'call', var.get(u"this").get(u'emitter')) + finally: + var.put(u'popped', var.get(u"this").get(u'entryStack').callprop(u'pop')) + var.get(u'_assert2').get(u'default').callprop(u'strictEqual', var.get(u'popped'), var.get(u'entry')) + PyJs_anonymous_1275_._set_name(u'anonymous') + var.get(u'LMp').put(u'withEntry', PyJs_anonymous_1275_) + @Js + def PyJs_anonymous_1276_(property, label, this, arguments, var=var): + var = Scope({u'this':this, u'property':property, u'arguments':arguments, u'label':label}, var) + var.registers([u'i', u'entry', u'property', u'label', u'loc']) + #for JS loop + var.put(u'i', (var.get(u"this").get(u'entryStack').get(u'length')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + var.put(u'entry', var.get(u"this").get(u'entryStack').get(var.get(u'i'))) + var.put(u'loc', var.get(u'entry').get(var.get(u'property'))) + if var.get(u'loc'): + if var.get(u'label'): + if (var.get(u'entry').get(u'label') and PyJsStrictEq(var.get(u'entry').get(u'label').get(u'name'),var.get(u'label').get(u'name'))): + return var.get(u'loc') + else: + if var.get(u'entry').instanceof(var.get(u'LabeledEntry')): + pass + else: + return var.get(u'loc') + finally: + var.put(u'i',Js(var.get(u'i').to_number())-Js(1)) + return var.get(u"null") + PyJs_anonymous_1276_._set_name(u'anonymous') + var.get(u'LMp').put(u'_findLeapLocation', PyJs_anonymous_1276_) + @Js + def PyJs_anonymous_1277_(label, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'label':label}, var) + var.registers([u'label']) + return var.get(u"this").callprop(u'_findLeapLocation', Js(u'breakLoc'), var.get(u'label')) + PyJs_anonymous_1277_._set_name(u'anonymous') + var.get(u'LMp').put(u'getBreakLoc', PyJs_anonymous_1277_) + @Js + def PyJs_anonymous_1278_(label, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'label':label}, var) + var.registers([u'label']) + return var.get(u"this").callprop(u'_findLeapLocation', Js(u'continueLoc'), var.get(u'label')) + PyJs_anonymous_1278_._set_name(u'anonymous') + var.get(u'LMp').put(u'getContinueLoc', PyJs_anonymous_1278_) +PyJs_anonymous_1272_._set_name(u'anonymous') +PyJs_Object_1279_ = Js({u'./emit':Js(87.0),u'assert':Js(524.0),u'babel-types':Js(258.0),u'util':Js(534.0)}) +@Js +def PyJs_anonymous_1280_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'sideEffectTypes', u'opaqueTypes', u'_interopRequireWildcard', u'leapTypes', u'_assert2', u'require', u'_babelTypes', u'm', u'exports', u'hasOwn', u'makePredicate', u't', u'_assert', u'_interopRequireDefault', u'type']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1282_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1282_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_makePredicate_(propertyName, knownTypes, this, arguments, var=var): + var = Scope({u'this':this, u'propertyName':propertyName, u'arguments':arguments, u'knownTypes':knownTypes}, var) + var.registers([u'predicate', u'onlyChildren', u'propertyName', u'knownTypes']) + @Js + def PyJsHoisted_predicate_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'meta']) + var.get(u't').callprop(u'assertNode', var.get(u'node')) + var.put(u'meta', var.get(u'm')(var.get(u'node'))) + if var.get(u'hasOwn').callprop(u'call', var.get(u'meta'), var.get(u'propertyName')): + return var.get(u'meta').get(var.get(u'propertyName')) + if var.get(u'hasOwn').callprop(u'call', var.get(u'opaqueTypes'), var.get(u'node').get(u'type')): + return var.get(u'meta').put(var.get(u'propertyName'), Js(False)) + if var.get(u'hasOwn').callprop(u'call', var.get(u'knownTypes'), var.get(u'node').get(u'type')): + return var.get(u'meta').put(var.get(u'propertyName'), var.get(u'true')) + return var.get(u'meta').put(var.get(u'propertyName'), var.get(u'onlyChildren')(var.get(u'node'))) + PyJsHoisted_predicate_.func_name = u'predicate' + var.put(u'predicate', PyJsHoisted_predicate_) + @Js + def PyJsHoisted_onlyChildren_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'keys', u'i', u'result', u'key', u'child', u'check']) + @Js + def PyJsHoisted_check_(child, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'child':child}, var) + var.registers([u'child']) + if var.get(u'result'): + pass + else: + if var.get(u'Array').callprop(u'isArray', var.get(u'child')): + var.get(u'child').callprop(u'some', var.get(u'check')) + else: + if var.get(u't').callprop(u'isNode', var.get(u'child')): + var.get(u'_assert2').get(u'default').callprop(u'strictEqual', var.get(u'result'), Js(False)) + var.put(u'result', var.get(u'predicate')(var.get(u'child'))) + return var.get(u'result') + PyJsHoisted_check_.func_name = u'check' + var.put(u'check', PyJsHoisted_check_) + var.get(u't').callprop(u'assertNode', var.get(u'node')) + var.put(u'result', Js(False)) + pass + var.put(u'keys', var.get(u't').get(u'VISITOR_KEYS').get(var.get(u'node').get(u'type'))) + if var.get(u'keys'): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'keys').get(u'length')): + try: + var.put(u'key', var.get(u'keys').get(var.get(u'i'))) + var.put(u'child', var.get(u'node').get(var.get(u'key'))) + var.get(u'check')(var.get(u'child')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'result') + PyJsHoisted_onlyChildren_.func_name = u'onlyChildren' + var.put(u'onlyChildren', PyJsHoisted_onlyChildren_) + pass + pass + var.get(u'predicate').put(u'onlyChildren', var.get(u'onlyChildren')) + return var.get(u'predicate') + PyJsHoisted_makePredicate_.func_name = u'makePredicate' + var.put(u'makePredicate', PyJsHoisted_makePredicate_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1281_ = Js({}) + var.put(u'newObj', PyJs_Object_1281_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.put(u'_assert', var.get(u'require')(Js(u'assert'))) + var.put(u'_assert2', var.get(u'_interopRequireDefault')(var.get(u'_assert'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'm', var.get(u'require')(Js(u'private')).callprop(u'makeAccessor')) + var.put(u'hasOwn', var.get(u'Object').get(u'prototype').get(u'hasOwnProperty')) + pass + PyJs_Object_1283_ = Js({u'FunctionExpression':var.get(u'true')}) + var.put(u'opaqueTypes', PyJs_Object_1283_) + PyJs_Object_1284_ = Js({u'CallExpression':var.get(u'true'),u'ForInStatement':var.get(u'true'),u'UnaryExpression':var.get(u'true'),u'BinaryExpression':var.get(u'true'),u'AssignmentExpression':var.get(u'true'),u'UpdateExpression':var.get(u'true'),u'NewExpression':var.get(u'true')}) + var.put(u'sideEffectTypes', PyJs_Object_1284_) + PyJs_Object_1285_ = Js({u'YieldExpression':var.get(u'true'),u'BreakStatement':var.get(u'true'),u'ContinueStatement':var.get(u'true'),u'ReturnStatement':var.get(u'true'),u'ThrowStatement':var.get(u'true')}) + var.put(u'leapTypes', PyJs_Object_1285_) + for PyJsTemp in var.get(u'leapTypes'): + var.put(u'type', PyJsTemp) + if var.get(u'hasOwn').callprop(u'call', var.get(u'leapTypes'), var.get(u'type')): + var.get(u'sideEffectTypes').put(var.get(u'type'), var.get(u'leapTypes').get(var.get(u'type'))) + var.get(u'exports').put(u'hasSideEffects', var.get(u'makePredicate')(Js(u'hasSideEffects'), var.get(u'sideEffectTypes'))) + var.get(u'exports').put(u'containsLeap', var.get(u'makePredicate')(Js(u'containsLeap'), var.get(u'leapTypes'))) +PyJs_anonymous_1280_._set_name(u'anonymous') +PyJs_Object_1286_ = Js({u'assert':Js(524.0),u'babel-types':Js(258.0),u'private':Js(500.0)}) +@Js +def PyJs_anonymous_1287_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'runtimeProperty', u'require', u'_babelTypes', u'module', u't', u'isReference']) + @Js + def PyJsHoisted_runtimeProperty_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'regeneratorRuntime')), var.get(u't').callprop(u'identifier', var.get(u'name')), Js(False)) + PyJsHoisted_runtimeProperty_.func_name = u'runtimeProperty' + var.put(u'runtimeProperty', PyJsHoisted_runtimeProperty_) + @Js + def PyJsHoisted_isReference_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + PyJs_Object_1289_ = Js({u'left':var.get(u'path').get(u'node')}) + return (var.get(u'path').callprop(u'isReferenced') or var.get(u'path').get(u'parentPath').callprop(u'isAssignmentExpression', PyJs_Object_1289_)) + PyJsHoisted_isReference_.func_name = u'isReference' + var.put(u'isReference', PyJsHoisted_isReference_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1288_ = Js({}) + var.put(u'newObj', PyJs_Object_1288_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'runtimeProperty', var.get(u'runtimeProperty')) + var.get(u'exports').put(u'isReference', var.get(u'isReference')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass +PyJs_anonymous_1287_._set_name(u'anonymous') +PyJs_Object_1290_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1291_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'exports', u'_emit', u'awaitVisitor', u'_interopRequireWildcard', u'_assert2', u'require', u'_babelTypes', u'getMarkInfo', u'_util', u'functionSentVisitor', u'util', u'renameArguments', u'getOuterFnExpr', u't', u'_assert', u'getRuntimeMarkDecl', u'_interopRequireDefault', u'_hoist', u'argumentsVisitor']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1293_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1293_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_getRuntimeMarkDecl_(blockPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'blockPath':blockPath}, var) + var.registers([u'info', u'block', u'blockPath']) + var.put(u'block', var.get(u'blockPath').get(u'node')) + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u'Array').callprop(u'isArray', var.get(u'block').get(u'body'))) + var.put(u'info', var.get(u'getMarkInfo')(var.get(u'block'))) + if var.get(u'info').get(u'decl'): + return var.get(u'info').get(u'decl') + def PyJs_LONG_1300_(var=var): + return var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'blockPath').get(u'scope').callprop(u'generateUidIdentifier', Js(u'marked')), var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'arrayExpression', Js([])), var.get(u't').callprop(u'identifier', Js(u'map')), Js(False)), Js([var.get(u'util').callprop(u'runtimeProperty', Js(u'mark'))])))])) + var.get(u'info').put(u'decl', PyJs_LONG_1300_()) + var.get(u'blockPath').callprop(u'unshiftContainer', Js(u'body'), var.get(u'info').get(u'decl')) + return var.get(u'info').get(u'decl') + PyJsHoisted_getRuntimeMarkDecl_.func_name = u'getRuntimeMarkDecl' + var.put(u'getRuntimeMarkDecl', PyJsHoisted_getRuntimeMarkDecl_) + @Js + def PyJsHoisted_getOuterFnExpr_(funPath, this, arguments, var=var): + var = Scope({u'this':this, u'funPath':funPath, u'arguments':arguments}, var) + var.registers([u'node', u'index', u'pp', u'markedArray', u'funDeclIdArray', u'markDecl', u'funPath']) + var.put(u'node', var.get(u'funPath').get(u'node')) + var.get(u't').callprop(u'assertFunction', var.get(u'node')) + if var.get(u'node').get(u'id').neg(): + var.get(u'node').put(u'id', var.get(u'funPath').get(u'scope').get(u'parent').callprop(u'generateUidIdentifier', Js(u'callee'))) + if (var.get(u'node').get(u'generator') and var.get(u't').callprop(u'isFunctionDeclaration', var.get(u'node'))): + @Js + def PyJs_anonymous_1299_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u'path').callprop(u'isProgram') or var.get(u'path').callprop(u'isBlockStatement')) + PyJs_anonymous_1299_._set_name(u'anonymous') + var.put(u'pp', var.get(u'funPath').callprop(u'findParent', PyJs_anonymous_1299_)) + if var.get(u'pp').neg(): + return var.get(u'node').get(u'id') + var.put(u'markDecl', var.get(u'getRuntimeMarkDecl')(var.get(u'pp'))) + var.put(u'markedArray', var.get(u'markDecl').get(u'declarations').get(u'0').get(u'id')) + var.put(u'funDeclIdArray', var.get(u'markDecl').get(u'declarations').get(u'0').get(u'init').get(u'callee').get(u'object')) + var.get(u't').callprop(u'assertArrayExpression', var.get(u'funDeclIdArray')) + var.put(u'index', var.get(u'funDeclIdArray').get(u'elements').get(u'length')) + var.get(u'funDeclIdArray').get(u'elements').callprop(u'push', var.get(u'node').get(u'id')) + return var.get(u't').callprop(u'memberExpression', var.get(u'markedArray'), var.get(u't').callprop(u'numericLiteral', var.get(u'index')), var.get(u'true')) + return var.get(u'node').get(u'id') + PyJsHoisted_getOuterFnExpr_.func_name = u'getOuterFnExpr' + var.put(u'getOuterFnExpr', PyJsHoisted_getOuterFnExpr_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1292_ = Js({}) + var.put(u'newObj', PyJs_Object_1292_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_renameArguments_(funcPath, argsId, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'argsId':argsId, u'funcPath':funcPath}, var) + var.registers([u'state', u'argsId', u'funcPath']) + PyJs_Object_1301_ = Js({u'didRenameArguments':Js(False),u'argsId':var.get(u'argsId')}) + var.put(u'state', PyJs_Object_1301_) + var.get(u'funcPath').callprop(u'traverse', var.get(u'argumentsVisitor'), var.get(u'state')) + return var.get(u'state').get(u'didRenameArguments') + PyJsHoisted_renameArguments_.func_name = u'renameArguments' + var.put(u'renameArguments', PyJsHoisted_renameArguments_) + Js(u'use strict') + var.put(u'_assert', var.get(u'require')(Js(u'assert'))) + var.put(u'_assert2', var.get(u'_interopRequireDefault')(var.get(u'_assert'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_hoist', var.get(u'require')(Js(u'./hoist'))) + var.put(u'_emit', var.get(u'require')(Js(u'./emit'))) + var.put(u'_util', var.get(u'require')(Js(u'./util'))) + var.put(u'util', var.get(u'_interopRequireWildcard')(var.get(u'_util'))) + pass + pass + var.put(u'getMarkInfo', var.get(u'require')(Js(u'private')).callprop(u'makeAccessor')) + @Js + def PyJs_exit_1296_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'exit':PyJs_exit_1296_, u'arguments':arguments}, var) + var.registers([u'node', u'contextId', u'wrapCall', u'vars', u'state', u'innerFnId', u'didRenameArguments', u'argsId', u'bodyBlockPath', u'outerBody', u'emitter', u'outerFnExpr', u'tryLocsList', u'path', u'wrapArgs', u'innerBody', u'wasGeneratorFunction']) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'node').get(u'generator'): + if var.get(u'node').get(u'async'): + if PyJsStrictEq(var.get(u'state').get(u'opts').get(u'asyncGenerators'),Js(False)): + return var.get('undefined') + else: + if PyJsStrictEq(var.get(u'state').get(u'opts').get(u'generators'),Js(False)): + return var.get('undefined') + else: + if var.get(u'node').get(u'async'): + if PyJsStrictEq(var.get(u'state').get(u'opts').get(u'async'),Js(False)): + return var.get('undefined') + else: + return var.get('undefined') + var.put(u'contextId', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'context'))) + var.put(u'argsId', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'args'))) + var.get(u'path').callprop(u'ensureBlock') + var.put(u'bodyBlockPath', var.get(u'path').callprop(u'get', Js(u'body'))) + if var.get(u'node').get(u'async'): + var.get(u'bodyBlockPath').callprop(u'traverse', var.get(u'awaitVisitor')) + PyJs_Object_1297_ = Js({u'context':var.get(u'contextId')}) + var.get(u'bodyBlockPath').callprop(u'traverse', var.get(u'functionSentVisitor'), PyJs_Object_1297_) + var.put(u'outerBody', Js([])) + var.put(u'innerBody', Js([])) + @Js + def PyJs_anonymous_1298_(childPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'childPath':childPath}, var) + var.registers([u'node', u'childPath']) + var.put(u'node', var.get(u'childPath').get(u'node')) + if (var.get(u'node') and (var.get(u'node').get(u'_blockHoist')!=var.get(u"null"))): + var.get(u'outerBody').callprop(u'push', var.get(u'node')) + else: + var.get(u'innerBody').callprop(u'push', var.get(u'node')) + PyJs_anonymous_1298_._set_name(u'anonymous') + var.get(u'bodyBlockPath').callprop(u'get', Js(u'body')).callprop(u'forEach', PyJs_anonymous_1298_) + if (var.get(u'outerBody').get(u'length')>Js(0.0)): + var.get(u'bodyBlockPath').get(u'node').put(u'body', var.get(u'innerBody')) + var.put(u'outerFnExpr', var.get(u'getOuterFnExpr')(var.get(u'path'))) + var.get(u't').callprop(u'assertIdentifier', var.get(u'node').get(u'id')) + var.put(u'innerFnId', var.get(u't').callprop(u'identifier', (var.get(u'node').get(u'id').get(u'name')+Js(u'$')))) + var.put(u'vars', PyJsComma(Js(0.0),var.get(u'_hoist').get(u'hoist'))(var.get(u'path'))) + var.put(u'didRenameArguments', var.get(u'renameArguments')(var.get(u'path'), var.get(u'argsId'))) + if var.get(u'didRenameArguments'): + var.put(u'vars', (var.get(u'vars') or var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([])))) + var.get(u'vars').get(u'declarations').callprop(u'push', var.get(u't').callprop(u'variableDeclarator', var.get(u'argsId'), var.get(u't').callprop(u'identifier', Js(u'arguments')))) + var.put(u'emitter', var.get(u'_emit').get(u'Emitter').create(var.get(u'contextId'))) + var.get(u'emitter').callprop(u'explode', var.get(u'path').callprop(u'get', Js(u'body'))) + if (var.get(u'vars') and (var.get(u'vars').get(u'declarations').get(u'length')>Js(0.0))): + var.get(u'outerBody').callprop(u'push', var.get(u'vars')) + var.put(u'wrapArgs', Js([var.get(u'emitter').callprop(u'getContextFunction', var.get(u'innerFnId')), (var.get(u'outerFnExpr') if var.get(u'node').get(u'generator') else var.get(u't').callprop(u'nullLiteral')), var.get(u't').callprop(u'thisExpression')])) + var.put(u'tryLocsList', var.get(u'emitter').callprop(u'getTryLocsList')) + if var.get(u'tryLocsList'): + var.get(u'wrapArgs').callprop(u'push', var.get(u'tryLocsList')) + var.put(u'wrapCall', var.get(u't').callprop(u'callExpression', var.get(u'util').callprop(u'runtimeProperty', (Js(u'async') if var.get(u'node').get(u'async') else Js(u'wrap'))), var.get(u'wrapArgs'))) + var.get(u'outerBody').callprop(u'push', var.get(u't').callprop(u'returnStatement', var.get(u'wrapCall'))) + var.get(u'node').put(u'body', var.get(u't').callprop(u'blockStatement', var.get(u'outerBody'))) + var.put(u'wasGeneratorFunction', var.get(u'node').get(u'generator')) + if var.get(u'wasGeneratorFunction'): + var.get(u'node').put(u'generator', Js(False)) + if var.get(u'node').get(u'async'): + var.get(u'node').put(u'async', Js(False)) + if (var.get(u'wasGeneratorFunction') and var.get(u't').callprop(u'isExpression', var.get(u'node'))): + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'callExpression', var.get(u'util').callprop(u'runtimeProperty', Js(u'mark')), Js([var.get(u'node')]))) + var.get(u'path').callprop(u'requeue') + PyJs_exit_1296_._set_name(u'exit') + PyJs_Object_1295_ = Js({u'exit':PyJs_exit_1296_}) + PyJs_Object_1294_ = Js({u'Function':PyJs_Object_1295_}) + var.get(u'exports').put(u'visitor', PyJs_Object_1294_) + pass + pass + pass + @Js + def PyJs_FunctionExpressionFunctionDeclaration_1303_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'FunctionExpressionFunctionDeclaration':PyJs_FunctionExpressionFunctionDeclaration_1303_}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_FunctionExpressionFunctionDeclaration_1303_._set_name(u'FunctionExpressionFunctionDeclaration') + @Js + def PyJs_Identifier_1304_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'Identifier':PyJs_Identifier_1304_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if (PyJsStrictEq(var.get(u'path').get(u'node').get(u'name'),Js(u'arguments')) and var.get(u'util').callprop(u'isReference', var.get(u'path'))): + var.get(u'path').callprop(u'replaceWith', var.get(u'state').get(u'argsId')) + var.get(u'state').put(u'didRenameArguments', var.get(u'true')) + PyJs_Identifier_1304_._set_name(u'Identifier') + PyJs_Object_1302_ = Js({u'FunctionExpression|FunctionDeclaration':PyJs_FunctionExpressionFunctionDeclaration_1303_,u'Identifier':PyJs_Identifier_1304_}) + var.put(u'argumentsVisitor', PyJs_Object_1302_) + @Js + def PyJs_MetaProperty_1306_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'MetaProperty':PyJs_MetaProperty_1306_, u'arguments':arguments}, var) + var.registers([u'node', u'path']) + var.put(u'node', var.get(u'path').get(u'node')) + if (PyJsStrictEq(var.get(u'node').get(u'meta').get(u'name'),Js(u'function')) and PyJsStrictEq(var.get(u'node').get(u'property').get(u'name'),Js(u'sent'))): + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'memberExpression', var.get(u"this").get(u'context'), var.get(u't').callprop(u'identifier', Js(u'_sent')))) + PyJs_MetaProperty_1306_._set_name(u'MetaProperty') + PyJs_Object_1305_ = Js({u'MetaProperty':PyJs_MetaProperty_1306_}) + var.put(u'functionSentVisitor', PyJs_Object_1305_) + @Js + def PyJs_Function_1308_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_1308_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_Function_1308_._set_name(u'Function') + @Js + def PyJs_AwaitExpression_1309_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'AwaitExpression':PyJs_AwaitExpression_1309_}, var) + var.registers([u'path', u'argument']) + var.put(u'argument', var.get(u'path').get(u'node').get(u'argument')) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'yieldExpression', var.get(u't').callprop(u'callExpression', var.get(u'util').callprop(u'runtimeProperty', Js(u'awrap')), Js([var.get(u'argument')])), Js(False))) + PyJs_AwaitExpression_1309_._set_name(u'AwaitExpression') + PyJs_Object_1307_ = Js({u'Function':PyJs_Function_1308_,u'AwaitExpression':PyJs_AwaitExpression_1309_}) + var.put(u'awaitVisitor', PyJs_Object_1307_) +PyJs_anonymous_1291_._set_name(u'anonymous') +PyJs_Object_1310_ = Js({u'./emit':Js(87.0),u'./hoist':Js(88.0),u'./util':Js(92.0),u'assert':Js(524.0),u'babel-types':Js(258.0),u'private':Js(500.0)}) +@Js +def PyJs_anonymous_1311_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'require', u'_babelTypes', u'module', u't', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1317_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1317_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1316_ = Js({}) + var.put(u'newObj', PyJs_Object_1316_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_1312_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_Program_1315_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'Program':PyJs_Program_1315_, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'directive', u'state', u'_i', u'path', u'_ref']) + if (PyJsStrictEq(var.get(u'state').get(u'opts').get(u'strict'),Js(False)) or PyJsStrictEq(var.get(u'state').get(u'opts').get(u'strictMode'),Js(False))): + return var.get('undefined') + var.put(u'node', var.get(u'path').get(u'node')) + #for JS loop + var.put(u'_iterator', var.get(u'node').get(u'directives')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'directive', var.get(u'_ref')) + if PyJsStrictEq(var.get(u'directive').get(u'value').get(u'value'),Js(u'use strict')): + return var.get('undefined') + + var.get(u'path').callprop(u'unshiftContainer', Js(u'directives'), var.get(u't').callprop(u'directive', var.get(u't').callprop(u'directiveLiteral', Js(u'use strict')))) + PyJs_Program_1315_._set_name(u'Program') + PyJs_Object_1314_ = Js({u'Program':PyJs_Program_1315_}) + PyJs_Object_1313_ = Js({u'visitor':PyJs_Object_1314_}) + return PyJs_Object_1313_ + PyJs_anonymous_1312_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1312_) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1311_._set_name(u'anonymous') +PyJs_Object_1318_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1319_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_babelPluginTransformEs2015ModulesCommonjs', u'_babelPluginTransformEs2015ComputedProperties', u'_babelPluginTransformEs2015BlockScopedFunctions2', u'_babelPluginTransformEs2015ForOf2', u'_babelPluginTransformEs2015ModulesUmd', u'_babelPluginTransformEs2015ArrowFunctions', u'_babelPluginTransformEs2015TypeofSymbol', u'exports', u'module', u'_interopRequireDefault', u'_babelPluginTransformEs2015ForOf', u'_babelPluginTransformEs2015BlockScoping', u'_babelPluginTransformEs2015Parameters2', u'_babelPluginTransformEs2015TemplateLiterals', u'_babelPluginTransformEs2015ComputedProperties2', u'_babelPluginTransformEs2015Spread', u'_babelPluginCheckEs2015Constants', u'_babelPluginTransformEs2015Destructuring', u'_babelPluginTransformEs2015DuplicateKeys2', u'_babelPluginTransformEs2015ModulesCommonjs2', u'_babelPluginTransformEs2015TemplateLiterals2', u'_babelPluginTransformEs2015Parameters', u'_babelPluginCheckEs2015Constants2', u'_babelPluginTransformEs2015StickyRegex2', u'_babelPluginTransformEs2015BlockScopedFunctions', u'_babelPluginTransformEs2015ShorthandProperties2', u'_babelPluginTransformRegenerator', u'_babelPluginTransformEs2015ModulesSystemjs', u'_babelPluginTransformEs2015DuplicateKeys', u'_babelPluginTransformEs2015ModulesAmd2', u'_babelPluginTransformEs2015FunctionName', u'_babelPluginTransformEs2015ObjectSuper2', u'_babelPluginTransformEs2015Destructuring2', u'_babelPluginTransformEs2015ShorthandProperties', u'_babelPluginTransformEs2015StickyRegex', u'_babelPluginTransformEs2015ModulesAmd', u'_babelPluginTransformEs2015ModulesUmd2', u'_babelPluginTransformEs2015Classes2', u'preset', u'_babelPluginTransformEs2015ObjectSuper', u'_babelPluginTransformEs2015TypeofSymbol2', u'_babelPluginTransformEs2015UnicodeRegex', u'_babelPluginTransformEs2015Classes', u'_babelPluginTransformEs2015Literals2', u'_babelPluginTransformEs2015ModulesSystemjs2', u'_babelPluginTransformEs2015Literals', u'_babelPluginTransformEs2015UnicodeRegex2', u'_babelPluginTransformEs2015FunctionName2', u'_babelPluginTransformEs2015BlockScoping2', u'_babelPluginTransformRegenerator2', u'oldConfig', u'_babelPluginTransformEs2015Spread2', u'require', u'_babelPluginTransformEs2015ArrowFunctions2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1320_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1320_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_preset_(context, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'context':context}, var) + var.registers([u'optsLoose', u'moduleTypes', u'loose', u'modules', u'context', u'spec', u'opts']) + PyJs_Object_1321_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_1321_)) + var.put(u'moduleTypes', Js([Js(u'commonjs'), Js(u'amd'), Js(u'umd'), Js(u'systemjs')])) + var.put(u'loose', Js(False)) + var.put(u'modules', Js(u'commonjs')) + var.put(u'spec', Js(False)) + if PyJsStrictNeq(var.get(u'opts'),var.get(u'undefined')): + if PyJsStrictNeq(var.get(u'opts').get(u'loose'),var.get(u'undefined')): + var.put(u'loose', var.get(u'opts').get(u'loose')) + if PyJsStrictNeq(var.get(u'opts').get(u'modules'),var.get(u'undefined')): + var.put(u'modules', var.get(u'opts').get(u'modules')) + if PyJsStrictNeq(var.get(u'opts').get(u'spec'),var.get(u'undefined')): + var.put(u'spec', var.get(u'opts').get(u'spec')) + if PyJsStrictNeq(var.get(u'loose',throw=False).typeof(),Js(u'boolean')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"Preset es2015 'loose' option must be a boolean."))) + raise PyJsTempException + if PyJsStrictNeq(var.get(u'spec',throw=False).typeof(),Js(u'boolean')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"Preset es2015 'spec' option must be a boolean."))) + raise PyJsTempException + if (PyJsStrictNeq(var.get(u'modules'),Js(False)) and PyJsStrictEq(var.get(u'moduleTypes').callprop(u'indexOf', var.get(u'modules')),(-Js(1.0)))): + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u"Preset es2015 'modules' option must be 'false' to indicate no modules\n")+Js(u"or a module type which be be one of: 'commonjs' (default), 'amd', 'umd', 'systemjs'")))) + raise PyJsTempException + PyJs_Object_1322_ = Js({u'loose':var.get(u'loose')}) + var.put(u'optsLoose', PyJs_Object_1322_) + def PyJs_LONG_1327_(var=var): + PyJs_Object_1324_ = Js({u'loose':var.get(u'loose'),u'spec':var.get(u'spec')}) + PyJs_Object_1325_ = Js({u'spec':var.get(u'spec')}) + PyJs_Object_1326_ = Js({u'async':Js(False),u'asyncGenerators':Js(False)}) + return Js([Js([var.get(u'_babelPluginTransformEs2015TemplateLiterals2').get(u'default'), PyJs_Object_1324_]), var.get(u'_babelPluginTransformEs2015Literals2').get(u'default'), var.get(u'_babelPluginTransformEs2015FunctionName2').get(u'default'), Js([var.get(u'_babelPluginTransformEs2015ArrowFunctions2').get(u'default'), PyJs_Object_1325_]), var.get(u'_babelPluginTransformEs2015BlockScopedFunctions2').get(u'default'), Js([var.get(u'_babelPluginTransformEs2015Classes2').get(u'default'), var.get(u'optsLoose')]), var.get(u'_babelPluginTransformEs2015ObjectSuper2').get(u'default'), var.get(u'_babelPluginTransformEs2015ShorthandProperties2').get(u'default'), var.get(u'_babelPluginTransformEs2015DuplicateKeys2').get(u'default'), Js([var.get(u'_babelPluginTransformEs2015ComputedProperties2').get(u'default'), var.get(u'optsLoose')]), Js([var.get(u'_babelPluginTransformEs2015ForOf2').get(u'default'), var.get(u'optsLoose')]), var.get(u'_babelPluginTransformEs2015StickyRegex2').get(u'default'), var.get(u'_babelPluginTransformEs2015UnicodeRegex2').get(u'default'), var.get(u'_babelPluginCheckEs2015Constants2').get(u'default'), Js([var.get(u'_babelPluginTransformEs2015Spread2').get(u'default'), var.get(u'optsLoose')]), var.get(u'_babelPluginTransformEs2015Parameters2').get(u'default'), Js([var.get(u'_babelPluginTransformEs2015Destructuring2').get(u'default'), var.get(u'optsLoose')]), var.get(u'_babelPluginTransformEs2015BlockScoping2').get(u'default'), var.get(u'_babelPluginTransformEs2015TypeofSymbol2').get(u'default'), (PyJsStrictEq(var.get(u'modules'),Js(u'commonjs')) and Js([var.get(u'_babelPluginTransformEs2015ModulesCommonjs2').get(u'default'), var.get(u'optsLoose')])), (PyJsStrictEq(var.get(u'modules'),Js(u'systemjs')) and Js([var.get(u'_babelPluginTransformEs2015ModulesSystemjs2').get(u'default'), var.get(u'optsLoose')])), (PyJsStrictEq(var.get(u'modules'),Js(u'amd')) and Js([var.get(u'_babelPluginTransformEs2015ModulesAmd2').get(u'default'), var.get(u'optsLoose')])), (PyJsStrictEq(var.get(u'modules'),Js(u'umd')) and Js([var.get(u'_babelPluginTransformEs2015ModulesUmd2').get(u'default'), var.get(u'optsLoose')])), Js([var.get(u'_babelPluginTransformRegenerator2').get(u'default'), PyJs_Object_1326_])]).callprop(u'filter', var.get(u'Boolean')) + PyJs_Object_1323_ = Js({u'plugins':PyJs_LONG_1327_()}) + return PyJs_Object_1323_ + PyJsHoisted_preset_.func_name = u'preset' + var.put(u'preset', PyJsHoisted_preset_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_babelPluginTransformEs2015TemplateLiterals', var.get(u'require')(Js(u'babel-plugin-transform-es2015-template-literals'))) + var.put(u'_babelPluginTransformEs2015TemplateLiterals2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015TemplateLiterals'))) + var.put(u'_babelPluginTransformEs2015Literals', var.get(u'require')(Js(u'babel-plugin-transform-es2015-literals'))) + var.put(u'_babelPluginTransformEs2015Literals2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015Literals'))) + var.put(u'_babelPluginTransformEs2015FunctionName', var.get(u'require')(Js(u'babel-plugin-transform-es2015-function-name'))) + var.put(u'_babelPluginTransformEs2015FunctionName2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015FunctionName'))) + var.put(u'_babelPluginTransformEs2015ArrowFunctions', var.get(u'require')(Js(u'babel-plugin-transform-es2015-arrow-functions'))) + var.put(u'_babelPluginTransformEs2015ArrowFunctions2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ArrowFunctions'))) + var.put(u'_babelPluginTransformEs2015BlockScopedFunctions', var.get(u'require')(Js(u'babel-plugin-transform-es2015-block-scoped-functions'))) + var.put(u'_babelPluginTransformEs2015BlockScopedFunctions2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015BlockScopedFunctions'))) + var.put(u'_babelPluginTransformEs2015Classes', var.get(u'require')(Js(u'babel-plugin-transform-es2015-classes'))) + var.put(u'_babelPluginTransformEs2015Classes2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015Classes'))) + var.put(u'_babelPluginTransformEs2015ObjectSuper', var.get(u'require')(Js(u'babel-plugin-transform-es2015-object-super'))) + var.put(u'_babelPluginTransformEs2015ObjectSuper2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ObjectSuper'))) + var.put(u'_babelPluginTransformEs2015ShorthandProperties', var.get(u'require')(Js(u'babel-plugin-transform-es2015-shorthand-properties'))) + var.put(u'_babelPluginTransformEs2015ShorthandProperties2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ShorthandProperties'))) + var.put(u'_babelPluginTransformEs2015DuplicateKeys', var.get(u'require')(Js(u'babel-plugin-transform-es2015-duplicate-keys'))) + var.put(u'_babelPluginTransformEs2015DuplicateKeys2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015DuplicateKeys'))) + var.put(u'_babelPluginTransformEs2015ComputedProperties', var.get(u'require')(Js(u'babel-plugin-transform-es2015-computed-properties'))) + var.put(u'_babelPluginTransformEs2015ComputedProperties2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ComputedProperties'))) + var.put(u'_babelPluginTransformEs2015ForOf', var.get(u'require')(Js(u'babel-plugin-transform-es2015-for-of'))) + var.put(u'_babelPluginTransformEs2015ForOf2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ForOf'))) + var.put(u'_babelPluginTransformEs2015StickyRegex', var.get(u'require')(Js(u'babel-plugin-transform-es2015-sticky-regex'))) + var.put(u'_babelPluginTransformEs2015StickyRegex2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015StickyRegex'))) + var.put(u'_babelPluginTransformEs2015UnicodeRegex', var.get(u'require')(Js(u'babel-plugin-transform-es2015-unicode-regex'))) + var.put(u'_babelPluginTransformEs2015UnicodeRegex2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015UnicodeRegex'))) + var.put(u'_babelPluginCheckEs2015Constants', var.get(u'require')(Js(u'babel-plugin-check-es2015-constants'))) + var.put(u'_babelPluginCheckEs2015Constants2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginCheckEs2015Constants'))) + var.put(u'_babelPluginTransformEs2015Spread', var.get(u'require')(Js(u'babel-plugin-transform-es2015-spread'))) + var.put(u'_babelPluginTransformEs2015Spread2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015Spread'))) + var.put(u'_babelPluginTransformEs2015Parameters', var.get(u'require')(Js(u'babel-plugin-transform-es2015-parameters'))) + var.put(u'_babelPluginTransformEs2015Parameters2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015Parameters'))) + var.put(u'_babelPluginTransformEs2015Destructuring', var.get(u'require')(Js(u'babel-plugin-transform-es2015-destructuring'))) + var.put(u'_babelPluginTransformEs2015Destructuring2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015Destructuring'))) + var.put(u'_babelPluginTransformEs2015BlockScoping', var.get(u'require')(Js(u'babel-plugin-transform-es2015-block-scoping'))) + var.put(u'_babelPluginTransformEs2015BlockScoping2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015BlockScoping'))) + var.put(u'_babelPluginTransformEs2015TypeofSymbol', var.get(u'require')(Js(u'babel-plugin-transform-es2015-typeof-symbol'))) + var.put(u'_babelPluginTransformEs2015TypeofSymbol2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015TypeofSymbol'))) + var.put(u'_babelPluginTransformEs2015ModulesCommonjs', var.get(u'require')(Js(u'babel-plugin-transform-es2015-modules-commonjs'))) + var.put(u'_babelPluginTransformEs2015ModulesCommonjs2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ModulesCommonjs'))) + var.put(u'_babelPluginTransformEs2015ModulesSystemjs', var.get(u'require')(Js(u'babel-plugin-transform-es2015-modules-systemjs'))) + var.put(u'_babelPluginTransformEs2015ModulesSystemjs2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ModulesSystemjs'))) + var.put(u'_babelPluginTransformEs2015ModulesAmd', var.get(u'require')(Js(u'babel-plugin-transform-es2015-modules-amd'))) + var.put(u'_babelPluginTransformEs2015ModulesAmd2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ModulesAmd'))) + var.put(u'_babelPluginTransformEs2015ModulesUmd', var.get(u'require')(Js(u'babel-plugin-transform-es2015-modules-umd'))) + var.put(u'_babelPluginTransformEs2015ModulesUmd2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ModulesUmd'))) + var.put(u'_babelPluginTransformRegenerator', var.get(u'require')(Js(u'babel-plugin-transform-regenerator'))) + var.put(u'_babelPluginTransformRegenerator2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformRegenerator'))) + pass + pass + PyJs_Object_1328_ = Js({}) + var.put(u'oldConfig', var.get(u'preset')(PyJs_Object_1328_)) + var.get(u'exports').put(u'default', var.get(u'oldConfig')) + PyJs_Object_1329_ = Js({u'configurable':var.get(u'true'),u'writable':var.get(u'true'),u'enumerable':Js(False),u'value':var.get(u'preset')}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'oldConfig'), Js(u'buildPreset'), PyJs_Object_1329_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1319_._set_name(u'anonymous') +PyJs_Object_1330_ = Js({u'babel-plugin-check-es2015-constants':Js(58.0),u'babel-plugin-transform-es2015-arrow-functions':Js(59.0),u'babel-plugin-transform-es2015-block-scoped-functions':Js(60.0),u'babel-plugin-transform-es2015-block-scoping':Js(61.0),u'babel-plugin-transform-es2015-classes':Js(63.0),u'babel-plugin-transform-es2015-computed-properties':Js(66.0),u'babel-plugin-transform-es2015-destructuring':Js(67.0),u'babel-plugin-transform-es2015-duplicate-keys':Js(68.0),u'babel-plugin-transform-es2015-for-of':Js(69.0),u'babel-plugin-transform-es2015-function-name':Js(70.0),u'babel-plugin-transform-es2015-literals':Js(71.0),u'babel-plugin-transform-es2015-modules-amd':Js(72.0),u'babel-plugin-transform-es2015-modules-commonjs':Js(73.0),u'babel-plugin-transform-es2015-modules-systemjs':Js(74.0),u'babel-plugin-transform-es2015-modules-umd':Js(75.0),u'babel-plugin-transform-es2015-object-super':Js(76.0),u'babel-plugin-transform-es2015-parameters':Js(79.0),u'babel-plugin-transform-es2015-shorthand-properties':Js(81.0),u'babel-plugin-transform-es2015-spread':Js(82.0),u'babel-plugin-transform-es2015-sticky-regex':Js(83.0),u'babel-plugin-transform-es2015-template-literals':Js(84.0),u'babel-plugin-transform-es2015-typeof-symbol':Js(85.0),u'babel-plugin-transform-es2015-unicode-regex':Js(86.0),u'babel-plugin-transform-regenerator':Js(89.0)}) +@Js +def PyJs_anonymous_1331_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1332_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/get-iterator')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1332_) +PyJs_anonymous_1331_._set_name(u'anonymous') +PyJs_Object_1333_ = Js({u'core-js/library/fn/get-iterator':Js(115.0)}) +@Js +def PyJs_anonymous_1334_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1335_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/json/stringify')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1335_) +PyJs_anonymous_1334_._set_name(u'anonymous') +PyJs_Object_1336_ = Js({u'core-js/library/fn/json/stringify':Js(116.0)}) +@Js +def PyJs_anonymous_1337_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1338_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/map')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1338_) +PyJs_anonymous_1337_._set_name(u'anonymous') +PyJs_Object_1339_ = Js({u'core-js/library/fn/map':Js(117.0)}) +@Js +def PyJs_anonymous_1340_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1341_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/number/max-safe-integer')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1341_) +PyJs_anonymous_1340_._set_name(u'anonymous') +PyJs_Object_1342_ = Js({u'core-js/library/fn/number/max-safe-integer':Js(118.0)}) +@Js +def PyJs_anonymous_1343_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1344_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/object/assign')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1344_) +PyJs_anonymous_1343_._set_name(u'anonymous') +PyJs_Object_1345_ = Js({u'core-js/library/fn/object/assign':Js(119.0)}) +@Js +def PyJs_anonymous_1346_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1347_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/object/create')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1347_) +PyJs_anonymous_1346_._set_name(u'anonymous') +PyJs_Object_1348_ = Js({u'core-js/library/fn/object/create':Js(120.0)}) +@Js +def PyJs_anonymous_1349_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1350_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/object/get-own-property-symbols')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1350_) +PyJs_anonymous_1349_._set_name(u'anonymous') +PyJs_Object_1351_ = Js({u'core-js/library/fn/object/get-own-property-symbols':Js(121.0)}) +@Js +def PyJs_anonymous_1352_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1353_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/object/keys')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1353_) +PyJs_anonymous_1352_._set_name(u'anonymous') +PyJs_Object_1354_ = Js({u'core-js/library/fn/object/keys':Js(122.0)}) +@Js +def PyJs_anonymous_1355_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1356_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/object/set-prototype-of')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1356_) +PyJs_anonymous_1355_._set_name(u'anonymous') +PyJs_Object_1357_ = Js({u'core-js/library/fn/object/set-prototype-of':Js(123.0)}) +@Js +def PyJs_anonymous_1358_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1359_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/symbol')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1359_) +PyJs_anonymous_1358_._set_name(u'anonymous') +PyJs_Object_1360_ = Js({u'core-js/library/fn/symbol':Js(125.0)}) +@Js +def PyJs_anonymous_1361_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1362_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/symbol/for')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1362_) +PyJs_anonymous_1361_._set_name(u'anonymous') +PyJs_Object_1363_ = Js({u'core-js/library/fn/symbol/for':Js(124.0)}) +@Js +def PyJs_anonymous_1364_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1365_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/symbol/iterator')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1365_) +PyJs_anonymous_1364_._set_name(u'anonymous') +PyJs_Object_1366_ = Js({u'core-js/library/fn/symbol/iterator':Js(126.0)}) +@Js +def PyJs_anonymous_1367_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1368_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/weak-map')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1368_) +PyJs_anonymous_1367_._set_name(u'anonymous') +PyJs_Object_1369_ = Js({u'core-js/library/fn/weak-map':Js(127.0)}) +@Js +def PyJs_anonymous_1370_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1371_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/weak-set')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1371_) +PyJs_anonymous_1370_._set_name(u'anonymous') +PyJs_Object_1372_ = Js({u'core-js/library/fn/weak-set':Js(128.0)}) +@Js +def PyJs_anonymous_1373_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_1374_(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJs_anonymous_1374_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1374_) +PyJs_anonymous_1373_._set_name(u'anonymous') +PyJs_Object_1375_ = Js({}) +@Js +def PyJs_anonymous_1376_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_create', u'_typeof2', u'_typeof3', u'_setPrototypeOf', u'require', u'exports', u'module', u'_create2', u'_setPrototypeOf2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1377_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1377_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_setPrototypeOf', var.get(u'require')(Js(u'../core-js/object/set-prototype-of'))) + var.put(u'_setPrototypeOf2', var.get(u'_interopRequireDefault')(var.get(u'_setPrototypeOf'))) + var.put(u'_create', var.get(u'require')(Js(u'../core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + var.put(u'_typeof2', var.get(u'require')(Js(u'../helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + pass + @Js + def PyJs_anonymous_1378_(subClass, superClass, this, arguments, var=var): + var = Scope({u'this':this, u'superClass':superClass, u'subClass':subClass, u'arguments':arguments}, var) + var.registers([u'superClass', u'subClass']) + if (PyJsStrictNeq(var.get(u'superClass',throw=False).typeof(),Js(u'function')) and PyJsStrictNeq(var.get(u'superClass'),var.get(u"null"))): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Super expression must either be null or a function, not ')+(Js(u'undefined') if PyJsStrictEq(var.get(u'superClass',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'superClass')))))) + raise PyJsTempException + PyJs_Object_1380_ = Js({u'value':var.get(u'subClass'),u'enumerable':Js(False),u'writable':var.get(u'true'),u'configurable':var.get(u'true')}) + PyJs_Object_1379_ = Js({u'constructor':PyJs_Object_1380_}) + var.get(u'subClass').put(u'prototype', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))((var.get(u'superClass') and var.get(u'superClass').get(u'prototype')), PyJs_Object_1379_)) + if var.get(u'superClass'): + (PyJsComma(Js(0.0),var.get(u'_setPrototypeOf2').get(u'default'))(var.get(u'subClass'), var.get(u'superClass')) if var.get(u'_setPrototypeOf2').get(u'default') else var.get(u'subClass').put(u'__proto__', var.get(u'superClass'))) + PyJs_anonymous_1378_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1378_) +PyJs_anonymous_1376_._set_name(u'anonymous') +PyJs_Object_1381_ = Js({u'../core-js/object/create':Js(101.0),u'../core-js/object/set-prototype-of':Js(104.0),u'../helpers/typeof':Js(114.0)}) +@Js +def PyJs_anonymous_1382_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_1383_(obj, keys, this, arguments, var=var): + var = Scope({u'keys':keys, u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'i', u'keys', u'obj', u'target']) + PyJs_Object_1384_ = Js({}) + var.put(u'target', PyJs_Object_1384_) + for PyJsTemp in var.get(u'obj'): + var.put(u'i', PyJsTemp) + if (var.get(u'keys').callprop(u'indexOf', var.get(u'i'))>=Js(0.0)): + continue + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'i')).neg(): + continue + var.get(u'target').put(var.get(u'i'), var.get(u'obj').get(var.get(u'i'))) + return var.get(u'target') + PyJs_anonymous_1383_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1383_) +PyJs_anonymous_1382_._set_name(u'anonymous') +PyJs_Object_1385_ = Js({}) +@Js +def PyJs_anonymous_1386_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_typeof2', u'_typeof3', u'require', u'exports', u'module', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1387_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1387_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_typeof2', var.get(u'require')(Js(u'../helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + pass + @Js + def PyJs_anonymous_1388_(self, call, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'call':call, u'arguments':arguments}, var) + var.registers([u'self', u'call']) + if var.get(u'self').neg(): + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create(Js(u"this hasn't been initialised - super() hasn't been called"))) + raise PyJsTempException + return (var.get(u'call') if (var.get(u'call') and (PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'call',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'call'))),Js(u'object')) or PyJsStrictEq(var.get(u'call',throw=False).typeof(),Js(u'function')))) else var.get(u'self')) + PyJs_anonymous_1388_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1388_) +PyJs_anonymous_1386_._set_name(u'anonymous') +PyJs_Object_1389_ = Js({u'../helpers/typeof':Js(114.0)}) +@Js +def PyJs_anonymous_1390_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_symbol2', u'_iterator', u'require', u'module', u'_typeof', u'_symbol', u'_interopRequireDefault', u'_iterator2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1393_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1393_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_iterator', var.get(u'require')(Js(u'../core-js/symbol/iterator'))) + var.put(u'_iterator2', var.get(u'_interopRequireDefault')(var.get(u'_iterator'))) + var.put(u'_symbol', var.get(u'require')(Js(u'../core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + @Js + def PyJs_anonymous_1391_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return var.get(u'obj',throw=False).typeof() + PyJs_anonymous_1391_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1392_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return (Js(u'symbol') if (((var.get(u'obj') and PyJsStrictEq(var.get(u'_symbol2').get(u'default').typeof(),Js(u'function'))) and PyJsStrictEq(var.get(u'obj').get(u'constructor'),var.get(u'_symbol2').get(u'default'))) and PyJsStrictNeq(var.get(u'obj'),var.get(u'_symbol2').get(u'default').get(u'prototype'))) else var.get(u'obj',throw=False).typeof()) + PyJs_anonymous_1392_._set_name(u'anonymous') + var.put(u'_typeof', (PyJs_anonymous_1391_ if (PyJsStrictEq(var.get(u'_symbol2').get(u'default').typeof(),Js(u'function')) and PyJsStrictEq(var.get(u'_iterator2').get(u'default').typeof(),Js(u'symbol'))) else PyJs_anonymous_1392_)) + pass + @Js + def PyJs_anonymous_1394_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return (Js(u'undefined') if PyJsStrictEq(var.get(u'obj',throw=False).typeof(),Js(u'undefined')) else var.get(u'_typeof')(var.get(u'obj'))) + PyJs_anonymous_1394_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1395_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + def PyJs_LONG_1396_(var=var): + return (Js(u'symbol') if (((var.get(u'obj') and PyJsStrictEq(var.get(u'_symbol2').get(u'default').typeof(),Js(u'function'))) and PyJsStrictEq(var.get(u'obj').get(u'constructor'),var.get(u'_symbol2').get(u'default'))) and PyJsStrictNeq(var.get(u'obj'),var.get(u'_symbol2').get(u'default').get(u'prototype'))) else (Js(u'undefined') if PyJsStrictEq(var.get(u'obj',throw=False).typeof(),Js(u'undefined')) else var.get(u'_typeof')(var.get(u'obj')))) + return PyJs_LONG_1396_() + PyJs_anonymous_1395_._set_name(u'anonymous') + var.get(u'exports').put(u'default', (PyJs_anonymous_1394_ if (PyJsStrictEq(var.get(u'_symbol2').get(u'default').typeof(),Js(u'function')) and PyJsStrictEq(var.get(u'_typeof')(var.get(u'_iterator2').get(u'default')),Js(u'symbol'))) else PyJs_anonymous_1395_)) +PyJs_anonymous_1390_._set_name(u'anonymous') +PyJs_Object_1397_ = Js({u'../core-js/symbol':Js(105.0),u'../core-js/symbol/iterator':Js(107.0)}) +@Js +def PyJs_anonymous_1398_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../modules/web.dom.iterable')) + var.get(u'require')(Js(u'../modules/es6.string.iterator')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../modules/core.get-iterator'))) +PyJs_anonymous_1398_._set_name(u'anonymous') +PyJs_Object_1399_ = Js({u'../modules/core.get-iterator':Js(204.0),u'../modules/es6.string.iterator':Js(213.0),u'../modules/web.dom.iterable':Js(220.0)}) +@Js +def PyJs_anonymous_1400_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'core', u'require', u'exports', u'module', u'$JSON']) + var.put(u'core', var.get(u'require')(Js(u'../../modules/_core'))) + PyJs_Object_1401_ = Js({u'stringify':var.get(u'JSON').get(u'stringify')}) + var.put(u'$JSON', (var.get(u'core').get(u'JSON') or var.get(u'core').put(u'JSON', PyJs_Object_1401_))) + @Js + def PyJs_stringify_1402_(it, this, arguments, var=var): + var = Scope({u'this':this, u'stringify':PyJs_stringify_1402_, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return var.get(u'$JSON').get(u'stringify').callprop(u'apply', var.get(u'$JSON'), var.get(u'arguments')) + PyJs_stringify_1402_._set_name(u'stringify') + var.get(u'module').put(u'exports', PyJs_stringify_1402_) +PyJs_anonymous_1400_._set_name(u'anonymous') +PyJs_Object_1403_ = Js({u'../../modules/_core':Js(144.0)}) +@Js +def PyJs_anonymous_1404_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../modules/es6.object.to-string')) + var.get(u'require')(Js(u'../modules/es6.string.iterator')) + var.get(u'require')(Js(u'../modules/web.dom.iterable')) + var.get(u'require')(Js(u'../modules/es6.map')) + var.get(u'require')(Js(u'../modules/es7.map.to-json')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../modules/_core')).get(u'Map')) +PyJs_anonymous_1404_._set_name(u'anonymous') +PyJs_Object_1405_ = Js({u'../modules/_core':Js(144.0),u'../modules/es6.map':Js(206.0),u'../modules/es6.object.to-string':Js(212.0),u'../modules/es6.string.iterator':Js(213.0),u'../modules/es7.map.to-json':Js(217.0),u'../modules/web.dom.iterable':Js(220.0)}) +@Js +def PyJs_anonymous_1406_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.number.max-safe-integer')) + var.get(u'module').put(u'exports', Js(9007199254740991)) +PyJs_anonymous_1406_._set_name(u'anonymous') +PyJs_Object_1407_ = Js({u'../../modules/es6.number.max-safe-integer':Js(207.0)}) +@Js +def PyJs_anonymous_1408_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.object.assign')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../../modules/_core')).get(u'Object').get(u'assign')) +PyJs_anonymous_1408_._set_name(u'anonymous') +PyJs_Object_1409_ = Js({u'../../modules/_core':Js(144.0),u'../../modules/es6.object.assign':Js(208.0)}) +@Js +def PyJs_anonymous_1410_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'$Object']) + var.get(u'require')(Js(u'../../modules/es6.object.create')) + var.put(u'$Object', var.get(u'require')(Js(u'../../modules/_core')).get(u'Object')) + @Js + def PyJs_create_1411_(P, D, this, arguments, var=var): + var = Scope({u'this':this, u'P':P, u'create':PyJs_create_1411_, u'D':D, u'arguments':arguments}, var) + var.registers([u'P', u'D']) + return var.get(u'$Object').callprop(u'create', var.get(u'P'), var.get(u'D')) + PyJs_create_1411_._set_name(u'create') + var.get(u'module').put(u'exports', PyJs_create_1411_) +PyJs_anonymous_1410_._set_name(u'anonymous') +PyJs_Object_1412_ = Js({u'../../modules/_core':Js(144.0),u'../../modules/es6.object.create':Js(209.0)}) +@Js +def PyJs_anonymous_1413_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.symbol')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../../modules/_core')).get(u'Object').get(u'getOwnPropertySymbols')) +PyJs_anonymous_1413_._set_name(u'anonymous') +PyJs_Object_1414_ = Js({u'../../modules/_core':Js(144.0),u'../../modules/es6.symbol':Js(214.0)}) +@Js +def PyJs_anonymous_1415_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.object.keys')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../../modules/_core')).get(u'Object').get(u'keys')) +PyJs_anonymous_1415_._set_name(u'anonymous') +PyJs_Object_1416_ = Js({u'../../modules/_core':Js(144.0),u'../../modules/es6.object.keys':Js(210.0)}) +@Js +def PyJs_anonymous_1417_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.object.set-prototype-of')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../../modules/_core')).get(u'Object').get(u'setPrototypeOf')) +PyJs_anonymous_1417_._set_name(u'anonymous') +PyJs_Object_1418_ = Js({u'../../modules/_core':Js(144.0),u'../../modules/es6.object.set-prototype-of':Js(211.0)}) +@Js +def PyJs_anonymous_1419_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.symbol')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../../modules/_core')).get(u'Symbol').get(u'for')) +PyJs_anonymous_1419_._set_name(u'anonymous') +PyJs_Object_1420_ = Js({u'../../modules/_core':Js(144.0),u'../../modules/es6.symbol':Js(214.0)}) +@Js +def PyJs_anonymous_1421_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.symbol')) + var.get(u'require')(Js(u'../../modules/es6.object.to-string')) + var.get(u'require')(Js(u'../../modules/es7.symbol.async-iterator')) + var.get(u'require')(Js(u'../../modules/es7.symbol.observable')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../../modules/_core')).get(u'Symbol')) +PyJs_anonymous_1421_._set_name(u'anonymous') +PyJs_Object_1422_ = Js({u'../../modules/_core':Js(144.0),u'../../modules/es6.object.to-string':Js(212.0),u'../../modules/es6.symbol':Js(214.0),u'../../modules/es7.symbol.async-iterator':Js(218.0),u'../../modules/es7.symbol.observable':Js(219.0)}) +@Js +def PyJs_anonymous_1423_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.string.iterator')) + var.get(u'require')(Js(u'../../modules/web.dom.iterable')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../../modules/_wks-ext')).callprop(u'f', Js(u'iterator'))) +PyJs_anonymous_1423_._set_name(u'anonymous') +PyJs_Object_1424_ = Js({u'../../modules/_wks-ext':Js(201.0),u'../../modules/es6.string.iterator':Js(213.0),u'../../modules/web.dom.iterable':Js(220.0)}) +@Js +def PyJs_anonymous_1425_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../modules/es6.object.to-string')) + var.get(u'require')(Js(u'../modules/web.dom.iterable')) + var.get(u'require')(Js(u'../modules/es6.weak-map')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../modules/_core')).get(u'WeakMap')) +PyJs_anonymous_1425_._set_name(u'anonymous') +PyJs_Object_1426_ = Js({u'../modules/_core':Js(144.0),u'../modules/es6.object.to-string':Js(212.0),u'../modules/es6.weak-map':Js(215.0),u'../modules/web.dom.iterable':Js(220.0)}) +@Js +def PyJs_anonymous_1427_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../modules/es6.object.to-string')) + var.get(u'require')(Js(u'../modules/web.dom.iterable')) + var.get(u'require')(Js(u'../modules/es6.weak-set')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../modules/_core')).get(u'WeakSet')) +PyJs_anonymous_1427_._set_name(u'anonymous') +PyJs_Object_1428_ = Js({u'../modules/_core':Js(144.0),u'../modules/es6.object.to-string':Js(212.0),u'../modules/es6.weak-set':Js(216.0),u'../modules/web.dom.iterable':Js(220.0)}) +@Js +def PyJs_anonymous_1429_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1430_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + if (var.get(u'it',throw=False).typeof()!=Js(u'function')): + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'it')+Js(u' is not a function!')))) + raise PyJsTempException + return var.get(u'it') + PyJs_anonymous_1430_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1430_) +PyJs_anonymous_1429_._set_name(u'anonymous') +PyJs_Object_1431_ = Js({}) +@Js +def PyJs_anonymous_1432_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1433_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJs_anonymous_1433_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1433_) +PyJs_anonymous_1432_._set_name(u'anonymous') +PyJs_Object_1434_ = Js({}) +@Js +def PyJs_anonymous_1435_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1436_(it, Constructor, name, forbiddenField, this, arguments, var=var): + var = Scope({u'name':name, u'Constructor':Constructor, u'this':this, u'arguments':arguments, u'it':it, u'forbiddenField':forbiddenField}, var) + var.registers([u'forbiddenField', u'it', u'name', u'Constructor']) + if (var.get(u'it').instanceof(var.get(u'Constructor')).neg() or (PyJsStrictNeq(var.get(u'forbiddenField'),var.get(u'undefined')) and var.get(u'it').contains(var.get(u'forbiddenField')))): + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'name')+Js(u': incorrect invocation!')))) + raise PyJsTempException + return var.get(u'it') + PyJs_anonymous_1436_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1436_) +PyJs_anonymous_1435_._set_name(u'anonymous') +PyJs_Object_1437_ = Js({}) +@Js +def PyJs_anonymous_1438_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'isObject', u'module']) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + @Js + def PyJs_anonymous_1439_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + if var.get(u'isObject')(var.get(u'it')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'it')+Js(u' is not an object!')))) + raise PyJsTempException + return var.get(u'it') + PyJs_anonymous_1439_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1439_) +PyJs_anonymous_1438_._set_name(u'anonymous') +PyJs_Object_1440_ = Js({u'./_is-object':Js(162.0)}) +@Js +def PyJs_anonymous_1441_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'forOf', u'exports', u'module']) + var.put(u'forOf', var.get(u'require')(Js(u'./_for-of'))) + @Js + def PyJs_anonymous_1442_(iter, ITERATOR, this, arguments, var=var): + var = Scope({u'this':this, u'ITERATOR':ITERATOR, u'iter':iter, u'arguments':arguments}, var) + var.registers([u'ITERATOR', u'result', u'iter']) + var.put(u'result', Js([])) + var.get(u'forOf')(var.get(u'iter'), Js(False), var.get(u'result').get(u'push'), var.get(u'result'), var.get(u'ITERATOR')) + return var.get(u'result') + PyJs_anonymous_1442_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1442_) +PyJs_anonymous_1441_._set_name(u'anonymous') +PyJs_Object_1443_ = Js({u'./_for-of':Js(153.0)}) +@Js +def PyJs_anonymous_1444_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'toLength', u'require', u'toIndex', u'module', u'toIObject']) + var.put(u'toIObject', var.get(u'require')(Js(u'./_to-iobject'))) + var.put(u'toLength', var.get(u'require')(Js(u'./_to-length'))) + var.put(u'toIndex', var.get(u'require')(Js(u'./_to-index'))) + @Js + def PyJs_anonymous_1445_(IS_INCLUDES, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'IS_INCLUDES':IS_INCLUDES}, var) + var.registers([u'IS_INCLUDES']) + @Js + def PyJs_anonymous_1446_(PyJsArg_2474686973_, el, fromIndex, this, arguments, var=var): + var = Scope({u'this':this, u'el':el, u'$this':PyJsArg_2474686973_, u'arguments':arguments, u'fromIndex':fromIndex}, var) + var.registers([u'el', u'index', u'$this', u'value', u'fromIndex', u'length', u'O']) + var.put(u'O', var.get(u'toIObject')(var.get(u'$this'))) + var.put(u'length', var.get(u'toLength')(var.get(u'O').get(u'length'))) + var.put(u'index', var.get(u'toIndex')(var.get(u'fromIndex'), var.get(u'length'))) + if (var.get(u'IS_INCLUDES') and (var.get(u'el')!=var.get(u'el'))): + while (var.get(u'length')>var.get(u'index')): + var.put(u'value', var.get(u'O').get((var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)))) + if (var.get(u'value')!=var.get(u'value')): + return var.get(u'true') + else: + #for JS loop + + while (var.get(u'length')>var.get(u'index')): + try: + if (var.get(u'IS_INCLUDES') or var.get(u'O').contains(var.get(u'index'))): + if PyJsStrictEq(var.get(u'O').get(var.get(u'index')),var.get(u'el')): + return ((var.get(u'IS_INCLUDES') or var.get(u'index')) or Js(0.0)) + finally: + (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)) + return (var.get(u'IS_INCLUDES').neg() and (-Js(1.0))) + PyJs_anonymous_1446_._set_name(u'anonymous') + return PyJs_anonymous_1446_ + PyJs_anonymous_1445_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1445_) +PyJs_anonymous_1444_._set_name(u'anonymous') +PyJs_Object_1447_ = Js({u'./_to-index':Js(193.0),u'./_to-iobject':Js(195.0),u'./_to-length':Js(196.0)}) +@Js +def PyJs_anonymous_1448_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'toLength', u'IObject', u'toObject', u'ctx', u'module', u'asc', u'require']) + var.put(u'ctx', var.get(u'require')(Js(u'./_ctx'))) + var.put(u'IObject', var.get(u'require')(Js(u'./_iobject'))) + var.put(u'toObject', var.get(u'require')(Js(u'./_to-object'))) + var.put(u'toLength', var.get(u'require')(Js(u'./_to-length'))) + var.put(u'asc', var.get(u'require')(Js(u'./_array-species-create'))) + @Js + def PyJs_anonymous_1449_(TYPE, PyJsArg_24637265617465_, this, arguments, var=var): + var = Scope({u'this':this, u'TYPE':TYPE, u'arguments':arguments, u'$create':PyJsArg_24637265617465_}, var) + var.registers([u'IS_FIND_INDEX', u'IS_SOME', u'IS_MAP', u'$create', u'NO_HOLES', u'IS_EVERY', u'IS_FILTER', u'TYPE', u'create']) + var.put(u'IS_MAP', (var.get(u'TYPE')==Js(1.0))) + var.put(u'IS_FILTER', (var.get(u'TYPE')==Js(2.0))) + var.put(u'IS_SOME', (var.get(u'TYPE')==Js(3.0))) + var.put(u'IS_EVERY', (var.get(u'TYPE')==Js(4.0))) + var.put(u'IS_FIND_INDEX', (var.get(u'TYPE')==Js(6.0))) + var.put(u'NO_HOLES', ((var.get(u'TYPE')==Js(5.0)) or var.get(u'IS_FIND_INDEX'))) + var.put(u'create', (var.get(u'$create') or var.get(u'asc'))) + @Js + def PyJs_anonymous_1450_(PyJsArg_2474686973_, callbackfn, that, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'callbackfn':callbackfn, u'$this':PyJsArg_2474686973_, u'that':that}, var) + var.registers([u'index', u'callbackfn', u'val', u'f', u'res', u'self', u'that', u'$this', u'O', u'length', u'result']) + var.put(u'O', var.get(u'toObject')(var.get(u'$this'))) + var.put(u'self', var.get(u'IObject')(var.get(u'O'))) + var.put(u'f', var.get(u'ctx')(var.get(u'callbackfn'), var.get(u'that'), Js(3.0))) + var.put(u'length', var.get(u'toLength')(var.get(u'self').get(u'length'))) + var.put(u'index', Js(0.0)) + var.put(u'result', (var.get(u'create')(var.get(u'$this'), var.get(u'length')) if var.get(u'IS_MAP') else (var.get(u'create')(var.get(u'$this'), Js(0.0)) if var.get(u'IS_FILTER') else var.get(u'undefined')))) + #for JS loop + + while (var.get(u'length')>var.get(u'index')): + try: + if (var.get(u'NO_HOLES') or var.get(u'self').contains(var.get(u'index'))): + var.put(u'val', var.get(u'self').get(var.get(u'index'))) + var.put(u'res', var.get(u'f')(var.get(u'val'), var.get(u'index'), var.get(u'O'))) + if var.get(u'TYPE'): + if var.get(u'IS_MAP'): + var.get(u'result').put(var.get(u'index'), var.get(u'res')) + else: + if var.get(u'res'): + while 1: + SWITCHED = False + CONDITION = (var.get(u'TYPE')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(3.0)): + SWITCHED = True + return var.get(u'true') + if SWITCHED or PyJsStrictEq(CONDITION, Js(5.0)): + SWITCHED = True + return var.get(u'val') + if SWITCHED or PyJsStrictEq(CONDITION, Js(6.0)): + SWITCHED = True + return var.get(u'index') + if SWITCHED or PyJsStrictEq(CONDITION, Js(2.0)): + SWITCHED = True + var.get(u'result').callprop(u'push', var.get(u'val')) + SWITCHED = True + break + else: + if var.get(u'IS_EVERY'): + return Js(False) + finally: + (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)) + return ((-Js(1.0)) if var.get(u'IS_FIND_INDEX') else (var.get(u'IS_EVERY') if (var.get(u'IS_SOME') or var.get(u'IS_EVERY')) else var.get(u'result'))) + PyJs_anonymous_1450_._set_name(u'anonymous') + return PyJs_anonymous_1450_ + PyJs_anonymous_1449_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1449_) +PyJs_anonymous_1448_._set_name(u'anonymous') +PyJs_Object_1451_ = Js({u'./_array-species-create':Js(137.0),u'./_ctx':Js(145.0),u'./_iobject':Js(159.0),u'./_to-length':Js(196.0),u'./_to-object':Js(197.0)}) +@Js +def PyJs_anonymous_1452_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'exports', u'require', u'module', u'SPECIES', u'isObject']) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + var.put(u'isArray', var.get(u'require')(Js(u'./_is-array'))) + var.put(u'SPECIES', var.get(u'require')(Js(u'./_wks'))(Js(u'species'))) + @Js + def PyJs_anonymous_1453_(original, this, arguments, var=var): + var = Scope({u'this':this, u'original':original, u'arguments':arguments}, var) + var.registers([u'C', u'original']) + pass + if var.get(u'isArray')(var.get(u'original')): + var.put(u'C', var.get(u'original').get(u'constructor')) + if ((var.get(u'C',throw=False).typeof()==Js(u'function')) and (PyJsStrictEq(var.get(u'C'),var.get(u'Array')) or var.get(u'isArray')(var.get(u'C').get(u'prototype')))): + var.put(u'C', var.get(u'undefined')) + if var.get(u'isObject')(var.get(u'C')): + var.put(u'C', var.get(u'C').get(var.get(u'SPECIES'))) + if PyJsStrictEq(var.get(u'C'),var.get(u"null")): + var.put(u'C', var.get(u'undefined')) + return (var.get(u'Array') if PyJsStrictEq(var.get(u'C'),var.get(u'undefined')) else var.get(u'C')) + PyJs_anonymous_1453_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1453_) +PyJs_anonymous_1452_._set_name(u'anonymous') +PyJs_Object_1454_ = Js({u'./_is-array':Js(161.0),u'./_is-object':Js(162.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1455_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'speciesConstructor', u'require', u'exports', u'module']) + var.put(u'speciesConstructor', var.get(u'require')(Js(u'./_array-species-constructor'))) + @Js + def PyJs_anonymous_1456_(original, length, this, arguments, var=var): + var = Scope({u'this':this, u'length':length, u'original':original, u'arguments':arguments}, var) + var.registers([u'length', u'original']) + return var.get(u'speciesConstructor')(var.get(u'original')).create(var.get(u'length')) + PyJs_anonymous_1456_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1456_) +PyJs_anonymous_1455_._set_name(u'anonymous') +PyJs_Object_1457_ = Js({u'./_array-species-constructor':Js(136.0)}) +@Js +def PyJs_anonymous_1458_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'cof', u'module', u'tryGet', u'TAG', u'ARG']) + var.put(u'cof', var.get(u'require')(Js(u'./_cof'))) + var.put(u'TAG', var.get(u'require')(Js(u'./_wks'))(Js(u'toStringTag'))) + @Js + def PyJs_anonymous_1459_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'arguments') + PyJs_anonymous_1459_._set_name(u'anonymous') + var.put(u'ARG', (var.get(u'cof')(PyJs_anonymous_1459_())==Js(u'Arguments'))) + @Js + def PyJs_anonymous_1460_(it, key, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'key':key, u'arguments':arguments}, var) + var.registers([u'it', u'key']) + try: + return var.get(u'it').get(var.get(u'key')) + except PyJsException as PyJsTempException: + PyJsHolder_65_48759406 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_48759406 is not None: + var.own[u'e'] = PyJsHolder_65_48759406 + else: + del var.own[u'e'] + del PyJsHolder_65_48759406 + PyJs_anonymous_1460_._set_name(u'anonymous') + var.put(u'tryGet', PyJs_anonymous_1460_) + @Js + def PyJs_anonymous_1461_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'B', u'T', u'O', u'it']) + pass + def PyJs_LONG_1462_(var=var): + return (Js(u'Null') if PyJsStrictEq(var.get(u'it'),var.get(u"null")) else (var.get(u'T') if (var.put(u'T', var.get(u'tryGet')(var.put(u'O', var.get(u'Object')(var.get(u'it'))), var.get(u'TAG'))).typeof()==Js(u'string')) else (var.get(u'cof')(var.get(u'O')) if var.get(u'ARG') else (Js(u'Arguments') if ((var.put(u'B', var.get(u'cof')(var.get(u'O')))==Js(u'Object')) and (var.get(u'O').get(u'callee').typeof()==Js(u'function'))) else var.get(u'B'))))) + return (Js(u'Undefined') if PyJsStrictEq(var.get(u'it'),var.get(u'undefined')) else PyJs_LONG_1462_()) + PyJs_anonymous_1461_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1461_) +PyJs_anonymous_1458_._set_name(u'anonymous') +PyJs_Object_1463_ = Js({u'./_cof':Js(139.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1464_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'toString', u'exports', u'module']) + PyJs_Object_1465_ = Js({}) + var.put(u'toString', PyJs_Object_1465_.get(u'toString')) + @Js + def PyJs_anonymous_1466_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return var.get(u'toString').callprop(u'call', var.get(u'it')).callprop(u'slice', Js(8.0), (-Js(1.0))) + PyJs_anonymous_1466_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1466_) +PyJs_anonymous_1464_._set_name(u'anonymous') +PyJs_Object_1467_ = Js({}) +@Js +def PyJs_anonymous_1468_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'fastKey', u'exports', u'forOf', u'anInstance', u'defined', u'$iterDefine', u'create', u'ctx', u'module', u'setSpecies', u'getEntry', u'step', u'redefineAll', u'DESCRIPTORS', u'require', u'dP', u'SIZE']) + Js(u'use strict') + var.put(u'dP', var.get(u'require')(Js(u'./_object-dp')).get(u'f')) + var.put(u'create', var.get(u'require')(Js(u'./_object-create'))) + var.put(u'redefineAll', var.get(u'require')(Js(u'./_redefine-all'))) + var.put(u'ctx', var.get(u'require')(Js(u'./_ctx'))) + var.put(u'anInstance', var.get(u'require')(Js(u'./_an-instance'))) + var.put(u'defined', var.get(u'require')(Js(u'./_defined'))) + var.put(u'forOf', var.get(u'require')(Js(u'./_for-of'))) + var.put(u'$iterDefine', var.get(u'require')(Js(u'./_iter-define'))) + var.put(u'step', var.get(u'require')(Js(u'./_iter-step'))) + var.put(u'setSpecies', var.get(u'require')(Js(u'./_set-species'))) + var.put(u'DESCRIPTORS', var.get(u'require')(Js(u'./_descriptors'))) + var.put(u'fastKey', var.get(u'require')(Js(u'./_meta')).get(u'fastKey')) + var.put(u'SIZE', (Js(u'_s') if var.get(u'DESCRIPTORS') else Js(u'size'))) + @Js + def PyJs_anonymous_1469_(that, key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key, u'that':that}, var) + var.registers([u'index', u'that', u'key', u'entry']) + var.put(u'index', var.get(u'fastKey')(var.get(u'key'))) + if PyJsStrictNeq(var.get(u'index'),Js(u'F')): + return var.get(u'that').get(u'_i').get(var.get(u'index')) + #for JS loop + var.put(u'entry', var.get(u'that').get(u'_f')) + while var.get(u'entry'): + try: + if (var.get(u'entry').get(u'k')==var.get(u'key')): + return var.get(u'entry') + finally: + var.put(u'entry', var.get(u'entry').get(u'n')) + PyJs_anonymous_1469_._set_name(u'anonymous') + var.put(u'getEntry', PyJs_anonymous_1469_) + @Js + def PyJs_anonymous_1471_(wrapper, NAME, IS_MAP, ADDER, this, arguments, var=var): + var = Scope({u'ADDER':ADDER, u'this':this, u'arguments':arguments, u'IS_MAP':IS_MAP, u'wrapper':wrapper, u'NAME':NAME}, var) + var.registers([u'ADDER', u'C', u'NAME', u'wrapper', u'IS_MAP']) + @Js + def PyJs_anonymous_1472_(that, iterable, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'iterable':iterable, u'that':that}, var) + var.registers([u'iterable', u'that']) + var.get(u'anInstance')(var.get(u'that'), var.get(u'C'), var.get(u'NAME'), Js(u'_i')) + var.get(u'that').put(u'_i', var.get(u'create')(var.get(u"null"))) + var.get(u'that').put(u'_f', var.get(u'undefined')) + var.get(u'that').put(u'_l', var.get(u'undefined')) + var.get(u'that').put(var.get(u'SIZE'), Js(0.0)) + if (var.get(u'iterable')!=var.get(u'undefined')): + var.get(u'forOf')(var.get(u'iterable'), var.get(u'IS_MAP'), var.get(u'that').get(var.get(u'ADDER')), var.get(u'that')) + PyJs_anonymous_1472_._set_name(u'anonymous') + var.put(u'C', var.get(u'wrapper')(PyJs_anonymous_1472_)) + @Js + def PyJs_clear_1474_(this, arguments, var=var): + var = Scope({u'this':this, u'clear':PyJs_clear_1474_, u'arguments':arguments}, var) + var.registers([u'entry', u'data', u'that']) + #for JS loop + var.put(u'that', var.get(u"this")) + var.put(u'data', var.get(u'that').get(u'_i')) + var.put(u'entry', var.get(u'that').get(u'_f')) + while var.get(u'entry'): + try: + var.get(u'entry').put(u'r', var.get(u'true')) + if var.get(u'entry').get(u'p'): + var.get(u'entry').put(u'p', var.get(u'entry').get(u'p').put(u'n', var.get(u'undefined'))) + var.get(u'data').delete(var.get(u'entry').get(u'i')) + finally: + var.put(u'entry', var.get(u'entry').get(u'n')) + var.get(u'that').put(u'_f', var.get(u'that').put(u'_l', var.get(u'undefined'))) + var.get(u'that').put(var.get(u'SIZE'), Js(0.0)) + PyJs_clear_1474_._set_name(u'clear') + @Js + def PyJs_anonymous_1475_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'prev', u'entry', u'next', u'key', u'that']) + var.put(u'that', var.get(u"this")) + var.put(u'entry', var.get(u'getEntry')(var.get(u'that'), var.get(u'key'))) + if var.get(u'entry'): + var.put(u'next', var.get(u'entry').get(u'n')) + var.put(u'prev', var.get(u'entry').get(u'p')) + var.get(u'that').get(u'_i').delete(var.get(u'entry').get(u'i')) + var.get(u'entry').put(u'r', var.get(u'true')) + if var.get(u'prev'): + var.get(u'prev').put(u'n', var.get(u'next')) + if var.get(u'next'): + var.get(u'next').put(u'p', var.get(u'prev')) + if (var.get(u'that').get(u'_f')==var.get(u'entry')): + var.get(u'that').put(u'_f', var.get(u'next')) + if (var.get(u'that').get(u'_l')==var.get(u'entry')): + var.get(u'that').put(u'_l', var.get(u'prev')) + (var.get(u'that').put(var.get(u'SIZE'),Js(var.get(u'that').get(var.get(u'SIZE')).to_number())-Js(1))+Js(1)) + return var.get(u'entry').neg().neg() + PyJs_anonymous_1475_._set_name(u'anonymous') + @Js + def PyJs_forEach_1476_(callbackfn, this, arguments, var=var): + var = Scope({u'this':this, u'callbackfn':callbackfn, u'arguments':arguments, u'forEach':PyJs_forEach_1476_}, var) + var.registers([u'entry', u'callbackfn', u'f']) + var.get(u'anInstance')(var.get(u"this"), var.get(u'C'), Js(u'forEach')) + var.put(u'f', var.get(u'ctx')(var.get(u'callbackfn'), (var.get(u'arguments').get(u'1') if (var.get(u'arguments').get(u'length')>Js(1.0)) else var.get(u'undefined')), Js(3.0))) + while var.put(u'entry', (var.get(u'entry').get(u'n') if var.get(u'entry') else var.get(u"this").get(u'_f'))): + var.get(u'f')(var.get(u'entry').get(u'v'), var.get(u'entry').get(u'k'), var.get(u"this")) + while (var.get(u'entry') and var.get(u'entry').get(u'r')): + var.put(u'entry', var.get(u'entry').get(u'p')) + PyJs_forEach_1476_._set_name(u'forEach') + @Js + def PyJs_has_1477_(key, this, arguments, var=var): + var = Scope({u'this':this, u'has':PyJs_has_1477_, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u'getEntry')(var.get(u"this"), var.get(u'key')).neg().neg() + PyJs_has_1477_._set_name(u'has') + PyJs_Object_1473_ = Js({u'clear':PyJs_clear_1474_,u'delete':PyJs_anonymous_1475_,u'forEach':PyJs_forEach_1476_,u'has':PyJs_has_1477_}) + var.get(u'redefineAll')(var.get(u'C').get(u'prototype'), PyJs_Object_1473_) + if var.get(u'DESCRIPTORS'): + @Js + def PyJs_anonymous_1479_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'defined')(var.get(u"this").get(var.get(u'SIZE'))) + PyJs_anonymous_1479_._set_name(u'anonymous') + PyJs_Object_1478_ = Js({u'get':PyJs_anonymous_1479_}) + var.get(u'dP')(var.get(u'C').get(u'prototype'), Js(u'size'), PyJs_Object_1478_) + return var.get(u'C') + PyJs_anonymous_1471_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1480_(that, key, value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value, u'key':key, u'that':that}, var) + var.registers([u'index', u'that', u'value', u'key', u'entry', u'prev']) + var.put(u'entry', var.get(u'getEntry')(var.get(u'that'), var.get(u'key'))) + if var.get(u'entry'): + var.get(u'entry').put(u'v', var.get(u'value')) + else: + PyJs_Object_1481_ = Js({u'i':var.put(u'index', var.get(u'fastKey')(var.get(u'key'), var.get(u'true'))),u'k':var.get(u'key'),u'v':var.get(u'value'),u'p':var.put(u'prev', var.get(u'that').get(u'_l')),u'n':var.get(u'undefined'),u'r':Js(False)}) + var.get(u'that').put(u'_l', var.put(u'entry', PyJs_Object_1481_)) + if var.get(u'that').get(u'_f').neg(): + var.get(u'that').put(u'_f', var.get(u'entry')) + if var.get(u'prev'): + var.get(u'prev').put(u'n', var.get(u'entry')) + (var.get(u'that').put(var.get(u'SIZE'),Js(var.get(u'that').get(var.get(u'SIZE')).to_number())+Js(1))-Js(1)) + if PyJsStrictNeq(var.get(u'index'),Js(u'F')): + var.get(u'that').get(u'_i').put(var.get(u'index'), var.get(u'entry')) + return var.get(u'that') + PyJs_anonymous_1480_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1482_(C, NAME, IS_MAP, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'C':C, u'NAME':NAME, u'IS_MAP':IS_MAP}, var) + var.registers([u'C', u'NAME', u'IS_MAP']) + @Js + def PyJs_anonymous_1483_(iterated, kind, this, arguments, var=var): + var = Scope({u'this':this, u'kind':kind, u'arguments':arguments, u'iterated':iterated}, var) + var.registers([u'kind', u'iterated']) + var.get(u"this").put(u'_t', var.get(u'iterated')) + var.get(u"this").put(u'_k', var.get(u'kind')) + var.get(u"this").put(u'_l', var.get(u'undefined')) + PyJs_anonymous_1483_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1484_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'entry', u'kind', u'that']) + var.put(u'that', var.get(u"this")) + var.put(u'kind', var.get(u'that').get(u'_k')) + var.put(u'entry', var.get(u'that').get(u'_l')) + while (var.get(u'entry') and var.get(u'entry').get(u'r')): + var.put(u'entry', var.get(u'entry').get(u'p')) + if (var.get(u'that').get(u'_t').neg() or var.get(u'that').put(u'_l', var.put(u'entry', (var.get(u'entry').get(u'n') if var.get(u'entry') else var.get(u'that').get(u'_t').get(u'_f')))).neg()): + var.get(u'that').put(u'_t', var.get(u'undefined')) + return var.get(u'step')(Js(1.0)) + if (var.get(u'kind')==Js(u'keys')): + return var.get(u'step')(Js(0.0), var.get(u'entry').get(u'k')) + if (var.get(u'kind')==Js(u'values')): + return var.get(u'step')(Js(0.0), var.get(u'entry').get(u'v')) + return var.get(u'step')(Js(0.0), Js([var.get(u'entry').get(u'k'), var.get(u'entry').get(u'v')])) + PyJs_anonymous_1484_._set_name(u'anonymous') + var.get(u'$iterDefine')(var.get(u'C'), var.get(u'NAME'), PyJs_anonymous_1483_, PyJs_anonymous_1484_, (Js(u'entries') if var.get(u'IS_MAP') else Js(u'values')), var.get(u'IS_MAP').neg(), var.get(u'true')) + var.get(u'setSpecies')(var.get(u'NAME')) + PyJs_anonymous_1482_._set_name(u'anonymous') + PyJs_Object_1470_ = Js({u'getConstructor':PyJs_anonymous_1471_,u'def':PyJs_anonymous_1480_,u'getEntry':var.get(u'getEntry'),u'setStrong':PyJs_anonymous_1482_}) + var.get(u'module').put(u'exports', PyJs_Object_1470_) +PyJs_anonymous_1468_._set_name(u'anonymous') +PyJs_Object_1485_ = Js({u'./_an-instance':Js(131.0),u'./_ctx':Js(145.0),u'./_defined':Js(146.0),u'./_descriptors':Js(147.0),u'./_for-of':Js(153.0),u'./_iter-define':Js(165.0),u'./_iter-step':Js(166.0),u'./_meta':Js(170.0),u'./_object-create':Js(172.0),u'./_object-dp':Js(173.0),u'./_redefine-all':Js(185.0),u'./_set-species':Js(188.0)}) +@Js +def PyJs_anonymous_1486_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'from', u'require', u'classof', u'exports', u'module']) + var.put(u'classof', var.get(u'require')(Js(u'./_classof'))) + var.put(u'from', var.get(u'require')(Js(u'./_array-from-iterable'))) + @Js + def PyJs_anonymous_1487_(NAME, this, arguments, var=var): + var = Scope({u'this':this, u'NAME':NAME, u'arguments':arguments}, var) + var.registers([u'NAME']) + @Js + def PyJs_toJSON_1488_(this, arguments, var=var): + var = Scope({u'this':this, u'toJSON':PyJs_toJSON_1488_, u'arguments':arguments}, var) + var.registers([]) + if (var.get(u'classof')(var.get(u"this"))!=var.get(u'NAME')): + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'NAME')+Js(u"#toJSON isn't generic")))) + raise PyJsTempException + return var.get(u'from')(var.get(u"this")) + PyJs_toJSON_1488_._set_name(u'toJSON') + return PyJs_toJSON_1488_ + PyJs_anonymous_1487_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1487_) +PyJs_anonymous_1486_._set_name(u'anonymous') +PyJs_Object_1489_ = Js({u'./_array-from-iterable':Js(133.0),u'./_classof':Js(138.0)}) +@Js +def PyJs_anonymous_1490_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'forOf', u'findUncaughtFrozen', u'createArrayMethod', u'anInstance', u'require', u'arrayFindIndex', u'module', u'id', u'$has', u'anObject', u'uncaughtFrozenStore', u'UncaughtFrozenStore', u'redefineAll', u'getWeak', u'isObject', u'arrayFind']) + Js(u'use strict') + var.put(u'redefineAll', var.get(u'require')(Js(u'./_redefine-all'))) + var.put(u'getWeak', var.get(u'require')(Js(u'./_meta')).get(u'getWeak')) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + var.put(u'anInstance', var.get(u'require')(Js(u'./_an-instance'))) + var.put(u'forOf', var.get(u'require')(Js(u'./_for-of'))) + var.put(u'createArrayMethod', var.get(u'require')(Js(u'./_array-methods'))) + var.put(u'$has', var.get(u'require')(Js(u'./_has'))) + var.put(u'arrayFind', var.get(u'createArrayMethod')(Js(5.0))) + var.put(u'arrayFindIndex', var.get(u'createArrayMethod')(Js(6.0))) + var.put(u'id', Js(0.0)) + @Js + def PyJs_anonymous_1491_(that, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'that':that}, var) + var.registers([u'that']) + return (var.get(u'that').get(u'_l') or var.get(u'that').put(u'_l', var.get(u'UncaughtFrozenStore').create())) + PyJs_anonymous_1491_._set_name(u'anonymous') + var.put(u'uncaughtFrozenStore', PyJs_anonymous_1491_) + @Js + def PyJs_anonymous_1492_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'a', Js([])) + PyJs_anonymous_1492_._set_name(u'anonymous') + var.put(u'UncaughtFrozenStore', PyJs_anonymous_1492_) + @Js + def PyJs_anonymous_1493_(store, key, this, arguments, var=var): + var = Scope({u'this':this, u'key':key, u'store':store, u'arguments':arguments}, var) + var.registers([u'key', u'store']) + @Js + def PyJs_anonymous_1494_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return PyJsStrictEq(var.get(u'it').get(u'0'),var.get(u'key')) + PyJs_anonymous_1494_._set_name(u'anonymous') + return var.get(u'arrayFind')(var.get(u'store').get(u'a'), PyJs_anonymous_1494_) + PyJs_anonymous_1493_._set_name(u'anonymous') + var.put(u'findUncaughtFrozen', PyJs_anonymous_1493_) + @Js + def PyJs_anonymous_1496_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'entry', u'key']) + var.put(u'entry', var.get(u'findUncaughtFrozen')(var.get(u"this"), var.get(u'key'))) + if var.get(u'entry'): + return var.get(u'entry').get(u'1') + PyJs_anonymous_1496_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1497_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u'findUncaughtFrozen')(var.get(u"this"), var.get(u'key')).neg().neg() + PyJs_anonymous_1497_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1498_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'entry', u'value', u'key']) + var.put(u'entry', var.get(u'findUncaughtFrozen')(var.get(u"this"), var.get(u'key'))) + if var.get(u'entry'): + var.get(u'entry').put(u'1', var.get(u'value')) + else: + var.get(u"this").get(u'a').callprop(u'push', Js([var.get(u'key'), var.get(u'value')])) + PyJs_anonymous_1498_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1499_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'index', u'key']) + @Js + def PyJs_anonymous_1500_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return PyJsStrictEq(var.get(u'it').get(u'0'),var.get(u'key')) + PyJs_anonymous_1500_._set_name(u'anonymous') + var.put(u'index', var.get(u'arrayFindIndex')(var.get(u"this").get(u'a'), PyJs_anonymous_1500_)) + if (~var.get(u'index')): + var.get(u"this").get(u'a').callprop(u'splice', var.get(u'index'), Js(1.0)) + return (~var.get(u'index')).neg().neg() + PyJs_anonymous_1499_._set_name(u'anonymous') + PyJs_Object_1495_ = Js({u'get':PyJs_anonymous_1496_,u'has':PyJs_anonymous_1497_,u'set':PyJs_anonymous_1498_,u'delete':PyJs_anonymous_1499_}) + var.get(u'UncaughtFrozenStore').put(u'prototype', PyJs_Object_1495_) + @Js + def PyJs_anonymous_1502_(wrapper, NAME, IS_MAP, ADDER, this, arguments, var=var): + var = Scope({u'ADDER':ADDER, u'this':this, u'arguments':arguments, u'IS_MAP':IS_MAP, u'wrapper':wrapper, u'NAME':NAME}, var) + var.registers([u'ADDER', u'C', u'NAME', u'wrapper', u'IS_MAP']) + @Js + def PyJs_anonymous_1503_(that, iterable, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'iterable':iterable, u'that':that}, var) + var.registers([u'iterable', u'that']) + var.get(u'anInstance')(var.get(u'that'), var.get(u'C'), var.get(u'NAME'), Js(u'_i')) + var.get(u'that').put(u'_i', (var.put(u'id',Js(var.get(u'id').to_number())+Js(1))-Js(1))) + var.get(u'that').put(u'_l', var.get(u'undefined')) + if (var.get(u'iterable')!=var.get(u'undefined')): + var.get(u'forOf')(var.get(u'iterable'), var.get(u'IS_MAP'), var.get(u'that').get(var.get(u'ADDER')), var.get(u'that')) + PyJs_anonymous_1503_._set_name(u'anonymous') + var.put(u'C', var.get(u'wrapper')(PyJs_anonymous_1503_)) + @Js + def PyJs_anonymous_1505_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'data', u'key']) + if var.get(u'isObject')(var.get(u'key')).neg(): + return Js(False) + var.put(u'data', var.get(u'getWeak')(var.get(u'key'))) + if PyJsStrictEq(var.get(u'data'),var.get(u'true')): + return var.get(u'uncaughtFrozenStore')(var.get(u"this")).callprop(u'delete', var.get(u'key')) + return ((var.get(u'data') and var.get(u'$has')(var.get(u'data'), var.get(u"this").get(u'_i'))) and var.get(u'data').delete(var.get(u"this").get(u'_i'))) + PyJs_anonymous_1505_._set_name(u'anonymous') + @Js + def PyJs_has_1506_(key, this, arguments, var=var): + var = Scope({u'this':this, u'has':PyJs_has_1506_, u'arguments':arguments, u'key':key}, var) + var.registers([u'data', u'key']) + if var.get(u'isObject')(var.get(u'key')).neg(): + return Js(False) + var.put(u'data', var.get(u'getWeak')(var.get(u'key'))) + if PyJsStrictEq(var.get(u'data'),var.get(u'true')): + return var.get(u'uncaughtFrozenStore')(var.get(u"this")).callprop(u'has', var.get(u'key')) + return (var.get(u'data') and var.get(u'$has')(var.get(u'data'), var.get(u"this").get(u'_i'))) + PyJs_has_1506_._set_name(u'has') + PyJs_Object_1504_ = Js({u'delete':PyJs_anonymous_1505_,u'has':PyJs_has_1506_}) + var.get(u'redefineAll')(var.get(u'C').get(u'prototype'), PyJs_Object_1504_) + return var.get(u'C') + PyJs_anonymous_1502_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1507_(that, key, value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value, u'key':key, u'that':that}, var) + var.registers([u'data', u'value', u'key', u'that']) + var.put(u'data', var.get(u'getWeak')(var.get(u'anObject')(var.get(u'key')), var.get(u'true'))) + if PyJsStrictEq(var.get(u'data'),var.get(u'true')): + var.get(u'uncaughtFrozenStore')(var.get(u'that')).callprop(u'set', var.get(u'key'), var.get(u'value')) + else: + var.get(u'data').put(var.get(u'that').get(u'_i'), var.get(u'value')) + return var.get(u'that') + PyJs_anonymous_1507_._set_name(u'anonymous') + PyJs_Object_1501_ = Js({u'getConstructor':PyJs_anonymous_1502_,u'def':PyJs_anonymous_1507_,u'ufstore':var.get(u'uncaughtFrozenStore')}) + var.get(u'module').put(u'exports', PyJs_Object_1501_) +PyJs_anonymous_1490_._set_name(u'anonymous') +PyJs_Object_1508_ = Js({u'./_an-instance':Js(131.0),u'./_an-object':Js(132.0),u'./_array-methods':Js(135.0),u'./_for-of':Js(153.0),u'./_has':Js(155.0),u'./_is-object':Js(162.0),u'./_meta':Js(170.0),u'./_redefine-all':Js(185.0)}) +@Js +def PyJs_anonymous_1509_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'fails', u'forOf', u'hide', u'anInstance', u'$export', u'setToStringTag', u'global', u'require', u'module', u'DESCRIPTORS', u'meta', u'redefineAll', u'each', u'isObject', u'dP']) + Js(u'use strict') + var.put(u'global', var.get(u'require')(Js(u'./_global'))) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + var.put(u'meta', var.get(u'require')(Js(u'./_meta'))) + var.put(u'fails', var.get(u'require')(Js(u'./_fails'))) + var.put(u'hide', var.get(u'require')(Js(u'./_hide'))) + var.put(u'redefineAll', var.get(u'require')(Js(u'./_redefine-all'))) + var.put(u'forOf', var.get(u'require')(Js(u'./_for-of'))) + var.put(u'anInstance', var.get(u'require')(Js(u'./_an-instance'))) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + var.put(u'setToStringTag', var.get(u'require')(Js(u'./_set-to-string-tag'))) + var.put(u'dP', var.get(u'require')(Js(u'./_object-dp')).get(u'f')) + var.put(u'each', var.get(u'require')(Js(u'./_array-methods'))(Js(0.0))) + var.put(u'DESCRIPTORS', var.get(u'require')(Js(u'./_descriptors'))) + @Js + def PyJs_anonymous_1510_(NAME, wrapper, methods, common, IS_MAP, IS_WEAK, this, arguments, var=var): + var = Scope({u'NAME':NAME, u'this':this, u'arguments':arguments, u'IS_MAP':IS_MAP, u'wrapper':wrapper, u'IS_WEAK':IS_WEAK, u'common':common, u'methods':methods}, var) + var.registers([u'C', u'wrapper', u'NAME', u'proto', u'IS_MAP', u'O', u'common', u'Base', u'IS_WEAK', u'ADDER', u'methods']) + var.put(u'Base', var.get(u'global').get(var.get(u'NAME'))) + var.put(u'C', var.get(u'Base')) + var.put(u'ADDER', (Js(u'set') if var.get(u'IS_MAP') else Js(u'add'))) + var.put(u'proto', (var.get(u'C') and var.get(u'C').get(u'prototype'))) + PyJs_Object_1511_ = Js({}) + var.put(u'O', PyJs_Object_1511_) + @Js + def PyJs_anonymous_1512_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'C').create().callprop(u'entries').callprop(u'next') + PyJs_anonymous_1512_._set_name(u'anonymous') + if ((var.get(u'DESCRIPTORS').neg() or (var.get(u'C',throw=False).typeof()!=Js(u'function'))) or (var.get(u'IS_WEAK') or (var.get(u'proto').get(u'forEach') and var.get(u'fails')(PyJs_anonymous_1512_).neg())).neg()): + var.put(u'C', var.get(u'common').callprop(u'getConstructor', var.get(u'wrapper'), var.get(u'NAME'), var.get(u'IS_MAP'), var.get(u'ADDER'))) + var.get(u'redefineAll')(var.get(u'C').get(u'prototype'), var.get(u'methods')) + var.get(u'meta').put(u'NEED', var.get(u'true')) + else: + @Js + def PyJs_anonymous_1513_(target, iterable, this, arguments, var=var): + var = Scope({u'this':this, u'target':target, u'iterable':iterable, u'arguments':arguments}, var) + var.registers([u'target', u'iterable']) + var.get(u'anInstance')(var.get(u'target'), var.get(u'C'), var.get(u'NAME'), Js(u'_c')) + var.get(u'target').put(u'_c', var.get(u'Base').create()) + if (var.get(u'iterable')!=var.get(u'undefined')): + var.get(u'forOf')(var.get(u'iterable'), var.get(u'IS_MAP'), var.get(u'target').get(var.get(u'ADDER')), var.get(u'target')) + PyJs_anonymous_1513_._set_name(u'anonymous') + var.put(u'C', var.get(u'wrapper')(PyJs_anonymous_1513_)) + @Js + def PyJs_anonymous_1514_(KEY, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'KEY':KEY}, var) + var.registers([u'IS_ADDER', u'KEY']) + var.put(u'IS_ADDER', ((var.get(u'KEY')==Js(u'add')) or (var.get(u'KEY')==Js(u'set')))) + if (var.get(u'proto').contains(var.get(u'KEY')) and (var.get(u'IS_WEAK') and (var.get(u'KEY')==Js(u'clear'))).neg()): + @Js + def PyJs_anonymous_1515_(a, b, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'b', u'result']) + var.get(u'anInstance')(var.get(u"this"), var.get(u'C'), var.get(u'KEY')) + if ((var.get(u'IS_ADDER').neg() and var.get(u'IS_WEAK')) and var.get(u'isObject')(var.get(u'a')).neg()): + return (var.get(u'undefined') if (var.get(u'KEY')==Js(u'get')) else Js(False)) + var.put(u'result', var.get(u"this").get(u'_c').callprop(var.get(u'KEY'), (Js(0.0) if PyJsStrictEq(var.get(u'a'),Js(0.0)) else var.get(u'a')), var.get(u'b'))) + return (var.get(u"this") if var.get(u'IS_ADDER') else var.get(u'result')) + PyJs_anonymous_1515_._set_name(u'anonymous') + var.get(u'hide')(var.get(u'C').get(u'prototype'), var.get(u'KEY'), PyJs_anonymous_1515_) + PyJs_anonymous_1514_._set_name(u'anonymous') + var.get(u'each')(Js(u'add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON').callprop(u'split', Js(u',')), PyJs_anonymous_1514_) + if var.get(u'proto').contains(Js(u'size')): + @Js + def PyJs_anonymous_1517_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").get(u'_c').get(u'size') + PyJs_anonymous_1517_._set_name(u'anonymous') + PyJs_Object_1516_ = Js({u'get':PyJs_anonymous_1517_}) + var.get(u'dP')(var.get(u'C').get(u'prototype'), Js(u'size'), PyJs_Object_1516_) + var.get(u'setToStringTag')(var.get(u'C'), var.get(u'NAME')) + var.get(u'O').put(var.get(u'NAME'), var.get(u'C')) + var.get(u'$export')(((var.get(u'$export').get(u'G')+var.get(u'$export').get(u'W'))+var.get(u'$export').get(u'F')), var.get(u'O')) + if var.get(u'IS_WEAK').neg(): + var.get(u'common').callprop(u'setStrong', var.get(u'C'), var.get(u'NAME'), var.get(u'IS_MAP')) + return var.get(u'C') + PyJs_anonymous_1510_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1510_) +PyJs_anonymous_1509_._set_name(u'anonymous') +PyJs_Object_1518_ = Js({u'./_an-instance':Js(131.0),u'./_array-methods':Js(135.0),u'./_descriptors':Js(147.0),u'./_export':Js(151.0),u'./_fails':Js(152.0),u'./_for-of':Js(153.0),u'./_global':Js(154.0),u'./_hide':Js(156.0),u'./_is-object':Js(162.0),u'./_meta':Js(170.0),u'./_object-dp':Js(173.0),u'./_redefine-all':Js(185.0),u'./_set-to-string-tag':Js(189.0)}) +@Js +def PyJs_anonymous_1519_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'core', u'require', u'exports', u'module']) + PyJs_Object_1520_ = Js({u'version':Js(u'2.4.0')}) + var.put(u'core', var.get(u'module').put(u'exports', PyJs_Object_1520_)) + if (var.get(u'__e',throw=False).typeof()==Js(u'number')): + var.put(u'__e', var.get(u'core')) +PyJs_anonymous_1519_._set_name(u'anonymous') +PyJs_Object_1521_ = Js({}) +@Js +def PyJs_anonymous_1522_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'aFunction', u'require', u'exports', u'module']) + var.put(u'aFunction', var.get(u'require')(Js(u'./_a-function'))) + @Js + def PyJs_anonymous_1523_(fn, that, length, this, arguments, var=var): + var = Scope({u'this':this, u'length':length, u'arguments':arguments, u'fn':fn, u'that':that}, var) + var.registers([u'length', u'fn', u'that']) + var.get(u'aFunction')(var.get(u'fn')) + if PyJsStrictEq(var.get(u'that'),var.get(u'undefined')): + return var.get(u'fn') + while 1: + SWITCHED = False + CONDITION = (var.get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(1.0)): + SWITCHED = True + @Js + def PyJs_anonymous_1524_(a, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'arguments':arguments}, var) + var.registers([u'a']) + return var.get(u'fn').callprop(u'call', var.get(u'that'), var.get(u'a')) + PyJs_anonymous_1524_._set_name(u'anonymous') + return PyJs_anonymous_1524_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(2.0)): + SWITCHED = True + @Js + def PyJs_anonymous_1525_(a, b, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'b']) + return var.get(u'fn').callprop(u'call', var.get(u'that'), var.get(u'a'), var.get(u'b')) + PyJs_anonymous_1525_._set_name(u'anonymous') + return PyJs_anonymous_1525_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(3.0)): + SWITCHED = True + @Js + def PyJs_anonymous_1526_(a, b, c, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'c':c, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'c', u'b']) + return var.get(u'fn').callprop(u'call', var.get(u'that'), var.get(u'a'), var.get(u'b'), var.get(u'c')) + PyJs_anonymous_1526_._set_name(u'anonymous') + return PyJs_anonymous_1526_ + SWITCHED = True + break + @Js + def PyJs_anonymous_1527_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'fn').callprop(u'apply', var.get(u'that'), var.get(u'arguments')) + PyJs_anonymous_1527_._set_name(u'anonymous') + return PyJs_anonymous_1527_ + PyJs_anonymous_1523_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1523_) +PyJs_anonymous_1522_._set_name(u'anonymous') +PyJs_Object_1528_ = Js({u'./_a-function':Js(129.0)}) +@Js +def PyJs_anonymous_1529_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1530_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + if (var.get(u'it')==var.get(u'undefined')): + PyJsTempException = JsToPyException(var.get(u'TypeError')((Js(u"Can't call method on ")+var.get(u'it')))) + raise PyJsTempException + return var.get(u'it') + PyJs_anonymous_1530_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1530_) +PyJs_anonymous_1529_._set_name(u'anonymous') +PyJs_Object_1531_ = Js({}) +@Js +def PyJs_anonymous_1532_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1533_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_1534_ = Js({}) + @Js + def PyJs_anonymous_1536_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(7.0) + PyJs_anonymous_1536_._set_name(u'anonymous') + PyJs_Object_1535_ = Js({u'get':PyJs_anonymous_1536_}) + return (var.get(u'Object').callprop(u'defineProperty', PyJs_Object_1534_, Js(u'a'), PyJs_Object_1535_).get(u'a')!=Js(7.0)) + PyJs_anonymous_1533_._set_name(u'anonymous') + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./_fails'))(PyJs_anonymous_1533_).neg()) +PyJs_anonymous_1532_._set_name(u'anonymous') +PyJs_Object_1537_ = Js({u'./_fails':Js(152.0)}) +@Js +def PyJs_anonymous_1538_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'is', u'module', u'isObject', u'document', u'require']) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + var.put(u'document', var.get(u'require')(Js(u'./_global')).get(u'document')) + var.put(u'is', (var.get(u'isObject')(var.get(u'document')) and var.get(u'isObject')(var.get(u'document').get(u'createElement')))) + @Js + def PyJs_anonymous_1539_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + PyJs_Object_1540_ = Js({}) + return (var.get(u'document').callprop(u'createElement', var.get(u'it')) if var.get(u'is') else PyJs_Object_1540_) + PyJs_anonymous_1539_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1539_) +PyJs_anonymous_1538_._set_name(u'anonymous') +PyJs_Object_1541_ = Js({u'./_global':Js(154.0),u'./_is-object':Js(162.0)}) +@Js +def PyJs_anonymous_1542_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'module').put(u'exports', Js(u'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf').callprop(u'split', Js(u','))) +PyJs_anonymous_1542_._set_name(u'anonymous') +PyJs_Object_1543_ = Js({}) +@Js +def PyJs_anonymous_1544_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'pIE', u'module', u'gOPS', u'getKeys']) + var.put(u'getKeys', var.get(u'require')(Js(u'./_object-keys'))) + var.put(u'gOPS', var.get(u'require')(Js(u'./_object-gops'))) + var.put(u'pIE', var.get(u'require')(Js(u'./_object-pie'))) + @Js + def PyJs_anonymous_1545_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'getSymbols', u'i', u'it', u'symbols', u'isEnum', u'result', u'key']) + var.put(u'result', var.get(u'getKeys')(var.get(u'it'))) + var.put(u'getSymbols', var.get(u'gOPS').get(u'f')) + if var.get(u'getSymbols'): + var.put(u'symbols', var.get(u'getSymbols')(var.get(u'it'))) + var.put(u'isEnum', var.get(u'pIE').get(u'f')) + var.put(u'i', Js(0.0)) + while (var.get(u'symbols').get(u'length')>var.get(u'i')): + if var.get(u'isEnum').callprop(u'call', var.get(u'it'), var.put(u'key', var.get(u'symbols').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1))))): + var.get(u'result').callprop(u'push', var.get(u'key')) + return var.get(u'result') + PyJs_anonymous_1545_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1545_) +PyJs_anonymous_1544_._set_name(u'anonymous') +PyJs_Object_1546_ = Js({u'./_object-gops':Js(178.0),u'./_object-keys':Js(181.0),u'./_object-pie':Js(182.0)}) +@Js +def PyJs_anonymous_1547_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'core', u'exports', u'hide', u'$export', u'require', u'global', u'ctx', u'module', u'PROTOTYPE']) + var.put(u'global', var.get(u'require')(Js(u'./_global'))) + var.put(u'core', var.get(u'require')(Js(u'./_core'))) + var.put(u'ctx', var.get(u'require')(Js(u'./_ctx'))) + var.put(u'hide', var.get(u'require')(Js(u'./_hide'))) + var.put(u'PROTOTYPE', Js(u'prototype')) + @Js + def PyJs_anonymous_1548_(type, name, source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'type':type, u'name':name, u'arguments':arguments}, var) + var.registers([u'IS_STATIC', u'IS_WRAP', u'exports', u'IS_GLOBAL', u'target', u'expProto', u'name', u'source', u'IS_PROTO', u'key', u'own', u'IS_FORCED', u'type', u'IS_BIND', u'out']) + var.put(u'IS_FORCED', (var.get(u'type')&var.get(u'$export').get(u'F'))) + var.put(u'IS_GLOBAL', (var.get(u'type')&var.get(u'$export').get(u'G'))) + var.put(u'IS_STATIC', (var.get(u'type')&var.get(u'$export').get(u'S'))) + var.put(u'IS_PROTO', (var.get(u'type')&var.get(u'$export').get(u'P'))) + var.put(u'IS_BIND', (var.get(u'type')&var.get(u'$export').get(u'B'))) + var.put(u'IS_WRAP', (var.get(u'type')&var.get(u'$export').get(u'W'))) + PyJs_Object_1549_ = Js({}) + var.put(u'exports', (var.get(u'core') if var.get(u'IS_GLOBAL') else (var.get(u'core').get(var.get(u'name')) or var.get(u'core').put(var.get(u'name'), PyJs_Object_1549_)))) + var.put(u'expProto', var.get(u'exports').get(var.get(u'PROTOTYPE'))) + PyJs_Object_1550_ = Js({}) + var.put(u'target', (var.get(u'global') if var.get(u'IS_GLOBAL') else (var.get(u'global').get(var.get(u'name')) if var.get(u'IS_STATIC') else (var.get(u'global').get(var.get(u'name')) or PyJs_Object_1550_).get(var.get(u'PROTOTYPE'))))) + if var.get(u'IS_GLOBAL'): + var.put(u'source', var.get(u'name')) + for PyJsTemp in var.get(u'source'): + var.put(u'key', PyJsTemp) + var.put(u'own', ((var.get(u'IS_FORCED').neg() and var.get(u'target')) and PyJsStrictNeq(var.get(u'target').get(var.get(u'key')),var.get(u'undefined')))) + if (var.get(u'own') and var.get(u'exports').contains(var.get(u'key'))): + continue + var.put(u'out', (var.get(u'target').get(var.get(u'key')) if var.get(u'own') else var.get(u'source').get(var.get(u'key')))) + def PyJs_LONG_1553_(var=var): + @Js + def PyJs_anonymous_1551_(C, this, arguments, var=var): + var = Scope({u'this':this, u'C':C, u'arguments':arguments}, var) + var.registers([u'C', u'F']) + @Js + def PyJs_anonymous_1552_(a, b, c, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'c':c, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'c', u'b']) + if var.get(u"this").instanceof(var.get(u'C')): + while 1: + SWITCHED = False + CONDITION = (var.get(u'arguments').get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(0.0)): + SWITCHED = True + return var.get(u'C').create() + if SWITCHED or PyJsStrictEq(CONDITION, Js(1.0)): + SWITCHED = True + return var.get(u'C').create(var.get(u'a')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(2.0)): + SWITCHED = True + return var.get(u'C').create(var.get(u'a'), var.get(u'b')) + SWITCHED = True + break + return var.get(u'C').create(var.get(u'a'), var.get(u'b'), var.get(u'c')) + return var.get(u'C').callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + PyJs_anonymous_1552_._set_name(u'anonymous') + var.put(u'F', PyJs_anonymous_1552_) + var.get(u'F').put(var.get(u'PROTOTYPE'), var.get(u'C').get(var.get(u'PROTOTYPE'))) + return var.get(u'F') + PyJs_anonymous_1551_._set_name(u'anonymous') + return (var.get(u'ctx')(var.get(u'out'), var.get(u'global')) if (var.get(u'IS_BIND') and var.get(u'own')) else (PyJs_anonymous_1551_(var.get(u'out')) if (var.get(u'IS_WRAP') and (var.get(u'target').get(var.get(u'key'))==var.get(u'out'))) else (var.get(u'ctx')(var.get(u'Function').get(u'call'), var.get(u'out')) if (var.get(u'IS_PROTO') and (var.get(u'out',throw=False).typeof()==Js(u'function'))) else var.get(u'out')))) + var.get(u'exports').put(var.get(u'key'), (var.get(u'source').get(var.get(u'key')) if (var.get(u'IS_GLOBAL') and (var.get(u'target').get(var.get(u'key')).typeof()!=Js(u'function'))) else PyJs_LONG_1553_())) + if var.get(u'IS_PROTO'): + PyJs_Object_1554_ = Js({}) + (var.get(u'exports').get(u'virtual') or var.get(u'exports').put(u'virtual', PyJs_Object_1554_)).put(var.get(u'key'), var.get(u'out')) + if (((var.get(u'type')&var.get(u'$export').get(u'R')) and var.get(u'expProto')) and var.get(u'expProto').get(var.get(u'key')).neg()): + var.get(u'hide')(var.get(u'expProto'), var.get(u'key'), var.get(u'out')) + PyJs_anonymous_1548_._set_name(u'anonymous') + var.put(u'$export', PyJs_anonymous_1548_) + var.get(u'$export').put(u'F', Js(1.0)) + var.get(u'$export').put(u'G', Js(2.0)) + var.get(u'$export').put(u'S', Js(4.0)) + var.get(u'$export').put(u'P', Js(8.0)) + var.get(u'$export').put(u'B', Js(16.0)) + var.get(u'$export').put(u'W', Js(32.0)) + var.get(u'$export').put(u'U', Js(64.0)) + var.get(u'$export').put(u'R', Js(128.0)) + var.get(u'module').put(u'exports', var.get(u'$export')) +PyJs_anonymous_1547_._set_name(u'anonymous') +PyJs_Object_1555_ = Js({u'./_core':Js(144.0),u'./_ctx':Js(145.0),u'./_global':Js(154.0),u'./_hide':Js(156.0)}) +@Js +def PyJs_anonymous_1556_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1557_(PyJsArg_65786563_, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'exec':PyJsArg_65786563_}, var) + var.registers([u'exec']) + try: + return var.get(u'exec')().neg().neg() + except PyJsException as PyJsTempException: + PyJsHolder_65_66067223 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + return var.get(u'true') + finally: + if PyJsHolder_65_66067223 is not None: + var.own[u'e'] = PyJsHolder_65_66067223 + else: + del var.own[u'e'] + del PyJsHolder_65_66067223 + PyJs_anonymous_1557_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1557_) +PyJs_anonymous_1556_._set_name(u'anonymous') +PyJs_Object_1558_ = Js({}) +@Js +def PyJs_anonymous_1559_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'getIterFn', u'RETURN', u'require', u'ctx', u'module', u'BREAK', u'toLength', u'call', u'isArrayIter', u'anObject']) + var.put(u'ctx', var.get(u'require')(Js(u'./_ctx'))) + var.put(u'call', var.get(u'require')(Js(u'./_iter-call'))) + var.put(u'isArrayIter', var.get(u'require')(Js(u'./_is-array-iter'))) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + var.put(u'toLength', var.get(u'require')(Js(u'./_to-length'))) + var.put(u'getIterFn', var.get(u'require')(Js(u'./core.get-iterator-method'))) + PyJs_Object_1560_ = Js({}) + var.put(u'BREAK', PyJs_Object_1560_) + PyJs_Object_1561_ = Js({}) + var.put(u'RETURN', PyJs_Object_1561_) + @Js + def PyJs_anonymous_1562_(iterable, entries, fn, that, ITERATOR, this, arguments, var=var): + var = Scope({u'iterable':iterable, u'ITERATOR':ITERATOR, u'that':that, u'this':this, u'entries':entries, u'fn':fn, u'arguments':arguments}, var) + var.registers([u'iterFn', u'index', u'ITERATOR', u'iterator', u'f', u'that', u'step', u'length', u'result', u'entries', u'fn', u'iterable']) + @Js + def PyJs_anonymous_1563_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'iterable') + PyJs_anonymous_1563_._set_name(u'anonymous') + var.put(u'iterFn', (PyJs_anonymous_1563_ if var.get(u'ITERATOR') else var.get(u'getIterFn')(var.get(u'iterable')))) + var.put(u'f', var.get(u'ctx')(var.get(u'fn'), var.get(u'that'), (Js(2.0) if var.get(u'entries') else Js(1.0)))) + var.put(u'index', Js(0.0)) + if (var.get(u'iterFn',throw=False).typeof()!=Js(u'function')): + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'iterable')+Js(u' is not iterable!')))) + raise PyJsTempException + if var.get(u'isArrayIter')(var.get(u'iterFn')): + #for JS loop + var.put(u'length', var.get(u'toLength')(var.get(u'iterable').get(u'length'))) + while (var.get(u'length')>var.get(u'index')): + try: + var.put(u'result', (var.get(u'f')(var.get(u'anObject')(var.put(u'step', var.get(u'iterable').get(var.get(u'index')))).get(u'0'), var.get(u'step').get(u'1')) if var.get(u'entries') else var.get(u'f')(var.get(u'iterable').get(var.get(u'index'))))) + if (PyJsStrictEq(var.get(u'result'),var.get(u'BREAK')) or PyJsStrictEq(var.get(u'result'),var.get(u'RETURN'))): + return var.get(u'result') + finally: + (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)) + else: + #for JS loop + var.put(u'iterator', var.get(u'iterFn').callprop(u'call', var.get(u'iterable'))) + while var.put(u'step', var.get(u'iterator').callprop(u'next')).get(u'done').neg(): + var.put(u'result', var.get(u'call')(var.get(u'iterator'), var.get(u'f'), var.get(u'step').get(u'value'), var.get(u'entries'))) + if (PyJsStrictEq(var.get(u'result'),var.get(u'BREAK')) or PyJsStrictEq(var.get(u'result'),var.get(u'RETURN'))): + return var.get(u'result') + + PyJs_anonymous_1562_._set_name(u'anonymous') + var.put(u'exports', var.get(u'module').put(u'exports', PyJs_anonymous_1562_)) + var.get(u'exports').put(u'BREAK', var.get(u'BREAK')) + var.get(u'exports').put(u'RETURN', var.get(u'RETURN')) +PyJs_anonymous_1559_._set_name(u'anonymous') +PyJs_Object_1564_ = Js({u'./_an-object':Js(132.0),u'./_ctx':Js(145.0),u'./_is-array-iter':Js(160.0),u'./_iter-call':Js(163.0),u'./_to-length':Js(196.0),u'./core.get-iterator-method':Js(203.0)}) +@Js +def PyJs_anonymous_1565_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'global', u'exports', u'module']) + var.put(u'global', var.get(u'module').put(u'exports', (var.get(u'window') if ((var.get(u'window',throw=False).typeof()!=Js(u'undefined')) and (var.get(u'window').get(u'Math')==var.get(u'Math'))) else (var.get(u'self') if ((var.get(u'self',throw=False).typeof()!=Js(u'undefined')) and (var.get(u'self').get(u'Math')==var.get(u'Math'))) else var.get(u'Function')(Js(u'return this'))())))) + if (var.get(u'__g',throw=False).typeof()==Js(u'number')): + var.put(u'__g', var.get(u'global')) +PyJs_anonymous_1565_._set_name(u'anonymous') +PyJs_Object_1566_ = Js({}) +@Js +def PyJs_anonymous_1567_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'hasOwnProperty', u'module']) + PyJs_Object_1568_ = Js({}) + var.put(u'hasOwnProperty', PyJs_Object_1568_.get(u'hasOwnProperty')) + @Js + def PyJs_anonymous_1569_(it, key, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'key':key, u'arguments':arguments}, var) + var.registers([u'it', u'key']) + return var.get(u'hasOwnProperty').callprop(u'call', var.get(u'it'), var.get(u'key')) + PyJs_anonymous_1569_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1569_) +PyJs_anonymous_1567_._set_name(u'anonymous') +PyJs_Object_1570_ = Js({}) +@Js +def PyJs_anonymous_1571_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'require', u'exports', u'createDesc', u'dP']) + var.put(u'dP', var.get(u'require')(Js(u'./_object-dp'))) + var.put(u'createDesc', var.get(u'require')(Js(u'./_property-desc'))) + @Js + def PyJs_anonymous_1572_(object, key, value, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'object', u'value', u'key']) + return var.get(u'dP').callprop(u'f', var.get(u'object'), var.get(u'key'), var.get(u'createDesc')(Js(1.0), var.get(u'value'))) + PyJs_anonymous_1572_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1573_(object, key, value, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'object', u'value', u'key']) + var.get(u'object').put(var.get(u'key'), var.get(u'value')) + return var.get(u'object') + PyJs_anonymous_1573_._set_name(u'anonymous') + var.get(u'module').put(u'exports', (PyJs_anonymous_1572_ if var.get(u'require')(Js(u'./_descriptors')) else PyJs_anonymous_1573_)) +PyJs_anonymous_1571_._set_name(u'anonymous') +PyJs_Object_1574_ = Js({u'./_descriptors':Js(147.0),u'./_object-dp':Js(173.0),u'./_property-desc':Js(184.0)}) +@Js +def PyJs_anonymous_1575_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'module').put(u'exports', (var.get(u'require')(Js(u'./_global')).get(u'document') and var.get(u'document').get(u'documentElement'))) +PyJs_anonymous_1575_._set_name(u'anonymous') +PyJs_Object_1576_ = Js({u'./_global':Js(154.0)}) +@Js +def PyJs_anonymous_1577_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1578_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_anonymous_1580_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(7.0) + PyJs_anonymous_1580_._set_name(u'anonymous') + PyJs_Object_1579_ = Js({u'get':PyJs_anonymous_1580_}) + return (var.get(u'Object').callprop(u'defineProperty', var.get(u'require')(Js(u'./_dom-create'))(Js(u'div')), Js(u'a'), PyJs_Object_1579_).get(u'a')!=Js(7.0)) + PyJs_anonymous_1578_._set_name(u'anonymous') + var.get(u'module').put(u'exports', (var.get(u'require')(Js(u'./_descriptors')).neg() and var.get(u'require')(Js(u'./_fails'))(PyJs_anonymous_1578_).neg())) +PyJs_anonymous_1577_._set_name(u'anonymous') +PyJs_Object_1581_ = Js({u'./_descriptors':Js(147.0),u'./_dom-create':Js(148.0),u'./_fails':Js(152.0)}) +@Js +def PyJs_anonymous_1582_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'cof']) + var.put(u'cof', var.get(u'require')(Js(u'./_cof'))) + @Js + def PyJs_anonymous_1583_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return (var.get(u'it').callprop(u'split', Js(u'')) if (var.get(u'cof')(var.get(u'it'))==Js(u'String')) else var.get(u'Object')(var.get(u'it'))) + PyJs_anonymous_1583_._set_name(u'anonymous') + var.get(u'module').put(u'exports', (var.get(u'Object') if var.get(u'Object')(Js(u'z')).callprop(u'propertyIsEnumerable', Js(0.0)) else PyJs_anonymous_1583_)) +PyJs_anonymous_1582_._set_name(u'anonymous') +PyJs_Object_1584_ = Js({u'./_cof':Js(139.0)}) +@Js +def PyJs_anonymous_1585_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'ITERATOR', u'ArrayProto', u'require', u'module', u'Iterators']) + var.put(u'Iterators', var.get(u'require')(Js(u'./_iterators'))) + var.put(u'ITERATOR', var.get(u'require')(Js(u'./_wks'))(Js(u'iterator'))) + var.put(u'ArrayProto', var.get(u'Array').get(u'prototype')) + @Js + def PyJs_anonymous_1586_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return (PyJsStrictNeq(var.get(u'it'),var.get(u'undefined')) and (PyJsStrictEq(var.get(u'Iterators').get(u'Array'),var.get(u'it')) or PyJsStrictEq(var.get(u'ArrayProto').get(var.get(u'ITERATOR')),var.get(u'it')))) + PyJs_anonymous_1586_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1586_) +PyJs_anonymous_1585_._set_name(u'anonymous') +PyJs_Object_1587_ = Js({u'./_iterators':Js(167.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1588_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'cof']) + var.put(u'cof', var.get(u'require')(Js(u'./_cof'))) + @Js + def PyJs_isArray_1589_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'isArray':PyJs_isArray_1589_, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return (var.get(u'cof')(var.get(u'arg'))==Js(u'Array')) + PyJs_isArray_1589_._set_name(u'isArray') + var.get(u'module').put(u'exports', (var.get(u'Array').get(u'isArray') or PyJs_isArray_1589_)) +PyJs_anonymous_1588_._set_name(u'anonymous') +PyJs_Object_1590_ = Js({u'./_cof':Js(139.0)}) +@Js +def PyJs_anonymous_1591_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1592_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return (PyJsStrictNeq(var.get(u'it'),var.get(u"null")) if PyJsStrictEq(var.get(u'it',throw=False).typeof(),Js(u'object')) else PyJsStrictEq(var.get(u'it',throw=False).typeof(),Js(u'function'))) + PyJs_anonymous_1592_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1592_) +PyJs_anonymous_1591_._set_name(u'anonymous') +PyJs_Object_1593_ = Js({}) +@Js +def PyJs_anonymous_1594_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'anObject', u'exports', u'module']) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + @Js + def PyJs_anonymous_1595_(iterator, fn, value, entries, this, arguments, var=var): + var = Scope({u'fn':fn, u'iterator':iterator, u'entries':entries, u'this':this, u'value':value, u'arguments':arguments}, var) + var.registers([u'fn', u'value', u'iterator', u'ret', u'entries']) + try: + return (var.get(u'fn')(var.get(u'anObject')(var.get(u'value')).get(u'0'), var.get(u'value').get(u'1')) if var.get(u'entries') else var.get(u'fn')(var.get(u'value'))) + except PyJsException as PyJsTempException: + PyJsHolder_65_64523188 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + var.put(u'ret', var.get(u'iterator').get(u'return')) + if PyJsStrictNeq(var.get(u'ret'),var.get(u'undefined')): + var.get(u'anObject')(var.get(u'ret').callprop(u'call', var.get(u'iterator'))) + PyJsTempException = JsToPyException(var.get(u'e')) + raise PyJsTempException + finally: + if PyJsHolder_65_64523188 is not None: + var.own[u'e'] = PyJsHolder_65_64523188 + else: + del var.own[u'e'] + del PyJsHolder_65_64523188 + PyJs_anonymous_1595_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1595_) +PyJs_anonymous_1594_._set_name(u'anonymous') +PyJs_Object_1596_ = Js({u'./_an-object':Js(132.0)}) +@Js +def PyJs_anonymous_1597_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'setToStringTag', u'exports', u'IteratorPrototype', u'create', u'module', u'descriptor', u'require']) + Js(u'use strict') + var.put(u'create', var.get(u'require')(Js(u'./_object-create'))) + var.put(u'descriptor', var.get(u'require')(Js(u'./_property-desc'))) + var.put(u'setToStringTag', var.get(u'require')(Js(u'./_set-to-string-tag'))) + PyJs_Object_1598_ = Js({}) + var.put(u'IteratorPrototype', PyJs_Object_1598_) + @Js + def PyJs_anonymous_1599_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this") + PyJs_anonymous_1599_._set_name(u'anonymous') + var.get(u'require')(Js(u'./_hide'))(var.get(u'IteratorPrototype'), var.get(u'require')(Js(u'./_wks'))(Js(u'iterator')), PyJs_anonymous_1599_) + @Js + def PyJs_anonymous_1600_(Constructor, NAME, next, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'next':next, u'NAME':NAME, u'Constructor':Constructor}, var) + var.registers([u'next', u'NAME', u'Constructor']) + PyJs_Object_1601_ = Js({u'next':var.get(u'descriptor')(Js(1.0), var.get(u'next'))}) + var.get(u'Constructor').put(u'prototype', var.get(u'create')(var.get(u'IteratorPrototype'), PyJs_Object_1601_)) + var.get(u'setToStringTag')(var.get(u'Constructor'), (var.get(u'NAME')+Js(u' Iterator'))) + PyJs_anonymous_1600_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1600_) +PyJs_anonymous_1597_._set_name(u'anonymous') +PyJs_Object_1602_ = Js({u'./_hide':Js(156.0),u'./_object-create':Js(172.0),u'./_property-desc':Js(184.0),u'./_set-to-string-tag':Js(189.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1603_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'returnThis', u'$iterCreate', u'redefine', u'hide', u'ITERATOR', u'KEYS', u'$export', u'setToStringTag', u'BUGGY', u'require', u'LIBRARY', u'getPrototypeOf', u'Iterators', u'VALUES', u'module', u'has', u'FF_ITERATOR', u'exports']) + Js(u'use strict') + var.put(u'LIBRARY', var.get(u'require')(Js(u'./_library'))) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + var.put(u'redefine', var.get(u'require')(Js(u'./_redefine'))) + var.put(u'hide', var.get(u'require')(Js(u'./_hide'))) + var.put(u'has', var.get(u'require')(Js(u'./_has'))) + var.put(u'Iterators', var.get(u'require')(Js(u'./_iterators'))) + var.put(u'$iterCreate', var.get(u'require')(Js(u'./_iter-create'))) + var.put(u'setToStringTag', var.get(u'require')(Js(u'./_set-to-string-tag'))) + var.put(u'getPrototypeOf', var.get(u'require')(Js(u'./_object-gpo'))) + var.put(u'ITERATOR', var.get(u'require')(Js(u'./_wks'))(Js(u'iterator'))) + var.put(u'BUGGY', (Js([]).get(u'keys') and Js([]).callprop(u'keys').contains(Js(u'next'))).neg()) + var.put(u'FF_ITERATOR', Js(u'@@iterator')) + var.put(u'KEYS', Js(u'keys')) + var.put(u'VALUES', Js(u'values')) + @Js + def PyJs_anonymous_1604_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this") + PyJs_anonymous_1604_._set_name(u'anonymous') + var.put(u'returnThis', PyJs_anonymous_1604_) + @Js + def PyJs_anonymous_1605_(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED, this, arguments, var=var): + var = Scope({u'FORCED':FORCED, u'NAME':NAME, u'DEFAULT':DEFAULT, u'Constructor':Constructor, u'next':next, u'this':this, u'Base':Base, u'arguments':arguments, u'IS_SET':IS_SET}, var) + var.registers([u'DEF_VALUES', u'Base', u'$entries', u'methods', u'$default', u'proto', u'DEFAULT', u'IteratorPrototype', u'Constructor', u'getMethod', u'next', u'IS_SET', u'$anyNative', u'TAG', u'key', u'VALUES_BUG', u'$native', u'FORCED', u'NAME']) + var.get(u'$iterCreate')(var.get(u'Constructor'), var.get(u'NAME'), var.get(u'next')) + @Js + def PyJs_anonymous_1606_(kind, this, arguments, var=var): + var = Scope({u'this':this, u'kind':kind, u'arguments':arguments}, var) + var.registers([u'kind']) + if (var.get(u'BUGGY').neg() and var.get(u'proto').contains(var.get(u'kind'))): + return var.get(u'proto').get(var.get(u'kind')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'kind')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'KEYS')): + SWITCHED = True + @Js + def PyJs_keys_1607_(this, arguments, var=var): + var = Scope({u'this':this, u'keys':PyJs_keys_1607_, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'Constructor').create(var.get(u"this"), var.get(u'kind')) + PyJs_keys_1607_._set_name(u'keys') + return PyJs_keys_1607_ + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'VALUES')): + SWITCHED = True + @Js + def PyJs_values_1608_(this, arguments, var=var): + var = Scope({u'this':this, u'values':PyJs_values_1608_, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'Constructor').create(var.get(u"this"), var.get(u'kind')) + PyJs_values_1608_._set_name(u'values') + return PyJs_values_1608_ + SWITCHED = True + break + @Js + def PyJs_entries_1609_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'entries':PyJs_entries_1609_}, var) + var.registers([]) + return var.get(u'Constructor').create(var.get(u"this"), var.get(u'kind')) + PyJs_entries_1609_._set_name(u'entries') + return PyJs_entries_1609_ + PyJs_anonymous_1606_._set_name(u'anonymous') + var.put(u'getMethod', PyJs_anonymous_1606_) + var.put(u'TAG', (var.get(u'NAME')+Js(u' Iterator'))) + var.put(u'DEF_VALUES', (var.get(u'DEFAULT')==var.get(u'VALUES'))) + var.put(u'VALUES_BUG', Js(False)) + var.put(u'proto', var.get(u'Base').get(u'prototype')) + var.put(u'$native', ((var.get(u'proto').get(var.get(u'ITERATOR')) or var.get(u'proto').get(var.get(u'FF_ITERATOR'))) or (var.get(u'DEFAULT') and var.get(u'proto').get(var.get(u'DEFAULT'))))) + var.put(u'$default', (var.get(u'$native') or var.get(u'getMethod')(var.get(u'DEFAULT')))) + var.put(u'$entries', ((var.get(u'$default') if var.get(u'DEF_VALUES').neg() else var.get(u'getMethod')(Js(u'entries'))) if var.get(u'DEFAULT') else var.get(u'undefined'))) + var.put(u'$anyNative', ((var.get(u'proto').get(u'entries') or var.get(u'$native')) if (var.get(u'NAME')==Js(u'Array')) else var.get(u'$native'))) + if var.get(u'$anyNative'): + var.put(u'IteratorPrototype', var.get(u'getPrototypeOf')(var.get(u'$anyNative').callprop(u'call', var.get(u'Base').create()))) + if PyJsStrictNeq(var.get(u'IteratorPrototype'),var.get(u'Object').get(u'prototype')): + var.get(u'setToStringTag')(var.get(u'IteratorPrototype'), var.get(u'TAG'), var.get(u'true')) + if (var.get(u'LIBRARY').neg() and var.get(u'has')(var.get(u'IteratorPrototype'), var.get(u'ITERATOR')).neg()): + var.get(u'hide')(var.get(u'IteratorPrototype'), var.get(u'ITERATOR'), var.get(u'returnThis')) + if ((var.get(u'DEF_VALUES') and var.get(u'$native')) and PyJsStrictNeq(var.get(u'$native').get(u'name'),var.get(u'VALUES'))): + var.put(u'VALUES_BUG', var.get(u'true')) + @Js + def PyJs_values_1610_(this, arguments, var=var): + var = Scope({u'this':this, u'values':PyJs_values_1610_, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'$native').callprop(u'call', var.get(u"this")) + PyJs_values_1610_._set_name(u'values') + var.put(u'$default', PyJs_values_1610_) + if ((var.get(u'LIBRARY').neg() or var.get(u'FORCED')) and ((var.get(u'BUGGY') or var.get(u'VALUES_BUG')) or var.get(u'proto').get(var.get(u'ITERATOR')).neg())): + var.get(u'hide')(var.get(u'proto'), var.get(u'ITERATOR'), var.get(u'$default')) + var.get(u'Iterators').put(var.get(u'NAME'), var.get(u'$default')) + var.get(u'Iterators').put(var.get(u'TAG'), var.get(u'returnThis')) + if var.get(u'DEFAULT'): + PyJs_Object_1611_ = Js({u'values':(var.get(u'$default') if var.get(u'DEF_VALUES') else var.get(u'getMethod')(var.get(u'VALUES'))),u'keys':(var.get(u'$default') if var.get(u'IS_SET') else var.get(u'getMethod')(var.get(u'KEYS'))),u'entries':var.get(u'$entries')}) + var.put(u'methods', PyJs_Object_1611_) + if var.get(u'FORCED'): + for PyJsTemp in var.get(u'methods'): + var.put(u'key', PyJsTemp) + if var.get(u'proto').contains(var.get(u'key')).neg(): + var.get(u'redefine')(var.get(u'proto'), var.get(u'key'), var.get(u'methods').get(var.get(u'key'))) + else: + var.get(u'$export')((var.get(u'$export').get(u'P')+(var.get(u'$export').get(u'F')*(var.get(u'BUGGY') or var.get(u'VALUES_BUG')))), var.get(u'NAME'), var.get(u'methods')) + return var.get(u'methods') + PyJs_anonymous_1605_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1605_) +PyJs_anonymous_1603_._set_name(u'anonymous') +PyJs_Object_1612_ = Js({u'./_export':Js(151.0),u'./_has':Js(155.0),u'./_hide':Js(156.0),u'./_iter-create':Js(164.0),u'./_iterators':Js(167.0),u'./_library':Js(169.0),u'./_object-gpo':Js(179.0),u'./_redefine':Js(186.0),u'./_set-to-string-tag':Js(189.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1613_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1614_(done, value, this, arguments, var=var): + var = Scope({u'this':this, u'done':done, u'arguments':arguments, u'value':value}, var) + var.registers([u'done', u'value']) + PyJs_Object_1615_ = Js({u'value':var.get(u'value'),u'done':var.get(u'done').neg().neg()}) + return PyJs_Object_1615_ + PyJs_anonymous_1614_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1614_) +PyJs_anonymous_1613_._set_name(u'anonymous') +PyJs_Object_1616_ = Js({}) +@Js +def PyJs_anonymous_1617_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1618_ = Js({}) + var.get(u'module').put(u'exports', PyJs_Object_1618_) +PyJs_anonymous_1617_._set_name(u'anonymous') +PyJs_Object_1619_ = Js({}) +@Js +def PyJs_anonymous_1620_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'toIObject', u'exports', u'module', u'getKeys']) + var.put(u'getKeys', var.get(u'require')(Js(u'./_object-keys'))) + var.put(u'toIObject', var.get(u'require')(Js(u'./_to-iobject'))) + @Js + def PyJs_anonymous_1621_(object, el, this, arguments, var=var): + var = Scope({u'this':this, u'el':el, u'object':object, u'arguments':arguments}, var) + var.registers([u'index', u'el', u'keys', u'object', u'O', u'length', u'key']) + var.put(u'O', var.get(u'toIObject')(var.get(u'object'))) + var.put(u'keys', var.get(u'getKeys')(var.get(u'O'))) + var.put(u'length', var.get(u'keys').get(u'length')) + var.put(u'index', Js(0.0)) + while (var.get(u'length')>var.get(u'index')): + if PyJsStrictEq(var.get(u'O').get(var.put(u'key', var.get(u'keys').get((var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1))))),var.get(u'el')): + return var.get(u'key') + PyJs_anonymous_1621_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1621_) +PyJs_anonymous_1620_._set_name(u'anonymous') +PyJs_Object_1622_ = Js({u'./_object-keys':Js(181.0),u'./_to-iobject':Js(195.0)}) +@Js +def PyJs_anonymous_1623_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'module').put(u'exports', var.get(u'true')) +PyJs_anonymous_1623_._set_name(u'anonymous') +PyJs_Object_1624_ = Js({}) +@Js +def PyJs_anonymous_1625_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'fastKey', u'FREEZE', u'getWeak', u'require', u'isExtensible', u'exports', u'module', u'id', u'setMeta', u'META', u'meta', u'onFreeze', u'has', u'setDesc', u'isObject']) + var.put(u'META', var.get(u'require')(Js(u'./_uid'))(Js(u'meta'))) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + var.put(u'has', var.get(u'require')(Js(u'./_has'))) + var.put(u'setDesc', var.get(u'require')(Js(u'./_object-dp')).get(u'f')) + var.put(u'id', Js(0.0)) + @Js + def PyJs_anonymous_1626_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'true') + PyJs_anonymous_1626_._set_name(u'anonymous') + var.put(u'isExtensible', (var.get(u'Object').get(u'isExtensible') or PyJs_anonymous_1626_)) + @Js + def PyJs_anonymous_1627_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_1628_ = Js({}) + return var.get(u'isExtensible')(var.get(u'Object').callprop(u'preventExtensions', PyJs_Object_1628_)) + PyJs_anonymous_1627_._set_name(u'anonymous') + var.put(u'FREEZE', var.get(u'require')(Js(u'./_fails'))(PyJs_anonymous_1627_).neg()) + @Js + def PyJs_anonymous_1629_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + PyJs_Object_1632_ = Js({}) + PyJs_Object_1631_ = Js({u'i':(Js(u'O')+var.put(u'id',Js(var.get(u'id').to_number())+Js(1))),u'w':PyJs_Object_1632_}) + PyJs_Object_1630_ = Js({u'value':PyJs_Object_1631_}) + var.get(u'setDesc')(var.get(u'it'), var.get(u'META'), PyJs_Object_1630_) + PyJs_anonymous_1629_._set_name(u'anonymous') + var.put(u'setMeta', PyJs_anonymous_1629_) + @Js + def PyJs_anonymous_1633_(it, create, this, arguments, var=var): + var = Scope({u'this':this, u'create':create, u'it':it, u'arguments':arguments}, var) + var.registers([u'create', u'it']) + if var.get(u'isObject')(var.get(u'it')).neg(): + return (var.get(u'it') if (var.get(u'it',throw=False).typeof()==Js(u'symbol')) else ((Js(u'S') if (var.get(u'it',throw=False).typeof()==Js(u'string')) else Js(u'P'))+var.get(u'it'))) + if var.get(u'has')(var.get(u'it'), var.get(u'META')).neg(): + if var.get(u'isExtensible')(var.get(u'it')).neg(): + return Js(u'F') + if var.get(u'create').neg(): + return Js(u'E') + var.get(u'setMeta')(var.get(u'it')) + return var.get(u'it').get(var.get(u'META')).get(u'i') + PyJs_anonymous_1633_._set_name(u'anonymous') + var.put(u'fastKey', PyJs_anonymous_1633_) + @Js + def PyJs_anonymous_1634_(it, create, this, arguments, var=var): + var = Scope({u'this':this, u'create':create, u'it':it, u'arguments':arguments}, var) + var.registers([u'create', u'it']) + if var.get(u'has')(var.get(u'it'), var.get(u'META')).neg(): + if var.get(u'isExtensible')(var.get(u'it')).neg(): + return var.get(u'true') + if var.get(u'create').neg(): + return Js(False) + var.get(u'setMeta')(var.get(u'it')) + return var.get(u'it').get(var.get(u'META')).get(u'w') + PyJs_anonymous_1634_._set_name(u'anonymous') + var.put(u'getWeak', PyJs_anonymous_1634_) + @Js + def PyJs_anonymous_1635_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + if (((var.get(u'FREEZE') and var.get(u'meta').get(u'NEED')) and var.get(u'isExtensible')(var.get(u'it'))) and var.get(u'has')(var.get(u'it'), var.get(u'META')).neg()): + var.get(u'setMeta')(var.get(u'it')) + return var.get(u'it') + PyJs_anonymous_1635_._set_name(u'anonymous') + var.put(u'onFreeze', PyJs_anonymous_1635_) + PyJs_Object_1636_ = Js({u'KEY':var.get(u'META'),u'NEED':Js(False),u'fastKey':var.get(u'fastKey'),u'getWeak':var.get(u'getWeak'),u'onFreeze':var.get(u'onFreeze')}) + var.put(u'meta', var.get(u'module').put(u'exports', PyJs_Object_1636_)) +PyJs_anonymous_1625_._set_name(u'anonymous') +PyJs_Object_1637_ = Js({u'./_fails':Js(152.0),u'./_has':Js(155.0),u'./_is-object':Js(162.0),u'./_object-dp':Js(173.0),u'./_uid':Js(199.0)}) +@Js +def PyJs_anonymous_1638_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'IObject', u'$assign', u'toObject', u'pIE', u'module', u'gOPS', u'getKeys', u'require']) + Js(u'use strict') + var.put(u'getKeys', var.get(u'require')(Js(u'./_object-keys'))) + var.put(u'gOPS', var.get(u'require')(Js(u'./_object-gops'))) + var.put(u'pIE', var.get(u'require')(Js(u'./_object-pie'))) + var.put(u'toObject', var.get(u'require')(Js(u'./_to-object'))) + var.put(u'IObject', var.get(u'require')(Js(u'./_iobject'))) + var.put(u'$assign', var.get(u'Object').get(u'assign')) + @Js + def PyJs_assign_1639_(target, source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'assign':PyJs_assign_1639_, u'target':target, u'arguments':arguments}, var) + var.registers([u'index', u'target', u'getSymbols', u'keys', u'j', u'S', u'isEnum', u'aLen', u'T', u'key', u'length', u'source']) + var.put(u'T', var.get(u'toObject')(var.get(u'target'))) + var.put(u'aLen', var.get(u'arguments').get(u'length')) + var.put(u'index', Js(1.0)) + var.put(u'getSymbols', var.get(u'gOPS').get(u'f')) + var.put(u'isEnum', var.get(u'pIE').get(u'f')) + while (var.get(u'aLen')>var.get(u'index')): + var.put(u'S', var.get(u'IObject')(var.get(u'arguments').get((var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1))))) + var.put(u'keys', (var.get(u'getKeys')(var.get(u'S')).callprop(u'concat', var.get(u'getSymbols')(var.get(u'S'))) if var.get(u'getSymbols') else var.get(u'getKeys')(var.get(u'S')))) + var.put(u'length', var.get(u'keys').get(u'length')) + var.put(u'j', Js(0.0)) + while (var.get(u'length')>var.get(u'j')): + if var.get(u'isEnum').callprop(u'call', var.get(u'S'), var.put(u'key', var.get(u'keys').get((var.put(u'j',Js(var.get(u'j').to_number())+Js(1))-Js(1))))): + var.get(u'T').put(var.get(u'key'), var.get(u'S').get(var.get(u'key'))) + return var.get(u'T') + PyJs_assign_1639_._set_name(u'assign') + @Js + def PyJs_anonymous_1640_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'A', u'S', u'B', u'K']) + PyJs_Object_1641_ = Js({}) + var.put(u'A', PyJs_Object_1641_) + PyJs_Object_1642_ = Js({}) + var.put(u'B', PyJs_Object_1642_) + var.put(u'S', var.get(u'Symbol')()) + var.put(u'K', Js(u'abcdefghijklmnopqrst')) + var.get(u'A').put(var.get(u'S'), Js(7.0)) + @Js + def PyJs_anonymous_1643_(k, this, arguments, var=var): + var = Scope({u'this':this, u'k':k, u'arguments':arguments}, var) + var.registers([u'k']) + var.get(u'B').put(var.get(u'k'), var.get(u'k')) + PyJs_anonymous_1643_._set_name(u'anonymous') + var.get(u'K').callprop(u'split', Js(u'')).callprop(u'forEach', PyJs_anonymous_1643_) + PyJs_Object_1644_ = Js({}) + PyJs_Object_1645_ = Js({}) + return ((var.get(u'$assign')(PyJs_Object_1644_, var.get(u'A')).get(var.get(u'S'))!=Js(7.0)) or (var.get(u'Object').callprop(u'keys', var.get(u'$assign')(PyJs_Object_1645_, var.get(u'B'))).callprop(u'join', Js(u''))!=var.get(u'K'))) + PyJs_anonymous_1640_._set_name(u'anonymous') + var.get(u'module').put(u'exports', (PyJs_assign_1639_ if (var.get(u'$assign').neg() or var.get(u'require')(Js(u'./_fails'))(PyJs_anonymous_1640_)) else var.get(u'$assign'))) +PyJs_anonymous_1638_._set_name(u'anonymous') +PyJs_Object_1646_ = Js({u'./_fails':Js(152.0),u'./_iobject':Js(159.0),u'./_object-gops':Js(178.0),u'./_object-keys':Js(181.0),u'./_object-pie':Js(182.0),u'./_to-object':Js(197.0)}) +@Js +def PyJs_anonymous_1647_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'dPs', u'require', u'enumBugKeys', u'module', u'IE_PROTO', u'anObject', u'createDict', u'PROTOTYPE', u'Empty']) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + var.put(u'dPs', var.get(u'require')(Js(u'./_object-dps'))) + var.put(u'enumBugKeys', var.get(u'require')(Js(u'./_enum-bug-keys'))) + var.put(u'IE_PROTO', var.get(u'require')(Js(u'./_shared-key'))(Js(u'IE_PROTO'))) + @Js + def PyJs_anonymous_1648_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJs_anonymous_1648_._set_name(u'anonymous') + var.put(u'Empty', PyJs_anonymous_1648_) + var.put(u'PROTOTYPE', Js(u'prototype')) + @Js + def PyJs_anonymous_1649_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'lt', u'gt', u'iframeDocument', u'iframe']) + var.put(u'iframe', var.get(u'require')(Js(u'./_dom-create'))(Js(u'iframe'))) + var.put(u'i', var.get(u'enumBugKeys').get(u'length')) + var.put(u'lt', Js(u'<')) + var.put(u'gt', Js(u'>')) + var.get(u'iframe').get(u'style').put(u'display', Js(u'none')) + var.get(u'require')(Js(u'./_html')).callprop(u'appendChild', var.get(u'iframe')) + var.get(u'iframe').put(u'src', Js(u'javascript:')) + var.put(u'iframeDocument', var.get(u'iframe').get(u'contentWindow').get(u'document')) + var.get(u'iframeDocument').callprop(u'open') + var.get(u'iframeDocument').callprop(u'write', ((((((var.get(u'lt')+Js(u'script'))+var.get(u'gt'))+Js(u'document.F=Object'))+var.get(u'lt'))+Js(u'/script'))+var.get(u'gt'))) + var.get(u'iframeDocument').callprop(u'close') + var.put(u'createDict', var.get(u'iframeDocument').get(u'F')) + while (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)): + var.get(u'createDict').get(var.get(u'PROTOTYPE')).delete(var.get(u'enumBugKeys').get(var.get(u'i'))) + return var.get(u'createDict')() + PyJs_anonymous_1649_._set_name(u'anonymous') + var.put(u'createDict', PyJs_anonymous_1649_) + @Js + def PyJs_create_1650_(O, Properties, this, arguments, var=var): + var = Scope({u'this':this, u'create':PyJs_create_1650_, u'Properties':Properties, u'O':O, u'arguments':arguments}, var) + var.registers([u'result', u'O', u'Properties']) + pass + if PyJsStrictNeq(var.get(u'O'),var.get(u"null")): + var.get(u'Empty').put(var.get(u'PROTOTYPE'), var.get(u'anObject')(var.get(u'O'))) + var.put(u'result', var.get(u'Empty').create()) + var.get(u'Empty').put(var.get(u'PROTOTYPE'), var.get(u"null")) + var.get(u'result').put(var.get(u'IE_PROTO'), var.get(u'O')) + else: + var.put(u'result', var.get(u'createDict')()) + return (var.get(u'result') if PyJsStrictEq(var.get(u'Properties'),var.get(u'undefined')) else var.get(u'dPs')(var.get(u'result'), var.get(u'Properties'))) + PyJs_create_1650_._set_name(u'create') + var.get(u'module').put(u'exports', (var.get(u'Object').get(u'create') or PyJs_create_1650_)) +PyJs_anonymous_1647_._set_name(u'anonymous') +PyJs_Object_1651_ = Js({u'./_an-object':Js(132.0),u'./_dom-create':Js(148.0),u'./_enum-bug-keys':Js(149.0),u'./_html':Js(157.0),u'./_object-dps':Js(174.0),u'./_shared-key':Js(190.0)}) +@Js +def PyJs_anonymous_1652_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'toPrimitive', u'module', u'anObject', u'IE8_DOM_DEFINE', u'dP']) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + var.put(u'IE8_DOM_DEFINE', var.get(u'require')(Js(u'./_ie8-dom-define'))) + var.put(u'toPrimitive', var.get(u'require')(Js(u'./_to-primitive'))) + var.put(u'dP', var.get(u'Object').get(u'defineProperty')) + @Js + def PyJs_defineProperty_1653_(O, P, Attributes, this, arguments, var=var): + var = Scope({u'this':this, u'O':O, u'P':P, u'arguments':arguments, u'defineProperty':PyJs_defineProperty_1653_, u'Attributes':Attributes}, var) + var.registers([u'P', u'O', u'Attributes']) + var.get(u'anObject')(var.get(u'O')) + var.put(u'P', var.get(u'toPrimitive')(var.get(u'P'), var.get(u'true'))) + var.get(u'anObject')(var.get(u'Attributes')) + if var.get(u'IE8_DOM_DEFINE'): + try: + return var.get(u'dP')(var.get(u'O'), var.get(u'P'), var.get(u'Attributes')) + except PyJsException as PyJsTempException: + PyJsHolder_65_75205354 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_75205354 is not None: + var.own[u'e'] = PyJsHolder_65_75205354 + else: + del var.own[u'e'] + del PyJsHolder_65_75205354 + if (var.get(u'Attributes').contains(Js(u'get')) or var.get(u'Attributes').contains(Js(u'set'))): + PyJsTempException = JsToPyException(var.get(u'TypeError')(Js(u'Accessors not supported!'))) + raise PyJsTempException + if var.get(u'Attributes').contains(Js(u'value')): + var.get(u'O').put(var.get(u'P'), var.get(u'Attributes').get(u'value')) + return var.get(u'O') + PyJs_defineProperty_1653_._set_name(u'defineProperty') + var.get(u'exports').put(u'f', (var.get(u'Object').get(u'defineProperty') if var.get(u'require')(Js(u'./_descriptors')) else PyJs_defineProperty_1653_)) +PyJs_anonymous_1652_._set_name(u'anonymous') +PyJs_Object_1654_ = Js({u'./_an-object':Js(132.0),u'./_descriptors':Js(147.0),u'./_ie8-dom-define':Js(158.0),u'./_to-primitive':Js(198.0)}) +@Js +def PyJs_anonymous_1655_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'getKeys', u'anObject', u'dP']) + var.put(u'dP', var.get(u'require')(Js(u'./_object-dp'))) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + var.put(u'getKeys', var.get(u'require')(Js(u'./_object-keys'))) + @Js + def PyJs_defineProperties_1656_(O, Properties, this, arguments, var=var): + var = Scope({u'this':this, u'defineProperties':PyJs_defineProperties_1656_, u'Properties':Properties, u'O':O, u'arguments':arguments}, var) + var.registers([u'P', u'keys', u'O', u'i', u'length', u'Properties']) + var.get(u'anObject')(var.get(u'O')) + var.put(u'keys', var.get(u'getKeys')(var.get(u'Properties'))) + var.put(u'length', var.get(u'keys').get(u'length')) + var.put(u'i', Js(0.0)) + while (var.get(u'length')>var.get(u'i')): + var.get(u'dP').callprop(u'f', var.get(u'O'), var.put(u'P', var.get(u'keys').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))), var.get(u'Properties').get(var.get(u'P'))) + return var.get(u'O') + PyJs_defineProperties_1656_._set_name(u'defineProperties') + var.get(u'module').put(u'exports', (var.get(u'Object').get(u'defineProperties') if var.get(u'require')(Js(u'./_descriptors')) else PyJs_defineProperties_1656_)) +PyJs_anonymous_1655_._set_name(u'anonymous') +PyJs_Object_1657_ = Js({u'./_an-object':Js(132.0),u'./_descriptors':Js(147.0),u'./_object-dp':Js(173.0),u'./_object-keys':Js(181.0)}) +@Js +def PyJs_anonymous_1658_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'toPrimitive', u'module', u'pIE', u'toIObject', u'IE8_DOM_DEFINE', u'gOPD', u'has', u'createDesc']) + var.put(u'pIE', var.get(u'require')(Js(u'./_object-pie'))) + var.put(u'createDesc', var.get(u'require')(Js(u'./_property-desc'))) + var.put(u'toIObject', var.get(u'require')(Js(u'./_to-iobject'))) + var.put(u'toPrimitive', var.get(u'require')(Js(u'./_to-primitive'))) + var.put(u'has', var.get(u'require')(Js(u'./_has'))) + var.put(u'IE8_DOM_DEFINE', var.get(u'require')(Js(u'./_ie8-dom-define'))) + var.put(u'gOPD', var.get(u'Object').get(u'getOwnPropertyDescriptor')) + @Js + def PyJs_getOwnPropertyDescriptor_1659_(O, P, this, arguments, var=var): + var = Scope({u'this':this, u'P':P, u'getOwnPropertyDescriptor':PyJs_getOwnPropertyDescriptor_1659_, u'arguments':arguments, u'O':O}, var) + var.registers([u'P', u'O']) + var.put(u'O', var.get(u'toIObject')(var.get(u'O'))) + var.put(u'P', var.get(u'toPrimitive')(var.get(u'P'), var.get(u'true'))) + if var.get(u'IE8_DOM_DEFINE'): + try: + return var.get(u'gOPD')(var.get(u'O'), var.get(u'P')) + except PyJsException as PyJsTempException: + PyJsHolder_65_6934147 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_6934147 is not None: + var.own[u'e'] = PyJsHolder_65_6934147 + else: + del var.own[u'e'] + del PyJsHolder_65_6934147 + if var.get(u'has')(var.get(u'O'), var.get(u'P')): + return var.get(u'createDesc')(var.get(u'pIE').get(u'f').callprop(u'call', var.get(u'O'), var.get(u'P')).neg(), var.get(u'O').get(var.get(u'P'))) + PyJs_getOwnPropertyDescriptor_1659_._set_name(u'getOwnPropertyDescriptor') + var.get(u'exports').put(u'f', (var.get(u'gOPD') if var.get(u'require')(Js(u'./_descriptors')) else PyJs_getOwnPropertyDescriptor_1659_)) +PyJs_anonymous_1658_._set_name(u'anonymous') +PyJs_Object_1660_ = Js({u'./_descriptors':Js(147.0),u'./_has':Js(155.0),u'./_ie8-dom-define':Js(158.0),u'./_object-pie':Js(182.0),u'./_property-desc':Js(184.0),u'./_to-iobject':Js(195.0),u'./_to-primitive':Js(198.0)}) +@Js +def PyJs_anonymous_1661_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'getWindowNames', u'windowNames', u'gOPN', u'toString', u'module', u'toIObject']) + var.put(u'toIObject', var.get(u'require')(Js(u'./_to-iobject'))) + var.put(u'gOPN', var.get(u'require')(Js(u'./_object-gopn')).get(u'f')) + PyJs_Object_1662_ = Js({}) + var.put(u'toString', PyJs_Object_1662_.get(u'toString')) + var.put(u'windowNames', (var.get(u'Object').callprop(u'getOwnPropertyNames', var.get(u'window')) if (((var.get(u'window',throw=False).typeof()==Js(u'object')) and var.get(u'window')) and var.get(u'Object').get(u'getOwnPropertyNames')) else Js([]))) + @Js + def PyJs_anonymous_1663_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + try: + return var.get(u'gOPN')(var.get(u'it')) + except PyJsException as PyJsTempException: + PyJsHolder_65_72290655 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + return var.get(u'windowNames').callprop(u'slice') + finally: + if PyJsHolder_65_72290655 is not None: + var.own[u'e'] = PyJsHolder_65_72290655 + else: + del var.own[u'e'] + del PyJsHolder_65_72290655 + PyJs_anonymous_1663_._set_name(u'anonymous') + var.put(u'getWindowNames', PyJs_anonymous_1663_) + @Js + def PyJs_getOwnPropertyNames_1664_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'getOwnPropertyNames':PyJs_getOwnPropertyNames_1664_, u'arguments':arguments}, var) + var.registers([u'it']) + return (var.get(u'getWindowNames')(var.get(u'it')) if (var.get(u'windowNames') and (var.get(u'toString').callprop(u'call', var.get(u'it'))==Js(u'[object Window]'))) else var.get(u'gOPN')(var.get(u'toIObject')(var.get(u'it')))) + PyJs_getOwnPropertyNames_1664_._set_name(u'getOwnPropertyNames') + var.get(u'module').get(u'exports').put(u'f', PyJs_getOwnPropertyNames_1664_) +PyJs_anonymous_1661_._set_name(u'anonymous') +PyJs_Object_1665_ = Js({u'./_object-gopn':Js(177.0),u'./_to-iobject':Js(195.0)}) +@Js +def PyJs_anonymous_1666_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'hiddenKeys', u'require', u'$keys', u'module']) + var.put(u'$keys', var.get(u'require')(Js(u'./_object-keys-internal'))) + var.put(u'hiddenKeys', var.get(u'require')(Js(u'./_enum-bug-keys')).callprop(u'concat', Js(u'length'), Js(u'prototype'))) + @Js + def PyJs_getOwnPropertyNames_1667_(O, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'O':O, u'getOwnPropertyNames':PyJs_getOwnPropertyNames_1667_}, var) + var.registers([u'O']) + return var.get(u'$keys')(var.get(u'O'), var.get(u'hiddenKeys')) + PyJs_getOwnPropertyNames_1667_._set_name(u'getOwnPropertyNames') + var.get(u'exports').put(u'f', (var.get(u'Object').get(u'getOwnPropertyNames') or PyJs_getOwnPropertyNames_1667_)) +PyJs_anonymous_1666_._set_name(u'anonymous') +PyJs_Object_1668_ = Js({u'./_enum-bug-keys':Js(149.0),u'./_object-keys-internal':Js(180.0)}) +@Js +def PyJs_anonymous_1669_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'exports').put(u'f', var.get(u'Object').get(u'getOwnPropertySymbols')) +PyJs_anonymous_1669_._set_name(u'anonymous') +PyJs_Object_1670_ = Js({}) +@Js +def PyJs_anonymous_1671_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'toObject', u'module', u'IE_PROTO', u'ObjectProto', u'has', u'require']) + var.put(u'has', var.get(u'require')(Js(u'./_has'))) + var.put(u'toObject', var.get(u'require')(Js(u'./_to-object'))) + var.put(u'IE_PROTO', var.get(u'require')(Js(u'./_shared-key'))(Js(u'IE_PROTO'))) + var.put(u'ObjectProto', var.get(u'Object').get(u'prototype')) + @Js + def PyJs_anonymous_1672_(O, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'O':O}, var) + var.registers([u'O']) + var.put(u'O', var.get(u'toObject')(var.get(u'O'))) + if var.get(u'has')(var.get(u'O'), var.get(u'IE_PROTO')): + return var.get(u'O').get(var.get(u'IE_PROTO')) + if ((var.get(u'O').get(u'constructor').typeof()==Js(u'function')) and var.get(u'O').instanceof(var.get(u'O').get(u'constructor'))): + return var.get(u'O').get(u'constructor').get(u'prototype') + return (var.get(u'ObjectProto') if var.get(u'O').instanceof(var.get(u'Object')) else var.get(u"null")) + PyJs_anonymous_1672_._set_name(u'anonymous') + var.get(u'module').put(u'exports', (var.get(u'Object').get(u'getPrototypeOf') or PyJs_anonymous_1672_)) +PyJs_anonymous_1671_._set_name(u'anonymous') +PyJs_Object_1673_ = Js({u'./_has':Js(155.0),u'./_shared-key':Js(190.0),u'./_to-object':Js(197.0)}) +@Js +def PyJs_anonymous_1674_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'IE_PROTO', u'toIObject', u'arrayIndexOf', u'has']) + var.put(u'has', var.get(u'require')(Js(u'./_has'))) + var.put(u'toIObject', var.get(u'require')(Js(u'./_to-iobject'))) + var.put(u'arrayIndexOf', var.get(u'require')(Js(u'./_array-includes'))(Js(False))) + var.put(u'IE_PROTO', var.get(u'require')(Js(u'./_shared-key'))(Js(u'IE_PROTO'))) + @Js + def PyJs_anonymous_1675_(object, names, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'names':names, u'arguments':arguments}, var) + var.registers([u'i', u'object', u'O', u'result', u'key', u'names']) + var.put(u'O', var.get(u'toIObject')(var.get(u'object'))) + var.put(u'i', Js(0.0)) + var.put(u'result', Js([])) + for PyJsTemp in var.get(u'O'): + var.put(u'key', PyJsTemp) + if (var.get(u'key')!=var.get(u'IE_PROTO')): + (var.get(u'has')(var.get(u'O'), var.get(u'key')) and var.get(u'result').callprop(u'push', var.get(u'key'))) + while (var.get(u'names').get(u'length')>var.get(u'i')): + if var.get(u'has')(var.get(u'O'), var.put(u'key', var.get(u'names').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1))))): + ((~var.get(u'arrayIndexOf')(var.get(u'result'), var.get(u'key'))) or var.get(u'result').callprop(u'push', var.get(u'key'))) + return var.get(u'result') + PyJs_anonymous_1675_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1675_) +PyJs_anonymous_1674_._set_name(u'anonymous') +PyJs_Object_1676_ = Js({u'./_array-includes':Js(134.0),u'./_has':Js(155.0),u'./_shared-key':Js(190.0),u'./_to-iobject':Js(195.0)}) +@Js +def PyJs_anonymous_1677_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'enumBugKeys', u'$keys', u'module']) + var.put(u'$keys', var.get(u'require')(Js(u'./_object-keys-internal'))) + var.put(u'enumBugKeys', var.get(u'require')(Js(u'./_enum-bug-keys'))) + @Js + def PyJs_keys_1678_(O, this, arguments, var=var): + var = Scope({u'this':this, u'keys':PyJs_keys_1678_, u'arguments':arguments, u'O':O}, var) + var.registers([u'O']) + return var.get(u'$keys')(var.get(u'O'), var.get(u'enumBugKeys')) + PyJs_keys_1678_._set_name(u'keys') + var.get(u'module').put(u'exports', (var.get(u'Object').get(u'keys') or PyJs_keys_1678_)) +PyJs_anonymous_1677_._set_name(u'anonymous') +PyJs_Object_1679_ = Js({u'./_enum-bug-keys':Js(149.0),u'./_object-keys-internal':Js(180.0)}) +@Js +def PyJs_anonymous_1680_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1681_ = Js({}) + var.get(u'exports').put(u'f', PyJs_Object_1681_.get(u'propertyIsEnumerable')) +PyJs_anonymous_1680_._set_name(u'anonymous') +PyJs_Object_1682_ = Js({}) +@Js +def PyJs_anonymous_1683_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'core', u'fails', u'$export', u'require', u'exports', u'module']) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + var.put(u'core', var.get(u'require')(Js(u'./_core'))) + var.put(u'fails', var.get(u'require')(Js(u'./_fails'))) + @Js + def PyJs_anonymous_1684_(KEY, PyJsArg_65786563_, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'KEY':KEY, u'exec':PyJsArg_65786563_}, var) + var.registers([u'KEY', u'exp', u'fn', u'exec']) + PyJs_Object_1685_ = Js({}) + var.put(u'fn', ((var.get(u'core').get(u'Object') or PyJs_Object_1685_).get(var.get(u'KEY')) or var.get(u'Object').get(var.get(u'KEY')))) + PyJs_Object_1686_ = Js({}) + var.put(u'exp', PyJs_Object_1686_) + var.get(u'exp').put(var.get(u'KEY'), var.get(u'exec')(var.get(u'fn'))) + @Js + def PyJs_anonymous_1687_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'fn')(Js(1.0)) + PyJs_anonymous_1687_._set_name(u'anonymous') + var.get(u'$export')((var.get(u'$export').get(u'S')+(var.get(u'$export').get(u'F')*var.get(u'fails')(PyJs_anonymous_1687_))), Js(u'Object'), var.get(u'exp')) + PyJs_anonymous_1684_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1684_) +PyJs_anonymous_1683_._set_name(u'anonymous') +PyJs_Object_1688_ = Js({u'./_core':Js(144.0),u'./_export':Js(151.0),u'./_fails':Js(152.0)}) +@Js +def PyJs_anonymous_1689_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1690_(bitmap, value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value, u'bitmap':bitmap}, var) + var.registers([u'value', u'bitmap']) + PyJs_Object_1691_ = Js({u'enumerable':(var.get(u'bitmap')&Js(1.0)).neg(),u'configurable':(var.get(u'bitmap')&Js(2.0)).neg(),u'writable':(var.get(u'bitmap')&Js(4.0)).neg(),u'value':var.get(u'value')}) + return PyJs_Object_1691_ + PyJs_anonymous_1690_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1690_) +PyJs_anonymous_1689_._set_name(u'anonymous') +PyJs_Object_1692_ = Js({}) +@Js +def PyJs_anonymous_1693_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'hide', u'exports', u'module']) + var.put(u'hide', var.get(u'require')(Js(u'./_hide'))) + @Js + def PyJs_anonymous_1694_(target, src, safe, this, arguments, var=var): + var = Scope({u'this':this, u'src':src, u'safe':safe, u'target':target, u'arguments':arguments}, var) + var.registers([u'src', u'safe', u'target', u'key']) + for PyJsTemp in var.get(u'src'): + var.put(u'key', PyJsTemp) + if (var.get(u'safe') and var.get(u'target').get(var.get(u'key'))): + var.get(u'target').put(var.get(u'key'), var.get(u'src').get(var.get(u'key'))) + else: + var.get(u'hide')(var.get(u'target'), var.get(u'key'), var.get(u'src').get(var.get(u'key'))) + return var.get(u'target') + PyJs_anonymous_1694_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1694_) +PyJs_anonymous_1693_._set_name(u'anonymous') +PyJs_Object_1695_ = Js({u'./_hide':Js(156.0)}) +@Js +def PyJs_anonymous_1696_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./_hide'))) +PyJs_anonymous_1696_._set_name(u'anonymous') +PyJs_Object_1697_ = Js({u'./_hide':Js(156.0)}) +@Js +def PyJs_anonymous_1698_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'check', u'anObject', u'isObject']) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + @Js + def PyJs_anonymous_1699_(O, proto, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'O':O, u'proto':proto}, var) + var.registers([u'O', u'proto']) + var.get(u'anObject')(var.get(u'O')) + if (var.get(u'isObject')(var.get(u'proto')).neg() and PyJsStrictNeq(var.get(u'proto'),var.get(u"null"))): + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'proto')+Js(u": can't set as prototype!")))) + raise PyJsTempException + PyJs_anonymous_1699_._set_name(u'anonymous') + var.put(u'check', PyJs_anonymous_1699_) + PyJs_Object_1701_ = Js({}) + @Js + def PyJs_anonymous_1702_(test, buggy, set, this, arguments, var=var): + var = Scope({u'test':test, u'this':this, u'buggy':buggy, u'set':set, u'arguments':arguments}, var) + var.registers([u'test', u'buggy', u'set']) + try: + var.put(u'set', var.get(u'require')(Js(u'./_ctx'))(var.get(u'Function').get(u'call'), var.get(u'require')(Js(u'./_object-gopd')).callprop(u'f', var.get(u'Object').get(u'prototype'), Js(u'__proto__')).get(u'set'), Js(2.0))) + var.get(u'set')(var.get(u'test'), Js([])) + var.put(u'buggy', var.get(u'test').instanceof(var.get(u'Array')).neg()) + except PyJsException as PyJsTempException: + PyJsHolder_65_30361003 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + var.put(u'buggy', var.get(u'true')) + finally: + if PyJsHolder_65_30361003 is not None: + var.own[u'e'] = PyJsHolder_65_30361003 + else: + del var.own[u'e'] + del PyJsHolder_65_30361003 + @Js + def PyJs_setPrototypeOf_1703_(O, proto, this, arguments, var=var): + var = Scope({u'this':this, u'setPrototypeOf':PyJs_setPrototypeOf_1703_, u'arguments':arguments, u'O':O, u'proto':proto}, var) + var.registers([u'O', u'proto']) + var.get(u'check')(var.get(u'O'), var.get(u'proto')) + if var.get(u'buggy'): + var.get(u'O').put(u'__proto__', var.get(u'proto')) + else: + var.get(u'set')(var.get(u'O'), var.get(u'proto')) + return var.get(u'O') + PyJs_setPrototypeOf_1703_._set_name(u'setPrototypeOf') + return PyJs_setPrototypeOf_1703_ + PyJs_anonymous_1702_._set_name(u'anonymous') + PyJs_Object_1704_ = Js({}) + PyJs_Object_1700_ = Js({u'set':(var.get(u'Object').get(u'setPrototypeOf') or (PyJs_anonymous_1702_(PyJs_Object_1701_, Js(False)) if PyJs_Object_1704_.contains(Js(u'__proto__')) else var.get(u'undefined'))),u'check':var.get(u'check')}) + var.get(u'module').put(u'exports', PyJs_Object_1700_) +PyJs_anonymous_1698_._set_name(u'anonymous') +PyJs_Object_1705_ = Js({u'./_an-object':Js(132.0),u'./_ctx':Js(145.0),u'./_is-object':Js(162.0),u'./_object-gopd':Js(175.0)}) +@Js +def PyJs_anonymous_1706_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'core', u'exports', u'DESCRIPTORS', u'require', u'global', u'module', u'SPECIES', u'dP']) + Js(u'use strict') + var.put(u'global', var.get(u'require')(Js(u'./_global'))) + var.put(u'core', var.get(u'require')(Js(u'./_core'))) + var.put(u'dP', var.get(u'require')(Js(u'./_object-dp'))) + var.put(u'DESCRIPTORS', var.get(u'require')(Js(u'./_descriptors'))) + var.put(u'SPECIES', var.get(u'require')(Js(u'./_wks'))(Js(u'species'))) + @Js + def PyJs_anonymous_1707_(KEY, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'KEY':KEY}, var) + var.registers([u'C', u'KEY']) + var.put(u'C', (var.get(u'core').get(var.get(u'KEY')) if (var.get(u'core').get(var.get(u'KEY')).typeof()==Js(u'function')) else var.get(u'global').get(var.get(u'KEY')))) + if ((var.get(u'DESCRIPTORS') and var.get(u'C')) and var.get(u'C').get(var.get(u'SPECIES')).neg()): + @Js + def PyJs_anonymous_1709_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this") + PyJs_anonymous_1709_._set_name(u'anonymous') + PyJs_Object_1708_ = Js({u'configurable':var.get(u'true'),u'get':PyJs_anonymous_1709_}) + var.get(u'dP').callprop(u'f', var.get(u'C'), var.get(u'SPECIES'), PyJs_Object_1708_) + PyJs_anonymous_1707_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1707_) +PyJs_anonymous_1706_._set_name(u'anonymous') +PyJs_Object_1710_ = Js({u'./_core':Js(144.0),u'./_descriptors':Js(147.0),u'./_global':Js(154.0),u'./_object-dp':Js(173.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1711_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'TAG', u'has', u'def']) + var.put(u'def', var.get(u'require')(Js(u'./_object-dp')).get(u'f')) + var.put(u'has', var.get(u'require')(Js(u'./_has'))) + var.put(u'TAG', var.get(u'require')(Js(u'./_wks'))(Js(u'toStringTag'))) + @Js + def PyJs_anonymous_1712_(it, tag, stat, this, arguments, var=var): + var = Scope({u'this':this, u'stat':stat, u'tag':tag, u'it':it, u'arguments':arguments}, var) + var.registers([u'stat', u'tag', u'it']) + if (var.get(u'it') and var.get(u'has')(var.put(u'it', (var.get(u'it') if var.get(u'stat') else var.get(u'it').get(u'prototype'))), var.get(u'TAG')).neg()): + PyJs_Object_1713_ = Js({u'configurable':var.get(u'true'),u'value':var.get(u'tag')}) + var.get(u'def')(var.get(u'it'), var.get(u'TAG'), PyJs_Object_1713_) + PyJs_anonymous_1712_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1712_) +PyJs_anonymous_1711_._set_name(u'anonymous') +PyJs_Object_1714_ = Js({u'./_has':Js(155.0),u'./_object-dp':Js(173.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1715_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'shared', u'require', u'exports', u'uid', u'module']) + var.put(u'shared', var.get(u'require')(Js(u'./_shared'))(Js(u'keys'))) + var.put(u'uid', var.get(u'require')(Js(u'./_uid'))) + @Js + def PyJs_anonymous_1716_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return (var.get(u'shared').get(var.get(u'key')) or var.get(u'shared').put(var.get(u'key'), var.get(u'uid')(var.get(u'key')))) + PyJs_anonymous_1716_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1716_) +PyJs_anonymous_1715_._set_name(u'anonymous') +PyJs_Object_1717_ = Js({u'./_shared':Js(191.0),u'./_uid':Js(199.0)}) +@Js +def PyJs_anonymous_1718_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'global', u'module', u'SHARED', u'store']) + var.put(u'global', var.get(u'require')(Js(u'./_global'))) + var.put(u'SHARED', Js(u'__core-js_shared__')) + PyJs_Object_1719_ = Js({}) + var.put(u'store', (var.get(u'global').get(var.get(u'SHARED')) or var.get(u'global').put(var.get(u'SHARED'), PyJs_Object_1719_))) + @Js + def PyJs_anonymous_1720_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + PyJs_Object_1721_ = Js({}) + return (var.get(u'store').get(var.get(u'key')) or var.get(u'store').put(var.get(u'key'), PyJs_Object_1721_)) + PyJs_anonymous_1720_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1720_) +PyJs_anonymous_1718_._set_name(u'anonymous') +PyJs_Object_1722_ = Js({u'./_global':Js(154.0)}) +@Js +def PyJs_anonymous_1723_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'defined', u'toInteger', u'exports', u'require', u'module']) + var.put(u'toInteger', var.get(u'require')(Js(u'./_to-integer'))) + var.put(u'defined', var.get(u'require')(Js(u'./_defined'))) + @Js + def PyJs_anonymous_1724_(TO_STRING, this, arguments, var=var): + var = Scope({u'TO_STRING':TO_STRING, u'this':this, u'arguments':arguments}, var) + var.registers([u'TO_STRING']) + @Js + def PyJs_anonymous_1725_(that, pos, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'pos':pos, u'that':that}, var) + var.registers([u'a', u'b', u'that', u'i', u'l', u'pos', u's']) + var.put(u's', var.get(u'String')(var.get(u'defined')(var.get(u'that')))) + var.put(u'i', var.get(u'toInteger')(var.get(u'pos'))) + var.put(u'l', var.get(u's').get(u'length')) + if ((var.get(u'i')<Js(0.0)) or (var.get(u'i')>=var.get(u'l'))): + return (Js(u'') if var.get(u'TO_STRING') else var.get(u'undefined')) + var.put(u'a', var.get(u's').callprop(u'charCodeAt', var.get(u'i'))) + def PyJs_LONG_1726_(var=var): + return ((var.get(u's').callprop(u'charAt', var.get(u'i')) if var.get(u'TO_STRING') else var.get(u'a')) if (((((var.get(u'a')<Js(55296)) or (var.get(u'a')>Js(56319))) or PyJsStrictEq((var.get(u'i')+Js(1.0)),var.get(u'l'))) or (var.put(u'b', var.get(u's').callprop(u'charCodeAt', (var.get(u'i')+Js(1.0))))<Js(56320))) or (var.get(u'b')>Js(57343))) else (var.get(u's').callprop(u'slice', var.get(u'i'), (var.get(u'i')+Js(2.0))) if var.get(u'TO_STRING') else ((((var.get(u'a')-Js(55296))<<Js(10.0))+(var.get(u'b')-Js(56320)))+Js(65536)))) + return PyJs_LONG_1726_() + PyJs_anonymous_1725_._set_name(u'anonymous') + return PyJs_anonymous_1725_ + PyJs_anonymous_1724_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1724_) +PyJs_anonymous_1723_._set_name(u'anonymous') +PyJs_Object_1727_ = Js({u'./_defined':Js(146.0),u'./_to-integer':Js(194.0)}) +@Js +def PyJs_anonymous_1728_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'min', u'max', u'toInteger', u'module', u'require']) + var.put(u'toInteger', var.get(u'require')(Js(u'./_to-integer'))) + var.put(u'max', var.get(u'Math').get(u'max')) + var.put(u'min', var.get(u'Math').get(u'min')) + @Js + def PyJs_anonymous_1729_(index, length, this, arguments, var=var): + var = Scope({u'this':this, u'index':index, u'length':length, u'arguments':arguments}, var) + var.registers([u'index', u'length']) + var.put(u'index', var.get(u'toInteger')(var.get(u'index'))) + return (var.get(u'max')((var.get(u'index')+var.get(u'length')), Js(0.0)) if (var.get(u'index')<Js(0.0)) else var.get(u'min')(var.get(u'index'), var.get(u'length'))) + PyJs_anonymous_1729_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1729_) +PyJs_anonymous_1728_._set_name(u'anonymous') +PyJs_Object_1730_ = Js({u'./_to-integer':Js(194.0)}) +@Js +def PyJs_anonymous_1731_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'floor', u'exports', u'module', u'ceil']) + var.put(u'ceil', var.get(u'Math').get(u'ceil')) + var.put(u'floor', var.get(u'Math').get(u'floor')) + @Js + def PyJs_anonymous_1732_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return (Js(0.0) if var.get(u'isNaN')(var.put(u'it', (+var.get(u'it')))) else (var.get(u'floor') if (var.get(u'it')>Js(0.0)) else var.get(u'ceil'))(var.get(u'it'))) + PyJs_anonymous_1732_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1732_) +PyJs_anonymous_1731_._set_name(u'anonymous') +PyJs_Object_1733_ = Js({}) +@Js +def PyJs_anonymous_1734_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'defined', u'require', u'exports', u'module', u'IObject']) + var.put(u'IObject', var.get(u'require')(Js(u'./_iobject'))) + var.put(u'defined', var.get(u'require')(Js(u'./_defined'))) + @Js + def PyJs_anonymous_1735_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return var.get(u'IObject')(var.get(u'defined')(var.get(u'it'))) + PyJs_anonymous_1735_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1735_) +PyJs_anonymous_1734_._set_name(u'anonymous') +PyJs_Object_1736_ = Js({u'./_defined':Js(146.0),u'./_iobject':Js(159.0)}) +@Js +def PyJs_anonymous_1737_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'toInteger', u'exports', u'require', u'module', u'min']) + var.put(u'toInteger', var.get(u'require')(Js(u'./_to-integer'))) + var.put(u'min', var.get(u'Math').get(u'min')) + @Js + def PyJs_anonymous_1738_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return (var.get(u'min')(var.get(u'toInteger')(var.get(u'it')), Js(9007199254740991)) if (var.get(u'it')>Js(0.0)) else Js(0.0)) + PyJs_anonymous_1738_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1738_) +PyJs_anonymous_1737_._set_name(u'anonymous') +PyJs_Object_1739_ = Js({u'./_to-integer':Js(194.0)}) +@Js +def PyJs_anonymous_1740_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'defined', u'require', u'exports', u'module']) + var.put(u'defined', var.get(u'require')(Js(u'./_defined'))) + @Js + def PyJs_anonymous_1741_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return var.get(u'Object')(var.get(u'defined')(var.get(u'it'))) + PyJs_anonymous_1741_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1741_) +PyJs_anonymous_1740_._set_name(u'anonymous') +PyJs_Object_1742_ = Js({u'./_defined':Js(146.0)}) +@Js +def PyJs_anonymous_1743_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'isObject', u'module']) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + @Js + def PyJs_anonymous_1744_(it, S, this, arguments, var=var): + var = Scope({u'this':this, u'S':S, u'it':it, u'arguments':arguments}, var) + var.registers([u'S', u'val', u'fn', u'it']) + if var.get(u'isObject')(var.get(u'it')).neg(): + return var.get(u'it') + pass + if ((var.get(u'S') and (var.put(u'fn', var.get(u'it').get(u'toString')).typeof()==Js(u'function'))) and var.get(u'isObject')(var.put(u'val', var.get(u'fn').callprop(u'call', var.get(u'it')))).neg()): + return var.get(u'val') + if ((var.put(u'fn', var.get(u'it').get(u'valueOf')).typeof()==Js(u'function')) and var.get(u'isObject')(var.put(u'val', var.get(u'fn').callprop(u'call', var.get(u'it')))).neg()): + return var.get(u'val') + if ((var.get(u'S').neg() and (var.put(u'fn', var.get(u'it').get(u'toString')).typeof()==Js(u'function'))) and var.get(u'isObject')(var.put(u'val', var.get(u'fn').callprop(u'call', var.get(u'it')))).neg()): + return var.get(u'val') + PyJsTempException = JsToPyException(var.get(u'TypeError')(Js(u"Can't convert object to primitive value"))) + raise PyJsTempException + PyJs_anonymous_1744_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1744_) +PyJs_anonymous_1743_._set_name(u'anonymous') +PyJs_Object_1745_ = Js({u'./_is-object':Js(162.0)}) +@Js +def PyJs_anonymous_1746_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'px', u'require', u'id', u'module']) + var.put(u'id', Js(0.0)) + var.put(u'px', var.get(u'Math').callprop(u'random')) + @Js + def PyJs_anonymous_1747_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return Js(u'Symbol(').callprop(u'concat', (Js(u'') if PyJsStrictEq(var.get(u'key'),var.get(u'undefined')) else var.get(u'key')), Js(u')_'), (var.put(u'id',Js(var.get(u'id').to_number())+Js(1))+var.get(u'px')).callprop(u'toString', Js(36.0))) + PyJs_anonymous_1747_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1747_) +PyJs_anonymous_1746_._set_name(u'anonymous') +PyJs_Object_1748_ = Js({}) +@Js +def PyJs_anonymous_1749_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'core', u'exports', u'wksExt', u'require', u'global', u'LIBRARY', u'module', u'defineProperty']) + var.put(u'global', var.get(u'require')(Js(u'./_global'))) + var.put(u'core', var.get(u'require')(Js(u'./_core'))) + var.put(u'LIBRARY', var.get(u'require')(Js(u'./_library'))) + var.put(u'wksExt', var.get(u'require')(Js(u'./_wks-ext'))) + var.put(u'defineProperty', var.get(u'require')(Js(u'./_object-dp')).get(u'f')) + @Js + def PyJs_anonymous_1750_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name', u'$Symbol']) + PyJs_Object_1751_ = Js({}) + PyJs_Object_1752_ = Js({}) + var.put(u'$Symbol', (var.get(u'core').get(u'Symbol') or var.get(u'core').put(u'Symbol', (PyJs_Object_1751_ if var.get(u'LIBRARY') else (var.get(u'global').get(u'Symbol') or PyJs_Object_1752_))))) + if ((var.get(u'name').callprop(u'charAt', Js(0.0))!=Js(u'_')) and var.get(u'$Symbol').contains(var.get(u'name')).neg()): + PyJs_Object_1753_ = Js({u'value':var.get(u'wksExt').callprop(u'f', var.get(u'name'))}) + var.get(u'defineProperty')(var.get(u'$Symbol'), var.get(u'name'), PyJs_Object_1753_) + PyJs_anonymous_1750_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1750_) +PyJs_anonymous_1749_._set_name(u'anonymous') +PyJs_Object_1754_ = Js({u'./_core':Js(144.0),u'./_global':Js(154.0),u'./_library':Js(169.0),u'./_object-dp':Js(173.0),u'./_wks-ext':Js(201.0)}) +@Js +def PyJs_anonymous_1755_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'exports').put(u'f', var.get(u'require')(Js(u'./_wks'))) +PyJs_anonymous_1755_._set_name(u'anonymous') +PyJs_Object_1756_ = Js({u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1757_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'uid', u'Symbol', u'module', u'$exports', u'require', u'store', u'USE_SYMBOL']) + var.put(u'store', var.get(u'require')(Js(u'./_shared'))(Js(u'wks'))) + var.put(u'uid', var.get(u'require')(Js(u'./_uid'))) + var.put(u'Symbol', var.get(u'require')(Js(u'./_global')).get(u'Symbol')) + var.put(u'USE_SYMBOL', (var.get(u'Symbol',throw=False).typeof()==Js(u'function'))) + @Js + def PyJs_anonymous_1758_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return (var.get(u'store').get(var.get(u'name')) or var.get(u'store').put(var.get(u'name'), ((var.get(u'USE_SYMBOL') and var.get(u'Symbol').get(var.get(u'name'))) or (var.get(u'Symbol') if var.get(u'USE_SYMBOL') else var.get(u'uid'))((Js(u'Symbol.')+var.get(u'name')))))) + PyJs_anonymous_1758_._set_name(u'anonymous') + var.put(u'$exports', var.get(u'module').put(u'exports', PyJs_anonymous_1758_)) + var.get(u'$exports').put(u'store', var.get(u'store')) +PyJs_anonymous_1757_._set_name(u'anonymous') +PyJs_Object_1759_ = Js({u'./_global':Js(154.0),u'./_shared':Js(191.0),u'./_uid':Js(199.0)}) +@Js +def PyJs_anonymous_1760_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'ITERATOR', u'require', u'module', u'Iterators', u'classof']) + var.put(u'classof', var.get(u'require')(Js(u'./_classof'))) + var.put(u'ITERATOR', var.get(u'require')(Js(u'./_wks'))(Js(u'iterator'))) + var.put(u'Iterators', var.get(u'require')(Js(u'./_iterators'))) + @Js + def PyJs_anonymous_1761_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + if (var.get(u'it')!=var.get(u'undefined')): + return ((var.get(u'it').get(var.get(u'ITERATOR')) or var.get(u'it').get(u'@@iterator')) or var.get(u'Iterators').get(var.get(u'classof')(var.get(u'it')))) + PyJs_anonymous_1761_._set_name(u'anonymous') + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./_core')).put(u'getIteratorMethod', PyJs_anonymous_1761_)) +PyJs_anonymous_1760_._set_name(u'anonymous') +PyJs_Object_1762_ = Js({u'./_classof':Js(138.0),u'./_core':Js(144.0),u'./_iterators':Js(167.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1763_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'anObject', u'exports', u'module', u'get']) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + var.put(u'get', var.get(u'require')(Js(u'./core.get-iterator-method'))) + @Js + def PyJs_anonymous_1764_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'iterFn', u'it']) + var.put(u'iterFn', var.get(u'get')(var.get(u'it'))) + if (var.get(u'iterFn',throw=False).typeof()!=Js(u'function')): + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'it')+Js(u' is not iterable!')))) + raise PyJsTempException + return var.get(u'anObject')(var.get(u'iterFn').callprop(u'call', var.get(u'it'))) + PyJs_anonymous_1764_._set_name(u'anonymous') + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./_core')).put(u'getIterator', PyJs_anonymous_1764_)) +PyJs_anonymous_1763_._set_name(u'anonymous') +PyJs_Object_1765_ = Js({u'./_an-object':Js(132.0),u'./_core':Js(144.0),u'./core.get-iterator-method':Js(203.0)}) +@Js +def PyJs_anonymous_1766_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'addToUnscopables', u'Iterators', u'step', u'toIObject']) + Js(u'use strict') + var.put(u'addToUnscopables', var.get(u'require')(Js(u'./_add-to-unscopables'))) + var.put(u'step', var.get(u'require')(Js(u'./_iter-step'))) + var.put(u'Iterators', var.get(u'require')(Js(u'./_iterators'))) + var.put(u'toIObject', var.get(u'require')(Js(u'./_to-iobject'))) + @Js + def PyJs_anonymous_1767_(iterated, kind, this, arguments, var=var): + var = Scope({u'this':this, u'kind':kind, u'arguments':arguments, u'iterated':iterated}, var) + var.registers([u'kind', u'iterated']) + var.get(u"this").put(u'_t', var.get(u'toIObject')(var.get(u'iterated'))) + var.get(u"this").put(u'_i', Js(0.0)) + var.get(u"this").put(u'_k', var.get(u'kind')) + PyJs_anonymous_1767_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1768_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'index', u'kind', u'O']) + var.put(u'O', var.get(u"this").get(u'_t')) + var.put(u'kind', var.get(u"this").get(u'_k')) + var.put(u'index', (var.get(u"this").put(u'_i',Js(var.get(u"this").get(u'_i').to_number())+Js(1))-Js(1))) + if (var.get(u'O').neg() or (var.get(u'index')>=var.get(u'O').get(u'length'))): + var.get(u"this").put(u'_t', var.get(u'undefined')) + return var.get(u'step')(Js(1.0)) + if (var.get(u'kind')==Js(u'keys')): + return var.get(u'step')(Js(0.0), var.get(u'index')) + if (var.get(u'kind')==Js(u'values')): + return var.get(u'step')(Js(0.0), var.get(u'O').get(var.get(u'index'))) + return var.get(u'step')(Js(0.0), Js([var.get(u'index'), var.get(u'O').get(var.get(u'index'))])) + PyJs_anonymous_1768_._set_name(u'anonymous') + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./_iter-define'))(var.get(u'Array'), Js(u'Array'), PyJs_anonymous_1767_, PyJs_anonymous_1768_, Js(u'values'))) + var.get(u'Iterators').put(u'Arguments', var.get(u'Iterators').get(u'Array')) + var.get(u'addToUnscopables')(Js(u'keys')) + var.get(u'addToUnscopables')(Js(u'values')) + var.get(u'addToUnscopables')(Js(u'entries')) +PyJs_anonymous_1766_._set_name(u'anonymous') +PyJs_Object_1769_ = Js({u'./_add-to-unscopables':Js(130.0),u'./_iter-define':Js(165.0),u'./_iter-step':Js(166.0),u'./_iterators':Js(167.0),u'./_to-iobject':Js(195.0)}) +@Js +def PyJs_anonymous_1770_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'strong', u'exports', u'module']) + Js(u'use strict') + var.put(u'strong', var.get(u'require')(Js(u'./_collection-strong'))) + @Js + def PyJs_anonymous_1771_(get, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':get}, var) + var.registers([u'get']) + @Js + def PyJs_Map_1772_(this, arguments, var=var): + var = Scope({u'this':this, u'Map':PyJs_Map_1772_, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'get')(var.get(u"this"), (var.get(u'arguments').get(u'0') if (var.get(u'arguments').get(u'length')>Js(0.0)) else var.get(u'undefined'))) + PyJs_Map_1772_._set_name(u'Map') + return PyJs_Map_1772_ + PyJs_anonymous_1771_._set_name(u'anonymous') + @Js + def PyJs_get_1774_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key, u'get':PyJs_get_1774_}, var) + var.registers([u'entry', u'key']) + var.put(u'entry', var.get(u'strong').callprop(u'getEntry', var.get(u"this"), var.get(u'key'))) + return (var.get(u'entry') and var.get(u'entry').get(u'v')) + PyJs_get_1774_._set_name(u'get') + @Js + def PyJs_set_1775_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'set':PyJs_set_1775_, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + return var.get(u'strong').callprop(u'def', var.get(u"this"), (Js(0.0) if PyJsStrictEq(var.get(u'key'),Js(0.0)) else var.get(u'key')), var.get(u'value')) + PyJs_set_1775_._set_name(u'set') + PyJs_Object_1773_ = Js({u'get':PyJs_get_1774_,u'set':PyJs_set_1775_}) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./_collection'))(Js(u'Map'), PyJs_anonymous_1771_, PyJs_Object_1773_, var.get(u'strong'), var.get(u'true'))) +PyJs_anonymous_1770_._set_name(u'anonymous') +PyJs_Object_1776_ = Js({u'./_collection':Js(143.0),u'./_collection-strong':Js(140.0)}) +@Js +def PyJs_anonymous_1777_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'$export', u'require', u'exports', u'module']) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + PyJs_Object_1778_ = Js({u'MAX_SAFE_INTEGER':Js(9007199254740991)}) + var.get(u'$export')(var.get(u'$export').get(u'S'), Js(u'Number'), PyJs_Object_1778_) +PyJs_anonymous_1777_._set_name(u'anonymous') +PyJs_Object_1779_ = Js({u'./_export':Js(151.0)}) +@Js +def PyJs_anonymous_1780_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'$export', u'require', u'exports', u'module']) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + PyJs_Object_1781_ = Js({u'assign':var.get(u'require')(Js(u'./_object-assign'))}) + var.get(u'$export')((var.get(u'$export').get(u'S')+var.get(u'$export').get(u'F')), Js(u'Object'), PyJs_Object_1781_) +PyJs_anonymous_1780_._set_name(u'anonymous') +PyJs_Object_1782_ = Js({u'./_export':Js(151.0),u'./_object-assign':Js(171.0)}) +@Js +def PyJs_anonymous_1783_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'$export', u'require', u'exports', u'module']) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + PyJs_Object_1784_ = Js({u'create':var.get(u'require')(Js(u'./_object-create'))}) + var.get(u'$export')(var.get(u'$export').get(u'S'), Js(u'Object'), PyJs_Object_1784_) +PyJs_anonymous_1783_._set_name(u'anonymous') +PyJs_Object_1785_ = Js({u'./_export':Js(151.0),u'./_object-create':Js(172.0)}) +@Js +def PyJs_anonymous_1786_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'toObject', u'require', u'$keys', u'module']) + var.put(u'toObject', var.get(u'require')(Js(u'./_to-object'))) + var.put(u'$keys', var.get(u'require')(Js(u'./_object-keys'))) + @Js + def PyJs_anonymous_1787_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_keys_1788_(it, this, arguments, var=var): + var = Scope({u'this':this, u'keys':PyJs_keys_1788_, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return var.get(u'$keys')(var.get(u'toObject')(var.get(u'it'))) + PyJs_keys_1788_._set_name(u'keys') + return PyJs_keys_1788_ + PyJs_anonymous_1787_._set_name(u'anonymous') + var.get(u'require')(Js(u'./_object-sap'))(Js(u'keys'), PyJs_anonymous_1787_) +PyJs_anonymous_1786_._set_name(u'anonymous') +PyJs_Object_1789_ = Js({u'./_object-keys':Js(181.0),u'./_object-sap':Js(183.0),u'./_to-object':Js(197.0)}) +@Js +def PyJs_anonymous_1790_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'$export', u'require', u'exports', u'module']) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + PyJs_Object_1791_ = Js({u'setPrototypeOf':var.get(u'require')(Js(u'./_set-proto')).get(u'set')}) + var.get(u'$export')(var.get(u'$export').get(u'S'), Js(u'Object'), PyJs_Object_1791_) +PyJs_anonymous_1790_._set_name(u'anonymous') +PyJs_Object_1792_ = Js({u'./_export':Js(151.0),u'./_set-proto':Js(187.0)}) +@Js +def PyJs_anonymous_1793_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + pass +PyJs_anonymous_1793_._set_name(u'anonymous') +PyJs_Object_1794_ = Js({}) +@Js +def PyJs_anonymous_1795_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'$at', u'require', u'exports', u'module']) + Js(u'use strict') + var.put(u'$at', var.get(u'require')(Js(u'./_string-at'))(var.get(u'true'))) + @Js + def PyJs_anonymous_1796_(iterated, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'iterated':iterated}, var) + var.registers([u'iterated']) + var.get(u"this").put(u'_t', var.get(u'String')(var.get(u'iterated'))) + var.get(u"this").put(u'_i', Js(0.0)) + PyJs_anonymous_1796_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1797_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'index', u'O', u'point']) + var.put(u'O', var.get(u"this").get(u'_t')) + var.put(u'index', var.get(u"this").get(u'_i')) + if (var.get(u'index')>=var.get(u'O').get(u'length')): + PyJs_Object_1798_ = Js({u'value':var.get(u'undefined'),u'done':var.get(u'true')}) + return PyJs_Object_1798_ + var.put(u'point', var.get(u'$at')(var.get(u'O'), var.get(u'index'))) + var.get(u"this").put(u'_i', var.get(u'point').get(u'length'), u'+') + PyJs_Object_1799_ = Js({u'value':var.get(u'point'),u'done':Js(False)}) + return PyJs_Object_1799_ + PyJs_anonymous_1797_._set_name(u'anonymous') + var.get(u'require')(Js(u'./_iter-define'))(var.get(u'String'), Js(u'String'), PyJs_anonymous_1796_, PyJs_anonymous_1797_) +PyJs_anonymous_1795_._set_name(u'anonymous') +PyJs_Object_1800_ = Js({u'./_iter-define':Js(165.0),u'./_string-at':Js(192.0)}) +@Js +def PyJs_anonymous_1801_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_create', u'redefine', u'uid', u'setter', u'global', u'$keys', u'$create', u'$JSON', u'$getOwnPropertySymbols', u'META', u'toIObject', u'$defineProperty', u'wrap', u'wks', u'PROTOTYPE', u'$propertyIsEnumerable', u'ObjectProto', u'OPSymbols', u'$export', u'gOPNExt', u'$DP', u'toPrimitive', u'$GOPD', u'gOPN', u'isEnum', u'keyOf', u'shared', u'gOPD', u'has', u'isArray', u'exports', u'wksExt', u'$fails', u'TO_PRIMITIVE', u'setToStringTag', u'enumKeys', u'SymbolRegistry', u'$defineProperties', u'anObject', u'module', u'$getOwnPropertyDescriptor', u'AllSymbols', u'USE_NATIVE', u'symbols', u'setSymbolDesc', u'i', u'DESCRIPTORS', u'require', u'$getOwnPropertyNames', u'$Symbol', u'_stringify', u'wksDefine', u'HIDDEN', u'isSymbol', u'createDesc', u'dP', u'QObject']) + Js(u'use strict') + var.put(u'global', var.get(u'require')(Js(u'./_global'))) + var.put(u'has', var.get(u'require')(Js(u'./_has'))) + var.put(u'DESCRIPTORS', var.get(u'require')(Js(u'./_descriptors'))) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + var.put(u'redefine', var.get(u'require')(Js(u'./_redefine'))) + var.put(u'META', var.get(u'require')(Js(u'./_meta')).get(u'KEY')) + var.put(u'$fails', var.get(u'require')(Js(u'./_fails'))) + var.put(u'shared', var.get(u'require')(Js(u'./_shared'))) + var.put(u'setToStringTag', var.get(u'require')(Js(u'./_set-to-string-tag'))) + var.put(u'uid', var.get(u'require')(Js(u'./_uid'))) + var.put(u'wks', var.get(u'require')(Js(u'./_wks'))) + var.put(u'wksExt', var.get(u'require')(Js(u'./_wks-ext'))) + var.put(u'wksDefine', var.get(u'require')(Js(u'./_wks-define'))) + var.put(u'keyOf', var.get(u'require')(Js(u'./_keyof'))) + var.put(u'enumKeys', var.get(u'require')(Js(u'./_enum-keys'))) + var.put(u'isArray', var.get(u'require')(Js(u'./_is-array'))) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + var.put(u'toIObject', var.get(u'require')(Js(u'./_to-iobject'))) + var.put(u'toPrimitive', var.get(u'require')(Js(u'./_to-primitive'))) + var.put(u'createDesc', var.get(u'require')(Js(u'./_property-desc'))) + var.put(u'_create', var.get(u'require')(Js(u'./_object-create'))) + var.put(u'gOPNExt', var.get(u'require')(Js(u'./_object-gopn-ext'))) + var.put(u'$GOPD', var.get(u'require')(Js(u'./_object-gopd'))) + var.put(u'$DP', var.get(u'require')(Js(u'./_object-dp'))) + var.put(u'$keys', var.get(u'require')(Js(u'./_object-keys'))) + var.put(u'gOPD', var.get(u'$GOPD').get(u'f')) + var.put(u'dP', var.get(u'$DP').get(u'f')) + var.put(u'gOPN', var.get(u'gOPNExt').get(u'f')) + var.put(u'$Symbol', var.get(u'global').get(u'Symbol')) + var.put(u'$JSON', var.get(u'global').get(u'JSON')) + var.put(u'_stringify', (var.get(u'$JSON') and var.get(u'$JSON').get(u'stringify'))) + var.put(u'PROTOTYPE', Js(u'prototype')) + var.put(u'HIDDEN', var.get(u'wks')(Js(u'_hidden'))) + var.put(u'TO_PRIMITIVE', var.get(u'wks')(Js(u'toPrimitive'))) + PyJs_Object_1802_ = Js({}) + var.put(u'isEnum', PyJs_Object_1802_.get(u'propertyIsEnumerable')) + var.put(u'SymbolRegistry', var.get(u'shared')(Js(u'symbol-registry'))) + var.put(u'AllSymbols', var.get(u'shared')(Js(u'symbols'))) + var.put(u'OPSymbols', var.get(u'shared')(Js(u'op-symbols'))) + var.put(u'ObjectProto', var.get(u'Object').get(var.get(u'PROTOTYPE'))) + var.put(u'USE_NATIVE', (var.get(u'$Symbol',throw=False).typeof()==Js(u'function'))) + var.put(u'QObject', var.get(u'global').get(u'QObject')) + var.put(u'setter', ((var.get(u'QObject').neg() or var.get(u'QObject').get(var.get(u'PROTOTYPE')).neg()) or var.get(u'QObject').get(var.get(u'PROTOTYPE')).get(u'findChild').neg())) + @Js + def PyJs_anonymous_1803_(it, key, D, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'it':it, u'key':key, u'D':D}, var) + var.registers([u'protoDesc', u'it', u'key', u'D']) + var.put(u'protoDesc', var.get(u'gOPD')(var.get(u'ObjectProto'), var.get(u'key'))) + if var.get(u'protoDesc'): + var.get(u'ObjectProto').delete(var.get(u'key')) + var.get(u'dP')(var.get(u'it'), var.get(u'key'), var.get(u'D')) + if (var.get(u'protoDesc') and PyJsStrictNeq(var.get(u'it'),var.get(u'ObjectProto'))): + var.get(u'dP')(var.get(u'ObjectProto'), var.get(u'key'), var.get(u'protoDesc')) + PyJs_anonymous_1803_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1804_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_1805_ = Js({}) + @Js + def PyJs_anonymous_1807_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_1808_ = Js({u'value':Js(7.0)}) + return var.get(u'dP')(var.get(u"this"), Js(u'a'), PyJs_Object_1808_).get(u'a') + PyJs_anonymous_1807_._set_name(u'anonymous') + PyJs_Object_1806_ = Js({u'get':PyJs_anonymous_1807_}) + return (var.get(u'_create')(var.get(u'dP')(PyJs_Object_1805_, Js(u'a'), PyJs_Object_1806_)).get(u'a')!=Js(7.0)) + PyJs_anonymous_1804_._set_name(u'anonymous') + var.put(u'setSymbolDesc', (PyJs_anonymous_1803_ if (var.get(u'DESCRIPTORS') and var.get(u'$fails')(PyJs_anonymous_1804_)) else var.get(u'dP'))) + @Js + def PyJs_anonymous_1809_(tag, this, arguments, var=var): + var = Scope({u'this':this, u'tag':tag, u'arguments':arguments}, var) + var.registers([u'tag', u'sym']) + var.put(u'sym', var.get(u'AllSymbols').put(var.get(u'tag'), var.get(u'_create')(var.get(u'$Symbol').get(var.get(u'PROTOTYPE'))))) + var.get(u'sym').put(u'_k', var.get(u'tag')) + return var.get(u'sym') + PyJs_anonymous_1809_._set_name(u'anonymous') + var.put(u'wrap', PyJs_anonymous_1809_) + @Js + def PyJs_anonymous_1810_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return (var.get(u'it',throw=False).typeof()==Js(u'symbol')) + PyJs_anonymous_1810_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1811_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return var.get(u'it').instanceof(var.get(u'$Symbol')) + PyJs_anonymous_1811_._set_name(u'anonymous') + var.put(u'isSymbol', (PyJs_anonymous_1810_ if (var.get(u'USE_NATIVE') and (var.get(u'$Symbol').get(u'iterator').typeof()==Js(u'symbol'))) else PyJs_anonymous_1811_)) + @Js + def PyJs_defineProperty_1812_(it, key, D, this, arguments, var=var): + var = Scope({u'D':D, u'this':this, u'it':it, u'arguments':arguments, u'key':key, u'defineProperty':PyJs_defineProperty_1812_}, var) + var.registers([u'it', u'key', u'D']) + if PyJsStrictEq(var.get(u'it'),var.get(u'ObjectProto')): + var.get(u'$defineProperty')(var.get(u'OPSymbols'), var.get(u'key'), var.get(u'D')) + var.get(u'anObject')(var.get(u'it')) + var.put(u'key', var.get(u'toPrimitive')(var.get(u'key'), var.get(u'true'))) + var.get(u'anObject')(var.get(u'D')) + if var.get(u'has')(var.get(u'AllSymbols'), var.get(u'key')): + if var.get(u'D').get(u'enumerable').neg(): + if var.get(u'has')(var.get(u'it'), var.get(u'HIDDEN')).neg(): + PyJs_Object_1813_ = Js({}) + var.get(u'dP')(var.get(u'it'), var.get(u'HIDDEN'), var.get(u'createDesc')(Js(1.0), PyJs_Object_1813_)) + var.get(u'it').get(var.get(u'HIDDEN')).put(var.get(u'key'), var.get(u'true')) + else: + if (var.get(u'has')(var.get(u'it'), var.get(u'HIDDEN')) and var.get(u'it').get(var.get(u'HIDDEN')).get(var.get(u'key'))): + var.get(u'it').get(var.get(u'HIDDEN')).put(var.get(u'key'), Js(False)) + PyJs_Object_1814_ = Js({u'enumerable':var.get(u'createDesc')(Js(0.0), Js(False))}) + var.put(u'D', var.get(u'_create')(var.get(u'D'), PyJs_Object_1814_)) + return var.get(u'setSymbolDesc')(var.get(u'it'), var.get(u'key'), var.get(u'D')) + return var.get(u'dP')(var.get(u'it'), var.get(u'key'), var.get(u'D')) + PyJs_defineProperty_1812_._set_name(u'defineProperty') + var.put(u'$defineProperty', PyJs_defineProperty_1812_) + @Js + def PyJs_defineProperties_1815_(it, P, this, arguments, var=var): + var = Scope({u'this':this, u'P':P, u'it':it, u'defineProperties':PyJs_defineProperties_1815_, u'arguments':arguments}, var) + var.registers([u'P', u'keys', u'l', u'it', u'i', u'key']) + var.get(u'anObject')(var.get(u'it')) + var.put(u'keys', var.get(u'enumKeys')(var.put(u'P', var.get(u'toIObject')(var.get(u'P'))))) + var.put(u'i', Js(0.0)) + var.put(u'l', var.get(u'keys').get(u'length')) + while (var.get(u'l')>var.get(u'i')): + var.get(u'$defineProperty')(var.get(u'it'), var.put(u'key', var.get(u'keys').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))), var.get(u'P').get(var.get(u'key'))) + return var.get(u'it') + PyJs_defineProperties_1815_._set_name(u'defineProperties') + var.put(u'$defineProperties', PyJs_defineProperties_1815_) + @Js + def PyJs_create_1816_(it, P, this, arguments, var=var): + var = Scope({u'this':this, u'P':P, u'create':PyJs_create_1816_, u'it':it, u'arguments':arguments}, var) + var.registers([u'P', u'it']) + return (var.get(u'_create')(var.get(u'it')) if PyJsStrictEq(var.get(u'P'),var.get(u'undefined')) else var.get(u'$defineProperties')(var.get(u'_create')(var.get(u'it')), var.get(u'P'))) + PyJs_create_1816_._set_name(u'create') + var.put(u'$create', PyJs_create_1816_) + @Js + def PyJs_propertyIsEnumerable_1817_(key, this, arguments, var=var): + var = Scope({u'this':this, u'propertyIsEnumerable':PyJs_propertyIsEnumerable_1817_, u'arguments':arguments, u'key':key}, var) + var.registers([u'E', u'key']) + var.put(u'E', var.get(u'isEnum').callprop(u'call', var.get(u"this"), var.put(u'key', var.get(u'toPrimitive')(var.get(u'key'), var.get(u'true'))))) + if ((PyJsStrictEq(var.get(u"this"),var.get(u'ObjectProto')) and var.get(u'has')(var.get(u'AllSymbols'), var.get(u'key'))) and var.get(u'has')(var.get(u'OPSymbols'), var.get(u'key')).neg()): + return Js(False) + return (var.get(u'E') if (((var.get(u'E') or var.get(u'has')(var.get(u"this"), var.get(u'key')).neg()) or var.get(u'has')(var.get(u'AllSymbols'), var.get(u'key')).neg()) or (var.get(u'has')(var.get(u"this"), var.get(u'HIDDEN')) and var.get(u"this").get(var.get(u'HIDDEN')).get(var.get(u'key')))) else var.get(u'true')) + PyJs_propertyIsEnumerable_1817_._set_name(u'propertyIsEnumerable') + var.put(u'$propertyIsEnumerable', PyJs_propertyIsEnumerable_1817_) + @Js + def PyJs_getOwnPropertyDescriptor_1818_(it, key, this, arguments, var=var): + var = Scope({u'this':this, u'getOwnPropertyDescriptor':PyJs_getOwnPropertyDescriptor_1818_, u'it':it, u'key':key, u'arguments':arguments}, var) + var.registers([u'D', u'key', u'it']) + var.put(u'it', var.get(u'toIObject')(var.get(u'it'))) + var.put(u'key', var.get(u'toPrimitive')(var.get(u'key'), var.get(u'true'))) + if ((PyJsStrictEq(var.get(u'it'),var.get(u'ObjectProto')) and var.get(u'has')(var.get(u'AllSymbols'), var.get(u'key'))) and var.get(u'has')(var.get(u'OPSymbols'), var.get(u'key')).neg()): + return var.get('undefined') + var.put(u'D', var.get(u'gOPD')(var.get(u'it'), var.get(u'key'))) + if ((var.get(u'D') and var.get(u'has')(var.get(u'AllSymbols'), var.get(u'key'))) and (var.get(u'has')(var.get(u'it'), var.get(u'HIDDEN')) and var.get(u'it').get(var.get(u'HIDDEN')).get(var.get(u'key'))).neg()): + var.get(u'D').put(u'enumerable', var.get(u'true')) + return var.get(u'D') + PyJs_getOwnPropertyDescriptor_1818_._set_name(u'getOwnPropertyDescriptor') + var.put(u'$getOwnPropertyDescriptor', PyJs_getOwnPropertyDescriptor_1818_) + @Js + def PyJs_getOwnPropertyNames_1819_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'getOwnPropertyNames':PyJs_getOwnPropertyNames_1819_, u'arguments':arguments}, var) + var.registers([u'i', u'it', u'names', u'key', u'result']) + var.put(u'names', var.get(u'gOPN')(var.get(u'toIObject')(var.get(u'it')))) + var.put(u'result', Js([])) + var.put(u'i', Js(0.0)) + while (var.get(u'names').get(u'length')>var.get(u'i')): + if ((var.get(u'has')(var.get(u'AllSymbols'), var.put(u'key', var.get(u'names').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1))))).neg() and (var.get(u'key')!=var.get(u'HIDDEN'))) and (var.get(u'key')!=var.get(u'META'))): + var.get(u'result').callprop(u'push', var.get(u'key')) + return var.get(u'result') + PyJs_getOwnPropertyNames_1819_._set_name(u'getOwnPropertyNames') + var.put(u'$getOwnPropertyNames', PyJs_getOwnPropertyNames_1819_) + @Js + def PyJs_getOwnPropertySymbols_1820_(it, this, arguments, var=var): + var = Scope({u'this':this, u'getOwnPropertySymbols':PyJs_getOwnPropertySymbols_1820_, u'it':it, u'arguments':arguments}, var) + var.registers([u'i', u'it', u'names', u'key', u'IS_OP', u'result']) + var.put(u'IS_OP', PyJsStrictEq(var.get(u'it'),var.get(u'ObjectProto'))) + var.put(u'names', var.get(u'gOPN')((var.get(u'OPSymbols') if var.get(u'IS_OP') else var.get(u'toIObject')(var.get(u'it'))))) + var.put(u'result', Js([])) + var.put(u'i', Js(0.0)) + while (var.get(u'names').get(u'length')>var.get(u'i')): + if (var.get(u'has')(var.get(u'AllSymbols'), var.put(u'key', var.get(u'names').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1))))) and (var.get(u'has')(var.get(u'ObjectProto'), var.get(u'key')) if var.get(u'IS_OP') else var.get(u'true'))): + var.get(u'result').callprop(u'push', var.get(u'AllSymbols').get(var.get(u'key'))) + return var.get(u'result') + PyJs_getOwnPropertySymbols_1820_._set_name(u'getOwnPropertySymbols') + var.put(u'$getOwnPropertySymbols', PyJs_getOwnPropertySymbols_1820_) + if var.get(u'USE_NATIVE').neg(): + @Js + def PyJs_Symbol_1821_(this, arguments, var=var): + var = Scope({u'this':this, u'Symbol':PyJs_Symbol_1821_, u'arguments':arguments}, var) + var.registers([u'$set', u'tag']) + if var.get(u"this").instanceof(var.get(u'$Symbol')): + PyJsTempException = JsToPyException(var.get(u'TypeError')(Js(u'Symbol is not a constructor!'))) + raise PyJsTempException + var.put(u'tag', var.get(u'uid')((var.get(u'arguments').get(u'0') if (var.get(u'arguments').get(u'length')>Js(0.0)) else var.get(u'undefined')))) + @Js + def PyJs_anonymous_1822_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + if PyJsStrictEq(var.get(u"this"),var.get(u'ObjectProto')): + var.get(u'$set').callprop(u'call', var.get(u'OPSymbols'), var.get(u'value')) + if (var.get(u'has')(var.get(u"this"), var.get(u'HIDDEN')) and var.get(u'has')(var.get(u"this").get(var.get(u'HIDDEN')), var.get(u'tag'))): + var.get(u"this").get(var.get(u'HIDDEN')).put(var.get(u'tag'), Js(False)) + var.get(u'setSymbolDesc')(var.get(u"this"), var.get(u'tag'), var.get(u'createDesc')(Js(1.0), var.get(u'value'))) + PyJs_anonymous_1822_._set_name(u'anonymous') + var.put(u'$set', PyJs_anonymous_1822_) + if (var.get(u'DESCRIPTORS') and var.get(u'setter')): + PyJs_Object_1823_ = Js({u'configurable':var.get(u'true'),u'set':var.get(u'$set')}) + var.get(u'setSymbolDesc')(var.get(u'ObjectProto'), var.get(u'tag'), PyJs_Object_1823_) + return var.get(u'wrap')(var.get(u'tag')) + PyJs_Symbol_1821_._set_name(u'Symbol') + var.put(u'$Symbol', PyJs_Symbol_1821_) + @Js + def PyJs_toString_1824_(this, arguments, var=var): + var = Scope({u'this':this, u'toString':PyJs_toString_1824_, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").get(u'_k') + PyJs_toString_1824_._set_name(u'toString') + var.get(u'redefine')(var.get(u'$Symbol').get(var.get(u'PROTOTYPE')), Js(u'toString'), PyJs_toString_1824_) + var.get(u'$GOPD').put(u'f', var.get(u'$getOwnPropertyDescriptor')) + var.get(u'$DP').put(u'f', var.get(u'$defineProperty')) + var.get(u'require')(Js(u'./_object-gopn')).put(u'f', var.get(u'gOPNExt').put(u'f', var.get(u'$getOwnPropertyNames'))) + var.get(u'require')(Js(u'./_object-pie')).put(u'f', var.get(u'$propertyIsEnumerable')) + var.get(u'require')(Js(u'./_object-gops')).put(u'f', var.get(u'$getOwnPropertySymbols')) + if (var.get(u'DESCRIPTORS') and var.get(u'require')(Js(u'./_library')).neg()): + var.get(u'redefine')(var.get(u'ObjectProto'), Js(u'propertyIsEnumerable'), var.get(u'$propertyIsEnumerable'), var.get(u'true')) + @Js + def PyJs_anonymous_1825_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return var.get(u'wrap')(var.get(u'wks')(var.get(u'name'))) + PyJs_anonymous_1825_._set_name(u'anonymous') + var.get(u'wksExt').put(u'f', PyJs_anonymous_1825_) + PyJs_Object_1826_ = Js({u'Symbol':var.get(u'$Symbol')}) + var.get(u'$export')(((var.get(u'$export').get(u'G')+var.get(u'$export').get(u'W'))+(var.get(u'$export').get(u'F')*var.get(u'USE_NATIVE').neg())), PyJs_Object_1826_) + #for JS loop + var.put(u'symbols', Js(u'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables').callprop(u'split', Js(u','))) + var.put(u'i', Js(0.0)) + while (var.get(u'symbols').get(u'length')>var.get(u'i')): + var.get(u'wks')(var.get(u'symbols').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + + #for JS loop + var.put(u'symbols', var.get(u'$keys')(var.get(u'wks').get(u'store'))) + var.put(u'i', Js(0.0)) + while (var.get(u'symbols').get(u'length')>var.get(u'i')): + var.get(u'wksDefine')(var.get(u'symbols').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + + @Js + def PyJs_anonymous_1828_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return (var.get(u'SymbolRegistry').get(var.get(u'key')) if var.get(u'has')(var.get(u'SymbolRegistry'), var.put(u'key', Js(u''), u'+')) else var.get(u'SymbolRegistry').put(var.get(u'key'), var.get(u'$Symbol')(var.get(u'key')))) + PyJs_anonymous_1828_._set_name(u'anonymous') + @Js + def PyJs_keyFor_1829_(key, this, arguments, var=var): + var = Scope({u'this':this, u'keyFor':PyJs_keyFor_1829_, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + if var.get(u'isSymbol')(var.get(u'key')): + return var.get(u'keyOf')(var.get(u'SymbolRegistry'), var.get(u'key')) + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'key')+Js(u' is not a symbol!')))) + raise PyJsTempException + PyJs_keyFor_1829_._set_name(u'keyFor') + @Js + def PyJs_anonymous_1830_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.put(u'setter', var.get(u'true')) + PyJs_anonymous_1830_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1831_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.put(u'setter', Js(False)) + PyJs_anonymous_1831_._set_name(u'anonymous') + PyJs_Object_1827_ = Js({u'for':PyJs_anonymous_1828_,u'keyFor':PyJs_keyFor_1829_,u'useSetter':PyJs_anonymous_1830_,u'useSimple':PyJs_anonymous_1831_}) + var.get(u'$export')((var.get(u'$export').get(u'S')+(var.get(u'$export').get(u'F')*var.get(u'USE_NATIVE').neg())), Js(u'Symbol'), PyJs_Object_1827_) + PyJs_Object_1832_ = Js({u'create':var.get(u'$create'),u'defineProperty':var.get(u'$defineProperty'),u'defineProperties':var.get(u'$defineProperties'),u'getOwnPropertyDescriptor':var.get(u'$getOwnPropertyDescriptor'),u'getOwnPropertyNames':var.get(u'$getOwnPropertyNames'),u'getOwnPropertySymbols':var.get(u'$getOwnPropertySymbols')}) + var.get(u'$export')((var.get(u'$export').get(u'S')+(var.get(u'$export').get(u'F')*var.get(u'USE_NATIVE').neg())), Js(u'Object'), PyJs_Object_1832_) + @Js + def PyJs_anonymous_1833_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'S']) + var.put(u'S', var.get(u'$Symbol')()) + PyJs_Object_1834_ = Js({u'a':var.get(u'S')}) + return (((var.get(u'_stringify')(Js([var.get(u'S')]))!=Js(u'[null]')) or (var.get(u'_stringify')(PyJs_Object_1834_)!=Js(u'{}'))) or (var.get(u'_stringify')(var.get(u'Object')(var.get(u'S')))!=Js(u'{}'))) + PyJs_anonymous_1833_._set_name(u'anonymous') + @Js + def PyJs_stringify_1836_(it, this, arguments, var=var): + var = Scope({u'this':this, u'stringify':PyJs_stringify_1836_, u'it':it, u'arguments':arguments}, var) + var.registers([u'i', u'replacer', u'args', u'it', u'$replacer']) + if (PyJsStrictEq(var.get(u'it'),var.get(u'undefined')) or var.get(u'isSymbol')(var.get(u'it'))): + return var.get('undefined') + var.put(u'args', Js([var.get(u'it')])) + var.put(u'i', Js(1.0)) + while (var.get(u'arguments').get(u'length')>var.get(u'i')): + var.get(u'args').callprop(u'push', var.get(u'arguments').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + var.put(u'replacer', var.get(u'args').get(u'1')) + if (var.get(u'replacer',throw=False).typeof()==Js(u'function')): + var.put(u'$replacer', var.get(u'replacer')) + if (var.get(u'$replacer') or var.get(u'isArray')(var.get(u'replacer')).neg()): + @Js + def PyJs_anonymous_1837_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + if var.get(u'$replacer'): + var.put(u'value', var.get(u'$replacer').callprop(u'call', var.get(u"this"), var.get(u'key'), var.get(u'value'))) + if var.get(u'isSymbol')(var.get(u'value')).neg(): + return var.get(u'value') + PyJs_anonymous_1837_._set_name(u'anonymous') + var.put(u'replacer', PyJs_anonymous_1837_) + var.get(u'args').put(u'1', var.get(u'replacer')) + return var.get(u'_stringify').callprop(u'apply', var.get(u'$JSON'), var.get(u'args')) + PyJs_stringify_1836_._set_name(u'stringify') + PyJs_Object_1835_ = Js({u'stringify':PyJs_stringify_1836_}) + (var.get(u'$JSON') and var.get(u'$export')((var.get(u'$export').get(u'S')+(var.get(u'$export').get(u'F')*(var.get(u'USE_NATIVE').neg() or var.get(u'$fails')(PyJs_anonymous_1833_)))), Js(u'JSON'), PyJs_Object_1835_)) + (var.get(u'$Symbol').get(var.get(u'PROTOTYPE')).get(var.get(u'TO_PRIMITIVE')) or var.get(u'require')(Js(u'./_hide'))(var.get(u'$Symbol').get(var.get(u'PROTOTYPE')), var.get(u'TO_PRIMITIVE'), var.get(u'$Symbol').get(var.get(u'PROTOTYPE')).get(u'valueOf'))) + var.get(u'setToStringTag')(var.get(u'$Symbol'), Js(u'Symbol')) + var.get(u'setToStringTag')(var.get(u'Math'), Js(u'Math'), var.get(u'true')) + var.get(u'setToStringTag')(var.get(u'global').get(u'JSON'), Js(u'JSON'), var.get(u'true')) +PyJs_anonymous_1801_._set_name(u'anonymous') +PyJs_Object_1838_ = Js({u'./_an-object':Js(132.0),u'./_descriptors':Js(147.0),u'./_enum-keys':Js(150.0),u'./_export':Js(151.0),u'./_fails':Js(152.0),u'./_global':Js(154.0),u'./_has':Js(155.0),u'./_hide':Js(156.0),u'./_is-array':Js(161.0),u'./_keyof':Js(168.0),u'./_library':Js(169.0),u'./_meta':Js(170.0),u'./_object-create':Js(172.0),u'./_object-dp':Js(173.0),u'./_object-gopd':Js(175.0),u'./_object-gopn':Js(177.0),u'./_object-gopn-ext':Js(176.0),u'./_object-gops':Js(178.0),u'./_object-keys':Js(181.0),u'./_object-pie':Js(182.0),u'./_property-desc':Js(184.0),u'./_redefine':Js(186.0),u'./_set-to-string-tag':Js(189.0),u'./_shared':Js(191.0),u'./_to-iobject':Js(195.0),u'./_to-primitive':Js(198.0),u'./_uid':Js(199.0),u'./_wks':Js(202.0),u'./_wks-define':Js(200.0),u'./_wks-ext':Js(201.0)}) +@Js +def PyJs_anonymous_1839_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'tmp', u'redefine', u'InternalMap', u'methods', u'$WeakMap', u'require', u'isExtensible', u'weak', u'exports', u'wrapper', u'isObject', u'meta', u'module', u'each', u'uncaughtFrozenStore', u'getWeak', u'assign']) + Js(u'use strict') + var.put(u'each', var.get(u'require')(Js(u'./_array-methods'))(Js(0.0))) + var.put(u'redefine', var.get(u'require')(Js(u'./_redefine'))) + var.put(u'meta', var.get(u'require')(Js(u'./_meta'))) + var.put(u'assign', var.get(u'require')(Js(u'./_object-assign'))) + var.put(u'weak', var.get(u'require')(Js(u'./_collection-weak'))) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + var.put(u'getWeak', var.get(u'meta').get(u'getWeak')) + var.put(u'isExtensible', var.get(u'Object').get(u'isExtensible')) + var.put(u'uncaughtFrozenStore', var.get(u'weak').get(u'ufstore')) + PyJs_Object_1840_ = Js({}) + var.put(u'tmp', PyJs_Object_1840_) + @Js + def PyJs_anonymous_1841_(get, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':get}, var) + var.registers([u'get']) + @Js + def PyJs_WeakMap_1842_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'WeakMap':PyJs_WeakMap_1842_}, var) + var.registers([]) + return var.get(u'get')(var.get(u"this"), (var.get(u'arguments').get(u'0') if (var.get(u'arguments').get(u'length')>Js(0.0)) else var.get(u'undefined'))) + PyJs_WeakMap_1842_._set_name(u'WeakMap') + return PyJs_WeakMap_1842_ + PyJs_anonymous_1841_._set_name(u'anonymous') + var.put(u'wrapper', PyJs_anonymous_1841_) + @Js + def PyJs_get_1844_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key, u'get':PyJs_get_1844_}, var) + var.registers([u'data', u'key']) + if var.get(u'isObject')(var.get(u'key')): + var.put(u'data', var.get(u'getWeak')(var.get(u'key'))) + if PyJsStrictEq(var.get(u'data'),var.get(u'true')): + return var.get(u'uncaughtFrozenStore')(var.get(u"this")).callprop(u'get', var.get(u'key')) + return (var.get(u'data').get(var.get(u"this").get(u'_i')) if var.get(u'data') else var.get(u'undefined')) + PyJs_get_1844_._set_name(u'get') + @Js + def PyJs_set_1845_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'set':PyJs_set_1845_, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + return var.get(u'weak').callprop(u'def', var.get(u"this"), var.get(u'key'), var.get(u'value')) + PyJs_set_1845_._set_name(u'set') + PyJs_Object_1843_ = Js({u'get':PyJs_get_1844_,u'set':PyJs_set_1845_}) + var.put(u'methods', PyJs_Object_1843_) + var.put(u'$WeakMap', var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./_collection'))(Js(u'WeakMap'), var.get(u'wrapper'), var.get(u'methods'), var.get(u'weak'), var.get(u'true'), var.get(u'true')))) + if (var.get(u'$WeakMap').create().callprop(u'set', (var.get(u'Object').get(u'freeze') or var.get(u'Object'))(var.get(u'tmp')), Js(7.0)).callprop(u'get', var.get(u'tmp'))!=Js(7.0)): + var.put(u'InternalMap', var.get(u'weak').callprop(u'getConstructor', var.get(u'wrapper'))) + var.get(u'assign')(var.get(u'InternalMap').get(u'prototype'), var.get(u'methods')) + var.get(u'meta').put(u'NEED', var.get(u'true')) + @Js + def PyJs_anonymous_1846_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'method', u'key', u'proto']) + var.put(u'proto', var.get(u'$WeakMap').get(u'prototype')) + var.put(u'method', var.get(u'proto').get(var.get(u'key'))) + @Js + def PyJs_anonymous_1847_(a, b, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'b', u'result']) + if (var.get(u'isObject')(var.get(u'a')) and var.get(u'isExtensible')(var.get(u'a')).neg()): + if var.get(u"this").get(u'_f').neg(): + var.get(u"this").put(u'_f', var.get(u'InternalMap').create()) + var.put(u'result', var.get(u"this").get(u'_f').callprop(var.get(u'key'), var.get(u'a'), var.get(u'b'))) + return (var.get(u"this") if (var.get(u'key')==Js(u'set')) else var.get(u'result')) + return var.get(u'method').callprop(u'call', var.get(u"this"), var.get(u'a'), var.get(u'b')) + PyJs_anonymous_1847_._set_name(u'anonymous') + var.get(u'redefine')(var.get(u'proto'), var.get(u'key'), PyJs_anonymous_1847_) + PyJs_anonymous_1846_._set_name(u'anonymous') + var.get(u'each')(Js([Js(u'delete'), Js(u'has'), Js(u'get'), Js(u'set')]), PyJs_anonymous_1846_) +PyJs_anonymous_1839_._set_name(u'anonymous') +PyJs_Object_1848_ = Js({u'./_array-methods':Js(135.0),u'./_collection':Js(143.0),u'./_collection-weak':Js(142.0),u'./_is-object':Js(162.0),u'./_meta':Js(170.0),u'./_object-assign':Js(171.0),u'./_redefine':Js(186.0)}) +@Js +def PyJs_anonymous_1849_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'weak', u'exports', u'module']) + Js(u'use strict') + var.put(u'weak', var.get(u'require')(Js(u'./_collection-weak'))) + @Js + def PyJs_anonymous_1850_(get, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':get}, var) + var.registers([u'get']) + @Js + def PyJs_WeakSet_1851_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'WeakSet':PyJs_WeakSet_1851_}, var) + var.registers([]) + return var.get(u'get')(var.get(u"this"), (var.get(u'arguments').get(u'0') if (var.get(u'arguments').get(u'length')>Js(0.0)) else var.get(u'undefined'))) + PyJs_WeakSet_1851_._set_name(u'WeakSet') + return PyJs_WeakSet_1851_ + PyJs_anonymous_1850_._set_name(u'anonymous') + @Js + def PyJs_add_1853_(value, this, arguments, var=var): + var = Scope({u'this':this, u'add':PyJs_add_1853_, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return var.get(u'weak').callprop(u'def', var.get(u"this"), var.get(u'value'), var.get(u'true')) + PyJs_add_1853_._set_name(u'add') + PyJs_Object_1852_ = Js({u'add':PyJs_add_1853_}) + var.get(u'require')(Js(u'./_collection'))(Js(u'WeakSet'), PyJs_anonymous_1850_, PyJs_Object_1852_, var.get(u'weak'), Js(False), var.get(u'true')) +PyJs_anonymous_1849_._set_name(u'anonymous') +PyJs_Object_1854_ = Js({u'./_collection':Js(143.0),u'./_collection-weak':Js(142.0)}) +@Js +def PyJs_anonymous_1855_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'$export', u'require', u'exports', u'module']) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + PyJs_Object_1856_ = Js({u'toJSON':var.get(u'require')(Js(u'./_collection-to-json'))(Js(u'Map'))}) + var.get(u'$export')((var.get(u'$export').get(u'P')+var.get(u'$export').get(u'R')), Js(u'Map'), PyJs_Object_1856_) +PyJs_anonymous_1855_._set_name(u'anonymous') +PyJs_Object_1857_ = Js({u'./_collection-to-json':Js(141.0),u'./_export':Js(151.0)}) +@Js +def PyJs_anonymous_1858_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'./_wks-define'))(Js(u'asyncIterator')) +PyJs_anonymous_1858_._set_name(u'anonymous') +PyJs_Object_1859_ = Js({u'./_wks-define':Js(200.0)}) +@Js +def PyJs_anonymous_1860_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'./_wks-define'))(Js(u'observable')) +PyJs_anonymous_1860_._set_name(u'anonymous') +PyJs_Object_1861_ = Js({u'./_wks-define':Js(200.0)}) +@Js +def PyJs_anonymous_1862_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'TO_STRING_TAG', u'exports', u'hide', u'NAME', u'proto', u'i', u'require', u'global', u'Collection', u'Iterators', u'collections', u'module']) + var.get(u'require')(Js(u'./es6.array.iterator')) + var.put(u'global', var.get(u'require')(Js(u'./_global'))) + var.put(u'hide', var.get(u'require')(Js(u'./_hide'))) + var.put(u'Iterators', var.get(u'require')(Js(u'./_iterators'))) + var.put(u'TO_STRING_TAG', var.get(u'require')(Js(u'./_wks'))(Js(u'toStringTag'))) + #for JS loop + var.put(u'collections', Js([Js(u'NodeList'), Js(u'DOMTokenList'), Js(u'MediaList'), Js(u'StyleSheetList'), Js(u'CSSRuleList')])) + var.put(u'i', Js(0.0)) + while (var.get(u'i')<Js(5.0)): + try: + var.put(u'NAME', var.get(u'collections').get(var.get(u'i'))) + var.put(u'Collection', var.get(u'global').get(var.get(u'NAME'))) + var.put(u'proto', (var.get(u'Collection') and var.get(u'Collection').get(u'prototype'))) + if (var.get(u'proto') and var.get(u'proto').get(var.get(u'TO_STRING_TAG')).neg()): + var.get(u'hide')(var.get(u'proto'), var.get(u'TO_STRING_TAG'), var.get(u'NAME')) + var.get(u'Iterators').put(var.get(u'NAME'), var.get(u'Iterators').get(u'Array')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) +PyJs_anonymous_1862_._set_name(u'anonymous') +PyJs_Object_1863_ = Js({u'./_global':Js(154.0),u'./_hide':Js(156.0),u'./_iterators':Js(167.0),u'./_wks':Js(202.0),u'./es6.array.iterator':Js(205.0)}) +@Js +def PyJs_anonymous_1864_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_symbol2', u'module', u'_cloneDeep2', u'_interopRequireDefault', u'_babelTraverse', u'_has2', u'_babylon', u'_cloneDeep', u'templateVisitor', u'babylon', u'TEMPLATE_SKIP', u'exports', u'_assign', u'_babelTraverse2', u'_interopRequireWildcard', u'_babelTypes', u'_has', u'_symbol', u'_assign2', u'useTemplate', u'require', u't', u'FROM_TEMPLATE']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1873_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1873_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_useTemplate_(ast, nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments, u'ast':ast}, var) + var.registers([u'nodes', u'program', u'_ast', u'ast']) + var.put(u'ast', PyJsComma(Js(0.0),var.get(u'_cloneDeep2').get(u'default'))(var.get(u'ast'))) + var.put(u'_ast', var.get(u'ast')) + var.put(u'program', var.get(u'_ast').get(u'program')) + if var.get(u'nodes').get(u'length'): + PyJsComma(Js(0.0),var.get(u'_babelTraverse2').get(u'default'))(var.get(u'ast'), var.get(u'templateVisitor'), var.get(u"null"), var.get(u'nodes')) + if (var.get(u'program').get(u'body').get(u'length')>Js(1.0)): + return var.get(u'program').get(u'body') + else: + return var.get(u'program').get(u'body').get(u'0') + PyJsHoisted_useTemplate_.func_name = u'useTemplate' + var.put(u'useTemplate', PyJsHoisted_useTemplate_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1872_ = Js({}) + var.put(u'newObj', PyJs_Object_1872_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_symbol', var.get(u'require')(Js(u'babel-runtime/core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + @Js + def PyJs_anonymous_1865_(code, opts, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'_getAst', u'code', u'stack', u'opts']) + var.put(u'stack', PyJsComma(Js(0.0), Js(None))) + try: + PyJsTempException = JsToPyException(var.get(u'Error').create()) + raise PyJsTempException + except PyJsException as PyJsTempException: + PyJsHolder_6572726f72_58122749 = var.own.get(u'error') + var.force_own_put(u'error', PyExceptionToJs(PyJsTempException)) + try: + if var.get(u'error').get(u'stack'): + var.put(u'stack', var.get(u'error').get(u'stack').callprop(u'split', Js(u'\n')).callprop(u'slice', Js(1.0)).callprop(u'join', Js(u'\n'))) + finally: + if PyJsHolder_6572726f72_58122749 is not None: + var.own[u'error'] = PyJsHolder_6572726f72_58122749 + else: + del var.own[u'error'] + del PyJsHolder_6572726f72_58122749 + PyJs_Object_1866_ = Js({u'allowReturnOutsideFunction':var.get(u'true'),u'allowSuperOutsideMethod':var.get(u'true'),u'preserveComments':Js(False)}) + var.put(u'opts', PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(PyJs_Object_1866_, var.get(u'opts'))) + @Js + def PyJs_getAst_1867_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getAst':PyJs_getAst_1867_}, var) + var.registers([u'ast']) + var.put(u'ast', PyJsComma(Js(0.0), Js(None))) + try: + var.put(u'ast', var.get(u'babylon').callprop(u'parse', var.get(u'code'), var.get(u'opts'))) + PyJs_Object_1868_ = Js({u'preserveComments':var.get(u'opts').get(u'preserveComments')}) + var.put(u'ast', var.get(u'_babelTraverse2').get(u'default').callprop(u'removeProperties', var.get(u'ast'), PyJs_Object_1868_)) + @Js + def PyJs_anonymous_1869_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'node').put(var.get(u'FROM_TEMPLATE'), var.get(u'true')) + PyJs_anonymous_1869_._set_name(u'anonymous') + var.get(u'_babelTraverse2').get(u'default').callprop(u'cheap', var.get(u'ast'), PyJs_anonymous_1869_) + except PyJsException as PyJsTempException: + PyJsHolder_657272_43794349 = var.own.get(u'err') + var.force_own_put(u'err', PyExceptionToJs(PyJsTempException)) + try: + var.get(u'err').put(u'stack', ((var.get(u'err').get(u'stack')+Js(u'from\n'))+var.get(u'stack'))) + PyJsTempException = JsToPyException(var.get(u'err')) + raise PyJsTempException + finally: + if PyJsHolder_657272_43794349 is not None: + var.own[u'err'] = PyJsHolder_657272_43794349 + else: + del var.own[u'err'] + del PyJsHolder_657272_43794349 + @Js + def PyJs_getAst_1870_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getAst':PyJs_getAst_1870_}, var) + var.registers([]) + return var.get(u'ast') + PyJs_getAst_1870_._set_name(u'getAst') + var.put(u'_getAst', PyJs_getAst_1870_) + return var.get(u'ast') + PyJs_getAst_1867_._set_name(u'getAst') + var.put(u'_getAst', PyJs_getAst_1867_) + @Js + def PyJs_anonymous_1871_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_len', u'_key', u'args']) + #for JS loop + var.put(u'_len', var.get(u'arguments').get(u'length')) + var.put(u'args', var.get(u'Array')(var.get(u'_len'))) + var.put(u'_key', Js(0.0)) + while (var.get(u'_key')<var.get(u'_len')): + try: + var.get(u'args').put(var.get(u'_key'), var.get(u'arguments').get(var.get(u'_key'))) + finally: + (var.put(u'_key',Js(var.get(u'_key').to_number())+Js(1))-Js(1)) + return var.get(u'useTemplate')(var.get(u'_getAst')(), var.get(u'args')) + PyJs_anonymous_1871_._set_name(u'anonymous') + return PyJs_anonymous_1871_ + PyJs_anonymous_1865_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1865_) + var.put(u'_cloneDeep', var.get(u'require')(Js(u'lodash/cloneDeep'))) + var.put(u'_cloneDeep2', var.get(u'_interopRequireDefault')(var.get(u'_cloneDeep'))) + var.put(u'_assign', var.get(u'require')(Js(u'lodash/assign'))) + var.put(u'_assign2', var.get(u'_interopRequireDefault')(var.get(u'_assign'))) + var.put(u'_has', var.get(u'require')(Js(u'lodash/has'))) + var.put(u'_has2', var.get(u'_interopRequireDefault')(var.get(u'_has'))) + var.put(u'_babelTraverse', var.get(u'require')(Js(u'babel-traverse'))) + var.put(u'_babelTraverse2', var.get(u'_interopRequireDefault')(var.get(u'_babelTraverse'))) + var.put(u'_babylon', var.get(u'require')(Js(u'babylon'))) + var.put(u'babylon', var.get(u'_interopRequireWildcard')(var.get(u'_babylon'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'FROM_TEMPLATE', Js(u'_fromTemplate')) + var.put(u'TEMPLATE_SKIP', PyJsComma(Js(0.0),var.get(u'_symbol2').get(u'default'))()) + pass + @Js + def PyJs_enter_1875_(path, args, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'args':args, u'arguments':arguments, u'enter':PyJs_enter_1875_}, var) + var.registers([u'node', u'i', u'path', u'args', u'replacement']) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'node').get(var.get(u'TEMPLATE_SKIP')): + return var.get(u'path').callprop(u'skip') + if var.get(u't').callprop(u'isExpressionStatement', var.get(u'node')): + var.put(u'node', var.get(u'node').get(u'expression')) + var.put(u'replacement', PyJsComma(Js(0.0), Js(None))) + if (var.get(u't').callprop(u'isIdentifier', var.get(u'node')) and var.get(u'node').get(var.get(u'FROM_TEMPLATE'))): + if PyJsComma(Js(0.0),var.get(u'_has2').get(u'default'))(var.get(u'args').get(u'0'), var.get(u'node').get(u'name')): + var.put(u'replacement', var.get(u'args').get(u'0').get(var.get(u'node').get(u'name'))) + else: + if PyJsStrictEq(var.get(u'node').get(u'name').get(u'0'),Js(u'$')): + var.put(u'i', (+var.get(u'node').get(u'name').callprop(u'slice', Js(1.0)))) + if var.get(u'args').get(var.get(u'i')): + var.put(u'replacement', var.get(u'args').get(var.get(u'i'))) + if PyJsStrictEq(var.get(u'replacement'),var.get(u"null")): + var.get(u'path').callprop(u'remove') + if var.get(u'replacement'): + var.get(u'replacement').put(var.get(u'TEMPLATE_SKIP'), var.get(u'true')) + var.get(u'path').callprop(u'replaceInline', var.get(u'replacement')) + PyJs_enter_1875_._set_name(u'enter') + @Js + def PyJs_exit_1876_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'exit':PyJs_exit_1876_, u'arguments':arguments}, var) + var.registers([u'node', u'_ref']) + var.put(u'node', var.get(u'_ref').get(u'node')) + if var.get(u'node').get(u'loc').neg(): + var.get(u'_babelTraverse2').get(u'default').callprop(u'clearNode', var.get(u'node')) + PyJs_exit_1876_._set_name(u'exit') + PyJs_Object_1874_ = Js({u'noScope':var.get(u'true'),u'enter':PyJs_enter_1875_,u'exit':PyJs_exit_1876_}) + var.put(u'templateVisitor', PyJs_Object_1874_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1864_._set_name(u'anonymous') +PyJs_Object_1877_ = Js({u'babel-runtime/core-js/symbol':Js(105.0),u'babel-traverse':Js(225.0),u'babel-types':Js(258.0),u'babylon':Js(262.0),u'lodash/assign':Js(435.0),u'lodash/cloneDeep':Js(439.0),u'lodash/has':Js(453.0)}) +@Js +def PyJs_anonymous_1878_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_weakMap', u'clear', u'module', u'_weakMap2', u'scope', u'_interopRequireDefault', u'path', u'require']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1879_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1879_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_clear_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'exports').put(u'path', var.put(u'path', var.get(u'_weakMap2').get(u'default').create())) + var.get(u'exports').put(u'scope', var.put(u'scope', var.get(u'_weakMap2').get(u'default').create())) + PyJsHoisted_clear_.func_name = u'clear' + var.put(u'clear', PyJsHoisted_clear_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'scope', var.get(u'exports').put(u'path', var.get(u'undefined'))) + var.put(u'_weakMap', var.get(u'require')(Js(u'babel-runtime/core-js/weak-map'))) + var.put(u'_weakMap2', var.get(u'_interopRequireDefault')(var.get(u'_weakMap'))) + var.get(u'exports').put(u'clear', var.get(u'clear')) + pass + var.put(u'path', var.get(u'exports').put(u'path', var.get(u'_weakMap2').get(u'default').create())) + var.put(u'scope', var.get(u'exports').put(u'scope', var.get(u'_weakMap2').get(u'default').create())) + pass +PyJs_anonymous_1878_._set_name(u'anonymous') +PyJs_Object_1880_ = Js({u'babel-runtime/core-js/weak-map':Js(108.0)}) +@Js +def PyJs_anonymous_1881_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1882_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'_babelTypes', u'_classCallCheck2', u'_interopRequireWildcard', u'process', u'_classCallCheck3', u'TraversalContext', u'_getIterator3', u'testing', u't', u'_interopRequireDefault', u'_getIterator2', u'_path3', u'_path2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1884_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1884_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1883_ = Js({}) + var.put(u'newObj', PyJs_Object_1883_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_path2', var.get(u'require')(Js(u'./path'))) + var.put(u'_path3', var.get(u'_interopRequireDefault')(var.get(u'_path2'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'testing', PyJsStrictEq(var.get(u'process').get(u'env').get(u'NODE_ENV'),Js(u'test'))) + @Js + def PyJs_anonymous_1885_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'TraversalContext']) + @Js + def PyJsHoisted_TraversalContext_(scope, opts, state, parentPath, this, arguments, var=var): + var = Scope({u'state':state, u'arguments':arguments, u'parentPath':parentPath, u'this':this, u'scope':scope, u'opts':opts}, var) + var.registers([u'scope', u'state', u'opts', u'parentPath']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'TraversalContext')) + var.get(u"this").put(u'queue', var.get(u"null")) + var.get(u"this").put(u'parentPath', var.get(u'parentPath')) + var.get(u"this").put(u'scope', var.get(u'scope')) + var.get(u"this").put(u'state', var.get(u'state')) + var.get(u"this").put(u'opts', var.get(u'opts')) + PyJsHoisted_TraversalContext_.func_name = u'TraversalContext' + var.put(u'TraversalContext', PyJsHoisted_TraversalContext_) + pass + @Js + def PyJs_shouldVisit_1886_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'shouldVisit':PyJs_shouldVisit_1886_}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'key', u'keys', u'_i', u'_ref', u'opts']) + var.put(u'opts', var.get(u"this").get(u'opts')) + if (var.get(u'opts').get(u'enter') or var.get(u'opts').get(u'exit')): + return var.get(u'true') + if var.get(u'opts').get(var.get(u'node').get(u'type')): + return var.get(u'true') + var.put(u'keys', var.get(u't').get(u'VISITOR_KEYS').get(var.get(u'node').get(u'type'))) + if (var.get(u'keys').neg() or var.get(u'keys').get(u'length').neg()): + return Js(False) + #for JS loop + var.put(u'_iterator', var.get(u'keys')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'key', var.get(u'_ref')) + if var.get(u'node').get(var.get(u'key')): + return var.get(u'true') + + return Js(False) + PyJs_shouldVisit_1886_._set_name(u'shouldVisit') + var.get(u'TraversalContext').get(u'prototype').put(u'shouldVisit', PyJs_shouldVisit_1886_) + @Js + def PyJs_create_1887_(node, obj, key, listKey, this, arguments, var=var): + var = Scope({u'node':node, u'obj':obj, u'arguments':arguments, u'key':key, u'this':this, u'listKey':listKey, u'create':PyJs_create_1887_}, var) + var.registers([u'node', u'listKey', u'obj', u'key']) + PyJs_Object_1888_ = Js({u'parentPath':var.get(u"this").get(u'parentPath'),u'parent':var.get(u'node'),u'container':var.get(u'obj'),u'key':var.get(u'key'),u'listKey':var.get(u'listKey')}) + return var.get(u'_path3').get(u'default').callprop(u'get', PyJs_Object_1888_) + PyJs_create_1887_._set_name(u'create') + var.get(u'TraversalContext').get(u'prototype').put(u'create', PyJs_create_1887_) + @Js + def PyJs_maybeQueue_1889_(path, notPriority, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'maybeQueue':PyJs_maybeQueue_1889_, u'notPriority':notPriority, u'arguments':arguments}, var) + var.registers([u'path', u'notPriority']) + if var.get(u"this").get(u'trap'): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Infinite cycle detected'))) + raise PyJsTempException + if var.get(u"this").get(u'queue'): + if var.get(u'notPriority'): + var.get(u"this").get(u'queue').callprop(u'push', var.get(u'path')) + else: + var.get(u"this").get(u'priorityQueue').callprop(u'push', var.get(u'path')) + PyJs_maybeQueue_1889_._set_name(u'maybeQueue') + var.get(u'TraversalContext').get(u'prototype').put(u'maybeQueue', PyJs_maybeQueue_1889_) + @Js + def PyJs_visitMultiple_1890_(container, parent, listKey, this, arguments, var=var): + var = Scope({u'visitMultiple':PyJs_visitMultiple_1890_, u'container':container, u'parent':parent, u'this':this, u'listKey':listKey, u'arguments':arguments}, var) + var.registers([u'node', u'container', u'parent', u'listKey', u'queue', u'key']) + if PyJsStrictEq(var.get(u'container').get(u'length'),Js(0.0)): + return Js(False) + var.put(u'queue', Js([])) + #for JS loop + var.put(u'key', Js(0.0)) + while (var.get(u'key')<var.get(u'container').get(u'length')): + try: + var.put(u'node', var.get(u'container').get(var.get(u'key'))) + if (var.get(u'node') and var.get(u"this").callprop(u'shouldVisit', var.get(u'node'))): + var.get(u'queue').callprop(u'push', var.get(u"this").callprop(u'create', var.get(u'parent'), var.get(u'container'), var.get(u'key'), var.get(u'listKey'))) + finally: + (var.put(u'key',Js(var.get(u'key').to_number())+Js(1))-Js(1)) + return var.get(u"this").callprop(u'visitQueue', var.get(u'queue')) + PyJs_visitMultiple_1890_._set_name(u'visitMultiple') + var.get(u'TraversalContext').get(u'prototype').put(u'visitMultiple', PyJs_visitMultiple_1890_) + @Js + def PyJs_visitSingle_1891_(node, key, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'visitSingle':PyJs_visitSingle_1891_, u'arguments':arguments, u'key':key}, var) + var.registers([u'node', u'key']) + if var.get(u"this").callprop(u'shouldVisit', var.get(u'node').get(var.get(u'key'))): + return var.get(u"this").callprop(u'visitQueue', Js([var.get(u"this").callprop(u'create', var.get(u'node'), var.get(u'node'), var.get(u'key'))])) + else: + return Js(False) + PyJs_visitSingle_1891_._set_name(u'visitSingle') + var.get(u'TraversalContext').get(u'prototype').put(u'visitSingle', PyJs_visitSingle_1891_) + @Js + def PyJs_visitQueue_1892_(queue, this, arguments, var=var): + var = Scope({u'queue':queue, u'this':this, u'visitQueue':PyJs_visitQueue_1892_, u'arguments':arguments}, var) + var.registers([u'_isArray3', u'_isArray2', u'_i3', u'stop', u'_ref2', u'_i2', u'queue', u'path', u'visited', u'_path', u'_ref3', u'_iterator3', u'_iterator2']) + var.get(u"this").put(u'queue', var.get(u'queue')) + var.get(u"this").put(u'priorityQueue', Js([])) + var.put(u'visited', Js([])) + var.put(u'stop', Js(False)) + #for JS loop + var.put(u'_iterator2', var.get(u'queue')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'path', var.get(u'_ref2')) + var.get(u'path').callprop(u'resync') + if (PyJsStrictEq(var.get(u'path').get(u'contexts').get(u'length'),Js(0.0)) or PyJsStrictNeq(var.get(u'path').get(u'contexts').get((var.get(u'path').get(u'contexts').get(u'length')-Js(1.0))),var.get(u"this"))): + var.get(u'path').callprop(u'pushContext', var.get(u"this")) + if PyJsStrictEq(var.get(u'path').get(u'key'),var.get(u"null")): + continue + if (var.get(u'testing') and (var.get(u'queue').get(u'length')>=Js(10000.0))): + var.get(u"this").put(u'trap', var.get(u'true')) + if (var.get(u'visited').callprop(u'indexOf', var.get(u'path').get(u'node'))>=Js(0.0)): + continue + var.get(u'visited').callprop(u'push', var.get(u'path').get(u'node')) + if var.get(u'path').callprop(u'visit'): + var.put(u'stop', var.get(u'true')) + break + if var.get(u"this").get(u'priorityQueue').get(u'length'): + var.put(u'stop', var.get(u"this").callprop(u'visitQueue', var.get(u"this").get(u'priorityQueue'))) + var.get(u"this").put(u'priorityQueue', Js([])) + var.get(u"this").put(u'queue', var.get(u'queue')) + if var.get(u'stop'): + break + + #for JS loop + var.put(u'_iterator3', var.get(u'queue')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'_path', var.get(u'_ref3')) + var.get(u'_path').callprop(u'popContext') + + var.get(u"this").put(u'queue', var.get(u"null")) + return var.get(u'stop') + PyJs_visitQueue_1892_._set_name(u'visitQueue') + var.get(u'TraversalContext').get(u'prototype').put(u'visitQueue', PyJs_visitQueue_1892_) + @Js + def PyJs_visit_1893_(node, key, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'visit':PyJs_visit_1893_, u'arguments':arguments, u'key':key}, var) + var.registers([u'node', u'nodes', u'key']) + var.put(u'nodes', var.get(u'node').get(var.get(u'key'))) + if var.get(u'nodes').neg(): + return Js(False) + if var.get(u'Array').callprop(u'isArray', var.get(u'nodes')): + return var.get(u"this").callprop(u'visitMultiple', var.get(u'nodes'), var.get(u'node'), var.get(u'key')) + else: + return var.get(u"this").callprop(u'visitSingle', var.get(u'node'), var.get(u'key')) + PyJs_visit_1893_._set_name(u'visit') + var.get(u'TraversalContext').get(u'prototype').put(u'visit', PyJs_visit_1893_) + return var.get(u'TraversalContext') + PyJs_anonymous_1885_._set_name(u'anonymous') + var.put(u'TraversalContext', PyJs_anonymous_1885_()) + var.get(u'exports').put(u'default', var.get(u'TraversalContext')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) + PyJs_anonymous_1882_._set_name(u'anonymous') + PyJs_anonymous_1882_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_1881_._set_name(u'anonymous') +PyJs_Object_1894_ = Js({u'./path':Js(232.0),u'_process':Js(531.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1895_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'Hub', u'require', u'module', u'_interopRequireDefault', u'_classCallCheck3', u'_classCallCheck2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1896_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1896_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + pass + @Js + def PyJs_Hub_1897_(file, options, this, arguments, var=var): + var = Scope({u'this':this, u'Hub':PyJs_Hub_1897_, u'options':options, u'file':file, u'arguments':arguments}, var) + var.registers([u'options', u'file']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Hub')) + var.get(u"this").put(u'file', var.get(u'file')) + var.get(u"this").put(u'options', var.get(u'options')) + PyJs_Hub_1897_._set_name(u'Hub') + var.put(u'Hub', PyJs_Hub_1897_) + var.get(u'exports').put(u'default', var.get(u'Hub')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1895_._set_name(u'anonymous') +PyJs_Object_1898_ = Js({u'babel-runtime/helpers/classCallCheck':Js(110.0)}) +@Js +def PyJs_anonymous_1899_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'traverse', u'_context', u'_scope', u'module', u'_hub', u'_interopRequireDefault', u'_cache', u'_getIterator2', u'_getIterator3', u'_context2', u'_visitors', u'cache', u'hasBlacklistedType', u'_babelMessages', u'exports', u'_interopRequireWildcard', u'_babelTypes', u'_includes2', u'visitors', u'_includes', u'require', u'messages', u't', u'_path']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1907_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1907_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_traverse_(parent, opts, scope, state, parentPath, this, arguments, var=var): + var = Scope({u'state':state, u'arguments':arguments, u'parent':parent, u'parentPath':parentPath, u'this':this, u'scope':scope, u'opts':opts}, var) + var.registers([u'scope', u'state', u'opts', u'parent', u'parentPath']) + if var.get(u'parent').neg(): + return var.get('undefined') + if var.get(u'opts').neg(): + PyJs_Object_1908_ = Js({}) + var.put(u'opts', PyJs_Object_1908_) + if (var.get(u'opts').get(u'noScope').neg() and var.get(u'scope').neg()): + if (PyJsStrictNeq(var.get(u'parent').get(u'type'),Js(u'Program')) and PyJsStrictNeq(var.get(u'parent').get(u'type'),Js(u'File'))): + PyJsTempException = JsToPyException(var.get(u'Error').create(var.get(u'messages').callprop(u'get', Js(u'traverseNeedsParent'), var.get(u'parent').get(u'type')))) + raise PyJsTempException + var.get(u'visitors').callprop(u'explode', var.get(u'opts')) + var.get(u'traverse').callprop(u'node', var.get(u'parent'), var.get(u'opts'), var.get(u'scope'), var.get(u'state'), var.get(u'parentPath')) + PyJsHoisted_traverse_.func_name = u'traverse' + var.put(u'traverse', PyJsHoisted_traverse_) + @Js + def PyJsHoisted_hasBlacklistedType_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if PyJsStrictEq(var.get(u'path').get(u'node').get(u'type'),var.get(u'state').get(u'type')): + var.get(u'state').put(u'has', var.get(u'true')) + var.get(u'path').callprop(u'stop') + PyJsHoisted_hasBlacklistedType_.func_name = u'hasBlacklistedType' + var.put(u'hasBlacklistedType', PyJsHoisted_hasBlacklistedType_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1906_ = Js({}) + var.put(u'newObj', PyJs_Object_1906_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'visitors', var.get(u'exports').put(u'Hub', var.get(u'exports').put(u'Scope', var.get(u'exports').put(u'NodePath', var.get(u'undefined'))))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_path', var.get(u'require')(Js(u'./path'))) + @Js + def PyJs_get_1901_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_1901_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_path')).get(u'default') + PyJs_get_1901_._set_name(u'get') + PyJs_Object_1900_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_1901_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'NodePath'), PyJs_Object_1900_) + var.put(u'_scope', var.get(u'require')(Js(u'./scope'))) + @Js + def PyJs_get_1903_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_1903_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_scope')).get(u'default') + PyJs_get_1903_._set_name(u'get') + PyJs_Object_1902_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_1903_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'Scope'), PyJs_Object_1902_) + var.put(u'_hub', var.get(u'require')(Js(u'./hub'))) + @Js + def PyJs_get_1905_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_1905_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_hub')).get(u'default') + PyJs_get_1905_._set_name(u'get') + PyJs_Object_1904_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_1905_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'Hub'), PyJs_Object_1904_) + var.get(u'exports').put(u'default', var.get(u'traverse')) + var.put(u'_context', var.get(u'require')(Js(u'./context'))) + var.put(u'_context2', var.get(u'_interopRequireDefault')(var.get(u'_context'))) + var.put(u'_visitors', var.get(u'require')(Js(u'./visitors'))) + var.put(u'visitors', var.get(u'_interopRequireWildcard')(var.get(u'_visitors'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_includes', var.get(u'require')(Js(u'lodash/includes'))) + var.put(u'_includes2', var.get(u'_interopRequireDefault')(var.get(u'_includes'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_cache', var.get(u'require')(Js(u'./cache'))) + var.put(u'cache', var.get(u'_interopRequireWildcard')(var.get(u'_cache'))) + pass + pass + var.get(u'exports').put(u'visitors', var.get(u'visitors')) + pass + var.get(u'traverse').put(u'visitors', var.get(u'visitors')) + var.get(u'traverse').put(u'verify', var.get(u'visitors').get(u'verify')) + var.get(u'traverse').put(u'explode', var.get(u'visitors').get(u'explode')) + var.get(u'traverse').put(u'NodePath', var.get(u'require')(Js(u'./path'))) + var.get(u'traverse').put(u'Scope', var.get(u'require')(Js(u'./scope'))) + var.get(u'traverse').put(u'Hub', var.get(u'require')(Js(u'./hub'))) + @Js + def PyJs_anonymous_1909_(node, enter, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'enter':enter}, var) + var.registers([u'node', u'enter']) + return var.get(u't').callprop(u'traverseFast', var.get(u'node'), var.get(u'enter')) + PyJs_anonymous_1909_._set_name(u'anonymous') + var.get(u'traverse').put(u'cheap', PyJs_anonymous_1909_) + @Js + def PyJs_anonymous_1910_(node, opts, scope, state, parentPath, skipKeys, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'state':state, u'skipKeys':skipKeys, u'parentPath':parentPath, u'scope':scope, u'opts':opts, u'arguments':arguments}, var) + var.registers([u'key', u'node', u'_isArray', u'_iterator', u'context', u'keys', u'state', u'skipKeys', u'_i', u'parentPath', u'scope', u'_ref', u'opts']) + var.put(u'keys', var.get(u't').get(u'VISITOR_KEYS').get(var.get(u'node').get(u'type'))) + if var.get(u'keys').neg(): + return var.get('undefined') + var.put(u'context', var.get(u'_context2').get(u'default').create(var.get(u'scope'), var.get(u'opts'), var.get(u'state'), var.get(u'parentPath'))) + #for JS loop + var.put(u'_iterator', var.get(u'keys')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'key', var.get(u'_ref')) + if (var.get(u'skipKeys') and var.get(u'skipKeys').get(var.get(u'key'))): + continue + if var.get(u'context').callprop(u'visit', var.get(u'node'), var.get(u'key')): + return var.get('undefined') + + PyJs_anonymous_1910_._set_name(u'anonymous') + var.get(u'traverse').put(u'node', PyJs_anonymous_1910_) + @Js + def PyJs_anonymous_1911_(node, opts, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'node', u'opts']) + var.get(u't').callprop(u'removeProperties', var.get(u'node'), var.get(u'opts')) + var.get(u'cache').get(u'path').callprop(u'delete', var.get(u'node')) + PyJs_anonymous_1911_._set_name(u'anonymous') + var.get(u'traverse').put(u'clearNode', PyJs_anonymous_1911_) + @Js + def PyJs_anonymous_1912_(tree, opts, this, arguments, var=var): + var = Scope({u'this':this, u'tree':tree, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'tree', u'opts']) + var.get(u't').callprop(u'traverseFast', var.get(u'tree'), var.get(u'traverse').get(u'clearNode'), var.get(u'opts')) + return var.get(u'tree') + PyJs_anonymous_1912_._set_name(u'anonymous') + var.get(u'traverse').put(u'removeProperties', PyJs_anonymous_1912_) + pass + @Js + def PyJs_anonymous_1913_(tree, scope, type, blacklistTypes, this, arguments, var=var): + var = Scope({u'arguments':arguments, u'type':type, u'this':this, u'scope':scope, u'tree':tree, u'blacklistTypes':blacklistTypes}, var) + var.registers([u'scope', u'state', u'tree', u'blacklistTypes', u'type']) + if PyJsComma(Js(0.0),var.get(u'_includes2').get(u'default'))(var.get(u'blacklistTypes'), var.get(u'tree').get(u'type')): + return Js(False) + if PyJsStrictEq(var.get(u'tree').get(u'type'),var.get(u'type')): + return var.get(u'true') + PyJs_Object_1914_ = Js({u'has':Js(False),u'type':var.get(u'type')}) + var.put(u'state', PyJs_Object_1914_) + PyJs_Object_1915_ = Js({u'blacklist':var.get(u'blacklistTypes'),u'enter':var.get(u'hasBlacklistedType')}) + var.get(u'traverse')(var.get(u'tree'), PyJs_Object_1915_, var.get(u'scope'), var.get(u'state')) + return var.get(u'state').get(u'has') + PyJs_anonymous_1913_._set_name(u'anonymous') + var.get(u'traverse').put(u'hasType', PyJs_anonymous_1913_) + @Js + def PyJs_anonymous_1916_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'cache').callprop(u'clear') + PyJs_anonymous_1916_._set_name(u'anonymous') + var.get(u'traverse').put(u'clearCache', PyJs_anonymous_1916_) + @Js + def PyJs_anonymous_1917_(source, destination, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'destination':destination, u'arguments':arguments}, var) + var.registers([u'source', u'destination']) + if var.get(u'cache').get(u'path').callprop(u'has', var.get(u'source')): + var.get(u'cache').get(u'path').callprop(u'set', var.get(u'destination'), var.get(u'cache').get(u'path').callprop(u'get', var.get(u'source'))) + PyJs_anonymous_1917_._set_name(u'anonymous') + var.get(u'traverse').put(u'copyCache', PyJs_anonymous_1917_) +PyJs_anonymous_1899_._set_name(u'anonymous') +PyJs_Object_1918_ = Js({u'./cache':Js(222.0),u'./context':Js(223.0),u'./hub':Js(224.0),u'./path':Js(232.0),u'./scope':Js(244.0),u'./visitors':Js(246.0),u'babel-messages':Js(57.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0),u'lodash/includes':Js(456.0)}) +@Js +def PyJs_anonymous_1919_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'findParent', u'_interopRequireWildcard', u'_index', u'require', u'_babelTypes', u'getAncestry', u'inShadow', u'module', u'inType', u'getStatementParent', u'getEarliestCommonAncestorFrom', u't', u'_index2', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'find', u'getDeepestCommonAncestorFrom', u'getFunctionParent']) + @Js + def PyJsHoisted_inType_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_isArray3', u'_ref3', u'_i3', u'path', u'type', u'_iterator3']) + var.put(u'path', var.get(u"this")) + while var.get(u'path'): + #for JS loop + var.put(u'_iterator3', var.get(u'arguments')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'type', var.get(u'_ref3')) + if PyJsStrictEq(var.get(u'path').get(u'node').get(u'type'),var.get(u'type')): + return var.get(u'true') + + var.put(u'path', var.get(u'path').get(u'parentPath')) + return Js(False) + PyJsHoisted_inType_.func_name = u'inType' + var.put(u'inType', PyJsHoisted_inType_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1920_ = Js({}) + var.put(u'newObj', PyJs_Object_1920_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_findParent_(callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'arguments':arguments}, var) + var.registers([u'path', u'callback']) + var.put(u'path', var.get(u"this")) + while var.put(u'path', var.get(u'path').get(u'parentPath')): + if var.get(u'callback')(var.get(u'path')): + return var.get(u'path') + return var.get(u"null") + PyJsHoisted_findParent_.func_name = u'findParent' + var.put(u'findParent', PyJsHoisted_findParent_) + @Js + def PyJsHoisted_getAncestry_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'path', u'paths']) + var.put(u'path', var.get(u"this")) + var.put(u'paths', Js([])) + while 1: + var.get(u'paths').callprop(u'push', var.get(u'path')) + if not var.put(u'path', var.get(u'path').get(u'parentPath')): + break + return var.get(u'paths') + PyJsHoisted_getAncestry_.func_name = u'getAncestry' + var.put(u'getAncestry', PyJsHoisted_getAncestry_) + @Js + def PyJsHoisted_getStatementParent_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'path']) + var.put(u'path', var.get(u"this")) + while 1: + if var.get(u'Array').callprop(u'isArray', var.get(u'path').get(u'container')): + return var.get(u'path') + if not var.put(u'path', var.get(u'path').get(u'parentPath')): + break + PyJsHoisted_getStatementParent_.func_name = u'getStatementParent' + var.put(u'getStatementParent', PyJsHoisted_getStatementParent_) + @Js + def PyJsHoisted_getEarliestCommonAncestorFrom_(paths, this, arguments, var=var): + var = Scope({u'this':this, u'paths':paths, u'arguments':arguments}, var) + var.registers([u'paths']) + @Js + def PyJs_anonymous_1923_(deepest, i, ancestries, this, arguments, var=var): + var = Scope({u'i':i, u'this':this, u'deepest':deepest, u'arguments':arguments, u'ancestries':ancestries}, var) + var.registers([u'_isArray', u'_iterator', u'keys', u'i', u'ancestry', u'earliestKeyIndex', u'deepest', u'_i', u'currentKeyIndex', u'path', u'_ref', u'earliest', u'ancestries']) + var.put(u'earliest', PyJsComma(Js(0.0), Js(None))) + var.put(u'keys', var.get(u't').get(u'VISITOR_KEYS').get(var.get(u'deepest').get(u'type'))) + #for JS loop + var.put(u'_iterator', var.get(u'ancestries')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'ancestry', var.get(u'_ref')) + var.put(u'path', var.get(u'ancestry').get((var.get(u'i')+Js(1.0)))) + if var.get(u'earliest').neg(): + var.put(u'earliest', var.get(u'path')) + continue + if (var.get(u'path').get(u'listKey') and PyJsStrictEq(var.get(u'earliest').get(u'listKey'),var.get(u'path').get(u'listKey'))): + if (var.get(u'path').get(u'key')<var.get(u'earliest').get(u'key')): + var.put(u'earliest', var.get(u'path')) + continue + var.put(u'earliestKeyIndex', var.get(u'keys').callprop(u'indexOf', var.get(u'earliest').get(u'parentKey'))) + var.put(u'currentKeyIndex', var.get(u'keys').callprop(u'indexOf', var.get(u'path').get(u'parentKey'))) + if (var.get(u'earliestKeyIndex')>var.get(u'currentKeyIndex')): + var.put(u'earliest', var.get(u'path')) + + return var.get(u'earliest') + PyJs_anonymous_1923_._set_name(u'anonymous') + return var.get(u"this").callprop(u'getDeepestCommonAncestorFrom', var.get(u'paths'), PyJs_anonymous_1923_) + PyJsHoisted_getEarliestCommonAncestorFrom_.func_name = u'getEarliestCommonAncestorFrom' + var.put(u'getEarliestCommonAncestorFrom', PyJsHoisted_getEarliestCommonAncestorFrom_) + @Js + def PyJsHoisted_getFunctionParent_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_anonymous_1922_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u'path').callprop(u'isFunction') or var.get(u'path').callprop(u'isProgram')) + PyJs_anonymous_1922_._set_name(u'anonymous') + return var.get(u"this").callprop(u'findParent', PyJs_anonymous_1922_) + PyJsHoisted_getFunctionParent_.func_name = u'getFunctionParent' + var.put(u'getFunctionParent', PyJsHoisted_getFunctionParent_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1921_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1921_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_find_(callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'arguments':arguments}, var) + var.registers([u'path', u'callback']) + var.put(u'path', var.get(u"this")) + while 1: + if var.get(u'callback')(var.get(u'path')): + return var.get(u'path') + if not var.put(u'path', var.get(u'path').get(u'parentPath')): + break + return var.get(u"null") + PyJsHoisted_find_.func_name = u'find' + var.put(u'find', PyJsHoisted_find_) + @Js + def PyJsHoisted_getDeepestCommonAncestorFrom_(paths, filter, this, arguments, var=var): + var = Scope({u'filter':filter, u'paths':paths, u'this':this, u'arguments':arguments}, var) + var.registers([u'paths', u'minDepth', u'_isArray2', u'_this', u'i', u'lastCommonIndex', u'_i2', u'_ref2', u'filter', u'ancestry', u'ancestries', u'lastCommon', u'shouldMatch', u'_iterator2', u'first']) + var.put(u'_this', var.get(u"this")) + if var.get(u'paths').get(u'length').neg(): + return var.get(u"this") + if PyJsStrictEq(var.get(u'paths').get(u'length'),Js(1.0)): + return var.get(u'paths').get(u'0') + var.put(u'minDepth', var.get(u'Infinity')) + var.put(u'lastCommonIndex', PyJsComma(Js(0.0), Js(None))) + var.put(u'lastCommon', PyJsComma(Js(0.0), Js(None))) + @Js + def PyJs_anonymous_1924_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path', u'ancestry']) + var.put(u'ancestry', Js([])) + while 1: + var.get(u'ancestry').callprop(u'unshift', var.get(u'path')) + if not (var.put(u'path', var.get(u'path').get(u'parentPath')) and PyJsStrictNeq(var.get(u'path'),var.get(u'_this'))): + break + if (var.get(u'ancestry').get(u'length')<var.get(u'minDepth')): + var.put(u'minDepth', var.get(u'ancestry').get(u'length')) + return var.get(u'ancestry') + PyJs_anonymous_1924_._set_name(u'anonymous') + var.put(u'ancestries', var.get(u'paths').callprop(u'map', PyJs_anonymous_1924_)) + var.put(u'first', var.get(u'ancestries').get(u'0')) + class JS_CONTINUE_LABEL_64657074684c6f6f70(Exception): pass + class JS_BREAK_LABEL_64657074684c6f6f70(Exception): pass + try: + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'minDepth')): + try: + try: + var.put(u'shouldMatch', var.get(u'first').get(var.get(u'i'))) + #for JS loop + var.put(u'_iterator2', var.get(u'ancestries')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'ancestry', var.get(u'_ref2')) + if PyJsStrictNeq(var.get(u'ancestry').get(var.get(u'i')),var.get(u'shouldMatch')): + raise JS_BREAK_LABEL_64657074684c6f6f70("Breaked") + + var.put(u'lastCommonIndex', var.get(u'i')) + var.put(u'lastCommon', var.get(u'shouldMatch')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + except JS_CONTINUE_LABEL_64657074684c6f6f70: + pass + except JS_BREAK_LABEL_64657074684c6f6f70: + pass + if var.get(u'lastCommon'): + if var.get(u'filter'): + return var.get(u'filter')(var.get(u'lastCommon'), var.get(u'lastCommonIndex'), var.get(u'ancestries')) + else: + return var.get(u'lastCommon') + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"Couldn't find intersection"))) + raise PyJsTempException + PyJsHoisted_getDeepestCommonAncestorFrom_.func_name = u'getDeepestCommonAncestorFrom' + var.put(u'getDeepestCommonAncestorFrom', PyJsHoisted_getDeepestCommonAncestorFrom_) + @Js + def PyJsHoisted_inShadow_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'shadow', u'parentFn', u'key']) + @Js + def PyJs_anonymous_1925_(p, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments}, var) + var.registers([u'p']) + return var.get(u'p').callprop(u'isFunction') + PyJs_anonymous_1925_._set_name(u'anonymous') + var.put(u'parentFn', (var.get(u"this") if var.get(u"this").callprop(u'isFunction') else var.get(u"this").callprop(u'findParent', PyJs_anonymous_1925_))) + if var.get(u'parentFn').neg(): + return var.get('undefined') + if (var.get(u'parentFn').callprop(u'isFunctionExpression') or var.get(u'parentFn').callprop(u'isFunctionDeclaration')): + var.put(u'shadow', var.get(u'parentFn').get(u'node').get(u'shadow')) + if (var.get(u'shadow') and (var.get(u'key').neg() or PyJsStrictNeq(var.get(u'shadow').get(var.get(u'key')),Js(False)))): + return var.get(u'parentFn') + else: + if var.get(u'parentFn').callprop(u'isArrowFunctionExpression'): + return var.get(u'parentFn') + return var.get(u"null") + PyJsHoisted_inShadow_.func_name = u'inShadow' + var.put(u'inShadow', PyJsHoisted_inShadow_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'findParent', var.get(u'findParent')) + var.get(u'exports').put(u'find', var.get(u'find')) + var.get(u'exports').put(u'getFunctionParent', var.get(u'getFunctionParent')) + var.get(u'exports').put(u'getStatementParent', var.get(u'getStatementParent')) + var.get(u'exports').put(u'getEarliestCommonAncestorFrom', var.get(u'getEarliestCommonAncestorFrom')) + var.get(u'exports').put(u'getDeepestCommonAncestorFrom', var.get(u'getDeepestCommonAncestorFrom')) + var.get(u'exports').put(u'getAncestry', var.get(u'getAncestry')) + var.get(u'exports').put(u'inType', var.get(u'inType')) + var.get(u'exports').put(u'inShadow', var.get(u'inShadow')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_1919_._set_name(u'anonymous') +PyJs_Object_1926_ = Js({u'./index':Js(232.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1927_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'addComments', u'module', u'shareCommentsWithSiblings', u'addComment']) + @Js + def PyJsHoisted_addComments_(type, comments, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'comments':comments}, var) + var.registers([u'node', u'type', u'comments', u'key']) + if var.get(u'comments').neg(): + return var.get('undefined') + var.put(u'node', var.get(u"this").get(u'node')) + if var.get(u'node').neg(): + return var.get('undefined') + var.put(u'key', (var.get(u'type')+Js(u'Comments'))) + if var.get(u'node').get(var.get(u'key')): + var.get(u'node').put(var.get(u'key'), var.get(u'node').get(var.get(u'key')).callprop(u'concat', var.get(u'comments'))) + else: + var.get(u'node').put(var.get(u'key'), var.get(u'comments')) + PyJsHoisted_addComments_.func_name = u'addComments' + var.put(u'addComments', PyJsHoisted_addComments_) + @Js + def PyJsHoisted_addComment_(type, content, line, this, arguments, var=var): + var = Scope({u'content':content, u'this':this, u'line':line, u'type':type, u'arguments':arguments}, var) + var.registers([u'content', u'line', u'type']) + PyJs_Object_1928_ = Js({u'type':(Js(u'CommentLine') if var.get(u'line') else Js(u'CommentBlock')),u'value':var.get(u'content')}) + var.get(u"this").callprop(u'addComments', var.get(u'type'), Js([PyJs_Object_1928_])) + PyJsHoisted_addComment_.func_name = u'addComment' + var.put(u'addComment', PyJsHoisted_addComment_) + @Js + def PyJsHoisted_shareCommentsWithSiblings_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'leading', u'prev', u'trailing', u'next']) + var.put(u'node', var.get(u"this").get(u'node')) + if var.get(u'node').neg(): + return var.get('undefined') + var.put(u'trailing', var.get(u'node').get(u'trailingComments')) + var.put(u'leading', var.get(u'node').get(u'leadingComments')) + if (var.get(u'trailing').neg() and var.get(u'leading').neg()): + return var.get('undefined') + var.put(u'prev', var.get(u"this").callprop(u'getSibling', (var.get(u"this").get(u'key')-Js(1.0)))) + var.put(u'next', var.get(u"this").callprop(u'getSibling', (var.get(u"this").get(u'key')+Js(1.0)))) + if var.get(u'prev').get(u'node').neg(): + var.put(u'prev', var.get(u'next')) + if var.get(u'next').get(u'node').neg(): + var.put(u'next', var.get(u'prev')) + var.get(u'prev').callprop(u'addComments', Js(u'trailing'), var.get(u'leading')) + var.get(u'next').callprop(u'addComments', Js(u'leading'), var.get(u'trailing')) + PyJsHoisted_shareCommentsWithSiblings_.func_name = u'shareCommentsWithSiblings' + var.put(u'shareCommentsWithSiblings', PyJsHoisted_shareCommentsWithSiblings_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'shareCommentsWithSiblings', var.get(u'shareCommentsWithSiblings')) + var.get(u'exports').put(u'addComment', var.get(u'addComment')) + var.get(u'exports').put(u'addComments', var.get(u'addComments')) + pass + pass + pass +PyJs_anonymous_1927_._set_name(u'anonymous') +PyJs_Object_1929_ = Js({}) +@Js +def PyJs_anonymous_1930_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_getQueueContexts', u'pushContext', u'skip', u'module', u'resync', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'skipKey', u'_call', u'popContext', u'visit', u'setKey', u'call', u'exports', u'_resyncParent', u'_resyncRemoved', u'isBlacklisted', u'stop', u'_resyncList', u'_resyncKey', u'_index2', u'setContext', u'_index', u'setup', u'setScope', u'requeue', u'require']) + @Js + def PyJsHoisted_popContext_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").get(u'contexts').callprop(u'pop') + var.get(u"this").callprop(u'setContext', var.get(u"this").get(u'contexts').get((var.get(u"this").get(u'contexts').get(u'length')-Js(1.0)))) + PyJsHoisted_popContext_.func_name = u'popContext' + var.put(u'popContext', PyJsHoisted_popContext_) + @Js + def PyJsHoisted_setup_(parentPath, container, listKey, key, this, arguments, var=var): + var = Scope({u'container':container, u'arguments':arguments, u'key':key, u'parentPath':parentPath, u'this':this, u'listKey':listKey}, var) + var.registers([u'listKey', u'container', u'key', u'parentPath']) + var.get(u"this").put(u'inList', var.get(u'listKey').neg().neg()) + var.get(u"this").put(u'listKey', var.get(u'listKey')) + var.get(u"this").put(u'parentKey', (var.get(u'listKey') or var.get(u'key'))) + var.get(u"this").put(u'container', var.get(u'container')) + var.get(u"this").put(u'parentPath', (var.get(u'parentPath') or var.get(u"this").get(u'parentPath'))) + var.get(u"this").callprop(u'setKey', var.get(u'key')) + PyJsHoisted_setup_.func_name = u'setup' + var.put(u'setup', PyJsHoisted_setup_) + @Js + def PyJsHoisted_requeue_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_isArray2', u'contexts', u'_i2', u'_ref2', u'context', u'pathToQueue', u'_iterator2']) + var.put(u'pathToQueue', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else var.get(u"this"))) + if var.get(u'pathToQueue').get(u'removed'): + return var.get('undefined') + var.put(u'contexts', var.get(u"this").get(u'contexts')) + #for JS loop + var.put(u'_iterator2', var.get(u'contexts')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'context', var.get(u'_ref2')) + var.get(u'context').callprop(u'maybeQueue', var.get(u'pathToQueue')) + + PyJsHoisted_requeue_.func_name = u'requeue' + var.put(u'requeue', PyJsHoisted_requeue_) + @Js + def PyJsHoisted__resyncParent_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'parentPath'): + var.get(u"this").put(u'parent', var.get(u"this").get(u'parentPath').get(u'node')) + PyJsHoisted__resyncParent_.func_name = u'_resyncParent' + var.put(u'_resyncParent', PyJsHoisted__resyncParent_) + @Js + def PyJsHoisted__resyncRemoved_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if (((var.get(u"this").get(u'key')==var.get(u"null")) or var.get(u"this").get(u'container').neg()) or PyJsStrictNeq(var.get(u"this").get(u'container').get(var.get(u"this").get(u'key')),var.get(u"this").get(u'node'))): + var.get(u"this").callprop(u'_markRemoved') + PyJsHoisted__resyncRemoved_.func_name = u'_resyncRemoved' + var.put(u'_resyncRemoved', PyJsHoisted__resyncRemoved_) + @Js + def PyJsHoisted_skip_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'shouldSkip', var.get(u'true')) + PyJsHoisted_skip_.func_name = u'skip' + var.put(u'skip', PyJsHoisted_skip_) + @Js + def PyJsHoisted_resync_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'removed'): + return var.get('undefined') + var.get(u"this").callprop(u'_resyncParent') + var.get(u"this").callprop(u'_resyncList') + var.get(u"this").callprop(u'_resyncKey') + PyJsHoisted_resync_.func_name = u'resync' + var.put(u'resync', PyJsHoisted_resync_) + @Js + def PyJsHoisted_isBlacklisted_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'blacklist']) + var.put(u'blacklist', var.get(u"this").get(u'opts').get(u'blacklist')) + return (var.get(u'blacklist') and (var.get(u'blacklist').callprop(u'indexOf', var.get(u"this").get(u'node').get(u'type'))>(-Js(1.0)))) + PyJsHoisted_isBlacklisted_.func_name = u'isBlacklisted' + var.put(u'isBlacklisted', PyJsHoisted_isBlacklisted_) + @Js + def PyJsHoisted_visit_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'node').neg(): + return Js(False) + if var.get(u"this").callprop(u'isBlacklisted'): + return Js(False) + if (var.get(u"this").get(u'opts').get(u'shouldSkip') and var.get(u"this").get(u'opts').callprop(u'shouldSkip', var.get(u"this"))): + return Js(False) + if (var.get(u"this").callprop(u'call', Js(u'enter')) or var.get(u"this").get(u'shouldSkip')): + @Js + def PyJs_anonymous_1933_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(u'Skip...') + PyJs_anonymous_1933_._set_name(u'anonymous') + var.get(u"this").callprop(u'debug', PyJs_anonymous_1933_) + return var.get(u"this").get(u'shouldStop') + @Js + def PyJs_anonymous_1934_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(u'Recursing into...') + PyJs_anonymous_1934_._set_name(u'anonymous') + var.get(u"this").callprop(u'debug', PyJs_anonymous_1934_) + var.get(u'_index2').get(u'default').callprop(u'node', var.get(u"this").get(u'node'), var.get(u"this").get(u'opts'), var.get(u"this").get(u'scope'), var.get(u"this").get(u'state'), var.get(u"this"), var.get(u"this").get(u'skipKeys')) + var.get(u"this").callprop(u'call', Js(u'exit')) + return var.get(u"this").get(u'shouldStop') + PyJsHoisted_visit_.func_name = u'visit' + var.put(u'visit', PyJsHoisted_visit_) + @Js + def PyJsHoisted__resyncList_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'newContainer']) + if (var.get(u"this").get(u'parent').neg() or var.get(u"this").get(u'inList').neg()): + return var.get('undefined') + var.put(u'newContainer', var.get(u"this").get(u'parent').get(var.get(u"this").get(u'listKey'))) + if PyJsStrictEq(var.get(u"this").get(u'container'),var.get(u'newContainer')): + return var.get('undefined') + var.get(u"this").put(u'container', (var.get(u'newContainer') or var.get(u"null"))) + PyJsHoisted__resyncList_.func_name = u'_resyncList' + var.put(u'_resyncList', PyJsHoisted__resyncList_) + @Js + def PyJsHoisted_stop_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'shouldStop', var.get(u'true')) + var.get(u"this").put(u'shouldSkip', var.get(u'true')) + PyJsHoisted_stop_.func_name = u'stop' + var.put(u'stop', PyJsHoisted_stop_) + @Js + def PyJsHoisted__resyncKey_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'key']) + if var.get(u"this").get(u'container').neg(): + return var.get('undefined') + if PyJsStrictEq(var.get(u"this").get(u'node'),var.get(u"this").get(u'container').get(var.get(u"this").get(u'key'))): + return var.get('undefined') + if var.get(u'Array').callprop(u'isArray', var.get(u"this").get(u'container')): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u"this").get(u'container').get(u'length')): + try: + if PyJsStrictEq(var.get(u"this").get(u'container').get(var.get(u'i')),var.get(u"this").get(u'node')): + return var.get(u"this").callprop(u'setKey', var.get(u'i')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + else: + for PyJsTemp in var.get(u"this").get(u'container'): + var.put(u'key', PyJsTemp) + if PyJsStrictEq(var.get(u"this").get(u'container').get(var.get(u'key')),var.get(u"this").get(u'node')): + return var.get(u"this").callprop(u'setKey', var.get(u'key')) + var.get(u"this").put(u'key', var.get(u"null")) + PyJsHoisted__resyncKey_.func_name = u'_resyncKey' + var.put(u'_resyncKey', PyJsHoisted__resyncKey_) + @Js + def PyJsHoisted_setKey_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + var.get(u"this").put(u'key', var.get(u'key')) + var.get(u"this").put(u'node', var.get(u"this").get(u'container').get(var.get(u"this").get(u'key'))) + var.get(u"this").put(u'type', (var.get(u"this").get(u'node') and var.get(u"this").get(u'node').get(u'type'))) + PyJsHoisted_setKey_.func_name = u'setKey' + var.put(u'setKey', PyJsHoisted_setKey_) + @Js + def PyJsHoisted_call_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key', u'opts']) + var.put(u'opts', var.get(u"this").get(u'opts')) + @Js + def PyJs_anonymous_1932_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'key') + PyJs_anonymous_1932_._set_name(u'anonymous') + var.get(u"this").callprop(u'debug', PyJs_anonymous_1932_) + if var.get(u"this").get(u'node'): + if var.get(u"this").callprop(u'_call', var.get(u'opts').get(var.get(u'key'))): + return var.get(u'true') + if var.get(u"this").get(u'node'): + return var.get(u"this").callprop(u'_call', (var.get(u'opts').get(var.get(u"this").get(u'node').get(u'type')) and var.get(u'opts').get(var.get(u"this").get(u'node').get(u'type')).get(var.get(u'key')))) + return Js(False) + PyJsHoisted_call_.func_name = u'call' + var.put(u'call', PyJsHoisted_call_) + @Js + def PyJsHoisted_pushContext_(context, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'context':context}, var) + var.registers([u'context']) + var.get(u"this").get(u'contexts').callprop(u'push', var.get(u'context')) + var.get(u"this").callprop(u'setContext', var.get(u'context')) + PyJsHoisted_pushContext_.func_name = u'pushContext' + var.put(u'pushContext', PyJsHoisted_pushContext_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1931_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1931_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_setScope_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'path', u'target']) + if (var.get(u"this").get(u'opts') and var.get(u"this").get(u'opts').get(u'noScope')): + return var.get('undefined') + var.put(u'target', (var.get(u"this").get(u'context') and var.get(u"this").get(u'context').get(u'scope'))) + if var.get(u'target').neg(): + var.put(u'path', var.get(u"this").get(u'parentPath')) + while (var.get(u'path') and var.get(u'target').neg()): + if (var.get(u'path').get(u'opts') and var.get(u'path').get(u'opts').get(u'noScope')): + return var.get('undefined') + var.put(u'target', var.get(u'path').get(u'scope')) + var.put(u'path', var.get(u'path').get(u'parentPath')) + var.get(u"this").put(u'scope', var.get(u"this").callprop(u'getScope', var.get(u'target'))) + if var.get(u"this").get(u'scope'): + var.get(u"this").get(u'scope').callprop(u'init') + PyJsHoisted_setScope_.func_name = u'setScope' + var.put(u'setScope', PyJsHoisted_setScope_) + @Js + def PyJsHoisted_setContext_(context, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'context':context}, var) + var.registers([u'context']) + var.get(u"this").put(u'shouldSkip', Js(False)) + var.get(u"this").put(u'shouldStop', Js(False)) + var.get(u"this").put(u'removed', Js(False)) + PyJs_Object_1935_ = Js({}) + var.get(u"this").put(u'skipKeys', PyJs_Object_1935_) + if var.get(u'context'): + var.get(u"this").put(u'context', var.get(u'context')) + var.get(u"this").put(u'state', var.get(u'context').get(u'state')) + var.get(u"this").put(u'opts', var.get(u'context').get(u'opts')) + var.get(u"this").callprop(u'setScope') + return var.get(u"this") + PyJsHoisted_setContext_.func_name = u'setContext' + var.put(u'setContext', PyJsHoisted_setContext_) + @Js + def PyJsHoisted__getQueueContexts_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'contexts', u'path']) + var.put(u'path', var.get(u"this")) + var.put(u'contexts', var.get(u"this").get(u'contexts')) + while var.get(u'contexts').get(u'length').neg(): + var.put(u'path', var.get(u'path').get(u'parentPath')) + var.put(u'contexts', var.get(u'path').get(u'contexts')) + return var.get(u'contexts') + PyJsHoisted__getQueueContexts_.func_name = u'_getQueueContexts' + var.put(u'_getQueueContexts', PyJsHoisted__getQueueContexts_) + @Js + def PyJsHoisted_skipKey_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + var.get(u"this").get(u'skipKeys').put(var.get(u'key'), var.get(u'true')) + PyJsHoisted_skipKey_.func_name = u'skipKey' + var.put(u'skipKey', PyJsHoisted_skipKey_) + @Js + def PyJsHoisted__call_(fns, this, arguments, var=var): + var = Scope({u'this':this, u'fns':fns, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'ret', u'_i', u'fns', u'_ref', u'fn']) + if var.get(u'fns').neg(): + return Js(False) + #for JS loop + var.put(u'_iterator', var.get(u'fns')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'fn', var.get(u'_ref')) + if var.get(u'fn').neg(): + continue + var.put(u'node', var.get(u"this").get(u'node')) + if var.get(u'node').neg(): + return var.get(u'true') + var.put(u'ret', var.get(u'fn').callprop(u'call', var.get(u"this").get(u'state'), var.get(u"this"), var.get(u"this").get(u'state'))) + if var.get(u'ret'): + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'Unexpected return value from visitor method ')+var.get(u'fn')))) + raise PyJsTempException + if PyJsStrictNeq(var.get(u"this").get(u'node'),var.get(u'node')): + return var.get(u'true') + if ((var.get(u"this").get(u'shouldStop') or var.get(u"this").get(u'shouldSkip')) or var.get(u"this").get(u'removed')): + return var.get(u'true') + + return Js(False) + PyJsHoisted__call_.func_name = u'_call' + var.put(u'_call', PyJsHoisted__call_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'call', var.get(u'call')) + var.get(u'exports').put(u'_call', var.get(u'_call')) + var.get(u'exports').put(u'isBlacklisted', var.get(u'isBlacklisted')) + var.get(u'exports').put(u'visit', var.get(u'visit')) + var.get(u'exports').put(u'skip', var.get(u'skip')) + var.get(u'exports').put(u'skipKey', var.get(u'skipKey')) + var.get(u'exports').put(u'stop', var.get(u'stop')) + var.get(u'exports').put(u'setScope', var.get(u'setScope')) + var.get(u'exports').put(u'setContext', var.get(u'setContext')) + var.get(u'exports').put(u'resync', var.get(u'resync')) + var.get(u'exports').put(u'_resyncParent', var.get(u'_resyncParent')) + var.get(u'exports').put(u'_resyncKey', var.get(u'_resyncKey')) + var.get(u'exports').put(u'_resyncList', var.get(u'_resyncList')) + var.get(u'exports').put(u'_resyncRemoved', var.get(u'_resyncRemoved')) + var.get(u'exports').put(u'popContext', var.get(u'popContext')) + var.get(u'exports').put(u'pushContext', var.get(u'pushContext')) + var.get(u'exports').put(u'setup', var.get(u'setup')) + var.get(u'exports').put(u'setKey', var.get(u'setKey')) + var.get(u'exports').put(u'requeue', var.get(u'requeue')) + var.get(u'exports').put(u'_getQueueContexts', var.get(u'_getQueueContexts')) + var.put(u'_index', var.get(u'require')(Js(u'../index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_1930_._set_name(u'anonymous') +PyJs_Object_1936_ = Js({u'../index':Js(225.0),u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_1937_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'arrowFunctionToShadowed', u'_interopRequireWildcard', u'toComputedKey', u'_babelTypes', u'module', u't', u'ensureBlock', u'require']) + @Js + def PyJsHoisted_toComputedKey_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'key']) + var.put(u'node', var.get(u"this").get(u'node')) + var.put(u'key', PyJsComma(Js(0.0), Js(None))) + if var.get(u"this").callprop(u'isMemberExpression'): + var.put(u'key', var.get(u'node').get(u'property')) + else: + if (var.get(u"this").callprop(u'isProperty') or var.get(u"this").callprop(u'isMethod')): + var.put(u'key', var.get(u'node').get(u'key')) + else: + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create(Js(u'todo'))) + raise PyJsTempException + if var.get(u'node').get(u'computed').neg(): + if var.get(u't').callprop(u'isIdentifier', var.get(u'key')): + var.put(u'key', var.get(u't').callprop(u'stringLiteral', var.get(u'key').get(u'name'))) + return var.get(u'key') + PyJsHoisted_toComputedKey_.func_name = u'toComputedKey' + var.put(u'toComputedKey', PyJsHoisted_toComputedKey_) + @Js + def PyJsHoisted_arrowFunctionToShadowed_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'isArrowFunctionExpression').neg(): + return var.get('undefined') + var.get(u"this").callprop(u'ensureBlock') + var.put(u'node', var.get(u"this").get(u'node')) + var.get(u'node').put(u'expression', Js(False)) + var.get(u'node').put(u'type', Js(u'FunctionExpression')) + var.get(u'node').put(u'shadow', (var.get(u'node').get(u'shadow') or var.get(u'true'))) + PyJsHoisted_arrowFunctionToShadowed_.func_name = u'arrowFunctionToShadowed' + var.put(u'arrowFunctionToShadowed', PyJsHoisted_arrowFunctionToShadowed_) + @Js + def PyJsHoisted_ensureBlock_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'ensureBlock', var.get(u"this").get(u'node')) + PyJsHoisted_ensureBlock_.func_name = u'ensureBlock' + var.put(u'ensureBlock', PyJsHoisted_ensureBlock_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1938_ = Js({}) + var.put(u'newObj', PyJs_Object_1938_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'toComputedKey', var.get(u'toComputedKey')) + var.get(u'exports').put(u'ensureBlock', var.get(u'ensureBlock')) + var.get(u'exports').put(u'arrowFunctionToShadowed', var.get(u'arrowFunctionToShadowed')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass +PyJs_anonymous_1937_._set_name(u'anonymous') +PyJs_Object_1939_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1940_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1941_ = Js({}) + @Js + def PyJs_anonymous_1942_(PyJsArg_676c6f62616c_, this, arguments, var=var): + var = Scope({u'this':this, u'global':PyJsArg_676c6f62616c_, u'arguments':arguments}, var) + var.registers([u'_typeof2', u'_typeof3', u'_map', u'INVALID_METHODS', u'VALID_CALLEES', u'evaluateTruthy', u'global', u'evaluate', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_map2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1943_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1943_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_evaluate_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'deoptPath', u'evaluate', u'value', u'_evaluate', u'confident', u'deopt', u'seen']) + @Js + def PyJsHoisted_evaluate_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'node', u'item', u'path', u'val', u'existing']) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'seen').callprop(u'has', var.get(u'node')): + var.put(u'existing', var.get(u'seen').callprop(u'get', var.get(u'node'))) + if var.get(u'existing').get(u'resolved'): + return var.get(u'existing').get(u'value') + else: + var.get(u'deopt')(var.get(u'path')) + return var.get('undefined') + else: + PyJs_Object_1945_ = Js({u'resolved':Js(False)}) + var.put(u'item', PyJs_Object_1945_) + var.get(u'seen').callprop(u'set', var.get(u'node'), var.get(u'item')) + var.put(u'val', var.get(u'_evaluate')(var.get(u'path'))) + if var.get(u'confident'): + var.get(u'item').put(u'resolved', var.get(u'true')) + var.get(u'item').put(u'value', var.get(u'val')) + return var.get(u'val') + PyJsHoisted_evaluate_.func_name = u'evaluate' + var.put(u'evaluate', PyJsHoisted_evaluate_) + @Js + def PyJsHoisted_deopt_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + if var.get(u'confident').neg(): + return var.get('undefined') + var.put(u'deoptPath', var.get(u'path')) + var.put(u'confident', Js(False)) + PyJsHoisted_deopt_.func_name = u'deopt' + var.put(u'deopt', PyJsHoisted_deopt_) + @Js + def PyJsHoisted__evaluate_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'resolved', u'arr', u'right', u'_isArray3', u'_isArray2', u'leftConfident', u'binding', u'argument', u'_ref2', u'_object', u'_value2', u'arg', u'_ref', u'_exprs', u'_iterator', u'_right', u'_i3', u'_i2', u'prop', u'_i', u'props', u'wasConfident', u'type', u'_left', u'node', u'_type', u'args', u'func', u'testResult', u'object', u'elems', u'_value', u'_elem', u'key', u'path', u'_isArray', u'context', u'obj', u'left', u'valuePath', u'i', u'expr', u'keyPath', u'_ref3', u'elem', u'rightConfident', u'exprs', u'str', u'_property', u'property', u'callee', u'_iterator3', u'_iterator2']) + if var.get(u'confident').neg(): + return var.get('undefined') + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'path').callprop(u'isSequenceExpression'): + var.put(u'exprs', var.get(u'path').callprop(u'get', Js(u'expressions'))) + return var.get(u'evaluate')(var.get(u'exprs').get((var.get(u'exprs').get(u'length')-Js(1.0)))) + if ((var.get(u'path').callprop(u'isStringLiteral') or var.get(u'path').callprop(u'isNumericLiteral')) or var.get(u'path').callprop(u'isBooleanLiteral')): + return var.get(u'node').get(u'value') + if var.get(u'path').callprop(u'isNullLiteral'): + return var.get(u"null") + if var.get(u'path').callprop(u'isTemplateLiteral'): + var.put(u'str', Js(u'')) + var.put(u'i', Js(0.0)) + var.put(u'_exprs', var.get(u'path').callprop(u'get', Js(u'expressions'))) + #for JS loop + var.put(u'_iterator', var.get(u'node').get(u'quasis')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'elem', var.get(u'_ref')) + if var.get(u'confident').neg(): + break + var.put(u'str', var.get(u'elem').get(u'value').get(u'cooked'), u'+') + var.put(u'expr', var.get(u'_exprs').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + if var.get(u'expr'): + var.put(u'str', var.get(u'String')(var.get(u'evaluate')(var.get(u'expr'))), u'+') + + if var.get(u'confident').neg(): + return var.get('undefined') + return var.get(u'str') + if var.get(u'path').callprop(u'isConditionalExpression'): + var.put(u'testResult', var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'test')))) + if var.get(u'confident').neg(): + return var.get('undefined') + if var.get(u'testResult'): + return var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'consequent'))) + else: + return var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'alternate'))) + if var.get(u'path').callprop(u'isExpressionWrapper'): + return var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'expression'))) + PyJs_Object_1946_ = Js({u'callee':var.get(u'node')}) + if (var.get(u'path').callprop(u'isMemberExpression') and var.get(u'path').get(u'parentPath').callprop(u'isCallExpression', PyJs_Object_1946_).neg()): + var.put(u'property', var.get(u'path').callprop(u'get', Js(u'property'))) + var.put(u'object', var.get(u'path').callprop(u'get', Js(u'object'))) + if (var.get(u'object').callprop(u'isLiteral') and var.get(u'property').callprop(u'isIdentifier')): + var.put(u'_value', var.get(u'object').get(u'node').get(u'value')) + var.put(u'type', (Js(u'undefined') if PyJsStrictEq(var.get(u'_value',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'_value')))) + if (PyJsStrictEq(var.get(u'type'),Js(u'number')) or PyJsStrictEq(var.get(u'type'),Js(u'string'))): + return var.get(u'_value').get(var.get(u'property').get(u'node').get(u'name')) + if var.get(u'path').callprop(u'isReferencedIdentifier'): + var.put(u'binding', var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'node').get(u'name'))) + if (var.get(u'binding') and (var.get(u'binding').get(u'constantViolations').get(u'length')>Js(0.0))): + return var.get(u'deopt')(var.get(u'binding').get(u'path')) + if (var.get(u'binding') and var.get(u'binding').get(u'hasValue')): + return var.get(u'binding').get(u'value') + else: + if PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'undefined')): + return var.get(u'undefined') + else: + if PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'Infinity')): + return var.get(u'Infinity') + else: + if PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'NaN')): + return var.get(u'NaN') + var.put(u'resolved', var.get(u'path').callprop(u'resolve')) + if PyJsStrictEq(var.get(u'resolved'),var.get(u'path')): + return var.get(u'deopt')(var.get(u'path')) + else: + return var.get(u'evaluate')(var.get(u'resolved')) + PyJs_Object_1947_ = Js({u'prefix':var.get(u'true')}) + if var.get(u'path').callprop(u'isUnaryExpression', PyJs_Object_1947_): + if PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'void')): + return var.get(u'undefined') + var.put(u'argument', var.get(u'path').callprop(u'get', Js(u'argument'))) + if (PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'typeof')) and (var.get(u'argument').callprop(u'isFunction') or var.get(u'argument').callprop(u'isClass'))): + return Js(u'function') + var.put(u'arg', var.get(u'evaluate')(var.get(u'argument'))) + if var.get(u'confident').neg(): + return var.get('undefined') + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'operator')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'!')): + SWITCHED = True + return var.get(u'arg').neg() + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'+')): + SWITCHED = True + return (+var.get(u'arg')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'-')): + SWITCHED = True + return (-var.get(u'arg')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'~')): + SWITCHED = True + return (~var.get(u'arg')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'typeof')): + SWITCHED = True + return (Js(u'undefined') if PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'arg'))) + SWITCHED = True + break + if var.get(u'path').callprop(u'isArrayExpression'): + var.put(u'arr', Js([])) + var.put(u'elems', var.get(u'path').callprop(u'get', Js(u'elements'))) + #for JS loop + var.put(u'_iterator2', var.get(u'elems')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'_elem', var.get(u'_ref2')) + var.put(u'_elem', var.get(u'_elem').callprop(u'evaluate')) + if var.get(u'_elem').get(u'confident'): + var.get(u'arr').callprop(u'push', var.get(u'_elem').get(u'value')) + else: + return var.get(u'deopt')(var.get(u'_elem')) + + return var.get(u'arr') + if var.get(u'path').callprop(u'isObjectExpression'): + PyJs_Object_1948_ = Js({}) + var.put(u'obj', PyJs_Object_1948_) + var.put(u'props', var.get(u'path').callprop(u'get', Js(u'properties'))) + #for JS loop + var.put(u'_iterator3', var.get(u'props')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'prop', var.get(u'_ref3')) + if (var.get(u'prop').callprop(u'isObjectMethod') or var.get(u'prop').callprop(u'isSpreadProperty')): + return var.get(u'deopt')(var.get(u'prop')) + var.put(u'keyPath', var.get(u'prop').callprop(u'get', Js(u'key'))) + var.put(u'key', var.get(u'keyPath')) + if var.get(u'prop').get(u'node').get(u'computed'): + var.put(u'key', var.get(u'key').callprop(u'evaluate')) + if var.get(u'key').get(u'confident').neg(): + return var.get(u'deopt')(var.get(u'keyPath')) + var.put(u'key', var.get(u'key').get(u'value')) + else: + if var.get(u'key').callprop(u'isIdentifier'): + var.put(u'key', var.get(u'key').get(u'node').get(u'name')) + else: + var.put(u'key', var.get(u'key').get(u'node').get(u'value')) + var.put(u'valuePath', var.get(u'prop').callprop(u'get', Js(u'value'))) + var.put(u'_value2', var.get(u'valuePath').callprop(u'evaluate')) + if var.get(u'_value2').get(u'confident').neg(): + return var.get(u'deopt')(var.get(u'valuePath')) + var.put(u'_value2', var.get(u'_value2').get(u'value')) + var.get(u'obj').put(var.get(u'key'), var.get(u'_value2')) + + return var.get(u'obj') + if var.get(u'path').callprop(u'isLogicalExpression'): + var.put(u'wasConfident', var.get(u'confident')) + var.put(u'left', var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'left')))) + var.put(u'leftConfident', var.get(u'confident')) + var.put(u'confident', var.get(u'wasConfident')) + var.put(u'right', var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'right')))) + var.put(u'rightConfident', var.get(u'confident')) + var.put(u'confident', (var.get(u'leftConfident') and var.get(u'rightConfident'))) + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'operator')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'||')): + SWITCHED = True + if (var.get(u'left') and var.get(u'leftConfident')): + var.put(u'confident', var.get(u'true')) + return var.get(u'left') + if var.get(u'confident').neg(): + return var.get('undefined') + return (var.get(u'left') or var.get(u'right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'&&')): + SWITCHED = True + if ((var.get(u'left').neg() and var.get(u'leftConfident')) or (var.get(u'right').neg() and var.get(u'rightConfident'))): + var.put(u'confident', var.get(u'true')) + if var.get(u'confident').neg(): + return var.get('undefined') + return (var.get(u'left') and var.get(u'right')) + SWITCHED = True + break + if var.get(u'path').callprop(u'isBinaryExpression'): + var.put(u'_left', var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'left')))) + if var.get(u'confident').neg(): + return var.get('undefined') + var.put(u'_right', var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'right')))) + if var.get(u'confident').neg(): + return var.get('undefined') + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'operator')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'-')): + SWITCHED = True + return (var.get(u'_left')-var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'+')): + SWITCHED = True + return (var.get(u'_left')+var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'/')): + SWITCHED = True + return (var.get(u'_left')/var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'*')): + SWITCHED = True + return (var.get(u'_left')*var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'%')): + SWITCHED = True + return (var.get(u'_left')%var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'**')): + SWITCHED = True + return var.get(u'Math').callprop(u'pow', var.get(u'_left'), var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'<')): + SWITCHED = True + return (var.get(u'_left')<var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'>')): + SWITCHED = True + return (var.get(u'_left')>var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'<=')): + SWITCHED = True + return (var.get(u'_left')<=var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'>=')): + SWITCHED = True + return (var.get(u'_left')>=var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'==')): + SWITCHED = True + return (var.get(u'_left')==var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'!=')): + SWITCHED = True + return (var.get(u'_left')!=var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'===')): + SWITCHED = True + return PyJsStrictEq(var.get(u'_left'),var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'!==')): + SWITCHED = True + return PyJsStrictNeq(var.get(u'_left'),var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'|')): + SWITCHED = True + return (var.get(u'_left')|var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'&')): + SWITCHED = True + return (var.get(u'_left')&var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'^')): + SWITCHED = True + return (var.get(u'_left')^var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'<<')): + SWITCHED = True + return (var.get(u'_left')<<var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'>>')): + SWITCHED = True + return (var.get(u'_left')>>var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'>>>')): + SWITCHED = True + return PyJsBshift(var.get(u'_left'),var.get(u'_right')) + SWITCHED = True + break + if var.get(u'path').callprop(u'isCallExpression'): + var.put(u'callee', var.get(u'path').callprop(u'get', Js(u'callee'))) + var.put(u'context', PyJsComma(Js(0.0), Js(None))) + var.put(u'func', PyJsComma(Js(0.0), Js(None))) + if ((var.get(u'callee').callprop(u'isIdentifier') and var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'callee').get(u'node').get(u'name'), var.get(u'true')).neg()) and (var.get(u'VALID_CALLEES').callprop(u'indexOf', var.get(u'callee').get(u'node').get(u'name'))>=Js(0.0))): + var.put(u'func', var.get(u'global').get(var.get(u'node').get(u'callee').get(u'name'))) + if var.get(u'callee').callprop(u'isMemberExpression'): + var.put(u'_object', var.get(u'callee').callprop(u'get', Js(u'object'))) + var.put(u'_property', var.get(u'callee').callprop(u'get', Js(u'property'))) + if (((var.get(u'_object').callprop(u'isIdentifier') and var.get(u'_property').callprop(u'isIdentifier')) and (var.get(u'VALID_CALLEES').callprop(u'indexOf', var.get(u'_object').get(u'node').get(u'name'))>=Js(0.0))) and (var.get(u'INVALID_METHODS').callprop(u'indexOf', var.get(u'_property').get(u'node').get(u'name'))<Js(0.0))): + var.put(u'context', var.get(u'global').get(var.get(u'_object').get(u'node').get(u'name'))) + var.put(u'func', var.get(u'context').get(var.get(u'_property').get(u'node').get(u'name'))) + if (var.get(u'_object').callprop(u'isLiteral') and var.get(u'_property').callprop(u'isIdentifier')): + var.put(u'_type', PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'_object').get(u'node').get(u'value'))) + if (PyJsStrictEq(var.get(u'_type'),Js(u'string')) or PyJsStrictEq(var.get(u'_type'),Js(u'number'))): + var.put(u'context', var.get(u'_object').get(u'node').get(u'value')) + var.put(u'func', var.get(u'context').get(var.get(u'_property').get(u'node').get(u'name'))) + if var.get(u'func'): + var.put(u'args', var.get(u'path').callprop(u'get', Js(u'arguments')).callprop(u'map', var.get(u'evaluate'))) + if var.get(u'confident').neg(): + return var.get('undefined') + return var.get(u'func').callprop(u'apply', var.get(u'context'), var.get(u'args')) + var.get(u'deopt')(var.get(u'path')) + PyJsHoisted__evaluate_.func_name = u'_evaluate' + var.put(u'_evaluate', PyJsHoisted__evaluate_) + var.put(u'confident', var.get(u'true')) + var.put(u'deoptPath', PyJsComma(Js(0.0), Js(None))) + var.put(u'seen', var.get(u'_map2').get(u'default').create()) + pass + var.put(u'value', var.get(u'evaluate')(var.get(u"this"))) + if var.get(u'confident').neg(): + var.put(u'value', var.get(u'undefined')) + PyJs_Object_1944_ = Js({u'confident':var.get(u'confident'),u'deopt':var.get(u'deoptPath'),u'value':var.get(u'value')}) + return PyJs_Object_1944_ + pass + pass + PyJsHoisted_evaluate_.func_name = u'evaluate' + var.put(u'evaluate', PyJsHoisted_evaluate_) + @Js + def PyJsHoisted_evaluateTruthy_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res']) + var.put(u'res', var.get(u"this").callprop(u'evaluate')) + if var.get(u'res').get(u'confident'): + return var.get(u'res').get(u'value').neg().neg() + PyJsHoisted_evaluateTruthy_.func_name = u'evaluateTruthy' + var.put(u'evaluateTruthy', PyJsHoisted_evaluateTruthy_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_map', var.get(u'require')(Js(u'babel-runtime/core-js/map'))) + var.put(u'_map2', var.get(u'_interopRequireDefault')(var.get(u'_map'))) + var.get(u'exports').put(u'evaluateTruthy', var.get(u'evaluateTruthy')) + var.get(u'exports').put(u'evaluate', var.get(u'evaluate')) + pass + var.put(u'VALID_CALLEES', Js([Js(u'String'), Js(u'Number'), Js(u'Math')])) + var.put(u'INVALID_METHODS', Js([Js(u'random')])) + pass + pass + PyJs_anonymous_1942_._set_name(u'anonymous') + PyJs_anonymous_1942_.callprop(u'call', var.get(u"this"), (var.get(u'global') if PyJsStrictNeq(var.get(u'global',throw=False).typeof(),Js(u'undefined')) else (var.get(u'self') if PyJsStrictNeq(var.get(u'self',throw=False).typeof(),Js(u'undefined')) else (var.get(u'window') if PyJsStrictNeq(var.get(u'window',throw=False).typeof(),Js(u'undefined')) else PyJs_Object_1941_)))) +PyJs_anonymous_1940_._set_name(u'anonymous') +PyJs_Object_1949_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/map':Js(98.0),u'babel-runtime/helpers/typeof':Js(114.0)}) +@Js +def PyJs_anonymous_1950_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'getSibling', u'exports', u'_interopRequireWildcard', u'_index', u'getOpposite', u'require', u'_babelTypes', u'module', u'get', u'getCompletionRecords', u'getStatementParent', u'getOuterBindingIdentifiers', u'getBindingIdentifiers', u't', u'_index2', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_getPattern', u'_getKey']) + @Js + def PyJsHoisted_getSibling_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + PyJs_Object_1954_ = Js({u'parentPath':var.get(u"this").get(u'parentPath'),u'parent':var.get(u"this").get(u'parent'),u'container':var.get(u"this").get(u'container'),u'listKey':var.get(u"this").get(u'listKey'),u'key':var.get(u'key')}) + return var.get(u'_index2').get(u'default').callprop(u'get', PyJs_Object_1954_) + PyJsHoisted_getSibling_.func_name = u'getSibling' + var.put(u'getSibling', PyJsHoisted_getSibling_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1951_ = Js({}) + var.put(u'newObj', PyJs_Object_1951_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_get_(key, context, this, arguments, var=var): + var = Scope({u'this':this, u'context':context, u'key':key, u'arguments':arguments}, var) + var.registers([u'parts', u'context', u'key']) + if PyJsStrictEq(var.get(u'context'),var.get(u'true')): + var.put(u'context', var.get(u"this").get(u'context')) + var.put(u'parts', var.get(u'key').callprop(u'split', Js(u'.'))) + if PyJsStrictEq(var.get(u'parts').get(u'length'),Js(1.0)): + return var.get(u"this").callprop(u'_getKey', var.get(u'key'), var.get(u'context')) + else: + return var.get(u"this").callprop(u'_getPattern', var.get(u'parts'), var.get(u'context')) + PyJsHoisted_get_.func_name = u'get' + var.put(u'get', PyJsHoisted_get_) + @Js + def PyJsHoisted_getOpposite_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if PyJsStrictEq(var.get(u"this").get(u'key'),Js(u'left')): + return var.get(u"this").callprop(u'getSibling', Js(u'right')) + else: + if PyJsStrictEq(var.get(u"this").get(u'key'),Js(u'right')): + return var.get(u"this").callprop(u'getSibling', Js(u'left')) + PyJsHoisted_getOpposite_.func_name = u'getOpposite' + var.put(u'getOpposite', PyJsHoisted_getOpposite_) + @Js + def PyJsHoisted_getCompletionRecords_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'paths', u'add']) + var.put(u'paths', Js([])) + @Js + def PyJs_add_1953_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'add':PyJs_add_1953_, u'arguments':arguments}, var) + var.registers([u'path']) + if var.get(u'path'): + var.put(u'paths', var.get(u'paths').callprop(u'concat', var.get(u'path').callprop(u'getCompletionRecords'))) + PyJs_add_1953_._set_name(u'add') + var.put(u'add', PyJs_add_1953_) + if var.get(u"this").callprop(u'isIfStatement'): + var.get(u'add')(var.get(u"this").callprop(u'get', Js(u'consequent'))) + var.get(u'add')(var.get(u"this").callprop(u'get', Js(u'alternate'))) + else: + if ((var.get(u"this").callprop(u'isDoExpression') or var.get(u"this").callprop(u'isFor')) or var.get(u"this").callprop(u'isWhile')): + var.get(u'add')(var.get(u"this").callprop(u'get', Js(u'body'))) + else: + if (var.get(u"this").callprop(u'isProgram') or var.get(u"this").callprop(u'isBlockStatement')): + var.get(u'add')(var.get(u"this").callprop(u'get', Js(u'body')).callprop(u'pop')) + else: + if var.get(u"this").callprop(u'isFunction'): + return var.get(u"this").callprop(u'get', Js(u'body')).callprop(u'getCompletionRecords') + else: + if var.get(u"this").callprop(u'isTryStatement'): + var.get(u'add')(var.get(u"this").callprop(u'get', Js(u'block'))) + var.get(u'add')(var.get(u"this").callprop(u'get', Js(u'handler'))) + var.get(u'add')(var.get(u"this").callprop(u'get', Js(u'finalizer'))) + else: + var.get(u'paths').callprop(u'push', var.get(u"this")) + return var.get(u'paths') + PyJsHoisted_getCompletionRecords_.func_name = u'getCompletionRecords' + var.put(u'getCompletionRecords', PyJsHoisted_getCompletionRecords_) + @Js + def PyJsHoisted_getStatementParent_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'path']) + var.put(u'path', var.get(u"this")) + while 1: + if (var.get(u'path').get(u'parentPath').neg() or (var.get(u'Array').callprop(u'isArray', var.get(u'path').get(u'container')) and var.get(u'path').callprop(u'isStatement'))): + break + else: + var.put(u'path', var.get(u'path').get(u'parentPath')) + if not var.get(u'path'): + break + if (var.get(u'path') and (var.get(u'path').callprop(u'isProgram') or var.get(u'path').callprop(u'isFile'))): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"File/Program node, we can't possibly find a statement parent to this"))) + raise PyJsTempException + return var.get(u'path') + PyJsHoisted_getStatementParent_.func_name = u'getStatementParent' + var.put(u'getStatementParent', PyJsHoisted_getStatementParent_) + @Js + def PyJsHoisted_getOuterBindingIdentifiers_(duplicates, this, arguments, var=var): + var = Scope({u'duplicates':duplicates, u'this':this, u'arguments':arguments}, var) + var.registers([u'duplicates']) + return var.get(u't').callprop(u'getOuterBindingIdentifiers', var.get(u"this").get(u'node'), var.get(u'duplicates')) + PyJsHoisted_getOuterBindingIdentifiers_.func_name = u'getOuterBindingIdentifiers' + var.put(u'getOuterBindingIdentifiers', PyJsHoisted_getOuterBindingIdentifiers_) + @Js + def PyJsHoisted__getKey_(key, context, this, arguments, var=var): + var = Scope({u'this':this, u'context':context, u'key':key, u'arguments':arguments}, var) + var.registers([u'node', u'context', u'container', u'key', u'_this']) + var.put(u'_this', var.get(u"this")) + var.put(u'node', var.get(u"this").get(u'node')) + var.put(u'container', var.get(u'node').get(var.get(u'key'))) + if var.get(u'Array').callprop(u'isArray', var.get(u'container')): + @Js + def PyJs_anonymous_1955_(_, i, this, arguments, var=var): + var = Scope({u'i':i, u'this':this, u'arguments':arguments, u'_':_}, var) + var.registers([u'i', u'_']) + PyJs_Object_1956_ = Js({u'listKey':var.get(u'key'),u'parentPath':var.get(u'_this'),u'parent':var.get(u'node'),u'container':var.get(u'container'),u'key':var.get(u'i')}) + return var.get(u'_index2').get(u'default').callprop(u'get', PyJs_Object_1956_).callprop(u'setContext', var.get(u'context')) + PyJs_anonymous_1955_._set_name(u'anonymous') + return var.get(u'container').callprop(u'map', PyJs_anonymous_1955_) + else: + PyJs_Object_1957_ = Js({u'parentPath':var.get(u"this"),u'parent':var.get(u'node'),u'container':var.get(u'node'),u'key':var.get(u'key')}) + return var.get(u'_index2').get(u'default').callprop(u'get', PyJs_Object_1957_).callprop(u'setContext', var.get(u'context')) + PyJsHoisted__getKey_.func_name = u'_getKey' + var.put(u'_getKey', PyJsHoisted__getKey_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1952_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1952_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_getBindingIdentifiers_(duplicates, this, arguments, var=var): + var = Scope({u'duplicates':duplicates, u'this':this, u'arguments':arguments}, var) + var.registers([u'duplicates']) + return var.get(u't').callprop(u'getBindingIdentifiers', var.get(u"this").get(u'node'), var.get(u'duplicates')) + PyJsHoisted_getBindingIdentifiers_.func_name = u'getBindingIdentifiers' + var.put(u'getBindingIdentifiers', PyJsHoisted_getBindingIdentifiers_) + @Js + def PyJsHoisted__getPattern_(parts, context, this, arguments, var=var): + var = Scope({u'this':this, u'parts':parts, u'arguments':arguments, u'context':context}, var) + var.registers([u'_isArray', u'_iterator', u'context', u'parts', u'part', u'_i', u'path', u'_ref']) + var.put(u'path', var.get(u"this")) + #for JS loop + var.put(u'_iterator', var.get(u'parts')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'part', var.get(u'_ref')) + if PyJsStrictEq(var.get(u'part'),Js(u'.')): + var.put(u'path', var.get(u'path').get(u'parentPath')) + else: + if var.get(u'Array').callprop(u'isArray', var.get(u'path')): + var.put(u'path', var.get(u'path').get(var.get(u'part'))) + else: + var.put(u'path', var.get(u'path').callprop(u'get', var.get(u'part'), var.get(u'context'))) + + return var.get(u'path') + PyJsHoisted__getPattern_.func_name = u'_getPattern' + var.put(u'_getPattern', PyJsHoisted__getPattern_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'getStatementParent', var.get(u'getStatementParent')) + var.get(u'exports').put(u'getOpposite', var.get(u'getOpposite')) + var.get(u'exports').put(u'getCompletionRecords', var.get(u'getCompletionRecords')) + var.get(u'exports').put(u'getSibling', var.get(u'getSibling')) + var.get(u'exports').put(u'get', var.get(u'get')) + var.get(u'exports').put(u'_getKey', var.get(u'_getKey')) + var.get(u'exports').put(u'_getPattern', var.get(u'_getPattern')) + var.get(u'exports').put(u'getBindingIdentifiers', var.get(u'getBindingIdentifiers')) + var.get(u'exports').put(u'getOuterBindingIdentifiers', var.get(u'getOuterBindingIdentifiers')) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_1950_._set_name(u'anonymous') +PyJs_Object_1958_ = Js({u'./index':Js(232.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1959_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'_scope', u'_ret', u'_invariant2', u'_virtualTypes', u'_ret2', u'_loop2', u'_interopRequireDefault', u'_cache', u'_getIterator2', u'_getIterator3', u'virtualTypes', u'_iterator', u'_debug', u'_i', u'_classCallCheck3', u'_classCallCheck2', u'type', u'NodePath', u'exports', u'_assign', u'_interopRequireWildcard', u'_babelTypes', u'_debug3', u'_debug2', u'_index2', u'_loop', u'_assign2', u'_isArray', u'_index', u'require', u'_ref2', u't', u'_scope2', u'_invariant']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1961_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1961_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1960_ = Js({}) + var.put(u'newObj', PyJs_Object_1960_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_virtualTypes', var.get(u'require')(Js(u'./lib/virtual-types'))) + var.put(u'virtualTypes', var.get(u'_interopRequireWildcard')(var.get(u'_virtualTypes'))) + var.put(u'_debug2', var.get(u'require')(Js(u'debug'))) + var.put(u'_debug3', var.get(u'_interopRequireDefault')(var.get(u'_debug2'))) + var.put(u'_invariant', var.get(u'require')(Js(u'invariant'))) + var.put(u'_invariant2', var.get(u'_interopRequireDefault')(var.get(u'_invariant'))) + var.put(u'_index', var.get(u'require')(Js(u'../index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + var.put(u'_assign', var.get(u'require')(Js(u'lodash/assign'))) + var.put(u'_assign2', var.get(u'_interopRequireDefault')(var.get(u'_assign'))) + var.put(u'_scope', var.get(u'require')(Js(u'../scope'))) + var.put(u'_scope2', var.get(u'_interopRequireDefault')(var.get(u'_scope'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_cache', var.get(u'require')(Js(u'../cache'))) + pass + pass + var.put(u'_debug', PyJsComma(Js(0.0),var.get(u'_debug3').get(u'default'))(Js(u'babel'))) + @Js + def PyJs_anonymous_1962_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'NodePath']) + @Js + def PyJsHoisted_NodePath_(hub, parent, this, arguments, var=var): + var = Scope({u'this':this, u'parent':parent, u'hub':hub, u'arguments':arguments}, var) + var.registers([u'parent', u'hub']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'NodePath')) + var.get(u"this").put(u'parent', var.get(u'parent')) + var.get(u"this").put(u'hub', var.get(u'hub')) + var.get(u"this").put(u'contexts', Js([])) + PyJs_Object_1963_ = Js({}) + var.get(u"this").put(u'data', PyJs_Object_1963_) + var.get(u"this").put(u'shouldSkip', Js(False)) + var.get(u"this").put(u'shouldStop', Js(False)) + var.get(u"this").put(u'removed', Js(False)) + var.get(u"this").put(u'state', var.get(u"null")) + var.get(u"this").put(u'opts', var.get(u"null")) + var.get(u"this").put(u'skipKeys', var.get(u"null")) + var.get(u"this").put(u'parentPath', var.get(u"null")) + var.get(u"this").put(u'context', var.get(u"null")) + var.get(u"this").put(u'container', var.get(u"null")) + var.get(u"this").put(u'listKey', var.get(u"null")) + var.get(u"this").put(u'inList', Js(False)) + var.get(u"this").put(u'parentKey', var.get(u"null")) + var.get(u"this").put(u'key', var.get(u"null")) + var.get(u"this").put(u'node', var.get(u"null")) + var.get(u"this").put(u'scope', var.get(u"null")) + var.get(u"this").put(u'type', var.get(u"null")) + var.get(u"this").put(u'typeAnnotation', var.get(u"null")) + PyJsHoisted_NodePath_.func_name = u'NodePath' + var.put(u'NodePath', PyJsHoisted_NodePath_) + pass + @Js + def PyJs_get_1964_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments, u'get':PyJs_get_1964_}, var) + var.registers([u'paths', u'container', u'hub', u'parent', u'i', u'listKey', u'targetNode', u'key', u'parentPath', u'path', u'pathCheck', u'_ref']) + var.put(u'hub', var.get(u'_ref').get(u'hub')) + var.put(u'parentPath', var.get(u'_ref').get(u'parentPath')) + var.put(u'parent', var.get(u'_ref').get(u'parent')) + var.put(u'container', var.get(u'_ref').get(u'container')) + var.put(u'listKey', var.get(u'_ref').get(u'listKey')) + var.put(u'key', var.get(u'_ref').get(u'key')) + if (var.get(u'hub').neg() and var.get(u'parentPath')): + var.put(u'hub', var.get(u'parentPath').get(u'hub')) + PyJsComma(Js(0.0),var.get(u'_invariant2').get(u'default'))(var.get(u'parent'), Js(u'To get a node path the parent needs to exist')) + var.put(u'targetNode', var.get(u'container').get(var.get(u'key'))) + var.put(u'paths', (var.get(u'_cache').get(u'path').callprop(u'get', var.get(u'parent')) or Js([]))) + if var.get(u'_cache').get(u'path').callprop(u'has', var.get(u'parent')).neg(): + var.get(u'_cache').get(u'path').callprop(u'set', var.get(u'parent'), var.get(u'paths')) + var.put(u'path', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'paths').get(u'length')): + try: + var.put(u'pathCheck', var.get(u'paths').get(var.get(u'i'))) + if PyJsStrictEq(var.get(u'pathCheck').get(u'node'),var.get(u'targetNode')): + var.put(u'path', var.get(u'pathCheck')) + break + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + if var.get(u'path').neg(): + var.put(u'path', var.get(u'NodePath').create(var.get(u'hub'), var.get(u'parent'))) + var.get(u'paths').callprop(u'push', var.get(u'path')) + var.get(u'path').callprop(u'setup', var.get(u'parentPath'), var.get(u'container'), var.get(u'listKey'), var.get(u'key')) + return var.get(u'path') + PyJs_get_1964_._set_name(u'get') + var.get(u'NodePath').put(u'get', PyJs_get_1964_) + @Js + def PyJs_getScope_1965_(scope, this, arguments, var=var): + var = Scope({u'this':this, u'scope':scope, u'getScope':PyJs_getScope_1965_, u'arguments':arguments}, var) + var.registers([u'scope', u'ourScope']) + var.put(u'ourScope', var.get(u'scope')) + if var.get(u"this").callprop(u'isScope'): + var.put(u'ourScope', var.get(u'_scope2').get(u'default').create(var.get(u"this"), var.get(u'scope'))) + return var.get(u'ourScope') + PyJs_getScope_1965_._set_name(u'getScope') + var.get(u'NodePath').get(u'prototype').put(u'getScope', PyJs_getScope_1965_) + @Js + def PyJs_setData_1966_(key, val, this, arguments, var=var): + var = Scope({u'this':this, u'setData':PyJs_setData_1966_, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'val', u'key']) + return var.get(u"this").get(u'data').put(var.get(u'key'), var.get(u'val')) + PyJs_setData_1966_._set_name(u'setData') + var.get(u'NodePath').get(u'prototype').put(u'setData', PyJs_setData_1966_) + @Js + def PyJs_getData_1967_(key, PyJsArg_646566_, this, arguments, var=var): + var = Scope({u'this':this, u'getData':PyJs_getData_1967_, u'def':PyJsArg_646566_, u'key':key, u'arguments':arguments}, var) + var.registers([u'def', u'key', u'val']) + var.put(u'val', var.get(u"this").get(u'data').get(var.get(u'key'))) + if (var.get(u'val').neg() and var.get(u'def')): + var.put(u'val', var.get(u"this").get(u'data').put(var.get(u'key'), var.get(u'def'))) + return var.get(u'val') + PyJs_getData_1967_._set_name(u'getData') + var.get(u'NodePath').get(u'prototype').put(u'getData', PyJs_getData_1967_) + @Js + def PyJs_buildCodeFrameError_1968_(msg, this, arguments, var=var): + var = Scope({u'msg':msg, u'this':this, u'buildCodeFrameError':PyJs_buildCodeFrameError_1968_, u'arguments':arguments}, var) + var.registers([u'msg', u'Error']) + var.put(u'Error', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else var.get(u'SyntaxError'))) + return var.get(u"this").get(u'hub').get(u'file').callprop(u'buildCodeFrameError', var.get(u"this").get(u'node'), var.get(u'msg'), var.get(u'Error')) + PyJs_buildCodeFrameError_1968_._set_name(u'buildCodeFrameError') + var.get(u'NodePath').get(u'prototype').put(u'buildCodeFrameError', PyJs_buildCodeFrameError_1968_) + @Js + def PyJs_traverse_1969_(visitor, state, this, arguments, var=var): + var = Scope({u'this':this, u'visitor':visitor, u'state':state, u'arguments':arguments, u'traverse':PyJs_traverse_1969_}, var) + var.registers([u'visitor', u'state']) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(var.get(u"this").get(u'node'), var.get(u'visitor'), var.get(u"this").get(u'scope'), var.get(u'state'), var.get(u"this")) + PyJs_traverse_1969_._set_name(u'traverse') + var.get(u'NodePath').get(u'prototype').put(u'traverse', PyJs_traverse_1969_) + @Js + def PyJs_mark_1970_(type, message, this, arguments, var=var): + var = Scope({u'this':this, u'message':message, u'type':type, u'arguments':arguments, u'mark':PyJs_mark_1970_}, var) + var.registers([u'message', u'type']) + PyJs_Object_1971_ = Js({u'type':var.get(u'type'),u'message':var.get(u'message'),u'loc':var.get(u"this").get(u'node').get(u'loc')}) + var.get(u"this").get(u'hub').get(u'file').get(u'metadata').get(u'marked').callprop(u'push', PyJs_Object_1971_) + PyJs_mark_1970_._set_name(u'mark') + var.get(u'NodePath').get(u'prototype').put(u'mark', PyJs_mark_1970_) + @Js + def PyJs_set_1972_(key, node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'set':PyJs_set_1972_, u'arguments':arguments, u'key':key}, var) + var.registers([u'node', u'key']) + var.get(u't').callprop(u'validate', var.get(u"this").get(u'node'), var.get(u'key'), var.get(u'node')) + var.get(u"this").get(u'node').put(var.get(u'key'), var.get(u'node')) + PyJs_set_1972_._set_name(u'set') + var.get(u'NodePath').get(u'prototype').put(u'set', PyJs_set_1972_) + @Js + def PyJs_getPathLocation_1973_(this, arguments, var=var): + var = Scope({u'this':this, u'getPathLocation':PyJs_getPathLocation_1973_, u'arguments':arguments}, var) + var.registers([u'path', u'parts', u'key']) + var.put(u'parts', Js([])) + var.put(u'path', var.get(u"this")) + while 1: + var.put(u'key', var.get(u'path').get(u'key')) + if var.get(u'path').get(u'inList'): + var.put(u'key', (((var.get(u'path').get(u'listKey')+Js(u'['))+var.get(u'key'))+Js(u']'))) + var.get(u'parts').callprop(u'unshift', var.get(u'key')) + if not var.put(u'path', var.get(u'path').get(u'parentPath')): + break + return var.get(u'parts').callprop(u'join', Js(u'.')) + PyJs_getPathLocation_1973_._set_name(u'getPathLocation') + var.get(u'NodePath').get(u'prototype').put(u'getPathLocation', PyJs_getPathLocation_1973_) + @Js + def PyJs_debug_1974_(buildMessage, this, arguments, var=var): + var = Scope({u'this':this, u'buildMessage':buildMessage, u'arguments':arguments, u'debug':PyJs_debug_1974_}, var) + var.registers([u'buildMessage']) + if var.get(u'_debug').get(u'enabled').neg(): + return var.get('undefined') + var.get(u'_debug')(((((var.get(u"this").callprop(u'getPathLocation')+Js(u' '))+var.get(u"this").get(u'type'))+Js(u': '))+var.get(u'buildMessage')())) + PyJs_debug_1974_._set_name(u'debug') + var.get(u'NodePath').get(u'prototype').put(u'debug', PyJs_debug_1974_) + return var.get(u'NodePath') + PyJs_anonymous_1962_._set_name(u'anonymous') + var.put(u'NodePath', PyJs_anonymous_1962_()) + var.get(u'exports').put(u'default', var.get(u'NodePath')) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./ancestry'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./inference'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./replacement'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./evaluation'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./conversion'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./introspection'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./context'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./removal'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./modification'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./family'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./comments'))) + @Js + def PyJs__loop2_1975_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'_loop2':PyJs__loop2_1975_}, var) + var.registers([u'typeKey', u'type']) + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + return Js(u'break') + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + return Js(u'break') + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'type', var.get(u'_ref2')) + var.put(u'typeKey', (Js(u'is')+var.get(u'type'))) + @Js + def PyJs_anonymous_1976_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'opts']) + return var.get(u't').callprop(var.get(u'typeKey'), var.get(u"this").get(u'node'), var.get(u'opts')) + PyJs_anonymous_1976_._set_name(u'anonymous') + var.get(u'NodePath').get(u'prototype').put(var.get(u'typeKey'), PyJs_anonymous_1976_) + @Js + def PyJs_anonymous_1977_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'opts']) + if var.get(u"this").callprop(var.get(u'typeKey'), var.get(u'opts')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Expected node path of type ')+var.get(u'type')))) + raise PyJsTempException + PyJs_anonymous_1977_._set_name(u'anonymous') + var.get(u'NodePath').get(u'prototype').put((Js(u'assert')+var.get(u'type')), PyJs_anonymous_1977_) + PyJs__loop2_1975_._set_name(u'_loop2') + var.put(u'_loop2', PyJs__loop2_1975_) + #for JS loop + var.put(u'_iterator', var.get(u't').get(u'TYPES')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + var.put(u'_ret2', var.get(u'_loop2')()) + if PyJsStrictEq(var.get(u'_ret2'),Js(u'break')): + break + + @Js + def PyJs__loop_1978_(type, this, arguments, var=var): + var = Scope({u'this':this, u'_loop':PyJs__loop_1978_, u'type':type, u'arguments':arguments}, var) + var.registers([u'virtualType', u'type']) + if PyJsStrictEq(var.get(u'type').get(u'0'),Js(u'_')): + return Js(u'continue') + if (var.get(u't').get(u'TYPES').callprop(u'indexOf', var.get(u'type'))<Js(0.0)): + var.get(u't').get(u'TYPES').callprop(u'push', var.get(u'type')) + var.put(u'virtualType', var.get(u'virtualTypes').get(var.get(u'type'))) + @Js + def PyJs_anonymous_1979_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'opts']) + return var.get(u'virtualType').callprop(u'checkPath', var.get(u"this"), var.get(u'opts')) + PyJs_anonymous_1979_._set_name(u'anonymous') + var.get(u'NodePath').get(u'prototype').put((Js(u'is')+var.get(u'type')), PyJs_anonymous_1979_) + PyJs__loop_1978_._set_name(u'_loop') + var.put(u'_loop', PyJs__loop_1978_) + for PyJsTemp in var.get(u'virtualTypes'): + var.put(u'type', PyJsTemp) + var.put(u'_ret', var.get(u'_loop')(var.get(u'type'))) + if PyJsStrictEq(var.get(u'_ret'),Js(u'continue')): + continue + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1959_._set_name(u'anonymous') +PyJs_Object_1980_ = Js({u'../cache':Js(222.0),u'../index':Js(225.0),u'../scope':Js(244.0),u'./ancestry':Js(226.0),u'./comments':Js(227.0),u'./context':Js(228.0),u'./conversion':Js(229.0),u'./evaluation':Js(230.0),u'./family':Js(231.0),u'./inference':Js(233.0),u'./introspection':Js(236.0),u'./lib/virtual-types':Js(239.0),u'./modification':Js(240.0),u'./removal':Js(241.0),u'./replacement':Js(242.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-types':Js(258.0),u'debug':Js(268.0),u'invariant':Js(280.0),u'lodash/assign':Js(435.0)}) +@Js +def PyJs_anonymous_1981_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'inferers', u'_interopRequireWildcard', u'_inferers', u'couldBeBaseType', u'getTypeAnnotation', u'_babelTypes', u'isBaseType', u'module', u'baseTypeStrictlyMatches', u'_getTypeAnnotation', u'isGenericType', u'_isBaseType', u't', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'require']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1982_ = Js({}) + var.put(u'newObj', PyJs_Object_1982_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_couldBeBaseType_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'_isArray', u'_iterator', u'name', u'_i', u'_ref', u'type', u'type2']) + var.put(u'type', var.get(u"this").callprop(u'getTypeAnnotation')) + if var.get(u't').callprop(u'isAnyTypeAnnotation', var.get(u'type')): + return var.get(u'true') + if var.get(u't').callprop(u'isUnionTypeAnnotation', var.get(u'type')): + #for JS loop + var.put(u'_iterator', var.get(u'type').get(u'types')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'type2', var.get(u'_ref')) + if (var.get(u't').callprop(u'isAnyTypeAnnotation', var.get(u'type2')) or var.get(u'_isBaseType')(var.get(u'name'), var.get(u'type2'), var.get(u'true'))): + return var.get(u'true') + + return Js(False) + else: + return var.get(u'_isBaseType')(var.get(u'name'), var.get(u'type'), var.get(u'true')) + PyJsHoisted_couldBeBaseType_.func_name = u'couldBeBaseType' + var.put(u'couldBeBaseType', PyJsHoisted_couldBeBaseType_) + @Js + def PyJsHoisted_getTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'type']) + if var.get(u"this").get(u'typeAnnotation'): + return var.get(u"this").get(u'typeAnnotation') + var.put(u'type', (var.get(u"this").callprop(u'_getTypeAnnotation') or var.get(u't').callprop(u'anyTypeAnnotation'))) + if var.get(u't').callprop(u'isTypeAnnotation', var.get(u'type')): + var.put(u'type', var.get(u'type').get(u'typeAnnotation')) + return var.get(u"this").put(u'typeAnnotation', var.get(u'type')) + PyJsHoisted_getTypeAnnotation_.func_name = u'getTypeAnnotation' + var.put(u'getTypeAnnotation', PyJsHoisted_getTypeAnnotation_) + @Js + def PyJsHoisted_isBaseType_(baseName, soft, this, arguments, var=var): + var = Scope({u'this':this, u'baseName':baseName, u'soft':soft, u'arguments':arguments}, var) + var.registers([u'baseName', u'soft']) + return var.get(u'_isBaseType')(var.get(u'baseName'), var.get(u"this").callprop(u'getTypeAnnotation'), var.get(u'soft')) + PyJsHoisted_isBaseType_.func_name = u'isBaseType' + var.put(u'isBaseType', PyJsHoisted_isBaseType_) + @Js + def PyJsHoisted_baseTypeStrictlyMatches_(right, this, arguments, var=var): + var = Scope({u'this':this, u'right':right, u'arguments':arguments}, var) + var.registers([u'right', u'left']) + var.put(u'left', var.get(u"this").callprop(u'getTypeAnnotation')) + var.put(u'right', var.get(u'right').callprop(u'getTypeAnnotation')) + if (var.get(u't').callprop(u'isAnyTypeAnnotation', var.get(u'left')).neg() and var.get(u't').callprop(u'isFlowBaseAnnotation', var.get(u'left'))): + return PyJsStrictEq(var.get(u'right').get(u'type'),var.get(u'left').get(u'type')) + PyJsHoisted_baseTypeStrictlyMatches_.func_name = u'baseTypeStrictlyMatches' + var.put(u'baseTypeStrictlyMatches', PyJsHoisted_baseTypeStrictlyMatches_) + @Js + def PyJsHoisted__getTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'declarParent', u'inferer', u'declar']) + var.put(u'node', var.get(u"this").get(u'node')) + if var.get(u'node').neg(): + if (PyJsStrictEq(var.get(u"this").get(u'key'),Js(u'init')) and var.get(u"this").get(u'parentPath').callprop(u'isVariableDeclarator')): + var.put(u'declar', var.get(u"this").get(u'parentPath').get(u'parentPath')) + var.put(u'declarParent', var.get(u'declar').get(u'parentPath')) + if (PyJsStrictEq(var.get(u'declar').get(u'key'),Js(u'left')) and var.get(u'declarParent').callprop(u'isForInStatement')): + return var.get(u't').callprop(u'stringTypeAnnotation') + if (PyJsStrictEq(var.get(u'declar').get(u'key'),Js(u'left')) and var.get(u'declarParent').callprop(u'isForOfStatement')): + return var.get(u't').callprop(u'anyTypeAnnotation') + return var.get(u't').callprop(u'voidTypeAnnotation') + else: + return var.get('undefined') + if var.get(u'node').get(u'typeAnnotation'): + return var.get(u'node').get(u'typeAnnotation') + var.put(u'inferer', var.get(u'inferers').get(var.get(u'node').get(u'type'))) + if var.get(u'inferer'): + return var.get(u'inferer').callprop(u'call', var.get(u"this"), var.get(u'node')) + var.put(u'inferer', var.get(u'inferers').get(var.get(u"this").get(u'parentPath').get(u'type'))) + if (var.get(u'inferer') and var.get(u'inferer').get(u'validParent')): + return var.get(u"this").get(u'parentPath').callprop(u'getTypeAnnotation') + PyJsHoisted__getTypeAnnotation_.func_name = u'_getTypeAnnotation' + var.put(u'_getTypeAnnotation', PyJsHoisted__getTypeAnnotation_) + @Js + def PyJsHoisted_isGenericType_(genericName, this, arguments, var=var): + var = Scope({u'this':this, u'genericName':genericName, u'arguments':arguments}, var) + var.registers([u'genericName', u'type']) + var.put(u'type', var.get(u"this").callprop(u'getTypeAnnotation')) + PyJs_Object_1984_ = Js({u'name':var.get(u'genericName')}) + return (var.get(u't').callprop(u'isGenericTypeAnnotation', var.get(u'type')) and var.get(u't').callprop(u'isIdentifier', var.get(u'type').get(u'id'), PyJs_Object_1984_)) + PyJsHoisted_isGenericType_.func_name = u'isGenericType' + var.put(u'isGenericType', PyJsHoisted_isGenericType_) + @Js + def PyJsHoisted__isBaseType_(baseName, type, soft, this, arguments, var=var): + var = Scope({u'this':this, u'soft':soft, u'baseName':baseName, u'type':type, u'arguments':arguments}, var) + var.registers([u'soft', u'baseName', u'type']) + if PyJsStrictEq(var.get(u'baseName'),Js(u'string')): + return var.get(u't').callprop(u'isStringTypeAnnotation', var.get(u'type')) + else: + if PyJsStrictEq(var.get(u'baseName'),Js(u'number')): + return var.get(u't').callprop(u'isNumberTypeAnnotation', var.get(u'type')) + else: + if PyJsStrictEq(var.get(u'baseName'),Js(u'boolean')): + return var.get(u't').callprop(u'isBooleanTypeAnnotation', var.get(u'type')) + else: + if PyJsStrictEq(var.get(u'baseName'),Js(u'any')): + return var.get(u't').callprop(u'isAnyTypeAnnotation', var.get(u'type')) + else: + if PyJsStrictEq(var.get(u'baseName'),Js(u'mixed')): + return var.get(u't').callprop(u'isMixedTypeAnnotation', var.get(u'type')) + else: + if PyJsStrictEq(var.get(u'baseName'),Js(u'empty')): + return var.get(u't').callprop(u'isEmptyTypeAnnotation', var.get(u'type')) + else: + if PyJsStrictEq(var.get(u'baseName'),Js(u'void')): + return var.get(u't').callprop(u'isVoidTypeAnnotation', var.get(u'type')) + else: + if var.get(u'soft'): + return Js(False) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'Unknown base type ')+var.get(u'baseName')))) + raise PyJsTempException + PyJsHoisted__isBaseType_.func_name = u'_isBaseType' + var.put(u'_isBaseType', PyJsHoisted__isBaseType_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1983_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1983_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'getTypeAnnotation', var.get(u'getTypeAnnotation')) + var.get(u'exports').put(u'_getTypeAnnotation', var.get(u'_getTypeAnnotation')) + var.get(u'exports').put(u'isBaseType', var.get(u'isBaseType')) + var.get(u'exports').put(u'couldBeBaseType', var.get(u'couldBeBaseType')) + var.get(u'exports').put(u'baseTypeStrictlyMatches', var.get(u'baseTypeStrictlyMatches')) + var.get(u'exports').put(u'isGenericType', var.get(u'isGenericType')) + var.put(u'_inferers', var.get(u'require')(Js(u'./inferers'))) + var.put(u'inferers', var.get(u'_interopRequireWildcard')(var.get(u'_inferers'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_1981_._set_name(u'anonymous') +PyJs_Object_1985_ = Js({u'./inferers':Js(235.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1986_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'getConditionalAnnotation', u'_interopRequireWildcard', u'getParentConditionalPath', u'require', u'_babelTypes', u'module', u'inferAnnotationFromBinaryExpression', u't', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'getTypeAnnotationBindingConstantViolations', u'getConstantViolationsBefore']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1988_ = Js({}) + var.put(u'newObj', PyJs_Object_1988_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_getParentConditionalPath_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path', u'parentPath']) + var.put(u'parentPath', PyJsComma(Js(0.0), Js(None))) + while var.put(u'parentPath', var.get(u'path').get(u'parentPath')): + if (var.get(u'parentPath').callprop(u'isIfStatement') or var.get(u'parentPath').callprop(u'isConditionalExpression')): + if PyJsStrictEq(var.get(u'path').get(u'key'),Js(u'test')): + return var.get('undefined') + else: + return var.get(u'parentPath') + else: + var.put(u'path', var.get(u'parentPath')) + PyJsHoisted_getParentConditionalPath_.func_name = u'getParentConditionalPath' + var.put(u'getParentConditionalPath', PyJsHoisted_getParentConditionalPath_) + @Js + def PyJsHoisted_inferAnnotationFromBinaryExpression_(name, path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'name':name, u'arguments':arguments}, var) + var.registers([u'right', u'target', u'typeValue', u'typeofPath', u'typePath', u'name', u'operator', u'path', u'left']) + var.put(u'operator', var.get(u'path').get(u'node').get(u'operator')) + var.put(u'right', var.get(u'path').callprop(u'get', Js(u'right')).callprop(u'resolve')) + var.put(u'left', var.get(u'path').callprop(u'get', Js(u'left')).callprop(u'resolve')) + var.put(u'target', PyJsComma(Js(0.0), Js(None))) + PyJs_Object_1993_ = Js({u'name':var.get(u'name')}) + if var.get(u'left').callprop(u'isIdentifier', PyJs_Object_1993_): + var.put(u'target', var.get(u'right')) + else: + PyJs_Object_1994_ = Js({u'name':var.get(u'name')}) + if var.get(u'right').callprop(u'isIdentifier', PyJs_Object_1994_): + var.put(u'target', var.get(u'left')) + if var.get(u'target'): + if PyJsStrictEq(var.get(u'operator'),Js(u'===')): + return var.get(u'target').callprop(u'getTypeAnnotation') + else: + if (var.get(u't').get(u'BOOLEAN_NUMBER_BINARY_OPERATORS').callprop(u'indexOf', var.get(u'operator'))>=Js(0.0)): + return var.get(u't').callprop(u'numberTypeAnnotation') + else: + return var.get('undefined') + else: + if PyJsStrictNeq(var.get(u'operator'),Js(u'===')): + return var.get('undefined') + var.put(u'typeofPath', PyJsComma(Js(0.0), Js(None))) + var.put(u'typePath', PyJsComma(Js(0.0), Js(None))) + PyJs_Object_1995_ = Js({u'operator':Js(u'typeof')}) + if var.get(u'left').callprop(u'isUnaryExpression', PyJs_Object_1995_): + var.put(u'typeofPath', var.get(u'left')) + var.put(u'typePath', var.get(u'right')) + else: + PyJs_Object_1996_ = Js({u'operator':Js(u'typeof')}) + if var.get(u'right').callprop(u'isUnaryExpression', PyJs_Object_1996_): + var.put(u'typeofPath', var.get(u'right')) + var.put(u'typePath', var.get(u'left')) + if (var.get(u'typePath').neg() and var.get(u'typeofPath').neg()): + return var.get('undefined') + var.put(u'typePath', var.get(u'typePath').callprop(u'resolve')) + if var.get(u'typePath').callprop(u'isLiteral').neg(): + return var.get('undefined') + var.put(u'typeValue', var.get(u'typePath').get(u'node').get(u'value')) + if PyJsStrictNeq(var.get(u'typeValue',throw=False).typeof(),Js(u'string')): + return var.get('undefined') + PyJs_Object_1997_ = Js({u'name':var.get(u'name')}) + if var.get(u'typeofPath').callprop(u'get', Js(u'argument')).callprop(u'isIdentifier', PyJs_Object_1997_).neg(): + return var.get('undefined') + return var.get(u't').callprop(u'createTypeAnnotationBasedOnTypeof', var.get(u'typePath').get(u'node').get(u'value')) + PyJsHoisted_inferAnnotationFromBinaryExpression_.func_name = u'inferAnnotationFromBinaryExpression' + var.put(u'inferAnnotationFromBinaryExpression', PyJsHoisted_inferAnnotationFromBinaryExpression_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1989_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1989_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_getConstantViolationsBefore_(binding, path, functions, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'functions':functions, u'binding':binding, u'arguments':arguments}, var) + var.registers([u'path', u'violations', u'binding', u'functions']) + var.put(u'violations', var.get(u'binding').get(u'constantViolations').callprop(u'slice')) + var.get(u'violations').callprop(u'unshift', var.get(u'binding').get(u'path')) + @Js + def PyJs_anonymous_1992_(violation, this, arguments, var=var): + var = Scope({u'violation':violation, u'this':this, u'arguments':arguments}, var) + var.registers([u'status', u'violation']) + var.put(u'violation', var.get(u'violation').callprop(u'resolve')) + var.put(u'status', var.get(u'violation').callprop(u'_guessExecutionStatusRelativeTo', var.get(u'path'))) + if (var.get(u'functions') and PyJsStrictEq(var.get(u'status'),Js(u'function'))): + var.get(u'functions').callprop(u'push', var.get(u'violation')) + return PyJsStrictEq(var.get(u'status'),Js(u'before')) + PyJs_anonymous_1992_._set_name(u'anonymous') + return var.get(u'violations').callprop(u'filter', PyJs_anonymous_1992_) + PyJsHoisted_getConstantViolationsBefore_.func_name = u'getConstantViolationsBefore' + var.put(u'getConstantViolationsBefore', PyJsHoisted_getConstantViolationsBefore_) + @Js + def PyJsHoisted_getConditionalAnnotation_(path, name, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'name':name, u'arguments':arguments}, var) + var.registers([u'paths', u'name', u'test', u'path', u'ifStatement', u'type', u'types', u'_path']) + var.put(u'ifStatement', var.get(u'getParentConditionalPath')(var.get(u'path'))) + if var.get(u'ifStatement').neg(): + return var.get('undefined') + var.put(u'test', var.get(u'ifStatement').callprop(u'get', Js(u'test'))) + var.put(u'paths', Js([var.get(u'test')])) + var.put(u'types', Js([])) + while 1: + var.put(u'_path', var.get(u'paths').callprop(u'shift').callprop(u'resolve')) + if var.get(u'_path').callprop(u'isLogicalExpression'): + var.get(u'paths').callprop(u'push', var.get(u'_path').callprop(u'get', Js(u'left'))) + var.get(u'paths').callprop(u'push', var.get(u'_path').callprop(u'get', Js(u'right'))) + if var.get(u'_path').callprop(u'isBinaryExpression'): + var.put(u'type', var.get(u'inferAnnotationFromBinaryExpression')(var.get(u'name'), var.get(u'_path'))) + if var.get(u'type'): + var.get(u'types').callprop(u'push', var.get(u'type')) + if not var.get(u'paths').get(u'length'): + break + if var.get(u'types').get(u'length'): + PyJs_Object_1998_ = Js({u'typeAnnotation':var.get(u't').callprop(u'createUnionTypeAnnotation', var.get(u'types')),u'ifStatement':var.get(u'ifStatement')}) + return PyJs_Object_1998_ + else: + return var.get(u'getConditionalAnnotation')(var.get(u'ifStatement'), var.get(u'name')) + PyJsHoisted_getConditionalAnnotation_.func_name = u'getConditionalAnnotation' + var.put(u'getConditionalAnnotation', PyJsHoisted_getConditionalAnnotation_) + @Js + def PyJsHoisted_getTypeAnnotationBindingConstantViolations_(path, name, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'name':name, u'arguments':arguments}, var) + var.registers([u'_isArray', u'_iterator', u'name', u'violation', u'binding', u'functionConstantViolations', u'_i', u'types', u'path', u'_ref', u'testType', u'constantViolations']) + var.put(u'binding', var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'name'))) + var.put(u'types', Js([])) + var.get(u'path').put(u'typeAnnotation', var.get(u't').callprop(u'unionTypeAnnotation', var.get(u'types'))) + var.put(u'functionConstantViolations', Js([])) + var.put(u'constantViolations', var.get(u'getConstantViolationsBefore')(var.get(u'binding'), var.get(u'path'), var.get(u'functionConstantViolations'))) + var.put(u'testType', var.get(u'getConditionalAnnotation')(var.get(u'path'), var.get(u'name'))) + if var.get(u'testType'): + @Js + def PyJs_anonymous_1990_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'testConstantViolations']) + var.put(u'testConstantViolations', var.get(u'getConstantViolationsBefore')(var.get(u'binding'), var.get(u'testType').get(u'ifStatement'))) + @Js + def PyJs_anonymous_1991_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u'testConstantViolations').callprop(u'indexOf', var.get(u'path'))<Js(0.0)) + PyJs_anonymous_1991_._set_name(u'anonymous') + var.put(u'constantViolations', var.get(u'constantViolations').callprop(u'filter', PyJs_anonymous_1991_)) + var.get(u'types').callprop(u'push', var.get(u'testType').get(u'typeAnnotation')) + PyJs_anonymous_1990_._set_name(u'anonymous') + PyJs_anonymous_1990_() + if var.get(u'constantViolations').get(u'length'): + var.put(u'constantViolations', var.get(u'constantViolations').callprop(u'concat', var.get(u'functionConstantViolations'))) + #for JS loop + var.put(u'_iterator', var.get(u'constantViolations')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'violation', var.get(u'_ref')) + var.get(u'types').callprop(u'push', var.get(u'violation').callprop(u'getTypeAnnotation')) + + if var.get(u'types').get(u'length'): + return var.get(u't').callprop(u'createUnionTypeAnnotation', var.get(u'types')) + PyJsHoisted_getTypeAnnotationBindingConstantViolations_.func_name = u'getTypeAnnotationBindingConstantViolations' + var.put(u'getTypeAnnotationBindingConstantViolations', PyJsHoisted_getTypeAnnotationBindingConstantViolations_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_1987_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'binding']) + if var.get(u"this").callprop(u'isReferenced').neg(): + return var.get('undefined') + var.put(u'binding', var.get(u"this").get(u'scope').callprop(u'getBinding', var.get(u'node').get(u'name'))) + if var.get(u'binding'): + if var.get(u'binding').get(u'identifier').get(u'typeAnnotation'): + return var.get(u'binding').get(u'identifier').get(u'typeAnnotation') + else: + return var.get(u'getTypeAnnotationBindingConstantViolations')(var.get(u"this"), var.get(u'node').get(u'name')) + if PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'undefined')): + return var.get(u't').callprop(u'voidTypeAnnotation') + else: + if (PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'NaN')) or PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'Infinity'))): + return var.get(u't').callprop(u'numberTypeAnnotation') + else: + if PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'arguments')): + pass + PyJs_anonymous_1987_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1987_) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1986_._set_name(u'anonymous') +PyJs_Object_1999_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_2000_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'CallExpression', u'UpdateExpression', u'module', u'ObjectExpression', u'_interopRequireDefault', u'resolveCall', u'RegExpLiteral', u'ArrayExpression', u'Func', u'AssignmentExpression', u'exports', u'_interopRequireWildcard', u'RestElement', u'_babelTypes', u'NullLiteral', u'TypeCastExpression', u'SequenceExpression', u'BinaryExpression', u'BooleanLiteral', u'ConditionalExpression', u'UnaryExpression', u'NewExpression', u'require', u'StringLiteral', u'NumericLiteral', u'TaggedTemplateExpression', u't', u'_infererReference', u'TemplateLiteral', u'LogicalExpression', u'VariableDeclarator']) + @Js + def PyJsHoisted_CallExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'resolveCall')(var.get(u"this").callprop(u'get', Js(u'callee'))) + PyJsHoisted_CallExpression_.func_name = u'CallExpression' + var.put(u'CallExpression', PyJsHoisted_CallExpression_) + @Js + def PyJsHoisted_UpdateExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'operator', u'node']) + var.put(u'operator', var.get(u'node').get(u'operator')) + if (PyJsStrictEq(var.get(u'operator'),Js(u'++')) or PyJsStrictEq(var.get(u'operator'),Js(u'--'))): + return var.get(u't').callprop(u'numberTypeAnnotation') + PyJsHoisted_UpdateExpression_.func_name = u'UpdateExpression' + var.put(u'UpdateExpression', PyJsHoisted_UpdateExpression_) + @Js + def PyJsHoisted_ObjectExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'Object'))) + PyJsHoisted_ObjectExpression_.func_name = u'ObjectExpression' + var.put(u'ObjectExpression', PyJsHoisted_ObjectExpression_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2004_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2004_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_resolveCall_(callee, this, arguments, var=var): + var = Scope({u'this':this, u'callee':callee, u'arguments':arguments}, var) + var.registers([u'callee']) + var.put(u'callee', var.get(u'callee').callprop(u'resolve')) + if var.get(u'callee').callprop(u'isFunction'): + if var.get(u'callee').callprop(u'is', Js(u'async')): + if var.get(u'callee').callprop(u'is', Js(u'generator')): + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'AsyncIterator'))) + else: + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'Promise'))) + else: + if var.get(u'callee').get(u'node').get(u'returnType'): + return var.get(u'callee').get(u'node').get(u'returnType') + else: + pass + PyJsHoisted_resolveCall_.func_name = u'resolveCall' + var.put(u'resolveCall', PyJsHoisted_resolveCall_) + @Js + def PyJsHoisted_RegExpLiteral_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'RegExp'))) + PyJsHoisted_RegExpLiteral_.func_name = u'RegExpLiteral' + var.put(u'RegExpLiteral', PyJsHoisted_RegExpLiteral_) + @Js + def PyJsHoisted_ArrayExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'Array'))) + PyJsHoisted_ArrayExpression_.func_name = u'ArrayExpression' + var.put(u'ArrayExpression', PyJsHoisted_ArrayExpression_) + @Js + def PyJsHoisted_Func_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'Function'))) + PyJsHoisted_Func_.func_name = u'Func' + var.put(u'Func', PyJsHoisted_Func_) + @Js + def PyJsHoisted_AssignmentExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'get', Js(u'right')).callprop(u'getTypeAnnotation') + PyJsHoisted_AssignmentExpression_.func_name = u'AssignmentExpression' + var.put(u'AssignmentExpression', PyJsHoisted_AssignmentExpression_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2003_ = Js({}) + var.put(u'newObj', PyJs_Object_2003_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_RestElement_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'ArrayExpression')() + PyJsHoisted_RestElement_.func_name = u'RestElement' + var.put(u'RestElement', PyJsHoisted_RestElement_) + @Js + def PyJsHoisted_NullLiteral_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'nullLiteralTypeAnnotation') + PyJsHoisted_NullLiteral_.func_name = u'NullLiteral' + var.put(u'NullLiteral', PyJsHoisted_NullLiteral_) + @Js + def PyJsHoisted_TypeCastExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return var.get(u'node').get(u'typeAnnotation') + PyJsHoisted_TypeCastExpression_.func_name = u'TypeCastExpression' + var.put(u'TypeCastExpression', PyJsHoisted_TypeCastExpression_) + @Js + def PyJsHoisted_SequenceExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'get', Js(u'expressions')).callprop(u'pop').callprop(u'getTypeAnnotation') + PyJsHoisted_SequenceExpression_.func_name = u'SequenceExpression' + var.put(u'SequenceExpression', PyJsHoisted_SequenceExpression_) + @Js + def PyJsHoisted_BinaryExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'operator', u'node', u'right', u'left']) + var.put(u'operator', var.get(u'node').get(u'operator')) + if (var.get(u't').get(u'NUMBER_BINARY_OPERATORS').callprop(u'indexOf', var.get(u'operator'))>=Js(0.0)): + return var.get(u't').callprop(u'numberTypeAnnotation') + else: + if (var.get(u't').get(u'BOOLEAN_BINARY_OPERATORS').callprop(u'indexOf', var.get(u'operator'))>=Js(0.0)): + return var.get(u't').callprop(u'booleanTypeAnnotation') + else: + if PyJsStrictEq(var.get(u'operator'),Js(u'+')): + var.put(u'right', var.get(u"this").callprop(u'get', Js(u'right'))) + var.put(u'left', var.get(u"this").callprop(u'get', Js(u'left'))) + if (var.get(u'left').callprop(u'isBaseType', Js(u'number')) and var.get(u'right').callprop(u'isBaseType', Js(u'number'))): + return var.get(u't').callprop(u'numberTypeAnnotation') + else: + if (var.get(u'left').callprop(u'isBaseType', Js(u'string')) or var.get(u'right').callprop(u'isBaseType', Js(u'string'))): + return var.get(u't').callprop(u'stringTypeAnnotation') + return var.get(u't').callprop(u'unionTypeAnnotation', Js([var.get(u't').callprop(u'stringTypeAnnotation'), var.get(u't').callprop(u'numberTypeAnnotation')])) + PyJsHoisted_BinaryExpression_.func_name = u'BinaryExpression' + var.put(u'BinaryExpression', PyJsHoisted_BinaryExpression_) + @Js + def PyJsHoisted_BooleanLiteral_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'booleanTypeAnnotation') + PyJsHoisted_BooleanLiteral_.func_name = u'BooleanLiteral' + var.put(u'BooleanLiteral', PyJsHoisted_BooleanLiteral_) + @Js + def PyJsHoisted_ConditionalExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'createUnionTypeAnnotation', Js([var.get(u"this").callprop(u'get', Js(u'consequent')).callprop(u'getTypeAnnotation'), var.get(u"this").callprop(u'get', Js(u'alternate')).callprop(u'getTypeAnnotation')])) + PyJsHoisted_ConditionalExpression_.func_name = u'ConditionalExpression' + var.put(u'ConditionalExpression', PyJsHoisted_ConditionalExpression_) + @Js + def PyJsHoisted_UnaryExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'operator', u'node']) + var.put(u'operator', var.get(u'node').get(u'operator')) + if PyJsStrictEq(var.get(u'operator'),Js(u'void')): + return var.get(u't').callprop(u'voidTypeAnnotation') + else: + if (var.get(u't').get(u'NUMBER_UNARY_OPERATORS').callprop(u'indexOf', var.get(u'operator'))>=Js(0.0)): + return var.get(u't').callprop(u'numberTypeAnnotation') + else: + if (var.get(u't').get(u'STRING_UNARY_OPERATORS').callprop(u'indexOf', var.get(u'operator'))>=Js(0.0)): + return var.get(u't').callprop(u'stringTypeAnnotation') + else: + if (var.get(u't').get(u'BOOLEAN_UNARY_OPERATORS').callprop(u'indexOf', var.get(u'operator'))>=Js(0.0)): + return var.get(u't').callprop(u'booleanTypeAnnotation') + PyJsHoisted_UnaryExpression_.func_name = u'UnaryExpression' + var.put(u'UnaryExpression', PyJsHoisted_UnaryExpression_) + @Js + def PyJsHoisted_NewExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'get', Js(u'callee')).callprop(u'isIdentifier'): + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u'node').get(u'callee')) + PyJsHoisted_NewExpression_.func_name = u'NewExpression' + var.put(u'NewExpression', PyJsHoisted_NewExpression_) + @Js + def PyJsHoisted_StringLiteral_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'stringTypeAnnotation') + PyJsHoisted_StringLiteral_.func_name = u'StringLiteral' + var.put(u'StringLiteral', PyJsHoisted_StringLiteral_) + @Js + def PyJsHoisted_NumericLiteral_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'numberTypeAnnotation') + PyJsHoisted_NumericLiteral_.func_name = u'NumericLiteral' + var.put(u'NumericLiteral', PyJsHoisted_NumericLiteral_) + @Js + def PyJsHoisted_TaggedTemplateExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'resolveCall')(var.get(u"this").callprop(u'get', Js(u'tag'))) + PyJsHoisted_TaggedTemplateExpression_.func_name = u'TaggedTemplateExpression' + var.put(u'TaggedTemplateExpression', PyJsHoisted_TaggedTemplateExpression_) + @Js + def PyJsHoisted_TemplateLiteral_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'stringTypeAnnotation') + PyJsHoisted_TemplateLiteral_.func_name = u'TemplateLiteral' + var.put(u'TemplateLiteral', PyJsHoisted_TemplateLiteral_) + @Js + def PyJsHoisted_LogicalExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'createUnionTypeAnnotation', Js([var.get(u"this").callprop(u'get', Js(u'left')).callprop(u'getTypeAnnotation'), var.get(u"this").callprop(u'get', Js(u'right')).callprop(u'getTypeAnnotation')])) + PyJsHoisted_LogicalExpression_.func_name = u'LogicalExpression' + var.put(u'LogicalExpression', PyJsHoisted_LogicalExpression_) + @Js + def PyJsHoisted_VariableDeclarator_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'id']) + var.put(u'id', var.get(u"this").callprop(u'get', Js(u'id'))) + if var.get(u'id').callprop(u'isIdentifier'): + return var.get(u"this").callprop(u'get', Js(u'init')).callprop(u'getTypeAnnotation') + else: + return var.get('undefined') + PyJsHoisted_VariableDeclarator_.func_name = u'VariableDeclarator' + var.put(u'VariableDeclarator', PyJsHoisted_VariableDeclarator_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'ClassDeclaration', var.get(u'exports').put(u'ClassExpression', var.get(u'exports').put(u'FunctionDeclaration', var.get(u'exports').put(u'ArrowFunctionExpression', var.get(u'exports').put(u'FunctionExpression', var.get(u'exports').put(u'Identifier', var.get(u'undefined'))))))) + var.put(u'_infererReference', var.get(u'require')(Js(u'./inferer-reference'))) + @Js + def PyJs_get_2002_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2002_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_infererReference')).get(u'default') + PyJs_get_2002_._set_name(u'get') + PyJs_Object_2001_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2002_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'Identifier'), PyJs_Object_2001_) + var.get(u'exports').put(u'VariableDeclarator', var.get(u'VariableDeclarator')) + var.get(u'exports').put(u'TypeCastExpression', var.get(u'TypeCastExpression')) + var.get(u'exports').put(u'NewExpression', var.get(u'NewExpression')) + var.get(u'exports').put(u'TemplateLiteral', var.get(u'TemplateLiteral')) + var.get(u'exports').put(u'UnaryExpression', var.get(u'UnaryExpression')) + var.get(u'exports').put(u'BinaryExpression', var.get(u'BinaryExpression')) + var.get(u'exports').put(u'LogicalExpression', var.get(u'LogicalExpression')) + var.get(u'exports').put(u'ConditionalExpression', var.get(u'ConditionalExpression')) + var.get(u'exports').put(u'SequenceExpression', var.get(u'SequenceExpression')) + var.get(u'exports').put(u'AssignmentExpression', var.get(u'AssignmentExpression')) + var.get(u'exports').put(u'UpdateExpression', var.get(u'UpdateExpression')) + var.get(u'exports').put(u'StringLiteral', var.get(u'StringLiteral')) + var.get(u'exports').put(u'NumericLiteral', var.get(u'NumericLiteral')) + var.get(u'exports').put(u'BooleanLiteral', var.get(u'BooleanLiteral')) + var.get(u'exports').put(u'NullLiteral', var.get(u'NullLiteral')) + var.get(u'exports').put(u'RegExpLiteral', var.get(u'RegExpLiteral')) + var.get(u'exports').put(u'ObjectExpression', var.get(u'ObjectExpression')) + var.get(u'exports').put(u'ArrayExpression', var.get(u'ArrayExpression')) + var.get(u'exports').put(u'RestElement', var.get(u'RestElement')) + var.get(u'exports').put(u'CallExpression', var.get(u'CallExpression')) + var.get(u'exports').put(u'TaggedTemplateExpression', var.get(u'TaggedTemplateExpression')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + var.get(u'TypeCastExpression').put(u'validParent', var.get(u'true')) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + var.get(u'RestElement').put(u'validParent', var.get(u'true')) + pass + var.get(u'exports').put(u'FunctionExpression', var.get(u'Func')) + var.get(u'exports').put(u'ArrowFunctionExpression', var.get(u'Func')) + var.get(u'exports').put(u'FunctionDeclaration', var.get(u'Func')) + var.get(u'exports').put(u'ClassExpression', var.get(u'Func')) + var.get(u'exports').put(u'ClassDeclaration', var.get(u'Func')) + pass + pass + pass +PyJs_anonymous_2000_._set_name(u'anonymous') +PyJs_Object_2005_ = Js({u'./inferer-reference':Js(234.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_2006_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_resolve', u'is', u'exports', u'module', u'isnt', u'canSwapBetweenExpressionAndStatement', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'referencesImport', u'_typeof2', u'_typeof3', u'canHaveVariableDeclarationOrExpression', u'isStatementOrBlock', u't', u'has', u'_guessExecutionStatusRelativeTo', u'_includes', u'isStatic', u'isCompletionRecord', u'_interopRequireWildcard', u'_babelTypes', u'_includes2', u'equals', u'isNodeType', u'_guessExecutionStatusRelativeToDifferentFunctions', u'resolve', u'willIMaybeExecuteBefore', u'require', u'matchesPattern', u'getSource']) + @Js + def PyJsHoisted__resolve_(dangerous, resolved, this, arguments, var=var): + var = Scope({u'resolved':resolved, u'dangerous':dangerous, u'this':this, u'arguments':arguments}, var) + var.registers([u'resolved', u'dangerous', u'_isArray3', u'target', u'_this', u'_ret', u'_i3', u'binding', u'elems', u'prop', u'match', u'key', u'props', u'targetKey', u'elem', u'targetName', u'_ref3', u'_iterator3']) + var.put(u'_this', var.get(u"this")) + if (var.get(u'resolved') and (var.get(u'resolved').callprop(u'indexOf', var.get(u"this"))>=Js(0.0))): + return var.get('undefined') + var.put(u'resolved', (var.get(u'resolved') or Js([]))) + var.get(u'resolved').callprop(u'push', var.get(u"this")) + if var.get(u"this").callprop(u'isVariableDeclarator'): + if var.get(u"this").callprop(u'get', Js(u'id')).callprop(u'isIdentifier'): + return var.get(u"this").callprop(u'get', Js(u'init')).callprop(u'resolve', var.get(u'dangerous'), var.get(u'resolved')) + else: + pass + else: + if var.get(u"this").callprop(u'isReferencedIdentifier'): + var.put(u'binding', var.get(u"this").get(u'scope').callprop(u'getBinding', var.get(u"this").get(u'node').get(u'name'))) + if var.get(u'binding').neg(): + return var.get('undefined') + if var.get(u'binding').get(u'constant').neg(): + return var.get('undefined') + if PyJsStrictEq(var.get(u'binding').get(u'kind'),Js(u'module')): + return var.get('undefined') + if PyJsStrictNeq(var.get(u'binding').get(u'path'),var.get(u"this")): + @Js + def PyJs_anonymous_2010_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'ret']) + var.put(u'ret', var.get(u'binding').get(u'path').callprop(u'resolve', var.get(u'dangerous'), var.get(u'resolved'))) + @Js + def PyJs_anonymous_2011_(parent, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'parent']) + return PyJsStrictEq(var.get(u'parent').get(u'node'),var.get(u'ret').get(u'node')) + PyJs_anonymous_2011_._set_name(u'anonymous') + if var.get(u'_this').callprop(u'find', PyJs_anonymous_2011_): + PyJs_Object_2012_ = Js({u'v':PyJsComma(Js(0.0), Js(None))}) + return PyJs_Object_2012_ + PyJs_Object_2013_ = Js({u'v':var.get(u'ret')}) + return PyJs_Object_2013_ + PyJs_anonymous_2010_._set_name(u'anonymous') + var.put(u'_ret', PyJs_anonymous_2010_()) + if PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'_ret',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'_ret'))),Js(u'object')): + return var.get(u'_ret').get(u'v') + else: + if var.get(u"this").callprop(u'isTypeCastExpression'): + return var.get(u"this").callprop(u'get', Js(u'expression')).callprop(u'resolve', var.get(u'dangerous'), var.get(u'resolved')) + else: + if (var.get(u'dangerous') and var.get(u"this").callprop(u'isMemberExpression')): + var.put(u'targetKey', var.get(u"this").callprop(u'toComputedKey')) + if var.get(u't').callprop(u'isLiteral', var.get(u'targetKey')).neg(): + return var.get('undefined') + var.put(u'targetName', var.get(u'targetKey').get(u'value')) + var.put(u'target', var.get(u"this").callprop(u'get', Js(u'object')).callprop(u'resolve', var.get(u'dangerous'), var.get(u'resolved'))) + if var.get(u'target').callprop(u'isObjectExpression'): + var.put(u'props', var.get(u'target').callprop(u'get', Js(u'properties'))) + #for JS loop + var.put(u'_iterator3', var.get(u'props')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'prop', var.get(u'_ref3')) + if var.get(u'prop').callprop(u'isProperty').neg(): + continue + var.put(u'key', var.get(u'prop').callprop(u'get', Js(u'key'))) + PyJs_Object_2014_ = Js({u'name':var.get(u'targetName')}) + var.put(u'match', (var.get(u'prop').callprop(u'isnt', Js(u'computed')) and var.get(u'key').callprop(u'isIdentifier', PyJs_Object_2014_))) + PyJs_Object_2015_ = Js({u'value':var.get(u'targetName')}) + var.put(u'match', (var.get(u'match') or var.get(u'key').callprop(u'isLiteral', PyJs_Object_2015_))) + if var.get(u'match'): + return var.get(u'prop').callprop(u'get', Js(u'value')).callprop(u'resolve', var.get(u'dangerous'), var.get(u'resolved')) + + else: + if (var.get(u'target').callprop(u'isArrayExpression') and var.get(u'isNaN')((+var.get(u'targetName'))).neg()): + var.put(u'elems', var.get(u'target').callprop(u'get', Js(u'elements'))) + var.put(u'elem', var.get(u'elems').get(var.get(u'targetName'))) + if var.get(u'elem'): + return var.get(u'elem').callprop(u'resolve', var.get(u'dangerous'), var.get(u'resolved')) + PyJsHoisted__resolve_.func_name = u'_resolve' + var.put(u'_resolve', PyJsHoisted__resolve_) + @Js + def PyJsHoisted_isStatic_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").get(u'scope').callprop(u'isStatic', var.get(u"this").get(u'node')) + PyJsHoisted_isStatic_.func_name = u'isStatic' + var.put(u'isStatic', PyJsHoisted_isStatic_) + @Js + def PyJsHoisted_isCompletionRecord_(allowInsideFunction, this, arguments, var=var): + var = Scope({u'this':this, u'allowInsideFunction':allowInsideFunction, u'arguments':arguments}, var) + var.registers([u'path', u'allowInsideFunction', u'container', u'first']) + var.put(u'path', var.get(u"this")) + var.put(u'first', var.get(u'true')) + while 1: + var.put(u'container', var.get(u'path').get(u'container')) + if (var.get(u'path').callprop(u'isFunction') and var.get(u'first').neg()): + return var.get(u'allowInsideFunction').neg().neg() + var.put(u'first', Js(False)) + if (var.get(u'Array').callprop(u'isArray', var.get(u'container')) and PyJsStrictNeq(var.get(u'path').get(u'key'),(var.get(u'container').get(u'length')-Js(1.0)))): + return Js(False) + if not (var.put(u'path', var.get(u'path').get(u'parentPath')) and var.get(u'path').callprop(u'isProgram').neg()): + break + return var.get(u'true') + PyJsHoisted_isCompletionRecord_.func_name = u'isCompletionRecord' + var.put(u'isCompletionRecord', PyJsHoisted_isCompletionRecord_) + @Js + def PyJsHoisted_willIMaybeExecuteBefore_(target, this, arguments, var=var): + var = Scope({u'this':this, u'target':target, u'arguments':arguments}, var) + var.registers([u'target']) + return PyJsStrictNeq(var.get(u"this").callprop(u'_guessExecutionStatusRelativeTo', var.get(u'target')),Js(u'after')) + PyJsHoisted_willIMaybeExecuteBefore_.func_name = u'willIMaybeExecuteBefore' + var.put(u'willIMaybeExecuteBefore', PyJsHoisted_willIMaybeExecuteBefore_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2007_ = Js({}) + var.put(u'newObj', PyJs_Object_2007_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_canHaveVariableDeclarationOrExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return ((PyJsStrictEq(var.get(u"this").get(u'key'),Js(u'init')) or PyJsStrictEq(var.get(u"this").get(u'key'),Js(u'left'))) and var.get(u"this").get(u'parentPath').callprop(u'isFor')) + PyJsHoisted_canHaveVariableDeclarationOrExpression_.func_name = u'canHaveVariableDeclarationOrExpression' + var.put(u'canHaveVariableDeclarationOrExpression', PyJsHoisted_canHaveVariableDeclarationOrExpression_) + @Js + def PyJsHoisted__guessExecutionStatusRelativeTo_(target, this, arguments, var=var): + var = Scope({u'this':this, u'target':target, u'arguments':arguments}, var) + var.registers([u'status', u'targetKeyPosition', u'target', u'selfIndex', u'selfPath', u'commonPath', u'targetRelationship', u'selfRelationship', u'selfFuncParent', u'selfPaths', u'targetFuncParent', u'targetPaths', u'selfKeyPosition', u'targetIndex']) + var.put(u'targetFuncParent', var.get(u'target').get(u'scope').callprop(u'getFunctionParent')) + var.put(u'selfFuncParent', var.get(u"this").get(u'scope').callprop(u'getFunctionParent')) + if PyJsStrictNeq(var.get(u'targetFuncParent').get(u'node'),var.get(u'selfFuncParent').get(u'node')): + var.put(u'status', var.get(u"this").callprop(u'_guessExecutionStatusRelativeToDifferentFunctions', var.get(u'targetFuncParent'))) + if var.get(u'status'): + return var.get(u'status') + else: + var.put(u'target', var.get(u'targetFuncParent').get(u'path')) + var.put(u'targetPaths', var.get(u'target').callprop(u'getAncestry')) + if (var.get(u'targetPaths').callprop(u'indexOf', var.get(u"this"))>=Js(0.0)): + return Js(u'after') + var.put(u'selfPaths', var.get(u"this").callprop(u'getAncestry')) + var.put(u'commonPath', PyJsComma(Js(0.0), Js(None))) + var.put(u'targetIndex', PyJsComma(Js(0.0), Js(None))) + var.put(u'selfIndex', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'selfIndex', Js(0.0)) + while (var.get(u'selfIndex')<var.get(u'selfPaths').get(u'length')): + try: + var.put(u'selfPath', var.get(u'selfPaths').get(var.get(u'selfIndex'))) + var.put(u'targetIndex', var.get(u'targetPaths').callprop(u'indexOf', var.get(u'selfPath'))) + if (var.get(u'targetIndex')>=Js(0.0)): + var.put(u'commonPath', var.get(u'selfPath')) + break + finally: + (var.put(u'selfIndex',Js(var.get(u'selfIndex').to_number())+Js(1))-Js(1)) + if var.get(u'commonPath').neg(): + return Js(u'before') + var.put(u'targetRelationship', var.get(u'targetPaths').get((var.get(u'targetIndex')-Js(1.0)))) + var.put(u'selfRelationship', var.get(u'selfPaths').get((var.get(u'selfIndex')-Js(1.0)))) + if (var.get(u'targetRelationship').neg() or var.get(u'selfRelationship').neg()): + return Js(u'before') + if (var.get(u'targetRelationship').get(u'listKey') and PyJsStrictEq(var.get(u'targetRelationship').get(u'container'),var.get(u'selfRelationship').get(u'container'))): + return (Js(u'before') if (var.get(u'targetRelationship').get(u'key')>var.get(u'selfRelationship').get(u'key')) else Js(u'after')) + var.put(u'targetKeyPosition', var.get(u't').get(u'VISITOR_KEYS').get(var.get(u'targetRelationship').get(u'type')).callprop(u'indexOf', var.get(u'targetRelationship').get(u'key'))) + var.put(u'selfKeyPosition', var.get(u't').get(u'VISITOR_KEYS').get(var.get(u'selfRelationship').get(u'type')).callprop(u'indexOf', var.get(u'selfRelationship').get(u'key'))) + return (Js(u'before') if (var.get(u'targetKeyPosition')>var.get(u'selfKeyPosition')) else Js(u'after')) + PyJsHoisted__guessExecutionStatusRelativeTo_.func_name = u'_guessExecutionStatusRelativeTo' + var.put(u'_guessExecutionStatusRelativeTo', PyJsHoisted__guessExecutionStatusRelativeTo_) + @Js + def PyJsHoisted_equals_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + return PyJsStrictEq(var.get(u"this").get(u'node').get(var.get(u'key')),var.get(u'value')) + PyJsHoisted_equals_.func_name = u'equals' + var.put(u'equals', PyJsHoisted_equals_) + @Js + def PyJsHoisted_isNodeType_(type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments}, var) + var.registers([u'type']) + return var.get(u't').callprop(u'isType', var.get(u"this").get(u'type'), var.get(u'type')) + PyJsHoisted_isNodeType_.func_name = u'isNodeType' + var.put(u'isNodeType', PyJsHoisted_isNodeType_) + @Js + def PyJsHoisted_isStatementOrBlock_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if (var.get(u"this").get(u'parentPath').callprop(u'isLabeledStatement') or var.get(u't').callprop(u'isBlockStatement', var.get(u"this").get(u'container'))): + return Js(False) + else: + return PyJsComma(Js(0.0),var.get(u'_includes2').get(u'default'))(var.get(u't').get(u'STATEMENT_OR_BLOCK_KEYS'), var.get(u"this").get(u'key')) + PyJsHoisted_isStatementOrBlock_.func_name = u'isStatementOrBlock' + var.put(u'isStatementOrBlock', PyJsHoisted_isStatementOrBlock_) + @Js + def PyJsHoisted_isnt_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u"this").callprop(u'has', var.get(u'key')).neg() + PyJsHoisted_isnt_.func_name = u'isnt' + var.put(u'isnt', PyJsHoisted_isnt_) + @Js + def PyJsHoisted_resolve_(dangerous, resolved, this, arguments, var=var): + var = Scope({u'resolved':resolved, u'dangerous':dangerous, u'this':this, u'arguments':arguments}, var) + var.registers([u'resolved', u'dangerous']) + return (var.get(u"this").callprop(u'_resolve', var.get(u'dangerous'), var.get(u'resolved')) or var.get(u"this")) + PyJsHoisted_resolve_.func_name = u'resolve' + var.put(u'resolve', PyJsHoisted_resolve_) + @Js + def PyJsHoisted_matchesPattern_(pattern, allowPartial, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'arguments':arguments, u'allowPartial':allowPartial}, var) + var.registers([u'node', u'search', u'i', u'pattern', u'allowPartial', u'matches', u'parts']) + @Js + def PyJsHoisted_matches_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'part', u'name']) + var.put(u'part', var.get(u'parts').get(var.get(u'i'))) + return (PyJsStrictEq(var.get(u'part'),Js(u'*')) or PyJsStrictEq(var.get(u'name'),var.get(u'part'))) + PyJsHoisted_matches_.func_name = u'matches' + var.put(u'matches', PyJsHoisted_matches_) + if var.get(u"this").callprop(u'isMemberExpression').neg(): + return Js(False) + var.put(u'parts', var.get(u'pattern').callprop(u'split', Js(u'.'))) + var.put(u'search', Js([var.get(u"this").get(u'node')])) + var.put(u'i', Js(0.0)) + pass + while var.get(u'search').get(u'length'): + var.put(u'node', var.get(u'search').callprop(u'shift')) + if (var.get(u'allowPartial') and PyJsStrictEq(var.get(u'i'),var.get(u'parts').get(u'length'))): + return var.get(u'true') + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + if var.get(u'matches')(var.get(u'node').get(u'name')).neg(): + return Js(False) + else: + if var.get(u't').callprop(u'isLiteral', var.get(u'node')): + if var.get(u'matches')(var.get(u'node').get(u'value')).neg(): + return Js(False) + else: + if var.get(u't').callprop(u'isMemberExpression', var.get(u'node')): + if (var.get(u'node').get(u'computed') and var.get(u't').callprop(u'isLiteral', var.get(u'node').get(u'property')).neg()): + return Js(False) + else: + var.get(u'search').callprop(u'unshift', var.get(u'node').get(u'property')) + var.get(u'search').callprop(u'unshift', var.get(u'node').get(u'object')) + continue + else: + if var.get(u't').callprop(u'isThisExpression', var.get(u'node')): + if var.get(u'matches')(Js(u'this')).neg(): + return Js(False) + else: + return Js(False) + if (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))>var.get(u'parts').get(u'length')): + return Js(False) + return PyJsStrictEq(var.get(u'i'),var.get(u'parts').get(u'length')) + PyJsHoisted_matchesPattern_.func_name = u'matchesPattern' + var.put(u'matchesPattern', PyJsHoisted_matchesPattern_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2008_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2008_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_getSource_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").get(u'node')) + if var.get(u'node').get(u'end'): + return var.get(u"this").get(u'hub').get(u'file').get(u'code').callprop(u'slice', var.get(u'node').get(u'start'), var.get(u'node').get(u'end')) + else: + return Js(u'') + PyJsHoisted_getSource_.func_name = u'getSource' + var.put(u'getSource', PyJsHoisted_getSource_) + @Js + def PyJsHoisted_has_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key', u'val']) + var.put(u'val', (var.get(u"this").get(u'node') and var.get(u"this").get(u'node').get(var.get(u'key')))) + if (var.get(u'val') and var.get(u'Array').callprop(u'isArray', var.get(u'val'))): + return var.get(u'val').get(u'length').neg().neg() + else: + return var.get(u'val').neg().neg() + PyJsHoisted_has_.func_name = u'has' + var.put(u'has', PyJsHoisted_has_) + @Js + def PyJsHoisted_referencesImport_(moduleSource, importName, this, arguments, var=var): + var = Scope({u'importName':importName, u'this':this, u'moduleSource':moduleSource, u'arguments':arguments}, var) + var.registers([u'importName', u'path', u'moduleSource', u'binding', u'parent']) + if var.get(u"this").callprop(u'isReferencedIdentifier').neg(): + return Js(False) + var.put(u'binding', var.get(u"this").get(u'scope').callprop(u'getBinding', var.get(u"this").get(u'node').get(u'name'))) + if (var.get(u'binding').neg() or PyJsStrictNeq(var.get(u'binding').get(u'kind'),Js(u'module'))): + return Js(False) + var.put(u'path', var.get(u'binding').get(u'path')) + var.put(u'parent', var.get(u'path').get(u'parentPath')) + if var.get(u'parent').callprop(u'isImportDeclaration').neg(): + return Js(False) + if PyJsStrictEq(var.get(u'parent').get(u'node').get(u'source').get(u'value'),var.get(u'moduleSource')): + if var.get(u'importName').neg(): + return var.get(u'true') + else: + return Js(False) + if (var.get(u'path').callprop(u'isImportDefaultSpecifier') and PyJsStrictEq(var.get(u'importName'),Js(u'default'))): + return var.get(u'true') + if (var.get(u'path').callprop(u'isImportNamespaceSpecifier') and PyJsStrictEq(var.get(u'importName'),Js(u'*'))): + return var.get(u'true') + if (var.get(u'path').callprop(u'isImportSpecifier') and PyJsStrictEq(var.get(u'path').get(u'node').get(u'imported').get(u'name'),var.get(u'importName'))): + return var.get(u'true') + return Js(False) + PyJsHoisted_referencesImport_.func_name = u'referencesImport' + var.put(u'referencesImport', PyJsHoisted_referencesImport_) + @Js + def PyJsHoisted__guessExecutionStatusRelativeToDifferentFunctions_(targetFuncParent, this, arguments, var=var): + var = Scope({u'this':this, u'targetFuncParent':targetFuncParent, u'arguments':arguments}, var) + var.registers([u'status', u'targetFuncPath', u'referencePaths', u'_iterator', u'_isArray2', u'binding', u'_isArray', u'_i2', u'childOfFunction', u'targetFuncParent', u'_i', u'_path', u'path', u'_ref', u'_ref2', u'allStatus', u'_iterator2']) + var.put(u'targetFuncPath', var.get(u'targetFuncParent').get(u'path')) + if var.get(u'targetFuncPath').callprop(u'isFunctionDeclaration').neg(): + return var.get('undefined') + var.put(u'binding', var.get(u'targetFuncPath').get(u'scope').callprop(u'getBinding', var.get(u'targetFuncPath').get(u'node').get(u'id').get(u'name'))) + if var.get(u'binding').get(u'references').neg(): + return Js(u'before') + var.put(u'referencePaths', var.get(u'binding').get(u'referencePaths')) + #for JS loop + var.put(u'_iterator', var.get(u'referencePaths')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'path', var.get(u'_ref')) + if (PyJsStrictNeq(var.get(u'path').get(u'key'),Js(u'callee')) or var.get(u'path').get(u'parentPath').callprop(u'isCallExpression').neg()): + return var.get('undefined') + + var.put(u'allStatus', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'_iterator2', var.get(u'referencePaths')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'_path', var.get(u'_ref2')) + @Js + def PyJs_anonymous_2009_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return PyJsStrictEq(var.get(u'path').get(u'node'),var.get(u'targetFuncPath').get(u'node')) + PyJs_anonymous_2009_._set_name(u'anonymous') + var.put(u'childOfFunction', var.get(u'_path').callprop(u'find', PyJs_anonymous_2009_).neg().neg()) + if var.get(u'childOfFunction'): + continue + var.put(u'status', var.get(u"this").callprop(u'_guessExecutionStatusRelativeTo', var.get(u'_path'))) + if var.get(u'allStatus'): + if PyJsStrictNeq(var.get(u'allStatus'),var.get(u'status')): + return var.get('undefined') + else: + var.put(u'allStatus', var.get(u'status')) + + return var.get(u'allStatus') + PyJsHoisted__guessExecutionStatusRelativeToDifferentFunctions_.func_name = u'_guessExecutionStatusRelativeToDifferentFunctions' + var.put(u'_guessExecutionStatusRelativeToDifferentFunctions', PyJsHoisted__guessExecutionStatusRelativeToDifferentFunctions_) + @Js + def PyJsHoisted_canSwapBetweenExpressionAndStatement_(replacement, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'replacement':replacement}, var) + var.registers([u'replacement']) + if (PyJsStrictNeq(var.get(u"this").get(u'key'),Js(u'body')) or var.get(u"this").get(u'parentPath').callprop(u'isArrowFunctionExpression').neg()): + return Js(False) + if var.get(u"this").callprop(u'isExpression'): + return var.get(u't').callprop(u'isBlockStatement', var.get(u'replacement')) + else: + if var.get(u"this").callprop(u'isBlockStatement'): + return var.get(u't').callprop(u'isExpression', var.get(u'replacement')) + return Js(False) + PyJsHoisted_canSwapBetweenExpressionAndStatement_.func_name = u'canSwapBetweenExpressionAndStatement' + var.put(u'canSwapBetweenExpressionAndStatement', PyJsHoisted_canSwapBetweenExpressionAndStatement_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'is', var.get(u'undefined')) + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'matchesPattern', var.get(u'matchesPattern')) + var.get(u'exports').put(u'has', var.get(u'has')) + var.get(u'exports').put(u'isStatic', var.get(u'isStatic')) + var.get(u'exports').put(u'isnt', var.get(u'isnt')) + var.get(u'exports').put(u'equals', var.get(u'equals')) + var.get(u'exports').put(u'isNodeType', var.get(u'isNodeType')) + var.get(u'exports').put(u'canHaveVariableDeclarationOrExpression', var.get(u'canHaveVariableDeclarationOrExpression')) + var.get(u'exports').put(u'canSwapBetweenExpressionAndStatement', var.get(u'canSwapBetweenExpressionAndStatement')) + var.get(u'exports').put(u'isCompletionRecord', var.get(u'isCompletionRecord')) + var.get(u'exports').put(u'isStatementOrBlock', var.get(u'isStatementOrBlock')) + var.get(u'exports').put(u'referencesImport', var.get(u'referencesImport')) + var.get(u'exports').put(u'getSource', var.get(u'getSource')) + var.get(u'exports').put(u'willIMaybeExecuteBefore', var.get(u'willIMaybeExecuteBefore')) + var.get(u'exports').put(u'_guessExecutionStatusRelativeTo', var.get(u'_guessExecutionStatusRelativeTo')) + var.get(u'exports').put(u'_guessExecutionStatusRelativeToDifferentFunctions', var.get(u'_guessExecutionStatusRelativeToDifferentFunctions')) + var.get(u'exports').put(u'resolve', var.get(u'resolve')) + var.get(u'exports').put(u'_resolve', var.get(u'_resolve')) + var.put(u'_includes', var.get(u'require')(Js(u'lodash/includes'))) + var.put(u'_includes2', var.get(u'_interopRequireDefault')(var.get(u'_includes'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + var.put(u'is', var.get(u'exports').put(u'is', var.get(u'has'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_2006_._set_name(u'anonymous') +PyJs_Object_2016_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/typeof':Js(114.0),u'babel-types':Js(258.0),u'lodash/includes':Js(456.0)}) +@Js +def PyJs_anonymous_2017_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_classCallCheck2', u'PathHoister', u'_interopRequireWildcard', u'require', u'_babelTypes', u'module', u'referenceVisitor', u't', u'_interopRequireDefault', u'_classCallCheck3', u'_getIterator3', u'_getIterator2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2019_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2019_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2018_ = Js({}) + var.put(u'newObj', PyJs_Object_2018_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + @Js + def PyJs_ReferencedIdentifier_2021_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_2021_, u'arguments':arguments}, var) + var.registers([u'_isArray', u'_iterator', u'binding', u'violationPath', u'state', u'_i', u'path', u'_ref']) + if (var.get(u'path').callprop(u'isJSXIdentifier') and var.get(u'_babelTypes').get(u'react').callprop(u'isCompatTag', var.get(u'path').get(u'node').get(u'name'))): + return var.get('undefined') + var.put(u'binding', var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'path').get(u'node').get(u'name'))) + if var.get(u'binding').neg(): + return var.get('undefined') + if PyJsStrictNeq(var.get(u'binding'),var.get(u'state').get(u'scope').callprop(u'getBinding', var.get(u'path').get(u'node').get(u'name'))): + return var.get('undefined') + if var.get(u'binding').get(u'constant'): + var.get(u'state').get(u'bindings').put(var.get(u'path').get(u'node').get(u'name'), var.get(u'binding')) + else: + #for JS loop + var.put(u'_iterator', var.get(u'binding').get(u'constantViolations')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'violationPath', var.get(u'_ref')) + var.get(u'state').put(u'breakOnScopePaths', var.get(u'state').get(u'breakOnScopePaths').callprop(u'concat', var.get(u'violationPath').callprop(u'getAncestry'))) + + PyJs_ReferencedIdentifier_2021_._set_name(u'ReferencedIdentifier') + PyJs_Object_2020_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_2021_}) + var.put(u'referenceVisitor', PyJs_Object_2020_) + @Js + def PyJs_anonymous_2022_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'PathHoister']) + @Js + def PyJsHoisted_PathHoister_(path, scope, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'scope':scope}, var) + var.registers([u'path', u'scope']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'PathHoister')) + var.get(u"this").put(u'breakOnScopePaths', Js([])) + PyJs_Object_2023_ = Js({}) + var.get(u"this").put(u'bindings', PyJs_Object_2023_) + var.get(u"this").put(u'scopes', Js([])) + var.get(u"this").put(u'scope', var.get(u'scope')) + var.get(u"this").put(u'path', var.get(u'path')) + PyJsHoisted_PathHoister_.func_name = u'PathHoister' + var.put(u'PathHoister', PyJsHoisted_PathHoister_) + pass + @Js + def PyJs_isCompatibleScope_2024_(scope, this, arguments, var=var): + var = Scope({u'this':this, u'scope':scope, u'arguments':arguments, u'isCompatibleScope':PyJs_isCompatibleScope_2024_}, var) + var.registers([u'scope', u'binding', u'key']) + for PyJsTemp in var.get(u"this").get(u'bindings'): + var.put(u'key', PyJsTemp) + var.put(u'binding', var.get(u"this").get(u'bindings').get(var.get(u'key'))) + if var.get(u'scope').callprop(u'bindingIdentifierEquals', var.get(u'key'), var.get(u'binding').get(u'identifier')).neg(): + return Js(False) + return var.get(u'true') + PyJs_isCompatibleScope_2024_._set_name(u'isCompatibleScope') + var.get(u'PathHoister').get(u'prototype').put(u'isCompatibleScope', PyJs_isCompatibleScope_2024_) + @Js + def PyJs_getCompatibleScopes_2025_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getCompatibleScopes':PyJs_getCompatibleScopes_2025_}, var) + var.registers([u'scope']) + var.put(u'scope', var.get(u"this").get(u'path').get(u'scope')) + while 1: + if var.get(u"this").callprop(u'isCompatibleScope', var.get(u'scope')): + var.get(u"this").get(u'scopes').callprop(u'push', var.get(u'scope')) + else: + break + if (var.get(u"this").get(u'breakOnScopePaths').callprop(u'indexOf', var.get(u'scope').get(u'path'))>=Js(0.0)): + break + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJs_getCompatibleScopes_2025_._set_name(u'getCompatibleScopes') + var.get(u'PathHoister').get(u'prototype').put(u'getCompatibleScopes', PyJs_getCompatibleScopes_2025_) + @Js + def PyJs_getAttachmentPath_2026_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getAttachmentPath':PyJs_getAttachmentPath_2026_}, var) + var.registers([u'path', u'binding', u'name', u'targetScope']) + var.put(u'path', var.get(u"this").callprop(u'_getAttachmentPath')) + if var.get(u'path').neg(): + return var.get('undefined') + var.put(u'targetScope', var.get(u'path').get(u'scope')) + if PyJsStrictEq(var.get(u'targetScope').get(u'path'),var.get(u'path')): + var.put(u'targetScope', var.get(u'path').get(u'scope').get(u'parent')) + if (var.get(u'targetScope').get(u'path').callprop(u'isProgram') or var.get(u'targetScope').get(u'path').callprop(u'isFunction')): + for PyJsTemp in var.get(u"this").get(u'bindings'): + var.put(u'name', PyJsTemp) + if var.get(u'targetScope').callprop(u'hasOwnBinding', var.get(u'name')).neg(): + continue + var.put(u'binding', var.get(u"this").get(u'bindings').get(var.get(u'name'))) + if PyJsStrictEq(var.get(u'binding').get(u'kind'),Js(u'param')): + continue + if (var.get(u'binding').get(u'path').callprop(u'getStatementParent').get(u'key')>var.get(u'path').get(u'key')): + return var.get('undefined') + return var.get(u'path') + PyJs_getAttachmentPath_2026_._set_name(u'getAttachmentPath') + var.get(u'PathHoister').get(u'prototype').put(u'getAttachmentPath', PyJs_getAttachmentPath_2026_) + @Js + def PyJs__getAttachmentPath_2027_(this, arguments, var=var): + var = Scope({u'this':this, u'_getAttachmentPath':PyJs__getAttachmentPath_2027_, u'arguments':arguments}, var) + var.registers([u'scopes', u'scope']) + var.put(u'scopes', var.get(u"this").get(u'scopes')) + var.put(u'scope', var.get(u'scopes').callprop(u'pop')) + if var.get(u'scope').neg(): + return var.get('undefined') + if var.get(u'scope').get(u'path').callprop(u'isFunction'): + if var.get(u"this").callprop(u'hasOwnParamBindings', var.get(u'scope')): + if PyJsStrictEq(var.get(u"this").get(u'scope'),var.get(u'scope')): + return var.get('undefined') + return var.get(u'scope').get(u'path').callprop(u'get', Js(u'body')).callprop(u'get', Js(u'body')).get(u'0') + else: + return var.get(u"this").callprop(u'getNextScopeStatementParent') + else: + if var.get(u'scope').get(u'path').callprop(u'isProgram'): + return var.get(u"this").callprop(u'getNextScopeStatementParent') + PyJs__getAttachmentPath_2027_._set_name(u'_getAttachmentPath') + var.get(u'PathHoister').get(u'prototype').put(u'_getAttachmentPath', PyJs__getAttachmentPath_2027_) + @Js + def PyJs_getNextScopeStatementParent_2028_(this, arguments, var=var): + var = Scope({u'this':this, u'getNextScopeStatementParent':PyJs_getNextScopeStatementParent_2028_, u'arguments':arguments}, var) + var.registers([u'scope']) + var.put(u'scope', var.get(u"this").get(u'scopes').callprop(u'pop')) + if var.get(u'scope'): + return var.get(u'scope').get(u'path').callprop(u'getStatementParent') + PyJs_getNextScopeStatementParent_2028_._set_name(u'getNextScopeStatementParent') + var.get(u'PathHoister').get(u'prototype').put(u'getNextScopeStatementParent', PyJs_getNextScopeStatementParent_2028_) + @Js + def PyJs_hasOwnParamBindings_2029_(scope, this, arguments, var=var): + var = Scope({u'this':this, u'scope':scope, u'arguments':arguments, u'hasOwnParamBindings':PyJs_hasOwnParamBindings_2029_}, var) + var.registers([u'scope', u'binding', u'name']) + for PyJsTemp in var.get(u"this").get(u'bindings'): + var.put(u'name', PyJsTemp) + if var.get(u'scope').callprop(u'hasOwnBinding', var.get(u'name')).neg(): + continue + var.put(u'binding', var.get(u"this").get(u'bindings').get(var.get(u'name'))) + if PyJsStrictEq(var.get(u'binding').get(u'kind'),Js(u'param')): + return var.get(u'true') + return Js(False) + PyJs_hasOwnParamBindings_2029_._set_name(u'hasOwnParamBindings') + var.get(u'PathHoister').get(u'prototype').put(u'hasOwnParamBindings', PyJs_hasOwnParamBindings_2029_) + @Js + def PyJs_run_2030_(this, arguments, var=var): + var = Scope({u'this':this, u'run':PyJs_run_2030_, u'arguments':arguments}, var) + var.registers([u'node', u'attachTo', u'uid', u'parent']) + var.put(u'node', var.get(u"this").get(u'path').get(u'node')) + if var.get(u'node').get(u'_hoisted'): + return var.get('undefined') + var.get(u'node').put(u'_hoisted', var.get(u'true')) + var.get(u"this").get(u'path').callprop(u'traverse', var.get(u'referenceVisitor'), var.get(u"this")) + var.get(u"this").callprop(u'getCompatibleScopes') + var.put(u'attachTo', var.get(u"this").callprop(u'getAttachmentPath')) + if var.get(u'attachTo').neg(): + return var.get('undefined') + if PyJsStrictEq(var.get(u'attachTo').callprop(u'getFunctionParent'),var.get(u"this").get(u'path').callprop(u'getFunctionParent')): + return var.get('undefined') + var.put(u'uid', var.get(u'attachTo').get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref'))) + var.get(u'attachTo').callprop(u'insertBefore', Js([var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'uid'), var.get(u"this").get(u'path').get(u'node'))]))])) + var.put(u'parent', var.get(u"this").get(u'path').get(u'parentPath')) + if (var.get(u'parent').callprop(u'isJSXElement') and PyJsStrictEq(var.get(u"this").get(u'path').get(u'container'),var.get(u'parent').get(u'node').get(u'children'))): + var.put(u'uid', var.get(u't').callprop(u'JSXExpressionContainer', var.get(u'uid'))) + var.get(u"this").get(u'path').callprop(u'replaceWith', var.get(u'uid')) + PyJs_run_2030_._set_name(u'run') + var.get(u'PathHoister').get(u'prototype').put(u'run', PyJs_run_2030_) + return var.get(u'PathHoister') + PyJs_anonymous_2022_._set_name(u'anonymous') + var.put(u'PathHoister', PyJs_anonymous_2022_()) + var.get(u'exports').put(u'default', var.get(u'PathHoister')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_2017_._set_name(u'anonymous') +PyJs_Object_2031_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_2032_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'hooks', u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_2033_(self, parent, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'self', u'parent']) + if (PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'body')) and var.get(u'parent').callprop(u'isArrowFunctionExpression')): + var.get(u'self').callprop(u'replaceWith', var.get(u'self').get(u'scope').callprop(u'buildUndefinedNode')) + return var.get(u'true') + PyJs_anonymous_2033_._set_name(u'anonymous') + @Js + def PyJs_anonymous_2034_(self, parent, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'self', u'removeParent', u'parent']) + var.put(u'removeParent', Js(False)) + var.put(u'removeParent', (var.get(u'removeParent') or (PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'test')) and (var.get(u'parent').callprop(u'isWhile') or var.get(u'parent').callprop(u'isSwitchCase'))))) + var.put(u'removeParent', (var.get(u'removeParent') or (PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'declaration')) and var.get(u'parent').callprop(u'isExportDeclaration')))) + var.put(u'removeParent', (var.get(u'removeParent') or (PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'body')) and var.get(u'parent').callprop(u'isLabeledStatement')))) + var.put(u'removeParent', (var.get(u'removeParent') or ((PyJsStrictEq(var.get(u'self').get(u'listKey'),Js(u'declarations')) and var.get(u'parent').callprop(u'isVariableDeclaration')) and PyJsStrictEq(var.get(u'parent').get(u'node').get(u'declarations').get(u'length'),Js(1.0))))) + var.put(u'removeParent', (var.get(u'removeParent') or (PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'expression')) and var.get(u'parent').callprop(u'isExpressionStatement')))) + if var.get(u'removeParent'): + var.get(u'parent').callprop(u'remove') + return var.get(u'true') + PyJs_anonymous_2034_._set_name(u'anonymous') + @Js + def PyJs_anonymous_2035_(self, parent, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'self', u'parent']) + if (var.get(u'parent').callprop(u'isSequenceExpression') and PyJsStrictEq(var.get(u'parent').get(u'node').get(u'expressions').get(u'length'),Js(1.0))): + var.get(u'parent').callprop(u'replaceWith', var.get(u'parent').get(u'node').get(u'expressions').get(u'0')) + return var.get(u'true') + PyJs_anonymous_2035_._set_name(u'anonymous') + @Js + def PyJs_anonymous_2036_(self, parent, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'self', u'parent']) + if var.get(u'parent').callprop(u'isBinary'): + if PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'left')): + var.get(u'parent').callprop(u'replaceWith', var.get(u'parent').get(u'node').get(u'right')) + else: + var.get(u'parent').callprop(u'replaceWith', var.get(u'parent').get(u'node').get(u'left')) + return var.get(u'true') + PyJs_anonymous_2036_._set_name(u'anonymous') + @Js + def PyJs_anonymous_2037_(self, parent, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'self', u'parent']) + if ((var.get(u'parent').callprop(u'isIfStatement') and (PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'consequent')) or PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'alternate')))) or (var.get(u'parent').callprop(u'isLoop') and PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'body')))): + PyJs_Object_2038_ = Js({u'type':Js(u'BlockStatement'),u'body':Js([])}) + var.get(u'self').callprop(u'replaceWith', PyJs_Object_2038_) + return var.get(u'true') + PyJs_anonymous_2037_._set_name(u'anonymous') + var.put(u'hooks', var.get(u'exports').put(u'hooks', Js([PyJs_anonymous_2033_, PyJs_anonymous_2034_, PyJs_anonymous_2035_, PyJs_anonymous_2036_, PyJs_anonymous_2037_]))) +PyJs_anonymous_2032_._set_name(u'anonymous') +PyJs_Object_2039_ = Js({}) +@Js +def PyJs_anonymous_2040_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'Referenced', u'ReferencedIdentifier', u'Pure', u'_interopRequireWildcard', u'require', u'_babelTypes', u'Flow', u'module', u'ReferencedMemberExpression', u'BlockScoped', u'Generated', u'User', u't', u'Statement', u'Var', u'Scope', u'Expression', u'BindingIdentifier']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2042_ = Js({}) + var.put(u'newObj', PyJs_Object_2042_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + def PyJs_LONG_2041_(var=var): + return var.get(u'exports').put(u'Var', var.get(u'exports').put(u'BlockScoped', var.get(u'exports').put(u'Referenced', var.get(u'exports').put(u'Scope', var.get(u'exports').put(u'Expression', var.get(u'exports').put(u'Statement', var.get(u'exports').put(u'BindingIdentifier', var.get(u'exports').put(u'ReferencedMemberExpression', var.get(u'exports').put(u'ReferencedIdentifier', var.get(u'undefined')))))))))) + var.get(u'exports').put(u'Flow', var.get(u'exports').put(u'Pure', var.get(u'exports').put(u'Generated', var.get(u'exports').put(u'User', PyJs_LONG_2041_())))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + @Js + def PyJs_checkPath_2044_(_ref, opts, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'checkPath':PyJs_checkPath_2044_, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'node', u'_ref', u'opts', u'parent']) + var.put(u'node', var.get(u'_ref').get(u'node')) + var.put(u'parent', var.get(u'_ref').get(u'parent')) + if (var.get(u't').callprop(u'isIdentifier', var.get(u'node'), var.get(u'opts')).neg() and var.get(u't').callprop(u'isJSXMemberExpression', var.get(u'parent'), var.get(u'opts')).neg()): + if var.get(u't').callprop(u'isJSXIdentifier', var.get(u'node'), var.get(u'opts')): + if var.get(u'_babelTypes').get(u'react').callprop(u'isCompatTag', var.get(u'node').get(u'name')): + return Js(False) + else: + return Js(False) + return var.get(u't').callprop(u'isReferenced', var.get(u'node'), var.get(u'parent')) + PyJs_checkPath_2044_._set_name(u'checkPath') + PyJs_Object_2043_ = Js({u'types':Js([Js(u'Identifier'), Js(u'JSXIdentifier')]),u'checkPath':PyJs_checkPath_2044_}) + var.put(u'ReferencedIdentifier', var.get(u'exports').put(u'ReferencedIdentifier', PyJs_Object_2043_)) + @Js + def PyJs_checkPath_2046_(_ref2, this, arguments, var=var): + var = Scope({u'this':this, u'checkPath':PyJs_checkPath_2046_, u'_ref2':_ref2, u'arguments':arguments}, var) + var.registers([u'node', u'_ref2', u'parent']) + var.put(u'node', var.get(u'_ref2').get(u'node')) + var.put(u'parent', var.get(u'_ref2').get(u'parent')) + return (var.get(u't').callprop(u'isMemberExpression', var.get(u'node')) and var.get(u't').callprop(u'isReferenced', var.get(u'node'), var.get(u'parent'))) + PyJs_checkPath_2046_._set_name(u'checkPath') + PyJs_Object_2045_ = Js({u'types':Js([Js(u'MemberExpression')]),u'checkPath':PyJs_checkPath_2046_}) + var.put(u'ReferencedMemberExpression', var.get(u'exports').put(u'ReferencedMemberExpression', PyJs_Object_2045_)) + @Js + def PyJs_checkPath_2048_(_ref3, this, arguments, var=var): + var = Scope({u'this':this, u'checkPath':PyJs_checkPath_2048_, u'_ref3':_ref3, u'arguments':arguments}, var) + var.registers([u'node', u'_ref3', u'parent']) + var.put(u'node', var.get(u'_ref3').get(u'node')) + var.put(u'parent', var.get(u'_ref3').get(u'parent')) + return (var.get(u't').callprop(u'isIdentifier', var.get(u'node')) and var.get(u't').callprop(u'isBinding', var.get(u'node'), var.get(u'parent'))) + PyJs_checkPath_2048_._set_name(u'checkPath') + PyJs_Object_2047_ = Js({u'types':Js([Js(u'Identifier')]),u'checkPath':PyJs_checkPath_2048_}) + var.put(u'BindingIdentifier', var.get(u'exports').put(u'BindingIdentifier', PyJs_Object_2047_)) + @Js + def PyJs_checkPath_2050_(_ref4, this, arguments, var=var): + var = Scope({u'this':this, u'_ref4':_ref4, u'checkPath':PyJs_checkPath_2050_, u'arguments':arguments}, var) + var.registers([u'node', u'_ref4', u'parent']) + var.put(u'node', var.get(u'_ref4').get(u'node')) + var.put(u'parent', var.get(u'_ref4').get(u'parent')) + if var.get(u't').callprop(u'isStatement', var.get(u'node')): + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'node')): + PyJs_Object_2051_ = Js({u'left':var.get(u'node')}) + if var.get(u't').callprop(u'isForXStatement', var.get(u'parent'), PyJs_Object_2051_): + return Js(False) + PyJs_Object_2052_ = Js({u'init':var.get(u'node')}) + if var.get(u't').callprop(u'isForStatement', var.get(u'parent'), PyJs_Object_2052_): + return Js(False) + return var.get(u'true') + else: + return Js(False) + PyJs_checkPath_2050_._set_name(u'checkPath') + PyJs_Object_2049_ = Js({u'types':Js([Js(u'Statement')]),u'checkPath':PyJs_checkPath_2050_}) + var.put(u'Statement', var.get(u'exports').put(u'Statement', PyJs_Object_2049_)) + @Js + def PyJs_checkPath_2054_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2054_, u'arguments':arguments}, var) + var.registers([u'path']) + if var.get(u'path').callprop(u'isIdentifier'): + return var.get(u'path').callprop(u'isReferencedIdentifier') + else: + return var.get(u't').callprop(u'isExpression', var.get(u'path').get(u'node')) + PyJs_checkPath_2054_._set_name(u'checkPath') + PyJs_Object_2053_ = Js({u'types':Js([Js(u'Expression')]),u'checkPath':PyJs_checkPath_2054_}) + var.put(u'Expression', var.get(u'exports').put(u'Expression', PyJs_Object_2053_)) + @Js + def PyJs_checkPath_2056_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2056_, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u't').callprop(u'isScope', var.get(u'path').get(u'node'), var.get(u'path').get(u'parent')) + PyJs_checkPath_2056_._set_name(u'checkPath') + PyJs_Object_2055_ = Js({u'types':Js([Js(u'Scopable')]),u'checkPath':PyJs_checkPath_2056_}) + var.put(u'Scope', var.get(u'exports').put(u'Scope', PyJs_Object_2055_)) + @Js + def PyJs_checkPath_2058_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2058_, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u't').callprop(u'isReferenced', var.get(u'path').get(u'node'), var.get(u'path').get(u'parent')) + PyJs_checkPath_2058_._set_name(u'checkPath') + PyJs_Object_2057_ = Js({u'checkPath':PyJs_checkPath_2058_}) + var.put(u'Referenced', var.get(u'exports').put(u'Referenced', PyJs_Object_2057_)) + @Js + def PyJs_checkPath_2060_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2060_, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u't').callprop(u'isBlockScoped', var.get(u'path').get(u'node')) + PyJs_checkPath_2060_._set_name(u'checkPath') + PyJs_Object_2059_ = Js({u'checkPath':PyJs_checkPath_2060_}) + var.put(u'BlockScoped', var.get(u'exports').put(u'BlockScoped', PyJs_Object_2059_)) + @Js + def PyJs_checkPath_2062_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2062_, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u't').callprop(u'isVar', var.get(u'path').get(u'node')) + PyJs_checkPath_2062_._set_name(u'checkPath') + PyJs_Object_2061_ = Js({u'types':Js([Js(u'VariableDeclaration')]),u'checkPath':PyJs_checkPath_2062_}) + var.put(u'Var', var.get(u'exports').put(u'Var', PyJs_Object_2061_)) + @Js + def PyJs_checkPath_2064_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2064_, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u'path').get(u'node') and var.get(u'path').get(u'node').get(u'loc').neg().neg()) + PyJs_checkPath_2064_._set_name(u'checkPath') + PyJs_Object_2063_ = Js({u'checkPath':PyJs_checkPath_2064_}) + var.put(u'User', var.get(u'exports').put(u'User', PyJs_Object_2063_)) + @Js + def PyJs_checkPath_2066_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2066_, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u'path').callprop(u'isUser').neg() + PyJs_checkPath_2066_._set_name(u'checkPath') + PyJs_Object_2065_ = Js({u'checkPath':PyJs_checkPath_2066_}) + var.put(u'Generated', var.get(u'exports').put(u'Generated', PyJs_Object_2065_)) + @Js + def PyJs_checkPath_2068_(path, opts, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2068_, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'path', u'opts']) + return var.get(u'path').get(u'scope').callprop(u'isPure', var.get(u'path').get(u'node'), var.get(u'opts')) + PyJs_checkPath_2068_._set_name(u'checkPath') + PyJs_Object_2067_ = Js({u'checkPath':PyJs_checkPath_2068_}) + var.put(u'Pure', var.get(u'exports').put(u'Pure', PyJs_Object_2067_)) + @Js + def PyJs_checkPath_2070_(_ref5, this, arguments, var=var): + var = Scope({u'this':this, u'_ref5':_ref5, u'checkPath':PyJs_checkPath_2070_, u'arguments':arguments}, var) + var.registers([u'node', u'_ref5']) + var.put(u'node', var.get(u'_ref5').get(u'node')) + if var.get(u't').callprop(u'isFlow', var.get(u'node')): + return var.get(u'true') + else: + if var.get(u't').callprop(u'isImportDeclaration', var.get(u'node')): + return (PyJsStrictEq(var.get(u'node').get(u'importKind'),Js(u'type')) or PyJsStrictEq(var.get(u'node').get(u'importKind'),Js(u'typeof'))) + else: + if var.get(u't').callprop(u'isExportDeclaration', var.get(u'node')): + return PyJsStrictEq(var.get(u'node').get(u'exportKind'),Js(u'type')) + else: + return Js(False) + PyJs_checkPath_2070_._set_name(u'checkPath') + PyJs_Object_2069_ = Js({u'types':Js([Js(u'Flow'), Js(u'ImportDeclaration'), Js(u'ExportDeclaration')]),u'checkPath':PyJs_checkPath_2070_}) + var.put(u'Flow', var.get(u'exports').put(u'Flow', PyJs_Object_2069_)) +PyJs_anonymous_2040_._set_name(u'anonymous') +PyJs_Object_2071_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_2072_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_hoister', u'updateSiblingKeys', u'_verifyNodeList', u'_interopRequireDefault', u'_cache', u'_getIterator2', u'_getIterator3', u'_maybePopFromStatements', u'_typeof2', u'_typeof3', u'_interopRequireWildcard', u'unshiftContainer', u'insertAfter', u'exports', u'pushContainer', u'insertBefore', u'_babelTypes', u'hoist', u'module', u'_index2', u'_index', u'require', u'_containerInsert', u'_containerInsertBefore', u't', u'_containerInsertAfter', u'_hoister2']) + @Js + def PyJsHoisted_pushContainer_(listKey, nodes, this, arguments, var=var): + var = Scope({u'this':this, u'listKey':listKey, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'path', u'listKey', u'container', u'nodes']) + var.get(u"this").callprop(u'_assertUnremoved') + var.put(u'nodes', var.get(u"this").callprop(u'_verifyNodeList', var.get(u'nodes'))) + var.put(u'container', var.get(u"this").get(u'node').get(var.get(u'listKey'))) + PyJs_Object_2078_ = Js({u'parentPath':var.get(u"this"),u'parent':var.get(u"this").get(u'node'),u'container':var.get(u'container'),u'listKey':var.get(u'listKey'),u'key':var.get(u'container').get(u'length')}) + var.put(u'path', var.get(u'_index2').get(u'default').callprop(u'get', PyJs_Object_2078_)) + return var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'nodes')) + PyJsHoisted_pushContainer_.func_name = u'pushContainer' + var.put(u'pushContainer', PyJsHoisted_pushContainer_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2073_ = Js({}) + var.put(u'newObj', PyJs_Object_2073_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_insertBefore_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'nodes']) + var.get(u"this").callprop(u'_assertUnremoved') + var.put(u'nodes', var.get(u"this").callprop(u'_verifyNodeList', var.get(u'nodes'))) + if (var.get(u"this").get(u'parentPath').callprop(u'isExpressionStatement') or var.get(u"this").get(u'parentPath').callprop(u'isLabeledStatement')): + return var.get(u"this").get(u'parentPath').callprop(u'insertBefore', var.get(u'nodes')) + else: + if (var.get(u"this").callprop(u'isNodeType', Js(u'Expression')) or (var.get(u"this").get(u'parentPath').callprop(u'isForStatement') and PyJsStrictEq(var.get(u"this").get(u'key'),Js(u'init')))): + if var.get(u"this").get(u'node'): + var.get(u'nodes').callprop(u'push', var.get(u"this").get(u'node')) + var.get(u"this").callprop(u'replaceExpressionWithStatements', var.get(u'nodes')) + else: + var.get(u"this").callprop(u'_maybePopFromStatements', var.get(u'nodes')) + if var.get(u'Array').callprop(u'isArray', var.get(u"this").get(u'container')): + return var.get(u"this").callprop(u'_containerInsertBefore', var.get(u'nodes')) + else: + if var.get(u"this").callprop(u'isStatementOrBlock'): + if var.get(u"this").get(u'node'): + var.get(u'nodes').callprop(u'push', var.get(u"this").get(u'node')) + var.get(u"this").callprop(u'_replaceWith', var.get(u't').callprop(u'blockStatement', var.get(u'nodes'))) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"We don't know what to do with this node type. We were previously a Statement but we can't fit in here?"))) + raise PyJsTempException + return Js([var.get(u"this")]) + PyJsHoisted_insertBefore_.func_name = u'insertBefore' + var.put(u'insertBefore', PyJsHoisted_insertBefore_) + @Js + def PyJsHoisted__containerInsert_(PyJsArg_66726f6d_, nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'from':PyJsArg_66726f6d_, u'arguments':arguments}, var) + var.registers([u'node', u'paths', u'_isArray', u'context', u'_iterator', u'_isArray2', u'to', u'i', u'_i2', u'_ref2', u'contexts', u'from', u'_i', u'path', u'_ref', u'_iterator2', u'nodes', u'_path']) + var.get(u"this").callprop(u'updateSiblingKeys', var.get(u'from'), var.get(u'nodes').get(u'length')) + var.put(u'paths', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'nodes').get(u'length')): + try: + var.put(u'to', (var.get(u'from')+var.get(u'i'))) + var.put(u'node', var.get(u'nodes').get(var.get(u'i'))) + var.get(u"this").get(u'container').callprop(u'splice', var.get(u'to'), Js(0.0), var.get(u'node')) + if var.get(u"this").get(u'context'): + var.put(u'path', var.get(u"this").get(u'context').callprop(u'create', var.get(u"this").get(u'parent'), var.get(u"this").get(u'container'), var.get(u'to'), var.get(u"this").get(u'listKey'))) + if var.get(u"this").get(u'context').get(u'queue'): + var.get(u'path').callprop(u'pushContext', var.get(u"this").get(u'context')) + var.get(u'paths').callprop(u'push', var.get(u'path')) + else: + PyJs_Object_2075_ = Js({u'parentPath':var.get(u"this").get(u'parentPath'),u'parent':var.get(u"this").get(u'parent'),u'container':var.get(u"this").get(u'container'),u'listKey':var.get(u"this").get(u'listKey'),u'key':var.get(u'to')}) + var.get(u'paths').callprop(u'push', var.get(u'_index2').get(u'default').callprop(u'get', PyJs_Object_2075_)) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.put(u'contexts', var.get(u"this").callprop(u'_getQueueContexts')) + #for JS loop + var.put(u'_iterator', var.get(u'paths')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'_path', var.get(u'_ref')) + var.get(u'_path').callprop(u'setScope') + @Js + def PyJs_anonymous_2076_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(u'Inserted.') + PyJs_anonymous_2076_._set_name(u'anonymous') + var.get(u'_path').callprop(u'debug', PyJs_anonymous_2076_) + #for JS loop + var.put(u'_iterator2', var.get(u'contexts')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'context', var.get(u'_ref2')) + var.get(u'context').callprop(u'maybeQueue', var.get(u'_path'), var.get(u'true')) + + + return var.get(u'paths') + PyJsHoisted__containerInsert_.func_name = u'_containerInsert' + var.put(u'_containerInsert', PyJsHoisted__containerInsert_) + @Js + def PyJsHoisted_unshiftContainer_(listKey, nodes, this, arguments, var=var): + var = Scope({u'this':this, u'listKey':listKey, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'path', u'listKey', u'nodes']) + var.get(u"this").callprop(u'_assertUnremoved') + var.put(u'nodes', var.get(u"this").callprop(u'_verifyNodeList', var.get(u'nodes'))) + PyJs_Object_2077_ = Js({u'parentPath':var.get(u"this"),u'parent':var.get(u"this").get(u'node'),u'container':var.get(u"this").get(u'node').get(var.get(u'listKey')),u'listKey':var.get(u'listKey'),u'key':Js(0.0)}) + var.put(u'path', var.get(u'_index2').get(u'default').callprop(u'get', PyJs_Object_2077_)) + return var.get(u'path').callprop(u'insertBefore', var.get(u'nodes')) + PyJsHoisted_unshiftContainer_.func_name = u'unshiftContainer' + var.put(u'unshiftContainer', PyJsHoisted_unshiftContainer_) + @Js + def PyJsHoisted__containerInsertBefore_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'nodes']) + return var.get(u"this").callprop(u'_containerInsert', var.get(u"this").get(u'key'), var.get(u'nodes')) + PyJsHoisted__containerInsertBefore_.func_name = u'_containerInsertBefore' + var.put(u'_containerInsertBefore', PyJsHoisted__containerInsertBefore_) + @Js + def PyJsHoisted_updateSiblingKeys_(fromIndex, incrementBy, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'fromIndex':fromIndex, u'incrementBy':incrementBy}, var) + var.registers([u'i', u'paths', u'incrementBy', u'fromIndex', u'path']) + if var.get(u"this").get(u'parent').neg(): + return var.get('undefined') + var.put(u'paths', var.get(u'_cache').get(u'path').callprop(u'get', var.get(u"this").get(u'parent'))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'paths').get(u'length')): + try: + var.put(u'path', var.get(u'paths').get(var.get(u'i'))) + if (var.get(u'path').get(u'key')>=var.get(u'fromIndex')): + var.get(u'path').put(u'key', var.get(u'incrementBy'), u'+') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJsHoisted_updateSiblingKeys_.func_name = u'updateSiblingKeys' + var.put(u'updateSiblingKeys', PyJsHoisted_updateSiblingKeys_) + @Js + def PyJsHoisted__verifyNodeList_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'i', u'node', u'nodes', u'type', u'msg']) + if var.get(u'nodes').neg(): + return Js([]) + if PyJsStrictNeq(var.get(u'nodes').get(u'constructor'),var.get(u'Array')): + var.put(u'nodes', Js([var.get(u'nodes')])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'nodes').get(u'length')): + try: + var.put(u'node', var.get(u'nodes').get(var.get(u'i'))) + var.put(u'msg', PyJsComma(Js(0.0), Js(None))) + if var.get(u'node').neg(): + var.put(u'msg', Js(u'has falsy node')) + else: + if PyJsStrictNeq((Js(u'undefined') if PyJsStrictEq(var.get(u'node',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'node'))),Js(u'object')): + var.put(u'msg', Js(u'contains a non-object node')) + else: + if var.get(u'node').get(u'type').neg(): + var.put(u'msg', Js(u'without a type')) + else: + if var.get(u'node').instanceof(var.get(u'_index2').get(u'default')): + var.put(u'msg', Js(u'has a NodePath when it expected a raw object')) + if var.get(u'msg'): + var.put(u'type', (Js(u'array') if var.get(u'Array').callprop(u'isArray', var.get(u'node')) else (Js(u'undefined') if PyJsStrictEq(var.get(u'node',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'node'))))) + PyJsTempException = JsToPyException(var.get(u'Error').create((((((Js(u'Node list ')+var.get(u'msg'))+Js(u' with the index of '))+var.get(u'i'))+Js(u' and type of '))+var.get(u'type')))) + raise PyJsTempException + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'nodes') + PyJsHoisted__verifyNodeList_.func_name = u'_verifyNodeList' + var.put(u'_verifyNodeList', PyJsHoisted__verifyNodeList_) + @Js + def PyJsHoisted_insertAfter_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'nodes', u'temp']) + var.get(u"this").callprop(u'_assertUnremoved') + var.put(u'nodes', var.get(u"this").callprop(u'_verifyNodeList', var.get(u'nodes'))) + if (var.get(u"this").get(u'parentPath').callprop(u'isExpressionStatement') or var.get(u"this").get(u'parentPath').callprop(u'isLabeledStatement')): + return var.get(u"this").get(u'parentPath').callprop(u'insertAfter', var.get(u'nodes')) + else: + if (var.get(u"this").callprop(u'isNodeType', Js(u'Expression')) or (var.get(u"this").get(u'parentPath').callprop(u'isForStatement') and PyJsStrictEq(var.get(u"this").get(u'key'),Js(u'init')))): + if var.get(u"this").get(u'node'): + var.put(u'temp', var.get(u"this").get(u'scope').callprop(u'generateDeclaredUidIdentifier')) + var.get(u'nodes').callprop(u'unshift', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'temp'), var.get(u"this").get(u'node')))) + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u'temp'))) + var.get(u"this").callprop(u'replaceExpressionWithStatements', var.get(u'nodes')) + else: + var.get(u"this").callprop(u'_maybePopFromStatements', var.get(u'nodes')) + if var.get(u'Array').callprop(u'isArray', var.get(u"this").get(u'container')): + return var.get(u"this").callprop(u'_containerInsertAfter', var.get(u'nodes')) + else: + if var.get(u"this").callprop(u'isStatementOrBlock'): + if var.get(u"this").get(u'node'): + var.get(u'nodes').callprop(u'unshift', var.get(u"this").get(u'node')) + var.get(u"this").callprop(u'_replaceWith', var.get(u't').callprop(u'blockStatement', var.get(u'nodes'))) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"We don't know what to do with this node type. We were previously a Statement but we can't fit in here?"))) + raise PyJsTempException + return Js([var.get(u"this")]) + PyJsHoisted_insertAfter_.func_name = u'insertAfter' + var.put(u'insertAfter', PyJsHoisted_insertAfter_) + @Js + def PyJsHoisted_hoist_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'scope', u'hoister']) + var.put(u'scope', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else var.get(u"this").get(u'scope'))) + var.put(u'hoister', var.get(u'_hoister2').get(u'default').create(var.get(u"this"), var.get(u'scope'))) + return var.get(u'hoister').callprop(u'run') + PyJsHoisted_hoist_.func_name = u'hoist' + var.put(u'hoist', PyJsHoisted_hoist_) + @Js + def PyJsHoisted__containerInsertAfter_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'nodes']) + return var.get(u"this").callprop(u'_containerInsert', (var.get(u"this").get(u'key')+Js(1.0)), var.get(u'nodes')) + PyJsHoisted__containerInsertAfter_.func_name = u'_containerInsertAfter' + var.put(u'_containerInsertAfter', PyJsHoisted__containerInsertAfter_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2074_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2074_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__maybePopFromStatements_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'nodes', u'last', u'isIdentifier']) + var.put(u'last', var.get(u'nodes').get((var.get(u'nodes').get(u'length')-Js(1.0)))) + var.put(u'isIdentifier', (var.get(u't').callprop(u'isIdentifier', var.get(u'last')) or (var.get(u't').callprop(u'isExpressionStatement', var.get(u'last')) and var.get(u't').callprop(u'isIdentifier', var.get(u'last').get(u'expression'))))) + if (var.get(u'isIdentifier') and var.get(u"this").callprop(u'isCompletionRecord').neg()): + var.get(u'nodes').callprop(u'pop') + PyJsHoisted__maybePopFromStatements_.func_name = u'_maybePopFromStatements' + var.put(u'_maybePopFromStatements', PyJsHoisted__maybePopFromStatements_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'insertBefore', var.get(u'insertBefore')) + var.get(u'exports').put(u'_containerInsert', var.get(u'_containerInsert')) + var.get(u'exports').put(u'_containerInsertBefore', var.get(u'_containerInsertBefore')) + var.get(u'exports').put(u'_containerInsertAfter', var.get(u'_containerInsertAfter')) + var.get(u'exports').put(u'_maybePopFromStatements', var.get(u'_maybePopFromStatements')) + var.get(u'exports').put(u'insertAfter', var.get(u'insertAfter')) + var.get(u'exports').put(u'updateSiblingKeys', var.get(u'updateSiblingKeys')) + var.get(u'exports').put(u'_verifyNodeList', var.get(u'_verifyNodeList')) + var.get(u'exports').put(u'unshiftContainer', var.get(u'unshiftContainer')) + var.get(u'exports').put(u'pushContainer', var.get(u'pushContainer')) + var.get(u'exports').put(u'hoist', var.get(u'hoist')) + var.put(u'_cache', var.get(u'require')(Js(u'../cache'))) + var.put(u'_hoister', var.get(u'require')(Js(u'./lib/hoister'))) + var.put(u'_hoister2', var.get(u'_interopRequireDefault')(var.get(u'_hoister'))) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_2072_._set_name(u'anonymous') +PyJs_Object_2079_ = Js({u'../cache':Js(222.0),u'./index':Js(232.0),u'./lib/hoister':Js(237.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/typeof':Js(114.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_2080_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_assertUnremoved', u'exports', u'require', u'remove', u'_remove', u'_markRemoved', u'module', u'_removalHooks', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_callRemovalHooks']) + @Js + def PyJsHoisted__assertUnremoved_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'removed'): + PyJsTempException = JsToPyException(var.get(u"this").callprop(u'buildCodeFrameError', Js(u'NodePath has been removed so is read-only.'))) + raise PyJsTempException + PyJsHoisted__assertUnremoved_.func_name = u'_assertUnremoved' + var.put(u'_assertUnremoved', PyJsHoisted__assertUnremoved_) + @Js + def PyJsHoisted_remove_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'_assertUnremoved') + var.get(u"this").callprop(u'resync') + if var.get(u"this").callprop(u'_callRemovalHooks'): + var.get(u"this").callprop(u'_markRemoved') + return var.get('undefined') + var.get(u"this").callprop(u'shareCommentsWithSiblings') + var.get(u"this").callprop(u'_remove') + var.get(u"this").callprop(u'_markRemoved') + PyJsHoisted_remove_.func_name = u'remove' + var.put(u'remove', PyJsHoisted_remove_) + @Js + def PyJsHoisted__remove_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u'Array').callprop(u'isArray', var.get(u"this").get(u'container')): + var.get(u"this").get(u'container').callprop(u'splice', var.get(u"this").get(u'key'), Js(1.0)) + var.get(u"this").callprop(u'updateSiblingKeys', var.get(u"this").get(u'key'), (-Js(1.0))) + else: + var.get(u"this").callprop(u'_replaceWith', var.get(u"null")) + PyJsHoisted__remove_.func_name = u'_remove' + var.put(u'_remove', PyJsHoisted__remove_) + @Js + def PyJsHoisted__markRemoved_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'shouldSkip', var.get(u'true')) + var.get(u"this").put(u'removed', var.get(u'true')) + var.get(u"this").put(u'node', var.get(u"null")) + PyJsHoisted__markRemoved_.func_name = u'_markRemoved' + var.put(u'_markRemoved', PyJsHoisted__markRemoved_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2081_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2081_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__callRemovalHooks_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'fn', u'_isArray', u'_iterator', u'_ref', u'_i']) + #for JS loop + var.put(u'_iterator', var.get(u'_removalHooks').get(u'hooks')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'fn', var.get(u'_ref')) + if var.get(u'fn')(var.get(u"this"), var.get(u"this").get(u'parentPath')): + return var.get(u'true') + + PyJsHoisted__callRemovalHooks_.func_name = u'_callRemovalHooks' + var.put(u'_callRemovalHooks', PyJsHoisted__callRemovalHooks_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'remove', var.get(u'remove')) + var.get(u'exports').put(u'_callRemovalHooks', var.get(u'_callRemovalHooks')) + var.get(u'exports').put(u'_remove', var.get(u'_remove')) + var.get(u'exports').put(u'_markRemoved', var.get(u'_markRemoved')) + var.get(u'exports').put(u'_assertUnremoved', var.get(u'_assertUnremoved')) + var.put(u'_removalHooks', var.get(u'require')(Js(u'./lib/removal-hooks'))) + pass + pass + pass + pass + pass + pass +PyJs_anonymous_2080_._set_name(u'anonymous') +PyJs_Object_2082_ = Js({u'./lib/removal-hooks':Js(238.0),u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_2083_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'replaceExpressionWithStatements', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'replaceInline', u'replaceWithSourceString', u'_babelCodeFrame2', u'_replaceWith', u'_babylon', u'hoistVariablesVisitor', u'exports', u'_babelTypes', u'_interopRequireWildcard', u'replaceWith', u'_babelCodeFrame', u'_index4', u'_index2', u'_index3', u'_index', u'require', u't', u'replaceWithMultiple']) + @Js + def PyJsHoisted_replaceExpressionWithStatements_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'container', u'_isArray2', u'toSequenceExpression', u'completionRecords', u'_i2', u'_ref2', u'exprs', u'uid', u'path', u'nodes', u'callee', u'loop', u'_iterator2']) + var.get(u"this").callprop(u'resync') + var.put(u'toSequenceExpression', var.get(u't').callprop(u'toSequenceExpression', var.get(u'nodes'), var.get(u"this").get(u'scope'))) + if var.get(u't').callprop(u'isSequenceExpression', var.get(u'toSequenceExpression')): + var.put(u'exprs', var.get(u'toSequenceExpression').get(u'expressions')) + if ((var.get(u'exprs').get(u'length')>=Js(2.0)) and var.get(u"this").get(u'parentPath').callprop(u'isExpressionStatement')): + var.get(u"this").callprop(u'_maybePopFromStatements', var.get(u'exprs')) + if PyJsStrictEq(var.get(u'exprs').get(u'length'),Js(1.0)): + var.get(u"this").callprop(u'replaceWith', var.get(u'exprs').get(u'0')) + else: + var.get(u"this").callprop(u'replaceWith', var.get(u'toSequenceExpression')) + else: + if var.get(u'toSequenceExpression'): + var.get(u"this").callprop(u'replaceWith', var.get(u'toSequenceExpression')) + else: + var.put(u'container', var.get(u't').callprop(u'functionExpression', var.get(u"null"), Js([]), var.get(u't').callprop(u'blockStatement', var.get(u'nodes')))) + var.get(u'container').put(u'shadow', var.get(u'true')) + var.get(u"this").callprop(u'replaceWith', var.get(u't').callprop(u'callExpression', var.get(u'container'), Js([]))) + var.get(u"this").callprop(u'traverse', var.get(u'hoistVariablesVisitor')) + var.put(u'completionRecords', var.get(u"this").callprop(u'get', Js(u'callee')).callprop(u'getCompletionRecords')) + #for JS loop + var.put(u'_iterator2', var.get(u'completionRecords')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'path', var.get(u'_ref2')) + if var.get(u'path').callprop(u'isExpressionStatement').neg(): + continue + @Js + def PyJs_anonymous_2091_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u'path').callprop(u'isLoop') + PyJs_anonymous_2091_._set_name(u'anonymous') + var.put(u'loop', var.get(u'path').callprop(u'findParent', PyJs_anonymous_2091_)) + if var.get(u'loop'): + var.put(u'callee', var.get(u"this").callprop(u'get', Js(u'callee'))) + var.put(u'uid', var.get(u'callee').get(u'scope').callprop(u'generateDeclaredUidIdentifier', Js(u'ret'))) + var.get(u'callee').callprop(u'get', Js(u'body')).callprop(u'pushContainer', Js(u'body'), var.get(u't').callprop(u'returnStatement', var.get(u'uid'))) + var.get(u'path').callprop(u'get', Js(u'expression')).callprop(u'replaceWith', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'uid'), var.get(u'path').get(u'node').get(u'expression'))) + else: + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'returnStatement', var.get(u'path').get(u'node').get(u'expression'))) + + return var.get(u"this").get(u'node') + PyJsHoisted_replaceExpressionWithStatements_.func_name = u'replaceExpressionWithStatements' + var.put(u'replaceExpressionWithStatements', PyJsHoisted_replaceExpressionWithStatements_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2084_ = Js({}) + var.put(u'newObj', PyJs_Object_2084_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_replaceWith_(replacement, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'replacement':replacement}, var) + var.registers([u'oldNode', u'replacement']) + var.get(u"this").callprop(u'resync') + if var.get(u"this").get(u'removed'): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"You can't replace this node, we've already removed it"))) + raise PyJsTempException + if var.get(u'replacement').instanceof(var.get(u'_index4').get(u'default')): + var.put(u'replacement', var.get(u'replacement').get(u'node')) + if var.get(u'replacement').neg(): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'You passed `path.replaceWith()` a falsy node, use `path.remove()` instead'))) + raise PyJsTempException + if PyJsStrictEq(var.get(u"this").get(u'node'),var.get(u'replacement')): + return var.get('undefined') + if (var.get(u"this").callprop(u'isProgram') and var.get(u't').callprop(u'isProgram', var.get(u'replacement')).neg()): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'You can only replace a Program root node with another Program node'))) + raise PyJsTempException + if var.get(u'Array').callprop(u'isArray', var.get(u'replacement')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"Don't use `path.replaceWith()` with an array of nodes, use `path.replaceWithMultiple()`"))) + raise PyJsTempException + if PyJsStrictEq(var.get(u'replacement',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"Don't use `path.replaceWith()` with a source string, use `path.replaceWithSourceString()`"))) + raise PyJsTempException + if (var.get(u"this").callprop(u'isNodeType', Js(u'Statement')) and var.get(u't').callprop(u'isExpression', var.get(u'replacement'))): + if (var.get(u"this").callprop(u'canHaveVariableDeclarationOrExpression').neg() and var.get(u"this").callprop(u'canSwapBetweenExpressionAndStatement', var.get(u'replacement')).neg()): + var.put(u'replacement', var.get(u't').callprop(u'expressionStatement', var.get(u'replacement'))) + if (var.get(u"this").callprop(u'isNodeType', Js(u'Expression')) and var.get(u't').callprop(u'isStatement', var.get(u'replacement'))): + if (var.get(u"this").callprop(u'canHaveVariableDeclarationOrExpression').neg() and var.get(u"this").callprop(u'canSwapBetweenExpressionAndStatement', var.get(u'replacement')).neg()): + return var.get(u"this").callprop(u'replaceExpressionWithStatements', Js([var.get(u'replacement')])) + var.put(u'oldNode', var.get(u"this").get(u'node')) + if var.get(u'oldNode'): + var.get(u't').callprop(u'inheritsComments', var.get(u'replacement'), var.get(u'oldNode')) + var.get(u't').callprop(u'removeComments', var.get(u'oldNode')) + var.get(u"this").callprop(u'_replaceWith', var.get(u'replacement')) + var.get(u"this").put(u'type', var.get(u'replacement').get(u'type')) + var.get(u"this").callprop(u'setScope') + var.get(u"this").callprop(u'requeue') + PyJsHoisted_replaceWith_.func_name = u'replaceWith' + var.put(u'replaceWith', PyJsHoisted_replaceWith_) + @Js + def PyJsHoisted__replaceWith_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").get(u'container').neg(): + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create(Js(u'Container is falsy'))) + raise PyJsTempException + if var.get(u"this").get(u'inList'): + var.get(u't').callprop(u'validate', var.get(u"this").get(u'parent'), var.get(u"this").get(u'key'), Js([var.get(u'node')])) + else: + var.get(u't').callprop(u'validate', var.get(u"this").get(u'parent'), var.get(u"this").get(u'key'), var.get(u'node')) + @Js + def PyJs_anonymous_2090_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return (Js(u'Replace with ')+(var.get(u'node') and var.get(u'node').get(u'type'))) + PyJs_anonymous_2090_._set_name(u'anonymous') + var.get(u"this").callprop(u'debug', PyJs_anonymous_2090_) + var.get(u"this").put(u'node', var.get(u"this").get(u'container').put(var.get(u"this").get(u'key'), var.get(u'node'))) + PyJsHoisted__replaceWith_.func_name = u'_replaceWith' + var.put(u'_replaceWith', PyJsHoisted__replaceWith_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2085_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2085_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_replaceInline_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'nodes']) + var.get(u"this").callprop(u'resync') + if var.get(u'Array').callprop(u'isArray', var.get(u'nodes')): + if var.get(u'Array').callprop(u'isArray', var.get(u"this").get(u'container')): + var.put(u'nodes', var.get(u"this").callprop(u'_verifyNodeList', var.get(u'nodes'))) + var.get(u"this").callprop(u'_containerInsertAfter', var.get(u'nodes')) + return var.get(u"this").callprop(u'remove') + else: + return var.get(u"this").callprop(u'replaceWithMultiple', var.get(u'nodes')) + else: + return var.get(u"this").callprop(u'replaceWith', var.get(u'nodes')) + PyJsHoisted_replaceInline_.func_name = u'replaceInline' + var.put(u'replaceInline', PyJsHoisted_replaceInline_) + @Js + def PyJsHoisted_replaceWithMultiple_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'nodes']) + var.get(u"this").callprop(u'resync') + var.put(u'nodes', var.get(u"this").callprop(u'_verifyNodeList', var.get(u'nodes'))) + var.get(u't').callprop(u'inheritLeadingComments', var.get(u'nodes').get(u'0'), var.get(u"this").get(u'node')) + var.get(u't').callprop(u'inheritTrailingComments', var.get(u'nodes').get((var.get(u'nodes').get(u'length')-Js(1.0))), var.get(u"this").get(u'node')) + var.get(u"this").put(u'node', var.get(u"this").get(u'container').put(var.get(u"this").get(u'key'), var.get(u"null"))) + var.get(u"this").callprop(u'insertAfter', var.get(u'nodes')) + if var.get(u"this").get(u'node'): + var.get(u"this").callprop(u'requeue') + else: + var.get(u"this").callprop(u'remove') + PyJsHoisted_replaceWithMultiple_.func_name = u'replaceWithMultiple' + var.put(u'replaceWithMultiple', PyJsHoisted_replaceWithMultiple_) + @Js + def PyJsHoisted_replaceWithSourceString_(replacement, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'replacement':replacement}, var) + var.registers([u'loc', u'replacement']) + var.get(u"this").callprop(u'resync') + try: + var.put(u'replacement', ((Js(u'(')+var.get(u'replacement'))+Js(u')'))) + var.put(u'replacement', PyJsComma(Js(0.0),var.get(u'_babylon').get(u'parse'))(var.get(u'replacement'))) + except PyJsException as PyJsTempException: + PyJsHolder_657272_62521723 = var.own.get(u'err') + var.force_own_put(u'err', PyExceptionToJs(PyJsTempException)) + try: + var.put(u'loc', var.get(u'err').get(u'loc')) + if var.get(u'loc'): + var.get(u'err').put(u'message', Js(u' - make sure this is an expression.'), u'+') + var.get(u'err').put(u'message', (Js(u'\n')+PyJsComma(Js(0.0),var.get(u'_babelCodeFrame2').get(u'default'))(var.get(u'replacement'), var.get(u'loc').get(u'line'), (var.get(u'loc').get(u'column')+Js(1.0)))), u'+') + PyJsTempException = JsToPyException(var.get(u'err')) + raise PyJsTempException + finally: + if PyJsHolder_657272_62521723 is not None: + var.own[u'err'] = PyJsHolder_657272_62521723 + else: + del var.own[u'err'] + del PyJsHolder_657272_62521723 + var.put(u'replacement', var.get(u'replacement').get(u'program').get(u'body').get(u'0').get(u'expression')) + var.get(u'_index2').get(u'default').callprop(u'removeProperties', var.get(u'replacement')) + return var.get(u"this").callprop(u'replaceWith', var.get(u'replacement')) + PyJsHoisted_replaceWithSourceString_.func_name = u'replaceWithSourceString' + var.put(u'replaceWithSourceString', PyJsHoisted_replaceWithSourceString_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'replaceWithMultiple', var.get(u'replaceWithMultiple')) + var.get(u'exports').put(u'replaceWithSourceString', var.get(u'replaceWithSourceString')) + var.get(u'exports').put(u'replaceWith', var.get(u'replaceWith')) + var.get(u'exports').put(u'_replaceWith', var.get(u'_replaceWith')) + var.get(u'exports').put(u'replaceExpressionWithStatements', var.get(u'replaceExpressionWithStatements')) + var.get(u'exports').put(u'replaceInline', var.get(u'replaceInline')) + var.put(u'_babelCodeFrame', var.get(u'require')(Js(u'babel-code-frame'))) + var.put(u'_babelCodeFrame2', var.get(u'_interopRequireDefault')(var.get(u'_babelCodeFrame'))) + var.put(u'_index', var.get(u'require')(Js(u'../index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + var.put(u'_index3', var.get(u'require')(Js(u'./index'))) + var.put(u'_index4', var.get(u'_interopRequireDefault')(var.get(u'_index3'))) + var.put(u'_babylon', var.get(u'require')(Js(u'babylon'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + @Js + def PyJs_Function_2087_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_2087_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_Function_2087_._set_name(u'Function') + @Js + def PyJs_VariableDeclaration_2088_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'VariableDeclaration':PyJs_VariableDeclaration_2088_}, var) + var.registers([u'_isArray', u'_iterator', u'key', u'exprs', u'declar', u'_i', u'path', u'bindings', u'_ref']) + if PyJsStrictNeq(var.get(u'path').get(u'node').get(u'kind'),Js(u'var')): + return var.get('undefined') + var.put(u'bindings', var.get(u'path').callprop(u'getBindingIdentifiers')) + for PyJsTemp in var.get(u'bindings'): + var.put(u'key', PyJsTemp) + PyJs_Object_2089_ = Js({u'id':var.get(u'bindings').get(var.get(u'key'))}) + var.get(u'path').get(u'scope').callprop(u'push', PyJs_Object_2089_) + var.put(u'exprs', Js([])) + #for JS loop + var.put(u'_iterator', var.get(u'path').get(u'node').get(u'declarations')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'declar', var.get(u'_ref')) + if var.get(u'declar').get(u'init'): + var.get(u'exprs').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'declar').get(u'id'), var.get(u'declar').get(u'init')))) + + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'exprs')) + PyJs_VariableDeclaration_2088_._set_name(u'VariableDeclaration') + PyJs_Object_2086_ = Js({u'Function':PyJs_Function_2087_,u'VariableDeclaration':PyJs_VariableDeclaration_2088_}) + var.put(u'hoistVariablesVisitor', PyJs_Object_2086_) + pass + pass + pass + pass + pass + pass +PyJs_anonymous_2083_._set_name(u'anonymous') +PyJs_Object_2092_ = Js({u'../index':Js(225.0),u'./index':Js(232.0),u'babel-code-frame':Js(4.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0),u'babylon':Js(262.0)}) +@Js +def PyJs_anonymous_2093_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'Binding', u'module', u'_interopRequireDefault', u'_classCallCheck3', u'_classCallCheck2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2094_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2094_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + pass + @Js + def PyJs_anonymous_2095_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Binding']) + @Js + def PyJsHoisted_Binding_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'kind', u'existing', u'path', u'scope', u'_ref', u'identifier']) + var.put(u'existing', var.get(u'_ref').get(u'existing')) + var.put(u'identifier', var.get(u'_ref').get(u'identifier')) + var.put(u'scope', var.get(u'_ref').get(u'scope')) + var.put(u'path', var.get(u'_ref').get(u'path')) + var.put(u'kind', var.get(u'_ref').get(u'kind')) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Binding')) + var.get(u"this").put(u'identifier', var.get(u'identifier')) + var.get(u"this").put(u'scope', var.get(u'scope')) + var.get(u"this").put(u'path', var.get(u'path')) + var.get(u"this").put(u'kind', var.get(u'kind')) + var.get(u"this").put(u'constantViolations', Js([])) + var.get(u"this").put(u'constant', var.get(u'true')) + var.get(u"this").put(u'referencePaths', Js([])) + var.get(u"this").put(u'referenced', Js(False)) + var.get(u"this").put(u'references', Js(0.0)) + var.get(u"this").callprop(u'clearValue') + if var.get(u'existing'): + var.get(u"this").put(u'constantViolations', Js([]).callprop(u'concat', var.get(u'existing').get(u'path'), var.get(u'existing').get(u'constantViolations'), var.get(u"this").get(u'constantViolations'))) + PyJsHoisted_Binding_.func_name = u'Binding' + var.put(u'Binding', PyJsHoisted_Binding_) + pass + @Js + def PyJs_deoptValue_2096_(this, arguments, var=var): + var = Scope({u'this':this, u'deoptValue':PyJs_deoptValue_2096_, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'clearValue') + var.get(u"this").put(u'hasDeoptedValue', var.get(u'true')) + PyJs_deoptValue_2096_._set_name(u'deoptValue') + var.get(u'Binding').get(u'prototype').put(u'deoptValue', PyJs_deoptValue_2096_) + @Js + def PyJs_setValue_2097_(value, this, arguments, var=var): + var = Scope({u'this':this, u'setValue':PyJs_setValue_2097_, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + if var.get(u"this").get(u'hasDeoptedValue'): + return var.get('undefined') + var.get(u"this").put(u'hasValue', var.get(u'true')) + var.get(u"this").put(u'value', var.get(u'value')) + PyJs_setValue_2097_._set_name(u'setValue') + var.get(u'Binding').get(u'prototype').put(u'setValue', PyJs_setValue_2097_) + @Js + def PyJs_clearValue_2098_(this, arguments, var=var): + var = Scope({u'this':this, u'clearValue':PyJs_clearValue_2098_, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'hasDeoptedValue', Js(False)) + var.get(u"this").put(u'hasValue', Js(False)) + var.get(u"this").put(u'value', var.get(u"null")) + PyJs_clearValue_2098_._set_name(u'clearValue') + var.get(u'Binding').get(u'prototype').put(u'clearValue', PyJs_clearValue_2098_) + @Js + def PyJs_reassign_2099_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'reassign':PyJs_reassign_2099_}, var) + var.registers([u'path']) + var.get(u"this").put(u'constant', Js(False)) + if PyJsStrictNeq(var.get(u"this").get(u'constantViolations').callprop(u'indexOf', var.get(u'path')),(-Js(1.0))): + return var.get('undefined') + var.get(u"this").get(u'constantViolations').callprop(u'push', var.get(u'path')) + PyJs_reassign_2099_._set_name(u'reassign') + var.get(u'Binding').get(u'prototype').put(u'reassign', PyJs_reassign_2099_) + @Js + def PyJs_reference_2100_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'reference':PyJs_reference_2100_}, var) + var.registers([u'path']) + if PyJsStrictNeq(var.get(u"this").get(u'referencePaths').callprop(u'indexOf', var.get(u'path')),(-Js(1.0))): + return var.get('undefined') + var.get(u"this").put(u'referenced', var.get(u'true')) + (var.get(u"this").put(u'references',Js(var.get(u"this").get(u'references').to_number())+Js(1))-Js(1)) + var.get(u"this").get(u'referencePaths').callprop(u'push', var.get(u'path')) + PyJs_reference_2100_._set_name(u'reference') + var.get(u'Binding').get(u'prototype').put(u'reference', PyJs_reference_2100_) + @Js + def PyJs_dereference_2101_(this, arguments, var=var): + var = Scope({u'this':this, u'dereference':PyJs_dereference_2101_, u'arguments':arguments}, var) + var.registers([]) + (var.get(u"this").put(u'references',Js(var.get(u"this").get(u'references').to_number())-Js(1))+Js(1)) + var.get(u"this").put(u'referenced', var.get(u"this").get(u'references').neg().neg()) + PyJs_dereference_2101_._set_name(u'dereference') + var.get(u'Binding').get(u'prototype').put(u'dereference', PyJs_dereference_2101_) + return var.get(u'Binding') + PyJs_anonymous_2095_._set_name(u'anonymous') + var.put(u'Binding', PyJs_anonymous_2095_()) + var.get(u'exports').put(u'default', var.get(u'Binding')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_2093_._set_name(u'anonymous') +PyJs_Object_2102_ = Js({u'babel-runtime/helpers/classCallCheck':Js(110.0)}) +@Js +def PyJs_anonymous_2103_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_binding3', u'_binding2', u'uid', u'_defaults', u'module', u'Scope', u'_interopRequireDefault', u'_cache', u'_getIterator2', u'_getIterator3', u'_renamer2', u'_create2', u'_keys', u'_globals2', u't', u'_classCallCheck3', u'_classCallCheck2', u'_babelMessages', u'_create', u'_renamer', u'exports', u'_interopRequireWildcard', u'_babelTypes', u'_includes2', u'_globals', u'_keys2', u'collectorVisitor', u'_index2', u'_defaults2', u'_repeat2', u'getCache', u'_map2', u'_map', u'_crawlCallsCount', u'require', u'_index', u'messages', u'_repeat', u'_includes']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2105_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2105_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_getCache_(path, parentScope, self, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'self':self, u'arguments':arguments, u'parentScope':parentScope}, var) + var.registers([u'scopes', u'_isArray', u'_iterator', u'self', u'parentScope', u'_i', u'path', u'scope', u'_ref']) + var.put(u'scopes', (var.get(u'_cache').get(u'scope').callprop(u'get', var.get(u'path').get(u'node')) or Js([]))) + #for JS loop + var.put(u'_iterator', var.get(u'scopes')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'scope', var.get(u'_ref')) + if (PyJsStrictEq(var.get(u'scope').get(u'parent'),var.get(u'parentScope')) and PyJsStrictEq(var.get(u'scope').get(u'path'),var.get(u'path'))): + return var.get(u'scope') + + var.get(u'scopes').callprop(u'push', var.get(u'self')) + if var.get(u'_cache').get(u'scope').callprop(u'has', var.get(u'path').get(u'node')).neg(): + var.get(u'_cache').get(u'scope').callprop(u'set', var.get(u'path').get(u'node'), var.get(u'scopes')) + PyJsHoisted_getCache_.func_name = u'getCache' + var.put(u'getCache', PyJsHoisted_getCache_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2104_ = Js({}) + var.put(u'newObj', PyJs_Object_2104_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_keys', var.get(u'require')(Js(u'babel-runtime/core-js/object/keys'))) + var.put(u'_keys2', var.get(u'_interopRequireDefault')(var.get(u'_keys'))) + var.put(u'_create', var.get(u'require')(Js(u'babel-runtime/core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + var.put(u'_map', var.get(u'require')(Js(u'babel-runtime/core-js/map'))) + var.put(u'_map2', var.get(u'_interopRequireDefault')(var.get(u'_map'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_includes', var.get(u'require')(Js(u'lodash/includes'))) + var.put(u'_includes2', var.get(u'_interopRequireDefault')(var.get(u'_includes'))) + var.put(u'_repeat', var.get(u'require')(Js(u'lodash/repeat'))) + var.put(u'_repeat2', var.get(u'_interopRequireDefault')(var.get(u'_repeat'))) + var.put(u'_renamer', var.get(u'require')(Js(u'./lib/renamer'))) + var.put(u'_renamer2', var.get(u'_interopRequireDefault')(var.get(u'_renamer'))) + var.put(u'_index', var.get(u'require')(Js(u'../index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + var.put(u'_defaults', var.get(u'require')(Js(u'lodash/defaults'))) + var.put(u'_defaults2', var.get(u'_interopRequireDefault')(var.get(u'_defaults'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_binding2', var.get(u'require')(Js(u'./binding'))) + var.put(u'_binding3', var.get(u'_interopRequireDefault')(var.get(u'_binding2'))) + var.put(u'_globals', var.get(u'require')(Js(u'globals'))) + var.put(u'_globals2', var.get(u'_interopRequireDefault')(var.get(u'_globals'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_cache', var.get(u'require')(Js(u'../cache'))) + pass + pass + var.put(u'_crawlCallsCount', Js(0.0)) + pass + @Js + def PyJs_For_2107_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'For':PyJs_For_2107_}, var) + var.registers([u'_isArray2', u'_i2', u'_ref2', u'declar', u'key', u'path', u'_iterator2']) + #for JS loop + var.put(u'_iterator2', var.get(u't').get(u'FOR_INIT_KEYS')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'key', var.get(u'_ref2')) + var.put(u'declar', var.get(u'path').callprop(u'get', var.get(u'key'))) + if var.get(u'declar').callprop(u'isVar'): + var.get(u'path').get(u'scope').callprop(u'getFunctionParent').callprop(u'registerBinding', Js(u'var'), var.get(u'declar')) + + PyJs_For_2107_._set_name(u'For') + @Js + def PyJs_Declaration_2108_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'Declaration':PyJs_Declaration_2108_}, var) + var.registers([u'path']) + if var.get(u'path').callprop(u'isBlockScoped'): + return var.get('undefined') + if (var.get(u'path').callprop(u'isExportDeclaration') and var.get(u'path').callprop(u'get', Js(u'declaration')).callprop(u'isDeclaration')): + return var.get('undefined') + var.get(u'path').get(u'scope').callprop(u'getFunctionParent').callprop(u'registerDeclaration', var.get(u'path')) + PyJs_Declaration_2108_._set_name(u'Declaration') + @Js + def PyJs_ReferencedIdentifier_2109_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_2109_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + var.get(u'state').get(u'references').callprop(u'push', var.get(u'path')) + PyJs_ReferencedIdentifier_2109_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_ForXStatement_2110_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'ForXStatement':PyJs_ForXStatement_2110_}, var) + var.registers([u'path', u'state', u'left']) + var.put(u'left', var.get(u'path').callprop(u'get', Js(u'left'))) + if (var.get(u'left').callprop(u'isPattern') or var.get(u'left').callprop(u'isIdentifier')): + var.get(u'state').get(u'constantViolations').callprop(u'push', var.get(u'left')) + PyJs_ForXStatement_2110_._set_name(u'ForXStatement') + @Js + def PyJs_exit_2112_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_2112_, u'arguments':arguments}, var) + var.registers([u'node', u'decl', u'_isArray3', u'name', u'_i3', u'binding', u'ids', u'declar', u'_binding', u'path', u'scope', u'_id', u'_ref3', u'_iterator3']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'declar', var.get(u'node').get(u'declaration')) + if (var.get(u't').callprop(u'isClassDeclaration', var.get(u'declar')) or var.get(u't').callprop(u'isFunctionDeclaration', var.get(u'declar'))): + var.put(u'_id', var.get(u'declar').get(u'id')) + if var.get(u'_id').neg(): + return var.get('undefined') + var.put(u'binding', var.get(u'scope').callprop(u'getBinding', var.get(u'_id').get(u'name'))) + if var.get(u'binding'): + var.get(u'binding').callprop(u'reference', var.get(u'path')) + else: + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'declar')): + #for JS loop + var.put(u'_iterator3', var.get(u'declar').get(u'declarations')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'decl', var.get(u'_ref3')) + var.put(u'ids', var.get(u't').callprop(u'getBindingIdentifiers', var.get(u'decl'))) + for PyJsTemp in var.get(u'ids'): + var.put(u'name', PyJsTemp) + var.put(u'_binding', var.get(u'scope').callprop(u'getBinding', var.get(u'name'))) + if var.get(u'_binding'): + var.get(u'_binding').callprop(u'reference', var.get(u'path')) + + PyJs_exit_2112_._set_name(u'exit') + PyJs_Object_2111_ = Js({u'exit':PyJs_exit_2112_}) + @Js + def PyJs_LabeledStatement_2113_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'LabeledStatement':PyJs_LabeledStatement_2113_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').get(u'scope').callprop(u'getProgramParent').callprop(u'addGlobal', var.get(u'path').get(u'node')) + var.get(u'path').get(u'scope').callprop(u'getBlockParent').callprop(u'registerDeclaration', var.get(u'path')) + PyJs_LabeledStatement_2113_._set_name(u'LabeledStatement') + @Js + def PyJs_AssignmentExpression_2114_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'AssignmentExpression':PyJs_AssignmentExpression_2114_}, var) + var.registers([u'path', u'state']) + var.get(u'state').get(u'assignments').callprop(u'push', var.get(u'path')) + PyJs_AssignmentExpression_2114_._set_name(u'AssignmentExpression') + @Js + def PyJs_UpdateExpression_2115_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'UpdateExpression':PyJs_UpdateExpression_2115_}, var) + var.registers([u'path', u'state']) + var.get(u'state').get(u'constantViolations').callprop(u'push', var.get(u'path').callprop(u'get', Js(u'argument'))) + PyJs_UpdateExpression_2115_._set_name(u'UpdateExpression') + @Js + def PyJs_UnaryExpression_2116_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'UnaryExpression':PyJs_UnaryExpression_2116_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if PyJsStrictEq(var.get(u'path').get(u'node').get(u'operator'),Js(u'delete')): + var.get(u'state').get(u'constantViolations').callprop(u'push', var.get(u'path').callprop(u'get', Js(u'argument'))) + PyJs_UnaryExpression_2116_._set_name(u'UnaryExpression') + @Js + def PyJs_BlockScoped_2117_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'BlockScoped':PyJs_BlockScoped_2117_}, var) + var.registers([u'scope', u'path']) + var.put(u'scope', var.get(u'path').get(u'scope')) + if PyJsStrictEq(var.get(u'scope').get(u'path'),var.get(u'path')): + var.put(u'scope', var.get(u'scope').get(u'parent')) + var.get(u'scope').callprop(u'getBlockParent').callprop(u'registerDeclaration', var.get(u'path')) + PyJs_BlockScoped_2117_._set_name(u'BlockScoped') + @Js + def PyJs_ClassDeclaration_2118_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ClassDeclaration':PyJs_ClassDeclaration_2118_, u'arguments':arguments}, var) + var.registers([u'path', u'id', u'name']) + var.put(u'id', var.get(u'path').get(u'node').get(u'id')) + if var.get(u'id').neg(): + return var.get('undefined') + var.put(u'name', var.get(u'id').get(u'name')) + var.get(u'path').get(u'scope').get(u'bindings').put(var.get(u'name'), var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'name'))) + PyJs_ClassDeclaration_2118_._set_name(u'ClassDeclaration') + @Js + def PyJs_Block_2119_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'Block':PyJs_Block_2119_}, var) + var.registers([u'paths', u'_isArray4', u'bodyPath', u'_ref4', u'_i4', u'path', u'_iterator4']) + var.put(u'paths', var.get(u'path').callprop(u'get', Js(u'body'))) + #for JS loop + var.put(u'_iterator4', var.get(u'paths')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i4').get(u'value')) + var.put(u'bodyPath', var.get(u'_ref4')) + if var.get(u'bodyPath').callprop(u'isFunctionDeclaration'): + var.get(u'path').get(u'scope').callprop(u'getBlockParent').callprop(u'registerDeclaration', var.get(u'bodyPath')) + + PyJs_Block_2119_._set_name(u'Block') + PyJs_Object_2106_ = Js({u'For':PyJs_For_2107_,u'Declaration':PyJs_Declaration_2108_,u'ReferencedIdentifier':PyJs_ReferencedIdentifier_2109_,u'ForXStatement':PyJs_ForXStatement_2110_,u'ExportDeclaration':PyJs_Object_2111_,u'LabeledStatement':PyJs_LabeledStatement_2113_,u'AssignmentExpression':PyJs_AssignmentExpression_2114_,u'UpdateExpression':PyJs_UpdateExpression_2115_,u'UnaryExpression':PyJs_UnaryExpression_2116_,u'BlockScoped':PyJs_BlockScoped_2117_,u'ClassDeclaration':PyJs_ClassDeclaration_2118_,u'Block':PyJs_Block_2119_}) + var.put(u'collectorVisitor', PyJs_Object_2106_) + var.put(u'uid', Js(0.0)) + @Js + def PyJs_anonymous_2120_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Scope']) + @Js + def PyJsHoisted_Scope_(path, parentScope, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'parentScope':parentScope}, var) + var.registers([u'cached', u'path', u'parentScope']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Scope')) + if (var.get(u'parentScope') and PyJsStrictEq(var.get(u'parentScope').get(u'block'),var.get(u'path').get(u'node'))): + return var.get(u'parentScope') + var.put(u'cached', var.get(u'getCache')(var.get(u'path'), var.get(u'parentScope'), var.get(u"this"))) + if var.get(u'cached'): + return var.get(u'cached') + var.get(u"this").put(u'uid', (var.put(u'uid',Js(var.get(u'uid').to_number())+Js(1))-Js(1))) + var.get(u"this").put(u'parent', var.get(u'parentScope')) + var.get(u"this").put(u'hub', var.get(u'path').get(u'hub')) + var.get(u"this").put(u'parentBlock', var.get(u'path').get(u'parent')) + var.get(u"this").put(u'block', var.get(u'path').get(u'node')) + var.get(u"this").put(u'path', var.get(u'path')) + var.get(u"this").put(u'labels', var.get(u'_map2').get(u'default').create()) + PyJsHoisted_Scope_.func_name = u'Scope' + var.put(u'Scope', PyJsHoisted_Scope_) + pass + @Js + def PyJs_traverse_2121_(node, opts, state, this, arguments, var=var): + var = Scope({u'node':node, u'traverse':PyJs_traverse_2121_, u'this':this, u'state':state, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'node', u'state', u'opts']) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(var.get(u'node'), var.get(u'opts'), var.get(u"this"), var.get(u'state'), var.get(u"this").get(u'path')) + PyJs_traverse_2121_._set_name(u'traverse') + var.get(u'Scope').get(u'prototype').put(u'traverse', PyJs_traverse_2121_) + @Js + def PyJs_generateDeclaredUidIdentifier_2122_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'generateDeclaredUidIdentifier':PyJs_generateDeclaredUidIdentifier_2122_}, var) + var.registers([u'name', u'id']) + var.put(u'name', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else Js(u'temp'))) + var.put(u'id', var.get(u"this").callprop(u'generateUidIdentifier', var.get(u'name'))) + PyJs_Object_2123_ = Js({u'id':var.get(u'id')}) + var.get(u"this").callprop(u'push', PyJs_Object_2123_) + return var.get(u'id') + PyJs_generateDeclaredUidIdentifier_2122_._set_name(u'generateDeclaredUidIdentifier') + var.get(u'Scope').get(u'prototype').put(u'generateDeclaredUidIdentifier', PyJs_generateDeclaredUidIdentifier_2122_) + @Js + def PyJs_generateUidIdentifier_2124_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'generateUidIdentifier':PyJs_generateUidIdentifier_2124_}, var) + var.registers([u'name']) + var.put(u'name', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else Js(u'temp'))) + return var.get(u't').callprop(u'identifier', var.get(u"this").callprop(u'generateUid', var.get(u'name'))) + PyJs_generateUidIdentifier_2124_._set_name(u'generateUidIdentifier') + var.get(u'Scope').get(u'prototype').put(u'generateUidIdentifier', PyJs_generateUidIdentifier_2124_) + @Js + def PyJs_generateUid_2125_(this, arguments, var=var): + var = Scope({u'this':this, u'generateUid':PyJs_generateUid_2125_, u'arguments':arguments}, var) + var.registers([u'i', u'program', u'name', u'uid']) + var.put(u'name', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else Js(u'temp'))) + var.put(u'name', var.get(u't').callprop(u'toIdentifier', var.get(u'name')).callprop(u'replace', JsRegExp(u'/^_+/'), Js(u'')).callprop(u'replace', JsRegExp(u'/[0-9]+$/g'), Js(u''))) + var.put(u'uid', PyJsComma(Js(0.0), Js(None))) + var.put(u'i', Js(0.0)) + while 1: + var.put(u'uid', var.get(u"this").callprop(u'_generateUid', var.get(u'name'), var.get(u'i'))) + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + if not (((var.get(u"this").callprop(u'hasLabel', var.get(u'uid')) or var.get(u"this").callprop(u'hasBinding', var.get(u'uid'))) or var.get(u"this").callprop(u'hasGlobal', var.get(u'uid'))) or var.get(u"this").callprop(u'hasReference', var.get(u'uid'))): + break + var.put(u'program', var.get(u"this").callprop(u'getProgramParent')) + var.get(u'program').get(u'references').put(var.get(u'uid'), var.get(u'true')) + var.get(u'program').get(u'uids').put(var.get(u'uid'), var.get(u'true')) + return var.get(u'uid') + PyJs_generateUid_2125_._set_name(u'generateUid') + var.get(u'Scope').get(u'prototype').put(u'generateUid', PyJs_generateUid_2125_) + @Js + def PyJs__generateUid_2126_(name, i, this, arguments, var=var): + var = Scope({u'i':i, u'this':this, u'_generateUid':PyJs__generateUid_2126_, u'name':name, u'arguments':arguments}, var) + var.registers([u'i', u'id', u'name']) + var.put(u'id', var.get(u'name')) + if (var.get(u'i')>Js(1.0)): + var.put(u'id', var.get(u'i'), u'+') + return (Js(u'_')+var.get(u'id')) + PyJs__generateUid_2126_._set_name(u'_generateUid') + var.get(u'Scope').get(u'prototype').put(u'_generateUid', PyJs__generateUid_2126_) + @Js + def PyJs_generateUidIdentifierBasedOnNode_2127_(parent, defaultName, this, arguments, var=var): + var = Scope({u'this':this, u'defaultName':defaultName, u'generateUidIdentifierBasedOnNode':PyJs_generateUidIdentifierBasedOnNode_2127_, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent', u'defaultName', u'add', u'parts', u'id']) + var.put(u'node', var.get(u'parent')) + if var.get(u't').callprop(u'isAssignmentExpression', var.get(u'parent')): + var.put(u'node', var.get(u'parent').get(u'left')) + else: + if var.get(u't').callprop(u'isVariableDeclarator', var.get(u'parent')): + var.put(u'node', var.get(u'parent').get(u'id')) + else: + if (var.get(u't').callprop(u'isObjectProperty', var.get(u'node')) or var.get(u't').callprop(u'isObjectMethod', var.get(u'node'))): + var.put(u'node', var.get(u'node').get(u'key')) + var.put(u'parts', Js([])) + @Js + def PyJs_add_2128_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'add':PyJs_add_2128_, u'arguments':arguments}, var) + var.registers([u'node', u'specifier', u'_isArray5', u'_isArray6', u'_i6', u'_ref5', u'prop', u'_ref6', u'_iterator5', u'_iterator6', u'_i5']) + if var.get(u't').callprop(u'isModuleDeclaration', var.get(u'node')): + if var.get(u'node').get(u'source'): + var.get(u'add')(var.get(u'node').get(u'source')) + else: + if (var.get(u'node').get(u'specifiers') and var.get(u'node').get(u'specifiers').get(u'length')): + #for JS loop + var.put(u'_iterator5', var.get(u'node').get(u'specifiers')) + var.put(u'_isArray5', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator5'))) + var.put(u'_i5', Js(0.0)) + var.put(u'_iterator5', (var.get(u'_iterator5') if var.get(u'_isArray5') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator5')))) + while 1: + pass + if var.get(u'_isArray5'): + if (var.get(u'_i5')>=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i5').get(u'value')) + var.put(u'specifier', var.get(u'_ref5')) + var.get(u'add')(var.get(u'specifier')) + + else: + if var.get(u'node').get(u'declaration'): + var.get(u'add')(var.get(u'node').get(u'declaration')) + else: + if var.get(u't').callprop(u'isModuleSpecifier', var.get(u'node')): + var.get(u'add')(var.get(u'node').get(u'local')) + else: + if var.get(u't').callprop(u'isMemberExpression', var.get(u'node')): + var.get(u'add')(var.get(u'node').get(u'object')) + var.get(u'add')(var.get(u'node').get(u'property')) + else: + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + var.get(u'parts').callprop(u'push', var.get(u'node').get(u'name')) + else: + if var.get(u't').callprop(u'isLiteral', var.get(u'node')): + var.get(u'parts').callprop(u'push', var.get(u'node').get(u'value')) + else: + if var.get(u't').callprop(u'isCallExpression', var.get(u'node')): + var.get(u'add')(var.get(u'node').get(u'callee')) + else: + if (var.get(u't').callprop(u'isObjectExpression', var.get(u'node')) or var.get(u't').callprop(u'isObjectPattern', var.get(u'node'))): + #for JS loop + var.put(u'_iterator6', var.get(u'node').get(u'properties')) + var.put(u'_isArray6', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator6'))) + var.put(u'_i6', Js(0.0)) + var.put(u'_iterator6', (var.get(u'_iterator6') if var.get(u'_isArray6') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator6')))) + while 1: + pass + if var.get(u'_isArray6'): + if (var.get(u'_i6')>=var.get(u'_iterator6').get(u'length')): + break + var.put(u'_ref6', var.get(u'_iterator6').get((var.put(u'_i6',Js(var.get(u'_i6').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i6', var.get(u'_iterator6').callprop(u'next')) + if var.get(u'_i6').get(u'done'): + break + var.put(u'_ref6', var.get(u'_i6').get(u'value')) + var.put(u'prop', var.get(u'_ref6')) + var.get(u'add')((var.get(u'prop').get(u'key') or var.get(u'prop').get(u'argument'))) + + PyJs_add_2128_._set_name(u'add') + var.put(u'add', PyJs_add_2128_) + var.get(u'add')(var.get(u'node')) + var.put(u'id', var.get(u'parts').callprop(u'join', Js(u'$'))) + var.put(u'id', ((var.get(u'id').callprop(u'replace', JsRegExp(u'/^_/'), Js(u'')) or var.get(u'defaultName')) or Js(u'ref'))) + return var.get(u"this").callprop(u'generateUidIdentifier', var.get(u'id').callprop(u'slice', Js(0.0), Js(20.0))) + PyJs_generateUidIdentifierBasedOnNode_2127_._set_name(u'generateUidIdentifierBasedOnNode') + var.get(u'Scope').get(u'prototype').put(u'generateUidIdentifierBasedOnNode', PyJs_generateUidIdentifierBasedOnNode_2127_) + @Js + def PyJs_isStatic_2129_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'isStatic':PyJs_isStatic_2129_, u'arguments':arguments}, var) + var.registers([u'node', u'binding']) + if (var.get(u't').callprop(u'isThisExpression', var.get(u'node')) or var.get(u't').callprop(u'isSuper', var.get(u'node'))): + return var.get(u'true') + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + var.put(u'binding', var.get(u"this").callprop(u'getBinding', var.get(u'node').get(u'name'))) + if var.get(u'binding'): + return var.get(u'binding').get(u'constant') + else: + return var.get(u"this").callprop(u'hasBinding', var.get(u'node').get(u'name')) + return Js(False) + PyJs_isStatic_2129_._set_name(u'isStatic') + var.get(u'Scope').get(u'prototype').put(u'isStatic', PyJs_isStatic_2129_) + @Js + def PyJs_maybeGenerateMemoised_2130_(node, dontPush, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'maybeGenerateMemoised':PyJs_maybeGenerateMemoised_2130_, u'dontPush':dontPush, u'arguments':arguments}, var) + var.registers([u'node', u'dontPush', u'_id2']) + if var.get(u"this").callprop(u'isStatic', var.get(u'node')): + return var.get(u"null") + else: + var.put(u'_id2', var.get(u"this").callprop(u'generateUidIdentifierBasedOnNode', var.get(u'node'))) + if var.get(u'dontPush').neg(): + PyJs_Object_2131_ = Js({u'id':var.get(u'_id2')}) + var.get(u"this").callprop(u'push', PyJs_Object_2131_) + return var.get(u'_id2') + PyJs_maybeGenerateMemoised_2130_._set_name(u'maybeGenerateMemoised') + var.get(u'Scope').get(u'prototype').put(u'maybeGenerateMemoised', PyJs_maybeGenerateMemoised_2130_) + @Js + def PyJs_checkBlockScopedCollisions_2132_(local, kind, name, id, this, arguments, var=var): + var = Scope({u'kind':kind, u'name':name, u'this':this, u'checkBlockScopedCollisions':PyJs_checkBlockScopedCollisions_2132_, u'local':local, u'id':id, u'arguments':arguments}, var) + var.registers([u'id', u'duplicate', u'local', u'kind', u'name']) + if PyJsStrictEq(var.get(u'kind'),Js(u'param')): + return var.get('undefined') + if (PyJsStrictEq(var.get(u'kind'),Js(u'hoisted')) and PyJsStrictEq(var.get(u'local').get(u'kind'),Js(u'let'))): + return var.get('undefined') + var.put(u'duplicate', Js(False)) + if var.get(u'duplicate').neg(): + var.put(u'duplicate', (((PyJsStrictEq(var.get(u'kind'),Js(u'let')) or PyJsStrictEq(var.get(u'local').get(u'kind'),Js(u'let'))) or PyJsStrictEq(var.get(u'local').get(u'kind'),Js(u'const'))) or PyJsStrictEq(var.get(u'local').get(u'kind'),Js(u'module')))) + if var.get(u'duplicate').neg(): + var.put(u'duplicate', (PyJsStrictEq(var.get(u'local').get(u'kind'),Js(u'param')) and (PyJsStrictEq(var.get(u'kind'),Js(u'let')) or PyJsStrictEq(var.get(u'kind'),Js(u'const'))))) + if var.get(u'duplicate'): + PyJsTempException = JsToPyException(var.get(u"this").get(u'hub').get(u'file').callprop(u'buildCodeFrameError', var.get(u'id'), var.get(u'messages').callprop(u'get', Js(u'scopeDuplicateDeclaration'), var.get(u'name')), var.get(u'TypeError'))) + raise PyJsTempException + PyJs_checkBlockScopedCollisions_2132_._set_name(u'checkBlockScopedCollisions') + var.get(u'Scope').get(u'prototype').put(u'checkBlockScopedCollisions', PyJs_checkBlockScopedCollisions_2132_) + @Js + def PyJs_rename_2133_(oldName, newName, block, this, arguments, var=var): + var = Scope({u'rename':PyJs_rename_2133_, u'newName':newName, u'this':this, u'oldName':oldName, u'block':block, u'arguments':arguments}, var) + var.registers([u'newName', u'binding', u'oldName', u'block']) + var.put(u'binding', var.get(u"this").callprop(u'getBinding', var.get(u'oldName'))) + if var.get(u'binding'): + var.put(u'newName', (var.get(u'newName') or var.get(u"this").callprop(u'generateUidIdentifier', var.get(u'oldName')).get(u'name'))) + return var.get(u'_renamer2').get(u'default').create(var.get(u'binding'), var.get(u'oldName'), var.get(u'newName')).callprop(u'rename', var.get(u'block')) + PyJs_rename_2133_._set_name(u'rename') + var.get(u'Scope').get(u'prototype').put(u'rename', PyJs_rename_2133_) + @Js + def PyJs__renameFromMap_2134_(map, oldName, newName, value, this, arguments, var=var): + var = Scope({u'map':map, u'_renameFromMap':PyJs__renameFromMap_2134_, u'oldName':oldName, u'newName':newName, u'this':this, u'value':value, u'arguments':arguments}, var) + var.registers([u'newName', u'map', u'oldName', u'value']) + if var.get(u'map').get(var.get(u'oldName')): + var.get(u'map').put(var.get(u'newName'), var.get(u'value')) + var.get(u'map').put(var.get(u'oldName'), var.get(u"null")) + PyJs__renameFromMap_2134_._set_name(u'_renameFromMap') + var.get(u'Scope').get(u'prototype').put(u'_renameFromMap', PyJs__renameFromMap_2134_) + @Js + def PyJs_dump_2135_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'dump':PyJs_dump_2135_}, var) + var.registers([u'scope', u'binding', u'name', u'sep']) + var.put(u'sep', PyJsComma(Js(0.0),var.get(u'_repeat2').get(u'default'))(Js(u'-'), Js(60.0))) + var.get(u'console').callprop(u'log', var.get(u'sep')) + var.put(u'scope', var.get(u"this")) + while 1: + var.get(u'console').callprop(u'log', Js(u'#'), var.get(u'scope').get(u'block').get(u'type')) + for PyJsTemp in var.get(u'scope').get(u'bindings'): + var.put(u'name', PyJsTemp) + var.put(u'binding', var.get(u'scope').get(u'bindings').get(var.get(u'name'))) + PyJs_Object_2136_ = Js({u'constant':var.get(u'binding').get(u'constant'),u'references':var.get(u'binding').get(u'references'),u'violations':var.get(u'binding').get(u'constantViolations').get(u'length'),u'kind':var.get(u'binding').get(u'kind')}) + var.get(u'console').callprop(u'log', Js(u' -'), var.get(u'name'), PyJs_Object_2136_) + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + var.get(u'console').callprop(u'log', var.get(u'sep')) + PyJs_dump_2135_._set_name(u'dump') + var.get(u'Scope').get(u'prototype').put(u'dump', PyJs_dump_2135_) + @Js + def PyJs_toArray_2137_(node, i, this, arguments, var=var): + var = Scope({u'node':node, u'i':i, u'this':this, u'arguments':arguments, u'toArray':PyJs_toArray_2137_}, var) + var.registers([u'node', u'helperName', u'i', u'args', u'binding', u'file']) + var.put(u'file', var.get(u"this").get(u'hub').get(u'file')) + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + var.put(u'binding', var.get(u"this").callprop(u'getBinding', var.get(u'node').get(u'name'))) + if ((var.get(u'binding') and var.get(u'binding').get(u'constant')) and var.get(u'binding').get(u'path').callprop(u'isGenericType', Js(u'Array'))): + return var.get(u'node') + if var.get(u't').callprop(u'isArrayExpression', var.get(u'node')): + return var.get(u'node') + PyJs_Object_2138_ = Js({u'name':Js(u'arguments')}) + if var.get(u't').callprop(u'isIdentifier', var.get(u'node'), PyJs_Object_2138_): + def PyJs_LONG_2139_(var=var): + return var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'Array')), var.get(u't').callprop(u'identifier', Js(u'prototype'))), var.get(u't').callprop(u'identifier', Js(u'slice'))), var.get(u't').callprop(u'identifier', Js(u'call'))), Js([var.get(u'node')])) + return PyJs_LONG_2139_() + var.put(u'helperName', Js(u'toArray')) + var.put(u'args', Js([var.get(u'node')])) + if PyJsStrictEq(var.get(u'i'),var.get(u'true')): + var.put(u'helperName', Js(u'toConsumableArray')) + else: + if var.get(u'i'): + var.get(u'args').callprop(u'push', var.get(u't').callprop(u'numericLiteral', var.get(u'i'))) + var.put(u'helperName', Js(u'slicedToArray')) + return var.get(u't').callprop(u'callExpression', var.get(u'file').callprop(u'addHelper', var.get(u'helperName')), var.get(u'args')) + PyJs_toArray_2137_._set_name(u'toArray') + var.get(u'Scope').get(u'prototype').put(u'toArray', PyJs_toArray_2137_) + @Js + def PyJs_hasLabel_2140_(name, this, arguments, var=var): + var = Scope({u'this':this, u'hasLabel':PyJs_hasLabel_2140_, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return var.get(u"this").callprop(u'getLabel', var.get(u'name')).neg().neg() + PyJs_hasLabel_2140_._set_name(u'hasLabel') + var.get(u'Scope').get(u'prototype').put(u'hasLabel', PyJs_hasLabel_2140_) + @Js + def PyJs_getLabel_2141_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'getLabel':PyJs_getLabel_2141_, u'arguments':arguments}, var) + var.registers([u'name']) + return var.get(u"this").get(u'labels').callprop(u'get', var.get(u'name')) + PyJs_getLabel_2141_._set_name(u'getLabel') + var.get(u'Scope').get(u'prototype').put(u'getLabel', PyJs_getLabel_2141_) + @Js + def PyJs_registerLabel_2142_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'registerLabel':PyJs_registerLabel_2142_}, var) + var.registers([u'path']) + var.get(u"this").get(u'labels').callprop(u'set', var.get(u'path').get(u'node').get(u'label').get(u'name'), var.get(u'path')) + PyJs_registerLabel_2142_._set_name(u'registerLabel') + var.get(u'Scope').get(u'prototype').put(u'registerLabel', PyJs_registerLabel_2142_) + @Js + def PyJs_registerDeclaration_2143_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'registerDeclaration':PyJs_registerDeclaration_2143_}, var) + var.registers([u'_isArray7', u'specifiers', u'_ref8', u'_i8', u'_i7', u'declarations', u'_isArray8', u'_ref7', u'declar', u'_iterator8', u'path', u'specifier', u'_declar', u'_iterator7']) + if var.get(u'path').callprop(u'isLabeledStatement'): + var.get(u"this").callprop(u'registerLabel', var.get(u'path')) + else: + if var.get(u'path').callprop(u'isFunctionDeclaration'): + var.get(u"this").callprop(u'registerBinding', Js(u'hoisted'), var.get(u'path').callprop(u'get', Js(u'id')), var.get(u'path')) + else: + if var.get(u'path').callprop(u'isVariableDeclaration'): + var.put(u'declarations', var.get(u'path').callprop(u'get', Js(u'declarations'))) + #for JS loop + var.put(u'_iterator7', var.get(u'declarations')) + var.put(u'_isArray7', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator7'))) + var.put(u'_i7', Js(0.0)) + var.put(u'_iterator7', (var.get(u'_iterator7') if var.get(u'_isArray7') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator7')))) + while 1: + pass + if var.get(u'_isArray7'): + if (var.get(u'_i7')>=var.get(u'_iterator7').get(u'length')): + break + var.put(u'_ref7', var.get(u'_iterator7').get((var.put(u'_i7',Js(var.get(u'_i7').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i7', var.get(u'_iterator7').callprop(u'next')) + if var.get(u'_i7').get(u'done'): + break + var.put(u'_ref7', var.get(u'_i7').get(u'value')) + var.put(u'declar', var.get(u'_ref7')) + var.get(u"this").callprop(u'registerBinding', var.get(u'path').get(u'node').get(u'kind'), var.get(u'declar')) + + else: + if var.get(u'path').callprop(u'isClassDeclaration'): + var.get(u"this").callprop(u'registerBinding', Js(u'let'), var.get(u'path')) + else: + if var.get(u'path').callprop(u'isImportDeclaration'): + var.put(u'specifiers', var.get(u'path').callprop(u'get', Js(u'specifiers'))) + #for JS loop + var.put(u'_iterator8', var.get(u'specifiers')) + var.put(u'_isArray8', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator8'))) + var.put(u'_i8', Js(0.0)) + var.put(u'_iterator8', (var.get(u'_iterator8') if var.get(u'_isArray8') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator8')))) + while 1: + pass + if var.get(u'_isArray8'): + if (var.get(u'_i8')>=var.get(u'_iterator8').get(u'length')): + break + var.put(u'_ref8', var.get(u'_iterator8').get((var.put(u'_i8',Js(var.get(u'_i8').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i8', var.get(u'_iterator8').callprop(u'next')) + if var.get(u'_i8').get(u'done'): + break + var.put(u'_ref8', var.get(u'_i8').get(u'value')) + var.put(u'specifier', var.get(u'_ref8')) + var.get(u"this").callprop(u'registerBinding', Js(u'module'), var.get(u'specifier')) + + else: + if var.get(u'path').callprop(u'isExportDeclaration'): + var.put(u'_declar', var.get(u'path').callprop(u'get', Js(u'declaration'))) + if ((var.get(u'_declar').callprop(u'isClassDeclaration') or var.get(u'_declar').callprop(u'isFunctionDeclaration')) or var.get(u'_declar').callprop(u'isVariableDeclaration')): + var.get(u"this").callprop(u'registerDeclaration', var.get(u'_declar')) + else: + var.get(u"this").callprop(u'registerBinding', Js(u'unknown'), var.get(u'path')) + PyJs_registerDeclaration_2143_._set_name(u'registerDeclaration') + var.get(u'Scope').get(u'prototype').put(u'registerDeclaration', PyJs_registerDeclaration_2143_) + @Js + def PyJs_buildUndefinedNode_2144_(this, arguments, var=var): + var = Scope({u'this':this, u'buildUndefinedNode':PyJs_buildUndefinedNode_2144_, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").callprop(u'hasBinding', Js(u'undefined')): + return var.get(u't').callprop(u'unaryExpression', Js(u'void'), var.get(u't').callprop(u'numericLiteral', Js(0.0)), var.get(u'true')) + else: + return var.get(u't').callprop(u'identifier', Js(u'undefined')) + PyJs_buildUndefinedNode_2144_._set_name(u'buildUndefinedNode') + var.get(u'Scope').get(u'prototype').put(u'buildUndefinedNode', PyJs_buildUndefinedNode_2144_) + @Js + def PyJs_registerConstantViolation_2145_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'registerConstantViolation':PyJs_registerConstantViolation_2145_}, var) + var.registers([u'path', u'binding', u'ids', u'name']) + var.put(u'ids', var.get(u'path').callprop(u'getBindingIdentifiers')) + for PyJsTemp in var.get(u'ids'): + var.put(u'name', PyJsTemp) + var.put(u'binding', var.get(u"this").callprop(u'getBinding', var.get(u'name'))) + if var.get(u'binding'): + var.get(u'binding').callprop(u'reassign', var.get(u'path')) + PyJs_registerConstantViolation_2145_._set_name(u'registerConstantViolation') + var.get(u'Scope').get(u'prototype').put(u'registerConstantViolation', PyJs_registerConstantViolation_2145_) + @Js + def PyJs_registerBinding_2146_(kind, path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'kind':kind, u'arguments':arguments, u'registerBinding':PyJs_registerBinding_2146_}, var) + var.registers([u'parent', u'kind', u'_i10', u'_i9', u'_ref9', u'name', u'_ref10', u'ids', u'_isArray9', u'declarators', u'declar', u'_iterator9', u'_isArray10', u'_iterator10', u'path', u'_id3', u'local', u'bindingPath']) + var.put(u'bindingPath', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else var.get(u'path'))) + if var.get(u'kind').neg(): + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create(Js(u'no `kind`'))) + raise PyJsTempException + if var.get(u'path').callprop(u'isVariableDeclaration'): + var.put(u'declarators', var.get(u'path').callprop(u'get', Js(u'declarations'))) + #for JS loop + var.put(u'_iterator9', var.get(u'declarators')) + var.put(u'_isArray9', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator9'))) + var.put(u'_i9', Js(0.0)) + var.put(u'_iterator9', (var.get(u'_iterator9') if var.get(u'_isArray9') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator9')))) + while 1: + pass + if var.get(u'_isArray9'): + if (var.get(u'_i9')>=var.get(u'_iterator9').get(u'length')): + break + var.put(u'_ref9', var.get(u'_iterator9').get((var.put(u'_i9',Js(var.get(u'_i9').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i9', var.get(u'_iterator9').callprop(u'next')) + if var.get(u'_i9').get(u'done'): + break + var.put(u'_ref9', var.get(u'_i9').get(u'value')) + var.put(u'declar', var.get(u'_ref9')) + var.get(u"this").callprop(u'registerBinding', var.get(u'kind'), var.get(u'declar')) + + return var.get('undefined') + var.put(u'parent', var.get(u"this").callprop(u'getProgramParent')) + var.put(u'ids', var.get(u'path').callprop(u'getBindingIdentifiers', var.get(u'true'))) + for PyJsTemp in var.get(u'ids'): + var.put(u'name', PyJsTemp) + #for JS loop + var.put(u'_iterator10', var.get(u'ids').get(var.get(u'name'))) + var.put(u'_isArray10', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator10'))) + var.put(u'_i10', Js(0.0)) + var.put(u'_iterator10', (var.get(u'_iterator10') if var.get(u'_isArray10') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator10')))) + while 1: + pass + if var.get(u'_isArray10'): + if (var.get(u'_i10')>=var.get(u'_iterator10').get(u'length')): + break + var.put(u'_ref10', var.get(u'_iterator10').get((var.put(u'_i10',Js(var.get(u'_i10').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i10', var.get(u'_iterator10').callprop(u'next')) + if var.get(u'_i10').get(u'done'): + break + var.put(u'_ref10', var.get(u'_i10').get(u'value')) + var.put(u'_id3', var.get(u'_ref10')) + var.put(u'local', var.get(u"this").callprop(u'getOwnBinding', var.get(u'name'))) + if var.get(u'local'): + if PyJsStrictEq(var.get(u'local').get(u'identifier'),var.get(u'_id3')): + continue + var.get(u"this").callprop(u'checkBlockScopedCollisions', var.get(u'local'), var.get(u'kind'), var.get(u'name'), var.get(u'_id3')) + if (var.get(u'local') and var.get(u'local').get(u'path').callprop(u'isFlow')): + var.put(u'local', var.get(u"null")) + var.get(u'parent').get(u'references').put(var.get(u'name'), var.get(u'true')) + PyJs_Object_2147_ = Js({u'identifier':var.get(u'_id3'),u'existing':var.get(u'local'),u'scope':var.get(u"this"),u'path':var.get(u'bindingPath'),u'kind':var.get(u'kind')}) + var.get(u"this").get(u'bindings').put(var.get(u'name'), var.get(u'_binding3').get(u'default').create(PyJs_Object_2147_)) + + PyJs_registerBinding_2146_._set_name(u'registerBinding') + var.get(u'Scope').get(u'prototype').put(u'registerBinding', PyJs_registerBinding_2146_) + @Js + def PyJs_addGlobal_2148_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'addGlobal':PyJs_addGlobal_2148_}, var) + var.registers([u'node']) + var.get(u"this").get(u'globals').put(var.get(u'node').get(u'name'), var.get(u'node')) + PyJs_addGlobal_2148_._set_name(u'addGlobal') + var.get(u'Scope').get(u'prototype').put(u'addGlobal', PyJs_addGlobal_2148_) + @Js + def PyJs_hasUid_2149_(name, this, arguments, var=var): + var = Scope({u'this':this, u'hasUid':PyJs_hasUid_2149_, u'name':name, u'arguments':arguments}, var) + var.registers([u'scope', u'name']) + var.put(u'scope', var.get(u"this")) + while 1: + if var.get(u'scope').get(u'uids').get(var.get(u'name')): + return var.get(u'true') + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + return Js(False) + PyJs_hasUid_2149_._set_name(u'hasUid') + var.get(u'Scope').get(u'prototype').put(u'hasUid', PyJs_hasUid_2149_) + @Js + def PyJs_hasGlobal_2150_(name, this, arguments, var=var): + var = Scope({u'this':this, u'hasGlobal':PyJs_hasGlobal_2150_, u'name':name, u'arguments':arguments}, var) + var.registers([u'scope', u'name']) + var.put(u'scope', var.get(u"this")) + while 1: + if var.get(u'scope').get(u'globals').get(var.get(u'name')): + return var.get(u'true') + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + return Js(False) + PyJs_hasGlobal_2150_._set_name(u'hasGlobal') + var.get(u'Scope').get(u'prototype').put(u'hasGlobal', PyJs_hasGlobal_2150_) + @Js + def PyJs_hasReference_2151_(name, this, arguments, var=var): + var = Scope({u'this':this, u'hasReference':PyJs_hasReference_2151_, u'name':name, u'arguments':arguments}, var) + var.registers([u'scope', u'name']) + var.put(u'scope', var.get(u"this")) + while 1: + if var.get(u'scope').get(u'references').get(var.get(u'name')): + return var.get(u'true') + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + return Js(False) + PyJs_hasReference_2151_._set_name(u'hasReference') + var.get(u'Scope').get(u'prototype').put(u'hasReference', PyJs_hasReference_2151_) + @Js + def PyJs_isPure_2152_(node, constantsOnly, this, arguments, var=var): + var = Scope({u'node':node, u'constantsOnly':constantsOnly, u'this':this, u'arguments':arguments, u'isPure':PyJs_isPure_2152_}, var) + var.registers([u'node', u'constantsOnly', u'_isArray11', u'binding', u'elem', u'prop', u'_i13', u'_i12', u'_i11', u'_isArray13', u'_isArray12', u'_ref11', u'_iterator11', u'_ref13', u'_iterator13', u'_iterator12', u'method', u'_ref12']) + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + var.put(u'binding', var.get(u"this").callprop(u'getBinding', var.get(u'node').get(u'name'))) + if var.get(u'binding').neg(): + return Js(False) + if var.get(u'constantsOnly'): + return var.get(u'binding').get(u'constant') + return var.get(u'true') + else: + if var.get(u't').callprop(u'isClass', var.get(u'node')): + if (var.get(u'node').get(u'superClass') and var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'superClass'), var.get(u'constantsOnly')).neg()): + return Js(False) + return var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'body'), var.get(u'constantsOnly')) + else: + if var.get(u't').callprop(u'isClassBody', var.get(u'node')): + #for JS loop + var.put(u'_iterator11', var.get(u'node').get(u'body')) + var.put(u'_isArray11', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator11'))) + var.put(u'_i11', Js(0.0)) + var.put(u'_iterator11', (var.get(u'_iterator11') if var.get(u'_isArray11') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator11')))) + while 1: + pass + if var.get(u'_isArray11'): + if (var.get(u'_i11')>=var.get(u'_iterator11').get(u'length')): + break + var.put(u'_ref11', var.get(u'_iterator11').get((var.put(u'_i11',Js(var.get(u'_i11').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i11', var.get(u'_iterator11').callprop(u'next')) + if var.get(u'_i11').get(u'done'): + break + var.put(u'_ref11', var.get(u'_i11').get(u'value')) + var.put(u'method', var.get(u'_ref11')) + if var.get(u"this").callprop(u'isPure', var.get(u'method'), var.get(u'constantsOnly')).neg(): + return Js(False) + + return var.get(u'true') + else: + if var.get(u't').callprop(u'isBinary', var.get(u'node')): + return (var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'left'), var.get(u'constantsOnly')) and var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'right'), var.get(u'constantsOnly'))) + else: + if var.get(u't').callprop(u'isArrayExpression', var.get(u'node')): + #for JS loop + var.put(u'_iterator12', var.get(u'node').get(u'elements')) + var.put(u'_isArray12', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator12'))) + var.put(u'_i12', Js(0.0)) + var.put(u'_iterator12', (var.get(u'_iterator12') if var.get(u'_isArray12') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator12')))) + while 1: + pass + if var.get(u'_isArray12'): + if (var.get(u'_i12')>=var.get(u'_iterator12').get(u'length')): + break + var.put(u'_ref12', var.get(u'_iterator12').get((var.put(u'_i12',Js(var.get(u'_i12').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i12', var.get(u'_iterator12').callprop(u'next')) + if var.get(u'_i12').get(u'done'): + break + var.put(u'_ref12', var.get(u'_i12').get(u'value')) + var.put(u'elem', var.get(u'_ref12')) + if var.get(u"this").callprop(u'isPure', var.get(u'elem'), var.get(u'constantsOnly')).neg(): + return Js(False) + + return var.get(u'true') + else: + if var.get(u't').callprop(u'isObjectExpression', var.get(u'node')): + #for JS loop + var.put(u'_iterator13', var.get(u'node').get(u'properties')) + var.put(u'_isArray13', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator13'))) + var.put(u'_i13', Js(0.0)) + var.put(u'_iterator13', (var.get(u'_iterator13') if var.get(u'_isArray13') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator13')))) + while 1: + pass + if var.get(u'_isArray13'): + if (var.get(u'_i13')>=var.get(u'_iterator13').get(u'length')): + break + var.put(u'_ref13', var.get(u'_iterator13').get((var.put(u'_i13',Js(var.get(u'_i13').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i13', var.get(u'_iterator13').callprop(u'next')) + if var.get(u'_i13').get(u'done'): + break + var.put(u'_ref13', var.get(u'_i13').get(u'value')) + var.put(u'prop', var.get(u'_ref13')) + if var.get(u"this").callprop(u'isPure', var.get(u'prop'), var.get(u'constantsOnly')).neg(): + return Js(False) + + return var.get(u'true') + else: + if var.get(u't').callprop(u'isClassMethod', var.get(u'node')): + if (var.get(u'node').get(u'computed') and var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'key'), var.get(u'constantsOnly')).neg()): + return Js(False) + if (PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'get')) or PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'set'))): + return Js(False) + return var.get(u'true') + else: + if (var.get(u't').callprop(u'isClassProperty', var.get(u'node')) or var.get(u't').callprop(u'isObjectProperty', var.get(u'node'))): + if (var.get(u'node').get(u'computed') and var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'key'), var.get(u'constantsOnly')).neg()): + return Js(False) + return var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'value'), var.get(u'constantsOnly')) + else: + if var.get(u't').callprop(u'isUnaryExpression', var.get(u'node')): + return var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'argument'), var.get(u'constantsOnly')) + else: + return var.get(u't').callprop(u'isPureish', var.get(u'node')) + PyJs_isPure_2152_._set_name(u'isPure') + var.get(u'Scope').get(u'prototype').put(u'isPure', PyJs_isPure_2152_) + @Js + def PyJs_setData_2153_(key, val, this, arguments, var=var): + var = Scope({u'this':this, u'setData':PyJs_setData_2153_, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'val', u'key']) + return var.get(u"this").get(u'data').put(var.get(u'key'), var.get(u'val')) + PyJs_setData_2153_._set_name(u'setData') + var.get(u'Scope').get(u'prototype').put(u'setData', PyJs_setData_2153_) + @Js + def PyJs_getData_2154_(key, this, arguments, var=var): + var = Scope({u'this':this, u'getData':PyJs_getData_2154_, u'arguments':arguments, u'key':key}, var) + var.registers([u'scope', u'data', u'key']) + var.put(u'scope', var.get(u"this")) + while 1: + var.put(u'data', var.get(u'scope').get(u'data').get(var.get(u'key'))) + if (var.get(u'data')!=var.get(u"null")): + return var.get(u'data') + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJs_getData_2154_._set_name(u'getData') + var.get(u'Scope').get(u'prototype').put(u'getData', PyJs_getData_2154_) + @Js + def PyJs_removeData_2155_(key, this, arguments, var=var): + var = Scope({u'this':this, u'removeData':PyJs_removeData_2155_, u'arguments':arguments, u'key':key}, var) + var.registers([u'scope', u'data', u'key']) + var.put(u'scope', var.get(u"this")) + while 1: + var.put(u'data', var.get(u'scope').get(u'data').get(var.get(u'key'))) + if (var.get(u'data')!=var.get(u"null")): + var.get(u'scope').get(u'data').put(var.get(u'key'), var.get(u"null")) + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJs_removeData_2155_._set_name(u'removeData') + var.get(u'Scope').get(u'prototype').put(u'removeData', PyJs_removeData_2155_) + @Js + def PyJs_init_2156_(this, arguments, var=var): + var = Scope({u'this':this, u'init':PyJs_init_2156_, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'references').neg(): + var.get(u"this").callprop(u'crawl') + PyJs_init_2156_._set_name(u'init') + var.get(u'Scope').get(u'prototype').put(u'init', PyJs_init_2156_) + @Js + def PyJs_crawl_2157_(this, arguments, var=var): + var = Scope({u'this':this, u'crawl':PyJs_crawl_2157_, u'arguments':arguments}, var) + var.registers([]) + (var.put(u'_crawlCallsCount',Js(var.get(u'_crawlCallsCount').to_number())+Js(1))-Js(1)) + var.get(u"this").callprop(u'_crawl') + (var.put(u'_crawlCallsCount',Js(var.get(u'_crawlCallsCount').to_number())-Js(1))+Js(1)) + PyJs_crawl_2157_._set_name(u'crawl') + var.get(u'Scope').get(u'prototype').put(u'crawl', PyJs_crawl_2157_) + @Js + def PyJs__crawl_2158_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'_crawl':PyJs__crawl_2158_}, var) + var.registers([u'binding', u'_ref15', u'param', u'_ref17', u'_ref16', u'state', u'_ref14', u'params', u'_isArray18', u'ref', u'_ref18', u'node', u'parent', u'_isArray17', u'_isArray16', u'_isArray15', u'_isArray14', u'key', u'path', u'_path2', u'_iterator15', u'_iterator14', u'_iterator17', u'_iterator16', u'name', u'_iterator18', u'ids', u'programParent', u'_i17', u'_i16', u'_i15', u'_i14', u'_i18', u'_path']) + var.put(u'path', var.get(u"this").get(u'path')) + var.get(u"this").put(u'references', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.get(u"this").put(u'bindings', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.get(u"this").put(u'globals', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.get(u"this").put(u'uids', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.get(u"this").put(u'data', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + if var.get(u'path').callprop(u'isLoop'): + #for JS loop + var.put(u'_iterator14', var.get(u't').get(u'FOR_INIT_KEYS')) + var.put(u'_isArray14', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator14'))) + var.put(u'_i14', Js(0.0)) + var.put(u'_iterator14', (var.get(u'_iterator14') if var.get(u'_isArray14') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator14')))) + while 1: + pass + if var.get(u'_isArray14'): + if (var.get(u'_i14')>=var.get(u'_iterator14').get(u'length')): + break + var.put(u'_ref14', var.get(u'_iterator14').get((var.put(u'_i14',Js(var.get(u'_i14').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i14', var.get(u'_iterator14').callprop(u'next')) + if var.get(u'_i14').get(u'done'): + break + var.put(u'_ref14', var.get(u'_i14').get(u'value')) + var.put(u'key', var.get(u'_ref14')) + var.put(u'node', var.get(u'path').callprop(u'get', var.get(u'key'))) + if var.get(u'node').callprop(u'isBlockScoped'): + var.get(u"this").callprop(u'registerBinding', var.get(u'node').get(u'node').get(u'kind'), var.get(u'node')) + + if (var.get(u'path').callprop(u'isFunctionExpression') and var.get(u'path').callprop(u'has', Js(u'id'))): + if var.get(u'path').callprop(u'get', Js(u'id')).get(u'node').get(var.get(u't').get(u'NOT_LOCAL_BINDING')).neg(): + var.get(u"this").callprop(u'registerBinding', Js(u'local'), var.get(u'path').callprop(u'get', Js(u'id')), var.get(u'path')) + if (var.get(u'path').callprop(u'isClassExpression') and var.get(u'path').callprop(u'has', Js(u'id'))): + if var.get(u'path').callprop(u'get', Js(u'id')).get(u'node').get(var.get(u't').get(u'NOT_LOCAL_BINDING')).neg(): + var.get(u"this").callprop(u'registerBinding', Js(u'local'), var.get(u'path')) + if var.get(u'path').callprop(u'isFunction'): + var.put(u'params', var.get(u'path').callprop(u'get', Js(u'params'))) + #for JS loop + var.put(u'_iterator15', var.get(u'params')) + var.put(u'_isArray15', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator15'))) + var.put(u'_i15', Js(0.0)) + var.put(u'_iterator15', (var.get(u'_iterator15') if var.get(u'_isArray15') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator15')))) + while 1: + pass + if var.get(u'_isArray15'): + if (var.get(u'_i15')>=var.get(u'_iterator15').get(u'length')): + break + var.put(u'_ref15', var.get(u'_iterator15').get((var.put(u'_i15',Js(var.get(u'_i15').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i15', var.get(u'_iterator15').callprop(u'next')) + if var.get(u'_i15').get(u'done'): + break + var.put(u'_ref15', var.get(u'_i15').get(u'value')) + var.put(u'param', var.get(u'_ref15')) + var.get(u"this").callprop(u'registerBinding', Js(u'param'), var.get(u'param')) + + if var.get(u'path').callprop(u'isCatchClause'): + var.get(u"this").callprop(u'registerBinding', Js(u'let'), var.get(u'path')) + var.put(u'parent', var.get(u"this").callprop(u'getProgramParent')) + if var.get(u'parent').get(u'crawling'): + return var.get('undefined') + PyJs_Object_2159_ = Js({u'references':Js([]),u'constantViolations':Js([]),u'assignments':Js([])}) + var.put(u'state', PyJs_Object_2159_) + var.get(u"this").put(u'crawling', var.get(u'true')) + var.get(u'path').callprop(u'traverse', var.get(u'collectorVisitor'), var.get(u'state')) + var.get(u"this").put(u'crawling', Js(False)) + #for JS loop + var.put(u'_iterator16', var.get(u'state').get(u'assignments')) + var.put(u'_isArray16', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator16'))) + var.put(u'_i16', Js(0.0)) + var.put(u'_iterator16', (var.get(u'_iterator16') if var.get(u'_isArray16') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator16')))) + while 1: + pass + if var.get(u'_isArray16'): + if (var.get(u'_i16')>=var.get(u'_iterator16').get(u'length')): + break + var.put(u'_ref16', var.get(u'_iterator16').get((var.put(u'_i16',Js(var.get(u'_i16').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i16', var.get(u'_iterator16').callprop(u'next')) + if var.get(u'_i16').get(u'done'): + break + var.put(u'_ref16', var.get(u'_i16').get(u'value')) + var.put(u'_path', var.get(u'_ref16')) + var.put(u'ids', var.get(u'_path').callprop(u'getBindingIdentifiers')) + var.put(u'programParent', PyJsComma(Js(0.0), Js(None))) + for PyJsTemp in var.get(u'ids'): + var.put(u'name', PyJsTemp) + if var.get(u'_path').get(u'scope').callprop(u'getBinding', var.get(u'name')): + continue + var.put(u'programParent', (var.get(u'programParent') or var.get(u'_path').get(u'scope').callprop(u'getProgramParent'))) + var.get(u'programParent').callprop(u'addGlobal', var.get(u'ids').get(var.get(u'name'))) + var.get(u'_path').get(u'scope').callprop(u'registerConstantViolation', var.get(u'_path')) + + #for JS loop + var.put(u'_iterator17', var.get(u'state').get(u'references')) + var.put(u'_isArray17', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator17'))) + var.put(u'_i17', Js(0.0)) + var.put(u'_iterator17', (var.get(u'_iterator17') if var.get(u'_isArray17') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator17')))) + while 1: + pass + if var.get(u'_isArray17'): + if (var.get(u'_i17')>=var.get(u'_iterator17').get(u'length')): + break + var.put(u'_ref17', var.get(u'_iterator17').get((var.put(u'_i17',Js(var.get(u'_i17').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i17', var.get(u'_iterator17').callprop(u'next')) + if var.get(u'_i17').get(u'done'): + break + var.put(u'_ref17', var.get(u'_i17').get(u'value')) + var.put(u'ref', var.get(u'_ref17')) + var.put(u'binding', var.get(u'ref').get(u'scope').callprop(u'getBinding', var.get(u'ref').get(u'node').get(u'name'))) + if var.get(u'binding'): + var.get(u'binding').callprop(u'reference', var.get(u'ref')) + else: + var.get(u'ref').get(u'scope').callprop(u'getProgramParent').callprop(u'addGlobal', var.get(u'ref').get(u'node')) + + #for JS loop + var.put(u'_iterator18', var.get(u'state').get(u'constantViolations')) + var.put(u'_isArray18', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator18'))) + var.put(u'_i18', Js(0.0)) + var.put(u'_iterator18', (var.get(u'_iterator18') if var.get(u'_isArray18') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator18')))) + while 1: + pass + if var.get(u'_isArray18'): + if (var.get(u'_i18')>=var.get(u'_iterator18').get(u'length')): + break + var.put(u'_ref18', var.get(u'_iterator18').get((var.put(u'_i18',Js(var.get(u'_i18').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i18', var.get(u'_iterator18').callprop(u'next')) + if var.get(u'_i18').get(u'done'): + break + var.put(u'_ref18', var.get(u'_i18').get(u'value')) + var.put(u'_path2', var.get(u'_ref18')) + var.get(u'_path2').get(u'scope').callprop(u'registerConstantViolation', var.get(u'_path2')) + + PyJs__crawl_2158_._set_name(u'_crawl') + var.get(u'Scope').get(u'prototype').put(u'_crawl', PyJs__crawl_2158_) + @Js + def PyJs_push_2160_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'push':PyJs_push_2160_, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'kind', u'blockHoist', u'_path$unshiftContaine', u'declarPath', u'declar', u'declarator', u'path', u'dataKey', u'unique', u'opts']) + var.put(u'path', var.get(u"this").get(u'path')) + if (var.get(u'path').callprop(u'isBlockStatement').neg() and var.get(u'path').callprop(u'isProgram').neg()): + var.put(u'path', var.get(u"this").callprop(u'getBlockParent').get(u'path')) + if var.get(u'path').callprop(u'isSwitchStatement'): + var.put(u'path', var.get(u"this").callprop(u'getFunctionParent').get(u'path')) + if ((var.get(u'path').callprop(u'isLoop') or var.get(u'path').callprop(u'isCatchClause')) or var.get(u'path').callprop(u'isFunction')): + var.get(u't').callprop(u'ensureBlock', var.get(u'path').get(u'node')) + var.put(u'path', var.get(u'path').callprop(u'get', Js(u'body'))) + var.put(u'unique', var.get(u'opts').get(u'unique')) + var.put(u'kind', (var.get(u'opts').get(u'kind') or Js(u'var'))) + var.put(u'blockHoist', (Js(2.0) if (var.get(u'opts').get(u'_blockHoist')==var.get(u"null")) else var.get(u'opts').get(u'_blockHoist'))) + var.put(u'dataKey', (((Js(u'declaration:')+var.get(u'kind'))+Js(u':'))+var.get(u'blockHoist'))) + var.put(u'declarPath', (var.get(u'unique').neg() and var.get(u'path').callprop(u'getData', var.get(u'dataKey')))) + if var.get(u'declarPath').neg(): + var.put(u'declar', var.get(u't').callprop(u'variableDeclaration', var.get(u'kind'), Js([]))) + var.get(u'declar').put(u'_generated', var.get(u'true')) + var.get(u'declar').put(u'_blockHoist', var.get(u'blockHoist')) + var.put(u'_path$unshiftContaine', var.get(u'path').callprop(u'unshiftContainer', Js(u'body'), Js([var.get(u'declar')]))) + var.put(u'declarPath', var.get(u'_path$unshiftContaine').get(u'0')) + if var.get(u'unique').neg(): + var.get(u'path').callprop(u'setData', var.get(u'dataKey'), var.get(u'declarPath')) + var.put(u'declarator', var.get(u't').callprop(u'variableDeclarator', var.get(u'opts').get(u'id'), var.get(u'opts').get(u'init'))) + var.get(u'declarPath').get(u'node').get(u'declarations').callprop(u'push', var.get(u'declarator')) + var.get(u"this").callprop(u'registerBinding', var.get(u'kind'), var.get(u'declarPath').callprop(u'get', Js(u'declarations')).callprop(u'pop')) + PyJs_push_2160_._set_name(u'push') + var.get(u'Scope').get(u'prototype').put(u'push', PyJs_push_2160_) + @Js + def PyJs_getProgramParent_2161_(this, arguments, var=var): + var = Scope({u'this':this, u'getProgramParent':PyJs_getProgramParent_2161_, u'arguments':arguments}, var) + var.registers([u'scope']) + var.put(u'scope', var.get(u"this")) + while 1: + if var.get(u'scope').get(u'path').callprop(u'isProgram'): + return var.get(u'scope') + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"We couldn't find a Function or Program..."))) + raise PyJsTempException + PyJs_getProgramParent_2161_._set_name(u'getProgramParent') + var.get(u'Scope').get(u'prototype').put(u'getProgramParent', PyJs_getProgramParent_2161_) + @Js + def PyJs_getFunctionParent_2162_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getFunctionParent':PyJs_getFunctionParent_2162_}, var) + var.registers([u'scope']) + var.put(u'scope', var.get(u"this")) + while 1: + if var.get(u'scope').get(u'path').callprop(u'isFunctionParent'): + return var.get(u'scope') + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"We couldn't find a Function or Program..."))) + raise PyJsTempException + PyJs_getFunctionParent_2162_._set_name(u'getFunctionParent') + var.get(u'Scope').get(u'prototype').put(u'getFunctionParent', PyJs_getFunctionParent_2162_) + @Js + def PyJs_getBlockParent_2163_(this, arguments, var=var): + var = Scope({u'this':this, u'getBlockParent':PyJs_getBlockParent_2163_, u'arguments':arguments}, var) + var.registers([u'scope']) + var.put(u'scope', var.get(u"this")) + while 1: + if var.get(u'scope').get(u'path').callprop(u'isBlockParent'): + return var.get(u'scope') + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"We couldn't find a BlockStatement, For, Switch, Function, Loop or Program..."))) + raise PyJsTempException + PyJs_getBlockParent_2163_._set_name(u'getBlockParent') + var.get(u'Scope').get(u'prototype').put(u'getBlockParent', PyJs_getBlockParent_2163_) + @Js + def PyJs_getAllBindings_2164_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getAllBindings':PyJs_getAllBindings_2164_}, var) + var.registers([u'scope', u'ids']) + var.put(u'ids', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'scope', var.get(u"this")) + while 1: + PyJsComma(Js(0.0),var.get(u'_defaults2').get(u'default'))(var.get(u'ids'), var.get(u'scope').get(u'bindings')) + var.put(u'scope', var.get(u'scope').get(u'parent')) + if not var.get(u'scope'): + break + return var.get(u'ids') + PyJs_getAllBindings_2164_._set_name(u'getAllBindings') + var.get(u'Scope').get(u'prototype').put(u'getAllBindings', PyJs_getAllBindings_2164_) + @Js + def PyJs_getAllBindingsOfKind_2165_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getAllBindingsOfKind':PyJs_getAllBindingsOfKind_2165_}, var) + var.registers([u'kind', u'name', u'binding', u'ids', u'_iterator19', u'_ref19', u'scope', u'_i19', u'_isArray19']) + var.put(u'ids', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + #for JS loop + var.put(u'_iterator19', var.get(u'arguments')) + var.put(u'_isArray19', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator19'))) + var.put(u'_i19', Js(0.0)) + var.put(u'_iterator19', (var.get(u'_iterator19') if var.get(u'_isArray19') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator19')))) + while 1: + pass + if var.get(u'_isArray19'): + if (var.get(u'_i19')>=var.get(u'_iterator19').get(u'length')): + break + var.put(u'_ref19', var.get(u'_iterator19').get((var.put(u'_i19',Js(var.get(u'_i19').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i19', var.get(u'_iterator19').callprop(u'next')) + if var.get(u'_i19').get(u'done'): + break + var.put(u'_ref19', var.get(u'_i19').get(u'value')) + var.put(u'kind', var.get(u'_ref19')) + var.put(u'scope', var.get(u"this")) + while 1: + for PyJsTemp in var.get(u'scope').get(u'bindings'): + var.put(u'name', PyJsTemp) + var.put(u'binding', var.get(u'scope').get(u'bindings').get(var.get(u'name'))) + if PyJsStrictEq(var.get(u'binding').get(u'kind'),var.get(u'kind')): + var.get(u'ids').put(var.get(u'name'), var.get(u'binding')) + var.put(u'scope', var.get(u'scope').get(u'parent')) + if not var.get(u'scope'): + break + + return var.get(u'ids') + PyJs_getAllBindingsOfKind_2165_._set_name(u'getAllBindingsOfKind') + var.get(u'Scope').get(u'prototype').put(u'getAllBindingsOfKind', PyJs_getAllBindingsOfKind_2165_) + @Js + def PyJs_bindingIdentifierEquals_2166_(name, node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'bindingIdentifierEquals':PyJs_bindingIdentifierEquals_2166_, u'name':name, u'arguments':arguments}, var) + var.registers([u'node', u'name']) + return PyJsStrictEq(var.get(u"this").callprop(u'getBindingIdentifier', var.get(u'name')),var.get(u'node')) + PyJs_bindingIdentifierEquals_2166_._set_name(u'bindingIdentifierEquals') + var.get(u'Scope').get(u'prototype').put(u'bindingIdentifierEquals', PyJs_bindingIdentifierEquals_2166_) + @Js + def PyJs_warnOnFlowBinding_2167_(binding, this, arguments, var=var): + var = Scope({u'this':this, u'binding':binding, u'arguments':arguments, u'warnOnFlowBinding':PyJs_warnOnFlowBinding_2167_}, var) + var.registers([u'binding']) + if ((PyJsStrictEq(var.get(u'_crawlCallsCount'),Js(0.0)) and var.get(u'binding')) and var.get(u'binding').get(u'path').callprop(u'isFlow')): + var.get(u'console').callprop(u'warn', Js(u'\n You or one of the Babel plugins you are using are using Flow declarations as bindings.\n Support for this will be removed in version 6.8. To find out the caller, grep for this\n message and change it to a `console.trace()`.\n ')) + return var.get(u'binding') + PyJs_warnOnFlowBinding_2167_._set_name(u'warnOnFlowBinding') + var.get(u'Scope').get(u'prototype').put(u'warnOnFlowBinding', PyJs_warnOnFlowBinding_2167_) + @Js + def PyJs_getBinding_2168_(name, this, arguments, var=var): + var = Scope({u'this':this, u'getBinding':PyJs_getBinding_2168_, u'name':name, u'arguments':arguments}, var) + var.registers([u'scope', u'binding', u'name']) + var.put(u'scope', var.get(u"this")) + while 1: + var.put(u'binding', var.get(u'scope').callprop(u'getOwnBinding', var.get(u'name'))) + if var.get(u'binding'): + return var.get(u"this").callprop(u'warnOnFlowBinding', var.get(u'binding')) + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJs_getBinding_2168_._set_name(u'getBinding') + var.get(u'Scope').get(u'prototype').put(u'getBinding', PyJs_getBinding_2168_) + @Js + def PyJs_getOwnBinding_2169_(name, this, arguments, var=var): + var = Scope({u'this':this, u'getOwnBinding':PyJs_getOwnBinding_2169_, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return var.get(u"this").callprop(u'warnOnFlowBinding', var.get(u"this").get(u'bindings').get(var.get(u'name'))) + PyJs_getOwnBinding_2169_._set_name(u'getOwnBinding') + var.get(u'Scope').get(u'prototype').put(u'getOwnBinding', PyJs_getOwnBinding_2169_) + @Js + def PyJs_getBindingIdentifier_2170_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'getBindingIdentifier':PyJs_getBindingIdentifier_2170_, u'arguments':arguments}, var) + var.registers([u'info', u'name']) + var.put(u'info', var.get(u"this").callprop(u'getBinding', var.get(u'name'))) + return (var.get(u'info') and var.get(u'info').get(u'identifier')) + PyJs_getBindingIdentifier_2170_._set_name(u'getBindingIdentifier') + var.get(u'Scope').get(u'prototype').put(u'getBindingIdentifier', PyJs_getBindingIdentifier_2170_) + @Js + def PyJs_getOwnBindingIdentifier_2171_(name, this, arguments, var=var): + var = Scope({u'this':this, u'getOwnBindingIdentifier':PyJs_getOwnBindingIdentifier_2171_, u'name':name, u'arguments':arguments}, var) + var.registers([u'binding', u'name']) + var.put(u'binding', var.get(u"this").get(u'bindings').get(var.get(u'name'))) + return (var.get(u'binding') and var.get(u'binding').get(u'identifier')) + PyJs_getOwnBindingIdentifier_2171_._set_name(u'getOwnBindingIdentifier') + var.get(u'Scope').get(u'prototype').put(u'getOwnBindingIdentifier', PyJs_getOwnBindingIdentifier_2171_) + @Js + def PyJs_hasOwnBinding_2172_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'hasOwnBinding':PyJs_hasOwnBinding_2172_, u'arguments':arguments}, var) + var.registers([u'name']) + return var.get(u"this").callprop(u'getOwnBinding', var.get(u'name')).neg().neg() + PyJs_hasOwnBinding_2172_._set_name(u'hasOwnBinding') + var.get(u'Scope').get(u'prototype').put(u'hasOwnBinding', PyJs_hasOwnBinding_2172_) + @Js + def PyJs_hasBinding_2173_(name, noGlobals, this, arguments, var=var): + var = Scope({u'this':this, u'hasBinding':PyJs_hasBinding_2173_, u'name':name, u'noGlobals':noGlobals, u'arguments':arguments}, var) + var.registers([u'name', u'noGlobals']) + if var.get(u'name').neg(): + return Js(False) + if var.get(u"this").callprop(u'hasOwnBinding', var.get(u'name')): + return var.get(u'true') + if var.get(u"this").callprop(u'parentHasBinding', var.get(u'name'), var.get(u'noGlobals')): + return var.get(u'true') + if var.get(u"this").callprop(u'hasUid', var.get(u'name')): + return var.get(u'true') + if (var.get(u'noGlobals').neg() and PyJsComma(Js(0.0),var.get(u'_includes2').get(u'default'))(var.get(u'Scope').get(u'globals'), var.get(u'name'))): + return var.get(u'true') + if (var.get(u'noGlobals').neg() and PyJsComma(Js(0.0),var.get(u'_includes2').get(u'default'))(var.get(u'Scope').get(u'contextVariables'), var.get(u'name'))): + return var.get(u'true') + return Js(False) + PyJs_hasBinding_2173_._set_name(u'hasBinding') + var.get(u'Scope').get(u'prototype').put(u'hasBinding', PyJs_hasBinding_2173_) + @Js + def PyJs_parentHasBinding_2174_(name, noGlobals, this, arguments, var=var): + var = Scope({u'this':this, u'parentHasBinding':PyJs_parentHasBinding_2174_, u'name':name, u'noGlobals':noGlobals, u'arguments':arguments}, var) + var.registers([u'name', u'noGlobals']) + return (var.get(u"this").get(u'parent') and var.get(u"this").get(u'parent').callprop(u'hasBinding', var.get(u'name'), var.get(u'noGlobals'))) + PyJs_parentHasBinding_2174_._set_name(u'parentHasBinding') + var.get(u'Scope').get(u'prototype').put(u'parentHasBinding', PyJs_parentHasBinding_2174_) + @Js + def PyJs_moveBindingTo_2175_(name, scope, this, arguments, var=var): + var = Scope({u'this':this, u'scope':scope, u'moveBindingTo':PyJs_moveBindingTo_2175_, u'name':name, u'arguments':arguments}, var) + var.registers([u'info', u'scope', u'name']) + var.put(u'info', var.get(u"this").callprop(u'getBinding', var.get(u'name'))) + if var.get(u'info'): + var.get(u'info').get(u'scope').callprop(u'removeOwnBinding', var.get(u'name')) + var.get(u'info').put(u'scope', var.get(u'scope')) + var.get(u'scope').get(u'bindings').put(var.get(u'name'), var.get(u'info')) + PyJs_moveBindingTo_2175_._set_name(u'moveBindingTo') + var.get(u'Scope').get(u'prototype').put(u'moveBindingTo', PyJs_moveBindingTo_2175_) + @Js + def PyJs_removeOwnBinding_2176_(name, this, arguments, var=var): + var = Scope({u'this':this, u'removeOwnBinding':PyJs_removeOwnBinding_2176_, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + var.get(u"this").get(u'bindings').delete(var.get(u'name')) + PyJs_removeOwnBinding_2176_._set_name(u'removeOwnBinding') + var.get(u'Scope').get(u'prototype').put(u'removeOwnBinding', PyJs_removeOwnBinding_2176_) + @Js + def PyJs_removeBinding_2177_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'removeBinding':PyJs_removeBinding_2177_, u'arguments':arguments}, var) + var.registers([u'info', u'scope', u'name']) + var.put(u'info', var.get(u"this").callprop(u'getBinding', var.get(u'name'))) + if var.get(u'info'): + var.get(u'info').get(u'scope').callprop(u'removeOwnBinding', var.get(u'name')) + var.put(u'scope', var.get(u"this")) + while 1: + if var.get(u'scope').get(u'uids').get(var.get(u'name')): + var.get(u'scope').get(u'uids').put(var.get(u'name'), Js(False)) + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJs_removeBinding_2177_._set_name(u'removeBinding') + var.get(u'Scope').get(u'prototype').put(u'removeBinding', PyJs_removeBinding_2177_) + return var.get(u'Scope') + PyJs_anonymous_2120_._set_name(u'anonymous') + var.put(u'Scope', PyJs_anonymous_2120_()) + var.get(u'Scope').put(u'globals', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'_globals2').get(u'default').get(u'builtin'))) + var.get(u'Scope').put(u'contextVariables', Js([Js(u'arguments'), Js(u'undefined'), Js(u'Infinity'), Js(u'NaN')])) + var.get(u'exports').put(u'default', var.get(u'Scope')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_2103_._set_name(u'anonymous') +PyJs_Object_2178_ = Js({u'../cache':Js(222.0),u'../index':Js(225.0),u'./binding':Js(243.0),u'./lib/renamer':Js(245.0),u'babel-messages':Js(57.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/map':Js(98.0),u'babel-runtime/core-js/object/create':Js(101.0),u'babel-runtime/core-js/object/keys':Js(103.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-types':Js(258.0),u'globals':Js(278.0),u'lodash/defaults':Js(442.0),u'lodash/includes':Js(456.0),u'lodash/repeat':Js(483.0)}) +@Js +def PyJs_anonymous_2179_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_binding2', u'exports', u'_interopRequireWildcard', u'Renamer', u'require', u'_babelTypes', u'renameVisitor', u'module', u't', u'_binding', u'_interopRequireDefault', u'_classCallCheck3', u'_classCallCheck2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2181_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2181_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2180_ = Js({}) + var.put(u'newObj', PyJs_Object_2180_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_binding', var.get(u'require')(Js(u'../binding'))) + var.put(u'_binding2', var.get(u'_interopRequireDefault')(var.get(u'_binding'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + @Js + def PyJs_ReferencedIdentifier_2183_(_ref, state, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_2183_, u'state':state, u'arguments':arguments}, var) + var.registers([u'node', u'_ref', u'state']) + var.put(u'node', var.get(u'_ref').get(u'node')) + if PyJsStrictEq(var.get(u'node').get(u'name'),var.get(u'state').get(u'oldName')): + var.get(u'node').put(u'name', var.get(u'state').get(u'newName')) + PyJs_ReferencedIdentifier_2183_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_Scope_2184_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'Scope':PyJs_Scope_2184_}, var) + var.registers([u'path', u'state']) + if var.get(u'path').get(u'scope').callprop(u'bindingIdentifierEquals', var.get(u'state').get(u'oldName'), var.get(u'state').get(u'binding').get(u'identifier')).neg(): + var.get(u'path').callprop(u'skip') + PyJs_Scope_2184_._set_name(u'Scope') + @Js + def PyJs_AssignmentExpressionDeclaration_2185_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'AssignmentExpressionDeclaration':PyJs_AssignmentExpressionDeclaration_2185_, u'arguments':arguments}, var) + var.registers([u'path', u'state', u'ids', u'name']) + var.put(u'ids', var.get(u'path').callprop(u'getOuterBindingIdentifiers')) + for PyJsTemp in var.get(u'ids'): + var.put(u'name', PyJsTemp) + if PyJsStrictEq(var.get(u'name'),var.get(u'state').get(u'oldName')): + var.get(u'ids').get(var.get(u'name')).put(u'name', var.get(u'state').get(u'newName')) + PyJs_AssignmentExpressionDeclaration_2185_._set_name(u'AssignmentExpressionDeclaration') + PyJs_Object_2182_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_2183_,u'Scope':PyJs_Scope_2184_,u'AssignmentExpression|Declaration':PyJs_AssignmentExpressionDeclaration_2185_}) + var.put(u'renameVisitor', PyJs_Object_2182_) + @Js + def PyJs_anonymous_2186_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Renamer']) + @Js + def PyJsHoisted_Renamer_(binding, oldName, newName, this, arguments, var=var): + var = Scope({u'newName':newName, u'this':this, u'binding':binding, u'oldName':oldName, u'arguments':arguments}, var) + var.registers([u'newName', u'binding', u'oldName']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Renamer')) + var.get(u"this").put(u'newName', var.get(u'newName')) + var.get(u"this").put(u'oldName', var.get(u'oldName')) + var.get(u"this").put(u'binding', var.get(u'binding')) + PyJsHoisted_Renamer_.func_name = u'Renamer' + var.put(u'Renamer', PyJsHoisted_Renamer_) + pass + @Js + def PyJs_maybeConvertFromExportDeclaration_2187_(parentDeclar, this, arguments, var=var): + var = Scope({u'this':this, u'parentDeclar':parentDeclar, u'maybeConvertFromExportDeclaration':PyJs_maybeConvertFromExportDeclaration_2187_, u'arguments':arguments}, var) + var.registers([u'specifiers', u'exportDeclar', u'name', u'bindingIdentifiers', u'exportedName', u'parentDeclar', u'localName', u'aliasDeclar', u'isDefault']) + var.put(u'exportDeclar', (var.get(u'parentDeclar').get(u'parentPath').callprop(u'isExportDeclaration') and var.get(u'parentDeclar').get(u'parentPath'))) + if var.get(u'exportDeclar').neg(): + return var.get('undefined') + var.put(u'isDefault', var.get(u'exportDeclar').callprop(u'isExportDefaultDeclaration')) + if ((var.get(u'isDefault') and (var.get(u'parentDeclar').callprop(u'isFunctionDeclaration') or var.get(u'parentDeclar').callprop(u'isClassDeclaration'))) and var.get(u'parentDeclar').get(u'node').get(u'id').neg()): + var.get(u'parentDeclar').get(u'node').put(u'id', var.get(u'parentDeclar').get(u'scope').callprop(u'generateUidIdentifier', Js(u'default'))) + var.put(u'bindingIdentifiers', var.get(u'parentDeclar').callprop(u'getOuterBindingIdentifiers')) + var.put(u'specifiers', Js([])) + for PyJsTemp in var.get(u'bindingIdentifiers'): + var.put(u'name', PyJsTemp) + var.put(u'localName', (var.get(u"this").get(u'newName') if PyJsStrictEq(var.get(u'name'),var.get(u"this").get(u'oldName')) else var.get(u'name'))) + var.put(u'exportedName', (Js(u'default') if var.get(u'isDefault') else var.get(u'name'))) + var.get(u'specifiers').callprop(u'push', var.get(u't').callprop(u'exportSpecifier', var.get(u't').callprop(u'identifier', var.get(u'localName')), var.get(u't').callprop(u'identifier', var.get(u'exportedName')))) + if var.get(u'specifiers').get(u'length'): + var.put(u'aliasDeclar', var.get(u't').callprop(u'exportNamedDeclaration', var.get(u"null"), var.get(u'specifiers'))) + if var.get(u'parentDeclar').callprop(u'isFunctionDeclaration'): + var.get(u'aliasDeclar').put(u'_blockHoist', Js(3.0)) + var.get(u'exportDeclar').callprop(u'insertAfter', var.get(u'aliasDeclar')) + var.get(u'exportDeclar').callprop(u'replaceWith', var.get(u'parentDeclar').get(u'node')) + PyJs_maybeConvertFromExportDeclaration_2187_._set_name(u'maybeConvertFromExportDeclaration') + var.get(u'Renamer').get(u'prototype').put(u'maybeConvertFromExportDeclaration', PyJs_maybeConvertFromExportDeclaration_2187_) + @Js + def PyJs_maybeConvertFromClassFunctionDeclaration_2188_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'maybeConvertFromClassFunctionDeclaration':PyJs_maybeConvertFromClassFunctionDeclaration_2188_}, var) + var.registers([u'path']) + return var.get('undefined') + if (var.get(u'path').callprop(u'isFunctionDeclaration').neg() and var.get(u'path').callprop(u'isClassDeclaration').neg()): + return var.get('undefined') + if PyJsStrictNeq(var.get(u"this").get(u'binding').get(u'kind'),Js(u'hoisted')): + return var.get('undefined') + var.get(u'path').get(u'node').put(u'id', var.get(u't').callprop(u'identifier', var.get(u"this").get(u'oldName'))) + var.get(u'path').get(u'node').put(u'_blockHoist', Js(3.0)) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'variableDeclaration', Js(u'let'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u't').callprop(u'identifier', var.get(u"this").get(u'newName')), var.get(u't').callprop(u'toExpression', var.get(u'path').get(u'node')))]))) + PyJs_maybeConvertFromClassFunctionDeclaration_2188_._set_name(u'maybeConvertFromClassFunctionDeclaration') + var.get(u'Renamer').get(u'prototype').put(u'maybeConvertFromClassFunctionDeclaration', PyJs_maybeConvertFromClassFunctionDeclaration_2188_) + @Js + def PyJs_maybeConvertFromClassFunctionExpression_2189_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'maybeConvertFromClassFunctionExpression':PyJs_maybeConvertFromClassFunctionExpression_2189_}, var) + var.registers([u'path']) + return var.get('undefined') + if (var.get(u'path').callprop(u'isFunctionExpression').neg() and var.get(u'path').callprop(u'isClassExpression').neg()): + return var.get('undefined') + if PyJsStrictNeq(var.get(u"this").get(u'binding').get(u'kind'),Js(u'local')): + return var.get('undefined') + var.get(u'path').get(u'node').put(u'id', var.get(u't').callprop(u'identifier', var.get(u"this").get(u'oldName'))) + PyJs_Object_2190_ = Js({u'id':var.get(u't').callprop(u'identifier', var.get(u"this").get(u'newName'))}) + var.get(u"this").get(u'binding').get(u'scope').get(u'parent').callprop(u'push', PyJs_Object_2190_) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u't').callprop(u'identifier', var.get(u"this").get(u'newName')), var.get(u'path').get(u'node'))) + PyJs_maybeConvertFromClassFunctionExpression_2189_._set_name(u'maybeConvertFromClassFunctionExpression') + var.get(u'Renamer').get(u'prototype').put(u'maybeConvertFromClassFunctionExpression', PyJs_maybeConvertFromClassFunctionExpression_2189_) + @Js + def PyJs_rename_2191_(block, this, arguments, var=var): + var = Scope({u'this':this, u'rename':PyJs_rename_2191_, u'arguments':arguments, u'block':block}, var) + var.registers([u'newName', u'binding', u'oldName', u'parentDeclar', u'scope', u'path', u'block']) + var.put(u'binding', var.get(u"this").get(u'binding')) + var.put(u'oldName', var.get(u"this").get(u'oldName')) + var.put(u'newName', var.get(u"this").get(u'newName')) + var.put(u'scope', var.get(u'binding').get(u'scope')) + var.put(u'path', var.get(u'binding').get(u'path')) + @Js + def PyJs_anonymous_2192_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u'path').callprop(u'isDeclaration') or var.get(u'path').callprop(u'isFunctionExpression')) + PyJs_anonymous_2192_._set_name(u'anonymous') + var.put(u'parentDeclar', var.get(u'path').callprop(u'find', PyJs_anonymous_2192_)) + if var.get(u'parentDeclar'): + var.get(u"this").callprop(u'maybeConvertFromExportDeclaration', var.get(u'parentDeclar')) + var.get(u'scope').callprop(u'traverse', (var.get(u'block') or var.get(u'scope').get(u'block')), var.get(u'renameVisitor'), var.get(u"this")) + if var.get(u'block').neg(): + var.get(u'scope').callprop(u'removeOwnBinding', var.get(u'oldName')) + var.get(u'scope').get(u'bindings').put(var.get(u'newName'), var.get(u'binding')) + var.get(u"this").get(u'binding').get(u'identifier').put(u'name', var.get(u'newName')) + if PyJsStrictEq(var.get(u'binding').get(u'type'),Js(u'hoisted')): + pass + if var.get(u'parentDeclar'): + var.get(u"this").callprop(u'maybeConvertFromClassFunctionDeclaration', var.get(u'parentDeclar')) + var.get(u"this").callprop(u'maybeConvertFromClassFunctionExpression', var.get(u'parentDeclar')) + PyJs_rename_2191_._set_name(u'rename') + var.get(u'Renamer').get(u'prototype').put(u'rename', PyJs_rename_2191_) + return var.get(u'Renamer') + PyJs_anonymous_2186_._set_name(u'anonymous') + var.put(u'Renamer', PyJs_anonymous_2186_()) + var.get(u'exports').put(u'default', var.get(u'Renamer')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_2179_._set_name(u'anonymous') +PyJs_Object_2193_ = Js({u'../binding':Js(243.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_2194_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'_clone', u'_virtualTypes', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'virtualTypes', u'_typeof2', u'_typeof3', u'shouldIgnoreKey', u'validateVisitorMethods', u'verify', u'_keys', u'wrapWithStateOrWrapper', u'_babelMessages', u'exports', u'_interopRequireWildcard', u'mergePair', u'_babelTypes', u'_keys2', u'ensureCallbackArrays', u'ensureEntranceObjects', u'require', u'messages', u'wrapCheck', u'_clone2', u'explode', u'merge', u't']) + @Js + def PyJsHoisted_mergePair_(dest, src, this, arguments, var=var): + var = Scope({u'dest':dest, u'src':src, u'this':this, u'arguments':arguments}, var) + var.registers([u'dest', u'src', u'key']) + for PyJsTemp in var.get(u'src'): + var.put(u'key', PyJsTemp) + var.get(u'dest').put(var.get(u'key'), Js([]).callprop(u'concat', (var.get(u'dest').get(var.get(u'key')) or Js([])), var.get(u'src').get(var.get(u'key')))) + PyJsHoisted_mergePair_.func_name = u'mergePair' + var.put(u'mergePair', PyJsHoisted_mergePair_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2195_ = Js({}) + var.put(u'newObj', PyJs_Object_2195_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_shouldIgnoreKey_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + if PyJsStrictEq(var.get(u'key').get(u'0'),Js(u'_')): + return var.get(u'true') + if ((PyJsStrictEq(var.get(u'key'),Js(u'enter')) or PyJsStrictEq(var.get(u'key'),Js(u'exit'))) or PyJsStrictEq(var.get(u'key'),Js(u'shouldSkip'))): + return var.get(u'true') + if ((PyJsStrictEq(var.get(u'key'),Js(u'blacklist')) or PyJsStrictEq(var.get(u'key'),Js(u'noScope'))) or PyJsStrictEq(var.get(u'key'),Js(u'skipKeys'))): + return var.get(u'true') + return Js(False) + PyJsHoisted_shouldIgnoreKey_.func_name = u'shouldIgnoreKey' + var.put(u'shouldIgnoreKey', PyJsHoisted_shouldIgnoreKey_) + @Js + def PyJsHoisted_validateVisitorMethods_(path, val, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'val':val}, var) + var.registers([u'_isArray5', u'fns', u'val', u'_ref5', u'_iterator5', u'path', u'_i5', u'fn']) + var.put(u'fns', Js([]).callprop(u'concat', var.get(u'val'))) + #for JS loop + var.put(u'_iterator5', var.get(u'fns')) + var.put(u'_isArray5', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator5'))) + var.put(u'_i5', Js(0.0)) + var.put(u'_iterator5', (var.get(u'_iterator5') if var.get(u'_isArray5') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator5')))) + while 1: + pass + if var.get(u'_isArray5'): + if (var.get(u'_i5')>=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i5').get(u'value')) + var.put(u'fn', var.get(u'_ref5')) + if PyJsStrictNeq(var.get(u'fn',throw=False).typeof(),Js(u'function')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((((Js(u'Non-function found defined in ')+var.get(u'path'))+Js(u' with type '))+(Js(u'undefined') if PyJsStrictEq(var.get(u'fn',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'fn')))))) + raise PyJsTempException + + PyJsHoisted_validateVisitorMethods_.func_name = u'validateVisitorMethods' + var.put(u'validateVisitorMethods', PyJsHoisted_validateVisitorMethods_) + @Js + def PyJsHoisted_verify_(visitor, this, arguments, var=var): + var = Scope({u'this':this, u'visitor':visitor, u'arguments':arguments}, var) + var.registers([u'visitors', u'nodeType', u'visitor', u'visitorKey']) + if var.get(u'visitor').get(u'_verified'): + return var.get('undefined') + if PyJsStrictEq(var.get(u'visitor',throw=False).typeof(),Js(u'function')): + PyJsTempException = JsToPyException(var.get(u'Error').create(var.get(u'messages').callprop(u'get', Js(u'traverseVerifyRootFunction')))) + raise PyJsTempException + for PyJsTemp in var.get(u'visitor'): + var.put(u'nodeType', PyJsTemp) + if (PyJsStrictEq(var.get(u'nodeType'),Js(u'enter')) or PyJsStrictEq(var.get(u'nodeType'),Js(u'exit'))): + var.get(u'validateVisitorMethods')(var.get(u'nodeType'), var.get(u'visitor').get(var.get(u'nodeType'))) + if var.get(u'shouldIgnoreKey')(var.get(u'nodeType')): + continue + if (var.get(u't').get(u'TYPES').callprop(u'indexOf', var.get(u'nodeType'))<Js(0.0)): + PyJsTempException = JsToPyException(var.get(u'Error').create(var.get(u'messages').callprop(u'get', Js(u'traverseVerifyNodeType'), var.get(u'nodeType')))) + raise PyJsTempException + var.put(u'visitors', var.get(u'visitor').get(var.get(u'nodeType'))) + if PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'visitors',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'visitors'))),Js(u'object')): + for PyJsTemp in var.get(u'visitors'): + var.put(u'visitorKey', PyJsTemp) + if (PyJsStrictEq(var.get(u'visitorKey'),Js(u'enter')) or PyJsStrictEq(var.get(u'visitorKey'),Js(u'exit'))): + var.get(u'validateVisitorMethods')(((var.get(u'nodeType')+Js(u'.'))+var.get(u'visitorKey')), var.get(u'visitors').get(var.get(u'visitorKey'))) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(var.get(u'messages').callprop(u'get', Js(u'traverseVerifyVisitorProperty'), var.get(u'nodeType'), var.get(u'visitorKey')))) + raise PyJsTempException + var.get(u'visitor').put(u'_verified', var.get(u'true')) + PyJsHoisted_verify_.func_name = u'verify' + var.put(u'verify', PyJsHoisted_verify_) + @Js + def PyJsHoisted_wrapCheck_(wrapper, fn, this, arguments, var=var): + var = Scope({u'this':this, u'fn':fn, u'wrapper':wrapper, u'arguments':arguments}, var) + var.registers([u'newFn', u'fn', u'wrapper']) + @Js + def PyJs_newFn_2204_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'newFn':PyJs_newFn_2204_, u'arguments':arguments}, var) + var.registers([u'path']) + if var.get(u'wrapper').callprop(u'checkPath', var.get(u'path')): + return var.get(u'fn').callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + PyJs_newFn_2204_._set_name(u'newFn') + var.put(u'newFn', PyJs_newFn_2204_) + @Js + def PyJs_anonymous_2205_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'fn').callprop(u'toString') + PyJs_anonymous_2205_._set_name(u'anonymous') + var.get(u'newFn').put(u'toString', PyJs_anonymous_2205_) + return var.get(u'newFn') + PyJsHoisted_wrapCheck_.func_name = u'wrapCheck' + var.put(u'wrapCheck', PyJsHoisted_wrapCheck_) + @Js + def PyJsHoisted_explode_(visitor, this, arguments, var=var): + var = Scope({u'this':this, u'visitor':visitor, u'arguments':arguments}, var) + var.registers([u'_isArray4', u'_isArray3', u'_isArray2', u'visitor', u'existing', u'_nodeType3', u'_nodeType2', u'_ref', u'aliases', u'_iterator', u'_i4', u'_i3', u'_i2', u'wrapper', u'parts', u'_i', u'type', u'_type', u'nodeType', u'_nodeType', u'part', u'deprecratedKey', u'_isArray', u'fns', u'_fns', u'_ref4', u'_ref3', u'_ref2', u'alias', u'_iterator4', u'_fns2', u'_iterator3', u'_iterator2']) + if var.get(u'visitor').get(u'_exploded'): + return var.get(u'visitor') + var.get(u'visitor').put(u'_exploded', var.get(u'true')) + for PyJsTemp in var.get(u'visitor'): + var.put(u'nodeType', PyJsTemp) + if var.get(u'shouldIgnoreKey')(var.get(u'nodeType')): + continue + var.put(u'parts', var.get(u'nodeType').callprop(u'split', Js(u'|'))) + if PyJsStrictEq(var.get(u'parts').get(u'length'),Js(1.0)): + continue + var.put(u'fns', var.get(u'visitor').get(var.get(u'nodeType'))) + var.get(u'visitor').delete(var.get(u'nodeType')) + #for JS loop + var.put(u'_iterator', var.get(u'parts')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'part', var.get(u'_ref')) + var.get(u'visitor').put(var.get(u'part'), var.get(u'fns')) + + var.get(u'verify')(var.get(u'visitor')) + var.get(u'visitor').delete(u'__esModule') + var.get(u'ensureEntranceObjects')(var.get(u'visitor')) + var.get(u'ensureCallbackArrays')(var.get(u'visitor')) + #for JS loop + var.put(u'_iterator2', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'visitor'))) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'_nodeType3', var.get(u'_ref2')) + if var.get(u'shouldIgnoreKey')(var.get(u'_nodeType3')): + continue + var.put(u'wrapper', var.get(u'virtualTypes').get(var.get(u'_nodeType3'))) + if var.get(u'wrapper').neg(): + continue + var.put(u'_fns2', var.get(u'visitor').get(var.get(u'_nodeType3'))) + for PyJsTemp in var.get(u'_fns2'): + var.put(u'type', PyJsTemp) + var.get(u'_fns2').put(var.get(u'type'), var.get(u'wrapCheck')(var.get(u'wrapper'), var.get(u'_fns2').get(var.get(u'type')))) + var.get(u'visitor').delete(var.get(u'_nodeType3')) + if var.get(u'wrapper').get(u'types'): + #for JS loop + var.put(u'_iterator4', var.get(u'wrapper').get(u'types')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i4').get(u'value')) + var.put(u'_type', var.get(u'_ref4')) + if var.get(u'visitor').get(var.get(u'_type')): + var.get(u'mergePair')(var.get(u'visitor').get(var.get(u'_type')), var.get(u'_fns2')) + else: + var.get(u'visitor').put(var.get(u'_type'), var.get(u'_fns2')) + + else: + var.get(u'mergePair')(var.get(u'visitor'), var.get(u'_fns2')) + + for PyJsTemp in var.get(u'visitor'): + var.put(u'_nodeType', PyJsTemp) + if var.get(u'shouldIgnoreKey')(var.get(u'_nodeType')): + continue + var.put(u'_fns', var.get(u'visitor').get(var.get(u'_nodeType'))) + var.put(u'aliases', var.get(u't').get(u'FLIPPED_ALIAS_KEYS').get(var.get(u'_nodeType'))) + var.put(u'deprecratedKey', var.get(u't').get(u'DEPRECATED_KEYS').get(var.get(u'_nodeType'))) + if var.get(u'deprecratedKey'): + var.get(u'console').callprop(u'trace', (((Js(u'Visitor defined for ')+var.get(u'_nodeType'))+Js(u' but it has been renamed to '))+var.get(u'deprecratedKey'))) + var.put(u'aliases', Js([var.get(u'deprecratedKey')])) + if var.get(u'aliases').neg(): + continue + var.get(u'visitor').delete(var.get(u'_nodeType')) + #for JS loop + var.put(u'_iterator3', var.get(u'aliases')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'alias', var.get(u'_ref3')) + var.put(u'existing', var.get(u'visitor').get(var.get(u'alias'))) + if var.get(u'existing'): + var.get(u'mergePair')(var.get(u'existing'), var.get(u'_fns')) + else: + var.get(u'visitor').put(var.get(u'alias'), PyJsComma(Js(0.0),var.get(u'_clone2').get(u'default'))(var.get(u'_fns'))) + + for PyJsTemp in var.get(u'visitor'): + var.put(u'_nodeType2', PyJsTemp) + if var.get(u'shouldIgnoreKey')(var.get(u'_nodeType2')): + continue + var.get(u'ensureCallbackArrays')(var.get(u'visitor').get(var.get(u'_nodeType2'))) + return var.get(u'visitor') + PyJsHoisted_explode_.func_name = u'explode' + var.put(u'explode', PyJsHoisted_explode_) + @Js + def PyJsHoisted_merge_(visitors, this, arguments, var=var): + var = Scope({u'this':this, u'visitors':visitors, u'arguments':arguments}, var) + var.registers([u'visitorType', u'i', u'visitor', u'rootVisitor', u'wrapper', u'states', u'visitors', u'state', u'nodeVisitor', u'type']) + var.put(u'states', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js([]))) + var.put(u'wrapper', var.get(u'arguments').get(u'2')) + PyJs_Object_2197_ = Js({}) + var.put(u'rootVisitor', PyJs_Object_2197_) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'visitors').get(u'length')): + try: + var.put(u'visitor', var.get(u'visitors').get(var.get(u'i'))) + var.put(u'state', var.get(u'states').get(var.get(u'i'))) + var.get(u'explode')(var.get(u'visitor')) + for PyJsTemp in var.get(u'visitor'): + var.put(u'type', PyJsTemp) + var.put(u'visitorType', var.get(u'visitor').get(var.get(u'type'))) + if (var.get(u'state') or var.get(u'wrapper')): + var.put(u'visitorType', var.get(u'wrapWithStateOrWrapper')(var.get(u'visitorType'), var.get(u'state'), var.get(u'wrapper'))) + PyJs_Object_2198_ = Js({}) + var.put(u'nodeVisitor', var.get(u'rootVisitor').put(var.get(u'type'), (var.get(u'rootVisitor').get(var.get(u'type')) or PyJs_Object_2198_))) + var.get(u'mergePair')(var.get(u'nodeVisitor'), var.get(u'visitorType')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'rootVisitor') + PyJsHoisted_merge_.func_name = u'merge' + var.put(u'merge', PyJsHoisted_merge_) + @Js + def PyJsHoisted_ensureCallbackArrays_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + if (var.get(u'obj').get(u'enter') and var.get(u'Array').callprop(u'isArray', var.get(u'obj').get(u'enter')).neg()): + var.get(u'obj').put(u'enter', Js([var.get(u'obj').get(u'enter')])) + if (var.get(u'obj').get(u'exit') and var.get(u'Array').callprop(u'isArray', var.get(u'obj').get(u'exit')).neg()): + var.get(u'obj').put(u'exit', Js([var.get(u'obj').get(u'exit')])) + PyJsHoisted_ensureCallbackArrays_.func_name = u'ensureCallbackArrays' + var.put(u'ensureCallbackArrays', PyJsHoisted_ensureCallbackArrays_) + @Js + def PyJsHoisted_wrapWithStateOrWrapper_(oldVisitor, state, wrapper, this, arguments, var=var): + var = Scope({u'this':this, u'oldVisitor':oldVisitor, u'state':state, u'arguments':arguments, u'wrapper':wrapper}, var) + var.registers([u'_loop', u'_ret', u'newVisitor', u'oldVisitor', u'state', u'wrapper', u'key']) + PyJs_Object_2199_ = Js({}) + var.put(u'newVisitor', PyJs_Object_2199_) + @Js + def PyJs__loop_2200_(key, this, arguments, var=var): + var = Scope({u'this':this, u'_loop':PyJs__loop_2200_, u'arguments':arguments, u'key':key}, var) + var.registers([u'fns', u'key']) + var.put(u'fns', var.get(u'oldVisitor').get(var.get(u'key'))) + if var.get(u'Array').callprop(u'isArray', var.get(u'fns')).neg(): + return Js(u'continue') + @Js + def PyJs_anonymous_2201_(fn, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'fn':fn}, var) + var.registers([u'newFn', u'fn']) + var.put(u'newFn', var.get(u'fn')) + if var.get(u'state'): + @Js + def PyJs_newFn_2202_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'newFn':PyJs_newFn_2202_, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u'fn').callprop(u'call', var.get(u'state'), var.get(u'path'), var.get(u'state')) + PyJs_newFn_2202_._set_name(u'newFn') + var.put(u'newFn', PyJs_newFn_2202_) + if var.get(u'wrapper'): + var.put(u'newFn', var.get(u'wrapper')(var.get(u'state').get(u'key'), var.get(u'key'), var.get(u'newFn'))) + return var.get(u'newFn') + PyJs_anonymous_2201_._set_name(u'anonymous') + var.put(u'fns', var.get(u'fns').callprop(u'map', PyJs_anonymous_2201_)) + var.get(u'newVisitor').put(var.get(u'key'), var.get(u'fns')) + PyJs__loop_2200_._set_name(u'_loop') + var.put(u'_loop', PyJs__loop_2200_) + for PyJsTemp in var.get(u'oldVisitor'): + var.put(u'key', PyJsTemp) + var.put(u'_ret', var.get(u'_loop')(var.get(u'key'))) + if PyJsStrictEq(var.get(u'_ret'),Js(u'continue')): + continue + return var.get(u'newVisitor') + PyJsHoisted_wrapWithStateOrWrapper_.func_name = u'wrapWithStateOrWrapper' + var.put(u'wrapWithStateOrWrapper', PyJsHoisted_wrapWithStateOrWrapper_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2196_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2196_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_ensureEntranceObjects_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'fns', u'key']) + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'shouldIgnoreKey')(var.get(u'key')): + continue + var.put(u'fns', var.get(u'obj').get(var.get(u'key'))) + if PyJsStrictEq(var.get(u'fns',throw=False).typeof(),Js(u'function')): + PyJs_Object_2203_ = Js({u'enter':var.get(u'fns')}) + var.get(u'obj').put(var.get(u'key'), PyJs_Object_2203_) + PyJsHoisted_ensureEntranceObjects_.func_name = u'ensureEntranceObjects' + var.put(u'ensureEntranceObjects', PyJsHoisted_ensureEntranceObjects_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + var.put(u'_keys', var.get(u'require')(Js(u'babel-runtime/core-js/object/keys'))) + var.put(u'_keys2', var.get(u'_interopRequireDefault')(var.get(u'_keys'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'explode', var.get(u'explode')) + var.get(u'exports').put(u'verify', var.get(u'verify')) + var.get(u'exports').put(u'merge', var.get(u'merge')) + var.put(u'_virtualTypes', var.get(u'require')(Js(u'./path/lib/virtual-types'))) + var.put(u'virtualTypes', var.get(u'_interopRequireWildcard')(var.get(u'_virtualTypes'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_clone', var.get(u'require')(Js(u'lodash/clone'))) + var.put(u'_clone2', var.get(u'_interopRequireDefault')(var.get(u'_clone'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_2194_._set_name(u'anonymous') +PyJs_Object_2206_ = Js({u'./path/lib/virtual-types':Js(239.0),u'babel-messages':Js(57.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/object/keys':Js(103.0),u'babel-runtime/helpers/typeof':Js(114.0),u'babel-types':Js(258.0),u'lodash/clone':Js(438.0)}) +@Js +def PyJs_anonymous_2207_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'BOOLEAN_UNARY_OPERATORS', u'_for', u'module', u'STATEMENT_OR_BLOCK_KEYS', u'BLOCK_SCOPED_SYMBOL', u'_interopRequireDefault', u'COMMENT_KEYS', u'INHERIT_KEYS', u'BOOLEAN_BINARY_OPERATORS', u'UNARY_OPERATORS', u'FOR_INIT_KEYS', u'exports', u'COMPARISON_BINARY_OPERATORS', u'NUMBER_UNARY_OPERATORS', u'_for2', u'FLATTENABLE_KEYS', u'LOGICAL_OPERATORS', u'STRING_UNARY_OPERATORS', u'NUMBER_BINARY_OPERATORS', u'UPDATE_OPERATORS', u'require', u'NOT_LOCAL_BINDING', u'BINARY_OPERATORS', u'EQUALITY_BINARY_OPERATORS', u'BOOLEAN_NUMBER_BINARY_OPERATORS']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2210_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2210_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + def PyJs_LONG_2209_(var=var): + def PyJs_LONG_2208_(var=var): + return var.get(u'exports').put(u'EQUALITY_BINARY_OPERATORS', var.get(u'exports').put(u'BOOLEAN_NUMBER_BINARY_OPERATORS', var.get(u'exports').put(u'UPDATE_OPERATORS', var.get(u'exports').put(u'LOGICAL_OPERATORS', var.get(u'exports').put(u'COMMENT_KEYS', var.get(u'exports').put(u'FOR_INIT_KEYS', var.get(u'exports').put(u'FLATTENABLE_KEYS', var.get(u'exports').put(u'STATEMENT_OR_BLOCK_KEYS', var.get(u'undefined'))))))))) + return var.get(u'exports').put(u'UNARY_OPERATORS', var.get(u'exports').put(u'STRING_UNARY_OPERATORS', var.get(u'exports').put(u'NUMBER_UNARY_OPERATORS', var.get(u'exports').put(u'BOOLEAN_UNARY_OPERATORS', var.get(u'exports').put(u'BINARY_OPERATORS', var.get(u'exports').put(u'NUMBER_BINARY_OPERATORS', var.get(u'exports').put(u'BOOLEAN_BINARY_OPERATORS', var.get(u'exports').put(u'COMPARISON_BINARY_OPERATORS', PyJs_LONG_2208_())))))))) + var.get(u'exports').put(u'NOT_LOCAL_BINDING', var.get(u'exports').put(u'BLOCK_SCOPED_SYMBOL', var.get(u'exports').put(u'INHERIT_KEYS', PyJs_LONG_2209_()))) + var.put(u'_for', var.get(u'require')(Js(u'babel-runtime/core-js/symbol/for'))) + var.put(u'_for2', var.get(u'_interopRequireDefault')(var.get(u'_for'))) + pass + var.put(u'STATEMENT_OR_BLOCK_KEYS', var.get(u'exports').put(u'STATEMENT_OR_BLOCK_KEYS', Js([Js(u'consequent'), Js(u'body'), Js(u'alternate')]))) + var.put(u'FLATTENABLE_KEYS', var.get(u'exports').put(u'FLATTENABLE_KEYS', Js([Js(u'body'), Js(u'expressions')]))) + var.put(u'FOR_INIT_KEYS', var.get(u'exports').put(u'FOR_INIT_KEYS', Js([Js(u'left'), Js(u'init')]))) + var.put(u'COMMENT_KEYS', var.get(u'exports').put(u'COMMENT_KEYS', Js([Js(u'leadingComments'), Js(u'trailingComments'), Js(u'innerComments')]))) + var.put(u'LOGICAL_OPERATORS', var.get(u'exports').put(u'LOGICAL_OPERATORS', Js([Js(u'||'), Js(u'&&')]))) + var.put(u'UPDATE_OPERATORS', var.get(u'exports').put(u'UPDATE_OPERATORS', Js([Js(u'++'), Js(u'--')]))) + var.put(u'BOOLEAN_NUMBER_BINARY_OPERATORS', var.get(u'exports').put(u'BOOLEAN_NUMBER_BINARY_OPERATORS', Js([Js(u'>'), Js(u'<'), Js(u'>='), Js(u'<=')]))) + var.put(u'EQUALITY_BINARY_OPERATORS', var.get(u'exports').put(u'EQUALITY_BINARY_OPERATORS', Js([Js(u'=='), Js(u'==='), Js(u'!='), Js(u'!==')]))) + var.put(u'COMPARISON_BINARY_OPERATORS', var.get(u'exports').put(u'COMPARISON_BINARY_OPERATORS', Js([]).callprop(u'concat', var.get(u'EQUALITY_BINARY_OPERATORS'), Js([Js(u'in'), Js(u'instanceof')])))) + var.put(u'BOOLEAN_BINARY_OPERATORS', var.get(u'exports').put(u'BOOLEAN_BINARY_OPERATORS', Js([]).callprop(u'concat', var.get(u'COMPARISON_BINARY_OPERATORS'), var.get(u'BOOLEAN_NUMBER_BINARY_OPERATORS')))) + var.put(u'NUMBER_BINARY_OPERATORS', var.get(u'exports').put(u'NUMBER_BINARY_OPERATORS', Js([Js(u'-'), Js(u'/'), Js(u'%'), Js(u'*'), Js(u'**'), Js(u'&'), Js(u'|'), Js(u'>>'), Js(u'>>>'), Js(u'<<'), Js(u'^')]))) + var.put(u'BINARY_OPERATORS', var.get(u'exports').put(u'BINARY_OPERATORS', Js([Js(u'+')]).callprop(u'concat', var.get(u'NUMBER_BINARY_OPERATORS'), var.get(u'BOOLEAN_BINARY_OPERATORS')))) + var.put(u'BOOLEAN_UNARY_OPERATORS', var.get(u'exports').put(u'BOOLEAN_UNARY_OPERATORS', Js([Js(u'delete'), Js(u'!')]))) + var.put(u'NUMBER_UNARY_OPERATORS', var.get(u'exports').put(u'NUMBER_UNARY_OPERATORS', Js([Js(u'+'), Js(u'-'), Js(u'++'), Js(u'--'), Js(u'~')]))) + var.put(u'STRING_UNARY_OPERATORS', var.get(u'exports').put(u'STRING_UNARY_OPERATORS', Js([Js(u'typeof')]))) + var.put(u'UNARY_OPERATORS', var.get(u'exports').put(u'UNARY_OPERATORS', Js([Js(u'void')]).callprop(u'concat', var.get(u'BOOLEAN_UNARY_OPERATORS'), var.get(u'NUMBER_UNARY_OPERATORS'), var.get(u'STRING_UNARY_OPERATORS')))) + PyJs_Object_2211_ = Js({u'optional':Js([Js(u'typeAnnotation'), Js(u'typeParameters'), Js(u'returnType')]),u'force':Js([Js(u'start'), Js(u'loc'), Js(u'end')])}) + var.put(u'INHERIT_KEYS', var.get(u'exports').put(u'INHERIT_KEYS', PyJs_Object_2211_)) + var.put(u'BLOCK_SCOPED_SYMBOL', var.get(u'exports').put(u'BLOCK_SCOPED_SYMBOL', PyJsComma(Js(0.0),var.get(u'_for2').get(u'default'))(Js(u'var used to be block scoped')))) + var.put(u'NOT_LOCAL_BINDING', var.get(u'exports').put(u'NOT_LOCAL_BINDING', PyJsComma(Js(0.0),var.get(u'_for2').get(u'default'))(Js(u'should not be considered a local binding')))) +PyJs_anonymous_2207_._set_name(u'anonymous') +PyJs_Object_2212_ = Js({u'babel-runtime/core-js/symbol/for':Js(106.0)}) +@Js +def PyJs_anonymous_2213_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'toComputedKey', u'toBindingIdentifierName', u'module', u'_isString2', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'toKeyAlias', u'_isNumber', u'toSequenceExpression', u'_isRegExp2', u'_isRegExp', u'toIdentifier', u't', u'_isNumber2', u'exports', u'_stringify2', u'_interopRequireWildcard', u'toExpression', u'_maxSafeInteger2', u'_isPlainObject2', u'_index', u'_isString', u'require', u'toBlock', u'toStatement', u'_stringify', u'_maxSafeInteger', u'_isPlainObject', u'valueToNode']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2214_ = Js({}) + var.put(u'newObj', PyJs_Object_2214_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_toSequenceExpression_(nodes, scope, this, arguments, var=var): + var = Scope({u'this':this, u'scope':scope, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'convert', u'bailed', u'i', u'declars', u'result', u'scope', u'nodes']) + @Js + def PyJsHoisted_convert_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'_isArray2', u'ensureLastUndefined', u'alternate', u'nodes', u'_i2', u'_ref2', u'key', u'exprs', u'declar', u'_i', u'_ref', u'consequent', u'bindings', u'_iterator2']) + var.put(u'ensureLastUndefined', Js(False)) + var.put(u'exprs', Js([])) + #for JS loop + var.put(u'_iterator', var.get(u'nodes')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'node', var.get(u'_ref')) + if var.get(u't').callprop(u'isExpression', var.get(u'node')): + var.get(u'exprs').callprop(u'push', var.get(u'node')) + else: + if var.get(u't').callprop(u'isExpressionStatement', var.get(u'node')): + var.get(u'exprs').callprop(u'push', var.get(u'node').get(u'expression')) + else: + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'node')): + if PyJsStrictNeq(var.get(u'node').get(u'kind'),Js(u'var')): + return var.put(u'bailed', var.get(u'true')) + #for JS loop + var.put(u'_iterator2', var.get(u'node').get(u'declarations')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'declar', var.get(u'_ref2')) + var.put(u'bindings', var.get(u't').callprop(u'getBindingIdentifiers', var.get(u'declar'))) + for PyJsTemp in var.get(u'bindings'): + var.put(u'key', PyJsTemp) + PyJs_Object_2216_ = Js({u'kind':var.get(u'node').get(u'kind'),u'id':var.get(u'bindings').get(var.get(u'key'))}) + var.get(u'declars').callprop(u'push', PyJs_Object_2216_) + if var.get(u'declar').get(u'init'): + var.get(u'exprs').callprop(u'push', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'declar').get(u'id'), var.get(u'declar').get(u'init'))) + + var.put(u'ensureLastUndefined', var.get(u'true')) + continue + else: + if var.get(u't').callprop(u'isIfStatement', var.get(u'node')): + var.put(u'consequent', (var.get(u'convert')(Js([var.get(u'node').get(u'consequent')])) if var.get(u'node').get(u'consequent') else var.get(u'scope').callprop(u'buildUndefinedNode'))) + var.put(u'alternate', (var.get(u'convert')(Js([var.get(u'node').get(u'alternate')])) if var.get(u'node').get(u'alternate') else var.get(u'scope').callprop(u'buildUndefinedNode'))) + if (var.get(u'consequent').neg() or var.get(u'alternate').neg()): + return var.put(u'bailed', var.get(u'true')) + var.get(u'exprs').callprop(u'push', var.get(u't').callprop(u'conditionalExpression', var.get(u'node').get(u'test'), var.get(u'consequent'), var.get(u'alternate'))) + else: + if var.get(u't').callprop(u'isBlockStatement', var.get(u'node')): + var.get(u'exprs').callprop(u'push', var.get(u'convert')(var.get(u'node').get(u'body'))) + else: + if var.get(u't').callprop(u'isEmptyStatement', var.get(u'node')): + var.put(u'ensureLastUndefined', var.get(u'true')) + continue + else: + return var.put(u'bailed', var.get(u'true')) + var.put(u'ensureLastUndefined', Js(False)) + + if (var.get(u'ensureLastUndefined') or PyJsStrictEq(var.get(u'exprs').get(u'length'),Js(0.0))): + var.get(u'exprs').callprop(u'push', var.get(u'scope').callprop(u'buildUndefinedNode')) + if PyJsStrictEq(var.get(u'exprs').get(u'length'),Js(1.0)): + return var.get(u'exprs').get(u'0') + else: + return var.get(u't').callprop(u'sequenceExpression', var.get(u'exprs')) + PyJsHoisted_convert_.func_name = u'convert' + var.put(u'convert', PyJsHoisted_convert_) + if (var.get(u'nodes').neg() or var.get(u'nodes').get(u'length').neg()): + return var.get('undefined') + var.put(u'declars', Js([])) + var.put(u'bailed', Js(False)) + var.put(u'result', var.get(u'convert')(var.get(u'nodes'))) + if var.get(u'bailed'): + return var.get('undefined') + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'declars').get(u'length')): + try: + var.get(u'scope').callprop(u'push', var.get(u'declars').get(var.get(u'i'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'result') + pass + PyJsHoisted_toSequenceExpression_.func_name = u'toSequenceExpression' + var.put(u'toSequenceExpression', PyJsHoisted_toSequenceExpression_) + @Js + def PyJsHoisted_toExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u't').callprop(u'isExpressionStatement', var.get(u'node')): + var.put(u'node', var.get(u'node').get(u'expression')) + if var.get(u't').callprop(u'isExpression', var.get(u'node')): + return var.get(u'node') + if var.get(u't').callprop(u'isClass', var.get(u'node')): + var.get(u'node').put(u'type', Js(u'ClassExpression')) + else: + if var.get(u't').callprop(u'isFunction', var.get(u'node')): + var.get(u'node').put(u'type', Js(u'FunctionExpression')) + if var.get(u't').callprop(u'isExpression', var.get(u'node')).neg(): + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'cannot turn ')+var.get(u'node').get(u'type'))+Js(u' to an expression')))) + raise PyJsTempException + return var.get(u'node') + PyJsHoisted_toExpression_.func_name = u'toExpression' + var.put(u'toExpression', PyJsHoisted_toExpression_) + @Js + def PyJsHoisted_toComputedKey_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'key']) + var.put(u'key', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else (var.get(u'node').get(u'key') or var.get(u'node').get(u'property')))) + if var.get(u'node').get(u'computed').neg(): + if var.get(u't').callprop(u'isIdentifier', var.get(u'key')): + var.put(u'key', var.get(u't').callprop(u'stringLiteral', var.get(u'key').get(u'name'))) + return var.get(u'key') + PyJsHoisted_toComputedKey_.func_name = u'toComputedKey' + var.put(u'toComputedKey', PyJsHoisted_toComputedKey_) + @Js + def PyJsHoisted_toBindingIdentifierName_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + var.put(u'name', var.get(u'toIdentifier')(var.get(u'name'))) + if (PyJsStrictEq(var.get(u'name'),Js(u'eval')) or PyJsStrictEq(var.get(u'name'),Js(u'arguments'))): + var.put(u'name', (Js(u'_')+var.get(u'name'))) + return var.get(u'name') + PyJsHoisted_toBindingIdentifierName_.func_name = u'toBindingIdentifierName' + var.put(u'toBindingIdentifierName', PyJsHoisted_toBindingIdentifierName_) + @Js + def PyJsHoisted_toBlock_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + if var.get(u't').callprop(u'isBlockStatement', var.get(u'node')): + return var.get(u'node') + if var.get(u't').callprop(u'isEmptyStatement', var.get(u'node')): + var.put(u'node', Js([])) + if var.get(u'Array').callprop(u'isArray', var.get(u'node')).neg(): + if var.get(u't').callprop(u'isStatement', var.get(u'node')).neg(): + if var.get(u't').callprop(u'isFunction', var.get(u'parent')): + var.put(u'node', var.get(u't').callprop(u'returnStatement', var.get(u'node'))) + else: + var.put(u'node', var.get(u't').callprop(u'expressionStatement', var.get(u'node'))) + var.put(u'node', Js([var.get(u'node')])) + return var.get(u't').callprop(u'blockStatement', var.get(u'node')) + PyJsHoisted_toBlock_.func_name = u'toBlock' + var.put(u'toBlock', PyJsHoisted_toBlock_) + @Js + def PyJsHoisted_toStatement_(node, ignore, this, arguments, var=var): + var = Scope({u'node':node, u'ignore':ignore, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'ignore', u'mustHaveId', u'newType']) + if var.get(u't').callprop(u'isStatement', var.get(u'node')): + return var.get(u'node') + var.put(u'mustHaveId', Js(False)) + var.put(u'newType', PyJsComma(Js(0.0), Js(None))) + if var.get(u't').callprop(u'isClass', var.get(u'node')): + var.put(u'mustHaveId', var.get(u'true')) + var.put(u'newType', Js(u'ClassDeclaration')) + else: + if var.get(u't').callprop(u'isFunction', var.get(u'node')): + var.put(u'mustHaveId', var.get(u'true')) + var.put(u'newType', Js(u'FunctionDeclaration')) + else: + if var.get(u't').callprop(u'isAssignmentExpression', var.get(u'node')): + return var.get(u't').callprop(u'expressionStatement', var.get(u'node')) + if (var.get(u'mustHaveId') and var.get(u'node').get(u'id').neg()): + var.put(u'newType', Js(False)) + if var.get(u'newType').neg(): + if var.get(u'ignore'): + return Js(False) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'cannot turn ')+var.get(u'node').get(u'type'))+Js(u' to a statement')))) + raise PyJsTempException + var.get(u'node').put(u'type', var.get(u'newType')) + return var.get(u'node') + PyJsHoisted_toStatement_.func_name = u'toStatement' + var.put(u'toStatement', PyJsHoisted_toStatement_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2215_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2215_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_toIdentifier_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + var.put(u'name', (var.get(u'name')+Js(u''))) + var.put(u'name', var.get(u'name').callprop(u'replace', JsRegExp(u'/[^a-zA-Z0-9$_]/g'), Js(u'-'))) + var.put(u'name', var.get(u'name').callprop(u'replace', JsRegExp(u'/^[-0-9]+/'), Js(u''))) + @Js + def PyJs_anonymous_2218_(match, c, this, arguments, var=var): + var = Scope({u'this':this, u'c':c, u'arguments':arguments, u'match':match}, var) + var.registers([u'c', u'match']) + return (var.get(u'c').callprop(u'toUpperCase') if var.get(u'c') else Js(u'')) + PyJs_anonymous_2218_._set_name(u'anonymous') + var.put(u'name', var.get(u'name').callprop(u'replace', JsRegExp(u'/[-\\s]+(.)?/g'), PyJs_anonymous_2218_)) + if var.get(u't').callprop(u'isValidIdentifier', var.get(u'name')).neg(): + var.put(u'name', (Js(u'_')+var.get(u'name'))) + return (var.get(u'name') or Js(u'_')) + PyJsHoisted_toIdentifier_.func_name = u'toIdentifier' + var.put(u'toIdentifier', PyJsHoisted_toIdentifier_) + @Js + def PyJsHoisted_toKeyAlias_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'alias', u'key']) + var.put(u'key', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else var.get(u'node').get(u'key'))) + var.put(u'alias', PyJsComma(Js(0.0), Js(None))) + if PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'method')): + return (var.get(u'toKeyAlias').callprop(u'increment')+Js(u'')) + else: + if var.get(u't').callprop(u'isIdentifier', var.get(u'key')): + var.put(u'alias', var.get(u'key').get(u'name')) + else: + if var.get(u't').callprop(u'isStringLiteral', var.get(u'key')): + var.put(u'alias', PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'key').get(u'value'))) + else: + var.put(u'alias', PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u't').callprop(u'removePropertiesDeep', var.get(u't').callprop(u'cloneDeep', var.get(u'key'))))) + if var.get(u'node').get(u'computed'): + var.put(u'alias', ((Js(u'[')+var.get(u'alias'))+Js(u']'))) + if var.get(u'node').get(u'static'): + var.put(u'alias', (Js(u'static:')+var.get(u'alias'))) + return var.get(u'alias') + PyJsHoisted_toKeyAlias_.func_name = u'toKeyAlias' + var.put(u'toKeyAlias', PyJsHoisted_toKeyAlias_) + @Js + def PyJsHoisted_valueToNode_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'pattern', u'value', u'flags', u'nodeKey', u'key', u'props']) + if PyJsStrictEq(var.get(u'value'),var.get(u'undefined')): + return var.get(u't').callprop(u'identifier', Js(u'undefined')) + if (PyJsStrictEq(var.get(u'value'),var.get(u'true')) or PyJsStrictEq(var.get(u'value'),Js(False))): + return var.get(u't').callprop(u'booleanLiteral', var.get(u'value')) + if PyJsStrictEq(var.get(u'value'),var.get(u"null")): + return var.get(u't').callprop(u'nullLiteral') + if PyJsComma(Js(0.0),var.get(u'_isString2').get(u'default'))(var.get(u'value')): + return var.get(u't').callprop(u'stringLiteral', var.get(u'value')) + if PyJsComma(Js(0.0),var.get(u'_isNumber2').get(u'default'))(var.get(u'value')): + return var.get(u't').callprop(u'numericLiteral', var.get(u'value')) + if PyJsComma(Js(0.0),var.get(u'_isRegExp2').get(u'default'))(var.get(u'value')): + var.put(u'pattern', var.get(u'value').get(u'source')) + var.put(u'flags', var.get(u'value').callprop(u'toString').callprop(u'match', JsRegExp(u'/\\/([a-z]+|)$/')).get(u'1')) + return var.get(u't').callprop(u'regExpLiteral', var.get(u'pattern'), var.get(u'flags')) + if var.get(u'Array').callprop(u'isArray', var.get(u'value')): + return var.get(u't').callprop(u'arrayExpression', var.get(u'value').callprop(u'map', var.get(u't').get(u'valueToNode'))) + if PyJsComma(Js(0.0),var.get(u'_isPlainObject2').get(u'default'))(var.get(u'value')): + var.put(u'props', Js([])) + for PyJsTemp in var.get(u'value'): + var.put(u'key', PyJsTemp) + var.put(u'nodeKey', PyJsComma(Js(0.0), Js(None))) + if var.get(u't').callprop(u'isValidIdentifier', var.get(u'key')): + var.put(u'nodeKey', var.get(u't').callprop(u'identifier', var.get(u'key'))) + else: + var.put(u'nodeKey', var.get(u't').callprop(u'stringLiteral', var.get(u'key'))) + var.get(u'props').callprop(u'push', var.get(u't').callprop(u'objectProperty', var.get(u'nodeKey'), var.get(u't').callprop(u'valueToNode', var.get(u'value').get(var.get(u'key'))))) + return var.get(u't').callprop(u'objectExpression', var.get(u'props')) + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"don't know how to turn this value into a node"))) + raise PyJsTempException + PyJsHoisted_valueToNode_.func_name = u'valueToNode' + var.put(u'valueToNode', PyJsHoisted_valueToNode_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_maxSafeInteger', var.get(u'require')(Js(u'babel-runtime/core-js/number/max-safe-integer'))) + var.put(u'_maxSafeInteger2', var.get(u'_interopRequireDefault')(var.get(u'_maxSafeInteger'))) + var.put(u'_stringify', var.get(u'require')(Js(u'babel-runtime/core-js/json/stringify'))) + var.put(u'_stringify2', var.get(u'_interopRequireDefault')(var.get(u'_stringify'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'toComputedKey', var.get(u'toComputedKey')) + var.get(u'exports').put(u'toSequenceExpression', var.get(u'toSequenceExpression')) + var.get(u'exports').put(u'toKeyAlias', var.get(u'toKeyAlias')) + var.get(u'exports').put(u'toIdentifier', var.get(u'toIdentifier')) + var.get(u'exports').put(u'toBindingIdentifierName', var.get(u'toBindingIdentifierName')) + var.get(u'exports').put(u'toStatement', var.get(u'toStatement')) + var.get(u'exports').put(u'toExpression', var.get(u'toExpression')) + var.get(u'exports').put(u'toBlock', var.get(u'toBlock')) + var.get(u'exports').put(u'valueToNode', var.get(u'valueToNode')) + var.put(u'_isPlainObject', var.get(u'require')(Js(u'lodash/isPlainObject'))) + var.put(u'_isPlainObject2', var.get(u'_interopRequireDefault')(var.get(u'_isPlainObject'))) + var.put(u'_isNumber', var.get(u'require')(Js(u'lodash/isNumber'))) + var.put(u'_isNumber2', var.get(u'_interopRequireDefault')(var.get(u'_isNumber'))) + var.put(u'_isRegExp', var.get(u'require')(Js(u'lodash/isRegExp'))) + var.put(u'_isRegExp2', var.get(u'_interopRequireDefault')(var.get(u'_isRegExp'))) + var.put(u'_isString', var.get(u'require')(Js(u'lodash/isString'))) + var.put(u'_isString2', var.get(u'_interopRequireDefault')(var.get(u'_isString'))) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_index'))) + pass + pass + pass + pass + pass + var.get(u'toKeyAlias').put(u'uid', Js(0.0)) + @Js + def PyJs_anonymous_2217_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if (var.get(u'toKeyAlias').get(u'uid')>=var.get(u'_maxSafeInteger2').get(u'default')): + return var.get(u'toKeyAlias').put(u'uid', Js(0.0)) + else: + return (var.get(u'toKeyAlias').put(u'uid',Js(var.get(u'toKeyAlias').get(u'uid').to_number())+Js(1))-Js(1)) + PyJs_anonymous_2217_._set_name(u'anonymous') + var.get(u'toKeyAlias').put(u'increment', PyJs_anonymous_2217_) + pass + pass + pass + pass + pass + pass +PyJs_anonymous_2213_._set_name(u'anonymous') +PyJs_Object_2219_ = Js({u'./index':Js(258.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/json/stringify':Js(97.0),u'babel-runtime/core-js/number/max-safe-integer':Js(99.0),u'lodash/isNumber':Js(466.0),u'lodash/isPlainObject':Js(469.0),u'lodash/isRegExp':Js(470.0),u'lodash/isString':Js(471.0)}) +@Js +def PyJs_anonymous_2220_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_constants', u'_interopRequireWildcard', u'_index', u'require', u'module', u't', u'_index2', u'_index3', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2221_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2221_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2222_ = Js({}) + var.put(u'newObj', PyJs_Object_2222_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.put(u'_index', var.get(u'require')(Js(u'../index'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_index'))) + var.put(u'_constants', var.get(u'require')(Js(u'../constants'))) + var.put(u'_index2', var.get(u'require')(Js(u'./index'))) + var.put(u'_index3', var.get(u'_interopRequireDefault')(var.get(u'_index2'))) + pass + pass + PyJs_Object_2225_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeOrValueType'))(Js(u'null'), Js(u'Expression'), Js(u'SpreadElement')))),u'default':Js([])}) + PyJs_Object_2224_ = Js({u'elements':PyJs_Object_2225_}) + PyJs_Object_2223_ = Js({u'fields':PyJs_Object_2224_,u'visitor':Js([Js(u'elements')]),u'aliases':Js([Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ArrayExpression'), PyJs_Object_2223_) + PyJs_Object_2228_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'string'))}) + PyJs_Object_2229_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'LVal'))}) + PyJs_Object_2230_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2227_ = Js({u'operator':PyJs_Object_2228_,u'left':PyJs_Object_2229_,u'right':PyJs_Object_2230_}) + PyJs_Object_2226_ = Js({u'fields':PyJs_Object_2227_,u'builder':Js([Js(u'operator'), Js(u'left'), Js(u'right')]),u'visitor':Js([Js(u'left'), Js(u'right')]),u'aliases':Js([Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'AssignmentExpression'), PyJs_Object_2226_) + PyJs_Object_2233_ = Js({u'validate':var.get(u'_index2').get(u'assertOneOf').callprop(u'apply', var.get(u'undefined'), var.get(u'_constants').get(u'BINARY_OPERATORS'))}) + PyJs_Object_2234_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2235_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2232_ = Js({u'operator':PyJs_Object_2233_,u'left':PyJs_Object_2234_,u'right':PyJs_Object_2235_}) + PyJs_Object_2231_ = Js({u'builder':Js([Js(u'operator'), Js(u'left'), Js(u'right')]),u'fields':PyJs_Object_2232_,u'visitor':Js([Js(u'left'), Js(u'right')]),u'aliases':Js([Js(u'Binary'), Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'BinaryExpression'), PyJs_Object_2231_) + PyJs_Object_2238_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'DirectiveLiteral'))}) + PyJs_Object_2237_ = Js({u'value':PyJs_Object_2238_}) + PyJs_Object_2236_ = Js({u'visitor':Js([Js(u'value')]),u'fields':PyJs_Object_2237_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'Directive'), PyJs_Object_2236_) + PyJs_Object_2241_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'string'))}) + PyJs_Object_2240_ = Js({u'value':PyJs_Object_2241_}) + PyJs_Object_2239_ = Js({u'builder':Js([Js(u'value')]),u'fields':PyJs_Object_2240_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'DirectiveLiteral'), PyJs_Object_2239_) + PyJs_Object_2244_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Directive')))),u'default':Js([])}) + PyJs_Object_2245_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))))}) + PyJs_Object_2243_ = Js({u'directives':PyJs_Object_2244_,u'body':PyJs_Object_2245_}) + PyJs_Object_2242_ = Js({u'builder':Js([Js(u'body'), Js(u'directives')]),u'visitor':Js([Js(u'directives'), Js(u'body')]),u'fields':PyJs_Object_2243_,u'aliases':Js([Js(u'Scopable'), Js(u'BlockParent'), Js(u'Block'), Js(u'Statement')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'BlockStatement'), PyJs_Object_2242_) + PyJs_Object_2248_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Identifier')),u'optional':var.get(u'true')}) + PyJs_Object_2247_ = Js({u'label':PyJs_Object_2248_}) + PyJs_Object_2246_ = Js({u'visitor':Js([Js(u'label')]),u'fields':PyJs_Object_2247_,u'aliases':Js([Js(u'Statement'), Js(u'Terminatorless'), Js(u'CompletionStatement')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'BreakStatement'), PyJs_Object_2246_) + PyJs_Object_2251_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2252_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'), Js(u'SpreadElement'))))}) + PyJs_Object_2250_ = Js({u'callee':PyJs_Object_2251_,u'arguments':PyJs_Object_2252_}) + PyJs_Object_2249_ = Js({u'visitor':Js([Js(u'callee'), Js(u'arguments')]),u'fields':PyJs_Object_2250_,u'aliases':Js([Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'CallExpression'), PyJs_Object_2249_) + PyJs_Object_2255_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2256_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2254_ = Js({u'param':PyJs_Object_2255_,u'body':PyJs_Object_2256_}) + PyJs_Object_2253_ = Js({u'visitor':Js([Js(u'param'), Js(u'body')]),u'fields':PyJs_Object_2254_,u'aliases':Js([Js(u'Scopable')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'CatchClause'), PyJs_Object_2253_) + PyJs_Object_2259_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2260_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2261_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2258_ = Js({u'test':PyJs_Object_2259_,u'consequent':PyJs_Object_2260_,u'alternate':PyJs_Object_2261_}) + PyJs_Object_2257_ = Js({u'visitor':Js([Js(u'test'), Js(u'consequent'), Js(u'alternate')]),u'fields':PyJs_Object_2258_,u'aliases':Js([Js(u'Expression'), Js(u'Conditional')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ConditionalExpression'), PyJs_Object_2257_) + PyJs_Object_2264_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Identifier')),u'optional':var.get(u'true')}) + PyJs_Object_2263_ = Js({u'label':PyJs_Object_2264_}) + PyJs_Object_2262_ = Js({u'visitor':Js([Js(u'label')]),u'fields':PyJs_Object_2263_,u'aliases':Js([Js(u'Statement'), Js(u'Terminatorless'), Js(u'CompletionStatement')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ContinueStatement'), PyJs_Object_2262_) + PyJs_Object_2265_ = Js({u'aliases':Js([Js(u'Statement')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'DebuggerStatement'), PyJs_Object_2265_) + PyJs_Object_2268_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2269_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2267_ = Js({u'test':PyJs_Object_2268_,u'body':PyJs_Object_2269_}) + PyJs_Object_2266_ = Js({u'visitor':Js([Js(u'test'), Js(u'body')]),u'fields':PyJs_Object_2267_,u'aliases':Js([Js(u'Statement'), Js(u'BlockParent'), Js(u'Loop'), Js(u'While'), Js(u'Scopable')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'DoWhileStatement'), PyJs_Object_2266_) + PyJs_Object_2270_ = Js({u'aliases':Js([Js(u'Statement')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'EmptyStatement'), PyJs_Object_2270_) + PyJs_Object_2273_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2272_ = Js({u'expression':PyJs_Object_2273_}) + PyJs_Object_2271_ = Js({u'visitor':Js([Js(u'expression')]),u'fields':PyJs_Object_2272_,u'aliases':Js([Js(u'Statement'), Js(u'ExpressionWrapper')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ExpressionStatement'), PyJs_Object_2271_) + PyJs_Object_2276_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Program'))}) + PyJs_Object_2275_ = Js({u'program':PyJs_Object_2276_}) + PyJs_Object_2274_ = Js({u'builder':Js([Js(u'program'), Js(u'comments'), Js(u'tokens')]),u'visitor':Js([Js(u'program')]),u'fields':PyJs_Object_2275_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'File'), PyJs_Object_2274_) + PyJs_Object_2279_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'VariableDeclaration'), Js(u'LVal'))}) + PyJs_Object_2280_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2281_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2278_ = Js({u'left':PyJs_Object_2279_,u'right':PyJs_Object_2280_,u'body':PyJs_Object_2281_}) + PyJs_Object_2277_ = Js({u'visitor':Js([Js(u'left'), Js(u'right'), Js(u'body')]),u'aliases':Js([Js(u'Scopable'), Js(u'Statement'), Js(u'For'), Js(u'BlockParent'), Js(u'Loop'), Js(u'ForXStatement')]),u'fields':PyJs_Object_2278_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ForInStatement'), PyJs_Object_2277_) + PyJs_Object_2284_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'VariableDeclaration'), Js(u'Expression')),u'optional':var.get(u'true')}) + PyJs_Object_2285_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression')),u'optional':var.get(u'true')}) + PyJs_Object_2286_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression')),u'optional':var.get(u'true')}) + PyJs_Object_2287_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2283_ = Js({u'init':PyJs_Object_2284_,u'test':PyJs_Object_2285_,u'update':PyJs_Object_2286_,u'body':PyJs_Object_2287_}) + PyJs_Object_2282_ = Js({u'visitor':Js([Js(u'init'), Js(u'test'), Js(u'update'), Js(u'body')]),u'aliases':Js([Js(u'Scopable'), Js(u'Statement'), Js(u'For'), Js(u'BlockParent'), Js(u'Loop')]),u'fields':PyJs_Object_2283_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ForStatement'), PyJs_Object_2282_) + PyJs_Object_2290_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2291_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'LVal'))))}) + PyJs_Object_2292_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2293_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2294_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2289_ = Js({u'id':PyJs_Object_2290_,u'params':PyJs_Object_2291_,u'body':PyJs_Object_2292_,u'generator':PyJs_Object_2293_,u'async':PyJs_Object_2294_}) + PyJs_Object_2288_ = Js({u'builder':Js([Js(u'id'), Js(u'params'), Js(u'body'), Js(u'generator'), Js(u'async')]),u'visitor':Js([Js(u'id'), Js(u'params'), Js(u'body'), Js(u'returnType'), Js(u'typeParameters')]),u'fields':PyJs_Object_2289_,u'aliases':Js([Js(u'Scopable'), Js(u'Function'), Js(u'BlockParent'), Js(u'FunctionParent'), Js(u'Statement'), Js(u'Pureish'), Js(u'Declaration')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'FunctionDeclaration'), PyJs_Object_2288_) + PyJs_Object_2297_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Identifier')),u'optional':var.get(u'true')}) + PyJs_Object_2298_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'LVal'))))}) + PyJs_Object_2299_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2300_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2301_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2296_ = Js({u'id':PyJs_Object_2297_,u'params':PyJs_Object_2298_,u'body':PyJs_Object_2299_,u'generator':PyJs_Object_2300_,u'async':PyJs_Object_2301_}) + PyJs_Object_2295_ = Js({u'inherits':Js(u'FunctionDeclaration'),u'aliases':Js([Js(u'Scopable'), Js(u'Function'), Js(u'BlockParent'), Js(u'FunctionParent'), Js(u'Expression'), Js(u'Pureish')]),u'fields':PyJs_Object_2296_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'FunctionExpression'), PyJs_Object_2295_) + @Js + def PyJs_validate_2305_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'val':val, u'this':this, u'arguments':arguments, u'key':key, u'validate':PyJs_validate_2305_}, var) + var.registers([u'node', u'val', u'key']) + if var.get(u't').callprop(u'isValidIdentifier', var.get(u'val')).neg(): + pass + PyJs_validate_2305_._set_name(u'validate') + PyJs_Object_2304_ = Js({u'validate':PyJs_validate_2305_}) + PyJs_Object_2306_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2303_ = Js({u'name':PyJs_Object_2304_,u'decorators':PyJs_Object_2306_}) + PyJs_Object_2302_ = Js({u'builder':Js([Js(u'name')]),u'visitor':Js([Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Expression'), Js(u'LVal')]),u'fields':PyJs_Object_2303_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'Identifier'), PyJs_Object_2302_) + PyJs_Object_2309_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2310_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2311_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2308_ = Js({u'test':PyJs_Object_2309_,u'consequent':PyJs_Object_2310_,u'alternate':PyJs_Object_2311_}) + PyJs_Object_2307_ = Js({u'visitor':Js([Js(u'test'), Js(u'consequent'), Js(u'alternate')]),u'aliases':Js([Js(u'Statement'), Js(u'Conditional')]),u'fields':PyJs_Object_2308_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'IfStatement'), PyJs_Object_2307_) + PyJs_Object_2314_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2315_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2313_ = Js({u'label':PyJs_Object_2314_,u'body':PyJs_Object_2315_}) + PyJs_Object_2312_ = Js({u'visitor':Js([Js(u'label'), Js(u'body')]),u'aliases':Js([Js(u'Statement')]),u'fields':PyJs_Object_2313_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'LabeledStatement'), PyJs_Object_2312_) + PyJs_Object_2318_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'string'))}) + PyJs_Object_2317_ = Js({u'value':PyJs_Object_2318_}) + PyJs_Object_2316_ = Js({u'builder':Js([Js(u'value')]),u'fields':PyJs_Object_2317_,u'aliases':Js([Js(u'Expression'), Js(u'Pureish'), Js(u'Literal'), Js(u'Immutable')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'StringLiteral'), PyJs_Object_2316_) + PyJs_Object_2321_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'number'))}) + PyJs_Object_2320_ = Js({u'value':PyJs_Object_2321_}) + PyJs_Object_2319_ = Js({u'builder':Js([Js(u'value')]),u'deprecatedAlias':Js(u'NumberLiteral'),u'fields':PyJs_Object_2320_,u'aliases':Js([Js(u'Expression'), Js(u'Pureish'), Js(u'Literal'), Js(u'Immutable')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'NumericLiteral'), PyJs_Object_2319_) + PyJs_Object_2322_ = Js({u'aliases':Js([Js(u'Expression'), Js(u'Pureish'), Js(u'Literal'), Js(u'Immutable')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'NullLiteral'), PyJs_Object_2322_) + PyJs_Object_2325_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2324_ = Js({u'value':PyJs_Object_2325_}) + PyJs_Object_2323_ = Js({u'builder':Js([Js(u'value')]),u'fields':PyJs_Object_2324_,u'aliases':Js([Js(u'Expression'), Js(u'Pureish'), Js(u'Literal'), Js(u'Immutable')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'BooleanLiteral'), PyJs_Object_2323_) + PyJs_Object_2328_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'string'))}) + PyJs_Object_2329_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'string')),u'default':Js(u'')}) + PyJs_Object_2327_ = Js({u'pattern':PyJs_Object_2328_,u'flags':PyJs_Object_2329_}) + PyJs_Object_2326_ = Js({u'builder':Js([Js(u'pattern'), Js(u'flags')]),u'deprecatedAlias':Js(u'RegexLiteral'),u'aliases':Js([Js(u'Expression'), Js(u'Literal')]),u'fields':PyJs_Object_2327_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'RegExpLiteral'), PyJs_Object_2326_) + PyJs_Object_2332_ = Js({u'validate':var.get(u'_index2').get(u'assertOneOf').callprop(u'apply', var.get(u'undefined'), var.get(u'_constants').get(u'LOGICAL_OPERATORS'))}) + PyJs_Object_2333_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2334_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2331_ = Js({u'operator':PyJs_Object_2332_,u'left':PyJs_Object_2333_,u'right':PyJs_Object_2334_}) + PyJs_Object_2330_ = Js({u'builder':Js([Js(u'operator'), Js(u'left'), Js(u'right')]),u'visitor':Js([Js(u'left'), Js(u'right')]),u'aliases':Js([Js(u'Binary'), Js(u'Expression')]),u'fields':PyJs_Object_2331_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'LogicalExpression'), PyJs_Object_2330_) + PyJs_Object_2337_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + @Js + def PyJs_validate_2339_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'val':val, u'this':this, u'arguments':arguments, u'key':key, u'validate':PyJs_validate_2339_}, var) + var.registers([u'node', u'expectedType', u'val', u'key']) + var.put(u'expectedType', (Js(u'Expression') if var.get(u'node').get(u'computed') else Js(u'Identifier'))) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(var.get(u'expectedType'))(var.get(u'node'), var.get(u'key'), var.get(u'val')) + PyJs_validate_2339_._set_name(u'validate') + PyJs_Object_2338_ = Js({u'validate':PyJs_validate_2339_}) + PyJs_Object_2340_ = Js({u'default':Js(False)}) + PyJs_Object_2336_ = Js({u'object':PyJs_Object_2337_,u'property':PyJs_Object_2338_,u'computed':PyJs_Object_2340_}) + PyJs_Object_2335_ = Js({u'builder':Js([Js(u'object'), Js(u'property'), Js(u'computed')]),u'visitor':Js([Js(u'object'), Js(u'property')]),u'aliases':Js([Js(u'Expression'), Js(u'LVal')]),u'fields':PyJs_Object_2336_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'MemberExpression'), PyJs_Object_2335_) + PyJs_Object_2343_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2344_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'), Js(u'SpreadElement'))))}) + PyJs_Object_2342_ = Js({u'callee':PyJs_Object_2343_,u'arguments':PyJs_Object_2344_}) + PyJs_Object_2341_ = Js({u'visitor':Js([Js(u'callee'), Js(u'arguments')]),u'aliases':Js([Js(u'Expression')]),u'fields':PyJs_Object_2342_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'NewExpression'), PyJs_Object_2341_) + PyJs_Object_2347_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Directive')))),u'default':Js([])}) + PyJs_Object_2348_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))))}) + PyJs_Object_2346_ = Js({u'directives':PyJs_Object_2347_,u'body':PyJs_Object_2348_}) + PyJs_Object_2345_ = Js({u'visitor':Js([Js(u'directives'), Js(u'body')]),u'builder':Js([Js(u'body'), Js(u'directives')]),u'fields':PyJs_Object_2346_,u'aliases':Js([Js(u'Scopable'), Js(u'BlockParent'), Js(u'Block'), Js(u'FunctionParent')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'Program'), PyJs_Object_2345_) + PyJs_Object_2351_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'ObjectMethod'), Js(u'ObjectProperty'), Js(u'SpreadProperty'))))}) + PyJs_Object_2350_ = Js({u'properties':PyJs_Object_2351_}) + PyJs_Object_2349_ = Js({u'visitor':Js([Js(u'properties')]),u'aliases':Js([Js(u'Expression')]),u'fields':PyJs_Object_2350_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ObjectExpression'), PyJs_Object_2349_) + PyJs_Object_2354_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'string')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertOneOf'))(Js(u'method'), Js(u'get'), Js(u'set'))),u'default':Js(u'method')}) + PyJs_Object_2355_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean')),u'default':Js(False)}) + @Js + def PyJs_validate_2357_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'val':val, u'this':this, u'arguments':arguments, u'key':key, u'validate':PyJs_validate_2357_}, var) + var.registers([u'node', u'val', u'key', u'expectedTypes']) + var.put(u'expectedTypes', (Js([Js(u'Expression')]) if var.get(u'node').get(u'computed') else Js([Js(u'Identifier'), Js(u'StringLiteral'), Js(u'NumericLiteral')]))) + var.get(u'_index2').get(u'assertNodeType').callprop(u'apply', var.get(u'undefined'), var.get(u'expectedTypes'))(var.get(u'node'), var.get(u'key'), var.get(u'val')) + PyJs_validate_2357_._set_name(u'validate') + PyJs_Object_2356_ = Js({u'validate':PyJs_validate_2357_}) + PyJs_Object_2358_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2359_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2360_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2361_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2353_ = Js({u'kind':PyJs_Object_2354_,u'computed':PyJs_Object_2355_,u'key':PyJs_Object_2356_,u'decorators':PyJs_Object_2358_,u'body':PyJs_Object_2359_,u'generator':PyJs_Object_2360_,u'async':PyJs_Object_2361_}) + PyJs_Object_2352_ = Js({u'builder':Js([Js(u'kind'), Js(u'key'), Js(u'params'), Js(u'body'), Js(u'computed')]),u'fields':PyJs_Object_2353_,u'visitor':Js([Js(u'key'), Js(u'params'), Js(u'body'), Js(u'decorators'), Js(u'returnType'), Js(u'typeParameters')]),u'aliases':Js([Js(u'UserWhitespacable'), Js(u'Function'), Js(u'Scopable'), Js(u'BlockParent'), Js(u'FunctionParent'), Js(u'Method'), Js(u'ObjectMember')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ObjectMethod'), PyJs_Object_2352_) + PyJs_Object_2364_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean')),u'default':Js(False)}) + @Js + def PyJs_validate_2366_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'val':val, u'this':this, u'arguments':arguments, u'key':key, u'validate':PyJs_validate_2366_}, var) + var.registers([u'node', u'val', u'key', u'expectedTypes']) + var.put(u'expectedTypes', (Js([Js(u'Expression')]) if var.get(u'node').get(u'computed') else Js([Js(u'Identifier'), Js(u'StringLiteral'), Js(u'NumericLiteral')]))) + var.get(u'_index2').get(u'assertNodeType').callprop(u'apply', var.get(u'undefined'), var.get(u'expectedTypes'))(var.get(u'node'), var.get(u'key'), var.get(u'val')) + PyJs_validate_2366_._set_name(u'validate') + PyJs_Object_2365_ = Js({u'validate':PyJs_validate_2366_}) + PyJs_Object_2367_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2368_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean')),u'default':Js(False)}) + PyJs_Object_2369_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Decorator')))),u'optional':var.get(u'true')}) + PyJs_Object_2363_ = Js({u'computed':PyJs_Object_2364_,u'key':PyJs_Object_2365_,u'value':PyJs_Object_2367_,u'shorthand':PyJs_Object_2368_,u'decorators':PyJs_Object_2369_}) + PyJs_Object_2362_ = Js({u'builder':Js([Js(u'key'), Js(u'value'), Js(u'computed'), Js(u'shorthand'), Js(u'decorators')]),u'fields':PyJs_Object_2363_,u'visitor':Js([Js(u'key'), Js(u'value'), Js(u'decorators')]),u'aliases':Js([Js(u'UserWhitespacable'), Js(u'Property'), Js(u'ObjectMember')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ObjectProperty'), PyJs_Object_2362_) + PyJs_Object_2372_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'LVal'))}) + PyJs_Object_2373_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2371_ = Js({u'argument':PyJs_Object_2372_,u'decorators':PyJs_Object_2373_}) + PyJs_Object_2370_ = Js({u'visitor':Js([Js(u'argument'), Js(u'typeAnnotation')]),u'aliases':Js([Js(u'LVal')]),u'fields':PyJs_Object_2371_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'RestElement'), PyJs_Object_2370_) + PyJs_Object_2376_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression')),u'optional':var.get(u'true')}) + PyJs_Object_2375_ = Js({u'argument':PyJs_Object_2376_}) + PyJs_Object_2374_ = Js({u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'Statement'), Js(u'Terminatorless'), Js(u'CompletionStatement')]),u'fields':PyJs_Object_2375_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ReturnStatement'), PyJs_Object_2374_) + PyJs_Object_2379_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))))}) + PyJs_Object_2378_ = Js({u'expressions':PyJs_Object_2379_}) + PyJs_Object_2377_ = Js({u'visitor':Js([Js(u'expressions')]),u'fields':PyJs_Object_2378_,u'aliases':Js([Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'SequenceExpression'), PyJs_Object_2377_) + PyJs_Object_2382_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression')),u'optional':var.get(u'true')}) + PyJs_Object_2383_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))))}) + PyJs_Object_2381_ = Js({u'test':PyJs_Object_2382_,u'consequent':PyJs_Object_2383_}) + PyJs_Object_2380_ = Js({u'visitor':Js([Js(u'test'), Js(u'consequent')]),u'fields':PyJs_Object_2381_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'SwitchCase'), PyJs_Object_2380_) + PyJs_Object_2386_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2387_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'SwitchCase'))))}) + PyJs_Object_2385_ = Js({u'discriminant':PyJs_Object_2386_,u'cases':PyJs_Object_2387_}) + PyJs_Object_2384_ = Js({u'visitor':Js([Js(u'discriminant'), Js(u'cases')]),u'aliases':Js([Js(u'Statement'), Js(u'BlockParent'), Js(u'Scopable')]),u'fields':PyJs_Object_2385_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'SwitchStatement'), PyJs_Object_2384_) + PyJs_Object_2388_ = Js({u'aliases':Js([Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ThisExpression'), PyJs_Object_2388_) + PyJs_Object_2391_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2390_ = Js({u'argument':PyJs_Object_2391_}) + PyJs_Object_2389_ = Js({u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'Statement'), Js(u'Terminatorless'), Js(u'CompletionStatement')]),u'fields':PyJs_Object_2390_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ThrowStatement'), PyJs_Object_2389_) + PyJs_Object_2394_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2395_ = Js({u'optional':var.get(u'true'),u'handler':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2396_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2393_ = Js({u'body':PyJs_Object_2394_,u'handler':PyJs_Object_2395_,u'finalizer':PyJs_Object_2396_}) + PyJs_Object_2392_ = Js({u'visitor':Js([Js(u'block'), Js(u'handler'), Js(u'finalizer')]),u'aliases':Js([Js(u'Statement')]),u'fields':PyJs_Object_2393_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'TryStatement'), PyJs_Object_2392_) + PyJs_Object_2399_ = Js({u'default':var.get(u'true')}) + PyJs_Object_2400_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2401_ = Js({u'validate':var.get(u'_index2').get(u'assertOneOf').callprop(u'apply', var.get(u'undefined'), var.get(u'_constants').get(u'UNARY_OPERATORS'))}) + PyJs_Object_2398_ = Js({u'prefix':PyJs_Object_2399_,u'argument':PyJs_Object_2400_,u'operator':PyJs_Object_2401_}) + PyJs_Object_2397_ = Js({u'builder':Js([Js(u'operator'), Js(u'argument'), Js(u'prefix')]),u'fields':PyJs_Object_2398_,u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'UnaryLike'), Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'UnaryExpression'), PyJs_Object_2397_) + PyJs_Object_2404_ = Js({u'default':Js(False)}) + PyJs_Object_2405_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2406_ = Js({u'validate':var.get(u'_index2').get(u'assertOneOf').callprop(u'apply', var.get(u'undefined'), var.get(u'_constants').get(u'UPDATE_OPERATORS'))}) + PyJs_Object_2403_ = Js({u'prefix':PyJs_Object_2404_,u'argument':PyJs_Object_2405_,u'operator':PyJs_Object_2406_}) + PyJs_Object_2402_ = Js({u'builder':Js([Js(u'operator'), Js(u'argument'), Js(u'prefix')]),u'fields':PyJs_Object_2403_,u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'UpdateExpression'), PyJs_Object_2402_) + PyJs_Object_2409_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'string')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertOneOf'))(Js(u'var'), Js(u'let'), Js(u'const')))}) + PyJs_Object_2410_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'VariableDeclarator'))))}) + PyJs_Object_2408_ = Js({u'kind':PyJs_Object_2409_,u'declarations':PyJs_Object_2410_}) + PyJs_Object_2407_ = Js({u'builder':Js([Js(u'kind'), Js(u'declarations')]),u'visitor':Js([Js(u'declarations')]),u'aliases':Js([Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2408_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'VariableDeclaration'), PyJs_Object_2407_) + PyJs_Object_2413_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'LVal'))}) + PyJs_Object_2414_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2412_ = Js({u'id':PyJs_Object_2413_,u'init':PyJs_Object_2414_}) + PyJs_Object_2411_ = Js({u'visitor':Js([Js(u'id'), Js(u'init')]),u'fields':PyJs_Object_2412_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'VariableDeclarator'), PyJs_Object_2411_) + PyJs_Object_2417_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2418_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'), Js(u'Statement'))}) + PyJs_Object_2416_ = Js({u'test':PyJs_Object_2417_,u'body':PyJs_Object_2418_}) + PyJs_Object_2415_ = Js({u'visitor':Js([Js(u'test'), Js(u'body')]),u'aliases':Js([Js(u'Statement'), Js(u'BlockParent'), Js(u'Loop'), Js(u'While'), Js(u'Scopable')]),u'fields':PyJs_Object_2416_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'WhileStatement'), PyJs_Object_2415_) + PyJs_Object_2421_ = Js({u'object':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2422_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'), Js(u'Statement'))}) + PyJs_Object_2420_ = Js({u'object':PyJs_Object_2421_,u'body':PyJs_Object_2422_}) + PyJs_Object_2419_ = Js({u'visitor':Js([Js(u'object'), Js(u'body')]),u'aliases':Js([Js(u'Statement')]),u'fields':PyJs_Object_2420_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'WithStatement'), PyJs_Object_2419_) +PyJs_anonymous_2220_._set_name(u'anonymous') +PyJs_Object_2423_ = Js({u'../constants':Js(247.0),u'../index':Js(258.0),u'./index':Js(253.0)}) +@Js +def PyJs_anonymous_2424_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_index', u'require', u'module', u'_index2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2425_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2425_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + pass + PyJs_Object_2428_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2429_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2430_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2427_ = Js({u'left':PyJs_Object_2428_,u'right':PyJs_Object_2429_,u'decorators':PyJs_Object_2430_}) + PyJs_Object_2426_ = Js({u'visitor':Js([Js(u'left'), Js(u'right')]),u'aliases':Js([Js(u'Pattern'), Js(u'LVal')]),u'fields':PyJs_Object_2427_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'AssignmentPattern'), PyJs_Object_2426_) + PyJs_Object_2433_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))))}) + PyJs_Object_2434_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2432_ = Js({u'elements':PyJs_Object_2433_,u'decorators':PyJs_Object_2434_}) + PyJs_Object_2431_ = Js({u'visitor':Js([Js(u'elements'), Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Pattern'), Js(u'LVal')]),u'fields':PyJs_Object_2432_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ArrayPattern'), PyJs_Object_2431_) + PyJs_Object_2437_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'LVal'))))}) + PyJs_Object_2438_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'BlockStatement'), Js(u'Expression'))}) + PyJs_Object_2439_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean')),u'default':Js(False)}) + PyJs_Object_2436_ = Js({u'params':PyJs_Object_2437_,u'body':PyJs_Object_2438_,u'async':PyJs_Object_2439_}) + PyJs_Object_2435_ = Js({u'builder':Js([Js(u'params'), Js(u'body'), Js(u'async')]),u'visitor':Js([Js(u'params'), Js(u'body'), Js(u'returnType'), Js(u'typeParameters')]),u'aliases':Js([Js(u'Scopable'), Js(u'Function'), Js(u'BlockParent'), Js(u'FunctionParent'), Js(u'Expression'), Js(u'Pureish')]),u'fields':PyJs_Object_2436_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ArrowFunctionExpression'), PyJs_Object_2435_) + PyJs_Object_2442_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'ClassMethod'), Js(u'ClassProperty'))))}) + PyJs_Object_2441_ = Js({u'body':PyJs_Object_2442_}) + PyJs_Object_2440_ = Js({u'visitor':Js([Js(u'body')]),u'fields':PyJs_Object_2441_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ClassBody'), PyJs_Object_2440_) + PyJs_Object_2445_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2446_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'ClassBody'))}) + PyJs_Object_2447_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2448_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2444_ = Js({u'id':PyJs_Object_2445_,u'body':PyJs_Object_2446_,u'superClass':PyJs_Object_2447_,u'decorators':PyJs_Object_2448_}) + PyJs_Object_2443_ = Js({u'builder':Js([Js(u'id'), Js(u'superClass'), Js(u'body'), Js(u'decorators')]),u'visitor':Js([Js(u'id'), Js(u'body'), Js(u'superClass'), Js(u'mixins'), Js(u'typeParameters'), Js(u'superTypeParameters'), Js(u'implements'), Js(u'decorators')]),u'aliases':Js([Js(u'Scopable'), Js(u'Class'), Js(u'Statement'), Js(u'Declaration'), Js(u'Pureish')]),u'fields':PyJs_Object_2444_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ClassDeclaration'), PyJs_Object_2443_) + PyJs_Object_2451_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2452_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'ClassBody'))}) + PyJs_Object_2453_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2454_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2450_ = Js({u'id':PyJs_Object_2451_,u'body':PyJs_Object_2452_,u'superClass':PyJs_Object_2453_,u'decorators':PyJs_Object_2454_}) + PyJs_Object_2449_ = Js({u'inherits':Js(u'ClassDeclaration'),u'aliases':Js([Js(u'Scopable'), Js(u'Class'), Js(u'Expression'), Js(u'Pureish')]),u'fields':PyJs_Object_2450_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ClassExpression'), PyJs_Object_2449_) + PyJs_Object_2457_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'StringLiteral'))}) + PyJs_Object_2456_ = Js({u'source':PyJs_Object_2457_}) + PyJs_Object_2455_ = Js({u'visitor':Js([Js(u'source')]),u'aliases':Js([Js(u'Statement'), Js(u'Declaration'), Js(u'ModuleDeclaration'), Js(u'ExportDeclaration')]),u'fields':PyJs_Object_2456_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ExportAllDeclaration'), PyJs_Object_2455_) + PyJs_Object_2460_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'FunctionDeclaration'), Js(u'ClassDeclaration'), Js(u'Expression'))}) + PyJs_Object_2459_ = Js({u'declaration':PyJs_Object_2460_}) + PyJs_Object_2458_ = Js({u'visitor':Js([Js(u'declaration')]),u'aliases':Js([Js(u'Statement'), Js(u'Declaration'), Js(u'ModuleDeclaration'), Js(u'ExportDeclaration')]),u'fields':PyJs_Object_2459_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ExportDefaultDeclaration'), PyJs_Object_2458_) + PyJs_Object_2463_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Declaration')),u'optional':var.get(u'true')}) + PyJs_Object_2464_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'ExportSpecifier'))))}) + PyJs_Object_2465_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'StringLiteral')),u'optional':var.get(u'true')}) + PyJs_Object_2462_ = Js({u'declaration':PyJs_Object_2463_,u'specifiers':PyJs_Object_2464_,u'source':PyJs_Object_2465_}) + PyJs_Object_2461_ = Js({u'visitor':Js([Js(u'declaration'), Js(u'specifiers'), Js(u'source')]),u'aliases':Js([Js(u'Statement'), Js(u'Declaration'), Js(u'ModuleDeclaration'), Js(u'ExportDeclaration')]),u'fields':PyJs_Object_2462_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ExportNamedDeclaration'), PyJs_Object_2461_) + PyJs_Object_2468_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2469_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2467_ = Js({u'local':PyJs_Object_2468_,u'exported':PyJs_Object_2469_}) + PyJs_Object_2466_ = Js({u'visitor':Js([Js(u'local'), Js(u'exported')]),u'aliases':Js([Js(u'ModuleSpecifier')]),u'fields':PyJs_Object_2467_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ExportSpecifier'), PyJs_Object_2466_) + PyJs_Object_2472_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'VariableDeclaration'), Js(u'LVal'))}) + PyJs_Object_2473_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2474_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2471_ = Js({u'left':PyJs_Object_2472_,u'right':PyJs_Object_2473_,u'body':PyJs_Object_2474_}) + PyJs_Object_2470_ = Js({u'visitor':Js([Js(u'left'), Js(u'right'), Js(u'body')]),u'aliases':Js([Js(u'Scopable'), Js(u'Statement'), Js(u'For'), Js(u'BlockParent'), Js(u'Loop'), Js(u'ForXStatement')]),u'fields':PyJs_Object_2471_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ForOfStatement'), PyJs_Object_2470_) + PyJs_Object_2477_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'ImportSpecifier'), Js(u'ImportDefaultSpecifier'), Js(u'ImportNamespaceSpecifier'))))}) + PyJs_Object_2478_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'StringLiteral'))}) + PyJs_Object_2476_ = Js({u'specifiers':PyJs_Object_2477_,u'source':PyJs_Object_2478_}) + PyJs_Object_2475_ = Js({u'visitor':Js([Js(u'specifiers'), Js(u'source')]),u'aliases':Js([Js(u'Statement'), Js(u'Declaration'), Js(u'ModuleDeclaration')]),u'fields':PyJs_Object_2476_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ImportDeclaration'), PyJs_Object_2475_) + PyJs_Object_2481_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2480_ = Js({u'local':PyJs_Object_2481_}) + PyJs_Object_2479_ = Js({u'visitor':Js([Js(u'local')]),u'aliases':Js([Js(u'ModuleSpecifier')]),u'fields':PyJs_Object_2480_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ImportDefaultSpecifier'), PyJs_Object_2479_) + PyJs_Object_2484_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2483_ = Js({u'local':PyJs_Object_2484_}) + PyJs_Object_2482_ = Js({u'visitor':Js([Js(u'local')]),u'aliases':Js([Js(u'ModuleSpecifier')]),u'fields':PyJs_Object_2483_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ImportNamespaceSpecifier'), PyJs_Object_2482_) + PyJs_Object_2487_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2488_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2486_ = Js({u'local':PyJs_Object_2487_,u'imported':PyJs_Object_2488_}) + PyJs_Object_2485_ = Js({u'visitor':Js([Js(u'local'), Js(u'imported')]),u'aliases':Js([Js(u'ModuleSpecifier')]),u'fields':PyJs_Object_2486_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ImportSpecifier'), PyJs_Object_2485_) + PyJs_Object_2491_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'string'))}) + PyJs_Object_2492_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'string'))}) + PyJs_Object_2490_ = Js({u'meta':PyJs_Object_2491_,u'property':PyJs_Object_2492_}) + PyJs_Object_2489_ = Js({u'visitor':Js([Js(u'meta'), Js(u'property')]),u'aliases':Js([Js(u'Expression')]),u'fields':PyJs_Object_2490_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'MetaProperty'), PyJs_Object_2489_) + PyJs_Object_2495_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'string')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertOneOf'))(Js(u'get'), Js(u'set'), Js(u'method'), Js(u'constructor'))),u'default':Js(u'method')}) + PyJs_Object_2496_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2497_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean'))}) + @Js + def PyJs_validate_2499_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'val':val, u'this':this, u'arguments':arguments, u'key':key, u'validate':PyJs_validate_2499_}, var) + var.registers([u'node', u'val', u'key', u'expectedTypes']) + var.put(u'expectedTypes', (Js([Js(u'Expression')]) if var.get(u'node').get(u'computed') else Js([Js(u'Identifier'), Js(u'StringLiteral'), Js(u'NumericLiteral')]))) + var.get(u'_index').get(u'assertNodeType').callprop(u'apply', var.get(u'undefined'), var.get(u'expectedTypes'))(var.get(u'node'), var.get(u'key'), var.get(u'val')) + PyJs_validate_2499_._set_name(u'validate') + PyJs_Object_2498_ = Js({u'validate':PyJs_validate_2499_}) + PyJs_Object_2500_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'LVal'))))}) + PyJs_Object_2501_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2502_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2503_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2494_ = Js({u'kind':PyJs_Object_2495_,u'computed':PyJs_Object_2496_,u'static':PyJs_Object_2497_,u'key':PyJs_Object_2498_,u'params':PyJs_Object_2500_,u'body':PyJs_Object_2501_,u'generator':PyJs_Object_2502_,u'async':PyJs_Object_2503_}) + PyJs_Object_2493_ = Js({u'aliases':Js([Js(u'Function'), Js(u'Scopable'), Js(u'BlockParent'), Js(u'FunctionParent'), Js(u'Method')]),u'builder':Js([Js(u'kind'), Js(u'key'), Js(u'params'), Js(u'body'), Js(u'computed'), Js(u'static')]),u'visitor':Js([Js(u'key'), Js(u'params'), Js(u'body'), Js(u'decorators'), Js(u'returnType'), Js(u'typeParameters')]),u'fields':PyJs_Object_2494_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ClassMethod'), PyJs_Object_2493_) + PyJs_Object_2506_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'RestProperty'), Js(u'Property'))))}) + PyJs_Object_2507_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2505_ = Js({u'properties':PyJs_Object_2506_,u'decorators':PyJs_Object_2507_}) + PyJs_Object_2504_ = Js({u'visitor':Js([Js(u'properties'), Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Pattern'), Js(u'LVal')]),u'fields':PyJs_Object_2505_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ObjectPattern'), PyJs_Object_2504_) + PyJs_Object_2510_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2509_ = Js({u'argument':PyJs_Object_2510_}) + PyJs_Object_2508_ = Js({u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'UnaryLike')]),u'fields':PyJs_Object_2509_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'SpreadElement'), PyJs_Object_2508_) + PyJs_Object_2511_ = Js({u'aliases':Js([Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'Super'), PyJs_Object_2511_) + PyJs_Object_2514_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2515_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'TemplateLiteral'))}) + PyJs_Object_2513_ = Js({u'tag':PyJs_Object_2514_,u'quasi':PyJs_Object_2515_}) + PyJs_Object_2512_ = Js({u'visitor':Js([Js(u'tag'), Js(u'quasi')]),u'aliases':Js([Js(u'Expression')]),u'fields':PyJs_Object_2513_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TaggedTemplateExpression'), PyJs_Object_2512_) + PyJs_Object_2518_ = Js({}) + PyJs_Object_2519_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean')),u'default':Js(False)}) + PyJs_Object_2517_ = Js({u'value':PyJs_Object_2518_,u'tail':PyJs_Object_2519_}) + PyJs_Object_2516_ = Js({u'builder':Js([Js(u'value'), Js(u'tail')]),u'fields':PyJs_Object_2517_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TemplateElement'), PyJs_Object_2516_) + PyJs_Object_2522_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'TemplateElement'))))}) + PyJs_Object_2523_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))))}) + PyJs_Object_2521_ = Js({u'quasis':PyJs_Object_2522_,u'expressions':PyJs_Object_2523_}) + PyJs_Object_2520_ = Js({u'visitor':Js([Js(u'quasis'), Js(u'expressions')]),u'aliases':Js([Js(u'Expression'), Js(u'Literal')]),u'fields':PyJs_Object_2521_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TemplateLiteral'), PyJs_Object_2520_) + PyJs_Object_2526_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean')),u'default':Js(False)}) + PyJs_Object_2527_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2525_ = Js({u'delegate':PyJs_Object_2526_,u'argument':PyJs_Object_2527_}) + PyJs_Object_2524_ = Js({u'builder':Js([Js(u'argument'), Js(u'delegate')]),u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'Expression'), Js(u'Terminatorless')]),u'fields':PyJs_Object_2525_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'YieldExpression'), PyJs_Object_2524_) +PyJs_anonymous_2424_._set_name(u'anonymous') +PyJs_Object_2528_ = Js({u'./index':Js(253.0)}) +@Js +def PyJs_anonymous_2529_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_index', u'require', u'module', u'_index2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2530_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2530_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + pass + PyJs_Object_2533_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2532_ = Js({u'argument':PyJs_Object_2533_}) + PyJs_Object_2531_ = Js({u'builder':Js([Js(u'argument')]),u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'Expression'), Js(u'Terminatorless')]),u'fields':PyJs_Object_2532_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'AwaitExpression'), PyJs_Object_2531_) + PyJs_Object_2536_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'VariableDeclaration'), Js(u'LVal'))}) + PyJs_Object_2537_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2538_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2535_ = Js({u'left':PyJs_Object_2536_,u'right':PyJs_Object_2537_,u'body':PyJs_Object_2538_}) + PyJs_Object_2534_ = Js({u'visitor':Js([Js(u'left'), Js(u'right'), Js(u'body')]),u'aliases':Js([Js(u'Scopable'), Js(u'Statement'), Js(u'For'), Js(u'BlockParent'), Js(u'Loop'), Js(u'ForXStatement')]),u'fields':PyJs_Object_2535_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ForAwaitStatement'), PyJs_Object_2534_) + PyJs_Object_2540_ = Js({}) + PyJs_Object_2539_ = Js({u'visitor':Js([Js(u'object'), Js(u'callee')]),u'aliases':Js([Js(u'Expression')]),u'fields':PyJs_Object_2540_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'BindExpression'), PyJs_Object_2539_) + PyJs_Object_2543_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2542_ = Js({u'expression':PyJs_Object_2543_}) + PyJs_Object_2541_ = Js({u'visitor':Js([Js(u'expression')]),u'fields':PyJs_Object_2542_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'Decorator'), PyJs_Object_2541_) + PyJs_Object_2546_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2545_ = Js({u'body':PyJs_Object_2546_}) + PyJs_Object_2544_ = Js({u'visitor':Js([Js(u'body')]),u'aliases':Js([Js(u'Expression')]),u'fields':PyJs_Object_2545_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DoExpression'), PyJs_Object_2544_) + PyJs_Object_2549_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2548_ = Js({u'exported':PyJs_Object_2549_}) + PyJs_Object_2547_ = Js({u'visitor':Js([Js(u'exported')]),u'aliases':Js([Js(u'ModuleSpecifier')]),u'fields':PyJs_Object_2548_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ExportDefaultSpecifier'), PyJs_Object_2547_) + PyJs_Object_2552_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2551_ = Js({u'exported':PyJs_Object_2552_}) + PyJs_Object_2550_ = Js({u'visitor':Js([Js(u'exported')]),u'aliases':Js([Js(u'ModuleSpecifier')]),u'fields':PyJs_Object_2551_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ExportNamespaceSpecifier'), PyJs_Object_2550_) + PyJs_Object_2555_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'LVal'))}) + PyJs_Object_2554_ = Js({u'argument':PyJs_Object_2555_}) + PyJs_Object_2553_ = Js({u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'UnaryLike')]),u'fields':PyJs_Object_2554_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'RestProperty'), PyJs_Object_2553_) + PyJs_Object_2558_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2557_ = Js({u'argument':PyJs_Object_2558_}) + PyJs_Object_2556_ = Js({u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'UnaryLike')]),u'fields':PyJs_Object_2557_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'SpreadProperty'), PyJs_Object_2556_) +PyJs_anonymous_2529_._set_name(u'anonymous') +PyJs_Object_2559_ = Js({u'./index':Js(253.0)}) +@Js +def PyJs_anonymous_2560_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_index', u'require', u'module', u'_index2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2561_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2561_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + pass + PyJs_Object_2563_ = Js({}) + PyJs_Object_2562_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')]),u'fields':PyJs_Object_2563_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'AnyTypeAnnotation'), PyJs_Object_2562_) + PyJs_Object_2565_ = Js({}) + PyJs_Object_2564_ = Js({u'visitor':Js([Js(u'elementType')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2565_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ArrayTypeAnnotation'), PyJs_Object_2564_) + PyJs_Object_2567_ = Js({}) + PyJs_Object_2566_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')]),u'fields':PyJs_Object_2567_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'BooleanTypeAnnotation'), PyJs_Object_2566_) + PyJs_Object_2569_ = Js({}) + PyJs_Object_2568_ = Js({u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2569_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'BooleanLiteralTypeAnnotation'), PyJs_Object_2568_) + PyJs_Object_2571_ = Js({}) + PyJs_Object_2570_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')]),u'fields':PyJs_Object_2571_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'NullLiteralTypeAnnotation'), PyJs_Object_2570_) + PyJs_Object_2573_ = Js({}) + PyJs_Object_2572_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2573_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ClassImplements'), PyJs_Object_2572_) + PyJs_Object_2576_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean')),u'default':Js(False)}) + PyJs_Object_2575_ = Js({u'computed':PyJs_Object_2576_}) + PyJs_Object_2574_ = Js({u'visitor':Js([Js(u'key'), Js(u'value'), Js(u'typeAnnotation'), Js(u'decorators')]),u'builder':Js([Js(u'key'), Js(u'value'), Js(u'typeAnnotation'), Js(u'decorators'), Js(u'computed')]),u'aliases':Js([Js(u'Property')]),u'fields':PyJs_Object_2575_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ClassProperty'), PyJs_Object_2574_) + PyJs_Object_2578_ = Js({}) + PyJs_Object_2577_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters'), Js(u'extends'), Js(u'body')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2578_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DeclareClass'), PyJs_Object_2577_) + PyJs_Object_2580_ = Js({}) + PyJs_Object_2579_ = Js({u'visitor':Js([Js(u'id')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2580_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DeclareFunction'), PyJs_Object_2579_) + PyJs_Object_2582_ = Js({}) + PyJs_Object_2581_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters'), Js(u'extends'), Js(u'body')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2582_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DeclareInterface'), PyJs_Object_2581_) + PyJs_Object_2584_ = Js({}) + PyJs_Object_2583_ = Js({u'visitor':Js([Js(u'id'), Js(u'body')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2584_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DeclareModule'), PyJs_Object_2583_) + PyJs_Object_2586_ = Js({}) + PyJs_Object_2585_ = Js({u'visitor':Js([Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2586_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DeclareModuleExports'), PyJs_Object_2585_) + PyJs_Object_2588_ = Js({}) + PyJs_Object_2587_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters'), Js(u'right')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2588_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DeclareTypeAlias'), PyJs_Object_2587_) + PyJs_Object_2590_ = Js({}) + PyJs_Object_2589_ = Js({u'visitor':Js([Js(u'id')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2590_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DeclareVariable'), PyJs_Object_2589_) + PyJs_Object_2591_ = Js({u'aliases':Js([Js(u'Flow')])}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ExistentialTypeParam'), PyJs_Object_2591_) + PyJs_Object_2593_ = Js({}) + PyJs_Object_2592_ = Js({u'visitor':Js([Js(u'typeParameters'), Js(u'params'), Js(u'rest'), Js(u'returnType')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2593_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'FunctionTypeAnnotation'), PyJs_Object_2592_) + PyJs_Object_2595_ = Js({}) + PyJs_Object_2594_ = Js({u'visitor':Js([Js(u'name'), Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2595_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'FunctionTypeParam'), PyJs_Object_2594_) + PyJs_Object_2597_ = Js({}) + PyJs_Object_2596_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2597_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'GenericTypeAnnotation'), PyJs_Object_2596_) + PyJs_Object_2599_ = Js({}) + PyJs_Object_2598_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2599_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'InterfaceExtends'), PyJs_Object_2598_) + PyJs_Object_2601_ = Js({}) + PyJs_Object_2600_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters'), Js(u'extends'), Js(u'body')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2601_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'InterfaceDeclaration'), PyJs_Object_2600_) + PyJs_Object_2603_ = Js({}) + PyJs_Object_2602_ = Js({u'visitor':Js([Js(u'types')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2603_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'IntersectionTypeAnnotation'), PyJs_Object_2602_) + PyJs_Object_2604_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')])}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'MixedTypeAnnotation'), PyJs_Object_2604_) + PyJs_Object_2605_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')])}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'EmptyTypeAnnotation'), PyJs_Object_2605_) + PyJs_Object_2607_ = Js({}) + PyJs_Object_2606_ = Js({u'visitor':Js([Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2607_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'NullableTypeAnnotation'), PyJs_Object_2606_) + PyJs_Object_2609_ = Js({}) + PyJs_Object_2608_ = Js({u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2609_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'NumericLiteralTypeAnnotation'), PyJs_Object_2608_) + PyJs_Object_2611_ = Js({}) + PyJs_Object_2610_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')]),u'fields':PyJs_Object_2611_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'NumberTypeAnnotation'), PyJs_Object_2610_) + PyJs_Object_2613_ = Js({}) + PyJs_Object_2612_ = Js({u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2613_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'StringLiteralTypeAnnotation'), PyJs_Object_2612_) + PyJs_Object_2615_ = Js({}) + PyJs_Object_2614_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')]),u'fields':PyJs_Object_2615_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'StringTypeAnnotation'), PyJs_Object_2614_) + PyJs_Object_2617_ = Js({}) + PyJs_Object_2616_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')]),u'fields':PyJs_Object_2617_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ThisTypeAnnotation'), PyJs_Object_2616_) + PyJs_Object_2619_ = Js({}) + PyJs_Object_2618_ = Js({u'visitor':Js([Js(u'types')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2619_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TupleTypeAnnotation'), PyJs_Object_2618_) + PyJs_Object_2621_ = Js({}) + PyJs_Object_2620_ = Js({u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2621_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TypeofTypeAnnotation'), PyJs_Object_2620_) + PyJs_Object_2623_ = Js({}) + PyJs_Object_2622_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters'), Js(u'right')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2623_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TypeAlias'), PyJs_Object_2622_) + PyJs_Object_2625_ = Js({}) + PyJs_Object_2624_ = Js({u'visitor':Js([Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2625_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TypeAnnotation'), PyJs_Object_2624_) + PyJs_Object_2627_ = Js({}) + PyJs_Object_2626_ = Js({u'visitor':Js([Js(u'expression'), Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Flow'), Js(u'ExpressionWrapper'), Js(u'Expression')]),u'fields':PyJs_Object_2627_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TypeCastExpression'), PyJs_Object_2626_) + PyJs_Object_2629_ = Js({}) + PyJs_Object_2628_ = Js({u'visitor':Js([Js(u'bound')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2629_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TypeParameter'), PyJs_Object_2628_) + PyJs_Object_2631_ = Js({}) + PyJs_Object_2630_ = Js({u'visitor':Js([Js(u'params')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2631_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TypeParameterDeclaration'), PyJs_Object_2630_) + PyJs_Object_2633_ = Js({}) + PyJs_Object_2632_ = Js({u'visitor':Js([Js(u'params')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2633_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TypeParameterInstantiation'), PyJs_Object_2632_) + PyJs_Object_2635_ = Js({}) + PyJs_Object_2634_ = Js({u'visitor':Js([Js(u'properties'), Js(u'indexers'), Js(u'callProperties')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2635_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ObjectTypeAnnotation'), PyJs_Object_2634_) + PyJs_Object_2637_ = Js({}) + PyJs_Object_2636_ = Js({u'visitor':Js([Js(u'value')]),u'aliases':Js([Js(u'Flow'), Js(u'UserWhitespacable')]),u'fields':PyJs_Object_2637_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ObjectTypeCallProperty'), PyJs_Object_2636_) + PyJs_Object_2639_ = Js({}) + PyJs_Object_2638_ = Js({u'visitor':Js([Js(u'id'), Js(u'key'), Js(u'value')]),u'aliases':Js([Js(u'Flow'), Js(u'UserWhitespacable')]),u'fields':PyJs_Object_2639_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ObjectTypeIndexer'), PyJs_Object_2638_) + PyJs_Object_2641_ = Js({}) + PyJs_Object_2640_ = Js({u'visitor':Js([Js(u'key'), Js(u'value')]),u'aliases':Js([Js(u'Flow'), Js(u'UserWhitespacable')]),u'fields':PyJs_Object_2641_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ObjectTypeProperty'), PyJs_Object_2640_) + PyJs_Object_2643_ = Js({}) + PyJs_Object_2642_ = Js({u'visitor':Js([Js(u'id'), Js(u'qualification')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2643_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'QualifiedTypeIdentifier'), PyJs_Object_2642_) + PyJs_Object_2645_ = Js({}) + PyJs_Object_2644_ = Js({u'visitor':Js([Js(u'types')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2645_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'UnionTypeAnnotation'), PyJs_Object_2644_) + PyJs_Object_2647_ = Js({}) + PyJs_Object_2646_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')]),u'fields':PyJs_Object_2647_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'VoidTypeAnnotation'), PyJs_Object_2646_) +PyJs_anonymous_2560_._set_name(u'anonymous') +PyJs_Object_2648_ = Js({u'./index':Js(253.0)}) +@Js +def PyJs_anonymous_2649_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'chain', u'BUILDER_KEYS', u'defineType', u'assertNodeOrValueType', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'assertEach', u'_typeof2', u'_typeof3', u'VISITOR_KEYS', u'NODE_FIELDS', u'assertOneOf', u'store', u'DEPRECATED_KEYS', u'exports', u'_stringify2', u'assertNodeType', u'_interopRequireWildcard', u'ALIAS_KEYS', u'getType', u'_index', u'require', u'assertValueType', u'_stringify', u't']) + @Js + def PyJsHoisted_assertNodeType_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'validate', u'_len2', u'types', u'_key2']) + @Js + def PyJsHoisted_validate_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'key', u'val', u'valid', u'_i', u'_ref', u'type']) + var.put(u'valid', Js(False)) + #for JS loop + var.put(u'_iterator', var.get(u'types')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'type', var.get(u'_ref')) + if var.get(u't').callprop(u'is', var.get(u'type'), var.get(u'val')): + var.put(u'valid', var.get(u'true')) + break + + if var.get(u'valid').neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((((((((Js(u'Property ')+var.get(u'key'))+Js(u' of '))+var.get(u'node').get(u'type'))+Js(u' expected node to be of a type '))+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'types')))+Js(u' '))+(Js(u'but instead got ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))((var.get(u'val') and var.get(u'val').get(u'type'))))))) + raise PyJsTempException + PyJsHoisted_validate_.func_name = u'validate' + var.put(u'validate', PyJsHoisted_validate_) + #for JS loop + var.put(u'_len2', var.get(u'arguments').get(u'length')) + var.put(u'types', var.get(u'Array')(var.get(u'_len2'))) + var.put(u'_key2', Js(0.0)) + while (var.get(u'_key2')<var.get(u'_len2')): + try: + var.get(u'types').put(var.get(u'_key2'), var.get(u'arguments').get(var.get(u'_key2'))) + finally: + (var.put(u'_key2',Js(var.get(u'_key2').to_number())+Js(1))-Js(1)) + pass + var.get(u'validate').put(u'oneOfNodeTypes', var.get(u'types')) + return var.get(u'validate') + PyJsHoisted_assertNodeType_.func_name = u'assertNodeType' + var.put(u'assertNodeType', PyJsHoisted_assertNodeType_) + @Js + def PyJsHoisted_chain_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'validate', u'fns', u'_len4', u'_key4']) + @Js + def PyJsHoisted_validate_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'fn', u'_i3', u'_isArray3', u'_ref3', u'_iterator3']) + #for JS loop + var.put(u'_iterator3', var.get(u'fns')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'fn', var.get(u'_ref3')) + var.get(u'fn').callprop(u'apply', var.get(u'undefined'), var.get(u'arguments')) + + PyJsHoisted_validate_.func_name = u'validate' + var.put(u'validate', PyJsHoisted_validate_) + #for JS loop + var.put(u'_len4', var.get(u'arguments').get(u'length')) + var.put(u'fns', var.get(u'Array')(var.get(u'_len4'))) + var.put(u'_key4', Js(0.0)) + while (var.get(u'_key4')<var.get(u'_len4')): + try: + var.get(u'fns').put(var.get(u'_key4'), var.get(u'arguments').get(var.get(u'_key4'))) + finally: + (var.put(u'_key4',Js(var.get(u'_key4').to_number())+Js(1))-Js(1)) + pass + var.get(u'validate').put(u'chainOf', var.get(u'fns')) + return var.get(u'validate') + PyJsHoisted_chain_.func_name = u'chain' + var.put(u'chain', PyJsHoisted_chain_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2650_ = Js({}) + var.put(u'newObj', PyJs_Object_2650_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_getType_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + if var.get(u'Array').callprop(u'isArray', var.get(u'val')): + return Js(u'array') + else: + if PyJsStrictEq(var.get(u'val'),var.get(u"null")): + return Js(u'null') + else: + if PyJsStrictEq(var.get(u'val'),var.get(u'undefined')): + return Js(u'undefined') + else: + return (Js(u'undefined') if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'val'))) + PyJsHoisted_getType_.func_name = u'getType' + var.put(u'getType', PyJsHoisted_getType_) + @Js + def PyJsHoisted_assertNodeOrValueType_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'validate', u'_len3', u'_key3', u'types']) + @Js + def PyJsHoisted_validate_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray2', u'val', u'_ref2', u'_i2', u'valid', u'key', u'type', u'_iterator2']) + var.put(u'valid', Js(False)) + #for JS loop + var.put(u'_iterator2', var.get(u'types')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'type', var.get(u'_ref2')) + if (PyJsStrictEq(var.get(u'getType')(var.get(u'val')),var.get(u'type')) or var.get(u't').callprop(u'is', var.get(u'type'), var.get(u'val'))): + var.put(u'valid', var.get(u'true')) + break + + if var.get(u'valid').neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((((((((Js(u'Property ')+var.get(u'key'))+Js(u' of '))+var.get(u'node').get(u'type'))+Js(u' expected node to be of a type '))+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'types')))+Js(u' '))+(Js(u'but instead got ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))((var.get(u'val') and var.get(u'val').get(u'type'))))))) + raise PyJsTempException + PyJsHoisted_validate_.func_name = u'validate' + var.put(u'validate', PyJsHoisted_validate_) + #for JS loop + var.put(u'_len3', var.get(u'arguments').get(u'length')) + var.put(u'types', var.get(u'Array')(var.get(u'_len3'))) + var.put(u'_key3', Js(0.0)) + while (var.get(u'_key3')<var.get(u'_len3')): + try: + var.get(u'types').put(var.get(u'_key3'), var.get(u'arguments').get(var.get(u'_key3'))) + finally: + (var.put(u'_key3',Js(var.get(u'_key3').to_number())+Js(1))-Js(1)) + pass + var.get(u'validate').put(u'oneOfNodeOrValueTypes', var.get(u'types')) + return var.get(u'validate') + PyJsHoisted_assertNodeOrValueType_.func_name = u'assertNodeOrValueType' + var.put(u'assertNodeOrValueType', PyJsHoisted_assertNodeOrValueType_) + @Js + def PyJsHoisted_assertValueType_(type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments}, var) + var.registers([u'validate', u'type']) + @Js + def PyJsHoisted_validate_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'node', u'valid', u'val', u'key']) + var.put(u'valid', PyJsStrictEq(var.get(u'getType')(var.get(u'val')),var.get(u'type'))) + if var.get(u'valid').neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((((((Js(u'Property ')+var.get(u'key'))+Js(u' expected type of '))+var.get(u'type'))+Js(u' but got '))+var.get(u'getType')(var.get(u'val'))))) + raise PyJsTempException + PyJsHoisted_validate_.func_name = u'validate' + var.put(u'validate', PyJsHoisted_validate_) + pass + var.get(u'validate').put(u'type', var.get(u'type')) + return var.get(u'validate') + PyJsHoisted_assertValueType_.func_name = u'assertValueType' + var.put(u'assertValueType', PyJsHoisted_assertValueType_) + @Js + def PyJsHoisted_assertOneOf_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_len', u'vals', u'validate', u'_key']) + @Js + def PyJsHoisted_validate_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'node', u'val', u'key']) + if (var.get(u'vals').callprop(u'indexOf', var.get(u'val'))<Js(0.0)): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((((((Js(u'Property ')+var.get(u'key'))+Js(u' expected value to be one of '))+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'vals')))+Js(u' but got '))+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'val'))))) + raise PyJsTempException + PyJsHoisted_validate_.func_name = u'validate' + var.put(u'validate', PyJsHoisted_validate_) + #for JS loop + var.put(u'_len', var.get(u'arguments').get(u'length')) + var.put(u'vals', var.get(u'Array')(var.get(u'_len'))) + var.put(u'_key', Js(0.0)) + while (var.get(u'_key')<var.get(u'_len')): + try: + var.get(u'vals').put(var.get(u'_key'), var.get(u'arguments').get(var.get(u'_key'))) + finally: + (var.put(u'_key',Js(var.get(u'_key').to_number())+Js(1))-Js(1)) + pass + var.get(u'validate').put(u'oneOf', var.get(u'vals')) + return var.get(u'validate') + PyJsHoisted_assertOneOf_.func_name = u'assertOneOf' + var.put(u'assertOneOf', PyJsHoisted_assertOneOf_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2651_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2651_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_defineType_(type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments}, var) + var.registers([u'inherits', u'_isArray4', u'_i4', u'field', u'_key5', u'key', u'_iterator4', u'type', u'opts', u'_ref4']) + PyJs_Object_2657_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_2657_)) + PyJs_Object_2658_ = Js({}) + var.put(u'inherits', ((var.get(u'opts').get(u'inherits') and var.get(u'store').get(var.get(u'opts').get(u'inherits'))) or PyJs_Object_2658_)) + PyJs_Object_2659_ = Js({}) + var.get(u'opts').put(u'fields', ((var.get(u'opts').get(u'fields') or var.get(u'inherits').get(u'fields')) or PyJs_Object_2659_)) + var.get(u'opts').put(u'visitor', ((var.get(u'opts').get(u'visitor') or var.get(u'inherits').get(u'visitor')) or Js([]))) + var.get(u'opts').put(u'aliases', ((var.get(u'opts').get(u'aliases') or var.get(u'inherits').get(u'aliases')) or Js([]))) + var.get(u'opts').put(u'builder', (((var.get(u'opts').get(u'builder') or var.get(u'inherits').get(u'builder')) or var.get(u'opts').get(u'visitor')) or Js([]))) + if var.get(u'opts').get(u'deprecatedAlias'): + var.get(u'DEPRECATED_KEYS').put(var.get(u'opts').get(u'deprecatedAlias'), var.get(u'type')) + #for JS loop + var.put(u'_iterator4', var.get(u'opts').get(u'visitor').callprop(u'concat', var.get(u'opts').get(u'builder'))) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i4').get(u'value')) + var.put(u'_key5', var.get(u'_ref4')) + PyJs_Object_2660_ = Js({}) + var.get(u'opts').get(u'fields').put(var.get(u'_key5'), (var.get(u'opts').get(u'fields').get(var.get(u'_key5')) or PyJs_Object_2660_)) + + for PyJsTemp in var.get(u'opts').get(u'fields'): + var.put(u'key', PyJsTemp) + var.put(u'field', var.get(u'opts').get(u'fields').get(var.get(u'key'))) + if PyJsStrictEq(var.get(u'opts').get(u'builder').callprop(u'indexOf', var.get(u'key')),(-Js(1.0))): + var.get(u'field').put(u'optional', var.get(u'true')) + if PyJsStrictEq(var.get(u'field').get(u'default'),var.get(u'undefined')): + var.get(u'field').put(u'default', var.get(u"null")) + else: + if var.get(u'field').get(u'validate').neg(): + var.get(u'field').put(u'validate', var.get(u'assertValueType')(var.get(u'getType')(var.get(u'field').get(u'default')))) + var.get(u'VISITOR_KEYS').put(var.get(u'type'), var.get(u'opts').get(u'visitor')) + var.get(u'BUILDER_KEYS').put(var.get(u'type'), var.get(u'opts').get(u'builder')) + var.get(u'NODE_FIELDS').put(var.get(u'type'), var.get(u'opts').get(u'fields')) + var.get(u'ALIAS_KEYS').put(var.get(u'type'), var.get(u'opts').get(u'aliases')) + var.get(u'store').put(var.get(u'type'), var.get(u'opts')) + PyJsHoisted_defineType_.func_name = u'defineType' + var.put(u'defineType', PyJsHoisted_defineType_) + @Js + def PyJsHoisted_assertEach_(callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'arguments':arguments}, var) + var.registers([u'callback', u'validator']) + @Js + def PyJsHoisted_validator_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'i', u'node', u'val', u'key']) + if var.get(u'Array').callprop(u'isArray', var.get(u'val')).neg(): + return var.get('undefined') + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'val').get(u'length')): + try: + var.get(u'callback')(var.get(u'node'), (((var.get(u'key')+Js(u'['))+var.get(u'i'))+Js(u']')), var.get(u'val').get(var.get(u'i'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJsHoisted_validator_.func_name = u'validator' + var.put(u'validator', PyJsHoisted_validator_) + pass + var.get(u'validator').put(u'each', var.get(u'callback')) + return var.get(u'validator') + PyJsHoisted_assertEach_.func_name = u'assertEach' + var.put(u'assertEach', PyJsHoisted_assertEach_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'DEPRECATED_KEYS', var.get(u'exports').put(u'BUILDER_KEYS', var.get(u'exports').put(u'NODE_FIELDS', var.get(u'exports').put(u'ALIAS_KEYS', var.get(u'exports').put(u'VISITOR_KEYS', var.get(u'undefined')))))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_stringify', var.get(u'require')(Js(u'babel-runtime/core-js/json/stringify'))) + var.put(u'_stringify2', var.get(u'_interopRequireDefault')(var.get(u'_stringify'))) + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + var.get(u'exports').put(u'assertEach', var.get(u'assertEach')) + var.get(u'exports').put(u'assertOneOf', var.get(u'assertOneOf')) + var.get(u'exports').put(u'assertNodeType', var.get(u'assertNodeType')) + var.get(u'exports').put(u'assertNodeOrValueType', var.get(u'assertNodeOrValueType')) + var.get(u'exports').put(u'assertValueType', var.get(u'assertValueType')) + var.get(u'exports').put(u'chain', var.get(u'chain')) + var.get(u'exports').put(u'default', var.get(u'defineType')) + var.put(u'_index', var.get(u'require')(Js(u'../index'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_index'))) + pass + pass + PyJs_Object_2652_ = Js({}) + var.put(u'VISITOR_KEYS', var.get(u'exports').put(u'VISITOR_KEYS', PyJs_Object_2652_)) + PyJs_Object_2653_ = Js({}) + var.put(u'ALIAS_KEYS', var.get(u'exports').put(u'ALIAS_KEYS', PyJs_Object_2653_)) + PyJs_Object_2654_ = Js({}) + var.put(u'NODE_FIELDS', var.get(u'exports').put(u'NODE_FIELDS', PyJs_Object_2654_)) + PyJs_Object_2655_ = Js({}) + var.put(u'BUILDER_KEYS', var.get(u'exports').put(u'BUILDER_KEYS', PyJs_Object_2655_)) + PyJs_Object_2656_ = Js({}) + var.put(u'DEPRECATED_KEYS', var.get(u'exports').put(u'DEPRECATED_KEYS', PyJs_Object_2656_)) + pass + pass + pass + pass + pass + pass + pass + pass + PyJs_Object_2661_ = Js({}) + var.put(u'store', PyJs_Object_2661_) +PyJs_anonymous_2649_._set_name(u'anonymous') +PyJs_Object_2662_ = Js({u'../index':Js(258.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/json/stringify':Js(97.0),u'babel-runtime/helpers/typeof':Js(114.0)}) +@Js +def PyJs_anonymous_2663_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'require')(Js(u'./index')) + var.get(u'require')(Js(u'./core')) + var.get(u'require')(Js(u'./es2015')) + var.get(u'require')(Js(u'./flow')) + var.get(u'require')(Js(u'./jsx')) + var.get(u'require')(Js(u'./misc')) + var.get(u'require')(Js(u'./experimental')) +PyJs_anonymous_2663_._set_name(u'anonymous') +PyJs_Object_2664_ = Js({u'./core':Js(249.0),u'./es2015':Js(250.0),u'./experimental':Js(251.0),u'./flow':Js(252.0),u'./index':Js(253.0),u'./jsx':Js(255.0),u'./misc':Js(256.0)}) +@Js +def PyJs_anonymous_2665_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_index', u'require', u'module', u'_index2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2666_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2666_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + pass + PyJs_Object_2669_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'JSXIdentifier'), Js(u'JSXNamespacedName'))}) + PyJs_Object_2670_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'JSXElement'), Js(u'StringLiteral'), Js(u'JSXExpressionContainer'))}) + PyJs_Object_2668_ = Js({u'name':PyJs_Object_2669_,u'value':PyJs_Object_2670_}) + PyJs_Object_2667_ = Js({u'visitor':Js([Js(u'name'), Js(u'value')]),u'aliases':Js([Js(u'JSX'), Js(u'Immutable')]),u'fields':PyJs_Object_2668_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'JSXAttribute'), PyJs_Object_2667_) + PyJs_Object_2673_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'JSXIdentifier'), Js(u'JSXMemberExpression'))}) + PyJs_Object_2672_ = Js({u'name':PyJs_Object_2673_}) + PyJs_Object_2671_ = Js({u'visitor':Js([Js(u'name')]),u'aliases':Js([Js(u'JSX'), Js(u'Immutable')]),u'fields':PyJs_Object_2672_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'JSXClosingElement'), PyJs_Object_2671_) + PyJs_Object_2676_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'JSXOpeningElement'))}) + PyJs_Object_2677_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'JSXClosingElement'))}) + PyJs_Object_2678_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'JSXText'), Js(u'JSXExpressionContainer'), Js(u'JSXElement'))))}) + PyJs_Object_2675_ = Js({u'openingElement':PyJs_Object_2676_,u'closingElement':PyJs_Object_2677_,u'children':PyJs_Object_2678_}) + PyJs_Object_2674_ = Js({u'builder':Js([Js(u'openingElement'), Js(u'closingElement'), Js(u'children'), Js(u'selfClosing')]),u'visitor':Js([Js(u'openingElement'), Js(u'children'), Js(u'closingElement')]),u'aliases':Js([Js(u'JSX'), Js(u'Immutable'), Js(u'Expression')]),u'fields':PyJs_Object_2675_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'JSXElement'), PyJs_Object_2674_) + PyJs_Object_2679_ = Js({u'aliases':Js([Js(u'JSX'), Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'JSXEmptyExpression'), PyJs_Object_2679_) + PyJs_Object_2682_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2681_ = Js({u'expression':PyJs_Object_2682_}) + PyJs_Object_2680_ = Js({u'visitor':Js([Js(u'expression')]),u'aliases':Js([Js(u'JSX'), Js(u'Immutable')]),u'fields':PyJs_Object_2681_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'JSXExpressionContainer'), PyJs_Object_2680_) + PyJs_Object_2685_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'string'))}) + PyJs_Object_2684_ = Js({u'name':PyJs_Object_2685_}) + PyJs_Object_2683_ = Js({u'builder':Js([Js(u'name')]),u'aliases':Js([Js(u'JSX'), Js(u'Expression')]),u'fields':PyJs_Object_2684_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'JSXIdentifier'), PyJs_Object_2683_) + PyJs_Object_2688_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'JSXMemberExpression'), Js(u'JSXIdentifier'))}) + PyJs_Object_2689_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'JSXIdentifier'))}) + PyJs_Object_2687_ = Js({u'object':PyJs_Object_2688_,u'property':PyJs_Object_2689_}) + PyJs_Object_2686_ = Js({u'visitor':Js([Js(u'object'), Js(u'property')]),u'aliases':Js([Js(u'JSX'), Js(u'Expression')]),u'fields':PyJs_Object_2687_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'JSXMemberExpression'), PyJs_Object_2686_) + PyJs_Object_2692_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'JSXIdentifier'))}) + PyJs_Object_2693_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'JSXIdentifier'))}) + PyJs_Object_2691_ = Js({u'namespace':PyJs_Object_2692_,u'name':PyJs_Object_2693_}) + PyJs_Object_2690_ = Js({u'visitor':Js([Js(u'namespace'), Js(u'name')]),u'aliases':Js([Js(u'JSX')]),u'fields':PyJs_Object_2691_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'JSXNamespacedName'), PyJs_Object_2690_) + PyJs_Object_2696_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'JSXIdentifier'), Js(u'JSXMemberExpression'))}) + PyJs_Object_2697_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2698_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'JSXAttribute'), Js(u'JSXSpreadAttribute'))))}) + PyJs_Object_2695_ = Js({u'name':PyJs_Object_2696_,u'selfClosing':PyJs_Object_2697_,u'attributes':PyJs_Object_2698_}) + PyJs_Object_2694_ = Js({u'builder':Js([Js(u'name'), Js(u'attributes'), Js(u'selfClosing')]),u'visitor':Js([Js(u'name'), Js(u'attributes')]),u'aliases':Js([Js(u'JSX'), Js(u'Immutable')]),u'fields':PyJs_Object_2695_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'JSXOpeningElement'), PyJs_Object_2694_) + PyJs_Object_2701_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2700_ = Js({u'argument':PyJs_Object_2701_}) + PyJs_Object_2699_ = Js({u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'JSX')]),u'fields':PyJs_Object_2700_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'JSXSpreadAttribute'), PyJs_Object_2699_) + PyJs_Object_2704_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'string'))}) + PyJs_Object_2703_ = Js({u'value':PyJs_Object_2704_}) + PyJs_Object_2702_ = Js({u'aliases':Js([Js(u'JSX'), Js(u'Immutable')]),u'builder':Js([Js(u'value')]),u'fields':PyJs_Object_2703_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'JSXText'), PyJs_Object_2702_) +PyJs_anonymous_2665_._set_name(u'anonymous') +PyJs_Object_2705_ = Js({u'./index':Js(253.0)}) +@Js +def PyJs_anonymous_2706_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_index', u'require', u'module', u'_index2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2707_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2707_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + pass + PyJs_Object_2708_ = Js({u'visitor':Js([])}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'Noop'), PyJs_Object_2708_) + PyJs_Object_2711_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2710_ = Js({u'expression':PyJs_Object_2711_}) + PyJs_Object_2709_ = Js({u'visitor':Js([Js(u'expression')]),u'aliases':Js([Js(u'Expression'), Js(u'ExpressionWrapper')]),u'fields':PyJs_Object_2710_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ParenthesizedExpression'), PyJs_Object_2709_) +PyJs_anonymous_2706_._set_name(u'anonymous') +PyJs_Object_2712_ = Js({u'./index':Js(253.0)}) +@Js +def PyJs_anonymous_2713_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'removeTypeDuplicates', u'createUnionTypeAnnotation', u'require', u'_index', u'createTypeAnnotationBasedOnTypeof', u'module', u't']) + @Js + def PyJsHoisted_createTypeAnnotationBasedOnTypeof_(type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments}, var) + var.registers([u'type']) + if PyJsStrictEq(var.get(u'type'),Js(u'string')): + return var.get(u't').callprop(u'stringTypeAnnotation') + else: + if PyJsStrictEq(var.get(u'type'),Js(u'number')): + return var.get(u't').callprop(u'numberTypeAnnotation') + else: + if PyJsStrictEq(var.get(u'type'),Js(u'undefined')): + return var.get(u't').callprop(u'voidTypeAnnotation') + else: + if PyJsStrictEq(var.get(u'type'),Js(u'boolean')): + return var.get(u't').callprop(u'booleanTypeAnnotation') + else: + if PyJsStrictEq(var.get(u'type'),Js(u'function')): + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'Function'))) + else: + if PyJsStrictEq(var.get(u'type'),Js(u'object')): + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'Object'))) + else: + if PyJsStrictEq(var.get(u'type'),Js(u'symbol')): + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'Symbol'))) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Invalid typeof value'))) + raise PyJsTempException + PyJsHoisted_createTypeAnnotationBasedOnTypeof_.func_name = u'createTypeAnnotationBasedOnTypeof' + var.put(u'createTypeAnnotationBasedOnTypeof', PyJsHoisted_createTypeAnnotationBasedOnTypeof_) + @Js + def PyJsHoisted_removeTypeDuplicates_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'node', u'name', u'i', u'existing', u'typeGroups', u'bases', u'generics', u'nodes', u'_name', u'type', u'types']) + PyJs_Object_2715_ = Js({}) + var.put(u'generics', PyJs_Object_2715_) + PyJs_Object_2716_ = Js({}) + var.put(u'bases', PyJs_Object_2716_) + var.put(u'typeGroups', Js([])) + var.put(u'types', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'nodes').get(u'length')): + try: + var.put(u'node', var.get(u'nodes').get(var.get(u'i'))) + if var.get(u'node').neg(): + continue + if (var.get(u'types').callprop(u'indexOf', var.get(u'node'))>=Js(0.0)): + continue + if var.get(u't').callprop(u'isAnyTypeAnnotation', var.get(u'node')): + return Js([var.get(u'node')]) + if var.get(u't').callprop(u'isFlowBaseAnnotation', var.get(u'node')): + var.get(u'bases').put(var.get(u'node').get(u'type'), var.get(u'node')) + continue + if var.get(u't').callprop(u'isUnionTypeAnnotation', var.get(u'node')): + if (var.get(u'typeGroups').callprop(u'indexOf', var.get(u'node').get(u'types'))<Js(0.0)): + var.put(u'nodes', var.get(u'nodes').callprop(u'concat', var.get(u'node').get(u'types'))) + var.get(u'typeGroups').callprop(u'push', var.get(u'node').get(u'types')) + continue + if var.get(u't').callprop(u'isGenericTypeAnnotation', var.get(u'node')): + var.put(u'name', var.get(u'node').get(u'id').get(u'name')) + if var.get(u'generics').get(var.get(u'name')): + var.put(u'existing', var.get(u'generics').get(var.get(u'name'))) + if var.get(u'existing').get(u'typeParameters'): + if var.get(u'node').get(u'typeParameters'): + var.get(u'existing').get(u'typeParameters').put(u'params', var.get(u'removeTypeDuplicates')(var.get(u'existing').get(u'typeParameters').get(u'params').callprop(u'concat', var.get(u'node').get(u'typeParameters').get(u'params')))) + else: + var.put(u'existing', var.get(u'node').get(u'typeParameters')) + else: + var.get(u'generics').put(var.get(u'name'), var.get(u'node')) + continue + var.get(u'types').callprop(u'push', var.get(u'node')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + for PyJsTemp in var.get(u'bases'): + var.put(u'type', PyJsTemp) + var.get(u'types').callprop(u'push', var.get(u'bases').get(var.get(u'type'))) + for PyJsTemp in var.get(u'generics'): + var.put(u'_name', PyJsTemp) + var.get(u'types').callprop(u'push', var.get(u'generics').get(var.get(u'_name'))) + return var.get(u'types') + PyJsHoisted_removeTypeDuplicates_.func_name = u'removeTypeDuplicates' + var.put(u'removeTypeDuplicates', PyJsHoisted_removeTypeDuplicates_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2714_ = Js({}) + var.put(u'newObj', PyJs_Object_2714_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_createUnionTypeAnnotation_(types, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'types':types}, var) + var.registers([u'flattened', u'types']) + var.put(u'flattened', var.get(u'removeTypeDuplicates')(var.get(u'types'))) + if PyJsStrictEq(var.get(u'flattened').get(u'length'),Js(1.0)): + return var.get(u'flattened').get(u'0') + else: + return var.get(u't').callprop(u'unionTypeAnnotation', var.get(u'flattened')) + PyJsHoisted_createUnionTypeAnnotation_.func_name = u'createUnionTypeAnnotation' + var.put(u'createUnionTypeAnnotation', PyJsHoisted_createUnionTypeAnnotation_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'createUnionTypeAnnotation', var.get(u'createUnionTypeAnnotation')) + var.get(u'exports').put(u'removeTypeDuplicates', var.get(u'removeTypeDuplicates')) + var.get(u'exports').put(u'createTypeAnnotationBasedOnTypeof', var.get(u'createTypeAnnotationBasedOnTypeof')) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_index'))) + pass + pass + pass + pass +PyJs_anonymous_2713_._set_name(u'anonymous') +PyJs_Object_2717_ = Js({u'./index':Js(258.0)}) +@Js +def PyJs_anonymous_2718_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'inherits', u'_validators', u'_constants', u'_each', u'_definitions', u'is', u'inheritTrailingComments', u'_getOwnPropertySymbols', u'module', u'_interopRequireDefault', u'_compact', u'inheritInnerComments', u'isType', u'_toFastProperties2', u'_clone', u'cloneDeep', u'_getIterator2', u'_getIterator3', u'_flow', u'assertNode', u'_uniq2', u'inheritLeadingComments', u'inheritsComments', u'_inheritComments', u'removeProperties', u'_keys', u'_getOwnPropertySymbols2', u'_uniq', u'_each2', u'type', u'clone', u'TYPES', u't', u'removeComments', u'_type', u'_stringify2', u'_interopRequireWildcard', u'buildMatchMemberExpression', u'removePropertiesDeep', u'_react', u'_keys2', u'appendToMemberExpression', u'_loop', u'validate', u'_converters', u'traverseFast', u'_retrievers', u'prependToMemberExpression', u'exports', u'_react2', u'ensureBlock', u'registerType', u'_toFastProperties', u'_clone2', u'cloneWithoutLoc', u'_stringify', u'_compact2', u'shallowEqual', u'isNode', u'CLEAR_KEYS', u'CLEAR_KEYS_PLUS_COMMENTS', u'require']) + @Js + def PyJsHoisted_inherits_(child, parent, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parent':parent, u'child':child}, var) + var.registers([u'_isArray6', u'_isArray5', u'parent', u'_i6', u'_ref5', u'child', u'_key3', u'_key2', u'key', u'_ref6', u'_iterator5', u'_iterator6', u'_i5']) + if (var.get(u'child').neg() or var.get(u'parent').neg()): + return var.get(u'child') + #for JS loop + var.put(u'_iterator5', var.get(u't').get(u'INHERIT_KEYS').get(u'optional')) + var.put(u'_isArray5', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator5'))) + var.put(u'_i5', Js(0.0)) + var.put(u'_iterator5', (var.get(u'_iterator5') if var.get(u'_isArray5') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator5')))) + while 1: + pass + if var.get(u'_isArray5'): + if (var.get(u'_i5')>=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i5').get(u'value')) + var.put(u'_key2', var.get(u'_ref5')) + if (var.get(u'child').get(var.get(u'_key2'))==var.get(u"null")): + var.get(u'child').put(var.get(u'_key2'), var.get(u'parent').get(var.get(u'_key2'))) + + for PyJsTemp in var.get(u'parent'): + var.put(u'key', PyJsTemp) + if PyJsStrictEq(var.get(u'key').get(u'0'),Js(u'_')): + var.get(u'child').put(var.get(u'key'), var.get(u'parent').get(var.get(u'key'))) + #for JS loop + var.put(u'_iterator6', var.get(u't').get(u'INHERIT_KEYS').get(u'force')) + var.put(u'_isArray6', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator6'))) + var.put(u'_i6', Js(0.0)) + var.put(u'_iterator6', (var.get(u'_iterator6') if var.get(u'_isArray6') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator6')))) + while 1: + pass + if var.get(u'_isArray6'): + if (var.get(u'_i6')>=var.get(u'_iterator6').get(u'length')): + break + var.put(u'_ref6', var.get(u'_iterator6').get((var.put(u'_i6',Js(var.get(u'_i6').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i6', var.get(u'_iterator6').callprop(u'next')) + if var.get(u'_i6').get(u'done'): + break + var.put(u'_ref6', var.get(u'_i6').get(u'value')) + var.put(u'_key3', var.get(u'_ref6')) + var.get(u'child').put(var.get(u'_key3'), var.get(u'parent').get(var.get(u'_key3'))) + + var.get(u't').callprop(u'inheritsComments', var.get(u'child'), var.get(u'parent')) + return var.get(u'child') + PyJsHoisted_inherits_.func_name = u'inherits' + var.put(u'inherits', PyJsHoisted_inherits_) + @Js + def PyJsHoisted_buildMatchMemberExpression_(match, allowPartial, this, arguments, var=var): + var = Scope({u'this':this, u'allowPartial':allowPartial, u'match':match, u'arguments':arguments}, var) + var.registers([u'parts', u'allowPartial', u'match']) + var.put(u'parts', var.get(u'match').callprop(u'split', Js(u'.'))) + @Js + def PyJs_anonymous_2823_(member, this, arguments, var=var): + var = Scope({u'member':member, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'node', u'search', u'member']) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'member')).neg(): + return Js(False) + var.put(u'search', Js([var.get(u'member')])) + var.put(u'i', Js(0.0)) + while var.get(u'search').get(u'length'): + var.put(u'node', var.get(u'search').callprop(u'shift')) + if (var.get(u'allowPartial') and PyJsStrictEq(var.get(u'i'),var.get(u'parts').get(u'length'))): + return var.get(u'true') + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + if PyJsStrictNeq(var.get(u'parts').get(var.get(u'i')),var.get(u'node').get(u'name')): + return Js(False) + else: + if var.get(u't').callprop(u'isStringLiteral', var.get(u'node')): + if PyJsStrictNeq(var.get(u'parts').get(var.get(u'i')),var.get(u'node').get(u'value')): + return Js(False) + else: + if var.get(u't').callprop(u'isMemberExpression', var.get(u'node')): + if (var.get(u'node').get(u'computed') and var.get(u't').callprop(u'isStringLiteral', var.get(u'node').get(u'property')).neg()): + return Js(False) + else: + var.get(u'search').callprop(u'push', var.get(u'node').get(u'object')) + var.get(u'search').callprop(u'push', var.get(u'node').get(u'property')) + continue + else: + return Js(False) + if (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))>var.get(u'parts').get(u'length')): + return Js(False) + return var.get(u'true') + PyJs_anonymous_2823_._set_name(u'anonymous') + return PyJs_anonymous_2823_ + PyJsHoisted_buildMatchMemberExpression_.func_name = u'buildMatchMemberExpression' + var.put(u'buildMatchMemberExpression', PyJsHoisted_buildMatchMemberExpression_) + @Js + def PyJsHoisted_cloneDeep_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'newNode', u'val', u'key']) + PyJs_Object_2822_ = Js({}) + var.put(u'newNode', PyJs_Object_2822_) + for PyJsTemp in var.get(u'node'): + var.put(u'key', PyJsTemp) + if PyJsStrictEq(var.get(u'key').get(u'0'),Js(u'_')): + continue + var.put(u'val', var.get(u'node').get(var.get(u'key'))) + if var.get(u'val'): + if var.get(u'val').get(u'type'): + var.put(u'val', var.get(u't').callprop(u'cloneDeep', var.get(u'val'))) + else: + if var.get(u'Array').callprop(u'isArray', var.get(u'val')): + var.put(u'val', var.get(u'val').callprop(u'map', var.get(u't').get(u'cloneDeep'))) + var.get(u'newNode').put(var.get(u'key'), var.get(u'val')) + return var.get(u'newNode') + PyJsHoisted_cloneDeep_.func_name = u'cloneDeep' + var.put(u'cloneDeep', PyJsHoisted_cloneDeep_) + @Js + def PyJsHoisted_is_(type, node, opts, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'type':type, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'matches', u'node', u'type', u'opts']) + if var.get(u'node').neg(): + return Js(False) + var.put(u'matches', var.get(u'isType')(var.get(u'node').get(u'type'), var.get(u'type'))) + if var.get(u'matches').neg(): + return Js(False) + if PyJsStrictEq(var.get(u'opts',throw=False).typeof(),Js(u'undefined')): + return var.get(u'true') + else: + return var.get(u't').callprop(u'shallowEqual', var.get(u'node'), var.get(u'opts')) + PyJsHoisted_is_.func_name = u'is' + var.put(u'is', PyJsHoisted_is_) + @Js + def PyJsHoisted_inheritTrailingComments_(child, parent, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parent':parent, u'child':child}, var) + var.registers([u'parent', u'child']) + var.get(u'_inheritComments')(Js(u'trailingComments'), var.get(u'child'), var.get(u'parent')) + PyJsHoisted_inheritTrailingComments_.func_name = u'inheritTrailingComments' + var.put(u'inheritTrailingComments', PyJsHoisted_inheritTrailingComments_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2809_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2809_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_isType_(nodeType, targetType, this, arguments, var=var): + var = Scope({u'this':this, u'targetType':targetType, u'nodeType':nodeType, u'arguments':arguments}, var) + var.registers([u'targetType', u'_isArray', u'_iterator', u'alias', u'_i', u'nodeType', u'_ref', u'aliases']) + if PyJsStrictEq(var.get(u'nodeType'),var.get(u'targetType')): + return var.get(u'true') + if var.get(u't').get(u'ALIAS_KEYS').get(var.get(u'targetType')): + return Js(False) + var.put(u'aliases', var.get(u't').get(u'FLIPPED_ALIAS_KEYS').get(var.get(u'targetType'))) + if var.get(u'aliases'): + if PyJsStrictEq(var.get(u'aliases').get(u'0'),var.get(u'nodeType')): + return var.get(u'true') + #for JS loop + var.put(u'_iterator', var.get(u'aliases')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'alias', var.get(u'_ref')) + if PyJsStrictEq(var.get(u'nodeType'),var.get(u'alias')): + return var.get(u'true') + + return Js(False) + PyJsHoisted_isType_.func_name = u'isType' + var.put(u'isType', PyJsHoisted_isType_) + @Js + def PyJsHoisted_shallowEqual_(actual, expected, this, arguments, var=var): + var = Scope({u'expected':expected, u'this':this, u'actual':actual, u'arguments':arguments}, var) + var.registers([u'_isArray3', u'keys', u'_ref3', u'_i3', u'key', u'expected', u'actual', u'_iterator3']) + var.put(u'keys', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'expected'))) + #for JS loop + var.put(u'_iterator3', var.get(u'keys')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'key', var.get(u'_ref3')) + if PyJsStrictNeq(var.get(u'actual').get(var.get(u'key')),var.get(u'expected').get(var.get(u'key'))): + return Js(False) + + return var.get(u'true') + PyJsHoisted_shallowEqual_.func_name = u'shallowEqual' + var.put(u'shallowEqual', PyJsHoisted_shallowEqual_) + @Js + def PyJsHoisted_inheritInnerComments_(child, parent, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parent':parent, u'child':child}, var) + var.registers([u'parent', u'child']) + var.get(u'_inheritComments')(Js(u'innerComments'), var.get(u'child'), var.get(u'parent')) + PyJsHoisted_inheritInnerComments_.func_name = u'inheritInnerComments' + var.put(u'inheritInnerComments', PyJsHoisted_inheritInnerComments_) + @Js + def PyJsHoisted_ensureBlock_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'key']) + var.put(u'key', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js(u'body'))) + return var.get(u'node').put(var.get(u'key'), var.get(u't').callprop(u'toBlock', var.get(u'node').get(var.get(u'key')), var.get(u'node'))) + PyJsHoisted_ensureBlock_.func_name = u'ensureBlock' + var.put(u'ensureBlock', PyJsHoisted_ensureBlock_) + @Js + def PyJsHoisted_assertNode_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u'isNode')(var.get(u'node')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Not a valid node ')+(var.get(u'node') and var.get(u'node').get(u'type'))))) + raise PyJsTempException + PyJsHoisted_assertNode_.func_name = u'assertNode' + var.put(u'assertNode', PyJsHoisted_assertNode_) + @Js + def PyJsHoisted_inheritLeadingComments_(child, parent, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parent':parent, u'child':child}, var) + var.registers([u'parent', u'child']) + var.get(u'_inheritComments')(Js(u'leadingComments'), var.get(u'child'), var.get(u'parent')) + PyJsHoisted_inheritLeadingComments_.func_name = u'inheritLeadingComments' + var.put(u'inheritLeadingComments', PyJsHoisted_inheritLeadingComments_) + @Js + def PyJsHoisted__inheritComments_(key, child, parent, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parent':parent, u'key':key, u'child':child}, var) + var.registers([u'parent', u'key', u'child']) + if (var.get(u'child') and var.get(u'parent')): + var.get(u'child').put(var.get(u'key'), PyJsComma(Js(0.0),var.get(u'_uniq2').get(u'default'))(PyJsComma(Js(0.0),var.get(u'_compact2').get(u'default'))(Js([]).callprop(u'concat', var.get(u'child').get(var.get(u'key')), var.get(u'parent').get(var.get(u'key')))))) + PyJsHoisted__inheritComments_.func_name = u'_inheritComments' + var.put(u'_inheritComments', PyJsHoisted__inheritComments_) + @Js + def PyJsHoisted_removeProperties_(node, opts, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'node', u'map', u'_ref9', u'_i9', u'_ref10', u'_isArray9', u'syms', u'_i10', u'_iterator9', u'_key4', u'key', u'_isArray10', u'sym', u'_iterator10', u'opts']) + PyJs_Object_2825_ = Js({}) + var.put(u'opts', (var.get(u'opts') or PyJs_Object_2825_)) + var.put(u'map', (var.get(u'CLEAR_KEYS') if var.get(u'opts').get(u'preserveComments') else var.get(u'CLEAR_KEYS_PLUS_COMMENTS'))) + #for JS loop + var.put(u'_iterator9', var.get(u'map')) + var.put(u'_isArray9', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator9'))) + var.put(u'_i9', Js(0.0)) + var.put(u'_iterator9', (var.get(u'_iterator9') if var.get(u'_isArray9') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator9')))) + while 1: + pass + if var.get(u'_isArray9'): + if (var.get(u'_i9')>=var.get(u'_iterator9').get(u'length')): + break + var.put(u'_ref9', var.get(u'_iterator9').get((var.put(u'_i9',Js(var.get(u'_i9').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i9', var.get(u'_iterator9').callprop(u'next')) + if var.get(u'_i9').get(u'done'): + break + var.put(u'_ref9', var.get(u'_i9').get(u'value')) + var.put(u'_key4', var.get(u'_ref9')) + if (var.get(u'node').get(var.get(u'_key4'))!=var.get(u"null")): + var.get(u'node').put(var.get(u'_key4'), var.get(u'undefined')) + + for PyJsTemp in var.get(u'node'): + var.put(u'key', PyJsTemp) + if (PyJsStrictEq(var.get(u'key').get(u'0'),Js(u'_')) and (var.get(u'node').get(var.get(u'key'))!=var.get(u"null"))): + var.get(u'node').put(var.get(u'key'), var.get(u'undefined')) + var.put(u'syms', PyJsComma(Js(0.0),var.get(u'_getOwnPropertySymbols2').get(u'default'))(var.get(u'node'))) + #for JS loop + var.put(u'_iterator10', var.get(u'syms')) + var.put(u'_isArray10', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator10'))) + var.put(u'_i10', Js(0.0)) + var.put(u'_iterator10', (var.get(u'_iterator10') if var.get(u'_isArray10') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator10')))) + while 1: + pass + if var.get(u'_isArray10'): + if (var.get(u'_i10')>=var.get(u'_iterator10').get(u'length')): + break + var.put(u'_ref10', var.get(u'_iterator10').get((var.put(u'_i10',Js(var.get(u'_i10').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i10', var.get(u'_iterator10').callprop(u'next')) + if var.get(u'_i10').get(u'done'): + break + var.put(u'_ref10', var.get(u'_i10').get(u'value')) + var.put(u'sym', var.get(u'_ref10')) + var.get(u'node').put(var.get(u'sym'), var.get(u"null")) + + PyJsHoisted_removeProperties_.func_name = u'removeProperties' + var.put(u'removeProperties', PyJsHoisted_removeProperties_) + @Js + def PyJsHoisted_isNode_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return (var.get(u'node') and var.get(u'_definitions').get(u'VISITOR_KEYS').get(var.get(u'node').get(u'type'))).neg().neg() + PyJsHoisted_isNode_.func_name = u'isNode' + var.put(u'isNode', PyJsHoisted_isNode_) + @Js + def PyJsHoisted_inheritsComments_(child, parent, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parent':parent, u'child':child}, var) + var.registers([u'parent', u'child']) + var.get(u'inheritTrailingComments')(var.get(u'child'), var.get(u'parent')) + var.get(u'inheritLeadingComments')(var.get(u'child'), var.get(u'parent')) + var.get(u'inheritInnerComments')(var.get(u'child'), var.get(u'parent')) + return var.get(u'child') + PyJsHoisted_inheritsComments_.func_name = u'inheritsComments' + var.put(u'inheritsComments', PyJsHoisted_inheritsComments_) + @Js + def PyJsHoisted_removeComments_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray4', u'_i4', u'key', u'_iterator4', u'_ref4']) + #for JS loop + var.put(u'_iterator4', var.get(u't').get(u'COMMENT_KEYS')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i4').get(u'value')) + var.put(u'key', var.get(u'_ref4')) + var.get(u'node').delete(var.get(u'key')) + + return var.get(u'node') + PyJsHoisted_removeComments_.func_name = u'removeComments' + var.put(u'removeComments', PyJsHoisted_removeComments_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2808_ = Js({}) + var.put(u'newObj', PyJs_Object_2808_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_removePropertiesDeep_(tree, opts, this, arguments, var=var): + var = Scope({u'this':this, u'tree':tree, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'tree', u'opts']) + var.get(u'traverseFast')(var.get(u'tree'), var.get(u'removeProperties'), var.get(u'opts')) + return var.get(u'tree') + PyJsHoisted_removePropertiesDeep_.func_name = u'removePropertiesDeep' + var.put(u'removePropertiesDeep', PyJsHoisted_removePropertiesDeep_) + @Js + def PyJsHoisted_clone_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'newNode', u'key']) + PyJs_Object_2821_ = Js({}) + var.put(u'newNode', PyJs_Object_2821_) + for PyJsTemp in var.get(u'node'): + var.put(u'key', PyJsTemp) + if PyJsStrictEq(var.get(u'key').get(u'0'),Js(u'_')): + continue + var.get(u'newNode').put(var.get(u'key'), var.get(u'node').get(var.get(u'key'))) + return var.get(u'newNode') + PyJsHoisted_clone_.func_name = u'clone' + var.put(u'clone', PyJsHoisted_clone_) + @Js + def PyJsHoisted_appendToMemberExpression_(member, append, computed, this, arguments, var=var): + var = Scope({u'member':member, u'this':this, u'computed':computed, u'append':append, u'arguments':arguments}, var) + var.registers([u'member', u'computed', u'append']) + var.get(u'member').put(u'object', var.get(u't').callprop(u'memberExpression', var.get(u'member').get(u'object'), var.get(u'member').get(u'property'), var.get(u'member').get(u'computed'))) + var.get(u'member').put(u'property', var.get(u'append')) + var.get(u'member').put(u'computed', var.get(u'computed').neg().neg()) + return var.get(u'member') + PyJsHoisted_appendToMemberExpression_.func_name = u'appendToMemberExpression' + var.put(u'appendToMemberExpression', PyJsHoisted_appendToMemberExpression_) + @Js + def PyJsHoisted_validate_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'node', u'fields', u'val', u'key', u'field']) + if var.get(u'node').neg(): + return var.get('undefined') + var.put(u'fields', var.get(u't').get(u'NODE_FIELDS').get(var.get(u'node').get(u'type'))) + if var.get(u'fields').neg(): + return var.get('undefined') + var.put(u'field', var.get(u'fields').get(var.get(u'key'))) + if (var.get(u'field').neg() or var.get(u'field').get(u'validate').neg()): + return var.get('undefined') + if (var.get(u'field').get(u'optional') and (var.get(u'val')==var.get(u"null"))): + return var.get('undefined') + var.get(u'field').callprop(u'validate', var.get(u'node'), var.get(u'key'), var.get(u'val')) + PyJsHoisted_validate_.func_name = u'validate' + var.put(u'validate', PyJsHoisted_validate_) + @Js + def PyJsHoisted_traverseFast_(node, enter, opts, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'opts':opts, u'enter':enter}, var) + var.registers([u'_isArray7', u'node', u'_ref7', u'_i8', u'keys', u'_ref8', u'_isArray8', u'_i7', u'_node', u'_iterator8', u'key', u'enter', u'_iterator7', u'subNode', u'opts']) + if var.get(u'node').neg(): + return var.get('undefined') + var.put(u'keys', var.get(u't').get(u'VISITOR_KEYS').get(var.get(u'node').get(u'type'))) + if var.get(u'keys').neg(): + return var.get('undefined') + PyJs_Object_2824_ = Js({}) + var.put(u'opts', (var.get(u'opts') or PyJs_Object_2824_)) + var.get(u'enter')(var.get(u'node'), var.get(u'opts')) + #for JS loop + var.put(u'_iterator7', var.get(u'keys')) + var.put(u'_isArray7', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator7'))) + var.put(u'_i7', Js(0.0)) + var.put(u'_iterator7', (var.get(u'_iterator7') if var.get(u'_isArray7') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator7')))) + while 1: + pass + if var.get(u'_isArray7'): + if (var.get(u'_i7')>=var.get(u'_iterator7').get(u'length')): + break + var.put(u'_ref7', var.get(u'_iterator7').get((var.put(u'_i7',Js(var.get(u'_i7').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i7', var.get(u'_iterator7').callprop(u'next')) + if var.get(u'_i7').get(u'done'): + break + var.put(u'_ref7', var.get(u'_i7').get(u'value')) + var.put(u'key', var.get(u'_ref7')) + var.put(u'subNode', var.get(u'node').get(var.get(u'key'))) + if var.get(u'Array').callprop(u'isArray', var.get(u'subNode')): + #for JS loop + var.put(u'_iterator8', var.get(u'subNode')) + var.put(u'_isArray8', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator8'))) + var.put(u'_i8', Js(0.0)) + var.put(u'_iterator8', (var.get(u'_iterator8') if var.get(u'_isArray8') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator8')))) + while 1: + pass + if var.get(u'_isArray8'): + if (var.get(u'_i8')>=var.get(u'_iterator8').get(u'length')): + break + var.put(u'_ref8', var.get(u'_iterator8').get((var.put(u'_i8',Js(var.get(u'_i8').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i8', var.get(u'_iterator8').callprop(u'next')) + if var.get(u'_i8').get(u'done'): + break + var.put(u'_ref8', var.get(u'_i8').get(u'value')) + var.put(u'_node', var.get(u'_ref8')) + var.get(u'traverseFast')(var.get(u'_node'), var.get(u'enter'), var.get(u'opts')) + + else: + var.get(u'traverseFast')(var.get(u'subNode'), var.get(u'enter'), var.get(u'opts')) + + PyJsHoisted_traverseFast_.func_name = u'traverseFast' + var.put(u'traverseFast', PyJsHoisted_traverseFast_) + @Js + def PyJsHoisted_prependToMemberExpression_(member, prepend, this, arguments, var=var): + var = Scope({u'member':member, u'this':this, u'arguments':arguments, u'prepend':prepend}, var) + var.registers([u'member', u'prepend']) + var.get(u'member').put(u'object', var.get(u't').callprop(u'memberExpression', var.get(u'prepend'), var.get(u'member').get(u'object'))) + return var.get(u'member') + PyJsHoisted_prependToMemberExpression_.func_name = u'prependToMemberExpression' + var.put(u'prependToMemberExpression', PyJsHoisted_prependToMemberExpression_) + @Js + def PyJsHoisted_registerType_(type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments}, var) + var.registers([u'is', u'type']) + var.put(u'is', var.get(u't').get((Js(u'is')+var.get(u'type')))) + if var.get(u'is').neg(): + @Js + def PyJs_anonymous_2810_(node, opts, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'node', u'opts']) + return var.get(u't').callprop(u'is', var.get(u'type'), var.get(u'node'), var.get(u'opts')) + PyJs_anonymous_2810_._set_name(u'anonymous') + var.put(u'is', var.get(u't').put((Js(u'is')+var.get(u'type')), PyJs_anonymous_2810_)) + @Js + def PyJs_anonymous_2811_(node, opts, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'node', u'opts']) + PyJs_Object_2812_ = Js({}) + var.put(u'opts', (var.get(u'opts') or PyJs_Object_2812_)) + if var.get(u'is')(var.get(u'node'), var.get(u'opts')).neg(): + PyJsTempException = JsToPyException(var.get(u'Error').create((((Js(u'Expected type ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'type')))+Js(u' with option '))+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'opts'))))) + raise PyJsTempException + PyJs_anonymous_2811_._set_name(u'anonymous') + var.get(u't').put((Js(u'assert')+var.get(u'type')), PyJs_anonymous_2811_) + PyJsHoisted_registerType_.func_name = u'registerType' + var.put(u'registerType', PyJsHoisted_registerType_) + @Js + def PyJsHoisted_cloneWithoutLoc_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'newNode']) + var.put(u'newNode', var.get(u'clone')(var.get(u'node'))) + var.get(u'newNode').delete(u'loc') + return var.get(u'newNode') + PyJsHoisted_cloneWithoutLoc_.func_name = u'cloneWithoutLoc' + var.put(u'cloneWithoutLoc', PyJsHoisted_cloneWithoutLoc_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + def PyJs_LONG_2723_(var=var): + def PyJs_LONG_2722_(var=var): + def PyJs_LONG_2721_(var=var): + def PyJs_LONG_2720_(var=var): + def PyJs_LONG_2719_(var=var): + return var.get(u'exports').put(u'EQUALITY_BINARY_OPERATORS', var.get(u'exports').put(u'BOOLEAN_NUMBER_BINARY_OPERATORS', var.get(u'exports').put(u'UPDATE_OPERATORS', var.get(u'exports').put(u'LOGICAL_OPERATORS', var.get(u'exports').put(u'COMMENT_KEYS', var.get(u'exports').put(u'FOR_INIT_KEYS', var.get(u'exports').put(u'FLATTENABLE_KEYS', var.get(u'exports').put(u'STATEMENT_OR_BLOCK_KEYS', var.get(u'undefined'))))))))) + return var.get(u'exports').put(u'UNARY_OPERATORS', var.get(u'exports').put(u'STRING_UNARY_OPERATORS', var.get(u'exports').put(u'NUMBER_UNARY_OPERATORS', var.get(u'exports').put(u'BOOLEAN_UNARY_OPERATORS', var.get(u'exports').put(u'BINARY_OPERATORS', var.get(u'exports').put(u'NUMBER_BINARY_OPERATORS', var.get(u'exports').put(u'BOOLEAN_BINARY_OPERATORS', var.get(u'exports').put(u'COMPARISON_BINARY_OPERATORS', PyJs_LONG_2719_())))))))) + return var.get(u'exports').put(u'TYPES', var.get(u'exports').put(u'react', var.get(u'exports').put(u'DEPRECATED_KEYS', var.get(u'exports').put(u'BUILDER_KEYS', var.get(u'exports').put(u'NODE_FIELDS', var.get(u'exports').put(u'ALIAS_KEYS', var.get(u'exports').put(u'VISITOR_KEYS', var.get(u'exports').put(u'NOT_LOCAL_BINDING', var.get(u'exports').put(u'BLOCK_SCOPED_SYMBOL', var.get(u'exports').put(u'INHERIT_KEYS', PyJs_LONG_2720_())))))))))) + return var.get(u'exports').put(u'isSpecifierDefault', var.get(u'exports').put(u'isVar', var.get(u'exports').put(u'isBlockScoped', var.get(u'exports').put(u'isLet', var.get(u'exports').put(u'isValidIdentifier', var.get(u'exports').put(u'isReferenced', var.get(u'exports').put(u'isBinding', var.get(u'exports').put(u'getOuterBindingIdentifiers', var.get(u'exports').put(u'getBindingIdentifiers', PyJs_LONG_2721_()))))))))) + return var.get(u'exports').put(u'toExpression', var.get(u'exports').put(u'toStatement', var.get(u'exports').put(u'toBindingIdentifierName', var.get(u'exports').put(u'toIdentifier', var.get(u'exports').put(u'toKeyAlias', var.get(u'exports').put(u'toSequenceExpression', var.get(u'exports').put(u'toComputedKey', var.get(u'exports').put(u'isImmutable', var.get(u'exports').put(u'isScope', PyJs_LONG_2722_()))))))))) + var.get(u'exports').put(u'createTypeAnnotationBasedOnTypeof', var.get(u'exports').put(u'removeTypeDuplicates', var.get(u'exports').put(u'createUnionTypeAnnotation', var.get(u'exports').put(u'valueToNode', var.get(u'exports').put(u'toBlock', PyJs_LONG_2723_()))))) + var.put(u'_getOwnPropertySymbols', var.get(u'require')(Js(u'babel-runtime/core-js/object/get-own-property-symbols'))) + var.put(u'_getOwnPropertySymbols2', var.get(u'_interopRequireDefault')(var.get(u'_getOwnPropertySymbols'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_keys', var.get(u'require')(Js(u'babel-runtime/core-js/object/keys'))) + var.put(u'_keys2', var.get(u'_interopRequireDefault')(var.get(u'_keys'))) + var.put(u'_stringify', var.get(u'require')(Js(u'babel-runtime/core-js/json/stringify'))) + var.put(u'_stringify2', var.get(u'_interopRequireDefault')(var.get(u'_stringify'))) + var.put(u'_constants', var.get(u'require')(Js(u'./constants'))) + @Js + def PyJs_get_2725_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2725_}, var) + var.registers([]) + return var.get(u'_constants').get(u'STATEMENT_OR_BLOCK_KEYS') + PyJs_get_2725_._set_name(u'get') + PyJs_Object_2724_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2725_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'STATEMENT_OR_BLOCK_KEYS'), PyJs_Object_2724_) + @Js + def PyJs_get_2727_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2727_}, var) + var.registers([]) + return var.get(u'_constants').get(u'FLATTENABLE_KEYS') + PyJs_get_2727_._set_name(u'get') + PyJs_Object_2726_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2727_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'FLATTENABLE_KEYS'), PyJs_Object_2726_) + @Js + def PyJs_get_2729_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2729_}, var) + var.registers([]) + return var.get(u'_constants').get(u'FOR_INIT_KEYS') + PyJs_get_2729_._set_name(u'get') + PyJs_Object_2728_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2729_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'FOR_INIT_KEYS'), PyJs_Object_2728_) + @Js + def PyJs_get_2731_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2731_}, var) + var.registers([]) + return var.get(u'_constants').get(u'COMMENT_KEYS') + PyJs_get_2731_._set_name(u'get') + PyJs_Object_2730_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2731_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'COMMENT_KEYS'), PyJs_Object_2730_) + @Js + def PyJs_get_2733_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2733_}, var) + var.registers([]) + return var.get(u'_constants').get(u'LOGICAL_OPERATORS') + PyJs_get_2733_._set_name(u'get') + PyJs_Object_2732_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2733_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'LOGICAL_OPERATORS'), PyJs_Object_2732_) + @Js + def PyJs_get_2735_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2735_}, var) + var.registers([]) + return var.get(u'_constants').get(u'UPDATE_OPERATORS') + PyJs_get_2735_._set_name(u'get') + PyJs_Object_2734_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2735_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'UPDATE_OPERATORS'), PyJs_Object_2734_) + @Js + def PyJs_get_2737_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2737_}, var) + var.registers([]) + return var.get(u'_constants').get(u'BOOLEAN_NUMBER_BINARY_OPERATORS') + PyJs_get_2737_._set_name(u'get') + PyJs_Object_2736_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2737_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'BOOLEAN_NUMBER_BINARY_OPERATORS'), PyJs_Object_2736_) + @Js + def PyJs_get_2739_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2739_}, var) + var.registers([]) + return var.get(u'_constants').get(u'EQUALITY_BINARY_OPERATORS') + PyJs_get_2739_._set_name(u'get') + PyJs_Object_2738_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2739_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'EQUALITY_BINARY_OPERATORS'), PyJs_Object_2738_) + @Js + def PyJs_get_2741_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2741_}, var) + var.registers([]) + return var.get(u'_constants').get(u'COMPARISON_BINARY_OPERATORS') + PyJs_get_2741_._set_name(u'get') + PyJs_Object_2740_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2741_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'COMPARISON_BINARY_OPERATORS'), PyJs_Object_2740_) + @Js + def PyJs_get_2743_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2743_}, var) + var.registers([]) + return var.get(u'_constants').get(u'BOOLEAN_BINARY_OPERATORS') + PyJs_get_2743_._set_name(u'get') + PyJs_Object_2742_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2743_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'BOOLEAN_BINARY_OPERATORS'), PyJs_Object_2742_) + @Js + def PyJs_get_2745_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2745_}, var) + var.registers([]) + return var.get(u'_constants').get(u'NUMBER_BINARY_OPERATORS') + PyJs_get_2745_._set_name(u'get') + PyJs_Object_2744_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2745_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'NUMBER_BINARY_OPERATORS'), PyJs_Object_2744_) + @Js + def PyJs_get_2747_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2747_}, var) + var.registers([]) + return var.get(u'_constants').get(u'BINARY_OPERATORS') + PyJs_get_2747_._set_name(u'get') + PyJs_Object_2746_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2747_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'BINARY_OPERATORS'), PyJs_Object_2746_) + @Js + def PyJs_get_2749_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2749_}, var) + var.registers([]) + return var.get(u'_constants').get(u'BOOLEAN_UNARY_OPERATORS') + PyJs_get_2749_._set_name(u'get') + PyJs_Object_2748_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2749_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'BOOLEAN_UNARY_OPERATORS'), PyJs_Object_2748_) + @Js + def PyJs_get_2751_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2751_}, var) + var.registers([]) + return var.get(u'_constants').get(u'NUMBER_UNARY_OPERATORS') + PyJs_get_2751_._set_name(u'get') + PyJs_Object_2750_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2751_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'NUMBER_UNARY_OPERATORS'), PyJs_Object_2750_) + @Js + def PyJs_get_2753_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2753_}, var) + var.registers([]) + return var.get(u'_constants').get(u'STRING_UNARY_OPERATORS') + PyJs_get_2753_._set_name(u'get') + PyJs_Object_2752_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2753_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'STRING_UNARY_OPERATORS'), PyJs_Object_2752_) + @Js + def PyJs_get_2755_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2755_}, var) + var.registers([]) + return var.get(u'_constants').get(u'UNARY_OPERATORS') + PyJs_get_2755_._set_name(u'get') + PyJs_Object_2754_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2755_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'UNARY_OPERATORS'), PyJs_Object_2754_) + @Js + def PyJs_get_2757_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2757_}, var) + var.registers([]) + return var.get(u'_constants').get(u'INHERIT_KEYS') + PyJs_get_2757_._set_name(u'get') + PyJs_Object_2756_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2757_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'INHERIT_KEYS'), PyJs_Object_2756_) + @Js + def PyJs_get_2759_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2759_}, var) + var.registers([]) + return var.get(u'_constants').get(u'BLOCK_SCOPED_SYMBOL') + PyJs_get_2759_._set_name(u'get') + PyJs_Object_2758_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2759_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'BLOCK_SCOPED_SYMBOL'), PyJs_Object_2758_) + @Js + def PyJs_get_2761_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2761_}, var) + var.registers([]) + return var.get(u'_constants').get(u'NOT_LOCAL_BINDING') + PyJs_get_2761_._set_name(u'get') + PyJs_Object_2760_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2761_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'NOT_LOCAL_BINDING'), PyJs_Object_2760_) + var.get(u'exports').put(u'is', var.get(u'is')) + var.get(u'exports').put(u'isType', var.get(u'isType')) + var.get(u'exports').put(u'validate', var.get(u'validate')) + var.get(u'exports').put(u'shallowEqual', var.get(u'shallowEqual')) + var.get(u'exports').put(u'appendToMemberExpression', var.get(u'appendToMemberExpression')) + var.get(u'exports').put(u'prependToMemberExpression', var.get(u'prependToMemberExpression')) + var.get(u'exports').put(u'ensureBlock', var.get(u'ensureBlock')) + var.get(u'exports').put(u'clone', var.get(u'clone')) + var.get(u'exports').put(u'cloneWithoutLoc', var.get(u'cloneWithoutLoc')) + var.get(u'exports').put(u'cloneDeep', var.get(u'cloneDeep')) + var.get(u'exports').put(u'buildMatchMemberExpression', var.get(u'buildMatchMemberExpression')) + var.get(u'exports').put(u'removeComments', var.get(u'removeComments')) + var.get(u'exports').put(u'inheritsComments', var.get(u'inheritsComments')) + var.get(u'exports').put(u'inheritTrailingComments', var.get(u'inheritTrailingComments')) + var.get(u'exports').put(u'inheritLeadingComments', var.get(u'inheritLeadingComments')) + var.get(u'exports').put(u'inheritInnerComments', var.get(u'inheritInnerComments')) + var.get(u'exports').put(u'inherits', var.get(u'inherits')) + var.get(u'exports').put(u'assertNode', var.get(u'assertNode')) + var.get(u'exports').put(u'isNode', var.get(u'isNode')) + var.get(u'exports').put(u'traverseFast', var.get(u'traverseFast')) + var.get(u'exports').put(u'removeProperties', var.get(u'removeProperties')) + var.get(u'exports').put(u'removePropertiesDeep', var.get(u'removePropertiesDeep')) + var.put(u'_retrievers', var.get(u'require')(Js(u'./retrievers'))) + @Js + def PyJs_get_2763_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2763_}, var) + var.registers([]) + return var.get(u'_retrievers').get(u'getBindingIdentifiers') + PyJs_get_2763_._set_name(u'get') + PyJs_Object_2762_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2763_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'getBindingIdentifiers'), PyJs_Object_2762_) + @Js + def PyJs_get_2765_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2765_}, var) + var.registers([]) + return var.get(u'_retrievers').get(u'getOuterBindingIdentifiers') + PyJs_get_2765_._set_name(u'get') + PyJs_Object_2764_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2765_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'getOuterBindingIdentifiers'), PyJs_Object_2764_) + var.put(u'_validators', var.get(u'require')(Js(u'./validators'))) + @Js + def PyJs_get_2767_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2767_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isBinding') + PyJs_get_2767_._set_name(u'get') + PyJs_Object_2766_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2767_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isBinding'), PyJs_Object_2766_) + @Js + def PyJs_get_2769_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2769_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isReferenced') + PyJs_get_2769_._set_name(u'get') + PyJs_Object_2768_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2769_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isReferenced'), PyJs_Object_2768_) + @Js + def PyJs_get_2771_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2771_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isValidIdentifier') + PyJs_get_2771_._set_name(u'get') + PyJs_Object_2770_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2771_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isValidIdentifier'), PyJs_Object_2770_) + @Js + def PyJs_get_2773_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2773_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isLet') + PyJs_get_2773_._set_name(u'get') + PyJs_Object_2772_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2773_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isLet'), PyJs_Object_2772_) + @Js + def PyJs_get_2775_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2775_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isBlockScoped') + PyJs_get_2775_._set_name(u'get') + PyJs_Object_2774_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2775_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isBlockScoped'), PyJs_Object_2774_) + @Js + def PyJs_get_2777_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2777_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isVar') + PyJs_get_2777_._set_name(u'get') + PyJs_Object_2776_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2777_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isVar'), PyJs_Object_2776_) + @Js + def PyJs_get_2779_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2779_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isSpecifierDefault') + PyJs_get_2779_._set_name(u'get') + PyJs_Object_2778_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2779_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isSpecifierDefault'), PyJs_Object_2778_) + @Js + def PyJs_get_2781_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2781_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isScope') + PyJs_get_2781_._set_name(u'get') + PyJs_Object_2780_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2781_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isScope'), PyJs_Object_2780_) + @Js + def PyJs_get_2783_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2783_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isImmutable') + PyJs_get_2783_._set_name(u'get') + PyJs_Object_2782_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2783_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isImmutable'), PyJs_Object_2782_) + var.put(u'_converters', var.get(u'require')(Js(u'./converters'))) + @Js + def PyJs_get_2785_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2785_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toComputedKey') + PyJs_get_2785_._set_name(u'get') + PyJs_Object_2784_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2785_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toComputedKey'), PyJs_Object_2784_) + @Js + def PyJs_get_2787_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2787_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toSequenceExpression') + PyJs_get_2787_._set_name(u'get') + PyJs_Object_2786_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2787_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toSequenceExpression'), PyJs_Object_2786_) + @Js + def PyJs_get_2789_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2789_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toKeyAlias') + PyJs_get_2789_._set_name(u'get') + PyJs_Object_2788_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2789_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toKeyAlias'), PyJs_Object_2788_) + @Js + def PyJs_get_2791_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2791_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toIdentifier') + PyJs_get_2791_._set_name(u'get') + PyJs_Object_2790_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2791_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toIdentifier'), PyJs_Object_2790_) + @Js + def PyJs_get_2793_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2793_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toBindingIdentifierName') + PyJs_get_2793_._set_name(u'get') + PyJs_Object_2792_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2793_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toBindingIdentifierName'), PyJs_Object_2792_) + @Js + def PyJs_get_2795_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2795_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toStatement') + PyJs_get_2795_._set_name(u'get') + PyJs_Object_2794_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2795_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toStatement'), PyJs_Object_2794_) + @Js + def PyJs_get_2797_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2797_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toExpression') + PyJs_get_2797_._set_name(u'get') + PyJs_Object_2796_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2797_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toExpression'), PyJs_Object_2796_) + @Js + def PyJs_get_2799_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2799_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toBlock') + PyJs_get_2799_._set_name(u'get') + PyJs_Object_2798_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2799_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toBlock'), PyJs_Object_2798_) + @Js + def PyJs_get_2801_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2801_}, var) + var.registers([]) + return var.get(u'_converters').get(u'valueToNode') + PyJs_get_2801_._set_name(u'get') + PyJs_Object_2800_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2801_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'valueToNode'), PyJs_Object_2800_) + var.put(u'_flow', var.get(u'require')(Js(u'./flow'))) + @Js + def PyJs_get_2803_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2803_}, var) + var.registers([]) + return var.get(u'_flow').get(u'createUnionTypeAnnotation') + PyJs_get_2803_._set_name(u'get') + PyJs_Object_2802_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2803_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'createUnionTypeAnnotation'), PyJs_Object_2802_) + @Js + def PyJs_get_2805_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2805_}, var) + var.registers([]) + return var.get(u'_flow').get(u'removeTypeDuplicates') + PyJs_get_2805_._set_name(u'get') + PyJs_Object_2804_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2805_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'removeTypeDuplicates'), PyJs_Object_2804_) + @Js + def PyJs_get_2807_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2807_}, var) + var.registers([]) + return var.get(u'_flow').get(u'createTypeAnnotationBasedOnTypeof') + PyJs_get_2807_._set_name(u'get') + PyJs_Object_2806_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2807_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'createTypeAnnotationBasedOnTypeof'), PyJs_Object_2806_) + var.put(u'_toFastProperties', var.get(u'require')(Js(u'to-fast-properties'))) + var.put(u'_toFastProperties2', var.get(u'_interopRequireDefault')(var.get(u'_toFastProperties'))) + var.put(u'_compact', var.get(u'require')(Js(u'lodash/compact'))) + var.put(u'_compact2', var.get(u'_interopRequireDefault')(var.get(u'_compact'))) + var.put(u'_clone', var.get(u'require')(Js(u'lodash/clone'))) + var.put(u'_clone2', var.get(u'_interopRequireDefault')(var.get(u'_clone'))) + var.put(u'_each', var.get(u'require')(Js(u'lodash/each'))) + var.put(u'_each2', var.get(u'_interopRequireDefault')(var.get(u'_each'))) + var.put(u'_uniq', var.get(u'require')(Js(u'lodash/uniq'))) + var.put(u'_uniq2', var.get(u'_interopRequireDefault')(var.get(u'_uniq'))) + var.get(u'require')(Js(u'./definitions/init')) + var.put(u'_definitions', var.get(u'require')(Js(u'./definitions'))) + var.put(u'_react2', var.get(u'require')(Js(u'./react'))) + var.put(u'_react', var.get(u'_interopRequireWildcard')(var.get(u'_react2'))) + pass + pass + var.put(u't', var.get(u'exports')) + pass + var.get(u'exports').put(u'VISITOR_KEYS', var.get(u'_definitions').get(u'VISITOR_KEYS')) + var.get(u'exports').put(u'ALIAS_KEYS', var.get(u'_definitions').get(u'ALIAS_KEYS')) + var.get(u'exports').put(u'NODE_FIELDS', var.get(u'_definitions').get(u'NODE_FIELDS')) + var.get(u'exports').put(u'BUILDER_KEYS', var.get(u'_definitions').get(u'BUILDER_KEYS')) + var.get(u'exports').put(u'DEPRECATED_KEYS', var.get(u'_definitions').get(u'DEPRECATED_KEYS')) + var.get(u'exports').put(u'react', var.get(u'_react')) + for PyJsTemp in var.get(u't').get(u'VISITOR_KEYS'): + var.put(u'type', PyJsTemp) + var.get(u'registerType')(var.get(u'type')) + PyJs_Object_2813_ = Js({}) + var.get(u't').put(u'FLIPPED_ALIAS_KEYS', PyJs_Object_2813_) + @Js + def PyJs_anonymous_2814_(aliases, type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'aliases':aliases}, var) + var.registers([u'type', u'aliases']) + @Js + def PyJs_anonymous_2815_(alias, this, arguments, var=var): + var = Scope({u'this':this, u'alias':alias, u'arguments':arguments}, var) + var.registers([u'alias', u'types']) + var.put(u'types', var.get(u't').get(u'FLIPPED_ALIAS_KEYS').put(var.get(u'alias'), (var.get(u't').get(u'FLIPPED_ALIAS_KEYS').get(var.get(u'alias')) or Js([])))) + var.get(u'types').callprop(u'push', var.get(u'type')) + PyJs_anonymous_2815_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(var.get(u'aliases'), PyJs_anonymous_2815_) + PyJs_anonymous_2814_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(var.get(u't').get(u'ALIAS_KEYS'), PyJs_anonymous_2814_) + @Js + def PyJs_anonymous_2816_(types, type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'types':types}, var) + var.registers([u'type', u'types']) + var.get(u't').put((var.get(u'type').callprop(u'toUpperCase')+Js(u'_TYPES')), var.get(u'types')) + var.get(u'registerType')(var.get(u'type')) + PyJs_anonymous_2816_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(var.get(u't').get(u'FLIPPED_ALIAS_KEYS'), PyJs_anonymous_2816_) + var.put(u'TYPES', var.get(u'exports').put(u'TYPES', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u't').get(u'VISITOR_KEYS')).callprop(u'concat', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u't').get(u'FLIPPED_ALIAS_KEYS'))).callprop(u'concat', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u't').get(u'DEPRECATED_KEYS'))))) + pass + pass + @Js + def PyJs_anonymous_2817_(keys, type, this, arguments, var=var): + var = Scope({u'keys':keys, u'this':this, u'type':type, u'arguments':arguments}, var) + var.registers([u'keys', u'builder', u'type']) + @Js + def PyJsHoisted_builder_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray2', u'field', u'i', u'_ref2', u'_i2', u'_key', u'key', u'arg', u'_iterator2']) + if (var.get(u'arguments').get(u'length')>var.get(u'keys').get(u'length')): + PyJsTempException = JsToPyException(var.get(u'Error').create((((((Js(u't.')+var.get(u'type'))+Js(u': Too many arguments passed. Received '))+var.get(u'arguments').get(u'length'))+Js(u' but can receive '))+(Js(u'no more than ')+var.get(u'keys').get(u'length'))))) + raise PyJsTempException + PyJs_Object_2818_ = Js({}) + var.put(u'node', PyJs_Object_2818_) + var.get(u'node').put(u'type', var.get(u'type')) + var.put(u'i', Js(0.0)) + #for JS loop + var.put(u'_iterator2', var.get(u'keys')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'_key', var.get(u'_ref2')) + var.put(u'field', var.get(u't').get(u'NODE_FIELDS').get(var.get(u'type')).get(var.get(u'_key'))) + var.put(u'arg', var.get(u'arguments').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + if PyJsStrictEq(var.get(u'arg'),var.get(u'undefined')): + var.put(u'arg', PyJsComma(Js(0.0),var.get(u'_clone2').get(u'default'))(var.get(u'field').get(u'default'))) + var.get(u'node').put(var.get(u'_key'), var.get(u'arg')) + + for PyJsTemp in var.get(u'node'): + var.put(u'key', PyJsTemp) + var.get(u'validate')(var.get(u'node'), var.get(u'key'), var.get(u'node').get(var.get(u'key'))) + return var.get(u'node') + PyJsHoisted_builder_.func_name = u'builder' + var.put(u'builder', PyJsHoisted_builder_) + pass + var.get(u't').put(var.get(u'type'), var.get(u'builder')) + var.get(u't').put((var.get(u'type').get(u'0').callprop(u'toLowerCase')+var.get(u'type').callprop(u'slice', Js(1.0))), var.get(u'builder')) + PyJs_anonymous_2817_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(var.get(u't').get(u'BUILDER_KEYS'), PyJs_anonymous_2817_) + @Js + def PyJs__loop_2819_(_type, this, arguments, var=var): + var = Scope({u'this':this, u'_type':_type, u'_loop':PyJs__loop_2819_, u'arguments':arguments}, var) + var.registers([u'_type', u'newType', u'proxy']) + @Js + def PyJsHoisted_proxy_(fn, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'fn':fn}, var) + var.registers([u'fn']) + @Js + def PyJs_anonymous_2820_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'console').callprop(u'trace', (((Js(u'The node type ')+var.get(u'_type'))+Js(u' has been renamed to '))+var.get(u'newType'))) + return var.get(u'fn').callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + PyJs_anonymous_2820_._set_name(u'anonymous') + return PyJs_anonymous_2820_ + PyJsHoisted_proxy_.func_name = u'proxy' + var.put(u'proxy', PyJsHoisted_proxy_) + var.put(u'newType', var.get(u't').get(u'DEPRECATED_KEYS').get(var.get(u'_type'))) + pass + var.get(u't').put(var.get(u'_type'), var.get(u't').put((var.get(u'_type').get(u'0').callprop(u'toLowerCase')+var.get(u'_type').callprop(u'slice', Js(1.0))), var.get(u'proxy')(var.get(u't').get(var.get(u'newType'))))) + var.get(u't').put((Js(u'is')+var.get(u'_type')), var.get(u'proxy')(var.get(u't').get((Js(u'is')+var.get(u'newType'))))) + var.get(u't').put((Js(u'assert')+var.get(u'_type')), var.get(u'proxy')(var.get(u't').get((Js(u'assert')+var.get(u'newType'))))) + PyJs__loop_2819_._set_name(u'_loop') + var.put(u'_loop', PyJs__loop_2819_) + for PyJsTemp in var.get(u't').get(u'DEPRECATED_KEYS'): + var.put(u'_type', PyJsTemp) + var.get(u'_loop')(var.get(u'_type')) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + PyJsComma(Js(0.0),var.get(u'_toFastProperties2').get(u'default'))(var.get(u't')) + PyJsComma(Js(0.0),var.get(u'_toFastProperties2').get(u'default'))(var.get(u't').get(u'VISITOR_KEYS')) + pass + var.put(u'CLEAR_KEYS', Js([Js(u'tokens'), Js(u'start'), Js(u'end'), Js(u'loc'), Js(u'raw'), Js(u'rawValue')])) + var.put(u'CLEAR_KEYS_PLUS_COMMENTS', var.get(u't').get(u'COMMENT_KEYS').callprop(u'concat', Js([Js(u'comments')])).callprop(u'concat', var.get(u'CLEAR_KEYS'))) + pass + pass +PyJs_anonymous_2718_._set_name(u'anonymous') +PyJs_Object_2826_ = Js({u'./constants':Js(247.0),u'./converters':Js(248.0),u'./definitions':Js(253.0),u'./definitions/init':Js(254.0),u'./flow':Js(257.0),u'./react':Js(259.0),u'./retrievers':Js(260.0),u'./validators':Js(261.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/json/stringify':Js(97.0),u'babel-runtime/core-js/object/get-own-property-symbols':Js(102.0),u'babel-runtime/core-js/object/keys':Js(103.0),u'lodash/clone':Js(438.0),u'lodash/compact':Js(441.0),u'lodash/each':Js(443.0),u'lodash/uniq':Js(495.0),u'to-fast-properties':Js(522.0)}) +@Js +def PyJs_anonymous_2827_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'_index', u'cleanJSXElementLiteralChild', u'require', u'module', u'buildChildren', u't', u'isReactComponent', u'isCompatTag']) + @Js + def PyJsHoisted_cleanJSXElementLiteralChild_(child, args, this, arguments, var=var): + var = Scope({u'this':this, u'args':args, u'arguments':arguments, u'child':child}, var) + var.registers([u'isLastNonEmptyLine', u'str', u'i', u'isLastLine', u'args', u'lines', u'lastNonEmptyLine', u'isFirstLine', u'_i', u'child', u'line', u'trimmedLine']) + var.put(u'lines', var.get(u'child').get(u'value').callprop(u'split', JsRegExp(u'/\\r\\n|\\n|\\r/'))) + var.put(u'lastNonEmptyLine', Js(0.0)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'lines').get(u'length')): + try: + if var.get(u'lines').get(var.get(u'i')).callprop(u'match', JsRegExp(u'/[^ \\t]/')): + var.put(u'lastNonEmptyLine', var.get(u'i')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.put(u'str', Js(u'')) + #for JS loop + var.put(u'_i', Js(0.0)) + while (var.get(u'_i')<var.get(u'lines').get(u'length')): + try: + var.put(u'line', var.get(u'lines').get(var.get(u'_i'))) + var.put(u'isFirstLine', PyJsStrictEq(var.get(u'_i'),Js(0.0))) + var.put(u'isLastLine', PyJsStrictEq(var.get(u'_i'),(var.get(u'lines').get(u'length')-Js(1.0)))) + var.put(u'isLastNonEmptyLine', PyJsStrictEq(var.get(u'_i'),var.get(u'lastNonEmptyLine'))) + var.put(u'trimmedLine', var.get(u'line').callprop(u'replace', JsRegExp(u'/\\t/g'), Js(u' '))) + if var.get(u'isFirstLine').neg(): + var.put(u'trimmedLine', var.get(u'trimmedLine').callprop(u'replace', JsRegExp(u'/^[ ]+/'), Js(u''))) + if var.get(u'isLastLine').neg(): + var.put(u'trimmedLine', var.get(u'trimmedLine').callprop(u'replace', JsRegExp(u'/[ ]+$/'), Js(u''))) + if var.get(u'trimmedLine'): + if var.get(u'isLastNonEmptyLine').neg(): + var.put(u'trimmedLine', Js(u' '), u'+') + var.put(u'str', var.get(u'trimmedLine'), u'+') + finally: + (var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)) + if var.get(u'str'): + var.get(u'args').callprop(u'push', var.get(u't').callprop(u'stringLiteral', var.get(u'str'))) + PyJsHoisted_cleanJSXElementLiteralChild_.func_name = u'cleanJSXElementLiteralChild' + var.put(u'cleanJSXElementLiteralChild', PyJsHoisted_cleanJSXElementLiteralChild_) + @Js + def PyJsHoisted_buildChildren_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'node', u'elems', u'child']) + var.put(u'elems', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'node').get(u'children').get(u'length')): + try: + var.put(u'child', var.get(u'node').get(u'children').get(var.get(u'i'))) + if var.get(u't').callprop(u'isJSXText', var.get(u'child')): + var.get(u'cleanJSXElementLiteralChild')(var.get(u'child'), var.get(u'elems')) + continue + if var.get(u't').callprop(u'isJSXExpressionContainer', var.get(u'child')): + var.put(u'child', var.get(u'child').get(u'expression')) + if var.get(u't').callprop(u'isJSXEmptyExpression', var.get(u'child')): + continue + var.get(u'elems').callprop(u'push', var.get(u'child')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'elems') + PyJsHoisted_buildChildren_.func_name = u'buildChildren' + var.put(u'buildChildren', PyJsHoisted_buildChildren_) + @Js + def PyJsHoisted_isCompatTag_(tagName, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'tagName':tagName}, var) + var.registers([u'tagName']) + return (var.get(u'tagName').neg().neg() and JsRegExp(u'/^[a-z]|\\-/').callprop(u'test', var.get(u'tagName'))) + PyJsHoisted_isCompatTag_.func_name = u'isCompatTag' + var.put(u'isCompatTag', PyJsHoisted_isCompatTag_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2828_ = Js({}) + var.put(u'newObj', PyJs_Object_2828_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'isReactComponent', var.get(u'undefined')) + var.get(u'exports').put(u'isCompatTag', var.get(u'isCompatTag')) + var.get(u'exports').put(u'buildChildren', var.get(u'buildChildren')) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_index'))) + pass + var.put(u'isReactComponent', var.get(u'exports').put(u'isReactComponent', var.get(u't').callprop(u'buildMatchMemberExpression', Js(u'React.Component')))) + pass + pass + pass +PyJs_anonymous_2827_._set_name(u'anonymous') +PyJs_Object_2829_ = Js({u'./index':Js(258.0)}) +@Js +def PyJs_anonymous_2830_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_create', u'exports', u'_interopRequireWildcard', u'_index', u'getBindingIdentifiers', u'require', u'module', u'_create2', u'getOuterBindingIdentifiers', u't', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2832_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2832_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_getBindingIdentifiers_(node, duplicates, outerOnly, this, arguments, var=var): + var = Scope({u'node':node, u'duplicates':duplicates, u'this':this, u'arguments':arguments, u'outerOnly':outerOnly}, var) + var.registers([u'node', u'search', u'duplicates', u'outerOnly', u'keys', u'ids', u'i', u'key', u'id', u'_ids']) + var.put(u'search', Js([]).callprop(u'concat', var.get(u'node'))) + var.put(u'ids', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + while var.get(u'search').get(u'length'): + var.put(u'id', var.get(u'search').callprop(u'shift')) + if var.get(u'id').neg(): + continue + var.put(u'keys', var.get(u't').get(u'getBindingIdentifiers').get(u'keys').get(var.get(u'id').get(u'type'))) + if var.get(u't').callprop(u'isIdentifier', var.get(u'id')): + if var.get(u'duplicates'): + var.put(u'_ids', var.get(u'ids').put(var.get(u'id').get(u'name'), (var.get(u'ids').get(var.get(u'id').get(u'name')) or Js([])))) + var.get(u'_ids').callprop(u'push', var.get(u'id')) + else: + var.get(u'ids').put(var.get(u'id').get(u'name'), var.get(u'id')) + continue + if var.get(u't').callprop(u'isExportDeclaration', var.get(u'id')): + if var.get(u't').callprop(u'isDeclaration', var.get(u'node').get(u'declaration')): + var.get(u'search').callprop(u'push', var.get(u'node').get(u'declaration')) + continue + if var.get(u'outerOnly'): + if var.get(u't').callprop(u'isFunctionDeclaration', var.get(u'id')): + var.get(u'search').callprop(u'push', var.get(u'id').get(u'id')) + continue + if var.get(u't').callprop(u'isFunctionExpression', var.get(u'id')): + continue + if var.get(u'keys'): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'keys').get(u'length')): + try: + var.put(u'key', var.get(u'keys').get(var.get(u'i'))) + if var.get(u'id').get(var.get(u'key')): + var.put(u'search', var.get(u'search').callprop(u'concat', var.get(u'id').get(var.get(u'key')))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'ids') + PyJsHoisted_getBindingIdentifiers_.func_name = u'getBindingIdentifiers' + var.put(u'getBindingIdentifiers', PyJsHoisted_getBindingIdentifiers_) + @Js + def PyJsHoisted_getOuterBindingIdentifiers_(node, duplicates, this, arguments, var=var): + var = Scope({u'node':node, u'duplicates':duplicates, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'duplicates']) + return var.get(u'getBindingIdentifiers')(var.get(u'node'), var.get(u'duplicates'), var.get(u'true')) + PyJsHoisted_getOuterBindingIdentifiers_.func_name = u'getOuterBindingIdentifiers' + var.put(u'getOuterBindingIdentifiers', PyJsHoisted_getOuterBindingIdentifiers_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2831_ = Js({}) + var.put(u'newObj', PyJs_Object_2831_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_create', var.get(u'require')(Js(u'babel-runtime/core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + var.get(u'exports').put(u'getBindingIdentifiers', var.get(u'getBindingIdentifiers')) + var.get(u'exports').put(u'getOuterBindingIdentifiers', var.get(u'getOuterBindingIdentifiers')) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_index'))) + pass + pass + pass + PyJs_Object_2833_ = Js({u'DeclareClass':Js([Js(u'id')]),u'DeclareFunction':Js([Js(u'id')]),u'DeclareModule':Js([Js(u'id')]),u'DeclareVariable':Js([Js(u'id')]),u'InterfaceDeclaration':Js([Js(u'id')]),u'TypeAlias':Js([Js(u'id')]),u'CatchClause':Js([Js(u'param')]),u'LabeledStatement':Js([Js(u'label')]),u'UnaryExpression':Js([Js(u'argument')]),u'AssignmentExpression':Js([Js(u'left')]),u'ImportSpecifier':Js([Js(u'local')]),u'ImportNamespaceSpecifier':Js([Js(u'local')]),u'ImportDefaultSpecifier':Js([Js(u'local')]),u'ImportDeclaration':Js([Js(u'specifiers')]),u'ExportSpecifier':Js([Js(u'exported')]),u'ExportNamespaceSpecifier':Js([Js(u'exported')]),u'ExportDefaultSpecifier':Js([Js(u'exported')]),u'FunctionDeclaration':Js([Js(u'id'), Js(u'params')]),u'FunctionExpression':Js([Js(u'id'), Js(u'params')]),u'ClassDeclaration':Js([Js(u'id')]),u'ClassExpression':Js([Js(u'id')]),u'RestElement':Js([Js(u'argument')]),u'UpdateExpression':Js([Js(u'argument')]),u'RestProperty':Js([Js(u'argument')]),u'ObjectProperty':Js([Js(u'value')]),u'AssignmentPattern':Js([Js(u'left')]),u'ArrayPattern':Js([Js(u'elements')]),u'ObjectPattern':Js([Js(u'properties')]),u'VariableDeclaration':Js([Js(u'declarations')]),u'VariableDeclarator':Js([Js(u'id')])}) + var.get(u'getBindingIdentifiers').put(u'keys', PyJs_Object_2833_) + pass +PyJs_anonymous_2830_._set_name(u'anonymous') +PyJs_Object_2834_ = Js({u'./index':Js(258.0),u'babel-runtime/core-js/object/create':Js(101.0)}) +@Js +def PyJs_anonymous_2835_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_constants', u'module', u'isVar', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_esutils2', u'isImmutable', u'isReferenced', u'isValidIdentifier', u'exports', u'isScope', u'_interopRequireWildcard', u'isBinding', u'_esutils', u'isSpecifierDefault', u'isBlockScoped', u'_retrievers', u'_index', u'require', u't', u'isLet']) + @Js + def PyJsHoisted_isScope_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + PyJs_Object_2840_ = Js({u'body':var.get(u'node')}) + if (var.get(u't').callprop(u'isBlockStatement', var.get(u'node')) and var.get(u't').callprop(u'isFunction', var.get(u'parent'), PyJs_Object_2840_)): + return Js(False) + return var.get(u't').callprop(u'isScopable', var.get(u'node')) + PyJsHoisted_isScope_.func_name = u'isScope' + var.put(u'isScope', PyJsHoisted_isScope_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2836_ = Js({}) + var.put(u'newObj', PyJs_Object_2836_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_isImmutable_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u't').callprop(u'isType', var.get(u'node').get(u'type'), Js(u'Immutable')): + return var.get(u'true') + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + if PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'undefined')): + return var.get(u'true') + else: + return Js(False) + return Js(False) + PyJsHoisted_isImmutable_.func_name = u'isImmutable' + var.put(u'isImmutable', PyJsHoisted_isImmutable_) + @Js + def PyJsHoisted_isBinding_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'val', u'parent', u'keys', u'i', u'key']) + var.put(u'keys', var.get(u'_retrievers').get(u'getBindingIdentifiers').get(u'keys').get(var.get(u'parent').get(u'type'))) + if var.get(u'keys'): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'keys').get(u'length')): + try: + var.put(u'key', var.get(u'keys').get(var.get(u'i'))) + var.put(u'val', var.get(u'parent').get(var.get(u'key'))) + if var.get(u'Array').callprop(u'isArray', var.get(u'val')): + if (var.get(u'val').callprop(u'indexOf', var.get(u'node'))>=Js(0.0)): + return var.get(u'true') + else: + if PyJsStrictEq(var.get(u'val'),var.get(u'node')): + return var.get(u'true') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return Js(False) + PyJsHoisted_isBinding_.func_name = u'isBinding' + var.put(u'isBinding', PyJsHoisted_isBinding_) + @Js + def PyJsHoisted_isReferenced_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'parent', u'param', u'_i', u'_ref']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'parent').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'BindExpression')): + SWITCHED = True + return (PyJsStrictEq(var.get(u'parent').get(u'object'),var.get(u'node')) or PyJsStrictEq(var.get(u'parent').get(u'callee'),var.get(u'node'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'MemberExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'JSXMemberExpression')): + SWITCHED = True + if (PyJsStrictEq(var.get(u'parent').get(u'property'),var.get(u'node')) and var.get(u'parent').get(u'computed')): + return var.get(u'true') + else: + if PyJsStrictEq(var.get(u'parent').get(u'object'),var.get(u'node')): + return var.get(u'true') + else: + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'MetaProperty')): + SWITCHED = True + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectProperty')): + SWITCHED = True + if PyJsStrictEq(var.get(u'parent').get(u'key'),var.get(u'node')): + return var.get(u'parent').get(u'computed') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'VariableDeclarator')): + SWITCHED = True + return PyJsStrictNeq(var.get(u'parent').get(u'id'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ArrowFunctionExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'FunctionDeclaration')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'FunctionExpression')): + SWITCHED = True + #for JS loop + var.put(u'_iterator', var.get(u'parent').get(u'params')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'param', var.get(u'_ref')) + if PyJsStrictEq(var.get(u'param'),var.get(u'node')): + return Js(False) + + return PyJsStrictNeq(var.get(u'parent').get(u'id'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ExportSpecifier')): + SWITCHED = True + if var.get(u'parent').get(u'source'): + return Js(False) + else: + return PyJsStrictEq(var.get(u'parent').get(u'local'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ExportNamespaceSpecifier')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ExportDefaultSpecifier')): + SWITCHED = True + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'JSXAttribute')): + SWITCHED = True + return PyJsStrictNeq(var.get(u'parent').get(u'name'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ClassProperty')): + SWITCHED = True + if PyJsStrictEq(var.get(u'parent').get(u'key'),var.get(u'node')): + return var.get(u'parent').get(u'computed') + else: + return PyJsStrictEq(var.get(u'parent').get(u'value'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ImportDefaultSpecifier')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ImportNamespaceSpecifier')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ImportSpecifier')): + SWITCHED = True + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ClassDeclaration')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ClassExpression')): + SWITCHED = True + return PyJsStrictNeq(var.get(u'parent').get(u'id'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ClassMethod')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectMethod')): + SWITCHED = True + return (PyJsStrictEq(var.get(u'parent').get(u'key'),var.get(u'node')) and var.get(u'parent').get(u'computed')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'LabeledStatement')): + SWITCHED = True + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'CatchClause')): + SWITCHED = True + return PyJsStrictNeq(var.get(u'parent').get(u'param'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'RestElement')): + SWITCHED = True + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'AssignmentExpression')): + SWITCHED = True + return PyJsStrictEq(var.get(u'parent').get(u'right'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'AssignmentPattern')): + SWITCHED = True + return PyJsStrictEq(var.get(u'parent').get(u'right'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectPattern')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ArrayPattern')): + SWITCHED = True + return Js(False) + SWITCHED = True + break + return var.get(u'true') + PyJsHoisted_isReferenced_.func_name = u'isReferenced' + var.put(u'isReferenced', PyJsHoisted_isReferenced_) + @Js + def PyJsHoisted_isValidIdentifier_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + if (PyJsStrictNeq(var.get(u'name',throw=False).typeof(),Js(u'string')) or var.get(u'_esutils2').get(u'default').get(u'keyword').callprop(u'isReservedWordES6', var.get(u'name'), var.get(u'true'))): + return Js(False) + else: + return var.get(u'_esutils2').get(u'default').get(u'keyword').callprop(u'isIdentifierNameES6', var.get(u'name')) + PyJsHoisted_isValidIdentifier_.func_name = u'isValidIdentifier' + var.put(u'isValidIdentifier', PyJsHoisted_isValidIdentifier_) + @Js + def PyJsHoisted_isVar_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + PyJs_Object_2838_ = Js({u'kind':Js(u'var')}) + return (var.get(u't').callprop(u'isVariableDeclaration', var.get(u'node'), PyJs_Object_2838_) and var.get(u'node').get(var.get(u'_constants').get(u'BLOCK_SCOPED_SYMBOL')).neg()) + PyJsHoisted_isVar_.func_name = u'isVar' + var.put(u'isVar', PyJsHoisted_isVar_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2837_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2837_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_isLet_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return (var.get(u't').callprop(u'isVariableDeclaration', var.get(u'node')) and (PyJsStrictNeq(var.get(u'node').get(u'kind'),Js(u'var')) or var.get(u'node').get(var.get(u'_constants').get(u'BLOCK_SCOPED_SYMBOL')))) + PyJsHoisted_isLet_.func_name = u'isLet' + var.put(u'isLet', PyJsHoisted_isLet_) + @Js + def PyJsHoisted_isSpecifierDefault_(specifier, this, arguments, var=var): + var = Scope({u'this':this, u'specifier':specifier, u'arguments':arguments}, var) + var.registers([u'specifier']) + PyJs_Object_2839_ = Js({u'name':Js(u'default')}) + return (var.get(u't').callprop(u'isImportDefaultSpecifier', var.get(u'specifier')) or var.get(u't').callprop(u'isIdentifier', (var.get(u'specifier').get(u'imported') or var.get(u'specifier').get(u'exported')), PyJs_Object_2839_)) + PyJsHoisted_isSpecifierDefault_.func_name = u'isSpecifierDefault' + var.put(u'isSpecifierDefault', PyJsHoisted_isSpecifierDefault_) + @Js + def PyJsHoisted_isBlockScoped_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return ((var.get(u't').callprop(u'isFunctionDeclaration', var.get(u'node')) or var.get(u't').callprop(u'isClassDeclaration', var.get(u'node'))) or var.get(u't').callprop(u'isLet', var.get(u'node'))) + PyJsHoisted_isBlockScoped_.func_name = u'isBlockScoped' + var.put(u'isBlockScoped', PyJsHoisted_isBlockScoped_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'isBinding', var.get(u'isBinding')) + var.get(u'exports').put(u'isReferenced', var.get(u'isReferenced')) + var.get(u'exports').put(u'isValidIdentifier', var.get(u'isValidIdentifier')) + var.get(u'exports').put(u'isLet', var.get(u'isLet')) + var.get(u'exports').put(u'isBlockScoped', var.get(u'isBlockScoped')) + var.get(u'exports').put(u'isVar', var.get(u'isVar')) + var.get(u'exports').put(u'isSpecifierDefault', var.get(u'isSpecifierDefault')) + var.get(u'exports').put(u'isScope', var.get(u'isScope')) + var.get(u'exports').put(u'isImmutable', var.get(u'isImmutable')) + var.put(u'_retrievers', var.get(u'require')(Js(u'./retrievers'))) + var.put(u'_esutils', var.get(u'require')(Js(u'esutils'))) + var.put(u'_esutils2', var.get(u'_interopRequireDefault')(var.get(u'_esutils'))) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_index'))) + var.put(u'_constants', var.get(u'require')(Js(u'./constants'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_2835_._set_name(u'anonymous') +PyJs_Object_2841_ = Js({u'./constants':Js(247.0),u'./index':Js(258.0),u'./retrievers':Js(260.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'esutils':Js(276.0)}) +@Js +def PyJs_anonymous_2842_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'TokContext', u'reservedWords', u'parse$1', u'pp$4', u'isKeyword$1', u'getLineInfo', u'astralIdentifierStartCodes', u'isNewLine', u'module', u'_typeof', u'isIdentifierChar', u'State', u'plugins', u'keywords', u'getOptions', u'Node', u'pp$8', u'isIdentifierStart', u'TokenType', u'types$1', u'beforeExpr', u'nonASCIIidentifierStartChars', u'DECIMAL_NUMBER', u'_inherits', u'flowPlugin', u'_possibleConstructorReturn', u'commentKeys', u'XHTMLEntities', u'isInAstralSet', u'empty', u'astralIdentifierCodes', u'exports', u'nonASCIIidentifierChars', u'binop', u'startsExpr', u'lineBreakG', u'pp', u'jsxPlugin', u'_classCallCheck$6', u'_classCallCheck$4', u'_classCallCheck$5', u'_classCallCheck$2', u'_classCallCheck$3', u'_classCallCheck$1', u'Position', u'getQualifiedJSXName', u'types', u'switchLabel', u'nonASCIIidentifier', u'lineBreak', u'HEX_NUMBER', u'last', u'loopLabel', u'Tokenizer', u'defaultOptions', u'_classCallCheck', u'require', u'Parser', u'Token', u'nonASCIIidentifierStart', u'makePredicate', u'nonASCIIwhitespace', u'kw', u'codePointToString', u'finishNodeAt', u'pp$1', u'pp$2', u'pp$3', u'SourceLocation', u'pp$5', u'pp$6', u'pp$7']) + @Js + def PyJsHoisted_codePointToString_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments}, var) + var.registers([u'code']) + if (var.get(u'code')<=Js(65535)): + return var.get(u'String').callprop(u'fromCharCode', var.get(u'code')) + else: + return var.get(u'String').callprop(u'fromCharCode', (((var.get(u'code')-Js(65536))>>Js(10.0))+Js(55296)), (((var.get(u'code')-Js(65536))&Js(1023.0))+Js(56320))) + PyJsHoisted_codePointToString_.func_name = u'codePointToString' + var.put(u'codePointToString', PyJsHoisted_codePointToString_) + @Js + def PyJsHoisted_isNewLine_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments}, var) + var.registers([u'code']) + return (((PyJsStrictEq(var.get(u'code'),Js(10.0)) or PyJsStrictEq(var.get(u'code'),Js(13.0))) or PyJsStrictEq(var.get(u'code'),Js(8232))) or PyJsStrictEq(var.get(u'code'),Js(8233))) + PyJsHoisted_isNewLine_.func_name = u'isNewLine' + var.put(u'isNewLine', PyJsHoisted_isNewLine_) + @Js + def PyJsHoisted_isIdentifierChar_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments}, var) + var.registers([u'code']) + if (var.get(u'code')<Js(48.0)): + return PyJsStrictEq(var.get(u'code'),Js(36.0)) + if (var.get(u'code')<Js(58.0)): + return var.get(u'true') + if (var.get(u'code')<Js(65.0)): + return Js(False) + if (var.get(u'code')<Js(91.0)): + return var.get(u'true') + if (var.get(u'code')<Js(97.0)): + return PyJsStrictEq(var.get(u'code'),Js(95.0)) + if (var.get(u'code')<Js(123.0)): + return var.get(u'true') + if (var.get(u'code')<=Js(65535)): + return ((var.get(u'code')>=Js(170)) and var.get(u'nonASCIIidentifier').callprop(u'test', var.get(u'String').callprop(u'fromCharCode', var.get(u'code')))) + return (var.get(u'isInAstralSet')(var.get(u'code'), var.get(u'astralIdentifierStartCodes')) or var.get(u'isInAstralSet')(var.get(u'code'), var.get(u'astralIdentifierCodes'))) + PyJsHoisted_isIdentifierChar_.func_name = u'isIdentifierChar' + var.put(u'isIdentifierChar', PyJsHoisted_isIdentifierChar_) + @Js + def PyJsHoisted_getOptions_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'opts', u'options', u'key']) + PyJs_Object_2847_ = Js({}) + var.put(u'options', PyJs_Object_2847_) + for PyJsTemp in var.get(u'defaultOptions'): + var.put(u'key', PyJsTemp) + var.get(u'options').put(var.get(u'key'), (var.get(u'opts').get(var.get(u'key')) if (var.get(u'opts') and var.get(u'opts').contains(var.get(u'key'))) else var.get(u'defaultOptions').get(var.get(u'key')))) + return var.get(u'options') + PyJsHoisted_getOptions_.func_name = u'getOptions' + var.put(u'getOptions', PyJsHoisted_getOptions_) + @Js + def PyJsHoisted_isIdentifierStart_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments}, var) + var.registers([u'code']) + if (var.get(u'code')<Js(65.0)): + return PyJsStrictEq(var.get(u'code'),Js(36.0)) + if (var.get(u'code')<Js(91.0)): + return var.get(u'true') + if (var.get(u'code')<Js(97.0)): + return PyJsStrictEq(var.get(u'code'),Js(95.0)) + if (var.get(u'code')<Js(123.0)): + return var.get(u'true') + if (var.get(u'code')<=Js(65535)): + return ((var.get(u'code')>=Js(170)) and var.get(u'nonASCIIidentifierStart').callprop(u'test', var.get(u'String').callprop(u'fromCharCode', var.get(u'code')))) + return var.get(u'isInAstralSet')(var.get(u'code'), var.get(u'astralIdentifierStartCodes')) + PyJsHoisted_isIdentifierStart_.func_name = u'isIdentifierStart' + var.put(u'isIdentifierStart', PyJsHoisted_isIdentifierStart_) + @Js + def PyJsHoisted__inherits_(subClass, superClass, this, arguments, var=var): + var = Scope({u'this':this, u'superClass':superClass, u'subClass':subClass, u'arguments':arguments}, var) + var.registers([u'superClass', u'subClass']) + if (PyJsStrictNeq(var.get(u'superClass',throw=False).typeof(),Js(u'function')) and PyJsStrictNeq(var.get(u'superClass'),var.get(u"null"))): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Super expression must either be null or a function, not ')+var.get(u'superClass',throw=False).typeof()))) + raise PyJsTempException + PyJs_Object_2937_ = Js({u'value':var.get(u'subClass'),u'enumerable':Js(False),u'writable':var.get(u'true'),u'configurable':var.get(u'true')}) + PyJs_Object_2936_ = Js({u'constructor':PyJs_Object_2937_}) + var.get(u'subClass').put(u'prototype', var.get(u'Object').callprop(u'create', (var.get(u'superClass') and var.get(u'superClass').get(u'prototype')), PyJs_Object_2936_)) + if var.get(u'superClass'): + (var.get(u'Object').callprop(u'setPrototypeOf', var.get(u'subClass'), var.get(u'superClass')) if var.get(u'Object').get(u'setPrototypeOf') else var.get(u'subClass').put(u'__proto__', var.get(u'superClass'))) + PyJsHoisted__inherits_.func_name = u'_inherits' + var.put(u'_inherits', PyJsHoisted__inherits_) + @Js + def PyJsHoisted__possibleConstructorReturn_(self, call, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'call':call, u'arguments':arguments}, var) + var.registers([u'self', u'call']) + if var.get(u'self').neg(): + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create(Js(u"this hasn't been initialised - super() hasn't been called"))) + raise PyJsTempException + return (var.get(u'call') if (var.get(u'call') and (PyJsStrictEq(var.get(u'call',throw=False).typeof(),Js(u'object')) or PyJsStrictEq(var.get(u'call',throw=False).typeof(),Js(u'function')))) else var.get(u'self')) + PyJsHoisted__possibleConstructorReturn_.func_name = u'_possibleConstructorReturn' + var.put(u'_possibleConstructorReturn', PyJsHoisted__possibleConstructorReturn_) + @Js + def PyJsHoisted_isInAstralSet_(code, set, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'set':set, u'arguments':arguments}, var) + var.registers([u'i', u'code', u'set', u'pos']) + var.put(u'pos', Js(65536)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'set').get(u'length')): + try: + var.put(u'pos', var.get(u'set').get(var.get(u'i')), u'+') + if (var.get(u'pos')>var.get(u'code')): + return Js(False) + var.put(u'pos', var.get(u'set').get((var.get(u'i')+Js(1.0))), u'+') + if (var.get(u'pos')>=var.get(u'code')): + return var.get(u'true') + finally: + var.put(u'i', Js(2.0), u'+') + PyJsHoisted_isInAstralSet_.func_name = u'isInAstralSet' + var.put(u'isInAstralSet', PyJsHoisted_isInAstralSet_) + @Js + def PyJsHoisted_binop_(name, prec, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'prec':prec, u'arguments':arguments}, var) + var.registers([u'name', u'prec']) + PyJs_Object_2850_ = Js({u'beforeExpr':var.get(u'true'),u'binop':var.get(u'prec')}) + return var.get(u'TokenType').create(var.get(u'name'), PyJs_Object_2850_) + PyJsHoisted_binop_.func_name = u'binop' + var.put(u'binop', PyJsHoisted_binop_) + @Js + def PyJsHoistedNonPyName(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJsHoistedNonPyName.func_name = u'_classCallCheck$6' + var.put(u'_classCallCheck$6', PyJsHoistedNonPyName) + @Js + def PyJsHoisted_finishNodeAt_(node, type, pos, loc, this, arguments, var=var): + var = Scope({u'node':node, u'loc':loc, u'arguments':arguments, u'this':this, u'type':type, u'pos':pos}, var) + var.registers([u'node', u'loc', u'type', u'pos']) + var.get(u'node').put(u'type', var.get(u'type')) + var.get(u'node').put(u'end', var.get(u'pos')) + var.get(u'node').get(u'loc').put(u'end', var.get(u'loc')) + var.get(u"this").callprop(u'processComment', var.get(u'node')) + return var.get(u'node') + PyJsHoisted_finishNodeAt_.func_name = u'finishNodeAt' + var.put(u'finishNodeAt', PyJsHoisted_finishNodeAt_) + @Js + def PyJsHoistedNonPyName(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJsHoistedNonPyName.func_name = u'_classCallCheck$5' + var.put(u'_classCallCheck$5', PyJsHoistedNonPyName) + @Js + def PyJsHoistedNonPyName(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJsHoistedNonPyName.func_name = u'_classCallCheck$2' + var.put(u'_classCallCheck$2', PyJsHoistedNonPyName) + @Js + def PyJsHoistedNonPyName(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJsHoistedNonPyName.func_name = u'_classCallCheck$3' + var.put(u'_classCallCheck$3', PyJsHoistedNonPyName) + @Js + def PyJsHoistedNonPyName(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJsHoistedNonPyName.func_name = u'_classCallCheck$1' + var.put(u'_classCallCheck$1', PyJsHoistedNonPyName) + @Js + def PyJsHoisted_getQualifiedJSXName_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + if PyJsStrictEq(var.get(u'object').get(u'type'),Js(u'JSXIdentifier')): + return var.get(u'object').get(u'name') + if PyJsStrictEq(var.get(u'object').get(u'type'),Js(u'JSXNamespacedName')): + return ((var.get(u'object').get(u'namespace').get(u'name')+Js(u':'))+var.get(u'object').get(u'name').get(u'name')) + if PyJsStrictEq(var.get(u'object').get(u'type'),Js(u'JSXMemberExpression')): + return ((var.get(u'getQualifiedJSXName')(var.get(u'object').get(u'object'))+Js(u'.'))+var.get(u'getQualifiedJSXName')(var.get(u'object').get(u'property'))) + PyJsHoisted_getQualifiedJSXName_.func_name = u'getQualifiedJSXName' + var.put(u'getQualifiedJSXName', PyJsHoisted_getQualifiedJSXName_) + @Js + def PyJsHoisted_getLineInfo_(input, offset, this, arguments, var=var): + var = Scope({u'this':this, u'input':input, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'input', u'line', u'cur', u'match', u'offset']) + #for JS loop + var.put(u'line', Js(1.0)) + var.put(u'cur', Js(0.0)) + while 1: + var.get(u'lineBreakG').put(u'lastIndex', var.get(u'cur')) + var.put(u'match', var.get(u'lineBreakG').callprop(u'exec', var.get(u'input'))) + if (var.get(u'match') and (var.get(u'match').get(u'index')<var.get(u'offset'))): + var.put(u'line',Js(var.get(u'line').to_number())+Js(1)) + var.put(u'cur', (var.get(u'match').get(u'index')+var.get(u'match').get(u'0').get(u'length'))) + else: + return var.get(u'Position').create(var.get(u'line'), (var.get(u'offset')-var.get(u'cur'))) + + PyJsHoisted_getLineInfo_.func_name = u'getLineInfo' + var.put(u'getLineInfo', PyJsHoisted_getLineInfo_) + @Js + def PyJsHoisted_last_(stack, this, arguments, var=var): + var = Scope({u'this':this, u'stack':stack, u'arguments':arguments}, var) + var.registers([u'stack']) + return var.get(u'stack').get((var.get(u'stack').get(u'length')-Js(1.0))) + PyJsHoisted_last_.func_name = u'last' + var.put(u'last', PyJsHoisted_last_) + @Js + def PyJsHoistedNonPyName(input, options, this, arguments, var=var): + var = Scope({u'this':this, u'input':input, u'options':options, u'arguments':arguments}, var) + var.registers([u'input', u'options']) + return var.get(u'Parser').create(var.get(u'options'), var.get(u'input')).callprop(u'parse') + PyJsHoistedNonPyName.func_name = u'parse$1' + var.put(u'parse$1', PyJsHoistedNonPyName) + @Js + def PyJsHoistedNonPyName(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJsHoistedNonPyName.func_name = u'_classCallCheck$4' + var.put(u'_classCallCheck$4', PyJsHoistedNonPyName) + @Js + def PyJsHoisted_makePredicate_(words, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'words':words}, var) + var.registers([u'words']) + var.put(u'words', var.get(u'words').callprop(u'split', Js(u' '))) + @Js + def PyJs_anonymous_2844_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return (var.get(u'words').callprop(u'indexOf', var.get(u'str'))>=Js(0.0)) + PyJs_anonymous_2844_._set_name(u'anonymous') + return PyJs_anonymous_2844_ + PyJsHoisted_makePredicate_.func_name = u'makePredicate' + var.put(u'makePredicate', PyJsHoisted_makePredicate_) + @Js + def PyJsHoisted_kw_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'options', u'name']) + PyJs_Object_2866_ = Js({}) + var.put(u'options', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_2866_)) + var.get(u'options').put(u'keyword', var.get(u'name')) + var.get(u'keywords').put(var.get(u'name'), var.get(u'types').put((Js(u'_')+var.get(u'name')), var.get(u'TokenType').create(var.get(u'name'), var.get(u'options')))) + PyJsHoisted_kw_.func_name = u'kw' + var.put(u'kw', PyJsHoisted_kw_) + @Js + def PyJsHoisted__classCallCheck_(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJsHoisted__classCallCheck_.func_name = u'_classCallCheck' + var.put(u'_classCallCheck', PyJsHoisted__classCallCheck_) + Js(u'use strict') + PyJs_Object_2843_ = Js({u'value':var.get(u'true')}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'__esModule'), PyJs_Object_2843_) + pass + PyJs_Object_2845_ = Js({u'6':var.get(u'makePredicate')(Js(u'enum await')),u'strict':var.get(u'makePredicate')(Js(u'implements interface let package private protected public static yield')),u'strictBind':var.get(u'makePredicate')(Js(u'eval arguments'))}) + var.put(u'reservedWords', PyJs_Object_2845_) + var.put(u'isKeyword$1', var.get(u'makePredicate')(Js(u'break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this let const class extends export import yield super'))) + var.put(u'nonASCIIidentifierStartChars', Js(u'\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc')) + var.put(u'nonASCIIidentifierChars', Js(u'\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d4-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d01-\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f')) + var.put(u'nonASCIIidentifierStart', var.get(u'RegExp').create(((Js(u'[')+var.get(u'nonASCIIidentifierStartChars'))+Js(u']')))) + var.put(u'nonASCIIidentifier', var.get(u'RegExp').create((((Js(u'[')+var.get(u'nonASCIIidentifierStartChars'))+var.get(u'nonASCIIidentifierChars'))+Js(u']')))) + var.put(u'nonASCIIidentifierStartChars', var.put(u'nonASCIIidentifierChars', var.get(u"null"))) + var.put(u'astralIdentifierStartCodes', Js([Js(0.0), Js(11.0), Js(2.0), Js(25.0), Js(2.0), Js(18.0), Js(2.0), Js(1.0), Js(2.0), Js(14.0), Js(3.0), Js(13.0), Js(35.0), Js(122.0), Js(70.0), Js(52.0), Js(268.0), Js(28.0), Js(4.0), Js(48.0), Js(48.0), Js(31.0), Js(17.0), Js(26.0), Js(6.0), Js(37.0), Js(11.0), Js(29.0), Js(3.0), Js(35.0), Js(5.0), Js(7.0), Js(2.0), Js(4.0), Js(43.0), Js(157.0), Js(19.0), Js(35.0), Js(5.0), Js(35.0), Js(5.0), Js(39.0), Js(9.0), Js(51.0), Js(157.0), Js(310.0), Js(10.0), Js(21.0), Js(11.0), Js(7.0), Js(153.0), Js(5.0), Js(3.0), Js(0.0), Js(2.0), Js(43.0), Js(2.0), Js(1.0), Js(4.0), Js(0.0), Js(3.0), Js(22.0), Js(11.0), Js(22.0), Js(10.0), Js(30.0), Js(66.0), Js(18.0), Js(2.0), Js(1.0), Js(11.0), Js(21.0), Js(11.0), Js(25.0), Js(71.0), Js(55.0), Js(7.0), Js(1.0), Js(65.0), Js(0.0), Js(16.0), Js(3.0), Js(2.0), Js(2.0), Js(2.0), Js(26.0), Js(45.0), Js(28.0), Js(4.0), Js(28.0), Js(36.0), Js(7.0), Js(2.0), Js(27.0), Js(28.0), Js(53.0), Js(11.0), Js(21.0), Js(11.0), Js(18.0), Js(14.0), Js(17.0), Js(111.0), Js(72.0), Js(56.0), Js(50.0), Js(14.0), Js(50.0), Js(785.0), Js(52.0), Js(76.0), Js(44.0), Js(33.0), Js(24.0), Js(27.0), Js(35.0), Js(42.0), Js(34.0), Js(4.0), Js(0.0), Js(13.0), Js(47.0), Js(15.0), Js(3.0), Js(22.0), Js(0.0), Js(2.0), Js(0.0), Js(36.0), Js(17.0), Js(2.0), Js(24.0), Js(85.0), Js(6.0), Js(2.0), Js(0.0), Js(2.0), Js(3.0), Js(2.0), Js(14.0), Js(2.0), Js(9.0), Js(8.0), Js(46.0), Js(39.0), Js(7.0), Js(3.0), Js(1.0), Js(3.0), Js(21.0), Js(2.0), Js(6.0), Js(2.0), Js(1.0), Js(2.0), Js(4.0), Js(4.0), Js(0.0), Js(19.0), Js(0.0), Js(13.0), Js(4.0), Js(159.0), Js(52.0), Js(19.0), Js(3.0), Js(54.0), Js(47.0), Js(21.0), Js(1.0), Js(2.0), Js(0.0), Js(185.0), Js(46.0), Js(42.0), Js(3.0), Js(37.0), Js(47.0), Js(21.0), Js(0.0), Js(60.0), Js(42.0), Js(86.0), Js(25.0), Js(391.0), Js(63.0), Js(32.0), Js(0.0), Js(449.0), Js(56.0), Js(264.0), Js(8.0), Js(2.0), Js(36.0), Js(18.0), Js(0.0), Js(50.0), Js(29.0), Js(881.0), Js(921.0), Js(103.0), Js(110.0), Js(18.0), Js(195.0), Js(2749.0), Js(1070.0), Js(4050.0), Js(582.0), Js(8634.0), Js(568.0), Js(8.0), Js(30.0), Js(114.0), Js(29.0), Js(19.0), Js(47.0), Js(17.0), Js(3.0), Js(32.0), Js(20.0), Js(6.0), Js(18.0), Js(881.0), Js(68.0), Js(12.0), Js(0.0), Js(67.0), Js(12.0), Js(65.0), Js(0.0), Js(32.0), Js(6124.0), Js(20.0), Js(754.0), Js(9486.0), Js(1.0), Js(3071.0), Js(106.0), Js(6.0), Js(12.0), Js(4.0), Js(8.0), Js(8.0), Js(9.0), Js(5991.0), Js(84.0), Js(2.0), Js(70.0), Js(2.0), Js(1.0), Js(3.0), Js(0.0), Js(3.0), Js(1.0), Js(3.0), Js(3.0), Js(2.0), Js(11.0), Js(2.0), Js(0.0), Js(2.0), Js(6.0), Js(2.0), Js(64.0), Js(2.0), Js(3.0), Js(3.0), Js(7.0), Js(2.0), Js(6.0), Js(2.0), Js(27.0), Js(2.0), Js(3.0), Js(2.0), Js(4.0), Js(2.0), Js(0.0), Js(4.0), Js(6.0), Js(2.0), Js(339.0), Js(3.0), Js(24.0), Js(2.0), Js(24.0), Js(2.0), Js(30.0), Js(2.0), Js(24.0), Js(2.0), Js(30.0), Js(2.0), Js(24.0), Js(2.0), Js(30.0), Js(2.0), Js(24.0), Js(2.0), Js(30.0), Js(2.0), Js(24.0), Js(2.0), Js(7.0), Js(4149.0), Js(196.0), Js(60.0), Js(67.0), Js(1213.0), Js(3.0), Js(2.0), Js(26.0), Js(2.0), Js(1.0), Js(2.0), Js(0.0), Js(3.0), Js(0.0), Js(2.0), Js(9.0), Js(2.0), Js(3.0), Js(2.0), Js(0.0), Js(2.0), Js(0.0), Js(7.0), Js(0.0), Js(5.0), Js(0.0), Js(2.0), Js(0.0), Js(2.0), Js(0.0), Js(2.0), Js(2.0), Js(2.0), Js(1.0), Js(2.0), Js(0.0), Js(3.0), Js(0.0), Js(2.0), Js(0.0), Js(2.0), Js(0.0), Js(2.0), Js(0.0), Js(2.0), Js(0.0), Js(2.0), Js(1.0), Js(2.0), Js(0.0), Js(3.0), Js(3.0), Js(2.0), Js(6.0), Js(2.0), Js(3.0), Js(2.0), Js(3.0), Js(2.0), Js(0.0), Js(2.0), Js(9.0), Js(2.0), Js(16.0), Js(6.0), Js(2.0), Js(2.0), Js(4.0), Js(2.0), Js(16.0), Js(4421.0), Js(42710.0), Js(42.0), Js(4148.0), Js(12.0), Js(221.0), Js(3.0), Js(5761.0), Js(10591.0), Js(541.0)])) + var.put(u'astralIdentifierCodes', Js([Js(509.0), Js(0.0), Js(227.0), Js(0.0), Js(150.0), Js(4.0), Js(294.0), Js(9.0), Js(1368.0), Js(2.0), Js(2.0), Js(1.0), Js(6.0), Js(3.0), Js(41.0), Js(2.0), Js(5.0), Js(0.0), Js(166.0), Js(1.0), Js(1306.0), Js(2.0), Js(54.0), Js(14.0), Js(32.0), Js(9.0), Js(16.0), Js(3.0), Js(46.0), Js(10.0), Js(54.0), Js(9.0), Js(7.0), Js(2.0), Js(37.0), Js(13.0), Js(2.0), Js(9.0), Js(52.0), Js(0.0), Js(13.0), Js(2.0), Js(49.0), Js(13.0), Js(10.0), Js(2.0), Js(4.0), Js(9.0), Js(83.0), Js(11.0), Js(7.0), Js(0.0), Js(161.0), Js(11.0), Js(6.0), Js(9.0), Js(7.0), Js(3.0), Js(57.0), Js(0.0), Js(2.0), Js(6.0), Js(3.0), Js(1.0), Js(3.0), Js(2.0), Js(10.0), Js(0.0), Js(11.0), Js(1.0), Js(3.0), Js(6.0), Js(4.0), Js(4.0), Js(193.0), Js(17.0), Js(10.0), Js(9.0), Js(87.0), Js(19.0), Js(13.0), Js(9.0), Js(214.0), Js(6.0), Js(3.0), Js(8.0), Js(28.0), Js(1.0), Js(83.0), Js(16.0), Js(16.0), Js(9.0), Js(82.0), Js(12.0), Js(9.0), Js(9.0), Js(84.0), Js(14.0), Js(5.0), Js(9.0), Js(423.0), Js(9.0), Js(838.0), Js(7.0), Js(2.0), Js(7.0), Js(17.0), Js(9.0), Js(57.0), Js(21.0), Js(2.0), Js(13.0), Js(19882.0), Js(9.0), Js(135.0), Js(4.0), Js(60.0), Js(6.0), Js(26.0), Js(9.0), Js(1016.0), Js(45.0), Js(17.0), Js(3.0), Js(19723.0), Js(1.0), Js(5319.0), Js(4.0), Js(4.0), Js(5.0), Js(9.0), Js(7.0), Js(3.0), Js(6.0), Js(31.0), Js(3.0), Js(149.0), Js(2.0), Js(1418.0), Js(49.0), Js(513.0), Js(54.0), Js(5.0), Js(49.0), Js(9.0), Js(0.0), Js(15.0), Js(0.0), Js(23.0), Js(4.0), Js(2.0), Js(14.0), Js(1361.0), Js(6.0), Js(2.0), Js(16.0), Js(3.0), Js(6.0), Js(2.0), Js(1.0), Js(2.0), Js(4.0), Js(2214.0), Js(6.0), Js(110.0), Js(6.0), Js(6.0), Js(9.0), Js(792487.0), Js(239.0)])) + pass + pass + pass + PyJs_Object_2846_ = Js({u'sourceType':Js(u'script'),u'sourceFilename':var.get(u'undefined'),u'allowReturnOutsideFunction':Js(False),u'allowImportExportEverywhere':Js(False),u'allowSuperOutsideMethod':Js(False),u'plugins':Js([]),u'strictMode':var.get(u"null")}) + var.put(u'defaultOptions', PyJs_Object_2846_) + pass + pass + @Js + def PyJs_TokenType_2848_(label, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'TokenType':PyJs_TokenType_2848_, u'label':label}, var) + var.registers([u'conf', u'label']) + PyJs_Object_2849_ = Js({}) + var.put(u'conf', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_2849_)) + var.get(u'_classCallCheck$2')(var.get(u"this"), var.get(u'TokenType')) + var.get(u"this").put(u'label', var.get(u'label')) + var.get(u"this").put(u'keyword', var.get(u'conf').get(u'keyword')) + var.get(u"this").put(u'beforeExpr', var.get(u'conf').get(u'beforeExpr').neg().neg()) + var.get(u"this").put(u'startsExpr', var.get(u'conf').get(u'startsExpr').neg().neg()) + var.get(u"this").put(u'rightAssociative', var.get(u'conf').get(u'rightAssociative').neg().neg()) + var.get(u"this").put(u'isLoop', var.get(u'conf').get(u'isLoop').neg().neg()) + var.get(u"this").put(u'isAssign', var.get(u'conf').get(u'isAssign').neg().neg()) + var.get(u"this").put(u'prefix', var.get(u'conf').get(u'prefix').neg().neg()) + var.get(u"this").put(u'postfix', var.get(u'conf').get(u'postfix').neg().neg()) + var.get(u"this").put(u'binop', (var.get(u'conf').get(u'binop') or var.get(u"null"))) + var.get(u"this").put(u'updateContext', var.get(u"null")) + PyJs_TokenType_2848_._set_name(u'TokenType') + var.put(u'TokenType', PyJs_TokenType_2848_) + pass + PyJs_Object_2851_ = Js({u'beforeExpr':var.get(u'true')}) + var.put(u'beforeExpr', PyJs_Object_2851_) + PyJs_Object_2852_ = Js({u'startsExpr':var.get(u'true')}) + var.put(u'startsExpr', PyJs_Object_2852_) + PyJs_Object_2854_ = Js({u'beforeExpr':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2855_ = Js({u'beforeExpr':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2856_ = Js({u'beforeExpr':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2857_ = Js({u'beforeExpr':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2858_ = Js({u'beforeExpr':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2859_ = Js({u'beforeExpr':var.get(u'true'),u'isAssign':var.get(u'true')}) + PyJs_Object_2860_ = Js({u'beforeExpr':var.get(u'true'),u'isAssign':var.get(u'true')}) + PyJs_Object_2861_ = Js({u'prefix':var.get(u'true'),u'postfix':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2862_ = Js({u'beforeExpr':var.get(u'true'),u'prefix':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2863_ = Js({u'beforeExpr':var.get(u'true'),u'binop':Js(9.0),u'prefix':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2864_ = Js({u'beforeExpr':var.get(u'true'),u'binop':Js(11.0),u'rightAssociative':var.get(u'true')}) + PyJs_Object_2853_ = Js({u'num':var.get(u'TokenType').create(Js(u'num'), var.get(u'startsExpr')),u'regexp':var.get(u'TokenType').create(Js(u'regexp'), var.get(u'startsExpr')),u'string':var.get(u'TokenType').create(Js(u'string'), var.get(u'startsExpr')),u'name':var.get(u'TokenType').create(Js(u'name'), var.get(u'startsExpr')),u'eof':var.get(u'TokenType').create(Js(u'eof')),u'bracketL':var.get(u'TokenType').create(Js(u'['), PyJs_Object_2854_),u'bracketR':var.get(u'TokenType').create(Js(u']')),u'braceL':var.get(u'TokenType').create(Js(u'{'), PyJs_Object_2855_),u'braceBarL':var.get(u'TokenType').create(Js(u'{|'), PyJs_Object_2856_),u'braceR':var.get(u'TokenType').create(Js(u'}')),u'braceBarR':var.get(u'TokenType').create(Js(u'|}')),u'parenL':var.get(u'TokenType').create(Js(u'('), PyJs_Object_2857_),u'parenR':var.get(u'TokenType').create(Js(u')')),u'comma':var.get(u'TokenType').create(Js(u','), var.get(u'beforeExpr')),u'semi':var.get(u'TokenType').create(Js(u';'), var.get(u'beforeExpr')),u'colon':var.get(u'TokenType').create(Js(u':'), var.get(u'beforeExpr')),u'doubleColon':var.get(u'TokenType').create(Js(u'::'), var.get(u'beforeExpr')),u'dot':var.get(u'TokenType').create(Js(u'.')),u'question':var.get(u'TokenType').create(Js(u'?'), var.get(u'beforeExpr')),u'arrow':var.get(u'TokenType').create(Js(u'=>'), var.get(u'beforeExpr')),u'template':var.get(u'TokenType').create(Js(u'template')),u'ellipsis':var.get(u'TokenType').create(Js(u'...'), var.get(u'beforeExpr')),u'backQuote':var.get(u'TokenType').create(Js(u'`'), var.get(u'startsExpr')),u'dollarBraceL':var.get(u'TokenType').create(Js(u'${'), PyJs_Object_2858_),u'at':var.get(u'TokenType').create(Js(u'@')),u'eq':var.get(u'TokenType').create(Js(u'='), PyJs_Object_2859_),u'assign':var.get(u'TokenType').create(Js(u'_='), PyJs_Object_2860_),u'incDec':var.get(u'TokenType').create(Js(u'++/--'), PyJs_Object_2861_),u'prefix':var.get(u'TokenType').create(Js(u'prefix'), PyJs_Object_2862_),u'logicalOR':var.get(u'binop')(Js(u'||'), Js(1.0)),u'logicalAND':var.get(u'binop')(Js(u'&&'), Js(2.0)),u'bitwiseOR':var.get(u'binop')(Js(u'|'), Js(3.0)),u'bitwiseXOR':var.get(u'binop')(Js(u'^'), Js(4.0)),u'bitwiseAND':var.get(u'binop')(Js(u'&'), Js(5.0)),u'equality':var.get(u'binop')(Js(u'==/!='), Js(6.0)),u'relational':var.get(u'binop')(Js(u'</>'), Js(7.0)),u'bitShift':var.get(u'binop')(Js(u'<</>>'), Js(8.0)),u'plusMin':var.get(u'TokenType').create(Js(u'+/-'), PyJs_Object_2863_),u'modulo':var.get(u'binop')(Js(u'%'), Js(10.0)),u'star':var.get(u'binop')(Js(u'*'), Js(10.0)),u'slash':var.get(u'binop')(Js(u'/'), Js(10.0)),u'exponent':var.get(u'TokenType').create(Js(u'**'), PyJs_Object_2864_)}) + var.put(u'types', PyJs_Object_2853_) + PyJs_Object_2865_ = Js({}) + var.put(u'keywords', PyJs_Object_2865_) + pass + var.get(u'kw')(Js(u'break')) + var.get(u'kw')(Js(u'case'), var.get(u'beforeExpr')) + var.get(u'kw')(Js(u'catch')) + var.get(u'kw')(Js(u'continue')) + var.get(u'kw')(Js(u'debugger')) + var.get(u'kw')(Js(u'default'), var.get(u'beforeExpr')) + PyJs_Object_2867_ = Js({u'isLoop':var.get(u'true'),u'beforeExpr':var.get(u'true')}) + var.get(u'kw')(Js(u'do'), PyJs_Object_2867_) + var.get(u'kw')(Js(u'else'), var.get(u'beforeExpr')) + var.get(u'kw')(Js(u'finally')) + PyJs_Object_2868_ = Js({u'isLoop':var.get(u'true')}) + var.get(u'kw')(Js(u'for'), PyJs_Object_2868_) + var.get(u'kw')(Js(u'function'), var.get(u'startsExpr')) + var.get(u'kw')(Js(u'if')) + var.get(u'kw')(Js(u'return'), var.get(u'beforeExpr')) + var.get(u'kw')(Js(u'switch')) + var.get(u'kw')(Js(u'throw'), var.get(u'beforeExpr')) + var.get(u'kw')(Js(u'try')) + var.get(u'kw')(Js(u'var')) + var.get(u'kw')(Js(u'let')) + var.get(u'kw')(Js(u'const')) + PyJs_Object_2869_ = Js({u'isLoop':var.get(u'true')}) + var.get(u'kw')(Js(u'while'), PyJs_Object_2869_) + var.get(u'kw')(Js(u'with')) + PyJs_Object_2870_ = Js({u'beforeExpr':var.get(u'true'),u'startsExpr':var.get(u'true')}) + var.get(u'kw')(Js(u'new'), PyJs_Object_2870_) + var.get(u'kw')(Js(u'this'), var.get(u'startsExpr')) + var.get(u'kw')(Js(u'super'), var.get(u'startsExpr')) + var.get(u'kw')(Js(u'class')) + var.get(u'kw')(Js(u'extends'), var.get(u'beforeExpr')) + var.get(u'kw')(Js(u'export')) + var.get(u'kw')(Js(u'import')) + PyJs_Object_2871_ = Js({u'beforeExpr':var.get(u'true'),u'startsExpr':var.get(u'true')}) + var.get(u'kw')(Js(u'yield'), PyJs_Object_2871_) + var.get(u'kw')(Js(u'null'), var.get(u'startsExpr')) + var.get(u'kw')(Js(u'true'), var.get(u'startsExpr')) + var.get(u'kw')(Js(u'false'), var.get(u'startsExpr')) + PyJs_Object_2872_ = Js({u'beforeExpr':var.get(u'true'),u'binop':Js(7.0)}) + var.get(u'kw')(Js(u'in'), PyJs_Object_2872_) + PyJs_Object_2873_ = Js({u'beforeExpr':var.get(u'true'),u'binop':Js(7.0)}) + var.get(u'kw')(Js(u'instanceof'), PyJs_Object_2873_) + PyJs_Object_2874_ = Js({u'beforeExpr':var.get(u'true'),u'prefix':var.get(u'true'),u'startsExpr':var.get(u'true')}) + var.get(u'kw')(Js(u'typeof'), PyJs_Object_2874_) + PyJs_Object_2875_ = Js({u'beforeExpr':var.get(u'true'),u'prefix':var.get(u'true'),u'startsExpr':var.get(u'true')}) + var.get(u'kw')(Js(u'void'), PyJs_Object_2875_) + PyJs_Object_2876_ = Js({u'beforeExpr':var.get(u'true'),u'prefix':var.get(u'true'),u'startsExpr':var.get(u'true')}) + var.get(u'kw')(Js(u'delete'), PyJs_Object_2876_) + var.put(u'lineBreak', JsRegExp(u'/\\r\\n?|\\n|\\u2028|\\u2029/')) + var.put(u'lineBreakG', var.get(u'RegExp').create(var.get(u'lineBreak').get(u'source'), Js(u'g'))) + pass + var.put(u'nonASCIIwhitespace', JsRegExp(u'/[\\u1680\\u180e\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]/')) + pass + @Js + def PyJs_TokContext_2877_(token, isExpr, preserveSpace, override, this, arguments, var=var): + var = Scope({u'TokContext':PyJs_TokContext_2877_, u'this':this, u'token':token, u'isExpr':isExpr, u'arguments':arguments, u'preserveSpace':preserveSpace, u'override':override}, var) + var.registers([u'override', u'token', u'isExpr', u'preserveSpace']) + var.get(u'_classCallCheck$3')(var.get(u"this"), var.get(u'TokContext')) + var.get(u"this").put(u'token', var.get(u'token')) + var.get(u"this").put(u'isExpr', var.get(u'isExpr').neg().neg()) + var.get(u"this").put(u'preserveSpace', var.get(u'preserveSpace').neg().neg()) + var.get(u"this").put(u'override', var.get(u'override')) + PyJs_TokContext_2877_._set_name(u'TokContext') + var.put(u'TokContext', PyJs_TokContext_2877_) + @Js + def PyJs_anonymous_2879_(p, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments}, var) + var.registers([u'p']) + return var.get(u'p').callprop(u'readTmplToken') + PyJs_anonymous_2879_._set_name(u'anonymous') + PyJs_Object_2878_ = Js({u'braceStatement':var.get(u'TokContext').create(Js(u'{'), Js(False)),u'braceExpression':var.get(u'TokContext').create(Js(u'{'), var.get(u'true')),u'templateQuasi':var.get(u'TokContext').create(Js(u'${'), var.get(u'true')),u'parenStatement':var.get(u'TokContext').create(Js(u'('), Js(False)),u'parenExpression':var.get(u'TokContext').create(Js(u'('), var.get(u'true')),u'template':var.get(u'TokContext').create(Js(u'`'), var.get(u'true'), var.get(u'true'), PyJs_anonymous_2879_),u'functionExpression':var.get(u'TokContext').create(Js(u'function'), var.get(u'true'))}) + var.put(u'types$1', PyJs_Object_2878_) + @Js + def PyJs_anonymous_2880_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'out']) + if PyJsStrictEq(var.get(u"this").get(u'state').get(u'context').get(u'length'),Js(1.0)): + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + return var.get('undefined') + var.put(u'out', var.get(u"this").get(u'state').get(u'context').callprop(u'pop')) + if (PyJsStrictEq(var.get(u'out'),var.get(u'types$1').get(u'braceStatement')) and PyJsStrictEq(var.get(u"this").callprop(u'curContext'),var.get(u'types$1').get(u'functionExpression'))): + var.get(u"this").get(u'state').get(u'context').callprop(u'pop') + var.get(u"this").get(u'state').put(u'exprAllowed', Js(False)) + else: + if PyJsStrictEq(var.get(u'out'),var.get(u'types$1').get(u'templateQuasi')): + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + else: + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'out').get(u'isExpr').neg()) + PyJs_anonymous_2880_._set_name(u'anonymous') + var.get(u'types').get(u'parenR').put(u'updateContext', var.get(u'types').get(u'braceR').put(u'updateContext', PyJs_anonymous_2880_)) + @Js + def PyJs_anonymous_2881_(prevType, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prevType':prevType}, var) + var.registers([u'prevType']) + var.get(u"this").get(u'state').put(u'exprAllowed', Js(False)) + if ((PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_let')) or PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_const'))) or PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_var'))): + if var.get(u'lineBreak').callprop(u'test', var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'end'))): + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + PyJs_anonymous_2881_._set_name(u'anonymous') + var.get(u'types').get(u'name').put(u'updateContext', PyJs_anonymous_2881_) + @Js + def PyJs_anonymous_2882_(prevType, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prevType':prevType}, var) + var.registers([u'prevType']) + var.get(u"this").get(u'state').get(u'context').callprop(u'push', (var.get(u'types$1').get(u'braceStatement') if var.get(u"this").callprop(u'braceIsBlock', var.get(u'prevType')) else var.get(u'types$1').get(u'braceExpression'))) + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + PyJs_anonymous_2882_._set_name(u'anonymous') + var.get(u'types').get(u'braceL').put(u'updateContext', PyJs_anonymous_2882_) + @Js + def PyJs_anonymous_2883_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'templateQuasi')) + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + PyJs_anonymous_2883_._set_name(u'anonymous') + var.get(u'types').get(u'dollarBraceL').put(u'updateContext', PyJs_anonymous_2883_) + @Js + def PyJs_anonymous_2884_(prevType, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prevType':prevType}, var) + var.registers([u'prevType', u'statementParens']) + var.put(u'statementParens', (((PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_if')) or PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_for'))) or PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_with'))) or PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_while')))) + var.get(u"this").get(u'state').get(u'context').callprop(u'push', (var.get(u'types$1').get(u'parenStatement') if var.get(u'statementParens') else var.get(u'types$1').get(u'parenExpression'))) + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + PyJs_anonymous_2884_._set_name(u'anonymous') + var.get(u'types').get(u'parenL').put(u'updateContext', PyJs_anonymous_2884_) + @Js + def PyJs_anonymous_2885_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJs_anonymous_2885_._set_name(u'anonymous') + var.get(u'types').get(u'incDec').put(u'updateContext', PyJs_anonymous_2885_) + @Js + def PyJs_anonymous_2886_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if PyJsStrictNeq(var.get(u"this").callprop(u'curContext'),var.get(u'types$1').get(u'braceStatement')): + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'functionExpression')) + var.get(u"this").get(u'state').put(u'exprAllowed', Js(False)) + PyJs_anonymous_2886_._set_name(u'anonymous') + var.get(u'types').get(u'_function').put(u'updateContext', PyJs_anonymous_2886_) + @Js + def PyJs_anonymous_2887_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if PyJsStrictEq(var.get(u"this").callprop(u'curContext'),var.get(u'types$1').get(u'template')): + var.get(u"this").get(u'state').get(u'context').callprop(u'pop') + else: + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'template')) + var.get(u"this").get(u'state').put(u'exprAllowed', Js(False)) + PyJs_anonymous_2887_._set_name(u'anonymous') + var.get(u'types').get(u'backQuote').put(u'updateContext', PyJs_anonymous_2887_) + pass + @Js + def PyJs_Position_2888_(line, col, this, arguments, var=var): + var = Scope({u'this':this, u'Position':PyJs_Position_2888_, u'line':line, u'col':col, u'arguments':arguments}, var) + var.registers([u'line', u'col']) + var.get(u'_classCallCheck$4')(var.get(u"this"), var.get(u'Position')) + var.get(u"this").put(u'line', var.get(u'line')) + var.get(u"this").put(u'column', var.get(u'col')) + PyJs_Position_2888_._set_name(u'Position') + var.put(u'Position', PyJs_Position_2888_) + @Js + def PyJs_SourceLocation_2889_(start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'arguments':arguments, u'SourceLocation':PyJs_SourceLocation_2889_}, var) + var.registers([u'start', u'end']) + var.get(u'_classCallCheck$4')(var.get(u"this"), var.get(u'SourceLocation')) + var.get(u"this").put(u'start', var.get(u'start')) + var.get(u"this").put(u'end', var.get(u'end')) + PyJs_SourceLocation_2889_._set_name(u'SourceLocation') + var.put(u'SourceLocation', PyJs_SourceLocation_2889_) + pass + pass + @Js + def PyJs_anonymous_2890_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'State']) + @Js + def PyJsHoisted_State_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'_classCallCheck$5')(var.get(u"this"), var.get(u'State')) + PyJsHoisted_State_.func_name = u'State' + var.put(u'State', PyJsHoisted_State_) + pass + @Js + def PyJs_init_2891_(options, input, this, arguments, var=var): + var = Scope({u'this':this, u'input':input, u'init':PyJs_init_2891_, u'options':options, u'arguments':arguments}, var) + var.registers([u'input', u'options']) + var.get(u"this").put(u'strict', (Js(False) if PyJsStrictEq(var.get(u'options').get(u'strictMode'),Js(False)) else PyJsStrictEq(var.get(u'options').get(u'sourceType'),Js(u'module')))) + var.get(u"this").put(u'input', var.get(u'input')) + var.get(u"this").put(u'potentialArrowAt', (-Js(1.0))) + var.get(u"this").put(u'inMethod', var.get(u"this").put(u'inFunction', var.get(u"this").put(u'inGenerator', var.get(u"this").put(u'inAsync', var.get(u"this").put(u'inType', Js(False)))))) + var.get(u"this").put(u'labels', Js([])) + var.get(u"this").put(u'decorators', Js([])) + var.get(u"this").put(u'tokens', Js([])) + var.get(u"this").put(u'comments', Js([])) + var.get(u"this").put(u'trailingComments', Js([])) + var.get(u"this").put(u'leadingComments', Js([])) + var.get(u"this").put(u'commentStack', Js([])) + var.get(u"this").put(u'pos', var.get(u"this").put(u'lineStart', Js(0.0))) + var.get(u"this").put(u'curLine', Js(1.0)) + var.get(u"this").put(u'type', var.get(u'types').get(u'eof')) + var.get(u"this").put(u'value', var.get(u"null")) + var.get(u"this").put(u'start', var.get(u"this").put(u'end', var.get(u"this").get(u'pos'))) + var.get(u"this").put(u'startLoc', var.get(u"this").put(u'endLoc', var.get(u"this").callprop(u'curPosition'))) + var.get(u"this").put(u'lastTokEndLoc', var.get(u"this").put(u'lastTokStartLoc', var.get(u"null"))) + var.get(u"this").put(u'lastTokStart', var.get(u"this").put(u'lastTokEnd', var.get(u"this").get(u'pos'))) + var.get(u"this").put(u'context', Js([var.get(u'types$1').get(u'braceStatement')])) + var.get(u"this").put(u'exprAllowed', var.get(u'true')) + var.get(u"this").put(u'containsEsc', var.get(u"this").put(u'containsOctal', Js(False))) + var.get(u"this").put(u'octalPosition', var.get(u"null")) + var.get(u"this").put(u'exportedIdentifiers', Js([])) + return var.get(u"this") + PyJs_init_2891_._set_name(u'init') + var.get(u'State').get(u'prototype').put(u'init', PyJs_init_2891_) + @Js + def PyJs_curPosition_2892_(this, arguments, var=var): + var = Scope({u'this':this, u'curPosition':PyJs_curPosition_2892_, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'Position').create(var.get(u"this").get(u'curLine'), (var.get(u"this").get(u'pos')-var.get(u"this").get(u'lineStart'))) + PyJs_curPosition_2892_._set_name(u'curPosition') + var.get(u'State').get(u'prototype').put(u'curPosition', PyJs_curPosition_2892_) + @Js + def PyJs_clone_2893_(skipArrays, this, arguments, var=var): + var = Scope({u'this':this, u'clone':PyJs_clone_2893_, u'skipArrays':skipArrays, u'arguments':arguments}, var) + var.registers([u'state', u'val', u'key', u'skipArrays']) + var.put(u'state', var.get(u'State').create()) + for PyJsTemp in var.get(u"this"): + var.put(u'key', PyJsTemp) + var.put(u'val', var.get(u"this").get(var.get(u'key'))) + if ((var.get(u'skipArrays').neg() or PyJsStrictEq(var.get(u'key'),Js(u'context'))) and var.get(u'Array').callprop(u'isArray', var.get(u'val'))): + var.put(u'val', var.get(u'val').callprop(u'slice')) + var.get(u'state').put(var.get(u'key'), var.get(u'val')) + return var.get(u'state') + PyJs_clone_2893_._set_name(u'clone') + var.get(u'State').get(u'prototype').put(u'clone', PyJs_clone_2893_) + return var.get(u'State') + PyJs_anonymous_2890_._set_name(u'anonymous') + var.put(u'State', PyJs_anonymous_2890_()) + pass + @Js + def PyJs_Token_2894_(state, this, arguments, var=var): + var = Scope({u'this':this, u'state':state, u'Token':PyJs_Token_2894_, u'arguments':arguments}, var) + var.registers([u'state']) + var.get(u'_classCallCheck$1')(var.get(u"this"), var.get(u'Token')) + var.get(u"this").put(u'type', var.get(u'state').get(u'type')) + var.get(u"this").put(u'value', var.get(u'state').get(u'value')) + var.get(u"this").put(u'start', var.get(u'state').get(u'start')) + var.get(u"this").put(u'end', var.get(u'state').get(u'end')) + var.get(u"this").put(u'loc', var.get(u'SourceLocation').create(var.get(u'state').get(u'startLoc'), var.get(u'state').get(u'endLoc'))) + PyJs_Token_2894_._set_name(u'Token') + var.put(u'Token', PyJs_Token_2894_) + pass + @Js + def PyJs_anonymous_2895_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Tokenizer']) + @Js + def PyJsHoisted_Tokenizer_(options, input, this, arguments, var=var): + var = Scope({u'this':this, u'input':input, u'options':options, u'arguments':arguments}, var) + var.registers([u'input', u'options']) + var.get(u'_classCallCheck$1')(var.get(u"this"), var.get(u'Tokenizer')) + var.get(u"this").put(u'state', var.get(u'State').create()) + var.get(u"this").get(u'state').callprop(u'init', var.get(u'options'), var.get(u'input')) + PyJsHoisted_Tokenizer_.func_name = u'Tokenizer' + var.put(u'Tokenizer', PyJsHoisted_Tokenizer_) + pass + @Js + def PyJs_next_2896_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'next':PyJs_next_2896_}, var) + var.registers([]) + if var.get(u"this").get(u'isLookahead').neg(): + var.get(u"this").get(u'state').get(u'tokens').callprop(u'push', var.get(u'Token').create(var.get(u"this").get(u'state'))) + var.get(u"this").get(u'state').put(u'lastTokEnd', var.get(u"this").get(u'state').get(u'end')) + var.get(u"this").get(u'state').put(u'lastTokStart', var.get(u"this").get(u'state').get(u'start')) + var.get(u"this").get(u'state').put(u'lastTokEndLoc', var.get(u"this").get(u'state').get(u'endLoc')) + var.get(u"this").get(u'state').put(u'lastTokStartLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.get(u"this").callprop(u'nextToken') + PyJs_next_2896_._set_name(u'next') + var.get(u'Tokenizer').get(u'prototype').put(u'next', PyJs_next_2896_) + @Js + def PyJs_eat_2897_(type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'eat':PyJs_eat_2897_}, var) + var.registers([u'type']) + if var.get(u"this").callprop(u'match', var.get(u'type')): + var.get(u"this").callprop(u'next') + return var.get(u'true') + else: + return Js(False) + PyJs_eat_2897_._set_name(u'eat') + var.get(u'Tokenizer').get(u'prototype').put(u'eat', PyJs_eat_2897_) + @Js + def PyJs_match_2898_(type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'match':PyJs_match_2898_}, var) + var.registers([u'type']) + return PyJsStrictEq(var.get(u"this").get(u'state').get(u'type'),var.get(u'type')) + PyJs_match_2898_._set_name(u'match') + var.get(u'Tokenizer').get(u'prototype').put(u'match', PyJs_match_2898_) + @Js + def PyJs_isKeyword_2899_(word, this, arguments, var=var): + var = Scope({u'this':this, u'isKeyword':PyJs_isKeyword_2899_, u'word':word, u'arguments':arguments}, var) + var.registers([u'word']) + return var.get(u'isKeyword$1')(var.get(u'word')) + PyJs_isKeyword_2899_._set_name(u'isKeyword') + var.get(u'Tokenizer').get(u'prototype').put(u'isKeyword', PyJs_isKeyword_2899_) + @Js + def PyJs_lookahead_2900_(this, arguments, var=var): + var = Scope({u'this':this, u'lookahead':PyJs_lookahead_2900_, u'arguments':arguments}, var) + var.registers([u'curr', u'old']) + var.put(u'old', var.get(u"this").get(u'state')) + var.get(u"this").put(u'state', var.get(u'old').callprop(u'clone', var.get(u'true'))) + var.get(u"this").put(u'isLookahead', var.get(u'true')) + var.get(u"this").callprop(u'next') + var.get(u"this").put(u'isLookahead', Js(False)) + var.put(u'curr', var.get(u"this").get(u'state').callprop(u'clone', var.get(u'true'))) + var.get(u"this").put(u'state', var.get(u'old')) + return var.get(u'curr') + PyJs_lookahead_2900_._set_name(u'lookahead') + var.get(u'Tokenizer').get(u'prototype').put(u'lookahead', PyJs_lookahead_2900_) + @Js + def PyJs_setStrict_2901_(strict, this, arguments, var=var): + var = Scope({u'this':this, u'strict':strict, u'arguments':arguments, u'setStrict':PyJs_setStrict_2901_}, var) + var.registers([u'strict']) + var.get(u"this").get(u'state').put(u'strict', var.get(u'strict')) + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'num')).neg() and var.get(u"this").callprop(u'match', var.get(u'types').get(u'string')).neg()): + return var.get('undefined') + var.get(u"this").get(u'state').put(u'pos', var.get(u"this").get(u'state').get(u'start')) + while (var.get(u"this").get(u'state').get(u'pos')<var.get(u"this").get(u'state').get(u'lineStart')): + var.get(u"this").get(u'state').put(u'lineStart', (var.get(u"this").get(u'input').callprop(u'lastIndexOf', Js(u'\n'), (var.get(u"this").get(u'state').get(u'lineStart')-Js(2.0)))+Js(1.0))) + var.get(u"this").get(u'state').put(u'curLine',Js(var.get(u"this").get(u'state').get(u'curLine').to_number())-Js(1)) + var.get(u"this").callprop(u'nextToken') + PyJs_setStrict_2901_._set_name(u'setStrict') + var.get(u'Tokenizer').get(u'prototype').put(u'setStrict', PyJs_setStrict_2901_) + @Js + def PyJs_curContext_2902_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'curContext':PyJs_curContext_2902_}, var) + var.registers([]) + return var.get(u"this").get(u'state').get(u'context').get((var.get(u"this").get(u'state').get(u'context').get(u'length')-Js(1.0))) + PyJs_curContext_2902_._set_name(u'curContext') + var.get(u'Tokenizer').get(u'prototype').put(u'curContext', PyJs_curContext_2902_) + @Js + def PyJs_nextToken_2903_(this, arguments, var=var): + var = Scope({u'this':this, u'nextToken':PyJs_nextToken_2903_, u'arguments':arguments}, var) + var.registers([u'curContext']) + var.put(u'curContext', var.get(u"this").callprop(u'curContext')) + if (var.get(u'curContext').neg() or var.get(u'curContext').get(u'preserveSpace').neg()): + var.get(u"this").callprop(u'skipSpace') + var.get(u"this").get(u'state').put(u'containsOctal', Js(False)) + var.get(u"this").get(u'state').put(u'octalPosition', var.get(u"null")) + var.get(u"this").get(u'state').put(u'start', var.get(u"this").get(u'state').get(u'pos')) + var.get(u"this").get(u'state').put(u'startLoc', var.get(u"this").get(u'state').callprop(u'curPosition')) + if (var.get(u"this").get(u'state').get(u'pos')>=var.get(u"this").get(u'input').get(u'length')): + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'eof')) + if var.get(u'curContext').get(u'override'): + return var.get(u'curContext').callprop(u'override', var.get(u"this")) + else: + return var.get(u"this").callprop(u'readToken', var.get(u"this").callprop(u'fullCharCodeAtPos')) + PyJs_nextToken_2903_._set_name(u'nextToken') + var.get(u'Tokenizer').get(u'prototype').put(u'nextToken', PyJs_nextToken_2903_) + @Js + def PyJs_readToken_2904_(code, this, arguments, var=var): + var = Scope({u'this':this, u'readToken':PyJs_readToken_2904_, u'code':code, u'arguments':arguments}, var) + var.registers([u'code']) + if (var.get(u'isIdentifierStart')(var.get(u'code')) or PyJsStrictEq(var.get(u'code'),Js(92.0))): + return var.get(u"this").callprop(u'readWord') + else: + return var.get(u"this").callprop(u'getTokenFromCode', var.get(u'code')) + PyJs_readToken_2904_._set_name(u'readToken') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken', PyJs_readToken_2904_) + @Js + def PyJs_fullCharCodeAtPos_2905_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'fullCharCodeAtPos':PyJs_fullCharCodeAtPos_2905_}, var) + var.registers([u'code', u'next']) + var.put(u'code', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + if ((var.get(u'code')<=Js(55295)) or (var.get(u'code')>=Js(57344))): + return var.get(u'code') + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + return (((var.get(u'code')<<Js(10.0))+var.get(u'next'))-Js(56613888)) + PyJs_fullCharCodeAtPos_2905_._set_name(u'fullCharCodeAtPos') + var.get(u'Tokenizer').get(u'prototype').put(u'fullCharCodeAtPos', PyJs_fullCharCodeAtPos_2905_) + @Js + def PyJs_pushComment_2906_(block, text, start, end, startLoc, endLoc, this, arguments, var=var): + var = Scope({u'end':end, u'this':this, u'text':text, u'pushComment':PyJs_pushComment_2906_, u'start':start, u'arguments':arguments, u'startLoc':startLoc, u'endLoc':endLoc, u'block':block}, var) + var.registers([u'comment', u'end', u'text', u'start', u'startLoc', u'endLoc', u'block']) + PyJs_Object_2907_ = Js({u'type':(Js(u'CommentBlock') if var.get(u'block') else Js(u'CommentLine')),u'value':var.get(u'text'),u'start':var.get(u'start'),u'end':var.get(u'end'),u'loc':var.get(u'SourceLocation').create(var.get(u'startLoc'), var.get(u'endLoc'))}) + var.put(u'comment', PyJs_Object_2907_) + if var.get(u"this").get(u'isLookahead').neg(): + var.get(u"this").get(u'state').get(u'tokens').callprop(u'push', var.get(u'comment')) + var.get(u"this").get(u'state').get(u'comments').callprop(u'push', var.get(u'comment')) + var.get(u"this").callprop(u'addComment', var.get(u'comment')) + PyJs_pushComment_2906_._set_name(u'pushComment') + var.get(u'Tokenizer').get(u'prototype').put(u'pushComment', PyJs_pushComment_2906_) + @Js + def PyJs_skipBlockComment_2908_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'skipBlockComment':PyJs_skipBlockComment_2908_}, var) + var.registers([u'start', u'end', u'match', u'startLoc']) + var.put(u'startLoc', var.get(u"this").get(u'state').callprop(u'curPosition')) + var.put(u'start', var.get(u"this").get(u'state').get(u'pos')) + var.put(u'end', var.get(u"this").get(u'input').callprop(u'indexOf', Js(u'*/'), var.get(u"this").get(u'state').put(u'pos', Js(2.0), u'+'))) + if PyJsStrictEq(var.get(u'end'),(-Js(1.0))): + var.get(u"this").callprop(u'raise', (var.get(u"this").get(u'state').get(u'pos')-Js(2.0)), Js(u'Unterminated comment')) + var.get(u"this").get(u'state').put(u'pos', (var.get(u'end')+Js(2.0))) + var.get(u'lineBreakG').put(u'lastIndex', var.get(u'start')) + var.put(u'match', PyJsComma(Js(0.0), Js(None))) + while (var.put(u'match', var.get(u'lineBreakG').callprop(u'exec', var.get(u"this").get(u'input'))) and (var.get(u'match').get(u'index')<var.get(u"this").get(u'state').get(u'pos'))): + var.get(u"this").get(u'state').put(u'curLine',Js(var.get(u"this").get(u'state').get(u'curLine').to_number())+Js(1)) + var.get(u"this").get(u'state').put(u'lineStart', (var.get(u'match').get(u'index')+var.get(u'match').get(u'0').get(u'length'))) + var.get(u"this").callprop(u'pushComment', var.get(u'true'), var.get(u"this").get(u'input').callprop(u'slice', (var.get(u'start')+Js(2.0)), var.get(u'end')), var.get(u'start'), var.get(u"this").get(u'state').get(u'pos'), var.get(u'startLoc'), var.get(u"this").get(u'state').callprop(u'curPosition')) + PyJs_skipBlockComment_2908_._set_name(u'skipBlockComment') + var.get(u'Tokenizer').get(u'prototype').put(u'skipBlockComment', PyJs_skipBlockComment_2908_) + @Js + def PyJs_skipLineComment_2909_(startSkip, this, arguments, var=var): + var = Scope({u'startSkip':startSkip, u'this':this, u'arguments':arguments, u'skipLineComment':PyJs_skipLineComment_2909_}, var) + var.registers([u'startSkip', u'start', u'ch', u'startLoc']) + var.put(u'start', var.get(u"this").get(u'state').get(u'pos')) + var.put(u'startLoc', var.get(u"this").get(u'state').callprop(u'curPosition')) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').put(u'pos', var.get(u'startSkip'), u'+'))) + while (((((var.get(u"this").get(u'state').get(u'pos')<var.get(u"this").get(u'input').get(u'length')) and PyJsStrictNeq(var.get(u'ch'),Js(10.0))) and PyJsStrictNeq(var.get(u'ch'),Js(13.0))) and PyJsStrictNeq(var.get(u'ch'),Js(8232.0))) and PyJsStrictNeq(var.get(u'ch'),Js(8233.0))): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + var.get(u"this").callprop(u'pushComment', Js(False), var.get(u"this").get(u'input').callprop(u'slice', (var.get(u'start')+var.get(u'startSkip')), var.get(u"this").get(u'state').get(u'pos')), var.get(u'start'), var.get(u"this").get(u'state').get(u'pos'), var.get(u'startLoc'), var.get(u"this").get(u'state').callprop(u'curPosition')) + PyJs_skipLineComment_2909_._set_name(u'skipLineComment') + var.get(u'Tokenizer').get(u'prototype').put(u'skipLineComment', PyJs_skipLineComment_2909_) + @Js + def PyJs_skipSpace_2910_(this, arguments, var=var): + var = Scope({u'this':this, u'skipSpace':PyJs_skipSpace_2910_, u'arguments':arguments}, var) + var.registers([u'ch']) + class JS_CONTINUE_LABEL_6c6f6f70(Exception): pass + class JS_BREAK_LABEL_6c6f6f70(Exception): pass + try: + while (var.get(u"this").get(u'state').get(u'pos')<var.get(u"this").get(u'input').get(u'length')): + try: + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + while 1: + SWITCHED = False + CONDITION = (var.get(u'ch')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(32.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(160.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(13.0)): + SWITCHED = True + if PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0))),Js(10.0)): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + if SWITCHED or PyJsStrictEq(CONDITION, Js(10.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(8232.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(8233.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + var.get(u"this").get(u'state').put(u'curLine',Js(var.get(u"this").get(u'state').get(u'curLine').to_number())+Js(1)) + var.get(u"this").get(u'state').put(u'lineStart', var.get(u"this").get(u'state').get(u'pos')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(47.0)): + SWITCHED = True + while 1: + SWITCHED = False + CONDITION = (var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(42.0)): + SWITCHED = True + var.get(u"this").callprop(u'skipBlockComment') + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(47.0)): + SWITCHED = True + var.get(u"this").callprop(u'skipLineComment', Js(2.0)) + break + if True: + SWITCHED = True + raise JS_BREAK_LABEL_6c6f6f70("Breaked") + SWITCHED = True + break + break + if True: + SWITCHED = True + if (((var.get(u'ch')>Js(8.0)) and (var.get(u'ch')<Js(14.0))) or ((var.get(u'ch')>=Js(5760.0)) and var.get(u'nonASCIIwhitespace').callprop(u'test', var.get(u'String').callprop(u'fromCharCode', var.get(u'ch'))))): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + else: + raise JS_BREAK_LABEL_6c6f6f70("Breaked") + SWITCHED = True + break + except JS_CONTINUE_LABEL_6c6f6f70: + pass + except JS_BREAK_LABEL_6c6f6f70: + pass + PyJs_skipSpace_2910_._set_name(u'skipSpace') + var.get(u'Tokenizer').get(u'prototype').put(u'skipSpace', PyJs_skipSpace_2910_) + @Js + def PyJs_finishToken_2911_(type, val, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'val':val, u'finishToken':PyJs_finishToken_2911_}, var) + var.registers([u'type', u'val', u'prevType']) + var.get(u"this").get(u'state').put(u'end', var.get(u"this").get(u'state').get(u'pos')) + var.get(u"this").get(u'state').put(u'endLoc', var.get(u"this").get(u'state').callprop(u'curPosition')) + var.put(u'prevType', var.get(u"this").get(u'state').get(u'type')) + var.get(u"this").get(u'state').put(u'type', var.get(u'type')) + var.get(u"this").get(u'state').put(u'value', var.get(u'val')) + var.get(u"this").callprop(u'updateContext', var.get(u'prevType')) + PyJs_finishToken_2911_._set_name(u'finishToken') + var.get(u'Tokenizer').get(u'prototype').put(u'finishToken', PyJs_finishToken_2911_) + @Js + def PyJs_readToken_dot_2912_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'readToken_dot':PyJs_readToken_dot_2912_}, var) + var.registers([u'next2', u'next']) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if ((var.get(u'next')>=Js(48.0)) and (var.get(u'next')<=Js(57.0))): + return var.get(u"this").callprop(u'readNumber', var.get(u'true')) + var.put(u'next2', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(2.0)))) + if (PyJsStrictEq(var.get(u'next'),Js(46.0)) and PyJsStrictEq(var.get(u'next2'),Js(46.0))): + var.get(u"this").get(u'state').put(u'pos', Js(3.0), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'ellipsis')) + else: + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'dot')) + PyJs_readToken_dot_2912_._set_name(u'readToken_dot') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_dot', PyJs_readToken_dot_2912_) + @Js + def PyJs_readToken_slash_2913_(this, arguments, var=var): + var = Scope({u'this':this, u'readToken_slash':PyJs_readToken_slash_2913_, u'arguments':arguments}, var) + var.registers([u'next']) + if var.get(u"this").get(u'state').get(u'exprAllowed'): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'readRegexp') + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if PyJsStrictEq(var.get(u'next'),Js(61.0)): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'assign'), Js(2.0)) + else: + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'slash'), Js(1.0)) + PyJs_readToken_slash_2913_._set_name(u'readToken_slash') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_slash', PyJs_readToken_slash_2913_) + @Js + def PyJs_readToken_mult_modulo_2914_(code, this, arguments, var=var): + var = Scope({u'this':this, u'readToken_mult_modulo':PyJs_readToken_mult_modulo_2914_, u'code':code, u'arguments':arguments}, var) + var.registers([u'width', u'code', u'type', u'next']) + var.put(u'type', (var.get(u'types').get(u'star') if PyJsStrictEq(var.get(u'code'),Js(42.0)) else var.get(u'types').get(u'modulo'))) + var.put(u'width', Js(1.0)) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if PyJsStrictEq(var.get(u'next'),Js(42.0)): + (var.put(u'width',Js(var.get(u'width').to_number())+Js(1))-Js(1)) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(2.0)))) + var.put(u'type', var.get(u'types').get(u'exponent')) + if PyJsStrictEq(var.get(u'next'),Js(61.0)): + (var.put(u'width',Js(var.get(u'width').to_number())+Js(1))-Js(1)) + var.put(u'type', var.get(u'types').get(u'assign')) + return var.get(u"this").callprop(u'finishOp', var.get(u'type'), var.get(u'width')) + PyJs_readToken_mult_modulo_2914_._set_name(u'readToken_mult_modulo') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_mult_modulo', PyJs_readToken_mult_modulo_2914_) + @Js + def PyJs_readToken_pipe_amp_2915_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'readToken_pipe_amp':PyJs_readToken_pipe_amp_2915_}, var) + var.registers([u'code', u'next']) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if PyJsStrictEq(var.get(u'next'),var.get(u'code')): + return var.get(u"this").callprop(u'finishOp', (var.get(u'types').get(u'logicalOR') if PyJsStrictEq(var.get(u'code'),Js(124.0)) else var.get(u'types').get(u'logicalAND')), Js(2.0)) + if PyJsStrictEq(var.get(u'next'),Js(61.0)): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'assign'), Js(2.0)) + if ((PyJsStrictEq(var.get(u'code'),Js(124.0)) and PyJsStrictEq(var.get(u'next'),Js(125.0))) and var.get(u"this").callprop(u'hasPlugin', Js(u'flow'))): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'braceBarR'), Js(2.0)) + return var.get(u"this").callprop(u'finishOp', (var.get(u'types').get(u'bitwiseOR') if PyJsStrictEq(var.get(u'code'),Js(124.0)) else var.get(u'types').get(u'bitwiseAND')), Js(1.0)) + PyJs_readToken_pipe_amp_2915_._set_name(u'readToken_pipe_amp') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_pipe_amp', PyJs_readToken_pipe_amp_2915_) + @Js + def PyJs_readToken_caret_2916_(this, arguments, var=var): + var = Scope({u'this':this, u'readToken_caret':PyJs_readToken_caret_2916_, u'arguments':arguments}, var) + var.registers([u'next']) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if PyJsStrictEq(var.get(u'next'),Js(61.0)): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'assign'), Js(2.0)) + else: + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'bitwiseXOR'), Js(1.0)) + PyJs_readToken_caret_2916_._set_name(u'readToken_caret') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_caret', PyJs_readToken_caret_2916_) + @Js + def PyJs_readToken_plus_min_2917_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'readToken_plus_min':PyJs_readToken_plus_min_2917_}, var) + var.registers([u'code', u'next']) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if PyJsStrictEq(var.get(u'next'),var.get(u'code')): + if ((PyJsStrictEq(var.get(u'next'),Js(45.0)) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(2.0))),Js(62.0))) and var.get(u'lineBreak').callprop(u'test', var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'lastTokEnd'), var.get(u"this").get(u'state').get(u'pos')))): + var.get(u"this").callprop(u'skipLineComment', Js(3.0)) + var.get(u"this").callprop(u'skipSpace') + return var.get(u"this").callprop(u'nextToken') + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'incDec'), Js(2.0)) + if PyJsStrictEq(var.get(u'next'),Js(61.0)): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'assign'), Js(2.0)) + else: + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'plusMin'), Js(1.0)) + PyJs_readToken_plus_min_2917_._set_name(u'readToken_plus_min') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_plus_min', PyJs_readToken_plus_min_2917_) + @Js + def PyJs_readToken_lt_gt_2918_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'readToken_lt_gt':PyJs_readToken_lt_gt_2918_}, var) + var.registers([u'code', u'size', u'next']) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + var.put(u'size', Js(1.0)) + if PyJsStrictEq(var.get(u'next'),var.get(u'code')): + var.put(u'size', (Js(3.0) if (PyJsStrictEq(var.get(u'code'),Js(62.0)) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(2.0))),Js(62.0))) else Js(2.0))) + if PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+var.get(u'size'))),Js(61.0)): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'assign'), (var.get(u'size')+Js(1.0))) + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'bitShift'), var.get(u'size')) + if (((PyJsStrictEq(var.get(u'next'),Js(33.0)) and PyJsStrictEq(var.get(u'code'),Js(60.0))) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(2.0))),Js(45.0))) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(3.0))),Js(45.0))): + if var.get(u"this").get(u'inModule'): + var.get(u"this").callprop(u'unexpected') + var.get(u"this").callprop(u'skipLineComment', Js(4.0)) + var.get(u"this").callprop(u'skipSpace') + return var.get(u"this").callprop(u'nextToken') + if PyJsStrictEq(var.get(u'next'),Js(61.0)): + var.put(u'size', Js(2.0)) + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'relational'), var.get(u'size')) + PyJs_readToken_lt_gt_2918_._set_name(u'readToken_lt_gt') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_lt_gt', PyJs_readToken_lt_gt_2918_) + @Js + def PyJs_readToken_eq_excl_2919_(code, this, arguments, var=var): + var = Scope({u'this':this, u'readToken_eq_excl':PyJs_readToken_eq_excl_2919_, u'code':code, u'arguments':arguments}, var) + var.registers([u'code', u'next']) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if PyJsStrictEq(var.get(u'next'),Js(61.0)): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'equality'), (Js(3.0) if PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(2.0))),Js(61.0)) else Js(2.0))) + if (PyJsStrictEq(var.get(u'code'),Js(61.0)) and PyJsStrictEq(var.get(u'next'),Js(62.0))): + var.get(u"this").get(u'state').put(u'pos', Js(2.0), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'arrow')) + return var.get(u"this").callprop(u'finishOp', (var.get(u'types').get(u'eq') if PyJsStrictEq(var.get(u'code'),Js(61.0)) else var.get(u'types').get(u'prefix')), Js(1.0)) + PyJs_readToken_eq_excl_2919_._set_name(u'readToken_eq_excl') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_eq_excl', PyJs_readToken_eq_excl_2919_) + @Js + def PyJs_getTokenFromCode_2920_(code, this, arguments, var=var): + var = Scope({u'this':this, u'getTokenFromCode':PyJs_getTokenFromCode_2920_, u'code':code, u'arguments':arguments}, var) + var.registers([u'code', u'next']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'code')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(46.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_dot') + if SWITCHED or PyJsStrictEq(CONDITION, Js(40.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'parenL')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(41.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'parenR')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(59.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'semi')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(44.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'comma')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(91.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'bracketL')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(93.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'bracketR')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(123.0)): + SWITCHED = True + if (var.get(u"this").callprop(u'hasPlugin', Js(u'flow')) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0))),Js(124.0))): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'braceBarL'), Js(2.0)) + else: + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'braceL')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(125.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'braceR')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(58.0)): + SWITCHED = True + if (var.get(u"this").callprop(u'hasPlugin', Js(u'functionBind')) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0))),Js(58.0))): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'doubleColon'), Js(2.0)) + else: + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'colon')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(63.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'question')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(64.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'at')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(96.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'backQuote')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(48.0)): + SWITCHED = True + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if (PyJsStrictEq(var.get(u'next'),Js(120.0)) or PyJsStrictEq(var.get(u'next'),Js(88.0))): + return var.get(u"this").callprop(u'readRadixNumber', Js(16.0)) + if (PyJsStrictEq(var.get(u'next'),Js(111.0)) or PyJsStrictEq(var.get(u'next'),Js(79.0))): + return var.get(u"this").callprop(u'readRadixNumber', Js(8.0)) + if (PyJsStrictEq(var.get(u'next'),Js(98.0)) or PyJsStrictEq(var.get(u'next'),Js(66.0))): + return var.get(u"this").callprop(u'readRadixNumber', Js(2.0)) + if SWITCHED or PyJsStrictEq(CONDITION, Js(49.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(50.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(51.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(52.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(53.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(54.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(55.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(56.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(57.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readNumber', Js(False)) + if SWITCHED or PyJsStrictEq(CONDITION, Js(34.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(39.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readString', var.get(u'code')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(47.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_slash') + if SWITCHED or PyJsStrictEq(CONDITION, Js(37.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(42.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_mult_modulo', var.get(u'code')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(124.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(38.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_pipe_amp', var.get(u'code')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(94.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_caret') + if SWITCHED or PyJsStrictEq(CONDITION, Js(43.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(45.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_plus_min', var.get(u'code')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(60.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(62.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_lt_gt', var.get(u'code')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(61.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(33.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_eq_excl', var.get(u'code')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(126.0)): + SWITCHED = True + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'prefix'), Js(1.0)) + SWITCHED = True + break + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'pos'), ((Js(u"Unexpected character '")+var.get(u'codePointToString')(var.get(u'code')))+Js(u"'"))) + PyJs_getTokenFromCode_2920_._set_name(u'getTokenFromCode') + var.get(u'Tokenizer').get(u'prototype').put(u'getTokenFromCode', PyJs_getTokenFromCode_2920_) + @Js + def PyJs_finishOp_2921_(type, size, this, arguments, var=var): + var = Scope({u'this':this, u'finishOp':PyJs_finishOp_2921_, u'type':type, u'arguments':arguments, u'size':size}, var) + var.registers([u'type', u'str', u'size']) + var.put(u'str', var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'pos'), (var.get(u"this").get(u'state').get(u'pos')+var.get(u'size')))) + var.get(u"this").get(u'state').put(u'pos', var.get(u'size'), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'type'), var.get(u'str')) + PyJs_finishOp_2921_._set_name(u'finishOp') + var.get(u'Tokenizer').get(u'prototype').put(u'finishOp', PyJs_finishOp_2921_) + @Js + def PyJs_readRegexp_2922_(this, arguments, var=var): + var = Scope({u'this':this, u'readRegexp':PyJs_readRegexp_2922_, u'arguments':arguments}, var) + var.registers([u'content', u'ch', u'inClass', u'escaped', u'start', u'mods', u'validFlags']) + var.put(u'escaped', PyJsComma(Js(0.0), Js(None))) + var.put(u'inClass', PyJsComma(Js(0.0), Js(None))) + var.put(u'start', var.get(u"this").get(u'state').get(u'pos')) + #for JS loop + + while 1: + if (var.get(u"this").get(u'state').get(u'pos')>=var.get(u"this").get(u'input').get(u'length')): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'Unterminated regular expression')) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charAt', var.get(u"this").get(u'state').get(u'pos'))) + if var.get(u'lineBreak').callprop(u'test', var.get(u'ch')): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'Unterminated regular expression')) + if var.get(u'escaped'): + var.put(u'escaped', Js(False)) + else: + if PyJsStrictEq(var.get(u'ch'),Js(u'[')): + var.put(u'inClass', var.get(u'true')) + else: + if (PyJsStrictEq(var.get(u'ch'),Js(u']')) and var.get(u'inClass')): + var.put(u'inClass', Js(False)) + else: + if (PyJsStrictEq(var.get(u'ch'),Js(u'/')) and var.get(u'inClass').neg()): + break + var.put(u'escaped', PyJsStrictEq(var.get(u'ch'),Js(u'\\'))) + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + + var.put(u'content', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'start'), var.get(u"this").get(u'state').get(u'pos'))) + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + var.put(u'mods', var.get(u"this").callprop(u'readWord1')) + if var.get(u'mods'): + var.put(u'validFlags', JsRegExp(u'/^[gmsiyu]*$/')) + if var.get(u'validFlags').callprop(u'test', var.get(u'mods')).neg(): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'Invalid regular expression flag')) + PyJs_Object_2923_ = Js({u'pattern':var.get(u'content'),u'flags':var.get(u'mods')}) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'regexp'), PyJs_Object_2923_) + PyJs_readRegexp_2922_._set_name(u'readRegexp') + var.get(u'Tokenizer').get(u'prototype').put(u'readRegexp', PyJs_readRegexp_2922_) + @Js + def PyJs_readInt_2924_(radix, len, this, arguments, var=var): + var = Scope({u'this':this, u'readInt':PyJs_readInt_2924_, u'radix':radix, u'arguments':arguments, u'len':len}, var) + var.registers([u'code', u'e', u'val', u'i', u'len', u'start', u'radix', u'total']) + var.put(u'start', var.get(u"this").get(u'state').get(u'pos')) + var.put(u'total', Js(0.0)) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'e', (var.get(u'Infinity') if (var.get(u'len')==var.get(u"null")) else var.get(u'len'))) + while (var.get(u'i')<var.get(u'e')): + try: + var.put(u'code', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + var.put(u'val', PyJsComma(Js(0.0), Js(None))) + if (var.get(u'code')>=Js(97.0)): + var.put(u'val', ((var.get(u'code')-Js(97.0))+Js(10.0))) + else: + if (var.get(u'code')>=Js(65.0)): + var.put(u'val', ((var.get(u'code')-Js(65.0))+Js(10.0))) + else: + if ((var.get(u'code')>=Js(48.0)) and (var.get(u'code')<=Js(57.0))): + var.put(u'val', (var.get(u'code')-Js(48.0))) + else: + var.put(u'val', var.get(u'Infinity')) + if (var.get(u'val')>=var.get(u'radix')): + break + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + var.put(u'total', ((var.get(u'total')*var.get(u'radix'))+var.get(u'val'))) + finally: + var.put(u'i',Js(var.get(u'i').to_number())+Js(1)) + if (PyJsStrictEq(var.get(u"this").get(u'state').get(u'pos'),var.get(u'start')) or ((var.get(u'len')!=var.get(u"null")) and PyJsStrictNeq((var.get(u"this").get(u'state').get(u'pos')-var.get(u'start')),var.get(u'len')))): + return var.get(u"null") + return var.get(u'total') + PyJs_readInt_2924_._set_name(u'readInt') + var.get(u'Tokenizer').get(u'prototype').put(u'readInt', PyJs_readInt_2924_) + @Js + def PyJs_readRadixNumber_2925_(radix, this, arguments, var=var): + var = Scope({u'this':this, u'radix':radix, u'arguments':arguments, u'readRadixNumber':PyJs_readRadixNumber_2925_}, var) + var.registers([u'radix', u'val']) + var.get(u"this").get(u'state').put(u'pos', Js(2.0), u'+') + var.put(u'val', var.get(u"this").callprop(u'readInt', var.get(u'radix'))) + if (var.get(u'val')==var.get(u"null")): + var.get(u"this").callprop(u'raise', (var.get(u"this").get(u'state').get(u'start')+Js(2.0)), (Js(u'Expected number in radix ')+var.get(u'radix'))) + if var.get(u'isIdentifierStart')(var.get(u"this").callprop(u'fullCharCodeAtPos')): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'pos'), Js(u'Identifier directly after number')) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'num'), var.get(u'val')) + PyJs_readRadixNumber_2925_._set_name(u'readRadixNumber') + var.get(u'Tokenizer').get(u'prototype').put(u'readRadixNumber', PyJs_readRadixNumber_2925_) + @Js + def PyJs_readNumber_2926_(startsWithDot, this, arguments, var=var): + var = Scope({u'this':this, u'startsWithDot':startsWithDot, u'arguments':arguments, u'readNumber':PyJs_readNumber_2926_}, var) + var.registers([u'isFloat', u'val', u'next', u'start', u'str', u'octal', u'startsWithDot']) + var.put(u'start', var.get(u"this").get(u'state').get(u'pos')) + var.put(u'isFloat', Js(False)) + var.put(u'octal', PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos')),Js(48.0))) + if (var.get(u'startsWithDot').neg() and PyJsStrictEq(var.get(u"this").callprop(u'readInt', Js(10.0)),var.get(u"null"))): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'Invalid number')) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + if PyJsStrictEq(var.get(u'next'),Js(46.0)): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + var.get(u"this").callprop(u'readInt', Js(10.0)) + var.put(u'isFloat', var.get(u'true')) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + if (PyJsStrictEq(var.get(u'next'),Js(69.0)) or PyJsStrictEq(var.get(u'next'),Js(101.0))): + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)))) + if (PyJsStrictEq(var.get(u'next'),Js(43.0)) or PyJsStrictEq(var.get(u'next'),Js(45.0))): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + if PyJsStrictEq(var.get(u"this").callprop(u'readInt', Js(10.0)),var.get(u"null")): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'Invalid number')) + var.put(u'isFloat', var.get(u'true')) + if var.get(u'isIdentifierStart')(var.get(u"this").callprop(u'fullCharCodeAtPos')): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'pos'), Js(u'Identifier directly after number')) + var.put(u'str', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'start'), var.get(u"this").get(u'state').get(u'pos'))) + var.put(u'val', PyJsComma(Js(0.0), Js(None))) + if var.get(u'isFloat'): + var.put(u'val', var.get(u'parseFloat')(var.get(u'str'))) + else: + if (var.get(u'octal').neg() or PyJsStrictEq(var.get(u'str').get(u'length'),Js(1.0))): + var.put(u'val', var.get(u'parseInt')(var.get(u'str'), Js(10.0))) + else: + if (JsRegExp(u'/[89]/').callprop(u'test', var.get(u'str')) or var.get(u"this").get(u'state').get(u'strict')): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'Invalid number')) + else: + var.put(u'val', var.get(u'parseInt')(var.get(u'str'), Js(8.0))) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'num'), var.get(u'val')) + PyJs_readNumber_2926_._set_name(u'readNumber') + var.get(u'Tokenizer').get(u'prototype').put(u'readNumber', PyJs_readNumber_2926_) + @Js + def PyJs_readCodePoint_2927_(this, arguments, var=var): + var = Scope({u'this':this, u'readCodePoint':PyJs_readCodePoint_2927_, u'arguments':arguments}, var) + var.registers([u'code', u'ch', u'codePos']) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + var.put(u'code', PyJsComma(Js(0.0), Js(None))) + if PyJsStrictEq(var.get(u'ch'),Js(123.0)): + var.put(u'codePos', var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1))) + var.put(u'code', var.get(u"this").callprop(u'readHexChar', (var.get(u"this").get(u'input').callprop(u'indexOf', Js(u'}'), var.get(u"this").get(u'state').get(u'pos'))-var.get(u"this").get(u'state').get(u'pos')))) + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + if (var.get(u'code')>Js(1114111)): + var.get(u"this").callprop(u'raise', var.get(u'codePos'), Js(u'Code point out of bounds')) + else: + var.put(u'code', var.get(u"this").callprop(u'readHexChar', Js(4.0))) + return var.get(u'code') + PyJs_readCodePoint_2927_._set_name(u'readCodePoint') + var.get(u'Tokenizer').get(u'prototype').put(u'readCodePoint', PyJs_readCodePoint_2927_) + @Js + def PyJs_readString_2928_(quote, this, arguments, var=var): + var = Scope({u'this':this, u'quote':quote, u'arguments':arguments, u'readString':PyJs_readString_2928_}, var) + var.registers([u'ch', u'quote', u'chunkStart', u'out']) + var.put(u'out', Js(u'')) + var.put(u'chunkStart', var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1))) + #for JS loop + + while 1: + if (var.get(u"this").get(u'state').get(u'pos')>=var.get(u"this").get(u'input').get(u'length')): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'Unterminated string constant')) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + if PyJsStrictEq(var.get(u'ch'),var.get(u'quote')): + break + if PyJsStrictEq(var.get(u'ch'),Js(92.0)): + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.put(u'out', var.get(u"this").callprop(u'readEscapedChar', Js(False)), u'+') + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + else: + if var.get(u'isNewLine')(var.get(u'ch')): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'Unterminated string constant')) + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), (var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1))-Js(1))), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'string'), var.get(u'out')) + PyJs_readString_2928_._set_name(u'readString') + var.get(u'Tokenizer').get(u'prototype').put(u'readString', PyJs_readString_2928_) + @Js + def PyJs_readTmplToken_2929_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'readTmplToken':PyJs_readTmplToken_2929_}, var) + var.registers([u'ch', u'chunkStart', u'out']) + var.put(u'out', Js(u'')) + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + #for JS loop + + while 1: + if (var.get(u"this").get(u'state').get(u'pos')>=var.get(u"this").get(u'input').get(u'length')): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'Unterminated template')) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + if (PyJsStrictEq(var.get(u'ch'),Js(96.0)) or (PyJsStrictEq(var.get(u'ch'),Js(36.0)) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0))),Js(123.0)))): + if (PyJsStrictEq(var.get(u"this").get(u'state').get(u'pos'),var.get(u"this").get(u'state').get(u'start')) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'template'))): + if PyJsStrictEq(var.get(u'ch'),Js(36.0)): + var.get(u"this").get(u'state').put(u'pos', Js(2.0), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'dollarBraceL')) + else: + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'backQuote')) + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'template'), var.get(u'out')) + if PyJsStrictEq(var.get(u'ch'),Js(92.0)): + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.put(u'out', var.get(u"this").callprop(u'readEscapedChar', var.get(u'true')), u'+') + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + else: + if var.get(u'isNewLine')(var.get(u'ch')): + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + while 1: + SWITCHED = False + CONDITION = (var.get(u'ch')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(13.0)): + SWITCHED = True + if PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos')),Js(10.0)): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + if SWITCHED or PyJsStrictEq(CONDITION, Js(10.0)): + SWITCHED = True + var.put(u'out', Js(u'\n'), u'+') + break + if True: + SWITCHED = True + var.put(u'out', var.get(u'String').callprop(u'fromCharCode', var.get(u'ch')), u'+') + break + SWITCHED = True + break + var.get(u"this").get(u'state').put(u'curLine',Js(var.get(u"this").get(u'state').get(u'curLine').to_number())+Js(1)) + var.get(u"this").get(u'state').put(u'lineStart', var.get(u"this").get(u'state').get(u'pos')) + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + else: + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + + PyJs_readTmplToken_2929_._set_name(u'readTmplToken') + var.get(u'Tokenizer').get(u'prototype').put(u'readTmplToken', PyJs_readTmplToken_2929_) + @Js + def PyJs_readEscapedChar_2930_(inTemplate, this, arguments, var=var): + var = Scope({u'this':this, u'readEscapedChar':PyJs_readEscapedChar_2930_, u'inTemplate':inTemplate, u'arguments':arguments}, var) + var.registers([u'octal', u'octalStr', u'ch', u'inTemplate']) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)))) + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + while 1: + SWITCHED = False + CONDITION = (var.get(u'ch')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(110.0)): + SWITCHED = True + return Js(u'\n') + if SWITCHED or PyJsStrictEq(CONDITION, Js(114.0)): + SWITCHED = True + return Js(u'\r') + if SWITCHED or PyJsStrictEq(CONDITION, Js(120.0)): + SWITCHED = True + return var.get(u'String').callprop(u'fromCharCode', var.get(u"this").callprop(u'readHexChar', Js(2.0))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(117.0)): + SWITCHED = True + return var.get(u'codePointToString')(var.get(u"this").callprop(u'readCodePoint')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(116.0)): + SWITCHED = True + return Js(u'\t') + if SWITCHED or PyJsStrictEq(CONDITION, Js(98.0)): + SWITCHED = True + return Js(u'\x08') + if SWITCHED or PyJsStrictEq(CONDITION, Js(118.0)): + SWITCHED = True + return Js(u'\x0b') + if SWITCHED or PyJsStrictEq(CONDITION, Js(102.0)): + SWITCHED = True + return Js(u'\x0c') + if SWITCHED or PyJsStrictEq(CONDITION, Js(13.0)): + SWITCHED = True + if PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos')),Js(10.0)): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + if SWITCHED or PyJsStrictEq(CONDITION, Js(10.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'lineStart', var.get(u"this").get(u'state').get(u'pos')) + var.get(u"this").get(u'state').put(u'curLine',Js(var.get(u"this").get(u'state').get(u'curLine').to_number())+Js(1)) + return Js(u'') + if True: + SWITCHED = True + if ((var.get(u'ch')>=Js(48.0)) and (var.get(u'ch')<=Js(55.0))): + var.put(u'octalStr', var.get(u"this").get(u'input').callprop(u'substr', (var.get(u"this").get(u'state').get(u'pos')-Js(1.0)), Js(3.0)).callprop(u'match', JsRegExp(u'/^[0-7]+/')).get(u'0')) + var.put(u'octal', var.get(u'parseInt')(var.get(u'octalStr'), Js(8.0))) + if (var.get(u'octal')>Js(255.0)): + var.put(u'octalStr', var.get(u'octalStr').callprop(u'slice', Js(0.0), (-Js(1.0)))) + var.put(u'octal', var.get(u'parseInt')(var.get(u'octalStr'), Js(8.0))) + if (var.get(u'octal')>Js(0.0)): + if var.get(u"this").get(u'state').get(u'containsOctal').neg(): + var.get(u"this").get(u'state').put(u'containsOctal', var.get(u'true')) + var.get(u"this").get(u'state').put(u'octalPosition', (var.get(u"this").get(u'state').get(u'pos')-Js(2.0))) + if (var.get(u"this").get(u'state').get(u'strict') or var.get(u'inTemplate')): + var.get(u"this").callprop(u'raise', (var.get(u"this").get(u'state').get(u'pos')-Js(2.0)), Js(u'Octal literal in strict mode')) + var.get(u"this").get(u'state').put(u'pos', (var.get(u'octalStr').get(u'length')-Js(1.0)), u'+') + return var.get(u'String').callprop(u'fromCharCode', var.get(u'octal')) + return var.get(u'String').callprop(u'fromCharCode', var.get(u'ch')) + SWITCHED = True + break + PyJs_readEscapedChar_2930_._set_name(u'readEscapedChar') + var.get(u'Tokenizer').get(u'prototype').put(u'readEscapedChar', PyJs_readEscapedChar_2930_) + @Js + def PyJs_readHexChar_2931_(len, this, arguments, var=var): + var = Scope({u'this':this, u'readHexChar':PyJs_readHexChar_2931_, u'arguments':arguments, u'len':len}, var) + var.registers([u'codePos', u'len', u'n']) + var.put(u'codePos', var.get(u"this").get(u'state').get(u'pos')) + var.put(u'n', var.get(u"this").callprop(u'readInt', Js(16.0), var.get(u'len'))) + if PyJsStrictEq(var.get(u'n'),var.get(u"null")): + var.get(u"this").callprop(u'raise', var.get(u'codePos'), Js(u'Bad character escape sequence')) + return var.get(u'n') + PyJs_readHexChar_2931_._set_name(u'readHexChar') + var.get(u'Tokenizer').get(u'prototype').put(u'readHexChar', PyJs_readHexChar_2931_) + @Js + def PyJs_readWord1_2932_(this, arguments, var=var): + var = Scope({u'this':this, u'readWord1':PyJs_readWord1_2932_, u'arguments':arguments}, var) + var.registers([u'ch', u'word', u'chunkStart', u'escStart', u'esc', u'first']) + var.get(u"this").get(u'state').put(u'containsEsc', Js(False)) + var.put(u'word', Js(u'')) + var.put(u'first', var.get(u'true')) + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + while (var.get(u"this").get(u'state').get(u'pos')<var.get(u"this").get(u'input').get(u'length')): + var.put(u'ch', var.get(u"this").callprop(u'fullCharCodeAtPos')) + if var.get(u'isIdentifierChar')(var.get(u'ch')): + var.get(u"this").get(u'state').put(u'pos', (Js(1.0) if (var.get(u'ch')<=Js(65535)) else Js(2.0)), u'+') + else: + if PyJsStrictEq(var.get(u'ch'),Js(92.0)): + var.get(u"this").get(u'state').put(u'containsEsc', var.get(u'true')) + var.put(u'word', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.put(u'escStart', var.get(u"this").get(u'state').get(u'pos')) + if PyJsStrictNeq(var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1))),Js(117.0)): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'pos'), Js(u'Expecting Unicode escape sequence \\uXXXX')) + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + var.put(u'esc', var.get(u"this").callprop(u'readCodePoint')) + if (var.get(u'isIdentifierStart') if var.get(u'first') else var.get(u'isIdentifierChar'))(var.get(u'esc'), var.get(u'true')).neg(): + var.get(u"this").callprop(u'raise', var.get(u'escStart'), Js(u'Invalid Unicode escape')) + var.put(u'word', var.get(u'codePointToString')(var.get(u'esc')), u'+') + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + else: + break + var.put(u'first', Js(False)) + return (var.get(u'word')+var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos'))) + PyJs_readWord1_2932_._set_name(u'readWord1') + var.get(u'Tokenizer').get(u'prototype').put(u'readWord1', PyJs_readWord1_2932_) + @Js + def PyJs_readWord_2933_(this, arguments, var=var): + var = Scope({u'this':this, u'readWord':PyJs_readWord_2933_, u'arguments':arguments}, var) + var.registers([u'type', u'word']) + var.put(u'word', var.get(u"this").callprop(u'readWord1')) + var.put(u'type', var.get(u'types').get(u'name')) + if (var.get(u"this").get(u'state').get(u'containsEsc').neg() and var.get(u"this").callprop(u'isKeyword', var.get(u'word'))): + var.put(u'type', var.get(u'keywords').get(var.get(u'word'))) + return var.get(u"this").callprop(u'finishToken', var.get(u'type'), var.get(u'word')) + PyJs_readWord_2933_._set_name(u'readWord') + var.get(u'Tokenizer').get(u'prototype').put(u'readWord', PyJs_readWord_2933_) + @Js + def PyJs_braceIsBlock_2934_(prevType, this, arguments, var=var): + var = Scope({u'this':this, u'braceIsBlock':PyJs_braceIsBlock_2934_, u'arguments':arguments, u'prevType':prevType}, var) + var.registers([u'parent', u'prevType']) + if PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'colon')): + var.put(u'parent', var.get(u"this").callprop(u'curContext')) + if (PyJsStrictEq(var.get(u'parent'),var.get(u'types$1').get(u'braceStatement')) or PyJsStrictEq(var.get(u'parent'),var.get(u'types$1').get(u'braceExpression'))): + return var.get(u'parent').get(u'isExpr').neg() + if PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_return')): + return var.get(u'lineBreak').callprop(u'test', var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'lastTokEnd'), var.get(u"this").get(u'state').get(u'start'))) + if (((PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_else')) or PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'semi'))) or PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'eof'))) or PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'parenR'))): + return var.get(u'true') + if PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'braceL')): + return PyJsStrictEq(var.get(u"this").callprop(u'curContext'),var.get(u'types$1').get(u'braceStatement')) + return var.get(u"this").get(u'state').get(u'exprAllowed').neg() + PyJs_braceIsBlock_2934_._set_name(u'braceIsBlock') + var.get(u'Tokenizer').get(u'prototype').put(u'braceIsBlock', PyJs_braceIsBlock_2934_) + @Js + def PyJs_updateContext_2935_(prevType, this, arguments, var=var): + var = Scope({u'this':this, u'updateContext':PyJs_updateContext_2935_, u'arguments':arguments, u'prevType':prevType}, var) + var.registers([u'type', u'update', u'prevType']) + var.put(u'update', PyJsComma(Js(0.0), Js(None))) + var.put(u'type', var.get(u"this").get(u'state').get(u'type')) + if (var.get(u'type').get(u'keyword') and PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'dot'))): + var.get(u"this").get(u'state').put(u'exprAllowed', Js(False)) + else: + if var.put(u'update', var.get(u'type').get(u'updateContext')): + var.get(u'update').callprop(u'call', var.get(u"this"), var.get(u'prevType')) + else: + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'type').get(u'beforeExpr')) + PyJs_updateContext_2935_._set_name(u'updateContext') + var.get(u'Tokenizer').get(u'prototype').put(u'updateContext', PyJs_updateContext_2935_) + return var.get(u'Tokenizer') + PyJs_anonymous_2895_._set_name(u'anonymous') + var.put(u'Tokenizer', PyJs_anonymous_2895_()) + pass + pass + pass + PyJs_Object_2938_ = Js({}) + var.put(u'plugins', PyJs_Object_2938_) + @Js + def PyJs_anonymous_2939_(_Tokenizer, this, arguments, var=var): + var = Scope({u'this':this, u'_Tokenizer':_Tokenizer, u'arguments':arguments}, var) + var.registers([u'Parser', u'_Tokenizer']) + @Js + def PyJsHoisted_Parser_(options, input, this, arguments, var=var): + var = Scope({u'this':this, u'input':input, u'options':options, u'arguments':arguments}, var) + var.registers([u'input', u'options', u'_this']) + var.get(u'_classCallCheck')(var.get(u"this"), var.get(u'Parser')) + var.put(u'options', var.get(u'getOptions')(var.get(u'options'))) + var.put(u'_this', var.get(u'_possibleConstructorReturn')(var.get(u"this"), var.get(u'_Tokenizer').callprop(u'call', var.get(u"this"), var.get(u'options'), var.get(u'input')))) + var.get(u'_this').put(u'options', var.get(u'options')) + var.get(u'_this').put(u'inModule', PyJsStrictEq(var.get(u'_this').get(u'options').get(u'sourceType'),Js(u'module'))) + var.get(u'_this').put(u'isReservedWord', var.get(u'reservedWords').get(u'6')) + var.get(u'_this').put(u'input', var.get(u'input')) + var.get(u'_this').put(u'plugins', var.get(u'_this').callprop(u'loadPlugins', var.get(u'_this').get(u'options').get(u'plugins'))) + var.get(u'_this').put(u'filename', var.get(u'options').get(u'sourceFilename')) + if ((PyJsStrictEq(var.get(u'_this').get(u'state').get(u'pos'),Js(0.0)) and PyJsStrictEq(var.get(u'_this').get(u'input').get(u'0'),Js(u'#'))) and PyJsStrictEq(var.get(u'_this').get(u'input').get(u'1'),Js(u'!'))): + var.get(u'_this').callprop(u'skipLineComment', Js(2.0)) + return var.get(u'_this') + PyJsHoisted_Parser_.func_name = u'Parser' + var.put(u'Parser', PyJsHoisted_Parser_) + var.get(u'_inherits')(var.get(u'Parser'), var.get(u'_Tokenizer')) + pass + @Js + def PyJs_hasPlugin_2940_(name, this, arguments, var=var): + var = Scope({u'this':this, u'hasPlugin':PyJs_hasPlugin_2940_, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return (var.get(u"this").get(u'plugins').get(u'*') or var.get(u"this").get(u'plugins').get(var.get(u'name'))).neg().neg() + PyJs_hasPlugin_2940_._set_name(u'hasPlugin') + var.get(u'Parser').get(u'prototype').put(u'hasPlugin', PyJs_hasPlugin_2940_) + @Js + def PyJs_extend_2941_(name, f, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'name':name, u'extend':PyJs_extend_2941_, u'f':f}, var) + var.registers([u'name', u'f']) + var.get(u"this").put(var.get(u'name'), var.get(u'f')(var.get(u"this").get(var.get(u'name')))) + PyJs_extend_2941_._set_name(u'extend') + var.get(u'Parser').get(u'prototype').put(u'extend', PyJs_extend_2941_) + @Js + def PyJs_loadPlugins_2942_(pluginList, this, arguments, var=var): + var = Scope({u'this':this, u'pluginList':pluginList, u'arguments':arguments, u'loadPlugins':PyJs_loadPlugins_2942_}, var) + var.registers([u'_isArray', u'pluginList', u'_iterator', u'name', u'plugin', u'_i', u'pluginMap', u'_ref']) + PyJs_Object_2943_ = Js({}) + var.put(u'pluginMap', PyJs_Object_2943_) + if (var.get(u'pluginList').callprop(u'indexOf', Js(u'flow'))>=Js(0.0)): + @Js + def PyJs_anonymous_2944_(plugin, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'plugin':plugin}, var) + var.registers([u'plugin']) + return PyJsStrictNeq(var.get(u'plugin'),Js(u'flow')) + PyJs_anonymous_2944_._set_name(u'anonymous') + var.put(u'pluginList', var.get(u'pluginList').callprop(u'filter', PyJs_anonymous_2944_)) + var.get(u'pluginList').callprop(u'push', Js(u'flow')) + #for JS loop + var.put(u'_iterator', var.get(u'pluginList')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else var.get(u'_iterator').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'name', var.get(u'_ref')) + if var.get(u'pluginMap').get(var.get(u'name')).neg(): + var.get(u'pluginMap').put(var.get(u'name'), var.get(u'true')) + var.put(u'plugin', var.get(u'plugins').get(var.get(u'name'))) + if var.get(u'plugin'): + var.get(u'plugin')(var.get(u"this")) + + return var.get(u'pluginMap') + PyJs_loadPlugins_2942_._set_name(u'loadPlugins') + var.get(u'Parser').get(u'prototype').put(u'loadPlugins', PyJs_loadPlugins_2942_) + @Js + def PyJs_parse_2945_(this, arguments, var=var): + var = Scope({u'this':this, u'parse':PyJs_parse_2945_, u'arguments':arguments}, var) + var.registers([u'program', u'file']) + var.put(u'file', var.get(u"this").callprop(u'startNode')) + var.put(u'program', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'nextToken') + return var.get(u"this").callprop(u'parseTopLevel', var.get(u'file'), var.get(u'program')) + PyJs_parse_2945_._set_name(u'parse') + var.get(u'Parser').get(u'prototype').put(u'parse', PyJs_parse_2945_) + return var.get(u'Parser') + PyJs_anonymous_2939_._set_name(u'anonymous') + var.put(u'Parser', PyJs_anonymous_2939_(var.get(u'Tokenizer'))) + @Js + def PyJs_anonymous_2946_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return var.get(u'obj',throw=False).typeof() + PyJs_anonymous_2946_._set_name(u'anonymous') + @Js + def PyJs_anonymous_2947_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return (Js(u'symbol') if (((var.get(u'obj') and PyJsStrictEq(var.get(u'Symbol',throw=False).typeof(),Js(u'function'))) and PyJsStrictEq(var.get(u'obj').get(u'constructor'),var.get(u'Symbol'))) and PyJsStrictNeq(var.get(u'obj'),var.get(u'Symbol').get(u'prototype'))) else var.get(u'obj',throw=False).typeof()) + PyJs_anonymous_2947_._set_name(u'anonymous') + var.put(u'_typeof', (PyJs_anonymous_2946_ if (PyJsStrictEq(var.get(u'Symbol',throw=False).typeof(),Js(u'function')) and PyJsStrictEq(var.get(u'Symbol').get(u'iterator').typeof(),Js(u'symbol'))) else PyJs_anonymous_2947_)) + var.put(u'pp', var.get(u'Parser').get(u'prototype')) + @Js + def PyJs_anonymous_2948_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'node', u'val', u'key', u'extra']) + if var.get(u'node').neg(): + return var.get('undefined') + PyJs_Object_2949_ = Js({}) + var.put(u'extra', var.get(u'node').put(u'extra', (var.get(u'node').get(u'extra') or PyJs_Object_2949_))) + var.get(u'extra').put(var.get(u'key'), var.get(u'val')) + PyJs_anonymous_2948_._set_name(u'anonymous') + var.get(u'pp').put(u'addExtra', PyJs_anonymous_2948_) + @Js + def PyJs_anonymous_2950_(op, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'op':op}, var) + var.registers([u'op']) + return (var.get(u"this").callprop(u'match', var.get(u'types').get(u'relational')) and PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),var.get(u'op'))) + PyJs_anonymous_2950_._set_name(u'anonymous') + var.get(u'pp').put(u'isRelational', PyJs_anonymous_2950_) + @Js + def PyJs_anonymous_2951_(op, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'op':op}, var) + var.registers([u'op']) + if var.get(u"this").callprop(u'isRelational', var.get(u'op')): + var.get(u"this").callprop(u'next') + else: + var.get(u"this").callprop(u'unexpected', var.get(u"null"), var.get(u'types').get(u'relational')) + PyJs_anonymous_2951_._set_name(u'anonymous') + var.get(u'pp').put(u'expectRelational', PyJs_anonymous_2951_) + @Js + def PyJs_anonymous_2952_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return (var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')) and PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),var.get(u'name'))) + PyJs_anonymous_2952_._set_name(u'anonymous') + var.get(u'pp').put(u'isContextual', PyJs_anonymous_2952_) + @Js + def PyJs_anonymous_2953_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return (PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),var.get(u'name')) and var.get(u"this").callprop(u'eat', var.get(u'types').get(u'name'))) + PyJs_anonymous_2953_._set_name(u'anonymous') + var.get(u'pp').put(u'eatContextual', PyJs_anonymous_2953_) + @Js + def PyJs_anonymous_2954_(name, message, this, arguments, var=var): + var = Scope({u'this':this, u'message':message, u'name':name, u'arguments':arguments}, var) + var.registers([u'message', u'name']) + if var.get(u"this").callprop(u'eatContextual', var.get(u'name')).neg(): + var.get(u"this").callprop(u'unexpected', var.get(u"null"), var.get(u'message')) + PyJs_anonymous_2954_._set_name(u'anonymous') + var.get(u'pp').put(u'expectContextual', PyJs_anonymous_2954_) + @Js + def PyJs_anonymous_2955_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return ((var.get(u"this").callprop(u'match', var.get(u'types').get(u'eof')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceR'))) or var.get(u'lineBreak').callprop(u'test', var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'lastTokEnd'), var.get(u"this").get(u'state').get(u'start')))) + PyJs_anonymous_2955_._set_name(u'anonymous') + var.get(u'pp').put(u'canInsertSemicolon', PyJs_anonymous_2955_) + @Js + def PyJs_anonymous_2956_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return (var.get(u"this").callprop(u'eat', var.get(u'types').get(u'semi')) or var.get(u"this").callprop(u'canInsertSemicolon')) + PyJs_anonymous_2956_._set_name(u'anonymous') + var.get(u'pp').put(u'isLineTerminator', PyJs_anonymous_2956_) + @Js + def PyJs_anonymous_2957_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").callprop(u'isLineTerminator').neg(): + var.get(u"this").callprop(u'unexpected', var.get(u"null"), var.get(u'types').get(u'semi')) + PyJs_anonymous_2957_._set_name(u'anonymous') + var.get(u'pp').put(u'semicolon', PyJs_anonymous_2957_) + @Js + def PyJs_anonymous_2958_(type, pos, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'pos':pos, u'arguments':arguments}, var) + var.registers([u'type', u'pos']) + return (var.get(u"this").callprop(u'eat', var.get(u'type')) or var.get(u"this").callprop(u'unexpected', var.get(u'pos'), var.get(u'type'))) + PyJs_anonymous_2958_._set_name(u'anonymous') + var.get(u'pp').put(u'expect', PyJs_anonymous_2958_) + @Js + def PyJs_anonymous_2959_(pos, this, arguments, var=var): + var = Scope({u'this':this, u'pos':pos, u'arguments':arguments}, var) + var.registers([u'pos', u'messageOrType']) + var.put(u'messageOrType', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js(u'Unexpected token'))) + if ((var.get(u'messageOrType') and PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'messageOrType',throw=False).typeof(),Js(u'undefined')) else var.get(u'_typeof')(var.get(u'messageOrType'))),Js(u'object'))) and var.get(u'messageOrType').get(u'label')): + var.put(u'messageOrType', (Js(u'Unexpected token, expected ')+var.get(u'messageOrType').get(u'label'))) + var.get(u"this").callprop(u'raise', (var.get(u'pos') if (var.get(u'pos')!=var.get(u"null")) else var.get(u"this").get(u'state').get(u'start')), var.get(u'messageOrType')) + PyJs_anonymous_2959_._set_name(u'anonymous') + var.get(u'pp').put(u'unexpected', PyJs_anonymous_2959_) + var.put(u'pp$1', var.get(u'Parser').get(u'prototype')) + @Js + def PyJs_anonymous_2960_(file, program, this, arguments, var=var): + var = Scope({u'this':this, u'program':program, u'arguments':arguments, u'file':file}, var) + var.registers([u'program', u'file']) + var.get(u'program').put(u'sourceType', var.get(u"this").get(u'options').get(u'sourceType')) + var.get(u"this").callprop(u'parseBlockBody', var.get(u'program'), var.get(u'true'), var.get(u'true'), var.get(u'types').get(u'eof')) + var.get(u'file').put(u'program', var.get(u"this").callprop(u'finishNode', var.get(u'program'), Js(u'Program'))) + var.get(u'file').put(u'comments', var.get(u"this").get(u'state').get(u'comments')) + var.get(u'file').put(u'tokens', var.get(u"this").get(u'state').get(u'tokens')) + return var.get(u"this").callprop(u'finishNode', var.get(u'file'), Js(u'File')) + PyJs_anonymous_2960_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseTopLevel', PyJs_anonymous_2960_) + PyJs_Object_2961_ = Js({u'kind':Js(u'loop')}) + var.put(u'loopLabel', PyJs_Object_2961_) + PyJs_Object_2962_ = Js({u'kind':Js(u'switch')}) + var.put(u'switchLabel', PyJs_Object_2962_) + @Js + def PyJs_anonymous_2963_(stmt, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'stmt':stmt}, var) + var.registers([u'directiveLiteral', u'directive', u'val', u'expr', u'stmt', u'raw']) + var.put(u'expr', var.get(u'stmt').get(u'expression')) + var.put(u'directiveLiteral', var.get(u"this").callprop(u'startNodeAt', var.get(u'expr').get(u'start'), var.get(u'expr').get(u'loc').get(u'start'))) + var.put(u'directive', var.get(u"this").callprop(u'startNodeAt', var.get(u'stmt').get(u'start'), var.get(u'stmt').get(u'loc').get(u'start'))) + var.put(u'raw', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'expr').get(u'start'), var.get(u'expr').get(u'end'))) + var.put(u'val', var.get(u'directiveLiteral').put(u'value', var.get(u'raw').callprop(u'slice', Js(1.0), (-Js(1.0))))) + var.get(u"this").callprop(u'addExtra', var.get(u'directiveLiteral'), Js(u'raw'), var.get(u'raw')) + var.get(u"this").callprop(u'addExtra', var.get(u'directiveLiteral'), Js(u'rawValue'), var.get(u'val')) + var.get(u'directive').put(u'value', var.get(u"this").callprop(u'finishNodeAt', var.get(u'directiveLiteral'), Js(u'DirectiveLiteral'), var.get(u'expr').get(u'end'), var.get(u'expr').get(u'loc').get(u'end'))) + return var.get(u"this").callprop(u'finishNodeAt', var.get(u'directive'), Js(u'Directive'), var.get(u'stmt').get(u'end'), var.get(u'stmt').get(u'loc').get(u'end')) + PyJs_anonymous_2963_._set_name(u'anonymous') + var.get(u'pp$1').put(u'stmtToDirective', PyJs_anonymous_2963_) + @Js + def PyJs_anonymous_2964_(declaration, topLevel, this, arguments, var=var): + var = Scope({u'this':this, u'topLevel':topLevel, u'arguments':arguments, u'declaration':declaration}, var) + var.registers([u'node', u'expr', u'topLevel', u'state', u'starttype', u'declaration', u'maybeName']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'at')): + var.get(u"this").callprop(u'parseDecorators', var.get(u'true')) + var.put(u'starttype', var.get(u"this").get(u'state').get(u'type')) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'starttype')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_break')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_continue')): + SWITCHED = True + return var.get(u"this").callprop(u'parseBreakContinueStatement', var.get(u'node'), var.get(u'starttype').get(u'keyword')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_debugger')): + SWITCHED = True + return var.get(u"this").callprop(u'parseDebuggerStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_do')): + SWITCHED = True + return var.get(u"this").callprop(u'parseDoStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_for')): + SWITCHED = True + return var.get(u"this").callprop(u'parseForStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_function')): + SWITCHED = True + if var.get(u'declaration').neg(): + var.get(u"this").callprop(u'unexpected') + return var.get(u"this").callprop(u'parseFunctionStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_class')): + SWITCHED = True + if var.get(u'declaration').neg(): + var.get(u"this").callprop(u'unexpected') + var.get(u"this").callprop(u'takeDecorators', var.get(u'node')) + return var.get(u"this").callprop(u'parseClass', var.get(u'node'), var.get(u'true')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_if')): + SWITCHED = True + return var.get(u"this").callprop(u'parseIfStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_return')): + SWITCHED = True + return var.get(u"this").callprop(u'parseReturnStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_switch')): + SWITCHED = True + return var.get(u"this").callprop(u'parseSwitchStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_throw')): + SWITCHED = True + return var.get(u"this").callprop(u'parseThrowStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_try')): + SWITCHED = True + return var.get(u"this").callprop(u'parseTryStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_let')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_const')): + SWITCHED = True + if var.get(u'declaration').neg(): + var.get(u"this").callprop(u'unexpected') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_var')): + SWITCHED = True + return var.get(u"this").callprop(u'parseVarStatement', var.get(u'node'), var.get(u'starttype')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_while')): + SWITCHED = True + return var.get(u"this").callprop(u'parseWhileStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_with')): + SWITCHED = True + return var.get(u"this").callprop(u'parseWithStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'braceL')): + SWITCHED = True + return var.get(u"this").callprop(u'parseBlock') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'semi')): + SWITCHED = True + return var.get(u"this").callprop(u'parseEmptyStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_export')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_import')): + SWITCHED = True + if (var.get(u"this").callprop(u'hasPlugin', Js(u'dynamicImport')) and PyJsStrictEq(var.get(u"this").callprop(u'lookahead').get(u'type'),var.get(u'types').get(u'parenL'))): + break + if var.get(u"this").get(u'options').get(u'allowImportExportEverywhere').neg(): + if var.get(u'topLevel').neg(): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u"'import' and 'export' may only appear at the top level")) + if var.get(u"this").get(u'inModule').neg(): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u"'import' and 'export' may appear only with 'sourceType: module'")) + return (var.get(u"this").callprop(u'parseImport', var.get(u'node')) if PyJsStrictEq(var.get(u'starttype'),var.get(u'types').get(u'_import')) else var.get(u"this").callprop(u'parseExport', var.get(u'node'))) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'name')): + SWITCHED = True + if PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'async')): + var.put(u'state', var.get(u"this").get(u'state').callprop(u'clone')) + var.get(u"this").callprop(u'next') + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'_function')) and var.get(u"this").callprop(u'canInsertSemicolon').neg()): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'_function')) + return var.get(u"this").callprop(u'parseFunction', var.get(u'node'), var.get(u'true'), Js(False), var.get(u'true')) + else: + var.get(u"this").put(u'state', var.get(u'state')) + SWITCHED = True + break + var.put(u'maybeName', var.get(u"this").get(u'state').get(u'value')) + var.put(u'expr', var.get(u"this").callprop(u'parseExpression')) + if ((PyJsStrictEq(var.get(u'starttype'),var.get(u'types').get(u'name')) and PyJsStrictEq(var.get(u'expr').get(u'type'),Js(u'Identifier'))) and var.get(u"this").callprop(u'eat', var.get(u'types').get(u'colon'))): + return var.get(u"this").callprop(u'parseLabeledStatement', var.get(u'node'), var.get(u'maybeName'), var.get(u'expr')) + else: + return var.get(u"this").callprop(u'parseExpressionStatement', var.get(u'node'), var.get(u'expr')) + PyJs_anonymous_2964_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseStatement', PyJs_anonymous_2964_) + @Js + def PyJs_anonymous_2965_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").get(u'state').get(u'decorators').get(u'length'): + var.get(u'node').put(u'decorators', var.get(u"this").get(u'state').get(u'decorators')) + var.get(u"this").get(u'state').put(u'decorators', Js([])) + PyJs_anonymous_2965_._set_name(u'anonymous') + var.get(u'pp$1').put(u'takeDecorators', PyJs_anonymous_2965_) + @Js + def PyJs_anonymous_2966_(allowExport, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'allowExport':allowExport}, var) + var.registers([u'allowExport']) + while var.get(u"this").callprop(u'match', var.get(u'types').get(u'at')): + var.get(u"this").get(u'state').get(u'decorators').callprop(u'push', var.get(u"this").callprop(u'parseDecorator')) + if (var.get(u'allowExport') and var.get(u"this").callprop(u'match', var.get(u'types').get(u'_export'))): + return var.get('undefined') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_class')).neg(): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'Leading decorators must be attached to a class declaration')) + PyJs_anonymous_2966_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseDecorators', PyJs_anonymous_2966_) + @Js + def PyJs_anonymous_2967_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'hasPlugin', Js(u'decorators')).neg(): + var.get(u"this").callprop(u'unexpected') + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'expression', var.get(u"this").callprop(u'parseMaybeAssign')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'Decorator')) + PyJs_anonymous_2967_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseDecorator', PyJs_anonymous_2967_) + @Js + def PyJs_anonymous_2968_(node, keyword, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'keyword':keyword}, var) + var.registers([u'i', u'node', u'isBreak', u'keyword', u'lab']) + var.put(u'isBreak', PyJsStrictEq(var.get(u'keyword'),Js(u'break'))) + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'isLineTerminator'): + var.get(u'node').put(u'label', var.get(u"null")) + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')).neg(): + var.get(u"this").callprop(u'unexpected') + else: + var.get(u'node').put(u'label', var.get(u"this").callprop(u'parseIdentifier')) + var.get(u"this").callprop(u'semicolon') + var.put(u'i', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u"this").get(u'state').get(u'labels').get(u'length')): + try: + var.put(u'lab', var.get(u"this").get(u'state').get(u'labels').get(var.get(u'i'))) + if ((var.get(u'node').get(u'label')==var.get(u"null")) or PyJsStrictEq(var.get(u'lab').get(u'name'),var.get(u'node').get(u'label').get(u'name'))): + if ((var.get(u'lab').get(u'kind')!=var.get(u"null")) and (var.get(u'isBreak') or PyJsStrictEq(var.get(u'lab').get(u'kind'),Js(u'loop')))): + break + if (var.get(u'node').get(u'label') and var.get(u'isBreak')): + break + finally: + var.put(u'i',Js(var.get(u'i').to_number())+Js(1)) + if PyJsStrictEq(var.get(u'i'),var.get(u"this").get(u'state').get(u'labels').get(u'length')): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), (Js(u'Unsyntactic ')+var.get(u'keyword'))) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), (Js(u'BreakStatement') if var.get(u'isBreak') else Js(u'ContinueStatement'))) + PyJs_anonymous_2968_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseBreakContinueStatement', PyJs_anonymous_2968_) + @Js + def PyJs_anonymous_2969_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DebuggerStatement')) + PyJs_anonymous_2969_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseDebuggerStatement', PyJs_anonymous_2969_) + @Js + def PyJs_anonymous_2970_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + var.get(u"this").get(u'state').get(u'labels').callprop(u'push', var.get(u'loopLabel')) + var.get(u'node').put(u'body', var.get(u"this").callprop(u'parseStatement', Js(False))) + var.get(u"this").get(u'state').get(u'labels').callprop(u'pop') + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'_while')) + var.get(u'node').put(u'test', var.get(u"this").callprop(u'parseParenExpression')) + var.get(u"this").callprop(u'eat', var.get(u'types').get(u'semi')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DoWhileStatement')) + PyJs_anonymous_2970_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseDoStatement', PyJs_anonymous_2970_) + @Js + def PyJs_anonymous_2971_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'description', u'_init', u'init', u'varKind', u'refShorthandDefaultPos', u'forAwait']) + var.get(u"this").callprop(u'next') + var.get(u"this").get(u'state').get(u'labels').callprop(u'push', var.get(u'loopLabel')) + var.put(u'forAwait', Js(False)) + if ((var.get(u"this").callprop(u'hasPlugin', Js(u'asyncGenerators')) and var.get(u"this").get(u'state').get(u'inAsync')) and var.get(u"this").callprop(u'isContextual', Js(u'await'))): + var.put(u'forAwait', var.get(u'true')) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'semi')): + if var.get(u'forAwait'): + var.get(u"this").callprop(u'unexpected') + return var.get(u"this").callprop(u'parseFor', var.get(u'node'), var.get(u"null")) + if ((var.get(u"this").callprop(u'match', var.get(u'types').get(u'_var')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'_let'))) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'_const'))): + var.put(u'_init', var.get(u"this").callprop(u'startNode')) + var.put(u'varKind', var.get(u"this").get(u'state').get(u'type')) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'parseVar', var.get(u'_init'), var.get(u'true'), var.get(u'varKind')) + var.get(u"this").callprop(u'finishNode', var.get(u'_init'), Js(u'VariableDeclaration')) + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'_in')) or var.get(u"this").callprop(u'isContextual', Js(u'of'))): + if (PyJsStrictEq(var.get(u'_init').get(u'declarations').get(u'length'),Js(1.0)) and var.get(u'_init').get(u'declarations').get(u'0').get(u'init').neg()): + return var.get(u"this").callprop(u'parseForIn', var.get(u'node'), var.get(u'_init'), var.get(u'forAwait')) + if var.get(u'forAwait'): + var.get(u"this").callprop(u'unexpected') + return var.get(u"this").callprop(u'parseFor', var.get(u'node'), var.get(u'_init')) + PyJs_Object_2972_ = Js({u'start':Js(0.0)}) + var.put(u'refShorthandDefaultPos', PyJs_Object_2972_) + var.put(u'init', var.get(u"this").callprop(u'parseExpression', var.get(u'true'), var.get(u'refShorthandDefaultPos'))) + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'_in')) or var.get(u"this").callprop(u'isContextual', Js(u'of'))): + var.put(u'description', (Js(u'for-of statement') if var.get(u"this").callprop(u'isContextual', Js(u'of')) else Js(u'for-in statement'))) + var.get(u"this").callprop(u'toAssignable', var.get(u'init'), var.get(u'undefined'), var.get(u'description')) + var.get(u"this").callprop(u'checkLVal', var.get(u'init'), var.get(u'undefined'), var.get(u'undefined'), var.get(u'description')) + return var.get(u"this").callprop(u'parseForIn', var.get(u'node'), var.get(u'init'), var.get(u'forAwait')) + else: + if var.get(u'refShorthandDefaultPos').get(u'start'): + var.get(u"this").callprop(u'unexpected', var.get(u'refShorthandDefaultPos').get(u'start')) + if var.get(u'forAwait'): + var.get(u"this").callprop(u'unexpected') + return var.get(u"this").callprop(u'parseFor', var.get(u'node'), var.get(u'init')) + PyJs_anonymous_2971_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseForStatement', PyJs_anonymous_2971_) + @Js + def PyJs_anonymous_2973_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'parseFunction', var.get(u'node'), var.get(u'true')) + PyJs_anonymous_2973_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseFunctionStatement', PyJs_anonymous_2973_) + @Js + def PyJs_anonymous_2974_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'test', var.get(u"this").callprop(u'parseParenExpression')) + var.get(u'node').put(u'consequent', var.get(u"this").callprop(u'parseStatement', Js(False))) + var.get(u'node').put(u'alternate', (var.get(u"this").callprop(u'parseStatement', Js(False)) if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'_else')) else var.get(u"null"))) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'IfStatement')) + PyJs_anonymous_2974_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseIfStatement', PyJs_anonymous_2974_) + @Js + def PyJs_anonymous_2975_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if (var.get(u"this").get(u'state').get(u'inFunction').neg() and var.get(u"this").get(u'options').get(u'allowReturnOutsideFunction').neg()): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u"'return' outside of function")) + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'isLineTerminator'): + var.get(u'node').put(u'argument', var.get(u"null")) + else: + var.get(u'node').put(u'argument', var.get(u"this").callprop(u'parseExpression')) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ReturnStatement')) + PyJs_anonymous_2975_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseReturnStatement', PyJs_anonymous_2975_) + @Js + def PyJs_anonymous_2976_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'sawDefault', u'node', u'isCase', u'cur']) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'discriminant', var.get(u"this").callprop(u'parseParenExpression')) + var.get(u'node').put(u'cases', Js([])) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceL')) + var.get(u"this").get(u'state').get(u'labels').callprop(u'push', var.get(u'switchLabel')) + var.put(u'cur', PyJsComma(Js(0.0), Js(None))) + #for JS loop + pass + while var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceR')).neg(): + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'_case')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'_default'))): + var.put(u'isCase', var.get(u"this").callprop(u'match', var.get(u'types').get(u'_case'))) + if var.get(u'cur'): + var.get(u"this").callprop(u'finishNode', var.get(u'cur'), Js(u'SwitchCase')) + var.get(u'node').get(u'cases').callprop(u'push', var.put(u'cur', var.get(u"this").callprop(u'startNode'))) + var.get(u'cur').put(u'consequent', Js([])) + var.get(u"this").callprop(u'next') + if var.get(u'isCase'): + var.get(u'cur').put(u'test', var.get(u"this").callprop(u'parseExpression')) + else: + if var.get(u'sawDefault'): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'lastTokStart'), Js(u'Multiple default clauses')) + var.put(u'sawDefault', var.get(u'true')) + var.get(u'cur').put(u'test', var.get(u"null")) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'colon')) + else: + if var.get(u'cur'): + var.get(u'cur').get(u'consequent').callprop(u'push', var.get(u"this").callprop(u'parseStatement', var.get(u'true'))) + else: + var.get(u"this").callprop(u'unexpected') + + if var.get(u'cur'): + var.get(u"this").callprop(u'finishNode', var.get(u'cur'), Js(u'SwitchCase')) + var.get(u"this").callprop(u'next') + var.get(u"this").get(u'state').get(u'labels').callprop(u'pop') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'SwitchStatement')) + PyJs_anonymous_2976_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseSwitchStatement', PyJs_anonymous_2976_) + @Js + def PyJs_anonymous_2977_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + if var.get(u'lineBreak').callprop(u'test', var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'lastTokEnd'), var.get(u"this").get(u'state').get(u'start'))): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'lastTokEnd'), Js(u'Illegal newline after throw')) + var.get(u'node').put(u'argument', var.get(u"this").callprop(u'parseExpression')) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ThrowStatement')) + PyJs_anonymous_2977_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseThrowStatement', PyJs_anonymous_2977_) + var.put(u'empty', Js([])) + @Js + def PyJs_anonymous_2978_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'clause']) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'block', var.get(u"this").callprop(u'parseBlock')) + var.get(u'node').put(u'handler', var.get(u"null")) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_catch')): + var.put(u'clause', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + var.get(u'clause').put(u'param', var.get(u"this").callprop(u'parseBindingAtom')) + var.get(u"this").callprop(u'checkLVal', var.get(u'clause').get(u'param'), var.get(u'true'), var.get(u'Object').callprop(u'create', var.get(u"null")), Js(u'catch clause')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + var.get(u'clause').put(u'body', var.get(u"this").callprop(u'parseBlock')) + var.get(u'node').put(u'handler', var.get(u"this").callprop(u'finishNode', var.get(u'clause'), Js(u'CatchClause'))) + var.get(u'node').put(u'guardedHandlers', var.get(u'empty')) + var.get(u'node').put(u'finalizer', (var.get(u"this").callprop(u'parseBlock') if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'_finally')) else var.get(u"null"))) + if (var.get(u'node').get(u'handler').neg() and var.get(u'node').get(u'finalizer').neg()): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), Js(u'Missing catch or finally clause')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TryStatement')) + PyJs_anonymous_2978_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseTryStatement', PyJs_anonymous_2978_) + @Js + def PyJs_anonymous_2979_(node, kind, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'kind':kind, u'arguments':arguments}, var) + var.registers([u'node', u'kind']) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'parseVar', var.get(u'node'), Js(False), var.get(u'kind')) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'VariableDeclaration')) + PyJs_anonymous_2979_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseVarStatement', PyJs_anonymous_2979_) + @Js + def PyJs_anonymous_2980_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'test', var.get(u"this").callprop(u'parseParenExpression')) + var.get(u"this").get(u'state').get(u'labels').callprop(u'push', var.get(u'loopLabel')) + var.get(u'node').put(u'body', var.get(u"this").callprop(u'parseStatement', Js(False))) + var.get(u"this").get(u'state').get(u'labels').callprop(u'pop') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'WhileStatement')) + PyJs_anonymous_2980_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseWhileStatement', PyJs_anonymous_2980_) + @Js + def PyJs_anonymous_2981_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").get(u'state').get(u'strict'): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u"'with' in strict mode")) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'object', var.get(u"this").callprop(u'parseParenExpression')) + var.get(u'node').put(u'body', var.get(u"this").callprop(u'parseStatement', Js(False))) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'WithStatement')) + PyJs_anonymous_2981_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseWithStatement', PyJs_anonymous_2981_) + @Js + def PyJs_anonymous_2982_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'EmptyStatement')) + PyJs_anonymous_2982_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseEmptyStatement', PyJs_anonymous_2982_) + @Js + def PyJs_anonymous_2983_(node, maybeName, expr, this, arguments, var=var): + var = Scope({u'node':node, u'expr':expr, u'this':this, u'maybeName':maybeName, u'arguments':arguments}, var) + var.registers([u'node', u'_label', u'_isArray', u'_iterator', u'i', u'expr', u'kind', u'label', u'_i', u'_ref', u'maybeName']) + #for JS loop + var.put(u'_iterator', var.get(u"this").get(u'state').get(u'labels')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else var.get(u'_iterator').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'_label', var.get(u'_ref')) + if PyJsStrictEq(var.get(u'_label').get(u'name'),var.get(u'maybeName')): + var.get(u"this").callprop(u'raise', var.get(u'expr').get(u'start'), ((Js(u"Label '")+var.get(u'maybeName'))+Js(u"' is already declared"))) + + var.put(u'kind', (Js(u'loop') if var.get(u"this").get(u'state').get(u'type').get(u'isLoop') else (Js(u'switch') if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_switch')) else var.get(u"null")))) + #for JS loop + var.put(u'i', (var.get(u"this").get(u'state').get(u'labels').get(u'length')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + var.put(u'label', var.get(u"this").get(u'state').get(u'labels').get(var.get(u'i'))) + if PyJsStrictEq(var.get(u'label').get(u'statementStart'),var.get(u'node').get(u'start')): + var.get(u'label').put(u'statementStart', var.get(u"this").get(u'state').get(u'start')) + var.get(u'label').put(u'kind', var.get(u'kind')) + else: + break + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + PyJs_Object_2984_ = Js({u'name':var.get(u'maybeName'),u'kind':var.get(u'kind'),u'statementStart':var.get(u"this").get(u'state').get(u'start')}) + var.get(u"this").get(u'state').get(u'labels').callprop(u'push', PyJs_Object_2984_) + var.get(u'node').put(u'body', var.get(u"this").callprop(u'parseStatement', var.get(u'true'))) + var.get(u"this").get(u'state').get(u'labels').callprop(u'pop') + var.get(u'node').put(u'label', var.get(u'expr')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'LabeledStatement')) + PyJs_anonymous_2983_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseLabeledStatement', PyJs_anonymous_2983_) + @Js + def PyJs_anonymous_2985_(node, expr, this, arguments, var=var): + var = Scope({u'node':node, u'expr':expr, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'expr']) + var.get(u'node').put(u'expression', var.get(u'expr')) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ExpressionStatement')) + PyJs_anonymous_2985_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseExpressionStatement', PyJs_anonymous_2985_) + @Js + def PyJs_anonymous_2986_(allowDirectives, this, arguments, var=var): + var = Scope({u'this':this, u'allowDirectives':allowDirectives, u'arguments':arguments}, var) + var.registers([u'node', u'allowDirectives']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceL')) + var.get(u"this").callprop(u'parseBlockBody', var.get(u'node'), var.get(u'allowDirectives'), Js(False), var.get(u'types').get(u'braceR')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'BlockStatement')) + PyJs_anonymous_2986_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseBlock', PyJs_anonymous_2986_) + @Js + def PyJs_anonymous_2987_(node, allowDirectives, topLevel, end, this, arguments, var=var): + var = Scope({u'node':node, u'topLevel':topLevel, u'allowDirectives':allowDirectives, u'end':end, u'arguments':arguments, u'this':this}, var) + var.registers([u'node', u'allowDirectives', u'end', u'parsedNonDirective', u'directive', u'topLevel', u'stmt', u'octalPosition', u'oldStrict']) + var.get(u'node').put(u'body', Js([])) + var.get(u'node').put(u'directives', Js([])) + var.put(u'parsedNonDirective', Js(False)) + var.put(u'oldStrict', PyJsComma(Js(0.0), Js(None))) + var.put(u'octalPosition', PyJsComma(Js(0.0), Js(None))) + while var.get(u"this").callprop(u'eat', var.get(u'end')).neg(): + if ((var.get(u'parsedNonDirective').neg() and var.get(u"this").get(u'state').get(u'containsOctal')) and var.get(u'octalPosition').neg()): + var.put(u'octalPosition', var.get(u"this").get(u'state').get(u'octalPosition')) + var.put(u'stmt', var.get(u"this").callprop(u'parseStatement', var.get(u'true'), var.get(u'topLevel'))) + if ((((var.get(u'allowDirectives') and var.get(u'parsedNonDirective').neg()) and PyJsStrictEq(var.get(u'stmt').get(u'type'),Js(u'ExpressionStatement'))) and PyJsStrictEq(var.get(u'stmt').get(u'expression').get(u'type'),Js(u'StringLiteral'))) and var.get(u'stmt').get(u'expression').get(u'extra').get(u'parenthesized').neg()): + var.put(u'directive', var.get(u"this").callprop(u'stmtToDirective', var.get(u'stmt'))) + var.get(u'node').get(u'directives').callprop(u'push', var.get(u'directive')) + if (PyJsStrictEq(var.get(u'oldStrict'),var.get(u'undefined')) and PyJsStrictEq(var.get(u'directive').get(u'value').get(u'value'),Js(u'use strict'))): + var.put(u'oldStrict', var.get(u"this").get(u'state').get(u'strict')) + var.get(u"this").callprop(u'setStrict', var.get(u'true')) + if var.get(u'octalPosition'): + var.get(u"this").callprop(u'raise', var.get(u'octalPosition'), Js(u'Octal literal in strict mode')) + continue + var.put(u'parsedNonDirective', var.get(u'true')) + var.get(u'node').get(u'body').callprop(u'push', var.get(u'stmt')) + if PyJsStrictEq(var.get(u'oldStrict'),Js(False)): + var.get(u"this").callprop(u'setStrict', Js(False)) + PyJs_anonymous_2987_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseBlockBody', PyJs_anonymous_2987_) + @Js + def PyJs_anonymous_2988_(node, init, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'init':init, u'arguments':arguments}, var) + var.registers([u'node', u'init']) + var.get(u'node').put(u'init', var.get(u'init')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'semi')) + var.get(u'node').put(u'test', (var.get(u"null") if var.get(u"this").callprop(u'match', var.get(u'types').get(u'semi')) else var.get(u"this").callprop(u'parseExpression'))) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'semi')) + var.get(u'node').put(u'update', (var.get(u"null") if var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenR')) else var.get(u"this").callprop(u'parseExpression'))) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + var.get(u'node').put(u'body', var.get(u"this").callprop(u'parseStatement', Js(False))) + var.get(u"this").get(u'state').get(u'labels').callprop(u'pop') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ForStatement')) + PyJs_anonymous_2988_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseFor', PyJs_anonymous_2988_) + @Js + def PyJs_anonymous_2989_(node, init, forAwait, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'init':init, u'forAwait':forAwait, u'arguments':arguments}, var) + var.registers([u'node', u'init', u'type', u'forAwait']) + var.put(u'type', PyJsComma(Js(0.0), Js(None))) + if var.get(u'forAwait'): + var.get(u"this").callprop(u'eatContextual', Js(u'of')) + var.put(u'type', Js(u'ForAwaitStatement')) + else: + var.put(u'type', (Js(u'ForInStatement') if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_in')) else Js(u'ForOfStatement'))) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'left', var.get(u'init')) + var.get(u'node').put(u'right', var.get(u"this").callprop(u'parseExpression')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + var.get(u'node').put(u'body', var.get(u"this").callprop(u'parseStatement', Js(False))) + var.get(u"this").get(u'state').get(u'labels').callprop(u'pop') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), var.get(u'type')) + PyJs_anonymous_2989_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseForIn', PyJs_anonymous_2989_) + @Js + def PyJs_anonymous_2990_(node, isFor, kind, this, arguments, var=var): + var = Scope({u'node':node, u'isFor':isFor, u'kind':kind, u'this':this, u'arguments':arguments}, var) + var.registers([u'decl', u'node', u'kind', u'isFor']) + var.get(u'node').put(u'declarations', Js([])) + var.get(u'node').put(u'kind', var.get(u'kind').get(u'keyword')) + #for JS loop + + while 1: + var.put(u'decl', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'parseVarHead', var.get(u'decl')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'eq')): + var.get(u'decl').put(u'init', var.get(u"this").callprop(u'parseMaybeAssign', var.get(u'isFor'))) + else: + if (PyJsStrictEq(var.get(u'kind'),var.get(u'types').get(u'_const')) and (var.get(u"this").callprop(u'match', var.get(u'types').get(u'_in')) or var.get(u"this").callprop(u'isContextual', Js(u'of'))).neg()): + var.get(u"this").callprop(u'unexpected') + else: + if (PyJsStrictNeq(var.get(u'decl').get(u'id').get(u'type'),Js(u'Identifier')) and (var.get(u'isFor') and (var.get(u"this").callprop(u'match', var.get(u'types').get(u'_in')) or var.get(u"this").callprop(u'isContextual', Js(u'of')))).neg()): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'lastTokEnd'), Js(u'Complex binding patterns require an initialization value')) + else: + var.get(u'decl').put(u'init', var.get(u"null")) + var.get(u'node').get(u'declarations').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'decl'), Js(u'VariableDeclarator'))) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')).neg(): + break + + return var.get(u'node') + PyJs_anonymous_2990_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseVar', PyJs_anonymous_2990_) + @Js + def PyJs_anonymous_2991_(decl, this, arguments, var=var): + var = Scope({u'decl':decl, u'this':this, u'arguments':arguments}, var) + var.registers([u'decl']) + var.get(u'decl').put(u'id', var.get(u"this").callprop(u'parseBindingAtom')) + var.get(u"this").callprop(u'checkLVal', var.get(u'decl').get(u'id'), var.get(u'true'), var.get(u'undefined'), Js(u'variable declaration')) + PyJs_anonymous_2991_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseVarHead', PyJs_anonymous_2991_) + @Js + def PyJs_anonymous_2992_(node, isStatement, allowExpressionBody, isAsync, optionalId, this, arguments, var=var): + var = Scope({u'node':node, u'optionalId':optionalId, u'isAsync':isAsync, u'arguments':arguments, u'this':this, u'isStatement':isStatement, u'allowExpressionBody':allowExpressionBody}, var) + var.registers([u'node', u'optionalId', u'isAsync', u'oldInMethod', u'isStatement', u'allowExpressionBody']) + var.put(u'oldInMethod', var.get(u"this").get(u'state').get(u'inMethod')) + var.get(u"this").get(u'state').put(u'inMethod', Js(False)) + var.get(u"this").callprop(u'initFunction', var.get(u'node'), var.get(u'isAsync')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'star')): + if (var.get(u'node').get(u'async') and var.get(u"this").callprop(u'hasPlugin', Js(u'asyncGenerators')).neg()): + var.get(u"this").callprop(u'unexpected') + else: + var.get(u'node').put(u'generator', var.get(u'true')) + var.get(u"this").callprop(u'next') + if (((var.get(u'isStatement') and var.get(u'optionalId').neg()) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')).neg()) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'_yield')).neg()): + var.get(u"this").callprop(u'unexpected') + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'_yield'))): + var.get(u'node').put(u'id', var.get(u"this").callprop(u'parseBindingIdentifier')) + var.get(u"this").callprop(u'parseFunctionParams', var.get(u'node')) + var.get(u"this").callprop(u'parseFunctionBody', var.get(u'node'), var.get(u'allowExpressionBody')) + var.get(u"this").get(u'state').put(u'inMethod', var.get(u'oldInMethod')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), (Js(u'FunctionDeclaration') if var.get(u'isStatement') else Js(u'FunctionExpression'))) + PyJs_anonymous_2992_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseFunction', PyJs_anonymous_2992_) + @Js + def PyJs_anonymous_2993_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + var.get(u'node').put(u'params', var.get(u"this").callprop(u'parseBindingList', var.get(u'types').get(u'parenR'))) + PyJs_anonymous_2993_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseFunctionParams', PyJs_anonymous_2993_) + @Js + def PyJs_anonymous_2994_(node, isStatement, optionalId, this, arguments, var=var): + var = Scope({u'node':node, u'optionalId':optionalId, u'this':this, u'isStatement':isStatement, u'arguments':arguments}, var) + var.registers([u'node', u'optionalId', u'isStatement']) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'parseClassId', var.get(u'node'), var.get(u'isStatement'), var.get(u'optionalId')) + var.get(u"this").callprop(u'parseClassSuper', var.get(u'node')) + var.get(u"this").callprop(u'parseClassBody', var.get(u'node')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), (Js(u'ClassDeclaration') if var.get(u'isStatement') else Js(u'ClassExpression'))) + PyJs_anonymous_2994_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseClass', PyJs_anonymous_2994_) + @Js + def PyJs_anonymous_2995_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return (var.get(u"this").callprop(u'match', var.get(u'types').get(u'eq')) or var.get(u"this").callprop(u'isLineTerminator')) + PyJs_anonymous_2995_._set_name(u'anonymous') + var.get(u'pp$1').put(u'isClassProperty', PyJs_anonymous_2995_) + @Js + def PyJs_anonymous_2996_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(False) + PyJs_anonymous_2996_._set_name(u'anonymous') + var.get(u'pp$1').put(u'isClassMutatorStarter', PyJs_anonymous_2996_) + @Js + def PyJs_anonymous_2997_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'isStaticPrototype', u'hadConstructor', u'isConstructorCall', u'isGetSet', u'isGenerator', u'start', u'paramCount', u'isMaybeStatic', u'classBody', u'key', u'isConstructor', u'isAsync', u'isAsyncMethod', u'hadConstructorCall', u'decorators', u'method', u'oldStrict']) + var.put(u'oldStrict', var.get(u"this").get(u'state').get(u'strict')) + var.get(u"this").get(u'state').put(u'strict', var.get(u'true')) + var.put(u'hadConstructorCall', Js(False)) + var.put(u'hadConstructor', Js(False)) + var.put(u'decorators', Js([])) + var.put(u'classBody', var.get(u"this").callprop(u'startNode')) + var.get(u'classBody').put(u'body', Js([])) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceL')) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')).neg(): + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'semi')): + continue + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'at')): + var.get(u'decorators').callprop(u'push', var.get(u"this").callprop(u'parseDecorator')) + continue + var.put(u'method', var.get(u"this").callprop(u'startNode')) + if var.get(u'decorators').get(u'length'): + var.get(u'method').put(u'decorators', var.get(u'decorators')) + var.put(u'decorators', Js([])) + var.put(u'isConstructorCall', Js(False)) + var.put(u'isMaybeStatic', (var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')) and PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'static')))) + var.put(u'isGenerator', var.get(u"this").callprop(u'eat', var.get(u'types').get(u'star'))) + var.put(u'isGetSet', Js(False)) + var.put(u'isAsync', Js(False)) + var.get(u"this").callprop(u'parsePropertyName', var.get(u'method')) + var.get(u'method').put(u'static', (var.get(u'isMaybeStatic') and var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')).neg())) + if var.get(u'method').get(u'static'): + var.put(u'isGenerator', var.get(u"this").callprop(u'eat', var.get(u'types').get(u'star'))) + var.get(u"this").callprop(u'parsePropertyName', var.get(u'method')) + if var.get(u'isGenerator').neg(): + if var.get(u"this").callprop(u'isClassProperty'): + var.get(u'classBody').get(u'body').callprop(u'push', var.get(u"this").callprop(u'parseClassProperty', var.get(u'method'))) + continue + def PyJs_LONG_2998_(var=var): + return (((((PyJsStrictEq(var.get(u'method').get(u'key').get(u'type'),Js(u'Identifier')) and var.get(u'method').get(u'computed').neg()) and var.get(u"this").callprop(u'hasPlugin', Js(u'classConstructorCall'))) and PyJsStrictEq(var.get(u'method').get(u'key').get(u'name'),Js(u'call'))) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'name'))) and PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'constructor'))) + if PyJs_LONG_2998_(): + var.put(u'isConstructorCall', var.get(u'true')) + var.get(u"this").callprop(u'parsePropertyName', var.get(u'method')) + var.put(u'isAsyncMethod', (((var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')).neg() and var.get(u'method').get(u'computed').neg()) and PyJsStrictEq(var.get(u'method').get(u'key').get(u'type'),Js(u'Identifier'))) and PyJsStrictEq(var.get(u'method').get(u'key').get(u'name'),Js(u'async')))) + if var.get(u'isAsyncMethod'): + if (var.get(u"this").callprop(u'hasPlugin', Js(u'asyncGenerators')) and var.get(u"this").callprop(u'eat', var.get(u'types').get(u'star'))): + var.put(u'isGenerator', var.get(u'true')) + var.put(u'isAsync', var.get(u'true')) + var.get(u"this").callprop(u'parsePropertyName', var.get(u'method')) + var.get(u'method').put(u'kind', Js(u'method')) + if var.get(u'method').get(u'computed').neg(): + var.put(u'key', var.get(u'method').get(u'key')) + if (((((var.get(u'isAsync').neg() and var.get(u'isGenerator').neg()) and var.get(u"this").callprop(u'isClassMutatorStarter').neg()) and PyJsStrictEq(var.get(u'key').get(u'type'),Js(u'Identifier'))) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')).neg()) and (PyJsStrictEq(var.get(u'key').get(u'name'),Js(u'get')) or PyJsStrictEq(var.get(u'key').get(u'name'),Js(u'set')))): + var.put(u'isGetSet', var.get(u'true')) + var.get(u'method').put(u'kind', var.get(u'key').get(u'name')) + var.put(u'key', var.get(u"this").callprop(u'parsePropertyName', var.get(u'method'))) + var.put(u'isConstructor', ((var.get(u'isConstructorCall').neg() and var.get(u'method').get(u'static').neg()) and ((PyJsStrictEq(var.get(u'key').get(u'type'),Js(u'Identifier')) and PyJsStrictEq(var.get(u'key').get(u'name'),Js(u'constructor'))) or (PyJsStrictEq(var.get(u'key').get(u'type'),Js(u'StringLiteral')) and PyJsStrictEq(var.get(u'key').get(u'value'),Js(u'constructor')))))) + if var.get(u'isConstructor'): + if var.get(u'hadConstructor'): + var.get(u"this").callprop(u'raise', var.get(u'key').get(u'start'), Js(u'Duplicate constructor in the same class')) + if var.get(u'isGetSet'): + var.get(u"this").callprop(u'raise', var.get(u'key').get(u'start'), Js(u"Constructor can't have get/set modifier")) + if var.get(u'isGenerator'): + var.get(u"this").callprop(u'raise', var.get(u'key').get(u'start'), Js(u"Constructor can't be a generator")) + if var.get(u'isAsync'): + var.get(u"this").callprop(u'raise', var.get(u'key').get(u'start'), Js(u"Constructor can't be an async function")) + var.get(u'method').put(u'kind', Js(u'constructor')) + var.put(u'hadConstructor', var.get(u'true')) + var.put(u'isStaticPrototype', (var.get(u'method').get(u'static') and ((PyJsStrictEq(var.get(u'key').get(u'type'),Js(u'Identifier')) and PyJsStrictEq(var.get(u'key').get(u'name'),Js(u'prototype'))) or (PyJsStrictEq(var.get(u'key').get(u'type'),Js(u'StringLiteral')) and PyJsStrictEq(var.get(u'key').get(u'value'),Js(u'prototype')))))) + if var.get(u'isStaticPrototype'): + var.get(u"this").callprop(u'raise', var.get(u'key').get(u'start'), Js(u'Classes may not have static property named prototype')) + if var.get(u'isConstructorCall'): + if var.get(u'hadConstructorCall'): + var.get(u"this").callprop(u'raise', var.get(u'method').get(u'start'), Js(u'Duplicate constructor call in the same class')) + var.get(u'method').put(u'kind', Js(u'constructorCall')) + var.put(u'hadConstructorCall', var.get(u'true')) + if ((PyJsStrictEq(var.get(u'method').get(u'kind'),Js(u'constructor')) or PyJsStrictEq(var.get(u'method').get(u'kind'),Js(u'constructorCall'))) and var.get(u'method').get(u'decorators')): + var.get(u"this").callprop(u'raise', var.get(u'method').get(u'start'), Js(u"You can't attach decorators to a class constructor")) + var.get(u"this").callprop(u'parseClassMethod', var.get(u'classBody'), var.get(u'method'), var.get(u'isGenerator'), var.get(u'isAsync')) + if var.get(u'isGetSet'): + var.put(u'paramCount', (Js(0.0) if PyJsStrictEq(var.get(u'method').get(u'kind'),Js(u'get')) else Js(1.0))) + if PyJsStrictNeq(var.get(u'method').get(u'params').get(u'length'),var.get(u'paramCount')): + var.put(u'start', var.get(u'method').get(u'start')) + if PyJsStrictEq(var.get(u'method').get(u'kind'),Js(u'get')): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'getter should have no params')) + else: + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'setter should have exactly one param')) + if var.get(u'decorators').get(u'length'): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'You have trailing decorators with no method')) + var.get(u'node').put(u'body', var.get(u"this").callprop(u'finishNode', var.get(u'classBody'), Js(u'ClassBody'))) + var.get(u"this").get(u'state').put(u'strict', var.get(u'oldStrict')) + PyJs_anonymous_2997_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseClassBody', PyJs_anonymous_2997_) + @Js + def PyJs_anonymous_2999_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'eq')): + if var.get(u"this").callprop(u'hasPlugin', Js(u'classProperties')).neg(): + var.get(u"this").callprop(u'unexpected') + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'value', var.get(u"this").callprop(u'parseMaybeAssign')) + else: + var.get(u'node').put(u'value', var.get(u"null")) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ClassProperty')) + PyJs_anonymous_2999_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseClassProperty', PyJs_anonymous_2999_) + @Js + def PyJs_anonymous_3000_(classBody, method, isGenerator, isAsync, this, arguments, var=var): + var = Scope({u'isAsync':isAsync, u'classBody':classBody, u'this':this, u'isGenerator':isGenerator, u'method':method, u'arguments':arguments}, var) + var.registers([u'isAsync', u'isGenerator', u'classBody', u'method']) + var.get(u"this").callprop(u'parseMethod', var.get(u'method'), var.get(u'isGenerator'), var.get(u'isAsync')) + var.get(u'classBody').get(u'body').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'method'), Js(u'ClassMethod'))) + PyJs_anonymous_3000_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseClassMethod', PyJs_anonymous_3000_) + @Js + def PyJs_anonymous_3001_(node, isStatement, optionalId, this, arguments, var=var): + var = Scope({u'node':node, u'optionalId':optionalId, u'this':this, u'isStatement':isStatement, u'arguments':arguments}, var) + var.registers([u'node', u'optionalId', u'isStatement']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')): + var.get(u'node').put(u'id', var.get(u"this").callprop(u'parseIdentifier')) + else: + if (var.get(u'optionalId') or var.get(u'isStatement').neg()): + var.get(u'node').put(u'id', var.get(u"null")) + else: + var.get(u"this").callprop(u'unexpected') + PyJs_anonymous_3001_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseClassId', PyJs_anonymous_3001_) + @Js + def PyJs_anonymous_3002_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'node').put(u'superClass', (var.get(u"this").callprop(u'parseExprSubscripts') if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'_extends')) else var.get(u"null"))) + PyJs_anonymous_3002_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseClassSuper', PyJs_anonymous_3002_) + @Js + def PyJs_anonymous_3003_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'specifier', u'expr', u'_specifier', u'_specifier2', u'needsSemi']) + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'star')): + var.put(u'specifier', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + if (var.get(u"this").callprop(u'hasPlugin', Js(u'exportExtensions')) and var.get(u"this").callprop(u'eatContextual', Js(u'as'))): + var.get(u'specifier').put(u'exported', var.get(u"this").callprop(u'parseIdentifier')) + var.get(u'node').put(u'specifiers', Js([var.get(u"this").callprop(u'finishNode', var.get(u'specifier'), Js(u'ExportNamespaceSpecifier'))])) + var.get(u"this").callprop(u'parseExportSpecifiersMaybe', var.get(u'node')) + var.get(u"this").callprop(u'parseExportFrom', var.get(u'node'), var.get(u'true')) + else: + var.get(u"this").callprop(u'parseExportFrom', var.get(u'node'), var.get(u'true')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ExportAllDeclaration')) + else: + if (var.get(u"this").callprop(u'hasPlugin', Js(u'exportExtensions')) and var.get(u"this").callprop(u'isExportDefaultSpecifier')): + var.put(u'_specifier', var.get(u"this").callprop(u'startNode')) + var.get(u'_specifier').put(u'exported', var.get(u"this").callprop(u'parseIdentifier', var.get(u'true'))) + var.get(u'node').put(u'specifiers', Js([var.get(u"this").callprop(u'finishNode', var.get(u'_specifier'), Js(u'ExportDefaultSpecifier'))])) + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'comma')) and PyJsStrictEq(var.get(u"this").callprop(u'lookahead').get(u'type'),var.get(u'types').get(u'star'))): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + var.put(u'_specifier2', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'star')) + var.get(u"this").callprop(u'expectContextual', Js(u'as')) + var.get(u'_specifier2').put(u'exported', var.get(u"this").callprop(u'parseIdentifier')) + var.get(u'node').get(u'specifiers').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'_specifier2'), Js(u'ExportNamespaceSpecifier'))) + else: + var.get(u"this").callprop(u'parseExportSpecifiersMaybe', var.get(u'node')) + var.get(u"this").callprop(u'parseExportFrom', var.get(u'node'), var.get(u'true')) + else: + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'_default')): + var.put(u'expr', var.get(u"this").callprop(u'startNode')) + var.put(u'needsSemi', Js(False)) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'_function')): + var.put(u'expr', var.get(u"this").callprop(u'parseFunction', var.get(u'expr'), var.get(u'true'), Js(False), Js(False), var.get(u'true'))) + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_class')): + var.put(u'expr', var.get(u"this").callprop(u'parseClass', var.get(u'expr'), var.get(u'true'), var.get(u'true'))) + else: + var.put(u'needsSemi', var.get(u'true')) + var.put(u'expr', var.get(u"this").callprop(u'parseMaybeAssign')) + var.get(u'node').put(u'declaration', var.get(u'expr')) + if var.get(u'needsSemi'): + var.get(u"this").callprop(u'semicolon') + var.get(u"this").callprop(u'checkExport', var.get(u'node'), var.get(u'true'), var.get(u'true')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ExportDefaultDeclaration')) + else: + if (var.get(u"this").get(u'state').get(u'type').get(u'keyword') or var.get(u"this").callprop(u'shouldParseExportDeclaration')): + var.get(u'node').put(u'specifiers', Js([])) + var.get(u'node').put(u'source', var.get(u"null")) + var.get(u'node').put(u'declaration', var.get(u"this").callprop(u'parseExportDeclaration', var.get(u'node'))) + else: + var.get(u'node').put(u'declaration', var.get(u"null")) + var.get(u'node').put(u'specifiers', var.get(u"this").callprop(u'parseExportSpecifiers')) + var.get(u"this").callprop(u'parseExportFrom', var.get(u'node')) + var.get(u"this").callprop(u'checkExport', var.get(u'node'), var.get(u'true')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ExportNamedDeclaration')) + PyJs_anonymous_3003_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseExport', PyJs_anonymous_3003_) + @Js + def PyJs_anonymous_3004_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'parseStatement', var.get(u'true')) + PyJs_anonymous_3004_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseExportDeclaration', PyJs_anonymous_3004_) + @Js + def PyJs_anonymous_3005_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'lookahead']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')): + return ((PyJsStrictNeq(var.get(u"this").get(u'state').get(u'value'),Js(u'type')) and PyJsStrictNeq(var.get(u"this").get(u'state').get(u'value'),Js(u'async'))) and PyJsStrictNeq(var.get(u"this").get(u'state').get(u'value'),Js(u'interface'))) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_default')).neg(): + return Js(False) + var.put(u'lookahead', var.get(u"this").callprop(u'lookahead')) + return (PyJsStrictEq(var.get(u'lookahead').get(u'type'),var.get(u'types').get(u'comma')) or (PyJsStrictEq(var.get(u'lookahead').get(u'type'),var.get(u'types').get(u'name')) and PyJsStrictEq(var.get(u'lookahead').get(u'value'),Js(u'from')))) + PyJs_anonymous_3005_._set_name(u'anonymous') + var.get(u'pp$1').put(u'isExportDefaultSpecifier', PyJs_anonymous_3005_) + @Js + def PyJs_anonymous_3006_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')): + var.get(u'node').put(u'specifiers', var.get(u'node').get(u'specifiers').callprop(u'concat', var.get(u"this").callprop(u'parseExportSpecifiers'))) + PyJs_anonymous_3006_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseExportSpecifiersMaybe', PyJs_anonymous_3006_) + @Js + def PyJs_anonymous_3007_(node, expect, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'expect':expect, u'arguments':arguments}, var) + var.registers([u'node', u'expect']) + if var.get(u"this").callprop(u'eatContextual', Js(u'from')): + var.get(u'node').put(u'source', (var.get(u"this").callprop(u'parseExprAtom') if var.get(u"this").callprop(u'match', var.get(u'types').get(u'string')) else var.get(u"this").callprop(u'unexpected'))) + var.get(u"this").callprop(u'checkExport', var.get(u'node')) + else: + if var.get(u'expect'): + var.get(u"this").callprop(u'unexpected') + else: + var.get(u'node').put(u'source', var.get(u"null")) + var.get(u"this").callprop(u'semicolon') + PyJs_anonymous_3007_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseExportFrom', PyJs_anonymous_3007_) + @Js + def PyJs_anonymous_3008_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'isContextual', Js(u'async')) + PyJs_anonymous_3008_._set_name(u'anonymous') + var.get(u'pp$1').put(u'shouldParseExportDeclaration', PyJs_anonymous_3008_) + @Js + def PyJs_anonymous_3009_(node, checkNames, isDefault, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'checkNames':checkNames, u'arguments':arguments, u'isDefault':isDefault}, var) + var.registers([u'node', u'specifier', u'_isArray3', u'_isArray2', u'isClass', u'_ref3', u'_i3', u'_i2', u'_ref2', u'checkNames', u'isDefault', u'declaration', u'_iterator3', u'_iterator2']) + if var.get(u'checkNames'): + if var.get(u'isDefault'): + var.get(u"this").callprop(u'checkDuplicateExports', var.get(u'node'), Js(u'default')) + else: + if (var.get(u'node').get(u'specifiers') and var.get(u'node').get(u'specifiers').get(u'length')): + #for JS loop + var.put(u'_iterator2', var.get(u'node').get(u'specifiers')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else var.get(u'_iterator2').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'specifier', var.get(u'_ref2')) + var.get(u"this").callprop(u'checkDuplicateExports', var.get(u'specifier'), var.get(u'specifier').get(u'exported').get(u'name')) + + else: + if var.get(u'node').get(u'declaration'): + if (PyJsStrictEq(var.get(u'node').get(u'declaration').get(u'type'),Js(u'FunctionDeclaration')) or PyJsStrictEq(var.get(u'node').get(u'declaration').get(u'type'),Js(u'ClassDeclaration'))): + var.get(u"this").callprop(u'checkDuplicateExports', var.get(u'node'), var.get(u'node').get(u'declaration').get(u'id').get(u'name')) + else: + if PyJsStrictEq(var.get(u'node').get(u'declaration').get(u'type'),Js(u'VariableDeclaration')): + #for JS loop + var.put(u'_iterator3', var.get(u'node').get(u'declaration').get(u'declarations')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else var.get(u'_iterator3').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'declaration', var.get(u'_ref3')) + var.get(u"this").callprop(u'checkDeclaration', var.get(u'declaration').get(u'id')) + + if var.get(u"this").get(u'state').get(u'decorators').get(u'length'): + var.put(u'isClass', (var.get(u'node').get(u'declaration') and (PyJsStrictEq(var.get(u'node').get(u'declaration').get(u'type'),Js(u'ClassDeclaration')) or PyJsStrictEq(var.get(u'node').get(u'declaration').get(u'type'),Js(u'ClassExpression'))))) + if (var.get(u'node').get(u'declaration').neg() or var.get(u'isClass').neg()): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), Js(u'You can only use decorators on an export when exporting a class')) + var.get(u"this").callprop(u'takeDecorators', var.get(u'node').get(u'declaration')) + PyJs_anonymous_3009_._set_name(u'anonymous') + var.get(u'pp$1').put(u'checkExport', PyJs_anonymous_3009_) + @Js + def PyJs_anonymous_3010_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray5', u'_isArray4', u'_i5', u'_i4', u'elem', u'prop', u'_iterator5', u'_iterator4', u'_ref5', u'_ref4']) + if PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'ObjectPattern')): + #for JS loop + var.put(u'_iterator4', var.get(u'node').get(u'properties')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else var.get(u'_iterator4').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i4').get(u'value')) + var.put(u'prop', var.get(u'_ref4')) + var.get(u"this").callprop(u'checkDeclaration', var.get(u'prop')) + + else: + if PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'ArrayPattern')): + #for JS loop + var.put(u'_iterator5', var.get(u'node').get(u'elements')) + var.put(u'_isArray5', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator5'))) + var.put(u'_i5', Js(0.0)) + var.put(u'_iterator5', (var.get(u'_iterator5') if var.get(u'_isArray5') else var.get(u'_iterator5').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray5'): + if (var.get(u'_i5')>=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i5').get(u'value')) + var.put(u'elem', var.get(u'_ref5')) + if var.get(u'elem'): + var.get(u"this").callprop(u'checkDeclaration', var.get(u'elem')) + + else: + if PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'ObjectProperty')): + var.get(u"this").callprop(u'checkDeclaration', var.get(u'node').get(u'value')) + else: + if (PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'RestElement')) or PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'RestProperty'))): + var.get(u"this").callprop(u'checkDeclaration', var.get(u'node').get(u'argument')) + else: + if PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'Identifier')): + var.get(u"this").callprop(u'checkDuplicateExports', var.get(u'node'), var.get(u'node').get(u'name')) + PyJs_anonymous_3010_._set_name(u'anonymous') + var.get(u'pp$1').put(u'checkDeclaration', PyJs_anonymous_3010_) + @Js + def PyJs_anonymous_3011_(node, name, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'node', u'name']) + if (var.get(u"this").get(u'state').get(u'exportedIdentifiers').callprop(u'indexOf', var.get(u'name'))>(-Js(1.0))): + var.get(u"this").callprop(u'raiseDuplicateExportError', var.get(u'node'), var.get(u'name')) + var.get(u"this").get(u'state').get(u'exportedIdentifiers').callprop(u'push', var.get(u'name')) + PyJs_anonymous_3011_._set_name(u'anonymous') + var.get(u'pp$1').put(u'checkDuplicateExports', PyJs_anonymous_3011_) + @Js + def PyJs_anonymous_3012_(node, name, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'node', u'name']) + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), (Js(u'Only one default export allowed per module.') if PyJsStrictEq(var.get(u'name'),Js(u'default')) else ((Js(u'`')+var.get(u'name'))+Js(u'` has already been exported. Exported identifiers must be unique.')))) + PyJs_anonymous_3012_._set_name(u'anonymous') + var.get(u'pp$1').put(u'raiseDuplicateExportError', PyJs_anonymous_3012_) + @Js + def PyJs_anonymous_3013_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'nodes', u'isDefault', u'needsFrom', u'first']) + var.put(u'nodes', Js([])) + var.put(u'first', var.get(u'true')) + var.put(u'needsFrom', PyJsComma(Js(0.0), Js(None))) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceL')) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')).neg(): + if var.get(u'first'): + var.put(u'first', Js(False)) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')): + break + var.put(u'isDefault', var.get(u"this").callprop(u'match', var.get(u'types').get(u'_default'))) + if (var.get(u'isDefault') and var.get(u'needsFrom').neg()): + var.put(u'needsFrom', var.get(u'true')) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'local', var.get(u"this").callprop(u'parseIdentifier', var.get(u'isDefault'))) + var.get(u'node').put(u'exported', (var.get(u"this").callprop(u'parseIdentifier', var.get(u'true')) if var.get(u"this").callprop(u'eatContextual', Js(u'as')) else var.get(u'node').get(u'local').callprop(u'__clone'))) + var.get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ExportSpecifier'))) + if (var.get(u'needsFrom') and var.get(u"this").callprop(u'isContextual', Js(u'from')).neg()): + var.get(u"this").callprop(u'unexpected') + return var.get(u'nodes') + PyJs_anonymous_3013_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseExportSpecifiers', PyJs_anonymous_3013_) + @Js + def PyJs_anonymous_3014_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'string')): + var.get(u'node').put(u'specifiers', Js([])) + var.get(u'node').put(u'source', var.get(u"this").callprop(u'parseExprAtom')) + else: + var.get(u'node').put(u'specifiers', Js([])) + var.get(u"this").callprop(u'parseImportSpecifiers', var.get(u'node')) + var.get(u"this").callprop(u'expectContextual', Js(u'from')) + var.get(u'node').put(u'source', (var.get(u"this").callprop(u'parseExprAtom') if var.get(u"this").callprop(u'match', var.get(u'types').get(u'string')) else var.get(u"this").callprop(u'unexpected'))) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ImportDeclaration')) + PyJs_anonymous_3014_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseImport', PyJs_anonymous_3014_) + @Js + def PyJs_anonymous_3015_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'specifier', u'startLoc', u'_specifier3', u'startPos', u'first']) + var.put(u'first', var.get(u'true')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')): + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.get(u'node').get(u'specifiers').callprop(u'push', var.get(u"this").callprop(u'parseImportSpecifierDefault', var.get(u"this").callprop(u'parseIdentifier'), var.get(u'startPos'), var.get(u'startLoc'))) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')).neg(): + return var.get('undefined') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'star')): + var.put(u'specifier', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'expectContextual', Js(u'as')) + var.get(u'specifier').put(u'local', var.get(u"this").callprop(u'parseIdentifier')) + var.get(u"this").callprop(u'checkLVal', var.get(u'specifier').get(u'local'), var.get(u'true'), var.get(u'undefined'), Js(u'import namespace specifier')) + var.get(u'node').get(u'specifiers').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'specifier'), Js(u'ImportNamespaceSpecifier'))) + return var.get('undefined') + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceL')) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')).neg(): + if var.get(u'first'): + var.put(u'first', Js(False)) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')): + break + var.put(u'_specifier3', var.get(u"this").callprop(u'startNode')) + var.get(u'_specifier3').put(u'imported', var.get(u"this").callprop(u'parseIdentifier', var.get(u'true'))) + var.get(u'_specifier3').put(u'local', (var.get(u"this").callprop(u'parseIdentifier') if var.get(u"this").callprop(u'eatContextual', Js(u'as')) else var.get(u'_specifier3').get(u'imported').callprop(u'__clone'))) + var.get(u"this").callprop(u'checkLVal', var.get(u'_specifier3').get(u'local'), var.get(u'true'), var.get(u'undefined'), Js(u'import specifier')) + var.get(u'node').get(u'specifiers').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'_specifier3'), Js(u'ImportSpecifier'))) + PyJs_anonymous_3015_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseImportSpecifiers', PyJs_anonymous_3015_) + @Js + def PyJs_anonymous_3016_(id, startPos, startLoc, this, arguments, var=var): + var = Scope({u'this':this, u'startPos':startPos, u'id':id, u'startLoc':startLoc, u'arguments':arguments}, var) + var.registers([u'node', u'startPos', u'id', u'startLoc']) + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'local', var.get(u'id')) + var.get(u"this").callprop(u'checkLVal', var.get(u'node').get(u'local'), var.get(u'true'), var.get(u'undefined'), Js(u'default import specifier')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ImportDefaultSpecifier')) + PyJs_anonymous_3016_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseImportSpecifierDefault', PyJs_anonymous_3016_) + var.put(u'pp$2', var.get(u'Parser').get(u'prototype')) + @Js + def PyJs_anonymous_3017_(node, isBinding, contextDescription, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'isBinding':isBinding, u'arguments':arguments, u'contextDescription':contextDescription}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'isBinding', u'prop', u'_i', u'message', u'contextDescription', u'_ref']) + if var.get(u'node'): + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'Identifier')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectPattern')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ArrayPattern')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'AssignmentPattern')): + SWITCHED = True + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectExpression')): + SWITCHED = True + var.get(u'node').put(u'type', Js(u'ObjectPattern')) + #for JS loop + var.put(u'_iterator', var.get(u'node').get(u'properties')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else var.get(u'_iterator').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'prop', var.get(u'_ref')) + if PyJsStrictEq(var.get(u'prop').get(u'type'),Js(u'ObjectMethod')): + if (PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'get')) or PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'set'))): + var.get(u"this").callprop(u'raise', var.get(u'prop').get(u'key').get(u'start'), Js(u"Object pattern can't contain getter or setter")) + else: + var.get(u"this").callprop(u'raise', var.get(u'prop').get(u'key').get(u'start'), Js(u"Object pattern can't contain methods")) + else: + var.get(u"this").callprop(u'toAssignable', var.get(u'prop'), var.get(u'isBinding'), Js(u'object destructuring pattern')) + + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectProperty')): + SWITCHED = True + var.get(u"this").callprop(u'toAssignable', var.get(u'node').get(u'value'), var.get(u'isBinding'), var.get(u'contextDescription')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'SpreadProperty')): + SWITCHED = True + var.get(u'node').put(u'type', Js(u'RestProperty')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ArrayExpression')): + SWITCHED = True + var.get(u'node').put(u'type', Js(u'ArrayPattern')) + var.get(u"this").callprop(u'toAssignableList', var.get(u'node').get(u'elements'), var.get(u'isBinding'), var.get(u'contextDescription')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'AssignmentExpression')): + SWITCHED = True + if PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'=')): + var.get(u'node').put(u'type', Js(u'AssignmentPattern')) + var.get(u'node').delete(u'operator') + else: + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'left').get(u'end'), Js(u"Only '=' operator can be used for specifying default value.")) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'MemberExpression')): + SWITCHED = True + if var.get(u'isBinding').neg(): + break + if True: + SWITCHED = True + var.put(u'message', (Js(u'Invalid left-hand side')+((Js(u' in ')+var.get(u'contextDescription')) if var.get(u'contextDescription') else Js(u'expression')))) + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), var.get(u'message')) + SWITCHED = True + break + return var.get(u'node') + PyJs_anonymous_3017_._set_name(u'anonymous') + var.get(u'pp$2').put(u'toAssignable', PyJs_anonymous_3017_) + @Js + def PyJs_anonymous_3018_(exprList, isBinding, contextDescription, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'isBinding':isBinding, u'exprList':exprList, u'contextDescription':contextDescription}, var) + var.registers([u'last', u'i', u'isBinding', u'contextDescription', u'arg', u'end', u'exprList', u'elt']) + var.put(u'end', var.get(u'exprList').get(u'length')) + if var.get(u'end'): + var.put(u'last', var.get(u'exprList').get((var.get(u'end')-Js(1.0)))) + if (var.get(u'last') and PyJsStrictEq(var.get(u'last').get(u'type'),Js(u'RestElement'))): + var.put(u'end',Js(var.get(u'end').to_number())-Js(1)) + else: + if (var.get(u'last') and PyJsStrictEq(var.get(u'last').get(u'type'),Js(u'SpreadElement'))): + var.get(u'last').put(u'type', Js(u'RestElement')) + var.put(u'arg', var.get(u'last').get(u'argument')) + var.get(u"this").callprop(u'toAssignable', var.get(u'arg'), var.get(u'isBinding'), var.get(u'contextDescription')) + if ((PyJsStrictNeq(var.get(u'arg').get(u'type'),Js(u'Identifier')) and PyJsStrictNeq(var.get(u'arg').get(u'type'),Js(u'MemberExpression'))) and PyJsStrictNeq(var.get(u'arg').get(u'type'),Js(u'ArrayPattern'))): + var.get(u"this").callprop(u'unexpected', var.get(u'arg').get(u'start')) + var.put(u'end',Js(var.get(u'end').to_number())-Js(1)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'end')): + try: + var.put(u'elt', var.get(u'exprList').get(var.get(u'i'))) + if var.get(u'elt'): + var.get(u"this").callprop(u'toAssignable', var.get(u'elt'), var.get(u'isBinding'), var.get(u'contextDescription')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'exprList') + PyJs_anonymous_3018_._set_name(u'anonymous') + var.get(u'pp$2').put(u'toAssignableList', PyJs_anonymous_3018_) + @Js + def PyJs_anonymous_3019_(exprList, this, arguments, var=var): + var = Scope({u'this':this, u'exprList':exprList, u'arguments':arguments}, var) + var.registers([u'exprList']) + return var.get(u'exprList') + PyJs_anonymous_3019_._set_name(u'anonymous') + var.get(u'pp$2').put(u'toReferencedList', PyJs_anonymous_3019_) + @Js + def PyJs_anonymous_3020_(refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'node', u'refShorthandDefaultPos']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'argument', var.get(u"this").callprop(u'parseMaybeAssign', Js(False), var.get(u'refShorthandDefaultPos'))) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'SpreadElement')) + PyJs_anonymous_3020_._set_name(u'anonymous') + var.get(u'pp$2').put(u'parseSpread', PyJs_anonymous_3020_) + @Js + def PyJs_anonymous_3021_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'argument', var.get(u"this").callprop(u'parseBindingIdentifier')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'RestElement')) + PyJs_anonymous_3021_._set_name(u'anonymous') + var.get(u'pp$2').put(u'parseRest', PyJs_anonymous_3021_) + @Js + def PyJs_anonymous_3022_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return ((var.get(u"this").callprop(u'match', var.get(u'types').get(u'_yield')) and var.get(u"this").get(u'state').get(u'strict').neg()) and var.get(u"this").get(u'state').get(u'inGenerator').neg()) + PyJs_anonymous_3022_._set_name(u'anonymous') + var.get(u'pp$2').put(u'shouldAllowYieldIdentifier', PyJs_anonymous_3022_) + @Js + def PyJs_anonymous_3023_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'parseIdentifier', var.get(u"this").callprop(u'shouldAllowYieldIdentifier')) + PyJs_anonymous_3023_._set_name(u'anonymous') + var.get(u'pp$2').put(u'parseBindingIdentifier', PyJs_anonymous_3023_) + @Js + def PyJs_anonymous_3024_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + while 1: + SWITCHED = False + CONDITION = (var.get(u"this").get(u'state').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_yield')): + SWITCHED = True + if (var.get(u"this").get(u'state').get(u'strict') or var.get(u"this").get(u'state').get(u'inGenerator')): + var.get(u"this").callprop(u'unexpected') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'name')): + SWITCHED = True + return var.get(u"this").callprop(u'parseIdentifier', var.get(u'true')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'bracketL')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'elements', var.get(u"this").callprop(u'parseBindingList', var.get(u'types').get(u'bracketR'), var.get(u'true'))) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ArrayPattern')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'braceL')): + SWITCHED = True + return var.get(u"this").callprop(u'parseObj', var.get(u'true')) + if True: + SWITCHED = True + var.get(u"this").callprop(u'unexpected') + SWITCHED = True + break + PyJs_anonymous_3024_._set_name(u'anonymous') + var.get(u'pp$2').put(u'parseBindingAtom', PyJs_anonymous_3024_) + @Js + def PyJs_anonymous_3025_(close, allowEmpty, this, arguments, var=var): + var = Scope({u'this':this, u'close':close, u'allowEmpty':allowEmpty, u'arguments':arguments}, var) + var.registers([u'elts', u'decorators', u'close', u'first', u'allowEmpty', u'left']) + var.put(u'elts', Js([])) + var.put(u'first', var.get(u'true')) + while var.get(u"this").callprop(u'eat', var.get(u'close')).neg(): + if var.get(u'first'): + var.put(u'first', Js(False)) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if (var.get(u'allowEmpty') and var.get(u"this").callprop(u'match', var.get(u'types').get(u'comma'))): + var.get(u'elts').callprop(u'push', var.get(u"null")) + else: + if var.get(u"this").callprop(u'eat', var.get(u'close')): + break + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'ellipsis')): + var.get(u'elts').callprop(u'push', var.get(u"this").callprop(u'parseAssignableListItemTypes', var.get(u"this").callprop(u'parseRest'))) + var.get(u"this").callprop(u'expect', var.get(u'close')) + break + else: + var.put(u'decorators', Js([])) + while var.get(u"this").callprop(u'match', var.get(u'types').get(u'at')): + var.get(u'decorators').callprop(u'push', var.get(u"this").callprop(u'parseDecorator')) + var.put(u'left', var.get(u"this").callprop(u'parseMaybeDefault')) + if var.get(u'decorators').get(u'length'): + var.get(u'left').put(u'decorators', var.get(u'decorators')) + var.get(u"this").callprop(u'parseAssignableListItemTypes', var.get(u'left')) + var.get(u'elts').callprop(u'push', var.get(u"this").callprop(u'parseMaybeDefault', var.get(u'left').get(u'start'), var.get(u'left').get(u'loc').get(u'start'), var.get(u'left'))) + return var.get(u'elts') + PyJs_anonymous_3025_._set_name(u'anonymous') + var.get(u'pp$2').put(u'parseBindingList', PyJs_anonymous_3025_) + @Js + def PyJs_anonymous_3026_(param, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'param':param}, var) + var.registers([u'param']) + return var.get(u'param') + PyJs_anonymous_3026_._set_name(u'anonymous') + var.get(u'pp$2').put(u'parseAssignableListItemTypes', PyJs_anonymous_3026_) + @Js + def PyJs_anonymous_3027_(startPos, startLoc, left, this, arguments, var=var): + var = Scope({u'this':this, u'startPos':startPos, u'arguments':arguments, u'startLoc':startLoc, u'left':left}, var) + var.registers([u'node', u'startPos', u'startLoc', u'left']) + var.put(u'startLoc', (var.get(u'startLoc') or var.get(u"this").get(u'state').get(u'startLoc'))) + var.put(u'startPos', (var.get(u'startPos') or var.get(u"this").get(u'state').get(u'start'))) + var.put(u'left', (var.get(u'left') or var.get(u"this").callprop(u'parseBindingAtom'))) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'eq')).neg(): + return var.get(u'left') + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'left', var.get(u'left')) + var.get(u'node').put(u'right', var.get(u"this").callprop(u'parseMaybeAssign')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'AssignmentPattern')) + PyJs_anonymous_3027_._set_name(u'anonymous') + var.get(u'pp$2').put(u'parseMaybeDefault', PyJs_anonymous_3027_) + @Js + def PyJs_anonymous_3028_(expr, isBinding, checkClashes, contextDescription, this, arguments, var=var): + var = Scope({u'checkClashes':checkClashes, u'arguments':arguments, u'this':this, u'expr':expr, u'isBinding':isBinding, u'contextDescription':contextDescription}, var) + var.registers([u'_isArray3', u'_isArray2', u'_ref3', u'isBinding', u'_i3', u'_i2', u'contextDescription', u'prop', u'checkClashes', u'key', u'expr', u'elem', u'message', u'_ref2', u'_iterator3', u'_iterator2']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'expr').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'Identifier')): + SWITCHED = True + if (var.get(u"this").get(u'state').get(u'strict') and (var.get(u'reservedWords').callprop(u'strictBind', var.get(u'expr').get(u'name')) or var.get(u'reservedWords').callprop(u'strict', var.get(u'expr').get(u'name')))): + var.get(u"this").callprop(u'raise', var.get(u'expr').get(u'start'), (((Js(u'Binding ') if var.get(u'isBinding') else Js(u'Assigning to '))+var.get(u'expr').get(u'name'))+Js(u' in strict mode'))) + if var.get(u'checkClashes'): + var.put(u'key', (Js(u'_')+var.get(u'expr').get(u'name'))) + if var.get(u'checkClashes').get(var.get(u'key')): + var.get(u"this").callprop(u'raise', var.get(u'expr').get(u'start'), Js(u'Argument name clash in strict mode')) + else: + var.get(u'checkClashes').put(var.get(u'key'), var.get(u'true')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'MemberExpression')): + SWITCHED = True + if var.get(u'isBinding'): + var.get(u"this").callprop(u'raise', var.get(u'expr').get(u'start'), ((Js(u'Binding') if var.get(u'isBinding') else Js(u'Assigning to'))+Js(u' member expression'))) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectPattern')): + SWITCHED = True + #for JS loop + var.put(u'_iterator2', var.get(u'expr').get(u'properties')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else var.get(u'_iterator2').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'prop', var.get(u'_ref2')) + if PyJsStrictEq(var.get(u'prop').get(u'type'),Js(u'ObjectProperty')): + var.put(u'prop', var.get(u'prop').get(u'value')) + var.get(u"this").callprop(u'checkLVal', var.get(u'prop'), var.get(u'isBinding'), var.get(u'checkClashes'), Js(u'object destructuring pattern')) + + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ArrayPattern')): + SWITCHED = True + #for JS loop + var.put(u'_iterator3', var.get(u'expr').get(u'elements')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else var.get(u'_iterator3').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'elem', var.get(u'_ref3')) + if var.get(u'elem'): + var.get(u"this").callprop(u'checkLVal', var.get(u'elem'), var.get(u'isBinding'), var.get(u'checkClashes'), Js(u'array destructuring pattern')) + + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'AssignmentPattern')): + SWITCHED = True + var.get(u"this").callprop(u'checkLVal', var.get(u'expr').get(u'left'), var.get(u'isBinding'), var.get(u'checkClashes'), Js(u'assignment pattern')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'RestProperty')): + SWITCHED = True + var.get(u"this").callprop(u'checkLVal', var.get(u'expr').get(u'argument'), var.get(u'isBinding'), var.get(u'checkClashes'), Js(u'rest property')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'RestElement')): + SWITCHED = True + var.get(u"this").callprop(u'checkLVal', var.get(u'expr').get(u'argument'), var.get(u'isBinding'), var.get(u'checkClashes'), Js(u'rest element')) + break + if True: + SWITCHED = True + var.put(u'message', (((Js(u'Binding invalid') if var.get(u'isBinding') else Js(u'Invalid'))+Js(u' left-hand side'))+((Js(u' in ')+var.get(u'contextDescription')) if var.get(u'contextDescription') else Js(u'expression')))) + var.get(u"this").callprop(u'raise', var.get(u'expr').get(u'start'), var.get(u'message')) + SWITCHED = True + break + PyJs_anonymous_3028_._set_name(u'anonymous') + var.get(u'pp$2').put(u'checkLVal', PyJs_anonymous_3028_) + var.put(u'pp$3', var.get(u'Parser').get(u'prototype')) + @Js + def PyJs_anonymous_3029_(prop, propHash, this, arguments, var=var): + var = Scope({u'this':this, u'propHash':propHash, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'propHash', u'name', u'key', u'prop']) + if var.get(u'prop').get(u'computed'): + return var.get('undefined') + var.put(u'key', var.get(u'prop').get(u'key')) + var.put(u'name', PyJsComma(Js(0.0), Js(None))) + while 1: + SWITCHED = False + CONDITION = (var.get(u'key').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'Identifier')): + SWITCHED = True + var.put(u'name', var.get(u'key').get(u'name')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'StringLiteral')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'NumericLiteral')): + SWITCHED = True + var.put(u'name', var.get(u'String')(var.get(u'key').get(u'value'))) + break + if True: + SWITCHED = True + return var.get('undefined') + SWITCHED = True + break + if (PyJsStrictEq(var.get(u'name'),Js(u'__proto__')) and var.get(u'prop').get(u'kind').neg()): + if var.get(u'propHash').get(u'proto'): + var.get(u"this").callprop(u'raise', var.get(u'key').get(u'start'), Js(u'Redefinition of __proto__ property')) + var.get(u'propHash').put(u'proto', var.get(u'true')) + PyJs_anonymous_3029_._set_name(u'anonymous') + var.get(u'pp$3').put(u'checkPropClash', PyJs_anonymous_3029_) + @Js + def PyJs_anonymous_3030_(noIn, refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'noIn':noIn, u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'node', u'expr', u'refShorthandDefaultPos', u'startLoc', u'noIn', u'startPos']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'expr', var.get(u"this").callprop(u'parseMaybeAssign', var.get(u'noIn'), var.get(u'refShorthandDefaultPos'))) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'comma')): + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'expressions', Js([var.get(u'expr')])) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')): + var.get(u'node').get(u'expressions').callprop(u'push', var.get(u"this").callprop(u'parseMaybeAssign', var.get(u'noIn'), var.get(u'refShorthandDefaultPos'))) + var.get(u"this").callprop(u'toReferencedList', var.get(u'node').get(u'expressions')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'SequenceExpression')) + return var.get(u'expr') + PyJs_anonymous_3030_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseExpression', PyJs_anonymous_3030_) + @Js + def PyJs_anonymous_3031_(noIn, refShorthandDefaultPos, afterLeftParse, refNeedsArrowPos, this, arguments, var=var): + var = Scope({u'afterLeftParse':afterLeftParse, u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'noIn':noIn, u'arguments':arguments, u'refNeedsArrowPos':refNeedsArrowPos}, var) + var.registers([u'node', u'afterLeftParse', u'startLoc', u'errorMsg', u'refNeedsArrowPos', u'refShorthandDefaultPos', u'failOnShorthandAssign', u'noIn', u'startPos', u'_left', u'left']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'_yield')) and var.get(u"this").get(u'state').get(u'inGenerator')): + var.put(u'_left', var.get(u"this").callprop(u'parseYield')) + if var.get(u'afterLeftParse'): + var.put(u'_left', var.get(u'afterLeftParse').callprop(u'call', var.get(u"this"), var.get(u'_left'), var.get(u'startPos'), var.get(u'startLoc'))) + return var.get(u'_left') + var.put(u'failOnShorthandAssign', PyJsComma(Js(0.0), Js(None))) + if var.get(u'refShorthandDefaultPos'): + var.put(u'failOnShorthandAssign', Js(False)) + else: + PyJs_Object_3032_ = Js({u'start':Js(0.0)}) + var.put(u'refShorthandDefaultPos', PyJs_Object_3032_) + var.put(u'failOnShorthandAssign', var.get(u'true')) + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'name'))): + var.get(u"this").get(u'state').put(u'potentialArrowAt', var.get(u"this").get(u'state').get(u'start')) + var.put(u'left', var.get(u"this").callprop(u'parseMaybeConditional', var.get(u'noIn'), var.get(u'refShorthandDefaultPos'), var.get(u'refNeedsArrowPos'))) + if var.get(u'afterLeftParse'): + var.put(u'left', var.get(u'afterLeftParse').callprop(u'call', var.get(u"this"), var.get(u'left'), var.get(u'startPos'), var.get(u'startLoc'))) + if var.get(u"this").get(u'state').get(u'type').get(u'isAssign'): + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'operator', var.get(u"this").get(u'state').get(u'value')) + var.get(u'node').put(u'left', (var.get(u"this").callprop(u'toAssignable', var.get(u'left'), var.get(u'undefined'), Js(u'assignment expression')) if var.get(u"this").callprop(u'match', var.get(u'types').get(u'eq')) else var.get(u'left'))) + var.get(u'refShorthandDefaultPos').put(u'start', Js(0.0)) + var.get(u"this").callprop(u'checkLVal', var.get(u'left'), var.get(u'undefined'), var.get(u'undefined'), Js(u'assignment expression')) + if (var.get(u'left').get(u'extra') and var.get(u'left').get(u'extra').get(u'parenthesized')): + var.put(u'errorMsg', PyJsComma(Js(0.0), Js(None))) + if PyJsStrictEq(var.get(u'left').get(u'type'),Js(u'ObjectPattern')): + var.put(u'errorMsg', Js(u'`({a}) = 0` use `({a} = 0)`')) + else: + if PyJsStrictEq(var.get(u'left').get(u'type'),Js(u'ArrayPattern')): + var.put(u'errorMsg', Js(u'`([a]) = 0` use `([a] = 0)`')) + if var.get(u'errorMsg'): + var.get(u"this").callprop(u'raise', var.get(u'left').get(u'start'), (Js(u"You're trying to assign to a parenthesized expression, eg. instead of ")+var.get(u'errorMsg'))) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'right', var.get(u"this").callprop(u'parseMaybeAssign', var.get(u'noIn'))) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'AssignmentExpression')) + else: + if (var.get(u'failOnShorthandAssign') and var.get(u'refShorthandDefaultPos').get(u'start')): + var.get(u"this").callprop(u'unexpected', var.get(u'refShorthandDefaultPos').get(u'start')) + return var.get(u'left') + PyJs_anonymous_3031_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseMaybeAssign', PyJs_anonymous_3031_) + @Js + def PyJs_anonymous_3033_(noIn, refShorthandDefaultPos, refNeedsArrowPos, this, arguments, var=var): + var = Scope({u'noIn':noIn, u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments, u'refNeedsArrowPos':refNeedsArrowPos}, var) + var.registers([u'expr', u'refShorthandDefaultPos', u'startLoc', u'noIn', u'startPos', u'refNeedsArrowPos']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'expr', var.get(u"this").callprop(u'parseExprOps', var.get(u'noIn'), var.get(u'refShorthandDefaultPos'))) + if (var.get(u'refShorthandDefaultPos') and var.get(u'refShorthandDefaultPos').get(u'start')): + return var.get(u'expr') + return var.get(u"this").callprop(u'parseConditional', var.get(u'expr'), var.get(u'noIn'), var.get(u'startPos'), var.get(u'startLoc'), var.get(u'refNeedsArrowPos')) + PyJs_anonymous_3033_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseMaybeConditional', PyJs_anonymous_3033_) + @Js + def PyJs_anonymous_3034_(expr, noIn, startPos, startLoc, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'startLoc':startLoc, u'noIn':noIn, u'expr':expr, u'startPos':startPos}, var) + var.registers([u'node', u'expr', u'startPos', u'noIn', u'startLoc']) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'question')): + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'test', var.get(u'expr')) + var.get(u'node').put(u'consequent', var.get(u"this").callprop(u'parseMaybeAssign')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'colon')) + var.get(u'node').put(u'alternate', var.get(u"this").callprop(u'parseMaybeAssign', var.get(u'noIn'))) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ConditionalExpression')) + return var.get(u'expr') + PyJs_anonymous_3034_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseConditional', PyJs_anonymous_3034_) + @Js + def PyJs_anonymous_3035_(noIn, refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'noIn':noIn, u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'noIn', u'expr', u'startPos', u'refShorthandDefaultPos', u'startLoc']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'expr', var.get(u"this").callprop(u'parseMaybeUnary', var.get(u'refShorthandDefaultPos'))) + if (var.get(u'refShorthandDefaultPos') and var.get(u'refShorthandDefaultPos').get(u'start')): + return var.get(u'expr') + else: + return var.get(u"this").callprop(u'parseExprOp', var.get(u'expr'), var.get(u'startPos'), var.get(u'startLoc'), (-Js(1.0)), var.get(u'noIn')) + PyJs_anonymous_3035_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseExprOps', PyJs_anonymous_3035_) + @Js + def PyJs_anonymous_3036_(left, leftStartPos, leftStartLoc, minPrec, noIn, this, arguments, var=var): + var = Scope({u'minPrec':minPrec, u'arguments':arguments, u'noIn':noIn, u'leftStartLoc':leftStartLoc, u'this':this, u'leftStartPos':leftStartPos, u'left':left}, var) + var.registers([u'node', u'minPrec', u'leftStartPos', u'prec', u'startLoc', u'noIn', u'leftStartLoc', u'startPos', u'op', u'left']) + var.put(u'prec', var.get(u"this").get(u'state').get(u'type').get(u'binop')) + if ((var.get(u'prec')!=var.get(u"null")) and (var.get(u'noIn').neg() or var.get(u"this").callprop(u'match', var.get(u'types').get(u'_in')).neg())): + if (var.get(u'prec')>var.get(u'minPrec')): + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'leftStartPos'), var.get(u'leftStartLoc'))) + var.get(u'node').put(u'left', var.get(u'left')) + var.get(u'node').put(u'operator', var.get(u"this").get(u'state').get(u'value')) + if ((((PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'**')) and PyJsStrictEq(var.get(u'left').get(u'type'),Js(u'UnaryExpression'))) and var.get(u'left').get(u'extra')) and var.get(u'left').get(u'extra').get(u'parenthesizedArgument').neg()) and var.get(u'left').get(u'extra').get(u'parenthesized').neg()): + var.get(u"this").callprop(u'raise', var.get(u'left').get(u'argument').get(u'start'), Js(u'Illegal expression. Wrap left hand side or entire exponentiation in parentheses.')) + var.put(u'op', var.get(u"this").get(u'state').get(u'type')) + var.get(u"this").callprop(u'next') + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.get(u'node').put(u'right', var.get(u"this").callprop(u'parseExprOp', var.get(u"this").callprop(u'parseMaybeUnary'), var.get(u'startPos'), var.get(u'startLoc'), ((var.get(u'prec')-Js(1.0)) if var.get(u'op').get(u'rightAssociative') else var.get(u'prec')), var.get(u'noIn'))) + var.get(u"this").callprop(u'finishNode', var.get(u'node'), (Js(u'LogicalExpression') if (PyJsStrictEq(var.get(u'op'),var.get(u'types').get(u'logicalOR')) or PyJsStrictEq(var.get(u'op'),var.get(u'types').get(u'logicalAND'))) else Js(u'BinaryExpression'))) + return var.get(u"this").callprop(u'parseExprOp', var.get(u'node'), var.get(u'leftStartPos'), var.get(u'leftStartLoc'), var.get(u'minPrec'), var.get(u'noIn')) + return var.get(u'left') + PyJs_anonymous_3036_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseExprOp', PyJs_anonymous_3036_) + @Js + def PyJs_anonymous_3037_(refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'node', u'expr', u'update', u'_node', u'refShorthandDefaultPos', u'startLoc', u'startPos', u'argType']) + if var.get(u"this").get(u'state').get(u'type').get(u'prefix'): + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'update', var.get(u"this").callprop(u'match', var.get(u'types').get(u'incDec'))) + var.get(u'node').put(u'operator', var.get(u"this").get(u'state').get(u'value')) + var.get(u'node').put(u'prefix', var.get(u'true')) + var.get(u"this").callprop(u'next') + var.put(u'argType', var.get(u"this").get(u'state').get(u'type')) + var.get(u'node').put(u'argument', var.get(u"this").callprop(u'parseMaybeUnary')) + var.get(u"this").callprop(u'addExtra', var.get(u'node'), Js(u'parenthesizedArgument'), (PyJsStrictEq(var.get(u'argType'),var.get(u'types').get(u'parenL')) and (var.get(u'node').get(u'argument').get(u'extra').neg() or var.get(u'node').get(u'argument').get(u'extra').get(u'parenthesized').neg()))) + if (var.get(u'refShorthandDefaultPos') and var.get(u'refShorthandDefaultPos').get(u'start')): + var.get(u"this").callprop(u'unexpected', var.get(u'refShorthandDefaultPos').get(u'start')) + if var.get(u'update'): + var.get(u"this").callprop(u'checkLVal', var.get(u'node').get(u'argument'), var.get(u'undefined'), var.get(u'undefined'), Js(u'prefix operation')) + else: + if ((var.get(u"this").get(u'state').get(u'strict') and PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'delete'))) and PyJsStrictEq(var.get(u'node').get(u'argument').get(u'type'),Js(u'Identifier'))): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), Js(u'Deleting local variable in strict mode')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), (Js(u'UpdateExpression') if var.get(u'update') else Js(u'UnaryExpression'))) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'expr', var.get(u"this").callprop(u'parseExprSubscripts', var.get(u'refShorthandDefaultPos'))) + if (var.get(u'refShorthandDefaultPos') and var.get(u'refShorthandDefaultPos').get(u'start')): + return var.get(u'expr') + while (var.get(u"this").get(u'state').get(u'type').get(u'postfix') and var.get(u"this").callprop(u'canInsertSemicolon').neg()): + var.put(u'_node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'_node').put(u'operator', var.get(u"this").get(u'state').get(u'value')) + var.get(u'_node').put(u'prefix', Js(False)) + var.get(u'_node').put(u'argument', var.get(u'expr')) + var.get(u"this").callprop(u'checkLVal', var.get(u'expr'), var.get(u'undefined'), var.get(u'undefined'), Js(u'postfix operation')) + var.get(u"this").callprop(u'next') + var.put(u'expr', var.get(u"this").callprop(u'finishNode', var.get(u'_node'), Js(u'UpdateExpression'))) + return var.get(u'expr') + PyJs_anonymous_3037_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseMaybeUnary', PyJs_anonymous_3037_) + @Js + def PyJs_anonymous_3038_(refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'expr', u'startPos', u'potentialArrowAt', u'startLoc', u'refShorthandDefaultPos']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'potentialArrowAt', var.get(u"this").get(u'state').get(u'potentialArrowAt')) + var.put(u'expr', var.get(u"this").callprop(u'parseExprAtom', var.get(u'refShorthandDefaultPos'))) + if (PyJsStrictEq(var.get(u'expr').get(u'type'),Js(u'ArrowFunctionExpression')) and PyJsStrictEq(var.get(u'expr').get(u'start'),var.get(u'potentialArrowAt'))): + return var.get(u'expr') + if (var.get(u'refShorthandDefaultPos') and var.get(u'refShorthandDefaultPos').get(u'start')): + return var.get(u'expr') + return var.get(u"this").callprop(u'parseSubscripts', var.get(u'expr'), var.get(u'startPos'), var.get(u'startLoc')) + PyJs_anonymous_3038_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseExprSubscripts', PyJs_anonymous_3038_) + @Js + def PyJs_anonymous_3039_(base, startPos, startLoc, noCalls, this, arguments, var=var): + var = Scope({u'base':base, u'arguments':arguments, u'startLoc':startLoc, u'this':this, u'startPos':startPos, u'noCalls':noCalls}, var) + var.registers([u'node', u'startLoc', u'possibleAsync', u'_node3', u'_node2', u'base', u'_node5', u'_node4', u'startPos', u'noCalls']) + #for JS loop + + while 1: + if (var.get(u'noCalls').neg() and var.get(u"this").callprop(u'eat', var.get(u'types').get(u'doubleColon'))): + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'object', var.get(u'base')) + var.get(u'node').put(u'callee', var.get(u"this").callprop(u'parseNoCallExpr')) + return var.get(u"this").callprop(u'parseSubscripts', var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'BindExpression')), var.get(u'startPos'), var.get(u'startLoc'), var.get(u'noCalls')) + else: + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'dot')): + var.put(u'_node2', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'_node2').put(u'object', var.get(u'base')) + var.get(u'_node2').put(u'property', var.get(u"this").callprop(u'parseIdentifier', var.get(u'true'))) + var.get(u'_node2').put(u'computed', Js(False)) + var.put(u'base', var.get(u"this").callprop(u'finishNode', var.get(u'_node2'), Js(u'MemberExpression'))) + else: + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'bracketL')): + var.put(u'_node3', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'_node3').put(u'object', var.get(u'base')) + var.get(u'_node3').put(u'property', var.get(u"this").callprop(u'parseExpression')) + var.get(u'_node3').put(u'computed', var.get(u'true')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'bracketR')) + var.put(u'base', var.get(u"this").callprop(u'finishNode', var.get(u'_node3'), Js(u'MemberExpression'))) + else: + if (var.get(u'noCalls').neg() and var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL'))): + var.put(u'possibleAsync', (((PyJsStrictEq(var.get(u"this").get(u'state').get(u'potentialArrowAt'),var.get(u'base').get(u'start')) and PyJsStrictEq(var.get(u'base').get(u'type'),Js(u'Identifier'))) and PyJsStrictEq(var.get(u'base').get(u'name'),Js(u'async'))) and var.get(u"this").callprop(u'canInsertSemicolon').neg())) + var.get(u"this").callprop(u'next') + var.put(u'_node4', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'_node4').put(u'callee', var.get(u'base')) + var.get(u'_node4').put(u'arguments', var.get(u"this").callprop(u'parseCallExpressionArguments', var.get(u'types').get(u'parenR'), var.get(u'possibleAsync'))) + if (PyJsStrictEq(var.get(u'_node4').get(u'callee').get(u'type'),Js(u'Import')) and PyJsStrictNeq(var.get(u'_node4').get(u'arguments').get(u'length'),Js(1.0))): + var.get(u"this").callprop(u'raise', var.get(u'_node4').get(u'start'), Js(u'import() requires exactly one argument')) + var.put(u'base', var.get(u"this").callprop(u'finishNode', var.get(u'_node4'), Js(u'CallExpression'))) + if (var.get(u'possibleAsync') and var.get(u"this").callprop(u'shouldParseAsyncArrow')): + return var.get(u"this").callprop(u'parseAsyncArrowFromCallExpression', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc')), var.get(u'_node4')) + else: + var.get(u"this").callprop(u'toReferencedList', var.get(u'_node4').get(u'arguments')) + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'backQuote')): + var.put(u'_node5', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'_node5').put(u'tag', var.get(u'base')) + var.get(u'_node5').put(u'quasi', var.get(u"this").callprop(u'parseTemplate')) + var.put(u'base', var.get(u"this").callprop(u'finishNode', var.get(u'_node5'), Js(u'TaggedTemplateExpression'))) + else: + return var.get(u'base') + + PyJs_anonymous_3039_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseSubscripts', PyJs_anonymous_3039_) + @Js + def PyJs_anonymous_3040_(close, possibleAsyncArrow, this, arguments, var=var): + var = Scope({u'this':this, u'close':close, u'possibleAsyncArrow':possibleAsyncArrow, u'arguments':arguments}, var) + var.registers([u'elts', u'close', u'first', u'possibleAsyncArrow', u'innerParenStart']) + var.put(u'innerParenStart', PyJsComma(Js(0.0), Js(None))) + var.put(u'elts', Js([])) + var.put(u'first', var.get(u'true')) + while var.get(u"this").callprop(u'eat', var.get(u'close')).neg(): + if var.get(u'first'): + var.put(u'first', Js(False)) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if var.get(u"this").callprop(u'eat', var.get(u'close')): + break + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')) and var.get(u'innerParenStart').neg()): + var.put(u'innerParenStart', var.get(u"this").get(u'state').get(u'start')) + PyJs_Object_3041_ = Js({u'start':Js(0.0)}) + var.get(u'elts').callprop(u'push', var.get(u"this").callprop(u'parseExprListItem', var.get(u'undefined'), (PyJs_Object_3041_ if var.get(u'possibleAsyncArrow') else var.get(u'undefined')))) + if ((var.get(u'possibleAsyncArrow') and var.get(u'innerParenStart')) and var.get(u"this").callprop(u'shouldParseAsyncArrow')): + var.get(u"this").callprop(u'unexpected') + return var.get(u'elts') + PyJs_anonymous_3040_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseCallExpressionArguments', PyJs_anonymous_3040_) + @Js + def PyJs_anonymous_3042_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'match', var.get(u'types').get(u'arrow')) + PyJs_anonymous_3042_._set_name(u'anonymous') + var.get(u'pp$3').put(u'shouldParseAsyncArrow', PyJs_anonymous_3042_) + @Js + def PyJs_anonymous_3043_(node, call, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'call':call, u'arguments':arguments}, var) + var.registers([u'node', u'call']) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'arrow')) + return var.get(u"this").callprop(u'parseArrowExpression', var.get(u'node'), var.get(u'call').get(u'arguments'), var.get(u'true')) + PyJs_anonymous_3043_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseAsyncArrowFromCallExpression', PyJs_anonymous_3043_) + @Js + def PyJs_anonymous_3044_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'startPos', u'startLoc']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + return var.get(u"this").callprop(u'parseSubscripts', var.get(u"this").callprop(u'parseExprAtom'), var.get(u'startPos'), var.get(u'startLoc'), var.get(u'true')) + PyJs_anonymous_3044_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseNoCallExpr', PyJs_anonymous_3044_) + @Js + def PyJs_anonymous_3045_(refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'node', u'oldLabels', u'allowAwait', u'oldInFunction', u'allowYield', u'value', u'params', u'_node6', u'callee', u'id', u'canBeArrow', u'refShorthandDefaultPos']) + var.put(u'node', PyJsComma(Js(0.0), Js(None))) + var.put(u'canBeArrow', PyJsStrictEq(var.get(u"this").get(u'state').get(u'potentialArrowAt'),var.get(u"this").get(u'state').get(u'start'))) + while 1: + SWITCHED = False + CONDITION = (var.get(u"this").get(u'state').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_super')): + SWITCHED = True + if (var.get(u"this").get(u'state').get(u'inMethod').neg() and var.get(u"this").get(u'options').get(u'allowSuperOutsideMethod').neg()): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u"'super' outside of function or class")) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + if ((var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')).neg() and var.get(u"this").callprop(u'match', var.get(u'types').get(u'bracketL')).neg()) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'dot')).neg()): + var.get(u"this").callprop(u'unexpected') + if ((var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')) and PyJsStrictNeq(var.get(u"this").get(u'state').get(u'inMethod'),Js(u'constructor'))) and var.get(u"this").get(u'options').get(u'allowSuperOutsideMethod').neg()): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), Js(u'super() outside of class constructor')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'Super')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_import')): + SWITCHED = True + if var.get(u"this").callprop(u'hasPlugin', Js(u'dynamicImport')).neg(): + var.get(u"this").callprop(u'unexpected') + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')).neg(): + var.get(u"this").callprop(u'unexpected', var.get(u"null"), var.get(u'types').get(u'parenL')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'Import')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_this')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ThisExpression')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_yield')): + SWITCHED = True + if var.get(u"this").get(u'state').get(u'inGenerator'): + var.get(u"this").callprop(u'unexpected') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'name')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'allowAwait', (PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'await')) and var.get(u"this").get(u'state').get(u'inAsync'))) + var.put(u'allowYield', var.get(u"this").callprop(u'shouldAllowYieldIdentifier')) + var.put(u'id', var.get(u"this").callprop(u'parseIdentifier', (var.get(u'allowAwait') or var.get(u'allowYield')))) + if PyJsStrictEq(var.get(u'id').get(u'name'),Js(u'await')): + if (var.get(u"this").get(u'state').get(u'inAsync') or var.get(u"this").get(u'inModule')): + return var.get(u"this").callprop(u'parseAwait', var.get(u'node')) + else: + if ((PyJsStrictEq(var.get(u'id').get(u'name'),Js(u'async')) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'_function'))) and var.get(u"this").callprop(u'canInsertSemicolon').neg()): + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'parseFunction', var.get(u'node'), Js(False), Js(False), var.get(u'true')) + else: + if ((var.get(u'canBeArrow') and PyJsStrictEq(var.get(u'id').get(u'name'),Js(u'async'))) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'name'))): + var.put(u'params', Js([var.get(u"this").callprop(u'parseIdentifier')])) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'arrow')) + return var.get(u"this").callprop(u'parseArrowExpression', var.get(u'node'), var.get(u'params'), var.get(u'true')) + if ((var.get(u'canBeArrow') and var.get(u"this").callprop(u'canInsertSemicolon').neg()) and var.get(u"this").callprop(u'eat', var.get(u'types').get(u'arrow'))): + return var.get(u"this").callprop(u'parseArrowExpression', var.get(u'node'), Js([var.get(u'id')])) + return var.get(u'id') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_do')): + SWITCHED = True + if var.get(u"this").callprop(u'hasPlugin', Js(u'doExpressions')): + var.put(u'_node6', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.put(u'oldInFunction', var.get(u"this").get(u'state').get(u'inFunction')) + var.put(u'oldLabels', var.get(u"this").get(u'state').get(u'labels')) + var.get(u"this").get(u'state').put(u'labels', Js([])) + var.get(u"this").get(u'state').put(u'inFunction', Js(False)) + var.get(u'_node6').put(u'body', var.get(u"this").callprop(u'parseBlock', Js(False), var.get(u'true'))) + var.get(u"this").get(u'state').put(u'inFunction', var.get(u'oldInFunction')) + var.get(u"this").get(u'state').put(u'labels', var.get(u'oldLabels')) + return var.get(u"this").callprop(u'finishNode', var.get(u'_node6'), Js(u'DoExpression')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'regexp')): + SWITCHED = True + var.put(u'value', var.get(u"this").get(u'state').get(u'value')) + var.put(u'node', var.get(u"this").callprop(u'parseLiteral', var.get(u'value').get(u'value'), Js(u'RegExpLiteral'))) + var.get(u'node').put(u'pattern', var.get(u'value').get(u'pattern')) + var.get(u'node').put(u'flags', var.get(u'value').get(u'flags')) + return var.get(u'node') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'num')): + SWITCHED = True + return var.get(u"this").callprop(u'parseLiteral', var.get(u"this").get(u'state').get(u'value'), Js(u'NumericLiteral')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'string')): + SWITCHED = True + return var.get(u"this").callprop(u'parseLiteral', var.get(u"this").get(u'state').get(u'value'), Js(u'StringLiteral')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_null')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'NullLiteral')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_true')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_false')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'value', var.get(u"this").callprop(u'match', var.get(u'types').get(u'_true'))) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'BooleanLiteral')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'parenL')): + SWITCHED = True + return var.get(u"this").callprop(u'parseParenAndDistinguishExpression', var.get(u"null"), var.get(u"null"), var.get(u'canBeArrow')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'bracketL')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'elements', var.get(u"this").callprop(u'parseExprList', var.get(u'types').get(u'bracketR'), var.get(u'true'), var.get(u'refShorthandDefaultPos'))) + var.get(u"this").callprop(u'toReferencedList', var.get(u'node').get(u'elements')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ArrayExpression')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'braceL')): + SWITCHED = True + return var.get(u"this").callprop(u'parseObj', Js(False), var.get(u'refShorthandDefaultPos')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_function')): + SWITCHED = True + return var.get(u"this").callprop(u'parseFunctionExpression') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'at')): + SWITCHED = True + var.get(u"this").callprop(u'parseDecorators') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_class')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'takeDecorators', var.get(u'node')) + return var.get(u"this").callprop(u'parseClass', var.get(u'node'), Js(False)) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_new')): + SWITCHED = True + return var.get(u"this").callprop(u'parseNew') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'backQuote')): + SWITCHED = True + return var.get(u"this").callprop(u'parseTemplate') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'doubleColon')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'object', var.get(u"null")) + var.put(u'callee', var.get(u'node').put(u'callee', var.get(u"this").callprop(u'parseNoCallExpr'))) + if PyJsStrictEq(var.get(u'callee').get(u'type'),Js(u'MemberExpression')): + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'BindExpression')) + else: + var.get(u"this").callprop(u'raise', var.get(u'callee').get(u'start'), Js(u'Binding should be performed on object property.')) + if True: + SWITCHED = True + var.get(u"this").callprop(u'unexpected') + SWITCHED = True + break + PyJs_anonymous_3045_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseExprAtom', PyJs_anonymous_3045_) + @Js + def PyJs_anonymous_3046_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'meta']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'meta', var.get(u"this").callprop(u'parseIdentifier', var.get(u'true'))) + if ((var.get(u"this").get(u'state').get(u'inGenerator') and var.get(u"this").callprop(u'eat', var.get(u'types').get(u'dot'))) and var.get(u"this").callprop(u'hasPlugin', Js(u'functionSent'))): + return var.get(u"this").callprop(u'parseMetaProperty', var.get(u'node'), var.get(u'meta'), Js(u'sent')) + else: + return var.get(u"this").callprop(u'parseFunction', var.get(u'node'), Js(False)) + PyJs_anonymous_3046_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseFunctionExpression', PyJs_anonymous_3046_) + @Js + def PyJs_anonymous_3047_(node, meta, propertyName, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'propertyName':propertyName, u'meta':meta, u'arguments':arguments}, var) + var.registers([u'node', u'propertyName', u'meta']) + var.get(u'node').put(u'meta', var.get(u'meta')) + var.get(u'node').put(u'property', var.get(u"this").callprop(u'parseIdentifier', var.get(u'true'))) + if PyJsStrictNeq(var.get(u'node').get(u'property').get(u'name'),var.get(u'propertyName')): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'property').get(u'start'), (((Js(u'The only valid meta property for new is ')+var.get(u'meta').get(u'name'))+Js(u'.'))+var.get(u'propertyName'))) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'MetaProperty')) + PyJs_anonymous_3047_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseMetaProperty', PyJs_anonymous_3047_) + @Js + def PyJs_anonymous_3048_(value, type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'value':value}, var) + var.registers([u'node', u'type', u'value']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'addExtra', var.get(u'node'), Js(u'rawValue'), var.get(u'value')) + var.get(u"this").callprop(u'addExtra', var.get(u'node'), Js(u'raw'), var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'start'), var.get(u"this").get(u'state').get(u'end'))) + var.get(u'node').put(u'value', var.get(u'value')) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), var.get(u'type')) + PyJs_anonymous_3048_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseLiteral', PyJs_anonymous_3048_) + @Js + def PyJs_anonymous_3049_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'val']) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + var.put(u'val', var.get(u"this").callprop(u'parseExpression')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + return var.get(u'val') + PyJs_anonymous_3049_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseParenExpression', PyJs_anonymous_3049_) + @Js + def PyJs_anonymous_3050_(startPos, startLoc, canBeArrow, this, arguments, var=var): + var = Scope({u'this':this, u'startPos':startPos, u'canBeArrow':canBeArrow, u'startLoc':startLoc, u'arguments':arguments}, var) + var.registers([u'innerStartLoc', u'optionalCommaStart', u'_ref', u'startPos', u'arrowNode', u'_iterator', u'val', u'param', u'innerStartPos', u'spreadNodeStartPos', u'refShorthandDefaultPos', u'_i', u'spreadStart', u'exprList', u'canBeArrow', u'innerEndPos', u'spreadNodeStartLoc', u'refNeedsArrowPos', u'_isArray', u'innerEndLoc', u'startLoc', u'first']) + var.put(u'startPos', (var.get(u'startPos') or var.get(u"this").get(u'state').get(u'start'))) + var.put(u'startLoc', (var.get(u'startLoc') or var.get(u"this").get(u'state').get(u'startLoc'))) + var.put(u'val', PyJsComma(Js(0.0), Js(None))) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + var.put(u'innerStartPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'innerStartLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'exprList', Js([])) + var.put(u'first', var.get(u'true')) + PyJs_Object_3051_ = Js({u'start':Js(0.0)}) + var.put(u'refShorthandDefaultPos', PyJs_Object_3051_) + var.put(u'spreadStart', PyJsComma(Js(0.0), Js(None))) + var.put(u'optionalCommaStart', PyJsComma(Js(0.0), Js(None))) + PyJs_Object_3052_ = Js({u'start':Js(0.0)}) + var.put(u'refNeedsArrowPos', PyJs_Object_3052_) + while var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenR')).neg(): + if var.get(u'first'): + var.put(u'first', Js(False)) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma'), (var.get(u'refNeedsArrowPos').get(u'start') or var.get(u"null"))) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenR')): + var.put(u'optionalCommaStart', var.get(u"this").get(u'state').get(u'start')) + break + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'ellipsis')): + var.put(u'spreadNodeStartPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'spreadNodeStartLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'spreadStart', var.get(u"this").get(u'state').get(u'start')) + var.get(u'exprList').callprop(u'push', var.get(u"this").callprop(u'parseParenItem', var.get(u"this").callprop(u'parseRest'), var.get(u'spreadNodeStartLoc'), var.get(u'spreadNodeStartPos'))) + break + else: + var.get(u'exprList').callprop(u'push', var.get(u"this").callprop(u'parseMaybeAssign', Js(False), var.get(u'refShorthandDefaultPos'), var.get(u"this").get(u'parseParenItem'), var.get(u'refNeedsArrowPos'))) + var.put(u'innerEndPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'innerEndLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + var.put(u'arrowNode', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + if ((var.get(u'canBeArrow') and var.get(u"this").callprop(u'shouldParseArrow')) and var.put(u'arrowNode', var.get(u"this").callprop(u'parseArrow', var.get(u'arrowNode')))): + #for JS loop + var.put(u'_iterator', var.get(u'exprList')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else var.get(u'_iterator').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'param', var.get(u'_ref')) + if (var.get(u'param').get(u'extra') and var.get(u'param').get(u'extra').get(u'parenthesized')): + var.get(u"this").callprop(u'unexpected', var.get(u'param').get(u'extra').get(u'parenStart')) + + return var.get(u"this").callprop(u'parseArrowExpression', var.get(u'arrowNode'), var.get(u'exprList')) + if var.get(u'exprList').get(u'length').neg(): + var.get(u"this").callprop(u'unexpected', var.get(u"this").get(u'state').get(u'lastTokStart')) + if var.get(u'optionalCommaStart'): + var.get(u"this").callprop(u'unexpected', var.get(u'optionalCommaStart')) + if var.get(u'spreadStart'): + var.get(u"this").callprop(u'unexpected', var.get(u'spreadStart')) + if var.get(u'refShorthandDefaultPos').get(u'start'): + var.get(u"this").callprop(u'unexpected', var.get(u'refShorthandDefaultPos').get(u'start')) + if var.get(u'refNeedsArrowPos').get(u'start'): + var.get(u"this").callprop(u'unexpected', var.get(u'refNeedsArrowPos').get(u'start')) + if (var.get(u'exprList').get(u'length')>Js(1.0)): + var.put(u'val', var.get(u"this").callprop(u'startNodeAt', var.get(u'innerStartPos'), var.get(u'innerStartLoc'))) + var.get(u'val').put(u'expressions', var.get(u'exprList')) + var.get(u"this").callprop(u'toReferencedList', var.get(u'val').get(u'expressions')) + var.get(u"this").callprop(u'finishNodeAt', var.get(u'val'), Js(u'SequenceExpression'), var.get(u'innerEndPos'), var.get(u'innerEndLoc')) + else: + var.put(u'val', var.get(u'exprList').get(u'0')) + var.get(u"this").callprop(u'addExtra', var.get(u'val'), Js(u'parenthesized'), var.get(u'true')) + var.get(u"this").callprop(u'addExtra', var.get(u'val'), Js(u'parenStart'), var.get(u'startPos')) + return var.get(u'val') + PyJs_anonymous_3050_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseParenAndDistinguishExpression', PyJs_anonymous_3050_) + @Js + def PyJs_anonymous_3053_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'canInsertSemicolon').neg() + PyJs_anonymous_3053_._set_name(u'anonymous') + var.get(u'pp$3').put(u'shouldParseArrow', PyJs_anonymous_3053_) + @Js + def PyJs_anonymous_3054_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'arrow')): + return var.get(u'node') + PyJs_anonymous_3054_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseArrow', PyJs_anonymous_3054_) + @Js + def PyJs_anonymous_3055_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return var.get(u'node') + PyJs_anonymous_3055_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseParenItem', PyJs_anonymous_3055_) + @Js + def PyJs_anonymous_3056_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'meta']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'meta', var.get(u"this").callprop(u'parseIdentifier', var.get(u'true'))) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'dot')): + return var.get(u"this").callprop(u'parseMetaProperty', var.get(u'node'), var.get(u'meta'), Js(u'target')) + var.get(u'node').put(u'callee', var.get(u"this").callprop(u'parseNoCallExpr')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'parenL')): + var.get(u'node').put(u'arguments', var.get(u"this").callprop(u'parseExprList', var.get(u'types').get(u'parenR'))) + var.get(u"this").callprop(u'toReferencedList', var.get(u'node').get(u'arguments')) + else: + var.get(u'node').put(u'arguments', Js([])) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'NewExpression')) + PyJs_anonymous_3056_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseNew', PyJs_anonymous_3056_) + @Js + def PyJs_anonymous_3057_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'elem']) + var.put(u'elem', var.get(u"this").callprop(u'startNode')) + PyJs_Object_3058_ = Js({u'raw':var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'start'), var.get(u"this").get(u'state').get(u'end')).callprop(u'replace', JsRegExp(u'/\\r\\n?/g'), Js(u'\n')),u'cooked':var.get(u"this").get(u'state').get(u'value')}) + var.get(u'elem').put(u'value', PyJs_Object_3058_) + var.get(u"this").callprop(u'next') + var.get(u'elem').put(u'tail', var.get(u"this").callprop(u'match', var.get(u'types').get(u'backQuote'))) + return var.get(u"this").callprop(u'finishNode', var.get(u'elem'), Js(u'TemplateElement')) + PyJs_anonymous_3057_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseTemplateElement', PyJs_anonymous_3057_) + @Js + def PyJs_anonymous_3059_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'curElt']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'expressions', Js([])) + var.put(u'curElt', var.get(u"this").callprop(u'parseTemplateElement')) + var.get(u'node').put(u'quasis', Js([var.get(u'curElt')])) + while var.get(u'curElt').get(u'tail').neg(): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'dollarBraceL')) + var.get(u'node').get(u'expressions').callprop(u'push', var.get(u"this").callprop(u'parseExpression')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceR')) + var.get(u'node').get(u'quasis').callprop(u'push', var.put(u'curElt', var.get(u"this").callprop(u'parseTemplateElement'))) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TemplateLiteral')) + PyJs_anonymous_3059_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseTemplate', PyJs_anonymous_3059_) + @Js + def PyJs_anonymous_3060_(isPattern, refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'refShorthandDefaultPos':refShorthandDefaultPos, u'isPattern':isPattern}, var) + var.registers([u'node', u'firstRestLocation', u'isGenerator', u'prop', u'isAsync', u'asyncId', u'refShorthandDefaultPos', u'startLoc', u'propHash', u'position', u'startPos', u'isPattern', u'decorators', u'first']) + var.put(u'decorators', Js([])) + var.put(u'propHash', var.get(u'Object').callprop(u'create', var.get(u"null"))) + var.put(u'first', var.get(u'true')) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'properties', Js([])) + var.get(u"this").callprop(u'next') + var.put(u'firstRestLocation', var.get(u"null")) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')).neg(): + if var.get(u'first'): + var.put(u'first', Js(False)) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')): + break + while var.get(u"this").callprop(u'match', var.get(u'types').get(u'at')): + var.get(u'decorators').callprop(u'push', var.get(u"this").callprop(u'parseDecorator')) + var.put(u'prop', var.get(u"this").callprop(u'startNode')) + var.put(u'isGenerator', Js(False)) + var.put(u'isAsync', Js(False)) + var.put(u'startPos', PyJsComma(Js(0.0), Js(None))) + var.put(u'startLoc', PyJsComma(Js(0.0), Js(None))) + if var.get(u'decorators').get(u'length'): + var.get(u'prop').put(u'decorators', var.get(u'decorators')) + var.put(u'decorators', Js([])) + if (var.get(u"this").callprop(u'hasPlugin', Js(u'objectRestSpread')) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'ellipsis'))): + var.put(u'prop', var.get(u"this").callprop(u'parseSpread')) + var.get(u'prop').put(u'type', (Js(u'RestProperty') if var.get(u'isPattern') else Js(u'SpreadProperty'))) + var.get(u'node').get(u'properties').callprop(u'push', var.get(u'prop')) + if var.get(u'isPattern'): + var.put(u'position', var.get(u"this").get(u'state').get(u'start')) + if PyJsStrictNeq(var.get(u'firstRestLocation'),var.get(u"null")): + var.get(u"this").callprop(u'unexpected', var.get(u'firstRestLocation'), Js(u'Cannot have multiple rest elements when destructuring')) + else: + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')): + break + else: + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'comma')) and PyJsStrictEq(var.get(u"this").callprop(u'lookahead').get(u'type'),var.get(u'types').get(u'braceR'))): + continue + else: + var.put(u'firstRestLocation', var.get(u'position')) + continue + else: + continue + var.get(u'prop').put(u'method', Js(False)) + var.get(u'prop').put(u'shorthand', Js(False)) + if (var.get(u'isPattern') or var.get(u'refShorthandDefaultPos')): + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + if var.get(u'isPattern').neg(): + var.put(u'isGenerator', var.get(u"this").callprop(u'eat', var.get(u'types').get(u'star'))) + if (var.get(u'isPattern').neg() and var.get(u"this").callprop(u'isContextual', Js(u'async'))): + if var.get(u'isGenerator'): + var.get(u"this").callprop(u'unexpected') + var.put(u'asyncId', var.get(u"this").callprop(u'parseIdentifier')) + if ((((var.get(u"this").callprop(u'match', var.get(u'types').get(u'colon')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL'))) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceR'))) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'eq'))) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'comma'))): + var.get(u'prop').put(u'key', var.get(u'asyncId')) + else: + var.put(u'isAsync', var.get(u'true')) + if var.get(u"this").callprop(u'hasPlugin', Js(u'asyncGenerators')): + var.put(u'isGenerator', var.get(u"this").callprop(u'eat', var.get(u'types').get(u'star'))) + var.get(u"this").callprop(u'parsePropertyName', var.get(u'prop')) + else: + var.get(u"this").callprop(u'parsePropertyName', var.get(u'prop')) + var.get(u"this").callprop(u'parseObjPropValue', var.get(u'prop'), var.get(u'startPos'), var.get(u'startLoc'), var.get(u'isGenerator'), var.get(u'isAsync'), var.get(u'isPattern'), var.get(u'refShorthandDefaultPos')) + var.get(u"this").callprop(u'checkPropClash', var.get(u'prop'), var.get(u'propHash')) + if var.get(u'prop').get(u'shorthand'): + var.get(u"this").callprop(u'addExtra', var.get(u'prop'), Js(u'shorthand'), var.get(u'true')) + var.get(u'node').get(u'properties').callprop(u'push', var.get(u'prop')) + if PyJsStrictNeq(var.get(u'firstRestLocation'),var.get(u"null")): + var.get(u"this").callprop(u'unexpected', var.get(u'firstRestLocation'), Js(u'The rest element has to be the last element when destructuring')) + if var.get(u'decorators').get(u'length'): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'You have trailing decorators with no property')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), (Js(u'ObjectPattern') if var.get(u'isPattern') else Js(u'ObjectExpression'))) + PyJs_anonymous_3060_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseObj', PyJs_anonymous_3060_) + @Js + def PyJs_anonymous_3061_(prop, startPos, startLoc, isGenerator, isAsync, isPattern, refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'isGenerator':isGenerator, u'prop':prop, u'isAsync':isAsync, u'refShorthandDefaultPos':refShorthandDefaultPos, u'startLoc':startLoc, u'startPos':startPos, u'isPattern':isPattern}, var) + var.registers([u'isGenerator', u'prop', u'start', u'paramCount', u'illegalBinding', u'refShorthandDefaultPos', u'startLoc', u'isAsync', u'startPos', u'isPattern']) + if ((var.get(u'isAsync') or var.get(u'isGenerator')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL'))): + if var.get(u'isPattern'): + var.get(u"this").callprop(u'unexpected') + var.get(u'prop').put(u'kind', Js(u'method')) + var.get(u'prop').put(u'method', var.get(u'true')) + var.get(u"this").callprop(u'parseMethod', var.get(u'prop'), var.get(u'isGenerator'), var.get(u'isAsync')) + return var.get(u"this").callprop(u'finishNode', var.get(u'prop'), Js(u'ObjectMethod')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'colon')): + var.get(u'prop').put(u'value', (var.get(u"this").callprop(u'parseMaybeDefault', var.get(u"this").get(u'state').get(u'start'), var.get(u"this").get(u'state').get(u'startLoc')) if var.get(u'isPattern') else var.get(u"this").callprop(u'parseMaybeAssign', Js(False), var.get(u'refShorthandDefaultPos')))) + return var.get(u"this").callprop(u'finishNode', var.get(u'prop'), Js(u'ObjectProperty')) + def PyJs_LONG_3062_(var=var): + return (((((var.get(u'isPattern').neg() and var.get(u'prop').get(u'computed').neg()) and PyJsStrictEq(var.get(u'prop').get(u'key').get(u'type'),Js(u'Identifier'))) and (PyJsStrictEq(var.get(u'prop').get(u'key').get(u'name'),Js(u'get')) or PyJsStrictEq(var.get(u'prop').get(u'key').get(u'name'),Js(u'set')))) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'comma')).neg()) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceR')).neg()) + if PyJs_LONG_3062_(): + if (var.get(u'isGenerator') or var.get(u'isAsync')): + var.get(u"this").callprop(u'unexpected') + var.get(u'prop').put(u'kind', var.get(u'prop').get(u'key').get(u'name')) + var.get(u"this").callprop(u'parsePropertyName', var.get(u'prop')) + var.get(u"this").callprop(u'parseMethod', var.get(u'prop'), Js(False)) + var.put(u'paramCount', (Js(0.0) if PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'get')) else Js(1.0))) + if PyJsStrictNeq(var.get(u'prop').get(u'params').get(u'length'),var.get(u'paramCount')): + var.put(u'start', var.get(u'prop').get(u'start')) + if PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'get')): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'getter should have no params')) + else: + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'setter should have exactly one param')) + return var.get(u"this").callprop(u'finishNode', var.get(u'prop'), Js(u'ObjectMethod')) + if (var.get(u'prop').get(u'computed').neg() and PyJsStrictEq(var.get(u'prop').get(u'key').get(u'type'),Js(u'Identifier'))): + if var.get(u'isPattern'): + var.put(u'illegalBinding', var.get(u"this").callprop(u'isKeyword', var.get(u'prop').get(u'key').get(u'name'))) + if (var.get(u'illegalBinding').neg() and var.get(u"this").get(u'state').get(u'strict')): + var.put(u'illegalBinding', (var.get(u'reservedWords').callprop(u'strictBind', var.get(u'prop').get(u'key').get(u'name')) or var.get(u'reservedWords').callprop(u'strict', var.get(u'prop').get(u'key').get(u'name')))) + if var.get(u'illegalBinding'): + var.get(u"this").callprop(u'raise', var.get(u'prop').get(u'key').get(u'start'), (Js(u'Binding ')+var.get(u'prop').get(u'key').get(u'name'))) + var.get(u'prop').put(u'value', var.get(u"this").callprop(u'parseMaybeDefault', var.get(u'startPos'), var.get(u'startLoc'), var.get(u'prop').get(u'key').callprop(u'__clone'))) + else: + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'eq')) and var.get(u'refShorthandDefaultPos')): + if var.get(u'refShorthandDefaultPos').get(u'start').neg(): + var.get(u'refShorthandDefaultPos').put(u'start', var.get(u"this").get(u'state').get(u'start')) + var.get(u'prop').put(u'value', var.get(u"this").callprop(u'parseMaybeDefault', var.get(u'startPos'), var.get(u'startLoc'), var.get(u'prop').get(u'key').callprop(u'__clone'))) + else: + var.get(u'prop').put(u'value', var.get(u'prop').get(u'key').callprop(u'__clone')) + var.get(u'prop').put(u'shorthand', var.get(u'true')) + return var.get(u"this").callprop(u'finishNode', var.get(u'prop'), Js(u'ObjectProperty')) + var.get(u"this").callprop(u'unexpected') + PyJs_anonymous_3061_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseObjPropValue', PyJs_anonymous_3061_) + @Js + def PyJs_anonymous_3063_(prop, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'prop']) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'bracketL')): + var.get(u'prop').put(u'computed', var.get(u'true')) + var.get(u'prop').put(u'key', var.get(u"this").callprop(u'parseMaybeAssign')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'bracketR')) + return var.get(u'prop').get(u'key') + else: + var.get(u'prop').put(u'computed', Js(False)) + return var.get(u'prop').put(u'key', (var.get(u"this").callprop(u'parseExprAtom') if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'num')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'string'))) else var.get(u"this").callprop(u'parseIdentifier', var.get(u'true')))) + PyJs_anonymous_3063_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parsePropertyName', PyJs_anonymous_3063_) + @Js + def PyJs_anonymous_3064_(node, isAsync, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'isAsync':isAsync, u'arguments':arguments}, var) + var.registers([u'node', u'isAsync']) + var.get(u'node').put(u'id', var.get(u"null")) + var.get(u'node').put(u'generator', Js(False)) + var.get(u'node').put(u'expression', Js(False)) + var.get(u'node').put(u'async', var.get(u'isAsync').neg().neg()) + PyJs_anonymous_3064_._set_name(u'anonymous') + var.get(u'pp$3').put(u'initFunction', PyJs_anonymous_3064_) + @Js + def PyJs_anonymous_3065_(node, isGenerator, isAsync, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'isAsync':isAsync, u'isGenerator':isGenerator, u'arguments':arguments}, var) + var.registers([u'node', u'oldInMethod', u'isAsync', u'isGenerator']) + var.put(u'oldInMethod', var.get(u"this").get(u'state').get(u'inMethod')) + var.get(u"this").get(u'state').put(u'inMethod', (var.get(u'node').get(u'kind') or var.get(u'true'))) + var.get(u"this").callprop(u'initFunction', var.get(u'node'), var.get(u'isAsync')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + var.get(u'node').put(u'params', var.get(u"this").callprop(u'parseBindingList', var.get(u'types').get(u'parenR'))) + var.get(u'node').put(u'generator', var.get(u'isGenerator')) + var.get(u"this").callprop(u'parseFunctionBody', var.get(u'node')) + var.get(u"this").get(u'state').put(u'inMethod', var.get(u'oldInMethod')) + return var.get(u'node') + PyJs_anonymous_3065_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseMethod', PyJs_anonymous_3065_) + @Js + def PyJs_anonymous_3066_(node, params, isAsync, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'isAsync':isAsync, u'params':params, u'arguments':arguments}, var) + var.registers([u'node', u'isAsync', u'params']) + var.get(u"this").callprop(u'initFunction', var.get(u'node'), var.get(u'isAsync')) + var.get(u'node').put(u'params', var.get(u"this").callprop(u'toAssignableList', var.get(u'params'), var.get(u'true'), Js(u'arrow function parameters'))) + var.get(u"this").callprop(u'parseFunctionBody', var.get(u'node'), var.get(u'true')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ArrowFunctionExpression')) + PyJs_anonymous_3066_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseArrowExpression', PyJs_anonymous_3066_) + @Js + def PyJs_anonymous_3067_(node, allowExpression, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'allowExpression':allowExpression, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray3', u'_isArray2', u'directive', u'oldLabels', u'checkLVal', u'oldInAsync', u'allowExpression', u'isStrict', u'_i3', u'_i2', u'param', u'_ref2', u'oldInFunc', u'isExpression', u'oldStrict', u'nameHash', u'oldInGen', u'_ref3', u'_iterator3', u'_iterator2']) + var.put(u'isExpression', (var.get(u'allowExpression') and var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceL')).neg())) + var.put(u'oldInAsync', var.get(u"this").get(u'state').get(u'inAsync')) + var.get(u"this").get(u'state').put(u'inAsync', var.get(u'node').get(u'async')) + if var.get(u'isExpression'): + var.get(u'node').put(u'body', var.get(u"this").callprop(u'parseMaybeAssign')) + var.get(u'node').put(u'expression', var.get(u'true')) + else: + var.put(u'oldInFunc', var.get(u"this").get(u'state').get(u'inFunction')) + var.put(u'oldInGen', var.get(u"this").get(u'state').get(u'inGenerator')) + var.put(u'oldLabels', var.get(u"this").get(u'state').get(u'labels')) + var.get(u"this").get(u'state').put(u'inFunction', var.get(u'true')) + var.get(u"this").get(u'state').put(u'inGenerator', var.get(u'node').get(u'generator')) + var.get(u"this").get(u'state').put(u'labels', Js([])) + var.get(u'node').put(u'body', var.get(u"this").callprop(u'parseBlock', var.get(u'true'))) + var.get(u'node').put(u'expression', Js(False)) + var.get(u"this").get(u'state').put(u'inFunction', var.get(u'oldInFunc')) + var.get(u"this").get(u'state').put(u'inGenerator', var.get(u'oldInGen')) + var.get(u"this").get(u'state').put(u'labels', var.get(u'oldLabels')) + var.get(u"this").get(u'state').put(u'inAsync', var.get(u'oldInAsync')) + var.put(u'checkLVal', var.get(u"this").get(u'state').get(u'strict')) + var.put(u'isStrict', Js(False)) + if var.get(u'allowExpression'): + var.put(u'checkLVal', var.get(u'true')) + if (var.get(u'isExpression').neg() and var.get(u'node').get(u'body').get(u'directives').get(u'length')): + #for JS loop + var.put(u'_iterator2', var.get(u'node').get(u'body').get(u'directives')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else var.get(u'_iterator2').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'directive', var.get(u'_ref2')) + if PyJsStrictEq(var.get(u'directive').get(u'value').get(u'value'),Js(u'use strict')): + var.put(u'isStrict', var.get(u'true')) + var.put(u'checkLVal', var.get(u'true')) + break + + if (((var.get(u'isStrict') and var.get(u'node').get(u'id')) and PyJsStrictEq(var.get(u'node').get(u'id').get(u'type'),Js(u'Identifier'))) and PyJsStrictEq(var.get(u'node').get(u'id').get(u'name'),Js(u'yield'))): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'id').get(u'start'), Js(u'Binding yield in strict mode')) + if var.get(u'checkLVal'): + var.put(u'nameHash', var.get(u'Object').callprop(u'create', var.get(u"null"))) + var.put(u'oldStrict', var.get(u"this").get(u'state').get(u'strict')) + if var.get(u'isStrict'): + var.get(u"this").get(u'state').put(u'strict', var.get(u'true')) + if var.get(u'node').get(u'id'): + var.get(u"this").callprop(u'checkLVal', var.get(u'node').get(u'id'), var.get(u'true'), var.get(u'undefined'), Js(u'function name')) + #for JS loop + var.put(u'_iterator3', var.get(u'node').get(u'params')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else var.get(u'_iterator3').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'param', var.get(u'_ref3')) + if (var.get(u'isStrict') and PyJsStrictNeq(var.get(u'param').get(u'type'),Js(u'Identifier'))): + var.get(u"this").callprop(u'raise', var.get(u'param').get(u'start'), Js(u'Non-simple parameter in strict mode')) + var.get(u"this").callprop(u'checkLVal', var.get(u'param'), var.get(u'true'), var.get(u'nameHash'), Js(u'function parameter list')) + + var.get(u"this").get(u'state').put(u'strict', var.get(u'oldStrict')) + PyJs_anonymous_3067_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseFunctionBody', PyJs_anonymous_3067_) + @Js + def PyJs_anonymous_3068_(close, allowEmpty, refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'close':close, u'allowEmpty':allowEmpty, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'elts', u'close', u'allowEmpty', u'refShorthandDefaultPos', u'first']) + var.put(u'elts', Js([])) + var.put(u'first', var.get(u'true')) + while var.get(u"this").callprop(u'eat', var.get(u'close')).neg(): + if var.get(u'first'): + var.put(u'first', Js(False)) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if var.get(u"this").callprop(u'eat', var.get(u'close')): + break + var.get(u'elts').callprop(u'push', var.get(u"this").callprop(u'parseExprListItem', var.get(u'allowEmpty'), var.get(u'refShorthandDefaultPos'))) + return var.get(u'elts') + PyJs_anonymous_3068_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseExprList', PyJs_anonymous_3068_) + @Js + def PyJs_anonymous_3069_(allowEmpty, refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'allowEmpty':allowEmpty, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'allowEmpty', u'refShorthandDefaultPos', u'elt']) + var.put(u'elt', PyJsComma(Js(0.0), Js(None))) + if (var.get(u'allowEmpty') and var.get(u"this").callprop(u'match', var.get(u'types').get(u'comma'))): + var.put(u'elt', var.get(u"null")) + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'ellipsis')): + var.put(u'elt', var.get(u"this").callprop(u'parseSpread', var.get(u'refShorthandDefaultPos'))) + else: + var.put(u'elt', var.get(u"this").callprop(u'parseMaybeAssign', Js(False), var.get(u'refShorthandDefaultPos'), var.get(u"this").get(u'parseParenItem'))) + return var.get(u'elt') + PyJs_anonymous_3069_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseExprListItem', PyJs_anonymous_3069_) + @Js + def PyJs_anonymous_3070_(liberal, this, arguments, var=var): + var = Scope({u'this':this, u'liberal':liberal, u'arguments':arguments}, var) + var.registers([u'node', u'liberal']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')): + if ((var.get(u'liberal').neg() and var.get(u"this").get(u'state').get(u'strict')) and var.get(u'reservedWords').callprop(u'strict', var.get(u"this").get(u'state').get(u'value'))): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), ((Js(u"The keyword '")+var.get(u"this").get(u'state').get(u'value'))+Js(u"' is reserved"))) + var.get(u'node').put(u'name', var.get(u"this").get(u'state').get(u'value')) + else: + if (var.get(u'liberal') and var.get(u"this").get(u'state').get(u'type').get(u'keyword')): + var.get(u'node').put(u'name', var.get(u"this").get(u'state').get(u'type').get(u'keyword')) + else: + var.get(u"this").callprop(u'unexpected') + if ((var.get(u'liberal').neg() and PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'await'))) and var.get(u"this").get(u'state').get(u'inAsync')): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), Js(u'invalid use of await inside of an async function')) + var.get(u'node').get(u'loc').put(u'identifierName', var.get(u'node').get(u'name')) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'Identifier')) + PyJs_anonymous_3070_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseIdentifier', PyJs_anonymous_3070_) + @Js + def PyJs_anonymous_3071_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").get(u'state').get(u'inAsync').neg(): + var.get(u"this").callprop(u'unexpected') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'star')): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), Js(u'await* has been removed from the async functions proposal. Use Promise.all() instead.')) + var.get(u'node').put(u'argument', var.get(u"this").callprop(u'parseMaybeUnary')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'AwaitExpression')) + PyJs_anonymous_3071_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseAwait', PyJs_anonymous_3071_) + @Js + def PyJs_anonymous_3072_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + if ((var.get(u"this").callprop(u'match', var.get(u'types').get(u'semi')) or var.get(u"this").callprop(u'canInsertSemicolon')) or (var.get(u"this").callprop(u'match', var.get(u'types').get(u'star')).neg() and var.get(u"this").get(u'state').get(u'type').get(u'startsExpr').neg())): + var.get(u'node').put(u'delegate', Js(False)) + var.get(u'node').put(u'argument', var.get(u"null")) + else: + var.get(u'node').put(u'delegate', var.get(u"this").callprop(u'eat', var.get(u'types').get(u'star'))) + var.get(u'node').put(u'argument', var.get(u"this").callprop(u'parseMaybeAssign')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'YieldExpression')) + PyJs_anonymous_3072_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseYield', PyJs_anonymous_3072_) + pass + var.put(u'pp$4', var.get(u'Parser').get(u'prototype')) + var.put(u'commentKeys', Js([Js(u'leadingComments'), Js(u'trailingComments'), Js(u'innerComments')])) + @Js + def PyJs_anonymous_3073_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Node']) + @Js + def PyJsHoisted_Node_(pos, loc, filename, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'pos':pos, u'arguments':arguments, u'filename':filename}, var) + var.registers([u'loc', u'pos', u'filename']) + var.get(u'_classCallCheck$6')(var.get(u"this"), var.get(u'Node')) + var.get(u"this").put(u'type', Js(u'')) + var.get(u"this").put(u'start', var.get(u'pos')) + var.get(u"this").put(u'end', Js(0.0)) + var.get(u"this").put(u'loc', var.get(u'SourceLocation').create(var.get(u'loc'))) + if var.get(u'filename'): + var.get(u"this").get(u'loc').put(u'filename', var.get(u'filename')) + PyJsHoisted_Node_.func_name = u'Node' + var.put(u'Node', PyJsHoisted_Node_) + pass + @Js + def PyJs___clone_3074_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'__clone':PyJs___clone_3074_}, var) + var.registers([u'node2', u'key']) + var.put(u'node2', var.get(u'Node').create()) + for PyJsTemp in var.get(u"this"): + var.put(u'key', PyJsTemp) + if (var.get(u'commentKeys').callprop(u'indexOf', var.get(u'key'))<Js(0.0)): + var.get(u'node2').put(var.get(u'key'), var.get(u"this").get(var.get(u'key'))) + return var.get(u'node2') + PyJs___clone_3074_._set_name(u'__clone') + var.get(u'Node').get(u'prototype').put(u'__clone', PyJs___clone_3074_) + return var.get(u'Node') + PyJs_anonymous_3073_._set_name(u'anonymous') + var.put(u'Node', PyJs_anonymous_3073_()) + @Js + def PyJs_anonymous_3075_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'Node').create(var.get(u"this").get(u'state').get(u'start'), var.get(u"this").get(u'state').get(u'startLoc'), var.get(u"this").get(u'filename')) + PyJs_anonymous_3075_._set_name(u'anonymous') + var.get(u'pp$4').put(u'startNode', PyJs_anonymous_3075_) + @Js + def PyJs_anonymous_3076_(pos, loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'pos':pos, u'arguments':arguments}, var) + var.registers([u'loc', u'pos']) + return var.get(u'Node').create(var.get(u'pos'), var.get(u'loc'), var.get(u"this").get(u'filename')) + PyJs_anonymous_3076_._set_name(u'anonymous') + var.get(u'pp$4').put(u'startNodeAt', PyJs_anonymous_3076_) + pass + @Js + def PyJs_anonymous_3077_(node, type, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'type':type, u'arguments':arguments}, var) + var.registers([u'node', u'type']) + return var.get(u'finishNodeAt').callprop(u'call', var.get(u"this"), var.get(u'node'), var.get(u'type'), var.get(u"this").get(u'state').get(u'lastTokEnd'), var.get(u"this").get(u'state').get(u'lastTokEndLoc')) + PyJs_anonymous_3077_._set_name(u'anonymous') + var.get(u'pp$4').put(u'finishNode', PyJs_anonymous_3077_) + @Js + def PyJs_anonymous_3078_(node, type, pos, loc, this, arguments, var=var): + var = Scope({u'node':node, u'loc':loc, u'arguments':arguments, u'this':this, u'type':type, u'pos':pos}, var) + var.registers([u'node', u'loc', u'type', u'pos']) + return var.get(u'finishNodeAt').callprop(u'call', var.get(u"this"), var.get(u'node'), var.get(u'type'), var.get(u'pos'), var.get(u'loc')) + PyJs_anonymous_3078_._set_name(u'anonymous') + var.get(u'pp$4').put(u'finishNodeAt', PyJs_anonymous_3078_) + var.put(u'pp$5', var.get(u'Parser').get(u'prototype')) + @Js + def PyJs_anonymous_3079_(pos, message, this, arguments, var=var): + var = Scope({u'this':this, u'message':message, u'pos':pos, u'arguments':arguments}, var) + var.registers([u'loc', u'message', u'pos', u'err']) + var.put(u'loc', var.get(u'getLineInfo')(var.get(u"this").get(u'input'), var.get(u'pos'))) + var.put(u'message', ((((Js(u' (')+var.get(u'loc').get(u'line'))+Js(u':'))+var.get(u'loc').get(u'column'))+Js(u')')), u'+') + var.put(u'err', var.get(u'SyntaxError').create(var.get(u'message'))) + var.get(u'err').put(u'pos', var.get(u'pos')) + var.get(u'err').put(u'loc', var.get(u'loc')) + PyJsTempException = JsToPyException(var.get(u'err')) + raise PyJsTempException + PyJs_anonymous_3079_._set_name(u'anonymous') + var.get(u'pp$5').put(u'raise', PyJs_anonymous_3079_) + pass + var.put(u'pp$6', var.get(u'Parser').get(u'prototype')) + @Js + def PyJs_anonymous_3080_(comment, this, arguments, var=var): + var = Scope({u'comment':comment, u'this':this, u'arguments':arguments}, var) + var.registers([u'comment']) + if var.get(u"this").get(u'filename'): + var.get(u'comment').get(u'loc').put(u'filename', var.get(u"this").get(u'filename')) + var.get(u"this").get(u'state').get(u'trailingComments').callprop(u'push', var.get(u'comment')) + var.get(u"this").get(u'state').get(u'leadingComments').callprop(u'push', var.get(u'comment')) + PyJs_anonymous_3080_._set_name(u'anonymous') + var.get(u'pp$6').put(u'addComment', PyJs_anonymous_3080_) + @Js + def PyJs_anonymous_3081_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'i', u'trailingComments', u'j', u'lastInStack', u'lastChild', u'stack']) + if (PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'Program')) and (var.get(u'node').get(u'body').get(u'length')>Js(0.0))): + return var.get('undefined') + var.put(u'stack', var.get(u"this").get(u'state').get(u'commentStack')) + var.put(u'lastChild', PyJsComma(Js(0.0), Js(None))) + var.put(u'trailingComments', PyJsComma(Js(0.0), Js(None))) + var.put(u'i', PyJsComma(Js(0.0), Js(None))) + var.put(u'j', PyJsComma(Js(0.0), Js(None))) + if (var.get(u"this").get(u'state').get(u'trailingComments').get(u'length')>Js(0.0)): + if (var.get(u"this").get(u'state').get(u'trailingComments').get(u'0').get(u'start')>=var.get(u'node').get(u'end')): + var.put(u'trailingComments', var.get(u"this").get(u'state').get(u'trailingComments')) + var.get(u"this").get(u'state').put(u'trailingComments', Js([])) + else: + var.get(u"this").get(u'state').get(u'trailingComments').put(u'length', Js(0.0)) + else: + var.put(u'lastInStack', var.get(u'last')(var.get(u'stack'))) + if (((var.get(u'stack').get(u'length')>Js(0.0)) and var.get(u'lastInStack').get(u'trailingComments')) and (var.get(u'lastInStack').get(u'trailingComments').get(u'0').get(u'start')>=var.get(u'node').get(u'end'))): + var.put(u'trailingComments', var.get(u'lastInStack').get(u'trailingComments')) + var.get(u'lastInStack').put(u'trailingComments', var.get(u"null")) + while ((var.get(u'stack').get(u'length')>Js(0.0)) and (var.get(u'last')(var.get(u'stack')).get(u'start')>=var.get(u'node').get(u'start'))): + var.put(u'lastChild', var.get(u'stack').callprop(u'pop')) + if var.get(u'lastChild'): + if var.get(u'lastChild').get(u'leadingComments'): + if (PyJsStrictNeq(var.get(u'lastChild'),var.get(u'node')) and (var.get(u'last')(var.get(u'lastChild').get(u'leadingComments')).get(u'end')<=var.get(u'node').get(u'start'))): + var.get(u'node').put(u'leadingComments', var.get(u'lastChild').get(u'leadingComments')) + var.get(u'lastChild').put(u'leadingComments', var.get(u"null")) + else: + #for JS loop + var.put(u'i', (var.get(u'lastChild').get(u'leadingComments').get(u'length')-Js(2.0))) + while (var.get(u'i')>=Js(0.0)): + try: + if (var.get(u'lastChild').get(u'leadingComments').get(var.get(u'i')).get(u'end')<=var.get(u'node').get(u'start')): + var.get(u'node').put(u'leadingComments', var.get(u'lastChild').get(u'leadingComments').callprop(u'splice', Js(0.0), (var.get(u'i')+Js(1.0)))) + break + finally: + var.put(u'i',Js(var.get(u'i').to_number())-Js(1)) + else: + if (var.get(u"this").get(u'state').get(u'leadingComments').get(u'length')>Js(0.0)): + if (var.get(u'last')(var.get(u"this").get(u'state').get(u'leadingComments')).get(u'end')<=var.get(u'node').get(u'start')): + if var.get(u"this").get(u'state').get(u'commentPreviousNode'): + #for JS loop + var.put(u'j', Js(0.0)) + while (var.get(u'j')<var.get(u"this").get(u'state').get(u'leadingComments').get(u'length')): + try: + if (var.get(u"this").get(u'state').get(u'leadingComments').get(var.get(u'j')).get(u'end')<var.get(u"this").get(u'state').get(u'commentPreviousNode').get(u'end')): + var.get(u"this").get(u'state').get(u'leadingComments').callprop(u'splice', var.get(u'j'), Js(1.0)) + (var.put(u'j',Js(var.get(u'j').to_number())-Js(1))+Js(1)) + finally: + (var.put(u'j',Js(var.get(u'j').to_number())+Js(1))-Js(1)) + if (var.get(u"this").get(u'state').get(u'leadingComments').get(u'length')>Js(0.0)): + var.get(u'node').put(u'leadingComments', var.get(u"this").get(u'state').get(u'leadingComments')) + var.get(u"this").get(u'state').put(u'leadingComments', Js([])) + else: + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u"this").get(u'state').get(u'leadingComments').get(u'length')): + try: + if (var.get(u"this").get(u'state').get(u'leadingComments').get(var.get(u'i')).get(u'end')>var.get(u'node').get(u'start')): + break + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.get(u'node').put(u'leadingComments', var.get(u"this").get(u'state').get(u'leadingComments').callprop(u'slice', Js(0.0), var.get(u'i'))) + if PyJsStrictEq(var.get(u'node').get(u'leadingComments').get(u'length'),Js(0.0)): + var.get(u'node').put(u'leadingComments', var.get(u"null")) + var.put(u'trailingComments', var.get(u"this").get(u'state').get(u'leadingComments').callprop(u'slice', var.get(u'i'))) + if PyJsStrictEq(var.get(u'trailingComments').get(u'length'),Js(0.0)): + var.put(u'trailingComments', var.get(u"null")) + var.get(u"this").get(u'state').put(u'commentPreviousNode', var.get(u'node')) + if var.get(u'trailingComments'): + if ((var.get(u'trailingComments').get(u'length') and (var.get(u'trailingComments').get(u'0').get(u'start')>=var.get(u'node').get(u'start'))) and (var.get(u'last')(var.get(u'trailingComments')).get(u'end')<=var.get(u'node').get(u'end'))): + var.get(u'node').put(u'innerComments', var.get(u'trailingComments')) + else: + var.get(u'node').put(u'trailingComments', var.get(u'trailingComments')) + var.get(u'stack').callprop(u'push', var.get(u'node')) + PyJs_anonymous_3081_._set_name(u'anonymous') + var.get(u'pp$6').put(u'processComment', PyJs_anonymous_3081_) + var.put(u'pp$7', var.get(u'Parser').get(u'prototype')) + @Js + def PyJs_anonymous_3082_(tok, allowLeadingPipeOrAnd, this, arguments, var=var): + var = Scope({u'this':this, u'tok':tok, u'arguments':arguments, u'allowLeadingPipeOrAnd':allowLeadingPipeOrAnd}, var) + var.registers([u'tok', u'oldInType', u'type', u'allowLeadingPipeOrAnd']) + var.put(u'oldInType', var.get(u"this").get(u'state').get(u'inType')) + var.get(u"this").get(u'state').put(u'inType', var.get(u'true')) + var.get(u"this").callprop(u'expect', (var.get(u'tok') or var.get(u'types').get(u'colon'))) + if var.get(u'allowLeadingPipeOrAnd'): + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'bitwiseAND')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'bitwiseOR'))): + var.get(u"this").callprop(u'next') + var.put(u'type', var.get(u"this").callprop(u'flowParseType')) + var.get(u"this").get(u'state').put(u'inType', var.get(u'oldInType')) + return var.get(u'type') + PyJs_anonymous_3082_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTypeInitialiser', PyJs_anonymous_3082_) + @Js + def PyJs_anonymous_3083_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'flowParseInterfaceish', var.get(u'node'), var.get(u'true')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DeclareClass')) + PyJs_anonymous_3083_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclareClass', PyJs_anonymous_3083_) + @Js + def PyJs_anonymous_3084_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'typeContainer', u'tmp', u'typeNode', u'id', u'node']) + var.get(u"this").callprop(u'next') + var.put(u'id', var.get(u'node').put(u'id', var.get(u"this").callprop(u'parseIdentifier'))) + var.put(u'typeNode', var.get(u"this").callprop(u'startNode')) + var.put(u'typeContainer', var.get(u"this").callprop(u'startNode')) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'typeNode').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterDeclaration')) + else: + var.get(u'typeNode').put(u'typeParameters', var.get(u"null")) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + var.put(u'tmp', var.get(u"this").callprop(u'flowParseFunctionTypeParams')) + var.get(u'typeNode').put(u'params', var.get(u'tmp').get(u'params')) + var.get(u'typeNode').put(u'rest', var.get(u'tmp').get(u'rest')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + var.get(u'typeNode').put(u'returnType', var.get(u"this").callprop(u'flowParseTypeInitialiser')) + var.get(u'typeContainer').put(u'typeAnnotation', var.get(u"this").callprop(u'finishNode', var.get(u'typeNode'), Js(u'FunctionTypeAnnotation'))) + var.get(u'id').put(u'typeAnnotation', var.get(u"this").callprop(u'finishNode', var.get(u'typeContainer'), Js(u'TypeAnnotation'))) + var.get(u"this").callprop(u'finishNode', var.get(u'id'), var.get(u'id').get(u'type')) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DeclareFunction')) + PyJs_anonymous_3084_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclareFunction', PyJs_anonymous_3084_) + @Js + def PyJs_anonymous_3085_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_class')): + return var.get(u"this").callprop(u'flowParseDeclareClass', var.get(u'node')) + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_function')): + return var.get(u"this").callprop(u'flowParseDeclareFunction', var.get(u'node')) + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_var')): + return var.get(u"this").callprop(u'flowParseDeclareVariable', var.get(u'node')) + else: + if var.get(u"this").callprop(u'isContextual', Js(u'module')): + if PyJsStrictEq(var.get(u"this").callprop(u'lookahead').get(u'type'),var.get(u'types').get(u'dot')): + return var.get(u"this").callprop(u'flowParseDeclareModuleExports', var.get(u'node')) + else: + return var.get(u"this").callprop(u'flowParseDeclareModule', var.get(u'node')) + else: + if var.get(u"this").callprop(u'isContextual', Js(u'type')): + return var.get(u"this").callprop(u'flowParseDeclareTypeAlias', var.get(u'node')) + else: + if var.get(u"this").callprop(u'isContextual', Js(u'interface')): + return var.get(u"this").callprop(u'flowParseDeclareInterface', var.get(u'node')) + else: + var.get(u"this").callprop(u'unexpected') + PyJs_anonymous_3085_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclare', PyJs_anonymous_3085_) + @Js + def PyJs_anonymous_3086_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'id', var.get(u"this").callprop(u'flowParseTypeAnnotatableIdentifier')) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DeclareVariable')) + PyJs_anonymous_3086_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclareVariable', PyJs_anonymous_3086_) + @Js + def PyJs_anonymous_3087_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'bodyNode', u'body', u'node2', u'node']) + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'string')): + var.get(u'node').put(u'id', var.get(u"this").callprop(u'parseExprAtom')) + else: + var.get(u'node').put(u'id', var.get(u"this").callprop(u'parseIdentifier')) + var.put(u'bodyNode', var.get(u'node').put(u'body', var.get(u"this").callprop(u'startNode'))) + var.put(u'body', var.get(u'bodyNode').put(u'body', Js([]))) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceL')) + while var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceR')).neg(): + var.put(u'node2', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'expectContextual', Js(u'declare'), Js(u'Unexpected token. Only declares are allowed inside declare module')) + var.get(u'body').callprop(u'push', var.get(u"this").callprop(u'flowParseDeclare', var.get(u'node2'))) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceR')) + var.get(u"this").callprop(u'finishNode', var.get(u'bodyNode'), Js(u'BlockStatement')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DeclareModule')) + PyJs_anonymous_3087_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclareModule', PyJs_anonymous_3087_) + @Js + def PyJs_anonymous_3088_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'expectContextual', Js(u'module')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'dot')) + var.get(u"this").callprop(u'expectContextual', Js(u'exports')) + var.get(u'node').put(u'typeAnnotation', var.get(u"this").callprop(u'flowParseTypeAnnotation')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DeclareModuleExports')) + PyJs_anonymous_3088_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclareModuleExports', PyJs_anonymous_3088_) + @Js + def PyJs_anonymous_3089_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'flowParseTypeAlias', var.get(u'node')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DeclareTypeAlias')) + PyJs_anonymous_3089_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclareTypeAlias', PyJs_anonymous_3089_) + @Js + def PyJs_anonymous_3090_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'flowParseInterfaceish', var.get(u'node')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DeclareInterface')) + PyJs_anonymous_3090_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclareInterface', PyJs_anonymous_3090_) + @Js + def PyJs_anonymous_3091_(node, allowStatic, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'allowStatic':allowStatic}, var) + var.registers([u'node', u'allowStatic']) + var.get(u'node').put(u'id', var.get(u"this").callprop(u'parseIdentifier')) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'node').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterDeclaration')) + else: + var.get(u'node').put(u'typeParameters', var.get(u"null")) + var.get(u'node').put(u'extends', Js([])) + var.get(u'node').put(u'mixins', Js([])) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'_extends')): + while 1: + var.get(u'node').get(u'extends').callprop(u'push', var.get(u"this").callprop(u'flowParseInterfaceExtends')) + if not var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')): + break + if var.get(u"this").callprop(u'isContextual', Js(u'mixins')): + var.get(u"this").callprop(u'next') + while 1: + var.get(u'node').get(u'mixins').callprop(u'push', var.get(u"this").callprop(u'flowParseInterfaceExtends')) + if not var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')): + break + var.get(u'node').put(u'body', var.get(u"this").callprop(u'flowParseObjectType', var.get(u'allowStatic'))) + PyJs_anonymous_3091_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseInterfaceish', PyJs_anonymous_3091_) + @Js + def PyJs_anonymous_3092_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'id', var.get(u"this").callprop(u'flowParseQualifiedTypeIdentifier')) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'node').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterInstantiation')) + else: + var.get(u'node').put(u'typeParameters', var.get(u"null")) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'InterfaceExtends')) + PyJs_anonymous_3092_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseInterfaceExtends', PyJs_anonymous_3092_) + @Js + def PyJs_anonymous_3093_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'flowParseInterfaceish', var.get(u'node'), Js(False)) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'InterfaceDeclaration')) + PyJs_anonymous_3093_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseInterface', PyJs_anonymous_3093_) + @Js + def PyJs_anonymous_3094_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'node').put(u'id', var.get(u"this").callprop(u'parseIdentifier')) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'node').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterDeclaration')) + else: + var.get(u'node').put(u'typeParameters', var.get(u"null")) + var.get(u'node').put(u'right', var.get(u"this").callprop(u'flowParseTypeInitialiser', var.get(u'types').get(u'eq'), var.get(u'true'))) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TypeAlias')) + PyJs_anonymous_3094_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTypeAlias', PyJs_anonymous_3094_) + @Js + def PyJs_anonymous_3095_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'variance', u'ident']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'variance', var.get(u"this").callprop(u'flowParseVariance')) + var.put(u'ident', var.get(u"this").callprop(u'flowParseTypeAnnotatableIdentifier')) + var.get(u'node').put(u'name', var.get(u'ident').get(u'name')) + var.get(u'node').put(u'variance', var.get(u'variance')) + var.get(u'node').put(u'bound', var.get(u'ident').get(u'typeAnnotation')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'eq')): + var.get(u"this").callprop(u'eat', var.get(u'types').get(u'eq')) + var.get(u'node').put(u'default', var.get(u"this").callprop(u'flowParseType')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TypeParameter')) + PyJs_anonymous_3095_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTypeParameter', PyJs_anonymous_3095_) + @Js + def PyJs_anonymous_3096_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'oldInType']) + var.put(u'oldInType', var.get(u"this").get(u'state').get(u'inType')) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'params', Js([])) + var.get(u"this").get(u'state').put(u'inType', var.get(u'true')) + if (var.get(u"this").callprop(u'isRelational', Js(u'<')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'jsxTagStart'))): + var.get(u"this").callprop(u'next') + else: + var.get(u"this").callprop(u'unexpected') + while 1: + var.get(u'node').get(u'params').callprop(u'push', var.get(u"this").callprop(u'flowParseTypeParameter')) + if var.get(u"this").callprop(u'isRelational', Js(u'>')).neg(): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if not var.get(u"this").callprop(u'isRelational', Js(u'>')).neg(): + break + var.get(u"this").callprop(u'expectRelational', Js(u'>')) + var.get(u"this").get(u'state').put(u'inType', var.get(u'oldInType')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TypeParameterDeclaration')) + PyJs_anonymous_3096_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTypeParameterDeclaration', PyJs_anonymous_3096_) + @Js + def PyJs_anonymous_3097_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'oldInType']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'oldInType', var.get(u"this").get(u'state').get(u'inType')) + var.get(u'node').put(u'params', Js([])) + var.get(u"this").get(u'state').put(u'inType', var.get(u'true')) + var.get(u"this").callprop(u'expectRelational', Js(u'<')) + while var.get(u"this").callprop(u'isRelational', Js(u'>')).neg(): + var.get(u'node').get(u'params').callprop(u'push', var.get(u"this").callprop(u'flowParseType')) + if var.get(u"this").callprop(u'isRelational', Js(u'>')).neg(): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + var.get(u"this").callprop(u'expectRelational', Js(u'>')) + var.get(u"this").get(u'state').put(u'inType', var.get(u'oldInType')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TypeParameterInstantiation')) + PyJs_anonymous_3097_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTypeParameterInstantiation', PyJs_anonymous_3097_) + @Js + def PyJs_anonymous_3098_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return (var.get(u"this").callprop(u'parseExprAtom') if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'num')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'string'))) else var.get(u"this").callprop(u'parseIdentifier', var.get(u'true'))) + PyJs_anonymous_3098_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseObjectPropertyKey', PyJs_anonymous_3098_) + @Js + def PyJs_anonymous_3099_(node, isStatic, variance, this, arguments, var=var): + var = Scope({u'node':node, u'variance':variance, u'isStatic':isStatic, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'variance', u'isStatic']) + var.get(u'node').put(u'static', var.get(u'isStatic')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'bracketL')) + var.get(u'node').put(u'id', var.get(u"this").callprop(u'flowParseObjectPropertyKey')) + var.get(u'node').put(u'key', var.get(u"this").callprop(u'flowParseTypeInitialiser')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'bracketR')) + var.get(u'node').put(u'value', var.get(u"this").callprop(u'flowParseTypeInitialiser')) + var.get(u'node').put(u'variance', var.get(u'variance')) + var.get(u"this").callprop(u'flowObjectTypeSemicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ObjectTypeIndexer')) + PyJs_anonymous_3099_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseObjectTypeIndexer', PyJs_anonymous_3099_) + @Js + def PyJs_anonymous_3100_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'node').put(u'params', Js([])) + var.get(u'node').put(u'rest', var.get(u"null")) + var.get(u'node').put(u'typeParameters', var.get(u"null")) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'node').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterDeclaration')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + while var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')): + var.get(u'node').get(u'params').callprop(u'push', var.get(u"this").callprop(u'flowParseFunctionTypeParam')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenR')).neg(): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'ellipsis')): + var.get(u'node').put(u'rest', var.get(u"this").callprop(u'flowParseFunctionTypeParam')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + var.get(u'node').put(u'returnType', var.get(u"this").callprop(u'flowParseTypeInitialiser')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'FunctionTypeAnnotation')) + PyJs_anonymous_3100_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseObjectTypeMethodish', PyJs_anonymous_3100_) + @Js + def PyJs_anonymous_3101_(startPos, startLoc, isStatic, key, this, arguments, var=var): + var = Scope({u'isStatic':isStatic, u'startLoc':startLoc, u'key':key, u'this':this, u'startPos':startPos, u'arguments':arguments}, var) + var.registers([u'node', u'key', u'startPos', u'isStatic', u'startLoc']) + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'value', var.get(u"this").callprop(u'flowParseObjectTypeMethodish', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc')))) + var.get(u'node').put(u'static', var.get(u'isStatic')) + var.get(u'node').put(u'key', var.get(u'key')) + var.get(u'node').put(u'optional', Js(False)) + var.get(u"this").callprop(u'flowObjectTypeSemicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ObjectTypeProperty')) + PyJs_anonymous_3101_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseObjectTypeMethod', PyJs_anonymous_3101_) + @Js + def PyJs_anonymous_3102_(node, isStatic, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'isStatic':isStatic, u'arguments':arguments}, var) + var.registers([u'node', u'valueNode', u'isStatic']) + var.put(u'valueNode', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'static', var.get(u'isStatic')) + var.get(u'node').put(u'value', var.get(u"this").callprop(u'flowParseObjectTypeMethodish', var.get(u'valueNode'))) + var.get(u"this").callprop(u'flowObjectTypeSemicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ObjectTypeCallProperty')) + PyJs_anonymous_3102_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseObjectTypeCallProperty', PyJs_anonymous_3102_) + @Js + def PyJs_anonymous_3103_(allowStatic, allowExact, this, arguments, var=var): + var = Scope({u'this':this, u'allowExact':allowExact, u'arguments':arguments, u'allowStatic':allowStatic}, var) + var.registers([u'node', u'isStatic', u'nodeStart', u'variancePos', u'propertyKey', u'endDelim', u'oldInType', u'optional', u'startLoc', u'variance', u'startPos', u'exact', u'allowExact', u'allowStatic', u'out']) + var.put(u'oldInType', var.get(u"this").get(u'state').get(u'inType')) + var.get(u"this").get(u'state').put(u'inType', var.get(u'true')) + var.put(u'nodeStart', var.get(u"this").callprop(u'startNode')) + var.put(u'node', PyJsComma(Js(0.0), Js(None))) + var.put(u'propertyKey', PyJsComma(Js(0.0), Js(None))) + var.put(u'isStatic', Js(False)) + var.get(u'nodeStart').put(u'callProperties', Js([])) + var.get(u'nodeStart').put(u'properties', Js([])) + var.get(u'nodeStart').put(u'indexers', Js([])) + var.put(u'endDelim', PyJsComma(Js(0.0), Js(None))) + var.put(u'exact', PyJsComma(Js(0.0), Js(None))) + if (var.get(u'allowExact') and var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceBarL'))): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceBarL')) + var.put(u'endDelim', var.get(u'types').get(u'braceBarR')) + var.put(u'exact', var.get(u'true')) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceL')) + var.put(u'endDelim', var.get(u'types').get(u'braceR')) + var.put(u'exact', Js(False)) + var.get(u'nodeStart').put(u'exact', var.get(u'exact')) + while var.get(u"this").callprop(u'match', var.get(u'endDelim')).neg(): + var.put(u'optional', Js(False)) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + if ((var.get(u'allowStatic') and var.get(u"this").callprop(u'isContextual', Js(u'static'))) and PyJsStrictNeq(var.get(u"this").callprop(u'lookahead').get(u'type'),var.get(u'types').get(u'colon'))): + var.get(u"this").callprop(u'next') + var.put(u'isStatic', var.get(u'true')) + var.put(u'variancePos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'variance', var.get(u"this").callprop(u'flowParseVariance')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'bracketL')): + var.get(u'nodeStart').get(u'indexers').callprop(u'push', var.get(u"this").callprop(u'flowParseObjectTypeIndexer', var.get(u'node'), var.get(u'isStatic'), var.get(u'variance'))) + else: + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')) or var.get(u"this").callprop(u'isRelational', Js(u'<'))): + if var.get(u'variance'): + var.get(u"this").callprop(u'unexpected', var.get(u'variancePos')) + var.get(u'nodeStart').get(u'callProperties').callprop(u'push', var.get(u"this").callprop(u'flowParseObjectTypeCallProperty', var.get(u'node'), var.get(u'allowStatic'))) + else: + var.put(u'propertyKey', var.get(u"this").callprop(u'flowParseObjectPropertyKey')) + if (var.get(u"this").callprop(u'isRelational', Js(u'<')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL'))): + if var.get(u'variance'): + var.get(u"this").callprop(u'unexpected', var.get(u'variancePos')) + var.get(u'nodeStart').get(u'properties').callprop(u'push', var.get(u"this").callprop(u'flowParseObjectTypeMethod', var.get(u'startPos'), var.get(u'startLoc'), var.get(u'isStatic'), var.get(u'propertyKey'))) + else: + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'question')): + var.put(u'optional', var.get(u'true')) + var.get(u'node').put(u'key', var.get(u'propertyKey')) + var.get(u'node').put(u'value', var.get(u"this").callprop(u'flowParseTypeInitialiser')) + var.get(u'node').put(u'optional', var.get(u'optional')) + var.get(u'node').put(u'static', var.get(u'isStatic')) + var.get(u'node').put(u'variance', var.get(u'variance')) + var.get(u"this").callprop(u'flowObjectTypeSemicolon') + var.get(u'nodeStart').get(u'properties').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ObjectTypeProperty'))) + var.put(u'isStatic', Js(False)) + var.get(u"this").callprop(u'expect', var.get(u'endDelim')) + var.put(u'out', var.get(u"this").callprop(u'finishNode', var.get(u'nodeStart'), Js(u'ObjectTypeAnnotation'))) + var.get(u"this").get(u'state').put(u'inType', var.get(u'oldInType')) + return var.get(u'out') + PyJs_anonymous_3103_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseObjectType', PyJs_anonymous_3103_) + @Js + def PyJs_anonymous_3104_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if (((var.get(u"this").callprop(u'eat', var.get(u'types').get(u'semi')).neg() and var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')).neg()) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceR')).neg()) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceBarR')).neg()): + var.get(u"this").callprop(u'unexpected') + PyJs_anonymous_3104_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowObjectTypeSemicolon', PyJs_anonymous_3104_) + @Js + def PyJs_anonymous_3105_(startPos, startLoc, id, this, arguments, var=var): + var = Scope({u'this':this, u'startPos':startPos, u'id':id, u'startLoc':startLoc, u'arguments':arguments}, var) + var.registers([u'node', u'startPos', u'node2', u'id', u'startLoc']) + var.put(u'startPos', (var.get(u'startPos') or var.get(u"this").get(u'state').get(u'start'))) + var.put(u'startLoc', (var.get(u'startLoc') or var.get(u"this").get(u'state').get(u'startLoc'))) + var.put(u'node', (var.get(u'id') or var.get(u"this").callprop(u'parseIdentifier'))) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'dot')): + var.put(u'node2', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node2').put(u'qualification', var.get(u'node')) + var.get(u'node2').put(u'id', var.get(u"this").callprop(u'parseIdentifier')) + var.put(u'node', var.get(u"this").callprop(u'finishNode', var.get(u'node2'), Js(u'QualifiedTypeIdentifier'))) + return var.get(u'node') + PyJs_anonymous_3105_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseQualifiedTypeIdentifier', PyJs_anonymous_3105_) + @Js + def PyJs_anonymous_3106_(startPos, startLoc, id, this, arguments, var=var): + var = Scope({u'this':this, u'startPos':startPos, u'id':id, u'startLoc':startLoc, u'arguments':arguments}, var) + var.registers([u'node', u'startPos', u'id', u'startLoc']) + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'typeParameters', var.get(u"null")) + var.get(u'node').put(u'id', var.get(u"this").callprop(u'flowParseQualifiedTypeIdentifier', var.get(u'startPos'), var.get(u'startLoc'), var.get(u'id'))) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'node').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterInstantiation')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'GenericTypeAnnotation')) + PyJs_anonymous_3106_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseGenericType', PyJs_anonymous_3106_) + @Js + def PyJs_anonymous_3107_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'_typeof')) + var.get(u'node').put(u'argument', var.get(u"this").callprop(u'flowParsePrimaryType')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TypeofTypeAnnotation')) + PyJs_anonymous_3107_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTypeofType', PyJs_anonymous_3107_) + @Js + def PyJs_anonymous_3108_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'types', Js([])) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'bracketL')) + while ((var.get(u"this").get(u'state').get(u'pos')<var.get(u"this").get(u'input').get(u'length')) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'bracketR')).neg()): + var.get(u'node').get(u'types').callprop(u'push', var.get(u"this").callprop(u'flowParseType')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'bracketR')): + break + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'bracketR')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TupleTypeAnnotation')) + PyJs_anonymous_3108_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTupleType', PyJs_anonymous_3108_) + @Js + def PyJs_anonymous_3109_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'optional']) + var.put(u'optional', Js(False)) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'name', var.get(u"this").callprop(u'parseIdentifier')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'question')): + var.put(u'optional', var.get(u'true')) + var.get(u'node').put(u'optional', var.get(u'optional')) + var.get(u'node').put(u'typeAnnotation', var.get(u"this").callprop(u'flowParseTypeInitialiser')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'FunctionTypeParam')) + PyJs_anonymous_3109_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseFunctionTypeParam', PyJs_anonymous_3109_) + @Js + def PyJs_anonymous_3110_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'ret']) + PyJs_Object_3111_ = Js({u'params':Js([]),u'rest':var.get(u"null")}) + var.put(u'ret', PyJs_Object_3111_) + while var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')): + var.get(u'ret').get(u'params').callprop(u'push', var.get(u"this").callprop(u'flowParseFunctionTypeParam')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenR')).neg(): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'ellipsis')): + var.get(u'ret').put(u'rest', var.get(u"this").callprop(u'flowParseFunctionTypeParam')) + return var.get(u'ret') + PyJs_anonymous_3110_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseFunctionTypeParams', PyJs_anonymous_3110_) + @Js + def PyJs_anonymous_3112_(startPos, startLoc, node, id, this, arguments, var=var): + var = Scope({u'node':node, u'arguments':arguments, u'startLoc':startLoc, u'this':this, u'startPos':startPos, u'id':id}, var) + var.registers([u'node', u'startPos', u'id', u'startLoc']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'id').get(u'name')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'any')): + SWITCHED = True + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'AnyTypeAnnotation')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'void')): + SWITCHED = True + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'VoidTypeAnnotation')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'bool')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'boolean')): + SWITCHED = True + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'BooleanTypeAnnotation')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'mixed')): + SWITCHED = True + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'MixedTypeAnnotation')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'empty')): + SWITCHED = True + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'EmptyTypeAnnotation')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'number')): + SWITCHED = True + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'NumberTypeAnnotation')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'string')): + SWITCHED = True + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'StringTypeAnnotation')) + if True: + SWITCHED = True + return var.get(u"this").callprop(u'flowParseGenericType', var.get(u'startPos'), var.get(u'startLoc'), var.get(u'id')) + SWITCHED = True + break + PyJs_anonymous_3112_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowIdentToTypeAnnotation', PyJs_anonymous_3112_) + @Js + def PyJs_anonymous_3113_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'tmp', u'token', u'isGroupedType', u'startLoc', u'startPos', u'type']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'tmp', PyJsComma(Js(0.0), Js(None))) + var.put(u'type', PyJsComma(Js(0.0), Js(None))) + var.put(u'isGroupedType', Js(False)) + while 1: + SWITCHED = False + CONDITION = (var.get(u"this").get(u'state').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'name')): + SWITCHED = True + return var.get(u"this").callprop(u'flowIdentToTypeAnnotation', var.get(u'startPos'), var.get(u'startLoc'), var.get(u'node'), var.get(u"this").callprop(u'parseIdentifier')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'braceL')): + SWITCHED = True + return var.get(u"this").callprop(u'flowParseObjectType', Js(False), Js(False)) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'braceBarL')): + SWITCHED = True + return var.get(u"this").callprop(u'flowParseObjectType', Js(False), var.get(u'true')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'bracketL')): + SWITCHED = True + return var.get(u"this").callprop(u'flowParseTupleType') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'relational')): + SWITCHED = True + if PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'<')): + var.get(u'node').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterDeclaration')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + var.put(u'tmp', var.get(u"this").callprop(u'flowParseFunctionTypeParams')) + var.get(u'node').put(u'params', var.get(u'tmp').get(u'params')) + var.get(u'node').put(u'rest', var.get(u'tmp').get(u'rest')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'arrow')) + var.get(u'node').put(u'returnType', var.get(u"this").callprop(u'flowParseType')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'FunctionTypeAnnotation')) + break + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'parenL')): + SWITCHED = True + var.get(u"this").callprop(u'next') + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenR')).neg() and var.get(u"this").callprop(u'match', var.get(u'types').get(u'ellipsis')).neg()): + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')): + var.put(u'token', var.get(u"this").callprop(u'lookahead').get(u'type')) + var.put(u'isGroupedType', (PyJsStrictNeq(var.get(u'token'),var.get(u'types').get(u'question')) and PyJsStrictNeq(var.get(u'token'),var.get(u'types').get(u'colon')))) + else: + var.put(u'isGroupedType', var.get(u'true')) + if var.get(u'isGroupedType'): + var.put(u'type', var.get(u"this").callprop(u'flowParseType')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + return var.get(u'type') + var.put(u'tmp', var.get(u"this").callprop(u'flowParseFunctionTypeParams')) + var.get(u'node').put(u'params', var.get(u'tmp').get(u'params')) + var.get(u'node').put(u'rest', var.get(u'tmp').get(u'rest')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'arrow')) + var.get(u'node').put(u'returnType', var.get(u"this").callprop(u'flowParseType')) + var.get(u'node').put(u'typeParameters', var.get(u"null")) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'FunctionTypeAnnotation')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'string')): + SWITCHED = True + var.get(u'node').put(u'value', var.get(u"this").get(u'state').get(u'value')) + var.get(u"this").callprop(u'addExtra', var.get(u'node'), Js(u'rawValue'), var.get(u'node').get(u'value')) + var.get(u"this").callprop(u'addExtra', var.get(u'node'), Js(u'raw'), var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'start'), var.get(u"this").get(u'state').get(u'end'))) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'StringLiteralTypeAnnotation')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_true')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_false')): + SWITCHED = True + var.get(u'node').put(u'value', var.get(u"this").callprop(u'match', var.get(u'types').get(u'_true'))) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'BooleanLiteralTypeAnnotation')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'plusMin')): + SWITCHED = True + if PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'-')): + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'num')).neg(): + var.get(u"this").callprop(u'unexpected') + var.get(u'node').put(u'value', (-var.get(u"this").get(u'state').get(u'value'))) + var.get(u"this").callprop(u'addExtra', var.get(u'node'), Js(u'rawValue'), var.get(u'node').get(u'value')) + var.get(u"this").callprop(u'addExtra', var.get(u'node'), Js(u'raw'), var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'start'), var.get(u"this").get(u'state').get(u'end'))) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'NumericLiteralTypeAnnotation')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'num')): + SWITCHED = True + var.get(u'node').put(u'value', var.get(u"this").get(u'state').get(u'value')) + var.get(u"this").callprop(u'addExtra', var.get(u'node'), Js(u'rawValue'), var.get(u'node').get(u'value')) + var.get(u"this").callprop(u'addExtra', var.get(u'node'), Js(u'raw'), var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'start'), var.get(u"this").get(u'state').get(u'end'))) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'NumericLiteralTypeAnnotation')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_null')): + SWITCHED = True + var.get(u'node').put(u'value', var.get(u"this").callprop(u'match', var.get(u'types').get(u'_null'))) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'NullLiteralTypeAnnotation')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_this')): + SWITCHED = True + var.get(u'node').put(u'value', var.get(u"this").callprop(u'match', var.get(u'types').get(u'_this'))) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ThisTypeAnnotation')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'star')): + SWITCHED = True + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ExistentialTypeParam')) + if True: + SWITCHED = True + if PyJsStrictEq(var.get(u"this").get(u'state').get(u'type').get(u'keyword'),Js(u'typeof')): + return var.get(u"this").callprop(u'flowParseTypeofType') + SWITCHED = True + break + var.get(u"this").callprop(u'unexpected') + PyJs_anonymous_3113_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParsePrimaryType', PyJs_anonymous_3113_) + @Js + def PyJs_anonymous_3114_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'type']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'type', var.get(u'node').put(u'elementType', var.get(u"this").callprop(u'flowParsePrimaryType'))) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'bracketL')): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'bracketL')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'bracketR')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ArrayTypeAnnotation')) + else: + return var.get(u'type') + PyJs_anonymous_3114_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParsePostfixType', PyJs_anonymous_3114_) + @Js + def PyJs_anonymous_3115_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'question')): + var.get(u'node').put(u'typeAnnotation', var.get(u"this").callprop(u'flowParsePrefixType')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'NullableTypeAnnotation')) + else: + return var.get(u"this").callprop(u'flowParsePostfixType') + PyJs_anonymous_3115_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParsePrefixType', PyJs_anonymous_3115_) + @Js + def PyJs_anonymous_3116_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'type']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'type', var.get(u"this").callprop(u'flowParsePrefixType')) + var.get(u'node').put(u'types', Js([var.get(u'type')])) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'bitwiseAND')): + var.get(u'node').get(u'types').callprop(u'push', var.get(u"this").callprop(u'flowParsePrefixType')) + return (var.get(u'type') if PyJsStrictEq(var.get(u'node').get(u'types').get(u'length'),Js(1.0)) else var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'IntersectionTypeAnnotation'))) + PyJs_anonymous_3116_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseIntersectionType', PyJs_anonymous_3116_) + @Js + def PyJs_anonymous_3117_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'type']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'type', var.get(u"this").callprop(u'flowParseIntersectionType')) + var.get(u'node').put(u'types', Js([var.get(u'type')])) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'bitwiseOR')): + var.get(u'node').get(u'types').callprop(u'push', var.get(u"this").callprop(u'flowParseIntersectionType')) + return (var.get(u'type') if PyJsStrictEq(var.get(u'node').get(u'types').get(u'length'),Js(1.0)) else var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'UnionTypeAnnotation'))) + PyJs_anonymous_3117_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseUnionType', PyJs_anonymous_3117_) + @Js + def PyJs_anonymous_3118_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'oldInType', u'type']) + var.put(u'oldInType', var.get(u"this").get(u'state').get(u'inType')) + var.get(u"this").get(u'state').put(u'inType', var.get(u'true')) + var.put(u'type', var.get(u"this").callprop(u'flowParseUnionType')) + var.get(u"this").get(u'state').put(u'inType', var.get(u'oldInType')) + return var.get(u'type') + PyJs_anonymous_3118_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseType', PyJs_anonymous_3118_) + @Js + def PyJs_anonymous_3119_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'typeAnnotation', var.get(u"this").callprop(u'flowParseTypeInitialiser')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TypeAnnotation')) + PyJs_anonymous_3119_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTypeAnnotation', PyJs_anonymous_3119_) + @Js + def PyJs_anonymous_3120_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'ident']) + var.put(u'ident', var.get(u"this").callprop(u'parseIdentifier')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'colon')): + var.get(u'ident').put(u'typeAnnotation', var.get(u"this").callprop(u'flowParseTypeAnnotation')) + var.get(u"this").callprop(u'finishNode', var.get(u'ident'), var.get(u'ident').get(u'type')) + return var.get(u'ident') + PyJs_anonymous_3120_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTypeAnnotatableIdentifier', PyJs_anonymous_3120_) + @Js + def PyJs_anonymous_3121_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'node').get(u'expression').put(u'typeAnnotation', var.get(u'node').get(u'typeAnnotation')) + return var.get(u"this").callprop(u'finishNodeAt', var.get(u'node').get(u'expression'), var.get(u'node').get(u'expression').get(u'type'), var.get(u'node').get(u'typeAnnotation').get(u'end'), var.get(u'node').get(u'typeAnnotation').get(u'loc').get(u'end')) + PyJs_anonymous_3121_._set_name(u'anonymous') + var.get(u'pp$7').put(u'typeCastToParameter', PyJs_anonymous_3121_) + @Js + def PyJs_anonymous_3122_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'variance']) + var.put(u'variance', var.get(u"null")) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'plusMin')): + if PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'+')): + var.put(u'variance', Js(u'plus')) + else: + if PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'-')): + var.put(u'variance', Js(u'minus')) + var.get(u"this").callprop(u'next') + return var.get(u'variance') + PyJs_anonymous_3122_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseVariance', PyJs_anonymous_3122_) + @Js + def PyJs_anonymous_3123_(instance, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments}, var) + var.registers([u'instance']) + @Js + def PyJs_anonymous_3124_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3125_(node, allowExpression, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'allowExpression':allowExpression, u'arguments':arguments}, var) + var.registers([u'node', u'allowExpression']) + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'colon')) and var.get(u'allowExpression').neg()): + var.get(u'node').put(u'returnType', var.get(u"this").callprop(u'flowParseTypeAnnotation')) + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'node'), var.get(u'allowExpression')) + PyJs_anonymous_3125_._set_name(u'anonymous') + return PyJs_anonymous_3125_ + PyJs_anonymous_3124_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseFunctionBody'), PyJs_anonymous_3124_) + @Js + def PyJs_anonymous_3126_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3127_(declaration, topLevel, this, arguments, var=var): + var = Scope({u'this':this, u'topLevel':topLevel, u'arguments':arguments, u'declaration':declaration}, var) + var.registers([u'node', u'topLevel', u'declaration']) + if ((var.get(u"this").get(u'state').get(u'strict') and var.get(u"this").callprop(u'match', var.get(u'types').get(u'name'))) and PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'interface'))): + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'flowParseInterface', var.get(u'node')) + else: + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'declaration'), var.get(u'topLevel')) + PyJs_anonymous_3127_._set_name(u'anonymous') + return PyJs_anonymous_3127_ + PyJs_anonymous_3126_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseStatement'), PyJs_anonymous_3126_) + @Js + def PyJs_anonymous_3128_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3129_(node, expr, this, arguments, var=var): + var = Scope({u'node':node, u'expr':expr, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'expr']) + if PyJsStrictEq(var.get(u'expr').get(u'type'),Js(u'Identifier')): + if PyJsStrictEq(var.get(u'expr').get(u'name'),Js(u'declare')): + if (((var.get(u"this").callprop(u'match', var.get(u'types').get(u'_class')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'name'))) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'_function'))) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'_var'))): + return var.get(u"this").callprop(u'flowParseDeclare', var.get(u'node')) + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')): + if PyJsStrictEq(var.get(u'expr').get(u'name'),Js(u'interface')): + return var.get(u"this").callprop(u'flowParseInterface', var.get(u'node')) + else: + if PyJsStrictEq(var.get(u'expr').get(u'name'),Js(u'type')): + return var.get(u"this").callprop(u'flowParseTypeAlias', var.get(u'node')) + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'node'), var.get(u'expr')) + PyJs_anonymous_3129_._set_name(u'anonymous') + return PyJs_anonymous_3129_ + PyJs_anonymous_3128_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseExpressionStatement'), PyJs_anonymous_3128_) + @Js + def PyJs_anonymous_3130_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3131_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return ((var.get(u"this").callprop(u'isContextual', Js(u'type')) or var.get(u"this").callprop(u'isContextual', Js(u'interface'))) or var.get(u'inner').callprop(u'call', var.get(u"this"))) + PyJs_anonymous_3131_._set_name(u'anonymous') + return PyJs_anonymous_3131_ + PyJs_anonymous_3130_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'shouldParseExportDeclaration'), PyJs_anonymous_3130_) + @Js + def PyJs_anonymous_3132_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3133_(expr, noIn, startPos, startLoc, refNeedsArrowPos, this, arguments, var=var): + var = Scope({u'this':this, u'refNeedsArrowPos':refNeedsArrowPos, u'startLoc':startLoc, u'noIn':noIn, u'expr':expr, u'startPos':startPos, u'arguments':arguments}, var) + var.registers([u'expr', u'state', u'refNeedsArrowPos', u'startLoc', u'noIn', u'startPos']) + if (var.get(u'refNeedsArrowPos') and var.get(u"this").callprop(u'match', var.get(u'types').get(u'question'))): + var.put(u'state', var.get(u"this").get(u'state').callprop(u'clone')) + try: + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'expr'), var.get(u'noIn'), var.get(u'startPos'), var.get(u'startLoc')) + except PyJsException as PyJsTempException: + PyJsHolder_657272_30891008 = var.own.get(u'err') + var.force_own_put(u'err', PyExceptionToJs(PyJsTempException)) + try: + if var.get(u'err').instanceof(var.get(u'SyntaxError')): + var.get(u"this").put(u'state', var.get(u'state')) + var.get(u'refNeedsArrowPos').put(u'start', (var.get(u'err').get(u'pos') or var.get(u"this").get(u'state').get(u'start'))) + return var.get(u'expr') + else: + PyJsTempException = JsToPyException(var.get(u'err')) + raise PyJsTempException + finally: + if PyJsHolder_657272_30891008 is not None: + var.own[u'err'] = PyJsHolder_657272_30891008 + else: + del var.own[u'err'] + del PyJsHolder_657272_30891008 + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'expr'), var.get(u'noIn'), var.get(u'startPos'), var.get(u'startLoc')) + PyJs_anonymous_3133_._set_name(u'anonymous') + return PyJs_anonymous_3133_ + PyJs_anonymous_3132_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseConditional'), PyJs_anonymous_3132_) + @Js + def PyJs_anonymous_3134_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3135_(node, startLoc, startPos, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'startPos':startPos, u'arguments':arguments, u'startLoc':startLoc}, var) + var.registers([u'node', u'typeCastNode', u'startPos', u'startLoc']) + var.put(u'node', var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'node'), var.get(u'startLoc'), var.get(u'startPos'))) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'question')): + var.get(u'node').put(u'optional', var.get(u'true')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'colon')): + var.put(u'typeCastNode', var.get(u"this").callprop(u'startNodeAt', var.get(u'startLoc'), var.get(u'startPos'))) + var.get(u'typeCastNode').put(u'expression', var.get(u'node')) + var.get(u'typeCastNode').put(u'typeAnnotation', var.get(u"this").callprop(u'flowParseTypeAnnotation')) + return var.get(u"this").callprop(u'finishNode', var.get(u'typeCastNode'), Js(u'TypeCastExpression')) + return var.get(u'node') + PyJs_anonymous_3135_._set_name(u'anonymous') + return PyJs_anonymous_3135_ + PyJs_anonymous_3134_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseParenItem'), PyJs_anonymous_3134_) + @Js + def PyJs_anonymous_3136_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3137_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'node'))) + if PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'ExportNamedDeclaration')): + var.get(u'node').put(u'exportKind', (var.get(u'node').get(u'exportKind') or Js(u'value'))) + return var.get(u'node') + PyJs_anonymous_3137_._set_name(u'anonymous') + return PyJs_anonymous_3137_ + PyJs_anonymous_3136_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseExport'), PyJs_anonymous_3136_) + @Js + def PyJs_anonymous_3138_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3139_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_declarationNode', u'declarationNode']) + if var.get(u"this").callprop(u'isContextual', Js(u'type')): + var.get(u'node').put(u'exportKind', Js(u'type')) + var.put(u'declarationNode', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceL')): + var.get(u'node').put(u'specifiers', var.get(u"this").callprop(u'parseExportSpecifiers')) + var.get(u"this").callprop(u'parseExportFrom', var.get(u'node')) + return var.get(u"null") + else: + return var.get(u"this").callprop(u'flowParseTypeAlias', var.get(u'declarationNode')) + else: + if var.get(u"this").callprop(u'isContextual', Js(u'interface')): + var.get(u'node').put(u'exportKind', Js(u'type')) + var.put(u'_declarationNode', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'flowParseInterface', var.get(u'_declarationNode')) + else: + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'node')) + PyJs_anonymous_3139_._set_name(u'anonymous') + return PyJs_anonymous_3139_ + PyJs_anonymous_3138_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseExportDeclaration'), PyJs_anonymous_3138_) + @Js + def PyJs_anonymous_3140_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3141_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'inner').callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'node').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterDeclaration')) + PyJs_anonymous_3141_._set_name(u'anonymous') + return PyJs_anonymous_3141_ + PyJs_anonymous_3140_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseClassId'), PyJs_anonymous_3140_) + @Js + def PyJs_anonymous_3142_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3143_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + if (var.get(u"this").get(u'state').get(u'inType') and PyJsStrictEq(var.get(u'name'),Js(u'void'))): + return Js(False) + else: + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'name')) + PyJs_anonymous_3143_._set_name(u'anonymous') + return PyJs_anonymous_3143_ + PyJs_anonymous_3142_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'isKeyword'), PyJs_anonymous_3142_) + @Js + def PyJs_anonymous_3144_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3145_(prop, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'oldInType', u'prop', u'out']) + var.put(u'oldInType', var.get(u"this").get(u'state').get(u'inType')) + var.get(u"this").get(u'state').put(u'inType', var.get(u'true')) + var.put(u'out', var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'prop'))) + var.get(u"this").get(u'state').put(u'inType', var.get(u'oldInType')) + return var.get(u'out') + PyJs_anonymous_3145_._set_name(u'anonymous') + return PyJs_anonymous_3145_ + PyJs_anonymous_3144_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parsePropertyName'), PyJs_anonymous_3144_) + @Js + def PyJs_anonymous_3146_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3147_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments}, var) + var.registers([u'code']) + if (var.get(u"this").get(u'state').get(u'inType') and (PyJsStrictEq(var.get(u'code'),Js(62.0)) or PyJsStrictEq(var.get(u'code'),Js(60.0)))): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'relational'), Js(1.0)) + else: + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'code')) + PyJs_anonymous_3147_._set_name(u'anonymous') + return PyJs_anonymous_3147_ + PyJs_anonymous_3146_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'readToken'), PyJs_anonymous_3146_) + @Js + def PyJs_anonymous_3148_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3149_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'state').get(u'inType').neg(): + return var.get(u'inner').callprop(u'call', var.get(u"this")) + PyJs_anonymous_3149_._set_name(u'anonymous') + return PyJs_anonymous_3149_ + PyJs_anonymous_3148_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'jsx_readToken'), PyJs_anonymous_3148_) + @Js + def PyJs_anonymous_3150_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3151_(node, isBinding, contextDescription, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'isBinding':isBinding, u'arguments':arguments, u'contextDescription':contextDescription}, var) + var.registers([u'node', u'isBinding', u'contextDescription']) + if PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'TypeCastExpression')): + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u"this").callprop(u'typeCastToParameter', var.get(u'node')), var.get(u'isBinding'), var.get(u'contextDescription')) + else: + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'node'), var.get(u'isBinding'), var.get(u'contextDescription')) + PyJs_anonymous_3151_._set_name(u'anonymous') + return PyJs_anonymous_3151_ + PyJs_anonymous_3150_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'toAssignable'), PyJs_anonymous_3150_) + @Js + def PyJs_anonymous_3152_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3153_(exprList, isBinding, contextDescription, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'isBinding':isBinding, u'exprList':exprList, u'contextDescription':contextDescription}, var) + var.registers([u'i', u'expr', u'isBinding', u'exprList', u'contextDescription']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'exprList').get(u'length')): + try: + var.put(u'expr', var.get(u'exprList').get(var.get(u'i'))) + if (var.get(u'expr') and PyJsStrictEq(var.get(u'expr').get(u'type'),Js(u'TypeCastExpression'))): + var.get(u'exprList').put(var.get(u'i'), var.get(u"this").callprop(u'typeCastToParameter', var.get(u'expr'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'exprList'), var.get(u'isBinding'), var.get(u'contextDescription')) + PyJs_anonymous_3153_._set_name(u'anonymous') + return PyJs_anonymous_3153_ + PyJs_anonymous_3152_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'toAssignableList'), PyJs_anonymous_3152_) + @Js + def PyJs_anonymous_3154_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_anonymous_3155_(exprList, this, arguments, var=var): + var = Scope({u'this':this, u'exprList':exprList, u'arguments':arguments}, var) + var.registers([u'i', u'expr', u'exprList']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'exprList').get(u'length')): + try: + var.put(u'expr', var.get(u'exprList').get(var.get(u'i'))) + if ((var.get(u'expr') and var.get(u'expr').get(u'_exprListItem')) and PyJsStrictEq(var.get(u'expr').get(u'type'),Js(u'TypeCastExpression'))): + var.get(u"this").callprop(u'raise', var.get(u'expr').get(u'start'), Js(u'Unexpected type cast')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'exprList') + PyJs_anonymous_3155_._set_name(u'anonymous') + return PyJs_anonymous_3155_ + PyJs_anonymous_3154_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'toReferencedList'), PyJs_anonymous_3154_) + @Js + def PyJs_anonymous_3156_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3157_(allowEmpty, refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'allowEmpty':allowEmpty, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'node', u'allowEmpty', u'container', u'refShorthandDefaultPos']) + var.put(u'container', var.get(u"this").callprop(u'startNode')) + var.put(u'node', var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'allowEmpty'), var.get(u'refShorthandDefaultPos'))) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'colon')): + var.get(u'container').put(u'_exprListItem', var.get(u'true')) + var.get(u'container').put(u'expression', var.get(u'node')) + var.get(u'container').put(u'typeAnnotation', var.get(u"this").callprop(u'flowParseTypeAnnotation')) + return var.get(u"this").callprop(u'finishNode', var.get(u'container'), Js(u'TypeCastExpression')) + else: + return var.get(u'node') + PyJs_anonymous_3157_._set_name(u'anonymous') + return PyJs_anonymous_3157_ + PyJs_anonymous_3156_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseExprListItem'), PyJs_anonymous_3156_) + @Js + def PyJs_anonymous_3158_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3159_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if PyJsStrictNeq(var.get(u'node').get(u'type'),Js(u'TypeCastExpression')): + return var.get(u'inner').callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + PyJs_anonymous_3159_._set_name(u'anonymous') + return PyJs_anonymous_3159_ + PyJs_anonymous_3158_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'checkLVal'), PyJs_anonymous_3158_) + @Js + def PyJs_anonymous_3160_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3161_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'node').delete(u'variancePos') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'colon')): + var.get(u'node').put(u'typeAnnotation', var.get(u"this").callprop(u'flowParseTypeAnnotation')) + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'node')) + PyJs_anonymous_3161_._set_name(u'anonymous') + return PyJs_anonymous_3161_ + PyJs_anonymous_3160_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseClassProperty'), PyJs_anonymous_3160_) + @Js + def PyJs_anonymous_3162_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3163_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return (var.get(u"this").callprop(u'match', var.get(u'types').get(u'colon')) or var.get(u'inner').callprop(u'call', var.get(u"this"))) + PyJs_anonymous_3163_._set_name(u'anonymous') + return PyJs_anonymous_3163_ + PyJs_anonymous_3162_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'isClassProperty'), PyJs_anonymous_3162_) + @Js + def PyJs_anonymous_3164_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_anonymous_3165_(classBody, method, isGenerator, isAsync, this, arguments, var=var): + var = Scope({u'isAsync':isAsync, u'classBody':classBody, u'this':this, u'isGenerator':isGenerator, u'method':method, u'arguments':arguments}, var) + var.registers([u'isAsync', u'isGenerator', u'classBody', u'method']) + if var.get(u'method').get(u'variance'): + var.get(u"this").callprop(u'unexpected', var.get(u'method').get(u'variancePos')) + var.get(u'method').delete(u'variance') + var.get(u'method').delete(u'variancePos') + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'method').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterDeclaration')) + var.get(u"this").callprop(u'parseMethod', var.get(u'method'), var.get(u'isGenerator'), var.get(u'isAsync')) + var.get(u'classBody').get(u'body').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'method'), Js(u'ClassMethod'))) + PyJs_anonymous_3165_._set_name(u'anonymous') + return PyJs_anonymous_3165_ + PyJs_anonymous_3164_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseClassMethod'), PyJs_anonymous_3164_) + @Js + def PyJs_anonymous_3166_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3167_(node, isStatement, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'isStatement':isStatement, u'arguments':arguments}, var) + var.registers([u'node', u'_node', u'implemented', u'isStatement']) + var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'node'), var.get(u'isStatement')) + if (var.get(u'node').get(u'superClass') and var.get(u"this").callprop(u'isRelational', Js(u'<'))): + var.get(u'node').put(u'superTypeParameters', var.get(u"this").callprop(u'flowParseTypeParameterInstantiation')) + if var.get(u"this").callprop(u'isContextual', Js(u'implements')): + var.get(u"this").callprop(u'next') + var.put(u'implemented', var.get(u'node').put(u'implements', Js([]))) + while 1: + var.put(u'_node', var.get(u"this").callprop(u'startNode')) + var.get(u'_node').put(u'id', var.get(u"this").callprop(u'parseIdentifier')) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'_node').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterInstantiation')) + else: + var.get(u'_node').put(u'typeParameters', var.get(u"null")) + var.get(u'implemented').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'_node'), Js(u'ClassImplements'))) + if not var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')): + break + PyJs_anonymous_3167_._set_name(u'anonymous') + return PyJs_anonymous_3167_ + PyJs_anonymous_3166_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseClassSuper'), PyJs_anonymous_3166_) + @Js + def PyJs_anonymous_3168_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3169_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'variance', u'variancePos', u'key']) + var.put(u'variancePos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'variance', var.get(u"this").callprop(u'flowParseVariance')) + var.put(u'key', var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'node'))) + var.get(u'node').put(u'variance', var.get(u'variance')) + var.get(u'node').put(u'variancePos', var.get(u'variancePos')) + return var.get(u'key') + PyJs_anonymous_3169_._set_name(u'anonymous') + return PyJs_anonymous_3169_ + PyJs_anonymous_3168_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parsePropertyName'), PyJs_anonymous_3168_) + @Js + def PyJs_anonymous_3170_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3171_(prop, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'typeParameters', u'prop']) + if var.get(u'prop').get(u'variance'): + var.get(u"this").callprop(u'unexpected', var.get(u'prop').get(u'variancePos')) + var.get(u'prop').delete(u'variance') + var.get(u'prop').delete(u'variancePos') + var.put(u'typeParameters', PyJsComma(Js(0.0), Js(None))) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterDeclaration')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')).neg(): + var.get(u"this").callprop(u'unexpected') + var.get(u'inner').callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + if var.get(u'typeParameters'): + (var.get(u'prop').get(u'value') or var.get(u'prop')).put(u'typeParameters', var.get(u'typeParameters')) + PyJs_anonymous_3171_._set_name(u'anonymous') + return PyJs_anonymous_3171_ + PyJs_anonymous_3170_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseObjPropValue'), PyJs_anonymous_3170_) + @Js + def PyJs_anonymous_3172_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_anonymous_3173_(param, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'param':param}, var) + var.registers([u'param']) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'question')): + var.get(u'param').put(u'optional', var.get(u'true')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'colon')): + var.get(u'param').put(u'typeAnnotation', var.get(u"this").callprop(u'flowParseTypeAnnotation')) + var.get(u"this").callprop(u'finishNode', var.get(u'param'), var.get(u'param').get(u'type')) + return var.get(u'param') + PyJs_anonymous_3173_._set_name(u'anonymous') + return PyJs_anonymous_3173_ + PyJs_anonymous_3172_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseAssignableListItemTypes'), PyJs_anonymous_3172_) + @Js + def PyJs_anonymous_3174_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3175_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_len', u'_key', u'args', u'node']) + #for JS loop + var.put(u'_len', var.get(u'arguments').get(u'length')) + var.put(u'args', var.get(u'Array')(var.get(u'_len'))) + var.put(u'_key', Js(0.0)) + while (var.get(u'_key')<var.get(u'_len')): + try: + var.get(u'args').put(var.get(u'_key'), var.get(u'arguments').get(var.get(u'_key'))) + finally: + (var.put(u'_key',Js(var.get(u'_key').to_number())+Js(1))-Js(1)) + var.put(u'node', var.get(u'inner').callprop(u'apply', var.get(u"this"), var.get(u'args'))) + if ((PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'AssignmentPattern')) and var.get(u'node').get(u'typeAnnotation')) and (var.get(u'node').get(u'right').get(u'start')<var.get(u'node').get(u'typeAnnotation').get(u'start'))): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'typeAnnotation').get(u'start'), Js(u'Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`')) + return var.get(u'node') + PyJs_anonymous_3175_._set_name(u'anonymous') + return PyJs_anonymous_3175_ + PyJs_anonymous_3174_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseMaybeDefault'), PyJs_anonymous_3174_) + @Js + def PyJs_anonymous_3176_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3177_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'kind', u'lh']) + var.get(u'node').put(u'importKind', Js(u'value')) + var.put(u'kind', var.get(u"null")) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_typeof')): + var.put(u'kind', Js(u'typeof')) + else: + if var.get(u"this").callprop(u'isContextual', Js(u'type')): + var.put(u'kind', Js(u'type')) + if var.get(u'kind'): + var.put(u'lh', var.get(u"this").callprop(u'lookahead')) + if (((PyJsStrictEq(var.get(u'lh').get(u'type'),var.get(u'types').get(u'name')) and PyJsStrictNeq(var.get(u'lh').get(u'value'),Js(u'from'))) or PyJsStrictEq(var.get(u'lh').get(u'type'),var.get(u'types').get(u'braceL'))) or PyJsStrictEq(var.get(u'lh').get(u'type'),var.get(u'types').get(u'star'))): + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'importKind', var.get(u'kind')) + var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'node')) + PyJs_anonymous_3177_._set_name(u'anonymous') + return PyJs_anonymous_3177_ + PyJs_anonymous_3176_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseImportSpecifiers'), PyJs_anonymous_3176_) + @Js + def PyJs_anonymous_3178_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3179_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'node').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterDeclaration')) + var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'node')) + PyJs_anonymous_3179_._set_name(u'anonymous') + return PyJs_anonymous_3179_ + PyJs_anonymous_3178_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseFunctionParams'), PyJs_anonymous_3178_) + @Js + def PyJs_anonymous_3180_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3181_(decl, this, arguments, var=var): + var = Scope({u'decl':decl, u'this':this, u'arguments':arguments}, var) + var.registers([u'decl']) + var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'decl')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'colon')): + var.get(u'decl').get(u'id').put(u'typeAnnotation', var.get(u"this").callprop(u'flowParseTypeAnnotation')) + var.get(u"this").callprop(u'finishNode', var.get(u'decl').get(u'id'), var.get(u'decl').get(u'id').get(u'type')) + PyJs_anonymous_3181_._set_name(u'anonymous') + return PyJs_anonymous_3181_ + PyJs_anonymous_3180_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseVarHead'), PyJs_anonymous_3180_) + @Js + def PyJs_anonymous_3182_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3183_(node, call, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'call':call, u'arguments':arguments}, var) + var.registers([u'node', u'call']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'colon')): + var.get(u'node').put(u'returnType', var.get(u"this").callprop(u'flowParseTypeAnnotation')) + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'node'), var.get(u'call')) + PyJs_anonymous_3183_._set_name(u'anonymous') + return PyJs_anonymous_3183_ + PyJs_anonymous_3182_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseAsyncArrowFromCallExpression'), PyJs_anonymous_3182_) + @Js + def PyJs_anonymous_3184_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3185_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return (var.get(u"this").callprop(u'match', var.get(u'types').get(u'colon')) or var.get(u'inner').callprop(u'call', var.get(u"this"))) + PyJs_anonymous_3185_._set_name(u'anonymous') + return PyJs_anonymous_3185_ + PyJs_anonymous_3184_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'shouldParseAsyncArrow'), PyJs_anonymous_3184_) + @Js + def PyJs_anonymous_3186_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3187_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'args', u'arrowExpression', u'jsxError', u'_key2', u'state', u'_len2', u'typeParameters']) + var.put(u'jsxError', var.get(u"null")) + #for JS loop + var.put(u'_len2', var.get(u'arguments').get(u'length')) + var.put(u'args', var.get(u'Array')(var.get(u'_len2'))) + var.put(u'_key2', Js(0.0)) + while (var.get(u'_key2')<var.get(u'_len2')): + try: + var.get(u'args').put(var.get(u'_key2'), var.get(u'arguments').get(var.get(u'_key2'))) + finally: + (var.put(u'_key2',Js(var.get(u'_key2').to_number())+Js(1))-Js(1)) + if (var.get(u'types').get(u'jsxTagStart') and var.get(u"this").callprop(u'match', var.get(u'types').get(u'jsxTagStart'))): + var.put(u'state', var.get(u"this").get(u'state').callprop(u'clone')) + try: + return var.get(u'inner').callprop(u'apply', var.get(u"this"), var.get(u'args')) + except PyJsException as PyJsTempException: + PyJsHolder_657272_79758696 = var.own.get(u'err') + var.force_own_put(u'err', PyExceptionToJs(PyJsTempException)) + try: + if var.get(u'err').instanceof(var.get(u'SyntaxError')): + var.get(u"this").put(u'state', var.get(u'state')) + var.put(u'jsxError', var.get(u'err')) + else: + PyJsTempException = JsToPyException(var.get(u'err')) + raise PyJsTempException + finally: + if PyJsHolder_657272_79758696 is not None: + var.own[u'err'] = PyJsHolder_657272_79758696 + else: + del var.own[u'err'] + del PyJsHolder_657272_79758696 + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'parenExpression')) + if ((var.get(u'jsxError')!=var.get(u"null")) or var.get(u"this").callprop(u'isRelational', Js(u'<'))): + var.put(u'arrowExpression', PyJsComma(Js(0.0), Js(None))) + var.put(u'typeParameters', PyJsComma(Js(0.0), Js(None))) + try: + var.put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterDeclaration')) + var.put(u'arrowExpression', var.get(u'inner').callprop(u'apply', var.get(u"this"), var.get(u'args'))) + var.get(u'arrowExpression').put(u'typeParameters', var.get(u'typeParameters')) + var.get(u'arrowExpression').put(u'start', var.get(u'typeParameters').get(u'start')) + var.get(u'arrowExpression').get(u'loc').put(u'start', var.get(u'typeParameters').get(u'loc').get(u'start')) + except PyJsException as PyJsTempException: + PyJsHolder_657272_54478765 = var.own.get(u'err') + var.force_own_put(u'err', PyExceptionToJs(PyJsTempException)) + try: + PyJsTempException = JsToPyException((var.get(u'jsxError') or var.get(u'err'))) + raise PyJsTempException + finally: + if PyJsHolder_657272_54478765 is not None: + var.own[u'err'] = PyJsHolder_657272_54478765 + else: + del var.own[u'err'] + del PyJsHolder_657272_54478765 + if PyJsStrictEq(var.get(u'arrowExpression').get(u'type'),Js(u'ArrowFunctionExpression')): + return var.get(u'arrowExpression') + else: + if (var.get(u'jsxError')!=var.get(u"null")): + PyJsTempException = JsToPyException(var.get(u'jsxError')) + raise PyJsTempException + else: + var.get(u"this").callprop(u'raise', var.get(u'typeParameters').get(u'start'), Js(u'Expected an arrow function after this type parameter declaration')) + var.get(u"this").get(u'state').get(u'context').callprop(u'pop') + return var.get(u'inner').callprop(u'apply', var.get(u"this"), var.get(u'args')) + PyJs_anonymous_3187_._set_name(u'anonymous') + return PyJs_anonymous_3187_ + PyJs_anonymous_3186_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseMaybeAssign'), PyJs_anonymous_3186_) + @Js + def PyJs_anonymous_3188_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3189_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'returnType', u'node', u'state']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'colon')): + var.put(u'state', var.get(u"this").get(u'state').callprop(u'clone')) + try: + var.put(u'returnType', var.get(u"this").callprop(u'flowParseTypeAnnotation')) + if var.get(u"this").callprop(u'canInsertSemicolon'): + var.get(u"this").callprop(u'unexpected') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'arrow')).neg(): + var.get(u"this").callprop(u'unexpected') + var.get(u'node').put(u'returnType', var.get(u'returnType')) + except PyJsException as PyJsTempException: + PyJsHolder_657272_34966532 = var.own.get(u'err') + var.force_own_put(u'err', PyExceptionToJs(PyJsTempException)) + try: + if var.get(u'err').instanceof(var.get(u'SyntaxError')): + var.get(u"this").put(u'state', var.get(u'state')) + else: + PyJsTempException = JsToPyException(var.get(u'err')) + raise PyJsTempException + finally: + if PyJsHolder_657272_34966532 is not None: + var.own[u'err'] = PyJsHolder_657272_34966532 + else: + del var.own[u'err'] + del PyJsHolder_657272_34966532 + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'node')) + PyJs_anonymous_3189_._set_name(u'anonymous') + return PyJs_anonymous_3189_ + PyJs_anonymous_3188_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseArrow'), PyJs_anonymous_3188_) + @Js + def PyJs_anonymous_3190_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3191_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return (var.get(u"this").callprop(u'match', var.get(u'types').get(u'colon')) or var.get(u'inner').callprop(u'call', var.get(u"this"))) + PyJs_anonymous_3191_._set_name(u'anonymous') + return PyJs_anonymous_3191_ + PyJs_anonymous_3190_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'shouldParseArrow'), PyJs_anonymous_3190_) + @Js + def PyJs_anonymous_3192_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3193_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + return var.get(u'true') + else: + return var.get(u'inner').callprop(u'call', var.get(u"this")) + PyJs_anonymous_3193_._set_name(u'anonymous') + return PyJs_anonymous_3193_ + PyJs_anonymous_3192_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'isClassMutatorStarter'), PyJs_anonymous_3192_) + PyJs_anonymous_3123_._set_name(u'anonymous') + var.put(u'flowPlugin', PyJs_anonymous_3123_) + PyJs_Object_3194_ = Js({u'quot':Js(u'"'),u'amp':Js(u'&'),u'apos':Js(u"'"),u'lt':Js(u'<'),u'gt':Js(u'>'),u'nbsp':Js(u'\xa0'),u'iexcl':Js(u'\xa1'),u'cent':Js(u'\xa2'),u'pound':Js(u'\xa3'),u'curren':Js(u'\xa4'),u'yen':Js(u'\xa5'),u'brvbar':Js(u'\xa6'),u'sect':Js(u'\xa7'),u'uml':Js(u'\xa8'),u'copy':Js(u'\xa9'),u'ordf':Js(u'\xaa'),u'laquo':Js(u'\xab'),u'not':Js(u'\xac'),u'shy':Js(u'\xad'),u'reg':Js(u'\xae'),u'macr':Js(u'\xaf'),u'deg':Js(u'\xb0'),u'plusmn':Js(u'\xb1'),u'sup2':Js(u'\xb2'),u'sup3':Js(u'\xb3'),u'acute':Js(u'\xb4'),u'micro':Js(u'\xb5'),u'para':Js(u'\xb6'),u'middot':Js(u'\xb7'),u'cedil':Js(u'\xb8'),u'sup1':Js(u'\xb9'),u'ordm':Js(u'\xba'),u'raquo':Js(u'\xbb'),u'frac14':Js(u'\xbc'),u'frac12':Js(u'\xbd'),u'frac34':Js(u'\xbe'),u'iquest':Js(u'\xbf'),u'Agrave':Js(u'\xc0'),u'Aacute':Js(u'\xc1'),u'Acirc':Js(u'\xc2'),u'Atilde':Js(u'\xc3'),u'Auml':Js(u'\xc4'),u'Aring':Js(u'\xc5'),u'AElig':Js(u'\xc6'),u'Ccedil':Js(u'\xc7'),u'Egrave':Js(u'\xc8'),u'Eacute':Js(u'\xc9'),u'Ecirc':Js(u'\xca'),u'Euml':Js(u'\xcb'),u'Igrave':Js(u'\xcc'),u'Iacute':Js(u'\xcd'),u'Icirc':Js(u'\xce'),u'Iuml':Js(u'\xcf'),u'ETH':Js(u'\xd0'),u'Ntilde':Js(u'\xd1'),u'Ograve':Js(u'\xd2'),u'Oacute':Js(u'\xd3'),u'Ocirc':Js(u'\xd4'),u'Otilde':Js(u'\xd5'),u'Ouml':Js(u'\xd6'),u'times':Js(u'\xd7'),u'Oslash':Js(u'\xd8'),u'Ugrave':Js(u'\xd9'),u'Uacute':Js(u'\xda'),u'Ucirc':Js(u'\xdb'),u'Uuml':Js(u'\xdc'),u'Yacute':Js(u'\xdd'),u'THORN':Js(u'\xde'),u'szlig':Js(u'\xdf'),u'agrave':Js(u'\xe0'),u'aacute':Js(u'\xe1'),u'acirc':Js(u'\xe2'),u'atilde':Js(u'\xe3'),u'auml':Js(u'\xe4'),u'aring':Js(u'\xe5'),u'aelig':Js(u'\xe6'),u'ccedil':Js(u'\xe7'),u'egrave':Js(u'\xe8'),u'eacute':Js(u'\xe9'),u'ecirc':Js(u'\xea'),u'euml':Js(u'\xeb'),u'igrave':Js(u'\xec'),u'iacute':Js(u'\xed'),u'icirc':Js(u'\xee'),u'iuml':Js(u'\xef'),u'eth':Js(u'\xf0'),u'ntilde':Js(u'\xf1'),u'ograve':Js(u'\xf2'),u'oacute':Js(u'\xf3'),u'ocirc':Js(u'\xf4'),u'otilde':Js(u'\xf5'),u'ouml':Js(u'\xf6'),u'divide':Js(u'\xf7'),u'oslash':Js(u'\xf8'),u'ugrave':Js(u'\xf9'),u'uacute':Js(u'\xfa'),u'ucirc':Js(u'\xfb'),u'uuml':Js(u'\xfc'),u'yacute':Js(u'\xfd'),u'thorn':Js(u'\xfe'),u'yuml':Js(u'\xff'),u'OElig':Js(u'\u0152'),u'oelig':Js(u'\u0153'),u'Scaron':Js(u'\u0160'),u'scaron':Js(u'\u0161'),u'Yuml':Js(u'\u0178'),u'fnof':Js(u'\u0192'),u'circ':Js(u'\u02c6'),u'tilde':Js(u'\u02dc'),u'Alpha':Js(u'\u0391'),u'Beta':Js(u'\u0392'),u'Gamma':Js(u'\u0393'),u'Delta':Js(u'\u0394'),u'Epsilon':Js(u'\u0395'),u'Zeta':Js(u'\u0396'),u'Eta':Js(u'\u0397'),u'Theta':Js(u'\u0398'),u'Iota':Js(u'\u0399'),u'Kappa':Js(u'\u039a'),u'Lambda':Js(u'\u039b'),u'Mu':Js(u'\u039c'),u'Nu':Js(u'\u039d'),u'Xi':Js(u'\u039e'),u'Omicron':Js(u'\u039f'),u'Pi':Js(u'\u03a0'),u'Rho':Js(u'\u03a1'),u'Sigma':Js(u'\u03a3'),u'Tau':Js(u'\u03a4'),u'Upsilon':Js(u'\u03a5'),u'Phi':Js(u'\u03a6'),u'Chi':Js(u'\u03a7'),u'Psi':Js(u'\u03a8'),u'Omega':Js(u'\u03a9'),u'alpha':Js(u'\u03b1'),u'beta':Js(u'\u03b2'),u'gamma':Js(u'\u03b3'),u'delta':Js(u'\u03b4'),u'epsilon':Js(u'\u03b5'),u'zeta':Js(u'\u03b6'),u'eta':Js(u'\u03b7'),u'theta':Js(u'\u03b8'),u'iota':Js(u'\u03b9'),u'kappa':Js(u'\u03ba'),u'lambda':Js(u'\u03bb'),u'mu':Js(u'\u03bc'),u'nu':Js(u'\u03bd'),u'xi':Js(u'\u03be'),u'omicron':Js(u'\u03bf'),u'pi':Js(u'\u03c0'),u'rho':Js(u'\u03c1'),u'sigmaf':Js(u'\u03c2'),u'sigma':Js(u'\u03c3'),u'tau':Js(u'\u03c4'),u'upsilon':Js(u'\u03c5'),u'phi':Js(u'\u03c6'),u'chi':Js(u'\u03c7'),u'psi':Js(u'\u03c8'),u'omega':Js(u'\u03c9'),u'thetasym':Js(u'\u03d1'),u'upsih':Js(u'\u03d2'),u'piv':Js(u'\u03d6'),u'ensp':Js(u'\u2002'),u'emsp':Js(u'\u2003'),u'thinsp':Js(u'\u2009'),u'zwnj':Js(u'\u200c'),u'zwj':Js(u'\u200d'),u'lrm':Js(u'\u200e'),u'rlm':Js(u'\u200f'),u'ndash':Js(u'\u2013'),u'mdash':Js(u'\u2014'),u'lsquo':Js(u'\u2018'),u'rsquo':Js(u'\u2019'),u'sbquo':Js(u'\u201a'),u'ldquo':Js(u'\u201c'),u'rdquo':Js(u'\u201d'),u'bdquo':Js(u'\u201e'),u'dagger':Js(u'\u2020'),u'Dagger':Js(u'\u2021'),u'bull':Js(u'\u2022'),u'hellip':Js(u'\u2026'),u'permil':Js(u'\u2030'),u'prime':Js(u'\u2032'),u'Prime':Js(u'\u2033'),u'lsaquo':Js(u'\u2039'),u'rsaquo':Js(u'\u203a'),u'oline':Js(u'\u203e'),u'frasl':Js(u'\u2044'),u'euro':Js(u'\u20ac'),u'image':Js(u'\u2111'),u'weierp':Js(u'\u2118'),u'real':Js(u'\u211c'),u'trade':Js(u'\u2122'),u'alefsym':Js(u'\u2135'),u'larr':Js(u'\u2190'),u'uarr':Js(u'\u2191'),u'rarr':Js(u'\u2192'),u'darr':Js(u'\u2193'),u'harr':Js(u'\u2194'),u'crarr':Js(u'\u21b5'),u'lArr':Js(u'\u21d0'),u'uArr':Js(u'\u21d1'),u'rArr':Js(u'\u21d2'),u'dArr':Js(u'\u21d3'),u'hArr':Js(u'\u21d4'),u'forall':Js(u'\u2200'),u'part':Js(u'\u2202'),u'exist':Js(u'\u2203'),u'empty':Js(u'\u2205'),u'nabla':Js(u'\u2207'),u'isin':Js(u'\u2208'),u'notin':Js(u'\u2209'),u'ni':Js(u'\u220b'),u'prod':Js(u'\u220f'),u'sum':Js(u'\u2211'),u'minus':Js(u'\u2212'),u'lowast':Js(u'\u2217'),u'radic':Js(u'\u221a'),u'prop':Js(u'\u221d'),u'infin':Js(u'\u221e'),u'ang':Js(u'\u2220'),u'and':Js(u'\u2227'),u'or':Js(u'\u2228'),u'cap':Js(u'\u2229'),u'cup':Js(u'\u222a'),u'int':Js(u'\u222b'),u'there4':Js(u'\u2234'),u'sim':Js(u'\u223c'),u'cong':Js(u'\u2245'),u'asymp':Js(u'\u2248'),u'ne':Js(u'\u2260'),u'equiv':Js(u'\u2261'),u'le':Js(u'\u2264'),u'ge':Js(u'\u2265'),u'sub':Js(u'\u2282'),u'sup':Js(u'\u2283'),u'nsub':Js(u'\u2284'),u'sube':Js(u'\u2286'),u'supe':Js(u'\u2287'),u'oplus':Js(u'\u2295'),u'otimes':Js(u'\u2297'),u'perp':Js(u'\u22a5'),u'sdot':Js(u'\u22c5'),u'lceil':Js(u'\u2308'),u'rceil':Js(u'\u2309'),u'lfloor':Js(u'\u230a'),u'rfloor':Js(u'\u230b'),u'lang':Js(u'\u2329'),u'rang':Js(u'\u232a'),u'loz':Js(u'\u25ca'),u'spades':Js(u'\u2660'),u'clubs':Js(u'\u2663'),u'hearts':Js(u'\u2665'),u'diams':Js(u'\u2666')}) + var.put(u'XHTMLEntities', PyJs_Object_3194_) + var.put(u'HEX_NUMBER', JsRegExp(u'/^[\\da-fA-F]+$/')) + var.put(u'DECIMAL_NUMBER', JsRegExp(u'/^\\d+$/')) + var.get(u'types$1').put(u'j_oTag', var.get(u'TokContext').create(Js(u'<tag'), Js(False))) + var.get(u'types$1').put(u'j_cTag', var.get(u'TokContext').create(Js(u'</tag'), Js(False))) + var.get(u'types$1').put(u'j_expr', var.get(u'TokContext').create(Js(u'<tag>...</tag>'), var.get(u'true'), var.get(u'true'))) + var.get(u'types').put(u'jsxName', var.get(u'TokenType').create(Js(u'jsxName'))) + PyJs_Object_3195_ = Js({u'beforeExpr':var.get(u'true')}) + var.get(u'types').put(u'jsxText', var.get(u'TokenType').create(Js(u'jsxText'), PyJs_Object_3195_)) + PyJs_Object_3196_ = Js({u'startsExpr':var.get(u'true')}) + var.get(u'types').put(u'jsxTagStart', var.get(u'TokenType').create(Js(u'jsxTagStart'), PyJs_Object_3196_)) + var.get(u'types').put(u'jsxTagEnd', var.get(u'TokenType').create(Js(u'jsxTagEnd'))) + @Js + def PyJs_anonymous_3197_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'j_expr')) + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'j_oTag')) + var.get(u"this").get(u'state').put(u'exprAllowed', Js(False)) + PyJs_anonymous_3197_._set_name(u'anonymous') + var.get(u'types').get(u'jsxTagStart').put(u'updateContext', PyJs_anonymous_3197_) + @Js + def PyJs_anonymous_3198_(prevType, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prevType':prevType}, var) + var.registers([u'prevType', u'out']) + var.put(u'out', var.get(u"this").get(u'state').get(u'context').callprop(u'pop')) + if ((PyJsStrictEq(var.get(u'out'),var.get(u'types$1').get(u'j_oTag')) and PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'slash'))) or PyJsStrictEq(var.get(u'out'),var.get(u'types$1').get(u'j_cTag'))): + var.get(u"this").get(u'state').get(u'context').callprop(u'pop') + var.get(u"this").get(u'state').put(u'exprAllowed', PyJsStrictEq(var.get(u"this").callprop(u'curContext'),var.get(u'types$1').get(u'j_expr'))) + else: + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + PyJs_anonymous_3198_._set_name(u'anonymous') + var.get(u'types').get(u'jsxTagEnd').put(u'updateContext', PyJs_anonymous_3198_) + var.put(u'pp$8', var.get(u'Parser').get(u'prototype')) + @Js + def PyJs_anonymous_3199_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'ch', u'chunkStart', u'out']) + var.put(u'out', Js(u'')) + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + #for JS loop + + while 1: + if (var.get(u"this").get(u'state').get(u'pos')>=var.get(u"this").get(u'input').get(u'length')): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'Unterminated JSX contents')) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + while 1: + SWITCHED = False + CONDITION = (var.get(u'ch')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(60.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(123.0)): + SWITCHED = True + if PyJsStrictEq(var.get(u"this").get(u'state').get(u'pos'),var.get(u"this").get(u'state').get(u'start')): + if (PyJsStrictEq(var.get(u'ch'),Js(60.0)) and var.get(u"this").get(u'state').get(u'exprAllowed')): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'jsxTagStart')) + return var.get(u"this").callprop(u'getTokenFromCode', var.get(u'ch')) + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'jsxText'), var.get(u'out')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(38.0)): + SWITCHED = True + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.put(u'out', var.get(u"this").callprop(u'jsxReadEntity'), u'+') + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + break + if True: + SWITCHED = True + if var.get(u'isNewLine')(var.get(u'ch')): + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.put(u'out', var.get(u"this").callprop(u'jsxReadNewLine', var.get(u'true')), u'+') + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + else: + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + SWITCHED = True + break + + PyJs_anonymous_3199_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxReadToken', PyJs_anonymous_3199_) + @Js + def PyJs_anonymous_3200_(normalizeCRLF, this, arguments, var=var): + var = Scope({u'this':this, u'normalizeCRLF':normalizeCRLF, u'arguments':arguments}, var) + var.registers([u'ch', u'normalizeCRLF', u'out']) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + var.put(u'out', PyJsComma(Js(0.0), Js(None))) + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + if (PyJsStrictEq(var.get(u'ch'),Js(13.0)) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos')),Js(10.0))): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + var.put(u'out', (Js(u'\n') if var.get(u'normalizeCRLF') else Js(u'\r\n'))) + else: + var.put(u'out', var.get(u'String').callprop(u'fromCharCode', var.get(u'ch'))) + var.get(u"this").get(u'state').put(u'curLine',Js(var.get(u"this").get(u'state').get(u'curLine').to_number())+Js(1)) + var.get(u"this").get(u'state').put(u'lineStart', var.get(u"this").get(u'state').get(u'pos')) + return var.get(u'out') + PyJs_anonymous_3200_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxReadNewLine', PyJs_anonymous_3200_) + @Js + def PyJs_anonymous_3201_(quote, this, arguments, var=var): + var = Scope({u'this':this, u'quote':quote, u'arguments':arguments}, var) + var.registers([u'ch', u'quote', u'chunkStart', u'out']) + var.put(u'out', Js(u'')) + var.put(u'chunkStart', var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1))) + #for JS loop + + while 1: + if (var.get(u"this").get(u'state').get(u'pos')>=var.get(u"this").get(u'input').get(u'length')): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'Unterminated string constant')) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + if PyJsStrictEq(var.get(u'ch'),var.get(u'quote')): + break + if PyJsStrictEq(var.get(u'ch'),Js(38.0)): + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.put(u'out', var.get(u"this").callprop(u'jsxReadEntity'), u'+') + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + else: + if var.get(u'isNewLine')(var.get(u'ch')): + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.put(u'out', var.get(u"this").callprop(u'jsxReadNewLine', Js(False)), u'+') + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + else: + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), (var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1))-Js(1))), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'string'), var.get(u'out')) + PyJs_anonymous_3201_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxReadString', PyJs_anonymous_3201_) + @Js + def PyJs_anonymous_3202_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'count', u'startPos', u'ch', u'str', u'entity']) + var.put(u'str', Js(u'')) + var.put(u'count', Js(0.0)) + var.put(u'entity', PyJsComma(Js(0.0), Js(None))) + var.put(u'ch', var.get(u"this").get(u'input').get(var.get(u"this").get(u'state').get(u'pos'))) + var.put(u'startPos', var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1))) + while ((var.get(u"this").get(u'state').get(u'pos')<var.get(u"this").get(u'input').get(u'length')) and ((var.put(u'count',Js(var.get(u'count').to_number())+Js(1))-Js(1))<Js(10.0))): + var.put(u'ch', var.get(u"this").get(u'input').get((var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1))-Js(1)))) + if PyJsStrictEq(var.get(u'ch'),Js(u';')): + if PyJsStrictEq(var.get(u'str').get(u'0'),Js(u'#')): + if PyJsStrictEq(var.get(u'str').get(u'1'),Js(u'x')): + var.put(u'str', var.get(u'str').callprop(u'substr', Js(2.0))) + if var.get(u'HEX_NUMBER').callprop(u'test', var.get(u'str')): + var.put(u'entity', var.get(u'String').callprop(u'fromCharCode', var.get(u'parseInt')(var.get(u'str'), Js(16.0)))) + else: + var.put(u'str', var.get(u'str').callprop(u'substr', Js(1.0))) + if var.get(u'DECIMAL_NUMBER').callprop(u'test', var.get(u'str')): + var.put(u'entity', var.get(u'String').callprop(u'fromCharCode', var.get(u'parseInt')(var.get(u'str'), Js(10.0)))) + else: + var.put(u'entity', var.get(u'XHTMLEntities').get(var.get(u'str'))) + break + var.put(u'str', var.get(u'ch'), u'+') + if var.get(u'entity').neg(): + var.get(u"this").get(u'state').put(u'pos', var.get(u'startPos')) + return Js(u'&') + return var.get(u'entity') + PyJs_anonymous_3202_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxReadEntity', PyJs_anonymous_3202_) + @Js + def PyJs_anonymous_3203_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'start', u'ch']) + var.put(u'ch', PyJsComma(Js(0.0), Js(None))) + var.put(u'start', var.get(u"this").get(u'state').get(u'pos')) + while 1: + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)))) + if not (var.get(u'isIdentifierChar')(var.get(u'ch')) or PyJsStrictEq(var.get(u'ch'),Js(45.0))): + break + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'jsxName'), var.get(u"this").get(u'input').callprop(u'slice', var.get(u'start'), var.get(u"this").get(u'state').get(u'pos'))) + PyJs_anonymous_3203_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxReadWord', PyJs_anonymous_3203_) + pass + @Js + def PyJs_anonymous_3204_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'jsxName')): + var.get(u'node').put(u'name', var.get(u"this").get(u'state').get(u'value')) + else: + if var.get(u"this").get(u'state').get(u'type').get(u'keyword'): + var.get(u'node').put(u'name', var.get(u"this").get(u'state').get(u'type').get(u'keyword')) + else: + var.get(u"this").callprop(u'unexpected') + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'JSXIdentifier')) + PyJs_anonymous_3204_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxParseIdentifier', PyJs_anonymous_3204_) + @Js + def PyJs_anonymous_3205_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'startPos', u'name', u'startLoc']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'name', var.get(u"this").callprop(u'jsxParseIdentifier')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'colon')).neg(): + return var.get(u'name') + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'namespace', var.get(u'name')) + var.get(u'node').put(u'name', var.get(u"this").callprop(u'jsxParseIdentifier')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'JSXNamespacedName')) + PyJs_anonymous_3205_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxParseNamespacedName', PyJs_anonymous_3205_) + @Js + def PyJs_anonymous_3206_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'newNode', u'startPos', u'startLoc']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'node', var.get(u"this").callprop(u'jsxParseNamespacedName')) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'dot')): + var.put(u'newNode', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'newNode').put(u'object', var.get(u'node')) + var.get(u'newNode').put(u'property', var.get(u"this").callprop(u'jsxParseIdentifier')) + var.put(u'node', var.get(u"this").callprop(u'finishNode', var.get(u'newNode'), Js(u'JSXMemberExpression'))) + return var.get(u'node') + PyJs_anonymous_3206_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxParseElementName', PyJs_anonymous_3206_) + @Js + def PyJs_anonymous_3207_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', PyJsComma(Js(0.0), Js(None))) + while 1: + SWITCHED = False + CONDITION = (var.get(u"this").get(u'state').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'braceL')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'jsxParseExpressionContainer')) + if PyJsStrictEq(var.get(u'node').get(u'expression').get(u'type'),Js(u'JSXEmptyExpression')): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), Js(u'JSX attributes must only be assigned a non-empty expression')) + else: + return var.get(u'node') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'jsxTagStart')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'string')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'parseExprAtom')) + var.get(u'node').put(u'extra', var.get(u"null")) + return var.get(u'node') + if True: + SWITCHED = True + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'JSX value should be either an expression or a quoted JSX text')) + SWITCHED = True + break + PyJs_anonymous_3207_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxParseAttributeValue', PyJs_anonymous_3207_) + @Js + def PyJs_anonymous_3208_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u"this").get(u'lastTokEnd'), var.get(u"this").get(u'lastTokEndLoc'))) + return var.get(u"this").callprop(u'finishNodeAt', var.get(u'node'), Js(u'JSXEmptyExpression'), var.get(u"this").get(u'start'), var.get(u"this").get(u'startLoc')) + PyJs_anonymous_3208_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxParseEmptyExpression', PyJs_anonymous_3208_) + @Js + def PyJs_anonymous_3209_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceL')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'ellipsis')) + var.get(u'node').put(u'expression', var.get(u"this").callprop(u'parseExpression')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceR')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'JSXSpreadChild')) + PyJs_anonymous_3209_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxParseSpreadChild', PyJs_anonymous_3209_) + @Js + def PyJs_anonymous_3210_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceR')): + var.get(u'node').put(u'expression', var.get(u"this").callprop(u'jsxParseEmptyExpression')) + else: + var.get(u'node').put(u'expression', var.get(u"this").callprop(u'parseExpression')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceR')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'JSXExpressionContainer')) + PyJs_anonymous_3210_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxParseExpressionContainer', PyJs_anonymous_3210_) + @Js + def PyJs_anonymous_3211_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceL')): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'ellipsis')) + var.get(u'node').put(u'argument', var.get(u"this").callprop(u'parseMaybeAssign')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceR')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'JSXSpreadAttribute')) + var.get(u'node').put(u'name', var.get(u"this").callprop(u'jsxParseNamespacedName')) + var.get(u'node').put(u'value', (var.get(u"this").callprop(u'jsxParseAttributeValue') if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'eq')) else var.get(u"null"))) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'JSXAttribute')) + PyJs_anonymous_3211_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxParseAttribute', PyJs_anonymous_3211_) + @Js + def PyJs_anonymous_3212_(startPos, startLoc, this, arguments, var=var): + var = Scope({u'this':this, u'startPos':startPos, u'arguments':arguments, u'startLoc':startLoc}, var) + var.registers([u'node', u'startPos', u'startLoc']) + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'attributes', Js([])) + var.get(u'node').put(u'name', var.get(u"this").callprop(u'jsxParseElementName')) + while (var.get(u"this").callprop(u'match', var.get(u'types').get(u'slash')).neg() and var.get(u"this").callprop(u'match', var.get(u'types').get(u'jsxTagEnd')).neg()): + var.get(u'node').get(u'attributes').callprop(u'push', var.get(u"this").callprop(u'jsxParseAttribute')) + var.get(u'node').put(u'selfClosing', var.get(u"this").callprop(u'eat', var.get(u'types').get(u'slash'))) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'jsxTagEnd')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'JSXOpeningElement')) + PyJs_anonymous_3212_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxParseOpeningElementAt', PyJs_anonymous_3212_) + @Js + def PyJs_anonymous_3213_(startPos, startLoc, this, arguments, var=var): + var = Scope({u'this':this, u'startPos':startPos, u'arguments':arguments, u'startLoc':startLoc}, var) + var.registers([u'node', u'startPos', u'startLoc']) + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'name', var.get(u"this").callprop(u'jsxParseElementName')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'jsxTagEnd')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'JSXClosingElement')) + PyJs_anonymous_3213_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxParseClosingElementAt', PyJs_anonymous_3213_) + @Js + def PyJs_anonymous_3214_(startPos, startLoc, this, arguments, var=var): + var = Scope({u'this':this, u'startPos':startPos, u'arguments':arguments, u'startLoc':startLoc}, var) + var.registers([u'node', u'openingElement', u'closingElement', u'startLoc', u'startPos', u'children']) + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.put(u'children', Js([])) + var.put(u'openingElement', var.get(u"this").callprop(u'jsxParseOpeningElementAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.put(u'closingElement', var.get(u"null")) + if var.get(u'openingElement').get(u'selfClosing').neg(): + class JS_CONTINUE_LABEL_636f6e74656e7473(Exception): pass + class JS_BREAK_LABEL_636f6e74656e7473(Exception): pass + try: + #for JS loop + + while 1: + try: + while 1: + SWITCHED = False + CONDITION = (var.get(u"this").get(u'state').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'jsxTagStart')): + SWITCHED = True + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'slash')): + var.put(u'closingElement', var.get(u"this").callprop(u'jsxParseClosingElementAt', var.get(u'startPos'), var.get(u'startLoc'))) + raise JS_BREAK_LABEL_636f6e74656e7473("Breaked") + var.get(u'children').callprop(u'push', var.get(u"this").callprop(u'jsxParseElementAt', var.get(u'startPos'), var.get(u'startLoc'))) + break + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'jsxText')): + SWITCHED = True + var.get(u'children').callprop(u'push', var.get(u"this").callprop(u'parseExprAtom')) + break + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'braceL')): + SWITCHED = True + if PyJsStrictEq(var.get(u"this").callprop(u'lookahead').get(u'type'),var.get(u'types').get(u'ellipsis')): + var.get(u'children').callprop(u'push', var.get(u"this").callprop(u'jsxParseSpreadChild')) + else: + var.get(u'children').callprop(u'push', var.get(u"this").callprop(u'jsxParseExpressionContainer')) + break + if True: + SWITCHED = True + var.get(u"this").callprop(u'unexpected') + SWITCHED = True + break + + except JS_CONTINUE_LABEL_636f6e74656e7473: + pass + except JS_BREAK_LABEL_636f6e74656e7473: + pass + if PyJsStrictNeq(var.get(u'getQualifiedJSXName')(var.get(u'closingElement').get(u'name')),var.get(u'getQualifiedJSXName')(var.get(u'openingElement').get(u'name'))): + var.get(u"this").callprop(u'raise', var.get(u'closingElement').get(u'start'), ((Js(u'Expected corresponding JSX closing tag for <')+var.get(u'getQualifiedJSXName')(var.get(u'openingElement').get(u'name')))+Js(u'>'))) + var.get(u'node').put(u'openingElement', var.get(u'openingElement')) + var.get(u'node').put(u'closingElement', var.get(u'closingElement')) + var.get(u'node').put(u'children', var.get(u'children')) + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'relational')) and PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'<'))): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'Adjacent JSX elements must be wrapped in an enclosing tag')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'JSXElement')) + PyJs_anonymous_3214_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxParseElementAt', PyJs_anonymous_3214_) + @Js + def PyJs_anonymous_3215_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'startPos', u'startLoc']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'jsxParseElementAt', var.get(u'startPos'), var.get(u'startLoc')) + PyJs_anonymous_3215_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxParseElement', PyJs_anonymous_3215_) + @Js + def PyJs_anonymous_3216_(instance, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments}, var) + var.registers([u'instance']) + @Js + def PyJs_anonymous_3217_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3218_(refShortHandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'refShortHandDefaultPos':refShortHandDefaultPos, u'arguments':arguments}, var) + var.registers([u'node', u'refShortHandDefaultPos']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'jsxText')): + var.put(u'node', var.get(u"this").callprop(u'parseLiteral', var.get(u"this").get(u'state').get(u'value'), Js(u'JSXText'))) + var.get(u'node').put(u'extra', var.get(u"null")) + return var.get(u'node') + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'jsxTagStart')): + return var.get(u"this").callprop(u'jsxParseElement') + else: + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'refShortHandDefaultPos')) + PyJs_anonymous_3218_._set_name(u'anonymous') + return PyJs_anonymous_3218_ + PyJs_anonymous_3217_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseExprAtom'), PyJs_anonymous_3217_) + @Js + def PyJs_anonymous_3219_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3220_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments}, var) + var.registers([u'code', u'context']) + var.put(u'context', var.get(u"this").callprop(u'curContext')) + if PyJsStrictEq(var.get(u'context'),var.get(u'types$1').get(u'j_expr')): + return var.get(u"this").callprop(u'jsxReadToken') + if (PyJsStrictEq(var.get(u'context'),var.get(u'types$1').get(u'j_oTag')) or PyJsStrictEq(var.get(u'context'),var.get(u'types$1').get(u'j_cTag'))): + if var.get(u'isIdentifierStart')(var.get(u'code')): + return var.get(u"this").callprop(u'jsxReadWord') + if PyJsStrictEq(var.get(u'code'),Js(62.0)): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'jsxTagEnd')) + if ((PyJsStrictEq(var.get(u'code'),Js(34.0)) or PyJsStrictEq(var.get(u'code'),Js(39.0))) and PyJsStrictEq(var.get(u'context'),var.get(u'types$1').get(u'j_oTag'))): + return var.get(u"this").callprop(u'jsxReadString', var.get(u'code')) + if (PyJsStrictEq(var.get(u'code'),Js(60.0)) and var.get(u"this").get(u'state').get(u'exprAllowed')): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'jsxTagStart')) + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'code')) + PyJs_anonymous_3220_._set_name(u'anonymous') + return PyJs_anonymous_3220_ + PyJs_anonymous_3219_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'readToken'), PyJs_anonymous_3219_) + @Js + def PyJs_anonymous_3221_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3222_(prevType, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prevType':prevType}, var) + var.registers([u'curContext', u'prevType']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceL')): + var.put(u'curContext', var.get(u"this").callprop(u'curContext')) + if PyJsStrictEq(var.get(u'curContext'),var.get(u'types$1').get(u'j_oTag')): + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'braceExpression')) + else: + if PyJsStrictEq(var.get(u'curContext'),var.get(u'types$1').get(u'j_expr')): + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'templateQuasi')) + else: + var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'prevType')) + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + else: + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'slash')) and PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'jsxTagStart'))): + var.get(u"this").get(u'state').get(u'context').put(u'length', Js(2.0), u'-') + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'j_cTag')) + var.get(u"this").get(u'state').put(u'exprAllowed', Js(False)) + else: + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'prevType')) + PyJs_anonymous_3222_._set_name(u'anonymous') + return PyJs_anonymous_3222_ + PyJs_anonymous_3221_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'updateContext'), PyJs_anonymous_3221_) + PyJs_anonymous_3216_._set_name(u'anonymous') + var.put(u'jsxPlugin', PyJs_anonymous_3216_) + var.get(u'plugins').put(u'flow', var.get(u'flowPlugin')) + var.get(u'plugins').put(u'jsx', var.get(u'jsxPlugin')) + pass + var.get(u'exports').put(u'parse', var.get(u'parse$1')) + var.get(u'exports').put(u'tokTypes', var.get(u'types')) +PyJs_anonymous_2842_._set_name(u'anonymous') +PyJs_Object_3223_ = Js({}) +@Js +def PyJs_anonymous_3224_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'maybeMatch', u'require', u'module', u'range', u'balanced']) + @Js + def PyJsHoisted_balanced_(a, b, str, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments, u'str':str}, var) + var.registers([u'a', u'r', u'b', u'str']) + if var.get(u'a').instanceof(var.get(u'RegExp')): + var.put(u'a', var.get(u'maybeMatch')(var.get(u'a'), var.get(u'str'))) + if var.get(u'b').instanceof(var.get(u'RegExp')): + var.put(u'b', var.get(u'maybeMatch')(var.get(u'b'), var.get(u'str'))) + var.put(u'r', var.get(u'range')(var.get(u'a'), var.get(u'b'), var.get(u'str'))) + PyJs_Object_3225_ = Js({u'start':var.get(u'r').get(u'0'),u'end':var.get(u'r').get(u'1'),u'pre':var.get(u'str').callprop(u'slice', Js(0.0), var.get(u'r').get(u'0')),u'body':var.get(u'str').callprop(u'slice', (var.get(u'r').get(u'0')+var.get(u'a').get(u'length')), var.get(u'r').get(u'1')),u'post':var.get(u'str').callprop(u'slice', (var.get(u'r').get(u'1')+var.get(u'b').get(u'length')))}) + return (var.get(u'r') and PyJs_Object_3225_) + PyJsHoisted_balanced_.func_name = u'balanced' + var.put(u'balanced', PyJsHoisted_balanced_) + @Js + def PyJsHoisted_range_(a, b, str, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments, u'str':str}, var) + var.registers([u'a', u'right', u'ai', u'beg', u'bi', u'i', u'b', u'result', u'str', u'begs', u'left']) + pass + var.put(u'ai', var.get(u'str').callprop(u'indexOf', var.get(u'a'))) + var.put(u'bi', var.get(u'str').callprop(u'indexOf', var.get(u'b'), (var.get(u'ai')+Js(1.0)))) + var.put(u'i', var.get(u'ai')) + if ((var.get(u'ai')>=Js(0.0)) and (var.get(u'bi')>Js(0.0))): + var.put(u'begs', Js([])) + var.put(u'left', var.get(u'str').get(u'length')) + while ((var.get(u'i')>=Js(0.0)) and var.get(u'result').neg()): + if (var.get(u'i')==var.get(u'ai')): + var.get(u'begs').callprop(u'push', var.get(u'i')) + var.put(u'ai', var.get(u'str').callprop(u'indexOf', var.get(u'a'), (var.get(u'i')+Js(1.0)))) + else: + if (var.get(u'begs').get(u'length')==Js(1.0)): + var.put(u'result', Js([var.get(u'begs').callprop(u'pop'), var.get(u'bi')])) + else: + var.put(u'beg', var.get(u'begs').callprop(u'pop')) + if (var.get(u'beg')<var.get(u'left')): + var.put(u'left', var.get(u'beg')) + var.put(u'right', var.get(u'bi')) + var.put(u'bi', var.get(u'str').callprop(u'indexOf', var.get(u'b'), (var.get(u'i')+Js(1.0)))) + var.put(u'i', (var.get(u'ai') if ((var.get(u'ai')<var.get(u'bi')) and (var.get(u'ai')>=Js(0.0))) else var.get(u'bi'))) + if var.get(u'begs').get(u'length'): + var.put(u'result', Js([var.get(u'left'), var.get(u'right')])) + return var.get(u'result') + PyJsHoisted_range_.func_name = u'range' + var.put(u'range', PyJsHoisted_range_) + @Js + def PyJsHoisted_maybeMatch_(reg, str, this, arguments, var=var): + var = Scope({u'this':this, u'reg':reg, u'str':str, u'arguments':arguments}, var) + var.registers([u'm', u'reg', u'str']) + var.put(u'm', var.get(u'str').callprop(u'match', var.get(u'reg'))) + return (var.get(u'm').get(u'0') if var.get(u'm') else var.get(u"null")) + PyJsHoisted_maybeMatch_.func_name = u'maybeMatch' + var.put(u'maybeMatch', PyJsHoisted_maybeMatch_) + var.get(u'module').put(u'exports', var.get(u'balanced')) + pass + pass + var.get(u'balanced').put(u'range', var.get(u'range')) + pass +PyJs_anonymous_3224_._set_name(u'anonymous') +PyJs_Object_3226_ = Js({}) +@Js +def PyJs_anonymous_3227_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'escComma', u'escapeBraces', u'exports', u'escOpen', u'escPeriod', u'module', u'expandTop', u'escClose', u'isPadded', u'numeric', u'lte', u'unescapeBraces', u'concatMap', u'embrace', u'expand', u'escSlash', u'balanced', u'parseCommaParts', u'require', u'identity', u'gte']) + @Js + def PyJsHoisted_escapeBraces_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return var.get(u'str').callprop(u'split', Js(u'\\\\')).callprop(u'join', var.get(u'escSlash')).callprop(u'split', Js(u'\\{')).callprop(u'join', var.get(u'escOpen')).callprop(u'split', Js(u'\\}')).callprop(u'join', var.get(u'escClose')).callprop(u'split', Js(u'\\,')).callprop(u'join', var.get(u'escComma')).callprop(u'split', Js(u'\\.')).callprop(u'join', var.get(u'escPeriod')) + PyJsHoisted_escapeBraces_.func_name = u'escapeBraces' + var.put(u'escapeBraces', PyJsHoisted_escapeBraces_) + @Js + def PyJsHoisted_lte_(i, y, this, arguments, var=var): + var = Scope({u'i':i, u'y':y, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'y']) + return (var.get(u'i')<=var.get(u'y')) + PyJsHoisted_lte_.func_name = u'lte' + var.put(u'lte', PyJsHoisted_lte_) + @Js + def PyJsHoisted_expandTop_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + if var.get(u'str').neg(): + return Js([]) + return var.get(u'expand')(var.get(u'escapeBraces')(var.get(u'str')), var.get(u'true')).callprop(u'map', var.get(u'unescapeBraces')) + PyJsHoisted_expandTop_.func_name = u'expandTop' + var.put(u'expandTop', PyJsHoisted_expandTop_) + @Js + def PyJsHoisted_numeric_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return (var.get(u'parseInt')(var.get(u'str'), Js(10.0)) if (var.get(u'parseInt')(var.get(u'str'), Js(10.0))==var.get(u'str')) else var.get(u'str').callprop(u'charCodeAt', Js(0.0))) + PyJsHoisted_numeric_.func_name = u'numeric' + var.put(u'numeric', PyJsHoisted_numeric_) + @Js + def PyJsHoisted_unescapeBraces_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return var.get(u'str').callprop(u'split', var.get(u'escSlash')).callprop(u'join', Js(u'\\')).callprop(u'split', var.get(u'escOpen')).callprop(u'join', Js(u'{')).callprop(u'split', var.get(u'escClose')).callprop(u'join', Js(u'}')).callprop(u'split', var.get(u'escComma')).callprop(u'join', Js(u',')).callprop(u'split', var.get(u'escPeriod')).callprop(u'join', Js(u'.')) + PyJsHoisted_unescapeBraces_.func_name = u'unescapeBraces' + var.put(u'unescapeBraces', PyJsHoisted_unescapeBraces_) + @Js + def PyJsHoisted_embrace_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return ((Js(u'{')+var.get(u'str'))+Js(u'}')) + PyJsHoisted_embrace_.func_name = u'embrace' + var.put(u'embrace', PyJsHoisted_embrace_) + @Js + def PyJsHoisted_expand_(str, isTop, this, arguments, var=var): + var = Scope({u'this':this, u'isTop':isTop, u'arguments':arguments, u'str':str}, var) + var.registers([u'pre', u'm', u'isTop', u'need', u'incr', u'width', u'pad', u'test', u'isAlphaSequence', u'isSequence', u'expansion', u'N', u'post', u'c', u'isOptions', u'reverse', u'i', u'k', u'j', u'expansions', u'n', u'str', u'isNumericSequence', u'y', u'x', u'z']) + var.put(u'expansions', Js([])) + var.put(u'm', var.get(u'balanced')(Js(u'{'), Js(u'}'), var.get(u'str'))) + if (var.get(u'm').neg() or JsRegExp(u'/\\$$/').callprop(u'test', var.get(u'm').get(u'pre'))): + return Js([var.get(u'str')]) + var.put(u'isNumericSequence', JsRegExp(u'/^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/').callprop(u'test', var.get(u'm').get(u'body'))) + var.put(u'isAlphaSequence', JsRegExp(u'/^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/').callprop(u'test', var.get(u'm').get(u'body'))) + var.put(u'isSequence', (var.get(u'isNumericSequence') or var.get(u'isAlphaSequence'))) + var.put(u'isOptions', JsRegExp(u'/^(.*,)+(.+)?$/').callprop(u'test', var.get(u'm').get(u'body'))) + if (var.get(u'isSequence').neg() and var.get(u'isOptions').neg()): + if var.get(u'm').get(u'post').callprop(u'match', JsRegExp(u'/,.*\\}/')): + var.put(u'str', ((((var.get(u'm').get(u'pre')+Js(u'{'))+var.get(u'm').get(u'body'))+var.get(u'escClose'))+var.get(u'm').get(u'post'))) + return var.get(u'expand')(var.get(u'str')) + return Js([var.get(u'str')]) + pass + if var.get(u'isSequence'): + var.put(u'n', var.get(u'm').get(u'body').callprop(u'split', JsRegExp(u'/\\.\\./'))) + else: + var.put(u'n', var.get(u'parseCommaParts')(var.get(u'm').get(u'body'))) + if PyJsStrictEq(var.get(u'n').get(u'length'),Js(1.0)): + var.put(u'n', var.get(u'expand')(var.get(u'n').get(u'0'), Js(False)).callprop(u'map', var.get(u'embrace'))) + if PyJsStrictEq(var.get(u'n').get(u'length'),Js(1.0)): + var.put(u'post', (var.get(u'expand')(var.get(u'm').get(u'post'), Js(False)) if var.get(u'm').get(u'post').get(u'length') else Js([Js(u'')]))) + @Js + def PyJs_anonymous_3228_(p, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments}, var) + var.registers([u'p']) + return ((var.get(u'm').get(u'pre')+var.get(u'n').get(u'0'))+var.get(u'p')) + PyJs_anonymous_3228_._set_name(u'anonymous') + return var.get(u'post').callprop(u'map', PyJs_anonymous_3228_) + var.put(u'pre', var.get(u'm').get(u'pre')) + var.put(u'post', (var.get(u'expand')(var.get(u'm').get(u'post'), Js(False)) if var.get(u'm').get(u'post').get(u'length') else Js([Js(u'')]))) + pass + if var.get(u'isSequence'): + var.put(u'x', var.get(u'numeric')(var.get(u'n').get(u'0'))) + var.put(u'y', var.get(u'numeric')(var.get(u'n').get(u'1'))) + var.put(u'width', var.get(u'Math').callprop(u'max', var.get(u'n').get(u'0').get(u'length'), var.get(u'n').get(u'1').get(u'length'))) + var.put(u'incr', (var.get(u'Math').callprop(u'abs', var.get(u'numeric')(var.get(u'n').get(u'2'))) if (var.get(u'n').get(u'length')==Js(3.0)) else Js(1.0))) + var.put(u'test', var.get(u'lte')) + var.put(u'reverse', (var.get(u'y')<var.get(u'x'))) + if var.get(u'reverse'): + var.put(u'incr', (-Js(1.0)), u'*') + var.put(u'test', var.get(u'gte')) + var.put(u'pad', var.get(u'n').callprop(u'some', var.get(u'isPadded'))) + var.put(u'N', Js([])) + #for JS loop + var.put(u'i', var.get(u'x')) + while var.get(u'test')(var.get(u'i'), var.get(u'y')): + try: + pass + if var.get(u'isAlphaSequence'): + var.put(u'c', var.get(u'String').callprop(u'fromCharCode', var.get(u'i'))) + if PyJsStrictEq(var.get(u'c'),Js(u'\\')): + var.put(u'c', Js(u'')) + else: + var.put(u'c', var.get(u'String')(var.get(u'i'))) + if var.get(u'pad'): + var.put(u'need', (var.get(u'width')-var.get(u'c').get(u'length'))) + if (var.get(u'need')>Js(0.0)): + var.put(u'z', var.get(u'Array').create((var.get(u'need')+Js(1.0))).callprop(u'join', Js(u'0'))) + if (var.get(u'i')<Js(0.0)): + var.put(u'c', ((Js(u'-')+var.get(u'z'))+var.get(u'c').callprop(u'slice', Js(1.0)))) + else: + var.put(u'c', (var.get(u'z')+var.get(u'c'))) + var.get(u'N').callprop(u'push', var.get(u'c')) + finally: + var.put(u'i', var.get(u'incr'), u'+') + else: + @Js + def PyJs_anonymous_3229_(el, this, arguments, var=var): + var = Scope({u'this':this, u'el':el, u'arguments':arguments}, var) + var.registers([u'el']) + return var.get(u'expand')(var.get(u'el'), Js(False)) + PyJs_anonymous_3229_._set_name(u'anonymous') + var.put(u'N', var.get(u'concatMap')(var.get(u'n'), PyJs_anonymous_3229_)) + #for JS loop + var.put(u'j', Js(0.0)) + while (var.get(u'j')<var.get(u'N').get(u'length')): + try: + #for JS loop + var.put(u'k', Js(0.0)) + while (var.get(u'k')<var.get(u'post').get(u'length')): + try: + var.put(u'expansion', ((var.get(u'pre')+var.get(u'N').get(var.get(u'j')))+var.get(u'post').get(var.get(u'k')))) + if ((var.get(u'isTop').neg() or var.get(u'isSequence')) or var.get(u'expansion')): + var.get(u'expansions').callprop(u'push', var.get(u'expansion')) + finally: + (var.put(u'k',Js(var.get(u'k').to_number())+Js(1))-Js(1)) + finally: + (var.put(u'j',Js(var.get(u'j').to_number())+Js(1))-Js(1)) + return var.get(u'expansions') + PyJsHoisted_expand_.func_name = u'expand' + var.put(u'expand', PyJsHoisted_expand_) + @Js + def PyJsHoisted_isPadded_(el, this, arguments, var=var): + var = Scope({u'this':this, u'el':el, u'arguments':arguments}, var) + var.registers([u'el']) + return JsRegExp(u'/^-?0\\d/').callprop(u'test', var.get(u'el')) + PyJsHoisted_isPadded_.func_name = u'isPadded' + var.put(u'isPadded', PyJsHoisted_isPadded_) + @Js + def PyJsHoisted_parseCommaParts_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'pre', u'body', u'postParts', u'm', u'p', u'parts', u'str', u'post']) + if var.get(u'str').neg(): + return Js([Js(u'')]) + var.put(u'parts', Js([])) + var.put(u'm', var.get(u'balanced')(Js(u'{'), Js(u'}'), var.get(u'str'))) + if var.get(u'm').neg(): + return var.get(u'str').callprop(u'split', Js(u',')) + var.put(u'pre', var.get(u'm').get(u'pre')) + var.put(u'body', var.get(u'm').get(u'body')) + var.put(u'post', var.get(u'm').get(u'post')) + var.put(u'p', var.get(u'pre').callprop(u'split', Js(u','))) + var.get(u'p').put((var.get(u'p').get(u'length')-Js(1.0)), ((Js(u'{')+var.get(u'body'))+Js(u'}')), u'+') + var.put(u'postParts', var.get(u'parseCommaParts')(var.get(u'post'))) + if var.get(u'post').get(u'length'): + var.get(u'p').put((var.get(u'p').get(u'length')-Js(1.0)), var.get(u'postParts').callprop(u'shift'), u'+') + var.get(u'p').get(u'push').callprop(u'apply', var.get(u'p'), var.get(u'postParts')) + var.get(u'parts').get(u'push').callprop(u'apply', var.get(u'parts'), var.get(u'p')) + return var.get(u'parts') + PyJsHoisted_parseCommaParts_.func_name = u'parseCommaParts' + var.put(u'parseCommaParts', PyJsHoisted_parseCommaParts_) + @Js + def PyJsHoisted_identity_(e, this, arguments, var=var): + var = Scope({u'this':this, u'e':e, u'arguments':arguments}, var) + var.registers([u'e']) + return var.get(u'e') + PyJsHoisted_identity_.func_name = u'identity' + var.put(u'identity', PyJsHoisted_identity_) + @Js + def PyJsHoisted_gte_(i, y, this, arguments, var=var): + var = Scope({u'i':i, u'y':y, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'y']) + return (var.get(u'i')>=var.get(u'y')) + PyJsHoisted_gte_.func_name = u'gte' + var.put(u'gte', PyJsHoisted_gte_) + var.put(u'concatMap', var.get(u'require')(Js(u'concat-map'))) + var.put(u'balanced', var.get(u'require')(Js(u'balanced-match'))) + var.get(u'module').put(u'exports', var.get(u'expandTop')) + var.put(u'escSlash', ((Js(u'\x00SLASH')+var.get(u'Math').callprop(u'random'))+Js(u'\x00'))) + var.put(u'escOpen', ((Js(u'\x00OPEN')+var.get(u'Math').callprop(u'random'))+Js(u'\x00'))) + var.put(u'escClose', ((Js(u'\x00CLOSE')+var.get(u'Math').callprop(u'random'))+Js(u'\x00'))) + var.put(u'escComma', ((Js(u'\x00COMMA')+var.get(u'Math').callprop(u'random'))+Js(u'\x00'))) + var.put(u'escPeriod', ((Js(u'\x00PERIOD')+var.get(u'Math').callprop(u'random'))+Js(u'\x00'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_3227_._set_name(u'anonymous') +PyJs_Object_3230_ = Js({u'balanced-match':Js(263.0),u'concat-map':Js(266.0)}) +@Js +def PyJs_anonymous_3231_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_3232_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'styles', u'escapeStringRegexp', u'proto', u'process', u'applyStyle', u'hasAnsi', u'isSimpleWindowsTerm', u'Chalk', u'init', u'build', u'stripAnsi', u'ansiStyles', u'supportsColor', u'defineProps']) + @Js + def PyJsHoisted_Chalk_(options, this, arguments, var=var): + var = Scope({u'this':this, u'options':options, u'arguments':arguments}, var) + var.registers([u'options']) + var.get(u"this").put(u'enabled', (var.get(u'supportsColor') if (var.get(u'options').neg() or PyJsStrictEq(var.get(u'options').get(u'enabled'),var.get(u'undefined'))) else var.get(u'options').get(u'enabled'))) + PyJsHoisted_Chalk_.func_name = u'Chalk' + var.put(u'Chalk', PyJsHoisted_Chalk_) + @Js + def PyJsHoisted_applyStyle_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'a', u'nestedStyles', u'i', u'args', u'originalDim', u'code', u'str', u'argsLen']) + var.put(u'args', var.get(u'arguments')) + var.put(u'argsLen', var.get(u'args').get(u'length')) + var.put(u'str', (PyJsStrictNeq(var.get(u'argsLen'),Js(0.0)) and var.get(u'String')(var.get(u'arguments').get(u'0')))) + if (var.get(u'argsLen')>Js(1.0)): + #for JS loop + var.put(u'a', Js(1.0)) + while (var.get(u'a')<var.get(u'argsLen')): + try: + var.put(u'str', (Js(u' ')+var.get(u'args').get(var.get(u'a'))), u'+') + finally: + (var.put(u'a',Js(var.get(u'a').to_number())+Js(1))-Js(1)) + if (var.get(u"this").get(u'enabled').neg() or var.get(u'str').neg()): + return var.get(u'str') + var.put(u'nestedStyles', var.get(u"this").get(u'_styles')) + var.put(u'i', var.get(u'nestedStyles').get(u'length')) + var.put(u'originalDim', var.get(u'ansiStyles').get(u'dim').get(u'open')) + if (var.get(u'isSimpleWindowsTerm') and (PyJsStrictNeq(var.get(u'nestedStyles').callprop(u'indexOf', Js(u'gray')),(-Js(1.0))) or PyJsStrictNeq(var.get(u'nestedStyles').callprop(u'indexOf', Js(u'grey')),(-Js(1.0))))): + var.get(u'ansiStyles').get(u'dim').put(u'open', Js(u'')) + while (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)): + var.put(u'code', var.get(u'ansiStyles').get(var.get(u'nestedStyles').get(var.get(u'i')))) + var.put(u'str', ((var.get(u'code').get(u'open')+var.get(u'str').callprop(u'replace', var.get(u'code').get(u'closeRe'), var.get(u'code').get(u'open')))+var.get(u'code').get(u'close'))) + var.get(u'ansiStyles').get(u'dim').put(u'open', var.get(u'originalDim')) + return var.get(u'str') + PyJsHoisted_applyStyle_.func_name = u'applyStyle' + var.put(u'applyStyle', PyJsHoisted_applyStyle_) + @Js + def PyJsHoisted_init_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'ret']) + PyJs_Object_3240_ = Js({}) + var.put(u'ret', PyJs_Object_3240_) + @Js + def PyJs_anonymous_3241_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + @Js + def PyJs_anonymous_3243_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'build').callprop(u'call', var.get(u"this"), Js([var.get(u'name')])) + PyJs_anonymous_3243_._set_name(u'anonymous') + PyJs_Object_3242_ = Js({u'get':PyJs_anonymous_3243_}) + var.get(u'ret').put(var.get(u'name'), PyJs_Object_3242_) + PyJs_anonymous_3241_._set_name(u'anonymous') + var.get(u'Object').callprop(u'keys', var.get(u'styles')).callprop(u'forEach', PyJs_anonymous_3241_) + return var.get(u'ret') + PyJsHoisted_init_.func_name = u'init' + var.put(u'init', PyJsHoisted_init_) + @Js + def PyJsHoisted_build_(_styles, this, arguments, var=var): + var = Scope({u'this':this, u'_styles':_styles, u'arguments':arguments}, var) + var.registers([u'builder', u'_styles']) + @Js + def PyJs_anonymous_3239_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'applyStyle').callprop(u'apply', var.get(u'builder'), var.get(u'arguments')) + PyJs_anonymous_3239_._set_name(u'anonymous') + var.put(u'builder', PyJs_anonymous_3239_) + var.get(u'builder').put(u'_styles', var.get(u'_styles')) + var.get(u'builder').put(u'enabled', var.get(u"this").get(u'enabled')) + var.get(u'builder').put(u'__proto__', var.get(u'proto')) + return var.get(u'builder') + PyJsHoisted_build_.func_name = u'build' + var.put(u'build', PyJsHoisted_build_) + Js(u'use strict') + var.put(u'escapeStringRegexp', var.get(u'require')(Js(u'escape-string-regexp'))) + var.put(u'ansiStyles', var.get(u'require')(Js(u'ansi-styles'))) + var.put(u'stripAnsi', var.get(u'require')(Js(u'strip-ansi'))) + var.put(u'hasAnsi', var.get(u'require')(Js(u'has-ansi'))) + var.put(u'supportsColor', var.get(u'require')(Js(u'supports-color'))) + var.put(u'defineProps', var.get(u'Object').get(u'defineProperties')) + var.put(u'isSimpleWindowsTerm', (PyJsStrictEq(var.get(u'process').get(u'platform'),Js(u'win32')) and JsRegExp(u'/^xterm/i').callprop(u'test', var.get(u'process').get(u'env').get(u'TERM')).neg())) + pass + if var.get(u'isSimpleWindowsTerm'): + var.get(u'ansiStyles').get(u'blue').put(u'open', Js(u'\x1b[94m')) + @Js + def PyJs_anonymous_3233_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'ret']) + PyJs_Object_3234_ = Js({}) + var.put(u'ret', PyJs_Object_3234_) + @Js + def PyJs_anonymous_3235_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + var.get(u'ansiStyles').get(var.get(u'key')).put(u'closeRe', var.get(u'RegExp').create(var.get(u'escapeStringRegexp')(var.get(u'ansiStyles').get(var.get(u'key')).get(u'close')), Js(u'g'))) + @Js + def PyJs_anonymous_3237_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'build').callprop(u'call', var.get(u"this"), var.get(u"this").get(u'_styles').callprop(u'concat', var.get(u'key'))) + PyJs_anonymous_3237_._set_name(u'anonymous') + PyJs_Object_3236_ = Js({u'get':PyJs_anonymous_3237_}) + var.get(u'ret').put(var.get(u'key'), PyJs_Object_3236_) + PyJs_anonymous_3235_._set_name(u'anonymous') + var.get(u'Object').callprop(u'keys', var.get(u'ansiStyles')).callprop(u'forEach', PyJs_anonymous_3235_) + return var.get(u'ret') + PyJs_anonymous_3233_._set_name(u'anonymous') + var.put(u'styles', PyJs_anonymous_3233_()) + @Js + def PyJs_chalk_3238_(this, arguments, var=var): + var = Scope({u'this':this, u'chalk':PyJs_chalk_3238_, u'arguments':arguments}, var) + var.registers([]) + pass + PyJs_chalk_3238_._set_name(u'chalk') + var.put(u'proto', var.get(u'defineProps')(PyJs_chalk_3238_, var.get(u'styles'))) + pass + pass + pass + var.get(u'defineProps')(var.get(u'Chalk').get(u'prototype'), var.get(u'init')()) + var.get(u'module').put(u'exports', var.get(u'Chalk').create()) + var.get(u'module').get(u'exports').put(u'styles', var.get(u'ansiStyles')) + var.get(u'module').get(u'exports').put(u'hasColor', var.get(u'hasAnsi')) + var.get(u'module').get(u'exports').put(u'stripColor', var.get(u'stripAnsi')) + var.get(u'module').get(u'exports').put(u'supportsColor', var.get(u'supportsColor')) + PyJs_anonymous_3232_._set_name(u'anonymous') + PyJs_anonymous_3232_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_3231_._set_name(u'anonymous') +PyJs_Object_3244_ = Js({u'_process':Js(531.0),u'ansi-styles':Js(3.0),u'escape-string-regexp':Js(272.0),u'has-ansi':Js(279.0),u'strip-ansi':Js(520.0),u'supports-color':Js(521.0)}) +@Js +def PyJs_anonymous_3245_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_3246_(xs, fn, this, arguments, var=var): + var = Scope({u'this':this, u'xs':xs, u'arguments':arguments, u'fn':fn}, var) + var.registers([u'i', u'res', u'xs', u'fn', u'x']) + var.put(u'res', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'xs').get(u'length')): + try: + var.put(u'x', var.get(u'fn')(var.get(u'xs').get(var.get(u'i')), var.get(u'i'))) + if var.get(u'isArray')(var.get(u'x')): + var.get(u'res').get(u'push').callprop(u'apply', var.get(u'res'), var.get(u'x')) + else: + var.get(u'res').callprop(u'push', var.get(u'x')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'res') + PyJs_anonymous_3246_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_3246_) + @Js + def PyJs_anonymous_3247_(xs, this, arguments, var=var): + var = Scope({u'this':this, u'xs':xs, u'arguments':arguments}, var) + var.registers([u'xs']) + return PyJsStrictEq(var.get(u'Object').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'xs')),Js(u'[object Array]')) + PyJs_anonymous_3247_._set_name(u'anonymous') + var.put(u'isArray', (var.get(u'Array').get(u'isArray') or PyJs_anonymous_3247_)) +PyJs_anonymous_3245_._set_name(u'anonymous') +PyJs_Object_3248_ = Js({}) +@Js +def PyJs_anonymous_3249_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_3250_(Buffer, this, arguments, var=var): + var = Scope({u'Buffer':Buffer, u'this':this, u'arguments':arguments}, var) + var.registers([u'fs', u'commentRx', u'Converter', u'Buffer', u'decodeBase64', u'stripComment', u'convertFromLargeSource', u'path', u'readFromFileMap', u'mapFileCommentRx']) + @Js + def PyJsHoisted_decodeBase64_(base64, this, arguments, var=var): + var = Scope({u'this':this, u'base64':base64, u'arguments':arguments}, var) + var.registers([u'base64']) + return var.get(u'Buffer').create(var.get(u'base64'), Js(u'base64')).callprop(u'toString') + PyJsHoisted_decodeBase64_.func_name = u'decodeBase64' + var.put(u'decodeBase64', PyJsHoisted_decodeBase64_) + @Js + def PyJsHoisted_readFromFileMap_(sm, dir, this, arguments, var=var): + var = Scope({u'this':this, u'dir':dir, u'sm':sm, u'arguments':arguments}, var) + var.registers([u'r', u'dir', u'filepath', u'sm', u'filename']) + var.put(u'r', var.get(u'mapFileCommentRx').callprop(u'exec', var.get(u'sm'))) + var.get(u'mapFileCommentRx').put(u'lastIndex', Js(0.0)) + var.put(u'filename', (var.get(u'r').get(u'1') or var.get(u'r').get(u'2'))) + var.put(u'filepath', var.get(u'path').callprop(u'resolve', var.get(u'dir'), var.get(u'filename'))) + try: + return var.get(u'fs').callprop(u'readFileSync', var.get(u'filepath'), Js(u'utf8')) + except PyJsException as PyJsTempException: + PyJsHolder_65_62339762 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + PyJsTempException = JsToPyException(var.get(u'Error').create((((Js(u'An error occurred while trying to read the map file at ')+var.get(u'filepath'))+Js(u'\n'))+var.get(u'e')))) + raise PyJsTempException + finally: + if PyJsHolder_65_62339762 is not None: + var.own[u'e'] = PyJsHolder_65_62339762 + else: + del var.own[u'e'] + del PyJsHolder_65_62339762 + PyJsHoisted_readFromFileMap_.func_name = u'readFromFileMap' + var.put(u'readFromFileMap', PyJsHoisted_readFromFileMap_) + @Js + def PyJsHoisted_stripComment_(sm, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'sm':sm}, var) + var.registers([u'sm']) + return var.get(u'sm').callprop(u'split', Js(u',')).callprop(u'pop') + PyJsHoisted_stripComment_.func_name = u'stripComment' + var.put(u'stripComment', PyJsHoisted_stripComment_) + @Js + def PyJsHoisted_convertFromLargeSource_(content, this, arguments, var=var): + var = Scope({u'content':content, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'content', u'line', u'lines']) + var.put(u'lines', var.get(u'content').callprop(u'split', Js(u'\n'))) + pass + #for JS loop + var.put(u'i', (var.get(u'lines').get(u'length')-Js(1.0))) + while (var.get(u'i')>Js(0.0)): + try: + var.put(u'line', var.get(u'lines').get(var.get(u'i'))) + if (~var.get(u'line').callprop(u'indexOf', Js(u'sourceMappingURL=data:'))): + return var.get(u'exports').callprop(u'fromComment', var.get(u'line')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + PyJsHoisted_convertFromLargeSource_.func_name = u'convertFromLargeSource' + var.put(u'convertFromLargeSource', PyJsHoisted_convertFromLargeSource_) + @Js + def PyJsHoisted_Converter_(sm, opts, this, arguments, var=var): + var = Scope({u'this':this, u'opts':opts, u'sm':sm, u'arguments':arguments}, var) + var.registers([u'opts', u'sm']) + PyJs_Object_3251_ = Js({}) + var.put(u'opts', (var.get(u'opts') or PyJs_Object_3251_)) + if var.get(u'opts').get(u'isFileComment'): + var.put(u'sm', var.get(u'readFromFileMap')(var.get(u'sm'), var.get(u'opts').get(u'commentFileDir'))) + if var.get(u'opts').get(u'hasComment'): + var.put(u'sm', var.get(u'stripComment')(var.get(u'sm'))) + if var.get(u'opts').get(u'isEncoded'): + var.put(u'sm', var.get(u'decodeBase64')(var.get(u'sm'))) + if (var.get(u'opts').get(u'isJSON') or var.get(u'opts').get(u'isEncoded')): + var.put(u'sm', var.get(u'JSON').callprop(u'parse', var.get(u'sm'))) + var.get(u"this").put(u'sourcemap', var.get(u'sm')) + PyJsHoisted_Converter_.func_name = u'Converter' + var.put(u'Converter', PyJsHoisted_Converter_) + Js(u'use strict') + var.put(u'fs', var.get(u'require')(Js(u'fs'))) + var.put(u'path', var.get(u'require')(Js(u'path'))) + var.put(u'commentRx', JsRegExp(u'/^\\s*\\/(?:\\/|\\*)[@#]\\s+sourceMappingURL=data:(?:application|text)\\/json;(?:charset[:=]\\S+;)?base64,(.*)$/mg')) + var.put(u'mapFileCommentRx', JsRegExp(u'/(?:\\/\\/[@#][ \\t]+sourceMappingURL=([^\\s\'"]+?)[ \\t]*$)|(?:\\/\\*[@#][ \\t]+sourceMappingURL=([^\\*]+?)[ \\t]*(?:\\*\\/){1}[ \\t]*$)/mg')) + pass + pass + pass + pass + pass + @Js + def PyJs_anonymous_3252_(space, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'space':space}, var) + var.registers([u'space']) + return var.get(u'JSON').callprop(u'stringify', var.get(u"this").get(u'sourcemap'), var.get(u"null"), var.get(u'space')) + PyJs_anonymous_3252_._set_name(u'anonymous') + var.get(u'Converter').get(u'prototype').put(u'toJSON', PyJs_anonymous_3252_) + @Js + def PyJs_anonymous_3253_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'json']) + var.put(u'json', var.get(u"this").callprop(u'toJSON')) + return var.get(u'Buffer').create(var.get(u'json')).callprop(u'toString', Js(u'base64')) + PyJs_anonymous_3253_._set_name(u'anonymous') + var.get(u'Converter').get(u'prototype').put(u'toBase64', PyJs_anonymous_3253_) + @Js + def PyJs_anonymous_3254_(options, this, arguments, var=var): + var = Scope({u'this':this, u'options':options, u'arguments':arguments}, var) + var.registers([u'base64', u'data', u'options']) + var.put(u'base64', var.get(u"this").callprop(u'toBase64')) + var.put(u'data', (Js(u'sourceMappingURL=data:application/json;base64,')+var.get(u'base64'))) + return (((Js(u'/*# ')+var.get(u'data'))+Js(u' */')) if (var.get(u'options') and var.get(u'options').get(u'multiline')) else (Js(u'//# ')+var.get(u'data'))) + PyJs_anonymous_3254_._set_name(u'anonymous') + var.get(u'Converter').get(u'prototype').put(u'toComment', PyJs_anonymous_3254_) + @Js + def PyJs_anonymous_3255_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'JSON').callprop(u'parse', var.get(u"this").callprop(u'toJSON')) + PyJs_anonymous_3255_._set_name(u'anonymous') + var.get(u'Converter').get(u'prototype').put(u'toObject', PyJs_anonymous_3255_) + @Js + def PyJs_anonymous_3256_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + if var.get(u"this").get(u'sourcemap').callprop(u'hasOwnProperty', var.get(u'key')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'property %s already exists on the sourcemap, use set property instead'))) + raise PyJsTempException + return var.get(u"this").callprop(u'setProperty', var.get(u'key'), var.get(u'value')) + PyJs_anonymous_3256_._set_name(u'anonymous') + var.get(u'Converter').get(u'prototype').put(u'addProperty', PyJs_anonymous_3256_) + @Js + def PyJs_anonymous_3257_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + var.get(u"this").get(u'sourcemap').put(var.get(u'key'), var.get(u'value')) + return var.get(u"this") + PyJs_anonymous_3257_._set_name(u'anonymous') + var.get(u'Converter').get(u'prototype').put(u'setProperty', PyJs_anonymous_3257_) + @Js + def PyJs_anonymous_3258_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u"this").get(u'sourcemap').get(var.get(u'key')) + PyJs_anonymous_3258_._set_name(u'anonymous') + var.get(u'Converter').get(u'prototype').put(u'getProperty', PyJs_anonymous_3258_) + @Js + def PyJs_anonymous_3259_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return var.get(u'Converter').create(var.get(u'obj')) + PyJs_anonymous_3259_._set_name(u'anonymous') + var.get(u'exports').put(u'fromObject', PyJs_anonymous_3259_) + @Js + def PyJs_anonymous_3260_(json, this, arguments, var=var): + var = Scope({u'this':this, u'json':json, u'arguments':arguments}, var) + var.registers([u'json']) + PyJs_Object_3261_ = Js({u'isJSON':var.get(u'true')}) + return var.get(u'Converter').create(var.get(u'json'), PyJs_Object_3261_) + PyJs_anonymous_3260_._set_name(u'anonymous') + var.get(u'exports').put(u'fromJSON', PyJs_anonymous_3260_) + @Js + def PyJs_anonymous_3262_(base64, this, arguments, var=var): + var = Scope({u'this':this, u'base64':base64, u'arguments':arguments}, var) + var.registers([u'base64']) + PyJs_Object_3263_ = Js({u'isEncoded':var.get(u'true')}) + return var.get(u'Converter').create(var.get(u'base64'), PyJs_Object_3263_) + PyJs_anonymous_3262_._set_name(u'anonymous') + var.get(u'exports').put(u'fromBase64', PyJs_anonymous_3262_) + @Js + def PyJs_anonymous_3264_(comment, this, arguments, var=var): + var = Scope({u'comment':comment, u'this':this, u'arguments':arguments}, var) + var.registers([u'comment']) + var.put(u'comment', var.get(u'comment').callprop(u'replace', JsRegExp(u'/^\\/\\*/g'), Js(u'//')).callprop(u'replace', JsRegExp(u'/\\*\\/$/g'), Js(u''))) + PyJs_Object_3265_ = Js({u'isEncoded':var.get(u'true'),u'hasComment':var.get(u'true')}) + return var.get(u'Converter').create(var.get(u'comment'), PyJs_Object_3265_) + PyJs_anonymous_3264_._set_name(u'anonymous') + var.get(u'exports').put(u'fromComment', PyJs_anonymous_3264_) + @Js + def PyJs_anonymous_3266_(comment, dir, this, arguments, var=var): + var = Scope({u'comment':comment, u'this':this, u'arguments':arguments, u'dir':dir}, var) + var.registers([u'comment', u'dir']) + PyJs_Object_3267_ = Js({u'commentFileDir':var.get(u'dir'),u'isFileComment':var.get(u'true'),u'isJSON':var.get(u'true')}) + return var.get(u'Converter').create(var.get(u'comment'), PyJs_Object_3267_) + PyJs_anonymous_3266_._set_name(u'anonymous') + var.get(u'exports').put(u'fromMapFileComment', PyJs_anonymous_3266_) + @Js + def PyJs_anonymous_3268_(content, largeSource, this, arguments, var=var): + var = Scope({u'content':content, u'this':this, u'largeSource':largeSource, u'arguments':arguments}, var) + var.registers([u'content', u'res', u'm', u'largeSource']) + if var.get(u'largeSource'): + var.put(u'res', var.get(u'convertFromLargeSource')(var.get(u'content'))) + return (var.get(u'res') if var.get(u'res') else var.get(u"null")) + var.put(u'm', var.get(u'content').callprop(u'match', var.get(u'commentRx'))) + var.get(u'commentRx').put(u'lastIndex', Js(0.0)) + return (var.get(u'exports').callprop(u'fromComment', var.get(u'm').callprop(u'pop')) if var.get(u'm') else var.get(u"null")) + PyJs_anonymous_3268_._set_name(u'anonymous') + var.get(u'exports').put(u'fromSource', PyJs_anonymous_3268_) + @Js + def PyJs_anonymous_3269_(content, dir, this, arguments, var=var): + var = Scope({u'content':content, u'this':this, u'arguments':arguments, u'dir':dir}, var) + var.registers([u'content', u'm', u'dir']) + var.put(u'm', var.get(u'content').callprop(u'match', var.get(u'mapFileCommentRx'))) + var.get(u'mapFileCommentRx').put(u'lastIndex', Js(0.0)) + return (var.get(u'exports').callprop(u'fromMapFileComment', var.get(u'm').callprop(u'pop'), var.get(u'dir')) if var.get(u'm') else var.get(u"null")) + PyJs_anonymous_3269_._set_name(u'anonymous') + var.get(u'exports').put(u'fromMapFileSource', PyJs_anonymous_3269_) + @Js + def PyJs_anonymous_3270_(src, this, arguments, var=var): + var = Scope({u'this':this, u'src':src, u'arguments':arguments}, var) + var.registers([u'src']) + var.get(u'commentRx').put(u'lastIndex', Js(0.0)) + return var.get(u'src').callprop(u'replace', var.get(u'commentRx'), Js(u'')) + PyJs_anonymous_3270_._set_name(u'anonymous') + var.get(u'exports').put(u'removeComments', PyJs_anonymous_3270_) + @Js + def PyJs_anonymous_3271_(src, this, arguments, var=var): + var = Scope({u'this':this, u'src':src, u'arguments':arguments}, var) + var.registers([u'src']) + var.get(u'mapFileCommentRx').put(u'lastIndex', Js(0.0)) + return var.get(u'src').callprop(u'replace', var.get(u'mapFileCommentRx'), Js(u'')) + PyJs_anonymous_3271_._set_name(u'anonymous') + var.get(u'exports').put(u'removeMapFileComments', PyJs_anonymous_3271_) + @Js + def PyJs_anonymous_3272_(file, options, this, arguments, var=var): + var = Scope({u'this':this, u'options':options, u'file':file, u'arguments':arguments}, var) + var.registers([u'data', u'options', u'file']) + var.put(u'data', (Js(u'sourceMappingURL=')+var.get(u'file'))) + return (((Js(u'/*# ')+var.get(u'data'))+Js(u' */')) if (var.get(u'options') and var.get(u'options').get(u'multiline')) else (Js(u'//# ')+var.get(u'data'))) + PyJs_anonymous_3272_._set_name(u'anonymous') + var.get(u'exports').put(u'generateMapFileComment', PyJs_anonymous_3272_) + @Js + def PyJs_getCommentRegex_3274_(this, arguments, var=var): + var = Scope({u'this':this, u'getCommentRegex':PyJs_getCommentRegex_3274_, u'arguments':arguments}, var) + var.registers([]) + var.get(u'commentRx').put(u'lastIndex', Js(0.0)) + return var.get(u'commentRx') + PyJs_getCommentRegex_3274_._set_name(u'getCommentRegex') + PyJs_Object_3273_ = Js({u'get':PyJs_getCommentRegex_3274_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'commentRegex'), PyJs_Object_3273_) + @Js + def PyJs_getMapFileCommentRegex_3276_(this, arguments, var=var): + var = Scope({u'this':this, u'getMapFileCommentRegex':PyJs_getMapFileCommentRegex_3276_, u'arguments':arguments}, var) + var.registers([]) + var.get(u'mapFileCommentRx').put(u'lastIndex', Js(0.0)) + return var.get(u'mapFileCommentRx') + PyJs_getMapFileCommentRegex_3276_._set_name(u'getMapFileCommentRegex') + PyJs_Object_3275_ = Js({u'get':PyJs_getMapFileCommentRegex_3276_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'mapFileCommentRegex'), PyJs_Object_3275_) + PyJs_anonymous_3250_._set_name(u'anonymous') + PyJs_anonymous_3250_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'buffer')).get(u'Buffer')) +PyJs_anonymous_3249_._set_name(u'anonymous') +PyJs_Object_3277_ = Js({u'buffer':Js(525.0),u'fs':Js(523.0),u'path':Js(530.0)}) +@Js +def PyJs_anonymous_3278_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'load', u'exports', u'log', u'formatArgs', u'require', u'module', u'localstorage', u'useColors', u'save']) + @Js + def PyJsHoisted_load_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'r']) + pass + try: + var.put(u'r', var.get(u'exports').get(u'storage').get(u'debug')) + except PyJsException as PyJsTempException: + PyJsHolder_65_27913289 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_27913289 is not None: + var.own[u'e'] = PyJsHolder_65_27913289 + else: + del var.own[u'e'] + del PyJsHolder_65_27913289 + return var.get(u'r') + PyJsHoisted_load_.func_name = u'load' + var.put(u'load', PyJsHoisted_load_) + @Js + def PyJsHoisted_log_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return ((PyJsStrictEq(Js(u'object'),var.get(u'console',throw=False).typeof()) and var.get(u'console').get(u'log')) and var.get(u'Function').get(u'prototype').get(u'apply').callprop(u'call', var.get(u'console').get(u'log'), var.get(u'console'), var.get(u'arguments'))) + PyJsHoisted_log_.func_name = u'log' + var.put(u'log', PyJsHoisted_log_) + @Js + def PyJsHoisted_formatArgs_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'useColors', u'index', u'c', u'args', u'lastC']) + var.put(u'args', var.get(u'arguments')) + var.put(u'useColors', var.get(u"this").get(u'useColors')) + var.get(u'args').put(u'0', (((((((Js(u'%c') if var.get(u'useColors') else Js(u''))+var.get(u"this").get(u'namespace'))+(Js(u' %c') if var.get(u'useColors') else Js(u' ')))+var.get(u'args').get(u'0'))+(Js(u'%c ') if var.get(u'useColors') else Js(u' ')))+Js(u'+'))+var.get(u'exports').callprop(u'humanize', var.get(u"this").get(u'diff')))) + if var.get(u'useColors').neg(): + return var.get(u'args') + var.put(u'c', (Js(u'color: ')+var.get(u"this").get(u'color'))) + var.put(u'args', Js([var.get(u'args').get(u'0'), var.get(u'c'), Js(u'color: inherit')]).callprop(u'concat', var.get(u'Array').get(u'prototype').get(u'slice').callprop(u'call', var.get(u'args'), Js(1.0)))) + var.put(u'index', Js(0.0)) + var.put(u'lastC', Js(0.0)) + @Js + def PyJs_anonymous_3281_(match, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'match':match}, var) + var.registers([u'match']) + if PyJsStrictEq(Js(u'%%'),var.get(u'match')): + return var.get('undefined') + (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)) + if PyJsStrictEq(Js(u'%c'),var.get(u'match')): + var.put(u'lastC', var.get(u'index')) + PyJs_anonymous_3281_._set_name(u'anonymous') + var.get(u'args').get(u'0').callprop(u'replace', JsRegExp(u'/%[a-z%]/g'), PyJs_anonymous_3281_) + var.get(u'args').callprop(u'splice', var.get(u'lastC'), Js(0.0), var.get(u'c')) + return var.get(u'args') + PyJsHoisted_formatArgs_.func_name = u'formatArgs' + var.put(u'formatArgs', PyJsHoisted_formatArgs_) + @Js + def PyJsHoisted_localstorage_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + try: + return var.get(u'window').get(u'localStorage') + except PyJsException as PyJsTempException: + PyJsHolder_65_8009014 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_8009014 is not None: + var.own[u'e'] = PyJsHolder_65_8009014 + else: + del var.own[u'e'] + del PyJsHolder_65_8009014 + PyJsHoisted_localstorage_.func_name = u'localstorage' + var.put(u'localstorage', PyJsHoisted_localstorage_) + @Js + def PyJsHoisted_useColors_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + def PyJs_LONG_3279_(var=var): + return ((var.get(u'document').get(u'documentElement').get(u'style').contains(Js(u'WebkitAppearance')) or (var.get(u'window').get(u'console') and (var.get(u'console').get(u'firebug') or (var.get(u'console').get(u'exception') and var.get(u'console').get(u'table'))))) or (var.get(u'navigator').get(u'userAgent').callprop(u'toLowerCase').callprop(u'match', JsRegExp(u'/firefox\\/(\\d+)/')) and (var.get(u'parseInt')(var.get(u'RegExp').get(u'$1'), Js(10.0))>=Js(31.0)))) + return PyJs_LONG_3279_() + PyJsHoisted_useColors_.func_name = u'useColors' + var.put(u'useColors', PyJsHoisted_useColors_) + @Js + def PyJsHoisted_save_(namespaces, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'namespaces':namespaces}, var) + var.registers([u'namespaces']) + try: + if (var.get(u"null")==var.get(u'namespaces')): + var.get(u'exports').get(u'storage').callprop(u'removeItem', Js(u'debug')) + else: + var.get(u'exports').get(u'storage').put(u'debug', var.get(u'namespaces')) + except PyJsException as PyJsTempException: + PyJsHolder_65_85910939 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_85910939 is not None: + var.own[u'e'] = PyJsHolder_65_85910939 + else: + del var.own[u'e'] + del PyJsHolder_65_85910939 + PyJsHoisted_save_.func_name = u'save' + var.put(u'save', PyJsHoisted_save_) + var.put(u'exports', var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./debug')))) + var.get(u'exports').put(u'log', var.get(u'log')) + var.get(u'exports').put(u'formatArgs', var.get(u'formatArgs')) + var.get(u'exports').put(u'save', var.get(u'save')) + var.get(u'exports').put(u'load', var.get(u'load')) + var.get(u'exports').put(u'useColors', var.get(u'useColors')) + var.get(u'exports').put(u'storage', (var.get(u'chrome').get(u'storage').get(u'local') if ((Js(u'undefined')!=var.get(u'chrome',throw=False).typeof()) and (Js(u'undefined')!=var.get(u'chrome').get(u'storage').typeof())) else var.get(u'localstorage')())) + var.get(u'exports').put(u'colors', Js([Js(u'lightseagreen'), Js(u'forestgreen'), Js(u'goldenrod'), Js(u'dodgerblue'), Js(u'darkorchid'), Js(u'crimson')])) + pass + @Js + def PyJs_anonymous_3280_(v, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'v':v}, var) + var.registers([u'v']) + return var.get(u'JSON').callprop(u'stringify', var.get(u'v')) + PyJs_anonymous_3280_._set_name(u'anonymous') + var.get(u'exports').get(u'formatters').put(u'j', PyJs_anonymous_3280_) + pass + pass + pass + pass + var.get(u'exports').callprop(u'enable', var.get(u'load')()) + pass +PyJs_anonymous_3278_._set_name(u'anonymous') +PyJs_Object_3282_ = Js({u'./debug':Js(269.0)}) +@Js +def PyJs_anonymous_3283_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'enable', u'require', u'enabled', u'selectColor', u'coerce', u'disable', u'module', u'debug', u'prevColor', u'prevTime']) + @Js + def PyJsHoisted_enable_(namespaces, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'namespaces':namespaces}, var) + var.registers([u'i', u'namespaces', u'split', u'len']) + var.get(u'exports').callprop(u'save', var.get(u'namespaces')) + var.put(u'split', (var.get(u'namespaces') or Js(u'')).callprop(u'split', JsRegExp(u'/[\\s,]+/'))) + var.put(u'len', var.get(u'split').get(u'length')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'len')): + try: + if var.get(u'split').get(var.get(u'i')).neg(): + continue + var.put(u'namespaces', var.get(u'split').get(var.get(u'i')).callprop(u'replace', JsRegExp(u'/\\*/g'), Js(u'.*?'))) + if PyJsStrictEq(var.get(u'namespaces').get(u'0'),Js(u'-')): + var.get(u'exports').get(u'skips').callprop(u'push', var.get(u'RegExp').create(((Js(u'^')+var.get(u'namespaces').callprop(u'substr', Js(1.0)))+Js(u'$')))) + else: + var.get(u'exports').get(u'names').callprop(u'push', var.get(u'RegExp').create(((Js(u'^')+var.get(u'namespaces'))+Js(u'$')))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJsHoisted_enable_.func_name = u'enable' + var.put(u'enable', PyJsHoisted_enable_) + @Js + def PyJsHoisted_enabled_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'i', u'name', u'len']) + pass + #for JS loop + PyJsComma(var.put(u'i', Js(0.0)),var.put(u'len', var.get(u'exports').get(u'skips').get(u'length'))) + while (var.get(u'i')<var.get(u'len')): + try: + if var.get(u'exports').get(u'skips').get(var.get(u'i')).callprop(u'test', var.get(u'name')): + return Js(False) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + #for JS loop + PyJsComma(var.put(u'i', Js(0.0)),var.put(u'len', var.get(u'exports').get(u'names').get(u'length'))) + while (var.get(u'i')<var.get(u'len')): + try: + if var.get(u'exports').get(u'names').get(var.get(u'i')).callprop(u'test', var.get(u'name')): + return var.get(u'true') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return Js(False) + PyJsHoisted_enabled_.func_name = u'enabled' + var.put(u'enabled', PyJsHoisted_enabled_) + @Js + def PyJsHoisted_selectColor_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'exports').get(u'colors').get(((var.put(u'prevColor',Js(var.get(u'prevColor').to_number())+Js(1))-Js(1))%var.get(u'exports').get(u'colors').get(u'length'))) + PyJsHoisted_selectColor_.func_name = u'selectColor' + var.put(u'selectColor', PyJsHoisted_selectColor_) + @Js + def PyJsHoisted_coerce_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + if var.get(u'val').instanceof(var.get(u'Error')): + return (var.get(u'val').get(u'stack') or var.get(u'val').get(u'message')) + return var.get(u'val') + PyJsHoisted_coerce_.func_name = u'coerce' + var.put(u'coerce', PyJsHoisted_coerce_) + @Js + def PyJsHoisted_disable_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'exports').callprop(u'enable', Js(u'')) + PyJsHoisted_disable_.func_name = u'disable' + var.put(u'disable', PyJsHoisted_disable_) + @Js + def PyJsHoisted_debug_(namespace, this, arguments, var=var): + var = Scope({u'this':this, u'namespace':namespace, u'arguments':arguments}, var) + var.registers([u'disabled', u'namespace', u'enabled', u'fn']) + @Js + def PyJsHoisted_disabled_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJsHoisted_disabled_.func_name = u'disabled' + var.put(u'disabled', PyJsHoisted_disabled_) + @Js + def PyJsHoisted_enabled_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'index', u'curr', u'self', u'args', u'ms', u'logFn']) + var.put(u'self', var.get(u'enabled')) + var.put(u'curr', (+var.get(u'Date').create())) + var.put(u'ms', (var.get(u'curr')-(var.get(u'prevTime') or var.get(u'curr')))) + var.get(u'self').put(u'diff', var.get(u'ms')) + var.get(u'self').put(u'prev', var.get(u'prevTime')) + var.get(u'self').put(u'curr', var.get(u'curr')) + var.put(u'prevTime', var.get(u'curr')) + if (var.get(u"null")==var.get(u'self').get(u'useColors')): + var.get(u'self').put(u'useColors', var.get(u'exports').callprop(u'useColors')) + if ((var.get(u"null")==var.get(u'self').get(u'color')) and var.get(u'self').get(u'useColors')): + var.get(u'self').put(u'color', var.get(u'selectColor')()) + var.put(u'args', var.get(u'Array').get(u'prototype').get(u'slice').callprop(u'call', var.get(u'arguments'))) + var.get(u'args').put(u'0', var.get(u'exports').callprop(u'coerce', var.get(u'args').get(u'0'))) + if PyJsStrictNeq(Js(u'string'),var.get(u'args').get(u'0').typeof()): + var.put(u'args', Js([Js(u'%o')]).callprop(u'concat', var.get(u'args'))) + var.put(u'index', Js(0.0)) + @Js + def PyJs_anonymous_3285_(match, format, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'match':match, u'format':format}, var) + var.registers([u'formatter', u'match', u'val', u'format']) + if PyJsStrictEq(var.get(u'match'),Js(u'%%')): + return var.get(u'match') + (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)) + var.put(u'formatter', var.get(u'exports').get(u'formatters').get(var.get(u'format'))) + if PyJsStrictEq(Js(u'function'),var.get(u'formatter',throw=False).typeof()): + var.put(u'val', var.get(u'args').get(var.get(u'index'))) + var.put(u'match', var.get(u'formatter').callprop(u'call', var.get(u'self'), var.get(u'val'))) + var.get(u'args').callprop(u'splice', var.get(u'index'), Js(1.0)) + (var.put(u'index',Js(var.get(u'index').to_number())-Js(1))+Js(1)) + return var.get(u'match') + PyJs_anonymous_3285_._set_name(u'anonymous') + var.get(u'args').put(u'0', var.get(u'args').get(u'0').callprop(u'replace', JsRegExp(u'/%([a-z%])/g'), PyJs_anonymous_3285_)) + if PyJsStrictEq(Js(u'function'),var.get(u'exports').get(u'formatArgs').typeof()): + var.put(u'args', var.get(u'exports').get(u'formatArgs').callprop(u'apply', var.get(u'self'), var.get(u'args'))) + var.put(u'logFn', ((var.get(u'enabled').get(u'log') or var.get(u'exports').get(u'log')) or var.get(u'console').get(u'log').callprop(u'bind', var.get(u'console')))) + var.get(u'logFn').callprop(u'apply', var.get(u'self'), var.get(u'args')) + PyJsHoisted_enabled_.func_name = u'enabled' + var.put(u'enabled', PyJsHoisted_enabled_) + pass + var.get(u'disabled').put(u'enabled', Js(False)) + pass + var.get(u'enabled').put(u'enabled', var.get(u'true')) + var.put(u'fn', (var.get(u'enabled') if var.get(u'exports').callprop(u'enabled', var.get(u'namespace')) else var.get(u'disabled'))) + var.get(u'fn').put(u'namespace', var.get(u'namespace')) + return var.get(u'fn') + PyJsHoisted_debug_.func_name = u'debug' + var.put(u'debug', PyJsHoisted_debug_) + var.put(u'exports', var.get(u'module').put(u'exports', var.get(u'debug'))) + var.get(u'exports').put(u'coerce', var.get(u'coerce')) + var.get(u'exports').put(u'disable', var.get(u'disable')) + var.get(u'exports').put(u'enable', var.get(u'enable')) + var.get(u'exports').put(u'enabled', var.get(u'enabled')) + var.get(u'exports').put(u'humanize', var.get(u'require')(Js(u'ms'))) + var.get(u'exports').put(u'names', Js([])) + var.get(u'exports').put(u'skips', Js([])) + PyJs_Object_3284_ = Js({}) + var.get(u'exports').put(u'formatters', PyJs_Object_3284_) + var.put(u'prevColor', Js(0.0)) + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_3283_._set_name(u'anonymous') +PyJs_Object_3286_ = Js({u'ms':Js(497.0)}) +@Js +def PyJs_anonymous_3287_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_3288_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'load', u'tty', u'log', u'stream', u'formatArgs', u'inspect', u'util', u'process', u'createWritableStdioStream', u'fd', u'useColors', u'save']) + @Js + def PyJsHoisted_load_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'process').get(u'env').get(u'DEBUG') + PyJsHoisted_load_.func_name = u'load' + var.put(u'load', PyJsHoisted_load_) + @Js + def PyJsHoisted_log_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'stream').callprop(u'write', (var.get(u'util').get(u'format').callprop(u'apply', var.get(u"this"), var.get(u'arguments'))+Js(u'\n'))) + PyJsHoisted_log_.func_name = u'log' + var.put(u'log', PyJsHoisted_log_) + @Js + def PyJsHoisted_formatArgs_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'useColors', u'c', u'args', u'name']) + var.put(u'args', var.get(u'arguments')) + var.put(u'useColors', var.get(u"this").get(u'useColors')) + var.put(u'name', var.get(u"this").get(u'namespace')) + if var.get(u'useColors'): + var.put(u'c', var.get(u"this").get(u'color')) + var.get(u'args').put(u'0', ((((((((((((Js(u' \x1b[3')+var.get(u'c'))+Js(u';1m'))+var.get(u'name'))+Js(u' '))+Js(u'\x1b[0m'))+var.get(u'args').get(u'0'))+Js(u'\x1b[3'))+var.get(u'c'))+Js(u'm'))+Js(u' +'))+var.get(u'exports').callprop(u'humanize', var.get(u"this").get(u'diff')))+Js(u'\x1b[0m'))) + else: + var.get(u'args').put(u'0', ((((var.get(u'Date').create().callprop(u'toUTCString')+Js(u' '))+var.get(u'name'))+Js(u' '))+var.get(u'args').get(u'0'))) + return var.get(u'args') + PyJsHoisted_formatArgs_.func_name = u'formatArgs' + var.put(u'formatArgs', PyJsHoisted_formatArgs_) + @Js + def PyJsHoisted_createWritableStdioStream_(fd, this, arguments, var=var): + var = Scope({u'this':this, u'fd':fd, u'arguments':arguments}, var) + var.registers([u'tty_wrap', u'net', u'fs', u'fd', u'stream']) + pass + var.put(u'tty_wrap', var.get(u'process').callprop(u'binding', Js(u'tty_wrap'))) + while 1: + SWITCHED = False + CONDITION = (var.get(u'tty_wrap').callprop(u'guessHandleType', var.get(u'fd'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'TTY')): + SWITCHED = True + var.put(u'stream', var.get(u'tty').get(u'WriteStream').create(var.get(u'fd'))) + var.get(u'stream').put(u'_type', Js(u'tty')) + if (var.get(u'stream').get(u'_handle') and var.get(u'stream').get(u'_handle').get(u'unref')): + var.get(u'stream').get(u'_handle').callprop(u'unref') + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'FILE')): + SWITCHED = True + var.put(u'fs', var.get(u'require')(Js(u'fs'))) + PyJs_Object_3293_ = Js({u'autoClose':Js(False)}) + var.put(u'stream', var.get(u'fs').get(u'SyncWriteStream').create(var.get(u'fd'), PyJs_Object_3293_)) + var.get(u'stream').put(u'_type', Js(u'fs')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'PIPE')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'TCP')): + SWITCHED = True + var.put(u'net', var.get(u'require')(Js(u'net'))) + PyJs_Object_3294_ = Js({u'fd':var.get(u'fd'),u'readable':Js(False),u'writable':var.get(u'true')}) + var.put(u'stream', var.get(u'net').get(u'Socket').create(PyJs_Object_3294_)) + var.get(u'stream').put(u'readable', Js(False)) + var.get(u'stream').put(u'read', var.get(u"null")) + var.get(u'stream').put(u'_type', Js(u'pipe')) + if (var.get(u'stream').get(u'_handle') and var.get(u'stream').get(u'_handle').get(u'unref')): + var.get(u'stream').get(u'_handle').callprop(u'unref') + break + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Implement me. Unknown stream file type!'))) + raise PyJsTempException + SWITCHED = True + break + var.get(u'stream').put(u'fd', var.get(u'fd')) + var.get(u'stream').put(u'_isStdio', var.get(u'true')) + return var.get(u'stream') + PyJsHoisted_createWritableStdioStream_.func_name = u'createWritableStdioStream' + var.put(u'createWritableStdioStream', PyJsHoisted_createWritableStdioStream_) + @Js + def PyJsHoisted_useColors_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'debugColors']) + var.put(u'debugColors', (var.get(u'process').get(u'env').get(u'DEBUG_COLORS') or Js(u'')).callprop(u'trim').callprop(u'toLowerCase')) + if PyJsStrictEq(Js(0.0),var.get(u'debugColors').get(u'length')): + return var.get(u'tty').callprop(u'isatty', var.get(u'fd')) + else: + return (((PyJsStrictNeq(Js(u'0'),var.get(u'debugColors')) and PyJsStrictNeq(Js(u'no'),var.get(u'debugColors'))) and PyJsStrictNeq(Js(u'false'),var.get(u'debugColors'))) and PyJsStrictNeq(Js(u'disabled'),var.get(u'debugColors'))) + PyJsHoisted_useColors_.func_name = u'useColors' + var.put(u'useColors', PyJsHoisted_useColors_) + @Js + def PyJsHoisted_save_(namespaces, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'namespaces':namespaces}, var) + var.registers([u'namespaces']) + if (var.get(u"null")==var.get(u'namespaces')): + var.get(u'process').get(u'env').delete(u'DEBUG') + else: + var.get(u'process').get(u'env').put(u'DEBUG', var.get(u'namespaces')) + PyJsHoisted_save_.func_name = u'save' + var.put(u'save', PyJsHoisted_save_) + var.put(u'tty', var.get(u'require')(Js(u'tty'))) + var.put(u'util', var.get(u'require')(Js(u'util'))) + var.put(u'exports', var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./debug')))) + var.get(u'exports').put(u'log', var.get(u'log')) + var.get(u'exports').put(u'formatArgs', var.get(u'formatArgs')) + var.get(u'exports').put(u'save', var.get(u'save')) + var.get(u'exports').put(u'load', var.get(u'load')) + var.get(u'exports').put(u'useColors', var.get(u'useColors')) + var.get(u'exports').put(u'colors', Js([Js(6.0), Js(2.0), Js(3.0), Js(4.0), Js(5.0), Js(1.0)])) + var.put(u'fd', (var.get(u'parseInt')(var.get(u'process').get(u'env').get(u'DEBUG_FD'), Js(10.0)) or Js(2.0))) + var.put(u'stream', (var.get(u'process').get(u'stdout') if PyJsStrictEq(Js(1.0),var.get(u'fd')) else (var.get(u'process').get(u'stderr') if PyJsStrictEq(Js(2.0),var.get(u'fd')) else var.get(u'createWritableStdioStream')(var.get(u'fd'))))) + pass + @Js + def PyJs_anonymous_3289_(v, colors, this, arguments, var=var): + var = Scope({u'this':this, u'colors':colors, u'arguments':arguments, u'v':v}, var) + var.registers([u'colors', u'v']) + return var.get(u'util').callprop(u'inspect', var.get(u'v'), PyJsComma(Js(0.0), Js(None)), PyJsComma(Js(0.0), Js(None)), var.get(u'colors')) + PyJs_anonymous_3289_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3290_(v, colors, this, arguments, var=var): + var = Scope({u'this':this, u'colors':colors, u'arguments':arguments, u'v':v}, var) + var.registers([u'colors', u'v']) + PyJs_Object_3291_ = Js({u'colors':var.get(u'colors')}) + return var.get(u'util').callprop(u'inspect', var.get(u'v'), PyJs_Object_3291_) + PyJs_anonymous_3290_._set_name(u'anonymous') + var.put(u'inspect', (PyJs_anonymous_3289_ if PyJsStrictEq(Js(4.0),var.get(u'util').get(u'inspect').get(u'length')) else PyJs_anonymous_3290_)) + @Js + def PyJs_anonymous_3292_(v, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'v':v}, var) + var.registers([u'v']) + return var.get(u'inspect')(var.get(u'v'), var.get(u"this").get(u'useColors')).callprop(u'replace', JsRegExp(u'/\\s*\\n\\s*/g'), Js(u' ')) + PyJs_anonymous_3292_._set_name(u'anonymous') + var.get(u'exports').get(u'formatters').put(u'o', PyJs_anonymous_3292_) + pass + pass + pass + pass + pass + var.get(u'exports').callprop(u'enable', var.get(u'load')()) + PyJs_anonymous_3288_._set_name(u'anonymous') + PyJs_anonymous_3288_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_3287_._set_name(u'anonymous') +PyJs_Object_3295_ = Js({u'./debug':Js(269.0),u'_process':Js(531.0),u'fs':Js(523.0),u'net':Js(523.0),u'tty':Js(532.0),u'util':Js(534.0)}) +@Js +def PyJs_anonymous_3296_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'INDENT_RE', u'require', u'module', u'repeating', u'getMostUsed']) + @Js + def PyJsHoisted_getMostUsed_(indents, this, arguments, var=var): + var = Scope({u'this':this, u'indents':indents, u'arguments':arguments}, var) + var.registers([u'indent', u'maxWeight', u'n', u'indents', u'u', u'result', u'w', u'maxUsed']) + var.put(u'result', Js(0.0)) + var.put(u'maxUsed', Js(0.0)) + var.put(u'maxWeight', Js(0.0)) + for PyJsTemp in var.get(u'indents'): + var.put(u'n', PyJsTemp) + var.put(u'indent', var.get(u'indents').get(var.get(u'n'))) + var.put(u'u', var.get(u'indent').get(u'0')) + var.put(u'w', var.get(u'indent').get(u'1')) + if ((var.get(u'u')>var.get(u'maxUsed')) or (PyJsStrictEq(var.get(u'u'),var.get(u'maxUsed')) and (var.get(u'w')>var.get(u'maxWeight')))): + var.put(u'maxUsed', var.get(u'u')) + var.put(u'maxWeight', var.get(u'w')) + var.put(u'result', var.get(u'Number')(var.get(u'n'))) + return var.get(u'result') + PyJsHoisted_getMostUsed_.func_name = u'getMostUsed' + var.put(u'getMostUsed', PyJsHoisted_getMostUsed_) + Js(u'use strict') + var.put(u'repeating', var.get(u'require')(Js(u'repeating'))) + var.put(u'INDENT_RE', JsRegExp(u'/^(?:( )+|\\t+)/')) + pass + @Js + def PyJs_anonymous_3297_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'actual', u'tabs', u'amount', u'isIndent', u'current', u'indents', u'spaces', u'str', u'prev', u'type']) + if PyJsStrictNeq(var.get(u'str',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Expected a string'))) + raise PyJsTempException + var.put(u'tabs', Js(0.0)) + var.put(u'spaces', Js(0.0)) + var.put(u'prev', Js(0.0)) + PyJs_Object_3298_ = Js({}) + var.put(u'indents', PyJs_Object_3298_) + pass + pass + @Js + def PyJs_anonymous_3299_(line, this, arguments, var=var): + var = Scope({u'this':this, u'line':line, u'arguments':arguments}, var) + var.registers([u'matches', u'diff', u'line', u'indent']) + if var.get(u'line').neg(): + return var.get('undefined') + pass + var.put(u'matches', var.get(u'line').callprop(u'match', var.get(u'INDENT_RE'))) + if var.get(u'matches').neg(): + var.put(u'indent', Js(0.0)) + else: + var.put(u'indent', var.get(u'matches').get(u'0').get(u'length')) + if var.get(u'matches').get(u'1'): + (var.put(u'spaces',Js(var.get(u'spaces').to_number())+Js(1))-Js(1)) + else: + (var.put(u'tabs',Js(var.get(u'tabs').to_number())+Js(1))-Js(1)) + var.put(u'diff', (var.get(u'indent')-var.get(u'prev'))) + var.put(u'prev', var.get(u'indent')) + if var.get(u'diff'): + var.put(u'isIndent', (var.get(u'diff')>Js(0.0))) + var.put(u'current', var.get(u'indents').get((var.get(u'diff') if var.get(u'isIndent') else (-var.get(u'diff'))))) + if var.get(u'current'): + (var.get(u'current').put(u'0',Js(var.get(u'current').get(u'0').to_number())+Js(1))-Js(1)) + else: + var.put(u'current', var.get(u'indents').put(var.get(u'diff'), Js([Js(1.0), Js(0.0)]))) + else: + if var.get(u'current'): + var.get(u'current').put(u'1', var.get(u'Number')(var.get(u'isIndent')), u'+') + PyJs_anonymous_3299_._set_name(u'anonymous') + var.get(u'str').callprop(u'split', JsRegExp(u'/\\n/g')).callprop(u'forEach', PyJs_anonymous_3299_) + var.put(u'amount', var.get(u'getMostUsed')(var.get(u'indents'))) + pass + pass + if var.get(u'amount').neg(): + var.put(u'type', var.get(u"null")) + var.put(u'actual', Js(u'')) + else: + if (var.get(u'spaces')>=var.get(u'tabs')): + var.put(u'type', Js(u'space')) + var.put(u'actual', var.get(u'repeating')(Js(u' '), var.get(u'amount'))) + else: + var.put(u'type', Js(u'tab')) + var.put(u'actual', var.get(u'repeating')(Js(u'\t'), var.get(u'amount'))) + PyJs_Object_3300_ = Js({u'amount':var.get(u'amount'),u'type':var.get(u'type'),u'indent':var.get(u'actual')}) + return PyJs_Object_3300_ + PyJs_anonymous_3297_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_3297_) +PyJs_anonymous_3296_._set_name(u'anonymous') +PyJs_Object_3301_ = Js({u'repeating':Js(507.0)}) +@Js +def PyJs_anonymous_3302_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'matchOperatorsRe', u'require', u'exports', u'module']) + Js(u'use strict') + var.put(u'matchOperatorsRe', JsRegExp(u'/[|\\\\{}()[\\]^$+*?.]/g')) + @Js + def PyJs_anonymous_3303_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + if PyJsStrictNeq(var.get(u'str',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Expected a string'))) + raise PyJsTempException + return var.get(u'str').callprop(u'replace', var.get(u'matchOperatorsRe'), Js(u'\\$&')) + PyJs_anonymous_3303_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_3303_) +PyJs_anonymous_3302_._set_name(u'anonymous') +PyJs_Object_3304_ = Js({}) +@Js +def PyJs_anonymous_3305_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_3306_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'isIterationStatement', u'isProblematicIfStatement', u'trailingStatement', u'isExpression', u'isSourceElement', u'isStatement']) + @Js + def PyJsHoisted_isIterationStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if (var.get(u'node')==var.get(u"null")): + return Js(False) + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'DoWhileStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForInStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'WhileStatement')): + SWITCHED = True + return var.get(u'true') + SWITCHED = True + break + return Js(False) + PyJsHoisted_isIterationStatement_.func_name = u'isIterationStatement' + var.put(u'isIterationStatement', PyJsHoisted_isIterationStatement_) + @Js + def PyJsHoisted_isProblematicIfStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'current', u'node']) + pass + if PyJsStrictNeq(var.get(u'node').get(u'type'),Js(u'IfStatement')): + return Js(False) + if (var.get(u'node').get(u'alternate')==var.get(u"null")): + return Js(False) + var.put(u'current', var.get(u'node').get(u'consequent')) + while 1: + if PyJsStrictEq(var.get(u'current').get(u'type'),Js(u'IfStatement')): + if (var.get(u'current').get(u'alternate')==var.get(u"null")): + return var.get(u'true') + var.put(u'current', var.get(u'trailingStatement')(var.get(u'current'))) + if not var.get(u'current'): + break + return Js(False) + PyJsHoisted_isProblematicIfStatement_.func_name = u'isProblematicIfStatement' + var.put(u'isProblematicIfStatement', PyJsHoisted_isProblematicIfStatement_) + @Js + def PyJsHoisted_trailingStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'IfStatement')): + SWITCHED = True + if (var.get(u'node').get(u'alternate')!=var.get(u"null")): + return var.get(u'node').get(u'alternate') + return var.get(u'node').get(u'consequent') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'LabeledStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForInStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'WhileStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'WithStatement')): + SWITCHED = True + return var.get(u'node').get(u'body') + SWITCHED = True + break + return var.get(u"null") + PyJsHoisted_trailingStatement_.func_name = u'trailingStatement' + var.put(u'trailingStatement', PyJsHoisted_trailingStatement_) + @Js + def PyJsHoisted_isExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if (var.get(u'node')==var.get(u"null")): + return Js(False) + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ArrayExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'AssignmentExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'BinaryExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'CallExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ConditionalExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'FunctionExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'Identifier')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'Literal')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'LogicalExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'MemberExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'NewExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'SequenceExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ThisExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'UnaryExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'UpdateExpression')): + SWITCHED = True + return var.get(u'true') + SWITCHED = True + break + return Js(False) + PyJsHoisted_isExpression_.func_name = u'isExpression' + var.put(u'isExpression', PyJsHoisted_isExpression_) + @Js + def PyJsHoisted_isSourceElement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return (var.get(u'isStatement')(var.get(u'node')) or ((var.get(u'node')!=var.get(u"null")) and PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'FunctionDeclaration')))) + PyJsHoisted_isSourceElement_.func_name = u'isSourceElement' + var.put(u'isSourceElement', PyJsHoisted_isSourceElement_) + @Js + def PyJsHoisted_isStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if (var.get(u'node')==var.get(u"null")): + return Js(False) + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'BlockStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'BreakStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ContinueStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'DebuggerStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'DoWhileStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'EmptyStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ExpressionStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForInStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'IfStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'LabeledStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ReturnStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'SwitchStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ThrowStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'TryStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'VariableDeclaration')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'WhileStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'WithStatement')): + SWITCHED = True + return var.get(u'true') + SWITCHED = True + break + return Js(False) + PyJsHoisted_isStatement_.func_name = u'isStatement' + var.put(u'isStatement', PyJsHoisted_isStatement_) + Js(u'use strict') + pass + pass + pass + pass + pass + pass + PyJs_Object_3307_ = Js({u'isExpression':var.get(u'isExpression'),u'isStatement':var.get(u'isStatement'),u'isIterationStatement':var.get(u'isIterationStatement'),u'isSourceElement':var.get(u'isSourceElement'),u'isProblematicIfStatement':var.get(u'isProblematicIfStatement'),u'trailingStatement':var.get(u'trailingStatement')}) + var.get(u'module').put(u'exports', PyJs_Object_3307_) + PyJs_anonymous_3306_._set_name(u'anonymous') + PyJs_anonymous_3306_() +PyJs_anonymous_3305_._set_name(u'anonymous') +PyJs_Object_3308_ = Js({}) +@Js +def PyJs_anonymous_3309_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_3310_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'isIdentifierPartES6', u'NON_ASCII_WHITESPACES', u'isIdentifierStartES5', u'fromCodePoint', u'IDENTIFIER_START', u'ES6Regex', u'ES5Regex', u'isHexDigit', u'ch', u'IDENTIFIER_PART', u'isLineTerminator', u'isDecimalDigit', u'isIdentifierStartES6', u'isIdentifierPartES5', u'isOctalDigit', u'isWhiteSpace']) + @Js + def PyJsHoisted_isIdentifierPartES6_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch']) + return (var.get(u'IDENTIFIER_PART').get(var.get(u'ch')) if (var.get(u'ch')<Js(128)) else var.get(u'ES6Regex').get(u'NonAsciiIdentifierPart').callprop(u'test', var.get(u'fromCodePoint')(var.get(u'ch')))) + PyJsHoisted_isIdentifierPartES6_.func_name = u'isIdentifierPartES6' + var.put(u'isIdentifierPartES6', PyJsHoisted_isIdentifierPartES6_) + @Js + def PyJsHoisted_fromCodePoint_(cp, this, arguments, var=var): + var = Scope({u'this':this, u'cp':cp, u'arguments':arguments}, var) + var.registers([u'cp', u'cu2', u'cu1']) + if (var.get(u'cp')<=Js(65535)): + return var.get(u'String').callprop(u'fromCharCode', var.get(u'cp')) + var.put(u'cu1', var.get(u'String').callprop(u'fromCharCode', (var.get(u'Math').callprop(u'floor', ((var.get(u'cp')-Js(65536))/Js(1024)))+Js(55296)))) + var.put(u'cu2', var.get(u'String').callprop(u'fromCharCode', (((var.get(u'cp')-Js(65536))%Js(1024))+Js(56320)))) + return (var.get(u'cu1')+var.get(u'cu2')) + PyJsHoisted_fromCodePoint_.func_name = u'fromCodePoint' + var.put(u'fromCodePoint', PyJsHoisted_fromCodePoint_) + @Js + def PyJsHoisted_isHexDigit_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch']) + return ((((Js(48)<=var.get(u'ch')) and (var.get(u'ch')<=Js(57))) or ((Js(97)<=var.get(u'ch')) and (var.get(u'ch')<=Js(102)))) or ((Js(65)<=var.get(u'ch')) and (var.get(u'ch')<=Js(70)))) + PyJsHoisted_isHexDigit_.func_name = u'isHexDigit' + var.put(u'isHexDigit', PyJsHoisted_isHexDigit_) + @Js + def PyJsHoisted_isOctalDigit_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch']) + return ((var.get(u'ch')>=Js(48)) and (var.get(u'ch')<=Js(55))) + PyJsHoisted_isOctalDigit_.func_name = u'isOctalDigit' + var.put(u'isOctalDigit', PyJsHoisted_isOctalDigit_) + @Js + def PyJsHoisted_isLineTerminator_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch']) + return (((PyJsStrictEq(var.get(u'ch'),Js(10)) or PyJsStrictEq(var.get(u'ch'),Js(13))) or PyJsStrictEq(var.get(u'ch'),Js(8232))) or PyJsStrictEq(var.get(u'ch'),Js(8233))) + PyJsHoisted_isLineTerminator_.func_name = u'isLineTerminator' + var.put(u'isLineTerminator', PyJsHoisted_isLineTerminator_) + @Js + def PyJsHoisted_isDecimalDigit_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch']) + return ((Js(48)<=var.get(u'ch')) and (var.get(u'ch')<=Js(57))) + PyJsHoisted_isDecimalDigit_.func_name = u'isDecimalDigit' + var.put(u'isDecimalDigit', PyJsHoisted_isDecimalDigit_) + @Js + def PyJsHoisted_isIdentifierStartES6_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch']) + return (var.get(u'IDENTIFIER_START').get(var.get(u'ch')) if (var.get(u'ch')<Js(128)) else var.get(u'ES6Regex').get(u'NonAsciiIdentifierStart').callprop(u'test', var.get(u'fromCodePoint')(var.get(u'ch')))) + PyJsHoisted_isIdentifierStartES6_.func_name = u'isIdentifierStartES6' + var.put(u'isIdentifierStartES6', PyJsHoisted_isIdentifierStartES6_) + @Js + def PyJsHoisted_isIdentifierPartES5_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch']) + return (var.get(u'IDENTIFIER_PART').get(var.get(u'ch')) if (var.get(u'ch')<Js(128)) else var.get(u'ES5Regex').get(u'NonAsciiIdentifierPart').callprop(u'test', var.get(u'fromCodePoint')(var.get(u'ch')))) + PyJsHoisted_isIdentifierPartES5_.func_name = u'isIdentifierPartES5' + var.put(u'isIdentifierPartES5', PyJsHoisted_isIdentifierPartES5_) + @Js + def PyJsHoisted_isIdentifierStartES5_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch']) + return (var.get(u'IDENTIFIER_START').get(var.get(u'ch')) if (var.get(u'ch')<Js(128)) else var.get(u'ES5Regex').get(u'NonAsciiIdentifierStart').callprop(u'test', var.get(u'fromCodePoint')(var.get(u'ch')))) + PyJsHoisted_isIdentifierStartES5_.func_name = u'isIdentifierStartES5' + var.put(u'isIdentifierStartES5', PyJsHoisted_isIdentifierStartES5_) + @Js + def PyJsHoisted_isWhiteSpace_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch']) + return (((((PyJsStrictEq(var.get(u'ch'),Js(32)) or PyJsStrictEq(var.get(u'ch'),Js(9))) or PyJsStrictEq(var.get(u'ch'),Js(11))) or PyJsStrictEq(var.get(u'ch'),Js(12))) or PyJsStrictEq(var.get(u'ch'),Js(160))) or ((var.get(u'ch')>=Js(5760)) and (var.get(u'NON_ASCII_WHITESPACES').callprop(u'indexOf', var.get(u'ch'))>=Js(0.0)))) + PyJsHoisted_isWhiteSpace_.func_name = u'isWhiteSpace' + var.put(u'isWhiteSpace', PyJsHoisted_isWhiteSpace_) + Js(u'use strict') + pass + PyJs_Object_3311_ = Js({u'NonAsciiIdentifierStart':JsRegExp(u'/[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B2\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]/'),u'NonAsciiIdentifierPart':JsRegExp(u'/[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0-\\u08B2\\u08E4-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58\\u0C59\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C81-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D60-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1CF8\\u1CF9\\u1D00-\\u1DF5\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099\\u309A\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA69D\\uA69F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2D\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]/')}) + var.put(u'ES5Regex', PyJs_Object_3311_) + PyJs_Object_3312_ = Js({u'NonAsciiIdentifierStart':JsRegExp(u'/[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B2\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309B-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF5D-\\uDF61]|\\uD805[\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF98]|\\uD809[\\uDC00-\\uDC6E]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D]|\\uD87E[\\uDC00-\\uDE1D]/'),u'NonAsciiIdentifierPart':JsRegExp(u'/[\\xAA\\xB5\\xB7\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0-\\u08B2\\u08E4-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58\\u0C59\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C81-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D60-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1369-\\u1371\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1CF8\\u1CF9\\u1D00-\\u1DF5\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA69D\\uA69F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2D\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDD0-\\uDDDA\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF01-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF98]|\\uD809[\\uDC00-\\uDC6E]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/')}) + var.put(u'ES6Regex', PyJs_Object_3312_) + pass + pass + pass + var.put(u'NON_ASCII_WHITESPACES', Js([Js(5760), Js(6158), Js(8192), Js(8193), Js(8194), Js(8195), Js(8196), Js(8197), Js(8198), Js(8199), Js(8200), Js(8201), Js(8202), Js(8239), Js(8287), Js(12288), Js(65279)])) + pass + pass + pass + var.put(u'IDENTIFIER_START', var.get(u'Array').create(Js(128))) + #for JS loop + var.put(u'ch', Js(0.0)) + while (var.get(u'ch')<Js(128)): + try: + var.get(u'IDENTIFIER_START').put(var.get(u'ch'), (((((var.get(u'ch')>=Js(97)) and (var.get(u'ch')<=Js(122))) or ((var.get(u'ch')>=Js(65)) and (var.get(u'ch')<=Js(90)))) or PyJsStrictEq(var.get(u'ch'),Js(36))) or PyJsStrictEq(var.get(u'ch'),Js(95)))) + finally: + var.put(u'ch',Js(var.get(u'ch').to_number())+Js(1)) + var.put(u'IDENTIFIER_PART', var.get(u'Array').create(Js(128))) + #for JS loop + var.put(u'ch', Js(0.0)) + while (var.get(u'ch')<Js(128)): + try: + var.get(u'IDENTIFIER_PART').put(var.get(u'ch'), ((((((var.get(u'ch')>=Js(97)) and (var.get(u'ch')<=Js(122))) or ((var.get(u'ch')>=Js(65)) and (var.get(u'ch')<=Js(90)))) or ((var.get(u'ch')>=Js(48)) and (var.get(u'ch')<=Js(57)))) or PyJsStrictEq(var.get(u'ch'),Js(36))) or PyJsStrictEq(var.get(u'ch'),Js(95)))) + finally: + var.put(u'ch',Js(var.get(u'ch').to_number())+Js(1)) + pass + pass + pass + pass + PyJs_Object_3313_ = Js({u'isDecimalDigit':var.get(u'isDecimalDigit'),u'isHexDigit':var.get(u'isHexDigit'),u'isOctalDigit':var.get(u'isOctalDigit'),u'isWhiteSpace':var.get(u'isWhiteSpace'),u'isLineTerminator':var.get(u'isLineTerminator'),u'isIdentifierStartES5':var.get(u'isIdentifierStartES5'),u'isIdentifierPartES5':var.get(u'isIdentifierPartES5'),u'isIdentifierStartES6':var.get(u'isIdentifierStartES6'),u'isIdentifierPartES6':var.get(u'isIdentifierPartES6')}) + var.get(u'module').put(u'exports', PyJs_Object_3313_) + PyJs_anonymous_3310_._set_name(u'anonymous') + PyJs_anonymous_3310_() +PyJs_anonymous_3309_._set_name(u'anonymous') +PyJs_Object_3314_ = Js({}) +@Js +def PyJs_anonymous_3315_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_3316_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'isKeywordES6', u'isKeywordES5', u'code', u'isIdentifierNameES6', u'decodeUtf16', u'isIdentifierNameES5', u'isIdentifierES5', u'isIdentifierES6', u'isReservedWordES5', u'isReservedWordES6', u'isRestrictedWord', u'isStrictModeReservedWordES6']) + @Js + def PyJsHoisted_isKeywordES6_(id, strict, this, arguments, var=var): + var = Scope({u'this':this, u'strict':strict, u'id':id, u'arguments':arguments}, var) + var.registers([u'strict', u'id']) + if (var.get(u'strict') and var.get(u'isStrictModeReservedWordES6')(var.get(u'id'))): + return var.get(u'true') + while 1: + SWITCHED = False + CONDITION = (var.get(u'id').get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(2.0)): + SWITCHED = True + return ((PyJsStrictEq(var.get(u'id'),Js(u'if')) or PyJsStrictEq(var.get(u'id'),Js(u'in'))) or PyJsStrictEq(var.get(u'id'),Js(u'do'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(3.0)): + SWITCHED = True + return (((PyJsStrictEq(var.get(u'id'),Js(u'var')) or PyJsStrictEq(var.get(u'id'),Js(u'for'))) or PyJsStrictEq(var.get(u'id'),Js(u'new'))) or PyJsStrictEq(var.get(u'id'),Js(u'try'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(4.0)): + SWITCHED = True + return (((((PyJsStrictEq(var.get(u'id'),Js(u'this')) or PyJsStrictEq(var.get(u'id'),Js(u'else'))) or PyJsStrictEq(var.get(u'id'),Js(u'case'))) or PyJsStrictEq(var.get(u'id'),Js(u'void'))) or PyJsStrictEq(var.get(u'id'),Js(u'with'))) or PyJsStrictEq(var.get(u'id'),Js(u'enum'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(5.0)): + SWITCHED = True + return (((((((PyJsStrictEq(var.get(u'id'),Js(u'while')) or PyJsStrictEq(var.get(u'id'),Js(u'break'))) or PyJsStrictEq(var.get(u'id'),Js(u'catch'))) or PyJsStrictEq(var.get(u'id'),Js(u'throw'))) or PyJsStrictEq(var.get(u'id'),Js(u'const'))) or PyJsStrictEq(var.get(u'id'),Js(u'yield'))) or PyJsStrictEq(var.get(u'id'),Js(u'class'))) or PyJsStrictEq(var.get(u'id'),Js(u'super'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(6.0)): + SWITCHED = True + return (((((PyJsStrictEq(var.get(u'id'),Js(u'return')) or PyJsStrictEq(var.get(u'id'),Js(u'typeof'))) or PyJsStrictEq(var.get(u'id'),Js(u'delete'))) or PyJsStrictEq(var.get(u'id'),Js(u'switch'))) or PyJsStrictEq(var.get(u'id'),Js(u'export'))) or PyJsStrictEq(var.get(u'id'),Js(u'import'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(7.0)): + SWITCHED = True + return ((PyJsStrictEq(var.get(u'id'),Js(u'default')) or PyJsStrictEq(var.get(u'id'),Js(u'finally'))) or PyJsStrictEq(var.get(u'id'),Js(u'extends'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(8.0)): + SWITCHED = True + return ((PyJsStrictEq(var.get(u'id'),Js(u'function')) or PyJsStrictEq(var.get(u'id'),Js(u'continue'))) or PyJsStrictEq(var.get(u'id'),Js(u'debugger'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(10.0)): + SWITCHED = True + return PyJsStrictEq(var.get(u'id'),Js(u'instanceof')) + if True: + SWITCHED = True + return Js(False) + SWITCHED = True + break + PyJsHoisted_isKeywordES6_.func_name = u'isKeywordES6' + var.put(u'isKeywordES6', PyJsHoisted_isKeywordES6_) + @Js + def PyJsHoisted_isKeywordES5_(id, strict, this, arguments, var=var): + var = Scope({u'this':this, u'strict':strict, u'id':id, u'arguments':arguments}, var) + var.registers([u'strict', u'id']) + if (var.get(u'strict').neg() and PyJsStrictEq(var.get(u'id'),Js(u'yield'))): + return Js(False) + return var.get(u'isKeywordES6')(var.get(u'id'), var.get(u'strict')) + PyJsHoisted_isKeywordES5_.func_name = u'isKeywordES5' + var.put(u'isKeywordES5', PyJsHoisted_isKeywordES5_) + @Js + def PyJsHoisted_isIdentifierNameES6_(id, this, arguments, var=var): + var = Scope({u'this':this, u'id':id, u'arguments':arguments}, var) + var.registers([u'ch', u'i', u'lowCh', u'id', u'iz', u'check']) + pass + if PyJsStrictEq(var.get(u'id').get(u'length'),Js(0.0)): + return Js(False) + var.put(u'check', var.get(u'code').get(u'isIdentifierStartES6')) + #for JS loop + PyJsComma(var.put(u'i', Js(0.0)),var.put(u'iz', var.get(u'id').get(u'length'))) + while (var.get(u'i')<var.get(u'iz')): + try: + var.put(u'ch', var.get(u'id').callprop(u'charCodeAt', var.get(u'i'))) + if ((Js(55296)<=var.get(u'ch')) and (var.get(u'ch')<=Js(56319))): + var.put(u'i',Js(var.get(u'i').to_number())+Js(1)) + if (var.get(u'i')>=var.get(u'iz')): + return Js(False) + var.put(u'lowCh', var.get(u'id').callprop(u'charCodeAt', var.get(u'i'))) + if ((Js(56320)<=var.get(u'lowCh')) and (var.get(u'lowCh')<=Js(57343))).neg(): + return Js(False) + var.put(u'ch', var.get(u'decodeUtf16')(var.get(u'ch'), var.get(u'lowCh'))) + if var.get(u'check')(var.get(u'ch')).neg(): + return Js(False) + var.put(u'check', var.get(u'code').get(u'isIdentifierPartES6')) + finally: + var.put(u'i',Js(var.get(u'i').to_number())+Js(1)) + return var.get(u'true') + PyJsHoisted_isIdentifierNameES6_.func_name = u'isIdentifierNameES6' + var.put(u'isIdentifierNameES6', PyJsHoisted_isIdentifierNameES6_) + @Js + def PyJsHoisted_decodeUtf16_(lead, trail, this, arguments, var=var): + var = Scope({u'this':this, u'trail':trail, u'arguments':arguments, u'lead':lead}, var) + var.registers([u'trail', u'lead']) + return ((((var.get(u'lead')-Js(55296))*Js(1024))+(var.get(u'trail')-Js(56320)))+Js(65536)) + PyJsHoisted_decodeUtf16_.func_name = u'decodeUtf16' + var.put(u'decodeUtf16', PyJsHoisted_decodeUtf16_) + @Js + def PyJsHoisted_isIdentifierNameES5_(id, this, arguments, var=var): + var = Scope({u'this':this, u'id':id, u'arguments':arguments}, var) + var.registers([u'i', u'ch', u'iz', u'id']) + pass + if PyJsStrictEq(var.get(u'id').get(u'length'),Js(0.0)): + return Js(False) + var.put(u'ch', var.get(u'id').callprop(u'charCodeAt', Js(0.0))) + if var.get(u'code').callprop(u'isIdentifierStartES5', var.get(u'ch')).neg(): + return Js(False) + #for JS loop + PyJsComma(var.put(u'i', Js(1.0)),var.put(u'iz', var.get(u'id').get(u'length'))) + while (var.get(u'i')<var.get(u'iz')): + try: + var.put(u'ch', var.get(u'id').callprop(u'charCodeAt', var.get(u'i'))) + if var.get(u'code').callprop(u'isIdentifierPartES5', var.get(u'ch')).neg(): + return Js(False) + finally: + var.put(u'i',Js(var.get(u'i').to_number())+Js(1)) + return var.get(u'true') + PyJsHoisted_isIdentifierNameES5_.func_name = u'isIdentifierNameES5' + var.put(u'isIdentifierNameES5', PyJsHoisted_isIdentifierNameES5_) + @Js + def PyJsHoisted_isIdentifierES5_(id, strict, this, arguments, var=var): + var = Scope({u'this':this, u'strict':strict, u'id':id, u'arguments':arguments}, var) + var.registers([u'strict', u'id']) + return (var.get(u'isIdentifierNameES5')(var.get(u'id')) and var.get(u'isReservedWordES5')(var.get(u'id'), var.get(u'strict')).neg()) + PyJsHoisted_isIdentifierES5_.func_name = u'isIdentifierES5' + var.put(u'isIdentifierES5', PyJsHoisted_isIdentifierES5_) + @Js + def PyJsHoisted_isIdentifierES6_(id, strict, this, arguments, var=var): + var = Scope({u'this':this, u'strict':strict, u'id':id, u'arguments':arguments}, var) + var.registers([u'strict', u'id']) + return (var.get(u'isIdentifierNameES6')(var.get(u'id')) and var.get(u'isReservedWordES6')(var.get(u'id'), var.get(u'strict')).neg()) + PyJsHoisted_isIdentifierES6_.func_name = u'isIdentifierES6' + var.put(u'isIdentifierES6', PyJsHoisted_isIdentifierES6_) + @Js + def PyJsHoisted_isReservedWordES5_(id, strict, this, arguments, var=var): + var = Scope({u'this':this, u'strict':strict, u'id':id, u'arguments':arguments}, var) + var.registers([u'strict', u'id']) + return (((PyJsStrictEq(var.get(u'id'),Js(u'null')) or PyJsStrictEq(var.get(u'id'),Js(u'true'))) or PyJsStrictEq(var.get(u'id'),Js(u'false'))) or var.get(u'isKeywordES5')(var.get(u'id'), var.get(u'strict'))) + PyJsHoisted_isReservedWordES5_.func_name = u'isReservedWordES5' + var.put(u'isReservedWordES5', PyJsHoisted_isReservedWordES5_) + @Js + def PyJsHoisted_isReservedWordES6_(id, strict, this, arguments, var=var): + var = Scope({u'this':this, u'strict':strict, u'id':id, u'arguments':arguments}, var) + var.registers([u'strict', u'id']) + return (((PyJsStrictEq(var.get(u'id'),Js(u'null')) or PyJsStrictEq(var.get(u'id'),Js(u'true'))) or PyJsStrictEq(var.get(u'id'),Js(u'false'))) or var.get(u'isKeywordES6')(var.get(u'id'), var.get(u'strict'))) + PyJsHoisted_isReservedWordES6_.func_name = u'isReservedWordES6' + var.put(u'isReservedWordES6', PyJsHoisted_isReservedWordES6_) + @Js + def PyJsHoisted_isRestrictedWord_(id, this, arguments, var=var): + var = Scope({u'this':this, u'id':id, u'arguments':arguments}, var) + var.registers([u'id']) + return (PyJsStrictEq(var.get(u'id'),Js(u'eval')) or PyJsStrictEq(var.get(u'id'),Js(u'arguments'))) + PyJsHoisted_isRestrictedWord_.func_name = u'isRestrictedWord' + var.put(u'isRestrictedWord', PyJsHoisted_isRestrictedWord_) + @Js + def PyJsHoisted_isStrictModeReservedWordES6_(id, this, arguments, var=var): + var = Scope({u'this':this, u'id':id, u'arguments':arguments}, var) + var.registers([u'id']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'id')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'implements')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'interface')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'package')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'private')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'protected')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'public')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'static')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'let')): + SWITCHED = True + return var.get(u'true') + if True: + SWITCHED = True + return Js(False) + SWITCHED = True + break + PyJsHoisted_isStrictModeReservedWordES6_.func_name = u'isStrictModeReservedWordES6' + var.put(u'isStrictModeReservedWordES6', PyJsHoisted_isStrictModeReservedWordES6_) + Js(u'use strict') + var.put(u'code', var.get(u'require')(Js(u'./code'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + PyJs_Object_3317_ = Js({u'isKeywordES5':var.get(u'isKeywordES5'),u'isKeywordES6':var.get(u'isKeywordES6'),u'isReservedWordES5':var.get(u'isReservedWordES5'),u'isReservedWordES6':var.get(u'isReservedWordES6'),u'isRestrictedWord':var.get(u'isRestrictedWord'),u'isIdentifierNameES5':var.get(u'isIdentifierNameES5'),u'isIdentifierNameES6':var.get(u'isIdentifierNameES6'),u'isIdentifierES5':var.get(u'isIdentifierES5'),u'isIdentifierES6':var.get(u'isIdentifierES6')}) + var.get(u'module').put(u'exports', PyJs_Object_3317_) + PyJs_anonymous_3316_._set_name(u'anonymous') + PyJs_anonymous_3316_() +PyJs_anonymous_3315_._set_name(u'anonymous') +PyJs_Object_3318_ = Js({u'./code':Js(274.0)}) +@Js +def PyJs_anonymous_3319_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_3320_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + Js(u'use strict') + var.get(u'exports').put(u'ast', var.get(u'require')(Js(u'./ast'))) + var.get(u'exports').put(u'code', var.get(u'require')(Js(u'./code'))) + var.get(u'exports').put(u'keyword', var.get(u'require')(Js(u'./keyword'))) + PyJs_anonymous_3320_._set_name(u'anonymous') + PyJs_anonymous_3320_() +PyJs_anonymous_3319_._set_name(u'anonymous') +PyJs_Object_3321_ = Js({u'./ast':Js(273.0),u'./code':Js(274.0),u'./keyword':Js(275.0)}) +@Js +def PyJs_anonymous_3322_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_3324_ = Js({u'Array':Js(False),u'ArrayBuffer':Js(False),u'Boolean':Js(False),u'constructor':Js(False),u'DataView':Js(False),u'Date':Js(False),u'decodeURI':Js(False),u'decodeURIComponent':Js(False),u'encodeURI':Js(False),u'encodeURIComponent':Js(False),u'Error':Js(False),u'escape':Js(False),u'eval':Js(False),u'EvalError':Js(False),u'Float32Array':Js(False),u'Float64Array':Js(False),u'Function':Js(False),u'hasOwnProperty':Js(False),u'Infinity':Js(False),u'Int16Array':Js(False),u'Int32Array':Js(False),u'Int8Array':Js(False),u'isFinite':Js(False),u'isNaN':Js(False),u'isPrototypeOf':Js(False),u'JSON':Js(False),u'Map':Js(False),u'Math':Js(False),u'NaN':Js(False),u'Number':Js(False),u'Object':Js(False),u'parseFloat':Js(False),u'parseInt':Js(False),u'Promise':Js(False),u'propertyIsEnumerable':Js(False),u'Proxy':Js(False),u'RangeError':Js(False),u'ReferenceError':Js(False),u'Reflect':Js(False),u'RegExp':Js(False),u'Set':Js(False),u'String':Js(False),u'Symbol':Js(False),u'SyntaxError':Js(False),u'System':Js(False),u'toLocaleString':Js(False),u'toString':Js(False),u'TypeError':Js(False),u'Uint16Array':Js(False),u'Uint32Array':Js(False),u'Uint8Array':Js(False),u'Uint8ClampedArray':Js(False),u'undefined':Js(False),u'unescape':Js(False),u'URIError':Js(False),u'valueOf':Js(False),u'WeakMap':Js(False),u'WeakSet':Js(False)}) + PyJs_Object_3325_ = Js({u'Array':Js(False),u'Boolean':Js(False),u'constructor':Js(False),u'Date':Js(False),u'decodeURI':Js(False),u'decodeURIComponent':Js(False),u'encodeURI':Js(False),u'encodeURIComponent':Js(False),u'Error':Js(False),u'escape':Js(False),u'eval':Js(False),u'EvalError':Js(False),u'Function':Js(False),u'hasOwnProperty':Js(False),u'Infinity':Js(False),u'isFinite':Js(False),u'isNaN':Js(False),u'isPrototypeOf':Js(False),u'JSON':Js(False),u'Math':Js(False),u'NaN':Js(False),u'Number':Js(False),u'Object':Js(False),u'parseFloat':Js(False),u'parseInt':Js(False),u'propertyIsEnumerable':Js(False),u'RangeError':Js(False),u'ReferenceError':Js(False),u'RegExp':Js(False),u'String':Js(False),u'SyntaxError':Js(False),u'toLocaleString':Js(False),u'toString':Js(False),u'TypeError':Js(False),u'undefined':Js(False),u'unescape':Js(False),u'URIError':Js(False),u'valueOf':Js(False)}) + PyJs_Object_3326_ = Js({u'Array':Js(False),u'ArrayBuffer':Js(False),u'Boolean':Js(False),u'constructor':Js(False),u'DataView':Js(False),u'Date':Js(False),u'decodeURI':Js(False),u'decodeURIComponent':Js(False),u'encodeURI':Js(False),u'encodeURIComponent':Js(False),u'Error':Js(False),u'escape':Js(False),u'eval':Js(False),u'EvalError':Js(False),u'Float32Array':Js(False),u'Float64Array':Js(False),u'Function':Js(False),u'hasOwnProperty':Js(False),u'Infinity':Js(False),u'Int16Array':Js(False),u'Int32Array':Js(False),u'Int8Array':Js(False),u'isFinite':Js(False),u'isNaN':Js(False),u'isPrototypeOf':Js(False),u'JSON':Js(False),u'Map':Js(False),u'Math':Js(False),u'NaN':Js(False),u'Number':Js(False),u'Object':Js(False),u'parseFloat':Js(False),u'parseInt':Js(False),u'Promise':Js(False),u'propertyIsEnumerable':Js(False),u'Proxy':Js(False),u'RangeError':Js(False),u'ReferenceError':Js(False),u'Reflect':Js(False),u'RegExp':Js(False),u'Set':Js(False),u'String':Js(False),u'Symbol':Js(False),u'SyntaxError':Js(False),u'System':Js(False),u'toLocaleString':Js(False),u'toString':Js(False),u'TypeError':Js(False),u'Uint16Array':Js(False),u'Uint32Array':Js(False),u'Uint8Array':Js(False),u'Uint8ClampedArray':Js(False),u'undefined':Js(False),u'unescape':Js(False),u'URIError':Js(False),u'valueOf':Js(False),u'WeakMap':Js(False),u'WeakSet':Js(False)}) + PyJs_Object_3327_ = Js({u'addEventListener':Js(False),u'alert':Js(False),u'AnalyserNode':Js(False),u'Animation':Js(False),u'AnimationEffectReadOnly':Js(False),u'AnimationEffectTiming':Js(False),u'AnimationEffectTimingReadOnly':Js(False),u'AnimationEvent':Js(False),u'AnimationPlaybackEvent':Js(False),u'AnimationTimeline':Js(False),u'applicationCache':Js(False),u'ApplicationCache':Js(False),u'ApplicationCacheErrorEvent':Js(False),u'atob':Js(False),u'Attr':Js(False),u'Audio':Js(False),u'AudioBuffer':Js(False),u'AudioBufferSourceNode':Js(False),u'AudioContext':Js(False),u'AudioDestinationNode':Js(False),u'AudioListener':Js(False),u'AudioNode':Js(False),u'AudioParam':Js(False),u'AudioProcessingEvent':Js(False),u'AutocompleteErrorEvent':Js(False),u'BarProp':Js(False),u'BatteryManager':Js(False),u'BeforeUnloadEvent':Js(False),u'BiquadFilterNode':Js(False),u'Blob':Js(False),u'blur':Js(False),u'btoa':Js(False),u'Cache':Js(False),u'caches':Js(False),u'CacheStorage':Js(False),u'cancelAnimationFrame':Js(False),u'CanvasGradient':Js(False),u'CanvasPattern':Js(False),u'CanvasRenderingContext2D':Js(False),u'CDATASection':Js(False),u'ChannelMergerNode':Js(False),u'ChannelSplitterNode':Js(False),u'CharacterData':Js(False),u'clearInterval':Js(False),u'clearTimeout':Js(False),u'clientInformation':Js(False),u'ClientRect':Js(False),u'ClientRectList':Js(False),u'ClipboardEvent':Js(False),u'close':Js(False),u'closed':Js(False),u'CloseEvent':Js(False),u'Comment':Js(False),u'CompositionEvent':Js(False),u'confirm':Js(False),u'console':Js(False),u'ConvolverNode':Js(False),u'Credential':Js(False),u'CredentialsContainer':Js(False),u'crypto':Js(False),u'Crypto':Js(False),u'CryptoKey':Js(False),u'CSS':Js(False),u'CSSAnimation':Js(False),u'CSSFontFaceRule':Js(False),u'CSSImportRule':Js(False),u'CSSKeyframeRule':Js(False),u'CSSKeyframesRule':Js(False),u'CSSMediaRule':Js(False),u'CSSPageRule':Js(False),u'CSSRule':Js(False),u'CSSRuleList':Js(False),u'CSSStyleDeclaration':Js(False),u'CSSStyleRule':Js(False),u'CSSStyleSheet':Js(False),u'CSSSupportsRule':Js(False),u'CSSTransition':Js(False),u'CSSUnknownRule':Js(False),u'CSSViewportRule':Js(False),u'CustomEvent':Js(False),u'DataTransfer':Js(False),u'DataTransferItem':Js(False),u'DataTransferItemList':Js(False),u'Debug':Js(False),u'defaultStatus':Js(False),u'defaultstatus':Js(False),u'DelayNode':Js(False),u'DeviceMotionEvent':Js(False),u'DeviceOrientationEvent':Js(False),u'devicePixelRatio':Js(False),u'dispatchEvent':Js(False),u'document':Js(False),u'Document':Js(False),u'DocumentFragment':Js(False),u'DocumentTimeline':Js(False),u'DocumentType':Js(False),u'DOMError':Js(False),u'DOMException':Js(False),u'DOMImplementation':Js(False),u'DOMParser':Js(False),u'DOMSettableTokenList':Js(False),u'DOMStringList':Js(False),u'DOMStringMap':Js(False),u'DOMTokenList':Js(False),u'DragEvent':Js(False),u'DynamicsCompressorNode':Js(False),u'Element':Js(False),u'ElementTimeControl':Js(False),u'ErrorEvent':Js(False),u'event':Js(False),u'Event':Js(False),u'EventSource':Js(False),u'EventTarget':Js(False),u'external':Js(False),u'FederatedCredential':Js(False),u'fetch':Js(False),u'File':Js(False),u'FileError':Js(False),u'FileList':Js(False),u'FileReader':Js(False),u'find':Js(False),u'focus':Js(False),u'FocusEvent':Js(False),u'FontFace':Js(False),u'FormData':Js(False),u'frameElement':Js(False),u'frames':Js(False),u'GainNode':Js(False),u'Gamepad':Js(False),u'GamepadButton':Js(False),u'GamepadEvent':Js(False),u'getComputedStyle':Js(False),u'getSelection':Js(False),u'HashChangeEvent':Js(False),u'Headers':Js(False),u'history':Js(False),u'History':Js(False),u'HTMLAllCollection':Js(False),u'HTMLAnchorElement':Js(False),u'HTMLAppletElement':Js(False),u'HTMLAreaElement':Js(False),u'HTMLAudioElement':Js(False),u'HTMLBaseElement':Js(False),u'HTMLBlockquoteElement':Js(False),u'HTMLBodyElement':Js(False),u'HTMLBRElement':Js(False),u'HTMLButtonElement':Js(False),u'HTMLCanvasElement':Js(False),u'HTMLCollection':Js(False),u'HTMLContentElement':Js(False),u'HTMLDataListElement':Js(False),u'HTMLDetailsElement':Js(False),u'HTMLDialogElement':Js(False),u'HTMLDirectoryElement':Js(False),u'HTMLDivElement':Js(False),u'HTMLDListElement':Js(False),u'HTMLDocument':Js(False),u'HTMLElement':Js(False),u'HTMLEmbedElement':Js(False),u'HTMLFieldSetElement':Js(False),u'HTMLFontElement':Js(False),u'HTMLFormControlsCollection':Js(False),u'HTMLFormElement':Js(False),u'HTMLFrameElement':Js(False),u'HTMLFrameSetElement':Js(False),u'HTMLHeadElement':Js(False),u'HTMLHeadingElement':Js(False),u'HTMLHRElement':Js(False),u'HTMLHtmlElement':Js(False),u'HTMLIFrameElement':Js(False),u'HTMLImageElement':Js(False),u'HTMLInputElement':Js(False),u'HTMLIsIndexElement':Js(False),u'HTMLKeygenElement':Js(False),u'HTMLLabelElement':Js(False),u'HTMLLayerElement':Js(False),u'HTMLLegendElement':Js(False),u'HTMLLIElement':Js(False),u'HTMLLinkElement':Js(False),u'HTMLMapElement':Js(False),u'HTMLMarqueeElement':Js(False),u'HTMLMediaElement':Js(False),u'HTMLMenuElement':Js(False),u'HTMLMetaElement':Js(False),u'HTMLMeterElement':Js(False),u'HTMLModElement':Js(False),u'HTMLObjectElement':Js(False),u'HTMLOListElement':Js(False),u'HTMLOptGroupElement':Js(False),u'HTMLOptionElement':Js(False),u'HTMLOptionsCollection':Js(False),u'HTMLOutputElement':Js(False),u'HTMLParagraphElement':Js(False),u'HTMLParamElement':Js(False),u'HTMLPictureElement':Js(False),u'HTMLPreElement':Js(False),u'HTMLProgressElement':Js(False),u'HTMLQuoteElement':Js(False),u'HTMLScriptElement':Js(False),u'HTMLSelectElement':Js(False),u'HTMLShadowElement':Js(False),u'HTMLSourceElement':Js(False),u'HTMLSpanElement':Js(False),u'HTMLStyleElement':Js(False),u'HTMLTableCaptionElement':Js(False),u'HTMLTableCellElement':Js(False),u'HTMLTableColElement':Js(False),u'HTMLTableElement':Js(False),u'HTMLTableRowElement':Js(False),u'HTMLTableSectionElement':Js(False),u'HTMLTemplateElement':Js(False),u'HTMLTextAreaElement':Js(False),u'HTMLTitleElement':Js(False),u'HTMLTrackElement':Js(False),u'HTMLUListElement':Js(False),u'HTMLUnknownElement':Js(False),u'HTMLVideoElement':Js(False),u'IDBCursor':Js(False),u'IDBCursorWithValue':Js(False),u'IDBDatabase':Js(False),u'IDBEnvironment':Js(False),u'IDBFactory':Js(False),u'IDBIndex':Js(False),u'IDBKeyRange':Js(False),u'IDBObjectStore':Js(False),u'IDBOpenDBRequest':Js(False),u'IDBRequest':Js(False),u'IDBTransaction':Js(False),u'IDBVersionChangeEvent':Js(False),u'Image':Js(False),u'ImageBitmap':Js(False),u'ImageData':Js(False),u'indexedDB':Js(False),u'innerHeight':Js(False),u'innerWidth':Js(False),u'InputEvent':Js(False),u'InputMethodContext':Js(False),u'IntersectionObserver':Js(False),u'IntersectionObserverEntry':Js(False),u'Intl':Js(False),u'KeyboardEvent':Js(False),u'KeyframeEffect':Js(False),u'KeyframeEffectReadOnly':Js(False),u'length':Js(False),u'localStorage':Js(False),u'location':Js(False),u'Location':Js(False),u'locationbar':Js(False),u'matchMedia':Js(False),u'MediaElementAudioSourceNode':Js(False),u'MediaEncryptedEvent':Js(False),u'MediaError':Js(False),u'MediaKeyError':Js(False),u'MediaKeyEvent':Js(False),u'MediaKeyMessageEvent':Js(False),u'MediaKeys':Js(False),u'MediaKeySession':Js(False),u'MediaKeyStatusMap':Js(False),u'MediaKeySystemAccess':Js(False),u'MediaList':Js(False),u'MediaQueryList':Js(False),u'MediaQueryListEvent':Js(False),u'MediaSource':Js(False),u'MediaStream':Js(False),u'MediaStreamAudioDestinationNode':Js(False),u'MediaStreamAudioSourceNode':Js(False),u'MediaStreamEvent':Js(False),u'MediaStreamTrack':Js(False),u'menubar':Js(False),u'MessageChannel':Js(False),u'MessageEvent':Js(False),u'MessagePort':Js(False),u'MIDIAccess':Js(False),u'MIDIConnectionEvent':Js(False),u'MIDIInput':Js(False),u'MIDIInputMap':Js(False),u'MIDIMessageEvent':Js(False),u'MIDIOutput':Js(False),u'MIDIOutputMap':Js(False),u'MIDIPort':Js(False),u'MimeType':Js(False),u'MimeTypeArray':Js(False),u'MouseEvent':Js(False),u'moveBy':Js(False),u'moveTo':Js(False),u'MutationEvent':Js(False),u'MutationObserver':Js(False),u'MutationRecord':Js(False),u'name':Js(False),u'NamedNodeMap':Js(False),u'navigator':Js(False),u'Navigator':Js(False),u'Node':Js(False),u'NodeFilter':Js(False),u'NodeIterator':Js(False),u'NodeList':Js(False),u'Notification':Js(False),u'OfflineAudioCompletionEvent':Js(False),u'OfflineAudioContext':Js(False),u'offscreenBuffering':Js(False),u'onbeforeunload':var.get(u'true'),u'onblur':var.get(u'true'),u'onerror':var.get(u'true'),u'onfocus':var.get(u'true'),u'onload':var.get(u'true'),u'onresize':var.get(u'true'),u'onunload':var.get(u'true'),u'open':Js(False),u'openDatabase':Js(False),u'opener':Js(False),u'opera':Js(False),u'Option':Js(False),u'OscillatorNode':Js(False),u'outerHeight':Js(False),u'outerWidth':Js(False),u'PageTransitionEvent':Js(False),u'pageXOffset':Js(False),u'pageYOffset':Js(False),u'parent':Js(False),u'PasswordCredential':Js(False),u'Path2D':Js(False),u'performance':Js(False),u'Performance':Js(False),u'PerformanceEntry':Js(False),u'PerformanceMark':Js(False),u'PerformanceMeasure':Js(False),u'PerformanceNavigation':Js(False),u'PerformanceResourceTiming':Js(False),u'PerformanceTiming':Js(False),u'PeriodicWave':Js(False),u'Permissions':Js(False),u'PermissionStatus':Js(False),u'personalbar':Js(False),u'Plugin':Js(False),u'PluginArray':Js(False),u'PopStateEvent':Js(False),u'postMessage':Js(False),u'print':Js(False),u'ProcessingInstruction':Js(False),u'ProgressEvent':Js(False),u'PromiseRejectionEvent':Js(False),u'prompt':Js(False),u'PushManager':Js(False),u'PushSubscription':Js(False),u'RadioNodeList':Js(False),u'Range':Js(False),u'ReadableByteStream':Js(False),u'ReadableStream':Js(False),u'removeEventListener':Js(False),u'Request':Js(False),u'requestAnimationFrame':Js(False),u'requestIdleCallback':Js(False),u'resizeBy':Js(False),u'resizeTo':Js(False),u'Response':Js(False),u'RTCIceCandidate':Js(False),u'RTCSessionDescription':Js(False),u'RTCPeerConnection':Js(False),u'screen':Js(False),u'Screen':Js(False),u'screenLeft':Js(False),u'ScreenOrientation':Js(False),u'screenTop':Js(False),u'screenX':Js(False),u'screenY':Js(False),u'ScriptProcessorNode':Js(False),u'scroll':Js(False),u'scrollbars':Js(False),u'scrollBy':Js(False),u'scrollTo':Js(False),u'scrollX':Js(False),u'scrollY':Js(False),u'SecurityPolicyViolationEvent':Js(False),u'Selection':Js(False),u'self':Js(False),u'ServiceWorker':Js(False),u'ServiceWorkerContainer':Js(False),u'ServiceWorkerRegistration':Js(False),u'sessionStorage':Js(False),u'setInterval':Js(False),u'setTimeout':Js(False),u'ShadowRoot':Js(False),u'SharedKeyframeList':Js(False),u'SharedWorker':Js(False),u'showModalDialog':Js(False),u'SiteBoundCredential':Js(False),u'speechSynthesis':Js(False),u'SpeechSynthesisEvent':Js(False),u'SpeechSynthesisUtterance':Js(False),u'status':Js(False),u'statusbar':Js(False),u'stop':Js(False),u'Storage':Js(False),u'StorageEvent':Js(False),u'styleMedia':Js(False),u'StyleSheet':Js(False),u'StyleSheetList':Js(False),u'SubtleCrypto':Js(False),u'SVGAElement':Js(False),u'SVGAltGlyphDefElement':Js(False),u'SVGAltGlyphElement':Js(False),u'SVGAltGlyphItemElement':Js(False),u'SVGAngle':Js(False),u'SVGAnimateColorElement':Js(False),u'SVGAnimatedAngle':Js(False),u'SVGAnimatedBoolean':Js(False),u'SVGAnimatedEnumeration':Js(False),u'SVGAnimatedInteger':Js(False),u'SVGAnimatedLength':Js(False),u'SVGAnimatedLengthList':Js(False),u'SVGAnimatedNumber':Js(False),u'SVGAnimatedNumberList':Js(False),u'SVGAnimatedPathData':Js(False),u'SVGAnimatedPoints':Js(False),u'SVGAnimatedPreserveAspectRatio':Js(False),u'SVGAnimatedRect':Js(False),u'SVGAnimatedString':Js(False),u'SVGAnimatedTransformList':Js(False),u'SVGAnimateElement':Js(False),u'SVGAnimateMotionElement':Js(False),u'SVGAnimateTransformElement':Js(False),u'SVGAnimationElement':Js(False),u'SVGCircleElement':Js(False),u'SVGClipPathElement':Js(False),u'SVGColor':Js(False),u'SVGColorProfileElement':Js(False),u'SVGColorProfileRule':Js(False),u'SVGComponentTransferFunctionElement':Js(False),u'SVGCSSRule':Js(False),u'SVGCursorElement':Js(False),u'SVGDefsElement':Js(False),u'SVGDescElement':Js(False),u'SVGDiscardElement':Js(False),u'SVGDocument':Js(False),u'SVGElement':Js(False),u'SVGElementInstance':Js(False),u'SVGElementInstanceList':Js(False),u'SVGEllipseElement':Js(False),u'SVGEvent':Js(False),u'SVGExternalResourcesRequired':Js(False),u'SVGFEBlendElement':Js(False),u'SVGFEColorMatrixElement':Js(False),u'SVGFEComponentTransferElement':Js(False),u'SVGFECompositeElement':Js(False),u'SVGFEConvolveMatrixElement':Js(False),u'SVGFEDiffuseLightingElement':Js(False),u'SVGFEDisplacementMapElement':Js(False),u'SVGFEDistantLightElement':Js(False),u'SVGFEDropShadowElement':Js(False),u'SVGFEFloodElement':Js(False),u'SVGFEFuncAElement':Js(False),u'SVGFEFuncBElement':Js(False),u'SVGFEFuncGElement':Js(False),u'SVGFEFuncRElement':Js(False),u'SVGFEGaussianBlurElement':Js(False),u'SVGFEImageElement':Js(False),u'SVGFEMergeElement':Js(False),u'SVGFEMergeNodeElement':Js(False),u'SVGFEMorphologyElement':Js(False),u'SVGFEOffsetElement':Js(False),u'SVGFEPointLightElement':Js(False),u'SVGFESpecularLightingElement':Js(False),u'SVGFESpotLightElement':Js(False),u'SVGFETileElement':Js(False),u'SVGFETurbulenceElement':Js(False),u'SVGFilterElement':Js(False),u'SVGFilterPrimitiveStandardAttributes':Js(False),u'SVGFitToViewBox':Js(False),u'SVGFontElement':Js(False),u'SVGFontFaceElement':Js(False),u'SVGFontFaceFormatElement':Js(False),u'SVGFontFaceNameElement':Js(False),u'SVGFontFaceSrcElement':Js(False),u'SVGFontFaceUriElement':Js(False),u'SVGForeignObjectElement':Js(False),u'SVGGElement':Js(False),u'SVGGeometryElement':Js(False),u'SVGGlyphElement':Js(False),u'SVGGlyphRefElement':Js(False),u'SVGGradientElement':Js(False),u'SVGGraphicsElement':Js(False),u'SVGHKernElement':Js(False),u'SVGICCColor':Js(False),u'SVGImageElement':Js(False),u'SVGLangSpace':Js(False),u'SVGLength':Js(False),u'SVGLengthList':Js(False),u'SVGLinearGradientElement':Js(False),u'SVGLineElement':Js(False),u'SVGLocatable':Js(False),u'SVGMarkerElement':Js(False),u'SVGMaskElement':Js(False),u'SVGMatrix':Js(False),u'SVGMetadataElement':Js(False),u'SVGMissingGlyphElement':Js(False),u'SVGMPathElement':Js(False),u'SVGNumber':Js(False),u'SVGNumberList':Js(False),u'SVGPaint':Js(False),u'SVGPathElement':Js(False),u'SVGPathSeg':Js(False),u'SVGPathSegArcAbs':Js(False),u'SVGPathSegArcRel':Js(False),u'SVGPathSegClosePath':Js(False),u'SVGPathSegCurvetoCubicAbs':Js(False),u'SVGPathSegCurvetoCubicRel':Js(False),u'SVGPathSegCurvetoCubicSmoothAbs':Js(False),u'SVGPathSegCurvetoCubicSmoothRel':Js(False),u'SVGPathSegCurvetoQuadraticAbs':Js(False),u'SVGPathSegCurvetoQuadraticRel':Js(False),u'SVGPathSegCurvetoQuadraticSmoothAbs':Js(False),u'SVGPathSegCurvetoQuadraticSmoothRel':Js(False),u'SVGPathSegLinetoAbs':Js(False),u'SVGPathSegLinetoHorizontalAbs':Js(False),u'SVGPathSegLinetoHorizontalRel':Js(False),u'SVGPathSegLinetoRel':Js(False),u'SVGPathSegLinetoVerticalAbs':Js(False),u'SVGPathSegLinetoVerticalRel':Js(False),u'SVGPathSegList':Js(False),u'SVGPathSegMovetoAbs':Js(False),u'SVGPathSegMovetoRel':Js(False),u'SVGPatternElement':Js(False),u'SVGPoint':Js(False),u'SVGPointList':Js(False),u'SVGPolygonElement':Js(False),u'SVGPolylineElement':Js(False),u'SVGPreserveAspectRatio':Js(False),u'SVGRadialGradientElement':Js(False),u'SVGRect':Js(False),u'SVGRectElement':Js(False),u'SVGRenderingIntent':Js(False),u'SVGScriptElement':Js(False),u'SVGSetElement':Js(False),u'SVGStopElement':Js(False),u'SVGStringList':Js(False),u'SVGStylable':Js(False),u'SVGStyleElement':Js(False),u'SVGSVGElement':Js(False),u'SVGSwitchElement':Js(False),u'SVGSymbolElement':Js(False),u'SVGTests':Js(False),u'SVGTextContentElement':Js(False),u'SVGTextElement':Js(False),u'SVGTextPathElement':Js(False),u'SVGTextPositioningElement':Js(False),u'SVGTitleElement':Js(False),u'SVGTransform':Js(False),u'SVGTransformable':Js(False),u'SVGTransformList':Js(False),u'SVGTRefElement':Js(False),u'SVGTSpanElement':Js(False),u'SVGUnitTypes':Js(False),u'SVGURIReference':Js(False),u'SVGUseElement':Js(False),u'SVGViewElement':Js(False),u'SVGViewSpec':Js(False),u'SVGVKernElement':Js(False),u'SVGZoomAndPan':Js(False),u'SVGZoomEvent':Js(False),u'Text':Js(False),u'TextDecoder':Js(False),u'TextEncoder':Js(False),u'TextEvent':Js(False),u'TextMetrics':Js(False),u'TextTrack':Js(False),u'TextTrackCue':Js(False),u'TextTrackCueList':Js(False),u'TextTrackList':Js(False),u'TimeEvent':Js(False),u'TimeRanges':Js(False),u'toolbar':Js(False),u'top':Js(False),u'Touch':Js(False),u'TouchEvent':Js(False),u'TouchList':Js(False),u'TrackEvent':Js(False),u'TransitionEvent':Js(False),u'TreeWalker':Js(False),u'UIEvent':Js(False),u'URL':Js(False),u'URLSearchParams':Js(False),u'ValidityState':Js(False),u'VTTCue':Js(False),u'WaveShaperNode':Js(False),u'WebGLActiveInfo':Js(False),u'WebGLBuffer':Js(False),u'WebGLContextEvent':Js(False),u'WebGLFramebuffer':Js(False),u'WebGLProgram':Js(False),u'WebGLRenderbuffer':Js(False),u'WebGLRenderingContext':Js(False),u'WebGLShader':Js(False),u'WebGLShaderPrecisionFormat':Js(False),u'WebGLTexture':Js(False),u'WebGLUniformLocation':Js(False),u'WebSocket':Js(False),u'WheelEvent':Js(False),u'window':Js(False),u'Window':Js(False),u'Worker':Js(False),u'XDomainRequest':Js(False),u'XMLDocument':Js(False),u'XMLHttpRequest':Js(False),u'XMLHttpRequestEventTarget':Js(False),u'XMLHttpRequestProgressEvent':Js(False),u'XMLHttpRequestUpload':Js(False),u'XMLSerializer':Js(False),u'XPathEvaluator':Js(False),u'XPathException':Js(False),u'XPathExpression':Js(False),u'XPathNamespace':Js(False),u'XPathNSResolver':Js(False),u'XPathResult':Js(False),u'XSLTProcessor':Js(False)}) + PyJs_Object_3328_ = Js({u'applicationCache':Js(False),u'atob':Js(False),u'Blob':Js(False),u'BroadcastChannel':Js(False),u'btoa':Js(False),u'Cache':Js(False),u'caches':Js(False),u'clearInterval':Js(False),u'clearTimeout':Js(False),u'close':var.get(u'true'),u'console':Js(False),u'fetch':Js(False),u'FileReaderSync':Js(False),u'FormData':Js(False),u'Headers':Js(False),u'IDBCursor':Js(False),u'IDBCursorWithValue':Js(False),u'IDBDatabase':Js(False),u'IDBFactory':Js(False),u'IDBIndex':Js(False),u'IDBKeyRange':Js(False),u'IDBObjectStore':Js(False),u'IDBOpenDBRequest':Js(False),u'IDBRequest':Js(False),u'IDBTransaction':Js(False),u'IDBVersionChangeEvent':Js(False),u'ImageData':Js(False),u'importScripts':var.get(u'true'),u'indexedDB':Js(False),u'location':Js(False),u'MessageChannel':Js(False),u'MessagePort':Js(False),u'name':Js(False),u'navigator':Js(False),u'Notification':Js(False),u'onclose':var.get(u'true'),u'onconnect':var.get(u'true'),u'onerror':var.get(u'true'),u'onlanguagechange':var.get(u'true'),u'onmessage':var.get(u'true'),u'onoffline':var.get(u'true'),u'ononline':var.get(u'true'),u'onrejectionhandled':var.get(u'true'),u'onunhandledrejection':var.get(u'true'),u'performance':Js(False),u'Performance':Js(False),u'PerformanceEntry':Js(False),u'PerformanceMark':Js(False),u'PerformanceMeasure':Js(False),u'PerformanceNavigation':Js(False),u'PerformanceResourceTiming':Js(False),u'PerformanceTiming':Js(False),u'postMessage':var.get(u'true'),u'Promise':Js(False),u'Request':Js(False),u'Response':Js(False),u'self':var.get(u'true'),u'ServiceWorkerRegistration':Js(False),u'setInterval':Js(False),u'setTimeout':Js(False),u'TextDecoder':Js(False),u'TextEncoder':Js(False),u'URL':Js(False),u'URLSearchParams':Js(False),u'WebSocket':Js(False),u'Worker':Js(False),u'XMLHttpRequest':Js(False)}) + PyJs_Object_3329_ = Js({u'__dirname':Js(False),u'__filename':Js(False),u'arguments':Js(False),u'Buffer':Js(False),u'clearImmediate':Js(False),u'clearInterval':Js(False),u'clearTimeout':Js(False),u'console':Js(False),u'exports':var.get(u'true'),u'GLOBAL':Js(False),u'global':Js(False),u'Intl':Js(False),u'module':Js(False),u'process':Js(False),u'require':Js(False),u'root':Js(False),u'setImmediate':Js(False),u'setInterval':Js(False),u'setTimeout':Js(False)}) + PyJs_Object_3330_ = Js({u'exports':var.get(u'true'),u'module':Js(False),u'require':Js(False),u'global':Js(False)}) + PyJs_Object_3331_ = Js({u'define':Js(False),u'require':Js(False)}) + PyJs_Object_3332_ = Js({u'after':Js(False),u'afterEach':Js(False),u'before':Js(False),u'beforeEach':Js(False),u'context':Js(False),u'describe':Js(False),u'it':Js(False),u'mocha':Js(False),u'run':Js(False),u'setup':Js(False),u'specify':Js(False),u'suite':Js(False),u'suiteSetup':Js(False),u'suiteTeardown':Js(False),u'teardown':Js(False),u'test':Js(False),u'xcontext':Js(False),u'xdescribe':Js(False),u'xit':Js(False),u'xspecify':Js(False)}) + PyJs_Object_3333_ = Js({u'afterAll':Js(False),u'afterEach':Js(False),u'beforeAll':Js(False),u'beforeEach':Js(False),u'describe':Js(False),u'expect':Js(False),u'fail':Js(False),u'fdescribe':Js(False),u'fit':Js(False),u'it':Js(False),u'jasmine':Js(False),u'pending':Js(False),u'runs':Js(False),u'spyOn':Js(False),u'waits':Js(False),u'waitsFor':Js(False),u'xdescribe':Js(False),u'xit':Js(False)}) + PyJs_Object_3334_ = Js({u'afterAll':Js(False),u'afterEach':Js(False),u'beforeAll':Js(False),u'beforeEach':Js(False),u'check':Js(False),u'describe':Js(False),u'expect':Js(False),u'gen':Js(False),u'it':Js(False),u'fit':Js(False),u'jest':Js(False),u'pit':Js(False),u'require':Js(False),u'test':Js(False),u'xdescribe':Js(False),u'xit':Js(False),u'xtest':Js(False)}) + PyJs_Object_3335_ = Js({u'asyncTest':Js(False),u'deepEqual':Js(False),u'equal':Js(False),u'expect':Js(False),u'module':Js(False),u'notDeepEqual':Js(False),u'notEqual':Js(False),u'notOk':Js(False),u'notPropEqual':Js(False),u'notStrictEqual':Js(False),u'ok':Js(False),u'propEqual':Js(False),u'QUnit':Js(False),u'raises':Js(False),u'start':Js(False),u'stop':Js(False),u'strictEqual':Js(False),u'test':Js(False),u'throws':Js(False)}) + PyJs_Object_3336_ = Js({u'console':var.get(u'true'),u'exports':var.get(u'true'),u'phantom':var.get(u'true'),u'require':var.get(u'true'),u'WebPage':var.get(u'true')}) + PyJs_Object_3337_ = Js({u'emit':Js(False),u'exports':Js(False),u'getRow':Js(False),u'log':Js(False),u'module':Js(False),u'provides':Js(False),u'require':Js(False),u'respond':Js(False),u'send':Js(False),u'start':Js(False),u'sum':Js(False)}) + PyJs_Object_3338_ = Js({u'defineClass':Js(False),u'deserialize':Js(False),u'gc':Js(False),u'help':Js(False),u'importClass':Js(False),u'importPackage':Js(False),u'java':Js(False),u'load':Js(False),u'loadClass':Js(False),u'Packages':Js(False),u'print':Js(False),u'quit':Js(False),u'readFile':Js(False),u'readUrl':Js(False),u'runCommand':Js(False),u'seal':Js(False),u'serialize':Js(False),u'spawn':Js(False),u'sync':Js(False),u'toint32':Js(False),u'version':Js(False)}) + PyJs_Object_3339_ = Js({u'__DIR__':Js(False),u'__FILE__':Js(False),u'__LINE__':Js(False),u'com':Js(False),u'edu':Js(False),u'exit':Js(False),u'Java':Js(False),u'java':Js(False),u'javafx':Js(False),u'JavaImporter':Js(False),u'javax':Js(False),u'JSAdapter':Js(False),u'load':Js(False),u'loadWithNewGlobal':Js(False),u'org':Js(False),u'Packages':Js(False),u'print':Js(False),u'quit':Js(False)}) + PyJs_Object_3340_ = Js({u'ActiveXObject':var.get(u'true'),u'Enumerator':var.get(u'true'),u'GetObject':var.get(u'true'),u'ScriptEngine':var.get(u'true'),u'ScriptEngineBuildVersion':var.get(u'true'),u'ScriptEngineMajorVersion':var.get(u'true'),u'ScriptEngineMinorVersion':var.get(u'true'),u'VBArray':var.get(u'true'),u'WScript':var.get(u'true'),u'WSH':var.get(u'true'),u'XDomainRequest':var.get(u'true')}) + PyJs_Object_3341_ = Js({u'$':Js(False),u'jQuery':Js(False)}) + PyJs_Object_3342_ = Js({u'Y':Js(False),u'YUI':Js(False),u'YUI_config':Js(False)}) + PyJs_Object_3343_ = Js({u'cat':Js(False),u'cd':Js(False),u'chmod':Js(False),u'config':Js(False),u'cp':Js(False),u'dirs':Js(False),u'echo':Js(False),u'env':Js(False),u'error':Js(False),u'exec':Js(False),u'exit':Js(False),u'find':Js(False),u'grep':Js(False),u'ls':Js(False),u'ln':Js(False),u'mkdir':Js(False),u'mv':Js(False),u'popd':Js(False),u'pushd':Js(False),u'pwd':Js(False),u'rm':Js(False),u'sed':Js(False),u'set':Js(False),u'target':Js(False),u'tempdir':Js(False),u'test':Js(False),u'touch':Js(False),u'which':Js(False)}) + PyJs_Object_3344_ = Js({u'$':Js(False),u'$$':Js(False),u'$A':Js(False),u'$break':Js(False),u'$continue':Js(False),u'$F':Js(False),u'$H':Js(False),u'$R':Js(False),u'$w':Js(False),u'Abstract':Js(False),u'Ajax':Js(False),u'Autocompleter':Js(False),u'Builder':Js(False),u'Class':Js(False),u'Control':Js(False),u'Draggable':Js(False),u'Draggables':Js(False),u'Droppables':Js(False),u'Effect':Js(False),u'Element':Js(False),u'Enumerable':Js(False),u'Event':Js(False),u'Field':Js(False),u'Form':Js(False),u'Hash':Js(False),u'Insertion':Js(False),u'ObjectRange':Js(False),u'PeriodicalExecuter':Js(False),u'Position':Js(False),u'Prototype':Js(False),u'Scriptaculous':Js(False),u'Selector':Js(False),u'Sortable':Js(False),u'SortableObserver':Js(False),u'Sound':Js(False),u'Template':Js(False),u'Toggle':Js(False),u'Try':Js(False)}) + PyJs_Object_3345_ = Js({u'$':Js(False),u'_':Js(False),u'Accounts':Js(False),u'AccountsClient':Js(False),u'AccountsServer':Js(False),u'AccountsCommon':Js(False),u'App':Js(False),u'Assets':Js(False),u'Blaze':Js(False),u'check':Js(False),u'Cordova':Js(False),u'DDP':Js(False),u'DDPServer':Js(False),u'DDPRateLimiter':Js(False),u'Deps':Js(False),u'EJSON':Js(False),u'Email':Js(False),u'HTTP':Js(False),u'Log':Js(False),u'Match':Js(False),u'Meteor':Js(False),u'Mongo':Js(False),u'MongoInternals':Js(False),u'Npm':Js(False),u'Package':Js(False),u'Plugin':Js(False),u'process':Js(False),u'Random':Js(False),u'ReactiveDict':Js(False),u'ReactiveVar':Js(False),u'Router':Js(False),u'ServiceConfiguration':Js(False),u'Session':Js(False),u'share':Js(False),u'Spacebars':Js(False),u'Template':Js(False),u'Tinytest':Js(False),u'Tracker':Js(False),u'UI':Js(False),u'Utils':Js(False),u'WebApp':Js(False),u'WebAppInternals':Js(False)}) + PyJs_Object_3346_ = Js({u'_isWindows':Js(False),u'_rand':Js(False),u'BulkWriteResult':Js(False),u'cat':Js(False),u'cd':Js(False),u'connect':Js(False),u'db':Js(False),u'getHostName':Js(False),u'getMemInfo':Js(False),u'hostname':Js(False),u'ISODate':Js(False),u'listFiles':Js(False),u'load':Js(False),u'ls':Js(False),u'md5sumFile':Js(False),u'mkdir':Js(False),u'Mongo':Js(False),u'NumberInt':Js(False),u'NumberLong':Js(False),u'ObjectId':Js(False),u'PlanCache':Js(False),u'print':Js(False),u'printjson':Js(False),u'pwd':Js(False),u'quit':Js(False),u'removeFile':Js(False),u'rs':Js(False),u'sh':Js(False),u'UUID':Js(False),u'version':Js(False),u'WriteResult':Js(False)}) + PyJs_Object_3347_ = Js({u'$':Js(False),u'Application':Js(False),u'Automation':Js(False),u'console':Js(False),u'delay':Js(False),u'Library':Js(False),u'ObjC':Js(False),u'ObjectSpecifier':Js(False),u'Path':Js(False),u'Progress':Js(False),u'Ref':Js(False)}) + PyJs_Object_3348_ = Js({u'caches':Js(False),u'Cache':Js(False),u'CacheStorage':Js(False),u'Client':Js(False),u'clients':Js(False),u'Clients':Js(False),u'ExtendableEvent':Js(False),u'ExtendableMessageEvent':Js(False),u'FetchEvent':Js(False),u'importScripts':Js(False),u'registration':Js(False),u'self':Js(False),u'ServiceWorker':Js(False),u'ServiceWorkerContainer':Js(False),u'ServiceWorkerGlobalScope':Js(False),u'ServiceWorkerMessageEvent':Js(False),u'ServiceWorkerRegistration':Js(False),u'skipWaiting':Js(False),u'WindowClient':Js(False)}) + PyJs_Object_3349_ = Js({u'advanceClock':Js(False),u'fakeClearInterval':Js(False),u'fakeClearTimeout':Js(False),u'fakeSetInterval':Js(False),u'fakeSetTimeout':Js(False),u'resetTimeouts':Js(False),u'waitsForPromise':Js(False)}) + PyJs_Object_3350_ = Js({u'andThen':Js(False),u'click':Js(False),u'currentPath':Js(False),u'currentRouteName':Js(False),u'currentURL':Js(False),u'fillIn':Js(False),u'find':Js(False),u'findWithAssert':Js(False),u'keyEvent':Js(False),u'pauseTest':Js(False),u'triggerEvent':Js(False),u'visit':Js(False)}) + PyJs_Object_3351_ = Js({u'$':Js(False),u'$$':Js(False),u'browser':Js(False),u'By':Js(False),u'by':Js(False),u'DartObject':Js(False),u'element':Js(False),u'protractor':Js(False)}) + PyJs_Object_3352_ = Js({u'clearInterval':Js(False),u'clearTimeout':Js(False),u'console':Js(False),u'setInterval':Js(False),u'setTimeout':Js(False)}) + PyJs_Object_3353_ = Js({u'browser':Js(False),u'chrome':Js(False),u'opr':Js(False)}) + PyJs_Object_3354_ = Js({u'GM_addStyle':Js(False),u'GM_deleteValue':Js(False),u'GM_getResourceText':Js(False),u'GM_getResourceURL':Js(False),u'GM_getValue':Js(False),u'GM_info':Js(False),u'GM_listValues':Js(False),u'GM_log':Js(False),u'GM_openInTab':Js(False),u'GM_registerMenuCommand':Js(False),u'GM_setClipboard':Js(False),u'GM_setValue':Js(False),u'GM_xmlhttpRequest':Js(False),u'unsafeWindow':Js(False)}) + PyJs_Object_3323_ = Js({u'builtin':PyJs_Object_3324_,u'es5':PyJs_Object_3325_,u'es6':PyJs_Object_3326_,u'browser':PyJs_Object_3327_,u'worker':PyJs_Object_3328_,u'node':PyJs_Object_3329_,u'commonjs':PyJs_Object_3330_,u'amd':PyJs_Object_3331_,u'mocha':PyJs_Object_3332_,u'jasmine':PyJs_Object_3333_,u'jest':PyJs_Object_3334_,u'qunit':PyJs_Object_3335_,u'phantomjs':PyJs_Object_3336_,u'couch':PyJs_Object_3337_,u'rhino':PyJs_Object_3338_,u'nashorn':PyJs_Object_3339_,u'wsh':PyJs_Object_3340_,u'jquery':PyJs_Object_3341_,u'yui':PyJs_Object_3342_,u'shelljs':PyJs_Object_3343_,u'prototypejs':PyJs_Object_3344_,u'meteor':PyJs_Object_3345_,u'mongo':PyJs_Object_3346_,u'applescript':PyJs_Object_3347_,u'serviceworker':PyJs_Object_3348_,u'atomtest':PyJs_Object_3349_,u'embertest':PyJs_Object_3350_,u'protractor':PyJs_Object_3351_,u'shared-node-browser':PyJs_Object_3352_,u'webextensions':PyJs_Object_3353_,u'greasemonkey':PyJs_Object_3354_}) + var.get(u'module').put(u'exports', PyJs_Object_3323_) +PyJs_anonymous_3322_._set_name(u'anonymous') +PyJs_Object_3355_ = Js({}) +@Js +def PyJs_anonymous_3356_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./globals.json'))) +PyJs_anonymous_3356_._set_name(u'anonymous') +PyJs_Object_3357_ = Js({u'./globals.json':Js(277.0)}) +@Js +def PyJs_anonymous_3358_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u're', u'require', u'ansiRegex', u'exports', u'module']) + Js(u'use strict') + var.put(u'ansiRegex', var.get(u'require')(Js(u'ansi-regex'))) + var.put(u're', var.get(u'RegExp').create(var.get(u'ansiRegex')().get(u'source'))) + var.get(u'module').put(u'exports', var.get(u're').get(u'test').callprop(u'bind', var.get(u're'))) +PyJs_anonymous_3358_._set_name(u'anonymous') +PyJs_Object_3359_ = Js({u'ansi-regex':Js(2.0)}) +@Js +def PyJs_anonymous_3360_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_3361_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'process', u'invariant']) + Js(u'use strict') + @Js + def PyJs_anonymous_3362_(condition, format, a, b, c, d, e, f, this, arguments, var=var): + var = Scope({u'a':a, u'c':c, u'b':b, u'e':e, u'd':d, u'format':format, u'this':this, u'f':f, u'arguments':arguments, u'condition':condition}, var) + var.registers([u'a', u'c', u'b', u'e', u'd', u'f', u'format', u'args', u'argIndex', u'error', u'condition']) + if PyJsStrictNeq(var.get(u'process').get(u'env').get(u'NODE_ENV'),Js(u'production')): + if PyJsStrictEq(var.get(u'format'),var.get(u'undefined')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'invariant requires an error message argument'))) + raise PyJsTempException + if var.get(u'condition').neg(): + pass + if PyJsStrictEq(var.get(u'format'),var.get(u'undefined')): + var.put(u'error', var.get(u'Error').create((Js(u'Minified exception occurred; use the non-minified dev environment ')+Js(u'for the full error message and additional helpful warnings.')))) + else: + var.put(u'args', Js([var.get(u'a'), var.get(u'b'), var.get(u'c'), var.get(u'd'), var.get(u'e'), var.get(u'f')])) + var.put(u'argIndex', Js(0.0)) + @Js + def PyJs_anonymous_3363_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'args').get((var.put(u'argIndex',Js(var.get(u'argIndex').to_number())+Js(1))-Js(1))) + PyJs_anonymous_3363_._set_name(u'anonymous') + var.put(u'error', var.get(u'Error').create(var.get(u'format').callprop(u'replace', JsRegExp(u'/%s/g'), PyJs_anonymous_3363_))) + var.get(u'error').put(u'name', Js(u'Invariant Violation')) + var.get(u'error').put(u'framesToPop', Js(1.0)) + PyJsTempException = JsToPyException(var.get(u'error')) + raise PyJsTempException + PyJs_anonymous_3362_._set_name(u'anonymous') + var.put(u'invariant', PyJs_anonymous_3362_) + var.get(u'module').put(u'exports', var.get(u'invariant')) + PyJs_anonymous_3361_._set_name(u'anonymous') + PyJs_anonymous_3361_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_3360_._set_name(u'anonymous') +PyJs_Object_3364_ = Js({u'_process':Js(531.0)}) +@Js +def PyJs_anonymous_3365_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'numberIsNan', u'require', u'exports', u'module']) + Js(u'use strict') + var.put(u'numberIsNan', var.get(u'require')(Js(u'number-is-nan'))) + @Js + def PyJs_anonymous_3366_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + return (((PyJsStrictNeq(var.get(u'val',throw=False).typeof(),Js(u'number')) or var.get(u'numberIsNan')(var.get(u'val'))) or PyJsStrictEq(var.get(u'val'),var.get(u'Infinity'))) or PyJsStrictEq(var.get(u'val'),(-var.get(u'Infinity')))).neg() + PyJs_anonymous_3366_._set_name(u'anonymous') + var.get(u'module').put(u'exports', (var.get(u'Number').get(u'isFinite') or PyJs_anonymous_3366_)) +PyJs_anonymous_3365_._set_name(u'anonymous') +PyJs_Object_3367_ = Js({u'number-is-nan':Js(498.0)}) +@Js +def PyJs_anonymous_3368_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + def PyJs_LONG_3369_(var=var): + return var.get(u'module').put(u'exports', JsRegExp(u'/(([\'"])(?:(?!\\2|\\\\).|\\\\(?:\\r\\n|[\\s\\S]))*(\\2)?|`(?:[^`\\\\$]|\\\\[\\s\\S]|\\$(?!\\{)|\\$\\{(?:[^{}]|\\{[^}]*\\}?)*\\}?)*(`)?)|(\\/\\/.*)|(\\/\\*(?:[^*]|\\*(?!\\/))*(\\*\\/)?)|(\\/(?!\\*)(?:\\[(?:(?![\\]\\\\]).|\\\\.)*\\]|(?![\\/\\]\\\\]).|\\\\.)+\\/(?:(?!\\s*(?:\\b|[\\u0080-\\uFFFF$\\\\\'"~({]|[+\\-!](?!=)|\\.?\\d))|[gmiyu]{1,5}\\b(?![\\u0080-\\uFFFF$\\\\]|\\s*(?:[+\\-*%&|^<>!=?({]|\\/(?![\\/*])))))|(0[xX][\\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?)|((?!\\d)(?:(?!\\s)[$\\w\\u0080-\\uFFFF]|\\\\u[\\da-fA-F]{4}|\\\\u\\{[\\da-fA-F]{1,6}\\})+)|(--|\\+\\+|&&|\\|\\||=>|\\.{3}|(?:[+\\-\\/%&|^]|\\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\\](){}])|(\\s+)|(^$|[\\s\\S])/g')) + PyJs_LONG_3369_() + @Js + def PyJs_anonymous_3370_(match, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'match':match}, var) + var.registers([u'token', u'match']) + PyJs_Object_3371_ = Js({u'type':Js(u'invalid'),u'value':var.get(u'match').get(u'0')}) + var.put(u'token', PyJs_Object_3371_) + if var.get(u'match').get(u'1'): + PyJsComma(var.get(u'token').put(u'type', Js(u'string')),var.get(u'token').put(u'closed', (var.get(u'match').get(u'3') or var.get(u'match').get(u'4')).neg().neg())) + else: + if var.get(u'match').get(u'5'): + var.get(u'token').put(u'type', Js(u'comment')) + else: + if var.get(u'match').get(u'6'): + PyJsComma(var.get(u'token').put(u'type', Js(u'comment')),var.get(u'token').put(u'closed', var.get(u'match').get(u'7').neg().neg())) + else: + if var.get(u'match').get(u'8'): + var.get(u'token').put(u'type', Js(u'regex')) + else: + if var.get(u'match').get(u'9'): + var.get(u'token').put(u'type', Js(u'number')) + else: + if var.get(u'match').get(u'10'): + var.get(u'token').put(u'type', Js(u'name')) + else: + if var.get(u'match').get(u'11'): + var.get(u'token').put(u'type', Js(u'punctuator')) + else: + if var.get(u'match').get(u'12'): + var.get(u'token').put(u'type', Js(u'whitespace')) + return var.get(u'token') + PyJs_anonymous_3370_._set_name(u'anonymous') + var.get(u'module').get(u'exports').put(u'matchToToken', PyJs_anonymous_3370_) +PyJs_anonymous_3368_._set_name(u'anonymous') +PyJs_Object_3372_ = Js({}) +@Js +def PyJs_anonymous_3373_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_3374_ = Js({}) + @Js + def PyJs_anonymous_3375_(PyJsArg_676c6f62616c_, this, arguments, var=var): + var = Scope({u'this':this, u'global':PyJsArg_676c6f62616c_, u'arguments':arguments}, var) + var.registers([u'global']) + pass + @Js + def PyJs_anonymous_3376_(root, this, arguments, var=var): + var = Scope({u'this':this, u'root':root, u'arguments':arguments}, var) + var.registers([u'singleEscapes', u'freeModule', u'freeGlobal', u'freeExports', u'isFunction', u'forOwn', u'toString', u'regexSingleEscape', u'jsesc', u'isSet', u'isArray', u'extend', u'object', u'hasOwnProperty', u'isNumber', u'isObject', u'regexDigit', u'isString', u'isMap', u'root', u'regexWhitelist', u'forEach']) + var.put(u'freeExports', ((var.get(u'exports',throw=False).typeof()==Js(u'object')) and var.get(u'exports'))) + var.put(u'freeModule', ((((var.get(u'module',throw=False).typeof()==Js(u'object')) and var.get(u'module')) and (var.get(u'module').get(u'exports')==var.get(u'freeExports'))) and var.get(u'module'))) + var.put(u'freeGlobal', ((var.get(u'global',throw=False).typeof()==Js(u'object')) and var.get(u'global'))) + if (PyJsStrictEq(var.get(u'freeGlobal').get(u'global'),var.get(u'freeGlobal')) or PyJsStrictEq(var.get(u'freeGlobal').get(u'window'),var.get(u'freeGlobal'))): + var.put(u'root', var.get(u'freeGlobal')) + PyJs_Object_3377_ = Js({}) + var.put(u'object', PyJs_Object_3377_) + var.put(u'hasOwnProperty', var.get(u'object').get(u'hasOwnProperty')) + @Js + def PyJs_anonymous_3378_(object, callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'object':object, u'arguments':arguments}, var) + var.registers([u'callback', u'object', u'key']) + pass + for PyJsTemp in var.get(u'object'): + var.put(u'key', PyJsTemp) + if var.get(u'hasOwnProperty').callprop(u'call', var.get(u'object'), var.get(u'key')): + var.get(u'callback')(var.get(u'key'), var.get(u'object').get(var.get(u'key'))) + PyJs_anonymous_3378_._set_name(u'anonymous') + var.put(u'forOwn', PyJs_anonymous_3378_) + @Js + def PyJs_anonymous_3379_(destination, source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'destination':destination, u'arguments':arguments}, var) + var.registers([u'source', u'destination']) + if var.get(u'source').neg(): + return var.get(u'destination') + @Js + def PyJs_anonymous_3380_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + var.get(u'destination').put(var.get(u'key'), var.get(u'value')) + PyJs_anonymous_3380_._set_name(u'anonymous') + var.get(u'forOwn')(var.get(u'source'), PyJs_anonymous_3380_) + return var.get(u'destination') + PyJs_anonymous_3379_._set_name(u'anonymous') + var.put(u'extend', PyJs_anonymous_3379_) + @Js + def PyJs_anonymous_3381_(array, callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'array':array, u'arguments':arguments}, var) + var.registers([u'index', u'length', u'array', u'callback']) + var.put(u'length', var.get(u'array').get(u'length')) + var.put(u'index', (-Js(1.0))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.get(u'callback')(var.get(u'array').get(var.get(u'index'))) + PyJs_anonymous_3381_._set_name(u'anonymous') + var.put(u'forEach', PyJs_anonymous_3381_) + var.put(u'toString', var.get(u'object').get(u'toString')) + @Js + def PyJs_anonymous_3382_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'toString').callprop(u'call', var.get(u'value'))==Js(u'[object Array]')) + PyJs_anonymous_3382_._set_name(u'anonymous') + var.put(u'isArray', PyJs_anonymous_3382_) + @Js + def PyJs_anonymous_3383_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'toString').callprop(u'call', var.get(u'value'))==Js(u'[object Object]')) + PyJs_anonymous_3383_._set_name(u'anonymous') + var.put(u'isObject', PyJs_anonymous_3383_) + @Js + def PyJs_anonymous_3384_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'value',throw=False).typeof()==Js(u'string')) or (var.get(u'toString').callprop(u'call', var.get(u'value'))==Js(u'[object String]'))) + PyJs_anonymous_3384_._set_name(u'anonymous') + var.put(u'isString', PyJs_anonymous_3384_) + @Js + def PyJs_anonymous_3385_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'value',throw=False).typeof()==Js(u'number')) or (var.get(u'toString').callprop(u'call', var.get(u'value'))==Js(u'[object Number]'))) + PyJs_anonymous_3385_._set_name(u'anonymous') + var.put(u'isNumber', PyJs_anonymous_3385_) + @Js + def PyJs_anonymous_3386_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'value',throw=False).typeof()==Js(u'function')) or (var.get(u'toString').callprop(u'call', var.get(u'value'))==Js(u'[object Function]'))) + PyJs_anonymous_3386_._set_name(u'anonymous') + var.put(u'isFunction', PyJs_anonymous_3386_) + @Js + def PyJs_anonymous_3387_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'toString').callprop(u'call', var.get(u'value'))==Js(u'[object Map]')) + PyJs_anonymous_3387_._set_name(u'anonymous') + var.put(u'isMap', PyJs_anonymous_3387_) + @Js + def PyJs_anonymous_3388_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'toString').callprop(u'call', var.get(u'value'))==Js(u'[object Set]')) + PyJs_anonymous_3388_._set_name(u'anonymous') + var.put(u'isSet', PyJs_anonymous_3388_) + PyJs_Object_3389_ = Js({u'"':Js(u'\\"'),u"'":Js(u"\\'"),u'\\':Js(u'\\\\'),u'\x08':Js(u'\\b'),u'\x0c':Js(u'\\f'),u'\n':Js(u'\\n'),u'\r':Js(u'\\r'),u'\t':Js(u'\\t')}) + var.put(u'singleEscapes', PyJs_Object_3389_) + var.put(u'regexSingleEscape', JsRegExp(u'/["\'\\\\\\b\\f\\n\\r\\t]/')) + var.put(u'regexDigit', JsRegExp(u'/[0-9]/')) + var.put(u'regexWhitelist', JsRegExp(u'/[ !#-&\\(-\\[\\]-~]/')) + @Js + def PyJs_anonymous_3390_(argument, options, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'argument':argument, u'options':options}, var) + var.registers([u'useHexNumbers', u'inline2', u'inline1', u'argument', u'lowercaseHex', u'escaped', u'second', u'result', u'compact', u'index', u'codePoint', u'useDecNumbers', u'character', u'json', u'isEmpty', u'tmp', u'string', u'quote', u'charCode', u'oldIndent', u'indent', u'newLine', u'useOctNumbers', u'useBinNumbers', u'length', u'defaults', u'longhand', u'hexadecimal', u'options', u'first']) + PyJs_Object_3391_ = Js({u'escapeEverything':Js(False),u'escapeEtago':Js(False),u'quotes':Js(u'single'),u'wrap':Js(False),u'es6':Js(False),u'json':Js(False),u'compact':var.get(u'true'),u'lowercaseHex':Js(False),u'numbers':Js(u'decimal'),u'indent':Js(u'\t'),u'__indent__':Js(u''),u'__inline1__':Js(False),u'__inline2__':Js(False)}) + var.put(u'defaults', PyJs_Object_3391_) + var.put(u'json', (var.get(u'options') and var.get(u'options').get(u'json'))) + if var.get(u'json'): + var.get(u'defaults').put(u'quotes', Js(u'double')) + var.get(u'defaults').put(u'wrap', var.get(u'true')) + var.put(u'options', var.get(u'extend')(var.get(u'defaults'), var.get(u'options'))) + if ((var.get(u'options').get(u'quotes')!=Js(u'single')) and (var.get(u'options').get(u'quotes')!=Js(u'double'))): + var.get(u'options').put(u'quotes', Js(u'single')) + var.put(u'quote', (Js(u'"') if (var.get(u'options').get(u'quotes')==Js(u'double')) else Js(u"'"))) + var.put(u'compact', var.get(u'options').get(u'compact')) + var.put(u'indent', var.get(u'options').get(u'indent')) + var.put(u'lowercaseHex', var.get(u'options').get(u'lowercaseHex')) + var.put(u'oldIndent', Js(u'')) + var.put(u'inline1', var.get(u'options').get(u'__inline1__')) + var.put(u'inline2', var.get(u'options').get(u'__inline2__')) + var.put(u'newLine', (Js(u'') if var.get(u'compact') else Js(u'\n'))) + pass + var.put(u'isEmpty', var.get(u'true')) + var.put(u'useBinNumbers', (var.get(u'options').get(u'numbers')==Js(u'binary'))) + var.put(u'useOctNumbers', (var.get(u'options').get(u'numbers')==Js(u'octal'))) + var.put(u'useDecNumbers', (var.get(u'options').get(u'numbers')==Js(u'decimal'))) + var.put(u'useHexNumbers', (var.get(u'options').get(u'numbers')==Js(u'hexadecimal'))) + if ((var.get(u'json') and var.get(u'argument')) and var.get(u'isFunction')(var.get(u'argument').get(u'toJSON'))): + var.put(u'argument', var.get(u'argument').callprop(u'toJSON')) + if var.get(u'isString')(var.get(u'argument')).neg(): + if var.get(u'isMap')(var.get(u'argument')): + if (var.get(u'argument').get(u'size')==Js(0.0)): + return Js(u'new Map()') + if var.get(u'compact').neg(): + var.get(u'options').put(u'__inline1__', var.get(u'true')) + return ((Js(u'new Map(')+var.get(u'jsesc')(var.get(u'Array').callprop(u'from', var.get(u'argument')), var.get(u'options')))+Js(u')')) + if var.get(u'isSet')(var.get(u'argument')): + if (var.get(u'argument').get(u'size')==Js(0.0)): + return Js(u'new Set()') + return ((Js(u'new Set(')+var.get(u'jsesc')(var.get(u'Array').callprop(u'from', var.get(u'argument')), var.get(u'options')))+Js(u')')) + if var.get(u'isArray')(var.get(u'argument')): + var.put(u'result', Js([])) + var.get(u'options').put(u'wrap', var.get(u'true')) + if var.get(u'inline1'): + var.get(u'options').put(u'__inline1__', Js(False)) + var.get(u'options').put(u'__inline2__', var.get(u'true')) + else: + var.put(u'oldIndent', var.get(u'options').get(u'__indent__')) + var.put(u'indent', var.get(u'oldIndent'), u'+') + var.get(u'options').put(u'__indent__', var.get(u'indent')) + @Js + def PyJs_anonymous_3392_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + var.put(u'isEmpty', Js(False)) + if var.get(u'inline2'): + var.get(u'options').put(u'__inline2__', Js(False)) + var.get(u'result').callprop(u'push', ((Js(u'') if (var.get(u'compact') or var.get(u'inline2')) else var.get(u'indent'))+var.get(u'jsesc')(var.get(u'value'), var.get(u'options')))) + PyJs_anonymous_3392_._set_name(u'anonymous') + var.get(u'forEach')(var.get(u'argument'), PyJs_anonymous_3392_) + if var.get(u'isEmpty'): + return Js(u'[]') + if var.get(u'inline2'): + return ((Js(u'[')+var.get(u'result').callprop(u'join', Js(u', ')))+Js(u']')) + return (((((Js(u'[')+var.get(u'newLine'))+var.get(u'result').callprop(u'join', (Js(u',')+var.get(u'newLine'))))+var.get(u'newLine'))+(Js(u'') if var.get(u'compact') else var.get(u'oldIndent')))+Js(u']')) + else: + if var.get(u'isNumber')(var.get(u'argument')): + if var.get(u'json'): + return var.get(u'JSON').callprop(u'stringify', var.get(u'argument')) + if var.get(u'useDecNumbers'): + return var.get(u'String')(var.get(u'argument')) + if var.get(u'useHexNumbers'): + var.put(u'tmp', var.get(u'argument').callprop(u'toString', Js(16.0))) + if var.get(u'lowercaseHex').neg(): + var.put(u'tmp', var.get(u'tmp').callprop(u'toUpperCase')) + return (Js(u'0x')+var.get(u'tmp')) + if var.get(u'useBinNumbers'): + return (Js(u'0b')+var.get(u'argument').callprop(u'toString', Js(2.0))) + if var.get(u'useOctNumbers'): + return (Js(u'0o')+var.get(u'argument').callprop(u'toString', Js(8.0))) + else: + if var.get(u'isObject')(var.get(u'argument')).neg(): + if var.get(u'json'): + return (var.get(u'JSON').callprop(u'stringify', var.get(u'argument')) or Js(u'null')) + return var.get(u'String')(var.get(u'argument')) + else: + var.put(u'result', Js([])) + var.get(u'options').put(u'wrap', var.get(u'true')) + var.put(u'oldIndent', var.get(u'options').get(u'__indent__')) + var.put(u'indent', var.get(u'oldIndent'), u'+') + var.get(u'options').put(u'__indent__', var.get(u'indent')) + @Js + def PyJs_anonymous_3393_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + var.put(u'isEmpty', Js(False)) + var.get(u'result').callprop(u'push', (((((Js(u'') if var.get(u'compact') else var.get(u'indent'))+var.get(u'jsesc')(var.get(u'key'), var.get(u'options')))+Js(u':'))+(Js(u'') if var.get(u'compact') else Js(u' ')))+var.get(u'jsesc')(var.get(u'value'), var.get(u'options')))) + PyJs_anonymous_3393_._set_name(u'anonymous') + var.get(u'forOwn')(var.get(u'argument'), PyJs_anonymous_3393_) + if var.get(u'isEmpty'): + return Js(u'{}') + return (((((Js(u'{')+var.get(u'newLine'))+var.get(u'result').callprop(u'join', (Js(u',')+var.get(u'newLine'))))+var.get(u'newLine'))+(Js(u'') if var.get(u'compact') else var.get(u'oldIndent')))+Js(u'}')) + var.put(u'string', var.get(u'argument')) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'string').get(u'length')) + pass + pass + pass + var.put(u'result', Js(u'')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'character', var.get(u'string').callprop(u'charAt', var.get(u'index'))) + if var.get(u'options').get(u'es6'): + var.put(u'first', var.get(u'string').callprop(u'charCodeAt', var.get(u'index'))) + if (((var.get(u'first')>=Js(55296)) and (var.get(u'first')<=Js(56319))) and (var.get(u'length')>(var.get(u'index')+Js(1.0)))): + var.put(u'second', var.get(u'string').callprop(u'charCodeAt', (var.get(u'index')+Js(1.0)))) + if ((var.get(u'second')>=Js(56320)) and (var.get(u'second')<=Js(57343))): + var.put(u'codePoint', (((((var.get(u'first')-Js(55296))*Js(1024))+var.get(u'second'))-Js(56320))+Js(65536))) + var.put(u'hexadecimal', var.get(u'codePoint').callprop(u'toString', Js(16.0))) + if var.get(u'lowercaseHex').neg(): + var.put(u'hexadecimal', var.get(u'hexadecimal').callprop(u'toUpperCase')) + var.put(u'result', ((Js(u'\\u{')+var.get(u'hexadecimal'))+Js(u'}')), u'+') + (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)) + continue + if var.get(u'options').get(u'escapeEverything').neg(): + if var.get(u'regexWhitelist').callprop(u'test', var.get(u'character')): + var.put(u'result', var.get(u'character'), u'+') + continue + if (var.get(u'character')==Js(u'"')): + var.put(u'result', (Js(u'\\"') if (var.get(u'quote')==var.get(u'character')) else var.get(u'character')), u'+') + continue + if (var.get(u'character')==Js(u"'")): + var.put(u'result', (Js(u"\\'") if (var.get(u'quote')==var.get(u'character')) else var.get(u'character')), u'+') + continue + if (((var.get(u'character')==Js(u'\x00')) and var.get(u'json').neg()) and var.get(u'regexDigit').callprop(u'test', var.get(u'string').callprop(u'charAt', (var.get(u'index')+Js(1.0)))).neg()): + var.put(u'result', Js(u'\\0'), u'+') + continue + if var.get(u'regexSingleEscape').callprop(u'test', var.get(u'character')): + var.put(u'result', var.get(u'singleEscapes').get(var.get(u'character')), u'+') + continue + var.put(u'charCode', var.get(u'character').callprop(u'charCodeAt', Js(0.0))) + var.put(u'hexadecimal', var.get(u'charCode').callprop(u'toString', Js(16.0))) + if var.get(u'lowercaseHex').neg(): + var.put(u'hexadecimal', var.get(u'hexadecimal').callprop(u'toUpperCase')) + var.put(u'longhand', ((var.get(u'hexadecimal').get(u'length')>Js(2.0)) or var.get(u'json'))) + var.put(u'escaped', ((Js(u'\\')+(Js(u'u') if var.get(u'longhand') else Js(u'x')))+(Js(u'0000')+var.get(u'hexadecimal')).callprop(u'slice', ((-Js(4.0)) if var.get(u'longhand') else (-Js(2.0)))))) + var.put(u'result', var.get(u'escaped'), u'+') + continue + if var.get(u'options').get(u'wrap'): + var.put(u'result', ((var.get(u'quote')+var.get(u'result'))+var.get(u'quote'))) + if var.get(u'options').get(u'escapeEtago'): + return var.get(u'result').callprop(u'replace', JsRegExp(u'/<\\/(script|style)/gi'), Js(u'<\\/$1')) + return var.get(u'result') + PyJs_anonymous_3390_._set_name(u'anonymous') + var.put(u'jsesc', PyJs_anonymous_3390_) + var.get(u'jsesc').put(u'version', Js(u'1.3.0')) + if (((var.get(u'define',throw=False).typeof()==Js(u'function')) and (var.get(u'define').get(u'amd').typeof()==Js(u'object'))) and var.get(u'define').get(u'amd')): + @Js + def PyJs_anonymous_3394_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'jsesc') + PyJs_anonymous_3394_._set_name(u'anonymous') + var.get(u'define')(PyJs_anonymous_3394_) + else: + if (var.get(u'freeExports') and var.get(u'freeExports').get(u'nodeType').neg()): + if var.get(u'freeModule'): + var.get(u'freeModule').put(u'exports', var.get(u'jsesc')) + else: + var.get(u'freeExports').put(u'jsesc', var.get(u'jsesc')) + else: + var.get(u'root').put(u'jsesc', var.get(u'jsesc')) + PyJs_anonymous_3376_._set_name(u'anonymous') + PyJs_anonymous_3376_(var.get(u"this")) + PyJs_anonymous_3375_._set_name(u'anonymous') + PyJs_anonymous_3375_.callprop(u'call', var.get(u"this"), (var.get(u'global') if PyJsStrictNeq(var.get(u'global',throw=False).typeof(),Js(u'undefined')) else (var.get(u'self') if PyJsStrictNeq(var.get(u'self',throw=False).typeof(),Js(u'undefined')) else (var.get(u'window') if PyJsStrictNeq(var.get(u'window',throw=False).typeof(),Js(u'undefined')) else PyJs_Object_3374_)))) +PyJs_anonymous_3373_._set_name(u'anonymous') +PyJs_Object_3395_ = Js({}) +@Js +def PyJs_anonymous_3396_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'JSON5', u'exports', u'require', u'module']) + PyJs_Object_3397_ = Js({}) + var.put(u'JSON5', (var.get(u'exports') if PyJsStrictEq(var.get(u'exports',throw=False).typeof(),Js(u'object')) else PyJs_Object_3397_)) + @Js + def PyJs_anonymous_3398_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'comment', u'ch', u'text', u'number', u'escapee', u'at', u'array', u'inlineComment', u'next', u'white', u'peek', u'string', u'blockComment', u'object', u'ws', u'lineNumber', u'columnNumber', u'word', u'value', u'error', u'identifier', u'renderChar']) + Js(u'use strict') + PyJs_Object_3399_ = Js({u"'":Js(u"'"),u'"':Js(u'"'),u'\\':Js(u'\\'),u'/':Js(u'/'),u'\n':Js(u''),u'b':Js(u'\x08'),u'f':Js(u'\x0c'),u'n':Js(u'\n'),u'r':Js(u'\r'),u't':Js(u'\t')}) + var.put(u'escapee', PyJs_Object_3399_) + var.put(u'ws', Js([Js(u' '), Js(u'\t'), Js(u'\r'), Js(u'\n'), Js(u'\x0b'), Js(u'\x0c'), Js(u'\xa0'), Js(u'\ufeff')])) + @Js + def PyJs_anonymous_3400_(chr, this, arguments, var=var): + var = Scope({u'this':this, u'chr':chr, u'arguments':arguments}, var) + var.registers([u'chr']) + return (Js(u'EOF') if PyJsStrictEq(var.get(u'chr'),Js(u'')) else ((Js(u"'")+var.get(u'chr'))+Js(u"'"))) + PyJs_anonymous_3400_._set_name(u'anonymous') + var.put(u'renderChar', PyJs_anonymous_3400_) + @Js + def PyJs_anonymous_3401_(m, this, arguments, var=var): + var = Scope({u'this':this, u'm':m, u'arguments':arguments}, var) + var.registers([u'm', u'error']) + var.put(u'error', var.get(u'SyntaxError').create()) + var.get(u'error').put(u'message', ((((((var.get(u'm')+Js(u' at line '))+var.get(u'lineNumber'))+Js(u' column '))+var.get(u'columnNumber'))+Js(u' of the JSON5 data. Still to read: '))+var.get(u'JSON').callprop(u'stringify', var.get(u'text').callprop(u'substring', (var.get(u'at')-Js(1.0)), (var.get(u'at')+Js(19.0)))))) + var.get(u'error').put(u'at', var.get(u'at')) + var.get(u'error').put(u'lineNumber', var.get(u'lineNumber')) + var.get(u'error').put(u'columnNumber', var.get(u'columnNumber')) + PyJsTempException = JsToPyException(var.get(u'error')) + raise PyJsTempException + PyJs_anonymous_3401_._set_name(u'anonymous') + var.put(u'error', PyJs_anonymous_3401_) + @Js + def PyJs_anonymous_3402_(c, this, arguments, var=var): + var = Scope({u'this':this, u'c':c, u'arguments':arguments}, var) + var.registers([u'c']) + if (var.get(u'c') and PyJsStrictNeq(var.get(u'c'),var.get(u'ch'))): + var.get(u'error')((((Js(u'Expected ')+var.get(u'renderChar')(var.get(u'c')))+Js(u' instead of '))+var.get(u'renderChar')(var.get(u'ch')))) + var.put(u'ch', var.get(u'text').callprop(u'charAt', var.get(u'at'))) + (var.put(u'at',Js(var.get(u'at').to_number())+Js(1))-Js(1)) + (var.put(u'columnNumber',Js(var.get(u'columnNumber').to_number())+Js(1))-Js(1)) + if (PyJsStrictEq(var.get(u'ch'),Js(u'\n')) or (PyJsStrictEq(var.get(u'ch'),Js(u'\r')) and PyJsStrictNeq(var.get(u'peek')(),Js(u'\n')))): + (var.put(u'lineNumber',Js(var.get(u'lineNumber').to_number())+Js(1))-Js(1)) + var.put(u'columnNumber', Js(0.0)) + return var.get(u'ch') + PyJs_anonymous_3402_._set_name(u'anonymous') + var.put(u'next', PyJs_anonymous_3402_) + @Js + def PyJs_anonymous_3403_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'text').callprop(u'charAt', var.get(u'at')) + PyJs_anonymous_3403_._set_name(u'anonymous') + var.put(u'peek', PyJs_anonymous_3403_) + @Js + def PyJs_anonymous_3404_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'key']) + var.put(u'key', var.get(u'ch')) + if (((PyJsStrictNeq(var.get(u'ch'),Js(u'_')) and PyJsStrictNeq(var.get(u'ch'),Js(u'$'))) and ((var.get(u'ch')<Js(u'a')) or (var.get(u'ch')>Js(u'z')))) and ((var.get(u'ch')<Js(u'A')) or (var.get(u'ch')>Js(u'Z')))): + var.get(u'error')(Js(u'Bad identifier as unquoted key')) + while (var.get(u'next')() and ((((PyJsStrictEq(var.get(u'ch'),Js(u'_')) or PyJsStrictEq(var.get(u'ch'),Js(u'$'))) or ((var.get(u'ch')>=Js(u'a')) and (var.get(u'ch')<=Js(u'z')))) or ((var.get(u'ch')>=Js(u'A')) and (var.get(u'ch')<=Js(u'Z')))) or ((var.get(u'ch')>=Js(u'0')) and (var.get(u'ch')<=Js(u'9'))))): + var.put(u'key', var.get(u'ch'), u'+') + return var.get(u'key') + PyJs_anonymous_3404_._set_name(u'anonymous') + var.put(u'identifier', PyJs_anonymous_3404_) + @Js + def PyJs_anonymous_3405_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'base', u'number', u'string', u'sign']) + var.put(u'sign', Js(u'')) + var.put(u'string', Js(u'')) + var.put(u'base', Js(10.0)) + if (PyJsStrictEq(var.get(u'ch'),Js(u'-')) or PyJsStrictEq(var.get(u'ch'),Js(u'+'))): + var.put(u'sign', var.get(u'ch')) + var.get(u'next')(var.get(u'ch')) + if PyJsStrictEq(var.get(u'ch'),Js(u'I')): + var.put(u'number', var.get(u'word')()) + if (PyJsStrictNeq(var.get(u'number',throw=False).typeof(),Js(u'number')) or var.get(u'isNaN')(var.get(u'number'))): + var.get(u'error')(Js(u'Unexpected word for number')) + return ((-var.get(u'number')) if PyJsStrictEq(var.get(u'sign'),Js(u'-')) else var.get(u'number')) + if PyJsStrictEq(var.get(u'ch'),Js(u'N')): + var.put(u'number', var.get(u'word')()) + if var.get(u'isNaN')(var.get(u'number')).neg(): + var.get(u'error')(Js(u'expected word to be NaN')) + return var.get(u'number') + if PyJsStrictEq(var.get(u'ch'),Js(u'0')): + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'next')() + if (PyJsStrictEq(var.get(u'ch'),Js(u'x')) or PyJsStrictEq(var.get(u'ch'),Js(u'X'))): + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'next')() + var.put(u'base', Js(16.0)) + else: + if ((var.get(u'ch')>=Js(u'0')) and (var.get(u'ch')<=Js(u'9'))): + var.get(u'error')(Js(u'Octal literal')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'base')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(10.0)): + SWITCHED = True + while ((var.get(u'ch')>=Js(u'0')) and (var.get(u'ch')<=Js(u'9'))): + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'next')() + if PyJsStrictEq(var.get(u'ch'),Js(u'.')): + var.put(u'string', Js(u'.'), u'+') + while ((var.get(u'next')() and (var.get(u'ch')>=Js(u'0'))) and (var.get(u'ch')<=Js(u'9'))): + var.put(u'string', var.get(u'ch'), u'+') + if (PyJsStrictEq(var.get(u'ch'),Js(u'e')) or PyJsStrictEq(var.get(u'ch'),Js(u'E'))): + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'next')() + if (PyJsStrictEq(var.get(u'ch'),Js(u'-')) or PyJsStrictEq(var.get(u'ch'),Js(u'+'))): + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'next')() + while ((var.get(u'ch')>=Js(u'0')) and (var.get(u'ch')<=Js(u'9'))): + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'next')() + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(16.0)): + SWITCHED = True + while ((((var.get(u'ch')>=Js(u'0')) and (var.get(u'ch')<=Js(u'9'))) or ((var.get(u'ch')>=Js(u'A')) and (var.get(u'ch')<=Js(u'F')))) or ((var.get(u'ch')>=Js(u'a')) and (var.get(u'ch')<=Js(u'f')))): + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'next')() + break + SWITCHED = True + break + if PyJsStrictEq(var.get(u'sign'),Js(u'-')): + var.put(u'number', (-var.get(u'string'))) + else: + var.put(u'number', (+var.get(u'string'))) + if var.get(u'isFinite')(var.get(u'number')).neg(): + var.get(u'error')(Js(u'Bad number')) + else: + return var.get(u'number') + PyJs_anonymous_3405_._set_name(u'anonymous') + var.put(u'number', PyJs_anonymous_3405_) + @Js + def PyJs_anonymous_3406_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'delim', u'uffff', u'hex', u'string']) + var.put(u'string', Js(u'')) + if (PyJsStrictEq(var.get(u'ch'),Js(u'"')) or PyJsStrictEq(var.get(u'ch'),Js(u"'"))): + var.put(u'delim', var.get(u'ch')) + while var.get(u'next')(): + if PyJsStrictEq(var.get(u'ch'),var.get(u'delim')): + var.get(u'next')() + return var.get(u'string') + else: + if PyJsStrictEq(var.get(u'ch'),Js(u'\\')): + var.get(u'next')() + if PyJsStrictEq(var.get(u'ch'),Js(u'u')): + var.put(u'uffff', Js(0.0)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<Js(4.0)): + try: + var.put(u'hex', var.get(u'parseInt')(var.get(u'next')(), Js(16.0))) + if var.get(u'isFinite')(var.get(u'hex')).neg(): + break + var.put(u'uffff', ((var.get(u'uffff')*Js(16.0))+var.get(u'hex'))) + finally: + var.put(u'i', Js(1.0), u'+') + var.put(u'string', var.get(u'String').callprop(u'fromCharCode', var.get(u'uffff')), u'+') + else: + if PyJsStrictEq(var.get(u'ch'),Js(u'\r')): + if PyJsStrictEq(var.get(u'peek')(),Js(u'\n')): + var.get(u'next')() + else: + if PyJsStrictEq(var.get(u'escapee').get(var.get(u'ch')).typeof(),Js(u'string')): + var.put(u'string', var.get(u'escapee').get(var.get(u'ch')), u'+') + else: + break + else: + if PyJsStrictEq(var.get(u'ch'),Js(u'\n')): + break + else: + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'error')(Js(u'Bad string')) + PyJs_anonymous_3406_._set_name(u'anonymous') + var.put(u'string', PyJs_anonymous_3406_) + @Js + def PyJs_anonymous_3407_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if PyJsStrictNeq(var.get(u'ch'),Js(u'/')): + var.get(u'error')(Js(u'Not an inline comment')) + while 1: + var.get(u'next')() + if (PyJsStrictEq(var.get(u'ch'),Js(u'\n')) or PyJsStrictEq(var.get(u'ch'),Js(u'\r'))): + var.get(u'next')() + return var.get('undefined') + if not var.get(u'ch'): + break + PyJs_anonymous_3407_._set_name(u'anonymous') + var.put(u'inlineComment', PyJs_anonymous_3407_) + @Js + def PyJs_anonymous_3408_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if PyJsStrictNeq(var.get(u'ch'),Js(u'*')): + var.get(u'error')(Js(u'Not a block comment')) + while 1: + var.get(u'next')() + while PyJsStrictEq(var.get(u'ch'),Js(u'*')): + var.get(u'next')(Js(u'*')) + if PyJsStrictEq(var.get(u'ch'),Js(u'/')): + var.get(u'next')(Js(u'/')) + return var.get('undefined') + if not var.get(u'ch'): + break + var.get(u'error')(Js(u'Unterminated block comment')) + PyJs_anonymous_3408_._set_name(u'anonymous') + var.put(u'blockComment', PyJs_anonymous_3408_) + @Js + def PyJs_anonymous_3409_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if PyJsStrictNeq(var.get(u'ch'),Js(u'/')): + var.get(u'error')(Js(u'Not a comment')) + var.get(u'next')(Js(u'/')) + if PyJsStrictEq(var.get(u'ch'),Js(u'/')): + var.get(u'inlineComment')() + else: + if PyJsStrictEq(var.get(u'ch'),Js(u'*')): + var.get(u'blockComment')() + else: + var.get(u'error')(Js(u'Unrecognized comment')) + PyJs_anonymous_3409_._set_name(u'anonymous') + var.put(u'comment', PyJs_anonymous_3409_) + @Js + def PyJs_anonymous_3410_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + while var.get(u'ch'): + if PyJsStrictEq(var.get(u'ch'),Js(u'/')): + var.get(u'comment')() + else: + if (var.get(u'ws').callprop(u'indexOf', var.get(u'ch'))>=Js(0.0)): + var.get(u'next')() + else: + return var.get('undefined') + PyJs_anonymous_3410_._set_name(u'anonymous') + var.put(u'white', PyJs_anonymous_3410_) + @Js + def PyJs_anonymous_3411_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + while 1: + SWITCHED = False + CONDITION = (var.get(u'ch')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u't')): + SWITCHED = True + var.get(u'next')(Js(u't')) + var.get(u'next')(Js(u'r')) + var.get(u'next')(Js(u'u')) + var.get(u'next')(Js(u'e')) + return var.get(u'true') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'f')): + SWITCHED = True + var.get(u'next')(Js(u'f')) + var.get(u'next')(Js(u'a')) + var.get(u'next')(Js(u'l')) + var.get(u'next')(Js(u's')) + var.get(u'next')(Js(u'e')) + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'n')): + SWITCHED = True + var.get(u'next')(Js(u'n')) + var.get(u'next')(Js(u'u')) + var.get(u'next')(Js(u'l')) + var.get(u'next')(Js(u'l')) + return var.get(u"null") + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'I')): + SWITCHED = True + var.get(u'next')(Js(u'I')) + var.get(u'next')(Js(u'n')) + var.get(u'next')(Js(u'f')) + var.get(u'next')(Js(u'i')) + var.get(u'next')(Js(u'n')) + var.get(u'next')(Js(u'i')) + var.get(u'next')(Js(u't')) + var.get(u'next')(Js(u'y')) + return var.get(u'Infinity') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'N')): + SWITCHED = True + var.get(u'next')(Js(u'N')) + var.get(u'next')(Js(u'a')) + var.get(u'next')(Js(u'N')) + return var.get(u'NaN') + SWITCHED = True + break + var.get(u'error')((Js(u'Unexpected ')+var.get(u'renderChar')(var.get(u'ch')))) + PyJs_anonymous_3411_._set_name(u'anonymous') + var.put(u'word', PyJs_anonymous_3411_) + @Js + def PyJs_anonymous_3412_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'array']) + var.put(u'array', Js([])) + if PyJsStrictEq(var.get(u'ch'),Js(u'[')): + var.get(u'next')(Js(u'[')) + var.get(u'white')() + while var.get(u'ch'): + if PyJsStrictEq(var.get(u'ch'),Js(u']')): + var.get(u'next')(Js(u']')) + return var.get(u'array') + if PyJsStrictEq(var.get(u'ch'),Js(u',')): + var.get(u'error')(Js(u'Missing array element')) + else: + var.get(u'array').callprop(u'push', var.get(u'value')()) + var.get(u'white')() + if PyJsStrictNeq(var.get(u'ch'),Js(u',')): + var.get(u'next')(Js(u']')) + return var.get(u'array') + var.get(u'next')(Js(u',')) + var.get(u'white')() + var.get(u'error')(Js(u'Bad array')) + PyJs_anonymous_3412_._set_name(u'anonymous') + var.put(u'array', PyJs_anonymous_3412_) + @Js + def PyJs_anonymous_3413_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'object', u'key']) + PyJs_Object_3414_ = Js({}) + var.put(u'object', PyJs_Object_3414_) + if PyJsStrictEq(var.get(u'ch'),Js(u'{')): + var.get(u'next')(Js(u'{')) + var.get(u'white')() + while var.get(u'ch'): + if PyJsStrictEq(var.get(u'ch'),Js(u'}')): + var.get(u'next')(Js(u'}')) + return var.get(u'object') + if (PyJsStrictEq(var.get(u'ch'),Js(u'"')) or PyJsStrictEq(var.get(u'ch'),Js(u"'"))): + var.put(u'key', var.get(u'string')()) + else: + var.put(u'key', var.get(u'identifier')()) + var.get(u'white')() + var.get(u'next')(Js(u':')) + var.get(u'object').put(var.get(u'key'), var.get(u'value')()) + var.get(u'white')() + if PyJsStrictNeq(var.get(u'ch'),Js(u',')): + var.get(u'next')(Js(u'}')) + return var.get(u'object') + var.get(u'next')(Js(u',')) + var.get(u'white')() + var.get(u'error')(Js(u'Bad object')) + PyJs_anonymous_3413_._set_name(u'anonymous') + var.put(u'object', PyJs_anonymous_3413_) + @Js + def PyJs_anonymous_3415_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'white')() + while 1: + SWITCHED = False + CONDITION = (var.get(u'ch')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'{')): + SWITCHED = True + return var.get(u'object')() + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'[')): + SWITCHED = True + return var.get(u'array')() + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'"')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u"'")): + SWITCHED = True + return var.get(u'string')() + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'-')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'+')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'.')): + SWITCHED = True + return var.get(u'number')() + if True: + SWITCHED = True + return (var.get(u'number')() if ((var.get(u'ch')>=Js(u'0')) and (var.get(u'ch')<=Js(u'9'))) else var.get(u'word')()) + SWITCHED = True + break + PyJs_anonymous_3415_._set_name(u'anonymous') + var.put(u'value', PyJs_anonymous_3415_) + @Js + def PyJs_anonymous_3416_(source, reviver, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'reviver':reviver, u'arguments':arguments}, var) + var.registers([u'source', u'reviver', u'result']) + pass + var.put(u'text', var.get(u'String')(var.get(u'source'))) + var.put(u'at', Js(0.0)) + var.put(u'lineNumber', Js(1.0)) + var.put(u'columnNumber', Js(1.0)) + var.put(u'ch', Js(u' ')) + var.put(u'result', var.get(u'value')()) + var.get(u'white')() + if var.get(u'ch'): + var.get(u'error')(Js(u'Syntax error')) + PyJs_Object_3417_ = Js({u'':var.get(u'result')}) + @Js + def PyJs_walk_3418_(holder, key, this, arguments, var=var): + var = Scope({u'this':this, u'holder':holder, u'arguments':arguments, u'key':key, u'walk':PyJs_walk_3418_}, var) + var.registers([u'k', u'holder', u'key', u'value', u'v']) + var.put(u'value', var.get(u'holder').get(var.get(u'key'))) + if (var.get(u'value') and PyJsStrictEq(var.get(u'value',throw=False).typeof(),Js(u'object'))): + for PyJsTemp in var.get(u'value'): + var.put(u'k', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'value'), var.get(u'k')): + var.put(u'v', var.get(u'walk')(var.get(u'value'), var.get(u'k'))) + if PyJsStrictNeq(var.get(u'v'),var.get(u'undefined')): + var.get(u'value').put(var.get(u'k'), var.get(u'v')) + else: + var.get(u'value').delete(var.get(u'k')) + return var.get(u'reviver').callprop(u'call', var.get(u'holder'), var.get(u'key'), var.get(u'value')) + PyJs_walk_3418_._set_name(u'walk') + return (PyJs_walk_3418_(PyJs_Object_3417_, Js(u'')) if PyJsStrictEq(var.get(u'reviver',throw=False).typeof(),Js(u'function')) else var.get(u'result')) + PyJs_anonymous_3416_._set_name(u'anonymous') + return PyJs_anonymous_3416_ + PyJs_anonymous_3398_._set_name(u'anonymous') + var.get(u'JSON5').put(u'parse', PyJs_anonymous_3398_()) + @Js + def PyJs_anonymous_3419_(obj, replacer, space, this, arguments, var=var): + var = Scope({u'this':this, u'replacer':replacer, u'obj':obj, u'arguments':arguments, u'space':space}, var) + var.registers([u'isArray', u'topLevelHolder', u'isDate', u'escapeString', u'space', u'internalStringify', u'objStack', u'replacer', u'escapable', u'cx', u'meta', u'checkForCircular', u'isWordChar', u'isWordStart', u'obj', u'makeIndent', u'indentStr', u'isWord', u'getReplacedValueOrUndefined']) + @Js + def PyJsHoisted_isArray_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + if var.get(u'Array').get(u'isArray'): + return var.get(u'Array').callprop(u'isArray', var.get(u'obj')) + else: + return PyJsStrictEq(var.get(u'Object').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'obj')),Js(u'[object Array]')) + PyJsHoisted_isArray_.func_name = u'isArray' + var.put(u'isArray', PyJsHoisted_isArray_) + @Js + def PyJsHoisted_isDate_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return PyJsStrictEq(var.get(u'Object').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'obj')),Js(u'[object Date]')) + PyJsHoisted_isDate_.func_name = u'isDate' + var.put(u'isDate', PyJsHoisted_isDate_) + @Js + def PyJsHoisted_escapeString_(string, this, arguments, var=var): + var = Scope({u'this':this, u'string':string, u'arguments':arguments}, var) + var.registers([u'string']) + var.get(u'escapable').put(u'lastIndex', Js(0.0)) + @Js + def PyJs_anonymous_3422_(a, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'arguments':arguments}, var) + var.registers([u'a', u'c']) + var.put(u'c', var.get(u'meta').get(var.get(u'a'))) + return (var.get(u'c') if PyJsStrictEq(var.get(u'c',throw=False).typeof(),Js(u'string')) else (Js(u'\\u')+(Js(u'0000')+var.get(u'a').callprop(u'charCodeAt', Js(0.0)).callprop(u'toString', Js(16.0))).callprop(u'slice', (-Js(4.0))))) + PyJs_anonymous_3422_._set_name(u'anonymous') + return (((Js(u'"')+var.get(u'string').callprop(u'replace', var.get(u'escapable'), PyJs_anonymous_3422_))+Js(u'"')) if var.get(u'escapable').callprop(u'test', var.get(u'string')) else ((Js(u'"')+var.get(u'string'))+Js(u'"'))) + PyJsHoisted_escapeString_.func_name = u'escapeString' + var.put(u'escapeString', PyJsHoisted_escapeString_) + @Js + def PyJsHoisted_internalStringify_(holder, key, isTopLevel, this, arguments, var=var): + var = Scope({u'this':this, u'isTopLevel':isTopLevel, u'holder':holder, u'arguments':arguments, u'key':key}, var) + var.registers([u'i', u'buffer', u'res', u'value', u'prop', u'nonEmpty', u'key', u'isTopLevel', u'holder', u'obj_part']) + pass + var.put(u'obj_part', var.get(u'getReplacedValueOrUndefined')(var.get(u'holder'), var.get(u'key'), var.get(u'isTopLevel'))) + if (var.get(u'obj_part') and var.get(u'isDate')(var.get(u'obj_part')).neg()): + var.put(u'obj_part', var.get(u'obj_part').callprop(u'valueOf')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'obj_part',throw=False).typeof()) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'boolean')): + SWITCHED = True + return var.get(u'obj_part').callprop(u'toString') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'number')): + SWITCHED = True + if (var.get(u'isNaN')(var.get(u'obj_part')) or var.get(u'isFinite')(var.get(u'obj_part')).neg()): + return Js(u'null') + return var.get(u'obj_part').callprop(u'toString') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'string')): + SWITCHED = True + return var.get(u'escapeString')(var.get(u'obj_part').callprop(u'toString')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'object')): + SWITCHED = True + if PyJsStrictEq(var.get(u'obj_part'),var.get(u"null")): + return Js(u'null') + else: + if var.get(u'isArray')(var.get(u'obj_part')): + var.get(u'checkForCircular')(var.get(u'obj_part')) + var.put(u'buffer', Js(u'[')) + var.get(u'objStack').callprop(u'push', var.get(u'obj_part')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'obj_part').get(u'length')): + try: + var.put(u'res', var.get(u'internalStringify')(var.get(u'obj_part'), var.get(u'i'), Js(False))) + var.put(u'buffer', var.get(u'makeIndent')(var.get(u'indentStr'), var.get(u'objStack').get(u'length')), u'+') + if (PyJsStrictEq(var.get(u'res'),var.get(u"null")) or PyJsStrictEq(var.get(u'res',throw=False).typeof(),Js(u'undefined'))): + var.put(u'buffer', Js(u'null'), u'+') + else: + var.put(u'buffer', var.get(u'res'), u'+') + if (var.get(u'i')<(var.get(u'obj_part').get(u'length')-Js(1.0))): + var.put(u'buffer', Js(u','), u'+') + else: + if var.get(u'indentStr'): + var.put(u'buffer', Js(u'\n'), u'+') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.get(u'objStack').callprop(u'pop') + var.put(u'buffer', (var.get(u'makeIndent')(var.get(u'indentStr'), var.get(u'objStack').get(u'length'), var.get(u'true'))+Js(u']')), u'+') + else: + var.get(u'checkForCircular')(var.get(u'obj_part')) + var.put(u'buffer', Js(u'{')) + var.put(u'nonEmpty', Js(False)) + var.get(u'objStack').callprop(u'push', var.get(u'obj_part')) + for PyJsTemp in var.get(u'obj_part'): + var.put(u'prop', PyJsTemp) + if var.get(u'obj_part').callprop(u'hasOwnProperty', var.get(u'prop')): + var.put(u'value', var.get(u'internalStringify')(var.get(u'obj_part'), var.get(u'prop'), Js(False))) + var.put(u'isTopLevel', Js(False)) + if (PyJsStrictNeq(var.get(u'value',throw=False).typeof(),Js(u'undefined')) and PyJsStrictNeq(var.get(u'value'),var.get(u"null"))): + var.put(u'buffer', var.get(u'makeIndent')(var.get(u'indentStr'), var.get(u'objStack').get(u'length')), u'+') + var.put(u'nonEmpty', var.get(u'true')) + var.put(u'key', (var.get(u'prop') if var.get(u'isWord')(var.get(u'prop')) else var.get(u'escapeString')(var.get(u'prop')))) + var.put(u'buffer', ((((var.get(u'key')+Js(u':'))+(Js(u' ') if var.get(u'indentStr') else Js(u'')))+var.get(u'value'))+Js(u',')), u'+') + var.get(u'objStack').callprop(u'pop') + if var.get(u'nonEmpty'): + var.put(u'buffer', ((var.get(u'buffer').callprop(u'substring', Js(0.0), (var.get(u'buffer').get(u'length')-Js(1.0)))+var.get(u'makeIndent')(var.get(u'indentStr'), var.get(u'objStack').get(u'length')))+Js(u'}'))) + else: + var.put(u'buffer', Js(u'{}')) + return var.get(u'buffer') + if True: + SWITCHED = True + return var.get(u'undefined') + SWITCHED = True + break + PyJsHoisted_internalStringify_.func_name = u'internalStringify' + var.put(u'internalStringify', PyJsHoisted_internalStringify_) + @Js + def PyJsHoisted_isWord_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'i', u'length', u'key']) + if PyJsStrictNeq(var.get(u'key',throw=False).typeof(),Js(u'string')): + return Js(False) + if var.get(u'isWordStart')(var.get(u'key').get(u'0')).neg(): + return Js(False) + var.put(u'i', Js(1.0)) + var.put(u'length', var.get(u'key').get(u'length')) + while (var.get(u'i')<var.get(u'length')): + if var.get(u'isWordChar')(var.get(u'key').get(var.get(u'i'))).neg(): + return Js(False) + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'true') + PyJsHoisted_isWord_.func_name = u'isWord' + var.put(u'isWord', PyJsHoisted_isWord_) + @Js + def PyJsHoisted_isWordChar_(c, this, arguments, var=var): + var = Scope({u'this':this, u'c':c, u'arguments':arguments}, var) + var.registers([u'c']) + return ((((((var.get(u'c')>=Js(u'a')) and (var.get(u'c')<=Js(u'z'))) or ((var.get(u'c')>=Js(u'A')) and (var.get(u'c')<=Js(u'Z')))) or ((var.get(u'c')>=Js(u'0')) and (var.get(u'c')<=Js(u'9')))) or PyJsStrictEq(var.get(u'c'),Js(u'_'))) or PyJsStrictEq(var.get(u'c'),Js(u'$'))) + PyJsHoisted_isWordChar_.func_name = u'isWordChar' + var.put(u'isWordChar', PyJsHoisted_isWordChar_) + @Js + def PyJsHoisted_isWordStart_(c, this, arguments, var=var): + var = Scope({u'this':this, u'c':c, u'arguments':arguments}, var) + var.registers([u'c']) + return (((((var.get(u'c')>=Js(u'a')) and (var.get(u'c')<=Js(u'z'))) or ((var.get(u'c')>=Js(u'A')) and (var.get(u'c')<=Js(u'Z')))) or PyJsStrictEq(var.get(u'c'),Js(u'_'))) or PyJsStrictEq(var.get(u'c'),Js(u'$'))) + PyJsHoisted_isWordStart_.func_name = u'isWordStart' + var.put(u'isWordStart', PyJsHoisted_isWordStart_) + @Js + def PyJsHoisted_makeIndent_(str, num, noNewLine, this, arguments, var=var): + var = Scope({u'this':this, u'num':num, u'noNewLine':noNewLine, u'str':str, u'arguments':arguments}, var) + var.registers([u'i', u'num', u'indent', u'noNewLine', u'str']) + if var.get(u'str').neg(): + return Js(u'') + if (var.get(u'str').get(u'length')>Js(10.0)): + var.put(u'str', var.get(u'str').callprop(u'substring', Js(0.0), Js(10.0))) + var.put(u'indent', (Js(u'') if var.get(u'noNewLine') else Js(u'\n'))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'num')): + try: + var.put(u'indent', var.get(u'str'), u'+') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'indent') + PyJsHoisted_makeIndent_.func_name = u'makeIndent' + var.put(u'makeIndent', PyJsHoisted_makeIndent_) + @Js + def PyJsHoisted_checkForCircular_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'i', u'obj']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'objStack').get(u'length')): + try: + if PyJsStrictEq(var.get(u'objStack').get(var.get(u'i')),var.get(u'obj')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Converting circular structure to JSON'))) + raise PyJsTempException + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJsHoisted_checkForCircular_.func_name = u'checkForCircular' + var.put(u'checkForCircular', PyJsHoisted_checkForCircular_) + if (var.get(u'replacer') and (PyJsStrictNeq(var.get(u'replacer',throw=False).typeof(),Js(u'function')) and var.get(u'isArray')(var.get(u'replacer')).neg())): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Replacer must be a function or an array'))) + raise PyJsTempException + @Js + def PyJs_anonymous_3420_(holder, key, isTopLevel, this, arguments, var=var): + var = Scope({u'this':this, u'isTopLevel':isTopLevel, u'holder':holder, u'arguments':arguments, u'key':key}, var) + var.registers([u'isTopLevel', u'holder', u'key', u'value']) + var.put(u'value', var.get(u'holder').get(var.get(u'key'))) + if ((var.get(u'value') and var.get(u'value').get(u'toJSON')) and PyJsStrictEq(var.get(u'value').get(u'toJSON').typeof(),Js(u'function'))): + var.put(u'value', var.get(u'value').callprop(u'toJSON')) + if PyJsStrictEq(var.get(u'replacer',throw=False).typeof(),Js(u'function')): + return var.get(u'replacer').callprop(u'call', var.get(u'holder'), var.get(u'key'), var.get(u'value')) + else: + if var.get(u'replacer'): + if ((var.get(u'isTopLevel') or var.get(u'isArray')(var.get(u'holder'))) or (var.get(u'replacer').callprop(u'indexOf', var.get(u'key'))>=Js(0.0))): + return var.get(u'value') + else: + return var.get(u'undefined') + else: + return var.get(u'value') + PyJs_anonymous_3420_._set_name(u'anonymous') + var.put(u'getReplacedValueOrUndefined', PyJs_anonymous_3420_) + pass + pass + pass + var.get(u'JSON5').put(u'isWord', var.get(u'isWord')) + pass + pass + var.put(u'objStack', Js([])) + pass + pass + pass + if var.get(u'space'): + if PyJsStrictEq(var.get(u'space',throw=False).typeof(),Js(u'string')): + var.put(u'indentStr', var.get(u'space')) + else: + if (PyJsStrictEq(var.get(u'space',throw=False).typeof(),Js(u'number')) and (var.get(u'space')>=Js(0.0))): + var.put(u'indentStr', var.get(u'makeIndent')(Js(u' '), var.get(u'space'), var.get(u'true'))) + else: + pass + var.put(u'cx', JsRegExp(u'/[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g')) + var.put(u'escapable', JsRegExp(u'/[\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g')) + PyJs_Object_3421_ = Js({u'\x08':Js(u'\\b'),u'\t':Js(u'\\t'),u'\n':Js(u'\\n'),u'\x0c':Js(u'\\f'),u'\r':Js(u'\\r'),u'"':Js(u'\\"'),u'\\':Js(u'\\\\')}) + var.put(u'meta', PyJs_Object_3421_) + pass + pass + PyJs_Object_3423_ = Js({u'':var.get(u'obj')}) + var.put(u'topLevelHolder', PyJs_Object_3423_) + if PyJsStrictEq(var.get(u'obj'),var.get(u'undefined')): + return var.get(u'getReplacedValueOrUndefined')(var.get(u'topLevelHolder'), Js(u''), var.get(u'true')) + return var.get(u'internalStringify')(var.get(u'topLevelHolder'), Js(u''), var.get(u'true')) + PyJs_anonymous_3419_._set_name(u'anonymous') + var.get(u'JSON5').put(u'stringify', PyJs_anonymous_3419_) +PyJs_anonymous_3396_._set_name(u'anonymous') +PyJs_Object_3424_ = Js({}) +@Js +def PyJs_anonymous_3425_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'DataView', u'module', u'getNative', u'root']) + var.put(u'getNative', var.get(u'require')(Js(u'./_getNative'))) + var.put(u'root', var.get(u'require')(Js(u'./_root'))) + var.put(u'DataView', var.get(u'getNative')(var.get(u'root'), Js(u'DataView'))) + var.get(u'module').put(u'exports', var.get(u'DataView')) +PyJs_anonymous_3425_._set_name(u'anonymous') +PyJs_Object_3426_ = Js({u'./_getNative':Js(382.0),u'./_root':Js(422.0)}) +@Js +def PyJs_anonymous_3427_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'hashGet', u'Hash', u'hashClear', u'hashSet', u'require', u'module', u'hashDelete', u'hashHas']) + @Js + def PyJsHoisted_Hash_(entries, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'entries':entries}, var) + var.registers([u'index', u'length', u'entries', u'entry']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', (var.get(u'entries').get(u'length') if var.get(u'entries') else Js(0.0))) + var.get(u"this").callprop(u'clear') + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'entry', var.get(u'entries').get(var.get(u'index'))) + var.get(u"this").callprop(u'set', var.get(u'entry').get(u'0'), var.get(u'entry').get(u'1')) + PyJsHoisted_Hash_.func_name = u'Hash' + var.put(u'Hash', PyJsHoisted_Hash_) + var.put(u'hashClear', var.get(u'require')(Js(u'./_hashClear'))) + var.put(u'hashDelete', var.get(u'require')(Js(u'./_hashDelete'))) + var.put(u'hashGet', var.get(u'require')(Js(u'./_hashGet'))) + var.put(u'hashHas', var.get(u'require')(Js(u'./_hashHas'))) + var.put(u'hashSet', var.get(u'require')(Js(u'./_hashSet'))) + pass + var.get(u'Hash').get(u'prototype').put(u'clear', var.get(u'hashClear')) + var.get(u'Hash').get(u'prototype').put(u'delete', var.get(u'hashDelete')) + var.get(u'Hash').get(u'prototype').put(u'get', var.get(u'hashGet')) + var.get(u'Hash').get(u'prototype').put(u'has', var.get(u'hashHas')) + var.get(u'Hash').get(u'prototype').put(u'set', var.get(u'hashSet')) + var.get(u'module').put(u'exports', var.get(u'Hash')) +PyJs_anonymous_3427_._set_name(u'anonymous') +PyJs_Object_3428_ = Js({u'./_hashClear':Js(388.0),u'./_hashDelete':Js(389.0),u'./_hashGet':Js(390.0),u'./_hashHas':Js(391.0),u'./_hashSet':Js(392.0)}) +@Js +def PyJs_anonymous_3429_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'listCacheDelete', u'listCacheHas', u'listCacheGet', u'require', u'exports', u'module', u'listCacheClear', u'listCacheSet', u'ListCache']) + @Js + def PyJsHoisted_ListCache_(entries, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'entries':entries}, var) + var.registers([u'index', u'length', u'entries', u'entry']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', (var.get(u'entries').get(u'length') if var.get(u'entries') else Js(0.0))) + var.get(u"this").callprop(u'clear') + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'entry', var.get(u'entries').get(var.get(u'index'))) + var.get(u"this").callprop(u'set', var.get(u'entry').get(u'0'), var.get(u'entry').get(u'1')) + PyJsHoisted_ListCache_.func_name = u'ListCache' + var.put(u'ListCache', PyJsHoisted_ListCache_) + var.put(u'listCacheClear', var.get(u'require')(Js(u'./_listCacheClear'))) + var.put(u'listCacheDelete', var.get(u'require')(Js(u'./_listCacheDelete'))) + var.put(u'listCacheGet', var.get(u'require')(Js(u'./_listCacheGet'))) + var.put(u'listCacheHas', var.get(u'require')(Js(u'./_listCacheHas'))) + var.put(u'listCacheSet', var.get(u'require')(Js(u'./_listCacheSet'))) + pass + var.get(u'ListCache').get(u'prototype').put(u'clear', var.get(u'listCacheClear')) + var.get(u'ListCache').get(u'prototype').put(u'delete', var.get(u'listCacheDelete')) + var.get(u'ListCache').get(u'prototype').put(u'get', var.get(u'listCacheGet')) + var.get(u'ListCache').get(u'prototype').put(u'has', var.get(u'listCacheHas')) + var.get(u'ListCache').get(u'prototype').put(u'set', var.get(u'listCacheSet')) + var.get(u'module').put(u'exports', var.get(u'ListCache')) +PyJs_anonymous_3429_._set_name(u'anonymous') +PyJs_Object_3430_ = Js({u'./_listCacheClear':Js(409.0),u'./_listCacheDelete':Js(410.0),u'./_listCacheGet':Js(411.0),u'./_listCacheHas':Js(412.0),u'./_listCacheSet':Js(413.0)}) +@Js +def PyJs_anonymous_3431_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'Map', u'exports', u'require', u'module', u'getNative', u'root']) + var.put(u'getNative', var.get(u'require')(Js(u'./_getNative'))) + var.put(u'root', var.get(u'require')(Js(u'./_root'))) + var.put(u'Map', var.get(u'getNative')(var.get(u'root'), Js(u'Map'))) + var.get(u'module').put(u'exports', var.get(u'Map')) +PyJs_anonymous_3431_._set_name(u'anonymous') +PyJs_Object_3432_ = Js({u'./_getNative':Js(382.0),u'./_root':Js(422.0)}) +@Js +def PyJs_anonymous_3433_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'mapCacheGet', u'mapCacheHas', u'require', u'mapCacheDelete', u'mapCacheClear', u'mapCacheSet', u'MapCache', u'module']) + @Js + def PyJsHoisted_MapCache_(entries, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'entries':entries}, var) + var.registers([u'index', u'length', u'entries', u'entry']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', (var.get(u'entries').get(u'length') if var.get(u'entries') else Js(0.0))) + var.get(u"this").callprop(u'clear') + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'entry', var.get(u'entries').get(var.get(u'index'))) + var.get(u"this").callprop(u'set', var.get(u'entry').get(u'0'), var.get(u'entry').get(u'1')) + PyJsHoisted_MapCache_.func_name = u'MapCache' + var.put(u'MapCache', PyJsHoisted_MapCache_) + var.put(u'mapCacheClear', var.get(u'require')(Js(u'./_mapCacheClear'))) + var.put(u'mapCacheDelete', var.get(u'require')(Js(u'./_mapCacheDelete'))) + var.put(u'mapCacheGet', var.get(u'require')(Js(u'./_mapCacheGet'))) + var.put(u'mapCacheHas', var.get(u'require')(Js(u'./_mapCacheHas'))) + var.put(u'mapCacheSet', var.get(u'require')(Js(u'./_mapCacheSet'))) + pass + var.get(u'MapCache').get(u'prototype').put(u'clear', var.get(u'mapCacheClear')) + var.get(u'MapCache').get(u'prototype').put(u'delete', var.get(u'mapCacheDelete')) + var.get(u'MapCache').get(u'prototype').put(u'get', var.get(u'mapCacheGet')) + var.get(u'MapCache').get(u'prototype').put(u'has', var.get(u'mapCacheHas')) + var.get(u'MapCache').get(u'prototype').put(u'set', var.get(u'mapCacheSet')) + var.get(u'module').put(u'exports', var.get(u'MapCache')) +PyJs_anonymous_3433_._set_name(u'anonymous') +PyJs_Object_3434_ = Js({u'./_mapCacheClear':Js(414.0),u'./_mapCacheDelete':Js(415.0),u'./_mapCacheGet':Js(416.0),u'./_mapCacheHas':Js(417.0),u'./_mapCacheSet':Js(418.0)}) +@Js +def PyJs_anonymous_3435_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'getNative', u'Promise', u'root']) + var.put(u'getNative', var.get(u'require')(Js(u'./_getNative'))) + var.put(u'root', var.get(u'require')(Js(u'./_root'))) + var.put(u'Promise', var.get(u'getNative')(var.get(u'root'), Js(u'Promise'))) + var.get(u'module').put(u'exports', var.get(u'Promise')) +PyJs_anonymous_3435_._set_name(u'anonymous') +PyJs_Object_3436_ = Js({u'./_getNative':Js(382.0),u'./_root':Js(422.0)}) +@Js +def PyJs_anonymous_3437_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'Reflect', u'require', u'root', u'exports', u'module']) + var.put(u'root', var.get(u'require')(Js(u'./_root'))) + var.put(u'Reflect', var.get(u'root').get(u'Reflect')) + var.get(u'module').put(u'exports', var.get(u'Reflect')) +PyJs_anonymous_3437_._set_name(u'anonymous') +PyJs_Object_3438_ = Js({u'./_root':Js(422.0)}) +@Js +def PyJs_anonymous_3439_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'Set', u'require', u'module', u'getNative', u'root']) + var.put(u'getNative', var.get(u'require')(Js(u'./_getNative'))) + var.put(u'root', var.get(u'require')(Js(u'./_root'))) + var.put(u'Set', var.get(u'getNative')(var.get(u'root'), Js(u'Set'))) + var.get(u'module').put(u'exports', var.get(u'Set')) +PyJs_anonymous_3439_._set_name(u'anonymous') +PyJs_Object_3440_ = Js({u'./_getNative':Js(382.0),u'./_root':Js(422.0)}) +@Js +def PyJs_anonymous_3441_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'setCacheAdd', u'exports', u'SetCache', u'require', u'setCacheHas', u'module', u'MapCache']) + @Js + def PyJsHoisted_SetCache_(values, this, arguments, var=var): + var = Scope({u'this':this, u'values':values, u'arguments':arguments}, var) + var.registers([u'index', u'length', u'values']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', (var.get(u'values').get(u'length') if var.get(u'values') else Js(0.0))) + var.get(u"this").put(u'__data__', var.get(u'MapCache').create()) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.get(u"this").callprop(u'add', var.get(u'values').get(var.get(u'index'))) + PyJsHoisted_SetCache_.func_name = u'SetCache' + var.put(u'SetCache', PyJsHoisted_SetCache_) + var.put(u'MapCache', var.get(u'require')(Js(u'./_MapCache'))) + var.put(u'setCacheAdd', var.get(u'require')(Js(u'./_setCacheAdd'))) + var.put(u'setCacheHas', var.get(u'require')(Js(u'./_setCacheHas'))) + pass + var.get(u'SetCache').get(u'prototype').put(u'add', var.get(u'SetCache').get(u'prototype').put(u'push', var.get(u'setCacheAdd'))) + var.get(u'SetCache').get(u'prototype').put(u'has', var.get(u'setCacheHas')) + var.get(u'module').put(u'exports', var.get(u'SetCache')) +PyJs_anonymous_3441_._set_name(u'anonymous') +PyJs_Object_3442_ = Js({u'./_MapCache':Js(289.0),u'./_setCacheAdd':Js(423.0),u'./_setCacheHas':Js(424.0)}) +@Js +def PyJs_anonymous_3443_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'stackSet', u'exports', u'stackGet', u'stackDelete', u'stackClear', u'module', u'stackHas', u'require', u'Stack', u'ListCache']) + @Js + def PyJsHoisted_Stack_(entries, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'entries':entries}, var) + var.registers([u'entries']) + var.get(u"this").put(u'__data__', var.get(u'ListCache').create(var.get(u'entries'))) + PyJsHoisted_Stack_.func_name = u'Stack' + var.put(u'Stack', PyJsHoisted_Stack_) + var.put(u'ListCache', var.get(u'require')(Js(u'./_ListCache'))) + var.put(u'stackClear', var.get(u'require')(Js(u'./_stackClear'))) + var.put(u'stackDelete', var.get(u'require')(Js(u'./_stackDelete'))) + var.put(u'stackGet', var.get(u'require')(Js(u'./_stackGet'))) + var.put(u'stackHas', var.get(u'require')(Js(u'./_stackHas'))) + var.put(u'stackSet', var.get(u'require')(Js(u'./_stackSet'))) + pass + var.get(u'Stack').get(u'prototype').put(u'clear', var.get(u'stackClear')) + var.get(u'Stack').get(u'prototype').put(u'delete', var.get(u'stackDelete')) + var.get(u'Stack').get(u'prototype').put(u'get', var.get(u'stackGet')) + var.get(u'Stack').get(u'prototype').put(u'has', var.get(u'stackHas')) + var.get(u'Stack').get(u'prototype').put(u'set', var.get(u'stackSet')) + var.get(u'module').put(u'exports', var.get(u'Stack')) +PyJs_anonymous_3443_._set_name(u'anonymous') +PyJs_Object_3444_ = Js({u'./_ListCache':Js(287.0),u'./_stackClear':Js(426.0),u'./_stackDelete':Js(427.0),u'./_stackGet':Js(428.0),u'./_stackHas':Js(429.0),u'./_stackSet':Js(430.0)}) +@Js +def PyJs_anonymous_3445_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'Symbol', u'root', u'require', u'module']) + var.put(u'root', var.get(u'require')(Js(u'./_root'))) + var.put(u'Symbol', var.get(u'root').get(u'Symbol')) + var.get(u'module').put(u'exports', var.get(u'Symbol')) +PyJs_anonymous_3445_._set_name(u'anonymous') +PyJs_Object_3446_ = Js({u'./_root':Js(422.0)}) +@Js +def PyJs_anonymous_3447_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'root', u'Uint8Array', u'module']) + var.put(u'root', var.get(u'require')(Js(u'./_root'))) + var.put(u'Uint8Array', var.get(u'root').get(u'Uint8Array')) + var.get(u'module').put(u'exports', var.get(u'Uint8Array')) +PyJs_anonymous_3447_._set_name(u'anonymous') +PyJs_Object_3448_ = Js({u'./_root':Js(422.0)}) +@Js +def PyJs_anonymous_3449_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'WeakMap', u'module', u'getNative', u'root']) + var.put(u'getNative', var.get(u'require')(Js(u'./_getNative'))) + var.put(u'root', var.get(u'require')(Js(u'./_root'))) + var.put(u'WeakMap', var.get(u'getNative')(var.get(u'root'), Js(u'WeakMap'))) + var.get(u'module').put(u'exports', var.get(u'WeakMap')) +PyJs_anonymous_3449_._set_name(u'anonymous') +PyJs_Object_3450_ = Js({u'./_getNative':Js(382.0),u'./_root':Js(422.0)}) +@Js +def PyJs_anonymous_3451_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'addMapEntry', u'exports', u'module']) + @Js + def PyJsHoisted_addMapEntry_(map, pair, this, arguments, var=var): + var = Scope({u'pair':pair, u'map':map, u'this':this, u'arguments':arguments}, var) + var.registers([u'pair', u'map']) + var.get(u'map').callprop(u'set', var.get(u'pair').get(u'0'), var.get(u'pair').get(u'1')) + return var.get(u'map') + PyJsHoisted_addMapEntry_.func_name = u'addMapEntry' + var.put(u'addMapEntry', PyJsHoisted_addMapEntry_) + pass + var.get(u'module').put(u'exports', var.get(u'addMapEntry')) +PyJs_anonymous_3451_._set_name(u'anonymous') +PyJs_Object_3452_ = Js({}) +@Js +def PyJs_anonymous_3453_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'addSetEntry']) + @Js + def PyJsHoisted_addSetEntry_(set, value, this, arguments, var=var): + var = Scope({u'this':this, u'set':set, u'arguments':arguments, u'value':value}, var) + var.registers([u'set', u'value']) + var.get(u'set').callprop(u'add', var.get(u'value')) + return var.get(u'set') + PyJsHoisted_addSetEntry_.func_name = u'addSetEntry' + var.put(u'addSetEntry', PyJsHoisted_addSetEntry_) + pass + var.get(u'module').put(u'exports', var.get(u'addSetEntry')) +PyJs_anonymous_3453_._set_name(u'anonymous') +PyJs_Object_3454_ = Js({}) +@Js +def PyJs_anonymous_3455_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'apply', u'require', u'exports', u'module']) + @Js + def PyJsHoisted_apply_(func, thisArg, args, this, arguments, var=var): + var = Scope({u'this':this, u'args':args, u'arguments':arguments, u'func':func, u'thisArg':thisArg}, var) + var.registers([u'length', u'args', u'func', u'thisArg']) + var.put(u'length', var.get(u'args').get(u'length')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(0.0)): + SWITCHED = True + return var.get(u'func').callprop(u'call', var.get(u'thisArg')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(1.0)): + SWITCHED = True + return var.get(u'func').callprop(u'call', var.get(u'thisArg'), var.get(u'args').get(u'0')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(2.0)): + SWITCHED = True + return var.get(u'func').callprop(u'call', var.get(u'thisArg'), var.get(u'args').get(u'0'), var.get(u'args').get(u'1')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(3.0)): + SWITCHED = True + return var.get(u'func').callprop(u'call', var.get(u'thisArg'), var.get(u'args').get(u'0'), var.get(u'args').get(u'1'), var.get(u'args').get(u'2')) + SWITCHED = True + break + return var.get(u'func').callprop(u'apply', var.get(u'thisArg'), var.get(u'args')) + PyJsHoisted_apply_.func_name = u'apply' + var.put(u'apply', PyJsHoisted_apply_) + pass + var.get(u'module').put(u'exports', var.get(u'apply')) +PyJs_anonymous_3455_._set_name(u'anonymous') +PyJs_Object_3456_ = Js({}) +@Js +def PyJs_anonymous_3457_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'arrayEach', u'require', u'exports', u'module']) + @Js + def PyJsHoisted_arrayEach_(array, iteratee, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'arguments':arguments, u'iteratee':iteratee}, var) + var.registers([u'index', u'length', u'array', u'iteratee']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', (var.get(u'array').get(u'length') if var.get(u'array') else Js(0.0))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + if PyJsStrictEq(var.get(u'iteratee')(var.get(u'array').get(var.get(u'index')), var.get(u'index'), var.get(u'array')),Js(False)): + break + return var.get(u'array') + PyJsHoisted_arrayEach_.func_name = u'arrayEach' + var.put(u'arrayEach', PyJsHoisted_arrayEach_) + pass + var.get(u'module').put(u'exports', var.get(u'arrayEach')) +PyJs_anonymous_3457_._set_name(u'anonymous') +PyJs_Object_3458_ = Js({}) +@Js +def PyJs_anonymous_3459_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseIndexOf', u'require', u'exports', u'module', u'arrayIncludes']) + @Js + def PyJsHoisted_arrayIncludes_(array, value, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'arguments':arguments, u'value':value}, var) + var.registers([u'length', u'array', u'value']) + var.put(u'length', (var.get(u'array').get(u'length') if var.get(u'array') else Js(0.0))) + return (var.get(u'length').neg().neg() and (var.get(u'baseIndexOf')(var.get(u'array'), var.get(u'value'), Js(0.0))>(-Js(1.0)))) + PyJsHoisted_arrayIncludes_.func_name = u'arrayIncludes' + var.put(u'arrayIncludes', PyJsHoisted_arrayIncludes_) + var.put(u'baseIndexOf', var.get(u'require')(Js(u'./_baseIndexOf'))) + pass + var.get(u'module').put(u'exports', var.get(u'arrayIncludes')) +PyJs_anonymous_3459_._set_name(u'anonymous') +PyJs_Object_3460_ = Js({u'./_baseIndexOf':Js(325.0)}) +@Js +def PyJs_anonymous_3461_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'arrayIncludesWith', u'module']) + @Js + def PyJsHoisted_arrayIncludesWith_(array, value, comparator, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'comparator':comparator, u'value':value, u'arguments':arguments}, var) + var.registers([u'index', u'length', u'array', u'value', u'comparator']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', (var.get(u'array').get(u'length') if var.get(u'array') else Js(0.0))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + if var.get(u'comparator')(var.get(u'value'), var.get(u'array').get(var.get(u'index'))): + return var.get(u'true') + return Js(False) + PyJsHoisted_arrayIncludesWith_.func_name = u'arrayIncludesWith' + var.put(u'arrayIncludesWith', PyJsHoisted_arrayIncludesWith_) + pass + var.get(u'module').put(u'exports', var.get(u'arrayIncludesWith')) +PyJs_anonymous_3461_._set_name(u'anonymous') +PyJs_Object_3462_ = Js({}) +@Js +def PyJs_anonymous_3463_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'arrayMap', u'exports', u'module']) + @Js + def PyJsHoisted_arrayMap_(array, iteratee, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'arguments':arguments, u'iteratee':iteratee}, var) + var.registers([u'index', u'length', u'array', u'result', u'iteratee']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', (var.get(u'array').get(u'length') if var.get(u'array') else Js(0.0))) + var.put(u'result', var.get(u'Array')(var.get(u'length'))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.get(u'result').put(var.get(u'index'), var.get(u'iteratee')(var.get(u'array').get(var.get(u'index')), var.get(u'index'), var.get(u'array'))) + return var.get(u'result') + PyJsHoisted_arrayMap_.func_name = u'arrayMap' + var.put(u'arrayMap', PyJsHoisted_arrayMap_) + pass + var.get(u'module').put(u'exports', var.get(u'arrayMap')) +PyJs_anonymous_3463_._set_name(u'anonymous') +PyJs_Object_3464_ = Js({}) +@Js +def PyJs_anonymous_3465_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'arrayPush']) + @Js + def PyJsHoisted_arrayPush_(array, values, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'values':values, u'arguments':arguments}, var) + var.registers([u'index', u'length', u'values', u'array', u'offset']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'values').get(u'length')) + var.put(u'offset', var.get(u'array').get(u'length')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.get(u'array').put((var.get(u'offset')+var.get(u'index')), var.get(u'values').get(var.get(u'index'))) + return var.get(u'array') + PyJsHoisted_arrayPush_.func_name = u'arrayPush' + var.put(u'arrayPush', PyJsHoisted_arrayPush_) + pass + var.get(u'module').put(u'exports', var.get(u'arrayPush')) +PyJs_anonymous_3465_._set_name(u'anonymous') +PyJs_Object_3466_ = Js({}) +@Js +def PyJs_anonymous_3467_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'arrayReduce']) + @Js + def PyJsHoisted_arrayReduce_(array, iteratee, accumulator, initAccum, this, arguments, var=var): + var = Scope({u'accumulator':accumulator, u'initAccum':initAccum, u'arguments':arguments, u'iteratee':iteratee, u'this':this, u'array':array}, var) + var.registers([u'index', u'initAccum', u'accumulator', u'length', u'iteratee', u'array']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', (var.get(u'array').get(u'length') if var.get(u'array') else Js(0.0))) + if (var.get(u'initAccum') and var.get(u'length')): + var.put(u'accumulator', var.get(u'array').get(var.put(u'index',Js(var.get(u'index').to_number())+Js(1)))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'accumulator', var.get(u'iteratee')(var.get(u'accumulator'), var.get(u'array').get(var.get(u'index')), var.get(u'index'), var.get(u'array'))) + return var.get(u'accumulator') + PyJsHoisted_arrayReduce_.func_name = u'arrayReduce' + var.put(u'arrayReduce', PyJsHoisted_arrayReduce_) + pass + var.get(u'module').put(u'exports', var.get(u'arrayReduce')) +PyJs_anonymous_3467_._set_name(u'anonymous') +PyJs_Object_3468_ = Js({}) +@Js +def PyJs_anonymous_3469_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'arraySome', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_arraySome_(array, predicate, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'predicate':predicate, u'arguments':arguments}, var) + var.registers([u'index', u'length', u'predicate', u'array']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', (var.get(u'array').get(u'length') if var.get(u'array') else Js(0.0))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + if var.get(u'predicate')(var.get(u'array').get(var.get(u'index')), var.get(u'index'), var.get(u'array')): + return var.get(u'true') + return Js(False) + PyJsHoisted_arraySome_.func_name = u'arraySome' + var.put(u'arraySome', PyJsHoisted_arraySome_) + pass + var.get(u'module').put(u'exports', var.get(u'arraySome')) +PyJs_anonymous_3469_._set_name(u'anonymous') +PyJs_Object_3470_ = Js({}) +@Js +def PyJs_anonymous_3471_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'assignInDefaults', u'module', u'hasOwnProperty', u'objectProto', u'eq']) + @Js + def PyJsHoisted_assignInDefaults_(objValue, srcValue, key, object, this, arguments, var=var): + var = Scope({u'objValue':objValue, u'srcValue':srcValue, u'key':key, u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'key', u'object', u'srcValue', u'objValue']) + if (PyJsStrictEq(var.get(u'objValue'),var.get(u'undefined')) or (var.get(u'eq')(var.get(u'objValue'), var.get(u'objectProto').get(var.get(u'key'))) and var.get(u'hasOwnProperty').callprop(u'call', var.get(u'object'), var.get(u'key')).neg())): + return var.get(u'srcValue') + return var.get(u'objValue') + PyJsHoisted_assignInDefaults_.func_name = u'assignInDefaults' + var.put(u'assignInDefaults', PyJsHoisted_assignInDefaults_) + var.put(u'eq', var.get(u'require')(Js(u'./eq'))) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'hasOwnProperty', var.get(u'objectProto').get(u'hasOwnProperty')) + pass + var.get(u'module').put(u'exports', var.get(u'assignInDefaults')) +PyJs_anonymous_3471_._set_name(u'anonymous') +PyJs_Object_3472_ = Js({u'./eq':Js(444.0)}) +@Js +def PyJs_anonymous_3473_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'assignMergeValue', u'require', u'eq', u'exports', u'module']) + @Js + def PyJsHoisted_assignMergeValue_(object, key, value, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'object', u'value', u'key']) + if ((PyJsStrictNeq(var.get(u'value'),var.get(u'undefined')) and var.get(u'eq')(var.get(u'object').get(var.get(u'key')), var.get(u'value')).neg()) or (((var.get(u'key',throw=False).typeof()==Js(u'number')) and PyJsStrictEq(var.get(u'value'),var.get(u'undefined'))) and var.get(u'object').contains(var.get(u'key')).neg())): + var.get(u'object').put(var.get(u'key'), var.get(u'value')) + PyJsHoisted_assignMergeValue_.func_name = u'assignMergeValue' + var.put(u'assignMergeValue', PyJsHoisted_assignMergeValue_) + var.put(u'eq', var.get(u'require')(Js(u'./eq'))) + pass + var.get(u'module').put(u'exports', var.get(u'assignMergeValue')) +PyJs_anonymous_3473_._set_name(u'anonymous') +PyJs_Object_3474_ = Js({u'./eq':Js(444.0)}) +@Js +def PyJs_anonymous_3475_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'assignValue', u'exports', u'require', u'module', u'hasOwnProperty', u'objectProto', u'eq']) + @Js + def PyJsHoisted_assignValue_(object, key, value, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'object', u'key', u'objValue']) + var.put(u'objValue', var.get(u'object').get(var.get(u'key'))) + if ((var.get(u'hasOwnProperty').callprop(u'call', var.get(u'object'), var.get(u'key')) and var.get(u'eq')(var.get(u'objValue'), var.get(u'value'))).neg() or (PyJsStrictEq(var.get(u'value'),var.get(u'undefined')) and var.get(u'object').contains(var.get(u'key')).neg())): + var.get(u'object').put(var.get(u'key'), var.get(u'value')) + PyJsHoisted_assignValue_.func_name = u'assignValue' + var.put(u'assignValue', PyJsHoisted_assignValue_) + var.put(u'eq', var.get(u'require')(Js(u'./eq'))) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'hasOwnProperty', var.get(u'objectProto').get(u'hasOwnProperty')) + pass + var.get(u'module').put(u'exports', var.get(u'assignValue')) +PyJs_anonymous_3475_._set_name(u'anonymous') +PyJs_Object_3476_ = Js({u'./eq':Js(444.0)}) +@Js +def PyJs_anonymous_3477_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'assocIndexOf', u'require', u'eq', u'exports', u'module']) + @Js + def PyJsHoisted_assocIndexOf_(array, key, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'arguments':arguments, u'key':key}, var) + var.registers([u'length', u'array', u'key']) + var.put(u'length', var.get(u'array').get(u'length')) + while (var.put(u'length',Js(var.get(u'length').to_number())-Js(1))+Js(1)): + if var.get(u'eq')(var.get(u'array').get(var.get(u'length')).get(u'0'), var.get(u'key')): + return var.get(u'length') + return (-Js(1.0)) + PyJsHoisted_assocIndexOf_.func_name = u'assocIndexOf' + var.put(u'assocIndexOf', PyJsHoisted_assocIndexOf_) + var.put(u'eq', var.get(u'require')(Js(u'./eq'))) + pass + var.get(u'module').put(u'exports', var.get(u'assocIndexOf')) +PyJs_anonymous_3477_._set_name(u'anonymous') +PyJs_Object_3478_ = Js({u'./eq':Js(444.0)}) +@Js +def PyJs_anonymous_3479_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'keys', u'require', u'module', u'baseAssign', u'copyObject']) + @Js + def PyJsHoisted_baseAssign_(object, source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'object':object, u'arguments':arguments}, var) + var.registers([u'source', u'object']) + return (var.get(u'object') and var.get(u'copyObject')(var.get(u'source'), var.get(u'keys')(var.get(u'source')), var.get(u'object'))) + PyJsHoisted_baseAssign_.func_name = u'baseAssign' + var.put(u'baseAssign', PyJsHoisted_baseAssign_) + var.put(u'copyObject', var.get(u'require')(Js(u'./_copyObject'))) + var.put(u'keys', var.get(u'require')(Js(u'./keys'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseAssign')) +PyJs_anonymous_3479_._set_name(u'anonymous') +PyJs_Object_3480_ = Js({u'./_copyObject':Js(367.0),u'./keys':Js(474.0)}) +@Js +def PyJs_anonymous_3481_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'baseClamp', u'module']) + @Js + def PyJsHoisted_baseClamp_(number, lower, upper, this, arguments, var=var): + var = Scope({u'this':this, u'upper':upper, u'lower':lower, u'number':number, u'arguments':arguments}, var) + var.registers([u'upper', u'lower', u'number']) + if PyJsStrictEq(var.get(u'number'),var.get(u'number')): + if PyJsStrictNeq(var.get(u'upper'),var.get(u'undefined')): + var.put(u'number', (var.get(u'number') if (var.get(u'number')<=var.get(u'upper')) else var.get(u'upper'))) + if PyJsStrictNeq(var.get(u'lower'),var.get(u'undefined')): + var.put(u'number', (var.get(u'number') if (var.get(u'number')>=var.get(u'lower')) else var.get(u'lower'))) + return var.get(u'number') + PyJsHoisted_baseClamp_.func_name = u'baseClamp' + var.put(u'baseClamp', PyJsHoisted_baseClamp_) + pass + var.get(u'module').put(u'exports', var.get(u'baseClamp')) +PyJs_anonymous_3481_._set_name(u'anonymous') +PyJs_Object_3482_ = Js({}) +@Js +def PyJs_anonymous_3483_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'genTag', u'arrayTag', u'initCloneObject', u'uint32Tag', u'arrayBufferTag', u'objectTag', u'dataViewTag', u'regexpTag', u'copyArray', u'int8Tag', u'uint16Tag', u'errorTag', u'float64Tag', u'isBuffer', u'baseClone', u'assignValue', u'mapTag', u'cloneableTags', u'boolTag', u'arrayEach', u'initCloneByTag', u'funcTag', u'getAllKeys', u'float32Tag', u'cloneBuffer', u'Stack', u'argsTag', u'isArray', u'exports', u'dateTag', u'int16Tag', u'copySymbols', u'keys', u'stringTag', u'numberTag', u'module', u'getTag', u'isObject', u'uint8Tag', u'initCloneArray', u'isHostObject', u'require', u'baseAssign', u'uint8ClampedTag', u'weakMapTag', u'setTag', u'int32Tag', u'symbolTag']) + @Js + def PyJsHoisted_baseClone_(value, isDeep, isFull, customizer, key, object, stack, this, arguments, var=var): + var = Scope({u'this':this, u'isFull':isFull, u'object':object, u'value':value, u'isDeep':isDeep, u'arguments':arguments, u'key':key, u'customizer':customizer, u'stack':stack}, var) + var.registers([u'stacked', u'isFull', u'object', u'isFunc', u'value', u'tag', u'isDeep', u'result', u'key', u'props', u'customizer', u'isArr', u'stack']) + pass + if var.get(u'customizer'): + var.put(u'result', (var.get(u'customizer')(var.get(u'value'), var.get(u'key'), var.get(u'object'), var.get(u'stack')) if var.get(u'object') else var.get(u'customizer')(var.get(u'value')))) + if PyJsStrictNeq(var.get(u'result'),var.get(u'undefined')): + return var.get(u'result') + if var.get(u'isObject')(var.get(u'value')).neg(): + return var.get(u'value') + var.put(u'isArr', var.get(u'isArray')(var.get(u'value'))) + if var.get(u'isArr'): + var.put(u'result', var.get(u'initCloneArray')(var.get(u'value'))) + if var.get(u'isDeep').neg(): + return var.get(u'copyArray')(var.get(u'value'), var.get(u'result')) + else: + var.put(u'tag', var.get(u'getTag')(var.get(u'value'))) + var.put(u'isFunc', ((var.get(u'tag')==var.get(u'funcTag')) or (var.get(u'tag')==var.get(u'genTag')))) + if var.get(u'isBuffer')(var.get(u'value')): + return var.get(u'cloneBuffer')(var.get(u'value'), var.get(u'isDeep')) + if (((var.get(u'tag')==var.get(u'objectTag')) or (var.get(u'tag')==var.get(u'argsTag'))) or (var.get(u'isFunc') and var.get(u'object').neg())): + if var.get(u'isHostObject')(var.get(u'value')): + PyJs_Object_3487_ = Js({}) + return (var.get(u'value') if var.get(u'object') else PyJs_Object_3487_) + PyJs_Object_3488_ = Js({}) + var.put(u'result', var.get(u'initCloneObject')((PyJs_Object_3488_ if var.get(u'isFunc') else var.get(u'value')))) + if var.get(u'isDeep').neg(): + return var.get(u'copySymbols')(var.get(u'value'), var.get(u'baseAssign')(var.get(u'result'), var.get(u'value'))) + else: + if var.get(u'cloneableTags').get(var.get(u'tag')).neg(): + PyJs_Object_3489_ = Js({}) + return (var.get(u'value') if var.get(u'object') else PyJs_Object_3489_) + var.put(u'result', var.get(u'initCloneByTag')(var.get(u'value'), var.get(u'tag'), var.get(u'baseClone'), var.get(u'isDeep'))) + (var.get(u'stack') or var.put(u'stack', var.get(u'Stack').create())) + var.put(u'stacked', var.get(u'stack').callprop(u'get', var.get(u'value'))) + if var.get(u'stacked'): + return var.get(u'stacked') + var.get(u'stack').callprop(u'set', var.get(u'value'), var.get(u'result')) + if var.get(u'isArr').neg(): + var.put(u'props', (var.get(u'getAllKeys')(var.get(u'value')) if var.get(u'isFull') else var.get(u'keys')(var.get(u'value')))) + @Js + def PyJs_anonymous_3490_(subValue, key, this, arguments, var=var): + var = Scope({u'this':this, u'subValue':subValue, u'arguments':arguments, u'key':key}, var) + var.registers([u'subValue', u'key']) + if var.get(u'props'): + var.put(u'key', var.get(u'subValue')) + var.put(u'subValue', var.get(u'value').get(var.get(u'key'))) + var.get(u'assignValue')(var.get(u'result'), var.get(u'key'), var.get(u'baseClone')(var.get(u'subValue'), var.get(u'isDeep'), var.get(u'isFull'), var.get(u'customizer'), var.get(u'key'), var.get(u'value'), var.get(u'stack'))) + PyJs_anonymous_3490_._set_name(u'anonymous') + var.get(u'arrayEach')((var.get(u'props') or var.get(u'value')), PyJs_anonymous_3490_) + return var.get(u'result') + PyJsHoisted_baseClone_.func_name = u'baseClone' + var.put(u'baseClone', PyJsHoisted_baseClone_) + var.put(u'Stack', var.get(u'require')(Js(u'./_Stack'))) + var.put(u'arrayEach', var.get(u'require')(Js(u'./_arrayEach'))) + var.put(u'assignValue', var.get(u'require')(Js(u'./_assignValue'))) + var.put(u'baseAssign', var.get(u'require')(Js(u'./_baseAssign'))) + var.put(u'cloneBuffer', var.get(u'require')(Js(u'./_cloneBuffer'))) + var.put(u'copyArray', var.get(u'require')(Js(u'./_copyArray'))) + var.put(u'copySymbols', var.get(u'require')(Js(u'./_copySymbols'))) + var.put(u'getAllKeys', var.get(u'require')(Js(u'./_getAllKeys'))) + var.put(u'getTag', var.get(u'require')(Js(u'./_getTag'))) + var.put(u'initCloneArray', var.get(u'require')(Js(u'./_initCloneArray'))) + var.put(u'initCloneByTag', var.get(u'require')(Js(u'./_initCloneByTag'))) + var.put(u'initCloneObject', var.get(u'require')(Js(u'./_initCloneObject'))) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + var.put(u'isBuffer', var.get(u'require')(Js(u'./isBuffer'))) + var.put(u'isHostObject', var.get(u'require')(Js(u'./_isHostObject'))) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + var.put(u'keys', var.get(u'require')(Js(u'./keys'))) + var.put(u'argsTag', Js(u'[object Arguments]')) + var.put(u'arrayTag', Js(u'[object Array]')) + var.put(u'boolTag', Js(u'[object Boolean]')) + var.put(u'dateTag', Js(u'[object Date]')) + var.put(u'errorTag', Js(u'[object Error]')) + var.put(u'funcTag', Js(u'[object Function]')) + var.put(u'genTag', Js(u'[object GeneratorFunction]')) + var.put(u'mapTag', Js(u'[object Map]')) + var.put(u'numberTag', Js(u'[object Number]')) + var.put(u'objectTag', Js(u'[object Object]')) + var.put(u'regexpTag', Js(u'[object RegExp]')) + var.put(u'setTag', Js(u'[object Set]')) + var.put(u'stringTag', Js(u'[object String]')) + var.put(u'symbolTag', Js(u'[object Symbol]')) + var.put(u'weakMapTag', Js(u'[object WeakMap]')) + var.put(u'arrayBufferTag', Js(u'[object ArrayBuffer]')) + var.put(u'dataViewTag', Js(u'[object DataView]')) + var.put(u'float32Tag', Js(u'[object Float32Array]')) + var.put(u'float64Tag', Js(u'[object Float64Array]')) + var.put(u'int8Tag', Js(u'[object Int8Array]')) + var.put(u'int16Tag', Js(u'[object Int16Array]')) + var.put(u'int32Tag', Js(u'[object Int32Array]')) + var.put(u'uint8Tag', Js(u'[object Uint8Array]')) + var.put(u'uint8ClampedTag', Js(u'[object Uint8ClampedArray]')) + var.put(u'uint16Tag', Js(u'[object Uint16Array]')) + var.put(u'uint32Tag', Js(u'[object Uint32Array]')) + PyJs_Object_3484_ = Js({}) + var.put(u'cloneableTags', PyJs_Object_3484_) + def PyJs_LONG_3486_(var=var): + def PyJs_LONG_3485_(var=var): + return var.get(u'cloneableTags').put(var.get(u'regexpTag'), var.get(u'cloneableTags').put(var.get(u'setTag'), var.get(u'cloneableTags').put(var.get(u'stringTag'), var.get(u'cloneableTags').put(var.get(u'symbolTag'), var.get(u'cloneableTags').put(var.get(u'uint8Tag'), var.get(u'cloneableTags').put(var.get(u'uint8ClampedTag'), var.get(u'cloneableTags').put(var.get(u'uint16Tag'), var.get(u'cloneableTags').put(var.get(u'uint32Tag'), var.get(u'true'))))))))) + return var.get(u'cloneableTags').put(var.get(u'float32Tag'), var.get(u'cloneableTags').put(var.get(u'float64Tag'), var.get(u'cloneableTags').put(var.get(u'int8Tag'), var.get(u'cloneableTags').put(var.get(u'int16Tag'), var.get(u'cloneableTags').put(var.get(u'int32Tag'), var.get(u'cloneableTags').put(var.get(u'mapTag'), var.get(u'cloneableTags').put(var.get(u'numberTag'), var.get(u'cloneableTags').put(var.get(u'objectTag'), PyJs_LONG_3485_())))))))) + var.get(u'cloneableTags').put(var.get(u'argsTag'), var.get(u'cloneableTags').put(var.get(u'arrayTag'), var.get(u'cloneableTags').put(var.get(u'arrayBufferTag'), var.get(u'cloneableTags').put(var.get(u'dataViewTag'), var.get(u'cloneableTags').put(var.get(u'boolTag'), var.get(u'cloneableTags').put(var.get(u'dateTag'), PyJs_LONG_3486_())))))) + var.get(u'cloneableTags').put(var.get(u'errorTag'), var.get(u'cloneableTags').put(var.get(u'funcTag'), var.get(u'cloneableTags').put(var.get(u'weakMapTag'), Js(False)))) + pass + var.get(u'module').put(u'exports', var.get(u'baseClone')) +PyJs_anonymous_3483_._set_name(u'anonymous') +PyJs_Object_3491_ = Js({u'./_Stack':Js(294.0),u'./_arrayEach':Js(301.0),u'./_assignValue':Js(310.0),u'./_baseAssign':Js(312.0),u'./_cloneBuffer':Js(357.0),u'./_copyArray':Js(366.0),u'./_copySymbols':Js(368.0),u'./_getAllKeys':Js(378.0),u'./_getTag':Js(385.0),u'./_initCloneArray':Js(395.0),u'./_initCloneByTag':Js(396.0),u'./_initCloneObject':Js(397.0),u'./_isHostObject':Js(400.0),u'./isArray':Js(458.0),u'./isBuffer':Js(462.0),u'./isObject':Js(467.0),u'./keys':Js(474.0)}) +@Js +def PyJs_anonymous_3492_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'objectCreate', u'require', u'module', u'baseCreate', u'isObject']) + @Js + def PyJsHoisted_baseCreate_(proto, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'proto':proto}, var) + var.registers([u'proto']) + PyJs_Object_3493_ = Js({}) + return (var.get(u'objectCreate')(var.get(u'proto')) if var.get(u'isObject')(var.get(u'proto')) else PyJs_Object_3493_) + PyJsHoisted_baseCreate_.func_name = u'baseCreate' + var.put(u'baseCreate', PyJsHoisted_baseCreate_) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + var.put(u'objectCreate', var.get(u'Object').get(u'create')) + pass + var.get(u'module').put(u'exports', var.get(u'baseCreate')) +PyJs_anonymous_3492_._set_name(u'anonymous') +PyJs_Object_3494_ = Js({u'./isObject':Js(467.0)}) +@Js +def PyJs_anonymous_3495_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseEach', u'exports', u'baseForOwn', u'module', u'createBaseEach', u'require']) + var.put(u'baseForOwn', var.get(u'require')(Js(u'./_baseForOwn'))) + var.put(u'createBaseEach', var.get(u'require')(Js(u'./_createBaseEach'))) + var.put(u'baseEach', var.get(u'createBaseEach')(var.get(u'baseForOwn'))) + var.get(u'module').put(u'exports', var.get(u'baseEach')) +PyJs_anonymous_3495_._set_name(u'anonymous') +PyJs_Object_3496_ = Js({u'./_baseForOwn':Js(320.0),u'./_createBaseEach':Js(371.0)}) +@Js +def PyJs_anonymous_3497_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'baseFindIndex']) + @Js + def PyJsHoisted_baseFindIndex_(array, predicate, fromIndex, fromRight, this, arguments, var=var): + var = Scope({u'predicate':predicate, u'arguments':arguments, u'this':this, u'array':array, u'fromIndex':fromIndex, u'fromRight':fromRight}, var) + var.registers([u'index', u'predicate', u'fromIndex', u'fromRight', u'length', u'array']) + var.put(u'length', var.get(u'array').get(u'length')) + var.put(u'index', (var.get(u'fromIndex')+(Js(1.0) if var.get(u'fromRight') else (-Js(1.0))))) + while ((var.put(u'index',Js(var.get(u'index').to_number())-Js(1))+Js(1)) if var.get(u'fromRight') else (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length'))): + if var.get(u'predicate')(var.get(u'array').get(var.get(u'index')), var.get(u'index'), var.get(u'array')): + return var.get(u'index') + return (-Js(1.0)) + PyJsHoisted_baseFindIndex_.func_name = u'baseFindIndex' + var.put(u'baseFindIndex', PyJsHoisted_baseFindIndex_) + pass + var.get(u'module').put(u'exports', var.get(u'baseFindIndex')) +PyJs_anonymous_3497_._set_name(u'anonymous') +PyJs_Object_3498_ = Js({}) +@Js +def PyJs_anonymous_3499_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'baseFlatten', u'require', u'module', u'arrayPush', u'isFlattenable']) + @Js + def PyJsHoisted_baseFlatten_(array, depth, predicate, isStrict, result, this, arguments, var=var): + var = Scope({u'predicate':predicate, u'result':result, u'isStrict':isStrict, u'this':this, u'array':array, u'depth':depth, u'arguments':arguments}, var) + var.registers([u'index', u'predicate', u'isStrict', u'depth', u'value', u'length', u'result', u'array']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'array').get(u'length')) + (var.get(u'predicate') or var.put(u'predicate', var.get(u'isFlattenable'))) + (var.get(u'result') or var.put(u'result', Js([]))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'value', var.get(u'array').get(var.get(u'index'))) + if ((var.get(u'depth')>Js(0.0)) and var.get(u'predicate')(var.get(u'value'))): + if (var.get(u'depth')>Js(1.0)): + var.get(u'baseFlatten')(var.get(u'value'), (var.get(u'depth')-Js(1.0)), var.get(u'predicate'), var.get(u'isStrict'), var.get(u'result')) + else: + var.get(u'arrayPush')(var.get(u'result'), var.get(u'value')) + else: + if var.get(u'isStrict').neg(): + var.get(u'result').put(var.get(u'result').get(u'length'), var.get(u'value')) + return var.get(u'result') + PyJsHoisted_baseFlatten_.func_name = u'baseFlatten' + var.put(u'baseFlatten', PyJsHoisted_baseFlatten_) + var.put(u'arrayPush', var.get(u'require')(Js(u'./_arrayPush'))) + var.put(u'isFlattenable', var.get(u'require')(Js(u'./_isFlattenable'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseFlatten')) +PyJs_anonymous_3499_._set_name(u'anonymous') +PyJs_Object_3500_ = Js({u'./_arrayPush':Js(305.0),u'./_isFlattenable':Js(398.0)}) +@Js +def PyJs_anonymous_3501_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'createBaseFor', u'require', u'exports', u'module', u'baseFor']) + var.put(u'createBaseFor', var.get(u'require')(Js(u'./_createBaseFor'))) + var.put(u'baseFor', var.get(u'createBaseFor')()) + var.get(u'module').put(u'exports', var.get(u'baseFor')) +PyJs_anonymous_3501_._set_name(u'anonymous') +PyJs_Object_3502_ = Js({u'./_createBaseFor':Js(372.0)}) +@Js +def PyJs_anonymous_3503_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'baseFor', u'keys', u'baseForOwn', u'module', u'require']) + @Js + def PyJsHoisted_baseForOwn_(object, iteratee, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments, u'iteratee':iteratee}, var) + var.registers([u'object', u'iteratee']) + return (var.get(u'object') and var.get(u'baseFor')(var.get(u'object'), var.get(u'iteratee'), var.get(u'keys'))) + PyJsHoisted_baseForOwn_.func_name = u'baseForOwn' + var.put(u'baseForOwn', PyJsHoisted_baseForOwn_) + var.put(u'baseFor', var.get(u'require')(Js(u'./_baseFor'))) + var.put(u'keys', var.get(u'require')(Js(u'./keys'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseForOwn')) +PyJs_anonymous_3503_._set_name(u'anonymous') +PyJs_Object_3504_ = Js({u'./_baseFor':Js(319.0),u'./keys':Js(474.0)}) +@Js +def PyJs_anonymous_3505_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'toKey', u'isKey', u'require', u'module', u'castPath', u'baseGet']) + @Js + def PyJsHoisted_baseGet_(object, path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'object':object, u'arguments':arguments}, var) + var.registers([u'index', u'length', u'object', u'path']) + var.put(u'path', (Js([var.get(u'path')]) if var.get(u'isKey')(var.get(u'path'), var.get(u'object')) else var.get(u'castPath')(var.get(u'path')))) + var.put(u'index', Js(0.0)) + var.put(u'length', var.get(u'path').get(u'length')) + while ((var.get(u'object')!=var.get(u"null")) and (var.get(u'index')<var.get(u'length'))): + var.put(u'object', var.get(u'object').get(var.get(u'toKey')(var.get(u'path').get((var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)))))) + return (var.get(u'object') if (var.get(u'index') and (var.get(u'index')==var.get(u'length'))) else var.get(u'undefined')) + PyJsHoisted_baseGet_.func_name = u'baseGet' + var.put(u'baseGet', PyJsHoisted_baseGet_) + var.put(u'castPath', var.get(u'require')(Js(u'./_castPath'))) + var.put(u'isKey', var.get(u'require')(Js(u'./_isKey'))) + var.put(u'toKey', var.get(u'require')(Js(u'./_toKey'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseGet')) +PyJs_anonymous_3505_._set_name(u'anonymous') +PyJs_Object_3506_ = Js({u'./_castPath':Js(352.0),u'./_isKey':Js(403.0),u'./_toKey':Js(433.0)}) +@Js +def PyJs_anonymous_3507_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'exports', u'baseGetAllKeys', u'require', u'module', u'arrayPush']) + @Js + def PyJsHoisted_baseGetAllKeys_(object, keysFunc, symbolsFunc, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'symbolsFunc':symbolsFunc, u'keysFunc':keysFunc, u'arguments':arguments}, var) + var.registers([u'symbolsFunc', u'object', u'result', u'keysFunc']) + var.put(u'result', var.get(u'keysFunc')(var.get(u'object'))) + return (var.get(u'result') if var.get(u'isArray')(var.get(u'object')) else var.get(u'arrayPush')(var.get(u'result'), var.get(u'symbolsFunc')(var.get(u'object')))) + PyJsHoisted_baseGetAllKeys_.func_name = u'baseGetAllKeys' + var.put(u'baseGetAllKeys', PyJsHoisted_baseGetAllKeys_) + var.put(u'arrayPush', var.get(u'require')(Js(u'./_arrayPush'))) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseGetAllKeys')) +PyJs_anonymous_3507_._set_name(u'anonymous') +PyJs_Object_3508_ = Js({u'./_arrayPush':Js(305.0),u'./isArray':Js(458.0)}) +@Js +def PyJs_anonymous_3509_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'baseHas', u'require', u'module', u'hasOwnProperty', u'getPrototype', u'objectProto']) + @Js + def PyJsHoisted_baseHas_(object, key, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments, u'key':key}, var) + var.registers([u'object', u'key']) + return ((var.get(u'object')!=var.get(u"null")) and (var.get(u'hasOwnProperty').callprop(u'call', var.get(u'object'), var.get(u'key')) or (((var.get(u'object',throw=False).typeof()==Js(u'object')) and var.get(u'object').contains(var.get(u'key'))) and PyJsStrictEq(var.get(u'getPrototype')(var.get(u'object')),var.get(u"null"))))) + PyJsHoisted_baseHas_.func_name = u'baseHas' + var.put(u'baseHas', PyJsHoisted_baseHas_) + var.put(u'getPrototype', var.get(u'require')(Js(u'./_getPrototype'))) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'hasOwnProperty', var.get(u'objectProto').get(u'hasOwnProperty')) + pass + var.get(u'module').put(u'exports', var.get(u'baseHas')) +PyJs_anonymous_3509_._set_name(u'anonymous') +PyJs_Object_3510_ = Js({u'./_getPrototype':Js(383.0)}) +@Js +def PyJs_anonymous_3511_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseHasIn', u'require', u'exports', u'module']) + @Js + def PyJsHoisted_baseHasIn_(object, key, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments, u'key':key}, var) + var.registers([u'object', u'key']) + return ((var.get(u'object')!=var.get(u"null")) and var.get(u'Object')(var.get(u'object')).contains(var.get(u'key'))) + PyJsHoisted_baseHasIn_.func_name = u'baseHasIn' + var.put(u'baseHasIn', PyJsHoisted_baseHasIn_) + pass + var.get(u'module').put(u'exports', var.get(u'baseHasIn')) +PyJs_anonymous_3511_._set_name(u'anonymous') +PyJs_Object_3512_ = Js({}) +@Js +def PyJs_anonymous_3513_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseIndexOf', u'require', u'indexOfNaN', u'exports', u'module']) + @Js + def PyJsHoisted_baseIndexOf_(array, value, fromIndex, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'fromIndex':fromIndex, u'value':value, u'arguments':arguments}, var) + var.registers([u'index', u'length', u'array', u'value', u'fromIndex']) + if PyJsStrictNeq(var.get(u'value'),var.get(u'value')): + return var.get(u'indexOfNaN')(var.get(u'array'), var.get(u'fromIndex')) + var.put(u'index', (var.get(u'fromIndex')-Js(1.0))) + var.put(u'length', var.get(u'array').get(u'length')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + if PyJsStrictEq(var.get(u'array').get(var.get(u'index')),var.get(u'value')): + return var.get(u'index') + return (-Js(1.0)) + PyJsHoisted_baseIndexOf_.func_name = u'baseIndexOf' + var.put(u'baseIndexOf', PyJsHoisted_baseIndexOf_) + var.put(u'indexOfNaN', var.get(u'require')(Js(u'./_indexOfNaN'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseIndexOf')) +PyJs_anonymous_3513_._set_name(u'anonymous') +PyJs_Object_3514_ = Js({u'./_indexOfNaN':Js(394.0)}) +@Js +def PyJs_anonymous_3515_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseIndexOfWith', u'require', u'exports', u'module']) + @Js + def PyJsHoisted_baseIndexOfWith_(array, value, fromIndex, comparator, this, arguments, var=var): + var = Scope({u'arguments':arguments, u'comparator':comparator, u'this':this, u'array':array, u'fromIndex':fromIndex, u'value':value}, var) + var.registers([u'index', u'comparator', u'fromIndex', u'value', u'length', u'array']) + var.put(u'index', (var.get(u'fromIndex')-Js(1.0))) + var.put(u'length', var.get(u'array').get(u'length')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + if var.get(u'comparator')(var.get(u'array').get(var.get(u'index')), var.get(u'value')): + return var.get(u'index') + return (-Js(1.0)) + PyJsHoisted_baseIndexOfWith_.func_name = u'baseIndexOfWith' + var.put(u'baseIndexOfWith', PyJsHoisted_baseIndexOfWith_) + pass + var.get(u'module').put(u'exports', var.get(u'baseIndexOfWith')) +PyJs_anonymous_3515_._set_name(u'anonymous') +PyJs_Object_3516_ = Js({}) +@Js +def PyJs_anonymous_3517_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'baseIsEqualDeep', u'isObjectLike', u'isObject', u'baseIsEqual']) + @Js + def PyJsHoisted_baseIsEqual_(value, other, customizer, bitmask, stack, this, arguments, var=var): + var = Scope({u'bitmask':bitmask, u'other':other, u'arguments':arguments, u'this':this, u'customizer':customizer, u'stack':stack, u'value':value}, var) + var.registers([u'bitmask', u'other', u'stack', u'value', u'customizer']) + if PyJsStrictEq(var.get(u'value'),var.get(u'other')): + return var.get(u'true') + if (((var.get(u'value')==var.get(u"null")) or (var.get(u'other')==var.get(u"null"))) or (var.get(u'isObject')(var.get(u'value')).neg() and var.get(u'isObjectLike')(var.get(u'other')).neg())): + return (PyJsStrictNeq(var.get(u'value'),var.get(u'value')) and PyJsStrictNeq(var.get(u'other'),var.get(u'other'))) + return var.get(u'baseIsEqualDeep')(var.get(u'value'), var.get(u'other'), var.get(u'baseIsEqual'), var.get(u'customizer'), var.get(u'bitmask'), var.get(u'stack')) + PyJsHoisted_baseIsEqual_.func_name = u'baseIsEqual' + var.put(u'baseIsEqual', PyJsHoisted_baseIsEqual_) + var.put(u'baseIsEqualDeep', var.get(u'require')(Js(u'./_baseIsEqualDeep'))) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseIsEqual')) +PyJs_anonymous_3517_._set_name(u'anonymous') +PyJs_Object_3518_ = Js({u'./_baseIsEqualDeep':Js(328.0),u'./isObject':Js(467.0),u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3519_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'equalObjects', u'isArray', u'exports', u'objectProto', u'objectTag', u'isHostObject', u'require', u'equalArrays', u'module', u'arrayTag', u'baseIsEqualDeep', u'argsTag', u'isTypedArray', u'getTag', u'equalByTag', u'Stack', u'PARTIAL_COMPARE_FLAG', u'hasOwnProperty']) + @Js + def PyJsHoisted_baseIsEqualDeep_(object, other, equalFunc, customizer, bitmask, stack, this, arguments, var=var): + var = Scope({u'equalFunc':equalFunc, u'this':this, u'object':object, u'bitmask':bitmask, u'other':other, u'arguments':arguments, u'customizer':customizer, u'stack':stack}, var) + var.registers([u'othIsObj', u'othTag', u'equalFunc', u'objIsObj', u'objTag', u'othUnwrapped', u'othIsWrapped', u'isSameTag', u'object', u'objIsArr', u'bitmask', u'other', u'othIsArr', u'objUnwrapped', u'objIsWrapped', u'customizer', u'stack']) + var.put(u'objIsArr', var.get(u'isArray')(var.get(u'object'))) + var.put(u'othIsArr', var.get(u'isArray')(var.get(u'other'))) + var.put(u'objTag', var.get(u'arrayTag')) + var.put(u'othTag', var.get(u'arrayTag')) + if var.get(u'objIsArr').neg(): + var.put(u'objTag', var.get(u'getTag')(var.get(u'object'))) + var.put(u'objTag', (var.get(u'objectTag') if (var.get(u'objTag')==var.get(u'argsTag')) else var.get(u'objTag'))) + if var.get(u'othIsArr').neg(): + var.put(u'othTag', var.get(u'getTag')(var.get(u'other'))) + var.put(u'othTag', (var.get(u'objectTag') if (var.get(u'othTag')==var.get(u'argsTag')) else var.get(u'othTag'))) + var.put(u'objIsObj', ((var.get(u'objTag')==var.get(u'objectTag')) and var.get(u'isHostObject')(var.get(u'object')).neg())) + var.put(u'othIsObj', ((var.get(u'othTag')==var.get(u'objectTag')) and var.get(u'isHostObject')(var.get(u'other')).neg())) + var.put(u'isSameTag', (var.get(u'objTag')==var.get(u'othTag'))) + if (var.get(u'isSameTag') and var.get(u'objIsObj').neg()): + (var.get(u'stack') or var.put(u'stack', var.get(u'Stack').create())) + return (var.get(u'equalArrays')(var.get(u'object'), var.get(u'other'), var.get(u'equalFunc'), var.get(u'customizer'), var.get(u'bitmask'), var.get(u'stack')) if (var.get(u'objIsArr') or var.get(u'isTypedArray')(var.get(u'object'))) else var.get(u'equalByTag')(var.get(u'object'), var.get(u'other'), var.get(u'objTag'), var.get(u'equalFunc'), var.get(u'customizer'), var.get(u'bitmask'), var.get(u'stack'))) + if (var.get(u'bitmask')&var.get(u'PARTIAL_COMPARE_FLAG')).neg(): + var.put(u'objIsWrapped', (var.get(u'objIsObj') and var.get(u'hasOwnProperty').callprop(u'call', var.get(u'object'), Js(u'__wrapped__')))) + var.put(u'othIsWrapped', (var.get(u'othIsObj') and var.get(u'hasOwnProperty').callprop(u'call', var.get(u'other'), Js(u'__wrapped__')))) + if (var.get(u'objIsWrapped') or var.get(u'othIsWrapped')): + var.put(u'objUnwrapped', (var.get(u'object').callprop(u'value') if var.get(u'objIsWrapped') else var.get(u'object'))) + var.put(u'othUnwrapped', (var.get(u'other').callprop(u'value') if var.get(u'othIsWrapped') else var.get(u'other'))) + (var.get(u'stack') or var.put(u'stack', var.get(u'Stack').create())) + return var.get(u'equalFunc')(var.get(u'objUnwrapped'), var.get(u'othUnwrapped'), var.get(u'customizer'), var.get(u'bitmask'), var.get(u'stack')) + if var.get(u'isSameTag').neg(): + return Js(False) + (var.get(u'stack') or var.put(u'stack', var.get(u'Stack').create())) + return var.get(u'equalObjects')(var.get(u'object'), var.get(u'other'), var.get(u'equalFunc'), var.get(u'customizer'), var.get(u'bitmask'), var.get(u'stack')) + PyJsHoisted_baseIsEqualDeep_.func_name = u'baseIsEqualDeep' + var.put(u'baseIsEqualDeep', PyJsHoisted_baseIsEqualDeep_) + var.put(u'Stack', var.get(u'require')(Js(u'./_Stack'))) + var.put(u'equalArrays', var.get(u'require')(Js(u'./_equalArrays'))) + var.put(u'equalByTag', var.get(u'require')(Js(u'./_equalByTag'))) + var.put(u'equalObjects', var.get(u'require')(Js(u'./_equalObjects'))) + var.put(u'getTag', var.get(u'require')(Js(u'./_getTag'))) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + var.put(u'isHostObject', var.get(u'require')(Js(u'./_isHostObject'))) + var.put(u'isTypedArray', var.get(u'require')(Js(u'./isTypedArray'))) + var.put(u'PARTIAL_COMPARE_FLAG', Js(2.0)) + var.put(u'argsTag', Js(u'[object Arguments]')) + var.put(u'arrayTag', Js(u'[object Array]')) + var.put(u'objectTag', Js(u'[object Object]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'hasOwnProperty', var.get(u'objectProto').get(u'hasOwnProperty')) + pass + var.get(u'module').put(u'exports', var.get(u'baseIsEqualDeep')) +PyJs_anonymous_3519_._set_name(u'anonymous') +PyJs_Object_3520_ = Js({u'./_Stack':Js(294.0),u'./_equalArrays':Js(375.0),u'./_equalByTag':Js(376.0),u'./_equalObjects':Js(377.0),u'./_getTag':Js(385.0),u'./_isHostObject':Js(400.0),u'./isArray':Js(458.0),u'./isTypedArray':Js(473.0)}) +@Js +def PyJs_anonymous_3521_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'PARTIAL_COMPARE_FLAG', u'exports', u'require', u'UNORDERED_COMPARE_FLAG', u'module', u'baseIsMatch', u'Stack', u'baseIsEqual']) + @Js + def PyJsHoisted_baseIsMatch_(object, source, matchData, customizer, this, arguments, var=var): + var = Scope({u'source':source, u'matchData':matchData, u'customizer':customizer, u'arguments':arguments, u'this':this, u'object':object}, var) + var.registers([u'noCustomizer', u'index', u'matchData', u'key', u'object', u'source', u'length', u'srcValue', u'objValue', u'customizer', u'data', u'stack', u'result']) + var.put(u'index', var.get(u'matchData').get(u'length')) + var.put(u'length', var.get(u'index')) + var.put(u'noCustomizer', var.get(u'customizer').neg()) + if (var.get(u'object')==var.get(u"null")): + return var.get(u'length').neg() + var.put(u'object', var.get(u'Object')(var.get(u'object'))) + while (var.put(u'index',Js(var.get(u'index').to_number())-Js(1))+Js(1)): + var.put(u'data', var.get(u'matchData').get(var.get(u'index'))) + if (PyJsStrictNeq(var.get(u'data').get(u'1'),var.get(u'object').get(var.get(u'data').get(u'0'))) if (var.get(u'noCustomizer') and var.get(u'data').get(u'2')) else var.get(u'object').contains(var.get(u'data').get(u'0')).neg()): + return Js(False) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'data', var.get(u'matchData').get(var.get(u'index'))) + var.put(u'key', var.get(u'data').get(u'0')) + var.put(u'objValue', var.get(u'object').get(var.get(u'key'))) + var.put(u'srcValue', var.get(u'data').get(u'1')) + if (var.get(u'noCustomizer') and var.get(u'data').get(u'2')): + if (PyJsStrictEq(var.get(u'objValue'),var.get(u'undefined')) and var.get(u'object').contains(var.get(u'key')).neg()): + return Js(False) + else: + var.put(u'stack', var.get(u'Stack').create()) + if var.get(u'customizer'): + var.put(u'result', var.get(u'customizer')(var.get(u'objValue'), var.get(u'srcValue'), var.get(u'key'), var.get(u'object'), var.get(u'source'), var.get(u'stack'))) + if (var.get(u'baseIsEqual')(var.get(u'srcValue'), var.get(u'objValue'), var.get(u'customizer'), (var.get(u'UNORDERED_COMPARE_FLAG')|var.get(u'PARTIAL_COMPARE_FLAG')), var.get(u'stack')) if PyJsStrictEq(var.get(u'result'),var.get(u'undefined')) else var.get(u'result')).neg(): + return Js(False) + return var.get(u'true') + PyJsHoisted_baseIsMatch_.func_name = u'baseIsMatch' + var.put(u'baseIsMatch', PyJsHoisted_baseIsMatch_) + var.put(u'Stack', var.get(u'require')(Js(u'./_Stack'))) + var.put(u'baseIsEqual', var.get(u'require')(Js(u'./_baseIsEqual'))) + var.put(u'UNORDERED_COMPARE_FLAG', Js(1.0)) + var.put(u'PARTIAL_COMPARE_FLAG', Js(2.0)) + pass + var.get(u'module').put(u'exports', var.get(u'baseIsMatch')) +PyJs_anonymous_3521_._set_name(u'anonymous') +PyJs_Object_3522_ = Js({u'./_Stack':Js(294.0),u'./_baseIsEqual':Js(327.0)}) +@Js +def PyJs_anonymous_3523_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'reIsNative', u'exports', u'toSource', u'objectProto', u'funcToString', u'isHostObject', u'require', u'module', u'baseIsNative', u'isMasked', u'hasOwnProperty', u'reIsHostCtor', u'isFunction', u'reRegExpChar', u'isObject']) + @Js + def PyJsHoisted_baseIsNative_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'pattern', u'value']) + if (var.get(u'isObject')(var.get(u'value')).neg() or var.get(u'isMasked')(var.get(u'value'))): + return Js(False) + var.put(u'pattern', (var.get(u'reIsNative') if (var.get(u'isFunction')(var.get(u'value')) or var.get(u'isHostObject')(var.get(u'value'))) else var.get(u'reIsHostCtor'))) + return var.get(u'pattern').callprop(u'test', var.get(u'toSource')(var.get(u'value'))) + PyJsHoisted_baseIsNative_.func_name = u'baseIsNative' + var.put(u'baseIsNative', PyJsHoisted_baseIsNative_) + var.put(u'isFunction', var.get(u'require')(Js(u'./isFunction'))) + var.put(u'isHostObject', var.get(u'require')(Js(u'./_isHostObject'))) + var.put(u'isMasked', var.get(u'require')(Js(u'./_isMasked'))) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + var.put(u'toSource', var.get(u'require')(Js(u'./_toSource'))) + var.put(u'reRegExpChar', JsRegExp(u'/[\\\\^$.*+?()[\\]{}|]/g')) + var.put(u'reIsHostCtor', JsRegExp(u'/^\\[object .+?Constructor\\]$/')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'funcToString', var.get(u'Function').get(u'prototype').get(u'toString')) + var.put(u'hasOwnProperty', var.get(u'objectProto').get(u'hasOwnProperty')) + var.put(u'reIsNative', var.get(u'RegExp')(((Js(u'^')+var.get(u'funcToString').callprop(u'call', var.get(u'hasOwnProperty')).callprop(u'replace', var.get(u'reRegExpChar'), Js(u'\\$&')).callprop(u'replace', JsRegExp(u'/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g'), Js(u'$1.*?')))+Js(u'$')))) + pass + var.get(u'module').put(u'exports', var.get(u'baseIsNative')) +PyJs_anonymous_3523_._set_name(u'anonymous') +PyJs_Object_3524_ = Js({u'./_isHostObject':Js(400.0),u'./_isMasked':Js(405.0),u'./_toSource':Js(434.0),u'./isFunction':Js(463.0),u'./isObject':Js(467.0)}) +@Js +def PyJs_anonymous_3525_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'baseMatches', u'exports', u'require', u'baseIteratee', u'module', u'baseMatchesProperty', u'property', u'identity']) + @Js + def PyJsHoisted_baseIteratee_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + if (var.get(u'value',throw=False).typeof()==Js(u'function')): + return var.get(u'value') + if (var.get(u'value')==var.get(u"null")): + return var.get(u'identity') + if (var.get(u'value',throw=False).typeof()==Js(u'object')): + return (var.get(u'baseMatchesProperty')(var.get(u'value').get(u'0'), var.get(u'value').get(u'1')) if var.get(u'isArray')(var.get(u'value')) else var.get(u'baseMatches')(var.get(u'value'))) + return var.get(u'property')(var.get(u'value')) + PyJsHoisted_baseIteratee_.func_name = u'baseIteratee' + var.put(u'baseIteratee', PyJsHoisted_baseIteratee_) + var.put(u'baseMatches', var.get(u'require')(Js(u'./_baseMatches'))) + var.put(u'baseMatchesProperty', var.get(u'require')(Js(u'./_baseMatchesProperty'))) + var.put(u'identity', var.get(u'require')(Js(u'./identity'))) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + var.put(u'property', var.get(u'require')(Js(u'./property'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseIteratee')) +PyJs_anonymous_3525_._set_name(u'anonymous') +PyJs_Object_3526_ = Js({u'./_baseMatches':Js(335.0),u'./_baseMatchesProperty':Js(336.0),u'./identity':Js(455.0),u'./isArray':Js(458.0),u'./property':Js(480.0)}) +@Js +def PyJs_anonymous_3527_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'nativeKeys', u'exports', u'module', u'baseKeys']) + @Js + def PyJsHoisted_baseKeys_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + return var.get(u'nativeKeys')(var.get(u'Object')(var.get(u'object'))) + PyJsHoisted_baseKeys_.func_name = u'baseKeys' + var.put(u'baseKeys', PyJsHoisted_baseKeys_) + var.put(u'nativeKeys', var.get(u'Object').get(u'keys')) + pass + var.get(u'module').put(u'exports', var.get(u'baseKeys')) +PyJs_anonymous_3527_._set_name(u'anonymous') +PyJs_Object_3528_ = Js({}) +@Js +def PyJs_anonymous_3529_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'propertyIsEnumerable', u'exports', u'baseKeysIn', u'require', u'iteratorToArray', u'module', u'Reflect', u'enumerate', u'objectProto']) + @Js + def PyJsHoisted_baseKeysIn_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object', u'result', u'key']) + var.put(u'object', (var.get(u'object') if (var.get(u'object')==var.get(u"null")) else var.get(u'Object')(var.get(u'object')))) + var.put(u'result', Js([])) + for PyJsTemp in var.get(u'object'): + var.put(u'key', PyJsTemp) + var.get(u'result').callprop(u'push', var.get(u'key')) + return var.get(u'result') + PyJsHoisted_baseKeysIn_.func_name = u'baseKeysIn' + var.put(u'baseKeysIn', PyJsHoisted_baseKeysIn_) + var.put(u'Reflect', var.get(u'require')(Js(u'./_Reflect'))) + var.put(u'iteratorToArray', var.get(u'require')(Js(u'./_iteratorToArray'))) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'enumerate', (var.get(u'Reflect').get(u'enumerate') if var.get(u'Reflect') else var.get(u'undefined'))) + var.put(u'propertyIsEnumerable', var.get(u'objectProto').get(u'propertyIsEnumerable')) + pass + PyJs_Object_3530_ = Js({u'valueOf':Js(1.0)}) + if (var.get(u'enumerate') and var.get(u'propertyIsEnumerable').callprop(u'call', PyJs_Object_3530_, Js(u'valueOf')).neg()): + @Js + def PyJs_anonymous_3531_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + return var.get(u'iteratorToArray')(var.get(u'enumerate')(var.get(u'object'))) + PyJs_anonymous_3531_._set_name(u'anonymous') + var.put(u'baseKeysIn', PyJs_anonymous_3531_) + var.get(u'module').put(u'exports', var.get(u'baseKeysIn')) +PyJs_anonymous_3529_._set_name(u'anonymous') +PyJs_Object_3532_ = Js({u'./_Reflect':Js(291.0),u'./_iteratorToArray':Js(408.0)}) +@Js +def PyJs_anonymous_3533_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseEach', u'exports', u'isArrayLike', u'require', u'module', u'baseMap']) + @Js + def PyJsHoisted_baseMap_(collection, iteratee, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'collection':collection, u'iteratee':iteratee}, var) + var.registers([u'index', u'result', u'collection', u'iteratee']) + var.put(u'index', (-Js(1.0))) + var.put(u'result', (var.get(u'Array')(var.get(u'collection').get(u'length')) if var.get(u'isArrayLike')(var.get(u'collection')) else Js([]))) + @Js + def PyJs_anonymous_3534_(value, key, collection, this, arguments, var=var): + var = Scope({u'collection':collection, u'this':this, u'key':key, u'value':value, u'arguments':arguments}, var) + var.registers([u'collection', u'key', u'value']) + var.get(u'result').put(var.put(u'index',Js(var.get(u'index').to_number())+Js(1)), var.get(u'iteratee')(var.get(u'value'), var.get(u'key'), var.get(u'collection'))) + PyJs_anonymous_3534_._set_name(u'anonymous') + var.get(u'baseEach')(var.get(u'collection'), PyJs_anonymous_3534_) + return var.get(u'result') + PyJsHoisted_baseMap_.func_name = u'baseMap' + var.put(u'baseMap', PyJsHoisted_baseMap_) + var.put(u'baseEach', var.get(u'require')(Js(u'./_baseEach'))) + var.put(u'isArrayLike', var.get(u'require')(Js(u'./isArrayLike'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseMap')) +PyJs_anonymous_3533_._set_name(u'anonymous') +PyJs_Object_3535_ = Js({u'./_baseEach':Js(316.0),u'./isArrayLike':Js(459.0)}) +@Js +def PyJs_anonymous_3536_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseMatches', u'exports', u'require', u'matchesStrictComparable', u'module', u'baseIsMatch', u'getMatchData']) + @Js + def PyJsHoisted_baseMatches_(source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'arguments':arguments}, var) + var.registers([u'source', u'matchData']) + var.put(u'matchData', var.get(u'getMatchData')(var.get(u'source'))) + if ((var.get(u'matchData').get(u'length')==Js(1.0)) and var.get(u'matchData').get(u'0').get(u'2')): + return var.get(u'matchesStrictComparable')(var.get(u'matchData').get(u'0').get(u'0'), var.get(u'matchData').get(u'0').get(u'1')) + @Js + def PyJs_anonymous_3537_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + return (PyJsStrictEq(var.get(u'object'),var.get(u'source')) or var.get(u'baseIsMatch')(var.get(u'object'), var.get(u'source'), var.get(u'matchData'))) + PyJs_anonymous_3537_._set_name(u'anonymous') + return PyJs_anonymous_3537_ + PyJsHoisted_baseMatches_.func_name = u'baseMatches' + var.put(u'baseMatches', PyJsHoisted_baseMatches_) + var.put(u'baseIsMatch', var.get(u'require')(Js(u'./_baseIsMatch'))) + var.put(u'getMatchData', var.get(u'require')(Js(u'./_getMatchData'))) + var.put(u'matchesStrictComparable', var.get(u'require')(Js(u'./_matchesStrictComparable'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseMatches')) +PyJs_anonymous_3536_._set_name(u'anonymous') +PyJs_Object_3538_ = Js({u'./_baseIsMatch':Js(329.0),u'./_getMatchData':Js(381.0),u'./_matchesStrictComparable':Js(420.0)}) +@Js +def PyJs_anonymous_3539_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'PARTIAL_COMPARE_FLAG', u'exports', u'UNORDERED_COMPARE_FLAG', u'toKey', u'get', u'hasIn', u'require', u'matchesStrictComparable', u'module', u'isKey', u'isStrictComparable', u'baseMatchesProperty', u'baseIsEqual']) + @Js + def PyJsHoisted_baseMatchesProperty_(path, srcValue, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'srcValue':srcValue, u'arguments':arguments}, var) + var.registers([u'path', u'srcValue']) + if (var.get(u'isKey')(var.get(u'path')) and var.get(u'isStrictComparable')(var.get(u'srcValue'))): + return var.get(u'matchesStrictComparable')(var.get(u'toKey')(var.get(u'path')), var.get(u'srcValue')) + @Js + def PyJs_anonymous_3540_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object', u'objValue']) + var.put(u'objValue', var.get(u'get')(var.get(u'object'), var.get(u'path'))) + return (var.get(u'hasIn')(var.get(u'object'), var.get(u'path')) if (PyJsStrictEq(var.get(u'objValue'),var.get(u'undefined')) and PyJsStrictEq(var.get(u'objValue'),var.get(u'srcValue'))) else var.get(u'baseIsEqual')(var.get(u'srcValue'), var.get(u'objValue'), var.get(u'undefined'), (var.get(u'UNORDERED_COMPARE_FLAG')|var.get(u'PARTIAL_COMPARE_FLAG')))) + PyJs_anonymous_3540_._set_name(u'anonymous') + return PyJs_anonymous_3540_ + PyJsHoisted_baseMatchesProperty_.func_name = u'baseMatchesProperty' + var.put(u'baseMatchesProperty', PyJsHoisted_baseMatchesProperty_) + var.put(u'baseIsEqual', var.get(u'require')(Js(u'./_baseIsEqual'))) + var.put(u'get', var.get(u'require')(Js(u'./get'))) + var.put(u'hasIn', var.get(u'require')(Js(u'./hasIn'))) + var.put(u'isKey', var.get(u'require')(Js(u'./_isKey'))) + var.put(u'isStrictComparable', var.get(u'require')(Js(u'./_isStrictComparable'))) + var.put(u'matchesStrictComparable', var.get(u'require')(Js(u'./_matchesStrictComparable'))) + var.put(u'toKey', var.get(u'require')(Js(u'./_toKey'))) + var.put(u'UNORDERED_COMPARE_FLAG', Js(1.0)) + var.put(u'PARTIAL_COMPARE_FLAG', Js(2.0)) + pass + var.get(u'module').put(u'exports', var.get(u'baseMatchesProperty')) +PyJs_anonymous_3539_._set_name(u'anonymous') +PyJs_Object_3541_ = Js({u'./_baseIsEqual':Js(327.0),u'./_isKey':Js(403.0),u'./_isStrictComparable':Js(407.0),u'./_matchesStrictComparable':Js(420.0),u'./_toKey':Js(433.0),u'./get':Js(452.0),u'./hasIn':Js(454.0)}) +@Js +def PyJs_anonymous_3542_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'exports', u'arrayEach', u'require', u'baseMergeDeep', u'Stack', u'baseMerge', u'module', u'isTypedArray', u'assignMergeValue', u'keysIn', u'isObject']) + @Js + def PyJsHoisted_baseMerge_(object, source, srcIndex, customizer, stack, this, arguments, var=var): + var = Scope({u'source':source, u'customizer':customizer, u'arguments':arguments, u'srcIndex':srcIndex, u'this':this, u'object':object, u'stack':stack}, var) + var.registers([u'object', u'source', u'srcIndex', u'props', u'customizer', u'stack']) + if PyJsStrictEq(var.get(u'object'),var.get(u'source')): + return var.get('undefined') + if (var.get(u'isArray')(var.get(u'source')) or var.get(u'isTypedArray')(var.get(u'source'))).neg(): + var.put(u'props', var.get(u'keysIn')(var.get(u'source'))) + @Js + def PyJs_anonymous_3543_(srcValue, key, this, arguments, var=var): + var = Scope({u'this':this, u'srcValue':srcValue, u'key':key, u'arguments':arguments}, var) + var.registers([u'newValue', u'key', u'srcValue']) + if var.get(u'props'): + var.put(u'key', var.get(u'srcValue')) + var.put(u'srcValue', var.get(u'source').get(var.get(u'key'))) + if var.get(u'isObject')(var.get(u'srcValue')): + (var.get(u'stack') or var.put(u'stack', var.get(u'Stack').create())) + var.get(u'baseMergeDeep')(var.get(u'object'), var.get(u'source'), var.get(u'key'), var.get(u'srcIndex'), var.get(u'baseMerge'), var.get(u'customizer'), var.get(u'stack')) + else: + var.put(u'newValue', (var.get(u'customizer')(var.get(u'object').get(var.get(u'key')), var.get(u'srcValue'), (var.get(u'key')+Js(u'')), var.get(u'object'), var.get(u'source'), var.get(u'stack')) if var.get(u'customizer') else var.get(u'undefined'))) + if PyJsStrictEq(var.get(u'newValue'),var.get(u'undefined')): + var.put(u'newValue', var.get(u'srcValue')) + var.get(u'assignMergeValue')(var.get(u'object'), var.get(u'key'), var.get(u'newValue')) + PyJs_anonymous_3543_._set_name(u'anonymous') + var.get(u'arrayEach')((var.get(u'props') or var.get(u'source')), PyJs_anonymous_3543_) + PyJsHoisted_baseMerge_.func_name = u'baseMerge' + var.put(u'baseMerge', PyJsHoisted_baseMerge_) + var.put(u'Stack', var.get(u'require')(Js(u'./_Stack'))) + var.put(u'arrayEach', var.get(u'require')(Js(u'./_arrayEach'))) + var.put(u'assignMergeValue', var.get(u'require')(Js(u'./_assignMergeValue'))) + var.put(u'baseMergeDeep', var.get(u'require')(Js(u'./_baseMergeDeep'))) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + var.put(u'isTypedArray', var.get(u'require')(Js(u'./isTypedArray'))) + var.put(u'keysIn', var.get(u'require')(Js(u'./keysIn'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseMerge')) +PyJs_anonymous_3542_._set_name(u'anonymous') +PyJs_Object_3544_ = Js({u'./_Stack':Js(294.0),u'./_arrayEach':Js(301.0),u'./_assignMergeValue':Js(309.0),u'./_baseMergeDeep':Js(338.0),u'./isArray':Js(458.0),u'./isObject':Js(467.0),u'./isTypedArray':Js(473.0),u'./keysIn':Js(475.0)}) +@Js +def PyJs_anonymous_3545_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'exports', u'isPlainObject', u'module', u'require', u'baseMergeDeep', u'copyArray', u'toPlainObject', u'isArrayLikeObject', u'isTypedArray', u'assignMergeValue', u'isFunction', u'baseClone', u'isObject', u'isArguments']) + @Js + def PyJsHoisted_baseMergeDeep_(object, source, key, srcIndex, mergeFunc, customizer, stack, this, arguments, var=var): + var = Scope({u'key':key, u'this':this, u'object':object, u'source':source, u'arguments':arguments, u'srcIndex':srcIndex, u'mergeFunc':mergeFunc, u'customizer':customizer, u'stack':stack}, var) + var.registers([u'isCommon', u'stacked', u'key', u'object', u'stack', u'source', u'srcValue', u'objValue', u'mergeFunc', u'customizer', u'srcIndex', u'newValue']) + var.put(u'objValue', var.get(u'object').get(var.get(u'key'))) + var.put(u'srcValue', var.get(u'source').get(var.get(u'key'))) + var.put(u'stacked', var.get(u'stack').callprop(u'get', var.get(u'srcValue'))) + if var.get(u'stacked'): + var.get(u'assignMergeValue')(var.get(u'object'), var.get(u'key'), var.get(u'stacked')) + return var.get('undefined') + var.put(u'newValue', (var.get(u'customizer')(var.get(u'objValue'), var.get(u'srcValue'), (var.get(u'key')+Js(u'')), var.get(u'object'), var.get(u'source'), var.get(u'stack')) if var.get(u'customizer') else var.get(u'undefined'))) + var.put(u'isCommon', PyJsStrictEq(var.get(u'newValue'),var.get(u'undefined'))) + if var.get(u'isCommon'): + var.put(u'newValue', var.get(u'srcValue')) + if (var.get(u'isArray')(var.get(u'srcValue')) or var.get(u'isTypedArray')(var.get(u'srcValue'))): + if var.get(u'isArray')(var.get(u'objValue')): + var.put(u'newValue', var.get(u'objValue')) + else: + if var.get(u'isArrayLikeObject')(var.get(u'objValue')): + var.put(u'newValue', var.get(u'copyArray')(var.get(u'objValue'))) + else: + var.put(u'isCommon', Js(False)) + var.put(u'newValue', var.get(u'baseClone')(var.get(u'srcValue'), var.get(u'true'))) + else: + if (var.get(u'isPlainObject')(var.get(u'srcValue')) or var.get(u'isArguments')(var.get(u'srcValue'))): + if var.get(u'isArguments')(var.get(u'objValue')): + var.put(u'newValue', var.get(u'toPlainObject')(var.get(u'objValue'))) + else: + if (var.get(u'isObject')(var.get(u'objValue')).neg() or (var.get(u'srcIndex') and var.get(u'isFunction')(var.get(u'objValue')))): + var.put(u'isCommon', Js(False)) + var.put(u'newValue', var.get(u'baseClone')(var.get(u'srcValue'), var.get(u'true'))) + else: + var.put(u'newValue', var.get(u'objValue')) + else: + var.put(u'isCommon', Js(False)) + var.get(u'stack').callprop(u'set', var.get(u'srcValue'), var.get(u'newValue')) + if var.get(u'isCommon'): + var.get(u'mergeFunc')(var.get(u'newValue'), var.get(u'srcValue'), var.get(u'srcIndex'), var.get(u'customizer'), var.get(u'stack')) + var.get(u'stack').callprop(u'delete', var.get(u'srcValue')) + var.get(u'assignMergeValue')(var.get(u'object'), var.get(u'key'), var.get(u'newValue')) + PyJsHoisted_baseMergeDeep_.func_name = u'baseMergeDeep' + var.put(u'baseMergeDeep', PyJsHoisted_baseMergeDeep_) + var.put(u'assignMergeValue', var.get(u'require')(Js(u'./_assignMergeValue'))) + var.put(u'baseClone', var.get(u'require')(Js(u'./_baseClone'))) + var.put(u'copyArray', var.get(u'require')(Js(u'./_copyArray'))) + var.put(u'isArguments', var.get(u'require')(Js(u'./isArguments'))) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + var.put(u'isArrayLikeObject', var.get(u'require')(Js(u'./isArrayLikeObject'))) + var.put(u'isFunction', var.get(u'require')(Js(u'./isFunction'))) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + var.put(u'isPlainObject', var.get(u'require')(Js(u'./isPlainObject'))) + var.put(u'isTypedArray', var.get(u'require')(Js(u'./isTypedArray'))) + var.put(u'toPlainObject', var.get(u'require')(Js(u'./toPlainObject'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseMergeDeep')) +PyJs_anonymous_3545_._set_name(u'anonymous') +PyJs_Object_3546_ = Js({u'./_assignMergeValue':Js(309.0),u'./_baseClone':Js(314.0),u'./_copyArray':Js(366.0),u'./isArguments':Js(457.0),u'./isArray':Js(458.0),u'./isArrayLikeObject':Js(460.0),u'./isFunction':Js(463.0),u'./isObject':Js(467.0),u'./isPlainObject':Js(469.0),u'./isTypedArray':Js(473.0),u'./toPlainObject':Js(492.0)}) +@Js +def PyJs_anonymous_3547_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'arrayMap', u'baseIteratee', u'baseOrderBy', u'module', u'compareMultiple', u'baseUnary', u'baseSortBy', u'baseMap', u'identity']) + @Js + def PyJsHoisted_baseOrderBy_(collection, iteratees, orders, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'orders':orders, u'collection':collection, u'iteratees':iteratees}, var) + var.registers([u'orders', u'index', u'result', u'collection', u'iteratees']) + var.put(u'index', (-Js(1.0))) + var.put(u'iteratees', var.get(u'arrayMap')((var.get(u'iteratees') if var.get(u'iteratees').get(u'length') else Js([var.get(u'identity')])), var.get(u'baseUnary')(var.get(u'baseIteratee')))) + @Js + def PyJs_anonymous_3548_(value, key, collection, this, arguments, var=var): + var = Scope({u'collection':collection, u'this':this, u'key':key, u'value':value, u'arguments':arguments}, var) + var.registers([u'collection', u'key', u'value', u'criteria']) + @Js + def PyJs_anonymous_3549_(iteratee, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'iteratee':iteratee}, var) + var.registers([u'iteratee']) + return var.get(u'iteratee')(var.get(u'value')) + PyJs_anonymous_3549_._set_name(u'anonymous') + var.put(u'criteria', var.get(u'arrayMap')(var.get(u'iteratees'), PyJs_anonymous_3549_)) + PyJs_Object_3550_ = Js({u'criteria':var.get(u'criteria'),u'index':var.put(u'index',Js(var.get(u'index').to_number())+Js(1)),u'value':var.get(u'value')}) + return PyJs_Object_3550_ + PyJs_anonymous_3548_._set_name(u'anonymous') + var.put(u'result', var.get(u'baseMap')(var.get(u'collection'), PyJs_anonymous_3548_)) + @Js + def PyJs_anonymous_3551_(object, other, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'other':other, u'arguments':arguments}, var) + var.registers([u'object', u'other']) + return var.get(u'compareMultiple')(var.get(u'object'), var.get(u'other'), var.get(u'orders')) + PyJs_anonymous_3551_._set_name(u'anonymous') + return var.get(u'baseSortBy')(var.get(u'result'), PyJs_anonymous_3551_) + PyJsHoisted_baseOrderBy_.func_name = u'baseOrderBy' + var.put(u'baseOrderBy', PyJsHoisted_baseOrderBy_) + var.put(u'arrayMap', var.get(u'require')(Js(u'./_arrayMap'))) + var.put(u'baseIteratee', var.get(u'require')(Js(u'./_baseIteratee'))) + var.put(u'baseMap', var.get(u'require')(Js(u'./_baseMap'))) + var.put(u'baseSortBy', var.get(u'require')(Js(u'./_baseSortBy'))) + var.put(u'baseUnary', var.get(u'require')(Js(u'./_baseUnary'))) + var.put(u'compareMultiple', var.get(u'require')(Js(u'./_compareMultiple'))) + var.put(u'identity', var.get(u'require')(Js(u'./identity'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseOrderBy')) +PyJs_anonymous_3547_._set_name(u'anonymous') +PyJs_Object_3552_ = Js({u'./_arrayMap':Js(304.0),u'./_baseIteratee':Js(331.0),u'./_baseMap':Js(334.0),u'./_baseSortBy':Js(345.0),u'./_baseUnary':Js(348.0),u'./_compareMultiple':Js(365.0),u'./identity':Js(455.0)}) +@Js +def PyJs_anonymous_3553_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'baseProperty', u'exports', u'module']) + @Js + def PyJsHoisted_baseProperty_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + @Js + def PyJs_anonymous_3554_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + return (var.get(u'undefined') if (var.get(u'object')==var.get(u"null")) else var.get(u'object').get(var.get(u'key'))) + PyJs_anonymous_3554_._set_name(u'anonymous') + return PyJs_anonymous_3554_ + PyJsHoisted_baseProperty_.func_name = u'baseProperty' + var.put(u'baseProperty', PyJsHoisted_baseProperty_) + pass + var.get(u'module').put(u'exports', var.get(u'baseProperty')) +PyJs_anonymous_3553_._set_name(u'anonymous') +PyJs_Object_3555_ = Js({}) +@Js +def PyJs_anonymous_3556_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'baseGet', u'require', u'basePropertyDeep', u'module']) + @Js + def PyJsHoisted_basePropertyDeep_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + @Js + def PyJs_anonymous_3557_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + return var.get(u'baseGet')(var.get(u'object'), var.get(u'path')) + PyJs_anonymous_3557_._set_name(u'anonymous') + return PyJs_anonymous_3557_ + PyJsHoisted_basePropertyDeep_.func_name = u'basePropertyDeep' + var.put(u'basePropertyDeep', PyJsHoisted_basePropertyDeep_) + var.put(u'baseGet', var.get(u'require')(Js(u'./_baseGet'))) + pass + var.get(u'module').put(u'exports', var.get(u'basePropertyDeep')) +PyJs_anonymous_3556_._set_name(u'anonymous') +PyJs_Object_3558_ = Js({u'./_baseGet':Js(321.0)}) +@Js +def PyJs_anonymous_3559_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseIndexOf', u'exports', u'basePullAll', u'baseIndexOfWith', u'arrayProto', u'require', u'arrayMap', u'module', u'copyArray', u'splice', u'baseUnary']) + @Js + def PyJsHoisted_basePullAll_(array, values, iteratee, comparator, this, arguments, var=var): + var = Scope({u'values':values, u'arguments':arguments, u'comparator':comparator, u'iteratee':iteratee, u'this':this, u'array':array}, var) + var.registers([u'index', u'computed', u'comparator', u'indexOf', u'fromIndex', u'value', u'length', u'values', u'iteratee', u'seen', u'array']) + var.put(u'indexOf', (var.get(u'baseIndexOfWith') if var.get(u'comparator') else var.get(u'baseIndexOf'))) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'values').get(u'length')) + var.put(u'seen', var.get(u'array')) + if PyJsStrictEq(var.get(u'array'),var.get(u'values')): + var.put(u'values', var.get(u'copyArray')(var.get(u'values'))) + if var.get(u'iteratee'): + var.put(u'seen', var.get(u'arrayMap')(var.get(u'array'), var.get(u'baseUnary')(var.get(u'iteratee')))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'fromIndex', Js(0.0)) + var.put(u'value', var.get(u'values').get(var.get(u'index'))) + var.put(u'computed', (var.get(u'iteratee')(var.get(u'value')) if var.get(u'iteratee') else var.get(u'value'))) + while (var.put(u'fromIndex', var.get(u'indexOf')(var.get(u'seen'), var.get(u'computed'), var.get(u'fromIndex'), var.get(u'comparator')))>(-Js(1.0))): + if PyJsStrictNeq(var.get(u'seen'),var.get(u'array')): + var.get(u'splice').callprop(u'call', var.get(u'seen'), var.get(u'fromIndex'), Js(1.0)) + var.get(u'splice').callprop(u'call', var.get(u'array'), var.get(u'fromIndex'), Js(1.0)) + return var.get(u'array') + PyJsHoisted_basePullAll_.func_name = u'basePullAll' + var.put(u'basePullAll', PyJsHoisted_basePullAll_) + var.put(u'arrayMap', var.get(u'require')(Js(u'./_arrayMap'))) + var.put(u'baseIndexOf', var.get(u'require')(Js(u'./_baseIndexOf'))) + var.put(u'baseIndexOfWith', var.get(u'require')(Js(u'./_baseIndexOfWith'))) + var.put(u'baseUnary', var.get(u'require')(Js(u'./_baseUnary'))) + var.put(u'copyArray', var.get(u'require')(Js(u'./_copyArray'))) + var.put(u'arrayProto', var.get(u'Array').get(u'prototype')) + var.put(u'splice', var.get(u'arrayProto').get(u'splice')) + pass + var.get(u'module').put(u'exports', var.get(u'basePullAll')) +PyJs_anonymous_3559_._set_name(u'anonymous') +PyJs_Object_3560_ = Js({u'./_arrayMap':Js(304.0),u'./_baseIndexOf':Js(325.0),u'./_baseIndexOfWith':Js(326.0),u'./_baseUnary':Js(348.0),u'./_copyArray':Js(366.0)}) +@Js +def PyJs_anonymous_3561_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'MAX_SAFE_INTEGER', u'exports', u'baseRepeat', u'require', u'module', u'nativeFloor']) + @Js + def PyJsHoisted_baseRepeat_(string, n, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'string':string, u'n':n}, var) + var.registers([u'n', u'result', u'string']) + var.put(u'result', Js(u'')) + if ((var.get(u'string').neg() or (var.get(u'n')<Js(1.0))) or (var.get(u'n')>var.get(u'MAX_SAFE_INTEGER'))): + return var.get(u'result') + while 1: + if (var.get(u'n')%Js(2.0)): + var.put(u'result', var.get(u'string'), u'+') + var.put(u'n', var.get(u'nativeFloor')((var.get(u'n')/Js(2.0)))) + if var.get(u'n'): + var.put(u'string', var.get(u'string'), u'+') + if not var.get(u'n'): + break + return var.get(u'result') + PyJsHoisted_baseRepeat_.func_name = u'baseRepeat' + var.put(u'baseRepeat', PyJsHoisted_baseRepeat_) + var.put(u'MAX_SAFE_INTEGER', Js(9007199254740991.0)) + var.put(u'nativeFloor', var.get(u'Math').get(u'floor')) + pass + var.get(u'module').put(u'exports', var.get(u'baseRepeat')) +PyJs_anonymous_3561_._set_name(u'anonymous') +PyJs_Object_3562_ = Js({}) +@Js +def PyJs_anonymous_3563_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseSlice', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_baseSlice_(array, start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'array':array, u'end':end, u'arguments':arguments}, var) + var.registers([u'index', u'end', u'start', u'length', u'result', u'array']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'array').get(u'length')) + if (var.get(u'start')<Js(0.0)): + var.put(u'start', (Js(0.0) if ((-var.get(u'start'))>var.get(u'length')) else (var.get(u'length')+var.get(u'start')))) + var.put(u'end', (var.get(u'length') if (var.get(u'end')>var.get(u'length')) else var.get(u'end'))) + if (var.get(u'end')<Js(0.0)): + var.put(u'end', var.get(u'length'), u'+') + var.put(u'length', (Js(0.0) if (var.get(u'start')>var.get(u'end')) else PyJsBshift((var.get(u'end')-var.get(u'start')),Js(0.0)))) + var.put(u'start', Js(0.0), u'>>>') + var.put(u'result', var.get(u'Array')(var.get(u'length'))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.get(u'result').put(var.get(u'index'), var.get(u'array').get((var.get(u'index')+var.get(u'start')))) + return var.get(u'result') + PyJsHoisted_baseSlice_.func_name = u'baseSlice' + var.put(u'baseSlice', PyJsHoisted_baseSlice_) + pass + var.get(u'module').put(u'exports', var.get(u'baseSlice')) +PyJs_anonymous_3563_._set_name(u'anonymous') +PyJs_Object_3564_ = Js({}) +@Js +def PyJs_anonymous_3565_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseSortBy', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_baseSortBy_(array, comparer, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'comparer':comparer, u'arguments':arguments}, var) + var.registers([u'length', u'array', u'comparer']) + var.put(u'length', var.get(u'array').get(u'length')) + var.get(u'array').callprop(u'sort', var.get(u'comparer')) + while (var.put(u'length',Js(var.get(u'length').to_number())-Js(1))+Js(1)): + var.get(u'array').put(var.get(u'length'), var.get(u'array').get(var.get(u'length')).get(u'value')) + return var.get(u'array') + PyJsHoisted_baseSortBy_.func_name = u'baseSortBy' + var.put(u'baseSortBy', PyJsHoisted_baseSortBy_) + pass + var.get(u'module').put(u'exports', var.get(u'baseSortBy')) +PyJs_anonymous_3565_._set_name(u'anonymous') +PyJs_Object_3566_ = Js({}) +@Js +def PyJs_anonymous_3567_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'baseTimes']) + @Js + def PyJsHoisted_baseTimes_(n, iteratee, this, arguments, var=var): + var = Scope({u'this':this, u'iteratee':iteratee, u'arguments':arguments, u'n':n}, var) + var.registers([u'index', u'iteratee', u'result', u'n']) + var.put(u'index', (-Js(1.0))) + var.put(u'result', var.get(u'Array')(var.get(u'n'))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'n')): + var.get(u'result').put(var.get(u'index'), var.get(u'iteratee')(var.get(u'index'))) + return var.get(u'result') + PyJsHoisted_baseTimes_.func_name = u'baseTimes' + var.put(u'baseTimes', PyJsHoisted_baseTimes_) + pass + var.get(u'module').put(u'exports', var.get(u'baseTimes')) +PyJs_anonymous_3567_._set_name(u'anonymous') +PyJs_Object_3568_ = Js({}) +@Js +def PyJs_anonymous_3569_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'INFINITY', u'Symbol', u'baseToString', u'module', u'symbolProto', u'isSymbol', u'require', u'symbolToString']) + @Js + def PyJsHoisted_baseToString_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'result', u'value']) + if (var.get(u'value',throw=False).typeof()==Js(u'string')): + return var.get(u'value') + if var.get(u'isSymbol')(var.get(u'value')): + return (var.get(u'symbolToString').callprop(u'call', var.get(u'value')) if var.get(u'symbolToString') else Js(u'')) + var.put(u'result', (var.get(u'value')+Js(u''))) + return (Js(u'-0') if ((var.get(u'result')==Js(u'0')) and ((Js(1.0)/var.get(u'value'))==(-var.get(u'INFINITY')))) else var.get(u'result')) + PyJsHoisted_baseToString_.func_name = u'baseToString' + var.put(u'baseToString', PyJsHoisted_baseToString_) + var.put(u'Symbol', var.get(u'require')(Js(u'./_Symbol'))) + var.put(u'isSymbol', var.get(u'require')(Js(u'./isSymbol'))) + var.put(u'INFINITY', (Js(1.0)/Js(0.0))) + var.put(u'symbolProto', (var.get(u'Symbol').get(u'prototype') if var.get(u'Symbol') else var.get(u'undefined'))) + var.put(u'symbolToString', (var.get(u'symbolProto').get(u'toString') if var.get(u'symbolProto') else var.get(u'undefined'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseToString')) +PyJs_anonymous_3569_._set_name(u'anonymous') +PyJs_Object_3570_ = Js({u'./_Symbol':Js(295.0),u'./isSymbol':Js(472.0)}) +@Js +def PyJs_anonymous_3571_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseUnary', u'require', u'exports', u'module']) + @Js + def PyJsHoisted_baseUnary_(func, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'func':func}, var) + var.registers([u'func']) + @Js + def PyJs_anonymous_3572_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return var.get(u'func')(var.get(u'value')) + PyJs_anonymous_3572_._set_name(u'anonymous') + return PyJs_anonymous_3572_ + PyJsHoisted_baseUnary_.func_name = u'baseUnary' + var.put(u'baseUnary', PyJsHoisted_baseUnary_) + pass + var.get(u'module').put(u'exports', var.get(u'baseUnary')) +PyJs_anonymous_3571_._set_name(u'anonymous') +PyJs_Object_3573_ = Js({}) +@Js +def PyJs_anonymous_3574_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseUniq', u'exports', u'arrayIncludesWith', u'SetCache', u'require', u'setToArray', u'cacheHas', u'LARGE_ARRAY_SIZE', u'arrayIncludes', u'module', u'createSet']) + @Js + def PyJsHoisted_baseUniq_(array, iteratee, comparator, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'arguments':arguments, u'comparator':comparator, u'iteratee':iteratee}, var) + var.registers([u'index', u'isCommon', u'computed', u'comparator', u'value', u'includes', u'length', u'set', u'result', u'seenIndex', u'iteratee', u'seen', u'array']) + var.put(u'index', (-Js(1.0))) + var.put(u'includes', var.get(u'arrayIncludes')) + var.put(u'length', var.get(u'array').get(u'length')) + var.put(u'isCommon', var.get(u'true')) + var.put(u'result', Js([])) + var.put(u'seen', var.get(u'result')) + if var.get(u'comparator'): + var.put(u'isCommon', Js(False)) + var.put(u'includes', var.get(u'arrayIncludesWith')) + else: + if (var.get(u'length')>=var.get(u'LARGE_ARRAY_SIZE')): + var.put(u'set', (var.get(u"null") if var.get(u'iteratee') else var.get(u'createSet')(var.get(u'array')))) + if var.get(u'set'): + return var.get(u'setToArray')(var.get(u'set')) + var.put(u'isCommon', Js(False)) + var.put(u'includes', var.get(u'cacheHas')) + var.put(u'seen', var.get(u'SetCache').create()) + else: + var.put(u'seen', (Js([]) if var.get(u'iteratee') else var.get(u'result'))) + class JS_CONTINUE_LABEL_6f75746572(Exception): pass + class JS_BREAK_LABEL_6f75746572(Exception): pass + try: + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + try: + var.put(u'value', var.get(u'array').get(var.get(u'index'))) + var.put(u'computed', (var.get(u'iteratee')(var.get(u'value')) if var.get(u'iteratee') else var.get(u'value'))) + var.put(u'value', (var.get(u'value') if (var.get(u'comparator') or PyJsStrictNeq(var.get(u'value'),Js(0.0))) else Js(0.0))) + if (var.get(u'isCommon') and PyJsStrictEq(var.get(u'computed'),var.get(u'computed'))): + var.put(u'seenIndex', var.get(u'seen').get(u'length')) + while (var.put(u'seenIndex',Js(var.get(u'seenIndex').to_number())-Js(1))+Js(1)): + if PyJsStrictEq(var.get(u'seen').get(var.get(u'seenIndex')),var.get(u'computed')): + raise JS_CONTINUE_LABEL_6f75746572("Continued") + if var.get(u'iteratee'): + var.get(u'seen').callprop(u'push', var.get(u'computed')) + var.get(u'result').callprop(u'push', var.get(u'value')) + else: + if var.get(u'includes')(var.get(u'seen'), var.get(u'computed'), var.get(u'comparator')).neg(): + if PyJsStrictNeq(var.get(u'seen'),var.get(u'result')): + var.get(u'seen').callprop(u'push', var.get(u'computed')) + var.get(u'result').callprop(u'push', var.get(u'value')) + except JS_CONTINUE_LABEL_6f75746572: + pass + except JS_BREAK_LABEL_6f75746572: + pass + return var.get(u'result') + PyJsHoisted_baseUniq_.func_name = u'baseUniq' + var.put(u'baseUniq', PyJsHoisted_baseUniq_) + var.put(u'SetCache', var.get(u'require')(Js(u'./_SetCache'))) + var.put(u'arrayIncludes', var.get(u'require')(Js(u'./_arrayIncludes'))) + var.put(u'arrayIncludesWith', var.get(u'require')(Js(u'./_arrayIncludesWith'))) + var.put(u'cacheHas', var.get(u'require')(Js(u'./_cacheHas'))) + var.put(u'createSet', var.get(u'require')(Js(u'./_createSet'))) + var.put(u'setToArray', var.get(u'require')(Js(u'./_setToArray'))) + var.put(u'LARGE_ARRAY_SIZE', Js(200.0)) + pass + var.get(u'module').put(u'exports', var.get(u'baseUniq')) +PyJs_anonymous_3574_._set_name(u'anonymous') +PyJs_Object_3575_ = Js({u'./_SetCache':Js(293.0),u'./_arrayIncludes':Js(302.0),u'./_arrayIncludesWith':Js(303.0),u'./_cacheHas':Js(351.0),u'./_createSet':Js(374.0),u'./_setToArray':Js(425.0)}) +@Js +def PyJs_anonymous_3576_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'arrayMap', u'exports', u'baseValues', u'module']) + @Js + def PyJsHoisted_baseValues_(object, props, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments, u'props':props}, var) + var.registers([u'object', u'props']) + @Js + def PyJs_anonymous_3577_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u'object').get(var.get(u'key')) + PyJs_anonymous_3577_._set_name(u'anonymous') + return var.get(u'arrayMap')(var.get(u'props'), PyJs_anonymous_3577_) + PyJsHoisted_baseValues_.func_name = u'baseValues' + var.put(u'baseValues', PyJsHoisted_baseValues_) + var.put(u'arrayMap', var.get(u'require')(Js(u'./_arrayMap'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseValues')) +PyJs_anonymous_3576_._set_name(u'anonymous') +PyJs_Object_3578_ = Js({u'./_arrayMap':Js(304.0)}) +@Js +def PyJs_anonymous_3579_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'cacheHas']) + @Js + def PyJsHoisted_cacheHas_(cache, key, this, arguments, var=var): + var = Scope({u'this':this, u'cache':cache, u'arguments':arguments, u'key':key}, var) + var.registers([u'cache', u'key']) + return var.get(u'cache').callprop(u'has', var.get(u'key')) + PyJsHoisted_cacheHas_.func_name = u'cacheHas' + var.put(u'cacheHas', PyJsHoisted_cacheHas_) + pass + var.get(u'module').put(u'exports', var.get(u'cacheHas')) +PyJs_anonymous_3579_._set_name(u'anonymous') +PyJs_Object_3580_ = Js({}) +@Js +def PyJs_anonymous_3581_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'exports', u'stringToPath', u'require', u'module', u'castPath']) + @Js + def PyJsHoisted_castPath_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'value') if var.get(u'isArray')(var.get(u'value')) else var.get(u'stringToPath')(var.get(u'value'))) + PyJsHoisted_castPath_.func_name = u'castPath' + var.put(u'castPath', PyJsHoisted_castPath_) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + var.put(u'stringToPath', var.get(u'require')(Js(u'./_stringToPath'))) + pass + var.get(u'module').put(u'exports', var.get(u'castPath')) +PyJs_anonymous_3581_._set_name(u'anonymous') +PyJs_Object_3582_ = Js({u'./_stringToPath':Js(432.0),u'./isArray':Js(458.0)}) +@Js +def PyJs_anonymous_3583_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'baseSlice', u'castSlice', u'require', u'module']) + @Js + def PyJsHoisted_castSlice_(array, start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'array':array, u'end':end, u'arguments':arguments}, var) + var.registers([u'start', u'length', u'end', u'array']) + var.put(u'length', var.get(u'array').get(u'length')) + var.put(u'end', (var.get(u'length') if PyJsStrictEq(var.get(u'end'),var.get(u'undefined')) else var.get(u'end'))) + return (var.get(u'array') if (var.get(u'start').neg() and (var.get(u'end')>=var.get(u'length'))) else var.get(u'baseSlice')(var.get(u'array'), var.get(u'start'), var.get(u'end'))) + PyJsHoisted_castSlice_.func_name = u'castSlice' + var.put(u'castSlice', PyJsHoisted_castSlice_) + var.put(u'baseSlice', var.get(u'require')(Js(u'./_baseSlice'))) + pass + var.get(u'module').put(u'exports', var.get(u'castSlice')) +PyJs_anonymous_3583_._set_name(u'anonymous') +PyJs_Object_3584_ = Js({u'./_baseSlice':Js(344.0)}) +@Js +def PyJs_anonymous_3585_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseIndexOf', u'require', u'exports', u'module', u'charsEndIndex']) + @Js + def PyJsHoisted_charsEndIndex_(strSymbols, chrSymbols, this, arguments, var=var): + var = Scope({u'this':this, u'chrSymbols':chrSymbols, u'arguments':arguments, u'strSymbols':strSymbols}, var) + var.registers([u'index', u'chrSymbols', u'strSymbols']) + var.put(u'index', var.get(u'strSymbols').get(u'length')) + while ((var.put(u'index',Js(var.get(u'index').to_number())-Js(1))+Js(1)) and (var.get(u'baseIndexOf')(var.get(u'chrSymbols'), var.get(u'strSymbols').get(var.get(u'index')), Js(0.0))>(-Js(1.0)))): + pass + return var.get(u'index') + PyJsHoisted_charsEndIndex_.func_name = u'charsEndIndex' + var.put(u'charsEndIndex', PyJsHoisted_charsEndIndex_) + var.put(u'baseIndexOf', var.get(u'require')(Js(u'./_baseIndexOf'))) + pass + var.get(u'module').put(u'exports', var.get(u'charsEndIndex')) +PyJs_anonymous_3585_._set_name(u'anonymous') +PyJs_Object_3586_ = Js({u'./_baseIndexOf':Js(325.0)}) +@Js +def PyJs_anonymous_3587_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'checkGlobal']) + @Js + def PyJsHoisted_checkGlobal_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'value') if (var.get(u'value') and PyJsStrictEq(var.get(u'value').get(u'Object'),var.get(u'Object'))) else var.get(u"null")) + PyJsHoisted_checkGlobal_.func_name = u'checkGlobal' + var.put(u'checkGlobal', PyJsHoisted_checkGlobal_) + pass + var.get(u'module').put(u'exports', var.get(u'checkGlobal')) +PyJs_anonymous_3587_._set_name(u'anonymous') +PyJs_Object_3588_ = Js({}) +@Js +def PyJs_anonymous_3589_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'cloneArrayBuffer', u'require', u'exports', u'Uint8Array', u'module']) + @Js + def PyJsHoisted_cloneArrayBuffer_(arrayBuffer, this, arguments, var=var): + var = Scope({u'this':this, u'arrayBuffer':arrayBuffer, u'arguments':arguments}, var) + var.registers([u'arrayBuffer', u'result']) + var.put(u'result', var.get(u'arrayBuffer').get(u'constructor').create(var.get(u'arrayBuffer').get(u'byteLength'))) + var.get(u'Uint8Array').create(var.get(u'result')).callprop(u'set', var.get(u'Uint8Array').create(var.get(u'arrayBuffer'))) + return var.get(u'result') + PyJsHoisted_cloneArrayBuffer_.func_name = u'cloneArrayBuffer' + var.put(u'cloneArrayBuffer', PyJsHoisted_cloneArrayBuffer_) + var.put(u'Uint8Array', var.get(u'require')(Js(u'./_Uint8Array'))) + pass + var.get(u'module').put(u'exports', var.get(u'cloneArrayBuffer')) +PyJs_anonymous_3589_._set_name(u'anonymous') +PyJs_Object_3590_ = Js({u'./_Uint8Array':Js(296.0)}) +@Js +def PyJs_anonymous_3591_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'cloneBuffer', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_cloneBuffer_(buffer, isDeep, this, arguments, var=var): + var = Scope({u'buffer':buffer, u'this':this, u'isDeep':isDeep, u'arguments':arguments}, var) + var.registers([u'buffer', u'isDeep', u'result']) + if var.get(u'isDeep'): + return var.get(u'buffer').callprop(u'slice') + var.put(u'result', var.get(u'buffer').get(u'constructor').create(var.get(u'buffer').get(u'length'))) + var.get(u'buffer').callprop(u'copy', var.get(u'result')) + return var.get(u'result') + PyJsHoisted_cloneBuffer_.func_name = u'cloneBuffer' + var.put(u'cloneBuffer', PyJsHoisted_cloneBuffer_) + pass + var.get(u'module').put(u'exports', var.get(u'cloneBuffer')) +PyJs_anonymous_3591_._set_name(u'anonymous') +PyJs_Object_3592_ = Js({}) +@Js +def PyJs_anonymous_3593_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'cloneArrayBuffer', u'require', u'exports', u'cloneDataView', u'module']) + @Js + def PyJsHoisted_cloneDataView_(dataView, isDeep, this, arguments, var=var): + var = Scope({u'this':this, u'dataView':dataView, u'isDeep':isDeep, u'arguments':arguments}, var) + var.registers([u'buffer', u'dataView', u'isDeep']) + var.put(u'buffer', (var.get(u'cloneArrayBuffer')(var.get(u'dataView').get(u'buffer')) if var.get(u'isDeep') else var.get(u'dataView').get(u'buffer'))) + return var.get(u'dataView').get(u'constructor').create(var.get(u'buffer'), var.get(u'dataView').get(u'byteOffset'), var.get(u'dataView').get(u'byteLength')) + PyJsHoisted_cloneDataView_.func_name = u'cloneDataView' + var.put(u'cloneDataView', PyJsHoisted_cloneDataView_) + var.put(u'cloneArrayBuffer', var.get(u'require')(Js(u'./_cloneArrayBuffer'))) + pass + var.get(u'module').put(u'exports', var.get(u'cloneDataView')) +PyJs_anonymous_3593_._set_name(u'anonymous') +PyJs_Object_3594_ = Js({u'./_cloneArrayBuffer':Js(356.0)}) +@Js +def PyJs_anonymous_3595_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'addMapEntry', u'require', u'module', u'arrayReduce', u'mapToArray', u'cloneMap']) + @Js + def PyJsHoisted_cloneMap_(map, isDeep, cloneFunc, this, arguments, var=var): + var = Scope({u'this':this, u'map':map, u'isDeep':isDeep, u'arguments':arguments, u'cloneFunc':cloneFunc}, var) + var.registers([u'map', u'array', u'isDeep', u'cloneFunc']) + var.put(u'array', (var.get(u'cloneFunc')(var.get(u'mapToArray')(var.get(u'map')), var.get(u'true')) if var.get(u'isDeep') else var.get(u'mapToArray')(var.get(u'map')))) + return var.get(u'arrayReduce')(var.get(u'array'), var.get(u'addMapEntry'), var.get(u'map').get(u'constructor').create()) + PyJsHoisted_cloneMap_.func_name = u'cloneMap' + var.put(u'cloneMap', PyJsHoisted_cloneMap_) + var.put(u'addMapEntry', var.get(u'require')(Js(u'./_addMapEntry'))) + var.put(u'arrayReduce', var.get(u'require')(Js(u'./_arrayReduce'))) + var.put(u'mapToArray', var.get(u'require')(Js(u'./_mapToArray'))) + pass + var.get(u'module').put(u'exports', var.get(u'cloneMap')) +PyJs_anonymous_3595_._set_name(u'anonymous') +PyJs_Object_3596_ = Js({u'./_addMapEntry':Js(298.0),u'./_arrayReduce':Js(306.0),u'./_mapToArray':Js(419.0)}) +@Js +def PyJs_anonymous_3597_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'cloneRegExp', u'exports', u'module', u'reFlags']) + @Js + def PyJsHoisted_cloneRegExp_(regexp, this, arguments, var=var): + var = Scope({u'this':this, u'regexp':regexp, u'arguments':arguments}, var) + var.registers([u'regexp', u'result']) + var.put(u'result', var.get(u'regexp').get(u'constructor').create(var.get(u'regexp').get(u'source'), var.get(u'reFlags').callprop(u'exec', var.get(u'regexp')))) + var.get(u'result').put(u'lastIndex', var.get(u'regexp').get(u'lastIndex')) + return var.get(u'result') + PyJsHoisted_cloneRegExp_.func_name = u'cloneRegExp' + var.put(u'cloneRegExp', PyJsHoisted_cloneRegExp_) + var.put(u'reFlags', JsRegExp(u'/\\w*$/')) + pass + var.get(u'module').put(u'exports', var.get(u'cloneRegExp')) +PyJs_anonymous_3597_._set_name(u'anonymous') +PyJs_Object_3598_ = Js({}) +@Js +def PyJs_anonymous_3599_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'cloneSet', u'exports', u'require', u'setToArray', u'addSetEntry', u'module', u'arrayReduce']) + @Js + def PyJsHoisted_cloneSet_(set, isDeep, cloneFunc, this, arguments, var=var): + var = Scope({u'this':this, u'cloneFunc':cloneFunc, u'set':set, u'isDeep':isDeep, u'arguments':arguments}, var) + var.registers([u'cloneFunc', u'array', u'set', u'isDeep']) + var.put(u'array', (var.get(u'cloneFunc')(var.get(u'setToArray')(var.get(u'set')), var.get(u'true')) if var.get(u'isDeep') else var.get(u'setToArray')(var.get(u'set')))) + return var.get(u'arrayReduce')(var.get(u'array'), var.get(u'addSetEntry'), var.get(u'set').get(u'constructor').create()) + PyJsHoisted_cloneSet_.func_name = u'cloneSet' + var.put(u'cloneSet', PyJsHoisted_cloneSet_) + var.put(u'addSetEntry', var.get(u'require')(Js(u'./_addSetEntry'))) + var.put(u'arrayReduce', var.get(u'require')(Js(u'./_arrayReduce'))) + var.put(u'setToArray', var.get(u'require')(Js(u'./_setToArray'))) + pass + var.get(u'module').put(u'exports', var.get(u'cloneSet')) +PyJs_anonymous_3599_._set_name(u'anonymous') +PyJs_Object_3600_ = Js({u'./_addSetEntry':Js(299.0),u'./_arrayReduce':Js(306.0),u'./_setToArray':Js(425.0)}) +@Js +def PyJs_anonymous_3601_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'cloneSymbol', u'Symbol', u'symbolValueOf', u'module', u'symbolProto', u'require']) + @Js + def PyJsHoisted_cloneSymbol_(symbol, this, arguments, var=var): + var = Scope({u'this':this, u'symbol':symbol, u'arguments':arguments}, var) + var.registers([u'symbol']) + PyJs_Object_3602_ = Js({}) + return (var.get(u'Object')(var.get(u'symbolValueOf').callprop(u'call', var.get(u'symbol'))) if var.get(u'symbolValueOf') else PyJs_Object_3602_) + PyJsHoisted_cloneSymbol_.func_name = u'cloneSymbol' + var.put(u'cloneSymbol', PyJsHoisted_cloneSymbol_) + var.put(u'Symbol', var.get(u'require')(Js(u'./_Symbol'))) + var.put(u'symbolProto', (var.get(u'Symbol').get(u'prototype') if var.get(u'Symbol') else var.get(u'undefined'))) + var.put(u'symbolValueOf', (var.get(u'symbolProto').get(u'valueOf') if var.get(u'symbolProto') else var.get(u'undefined'))) + pass + var.get(u'module').put(u'exports', var.get(u'cloneSymbol')) +PyJs_anonymous_3601_._set_name(u'anonymous') +PyJs_Object_3603_ = Js({u'./_Symbol':Js(295.0)}) +@Js +def PyJs_anonymous_3604_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'cloneArrayBuffer', u'require', u'exports', u'module', u'cloneTypedArray']) + @Js + def PyJsHoisted_cloneTypedArray_(typedArray, isDeep, this, arguments, var=var): + var = Scope({u'this':this, u'typedArray':typedArray, u'isDeep':isDeep, u'arguments':arguments}, var) + var.registers([u'buffer', u'typedArray', u'isDeep']) + var.put(u'buffer', (var.get(u'cloneArrayBuffer')(var.get(u'typedArray').get(u'buffer')) if var.get(u'isDeep') else var.get(u'typedArray').get(u'buffer'))) + return var.get(u'typedArray').get(u'constructor').create(var.get(u'buffer'), var.get(u'typedArray').get(u'byteOffset'), var.get(u'typedArray').get(u'length')) + PyJsHoisted_cloneTypedArray_.func_name = u'cloneTypedArray' + var.put(u'cloneTypedArray', PyJsHoisted_cloneTypedArray_) + var.put(u'cloneArrayBuffer', var.get(u'require')(Js(u'./_cloneArrayBuffer'))) + pass + var.get(u'module').put(u'exports', var.get(u'cloneTypedArray')) +PyJs_anonymous_3604_._set_name(u'anonymous') +PyJs_Object_3605_ = Js({u'./_cloneArrayBuffer':Js(356.0)}) +@Js +def PyJs_anonymous_3606_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'compareAscending', u'require', u'isSymbol', u'exports', u'module']) + @Js + def PyJsHoisted_compareAscending_(value, other, this, arguments, var=var): + var = Scope({u'this':this, u'other':other, u'arguments':arguments, u'value':value}, var) + var.registers([u'valIsSymbol', u'valIsNull', u'value', u'valIsDefined', u'othIsNull', u'othIsReflexive', u'othIsSymbol', u'othIsDefined', u'other', u'valIsReflexive']) + if PyJsStrictNeq(var.get(u'value'),var.get(u'other')): + var.put(u'valIsDefined', PyJsStrictNeq(var.get(u'value'),var.get(u'undefined'))) + var.put(u'valIsNull', PyJsStrictEq(var.get(u'value'),var.get(u"null"))) + var.put(u'valIsReflexive', PyJsStrictEq(var.get(u'value'),var.get(u'value'))) + var.put(u'valIsSymbol', var.get(u'isSymbol')(var.get(u'value'))) + var.put(u'othIsDefined', PyJsStrictNeq(var.get(u'other'),var.get(u'undefined'))) + var.put(u'othIsNull', PyJsStrictEq(var.get(u'other'),var.get(u"null"))) + var.put(u'othIsReflexive', PyJsStrictEq(var.get(u'other'),var.get(u'other'))) + var.put(u'othIsSymbol', var.get(u'isSymbol')(var.get(u'other'))) + def PyJs_LONG_3607_(var=var): + return ((((((var.get(u'othIsNull').neg() and var.get(u'othIsSymbol').neg()) and var.get(u'valIsSymbol').neg()) and (var.get(u'value')>var.get(u'other'))) or ((((var.get(u'valIsSymbol') and var.get(u'othIsDefined')) and var.get(u'othIsReflexive')) and var.get(u'othIsNull').neg()) and var.get(u'othIsSymbol').neg())) or ((var.get(u'valIsNull') and var.get(u'othIsDefined')) and var.get(u'othIsReflexive'))) or (var.get(u'valIsDefined').neg() and var.get(u'othIsReflexive'))) + if (PyJs_LONG_3607_() or var.get(u'valIsReflexive').neg()): + return Js(1.0) + def PyJs_LONG_3608_(var=var): + return ((((((var.get(u'valIsNull').neg() and var.get(u'valIsSymbol').neg()) and var.get(u'othIsSymbol').neg()) and (var.get(u'value')<var.get(u'other'))) or ((((var.get(u'othIsSymbol') and var.get(u'valIsDefined')) and var.get(u'valIsReflexive')) and var.get(u'valIsNull').neg()) and var.get(u'valIsSymbol').neg())) or ((var.get(u'othIsNull') and var.get(u'valIsDefined')) and var.get(u'valIsReflexive'))) or (var.get(u'othIsDefined').neg() and var.get(u'valIsReflexive'))) + if (PyJs_LONG_3608_() or var.get(u'othIsReflexive').neg()): + return (-Js(1.0)) + return Js(0.0) + PyJsHoisted_compareAscending_.func_name = u'compareAscending' + var.put(u'compareAscending', PyJsHoisted_compareAscending_) + var.put(u'isSymbol', var.get(u'require')(Js(u'./isSymbol'))) + pass + var.get(u'module').put(u'exports', var.get(u'compareAscending')) +PyJs_anonymous_3606_._set_name(u'anonymous') +PyJs_Object_3609_ = Js({u'./isSymbol':Js(472.0)}) +@Js +def PyJs_anonymous_3610_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'compareAscending', u'require', u'exports', u'module', u'compareMultiple']) + @Js + def PyJsHoisted_compareMultiple_(object, other, orders, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'object':object, u'other':other, u'orders':orders}, var) + var.registers([u'index', u'orders', u'object', u'ordersLength', u'length', u'other', u'result', u'othCriteria', u'order', u'objCriteria']) + var.put(u'index', (-Js(1.0))) + var.put(u'objCriteria', var.get(u'object').get(u'criteria')) + var.put(u'othCriteria', var.get(u'other').get(u'criteria')) + var.put(u'length', var.get(u'objCriteria').get(u'length')) + var.put(u'ordersLength', var.get(u'orders').get(u'length')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'result', var.get(u'compareAscending')(var.get(u'objCriteria').get(var.get(u'index')), var.get(u'othCriteria').get(var.get(u'index')))) + if var.get(u'result'): + if (var.get(u'index')>=var.get(u'ordersLength')): + return var.get(u'result') + var.put(u'order', var.get(u'orders').get(var.get(u'index'))) + return (var.get(u'result')*((-Js(1.0)) if (var.get(u'order')==Js(u'desc')) else Js(1.0))) + return (var.get(u'object').get(u'index')-var.get(u'other').get(u'index')) + PyJsHoisted_compareMultiple_.func_name = u'compareMultiple' + var.put(u'compareMultiple', PyJsHoisted_compareMultiple_) + var.put(u'compareAscending', var.get(u'require')(Js(u'./_compareAscending'))) + pass + var.get(u'module').put(u'exports', var.get(u'compareMultiple')) +PyJs_anonymous_3610_._set_name(u'anonymous') +PyJs_Object_3611_ = Js({u'./_compareAscending':Js(364.0)}) +@Js +def PyJs_anonymous_3612_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'copyArray', u'exports', u'module']) + @Js + def PyJsHoisted_copyArray_(source, array, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'array':array, u'arguments':arguments}, var) + var.registers([u'index', u'length', u'array', u'source']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'source').get(u'length')) + (var.get(u'array') or var.put(u'array', var.get(u'Array')(var.get(u'length')))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.get(u'array').put(var.get(u'index'), var.get(u'source').get(var.get(u'index'))) + return var.get(u'array') + PyJsHoisted_copyArray_.func_name = u'copyArray' + var.put(u'copyArray', PyJsHoisted_copyArray_) + pass + var.get(u'module').put(u'exports', var.get(u'copyArray')) +PyJs_anonymous_3612_._set_name(u'anonymous') +PyJs_Object_3613_ = Js({}) +@Js +def PyJs_anonymous_3614_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'assignValue', u'require', u'copyObject', u'exports', u'module']) + @Js + def PyJsHoisted_copyObject_(source, props, object, customizer, this, arguments, var=var): + var = Scope({u'source':source, u'customizer':customizer, u'arguments':arguments, u'props':props, u'this':this, u'object':object}, var) + var.registers([u'index', u'object', u'source', u'length', u'key', u'props', u'customizer', u'newValue']) + PyJs_Object_3615_ = Js({}) + (var.get(u'object') or var.put(u'object', PyJs_Object_3615_)) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'props').get(u'length')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'key', var.get(u'props').get(var.get(u'index'))) + var.put(u'newValue', (var.get(u'customizer')(var.get(u'object').get(var.get(u'key')), var.get(u'source').get(var.get(u'key')), var.get(u'key'), var.get(u'object'), var.get(u'source')) if var.get(u'customizer') else var.get(u'source').get(var.get(u'key')))) + var.get(u'assignValue')(var.get(u'object'), var.get(u'key'), var.get(u'newValue')) + return var.get(u'object') + PyJsHoisted_copyObject_.func_name = u'copyObject' + var.put(u'copyObject', PyJsHoisted_copyObject_) + var.put(u'assignValue', var.get(u'require')(Js(u'./_assignValue'))) + pass + var.get(u'module').put(u'exports', var.get(u'copyObject')) +PyJs_anonymous_3614_._set_name(u'anonymous') +PyJs_Object_3616_ = Js({u'./_assignValue':Js(310.0)}) +@Js +def PyJs_anonymous_3617_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'getSymbols', u'exports', u'copySymbols', u'require', u'module', u'copyObject']) + @Js + def PyJsHoisted_copySymbols_(source, object, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'object':object, u'arguments':arguments}, var) + var.registers([u'source', u'object']) + return var.get(u'copyObject')(var.get(u'source'), var.get(u'getSymbols')(var.get(u'source')), var.get(u'object')) + PyJsHoisted_copySymbols_.func_name = u'copySymbols' + var.put(u'copySymbols', PyJsHoisted_copySymbols_) + var.put(u'copyObject', var.get(u'require')(Js(u'./_copyObject'))) + var.put(u'getSymbols', var.get(u'require')(Js(u'./_getSymbols'))) + pass + var.get(u'module').put(u'exports', var.get(u'copySymbols')) +PyJs_anonymous_3617_._set_name(u'anonymous') +PyJs_Object_3618_ = Js({u'./_copyObject':Js(367.0),u'./_getSymbols':Js(384.0)}) +@Js +def PyJs_anonymous_3619_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'root', u'module', u'coreJsData']) + var.put(u'root', var.get(u'require')(Js(u'./_root'))) + var.put(u'coreJsData', var.get(u'root').get(u'__core-js_shared__')) + var.get(u'module').put(u'exports', var.get(u'coreJsData')) +PyJs_anonymous_3619_._set_name(u'anonymous') +PyJs_Object_3620_ = Js({u'./_root':Js(422.0)}) +@Js +def PyJs_anonymous_3621_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'rest', u'createAssigner', u'isIterateeCall']) + @Js + def PyJsHoisted_createAssigner_(assigner, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'assigner':assigner}, var) + var.registers([u'assigner']) + @Js + def PyJs_anonymous_3622_(object, sources, this, arguments, var=var): + var = Scope({u'this':this, u'sources':sources, u'object':object, u'arguments':arguments}, var) + var.registers([u'index', u'sources', u'object', u'guard', u'source', u'length', u'customizer']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'sources').get(u'length')) + var.put(u'customizer', (var.get(u'sources').get((var.get(u'length')-Js(1.0))) if (var.get(u'length')>Js(1.0)) else var.get(u'undefined'))) + var.put(u'guard', (var.get(u'sources').get(u'2') if (var.get(u'length')>Js(2.0)) else var.get(u'undefined'))) + var.put(u'customizer', (PyJsComma((var.put(u'length',Js(var.get(u'length').to_number())-Js(1))+Js(1)),var.get(u'customizer')) if ((var.get(u'assigner').get(u'length')>Js(3.0)) and (var.get(u'customizer',throw=False).typeof()==Js(u'function'))) else var.get(u'undefined'))) + if (var.get(u'guard') and var.get(u'isIterateeCall')(var.get(u'sources').get(u'0'), var.get(u'sources').get(u'1'), var.get(u'guard'))): + var.put(u'customizer', (var.get(u'undefined') if (var.get(u'length')<Js(3.0)) else var.get(u'customizer'))) + var.put(u'length', Js(1.0)) + var.put(u'object', var.get(u'Object')(var.get(u'object'))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'source', var.get(u'sources').get(var.get(u'index'))) + if var.get(u'source'): + var.get(u'assigner')(var.get(u'object'), var.get(u'source'), var.get(u'index'), var.get(u'customizer')) + return var.get(u'object') + PyJs_anonymous_3622_._set_name(u'anonymous') + return var.get(u'rest')(PyJs_anonymous_3622_) + PyJsHoisted_createAssigner_.func_name = u'createAssigner' + var.put(u'createAssigner', PyJsHoisted_createAssigner_) + var.put(u'isIterateeCall', var.get(u'require')(Js(u'./_isIterateeCall'))) + var.put(u'rest', var.get(u'require')(Js(u'./rest'))) + pass + var.get(u'module').put(u'exports', var.get(u'createAssigner')) +PyJs_anonymous_3621_._set_name(u'anonymous') +PyJs_Object_3623_ = Js({u'./_isIterateeCall':Js(402.0),u'./rest':Js(484.0)}) +@Js +def PyJs_anonymous_3624_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArrayLike', u'createBaseEach', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_createBaseEach_(eachFunc, fromRight, this, arguments, var=var): + var = Scope({u'this':this, u'eachFunc':eachFunc, u'arguments':arguments, u'fromRight':fromRight}, var) + var.registers([u'eachFunc', u'fromRight']) + @Js + def PyJs_anonymous_3625_(collection, iteratee, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'collection':collection, u'iteratee':iteratee}, var) + var.registers([u'index', u'length', u'collection', u'iterable', u'iteratee']) + if (var.get(u'collection')==var.get(u"null")): + return var.get(u'collection') + if var.get(u'isArrayLike')(var.get(u'collection')).neg(): + return var.get(u'eachFunc')(var.get(u'collection'), var.get(u'iteratee')) + var.put(u'length', var.get(u'collection').get(u'length')) + var.put(u'index', (var.get(u'length') if var.get(u'fromRight') else (-Js(1.0)))) + var.put(u'iterable', var.get(u'Object')(var.get(u'collection'))) + while ((var.put(u'index',Js(var.get(u'index').to_number())-Js(1))+Js(1)) if var.get(u'fromRight') else (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length'))): + if PyJsStrictEq(var.get(u'iteratee')(var.get(u'iterable').get(var.get(u'index')), var.get(u'index'), var.get(u'iterable')),Js(False)): + break + return var.get(u'collection') + PyJs_anonymous_3625_._set_name(u'anonymous') + return PyJs_anonymous_3625_ + PyJsHoisted_createBaseEach_.func_name = u'createBaseEach' + var.put(u'createBaseEach', PyJsHoisted_createBaseEach_) + var.put(u'isArrayLike', var.get(u'require')(Js(u'./isArrayLike'))) + pass + var.get(u'module').put(u'exports', var.get(u'createBaseEach')) +PyJs_anonymous_3624_._set_name(u'anonymous') +PyJs_Object_3626_ = Js({u'./isArrayLike':Js(459.0)}) +@Js +def PyJs_anonymous_3627_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'createBaseFor', u'require', u'exports', u'module']) + @Js + def PyJsHoisted_createBaseFor_(fromRight, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'fromRight':fromRight}, var) + var.registers([u'fromRight']) + @Js + def PyJs_anonymous_3628_(object, iteratee, keysFunc, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments, u'keysFunc':keysFunc, u'iteratee':iteratee}, var) + var.registers([u'index', u'object', u'keysFunc', u'length', u'iteratee', u'key', u'props', u'iterable']) + var.put(u'index', (-Js(1.0))) + var.put(u'iterable', var.get(u'Object')(var.get(u'object'))) + var.put(u'props', var.get(u'keysFunc')(var.get(u'object'))) + var.put(u'length', var.get(u'props').get(u'length')) + while (var.put(u'length',Js(var.get(u'length').to_number())-Js(1))+Js(1)): + var.put(u'key', var.get(u'props').get((var.get(u'length') if var.get(u'fromRight') else var.put(u'index',Js(var.get(u'index').to_number())+Js(1))))) + if PyJsStrictEq(var.get(u'iteratee')(var.get(u'iterable').get(var.get(u'key')), var.get(u'key'), var.get(u'iterable')),Js(False)): + break + return var.get(u'object') + PyJs_anonymous_3628_._set_name(u'anonymous') + return PyJs_anonymous_3628_ + PyJsHoisted_createBaseFor_.func_name = u'createBaseFor' + var.put(u'createBaseFor', PyJsHoisted_createBaseFor_) + pass + var.get(u'module').put(u'exports', var.get(u'createBaseFor')) +PyJs_anonymous_3627_._set_name(u'anonymous') +PyJs_Object_3629_ = Js({}) +@Js +def PyJs_anonymous_3630_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'createFind', u'keys', u'isArrayLike', u'require', u'baseIteratee', u'module']) + @Js + def PyJsHoisted_createFind_(findIndexFunc, this, arguments, var=var): + var = Scope({u'this':this, u'findIndexFunc':findIndexFunc, u'arguments':arguments}, var) + var.registers([u'findIndexFunc']) + @Js + def PyJs_anonymous_3631_(collection, predicate, fromIndex, this, arguments, var=var): + var = Scope({u'this':this, u'predicate':predicate, u'fromIndex':fromIndex, u'collection':collection, u'arguments':arguments}, var) + var.registers([u'index', u'predicate', u'fromIndex', u'collection', u'props', u'iterable']) + var.put(u'iterable', var.get(u'Object')(var.get(u'collection'))) + var.put(u'predicate', var.get(u'baseIteratee')(var.get(u'predicate'), Js(3.0))) + if var.get(u'isArrayLike')(var.get(u'collection')).neg(): + var.put(u'props', var.get(u'keys')(var.get(u'collection'))) + @Js + def PyJs_anonymous_3632_(value, key, this, arguments, var=var): + var = Scope({u'this':this, u'key':key, u'value':value, u'arguments':arguments}, var) + var.registers([u'key', u'value']) + if var.get(u'props'): + var.put(u'key', var.get(u'value')) + var.put(u'value', var.get(u'iterable').get(var.get(u'key'))) + return var.get(u'predicate')(var.get(u'value'), var.get(u'key'), var.get(u'iterable')) + PyJs_anonymous_3632_._set_name(u'anonymous') + var.put(u'index', var.get(u'findIndexFunc')((var.get(u'props') or var.get(u'collection')), PyJs_anonymous_3632_, var.get(u'fromIndex'))) + return (var.get(u'collection').get((var.get(u'props').get(var.get(u'index')) if var.get(u'props') else var.get(u'index'))) if (var.get(u'index')>(-Js(1.0))) else var.get(u'undefined')) + PyJs_anonymous_3631_._set_name(u'anonymous') + return PyJs_anonymous_3631_ + PyJsHoisted_createFind_.func_name = u'createFind' + var.put(u'createFind', PyJsHoisted_createFind_) + var.put(u'baseIteratee', var.get(u'require')(Js(u'./_baseIteratee'))) + var.put(u'isArrayLike', var.get(u'require')(Js(u'./isArrayLike'))) + var.put(u'keys', var.get(u'require')(Js(u'./keys'))) + pass + var.get(u'module').put(u'exports', var.get(u'createFind')) +PyJs_anonymous_3630_._set_name(u'anonymous') +PyJs_Object_3633_ = Js({u'./_baseIteratee':Js(331.0),u'./isArrayLike':Js(459.0),u'./keys':Js(474.0)}) +@Js +def PyJs_anonymous_3634_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'Set', u'INFINITY', u'require', u'setToArray', u'module', u'noop', u'createSet']) + var.put(u'Set', var.get(u'require')(Js(u'./_Set'))) + var.put(u'noop', var.get(u'require')(Js(u'./noop'))) + var.put(u'setToArray', var.get(u'require')(Js(u'./_setToArray'))) + var.put(u'INFINITY', (Js(1.0)/Js(0.0))) + @Js + def PyJs_anonymous_3635_(values, this, arguments, var=var): + var = Scope({u'this':this, u'values':values, u'arguments':arguments}, var) + var.registers([u'values']) + return var.get(u'Set').create(var.get(u'values')) + PyJs_anonymous_3635_._set_name(u'anonymous') + var.put(u'createSet', (var.get(u'noop') if (var.get(u'Set') and ((Js(1.0)/var.get(u'setToArray')(var.get(u'Set').create(Js([None, (-Js(0.0))]))).get(u'1'))==var.get(u'INFINITY'))).neg() else PyJs_anonymous_3635_)) + var.get(u'module').put(u'exports', var.get(u'createSet')) +PyJs_anonymous_3634_._set_name(u'anonymous') +PyJs_Object_3636_ = Js({u'./_Set':Js(292.0),u'./_setToArray':Js(425.0),u'./noop':Js(479.0)}) +@Js +def PyJs_anonymous_3637_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'PARTIAL_COMPARE_FLAG', u'exports', u'SetCache', u'arraySome', u'UNORDERED_COMPARE_FLAG', u'equalArrays', u'module', u'require']) + @Js + def PyJsHoisted_equalArrays_(array, other, equalFunc, customizer, bitmask, stack, this, arguments, var=var): + var = Scope({u'equalFunc':equalFunc, u'this':this, u'bitmask':bitmask, u'other':other, u'arguments':arguments, u'array':array, u'customizer':customizer, u'stack':stack}, var) + var.registers([u'index', u'compared', u'stacked', u'arrValue', u'equalFunc', u'othLength', u'stack', u'arrLength', u'isPartial', u'other', u'result', u'bitmask', u'seen', u'othValue', u'customizer', u'array']) + var.put(u'isPartial', (var.get(u'bitmask')&var.get(u'PARTIAL_COMPARE_FLAG'))) + var.put(u'arrLength', var.get(u'array').get(u'length')) + var.put(u'othLength', var.get(u'other').get(u'length')) + if ((var.get(u'arrLength')!=var.get(u'othLength')) and (var.get(u'isPartial') and (var.get(u'othLength')>var.get(u'arrLength'))).neg()): + return Js(False) + var.put(u'stacked', var.get(u'stack').callprop(u'get', var.get(u'array'))) + if var.get(u'stacked'): + return (var.get(u'stacked')==var.get(u'other')) + var.put(u'index', (-Js(1.0))) + var.put(u'result', var.get(u'true')) + var.put(u'seen', (var.get(u'SetCache').create() if (var.get(u'bitmask')&var.get(u'UNORDERED_COMPARE_FLAG')) else var.get(u'undefined'))) + var.get(u'stack').callprop(u'set', var.get(u'array'), var.get(u'other')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'arrLength')): + var.put(u'arrValue', var.get(u'array').get(var.get(u'index'))) + var.put(u'othValue', var.get(u'other').get(var.get(u'index'))) + if var.get(u'customizer'): + var.put(u'compared', (var.get(u'customizer')(var.get(u'othValue'), var.get(u'arrValue'), var.get(u'index'), var.get(u'other'), var.get(u'array'), var.get(u'stack')) if var.get(u'isPartial') else var.get(u'customizer')(var.get(u'arrValue'), var.get(u'othValue'), var.get(u'index'), var.get(u'array'), var.get(u'other'), var.get(u'stack')))) + if PyJsStrictNeq(var.get(u'compared'),var.get(u'undefined')): + if var.get(u'compared'): + continue + var.put(u'result', Js(False)) + break + if var.get(u'seen'): + @Js + def PyJs_anonymous_3638_(othValue, othIndex, this, arguments, var=var): + var = Scope({u'this':this, u'othValue':othValue, u'othIndex':othIndex, u'arguments':arguments}, var) + var.registers([u'othValue', u'othIndex']) + if (var.get(u'seen').callprop(u'has', var.get(u'othIndex')).neg() and (PyJsStrictEq(var.get(u'arrValue'),var.get(u'othValue')) or var.get(u'equalFunc')(var.get(u'arrValue'), var.get(u'othValue'), var.get(u'customizer'), var.get(u'bitmask'), var.get(u'stack')))): + return var.get(u'seen').callprop(u'add', var.get(u'othIndex')) + PyJs_anonymous_3638_._set_name(u'anonymous') + if var.get(u'arraySome')(var.get(u'other'), PyJs_anonymous_3638_).neg(): + var.put(u'result', Js(False)) + break + else: + if (PyJsStrictEq(var.get(u'arrValue'),var.get(u'othValue')) or var.get(u'equalFunc')(var.get(u'arrValue'), var.get(u'othValue'), var.get(u'customizer'), var.get(u'bitmask'), var.get(u'stack'))).neg(): + var.put(u'result', Js(False)) + break + var.get(u'stack').callprop(u'delete', var.get(u'array')) + return var.get(u'result') + PyJsHoisted_equalArrays_.func_name = u'equalArrays' + var.put(u'equalArrays', PyJsHoisted_equalArrays_) + var.put(u'SetCache', var.get(u'require')(Js(u'./_SetCache'))) + var.put(u'arraySome', var.get(u'require')(Js(u'./_arraySome'))) + var.put(u'UNORDERED_COMPARE_FLAG', Js(1.0)) + var.put(u'PARTIAL_COMPARE_FLAG', Js(2.0)) + pass + var.get(u'module').put(u'exports', var.get(u'equalArrays')) +PyJs_anonymous_3637_._set_name(u'anonymous') +PyJs_Object_3639_ = Js({u'./_SetCache':Js(293.0),u'./_arraySome':Js(307.0)}) +@Js +def PyJs_anonymous_3640_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'PARTIAL_COMPARE_FLAG', u'arrayBufferTag', u'setToArray', u'equalArrays', u'dataViewTag', u'errorTag', u'equalByTag', u'mapTag', u'boolTag', u'Symbol', u'Uint8Array', u'symbolProto', u'regexpTag', u'exports', u'dateTag', u'UNORDERED_COMPARE_FLAG', u'stringTag', u'numberTag', u'module', u'require', u'symbolValueOf', u'setTag', u'mapToArray', u'symbolTag']) + @Js + def PyJsHoisted_equalByTag_(object, other, tag, equalFunc, customizer, bitmask, stack, this, arguments, var=var): + var = Scope({u'equalFunc':equalFunc, u'this':this, u'object':object, u'stack':stack, u'bitmask':bitmask, u'tag':tag, u'arguments':arguments, u'customizer':customizer, u'other':other}, var) + var.registers([u'convert', u'equalFunc', u'stacked', u'object', u'tag', u'bitmask', u'isPartial', u'other', u'customizer', u'stack']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'tag')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'dataViewTag')): + SWITCHED = True + if ((var.get(u'object').get(u'byteLength')!=var.get(u'other').get(u'byteLength')) or (var.get(u'object').get(u'byteOffset')!=var.get(u'other').get(u'byteOffset'))): + return Js(False) + var.put(u'object', var.get(u'object').get(u'buffer')) + var.put(u'other', var.get(u'other').get(u'buffer')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'arrayBufferTag')): + SWITCHED = True + if ((var.get(u'object').get(u'byteLength')!=var.get(u'other').get(u'byteLength')) or var.get(u'equalFunc')(var.get(u'Uint8Array').create(var.get(u'object')), var.get(u'Uint8Array').create(var.get(u'other'))).neg()): + return Js(False) + return var.get(u'true') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'boolTag')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'dateTag')): + SWITCHED = True + return ((+var.get(u'object'))==(+var.get(u'other'))) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'errorTag')): + SWITCHED = True + return ((var.get(u'object').get(u'name')==var.get(u'other').get(u'name')) and (var.get(u'object').get(u'message')==var.get(u'other').get(u'message'))) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'numberTag')): + SWITCHED = True + return ((var.get(u'other')!=(+var.get(u'other'))) if (var.get(u'object')!=(+var.get(u'object'))) else (var.get(u'object')==(+var.get(u'other')))) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'regexpTag')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'stringTag')): + SWITCHED = True + return (var.get(u'object')==(var.get(u'other')+Js(u''))) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'mapTag')): + SWITCHED = True + var.put(u'convert', var.get(u'mapToArray')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'setTag')): + SWITCHED = True + var.put(u'isPartial', (var.get(u'bitmask')&var.get(u'PARTIAL_COMPARE_FLAG'))) + (var.get(u'convert') or var.put(u'convert', var.get(u'setToArray'))) + if ((var.get(u'object').get(u'size')!=var.get(u'other').get(u'size')) and var.get(u'isPartial').neg()): + return Js(False) + var.put(u'stacked', var.get(u'stack').callprop(u'get', var.get(u'object'))) + if var.get(u'stacked'): + return (var.get(u'stacked')==var.get(u'other')) + var.put(u'bitmask', var.get(u'UNORDERED_COMPARE_FLAG'), u'|') + var.get(u'stack').callprop(u'set', var.get(u'object'), var.get(u'other')) + return var.get(u'equalArrays')(var.get(u'convert')(var.get(u'object')), var.get(u'convert')(var.get(u'other')), var.get(u'equalFunc'), var.get(u'customizer'), var.get(u'bitmask'), var.get(u'stack')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'symbolTag')): + SWITCHED = True + if var.get(u'symbolValueOf'): + return (var.get(u'symbolValueOf').callprop(u'call', var.get(u'object'))==var.get(u'symbolValueOf').callprop(u'call', var.get(u'other'))) + SWITCHED = True + break + return Js(False) + PyJsHoisted_equalByTag_.func_name = u'equalByTag' + var.put(u'equalByTag', PyJsHoisted_equalByTag_) + var.put(u'Symbol', var.get(u'require')(Js(u'./_Symbol'))) + var.put(u'Uint8Array', var.get(u'require')(Js(u'./_Uint8Array'))) + var.put(u'equalArrays', var.get(u'require')(Js(u'./_equalArrays'))) + var.put(u'mapToArray', var.get(u'require')(Js(u'./_mapToArray'))) + var.put(u'setToArray', var.get(u'require')(Js(u'./_setToArray'))) + var.put(u'UNORDERED_COMPARE_FLAG', Js(1.0)) + var.put(u'PARTIAL_COMPARE_FLAG', Js(2.0)) + var.put(u'boolTag', Js(u'[object Boolean]')) + var.put(u'dateTag', Js(u'[object Date]')) + var.put(u'errorTag', Js(u'[object Error]')) + var.put(u'mapTag', Js(u'[object Map]')) + var.put(u'numberTag', Js(u'[object Number]')) + var.put(u'regexpTag', Js(u'[object RegExp]')) + var.put(u'setTag', Js(u'[object Set]')) + var.put(u'stringTag', Js(u'[object String]')) + var.put(u'symbolTag', Js(u'[object Symbol]')) + var.put(u'arrayBufferTag', Js(u'[object ArrayBuffer]')) + var.put(u'dataViewTag', Js(u'[object DataView]')) + var.put(u'symbolProto', (var.get(u'Symbol').get(u'prototype') if var.get(u'Symbol') else var.get(u'undefined'))) + var.put(u'symbolValueOf', (var.get(u'symbolProto').get(u'valueOf') if var.get(u'symbolProto') else var.get(u'undefined'))) + pass + var.get(u'module').put(u'exports', var.get(u'equalByTag')) +PyJs_anonymous_3640_._set_name(u'anonymous') +PyJs_Object_3641_ = Js({u'./_Symbol':Js(295.0),u'./_Uint8Array':Js(296.0),u'./_equalArrays':Js(375.0),u'./_mapToArray':Js(419.0),u'./_setToArray':Js(425.0)}) +@Js +def PyJs_anonymous_3642_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'PARTIAL_COMPARE_FLAG', u'equalObjects', u'exports', u'baseHas', u'keys', u'require', u'module']) + @Js + def PyJsHoisted_equalObjects_(object, other, equalFunc, customizer, bitmask, stack, this, arguments, var=var): + var = Scope({u'equalFunc':equalFunc, u'this':this, u'object':object, u'bitmask':bitmask, u'other':other, u'arguments':arguments, u'customizer':customizer, u'stack':stack}, var) + var.registers([u'index', u'compared', u'stacked', u'objValue', u'othCtor', u'stack', u'objCtor', u'object', u'othLength', u'othProps', u'bitmask', u'isPartial', u'objProps', u'result', u'key', u'equalFunc', u'othValue', u'skipCtor', u'other', u'objLength', u'customizer']) + var.put(u'isPartial', (var.get(u'bitmask')&var.get(u'PARTIAL_COMPARE_FLAG'))) + var.put(u'objProps', var.get(u'keys')(var.get(u'object'))) + var.put(u'objLength', var.get(u'objProps').get(u'length')) + var.put(u'othProps', var.get(u'keys')(var.get(u'other'))) + var.put(u'othLength', var.get(u'othProps').get(u'length')) + if ((var.get(u'objLength')!=var.get(u'othLength')) and var.get(u'isPartial').neg()): + return Js(False) + var.put(u'index', var.get(u'objLength')) + while (var.put(u'index',Js(var.get(u'index').to_number())-Js(1))+Js(1)): + var.put(u'key', var.get(u'objProps').get(var.get(u'index'))) + if (var.get(u'other').contains(var.get(u'key')) if var.get(u'isPartial') else var.get(u'baseHas')(var.get(u'other'), var.get(u'key'))).neg(): + return Js(False) + var.put(u'stacked', var.get(u'stack').callprop(u'get', var.get(u'object'))) + if var.get(u'stacked'): + return (var.get(u'stacked')==var.get(u'other')) + var.put(u'result', var.get(u'true')) + var.get(u'stack').callprop(u'set', var.get(u'object'), var.get(u'other')) + var.put(u'skipCtor', var.get(u'isPartial')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'objLength')): + var.put(u'key', var.get(u'objProps').get(var.get(u'index'))) + var.put(u'objValue', var.get(u'object').get(var.get(u'key'))) + var.put(u'othValue', var.get(u'other').get(var.get(u'key'))) + if var.get(u'customizer'): + var.put(u'compared', (var.get(u'customizer')(var.get(u'othValue'), var.get(u'objValue'), var.get(u'key'), var.get(u'other'), var.get(u'object'), var.get(u'stack')) if var.get(u'isPartial') else var.get(u'customizer')(var.get(u'objValue'), var.get(u'othValue'), var.get(u'key'), var.get(u'object'), var.get(u'other'), var.get(u'stack')))) + if ((PyJsStrictEq(var.get(u'objValue'),var.get(u'othValue')) or var.get(u'equalFunc')(var.get(u'objValue'), var.get(u'othValue'), var.get(u'customizer'), var.get(u'bitmask'), var.get(u'stack'))) if PyJsStrictEq(var.get(u'compared'),var.get(u'undefined')) else var.get(u'compared')).neg(): + var.put(u'result', Js(False)) + break + (var.get(u'skipCtor') or var.put(u'skipCtor', (var.get(u'key')==Js(u'constructor')))) + if (var.get(u'result') and var.get(u'skipCtor').neg()): + var.put(u'objCtor', var.get(u'object').get(u'constructor')) + var.put(u'othCtor', var.get(u'other').get(u'constructor')) + def PyJs_LONG_3643_(var=var): + return (((var.get(u'objCtor')!=var.get(u'othCtor')) and (var.get(u'object').contains(Js(u'constructor')) and var.get(u'other').contains(Js(u'constructor')))) and ((((var.get(u'objCtor',throw=False).typeof()==Js(u'function')) and var.get(u'objCtor').instanceof(var.get(u'objCtor'))) and (var.get(u'othCtor',throw=False).typeof()==Js(u'function'))) and var.get(u'othCtor').instanceof(var.get(u'othCtor'))).neg()) + if PyJs_LONG_3643_(): + var.put(u'result', Js(False)) + var.get(u'stack').callprop(u'delete', var.get(u'object')) + return var.get(u'result') + PyJsHoisted_equalObjects_.func_name = u'equalObjects' + var.put(u'equalObjects', PyJsHoisted_equalObjects_) + var.put(u'baseHas', var.get(u'require')(Js(u'./_baseHas'))) + var.put(u'keys', var.get(u'require')(Js(u'./keys'))) + var.put(u'PARTIAL_COMPARE_FLAG', Js(2.0)) + pass + var.get(u'module').put(u'exports', var.get(u'equalObjects')) +PyJs_anonymous_3642_._set_name(u'anonymous') +PyJs_Object_3644_ = Js({u'./_baseHas':Js(323.0),u'./keys':Js(474.0)}) +@Js +def PyJs_anonymous_3645_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'getSymbols', u'exports', u'baseGetAllKeys', u'keys', u'require', u'module', u'getAllKeys']) + @Js + def PyJsHoisted_getAllKeys_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + return var.get(u'baseGetAllKeys')(var.get(u'object'), var.get(u'keys'), var.get(u'getSymbols')) + PyJsHoisted_getAllKeys_.func_name = u'getAllKeys' + var.put(u'getAllKeys', PyJsHoisted_getAllKeys_) + var.put(u'baseGetAllKeys', var.get(u'require')(Js(u'./_baseGetAllKeys'))) + var.put(u'getSymbols', var.get(u'require')(Js(u'./_getSymbols'))) + var.put(u'keys', var.get(u'require')(Js(u'./keys'))) + pass + var.get(u'module').put(u'exports', var.get(u'getAllKeys')) +PyJs_anonymous_3645_._set_name(u'anonymous') +PyJs_Object_3646_ = Js({u'./_baseGetAllKeys':Js(322.0),u'./_getSymbols':Js(384.0),u'./keys':Js(474.0)}) +@Js +def PyJs_anonymous_3647_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'getLength', u'require', u'baseProperty', u'exports', u'module']) + var.put(u'baseProperty', var.get(u'require')(Js(u'./_baseProperty'))) + var.put(u'getLength', var.get(u'baseProperty')(Js(u'length'))) + var.get(u'module').put(u'exports', var.get(u'getLength')) +PyJs_anonymous_3647_._set_name(u'anonymous') +PyJs_Object_3648_ = Js({u'./_baseProperty':Js(340.0)}) +@Js +def PyJs_anonymous_3649_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isKeyable', u'require', u'getMapData', u'exports', u'module']) + @Js + def PyJsHoisted_getMapData_(map, key, this, arguments, var=var): + var = Scope({u'this':this, u'map':map, u'arguments':arguments, u'key':key}, var) + var.registers([u'map', u'data', u'key']) + var.put(u'data', var.get(u'map').get(u'__data__')) + return (var.get(u'data').get((Js(u'string') if (var.get(u'key',throw=False).typeof()==Js(u'string')) else Js(u'hash'))) if var.get(u'isKeyable')(var.get(u'key')) else var.get(u'data').get(u'map')) + PyJsHoisted_getMapData_.func_name = u'getMapData' + var.put(u'getMapData', PyJsHoisted_getMapData_) + var.put(u'isKeyable', var.get(u'require')(Js(u'./_isKeyable'))) + pass + var.get(u'module').put(u'exports', var.get(u'getMapData')) +PyJs_anonymous_3649_._set_name(u'anonymous') +PyJs_Object_3650_ = Js({u'./_isKeyable':Js(404.0)}) +@Js +def PyJs_anonymous_3651_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'keys', u'require', u'module', u'isStrictComparable', u'getMatchData']) + @Js + def PyJsHoisted_getMatchData_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'value', u'length', u'object', u'result', u'key']) + var.put(u'result', var.get(u'keys')(var.get(u'object'))) + var.put(u'length', var.get(u'result').get(u'length')) + while (var.put(u'length',Js(var.get(u'length').to_number())-Js(1))+Js(1)): + var.put(u'key', var.get(u'result').get(var.get(u'length'))) + var.put(u'value', var.get(u'object').get(var.get(u'key'))) + var.get(u'result').put(var.get(u'length'), Js([var.get(u'key'), var.get(u'value'), var.get(u'isStrictComparable')(var.get(u'value'))])) + return var.get(u'result') + PyJsHoisted_getMatchData_.func_name = u'getMatchData' + var.put(u'getMatchData', PyJsHoisted_getMatchData_) + var.put(u'isStrictComparable', var.get(u'require')(Js(u'./_isStrictComparable'))) + var.put(u'keys', var.get(u'require')(Js(u'./keys'))) + pass + var.get(u'module').put(u'exports', var.get(u'getMatchData')) +PyJs_anonymous_3651_._set_name(u'anonymous') +PyJs_Object_3652_ = Js({u'./_isStrictComparable':Js(407.0),u'./keys':Js(474.0)}) +@Js +def PyJs_anonymous_3653_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'getValue', u'baseIsNative', u'getNative']) + @Js + def PyJsHoisted_getNative_(object, key, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments, u'key':key}, var) + var.registers([u'object', u'key', u'value']) + var.put(u'value', var.get(u'getValue')(var.get(u'object'), var.get(u'key'))) + return (var.get(u'value') if var.get(u'baseIsNative')(var.get(u'value')) else var.get(u'undefined')) + PyJsHoisted_getNative_.func_name = u'getNative' + var.put(u'getNative', PyJsHoisted_getNative_) + var.put(u'baseIsNative', var.get(u'require')(Js(u'./_baseIsNative'))) + var.put(u'getValue', var.get(u'require')(Js(u'./_getValue'))) + pass + var.get(u'module').put(u'exports', var.get(u'getNative')) +PyJs_anonymous_3653_._set_name(u'anonymous') +PyJs_Object_3654_ = Js({u'./_baseIsNative':Js(330.0),u'./_getValue':Js(386.0)}) +@Js +def PyJs_anonymous_3655_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'nativeGetPrototype', u'getPrototype', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_getPrototype_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return var.get(u'nativeGetPrototype')(var.get(u'Object')(var.get(u'value'))) + PyJsHoisted_getPrototype_.func_name = u'getPrototype' + var.put(u'getPrototype', PyJsHoisted_getPrototype_) + var.put(u'nativeGetPrototype', var.get(u'Object').get(u'getPrototypeOf')) + pass + var.get(u'module').put(u'exports', var.get(u'getPrototype')) +PyJs_anonymous_3655_._set_name(u'anonymous') +PyJs_Object_3656_ = Js({}) +@Js +def PyJs_anonymous_3657_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'getSymbols', u'exports', u'require', u'module', u'stubArray', u'getOwnPropertySymbols']) + @Js + def PyJsHoisted_getSymbols_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + return var.get(u'getOwnPropertySymbols')(var.get(u'Object')(var.get(u'object'))) + PyJsHoisted_getSymbols_.func_name = u'getSymbols' + var.put(u'getSymbols', PyJsHoisted_getSymbols_) + var.put(u'stubArray', var.get(u'require')(Js(u'./stubArray'))) + var.put(u'getOwnPropertySymbols', var.get(u'Object').get(u'getOwnPropertySymbols')) + pass + if var.get(u'getOwnPropertySymbols').neg(): + var.put(u'getSymbols', var.get(u'stubArray')) + var.get(u'module').put(u'exports', var.get(u'getSymbols')) +PyJs_anonymous_3657_._set_name(u'anonymous') +PyJs_Object_3658_ = Js({u'./stubArray':Js(487.0)}) +@Js +def PyJs_anonymous_3659_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'objectTag', u'dataViewTag', u'setCtorString', u'promiseTag', u'Map', u'mapTag', u'objectToString', u'DataView', u'weakMapCtorString', u'dataViewCtorString', u'exports', u'promiseCtorString', u'toSource', u'mapCtorString', u'WeakMap', u'module', u'getTag', u'Set', u'require', u'weakMapTag', u'Promise', u'setTag', u'objectProto']) + @Js + def PyJsHoisted_getTag_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return var.get(u'objectToString').callprop(u'call', var.get(u'value')) + PyJsHoisted_getTag_.func_name = u'getTag' + var.put(u'getTag', PyJsHoisted_getTag_) + var.put(u'DataView', var.get(u'require')(Js(u'./_DataView'))) + var.put(u'Map', var.get(u'require')(Js(u'./_Map'))) + var.put(u'Promise', var.get(u'require')(Js(u'./_Promise'))) + var.put(u'Set', var.get(u'require')(Js(u'./_Set'))) + var.put(u'WeakMap', var.get(u'require')(Js(u'./_WeakMap'))) + var.put(u'toSource', var.get(u'require')(Js(u'./_toSource'))) + var.put(u'mapTag', Js(u'[object Map]')) + var.put(u'objectTag', Js(u'[object Object]')) + var.put(u'promiseTag', Js(u'[object Promise]')) + var.put(u'setTag', Js(u'[object Set]')) + var.put(u'weakMapTag', Js(u'[object WeakMap]')) + var.put(u'dataViewTag', Js(u'[object DataView]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + var.put(u'dataViewCtorString', var.get(u'toSource')(var.get(u'DataView'))) + var.put(u'mapCtorString', var.get(u'toSource')(var.get(u'Map'))) + var.put(u'promiseCtorString', var.get(u'toSource')(var.get(u'Promise'))) + var.put(u'setCtorString', var.get(u'toSource')(var.get(u'Set'))) + var.put(u'weakMapCtorString', var.get(u'toSource')(var.get(u'WeakMap'))) + pass + def PyJs_LONG_3660_(var=var): + return ((((var.get(u'DataView') and (var.get(u'getTag')(var.get(u'DataView').create(var.get(u'ArrayBuffer').create(Js(1.0))))!=var.get(u'dataViewTag'))) or (var.get(u'Map') and (var.get(u'getTag')(var.get(u'Map').create())!=var.get(u'mapTag')))) or (var.get(u'Promise') and (var.get(u'getTag')(var.get(u'Promise').callprop(u'resolve'))!=var.get(u'promiseTag')))) or (var.get(u'Set') and (var.get(u'getTag')(var.get(u'Set').create())!=var.get(u'setTag')))) + if (PyJs_LONG_3660_() or (var.get(u'WeakMap') and (var.get(u'getTag')(var.get(u'WeakMap').create())!=var.get(u'weakMapTag')))): + @Js + def PyJs_anonymous_3661_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value', u'result', u'Ctor', u'ctorString']) + var.put(u'result', var.get(u'objectToString').callprop(u'call', var.get(u'value'))) + var.put(u'Ctor', (var.get(u'value').get(u'constructor') if (var.get(u'result')==var.get(u'objectTag')) else var.get(u'undefined'))) + var.put(u'ctorString', (var.get(u'toSource')(var.get(u'Ctor')) if var.get(u'Ctor') else var.get(u'undefined'))) + if var.get(u'ctorString'): + while 1: + SWITCHED = False + CONDITION = (var.get(u'ctorString')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'dataViewCtorString')): + SWITCHED = True + return var.get(u'dataViewTag') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'mapCtorString')): + SWITCHED = True + return var.get(u'mapTag') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'promiseCtorString')): + SWITCHED = True + return var.get(u'promiseTag') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'setCtorString')): + SWITCHED = True + return var.get(u'setTag') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'weakMapCtorString')): + SWITCHED = True + return var.get(u'weakMapTag') + SWITCHED = True + break + return var.get(u'result') + PyJs_anonymous_3661_._set_name(u'anonymous') + var.put(u'getTag', PyJs_anonymous_3661_) + var.get(u'module').put(u'exports', var.get(u'getTag')) +PyJs_anonymous_3659_._set_name(u'anonymous') +PyJs_Object_3662_ = Js({u'./_DataView':Js(285.0),u'./_Map':Js(288.0),u'./_Promise':Js(290.0),u'./_Set':Js(292.0),u'./_WeakMap':Js(297.0),u'./_toSource':Js(434.0)}) +@Js +def PyJs_anonymous_3663_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'getValue']) + @Js + def PyJsHoisted_getValue_(object, key, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments, u'key':key}, var) + var.registers([u'object', u'key']) + return (var.get(u'undefined') if (var.get(u'object')==var.get(u"null")) else var.get(u'object').get(var.get(u'key'))) + PyJsHoisted_getValue_.func_name = u'getValue' + var.put(u'getValue', PyJsHoisted_getValue_) + pass + var.get(u'module').put(u'exports', var.get(u'getValue')) +PyJs_anonymous_3663_._set_name(u'anonymous') +PyJs_Object_3664_ = Js({}) +@Js +def PyJs_anonymous_3665_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'hasPath', u'isString', u'isLength', u'toKey', u'isKey', u'require', u'isIndex', u'exports', u'module', u'castPath', u'isArguments']) + @Js + def PyJsHoisted_hasPath_(object, path, hasFunc, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'object':object, u'hasFunc':hasFunc, u'arguments':arguments}, var) + var.registers([u'index', u'object', u'length', u'result', u'key', u'path', u'hasFunc']) + var.put(u'path', (Js([var.get(u'path')]) if var.get(u'isKey')(var.get(u'path'), var.get(u'object')) else var.get(u'castPath')(var.get(u'path')))) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'path').get(u'length')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'key', var.get(u'toKey')(var.get(u'path').get(var.get(u'index')))) + if var.put(u'result', ((var.get(u'object')!=var.get(u"null")) and var.get(u'hasFunc')(var.get(u'object'), var.get(u'key')))).neg(): + break + var.put(u'object', var.get(u'object').get(var.get(u'key'))) + if var.get(u'result'): + return var.get(u'result') + var.put(u'length', (var.get(u'object').get(u'length') if var.get(u'object') else Js(0.0))) + return (((var.get(u'length').neg().neg() and var.get(u'isLength')(var.get(u'length'))) and var.get(u'isIndex')(var.get(u'key'), var.get(u'length'))) and ((var.get(u'isArray')(var.get(u'object')) or var.get(u'isString')(var.get(u'object'))) or var.get(u'isArguments')(var.get(u'object')))) + PyJsHoisted_hasPath_.func_name = u'hasPath' + var.put(u'hasPath', PyJsHoisted_hasPath_) + var.put(u'castPath', var.get(u'require')(Js(u'./_castPath'))) + var.put(u'isArguments', var.get(u'require')(Js(u'./isArguments'))) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + var.put(u'isIndex', var.get(u'require')(Js(u'./_isIndex'))) + var.put(u'isKey', var.get(u'require')(Js(u'./_isKey'))) + var.put(u'isLength', var.get(u'require')(Js(u'./isLength'))) + var.put(u'isString', var.get(u'require')(Js(u'./isString'))) + var.put(u'toKey', var.get(u'require')(Js(u'./_toKey'))) + pass + var.get(u'module').put(u'exports', var.get(u'hasPath')) +PyJs_anonymous_3665_._set_name(u'anonymous') +PyJs_Object_3666_ = Js({u'./_castPath':Js(352.0),u'./_isIndex':Js(401.0),u'./_isKey':Js(403.0),u'./_toKey':Js(433.0),u'./isArguments':Js(457.0),u'./isArray':Js(458.0),u'./isLength':Js(465.0),u'./isString':Js(471.0)}) +@Js +def PyJs_anonymous_3667_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'require', u'exports', u'nativeCreate', u'hashClear']) + @Js + def PyJsHoisted_hashClear_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_3668_ = Js({}) + var.get(u"this").put(u'__data__', (var.get(u'nativeCreate')(var.get(u"null")) if var.get(u'nativeCreate') else PyJs_Object_3668_)) + PyJsHoisted_hashClear_.func_name = u'hashClear' + var.put(u'hashClear', PyJsHoisted_hashClear_) + var.put(u'nativeCreate', var.get(u'require')(Js(u'./_nativeCreate'))) + pass + var.get(u'module').put(u'exports', var.get(u'hashClear')) +PyJs_anonymous_3667_._set_name(u'anonymous') +PyJs_Object_3669_ = Js({u'./_nativeCreate':Js(421.0)}) +@Js +def PyJs_anonymous_3670_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'hashDelete', u'exports', u'module']) + @Js + def PyJsHoisted_hashDelete_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return (var.get(u"this").callprop(u'has', var.get(u'key')) and var.get(u"this").get(u'__data__').delete(var.get(u'key'))) + PyJsHoisted_hashDelete_.func_name = u'hashDelete' + var.put(u'hashDelete', PyJsHoisted_hashDelete_) + pass + var.get(u'module').put(u'exports', var.get(u'hashDelete')) +PyJs_anonymous_3670_._set_name(u'anonymous') +PyJs_Object_3671_ = Js({}) +@Js +def PyJs_anonymous_3672_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'hashGet', u'nativeCreate', u'HASH_UNDEFINED', u'require', u'module', u'hasOwnProperty', u'objectProto']) + @Js + def PyJsHoisted_hashGet_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'data', u'result', u'key']) + var.put(u'data', var.get(u"this").get(u'__data__')) + if var.get(u'nativeCreate'): + var.put(u'result', var.get(u'data').get(var.get(u'key'))) + return (var.get(u'undefined') if PyJsStrictEq(var.get(u'result'),var.get(u'HASH_UNDEFINED')) else var.get(u'result')) + return (var.get(u'data').get(var.get(u'key')) if var.get(u'hasOwnProperty').callprop(u'call', var.get(u'data'), var.get(u'key')) else var.get(u'undefined')) + PyJsHoisted_hashGet_.func_name = u'hashGet' + var.put(u'hashGet', PyJsHoisted_hashGet_) + var.put(u'nativeCreate', var.get(u'require')(Js(u'./_nativeCreate'))) + var.put(u'HASH_UNDEFINED', Js(u'__lodash_hash_undefined__')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'hasOwnProperty', var.get(u'objectProto').get(u'hasOwnProperty')) + pass + var.get(u'module').put(u'exports', var.get(u'hashGet')) +PyJs_anonymous_3672_._set_name(u'anonymous') +PyJs_Object_3673_ = Js({u'./_nativeCreate':Js(421.0)}) +@Js +def PyJs_anonymous_3674_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'nativeCreate', u'require', u'module', u'hasOwnProperty', u'objectProto', u'hashHas']) + @Js + def PyJsHoisted_hashHas_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'data', u'key']) + var.put(u'data', var.get(u"this").get(u'__data__')) + return (PyJsStrictNeq(var.get(u'data').get(var.get(u'key')),var.get(u'undefined')) if var.get(u'nativeCreate') else var.get(u'hasOwnProperty').callprop(u'call', var.get(u'data'), var.get(u'key'))) + PyJsHoisted_hashHas_.func_name = u'hashHas' + var.put(u'hashHas', PyJsHoisted_hashHas_) + var.put(u'nativeCreate', var.get(u'require')(Js(u'./_nativeCreate'))) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'hasOwnProperty', var.get(u'objectProto').get(u'hasOwnProperty')) + pass + var.get(u'module').put(u'exports', var.get(u'hashHas')) +PyJs_anonymous_3674_._set_name(u'anonymous') +PyJs_Object_3675_ = Js({u'./_nativeCreate':Js(421.0)}) +@Js +def PyJs_anonymous_3676_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'nativeCreate', u'hashSet', u'require', u'HASH_UNDEFINED', u'module']) + @Js + def PyJsHoisted_hashSet_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'data', u'value', u'key']) + var.put(u'data', var.get(u"this").get(u'__data__')) + var.get(u'data').put(var.get(u'key'), (var.get(u'HASH_UNDEFINED') if (var.get(u'nativeCreate') and PyJsStrictEq(var.get(u'value'),var.get(u'undefined'))) else var.get(u'value'))) + return var.get(u"this") + PyJsHoisted_hashSet_.func_name = u'hashSet' + var.put(u'hashSet', PyJsHoisted_hashSet_) + var.put(u'nativeCreate', var.get(u'require')(Js(u'./_nativeCreate'))) + var.put(u'HASH_UNDEFINED', Js(u'__lodash_hash_undefined__')) + pass + var.get(u'module').put(u'exports', var.get(u'hashSet')) +PyJs_anonymous_3676_._set_name(u'anonymous') +PyJs_Object_3677_ = Js({u'./_nativeCreate':Js(421.0)}) +@Js +def PyJs_anonymous_3678_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'indexKeys', u'exports', u'isString', u'isLength', u'require', u'module', u'baseTimes', u'isArguments']) + @Js + def PyJsHoisted_indexKeys_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'length', u'object']) + var.put(u'length', (var.get(u'object').get(u'length') if var.get(u'object') else var.get(u'undefined'))) + if (var.get(u'isLength')(var.get(u'length')) and ((var.get(u'isArray')(var.get(u'object')) or var.get(u'isString')(var.get(u'object'))) or var.get(u'isArguments')(var.get(u'object')))): + return var.get(u'baseTimes')(var.get(u'length'), var.get(u'String')) + return var.get(u"null") + PyJsHoisted_indexKeys_.func_name = u'indexKeys' + var.put(u'indexKeys', PyJsHoisted_indexKeys_) + var.put(u'baseTimes', var.get(u'require')(Js(u'./_baseTimes'))) + var.put(u'isArguments', var.get(u'require')(Js(u'./isArguments'))) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + var.put(u'isLength', var.get(u'require')(Js(u'./isLength'))) + var.put(u'isString', var.get(u'require')(Js(u'./isString'))) + pass + var.get(u'module').put(u'exports', var.get(u'indexKeys')) +PyJs_anonymous_3678_._set_name(u'anonymous') +PyJs_Object_3679_ = Js({u'./_baseTimes':Js(346.0),u'./isArguments':Js(457.0),u'./isArray':Js(458.0),u'./isLength':Js(465.0),u'./isString':Js(471.0)}) +@Js +def PyJs_anonymous_3680_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'indexOfNaN', u'exports', u'module']) + @Js + def PyJsHoisted_indexOfNaN_(array, fromIndex, fromRight, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'array':array, u'fromIndex':fromIndex, u'fromRight':fromRight}, var) + var.registers([u'index', u'fromIndex', u'fromRight', u'length', u'other', u'array']) + var.put(u'length', var.get(u'array').get(u'length')) + var.put(u'index', (var.get(u'fromIndex')+(Js(1.0) if var.get(u'fromRight') else (-Js(1.0))))) + while ((var.put(u'index',Js(var.get(u'index').to_number())-Js(1))+Js(1)) if var.get(u'fromRight') else (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length'))): + var.put(u'other', var.get(u'array').get(var.get(u'index'))) + if PyJsStrictNeq(var.get(u'other'),var.get(u'other')): + return var.get(u'index') + return (-Js(1.0)) + PyJsHoisted_indexOfNaN_.func_name = u'indexOfNaN' + var.put(u'indexOfNaN', PyJsHoisted_indexOfNaN_) + pass + var.get(u'module').put(u'exports', var.get(u'indexOfNaN')) +PyJs_anonymous_3680_._set_name(u'anonymous') +PyJs_Object_3681_ = Js({}) +@Js +def PyJs_anonymous_3682_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'initCloneArray', u'module', u'hasOwnProperty', u'objectProto']) + @Js + def PyJsHoisted_initCloneArray_(array, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'arguments':arguments}, var) + var.registers([u'length', u'array', u'result']) + var.put(u'length', var.get(u'array').get(u'length')) + var.put(u'result', var.get(u'array').callprop(u'constructor', var.get(u'length'))) + if ((var.get(u'length') and (var.get(u'array').get(u'0').typeof()==Js(u'string'))) and var.get(u'hasOwnProperty').callprop(u'call', var.get(u'array'), Js(u'index'))): + var.get(u'result').put(u'index', var.get(u'array').get(u'index')) + var.get(u'result').put(u'input', var.get(u'array').get(u'input')) + return var.get(u'result') + PyJsHoisted_initCloneArray_.func_name = u'initCloneArray' + var.put(u'initCloneArray', PyJsHoisted_initCloneArray_) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'hasOwnProperty', var.get(u'objectProto').get(u'hasOwnProperty')) + pass + var.get(u'module').put(u'exports', var.get(u'initCloneArray')) +PyJs_anonymous_3682_._set_name(u'anonymous') +PyJs_Object_3683_ = Js({}) +@Js +def PyJs_anonymous_3684_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'uint32Tag', u'arrayBufferTag', u'uint8ClampedTag', u'dataViewTag', u'int8Tag', u'float64Tag', u'cloneRegExp', u'mapTag', u'boolTag', u'initCloneByTag', u'cloneTypedArray', u'float32Tag', u'regexpTag', u'exports', u'dateTag', u'setTag', u'stringTag', u'int32Tag', u'module', u'uint8Tag', u'cloneSet', u'cloneSymbol', u'require', u'uint16Tag', u'cloneDataView', u'int16Tag', u'cloneArrayBuffer', u'numberTag', u'cloneMap', u'symbolTag']) + @Js + def PyJsHoisted_initCloneByTag_(object, tag, cloneFunc, isDeep, this, arguments, var=var): + var = Scope({u'tag':tag, u'isDeep':isDeep, u'arguments':arguments, u'this':this, u'object':object, u'cloneFunc':cloneFunc}, var) + var.registers([u'cloneFunc', u'isDeep', u'object', u'tag', u'Ctor']) + var.put(u'Ctor', var.get(u'object').get(u'constructor')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'tag')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'arrayBufferTag')): + SWITCHED = True + return var.get(u'cloneArrayBuffer')(var.get(u'object')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'boolTag')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'dateTag')): + SWITCHED = True + return var.get(u'Ctor').create((+var.get(u'object'))) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'dataViewTag')): + SWITCHED = True + return var.get(u'cloneDataView')(var.get(u'object'), var.get(u'isDeep')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'float32Tag')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'float64Tag')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'int8Tag')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'int16Tag')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'int32Tag')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'uint8Tag')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'uint8ClampedTag')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'uint16Tag')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'uint32Tag')): + SWITCHED = True + return var.get(u'cloneTypedArray')(var.get(u'object'), var.get(u'isDeep')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'mapTag')): + SWITCHED = True + return var.get(u'cloneMap')(var.get(u'object'), var.get(u'isDeep'), var.get(u'cloneFunc')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'numberTag')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'stringTag')): + SWITCHED = True + return var.get(u'Ctor').create(var.get(u'object')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'regexpTag')): + SWITCHED = True + return var.get(u'cloneRegExp')(var.get(u'object')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'setTag')): + SWITCHED = True + return var.get(u'cloneSet')(var.get(u'object'), var.get(u'isDeep'), var.get(u'cloneFunc')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'symbolTag')): + SWITCHED = True + return var.get(u'cloneSymbol')(var.get(u'object')) + SWITCHED = True + break + PyJsHoisted_initCloneByTag_.func_name = u'initCloneByTag' + var.put(u'initCloneByTag', PyJsHoisted_initCloneByTag_) + var.put(u'cloneArrayBuffer', var.get(u'require')(Js(u'./_cloneArrayBuffer'))) + var.put(u'cloneDataView', var.get(u'require')(Js(u'./_cloneDataView'))) + var.put(u'cloneMap', var.get(u'require')(Js(u'./_cloneMap'))) + var.put(u'cloneRegExp', var.get(u'require')(Js(u'./_cloneRegExp'))) + var.put(u'cloneSet', var.get(u'require')(Js(u'./_cloneSet'))) + var.put(u'cloneSymbol', var.get(u'require')(Js(u'./_cloneSymbol'))) + var.put(u'cloneTypedArray', var.get(u'require')(Js(u'./_cloneTypedArray'))) + var.put(u'boolTag', Js(u'[object Boolean]')) + var.put(u'dateTag', Js(u'[object Date]')) + var.put(u'mapTag', Js(u'[object Map]')) + var.put(u'numberTag', Js(u'[object Number]')) + var.put(u'regexpTag', Js(u'[object RegExp]')) + var.put(u'setTag', Js(u'[object Set]')) + var.put(u'stringTag', Js(u'[object String]')) + var.put(u'symbolTag', Js(u'[object Symbol]')) + var.put(u'arrayBufferTag', Js(u'[object ArrayBuffer]')) + var.put(u'dataViewTag', Js(u'[object DataView]')) + var.put(u'float32Tag', Js(u'[object Float32Array]')) + var.put(u'float64Tag', Js(u'[object Float64Array]')) + var.put(u'int8Tag', Js(u'[object Int8Array]')) + var.put(u'int16Tag', Js(u'[object Int16Array]')) + var.put(u'int32Tag', Js(u'[object Int32Array]')) + var.put(u'uint8Tag', Js(u'[object Uint8Array]')) + var.put(u'uint8ClampedTag', Js(u'[object Uint8ClampedArray]')) + var.put(u'uint16Tag', Js(u'[object Uint16Array]')) + var.put(u'uint32Tag', Js(u'[object Uint32Array]')) + pass + var.get(u'module').put(u'exports', var.get(u'initCloneByTag')) +PyJs_anonymous_3684_._set_name(u'anonymous') +PyJs_Object_3685_ = Js({u'./_cloneArrayBuffer':Js(356.0),u'./_cloneDataView':Js(358.0),u'./_cloneMap':Js(359.0),u'./_cloneRegExp':Js(360.0),u'./_cloneSet':Js(361.0),u'./_cloneSymbol':Js(362.0),u'./_cloneTypedArray':Js(363.0)}) +@Js +def PyJs_anonymous_3686_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'initCloneObject', u'require', u'module', u'isPrototype', u'baseCreate', u'getPrototype']) + @Js + def PyJsHoisted_initCloneObject_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + PyJs_Object_3687_ = Js({}) + return (var.get(u'baseCreate')(var.get(u'getPrototype')(var.get(u'object'))) if ((var.get(u'object').get(u'constructor').typeof()==Js(u'function')) and var.get(u'isPrototype')(var.get(u'object')).neg()) else PyJs_Object_3687_) + PyJsHoisted_initCloneObject_.func_name = u'initCloneObject' + var.put(u'initCloneObject', PyJsHoisted_initCloneObject_) + var.put(u'baseCreate', var.get(u'require')(Js(u'./_baseCreate'))) + var.put(u'getPrototype', var.get(u'require')(Js(u'./_getPrototype'))) + var.put(u'isPrototype', var.get(u'require')(Js(u'./_isPrototype'))) + pass + var.get(u'module').put(u'exports', var.get(u'initCloneObject')) +PyJs_anonymous_3686_._set_name(u'anonymous') +PyJs_Object_3688_ = Js({u'./_baseCreate':Js(315.0),u'./_getPrototype':Js(383.0),u'./_isPrototype':Js(406.0)}) +@Js +def PyJs_anonymous_3689_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'exports', u'require', u'module', u'isFlattenable', u'isArguments']) + @Js + def PyJsHoisted_isFlattenable_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'isArray')(var.get(u'value')) or var.get(u'isArguments')(var.get(u'value'))) + PyJsHoisted_isFlattenable_.func_name = u'isFlattenable' + var.put(u'isFlattenable', PyJsHoisted_isFlattenable_) + var.put(u'isArguments', var.get(u'require')(Js(u'./isArguments'))) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + pass + var.get(u'module').put(u'exports', var.get(u'isFlattenable')) +PyJs_anonymous_3689_._set_name(u'anonymous') +PyJs_Object_3690_ = Js({u'./isArguments':Js(457.0),u'./isArray':Js(458.0)}) +@Js +def PyJs_anonymous_3691_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'exports', u'require', u'module', u'isFunction', u'isFlattenableIteratee']) + @Js + def PyJsHoisted_isFlattenableIteratee_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'isArray')(var.get(u'value')) and ((var.get(u'value').get(u'length')==Js(2.0)) and var.get(u'isFunction')(var.get(u'value').get(u'0')).neg()).neg()) + PyJsHoisted_isFlattenableIteratee_.func_name = u'isFlattenableIteratee' + var.put(u'isFlattenableIteratee', PyJsHoisted_isFlattenableIteratee_) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + var.put(u'isFunction', var.get(u'require')(Js(u'./isFunction'))) + pass + var.get(u'module').put(u'exports', var.get(u'isFlattenableIteratee')) +PyJs_anonymous_3691_._set_name(u'anonymous') +PyJs_Object_3692_ = Js({u'./isArray':Js(458.0),u'./isFunction':Js(463.0)}) +@Js +def PyJs_anonymous_3693_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'isHostObject']) + @Js + def PyJsHoisted_isHostObject_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'result', u'value']) + var.put(u'result', Js(False)) + if ((var.get(u'value')!=var.get(u"null")) and (var.get(u'value').get(u'toString').typeof()!=Js(u'function'))): + try: + var.put(u'result', (var.get(u'value')+Js(u'')).neg().neg()) + except PyJsException as PyJsTempException: + PyJsHolder_65_43263878 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_43263878 is not None: + var.own[u'e'] = PyJsHolder_65_43263878 + else: + del var.own[u'e'] + del PyJsHolder_65_43263878 + return var.get(u'result') + PyJsHoisted_isHostObject_.func_name = u'isHostObject' + var.put(u'isHostObject', PyJsHoisted_isHostObject_) + pass + var.get(u'module').put(u'exports', var.get(u'isHostObject')) +PyJs_anonymous_3693_._set_name(u'anonymous') +PyJs_Object_3694_ = Js({}) +@Js +def PyJs_anonymous_3695_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'MAX_SAFE_INTEGER', u'exports', u'require', u'isIndex', u'module', u'reIsUint']) + @Js + def PyJsHoisted_isIndex_(value, length, this, arguments, var=var): + var = Scope({u'this':this, u'length':length, u'arguments':arguments, u'value':value}, var) + var.registers([u'length', u'value']) + var.put(u'length', (var.get(u'MAX_SAFE_INTEGER') if (var.get(u'length')==var.get(u"null")) else var.get(u'length'))) + return ((var.get(u'length').neg().neg() and ((var.get(u'value',throw=False).typeof()==Js(u'number')) or var.get(u'reIsUint').callprop(u'test', var.get(u'value')))) and (((var.get(u'value')>(-Js(1.0))) and ((var.get(u'value')%Js(1.0))==Js(0.0))) and (var.get(u'value')<var.get(u'length')))) + PyJsHoisted_isIndex_.func_name = u'isIndex' + var.put(u'isIndex', PyJsHoisted_isIndex_) + var.put(u'MAX_SAFE_INTEGER', Js(9007199254740991.0)) + var.put(u'reIsUint', JsRegExp(u'/^(?:0|[1-9]\\d*)$/')) + pass + var.get(u'module').put(u'exports', var.get(u'isIndex')) +PyJs_anonymous_3695_._set_name(u'anonymous') +PyJs_Object_3696_ = Js({}) +@Js +def PyJs_anonymous_3697_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'isArrayLike', u'require', u'isIndex', u'module', u'isIterateeCall', u'eq', u'isObject']) + @Js + def PyJsHoisted_isIterateeCall_(value, index, object, this, arguments, var=var): + var = Scope({u'this':this, u'index':index, u'object':object, u'arguments':arguments, u'value':value}, var) + var.registers([u'index', u'object', u'type', u'value']) + if var.get(u'isObject')(var.get(u'object')).neg(): + return Js(False) + var.put(u'type', var.get(u'index',throw=False).typeof()) + if ((var.get(u'isArrayLike')(var.get(u'object')) and var.get(u'isIndex')(var.get(u'index'), var.get(u'object').get(u'length'))) if (var.get(u'type')==Js(u'number')) else ((var.get(u'type')==Js(u'string')) and var.get(u'object').contains(var.get(u'index')))): + return var.get(u'eq')(var.get(u'object').get(var.get(u'index')), var.get(u'value')) + return Js(False) + PyJsHoisted_isIterateeCall_.func_name = u'isIterateeCall' + var.put(u'isIterateeCall', PyJsHoisted_isIterateeCall_) + var.put(u'eq', var.get(u'require')(Js(u'./eq'))) + var.put(u'isArrayLike', var.get(u'require')(Js(u'./isArrayLike'))) + var.put(u'isIndex', var.get(u'require')(Js(u'./_isIndex'))) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + pass + var.get(u'module').put(u'exports', var.get(u'isIterateeCall')) +PyJs_anonymous_3697_._set_name(u'anonymous') +PyJs_Object_3698_ = Js({u'./_isIndex':Js(401.0),u'./eq':Js(444.0),u'./isArrayLike':Js(459.0),u'./isObject':Js(467.0)}) +@Js +def PyJs_anonymous_3699_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'exports', u'reIsPlainProp', u'isKey', u'require', u'reIsDeepProp', u'module', u'isSymbol']) + @Js + def PyJsHoisted_isKey_(value, object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments, u'value':value}, var) + var.registers([u'object', u'type', u'value']) + if var.get(u'isArray')(var.get(u'value')): + return Js(False) + var.put(u'type', var.get(u'value',throw=False).typeof()) + if (((((var.get(u'type')==Js(u'number')) or (var.get(u'type')==Js(u'symbol'))) or (var.get(u'type')==Js(u'boolean'))) or (var.get(u'value')==var.get(u"null"))) or var.get(u'isSymbol')(var.get(u'value'))): + return var.get(u'true') + return ((var.get(u'reIsPlainProp').callprop(u'test', var.get(u'value')) or var.get(u'reIsDeepProp').callprop(u'test', var.get(u'value')).neg()) or ((var.get(u'object')!=var.get(u"null")) and var.get(u'Object')(var.get(u'object')).contains(var.get(u'value')))) + PyJsHoisted_isKey_.func_name = u'isKey' + var.put(u'isKey', PyJsHoisted_isKey_) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + var.put(u'isSymbol', var.get(u'require')(Js(u'./isSymbol'))) + var.put(u'reIsDeepProp', JsRegExp(u'/\\.|\\[(?:[^[\\]]*|(["\'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/')) + var.put(u'reIsPlainProp', JsRegExp(u'/^\\w*$/')) + pass + var.get(u'module').put(u'exports', var.get(u'isKey')) +PyJs_anonymous_3699_._set_name(u'anonymous') +PyJs_Object_3700_ = Js({u'./isArray':Js(458.0),u'./isSymbol':Js(472.0)}) +@Js +def PyJs_anonymous_3701_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isKeyable', u'require', u'exports', u'module']) + @Js + def PyJsHoisted_isKeyable_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'type', u'value']) + var.put(u'type', var.get(u'value',throw=False).typeof()) + return (PyJsStrictNeq(var.get(u'value'),Js(u'__proto__')) if ((((var.get(u'type')==Js(u'string')) or (var.get(u'type')==Js(u'number'))) or (var.get(u'type')==Js(u'symbol'))) or (var.get(u'type')==Js(u'boolean'))) else PyJsStrictEq(var.get(u'value'),var.get(u"null"))) + PyJsHoisted_isKeyable_.func_name = u'isKeyable' + var.put(u'isKeyable', PyJsHoisted_isKeyable_) + pass + var.get(u'module').put(u'exports', var.get(u'isKeyable')) +PyJs_anonymous_3701_._set_name(u'anonymous') +PyJs_Object_3702_ = Js({}) +@Js +def PyJs_anonymous_3703_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'maskSrcKey', u'module', u'isMasked', u'coreJsData']) + @Js + def PyJsHoisted_isMasked_(func, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'func':func}, var) + var.registers([u'func']) + return (var.get(u'maskSrcKey').neg().neg() and var.get(u'func').contains(var.get(u'maskSrcKey'))) + PyJsHoisted_isMasked_.func_name = u'isMasked' + var.put(u'isMasked', PyJsHoisted_isMasked_) + var.put(u'coreJsData', var.get(u'require')(Js(u'./_coreJsData'))) + @Js + def PyJs_anonymous_3704_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'uid']) + var.put(u'uid', JsRegExp(u'/[^.]+$/').callprop(u'exec', (((var.get(u'coreJsData') and var.get(u'coreJsData').get(u'keys')) and var.get(u'coreJsData').get(u'keys').get(u'IE_PROTO')) or Js(u'')))) + return ((Js(u'Symbol(src)_1.')+var.get(u'uid')) if var.get(u'uid') else Js(u'')) + PyJs_anonymous_3704_._set_name(u'anonymous') + var.put(u'maskSrcKey', PyJs_anonymous_3704_()) + pass + var.get(u'module').put(u'exports', var.get(u'isMasked')) +PyJs_anonymous_3703_._set_name(u'anonymous') +PyJs_Object_3705_ = Js({u'./_coreJsData':Js(369.0)}) +@Js +def PyJs_anonymous_3706_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isPrototype', u'objectProto', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_isPrototype_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value', u'Ctor', u'proto']) + var.put(u'Ctor', (var.get(u'value') and var.get(u'value').get(u'constructor'))) + var.put(u'proto', (((var.get(u'Ctor',throw=False).typeof()==Js(u'function')) and var.get(u'Ctor').get(u'prototype')) or var.get(u'objectProto'))) + return PyJsStrictEq(var.get(u'value'),var.get(u'proto')) + PyJsHoisted_isPrototype_.func_name = u'isPrototype' + var.put(u'isPrototype', PyJsHoisted_isPrototype_) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + pass + var.get(u'module').put(u'exports', var.get(u'isPrototype')) +PyJs_anonymous_3706_._set_name(u'anonymous') +PyJs_Object_3707_ = Js({}) +@Js +def PyJs_anonymous_3708_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isStrictComparable', u'require', u'exports', u'isObject', u'module']) + @Js + def PyJsHoisted_isStrictComparable_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (PyJsStrictEq(var.get(u'value'),var.get(u'value')) and var.get(u'isObject')(var.get(u'value')).neg()) + PyJsHoisted_isStrictComparable_.func_name = u'isStrictComparable' + var.put(u'isStrictComparable', PyJsHoisted_isStrictComparable_) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + pass + var.get(u'module').put(u'exports', var.get(u'isStrictComparable')) +PyJs_anonymous_3708_._set_name(u'anonymous') +PyJs_Object_3709_ = Js({u'./isObject':Js(467.0)}) +@Js +def PyJs_anonymous_3710_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'iteratorToArray', u'exports', u'module']) + @Js + def PyJsHoisted_iteratorToArray_(iterator, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'iterator':iterator}, var) + var.registers([u'data', u'result', u'iterator']) + var.put(u'result', Js([])) + while var.put(u'data', var.get(u'iterator').callprop(u'next')).get(u'done').neg(): + var.get(u'result').callprop(u'push', var.get(u'data').get(u'value')) + return var.get(u'result') + PyJsHoisted_iteratorToArray_.func_name = u'iteratorToArray' + var.put(u'iteratorToArray', PyJsHoisted_iteratorToArray_) + pass + var.get(u'module').put(u'exports', var.get(u'iteratorToArray')) +PyJs_anonymous_3710_._set_name(u'anonymous') +PyJs_Object_3711_ = Js({}) +@Js +def PyJs_anonymous_3712_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'listCacheClear']) + @Js + def PyJsHoisted_listCacheClear_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'__data__', Js([])) + PyJsHoisted_listCacheClear_.func_name = u'listCacheClear' + var.put(u'listCacheClear', PyJsHoisted_listCacheClear_) + pass + var.get(u'module').put(u'exports', var.get(u'listCacheClear')) +PyJs_anonymous_3712_._set_name(u'anonymous') +PyJs_Object_3713_ = Js({}) +@Js +def PyJs_anonymous_3714_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'listCacheDelete', u'exports', u'arrayProto', u'require', u'module', u'splice', u'assocIndexOf']) + @Js + def PyJsHoisted_listCacheDelete_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'index', u'data', u'lastIndex', u'key']) + var.put(u'data', var.get(u"this").get(u'__data__')) + var.put(u'index', var.get(u'assocIndexOf')(var.get(u'data'), var.get(u'key'))) + if (var.get(u'index')<Js(0.0)): + return Js(False) + var.put(u'lastIndex', (var.get(u'data').get(u'length')-Js(1.0))) + if (var.get(u'index')==var.get(u'lastIndex')): + var.get(u'data').callprop(u'pop') + else: + var.get(u'splice').callprop(u'call', var.get(u'data'), var.get(u'index'), Js(1.0)) + return var.get(u'true') + PyJsHoisted_listCacheDelete_.func_name = u'listCacheDelete' + var.put(u'listCacheDelete', PyJsHoisted_listCacheDelete_) + var.put(u'assocIndexOf', var.get(u'require')(Js(u'./_assocIndexOf'))) + var.put(u'arrayProto', var.get(u'Array').get(u'prototype')) + var.put(u'splice', var.get(u'arrayProto').get(u'splice')) + pass + var.get(u'module').put(u'exports', var.get(u'listCacheDelete')) +PyJs_anonymous_3714_._set_name(u'anonymous') +PyJs_Object_3715_ = Js({u'./_assocIndexOf':Js(311.0)}) +@Js +def PyJs_anonymous_3716_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'assocIndexOf', u'require', u'exports', u'module', u'listCacheGet']) + @Js + def PyJsHoisted_listCacheGet_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'index', u'data', u'key']) + var.put(u'data', var.get(u"this").get(u'__data__')) + var.put(u'index', var.get(u'assocIndexOf')(var.get(u'data'), var.get(u'key'))) + return (var.get(u'undefined') if (var.get(u'index')<Js(0.0)) else var.get(u'data').get(var.get(u'index')).get(u'1')) + PyJsHoisted_listCacheGet_.func_name = u'listCacheGet' + var.put(u'listCacheGet', PyJsHoisted_listCacheGet_) + var.put(u'assocIndexOf', var.get(u'require')(Js(u'./_assocIndexOf'))) + pass + var.get(u'module').put(u'exports', var.get(u'listCacheGet')) +PyJs_anonymous_3716_._set_name(u'anonymous') +PyJs_Object_3717_ = Js({u'./_assocIndexOf':Js(311.0)}) +@Js +def PyJs_anonymous_3718_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'assocIndexOf', u'listCacheHas', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_listCacheHas_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return (var.get(u'assocIndexOf')(var.get(u"this").get(u'__data__'), var.get(u'key'))>(-Js(1.0))) + PyJsHoisted_listCacheHas_.func_name = u'listCacheHas' + var.put(u'listCacheHas', PyJsHoisted_listCacheHas_) + var.put(u'assocIndexOf', var.get(u'require')(Js(u'./_assocIndexOf'))) + pass + var.get(u'module').put(u'exports', var.get(u'listCacheHas')) +PyJs_anonymous_3718_._set_name(u'anonymous') +PyJs_Object_3719_ = Js({u'./_assocIndexOf':Js(311.0)}) +@Js +def PyJs_anonymous_3720_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'assocIndexOf', u'listCacheSet', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_listCacheSet_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'index', u'data', u'value', u'key']) + var.put(u'data', var.get(u"this").get(u'__data__')) + var.put(u'index', var.get(u'assocIndexOf')(var.get(u'data'), var.get(u'key'))) + if (var.get(u'index')<Js(0.0)): + var.get(u'data').callprop(u'push', Js([var.get(u'key'), var.get(u'value')])) + else: + var.get(u'data').get(var.get(u'index')).put(u'1', var.get(u'value')) + return var.get(u"this") + PyJsHoisted_listCacheSet_.func_name = u'listCacheSet' + var.put(u'listCacheSet', PyJsHoisted_listCacheSet_) + var.put(u'assocIndexOf', var.get(u'require')(Js(u'./_assocIndexOf'))) + pass + var.get(u'module').put(u'exports', var.get(u'listCacheSet')) +PyJs_anonymous_3720_._set_name(u'anonymous') +PyJs_Object_3721_ = Js({u'./_assocIndexOf':Js(311.0)}) +@Js +def PyJs_anonymous_3722_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'Map', u'exports', u'Hash', u'require', u'module', u'mapCacheClear', u'ListCache']) + @Js + def PyJsHoisted_mapCacheClear_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_3723_ = Js({u'hash':var.get(u'Hash').create(),u'map':(var.get(u'Map') or var.get(u'ListCache')).create(),u'string':var.get(u'Hash').create()}) + var.get(u"this").put(u'__data__', PyJs_Object_3723_) + PyJsHoisted_mapCacheClear_.func_name = u'mapCacheClear' + var.put(u'mapCacheClear', PyJsHoisted_mapCacheClear_) + var.put(u'Hash', var.get(u'require')(Js(u'./_Hash'))) + var.put(u'ListCache', var.get(u'require')(Js(u'./_ListCache'))) + var.put(u'Map', var.get(u'require')(Js(u'./_Map'))) + pass + var.get(u'module').put(u'exports', var.get(u'mapCacheClear')) +PyJs_anonymous_3722_._set_name(u'anonymous') +PyJs_Object_3724_ = Js({u'./_Hash':Js(286.0),u'./_ListCache':Js(287.0),u'./_Map':Js(288.0)}) +@Js +def PyJs_anonymous_3725_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'mapCacheDelete', u'getMapData', u'exports', u'module']) + @Js + def PyJsHoisted_mapCacheDelete_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u'getMapData')(var.get(u"this"), var.get(u'key')).callprop(u'delete', var.get(u'key')) + PyJsHoisted_mapCacheDelete_.func_name = u'mapCacheDelete' + var.put(u'mapCacheDelete', PyJsHoisted_mapCacheDelete_) + var.put(u'getMapData', var.get(u'require')(Js(u'./_getMapData'))) + pass + var.get(u'module').put(u'exports', var.get(u'mapCacheDelete')) +PyJs_anonymous_3725_._set_name(u'anonymous') +PyJs_Object_3726_ = Js({u'./_getMapData':Js(380.0)}) +@Js +def PyJs_anonymous_3727_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'mapCacheGet', u'getMapData', u'exports', u'module']) + @Js + def PyJsHoisted_mapCacheGet_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u'getMapData')(var.get(u"this"), var.get(u'key')).callprop(u'get', var.get(u'key')) + PyJsHoisted_mapCacheGet_.func_name = u'mapCacheGet' + var.put(u'mapCacheGet', PyJsHoisted_mapCacheGet_) + var.put(u'getMapData', var.get(u'require')(Js(u'./_getMapData'))) + pass + var.get(u'module').put(u'exports', var.get(u'mapCacheGet')) +PyJs_anonymous_3727_._set_name(u'anonymous') +PyJs_Object_3728_ = Js({u'./_getMapData':Js(380.0)}) +@Js +def PyJs_anonymous_3729_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'getMapData', u'exports', u'module', u'mapCacheHas']) + @Js + def PyJsHoisted_mapCacheHas_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u'getMapData')(var.get(u"this"), var.get(u'key')).callprop(u'has', var.get(u'key')) + PyJsHoisted_mapCacheHas_.func_name = u'mapCacheHas' + var.put(u'mapCacheHas', PyJsHoisted_mapCacheHas_) + var.put(u'getMapData', var.get(u'require')(Js(u'./_getMapData'))) + pass + var.get(u'module').put(u'exports', var.get(u'mapCacheHas')) +PyJs_anonymous_3729_._set_name(u'anonymous') +PyJs_Object_3730_ = Js({u'./_getMapData':Js(380.0)}) +@Js +def PyJs_anonymous_3731_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'getMapData', u'exports', u'module', u'mapCacheSet']) + @Js + def PyJsHoisted_mapCacheSet_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + var.get(u'getMapData')(var.get(u"this"), var.get(u'key')).callprop(u'set', var.get(u'key'), var.get(u'value')) + return var.get(u"this") + PyJsHoisted_mapCacheSet_.func_name = u'mapCacheSet' + var.put(u'mapCacheSet', PyJsHoisted_mapCacheSet_) + var.put(u'getMapData', var.get(u'require')(Js(u'./_getMapData'))) + pass + var.get(u'module').put(u'exports', var.get(u'mapCacheSet')) +PyJs_anonymous_3731_._set_name(u'anonymous') +PyJs_Object_3732_ = Js({u'./_getMapData':Js(380.0)}) +@Js +def PyJs_anonymous_3733_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'mapToArray', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_mapToArray_(map, this, arguments, var=var): + var = Scope({u'this':this, u'map':map, u'arguments':arguments}, var) + var.registers([u'index', u'result', u'map']) + var.put(u'index', (-Js(1.0))) + var.put(u'result', var.get(u'Array')(var.get(u'map').get(u'size'))) + @Js + def PyJs_anonymous_3734_(value, key, this, arguments, var=var): + var = Scope({u'this':this, u'key':key, u'value':value, u'arguments':arguments}, var) + var.registers([u'key', u'value']) + var.get(u'result').put(var.put(u'index',Js(var.get(u'index').to_number())+Js(1)), Js([var.get(u'key'), var.get(u'value')])) + PyJs_anonymous_3734_._set_name(u'anonymous') + var.get(u'map').callprop(u'forEach', PyJs_anonymous_3734_) + return var.get(u'result') + PyJsHoisted_mapToArray_.func_name = u'mapToArray' + var.put(u'mapToArray', PyJsHoisted_mapToArray_) + pass + var.get(u'module').put(u'exports', var.get(u'mapToArray')) +PyJs_anonymous_3733_._set_name(u'anonymous') +PyJs_Object_3735_ = Js({}) +@Js +def PyJs_anonymous_3736_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'matchesStrictComparable', u'exports', u'module']) + @Js + def PyJsHoisted_matchesStrictComparable_(key, srcValue, this, arguments, var=var): + var = Scope({u'this':this, u'srcValue':srcValue, u'key':key, u'arguments':arguments}, var) + var.registers([u'srcValue', u'key']) + @Js + def PyJs_anonymous_3737_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + if (var.get(u'object')==var.get(u"null")): + return Js(False) + return (PyJsStrictEq(var.get(u'object').get(var.get(u'key')),var.get(u'srcValue')) and (PyJsStrictNeq(var.get(u'srcValue'),var.get(u'undefined')) or var.get(u'Object')(var.get(u'object')).contains(var.get(u'key')))) + PyJs_anonymous_3737_._set_name(u'anonymous') + return PyJs_anonymous_3737_ + PyJsHoisted_matchesStrictComparable_.func_name = u'matchesStrictComparable' + var.put(u'matchesStrictComparable', PyJsHoisted_matchesStrictComparable_) + pass + var.get(u'module').put(u'exports', var.get(u'matchesStrictComparable')) +PyJs_anonymous_3736_._set_name(u'anonymous') +PyJs_Object_3738_ = Js({}) +@Js +def PyJs_anonymous_3739_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'getNative', u'nativeCreate', u'module']) + var.put(u'getNative', var.get(u'require')(Js(u'./_getNative'))) + var.put(u'nativeCreate', var.get(u'getNative')(var.get(u'Object'), Js(u'create'))) + var.get(u'module').put(u'exports', var.get(u'nativeCreate')) +PyJs_anonymous_3739_._set_name(u'anonymous') +PyJs_Object_3740_ = Js({u'./_getNative':Js(382.0)}) +@Js +def PyJs_anonymous_3741_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_3742_ = Js({}) + @Js + def PyJs_anonymous_3743_(PyJsArg_676c6f62616c_, this, arguments, var=var): + var = Scope({u'this':this, u'global':PyJsArg_676c6f62616c_, u'arguments':arguments}, var) + var.registers([u'freeGlobal', u'global', u'freeSelf', u'thisGlobal', u'root', u'checkGlobal']) + var.put(u'checkGlobal', var.get(u'require')(Js(u'./_checkGlobal'))) + var.put(u'freeGlobal', var.get(u'checkGlobal')(((var.get(u'global',throw=False).typeof()==Js(u'object')) and var.get(u'global')))) + var.put(u'freeSelf', var.get(u'checkGlobal')(((var.get(u'self',throw=False).typeof()==Js(u'object')) and var.get(u'self')))) + var.put(u'thisGlobal', var.get(u'checkGlobal')(((var.get(u"this",throw=False).typeof()==Js(u'object')) and var.get(u"this")))) + var.put(u'root', (((var.get(u'freeGlobal') or var.get(u'freeSelf')) or var.get(u'thisGlobal')) or var.get(u'Function')(Js(u'return this'))())) + var.get(u'module').put(u'exports', var.get(u'root')) + PyJs_anonymous_3743_._set_name(u'anonymous') + PyJs_anonymous_3743_.callprop(u'call', var.get(u"this"), (var.get(u'global') if PyJsStrictNeq(var.get(u'global',throw=False).typeof(),Js(u'undefined')) else (var.get(u'self') if PyJsStrictNeq(var.get(u'self',throw=False).typeof(),Js(u'undefined')) else (var.get(u'window') if PyJsStrictNeq(var.get(u'window',throw=False).typeof(),Js(u'undefined')) else PyJs_Object_3742_)))) +PyJs_anonymous_3741_._set_name(u'anonymous') +PyJs_Object_3744_ = Js({u'./_checkGlobal':Js(355.0)}) +@Js +def PyJs_anonymous_3745_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'setCacheAdd', u'require', u'exports', u'module', u'HASH_UNDEFINED']) + @Js + def PyJsHoisted_setCacheAdd_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + var.get(u"this").get(u'__data__').callprop(u'set', var.get(u'value'), var.get(u'HASH_UNDEFINED')) + return var.get(u"this") + PyJsHoisted_setCacheAdd_.func_name = u'setCacheAdd' + var.put(u'setCacheAdd', PyJsHoisted_setCacheAdd_) + var.put(u'HASH_UNDEFINED', Js(u'__lodash_hash_undefined__')) + pass + var.get(u'module').put(u'exports', var.get(u'setCacheAdd')) +PyJs_anonymous_3745_._set_name(u'anonymous') +PyJs_Object_3746_ = Js({}) +@Js +def PyJs_anonymous_3747_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'setCacheHas', u'module']) + @Js + def PyJsHoisted_setCacheHas_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return var.get(u"this").get(u'__data__').callprop(u'has', var.get(u'value')) + PyJsHoisted_setCacheHas_.func_name = u'setCacheHas' + var.put(u'setCacheHas', PyJsHoisted_setCacheHas_) + pass + var.get(u'module').put(u'exports', var.get(u'setCacheHas')) +PyJs_anonymous_3747_._set_name(u'anonymous') +PyJs_Object_3748_ = Js({}) +@Js +def PyJs_anonymous_3749_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'setToArray', u'exports', u'module']) + @Js + def PyJsHoisted_setToArray_(set, this, arguments, var=var): + var = Scope({u'this':this, u'set':set, u'arguments':arguments}, var) + var.registers([u'index', u'set', u'result']) + var.put(u'index', (-Js(1.0))) + var.put(u'result', var.get(u'Array')(var.get(u'set').get(u'size'))) + @Js + def PyJs_anonymous_3750_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + var.get(u'result').put(var.put(u'index',Js(var.get(u'index').to_number())+Js(1)), var.get(u'value')) + PyJs_anonymous_3750_._set_name(u'anonymous') + var.get(u'set').callprop(u'forEach', PyJs_anonymous_3750_) + return var.get(u'result') + PyJsHoisted_setToArray_.func_name = u'setToArray' + var.put(u'setToArray', PyJsHoisted_setToArray_) + pass + var.get(u'module').put(u'exports', var.get(u'setToArray')) +PyJs_anonymous_3749_._set_name(u'anonymous') +PyJs_Object_3751_ = Js({}) +@Js +def PyJs_anonymous_3752_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'stackClear', u'module', u'ListCache']) + @Js + def PyJsHoisted_stackClear_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'__data__', var.get(u'ListCache').create()) + PyJsHoisted_stackClear_.func_name = u'stackClear' + var.put(u'stackClear', PyJsHoisted_stackClear_) + var.put(u'ListCache', var.get(u'require')(Js(u'./_ListCache'))) + pass + var.get(u'module').put(u'exports', var.get(u'stackClear')) +PyJs_anonymous_3752_._set_name(u'anonymous') +PyJs_Object_3753_ = Js({u'./_ListCache':Js(287.0)}) +@Js +def PyJs_anonymous_3754_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'stackDelete', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_stackDelete_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u"this").get(u'__data__').callprop(u'delete', var.get(u'key')) + PyJsHoisted_stackDelete_.func_name = u'stackDelete' + var.put(u'stackDelete', PyJsHoisted_stackDelete_) + pass + var.get(u'module').put(u'exports', var.get(u'stackDelete')) +PyJs_anonymous_3754_._set_name(u'anonymous') +PyJs_Object_3755_ = Js({}) +@Js +def PyJs_anonymous_3756_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'stackGet', u'exports', u'module']) + @Js + def PyJsHoisted_stackGet_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u"this").get(u'__data__').callprop(u'get', var.get(u'key')) + PyJsHoisted_stackGet_.func_name = u'stackGet' + var.put(u'stackGet', PyJsHoisted_stackGet_) + pass + var.get(u'module').put(u'exports', var.get(u'stackGet')) +PyJs_anonymous_3756_._set_name(u'anonymous') +PyJs_Object_3757_ = Js({}) +@Js +def PyJs_anonymous_3758_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'stackHas', u'require', u'exports', u'module']) + @Js + def PyJsHoisted_stackHas_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u"this").get(u'__data__').callprop(u'has', var.get(u'key')) + PyJsHoisted_stackHas_.func_name = u'stackHas' + var.put(u'stackHas', PyJsHoisted_stackHas_) + pass + var.get(u'module').put(u'exports', var.get(u'stackHas')) +PyJs_anonymous_3758_._set_name(u'anonymous') +PyJs_Object_3759_ = Js({}) +@Js +def PyJs_anonymous_3760_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'stackSet', u'exports', u'require', u'module', u'MapCache', u'LARGE_ARRAY_SIZE', u'ListCache']) + @Js + def PyJsHoisted_stackSet_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'cache', u'value', u'key']) + var.put(u'cache', var.get(u"this").get(u'__data__')) + if (var.get(u'cache').instanceof(var.get(u'ListCache')) and (var.get(u'cache').get(u'__data__').get(u'length')==var.get(u'LARGE_ARRAY_SIZE'))): + var.put(u'cache', var.get(u"this").put(u'__data__', var.get(u'MapCache').create(var.get(u'cache').get(u'__data__')))) + var.get(u'cache').callprop(u'set', var.get(u'key'), var.get(u'value')) + return var.get(u"this") + PyJsHoisted_stackSet_.func_name = u'stackSet' + var.put(u'stackSet', PyJsHoisted_stackSet_) + var.put(u'ListCache', var.get(u'require')(Js(u'./_ListCache'))) + var.put(u'MapCache', var.get(u'require')(Js(u'./_MapCache'))) + var.put(u'LARGE_ARRAY_SIZE', Js(200.0)) + pass + var.get(u'module').put(u'exports', var.get(u'stackSet')) +PyJs_anonymous_3760_._set_name(u'anonymous') +PyJs_Object_3761_ = Js({u'./_ListCache':Js(287.0),u'./_MapCache':Js(289.0)}) +@Js +def PyJs_anonymous_3762_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'rsSeq', u'rsModifier', u'rsNonAstral', u'module', u'rsAstralRange', u'rsZWJ', u'rsComboSymbolsRange', u'reOptMod', u'rsRegional', u'rsFitz', u'rsSurrPair', u'rsOptJoin', u'rsAstral', u'exports', u'rsComboMarksRange', u'rsCombo', u'reComplexSymbol', u'require', u'rsSymbol', u'rsOptVar', u'rsVarRange', u'stringToArray']) + @Js + def PyJsHoisted_stringToArray_(string, this, arguments, var=var): + var = Scope({u'this':this, u'string':string, u'arguments':arguments}, var) + var.registers([u'string']) + return var.get(u'string').callprop(u'match', var.get(u'reComplexSymbol')) + PyJsHoisted_stringToArray_.func_name = u'stringToArray' + var.put(u'stringToArray', PyJsHoisted_stringToArray_) + var.put(u'rsAstralRange', Js(u'\\ud800-\\udfff')) + var.put(u'rsComboMarksRange', Js(u'\\u0300-\\u036f\\ufe20-\\ufe23')) + var.put(u'rsComboSymbolsRange', Js(u'\\u20d0-\\u20f0')) + var.put(u'rsVarRange', Js(u'\\ufe0e\\ufe0f')) + var.put(u'rsAstral', ((Js(u'[')+var.get(u'rsAstralRange'))+Js(u']'))) + var.put(u'rsCombo', (((Js(u'[')+var.get(u'rsComboMarksRange'))+var.get(u'rsComboSymbolsRange'))+Js(u']'))) + var.put(u'rsFitz', Js(u'\\ud83c[\\udffb-\\udfff]')) + var.put(u'rsModifier', ((((Js(u'(?:')+var.get(u'rsCombo'))+Js(u'|'))+var.get(u'rsFitz'))+Js(u')'))) + var.put(u'rsNonAstral', ((Js(u'[^')+var.get(u'rsAstralRange'))+Js(u']'))) + var.put(u'rsRegional', Js(u'(?:\\ud83c[\\udde6-\\uddff]){2}')) + var.put(u'rsSurrPair', Js(u'[\\ud800-\\udbff][\\udc00-\\udfff]')) + var.put(u'rsZWJ', Js(u'\\u200d')) + var.put(u'reOptMod', (var.get(u'rsModifier')+Js(u'?'))) + var.put(u'rsOptVar', ((Js(u'[')+var.get(u'rsVarRange'))+Js(u']?'))) + var.put(u'rsOptJoin', (((((((Js(u'(?:')+var.get(u'rsZWJ'))+Js(u'(?:'))+Js([var.get(u'rsNonAstral'), var.get(u'rsRegional'), var.get(u'rsSurrPair')]).callprop(u'join', Js(u'|')))+Js(u')'))+var.get(u'rsOptVar'))+var.get(u'reOptMod'))+Js(u')*'))) + var.put(u'rsSeq', ((var.get(u'rsOptVar')+var.get(u'reOptMod'))+var.get(u'rsOptJoin'))) + var.put(u'rsSymbol', ((Js(u'(?:')+Js([((var.get(u'rsNonAstral')+var.get(u'rsCombo'))+Js(u'?')), var.get(u'rsCombo'), var.get(u'rsRegional'), var.get(u'rsSurrPair'), var.get(u'rsAstral')]).callprop(u'join', Js(u'|')))+Js(u')'))) + var.put(u'reComplexSymbol', var.get(u'RegExp')((((((var.get(u'rsFitz')+Js(u'(?='))+var.get(u'rsFitz'))+Js(u')|'))+var.get(u'rsSymbol'))+var.get(u'rsSeq')), Js(u'g'))) + pass + var.get(u'module').put(u'exports', var.get(u'stringToArray')) +PyJs_anonymous_3762_._set_name(u'anonymous') +PyJs_Object_3763_ = Js({}) +@Js +def PyJs_anonymous_3764_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'stringToPath', u'require', u'module', u'toString', u'reEscapeChar', u'memoize', u'rePropName']) + var.put(u'memoize', var.get(u'require')(Js(u'./memoize'))) + var.put(u'toString', var.get(u'require')(Js(u'./toString'))) + var.put(u'rePropName', JsRegExp(u'/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|(["\'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(\\.|\\[\\])(?:\\4|$))/g')) + var.put(u'reEscapeChar', JsRegExp(u'/\\\\(\\\\)?/g')) + @Js + def PyJs_anonymous_3765_(string, this, arguments, var=var): + var = Scope({u'this':this, u'string':string, u'arguments':arguments}, var) + var.registers([u'result', u'string']) + var.put(u'result', Js([])) + @Js + def PyJs_anonymous_3766_(match, number, quote, string, this, arguments, var=var): + var = Scope({u'string':string, u'this':this, u'quote':quote, u'number':number, u'match':match, u'arguments':arguments}, var) + var.registers([u'quote', u'number', u'match', u'string']) + var.get(u'result').callprop(u'push', (var.get(u'string').callprop(u'replace', var.get(u'reEscapeChar'), Js(u'$1')) if var.get(u'quote') else (var.get(u'number') or var.get(u'match')))) + PyJs_anonymous_3766_._set_name(u'anonymous') + var.get(u'toString')(var.get(u'string')).callprop(u'replace', var.get(u'rePropName'), PyJs_anonymous_3766_) + return var.get(u'result') + PyJs_anonymous_3765_._set_name(u'anonymous') + var.put(u'stringToPath', var.get(u'memoize')(PyJs_anonymous_3765_)) + var.get(u'module').put(u'exports', var.get(u'stringToPath')) +PyJs_anonymous_3764_._set_name(u'anonymous') +PyJs_Object_3767_ = Js({u'./memoize':Js(477.0),u'./toString':Js(493.0)}) +@Js +def PyJs_anonymous_3768_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'INFINITY', u'toKey', u'require', u'module', u'isSymbol']) + @Js + def PyJsHoisted_toKey_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'result', u'value']) + if ((var.get(u'value',throw=False).typeof()==Js(u'string')) or var.get(u'isSymbol')(var.get(u'value'))): + return var.get(u'value') + var.put(u'result', (var.get(u'value')+Js(u''))) + return (Js(u'-0') if ((var.get(u'result')==Js(u'0')) and ((Js(1.0)/var.get(u'value'))==(-var.get(u'INFINITY')))) else var.get(u'result')) + PyJsHoisted_toKey_.func_name = u'toKey' + var.put(u'toKey', PyJsHoisted_toKey_) + var.put(u'isSymbol', var.get(u'require')(Js(u'./isSymbol'))) + var.put(u'INFINITY', (Js(1.0)/Js(0.0))) + pass + var.get(u'module').put(u'exports', var.get(u'toKey')) +PyJs_anonymous_3768_._set_name(u'anonymous') +PyJs_Object_3769_ = Js({u'./isSymbol':Js(472.0)}) +@Js +def PyJs_anonymous_3770_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'toSource', u'module', u'funcToString']) + @Js + def PyJsHoisted_toSource_(func, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'func':func}, var) + var.registers([u'func']) + if (var.get(u'func')!=var.get(u"null")): + try: + return var.get(u'funcToString').callprop(u'call', var.get(u'func')) + except PyJsException as PyJsTempException: + PyJsHolder_65_72408585 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_72408585 is not None: + var.own[u'e'] = PyJsHolder_65_72408585 + else: + del var.own[u'e'] + del PyJsHolder_65_72408585 + try: + return (var.get(u'func')+Js(u'')) + except PyJsException as PyJsTempException: + PyJsHolder_65_77429111 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_77429111 is not None: + var.own[u'e'] = PyJsHolder_65_77429111 + else: + del var.own[u'e'] + del PyJsHolder_65_77429111 + return Js(u'') + PyJsHoisted_toSource_.func_name = u'toSource' + var.put(u'toSource', PyJsHoisted_toSource_) + var.put(u'funcToString', var.get(u'Function').get(u'prototype').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'toSource')) +PyJs_anonymous_3770_._set_name(u'anonymous') +PyJs_Object_3771_ = Js({}) +@Js +def PyJs_anonymous_3772_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'assignValue', u'exports', u'propertyIsEnumerable', u'keys', u'copyObject', u'require', u'module', u'nonEnumShadows', u'isPrototype', u'hasOwnProperty', u'isArrayLike', u'objectProto', u'createAssigner', u'assign']) + var.put(u'assignValue', var.get(u'require')(Js(u'./_assignValue'))) + var.put(u'copyObject', var.get(u'require')(Js(u'./_copyObject'))) + var.put(u'createAssigner', var.get(u'require')(Js(u'./_createAssigner'))) + var.put(u'isArrayLike', var.get(u'require')(Js(u'./isArrayLike'))) + var.put(u'isPrototype', var.get(u'require')(Js(u'./_isPrototype'))) + var.put(u'keys', var.get(u'require')(Js(u'./keys'))) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'hasOwnProperty', var.get(u'objectProto').get(u'hasOwnProperty')) + var.put(u'propertyIsEnumerable', var.get(u'objectProto').get(u'propertyIsEnumerable')) + PyJs_Object_3773_ = Js({u'valueOf':Js(1.0)}) + var.put(u'nonEnumShadows', var.get(u'propertyIsEnumerable').callprop(u'call', PyJs_Object_3773_, Js(u'valueOf')).neg()) + @Js + def PyJs_anonymous_3774_(object, source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'object':object, u'arguments':arguments}, var) + var.registers([u'source', u'object', u'key']) + if ((var.get(u'nonEnumShadows') or var.get(u'isPrototype')(var.get(u'source'))) or var.get(u'isArrayLike')(var.get(u'source'))): + var.get(u'copyObject')(var.get(u'source'), var.get(u'keys')(var.get(u'source')), var.get(u'object')) + return var.get('undefined') + for PyJsTemp in var.get(u'source'): + var.put(u'key', PyJsTemp) + if var.get(u'hasOwnProperty').callprop(u'call', var.get(u'source'), var.get(u'key')): + var.get(u'assignValue')(var.get(u'object'), var.get(u'key'), var.get(u'source').get(var.get(u'key'))) + PyJs_anonymous_3774_._set_name(u'anonymous') + var.put(u'assign', var.get(u'createAssigner')(PyJs_anonymous_3774_)) + var.get(u'module').put(u'exports', var.get(u'assign')) +PyJs_anonymous_3772_._set_name(u'anonymous') +PyJs_Object_3775_ = Js({u'./_assignValue':Js(310.0),u'./_copyObject':Js(367.0),u'./_createAssigner':Js(370.0),u'./_isPrototype':Js(406.0),u'./isArrayLike':Js(459.0),u'./keys':Js(474.0)}) +@Js +def PyJs_anonymous_3776_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'assignValue', u'exports', u'propertyIsEnumerable', u'copyObject', u'require', u'assignIn', u'keysIn', u'isPrototype', u'module', u'isArrayLike', u'objectProto', u'nonEnumShadows', u'createAssigner']) + var.put(u'assignValue', var.get(u'require')(Js(u'./_assignValue'))) + var.put(u'copyObject', var.get(u'require')(Js(u'./_copyObject'))) + var.put(u'createAssigner', var.get(u'require')(Js(u'./_createAssigner'))) + var.put(u'isArrayLike', var.get(u'require')(Js(u'./isArrayLike'))) + var.put(u'isPrototype', var.get(u'require')(Js(u'./_isPrototype'))) + var.put(u'keysIn', var.get(u'require')(Js(u'./keysIn'))) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'propertyIsEnumerable', var.get(u'objectProto').get(u'propertyIsEnumerable')) + PyJs_Object_3777_ = Js({u'valueOf':Js(1.0)}) + var.put(u'nonEnumShadows', var.get(u'propertyIsEnumerable').callprop(u'call', PyJs_Object_3777_, Js(u'valueOf')).neg()) + @Js + def PyJs_anonymous_3778_(object, source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'object':object, u'arguments':arguments}, var) + var.registers([u'source', u'object', u'key']) + if ((var.get(u'nonEnumShadows') or var.get(u'isPrototype')(var.get(u'source'))) or var.get(u'isArrayLike')(var.get(u'source'))): + var.get(u'copyObject')(var.get(u'source'), var.get(u'keysIn')(var.get(u'source')), var.get(u'object')) + return var.get('undefined') + for PyJsTemp in var.get(u'source'): + var.put(u'key', PyJsTemp) + var.get(u'assignValue')(var.get(u'object'), var.get(u'key'), var.get(u'source').get(var.get(u'key'))) + PyJs_anonymous_3778_._set_name(u'anonymous') + var.put(u'assignIn', var.get(u'createAssigner')(PyJs_anonymous_3778_)) + var.get(u'module').put(u'exports', var.get(u'assignIn')) +PyJs_anonymous_3776_._set_name(u'anonymous') +PyJs_Object_3779_ = Js({u'./_assignValue':Js(310.0),u'./_copyObject':Js(367.0),u'./_createAssigner':Js(370.0),u'./_isPrototype':Js(406.0),u'./isArrayLike':Js(459.0),u'./keysIn':Js(475.0)}) +@Js +def PyJs_anonymous_3780_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'copyObject', u'require', u'module', u'keysIn', u'assignInWith', u'createAssigner']) + var.put(u'copyObject', var.get(u'require')(Js(u'./_copyObject'))) + var.put(u'createAssigner', var.get(u'require')(Js(u'./_createAssigner'))) + var.put(u'keysIn', var.get(u'require')(Js(u'./keysIn'))) + @Js + def PyJs_anonymous_3781_(object, source, srcIndex, customizer, this, arguments, var=var): + var = Scope({u'source':source, u'customizer':customizer, u'arguments':arguments, u'srcIndex':srcIndex, u'this':this, u'object':object}, var) + var.registers([u'source', u'object', u'srcIndex', u'customizer']) + var.get(u'copyObject')(var.get(u'source'), var.get(u'keysIn')(var.get(u'source')), var.get(u'object'), var.get(u'customizer')) + PyJs_anonymous_3781_._set_name(u'anonymous') + var.put(u'assignInWith', var.get(u'createAssigner')(PyJs_anonymous_3781_)) + var.get(u'module').put(u'exports', var.get(u'assignInWith')) +PyJs_anonymous_3780_._set_name(u'anonymous') +PyJs_Object_3782_ = Js({u'./_copyObject':Js(367.0),u'./_createAssigner':Js(370.0),u'./keysIn':Js(475.0)}) +@Js +def PyJs_anonymous_3783_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'clone', u'exports', u'require', u'module', u'baseClone']) + @Js + def PyJsHoisted_clone_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return var.get(u'baseClone')(var.get(u'value'), Js(False), var.get(u'true')) + PyJsHoisted_clone_.func_name = u'clone' + var.put(u'clone', PyJsHoisted_clone_) + var.put(u'baseClone', var.get(u'require')(Js(u'./_baseClone'))) + pass + var.get(u'module').put(u'exports', var.get(u'clone')) +PyJs_anonymous_3783_._set_name(u'anonymous') +PyJs_Object_3784_ = Js({u'./_baseClone':Js(314.0)}) +@Js +def PyJs_anonymous_3785_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'cloneDeep', u'exports', u'module', u'baseClone']) + @Js + def PyJsHoisted_cloneDeep_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return var.get(u'baseClone')(var.get(u'value'), var.get(u'true'), var.get(u'true')) + PyJsHoisted_cloneDeep_.func_name = u'cloneDeep' + var.put(u'cloneDeep', PyJsHoisted_cloneDeep_) + var.put(u'baseClone', var.get(u'require')(Js(u'./_baseClone'))) + pass + var.get(u'module').put(u'exports', var.get(u'cloneDeep')) +PyJs_anonymous_3785_._set_name(u'anonymous') +PyJs_Object_3786_ = Js({u'./_baseClone':Js(314.0)}) +@Js +def PyJs_anonymous_3787_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'cloneDeepWith', u'require', u'exports', u'module', u'baseClone']) + @Js + def PyJsHoisted_cloneDeepWith_(value, customizer, this, arguments, var=var): + var = Scope({u'this':this, u'customizer':customizer, u'arguments':arguments, u'value':value}, var) + var.registers([u'customizer', u'value']) + return var.get(u'baseClone')(var.get(u'value'), var.get(u'true'), var.get(u'true'), var.get(u'customizer')) + PyJsHoisted_cloneDeepWith_.func_name = u'cloneDeepWith' + var.put(u'cloneDeepWith', PyJsHoisted_cloneDeepWith_) + var.put(u'baseClone', var.get(u'require')(Js(u'./_baseClone'))) + pass + var.get(u'module').put(u'exports', var.get(u'cloneDeepWith')) +PyJs_anonymous_3787_._set_name(u'anonymous') +PyJs_Object_3788_ = Js({u'./_baseClone':Js(314.0)}) +@Js +def PyJs_anonymous_3789_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'compact', u'require', u'exports', u'module']) + @Js + def PyJsHoisted_compact_(array, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'arguments':arguments}, var) + var.registers([u'index', u'resIndex', u'value', u'length', u'result', u'array']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', (var.get(u'array').get(u'length') if var.get(u'array') else Js(0.0))) + var.put(u'resIndex', Js(0.0)) + var.put(u'result', Js([])) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'value', var.get(u'array').get(var.get(u'index'))) + if var.get(u'value'): + var.get(u'result').put((var.put(u'resIndex',Js(var.get(u'resIndex').to_number())+Js(1))-Js(1)), var.get(u'value')) + return var.get(u'result') + PyJsHoisted_compact_.func_name = u'compact' + var.put(u'compact', PyJsHoisted_compact_) + pass + var.get(u'module').put(u'exports', var.get(u'compact')) +PyJs_anonymous_3789_._set_name(u'anonymous') +PyJs_Object_3790_ = Js({}) +@Js +def PyJs_anonymous_3791_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'defaults', u'require', u'assignInDefaults', u'rest', u'module', u'assignInWith', u'apply']) + var.put(u'apply', var.get(u'require')(Js(u'./_apply'))) + var.put(u'assignInDefaults', var.get(u'require')(Js(u'./_assignInDefaults'))) + var.put(u'assignInWith', var.get(u'require')(Js(u'./assignInWith'))) + var.put(u'rest', var.get(u'require')(Js(u'./rest'))) + @Js + def PyJs_anonymous_3792_(args, this, arguments, var=var): + var = Scope({u'this':this, u'args':args, u'arguments':arguments}, var) + var.registers([u'args']) + var.get(u'args').callprop(u'push', var.get(u'undefined'), var.get(u'assignInDefaults')) + return var.get(u'apply')(var.get(u'assignInWith'), var.get(u'undefined'), var.get(u'args')) + PyJs_anonymous_3792_._set_name(u'anonymous') + var.put(u'defaults', var.get(u'rest')(PyJs_anonymous_3792_)) + var.get(u'module').put(u'exports', var.get(u'defaults')) +PyJs_anonymous_3791_._set_name(u'anonymous') +PyJs_Object_3793_ = Js({u'./_apply':Js(300.0),u'./_assignInDefaults':Js(308.0),u'./assignInWith':Js(437.0),u'./rest':Js(484.0)}) +@Js +def PyJs_anonymous_3794_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./forEach'))) +PyJs_anonymous_3794_._set_name(u'anonymous') +PyJs_Object_3795_ = Js({u'./forEach':Js(451.0)}) +@Js +def PyJs_anonymous_3796_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'eq', u'exports', u'module']) + @Js + def PyJsHoisted_eq_(value, other, this, arguments, var=var): + var = Scope({u'this':this, u'other':other, u'arguments':arguments, u'value':value}, var) + var.registers([u'other', u'value']) + return (PyJsStrictEq(var.get(u'value'),var.get(u'other')) or (PyJsStrictNeq(var.get(u'value'),var.get(u'value')) and PyJsStrictNeq(var.get(u'other'),var.get(u'other')))) + PyJsHoisted_eq_.func_name = u'eq' + var.put(u'eq', PyJsHoisted_eq_) + pass + var.get(u'module').put(u'exports', var.get(u'eq')) +PyJs_anonymous_3796_._set_name(u'anonymous') +PyJs_Object_3797_ = Js({}) +@Js +def PyJs_anonymous_3798_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'reHasRegExpChar', u'require', u'module', u'toString', u'reRegExpChar', u'escapeRegExp']) + @Js + def PyJsHoisted_escapeRegExp_(string, this, arguments, var=var): + var = Scope({u'this':this, u'string':string, u'arguments':arguments}, var) + var.registers([u'string']) + var.put(u'string', var.get(u'toString')(var.get(u'string'))) + return (var.get(u'string').callprop(u'replace', var.get(u'reRegExpChar'), Js(u'\\$&')) if (var.get(u'string') and var.get(u'reHasRegExpChar').callprop(u'test', var.get(u'string'))) else var.get(u'string')) + PyJsHoisted_escapeRegExp_.func_name = u'escapeRegExp' + var.put(u'escapeRegExp', PyJsHoisted_escapeRegExp_) + var.put(u'toString', var.get(u'require')(Js(u'./toString'))) + var.put(u'reRegExpChar', JsRegExp(u'/[\\\\^$.*+?()[\\]{}|]/g')) + var.put(u'reHasRegExpChar', var.get(u'RegExp')(var.get(u'reRegExpChar').get(u'source'))) + pass + var.get(u'module').put(u'exports', var.get(u'escapeRegExp')) +PyJs_anonymous_3798_._set_name(u'anonymous') +PyJs_Object_3799_ = Js({u'./toString':Js(493.0)}) +@Js +def PyJs_anonymous_3800_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./assignIn'))) +PyJs_anonymous_3800_._set_name(u'anonymous') +PyJs_Object_3801_ = Js({u'./assignIn':Js(436.0)}) +@Js +def PyJs_anonymous_3802_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'createFind', u'require', u'findIndex', u'module', u'find']) + var.put(u'createFind', var.get(u'require')(Js(u'./_createFind'))) + var.put(u'findIndex', var.get(u'require')(Js(u'./findIndex'))) + var.put(u'find', var.get(u'createFind')(var.get(u'findIndex'))) + var.get(u'module').put(u'exports', var.get(u'find')) +PyJs_anonymous_3802_._set_name(u'anonymous') +PyJs_Object_3803_ = Js({u'./_createFind':Js(373.0),u'./findIndex':Js(448.0)}) +@Js +def PyJs_anonymous_3804_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'findIndex', u'nativeMax', u'toInteger', u'baseIteratee', u'exports', u'module', u'baseFindIndex', u'require']) + @Js + def PyJsHoisted_findIndex_(array, predicate, fromIndex, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'array':array, u'predicate':predicate, u'fromIndex':fromIndex}, var) + var.registers([u'index', u'length', u'predicate', u'array', u'fromIndex']) + var.put(u'length', (var.get(u'array').get(u'length') if var.get(u'array') else Js(0.0))) + if var.get(u'length').neg(): + return (-Js(1.0)) + var.put(u'index', (Js(0.0) if (var.get(u'fromIndex')==var.get(u"null")) else var.get(u'toInteger')(var.get(u'fromIndex')))) + if (var.get(u'index')<Js(0.0)): + var.put(u'index', var.get(u'nativeMax')((var.get(u'length')+var.get(u'index')), Js(0.0))) + return var.get(u'baseFindIndex')(var.get(u'array'), var.get(u'baseIteratee')(var.get(u'predicate'), Js(3.0)), var.get(u'index')) + PyJsHoisted_findIndex_.func_name = u'findIndex' + var.put(u'findIndex', PyJsHoisted_findIndex_) + var.put(u'baseFindIndex', var.get(u'require')(Js(u'./_baseFindIndex'))) + var.put(u'baseIteratee', var.get(u'require')(Js(u'./_baseIteratee'))) + var.put(u'toInteger', var.get(u'require')(Js(u'./toInteger'))) + var.put(u'nativeMax', var.get(u'Math').get(u'max')) + pass + var.get(u'module').put(u'exports', var.get(u'findIndex')) +PyJs_anonymous_3804_._set_name(u'anonymous') +PyJs_Object_3805_ = Js({u'./_baseFindIndex':Js(317.0),u'./_baseIteratee':Js(331.0),u'./toInteger':Js(490.0)}) +@Js +def PyJs_anonymous_3806_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'findLastIndex', u'createFind', u'require', u'module', u'findLast']) + var.put(u'createFind', var.get(u'require')(Js(u'./_createFind'))) + var.put(u'findLastIndex', var.get(u'require')(Js(u'./findLastIndex'))) + var.put(u'findLast', var.get(u'createFind')(var.get(u'findLastIndex'))) + var.get(u'module').put(u'exports', var.get(u'findLast')) +PyJs_anonymous_3806_._set_name(u'anonymous') +PyJs_Object_3807_ = Js({u'./_createFind':Js(373.0),u'./findLastIndex':Js(450.0)}) +@Js +def PyJs_anonymous_3808_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'findLastIndex', u'nativeMax', u'toInteger', u'baseIteratee', u'module', u'nativeMin', u'baseFindIndex', u'require']) + @Js + def PyJsHoisted_findLastIndex_(array, predicate, fromIndex, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'array':array, u'predicate':predicate, u'fromIndex':fromIndex}, var) + var.registers([u'index', u'length', u'predicate', u'array', u'fromIndex']) + var.put(u'length', (var.get(u'array').get(u'length') if var.get(u'array') else Js(0.0))) + if var.get(u'length').neg(): + return (-Js(1.0)) + var.put(u'index', (var.get(u'length')-Js(1.0))) + if PyJsStrictNeq(var.get(u'fromIndex'),var.get(u'undefined')): + var.put(u'index', var.get(u'toInteger')(var.get(u'fromIndex'))) + var.put(u'index', (var.get(u'nativeMax')((var.get(u'length')+var.get(u'index')), Js(0.0)) if (var.get(u'fromIndex')<Js(0.0)) else var.get(u'nativeMin')(var.get(u'index'), (var.get(u'length')-Js(1.0))))) + return var.get(u'baseFindIndex')(var.get(u'array'), var.get(u'baseIteratee')(var.get(u'predicate'), Js(3.0)), var.get(u'index'), var.get(u'true')) + PyJsHoisted_findLastIndex_.func_name = u'findLastIndex' + var.put(u'findLastIndex', PyJsHoisted_findLastIndex_) + var.put(u'baseFindIndex', var.get(u'require')(Js(u'./_baseFindIndex'))) + var.put(u'baseIteratee', var.get(u'require')(Js(u'./_baseIteratee'))) + var.put(u'toInteger', var.get(u'require')(Js(u'./toInteger'))) + var.put(u'nativeMax', var.get(u'Math').get(u'max')) + var.put(u'nativeMin', var.get(u'Math').get(u'min')) + pass + var.get(u'module').put(u'exports', var.get(u'findLastIndex')) +PyJs_anonymous_3808_._set_name(u'anonymous') +PyJs_Object_3809_ = Js({u'./_baseFindIndex':Js(317.0),u'./_baseIteratee':Js(331.0),u'./toInteger':Js(490.0)}) +@Js +def PyJs_anonymous_3810_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseEach', u'isArray', u'exports', u'arrayEach', u'require', u'baseIteratee', u'module', u'forEach']) + @Js + def PyJsHoisted_forEach_(collection, iteratee, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'collection':collection, u'iteratee':iteratee}, var) + var.registers([u'collection', u'func', u'iteratee']) + var.put(u'func', (var.get(u'arrayEach') if var.get(u'isArray')(var.get(u'collection')) else var.get(u'baseEach'))) + return var.get(u'func')(var.get(u'collection'), var.get(u'baseIteratee')(var.get(u'iteratee'), Js(3.0))) + PyJsHoisted_forEach_.func_name = u'forEach' + var.put(u'forEach', PyJsHoisted_forEach_) + var.put(u'arrayEach', var.get(u'require')(Js(u'./_arrayEach'))) + var.put(u'baseEach', var.get(u'require')(Js(u'./_baseEach'))) + var.put(u'baseIteratee', var.get(u'require')(Js(u'./_baseIteratee'))) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + pass + var.get(u'module').put(u'exports', var.get(u'forEach')) +PyJs_anonymous_3810_._set_name(u'anonymous') +PyJs_Object_3811_ = Js({u'./_arrayEach':Js(301.0),u'./_baseEach':Js(316.0),u'./_baseIteratee':Js(331.0),u'./isArray':Js(458.0)}) +@Js +def PyJs_anonymous_3812_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseGet', u'exports', u'require', u'module', u'get']) + @Js + def PyJsHoisted_get_(object, path, defaultValue, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'defaultValue':defaultValue, u'object':object, u'arguments':arguments}, var) + var.registers([u'path', u'defaultValue', u'object', u'result']) + var.put(u'result', (var.get(u'undefined') if (var.get(u'object')==var.get(u"null")) else var.get(u'baseGet')(var.get(u'object'), var.get(u'path')))) + return (var.get(u'defaultValue') if PyJsStrictEq(var.get(u'result'),var.get(u'undefined')) else var.get(u'result')) + PyJsHoisted_get_.func_name = u'get' + var.put(u'get', PyJsHoisted_get_) + var.put(u'baseGet', var.get(u'require')(Js(u'./_baseGet'))) + pass + var.get(u'module').put(u'exports', var.get(u'get')) +PyJs_anonymous_3812_._set_name(u'anonymous') +PyJs_Object_3813_ = Js({u'./_baseGet':Js(321.0)}) +@Js +def PyJs_anonymous_3814_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'hasPath', u'baseHas', u'require', u'exports', u'module', u'has']) + @Js + def PyJsHoisted_has_(object, path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'object':object, u'arguments':arguments}, var) + var.registers([u'path', u'object']) + return ((var.get(u'object')!=var.get(u"null")) and var.get(u'hasPath')(var.get(u'object'), var.get(u'path'), var.get(u'baseHas'))) + PyJsHoisted_has_.func_name = u'has' + var.put(u'has', PyJsHoisted_has_) + var.put(u'baseHas', var.get(u'require')(Js(u'./_baseHas'))) + var.put(u'hasPath', var.get(u'require')(Js(u'./_hasPath'))) + pass + var.get(u'module').put(u'exports', var.get(u'has')) +PyJs_anonymous_3814_._set_name(u'anonymous') +PyJs_Object_3815_ = Js({u'./_baseHas':Js(323.0),u'./_hasPath':Js(387.0)}) +@Js +def PyJs_anonymous_3816_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'hasPath', u'hasIn', u'require', u'exports', u'module', u'baseHasIn']) + @Js + def PyJsHoisted_hasIn_(object, path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'object':object, u'arguments':arguments}, var) + var.registers([u'path', u'object']) + return ((var.get(u'object')!=var.get(u"null")) and var.get(u'hasPath')(var.get(u'object'), var.get(u'path'), var.get(u'baseHasIn'))) + PyJsHoisted_hasIn_.func_name = u'hasIn' + var.put(u'hasIn', PyJsHoisted_hasIn_) + var.put(u'baseHasIn', var.get(u'require')(Js(u'./_baseHasIn'))) + var.put(u'hasPath', var.get(u'require')(Js(u'./_hasPath'))) + pass + var.get(u'module').put(u'exports', var.get(u'hasIn')) +PyJs_anonymous_3816_._set_name(u'anonymous') +PyJs_Object_3817_ = Js({u'./_baseHasIn':Js(324.0),u'./_hasPath':Js(387.0)}) +@Js +def PyJs_anonymous_3818_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'identity']) + @Js + def PyJsHoisted_identity_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return var.get(u'value') + PyJsHoisted_identity_.func_name = u'identity' + var.put(u'identity', PyJsHoisted_identity_) + pass + var.get(u'module').put(u'exports', var.get(u'identity')) +PyJs_anonymous_3818_._set_name(u'anonymous') +PyJs_Object_3819_ = Js({}) +@Js +def PyJs_anonymous_3820_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseIndexOf', u'exports', u'isString', u'nativeMax', u'isArrayLike', u'toInteger', u'module', u'includes', u'values', u'require']) + @Js + def PyJsHoisted_includes_(collection, value, fromIndex, guard, this, arguments, var=var): + var = Scope({u'guard':guard, u'collection':collection, u'this':this, u'fromIndex':fromIndex, u'value':value, u'arguments':arguments}, var) + var.registers([u'length', u'guard', u'value', u'collection', u'fromIndex']) + var.put(u'collection', (var.get(u'collection') if var.get(u'isArrayLike')(var.get(u'collection')) else var.get(u'values')(var.get(u'collection')))) + var.put(u'fromIndex', (var.get(u'toInteger')(var.get(u'fromIndex')) if (var.get(u'fromIndex') and var.get(u'guard').neg()) else Js(0.0))) + var.put(u'length', var.get(u'collection').get(u'length')) + if (var.get(u'fromIndex')<Js(0.0)): + var.put(u'fromIndex', var.get(u'nativeMax')((var.get(u'length')+var.get(u'fromIndex')), Js(0.0))) + return (((var.get(u'fromIndex')<=var.get(u'length')) and (var.get(u'collection').callprop(u'indexOf', var.get(u'value'), var.get(u'fromIndex'))>(-Js(1.0)))) if var.get(u'isString')(var.get(u'collection')) else (var.get(u'length').neg().neg() and (var.get(u'baseIndexOf')(var.get(u'collection'), var.get(u'value'), var.get(u'fromIndex'))>(-Js(1.0))))) + PyJsHoisted_includes_.func_name = u'includes' + var.put(u'includes', PyJsHoisted_includes_) + var.put(u'baseIndexOf', var.get(u'require')(Js(u'./_baseIndexOf'))) + var.put(u'isArrayLike', var.get(u'require')(Js(u'./isArrayLike'))) + var.put(u'isString', var.get(u'require')(Js(u'./isString'))) + var.put(u'toInteger', var.get(u'require')(Js(u'./toInteger'))) + var.put(u'values', var.get(u'require')(Js(u'./values'))) + var.put(u'nativeMax', var.get(u'Math').get(u'max')) + pass + var.get(u'module').put(u'exports', var.get(u'includes')) +PyJs_anonymous_3820_._set_name(u'anonymous') +PyJs_Object_3821_ = Js({u'./_baseIndexOf':Js(325.0),u'./isArrayLike':Js(459.0),u'./isString':Js(471.0),u'./toInteger':Js(490.0),u'./values':Js(496.0)}) +@Js +def PyJs_anonymous_3822_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'propertyIsEnumerable', u'exports', u'objectToString', u'require', u'module', u'hasOwnProperty', u'isArrayLikeObject', u'objectProto', u'argsTag', u'isArguments']) + @Js + def PyJsHoisted_isArguments_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'isArrayLikeObject')(var.get(u'value')) and var.get(u'hasOwnProperty').callprop(u'call', var.get(u'value'), Js(u'callee'))) and (var.get(u'propertyIsEnumerable').callprop(u'call', var.get(u'value'), Js(u'callee')).neg() or (var.get(u'objectToString').callprop(u'call', var.get(u'value'))==var.get(u'argsTag')))) + PyJsHoisted_isArguments_.func_name = u'isArguments' + var.put(u'isArguments', PyJsHoisted_isArguments_) + var.put(u'isArrayLikeObject', var.get(u'require')(Js(u'./isArrayLikeObject'))) + var.put(u'argsTag', Js(u'[object Arguments]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'hasOwnProperty', var.get(u'objectProto').get(u'hasOwnProperty')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + var.put(u'propertyIsEnumerable', var.get(u'objectProto').get(u'propertyIsEnumerable')) + pass + var.get(u'module').put(u'exports', var.get(u'isArguments')) +PyJs_anonymous_3822_._set_name(u'anonymous') +PyJs_Object_3823_ = Js({u'./isArrayLikeObject':Js(460.0)}) +@Js +def PyJs_anonymous_3824_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'require', u'exports', u'module']) + var.put(u'isArray', var.get(u'Array').get(u'isArray')) + var.get(u'module').put(u'exports', var.get(u'isArray')) +PyJs_anonymous_3824_._set_name(u'anonymous') +PyJs_Object_3825_ = Js({}) +@Js +def PyJs_anonymous_3826_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'isLength', u'getLength', u'require', u'module', u'isArrayLike', u'isFunction']) + @Js + def PyJsHoisted_isArrayLike_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (((var.get(u'value')!=var.get(u"null")) and var.get(u'isLength')(var.get(u'getLength')(var.get(u'value')))) and var.get(u'isFunction')(var.get(u'value')).neg()) + PyJsHoisted_isArrayLike_.func_name = u'isArrayLike' + var.put(u'isArrayLike', PyJsHoisted_isArrayLike_) + var.put(u'getLength', var.get(u'require')(Js(u'./_getLength'))) + var.put(u'isFunction', var.get(u'require')(Js(u'./isFunction'))) + var.put(u'isLength', var.get(u'require')(Js(u'./isLength'))) + pass + var.get(u'module').put(u'exports', var.get(u'isArrayLike')) +PyJs_anonymous_3826_._set_name(u'anonymous') +PyJs_Object_3827_ = Js({u'./_getLength':Js(379.0),u'./isFunction':Js(463.0),u'./isLength':Js(465.0)}) +@Js +def PyJs_anonymous_3828_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'isArrayLike', u'require', u'module', u'isArrayLikeObject', u'isObjectLike']) + @Js + def PyJsHoisted_isArrayLikeObject_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'isObjectLike')(var.get(u'value')) and var.get(u'isArrayLike')(var.get(u'value'))) + PyJsHoisted_isArrayLikeObject_.func_name = u'isArrayLikeObject' + var.put(u'isArrayLikeObject', PyJsHoisted_isArrayLikeObject_) + var.put(u'isArrayLike', var.get(u'require')(Js(u'./isArrayLike'))) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + pass + var.get(u'module').put(u'exports', var.get(u'isArrayLikeObject')) +PyJs_anonymous_3828_._set_name(u'anonymous') +PyJs_Object_3829_ = Js({u'./isArrayLike':Js(459.0),u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3830_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'isBoolean', u'objectToString', u'require', u'boolTag', u'module', u'isObjectLike', u'objectProto']) + @Js + def PyJsHoisted_isBoolean_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((PyJsStrictEq(var.get(u'value'),var.get(u'true')) or PyJsStrictEq(var.get(u'value'),Js(False))) or (var.get(u'isObjectLike')(var.get(u'value')) and (var.get(u'objectToString').callprop(u'call', var.get(u'value'))==var.get(u'boolTag')))) + PyJsHoisted_isBoolean_.func_name = u'isBoolean' + var.put(u'isBoolean', PyJsHoisted_isBoolean_) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + var.put(u'boolTag', Js(u'[object Boolean]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isBoolean')) +PyJs_anonymous_3830_._set_name(u'anonymous') +PyJs_Object_3831_ = Js({u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3832_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'freeModule', u'Buffer', u'root', u'require', u'freeExports', u'module', u'moduleExports', u'stubFalse', u'isBuffer']) + var.put(u'root', var.get(u'require')(Js(u'./_root'))) + var.put(u'stubFalse', var.get(u'require')(Js(u'./stubFalse'))) + var.put(u'freeExports', ((var.get(u'exports',throw=False).typeof()==Js(u'object')) and var.get(u'exports'))) + var.put(u'freeModule', ((var.get(u'freeExports') and (var.get(u'module',throw=False).typeof()==Js(u'object'))) and var.get(u'module'))) + var.put(u'moduleExports', (var.get(u'freeModule') and PyJsStrictEq(var.get(u'freeModule').get(u'exports'),var.get(u'freeExports')))) + var.put(u'Buffer', (var.get(u'root').get(u'Buffer') if var.get(u'moduleExports') else var.get(u'undefined'))) + @Js + def PyJs_anonymous_3833_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return var.get(u'value').instanceof(var.get(u'Buffer')) + PyJs_anonymous_3833_._set_name(u'anonymous') + var.put(u'isBuffer', (var.get(u'stubFalse') if var.get(u'Buffer').neg() else PyJs_anonymous_3833_)) + var.get(u'module').put(u'exports', var.get(u'isBuffer')) +PyJs_anonymous_3832_._set_name(u'anonymous') +PyJs_Object_3834_ = Js({u'./_root':Js(422.0),u'./stubFalse':Js(488.0)}) +@Js +def PyJs_anonymous_3835_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'genTag', u'exports', u'module', u'objectToString', u'require', u'isFunction', u'funcTag', u'objectProto', u'isObject']) + @Js + def PyJsHoisted_isFunction_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'tag', u'value']) + var.put(u'tag', (var.get(u'objectToString').callprop(u'call', var.get(u'value')) if var.get(u'isObject')(var.get(u'value')) else Js(u''))) + return ((var.get(u'tag')==var.get(u'funcTag')) or (var.get(u'tag')==var.get(u'genTag'))) + PyJsHoisted_isFunction_.func_name = u'isFunction' + var.put(u'isFunction', PyJsHoisted_isFunction_) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + var.put(u'funcTag', Js(u'[object Function]')) + var.put(u'genTag', Js(u'[object GeneratorFunction]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isFunction')) +PyJs_anonymous_3835_._set_name(u'anonymous') +PyJs_Object_3836_ = Js({u'./isObject':Js(467.0)}) +@Js +def PyJs_anonymous_3837_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'toInteger', u'exports', u'require', u'module', u'isInteger']) + @Js + def PyJsHoisted_isInteger_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'value',throw=False).typeof()==Js(u'number')) and (var.get(u'value')==var.get(u'toInteger')(var.get(u'value')))) + PyJsHoisted_isInteger_.func_name = u'isInteger' + var.put(u'isInteger', PyJsHoisted_isInteger_) + var.put(u'toInteger', var.get(u'require')(Js(u'./toInteger'))) + pass + var.get(u'module').put(u'exports', var.get(u'isInteger')) +PyJs_anonymous_3837_._set_name(u'anonymous') +PyJs_Object_3838_ = Js({u'./toInteger':Js(490.0)}) +@Js +def PyJs_anonymous_3839_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'MAX_SAFE_INTEGER', u'require', u'isLength', u'exports', u'module']) + @Js + def PyJsHoisted_isLength_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((((var.get(u'value',throw=False).typeof()==Js(u'number')) and (var.get(u'value')>(-Js(1.0)))) and ((var.get(u'value')%Js(1.0))==Js(0.0))) and (var.get(u'value')<=var.get(u'MAX_SAFE_INTEGER'))) + PyJsHoisted_isLength_.func_name = u'isLength' + var.put(u'isLength', PyJsHoisted_isLength_) + var.put(u'MAX_SAFE_INTEGER', Js(9007199254740991.0)) + pass + var.get(u'module').put(u'exports', var.get(u'isLength')) +PyJs_anonymous_3839_._set_name(u'anonymous') +PyJs_Object_3840_ = Js({}) +@Js +def PyJs_anonymous_3841_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'objectToString', u'require', u'module', u'numberTag', u'isObjectLike', u'objectProto', u'isNumber']) + @Js + def PyJsHoisted_isNumber_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'value',throw=False).typeof()==Js(u'number')) or (var.get(u'isObjectLike')(var.get(u'value')) and (var.get(u'objectToString').callprop(u'call', var.get(u'value'))==var.get(u'numberTag')))) + PyJsHoisted_isNumber_.func_name = u'isNumber' + var.put(u'isNumber', PyJsHoisted_isNumber_) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + var.put(u'numberTag', Js(u'[object Number]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isNumber')) +PyJs_anonymous_3841_._set_name(u'anonymous') +PyJs_Object_3842_ = Js({u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3843_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'isObject', u'module']) + @Js + def PyJsHoisted_isObject_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'type', u'value']) + var.put(u'type', var.get(u'value',throw=False).typeof()) + return (var.get(u'value').neg().neg() and ((var.get(u'type')==Js(u'object')) or (var.get(u'type')==Js(u'function')))) + PyJsHoisted_isObject_.func_name = u'isObject' + var.put(u'isObject', PyJsHoisted_isObject_) + pass + var.get(u'module').put(u'exports', var.get(u'isObject')) +PyJs_anonymous_3843_._set_name(u'anonymous') +PyJs_Object_3844_ = Js({}) +@Js +def PyJs_anonymous_3845_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isObjectLike', u'require', u'exports', u'module']) + @Js + def PyJsHoisted_isObjectLike_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'value').neg().neg() and (var.get(u'value',throw=False).typeof()==Js(u'object'))) + PyJsHoisted_isObjectLike_.func_name = u'isObjectLike' + var.put(u'isObjectLike', PyJsHoisted_isObjectLike_) + pass + var.get(u'module').put(u'exports', var.get(u'isObjectLike')) +PyJs_anonymous_3845_._set_name(u'anonymous') +PyJs_Object_3846_ = Js({}) +@Js +def PyJs_anonymous_3847_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'isPlainObject', u'objectTag', u'funcToString', u'isHostObject', u'objectCtorString', u'require', u'objectToString', u'module', u'hasOwnProperty', u'isObjectLike', u'getPrototype', u'objectProto']) + @Js + def PyJsHoisted_isPlainObject_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value', u'Ctor', u'proto']) + if ((var.get(u'isObjectLike')(var.get(u'value')).neg() or (var.get(u'objectToString').callprop(u'call', var.get(u'value'))!=var.get(u'objectTag'))) or var.get(u'isHostObject')(var.get(u'value'))): + return Js(False) + var.put(u'proto', var.get(u'getPrototype')(var.get(u'value'))) + if PyJsStrictEq(var.get(u'proto'),var.get(u"null")): + return var.get(u'true') + var.put(u'Ctor', (var.get(u'hasOwnProperty').callprop(u'call', var.get(u'proto'), Js(u'constructor')) and var.get(u'proto').get(u'constructor'))) + return (((var.get(u'Ctor',throw=False).typeof()==Js(u'function')) and var.get(u'Ctor').instanceof(var.get(u'Ctor'))) and (var.get(u'funcToString').callprop(u'call', var.get(u'Ctor'))==var.get(u'objectCtorString'))) + PyJsHoisted_isPlainObject_.func_name = u'isPlainObject' + var.put(u'isPlainObject', PyJsHoisted_isPlainObject_) + var.put(u'getPrototype', var.get(u'require')(Js(u'./_getPrototype'))) + var.put(u'isHostObject', var.get(u'require')(Js(u'./_isHostObject'))) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + var.put(u'objectTag', Js(u'[object Object]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'funcToString', var.get(u'Function').get(u'prototype').get(u'toString')) + var.put(u'hasOwnProperty', var.get(u'objectProto').get(u'hasOwnProperty')) + var.put(u'objectCtorString', var.get(u'funcToString').callprop(u'call', var.get(u'Object'))) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isPlainObject')) +PyJs_anonymous_3847_._set_name(u'anonymous') +PyJs_Object_3848_ = Js({u'./_getPrototype':Js(383.0),u'./_isHostObject':Js(400.0),u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3849_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'regexpTag', u'exports', u'objectToString', u'require', u'module', u'objectProto', u'isObject', u'isRegExp']) + @Js + def PyJsHoisted_isRegExp_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'isObject')(var.get(u'value')) and (var.get(u'objectToString').callprop(u'call', var.get(u'value'))==var.get(u'regexpTag'))) + PyJsHoisted_isRegExp_.func_name = u'isRegExp' + var.put(u'isRegExp', PyJsHoisted_isRegExp_) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + var.put(u'regexpTag', Js(u'[object RegExp]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isRegExp')) +PyJs_anonymous_3849_._set_name(u'anonymous') +PyJs_Object_3850_ = Js({u'./isObject':Js(467.0)}) +@Js +def PyJs_anonymous_3851_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'exports', u'isString', u'objectToString', u'require', u'stringTag', u'module', u'isObjectLike', u'objectProto']) + @Js + def PyJsHoisted_isString_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'value',throw=False).typeof()==Js(u'string')) or ((var.get(u'isArray')(var.get(u'value')).neg() and var.get(u'isObjectLike')(var.get(u'value'))) and (var.get(u'objectToString').callprop(u'call', var.get(u'value'))==var.get(u'stringTag')))) + PyJsHoisted_isString_.func_name = u'isString' + var.put(u'isString', PyJsHoisted_isString_) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + var.put(u'stringTag', Js(u'[object String]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isString')) +PyJs_anonymous_3851_._set_name(u'anonymous') +PyJs_Object_3852_ = Js({u'./isArray':Js(458.0),u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3853_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'objectToString', u'require', u'module', u'isObjectLike', u'objectProto', u'isSymbol', u'symbolTag']) + @Js + def PyJsHoisted_isSymbol_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'value',throw=False).typeof()==Js(u'symbol')) or (var.get(u'isObjectLike')(var.get(u'value')) and (var.get(u'objectToString').callprop(u'call', var.get(u'value'))==var.get(u'symbolTag')))) + PyJsHoisted_isSymbol_.func_name = u'isSymbol' + var.put(u'isSymbol', PyJsHoisted_isSymbol_) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + var.put(u'symbolTag', Js(u'[object Symbol]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isSymbol')) +PyJs_anonymous_3853_._set_name(u'anonymous') +PyJs_Object_3854_ = Js({u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3855_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'arrayTag', u'typedArrayTags', u'uint32Tag', u'arrayBufferTag', u'objectTag', u'dataViewTag', u'int8Tag', u'isObjectLike', u'errorTag', u'float64Tag', u'isLength', u'boolTag', u'funcTag', u'isTypedArray', u'float32Tag', u'argsTag', u'regexpTag', u'exports', u'dateTag', u'setTag', u'stringTag', u'int32Tag', u'module', u'mapTag', u'uint8Tag', u'require', u'objectToString', u'uint16Tag', u'weakMapTag', u'int16Tag', u'numberTag', u'objectProto', u'uint8ClampedTag']) + @Js + def PyJsHoisted_isTypedArray_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'isObjectLike')(var.get(u'value')) and var.get(u'isLength')(var.get(u'value').get(u'length'))) and var.get(u'typedArrayTags').get(var.get(u'objectToString').callprop(u'call', var.get(u'value'))).neg().neg()) + PyJsHoisted_isTypedArray_.func_name = u'isTypedArray' + var.put(u'isTypedArray', PyJsHoisted_isTypedArray_) + var.put(u'isLength', var.get(u'require')(Js(u'./isLength'))) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + var.put(u'argsTag', Js(u'[object Arguments]')) + var.put(u'arrayTag', Js(u'[object Array]')) + var.put(u'boolTag', Js(u'[object Boolean]')) + var.put(u'dateTag', Js(u'[object Date]')) + var.put(u'errorTag', Js(u'[object Error]')) + var.put(u'funcTag', Js(u'[object Function]')) + var.put(u'mapTag', Js(u'[object Map]')) + var.put(u'numberTag', Js(u'[object Number]')) + var.put(u'objectTag', Js(u'[object Object]')) + var.put(u'regexpTag', Js(u'[object RegExp]')) + var.put(u'setTag', Js(u'[object Set]')) + var.put(u'stringTag', Js(u'[object String]')) + var.put(u'weakMapTag', Js(u'[object WeakMap]')) + var.put(u'arrayBufferTag', Js(u'[object ArrayBuffer]')) + var.put(u'dataViewTag', Js(u'[object DataView]')) + var.put(u'float32Tag', Js(u'[object Float32Array]')) + var.put(u'float64Tag', Js(u'[object Float64Array]')) + var.put(u'int8Tag', Js(u'[object Int8Array]')) + var.put(u'int16Tag', Js(u'[object Int16Array]')) + var.put(u'int32Tag', Js(u'[object Int32Array]')) + var.put(u'uint8Tag', Js(u'[object Uint8Array]')) + var.put(u'uint8ClampedTag', Js(u'[object Uint8ClampedArray]')) + var.put(u'uint16Tag', Js(u'[object Uint16Array]')) + var.put(u'uint32Tag', Js(u'[object Uint32Array]')) + PyJs_Object_3856_ = Js({}) + var.put(u'typedArrayTags', PyJs_Object_3856_) + def PyJs_LONG_3857_(var=var): + return var.get(u'typedArrayTags').put(var.get(u'int8Tag'), var.get(u'typedArrayTags').put(var.get(u'int16Tag'), var.get(u'typedArrayTags').put(var.get(u'int32Tag'), var.get(u'typedArrayTags').put(var.get(u'uint8Tag'), var.get(u'typedArrayTags').put(var.get(u'uint8ClampedTag'), var.get(u'typedArrayTags').put(var.get(u'uint16Tag'), var.get(u'typedArrayTags').put(var.get(u'uint32Tag'), var.get(u'true')))))))) + var.get(u'typedArrayTags').put(var.get(u'float32Tag'), var.get(u'typedArrayTags').put(var.get(u'float64Tag'), PyJs_LONG_3857_())) + def PyJs_LONG_3859_(var=var): + def PyJs_LONG_3858_(var=var): + return var.get(u'typedArrayTags').put(var.get(u'funcTag'), var.get(u'typedArrayTags').put(var.get(u'mapTag'), var.get(u'typedArrayTags').put(var.get(u'numberTag'), var.get(u'typedArrayTags').put(var.get(u'objectTag'), var.get(u'typedArrayTags').put(var.get(u'regexpTag'), var.get(u'typedArrayTags').put(var.get(u'setTag'), var.get(u'typedArrayTags').put(var.get(u'stringTag'), var.get(u'typedArrayTags').put(var.get(u'weakMapTag'), Js(False))))))))) + return var.get(u'typedArrayTags').put(var.get(u'argsTag'), var.get(u'typedArrayTags').put(var.get(u'arrayTag'), var.get(u'typedArrayTags').put(var.get(u'arrayBufferTag'), var.get(u'typedArrayTags').put(var.get(u'boolTag'), var.get(u'typedArrayTags').put(var.get(u'dataViewTag'), var.get(u'typedArrayTags').put(var.get(u'dateTag'), var.get(u'typedArrayTags').put(var.get(u'errorTag'), PyJs_LONG_3858_()))))))) + PyJs_LONG_3859_() + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isTypedArray')) +PyJs_anonymous_3855_._set_name(u'anonymous') +PyJs_Object_3860_ = Js({u'./isLength':Js(465.0),u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3861_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'indexKeys', u'exports', u'baseHas', u'baseKeys', u'keys', u'isArrayLike', u'require', u'isIndex', u'module', u'isPrototype']) + @Js + def PyJsHoisted_keys_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'skipIndexes', u'object', u'indexes', u'length', u'result', u'key', u'isProto']) + var.put(u'isProto', var.get(u'isPrototype')(var.get(u'object'))) + if (var.get(u'isProto') or var.get(u'isArrayLike')(var.get(u'object'))).neg(): + return var.get(u'baseKeys')(var.get(u'object')) + var.put(u'indexes', var.get(u'indexKeys')(var.get(u'object'))) + var.put(u'skipIndexes', var.get(u'indexes').neg().neg()) + var.put(u'result', (var.get(u'indexes') or Js([]))) + var.put(u'length', var.get(u'result').get(u'length')) + for PyJsTemp in var.get(u'object'): + var.put(u'key', PyJsTemp) + if ((var.get(u'baseHas')(var.get(u'object'), var.get(u'key')) and (var.get(u'skipIndexes') and ((var.get(u'key')==Js(u'length')) or var.get(u'isIndex')(var.get(u'key'), var.get(u'length')))).neg()) and (var.get(u'isProto') and (var.get(u'key')==Js(u'constructor'))).neg()): + var.get(u'result').callprop(u'push', var.get(u'key')) + return var.get(u'result') + PyJsHoisted_keys_.func_name = u'keys' + var.put(u'keys', PyJsHoisted_keys_) + var.put(u'baseHas', var.get(u'require')(Js(u'./_baseHas'))) + var.put(u'baseKeys', var.get(u'require')(Js(u'./_baseKeys'))) + var.put(u'indexKeys', var.get(u'require')(Js(u'./_indexKeys'))) + var.put(u'isArrayLike', var.get(u'require')(Js(u'./isArrayLike'))) + var.put(u'isIndex', var.get(u'require')(Js(u'./_isIndex'))) + var.put(u'isPrototype', var.get(u'require')(Js(u'./_isPrototype'))) + pass + var.get(u'module').put(u'exports', var.get(u'keys')) +PyJs_anonymous_3861_._set_name(u'anonymous') +PyJs_Object_3862_ = Js({u'./_baseHas':Js(323.0),u'./_baseKeys':Js(332.0),u'./_indexKeys':Js(393.0),u'./_isIndex':Js(401.0),u'./_isPrototype':Js(406.0),u'./isArrayLike':Js(459.0)}) +@Js +def PyJs_anonymous_3863_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'indexKeys', u'exports', u'baseKeysIn', u'require', u'isIndex', u'module', u'keysIn', u'isPrototype', u'hasOwnProperty', u'objectProto']) + @Js + def PyJsHoisted_keysIn_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'skipIndexes', u'index', u'object', u'indexes', u'length', u'result', u'key', u'props', u'isProto', u'propsLength']) + var.put(u'index', (-Js(1.0))) + var.put(u'isProto', var.get(u'isPrototype')(var.get(u'object'))) + var.put(u'props', var.get(u'baseKeysIn')(var.get(u'object'))) + var.put(u'propsLength', var.get(u'props').get(u'length')) + var.put(u'indexes', var.get(u'indexKeys')(var.get(u'object'))) + var.put(u'skipIndexes', var.get(u'indexes').neg().neg()) + var.put(u'result', (var.get(u'indexes') or Js([]))) + var.put(u'length', var.get(u'result').get(u'length')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'propsLength')): + var.put(u'key', var.get(u'props').get(var.get(u'index'))) + if ((var.get(u'skipIndexes') and ((var.get(u'key')==Js(u'length')) or var.get(u'isIndex')(var.get(u'key'), var.get(u'length')))).neg() and ((var.get(u'key')==Js(u'constructor')) and (var.get(u'isProto') or var.get(u'hasOwnProperty').callprop(u'call', var.get(u'object'), var.get(u'key')).neg())).neg()): + var.get(u'result').callprop(u'push', var.get(u'key')) + return var.get(u'result') + PyJsHoisted_keysIn_.func_name = u'keysIn' + var.put(u'keysIn', PyJsHoisted_keysIn_) + var.put(u'baseKeysIn', var.get(u'require')(Js(u'./_baseKeysIn'))) + var.put(u'indexKeys', var.get(u'require')(Js(u'./_indexKeys'))) + var.put(u'isIndex', var.get(u'require')(Js(u'./_isIndex'))) + var.put(u'isPrototype', var.get(u'require')(Js(u'./_isPrototype'))) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'hasOwnProperty', var.get(u'objectProto').get(u'hasOwnProperty')) + pass + var.get(u'module').put(u'exports', var.get(u'keysIn')) +PyJs_anonymous_3863_._set_name(u'anonymous') +PyJs_Object_3864_ = Js({u'./_baseKeysIn':Js(333.0),u'./_indexKeys':Js(393.0),u'./_isIndex':Js(401.0),u'./_isPrototype':Js(406.0)}) +@Js +def PyJs_anonymous_3865_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'map', u'exports', u'require', u'arrayMap', u'baseIteratee', u'module', u'baseMap']) + @Js + def PyJsHoisted_map_(collection, iteratee, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'collection':collection, u'iteratee':iteratee}, var) + var.registers([u'collection', u'func', u'iteratee']) + var.put(u'func', (var.get(u'arrayMap') if var.get(u'isArray')(var.get(u'collection')) else var.get(u'baseMap'))) + return var.get(u'func')(var.get(u'collection'), var.get(u'baseIteratee')(var.get(u'iteratee'), Js(3.0))) + PyJsHoisted_map_.func_name = u'map' + var.put(u'map', PyJsHoisted_map_) + var.put(u'arrayMap', var.get(u'require')(Js(u'./_arrayMap'))) + var.put(u'baseIteratee', var.get(u'require')(Js(u'./_baseIteratee'))) + var.put(u'baseMap', var.get(u'require')(Js(u'./_baseMap'))) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + pass + var.get(u'module').put(u'exports', var.get(u'map')) +PyJs_anonymous_3865_._set_name(u'anonymous') +PyJs_Object_3866_ = Js({u'./_arrayMap':Js(304.0),u'./_baseIteratee':Js(331.0),u'./_baseMap':Js(334.0),u'./isArray':Js(458.0)}) +@Js +def PyJs_anonymous_3867_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'MapCache', u'memoize', u'FUNC_ERROR_TEXT']) + @Js + def PyJsHoisted_memoize_(func, resolver, this, arguments, var=var): + var = Scope({u'this':this, u'resolver':resolver, u'func':func, u'arguments':arguments}, var) + var.registers([u'memoized', u'resolver', u'func']) + if ((var.get(u'func',throw=False).typeof()!=Js(u'function')) or (var.get(u'resolver') and (var.get(u'resolver',throw=False).typeof()!=Js(u'function')))): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(var.get(u'FUNC_ERROR_TEXT'))) + raise PyJsTempException + @Js + def PyJs_anonymous_3868_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'cache', u'args', u'result', u'key']) + var.put(u'args', var.get(u'arguments')) + var.put(u'key', (var.get(u'resolver').callprop(u'apply', var.get(u"this"), var.get(u'args')) if var.get(u'resolver') else var.get(u'args').get(u'0'))) + var.put(u'cache', var.get(u'memoized').get(u'cache')) + if var.get(u'cache').callprop(u'has', var.get(u'key')): + return var.get(u'cache').callprop(u'get', var.get(u'key')) + var.put(u'result', var.get(u'func').callprop(u'apply', var.get(u"this"), var.get(u'args'))) + var.get(u'memoized').put(u'cache', var.get(u'cache').callprop(u'set', var.get(u'key'), var.get(u'result'))) + return var.get(u'result') + PyJs_anonymous_3868_._set_name(u'anonymous') + var.put(u'memoized', PyJs_anonymous_3868_) + var.get(u'memoized').put(u'cache', (var.get(u'memoize').get(u'Cache') or var.get(u'MapCache')).create()) + return var.get(u'memoized') + PyJsHoisted_memoize_.func_name = u'memoize' + var.put(u'memoize', PyJsHoisted_memoize_) + var.put(u'MapCache', var.get(u'require')(Js(u'./_MapCache'))) + var.put(u'FUNC_ERROR_TEXT', Js(u'Expected a function')) + pass + var.get(u'memoize').put(u'Cache', var.get(u'MapCache')) + var.get(u'module').put(u'exports', var.get(u'memoize')) +PyJs_anonymous_3867_._set_name(u'anonymous') +PyJs_Object_3869_ = Js({u'./_MapCache':Js(289.0)}) +@Js +def PyJs_anonymous_3870_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'mergeWith', u'require', u'module', u'baseMerge', u'createAssigner']) + var.put(u'baseMerge', var.get(u'require')(Js(u'./_baseMerge'))) + var.put(u'createAssigner', var.get(u'require')(Js(u'./_createAssigner'))) + @Js + def PyJs_anonymous_3871_(object, source, srcIndex, customizer, this, arguments, var=var): + var = Scope({u'source':source, u'customizer':customizer, u'arguments':arguments, u'srcIndex':srcIndex, u'this':this, u'object':object}, var) + var.registers([u'source', u'object', u'srcIndex', u'customizer']) + var.get(u'baseMerge')(var.get(u'object'), var.get(u'source'), var.get(u'srcIndex'), var.get(u'customizer')) + PyJs_anonymous_3871_._set_name(u'anonymous') + var.put(u'mergeWith', var.get(u'createAssigner')(PyJs_anonymous_3871_)) + var.get(u'module').put(u'exports', var.get(u'mergeWith')) +PyJs_anonymous_3870_._set_name(u'anonymous') +PyJs_Object_3872_ = Js({u'./_baseMerge':Js(337.0),u'./_createAssigner':Js(370.0)}) +@Js +def PyJs_anonymous_3873_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'noop', u'exports', u'module']) + @Js + def PyJsHoisted_noop_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJsHoisted_noop_.func_name = u'noop' + var.put(u'noop', PyJsHoisted_noop_) + pass + var.get(u'module').put(u'exports', var.get(u'noop')) +PyJs_anonymous_3873_._set_name(u'anonymous') +PyJs_Object_3874_ = Js({}) +@Js +def PyJs_anonymous_3875_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'basePropertyDeep', u'baseProperty', u'toKey', u'isKey', u'require', u'exports', u'module', u'property']) + @Js + def PyJsHoisted_property_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u'baseProperty')(var.get(u'toKey')(var.get(u'path'))) if var.get(u'isKey')(var.get(u'path')) else var.get(u'basePropertyDeep')(var.get(u'path'))) + PyJsHoisted_property_.func_name = u'property' + var.put(u'property', PyJsHoisted_property_) + var.put(u'baseProperty', var.get(u'require')(Js(u'./_baseProperty'))) + var.put(u'basePropertyDeep', var.get(u'require')(Js(u'./_basePropertyDeep'))) + var.put(u'isKey', var.get(u'require')(Js(u'./_isKey'))) + var.put(u'toKey', var.get(u'require')(Js(u'./_toKey'))) + pass + var.get(u'module').put(u'exports', var.get(u'property')) +PyJs_anonymous_3875_._set_name(u'anonymous') +PyJs_Object_3876_ = Js({u'./_baseProperty':Js(340.0),u'./_basePropertyDeep':Js(341.0),u'./_isKey':Js(403.0),u'./_toKey':Js(433.0)}) +@Js +def PyJs_anonymous_3877_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'pull', u'exports', u'require', u'module', u'rest', u'pullAll']) + var.put(u'pullAll', var.get(u'require')(Js(u'./pullAll'))) + var.put(u'rest', var.get(u'require')(Js(u'./rest'))) + var.put(u'pull', var.get(u'rest')(var.get(u'pullAll'))) + var.get(u'module').put(u'exports', var.get(u'pull')) +PyJs_anonymous_3877_._set_name(u'anonymous') +PyJs_Object_3878_ = Js({u'./pullAll':Js(482.0),u'./rest':Js(484.0)}) +@Js +def PyJs_anonymous_3879_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'pullAll', u'require', u'basePullAll', u'exports', u'module']) + @Js + def PyJsHoisted_pullAll_(array, values, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'values':values, u'arguments':arguments}, var) + var.registers([u'array', u'values']) + return (var.get(u'basePullAll')(var.get(u'array'), var.get(u'values')) if (((var.get(u'array') and var.get(u'array').get(u'length')) and var.get(u'values')) and var.get(u'values').get(u'length')) else var.get(u'array')) + PyJsHoisted_pullAll_.func_name = u'pullAll' + var.put(u'pullAll', PyJsHoisted_pullAll_) + var.put(u'basePullAll', var.get(u'require')(Js(u'./_basePullAll'))) + pass + var.get(u'module').put(u'exports', var.get(u'pullAll')) +PyJs_anonymous_3879_._set_name(u'anonymous') +PyJs_Object_3880_ = Js({u'./_basePullAll':Js(342.0)}) +@Js +def PyJs_anonymous_3881_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'repeat', u'baseRepeat', u'toInteger', u'require', u'module', u'toString', u'isIterateeCall']) + @Js + def PyJsHoisted_repeat_(string, n, guard, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'guard':guard, u'string':string, u'n':n}, var) + var.registers([u'guard', u'string', u'n']) + if (var.get(u'isIterateeCall')(var.get(u'string'), var.get(u'n'), var.get(u'guard')) if var.get(u'guard') else PyJsStrictEq(var.get(u'n'),var.get(u'undefined'))): + var.put(u'n', Js(1.0)) + else: + var.put(u'n', var.get(u'toInteger')(var.get(u'n'))) + return var.get(u'baseRepeat')(var.get(u'toString')(var.get(u'string')), var.get(u'n')) + PyJsHoisted_repeat_.func_name = u'repeat' + var.put(u'repeat', PyJsHoisted_repeat_) + var.put(u'baseRepeat', var.get(u'require')(Js(u'./_baseRepeat'))) + var.put(u'isIterateeCall', var.get(u'require')(Js(u'./_isIterateeCall'))) + var.put(u'toInteger', var.get(u'require')(Js(u'./toInteger'))) + var.put(u'toString', var.get(u'require')(Js(u'./toString'))) + pass + var.get(u'module').put(u'exports', var.get(u'repeat')) +PyJs_anonymous_3881_._set_name(u'anonymous') +PyJs_Object_3882_ = Js({u'./_baseRepeat':Js(343.0),u'./_isIterateeCall':Js(402.0),u'./toInteger':Js(490.0),u'./toString':Js(493.0)}) +@Js +def PyJs_anonymous_3883_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'nativeMax', u'toInteger', u'rest', u'module', u'apply', u'require', u'FUNC_ERROR_TEXT']) + @Js + def PyJsHoisted_rest_(func, start, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'arguments':arguments, u'func':func}, var) + var.registers([u'start', u'func']) + if (var.get(u'func',throw=False).typeof()!=Js(u'function')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(var.get(u'FUNC_ERROR_TEXT'))) + raise PyJsTempException + var.put(u'start', var.get(u'nativeMax')(((var.get(u'func').get(u'length')-Js(1.0)) if PyJsStrictEq(var.get(u'start'),var.get(u'undefined')) else var.get(u'toInteger')(var.get(u'start'))), Js(0.0))) + @Js + def PyJs_anonymous_3884_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'otherArgs', u'index', u'length', u'args', u'array']) + var.put(u'args', var.get(u'arguments')) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'nativeMax')((var.get(u'args').get(u'length')-var.get(u'start')), Js(0.0))) + var.put(u'array', var.get(u'Array')(var.get(u'length'))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.get(u'array').put(var.get(u'index'), var.get(u'args').get((var.get(u'start')+var.get(u'index')))) + while 1: + SWITCHED = False + CONDITION = (var.get(u'start')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(0.0)): + SWITCHED = True + return var.get(u'func').callprop(u'call', var.get(u"this"), var.get(u'array')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(1.0)): + SWITCHED = True + return var.get(u'func').callprop(u'call', var.get(u"this"), var.get(u'args').get(u'0'), var.get(u'array')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(2.0)): + SWITCHED = True + return var.get(u'func').callprop(u'call', var.get(u"this"), var.get(u'args').get(u'0'), var.get(u'args').get(u'1'), var.get(u'array')) + SWITCHED = True + break + var.put(u'otherArgs', var.get(u'Array')((var.get(u'start')+Js(1.0)))) + var.put(u'index', (-Js(1.0))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'start')): + var.get(u'otherArgs').put(var.get(u'index'), var.get(u'args').get(var.get(u'index'))) + var.get(u'otherArgs').put(var.get(u'start'), var.get(u'array')) + return var.get(u'apply')(var.get(u'func'), var.get(u"this"), var.get(u'otherArgs')) + PyJs_anonymous_3884_._set_name(u'anonymous') + return PyJs_anonymous_3884_ + PyJsHoisted_rest_.func_name = u'rest' + var.put(u'rest', PyJsHoisted_rest_) + var.put(u'apply', var.get(u'require')(Js(u'./_apply'))) + var.put(u'toInteger', var.get(u'require')(Js(u'./toInteger'))) + var.put(u'FUNC_ERROR_TEXT', Js(u'Expected a function')) + var.put(u'nativeMax', var.get(u'Math').get(u'max')) + pass + var.get(u'module').put(u'exports', var.get(u'rest')) +PyJs_anonymous_3883_._set_name(u'anonymous') +PyJs_Object_3885_ = Js({u'./_apply':Js(300.0),u'./toInteger':Js(490.0)}) +@Js +def PyJs_anonymous_3886_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'exports', u'module', u'baseFlatten', u'require', u'baseOrderBy', u'rest', u'sortBy', u'isFlattenableIteratee', u'isIterateeCall']) + var.put(u'baseFlatten', var.get(u'require')(Js(u'./_baseFlatten'))) + var.put(u'baseOrderBy', var.get(u'require')(Js(u'./_baseOrderBy'))) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + var.put(u'isFlattenableIteratee', var.get(u'require')(Js(u'./_isFlattenableIteratee'))) + var.put(u'isIterateeCall', var.get(u'require')(Js(u'./_isIterateeCall'))) + var.put(u'rest', var.get(u'require')(Js(u'./rest'))) + @Js + def PyJs_anonymous_3887_(collection, iteratees, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'collection':collection, u'iteratees':iteratees}, var) + var.registers([u'length', u'collection', u'iteratees']) + if (var.get(u'collection')==var.get(u"null")): + return Js([]) + var.put(u'length', var.get(u'iteratees').get(u'length')) + if ((var.get(u'length')>Js(1.0)) and var.get(u'isIterateeCall')(var.get(u'collection'), var.get(u'iteratees').get(u'0'), var.get(u'iteratees').get(u'1'))): + var.put(u'iteratees', Js([])) + else: + if ((var.get(u'length')>Js(2.0)) and var.get(u'isIterateeCall')(var.get(u'iteratees').get(u'0'), var.get(u'iteratees').get(u'1'), var.get(u'iteratees').get(u'2'))): + var.put(u'iteratees', Js([var.get(u'iteratees').get(u'0')])) + var.put(u'iteratees', (var.get(u'iteratees').get(u'0') if ((var.get(u'iteratees').get(u'length')==Js(1.0)) and var.get(u'isArray')(var.get(u'iteratees').get(u'0'))) else var.get(u'baseFlatten')(var.get(u'iteratees'), Js(1.0), var.get(u'isFlattenableIteratee')))) + return var.get(u'baseOrderBy')(var.get(u'collection'), var.get(u'iteratees'), Js([])) + PyJs_anonymous_3887_._set_name(u'anonymous') + var.put(u'sortBy', var.get(u'rest')(PyJs_anonymous_3887_)) + var.get(u'module').put(u'exports', var.get(u'sortBy')) +PyJs_anonymous_3886_._set_name(u'anonymous') +PyJs_Object_3888_ = Js({u'./_baseFlatten':Js(318.0),u'./_baseOrderBy':Js(339.0),u'./_isFlattenableIteratee':Js(399.0),u'./_isIterateeCall':Js(402.0),u'./isArray':Js(458.0),u'./rest':Js(484.0)}) +@Js +def PyJs_anonymous_3889_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'startsWith', u'exports', u'toInteger', u'baseToString', u'baseClamp', u'module', u'toString', u'require']) + @Js + def PyJsHoisted_startsWith_(string, target, position, this, arguments, var=var): + var = Scope({u'this':this, u'position':position, u'string':string, u'arguments':arguments, u'target':target}, var) + var.registers([u'position', u'string', u'target']) + var.put(u'string', var.get(u'toString')(var.get(u'string'))) + var.put(u'position', var.get(u'baseClamp')(var.get(u'toInteger')(var.get(u'position')), Js(0.0), var.get(u'string').get(u'length'))) + return (var.get(u'string').callprop(u'lastIndexOf', var.get(u'baseToString')(var.get(u'target')), var.get(u'position'))==var.get(u'position')) + PyJsHoisted_startsWith_.func_name = u'startsWith' + var.put(u'startsWith', PyJsHoisted_startsWith_) + var.put(u'baseClamp', var.get(u'require')(Js(u'./_baseClamp'))) + var.put(u'baseToString', var.get(u'require')(Js(u'./_baseToString'))) + var.put(u'toInteger', var.get(u'require')(Js(u'./toInteger'))) + var.put(u'toString', var.get(u'require')(Js(u'./toString'))) + pass + var.get(u'module').put(u'exports', var.get(u'startsWith')) +PyJs_anonymous_3889_._set_name(u'anonymous') +PyJs_Object_3890_ = Js({u'./_baseClamp':Js(313.0),u'./_baseToString':Js(347.0),u'./toInteger':Js(490.0),u'./toString':Js(493.0)}) +@Js +def PyJs_anonymous_3891_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'stubArray', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_stubArray_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js([]) + PyJsHoisted_stubArray_.func_name = u'stubArray' + var.put(u'stubArray', PyJsHoisted_stubArray_) + pass + var.get(u'module').put(u'exports', var.get(u'stubArray')) +PyJs_anonymous_3891_._set_name(u'anonymous') +PyJs_Object_3892_ = Js({}) +@Js +def PyJs_anonymous_3893_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'stubFalse', u'exports', u'module']) + @Js + def PyJsHoisted_stubFalse_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(False) + PyJsHoisted_stubFalse_.func_name = u'stubFalse' + var.put(u'stubFalse', PyJsHoisted_stubFalse_) + pass + var.get(u'module').put(u'exports', var.get(u'stubFalse')) +PyJs_anonymous_3893_._set_name(u'anonymous') +PyJs_Object_3894_ = Js({}) +@Js +def PyJs_anonymous_3895_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'INFINITY', u'MAX_INTEGER', u'module', u'toNumber', u'toFinite', u'require']) + @Js + def PyJsHoisted_toFinite_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value', u'sign']) + if var.get(u'value').neg(): + return (var.get(u'value') if PyJsStrictEq(var.get(u'value'),Js(0.0)) else Js(0.0)) + var.put(u'value', var.get(u'toNumber')(var.get(u'value'))) + if (PyJsStrictEq(var.get(u'value'),var.get(u'INFINITY')) or PyJsStrictEq(var.get(u'value'),(-var.get(u'INFINITY')))): + var.put(u'sign', ((-Js(1.0)) if (var.get(u'value')<Js(0.0)) else Js(1.0))) + return (var.get(u'sign')*var.get(u'MAX_INTEGER')) + return (var.get(u'value') if PyJsStrictEq(var.get(u'value'),var.get(u'value')) else Js(0.0)) + PyJsHoisted_toFinite_.func_name = u'toFinite' + var.put(u'toFinite', PyJsHoisted_toFinite_) + var.put(u'toNumber', var.get(u'require')(Js(u'./toNumber'))) + var.put(u'INFINITY', (Js(1.0)/Js(0.0))) + var.put(u'MAX_INTEGER', Js(1.7976931348623157e+308)) + pass + var.get(u'module').put(u'exports', var.get(u'toFinite')) +PyJs_anonymous_3895_._set_name(u'anonymous') +PyJs_Object_3896_ = Js({u'./toNumber':Js(491.0)}) +@Js +def PyJs_anonymous_3897_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'toInteger', u'exports', u'require', u'toFinite']) + @Js + def PyJsHoisted_toInteger_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'remainder', u'result', u'value']) + var.put(u'result', var.get(u'toFinite')(var.get(u'value'))) + var.put(u'remainder', (var.get(u'result')%Js(1.0))) + return (((var.get(u'result')-var.get(u'remainder')) if var.get(u'remainder') else var.get(u'result')) if PyJsStrictEq(var.get(u'result'),var.get(u'result')) else Js(0.0)) + PyJsHoisted_toInteger_.func_name = u'toInteger' + var.put(u'toInteger', PyJsHoisted_toInteger_) + var.put(u'toFinite', var.get(u'require')(Js(u'./toFinite'))) + pass + var.get(u'module').put(u'exports', var.get(u'toInteger')) +PyJs_anonymous_3897_._set_name(u'anonymous') +PyJs_Object_3898_ = Js({u'./toFinite':Js(489.0)}) +@Js +def PyJs_anonymous_3899_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'reIsBinary', u'exports', u'reIsBadHex', u'freeParseInt', u'NAN', u'require', u'module', u'toNumber', u'reTrim', u'reIsOctal', u'isFunction', u'isSymbol', u'isObject']) + @Js + def PyJsHoisted_toNumber_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'other', u'value', u'isBinary']) + if (var.get(u'value',throw=False).typeof()==Js(u'number')): + return var.get(u'value') + if var.get(u'isSymbol')(var.get(u'value')): + return var.get(u'NAN') + if var.get(u'isObject')(var.get(u'value')): + var.put(u'other', (var.get(u'value').callprop(u'valueOf') if var.get(u'isFunction')(var.get(u'value').get(u'valueOf')) else var.get(u'value'))) + var.put(u'value', ((var.get(u'other')+Js(u'')) if var.get(u'isObject')(var.get(u'other')) else var.get(u'other'))) + if (var.get(u'value',throw=False).typeof()!=Js(u'string')): + return (var.get(u'value') if PyJsStrictEq(var.get(u'value'),Js(0.0)) else (+var.get(u'value'))) + var.put(u'value', var.get(u'value').callprop(u'replace', var.get(u'reTrim'), Js(u''))) + var.put(u'isBinary', var.get(u'reIsBinary').callprop(u'test', var.get(u'value'))) + return (var.get(u'freeParseInt')(var.get(u'value').callprop(u'slice', Js(2.0)), (Js(2.0) if var.get(u'isBinary') else Js(8.0))) if (var.get(u'isBinary') or var.get(u'reIsOctal').callprop(u'test', var.get(u'value'))) else (var.get(u'NAN') if var.get(u'reIsBadHex').callprop(u'test', var.get(u'value')) else (+var.get(u'value')))) + PyJsHoisted_toNumber_.func_name = u'toNumber' + var.put(u'toNumber', PyJsHoisted_toNumber_) + var.put(u'isFunction', var.get(u'require')(Js(u'./isFunction'))) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + var.put(u'isSymbol', var.get(u'require')(Js(u'./isSymbol'))) + var.put(u'NAN', (Js(0.0)/Js(0.0))) + var.put(u'reTrim', JsRegExp(u'/^\\s+|\\s+$/g')) + var.put(u'reIsBadHex', JsRegExp(u'/^[-+]0x[0-9a-f]+$/i')) + var.put(u'reIsBinary', JsRegExp(u'/^0b[01]+$/i')) + var.put(u'reIsOctal', JsRegExp(u'/^0o[0-7]+$/i')) + var.put(u'freeParseInt', var.get(u'parseInt')) + pass + var.get(u'module').put(u'exports', var.get(u'toNumber')) +PyJs_anonymous_3899_._set_name(u'anonymous') +PyJs_Object_3900_ = Js({u'./isFunction':Js(463.0),u'./isObject':Js(467.0),u'./isSymbol':Js(472.0)}) +@Js +def PyJs_anonymous_3901_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'keysIn', u'toPlainObject', u'copyObject']) + @Js + def PyJsHoisted_toPlainObject_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return var.get(u'copyObject')(var.get(u'value'), var.get(u'keysIn')(var.get(u'value'))) + PyJsHoisted_toPlainObject_.func_name = u'toPlainObject' + var.put(u'toPlainObject', PyJsHoisted_toPlainObject_) + var.put(u'copyObject', var.get(u'require')(Js(u'./_copyObject'))) + var.put(u'keysIn', var.get(u'require')(Js(u'./keysIn'))) + pass + var.get(u'module').put(u'exports', var.get(u'toPlainObject')) +PyJs_anonymous_3901_._set_name(u'anonymous') +PyJs_Object_3902_ = Js({u'./_copyObject':Js(367.0),u'./keysIn':Js(475.0)}) +@Js +def PyJs_anonymous_3903_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'baseToString', u'toString', u'exports', u'module']) + @Js + def PyJsHoisted_toString_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (Js(u'') if (var.get(u'value')==var.get(u"null")) else var.get(u'baseToString')(var.get(u'value'))) + PyJsHoisted_toString_.func_name = u'toString' + var.put(u'toString', PyJsHoisted_toString_) + var.put(u'baseToString', var.get(u'require')(Js(u'./_baseToString'))) + pass + var.get(u'module').put(u'exports', var.get(u'toString')) +PyJs_anonymous_3903_._set_name(u'anonymous') +PyJs_Object_3904_ = Js({u'./_baseToString':Js(347.0)}) +@Js +def PyJs_anonymous_3905_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'trimEnd', u'require', u'baseToString', u'module', u'reTrimEnd', u'toString', u'stringToArray', u'castSlice', u'charsEndIndex']) + @Js + def PyJsHoisted_trimEnd_(string, chars, guard, this, arguments, var=var): + var = Scope({u'this':this, u'chars':chars, u'string':string, u'guard':guard, u'arguments':arguments}, var) + var.registers([u'chars', u'guard', u'end', u'string', u'strSymbols']) + var.put(u'string', var.get(u'toString')(var.get(u'string'))) + if (var.get(u'string') and (var.get(u'guard') or PyJsStrictEq(var.get(u'chars'),var.get(u'undefined')))): + return var.get(u'string').callprop(u'replace', var.get(u'reTrimEnd'), Js(u'')) + if (var.get(u'string').neg() or var.put(u'chars', var.get(u'baseToString')(var.get(u'chars'))).neg()): + return var.get(u'string') + var.put(u'strSymbols', var.get(u'stringToArray')(var.get(u'string'))) + var.put(u'end', (var.get(u'charsEndIndex')(var.get(u'strSymbols'), var.get(u'stringToArray')(var.get(u'chars')))+Js(1.0))) + return var.get(u'castSlice')(var.get(u'strSymbols'), Js(0.0), var.get(u'end')).callprop(u'join', Js(u'')) + PyJsHoisted_trimEnd_.func_name = u'trimEnd' + var.put(u'trimEnd', PyJsHoisted_trimEnd_) + var.put(u'baseToString', var.get(u'require')(Js(u'./_baseToString'))) + var.put(u'castSlice', var.get(u'require')(Js(u'./_castSlice'))) + var.put(u'charsEndIndex', var.get(u'require')(Js(u'./_charsEndIndex'))) + var.put(u'stringToArray', var.get(u'require')(Js(u'./_stringToArray'))) + var.put(u'toString', var.get(u'require')(Js(u'./toString'))) + var.put(u'reTrimEnd', JsRegExp(u'/\\s+$/')) + pass + var.get(u'module').put(u'exports', var.get(u'trimEnd')) +PyJs_anonymous_3905_._set_name(u'anonymous') +PyJs_Object_3906_ = Js({u'./_baseToString':Js(347.0),u'./_castSlice':Js(353.0),u'./_charsEndIndex':Js(354.0),u'./_stringToArray':Js(431.0),u'./toString':Js(493.0)}) +@Js +def PyJs_anonymous_3907_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseUniq', u'require', u'uniq', u'exports', u'module']) + @Js + def PyJsHoisted_uniq_(array, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'arguments':arguments}, var) + var.registers([u'array']) + return (var.get(u'baseUniq')(var.get(u'array')) if (var.get(u'array') and var.get(u'array').get(u'length')) else Js([])) + PyJsHoisted_uniq_.func_name = u'uniq' + var.put(u'uniq', PyJsHoisted_uniq_) + var.put(u'baseUniq', var.get(u'require')(Js(u'./_baseUniq'))) + pass + var.get(u'module').put(u'exports', var.get(u'uniq')) +PyJs_anonymous_3907_._set_name(u'anonymous') +PyJs_Object_3908_ = Js({u'./_baseUniq':Js(349.0)}) +@Js +def PyJs_anonymous_3909_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'keys', u'require', u'module', u'baseValues', u'values']) + @Js + def PyJsHoisted_values_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + return (var.get(u'baseValues')(var.get(u'object'), var.get(u'keys')(var.get(u'object'))) if var.get(u'object') else Js([])) + PyJsHoisted_values_.func_name = u'values' + var.put(u'values', PyJsHoisted_values_) + var.put(u'baseValues', var.get(u'require')(Js(u'./_baseValues'))) + var.put(u'keys', var.get(u'require')(Js(u'./keys'))) + pass + var.get(u'module').put(u'exports', var.get(u'values')) +PyJs_anonymous_3909_._set_name(u'anonymous') +PyJs_Object_3910_ = Js({u'./_baseValues':Js(350.0),u'./keys':Js(474.0)}) +@Js +def PyJs_anonymous_3911_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'short', u'd', u'h', u'require', u'm', u'long', u'parse', u's', u'module', u'y', u'plural']) + @Js + def PyJsHoisted_parse_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'type', u'str', u'match', u'n']) + var.put(u'str', (Js(u'')+var.get(u'str'))) + if (var.get(u'str').get(u'length')>Js(10000.0)): + return var.get('undefined') + var.put(u'match', JsRegExp(u'/^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i').callprop(u'exec', var.get(u'str'))) + if var.get(u'match').neg(): + return var.get('undefined') + var.put(u'n', var.get(u'parseFloat')(var.get(u'match').get(u'1'))) + var.put(u'type', (var.get(u'match').get(u'2') or Js(u'ms')).callprop(u'toLowerCase')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'years')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'year')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'yrs')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'yr')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'y')): + SWITCHED = True + return (var.get(u'n')*var.get(u'y')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'days')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'day')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'd')): + SWITCHED = True + return (var.get(u'n')*var.get(u'd')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hours')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hour')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hrs')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hr')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'h')): + SWITCHED = True + return (var.get(u'n')*var.get(u'h')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'minutes')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'minute')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'mins')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'min')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'm')): + SWITCHED = True + return (var.get(u'n')*var.get(u'm')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'seconds')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'second')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'secs')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'sec')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u's')): + SWITCHED = True + return (var.get(u'n')*var.get(u's')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'milliseconds')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'millisecond')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'msecs')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'msec')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ms')): + SWITCHED = True + return var.get(u'n') + SWITCHED = True + break + PyJsHoisted_parse_.func_name = u'parse' + var.put(u'parse', PyJsHoisted_parse_) + @Js + def PyJsHoisted_short_(ms, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'ms':ms}, var) + var.registers([u'ms']) + if (var.get(u'ms')>=var.get(u'd')): + return (var.get(u'Math').callprop(u'round', (var.get(u'ms')/var.get(u'd')))+Js(u'd')) + if (var.get(u'ms')>=var.get(u'h')): + return (var.get(u'Math').callprop(u'round', (var.get(u'ms')/var.get(u'h')))+Js(u'h')) + if (var.get(u'ms')>=var.get(u'm')): + return (var.get(u'Math').callprop(u'round', (var.get(u'ms')/var.get(u'm')))+Js(u'm')) + if (var.get(u'ms')>=var.get(u's')): + return (var.get(u'Math').callprop(u'round', (var.get(u'ms')/var.get(u's')))+Js(u's')) + return (var.get(u'ms')+Js(u'ms')) + PyJsHoisted_short_.func_name = u'short' + var.put(u'short', PyJsHoisted_short_) + @Js + def PyJsHoisted_plural_(ms, n, name, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'name':name, u'ms':ms, u'n':n}, var) + var.registers([u'name', u'ms', u'n']) + if (var.get(u'ms')<var.get(u'n')): + return var.get('undefined') + if (var.get(u'ms')<(var.get(u'n')*Js(1.5))): + return ((var.get(u'Math').callprop(u'floor', (var.get(u'ms')/var.get(u'n')))+Js(u' '))+var.get(u'name')) + return (((var.get(u'Math').callprop(u'ceil', (var.get(u'ms')/var.get(u'n')))+Js(u' '))+var.get(u'name'))+Js(u's')) + PyJsHoisted_plural_.func_name = u'plural' + var.put(u'plural', PyJsHoisted_plural_) + @Js + def PyJsHoisted_long_(ms, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'ms':ms}, var) + var.registers([u'ms']) + return ((((var.get(u'plural')(var.get(u'ms'), var.get(u'd'), Js(u'day')) or var.get(u'plural')(var.get(u'ms'), var.get(u'h'), Js(u'hour'))) or var.get(u'plural')(var.get(u'ms'), var.get(u'm'), Js(u'minute'))) or var.get(u'plural')(var.get(u'ms'), var.get(u's'), Js(u'second'))) or (var.get(u'ms')+Js(u' ms'))) + PyJsHoisted_long_.func_name = u'long' + var.put(u'long', PyJsHoisted_long_) + var.put(u's', Js(1000.0)) + var.put(u'm', (var.get(u's')*Js(60.0))) + var.put(u'h', (var.get(u'm')*Js(60.0))) + var.put(u'd', (var.get(u'h')*Js(24.0))) + var.put(u'y', (var.get(u'd')*Js(365.25))) + @Js + def PyJs_anonymous_3912_(val, options, this, arguments, var=var): + var = Scope({u'this':this, u'options':options, u'val':val, u'arguments':arguments}, var) + var.registers([u'options', u'val']) + PyJs_Object_3913_ = Js({}) + var.put(u'options', (var.get(u'options') or PyJs_Object_3913_)) + if (Js(u'string')==var.get(u'val',throw=False).typeof()): + return var.get(u'parse')(var.get(u'val')) + return (var.get(u'long')(var.get(u'val')) if var.get(u'options').get(u'long') else var.get(u'short')(var.get(u'val'))) + PyJs_anonymous_3912_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_3912_) + pass + pass + pass + pass +PyJs_anonymous_3911_._set_name(u'anonymous') +PyJs_Object_3914_ = Js({}) +@Js +def PyJs_anonymous_3915_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + @Js + def PyJs_anonymous_3916_(x, this, arguments, var=var): + var = Scope({u'this':this, u'x':x, u'arguments':arguments}, var) + var.registers([u'x']) + return PyJsStrictNeq(var.get(u'x'),var.get(u'x')) + PyJs_anonymous_3916_._set_name(u'anonymous') + var.get(u'module').put(u'exports', (var.get(u'Number').get(u'isNaN') or PyJs_anonymous_3916_)) +PyJs_anonymous_3915_._set_name(u'anonymous') +PyJs_Object_3917_ = Js({}) +@Js +def PyJs_anonymous_3918_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_3919_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'win32', u'process', u'posix']) + @Js + def PyJsHoisted_win32_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'splitDeviceRe', u'device', u'path', u'result', u'isUnc']) + var.put(u'splitDeviceRe', JsRegExp(u'/^([a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/]+[^\\\\\\/]+)?([\\\\\\/])?([\\s\\S]*?)$/')) + var.put(u'result', var.get(u'splitDeviceRe').callprop(u'exec', var.get(u'path'))) + var.put(u'device', (var.get(u'result').get(u'1') or Js(u''))) + var.put(u'isUnc', (var.get(u'device').neg().neg() and PyJsStrictNeq(var.get(u'device').callprop(u'charAt', Js(1.0)),Js(u':')))) + return (var.get(u'result').get(u'2').neg().neg() or var.get(u'isUnc')) + PyJsHoisted_win32_.func_name = u'win32' + var.put(u'win32', PyJsHoisted_win32_) + @Js + def PyJsHoisted_posix_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return PyJsStrictEq(var.get(u'path').callprop(u'charAt', Js(0.0)),Js(u'/')) + PyJsHoisted_posix_.func_name = u'posix' + var.put(u'posix', PyJsHoisted_posix_) + Js(u'use strict') + pass + pass + pass + pass + var.get(u'module').put(u'exports', (var.get(u'win32') if PyJsStrictEq(var.get(u'process').get(u'platform'),Js(u'win32')) else var.get(u'posix'))) + var.get(u'module').get(u'exports').put(u'posix', var.get(u'posix')) + var.get(u'module').get(u'exports').put(u'win32', var.get(u'win32')) + PyJs_anonymous_3919_._set_name(u'anonymous') + PyJs_anonymous_3919_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_3918_._set_name(u'anonymous') +PyJs_Object_3920_ = Js({u'_process':Js(531.0)}) +@Js +def PyJs_anonymous_3921_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'rand', u'exports', u'originalCreate', u'defaultCreatorFn', u'uniqueKeys', u'makeUniqueKey', u'originalObject', u'makeAccessor', u'require', u'hasOwn', u'internString', u'numToStr', u'module', u'cloner', u'originalGetOPNs', u'defProp', u'originalDefProp', u'create', u'makeSafeToCall', u'strSlice']) + @Js + def PyJsHoisted_defaultCreatorFn_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + return var.get(u'create')(var.get(u"null")) + PyJsHoisted_defaultCreatorFn_.func_name = u'defaultCreatorFn' + var.put(u'defaultCreatorFn', PyJsHoisted_defaultCreatorFn_) + @Js + def PyJsHoisted_makeAccessor_(secretCreatorFn, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'secretCreatorFn':secretCreatorFn}, var) + var.registers([u'brand', u'register', u'accessor', u'secretCreatorFn', u'passkey']) + @Js + def PyJsHoisted_register_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'vault', u'secret', u'object']) + @Js + def PyJsHoisted_vault_(key, forget, this, arguments, var=var): + var = Scope({u'this':this, u'forget':forget, u'key':key, u'arguments':arguments}, var) + var.registers([u'forget', u'key']) + if PyJsStrictEq(var.get(u'key'),var.get(u'passkey')): + return (var.put(u'secret', var.get(u"null")) if var.get(u'forget') else (var.get(u'secret') or var.put(u'secret', var.get(u'secretCreatorFn')(var.get(u'object'))))) + PyJsHoisted_vault_.func_name = u'vault' + var.put(u'vault', PyJsHoisted_vault_) + pass + pass + var.get(u'defProp')(var.get(u'object'), var.get(u'brand'), var.get(u'vault')) + PyJsHoisted_register_.func_name = u'register' + var.put(u'register', PyJsHoisted_register_) + @Js + def PyJsHoisted_accessor_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + if var.get(u'hasOwn').callprop(u'call', var.get(u'object'), var.get(u'brand')).neg(): + var.get(u'register')(var.get(u'object')) + return var.get(u'object').callprop(var.get(u'brand'), var.get(u'passkey')) + PyJsHoisted_accessor_.func_name = u'accessor' + var.put(u'accessor', PyJsHoisted_accessor_) + var.put(u'brand', var.get(u'makeUniqueKey')()) + var.put(u'passkey', var.get(u'create')(var.get(u"null"))) + var.put(u'secretCreatorFn', (var.get(u'secretCreatorFn') or var.get(u'defaultCreatorFn'))) + pass + pass + @Js + def PyJs_anonymous_3926_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + if var.get(u'hasOwn').callprop(u'call', var.get(u'object'), var.get(u'brand')): + var.get(u'object').callprop(var.get(u'brand'), var.get(u'passkey'), var.get(u'true')) + PyJs_anonymous_3926_._set_name(u'anonymous') + var.get(u'accessor').put(u'forget', PyJs_anonymous_3926_) + return var.get(u'accessor') + PyJsHoisted_makeAccessor_.func_name = u'makeAccessor' + var.put(u'makeAccessor', PyJsHoisted_makeAccessor_) + @Js + def PyJsHoisted_makeUniqueKey_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'uniqueKey']) + while 1: + var.put(u'uniqueKey', var.get(u'internString')(var.get(u'strSlice').callprop(u'call', var.get(u'numToStr').callprop(u'call', var.get(u'rand')(), Js(36.0)), Js(2.0)))) + if not var.get(u'hasOwn').callprop(u'call', var.get(u'uniqueKeys'), var.get(u'uniqueKey')): + break + return var.get(u'uniqueKeys').put(var.get(u'uniqueKey'), var.get(u'uniqueKey')) + PyJsHoisted_makeUniqueKey_.func_name = u'makeUniqueKey' + var.put(u'makeUniqueKey', PyJsHoisted_makeUniqueKey_) + @Js + def PyJsHoisted_create_(prototype, this, arguments, var=var): + var = Scope({u'this':this, u'prototype':prototype, u'arguments':arguments}, var) + var.registers([u'prototype']) + if var.get(u'originalCreate'): + return var.get(u'originalCreate').callprop(u'call', var.get(u'originalObject'), var.get(u'prototype')) + var.get(u'cloner').put(u'prototype', (var.get(u'prototype') or var.get(u"null"))) + return var.get(u'cloner').create() + PyJsHoisted_create_.func_name = u'create' + var.put(u'create', PyJsHoisted_create_) + @Js + def PyJsHoisted_internString_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'obj', u'str']) + PyJs_Object_3924_ = Js({}) + var.put(u'obj', PyJs_Object_3924_) + var.get(u'obj').put(var.get(u'str'), var.get(u'true')) + return var.get(u'Object').callprop(u'keys', var.get(u'obj')).get(u'0') + PyJsHoisted_internString_.func_name = u'internString' + var.put(u'internString', PyJsHoisted_internString_) + @Js + def PyJsHoisted_defProp_(obj, name, value, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'name':name, u'value':value, u'arguments':arguments}, var) + var.registers([u'obj', u'name', u'value']) + if var.get(u'originalDefProp'): + try: + PyJs_Object_3922_ = Js({u'value':var.get(u'value')}) + var.get(u'originalDefProp').callprop(u'call', var.get(u'originalObject'), var.get(u'obj'), var.get(u'name'), PyJs_Object_3922_) + except PyJsException as PyJsTempException: + PyJsHolder_646566696e6550726f7065727479497342726f6b656e496e494538_59123052 = var.own.get(u'definePropertyIsBrokenInIE8') + var.force_own_put(u'definePropertyIsBrokenInIE8', PyExceptionToJs(PyJsTempException)) + try: + var.get(u'obj').put(var.get(u'name'), var.get(u'value')) + finally: + if PyJsHolder_646566696e6550726f7065727479497342726f6b656e496e494538_59123052 is not None: + var.own[u'definePropertyIsBrokenInIE8'] = PyJsHolder_646566696e6550726f7065727479497342726f6b656e496e494538_59123052 + else: + del var.own[u'definePropertyIsBrokenInIE8'] + del PyJsHolder_646566696e6550726f7065727479497342726f6b656e496e494538_59123052 + else: + var.get(u'obj').put(var.get(u'name'), var.get(u'value')) + PyJsHoisted_defProp_.func_name = u'defProp' + var.put(u'defProp', PyJsHoisted_defProp_) + @Js + def PyJsHoisted_makeSafeToCall_(fun, this, arguments, var=var): + var = Scope({u'fun':fun, u'this':this, u'arguments':arguments}, var) + var.registers([u'fun']) + if var.get(u'fun'): + var.get(u'defProp')(var.get(u'fun'), Js(u'call'), var.get(u'fun').get(u'call')) + var.get(u'defProp')(var.get(u'fun'), Js(u'apply'), var.get(u'fun').get(u'apply')) + return var.get(u'fun') + PyJsHoisted_makeSafeToCall_.func_name = u'makeSafeToCall' + var.put(u'makeSafeToCall', PyJsHoisted_makeSafeToCall_) + Js(u'use strict') + var.put(u'originalObject', var.get(u'Object')) + var.put(u'originalDefProp', var.get(u'Object').get(u'defineProperty')) + var.put(u'originalCreate', var.get(u'Object').get(u'create')) + pass + pass + var.get(u'makeSafeToCall')(var.get(u'originalDefProp')) + var.get(u'makeSafeToCall')(var.get(u'originalCreate')) + var.put(u'hasOwn', var.get(u'makeSafeToCall')(var.get(u'Object').get(u'prototype').get(u'hasOwnProperty'))) + var.put(u'numToStr', var.get(u'makeSafeToCall')(var.get(u'Number').get(u'prototype').get(u'toString'))) + var.put(u'strSlice', var.get(u'makeSafeToCall')(var.get(u'String').get(u'prototype').get(u'slice'))) + @Js + def PyJs_anonymous_3923_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJs_anonymous_3923_._set_name(u'anonymous') + var.put(u'cloner', PyJs_anonymous_3923_) + pass + var.put(u'rand', var.get(u'Math').get(u'random')) + var.put(u'uniqueKeys', var.get(u'create')(var.get(u"null"))) + pass + pass + var.get(u'defProp')(var.get(u'exports'), Js(u'makeUniqueKey'), var.get(u'makeUniqueKey')) + var.put(u'originalGetOPNs', var.get(u'Object').get(u'getOwnPropertyNames')) + @Js + def PyJs_getOwnPropertyNames_3925_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments, u'getOwnPropertyNames':PyJs_getOwnPropertyNames_3925_}, var) + var.registers([u'src', u'dst', u'object', u'names', u'len']) + #for JS loop + var.put(u'names', var.get(u'originalGetOPNs')(var.get(u'object'))) + var.put(u'src', Js(0.0)) + var.put(u'dst', Js(0.0)) + var.put(u'len', var.get(u'names').get(u'length')) + while (var.get(u'src')<var.get(u'len')): + try: + if var.get(u'hasOwn').callprop(u'call', var.get(u'uniqueKeys'), var.get(u'names').get(var.get(u'src'))).neg(): + if (var.get(u'src')>var.get(u'dst')): + var.get(u'names').put(var.get(u'dst'), var.get(u'names').get(var.get(u'src'))) + var.put(u'dst',Js(var.get(u'dst').to_number())+Js(1)) + finally: + var.put(u'src',Js(var.get(u'src').to_number())+Js(1)) + var.get(u'names').put(u'length', var.get(u'dst')) + return var.get(u'names') + PyJs_getOwnPropertyNames_3925_._set_name(u'getOwnPropertyNames') + var.get(u'Object').put(u'getOwnPropertyNames', PyJs_getOwnPropertyNames_3925_) + pass + pass + var.get(u'defProp')(var.get(u'exports'), Js(u'makeAccessor'), var.get(u'makeAccessor')) +PyJs_anonymous_3921_._set_name(u'anonymous') +PyJs_Object_3927_ = Js({}) +@Js +def PyJs_anonymous_3928_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_3929_ = Js({}) + @Js + def PyJs_anonymous_3930_(PyJsArg_676c6f62616c_, this, arguments, var=var): + var = Scope({u'this':this, u'global':PyJsArg_676c6f62616c_, u'arguments':arguments}, var) + var.registers([u'global']) + pass + @Js + def PyJs_anonymous_3931_(root, this, arguments, var=var): + var = Scope({u'this':this, u'root':root, u'arguments':arguments}, var) + var.registers([u'dataIsEmpty', u'zeroes', u'codePointToString', u'freeModule', u'HIGH_SURROGATE_MIN', u'dataRemove', u'freeExports', u'splitAtBMP', u'dataIntersection', u'lowSurrogate', u'dataContains', u'dataFromCodePoints', u'dataAddData', u'createBMPCharacterClasses', u'createSurrogateCharacterClasses', u'createUnicodeCharacterClasses', u'ERRORS', u'dataToArray', u'floor', u'regenerate', u'hex', u'surrogateSet', u'optimizeByLowSurrogates', u'stringFromCharCode', u'toString', u'dataRemoveData', u'freeGlobal', u'pad', u'LOW_SURROGATE_MAX', u'isArray', u'HIGH_SURROGATE_MAX', u'extend', u'symbolToCodePoint', u'object', u'createCharacterClassesFromData', u'LOW_SURROGATE_MIN', u'slice', u'hasOwnProperty', u'dataRemoveRange', u'isNumber', u'dataAdd', u'highSurrogate', u'codePointToStringUnicode', u'proto', u'dataAddRange', u'regexNull', u'dataIsSingleton', u'root', u'optimizeSurrogateMappings', u'forEach']) + var.put(u'freeExports', ((var.get(u'exports',throw=False).typeof()==Js(u'object')) and var.get(u'exports'))) + var.put(u'freeModule', ((((var.get(u'module',throw=False).typeof()==Js(u'object')) and var.get(u'module')) and (var.get(u'module').get(u'exports')==var.get(u'freeExports'))) and var.get(u'module'))) + var.put(u'freeGlobal', ((var.get(u'global',throw=False).typeof()==Js(u'object')) and var.get(u'global'))) + if (PyJsStrictEq(var.get(u'freeGlobal').get(u'global'),var.get(u'freeGlobal')) or PyJsStrictEq(var.get(u'freeGlobal').get(u'window'),var.get(u'freeGlobal'))): + var.put(u'root', var.get(u'freeGlobal')) + PyJs_Object_3932_ = Js({u'rangeOrder':(Js(u'A range\u2019s `stop` value must be greater than or equal ')+Js(u'to the `start` value.')),u'codePointRange':(Js(u'Invalid code point value. Code points range from ')+Js(u'U+000000 to U+10FFFF.'))}) + var.put(u'ERRORS', PyJs_Object_3932_) + var.put(u'HIGH_SURROGATE_MIN', Js(55296)) + var.put(u'HIGH_SURROGATE_MAX', Js(56319)) + var.put(u'LOW_SURROGATE_MIN', Js(56320)) + var.put(u'LOW_SURROGATE_MAX', Js(57343)) + var.put(u'regexNull', JsRegExp(u'/\\\\x00([^0123456789]|$)/g')) + PyJs_Object_3933_ = Js({}) + var.put(u'object', PyJs_Object_3933_) + var.put(u'hasOwnProperty', var.get(u'object').get(u'hasOwnProperty')) + @Js + def PyJs_anonymous_3934_(destination, source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'destination':destination, u'arguments':arguments}, var) + var.registers([u'source', u'destination', u'key']) + pass + for PyJsTemp in var.get(u'source'): + var.put(u'key', PyJsTemp) + if var.get(u'hasOwnProperty').callprop(u'call', var.get(u'source'), var.get(u'key')): + var.get(u'destination').put(var.get(u'key'), var.get(u'source').get(var.get(u'key'))) + return var.get(u'destination') + PyJs_anonymous_3934_._set_name(u'anonymous') + var.put(u'extend', PyJs_anonymous_3934_) + @Js + def PyJs_anonymous_3935_(array, callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'array':array, u'arguments':arguments}, var) + var.registers([u'index', u'length', u'array', u'callback']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'array').get(u'length')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.get(u'callback')(var.get(u'array').get(var.get(u'index')), var.get(u'index')) + PyJs_anonymous_3935_._set_name(u'anonymous') + var.put(u'forEach', PyJs_anonymous_3935_) + var.put(u'toString', var.get(u'object').get(u'toString')) + @Js + def PyJs_anonymous_3936_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'toString').callprop(u'call', var.get(u'value'))==Js(u'[object Array]')) + PyJs_anonymous_3936_._set_name(u'anonymous') + var.put(u'isArray', PyJs_anonymous_3936_) + @Js + def PyJs_anonymous_3937_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'value',throw=False).typeof()==Js(u'number')) or (var.get(u'toString').callprop(u'call', var.get(u'value'))==Js(u'[object Number]'))) + PyJs_anonymous_3937_._set_name(u'anonymous') + var.put(u'isNumber', PyJs_anonymous_3937_) + var.put(u'zeroes', Js(u'0000')) + @Js + def PyJs_anonymous_3938_(number, totalCharacters, this, arguments, var=var): + var = Scope({u'this':this, u'totalCharacters':totalCharacters, u'number':number, u'arguments':arguments}, var) + var.registers([u'totalCharacters', u'string', u'number']) + var.put(u'string', var.get(u'String')(var.get(u'number'))) + return ((var.get(u'zeroes')+var.get(u'string')).callprop(u'slice', (-var.get(u'totalCharacters'))) if (var.get(u'string').get(u'length')<var.get(u'totalCharacters')) else var.get(u'string')) + PyJs_anonymous_3938_._set_name(u'anonymous') + var.put(u'pad', PyJs_anonymous_3938_) + @Js + def PyJs_anonymous_3939_(number, this, arguments, var=var): + var = Scope({u'this':this, u'number':number, u'arguments':arguments}, var) + var.registers([u'number']) + return var.get(u'Number')(var.get(u'number')).callprop(u'toString', Js(16.0)).callprop(u'toUpperCase') + PyJs_anonymous_3939_._set_name(u'anonymous') + var.put(u'hex', PyJs_anonymous_3939_) + var.put(u'slice', Js([]).get(u'slice')) + @Js + def PyJs_anonymous_3940_(codePoints, this, arguments, var=var): + var = Scope({u'codePoints':codePoints, u'this':this, u'arguments':arguments}, var) + var.registers([u'tmp', u'index', u'max', u'isStart', u'length', u'result', u'codePoints', u'previous']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'codePoints').get(u'length')) + var.put(u'max', (var.get(u'length')-Js(1.0))) + var.put(u'result', Js([])) + var.put(u'isStart', var.get(u'true')) + pass + var.put(u'previous', Js(0.0)) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'tmp', var.get(u'codePoints').get(var.get(u'index'))) + if var.get(u'isStart'): + var.get(u'result').callprop(u'push', var.get(u'tmp')) + var.put(u'previous', var.get(u'tmp')) + var.put(u'isStart', Js(False)) + else: + if (var.get(u'tmp')==(var.get(u'previous')+Js(1.0))): + if (var.get(u'index')!=var.get(u'max')): + var.put(u'previous', var.get(u'tmp')) + continue + else: + var.put(u'isStart', var.get(u'true')) + var.get(u'result').callprop(u'push', (var.get(u'tmp')+Js(1.0))) + else: + var.get(u'result').callprop(u'push', (var.get(u'previous')+Js(1.0)), var.get(u'tmp')) + var.put(u'previous', var.get(u'tmp')) + if var.get(u'isStart').neg(): + var.get(u'result').callprop(u'push', (var.get(u'tmp')+Js(1.0))) + return var.get(u'result') + PyJs_anonymous_3940_._set_name(u'anonymous') + var.put(u'dataFromCodePoints', PyJs_anonymous_3940_) + @Js + def PyJs_anonymous_3941_(data, codePoint, this, arguments, var=var): + var = Scope({u'this':this, u'codePoint':codePoint, u'data':data, u'arguments':arguments}, var) + var.registers([u'index', u'codePoint', u'end', u'start', u'length', u'data']) + var.put(u'index', Js(0.0)) + pass + pass + var.put(u'length', var.get(u'data').get(u'length')) + while (var.get(u'index')<var.get(u'length')): + var.put(u'start', var.get(u'data').get(var.get(u'index'))) + var.put(u'end', var.get(u'data').get((var.get(u'index')+Js(1.0)))) + if ((var.get(u'codePoint')>=var.get(u'start')) and (var.get(u'codePoint')<var.get(u'end'))): + if (var.get(u'codePoint')==var.get(u'start')): + if (var.get(u'end')==(var.get(u'start')+Js(1.0))): + var.get(u'data').callprop(u'splice', var.get(u'index'), Js(2.0)) + return var.get(u'data') + else: + var.get(u'data').put(var.get(u'index'), (var.get(u'codePoint')+Js(1.0))) + return var.get(u'data') + else: + if (var.get(u'codePoint')==(var.get(u'end')-Js(1.0))): + var.get(u'data').put((var.get(u'index')+Js(1.0)), var.get(u'codePoint')) + return var.get(u'data') + else: + var.get(u'data').callprop(u'splice', var.get(u'index'), Js(2.0), var.get(u'start'), var.get(u'codePoint'), (var.get(u'codePoint')+Js(1.0)), var.get(u'end')) + return var.get(u'data') + var.put(u'index', Js(2.0), u'+') + return var.get(u'data') + PyJs_anonymous_3941_._set_name(u'anonymous') + var.put(u'dataRemove', PyJs_anonymous_3941_) + @Js + def PyJs_anonymous_3942_(data, rangeStart, rangeEnd, this, arguments, var=var): + var = Scope({u'this':this, u'data':data, u'arguments':arguments, u'rangeEnd':rangeEnd, u'rangeStart':rangeStart}, var) + var.registers([u'index', u'end', u'rangeEnd', u'rangeStart', u'start', u'data']) + if (var.get(u'rangeEnd')<var.get(u'rangeStart')): + PyJsTempException = JsToPyException(var.get(u'Error')(var.get(u'ERRORS').get(u'rangeOrder'))) + raise PyJsTempException + var.put(u'index', Js(0.0)) + pass + pass + while (var.get(u'index')<var.get(u'data').get(u'length')): + var.put(u'start', var.get(u'data').get(var.get(u'index'))) + var.put(u'end', (var.get(u'data').get((var.get(u'index')+Js(1.0)))-Js(1.0))) + if (var.get(u'start')>var.get(u'rangeEnd')): + return var.get(u'data') + if ((var.get(u'rangeStart')<=var.get(u'start')) and (var.get(u'rangeEnd')>=var.get(u'end'))): + var.get(u'data').callprop(u'splice', var.get(u'index'), Js(2.0)) + continue + if ((var.get(u'rangeStart')>=var.get(u'start')) and (var.get(u'rangeEnd')<var.get(u'end'))): + if (var.get(u'rangeStart')==var.get(u'start')): + var.get(u'data').put(var.get(u'index'), (var.get(u'rangeEnd')+Js(1.0))) + var.get(u'data').put((var.get(u'index')+Js(1.0)), (var.get(u'end')+Js(1.0))) + return var.get(u'data') + var.get(u'data').callprop(u'splice', var.get(u'index'), Js(2.0), var.get(u'start'), var.get(u'rangeStart'), (var.get(u'rangeEnd')+Js(1.0)), (var.get(u'end')+Js(1.0))) + return var.get(u'data') + if ((var.get(u'rangeStart')>=var.get(u'start')) and (var.get(u'rangeStart')<=var.get(u'end'))): + var.get(u'data').put((var.get(u'index')+Js(1.0)), var.get(u'rangeStart')) + else: + if ((var.get(u'rangeEnd')>=var.get(u'start')) and (var.get(u'rangeEnd')<=var.get(u'end'))): + var.get(u'data').put(var.get(u'index'), (var.get(u'rangeEnd')+Js(1.0))) + return var.get(u'data') + var.put(u'index', Js(2.0), u'+') + return var.get(u'data') + PyJs_anonymous_3942_._set_name(u'anonymous') + var.put(u'dataRemoveRange', PyJs_anonymous_3942_) + @Js + def PyJs_anonymous_3943_(data, codePoint, this, arguments, var=var): + var = Scope({u'this':this, u'codePoint':codePoint, u'data':data, u'arguments':arguments}, var) + var.registers([u'index', u'codePoint', u'end', u'lastIndex', u'start', u'length', u'data']) + var.put(u'index', Js(0.0)) + pass + pass + var.put(u'lastIndex', var.get(u"null")) + var.put(u'length', var.get(u'data').get(u'length')) + if ((var.get(u'codePoint')<Js(0)) or (var.get(u'codePoint')>Js(1114111))): + PyJsTempException = JsToPyException(var.get(u'RangeError')(var.get(u'ERRORS').get(u'codePointRange'))) + raise PyJsTempException + while (var.get(u'index')<var.get(u'length')): + var.put(u'start', var.get(u'data').get(var.get(u'index'))) + var.put(u'end', var.get(u'data').get((var.get(u'index')+Js(1.0)))) + if ((var.get(u'codePoint')>=var.get(u'start')) and (var.get(u'codePoint')<var.get(u'end'))): + return var.get(u'data') + if (var.get(u'codePoint')==(var.get(u'start')-Js(1.0))): + var.get(u'data').put(var.get(u'index'), var.get(u'codePoint')) + return var.get(u'data') + if (var.get(u'start')>var.get(u'codePoint')): + var.get(u'data').callprop(u'splice', ((var.get(u'lastIndex')+Js(2.0)) if (var.get(u'lastIndex')!=var.get(u"null")) else Js(0.0)), Js(0.0), var.get(u'codePoint'), (var.get(u'codePoint')+Js(1.0))) + return var.get(u'data') + if (var.get(u'codePoint')==var.get(u'end')): + if ((var.get(u'codePoint')+Js(1.0))==var.get(u'data').get((var.get(u'index')+Js(2.0)))): + var.get(u'data').callprop(u'splice', var.get(u'index'), Js(4.0), var.get(u'start'), var.get(u'data').get((var.get(u'index')+Js(3.0)))) + return var.get(u'data') + var.get(u'data').put((var.get(u'index')+Js(1.0)), (var.get(u'codePoint')+Js(1.0))) + return var.get(u'data') + var.put(u'lastIndex', var.get(u'index')) + var.put(u'index', Js(2.0), u'+') + var.get(u'data').callprop(u'push', var.get(u'codePoint'), (var.get(u'codePoint')+Js(1.0))) + return var.get(u'data') + PyJs_anonymous_3943_._set_name(u'anonymous') + var.put(u'dataAdd', PyJs_anonymous_3943_) + @Js + def PyJs_anonymous_3944_(dataA, dataB, this, arguments, var=var): + var = Scope({u'this':this, u'dataA':dataA, u'arguments':arguments, u'dataB':dataB}, var) + var.registers([u'index', u'end', u'dataA', u'dataB', u'start', u'length', u'data']) + var.put(u'index', Js(0.0)) + pass + pass + var.put(u'data', var.get(u'dataA').callprop(u'slice')) + var.put(u'length', var.get(u'dataB').get(u'length')) + while (var.get(u'index')<var.get(u'length')): + var.put(u'start', var.get(u'dataB').get(var.get(u'index'))) + var.put(u'end', (var.get(u'dataB').get((var.get(u'index')+Js(1.0)))-Js(1.0))) + if (var.get(u'start')==var.get(u'end')): + var.put(u'data', var.get(u'dataAdd')(var.get(u'data'), var.get(u'start'))) + else: + var.put(u'data', var.get(u'dataAddRange')(var.get(u'data'), var.get(u'start'), var.get(u'end'))) + var.put(u'index', Js(2.0), u'+') + return var.get(u'data') + PyJs_anonymous_3944_._set_name(u'anonymous') + var.put(u'dataAddData', PyJs_anonymous_3944_) + @Js + def PyJs_anonymous_3945_(dataA, dataB, this, arguments, var=var): + var = Scope({u'this':this, u'dataA':dataA, u'arguments':arguments, u'dataB':dataB}, var) + var.registers([u'index', u'end', u'dataA', u'dataB', u'start', u'length', u'data']) + var.put(u'index', Js(0.0)) + pass + pass + var.put(u'data', var.get(u'dataA').callprop(u'slice')) + var.put(u'length', var.get(u'dataB').get(u'length')) + while (var.get(u'index')<var.get(u'length')): + var.put(u'start', var.get(u'dataB').get(var.get(u'index'))) + var.put(u'end', (var.get(u'dataB').get((var.get(u'index')+Js(1.0)))-Js(1.0))) + if (var.get(u'start')==var.get(u'end')): + var.put(u'data', var.get(u'dataRemove')(var.get(u'data'), var.get(u'start'))) + else: + var.put(u'data', var.get(u'dataRemoveRange')(var.get(u'data'), var.get(u'start'), var.get(u'end'))) + var.put(u'index', Js(2.0), u'+') + return var.get(u'data') + PyJs_anonymous_3945_._set_name(u'anonymous') + var.put(u'dataRemoveData', PyJs_anonymous_3945_) + @Js + def PyJs_anonymous_3946_(data, rangeStart, rangeEnd, this, arguments, var=var): + var = Scope({u'this':this, u'data':data, u'arguments':arguments, u'rangeEnd':rangeEnd, u'rangeStart':rangeStart}, var) + var.registers([u'index', u'added', u'end', u'rangeEnd', u'rangeStart', u'start', u'length', u'data']) + if (var.get(u'rangeEnd')<var.get(u'rangeStart')): + PyJsTempException = JsToPyException(var.get(u'Error')(var.get(u'ERRORS').get(u'rangeOrder'))) + raise PyJsTempException + if ((((var.get(u'rangeStart')<Js(0)) or (var.get(u'rangeStart')>Js(1114111))) or (var.get(u'rangeEnd')<Js(0))) or (var.get(u'rangeEnd')>Js(1114111))): + PyJsTempException = JsToPyException(var.get(u'RangeError')(var.get(u'ERRORS').get(u'codePointRange'))) + raise PyJsTempException + var.put(u'index', Js(0.0)) + pass + pass + var.put(u'added', Js(False)) + var.put(u'length', var.get(u'data').get(u'length')) + while (var.get(u'index')<var.get(u'length')): + var.put(u'start', var.get(u'data').get(var.get(u'index'))) + var.put(u'end', var.get(u'data').get((var.get(u'index')+Js(1.0)))) + if var.get(u'added'): + if (var.get(u'start')==(var.get(u'rangeEnd')+Js(1.0))): + var.get(u'data').callprop(u'splice', (var.get(u'index')-Js(1.0)), Js(2.0)) + return var.get(u'data') + if (var.get(u'start')>var.get(u'rangeEnd')): + return var.get(u'data') + if ((var.get(u'start')>=var.get(u'rangeStart')) and (var.get(u'start')<=var.get(u'rangeEnd'))): + if ((var.get(u'end')>var.get(u'rangeStart')) and ((var.get(u'end')-Js(1.0))<=var.get(u'rangeEnd'))): + var.get(u'data').callprop(u'splice', var.get(u'index'), Js(2.0)) + var.put(u'index', Js(2.0), u'-') + else: + var.get(u'data').callprop(u'splice', (var.get(u'index')-Js(1.0)), Js(2.0)) + var.put(u'index', Js(2.0), u'-') + else: + if (var.get(u'start')==(var.get(u'rangeEnd')+Js(1.0))): + var.get(u'data').put(var.get(u'index'), var.get(u'rangeStart')) + return var.get(u'data') + else: + if (var.get(u'start')>var.get(u'rangeEnd')): + var.get(u'data').callprop(u'splice', var.get(u'index'), Js(0.0), var.get(u'rangeStart'), (var.get(u'rangeEnd')+Js(1.0))) + return var.get(u'data') + else: + if (((var.get(u'rangeStart')>=var.get(u'start')) and (var.get(u'rangeStart')<var.get(u'end'))) and ((var.get(u'rangeEnd')+Js(1.0))<=var.get(u'end'))): + return var.get(u'data') + else: + if (((var.get(u'rangeStart')>=var.get(u'start')) and (var.get(u'rangeStart')<var.get(u'end'))) or (var.get(u'end')==var.get(u'rangeStart'))): + var.get(u'data').put((var.get(u'index')+Js(1.0)), (var.get(u'rangeEnd')+Js(1.0))) + var.put(u'added', var.get(u'true')) + else: + if ((var.get(u'rangeStart')<=var.get(u'start')) and ((var.get(u'rangeEnd')+Js(1.0))>=var.get(u'end'))): + var.get(u'data').put(var.get(u'index'), var.get(u'rangeStart')) + var.get(u'data').put((var.get(u'index')+Js(1.0)), (var.get(u'rangeEnd')+Js(1.0))) + var.put(u'added', var.get(u'true')) + var.put(u'index', Js(2.0), u'+') + if var.get(u'added').neg(): + var.get(u'data').callprop(u'push', var.get(u'rangeStart'), (var.get(u'rangeEnd')+Js(1.0))) + return var.get(u'data') + PyJs_anonymous_3946_._set_name(u'anonymous') + var.put(u'dataAddRange', PyJs_anonymous_3946_) + @Js + def PyJs_anonymous_3947_(data, codePoint, this, arguments, var=var): + var = Scope({u'this':this, u'codePoint':codePoint, u'data':data, u'arguments':arguments}, var) + var.registers([u'index', u'codePoint', u'end', u'start', u'length', u'data']) + var.put(u'index', Js(0.0)) + var.put(u'length', var.get(u'data').get(u'length')) + var.put(u'start', var.get(u'data').get(var.get(u'index'))) + var.put(u'end', var.get(u'data').get((var.get(u'length')-Js(1.0)))) + if (var.get(u'length')>=Js(2.0)): + if ((var.get(u'codePoint')<var.get(u'start')) or (var.get(u'codePoint')>var.get(u'end'))): + return Js(False) + while (var.get(u'index')<var.get(u'length')): + var.put(u'start', var.get(u'data').get(var.get(u'index'))) + var.put(u'end', var.get(u'data').get((var.get(u'index')+Js(1.0)))) + if ((var.get(u'codePoint')>=var.get(u'start')) and (var.get(u'codePoint')<var.get(u'end'))): + return var.get(u'true') + var.put(u'index', Js(2.0), u'+') + return Js(False) + PyJs_anonymous_3947_._set_name(u'anonymous') + var.put(u'dataContains', PyJs_anonymous_3947_) + @Js + def PyJs_anonymous_3948_(data, codePoints, this, arguments, var=var): + var = Scope({u'codePoints':codePoints, u'this':this, u'data':data, u'arguments':arguments}, var) + var.registers([u'index', u'codePoint', u'length', u'result', u'codePoints', u'data']) + var.put(u'index', Js(0.0)) + var.put(u'length', var.get(u'codePoints').get(u'length')) + pass + var.put(u'result', Js([])) + while (var.get(u'index')<var.get(u'length')): + var.put(u'codePoint', var.get(u'codePoints').get(var.get(u'index'))) + if var.get(u'dataContains')(var.get(u'data'), var.get(u'codePoint')): + var.get(u'result').callprop(u'push', var.get(u'codePoint')) + var.put(u'index',Js(var.get(u'index').to_number())+Js(1)) + return var.get(u'dataFromCodePoints')(var.get(u'result')) + PyJs_anonymous_3948_._set_name(u'anonymous') + var.put(u'dataIntersection', PyJs_anonymous_3948_) + @Js + def PyJs_anonymous_3949_(data, this, arguments, var=var): + var = Scope({u'this':this, u'data':data, u'arguments':arguments}, var) + var.registers([u'data']) + return var.get(u'data').get(u'length').neg() + PyJs_anonymous_3949_._set_name(u'anonymous') + var.put(u'dataIsEmpty', PyJs_anonymous_3949_) + @Js + def PyJs_anonymous_3950_(data, this, arguments, var=var): + var = Scope({u'this':this, u'data':data, u'arguments':arguments}, var) + var.registers([u'data']) + return ((var.get(u'data').get(u'length')==Js(2.0)) and ((var.get(u'data').get(u'0')+Js(1.0))==var.get(u'data').get(u'1'))) + PyJs_anonymous_3950_._set_name(u'anonymous') + var.put(u'dataIsSingleton', PyJs_anonymous_3950_) + @Js + def PyJs_anonymous_3951_(data, this, arguments, var=var): + var = Scope({u'this':this, u'data':data, u'arguments':arguments}, var) + var.registers([u'index', u'end', u'start', u'length', u'result', u'data']) + var.put(u'index', Js(0.0)) + pass + pass + var.put(u'result', Js([])) + var.put(u'length', var.get(u'data').get(u'length')) + while (var.get(u'index')<var.get(u'length')): + var.put(u'start', var.get(u'data').get(var.get(u'index'))) + var.put(u'end', var.get(u'data').get((var.get(u'index')+Js(1.0)))) + while (var.get(u'start')<var.get(u'end')): + var.get(u'result').callprop(u'push', var.get(u'start')) + var.put(u'start',Js(var.get(u'start').to_number())+Js(1)) + var.put(u'index', Js(2.0), u'+') + return var.get(u'result') + PyJs_anonymous_3951_._set_name(u'anonymous') + var.put(u'dataToArray', PyJs_anonymous_3951_) + var.put(u'floor', var.get(u'Math').get(u'floor')) + @Js + def PyJs_anonymous_3952_(codePoint, this, arguments, var=var): + var = Scope({u'this':this, u'codePoint':codePoint, u'arguments':arguments}, var) + var.registers([u'codePoint']) + return var.get(u'parseInt')((var.get(u'floor')(((var.get(u'codePoint')-Js(65536))/Js(1024)))+var.get(u'HIGH_SURROGATE_MIN')), Js(10.0)) + PyJs_anonymous_3952_._set_name(u'anonymous') + var.put(u'highSurrogate', PyJs_anonymous_3952_) + @Js + def PyJs_anonymous_3953_(codePoint, this, arguments, var=var): + var = Scope({u'this':this, u'codePoint':codePoint, u'arguments':arguments}, var) + var.registers([u'codePoint']) + return var.get(u'parseInt')((((var.get(u'codePoint')-Js(65536))%Js(1024))+var.get(u'LOW_SURROGATE_MIN')), Js(10.0)) + PyJs_anonymous_3953_._set_name(u'anonymous') + var.put(u'lowSurrogate', PyJs_anonymous_3953_) + var.put(u'stringFromCharCode', var.get(u'String').get(u'fromCharCode')) + @Js + def PyJs_anonymous_3954_(codePoint, this, arguments, var=var): + var = Scope({u'this':this, u'codePoint':codePoint, u'arguments':arguments}, var) + var.registers([u'codePoint', u'string']) + pass + if (var.get(u'codePoint')==Js(9)): + var.put(u'string', Js(u'\\t')) + else: + if (var.get(u'codePoint')==Js(10)): + var.put(u'string', Js(u'\\n')) + else: + if (var.get(u'codePoint')==Js(12)): + var.put(u'string', Js(u'\\f')) + else: + if (var.get(u'codePoint')==Js(13)): + var.put(u'string', Js(u'\\r')) + else: + if (var.get(u'codePoint')==Js(92)): + var.put(u'string', Js(u'\\\\')) + else: + if (((((((var.get(u'codePoint')==Js(36)) or ((var.get(u'codePoint')>=Js(40)) and (var.get(u'codePoint')<=Js(43)))) or (var.get(u'codePoint')==Js(45))) or (var.get(u'codePoint')==Js(46))) or (var.get(u'codePoint')==Js(63))) or ((var.get(u'codePoint')>=Js(91)) and (var.get(u'codePoint')<=Js(94)))) or ((var.get(u'codePoint')>=Js(123)) and (var.get(u'codePoint')<=Js(125)))): + var.put(u'string', (Js(u'\\')+var.get(u'stringFromCharCode')(var.get(u'codePoint')))) + else: + if ((var.get(u'codePoint')>=Js(32)) and (var.get(u'codePoint')<=Js(126))): + var.put(u'string', var.get(u'stringFromCharCode')(var.get(u'codePoint'))) + else: + if (var.get(u'codePoint')<=Js(255)): + var.put(u'string', (Js(u'\\x')+var.get(u'pad')(var.get(u'hex')(var.get(u'codePoint')), Js(2.0)))) + else: + var.put(u'string', (Js(u'\\u')+var.get(u'pad')(var.get(u'hex')(var.get(u'codePoint')), Js(4.0)))) + return var.get(u'string') + PyJs_anonymous_3954_._set_name(u'anonymous') + var.put(u'codePointToString', PyJs_anonymous_3954_) + @Js + def PyJs_anonymous_3955_(codePoint, this, arguments, var=var): + var = Scope({u'this':this, u'codePoint':codePoint, u'arguments':arguments}, var) + var.registers([u'codePoint']) + if (var.get(u'codePoint')<=Js(65535)): + return var.get(u'codePointToString')(var.get(u'codePoint')) + return ((Js(u'\\u{')+var.get(u'codePoint').callprop(u'toString', Js(16.0)).callprop(u'toUpperCase'))+Js(u'}')) + PyJs_anonymous_3955_._set_name(u'anonymous') + var.put(u'codePointToStringUnicode', PyJs_anonymous_3955_) + @Js + def PyJs_anonymous_3956_(symbol, this, arguments, var=var): + var = Scope({u'this':this, u'symbol':symbol, u'arguments':arguments}, var) + var.registers([u'symbol', u'length', u'second', u'first']) + var.put(u'length', var.get(u'symbol').get(u'length')) + var.put(u'first', var.get(u'symbol').callprop(u'charCodeAt', Js(0.0))) + pass + if (((var.get(u'first')>=var.get(u'HIGH_SURROGATE_MIN')) and (var.get(u'first')<=var.get(u'HIGH_SURROGATE_MAX'))) and (var.get(u'length')>Js(1.0))): + var.put(u'second', var.get(u'symbol').callprop(u'charCodeAt', Js(1.0))) + return (((((var.get(u'first')-var.get(u'HIGH_SURROGATE_MIN'))*Js(1024))+var.get(u'second'))-var.get(u'LOW_SURROGATE_MIN'))+Js(65536)) + return var.get(u'first') + PyJs_anonymous_3956_._set_name(u'anonymous') + var.put(u'symbolToCodePoint', PyJs_anonymous_3956_) + @Js + def PyJs_anonymous_3957_(data, this, arguments, var=var): + var = Scope({u'this':this, u'data':data, u'arguments':arguments}, var) + var.registers([u'index', u'end', u'start', u'length', u'result', u'data']) + var.put(u'result', Js(u'')) + var.put(u'index', Js(0.0)) + pass + pass + var.put(u'length', var.get(u'data').get(u'length')) + if var.get(u'dataIsSingleton')(var.get(u'data')): + return var.get(u'codePointToString')(var.get(u'data').get(u'0')) + while (var.get(u'index')<var.get(u'length')): + var.put(u'start', var.get(u'data').get(var.get(u'index'))) + var.put(u'end', (var.get(u'data').get((var.get(u'index')+Js(1.0)))-Js(1.0))) + if (var.get(u'start')==var.get(u'end')): + var.put(u'result', var.get(u'codePointToString')(var.get(u'start')), u'+') + else: + if ((var.get(u'start')+Js(1.0))==var.get(u'end')): + var.put(u'result', (var.get(u'codePointToString')(var.get(u'start'))+var.get(u'codePointToString')(var.get(u'end'))), u'+') + else: + var.put(u'result', ((var.get(u'codePointToString')(var.get(u'start'))+Js(u'-'))+var.get(u'codePointToString')(var.get(u'end'))), u'+') + var.put(u'index', Js(2.0), u'+') + return ((Js(u'[')+var.get(u'result'))+Js(u']')) + PyJs_anonymous_3957_._set_name(u'anonymous') + var.put(u'createBMPCharacterClasses', PyJs_anonymous_3957_) + @Js + def PyJs_anonymous_3958_(data, this, arguments, var=var): + var = Scope({u'this':this, u'data':data, u'arguments':arguments}, var) + var.registers([u'index', u'end', u'start', u'length', u'result', u'data']) + var.put(u'result', Js(u'')) + var.put(u'index', Js(0.0)) + pass + pass + var.put(u'length', var.get(u'data').get(u'length')) + if var.get(u'dataIsSingleton')(var.get(u'data')): + return var.get(u'codePointToStringUnicode')(var.get(u'data').get(u'0')) + while (var.get(u'index')<var.get(u'length')): + var.put(u'start', var.get(u'data').get(var.get(u'index'))) + var.put(u'end', (var.get(u'data').get((var.get(u'index')+Js(1.0)))-Js(1.0))) + if (var.get(u'start')==var.get(u'end')): + var.put(u'result', var.get(u'codePointToStringUnicode')(var.get(u'start')), u'+') + else: + if ((var.get(u'start')+Js(1.0))==var.get(u'end')): + var.put(u'result', (var.get(u'codePointToStringUnicode')(var.get(u'start'))+var.get(u'codePointToStringUnicode')(var.get(u'end'))), u'+') + else: + var.put(u'result', ((var.get(u'codePointToStringUnicode')(var.get(u'start'))+Js(u'-'))+var.get(u'codePointToStringUnicode')(var.get(u'end'))), u'+') + var.put(u'index', Js(2.0), u'+') + return ((Js(u'[')+var.get(u'result'))+Js(u']')) + PyJs_anonymous_3958_._set_name(u'anonymous') + var.put(u'createUnicodeCharacterClasses', PyJs_anonymous_3958_) + @Js + def PyJs_anonymous_3959_(data, this, arguments, var=var): + var = Scope({u'this':this, u'data':data, u'arguments':arguments}, var) + var.registers([u'index', u'end', u'loneLowSurrogates', u'length', u'start', u'bmp', u'astral', u'data', u'loneHighSurrogates']) + var.put(u'loneHighSurrogates', Js([])) + var.put(u'loneLowSurrogates', Js([])) + var.put(u'bmp', Js([])) + var.put(u'astral', Js([])) + var.put(u'index', Js(0.0)) + pass + pass + var.put(u'length', var.get(u'data').get(u'length')) + while (var.get(u'index')<var.get(u'length')): + var.put(u'start', var.get(u'data').get(var.get(u'index'))) + var.put(u'end', (var.get(u'data').get((var.get(u'index')+Js(1.0)))-Js(1.0))) + if (var.get(u'start')<var.get(u'HIGH_SURROGATE_MIN')): + if (var.get(u'end')<var.get(u'HIGH_SURROGATE_MIN')): + var.get(u'bmp').callprop(u'push', var.get(u'start'), (var.get(u'end')+Js(1.0))) + if ((var.get(u'end')>=var.get(u'HIGH_SURROGATE_MIN')) and (var.get(u'end')<=var.get(u'HIGH_SURROGATE_MAX'))): + var.get(u'bmp').callprop(u'push', var.get(u'start'), var.get(u'HIGH_SURROGATE_MIN')) + var.get(u'loneHighSurrogates').callprop(u'push', var.get(u'HIGH_SURROGATE_MIN'), (var.get(u'end')+Js(1.0))) + if ((var.get(u'end')>=var.get(u'LOW_SURROGATE_MIN')) and (var.get(u'end')<=var.get(u'LOW_SURROGATE_MAX'))): + var.get(u'bmp').callprop(u'push', var.get(u'start'), var.get(u'HIGH_SURROGATE_MIN')) + var.get(u'loneHighSurrogates').callprop(u'push', var.get(u'HIGH_SURROGATE_MIN'), (var.get(u'HIGH_SURROGATE_MAX')+Js(1.0))) + var.get(u'loneLowSurrogates').callprop(u'push', var.get(u'LOW_SURROGATE_MIN'), (var.get(u'end')+Js(1.0))) + if (var.get(u'end')>var.get(u'LOW_SURROGATE_MAX')): + var.get(u'bmp').callprop(u'push', var.get(u'start'), var.get(u'HIGH_SURROGATE_MIN')) + var.get(u'loneHighSurrogates').callprop(u'push', var.get(u'HIGH_SURROGATE_MIN'), (var.get(u'HIGH_SURROGATE_MAX')+Js(1.0))) + var.get(u'loneLowSurrogates').callprop(u'push', var.get(u'LOW_SURROGATE_MIN'), (var.get(u'LOW_SURROGATE_MAX')+Js(1.0))) + if (var.get(u'end')<=Js(65535)): + var.get(u'bmp').callprop(u'push', (var.get(u'LOW_SURROGATE_MAX')+Js(1.0)), (var.get(u'end')+Js(1.0))) + else: + var.get(u'bmp').callprop(u'push', (var.get(u'LOW_SURROGATE_MAX')+Js(1.0)), (Js(65535)+Js(1.0))) + var.get(u'astral').callprop(u'push', (Js(65535)+Js(1.0)), (var.get(u'end')+Js(1.0))) + else: + if ((var.get(u'start')>=var.get(u'HIGH_SURROGATE_MIN')) and (var.get(u'start')<=var.get(u'HIGH_SURROGATE_MAX'))): + if ((var.get(u'end')>=var.get(u'HIGH_SURROGATE_MIN')) and (var.get(u'end')<=var.get(u'HIGH_SURROGATE_MAX'))): + var.get(u'loneHighSurrogates').callprop(u'push', var.get(u'start'), (var.get(u'end')+Js(1.0))) + if ((var.get(u'end')>=var.get(u'LOW_SURROGATE_MIN')) and (var.get(u'end')<=var.get(u'LOW_SURROGATE_MAX'))): + var.get(u'loneHighSurrogates').callprop(u'push', var.get(u'start'), (var.get(u'HIGH_SURROGATE_MAX')+Js(1.0))) + var.get(u'loneLowSurrogates').callprop(u'push', var.get(u'LOW_SURROGATE_MIN'), (var.get(u'end')+Js(1.0))) + if (var.get(u'end')>var.get(u'LOW_SURROGATE_MAX')): + var.get(u'loneHighSurrogates').callprop(u'push', var.get(u'start'), (var.get(u'HIGH_SURROGATE_MAX')+Js(1.0))) + var.get(u'loneLowSurrogates').callprop(u'push', var.get(u'LOW_SURROGATE_MIN'), (var.get(u'LOW_SURROGATE_MAX')+Js(1.0))) + if (var.get(u'end')<=Js(65535)): + var.get(u'bmp').callprop(u'push', (var.get(u'LOW_SURROGATE_MAX')+Js(1.0)), (var.get(u'end')+Js(1.0))) + else: + var.get(u'bmp').callprop(u'push', (var.get(u'LOW_SURROGATE_MAX')+Js(1.0)), (Js(65535)+Js(1.0))) + var.get(u'astral').callprop(u'push', (Js(65535)+Js(1.0)), (var.get(u'end')+Js(1.0))) + else: + if ((var.get(u'start')>=var.get(u'LOW_SURROGATE_MIN')) and (var.get(u'start')<=var.get(u'LOW_SURROGATE_MAX'))): + if ((var.get(u'end')>=var.get(u'LOW_SURROGATE_MIN')) and (var.get(u'end')<=var.get(u'LOW_SURROGATE_MAX'))): + var.get(u'loneLowSurrogates').callprop(u'push', var.get(u'start'), (var.get(u'end')+Js(1.0))) + if (var.get(u'end')>var.get(u'LOW_SURROGATE_MAX')): + var.get(u'loneLowSurrogates').callprop(u'push', var.get(u'start'), (var.get(u'LOW_SURROGATE_MAX')+Js(1.0))) + if (var.get(u'end')<=Js(65535)): + var.get(u'bmp').callprop(u'push', (var.get(u'LOW_SURROGATE_MAX')+Js(1.0)), (var.get(u'end')+Js(1.0))) + else: + var.get(u'bmp').callprop(u'push', (var.get(u'LOW_SURROGATE_MAX')+Js(1.0)), (Js(65535)+Js(1.0))) + var.get(u'astral').callprop(u'push', (Js(65535)+Js(1.0)), (var.get(u'end')+Js(1.0))) + else: + if ((var.get(u'start')>var.get(u'LOW_SURROGATE_MAX')) and (var.get(u'start')<=Js(65535))): + if (var.get(u'end')<=Js(65535)): + var.get(u'bmp').callprop(u'push', var.get(u'start'), (var.get(u'end')+Js(1.0))) + else: + var.get(u'bmp').callprop(u'push', var.get(u'start'), (Js(65535)+Js(1.0))) + var.get(u'astral').callprop(u'push', (Js(65535)+Js(1.0)), (var.get(u'end')+Js(1.0))) + else: + var.get(u'astral').callprop(u'push', var.get(u'start'), (var.get(u'end')+Js(1.0))) + var.put(u'index', Js(2.0), u'+') + PyJs_Object_3960_ = Js({u'loneHighSurrogates':var.get(u'loneHighSurrogates'),u'loneLowSurrogates':var.get(u'loneLowSurrogates'),u'bmp':var.get(u'bmp'),u'astral':var.get(u'astral')}) + return PyJs_Object_3960_ + PyJs_anonymous_3959_._set_name(u'anonymous') + var.put(u'splitAtBMP', PyJs_anonymous_3959_) + @Js + def PyJs_anonymous_3961_(surrogateMappings, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'surrogateMappings':surrogateMappings}, var) + var.registers([u'nextMapping', u'index', u'lowSurrogates', u'addLow', u'highSurrogates', u'mapping', u'tmpLow', u'length', u'result', u'nextLowSurrogates', u'nextHighSurrogates', u'surrogateMappings']) + var.put(u'result', Js([])) + var.put(u'tmpLow', Js([])) + var.put(u'addLow', Js(False)) + pass + pass + pass + pass + pass + pass + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'surrogateMappings').get(u'length')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'mapping', var.get(u'surrogateMappings').get(var.get(u'index'))) + var.put(u'nextMapping', var.get(u'surrogateMappings').get((var.get(u'index')+Js(1.0)))) + if var.get(u'nextMapping').neg(): + var.get(u'result').callprop(u'push', var.get(u'mapping')) + continue + var.put(u'highSurrogates', var.get(u'mapping').get(u'0')) + var.put(u'lowSurrogates', var.get(u'mapping').get(u'1')) + var.put(u'nextHighSurrogates', var.get(u'nextMapping').get(u'0')) + var.put(u'nextLowSurrogates', var.get(u'nextMapping').get(u'1')) + var.put(u'tmpLow', var.get(u'lowSurrogates')) + while ((var.get(u'nextHighSurrogates') and (var.get(u'highSurrogates').get(u'0')==var.get(u'nextHighSurrogates').get(u'0'))) and (var.get(u'highSurrogates').get(u'1')==var.get(u'nextHighSurrogates').get(u'1'))): + if var.get(u'dataIsSingleton')(var.get(u'nextLowSurrogates')): + var.put(u'tmpLow', var.get(u'dataAdd')(var.get(u'tmpLow'), var.get(u'nextLowSurrogates').get(u'0'))) + else: + var.put(u'tmpLow', var.get(u'dataAddRange')(var.get(u'tmpLow'), var.get(u'nextLowSurrogates').get(u'0'), (var.get(u'nextLowSurrogates').get(u'1')-Js(1.0)))) + var.put(u'index',Js(var.get(u'index').to_number())+Js(1)) + var.put(u'mapping', var.get(u'surrogateMappings').get(var.get(u'index'))) + var.put(u'highSurrogates', var.get(u'mapping').get(u'0')) + var.put(u'lowSurrogates', var.get(u'mapping').get(u'1')) + var.put(u'nextMapping', var.get(u'surrogateMappings').get((var.get(u'index')+Js(1.0)))) + var.put(u'nextHighSurrogates', (var.get(u'nextMapping') and var.get(u'nextMapping').get(u'0'))) + var.put(u'nextLowSurrogates', (var.get(u'nextMapping') and var.get(u'nextMapping').get(u'1'))) + var.put(u'addLow', var.get(u'true')) + var.get(u'result').callprop(u'push', Js([var.get(u'highSurrogates'), (var.get(u'tmpLow') if var.get(u'addLow') else var.get(u'lowSurrogates'))])) + var.put(u'addLow', Js(False)) + return var.get(u'optimizeByLowSurrogates')(var.get(u'result')) + PyJs_anonymous_3961_._set_name(u'anonymous') + var.put(u'optimizeSurrogateMappings', PyJs_anonymous_3961_) + @Js + def PyJs_anonymous_3962_(surrogateMappings, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'surrogateMappings':surrogateMappings}, var) + var.registers([u'index', u'lowSurrogates', u'lowSurrogateEnd', u'lowSurrogateStart', u'mapping', u'otherMapping', u'otherLowSurrogateEnd', u'otherLowSurrogates', u'surrogateMappings', u'otherLowSurrogateStart', u'innerIndex']) + if (var.get(u'surrogateMappings').get(u'length')==Js(1.0)): + return var.get(u'surrogateMappings') + var.put(u'index', (-Js(1.0))) + var.put(u'innerIndex', (-Js(1.0))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'surrogateMappings').get(u'length')): + var.put(u'mapping', var.get(u'surrogateMappings').get(var.get(u'index'))) + var.put(u'lowSurrogates', var.get(u'mapping').get(u'1')) + var.put(u'lowSurrogateStart', var.get(u'lowSurrogates').get(u'0')) + var.put(u'lowSurrogateEnd', var.get(u'lowSurrogates').get(u'1')) + var.put(u'innerIndex', var.get(u'index')) + while (var.put(u'innerIndex',Js(var.get(u'innerIndex').to_number())+Js(1))<var.get(u'surrogateMappings').get(u'length')): + var.put(u'otherMapping', var.get(u'surrogateMappings').get(var.get(u'innerIndex'))) + var.put(u'otherLowSurrogates', var.get(u'otherMapping').get(u'1')) + var.put(u'otherLowSurrogateStart', var.get(u'otherLowSurrogates').get(u'0')) + var.put(u'otherLowSurrogateEnd', var.get(u'otherLowSurrogates').get(u'1')) + if ((var.get(u'lowSurrogateStart')==var.get(u'otherLowSurrogateStart')) and (var.get(u'lowSurrogateEnd')==var.get(u'otherLowSurrogateEnd'))): + if var.get(u'dataIsSingleton')(var.get(u'otherMapping').get(u'0')): + var.get(u'mapping').put(u'0', var.get(u'dataAdd')(var.get(u'mapping').get(u'0'), var.get(u'otherMapping').get(u'0').get(u'0'))) + else: + var.get(u'mapping').put(u'0', var.get(u'dataAddRange')(var.get(u'mapping').get(u'0'), var.get(u'otherMapping').get(u'0').get(u'0'), (var.get(u'otherMapping').get(u'0').get(u'1')-Js(1.0)))) + var.get(u'surrogateMappings').callprop(u'splice', var.get(u'innerIndex'), Js(1.0)) + var.put(u'innerIndex',Js(var.get(u'innerIndex').to_number())-Js(1)) + return var.get(u'surrogateMappings') + PyJs_anonymous_3962_._set_name(u'anonymous') + var.put(u'optimizeByLowSurrogates', PyJs_anonymous_3962_) + @Js + def PyJs_anonymous_3963_(data, this, arguments, var=var): + var = Scope({u'this':this, u'data':data, u'arguments':arguments}, var) + var.registers([u'index', u'startLow', u'end', u'complete', u'startHigh', u'startsWithLowestLowSurrogate', u'start', u'length', u'endsWithHighestLowSurrogate', u'endHigh', u'data', u'endLow', u'surrogateMappings']) + if var.get(u'data').get(u'length').neg(): + return Js([]) + var.put(u'index', Js(0.0)) + pass + pass + pass + pass + pass + pass + var.put(u'surrogateMappings', Js([])) + var.put(u'length', var.get(u'data').get(u'length')) + while (var.get(u'index')<var.get(u'length')): + var.put(u'start', var.get(u'data').get(var.get(u'index'))) + var.put(u'end', (var.get(u'data').get((var.get(u'index')+Js(1.0)))-Js(1.0))) + var.put(u'startHigh', var.get(u'highSurrogate')(var.get(u'start'))) + var.put(u'startLow', var.get(u'lowSurrogate')(var.get(u'start'))) + var.put(u'endHigh', var.get(u'highSurrogate')(var.get(u'end'))) + var.put(u'endLow', var.get(u'lowSurrogate')(var.get(u'end'))) + var.put(u'startsWithLowestLowSurrogate', (var.get(u'startLow')==var.get(u'LOW_SURROGATE_MIN'))) + var.put(u'endsWithHighestLowSurrogate', (var.get(u'endLow')==var.get(u'LOW_SURROGATE_MAX'))) + var.put(u'complete', Js(False)) + if ((var.get(u'startHigh')==var.get(u'endHigh')) or (var.get(u'startsWithLowestLowSurrogate') and var.get(u'endsWithHighestLowSurrogate'))): + var.get(u'surrogateMappings').callprop(u'push', Js([Js([var.get(u'startHigh'), (var.get(u'endHigh')+Js(1.0))]), Js([var.get(u'startLow'), (var.get(u'endLow')+Js(1.0))])])) + var.put(u'complete', var.get(u'true')) + else: + var.get(u'surrogateMappings').callprop(u'push', Js([Js([var.get(u'startHigh'), (var.get(u'startHigh')+Js(1.0))]), Js([var.get(u'startLow'), (var.get(u'LOW_SURROGATE_MAX')+Js(1.0))])])) + if (var.get(u'complete').neg() and ((var.get(u'startHigh')+Js(1.0))<var.get(u'endHigh'))): + if var.get(u'endsWithHighestLowSurrogate'): + var.get(u'surrogateMappings').callprop(u'push', Js([Js([(var.get(u'startHigh')+Js(1.0)), (var.get(u'endHigh')+Js(1.0))]), Js([var.get(u'LOW_SURROGATE_MIN'), (var.get(u'endLow')+Js(1.0))])])) + var.put(u'complete', var.get(u'true')) + else: + var.get(u'surrogateMappings').callprop(u'push', Js([Js([(var.get(u'startHigh')+Js(1.0)), var.get(u'endHigh')]), Js([var.get(u'LOW_SURROGATE_MIN'), (var.get(u'LOW_SURROGATE_MAX')+Js(1.0))])])) + if var.get(u'complete').neg(): + var.get(u'surrogateMappings').callprop(u'push', Js([Js([var.get(u'endHigh'), (var.get(u'endHigh')+Js(1.0))]), Js([var.get(u'LOW_SURROGATE_MIN'), (var.get(u'endLow')+Js(1.0))])])) + var.put(u'index', Js(2.0), u'+') + return var.get(u'optimizeSurrogateMappings')(var.get(u'surrogateMappings')) + PyJs_anonymous_3963_._set_name(u'anonymous') + var.put(u'surrogateSet', PyJs_anonymous_3963_) + @Js + def PyJs_anonymous_3964_(surrogateMappings, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'surrogateMappings':surrogateMappings}, var) + var.registers([u'result', u'surrogateMappings']) + var.put(u'result', Js([])) + @Js + def PyJs_anonymous_3965_(surrogateMapping, this, arguments, var=var): + var = Scope({u'this':this, u'surrogateMapping':surrogateMapping, u'arguments':arguments}, var) + var.registers([u'lowSurrogates', u'highSurrogates', u'surrogateMapping']) + var.put(u'highSurrogates', var.get(u'surrogateMapping').get(u'0')) + var.put(u'lowSurrogates', var.get(u'surrogateMapping').get(u'1')) + var.get(u'result').callprop(u'push', (var.get(u'createBMPCharacterClasses')(var.get(u'highSurrogates'))+var.get(u'createBMPCharacterClasses')(var.get(u'lowSurrogates')))) + PyJs_anonymous_3965_._set_name(u'anonymous') + var.get(u'forEach')(var.get(u'surrogateMappings'), PyJs_anonymous_3965_) + return var.get(u'result').callprop(u'join', Js(u'|')) + PyJs_anonymous_3964_._set_name(u'anonymous') + var.put(u'createSurrogateCharacterClasses', PyJs_anonymous_3964_) + @Js + def PyJs_anonymous_3966_(data, bmpOnly, hasUnicodeFlag, this, arguments, var=var): + var = Scope({u'bmpOnly':bmpOnly, u'hasUnicodeFlag':hasUnicodeFlag, u'this':this, u'data':data, u'arguments':arguments}, var) + var.registers([u'hasLoneHighSurrogates', u'loneLowSurrogates', u'hasLoneLowSurrogates', u'bmp', u'parts', u'result', u'bmpOnly', u'hasUnicodeFlag', u'astral', u'data', u'surrogateMappings', u'loneHighSurrogates']) + if var.get(u'hasUnicodeFlag'): + return var.get(u'createUnicodeCharacterClasses')(var.get(u'data')) + var.put(u'result', Js([])) + var.put(u'parts', var.get(u'splitAtBMP')(var.get(u'data'))) + var.put(u'loneHighSurrogates', var.get(u'parts').get(u'loneHighSurrogates')) + var.put(u'loneLowSurrogates', var.get(u'parts').get(u'loneLowSurrogates')) + var.put(u'bmp', var.get(u'parts').get(u'bmp')) + var.put(u'astral', var.get(u'parts').get(u'astral')) + var.put(u'hasLoneHighSurrogates', var.get(u'dataIsEmpty')(var.get(u'loneHighSurrogates')).neg()) + var.put(u'hasLoneLowSurrogates', var.get(u'dataIsEmpty')(var.get(u'loneLowSurrogates')).neg()) + var.put(u'surrogateMappings', var.get(u'surrogateSet')(var.get(u'astral'))) + if var.get(u'bmpOnly'): + var.put(u'bmp', var.get(u'dataAddData')(var.get(u'bmp'), var.get(u'loneHighSurrogates'))) + var.put(u'hasLoneHighSurrogates', Js(False)) + var.put(u'bmp', var.get(u'dataAddData')(var.get(u'bmp'), var.get(u'loneLowSurrogates'))) + var.put(u'hasLoneLowSurrogates', Js(False)) + if var.get(u'dataIsEmpty')(var.get(u'bmp')).neg(): + var.get(u'result').callprop(u'push', var.get(u'createBMPCharacterClasses')(var.get(u'bmp'))) + if var.get(u'surrogateMappings').get(u'length'): + var.get(u'result').callprop(u'push', var.get(u'createSurrogateCharacterClasses')(var.get(u'surrogateMappings'))) + if var.get(u'hasLoneHighSurrogates'): + var.get(u'result').callprop(u'push', (var.get(u'createBMPCharacterClasses')(var.get(u'loneHighSurrogates'))+Js(u'(?![\\uDC00-\\uDFFF])'))) + if var.get(u'hasLoneLowSurrogates'): + var.get(u'result').callprop(u'push', (Js(u'(?:[^\\uD800-\\uDBFF]|^)')+var.get(u'createBMPCharacterClasses')(var.get(u'loneLowSurrogates')))) + return var.get(u'result').callprop(u'join', Js(u'|')) + PyJs_anonymous_3966_._set_name(u'anonymous') + var.put(u'createCharacterClassesFromData', PyJs_anonymous_3966_) + @Js + def PyJs_anonymous_3967_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + if (var.get(u'arguments').get(u'length')>Js(1.0)): + var.put(u'value', var.get(u'slice').callprop(u'call', var.get(u'arguments'))) + if var.get(u"this").instanceof(var.get(u'regenerate')): + var.get(u"this").put(u'data', Js([])) + return (var.get(u"this").callprop(u'add', var.get(u'value')) if var.get(u'value') else var.get(u"this")) + return var.get(u'regenerate').create().callprop(u'add', var.get(u'value')) + PyJs_anonymous_3967_._set_name(u'anonymous') + var.put(u'regenerate', PyJs_anonymous_3967_) + var.get(u'regenerate').put(u'version', Js(u'1.3.2')) + var.put(u'proto', var.get(u'regenerate').get(u'prototype')) + @Js + def PyJs_anonymous_3969_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'$this', u'value']) + var.put(u'$this', var.get(u"this")) + if (var.get(u'value')==var.get(u"null")): + return var.get(u'$this') + if var.get(u'value').instanceof(var.get(u'regenerate')): + var.get(u'$this').put(u'data', var.get(u'dataAddData')(var.get(u'$this').get(u'data'), var.get(u'value').get(u'data'))) + return var.get(u'$this') + if (var.get(u'arguments').get(u'length')>Js(1.0)): + var.put(u'value', var.get(u'slice').callprop(u'call', var.get(u'arguments'))) + if var.get(u'isArray')(var.get(u'value')): + @Js + def PyJs_anonymous_3970_(item, this, arguments, var=var): + var = Scope({u'this':this, u'item':item, u'arguments':arguments}, var) + var.registers([u'item']) + var.get(u'$this').callprop(u'add', var.get(u'item')) + PyJs_anonymous_3970_._set_name(u'anonymous') + var.get(u'forEach')(var.get(u'value'), PyJs_anonymous_3970_) + return var.get(u'$this') + var.get(u'$this').put(u'data', var.get(u'dataAdd')(var.get(u'$this').get(u'data'), (var.get(u'value') if var.get(u'isNumber')(var.get(u'value')) else var.get(u'symbolToCodePoint')(var.get(u'value'))))) + return var.get(u'$this') + PyJs_anonymous_3969_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3971_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'$this', u'value']) + var.put(u'$this', var.get(u"this")) + if (var.get(u'value')==var.get(u"null")): + return var.get(u'$this') + if var.get(u'value').instanceof(var.get(u'regenerate')): + var.get(u'$this').put(u'data', var.get(u'dataRemoveData')(var.get(u'$this').get(u'data'), var.get(u'value').get(u'data'))) + return var.get(u'$this') + if (var.get(u'arguments').get(u'length')>Js(1.0)): + var.put(u'value', var.get(u'slice').callprop(u'call', var.get(u'arguments'))) + if var.get(u'isArray')(var.get(u'value')): + @Js + def PyJs_anonymous_3972_(item, this, arguments, var=var): + var = Scope({u'this':this, u'item':item, u'arguments':arguments}, var) + var.registers([u'item']) + var.get(u'$this').callprop(u'remove', var.get(u'item')) + PyJs_anonymous_3972_._set_name(u'anonymous') + var.get(u'forEach')(var.get(u'value'), PyJs_anonymous_3972_) + return var.get(u'$this') + var.get(u'$this').put(u'data', var.get(u'dataRemove')(var.get(u'$this').get(u'data'), (var.get(u'value') if var.get(u'isNumber')(var.get(u'value')) else var.get(u'symbolToCodePoint')(var.get(u'value'))))) + return var.get(u'$this') + PyJs_anonymous_3971_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3973_(start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'arguments':arguments}, var) + var.registers([u'start', u'end', u'$this']) + var.put(u'$this', var.get(u"this")) + var.get(u'$this').put(u'data', var.get(u'dataAddRange')(var.get(u'$this').get(u'data'), (var.get(u'start') if var.get(u'isNumber')(var.get(u'start')) else var.get(u'symbolToCodePoint')(var.get(u'start'))), (var.get(u'end') if var.get(u'isNumber')(var.get(u'end')) else var.get(u'symbolToCodePoint')(var.get(u'end'))))) + return var.get(u'$this') + PyJs_anonymous_3973_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3974_(start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'arguments':arguments}, var) + var.registers([u'startCodePoint', u'endCodePoint', u'end', u'$this', u'start']) + var.put(u'$this', var.get(u"this")) + var.put(u'startCodePoint', (var.get(u'start') if var.get(u'isNumber')(var.get(u'start')) else var.get(u'symbolToCodePoint')(var.get(u'start')))) + var.put(u'endCodePoint', (var.get(u'end') if var.get(u'isNumber')(var.get(u'end')) else var.get(u'symbolToCodePoint')(var.get(u'end')))) + var.get(u'$this').put(u'data', var.get(u'dataRemoveRange')(var.get(u'$this').get(u'data'), var.get(u'startCodePoint'), var.get(u'endCodePoint'))) + return var.get(u'$this') + PyJs_anonymous_3974_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3975_(argument, this, arguments, var=var): + var = Scope({u'this':this, u'argument':argument, u'arguments':arguments}, var) + var.registers([u'array', u'$this', u'argument']) + var.put(u'$this', var.get(u"this")) + var.put(u'array', (var.get(u'dataToArray')(var.get(u'argument').get(u'data')) if var.get(u'argument').instanceof(var.get(u'regenerate')) else var.get(u'argument'))) + var.get(u'$this').put(u'data', var.get(u'dataIntersection')(var.get(u'$this').get(u'data'), var.get(u'array'))) + return var.get(u'$this') + PyJs_anonymous_3975_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3976_(codePoint, this, arguments, var=var): + var = Scope({u'this':this, u'codePoint':codePoint, u'arguments':arguments}, var) + var.registers([u'codePoint']) + return var.get(u'dataContains')(var.get(u"this").get(u'data'), (var.get(u'codePoint') if var.get(u'isNumber')(var.get(u'codePoint')) else var.get(u'symbolToCodePoint')(var.get(u'codePoint')))) + PyJs_anonymous_3976_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3977_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'set']) + var.put(u'set', var.get(u'regenerate').create()) + var.get(u'set').put(u'data', var.get(u"this").get(u'data').callprop(u'slice', Js(0.0))) + return var.get(u'set') + PyJs_anonymous_3977_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3978_(options, this, arguments, var=var): + var = Scope({u'this':this, u'options':options, u'arguments':arguments}, var) + var.registers([u'result', u'options']) + var.put(u'result', var.get(u'createCharacterClassesFromData')(var.get(u"this").get(u'data'), (var.get(u'options').get(u'bmpOnly') if var.get(u'options') else Js(False)), (var.get(u'options').get(u'hasUnicodeFlag') if var.get(u'options') else Js(False)))) + if var.get(u'result').neg(): + return Js(u'[]') + return var.get(u'result').callprop(u'replace', var.get(u'regexNull'), Js(u'\\0$1')) + PyJs_anonymous_3978_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3979_(flags, this, arguments, var=var): + var = Scope({u'this':this, u'flags':flags, u'arguments':arguments}, var) + var.registers([u'pattern', u'flags']) + PyJs_Object_3980_ = Js({u'hasUnicodeFlag':var.get(u'true')}) + var.put(u'pattern', var.get(u"this").callprop(u'toString', (PyJs_Object_3980_ if (var.get(u'flags') and (var.get(u'flags').callprop(u'indexOf', Js(u'u'))!=(-Js(1.0)))) else var.get(u"null")))) + return var.get(u'RegExp')(var.get(u'pattern'), (var.get(u'flags') or Js(u''))) + PyJs_anonymous_3979_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3981_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'dataToArray')(var.get(u"this").get(u'data')) + PyJs_anonymous_3981_._set_name(u'anonymous') + PyJs_Object_3968_ = Js({u'add':PyJs_anonymous_3969_,u'remove':PyJs_anonymous_3971_,u'addRange':PyJs_anonymous_3973_,u'removeRange':PyJs_anonymous_3974_,u'intersection':PyJs_anonymous_3975_,u'contains':PyJs_anonymous_3976_,u'clone':PyJs_anonymous_3977_,u'toString':PyJs_anonymous_3978_,u'toRegExp':PyJs_anonymous_3979_,u'valueOf':PyJs_anonymous_3981_}) + var.get(u'extend')(var.get(u'proto'), PyJs_Object_3968_) + var.get(u'proto').put(u'toArray', var.get(u'proto').get(u'valueOf')) + if (((var.get(u'define',throw=False).typeof()==Js(u'function')) and (var.get(u'define').get(u'amd').typeof()==Js(u'object'))) and var.get(u'define').get(u'amd')): + @Js + def PyJs_anonymous_3982_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'regenerate') + PyJs_anonymous_3982_._set_name(u'anonymous') + var.get(u'define')(PyJs_anonymous_3982_) + else: + if (var.get(u'freeExports') and var.get(u'freeExports').get(u'nodeType').neg()): + if var.get(u'freeModule'): + var.get(u'freeModule').put(u'exports', var.get(u'regenerate')) + else: + var.get(u'freeExports').put(u'regenerate', var.get(u'regenerate')) + else: + var.get(u'root').put(u'regenerate', var.get(u'regenerate')) + PyJs_anonymous_3931_._set_name(u'anonymous') + PyJs_anonymous_3931_(var.get(u"this")) + PyJs_anonymous_3930_._set_name(u'anonymous') + PyJs_anonymous_3930_.callprop(u'call', var.get(u"this"), (var.get(u'global') if PyJsStrictNeq(var.get(u'global',throw=False).typeof(),Js(u'undefined')) else (var.get(u'self') if PyJsStrictNeq(var.get(u'self',throw=False).typeof(),Js(u'undefined')) else (var.get(u'window') if PyJsStrictNeq(var.get(u'window',throw=False).typeof(),Js(u'undefined')) else PyJs_Object_3929_)))) +PyJs_anonymous_3928_._set_name(u'anonymous') +PyJs_Object_3983_ = Js({}) +@Js +def PyJs_anonymous_3984_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'regenerate', u'require', u'exports', u'module']) + var.put(u'regenerate', var.get(u'require')(Js(u'regenerate'))) + def PyJs_LONG_3986_(var=var): + return var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(8)).callprop(u'addRange', Js(14), Js(31)).callprop(u'addRange', Js(33), Js(159)).callprop(u'addRange', Js(161), Js(5759)).callprop(u'addRange', Js(5761), Js(8191)).callprop(u'addRange', Js(8203), Js(8231)).callprop(u'addRange', Js(8234), Js(8238)).callprop(u'addRange', Js(8240), Js(8286)).callprop(u'addRange', Js(8288), Js(12287)).callprop(u'addRange', Js(12289), Js(65278)) + PyJs_Object_3985_ = Js({u'd':var.get(u'regenerate')().callprop(u'addRange', Js(48), Js(57)),u'D':var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(47)).callprop(u'addRange', Js(58), Js(65535)),u's':var.get(u'regenerate')(Js(32), Js(160), Js(5760), Js(8239), Js(8287), Js(12288), Js(65279)).callprop(u'addRange', Js(9), Js(13)).callprop(u'addRange', Js(8192), Js(8202)).callprop(u'addRange', Js(8232), Js(8233)),u'S':PyJs_LONG_3986_().callprop(u'addRange', Js(65280), Js(65535)),u'w':var.get(u'regenerate')(Js(95)).callprop(u'addRange', Js(48), Js(57)).callprop(u'addRange', Js(65), Js(90)).callprop(u'addRange', Js(97), Js(122)),u'W':var.get(u'regenerate')(Js(96)).callprop(u'addRange', Js(0), Js(47)).callprop(u'addRange', Js(58), Js(64)).callprop(u'addRange', Js(91), Js(94)).callprop(u'addRange', Js(123), Js(65535))}) + var.get(u'exports').put(u'REGULAR', PyJs_Object_3985_) + def PyJs_LONG_3988_(var=var): + return var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(8)).callprop(u'addRange', Js(14), Js(31)).callprop(u'addRange', Js(33), Js(159)).callprop(u'addRange', Js(161), Js(5759)).callprop(u'addRange', Js(5761), Js(8191)).callprop(u'addRange', Js(8203), Js(8231)).callprop(u'addRange', Js(8234), Js(8238)).callprop(u'addRange', Js(8240), Js(8286)).callprop(u'addRange', Js(8288), Js(12287)).callprop(u'addRange', Js(12289), Js(65278)) + PyJs_Object_3987_ = Js({u'd':var.get(u'regenerate')().callprop(u'addRange', Js(48), Js(57)),u'D':var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(47)).callprop(u'addRange', Js(58), Js(1114111)),u's':var.get(u'regenerate')(Js(32), Js(160), Js(5760), Js(8239), Js(8287), Js(12288), Js(65279)).callprop(u'addRange', Js(9), Js(13)).callprop(u'addRange', Js(8192), Js(8202)).callprop(u'addRange', Js(8232), Js(8233)),u'S':PyJs_LONG_3988_().callprop(u'addRange', Js(65280), Js(1114111)),u'w':var.get(u'regenerate')(Js(95)).callprop(u'addRange', Js(48), Js(57)).callprop(u'addRange', Js(65), Js(90)).callprop(u'addRange', Js(97), Js(122)),u'W':var.get(u'regenerate')(Js(96)).callprop(u'addRange', Js(0), Js(47)).callprop(u'addRange', Js(58), Js(64)).callprop(u'addRange', Js(91), Js(94)).callprop(u'addRange', Js(123), Js(1114111))}) + var.get(u'exports').put(u'UNICODE', PyJs_Object_3987_) + def PyJs_LONG_3990_(var=var): + return var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(8)).callprop(u'addRange', Js(14), Js(31)).callprop(u'addRange', Js(33), Js(159)).callprop(u'addRange', Js(161), Js(5759)).callprop(u'addRange', Js(5761), Js(8191)).callprop(u'addRange', Js(8203), Js(8231)).callprop(u'addRange', Js(8234), Js(8238)).callprop(u'addRange', Js(8240), Js(8286)).callprop(u'addRange', Js(8288), Js(12287)).callprop(u'addRange', Js(12289), Js(65278)) + PyJs_Object_3989_ = Js({u'd':var.get(u'regenerate')().callprop(u'addRange', Js(48), Js(57)),u'D':var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(47)).callprop(u'addRange', Js(58), Js(1114111)),u's':var.get(u'regenerate')(Js(32), Js(160), Js(5760), Js(8239), Js(8287), Js(12288), Js(65279)).callprop(u'addRange', Js(9), Js(13)).callprop(u'addRange', Js(8192), Js(8202)).callprop(u'addRange', Js(8232), Js(8233)),u'S':PyJs_LONG_3990_().callprop(u'addRange', Js(65280), Js(1114111)),u'w':var.get(u'regenerate')(Js(95), Js(383), Js(8490)).callprop(u'addRange', Js(48), Js(57)).callprop(u'addRange', Js(65), Js(90)).callprop(u'addRange', Js(97), Js(122)),u'W':var.get(u'regenerate')(Js(75), Js(83), Js(96)).callprop(u'addRange', Js(0), Js(47)).callprop(u'addRange', Js(58), Js(64)).callprop(u'addRange', Js(91), Js(94)).callprop(u'addRange', Js(123), Js(1114111))}) + var.get(u'exports').put(u'UNICODE_IGNORE_CASE', PyJs_Object_3989_) +PyJs_anonymous_3984_._set_name(u'anonymous') +PyJs_Object_3991_ = Js({u'regenerate':Js(501.0)}) +@Js +def PyJs_anonymous_3992_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_3993_ = Js({u'75':Js(8490.0),u'83':Js(383.0),u'107':Js(8490.0),u'115':Js(383.0),u'181':Js(924.0),u'197':Js(8491.0),u'383':Js(83.0),u'452':Js(453.0),u'453':Js(452.0),u'455':Js(456.0),u'456':Js(455.0),u'458':Js(459.0),u'459':Js(458.0),u'497':Js(498.0),u'498':Js(497.0),u'837':Js(8126.0),u'914':Js(976.0),u'917':Js(1013.0),u'920':Js(1012.0),u'921':Js(8126.0),u'922':Js(1008.0),u'924':Js(181.0),u'928':Js(982.0),u'929':Js(1009.0),u'931':Js(962.0),u'934':Js(981.0),u'937':Js(8486.0),u'962':Js(931.0),u'976':Js(914.0),u'977':Js(1012.0),u'981':Js(934.0),u'982':Js(928.0),u'1008':Js(922.0),u'1009':Js(929.0),u'1012':Js([Js(920.0), Js(977.0)]),u'1013':Js(917.0),u'7776':Js(7835.0),u'7835':Js(7776.0),u'8126':Js([Js(837.0), Js(921.0)]),u'8486':Js(937.0),u'8490':Js(75.0),u'8491':Js(197.0),u'66560':Js(66600.0),u'66561':Js(66601.0),u'66562':Js(66602.0),u'66563':Js(66603.0),u'66564':Js(66604.0),u'66565':Js(66605.0),u'66566':Js(66606.0),u'66567':Js(66607.0),u'66568':Js(66608.0),u'66569':Js(66609.0),u'66570':Js(66610.0),u'66571':Js(66611.0),u'66572':Js(66612.0),u'66573':Js(66613.0),u'66574':Js(66614.0),u'66575':Js(66615.0),u'66576':Js(66616.0),u'66577':Js(66617.0),u'66578':Js(66618.0),u'66579':Js(66619.0),u'66580':Js(66620.0),u'66581':Js(66621.0),u'66582':Js(66622.0),u'66583':Js(66623.0),u'66584':Js(66624.0),u'66585':Js(66625.0),u'66586':Js(66626.0),u'66587':Js(66627.0),u'66588':Js(66628.0),u'66589':Js(66629.0),u'66590':Js(66630.0),u'66591':Js(66631.0),u'66592':Js(66632.0),u'66593':Js(66633.0),u'66594':Js(66634.0),u'66595':Js(66635.0),u'66596':Js(66636.0),u'66597':Js(66637.0),u'66598':Js(66638.0),u'66599':Js(66639.0),u'66600':Js(66560.0),u'66601':Js(66561.0),u'66602':Js(66562.0),u'66603':Js(66563.0),u'66604':Js(66564.0),u'66605':Js(66565.0),u'66606':Js(66566.0),u'66607':Js(66567.0),u'66608':Js(66568.0),u'66609':Js(66569.0),u'66610':Js(66570.0),u'66611':Js(66571.0),u'66612':Js(66572.0),u'66613':Js(66573.0),u'66614':Js(66574.0),u'66615':Js(66575.0),u'66616':Js(66576.0),u'66617':Js(66577.0),u'66618':Js(66578.0),u'66619':Js(66579.0),u'66620':Js(66580.0),u'66621':Js(66581.0),u'66622':Js(66582.0),u'66623':Js(66583.0),u'66624':Js(66584.0),u'66625':Js(66585.0),u'66626':Js(66586.0),u'66627':Js(66587.0),u'66628':Js(66588.0),u'66629':Js(66589.0),u'66630':Js(66590.0),u'66631':Js(66591.0),u'66632':Js(66592.0),u'66633':Js(66593.0),u'66634':Js(66594.0),u'66635':Js(66595.0),u'66636':Js(66596.0),u'66637':Js(66597.0),u'66638':Js(66598.0),u'66639':Js(66599.0),u'68736':Js(68800.0),u'68737':Js(68801.0),u'68738':Js(68802.0),u'68739':Js(68803.0),u'68740':Js(68804.0),u'68741':Js(68805.0),u'68742':Js(68806.0),u'68743':Js(68807.0),u'68744':Js(68808.0),u'68745':Js(68809.0),u'68746':Js(68810.0),u'68747':Js(68811.0),u'68748':Js(68812.0),u'68749':Js(68813.0),u'68750':Js(68814.0),u'68751':Js(68815.0),u'68752':Js(68816.0),u'68753':Js(68817.0),u'68754':Js(68818.0),u'68755':Js(68819.0),u'68756':Js(68820.0),u'68757':Js(68821.0),u'68758':Js(68822.0),u'68759':Js(68823.0),u'68760':Js(68824.0),u'68761':Js(68825.0),u'68762':Js(68826.0),u'68763':Js(68827.0),u'68764':Js(68828.0),u'68765':Js(68829.0),u'68766':Js(68830.0),u'68767':Js(68831.0),u'68768':Js(68832.0),u'68769':Js(68833.0),u'68770':Js(68834.0),u'68771':Js(68835.0),u'68772':Js(68836.0),u'68773':Js(68837.0),u'68774':Js(68838.0),u'68775':Js(68839.0),u'68776':Js(68840.0),u'68777':Js(68841.0),u'68778':Js(68842.0),u'68779':Js(68843.0),u'68780':Js(68844.0),u'68781':Js(68845.0),u'68782':Js(68846.0),u'68783':Js(68847.0),u'68784':Js(68848.0),u'68785':Js(68849.0),u'68786':Js(68850.0),u'68800':Js(68736.0),u'68801':Js(68737.0),u'68802':Js(68738.0),u'68803':Js(68739.0),u'68804':Js(68740.0),u'68805':Js(68741.0),u'68806':Js(68742.0),u'68807':Js(68743.0),u'68808':Js(68744.0),u'68809':Js(68745.0),u'68810':Js(68746.0),u'68811':Js(68747.0),u'68812':Js(68748.0),u'68813':Js(68749.0),u'68814':Js(68750.0),u'68815':Js(68751.0),u'68816':Js(68752.0),u'68817':Js(68753.0),u'68818':Js(68754.0),u'68819':Js(68755.0),u'68820':Js(68756.0),u'68821':Js(68757.0),u'68822':Js(68758.0),u'68823':Js(68759.0),u'68824':Js(68760.0),u'68825':Js(68761.0),u'68826':Js(68762.0),u'68827':Js(68763.0),u'68828':Js(68764.0),u'68829':Js(68765.0),u'68830':Js(68766.0),u'68831':Js(68767.0),u'68832':Js(68768.0),u'68833':Js(68769.0),u'68834':Js(68770.0),u'68835':Js(68771.0),u'68836':Js(68772.0),u'68837':Js(68773.0),u'68838':Js(68774.0),u'68839':Js(68775.0),u'68840':Js(68776.0),u'68841':Js(68777.0),u'68842':Js(68778.0),u'68843':Js(68779.0),u'68844':Js(68780.0),u'68845':Js(68781.0),u'68846':Js(68782.0),u'68847':Js(68783.0),u'68848':Js(68784.0),u'68849':Js(68785.0),u'68850':Js(68786.0),u'71840':Js(71872.0),u'71841':Js(71873.0),u'71842':Js(71874.0),u'71843':Js(71875.0),u'71844':Js(71876.0),u'71845':Js(71877.0),u'71846':Js(71878.0),u'71847':Js(71879.0),u'71848':Js(71880.0),u'71849':Js(71881.0),u'71850':Js(71882.0),u'71851':Js(71883.0),u'71852':Js(71884.0),u'71853':Js(71885.0),u'71854':Js(71886.0),u'71855':Js(71887.0),u'71856':Js(71888.0),u'71857':Js(71889.0),u'71858':Js(71890.0),u'71859':Js(71891.0),u'71860':Js(71892.0),u'71861':Js(71893.0),u'71862':Js(71894.0),u'71863':Js(71895.0),u'71864':Js(71896.0),u'71865':Js(71897.0),u'71866':Js(71898.0),u'71867':Js(71899.0),u'71868':Js(71900.0),u'71869':Js(71901.0),u'71870':Js(71902.0),u'71871':Js(71903.0),u'71872':Js(71840.0),u'71873':Js(71841.0),u'71874':Js(71842.0),u'71875':Js(71843.0),u'71876':Js(71844.0),u'71877':Js(71845.0),u'71878':Js(71846.0),u'71879':Js(71847.0),u'71880':Js(71848.0),u'71881':Js(71849.0),u'71882':Js(71850.0),u'71883':Js(71851.0),u'71884':Js(71852.0),u'71885':Js(71853.0),u'71886':Js(71854.0),u'71887':Js(71855.0),u'71888':Js(71856.0),u'71889':Js(71857.0),u'71890':Js(71858.0),u'71891':Js(71859.0),u'71892':Js(71860.0),u'71893':Js(71861.0),u'71894':Js(71862.0),u'71895':Js(71863.0),u'71896':Js(71864.0),u'71897':Js(71865.0),u'71898':Js(71866.0),u'71899':Js(71867.0),u'71900':Js(71868.0),u'71901':Js(71869.0),u'71902':Js(71870.0),u'71903':Js(71871.0)}) + var.get(u'module').put(u'exports', PyJs_Object_3993_) +PyJs_anonymous_3992_._set_name(u'anonymous') +PyJs_Object_3994_ = Js({}) +@Js +def PyJs_anonymous_3995_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'iuMappings', u'module', u'parse', u'unicode', u'wrap', u'hasOwnProperty', u'regenerate', u'ignoreCase', u'caseFold', u'has', u'DOT_SET', u'getCharacterClassEscapeSet', u'exports', u'object', u'update', u'processCharacterClass', u'generate', u'ESCAPE_SETS', u'require', u'processTerm', u'BMP_SET', u'UNICODE_SET', u'assign', u'DOT_SET_UNICODE']) + @Js + def PyJsHoisted_getCharacterClassEscapeSet_(character, this, arguments, var=var): + var = Scope({u'this':this, u'character':character, u'arguments':arguments}, var) + var.registers([u'character']) + if var.get(u'unicode'): + if var.get(u'ignoreCase'): + return var.get(u'ESCAPE_SETS').get(u'UNICODE_IGNORE_CASE').get(var.get(u'character')) + return var.get(u'ESCAPE_SETS').get(u'UNICODE').get(var.get(u'character')) + return var.get(u'ESCAPE_SETS').get(u'REGULAR').get(var.get(u'character')) + PyJsHoisted_getCharacterClassEscapeSet_.func_name = u'getCharacterClassEscapeSet' + var.put(u'getCharacterClassEscapeSet', PyJsHoisted_getCharacterClassEscapeSet_) + @Js + def PyJsHoisted_update_(item, pattern, this, arguments, var=var): + var = Scope({u'this':this, u'item':item, u'arguments':arguments, u'pattern':pattern}, var) + var.registers([u'item', u'tree', u'pattern']) + if var.get(u'pattern').neg(): + return var.get('undefined') + var.put(u'tree', var.get(u'parse')(var.get(u'pattern'), Js(u''))) + while 1: + SWITCHED = False + CONDITION = (var.get(u'tree').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'characterClass')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'group')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'value')): + SWITCHED = True + break + if True: + SWITCHED = True + var.put(u'tree', var.get(u'wrap')(var.get(u'tree'), var.get(u'pattern'))) + SWITCHED = True + break + var.get(u'assign')(var.get(u'item'), var.get(u'tree')) + PyJsHoisted_update_.func_name = u'update' + var.put(u'update', PyJsHoisted_update_) + @Js + def PyJsHoisted_processTerm_(item, this, arguments, var=var): + var = Scope({u'this':this, u'item':item, u'arguments':arguments}, var) + var.registers([u'item', u'codePoint', u'set', u'folded']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'item').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'dot')): + SWITCHED = True + var.get(u'update')(var.get(u'item'), (var.get(u'DOT_SET_UNICODE') if var.get(u'unicode') else var.get(u'DOT_SET')).callprop(u'toString')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'characterClass')): + SWITCHED = True + var.put(u'item', var.get(u'processCharacterClass')(var.get(u'item'))) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'characterClassEscape')): + SWITCHED = True + var.get(u'update')(var.get(u'item'), var.get(u'getCharacterClassEscapeSet')(var.get(u'item').get(u'value')).callprop(u'toString')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'alternative')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'disjunction')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'group')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'quantifier')): + SWITCHED = True + var.get(u'item').put(u'body', var.get(u'item').get(u'body').callprop(u'map', var.get(u'processTerm'))) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'value')): + SWITCHED = True + var.put(u'codePoint', var.get(u'item').get(u'codePoint')) + var.put(u'set', var.get(u'regenerate')(var.get(u'codePoint'))) + if (var.get(u'ignoreCase') and var.get(u'unicode')): + var.put(u'folded', var.get(u'caseFold')(var.get(u'codePoint'))) + if var.get(u'folded'): + var.get(u'set').callprop(u'add', var.get(u'folded')) + var.get(u'update')(var.get(u'item'), var.get(u'set').callprop(u'toString')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'anchor')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'empty')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'group')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'reference')): + SWITCHED = True + break + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error')((Js(u'Unknown term type: ')+var.get(u'item').get(u'type')))) + raise PyJsTempException + SWITCHED = True + break + return var.get(u'item') + PyJsHoisted_processTerm_.func_name = u'processTerm' + var.put(u'processTerm', PyJsHoisted_processTerm_) + @Js + def PyJsHoisted_caseFold_(codePoint, this, arguments, var=var): + var = Scope({u'this':this, u'codePoint':codePoint, u'arguments':arguments}, var) + var.registers([u'codePoint']) + return (var.get(u'iuMappings').get(var.get(u'codePoint')) if var.get(u'has')(var.get(u'iuMappings'), var.get(u'codePoint')) else Js(False)) + PyJsHoisted_caseFold_.func_name = u'caseFold' + var.put(u'caseFold', PyJsHoisted_caseFold_) + @Js + def PyJsHoisted_processCharacterClass_(characterClassItem, this, arguments, var=var): + var = Scope({u'this':this, u'characterClassItem':characterClassItem, u'arguments':arguments}, var) + var.registers([u'body', u'set', u'characterClassItem']) + var.put(u'set', var.get(u'regenerate')()) + @Js + def PyJs_anonymous_3999_(item, this, arguments, var=var): + var = Scope({u'this':this, u'item':item, u'arguments':arguments}, var) + var.registers([u'max', u'folded', u'item', u'min']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'item').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'value')): + SWITCHED = True + var.get(u'set').callprop(u'add', var.get(u'item').get(u'codePoint')) + if (var.get(u'ignoreCase') and var.get(u'unicode')): + var.put(u'folded', var.get(u'caseFold')(var.get(u'item').get(u'codePoint'))) + if var.get(u'folded'): + var.get(u'set').callprop(u'add', var.get(u'folded')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'characterClassRange')): + SWITCHED = True + var.put(u'min', var.get(u'item').get(u'min').get(u'codePoint')) + var.put(u'max', var.get(u'item').get(u'max').get(u'codePoint')) + var.get(u'set').callprop(u'addRange', var.get(u'min'), var.get(u'max')) + if (var.get(u'ignoreCase') and var.get(u'unicode')): + var.get(u'set').callprop(u'iuAddRange', var.get(u'min'), var.get(u'max')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'characterClassEscape')): + SWITCHED = True + var.get(u'set').callprop(u'add', var.get(u'getCharacterClassEscapeSet')(var.get(u'item').get(u'value'))) + break + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error')((Js(u'Unknown term type: ')+var.get(u'item').get(u'type')))) + raise PyJsTempException + SWITCHED = True + break + PyJs_anonymous_3999_._set_name(u'anonymous') + var.put(u'body', var.get(u'characterClassItem').get(u'body').callprop(u'forEach', PyJs_anonymous_3999_)) + if var.get(u'characterClassItem').get(u'negative'): + var.put(u'set', (var.get(u'UNICODE_SET') if var.get(u'unicode') else var.get(u'BMP_SET')).callprop(u'clone').callprop(u'remove', var.get(u'set'))) + var.get(u'update')(var.get(u'characterClassItem'), var.get(u'set').callprop(u'toString')) + return var.get(u'characterClassItem') + PyJsHoisted_processCharacterClass_.func_name = u'processCharacterClass' + var.put(u'processCharacterClass', PyJsHoisted_processCharacterClass_) + @Js + def PyJsHoisted_wrap_(tree, pattern, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'tree':tree, u'arguments':arguments}, var) + var.registers([u'pattern', u'tree']) + PyJs_Object_3998_ = Js({u'type':Js(u'group'),u'behavior':Js(u'ignore'),u'body':Js([var.get(u'tree')]),u'raw':((Js(u'(?:')+var.get(u'pattern'))+Js(u')'))}) + return PyJs_Object_3998_ + PyJsHoisted_wrap_.func_name = u'wrap' + var.put(u'wrap', PyJsHoisted_wrap_) + @Js + def PyJsHoisted_has_(object, property, this, arguments, var=var): + var = Scope({u'this':this, u'property':property, u'object':object, u'arguments':arguments}, var) + var.registers([u'property', u'object']) + return var.get(u'hasOwnProperty').callprop(u'call', var.get(u'object'), var.get(u'property')) + PyJsHoisted_has_.func_name = u'has' + var.put(u'has', PyJsHoisted_has_) + @Js + def PyJsHoisted_assign_(target, source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'target':target, u'arguments':arguments}, var) + var.registers([u'source', u'target', u'key']) + for PyJsTemp in var.get(u'source'): + var.put(u'key', PyJsTemp) + var.get(u'target').put(var.get(u'key'), var.get(u'source').get(var.get(u'key'))) + PyJsHoisted_assign_.func_name = u'assign' + var.put(u'assign', PyJsHoisted_assign_) + var.put(u'generate', var.get(u'require')(Js(u'regjsgen')).get(u'generate')) + var.put(u'parse', var.get(u'require')(Js(u'regjsparser')).get(u'parse')) + var.put(u'regenerate', var.get(u'require')(Js(u'regenerate'))) + var.put(u'iuMappings', var.get(u'require')(Js(u'./data/iu-mappings.json'))) + var.put(u'ESCAPE_SETS', var.get(u'require')(Js(u'./data/character-class-escape-sets.js'))) + pass + PyJs_Object_3996_ = Js({}) + var.put(u'object', PyJs_Object_3996_) + var.put(u'hasOwnProperty', var.get(u'object').get(u'hasOwnProperty')) + pass + var.put(u'UNICODE_SET', var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(1114111))) + var.put(u'BMP_SET', var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(65535))) + var.put(u'DOT_SET_UNICODE', var.get(u'UNICODE_SET').callprop(u'clone').callprop(u'remove', Js(10), Js(13), Js(8232), Js(8233))) + var.put(u'DOT_SET', var.get(u'DOT_SET_UNICODE').callprop(u'clone').callprop(u'intersection', var.get(u'BMP_SET'))) + @Js + def PyJs_anonymous_3997_(min, max, this, arguments, var=var): + var = Scope({u'this':this, u'max':max, u'arguments':arguments, u'min':min}, var) + var.registers([u'max', u'folded', u'$this', u'min']) + var.put(u'$this', var.get(u"this")) + while 1: + var.put(u'folded', var.get(u'caseFold')(var.get(u'min'))) + if var.get(u'folded'): + var.get(u'$this').callprop(u'add', var.get(u'folded')) + if not (var.put(u'min',Js(var.get(u'min').to_number())+Js(1))<=var.get(u'max')): + break + return var.get(u'$this') + PyJs_anonymous_3997_._set_name(u'anonymous') + var.get(u'regenerate').get(u'prototype').put(u'iuAddRange', PyJs_anonymous_3997_) + pass + pass + pass + pass + var.put(u'ignoreCase', Js(False)) + var.put(u'unicode', Js(False)) + pass + pass + pass + @Js + def PyJs_anonymous_4000_(pattern, flags, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'flags':flags, u'arguments':arguments}, var) + var.registers([u'pattern', u'tree', u'flags']) + var.put(u'tree', var.get(u'parse')(var.get(u'pattern'), var.get(u'flags'))) + var.put(u'ignoreCase', ((var.get(u'flags').callprop(u'indexOf', Js(u'i'))>(-Js(1.0))) if var.get(u'flags') else Js(False))) + var.put(u'unicode', ((var.get(u'flags').callprop(u'indexOf', Js(u'u'))>(-Js(1.0))) if var.get(u'flags') else Js(False))) + var.get(u'assign')(var.get(u'tree'), var.get(u'processTerm')(var.get(u'tree'))) + return var.get(u'generate')(var.get(u'tree')) + PyJs_anonymous_4000_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_4000_) +PyJs_anonymous_3995_._set_name(u'anonymous') +PyJs_Object_4001_ = Js({u'./data/character-class-escape-sets.js':Js(502.0),u'./data/iu-mappings.json':Js(503.0),u'regenerate':Js(501.0),u'regjsgen':Js(505.0),u'regjsparser':Js(506.0)}) +@Js +def PyJs_anonymous_4002_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_4003_ = Js({}) + @Js + def PyJs_anonymous_4004_(PyJsArg_676c6f62616c_, this, arguments, var=var): + var = Scope({u'this':this, u'global':PyJsArg_676c6f62616c_, u'arguments':arguments}, var) + var.registers([u'global']) + pass + @Js + def PyJs_anonymous_4005_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'freeModule', u'objectTypes', u'freeGlobal', u'generateCharacterClassRange', u'freeExports', u'generateCharacterClassEscape', u'assertType', u'generateReference', u'generateCharacterClass', u'generateAlternative', u'generateClassAtom', u'floor', u'generateDisjunction', u'stringFromCharCode', u'generate', u'generateQuantifier', u'generateDot', u'fromCodePoint', u'generateValue', u'generateAnchor', u'generateAtom', u'oldRoot', u'generateTerm', u'root', u'generateGroup']) + @Js + def PyJsHoisted_generateQuantifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'max', u'quantifier', u'min']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'quantifier')) + var.put(u'quantifier', Js(u'')) + var.put(u'min', var.get(u'node').get(u'min')) + var.put(u'max', var.get(u'node').get(u'max')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'max')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'undefined')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u"null")): + SWITCHED = True + while 1: + SWITCHED = False + CONDITION = (var.get(u'min')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(0.0)): + SWITCHED = True + var.put(u'quantifier', Js(u'*')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(1.0)): + SWITCHED = True + var.put(u'quantifier', Js(u'+')) + break + if True: + SWITCHED = True + var.put(u'quantifier', ((Js(u'{')+var.get(u'min'))+Js(u',}'))) + break + SWITCHED = True + break + break + if True: + SWITCHED = True + if (var.get(u'min')==var.get(u'max')): + var.put(u'quantifier', ((Js(u'{')+var.get(u'min'))+Js(u'}'))) + else: + if ((var.get(u'min')==Js(0.0)) and (var.get(u'max')==Js(1.0))): + var.put(u'quantifier', Js(u'?')) + else: + var.put(u'quantifier', ((((Js(u'{')+var.get(u'min'))+Js(u','))+var.get(u'max'))+Js(u'}'))) + break + SWITCHED = True + break + if var.get(u'node').get(u'greedy').neg(): + var.put(u'quantifier', Js(u'?'), u'+') + return (var.get(u'generateAtom')(var.get(u'node').get(u'body').get(u'0'))+var.get(u'quantifier')) + PyJsHoisted_generateQuantifier_.func_name = u'generateQuantifier' + var.put(u'generateQuantifier', PyJsHoisted_generateQuantifier_) + @Js + def PyJsHoisted_generateTerm_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'anchor|characterClass|characterClassEscape|empty|group|quantifier|reference|value')) + return var.get(u'generate')(var.get(u'node')) + PyJsHoisted_generateTerm_.func_name = u'generateTerm' + var.put(u'generateTerm', PyJsHoisted_generateTerm_) + @Js + def PyJsHoisted_generateCharacterClass_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'node', u'length', u'classRanges', u'result']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'characterClass')) + var.put(u'classRanges', var.get(u'node').get(u'body')) + var.put(u'length', (var.get(u'classRanges').get(u'length') if var.get(u'classRanges') else Js(0.0))) + var.put(u'i', (-Js(1.0))) + var.put(u'result', Js(u'[')) + if var.get(u'node').get(u'negative'): + var.put(u'result', Js(u'^'), u'+') + while (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))<var.get(u'length')): + var.put(u'result', var.get(u'generateClassAtom')(var.get(u'classRanges').get(var.get(u'i'))), u'+') + var.put(u'result', Js(u']'), u'+') + return var.get(u'result') + PyJsHoisted_generateCharacterClass_.func_name = u'generateCharacterClass' + var.put(u'generateCharacterClass', PyJsHoisted_generateCharacterClass_) + @Js + def PyJsHoisted_generateClassAtom_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'anchor|characterClassEscape|characterClassRange|dot|value')) + return var.get(u'generate')(var.get(u'node')) + PyJsHoisted_generateClassAtom_.func_name = u'generateClassAtom' + var.put(u'generateClassAtom', PyJsHoisted_generateClassAtom_) + @Js + def PyJsHoisted_fromCodePoint_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'index', u'codePoint', u'codeUnits', u'length', u'result', u'lowSurrogate', u'MAX_SIZE', u'highSurrogate']) + var.put(u'MAX_SIZE', Js(16384)) + var.put(u'codeUnits', Js([])) + pass + pass + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'arguments').get(u'length')) + if var.get(u'length').neg(): + return Js(u'') + var.put(u'result', Js(u'')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))<var.get(u'length')): + var.put(u'codePoint', var.get(u'Number')(var.get(u'arguments').get(var.get(u'index')))) + if (((var.get(u'isFinite')(var.get(u'codePoint')).neg() or (var.get(u'codePoint')<Js(0.0))) or (var.get(u'codePoint')>Js(1114111))) or (var.get(u'floor')(var.get(u'codePoint'))!=var.get(u'codePoint'))): + PyJsTempException = JsToPyException(var.get(u'RangeError')((Js(u'Invalid code point: ')+var.get(u'codePoint')))) + raise PyJsTempException + if (var.get(u'codePoint')<=Js(65535)): + var.get(u'codeUnits').callprop(u'push', var.get(u'codePoint')) + else: + var.put(u'codePoint', Js(65536), u'-') + var.put(u'highSurrogate', ((var.get(u'codePoint')>>Js(10.0))+Js(55296))) + var.put(u'lowSurrogate', ((var.get(u'codePoint')%Js(1024))+Js(56320))) + var.get(u'codeUnits').callprop(u'push', var.get(u'highSurrogate'), var.get(u'lowSurrogate')) + if (((var.get(u'index')+Js(1.0))==var.get(u'length')) or (var.get(u'codeUnits').get(u'length')>var.get(u'MAX_SIZE'))): + var.put(u'result', var.get(u'stringFromCharCode').callprop(u'apply', var.get(u"null"), var.get(u'codeUnits')), u'+') + var.get(u'codeUnits').put(u'length', Js(0.0)) + return var.get(u'result') + PyJsHoisted_fromCodePoint_.func_name = u'fromCodePoint' + var.put(u'fromCodePoint', PyJsHoisted_fromCodePoint_) + @Js + def PyJsHoisted_generateDisjunction_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'body', u'i', u'length', u'node', u'result']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'disjunction')) + var.put(u'body', var.get(u'node').get(u'body')) + var.put(u'length', (var.get(u'body').get(u'length') if var.get(u'body') else Js(0.0))) + if (var.get(u'length')==Js(0.0)): + PyJsTempException = JsToPyException(var.get(u'Error')(Js(u'No body'))) + raise PyJsTempException + else: + if (var.get(u'length')==Js(1.0)): + return var.get(u'generate')(var.get(u'body').get(u'0')) + else: + var.put(u'i', (-Js(1.0))) + var.put(u'result', Js(u'')) + while (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))<var.get(u'length')): + if (var.get(u'i')!=Js(0.0)): + var.put(u'result', Js(u'|'), u'+') + var.put(u'result', var.get(u'generate')(var.get(u'body').get(var.get(u'i'))), u'+') + return var.get(u'result') + PyJsHoisted_generateDisjunction_.func_name = u'generateDisjunction' + var.put(u'generateDisjunction', PyJsHoisted_generateDisjunction_) + @Js + def PyJsHoisted_assertType_(type, expected, this, arguments, var=var): + var = Scope({u'expected':expected, u'this':this, u'type':type, u'arguments':arguments}, var) + var.registers([u'expected', u'type']) + if (var.get(u'expected').callprop(u'indexOf', Js(u'|'))==(-Js(1.0))): + if (var.get(u'type')==var.get(u'expected')): + return var.get('undefined') + PyJsTempException = JsToPyException(var.get(u'Error')((Js(u'Invalid node type: ')+var.get(u'type')))) + raise PyJsTempException + var.put(u'expected', (var.get(u'assertType').get(var.get(u'expected')) if var.get(u'assertType').callprop(u'hasOwnProperty', var.get(u'expected')) else var.get(u'assertType').put(var.get(u'expected'), var.get(u'RegExp')(((Js(u'^(?:')+var.get(u'expected'))+Js(u')$')))))) + if var.get(u'expected').callprop(u'test', var.get(u'type')): + return var.get('undefined') + PyJsTempException = JsToPyException(var.get(u'Error')((Js(u'Invalid node type: ')+var.get(u'type')))) + raise PyJsTempException + PyJsHoisted_assertType_.func_name = u'assertType' + var.put(u'assertType', PyJsHoisted_assertType_) + @Js + def PyJsHoisted_generateCharacterClassRange_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'max', u'min']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'characterClassRange')) + var.put(u'min', var.get(u'node').get(u'min')) + var.put(u'max', var.get(u'node').get(u'max')) + if ((var.get(u'min').get(u'type')==Js(u'characterClassRange')) or (var.get(u'max').get(u'type')==Js(u'characterClassRange'))): + PyJsTempException = JsToPyException(var.get(u'Error')(Js(u'Invalid character class range'))) + raise PyJsTempException + return ((var.get(u'generateClassAtom')(var.get(u'min'))+Js(u'-'))+var.get(u'generateClassAtom')(var.get(u'max'))) + PyJsHoisted_generateCharacterClassRange_.func_name = u'generateCharacterClassRange' + var.put(u'generateCharacterClassRange', PyJsHoisted_generateCharacterClassRange_) + @Js + def PyJsHoisted_generateAnchor_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'anchor')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'kind')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'start')): + SWITCHED = True + return Js(u'^') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'end')): + SWITCHED = True + return Js(u'$') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'boundary')): + SWITCHED = True + return Js(u'\\b') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'not-boundary')): + SWITCHED = True + return Js(u'\\B') + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error')(Js(u'Invalid assertion'))) + raise PyJsTempException + SWITCHED = True + break + PyJsHoisted_generateAnchor_.func_name = u'generateAnchor' + var.put(u'generateAnchor', PyJsHoisted_generateAnchor_) + @Js + def PyJsHoisted_generateAtom_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'anchor|characterClass|characterClassEscape|dot|group|reference|value')) + return var.get(u'generate')(var.get(u'node')) + PyJsHoisted_generateAtom_.func_name = u'generateAtom' + var.put(u'generateAtom', PyJsHoisted_generateAtom_) + @Js + def PyJsHoisted_generateAlternative_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'node', u'length', u'terms', u'result']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'alternative')) + var.put(u'terms', var.get(u'node').get(u'body')) + var.put(u'length', (var.get(u'terms').get(u'length') if var.get(u'terms') else Js(0.0))) + if (var.get(u'length')==Js(1.0)): + return var.get(u'generateTerm')(var.get(u'terms').get(u'0')) + else: + var.put(u'i', (-Js(1.0))) + var.put(u'result', Js(u'')) + while (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))<var.get(u'length')): + var.put(u'result', var.get(u'generateTerm')(var.get(u'terms').get(var.get(u'i'))), u'+') + return var.get(u'result') + PyJsHoisted_generateAlternative_.func_name = u'generateAlternative' + var.put(u'generateAlternative', PyJsHoisted_generateAlternative_) + @Js + def PyJsHoisted_generateValue_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'kind', u'codePoint']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'value')) + var.put(u'kind', var.get(u'node').get(u'kind')) + var.put(u'codePoint', var.get(u'node').get(u'codePoint')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'kind')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'controlLetter')): + SWITCHED = True + return (Js(u'\\c')+var.get(u'fromCodePoint')((var.get(u'codePoint')+Js(64.0)))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hexadecimalEscape')): + SWITCHED = True + return (Js(u'\\x')+(Js(u'00')+var.get(u'codePoint').callprop(u'toString', Js(16.0)).callprop(u'toUpperCase')).callprop(u'slice', (-Js(2.0)))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'identifier')): + SWITCHED = True + return (Js(u'\\')+var.get(u'fromCodePoint')(var.get(u'codePoint'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'null')): + SWITCHED = True + return (Js(u'\\')+var.get(u'codePoint')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'octal')): + SWITCHED = True + return (Js(u'\\')+var.get(u'codePoint').callprop(u'toString', Js(8.0))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'singleEscape')): + SWITCHED = True + while 1: + SWITCHED = False + CONDITION = (var.get(u'codePoint')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(8)): + SWITCHED = True + return Js(u'\\b') + if SWITCHED or PyJsStrictEq(CONDITION, Js(9)): + SWITCHED = True + return Js(u'\\t') + if SWITCHED or PyJsStrictEq(CONDITION, Js(10)): + SWITCHED = True + return Js(u'\\n') + if SWITCHED or PyJsStrictEq(CONDITION, Js(11)): + SWITCHED = True + return Js(u'\\v') + if SWITCHED or PyJsStrictEq(CONDITION, Js(12)): + SWITCHED = True + return Js(u'\\f') + if SWITCHED or PyJsStrictEq(CONDITION, Js(13)): + SWITCHED = True + return Js(u'\\r') + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error')((Js(u'Invalid codepoint: ')+var.get(u'codePoint')))) + raise PyJsTempException + SWITCHED = True + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'symbol')): + SWITCHED = True + return var.get(u'fromCodePoint')(var.get(u'codePoint')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'unicodeEscape')): + SWITCHED = True + return (Js(u'\\u')+(Js(u'0000')+var.get(u'codePoint').callprop(u'toString', Js(16.0)).callprop(u'toUpperCase')).callprop(u'slice', (-Js(4.0)))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'unicodeCodePointEscape')): + SWITCHED = True + return ((Js(u'\\u{')+var.get(u'codePoint').callprop(u'toString', Js(16.0)).callprop(u'toUpperCase'))+Js(u'}')) + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error')((Js(u'Unsupported node kind: ')+var.get(u'kind')))) + raise PyJsTempException + SWITCHED = True + break + PyJsHoisted_generateValue_.func_name = u'generateValue' + var.put(u'generateValue', PyJsHoisted_generateValue_) + @Js + def PyJsHoisted_generateGroup_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'body', u'i', u'length', u'node', u'result']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'group')) + var.put(u'result', Js(u'(')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'behavior')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'normal')): + SWITCHED = True + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ignore')): + SWITCHED = True + var.put(u'result', Js(u'?:'), u'+') + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'lookahead')): + SWITCHED = True + var.put(u'result', Js(u'?='), u'+') + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'negativeLookahead')): + SWITCHED = True + var.put(u'result', Js(u'?!'), u'+') + break + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error')((Js(u'Invalid behaviour: ')+var.get(u'node').get(u'behaviour')))) + raise PyJsTempException + SWITCHED = True + break + var.put(u'body', var.get(u'node').get(u'body')) + var.put(u'length', (var.get(u'body').get(u'length') if var.get(u'body') else Js(0.0))) + if (var.get(u'length')==Js(1.0)): + var.put(u'result', var.get(u'generate')(var.get(u'body').get(u'0')), u'+') + else: + var.put(u'i', (-Js(1.0))) + while (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))<var.get(u'length')): + var.put(u'result', var.get(u'generate')(var.get(u'body').get(var.get(u'i'))), u'+') + var.put(u'result', Js(u')'), u'+') + return var.get(u'result') + PyJsHoisted_generateGroup_.func_name = u'generateGroup' + var.put(u'generateGroup', PyJsHoisted_generateGroup_) + @Js + def PyJsHoisted_generateReference_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'reference')) + return (Js(u'\\')+var.get(u'node').get(u'matchIndex')) + PyJsHoisted_generateReference_.func_name = u'generateReference' + var.put(u'generateReference', PyJsHoisted_generateReference_) + @Js + def PyJsHoisted_generateCharacterClassEscape_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'characterClassEscape')) + return (Js(u'\\')+var.get(u'node').get(u'value')) + PyJsHoisted_generateCharacterClassEscape_.func_name = u'generateCharacterClassEscape' + var.put(u'generateCharacterClassEscape', PyJsHoisted_generateCharacterClassEscape_) + @Js + def PyJsHoisted_generate_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'type']) + var.put(u'type', var.get(u'node').get(u'type')) + if (var.get(u'generate').callprop(u'hasOwnProperty', var.get(u'type')) and (var.get(u'generate').get(var.get(u'type')).typeof()==Js(u'function'))): + return var.get(u'generate').callprop(var.get(u'type'), var.get(u'node')) + PyJsTempException = JsToPyException(var.get(u'Error')((Js(u'Invalid node type: ')+var.get(u'type')))) + raise PyJsTempException + PyJsHoisted_generate_.func_name = u'generate' + var.put(u'generate', PyJsHoisted_generate_) + @Js + def PyJsHoisted_generateDot_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'dot')) + return Js(u'.') + PyJsHoisted_generateDot_.func_name = u'generateDot' + var.put(u'generateDot', PyJsHoisted_generateDot_) + Js(u'use strict') + PyJs_Object_4006_ = Js({u'function':var.get(u'true'),u'object':var.get(u'true')}) + var.put(u'objectTypes', PyJs_Object_4006_) + var.put(u'root', ((var.get(u'objectTypes').get(var.get(u'window',throw=False).typeof()) and var.get(u'window')) or var.get(u"this"))) + var.put(u'oldRoot', var.get(u'root')) + var.put(u'freeExports', (var.get(u'objectTypes').get(var.get(u'exports',throw=False).typeof()) and var.get(u'exports'))) + var.put(u'freeModule', (((var.get(u'objectTypes').get(var.get(u'module',throw=False).typeof()) and var.get(u'module')) and var.get(u'module').get(u'nodeType').neg()) and var.get(u'module'))) + var.put(u'freeGlobal', (((var.get(u'freeExports') and var.get(u'freeModule')) and (var.get(u'global',throw=False).typeof()==Js(u'object'))) and var.get(u'global'))) + if (var.get(u'freeGlobal') and ((PyJsStrictEq(var.get(u'freeGlobal').get(u'global'),var.get(u'freeGlobal')) or PyJsStrictEq(var.get(u'freeGlobal').get(u'window'),var.get(u'freeGlobal'))) or PyJsStrictEq(var.get(u'freeGlobal').get(u'self'),var.get(u'freeGlobal')))): + var.put(u'root', var.get(u'freeGlobal')) + var.put(u'stringFromCharCode', var.get(u'String').get(u'fromCharCode')) + var.put(u'floor', var.get(u'Math').get(u'floor')) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + var.get(u'generate').put(u'alternative', var.get(u'generateAlternative')) + var.get(u'generate').put(u'anchor', var.get(u'generateAnchor')) + var.get(u'generate').put(u'characterClass', var.get(u'generateCharacterClass')) + var.get(u'generate').put(u'characterClassEscape', var.get(u'generateCharacterClassEscape')) + var.get(u'generate').put(u'characterClassRange', var.get(u'generateCharacterClassRange')) + var.get(u'generate').put(u'disjunction', var.get(u'generateDisjunction')) + var.get(u'generate').put(u'dot', var.get(u'generateDot')) + var.get(u'generate').put(u'group', var.get(u'generateGroup')) + var.get(u'generate').put(u'quantifier', var.get(u'generateQuantifier')) + var.get(u'generate').put(u'reference', var.get(u'generateReference')) + var.get(u'generate').put(u'value', var.get(u'generateValue')) + if (((var.get(u'define',throw=False).typeof()==Js(u'function')) and (var.get(u'define').get(u'amd').typeof()==Js(u'object'))) and var.get(u'define').get(u'amd')): + @Js + def PyJs_anonymous_4007_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_4008_ = Js({u'generate':var.get(u'generate')}) + return PyJs_Object_4008_ + PyJs_anonymous_4007_._set_name(u'anonymous') + var.get(u'define')(PyJs_anonymous_4007_) + else: + if (var.get(u'freeExports') and var.get(u'freeModule')): + var.get(u'freeExports').put(u'generate', var.get(u'generate')) + else: + PyJs_Object_4009_ = Js({u'generate':var.get(u'generate')}) + var.get(u'root').put(u'regjsgen', PyJs_Object_4009_) + PyJs_anonymous_4005_._set_name(u'anonymous') + PyJs_anonymous_4005_.callprop(u'call', var.get(u"this")) + PyJs_anonymous_4004_._set_name(u'anonymous') + PyJs_anonymous_4004_.callprop(u'call', var.get(u"this"), (var.get(u'global') if PyJsStrictNeq(var.get(u'global',throw=False).typeof(),Js(u'undefined')) else (var.get(u'self') if PyJsStrictNeq(var.get(u'self',throw=False).typeof(),Js(u'undefined')) else (var.get(u'window') if PyJsStrictNeq(var.get(u'window',throw=False).typeof(),Js(u'undefined')) else PyJs_Object_4003_)))) +PyJs_anonymous_4002_._set_name(u'anonymous') +PyJs_Object_4010_ = Js({}) +@Js +def PyJs_anonymous_4011_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_4012_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'parse', u'regjsparser']) + @Js + def PyJsHoisted_parse_(str, flags, this, arguments, var=var): + var = Scope({u'this':this, u'flags':flags, u'arguments':arguments, u'str':str}, var) + var.registers([u'parseQuantifier', u'parseDisjunction', u'flattenBody', u'backrefDenied', u'skip', u'matchReg', u'pos', u'closedCaptureCounter', u'result', u'addRaw', u'parseNonemptyClassRanges', u'parseHelperClassRanges', u'bail', u'parseIdentityEscape', u'createDot', u'incr', u'parseAnchor', u'parseAtom', u'parseAtomEscape', u'next', u'current', u'updateRawStart', u'isEmpty', u'createDisjunction', u'parseClassEscape', u'parseCharacterEscape', u'parseGroup', u'parseClassAtomNoDash', u'createAnchor', u'match', u'parseCharacterClass', u'createValue', u'str', u'createReference', u'parseNonemptyClassRangesNoDash', u'createCharacterClassEscape', u'hasUnicodeFlag', u'parseAlternative', u'firstIteration', u'isIdentifierPart', u'createQuantifier', u'createCharacter', u'i', u'lookahead', u'createClassRange', u'createAlternative', u'parseClassRanges', u'createEscaped', u'parseUnicodeSurrogatePairEscape', u'flags', u'parseTerm', u'createGroup', u'parseDecimalEscape', u'parseClassAtom', u'createCharacterClass']) + @Js + def PyJsHoisted_parseQuantifier_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res', u'quantifier', u'from', u'max', u'min']) + var.put(u'from', var.get(u'pos')) + pass + pass + if var.get(u'match')(Js(u'*')): + var.put(u'quantifier', var.get(u'createQuantifier')(Js(0.0))) + else: + if var.get(u'match')(Js(u'+')): + var.put(u'quantifier', var.get(u'createQuantifier')(Js(1.0))) + else: + if var.get(u'match')(Js(u'?')): + var.put(u'quantifier', var.get(u'createQuantifier')(Js(0.0), Js(1.0))) + else: + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^\\{([0-9]+)\\}/'))): + var.put(u'min', var.get(u'parseInt')(var.get(u'res').get(u'1'), Js(10.0))) + var.put(u'quantifier', var.get(u'createQuantifier')(var.get(u'min'), var.get(u'min'), var.get(u'res').get(u'range').get(u'0'), var.get(u'res').get(u'range').get(u'1'))) + else: + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^\\{([0-9]+),\\}/'))): + var.put(u'min', var.get(u'parseInt')(var.get(u'res').get(u'1'), Js(10.0))) + var.put(u'quantifier', var.get(u'createQuantifier')(var.get(u'min'), var.get(u'undefined'), var.get(u'res').get(u'range').get(u'0'), var.get(u'res').get(u'range').get(u'1'))) + else: + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^\\{([0-9]+),([0-9]+)\\}/'))): + var.put(u'min', var.get(u'parseInt')(var.get(u'res').get(u'1'), Js(10.0))) + var.put(u'max', var.get(u'parseInt')(var.get(u'res').get(u'2'), Js(10.0))) + if (var.get(u'min')>var.get(u'max')): + var.get(u'bail')(Js(u'numbers out of order in {} quantifier'), Js(u''), var.get(u'from'), var.get(u'pos')) + var.put(u'quantifier', var.get(u'createQuantifier')(var.get(u'min'), var.get(u'max'), var.get(u'res').get(u'range').get(u'0'), var.get(u'res').get(u'range').get(u'1'))) + if var.get(u'quantifier'): + if var.get(u'match')(Js(u'?')): + var.get(u'quantifier').put(u'greedy', Js(False)) + var.get(u'quantifier').get(u'range').put(u'1', Js(1.0), u'+') + return var.get(u'quantifier') + PyJsHoisted_parseQuantifier_.func_name = u'parseQuantifier' + var.put(u'parseQuantifier', PyJsHoisted_parseQuantifier_) + @Js + def PyJsHoisted_parseDisjunction_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res', u'from']) + var.put(u'res', Js([])) + var.put(u'from', var.get(u'pos')) + var.get(u'res').callprop(u'push', var.get(u'parseAlternative')()) + while var.get(u'match')(Js(u'|')): + var.get(u'res').callprop(u'push', var.get(u'parseAlternative')()) + if PyJsStrictEq(var.get(u'res').get(u'length'),Js(1.0)): + return var.get(u'res').get(u'0') + return var.get(u'createDisjunction')(var.get(u'res'), var.get(u'from'), var.get(u'pos')) + PyJsHoisted_parseDisjunction_.func_name = u'parseDisjunction' + var.put(u'parseDisjunction', PyJsHoisted_parseDisjunction_) + @Js + def PyJsHoisted_flattenBody_(body, this, arguments, var=var): + var = Scope({u'body':body, u'this':this, u'arguments':arguments}, var) + var.registers([u'body']) + if PyJsStrictEq(var.get(u'body').get(u'type'),Js(u'alternative')): + return var.get(u'body').get(u'body') + else: + return Js([var.get(u'body')]) + PyJsHoisted_flattenBody_.func_name = u'flattenBody' + var.put(u'flattenBody', PyJsHoisted_flattenBody_) + @Js + def PyJsHoisted_skip_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + if var.get(u'match')(var.get(u'value')).neg(): + var.get(u'bail')(Js(u'character'), var.get(u'value')) + PyJsHoisted_skip_.func_name = u'skip' + var.put(u'skip', PyJsHoisted_skip_) + @Js + def PyJsHoisted_matchReg_(regExp, this, arguments, var=var): + var = Scope({u'this':this, u'regExp':regExp, u'arguments':arguments}, var) + var.registers([u'subStr', u'regExp', u'res']) + var.put(u'subStr', var.get(u'str').callprop(u'substring', var.get(u'pos'))) + var.put(u'res', var.get(u'subStr').callprop(u'match', var.get(u'regExp'))) + if var.get(u'res'): + var.get(u'res').put(u'range', Js([])) + var.get(u'res').get(u'range').put(u'0', var.get(u'pos')) + var.get(u'incr')(var.get(u'res').get(u'0').get(u'length')) + var.get(u'res').get(u'range').put(u'1', var.get(u'pos')) + return var.get(u'res') + PyJsHoisted_matchReg_.func_name = u'matchReg' + var.put(u'matchReg', PyJsHoisted_matchReg_) + @Js + def PyJsHoisted_addRaw_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'node').put(u'raw', var.get(u'str').callprop(u'substring', var.get(u'node').get(u'range').get(u'0'), var.get(u'node').get(u'range').get(u'1'))) + return var.get(u'node') + PyJsHoisted_addRaw_.func_name = u'addRaw' + var.put(u'addRaw', PyJsHoisted_addRaw_) + @Js + def PyJsHoisted_parseNonemptyClassRanges_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'atom']) + var.put(u'atom', var.get(u'parseClassAtom')()) + if var.get(u'atom').neg(): + var.get(u'bail')(Js(u'classAtom')) + if var.get(u'current')(Js(u']')): + return Js([var.get(u'atom')]) + return var.get(u'parseHelperClassRanges')(var.get(u'atom')) + PyJsHoisted_parseNonemptyClassRanges_.func_name = u'parseNonemptyClassRanges' + var.put(u'parseNonemptyClassRanges', PyJsHoisted_parseNonemptyClassRanges_) + @Js + def PyJsHoisted_parseHelperClassRanges_(atom, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'atom':atom}, var) + var.registers([u'to', u'atom', u'from', u'classRanges', u'res']) + pass + if (var.get(u'current')(Js(u'-')) and var.get(u'next')(Js(u']')).neg()): + var.get(u'skip')(Js(u'-')) + var.put(u'res', var.get(u'parseClassAtom')()) + if var.get(u'res').neg(): + var.get(u'bail')(Js(u'classAtom')) + var.put(u'to', var.get(u'pos')) + var.put(u'classRanges', var.get(u'parseClassRanges')()) + if var.get(u'classRanges').neg(): + var.get(u'bail')(Js(u'classRanges')) + var.put(u'from', var.get(u'atom').get(u'range').get(u'0')) + if PyJsStrictEq(var.get(u'classRanges').get(u'type'),Js(u'empty')): + return Js([var.get(u'createClassRange')(var.get(u'atom'), var.get(u'res'), var.get(u'from'), var.get(u'to'))]) + return Js([var.get(u'createClassRange')(var.get(u'atom'), var.get(u'res'), var.get(u'from'), var.get(u'to'))]).callprop(u'concat', var.get(u'classRanges')) + var.put(u'res', var.get(u'parseNonemptyClassRangesNoDash')()) + if var.get(u'res').neg(): + var.get(u'bail')(Js(u'nonEmptyClassRangesNoDash')) + return Js([var.get(u'atom')]).callprop(u'concat', var.get(u'res')) + PyJsHoisted_parseHelperClassRanges_.func_name = u'parseHelperClassRanges' + var.put(u'parseHelperClassRanges', PyJsHoisted_parseHelperClassRanges_) + @Js + def PyJsHoisted_bail_(message, details, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'to':to, u'from':PyJsArg_66726f6d_, u'details':details, u'this':this, u'message':message, u'arguments':arguments}, var) + var.registers([u'from', u'contextEnd', u'to', u'details', u'context', u'contextStart', u'message', u'pointer']) + var.put(u'from', (var.get(u'pos') if (var.get(u'from')==var.get(u"null")) else var.get(u'from'))) + var.put(u'to', (var.get(u'from') if (var.get(u'to')==var.get(u"null")) else var.get(u'to'))) + var.put(u'contextStart', var.get(u'Math').callprop(u'max', Js(0.0), (var.get(u'from')-Js(10.0)))) + var.put(u'contextEnd', var.get(u'Math').callprop(u'min', (var.get(u'to')+Js(10.0)), var.get(u'str').get(u'length'))) + var.put(u'context', (Js(u' ')+var.get(u'str').callprop(u'substring', var.get(u'contextStart'), var.get(u'contextEnd')))) + var.put(u'pointer', ((Js(u' ')+var.get(u'Array').create(((var.get(u'from')-var.get(u'contextStart'))+Js(1.0))).callprop(u'join', Js(u' ')))+Js(u'^'))) + PyJsTempException = JsToPyException(var.get(u'SyntaxError')((((((((var.get(u'message')+Js(u' at position '))+var.get(u'from'))+((Js(u': ')+var.get(u'details')) if var.get(u'details') else Js(u'')))+Js(u'\n'))+var.get(u'context'))+Js(u'\n'))+var.get(u'pointer')))) + raise PyJsTempException + PyJsHoisted_bail_.func_name = u'bail' + var.put(u'bail', PyJsHoisted_bail_) + @Js + def PyJsHoisted_parseIdentityEscape_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'tmp', u'ZWNJ', u'ZWJ']) + var.put(u'ZWJ', Js(u'\u200c')) + var.put(u'ZWNJ', Js(u'\u200d')) + pass + if var.get(u'isIdentifierPart')(var.get(u'lookahead')()).neg(): + var.put(u'tmp', var.get(u'incr')()) + return var.get(u'createEscaped')(Js(u'identifier'), var.get(u'tmp').callprop(u'charCodeAt', Js(0.0)), var.get(u'tmp'), Js(1.0)) + if var.get(u'match')(var.get(u'ZWJ')): + return var.get(u'createEscaped')(Js(u'identifier'), Js(8204), var.get(u'ZWJ')) + else: + if var.get(u'match')(var.get(u'ZWNJ')): + return var.get(u'createEscaped')(Js(u'identifier'), Js(8205), var.get(u'ZWNJ')) + return var.get(u"null") + PyJsHoisted_parseIdentityEscape_.func_name = u'parseIdentityEscape' + var.put(u'parseIdentityEscape', PyJsHoisted_parseIdentityEscape_) + @Js + def PyJsHoisted_createDot_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_4016_ = Js({u'type':Js(u'dot'),u'range':Js([(var.get(u'pos')-Js(1.0)), var.get(u'pos')])}) + return var.get(u'addRaw')(PyJs_Object_4016_) + PyJsHoisted_createDot_.func_name = u'createDot' + var.put(u'createDot', PyJsHoisted_createDot_) + @Js + def PyJsHoisted_incr_(amount, this, arguments, var=var): + var = Scope({u'this':this, u'amount':amount, u'arguments':arguments}, var) + var.registers([u'res', u'amount']) + var.put(u'amount', (var.get(u'amount') or Js(1.0))) + var.put(u'res', var.get(u'str').callprop(u'substring', var.get(u'pos'), (var.get(u'pos')+var.get(u'amount')))) + var.put(u'pos', (var.get(u'amount') or Js(1.0)), u'+') + return var.get(u'res') + PyJsHoisted_incr_.func_name = u'incr' + var.put(u'incr', PyJsHoisted_incr_) + @Js + def PyJsHoisted_parseAnchor_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res', u'from']) + var.put(u'from', var.get(u'pos')) + if var.get(u'match')(Js(u'^')): + return var.get(u'createAnchor')(Js(u'start'), Js(1.0)) + else: + if var.get(u'match')(Js(u'$')): + return var.get(u'createAnchor')(Js(u'end'), Js(1.0)) + else: + if var.get(u'match')(Js(u'\\b')): + return var.get(u'createAnchor')(Js(u'boundary'), Js(2.0)) + else: + if var.get(u'match')(Js(u'\\B')): + return var.get(u'createAnchor')(Js(u'not-boundary'), Js(2.0)) + else: + return var.get(u'parseGroup')(Js(u'(?='), Js(u'lookahead'), Js(u'(?!'), Js(u'negativeLookahead')) + PyJsHoisted_parseAnchor_.func_name = u'parseAnchor' + var.put(u'parseAnchor', PyJsHoisted_parseAnchor_) + @Js + def PyJsHoisted_parseAtom_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res']) + pass + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^[^^$\\\\.*+?(){[|]/'))): + return var.get(u'createCharacter')(var.get(u'res')) + else: + if var.get(u'match')(Js(u'.')): + return var.get(u'createDot')() + else: + if var.get(u'match')(Js(u'\\')): + var.put(u'res', var.get(u'parseAtomEscape')()) + if var.get(u'res').neg(): + var.get(u'bail')(Js(u'atomEscape')) + return var.get(u'res') + else: + if var.put(u'res', var.get(u'parseCharacterClass')()): + return var.get(u'res') + else: + return var.get(u'parseGroup')(Js(u'(?:'), Js(u'ignore'), Js(u'('), Js(u'normal')) + PyJsHoisted_parseAtom_.func_name = u'parseAtom' + var.put(u'parseAtom', PyJsHoisted_parseAtom_) + @Js + def PyJsHoisted_parseAtomEscape_(insideCharacterClass, this, arguments, var=var): + var = Scope({u'this':this, u'insideCharacterClass':insideCharacterClass, u'arguments':arguments}, var) + var.registers([u'res', u'insideCharacterClass', u'from']) + var.put(u'from', var.get(u'pos')) + var.put(u'res', var.get(u'parseDecimalEscape')()) + if var.get(u'res'): + return var.get(u'res') + if var.get(u'insideCharacterClass'): + if var.get(u'match')(Js(u'b')): + return var.get(u'createEscaped')(Js(u'singleEscape'), Js(8), Js(u'\\b')) + else: + if var.get(u'match')(Js(u'B')): + var.get(u'bail')(Js(u'\\B not possible inside of CharacterClass'), Js(u''), var.get(u'from')) + var.put(u'res', var.get(u'parseCharacterEscape')()) + return var.get(u'res') + PyJsHoisted_parseAtomEscape_.func_name = u'parseAtomEscape' + var.put(u'parseAtomEscape', PyJsHoisted_parseAtomEscape_) + @Js + def PyJsHoisted_next_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return PyJsStrictEq(var.get(u'str').get((var.get(u'pos')+Js(1.0))),var.get(u'value')) + PyJsHoisted_next_.func_name = u'next' + var.put(u'next', PyJsHoisted_next_) + @Js + def PyJsHoisted_current_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return PyJsStrictEq(var.get(u'str').callprop(u'indexOf', var.get(u'value'), var.get(u'pos')),var.get(u'pos')) + PyJsHoisted_current_.func_name = u'current' + var.put(u'current', PyJsHoisted_current_) + @Js + def PyJsHoisted_updateRawStart_(node, start, this, arguments, var=var): + var = Scope({u'node':node, u'start':start, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'start']) + var.get(u'node').get(u'range').put(u'0', var.get(u'start')) + return var.get(u'addRaw')(var.get(u'node')) + PyJsHoisted_updateRawStart_.func_name = u'updateRawStart' + var.put(u'updateRawStart', PyJsHoisted_updateRawStart_) + @Js + def PyJsHoisted_isEmpty_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return PyJsStrictEq(var.get(u'obj').get(u'type'),Js(u'empty')) + PyJsHoisted_isEmpty_.func_name = u'isEmpty' + var.put(u'isEmpty', PyJsHoisted_isEmpty_) + @Js + def PyJsHoisted_createDisjunction_(alternatives, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'this':this, u'from':PyJsArg_66726f6d_, u'alternatives':alternatives, u'arguments':arguments, u'to':to}, var) + var.registers([u'from', u'alternatives', u'to']) + PyJs_Object_4015_ = Js({u'type':Js(u'disjunction'),u'body':var.get(u'alternatives'),u'range':Js([var.get(u'from'), var.get(u'to')])}) + return var.get(u'addRaw')(PyJs_Object_4015_) + PyJsHoisted_createDisjunction_.func_name = u'createDisjunction' + var.put(u'createDisjunction', PyJsHoisted_createDisjunction_) + @Js + def PyJsHoisted_parseClassEscape_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'parseAtomEscape')(var.get(u'true')) + PyJsHoisted_parseClassEscape_.func_name = u'parseClassEscape' + var.put(u'parseClassEscape', PyJsHoisted_parseClassEscape_) + @Js + def PyJsHoisted_parseCharacterEscape_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res', u'codePoint']) + pass + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^[fnrtv]/'))): + var.put(u'codePoint', Js(0.0)) + while 1: + SWITCHED = False + CONDITION = (var.get(u'res').get(u'0')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u't')): + SWITCHED = True + var.put(u'codePoint', Js(9)) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'n')): + SWITCHED = True + var.put(u'codePoint', Js(10)) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'v')): + SWITCHED = True + var.put(u'codePoint', Js(11)) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'f')): + SWITCHED = True + var.put(u'codePoint', Js(12)) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'r')): + SWITCHED = True + var.put(u'codePoint', Js(13)) + break + SWITCHED = True + break + return var.get(u'createEscaped')(Js(u'singleEscape'), var.get(u'codePoint'), (Js(u'\\')+var.get(u'res').get(u'0'))) + else: + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^c([a-zA-Z])/'))): + return var.get(u'createEscaped')(Js(u'controlLetter'), (var.get(u'res').get(u'1').callprop(u'charCodeAt', Js(0.0))%Js(32.0)), var.get(u'res').get(u'1'), Js(2.0)) + else: + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^x([0-9a-fA-F]{2})/'))): + return var.get(u'createEscaped')(Js(u'hexadecimalEscape'), var.get(u'parseInt')(var.get(u'res').get(u'1'), Js(16.0)), var.get(u'res').get(u'1'), Js(2.0)) + else: + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^u([0-9a-fA-F]{4})/'))): + return var.get(u'parseUnicodeSurrogatePairEscape')(var.get(u'createEscaped')(Js(u'unicodeEscape'), var.get(u'parseInt')(var.get(u'res').get(u'1'), Js(16.0)), var.get(u'res').get(u'1'), Js(2.0))) + else: + if (var.get(u'hasUnicodeFlag') and var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^u\\{([0-9a-fA-F]+)\\}/')))): + return var.get(u'createEscaped')(Js(u'unicodeCodePointEscape'), var.get(u'parseInt')(var.get(u'res').get(u'1'), Js(16.0)), var.get(u'res').get(u'1'), Js(4.0)) + else: + return var.get(u'parseIdentityEscape')() + PyJsHoisted_parseCharacterEscape_.func_name = u'parseCharacterEscape' + var.put(u'parseCharacterEscape', PyJsHoisted_parseCharacterEscape_) + @Js + def PyJsHoisted_parseGroup_(matchA, typeA, matchB, typeB, this, arguments, var=var): + var = Scope({u'matchB':matchB, u'matchA':matchA, u'this':this, u'arguments':arguments, u'typeA':typeA, u'typeB':typeB}, var) + var.registers([u'body', u'from', u'typeA', u'typeB', u'matchB', u'matchA', u'group', u'type']) + var.put(u'type', var.get(u"null")) + var.put(u'from', var.get(u'pos')) + if var.get(u'match')(var.get(u'matchA')): + var.put(u'type', var.get(u'typeA')) + else: + if var.get(u'match')(var.get(u'matchB')): + var.put(u'type', var.get(u'typeB')) + else: + return Js(False) + var.put(u'body', var.get(u'parseDisjunction')()) + if var.get(u'body').neg(): + var.get(u'bail')(Js(u'Expected disjunction')) + var.get(u'skip')(Js(u')')) + var.put(u'group', var.get(u'createGroup')(var.get(u'type'), var.get(u'flattenBody')(var.get(u'body')), var.get(u'from'), var.get(u'pos'))) + if (var.get(u'type')==Js(u'normal')): + if var.get(u'firstIteration'): + (var.put(u'closedCaptureCounter',Js(var.get(u'closedCaptureCounter').to_number())+Js(1))-Js(1)) + return var.get(u'group') + PyJsHoisted_parseGroup_.func_name = u'parseGroup' + var.put(u'parseGroup', PyJsHoisted_parseGroup_) + @Js + def PyJsHoisted_parseClassAtomNoDash_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res']) + pass + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^[^\\\\\\]-]/'))): + return var.get(u'createCharacter')(var.get(u'res').get(u'0')) + else: + if var.get(u'match')(Js(u'\\')): + var.put(u'res', var.get(u'parseClassEscape')()) + if var.get(u'res').neg(): + var.get(u'bail')(Js(u'classEscape')) + return var.get(u'parseUnicodeSurrogatePairEscape')(var.get(u'res')) + PyJsHoisted_parseClassAtomNoDash_.func_name = u'parseClassAtomNoDash' + var.put(u'parseClassAtomNoDash', PyJsHoisted_parseClassAtomNoDash_) + @Js + def PyJsHoisted_createAnchor_(kind, rawLength, this, arguments, var=var): + var = Scope({u'this':this, u'kind':kind, u'arguments':arguments, u'rawLength':rawLength}, var) + var.registers([u'kind', u'rawLength']) + PyJs_Object_4013_ = Js({u'type':Js(u'anchor'),u'kind':var.get(u'kind'),u'range':Js([(var.get(u'pos')-var.get(u'rawLength')), var.get(u'pos')])}) + return var.get(u'addRaw')(PyJs_Object_4013_) + PyJsHoisted_createAnchor_.func_name = u'createAnchor' + var.put(u'createAnchor', PyJsHoisted_createAnchor_) + @Js + def PyJsHoisted_match_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + if PyJsStrictEq(var.get(u'str').callprop(u'indexOf', var.get(u'value'), var.get(u'pos')),var.get(u'pos')): + return var.get(u'incr')(var.get(u'value').get(u'length')) + PyJsHoisted_match_.func_name = u'match' + var.put(u'match', PyJsHoisted_match_) + @Js + def PyJsHoisted_parseCharacterClass_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res', u'from']) + var.put(u'from', var.get(u'pos')) + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^\\[\\^/'))): + var.put(u'res', var.get(u'parseClassRanges')()) + var.get(u'skip')(Js(u']')) + return var.get(u'createCharacterClass')(var.get(u'res'), var.get(u'true'), var.get(u'from'), var.get(u'pos')) + else: + if var.get(u'match')(Js(u'[')): + var.put(u'res', var.get(u'parseClassRanges')()) + var.get(u'skip')(Js(u']')) + return var.get(u'createCharacterClass')(var.get(u'res'), Js(False), var.get(u'from'), var.get(u'pos')) + return var.get(u"null") + PyJsHoisted_parseCharacterClass_.func_name = u'parseCharacterClass' + var.put(u'parseCharacterClass', PyJsHoisted_parseCharacterClass_) + @Js + def PyJsHoisted_createValue_(kind, codePoint, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'to':to, u'kind':kind, u'from':PyJsArg_66726f6d_, u'arguments':arguments, u'this':this, u'codePoint':codePoint}, var) + var.registers([u'to', u'kind', u'from', u'codePoint']) + PyJs_Object_4014_ = Js({u'type':Js(u'value'),u'kind':var.get(u'kind'),u'codePoint':var.get(u'codePoint'),u'range':Js([var.get(u'from'), var.get(u'to')])}) + return var.get(u'addRaw')(PyJs_Object_4014_) + PyJsHoisted_createValue_.func_name = u'createValue' + var.put(u'createValue', PyJsHoisted_createValue_) + @Js + def PyJsHoisted_createReference_(matchIndex, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'matchIndex':matchIndex}, var) + var.registers([u'matchIndex']) + PyJs_Object_4018_ = Js({u'type':Js(u'reference'),u'matchIndex':var.get(u'parseInt')(var.get(u'matchIndex'), Js(10.0)),u'range':Js([((var.get(u'pos')-Js(1.0))-var.get(u'matchIndex').get(u'length')), var.get(u'pos')])}) + return var.get(u'addRaw')(PyJs_Object_4018_) + PyJsHoisted_createReference_.func_name = u'createReference' + var.put(u'createReference', PyJsHoisted_createReference_) + @Js + def PyJsHoisted_parseNonemptyClassRangesNoDash_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res']) + var.put(u'res', var.get(u'parseClassAtom')()) + if var.get(u'res').neg(): + var.get(u'bail')(Js(u'classAtom')) + if var.get(u'current')(Js(u']')): + return var.get(u'res') + return var.get(u'parseHelperClassRanges')(var.get(u'res')) + PyJsHoisted_parseNonemptyClassRangesNoDash_.func_name = u'parseNonemptyClassRangesNoDash' + var.put(u'parseNonemptyClassRangesNoDash', PyJsHoisted_parseNonemptyClassRangesNoDash_) + @Js + def PyJsHoisted_createCharacterClassEscape_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + PyJs_Object_4017_ = Js({u'type':Js(u'characterClassEscape'),u'value':var.get(u'value'),u'range':Js([(var.get(u'pos')-Js(2.0)), var.get(u'pos')])}) + return var.get(u'addRaw')(PyJs_Object_4017_) + PyJsHoisted_createCharacterClassEscape_.func_name = u'createCharacterClassEscape' + var.put(u'createCharacterClassEscape', PyJsHoisted_createCharacterClassEscape_) + @Js + def PyJsHoisted_parseAlternative_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res', u'term', u'from']) + var.put(u'res', Js([])) + var.put(u'from', var.get(u'pos')) + pass + while var.put(u'term', var.get(u'parseTerm')()): + var.get(u'res').callprop(u'push', var.get(u'term')) + if PyJsStrictEq(var.get(u'res').get(u'length'),Js(1.0)): + return var.get(u'res').get(u'0') + return var.get(u'createAlternative')(var.get(u'res'), var.get(u'from'), var.get(u'pos')) + PyJsHoisted_parseAlternative_.func_name = u'parseAlternative' + var.put(u'parseAlternative', PyJsHoisted_parseAlternative_) + @Js + def PyJsHoisted_isIdentifierPart_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch', u'NonAsciiIdentifierPart']) + def PyJs_LONG_4024_(var=var): + return var.get(u'RegExp').create(Js(u'[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0-\u08b2\u08e4-\u0963\u0966-\u096f\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17d3\u17d7\u17dc\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19d9\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1ab0-\u1abd\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1cd0-\u1cd2\u1cd4-\u1cf6\u1cf8\u1cf9\u1d00-\u1df5\u1dfc-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200c\u200d\u203f\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua69d\ua69f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua7ad\ua7b0\ua7b1\ua7f7-\ua827\ua840-\ua873\ua880-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua900-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\ua9e0-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab5f\uab64\uab65\uabc0-\uabea\uabec\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe2d\ufe33\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]')) + var.put(u'NonAsciiIdentifierPart', PyJs_LONG_4024_()) + def PyJs_LONG_4025_(var=var): + return ((((((PyJsStrictEq(var.get(u'ch'),Js(36.0)) or PyJsStrictEq(var.get(u'ch'),Js(95.0))) or ((var.get(u'ch')>=Js(65.0)) and (var.get(u'ch')<=Js(90.0)))) or ((var.get(u'ch')>=Js(97.0)) and (var.get(u'ch')<=Js(122.0)))) or ((var.get(u'ch')>=Js(48.0)) and (var.get(u'ch')<=Js(57.0)))) or PyJsStrictEq(var.get(u'ch'),Js(92.0))) or ((var.get(u'ch')>=Js(128)) and var.get(u'NonAsciiIdentifierPart').callprop(u'test', var.get(u'String').callprop(u'fromCharCode', var.get(u'ch'))))) + return PyJs_LONG_4025_() + PyJsHoisted_isIdentifierPart_.func_name = u'isIdentifierPart' + var.put(u'isIdentifierPart', PyJsHoisted_isIdentifierPart_) + @Js + def PyJsHoisted_createQuantifier_(min, max, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'to':to, u'from':PyJsArg_66726f6d_, u'arguments':arguments, u'min':min, u'this':this, u'max':max}, var) + var.registers([u'max', u'from', u'to', u'min']) + if (var.get(u'to')==var.get(u"null")): + var.put(u'from', (var.get(u'pos')-Js(1.0))) + var.put(u'to', var.get(u'pos')) + PyJs_Object_4020_ = Js({u'type':Js(u'quantifier'),u'min':var.get(u'min'),u'max':var.get(u'max'),u'greedy':var.get(u'true'),u'body':var.get(u"null"),u'range':Js([var.get(u'from'), var.get(u'to')])}) + return var.get(u'addRaw')(PyJs_Object_4020_) + PyJsHoisted_createQuantifier_.func_name = u'createQuantifier' + var.put(u'createQuantifier', PyJsHoisted_createQuantifier_) + @Js + def PyJsHoisted_createCharacter_(matches, this, arguments, var=var): + var = Scope({u'matches':matches, u'this':this, u'arguments':arguments}, var) + var.registers([u'matches', u'_char', u'second', u'first']) + var.put(u'_char', var.get(u'matches').get(u'0')) + var.put(u'first', var.get(u'_char').callprop(u'charCodeAt', Js(0.0))) + if var.get(u'hasUnicodeFlag'): + pass + if ((PyJsStrictEq(var.get(u'_char').get(u'length'),Js(1.0)) and (var.get(u'first')>=Js(55296))) and (var.get(u'first')<=Js(56319))): + var.put(u'second', var.get(u'lookahead')().callprop(u'charCodeAt', Js(0.0))) + if ((var.get(u'second')>=Js(56320)) and (var.get(u'second')<=Js(57343))): + (var.put(u'pos',Js(var.get(u'pos').to_number())+Js(1))-Js(1)) + return var.get(u'createValue')(Js(u'symbol'), (((((var.get(u'first')-Js(55296))*Js(1024))+var.get(u'second'))-Js(56320))+Js(65536)), (var.get(u'pos')-Js(2.0)), var.get(u'pos')) + return var.get(u'createValue')(Js(u'symbol'), var.get(u'first'), (var.get(u'pos')-Js(1.0)), var.get(u'pos')) + PyJsHoisted_createCharacter_.func_name = u'createCharacter' + var.put(u'createCharacter', PyJsHoisted_createCharacter_) + @Js + def PyJsHoisted_lookahead_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'str').get(var.get(u'pos')) + PyJsHoisted_lookahead_.func_name = u'lookahead' + var.put(u'lookahead', PyJsHoisted_lookahead_) + @Js + def PyJsHoisted_createClassRange_(min, max, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'to':to, u'from':PyJsArg_66726f6d_, u'arguments':arguments, u'min':min, u'this':this, u'max':max}, var) + var.registers([u'max', u'from', u'to', u'min']) + if (var.get(u'min').get(u'codePoint')>var.get(u'max').get(u'codePoint')): + var.get(u'bail')(Js(u'invalid range in character class'), ((var.get(u'min').get(u'raw')+Js(u'-'))+var.get(u'max').get(u'raw')), var.get(u'from'), var.get(u'to')) + PyJs_Object_4023_ = Js({u'type':Js(u'characterClassRange'),u'min':var.get(u'min'),u'max':var.get(u'max'),u'range':Js([var.get(u'from'), var.get(u'to')])}) + return var.get(u'addRaw')(PyJs_Object_4023_) + PyJsHoisted_createClassRange_.func_name = u'createClassRange' + var.put(u'createClassRange', PyJsHoisted_createClassRange_) + @Js + def PyJsHoisted_createAlternative_(terms, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'this':this, u'from':PyJsArg_66726f6d_, u'terms':terms, u'arguments':arguments, u'to':to}, var) + var.registers([u'from', u'terms', u'to']) + PyJs_Object_4021_ = Js({u'type':Js(u'alternative'),u'body':var.get(u'terms'),u'range':Js([var.get(u'from'), var.get(u'to')])}) + return var.get(u'addRaw')(PyJs_Object_4021_) + PyJsHoisted_createAlternative_.func_name = u'createAlternative' + var.put(u'createAlternative', PyJsHoisted_createAlternative_) + @Js + def PyJsHoisted_parseClassRanges_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res']) + pass + if var.get(u'current')(Js(u']')): + return Js([]) + else: + var.put(u'res', var.get(u'parseNonemptyClassRanges')()) + if var.get(u'res').neg(): + var.get(u'bail')(Js(u'nonEmptyClassRanges')) + return var.get(u'res') + PyJsHoisted_parseClassRanges_.func_name = u'parseClassRanges' + var.put(u'parseClassRanges', PyJsHoisted_parseClassRanges_) + @Js + def PyJsHoisted_createEscaped_(kind, codePoint, value, fromOffset, this, arguments, var=var): + var = Scope({u'kind':kind, u'arguments':arguments, u'this':this, u'fromOffset':fromOffset, u'codePoint':codePoint, u'value':value}, var) + var.registers([u'kind', u'fromOffset', u'codePoint', u'value']) + var.put(u'fromOffset', (var.get(u'fromOffset') or Js(0.0))) + return var.get(u'createValue')(var.get(u'kind'), var.get(u'codePoint'), (var.get(u'pos')-(var.get(u'value').get(u'length')+var.get(u'fromOffset'))), var.get(u'pos')) + PyJsHoisted_createEscaped_.func_name = u'createEscaped' + var.put(u'createEscaped', PyJsHoisted_createEscaped_) + @Js + def PyJsHoisted_parseUnicodeSurrogatePairEscape_(firstEscape, this, arguments, var=var): + var = Scope({u'firstEscape':firstEscape, u'this':this, u'arguments':arguments}, var) + var.registers([u'firstEscape', u'secondEscape', u'second', u'prevPos', u'first']) + if var.get(u'hasUnicodeFlag'): + pass + if (((((var.get(u'firstEscape').get(u'kind')==Js(u'unicodeEscape')) and (var.put(u'first', var.get(u'firstEscape').get(u'codePoint'))>=Js(55296))) and (var.get(u'first')<=Js(56319))) and var.get(u'current')(Js(u'\\'))) and var.get(u'next')(Js(u'u'))): + var.put(u'prevPos', var.get(u'pos')) + (var.put(u'pos',Js(var.get(u'pos').to_number())+Js(1))-Js(1)) + var.put(u'secondEscape', var.get(u'parseClassEscape')()) + if (((var.get(u'secondEscape').get(u'kind')==Js(u'unicodeEscape')) and (var.put(u'second', var.get(u'secondEscape').get(u'codePoint'))>=Js(56320))) and (var.get(u'second')<=Js(57343))): + var.get(u'firstEscape').get(u'range').put(u'1', var.get(u'secondEscape').get(u'range').get(u'1')) + var.get(u'firstEscape').put(u'codePoint', (((((var.get(u'first')-Js(55296))*Js(1024))+var.get(u'second'))-Js(56320))+Js(65536))) + var.get(u'firstEscape').put(u'type', Js(u'value')) + var.get(u'firstEscape').put(u'kind', Js(u'unicodeCodePointEscape')) + var.get(u'addRaw')(var.get(u'firstEscape')) + else: + var.put(u'pos', var.get(u'prevPos')) + return var.get(u'firstEscape') + PyJsHoisted_parseUnicodeSurrogatePairEscape_.func_name = u'parseUnicodeSurrogatePairEscape' + var.put(u'parseUnicodeSurrogatePairEscape', PyJsHoisted_parseUnicodeSurrogatePairEscape_) + @Js + def PyJsHoisted_parseTerm_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'quantifier', u'anchor', u'atom']) + if (((var.get(u'pos')>=var.get(u'str').get(u'length')) or var.get(u'current')(Js(u'|'))) or var.get(u'current')(Js(u')'))): + return var.get(u"null") + var.put(u'anchor', var.get(u'parseAnchor')()) + if var.get(u'anchor'): + return var.get(u'anchor') + var.put(u'atom', var.get(u'parseAtom')()) + if var.get(u'atom').neg(): + var.get(u'bail')(Js(u'Expected atom')) + var.put(u'quantifier', (var.get(u'parseQuantifier')() or Js(False))) + if var.get(u'quantifier'): + var.get(u'quantifier').put(u'body', var.get(u'flattenBody')(var.get(u'atom'))) + var.get(u'updateRawStart')(var.get(u'quantifier'), var.get(u'atom').get(u'range').get(u'0')) + return var.get(u'quantifier') + return var.get(u'atom') + PyJsHoisted_parseTerm_.func_name = u'parseTerm' + var.put(u'parseTerm', PyJsHoisted_parseTerm_) + @Js + def PyJsHoisted_createGroup_(behavior, disjunction, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'to':to, u'from':PyJsArg_66726f6d_, u'arguments':arguments, u'behavior':behavior, u'this':this, u'disjunction':disjunction}, var) + var.registers([u'to', u'disjunction', u'from', u'behavior']) + PyJs_Object_4019_ = Js({u'type':Js(u'group'),u'behavior':var.get(u'behavior'),u'body':var.get(u'disjunction'),u'range':Js([var.get(u'from'), var.get(u'to')])}) + return var.get(u'addRaw')(PyJs_Object_4019_) + PyJsHoisted_createGroup_.func_name = u'createGroup' + var.put(u'createGroup', PyJsHoisted_createGroup_) + @Js + def PyJsHoisted_parseDecimalEscape_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res', u'refIdx', u'match']) + pass + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^(?!0)\\d+/'))): + var.put(u'match', var.get(u'res').get(u'0')) + var.put(u'refIdx', var.get(u'parseInt')(var.get(u'res').get(u'0'), Js(10.0))) + if (var.get(u'refIdx')<=var.get(u'closedCaptureCounter')): + return var.get(u'createReference')(var.get(u'res').get(u'0')) + else: + var.get(u'backrefDenied').callprop(u'push', var.get(u'refIdx')) + var.get(u'incr')((-var.get(u'res').get(u'0').get(u'length'))) + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^[0-7]{1,3}/'))): + return var.get(u'createEscaped')(Js(u'octal'), var.get(u'parseInt')(var.get(u'res').get(u'0'), Js(8.0)), var.get(u'res').get(u'0'), Js(1.0)) + else: + var.put(u'res', var.get(u'createCharacter')(var.get(u'matchReg')(JsRegExp(u'/^[89]/')))) + return var.get(u'updateRawStart')(var.get(u'res'), (var.get(u'res').get(u'range').get(u'0')-Js(1.0))) + else: + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^[0-7]{1,3}/'))): + var.put(u'match', var.get(u'res').get(u'0')) + if JsRegExp(u'/^0{1,3}$/').callprop(u'test', var.get(u'match')): + return var.get(u'createEscaped')(Js(u'null'), Js(0), Js(u'0'), (var.get(u'match').get(u'length')+Js(1.0))) + else: + return var.get(u'createEscaped')(Js(u'octal'), var.get(u'parseInt')(var.get(u'match'), Js(8.0)), var.get(u'match'), Js(1.0)) + else: + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^[dDsSwW]/'))): + return var.get(u'createCharacterClassEscape')(var.get(u'res').get(u'0')) + return Js(False) + PyJsHoisted_parseDecimalEscape_.func_name = u'parseDecimalEscape' + var.put(u'parseDecimalEscape', PyJsHoisted_parseDecimalEscape_) + @Js + def PyJsHoisted_parseClassAtom_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u'match')(Js(u'-')): + return var.get(u'createCharacter')(Js(u'-')) + else: + return var.get(u'parseClassAtomNoDash')() + PyJsHoisted_parseClassAtom_.func_name = u'parseClassAtom' + var.put(u'parseClassAtom', PyJsHoisted_parseClassAtom_) + @Js + def PyJsHoisted_createCharacterClass_(classRanges, negative, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'to':to, u'from':PyJsArg_66726f6d_, u'classRanges':classRanges, u'this':this, u'negative':negative, u'arguments':arguments}, var) + var.registers([u'to', u'from', u'classRanges', u'negative']) + PyJs_Object_4022_ = Js({u'type':Js(u'characterClass'),u'body':var.get(u'classRanges'),u'negative':var.get(u'negative'),u'range':Js([var.get(u'from'), var.get(u'to')])}) + return var.get(u'addRaw')(PyJs_Object_4022_) + PyJsHoisted_createCharacterClass_.func_name = u'createCharacterClass' + var.put(u'createCharacterClass', PyJsHoisted_createCharacterClass_) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + var.put(u'backrefDenied', Js([])) + var.put(u'closedCaptureCounter', Js(0.0)) + var.put(u'firstIteration', var.get(u'true')) + var.put(u'hasUnicodeFlag', PyJsStrictNeq((var.get(u'flags') or Js(u'')).callprop(u'indexOf', Js(u'u')),(-Js(1.0)))) + var.put(u'pos', Js(0.0)) + var.put(u'str', var.get(u'String')(var.get(u'str'))) + if PyJsStrictEq(var.get(u'str'),Js(u'')): + var.put(u'str', Js(u'(?:)')) + var.put(u'result', var.get(u'parseDisjunction')()) + if PyJsStrictNeq(var.get(u'result').get(u'range').get(u'1'),var.get(u'str').get(u'length')): + var.get(u'bail')(Js(u'Could not parse entire input - got stuck'), Js(u''), var.get(u'result').get(u'range').get(u'1')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'backrefDenied').get(u'length')): + try: + if (var.get(u'backrefDenied').get(var.get(u'i'))<=var.get(u'closedCaptureCounter')): + var.put(u'pos', Js(0.0)) + var.put(u'firstIteration', Js(False)) + return var.get(u'parseDisjunction')() + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'result') + PyJsHoisted_parse_.func_name = u'parse' + var.put(u'parse', PyJsHoisted_parse_) + pass + PyJs_Object_4026_ = Js({u'parse':var.get(u'parse')}) + var.put(u'regjsparser', PyJs_Object_4026_) + if (PyJsStrictNeq(var.get(u'module',throw=False).typeof(),Js(u'undefined')) and var.get(u'module').get(u'exports')): + var.get(u'module').put(u'exports', var.get(u'regjsparser')) + else: + var.get(u'window').put(u'regjsparser', var.get(u'regjsparser')) + PyJs_anonymous_4012_._set_name(u'anonymous') + PyJs_anonymous_4012_() +PyJs_anonymous_4011_._set_name(u'anonymous') +PyJs_Object_4027_ = Js({}) +@Js +def PyJs_anonymous_4028_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'isFinite', u'module']) + Js(u'use strict') + var.put(u'isFinite', var.get(u'require')(Js(u'is-finite'))) + @Js + def PyJs_anonymous_4029_(str, n, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str, u'n':n}, var) + var.registers([u'str', u'ret', u'n']) + if PyJsStrictNeq(var.get(u'str',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Expected `input` to be a string'))) + raise PyJsTempException + if ((var.get(u'n')<Js(0.0)) or var.get(u'isFinite')(var.get(u'n')).neg()): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Expected `count` to be a positive finite number'))) + raise PyJsTempException + var.put(u'ret', Js(u'')) + while 1: + if (var.get(u'n')&Js(1.0)): + var.put(u'ret', var.get(u'str'), u'+') + var.put(u'str', var.get(u'str'), u'+') + if not var.put(u'n', Js(1.0), u'>>'): + break + return var.get(u'ret') + PyJs_anonymous_4029_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_4029_) +PyJs_anonymous_4028_._set_name(u'anonymous') +PyJs_Object_4030_ = Js({u'is-finite':Js(281.0)}) +@Js +def PyJs_anonymous_4031_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + @Js + def PyJs_anonymous_4032_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'isExtendedLengthPath', u'hasNonAscii', u'str']) + var.put(u'isExtendedLengthPath', JsRegExp(u'/^\\\\\\\\\\?\\\\/').callprop(u'test', var.get(u'str'))) + var.put(u'hasNonAscii', JsRegExp(u'/[^\\x00-\\x80]+/').callprop(u'test', var.get(u'str'))) + if (var.get(u'isExtendedLengthPath') or var.get(u'hasNonAscii')): + return var.get(u'str') + return var.get(u'str').callprop(u'replace', JsRegExp(u'/\\\\/g'), Js(u'/')) + PyJs_anonymous_4032_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_4032_) +PyJs_anonymous_4031_._set_name(u'anonymous') +PyJs_Object_4033_ = Js({}) +@Js +def PyJs_anonymous_4034_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'util', u'ArraySet', u'has']) + @Js + def PyJsHoisted_ArraySet_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'_array', Js([])) + var.get(u"this").put(u'_set', var.get(u'Object').callprop(u'create', var.get(u"null"))) + PyJsHoisted_ArraySet_.func_name = u'ArraySet' + var.put(u'ArraySet', PyJsHoisted_ArraySet_) + var.put(u'util', var.get(u'require')(Js(u'./util'))) + var.put(u'has', var.get(u'Object').get(u'prototype').get(u'hasOwnProperty')) + pass + @Js + def PyJs_ArraySet_fromArray_4035_(aArray, aAllowDuplicates, this, arguments, var=var): + var = Scope({u'this':this, u'ArraySet_fromArray':PyJs_ArraySet_fromArray_4035_, u'aAllowDuplicates':aAllowDuplicates, u'aArray':aArray, u'arguments':arguments}, var) + var.registers([u'i', u'aAllowDuplicates', u'set', u'aArray', u'len']) + var.put(u'set', var.get(u'ArraySet').create()) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u'aArray').get(u'length')) + while (var.get(u'i')<var.get(u'len')): + try: + var.get(u'set').callprop(u'add', var.get(u'aArray').get(var.get(u'i')), var.get(u'aAllowDuplicates')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'set') + PyJs_ArraySet_fromArray_4035_._set_name(u'ArraySet_fromArray') + var.get(u'ArraySet').put(u'fromArray', PyJs_ArraySet_fromArray_4035_) + @Js + def PyJs_ArraySet_size_4036_(this, arguments, var=var): + var = Scope({u'this':this, u'ArraySet_size':PyJs_ArraySet_size_4036_, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'Object').callprop(u'getOwnPropertyNames', var.get(u"this").get(u'_set')).get(u'length') + PyJs_ArraySet_size_4036_._set_name(u'ArraySet_size') + var.get(u'ArraySet').get(u'prototype').put(u'size', PyJs_ArraySet_size_4036_) + @Js + def PyJs_ArraySet_add_4037_(aStr, aAllowDuplicates, this, arguments, var=var): + var = Scope({u'this':this, u'ArraySet_add':PyJs_ArraySet_add_4037_, u'aStr':aStr, u'arguments':arguments, u'aAllowDuplicates':aAllowDuplicates}, var) + var.registers([u'sStr', u'isDuplicate', u'aStr', u'aAllowDuplicates', u'idx']) + var.put(u'sStr', var.get(u'util').callprop(u'toSetString', var.get(u'aStr'))) + var.put(u'isDuplicate', var.get(u'has').callprop(u'call', var.get(u"this").get(u'_set'), var.get(u'sStr'))) + var.put(u'idx', var.get(u"this").get(u'_array').get(u'length')) + if (var.get(u'isDuplicate').neg() or var.get(u'aAllowDuplicates')): + var.get(u"this").get(u'_array').callprop(u'push', var.get(u'aStr')) + if var.get(u'isDuplicate').neg(): + var.get(u"this").get(u'_set').put(var.get(u'sStr'), var.get(u'idx')) + PyJs_ArraySet_add_4037_._set_name(u'ArraySet_add') + var.get(u'ArraySet').get(u'prototype').put(u'add', PyJs_ArraySet_add_4037_) + @Js + def PyJs_ArraySet_has_4038_(aStr, this, arguments, var=var): + var = Scope({u'this':this, u'ArraySet_has':PyJs_ArraySet_has_4038_, u'aStr':aStr, u'arguments':arguments}, var) + var.registers([u'sStr', u'aStr']) + var.put(u'sStr', var.get(u'util').callprop(u'toSetString', var.get(u'aStr'))) + return var.get(u'has').callprop(u'call', var.get(u"this").get(u'_set'), var.get(u'sStr')) + PyJs_ArraySet_has_4038_._set_name(u'ArraySet_has') + var.get(u'ArraySet').get(u'prototype').put(u'has', PyJs_ArraySet_has_4038_) + @Js + def PyJs_ArraySet_indexOf_4039_(aStr, this, arguments, var=var): + var = Scope({u'this':this, u'aStr':aStr, u'ArraySet_indexOf':PyJs_ArraySet_indexOf_4039_, u'arguments':arguments}, var) + var.registers([u'sStr', u'aStr']) + var.put(u'sStr', var.get(u'util').callprop(u'toSetString', var.get(u'aStr'))) + if var.get(u'has').callprop(u'call', var.get(u"this").get(u'_set'), var.get(u'sStr')): + return var.get(u"this").get(u'_set').get(var.get(u'sStr')) + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'"')+var.get(u'aStr'))+Js(u'" is not in the set.')))) + raise PyJsTempException + PyJs_ArraySet_indexOf_4039_._set_name(u'ArraySet_indexOf') + var.get(u'ArraySet').get(u'prototype').put(u'indexOf', PyJs_ArraySet_indexOf_4039_) + @Js + def PyJs_ArraySet_at_4040_(aIdx, this, arguments, var=var): + var = Scope({u'this':this, u'ArraySet_at':PyJs_ArraySet_at_4040_, u'aIdx':aIdx, u'arguments':arguments}, var) + var.registers([u'aIdx']) + if ((var.get(u'aIdx')>=Js(0.0)) and (var.get(u'aIdx')<var.get(u"this").get(u'_array').get(u'length'))): + return var.get(u"this").get(u'_array').get(var.get(u'aIdx')) + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'No element indexed by ')+var.get(u'aIdx')))) + raise PyJsTempException + PyJs_ArraySet_at_4040_._set_name(u'ArraySet_at') + var.get(u'ArraySet').get(u'prototype').put(u'at', PyJs_ArraySet_at_4040_) + @Js + def PyJs_ArraySet_toArray_4041_(this, arguments, var=var): + var = Scope({u'this':this, u'ArraySet_toArray':PyJs_ArraySet_toArray_4041_, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").get(u'_array').callprop(u'slice') + PyJs_ArraySet_toArray_4041_._set_name(u'ArraySet_toArray') + var.get(u'ArraySet').get(u'prototype').put(u'toArray', PyJs_ArraySet_toArray_4041_) + var.get(u'exports').put(u'ArraySet', var.get(u'ArraySet')) +PyJs_anonymous_4034_._set_name(u'anonymous') +PyJs_Object_4042_ = Js({u'./util':Js(518.0)}) +@Js +def PyJs_anonymous_4043_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'VLQ_CONTINUATION_BIT', u'VLQ_BASE', u'require', u'base64', u'toVLQSigned', u'module', u'VLQ_BASE_MASK', u'fromVLQSigned', u'VLQ_BASE_SHIFT']) + @Js + def PyJsHoisted_toVLQSigned_(aValue, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'aValue':aValue}, var) + var.registers([u'aValue']) + return ((((-var.get(u'aValue'))<<Js(1.0))+Js(1.0)) if (var.get(u'aValue')<Js(0.0)) else ((var.get(u'aValue')<<Js(1.0))+Js(0.0))) + PyJsHoisted_toVLQSigned_.func_name = u'toVLQSigned' + var.put(u'toVLQSigned', PyJsHoisted_toVLQSigned_) + @Js + def PyJsHoisted_fromVLQSigned_(aValue, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'aValue':aValue}, var) + var.registers([u'shifted', u'aValue', u'isNegative']) + var.put(u'isNegative', PyJsStrictEq((var.get(u'aValue')&Js(1.0)),Js(1.0))) + var.put(u'shifted', (var.get(u'aValue')>>Js(1.0))) + return ((-var.get(u'shifted')) if var.get(u'isNegative') else var.get(u'shifted')) + PyJsHoisted_fromVLQSigned_.func_name = u'fromVLQSigned' + var.put(u'fromVLQSigned', PyJsHoisted_fromVLQSigned_) + var.put(u'base64', var.get(u'require')(Js(u'./base64'))) + var.put(u'VLQ_BASE_SHIFT', Js(5.0)) + var.put(u'VLQ_BASE', (Js(1.0)<<var.get(u'VLQ_BASE_SHIFT'))) + var.put(u'VLQ_BASE_MASK', (var.get(u'VLQ_BASE')-Js(1.0))) + var.put(u'VLQ_CONTINUATION_BIT', var.get(u'VLQ_BASE')) + pass + pass + @Js + def PyJs_base64VLQ_encode_4044_(aValue, this, arguments, var=var): + var = Scope({u'this':this, u'base64VLQ_encode':PyJs_base64VLQ_encode_4044_, u'arguments':arguments, u'aValue':aValue}, var) + var.registers([u'vlq', u'encoded', u'digit', u'aValue']) + var.put(u'encoded', Js(u'')) + pass + var.put(u'vlq', var.get(u'toVLQSigned')(var.get(u'aValue'))) + while 1: + var.put(u'digit', (var.get(u'vlq')&var.get(u'VLQ_BASE_MASK'))) + var.put(u'vlq', var.get(u'VLQ_BASE_SHIFT'), u'>>>') + if (var.get(u'vlq')>Js(0.0)): + var.put(u'digit', var.get(u'VLQ_CONTINUATION_BIT'), u'|') + var.put(u'encoded', var.get(u'base64').callprop(u'encode', var.get(u'digit')), u'+') + if not (var.get(u'vlq')>Js(0.0)): + break + return var.get(u'encoded') + PyJs_base64VLQ_encode_4044_._set_name(u'base64VLQ_encode') + var.get(u'exports').put(u'encode', PyJs_base64VLQ_encode_4044_) + @Js + def PyJs_base64VLQ_decode_4045_(aStr, aIndex, aOutParam, this, arguments, var=var): + var = Scope({u'base64VLQ_decode':PyJs_base64VLQ_decode_4045_, u'this':this, u'arguments':arguments, u'aStr':aStr, u'aOutParam':aOutParam, u'aIndex':aIndex}, var) + var.registers([u'digit', u'shift', u'result', u'continuation', u'aStr', u'aOutParam', u'strLen', u'aIndex']) + var.put(u'strLen', var.get(u'aStr').get(u'length')) + var.put(u'result', Js(0.0)) + var.put(u'shift', Js(0.0)) + pass + while 1: + if (var.get(u'aIndex')>=var.get(u'strLen')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Expected more digits in base 64 VLQ value.'))) + raise PyJsTempException + var.put(u'digit', var.get(u'base64').callprop(u'decode', var.get(u'aStr').callprop(u'charCodeAt', (var.put(u'aIndex',Js(var.get(u'aIndex').to_number())+Js(1))-Js(1))))) + if PyJsStrictEq(var.get(u'digit'),(-Js(1.0))): + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'Invalid base64 digit: ')+var.get(u'aStr').callprop(u'charAt', (var.get(u'aIndex')-Js(1.0)))))) + raise PyJsTempException + var.put(u'continuation', (var.get(u'digit')&var.get(u'VLQ_CONTINUATION_BIT')).neg().neg()) + var.put(u'digit', var.get(u'VLQ_BASE_MASK'), u'&') + var.put(u'result', (var.get(u'result')+(var.get(u'digit')<<var.get(u'shift')))) + var.put(u'shift', var.get(u'VLQ_BASE_SHIFT'), u'+') + if not var.get(u'continuation'): + break + var.get(u'aOutParam').put(u'value', var.get(u'fromVLQSigned')(var.get(u'result'))) + var.get(u'aOutParam').put(u'rest', var.get(u'aIndex')) + PyJs_base64VLQ_decode_4045_._set_name(u'base64VLQ_decode') + var.get(u'exports').put(u'decode', PyJs_base64VLQ_decode_4045_) +PyJs_anonymous_4043_._set_name(u'anonymous') +PyJs_Object_4046_ = Js({u'./base64':Js(511.0)}) +@Js +def PyJs_anonymous_4047_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'intToCharMap', u'exports', u'require', u'module']) + var.put(u'intToCharMap', Js(u'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/').callprop(u'split', Js(u''))) + @Js + def PyJs_anonymous_4048_(number, this, arguments, var=var): + var = Scope({u'this':this, u'number':number, u'arguments':arguments}, var) + var.registers([u'number']) + if ((Js(0.0)<=var.get(u'number')) and (var.get(u'number')<var.get(u'intToCharMap').get(u'length'))): + return var.get(u'intToCharMap').get(var.get(u'number')) + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Must be between 0 and 63: ')+var.get(u'number')))) + raise PyJsTempException + PyJs_anonymous_4048_._set_name(u'anonymous') + var.get(u'exports').put(u'encode', PyJs_anonymous_4048_) + @Js + def PyJs_anonymous_4049_(charCode, this, arguments, var=var): + var = Scope({u'this':this, u'charCode':charCode, u'arguments':arguments}, var) + var.registers([u'bigZ', u'littleOffset', u'charCode', u'numberOffset', u'littleA', u'littleZ', u'zero', u'nine', u'slash', u'plus', u'bigA']) + var.put(u'bigA', Js(65.0)) + var.put(u'bigZ', Js(90.0)) + var.put(u'littleA', Js(97.0)) + var.put(u'littleZ', Js(122.0)) + var.put(u'zero', Js(48.0)) + var.put(u'nine', Js(57.0)) + var.put(u'plus', Js(43.0)) + var.put(u'slash', Js(47.0)) + var.put(u'littleOffset', Js(26.0)) + var.put(u'numberOffset', Js(52.0)) + if ((var.get(u'bigA')<=var.get(u'charCode')) and (var.get(u'charCode')<=var.get(u'bigZ'))): + return (var.get(u'charCode')-var.get(u'bigA')) + if ((var.get(u'littleA')<=var.get(u'charCode')) and (var.get(u'charCode')<=var.get(u'littleZ'))): + return ((var.get(u'charCode')-var.get(u'littleA'))+var.get(u'littleOffset')) + if ((var.get(u'zero')<=var.get(u'charCode')) and (var.get(u'charCode')<=var.get(u'nine'))): + return ((var.get(u'charCode')-var.get(u'zero'))+var.get(u'numberOffset')) + if (var.get(u'charCode')==var.get(u'plus')): + return Js(62.0) + if (var.get(u'charCode')==var.get(u'slash')): + return Js(63.0) + return (-Js(1.0)) + PyJs_anonymous_4049_._set_name(u'anonymous') + var.get(u'exports').put(u'decode', PyJs_anonymous_4049_) +PyJs_anonymous_4047_._set_name(u'anonymous') +PyJs_Object_4050_ = Js({}) +@Js +def PyJs_anonymous_4051_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'recursiveSearch']) + @Js + def PyJsHoisted_recursiveSearch_(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias, this, arguments, var=var): + var = Scope({u'aNeedle':aNeedle, u'this':this, u'aBias':aBias, u'aCompare':aCompare, u'aHigh':aHigh, u'aLow':aLow, u'aHaystack':aHaystack, u'arguments':arguments}, var) + var.registers([u'aNeedle', u'aBias', u'mid', u'aCompare', u'aHigh', u'aLow', u'aHaystack', u'cmp']) + var.put(u'mid', (var.get(u'Math').callprop(u'floor', ((var.get(u'aHigh')-var.get(u'aLow'))/Js(2.0)))+var.get(u'aLow'))) + var.put(u'cmp', var.get(u'aCompare')(var.get(u'aNeedle'), var.get(u'aHaystack').get(var.get(u'mid')), var.get(u'true'))) + if PyJsStrictEq(var.get(u'cmp'),Js(0.0)): + return var.get(u'mid') + else: + if (var.get(u'cmp')>Js(0.0)): + if ((var.get(u'aHigh')-var.get(u'mid'))>Js(1.0)): + return var.get(u'recursiveSearch')(var.get(u'mid'), var.get(u'aHigh'), var.get(u'aNeedle'), var.get(u'aHaystack'), var.get(u'aCompare'), var.get(u'aBias')) + if (var.get(u'aBias')==var.get(u'exports').get(u'LEAST_UPPER_BOUND')): + return (var.get(u'aHigh') if (var.get(u'aHigh')<var.get(u'aHaystack').get(u'length')) else (-Js(1.0))) + else: + return var.get(u'mid') + else: + if ((var.get(u'mid')-var.get(u'aLow'))>Js(1.0)): + return var.get(u'recursiveSearch')(var.get(u'aLow'), var.get(u'mid'), var.get(u'aNeedle'), var.get(u'aHaystack'), var.get(u'aCompare'), var.get(u'aBias')) + if (var.get(u'aBias')==var.get(u'exports').get(u'LEAST_UPPER_BOUND')): + return var.get(u'mid') + else: + return ((-Js(1.0)) if (var.get(u'aLow')<Js(0.0)) else var.get(u'aLow')) + PyJsHoisted_recursiveSearch_.func_name = u'recursiveSearch' + var.put(u'recursiveSearch', PyJsHoisted_recursiveSearch_) + var.get(u'exports').put(u'GREATEST_LOWER_BOUND', Js(1.0)) + var.get(u'exports').put(u'LEAST_UPPER_BOUND', Js(2.0)) + pass + @Js + def PyJs_search_4052_(aNeedle, aHaystack, aCompare, aBias, this, arguments, var=var): + var = Scope({u'search':PyJs_search_4052_, u'aNeedle':aNeedle, u'arguments':arguments, u'aHaystack':aHaystack, u'this':this, u'aBias':aBias, u'aCompare':aCompare}, var) + var.registers([u'aBias', u'index', u'aNeedle', u'aCompare', u'aHaystack']) + if PyJsStrictEq(var.get(u'aHaystack').get(u'length'),Js(0.0)): + return (-Js(1.0)) + var.put(u'index', var.get(u'recursiveSearch')((-Js(1.0)), var.get(u'aHaystack').get(u'length'), var.get(u'aNeedle'), var.get(u'aHaystack'), var.get(u'aCompare'), (var.get(u'aBias') or var.get(u'exports').get(u'GREATEST_LOWER_BOUND')))) + if (var.get(u'index')<Js(0.0)): + return (-Js(1.0)) + while ((var.get(u'index')-Js(1.0))>=Js(0.0)): + if PyJsStrictNeq(var.get(u'aCompare')(var.get(u'aHaystack').get(var.get(u'index')), var.get(u'aHaystack').get((var.get(u'index')-Js(1.0))), var.get(u'true')),Js(0.0)): + break + var.put(u'index',Js(var.get(u'index').to_number())-Js(1)) + return var.get(u'index') + PyJs_search_4052_._set_name(u'search') + var.get(u'exports').put(u'search', PyJs_search_4052_) +PyJs_anonymous_4051_._set_name(u'anonymous') +PyJs_Object_4053_ = Js({}) +@Js +def PyJs_anonymous_4054_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'generatedPositionAfter', u'require', u'exports', u'module', u'util', u'MappingList']) + @Js + def PyJsHoisted_generatedPositionAfter_(mappingA, mappingB, this, arguments, var=var): + var = Scope({u'this':this, u'mappingB':mappingB, u'arguments':arguments, u'mappingA':mappingA}, var) + var.registers([u'columnA', u'columnB', u'mappingB', u'mappingA', u'lineB', u'lineA']) + var.put(u'lineA', var.get(u'mappingA').get(u'generatedLine')) + var.put(u'lineB', var.get(u'mappingB').get(u'generatedLine')) + var.put(u'columnA', var.get(u'mappingA').get(u'generatedColumn')) + var.put(u'columnB', var.get(u'mappingB').get(u'generatedColumn')) + return (((var.get(u'lineB')>var.get(u'lineA')) or ((var.get(u'lineB')==var.get(u'lineA')) and (var.get(u'columnB')>=var.get(u'columnA')))) or (var.get(u'util').callprop(u'compareByGeneratedPositionsInflated', var.get(u'mappingA'), var.get(u'mappingB'))<=Js(0.0))) + PyJsHoisted_generatedPositionAfter_.func_name = u'generatedPositionAfter' + var.put(u'generatedPositionAfter', PyJsHoisted_generatedPositionAfter_) + @Js + def PyJsHoisted_MappingList_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'_array', Js([])) + var.get(u"this").put(u'_sorted', var.get(u'true')) + PyJs_Object_4055_ = Js({u'generatedLine':(-Js(1.0)),u'generatedColumn':Js(0.0)}) + var.get(u"this").put(u'_last', PyJs_Object_4055_) + PyJsHoisted_MappingList_.func_name = u'MappingList' + var.put(u'MappingList', PyJsHoisted_MappingList_) + var.put(u'util', var.get(u'require')(Js(u'./util'))) + pass + pass + @Js + def PyJs_MappingList_forEach_4056_(aCallback, aThisArg, this, arguments, var=var): + var = Scope({u'this':this, u'aThisArg':aThisArg, u'aCallback':aCallback, u'MappingList_forEach':PyJs_MappingList_forEach_4056_, u'arguments':arguments}, var) + var.registers([u'aThisArg', u'aCallback']) + var.get(u"this").get(u'_array').callprop(u'forEach', var.get(u'aCallback'), var.get(u'aThisArg')) + PyJs_MappingList_forEach_4056_._set_name(u'MappingList_forEach') + var.get(u'MappingList').get(u'prototype').put(u'unsortedForEach', PyJs_MappingList_forEach_4056_) + @Js + def PyJs_MappingList_add_4057_(aMapping, this, arguments, var=var): + var = Scope({u'this':this, u'MappingList_add':PyJs_MappingList_add_4057_, u'aMapping':aMapping, u'arguments':arguments}, var) + var.registers([u'aMapping']) + if var.get(u'generatedPositionAfter')(var.get(u"this").get(u'_last'), var.get(u'aMapping')): + var.get(u"this").put(u'_last', var.get(u'aMapping')) + var.get(u"this").get(u'_array').callprop(u'push', var.get(u'aMapping')) + else: + var.get(u"this").put(u'_sorted', Js(False)) + var.get(u"this").get(u'_array').callprop(u'push', var.get(u'aMapping')) + PyJs_MappingList_add_4057_._set_name(u'MappingList_add') + var.get(u'MappingList').get(u'prototype').put(u'add', PyJs_MappingList_add_4057_) + @Js + def PyJs_MappingList_toArray_4058_(this, arguments, var=var): + var = Scope({u'this':this, u'MappingList_toArray':PyJs_MappingList_toArray_4058_, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'_sorted').neg(): + var.get(u"this").get(u'_array').callprop(u'sort', var.get(u'util').get(u'compareByGeneratedPositionsInflated')) + var.get(u"this").put(u'_sorted', var.get(u'true')) + return var.get(u"this").get(u'_array') + PyJs_MappingList_toArray_4058_._set_name(u'MappingList_toArray') + var.get(u'MappingList').get(u'prototype').put(u'toArray', PyJs_MappingList_toArray_4058_) + var.get(u'exports').put(u'MappingList', var.get(u'MappingList')) +PyJs_anonymous_4054_._set_name(u'anonymous') +PyJs_Object_4059_ = Js({u'./util':Js(518.0)}) +@Js +def PyJs_anonymous_4060_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'randomIntInRange', u'require', u'module', u'doQuickSort', u'swap']) + @Js + def PyJsHoisted_randomIntInRange_(low, high, this, arguments, var=var): + var = Scope({u'high':high, u'this':this, u'low':low, u'arguments':arguments}, var) + var.registers([u'high', u'low']) + return var.get(u'Math').callprop(u'round', (var.get(u'low')+(var.get(u'Math').callprop(u'random')*(var.get(u'high')-var.get(u'low'))))) + PyJsHoisted_randomIntInRange_.func_name = u'randomIntInRange' + var.put(u'randomIntInRange', PyJsHoisted_randomIntInRange_) + @Js + def PyJsHoisted_swap_(ary, x, y, this, arguments, var=var): + var = Scope({u'y':y, u'ary':ary, u'this':this, u'arguments':arguments, u'x':x}, var) + var.registers([u'y', u'ary', u'temp', u'x']) + var.put(u'temp', var.get(u'ary').get(var.get(u'x'))) + var.get(u'ary').put(var.get(u'x'), var.get(u'ary').get(var.get(u'y'))) + var.get(u'ary').put(var.get(u'y'), var.get(u'temp')) + PyJsHoisted_swap_.func_name = u'swap' + var.put(u'swap', PyJsHoisted_swap_) + @Js + def PyJsHoisted_doQuickSort_(ary, comparator, p, r, this, arguments, var=var): + var = Scope({u'p':p, u'r':r, u'arguments':arguments, u'comparator':comparator, u'this':this, u'ary':ary}, var) + var.registers([u'comparator', u'i', u'ary', u'pivotIndex', u'j', u'q', u'p', u'r', u'pivot']) + if (var.get(u'p')<var.get(u'r')): + var.put(u'pivotIndex', var.get(u'randomIntInRange')(var.get(u'p'), var.get(u'r'))) + var.put(u'i', (var.get(u'p')-Js(1.0))) + var.get(u'swap')(var.get(u'ary'), var.get(u'pivotIndex'), var.get(u'r')) + var.put(u'pivot', var.get(u'ary').get(var.get(u'r'))) + #for JS loop + var.put(u'j', var.get(u'p')) + while (var.get(u'j')<var.get(u'r')): + try: + if (var.get(u'comparator')(var.get(u'ary').get(var.get(u'j')), var.get(u'pivot'))<=Js(0.0)): + var.put(u'i', Js(1.0), u'+') + var.get(u'swap')(var.get(u'ary'), var.get(u'i'), var.get(u'j')) + finally: + (var.put(u'j',Js(var.get(u'j').to_number())+Js(1))-Js(1)) + var.get(u'swap')(var.get(u'ary'), (var.get(u'i')+Js(1.0)), var.get(u'j')) + var.put(u'q', (var.get(u'i')+Js(1.0))) + var.get(u'doQuickSort')(var.get(u'ary'), var.get(u'comparator'), var.get(u'p'), (var.get(u'q')-Js(1.0))) + var.get(u'doQuickSort')(var.get(u'ary'), var.get(u'comparator'), (var.get(u'q')+Js(1.0)), var.get(u'r')) + PyJsHoisted_doQuickSort_.func_name = u'doQuickSort' + var.put(u'doQuickSort', PyJsHoisted_doQuickSort_) + pass + pass + pass + @Js + def PyJs_anonymous_4061_(ary, comparator, this, arguments, var=var): + var = Scope({u'this':this, u'ary':ary, u'arguments':arguments, u'comparator':comparator}, var) + var.registers([u'ary', u'comparator']) + var.get(u'doQuickSort')(var.get(u'ary'), var.get(u'comparator'), Js(0.0), (var.get(u'ary').get(u'length')-Js(1.0))) + PyJs_anonymous_4061_._set_name(u'anonymous') + var.get(u'exports').put(u'quickSort', PyJs_anonymous_4061_) +PyJs_anonymous_4060_._set_name(u'anonymous') +PyJs_Object_4062_ = Js({}) +@Js +def PyJs_anonymous_4063_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'base64VLQ', u'IndexedSourceMapConsumer', u'quickSort', u'Mapping', u'SourceMapConsumer', u'binarySearch', u'util', u'ArraySet', u'module', u'require', u'BasicSourceMapConsumer']) + @Js + def PyJsHoisted_IndexedSourceMapConsumer_(aSourceMap, this, arguments, var=var): + var = Scope({u'this':this, u'aSourceMap':aSourceMap, u'arguments':arguments}, var) + var.registers([u'sourceMap', u'version', u'sections', u'aSourceMap', u'lastOffset']) + var.put(u'sourceMap', var.get(u'aSourceMap')) + if PyJsStrictEq(var.get(u'aSourceMap',throw=False).typeof(),Js(u'string')): + var.put(u'sourceMap', var.get(u'JSON').callprop(u'parse', var.get(u'aSourceMap').callprop(u'replace', JsRegExp(u"/^\\)\\]\\}'/"), Js(u'')))) + var.put(u'version', var.get(u'util').callprop(u'getArg', var.get(u'sourceMap'), Js(u'version'))) + var.put(u'sections', var.get(u'util').callprop(u'getArg', var.get(u'sourceMap'), Js(u'sections'))) + if (var.get(u'version')!=var.get(u"this").get(u'_version')): + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'Unsupported version: ')+var.get(u'version')))) + raise PyJsTempException + var.get(u"this").put(u'_sources', var.get(u'ArraySet').create()) + var.get(u"this").put(u'_names', var.get(u'ArraySet').create()) + PyJs_Object_4100_ = Js({u'line':(-Js(1.0)),u'column':Js(0.0)}) + var.put(u'lastOffset', PyJs_Object_4100_) + @Js + def PyJs_anonymous_4101_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u'offsetLine', u's', u'offsetColumn', u'offset']) + if var.get(u's').get(u'url'): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Support for url field in sections not implemented.'))) + raise PyJsTempException + var.put(u'offset', var.get(u'util').callprop(u'getArg', var.get(u's'), Js(u'offset'))) + var.put(u'offsetLine', var.get(u'util').callprop(u'getArg', var.get(u'offset'), Js(u'line'))) + var.put(u'offsetColumn', var.get(u'util').callprop(u'getArg', var.get(u'offset'), Js(u'column'))) + if ((var.get(u'offsetLine')<var.get(u'lastOffset').get(u'line')) or (PyJsStrictEq(var.get(u'offsetLine'),var.get(u'lastOffset').get(u'line')) and (var.get(u'offsetColumn')<var.get(u'lastOffset').get(u'column')))): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Section offsets must be ordered and non-overlapping.'))) + raise PyJsTempException + var.put(u'lastOffset', var.get(u'offset')) + PyJs_Object_4103_ = Js({u'generatedLine':(var.get(u'offsetLine')+Js(1.0)),u'generatedColumn':(var.get(u'offsetColumn')+Js(1.0))}) + PyJs_Object_4102_ = Js({u'generatedOffset':PyJs_Object_4103_,u'consumer':var.get(u'SourceMapConsumer').create(var.get(u'util').callprop(u'getArg', var.get(u's'), Js(u'map')))}) + return PyJs_Object_4102_ + PyJs_anonymous_4101_._set_name(u'anonymous') + var.get(u"this").put(u'_sections', var.get(u'sections').callprop(u'map', PyJs_anonymous_4101_)) + PyJsHoisted_IndexedSourceMapConsumer_.func_name = u'IndexedSourceMapConsumer' + var.put(u'IndexedSourceMapConsumer', PyJsHoisted_IndexedSourceMapConsumer_) + @Js + def PyJsHoisted_Mapping_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'generatedLine', Js(0.0)) + var.get(u"this").put(u'generatedColumn', Js(0.0)) + var.get(u"this").put(u'source', var.get(u"null")) + var.get(u"this").put(u'originalLine', var.get(u"null")) + var.get(u"this").put(u'originalColumn', var.get(u"null")) + var.get(u"this").put(u'name', var.get(u"null")) + PyJsHoisted_Mapping_.func_name = u'Mapping' + var.put(u'Mapping', PyJsHoisted_Mapping_) + @Js + def PyJsHoisted_SourceMapConsumer_(aSourceMap, this, arguments, var=var): + var = Scope({u'this':this, u'aSourceMap':aSourceMap, u'arguments':arguments}, var) + var.registers([u'sourceMap', u'aSourceMap']) + var.put(u'sourceMap', var.get(u'aSourceMap')) + if PyJsStrictEq(var.get(u'aSourceMap',throw=False).typeof(),Js(u'string')): + var.put(u'sourceMap', var.get(u'JSON').callprop(u'parse', var.get(u'aSourceMap').callprop(u'replace', JsRegExp(u"/^\\)\\]\\}'/"), Js(u'')))) + return (var.get(u'IndexedSourceMapConsumer').create(var.get(u'sourceMap')) if (var.get(u'sourceMap').get(u'sections')!=var.get(u"null")) else var.get(u'BasicSourceMapConsumer').create(var.get(u'sourceMap'))) + PyJsHoisted_SourceMapConsumer_.func_name = u'SourceMapConsumer' + var.put(u'SourceMapConsumer', PyJsHoisted_SourceMapConsumer_) + @Js + def PyJsHoisted_BasicSourceMapConsumer_(aSourceMap, this, arguments, var=var): + var = Scope({u'this':this, u'aSourceMap':aSourceMap, u'arguments':arguments}, var) + var.registers([u'mappings', u'sourcesContent', u'aSourceMap', u'sourceRoot', u'sources', u'sourceMap', u'version', u'names', u'file']) + var.put(u'sourceMap', var.get(u'aSourceMap')) + if PyJsStrictEq(var.get(u'aSourceMap',throw=False).typeof(),Js(u'string')): + var.put(u'sourceMap', var.get(u'JSON').callprop(u'parse', var.get(u'aSourceMap').callprop(u'replace', JsRegExp(u"/^\\)\\]\\}'/"), Js(u'')))) + var.put(u'version', var.get(u'util').callprop(u'getArg', var.get(u'sourceMap'), Js(u'version'))) + var.put(u'sources', var.get(u'util').callprop(u'getArg', var.get(u'sourceMap'), Js(u'sources'))) + var.put(u'names', var.get(u'util').callprop(u'getArg', var.get(u'sourceMap'), Js(u'names'), Js([]))) + var.put(u'sourceRoot', var.get(u'util').callprop(u'getArg', var.get(u'sourceMap'), Js(u'sourceRoot'), var.get(u"null"))) + var.put(u'sourcesContent', var.get(u'util').callprop(u'getArg', var.get(u'sourceMap'), Js(u'sourcesContent'), var.get(u"null"))) + var.put(u'mappings', var.get(u'util').callprop(u'getArg', var.get(u'sourceMap'), Js(u'mappings'))) + var.put(u'file', var.get(u'util').callprop(u'getArg', var.get(u'sourceMap'), Js(u'file'), var.get(u"null"))) + if (var.get(u'version')!=var.get(u"this").get(u'_version')): + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'Unsupported version: ')+var.get(u'version')))) + raise PyJsTempException + @Js + def PyJs_anonymous_4078_(source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'arguments':arguments}, var) + var.registers([u'source']) + return (var.get(u'util').callprop(u'relative', var.get(u'sourceRoot'), var.get(u'source')) if ((var.get(u'sourceRoot') and var.get(u'util').callprop(u'isAbsolute', var.get(u'sourceRoot'))) and var.get(u'util').callprop(u'isAbsolute', var.get(u'source'))) else var.get(u'source')) + PyJs_anonymous_4078_._set_name(u'anonymous') + var.put(u'sources', var.get(u'sources').callprop(u'map', var.get(u'String')).callprop(u'map', var.get(u'util').get(u'normalize')).callprop(u'map', PyJs_anonymous_4078_)) + var.get(u"this").put(u'_names', var.get(u'ArraySet').callprop(u'fromArray', var.get(u'names').callprop(u'map', var.get(u'String')), var.get(u'true'))) + var.get(u"this").put(u'_sources', var.get(u'ArraySet').callprop(u'fromArray', var.get(u'sources'), var.get(u'true'))) + var.get(u"this").put(u'sourceRoot', var.get(u'sourceRoot')) + var.get(u"this").put(u'sourcesContent', var.get(u'sourcesContent')) + var.get(u"this").put(u'_mappings', var.get(u'mappings')) + var.get(u"this").put(u'file', var.get(u'file')) + PyJsHoisted_BasicSourceMapConsumer_.func_name = u'BasicSourceMapConsumer' + var.put(u'BasicSourceMapConsumer', PyJsHoisted_BasicSourceMapConsumer_) + var.put(u'util', var.get(u'require')(Js(u'./util'))) + var.put(u'binarySearch', var.get(u'require')(Js(u'./binary-search'))) + var.put(u'ArraySet', var.get(u'require')(Js(u'./array-set')).get(u'ArraySet')) + var.put(u'base64VLQ', var.get(u'require')(Js(u'./base64-vlq'))) + var.put(u'quickSort', var.get(u'require')(Js(u'./quick-sort')).get(u'quickSort')) + pass + @Js + def PyJs_anonymous_4064_(aSourceMap, this, arguments, var=var): + var = Scope({u'this':this, u'aSourceMap':aSourceMap, u'arguments':arguments}, var) + var.registers([u'aSourceMap']) + return var.get(u'BasicSourceMapConsumer').callprop(u'fromSourceMap', var.get(u'aSourceMap')) + PyJs_anonymous_4064_._set_name(u'anonymous') + var.get(u'SourceMapConsumer').put(u'fromSourceMap', PyJs_anonymous_4064_) + var.get(u'SourceMapConsumer').get(u'prototype').put(u'_version', Js(3.0)) + var.get(u'SourceMapConsumer').get(u'prototype').put(u'__generatedMappings', var.get(u"null")) + @Js + def PyJs_anonymous_4066_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'__generatedMappings').neg(): + var.get(u"this").callprop(u'_parseMappings', var.get(u"this").get(u'_mappings'), var.get(u"this").get(u'sourceRoot')) + return var.get(u"this").get(u'__generatedMappings') + PyJs_anonymous_4066_._set_name(u'anonymous') + PyJs_Object_4065_ = Js({u'get':PyJs_anonymous_4066_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'SourceMapConsumer').get(u'prototype'), Js(u'_generatedMappings'), PyJs_Object_4065_) + var.get(u'SourceMapConsumer').get(u'prototype').put(u'__originalMappings', var.get(u"null")) + @Js + def PyJs_anonymous_4068_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'__originalMappings').neg(): + var.get(u"this").callprop(u'_parseMappings', var.get(u"this").get(u'_mappings'), var.get(u"this").get(u'sourceRoot')) + return var.get(u"this").get(u'__originalMappings') + PyJs_anonymous_4068_._set_name(u'anonymous') + PyJs_Object_4067_ = Js({u'get':PyJs_anonymous_4068_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'SourceMapConsumer').get(u'prototype'), Js(u'_originalMappings'), PyJs_Object_4067_) + @Js + def PyJs_SourceMapConsumer_charIsMappingSeparator_4069_(aStr, index, this, arguments, var=var): + var = Scope({u'this':this, u'index':index, u'aStr':aStr, u'arguments':arguments, u'SourceMapConsumer_charIsMappingSeparator':PyJs_SourceMapConsumer_charIsMappingSeparator_4069_}, var) + var.registers([u'index', u'c', u'aStr']) + var.put(u'c', var.get(u'aStr').callprop(u'charAt', var.get(u'index'))) + return (PyJsStrictEq(var.get(u'c'),Js(u';')) or PyJsStrictEq(var.get(u'c'),Js(u','))) + PyJs_SourceMapConsumer_charIsMappingSeparator_4069_._set_name(u'SourceMapConsumer_charIsMappingSeparator') + var.get(u'SourceMapConsumer').get(u'prototype').put(u'_charIsMappingSeparator', PyJs_SourceMapConsumer_charIsMappingSeparator_4069_) + @Js + def PyJs_SourceMapConsumer_parseMappings_4070_(aStr, aSourceRoot, this, arguments, var=var): + var = Scope({u'this':this, u'SourceMapConsumer_parseMappings':PyJs_SourceMapConsumer_parseMappings_4070_, u'aStr':aStr, u'aSourceRoot':aSourceRoot, u'arguments':arguments}, var) + var.registers([u'aStr', u'aSourceRoot']) + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Subclasses must implement _parseMappings'))) + raise PyJsTempException + PyJs_SourceMapConsumer_parseMappings_4070_._set_name(u'SourceMapConsumer_parseMappings') + var.get(u'SourceMapConsumer').get(u'prototype').put(u'_parseMappings', PyJs_SourceMapConsumer_parseMappings_4070_) + var.get(u'SourceMapConsumer').put(u'GENERATED_ORDER', Js(1.0)) + var.get(u'SourceMapConsumer').put(u'ORIGINAL_ORDER', Js(2.0)) + var.get(u'SourceMapConsumer').put(u'GREATEST_LOWER_BOUND', Js(1.0)) + var.get(u'SourceMapConsumer').put(u'LEAST_UPPER_BOUND', Js(2.0)) + @Js + def PyJs_SourceMapConsumer_eachMapping_4071_(aCallback, aContext, aOrder, this, arguments, var=var): + var = Scope({u'this':this, u'aCallback':aCallback, u'aOrder':aOrder, u'arguments':arguments, u'aContext':aContext, u'SourceMapConsumer_eachMapping':PyJs_SourceMapConsumer_eachMapping_4071_}, var) + var.registers([u'context', u'aCallback', u'sourceRoot', u'aOrder', u'aContext', u'order', u'mappings']) + var.put(u'context', (var.get(u'aContext') or var.get(u"null"))) + var.put(u'order', (var.get(u'aOrder') or var.get(u'SourceMapConsumer').get(u'GENERATED_ORDER'))) + pass + while 1: + SWITCHED = False + CONDITION = (var.get(u'order')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'SourceMapConsumer').get(u'GENERATED_ORDER')): + SWITCHED = True + var.put(u'mappings', var.get(u"this").get(u'_generatedMappings')) + break + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'SourceMapConsumer').get(u'ORIGINAL_ORDER')): + SWITCHED = True + var.put(u'mappings', var.get(u"this").get(u'_originalMappings')) + break + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Unknown order of iteration.'))) + raise PyJsTempException + SWITCHED = True + break + var.put(u'sourceRoot', var.get(u"this").get(u'sourceRoot')) + @Js + def PyJs_anonymous_4072_(mapping, this, arguments, var=var): + var = Scope({u'this':this, u'mapping':mapping, u'arguments':arguments}, var) + var.registers([u'source', u'mapping']) + var.put(u'source', (var.get(u"null") if PyJsStrictEq(var.get(u'mapping').get(u'source'),var.get(u"null")) else var.get(u"this").get(u'_sources').callprop(u'at', var.get(u'mapping').get(u'source')))) + if ((var.get(u'source')!=var.get(u"null")) and (var.get(u'sourceRoot')!=var.get(u"null"))): + var.put(u'source', var.get(u'util').callprop(u'join', var.get(u'sourceRoot'), var.get(u'source'))) + PyJs_Object_4073_ = Js({u'source':var.get(u'source'),u'generatedLine':var.get(u'mapping').get(u'generatedLine'),u'generatedColumn':var.get(u'mapping').get(u'generatedColumn'),u'originalLine':var.get(u'mapping').get(u'originalLine'),u'originalColumn':var.get(u'mapping').get(u'originalColumn'),u'name':(var.get(u"null") if PyJsStrictEq(var.get(u'mapping').get(u'name'),var.get(u"null")) else var.get(u"this").get(u'_names').callprop(u'at', var.get(u'mapping').get(u'name')))}) + return PyJs_Object_4073_ + PyJs_anonymous_4072_._set_name(u'anonymous') + var.get(u'mappings').callprop(u'map', PyJs_anonymous_4072_, var.get(u"this")).callprop(u'forEach', var.get(u'aCallback'), var.get(u'context')) + PyJs_SourceMapConsumer_eachMapping_4071_._set_name(u'SourceMapConsumer_eachMapping') + var.get(u'SourceMapConsumer').get(u'prototype').put(u'eachMapping', PyJs_SourceMapConsumer_eachMapping_4071_) + @Js + def PyJs_SourceMapConsumer_allGeneratedPositionsFor_4074_(aArgs, this, arguments, var=var): + var = Scope({u'this':this, u'SourceMapConsumer_allGeneratedPositionsFor':PyJs_SourceMapConsumer_allGeneratedPositionsFor_4074_, u'arguments':arguments, u'aArgs':aArgs}, var) + var.registers([u'index', u'mappings', u'originalColumn', u'needle', u'mapping', u'originalLine', u'aArgs', u'line']) + var.put(u'line', var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'line'))) + PyJs_Object_4075_ = Js({u'source':var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'source')),u'originalLine':var.get(u'line'),u'originalColumn':var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'column'), Js(0.0))}) + var.put(u'needle', PyJs_Object_4075_) + if (var.get(u"this").get(u'sourceRoot')!=var.get(u"null")): + var.get(u'needle').put(u'source', var.get(u'util').callprop(u'relative', var.get(u"this").get(u'sourceRoot'), var.get(u'needle').get(u'source'))) + if var.get(u"this").get(u'_sources').callprop(u'has', var.get(u'needle').get(u'source')).neg(): + return Js([]) + var.get(u'needle').put(u'source', var.get(u"this").get(u'_sources').callprop(u'indexOf', var.get(u'needle').get(u'source'))) + var.put(u'mappings', Js([])) + var.put(u'index', var.get(u"this").callprop(u'_findMapping', var.get(u'needle'), var.get(u"this").get(u'_originalMappings'), Js(u'originalLine'), Js(u'originalColumn'), var.get(u'util').get(u'compareByOriginalPositions'), var.get(u'binarySearch').get(u'LEAST_UPPER_BOUND'))) + if (var.get(u'index')>=Js(0.0)): + var.put(u'mapping', var.get(u"this").get(u'_originalMappings').get(var.get(u'index'))) + if PyJsStrictEq(var.get(u'aArgs').get(u'column'),var.get(u'undefined')): + var.put(u'originalLine', var.get(u'mapping').get(u'originalLine')) + while (var.get(u'mapping') and PyJsStrictEq(var.get(u'mapping').get(u'originalLine'),var.get(u'originalLine'))): + PyJs_Object_4076_ = Js({u'line':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'generatedLine'), var.get(u"null")),u'column':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'generatedColumn'), var.get(u"null")),u'lastColumn':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'lastGeneratedColumn'), var.get(u"null"))}) + var.get(u'mappings').callprop(u'push', PyJs_Object_4076_) + var.put(u'mapping', var.get(u"this").get(u'_originalMappings').get(var.put(u'index',Js(var.get(u'index').to_number())+Js(1)))) + else: + var.put(u'originalColumn', var.get(u'mapping').get(u'originalColumn')) + while ((var.get(u'mapping') and PyJsStrictEq(var.get(u'mapping').get(u'originalLine'),var.get(u'line'))) and (var.get(u'mapping').get(u'originalColumn')==var.get(u'originalColumn'))): + PyJs_Object_4077_ = Js({u'line':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'generatedLine'), var.get(u"null")),u'column':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'generatedColumn'), var.get(u"null")),u'lastColumn':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'lastGeneratedColumn'), var.get(u"null"))}) + var.get(u'mappings').callprop(u'push', PyJs_Object_4077_) + var.put(u'mapping', var.get(u"this").get(u'_originalMappings').get(var.put(u'index',Js(var.get(u'index').to_number())+Js(1)))) + return var.get(u'mappings') + PyJs_SourceMapConsumer_allGeneratedPositionsFor_4074_._set_name(u'SourceMapConsumer_allGeneratedPositionsFor') + var.get(u'SourceMapConsumer').get(u'prototype').put(u'allGeneratedPositionsFor', PyJs_SourceMapConsumer_allGeneratedPositionsFor_4074_) + var.get(u'exports').put(u'SourceMapConsumer', var.get(u'SourceMapConsumer')) + pass + var.get(u'BasicSourceMapConsumer').put(u'prototype', var.get(u'Object').callprop(u'create', var.get(u'SourceMapConsumer').get(u'prototype'))) + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'consumer', var.get(u'SourceMapConsumer')) + @Js + def PyJs_SourceMapConsumer_fromSourceMap_4079_(aSourceMap, this, arguments, var=var): + var = Scope({u'this':this, u'aSourceMap':aSourceMap, u'SourceMapConsumer_fromSourceMap':PyJs_SourceMapConsumer_fromSourceMap_4079_, u'arguments':arguments}, var) + var.registers([u'i', u'aSourceMap', u'srcMapping', u'destGeneratedMappings', u'destMapping', u'destOriginalMappings', u'sources', u'length', u'generatedMappings', u'names', u'smc']) + var.put(u'smc', var.get(u'Object').callprop(u'create', var.get(u'BasicSourceMapConsumer').get(u'prototype'))) + var.put(u'names', var.get(u'smc').put(u'_names', var.get(u'ArraySet').callprop(u'fromArray', var.get(u'aSourceMap').get(u'_names').callprop(u'toArray'), var.get(u'true')))) + var.put(u'sources', var.get(u'smc').put(u'_sources', var.get(u'ArraySet').callprop(u'fromArray', var.get(u'aSourceMap').get(u'_sources').callprop(u'toArray'), var.get(u'true')))) + var.get(u'smc').put(u'sourceRoot', var.get(u'aSourceMap').get(u'_sourceRoot')) + var.get(u'smc').put(u'sourcesContent', var.get(u'aSourceMap').callprop(u'_generateSourcesContent', var.get(u'smc').get(u'_sources').callprop(u'toArray'), var.get(u'smc').get(u'sourceRoot'))) + var.get(u'smc').put(u'file', var.get(u'aSourceMap').get(u'_file')) + var.put(u'generatedMappings', var.get(u'aSourceMap').get(u'_mappings').callprop(u'toArray').callprop(u'slice')) + var.put(u'destGeneratedMappings', var.get(u'smc').put(u'__generatedMappings', Js([]))) + var.put(u'destOriginalMappings', var.get(u'smc').put(u'__originalMappings', Js([]))) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'length', var.get(u'generatedMappings').get(u'length')) + while (var.get(u'i')<var.get(u'length')): + try: + var.put(u'srcMapping', var.get(u'generatedMappings').get(var.get(u'i'))) + var.put(u'destMapping', var.get(u'Mapping').create()) + var.get(u'destMapping').put(u'generatedLine', var.get(u'srcMapping').get(u'generatedLine')) + var.get(u'destMapping').put(u'generatedColumn', var.get(u'srcMapping').get(u'generatedColumn')) + if var.get(u'srcMapping').get(u'source'): + var.get(u'destMapping').put(u'source', var.get(u'sources').callprop(u'indexOf', var.get(u'srcMapping').get(u'source'))) + var.get(u'destMapping').put(u'originalLine', var.get(u'srcMapping').get(u'originalLine')) + var.get(u'destMapping').put(u'originalColumn', var.get(u'srcMapping').get(u'originalColumn')) + if var.get(u'srcMapping').get(u'name'): + var.get(u'destMapping').put(u'name', var.get(u'names').callprop(u'indexOf', var.get(u'srcMapping').get(u'name'))) + var.get(u'destOriginalMappings').callprop(u'push', var.get(u'destMapping')) + var.get(u'destGeneratedMappings').callprop(u'push', var.get(u'destMapping')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.get(u'quickSort')(var.get(u'smc').get(u'__originalMappings'), var.get(u'util').get(u'compareByOriginalPositions')) + return var.get(u'smc') + PyJs_SourceMapConsumer_fromSourceMap_4079_._set_name(u'SourceMapConsumer_fromSourceMap') + var.get(u'BasicSourceMapConsumer').put(u'fromSourceMap', PyJs_SourceMapConsumer_fromSourceMap_4079_) + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'_version', Js(3.0)) + @Js + def PyJs_anonymous_4081_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_anonymous_4082_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u's']) + return (var.get(u'util').callprop(u'join', var.get(u"this").get(u'sourceRoot'), var.get(u's')) if (var.get(u"this").get(u'sourceRoot')!=var.get(u"null")) else var.get(u's')) + PyJs_anonymous_4082_._set_name(u'anonymous') + return var.get(u"this").get(u'_sources').callprop(u'toArray').callprop(u'map', PyJs_anonymous_4082_, var.get(u"this")) + PyJs_anonymous_4081_._set_name(u'anonymous') + PyJs_Object_4080_ = Js({u'get':PyJs_anonymous_4081_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'BasicSourceMapConsumer').get(u'prototype'), Js(u'sources'), PyJs_Object_4080_) + pass + @Js + def PyJs_SourceMapConsumer_parseMappings_4083_(aStr, aSourceRoot, this, arguments, var=var): + var = Scope({u'this':this, u'SourceMapConsumer_parseMappings':PyJs_SourceMapConsumer_parseMappings_4083_, u'aStr':aStr, u'aSourceRoot':aSourceRoot, u'arguments':arguments}, var) + var.registers([u'originalMappings', u'index', u'previousOriginalLine', u'previousOriginalColumn', u'previousSource', u'previousGeneratedColumn', u'end', u'mapping', u'previousName', u'aSourceRoot', u'length', u'generatedMappings', u'generatedLine', u'temp', u'str', u'cachedSegments', u'aStr', u'value', u'segment']) + var.put(u'generatedLine', Js(1.0)) + var.put(u'previousGeneratedColumn', Js(0.0)) + var.put(u'previousOriginalLine', Js(0.0)) + var.put(u'previousOriginalColumn', Js(0.0)) + var.put(u'previousSource', Js(0.0)) + var.put(u'previousName', Js(0.0)) + var.put(u'length', var.get(u'aStr').get(u'length')) + var.put(u'index', Js(0.0)) + PyJs_Object_4084_ = Js({}) + var.put(u'cachedSegments', PyJs_Object_4084_) + PyJs_Object_4085_ = Js({}) + var.put(u'temp', PyJs_Object_4085_) + var.put(u'originalMappings', Js([])) + var.put(u'generatedMappings', Js([])) + pass + while (var.get(u'index')<var.get(u'length')): + if PyJsStrictEq(var.get(u'aStr').callprop(u'charAt', var.get(u'index')),Js(u';')): + (var.put(u'generatedLine',Js(var.get(u'generatedLine').to_number())+Js(1))-Js(1)) + (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)) + var.put(u'previousGeneratedColumn', Js(0.0)) + else: + if PyJsStrictEq(var.get(u'aStr').callprop(u'charAt', var.get(u'index')),Js(u',')): + (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)) + else: + var.put(u'mapping', var.get(u'Mapping').create()) + var.get(u'mapping').put(u'generatedLine', var.get(u'generatedLine')) + #for JS loop + var.put(u'end', var.get(u'index')) + while (var.get(u'end')<var.get(u'length')): + try: + if var.get(u"this").callprop(u'_charIsMappingSeparator', var.get(u'aStr'), var.get(u'end')): + break + finally: + (var.put(u'end',Js(var.get(u'end').to_number())+Js(1))-Js(1)) + var.put(u'str', var.get(u'aStr').callprop(u'slice', var.get(u'index'), var.get(u'end'))) + var.put(u'segment', var.get(u'cachedSegments').get(var.get(u'str'))) + if var.get(u'segment'): + var.put(u'index', var.get(u'str').get(u'length'), u'+') + else: + var.put(u'segment', Js([])) + while (var.get(u'index')<var.get(u'end')): + var.get(u'base64VLQ').callprop(u'decode', var.get(u'aStr'), var.get(u'index'), var.get(u'temp')) + var.put(u'value', var.get(u'temp').get(u'value')) + var.put(u'index', var.get(u'temp').get(u'rest')) + var.get(u'segment').callprop(u'push', var.get(u'value')) + if PyJsStrictEq(var.get(u'segment').get(u'length'),Js(2.0)): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Found a source, but no line and column'))) + raise PyJsTempException + if PyJsStrictEq(var.get(u'segment').get(u'length'),Js(3.0)): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Found a source and line, but no column'))) + raise PyJsTempException + var.get(u'cachedSegments').put(var.get(u'str'), var.get(u'segment')) + var.get(u'mapping').put(u'generatedColumn', (var.get(u'previousGeneratedColumn')+var.get(u'segment').get(u'0'))) + var.put(u'previousGeneratedColumn', var.get(u'mapping').get(u'generatedColumn')) + if (var.get(u'segment').get(u'length')>Js(1.0)): + var.get(u'mapping').put(u'source', (var.get(u'previousSource')+var.get(u'segment').get(u'1'))) + var.put(u'previousSource', var.get(u'segment').get(u'1'), u'+') + var.get(u'mapping').put(u'originalLine', (var.get(u'previousOriginalLine')+var.get(u'segment').get(u'2'))) + var.put(u'previousOriginalLine', var.get(u'mapping').get(u'originalLine')) + var.get(u'mapping').put(u'originalLine', Js(1.0), u'+') + var.get(u'mapping').put(u'originalColumn', (var.get(u'previousOriginalColumn')+var.get(u'segment').get(u'3'))) + var.put(u'previousOriginalColumn', var.get(u'mapping').get(u'originalColumn')) + if (var.get(u'segment').get(u'length')>Js(4.0)): + var.get(u'mapping').put(u'name', (var.get(u'previousName')+var.get(u'segment').get(u'4'))) + var.put(u'previousName', var.get(u'segment').get(u'4'), u'+') + var.get(u'generatedMappings').callprop(u'push', var.get(u'mapping')) + if PyJsStrictEq(var.get(u'mapping').get(u'originalLine').typeof(),Js(u'number')): + var.get(u'originalMappings').callprop(u'push', var.get(u'mapping')) + var.get(u'quickSort')(var.get(u'generatedMappings'), var.get(u'util').get(u'compareByGeneratedPositionsDeflated')) + var.get(u"this").put(u'__generatedMappings', var.get(u'generatedMappings')) + var.get(u'quickSort')(var.get(u'originalMappings'), var.get(u'util').get(u'compareByOriginalPositions')) + var.get(u"this").put(u'__originalMappings', var.get(u'originalMappings')) + PyJs_SourceMapConsumer_parseMappings_4083_._set_name(u'SourceMapConsumer_parseMappings') + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'_parseMappings', PyJs_SourceMapConsumer_parseMappings_4083_) + @Js + def PyJs_SourceMapConsumer_findMapping_4086_(aNeedle, aMappings, aLineName, aColumnName, aComparator, aBias, this, arguments, var=var): + var = Scope({u'aNeedle':aNeedle, u'SourceMapConsumer_findMapping':PyJs_SourceMapConsumer_findMapping_4086_, u'this':this, u'aBias':aBias, u'aColumnName':aColumnName, u'aComparator':aComparator, u'arguments':arguments, u'aMappings':aMappings, u'aLineName':aLineName}, var) + var.registers([u'aNeedle', u'aBias', u'aColumnName', u'aComparator', u'aMappings', u'aLineName']) + if (var.get(u'aNeedle').get(var.get(u'aLineName'))<=Js(0.0)): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Line must be greater than or equal to 1, got ')+var.get(u'aNeedle').get(var.get(u'aLineName'))))) + raise PyJsTempException + if (var.get(u'aNeedle').get(var.get(u'aColumnName'))<Js(0.0)): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Column must be greater than or equal to 0, got ')+var.get(u'aNeedle').get(var.get(u'aColumnName'))))) + raise PyJsTempException + return var.get(u'binarySearch').callprop(u'search', var.get(u'aNeedle'), var.get(u'aMappings'), var.get(u'aComparator'), var.get(u'aBias')) + PyJs_SourceMapConsumer_findMapping_4086_._set_name(u'SourceMapConsumer_findMapping') + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'_findMapping', PyJs_SourceMapConsumer_findMapping_4086_) + @Js + def PyJs_SourceMapConsumer_computeColumnSpans_4087_(this, arguments, var=var): + var = Scope({u'this':this, u'SourceMapConsumer_computeColumnSpans':PyJs_SourceMapConsumer_computeColumnSpans_4087_, u'arguments':arguments}, var) + var.registers([u'nextMapping', u'index', u'mapping']) + #for JS loop + var.put(u'index', Js(0.0)) + while (var.get(u'index')<var.get(u"this").get(u'_generatedMappings').get(u'length')): + try: + var.put(u'mapping', var.get(u"this").get(u'_generatedMappings').get(var.get(u'index'))) + if ((var.get(u'index')+Js(1.0))<var.get(u"this").get(u'_generatedMappings').get(u'length')): + var.put(u'nextMapping', var.get(u"this").get(u'_generatedMappings').get((var.get(u'index')+Js(1.0)))) + if PyJsStrictEq(var.get(u'mapping').get(u'generatedLine'),var.get(u'nextMapping').get(u'generatedLine')): + var.get(u'mapping').put(u'lastGeneratedColumn', (var.get(u'nextMapping').get(u'generatedColumn')-Js(1.0))) + continue + var.get(u'mapping').put(u'lastGeneratedColumn', var.get(u'Infinity')) + finally: + var.put(u'index',Js(var.get(u'index').to_number())+Js(1)) + PyJs_SourceMapConsumer_computeColumnSpans_4087_._set_name(u'SourceMapConsumer_computeColumnSpans') + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'computeColumnSpans', PyJs_SourceMapConsumer_computeColumnSpans_4087_) + @Js + def PyJs_SourceMapConsumer_originalPositionFor_4088_(aArgs, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'SourceMapConsumer_originalPositionFor':PyJs_SourceMapConsumer_originalPositionFor_4088_, u'aArgs':aArgs}, var) + var.registers([u'index', u'name', u'aArgs', u'needle', u'mapping', u'source']) + PyJs_Object_4089_ = Js({u'generatedLine':var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'line')),u'generatedColumn':var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'column'))}) + var.put(u'needle', PyJs_Object_4089_) + var.put(u'index', var.get(u"this").callprop(u'_findMapping', var.get(u'needle'), var.get(u"this").get(u'_generatedMappings'), Js(u'generatedLine'), Js(u'generatedColumn'), var.get(u'util').get(u'compareByGeneratedPositionsDeflated'), var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'bias'), var.get(u'SourceMapConsumer').get(u'GREATEST_LOWER_BOUND')))) + if (var.get(u'index')>=Js(0.0)): + var.put(u'mapping', var.get(u"this").get(u'_generatedMappings').get(var.get(u'index'))) + if PyJsStrictEq(var.get(u'mapping').get(u'generatedLine'),var.get(u'needle').get(u'generatedLine')): + var.put(u'source', var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'source'), var.get(u"null"))) + if PyJsStrictNeq(var.get(u'source'),var.get(u"null")): + var.put(u'source', var.get(u"this").get(u'_sources').callprop(u'at', var.get(u'source'))) + if (var.get(u"this").get(u'sourceRoot')!=var.get(u"null")): + var.put(u'source', var.get(u'util').callprop(u'join', var.get(u"this").get(u'sourceRoot'), var.get(u'source'))) + var.put(u'name', var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'name'), var.get(u"null"))) + if PyJsStrictNeq(var.get(u'name'),var.get(u"null")): + var.put(u'name', var.get(u"this").get(u'_names').callprop(u'at', var.get(u'name'))) + PyJs_Object_4090_ = Js({u'source':var.get(u'source'),u'line':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'originalLine'), var.get(u"null")),u'column':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'originalColumn'), var.get(u"null")),u'name':var.get(u'name')}) + return PyJs_Object_4090_ + PyJs_Object_4091_ = Js({u'source':var.get(u"null"),u'line':var.get(u"null"),u'column':var.get(u"null"),u'name':var.get(u"null")}) + return PyJs_Object_4091_ + PyJs_SourceMapConsumer_originalPositionFor_4088_._set_name(u'SourceMapConsumer_originalPositionFor') + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'originalPositionFor', PyJs_SourceMapConsumer_originalPositionFor_4088_) + @Js + def PyJs_BasicSourceMapConsumer_hasContentsOfAllSources_4092_(this, arguments, var=var): + var = Scope({u'this':this, u'BasicSourceMapConsumer_hasContentsOfAllSources':PyJs_BasicSourceMapConsumer_hasContentsOfAllSources_4092_, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'sourcesContent').neg(): + return Js(False) + @Js + def PyJs_anonymous_4093_(sc, this, arguments, var=var): + var = Scope({u'sc':sc, u'this':this, u'arguments':arguments}, var) + var.registers([u'sc']) + return (var.get(u'sc')==var.get(u"null")) + PyJs_anonymous_4093_._set_name(u'anonymous') + return ((var.get(u"this").get(u'sourcesContent').get(u'length')>=var.get(u"this").get(u'_sources').callprop(u'size')) and var.get(u"this").get(u'sourcesContent').callprop(u'some', PyJs_anonymous_4093_).neg()) + PyJs_BasicSourceMapConsumer_hasContentsOfAllSources_4092_._set_name(u'BasicSourceMapConsumer_hasContentsOfAllSources') + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'hasContentsOfAllSources', PyJs_BasicSourceMapConsumer_hasContentsOfAllSources_4092_) + @Js + def PyJs_SourceMapConsumer_sourceContentFor_4094_(aSource, nullOnMissing, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'SourceMapConsumer_sourceContentFor':PyJs_SourceMapConsumer_sourceContentFor_4094_, u'aSource':aSource, u'nullOnMissing':nullOnMissing}, var) + var.registers([u'url', u'fileUriAbsPath', u'aSource', u'nullOnMissing']) + if var.get(u"this").get(u'sourcesContent').neg(): + return var.get(u"null") + if (var.get(u"this").get(u'sourceRoot')!=var.get(u"null")): + var.put(u'aSource', var.get(u'util').callprop(u'relative', var.get(u"this").get(u'sourceRoot'), var.get(u'aSource'))) + if var.get(u"this").get(u'_sources').callprop(u'has', var.get(u'aSource')): + return var.get(u"this").get(u'sourcesContent').get(var.get(u"this").get(u'_sources').callprop(u'indexOf', var.get(u'aSource'))) + pass + if ((var.get(u"this").get(u'sourceRoot')!=var.get(u"null")) and var.put(u'url', var.get(u'util').callprop(u'urlParse', var.get(u"this").get(u'sourceRoot')))): + var.put(u'fileUriAbsPath', var.get(u'aSource').callprop(u'replace', JsRegExp(u'/^file:\\/\\//'), Js(u''))) + if ((var.get(u'url').get(u'scheme')==Js(u'file')) and var.get(u"this").get(u'_sources').callprop(u'has', var.get(u'fileUriAbsPath'))): + return var.get(u"this").get(u'sourcesContent').get(var.get(u"this").get(u'_sources').callprop(u'indexOf', var.get(u'fileUriAbsPath'))) + if ((var.get(u'url').get(u'path').neg() or (var.get(u'url').get(u'path')==Js(u'/'))) and var.get(u"this").get(u'_sources').callprop(u'has', (Js(u'/')+var.get(u'aSource')))): + return var.get(u"this").get(u'sourcesContent').get(var.get(u"this").get(u'_sources').callprop(u'indexOf', (Js(u'/')+var.get(u'aSource')))) + if var.get(u'nullOnMissing'): + return var.get(u"null") + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'"')+var.get(u'aSource'))+Js(u'" is not in the SourceMap.')))) + raise PyJsTempException + PyJs_SourceMapConsumer_sourceContentFor_4094_._set_name(u'SourceMapConsumer_sourceContentFor') + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'sourceContentFor', PyJs_SourceMapConsumer_sourceContentFor_4094_) + @Js + def PyJs_SourceMapConsumer_generatedPositionFor_4095_(aArgs, this, arguments, var=var): + var = Scope({u'this':this, u'SourceMapConsumer_generatedPositionFor':PyJs_SourceMapConsumer_generatedPositionFor_4095_, u'arguments':arguments, u'aArgs':aArgs}, var) + var.registers([u'aArgs', u'source', u'needle', u'mapping', u'index']) + var.put(u'source', var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'source'))) + if (var.get(u"this").get(u'sourceRoot')!=var.get(u"null")): + var.put(u'source', var.get(u'util').callprop(u'relative', var.get(u"this").get(u'sourceRoot'), var.get(u'source'))) + if var.get(u"this").get(u'_sources').callprop(u'has', var.get(u'source')).neg(): + PyJs_Object_4096_ = Js({u'line':var.get(u"null"),u'column':var.get(u"null"),u'lastColumn':var.get(u"null")}) + return PyJs_Object_4096_ + var.put(u'source', var.get(u"this").get(u'_sources').callprop(u'indexOf', var.get(u'source'))) + PyJs_Object_4097_ = Js({u'source':var.get(u'source'),u'originalLine':var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'line')),u'originalColumn':var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'column'))}) + var.put(u'needle', PyJs_Object_4097_) + var.put(u'index', var.get(u"this").callprop(u'_findMapping', var.get(u'needle'), var.get(u"this").get(u'_originalMappings'), Js(u'originalLine'), Js(u'originalColumn'), var.get(u'util').get(u'compareByOriginalPositions'), var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'bias'), var.get(u'SourceMapConsumer').get(u'GREATEST_LOWER_BOUND')))) + if (var.get(u'index')>=Js(0.0)): + var.put(u'mapping', var.get(u"this").get(u'_originalMappings').get(var.get(u'index'))) + if PyJsStrictEq(var.get(u'mapping').get(u'source'),var.get(u'needle').get(u'source')): + PyJs_Object_4098_ = Js({u'line':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'generatedLine'), var.get(u"null")),u'column':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'generatedColumn'), var.get(u"null")),u'lastColumn':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'lastGeneratedColumn'), var.get(u"null"))}) + return PyJs_Object_4098_ + PyJs_Object_4099_ = Js({u'line':var.get(u"null"),u'column':var.get(u"null"),u'lastColumn':var.get(u"null")}) + return PyJs_Object_4099_ + PyJs_SourceMapConsumer_generatedPositionFor_4095_._set_name(u'SourceMapConsumer_generatedPositionFor') + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'generatedPositionFor', PyJs_SourceMapConsumer_generatedPositionFor_4095_) + var.get(u'exports').put(u'BasicSourceMapConsumer', var.get(u'BasicSourceMapConsumer')) + pass + var.get(u'IndexedSourceMapConsumer').put(u'prototype', var.get(u'Object').callprop(u'create', var.get(u'SourceMapConsumer').get(u'prototype'))) + var.get(u'IndexedSourceMapConsumer').get(u'prototype').put(u'constructor', var.get(u'SourceMapConsumer')) + var.get(u'IndexedSourceMapConsumer').get(u'prototype').put(u'_version', Js(3.0)) + @Js + def PyJs_anonymous_4105_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'sources', u'j']) + var.put(u'sources', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u"this").get(u'_sections').get(u'length')): + try: + #for JS loop + var.put(u'j', Js(0.0)) + while (var.get(u'j')<var.get(u"this").get(u'_sections').get(var.get(u'i')).get(u'consumer').get(u'sources').get(u'length')): + try: + var.get(u'sources').callprop(u'push', var.get(u"this").get(u'_sections').get(var.get(u'i')).get(u'consumer').get(u'sources').get(var.get(u'j'))) + finally: + (var.put(u'j',Js(var.get(u'j').to_number())+Js(1))-Js(1)) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'sources') + PyJs_anonymous_4105_._set_name(u'anonymous') + PyJs_Object_4104_ = Js({u'get':PyJs_anonymous_4105_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'IndexedSourceMapConsumer').get(u'prototype'), Js(u'sources'), PyJs_Object_4104_) + @Js + def PyJs_IndexedSourceMapConsumer_originalPositionFor_4106_(aArgs, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'IndexedSourceMapConsumer_originalPositionFor':PyJs_IndexedSourceMapConsumer_originalPositionFor_4106_, u'aArgs':aArgs}, var) + var.registers([u'section', u'needle', u'aArgs', u'sectionIndex']) + PyJs_Object_4107_ = Js({u'generatedLine':var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'line')),u'generatedColumn':var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'column'))}) + var.put(u'needle', PyJs_Object_4107_) + @Js + def PyJs_anonymous_4108_(needle, section, this, arguments, var=var): + var = Scope({u'this':this, u'section':section, u'needle':needle, u'arguments':arguments}, var) + var.registers([u'section', u'needle', u'cmp']) + var.put(u'cmp', (var.get(u'needle').get(u'generatedLine')-var.get(u'section').get(u'generatedOffset').get(u'generatedLine'))) + if var.get(u'cmp'): + return var.get(u'cmp') + return (var.get(u'needle').get(u'generatedColumn')-var.get(u'section').get(u'generatedOffset').get(u'generatedColumn')) + PyJs_anonymous_4108_._set_name(u'anonymous') + var.put(u'sectionIndex', var.get(u'binarySearch').callprop(u'search', var.get(u'needle'), var.get(u"this").get(u'_sections'), PyJs_anonymous_4108_)) + var.put(u'section', var.get(u"this").get(u'_sections').get(var.get(u'sectionIndex'))) + if var.get(u'section').neg(): + PyJs_Object_4109_ = Js({u'source':var.get(u"null"),u'line':var.get(u"null"),u'column':var.get(u"null"),u'name':var.get(u"null")}) + return PyJs_Object_4109_ + PyJs_Object_4110_ = Js({u'line':(var.get(u'needle').get(u'generatedLine')-(var.get(u'section').get(u'generatedOffset').get(u'generatedLine')-Js(1.0))),u'column':(var.get(u'needle').get(u'generatedColumn')-((var.get(u'section').get(u'generatedOffset').get(u'generatedColumn')-Js(1.0)) if PyJsStrictEq(var.get(u'section').get(u'generatedOffset').get(u'generatedLine'),var.get(u'needle').get(u'generatedLine')) else Js(0.0))),u'bias':var.get(u'aArgs').get(u'bias')}) + return var.get(u'section').get(u'consumer').callprop(u'originalPositionFor', PyJs_Object_4110_) + PyJs_IndexedSourceMapConsumer_originalPositionFor_4106_._set_name(u'IndexedSourceMapConsumer_originalPositionFor') + var.get(u'IndexedSourceMapConsumer').get(u'prototype').put(u'originalPositionFor', PyJs_IndexedSourceMapConsumer_originalPositionFor_4106_) + @Js + def PyJs_IndexedSourceMapConsumer_hasContentsOfAllSources_4111_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'IndexedSourceMapConsumer_hasContentsOfAllSources':PyJs_IndexedSourceMapConsumer_hasContentsOfAllSources_4111_}, var) + var.registers([]) + @Js + def PyJs_anonymous_4112_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u's']) + return var.get(u's').get(u'consumer').callprop(u'hasContentsOfAllSources') + PyJs_anonymous_4112_._set_name(u'anonymous') + return var.get(u"this").get(u'_sections').callprop(u'every', PyJs_anonymous_4112_) + PyJs_IndexedSourceMapConsumer_hasContentsOfAllSources_4111_._set_name(u'IndexedSourceMapConsumer_hasContentsOfAllSources') + var.get(u'IndexedSourceMapConsumer').get(u'prototype').put(u'hasContentsOfAllSources', PyJs_IndexedSourceMapConsumer_hasContentsOfAllSources_4111_) + @Js + def PyJs_IndexedSourceMapConsumer_sourceContentFor_4113_(aSource, nullOnMissing, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'IndexedSourceMapConsumer_sourceContentFor':PyJs_IndexedSourceMapConsumer_sourceContentFor_4113_, u'aSource':aSource, u'nullOnMissing':nullOnMissing}, var) + var.registers([u'i', u'content', u'section', u'aSource', u'nullOnMissing']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u"this").get(u'_sections').get(u'length')): + try: + var.put(u'section', var.get(u"this").get(u'_sections').get(var.get(u'i'))) + var.put(u'content', var.get(u'section').get(u'consumer').callprop(u'sourceContentFor', var.get(u'aSource'), var.get(u'true'))) + if var.get(u'content'): + return var.get(u'content') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + if var.get(u'nullOnMissing'): + return var.get(u"null") + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'"')+var.get(u'aSource'))+Js(u'" is not in the SourceMap.')))) + raise PyJsTempException + PyJs_IndexedSourceMapConsumer_sourceContentFor_4113_._set_name(u'IndexedSourceMapConsumer_sourceContentFor') + var.get(u'IndexedSourceMapConsumer').get(u'prototype').put(u'sourceContentFor', PyJs_IndexedSourceMapConsumer_sourceContentFor_4113_) + @Js + def PyJs_IndexedSourceMapConsumer_generatedPositionFor_4114_(aArgs, this, arguments, var=var): + var = Scope({u'this':this, u'IndexedSourceMapConsumer_generatedPositionFor':PyJs_IndexedSourceMapConsumer_generatedPositionFor_4114_, u'arguments':arguments, u'aArgs':aArgs}, var) + var.registers([u'i', u'section', u'generatedPosition', u'ret', u'aArgs']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u"this").get(u'_sections').get(u'length')): + try: + var.put(u'section', var.get(u"this").get(u'_sections').get(var.get(u'i'))) + if PyJsStrictEq(var.get(u'section').get(u'consumer').get(u'sources').callprop(u'indexOf', var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'source'))),(-Js(1.0))): + continue + var.put(u'generatedPosition', var.get(u'section').get(u'consumer').callprop(u'generatedPositionFor', var.get(u'aArgs'))) + if var.get(u'generatedPosition'): + PyJs_Object_4115_ = Js({u'line':(var.get(u'generatedPosition').get(u'line')+(var.get(u'section').get(u'generatedOffset').get(u'generatedLine')-Js(1.0))),u'column':(var.get(u'generatedPosition').get(u'column')+((var.get(u'section').get(u'generatedOffset').get(u'generatedColumn')-Js(1.0)) if PyJsStrictEq(var.get(u'section').get(u'generatedOffset').get(u'generatedLine'),var.get(u'generatedPosition').get(u'line')) else Js(0.0)))}) + var.put(u'ret', PyJs_Object_4115_) + return var.get(u'ret') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJs_Object_4116_ = Js({u'line':var.get(u"null"),u'column':var.get(u"null")}) + return PyJs_Object_4116_ + PyJs_IndexedSourceMapConsumer_generatedPositionFor_4114_._set_name(u'IndexedSourceMapConsumer_generatedPositionFor') + var.get(u'IndexedSourceMapConsumer').get(u'prototype').put(u'generatedPositionFor', PyJs_IndexedSourceMapConsumer_generatedPositionFor_4114_) + @Js + def PyJs_IndexedSourceMapConsumer_parseMappings_4117_(aStr, aSourceRoot, this, arguments, var=var): + var = Scope({u'this':this, u'aStr':aStr, u'aSourceRoot':aSourceRoot, u'IndexedSourceMapConsumer_parseMappings':PyJs_IndexedSourceMapConsumer_parseMappings_4117_, u'arguments':arguments}, var) + var.registers([u'name', u'i', u'section', u'j', u'aSourceRoot', u'mapping', u'adjustedMapping', u'source', u'sectionMappings', u'aStr']) + var.get(u"this").put(u'__generatedMappings', Js([])) + var.get(u"this").put(u'__originalMappings', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u"this").get(u'_sections').get(u'length')): + try: + var.put(u'section', var.get(u"this").get(u'_sections').get(var.get(u'i'))) + var.put(u'sectionMappings', var.get(u'section').get(u'consumer').get(u'_generatedMappings')) + #for JS loop + var.put(u'j', Js(0.0)) + while (var.get(u'j')<var.get(u'sectionMappings').get(u'length')): + try: + var.put(u'mapping', var.get(u'sectionMappings').get(var.get(u'j'))) + var.put(u'source', var.get(u'section').get(u'consumer').get(u'_sources').callprop(u'at', var.get(u'mapping').get(u'source'))) + if PyJsStrictNeq(var.get(u'section').get(u'consumer').get(u'sourceRoot'),var.get(u"null")): + var.put(u'source', var.get(u'util').callprop(u'join', var.get(u'section').get(u'consumer').get(u'sourceRoot'), var.get(u'source'))) + var.get(u"this").get(u'_sources').callprop(u'add', var.get(u'source')) + var.put(u'source', var.get(u"this").get(u'_sources').callprop(u'indexOf', var.get(u'source'))) + var.put(u'name', var.get(u'section').get(u'consumer').get(u'_names').callprop(u'at', var.get(u'mapping').get(u'name'))) + var.get(u"this").get(u'_names').callprop(u'add', var.get(u'name')) + var.put(u'name', var.get(u"this").get(u'_names').callprop(u'indexOf', var.get(u'name'))) + PyJs_Object_4118_ = Js({u'source':var.get(u'source'),u'generatedLine':(var.get(u'mapping').get(u'generatedLine')+(var.get(u'section').get(u'generatedOffset').get(u'generatedLine')-Js(1.0))),u'generatedColumn':(var.get(u'mapping').get(u'generatedColumn')+((var.get(u'section').get(u'generatedOffset').get(u'generatedColumn')-Js(1.0)) if PyJsStrictEq(var.get(u'section').get(u'generatedOffset').get(u'generatedLine'),var.get(u'mapping').get(u'generatedLine')) else Js(0.0))),u'originalLine':var.get(u'mapping').get(u'originalLine'),u'originalColumn':var.get(u'mapping').get(u'originalColumn'),u'name':var.get(u'name')}) + var.put(u'adjustedMapping', PyJs_Object_4118_) + var.get(u"this").get(u'__generatedMappings').callprop(u'push', var.get(u'adjustedMapping')) + if PyJsStrictEq(var.get(u'adjustedMapping').get(u'originalLine').typeof(),Js(u'number')): + var.get(u"this").get(u'__originalMappings').callprop(u'push', var.get(u'adjustedMapping')) + finally: + (var.put(u'j',Js(var.get(u'j').to_number())+Js(1))-Js(1)) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.get(u'quickSort')(var.get(u"this").get(u'__generatedMappings'), var.get(u'util').get(u'compareByGeneratedPositionsDeflated')) + var.get(u'quickSort')(var.get(u"this").get(u'__originalMappings'), var.get(u'util').get(u'compareByOriginalPositions')) + PyJs_IndexedSourceMapConsumer_parseMappings_4117_._set_name(u'IndexedSourceMapConsumer_parseMappings') + var.get(u'IndexedSourceMapConsumer').get(u'prototype').put(u'_parseMappings', PyJs_IndexedSourceMapConsumer_parseMappings_4117_) + var.get(u'exports').put(u'IndexedSourceMapConsumer', var.get(u'IndexedSourceMapConsumer')) +PyJs_anonymous_4063_._set_name(u'anonymous') +PyJs_Object_4119_ = Js({u'./array-set':Js(509.0),u'./base64-vlq':Js(510.0),u'./binary-search':Js(512.0),u'./quick-sort':Js(514.0),u'./util':Js(518.0)}) +@Js +def PyJs_anonymous_4120_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'SourceMapGenerator', u'exports', u'base64VLQ', u'require', u'module', u'util', u'ArraySet', u'MappingList']) + @Js + def PyJsHoisted_SourceMapGenerator_(aArgs, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'aArgs':aArgs}, var) + var.registers([u'aArgs']) + if var.get(u'aArgs').neg(): + PyJs_Object_4121_ = Js({}) + var.put(u'aArgs', PyJs_Object_4121_) + var.get(u"this").put(u'_file', var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'file'), var.get(u"null"))) + var.get(u"this").put(u'_sourceRoot', var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'sourceRoot'), var.get(u"null"))) + var.get(u"this").put(u'_skipValidation', var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'skipValidation'), Js(False))) + var.get(u"this").put(u'_sources', var.get(u'ArraySet').create()) + var.get(u"this").put(u'_names', var.get(u'ArraySet').create()) + var.get(u"this").put(u'_mappings', var.get(u'MappingList').create()) + var.get(u"this").put(u'_sourcesContents', var.get(u"null")) + PyJsHoisted_SourceMapGenerator_.func_name = u'SourceMapGenerator' + var.put(u'SourceMapGenerator', PyJsHoisted_SourceMapGenerator_) + var.put(u'base64VLQ', var.get(u'require')(Js(u'./base64-vlq'))) + var.put(u'util', var.get(u'require')(Js(u'./util'))) + var.put(u'ArraySet', var.get(u'require')(Js(u'./array-set')).get(u'ArraySet')) + var.put(u'MappingList', var.get(u'require')(Js(u'./mapping-list')).get(u'MappingList')) + pass + var.get(u'SourceMapGenerator').get(u'prototype').put(u'_version', Js(3.0)) + @Js + def PyJs_SourceMapGenerator_fromSourceMap_4122_(aSourceMapConsumer, this, arguments, var=var): + var = Scope({u'this':this, u'SourceMapGenerator_fromSourceMap':PyJs_SourceMapGenerator_fromSourceMap_4122_, u'arguments':arguments, u'aSourceMapConsumer':aSourceMapConsumer}, var) + var.registers([u'aSourceMapConsumer', u'sourceRoot', u'generator']) + var.put(u'sourceRoot', var.get(u'aSourceMapConsumer').get(u'sourceRoot')) + PyJs_Object_4123_ = Js({u'file':var.get(u'aSourceMapConsumer').get(u'file'),u'sourceRoot':var.get(u'sourceRoot')}) + var.put(u'generator', var.get(u'SourceMapGenerator').create(PyJs_Object_4123_)) + @Js + def PyJs_anonymous_4124_(mapping, this, arguments, var=var): + var = Scope({u'this':this, u'mapping':mapping, u'arguments':arguments}, var) + var.registers([u'newMapping', u'mapping']) + PyJs_Object_4126_ = Js({u'line':var.get(u'mapping').get(u'generatedLine'),u'column':var.get(u'mapping').get(u'generatedColumn')}) + PyJs_Object_4125_ = Js({u'generated':PyJs_Object_4126_}) + var.put(u'newMapping', PyJs_Object_4125_) + if (var.get(u'mapping').get(u'source')!=var.get(u"null")): + var.get(u'newMapping').put(u'source', var.get(u'mapping').get(u'source')) + if (var.get(u'sourceRoot')!=var.get(u"null")): + var.get(u'newMapping').put(u'source', var.get(u'util').callprop(u'relative', var.get(u'sourceRoot'), var.get(u'newMapping').get(u'source'))) + PyJs_Object_4127_ = Js({u'line':var.get(u'mapping').get(u'originalLine'),u'column':var.get(u'mapping').get(u'originalColumn')}) + var.get(u'newMapping').put(u'original', PyJs_Object_4127_) + if (var.get(u'mapping').get(u'name')!=var.get(u"null")): + var.get(u'newMapping').put(u'name', var.get(u'mapping').get(u'name')) + var.get(u'generator').callprop(u'addMapping', var.get(u'newMapping')) + PyJs_anonymous_4124_._set_name(u'anonymous') + var.get(u'aSourceMapConsumer').callprop(u'eachMapping', PyJs_anonymous_4124_) + @Js + def PyJs_anonymous_4128_(sourceFile, this, arguments, var=var): + var = Scope({u'this':this, u'sourceFile':sourceFile, u'arguments':arguments}, var) + var.registers([u'content', u'sourceFile']) + var.put(u'content', var.get(u'aSourceMapConsumer').callprop(u'sourceContentFor', var.get(u'sourceFile'))) + if (var.get(u'content')!=var.get(u"null")): + var.get(u'generator').callprop(u'setSourceContent', var.get(u'sourceFile'), var.get(u'content')) + PyJs_anonymous_4128_._set_name(u'anonymous') + var.get(u'aSourceMapConsumer').get(u'sources').callprop(u'forEach', PyJs_anonymous_4128_) + return var.get(u'generator') + PyJs_SourceMapGenerator_fromSourceMap_4122_._set_name(u'SourceMapGenerator_fromSourceMap') + var.get(u'SourceMapGenerator').put(u'fromSourceMap', PyJs_SourceMapGenerator_fromSourceMap_4122_) + @Js + def PyJs_SourceMapGenerator_addMapping_4129_(aArgs, this, arguments, var=var): + var = Scope({u'this':this, u'SourceMapGenerator_addMapping':PyJs_SourceMapGenerator_addMapping_4129_, u'arguments':arguments, u'aArgs':aArgs}, var) + var.registers([u'source', u'generated', u'aArgs', u'original', u'name']) + var.put(u'generated', var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'generated'))) + var.put(u'original', var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'original'), var.get(u"null"))) + var.put(u'source', var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'source'), var.get(u"null"))) + var.put(u'name', var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'name'), var.get(u"null"))) + if var.get(u"this").get(u'_skipValidation').neg(): + var.get(u"this").callprop(u'_validateMapping', var.get(u'generated'), var.get(u'original'), var.get(u'source'), var.get(u'name')) + if (var.get(u'source')!=var.get(u"null")): + var.put(u'source', var.get(u'String')(var.get(u'source'))) + if var.get(u"this").get(u'_sources').callprop(u'has', var.get(u'source')).neg(): + var.get(u"this").get(u'_sources').callprop(u'add', var.get(u'source')) + if (var.get(u'name')!=var.get(u"null")): + var.put(u'name', var.get(u'String')(var.get(u'name'))) + if var.get(u"this").get(u'_names').callprop(u'has', var.get(u'name')).neg(): + var.get(u"this").get(u'_names').callprop(u'add', var.get(u'name')) + PyJs_Object_4130_ = Js({u'generatedLine':var.get(u'generated').get(u'line'),u'generatedColumn':var.get(u'generated').get(u'column'),u'originalLine':((var.get(u'original')!=var.get(u"null")) and var.get(u'original').get(u'line')),u'originalColumn':((var.get(u'original')!=var.get(u"null")) and var.get(u'original').get(u'column')),u'source':var.get(u'source'),u'name':var.get(u'name')}) + var.get(u"this").get(u'_mappings').callprop(u'add', PyJs_Object_4130_) + PyJs_SourceMapGenerator_addMapping_4129_._set_name(u'SourceMapGenerator_addMapping') + var.get(u'SourceMapGenerator').get(u'prototype').put(u'addMapping', PyJs_SourceMapGenerator_addMapping_4129_) + @Js + def PyJs_SourceMapGenerator_setSourceContent_4131_(aSourceFile, aSourceContent, this, arguments, var=var): + var = Scope({u'this':this, u'SourceMapGenerator_setSourceContent':PyJs_SourceMapGenerator_setSourceContent_4131_, u'aSourceContent':aSourceContent, u'aSourceFile':aSourceFile, u'arguments':arguments}, var) + var.registers([u'source', u'aSourceContent', u'aSourceFile']) + var.put(u'source', var.get(u'aSourceFile')) + if (var.get(u"this").get(u'_sourceRoot')!=var.get(u"null")): + var.put(u'source', var.get(u'util').callprop(u'relative', var.get(u"this").get(u'_sourceRoot'), var.get(u'source'))) + if (var.get(u'aSourceContent')!=var.get(u"null")): + if var.get(u"this").get(u'_sourcesContents').neg(): + var.get(u"this").put(u'_sourcesContents', var.get(u'Object').callprop(u'create', var.get(u"null"))) + var.get(u"this").get(u'_sourcesContents').put(var.get(u'util').callprop(u'toSetString', var.get(u'source')), var.get(u'aSourceContent')) + else: + if var.get(u"this").get(u'_sourcesContents'): + var.get(u"this").get(u'_sourcesContents').delete(var.get(u'util').callprop(u'toSetString', var.get(u'source'))) + if PyJsStrictEq(var.get(u'Object').callprop(u'keys', var.get(u"this").get(u'_sourcesContents')).get(u'length'),Js(0.0)): + var.get(u"this").put(u'_sourcesContents', var.get(u"null")) + PyJs_SourceMapGenerator_setSourceContent_4131_._set_name(u'SourceMapGenerator_setSourceContent') + var.get(u'SourceMapGenerator').get(u'prototype').put(u'setSourceContent', PyJs_SourceMapGenerator_setSourceContent_4131_) + @Js + def PyJs_SourceMapGenerator_applySourceMap_4132_(aSourceMapConsumer, aSourceFile, aSourceMapPath, this, arguments, var=var): + var = Scope({u'SourceMapGenerator_applySourceMap':PyJs_SourceMapGenerator_applySourceMap_4132_, u'aSourceMapConsumer':aSourceMapConsumer, u'this':this, u'aSourceMapPath':aSourceMapPath, u'arguments':arguments, u'aSourceFile':aSourceFile}, var) + var.registers([u'aSourceMapConsumer', u'sourceFile', u'sourceRoot', u'aSourceMapPath', u'newNames', u'newSources', u'aSourceFile']) + var.put(u'sourceFile', var.get(u'aSourceFile')) + if (var.get(u'aSourceFile')==var.get(u"null")): + if (var.get(u'aSourceMapConsumer').get(u'file')==var.get(u"null")): + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ')+Js(u'or the source map\'s "file" property. Both were omitted.')))) + raise PyJsTempException + var.put(u'sourceFile', var.get(u'aSourceMapConsumer').get(u'file')) + var.put(u'sourceRoot', var.get(u"this").get(u'_sourceRoot')) + if (var.get(u'sourceRoot')!=var.get(u"null")): + var.put(u'sourceFile', var.get(u'util').callprop(u'relative', var.get(u'sourceRoot'), var.get(u'sourceFile'))) + var.put(u'newSources', var.get(u'ArraySet').create()) + var.put(u'newNames', var.get(u'ArraySet').create()) + @Js + def PyJs_anonymous_4133_(mapping, this, arguments, var=var): + var = Scope({u'this':this, u'mapping':mapping, u'arguments':arguments}, var) + var.registers([u'source', u'mapping', u'original', u'name']) + if (PyJsStrictEq(var.get(u'mapping').get(u'source'),var.get(u'sourceFile')) and (var.get(u'mapping').get(u'originalLine')!=var.get(u"null"))): + PyJs_Object_4134_ = Js({u'line':var.get(u'mapping').get(u'originalLine'),u'column':var.get(u'mapping').get(u'originalColumn')}) + var.put(u'original', var.get(u'aSourceMapConsumer').callprop(u'originalPositionFor', PyJs_Object_4134_)) + if (var.get(u'original').get(u'source')!=var.get(u"null")): + var.get(u'mapping').put(u'source', var.get(u'original').get(u'source')) + if (var.get(u'aSourceMapPath')!=var.get(u"null")): + var.get(u'mapping').put(u'source', var.get(u'util').callprop(u'join', var.get(u'aSourceMapPath'), var.get(u'mapping').get(u'source'))) + if (var.get(u'sourceRoot')!=var.get(u"null")): + var.get(u'mapping').put(u'source', var.get(u'util').callprop(u'relative', var.get(u'sourceRoot'), var.get(u'mapping').get(u'source'))) + var.get(u'mapping').put(u'originalLine', var.get(u'original').get(u'line')) + var.get(u'mapping').put(u'originalColumn', var.get(u'original').get(u'column')) + if (var.get(u'original').get(u'name')!=var.get(u"null")): + var.get(u'mapping').put(u'name', var.get(u'original').get(u'name')) + var.put(u'source', var.get(u'mapping').get(u'source')) + if ((var.get(u'source')!=var.get(u"null")) and var.get(u'newSources').callprop(u'has', var.get(u'source')).neg()): + var.get(u'newSources').callprop(u'add', var.get(u'source')) + var.put(u'name', var.get(u'mapping').get(u'name')) + if ((var.get(u'name')!=var.get(u"null")) and var.get(u'newNames').callprop(u'has', var.get(u'name')).neg()): + var.get(u'newNames').callprop(u'add', var.get(u'name')) + PyJs_anonymous_4133_._set_name(u'anonymous') + var.get(u"this").get(u'_mappings').callprop(u'unsortedForEach', PyJs_anonymous_4133_, var.get(u"this")) + var.get(u"this").put(u'_sources', var.get(u'newSources')) + var.get(u"this").put(u'_names', var.get(u'newNames')) + @Js + def PyJs_anonymous_4135_(sourceFile, this, arguments, var=var): + var = Scope({u'this':this, u'sourceFile':sourceFile, u'arguments':arguments}, var) + var.registers([u'content', u'sourceFile']) + var.put(u'content', var.get(u'aSourceMapConsumer').callprop(u'sourceContentFor', var.get(u'sourceFile'))) + if (var.get(u'content')!=var.get(u"null")): + if (var.get(u'aSourceMapPath')!=var.get(u"null")): + var.put(u'sourceFile', var.get(u'util').callprop(u'join', var.get(u'aSourceMapPath'), var.get(u'sourceFile'))) + if (var.get(u'sourceRoot')!=var.get(u"null")): + var.put(u'sourceFile', var.get(u'util').callprop(u'relative', var.get(u'sourceRoot'), var.get(u'sourceFile'))) + var.get(u"this").callprop(u'setSourceContent', var.get(u'sourceFile'), var.get(u'content')) + PyJs_anonymous_4135_._set_name(u'anonymous') + var.get(u'aSourceMapConsumer').get(u'sources').callprop(u'forEach', PyJs_anonymous_4135_, var.get(u"this")) + PyJs_SourceMapGenerator_applySourceMap_4132_._set_name(u'SourceMapGenerator_applySourceMap') + var.get(u'SourceMapGenerator').get(u'prototype').put(u'applySourceMap', PyJs_SourceMapGenerator_applySourceMap_4132_) + @Js + def PyJs_SourceMapGenerator_validateMapping_4136_(aGenerated, aOriginal, aSource, aName, this, arguments, var=var): + var = Scope({u'aOriginal':aOriginal, u'aGenerated':aGenerated, u'SourceMapGenerator_validateMapping':PyJs_SourceMapGenerator_validateMapping_4136_, u'aSource':aSource, u'this':this, u'aName':aName, u'arguments':arguments}, var) + var.registers([u'aOriginal', u'aGenerated', u'aSource', u'aName']) + if (((((((var.get(u'aGenerated') and var.get(u'aGenerated').contains(Js(u'line'))) and var.get(u'aGenerated').contains(Js(u'column'))) and (var.get(u'aGenerated').get(u'line')>Js(0.0))) and (var.get(u'aGenerated').get(u'column')>=Js(0.0))) and var.get(u'aOriginal').neg()) and var.get(u'aSource').neg()) and var.get(u'aName').neg()): + return var.get('undefined') + else: + def PyJs_LONG_4137_(var=var): + return ((((((((var.get(u'aGenerated') and var.get(u'aGenerated').contains(Js(u'line'))) and var.get(u'aGenerated').contains(Js(u'column'))) and var.get(u'aOriginal')) and var.get(u'aOriginal').contains(Js(u'line'))) and var.get(u'aOriginal').contains(Js(u'column'))) and (var.get(u'aGenerated').get(u'line')>Js(0.0))) and (var.get(u'aGenerated').get(u'column')>=Js(0.0))) and (var.get(u'aOriginal').get(u'line')>Js(0.0))) + if ((PyJs_LONG_4137_() and (var.get(u'aOriginal').get(u'column')>=Js(0.0))) and var.get(u'aSource')): + return var.get('undefined') + else: + PyJs_Object_4138_ = Js({u'generated':var.get(u'aGenerated'),u'source':var.get(u'aSource'),u'original':var.get(u'aOriginal'),u'name':var.get(u'aName')}) + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'Invalid mapping: ')+var.get(u'JSON').callprop(u'stringify', PyJs_Object_4138_)))) + raise PyJsTempException + PyJs_SourceMapGenerator_validateMapping_4136_._set_name(u'SourceMapGenerator_validateMapping') + var.get(u'SourceMapGenerator').get(u'prototype').put(u'_validateMapping', PyJs_SourceMapGenerator_validateMapping_4136_) + @Js + def PyJs_SourceMapGenerator_serializeMappings_4139_(this, arguments, var=var): + var = Scope({u'this':this, u'SourceMapGenerator_serializeMappings':PyJs_SourceMapGenerator_serializeMappings_4139_, u'arguments':arguments}, var) + var.registers([u'previousOriginalColumn', u'previousOriginalLine', u'previousGeneratedLine', u'previousSource', u'previousGeneratedColumn', u'i', u'mapping', u'previousName', u'next', u'len', u'nameIdx', u'sourceIdx', u'result', u'mappings']) + var.put(u'previousGeneratedColumn', Js(0.0)) + var.put(u'previousGeneratedLine', Js(1.0)) + var.put(u'previousOriginalColumn', Js(0.0)) + var.put(u'previousOriginalLine', Js(0.0)) + var.put(u'previousName', Js(0.0)) + var.put(u'previousSource', Js(0.0)) + var.put(u'result', Js(u'')) + pass + pass + pass + pass + var.put(u'mappings', var.get(u"this").get(u'_mappings').callprop(u'toArray')) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u'mappings').get(u'length')) + while (var.get(u'i')<var.get(u'len')): + try: + var.put(u'mapping', var.get(u'mappings').get(var.get(u'i'))) + var.put(u'next', Js(u'')) + if PyJsStrictNeq(var.get(u'mapping').get(u'generatedLine'),var.get(u'previousGeneratedLine')): + var.put(u'previousGeneratedColumn', Js(0.0)) + while PyJsStrictNeq(var.get(u'mapping').get(u'generatedLine'),var.get(u'previousGeneratedLine')): + var.put(u'next', Js(u';'), u'+') + (var.put(u'previousGeneratedLine',Js(var.get(u'previousGeneratedLine').to_number())+Js(1))-Js(1)) + else: + if (var.get(u'i')>Js(0.0)): + if var.get(u'util').callprop(u'compareByGeneratedPositionsInflated', var.get(u'mapping'), var.get(u'mappings').get((var.get(u'i')-Js(1.0)))).neg(): + continue + var.put(u'next', Js(u','), u'+') + var.put(u'next', var.get(u'base64VLQ').callprop(u'encode', (var.get(u'mapping').get(u'generatedColumn')-var.get(u'previousGeneratedColumn'))), u'+') + var.put(u'previousGeneratedColumn', var.get(u'mapping').get(u'generatedColumn')) + if (var.get(u'mapping').get(u'source')!=var.get(u"null")): + var.put(u'sourceIdx', var.get(u"this").get(u'_sources').callprop(u'indexOf', var.get(u'mapping').get(u'source'))) + var.put(u'next', var.get(u'base64VLQ').callprop(u'encode', (var.get(u'sourceIdx')-var.get(u'previousSource'))), u'+') + var.put(u'previousSource', var.get(u'sourceIdx')) + var.put(u'next', var.get(u'base64VLQ').callprop(u'encode', ((var.get(u'mapping').get(u'originalLine')-Js(1.0))-var.get(u'previousOriginalLine'))), u'+') + var.put(u'previousOriginalLine', (var.get(u'mapping').get(u'originalLine')-Js(1.0))) + var.put(u'next', var.get(u'base64VLQ').callprop(u'encode', (var.get(u'mapping').get(u'originalColumn')-var.get(u'previousOriginalColumn'))), u'+') + var.put(u'previousOriginalColumn', var.get(u'mapping').get(u'originalColumn')) + if (var.get(u'mapping').get(u'name')!=var.get(u"null")): + var.put(u'nameIdx', var.get(u"this").get(u'_names').callprop(u'indexOf', var.get(u'mapping').get(u'name'))) + var.put(u'next', var.get(u'base64VLQ').callprop(u'encode', (var.get(u'nameIdx')-var.get(u'previousName'))), u'+') + var.put(u'previousName', var.get(u'nameIdx')) + var.put(u'result', var.get(u'next'), u'+') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'result') + PyJs_SourceMapGenerator_serializeMappings_4139_._set_name(u'SourceMapGenerator_serializeMappings') + var.get(u'SourceMapGenerator').get(u'prototype').put(u'_serializeMappings', PyJs_SourceMapGenerator_serializeMappings_4139_) + @Js + def PyJs_SourceMapGenerator_generateSourcesContent_4140_(aSources, aSourceRoot, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'SourceMapGenerator_generateSourcesContent':PyJs_SourceMapGenerator_generateSourcesContent_4140_, u'aSources':aSources, u'aSourceRoot':aSourceRoot}, var) + var.registers([u'aSources', u'aSourceRoot']) + @Js + def PyJs_anonymous_4141_(source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'arguments':arguments}, var) + var.registers([u'source', u'key']) + if var.get(u"this").get(u'_sourcesContents').neg(): + return var.get(u"null") + if (var.get(u'aSourceRoot')!=var.get(u"null")): + var.put(u'source', var.get(u'util').callprop(u'relative', var.get(u'aSourceRoot'), var.get(u'source'))) + var.put(u'key', var.get(u'util').callprop(u'toSetString', var.get(u'source'))) + return (var.get(u"this").get(u'_sourcesContents').get(var.get(u'key')) if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u"this").get(u'_sourcesContents'), var.get(u'key')) else var.get(u"null")) + PyJs_anonymous_4141_._set_name(u'anonymous') + return var.get(u'aSources').callprop(u'map', PyJs_anonymous_4141_, var.get(u"this")) + PyJs_SourceMapGenerator_generateSourcesContent_4140_._set_name(u'SourceMapGenerator_generateSourcesContent') + var.get(u'SourceMapGenerator').get(u'prototype').put(u'_generateSourcesContent', PyJs_SourceMapGenerator_generateSourcesContent_4140_) + @Js + def PyJs_SourceMapGenerator_toJSON_4142_(this, arguments, var=var): + var = Scope({u'this':this, u'SourceMapGenerator_toJSON':PyJs_SourceMapGenerator_toJSON_4142_, u'arguments':arguments}, var) + var.registers([u'map']) + PyJs_Object_4143_ = Js({u'version':var.get(u"this").get(u'_version'),u'sources':var.get(u"this").get(u'_sources').callprop(u'toArray'),u'names':var.get(u"this").get(u'_names').callprop(u'toArray'),u'mappings':var.get(u"this").callprop(u'_serializeMappings')}) + var.put(u'map', PyJs_Object_4143_) + if (var.get(u"this").get(u'_file')!=var.get(u"null")): + var.get(u'map').put(u'file', var.get(u"this").get(u'_file')) + if (var.get(u"this").get(u'_sourceRoot')!=var.get(u"null")): + var.get(u'map').put(u'sourceRoot', var.get(u"this").get(u'_sourceRoot')) + if var.get(u"this").get(u'_sourcesContents'): + var.get(u'map').put(u'sourcesContent', var.get(u"this").callprop(u'_generateSourcesContent', var.get(u'map').get(u'sources'), var.get(u'map').get(u'sourceRoot'))) + return var.get(u'map') + PyJs_SourceMapGenerator_toJSON_4142_._set_name(u'SourceMapGenerator_toJSON') + var.get(u'SourceMapGenerator').get(u'prototype').put(u'toJSON', PyJs_SourceMapGenerator_toJSON_4142_) + @Js + def PyJs_SourceMapGenerator_toString_4144_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'SourceMapGenerator_toString':PyJs_SourceMapGenerator_toString_4144_}, var) + var.registers([]) + return var.get(u'JSON').callprop(u'stringify', var.get(u"this").callprop(u'toJSON')) + PyJs_SourceMapGenerator_toString_4144_._set_name(u'SourceMapGenerator_toString') + var.get(u'SourceMapGenerator').get(u'prototype').put(u'toString', PyJs_SourceMapGenerator_toString_4144_) + var.get(u'exports').put(u'SourceMapGenerator', var.get(u'SourceMapGenerator')) +PyJs_anonymous_4120_._set_name(u'anonymous') +PyJs_Object_4145_ = Js({u'./array-set':Js(509.0),u'./base64-vlq':Js(510.0),u'./mapping-list':Js(513.0),u'./util':Js(518.0)}) +@Js +def PyJs_anonymous_4146_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'util', u'exports', u'NEWLINE_CODE', u'SourceNode', u'require', u'isSourceNode', u'module', u'SourceMapGenerator', u'REGEX_NEWLINE']) + @Js + def PyJsHoisted_SourceNode_(aLine, aColumn, aSource, aChunks, aName, this, arguments, var=var): + var = Scope({u'aChunks':aChunks, u'aSource':aSource, u'aLine':aLine, u'this':this, u'aColumn':aColumn, u'aName':aName, u'arguments':arguments}, var) + var.registers([u'aChunks', u'aColumn', u'aSource', u'aLine', u'aName']) + var.get(u"this").put(u'children', Js([])) + PyJs_Object_4147_ = Js({}) + var.get(u"this").put(u'sourceContents', PyJs_Object_4147_) + var.get(u"this").put(u'line', (var.get(u"null") if (var.get(u'aLine')==var.get(u"null")) else var.get(u'aLine'))) + var.get(u"this").put(u'column', (var.get(u"null") if (var.get(u'aColumn')==var.get(u"null")) else var.get(u'aColumn'))) + var.get(u"this").put(u'source', (var.get(u"null") if (var.get(u'aSource')==var.get(u"null")) else var.get(u'aSource'))) + var.get(u"this").put(u'name', (var.get(u"null") if (var.get(u'aName')==var.get(u"null")) else var.get(u'aName'))) + var.get(u"this").put(var.get(u'isSourceNode'), var.get(u'true')) + if (var.get(u'aChunks')!=var.get(u"null")): + var.get(u"this").callprop(u'add', var.get(u'aChunks')) + PyJsHoisted_SourceNode_.func_name = u'SourceNode' + var.put(u'SourceNode', PyJsHoisted_SourceNode_) + var.put(u'SourceMapGenerator', var.get(u'require')(Js(u'./source-map-generator')).get(u'SourceMapGenerator')) + var.put(u'util', var.get(u'require')(Js(u'./util'))) + var.put(u'REGEX_NEWLINE', JsRegExp(u'/(\\r?\\n)/')) + var.put(u'NEWLINE_CODE', Js(10.0)) + var.put(u'isSourceNode', Js(u'$$$isSourceNode$$$')) + pass + @Js + def PyJs_SourceNode_fromStringWithSourceMap_4148_(aGeneratedCode, aSourceMapConsumer, aRelativePath, this, arguments, var=var): + var = Scope({u'aSourceMapConsumer':aSourceMapConsumer, u'this':this, u'aRelativePath':aRelativePath, u'aGeneratedCode':aGeneratedCode, u'SourceNode_fromStringWithSourceMap':PyJs_SourceNode_fromStringWithSourceMap_4148_, u'arguments':arguments}, var) + var.registers([u'node', u'lastMapping', u'remainingLines', u'aSourceMapConsumer', u'aGeneratedCode', u'lastGeneratedLine', u'aRelativePath', u'addMappingWithCode', u'shiftNextLine', u'lastGeneratedColumn']) + @Js + def PyJsHoisted_addMappingWithCode_(mapping, code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'mapping':mapping, u'arguments':arguments}, var) + var.registers([u'source', u'code', u'mapping']) + if (PyJsStrictEq(var.get(u'mapping'),var.get(u"null")) or PyJsStrictEq(var.get(u'mapping').get(u'source'),var.get(u'undefined'))): + var.get(u'node').callprop(u'add', var.get(u'code')) + else: + var.put(u'source', (var.get(u'util').callprop(u'join', var.get(u'aRelativePath'), var.get(u'mapping').get(u'source')) if var.get(u'aRelativePath') else var.get(u'mapping').get(u'source'))) + var.get(u'node').callprop(u'add', var.get(u'SourceNode').create(var.get(u'mapping').get(u'originalLine'), var.get(u'mapping').get(u'originalColumn'), var.get(u'source'), var.get(u'code'), var.get(u'mapping').get(u'name'))) + PyJsHoisted_addMappingWithCode_.func_name = u'addMappingWithCode' + var.put(u'addMappingWithCode', PyJsHoisted_addMappingWithCode_) + var.put(u'node', var.get(u'SourceNode').create()) + var.put(u'remainingLines', var.get(u'aGeneratedCode').callprop(u'split', var.get(u'REGEX_NEWLINE'))) + @Js + def PyJs_anonymous_4149_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'newLine', u'lineContents']) + var.put(u'lineContents', var.get(u'remainingLines').callprop(u'shift')) + var.put(u'newLine', (var.get(u'remainingLines').callprop(u'shift') or Js(u''))) + return (var.get(u'lineContents')+var.get(u'newLine')) + PyJs_anonymous_4149_._set_name(u'anonymous') + var.put(u'shiftNextLine', PyJs_anonymous_4149_) + var.put(u'lastGeneratedLine', Js(1.0)) + var.put(u'lastGeneratedColumn', Js(0.0)) + var.put(u'lastMapping', var.get(u"null")) + @Js + def PyJs_anonymous_4150_(mapping, this, arguments, var=var): + var = Scope({u'this':this, u'mapping':mapping, u'arguments':arguments}, var) + var.registers([u'nextLine', u'code', u'mapping']) + if PyJsStrictNeq(var.get(u'lastMapping'),var.get(u"null")): + if (var.get(u'lastGeneratedLine')<var.get(u'mapping').get(u'generatedLine')): + var.get(u'addMappingWithCode')(var.get(u'lastMapping'), var.get(u'shiftNextLine')()) + (var.put(u'lastGeneratedLine',Js(var.get(u'lastGeneratedLine').to_number())+Js(1))-Js(1)) + var.put(u'lastGeneratedColumn', Js(0.0)) + else: + var.put(u'nextLine', var.get(u'remainingLines').get(u'0')) + var.put(u'code', var.get(u'nextLine').callprop(u'substr', Js(0.0), (var.get(u'mapping').get(u'generatedColumn')-var.get(u'lastGeneratedColumn')))) + var.get(u'remainingLines').put(u'0', var.get(u'nextLine').callprop(u'substr', (var.get(u'mapping').get(u'generatedColumn')-var.get(u'lastGeneratedColumn')))) + var.put(u'lastGeneratedColumn', var.get(u'mapping').get(u'generatedColumn')) + var.get(u'addMappingWithCode')(var.get(u'lastMapping'), var.get(u'code')) + var.put(u'lastMapping', var.get(u'mapping')) + return var.get('undefined') + while (var.get(u'lastGeneratedLine')<var.get(u'mapping').get(u'generatedLine')): + var.get(u'node').callprop(u'add', var.get(u'shiftNextLine')()) + (var.put(u'lastGeneratedLine',Js(var.get(u'lastGeneratedLine').to_number())+Js(1))-Js(1)) + if (var.get(u'lastGeneratedColumn')<var.get(u'mapping').get(u'generatedColumn')): + var.put(u'nextLine', var.get(u'remainingLines').get(u'0')) + var.get(u'node').callprop(u'add', var.get(u'nextLine').callprop(u'substr', Js(0.0), var.get(u'mapping').get(u'generatedColumn'))) + var.get(u'remainingLines').put(u'0', var.get(u'nextLine').callprop(u'substr', var.get(u'mapping').get(u'generatedColumn'))) + var.put(u'lastGeneratedColumn', var.get(u'mapping').get(u'generatedColumn')) + var.put(u'lastMapping', var.get(u'mapping')) + PyJs_anonymous_4150_._set_name(u'anonymous') + var.get(u'aSourceMapConsumer').callprop(u'eachMapping', PyJs_anonymous_4150_, var.get(u"this")) + if (var.get(u'remainingLines').get(u'length')>Js(0.0)): + if var.get(u'lastMapping'): + var.get(u'addMappingWithCode')(var.get(u'lastMapping'), var.get(u'shiftNextLine')()) + var.get(u'node').callprop(u'add', var.get(u'remainingLines').callprop(u'join', Js(u''))) + @Js + def PyJs_anonymous_4151_(sourceFile, this, arguments, var=var): + var = Scope({u'this':this, u'sourceFile':sourceFile, u'arguments':arguments}, var) + var.registers([u'content', u'sourceFile']) + var.put(u'content', var.get(u'aSourceMapConsumer').callprop(u'sourceContentFor', var.get(u'sourceFile'))) + if (var.get(u'content')!=var.get(u"null")): + if (var.get(u'aRelativePath')!=var.get(u"null")): + var.put(u'sourceFile', var.get(u'util').callprop(u'join', var.get(u'aRelativePath'), var.get(u'sourceFile'))) + var.get(u'node').callprop(u'setSourceContent', var.get(u'sourceFile'), var.get(u'content')) + PyJs_anonymous_4151_._set_name(u'anonymous') + var.get(u'aSourceMapConsumer').get(u'sources').callprop(u'forEach', PyJs_anonymous_4151_) + return var.get(u'node') + pass + PyJs_SourceNode_fromStringWithSourceMap_4148_._set_name(u'SourceNode_fromStringWithSourceMap') + var.get(u'SourceNode').put(u'fromStringWithSourceMap', PyJs_SourceNode_fromStringWithSourceMap_4148_) + @Js + def PyJs_SourceNode_add_4152_(aChunk, this, arguments, var=var): + var = Scope({u'this':this, u'SourceNode_add':PyJs_SourceNode_add_4152_, u'arguments':arguments, u'aChunk':aChunk}, var) + var.registers([u'aChunk']) + if var.get(u'Array').callprop(u'isArray', var.get(u'aChunk')): + @Js + def PyJs_anonymous_4153_(chunk, this, arguments, var=var): + var = Scope({u'this':this, u'chunk':chunk, u'arguments':arguments}, var) + var.registers([u'chunk']) + var.get(u"this").callprop(u'add', var.get(u'chunk')) + PyJs_anonymous_4153_._set_name(u'anonymous') + var.get(u'aChunk').callprop(u'forEach', PyJs_anonymous_4153_, var.get(u"this")) + else: + if (var.get(u'aChunk').get(var.get(u'isSourceNode')) or PyJsStrictEq(var.get(u'aChunk',throw=False).typeof(),Js(u'string'))): + if var.get(u'aChunk'): + var.get(u"this").get(u'children').callprop(u'push', var.get(u'aChunk')) + else: + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Expected a SourceNode, string, or an array of SourceNodes and strings. Got ')+var.get(u'aChunk')))) + raise PyJsTempException + return var.get(u"this") + PyJs_SourceNode_add_4152_._set_name(u'SourceNode_add') + var.get(u'SourceNode').get(u'prototype').put(u'add', PyJs_SourceNode_add_4152_) + @Js + def PyJs_SourceNode_prepend_4154_(aChunk, this, arguments, var=var): + var = Scope({u'this':this, u'SourceNode_prepend':PyJs_SourceNode_prepend_4154_, u'arguments':arguments, u'aChunk':aChunk}, var) + var.registers([u'i', u'aChunk']) + if var.get(u'Array').callprop(u'isArray', var.get(u'aChunk')): + #for JS loop + var.put(u'i', (var.get(u'aChunk').get(u'length')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + var.get(u"this").callprop(u'prepend', var.get(u'aChunk').get(var.get(u'i'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + else: + if (var.get(u'aChunk').get(var.get(u'isSourceNode')) or PyJsStrictEq(var.get(u'aChunk',throw=False).typeof(),Js(u'string'))): + var.get(u"this").get(u'children').callprop(u'unshift', var.get(u'aChunk')) + else: + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Expected a SourceNode, string, or an array of SourceNodes and strings. Got ')+var.get(u'aChunk')))) + raise PyJsTempException + return var.get(u"this") + PyJs_SourceNode_prepend_4154_._set_name(u'SourceNode_prepend') + var.get(u'SourceNode').get(u'prototype').put(u'prepend', PyJs_SourceNode_prepend_4154_) + @Js + def PyJs_SourceNode_walk_4155_(aFn, this, arguments, var=var): + var = Scope({u'this':this, u'aFn':aFn, u'arguments':arguments, u'SourceNode_walk':PyJs_SourceNode_walk_4155_}, var) + var.registers([u'i', u'chunk', u'aFn', u'len']) + pass + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u"this").get(u'children').get(u'length')) + while (var.get(u'i')<var.get(u'len')): + try: + var.put(u'chunk', var.get(u"this").get(u'children').get(var.get(u'i'))) + if var.get(u'chunk').get(var.get(u'isSourceNode')): + var.get(u'chunk').callprop(u'walk', var.get(u'aFn')) + else: + if PyJsStrictNeq(var.get(u'chunk'),Js(u'')): + PyJs_Object_4156_ = Js({u'source':var.get(u"this").get(u'source'),u'line':var.get(u"this").get(u'line'),u'column':var.get(u"this").get(u'column'),u'name':var.get(u"this").get(u'name')}) + var.get(u'aFn')(var.get(u'chunk'), PyJs_Object_4156_) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJs_SourceNode_walk_4155_._set_name(u'SourceNode_walk') + var.get(u'SourceNode').get(u'prototype').put(u'walk', PyJs_SourceNode_walk_4155_) + @Js + def PyJs_SourceNode_join_4157_(aSep, this, arguments, var=var): + var = Scope({u'this':this, u'SourceNode_join':PyJs_SourceNode_join_4157_, u'aSep':aSep, u'arguments':arguments}, var) + var.registers([u'newChildren', u'i', u'aSep', u'len']) + pass + pass + var.put(u'len', var.get(u"this").get(u'children').get(u'length')) + if (var.get(u'len')>Js(0.0)): + var.put(u'newChildren', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<(var.get(u'len')-Js(1.0))): + try: + var.get(u'newChildren').callprop(u'push', var.get(u"this").get(u'children').get(var.get(u'i'))) + var.get(u'newChildren').callprop(u'push', var.get(u'aSep')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.get(u'newChildren').callprop(u'push', var.get(u"this").get(u'children').get(var.get(u'i'))) + var.get(u"this").put(u'children', var.get(u'newChildren')) + return var.get(u"this") + PyJs_SourceNode_join_4157_._set_name(u'SourceNode_join') + var.get(u'SourceNode').get(u'prototype').put(u'join', PyJs_SourceNode_join_4157_) + @Js + def PyJs_SourceNode_replaceRight_4158_(aPattern, aReplacement, this, arguments, var=var): + var = Scope({u'this':this, u'aPattern':aPattern, u'aReplacement':aReplacement, u'arguments':arguments, u'SourceNode_replaceRight':PyJs_SourceNode_replaceRight_4158_}, var) + var.registers([u'aPattern', u'lastChild', u'aReplacement']) + var.put(u'lastChild', var.get(u"this").get(u'children').get((var.get(u"this").get(u'children').get(u'length')-Js(1.0)))) + if var.get(u'lastChild').get(var.get(u'isSourceNode')): + var.get(u'lastChild').callprop(u'replaceRight', var.get(u'aPattern'), var.get(u'aReplacement')) + else: + if PyJsStrictEq(var.get(u'lastChild',throw=False).typeof(),Js(u'string')): + var.get(u"this").get(u'children').put((var.get(u"this").get(u'children').get(u'length')-Js(1.0)), var.get(u'lastChild').callprop(u'replace', var.get(u'aPattern'), var.get(u'aReplacement'))) + else: + var.get(u"this").get(u'children').callprop(u'push', Js(u'').callprop(u'replace', var.get(u'aPattern'), var.get(u'aReplacement'))) + return var.get(u"this") + PyJs_SourceNode_replaceRight_4158_._set_name(u'SourceNode_replaceRight') + var.get(u'SourceNode').get(u'prototype').put(u'replaceRight', PyJs_SourceNode_replaceRight_4158_) + @Js + def PyJs_SourceNode_setSourceContent_4159_(aSourceFile, aSourceContent, this, arguments, var=var): + var = Scope({u'this':this, u'aSourceContent':aSourceContent, u'aSourceFile':aSourceFile, u'arguments':arguments, u'SourceNode_setSourceContent':PyJs_SourceNode_setSourceContent_4159_}, var) + var.registers([u'aSourceContent', u'aSourceFile']) + var.get(u"this").get(u'sourceContents').put(var.get(u'util').callprop(u'toSetString', var.get(u'aSourceFile')), var.get(u'aSourceContent')) + PyJs_SourceNode_setSourceContent_4159_._set_name(u'SourceNode_setSourceContent') + var.get(u'SourceNode').get(u'prototype').put(u'setSourceContent', PyJs_SourceNode_setSourceContent_4159_) + @Js + def PyJs_SourceNode_walkSourceContents_4160_(aFn, this, arguments, var=var): + var = Scope({u'this':this, u'aFn':aFn, u'arguments':arguments, u'SourceNode_walkSourceContents':PyJs_SourceNode_walkSourceContents_4160_}, var) + var.registers([u'i', u'sources', u'aFn', u'len']) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u"this").get(u'children').get(u'length')) + while (var.get(u'i')<var.get(u'len')): + try: + if var.get(u"this").get(u'children').get(var.get(u'i')).get(var.get(u'isSourceNode')): + var.get(u"this").get(u'children').get(var.get(u'i')).callprop(u'walkSourceContents', var.get(u'aFn')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.put(u'sources', var.get(u'Object').callprop(u'keys', var.get(u"this").get(u'sourceContents'))) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u'sources').get(u'length')) + while (var.get(u'i')<var.get(u'len')): + try: + var.get(u'aFn')(var.get(u'util').callprop(u'fromSetString', var.get(u'sources').get(var.get(u'i'))), var.get(u"this").get(u'sourceContents').get(var.get(u'sources').get(var.get(u'i')))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJs_SourceNode_walkSourceContents_4160_._set_name(u'SourceNode_walkSourceContents') + var.get(u'SourceNode').get(u'prototype').put(u'walkSourceContents', PyJs_SourceNode_walkSourceContents_4160_) + @Js + def PyJs_SourceNode_toString_4161_(this, arguments, var=var): + var = Scope({u'this':this, u'SourceNode_toString':PyJs_SourceNode_toString_4161_, u'arguments':arguments}, var) + var.registers([u'str']) + var.put(u'str', Js(u'')) + @Js + def PyJs_anonymous_4162_(chunk, this, arguments, var=var): + var = Scope({u'this':this, u'chunk':chunk, u'arguments':arguments}, var) + var.registers([u'chunk']) + var.put(u'str', var.get(u'chunk'), u'+') + PyJs_anonymous_4162_._set_name(u'anonymous') + var.get(u"this").callprop(u'walk', PyJs_anonymous_4162_) + return var.get(u'str') + PyJs_SourceNode_toString_4161_._set_name(u'SourceNode_toString') + var.get(u'SourceNode').get(u'prototype').put(u'toString', PyJs_SourceNode_toString_4161_) + @Js + def PyJs_SourceNode_toStringWithSourceMap_4163_(aArgs, this, arguments, var=var): + var = Scope({u'this':this, u'SourceNode_toStringWithSourceMap':PyJs_SourceNode_toStringWithSourceMap_4163_, u'arguments':arguments, u'aArgs':aArgs}, var) + var.registers([u'map', u'lastOriginalName', u'sourceMappingActive', u'aArgs', u'lastOriginalSource', u'lastOriginalLine', u'generated', u'lastOriginalColumn']) + PyJs_Object_4164_ = Js({u'code':Js(u''),u'line':Js(1.0),u'column':Js(0.0)}) + var.put(u'generated', PyJs_Object_4164_) + var.put(u'map', var.get(u'SourceMapGenerator').create(var.get(u'aArgs'))) + var.put(u'sourceMappingActive', Js(False)) + var.put(u'lastOriginalSource', var.get(u"null")) + var.put(u'lastOriginalLine', var.get(u"null")) + var.put(u'lastOriginalColumn', var.get(u"null")) + var.put(u'lastOriginalName', var.get(u"null")) + @Js + def PyJs_anonymous_4165_(chunk, original, this, arguments, var=var): + var = Scope({u'this':this, u'chunk':chunk, u'original':original, u'arguments':arguments}, var) + var.registers([u'length', u'chunk', u'idx', u'original']) + var.get(u'generated').put(u'code', var.get(u'chunk'), u'+') + if ((PyJsStrictNeq(var.get(u'original').get(u'source'),var.get(u"null")) and PyJsStrictNeq(var.get(u'original').get(u'line'),var.get(u"null"))) and PyJsStrictNeq(var.get(u'original').get(u'column'),var.get(u"null"))): + if (((PyJsStrictNeq(var.get(u'lastOriginalSource'),var.get(u'original').get(u'source')) or PyJsStrictNeq(var.get(u'lastOriginalLine'),var.get(u'original').get(u'line'))) or PyJsStrictNeq(var.get(u'lastOriginalColumn'),var.get(u'original').get(u'column'))) or PyJsStrictNeq(var.get(u'lastOriginalName'),var.get(u'original').get(u'name'))): + PyJs_Object_4167_ = Js({u'line':var.get(u'original').get(u'line'),u'column':var.get(u'original').get(u'column')}) + PyJs_Object_4168_ = Js({u'line':var.get(u'generated').get(u'line'),u'column':var.get(u'generated').get(u'column')}) + PyJs_Object_4166_ = Js({u'source':var.get(u'original').get(u'source'),u'original':PyJs_Object_4167_,u'generated':PyJs_Object_4168_,u'name':var.get(u'original').get(u'name')}) + var.get(u'map').callprop(u'addMapping', PyJs_Object_4166_) + var.put(u'lastOriginalSource', var.get(u'original').get(u'source')) + var.put(u'lastOriginalLine', var.get(u'original').get(u'line')) + var.put(u'lastOriginalColumn', var.get(u'original').get(u'column')) + var.put(u'lastOriginalName', var.get(u'original').get(u'name')) + var.put(u'sourceMappingActive', var.get(u'true')) + else: + if var.get(u'sourceMappingActive'): + PyJs_Object_4170_ = Js({u'line':var.get(u'generated').get(u'line'),u'column':var.get(u'generated').get(u'column')}) + PyJs_Object_4169_ = Js({u'generated':PyJs_Object_4170_}) + var.get(u'map').callprop(u'addMapping', PyJs_Object_4169_) + var.put(u'lastOriginalSource', var.get(u"null")) + var.put(u'sourceMappingActive', Js(False)) + #for JS loop + var.put(u'idx', Js(0.0)) + var.put(u'length', var.get(u'chunk').get(u'length')) + while (var.get(u'idx')<var.get(u'length')): + try: + if PyJsStrictEq(var.get(u'chunk').callprop(u'charCodeAt', var.get(u'idx')),var.get(u'NEWLINE_CODE')): + (var.get(u'generated').put(u'line',Js(var.get(u'generated').get(u'line').to_number())+Js(1))-Js(1)) + var.get(u'generated').put(u'column', Js(0.0)) + if PyJsStrictEq((var.get(u'idx')+Js(1.0)),var.get(u'length')): + var.put(u'lastOriginalSource', var.get(u"null")) + var.put(u'sourceMappingActive', Js(False)) + else: + if var.get(u'sourceMappingActive'): + PyJs_Object_4172_ = Js({u'line':var.get(u'original').get(u'line'),u'column':var.get(u'original').get(u'column')}) + PyJs_Object_4173_ = Js({u'line':var.get(u'generated').get(u'line'),u'column':var.get(u'generated').get(u'column')}) + PyJs_Object_4171_ = Js({u'source':var.get(u'original').get(u'source'),u'original':PyJs_Object_4172_,u'generated':PyJs_Object_4173_,u'name':var.get(u'original').get(u'name')}) + var.get(u'map').callprop(u'addMapping', PyJs_Object_4171_) + else: + (var.get(u'generated').put(u'column',Js(var.get(u'generated').get(u'column').to_number())+Js(1))-Js(1)) + finally: + (var.put(u'idx',Js(var.get(u'idx').to_number())+Js(1))-Js(1)) + PyJs_anonymous_4165_._set_name(u'anonymous') + var.get(u"this").callprop(u'walk', PyJs_anonymous_4165_) + @Js + def PyJs_anonymous_4174_(sourceFile, sourceContent, this, arguments, var=var): + var = Scope({u'this':this, u'sourceFile':sourceFile, u'sourceContent':sourceContent, u'arguments':arguments}, var) + var.registers([u'sourceFile', u'sourceContent']) + var.get(u'map').callprop(u'setSourceContent', var.get(u'sourceFile'), var.get(u'sourceContent')) + PyJs_anonymous_4174_._set_name(u'anonymous') + var.get(u"this").callprop(u'walkSourceContents', PyJs_anonymous_4174_) + PyJs_Object_4175_ = Js({u'code':var.get(u'generated').get(u'code'),u'map':var.get(u'map')}) + return PyJs_Object_4175_ + PyJs_SourceNode_toStringWithSourceMap_4163_._set_name(u'SourceNode_toStringWithSourceMap') + var.get(u'SourceNode').get(u'prototype').put(u'toStringWithSourceMap', PyJs_SourceNode_toStringWithSourceMap_4163_) + var.get(u'exports').put(u'SourceNode', var.get(u'SourceNode')) +PyJs_anonymous_4146_._set_name(u'anonymous') +PyJs_Object_4176_ = Js({u'./source-map-generator':Js(516.0),u'./util':Js(518.0)}) +@Js +def PyJs_anonymous_4177_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'normalize', u'urlGenerate', u'exports', u'compareByGeneratedPositionsDeflated', u'join', u'module', u'relative', u'require', u'fromSetString', u'strcmp', u'urlParse', u'dataUrlRegexp', u'identity', u'supportsNullProto', u'compareByGeneratedPositionsInflated', u'isProtoString', u'compareByOriginalPositions', u'urlRegexp', u'getArg', u'toSetString']) + @Js + def PyJsHoisted_normalize_(aPath, this, arguments, var=var): + var = Scope({u'this':this, u'aPath':aPath, u'arguments':arguments}, var) + var.registers([u'url', u'parts', u'up', u'i', u'part', u'isAbsolute', u'aPath', u'path']) + var.put(u'path', var.get(u'aPath')) + var.put(u'url', var.get(u'urlParse')(var.get(u'aPath'))) + if var.get(u'url'): + if var.get(u'url').get(u'path').neg(): + return var.get(u'aPath') + var.put(u'path', var.get(u'url').get(u'path')) + var.put(u'isAbsolute', var.get(u'exports').callprop(u'isAbsolute', var.get(u'path'))) + var.put(u'parts', var.get(u'path').callprop(u'split', JsRegExp(u'/\\/+/'))) + #for JS loop + var.put(u'up', Js(0.0)) + var.put(u'i', (var.get(u'parts').get(u'length')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + var.put(u'part', var.get(u'parts').get(var.get(u'i'))) + if PyJsStrictEq(var.get(u'part'),Js(u'.')): + var.get(u'parts').callprop(u'splice', var.get(u'i'), Js(1.0)) + else: + if PyJsStrictEq(var.get(u'part'),Js(u'..')): + (var.put(u'up',Js(var.get(u'up').to_number())+Js(1))-Js(1)) + else: + if (var.get(u'up')>Js(0.0)): + if PyJsStrictEq(var.get(u'part'),Js(u'')): + var.get(u'parts').callprop(u'splice', (var.get(u'i')+Js(1.0)), var.get(u'up')) + var.put(u'up', Js(0.0)) + else: + var.get(u'parts').callprop(u'splice', var.get(u'i'), Js(2.0)) + (var.put(u'up',Js(var.get(u'up').to_number())-Js(1))+Js(1)) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + var.put(u'path', var.get(u'parts').callprop(u'join', Js(u'/'))) + if PyJsStrictEq(var.get(u'path'),Js(u'')): + var.put(u'path', (Js(u'/') if var.get(u'isAbsolute') else Js(u'.'))) + if var.get(u'url'): + var.get(u'url').put(u'path', var.get(u'path')) + return var.get(u'urlGenerate')(var.get(u'url')) + return var.get(u'path') + PyJsHoisted_normalize_.func_name = u'normalize' + var.put(u'normalize', PyJsHoisted_normalize_) + @Js + def PyJsHoisted_urlGenerate_(aParsedUrl, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'aParsedUrl':aParsedUrl}, var) + var.registers([u'url', u'aParsedUrl']) + var.put(u'url', Js(u'')) + if var.get(u'aParsedUrl').get(u'scheme'): + var.put(u'url', (var.get(u'aParsedUrl').get(u'scheme')+Js(u':')), u'+') + var.put(u'url', Js(u'//'), u'+') + if var.get(u'aParsedUrl').get(u'auth'): + var.put(u'url', (var.get(u'aParsedUrl').get(u'auth')+Js(u'@')), u'+') + if var.get(u'aParsedUrl').get(u'host'): + var.put(u'url', var.get(u'aParsedUrl').get(u'host'), u'+') + if var.get(u'aParsedUrl').get(u'port'): + var.put(u'url', (Js(u':')+var.get(u'aParsedUrl').get(u'port')), u'+') + if var.get(u'aParsedUrl').get(u'path'): + var.put(u'url', var.get(u'aParsedUrl').get(u'path'), u'+') + return var.get(u'url') + PyJsHoisted_urlGenerate_.func_name = u'urlGenerate' + var.put(u'urlGenerate', PyJsHoisted_urlGenerate_) + @Js + def PyJsHoisted_compareByGeneratedPositionsDeflated_(mappingA, mappingB, onlyCompareGenerated, this, arguments, var=var): + var = Scope({u'this':this, u'mappingB':mappingB, u'arguments':arguments, u'onlyCompareGenerated':onlyCompareGenerated, u'mappingA':mappingA}, var) + var.registers([u'mappingA', u'mappingB', u'onlyCompareGenerated', u'cmp']) + var.put(u'cmp', (var.get(u'mappingA').get(u'generatedLine')-var.get(u'mappingB').get(u'generatedLine'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'generatedColumn')-var.get(u'mappingB').get(u'generatedColumn'))) + if (PyJsStrictNeq(var.get(u'cmp'),Js(0.0)) or var.get(u'onlyCompareGenerated')): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'source')-var.get(u'mappingB').get(u'source'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'originalLine')-var.get(u'mappingB').get(u'originalLine'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'originalColumn')-var.get(u'mappingB').get(u'originalColumn'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + return (var.get(u'mappingA').get(u'name')-var.get(u'mappingB').get(u'name')) + PyJsHoisted_compareByGeneratedPositionsDeflated_.func_name = u'compareByGeneratedPositionsDeflated' + var.put(u'compareByGeneratedPositionsDeflated', PyJsHoisted_compareByGeneratedPositionsDeflated_) + @Js + def PyJsHoisted_join_(aRoot, aPath, this, arguments, var=var): + var = Scope({u'aRoot':aRoot, u'aPath':aPath, u'this':this, u'arguments':arguments}, var) + var.registers([u'aRootUrl', u'aRoot', u'aPath', u'joined', u'aPathUrl']) + if PyJsStrictEq(var.get(u'aRoot'),Js(u'')): + var.put(u'aRoot', Js(u'.')) + if PyJsStrictEq(var.get(u'aPath'),Js(u'')): + var.put(u'aPath', Js(u'.')) + var.put(u'aPathUrl', var.get(u'urlParse')(var.get(u'aPath'))) + var.put(u'aRootUrl', var.get(u'urlParse')(var.get(u'aRoot'))) + if var.get(u'aRootUrl'): + var.put(u'aRoot', (var.get(u'aRootUrl').get(u'path') or Js(u'/'))) + if (var.get(u'aPathUrl') and var.get(u'aPathUrl').get(u'scheme').neg()): + if var.get(u'aRootUrl'): + var.get(u'aPathUrl').put(u'scheme', var.get(u'aRootUrl').get(u'scheme')) + return var.get(u'urlGenerate')(var.get(u'aPathUrl')) + if (var.get(u'aPathUrl') or var.get(u'aPath').callprop(u'match', var.get(u'dataUrlRegexp'))): + return var.get(u'aPath') + if ((var.get(u'aRootUrl') and var.get(u'aRootUrl').get(u'host').neg()) and var.get(u'aRootUrl').get(u'path').neg()): + var.get(u'aRootUrl').put(u'host', var.get(u'aPath')) + return var.get(u'urlGenerate')(var.get(u'aRootUrl')) + var.put(u'joined', (var.get(u'aPath') if PyJsStrictEq(var.get(u'aPath').callprop(u'charAt', Js(0.0)),Js(u'/')) else var.get(u'normalize')(((var.get(u'aRoot').callprop(u'replace', JsRegExp(u'/\\/+$/'), Js(u''))+Js(u'/'))+var.get(u'aPath'))))) + if var.get(u'aRootUrl'): + var.get(u'aRootUrl').put(u'path', var.get(u'joined')) + return var.get(u'urlGenerate')(var.get(u'aRootUrl')) + return var.get(u'joined') + PyJsHoisted_join_.func_name = u'join' + var.put(u'join', PyJsHoisted_join_) + @Js + def PyJsHoisted_relative_(aRoot, aPath, this, arguments, var=var): + var = Scope({u'aRoot':aRoot, u'aPath':aPath, u'this':this, u'arguments':arguments}, var) + var.registers([u'aRoot', u'index', u'aPath', u'level']) + if PyJsStrictEq(var.get(u'aRoot'),Js(u'')): + var.put(u'aRoot', Js(u'.')) + var.put(u'aRoot', var.get(u'aRoot').callprop(u'replace', JsRegExp(u'/\\/$/'), Js(u''))) + var.put(u'level', Js(0.0)) + while PyJsStrictNeq(var.get(u'aPath').callprop(u'indexOf', (var.get(u'aRoot')+Js(u'/'))),Js(0.0)): + var.put(u'index', var.get(u'aRoot').callprop(u'lastIndexOf', Js(u'/'))) + if (var.get(u'index')<Js(0.0)): + return var.get(u'aPath') + var.put(u'aRoot', var.get(u'aRoot').callprop(u'slice', Js(0.0), var.get(u'index'))) + if var.get(u'aRoot').callprop(u'match', JsRegExp(u'/^([^\\/]+:\\/)?\\/*$/')): + return var.get(u'aPath') + var.put(u'level',Js(var.get(u'level').to_number())+Js(1)) + return (var.get(u'Array')((var.get(u'level')+Js(1.0))).callprop(u'join', Js(u'../'))+var.get(u'aPath').callprop(u'substr', (var.get(u'aRoot').get(u'length')+Js(1.0)))) + PyJsHoisted_relative_.func_name = u'relative' + var.put(u'relative', PyJsHoisted_relative_) + @Js + def PyJsHoisted_fromSetString_(aStr, this, arguments, var=var): + var = Scope({u'this':this, u'aStr':aStr, u'arguments':arguments}, var) + var.registers([u'aStr']) + if var.get(u'isProtoString')(var.get(u'aStr')): + return var.get(u'aStr').callprop(u'slice', Js(1.0)) + return var.get(u'aStr') + PyJsHoisted_fromSetString_.func_name = u'fromSetString' + var.put(u'fromSetString', PyJsHoisted_fromSetString_) + @Js + def PyJsHoisted_urlParse_(aUrl, this, arguments, var=var): + var = Scope({u'aUrl':aUrl, u'this':this, u'arguments':arguments}, var) + var.registers([u'aUrl', u'match']) + var.put(u'match', var.get(u'aUrl').callprop(u'match', var.get(u'urlRegexp'))) + if var.get(u'match').neg(): + return var.get(u"null") + PyJs_Object_4178_ = Js({u'scheme':var.get(u'match').get(u'1'),u'auth':var.get(u'match').get(u'2'),u'host':var.get(u'match').get(u'3'),u'port':var.get(u'match').get(u'4'),u'path':var.get(u'match').get(u'5')}) + return PyJs_Object_4178_ + PyJsHoisted_urlParse_.func_name = u'urlParse' + var.put(u'urlParse', PyJsHoisted_urlParse_) + @Js + def PyJsHoisted_identity_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u's']) + return var.get(u's') + PyJsHoisted_identity_.func_name = u'identity' + var.put(u'identity', PyJsHoisted_identity_) + @Js + def PyJsHoisted_compareByGeneratedPositionsInflated_(mappingA, mappingB, this, arguments, var=var): + var = Scope({u'this':this, u'mappingB':mappingB, u'arguments':arguments, u'mappingA':mappingA}, var) + var.registers([u'mappingA', u'mappingB', u'cmp']) + var.put(u'cmp', (var.get(u'mappingA').get(u'generatedLine')-var.get(u'mappingB').get(u'generatedLine'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'generatedColumn')-var.get(u'mappingB').get(u'generatedColumn'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', var.get(u'strcmp')(var.get(u'mappingA').get(u'source'), var.get(u'mappingB').get(u'source'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'originalLine')-var.get(u'mappingB').get(u'originalLine'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'originalColumn')-var.get(u'mappingB').get(u'originalColumn'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + return var.get(u'strcmp')(var.get(u'mappingA').get(u'name'), var.get(u'mappingB').get(u'name')) + PyJsHoisted_compareByGeneratedPositionsInflated_.func_name = u'compareByGeneratedPositionsInflated' + var.put(u'compareByGeneratedPositionsInflated', PyJsHoisted_compareByGeneratedPositionsInflated_) + @Js + def PyJsHoisted_isProtoString_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u'i', u'length', u's']) + if var.get(u's').neg(): + return Js(False) + var.put(u'length', var.get(u's').get(u'length')) + if (var.get(u'length')<Js(9.0)): + return Js(False) + def PyJs_LONG_4182_(var=var): + def PyJs_LONG_4181_(var=var): + return ((((PyJsStrictNeq(var.get(u's').callprop(u'charCodeAt', (var.get(u'length')-Js(1.0))),Js(95.0)) or PyJsStrictNeq(var.get(u's').callprop(u'charCodeAt', (var.get(u'length')-Js(2.0))),Js(95.0))) or PyJsStrictNeq(var.get(u's').callprop(u'charCodeAt', (var.get(u'length')-Js(3.0))),Js(111.0))) or PyJsStrictNeq(var.get(u's').callprop(u'charCodeAt', (var.get(u'length')-Js(4.0))),Js(116.0))) or PyJsStrictNeq(var.get(u's').callprop(u'charCodeAt', (var.get(u'length')-Js(5.0))),Js(111.0))) + return ((((PyJs_LONG_4181_() or PyJsStrictNeq(var.get(u's').callprop(u'charCodeAt', (var.get(u'length')-Js(6.0))),Js(114.0))) or PyJsStrictNeq(var.get(u's').callprop(u'charCodeAt', (var.get(u'length')-Js(7.0))),Js(112.0))) or PyJsStrictNeq(var.get(u's').callprop(u'charCodeAt', (var.get(u'length')-Js(8.0))),Js(95.0))) or PyJsStrictNeq(var.get(u's').callprop(u'charCodeAt', (var.get(u'length')-Js(9.0))),Js(95.0))) + if PyJs_LONG_4182_(): + return Js(False) + #for JS loop + var.put(u'i', (var.get(u'length')-Js(10.0))) + while (var.get(u'i')>=Js(0.0)): + try: + if PyJsStrictNeq(var.get(u's').callprop(u'charCodeAt', var.get(u'i')),Js(36.0)): + return Js(False) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + return var.get(u'true') + PyJsHoisted_isProtoString_.func_name = u'isProtoString' + var.put(u'isProtoString', PyJsHoisted_isProtoString_) + @Js + def PyJsHoisted_compareByOriginalPositions_(mappingA, mappingB, onlyCompareOriginal, this, arguments, var=var): + var = Scope({u'this':this, u'onlyCompareOriginal':onlyCompareOriginal, u'mappingB':mappingB, u'arguments':arguments, u'mappingA':mappingA}, var) + var.registers([u'onlyCompareOriginal', u'mappingA', u'mappingB', u'cmp']) + var.put(u'cmp', (var.get(u'mappingA').get(u'source')-var.get(u'mappingB').get(u'source'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'originalLine')-var.get(u'mappingB').get(u'originalLine'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'originalColumn')-var.get(u'mappingB').get(u'originalColumn'))) + if (PyJsStrictNeq(var.get(u'cmp'),Js(0.0)) or var.get(u'onlyCompareOriginal')): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'generatedColumn')-var.get(u'mappingB').get(u'generatedColumn'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'generatedLine')-var.get(u'mappingB').get(u'generatedLine'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + return (var.get(u'mappingA').get(u'name')-var.get(u'mappingB').get(u'name')) + PyJsHoisted_compareByOriginalPositions_.func_name = u'compareByOriginalPositions' + var.put(u'compareByOriginalPositions', PyJsHoisted_compareByOriginalPositions_) + @Js + def PyJsHoisted_strcmp_(aStr1, aStr2, this, arguments, var=var): + var = Scope({u'this':this, u'aStr2':aStr2, u'aStr1':aStr1, u'arguments':arguments}, var) + var.registers([u'aStr2', u'aStr1']) + if PyJsStrictEq(var.get(u'aStr1'),var.get(u'aStr2')): + return Js(0.0) + if (var.get(u'aStr1')>var.get(u'aStr2')): + return Js(1.0) + return (-Js(1.0)) + PyJsHoisted_strcmp_.func_name = u'strcmp' + var.put(u'strcmp', PyJsHoisted_strcmp_) + @Js + def PyJsHoisted_getArg_(aArgs, aName, aDefaultValue, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'aDefaultValue':aDefaultValue, u'aName':aName, u'aArgs':aArgs}, var) + var.registers([u'aDefaultValue', u'aName', u'aArgs']) + if var.get(u'aArgs').contains(var.get(u'aName')): + return var.get(u'aArgs').get(var.get(u'aName')) + else: + if PyJsStrictEq(var.get(u'arguments').get(u'length'),Js(3.0)): + return var.get(u'aDefaultValue') + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'"')+var.get(u'aName'))+Js(u'" is a required argument.')))) + raise PyJsTempException + PyJsHoisted_getArg_.func_name = u'getArg' + var.put(u'getArg', PyJsHoisted_getArg_) + @Js + def PyJsHoisted_toSetString_(aStr, this, arguments, var=var): + var = Scope({u'this':this, u'aStr':aStr, u'arguments':arguments}, var) + var.registers([u'aStr']) + if var.get(u'isProtoString')(var.get(u'aStr')): + return (Js(u'$')+var.get(u'aStr')) + return var.get(u'aStr') + PyJsHoisted_toSetString_.func_name = u'toSetString' + var.put(u'toSetString', PyJsHoisted_toSetString_) + pass + var.get(u'exports').put(u'getArg', var.get(u'getArg')) + var.put(u'urlRegexp', JsRegExp(u'/^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/')) + var.put(u'dataUrlRegexp', JsRegExp(u'/^data:.+\\,.+$/')) + pass + var.get(u'exports').put(u'urlParse', var.get(u'urlParse')) + pass + var.get(u'exports').put(u'urlGenerate', var.get(u'urlGenerate')) + pass + var.get(u'exports').put(u'normalize', var.get(u'normalize')) + pass + var.get(u'exports').put(u'join', var.get(u'join')) + @Js + def PyJs_anonymous_4179_(aPath, this, arguments, var=var): + var = Scope({u'this':this, u'aPath':aPath, u'arguments':arguments}, var) + var.registers([u'aPath']) + return (PyJsStrictEq(var.get(u'aPath').callprop(u'charAt', Js(0.0)),Js(u'/')) or var.get(u'aPath').callprop(u'match', var.get(u'urlRegexp')).neg().neg()) + PyJs_anonymous_4179_._set_name(u'anonymous') + var.get(u'exports').put(u'isAbsolute', PyJs_anonymous_4179_) + pass + var.get(u'exports').put(u'relative', var.get(u'relative')) + @Js + def PyJs_anonymous_4180_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'obj']) + var.put(u'obj', var.get(u'Object').callprop(u'create', var.get(u"null"))) + return var.get(u'obj').contains(Js(u'__proto__')).neg() + PyJs_anonymous_4180_._set_name(u'anonymous') + var.put(u'supportsNullProto', PyJs_anonymous_4180_()) + pass + pass + var.get(u'exports').put(u'toSetString', (var.get(u'identity') if var.get(u'supportsNullProto') else var.get(u'toSetString'))) + pass + var.get(u'exports').put(u'fromSetString', (var.get(u'identity') if var.get(u'supportsNullProto') else var.get(u'fromSetString'))) + pass + pass + var.get(u'exports').put(u'compareByOriginalPositions', var.get(u'compareByOriginalPositions')) + pass + var.get(u'exports').put(u'compareByGeneratedPositionsDeflated', var.get(u'compareByGeneratedPositionsDeflated')) + pass + pass + var.get(u'exports').put(u'compareByGeneratedPositionsInflated', var.get(u'compareByGeneratedPositionsInflated')) +PyJs_anonymous_4177_._set_name(u'anonymous') +PyJs_Object_4183_ = Js({}) +@Js +def PyJs_anonymous_4184_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'exports').put(u'SourceMapGenerator', var.get(u'require')(Js(u'./lib/source-map-generator')).get(u'SourceMapGenerator')) + var.get(u'exports').put(u'SourceMapConsumer', var.get(u'require')(Js(u'./lib/source-map-consumer')).get(u'SourceMapConsumer')) + var.get(u'exports').put(u'SourceNode', var.get(u'require')(Js(u'./lib/source-node')).get(u'SourceNode')) +PyJs_anonymous_4184_._set_name(u'anonymous') +PyJs_Object_4185_ = Js({u'./lib/source-map-consumer':Js(515.0),u'./lib/source-map-generator':Js(516.0),u'./lib/source-node':Js(517.0)}) +@Js +def PyJs_anonymous_4186_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'ansiRegex', u'exports', u'module']) + Js(u'use strict') + var.put(u'ansiRegex', var.get(u'require')(Js(u'ansi-regex'))()) + @Js + def PyJs_anonymous_4187_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return (var.get(u'str').callprop(u'replace', var.get(u'ansiRegex'), Js(u'')) if PyJsStrictEq(var.get(u'str',throw=False).typeof(),Js(u'string')) else var.get(u'str')) + PyJs_anonymous_4187_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_4187_) +PyJs_anonymous_4186_._set_name(u'anonymous') +PyJs_Object_4188_ = Js({u'ansi-regex':Js(2.0)}) +@Js +def PyJs_anonymous_4189_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_4190_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'process', u'hasFlag', u'terminator', u'argv']) + Js(u'use strict') + var.put(u'argv', var.get(u'process').get(u'argv')) + var.put(u'terminator', var.get(u'argv').callprop(u'indexOf', Js(u'--'))) + @Js + def PyJs_anonymous_4191_(flag, this, arguments, var=var): + var = Scope({u'this':this, u'flag':flag, u'arguments':arguments}, var) + var.registers([u'flag', u'pos']) + var.put(u'flag', (Js(u'--')+var.get(u'flag'))) + var.put(u'pos', var.get(u'argv').callprop(u'indexOf', var.get(u'flag'))) + return (PyJsStrictNeq(var.get(u'pos'),(-Js(1.0))) and ((var.get(u'pos')<var.get(u'terminator')) if PyJsStrictNeq(var.get(u'terminator'),(-Js(1.0))) else var.get(u'true'))) + PyJs_anonymous_4191_._set_name(u'anonymous') + var.put(u'hasFlag', PyJs_anonymous_4191_) + @Js + def PyJs_anonymous_4192_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u'process').get(u'env').contains(Js(u'FORCE_COLOR')): + return var.get(u'true') + if ((var.get(u'hasFlag')(Js(u'no-color')) or var.get(u'hasFlag')(Js(u'no-colors'))) or var.get(u'hasFlag')(Js(u'color=false'))): + return Js(False) + if (((var.get(u'hasFlag')(Js(u'color')) or var.get(u'hasFlag')(Js(u'colors'))) or var.get(u'hasFlag')(Js(u'color=true'))) or var.get(u'hasFlag')(Js(u'color=always'))): + return var.get(u'true') + if (var.get(u'process').get(u'stdout') and var.get(u'process').get(u'stdout').get(u'isTTY').neg()): + return Js(False) + if PyJsStrictEq(var.get(u'process').get(u'platform'),Js(u'win32')): + return var.get(u'true') + if var.get(u'process').get(u'env').contains(Js(u'COLORTERM')): + return var.get(u'true') + if PyJsStrictEq(var.get(u'process').get(u'env').get(u'TERM'),Js(u'dumb')): + return Js(False) + if JsRegExp(u'/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i').callprop(u'test', var.get(u'process').get(u'env').get(u'TERM')): + return var.get(u'true') + return Js(False) + PyJs_anonymous_4192_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_4192_()) + PyJs_anonymous_4190_._set_name(u'anonymous') + PyJs_anonymous_4190_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_4189_._set_name(u'anonymous') +PyJs_Object_4193_ = Js({u'_process':Js(531.0)}) +@Js +def PyJs_anonymous_4194_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + @Js + def PyJs_toFastProperties_4195_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments, u'toFastProperties':PyJs_toFastProperties_4195_}, var) + var.registers([u'obj', u'f']) + @Js + def PyJsHoisted_f_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJsHoisted_f_.func_name = u'f' + var.put(u'f', PyJsHoisted_f_) + pass + var.get(u'f').put(u'prototype', var.get(u'obj')) + var.get(u'f').create() + return var.get('undefined') + var.get(u'eval')(var.get(u'obj')) + PyJs_toFastProperties_4195_._set_name(u'toFastProperties') + var.get(u'module').put(u'exports', PyJs_toFastProperties_4195_) +PyJs_anonymous_4194_._set_name(u'anonymous') +PyJs_Object_4196_ = Js({}) +@Js +def PyJs_anonymous_4197_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'arguments').get(u'4').get(u'212').get(u'0').callprop(u'apply', var.get(u'exports'), var.get(u'arguments')) +PyJs_anonymous_4197_._set_name(u'anonymous') +PyJs_Object_4198_ = Js({u'dup':Js(212.0)}) +@Js +def PyJs_anonymous_4199_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'pSlice', u'replacer', u'_throws', u'ok', u'_deepEqual', u'truncate', u'assert', u'expectedException', u'exports', u'hasOwn', u'util', u'getMessage', u'module', u'objectKeys', u'fail', u'objEquiv', u'require', u'isArguments']) + @Js + def PyJsHoisted_replacer_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + if var.get(u'util').callprop(u'isUndefined', var.get(u'value')): + return (Js(u'')+var.get(u'value')) + if (var.get(u'util').callprop(u'isNumber', var.get(u'value')) and var.get(u'isFinite')(var.get(u'value')).neg()): + return var.get(u'value').callprop(u'toString') + if (var.get(u'util').callprop(u'isFunction', var.get(u'value')) or var.get(u'util').callprop(u'isRegExp', var.get(u'value'))): + return var.get(u'value').callprop(u'toString') + return var.get(u'value') + PyJsHoisted_replacer_.func_name = u'replacer' + var.put(u'replacer', PyJsHoisted_replacer_) + @Js + def PyJsHoisted__throws_(shouldThrow, block, expected, message, this, arguments, var=var): + var = Scope({u'this':this, u'shouldThrow':shouldThrow, u'arguments':arguments, u'expected':expected, u'message':message, u'block':block}, var) + var.registers([u'expected', u'shouldThrow', u'message', u'actual', u'block']) + pass + if var.get(u'util').callprop(u'isString', var.get(u'expected')): + var.put(u'message', var.get(u'expected')) + var.put(u'expected', var.get(u"null")) + try: + var.get(u'block')() + except PyJsException as PyJsTempException: + PyJsHolder_65_5622760 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + var.put(u'actual', var.get(u'e')) + finally: + if PyJsHolder_65_5622760 is not None: + var.own[u'e'] = PyJsHolder_65_5622760 + else: + del var.own[u'e'] + del PyJsHolder_65_5622760 + var.put(u'message', ((((Js(u' (')+var.get(u'expected').get(u'name'))+Js(u').')) if (var.get(u'expected') and var.get(u'expected').get(u'name')) else Js(u'.'))+((Js(u' ')+var.get(u'message')) if var.get(u'message') else Js(u'.')))) + if (var.get(u'shouldThrow') and var.get(u'actual').neg()): + var.get(u'fail')(var.get(u'actual'), var.get(u'expected'), (Js(u'Missing expected exception')+var.get(u'message'))) + if (var.get(u'shouldThrow').neg() and var.get(u'expectedException')(var.get(u'actual'), var.get(u'expected'))): + var.get(u'fail')(var.get(u'actual'), var.get(u'expected'), (Js(u'Got unwanted exception')+var.get(u'message'))) + if ((((var.get(u'shouldThrow') and var.get(u'actual')) and var.get(u'expected')) and var.get(u'expectedException')(var.get(u'actual'), var.get(u'expected')).neg()) or (var.get(u'shouldThrow').neg() and var.get(u'actual'))): + PyJsTempException = JsToPyException(var.get(u'actual')) + raise PyJsTempException + PyJsHoisted__throws_.func_name = u'_throws' + var.put(u'_throws', PyJsHoisted__throws_) + @Js + def PyJsHoisted_ok_(value, message, this, arguments, var=var): + var = Scope({u'this':this, u'message':message, u'arguments':arguments, u'value':value}, var) + var.registers([u'message', u'value']) + if var.get(u'value').neg(): + var.get(u'fail')(var.get(u'value'), var.get(u'true'), var.get(u'message'), Js(u'=='), var.get(u'assert').get(u'ok')) + PyJsHoisted_ok_.func_name = u'ok' + var.put(u'ok', PyJsHoisted_ok_) + @Js + def PyJsHoisted__deepEqual_(actual, expected, this, arguments, var=var): + var = Scope({u'expected':expected, u'this':this, u'actual':actual, u'arguments':arguments}, var) + var.registers([u'i', u'expected', u'actual']) + if PyJsStrictEq(var.get(u'actual'),var.get(u'expected')): + return var.get(u'true') + else: + if (var.get(u'util').callprop(u'isBuffer', var.get(u'actual')) and var.get(u'util').callprop(u'isBuffer', var.get(u'expected'))): + if (var.get(u'actual').get(u'length')!=var.get(u'expected').get(u'length')): + return Js(False) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'actual').get(u'length')): + try: + if PyJsStrictNeq(var.get(u'actual').get(var.get(u'i')),var.get(u'expected').get(var.get(u'i'))): + return Js(False) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'true') + else: + if (var.get(u'util').callprop(u'isDate', var.get(u'actual')) and var.get(u'util').callprop(u'isDate', var.get(u'expected'))): + return PyJsStrictEq(var.get(u'actual').callprop(u'getTime'),var.get(u'expected').callprop(u'getTime')) + else: + if (var.get(u'util').callprop(u'isRegExp', var.get(u'actual')) and var.get(u'util').callprop(u'isRegExp', var.get(u'expected'))): + def PyJs_LONG_4205_(var=var): + return ((((PyJsStrictEq(var.get(u'actual').get(u'source'),var.get(u'expected').get(u'source')) and PyJsStrictEq(var.get(u'actual').get(u'global'),var.get(u'expected').get(u'global'))) and PyJsStrictEq(var.get(u'actual').get(u'multiline'),var.get(u'expected').get(u'multiline'))) and PyJsStrictEq(var.get(u'actual').get(u'lastIndex'),var.get(u'expected').get(u'lastIndex'))) and PyJsStrictEq(var.get(u'actual').get(u'ignoreCase'),var.get(u'expected').get(u'ignoreCase'))) + return PyJs_LONG_4205_() + else: + if (var.get(u'util').callprop(u'isObject', var.get(u'actual')).neg() and var.get(u'util').callprop(u'isObject', var.get(u'expected')).neg()): + return (var.get(u'actual')==var.get(u'expected')) + else: + return var.get(u'objEquiv')(var.get(u'actual'), var.get(u'expected')) + PyJsHoisted__deepEqual_.func_name = u'_deepEqual' + var.put(u'_deepEqual', PyJsHoisted__deepEqual_) + @Js + def PyJsHoisted_truncate_(s, n, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments, u'n':n}, var) + var.registers([u's', u'n']) + if var.get(u'util').callprop(u'isString', var.get(u's')): + return (var.get(u's') if (var.get(u's').get(u'length')<var.get(u'n')) else var.get(u's').callprop(u'slice', Js(0.0), var.get(u'n'))) + else: + return var.get(u's') + PyJsHoisted_truncate_.func_name = u'truncate' + var.put(u'truncate', PyJsHoisted_truncate_) + @Js + def PyJsHoisted_expectedException_(actual, expected, this, arguments, var=var): + var = Scope({u'expected':expected, u'this':this, u'actual':actual, u'arguments':arguments}, var) + var.registers([u'expected', u'actual']) + if (var.get(u'actual').neg() or var.get(u'expected').neg()): + return Js(False) + if (var.get(u'Object').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'expected'))==Js(u'[object RegExp]')): + return var.get(u'expected').callprop(u'test', var.get(u'actual')) + else: + if var.get(u'actual').instanceof(var.get(u'expected')): + return var.get(u'true') + else: + PyJs_Object_4209_ = Js({}) + if PyJsStrictEq(var.get(u'expected').callprop(u'call', PyJs_Object_4209_, var.get(u'actual')),var.get(u'true')): + return var.get(u'true') + return Js(False) + PyJsHoisted_expectedException_.func_name = u'expectedException' + var.put(u'expectedException', PyJsHoisted_expectedException_) + @Js + def PyJsHoisted_getMessage_(self, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'arguments':arguments}, var) + var.registers([u'self']) + return ((((var.get(u'truncate')(var.get(u'JSON').callprop(u'stringify', var.get(u'self').get(u'actual'), var.get(u'replacer')), Js(128.0))+Js(u' '))+var.get(u'self').get(u'operator'))+Js(u' '))+var.get(u'truncate')(var.get(u'JSON').callprop(u'stringify', var.get(u'self').get(u'expected'), var.get(u'replacer')), Js(128.0))) + PyJsHoisted_getMessage_.func_name = u'getMessage' + var.put(u'getMessage', PyJsHoisted_getMessage_) + @Js + def PyJsHoisted_fail_(actual, expected, message, operator, stackStartFunction, this, arguments, var=var): + var = Scope({u'operator':operator, u'actual':actual, u'arguments':arguments, u'stackStartFunction':stackStartFunction, u'expected':expected, u'message':message, u'this':this}, var) + var.registers([u'expected', u'operator', u'message', u'actual', u'stackStartFunction']) + PyJs_Object_4201_ = Js({u'message':var.get(u'message'),u'actual':var.get(u'actual'),u'expected':var.get(u'expected'),u'operator':var.get(u'operator'),u'stackStartFunction':var.get(u'stackStartFunction')}) + PyJsTempException = JsToPyException(var.get(u'assert').get(u'AssertionError').create(PyJs_Object_4201_)) + raise PyJsTempException + PyJsHoisted_fail_.func_name = u'fail' + var.put(u'fail', PyJsHoisted_fail_) + @Js + def PyJsHoisted_objEquiv_(a, b, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'aIsArgs', u'ka', u'b', u'kb', u'i', u'key', u'bIsArgs']) + if (var.get(u'util').callprop(u'isNullOrUndefined', var.get(u'a')) or var.get(u'util').callprop(u'isNullOrUndefined', var.get(u'b'))): + return Js(False) + if PyJsStrictNeq(var.get(u'a').get(u'prototype'),var.get(u'b').get(u'prototype')): + return Js(False) + if (var.get(u'util').callprop(u'isPrimitive', var.get(u'a')) or var.get(u'util').callprop(u'isPrimitive', var.get(u'b'))): + return PyJsStrictEq(var.get(u'a'),var.get(u'b')) + var.put(u'aIsArgs', var.get(u'isArguments')(var.get(u'a'))) + var.put(u'bIsArgs', var.get(u'isArguments')(var.get(u'b'))) + if ((var.get(u'aIsArgs') and var.get(u'bIsArgs').neg()) or (var.get(u'aIsArgs').neg() and var.get(u'bIsArgs'))): + return Js(False) + if var.get(u'aIsArgs'): + var.put(u'a', var.get(u'pSlice').callprop(u'call', var.get(u'a'))) + var.put(u'b', var.get(u'pSlice').callprop(u'call', var.get(u'b'))) + return var.get(u'_deepEqual')(var.get(u'a'), var.get(u'b')) + var.put(u'ka', var.get(u'objectKeys')(var.get(u'a'))) + var.put(u'kb', var.get(u'objectKeys')(var.get(u'b'))) + if (var.get(u'ka').get(u'length')!=var.get(u'kb').get(u'length')): + return Js(False) + var.get(u'ka').callprop(u'sort') + var.get(u'kb').callprop(u'sort') + #for JS loop + var.put(u'i', (var.get(u'ka').get(u'length')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + if (var.get(u'ka').get(var.get(u'i'))!=var.get(u'kb').get(var.get(u'i'))): + return Js(False) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + #for JS loop + var.put(u'i', (var.get(u'ka').get(u'length')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + var.put(u'key', var.get(u'ka').get(var.get(u'i'))) + if var.get(u'_deepEqual')(var.get(u'a').get(var.get(u'key')), var.get(u'b').get(var.get(u'key'))).neg(): + return Js(False) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + return var.get(u'true') + PyJsHoisted_objEquiv_.func_name = u'objEquiv' + var.put(u'objEquiv', PyJsHoisted_objEquiv_) + @Js + def PyJsHoisted_isArguments_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + return (var.get(u'Object').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'object'))==Js(u'[object Arguments]')) + PyJsHoisted_isArguments_.func_name = u'isArguments' + var.put(u'isArguments', PyJsHoisted_isArguments_) + var.put(u'util', var.get(u'require')(Js(u'util/'))) + var.put(u'pSlice', var.get(u'Array').get(u'prototype').get(u'slice')) + var.put(u'hasOwn', var.get(u'Object').get(u'prototype').get(u'hasOwnProperty')) + var.put(u'assert', var.get(u'module').put(u'exports', var.get(u'ok'))) + @Js + def PyJs_AssertionError_4200_(options, this, arguments, var=var): + var = Scope({u'this':this, u'AssertionError':PyJs_AssertionError_4200_, u'options':options, u'arguments':arguments}, var) + var.registers([u'next_line', u'err', u'idx', u'stackStartFunction', u'fn_name', u'options', u'out']) + var.get(u"this").put(u'name', Js(u'AssertionError')) + var.get(u"this").put(u'actual', var.get(u'options').get(u'actual')) + var.get(u"this").put(u'expected', var.get(u'options').get(u'expected')) + var.get(u"this").put(u'operator', var.get(u'options').get(u'operator')) + if var.get(u'options').get(u'message'): + var.get(u"this").put(u'message', var.get(u'options').get(u'message')) + var.get(u"this").put(u'generatedMessage', Js(False)) + else: + var.get(u"this").put(u'message', var.get(u'getMessage')(var.get(u"this"))) + var.get(u"this").put(u'generatedMessage', var.get(u'true')) + var.put(u'stackStartFunction', (var.get(u'options').get(u'stackStartFunction') or var.get(u'fail'))) + if var.get(u'Error').get(u'captureStackTrace'): + var.get(u'Error').callprop(u'captureStackTrace', var.get(u"this"), var.get(u'stackStartFunction')) + else: + var.put(u'err', var.get(u'Error').create()) + if var.get(u'err').get(u'stack'): + var.put(u'out', var.get(u'err').get(u'stack')) + var.put(u'fn_name', var.get(u'stackStartFunction').get(u'name')) + var.put(u'idx', var.get(u'out').callprop(u'indexOf', (Js(u'\n')+var.get(u'fn_name')))) + if (var.get(u'idx')>=Js(0.0)): + var.put(u'next_line', var.get(u'out').callprop(u'indexOf', Js(u'\n'), (var.get(u'idx')+Js(1.0)))) + var.put(u'out', var.get(u'out').callprop(u'substring', (var.get(u'next_line')+Js(1.0)))) + var.get(u"this").put(u'stack', var.get(u'out')) + PyJs_AssertionError_4200_._set_name(u'AssertionError') + var.get(u'assert').put(u'AssertionError', PyJs_AssertionError_4200_) + var.get(u'util').callprop(u'inherits', var.get(u'assert').get(u'AssertionError'), var.get(u'Error')) + pass + pass + pass + pass + var.get(u'assert').put(u'fail', var.get(u'fail')) + pass + var.get(u'assert').put(u'ok', var.get(u'ok')) + @Js + def PyJs_equal_4202_(actual, expected, message, this, arguments, var=var): + var = Scope({u'actual':actual, u'this':this, u'equal':PyJs_equal_4202_, u'arguments':arguments, u'expected':expected, u'message':message}, var) + var.registers([u'expected', u'message', u'actual']) + if (var.get(u'actual')!=var.get(u'expected')): + var.get(u'fail')(var.get(u'actual'), var.get(u'expected'), var.get(u'message'), Js(u'=='), var.get(u'assert').get(u'equal')) + PyJs_equal_4202_._set_name(u'equal') + var.get(u'assert').put(u'equal', PyJs_equal_4202_) + @Js + def PyJs_notEqual_4203_(actual, expected, message, this, arguments, var=var): + var = Scope({u'notEqual':PyJs_notEqual_4203_, u'actual':actual, u'this':this, u'arguments':arguments, u'expected':expected, u'message':message}, var) + var.registers([u'expected', u'message', u'actual']) + if (var.get(u'actual')==var.get(u'expected')): + var.get(u'fail')(var.get(u'actual'), var.get(u'expected'), var.get(u'message'), Js(u'!='), var.get(u'assert').get(u'notEqual')) + PyJs_notEqual_4203_._set_name(u'notEqual') + var.get(u'assert').put(u'notEqual', PyJs_notEqual_4203_) + @Js + def PyJs_deepEqual_4204_(actual, expected, message, this, arguments, var=var): + var = Scope({u'actual':actual, u'this':this, u'arguments':arguments, u'expected':expected, u'message':message, u'deepEqual':PyJs_deepEqual_4204_}, var) + var.registers([u'expected', u'message', u'actual']) + if var.get(u'_deepEqual')(var.get(u'actual'), var.get(u'expected')).neg(): + var.get(u'fail')(var.get(u'actual'), var.get(u'expected'), var.get(u'message'), Js(u'deepEqual'), var.get(u'assert').get(u'deepEqual')) + PyJs_deepEqual_4204_._set_name(u'deepEqual') + var.get(u'assert').put(u'deepEqual', PyJs_deepEqual_4204_) + pass + pass + pass + @Js + def PyJs_notDeepEqual_4206_(actual, expected, message, this, arguments, var=var): + var = Scope({u'actual':actual, u'this':this, u'notDeepEqual':PyJs_notDeepEqual_4206_, u'arguments':arguments, u'expected':expected, u'message':message}, var) + var.registers([u'expected', u'message', u'actual']) + if var.get(u'_deepEqual')(var.get(u'actual'), var.get(u'expected')): + var.get(u'fail')(var.get(u'actual'), var.get(u'expected'), var.get(u'message'), Js(u'notDeepEqual'), var.get(u'assert').get(u'notDeepEqual')) + PyJs_notDeepEqual_4206_._set_name(u'notDeepEqual') + var.get(u'assert').put(u'notDeepEqual', PyJs_notDeepEqual_4206_) + @Js + def PyJs_strictEqual_4207_(actual, expected, message, this, arguments, var=var): + var = Scope({u'actual':actual, u'this':this, u'arguments':arguments, u'expected':expected, u'message':message, u'strictEqual':PyJs_strictEqual_4207_}, var) + var.registers([u'expected', u'message', u'actual']) + if PyJsStrictNeq(var.get(u'actual'),var.get(u'expected')): + var.get(u'fail')(var.get(u'actual'), var.get(u'expected'), var.get(u'message'), Js(u'==='), var.get(u'assert').get(u'strictEqual')) + PyJs_strictEqual_4207_._set_name(u'strictEqual') + var.get(u'assert').put(u'strictEqual', PyJs_strictEqual_4207_) + @Js + def PyJs_notStrictEqual_4208_(actual, expected, message, this, arguments, var=var): + var = Scope({u'actual':actual, u'this':this, u'arguments':arguments, u'notStrictEqual':PyJs_notStrictEqual_4208_, u'expected':expected, u'message':message}, var) + var.registers([u'expected', u'message', u'actual']) + if PyJsStrictEq(var.get(u'actual'),var.get(u'expected')): + var.get(u'fail')(var.get(u'actual'), var.get(u'expected'), var.get(u'message'), Js(u'!=='), var.get(u'assert').get(u'notStrictEqual')) + PyJs_notStrictEqual_4208_._set_name(u'notStrictEqual') + var.get(u'assert').put(u'notStrictEqual', PyJs_notStrictEqual_4208_) + pass + pass + @Js + def PyJs_anonymous_4210_(block, error, message, this, arguments, var=var): + var = Scope({u'this':this, u'message':message, u'arguments':arguments, u'block':block, u'error':error}, var) + var.registers([u'message', u'block', u'error']) + var.get(u'_throws').callprop(u'apply', var.get(u"this"), Js([var.get(u'true')]).callprop(u'concat', var.get(u'pSlice').callprop(u'call', var.get(u'arguments')))) + PyJs_anonymous_4210_._set_name(u'anonymous') + var.get(u'assert').put(u'throws', PyJs_anonymous_4210_) + @Js + def PyJs_anonymous_4211_(block, message, this, arguments, var=var): + var = Scope({u'this':this, u'message':message, u'arguments':arguments, u'block':block}, var) + var.registers([u'message', u'block']) + var.get(u'_throws').callprop(u'apply', var.get(u"this"), Js([Js(False)]).callprop(u'concat', var.get(u'pSlice').callprop(u'call', var.get(u'arguments')))) + PyJs_anonymous_4211_._set_name(u'anonymous') + var.get(u'assert').put(u'doesNotThrow', PyJs_anonymous_4211_) + @Js + def PyJs_anonymous_4212_(err, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'err':err}, var) + var.registers([u'err']) + if var.get(u'err'): + PyJsTempException = JsToPyException(var.get(u'err')) + raise PyJsTempException + PyJs_anonymous_4212_._set_name(u'anonymous') + var.get(u'assert').put(u'ifError', PyJs_anonymous_4212_) + @Js + def PyJs_anonymous_4213_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'keys', u'obj', u'key']) + var.put(u'keys', Js([])) + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'hasOwn').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'keys').callprop(u'push', var.get(u'key')) + return var.get(u'keys') + PyJs_anonymous_4213_._set_name(u'anonymous') + var.put(u'objectKeys', (var.get(u'Object').get(u'keys') or PyJs_anonymous_4213_)) +PyJs_anonymous_4199_._set_name(u'anonymous') +PyJs_Object_4214_ = Js({u'util/':Js(534.0)}) +@Js +def PyJs_anonymous_4215_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_4216_ = Js({}) + @Js + def PyJs_anonymous_4217_(PyJsArg_676c6f62616c_, this, arguments, var=var): + var = Scope({u'this':this, u'global':PyJsArg_676c6f62616c_, u'arguments':arguments}, var) + var.registers([u'binarySlice', u'asciiWrite', u'objectWriteUInt16', u'ieee754', u'fromBuffer', u'base64Write', u'fromObject', u'fromString', u'global', u'fromArrayBuffer', u'fromJsonObject', u'asciiToBytes', u'hexSlice', u'slowToString', u'byteLength', u'checked', u'Buffer', u'base64', u'base64ToBytes', u'kMaxLength', u'writeFloat', u'utf8Slice', u'allocate', u'checkInt', u'objectWriteUInt32', u'INVALID_BASE64_RE', u'toHex', u'isArray', u'fromNumber', u'SlowBuffer', u'hexWrite', u'fromArrayLike', u'checkIEEE754', u'utf16leToBytes', u'ucs2Write', u'base64clean', u'asciiSlice', u'checkOffset', u'decodeCodePointsArray', u'fromArray', u'binaryWrite', u'fromTypedArray', u'rootParent', u'utf16leSlice', u'typedArraySupport', u'utf8Write', u'utf8ToBytes', u'writeDouble', u'MAX_ARGUMENTS_LENGTH', u'blitBuffer', u'base64Slice', u'stringtrim']) + @Js + def PyJsHoisted_binarySlice_(buf, start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'i', u'start', u'end', u'buf', u'ret']) + var.put(u'ret', Js(u'')) + var.put(u'end', var.get(u'Math').callprop(u'min', var.get(u'buf').get(u'length'), var.get(u'end'))) + #for JS loop + var.put(u'i', var.get(u'start')) + while (var.get(u'i')<var.get(u'end')): + try: + var.put(u'ret', var.get(u'String').callprop(u'fromCharCode', var.get(u'buf').get(var.get(u'i'))), u'+') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'ret') + PyJsHoisted_binarySlice_.func_name = u'binarySlice' + var.put(u'binarySlice', PyJsHoisted_binarySlice_) + @Js + def PyJsHoisted_objectWriteUInt16_(buf, value, offset, littleEndian, this, arguments, var=var): + var = Scope({u'arguments':arguments, u'offset':offset, u'this':this, u'littleEndian':littleEndian, u'buf':buf, u'value':value}, var) + var.registers([u'i', u'j', u'value', u'offset', u'littleEndian', u'buf']) + if (var.get(u'value')<Js(0.0)): + var.put(u'value', ((Js(65535)+var.get(u'value'))+Js(1.0))) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'j', var.get(u'Math').callprop(u'min', (var.get(u'buf').get(u'length')-var.get(u'offset')), Js(2.0))) + while (var.get(u'i')<var.get(u'j')): + try: + var.get(u'buf').put((var.get(u'offset')+var.get(u'i')), PyJsBshift((var.get(u'value')&(Js(255)<<(Js(8.0)*(var.get(u'i') if var.get(u'littleEndian') else (Js(1.0)-var.get(u'i')))))),((var.get(u'i') if var.get(u'littleEndian') else (Js(1.0)-var.get(u'i')))*Js(8.0)))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJsHoisted_objectWriteUInt16_.func_name = u'objectWriteUInt16' + var.put(u'objectWriteUInt16', PyJsHoisted_objectWriteUInt16_) + @Js + def PyJsHoisted_hexSlice_(buf, start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'end', u'i', u'len', u'start', u'buf', u'out']) + var.put(u'len', var.get(u'buf').get(u'length')) + if (var.get(u'start').neg() or (var.get(u'start')<Js(0.0))): + var.put(u'start', Js(0.0)) + if ((var.get(u'end').neg() or (var.get(u'end')<Js(0.0))) or (var.get(u'end')>var.get(u'len'))): + var.put(u'end', var.get(u'len')) + var.put(u'out', Js(u'')) + #for JS loop + var.put(u'i', var.get(u'start')) + while (var.get(u'i')<var.get(u'end')): + try: + var.put(u'out', var.get(u'toHex')(var.get(u'buf').get(var.get(u'i'))), u'+') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'out') + PyJsHoisted_hexSlice_.func_name = u'hexSlice' + var.put(u'hexSlice', PyJsHoisted_hexSlice_) + @Js + def PyJsHoisted_fromBuffer_(that, buffer, this, arguments, var=var): + var = Scope({u'buffer':buffer, u'this':this, u'arguments':arguments, u'that':that}, var) + var.registers([u'buffer', u'length', u'that']) + var.put(u'length', (var.get(u'checked')(var.get(u'buffer').get(u'length'))|Js(0.0))) + var.put(u'that', var.get(u'allocate')(var.get(u'that'), var.get(u'length'))) + var.get(u'buffer').callprop(u'copy', var.get(u'that'), Js(0.0), Js(0.0), var.get(u'length')) + return var.get(u'that') + PyJsHoisted_fromBuffer_.func_name = u'fromBuffer' + var.put(u'fromBuffer', PyJsHoisted_fromBuffer_) + @Js + def PyJsHoisted_base64Write_(buf, string, offset, length, this, arguments, var=var): + var = Scope({u'length':length, u'string':string, u'offset':offset, u'this':this, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'length', u'buf', u'string', u'offset']) + return var.get(u'blitBuffer')(var.get(u'base64ToBytes')(var.get(u'string')), var.get(u'buf'), var.get(u'offset'), var.get(u'length')) + PyJsHoisted_base64Write_.func_name = u'base64Write' + var.put(u'base64Write', PyJsHoisted_base64Write_) + @Js + def PyJsHoisted_fromObject_(that, object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments, u'that':that}, var) + var.registers([u'object', u'that']) + if var.get(u'Buffer').callprop(u'isBuffer', var.get(u'object')): + return var.get(u'fromBuffer')(var.get(u'that'), var.get(u'object')) + if var.get(u'isArray')(var.get(u'object')): + return var.get(u'fromArray')(var.get(u'that'), var.get(u'object')) + if (var.get(u'object')==var.get(u"null")): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'must start with number, buffer, array or string'))) + raise PyJsTempException + if PyJsStrictNeq(var.get(u'ArrayBuffer',throw=False).typeof(),Js(u'undefined')): + if var.get(u'object').get(u'buffer').instanceof(var.get(u'ArrayBuffer')): + return var.get(u'fromTypedArray')(var.get(u'that'), var.get(u'object')) + if var.get(u'object').instanceof(var.get(u'ArrayBuffer')): + return var.get(u'fromArrayBuffer')(var.get(u'that'), var.get(u'object')) + if var.get(u'object').get(u'length'): + return var.get(u'fromArrayLike')(var.get(u'that'), var.get(u'object')) + return var.get(u'fromJsonObject')(var.get(u'that'), var.get(u'object')) + PyJsHoisted_fromObject_.func_name = u'fromObject' + var.put(u'fromObject', PyJsHoisted_fromObject_) + @Js + def PyJsHoisted_fromString_(that, string, encoding, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'encoding':encoding, u'string':string, u'that':that}, var) + var.registers([u'length', u'encoding', u'string', u'that']) + if (PyJsStrictNeq(var.get(u'encoding',throw=False).typeof(),Js(u'string')) or PyJsStrictEq(var.get(u'encoding'),Js(u''))): + var.put(u'encoding', Js(u'utf8')) + var.put(u'length', (var.get(u'byteLength')(var.get(u'string'), var.get(u'encoding'))|Js(0.0))) + var.put(u'that', var.get(u'allocate')(var.get(u'that'), var.get(u'length'))) + var.get(u'that').callprop(u'write', var.get(u'string'), var.get(u'encoding')) + return var.get(u'that') + PyJsHoisted_fromString_.func_name = u'fromString' + var.put(u'fromString', PyJsHoisted_fromString_) + @Js + def PyJsHoisted_fromArrayBuffer_(that, array, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'arguments':arguments, u'that':that}, var) + var.registers([u'array', u'that']) + var.get(u'array').get(u'byteLength') + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.put(u'that', var.get(u'Uint8Array').create(var.get(u'array'))) + var.get(u'that').put(u'__proto__', var.get(u'Buffer').get(u'prototype')) + else: + var.put(u'that', var.get(u'fromTypedArray')(var.get(u'that'), var.get(u'Uint8Array').create(var.get(u'array')))) + return var.get(u'that') + PyJsHoisted_fromArrayBuffer_.func_name = u'fromArrayBuffer' + var.put(u'fromArrayBuffer', PyJsHoisted_fromArrayBuffer_) + @Js + def PyJsHoisted_fromJsonObject_(that, object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments, u'that':that}, var) + var.registers([u'i', u'array', u'object', u'length', u'that']) + pass + var.put(u'length', Js(0.0)) + if (PyJsStrictEq(var.get(u'object').get(u'type'),Js(u'Buffer')) and var.get(u'isArray')(var.get(u'object').get(u'data'))): + var.put(u'array', var.get(u'object').get(u'data')) + var.put(u'length', (var.get(u'checked')(var.get(u'array').get(u'length'))|Js(0.0))) + var.put(u'that', var.get(u'allocate')(var.get(u'that'), var.get(u'length'))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'length')): + try: + var.get(u'that').put(var.get(u'i'), (var.get(u'array').get(var.get(u'i'))&Js(255.0))) + finally: + var.put(u'i', Js(1.0), u'+') + return var.get(u'that') + PyJsHoisted_fromJsonObject_.func_name = u'fromJsonObject' + var.put(u'fromJsonObject', PyJsHoisted_fromJsonObject_) + @Js + def PyJsHoisted_asciiToBytes_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'byteArray', u'i', u'str']) + var.put(u'byteArray', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'str').get(u'length')): + try: + var.get(u'byteArray').callprop(u'push', (var.get(u'str').callprop(u'charCodeAt', var.get(u'i'))&Js(255))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'byteArray') + PyJsHoisted_asciiToBytes_.func_name = u'asciiToBytes' + var.put(u'asciiToBytes', PyJsHoisted_asciiToBytes_) + @Js + def PyJsHoisted_slowToString_(encoding, start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'arguments':arguments, u'encoding':encoding}, var) + var.registers([u'start', u'loweredCase', u'end', u'encoding']) + var.put(u'loweredCase', Js(False)) + var.put(u'start', (var.get(u'start')|Js(0.0))) + var.put(u'end', (var.get(u"this").get(u'length') if (PyJsStrictEq(var.get(u'end'),var.get(u'undefined')) or PyJsStrictEq(var.get(u'end'),var.get(u'Infinity'))) else (var.get(u'end')|Js(0.0)))) + if var.get(u'encoding').neg(): + var.put(u'encoding', Js(u'utf8')) + if (var.get(u'start')<Js(0.0)): + var.put(u'start', Js(0.0)) + if (var.get(u'end')>var.get(u"this").get(u'length')): + var.put(u'end', var.get(u"this").get(u'length')) + if (var.get(u'end')<=var.get(u'start')): + return Js(u'') + while var.get(u'true'): + while 1: + SWITCHED = False + CONDITION = (var.get(u'encoding')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hex')): + SWITCHED = True + return var.get(u'hexSlice')(var.get(u"this"), var.get(u'start'), var.get(u'end')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf8')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf-8')): + SWITCHED = True + return var.get(u'utf8Slice')(var.get(u"this"), var.get(u'start'), var.get(u'end')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ascii')): + SWITCHED = True + return var.get(u'asciiSlice')(var.get(u"this"), var.get(u'start'), var.get(u'end')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'binary')): + SWITCHED = True + return var.get(u'binarySlice')(var.get(u"this"), var.get(u'start'), var.get(u'end')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'base64')): + SWITCHED = True + return var.get(u'base64Slice')(var.get(u"this"), var.get(u'start'), var.get(u'end')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ucs2')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ucs-2')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf16le')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf-16le')): + SWITCHED = True + return var.get(u'utf16leSlice')(var.get(u"this"), var.get(u'start'), var.get(u'end')) + if True: + SWITCHED = True + if var.get(u'loweredCase'): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Unknown encoding: ')+var.get(u'encoding')))) + raise PyJsTempException + var.put(u'encoding', (var.get(u'encoding')+Js(u'')).callprop(u'toLowerCase')) + var.put(u'loweredCase', var.get(u'true')) + SWITCHED = True + break + PyJsHoisted_slowToString_.func_name = u'slowToString' + var.put(u'slowToString', PyJsHoisted_slowToString_) + @Js + def PyJsHoisted_byteLength_(string, encoding, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'string':string, u'encoding':encoding}, var) + var.registers([u'loweredCase', u'string', u'len', u'encoding']) + if PyJsStrictNeq(var.get(u'string',throw=False).typeof(),Js(u'string')): + var.put(u'string', (Js(u'')+var.get(u'string'))) + var.put(u'len', var.get(u'string').get(u'length')) + if PyJsStrictEq(var.get(u'len'),Js(0.0)): + return Js(0.0) + var.put(u'loweredCase', Js(False)) + #for JS loop + + while 1: + while 1: + SWITCHED = False + CONDITION = (var.get(u'encoding')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ascii')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'binary')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'raw')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'raws')): + SWITCHED = True + return var.get(u'len') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf8')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf-8')): + SWITCHED = True + return var.get(u'utf8ToBytes')(var.get(u'string')).get(u'length') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ucs2')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ucs-2')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf16le')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf-16le')): + SWITCHED = True + return (var.get(u'len')*Js(2.0)) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hex')): + SWITCHED = True + return PyJsBshift(var.get(u'len'),Js(1.0)) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'base64')): + SWITCHED = True + return var.get(u'base64ToBytes')(var.get(u'string')).get(u'length') + if True: + SWITCHED = True + if var.get(u'loweredCase'): + return var.get(u'utf8ToBytes')(var.get(u'string')).get(u'length') + var.put(u'encoding', (Js(u'')+var.get(u'encoding')).callprop(u'toLowerCase')) + var.put(u'loweredCase', var.get(u'true')) + SWITCHED = True + break + + PyJsHoisted_byteLength_.func_name = u'byteLength' + var.put(u'byteLength', PyJsHoisted_byteLength_) + @Js + def PyJsHoisted_checked_(length, this, arguments, var=var): + var = Scope({u'this':this, u'length':length, u'arguments':arguments}, var) + var.registers([u'length']) + if (var.get(u'length')>=var.get(u'kMaxLength')()): + PyJsTempException = JsToPyException(var.get(u'RangeError').create((((Js(u'Attempt to allocate Buffer larger than maximum ')+Js(u'size: 0x'))+var.get(u'kMaxLength')().callprop(u'toString', Js(16.0)))+Js(u' bytes')))) + raise PyJsTempException + return (var.get(u'length')|Js(0.0)) + PyJsHoisted_checked_.func_name = u'checked' + var.put(u'checked', PyJsHoisted_checked_) + @Js + def PyJsHoisted_Buffer_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + if var.get(u"this").instanceof(var.get(u'Buffer')).neg(): + if (var.get(u'arguments').get(u'length')>Js(1.0)): + return var.get(u'Buffer').create(var.get(u'arg'), var.get(u'arguments').get(u'1')) + return var.get(u'Buffer').create(var.get(u'arg')) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT').neg(): + var.get(u"this").put(u'length', Js(0.0)) + var.get(u"this").put(u'parent', var.get(u'undefined')) + if PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'number')): + return var.get(u'fromNumber')(var.get(u"this"), var.get(u'arg')) + if PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'string')): + return var.get(u'fromString')(var.get(u"this"), var.get(u'arg'), (var.get(u'arguments').get(u'1') if (var.get(u'arguments').get(u'length')>Js(1.0)) else Js(u'utf8'))) + return var.get(u'fromObject')(var.get(u"this"), var.get(u'arg')) + PyJsHoisted_Buffer_.func_name = u'Buffer' + var.put(u'Buffer', PyJsHoisted_Buffer_) + @Js + def PyJsHoisted_asciiSlice_(buf, start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'i', u'start', u'end', u'buf', u'ret']) + var.put(u'ret', Js(u'')) + var.put(u'end', var.get(u'Math').callprop(u'min', var.get(u'buf').get(u'length'), var.get(u'end'))) + #for JS loop + var.put(u'i', var.get(u'start')) + while (var.get(u'i')<var.get(u'end')): + try: + var.put(u'ret', var.get(u'String').callprop(u'fromCharCode', (var.get(u'buf').get(var.get(u'i'))&Js(127))), u'+') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'ret') + PyJsHoisted_asciiSlice_.func_name = u'asciiSlice' + var.put(u'asciiSlice', PyJsHoisted_asciiSlice_) + @Js + def PyJsHoisted_base64ToBytes_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return var.get(u'base64').callprop(u'toByteArray', var.get(u'base64clean')(var.get(u'str'))) + PyJsHoisted_base64ToBytes_.func_name = u'base64ToBytes' + var.put(u'base64ToBytes', PyJsHoisted_base64ToBytes_) + @Js + def PyJsHoisted_kMaxLength_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return (Js(2147483647) if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT') else Js(1073741823)) + PyJsHoisted_kMaxLength_.func_name = u'kMaxLength' + var.put(u'kMaxLength', PyJsHoisted_kMaxLength_) + @Js + def PyJsHoisted_writeFloat_(buf, value, offset, littleEndian, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'arguments':arguments, u'offset':offset, u'this':this, u'littleEndian':littleEndian, u'buf':buf, u'value':value}, var) + var.registers([u'littleEndian', u'noAssert', u'buf', u'value', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkIEEE754')(var.get(u'buf'), var.get(u'value'), var.get(u'offset'), Js(4.0), Js(3.4028234663852886e+38), (-Js(3.4028234663852886e+38))) + var.get(u'ieee754').callprop(u'write', var.get(u'buf'), var.get(u'value'), var.get(u'offset'), var.get(u'littleEndian'), Js(23.0), Js(4.0)) + return (var.get(u'offset')+Js(4.0)) + PyJsHoisted_writeFloat_.func_name = u'writeFloat' + var.put(u'writeFloat', PyJsHoisted_writeFloat_) + @Js + def PyJsHoisted_utf8Slice_(buf, start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'codePoint', u'fourthByte', u'firstByte', u'start', u'i', u'res', u'tempCodePoint', u'bytesPerSequence', u'secondByte', u'end', u'buf', u'thirdByte']) + var.put(u'end', var.get(u'Math').callprop(u'min', var.get(u'buf').get(u'length'), var.get(u'end'))) + var.put(u'res', Js([])) + var.put(u'i', var.get(u'start')) + while (var.get(u'i')<var.get(u'end')): + var.put(u'firstByte', var.get(u'buf').get(var.get(u'i'))) + var.put(u'codePoint', var.get(u"null")) + var.put(u'bytesPerSequence', (Js(4.0) if (var.get(u'firstByte')>Js(239)) else (Js(3.0) if (var.get(u'firstByte')>Js(223)) else (Js(2.0) if (var.get(u'firstByte')>Js(191)) else Js(1.0))))) + if ((var.get(u'i')+var.get(u'bytesPerSequence'))<=var.get(u'end')): + pass + while 1: + SWITCHED = False + CONDITION = (var.get(u'bytesPerSequence')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(1.0)): + SWITCHED = True + if (var.get(u'firstByte')<Js(128)): + var.put(u'codePoint', var.get(u'firstByte')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(2.0)): + SWITCHED = True + var.put(u'secondByte', var.get(u'buf').get((var.get(u'i')+Js(1.0)))) + if PyJsStrictEq((var.get(u'secondByte')&Js(192)),Js(128)): + var.put(u'tempCodePoint', (((var.get(u'firstByte')&Js(31))<<Js(6))|(var.get(u'secondByte')&Js(63)))) + if (var.get(u'tempCodePoint')>Js(127)): + var.put(u'codePoint', var.get(u'tempCodePoint')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(3.0)): + SWITCHED = True + var.put(u'secondByte', var.get(u'buf').get((var.get(u'i')+Js(1.0)))) + var.put(u'thirdByte', var.get(u'buf').get((var.get(u'i')+Js(2.0)))) + if (PyJsStrictEq((var.get(u'secondByte')&Js(192)),Js(128)) and PyJsStrictEq((var.get(u'thirdByte')&Js(192)),Js(128))): + var.put(u'tempCodePoint', ((((var.get(u'firstByte')&Js(15))<<Js(12))|((var.get(u'secondByte')&Js(63))<<Js(6)))|(var.get(u'thirdByte')&Js(63)))) + if ((var.get(u'tempCodePoint')>Js(2047)) and ((var.get(u'tempCodePoint')<Js(55296)) or (var.get(u'tempCodePoint')>Js(57343)))): + var.put(u'codePoint', var.get(u'tempCodePoint')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(4.0)): + SWITCHED = True + var.put(u'secondByte', var.get(u'buf').get((var.get(u'i')+Js(1.0)))) + var.put(u'thirdByte', var.get(u'buf').get((var.get(u'i')+Js(2.0)))) + var.put(u'fourthByte', var.get(u'buf').get((var.get(u'i')+Js(3.0)))) + if ((PyJsStrictEq((var.get(u'secondByte')&Js(192)),Js(128)) and PyJsStrictEq((var.get(u'thirdByte')&Js(192)),Js(128))) and PyJsStrictEq((var.get(u'fourthByte')&Js(192)),Js(128))): + var.put(u'tempCodePoint', (((((var.get(u'firstByte')&Js(15))<<Js(18))|((var.get(u'secondByte')&Js(63))<<Js(12)))|((var.get(u'thirdByte')&Js(63))<<Js(6)))|(var.get(u'fourthByte')&Js(63)))) + if ((var.get(u'tempCodePoint')>Js(65535)) and (var.get(u'tempCodePoint')<Js(1114112))): + var.put(u'codePoint', var.get(u'tempCodePoint')) + SWITCHED = True + break + if PyJsStrictEq(var.get(u'codePoint'),var.get(u"null")): + var.put(u'codePoint', Js(65533)) + var.put(u'bytesPerSequence', Js(1.0)) + else: + if (var.get(u'codePoint')>Js(65535)): + var.put(u'codePoint', Js(65536), u'-') + var.get(u'res').callprop(u'push', ((PyJsBshift(var.get(u'codePoint'),Js(10.0))&Js(1023))|Js(55296))) + var.put(u'codePoint', (Js(56320)|(var.get(u'codePoint')&Js(1023)))) + var.get(u'res').callprop(u'push', var.get(u'codePoint')) + var.put(u'i', var.get(u'bytesPerSequence'), u'+') + return var.get(u'decodeCodePointsArray')(var.get(u'res')) + PyJsHoisted_utf8Slice_.func_name = u'utf8Slice' + var.put(u'utf8Slice', PyJsHoisted_utf8Slice_) + @Js + def PyJsHoisted_allocate_(that, length, this, arguments, var=var): + var = Scope({u'this':this, u'length':length, u'arguments':arguments, u'that':that}, var) + var.registers([u'fromPool', u'length', u'that']) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.put(u'that', var.get(u'Uint8Array').create(var.get(u'length'))) + var.get(u'that').put(u'__proto__', var.get(u'Buffer').get(u'prototype')) + else: + var.get(u'that').put(u'length', var.get(u'length')) + var.put(u'fromPool', (PyJsStrictNeq(var.get(u'length'),Js(0.0)) and (var.get(u'length')<=PyJsBshift(var.get(u'Buffer').get(u'poolSize'),Js(1.0))))) + if var.get(u'fromPool'): + var.get(u'that').put(u'parent', var.get(u'rootParent')) + return var.get(u'that') + PyJsHoisted_allocate_.func_name = u'allocate' + var.put(u'allocate', PyJsHoisted_allocate_) + @Js + def PyJsHoisted_checkInt_(buf, value, offset, ext, max, min, this, arguments, var=var): + var = Scope({u'min':min, u'this':this, u'max':max, u'value':value, u'ext':ext, u'arguments':arguments, u'offset':offset, u'buf':buf}, var) + var.registers([u'min', u'max', u'value', u'ext', u'offset', u'buf']) + if var.get(u'Buffer').callprop(u'isBuffer', var.get(u'buf')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'buffer must be a Buffer instance'))) + raise PyJsTempException + if ((var.get(u'value')>var.get(u'max')) or (var.get(u'value')<var.get(u'min'))): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'value is out of bounds'))) + raise PyJsTempException + if ((var.get(u'offset')+var.get(u'ext'))>var.get(u'buf').get(u'length')): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'index out of range'))) + raise PyJsTempException + PyJsHoisted_checkInt_.func_name = u'checkInt' + var.put(u'checkInt', PyJsHoisted_checkInt_) + @Js + def PyJsHoisted_objectWriteUInt32_(buf, value, offset, littleEndian, this, arguments, var=var): + var = Scope({u'arguments':arguments, u'offset':offset, u'this':this, u'littleEndian':littleEndian, u'buf':buf, u'value':value}, var) + var.registers([u'i', u'j', u'value', u'offset', u'littleEndian', u'buf']) + if (var.get(u'value')<Js(0.0)): + var.put(u'value', ((Js(4294967295)+var.get(u'value'))+Js(1.0))) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'j', var.get(u'Math').callprop(u'min', (var.get(u'buf').get(u'length')-var.get(u'offset')), Js(4.0))) + while (var.get(u'i')<var.get(u'j')): + try: + var.get(u'buf').put((var.get(u'offset')+var.get(u'i')), (PyJsBshift(var.get(u'value'),((var.get(u'i') if var.get(u'littleEndian') else (Js(3.0)-var.get(u'i')))*Js(8.0)))&Js(255))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJsHoisted_objectWriteUInt32_.func_name = u'objectWriteUInt32' + var.put(u'objectWriteUInt32', PyJsHoisted_objectWriteUInt32_) + @Js + def PyJsHoisted_toHex_(n, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'n':n}, var) + var.registers([u'n']) + if (var.get(u'n')<Js(16.0)): + return (Js(u'0')+var.get(u'n').callprop(u'toString', Js(16.0))) + return var.get(u'n').callprop(u'toString', Js(16.0)) + PyJsHoisted_toHex_.func_name = u'toHex' + var.put(u'toHex', PyJsHoisted_toHex_) + @Js + def PyJsHoisted_asciiWrite_(buf, string, offset, length, this, arguments, var=var): + var = Scope({u'length':length, u'string':string, u'offset':offset, u'this':this, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'length', u'buf', u'string', u'offset']) + return var.get(u'blitBuffer')(var.get(u'asciiToBytes')(var.get(u'string')), var.get(u'buf'), var.get(u'offset'), var.get(u'length')) + PyJsHoisted_asciiWrite_.func_name = u'asciiWrite' + var.put(u'asciiWrite', PyJsHoisted_asciiWrite_) + @Js + def PyJsHoisted_fromNumber_(that, length, this, arguments, var=var): + var = Scope({u'this':this, u'length':length, u'arguments':arguments, u'that':that}, var) + var.registers([u'i', u'length', u'that']) + var.put(u'that', var.get(u'allocate')(var.get(u'that'), (Js(0.0) if (var.get(u'length')<Js(0.0)) else (var.get(u'checked')(var.get(u'length'))|Js(0.0))))) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT').neg(): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'length')): + try: + var.get(u'that').put(var.get(u'i'), Js(0.0)) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'that') + PyJsHoisted_fromNumber_.func_name = u'fromNumber' + var.put(u'fromNumber', PyJsHoisted_fromNumber_) + @Js + def PyJsHoisted_SlowBuffer_(subject, encoding, this, arguments, var=var): + var = Scope({u'this':this, u'encoding':encoding, u'arguments':arguments, u'subject':subject}, var) + var.registers([u'encoding', u'buf', u'subject']) + if var.get(u"this").instanceof(var.get(u'SlowBuffer')).neg(): + return var.get(u'SlowBuffer').create(var.get(u'subject'), var.get(u'encoding')) + var.put(u'buf', var.get(u'Buffer').create(var.get(u'subject'), var.get(u'encoding'))) + var.get(u'buf').delete(u'parent') + return var.get(u'buf') + PyJsHoisted_SlowBuffer_.func_name = u'SlowBuffer' + var.put(u'SlowBuffer', PyJsHoisted_SlowBuffer_) + @Js + def PyJsHoisted_hexWrite_(buf, string, offset, length, this, arguments, var=var): + var = Scope({u'length':length, u'string':string, u'offset':offset, u'this':this, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'string', u'i', u'strLen', u'parsed', u'length', u'offset', u'buf', u'remaining']) + var.put(u'offset', (var.get(u'Number')(var.get(u'offset')) or Js(0.0))) + var.put(u'remaining', (var.get(u'buf').get(u'length')-var.get(u'offset'))) + if var.get(u'length').neg(): + var.put(u'length', var.get(u'remaining')) + else: + var.put(u'length', var.get(u'Number')(var.get(u'length'))) + if (var.get(u'length')>var.get(u'remaining')): + var.put(u'length', var.get(u'remaining')) + var.put(u'strLen', var.get(u'string').get(u'length')) + if PyJsStrictNeq((var.get(u'strLen')%Js(2.0)),Js(0.0)): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Invalid hex string'))) + raise PyJsTempException + if (var.get(u'length')>(var.get(u'strLen')/Js(2.0))): + var.put(u'length', (var.get(u'strLen')/Js(2.0))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'length')): + try: + var.put(u'parsed', var.get(u'parseInt')(var.get(u'string').callprop(u'substr', (var.get(u'i')*Js(2.0)), Js(2.0)), Js(16.0))) + if var.get(u'isNaN')(var.get(u'parsed')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Invalid hex string'))) + raise PyJsTempException + var.get(u'buf').put((var.get(u'offset')+var.get(u'i')), var.get(u'parsed')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'i') + PyJsHoisted_hexWrite_.func_name = u'hexWrite' + var.put(u'hexWrite', PyJsHoisted_hexWrite_) + @Js + def PyJsHoisted_fromArrayLike_(that, array, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'arguments':arguments, u'that':that}, var) + var.registers([u'i', u'length', u'array', u'that']) + var.put(u'length', (var.get(u'checked')(var.get(u'array').get(u'length'))|Js(0.0))) + var.put(u'that', var.get(u'allocate')(var.get(u'that'), var.get(u'length'))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'length')): + try: + var.get(u'that').put(var.get(u'i'), (var.get(u'array').get(var.get(u'i'))&Js(255.0))) + finally: + var.put(u'i', Js(1.0), u'+') + return var.get(u'that') + PyJsHoisted_fromArrayLike_.func_name = u'fromArrayLike' + var.put(u'fromArrayLike', PyJsHoisted_fromArrayLike_) + @Js + def PyJsHoisted_checkIEEE754_(buf, value, offset, ext, max, min, this, arguments, var=var): + var = Scope({u'min':min, u'this':this, u'max':max, u'value':value, u'ext':ext, u'arguments':arguments, u'offset':offset, u'buf':buf}, var) + var.registers([u'min', u'max', u'value', u'ext', u'offset', u'buf']) + if ((var.get(u'offset')+var.get(u'ext'))>var.get(u'buf').get(u'length')): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'index out of range'))) + raise PyJsTempException + if (var.get(u'offset')<Js(0.0)): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'index out of range'))) + raise PyJsTempException + PyJsHoisted_checkIEEE754_.func_name = u'checkIEEE754' + var.put(u'checkIEEE754', PyJsHoisted_checkIEEE754_) + @Js + def PyJsHoisted_utf16leToBytes_(str, units, this, arguments, var=var): + var = Scope({u'units':units, u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'byteArray', u'c', u'i', u'lo', u'hi', u'str', u'units']) + pass + var.put(u'byteArray', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'str').get(u'length')): + try: + if (var.put(u'units', Js(2.0), u'-')<Js(0.0)): + break + var.put(u'c', var.get(u'str').callprop(u'charCodeAt', var.get(u'i'))) + var.put(u'hi', (var.get(u'c')>>Js(8.0))) + var.put(u'lo', (var.get(u'c')%Js(256.0))) + var.get(u'byteArray').callprop(u'push', var.get(u'lo')) + var.get(u'byteArray').callprop(u'push', var.get(u'hi')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'byteArray') + PyJsHoisted_utf16leToBytes_.func_name = u'utf16leToBytes' + var.put(u'utf16leToBytes', PyJsHoisted_utf16leToBytes_) + @Js + def PyJsHoisted_ucs2Write_(buf, string, offset, length, this, arguments, var=var): + var = Scope({u'length':length, u'string':string, u'offset':offset, u'this':this, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'length', u'buf', u'string', u'offset']) + return var.get(u'blitBuffer')(var.get(u'utf16leToBytes')(var.get(u'string'), (var.get(u'buf').get(u'length')-var.get(u'offset'))), var.get(u'buf'), var.get(u'offset'), var.get(u'length')) + PyJsHoisted_ucs2Write_.func_name = u'ucs2Write' + var.put(u'ucs2Write', PyJsHoisted_ucs2Write_) + @Js + def PyJsHoisted_base64clean_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + var.put(u'str', var.get(u'stringtrim')(var.get(u'str')).callprop(u'replace', var.get(u'INVALID_BASE64_RE'), Js(u''))) + if (var.get(u'str').get(u'length')<Js(2.0)): + return Js(u'') + while PyJsStrictNeq((var.get(u'str').get(u'length')%Js(4.0)),Js(0.0)): + var.put(u'str', (var.get(u'str')+Js(u'='))) + return var.get(u'str') + PyJsHoisted_base64clean_.func_name = u'base64clean' + var.put(u'base64clean', PyJsHoisted_base64clean_) + @Js + def PyJsHoisted_checkOffset_(offset, ext, length, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'ext':ext, u'length':length, u'offset':offset}, var) + var.registers([u'ext', u'length', u'offset']) + if (PyJsStrictNeq((var.get(u'offset')%Js(1.0)),Js(0.0)) or (var.get(u'offset')<Js(0.0))): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'offset is not uint'))) + raise PyJsTempException + if ((var.get(u'offset')+var.get(u'ext'))>var.get(u'length')): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'Trying to access beyond buffer length'))) + raise PyJsTempException + PyJsHoisted_checkOffset_.func_name = u'checkOffset' + var.put(u'checkOffset', PyJsHoisted_checkOffset_) + @Js + def PyJsHoisted_decodeCodePointsArray_(codePoints, this, arguments, var=var): + var = Scope({u'codePoints':codePoints, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'res', u'len', u'codePoints']) + var.put(u'len', var.get(u'codePoints').get(u'length')) + if (var.get(u'len')<=var.get(u'MAX_ARGUMENTS_LENGTH')): + return var.get(u'String').get(u'fromCharCode').callprop(u'apply', var.get(u'String'), var.get(u'codePoints')) + var.put(u'res', Js(u'')) + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'len')): + var.put(u'res', var.get(u'String').get(u'fromCharCode').callprop(u'apply', var.get(u'String'), var.get(u'codePoints').callprop(u'slice', var.get(u'i'), var.put(u'i', var.get(u'MAX_ARGUMENTS_LENGTH'), u'+'))), u'+') + return var.get(u'res') + PyJsHoisted_decodeCodePointsArray_.func_name = u'decodeCodePointsArray' + var.put(u'decodeCodePointsArray', PyJsHoisted_decodeCodePointsArray_) + @Js + def PyJsHoisted_fromArray_(that, array, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'arguments':arguments, u'that':that}, var) + var.registers([u'i', u'length', u'array', u'that']) + var.put(u'length', (var.get(u'checked')(var.get(u'array').get(u'length'))|Js(0.0))) + var.put(u'that', var.get(u'allocate')(var.get(u'that'), var.get(u'length'))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'length')): + try: + var.get(u'that').put(var.get(u'i'), (var.get(u'array').get(var.get(u'i'))&Js(255.0))) + finally: + var.put(u'i', Js(1.0), u'+') + return var.get(u'that') + PyJsHoisted_fromArray_.func_name = u'fromArray' + var.put(u'fromArray', PyJsHoisted_fromArray_) + @Js + def PyJsHoisted_binaryWrite_(buf, string, offset, length, this, arguments, var=var): + var = Scope({u'length':length, u'string':string, u'offset':offset, u'this':this, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'length', u'buf', u'string', u'offset']) + return var.get(u'asciiWrite')(var.get(u'buf'), var.get(u'string'), var.get(u'offset'), var.get(u'length')) + PyJsHoisted_binaryWrite_.func_name = u'binaryWrite' + var.put(u'binaryWrite', PyJsHoisted_binaryWrite_) + @Js + def PyJsHoisted_fromTypedArray_(that, array, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'arguments':arguments, u'that':that}, var) + var.registers([u'i', u'length', u'array', u'that']) + var.put(u'length', (var.get(u'checked')(var.get(u'array').get(u'length'))|Js(0.0))) + var.put(u'that', var.get(u'allocate')(var.get(u'that'), var.get(u'length'))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'length')): + try: + var.get(u'that').put(var.get(u'i'), (var.get(u'array').get(var.get(u'i'))&Js(255.0))) + finally: + var.put(u'i', Js(1.0), u'+') + return var.get(u'that') + PyJsHoisted_fromTypedArray_.func_name = u'fromTypedArray' + var.put(u'fromTypedArray', PyJsHoisted_fromTypedArray_) + @Js + def PyJsHoisted_utf16leSlice_(buf, start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'end', u'i', u'res', u'bytes', u'start', u'buf']) + var.put(u'bytes', var.get(u'buf').callprop(u'slice', var.get(u'start'), var.get(u'end'))) + var.put(u'res', Js(u'')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'bytes').get(u'length')): + try: + var.put(u'res', var.get(u'String').callprop(u'fromCharCode', (var.get(u'bytes').get(var.get(u'i'))+(var.get(u'bytes').get((var.get(u'i')+Js(1.0)))*Js(256.0)))), u'+') + finally: + var.put(u'i', Js(2.0), u'+') + return var.get(u'res') + PyJsHoisted_utf16leSlice_.func_name = u'utf16leSlice' + var.put(u'utf16leSlice', PyJsHoisted_utf16leSlice_) + @Js + def PyJsHoisted_typedArraySupport_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'arr']) + try: + var.put(u'arr', var.get(u'Uint8ArrayNotExising').create(Js(1.0))) + @Js + def PyJs_anonymous_4219_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(42.0) + PyJs_anonymous_4219_._set_name(u'anonymous') + var.get(u'arr').put(u'foo', PyJs_anonymous_4219_) + return ((PyJsStrictEq(var.get(u'arr').callprop(u'foo'),Js(42.0)) and PyJsStrictEq(var.get(u'arr').get(u'subarray').typeof(),Js(u'function'))) and PyJsStrictEq(var.get(u'arr').callprop(u'subarray', Js(1.0), Js(1.0)).get(u'byteLength'),Js(0.0))) + except PyJsException as PyJsTempException: + PyJsHolder_65_42861762 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + return Js(False) + finally: + if PyJsHolder_65_42861762 is not None: + var.own[u'e'] = PyJsHolder_65_42861762 + else: + del var.own[u'e'] + del PyJsHolder_65_42861762 + PyJsHoisted_typedArraySupport_.func_name = u'typedArraySupport' + var.put(u'typedArraySupport', PyJsHoisted_typedArraySupport_) + @Js + def PyJsHoisted_utf8Write_(buf, string, offset, length, this, arguments, var=var): + var = Scope({u'length':length, u'string':string, u'offset':offset, u'this':this, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'length', u'buf', u'string', u'offset']) + return var.get(u'blitBuffer')(var.get(u'utf8ToBytes')(var.get(u'string'), (var.get(u'buf').get(u'length')-var.get(u'offset'))), var.get(u'buf'), var.get(u'offset'), var.get(u'length')) + PyJsHoisted_utf8Write_.func_name = u'utf8Write' + var.put(u'utf8Write', PyJsHoisted_utf8Write_) + @Js + def PyJsHoisted_utf8ToBytes_(string, units, this, arguments, var=var): + var = Scope({u'units':units, u'this':this, u'string':string, u'arguments':arguments}, var) + var.registers([u'codePoint', u'string', u'i', u'bytes', u'leadSurrogate', u'length', u'units']) + var.put(u'units', (var.get(u'units') or var.get(u'Infinity'))) + pass + var.put(u'length', var.get(u'string').get(u'length')) + var.put(u'leadSurrogate', var.get(u"null")) + var.put(u'bytes', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'length')): + try: + var.put(u'codePoint', var.get(u'string').callprop(u'charCodeAt', var.get(u'i'))) + if ((var.get(u'codePoint')>Js(55295)) and (var.get(u'codePoint')<Js(57344))): + if var.get(u'leadSurrogate').neg(): + if (var.get(u'codePoint')>Js(56319)): + if (var.put(u'units', Js(3.0), u'-')>(-Js(1.0))): + var.get(u'bytes').callprop(u'push', Js(239), Js(191), Js(189)) + continue + else: + if PyJsStrictEq((var.get(u'i')+Js(1.0)),var.get(u'length')): + if (var.put(u'units', Js(3.0), u'-')>(-Js(1.0))): + var.get(u'bytes').callprop(u'push', Js(239), Js(191), Js(189)) + continue + var.put(u'leadSurrogate', var.get(u'codePoint')) + continue + if (var.get(u'codePoint')<Js(56320)): + if (var.put(u'units', Js(3.0), u'-')>(-Js(1.0))): + var.get(u'bytes').callprop(u'push', Js(239), Js(191), Js(189)) + var.put(u'leadSurrogate', var.get(u'codePoint')) + continue + var.put(u'codePoint', ((((var.get(u'leadSurrogate')-Js(55296))<<Js(10.0))|(var.get(u'codePoint')-Js(56320)))+Js(65536))) + else: + if var.get(u'leadSurrogate'): + if (var.put(u'units', Js(3.0), u'-')>(-Js(1.0))): + var.get(u'bytes').callprop(u'push', Js(239), Js(191), Js(189)) + var.put(u'leadSurrogate', var.get(u"null")) + if (var.get(u'codePoint')<Js(128)): + if (var.put(u'units', Js(1.0), u'-')<Js(0.0)): + break + var.get(u'bytes').callprop(u'push', var.get(u'codePoint')) + else: + if (var.get(u'codePoint')<Js(2048)): + if (var.put(u'units', Js(2.0), u'-')<Js(0.0)): + break + var.get(u'bytes').callprop(u'push', ((var.get(u'codePoint')>>Js(6))|Js(192)), ((var.get(u'codePoint')&Js(63))|Js(128))) + else: + if (var.get(u'codePoint')<Js(65536)): + if (var.put(u'units', Js(3.0), u'-')<Js(0.0)): + break + var.get(u'bytes').callprop(u'push', ((var.get(u'codePoint')>>Js(12))|Js(224)), (((var.get(u'codePoint')>>Js(6))&Js(63))|Js(128)), ((var.get(u'codePoint')&Js(63))|Js(128))) + else: + if (var.get(u'codePoint')<Js(1114112)): + if (var.put(u'units', Js(4.0), u'-')<Js(0.0)): + break + var.get(u'bytes').callprop(u'push', ((var.get(u'codePoint')>>Js(18))|Js(240)), (((var.get(u'codePoint')>>Js(12))&Js(63))|Js(128)), (((var.get(u'codePoint')>>Js(6))&Js(63))|Js(128)), ((var.get(u'codePoint')&Js(63))|Js(128))) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Invalid code point'))) + raise PyJsTempException + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'bytes') + PyJsHoisted_utf8ToBytes_.func_name = u'utf8ToBytes' + var.put(u'utf8ToBytes', PyJsHoisted_utf8ToBytes_) + @Js + def PyJsHoisted_writeDouble_(buf, value, offset, littleEndian, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'arguments':arguments, u'offset':offset, u'this':this, u'littleEndian':littleEndian, u'buf':buf, u'value':value}, var) + var.registers([u'littleEndian', u'noAssert', u'buf', u'value', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkIEEE754')(var.get(u'buf'), var.get(u'value'), var.get(u'offset'), Js(8.0), Js(1.7976931348623157e+308), (-Js(1.7976931348623157e+308))) + var.get(u'ieee754').callprop(u'write', var.get(u'buf'), var.get(u'value'), var.get(u'offset'), var.get(u'littleEndian'), Js(52.0), Js(8.0)) + return (var.get(u'offset')+Js(8.0)) + PyJsHoisted_writeDouble_.func_name = u'writeDouble' + var.put(u'writeDouble', PyJsHoisted_writeDouble_) + @Js + def PyJsHoisted_blitBuffer_(src, dst, offset, length, this, arguments, var=var): + var = Scope({u'src':src, u'length':length, u'arguments':arguments, u'offset':offset, u'this':this, u'dst':dst}, var) + var.registers([u'i', u'src', u'dst', u'length', u'offset']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'length')): + try: + if (((var.get(u'i')+var.get(u'offset'))>=var.get(u'dst').get(u'length')) or (var.get(u'i')>=var.get(u'src').get(u'length'))): + break + var.get(u'dst').put((var.get(u'i')+var.get(u'offset')), var.get(u'src').get(var.get(u'i'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'i') + PyJsHoisted_blitBuffer_.func_name = u'blitBuffer' + var.put(u'blitBuffer', PyJsHoisted_blitBuffer_) + @Js + def PyJsHoisted_base64Slice_(buf, start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'start', u'end', u'buf']) + if (PyJsStrictEq(var.get(u'start'),Js(0.0)) and PyJsStrictEq(var.get(u'end'),var.get(u'buf').get(u'length'))): + return var.get(u'base64').callprop(u'fromByteArray', var.get(u'buf')) + else: + return var.get(u'base64').callprop(u'fromByteArray', var.get(u'buf').callprop(u'slice', var.get(u'start'), var.get(u'end'))) + PyJsHoisted_base64Slice_.func_name = u'base64Slice' + var.put(u'base64Slice', PyJsHoisted_base64Slice_) + @Js + def PyJsHoisted_stringtrim_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + if var.get(u'str').get(u'trim'): + return var.get(u'str').callprop(u'trim') + return var.get(u'str').callprop(u'replace', JsRegExp(u'/^\\s+|\\s+$/g'), Js(u'')) + PyJsHoisted_stringtrim_.func_name = u'stringtrim' + var.put(u'stringtrim', PyJsHoisted_stringtrim_) + Js(u'use strict') + var.put(u'base64', var.get(u'require')(Js(u'base64-js'))) + var.put(u'ieee754', var.get(u'require')(Js(u'ieee754'))) + var.put(u'isArray', var.get(u'require')(Js(u'isarray'))) + var.get(u'exports').put(u'Buffer', var.get(u'Buffer')) + var.get(u'exports').put(u'SlowBuffer', var.get(u'SlowBuffer')) + var.get(u'exports').put(u'INSPECT_MAX_BYTES', Js(50.0)) + var.get(u'Buffer').put(u'poolSize', Js(8192.0)) + PyJs_Object_4218_ = Js({}) + var.put(u'rootParent', PyJs_Object_4218_) + var.get(u'Buffer').put(u'TYPED_ARRAY_SUPPORT', (var.get(u'global').get(u'TYPED_ARRAY_SUPPORT') if PyJsStrictNeq(var.get(u'global').get(u'TYPED_ARRAY_SUPPORT'),var.get(u'undefined')) else var.get(u'typedArraySupport')())) + pass + pass + pass + @Js + def PyJs_anonymous_4220_(arr, this, arguments, var=var): + var = Scope({u'this':this, u'arr':arr, u'arguments':arguments}, var) + var.registers([u'arr']) + var.get(u'arr').put(u'__proto__', var.get(u'Buffer').get(u'prototype')) + return var.get(u'arr') + PyJs_anonymous_4220_._set_name(u'anonymous') + var.get(u'Buffer').put(u'_augment', PyJs_anonymous_4220_) + pass + pass + pass + pass + pass + pass + pass + pass + pass + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.get(u'Buffer').get(u'prototype').put(u'__proto__', var.get(u'Uint8Array').get(u'prototype')) + var.get(u'Buffer').put(u'__proto__', var.get(u'Uint8Array')) + if ((PyJsStrictNeq(var.get(u'Symbol',throw=False).typeof(),Js(u'undefined')) and var.get(u'Symbol').get(u'species')) and PyJsStrictEq(var.get(u'Buffer').get(var.get(u'Symbol').get(u'species')),var.get(u'Buffer'))): + PyJs_Object_4221_ = Js({u'value':var.get(u"null"),u'configurable':var.get(u'true')}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'Buffer'), var.get(u'Symbol').get(u'species'), PyJs_Object_4221_) + else: + var.get(u'Buffer').get(u'prototype').put(u'length', var.get(u'undefined')) + var.get(u'Buffer').get(u'prototype').put(u'parent', var.get(u'undefined')) + pass + pass + pass + @Js + def PyJs_isBuffer_4222_(b, this, arguments, var=var): + var = Scope({u'this':this, u'b':b, u'arguments':arguments, u'isBuffer':PyJs_isBuffer_4222_}, var) + var.registers([u'b']) + return ((var.get(u'b')!=var.get(u"null")) and var.get(u'b').get(u'_isBuffer')).neg().neg() + PyJs_isBuffer_4222_._set_name(u'isBuffer') + var.get(u'Buffer').put(u'isBuffer', PyJs_isBuffer_4222_) + @Js + def PyJs_compare_4223_(a, b, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'compare':PyJs_compare_4223_, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'b', u'i', u'len', u'y', u'x']) + if (var.get(u'Buffer').callprop(u'isBuffer', var.get(u'a')).neg() or var.get(u'Buffer').callprop(u'isBuffer', var.get(u'b')).neg()): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Arguments must be Buffers'))) + raise PyJsTempException + if PyJsStrictEq(var.get(u'a'),var.get(u'b')): + return Js(0.0) + var.put(u'x', var.get(u'a').get(u'length')) + var.put(u'y', var.get(u'b').get(u'length')) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u'Math').callprop(u'min', var.get(u'x'), var.get(u'y'))) + while (var.get(u'i')<var.get(u'len')): + try: + if PyJsStrictNeq(var.get(u'a').get(var.get(u'i')),var.get(u'b').get(var.get(u'i'))): + var.put(u'x', var.get(u'a').get(var.get(u'i'))) + var.put(u'y', var.get(u'b').get(var.get(u'i'))) + break + finally: + var.put(u'i',Js(var.get(u'i').to_number())+Js(1)) + if (var.get(u'x')<var.get(u'y')): + return (-Js(1.0)) + if (var.get(u'y')<var.get(u'x')): + return Js(1.0) + return Js(0.0) + PyJs_compare_4223_._set_name(u'compare') + var.get(u'Buffer').put(u'compare', PyJs_compare_4223_) + @Js + def PyJs_isEncoding_4224_(encoding, this, arguments, var=var): + var = Scope({u'this':this, u'isEncoding':PyJs_isEncoding_4224_, u'arguments':arguments, u'encoding':encoding}, var) + var.registers([u'encoding']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'String')(var.get(u'encoding')).callprop(u'toLowerCase')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hex')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf8')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf-8')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ascii')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'binary')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'base64')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'raw')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ucs2')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ucs-2')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf16le')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf-16le')): + SWITCHED = True + return var.get(u'true') + if True: + SWITCHED = True + return Js(False) + SWITCHED = True + break + PyJs_isEncoding_4224_._set_name(u'isEncoding') + var.get(u'Buffer').put(u'isEncoding', PyJs_isEncoding_4224_) + @Js + def PyJs_concat_4225_(list, length, this, arguments, var=var): + var = Scope({u'this':this, u'length':length, u'list':list, u'arguments':arguments, u'concat':PyJs_concat_4225_}, var) + var.registers([u'i', u'list', u'pos', u'item', u'length', u'buf']) + if var.get(u'isArray')(var.get(u'list')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'list argument must be an Array of Buffers.'))) + raise PyJsTempException + if PyJsStrictEq(var.get(u'list').get(u'length'),Js(0.0)): + return var.get(u'Buffer').create(Js(0.0)) + pass + if PyJsStrictEq(var.get(u'length'),var.get(u'undefined')): + var.put(u'length', Js(0.0)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'list').get(u'length')): + try: + var.put(u'length', var.get(u'list').get(var.get(u'i')).get(u'length'), u'+') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.put(u'buf', var.get(u'Buffer').create(var.get(u'length'))) + var.put(u'pos', Js(0.0)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'list').get(u'length')): + try: + var.put(u'item', var.get(u'list').get(var.get(u'i'))) + var.get(u'item').callprop(u'copy', var.get(u'buf'), var.get(u'pos')) + var.put(u'pos', var.get(u'item').get(u'length'), u'+') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'buf') + PyJs_concat_4225_._set_name(u'concat') + var.get(u'Buffer').put(u'concat', PyJs_concat_4225_) + pass + var.get(u'Buffer').put(u'byteLength', var.get(u'byteLength')) + pass + var.get(u'Buffer').get(u'prototype').put(u'_isBuffer', var.get(u'true')) + @Js + def PyJs_toString_4226_(this, arguments, var=var): + var = Scope({u'this':this, u'toString':PyJs_toString_4226_, u'arguments':arguments}, var) + var.registers([u'length']) + var.put(u'length', (var.get(u"this").get(u'length')|Js(0.0))) + if PyJsStrictEq(var.get(u'length'),Js(0.0)): + return Js(u'') + if PyJsStrictEq(var.get(u'arguments').get(u'length'),Js(0.0)): + return var.get(u'utf8Slice')(var.get(u"this"), Js(0.0), var.get(u'length')) + return var.get(u'slowToString').callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + PyJs_toString_4226_._set_name(u'toString') + var.get(u'Buffer').get(u'prototype').put(u'toString', PyJs_toString_4226_) + @Js + def PyJs_equals_4227_(b, this, arguments, var=var): + var = Scope({u'this':this, u'b':b, u'arguments':arguments, u'equals':PyJs_equals_4227_}, var) + var.registers([u'b']) + if var.get(u'Buffer').callprop(u'isBuffer', var.get(u'b')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Argument must be a Buffer'))) + raise PyJsTempException + if PyJsStrictEq(var.get(u"this"),var.get(u'b')): + return var.get(u'true') + return PyJsStrictEq(var.get(u'Buffer').callprop(u'compare', var.get(u"this"), var.get(u'b')),Js(0.0)) + PyJs_equals_4227_._set_name(u'equals') + var.get(u'Buffer').get(u'prototype').put(u'equals', PyJs_equals_4227_) + @Js + def PyJs_inspect_4228_(this, arguments, var=var): + var = Scope({u'this':this, u'inspect':PyJs_inspect_4228_, u'arguments':arguments}, var) + var.registers([u'max', u'str']) + var.put(u'str', Js(u'')) + var.put(u'max', var.get(u'exports').get(u'INSPECT_MAX_BYTES')) + if (var.get(u"this").get(u'length')>Js(0.0)): + var.put(u'str', var.get(u"this").callprop(u'toString', Js(u'hex'), Js(0.0), var.get(u'max')).callprop(u'match', JsRegExp(u'/.{2}/g')).callprop(u'join', Js(u' '))) + if (var.get(u"this").get(u'length')>var.get(u'max')): + var.put(u'str', Js(u' ... '), u'+') + return ((Js(u'<Buffer ')+var.get(u'str'))+Js(u'>')) + PyJs_inspect_4228_._set_name(u'inspect') + var.get(u'Buffer').get(u'prototype').put(u'inspect', PyJs_inspect_4228_) + @Js + def PyJs_compare_4229_(b, this, arguments, var=var): + var = Scope({u'this':this, u'compare':PyJs_compare_4229_, u'b':b, u'arguments':arguments}, var) + var.registers([u'b']) + if var.get(u'Buffer').callprop(u'isBuffer', var.get(u'b')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Argument must be a Buffer'))) + raise PyJsTempException + return var.get(u'Buffer').callprop(u'compare', var.get(u"this"), var.get(u'b')) + PyJs_compare_4229_._set_name(u'compare') + var.get(u'Buffer').get(u'prototype').put(u'compare', PyJs_compare_4229_) + @Js + def PyJs_indexOf_4230_(val, byteOffset, this, arguments, var=var): + var = Scope({u'this':this, u'indexOf':PyJs_indexOf_4230_, u'byteOffset':byteOffset, u'val':val, u'arguments':arguments}, var) + var.registers([u'val', u'arrayIndexOf', u'byteOffset']) + @Js + def PyJsHoisted_arrayIndexOf_(arr, val, byteOffset, this, arguments, var=var): + var = Scope({u'this':this, u'arr':arr, u'byteOffset':byteOffset, u'val':val, u'arguments':arguments}, var) + var.registers([u'i', u'foundIndex', u'arr', u'val', u'byteOffset']) + var.put(u'foundIndex', (-Js(1.0))) + #for JS loop + var.put(u'i', Js(0.0)) + while ((var.get(u'byteOffset')+var.get(u'i'))<var.get(u'arr').get(u'length')): + try: + if PyJsStrictEq(var.get(u'arr').get((var.get(u'byteOffset')+var.get(u'i'))),var.get(u'val').get((Js(0.0) if PyJsStrictEq(var.get(u'foundIndex'),(-Js(1.0))) else (var.get(u'i')-var.get(u'foundIndex'))))): + if PyJsStrictEq(var.get(u'foundIndex'),(-Js(1.0))): + var.put(u'foundIndex', var.get(u'i')) + if PyJsStrictEq(((var.get(u'i')-var.get(u'foundIndex'))+Js(1.0)),var.get(u'val').get(u'length')): + return (var.get(u'byteOffset')+var.get(u'foundIndex')) + else: + var.put(u'foundIndex', (-Js(1.0))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return (-Js(1.0)) + PyJsHoisted_arrayIndexOf_.func_name = u'arrayIndexOf' + var.put(u'arrayIndexOf', PyJsHoisted_arrayIndexOf_) + if (var.get(u'byteOffset')>Js(2147483647)): + var.put(u'byteOffset', Js(2147483647)) + else: + if (var.get(u'byteOffset')<(-Js(2147483648))): + var.put(u'byteOffset', (-Js(2147483648))) + var.put(u'byteOffset', Js(0.0), u'>>') + if PyJsStrictEq(var.get(u"this").get(u'length'),Js(0.0)): + return (-Js(1.0)) + if (var.get(u'byteOffset')>=var.get(u"this").get(u'length')): + return (-Js(1.0)) + if (var.get(u'byteOffset')<Js(0.0)): + var.put(u'byteOffset', var.get(u'Math').callprop(u'max', (var.get(u"this").get(u'length')+var.get(u'byteOffset')), Js(0.0))) + if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'string')): + if PyJsStrictEq(var.get(u'val').get(u'length'),Js(0.0)): + return (-Js(1.0)) + return var.get(u'String').get(u'prototype').get(u'indexOf').callprop(u'call', var.get(u"this"), var.get(u'val'), var.get(u'byteOffset')) + if var.get(u'Buffer').callprop(u'isBuffer', var.get(u'val')): + return var.get(u'arrayIndexOf')(var.get(u"this"), var.get(u'val'), var.get(u'byteOffset')) + if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'number')): + if (var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT') and PyJsStrictEq(var.get(u'Uint8Array').get(u'prototype').get(u'indexOf'),Js(u'function'))): + return var.get(u'Uint8Array').get(u'prototype').get(u'indexOf').callprop(u'call', var.get(u"this"), var.get(u'val'), var.get(u'byteOffset')) + return var.get(u'arrayIndexOf')(var.get(u"this"), Js([var.get(u'val')]), var.get(u'byteOffset')) + pass + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'val must be string, number or Buffer'))) + raise PyJsTempException + PyJs_indexOf_4230_._set_name(u'indexOf') + var.get(u'Buffer').get(u'prototype').put(u'indexOf', PyJs_indexOf_4230_) + pass + pass + pass + pass + pass + pass + @Js + def PyJs_write_4231_(string, offset, length, encoding, this, arguments, var=var): + var = Scope({u'write':PyJs_write_4231_, u'length':length, u'string':string, u'encoding':encoding, u'this':this, u'offset':offset, u'arguments':arguments}, var) + var.registers([u'string', u'encoding', u'length', u'swap', u'offset', u'loweredCase', u'remaining']) + if PyJsStrictEq(var.get(u'offset'),var.get(u'undefined')): + var.put(u'encoding', Js(u'utf8')) + var.put(u'length', var.get(u"this").get(u'length')) + var.put(u'offset', Js(0.0)) + else: + if (PyJsStrictEq(var.get(u'length'),var.get(u'undefined')) and PyJsStrictEq(var.get(u'offset',throw=False).typeof(),Js(u'string'))): + var.put(u'encoding', var.get(u'offset')) + var.put(u'length', var.get(u"this").get(u'length')) + var.put(u'offset', Js(0.0)) + else: + if var.get(u'isFinite')(var.get(u'offset')): + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'isFinite')(var.get(u'length')): + var.put(u'length', (var.get(u'length')|Js(0.0))) + if PyJsStrictEq(var.get(u'encoding'),var.get(u'undefined')): + var.put(u'encoding', Js(u'utf8')) + else: + var.put(u'encoding', var.get(u'length')) + var.put(u'length', var.get(u'undefined')) + else: + var.put(u'swap', var.get(u'encoding')) + var.put(u'encoding', var.get(u'offset')) + var.put(u'offset', (var.get(u'length')|Js(0.0))) + var.put(u'length', var.get(u'swap')) + var.put(u'remaining', (var.get(u"this").get(u'length')-var.get(u'offset'))) + if (PyJsStrictEq(var.get(u'length'),var.get(u'undefined')) or (var.get(u'length')>var.get(u'remaining'))): + var.put(u'length', var.get(u'remaining')) + if (((var.get(u'string').get(u'length')>Js(0.0)) and ((var.get(u'length')<Js(0.0)) or (var.get(u'offset')<Js(0.0)))) or (var.get(u'offset')>var.get(u"this").get(u'length'))): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'attempt to write outside buffer bounds'))) + raise PyJsTempException + if var.get(u'encoding').neg(): + var.put(u'encoding', Js(u'utf8')) + var.put(u'loweredCase', Js(False)) + #for JS loop + + while 1: + while 1: + SWITCHED = False + CONDITION = (var.get(u'encoding')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hex')): + SWITCHED = True + return var.get(u'hexWrite')(var.get(u"this"), var.get(u'string'), var.get(u'offset'), var.get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf8')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf-8')): + SWITCHED = True + return var.get(u'utf8Write')(var.get(u"this"), var.get(u'string'), var.get(u'offset'), var.get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ascii')): + SWITCHED = True + return var.get(u'asciiWrite')(var.get(u"this"), var.get(u'string'), var.get(u'offset'), var.get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'binary')): + SWITCHED = True + return var.get(u'binaryWrite')(var.get(u"this"), var.get(u'string'), var.get(u'offset'), var.get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'base64')): + SWITCHED = True + return var.get(u'base64Write')(var.get(u"this"), var.get(u'string'), var.get(u'offset'), var.get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ucs2')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ucs-2')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf16le')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf-16le')): + SWITCHED = True + return var.get(u'ucs2Write')(var.get(u"this"), var.get(u'string'), var.get(u'offset'), var.get(u'length')) + if True: + SWITCHED = True + if var.get(u'loweredCase'): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Unknown encoding: ')+var.get(u'encoding')))) + raise PyJsTempException + var.put(u'encoding', (Js(u'')+var.get(u'encoding')).callprop(u'toLowerCase')) + var.put(u'loweredCase', var.get(u'true')) + SWITCHED = True + break + + PyJs_write_4231_._set_name(u'write') + var.get(u'Buffer').get(u'prototype').put(u'write', PyJs_write_4231_) + @Js + def PyJs_toJSON_4232_(this, arguments, var=var): + var = Scope({u'this':this, u'toJSON':PyJs_toJSON_4232_, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_4233_ = Js({u'type':Js(u'Buffer'),u'data':var.get(u'Array').get(u'prototype').get(u'slice').callprop(u'call', (var.get(u"this").get(u'_arr') or var.get(u"this")), Js(0.0))}) + return PyJs_Object_4233_ + PyJs_toJSON_4232_._set_name(u'toJSON') + var.get(u'Buffer').get(u'prototype').put(u'toJSON', PyJs_toJSON_4232_) + pass + pass + var.put(u'MAX_ARGUMENTS_LENGTH', Js(4096)) + pass + pass + pass + pass + pass + @Js + def PyJs_slice_4234_(start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'slice':PyJs_slice_4234_, u'end':end, u'arguments':arguments}, var) + var.registers([u'end', u'i', u'len', u'start', u'newBuf', u'sliceLen']) + var.put(u'len', var.get(u"this").get(u'length')) + var.put(u'start', (~(~var.get(u'start')))) + var.put(u'end', (var.get(u'len') if PyJsStrictEq(var.get(u'end'),var.get(u'undefined')) else (~(~var.get(u'end'))))) + if (var.get(u'start')<Js(0.0)): + var.put(u'start', var.get(u'len'), u'+') + if (var.get(u'start')<Js(0.0)): + var.put(u'start', Js(0.0)) + else: + if (var.get(u'start')>var.get(u'len')): + var.put(u'start', var.get(u'len')) + if (var.get(u'end')<Js(0.0)): + var.put(u'end', var.get(u'len'), u'+') + if (var.get(u'end')<Js(0.0)): + var.put(u'end', Js(0.0)) + else: + if (var.get(u'end')>var.get(u'len')): + var.put(u'end', var.get(u'len')) + if (var.get(u'end')<var.get(u'start')): + var.put(u'end', var.get(u'start')) + pass + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.put(u'newBuf', var.get(u"this").callprop(u'subarray', var.get(u'start'), var.get(u'end'))) + var.get(u'newBuf').put(u'__proto__', var.get(u'Buffer').get(u'prototype')) + else: + var.put(u'sliceLen', (var.get(u'end')-var.get(u'start'))) + var.put(u'newBuf', var.get(u'Buffer').create(var.get(u'sliceLen'), var.get(u'undefined'))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'sliceLen')): + try: + var.get(u'newBuf').put(var.get(u'i'), var.get(u"this").get((var.get(u'i')+var.get(u'start')))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + if var.get(u'newBuf').get(u'length'): + var.get(u'newBuf').put(u'parent', (var.get(u"this").get(u'parent') or var.get(u"this"))) + return var.get(u'newBuf') + PyJs_slice_4234_._set_name(u'slice') + var.get(u'Buffer').get(u'prototype').put(u'slice', PyJs_slice_4234_) + pass + @Js + def PyJs_readUIntLE_4235_(offset, byteLength, noAssert, this, arguments, var=var): + var = Scope({u'byteLength':byteLength, u'noAssert':noAssert, u'this':this, u'arguments':arguments, u'offset':offset, u'readUIntLE':PyJs_readUIntLE_4235_}, var) + var.registers([u'byteLength', u'noAssert', u'val', u'i', u'offset', u'mul']) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + var.put(u'byteLength', (var.get(u'byteLength')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), var.get(u'byteLength'), var.get(u"this").get(u'length')) + var.put(u'val', var.get(u"this").get(var.get(u'offset'))) + var.put(u'mul', Js(1.0)) + var.put(u'i', Js(0.0)) + while ((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))<var.get(u'byteLength')) and var.put(u'mul', Js(256), u'*')): + var.put(u'val', (var.get(u"this").get((var.get(u'offset')+var.get(u'i')))*var.get(u'mul')), u'+') + return var.get(u'val') + PyJs_readUIntLE_4235_._set_name(u'readUIntLE') + var.get(u'Buffer').get(u'prototype').put(u'readUIntLE', PyJs_readUIntLE_4235_) + @Js + def PyJs_readUIntBE_4236_(offset, byteLength, noAssert, this, arguments, var=var): + var = Scope({u'byteLength':byteLength, u'noAssert':noAssert, u'this':this, u'readUIntBE':PyJs_readUIntBE_4236_, u'offset':offset, u'arguments':arguments}, var) + var.registers([u'byteLength', u'mul', u'noAssert', u'val', u'offset']) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + var.put(u'byteLength', (var.get(u'byteLength')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), var.get(u'byteLength'), var.get(u"this").get(u'length')) + var.put(u'val', var.get(u"this").get((var.get(u'offset')+var.put(u'byteLength',Js(var.get(u'byteLength').to_number())-Js(1))))) + var.put(u'mul', Js(1.0)) + while ((var.get(u'byteLength')>Js(0.0)) and var.put(u'mul', Js(256), u'*')): + var.put(u'val', (var.get(u"this").get((var.get(u'offset')+var.put(u'byteLength',Js(var.get(u'byteLength').to_number())-Js(1))))*var.get(u'mul')), u'+') + return var.get(u'val') + PyJs_readUIntBE_4236_._set_name(u'readUIntBE') + var.get(u'Buffer').get(u'prototype').put(u'readUIntBE', PyJs_readUIntBE_4236_) + @Js + def PyJs_readUInt8_4237_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'noAssert':noAssert, u'arguments':arguments, u'readUInt8':PyJs_readUInt8_4237_, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(1.0), var.get(u"this").get(u'length')) + return var.get(u"this").get(var.get(u'offset')) + PyJs_readUInt8_4237_._set_name(u'readUInt8') + var.get(u'Buffer').get(u'prototype').put(u'readUInt8', PyJs_readUInt8_4237_) + @Js + def PyJs_readUInt16LE_4238_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'noAssert':noAssert, u'readUInt16LE':PyJs_readUInt16LE_4238_, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(2.0), var.get(u"this").get(u'length')) + return (var.get(u"this").get(var.get(u'offset'))|(var.get(u"this").get((var.get(u'offset')+Js(1.0)))<<Js(8.0))) + PyJs_readUInt16LE_4238_._set_name(u'readUInt16LE') + var.get(u'Buffer').get(u'prototype').put(u'readUInt16LE', PyJs_readUInt16LE_4238_) + @Js + def PyJs_readUInt16BE_4239_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'readUInt16BE':PyJs_readUInt16BE_4239_, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(2.0), var.get(u"this").get(u'length')) + return ((var.get(u"this").get(var.get(u'offset'))<<Js(8.0))|var.get(u"this").get((var.get(u'offset')+Js(1.0)))) + PyJs_readUInt16BE_4239_._set_name(u'readUInt16BE') + var.get(u'Buffer').get(u'prototype').put(u'readUInt16BE', PyJs_readUInt16BE_4239_) + @Js + def PyJs_readUInt32LE_4240_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'readUInt32LE':PyJs_readUInt32LE_4240_, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(4.0), var.get(u"this").get(u'length')) + return (((var.get(u"this").get(var.get(u'offset'))|(var.get(u"this").get((var.get(u'offset')+Js(1.0)))<<Js(8.0)))|(var.get(u"this").get((var.get(u'offset')+Js(2.0)))<<Js(16.0)))+(var.get(u"this").get((var.get(u'offset')+Js(3.0)))*Js(16777216))) + PyJs_readUInt32LE_4240_._set_name(u'readUInt32LE') + var.get(u'Buffer').get(u'prototype').put(u'readUInt32LE', PyJs_readUInt32LE_4240_) + @Js + def PyJs_readUInt32BE_4241_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'noAssert':noAssert, u'readUInt32BE':PyJs_readUInt32BE_4241_, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(4.0), var.get(u"this").get(u'length')) + return ((var.get(u"this").get(var.get(u'offset'))*Js(16777216))+(((var.get(u"this").get((var.get(u'offset')+Js(1.0)))<<Js(16.0))|(var.get(u"this").get((var.get(u'offset')+Js(2.0)))<<Js(8.0)))|var.get(u"this").get((var.get(u'offset')+Js(3.0))))) + PyJs_readUInt32BE_4241_._set_name(u'readUInt32BE') + var.get(u'Buffer').get(u'prototype').put(u'readUInt32BE', PyJs_readUInt32BE_4241_) + @Js + def PyJs_readIntLE_4242_(offset, byteLength, noAssert, this, arguments, var=var): + var = Scope({u'byteLength':byteLength, u'noAssert':noAssert, u'this':this, u'readIntLE':PyJs_readIntLE_4242_, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'byteLength', u'noAssert', u'val', u'i', u'offset', u'mul']) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + var.put(u'byteLength', (var.get(u'byteLength')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), var.get(u'byteLength'), var.get(u"this").get(u'length')) + var.put(u'val', var.get(u"this").get(var.get(u'offset'))) + var.put(u'mul', Js(1.0)) + var.put(u'i', Js(0.0)) + while ((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))<var.get(u'byteLength')) and var.put(u'mul', Js(256), u'*')): + var.put(u'val', (var.get(u"this").get((var.get(u'offset')+var.get(u'i')))*var.get(u'mul')), u'+') + var.put(u'mul', Js(128), u'*') + if (var.get(u'val')>=var.get(u'mul')): + var.put(u'val', var.get(u'Math').callprop(u'pow', Js(2.0), (Js(8.0)*var.get(u'byteLength'))), u'-') + return var.get(u'val') + PyJs_readIntLE_4242_._set_name(u'readIntLE') + var.get(u'Buffer').get(u'prototype').put(u'readIntLE', PyJs_readIntLE_4242_) + @Js + def PyJs_readIntBE_4243_(offset, byteLength, noAssert, this, arguments, var=var): + var = Scope({u'byteLength':byteLength, u'readIntBE':PyJs_readIntBE_4243_, u'noAssert':noAssert, u'this':this, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'byteLength', u'noAssert', u'val', u'i', u'offset', u'mul']) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + var.put(u'byteLength', (var.get(u'byteLength')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), var.get(u'byteLength'), var.get(u"this").get(u'length')) + var.put(u'i', var.get(u'byteLength')) + var.put(u'mul', Js(1.0)) + var.put(u'val', var.get(u"this").get((var.get(u'offset')+var.put(u'i',Js(var.get(u'i').to_number())-Js(1))))) + while ((var.get(u'i')>Js(0.0)) and var.put(u'mul', Js(256), u'*')): + var.put(u'val', (var.get(u"this").get((var.get(u'offset')+var.put(u'i',Js(var.get(u'i').to_number())-Js(1))))*var.get(u'mul')), u'+') + var.put(u'mul', Js(128), u'*') + if (var.get(u'val')>=var.get(u'mul')): + var.put(u'val', var.get(u'Math').callprop(u'pow', Js(2.0), (Js(8.0)*var.get(u'byteLength'))), u'-') + return var.get(u'val') + PyJs_readIntBE_4243_._set_name(u'readIntBE') + var.get(u'Buffer').get(u'prototype').put(u'readIntBE', PyJs_readIntBE_4243_) + @Js + def PyJs_readInt8_4244_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'noAssert':noAssert, u'readInt8':PyJs_readInt8_4244_, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(1.0), var.get(u"this").get(u'length')) + if (var.get(u"this").get(var.get(u'offset'))&Js(128)).neg(): + return var.get(u"this").get(var.get(u'offset')) + return (((Js(255)-var.get(u"this").get(var.get(u'offset')))+Js(1.0))*(-Js(1.0))) + PyJs_readInt8_4244_._set_name(u'readInt8') + var.get(u'Buffer').get(u'prototype').put(u'readInt8', PyJs_readInt8_4244_) + @Js + def PyJs_readInt16LE_4245_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'readInt16LE':PyJs_readInt16LE_4245_, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'val', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(2.0), var.get(u"this").get(u'length')) + var.put(u'val', (var.get(u"this").get(var.get(u'offset'))|(var.get(u"this").get((var.get(u'offset')+Js(1.0)))<<Js(8.0)))) + return ((var.get(u'val')|Js(4294901760)) if (var.get(u'val')&Js(32768)) else var.get(u'val')) + PyJs_readInt16LE_4245_._set_name(u'readInt16LE') + var.get(u'Buffer').get(u'prototype').put(u'readInt16LE', PyJs_readInt16LE_4245_) + @Js + def PyJs_readInt16BE_4246_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'readInt16BE':PyJs_readInt16BE_4246_, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'val', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(2.0), var.get(u"this").get(u'length')) + var.put(u'val', (var.get(u"this").get((var.get(u'offset')+Js(1.0)))|(var.get(u"this").get(var.get(u'offset'))<<Js(8.0)))) + return ((var.get(u'val')|Js(4294901760)) if (var.get(u'val')&Js(32768)) else var.get(u'val')) + PyJs_readInt16BE_4246_._set_name(u'readInt16BE') + var.get(u'Buffer').get(u'prototype').put(u'readInt16BE', PyJs_readInt16BE_4246_) + @Js + def PyJs_readInt32LE_4247_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'readInt32LE':PyJs_readInt32LE_4247_, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(4.0), var.get(u"this").get(u'length')) + return (((var.get(u"this").get(var.get(u'offset'))|(var.get(u"this").get((var.get(u'offset')+Js(1.0)))<<Js(8.0)))|(var.get(u"this").get((var.get(u'offset')+Js(2.0)))<<Js(16.0)))|(var.get(u"this").get((var.get(u'offset')+Js(3.0)))<<Js(24.0))) + PyJs_readInt32LE_4247_._set_name(u'readInt32LE') + var.get(u'Buffer').get(u'prototype').put(u'readInt32LE', PyJs_readInt32LE_4247_) + @Js + def PyJs_readInt32BE_4248_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'readInt32BE':PyJs_readInt32BE_4248_, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(4.0), var.get(u"this").get(u'length')) + return ((((var.get(u"this").get(var.get(u'offset'))<<Js(24.0))|(var.get(u"this").get((var.get(u'offset')+Js(1.0)))<<Js(16.0)))|(var.get(u"this").get((var.get(u'offset')+Js(2.0)))<<Js(8.0)))|var.get(u"this").get((var.get(u'offset')+Js(3.0)))) + PyJs_readInt32BE_4248_._set_name(u'readInt32BE') + var.get(u'Buffer').get(u'prototype').put(u'readInt32BE', PyJs_readInt32BE_4248_) + @Js + def PyJs_readFloatLE_4249_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'readFloatLE':PyJs_readFloatLE_4249_, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(4.0), var.get(u"this").get(u'length')) + return var.get(u'ieee754').callprop(u'read', var.get(u"this"), var.get(u'offset'), var.get(u'true'), Js(23.0), Js(4.0)) + PyJs_readFloatLE_4249_._set_name(u'readFloatLE') + var.get(u'Buffer').get(u'prototype').put(u'readFloatLE', PyJs_readFloatLE_4249_) + @Js + def PyJs_readFloatBE_4250_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'readFloatBE':PyJs_readFloatBE_4250_, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(4.0), var.get(u"this").get(u'length')) + return var.get(u'ieee754').callprop(u'read', var.get(u"this"), var.get(u'offset'), Js(False), Js(23.0), Js(4.0)) + PyJs_readFloatBE_4250_._set_name(u'readFloatBE') + var.get(u'Buffer').get(u'prototype').put(u'readFloatBE', PyJs_readFloatBE_4250_) + @Js + def PyJs_readDoubleLE_4251_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'noAssert':noAssert, u'arguments':arguments, u'readDoubleLE':PyJs_readDoubleLE_4251_, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(8.0), var.get(u"this").get(u'length')) + return var.get(u'ieee754').callprop(u'read', var.get(u"this"), var.get(u'offset'), var.get(u'true'), Js(52.0), Js(8.0)) + PyJs_readDoubleLE_4251_._set_name(u'readDoubleLE') + var.get(u'Buffer').get(u'prototype').put(u'readDoubleLE', PyJs_readDoubleLE_4251_) + @Js + def PyJs_readDoubleBE_4252_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'readDoubleBE':PyJs_readDoubleBE_4252_, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(8.0), var.get(u"this").get(u'length')) + return var.get(u'ieee754').callprop(u'read', var.get(u"this"), var.get(u'offset'), Js(False), Js(52.0), Js(8.0)) + PyJs_readDoubleBE_4252_._set_name(u'readDoubleBE') + var.get(u'Buffer').get(u'prototype').put(u'readDoubleBE', PyJs_readDoubleBE_4252_) + pass + @Js + def PyJs_writeUIntLE_4253_(value, offset, byteLength, noAssert, this, arguments, var=var): + var = Scope({u'byteLength':byteLength, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset, u'this':this, u'writeUIntLE':PyJs_writeUIntLE_4253_, u'value':value}, var) + var.registers([u'byteLength', u'noAssert', u'i', u'value', u'offset', u'mul']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + var.put(u'byteLength', (var.get(u'byteLength')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), var.get(u'byteLength'), var.get(u'Math').callprop(u'pow', Js(2.0), (Js(8.0)*var.get(u'byteLength'))), Js(0.0)) + var.put(u'mul', Js(1.0)) + var.put(u'i', Js(0.0)) + var.get(u"this").put(var.get(u'offset'), (var.get(u'value')&Js(255))) + while ((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))<var.get(u'byteLength')) and var.put(u'mul', Js(256), u'*')): + var.get(u"this").put((var.get(u'offset')+var.get(u'i')), ((var.get(u'value')/var.get(u'mul'))&Js(255))) + return (var.get(u'offset')+var.get(u'byteLength')) + PyJs_writeUIntLE_4253_._set_name(u'writeUIntLE') + var.get(u'Buffer').get(u'prototype').put(u'writeUIntLE', PyJs_writeUIntLE_4253_) + @Js + def PyJs_writeUIntBE_4254_(value, offset, byteLength, noAssert, this, arguments, var=var): + var = Scope({u'byteLength':byteLength, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset, u'this':this, u'writeUIntBE':PyJs_writeUIntBE_4254_, u'value':value}, var) + var.registers([u'byteLength', u'noAssert', u'i', u'value', u'offset', u'mul']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + var.put(u'byteLength', (var.get(u'byteLength')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), var.get(u'byteLength'), var.get(u'Math').callprop(u'pow', Js(2.0), (Js(8.0)*var.get(u'byteLength'))), Js(0.0)) + var.put(u'i', (var.get(u'byteLength')-Js(1.0))) + var.put(u'mul', Js(1.0)) + var.get(u"this").put((var.get(u'offset')+var.get(u'i')), (var.get(u'value')&Js(255))) + while ((var.put(u'i',Js(var.get(u'i').to_number())-Js(1))>=Js(0.0)) and var.put(u'mul', Js(256), u'*')): + var.get(u"this").put((var.get(u'offset')+var.get(u'i')), ((var.get(u'value')/var.get(u'mul'))&Js(255))) + return (var.get(u'offset')+var.get(u'byteLength')) + PyJs_writeUIntBE_4254_._set_name(u'writeUIntBE') + var.get(u'Buffer').get(u'prototype').put(u'writeUIntBE', PyJs_writeUIntBE_4254_) + @Js + def PyJs_writeUInt8_4255_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'this':this, u'writeUInt8':PyJs_writeUInt8_4255_, u'value':value, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(1.0), Js(255), Js(0.0)) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT').neg(): + var.put(u'value', var.get(u'Math').callprop(u'floor', var.get(u'value'))) + var.get(u"this").put(var.get(u'offset'), (var.get(u'value')&Js(255))) + return (var.get(u'offset')+Js(1.0)) + PyJs_writeUInt8_4255_._set_name(u'writeUInt8') + var.get(u'Buffer').get(u'prototype').put(u'writeUInt8', PyJs_writeUInt8_4255_) + pass + @Js + def PyJs_writeUInt16LE_4256_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'writeUInt16LE':PyJs_writeUInt16LE_4256_, u'noAssert':noAssert, u'this':this, u'value':value, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(2.0), Js(65535), Js(0.0)) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.get(u"this").put(var.get(u'offset'), (var.get(u'value')&Js(255))) + var.get(u"this").put((var.get(u'offset')+Js(1.0)), PyJsBshift(var.get(u'value'),Js(8.0))) + else: + var.get(u'objectWriteUInt16')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), var.get(u'true')) + return (var.get(u'offset')+Js(2.0)) + PyJs_writeUInt16LE_4256_._set_name(u'writeUInt16LE') + var.get(u'Buffer').get(u'prototype').put(u'writeUInt16LE', PyJs_writeUInt16LE_4256_) + @Js + def PyJs_writeUInt16BE_4257_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'this':this, u'writeUInt16BE':PyJs_writeUInt16BE_4257_, u'value':value, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(2.0), Js(65535), Js(0.0)) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.get(u"this").put(var.get(u'offset'), PyJsBshift(var.get(u'value'),Js(8.0))) + var.get(u"this").put((var.get(u'offset')+Js(1.0)), (var.get(u'value')&Js(255))) + else: + var.get(u'objectWriteUInt16')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(False)) + return (var.get(u'offset')+Js(2.0)) + PyJs_writeUInt16BE_4257_._set_name(u'writeUInt16BE') + var.get(u'Buffer').get(u'prototype').put(u'writeUInt16BE', PyJs_writeUInt16BE_4257_) + pass + @Js + def PyJs_writeUInt32LE_4258_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'writeUInt32LE':PyJs_writeUInt32LE_4258_, u'noAssert':noAssert, u'this':this, u'value':value, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(4.0), Js(4294967295), Js(0.0)) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.get(u"this").put((var.get(u'offset')+Js(3.0)), PyJsBshift(var.get(u'value'),Js(24.0))) + var.get(u"this").put((var.get(u'offset')+Js(2.0)), PyJsBshift(var.get(u'value'),Js(16.0))) + var.get(u"this").put((var.get(u'offset')+Js(1.0)), PyJsBshift(var.get(u'value'),Js(8.0))) + var.get(u"this").put(var.get(u'offset'), (var.get(u'value')&Js(255))) + else: + var.get(u'objectWriteUInt32')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), var.get(u'true')) + return (var.get(u'offset')+Js(4.0)) + PyJs_writeUInt32LE_4258_._set_name(u'writeUInt32LE') + var.get(u'Buffer').get(u'prototype').put(u'writeUInt32LE', PyJs_writeUInt32LE_4258_) + @Js + def PyJs_writeUInt32BE_4259_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'this':this, u'value':value, u'writeUInt32BE':PyJs_writeUInt32BE_4259_, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(4.0), Js(4294967295), Js(0.0)) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.get(u"this").put(var.get(u'offset'), PyJsBshift(var.get(u'value'),Js(24.0))) + var.get(u"this").put((var.get(u'offset')+Js(1.0)), PyJsBshift(var.get(u'value'),Js(16.0))) + var.get(u"this").put((var.get(u'offset')+Js(2.0)), PyJsBshift(var.get(u'value'),Js(8.0))) + var.get(u"this").put((var.get(u'offset')+Js(3.0)), (var.get(u'value')&Js(255))) + else: + var.get(u'objectWriteUInt32')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(False)) + return (var.get(u'offset')+Js(4.0)) + PyJs_writeUInt32BE_4259_._set_name(u'writeUInt32BE') + var.get(u'Buffer').get(u'prototype').put(u'writeUInt32BE', PyJs_writeUInt32BE_4259_) + @Js + def PyJs_writeIntLE_4260_(value, offset, byteLength, noAssert, this, arguments, var=var): + var = Scope({u'byteLength':byteLength, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset, u'this':this, u'writeIntLE':PyJs_writeIntLE_4260_, u'value':value}, var) + var.registers([u'byteLength', u'noAssert', u'sub', u'i', u'value', u'limit', u'offset', u'mul']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.put(u'limit', var.get(u'Math').callprop(u'pow', Js(2.0), ((Js(8.0)*var.get(u'byteLength'))-Js(1.0)))) + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), var.get(u'byteLength'), (var.get(u'limit')-Js(1.0)), (-var.get(u'limit'))) + var.put(u'i', Js(0.0)) + var.put(u'mul', Js(1.0)) + var.put(u'sub', (Js(1.0) if (var.get(u'value')<Js(0.0)) else Js(0.0))) + var.get(u"this").put(var.get(u'offset'), (var.get(u'value')&Js(255))) + while ((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))<var.get(u'byteLength')) and var.put(u'mul', Js(256), u'*')): + var.get(u"this").put((var.get(u'offset')+var.get(u'i')), ((((var.get(u'value')/var.get(u'mul'))>>Js(0.0))-var.get(u'sub'))&Js(255))) + return (var.get(u'offset')+var.get(u'byteLength')) + PyJs_writeIntLE_4260_._set_name(u'writeIntLE') + var.get(u'Buffer').get(u'prototype').put(u'writeIntLE', PyJs_writeIntLE_4260_) + @Js + def PyJs_writeIntBE_4261_(value, offset, byteLength, noAssert, this, arguments, var=var): + var = Scope({u'byteLength':byteLength, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset, u'this':this, u'writeIntBE':PyJs_writeIntBE_4261_, u'value':value}, var) + var.registers([u'byteLength', u'noAssert', u'sub', u'i', u'value', u'limit', u'offset', u'mul']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.put(u'limit', var.get(u'Math').callprop(u'pow', Js(2.0), ((Js(8.0)*var.get(u'byteLength'))-Js(1.0)))) + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), var.get(u'byteLength'), (var.get(u'limit')-Js(1.0)), (-var.get(u'limit'))) + var.put(u'i', (var.get(u'byteLength')-Js(1.0))) + var.put(u'mul', Js(1.0)) + var.put(u'sub', (Js(1.0) if (var.get(u'value')<Js(0.0)) else Js(0.0))) + var.get(u"this").put((var.get(u'offset')+var.get(u'i')), (var.get(u'value')&Js(255))) + while ((var.put(u'i',Js(var.get(u'i').to_number())-Js(1))>=Js(0.0)) and var.put(u'mul', Js(256), u'*')): + var.get(u"this").put((var.get(u'offset')+var.get(u'i')), ((((var.get(u'value')/var.get(u'mul'))>>Js(0.0))-var.get(u'sub'))&Js(255))) + return (var.get(u'offset')+var.get(u'byteLength')) + PyJs_writeIntBE_4261_._set_name(u'writeIntBE') + var.get(u'Buffer').get(u'prototype').put(u'writeIntBE', PyJs_writeIntBE_4261_) + @Js + def PyJs_writeInt8_4262_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'writeInt8':PyJs_writeInt8_4262_, u'noAssert':noAssert, u'this':this, u'value':value, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(1.0), Js(127), (-Js(128))) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT').neg(): + var.put(u'value', var.get(u'Math').callprop(u'floor', var.get(u'value'))) + if (var.get(u'value')<Js(0.0)): + var.put(u'value', ((Js(255)+var.get(u'value'))+Js(1.0))) + var.get(u"this").put(var.get(u'offset'), (var.get(u'value')&Js(255))) + return (var.get(u'offset')+Js(1.0)) + PyJs_writeInt8_4262_._set_name(u'writeInt8') + var.get(u'Buffer').get(u'prototype').put(u'writeInt8', PyJs_writeInt8_4262_) + @Js + def PyJs_writeInt16LE_4263_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'this':this, u'value':value, u'writeInt16LE':PyJs_writeInt16LE_4263_, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(2.0), Js(32767), (-Js(32768))) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.get(u"this").put(var.get(u'offset'), (var.get(u'value')&Js(255))) + var.get(u"this").put((var.get(u'offset')+Js(1.0)), PyJsBshift(var.get(u'value'),Js(8.0))) + else: + var.get(u'objectWriteUInt16')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), var.get(u'true')) + return (var.get(u'offset')+Js(2.0)) + PyJs_writeInt16LE_4263_._set_name(u'writeInt16LE') + var.get(u'Buffer').get(u'prototype').put(u'writeInt16LE', PyJs_writeInt16LE_4263_) + @Js + def PyJs_writeInt16BE_4264_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'this':this, u'value':value, u'arguments':arguments, u'offset':offset, u'writeInt16BE':PyJs_writeInt16BE_4264_}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(2.0), Js(32767), (-Js(32768))) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.get(u"this").put(var.get(u'offset'), PyJsBshift(var.get(u'value'),Js(8.0))) + var.get(u"this").put((var.get(u'offset')+Js(1.0)), (var.get(u'value')&Js(255))) + else: + var.get(u'objectWriteUInt16')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(False)) + return (var.get(u'offset')+Js(2.0)) + PyJs_writeInt16BE_4264_._set_name(u'writeInt16BE') + var.get(u'Buffer').get(u'prototype').put(u'writeInt16BE', PyJs_writeInt16BE_4264_) + @Js + def PyJs_writeInt32LE_4265_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'this':this, u'value':value, u'arguments':arguments, u'offset':offset, u'writeInt32LE':PyJs_writeInt32LE_4265_}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(4.0), Js(2147483647), (-Js(2147483648))) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.get(u"this").put(var.get(u'offset'), (var.get(u'value')&Js(255))) + var.get(u"this").put((var.get(u'offset')+Js(1.0)), PyJsBshift(var.get(u'value'),Js(8.0))) + var.get(u"this").put((var.get(u'offset')+Js(2.0)), PyJsBshift(var.get(u'value'),Js(16.0))) + var.get(u"this").put((var.get(u'offset')+Js(3.0)), PyJsBshift(var.get(u'value'),Js(24.0))) + else: + var.get(u'objectWriteUInt32')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), var.get(u'true')) + return (var.get(u'offset')+Js(4.0)) + PyJs_writeInt32LE_4265_._set_name(u'writeInt32LE') + var.get(u'Buffer').get(u'prototype').put(u'writeInt32LE', PyJs_writeInt32LE_4265_) + @Js + def PyJs_writeInt32BE_4266_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'this':this, u'value':value, u'writeInt32BE':PyJs_writeInt32BE_4266_, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(4.0), Js(2147483647), (-Js(2147483648))) + if (var.get(u'value')<Js(0.0)): + var.put(u'value', ((Js(4294967295)+var.get(u'value'))+Js(1.0))) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.get(u"this").put(var.get(u'offset'), PyJsBshift(var.get(u'value'),Js(24.0))) + var.get(u"this").put((var.get(u'offset')+Js(1.0)), PyJsBshift(var.get(u'value'),Js(16.0))) + var.get(u"this").put((var.get(u'offset')+Js(2.0)), PyJsBshift(var.get(u'value'),Js(8.0))) + var.get(u"this").put((var.get(u'offset')+Js(3.0)), (var.get(u'value')&Js(255))) + else: + var.get(u'objectWriteUInt32')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(False)) + return (var.get(u'offset')+Js(4.0)) + PyJs_writeInt32BE_4266_._set_name(u'writeInt32BE') + var.get(u'Buffer').get(u'prototype').put(u'writeInt32BE', PyJs_writeInt32BE_4266_) + pass + pass + @Js + def PyJs_writeFloatLE_4267_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'this':this, u'value':value, u'arguments':arguments, u'offset':offset, u'writeFloatLE':PyJs_writeFloatLE_4267_}, var) + var.registers([u'noAssert', u'value', u'offset']) + return var.get(u'writeFloat')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), var.get(u'true'), var.get(u'noAssert')) + PyJs_writeFloatLE_4267_._set_name(u'writeFloatLE') + var.get(u'Buffer').get(u'prototype').put(u'writeFloatLE', PyJs_writeFloatLE_4267_) + @Js + def PyJs_writeFloatBE_4268_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'this':this, u'value':value, u'writeFloatBE':PyJs_writeFloatBE_4268_, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + return var.get(u'writeFloat')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(False), var.get(u'noAssert')) + PyJs_writeFloatBE_4268_._set_name(u'writeFloatBE') + var.get(u'Buffer').get(u'prototype').put(u'writeFloatBE', PyJs_writeFloatBE_4268_) + pass + @Js + def PyJs_writeDoubleLE_4269_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'this':this, u'value':value, u'writeDoubleLE':PyJs_writeDoubleLE_4269_, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + return var.get(u'writeDouble')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), var.get(u'true'), var.get(u'noAssert')) + PyJs_writeDoubleLE_4269_._set_name(u'writeDoubleLE') + var.get(u'Buffer').get(u'prototype').put(u'writeDoubleLE', PyJs_writeDoubleLE_4269_) + @Js + def PyJs_writeDoubleBE_4270_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'this':this, u'value':value, u'arguments':arguments, u'offset':offset, u'writeDoubleBE':PyJs_writeDoubleBE_4270_}, var) + var.registers([u'noAssert', u'value', u'offset']) + return var.get(u'writeDouble')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(False), var.get(u'noAssert')) + PyJs_writeDoubleBE_4270_._set_name(u'writeDoubleBE') + var.get(u'Buffer').get(u'prototype').put(u'writeDoubleBE', PyJs_writeDoubleBE_4270_) + @Js + def PyJs_copy_4271_(target, targetStart, start, end, this, arguments, var=var): + var = Scope({u'start':start, u'targetStart':targetStart, u'end':end, u'target':target, u'this':this, u'copy':PyJs_copy_4271_, u'arguments':arguments}, var) + var.registers([u'targetStart', u'end', u'target', u'i', u'len', u'start']) + if var.get(u'start').neg(): + var.put(u'start', Js(0.0)) + if (var.get(u'end').neg() and PyJsStrictNeq(var.get(u'end'),Js(0.0))): + var.put(u'end', var.get(u"this").get(u'length')) + if (var.get(u'targetStart')>=var.get(u'target').get(u'length')): + var.put(u'targetStart', var.get(u'target').get(u'length')) + if var.get(u'targetStart').neg(): + var.put(u'targetStart', Js(0.0)) + if ((var.get(u'end')>Js(0.0)) and (var.get(u'end')<var.get(u'start'))): + var.put(u'end', var.get(u'start')) + if PyJsStrictEq(var.get(u'end'),var.get(u'start')): + return Js(0.0) + if (PyJsStrictEq(var.get(u'target').get(u'length'),Js(0.0)) or PyJsStrictEq(var.get(u"this").get(u'length'),Js(0.0))): + return Js(0.0) + if (var.get(u'targetStart')<Js(0.0)): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'targetStart out of bounds'))) + raise PyJsTempException + if ((var.get(u'start')<Js(0.0)) or (var.get(u'start')>=var.get(u"this").get(u'length'))): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'sourceStart out of bounds'))) + raise PyJsTempException + if (var.get(u'end')<Js(0.0)): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'sourceEnd out of bounds'))) + raise PyJsTempException + if (var.get(u'end')>var.get(u"this").get(u'length')): + var.put(u'end', var.get(u"this").get(u'length')) + if ((var.get(u'target').get(u'length')-var.get(u'targetStart'))<(var.get(u'end')-var.get(u'start'))): + var.put(u'end', ((var.get(u'target').get(u'length')-var.get(u'targetStart'))+var.get(u'start'))) + var.put(u'len', (var.get(u'end')-var.get(u'start'))) + pass + if ((PyJsStrictEq(var.get(u"this"),var.get(u'target')) and (var.get(u'start')<var.get(u'targetStart'))) and (var.get(u'targetStart')<var.get(u'end'))): + #for JS loop + var.put(u'i', (var.get(u'len')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + var.get(u'target').put((var.get(u'i')+var.get(u'targetStart')), var.get(u"this").get((var.get(u'i')+var.get(u'start')))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + else: + if ((var.get(u'len')<Js(1000.0)) or var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT').neg()): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'len')): + try: + var.get(u'target').put((var.get(u'i')+var.get(u'targetStart')), var.get(u"this").get((var.get(u'i')+var.get(u'start')))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + else: + var.get(u'Uint8Array').get(u'prototype').get(u'set').callprop(u'call', var.get(u'target'), var.get(u"this").callprop(u'subarray', var.get(u'start'), (var.get(u'start')+var.get(u'len'))), var.get(u'targetStart')) + return var.get(u'len') + PyJs_copy_4271_._set_name(u'copy') + var.get(u'Buffer').get(u'prototype').put(u'copy', PyJs_copy_4271_) + @Js + def PyJs_fill_4272_(value, start, end, this, arguments, var=var): + var = Scope({u'end':end, u'this':this, u'value':value, u'start':start, u'arguments':arguments, u'fill':PyJs_fill_4272_}, var) + var.registers([u'end', u'i', u'bytes', u'value', u'start', u'len']) + if var.get(u'value').neg(): + var.put(u'value', Js(0.0)) + if var.get(u'start').neg(): + var.put(u'start', Js(0.0)) + if var.get(u'end').neg(): + var.put(u'end', var.get(u"this").get(u'length')) + if (var.get(u'end')<var.get(u'start')): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'end < start'))) + raise PyJsTempException + if PyJsStrictEq(var.get(u'end'),var.get(u'start')): + return var.get('undefined') + if PyJsStrictEq(var.get(u"this").get(u'length'),Js(0.0)): + return var.get('undefined') + if ((var.get(u'start')<Js(0.0)) or (var.get(u'start')>=var.get(u"this").get(u'length'))): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'start out of bounds'))) + raise PyJsTempException + if ((var.get(u'end')<Js(0.0)) or (var.get(u'end')>var.get(u"this").get(u'length'))): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'end out of bounds'))) + raise PyJsTempException + pass + if PyJsStrictEq(var.get(u'value',throw=False).typeof(),Js(u'number')): + #for JS loop + var.put(u'i', var.get(u'start')) + while (var.get(u'i')<var.get(u'end')): + try: + var.get(u"this").put(var.get(u'i'), var.get(u'value')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + else: + var.put(u'bytes', var.get(u'utf8ToBytes')(var.get(u'value').callprop(u'toString'))) + var.put(u'len', var.get(u'bytes').get(u'length')) + #for JS loop + var.put(u'i', var.get(u'start')) + while (var.get(u'i')<var.get(u'end')): + try: + var.get(u"this").put(var.get(u'i'), var.get(u'bytes').get((var.get(u'i')%var.get(u'len')))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u"this") + PyJs_fill_4272_._set_name(u'fill') + var.get(u'Buffer').get(u'prototype').put(u'fill', PyJs_fill_4272_) + var.put(u'INVALID_BASE64_RE', JsRegExp(u'/[^+\\/0-9A-Za-z-_]/g')) + pass + pass + pass + pass + pass + pass + pass + pass + PyJs_anonymous_4217_._set_name(u'anonymous') + PyJs_anonymous_4217_.callprop(u'call', var.get(u"this"), (var.get(u'global') if PyJsStrictNeq(var.get(u'global',throw=False).typeof(),Js(u'undefined')) else (var.get(u'self') if PyJsStrictNeq(var.get(u'self',throw=False).typeof(),Js(u'undefined')) else (var.get(u'window') if PyJsStrictNeq(var.get(u'window',throw=False).typeof(),Js(u'undefined')) else PyJs_Object_4216_)))) +PyJs_anonymous_4215_._set_name(u'anonymous') +PyJs_Object_4273_ = Js({u'base64-js':Js(526.0),u'ieee754':Js(527.0),u'isarray':Js(528.0)}) +@Js +def PyJs_anonymous_4274_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'tripletToBase64', u'Arr', u'fromByteArray', u'require', u'exports', u'encodeChunk', u'init', u'toByteArray', u'lookup', u'module', u'revLookup']) + @Js + def PyJsHoisted_tripletToBase64_(num, this, arguments, var=var): + var = Scope({u'this':this, u'num':num, u'arguments':arguments}, var) + var.registers([u'num']) + return (((var.get(u'lookup').get(((var.get(u'num')>>Js(18.0))&Js(63)))+var.get(u'lookup').get(((var.get(u'num')>>Js(12.0))&Js(63))))+var.get(u'lookup').get(((var.get(u'num')>>Js(6.0))&Js(63))))+var.get(u'lookup').get((var.get(u'num')&Js(63)))) + PyJsHoisted_tripletToBase64_.func_name = u'tripletToBase64' + var.put(u'tripletToBase64', PyJsHoisted_tripletToBase64_) + @Js + def PyJsHoisted_init_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'code', u'len']) + var.put(u'code', Js(u'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/')) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u'code').get(u'length')) + while (var.get(u'i')<var.get(u'len')): + try: + var.get(u'lookup').put(var.get(u'i'), var.get(u'code').get(var.get(u'i'))) + var.get(u'revLookup').put(var.get(u'code').callprop(u'charCodeAt', var.get(u'i')), var.get(u'i')) + finally: + var.put(u'i',Js(var.get(u'i').to_number())+Js(1)) + var.get(u'revLookup').put(Js(u'-').callprop(u'charCodeAt', Js(0.0)), Js(62.0)) + var.get(u'revLookup').put(Js(u'_').callprop(u'charCodeAt', Js(0.0)), Js(63.0)) + PyJsHoisted_init_.func_name = u'init' + var.put(u'init', PyJsHoisted_init_) + @Js + def PyJsHoisted_toByteArray_(b64, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'b64':b64}, var) + var.registers([u'tmp', u'arr', u'b64', u'i', u'j', u'l', u'len', u'L', u'placeHolders']) + pass + var.put(u'len', var.get(u'b64').get(u'length')) + if ((var.get(u'len')%Js(4.0))>Js(0.0)): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Invalid string. Length must be a multiple of 4'))) + raise PyJsTempException + var.put(u'placeHolders', (Js(2.0) if PyJsStrictEq(var.get(u'b64').get((var.get(u'len')-Js(2.0))),Js(u'=')) else (Js(1.0) if PyJsStrictEq(var.get(u'b64').get((var.get(u'len')-Js(1.0))),Js(u'=')) else Js(0.0)))) + var.put(u'arr', var.get(u'Arr').create((((var.get(u'len')*Js(3.0))/Js(4.0))-var.get(u'placeHolders')))) + var.put(u'l', ((var.get(u'len')-Js(4.0)) if (var.get(u'placeHolders')>Js(0.0)) else var.get(u'len'))) + var.put(u'L', Js(0.0)) + #for JS loop + PyJsComma(var.put(u'i', Js(0.0)),var.put(u'j', Js(0.0))) + while (var.get(u'i')<var.get(u'l')): + try: + def PyJs_LONG_4275_(var=var): + return var.put(u'tmp', ((((var.get(u'revLookup').get(var.get(u'b64').callprop(u'charCodeAt', var.get(u'i')))<<Js(18.0))|(var.get(u'revLookup').get(var.get(u'b64').callprop(u'charCodeAt', (var.get(u'i')+Js(1.0))))<<Js(12.0)))|(var.get(u'revLookup').get(var.get(u'b64').callprop(u'charCodeAt', (var.get(u'i')+Js(2.0))))<<Js(6.0)))|var.get(u'revLookup').get(var.get(u'b64').callprop(u'charCodeAt', (var.get(u'i')+Js(3.0)))))) + PyJs_LONG_4275_() + var.get(u'arr').put((var.put(u'L',Js(var.get(u'L').to_number())+Js(1))-Js(1)), ((var.get(u'tmp')>>Js(16.0))&Js(255))) + var.get(u'arr').put((var.put(u'L',Js(var.get(u'L').to_number())+Js(1))-Js(1)), ((var.get(u'tmp')>>Js(8.0))&Js(255))) + var.get(u'arr').put((var.put(u'L',Js(var.get(u'L').to_number())+Js(1))-Js(1)), (var.get(u'tmp')&Js(255))) + finally: + PyJsComma(var.put(u'i', Js(4.0), u'+'),var.put(u'j', Js(3.0), u'+')) + if PyJsStrictEq(var.get(u'placeHolders'),Js(2.0)): + var.put(u'tmp', ((var.get(u'revLookup').get(var.get(u'b64').callprop(u'charCodeAt', var.get(u'i')))<<Js(2.0))|(var.get(u'revLookup').get(var.get(u'b64').callprop(u'charCodeAt', (var.get(u'i')+Js(1.0))))>>Js(4.0)))) + var.get(u'arr').put((var.put(u'L',Js(var.get(u'L').to_number())+Js(1))-Js(1)), (var.get(u'tmp')&Js(255))) + else: + if PyJsStrictEq(var.get(u'placeHolders'),Js(1.0)): + var.put(u'tmp', (((var.get(u'revLookup').get(var.get(u'b64').callprop(u'charCodeAt', var.get(u'i')))<<Js(10.0))|(var.get(u'revLookup').get(var.get(u'b64').callprop(u'charCodeAt', (var.get(u'i')+Js(1.0))))<<Js(4.0)))|(var.get(u'revLookup').get(var.get(u'b64').callprop(u'charCodeAt', (var.get(u'i')+Js(2.0))))>>Js(2.0)))) + var.get(u'arr').put((var.put(u'L',Js(var.get(u'L').to_number())+Js(1))-Js(1)), ((var.get(u'tmp')>>Js(8.0))&Js(255))) + var.get(u'arr').put((var.put(u'L',Js(var.get(u'L').to_number())+Js(1))-Js(1)), (var.get(u'tmp')&Js(255))) + return var.get(u'arr') + PyJsHoisted_toByteArray_.func_name = u'toByteArray' + var.put(u'toByteArray', PyJsHoisted_toByteArray_) + @Js + def PyJsHoisted_fromByteArray_(uint8, this, arguments, var=var): + var = Scope({u'this':this, u'uint8':uint8, u'arguments':arguments}, var) + var.registers([u'tmp', u'i', u'uint8', u'len', u'len2', u'parts', u'extraBytes', u'output', u'maxChunkLength']) + pass + var.put(u'len', var.get(u'uint8').get(u'length')) + var.put(u'extraBytes', (var.get(u'len')%Js(3.0))) + var.put(u'output', Js(u'')) + var.put(u'parts', Js([])) + var.put(u'maxChunkLength', Js(16383.0)) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len2', (var.get(u'len')-var.get(u'extraBytes'))) + while (var.get(u'i')<var.get(u'len2')): + try: + var.get(u'parts').callprop(u'push', var.get(u'encodeChunk')(var.get(u'uint8'), var.get(u'i'), (var.get(u'len2') if ((var.get(u'i')+var.get(u'maxChunkLength'))>var.get(u'len2')) else (var.get(u'i')+var.get(u'maxChunkLength'))))) + finally: + var.put(u'i', var.get(u'maxChunkLength'), u'+') + if PyJsStrictEq(var.get(u'extraBytes'),Js(1.0)): + var.put(u'tmp', var.get(u'uint8').get((var.get(u'len')-Js(1.0)))) + var.put(u'output', var.get(u'lookup').get((var.get(u'tmp')>>Js(2.0))), u'+') + var.put(u'output', var.get(u'lookup').get(((var.get(u'tmp')<<Js(4.0))&Js(63))), u'+') + var.put(u'output', Js(u'=='), u'+') + else: + if PyJsStrictEq(var.get(u'extraBytes'),Js(2.0)): + var.put(u'tmp', ((var.get(u'uint8').get((var.get(u'len')-Js(2.0)))<<Js(8.0))+var.get(u'uint8').get((var.get(u'len')-Js(1.0))))) + var.put(u'output', var.get(u'lookup').get((var.get(u'tmp')>>Js(10.0))), u'+') + var.put(u'output', var.get(u'lookup').get(((var.get(u'tmp')>>Js(4.0))&Js(63))), u'+') + var.put(u'output', var.get(u'lookup').get(((var.get(u'tmp')<<Js(2.0))&Js(63))), u'+') + var.put(u'output', Js(u'='), u'+') + var.get(u'parts').callprop(u'push', var.get(u'output')) + return var.get(u'parts').callprop(u'join', Js(u'')) + PyJsHoisted_fromByteArray_.func_name = u'fromByteArray' + var.put(u'fromByteArray', PyJsHoisted_fromByteArray_) + @Js + def PyJsHoisted_encodeChunk_(uint8, start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'uint8':uint8, u'arguments':arguments}, var) + var.registers([u'tmp', u'end', u'i', u'uint8', u'start', u'output']) + pass + var.put(u'output', Js([])) + #for JS loop + var.put(u'i', var.get(u'start')) + while (var.get(u'i')<var.get(u'end')): + try: + var.put(u'tmp', (((var.get(u'uint8').get(var.get(u'i'))<<Js(16.0))+(var.get(u'uint8').get((var.get(u'i')+Js(1.0)))<<Js(8.0)))+var.get(u'uint8').get((var.get(u'i')+Js(2.0))))) + var.get(u'output').callprop(u'push', var.get(u'tripletToBase64')(var.get(u'tmp'))) + finally: + var.put(u'i', Js(3.0), u'+') + return var.get(u'output').callprop(u'join', Js(u'')) + PyJsHoisted_encodeChunk_.func_name = u'encodeChunk' + var.put(u'encodeChunk', PyJsHoisted_encodeChunk_) + Js(u'use strict') + var.get(u'exports').put(u'toByteArray', var.get(u'toByteArray')) + var.get(u'exports').put(u'fromByteArray', var.get(u'fromByteArray')) + var.put(u'lookup', Js([])) + var.put(u'revLookup', Js([])) + var.put(u'Arr', (var.get(u'Uint8Array') if PyJsStrictNeq(var.get(u'Uint8Array',throw=False).typeof(),Js(u'undefined')) else var.get(u'Array'))) + pass + var.get(u'init')() + pass + pass + pass + pass +PyJs_anonymous_4274_._set_name(u'anonymous') +PyJs_Object_4276_ = Js({}) +@Js +def PyJs_anonymous_4277_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_4278_(buffer, offset, isLE, mLen, nBytes, this, arguments, var=var): + var = Scope({u'this':this, u'nBytes':nBytes, u'mLen':mLen, u'offset':offset, u'buffer':buffer, u'isLE':isLE, u'arguments':arguments}, var) + var.registers([u'nBits', u'e', u'd', u'mLen', u'i', u'eMax', u'offset', u'm', u'eLen', u'buffer', u's', u'nBytes', u'eBias', u'isLE']) + pass + var.put(u'eLen', (((var.get(u'nBytes')*Js(8.0))-var.get(u'mLen'))-Js(1.0))) + var.put(u'eMax', ((Js(1.0)<<var.get(u'eLen'))-Js(1.0))) + var.put(u'eBias', (var.get(u'eMax')>>Js(1.0))) + var.put(u'nBits', (-Js(7.0))) + var.put(u'i', ((var.get(u'nBytes')-Js(1.0)) if var.get(u'isLE') else Js(0.0))) + var.put(u'd', ((-Js(1.0)) if var.get(u'isLE') else Js(1.0))) + var.put(u's', var.get(u'buffer').get((var.get(u'offset')+var.get(u'i')))) + var.put(u'i', var.get(u'd'), u'+') + var.put(u'e', (var.get(u's')&((Js(1.0)<<(-var.get(u'nBits')))-Js(1.0)))) + var.put(u's', (-var.get(u'nBits')), u'>>') + var.put(u'nBits', var.get(u'eLen'), u'+') + #for JS loop + + while (var.get(u'nBits')>Js(0.0)): + try: + pass + finally: + PyJsComma(PyJsComma(var.put(u'e', ((var.get(u'e')*Js(256.0))+var.get(u'buffer').get((var.get(u'offset')+var.get(u'i'))))),var.put(u'i', var.get(u'd'), u'+')),var.put(u'nBits', Js(8.0), u'-')) + var.put(u'm', (var.get(u'e')&((Js(1.0)<<(-var.get(u'nBits')))-Js(1.0)))) + var.put(u'e', (-var.get(u'nBits')), u'>>') + var.put(u'nBits', var.get(u'mLen'), u'+') + #for JS loop + + while (var.get(u'nBits')>Js(0.0)): + try: + pass + finally: + PyJsComma(PyJsComma(var.put(u'm', ((var.get(u'm')*Js(256.0))+var.get(u'buffer').get((var.get(u'offset')+var.get(u'i'))))),var.put(u'i', var.get(u'd'), u'+')),var.put(u'nBits', Js(8.0), u'-')) + if PyJsStrictEq(var.get(u'e'),Js(0.0)): + var.put(u'e', (Js(1.0)-var.get(u'eBias'))) + else: + if PyJsStrictEq(var.get(u'e'),var.get(u'eMax')): + return (var.get(u'NaN') if var.get(u'm') else (((-Js(1.0)) if var.get(u's') else Js(1.0))*var.get(u'Infinity'))) + else: + var.put(u'm', (var.get(u'm')+var.get(u'Math').callprop(u'pow', Js(2.0), var.get(u'mLen')))) + var.put(u'e', (var.get(u'e')-var.get(u'eBias'))) + return ((((-Js(1.0)) if var.get(u's') else Js(1.0))*var.get(u'm'))*var.get(u'Math').callprop(u'pow', Js(2.0), (var.get(u'e')-var.get(u'mLen')))) + PyJs_anonymous_4278_._set_name(u'anonymous') + var.get(u'exports').put(u'read', PyJs_anonymous_4278_) + @Js + def PyJs_anonymous_4279_(buffer, value, offset, isLE, mLen, nBytes, this, arguments, var=var): + var = Scope({u'mLen':mLen, u'buffer':buffer, u'value':value, u'this':this, u'nBytes':nBytes, u'offset':offset, u'isLE':isLE, u'arguments':arguments}, var) + var.registers([u'rt', u'c', u'e', u'd', u'mLen', u'i', u'eMax', u'offset', u'm', u'eLen', u'buffer', u's', u'value', u'eBias', u'isLE', u'nBytes']) + pass + var.put(u'eLen', (((var.get(u'nBytes')*Js(8.0))-var.get(u'mLen'))-Js(1.0))) + var.put(u'eMax', ((Js(1.0)<<var.get(u'eLen'))-Js(1.0))) + var.put(u'eBias', (var.get(u'eMax')>>Js(1.0))) + var.put(u'rt', ((var.get(u'Math').callprop(u'pow', Js(2.0), (-Js(24.0)))-var.get(u'Math').callprop(u'pow', Js(2.0), (-Js(77.0)))) if PyJsStrictEq(var.get(u'mLen'),Js(23.0)) else Js(0.0))) + var.put(u'i', (Js(0.0) if var.get(u'isLE') else (var.get(u'nBytes')-Js(1.0)))) + var.put(u'd', (Js(1.0) if var.get(u'isLE') else (-Js(1.0)))) + var.put(u's', (Js(1.0) if ((var.get(u'value')<Js(0.0)) or (PyJsStrictEq(var.get(u'value'),Js(0.0)) and ((Js(1.0)/var.get(u'value'))<Js(0.0)))) else Js(0.0))) + var.put(u'value', var.get(u'Math').callprop(u'abs', var.get(u'value'))) + if (var.get(u'isNaN')(var.get(u'value')) or PyJsStrictEq(var.get(u'value'),var.get(u'Infinity'))): + var.put(u'm', (Js(1.0) if var.get(u'isNaN')(var.get(u'value')) else Js(0.0))) + var.put(u'e', var.get(u'eMax')) + else: + var.put(u'e', var.get(u'Math').callprop(u'floor', (var.get(u'Math').callprop(u'log', var.get(u'value'))/var.get(u'Math').get(u'LN2')))) + if ((var.get(u'value')*var.put(u'c', var.get(u'Math').callprop(u'pow', Js(2.0), (-var.get(u'e')))))<Js(1.0)): + (var.put(u'e',Js(var.get(u'e').to_number())-Js(1))+Js(1)) + var.put(u'c', Js(2.0), u'*') + if ((var.get(u'e')+var.get(u'eBias'))>=Js(1.0)): + var.put(u'value', (var.get(u'rt')/var.get(u'c')), u'+') + else: + var.put(u'value', (var.get(u'rt')*var.get(u'Math').callprop(u'pow', Js(2.0), (Js(1.0)-var.get(u'eBias')))), u'+') + if ((var.get(u'value')*var.get(u'c'))>=Js(2.0)): + (var.put(u'e',Js(var.get(u'e').to_number())+Js(1))-Js(1)) + var.put(u'c', Js(2.0), u'/') + if ((var.get(u'e')+var.get(u'eBias'))>=var.get(u'eMax')): + var.put(u'm', Js(0.0)) + var.put(u'e', var.get(u'eMax')) + else: + if ((var.get(u'e')+var.get(u'eBias'))>=Js(1.0)): + var.put(u'm', (((var.get(u'value')*var.get(u'c'))-Js(1.0))*var.get(u'Math').callprop(u'pow', Js(2.0), var.get(u'mLen')))) + var.put(u'e', (var.get(u'e')+var.get(u'eBias'))) + else: + var.put(u'm', ((var.get(u'value')*var.get(u'Math').callprop(u'pow', Js(2.0), (var.get(u'eBias')-Js(1.0))))*var.get(u'Math').callprop(u'pow', Js(2.0), var.get(u'mLen')))) + var.put(u'e', Js(0.0)) + #for JS loop + + while (var.get(u'mLen')>=Js(8.0)): + try: + pass + finally: + PyJsComma(PyJsComma(PyJsComma(var.get(u'buffer').put((var.get(u'offset')+var.get(u'i')), (var.get(u'm')&Js(255))),var.put(u'i', var.get(u'd'), u'+')),var.put(u'm', Js(256.0), u'/')),var.put(u'mLen', Js(8.0), u'-')) + var.put(u'e', ((var.get(u'e')<<var.get(u'mLen'))|var.get(u'm'))) + var.put(u'eLen', var.get(u'mLen'), u'+') + #for JS loop + + while (var.get(u'eLen')>Js(0.0)): + try: + pass + finally: + PyJsComma(PyJsComma(PyJsComma(var.get(u'buffer').put((var.get(u'offset')+var.get(u'i')), (var.get(u'e')&Js(255))),var.put(u'i', var.get(u'd'), u'+')),var.put(u'e', Js(256.0), u'/')),var.put(u'eLen', Js(8.0), u'-')) + var.get(u'buffer').put(((var.get(u'offset')+var.get(u'i'))-var.get(u'd')), (var.get(u's')*Js(128.0)), u'|') + PyJs_anonymous_4279_._set_name(u'anonymous') + var.get(u'exports').put(u'write', PyJs_anonymous_4279_) +PyJs_anonymous_4277_._set_name(u'anonymous') +PyJs_Object_4280_ = Js({}) +@Js +def PyJs_anonymous_4281_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'toString', u'exports', u'module']) + PyJs_Object_4282_ = Js({}) + var.put(u'toString', PyJs_Object_4282_.get(u'toString')) + @Js + def PyJs_anonymous_4283_(arr, this, arguments, var=var): + var = Scope({u'this':this, u'arr':arr, u'arguments':arguments}, var) + var.registers([u'arr']) + return (var.get(u'toString').callprop(u'call', var.get(u'arr'))==Js(u'[object Array]')) + PyJs_anonymous_4283_._set_name(u'anonymous') + var.get(u'module').put(u'exports', (var.get(u'Array').get(u'isArray') or PyJs_anonymous_4283_)) +PyJs_anonymous_4281_._set_name(u'anonymous') +PyJs_Object_4284_ = Js({}) +@Js +def PyJs_anonymous_4285_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + if PyJsStrictEq(var.get(u'Object').get(u'create').typeof(),Js(u'function')): + @Js + def PyJs_inherits_4286_(ctor, superCtor, this, arguments, var=var): + var = Scope({u'this':this, u'inherits':PyJs_inherits_4286_, u'superCtor':superCtor, u'arguments':arguments, u'ctor':ctor}, var) + var.registers([u'superCtor', u'ctor']) + var.get(u'ctor').put(u'super_', var.get(u'superCtor')) + PyJs_Object_4288_ = Js({u'value':var.get(u'ctor'),u'enumerable':Js(False),u'writable':var.get(u'true'),u'configurable':var.get(u'true')}) + PyJs_Object_4287_ = Js({u'constructor':PyJs_Object_4288_}) + var.get(u'ctor').put(u'prototype', var.get(u'Object').callprop(u'create', var.get(u'superCtor').get(u'prototype'), PyJs_Object_4287_)) + PyJs_inherits_4286_._set_name(u'inherits') + var.get(u'module').put(u'exports', PyJs_inherits_4286_) + else: + @Js + def PyJs_inherits_4289_(ctor, superCtor, this, arguments, var=var): + var = Scope({u'this':this, u'inherits':PyJs_inherits_4289_, u'superCtor':superCtor, u'arguments':arguments, u'ctor':ctor}, var) + var.registers([u'TempCtor', u'superCtor', u'ctor']) + var.get(u'ctor').put(u'super_', var.get(u'superCtor')) + @Js + def PyJs_anonymous_4290_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJs_anonymous_4290_._set_name(u'anonymous') + var.put(u'TempCtor', PyJs_anonymous_4290_) + var.get(u'TempCtor').put(u'prototype', var.get(u'superCtor').get(u'prototype')) + var.get(u'ctor').put(u'prototype', var.get(u'TempCtor').create()) + var.get(u'ctor').get(u'prototype').put(u'constructor', var.get(u'ctor')) + PyJs_inherits_4289_._set_name(u'inherits') + var.get(u'module').put(u'exports', PyJs_inherits_4289_) +PyJs_anonymous_4285_._set_name(u'anonymous') +PyJs_Object_4291_ = Js({}) +@Js +def PyJs_anonymous_4292_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_4293_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'splitPath', u'substr', u'process', u'normalizeArray', u'filter', u'splitPathRe']) + @Js + def PyJsHoisted_filter_(xs, f, this, arguments, var=var): + var = Scope({u'this':this, u'xs':xs, u'arguments':arguments, u'f':f}, var) + var.registers([u'i', u'res', u'f', u'xs']) + if var.get(u'xs').get(u'filter'): + return var.get(u'xs').callprop(u'filter', var.get(u'f')) + var.put(u'res', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'xs').get(u'length')): + try: + if var.get(u'f')(var.get(u'xs').get(var.get(u'i')), var.get(u'i'), var.get(u'xs')): + var.get(u'res').callprop(u'push', var.get(u'xs').get(var.get(u'i'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'res') + PyJsHoisted_filter_.func_name = u'filter' + var.put(u'filter', PyJsHoisted_filter_) + @Js + def PyJsHoisted_normalizeArray_(parts, allowAboveRoot, this, arguments, var=var): + var = Scope({u'allowAboveRoot':allowAboveRoot, u'this':this, u'parts':parts, u'arguments':arguments}, var) + var.registers([u'i', u'allowAboveRoot', u'parts', u'last', u'up']) + var.put(u'up', Js(0.0)) + #for JS loop + var.put(u'i', (var.get(u'parts').get(u'length')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + var.put(u'last', var.get(u'parts').get(var.get(u'i'))) + if PyJsStrictEq(var.get(u'last'),Js(u'.')): + var.get(u'parts').callprop(u'splice', var.get(u'i'), Js(1.0)) + else: + if PyJsStrictEq(var.get(u'last'),Js(u'..')): + var.get(u'parts').callprop(u'splice', var.get(u'i'), Js(1.0)) + (var.put(u'up',Js(var.get(u'up').to_number())+Js(1))-Js(1)) + else: + if var.get(u'up'): + var.get(u'parts').callprop(u'splice', var.get(u'i'), Js(1.0)) + (var.put(u'up',Js(var.get(u'up').to_number())-Js(1))+Js(1)) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + if var.get(u'allowAboveRoot'): + #for JS loop + + while (var.put(u'up',Js(var.get(u'up').to_number())-Js(1))+Js(1)): + try: + var.get(u'parts').callprop(u'unshift', Js(u'..')) + finally: + var.get(u'up') + return var.get(u'parts') + PyJsHoisted_normalizeArray_.func_name = u'normalizeArray' + var.put(u'normalizeArray', PyJsHoisted_normalizeArray_) + pass + var.put(u'splitPathRe', JsRegExp(u'/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/')) + @Js + def PyJs_anonymous_4294_(filename, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'filename':filename}, var) + var.registers([u'filename']) + return var.get(u'splitPathRe').callprop(u'exec', var.get(u'filename')).callprop(u'slice', Js(1.0)) + PyJs_anonymous_4294_._set_name(u'anonymous') + var.put(u'splitPath', PyJs_anonymous_4294_) + @Js + def PyJs_anonymous_4295_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'resolvedPath', u'path', u'resolvedAbsolute']) + var.put(u'resolvedPath', Js(u'')) + var.put(u'resolvedAbsolute', Js(False)) + #for JS loop + var.put(u'i', (var.get(u'arguments').get(u'length')-Js(1.0))) + while ((var.get(u'i')>=(-Js(1.0))) and var.get(u'resolvedAbsolute').neg()): + try: + var.put(u'path', (var.get(u'arguments').get(var.get(u'i')) if (var.get(u'i')>=Js(0.0)) else var.get(u'process').callprop(u'cwd'))) + if PyJsStrictNeq(var.get(u'path',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Arguments to path.resolve must be strings'))) + raise PyJsTempException + else: + if var.get(u'path').neg(): + continue + var.put(u'resolvedPath', ((var.get(u'path')+Js(u'/'))+var.get(u'resolvedPath'))) + var.put(u'resolvedAbsolute', PyJsStrictEq(var.get(u'path').callprop(u'charAt', Js(0.0)),Js(u'/'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + @Js + def PyJs_anonymous_4296_(p, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments}, var) + var.registers([u'p']) + return var.get(u'p').neg().neg() + PyJs_anonymous_4296_._set_name(u'anonymous') + var.put(u'resolvedPath', var.get(u'normalizeArray')(var.get(u'filter')(var.get(u'resolvedPath').callprop(u'split', Js(u'/')), PyJs_anonymous_4296_), var.get(u'resolvedAbsolute').neg()).callprop(u'join', Js(u'/'))) + return (((Js(u'/') if var.get(u'resolvedAbsolute') else Js(u''))+var.get(u'resolvedPath')) or Js(u'.')) + PyJs_anonymous_4295_._set_name(u'anonymous') + var.get(u'exports').put(u'resolve', PyJs_anonymous_4295_) + @Js + def PyJs_anonymous_4297_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path', u'trailingSlash', u'isAbsolute']) + var.put(u'isAbsolute', var.get(u'exports').callprop(u'isAbsolute', var.get(u'path'))) + var.put(u'trailingSlash', PyJsStrictEq(var.get(u'substr')(var.get(u'path'), (-Js(1.0))),Js(u'/'))) + @Js + def PyJs_anonymous_4298_(p, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments}, var) + var.registers([u'p']) + return var.get(u'p').neg().neg() + PyJs_anonymous_4298_._set_name(u'anonymous') + var.put(u'path', var.get(u'normalizeArray')(var.get(u'filter')(var.get(u'path').callprop(u'split', Js(u'/')), PyJs_anonymous_4298_), var.get(u'isAbsolute').neg()).callprop(u'join', Js(u'/'))) + if (var.get(u'path').neg() and var.get(u'isAbsolute').neg()): + var.put(u'path', Js(u'.')) + if (var.get(u'path') and var.get(u'trailingSlash')): + var.put(u'path', Js(u'/'), u'+') + return ((Js(u'/') if var.get(u'isAbsolute') else Js(u''))+var.get(u'path')) + PyJs_anonymous_4297_._set_name(u'anonymous') + var.get(u'exports').put(u'normalize', PyJs_anonymous_4297_) + @Js + def PyJs_anonymous_4299_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return PyJsStrictEq(var.get(u'path').callprop(u'charAt', Js(0.0)),Js(u'/')) + PyJs_anonymous_4299_._set_name(u'anonymous') + var.get(u'exports').put(u'isAbsolute', PyJs_anonymous_4299_) + @Js + def PyJs_anonymous_4300_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'paths']) + var.put(u'paths', var.get(u'Array').get(u'prototype').get(u'slice').callprop(u'call', var.get(u'arguments'), Js(0.0))) + @Js + def PyJs_anonymous_4301_(p, index, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments, u'index':index}, var) + var.registers([u'p', u'index']) + if PyJsStrictNeq(var.get(u'p',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Arguments to path.join must be strings'))) + raise PyJsTempException + return var.get(u'p') + PyJs_anonymous_4301_._set_name(u'anonymous') + return var.get(u'exports').callprop(u'normalize', var.get(u'filter')(var.get(u'paths'), PyJs_anonymous_4301_).callprop(u'join', Js(u'/'))) + PyJs_anonymous_4300_._set_name(u'anonymous') + var.get(u'exports').put(u'join', PyJs_anonymous_4300_) + @Js + def PyJs_anonymous_4302_(PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'this':this, u'to':to, u'from':PyJsArg_66726f6d_, u'arguments':arguments}, var) + var.registers([u'trim', u'outputParts', u'i', u'to', u'length', u'toParts', u'from', u'fromParts', u'samePartsLength']) + @Js + def PyJsHoisted_trim_(arr, this, arguments, var=var): + var = Scope({u'this':this, u'arr':arr, u'arguments':arguments}, var) + var.registers([u'start', u'arr', u'end']) + var.put(u'start', Js(0.0)) + #for JS loop + + while (var.get(u'start')<var.get(u'arr').get(u'length')): + try: + if PyJsStrictNeq(var.get(u'arr').get(var.get(u'start')),Js(u'')): + break + finally: + (var.put(u'start',Js(var.get(u'start').to_number())+Js(1))-Js(1)) + var.put(u'end', (var.get(u'arr').get(u'length')-Js(1.0))) + #for JS loop + + while (var.get(u'end')>=Js(0.0)): + try: + if PyJsStrictNeq(var.get(u'arr').get(var.get(u'end')),Js(u'')): + break + finally: + (var.put(u'end',Js(var.get(u'end').to_number())-Js(1))+Js(1)) + if (var.get(u'start')>var.get(u'end')): + return Js([]) + return var.get(u'arr').callprop(u'slice', var.get(u'start'), ((var.get(u'end')-var.get(u'start'))+Js(1.0))) + PyJsHoisted_trim_.func_name = u'trim' + var.put(u'trim', PyJsHoisted_trim_) + var.put(u'from', var.get(u'exports').callprop(u'resolve', var.get(u'from')).callprop(u'substr', Js(1.0))) + var.put(u'to', var.get(u'exports').callprop(u'resolve', var.get(u'to')).callprop(u'substr', Js(1.0))) + pass + var.put(u'fromParts', var.get(u'trim')(var.get(u'from').callprop(u'split', Js(u'/')))) + var.put(u'toParts', var.get(u'trim')(var.get(u'to').callprop(u'split', Js(u'/')))) + var.put(u'length', var.get(u'Math').callprop(u'min', var.get(u'fromParts').get(u'length'), var.get(u'toParts').get(u'length'))) + var.put(u'samePartsLength', var.get(u'length')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'length')): + try: + if PyJsStrictNeq(var.get(u'fromParts').get(var.get(u'i')),var.get(u'toParts').get(var.get(u'i'))): + var.put(u'samePartsLength', var.get(u'i')) + break + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.put(u'outputParts', Js([])) + #for JS loop + var.put(u'i', var.get(u'samePartsLength')) + while (var.get(u'i')<var.get(u'fromParts').get(u'length')): + try: + var.get(u'outputParts').callprop(u'push', Js(u'..')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.put(u'outputParts', var.get(u'outputParts').callprop(u'concat', var.get(u'toParts').callprop(u'slice', var.get(u'samePartsLength')))) + return var.get(u'outputParts').callprop(u'join', Js(u'/')) + PyJs_anonymous_4302_._set_name(u'anonymous') + var.get(u'exports').put(u'relative', PyJs_anonymous_4302_) + var.get(u'exports').put(u'sep', Js(u'/')) + var.get(u'exports').put(u'delimiter', Js(u':')) + @Js + def PyJs_anonymous_4303_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path', u'root', u'result', u'dir']) + var.put(u'result', var.get(u'splitPath')(var.get(u'path'))) + var.put(u'root', var.get(u'result').get(u'0')) + var.put(u'dir', var.get(u'result').get(u'1')) + if (var.get(u'root').neg() and var.get(u'dir').neg()): + return Js(u'.') + if var.get(u'dir'): + var.put(u'dir', var.get(u'dir').callprop(u'substr', Js(0.0), (var.get(u'dir').get(u'length')-Js(1.0)))) + return (var.get(u'root')+var.get(u'dir')) + PyJs_anonymous_4303_._set_name(u'anonymous') + var.get(u'exports').put(u'dirname', PyJs_anonymous_4303_) + @Js + def PyJs_anonymous_4304_(path, ext, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ext':ext, u'arguments':arguments}, var) + var.registers([u'path', u'ext', u'f']) + var.put(u'f', var.get(u'splitPath')(var.get(u'path')).get(u'2')) + if (var.get(u'ext') and PyJsStrictEq(var.get(u'f').callprop(u'substr', ((-Js(1.0))*var.get(u'ext').get(u'length'))),var.get(u'ext'))): + var.put(u'f', var.get(u'f').callprop(u'substr', Js(0.0), (var.get(u'f').get(u'length')-var.get(u'ext').get(u'length')))) + return var.get(u'f') + PyJs_anonymous_4304_._set_name(u'anonymous') + var.get(u'exports').put(u'basename', PyJs_anonymous_4304_) + @Js + def PyJs_anonymous_4305_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u'splitPath')(var.get(u'path')).get(u'3') + PyJs_anonymous_4305_._set_name(u'anonymous') + var.get(u'exports').put(u'extname', PyJs_anonymous_4305_) + pass + @Js + def PyJs_anonymous_4306_(str, start, len, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'len':len, u'str':str, u'arguments':arguments}, var) + var.registers([u'start', u'len', u'str']) + return var.get(u'str').callprop(u'substr', var.get(u'start'), var.get(u'len')) + PyJs_anonymous_4306_._set_name(u'anonymous') + @Js + def PyJs_anonymous_4307_(str, start, len, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'len':len, u'str':str, u'arguments':arguments}, var) + var.registers([u'start', u'len', u'str']) + if (var.get(u'start')<Js(0.0)): + var.put(u'start', (var.get(u'str').get(u'length')+var.get(u'start'))) + return var.get(u'str').callprop(u'substr', var.get(u'start'), var.get(u'len')) + PyJs_anonymous_4307_._set_name(u'anonymous') + var.put(u'substr', (PyJs_anonymous_4306_ if PyJsStrictEq(Js(u'ab').callprop(u'substr', (-Js(1.0))),Js(u'b')) else PyJs_anonymous_4307_)) + PyJs_anonymous_4293_._set_name(u'anonymous') + PyJs_anonymous_4293_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_4292_._set_name(u'anonymous') +PyJs_Object_4308_ = Js({u'_process':Js(531.0)}) +@Js +def PyJs_anonymous_4309_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'cleanUpNextTick', u'currentQueue', u'process', u'require', u'module', u'drainQueue', u'queue', u'Item', u'draining', u'noop', u'queueIndex']) + @Js + def PyJsHoisted_Item_(fun, array, this, arguments, var=var): + var = Scope({u'fun':fun, u'this':this, u'array':array, u'arguments':arguments}, var) + var.registers([u'fun', u'array']) + var.get(u"this").put(u'fun', var.get(u'fun')) + var.get(u"this").put(u'array', var.get(u'array')) + PyJsHoisted_Item_.func_name = u'Item' + var.put(u'Item', PyJsHoisted_Item_) + @Js + def PyJsHoisted_cleanUpNextTick_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.put(u'draining', Js(False)) + if var.get(u'currentQueue').get(u'length'): + var.put(u'queue', var.get(u'currentQueue').callprop(u'concat', var.get(u'queue'))) + else: + var.put(u'queueIndex', (-Js(1.0))) + if var.get(u'queue').get(u'length'): + var.get(u'drainQueue')() + PyJsHoisted_cleanUpNextTick_.func_name = u'cleanUpNextTick' + var.put(u'cleanUpNextTick', PyJsHoisted_cleanUpNextTick_) + @Js + def PyJsHoisted_noop_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJsHoisted_noop_.func_name = u'noop' + var.put(u'noop', PyJsHoisted_noop_) + @Js + def PyJsHoisted_drainQueue_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'len', u'timeout']) + if var.get(u'draining'): + return var.get('undefined') + var.put(u'timeout', var.get(u'setTimeout')(var.get(u'cleanUpNextTick'))) + var.put(u'draining', var.get(u'true')) + var.put(u'len', var.get(u'queue').get(u'length')) + while var.get(u'len'): + var.put(u'currentQueue', var.get(u'queue')) + var.put(u'queue', Js([])) + while (var.put(u'queueIndex',Js(var.get(u'queueIndex').to_number())+Js(1))<var.get(u'len')): + if var.get(u'currentQueue'): + var.get(u'currentQueue').get(var.get(u'queueIndex')).callprop(u'run') + var.put(u'queueIndex', (-Js(1.0))) + var.put(u'len', var.get(u'queue').get(u'length')) + var.put(u'currentQueue', var.get(u"null")) + var.put(u'draining', Js(False)) + var.get(u'clearTimeout')(var.get(u'timeout')) + PyJsHoisted_drainQueue_.func_name = u'drainQueue' + var.put(u'drainQueue', PyJsHoisted_drainQueue_) + PyJs_Object_4310_ = Js({}) + var.put(u'process', var.get(u'module').put(u'exports', PyJs_Object_4310_)) + var.put(u'queue', Js([])) + var.put(u'draining', Js(False)) + pass + var.put(u'queueIndex', (-Js(1.0))) + pass + pass + @Js + def PyJs_anonymous_4311_(fun, this, arguments, var=var): + var = Scope({u'fun':fun, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'fun', u'args']) + var.put(u'args', var.get(u'Array').create((var.get(u'arguments').get(u'length')-Js(1.0)))) + if (var.get(u'arguments').get(u'length')>Js(1.0)): + #for JS loop + var.put(u'i', Js(1.0)) + while (var.get(u'i')<var.get(u'arguments').get(u'length')): + try: + var.get(u'args').put((var.get(u'i')-Js(1.0)), var.get(u'arguments').get(var.get(u'i'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.get(u'queue').callprop(u'push', var.get(u'Item').create(var.get(u'fun'), var.get(u'args'))) + if (PyJsStrictEq(var.get(u'queue').get(u'length'),Js(1.0)) and var.get(u'draining').neg()): + var.get(u'setTimeout')(var.get(u'drainQueue'), Js(0.0)) + PyJs_anonymous_4311_._set_name(u'anonymous') + var.get(u'process').put(u'nextTick', PyJs_anonymous_4311_) + pass + @Js + def PyJs_anonymous_4312_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").get(u'fun').callprop(u'apply', var.get(u"null"), var.get(u"this").get(u'array')) + PyJs_anonymous_4312_._set_name(u'anonymous') + var.get(u'Item').get(u'prototype').put(u'run', PyJs_anonymous_4312_) + var.get(u'process').put(u'title', Js(u'browser')) + var.get(u'process').put(u'browser', var.get(u'true')) + PyJs_Object_4313_ = Js({}) + var.get(u'process').put(u'env', PyJs_Object_4313_) + var.get(u'process').put(u'argv', Js([])) + var.get(u'process').put(u'version', Js(u'')) + PyJs_Object_4314_ = Js({}) + var.get(u'process').put(u'versions', PyJs_Object_4314_) + pass + var.get(u'process').put(u'on', var.get(u'noop')) + var.get(u'process').put(u'addListener', var.get(u'noop')) + var.get(u'process').put(u'once', var.get(u'noop')) + var.get(u'process').put(u'off', var.get(u'noop')) + var.get(u'process').put(u'removeListener', var.get(u'noop')) + var.get(u'process').put(u'removeAllListeners', var.get(u'noop')) + var.get(u'process').put(u'emit', var.get(u'noop')) + @Js + def PyJs_anonymous_4315_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'process.binding is not supported'))) + raise PyJsTempException + PyJs_anonymous_4315_._set_name(u'anonymous') + var.get(u'process').put(u'binding', PyJs_anonymous_4315_) + @Js + def PyJs_anonymous_4316_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(u'/') + PyJs_anonymous_4316_._set_name(u'anonymous') + var.get(u'process').put(u'cwd', PyJs_anonymous_4316_) + @Js + def PyJs_anonymous_4317_(dir, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'dir':dir}, var) + var.registers([u'dir']) + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'process.chdir is not supported'))) + raise PyJsTempException + PyJs_anonymous_4317_._set_name(u'anonymous') + var.get(u'process').put(u'chdir', PyJs_anonymous_4317_) + @Js + def PyJs_anonymous_4318_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(0.0) + PyJs_anonymous_4318_._set_name(u'anonymous') + var.get(u'process').put(u'umask', PyJs_anonymous_4318_) +PyJs_anonymous_4309_._set_name(u'anonymous') +PyJs_Object_4319_ = Js({}) +@Js +def PyJs_anonymous_4320_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'require', u'exports', u'WriteStream', u'ReadStream']) + @Js + def PyJsHoisted_WriteStream_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'tty.ReadStream is not implemented'))) + raise PyJsTempException + PyJsHoisted_WriteStream_.func_name = u'WriteStream' + var.put(u'WriteStream', PyJsHoisted_WriteStream_) + @Js + def PyJsHoisted_ReadStream_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'tty.ReadStream is not implemented'))) + raise PyJsTempException + PyJsHoisted_ReadStream_.func_name = u'ReadStream' + var.put(u'ReadStream', PyJsHoisted_ReadStream_) + @Js + def PyJs_anonymous_4321_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(False) + PyJs_anonymous_4321_._set_name(u'anonymous') + var.get(u'exports').put(u'isatty', PyJs_anonymous_4321_) + pass + var.get(u'exports').put(u'ReadStream', var.get(u'ReadStream')) + pass + var.get(u'exports').put(u'WriteStream', var.get(u'WriteStream')) +PyJs_anonymous_4320_._set_name(u'anonymous') +PyJs_Object_4322_ = Js({}) +@Js +def PyJs_anonymous_4323_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_isBuffer_4324_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'isBuffer':PyJs_isBuffer_4324_, u'arg':arg}, var) + var.registers([u'arg']) + return ((((var.get(u'arg') and PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'object'))) and PyJsStrictEq(var.get(u'arg').get(u'copy').typeof(),Js(u'function'))) and PyJsStrictEq(var.get(u'arg').get(u'fill').typeof(),Js(u'function'))) and PyJsStrictEq(var.get(u'arg').get(u'readUInt8').typeof(),Js(u'function'))) + PyJs_isBuffer_4324_._set_name(u'isBuffer') + var.get(u'module').put(u'exports', PyJs_isBuffer_4324_) +PyJs_anonymous_4323_._set_name(u'anonymous') +PyJs_Object_4325_ = Js({}) +@Js +def PyJs_anonymous_4326_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + def PyJs_LONG_4350_(var=var): + PyJs_Object_4327_ = Js({}) + @Js + def PyJs_anonymous_4328_(process, PyJsArg_676c6f62616c_, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'global':PyJsArg_676c6f62616c_, u'arguments':arguments}, var) + var.registers([u'isArray', u'months', u'process', u'global', u'arrayToHash', u'isFunction', u'isBoolean', u'objectToString', u'debugEnviron', u'isError', u'formatProperty', u'formatError', u'formatArray', u'pad', u'stylizeWithColor', u'isRegExp', u'stylizeNoColor', u'debugs', u'timestamp', u'inspect', u'formatPrimitive', u'hasOwnProperty', u'isNumber', u'isObject', u'reduceToSingleString', u'isNullOrUndefined', u'isDate', u'isString', u'isPrimitive', u'formatValue', u'formatRegExp', u'isNull', u'isUndefined', u'isSymbol']) + @Js + def PyJsHoisted_isArray_(ar, this, arguments, var=var): + var = Scope({u'this':this, u'ar':ar, u'arguments':arguments}, var) + var.registers([u'ar']) + return var.get(u'Array').callprop(u'isArray', var.get(u'ar')) + PyJsHoisted_isArray_.func_name = u'isArray' + var.put(u'isArray', PyJsHoisted_isArray_) + @Js + def PyJsHoisted_arrayToHash_(array, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'arguments':arguments}, var) + var.registers([u'array', u'hash']) + PyJs_Object_4340_ = Js({}) + var.put(u'hash', PyJs_Object_4340_) + @Js + def PyJs_anonymous_4341_(val, idx, this, arguments, var=var): + var = Scope({u'this':this, u'idx':idx, u'val':val, u'arguments':arguments}, var) + var.registers([u'idx', u'val']) + var.get(u'hash').put(var.get(u'val'), var.get(u'true')) + PyJs_anonymous_4341_._set_name(u'anonymous') + var.get(u'array').callprop(u'forEach', PyJs_anonymous_4341_) + return var.get(u'hash') + PyJsHoisted_arrayToHash_.func_name = u'arrayToHash' + var.put(u'arrayToHash', PyJsHoisted_arrayToHash_) + @Js + def PyJsHoisted_isFunction_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'function')) + PyJsHoisted_isFunction_.func_name = u'isFunction' + var.put(u'isFunction', PyJsHoisted_isFunction_) + @Js + def PyJsHoisted_isBoolean_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'boolean')) + PyJsHoisted_isBoolean_.func_name = u'isBoolean' + var.put(u'isBoolean', PyJsHoisted_isBoolean_) + @Js + def PyJsHoisted_objectToString_(o, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'o':o}, var) + var.registers([u'o']) + return var.get(u'Object').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'o')) + PyJsHoisted_objectToString_.func_name = u'objectToString' + var.put(u'objectToString', PyJsHoisted_objectToString_) + @Js + def PyJsHoisted_isObject_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return (PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'object')) and PyJsStrictNeq(var.get(u'arg'),var.get(u"null"))) + PyJsHoisted_isObject_.func_name = u'isObject' + var.put(u'isObject', PyJsHoisted_isObject_) + @Js + def PyJsHoisted_formatProperty_(ctx, value, recurseTimes, visibleKeys, key, array, this, arguments, var=var): + var = Scope({u'recurseTimes':recurseTimes, u'this':this, u'ctx':ctx, u'value':value, u'visibleKeys':visibleKeys, u'arguments':arguments, u'key':key, u'array':array}, var) + var.registers([u'key', u'name', u'recurseTimes', u'ctx', u'value', u'visibleKeys', u'str', u'array', u'desc']) + pass + PyJs_Object_4344_ = Js({u'value':var.get(u'value').get(var.get(u'key'))}) + var.put(u'desc', (var.get(u'Object').callprop(u'getOwnPropertyDescriptor', var.get(u'value'), var.get(u'key')) or PyJs_Object_4344_)) + if var.get(u'desc').get(u'get'): + if var.get(u'desc').get(u'set'): + var.put(u'str', var.get(u'ctx').callprop(u'stylize', Js(u'[Getter/Setter]'), Js(u'special'))) + else: + var.put(u'str', var.get(u'ctx').callprop(u'stylize', Js(u'[Getter]'), Js(u'special'))) + else: + if var.get(u'desc').get(u'set'): + var.put(u'str', var.get(u'ctx').callprop(u'stylize', Js(u'[Setter]'), Js(u'special'))) + if var.get(u'hasOwnProperty')(var.get(u'visibleKeys'), var.get(u'key')).neg(): + var.put(u'name', ((Js(u'[')+var.get(u'key'))+Js(u']'))) + if var.get(u'str').neg(): + if (var.get(u'ctx').get(u'seen').callprop(u'indexOf', var.get(u'desc').get(u'value'))<Js(0.0)): + if var.get(u'isNull')(var.get(u'recurseTimes')): + var.put(u'str', var.get(u'formatValue')(var.get(u'ctx'), var.get(u'desc').get(u'value'), var.get(u"null"))) + else: + var.put(u'str', var.get(u'formatValue')(var.get(u'ctx'), var.get(u'desc').get(u'value'), (var.get(u'recurseTimes')-Js(1.0)))) + if (var.get(u'str').callprop(u'indexOf', Js(u'\n'))>(-Js(1.0))): + if var.get(u'array'): + @Js + def PyJs_anonymous_4345_(line, this, arguments, var=var): + var = Scope({u'this':this, u'line':line, u'arguments':arguments}, var) + var.registers([u'line']) + return (Js(u' ')+var.get(u'line')) + PyJs_anonymous_4345_._set_name(u'anonymous') + var.put(u'str', var.get(u'str').callprop(u'split', Js(u'\n')).callprop(u'map', PyJs_anonymous_4345_).callprop(u'join', Js(u'\n')).callprop(u'substr', Js(2.0))) + else: + @Js + def PyJs_anonymous_4346_(line, this, arguments, var=var): + var = Scope({u'this':this, u'line':line, u'arguments':arguments}, var) + var.registers([u'line']) + return (Js(u' ')+var.get(u'line')) + PyJs_anonymous_4346_._set_name(u'anonymous') + var.put(u'str', (Js(u'\n')+var.get(u'str').callprop(u'split', Js(u'\n')).callprop(u'map', PyJs_anonymous_4346_).callprop(u'join', Js(u'\n')))) + else: + var.put(u'str', var.get(u'ctx').callprop(u'stylize', Js(u'[Circular]'), Js(u'special'))) + if var.get(u'isUndefined')(var.get(u'name')): + if (var.get(u'array') and var.get(u'key').callprop(u'match', JsRegExp(u'/^\\d+$/'))): + return var.get(u'str') + var.put(u'name', var.get(u'JSON').callprop(u'stringify', (Js(u'')+var.get(u'key')))) + if var.get(u'name').callprop(u'match', JsRegExp(u'/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/')): + var.put(u'name', var.get(u'name').callprop(u'substr', Js(1.0), (var.get(u'name').get(u'length')-Js(2.0)))) + var.put(u'name', var.get(u'ctx').callprop(u'stylize', var.get(u'name'), Js(u'name'))) + else: + var.put(u'name', var.get(u'name').callprop(u'replace', JsRegExp(u"/'/g"), Js(u"\\'")).callprop(u'replace', JsRegExp(u'/\\\\"/g'), Js(u'"')).callprop(u'replace', JsRegExp(u'/(^"|"$)/g'), Js(u"'"))) + var.put(u'name', var.get(u'ctx').callprop(u'stylize', var.get(u'name'), Js(u'string'))) + return ((var.get(u'name')+Js(u': '))+var.get(u'str')) + PyJsHoisted_formatProperty_.func_name = u'formatProperty' + var.put(u'formatProperty', PyJsHoisted_formatProperty_) + @Js + def PyJsHoisted_formatError_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((Js(u'[')+var.get(u'Error').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'value')))+Js(u']')) + PyJsHoisted_formatError_.func_name = u'formatError' + var.put(u'formatError', PyJsHoisted_formatError_) + @Js + def PyJsHoisted_formatArray_(ctx, value, recurseTimes, visibleKeys, keys, this, arguments, var=var): + var = Scope({u'this':this, u'visibleKeys':visibleKeys, u'arguments':arguments, u'recurseTimes':recurseTimes, u'keys':keys, u'ctx':ctx, u'value':value}, var) + var.registers([u'keys', u'recurseTimes', u'i', u'ctx', u'l', u'value', u'visibleKeys', u'output']) + var.put(u'output', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'l', var.get(u'value').get(u'length')) + while (var.get(u'i')<var.get(u'l')): + try: + if var.get(u'hasOwnProperty')(var.get(u'value'), var.get(u'String')(var.get(u'i'))): + var.get(u'output').callprop(u'push', var.get(u'formatProperty')(var.get(u'ctx'), var.get(u'value'), var.get(u'recurseTimes'), var.get(u'visibleKeys'), var.get(u'String')(var.get(u'i')), var.get(u'true'))) + else: + var.get(u'output').callprop(u'push', Js(u'')) + finally: + var.put(u'i',Js(var.get(u'i').to_number())+Js(1)) + @Js + def PyJs_anonymous_4343_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + if var.get(u'key').callprop(u'match', JsRegExp(u'/^\\d+$/')).neg(): + var.get(u'output').callprop(u'push', var.get(u'formatProperty')(var.get(u'ctx'), var.get(u'value'), var.get(u'recurseTimes'), var.get(u'visibleKeys'), var.get(u'key'), var.get(u'true'))) + PyJs_anonymous_4343_._set_name(u'anonymous') + var.get(u'keys').callprop(u'forEach', PyJs_anonymous_4343_) + return var.get(u'output') + PyJsHoisted_formatArray_.func_name = u'formatArray' + var.put(u'formatArray', PyJsHoisted_formatArray_) + @Js + def PyJsHoisted_pad_(n, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'n':n}, var) + var.registers([u'n']) + return ((Js(u'0')+var.get(u'n').callprop(u'toString', Js(10.0))) if (var.get(u'n')<Js(10.0)) else var.get(u'n').callprop(u'toString', Js(10.0))) + PyJsHoisted_pad_.func_name = u'pad' + var.put(u'pad', PyJsHoisted_pad_) + @Js + def PyJsHoisted_stylizeWithColor_(str, styleType, this, arguments, var=var): + var = Scope({u'this':this, u'styleType':styleType, u'str':str, u'arguments':arguments}, var) + var.registers([u'style', u'styleType', u'str']) + var.put(u'style', var.get(u'inspect').get(u'styles').get(var.get(u'styleType'))) + if var.get(u'style'): + return ((((((Js(u'\x1b[')+var.get(u'inspect').get(u'colors').get(var.get(u'style')).get(u'0'))+Js(u'm'))+var.get(u'str'))+Js(u'\x1b['))+var.get(u'inspect').get(u'colors').get(var.get(u'style')).get(u'1'))+Js(u'm')) + else: + return var.get(u'str') + PyJsHoisted_stylizeWithColor_.func_name = u'stylizeWithColor' + var.put(u'stylizeWithColor', PyJsHoisted_stylizeWithColor_) + @Js + def PyJsHoisted_isRegExp_(re, this, arguments, var=var): + var = Scope({u'this':this, u're':re, u'arguments':arguments}, var) + var.registers([u're']) + return (var.get(u'isObject')(var.get(u're')) and PyJsStrictEq(var.get(u'objectToString')(var.get(u're')),Js(u'[object RegExp]'))) + PyJsHoisted_isRegExp_.func_name = u'isRegExp' + var.put(u'isRegExp', PyJsHoisted_isRegExp_) + @Js + def PyJsHoisted_stylizeNoColor_(str, styleType, this, arguments, var=var): + var = Scope({u'this':this, u'styleType':styleType, u'str':str, u'arguments':arguments}, var) + var.registers([u'styleType', u'str']) + return var.get(u'str') + PyJsHoisted_stylizeNoColor_.func_name = u'stylizeNoColor' + var.put(u'stylizeNoColor', PyJsHoisted_stylizeNoColor_) + @Js + def PyJsHoisted_timestamp_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'd', u'time']) + var.put(u'd', var.get(u'Date').create()) + var.put(u'time', Js([var.get(u'pad')(var.get(u'd').callprop(u'getHours')), var.get(u'pad')(var.get(u'd').callprop(u'getMinutes')), var.get(u'pad')(var.get(u'd').callprop(u'getSeconds'))]).callprop(u'join', Js(u':'))) + return Js([var.get(u'd').callprop(u'getDate'), var.get(u'months').get(var.get(u'd').callprop(u'getMonth')), var.get(u'time')]).callprop(u'join', Js(u' ')) + PyJsHoisted_timestamp_.func_name = u'timestamp' + var.put(u'timestamp', PyJsHoisted_timestamp_) + @Js + def PyJsHoisted_inspect_(obj, opts, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'obj', u'ctx', u'opts']) + PyJs_Object_4337_ = Js({u'seen':Js([]),u'stylize':var.get(u'stylizeNoColor')}) + var.put(u'ctx', PyJs_Object_4337_) + if (var.get(u'arguments').get(u'length')>=Js(3.0)): + var.get(u'ctx').put(u'depth', var.get(u'arguments').get(u'2')) + if (var.get(u'arguments').get(u'length')>=Js(4.0)): + var.get(u'ctx').put(u'colors', var.get(u'arguments').get(u'3')) + if var.get(u'isBoolean')(var.get(u'opts')): + var.get(u'ctx').put(u'showHidden', var.get(u'opts')) + else: + if var.get(u'opts'): + var.get(u'exports').callprop(u'_extend', var.get(u'ctx'), var.get(u'opts')) + if var.get(u'isUndefined')(var.get(u'ctx').get(u'showHidden')): + var.get(u'ctx').put(u'showHidden', Js(False)) + if var.get(u'isUndefined')(var.get(u'ctx').get(u'depth')): + var.get(u'ctx').put(u'depth', Js(2.0)) + if var.get(u'isUndefined')(var.get(u'ctx').get(u'colors')): + var.get(u'ctx').put(u'colors', Js(False)) + if var.get(u'isUndefined')(var.get(u'ctx').get(u'customInspect')): + var.get(u'ctx').put(u'customInspect', var.get(u'true')) + if var.get(u'ctx').get(u'colors'): + var.get(u'ctx').put(u'stylize', var.get(u'stylizeWithColor')) + return var.get(u'formatValue')(var.get(u'ctx'), var.get(u'obj'), var.get(u'ctx').get(u'depth')) + PyJsHoisted_inspect_.func_name = u'inspect' + var.put(u'inspect', PyJsHoisted_inspect_) + @Js + def PyJsHoisted_formatPrimitive_(ctx, value, this, arguments, var=var): + var = Scope({u'this':this, u'ctx':ctx, u'arguments':arguments, u'value':value}, var) + var.registers([u'simple', u'ctx', u'value']) + if var.get(u'isUndefined')(var.get(u'value')): + return var.get(u'ctx').callprop(u'stylize', Js(u'undefined'), Js(u'undefined')) + if var.get(u'isString')(var.get(u'value')): + var.put(u'simple', ((Js(u"'")+var.get(u'JSON').callprop(u'stringify', var.get(u'value')).callprop(u'replace', JsRegExp(u'/^"|"$/g'), Js(u'')).callprop(u'replace', JsRegExp(u"/'/g"), Js(u"\\'")).callprop(u'replace', JsRegExp(u'/\\\\"/g'), Js(u'"')))+Js(u"'"))) + return var.get(u'ctx').callprop(u'stylize', var.get(u'simple'), Js(u'string')) + if var.get(u'isNumber')(var.get(u'value')): + return var.get(u'ctx').callprop(u'stylize', (Js(u'')+var.get(u'value')), Js(u'number')) + if var.get(u'isBoolean')(var.get(u'value')): + return var.get(u'ctx').callprop(u'stylize', (Js(u'')+var.get(u'value')), Js(u'boolean')) + if var.get(u'isNull')(var.get(u'value')): + return var.get(u'ctx').callprop(u'stylize', Js(u'null'), Js(u'null')) + PyJsHoisted_formatPrimitive_.func_name = u'formatPrimitive' + var.put(u'formatPrimitive', PyJsHoisted_formatPrimitive_) + @Js + def PyJsHoisted_hasOwnProperty_(obj, prop, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'obj', u'prop']) + return var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'prop')) + PyJsHoisted_hasOwnProperty_.func_name = u'hasOwnProperty' + var.put(u'hasOwnProperty', PyJsHoisted_hasOwnProperty_) + @Js + def PyJsHoisted_isNumber_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'number')) + PyJsHoisted_isNumber_.func_name = u'isNumber' + var.put(u'isNumber', PyJsHoisted_isNumber_) + @Js + def PyJsHoisted_isError_(e, this, arguments, var=var): + var = Scope({u'this':this, u'e':e, u'arguments':arguments}, var) + var.registers([u'e']) + return (var.get(u'isObject')(var.get(u'e')) and (PyJsStrictEq(var.get(u'objectToString')(var.get(u'e')),Js(u'[object Error]')) or var.get(u'e').instanceof(var.get(u'Error')))) + PyJsHoisted_isError_.func_name = u'isError' + var.put(u'isError', PyJsHoisted_isError_) + @Js + def PyJsHoisted_reduceToSingleString_(output, base, braces, this, arguments, var=var): + var = Scope({u'this':this, u'output':output, u'base':base, u'arguments':arguments, u'braces':braces}, var) + var.registers([u'output', u'length', u'base', u'numLinesEst', u'braces']) + var.put(u'numLinesEst', Js(0.0)) + @Js + def PyJs_anonymous_4347_(prev, cur, this, arguments, var=var): + var = Scope({u'this':this, u'prev':prev, u'cur':cur, u'arguments':arguments}, var) + var.registers([u'prev', u'cur']) + (var.put(u'numLinesEst',Js(var.get(u'numLinesEst').to_number())+Js(1))-Js(1)) + if (var.get(u'cur').callprop(u'indexOf', Js(u'\n'))>=Js(0.0)): + (var.put(u'numLinesEst',Js(var.get(u'numLinesEst').to_number())+Js(1))-Js(1)) + return ((var.get(u'prev')+var.get(u'cur').callprop(u'replace', JsRegExp(u'/\\u001b\\[\\d\\d?m/g'), Js(u'')).get(u'length'))+Js(1.0)) + PyJs_anonymous_4347_._set_name(u'anonymous') + var.put(u'length', var.get(u'output').callprop(u'reduce', PyJs_anonymous_4347_, Js(0.0))) + if (var.get(u'length')>Js(60.0)): + return (((((var.get(u'braces').get(u'0')+(Js(u'') if PyJsStrictEq(var.get(u'base'),Js(u'')) else (var.get(u'base')+Js(u'\n '))))+Js(u' '))+var.get(u'output').callprop(u'join', Js(u',\n ')))+Js(u' '))+var.get(u'braces').get(u'1')) + return (((((var.get(u'braces').get(u'0')+var.get(u'base'))+Js(u' '))+var.get(u'output').callprop(u'join', Js(u', ')))+Js(u' '))+var.get(u'braces').get(u'1')) + PyJsHoisted_reduceToSingleString_.func_name = u'reduceToSingleString' + var.put(u'reduceToSingleString', PyJsHoisted_reduceToSingleString_) + @Js + def PyJsHoisted_isNullOrUndefined_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return (var.get(u'arg')==var.get(u"null")) + PyJsHoisted_isNullOrUndefined_.func_name = u'isNullOrUndefined' + var.put(u'isNullOrUndefined', PyJsHoisted_isNullOrUndefined_) + @Js + def PyJsHoisted_isDate_(d, this, arguments, var=var): + var = Scope({u'this':this, u'd':d, u'arguments':arguments}, var) + var.registers([u'd']) + return (var.get(u'isObject')(var.get(u'd')) and PyJsStrictEq(var.get(u'objectToString')(var.get(u'd')),Js(u'[object Date]'))) + PyJsHoisted_isDate_.func_name = u'isDate' + var.put(u'isDate', PyJsHoisted_isDate_) + @Js + def PyJsHoisted_isString_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'string')) + PyJsHoisted_isString_.func_name = u'isString' + var.put(u'isString', PyJsHoisted_isString_) + @Js + def PyJsHoisted_isPrimitive_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return (((((PyJsStrictEq(var.get(u'arg'),var.get(u"null")) or PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'boolean'))) or PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'number'))) or PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'string'))) or PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'symbol'))) or PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'undefined'))) + PyJsHoisted_isPrimitive_.func_name = u'isPrimitive' + var.put(u'isPrimitive', PyJsHoisted_isPrimitive_) + @Js + def PyJsHoisted_formatValue_(ctx, value, recurseTimes, this, arguments, var=var): + var = Scope({u'this':this, u'ctx':ctx, u'arguments':arguments, u'value':value, u'recurseTimes':recurseTimes}, var) + var.registers([u'primitive', u'name', u'recurseTimes', u'keys', u'ctx', u'ret', u'n', u'visibleKeys', u'base', u'value', u'output', u'array', u'braces']) + if ((((var.get(u'ctx').get(u'customInspect') and var.get(u'value')) and var.get(u'isFunction')(var.get(u'value').get(u'inspect'))) and PyJsStrictNeq(var.get(u'value').get(u'inspect'),var.get(u'exports').get(u'inspect'))) and (var.get(u'value').get(u'constructor') and PyJsStrictEq(var.get(u'value').get(u'constructor').get(u'prototype'),var.get(u'value'))).neg()): + var.put(u'ret', var.get(u'value').callprop(u'inspect', var.get(u'recurseTimes'), var.get(u'ctx'))) + if var.get(u'isString')(var.get(u'ret')).neg(): + var.put(u'ret', var.get(u'formatValue')(var.get(u'ctx'), var.get(u'ret'), var.get(u'recurseTimes'))) + return var.get(u'ret') + var.put(u'primitive', var.get(u'formatPrimitive')(var.get(u'ctx'), var.get(u'value'))) + if var.get(u'primitive'): + return var.get(u'primitive') + var.put(u'keys', var.get(u'Object').callprop(u'keys', var.get(u'value'))) + var.put(u'visibleKeys', var.get(u'arrayToHash')(var.get(u'keys'))) + if var.get(u'ctx').get(u'showHidden'): + var.put(u'keys', var.get(u'Object').callprop(u'getOwnPropertyNames', var.get(u'value'))) + if (var.get(u'isError')(var.get(u'value')) and ((var.get(u'keys').callprop(u'indexOf', Js(u'message'))>=Js(0.0)) or (var.get(u'keys').callprop(u'indexOf', Js(u'description'))>=Js(0.0)))): + return var.get(u'formatError')(var.get(u'value')) + if PyJsStrictEq(var.get(u'keys').get(u'length'),Js(0.0)): + if var.get(u'isFunction')(var.get(u'value')): + var.put(u'name', ((Js(u': ')+var.get(u'value').get(u'name')) if var.get(u'value').get(u'name') else Js(u''))) + return var.get(u'ctx').callprop(u'stylize', ((Js(u'[Function')+var.get(u'name'))+Js(u']')), Js(u'special')) + if var.get(u'isRegExp')(var.get(u'value')): + return var.get(u'ctx').callprop(u'stylize', var.get(u'RegExp').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'value')), Js(u'regexp')) + if var.get(u'isDate')(var.get(u'value')): + return var.get(u'ctx').callprop(u'stylize', var.get(u'Date').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'value')), Js(u'date')) + if var.get(u'isError')(var.get(u'value')): + return var.get(u'formatError')(var.get(u'value')) + var.put(u'base', Js(u'')) + var.put(u'array', Js(False)) + var.put(u'braces', Js([Js(u'{'), Js(u'}')])) + if var.get(u'isArray')(var.get(u'value')): + var.put(u'array', var.get(u'true')) + var.put(u'braces', Js([Js(u'['), Js(u']')])) + if var.get(u'isFunction')(var.get(u'value')): + var.put(u'n', ((Js(u': ')+var.get(u'value').get(u'name')) if var.get(u'value').get(u'name') else Js(u''))) + var.put(u'base', ((Js(u' [Function')+var.get(u'n'))+Js(u']'))) + if var.get(u'isRegExp')(var.get(u'value')): + var.put(u'base', (Js(u' ')+var.get(u'RegExp').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'value')))) + if var.get(u'isDate')(var.get(u'value')): + var.put(u'base', (Js(u' ')+var.get(u'Date').get(u'prototype').get(u'toUTCString').callprop(u'call', var.get(u'value')))) + if var.get(u'isError')(var.get(u'value')): + var.put(u'base', (Js(u' ')+var.get(u'formatError')(var.get(u'value')))) + if (PyJsStrictEq(var.get(u'keys').get(u'length'),Js(0.0)) and (var.get(u'array').neg() or (var.get(u'value').get(u'length')==Js(0.0)))): + return ((var.get(u'braces').get(u'0')+var.get(u'base'))+var.get(u'braces').get(u'1')) + if (var.get(u'recurseTimes')<Js(0.0)): + if var.get(u'isRegExp')(var.get(u'value')): + return var.get(u'ctx').callprop(u'stylize', var.get(u'RegExp').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'value')), Js(u'regexp')) + else: + return var.get(u'ctx').callprop(u'stylize', Js(u'[Object]'), Js(u'special')) + var.get(u'ctx').get(u'seen').callprop(u'push', var.get(u'value')) + pass + if var.get(u'array'): + var.put(u'output', var.get(u'formatArray')(var.get(u'ctx'), var.get(u'value'), var.get(u'recurseTimes'), var.get(u'visibleKeys'), var.get(u'keys'))) + else: + @Js + def PyJs_anonymous_4342_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u'formatProperty')(var.get(u'ctx'), var.get(u'value'), var.get(u'recurseTimes'), var.get(u'visibleKeys'), var.get(u'key'), var.get(u'array')) + PyJs_anonymous_4342_._set_name(u'anonymous') + var.put(u'output', var.get(u'keys').callprop(u'map', PyJs_anonymous_4342_)) + var.get(u'ctx').get(u'seen').callprop(u'pop') + return var.get(u'reduceToSingleString')(var.get(u'output'), var.get(u'base'), var.get(u'braces')) + PyJsHoisted_formatValue_.func_name = u'formatValue' + var.put(u'formatValue', PyJsHoisted_formatValue_) + @Js + def PyJsHoisted_isNull_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return PyJsStrictEq(var.get(u'arg'),var.get(u"null")) + PyJsHoisted_isNull_.func_name = u'isNull' + var.put(u'isNull', PyJsHoisted_isNull_) + @Js + def PyJsHoisted_isUndefined_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return PyJsStrictEq(var.get(u'arg'),PyJsComma(Js(0.0), Js(None))) + PyJsHoisted_isUndefined_.func_name = u'isUndefined' + var.put(u'isUndefined', PyJsHoisted_isUndefined_) + @Js + def PyJsHoisted_isSymbol_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'symbol')) + PyJsHoisted_isSymbol_.func_name = u'isSymbol' + var.put(u'isSymbol', PyJsHoisted_isSymbol_) + var.put(u'formatRegExp', JsRegExp(u'/%[sdj%]/g')) + @Js + def PyJs_anonymous_4329_(f, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'f':f}, var) + var.registers([u'f', u'i', u'args', u'len', u'objects', u'str', u'x']) + if var.get(u'isString')(var.get(u'f')).neg(): + var.put(u'objects', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<var.get(u'arguments').get(u'length')): + try: + var.get(u'objects').callprop(u'push', var.get(u'inspect')(var.get(u'arguments').get(var.get(u'i')))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'objects').callprop(u'join', Js(u' ')) + var.put(u'i', Js(1.0)) + var.put(u'args', var.get(u'arguments')) + var.put(u'len', var.get(u'args').get(u'length')) + @Js + def PyJs_anonymous_4330_(x, this, arguments, var=var): + var = Scope({u'this':this, u'x':x, u'arguments':arguments}, var) + var.registers([u'x']) + if PyJsStrictEq(var.get(u'x'),Js(u'%%')): + return Js(u'%') + if (var.get(u'i')>=var.get(u'len')): + return var.get(u'x') + while 1: + SWITCHED = False + CONDITION = (var.get(u'x')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'%s')): + SWITCHED = True + return var.get(u'String')(var.get(u'args').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'%d')): + SWITCHED = True + return var.get(u'Number')(var.get(u'args').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'%j')): + SWITCHED = True + try: + return var.get(u'JSON').callprop(u'stringify', var.get(u'args').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + except PyJsException as PyJsTempException: + PyJsHolder_5f_51919926 = var.own.get(u'_') + var.force_own_put(u'_', PyExceptionToJs(PyJsTempException)) + try: + return Js(u'[Circular]') + finally: + if PyJsHolder_5f_51919926 is not None: + var.own[u'_'] = PyJsHolder_5f_51919926 + else: + del var.own[u'_'] + del PyJsHolder_5f_51919926 + if True: + SWITCHED = True + return var.get(u'x') + SWITCHED = True + break + PyJs_anonymous_4330_._set_name(u'anonymous') + var.put(u'str', var.get(u'String')(var.get(u'f')).callprop(u'replace', var.get(u'formatRegExp'), PyJs_anonymous_4330_)) + #for JS loop + var.put(u'x', var.get(u'args').get(var.get(u'i'))) + while (var.get(u'i')<var.get(u'len')): + try: + if (var.get(u'isNull')(var.get(u'x')) or var.get(u'isObject')(var.get(u'x')).neg()): + var.put(u'str', (Js(u' ')+var.get(u'x')), u'+') + else: + var.put(u'str', (Js(u' ')+var.get(u'inspect')(var.get(u'x'))), u'+') + finally: + var.put(u'x', var.get(u'args').get(var.put(u'i',Js(var.get(u'i').to_number())+Js(1)))) + return var.get(u'str') + PyJs_anonymous_4329_._set_name(u'anonymous') + var.get(u'exports').put(u'format', PyJs_anonymous_4329_) + @Js + def PyJs_anonymous_4331_(fn, msg, this, arguments, var=var): + var = Scope({u'msg':msg, u'this':this, u'arguments':arguments, u'fn':fn}, var) + var.registers([u'msg', u'warned', u'fn', u'deprecated']) + @Js + def PyJsHoisted_deprecated_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u'warned').neg(): + if var.get(u'process').get(u'throwDeprecation'): + PyJsTempException = JsToPyException(var.get(u'Error').create(var.get(u'msg'))) + raise PyJsTempException + else: + if var.get(u'process').get(u'traceDeprecation'): + var.get(u'console').callprop(u'trace', var.get(u'msg')) + else: + var.get(u'console').callprop(u'error', var.get(u'msg')) + var.put(u'warned', var.get(u'true')) + return var.get(u'fn').callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + PyJsHoisted_deprecated_.func_name = u'deprecated' + var.put(u'deprecated', PyJsHoisted_deprecated_) + if var.get(u'isUndefined')(var.get(u'global').get(u'process')): + @Js + def PyJs_anonymous_4332_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'exports').callprop(u'deprecate', var.get(u'fn'), var.get(u'msg')).callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + PyJs_anonymous_4332_._set_name(u'anonymous') + return PyJs_anonymous_4332_ + if PyJsStrictEq(var.get(u'process').get(u'noDeprecation'),var.get(u'true')): + return var.get(u'fn') + var.put(u'warned', Js(False)) + pass + return var.get(u'deprecated') + PyJs_anonymous_4331_._set_name(u'anonymous') + var.get(u'exports').put(u'deprecate', PyJs_anonymous_4331_) + PyJs_Object_4333_ = Js({}) + var.put(u'debugs', PyJs_Object_4333_) + pass + @Js + def PyJs_anonymous_4334_(set, this, arguments, var=var): + var = Scope({u'this':this, u'set':set, u'arguments':arguments}, var) + var.registers([u'set', u'pid']) + if var.get(u'isUndefined')(var.get(u'debugEnviron')): + var.put(u'debugEnviron', (var.get(u'process').get(u'env').get(u'NODE_DEBUG') or Js(u''))) + var.put(u'set', var.get(u'set').callprop(u'toUpperCase')) + if var.get(u'debugs').get(var.get(u'set')).neg(): + if var.get(u'RegExp').create(((Js(u'\\b')+var.get(u'set'))+Js(u'\\b')), Js(u'i')).callprop(u'test', var.get(u'debugEnviron')): + var.put(u'pid', var.get(u'process').get(u'pid')) + @Js + def PyJs_anonymous_4335_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'msg']) + var.put(u'msg', var.get(u'exports').get(u'format').callprop(u'apply', var.get(u'exports'), var.get(u'arguments'))) + var.get(u'console').callprop(u'error', Js(u'%s %d: %s'), var.get(u'set'), var.get(u'pid'), var.get(u'msg')) + PyJs_anonymous_4335_._set_name(u'anonymous') + var.get(u'debugs').put(var.get(u'set'), PyJs_anonymous_4335_) + else: + @Js + def PyJs_anonymous_4336_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJs_anonymous_4336_._set_name(u'anonymous') + var.get(u'debugs').put(var.get(u'set'), PyJs_anonymous_4336_) + return var.get(u'debugs').get(var.get(u'set')) + PyJs_anonymous_4334_._set_name(u'anonymous') + var.get(u'exports').put(u'debuglog', PyJs_anonymous_4334_) + pass + var.get(u'exports').put(u'inspect', var.get(u'inspect')) + PyJs_Object_4338_ = Js({u'bold':Js([Js(1.0), Js(22.0)]),u'italic':Js([Js(3.0), Js(23.0)]),u'underline':Js([Js(4.0), Js(24.0)]),u'inverse':Js([Js(7.0), Js(27.0)]),u'white':Js([Js(37.0), Js(39.0)]),u'grey':Js([Js(90.0), Js(39.0)]),u'black':Js([Js(30.0), Js(39.0)]),u'blue':Js([Js(34.0), Js(39.0)]),u'cyan':Js([Js(36.0), Js(39.0)]),u'green':Js([Js(32.0), Js(39.0)]),u'magenta':Js([Js(35.0), Js(39.0)]),u'red':Js([Js(31.0), Js(39.0)]),u'yellow':Js([Js(33.0), Js(39.0)])}) + var.get(u'inspect').put(u'colors', PyJs_Object_4338_) + PyJs_Object_4339_ = Js({u'special':Js(u'cyan'),u'number':Js(u'yellow'),u'boolean':Js(u'yellow'),u'undefined':Js(u'grey'),u'null':Js(u'bold'),u'string':Js(u'green'),u'date':Js(u'magenta'),u'regexp':Js(u'red')}) + var.get(u'inspect').put(u'styles', PyJs_Object_4339_) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + var.get(u'exports').put(u'isArray', var.get(u'isArray')) + pass + var.get(u'exports').put(u'isBoolean', var.get(u'isBoolean')) + pass + var.get(u'exports').put(u'isNull', var.get(u'isNull')) + pass + var.get(u'exports').put(u'isNullOrUndefined', var.get(u'isNullOrUndefined')) + pass + var.get(u'exports').put(u'isNumber', var.get(u'isNumber')) + pass + var.get(u'exports').put(u'isString', var.get(u'isString')) + pass + var.get(u'exports').put(u'isSymbol', var.get(u'isSymbol')) + pass + var.get(u'exports').put(u'isUndefined', var.get(u'isUndefined')) + pass + var.get(u'exports').put(u'isRegExp', var.get(u'isRegExp')) + pass + var.get(u'exports').put(u'isObject', var.get(u'isObject')) + pass + var.get(u'exports').put(u'isDate', var.get(u'isDate')) + pass + var.get(u'exports').put(u'isError', var.get(u'isError')) + pass + var.get(u'exports').put(u'isFunction', var.get(u'isFunction')) + pass + var.get(u'exports').put(u'isPrimitive', var.get(u'isPrimitive')) + var.get(u'exports').put(u'isBuffer', var.get(u'require')(Js(u'./support/isBuffer'))) + pass + pass + var.put(u'months', Js([Js(u'Jan'), Js(u'Feb'), Js(u'Mar'), Js(u'Apr'), Js(u'May'), Js(u'Jun'), Js(u'Jul'), Js(u'Aug'), Js(u'Sep'), Js(u'Oct'), Js(u'Nov'), Js(u'Dec')])) + pass + @Js + def PyJs_anonymous_4348_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'console').callprop(u'log', Js(u'%s - %s'), var.get(u'timestamp')(), var.get(u'exports').get(u'format').callprop(u'apply', var.get(u'exports'), var.get(u'arguments'))) + PyJs_anonymous_4348_._set_name(u'anonymous') + var.get(u'exports').put(u'log', PyJs_anonymous_4348_) + var.get(u'exports').put(u'inherits', var.get(u'require')(Js(u'inherits'))) + @Js + def PyJs_anonymous_4349_(origin, add, this, arguments, var=var): + var = Scope({u'origin':origin, u'this':this, u'add':add, u'arguments':arguments}, var) + var.registers([u'keys', u'i', u'add', u'origin']) + if (var.get(u'add').neg() or var.get(u'isObject')(var.get(u'add')).neg()): + return var.get(u'origin') + var.put(u'keys', var.get(u'Object').callprop(u'keys', var.get(u'add'))) + var.put(u'i', var.get(u'keys').get(u'length')) + while (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)): + var.get(u'origin').put(var.get(u'keys').get(var.get(u'i')), var.get(u'add').get(var.get(u'keys').get(var.get(u'i')))) + return var.get(u'origin') + PyJs_anonymous_4349_._set_name(u'anonymous') + var.get(u'exports').put(u'_extend', PyJs_anonymous_4349_) + pass + PyJs_anonymous_4328_._set_name(u'anonymous') + return PyJs_anonymous_4328_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process')), (var.get(u'global') if PyJsStrictNeq(var.get(u'global',throw=False).typeof(),Js(u'undefined')) else (var.get(u'self') if PyJsStrictNeq(var.get(u'self',throw=False).typeof(),Js(u'undefined')) else (var.get(u'window') if PyJsStrictNeq(var.get(u'window',throw=False).typeof(),Js(u'undefined')) else PyJs_Object_4327_)))) + PyJs_LONG_4350_() +PyJs_anonymous_4326_._set_name(u'anonymous') +PyJs_Object_4351_ = Js({u'./support/isBuffer':Js(533.0),u'_process':Js(531.0),u'inherits':Js(529.0)}) +PyJs_Object_0_ = Js({u'1':Js([PyJs_anonymous_1_, PyJs_Object_2_]),u'2':Js([PyJs_anonymous_3_, PyJs_Object_5_]),u'3':Js([PyJs_anonymous_6_, PyJs_Object_16_]),u'4':Js([PyJs_anonymous_17_, PyJs_Object_26_]),u'5':Js([PyJs_anonymous_27_, PyJs_Object_28_]),u'6':Js([PyJs_anonymous_29_, PyJs_Object_46_]),u'7':Js([PyJs_anonymous_47_, PyJs_Object_51_]),u'8':Js([PyJs_anonymous_52_, PyJs_Object_55_]),u'9':Js([PyJs_anonymous_56_, PyJs_Object_61_]),u'10':Js([PyJs_anonymous_62_, PyJs_Object_68_]),u'11':Js([PyJs_anonymous_69_, PyJs_Object_79_]),u'12':Js([PyJs_anonymous_80_, PyJs_Object_142_]),u'13':Js([PyJs_anonymous_143_, PyJs_Object_153_]),u'14':Js([PyJs_anonymous_154_, PyJs_Object_171_]),u'15':Js([PyJs_anonymous_172_, PyJs_Object_192_]),u'16':Js([PyJs_anonymous_193_, PyJs_Object_234_]),u'17':Js([PyJs_anonymous_235_, PyJs_Object_239_]),u'18':Js([PyJs_anonymous_240_, PyJs_Object_264_]),u'19':Js([PyJs_anonymous_265_, PyJs_Object_268_]),u'20':Js([PyJs_anonymous_269_, PyJs_Object_286_]),u'21':Js([PyJs_anonymous_287_, PyJs_Object_294_]),u'22':Js([PyJs_anonymous_295_, PyJs_Object_311_]),u'23':Js([PyJs_anonymous_312_, PyJs_Object_326_]),u'24':Js([PyJs_anonymous_327_, PyJs_Object_335_]),u'25':Js([PyJs_anonymous_336_, PyJs_Object_348_]),u'26':Js([PyJs_anonymous_349_, PyJs_Object_356_]),u'27':Js([PyJs_anonymous_357_, PyJs_Object_399_]),u'28':Js([PyJs_anonymous_400_, PyJs_Object_421_]),u'29':Js([PyJs_anonymous_422_, PyJs_Object_444_]),u'30':Js([PyJs_anonymous_445_, PyJs_Object_450_]),u'31':Js([PyJs_anonymous_451_, PyJs_Object_452_]),u'32':Js([PyJs_anonymous_453_, PyJs_Object_459_]),u'33':Js([PyJs_anonymous_460_, PyJs_Object_470_]),u'34':Js([PyJs_anonymous_471_, PyJs_Object_474_]),u'35':Js([PyJs_anonymous_475_, PyJs_Object_479_]),u'36':Js([PyJs_anonymous_480_, PyJs_Object_482_]),u'37':Js([PyJs_anonymous_483_, PyJs_Object_493_]),u'38':Js([PyJs_anonymous_494_, PyJs_Object_495_]),u'39':Js([PyJs_anonymous_496_, PyJs_Object_501_]),u'40':Js([PyJs_anonymous_502_, PyJs_Object_516_]),u'41':Js([PyJs_anonymous_517_, PyJs_Object_522_]),u'42':Js([PyJs_anonymous_523_, PyJs_Object_544_]),u'43':Js([PyJs_anonymous_545_, PyJs_Object_575_]),u'44':Js([PyJs_anonymous_576_, PyJs_Object_635_]),u'45':Js([PyJs_anonymous_636_, PyJs_Object_646_]),u'46':Js([PyJs_anonymous_647_, PyJs_Object_657_]),u'47':Js([PyJs_anonymous_658_, PyJs_Object_669_]),u'48':Js([PyJs_anonymous_670_, PyJs_Object_679_]),u'49':Js([PyJs_anonymous_680_, PyJs_Object_689_]),u'50':Js([PyJs_anonymous_690_, PyJs_Object_693_]),u'51':Js([PyJs_anonymous_694_, PyJs_Object_704_]),u'52':Js([PyJs_anonymous_705_, PyJs_Object_709_]),u'53':Js([PyJs_anonymous_710_, PyJs_Object_713_]),u'54':Js([PyJs_anonymous_714_, PyJs_Object_738_]),u'55':Js([PyJs_anonymous_739_, PyJs_Object_758_]),u'56':Js([PyJs_anonymous_759_, PyJs_Object_763_]),u'57':Js([PyJs_anonymous_764_, PyJs_Object_770_]),u'58':Js([PyJs_anonymous_771_, PyJs_Object_777_]),u'59':Js([PyJs_anonymous_778_, PyJs_Object_784_]),u'60':Js([PyJs_anonymous_785_, PyJs_Object_793_]),u'61':Js([PyJs_anonymous_794_, PyJs_Object_840_]),u'62':Js([PyJs_anonymous_841_, PyJs_Object_848_]),u'63':Js([PyJs_anonymous_849_, PyJs_Object_857_]),u'64':Js([PyJs_anonymous_858_, PyJs_Object_864_]),u'65':Js([PyJs_anonymous_865_, PyJs_Object_907_]),u'66':Js([PyJs_anonymous_908_, PyJs_Object_919_]),u'67':Js([PyJs_anonymous_920_, PyJs_Object_951_]),u'68':Js([PyJs_anonymous_952_, PyJs_Object_960_]),u'69':Js([PyJs_anonymous_961_, PyJs_Object_973_]),u'70':Js([PyJs_anonymous_974_, PyJs_Object_982_]),u'71':Js([PyJs_anonymous_983_, PyJs_Object_989_]),u'72':Js([PyJs_anonymous_990_, PyJs_Object_1008_]),u'73':Js([PyJs_anonymous_1009_, PyJs_Object_1029_]),u'74':Js([PyJs_anonymous_1030_, PyJs_Object_1048_]),u'75':Js([PyJs_anonymous_1049_, PyJs_Object_1065_]),u'76':Js([PyJs_anonymous_1066_, PyJs_Object_1078_]),u'77':Js([PyJs_anonymous_1079_, PyJs_Object_1089_]),u'78':Js([PyJs_anonymous_1090_, PyJs_Object_1094_]),u'79':Js([PyJs_anonymous_1095_, PyJs_Object_1102_]),u'80':Js([PyJs_anonymous_1103_, PyJs_Object_1128_]),u'81':Js([PyJs_anonymous_1129_, PyJs_Object_1136_]),u'82':Js([PyJs_anonymous_1137_, PyJs_Object_1147_]),u'83':Js([PyJs_anonymous_1148_, PyJs_Object_1154_]),u'84':Js([PyJs_anonymous_1155_, PyJs_Object_1164_]),u'85':Js([PyJs_anonymous_1165_, PyJs_Object_1173_]),u'86':Js([PyJs_anonymous_1174_, PyJs_Object_1181_]),u'87':Js([PyJs_anonymous_1182_, PyJs_Object_1251_]),u'88':Js([PyJs_anonymous_1252_, PyJs_Object_1268_]),u'89':Js([PyJs_anonymous_1269_, PyJs_Object_1271_]),u'90':Js([PyJs_anonymous_1272_, PyJs_Object_1279_]),u'91':Js([PyJs_anonymous_1280_, PyJs_Object_1286_]),u'92':Js([PyJs_anonymous_1287_, PyJs_Object_1290_]),u'93':Js([PyJs_anonymous_1291_, PyJs_Object_1310_]),u'94':Js([PyJs_anonymous_1311_, PyJs_Object_1318_]),u'95':Js([PyJs_anonymous_1319_, PyJs_Object_1330_]),u'96':Js([PyJs_anonymous_1331_, PyJs_Object_1333_]),u'97':Js([PyJs_anonymous_1334_, PyJs_Object_1336_]),u'98':Js([PyJs_anonymous_1337_, PyJs_Object_1339_]),u'99':Js([PyJs_anonymous_1340_, PyJs_Object_1342_]),u'100':Js([PyJs_anonymous_1343_, PyJs_Object_1345_]),u'101':Js([PyJs_anonymous_1346_, PyJs_Object_1348_]),u'102':Js([PyJs_anonymous_1349_, PyJs_Object_1351_]),u'103':Js([PyJs_anonymous_1352_, PyJs_Object_1354_]),u'104':Js([PyJs_anonymous_1355_, PyJs_Object_1357_]),u'105':Js([PyJs_anonymous_1358_, PyJs_Object_1360_]),u'106':Js([PyJs_anonymous_1361_, PyJs_Object_1363_]),u'107':Js([PyJs_anonymous_1364_, PyJs_Object_1366_]),u'108':Js([PyJs_anonymous_1367_, PyJs_Object_1369_]),u'109':Js([PyJs_anonymous_1370_, PyJs_Object_1372_]),u'110':Js([PyJs_anonymous_1373_, PyJs_Object_1375_]),u'111':Js([PyJs_anonymous_1376_, PyJs_Object_1381_]),u'112':Js([PyJs_anonymous_1382_, PyJs_Object_1385_]),u'113':Js([PyJs_anonymous_1386_, PyJs_Object_1389_]),u'114':Js([PyJs_anonymous_1390_, PyJs_Object_1397_]),u'115':Js([PyJs_anonymous_1398_, PyJs_Object_1399_]),u'116':Js([PyJs_anonymous_1400_, PyJs_Object_1403_]),u'117':Js([PyJs_anonymous_1404_, PyJs_Object_1405_]),u'118':Js([PyJs_anonymous_1406_, PyJs_Object_1407_]),u'119':Js([PyJs_anonymous_1408_, PyJs_Object_1409_]),u'120':Js([PyJs_anonymous_1410_, PyJs_Object_1412_]),u'121':Js([PyJs_anonymous_1413_, PyJs_Object_1414_]),u'122':Js([PyJs_anonymous_1415_, PyJs_Object_1416_]),u'123':Js([PyJs_anonymous_1417_, PyJs_Object_1418_]),u'124':Js([PyJs_anonymous_1419_, PyJs_Object_1420_]),u'125':Js([PyJs_anonymous_1421_, PyJs_Object_1422_]),u'126':Js([PyJs_anonymous_1423_, PyJs_Object_1424_]),u'127':Js([PyJs_anonymous_1425_, PyJs_Object_1426_]),u'128':Js([PyJs_anonymous_1427_, PyJs_Object_1428_]),u'129':Js([PyJs_anonymous_1429_, PyJs_Object_1431_]),u'130':Js([PyJs_anonymous_1432_, PyJs_Object_1434_]),u'131':Js([PyJs_anonymous_1435_, PyJs_Object_1437_]),u'132':Js([PyJs_anonymous_1438_, PyJs_Object_1440_]),u'133':Js([PyJs_anonymous_1441_, PyJs_Object_1443_]),u'134':Js([PyJs_anonymous_1444_, PyJs_Object_1447_]),u'135':Js([PyJs_anonymous_1448_, PyJs_Object_1451_]),u'136':Js([PyJs_anonymous_1452_, PyJs_Object_1454_]),u'137':Js([PyJs_anonymous_1455_, PyJs_Object_1457_]),u'138':Js([PyJs_anonymous_1458_, PyJs_Object_1463_]),u'139':Js([PyJs_anonymous_1464_, PyJs_Object_1467_]),u'140':Js([PyJs_anonymous_1468_, PyJs_Object_1485_]),u'141':Js([PyJs_anonymous_1486_, PyJs_Object_1489_]),u'142':Js([PyJs_anonymous_1490_, PyJs_Object_1508_]),u'143':Js([PyJs_anonymous_1509_, PyJs_Object_1518_]),u'144':Js([PyJs_anonymous_1519_, PyJs_Object_1521_]),u'145':Js([PyJs_anonymous_1522_, PyJs_Object_1528_]),u'146':Js([PyJs_anonymous_1529_, PyJs_Object_1531_]),u'147':Js([PyJs_anonymous_1532_, PyJs_Object_1537_]),u'148':Js([PyJs_anonymous_1538_, PyJs_Object_1541_]),u'149':Js([PyJs_anonymous_1542_, PyJs_Object_1543_]),u'150':Js([PyJs_anonymous_1544_, PyJs_Object_1546_]),u'151':Js([PyJs_anonymous_1547_, PyJs_Object_1555_]),u'152':Js([PyJs_anonymous_1556_, PyJs_Object_1558_]),u'153':Js([PyJs_anonymous_1559_, PyJs_Object_1564_]),u'154':Js([PyJs_anonymous_1565_, PyJs_Object_1566_]),u'155':Js([PyJs_anonymous_1567_, PyJs_Object_1570_]),u'156':Js([PyJs_anonymous_1571_, PyJs_Object_1574_]),u'157':Js([PyJs_anonymous_1575_, PyJs_Object_1576_]),u'158':Js([PyJs_anonymous_1577_, PyJs_Object_1581_]),u'159':Js([PyJs_anonymous_1582_, PyJs_Object_1584_]),u'160':Js([PyJs_anonymous_1585_, PyJs_Object_1587_]),u'161':Js([PyJs_anonymous_1588_, PyJs_Object_1590_]),u'162':Js([PyJs_anonymous_1591_, PyJs_Object_1593_]),u'163':Js([PyJs_anonymous_1594_, PyJs_Object_1596_]),u'164':Js([PyJs_anonymous_1597_, PyJs_Object_1602_]),u'165':Js([PyJs_anonymous_1603_, PyJs_Object_1612_]),u'166':Js([PyJs_anonymous_1613_, PyJs_Object_1616_]),u'167':Js([PyJs_anonymous_1617_, PyJs_Object_1619_]),u'168':Js([PyJs_anonymous_1620_, PyJs_Object_1622_]),u'169':Js([PyJs_anonymous_1623_, PyJs_Object_1624_]),u'170':Js([PyJs_anonymous_1625_, PyJs_Object_1637_]),u'171':Js([PyJs_anonymous_1638_, PyJs_Object_1646_]),u'172':Js([PyJs_anonymous_1647_, PyJs_Object_1651_]),u'173':Js([PyJs_anonymous_1652_, PyJs_Object_1654_]),u'174':Js([PyJs_anonymous_1655_, PyJs_Object_1657_]),u'175':Js([PyJs_anonymous_1658_, PyJs_Object_1660_]),u'176':Js([PyJs_anonymous_1661_, PyJs_Object_1665_]),u'177':Js([PyJs_anonymous_1666_, PyJs_Object_1668_]),u'178':Js([PyJs_anonymous_1669_, PyJs_Object_1670_]),u'179':Js([PyJs_anonymous_1671_, PyJs_Object_1673_]),u'180':Js([PyJs_anonymous_1674_, PyJs_Object_1676_]),u'181':Js([PyJs_anonymous_1677_, PyJs_Object_1679_]),u'182':Js([PyJs_anonymous_1680_, PyJs_Object_1682_]),u'183':Js([PyJs_anonymous_1683_, PyJs_Object_1688_]),u'184':Js([PyJs_anonymous_1689_, PyJs_Object_1692_]),u'185':Js([PyJs_anonymous_1693_, PyJs_Object_1695_]),u'186':Js([PyJs_anonymous_1696_, PyJs_Object_1697_]),u'187':Js([PyJs_anonymous_1698_, PyJs_Object_1705_]),u'188':Js([PyJs_anonymous_1706_, PyJs_Object_1710_]),u'189':Js([PyJs_anonymous_1711_, PyJs_Object_1714_]),u'190':Js([PyJs_anonymous_1715_, PyJs_Object_1717_]),u'191':Js([PyJs_anonymous_1718_, PyJs_Object_1722_]),u'192':Js([PyJs_anonymous_1723_, PyJs_Object_1727_]),u'193':Js([PyJs_anonymous_1728_, PyJs_Object_1730_]),u'194':Js([PyJs_anonymous_1731_, PyJs_Object_1733_]),u'195':Js([PyJs_anonymous_1734_, PyJs_Object_1736_]),u'196':Js([PyJs_anonymous_1737_, PyJs_Object_1739_]),u'197':Js([PyJs_anonymous_1740_, PyJs_Object_1742_]),u'198':Js([PyJs_anonymous_1743_, PyJs_Object_1745_]),u'199':Js([PyJs_anonymous_1746_, PyJs_Object_1748_]),u'200':Js([PyJs_anonymous_1749_, PyJs_Object_1754_]),u'201':Js([PyJs_anonymous_1755_, PyJs_Object_1756_]),u'202':Js([PyJs_anonymous_1757_, PyJs_Object_1759_]),u'203':Js([PyJs_anonymous_1760_, PyJs_Object_1762_]),u'204':Js([PyJs_anonymous_1763_, PyJs_Object_1765_]),u'205':Js([PyJs_anonymous_1766_, PyJs_Object_1769_]),u'206':Js([PyJs_anonymous_1770_, PyJs_Object_1776_]),u'207':Js([PyJs_anonymous_1777_, PyJs_Object_1779_]),u'208':Js([PyJs_anonymous_1780_, PyJs_Object_1782_]),u'209':Js([PyJs_anonymous_1783_, PyJs_Object_1785_]),u'210':Js([PyJs_anonymous_1786_, PyJs_Object_1789_]),u'211':Js([PyJs_anonymous_1790_, PyJs_Object_1792_]),u'212':Js([PyJs_anonymous_1793_, PyJs_Object_1794_]),u'213':Js([PyJs_anonymous_1795_, PyJs_Object_1800_]),u'214':Js([PyJs_anonymous_1801_, PyJs_Object_1838_]),u'215':Js([PyJs_anonymous_1839_, PyJs_Object_1848_]),u'216':Js([PyJs_anonymous_1849_, PyJs_Object_1854_]),u'217':Js([PyJs_anonymous_1855_, PyJs_Object_1857_]),u'218':Js([PyJs_anonymous_1858_, PyJs_Object_1859_]),u'219':Js([PyJs_anonymous_1860_, PyJs_Object_1861_]),u'220':Js([PyJs_anonymous_1862_, PyJs_Object_1863_]),u'221':Js([PyJs_anonymous_1864_, PyJs_Object_1877_]),u'222':Js([PyJs_anonymous_1878_, PyJs_Object_1880_]),u'223':Js([PyJs_anonymous_1881_, PyJs_Object_1894_]),u'224':Js([PyJs_anonymous_1895_, PyJs_Object_1898_]),u'225':Js([PyJs_anonymous_1899_, PyJs_Object_1918_]),u'226':Js([PyJs_anonymous_1919_, PyJs_Object_1926_]),u'227':Js([PyJs_anonymous_1927_, PyJs_Object_1929_]),u'228':Js([PyJs_anonymous_1930_, PyJs_Object_1936_]),u'229':Js([PyJs_anonymous_1937_, PyJs_Object_1939_]),u'230':Js([PyJs_anonymous_1940_, PyJs_Object_1949_]),u'231':Js([PyJs_anonymous_1950_, PyJs_Object_1958_]),u'232':Js([PyJs_anonymous_1959_, PyJs_Object_1980_]),u'233':Js([PyJs_anonymous_1981_, PyJs_Object_1985_]),u'234':Js([PyJs_anonymous_1986_, PyJs_Object_1999_]),u'235':Js([PyJs_anonymous_2000_, PyJs_Object_2005_]),u'236':Js([PyJs_anonymous_2006_, PyJs_Object_2016_]),u'237':Js([PyJs_anonymous_2017_, PyJs_Object_2031_]),u'238':Js([PyJs_anonymous_2032_, PyJs_Object_2039_]),u'239':Js([PyJs_anonymous_2040_, PyJs_Object_2071_]),u'240':Js([PyJs_anonymous_2072_, PyJs_Object_2079_]),u'241':Js([PyJs_anonymous_2080_, PyJs_Object_2082_]),u'242':Js([PyJs_anonymous_2083_, PyJs_Object_2092_]),u'243':Js([PyJs_anonymous_2093_, PyJs_Object_2102_]),u'244':Js([PyJs_anonymous_2103_, PyJs_Object_2178_]),u'245':Js([PyJs_anonymous_2179_, PyJs_Object_2193_]),u'246':Js([PyJs_anonymous_2194_, PyJs_Object_2206_]),u'247':Js([PyJs_anonymous_2207_, PyJs_Object_2212_]),u'248':Js([PyJs_anonymous_2213_, PyJs_Object_2219_]),u'249':Js([PyJs_anonymous_2220_, PyJs_Object_2423_]),u'250':Js([PyJs_anonymous_2424_, PyJs_Object_2528_]),u'251':Js([PyJs_anonymous_2529_, PyJs_Object_2559_]),u'252':Js([PyJs_anonymous_2560_, PyJs_Object_2648_]),u'253':Js([PyJs_anonymous_2649_, PyJs_Object_2662_]),u'254':Js([PyJs_anonymous_2663_, PyJs_Object_2664_]),u'255':Js([PyJs_anonymous_2665_, PyJs_Object_2705_]),u'256':Js([PyJs_anonymous_2706_, PyJs_Object_2712_]),u'257':Js([PyJs_anonymous_2713_, PyJs_Object_2717_]),u'258':Js([PyJs_anonymous_2718_, PyJs_Object_2826_]),u'259':Js([PyJs_anonymous_2827_, PyJs_Object_2829_]),u'260':Js([PyJs_anonymous_2830_, PyJs_Object_2834_]),u'261':Js([PyJs_anonymous_2835_, PyJs_Object_2841_]),u'262':Js([PyJs_anonymous_2842_, PyJs_Object_3223_]),u'263':Js([PyJs_anonymous_3224_, PyJs_Object_3226_]),u'264':Js([PyJs_anonymous_3227_, PyJs_Object_3230_]),u'265':Js([PyJs_anonymous_3231_, PyJs_Object_3244_]),u'266':Js([PyJs_anonymous_3245_, PyJs_Object_3248_]),u'267':Js([PyJs_anonymous_3249_, PyJs_Object_3277_]),u'268':Js([PyJs_anonymous_3278_, PyJs_Object_3282_]),u'269':Js([PyJs_anonymous_3283_, PyJs_Object_3286_]),u'270':Js([PyJs_anonymous_3287_, PyJs_Object_3295_]),u'271':Js([PyJs_anonymous_3296_, PyJs_Object_3301_]),u'272':Js([PyJs_anonymous_3302_, PyJs_Object_3304_]),u'273':Js([PyJs_anonymous_3305_, PyJs_Object_3308_]),u'274':Js([PyJs_anonymous_3309_, PyJs_Object_3314_]),u'275':Js([PyJs_anonymous_3315_, PyJs_Object_3318_]),u'276':Js([PyJs_anonymous_3319_, PyJs_Object_3321_]),u'277':Js([PyJs_anonymous_3322_, PyJs_Object_3355_]),u'278':Js([PyJs_anonymous_3356_, PyJs_Object_3357_]),u'279':Js([PyJs_anonymous_3358_, PyJs_Object_3359_]),u'280':Js([PyJs_anonymous_3360_, PyJs_Object_3364_]),u'281':Js([PyJs_anonymous_3365_, PyJs_Object_3367_]),u'282':Js([PyJs_anonymous_3368_, PyJs_Object_3372_]),u'283':Js([PyJs_anonymous_3373_, PyJs_Object_3395_]),u'284':Js([PyJs_anonymous_3396_, PyJs_Object_3424_]),u'285':Js([PyJs_anonymous_3425_, PyJs_Object_3426_]),u'286':Js([PyJs_anonymous_3427_, PyJs_Object_3428_]),u'287':Js([PyJs_anonymous_3429_, PyJs_Object_3430_]),u'288':Js([PyJs_anonymous_3431_, PyJs_Object_3432_]),u'289':Js([PyJs_anonymous_3433_, PyJs_Object_3434_]),u'290':Js([PyJs_anonymous_3435_, PyJs_Object_3436_]),u'291':Js([PyJs_anonymous_3437_, PyJs_Object_3438_]),u'292':Js([PyJs_anonymous_3439_, PyJs_Object_3440_]),u'293':Js([PyJs_anonymous_3441_, PyJs_Object_3442_]),u'294':Js([PyJs_anonymous_3443_, PyJs_Object_3444_]),u'295':Js([PyJs_anonymous_3445_, PyJs_Object_3446_]),u'296':Js([PyJs_anonymous_3447_, PyJs_Object_3448_]),u'297':Js([PyJs_anonymous_3449_, PyJs_Object_3450_]),u'298':Js([PyJs_anonymous_3451_, PyJs_Object_3452_]),u'299':Js([PyJs_anonymous_3453_, PyJs_Object_3454_]),u'300':Js([PyJs_anonymous_3455_, PyJs_Object_3456_]),u'301':Js([PyJs_anonymous_3457_, PyJs_Object_3458_]),u'302':Js([PyJs_anonymous_3459_, PyJs_Object_3460_]),u'303':Js([PyJs_anonymous_3461_, PyJs_Object_3462_]),u'304':Js([PyJs_anonymous_3463_, PyJs_Object_3464_]),u'305':Js([PyJs_anonymous_3465_, PyJs_Object_3466_]),u'306':Js([PyJs_anonymous_3467_, PyJs_Object_3468_]),u'307':Js([PyJs_anonymous_3469_, PyJs_Object_3470_]),u'308':Js([PyJs_anonymous_3471_, PyJs_Object_3472_]),u'309':Js([PyJs_anonymous_3473_, PyJs_Object_3474_]),u'310':Js([PyJs_anonymous_3475_, PyJs_Object_3476_]),u'311':Js([PyJs_anonymous_3477_, PyJs_Object_3478_]),u'312':Js([PyJs_anonymous_3479_, PyJs_Object_3480_]),u'313':Js([PyJs_anonymous_3481_, PyJs_Object_3482_]),u'314':Js([PyJs_anonymous_3483_, PyJs_Object_3491_]),u'315':Js([PyJs_anonymous_3492_, PyJs_Object_3494_]),u'316':Js([PyJs_anonymous_3495_, PyJs_Object_3496_]),u'317':Js([PyJs_anonymous_3497_, PyJs_Object_3498_]),u'318':Js([PyJs_anonymous_3499_, PyJs_Object_3500_]),u'319':Js([PyJs_anonymous_3501_, PyJs_Object_3502_]),u'320':Js([PyJs_anonymous_3503_, PyJs_Object_3504_]),u'321':Js([PyJs_anonymous_3505_, PyJs_Object_3506_]),u'322':Js([PyJs_anonymous_3507_, PyJs_Object_3508_]),u'323':Js([PyJs_anonymous_3509_, PyJs_Object_3510_]),u'324':Js([PyJs_anonymous_3511_, PyJs_Object_3512_]),u'325':Js([PyJs_anonymous_3513_, PyJs_Object_3514_]),u'326':Js([PyJs_anonymous_3515_, PyJs_Object_3516_]),u'327':Js([PyJs_anonymous_3517_, PyJs_Object_3518_]),u'328':Js([PyJs_anonymous_3519_, PyJs_Object_3520_]),u'329':Js([PyJs_anonymous_3521_, PyJs_Object_3522_]),u'330':Js([PyJs_anonymous_3523_, PyJs_Object_3524_]),u'331':Js([PyJs_anonymous_3525_, PyJs_Object_3526_]),u'332':Js([PyJs_anonymous_3527_, PyJs_Object_3528_]),u'333':Js([PyJs_anonymous_3529_, PyJs_Object_3532_]),u'334':Js([PyJs_anonymous_3533_, PyJs_Object_3535_]),u'335':Js([PyJs_anonymous_3536_, PyJs_Object_3538_]),u'336':Js([PyJs_anonymous_3539_, PyJs_Object_3541_]),u'337':Js([PyJs_anonymous_3542_, PyJs_Object_3544_]),u'338':Js([PyJs_anonymous_3545_, PyJs_Object_3546_]),u'339':Js([PyJs_anonymous_3547_, PyJs_Object_3552_]),u'340':Js([PyJs_anonymous_3553_, PyJs_Object_3555_]),u'341':Js([PyJs_anonymous_3556_, PyJs_Object_3558_]),u'342':Js([PyJs_anonymous_3559_, PyJs_Object_3560_]),u'343':Js([PyJs_anonymous_3561_, PyJs_Object_3562_]),u'344':Js([PyJs_anonymous_3563_, PyJs_Object_3564_]),u'345':Js([PyJs_anonymous_3565_, PyJs_Object_3566_]),u'346':Js([PyJs_anonymous_3567_, PyJs_Object_3568_]),u'347':Js([PyJs_anonymous_3569_, PyJs_Object_3570_]),u'348':Js([PyJs_anonymous_3571_, PyJs_Object_3573_]),u'349':Js([PyJs_anonymous_3574_, PyJs_Object_3575_]),u'350':Js([PyJs_anonymous_3576_, PyJs_Object_3578_]),u'351':Js([PyJs_anonymous_3579_, PyJs_Object_3580_]),u'352':Js([PyJs_anonymous_3581_, PyJs_Object_3582_]),u'353':Js([PyJs_anonymous_3583_, PyJs_Object_3584_]),u'354':Js([PyJs_anonymous_3585_, PyJs_Object_3586_]),u'355':Js([PyJs_anonymous_3587_, PyJs_Object_3588_]),u'356':Js([PyJs_anonymous_3589_, PyJs_Object_3590_]),u'357':Js([PyJs_anonymous_3591_, PyJs_Object_3592_]),u'358':Js([PyJs_anonymous_3593_, PyJs_Object_3594_]),u'359':Js([PyJs_anonymous_3595_, PyJs_Object_3596_]),u'360':Js([PyJs_anonymous_3597_, PyJs_Object_3598_]),u'361':Js([PyJs_anonymous_3599_, PyJs_Object_3600_]),u'362':Js([PyJs_anonymous_3601_, PyJs_Object_3603_]),u'363':Js([PyJs_anonymous_3604_, PyJs_Object_3605_]),u'364':Js([PyJs_anonymous_3606_, PyJs_Object_3609_]),u'365':Js([PyJs_anonymous_3610_, PyJs_Object_3611_]),u'366':Js([PyJs_anonymous_3612_, PyJs_Object_3613_]),u'367':Js([PyJs_anonymous_3614_, PyJs_Object_3616_]),u'368':Js([PyJs_anonymous_3617_, PyJs_Object_3618_]),u'369':Js([PyJs_anonymous_3619_, PyJs_Object_3620_]),u'370':Js([PyJs_anonymous_3621_, PyJs_Object_3623_]),u'371':Js([PyJs_anonymous_3624_, PyJs_Object_3626_]),u'372':Js([PyJs_anonymous_3627_, PyJs_Object_3629_]),u'373':Js([PyJs_anonymous_3630_, PyJs_Object_3633_]),u'374':Js([PyJs_anonymous_3634_, PyJs_Object_3636_]),u'375':Js([PyJs_anonymous_3637_, PyJs_Object_3639_]),u'376':Js([PyJs_anonymous_3640_, PyJs_Object_3641_]),u'377':Js([PyJs_anonymous_3642_, PyJs_Object_3644_]),u'378':Js([PyJs_anonymous_3645_, PyJs_Object_3646_]),u'379':Js([PyJs_anonymous_3647_, PyJs_Object_3648_]),u'380':Js([PyJs_anonymous_3649_, PyJs_Object_3650_]),u'381':Js([PyJs_anonymous_3651_, PyJs_Object_3652_]),u'382':Js([PyJs_anonymous_3653_, PyJs_Object_3654_]),u'383':Js([PyJs_anonymous_3655_, PyJs_Object_3656_]),u'384':Js([PyJs_anonymous_3657_, PyJs_Object_3658_]),u'385':Js([PyJs_anonymous_3659_, PyJs_Object_3662_]),u'386':Js([PyJs_anonymous_3663_, PyJs_Object_3664_]),u'387':Js([PyJs_anonymous_3665_, PyJs_Object_3666_]),u'388':Js([PyJs_anonymous_3667_, PyJs_Object_3669_]),u'389':Js([PyJs_anonymous_3670_, PyJs_Object_3671_]),u'390':Js([PyJs_anonymous_3672_, PyJs_Object_3673_]),u'391':Js([PyJs_anonymous_3674_, PyJs_Object_3675_]),u'392':Js([PyJs_anonymous_3676_, PyJs_Object_3677_]),u'393':Js([PyJs_anonymous_3678_, PyJs_Object_3679_]),u'394':Js([PyJs_anonymous_3680_, PyJs_Object_3681_]),u'395':Js([PyJs_anonymous_3682_, PyJs_Object_3683_]),u'396':Js([PyJs_anonymous_3684_, PyJs_Object_3685_]),u'397':Js([PyJs_anonymous_3686_, PyJs_Object_3688_]),u'398':Js([PyJs_anonymous_3689_, PyJs_Object_3690_]),u'399':Js([PyJs_anonymous_3691_, PyJs_Object_3692_]),u'400':Js([PyJs_anonymous_3693_, PyJs_Object_3694_]),u'401':Js([PyJs_anonymous_3695_, PyJs_Object_3696_]),u'402':Js([PyJs_anonymous_3697_, PyJs_Object_3698_]),u'403':Js([PyJs_anonymous_3699_, PyJs_Object_3700_]),u'404':Js([PyJs_anonymous_3701_, PyJs_Object_3702_]),u'405':Js([PyJs_anonymous_3703_, PyJs_Object_3705_]),u'406':Js([PyJs_anonymous_3706_, PyJs_Object_3707_]),u'407':Js([PyJs_anonymous_3708_, PyJs_Object_3709_]),u'408':Js([PyJs_anonymous_3710_, PyJs_Object_3711_]),u'409':Js([PyJs_anonymous_3712_, PyJs_Object_3713_]),u'410':Js([PyJs_anonymous_3714_, PyJs_Object_3715_]),u'411':Js([PyJs_anonymous_3716_, PyJs_Object_3717_]),u'412':Js([PyJs_anonymous_3718_, PyJs_Object_3719_]),u'413':Js([PyJs_anonymous_3720_, PyJs_Object_3721_]),u'414':Js([PyJs_anonymous_3722_, PyJs_Object_3724_]),u'415':Js([PyJs_anonymous_3725_, PyJs_Object_3726_]),u'416':Js([PyJs_anonymous_3727_, PyJs_Object_3728_]),u'417':Js([PyJs_anonymous_3729_, PyJs_Object_3730_]),u'418':Js([PyJs_anonymous_3731_, PyJs_Object_3732_]),u'419':Js([PyJs_anonymous_3733_, PyJs_Object_3735_]),u'420':Js([PyJs_anonymous_3736_, PyJs_Object_3738_]),u'421':Js([PyJs_anonymous_3739_, PyJs_Object_3740_]),u'422':Js([PyJs_anonymous_3741_, PyJs_Object_3744_]),u'423':Js([PyJs_anonymous_3745_, PyJs_Object_3746_]),u'424':Js([PyJs_anonymous_3747_, PyJs_Object_3748_]),u'425':Js([PyJs_anonymous_3749_, PyJs_Object_3751_]),u'426':Js([PyJs_anonymous_3752_, PyJs_Object_3753_]),u'427':Js([PyJs_anonymous_3754_, PyJs_Object_3755_]),u'428':Js([PyJs_anonymous_3756_, PyJs_Object_3757_]),u'429':Js([PyJs_anonymous_3758_, PyJs_Object_3759_]),u'430':Js([PyJs_anonymous_3760_, PyJs_Object_3761_]),u'431':Js([PyJs_anonymous_3762_, PyJs_Object_3763_]),u'432':Js([PyJs_anonymous_3764_, PyJs_Object_3767_]),u'433':Js([PyJs_anonymous_3768_, PyJs_Object_3769_]),u'434':Js([PyJs_anonymous_3770_, PyJs_Object_3771_]),u'435':Js([PyJs_anonymous_3772_, PyJs_Object_3775_]),u'436':Js([PyJs_anonymous_3776_, PyJs_Object_3779_]),u'437':Js([PyJs_anonymous_3780_, PyJs_Object_3782_]),u'438':Js([PyJs_anonymous_3783_, PyJs_Object_3784_]),u'439':Js([PyJs_anonymous_3785_, PyJs_Object_3786_]),u'440':Js([PyJs_anonymous_3787_, PyJs_Object_3788_]),u'441':Js([PyJs_anonymous_3789_, PyJs_Object_3790_]),u'442':Js([PyJs_anonymous_3791_, PyJs_Object_3793_]),u'443':Js([PyJs_anonymous_3794_, PyJs_Object_3795_]),u'444':Js([PyJs_anonymous_3796_, PyJs_Object_3797_]),u'445':Js([PyJs_anonymous_3798_, PyJs_Object_3799_]),u'446':Js([PyJs_anonymous_3800_, PyJs_Object_3801_]),u'447':Js([PyJs_anonymous_3802_, PyJs_Object_3803_]),u'448':Js([PyJs_anonymous_3804_, PyJs_Object_3805_]),u'449':Js([PyJs_anonymous_3806_, PyJs_Object_3807_]),u'450':Js([PyJs_anonymous_3808_, PyJs_Object_3809_]),u'451':Js([PyJs_anonymous_3810_, PyJs_Object_3811_]),u'452':Js([PyJs_anonymous_3812_, PyJs_Object_3813_]),u'453':Js([PyJs_anonymous_3814_, PyJs_Object_3815_]),u'454':Js([PyJs_anonymous_3816_, PyJs_Object_3817_]),u'455':Js([PyJs_anonymous_3818_, PyJs_Object_3819_]),u'456':Js([PyJs_anonymous_3820_, PyJs_Object_3821_]),u'457':Js([PyJs_anonymous_3822_, PyJs_Object_3823_]),u'458':Js([PyJs_anonymous_3824_, PyJs_Object_3825_]),u'459':Js([PyJs_anonymous_3826_, PyJs_Object_3827_]),u'460':Js([PyJs_anonymous_3828_, PyJs_Object_3829_]),u'461':Js([PyJs_anonymous_3830_, PyJs_Object_3831_]),u'462':Js([PyJs_anonymous_3832_, PyJs_Object_3834_]),u'463':Js([PyJs_anonymous_3835_, PyJs_Object_3836_]),u'464':Js([PyJs_anonymous_3837_, PyJs_Object_3838_]),u'465':Js([PyJs_anonymous_3839_, PyJs_Object_3840_]),u'466':Js([PyJs_anonymous_3841_, PyJs_Object_3842_]),u'467':Js([PyJs_anonymous_3843_, PyJs_Object_3844_]),u'468':Js([PyJs_anonymous_3845_, PyJs_Object_3846_]),u'469':Js([PyJs_anonymous_3847_, PyJs_Object_3848_]),u'470':Js([PyJs_anonymous_3849_, PyJs_Object_3850_]),u'471':Js([PyJs_anonymous_3851_, PyJs_Object_3852_]),u'472':Js([PyJs_anonymous_3853_, PyJs_Object_3854_]),u'473':Js([PyJs_anonymous_3855_, PyJs_Object_3860_]),u'474':Js([PyJs_anonymous_3861_, PyJs_Object_3862_]),u'475':Js([PyJs_anonymous_3863_, PyJs_Object_3864_]),u'476':Js([PyJs_anonymous_3865_, PyJs_Object_3866_]),u'477':Js([PyJs_anonymous_3867_, PyJs_Object_3869_]),u'478':Js([PyJs_anonymous_3870_, PyJs_Object_3872_]),u'479':Js([PyJs_anonymous_3873_, PyJs_Object_3874_]),u'480':Js([PyJs_anonymous_3875_, PyJs_Object_3876_]),u'481':Js([PyJs_anonymous_3877_, PyJs_Object_3878_]),u'482':Js([PyJs_anonymous_3879_, PyJs_Object_3880_]),u'483':Js([PyJs_anonymous_3881_, PyJs_Object_3882_]),u'484':Js([PyJs_anonymous_3883_, PyJs_Object_3885_]),u'485':Js([PyJs_anonymous_3886_, PyJs_Object_3888_]),u'486':Js([PyJs_anonymous_3889_, PyJs_Object_3890_]),u'487':Js([PyJs_anonymous_3891_, PyJs_Object_3892_]),u'488':Js([PyJs_anonymous_3893_, PyJs_Object_3894_]),u'489':Js([PyJs_anonymous_3895_, PyJs_Object_3896_]),u'490':Js([PyJs_anonymous_3897_, PyJs_Object_3898_]),u'491':Js([PyJs_anonymous_3899_, PyJs_Object_3900_]),u'492':Js([PyJs_anonymous_3901_, PyJs_Object_3902_]),u'493':Js([PyJs_anonymous_3903_, PyJs_Object_3904_]),u'494':Js([PyJs_anonymous_3905_, PyJs_Object_3906_]),u'495':Js([PyJs_anonymous_3907_, PyJs_Object_3908_]),u'496':Js([PyJs_anonymous_3909_, PyJs_Object_3910_]),u'497':Js([PyJs_anonymous_3911_, PyJs_Object_3914_]),u'498':Js([PyJs_anonymous_3915_, PyJs_Object_3917_]),u'499':Js([PyJs_anonymous_3918_, PyJs_Object_3920_]),u'500':Js([PyJs_anonymous_3921_, PyJs_Object_3927_]),u'501':Js([PyJs_anonymous_3928_, PyJs_Object_3983_]),u'502':Js([PyJs_anonymous_3984_, PyJs_Object_3991_]),u'503':Js([PyJs_anonymous_3992_, PyJs_Object_3994_]),u'504':Js([PyJs_anonymous_3995_, PyJs_Object_4001_]),u'505':Js([PyJs_anonymous_4002_, PyJs_Object_4010_]),u'506':Js([PyJs_anonymous_4011_, PyJs_Object_4027_]),u'507':Js([PyJs_anonymous_4028_, PyJs_Object_4030_]),u'508':Js([PyJs_anonymous_4031_, PyJs_Object_4033_]),u'509':Js([PyJs_anonymous_4034_, PyJs_Object_4042_]),u'510':Js([PyJs_anonymous_4043_, PyJs_Object_4046_]),u'511':Js([PyJs_anonymous_4047_, PyJs_Object_4050_]),u'512':Js([PyJs_anonymous_4051_, PyJs_Object_4053_]),u'513':Js([PyJs_anonymous_4054_, PyJs_Object_4059_]),u'514':Js([PyJs_anonymous_4060_, PyJs_Object_4062_]),u'515':Js([PyJs_anonymous_4063_, PyJs_Object_4119_]),u'516':Js([PyJs_anonymous_4120_, PyJs_Object_4145_]),u'517':Js([PyJs_anonymous_4146_, PyJs_Object_4176_]),u'518':Js([PyJs_anonymous_4177_, PyJs_Object_4183_]),u'519':Js([PyJs_anonymous_4184_, PyJs_Object_4185_]),u'520':Js([PyJs_anonymous_4186_, PyJs_Object_4188_]),u'521':Js([PyJs_anonymous_4189_, PyJs_Object_4193_]),u'522':Js([PyJs_anonymous_4194_, PyJs_Object_4196_]),u'523':Js([PyJs_anonymous_4197_, PyJs_Object_4198_]),u'524':Js([PyJs_anonymous_4199_, PyJs_Object_4214_]),u'525':Js([PyJs_anonymous_4215_, PyJs_Object_4273_]),u'526':Js([PyJs_anonymous_4274_, PyJs_Object_4276_]),u'527':Js([PyJs_anonymous_4277_, PyJs_Object_4280_]),u'528':Js([PyJs_anonymous_4281_, PyJs_Object_4284_]),u'529':Js([PyJs_anonymous_4285_, PyJs_Object_4291_]),u'530':Js([PyJs_anonymous_4292_, PyJs_Object_4308_]),u'531':Js([PyJs_anonymous_4309_, PyJs_Object_4319_]),u'532':Js([PyJs_anonymous_4320_, PyJs_Object_4322_]),u'533':Js([PyJs_anonymous_4323_, PyJs_Object_4325_]),u'534':Js([PyJs_anonymous_4326_, PyJs_Object_4351_])}) +PyJs_Object_4352_ = Js({}) +@Js +def PyJs_e_4353_(t, n, r, this, arguments, var=var): + var = Scope({u'e':PyJs_e_4353_, u'this':this, u'n':n, u'r':r, u'arguments':arguments, u't':t}, var) + var.registers([u'i', u'o', u'n', u's', u'r', u't']) + @Js + def PyJsHoisted_s_(o, u, this, arguments, var=var): + var = Scope({u'this':this, u'u':u, u'arguments':arguments, u'o':o}, var) + var.registers([u'a', u'u', u'l', u'o', u'f']) + if var.get(u'n').get(var.get(u'o')).neg(): + if var.get(u't').get(var.get(u'o')).neg(): + var.put(u'a', ((var.get(u'require',throw=False).typeof()==Js(u'function')) and var.get(u'require'))) + if (var.get(u'u').neg() and var.get(u'a')): + return var.get(u'a')(var.get(u'o'), Js(0.0).neg()) + if var.get(u'i'): + return var.get(u'i')(var.get(u'o'), Js(0.0).neg()) + var.put(u'f', var.get(u'Error').create(((Js(u"Cannot find module '")+var.get(u'o'))+Js(u"'")))) + PyJsTempException = JsToPyException(PyJsComma(var.get(u'f').put(u'code', Js(u'MODULE_NOT_FOUND')),var.get(u'f'))) + raise PyJsTempException + PyJs_Object_4355_ = Js({}) + PyJs_Object_4354_ = Js({u'exports':PyJs_Object_4355_}) + var.put(u'l', var.get(u'n').put(var.get(u'o'), PyJs_Object_4354_)) + @Js + def PyJs_anonymous_4356_(e, this, arguments, var=var): + var = Scope({u'this':this, u'e':e, u'arguments':arguments}, var) + var.registers([u'e', u'n']) + var.put(u'n', var.get(u't').get(var.get(u'o')).get(u'1').get(var.get(u'e'))) + return var.get(u's')((var.get(u'n') if var.get(u'n') else var.get(u'e'))) + PyJs_anonymous_4356_._set_name(u'anonymous') + var.get(u't').get(var.get(u'o')).get(u'0').callprop(u'call', var.get(u'l').get(u'exports'), PyJs_anonymous_4356_, var.get(u'l'), var.get(u'l').get(u'exports'), var.get(u'e'), var.get(u't'), var.get(u'n'), var.get(u'r')) + return var.get(u'n').get(var.get(u'o')).get(u'exports') + PyJsHoisted_s_.func_name = u's' + var.put(u's', PyJsHoisted_s_) + pass + var.put(u'i', ((var.get(u'require',throw=False).typeof()==Js(u'function')) and var.get(u'require'))) + #for JS loop + var.put(u'o', Js(0.0)) + while (var.get(u'o')<var.get(u'r').get(u'length')): + try: + var.get(u's')(var.get(u'r').get(var.get(u'o'))) + finally: + (var.put(u'o',Js(var.get(u'o').to_number())+Js(1))-Js(1)) + return var.get(u's') +PyJs_e_4353_._set_name(u'e') +PyJs_e_4353_(PyJs_Object_0_, PyJs_Object_4352_, Js([Js(1.0)])) +pass + + +# Add lib to the module scope +babel = var.to_python() \ No newline at end of file diff --git a/Contents/Libraries/Shared/js2py/es6/buildBabel b/Contents/Libraries/Shared/js2py/es6/buildBabel new file mode 100644 index 000000000..d814204da --- /dev/null +++ b/Contents/Libraries/Shared/js2py/es6/buildBabel @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + + +# install all the dependencies and pack everything into one file babel_bundle.js (converted to es2015). +npm install babel-core babel-cli babel-preset-es2015 browserify +browserify babel.js -o babel_bundle.js -t [ babelify --presets [ es2015 ] ] + +# translate babel_bundle.js using js2py -> generates babel.py +echo "Generating babel.py..." +python -c "import js2py;js2py.translate_file('babel_bundle.js', 'babel.py');" +rm babel_bundle.js + diff --git a/Contents/Libraries/Shared/js2py/evaljs.py b/Contents/Libraries/Shared/js2py/evaljs.py new file mode 100644 index 000000000..3f5eeee53 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/evaljs.py @@ -0,0 +1,265 @@ +# coding=utf-8 +from .translators import translate_js, DEFAULT_HEADER +from .es6 import js6_to_js5 +import sys +import time +import json +import six +import os +import hashlib +import codecs + +__all__ = [ + 'EvalJs', 'translate_js', 'import_js', 'eval_js', 'translate_file', + 'eval_js6', 'translate_js6', 'run_file', 'disable_pyimport', + 'get_file_contents', 'write_file_contents' +] +DEBUG = False + + +def disable_pyimport(): + import pyjsparser.parser + pyjsparser.parser.ENABLE_PYIMPORT = False + + +def path_as_local(path): + if os.path.isabs(path): + return path + # relative to cwd + return os.path.join(os.getcwd(), path) + + +def import_js(path, lib_name, globals): + """Imports from javascript source file. + globals is your globals()""" + with codecs.open(path_as_local(path), "r", "utf-8") as f: + js = f.read() + e = EvalJs() + e.execute(js) + var = e.context['var'] + globals[lib_name] = var.to_python() + + +def get_file_contents(path_or_file): + if hasattr(path_or_file, 'read'): + js = path_or_file.read() + else: + with codecs.open(path_as_local(path_or_file), "r", "utf-8") as f: + js = f.read() + return js + + +def write_file_contents(path_or_file, contents): + if hasattr(path_or_file, 'write'): + path_or_file.write(contents) + else: + with open(path_as_local(path_or_file), 'w') as f: + f.write(contents) + + +def translate_file(input_path, output_path): + ''' + Translates input JS file to python and saves the it to the output path. + It appends some convenience code at the end so that it is easy to import JS objects. + + For example we have a file 'example.js' with: var a = function(x) {return x} + translate_file('example.js', 'example.py') + + Now example.py can be easily importend and used: + >>> from example import example + >>> example.a(30) + 30 + ''' + js = get_file_contents(input_path) + + py_code = translate_js(js) + lib_name = os.path.basename(output_path).split('.')[0] + head = '__all__ = [%s]\n\n# Don\'t look below, you will not understand this Python code :) I don\'t.\n\n' % repr( + lib_name) + tail = '\n\n# Add lib to the module scope\n%s = var.to_python()' % lib_name + out = head + py_code + tail + write_file_contents(output_path, out) + + +def run_file(path_or_file, context=None): + ''' Context must be EvalJS object. Runs given path as a JS program. Returns (eval_value, context). + ''' + if context is None: + context = EvalJs() + if not isinstance(context, EvalJs): + raise TypeError('context must be the instance of EvalJs') + eval_value = context.eval(get_file_contents(path_or_file)) + return eval_value, context + + +def eval_js(js): + """Just like javascript eval. Translates javascript to python, + executes and returns python object. + js is javascript source code + + EXAMPLE: + >>> import js2py + >>> add = js2py.eval_js('function add(a, b) {return a + b}') + >>> add(1, 2) + 3 + 6 + >>> add('1', 2, 3) + u'12' + >>> add.constructor + function Function() { [python code] } + + NOTE: For Js Number, String, Boolean and other base types returns appropriate python BUILTIN type. + For Js functions and objects, returns Python wrapper - basically behaves like normal python object. + If you really want to convert object to python dict you can use to_dict method. + """ + e = EvalJs() + return e.eval(js) + + +def eval_js6(js): + return eval_js(js6_to_js5(js)) + + +def translate_js6(js): + return translate_js(js6_to_js5(js)) + + +class EvalJs(object): + """This class supports continuous execution of javascript under same context. + + >>> js = EvalJs() + >>> js.execute('var a = 10;function f(x) {return x*x};') + >>> js.f(9) + 81 + >>> js.a + 10 + + context is a python dict or object that contains python variables that should be available to JavaScript + For example: + >>> js = EvalJs({'a': 30}) + >>> js.execute('var x = a') + >>> js.x + 30 + + You can run interactive javascript console with console method!""" + + def __init__(self, context={}): + self.__dict__['_context'] = {} + exec (DEFAULT_HEADER, self._context) + self.__dict__['_var'] = self._context['var'].to_python() + if not isinstance(context, dict): + try: + context = context.__dict__ + except: + raise TypeError( + 'context has to be either a dict or have __dict__ attr') + for k, v in six.iteritems(context): + setattr(self._var, k, v) + + def execute(self, js=None, use_compilation_plan=False): + """executes javascript js in current context + + During initial execute() the converted js is cached for re-use. That means next time you + run the same javascript snippet you save many instructions needed to parse and convert the + js code to python code. + + This cache causes minor overhead (a cache dicts is updated) but the Js=>Py conversion process + is typically expensive compared to actually running the generated python code. + + Note that the cache is just a dict, it has no expiration or cleanup so when running this + in automated situations with vast amounts of snippets it might increase memory usage. + """ + try: + cache = self.__dict__['cache'] + except KeyError: + cache = self.__dict__['cache'] = {} + hashkey = hashlib.md5(js.encode('utf-8')).digest() + try: + compiled = cache[hashkey] + except KeyError: + code = translate_js( + js, '', use_compilation_plan=use_compilation_plan) + compiled = cache[hashkey] = compile(code, '<EvalJS snippet>', + 'exec') + exec (compiled, self._context) + + def eval(self, expression, use_compilation_plan=False): + """evaluates expression in current context and returns its value""" + code = 'PyJsEvalResult = eval(%s)' % json.dumps(expression) + self.execute(code, use_compilation_plan=use_compilation_plan) + return self['PyJsEvalResult'] + + def execute_debug(self, js): + """executes javascript js in current context + as opposed to the (faster) self.execute method, you can use your regular debugger + to set breakpoints and inspect the generated python code + """ + code = translate_js(js, '') + # make sure you have a temp folder: + filename = 'temp' + os.sep + '_' + hashlib.md5( + code.encode("utf-8")).hexdigest() + '.py' + try: + with open(filename, mode='w') as f: + f.write(code) + with open(filename, "r") as f: + pyCode = compile(f.read(), filename, 'exec') + exec(pyCode, self._context) + + except Exception as err: + raise err + finally: + os.remove(filename) + try: + os.remove(filename + 'c') + except: + pass + + def eval_debug(self, expression): + """evaluates expression in current context and returns its value + as opposed to the (faster) self.execute method, you can use your regular debugger + to set breakpoints and inspect the generated python code + """ + code = 'PyJsEvalResult = eval(%s)' % json.dumps(expression) + self.execute_debug(code) + return self['PyJsEvalResult'] + + def __getattr__(self, var): + return getattr(self._var, var) + + def __getitem__(self, var): + return getattr(self._var, var) + + def __setattr__(self, var, val): + return setattr(self._var, var, val) + + def __setitem__(self, var, val): + return setattr(self._var, var, val) + + def console(self): + """starts to interact (starts interactive console) Something like code.InteractiveConsole""" + while True: + if six.PY2: + code = raw_input('>>> ') + else: + code = input('>>>') + try: + print(self.eval(code)) + except KeyboardInterrupt: + break + except Exception as e: + import traceback + if DEBUG: + sys.stderr.write(traceback.format_exc()) + else: + sys.stderr.write('EXCEPTION: ' + str(e) + '\n') + time.sleep(0.01) + + +#print x + +if __name__ == '__main__': + #with open('C:\Users\Piotrek\Desktop\esprima.js', 'rb') as f: + # x = f.read() + e = EvalJs() + e.execute('square(x)') + #e.execute(x) + e.console() diff --git a/Contents/Libraries/Shared/js2py/host/__init__.py b/Contents/Libraries/Shared/js2py/host/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/js2py/host/console.py b/Contents/Libraries/Shared/js2py/host/console.py new file mode 100644 index 000000000..50a08632a --- /dev/null +++ b/Contents/Libraries/Shared/js2py/host/console.py @@ -0,0 +1,15 @@ +from ..base import * + +@Js +def console(): + pass + +@Js +def log(): + print(arguments[0]) + +console.put('log', log) +console.put('debug', log) +console.put('info', log) +console.put('warn', log) +console.put('error', log) diff --git a/Contents/Libraries/Shared/js2py/host/dom/__init__.py b/Contents/Libraries/Shared/js2py/host/dom/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/js2py/host/jseval.py b/Contents/Libraries/Shared/js2py/host/jseval.py new file mode 100644 index 000000000..13140d2d5 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/host/jseval.py @@ -0,0 +1,51 @@ +from ..base import * +import inspect +try: + from js2py.translators.translator import translate_js +except: + pass + + +@Js +def Eval(code): + local_scope = inspect.stack()[3][0].f_locals['var'] + global_scope = this.GlobalObject + # todo fix scope - we have to behave differently if called through variable other than eval + # we will use local scope (default) + globals()['var'] = local_scope + try: + py_code = translate_js(code.to_string().value, '') + except SyntaxError as syn_err: + raise MakeError('SyntaxError', str(syn_err)) + lines = py_code.split('\n') + # a simple way to return value from eval. Will not work in complex cases. + has_return = False + for n in xrange(len(lines)): + line = lines[len(lines) - n - 1] + if line.strip(): + if line.startswith(' '): + break + elif line.strip() == 'pass': + continue + elif any( + line.startswith(e) + for e in ['return ', 'continue ', 'break', 'raise ']): + break + else: + has_return = True + cand = 'EVAL_RESULT = (%s)\n' % line + try: + compile(cand, '', 'exec') + except SyntaxError: + break + lines[len(lines) - n - 1] = cand + py_code = '\n'.join(lines) + break + #print py_code + executor(py_code) + if has_return: + return globals()['EVAL_RESULT'] + + +def executor(code): + exec (code, globals()) diff --git a/Contents/Libraries/Shared/js2py/host/jsfunctions.py b/Contents/Libraries/Shared/js2py/host/jsfunctions.py new file mode 100644 index 000000000..2360fee86 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/host/jsfunctions.py @@ -0,0 +1,176 @@ +from ..base import * +from six.moves.urllib.parse import quote, unquote + +RADIX_CHARS = { + '1': 1, + '0': 0, + '3': 3, + '2': 2, + '5': 5, + '4': 4, + '7': 7, + '6': 6, + '9': 9, + '8': 8, + 'a': 10, + 'c': 12, + 'b': 11, + 'e': 14, + 'd': 13, + 'g': 16, + 'f': 15, + 'i': 18, + 'h': 17, + 'k': 20, + 'j': 19, + 'm': 22, + 'l': 21, + 'o': 24, + 'n': 23, + 'q': 26, + 'p': 25, + 's': 28, + 'r': 27, + 'u': 30, + 't': 29, + 'w': 32, + 'v': 31, + 'y': 34, + 'x': 33, + 'z': 35, + 'A': 10, + 'C': 12, + 'B': 11, + 'E': 14, + 'D': 13, + 'G': 16, + 'F': 15, + 'I': 18, + 'H': 17, + 'K': 20, + 'J': 19, + 'M': 22, + 'L': 21, + 'O': 24, + 'N': 23, + 'Q': 26, + 'P': 25, + 'S': 28, + 'R': 27, + 'U': 30, + 'T': 29, + 'W': 32, + 'V': 31, + 'Y': 34, + 'X': 33, + 'Z': 35 +} + + +@Js +def parseInt(string, radix): + string = string.to_string().value.lstrip() + sign = 1 + if string and string[0] in ('+', '-'): + if string[0] == '-': + sign = -1 + string = string[1:] + r = radix.to_int32() + strip_prefix = True + if r: + if r < 2 or r > 36: + return NaN + if r != 16: + strip_prefix = False + else: + r = 10 + if strip_prefix: + if len(string) >= 2 and string[:2] in ('0x', '0X'): + string = string[2:] + r = 16 + n = 0 + num = 0 + while n < len(string): + cand = RADIX_CHARS.get(string[n]) + if cand is None or not cand < r: + break + num = cand + num * r + n += 1 + if not n: + return NaN + return sign * num + + +@Js +def parseFloat(string): + string = string.to_string().value.strip() + sign = 1 + if string and string[0] in ('+', '-'): + if string[0] == '-': + sign = -1 + string = string[1:] + num = None + length = 1 + max_len = None + failed = 0 + while length <= len(string): + try: + num = float(string[:length]) + max_len = length + failed = 0 + except: + failed += 1 + if failed > 4: # cant be a number anymore + break + length += 1 + if num is None: + return NaN + return sign * float(string[:max_len]) + + +@Js +def isNaN(number): + if number.to_number().is_nan(): + return true + return false + + +@Js +def isFinite(number): + num = number.to_number() + if num.is_nan() or num.is_infinity(): + return false + return true + + +# todo test them properly + + +@Js +def escape(text): + return quote(text.to_string().value) + + +@Js +def unescape(text): + return unquote(text.to_string().value) + + +@Js +def encodeURI(text): + return quote(text.to_string().value, safe='~@#$&()*!+=:;,.?/\'') + + +@Js +def decodeURI(text): + return unquote(text.to_string().value) + + +@Js +def encodeURIComponent(text): + return quote(text.to_string().value, safe='~()*!.\'') + + +@Js +def decodeURIComponent(text): + return unquote(text.to_string().value) diff --git a/Contents/Libraries/Shared/js2py/internals/__init__.py b/Contents/Libraries/Shared/js2py/internals/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/js2py/internals/base.py b/Contents/Libraries/Shared/js2py/internals/base.py new file mode 100644 index 000000000..ec277c64d --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/base.py @@ -0,0 +1,925 @@ +from __future__ import unicode_literals +import re + +import datetime + +from desc import * +from simplex import * +from conversions import * +import six +from pyjsparser import PyJsParser +from itertools import izip + +from conversions import * +from simplex import * + + +def Type(obj): + return obj.TYPE + + +# 8.6.2 +class PyJs(object): + TYPE = 'Object' + IS_CONSTRUCTOR = False + + prototype = None + Class = None + extensible = True + value = None + + own = {} + + def get_member(self, unconverted_prop): + return self.get(to_string(unconverted_prop)) + + def put_member(self, unconverted_prop, val): + return self.put(to_string(unconverted_prop), val) + + def get(self, prop): + assert type(prop) == unicode + cand = self.get_property(prop) + if cand is None: + return undefined + if is_data_descriptor(cand): + return cand['value'] + if is_undefined(cand['get']): + return undefined + return cand['get'].call(self) + + def get_own_property(self, prop): + assert type(prop) == unicode + # takes py returns py + return self.own.get(prop) + + def get_property(self, prop): + assert type(prop) == unicode + # take py returns py + cand = self.get_own_property(prop) + if cand: + return cand + if self.prototype is not None: + return self.prototype.get_property(prop) + + def put(self, prop, val, throw=False): + assert type(prop) == unicode + # takes py, returns none + if not self.can_put(prop): + if throw: + raise MakeError('TypeError', 'Could not define own property') + return + own_desc = self.get_own_property(prop) + if is_data_descriptor(own_desc): + self.own[prop]['value'] = val + return + desc = self.get_property(prop) + if is_accessor_descriptor(desc): + desc['set'].call( + self, (val, )) # calling setter on own or inherited element + else: # new property + self.own[prop] = { + 'value': val, + 'writable': True, + 'configurable': True, + 'enumerable': True + } + + def can_put(self, prop): # to check + assert type(prop) == unicode, type(prop) + # takes py returns py + desc = self.get_own_property(prop) + if desc: # if we have this property + if is_accessor_descriptor(desc): + return is_callable( + desc['set']) # Check if setter method is defined + else: # data desc + return desc['writable'] + if self.prototype is None: + return self.extensible + inherited = self.prototype.get_property(prop) + if inherited is None: + return self.extensible + if is_accessor_descriptor(inherited): + return not is_undefined(inherited['set']) + elif self.extensible: + return inherited['writable'] # weird... + return False + + def has_property(self, prop): + assert type(prop) == unicode + # takes py returns Py + return self.get_property(prop) is not None + + def delete(self, prop, throw=False): + assert type(prop) == unicode + # takes py, returns py + desc = self.get_own_property(prop) + if desc is None: + return True + if desc['configurable']: + del self.own[prop] + return True + if throw: + raise MakeError('TypeError', 'Could not define own property') + return False + + def default_value(self, hint=None): + order = ('valueOf', 'toString') + if hint == 'String' or (hint is None and self.Class == 'Date'): + order = ('toString', 'valueOf') + for meth_name in order: + method = self.get(meth_name) + if method is not None and is_callable(method): + cand = method.call(self, ()) + if is_primitive(cand): + return cand + raise MakeError('TypeError', + 'Cannot convert object to primitive value') + + def define_own_property( + self, prop, desc, + throw): # Internal use only. External through Object + assert type(prop) == unicode + # takes Py, returns Py + # prop must be a Py string. Desc is either a descriptor or accessor. + # Messy method - raw translation from Ecma spec to prevent any bugs. # todo check this + current = self.get_own_property(prop) + + extensible = self.extensible + if not current: # We are creating a new OWN property + if not extensible: + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + # extensible must be True + if is_data_descriptor(desc) or is_generic_descriptor(desc): + DEFAULT_DATA_DESC = { + 'value': undefined, # undefined + 'writable': False, + 'enumerable': False, + 'configurable': False + } + DEFAULT_DATA_DESC.update(desc) + self.own[prop] = DEFAULT_DATA_DESC + else: + DEFAULT_ACCESSOR_DESC = { + 'get': undefined, # undefined + 'set': undefined, # undefined + 'enumerable': False, + 'configurable': False + } + DEFAULT_ACCESSOR_DESC.update(desc) + self.own[prop] = DEFAULT_ACCESSOR_DESC + return True + # therefore current exists! + if not desc or desc == current: # We don't need to change anything. + return True + configurable = current['configurable'] + if not configurable: # Prevent changing params + if desc.get('configurable'): + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + if 'enumerable' in desc and desc['enumerable'] != current[ + 'enumerable']: + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + if is_generic_descriptor(desc): + pass + elif is_data_descriptor(current) != is_data_descriptor(desc): + # we want to change the current type of property + if not configurable: + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + if is_data_descriptor(current): # from data to setter + del current['value'] + del current['writable'] + current['set'] = undefined # undefined + current['get'] = undefined # undefined + else: # from setter to data + del current['set'] + del current['get'] + current['value'] = undefined # undefined + current['writable'] = False + elif is_data_descriptor(current) and is_data_descriptor(desc): + if not configurable: + if not current['writable'] and desc.get('writable'): + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + if not current['writable'] and 'value' in desc and current[ + 'value'] != desc['value']: + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + elif is_accessor_descriptor(current) and is_accessor_descriptor(desc): + if not configurable: + if 'set' in desc and desc['set'] != current['set']: + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + if 'get' in desc and desc['get'] != current['get']: + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + current.update(desc) + return True + + def create(self, args, space): + '''Generally not a constructor, raise an error''' + raise MakeError('TypeError', '%s is not a constructor' % self.Class) + + +def get_member( + self, prop, space +): # general member getter, prop has to be unconverted prop. it is it can be any value + typ = type(self) + if typ not in PRIMITIVES: # most likely getter for object + return self.get_member( + prop + ) # <- object can implement this to support faster prop getting. ex array. + elif typ == unicode: # then probably a String + if type(prop) == float and is_finite(prop): + index = int(prop) + if index == prop and 0 <= index < len(self): + return self[index] + s_prop = to_string(prop) + if s_prop == 'length': + return float(len(self)) + elif s_prop.isdigit(): + index = int(s_prop) + if 0 <= index < len(self): + return self[index] + # use standard string prototype + return space.StringPrototype.get(s_prop) + # maybe an index + elif typ == float: + # use standard number prototype + return space.NumberPrototype.get(to_string(prop)) + elif typ == bool: + return space.BooleanPrototype.get(to_string(prop)) + elif typ is UNDEFINED_TYPE: + raise MakeError('TypeError', + "Cannot read property '%s' of undefined" % prop) + elif typ is NULL_TYPE: + raise MakeError('TypeError', + "Cannot read property '%s' of null" % prop) + else: + raise RuntimeError('Unknown type! - ' + repr(typ)) + + +def get_member_dot(self, prop, space): + # dot member getter, prop has to be unicode + typ = type(self) + if typ not in PRIMITIVES: # most likely getter for object + return self.get(prop) + elif typ == unicode: # then probably a String + if prop == 'length': + return float(len(self)) + elif prop.isdigit(): + index = int(prop) + if 0 <= index < len(self): + return self[index] + else: + # use standard string prototype + return space.StringPrototype.get(prop) + # maybe an index + elif typ == float: + # use standard number prototype + return space.NumberPrototype.get(prop) + elif typ == bool: + return space.BooleanPrototype.get(prop) + elif typ in (UNDEFINED_TYPE, NULL_TYPE): + raise MakeError('TypeError', + "Cannot read property '%s' of undefined" % prop) + else: + raise RuntimeError('Unknown type! - ' + repr(typ)) + + +# Object + + +class PyJsObject(PyJs): + TYPE = 'Object' + Class = 'Object' + + def __init__(self, prototype=None): + self.prototype = prototype + self.own = {} + + def _init(self, props, vals): + i = 0 + for prop, kind in props: + if prop in self.own: # just check... probably will not happen very often. + if is_data_descriptor(self.own[prop]): + if kind != 'i': + raise MakeError( + 'SyntaxError', + 'Invalid object initializer! Duplicate property name "%s"' + % prop) + else: + if kind == 'i' or (kind == 'g' and 'get' in self.own[prop] + ) or (kind == 's' + and 'set' in self.own[prop]): + raise MakeError( + 'SyntaxError', + 'Invalid object initializer! Duplicate setter/getter of prop: "%s"' + % prop) + + if kind == 'i': # init + self.own[prop] = { + 'value': vals[i], + 'writable': True, + 'enumerable': True, + 'configurable': True + } + elif kind == 'g': # get + self.define_own_property(prop, { + 'get': vals[i], + 'enumerable': True, + 'configurable': True + }, False) + elif kind == 's': # get + self.define_own_property(prop, { + 'get': vals[i], + 'enumerable': True, + 'configurable': True + }, False) + else: + raise RuntimeError( + 'Invalid property kind - %s. Expected one of i, g, s.' % + repr(kind)) + i += 1 + + def _set_props(self, prop_descs): + for prop, desc in six.iteritems(prop_descs): + self.define_own_property(prop, desc) + + +# Array + + +# todo Optimise Array - extremely slow due to index conversions from str to int and back etc. +# solution - make get and put methods callable with any type of prop and handle conversions from inside +# if not array then use to_string(prop). In array if prop is integer then just use it +# also consider removal of these stupid writable, enumerable etc for ints. +class PyJsArray(PyJs): + Class = 'Array' + + def __init__(self, length, prototype=None): + self.prototype = prototype + self.own = { + 'length': { + 'value': float(length), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + def _init(self, elements): + for i, ele in enumerate(elements): + if ele is None: continue + self.own[unicode(i)] = { + 'value': ele, + 'writable': True, + 'enumerable': True, + 'configurable': True + } + + def put(self, prop, val, throw=False): + assert type(val) != int + # takes py, returns none + if not self.can_put(prop): + if throw: + raise MakeError('TypeError', 'Could not define own property') + return + own_desc = self.get_own_property(prop) + if is_data_descriptor(own_desc): + self.define_own_property(prop, {'value': val}, False) + return + desc = self.get_property(prop) + if is_accessor_descriptor(desc): + desc['set'].call( + self, (val, )) # calling setter on own or inherited element + else: # new property + self.define_own_property( + prop, { + 'value': val, + 'writable': True, + 'configurable': True, + 'enumerable': True + }, False) + + def define_own_property(self, prop, desc, throw): + assert type(desc.get('value')) != int + old_len_desc = self.get_own_property('length') + old_len = old_len_desc['value'] # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc, False) + new_len = to_uint32(desc['value']) + if new_len != to_number(desc['value']): + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = float(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc, False) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc, False): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = old_len + 1. + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property( + self, prop, new_desc, False) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + unicode(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = old_len + 1. + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc, + False) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + + elif prop.isdigit(): + index = to_uint32(prop) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc, False): + return False + if index >= old_len: + old_len_desc['value'] = index + 1. + return True + else: + return PyJs.define_own_property(self, prop, desc, False) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + +# database with compiled patterns. Js pattern -> Py pattern. +REGEXP_DB = {} + + +class PyJsRegExp(PyJs): + Class = 'RegExp' + + def __init__(self, body, flags, prototype=None): + self.prototype = prototype + self.glob = True if 'g' in flags else False + self.ignore_case = re.IGNORECASE if 'i' in flags else 0 + self.multiline = re.MULTILINE if 'm' in flags else 0 + self.value = body + + if (body, flags) in REGEXP_DB: + self.pat = REGEXP_DB[body, flags] + else: + comp = None + try: + # converting JS regexp pattern to Py pattern. + possible_fixes = [(u'[]', u'[\0]'), (u'[^]', u'[^\0]'), + (u'nofix1791', u'nofix1791')] + reg = self.value + for fix, rep in possible_fixes: + comp = PyJsParser()._interpret_regexp(reg, flags) + #print 'reg -> comp', reg, '->', comp + try: + self.pat = re.compile( + comp, self.ignore_case | self.multiline) + #print reg, '->', comp + break + except: + reg = reg.replace(fix, rep) + # print 'Fix', fix, '->', rep, '=', reg + else: + raise Exception() + REGEXP_DB[body, flags] = self.pat + except: + #print 'Invalid pattern...', self.value, comp + raise MakeError( + 'SyntaxError', + 'Invalid RegExp pattern: %s -> %s' % (repr(self.value), + repr(comp))) + # now set own properties: + self.own = { + 'source': { + 'value': self.value, + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'global': { + 'value': self.glob, + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'ignoreCase': { + 'value': bool(self.ignore_case), + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'multiline': { + 'value': bool(self.multiline), + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'lastIndex': { + 'value': 0., + 'enumerable': False, + 'writable': True, + 'configurable': False + } + } + + def match(self, string, pos): + '''string is of course a py string''' + return self.pat.match(string, int(pos)) + + +class PyJsError(PyJs): + Class = 'Error' + extensible = True + + def __init__(self, message=None, prototype=None): + self.prototype = prototype + self.own = {} + if message is not None: + self.put('message', to_string(message)) + self.own['message']['enumerable'] = False + + +class PyJsDate(PyJs): + Class = 'Date' + UTCToLocal = None # todo UTC to local should be imported! + + def __init__(self, value, prototype=None): + self.value = value + self.own = {} + self.prototype = prototype + + # todo fix this problematic datetime part + def to_local_dt(self): + return datetime.datetime.utcfromtimestamp( + self.UTCToLocal(self.value) // 1000) + + def to_utc_dt(self): + return datetime.datetime.utcfromtimestamp(self.value // 1000) + + def local_strftime(self, pattern): + if self.value is NaN: + return 'Invalid Date' + try: + dt = self.to_local_dt() + except: + raise MakeError( + 'TypeError', + 'unsupported date range. Will fix in future versions') + try: + return dt.strftime(pattern) + except: + raise MakeError( + 'TypeError', + 'Could not generate date string from this date (limitations of python.datetime)' + ) + + def utc_strftime(self, pattern): + if self.value is NaN: + return 'Invalid Date' + try: + dt = self.to_utc_dt() + except: + raise MakeError( + 'TypeError', + 'unsupported date range. Will fix in future versions') + try: + return dt.strftime(pattern) + except: + raise MakeError( + 'TypeError', + 'Could not generate date string from this date (limitations of python.datetime)' + ) + + +# Scope class it will hold all the variables accessible to user +class Scope(PyJs): + Class = 'Global' + extensible = True + IS_CHILD_SCOPE = True + THIS_BINDING = None + space = None + exe = None + + # todo speed up! + # in order to speed up this very important class the top scope should behave differently than + # child scopes, child scope should not have this property descriptor thing because they cant be changed anyway + # they are all confugurable= False + + def __init__(self, scope, space, parent=None): + """Doc""" + self.space = space + self.prototype = parent + if type(scope) is not dict: + assert parent is not None, 'You initialised the WITH_SCOPE without a parent scope.' + self.own = scope + self.is_with_scope = True + else: + self.is_with_scope = False + if parent is None: + # global, top level scope + self.own = {} + for k, v in six.iteritems(scope): + # set all the global items + self.define_own_property( + k, { + 'value': v, + 'configurable': False, + 'writable': False, + 'enumerable': False + }, False) + else: + # not global, less powerful but faster closure. + self.own = scope # simple dictionary which maps name directly to js object. + + self.par = super(Scope, self) + self.stack = [] + + def register(self, var): + # registered keeps only global registered variables + if self.prototype is None: + # define in global scope + if var in self.own: + self.own[var]['configurable'] = False + else: + self.define_own_property( + var, { + 'value': undefined, + 'configurable': False, + 'writable': True, + 'enumerable': True + }, False) + elif var not in self.own: + # define in local scope since it has not been defined yet + self.own[var] = undefined # default value + + def registers(self, vars): + """register multiple variables""" + for var in vars: + self.register(var) + + def put(self, var, val, throw=False): + if self.prototype is None: + desc = self.own.get(var) # global scope + if desc is None: + self.par.put(var, val, False) + else: + if desc['writable']: # todo consider getters/setters + desc['value'] = val + else: + if self.is_with_scope: + if self.own.has_property(var): + return self.own.put(var, val, throw=throw) + else: + return self.prototype.put(var, val) + # trying to put in local scope + # we dont know yet in which scope we should place this var + elif var in self.own: + self.own[var] = val + return val + else: + # try to put in the lower scope since we cant put in this one (var wasn't registered) + return self.prototype.put(var, val) + + def get(self, var, throw=False): + if self.prototype is not None: + if self.is_with_scope: + cand = None if not self.own.has_property( + var) else self.own.get(var) + else: + # fast local scope + cand = self.own.get(var) + if cand is None: + return self.prototype.get(var, throw) + return cand + # slow, global scope + if var not in self.own: + # try in ObjectPrototype... + if var in self.space.ObjectPrototype.own: + return self.space.ObjectPrototype.get(var) + if throw: + raise MakeError('ReferenceError', '%s is not defined' % var) + return undefined + cand = self.own[var].get('value') + return cand if cand is not None else self.own[var]['get'].call(self) + + def delete(self, var, throw=False): + if self.prototype is not None: + if self.is_with_scope: + if self.own.has_property(var): + return self.own.delete(var) + elif var in self.own: + return False + return self.prototype.delete(var) + # we are in global scope here. Must exist and be configurable to delete + if var not in self.own: + # this var does not exist, why do you want to delete it??? + return True + if self.own[var]['configurable']: + del self.own[var] + return True + # not configurable, cant delete + return False + + +def get_new_arguments_obj(args, space): + obj = space.NewObject() + obj.Class = 'Arguments' + obj.define_own_property( + 'length', { + 'value': float(len(args)), + 'writable': True, + 'enumerable': False, + 'configurable': True + }, False) + for i, e in enumerate(args): + obj.put(unicode(i), e) + return obj + + +#Function +class PyJsFunction(PyJs): + Class = 'Function' + source = '{ [native code] }' + IS_CONSTRUCTOR = True + + def __init__(self, + code, + ctx, + params, + name, + space, + is_declaration, + definitions, + prototype=None): + self.prototype = prototype + self.own = {} + + self.code = code + if type( + self.code + ) == int: # just a label pointing to the beginning of the code. + self.is_native = False + else: + self.is_native = True # python function + + self.ctx = ctx + + self.params = params + self.arguments_in_params = 'arguments' in params + self.definitions = definitions + + # todo remove this check later + for p in params: + assert p in self.definitions + + self.name = name + self.space = space + self.is_declaration = is_declaration + + #set own property length to the number of arguments + self.own['length'] = { + 'value': float(len(params)), + 'writable': False, + 'enumerable': False, + 'configurable': False + } + + if name: + self.own['name'] = { + 'value': name, + 'writable': False, + 'enumerable': False, + 'configurable': True + } + + if not self.is_native: # set prototype for user defined functions + # constructor points to this function + proto = space.NewObject() + proto.own['constructor'] = { + 'value': self, + 'writable': True, + 'enumerable': False, + 'configurable': True + } + self.own['prototype'] = { + 'value': proto, + 'writable': True, + 'enumerable': False, + 'configurable': False + } + # todo set up throwers on callee and arguments if in strict mode + + def call(self, this, args=()): + ''' Dont use this method from inside bytecode to call other bytecode. ''' + if self.is_native: + _args = SpaceTuple( + args + ) # we have to do that unfortunately to pass all the necessary info to the funcs + _args.space = self.space + return self.code( + this, _args + ) # must return valid js object - undefined, null, float, unicode, bool, or PyJs + else: + return self.space.exe._call(self, this, + args) # will run inside bytecode + + def has_instance(self, other): + # I am not sure here so instanceof may not work lol. + if not is_object(other): + return False + proto = self.get('prototype') + if not is_object(proto): + raise MakeError( + 'TypeError', + 'Function has non-object prototype in instanceof check') + while True: + other = other.prototype + if not other: # todo make sure that the condition is not None or null + return False + if other is proto: + return True + + def create(self, args, space): + proto = self.get('prototype') + if not is_object(proto): + proto = space.ObjectPrototype + new = PyJsObject(prototype=proto) + res = self.call(new, args) + if is_object(res): + return res + return new + + def _generate_my_context(self, this, args): + my_ctx = Scope( + dict(izip(self.params, args)), self.space, parent=self.ctx) + my_ctx.registers(self.definitions) + my_ctx.THIS_BINDING = this + if not self.arguments_in_params: + my_ctx.own['arguments'] = get_new_arguments_obj(args, self.space) + if not self.is_declaration and self.name and self.name not in my_ctx.own: + my_ctx.own[ + self. + name] = self # this should be immutable binding but come on! + return my_ctx + + +class SpaceTuple: + def __init__(self, tup): + self.tup = tup + + def __len__(self): + return len(self.tup) + + def __getitem__(self, item): + return self.tup[item] + + def __iter__(self): + return iter(self.tup) diff --git a/Contents/Libraries/Shared/js2py/internals/byte_trans.py b/Contents/Libraries/Shared/js2py/internals/byte_trans.py new file mode 100644 index 000000000..87fab4b4e --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/byte_trans.py @@ -0,0 +1,752 @@ +from code import Code +from simplex import MakeError +from opcodes import * +from operations import * +from trans_utils import * + +SPECIAL_IDENTIFIERS = {'true', 'false', 'this'} + + +class ByteCodeGenerator: + def __init__(self, exe): + self.exe = exe + + self.declared_continue_labels = {} + self.declared_break_labels = {} + + self.implicit_breaks = [] + self.implicit_continues = [] + + self.declared_vars = [] + + self.function_declaration_tape = [] + + self.states = [] + + def record_state(self): + self.states.append( + (self.declared_continue_labels, self.declared_break_labels, + self.implicit_breaks, self.implicit_continues, self.declared_vars, + self.function_declaration_tape)) + self.declared_continue_labels, self.declared_break_labels, \ + self.implicit_breaks, self.implicit_continues, \ + self.declared_vars, self.function_declaration_tape = {}, {}, [], [], [], [] + + def restore_state(self): + self.declared_continue_labels, self.declared_break_labels, \ + self.implicit_breaks, self.implicit_continues, \ + self.declared_vars, self.function_declaration_tape = self.states.pop() + + def ArrayExpression(self, elements, **kwargs): + for e in elements: + if e is None: + self.emit('LOAD_NONE') + else: + self.emit(e) + self.emit('LOAD_ARRAY', len(elements)) + + def AssignmentExpression(self, operator, left, right, **kwargs): + operator = operator[:-1] + if left['type'] == 'MemberExpression': + self.emit(left['object']) + if left['computed']: + self.emit(left['property']) + self.emit(right) + if operator: + self.emit('STORE_MEMBER_OP', operator) + else: + self.emit('STORE_MEMBER') + else: + self.emit(right) + if operator: + self.emit('STORE_MEMBER_DOT_OP', left['property']['name'], + operator) + else: + self.emit('STORE_MEMBER_DOT', left['property']['name']) + elif left['type'] == 'Identifier': + if left['name'] in SPECIAL_IDENTIFIERS: + raise MakeError('SyntaxError', + 'Invalid left-hand side in assignment') + self.emit(right) + if operator: + self.emit('STORE_OP', left['name'], operator) + else: + self.emit('STORE', left['name']) + else: + raise MakeError('SyntaxError', + 'Invalid left-hand side in assignment') + + def BinaryExpression(self, operator, left, right, **kwargs): + self.emit(left) + self.emit(right) + self.emit('BINARY_OP', operator) + + def BlockStatement(self, body, **kwargs): + self._emit_statement_list(body) + + def BreakStatement(self, label, **kwargs): + if label is None: + self.emit('JUMP', self.implicit_breaks[-1]) + else: + label = label.get('name') + if label not in self.declared_break_labels: + raise MakeError('SyntaxError', + 'Undefined label \'%s\'' % label) + else: + self.emit('JUMP', self.declared_break_labels[label]) + + def CallExpression(self, callee, arguments, **kwargs): + if callee['type'] == 'MemberExpression': + self.emit(callee['object']) + if callee['computed']: + self.emit(callee['property']) + if arguments: + for e in arguments: + self.emit(e) + self.emit('LOAD_N_TUPLE', len(arguments)) + self.emit('CALL_METHOD') + else: + self.emit('CALL_METHOD_NO_ARGS') + else: + prop_name = to_key(callee['property']) + if arguments: + for e in arguments: + self.emit(e) + self.emit('LOAD_N_TUPLE', len(arguments)) + self.emit('CALL_METHOD_DOT', prop_name) + else: + self.emit('CALL_METHOD_DOT_NO_ARGS', prop_name) + else: + self.emit(callee) + if arguments: + for e in arguments: + self.emit(e) + self.emit('LOAD_N_TUPLE', len(arguments)) + self.emit('CALL') + else: + self.emit('CALL_NO_ARGS') + + def ClassBody(self, body, **kwargs): + raise NotImplementedError('Not available in ECMA 5.1') + + def ClassDeclaration(self, id, superClass, body, **kwargs): + raise NotImplementedError('Not available in ECMA 5.1') + + def ClassExpression(self, id, superClass, body, **kwargs): + raise NotImplementedError('Classes not available in ECMA 5.1') + + def ConditionalExpression(self, test, consequent, alternate, **kwargs): + alt = self.exe.get_new_label() + end = self.exe.get_new_label() + # ? + self.emit(test) + self.emit('JUMP_IF_FALSE', alt) + # first val + self.emit(consequent) + self.emit('JUMP', end) + # second val + self.emit('LABEL', alt) + self.emit(alternate) + # end of ?: statement + self.emit('LABEL', end) + + def ContinueStatement(self, label, **kwargs): + if label is None: + self.emit('JUMP', self.implicit_continues[-1]) + else: + label = label.get('name') + if label not in self.declared_continue_labels: + raise MakeError('SyntaxError', + 'Undefined label \'%s\'' % label) + else: + self.emit('JUMP', self.declared_continue_labels[label]) + + def DebuggerStatement(self, **kwargs): + self.EmptyStatement(**kwargs) + + def DoWhileStatement(self, body, test, **kwargs): + continue_label = self.exe.get_new_label() + break_label = self.exe.get_new_label() + initial_do = self.exe.get_new_label() + + self.emit('JUMP', initial_do) + self.emit('LABEL', continue_label) + self.emit(test) + self.emit('JUMP_IF_FALSE', break_label) + self.emit('LABEL', initial_do) + + # translate the body, remember to add and afterwards remove implicit break/continue labels + + self.implicit_continues.append(continue_label) + self.implicit_breaks.append(break_label) + self.emit(body) + self.implicit_continues.pop() + self.implicit_breaks.pop() + + self.emit('JUMP', continue_label) # loop back + self.emit('LABEL', break_label) + + def EmptyStatement(self, **kwargs): + # do nothing + pass + + def ExpressionStatement(self, expression, **kwargs): + # change the final stack value + # pop the previous value and execute expression + self.emit('POP') + self.emit(expression) + + def ForStatement(self, init, test, update, body, **kwargs): + continue_label = self.exe.get_new_label() + break_label = self.exe.get_new_label() + first_start = self.exe.get_new_label() + + if init is not None: + self.emit(init) + if init['type'] != 'VariableDeclaration': + self.emit('POP') + + # skip first update and go straight to test + self.emit('JUMP', first_start) + + self.emit('LABEL', continue_label) + if update: + self.emit(update) + self.emit('POP') + self.emit('LABEL', first_start) + if test: + self.emit(test) + self.emit('JUMP_IF_FALSE', break_label) + + # translate the body, remember to add and afterwards to remove implicit break/continue labels + + self.implicit_continues.append(continue_label) + self.implicit_breaks.append(break_label) + self.emit(body) + self.implicit_continues.pop() + self.implicit_breaks.pop() + + self.emit('JUMP', continue_label) # loop back + self.emit('LABEL', break_label) + + def ForInStatement(self, left, right, body, **kwargs): + # prepare the needed labels + body_start_label = self.exe.get_new_label() + continue_label = self.exe.get_new_label() + break_label = self.exe.get_new_label() + + # prepare the name + if left['type'] == 'VariableDeclaration': + if len(left['declarations']) != 1: + raise MakeError( + 'SyntaxError', + ' Invalid left-hand side in for-in loop: Must have a single binding.' + ) + self.emit(left) + name = left['declarations'][0]['id']['name'] + elif left['type'] == 'Identifier': + name = left['name'] + else: + raise MakeError('SyntaxError', + 'Invalid left-hand side in for-loop') + + # prepare the iterable + self.emit(right) + + # emit ForIn Opcode + self.emit('FOR_IN', name, body_start_label, continue_label, + break_label) + + # a special continue position + self.emit('LABEL', continue_label) + self.emit('NOP') + + self.emit('LABEL', body_start_label) + self.implicit_continues.append(continue_label) + self.implicit_breaks.append(break_label) + self.emit('LOAD_UNDEFINED') + self.emit(body) + self.implicit_continues.pop() + self.implicit_breaks.pop() + self.emit('NOP') + self.emit('LABEL', break_label) + self.emit('NOP') + + def FunctionDeclaration(self, id, params, defaults, body, **kwargs): + if defaults: + raise NotImplementedError('Defaults not available in ECMA 5.1') + + # compile function + self.record_state( + ) # cleans translator state and appends it to the stack so that it can be later restored + function_start = self.exe.get_new_label() + function_declarations = self.exe.get_new_label() + declarations_done = self.exe.get_new_label( + ) # put jump to this place at the and of function tape! + function_end = self.exe.get_new_label() + + # skip the function if encountered externally + self.emit('JUMP', function_end) + + self.emit('LABEL', function_start) + # call is made with empty stack so load undefined to fill it + self.emit('LOAD_UNDEFINED') + # declare all functions + self.emit('JUMP', function_declarations) + self.emit('LABEL', declarations_done) + self.function_declaration_tape.append(LABEL(function_declarations)) + + self.emit(body) + self.ReturnStatement(None) + + self.function_declaration_tape.append(JUMP(declarations_done)) + self.exe.tape.extend(self.function_declaration_tape) + + self.emit('LABEL', function_end) + declared_vars = self.declared_vars + self.restore_state() + + # create function object and append to stack + name = id.get('name') + assert name is not None + self.declared_vars.append(name) + self.function_declaration_tape.append( + LOAD_FUNCTION(function_start, tuple(p['name'] for p in params), + name, True, tuple(declared_vars))) + self.function_declaration_tape.append(STORE(name)) + self.function_declaration_tape.append(POP()) + + def FunctionExpression(self, id, params, defaults, body, **kwargs): + if defaults: + raise NotImplementedError('Defaults not available in ECMA 5.1') + + # compile function + self.record_state( + ) # cleans translator state and appends it to the stack so that it can be later restored + function_start = self.exe.get_new_label() + function_declarations = self.exe.get_new_label() + declarations_done = self.exe.get_new_label( + ) # put jump to this place at the and of function tape! + function_end = self.exe.get_new_label() + + # skip the function if encountered externally + self.emit('JUMP', function_end) + + self.emit('LABEL', function_start) + # call is made with empty stack so load undefined to fill it + self.emit('LOAD_UNDEFINED') + # declare all functions + self.emit('JUMP', function_declarations) + self.emit('LABEL', declarations_done) + self.function_declaration_tape.append(LABEL(function_declarations)) + + self.emit(body) + self.ReturnStatement(None) + + self.function_declaration_tape.append(JUMP(declarations_done)) + self.exe.tape.extend(self.function_declaration_tape) + + self.emit('LABEL', function_end) + declared_vars = self.declared_vars + self.restore_state() + + # create function object and append to stack + name = id.get('name') if id else None + self.emit('LOAD_FUNCTION', function_start, + tuple(p['name'] for p in params), name, False, + tuple(declared_vars)) + + def Identifier(self, name, **kwargs): + if name == 'true': + self.emit('LOAD_BOOLEAN', 1) + elif name == 'false': + self.emit('LOAD_BOOLEAN', 0) + elif name == 'undefined': + self.emit('LOAD_UNDEFINED') + else: + self.emit('LOAD', name) + + def IfStatement(self, test, consequent, alternate, **kwargs): + alt = self.exe.get_new_label() + end = self.exe.get_new_label() + # if + self.emit(test) + self.emit('JUMP_IF_FALSE', alt) + # consequent + self.emit(consequent) + self.emit('JUMP', end) + # alternate + self.emit('LABEL', alt) + if alternate is not None: + self.emit(alternate) + # end of if statement + self.emit('LABEL', end) + + def LabeledStatement(self, label, body, **kwargs): + label = label['name'] + if body['type'] in ('WhileStatement', 'DoWhileStatement', + 'ForStatement', 'ForInStatement'): + # Continue label available... Simply take labels defined by the loop. + # It is important that they request continue label first + self.declared_continue_labels[label] = self.exe._label_count + 1 + self.declared_break_labels[label] = self.exe._label_count + 2 + self.emit(body) + del self.declared_break_labels[label] + del self.declared_continue_labels[label] + else: + # only break label available + lbl = self.exe.get_new_label() + self.declared_break_labels[label] = lbl + self.emit(body) + self.emit('LABEL', lbl) + del self.declared_break_labels[label] + + def Literal(self, value, **kwargs): + if value is None: + self.emit('LOAD_NULL') + elif isinstance(value, bool): + self.emit('LOAD_BOOLEAN', int(value)) + elif isinstance(value, basestring): + self.emit('LOAD_STRING', unicode(value)) + elif isinstance(value, (float, int, long)): + self.emit('LOAD_NUMBER', float(value)) + elif isinstance(value, tuple): + self.emit('LOAD_REGEXP', *value) + else: + raise RuntimeError('Unsupported literal') + + def LogicalExpression(self, left, right, operator, **kwargs): + end = self.exe.get_new_label() + if operator == '&&': + # AND + self.emit(left) + self.emit('JUMP_IF_FALSE_WITHOUT_POP', end) + self.emit('POP') + self.emit(right) + self.emit('LABEL', end) + elif operator == '||': + # OR + self.emit(left) + self.emit('JUMP_IF_TRUE_WITHOUT_POP', end) + self.emit('POP') + self.emit(right) + self.emit('LABEL', end) + else: + raise RuntimeError("Unknown logical expression: %s" % operator) + + def MemberExpression(self, computed, object, property, **kwargs): + if computed: + self.emit(object) + self.emit(property) + self.emit('LOAD_MEMBER') + else: + self.emit(object) + self.emit('LOAD_MEMBER_DOT', property['name']) + + def NewExpression(self, callee, arguments, **kwargs): + self.emit(callee) + if arguments: + n = len(arguments) + for e in arguments: + self.emit(e) + self.emit('LOAD_N_TUPLE', n) + self.emit('NEW') + else: + self.emit('NEW_NO_ARGS') + + def ObjectExpression(self, properties, **kwargs): + data = [] + for prop in properties: + self.emit(prop['value']) + if prop['computed']: + raise NotImplementedError( + 'ECMA 5.1 does not support computed object properties!') + data.append((to_key(prop['key']), prop['kind'][0])) + self.emit('LOAD_OBJECT', tuple(data)) + + def Program(self, body, **kwargs): + self.emit('LOAD_UNDEFINED') + self.emit(body) + # add function tape ! + self.exe.tape = self.function_declaration_tape + self.exe.tape + + def Pyimport(self, imp, **kwargs): + raise NotImplementedError( + 'Not available for bytecode interpreter yet, use the Js2Py translator.' + ) + + def Property(self, kind, key, computed, value, method, shorthand, + **kwargs): + raise NotImplementedError('Not available in ECMA 5.1') + + def RestElement(self, argument, **kwargs): + raise NotImplementedError('Not available in ECMA 5.1') + + def ReturnStatement(self, argument, **kwargs): + self.emit('POP') # pop result of expression statements + if argument is None: + self.emit('LOAD_UNDEFINED') + else: + self.emit(argument) + self.emit('RETURN') + + def SequenceExpression(self, expressions, **kwargs): + for e in expressions: + self.emit(e) + self.emit('POP') + del self.exe.tape[-1] + + def SwitchCase(self, test, consequent, **kwargs): + raise NotImplementedError('Already implemented in SwitchStatement') + + def SwitchStatement(self, discriminant, cases, **kwargs): + self.emit(discriminant) + labels = [self.exe.get_new_label() for case in cases] + tests = [case['test'] for case in cases] + consequents = [case['consequent'] for case in cases] + end_of_switch = self.exe.get_new_label() + + # translate test cases + for test, label in zip(tests, labels): + if test is not None: + self.emit(test) + self.emit('JUMP_IF_EQ', label) + else: + self.emit('POP') + self.emit('JUMP', label) + # this will be executed if none of the cases worked + self.emit('POP') + self.emit('JUMP', end_of_switch) + + # translate consequents + self.implicit_breaks.append(end_of_switch) + for consequent, label in zip(consequents, labels): + self.emit('LABEL', label) + self._emit_statement_list(consequent) + self.implicit_breaks.pop() + + self.emit('LABEL', end_of_switch) + + def ThisExpression(self, **kwargs): + self.emit('LOAD_THIS') + + def ThrowStatement(self, argument, **kwargs): + # throw with the empty stack + self.emit('POP') + self.emit(argument) + self.emit('THROW') + + def TryStatement(self, block, handler, finalizer, **kwargs): + try_label = self.exe.get_new_label() + catch_label = self.exe.get_new_label() + finally_label = self.exe.get_new_label() + end_label = self.exe.get_new_label() + + self.emit('JUMP', end_label) + + # try block + self.emit('LABEL', try_label) + self.emit('LOAD_UNDEFINED') + self.emit(block) + self.emit( + 'NOP' + ) # needed to distinguish from break/continue vs some internal jumps + + # catch block + self.emit('LABEL', catch_label) + self.emit('LOAD_UNDEFINED') + if handler: + self.emit(handler['body']) + self.emit('NOP') + + # finally block + self.emit('LABEL', finally_label) + self.emit('LOAD_UNDEFINED') + if finalizer: + self.emit(finalizer) + self.emit('NOP') + + self.emit('LABEL', end_label) + + # give life to the code + self.emit('TRY_CATCH_FINALLY', try_label, catch_label, + handler['param']['name'] if handler else None, finally_label, + bool(finalizer), end_label) + + def UnaryExpression(self, operator, argument, **kwargs): + if operator == 'typeof' and argument[ + 'type'] == 'Identifier': # todo fix typeof + self.emit('TYPEOF', argument['name']) + elif operator == 'delete': + if argument['type'] == 'MemberExpression': + self.emit(argument['object']) + if argument['property']['type'] == 'Identifier': + self.emit('LOAD_STRING', + unicode(argument['property']['name'])) + else: + self.emit(argument['property']) + self.emit('DELETE_MEMBER') + elif argument['type'] == 'Identifier': + self.emit('DELETE', argument['name']) + else: + self.emit('LOAD_BOOLEAN', 1) + elif operator in UNARY_OPERATIONS: + self.emit(argument) + self.emit('UNARY_OP', operator) + else: + raise MakeError('SyntaxError', + 'Unknown unary operator %s' % operator) + + def UpdateExpression(self, operator, argument, prefix, **kwargs): + incr = int(operator == "++") + post = int(not prefix) + if argument['type'] == 'MemberExpression': + if argument['computed']: + self.emit(argument['object']) + self.emit(argument['property']) + self.emit('POSTFIX_MEMBER', post, incr) + else: + self.emit(argument['object']) + name = to_key(argument['property']) + self.emit('POSTFIX_MEMBER_DOT', post, incr, name) + elif argument['type'] == 'Identifier': + name = to_key(argument) + self.emit('POSTFIX', post, incr, name) + else: + raise MakeError('SyntaxError', + 'Invalid left-hand side in assignment') + + def VariableDeclaration(self, declarations, kind, **kwargs): + if kind != 'var': + raise NotImplementedError( + 'Only var variable declaration is supported by ECMA 5.1') + for d in declarations: + self.emit(d) + + def LexicalDeclaration(self, declarations, kind, **kwargs): + raise NotImplementedError('Not supported by ECMA 5.1') + + def VariableDeclarator(self, id, init, **kwargs): + name = id['name'] + if name in SPECIAL_IDENTIFIERS: + raise MakeError('Invalid left-hand side in assignment') + self.declared_vars.append(name) + if init is not None: + self.emit(init) + self.emit('STORE', name) + self.emit('POP') + + def WhileStatement(self, test, body, **kwargs): + continue_label = self.exe.get_new_label() + break_label = self.exe.get_new_label() + + self.emit('LABEL', continue_label) + self.emit(test) + self.emit('JUMP_IF_FALSE', break_label) + + # translate the body, remember to add and afterwards remove implicit break/continue labels + + self.implicit_continues.append(continue_label) + self.implicit_breaks.append(break_label) + self.emit(body) + self.implicit_continues.pop() + self.implicit_breaks.pop() + + self.emit('JUMP', continue_label) # loop back + self.emit('LABEL', break_label) + + def WithStatement(self, object, body, **kwargs): + beg_label = self.exe.get_new_label() + end_label = self.exe.get_new_label() + # scope + self.emit(object) + + # now the body + self.emit('JUMP', end_label) + self.emit('LABEL', beg_label) + self.emit('LOAD_UNDEFINED') + self.emit(body) + self.emit('NOP') + self.emit('LABEL', end_label) + + # with statement implementation + self.emit('WITH', beg_label, end_label) + + def _emit_statement_list(self, statements): + for statement in statements: + self.emit(statement) + + def emit(self, what, *args): + ''' what can be either name of the op, or node, or a list of statements.''' + if isinstance(what, basestring): + return self.exe.emit(what, *args) + elif isinstance(what, list): + self._emit_statement_list(what) + else: + return getattr(self, what['type'])(**what) + + +import os, codecs + + +def path_as_local(path): + if os.path.isabs(path): + return path + # relative to cwd + return os.path.join(os.getcwd(), path) + + +def get_file_contents(path_or_file): + if hasattr(path_or_file, 'read'): + js = path_or_file.read() + else: + with codecs.open(path_as_local(path_or_file), "r", "utf-8") as f: + js = f.read() + return js + + +def main(): + from space import Space + import fill_space + + from pyjsparser import parse + import json + a = ByteCodeGenerator(Code()) + + s = Space() + fill_space.fill_space(s, a) + + a.exe.space = s + s.exe = a.exe + con = get_file_contents('internals/esprima.js') + d = parse(con + ( + ''';JSON.stringify(exports.parse(%s), 4, 4)''' % json.dumps(con))) + # d = parse(''' + # function x(n) { + # log(n) + # return x(n+1) + # } + # x(0) + # ''') + + # var v = 333333; + # while (v) { + # v-- + # + # } + a.emit(d) + print a.declared_vars + print a.exe.tape + print len(a.exe.tape) + + a.exe.compile() + + def log(this, args): + print args[0] + return 999 + + print a.exe.run(a.exe.space.GlobalObj) + + +if __name__ == '__main__': + main() diff --git a/Contents/Libraries/Shared/js2py/internals/code.py b/Contents/Libraries/Shared/js2py/internals/code.py new file mode 100644 index 000000000..6bd6739fd --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/code.py @@ -0,0 +1,197 @@ +from opcodes import * +from space import * +from base import * + + +class Code: + '''Can generate, store and run sequence of ops representing js code''' + + def __init__(self, is_strict=False): + self.tape = [] + self.compiled = False + self.label_locs = None + self.is_strict = is_strict + + self.contexts = [] + self.current_ctx = None + self.return_locs = [] + self._label_count = 0 + self.label_locs = None + + # useful references + self.GLOBAL_THIS = None + self.space = None + + def get_new_label(self): + self._label_count += 1 + return self._label_count + + def emit(self, op_code, *args): + ''' Adds op_code with specified args to tape ''' + self.tape.append(OP_CODES[op_code](*args)) + + def compile(self, start_loc=0): + ''' Records locations of labels and compiles the code ''' + self.label_locs = {} if self.label_locs is None else self.label_locs + loc = start_loc + while loc < len(self.tape): + if type(self.tape[loc]) == LABEL: + self.label_locs[self.tape[loc].num] = loc + del self.tape[loc] + continue + loc += 1 + self.compiled = True + + def _call(self, func, this, args): + ''' Calls a bytecode function func + NOTE: use !ONLY! when calling functions from native methods! ''' + assert not func.is_native + # fake call - the the runner to return to the end of the file + old_contexts = self.contexts + old_return_locs = self.return_locs + old_curr_ctx = self.current_ctx + + self.contexts = [FakeCtx()] + self.return_locs = [len(self.tape)] # target line after return + + # prepare my ctx + my_ctx = func._generate_my_context(this, args) + self.current_ctx = my_ctx + + # execute dunction + ret = self.run(my_ctx, starting_loc=self.label_locs[func.code]) + + # bring back old execution + self.current_ctx = old_curr_ctx + self.contexts = old_contexts + self.return_locs = old_return_locs + + return ret + + def execute_fragment_under_context(self, ctx, start_label, end_label): + ''' just like run but returns if moved outside of the specified fragment + # 4 different exectution results + # 0=normal, 1=return, 2=jump_outside, 3=errors + # execute_fragment_under_context returns: + # (return_value, typ, return_value/jump_loc/py_error) + # ctx.stack must be len 1 and its always empty after the call. + ''' + old_curr_ctx = self.current_ctx + try: + self.current_ctx = ctx + return self._execute_fragment_under_context( + ctx, start_label, end_label) + except JsException as err: + # undo the things that were put on the stack (if any) + # don't worry, I know the recovery is possible through try statement and for this reason try statement + # has its own context and stack so it will not delete the contents of the outer stack + del ctx.stack[:] + return undefined, 3, err + finally: + self.current_ctx = old_curr_ctx + + def _execute_fragment_under_context(self, ctx, start_label, end_label): + start, end = self.label_locs[start_label], self.label_locs[end_label] + initial_len = len(ctx.stack) + loc = start + entry_level = len(self.contexts) + # for e in self.tape[start:end]: + # print e + + while loc < len(self.tape): + #print loc, self.tape[loc] + if len(self.contexts) == entry_level and loc >= end: + assert loc == end + assert len(ctx.stack) == ( + 1 + initial_len), 'Stack change must be equal to +1!' + return ctx.stack.pop(), 0, None # means normal return + + # execute instruction + status = self.tape[loc].eval(ctx) + + # check status for special actions + if status is not None: + if type(status) == int: # jump to label + loc = self.label_locs[status] + if len(self.contexts) == entry_level: + # check if jumped outside of the fragment and break if so + if not start <= loc < end: + assert len(ctx.stack) == ( + 1 + initial_len + ), 'Stack change must be equal to +1!' + return ctx.stack.pop(), 2, status # jump outside + continue + + elif len(status) == 2: # a call or a return! + # call: (new_ctx, func_loc_label_num) + if status[0] is not None: + # append old state to the stack + self.contexts.append(ctx) + self.return_locs.append(loc + 1) + # set new state + loc = self.label_locs[status[1]] + ctx = status[0] + self.current_ctx = ctx + continue + + # return: (None, None) + else: + if len(self.contexts) == entry_level: + assert len(ctx.stack) == 1 + initial_len + return undefined, 1, ctx.stack.pop( + ) # return signal + return_value = ctx.stack.pop() + ctx = self.contexts.pop() + self.current_ctx = ctx + ctx.stack.append(return_value) + + loc = self.return_locs.pop() + continue + # next instruction + loc += 1 + assert False, 'Remember to add NOP at the end!' + + def run(self, ctx, starting_loc=0): + loc = starting_loc + self.current_ctx = ctx + while loc < len(self.tape): + # execute instruction + #print loc, self.tape[loc] + status = self.tape[loc].eval(ctx) + + # check status for special actions + if status is not None: + if type(status) == int: # jump to label + loc = self.label_locs[status] + continue + + elif len(status) == 2: # a call or a return! + # call: (new_ctx, func_loc_label_num) + if status[0] is not None: + # append old state to the stack + self.contexts.append(ctx) + self.return_locs.append(loc + 1) + # set new state + loc = self.label_locs[status[1]] + ctx = status[0] + self.current_ctx = ctx + continue + + # return: (None, None) + else: + return_value = ctx.stack.pop() + ctx = self.contexts.pop() + self.current_ctx = ctx + ctx.stack.append(return_value) + + loc = self.return_locs.pop() + continue + # next instruction + loc += 1 + assert len(ctx.stack) == 1, ctx.stack + return ctx.stack.pop() + + +class FakeCtx(object): + def __init__(self): + self.stack = [] diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/__init__.py b/Contents/Libraries/Shared/js2py/internals/constructors/__init__.py new file mode 100644 index 000000000..4bf956237 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/__init__.py @@ -0,0 +1 @@ +__author__ = 'Piotr Dabkowski' \ No newline at end of file diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsarray.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsarray.py new file mode 100644 index 000000000..23364ce48 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsarray.py @@ -0,0 +1,28 @@ +from ..conversions import * +from ..func_utils import * + + +def Array(this, args): + return ArrayConstructor(args, args.space) + + +def ArrayConstructor(args, space): + if len(args) == 1: + l = get_arg(args, 0) + if type(l) == float: + if to_uint32(l) == l: + return space.NewArray(l) + else: + raise MakeError( + 'RangeError', + 'Invalid length specified for Array constructor (must be uint32)' + ) + else: + return space.ConstructArray([l]) + else: + return space.ConstructArray(list(args)) + + +def isArray(this, args): + x = get_arg(args, 0) + return is_object(x) and x.Class == u'Array' diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsboolean.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsboolean.py new file mode 100644 index 000000000..17025d9f5 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsboolean.py @@ -0,0 +1,14 @@ +from ..conversions import * +from ..func_utils import * + + +def Boolean(this, args): + return to_boolean(get_arg(args, 0)) + + +def BooleanConstructor(args, space): + temp = space.NewObject() + temp.prototype = space.BooleanPrototype + temp.Class = 'Boolean' + temp.value = to_boolean(get_arg(args, 0)) + return temp diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsconsole.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsconsole.py new file mode 100644 index 000000000..6840ba708 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsconsole.py @@ -0,0 +1,11 @@ +from __future__ import unicode_literals + +from js2py.internals.conversions import * +from js2py.internals.func_utils import * + + +class ConsoleMethods: + def log(this, args): + x = ' '.join(to_string(e) for e in args) + print(x) + return undefined diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsdate.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsdate.py new file mode 100644 index 000000000..98de64319 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsdate.py @@ -0,0 +1,405 @@ +from ..base import * +from .time_helpers import * + +TZ_OFFSET = (time.altzone // 3600) +ABS_OFFSET = abs(TZ_OFFSET) +TZ_NAME = time.tzname[1] +ISO_FORMAT = '%s-%s-%sT%s:%s:%s.%sZ' + + +@Js +def Date(year, month, date, hours, minutes, seconds, ms): + return now().to_string() + + +Date.Class = 'Date' + + +def now(): + return PyJsDate(int(time.time() * 1000), prototype=DatePrototype) + + +@Js +def UTC(year, month, date, hours, minutes, seconds, ms): # todo complete this + args = arguments + y = args[0].to_number() + m = args[1].to_number() + l = len(args) + dt = args[2].to_number() if l > 2 else Js(1) + h = args[3].to_number() if l > 3 else Js(0) + mi = args[4].to_number() if l > 4 else Js(0) + sec = args[5].to_number() if l > 5 else Js(0) + mili = args[6].to_number() if l > 6 else Js(0) + if not y.is_nan() and 0 <= y.value <= 99: + y = y + Js(1900) + t = TimeClip(MakeDate(MakeDay(y, m, dt), MakeTime(h, mi, sec, mili))) + return PyJsDate(t, prototype=DatePrototype) + + +@Js +def parse(string): + return PyJsDate( + TimeClip(parse_date(string.to_string().value)), + prototype=DatePrototype) + + +Date.define_own_property('now', { + 'value': Js(now), + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + +Date.define_own_property('parse', { + 'value': parse, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + +Date.define_own_property('UTC', { + 'value': UTC, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + + +class PyJsDate(PyJs): + Class = 'Date' + extensible = True + + def __init__(self, value, prototype=None): + self.value = value + self.own = {} + self.prototype = prototype + + # todo fix this problematic datetime part + def to_local_dt(self): + return datetime.datetime.utcfromtimestamp( + UTCToLocal(self.value) // 1000) + + def to_utc_dt(self): + return datetime.datetime.utcfromtimestamp(self.value // 1000) + + def local_strftime(self, pattern): + if self.value is NaN: + return 'Invalid Date' + try: + dt = self.to_local_dt() + except: + raise MakeError( + 'TypeError', + 'unsupported date range. Will fix in future versions') + try: + return dt.strftime(pattern) + except: + raise MakeError( + 'TypeError', + 'Could not generate date string from this date (limitations of python.datetime)' + ) + + def utc_strftime(self, pattern): + if self.value is NaN: + return 'Invalid Date' + try: + dt = self.to_utc_dt() + except: + raise MakeError( + 'TypeError', + 'unsupported date range. Will fix in future versions') + try: + return dt.strftime(pattern) + except: + raise MakeError( + 'TypeError', + 'Could not generate date string from this date (limitations of python.datetime)' + ) + + +def parse_date(py_string): # todo support all date string formats + try: + try: + dt = datetime.datetime.strptime(py_string, "%Y-%m-%dT%H:%M:%S.%fZ") + except: + dt = datetime.datetime.strptime(py_string, "%Y-%m-%dT%H:%M:%SZ") + return MakeDate( + MakeDay(Js(dt.year), Js(dt.month - 1), Js(dt.day)), + MakeTime( + Js(dt.hour), Js(dt.minute), Js(dt.second), + Js(dt.microsecond // 1000))) + except: + raise MakeError( + 'TypeError', + 'Could not parse date %s - unsupported date format. Currently only supported format is RFC3339 utc. Sorry!' + % py_string) + + +def date_constructor(*args): + if len(args) >= 2: + return date_constructor2(*args) + elif len(args) == 1: + return date_constructor1(args[0]) + else: + return date_constructor0() + + +def date_constructor0(): + return now() + + +def date_constructor1(value): + v = value.to_primitive() + if v._type() == 'String': + v = parse_date(v.value) + else: + v = v.to_int() + return PyJsDate(TimeClip(v), prototype=DatePrototype) + + +def date_constructor2(*args): + y = args[0].to_number() + m = args[1].to_number() + l = len(args) + dt = args[2].to_number() if l > 2 else Js(1) + h = args[3].to_number() if l > 3 else Js(0) + mi = args[4].to_number() if l > 4 else Js(0) + sec = args[5].to_number() if l > 5 else Js(0) + mili = args[6].to_number() if l > 6 else Js(0) + if not y.is_nan() and 0 <= y.value <= 99: + y = y + Js(1900) + t = TimeClip( + LocalToUTC(MakeDate(MakeDay(y, m, dt), MakeTime(h, mi, sec, mili)))) + return PyJsDate(t, prototype=DatePrototype) + + +Date.create = date_constructor + +DatePrototype = PyJsDate(float('nan'), prototype=ObjectPrototype) + + +def check_date(obj): + if obj.Class != 'Date': + raise MakeError('TypeError', 'this is not a Date object') + + +class DateProto: + def toString(): + check_date(this) + if this.value is NaN: + return 'Invalid Date' + offset = (UTCToLocal(this.value) - this.value) // msPerHour + return this.local_strftime( + '%a %b %d %Y %H:%M:%S GMT') + '%s00 (%s)' % (pad( + offset, 2, True), GetTimeZoneName(this.value)) + + def toDateString(): + check_date(this) + return this.local_strftime('%d %B %Y') + + def toTimeString(): + check_date(this) + return this.local_strftime('%H:%M:%S') + + def toLocaleString(): + check_date(this) + return this.local_strftime('%d %B %Y %H:%M:%S') + + def toLocaleDateString(): + check_date(this) + return this.local_strftime('%d %B %Y') + + def toLocaleTimeString(): + check_date(this) + return this.local_strftime('%H:%M:%S') + + def valueOf(): + check_date(this) + return this.value + + def getTime(): + check_date(this) + return this.value + + def getFullYear(): + check_date(this) + if this.value is NaN: + return NaN + return YearFromTime(UTCToLocal(this.value)) + + def getUTCFullYear(): + check_date(this) + if this.value is NaN: + return NaN + return YearFromTime(this.value) + + def getMonth(): + check_date(this) + if this.value is NaN: + return NaN + return MonthFromTime(UTCToLocal(this.value)) + + def getDate(): + check_date(this) + if this.value is NaN: + return NaN + return DateFromTime(UTCToLocal(this.value)) + + def getUTCMonth(): + check_date(this) + if this.value is NaN: + return NaN + return MonthFromTime(this.value) + + def getUTCDate(): + check_date(this) + if this.value is NaN: + return NaN + return DateFromTime(this.value) + + def getDay(): + check_date(this) + if this.value is NaN: + return NaN + return WeekDay(UTCToLocal(this.value)) + + def getUTCDay(): + check_date(this) + if this.value is NaN: + return NaN + return WeekDay(this.value) + + def getHours(): + check_date(this) + if this.value is NaN: + return NaN + return HourFromTime(UTCToLocal(this.value)) + + def getUTCHours(): + check_date(this) + if this.value is NaN: + return NaN + return HourFromTime(this.value) + + def getMinutes(): + check_date(this) + if this.value is NaN: + return NaN + return MinFromTime(UTCToLocal(this.value)) + + def getUTCMinutes(): + check_date(this) + if this.value is NaN: + return NaN + return MinFromTime(this.value) + + def getSeconds(): + check_date(this) + if this.value is NaN: + return NaN + return SecFromTime(UTCToLocal(this.value)) + + def getUTCSeconds(): + check_date(this) + if this.value is NaN: + return NaN + return SecFromTime(this.value) + + def getMilliseconds(): + check_date(this) + if this.value is NaN: + return NaN + return msFromTime(UTCToLocal(this.value)) + + def getUTCMilliseconds(): + check_date(this) + if this.value is NaN: + return NaN + return msFromTime(this.value) + + def getTimezoneOffset(): + check_date(this) + if this.value is NaN: + return NaN + return (this.value - UTCToLocal(this.value)) // 60000 + + def setTime(time): + check_date(this) + this.value = TimeClip(time.to_number().to_int()) + return this.value + + def setMilliseconds(ms): + check_date(this) + t = UTCToLocal(this.value) + tim = MakeTime( + HourFromTime(t), MinFromTime(t), SecFromTime(t), ms.to_int()) + u = TimeClip(LocalToUTC(MakeDate(Day(t), tim))) + this.value = u + return u + + def setUTCMilliseconds(ms): + check_date(this) + t = this.value + tim = MakeTime( + HourFromTime(t), MinFromTime(t), SecFromTime(t), ms.to_int()) + u = TimeClip(MakeDate(Day(t), tim)) + this.value = u + return u + + # todo Complete all setters! + + def toUTCString(): + check_date(this) + return this.utc_strftime('%d %B %Y %H:%M:%S') + + def toISOString(): + check_date(this) + t = this.value + year = YearFromTime(t) + month, day, hour, minute, second, milli = pad( + MonthFromTime(t) + 1), pad(DateFromTime(t)), pad( + HourFromTime(t)), pad(MinFromTime(t)), pad( + SecFromTime(t)), pad(msFromTime(t)) + return ISO_FORMAT % (unicode(year) if 0 <= year <= 9999 else pad( + year, 6, True), month, day, hour, minute, second, milli) + + def toJSON(key): + o = this.to_object() + tv = o.to_primitive('Number') + if tv.Class == 'Number' and not tv.is_finite(): + return this.null + toISO = o.get('toISOString') + if not toISO.is_callable(): + raise this.MakeError('TypeError', 'toISOString is not callable') + return toISO.call(o, ()) + + +def pad(num, n=2, sign=False): + '''returns n digit string representation of the num''' + s = unicode(abs(num)) + if len(s) < n: + s = '0' * (n - len(s)) + s + if not sign: + return s + if num >= 0: + return '+' + s + else: + return '-' + s + + +fill_prototype(DatePrototype, DateProto, default_attrs) + +Date.define_own_property( + 'prototype', { + 'value': DatePrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +DatePrototype.define_own_property('constructor', { + 'value': Date, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsfunction.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsfunction.py new file mode 100644 index 000000000..9728fb382 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsfunction.py @@ -0,0 +1,75 @@ +from ..base import * +from ..conversions import * +from ..func_utils import * +from pyjsparser import parse +from ..byte_trans import ByteCodeGenerator, Code + + +def Function(this, args): + # convert arguments to python list of strings + a = map(to_string, tuple(args)) + _body = u';' + _args = () + if len(a): + _body = u'%s;' % a[-1] + _args = a[:-1] + return executable_function(_body, _args, args.space, global_context=True) + + +def executable_function(_body, _args, space, global_context=True): + func_str = u'(function (%s) { ; %s ; });' % (u', '.join(_args), _body) + + co = executable_code( + code_str=func_str, space=space, global_context=global_context) + return co() + + +# you can use this one lovely piece of function to compile and execute code on the fly! Watch out though as it may generate lots of code. +# todo tape cleanup? we dont know which pieces are needed and which are not so rather impossible without smarter machinery something like GC, +# a one solution would be to have a separate tape for functions +def executable_code(code_str, space, global_context=True): + # parse first to check if any SyntaxErrors + parsed = parse(code_str) + + old_tape_len = len(space.byte_generator.exe.tape) + space.byte_generator.record_state() + start = space.byte_generator.exe.get_new_label() + skip = space.byte_generator.exe.get_new_label() + space.byte_generator.emit('JUMP', skip) + space.byte_generator.emit('LABEL', start) + space.byte_generator.emit(parsed) + space.byte_generator.emit('NOP') + space.byte_generator.emit('LABEL', skip) + space.byte_generator.emit('NOP') + space.byte_generator.restore_state() + space.byte_generator.exe.compile( + start_loc=old_tape_len + ) # dont read the code from the beginning, dont be stupid! + + ctx = space.GlobalObj if global_context else space.exe.current_ctx + + def ex_code(): + ret, status, token = space.byte_generator.exe.execute_fragment_under_context( + ctx, start, skip) + # todo Clean up the tape! + # this is NOT a way to do that because the fragment may contain the executable code! We dont want to remove it + #del space.byte_generator.exe.tape[old_tape_len:] + if status == 0: + return ret + elif status == 3: + raise token + else: + raise RuntimeError( + 'Unexpected return status during JIT execution: %d' % status) + + return ex_code + + +def _eval(this, args): + code_str = to_string(get_arg(args, 0)) + return executable_code(code_str, args.space, global_context=True)() + + +def log(this, args): + print ' '.join(map(to_string, args)) + return undefined diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsmath.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsmath.py new file mode 100644 index 000000000..3eb44616b --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsmath.py @@ -0,0 +1,157 @@ +from __future__ import unicode_literals + +from ..conversions import * +from ..func_utils import * + +import math +import random + +CONSTANTS = { + 'E': 2.7182818284590452354, + 'LN10': 2.302585092994046, + 'LN2': 0.6931471805599453, + 'LOG2E': 1.4426950408889634, + 'LOG10E': 0.4342944819032518, + 'PI': 3.1415926535897932, + 'SQRT1_2': 0.7071067811865476, + 'SQRT2': 1.4142135623730951 +} + + +class MathFunctions: + def abs(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + return abs(a) + + def acos(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + try: + return math.acos(a) + except: + return NaN + + def asin(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + try: + return math.asin(a) + except: + return NaN + + def atan(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + return math.atan(a) + + def atan2(this, args): + x = get_arg(args, 0) + y = get_arg(args, 1) + a = to_number(x) + b = to_number(y) + if a != a or b != b: # it must be a nan + return NaN + return math.atan2(a, b) + + def ceil(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + return float(math.ceil(a)) + + def floor(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + return float(math.floor(a)) + + def round(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + return float(round(a)) + + def sin(this, args): + x = get_arg(args, 0) + a = to_number(x) + if not is_finite(a): # it must be a nan + return NaN + return math.sin(a) + + def cos(this, args): + x = get_arg(args, 0) + a = to_number(x) + if not is_finite(a): # it must be a nan + return NaN + return math.cos(a) + + def tan(this, args): + x = get_arg(args, 0) + a = to_number(x) + if not is_finite(a): # it must be a nan + return NaN + return math.tan(a) + + def log(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + try: + return math.log(a) + except: + return NaN + + def exp(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + return math.exp(a) + + def pow(this, args): + x = get_arg(args, 0) + y = get_arg(args, 1) + a = to_number(x) + b = to_number(y) + if a != a or b != b: # it must be a nan + return NaN + try: + return a**b + except: + return NaN + + def sqrt(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + try: + return a**0.5 + except: + return NaN + + def min(this, args): + if len(args) == 0: + return Infinity + return min(map(to_number, tuple(args))) + + def max(this, args): + if len(args) == 0: + return -Infinity + return max(map(to_number, tuple(args))) + + def random(this, args): + return random.random() diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsnumber.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsnumber.py new file mode 100644 index 000000000..276b7cfad --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsnumber.py @@ -0,0 +1,27 @@ +from __future__ import unicode_literals + +from ..conversions import * +from ..func_utils import * + + +def Number(this, args): + if len(args) == 0: + return 0. + return to_number(args[0]) + + +def NumberConstructor(args, space): + temp = space.NewObject() + temp.prototype = space.NumberPrototype + temp.Class = 'Number' + temp.value = float(to_number(get_arg(args, 0)) if len(args) > 0 else 0.) + return temp + + +CONSTS = { + 'MAX_VALUE': 1.7976931348623157e308, + 'MIN_VALUE': 5.0e-324, + 'NaN': NaN, + 'NEGATIVE_INFINITY': Infinity, + 'POSITIVE_INFINITY': -Infinity +} diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsobject.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsobject.py new file mode 100644 index 000000000..06fdbbb05 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsobject.py @@ -0,0 +1,204 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * +from ..base import is_data_descriptor +import six + + +def Object(this, args): + val = get_arg(args, 0) + if is_null(val) or is_undefined(val): + return args.space.NewObject() + return to_object(val, args.space) + + +def ObjectCreate(args, space): + if len(args): + val = get_arg(args, 0) + if is_object(val): + # Implementation dependent, but my will simply return :) + return val + elif type(val) in (NUMBER_TYPE, STRING_TYPE, BOOLEAN_TYPE): + return to_object(val, space) + return space.NewObject() + + +class ObjectMethods: + def getPrototypeOf(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', + 'Object.getPrototypeOf called on non-object') + return null if obj.prototype is None else obj.prototype + + def getOwnPropertyDescriptor(this, args): + obj = get_arg(args, 0) + prop = get_arg(args, 1) + if not is_object(obj): + raise MakeError( + 'TypeError', + 'Object.getOwnPropertyDescriptor called on non-object') + desc = obj.own.get(to_string(prop)) + return convert_to_js_type(desc, args.space) + + def getOwnPropertyNames(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError( + 'TypeError', + 'Object.getOwnPropertyDescriptor called on non-object') + return args.space.ConstructArray(obj.own.keys()) + + def create(this, args): + obj = get_arg(args, 0) + if not (is_object(obj) or is_null(obj)): + raise MakeError('TypeError', + 'Object prototype may only be an Object or null') + temp = args.space.NewObject() + temp.prototype = None if is_null(obj) else obj + if len(args) > 1 and not is_undefined(args[1]): + if six.PY2: + args.tup = (args[1], ) + ObjectMethods.defineProperties.__func__(temp, args) + else: + args.tup = (args[1], ) + ObjectMethods.defineProperties(temp, args) + return temp + + def defineProperty(this, args): + obj = get_arg(args, 0) + prop = get_arg(args, 1) + attrs = get_arg(args, 2) + if not is_object(obj): + raise MakeError('TypeError', + 'Object.defineProperty called on non-object') + name = to_string(prop) + if not obj.define_own_property(name, ToPropertyDescriptor(attrs), + False): + raise MakeError('TypeError', 'Cannot redefine property: %s' % name) + return obj + + def defineProperties(this, args): + obj = get_arg(args, 0) + properties = get_arg(args, 1) + if not is_object(obj): + raise MakeError('TypeError', + 'Object.defineProperties called on non-object') + props = to_object(properties, args.space) + for k, v in props.own.items(): + if not v.get('enumerable'): + continue + desc = ToPropertyDescriptor(props.get(unicode(k))) + if not obj.define_own_property(unicode(k), desc, False): + raise MakeError('TypeError', + 'Failed to define own property: %s' % k) + return obj + + def seal(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', 'Object.seal called on non-object') + for desc in obj.own.values(): + desc['configurable'] = False + obj.extensible = False + return obj + + def freeze(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', 'Object.freeze called on non-object') + for desc in obj.own.values(): + desc['configurable'] = False + if is_data_descriptor(desc): + desc['writable'] = False + obj.extensible = False + return obj + + def preventExtensions(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', + 'Object.preventExtensions on non-object') + obj.extensible = False + return obj + + def isSealed(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', + 'Object.isSealed called on non-object') + if obj.extensible: + return False + for desc in obj.own.values(): + if desc.get('configurable'): + return False + return True + + def isFrozen(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', + 'Object.isFrozen called on non-object') + if obj.extensible: + return False + for desc in obj.own.values(): + if desc.get('configurable'): + return False + if is_data_descriptor(desc) and desc.get('writable'): + return False + return True + + def isExtensible(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', + 'Object.isExtensible called on non-object') + return obj.extensible + + def keys(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', 'Object.keys called on non-object') + return args.space.ConstructArray([ + unicode(e) for e, d in six.iteritems(obj.own) + if d.get('enumerable') + ]) + + +# some utility functions: + + +def ToPropertyDescriptor(obj): # page 38 (50 absolute) + if not is_object(obj): + raise MakeError('TypeError', + 'Can\'t convert non-object to property descriptor') + desc = {} + if obj.has_property('enumerable'): + desc['enumerable'] = to_boolean(obj.get('enumerable')) + if obj.has_property('configurable'): + desc['configurable'] = to_boolean(obj.get('configurable')) + if obj.has_property('value'): + desc['value'] = obj.get('value') + if obj.has_property('writable'): + desc['writable'] = to_boolean(obj.get('writable')) + if obj.has_property('get'): + cand = obj.get('get') + if not (is_undefined(cand) or is_callable(cand)): + raise MakeError( + 'TypeError', + 'Invalid getter (it has to be a function or undefined)') + desc['get'] = cand + if obj.has_property('set'): + cand = obj.get('set') + if not (is_undefined(cand) or is_callable(cand)): + raise MakeError( + 'TypeError', + 'Invalid setter (it has to be a function or undefined)') + desc['set'] = cand + if ('get' in desc or 'set' in desc) and ('value' in desc + or 'writable' in desc): + raise MakeError( + 'TypeError', + 'Invalid property. A property cannot both have accessors and be writable or have a value.' + ) + return desc diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsregexp.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsregexp.py new file mode 100644 index 000000000..7b264fdb6 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsregexp.py @@ -0,0 +1,41 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * +from ..base import SpaceTuple + +REG_EXP_FLAGS = ('g', 'i', 'm') + + +def RegExp(this, args): + pattern = get_arg(args, 0) + flags = get_arg(args, 1) + if GetClass(pattern) == 'RegExp': + if not is_undefined(flags): + raise MakeError( + 'TypeError', + 'Cannot supply flags when constructing one RegExp from another' + ) + # return unchanged + return pattern + #pattern is not a regexp + if is_undefined(pattern): + pattern = u'' + else: + pattern = to_string(pattern) + flags = to_string(flags) if not is_undefined(flags) else u'' + for flag in flags: + if flag not in REG_EXP_FLAGS: + raise MakeError( + 'SyntaxError', + 'Invalid flags supplied to RegExp constructor "%s"' % flag) + if len(set(flags)) != len(flags): + raise MakeError( + 'SyntaxError', + 'Invalid flags supplied to RegExp constructor "%s"' % flags) + return args.space.NewRegExp(pattern, flags) + + +def RegExpCreate(args, space): + _args = SpaceTuple(args) + _args.space = space + return RegExp(undefined, _args) diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsstring.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsstring.py new file mode 100644 index 000000000..f2b43831b --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsstring.py @@ -0,0 +1,23 @@ +from ..conversions import * +from ..func_utils import * + + +def fromCharCode(this, args): + res = u'' + for e in args: + res += unichr(to_uint16(e)) + return res + + +def String(this, args): + if len(args) == 0: + return u'' + return to_string(args[0]) + + +def StringConstructor(args, space): + temp = space.NewObject() + temp.prototype = space.StringPrototype + temp.Class = 'String' + temp.value = to_string(get_arg(args, 0)) if len(args) > 0 else u'' + return temp diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/time_helpers.py b/Contents/Libraries/Shared/js2py/internals/constructors/time_helpers.py new file mode 100644 index 000000000..eda95fb60 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/time_helpers.py @@ -0,0 +1,209 @@ +from __future__ import unicode_literals + +# NOTE: t must be INT!!! +import time +import datetime +import warnings + +try: + from tzlocal import get_localzone + LOCAL_ZONE = get_localzone() +except: # except all problems... + warnings.warn( + 'Please install or fix tzlocal library (pip install tzlocal) in order to make Date object work better. Otherwise I will assume DST is in effect all the time' + ) + + class LOCAL_ZONE: + @staticmethod + def dst(*args): + return 1 + + +from js2py.base import MakeError +CUM = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365) +msPerDay = 86400000 +msPerYear = int(86400000 * 365.242) +msPerSecond = 1000 +msPerMinute = 60000 +msPerHour = 3600000 +HoursPerDay = 24 +MinutesPerHour = 60 +SecondsPerMinute = 60 +NaN = float('nan') +LocalTZA = -time.timezone * msPerSecond + + +def DaylightSavingTA(t): + if t is NaN: + return t + try: + return int( + LOCAL_ZONE.dst(datetime.datetime.utcfromtimestamp( + t // 1000)).seconds) * 1000 + except: + warnings.warn( + 'Invalid datetime date, assumed DST time, may be inaccurate...', + Warning) + return 1 + #raise MakeError('TypeError', 'date not supported by python.datetime. I will solve it in future versions') + + +def GetTimeZoneName(t): + return time.tzname[DaylightSavingTA(t) > 0] + + +def LocalToUTC(t): + return t - LocalTZA - DaylightSavingTA(t - LocalTZA) + + +def UTCToLocal(t): + return t + LocalTZA + DaylightSavingTA(t) + + +def Day(t): + return t // 86400000 + + +def TimeWithinDay(t): + return t % 86400000 + + +def DaysInYear(y): + if y % 4: + return 365 + elif y % 100: + return 366 + elif y % 400: + return 365 + else: + return 366 + + +def DayFromYear(y): + return 365 * (y - 1970) + (y - 1969) // 4 - (y - 1901) // 100 + ( + y - 1601) // 400 + + +def TimeFromYear(y): + return 86400000 * DayFromYear(y) + + +def YearFromTime(t): + guess = 1970 - t // 31556908800 # msPerYear + gt = TimeFromYear(guess) + if gt <= t: + while gt <= t: + guess += 1 + gt = TimeFromYear(guess) + return guess - 1 + else: + while gt > t: + guess -= 1 + gt = TimeFromYear(guess) + return guess + + +def DayWithinYear(t): + return Day(t) - DayFromYear(YearFromTime(t)) + + +def InLeapYear(t): + y = YearFromTime(t) + if y % 4: + return 0 + elif y % 100: + return 1 + elif y % 400: + return 0 + else: + return 1 + + +def MonthFromTime(t): + day = DayWithinYear(t) + leap = InLeapYear(t) + if day < 31: + return 0 + day -= leap + if day < 59: + return 1 + elif day < 90: + return 2 + elif day < 120: + return 3 + elif day < 151: + return 4 + elif day < 181: + return 5 + elif day < 212: + return 6 + elif day < 243: + return 7 + elif day < 273: + return 8 + elif day < 304: + return 9 + elif day < 334: + return 10 + else: + return 11 + + +def DateFromTime(t): + mon = MonthFromTime(t) + day = DayWithinYear(t) + return day - CUM[mon] - (1 if InLeapYear(t) and mon >= 2 else 0) + 1 + + +def WeekDay(t): + # 0 == sunday + return (Day(t) + 4) % 7 + + +def msFromTime(t): + return t % 1000 + + +def SecFromTime(t): + return (t // 1000) % 60 + + +def MinFromTime(t): + return (t // 60000) % 60 + + +def HourFromTime(t): + return (t // 3600000) % 24 + + +def MakeTime(hour, Min, sec, ms): + # takes PyJs objects and returns t + if not (hour.is_finite() and Min.is_finite() and sec.is_finite() + and ms.is_finite()): + return NaN + h, m, s, milli = hour.to_int(), Min.to_int(), sec.to_int(), ms.to_int() + return h * 3600000 + m * 60000 + s * 1000 + milli + + +def MakeDay(year, month, date): + # takes PyJs objects and returns t + if not (year.is_finite() and month.is_finite() and date.is_finite()): + return NaN + y, m, dt = year.to_int(), month.to_int(), date.to_int() + y += m // 12 + mn = m % 12 + d = DayFromYear(y) + CUM[mn] + dt - 1 + (1 if DaysInYear(y) == 366 + and mn >= 2 else 0) + return d # ms per day + + +def MakeDate(day, time): + return 86400000 * day + time + + +def TimeClip(t): + if t != t or abs(t) == float('inf'): + return NaN + if abs(t) > 8.64 * 10**15: + return NaN + return int(t) diff --git a/Contents/Libraries/Shared/js2py/internals/conversions.py b/Contents/Libraries/Shared/js2py/internals/conversions.py new file mode 100644 index 000000000..b90a427d2 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/conversions.py @@ -0,0 +1,148 @@ +from __future__ import unicode_literals +# Type Conversions. to_type. All must return PyJs subclass instance +from simplex import * + + +def to_primitive(self, hint=None): + if is_primitive(self): + return self + if hint is None and (self.Class == 'Number' or self.Class == 'Boolean'): + # favour number for Class== Number or Boolean default = String + hint = 'Number' + return self.default_value(hint) + + +def to_boolean(self): + typ = Type(self) + if typ == 'Boolean': # no need to convert + return self + elif typ == 'Null' or typ == 'Undefined': # they are both always false + return False + elif typ == 'Number': # false only for 0, and NaN + return self and self == self # test for nan (nan -> flase) + elif typ == 'String': + return bool(self) + else: # object - always True + return True + + +def to_number(self): + typ = Type(self) + if typ == 'Number': # or self.Class=='Number': # no need to convert + return self + elif typ == 'Null': # null is 0 + return 0. + elif typ == 'Undefined': # undefined is NaN + return NaN + elif typ == 'Boolean': # 1 for True 0 for false + return float(self) + elif typ == 'String': + s = self.strip() # Strip white space + if not s: # '' is simply 0 + return 0. + if 'x' in s or 'X' in s[:3]: # hex (positive only) + try: # try to convert + num = int(s, 16) + except ValueError: # could not convert -> NaN + return NaN + return float(num) + sign = 1 # get sign + if s[0] in '+-': + if s[0] == '-': + sign = -1 + s = s[1:] + if s == 'Infinity': # Check for infinity keyword. 'NaN' will be NaN anyway. + return sign * Infinity + try: # decimal try + num = sign * float(s) # Converted + except ValueError: + return NaN # could not convert to decimal > return NaN + return float(num) + else: # object - most likely it will be NaN. + return to_number(to_primitive(self, 'Number')) + + +def to_string(self): + typ = Type(self) + if typ == 'String': + return self + elif typ == 'Null': + return 'null' + elif typ == 'Undefined': + return 'undefined' + elif typ == 'Boolean': + return 'true' if self else 'false' + elif typ == 'Number': # or self.Class=='Number': + if is_nan(self): + return 'NaN' + elif is_infinity(self): + sign = '-' if self < 0 else '' + return sign + 'Infinity' + elif int(self) == self: # integer value! + return unicode(int(self)) + return unicode(self) # todo make it print exactly like node.js + else: # object + return to_string(to_primitive(self, 'String')) + + +def to_object(self, space): + typ = Type(self) + if typ == 'Object': + return self + elif typ == 'Boolean': # Unsure ... todo check here + return space.Boolean.create((self, ), space) + elif typ == 'Number': # ? + return space.Number.create((self, ), space) + elif typ == 'String': # ? + return space.String.create((self, ), space) + elif typ == 'Null' or typ == 'Undefined': + raise MakeError('TypeError', + 'undefined or null can\'t be converted to object') + else: + raise RuntimeError() + + +def to_int32(self): + num = to_number(self) + if is_nan(num) or is_infinity(num): + return 0 + int32 = int(num) % 2**32 + return int(int32 - 2**32 if int32 >= 2**31 else int32) + + +def to_int(self): + num = to_number(self) + if is_nan(num): + return 0 + elif is_infinity(num): + return 10**20 if num > 0 else -10**20 + return int(num) + + +def to_uint32(self): + num = to_number(self) + if is_nan(num) or is_infinity(num): + return 0 + return int(num) % 2**32 + + +def to_uint16(self): + num = to_number(self) + if is_nan(num) or is_infinity(num): + return 0 + return int(num) % 2**16 + + +def to_int16(self): + num = to_number(self) + if is_nan(num) or is_infinity(num): + return 0 + int16 = int(num) % 2**16 + return int(int16 - 2**16 if int16 >= 2**15 else int16) + + +def cok(self): + """Check object coercible""" + if type(self) in (UNDEFINED_TYPE, NULL_TYPE): + raise MakeError('TypeError', + 'undefined or null can\'t be converted to object') diff --git a/Contents/Libraries/Shared/js2py/internals/desc.py b/Contents/Libraries/Shared/js2py/internals/desc.py new file mode 100644 index 000000000..e81179c28 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/desc.py @@ -0,0 +1,90 @@ +# todo make sure what they mean by desc undefined? None or empty? Answer: None :) it can never be empty but None is sometimes returned. + +# I am implementing everything as dicts to speed up property creation + +# Warning: value, get, set props of dest are PyJs types. Rest is Py! + + +def is_data_descriptor(desc): + return desc and ('value' in desc or 'writable' in desc) + + +def is_accessor_descriptor(desc): + return desc and ('get' in desc or 'set' in desc) + + +def is_generic_descriptor( + desc +): # generic means not the data and not the setter - therefore it must be one that changes only enum and conf + return desc and not (is_data_descriptor(desc) + or is_accessor_descriptor(desc)) + + +def from_property_descriptor(desc, space): + if not desc: + return {} + obj = space.NewObject() + if is_data_descriptor(desc): + obj.define_own_property( + 'value', { + 'value': desc['value'], + 'writable': True, + 'enumerable': True, + 'configurable': True + }, False) + obj.define_own_property( + 'writable', { + 'value': desc['writable'], + 'writable': True, + 'enumerable': True, + 'configurable': True + }, False) + else: + obj.define_own_property( + 'get', { + 'value': desc['get'], + 'writable': True, + 'enumerable': True, + 'configurable': True + }, False) + obj.define_own_property( + 'set', { + 'value': desc['set'], + 'writable': True, + 'enumerable': True, + 'configurable': True + }, False) + obj.define_own_property( + 'writable', { + 'value': desc['writable'], + 'writable': True, + 'enumerable': True, + 'configurable': True + }, False) + obj.define_own_property( + 'enumerable', { + 'value': desc['enumerable'], + 'writable': True, + 'enumerable': True, + 'configurable': True + }, False) + return obj + + +def to_property_descriptor(obj): + if obj._type() != 'Object': + raise TypeError() + desc = {} + for e in ('enumerable', 'configurable', 'writable'): + if obj.has_property(e): + desc[e] = obj.get(e).to_boolean().value + if obj.has_property('value'): + desc['value'] = obj.get('value') + for e in ('get', 'set'): + if obj.has_property(e): + cand = obj.get(e) + if not (cand.is_callable() or cand.is_undefined()): + raise TypeError() + if ('get' in desc or 'set' in desc) and ('value' in desc + or 'writable' in desc): + raise TypeError() diff --git a/Contents/Libraries/Shared/js2py/internals/fill_space.py b/Contents/Libraries/Shared/js2py/internals/fill_space.py new file mode 100644 index 000000000..9aa9c4d21 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/fill_space.py @@ -0,0 +1,284 @@ +from __future__ import unicode_literals + +from base import Scope +from func_utils import * +from conversions import * +import six +from prototypes.jsboolean import BooleanPrototype +from prototypes.jserror import ErrorPrototype +from prototypes.jsfunction import FunctionPrototype +from prototypes.jsnumber import NumberPrototype +from prototypes.jsobject import ObjectPrototype +from prototypes.jsregexp import RegExpPrototype +from prototypes.jsstring import StringPrototype +from prototypes.jsarray import ArrayPrototype +import prototypes.jsjson as jsjson +import prototypes.jsutils as jsutils + +from constructors import jsnumber +from constructors import jsstring +from constructors import jsarray +from constructors import jsboolean +from constructors import jsregexp +from constructors import jsmath +from constructors import jsobject +from constructors import jsfunction +from constructors import jsconsole + + +def fill_proto(proto, proto_class, space): + for i in dir(proto_class): + e = getattr(proto_class, i) + if six.PY2: + if hasattr(e, '__func__'): + meth = e.__func__ + else: + continue + else: + if hasattr(e, '__call__') and not i.startswith('__'): + meth = e + else: + continue + meth_name = meth.__name__.strip('_') # RexExp._exec -> RegExp.exec + js_meth = space.NewFunction(meth, space.ctx, (), meth_name, False, ()) + set_non_enumerable(proto, meth_name, js_meth) + return proto + + +def easy_func(f, space): + return space.NewFunction(f, space.ctx, (), f.__name__, False, ()) + + +def Empty(this, args): + return undefined + + +def set_non_enumerable(obj, name, prop): + obj.define_own_property( + unicode(name), { + 'value': prop, + 'writable': True, + 'enumerable': False, + 'configurable': True + }, True) + + +def set_protected(obj, name, prop): + obj.define_own_property( + unicode(name), { + 'value': prop, + 'writable': False, + 'enumerable': False, + 'configurable': False + }, True) + + +def fill_space(space, byte_generator): + # set global scope + global_scope = Scope({}, space, parent=None) + global_scope.THIS_BINDING = global_scope + global_scope.registers(byte_generator.declared_vars) + space.GlobalObj = global_scope + + space.byte_generator = byte_generator + + # first init all protos, later take care of constructors and details + + # Function must be first obviously, we have to use a small trick to do that... + function_proto = space.NewFunction(Empty, space.ctx, (), 'Empty', False, + ()) + space.FunctionPrototype = function_proto # this will fill the prototypes of the methods! + fill_proto(function_proto, FunctionPrototype, space) + + # Object next + object_proto = space.NewObject() # no proto + fill_proto(object_proto, ObjectPrototype, space) + space.ObjectPrototype = object_proto + function_proto.prototype = object_proto + + # Number + number_proto = space.NewObject() + number_proto.prototype = object_proto + fill_proto(number_proto, NumberPrototype, space) + number_proto.value = 0. + number_proto.Class = 'Number' + space.NumberPrototype = number_proto + + # String + string_proto = space.NewObject() + string_proto.prototype = object_proto + fill_proto(string_proto, StringPrototype, space) + string_proto.value = u'' + string_proto.Class = 'String' + space.StringPrototype = string_proto + + # Boolean + boolean_proto = space.NewObject() + boolean_proto.prototype = object_proto + fill_proto(boolean_proto, BooleanPrototype, space) + boolean_proto.value = False + boolean_proto.Class = 'Boolean' + space.BooleanPrototype = boolean_proto + + # Array + array_proto = space.NewArray(0) + array_proto.prototype = object_proto + fill_proto(array_proto, ArrayPrototype, space) + space.ArrayPrototype = array_proto + + # JSON + json = space.NewObject() + json.put(u'stringify', easy_func(jsjson.stringify, space)) + json.put(u'parse', easy_func(jsjson.parse, space)) + + # Utils + parseFloat = easy_func(jsutils.parseFloat, space) + parseInt = easy_func(jsutils.parseInt, space) + isNaN = easy_func(jsutils.isNaN, space) + isFinite = easy_func(jsutils.isFinite, space) + + # Error + error_proto = space.NewError(u'Error', u'') + error_proto.prototype = object_proto + error_proto.put(u'name', u'Error') + fill_proto(error_proto, ErrorPrototype, space) + space.ErrorPrototype = error_proto + + def construct_constructor(typ): + def creator(this, args): + message = get_arg(args, 0) + if not is_undefined(message): + msg = to_string(message) + else: + msg = u'' + return space.NewError(typ, msg) + + j = easy_func(creator, space) + j.name = unicode(typ) + j.prototype = space.ERROR_TYPES[typ] + + def new_create(args, space): + message = get_arg(args, 0) + if not is_undefined(message): + msg = to_string(message) + else: + msg = u'' + return space.NewError(typ, msg) + + j.create = new_create + return j + + # fill remaining error types + error_constructors = {} + for err_type_name in (u'Error', u'EvalError', u'RangeError', + u'ReferenceError', u'SyntaxError', u'TypeError', + u'URIError'): + extra_err = space.NewError(u'Error', u'') + extra_err.put(u'name', err_type_name) + setattr(space, err_type_name + u'Prototype', extra_err) + error_constructors[err_type_name] = construct_constructor( + err_type_name) + assert space.TypeErrorPrototype is not None + + # RegExp + regexp_proto = space.NewRegExp(u'(?:)', u'') + regexp_proto.prototype = object_proto + fill_proto(regexp_proto, RegExpPrototype, space) + space.RegExpPrototype = regexp_proto + + # Json + + # now all these boring constructors... + + # Number + number = easy_func(jsnumber.Number, space) + space.Number = number + number.create = jsnumber.NumberConstructor + set_non_enumerable(number_proto, 'constructor', number) + set_protected(number, 'prototype', number_proto) + # number has some extra constants + for k, v in jsnumber.CONSTS.items(): + set_protected(number, k, v) + + # String + string = easy_func(jsstring.String, space) + space.String = string + string.create = jsstring.StringConstructor + set_non_enumerable(string_proto, 'constructor', string) + set_protected(string, 'prototype', string_proto) + # string has an extra function + set_non_enumerable(string, 'fromCharCode', + easy_func(jsstring.fromCharCode, space)) + + # Boolean + boolean = easy_func(jsboolean.Boolean, space) + space.Boolean = boolean + boolean.create = jsboolean.BooleanConstructor + set_non_enumerable(boolean_proto, 'constructor', boolean) + set_protected(boolean, 'prototype', boolean_proto) + + # Array + array = easy_func(jsarray.Array, space) + space.Array = array + array.create = jsarray.ArrayConstructor + set_non_enumerable(array_proto, 'constructor', array) + set_protected(array, 'prototype', array_proto) + array.put(u'isArray', easy_func(jsarray.isArray, space)) + + # RegExp + regexp = easy_func(jsregexp.RegExp, space) + space.RegExp = regexp + regexp.create = jsregexp.RegExpCreate + set_non_enumerable(regexp_proto, 'constructor', regexp) + set_protected(regexp, 'prototype', regexp_proto) + + # Object + _object = easy_func(jsobject.Object, space) + space.Object = _object + _object.create = jsobject.ObjectCreate + set_non_enumerable(object_proto, 'constructor', _object) + set_protected(_object, 'prototype', object_proto) + fill_proto(_object, jsobject.ObjectMethods, space) + + # Function + function = easy_func(jsfunction.Function, space) + space.Function = function + + # Math + math = space.NewObject() + math.Class = 'Math' + fill_proto(math, jsmath.MathFunctions, space) + for k, v in jsmath.CONSTANTS.items(): + set_protected(math, k, v) + + console = space.NewObject() + fill_proto(console, jsconsole.ConsoleMethods, space) + + # set global object + builtins = { + 'String': string, + 'Number': number, + 'Boolean': boolean, + 'RegExp': regexp, + 'exports': convert_to_js_type({}, space), + 'Math': math, + #'Date', + 'Object': _object, + 'Function': function, + 'JSON': json, + 'Array': array, + 'parseFloat': parseFloat, + 'parseInt': parseInt, + 'isFinite': isFinite, + 'isNaN': isNaN, + 'eval': easy_func(jsfunction._eval, space), + 'console': console, + 'log': console.get(u'log'), + } + + builtins.update(error_constructors) + + set_protected(global_scope, 'NaN', NaN) + set_protected(global_scope, 'Infinity', Infinity) + for k, v in builtins.items(): + set_non_enumerable(global_scope, k, v) diff --git a/Contents/Libraries/Shared/js2py/internals/func_utils.py b/Contents/Libraries/Shared/js2py/internals/func_utils.py new file mode 100644 index 000000000..3c0b8d576 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/func_utils.py @@ -0,0 +1,73 @@ +from simplex import * +from conversions import * + +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + + +def get_arg(arguments, n): + if len(arguments) <= n: + return undefined + return arguments[n] + + +def ensure_js_types(args, space=None): + return tuple(convert_to_js_type(e, space=space) for e in args) + + +def convert_to_js_type(e, space=None): + t = type(e) + if is_js_type(e): + return e + if t in (int, long, float): + return float(e) + elif isinstance(t, basestring): + return unicode(t) + elif t in (list, tuple): + if space is None: + raise MakeError( + 'TypeError', + 'Actually an internal error, could not convert to js type because space not specified' + ) + return space.ConstructArray(ensure_js_types(e, space=space)) + elif t == dict: + if space is None: + raise MakeError( + 'TypeError', + 'Actually an internal error, could not convert to js type because space not specified' + ) + new = {} + for k, v in e.items(): + new[to_string(convert_to_js_type(k, space))] = convert_to_js_type( + v, space) + return space.ConstructObject(new) + else: + raise MakeError('TypeError', 'Could not convert to js type!') + + +def is_js_type(e): + if type(e) in PRIMITIVES: + return True + elif hasattr(e, 'Class') and hasattr(e, 'value'): # not perfect but works + return True + else: + return False + + +# todo optimise these 2! +def js_array_to_tuple(arr): + length = to_uint32(arr.get(u'length')) + return tuple(arr.get(unicode(e)) for e in xrange(length)) + + +def js_array_to_list(arr): + length = to_uint32(arr.get(u'length')) + return [arr.get(unicode(e)) for e in xrange(length)] + + +def js_arr_length(arr): + return to_uint32(arr.get(u'length')) diff --git a/Contents/Libraries/Shared/js2py/internals/gen.py b/Contents/Libraries/Shared/js2py/internals/gen.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/js2py/internals/opcodes.py b/Contents/Libraries/Shared/js2py/internals/opcodes.py new file mode 100644 index 000000000..0f3127db7 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/opcodes.py @@ -0,0 +1,805 @@ +from operations import * +from base import get_member, get_member_dot, PyJsFunction, Scope + + +class OP_CODE(object): + _params = [] + + # def eval(self, ctx): + # raise + + def __repr__(self): + return self.__class__.__name__ + str( + tuple([getattr(self, e) for e in self._params])) + + +# --------------------- UNARY ---------------------- + + +class UNARY_OP(OP_CODE): + _params = ['operator'] + + def __init__(self, operator): + self.operator = operator + + def eval(self, ctx): + val = ctx.stack.pop() + ctx.stack.append(UNARY_OPERATIONS[self.operator](val)) + + +# special unary operations + + +class TYPEOF(OP_CODE): + _params = ['identifier'] + + def __init__(self, identifier): + self.identifier = identifier + + def eval(self, ctx): + # typeof something_undefined does not throw reference error + val = ctx.get(self.identifier, + False) # <= this makes it slightly different! + ctx.stack.append(typeof_uop(val)) + + +class POSTFIX(OP_CODE): + _params = ['cb', 'ca', 'identifier'] + + def __init__(self, post, incr, identifier): + self.identifier = identifier + self.cb = 1 if incr else -1 + self.ca = -self.cb if post else 0 + + def eval(self, ctx): + target = to_number(ctx.get(self.identifier)) + self.cb + ctx.put(self.identifier, target) + ctx.stack.append(target + self.ca) + + +class POSTFIX_MEMBER(OP_CODE): + _params = ['cb', 'ca'] + + def __init__(self, post, incr): + self.cb = 1 if incr else -1 + self.ca = -self.cb if post else 0 + + def eval(self, ctx): + name = ctx.stack.pop() + left = ctx.stack.pop() + + target = to_number(get_member(left, name, ctx.space)) + self.cb + if type(left) not in PRIMITIVES: + left.put_member(name, target) + + ctx.stack.append(target + self.ca) + + +class POSTFIX_MEMBER_DOT(OP_CODE): + _params = ['cb', 'ca', 'prop'] + + def __init__(self, post, incr, prop): + self.cb = 1 if incr else -1 + self.ca = -self.cb if post else 0 + self.prop = prop + + def eval(self, ctx): + left = ctx.stack.pop() + + target = to_number(get_member_dot(left, self.prop, + ctx.space)) + self.cb + if type(left) not in PRIMITIVES: + left.put(self.prop, target) + + ctx.stack.append(target + self.ca) + + +class DELETE(OP_CODE): + _params = ['name'] + + def __init__(self, name): + self.name = name + + def eval(self, ctx): + ctx.stack.append(ctx.delete(self.name)) + + +class DELETE_MEMBER(OP_CODE): + def eval(self, ctx): + prop = to_string(ctx.stack.pop()) + obj = to_object(ctx.stack.pop(), ctx) + ctx.stack.append(obj.delete(prop, False)) + + +# --------------------- BITWISE ---------------------- + + +class BINARY_OP(OP_CODE): + _params = ['operator'] + + def __init__(self, operator): + self.operator = operator + + def eval(self, ctx): + right = ctx.stack.pop() + left = ctx.stack.pop() + ctx.stack.append(BINARY_OPERATIONS[self.operator](left, right)) + + +# &&, || and conditional are implemented in bytecode + +# --------------------- JUMPS ---------------------- + + +# simple label that will be removed from code after compilation. labels ID will be translated +# to source code position. +class LABEL(OP_CODE): + _params = ['num'] + + def __init__(self, num): + self.num = num + + +# I implemented interpreter in the way that when an integer is returned by eval operation the execution will jump +# to the location of the label (it is loc = label_locations[label]) + + +class BASE_JUMP(OP_CODE): + _params = ['label'] + + def __init__(self, label): + self.label = label + + +class JUMP(BASE_JUMP): + def eval(self, ctx): + return self.label + + +class JUMP_IF_TRUE(BASE_JUMP): + def eval(self, ctx): + val = ctx.stack.pop() + if to_boolean(val): + return self.label + + +class JUMP_IF_EQ(BASE_JUMP): + # this one is used in switch statement - compares last 2 values using === operator and jumps popping both if true else pops last. + def eval(self, ctx): + cmp = ctx.stack.pop() + if strict_equality_op(ctx.stack[-1], cmp): + ctx.stack.pop() + return self.label + + +class JUMP_IF_TRUE_WITHOUT_POP(BASE_JUMP): + def eval(self, ctx): + val = ctx.stack[-1] + if to_boolean(val): + return self.label + + +class JUMP_IF_FALSE(BASE_JUMP): + def eval(self, ctx): + val = ctx.stack.pop() + if not to_boolean(val): + return self.label + + +class JUMP_IF_FALSE_WITHOUT_POP(BASE_JUMP): + def eval(self, ctx): + val = ctx.stack[-1] + if not to_boolean(val): + return self.label + + +class POP(OP_CODE): + def eval(self, ctx): + # todo remove this check later + assert len(ctx.stack), 'Popped from empty stack!' + del ctx.stack[-1] + + +# class REDUCE(OP_CODE): +# def eval(self, ctx): +# assert len(ctx.stack)==2 +# ctx.stack[0] = ctx.stack[1] +# del ctx.stack[1] + +# --------------- LOADING -------------- + + +class LOAD_NONE(OP_CODE): # be careful with this :) + _params = [] + + def eval(self, ctx): + ctx.stack.append(None) + + +class LOAD_N_TUPLE( + OP_CODE +): # loads the tuple composed of n last elements on stack. elements are popped. + _params = ['n'] + + def __init__(self, n): + self.n = n + + def eval(self, ctx): + tup = tuple(ctx.stack[-self.n:]) + del ctx.stack[-self.n:] + ctx.stack.append(tup) + + +class LOAD_UNDEFINED(OP_CODE): + def eval(self, ctx): + ctx.stack.append(undefined) + + +class LOAD_NULL(OP_CODE): + def eval(self, ctx): + ctx.stack.append(null) + + +class LOAD_BOOLEAN(OP_CODE): + _params = ['val'] + + def __init__(self, val): + assert val in (0, 1) + self.val = bool(val) + + def eval(self, ctx): + ctx.stack.append(self.val) + + +class LOAD_STRING(OP_CODE): + _params = ['val'] + + def __init__(self, val): + assert isinstance(val, basestring) + self.val = unicode(val) + + def eval(self, ctx): + ctx.stack.append(self.val) + + +class LOAD_NUMBER(OP_CODE): + _params = ['val'] + + def __init__(self, val): + assert isinstance(val, (float, int, long)) + self.val = float(val) + + def eval(self, ctx): + ctx.stack.append(self.val) + + +class LOAD_REGEXP(OP_CODE): + _params = ['body', 'flags'] + + def __init__(self, body, flags): + self.body = body + self.flags = flags + + def eval(self, ctx): + # we have to generate a new regexp - they are mutable + ctx.stack.append(ctx.space.NewRegExp(self.body, self.flags)) + + +class LOAD_FUNCTION(OP_CODE): + _params = ['start', 'params', 'name', 'is_declaration', 'definitions'] + + def __init__(self, start, params, name, is_declaration, definitions): + assert type(start) == int + self.start = start # its an ID of label pointing to the beginning of the function bytecode + self.params = params + self.name = name + self.is_declaration = bool(is_declaration) + self.definitions = tuple(set(definitions + params)) + + def eval(self, ctx): + ctx.stack.append( + ctx.space.NewFunction(self.start, ctx, self.params, self.name, + self.is_declaration, self.definitions)) + + +class LOAD_OBJECT(OP_CODE): + _params = [ + 'props' + ] # props are py string pairs (prop_name, kind): kind can be either i, g or s. (init, get, set) + + def __init__(self, props): + self.num = len(props) + self.props = props + + def eval(self, ctx): + obj = ctx.space.NewObject() + if self.num: + obj._init(self.props, ctx.stack[-self.num:]) + del ctx.stack[-self.num:] + + ctx.stack.append(obj) + + +class LOAD_ARRAY(OP_CODE): + _params = ['num'] + + def __init__(self, num): + self.num = num + + def eval(self, ctx): + arr = ctx.space.NewArray(self.num) + if self.num: + arr._init(ctx.stack[-self.num:]) + del ctx.stack[-self.num:] + ctx.stack.append(arr) + + +class LOAD_THIS(OP_CODE): + def eval(self, ctx): + ctx.stack.append(ctx.THIS_BINDING) + + +class LOAD(OP_CODE): # todo check! + _params = ['identifier'] + + def __init__(self, identifier): + self.identifier = identifier + + # 11.1.2 + def eval(self, ctx): + ctx.stack.append(ctx.get(self.identifier, throw=True)) + + +class LOAD_MEMBER(OP_CODE): + def eval(self, ctx): + prop = ctx.stack.pop() + obj = ctx.stack.pop() + ctx.stack.append(get_member(obj, prop, ctx.space)) + + +class LOAD_MEMBER_DOT(OP_CODE): + _params = ['prop'] + + def __init__(self, prop): + self.prop = prop + + def eval(self, ctx): + obj = ctx.stack.pop() + ctx.stack.append(get_member_dot(obj, self.prop, ctx.space)) + + +# --------------- STORING -------------- + + +class STORE(OP_CODE): + _params = ['identifier'] + + def __init__(self, identifier): + self.identifier = identifier + + def eval(self, ctx): + value = ctx.stack[-1] # don't pop + ctx.put(self.identifier, value) + + +class STORE_MEMBER(OP_CODE): + def eval(self, ctx): + value = ctx.stack.pop() + name = ctx.stack.pop() + left = ctx.stack.pop() + + typ = type(left) + if typ in PRIMITIVES: + prop = to_string(name) + if typ == NULL_TYPE: + raise MakeError('TypeError', + "Cannot set property '%s' of null" % prop) + elif typ == UNDEFINED_TYPE: + raise MakeError('TypeError', + "Cannot set property '%s' of undefined" % prop) + # just ignore... + else: + left.put_member(name, value) + + ctx.stack.append(value) + + +class STORE_MEMBER_DOT(OP_CODE): + _params = ['prop'] + + def __init__(self, prop): + self.prop = prop + + def eval(self, ctx): + value = ctx.stack.pop() + left = ctx.stack.pop() + + typ = type(left) + if typ in PRIMITIVES: + if typ == NULL_TYPE: + raise MakeError('TypeError', + "Cannot set property '%s' of null" % self.prop) + elif typ == UNDEFINED_TYPE: + raise MakeError( + 'TypeError', + "Cannot set property '%s' of undefined" % self.prop) + # just ignore... + else: + left.put(self.prop, value) + ctx.stack.append(value) + + +class STORE_OP(OP_CODE): + _params = ['identifier', 'op'] + + def __init__(self, identifier, op): + self.identifier = identifier + self.op = op + + def eval(self, ctx): + value = ctx.stack.pop() + new_value = BINARY_OPERATIONS[self.op](ctx.get(self.identifier), value) + ctx.put(self.identifier, new_value) + ctx.stack.append(new_value) + + +class STORE_MEMBER_OP(OP_CODE): + _params = ['op'] + + def __init__(self, op): + self.op = op + + def eval(self, ctx): + value = ctx.stack.pop() + name = ctx.stack.pop() + left = ctx.stack.pop() + + typ = type(left) + if typ in PRIMITIVES: + if typ is NULL_TYPE: + raise MakeError( + 'TypeError', + "Cannot set property '%s' of null" % to_string(name)) + elif typ is UNDEFINED_TYPE: + raise MakeError( + 'TypeError', + "Cannot set property '%s' of undefined" % to_string(name)) + ctx.stack.append(BINARY_OPERATIONS[self.op](get_member( + left, name, ctx.space), value)) + return + else: + ctx.stack.append(BINARY_OPERATIONS[self.op](get_member( + left, name, ctx.space), value)) + left.put_member(name, ctx.stack[-1]) + + +class STORE_MEMBER_DOT_OP(OP_CODE): + _params = ['prop', 'op'] + + def __init__(self, prop, op): + self.prop = prop + self.op = op + + def eval(self, ctx): + value = ctx.stack.pop() + left = ctx.stack.pop() + + typ = type(left) + if typ in PRIMITIVES: + if typ == NULL_TYPE: + raise MakeError('TypeError', + "Cannot set property '%s' of null" % self.prop) + elif typ == UNDEFINED_TYPE: + raise MakeError( + 'TypeError', + "Cannot set property '%s' of undefined" % self.prop) + ctx.stack.append(BINARY_OPERATIONS[self.op](get_member_dot( + left, self.prop, ctx.space), value)) + return + else: + ctx.stack.append(BINARY_OPERATIONS[self.op](get_member_dot( + left, self.prop, ctx.space), value)) + left.put(self.prop, ctx.stack[-1]) + + +# --------------- CALLS -------------- + + +def bytecode_call(ctx, func, this, args): + if type(func) is not PyJsFunction: + raise MakeError('TypeError', "%s is not a function" % Type(func)) + if func.is_native: # call to built-in function or method + ctx.stack.append(func.call(this, args)) + return None + + # therefore not native. we have to return (new_context, function_label) to instruct interpreter to call + return func._generate_my_context(this, args), func.code + + +class CALL(OP_CODE): + def eval(self, ctx): + args = ctx.stack.pop() + func = ctx.stack.pop() + + return bytecode_call(ctx, func, ctx.space.GlobalObj, args) + + +class CALL_METHOD(OP_CODE): + def eval(self, ctx): + args = ctx.stack.pop() + prop = ctx.stack.pop() + base = ctx.stack.pop() + + func = get_member(base, prop, ctx.space) + + return bytecode_call(ctx, func, base, args) + + +class CALL_METHOD_DOT(OP_CODE): + _params = ['prop'] + + def __init__(self, prop): + self.prop = prop + + def eval(self, ctx): + args = ctx.stack.pop() + base = ctx.stack.pop() + + func = get_member_dot(base, self.prop, ctx.space) + + return bytecode_call(ctx, func, base, args) + + +class CALL_NO_ARGS(OP_CODE): + def eval(self, ctx): + func = ctx.stack.pop() + + return bytecode_call(ctx, func, ctx.space.GlobalObj, ()) + + +class CALL_METHOD_NO_ARGS(OP_CODE): + def eval(self, ctx): + prop = ctx.stack.pop() + base = ctx.stack.pop() + + func = get_member(base, prop, ctx.space) + + return bytecode_call(ctx, func, base, ()) + + +class CALL_METHOD_DOT_NO_ARGS(OP_CODE): + _params = ['prop'] + + def __init__(self, prop): + self.prop = prop + + def eval(self, ctx): + base = ctx.stack.pop() + + func = get_member_dot(base, self.prop, ctx.space) + + return bytecode_call(ctx, func, base, ()) + + +class NOP(OP_CODE): + def eval(self, ctx): + pass + + +class RETURN(OP_CODE): + def eval( + self, ctx + ): # remember to load the return value on stack before using RETURN op. + return (None, None) + + +class NEW(OP_CODE): + def eval(self, ctx): + args = ctx.stack.pop() + constructor = ctx.stack.pop() + if type(constructor) in PRIMITIVES or not hasattr( + constructor, 'create'): + raise MakeError('TypeError', + '%s is not a constructor' % Type(constructor)) + ctx.stack.append(constructor.create(args, space=ctx.space)) + + +class NEW_NO_ARGS(OP_CODE): + def eval(self, ctx): + constructor = ctx.stack.pop() + if type(constructor) in PRIMITIVES or not hasattr( + constructor, 'create'): + raise MakeError('TypeError', + '%s is not a constructor' % Type(constructor)) + ctx.stack.append(constructor.create((), space=ctx.space)) + + +# --------------- EXCEPTIONS -------------- + + +class THROW(OP_CODE): + def eval(self, ctx): + raise MakeError(None, None, ctx.stack.pop()) + + +class TRY_CATCH_FINALLY(OP_CODE): + _params = [ + 'try_label', 'catch_label', 'catch_variable', 'finally_label', + 'finally_present', 'end_label' + ] + + def __init__(self, try_label, catch_label, catch_variable, finally_label, + finally_present, end_label): + self.try_label = try_label + self.catch_label = catch_label + self.catch_variable = catch_variable + self.finally_label = finally_label + self.finally_present = finally_present + self.end_label = end_label + + def eval(self, ctx): + # 4 different exectution results + # 0=normal, 1=return, 2=jump_outside, 3=errors + # execute_fragment_under_context returns: + # (return_value, typ, jump_loc/error) + + ctx.stack.pop() + + # execute try statement + try_status = ctx.space.exe.execute_fragment_under_context( + ctx, self.try_label, self.catch_label) + + errors = try_status[1] == 3 + + # catch + if errors and self.catch_variable is not None: + # generate catch block context... + catch_context = Scope({ + self.catch_variable: + try_status[2].get_thrown_value(ctx.space) + }, ctx.space, ctx) + catch_context.THIS_BINDING = ctx.THIS_BINDING + catch_status = ctx.space.exe.execute_fragment_under_context( + catch_context, self.catch_label, self.finally_label) + else: + catch_status = None + + # finally + if self.finally_present: + finally_status = ctx.space.exe.execute_fragment_under_context( + ctx, self.finally_label, self.end_label) + else: + finally_status = None + + # now return controls + other_status = catch_status or try_status + if finally_status is None or (finally_status[1] == 0 + and other_status[1] != 0): + winning_status = other_status + else: + winning_status = finally_status + + val, typ, spec = winning_status + if typ == 0: # normal + ctx.stack.append(val) + return + elif typ == 1: # return + ctx.stack.append(spec) + return None, None # send return signal + elif typ == 2: # jump outside + ctx.stack.append(val) + return spec + elif typ == 3: + # throw is made with empty stack as usual + raise spec + else: + raise RuntimeError('Invalid return code') + + +# ------------ WITH + ITERATORS ---------- + + +class WITH(OP_CODE): + _params = ['beg_label', 'end_label'] + + def __init__(self, beg_label, end_label): + self.beg_label = beg_label + self.end_label = end_label + + def eval(self, ctx): + obj = to_object(ctx.stack.pop(), ctx.space) + + with_context = Scope( + obj, ctx.space, ctx) # todo actually use the obj to modify the ctx + with_context.THIS_BINDING = ctx.THIS_BINDING + status = ctx.space.exe.execute_fragment_under_context( + with_context, self.beg_label, self.end_label) + + val, typ, spec = status + + if typ != 3: # exception + ctx.stack.pop() + + if typ == 0: # normal + ctx.stack.append(val) + return + elif typ == 1: # return + ctx.stack.append(spec) + return None, None # send return signal + elif typ == 2: # jump outside + ctx.stack.append(val) + return spec + elif typ == 3: # exception + # throw is made with empty stack as usual + raise spec + else: + raise RuntimeError('Invalid return code') + + +class FOR_IN(OP_CODE): + _params = ['name', 'body_start_label', 'continue_label', 'break_label'] + + def __init__(self, name, body_start_label, continue_label, break_label): + self.name = name + self.body_start_label = body_start_label + self.continue_label = continue_label + self.break_label = break_label + + def eval(self, ctx): + iterable = ctx.stack.pop() + if is_null(iterable) or is_undefined(iterable): + ctx.stack.pop() + ctx.stack.append(undefined) + return self.break_label + + obj = to_object(iterable, ctx.space) + + for e in sorted(obj.own): + if not obj.own[e]['enumerable']: + continue + + ctx.put( + self.name, e + ) # JS would have been so much nicer if this was ctx.space.put(self.name, obj.get(e)) + + # evaluate the body + status = ctx.space.exe.execute_fragment_under_context( + ctx, self.body_start_label, self.break_label) + + val, typ, spec = status + + if typ != 3: # exception + ctx.stack.pop() + + if typ == 0: # normal + ctx.stack.append(val) + continue + elif typ == 1: # return + ctx.stack.append(spec) + return None, None # send return signal + elif typ == 2: # jump outside + # now have to figure out whether this is a continue or something else... + ctx.stack.append(val) + if spec == self.continue_label: + # just a continue, perform next iteration as normal + continue + return spec # break or smth, go there and finish the iteration + elif typ == 3: # exception + # throw is made with empty stack as usual + raise spec + else: + raise RuntimeError('Invalid return code') + + return self.break_label + + +# all opcodes... +OP_CODES = {} +g = '' +for g in globals(): + try: + if not issubclass(globals()[g], OP_CODE) or g is 'OP_CODE': + continue + except: + continue + OP_CODES[g] = globals()[g] diff --git a/Contents/Libraries/Shared/js2py/internals/operations.py b/Contents/Libraries/Shared/js2py/internals/operations.py new file mode 100644 index 000000000..d9875088c --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/operations.py @@ -0,0 +1,314 @@ +from __future__ import unicode_literals +from simplex import * +from conversions import * + +# ------------------------------------------------------------------------------ +# Unary operations + + +# -x +def minus_uop(self): + return -to_number(self) + + +# +x +def plus_uop(self): # +u + return to_number(self) + + +# !x +def logical_negation_uop(self): # !u cant do 'not u' :( + return not to_boolean(self) + + +# typeof x +def typeof_uop(self): + if is_callable(self): + return u'function' + typ = Type(self).lower() + if typ == u'null': + typ = u'object' # absolutely idiotic... + return typ + + +# ~u +def bit_invert_uop(self): + return float(to_int32(float(~to_int32(self)))) + + +# void +def void_op(self): + return undefined + + +UNARY_OPERATIONS = { + '+': plus_uop, + '-': minus_uop, + '!': logical_negation_uop, + '~': bit_invert_uop, + 'void': void_op, + 'typeof': + typeof_uop, # this one only for member expressions! for identifiers its slightly different... +} + +# ------------------------------------------------------------------------------ +# ----- binary ops ------- + +# Bitwise operators +# <<, >>, &, ^, |, ~ + + +# << +def bit_lshift_op(self, other): + lnum = to_int32(self) + rnum = to_uint32(other) + shiftCount = rnum & 0x1F + return float(to_int32(float(lnum << shiftCount))) + + +# >> +def bit_rshift_op(self, other): + lnum = to_int32(self) + rnum = to_uint32(other) + shiftCount = rnum & 0x1F + return float(to_int32(float(lnum >> shiftCount))) + + +# >>> +def bit_bshift_op(self, other): + lnum = to_uint32(self) + rnum = to_uint32(other) + shiftCount = rnum & 0x1F + return float(to_uint32(float(lnum >> shiftCount))) + + +# & +def bit_and_op(self, other): + lnum = to_int32(self) + rnum = to_int32(other) + return float(to_int32(float(lnum & rnum))) + + +# ^ +def bit_xor_op(self, other): + lnum = to_int32(self) + rnum = to_int32(other) + return float(to_int32(float(lnum ^ rnum))) + + +# | +def bit_or_op(self, other): + lnum = to_int32(self) + rnum = to_int32(other) + return float(to_int32(float(lnum | rnum))) + + +# Additive operators +# + and - are implemented here + + +# + +def add_op(self, other): + if type(self) is float and type(other) is float: + return self + other + if type(self) is unicode and type(other) is unicode: + return self + other + # standard way... + a = to_primitive(self) + b = to_primitive(other) + if type(a) is unicode or type(b) is unicode: # string wins hehe + return to_string(a) + to_string(b) + return to_number(a) + to_number(b) + + +# - +def sub_op(self, other): + return to_number(self) - to_number(other) + + +# Multiplicative operators +# *, / and % are implemented here + + +# * +def mul_op(self, other): + return to_number(self) * to_number(other) + + +# / +def div_op(self, other): + a = to_number(self) + b = to_number(other) + if b: + return a / float(b) # ensure at least one is a float. + if not a or a != a: + return NaN + return Infinity if a > 0 else -Infinity + + +# % +def mod_op(self, other): + a = to_number(self) + b = to_number(other) + if abs(a) == Infinity or not b: + return NaN + if abs(b) == Infinity: + return a + pyres = a % b # different signs in python and javascript + # python has the same sign as b and js has the same + # sign as a. + if a < 0 and pyres > 0: + pyres -= abs(b) + elif a > 0 and pyres < 0: + pyres += abs(b) + return float(pyres) + + +# Comparisons +# <, <=, !=, ==, >=, > are implemented here. +def abstract_relational_comparison(self, other, + self_first=True): # todo speed up! + ''' self<other if self_first else other<self. + Returns the result of the question: is self smaller than other? + in case self_first is false it returns the answer of: + is other smaller than self. + result is PyJs type: bool or undefined''' + + px = to_primitive(self, 'Number') + py = to_primitive(other, 'Number') + if not self_first: # reverse order + px, py = py, px + if not (Type(px) == 'String' and Type(py) == 'String'): + px, py = to_number(px), to_number(py) + if is_nan(px) or is_nan(py): + return None # watch out here! + return px < py # same cmp algorithm + else: + # I am pretty sure that python has the same + # string cmp algorithm but I have to confirm it + return px < py + + +# < +def less_op(self, other): + res = abstract_relational_comparison(self, other, True) + if res is None: + return False + return res + + +# <= +def less_eq_op(self, other): + res = abstract_relational_comparison(self, other, False) + if res is None: + return False + return not res + + +# >= +def greater_eq_op(self, other): + res = abstract_relational_comparison(self, other, True) + if res is None: + return False + return not res + + +# > +def greater_op(self, other): + res = abstract_relational_comparison(self, other, False) + if res is None: + return False + return res + + +# equality + + +def abstract_equality_op(self, other): + ''' returns the result of JS == compare. + result is PyJs type: bool''' + tx, ty = Type(self), Type(other) + if tx == ty: + if tx == 'Undefined' or tx == 'Null': + return True + if tx == 'Number' or tx == 'String' or tx == 'Boolean': + return self == other + return self is other # Object + elif (tx == 'Undefined' and ty == 'Null') or (ty == 'Undefined' + and tx == 'Null'): + return True + elif tx == 'Number' and ty == 'String': + return abstract_equality_op(self, to_number(other)) + elif tx == 'String' and ty == 'Number': + return abstract_equality_op(to_number(self), other) + elif tx == 'Boolean': + return abstract_equality_op(to_number(self), other) + elif ty == 'Boolean': + return abstract_equality_op(self, to_number(other)) + elif (tx == 'String' or tx == 'Number') and is_object(other): + return abstract_equality_op(self, to_primitive(other)) + elif (ty == 'String' or ty == 'Number') and is_object(self): + return abstract_equality_op(to_primitive(self), other) + else: + return False + + +def abstract_inequality_op(self, other): + return not abstract_equality_op(self, other) + + +def strict_equality_op(self, other): + typ = Type(self) + if typ != Type(other): + return False + if typ == 'Undefined' or typ == 'Null': + return True + if typ == 'Boolean' or typ == 'String' or typ == 'Number': + return self == other + else: # object + return self is other # Id compare. + + +def strict_inequality_op(self, other): + return not strict_equality_op(self, other) + + +def instanceof_op(self, other): + '''checks if self is instance of other''' + if not hasattr(other, 'has_instance'): + return False + return other.has_instance(self) + + +def in_op(self, other): + '''checks if self is in other''' + if not is_object(other): + raise MakeError( + 'TypeError', + "You can\'t use 'in' operator to search in non-objects") + return other.has_property(to_string(self)) + + +BINARY_OPERATIONS = { + '+': add_op, + '-': sub_op, + '*': mul_op, + '/': div_op, + '%': mod_op, + '<<': bit_lshift_op, + '>>': bit_rshift_op, + '>>>': bit_bshift_op, + '|': bit_or_op, + '&': bit_and_op, + '^': bit_xor_op, + '==': abstract_equality_op, + '!=': abstract_inequality_op, + '===': strict_equality_op, + '!==': strict_inequality_op, + '<': less_op, + '<=': less_eq_op, + '>': greater_op, + '>=': greater_eq_op, + 'in': in_op, + 'instanceof': instanceof_op, +} diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/__init__.py b/Contents/Libraries/Shared/js2py/internals/prototypes/__init__.py new file mode 100644 index 000000000..8de79cb9d --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/__init__.py @@ -0,0 +1 @@ +__author__ = 'Piotr Dabkowski' diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsarray.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsarray.py new file mode 100644 index 000000000..ace774ece --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsarray.py @@ -0,0 +1,489 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * +from ..operations import strict_equality_op + +import six + +if six.PY3: + xrange = range + import functools + +ARR_STACK = set({}) + + +class ArrayPrototype: + def toString(this, args): + arr = to_object(this, args.space) + func = arr.get('join') + if not is_callable(func): + return u'[object %s]' % GetClass(arr) + return func.call(this, ()) + + def toLocaleString(this, args): + array = to_object(this, args.space) + arr_len = js_arr_length(array) + # separator is simply a comma ',' + if not arr_len: + return '' + res = [] + for i in xrange(arr_len): + element = array.get(unicode(i)) + if is_undefined(element) or is_null(element): + res.append('') + else: + cand = to_object(element, args.space) + str_func = cand.get('toLocaleString') + if not is_callable(str_func): + raise MakeError( + 'TypeError', + 'toLocaleString method of item at index %d is not callable' + % i) + res.append(to_string(str_func.call(cand, ()))) + return ','.join(res) + + def concat(this, args): + array = to_object(this, args.space) + items = [array] + items.extend(tuple(args)) + A = [] + for E in items: + if GetClass(E) == 'Array': + k = 0 + e_len = js_arr_length(E) + while k < e_len: + if E.has_property(unicode(k)): + A.append(E.get(unicode(k))) + k += 1 + else: + A.append(E) + return args.space.ConstructArray(A) + + def join(this, args): + ARR_STACK.add(this) + array = to_object(this, args.space) + separator = get_arg(args, 0) + arr_len = js_arr_length(array) + separator = ',' if is_undefined(separator) else to_string(separator) + elems = [] + for e in xrange(arr_len): + elem = array.get(unicode(e)) + if elem in ARR_STACK: + s = '' + else: + s = to_string(elem) + elems.append( + s if not (is_undefined(elem) or is_null(elem)) else '') + res = separator.join(elems) + ARR_STACK.remove(this) + return res + + def pop(this, args): #todo check + array = to_object(this, args.space) + arr_len = js_arr_length(array) + if not arr_len: + array.put('length', float(arr_len)) + return undefined + ind = unicode(arr_len - 1) + element = array.get(ind) + array.delete(ind) + array.put('length', float(arr_len - 1)) + return element + + def push(this, args): + array = to_object(this, args.space) + arr_len = js_arr_length(array) + to_put = tuple(args) + i = arr_len + for i, e in enumerate(to_put, arr_len): + array.put(unicode(i), e, True) + array.put('length', float(arr_len + len(to_put)), True) + return float(i) + + def reverse(this, args): + array = to_object(this, args.space) + vals = js_array_to_list(array) + has_props = [ + array.has_property(unicode(e)) + for e in xrange(js_arr_length(array)) + ] + vals.reverse() + has_props.reverse() + for i, val in enumerate(vals): + if has_props[i]: + array.put(unicode(i), val) + else: + array.delete(unicode(i)) + return array + + def shift(this, args): + array = to_object(this, args.space) + arr_len = js_arr_length(array) + if not arr_len: + array.put('length', 0.) + return undefined + first = array.get('0') + for k in xrange(1, arr_len): + from_s, to_s = unicode(k), unicode(k - 1) + if array.has_property(from_s): + array.put(to_s, array.get(from_s)) + else: + array.delete(to_s) + array.delete(unicode(arr_len - 1)) + array.put('length', float(arr_len - 1)) + return first + + def slice(this, args): # todo check + array = to_object(this, args.space) + start = get_arg(args, 0) + end = get_arg(args, 1) + arr_len = js_arr_length(array) + relative_start = to_int(start) + k = max((arr_len + relative_start), 0) if relative_start < 0 else min( + relative_start, arr_len) + relative_end = arr_len if is_undefined(end) else to_int(end) + final = max((arr_len + relative_end), 0) if relative_end < 0 else min( + relative_end, arr_len) + res = [] + n = 0 + while k < final: + pk = unicode(k) + if array.has_property(pk): + res.append(array.get(pk)) + k += 1 + n += 1 + return args.space.ConstructArray(res) + + def sort( + this, args + ): # todo: this assumes array continous (not sparse) - fix for sparse arrays + cmpfn = get_arg(args, 0) + if not GetClass(this) in ('Array', 'Arguments'): + return to_object(this, args.space) # do nothing + arr_len = js_arr_length(this) + if not arr_len: + return this + arr = [ + (this.get(unicode(e)) if this.has_property(unicode(e)) else None) + for e in xrange(arr_len) + ] + if not is_callable(cmpfn): + cmpfn = None + cmp = lambda a, b: sort_compare(a, b, cmpfn) + if six.PY3: + key = functools.cmp_to_key(cmp) + arr.sort(key=key) + else: + arr.sort(cmp=cmp) + for i in xrange(arr_len): + if arr[i] is None: + this.delete(unicode(i)) + else: + this.put(unicode(i), arr[i]) + return this + + def splice(this, args): + # 1-8 + array = to_object(this, args.space) + start = get_arg(args, 0) + deleteCount = get_arg(args, 1) + arr_len = js_arr_length(this) + relative_start = to_int(start) + actual_start = max( + (arr_len + relative_start), 0) if relative_start < 0 else min( + relative_start, arr_len) + actual_delete_count = min( + max(to_int(deleteCount), 0), arr_len - actual_start) + k = 0 + A = args.space.NewArray(0) + # 9 + while k < actual_delete_count: + if array.has_property(unicode(actual_start + k)): + A.put(unicode(k), array.get(unicode(actual_start + k))) + k += 1 + # 10-11 + items = list(args)[2:] + items_len = len(items) + # 12 + if items_len < actual_delete_count: + k = actual_start + while k < (arr_len - actual_delete_count): + fr = unicode(k + actual_delete_count) + to = unicode(k + items_len) + if array.has_property(fr): + array.put(to, array.get(fr)) + else: + array.delete(to) + k += 1 + k = arr_len + while k > (arr_len - actual_delete_count + items_len): + array.delete(unicode(k - 1)) + k -= 1 + # 13 + elif items_len > actual_delete_count: + k = arr_len - actual_delete_count + while k > actual_start: + fr = unicode(k + actual_delete_count - 1) + to = unicode(k + items_len - 1) + if array.has_property(fr): + array.put(to, array.get(fr)) + else: + array.delete(to) + k -= 1 + # 14-17 + k = actual_start + while items: + E = items.pop(0) + array.put(unicode(k), E) + k += 1 + array.put('length', float(arr_len - actual_delete_count + items_len)) + return A + + def unshift(this, args): + array = to_object(this, args.space) + arr_len = js_arr_length(array) + argCount = len(args) + k = arr_len + while k > 0: + fr = unicode(k - 1) + to = unicode(k + argCount - 1) + if array.has_property(fr): + array.put(to, array.get(fr)) + else: + array.delete(to) + k -= 1 + items = tuple(args) + for j, e in enumerate(items): + array.put(unicode(j), e) + array.put('length', float(arr_len + argCount)) + return float(arr_len + argCount) + + def indexOf(this, args): + array = to_object(this, args.space) + searchElement = get_arg(args, 0) + arr_len = js_arr_length(array) + if arr_len == 0: + return -1. + if len(args) > 1: + n = to_int(args[1]) + else: + n = 0 + if n >= arr_len: + return -1. + if n >= 0: + k = n + else: + k = arr_len - abs(n) + if k < 0: + k = 0 + while k < arr_len: + if array.has_property(unicode(k)): + elementK = array.get(unicode(k)) + if strict_equality_op(searchElement, elementK): + return float(k) + k += 1 + return -1. + + def lastIndexOf(this, args): + array = to_object(this, args.space) + searchElement = get_arg(args, 0) + arr_len = js_arr_length(array) + if arr_len == 0: + return -1. + if len(args) > 1: + n = to_int(args[1]) + else: + n = arr_len - 1 + if n >= 0: + k = min(n, arr_len - 1) + else: + k = arr_len - abs(n) + while k >= 0: + if array.has_property(unicode(k)): + elementK = array.get(unicode(k)) + if strict_equality_op(searchElement, elementK): + return float(k) + k -= 1 + return -1. + + def every(this, args): + array = to_object(this, args.space) + callbackfn = get_arg(args, 0) + arr_len = js_arr_length(array) + if not is_callable(callbackfn): + raise MakeError('TypeError', 'callbackfn must be a function') + T = get_arg(args, 1) + k = 0 + while k < arr_len: + if array.has_property(unicode(k)): + kValue = array.get(unicode(k)) + if not to_boolean( + callbackfn.call(T, (kValue, float(k), array))): + return False + k += 1 + return True + + def some(this, args): + array = to_object(this, args.space) + callbackfn = get_arg(args, 0) + arr_len = js_arr_length(array) + if not is_callable(callbackfn): + raise MakeError('TypeError', 'callbackfn must be a function') + T = get_arg(args, 1) + k = 0 + while k < arr_len: + if array.has_property(unicode(k)): + kValue = array.get(unicode(k)) + if to_boolean(callbackfn.call(T, (kValue, float(k), array))): + return True + k += 1 + return False + + def forEach(this, args): + array = to_object(this, args.space) + callbackfn = get_arg(args, 0) + arr_len = js_arr_length(array) + if not is_callable(callbackfn): + raise MakeError('TypeError', 'callbackfn must be a function') + _this = get_arg(args, 1) + k = 0 + while k < arr_len: + sk = unicode(k) + if array.has_property(sk): + kValue = array.get(sk) + callbackfn.call(_this, (kValue, float(k), array)) + k += 1 + return undefined + + def map(this, args): + array = to_object(this, args.space) + callbackfn = get_arg(args, 0) + arr_len = js_arr_length(array) + if not is_callable(callbackfn): + raise MakeError('TypeError', 'callbackfn must be a function') + _this = get_arg(args, 1) + k = 0 + A = args.space.NewArray(0) + while k < arr_len: + Pk = unicode(k) + if array.has_property(Pk): + kValue = array.get(Pk) + mappedValue = callbackfn.call(_this, (kValue, float(k), array)) + A.define_own_property( + Pk, { + 'value': mappedValue, + 'writable': True, + 'enumerable': True, + 'configurable': True + }, False) + k += 1 + return A + + def filter(this, args): + array = to_object(this, args.space) + callbackfn = get_arg(args, 0) + arr_len = js_arr_length(array) + if not is_callable(callbackfn): + raise MakeError('TypeError', 'callbackfn must be a function') + _this = get_arg(args, 1) + k = 0 + res = [] + while k < arr_len: + if array.has_property(unicode(k)): + kValue = array.get(unicode(k)) + if to_boolean( + callbackfn.call(_this, (kValue, float(k), array))): + res.append(kValue) + k += 1 + return args.space.ConstructArray(res) + + def reduce(this, args): + array = to_object(this, args.space) + callbackfn = get_arg(args, 0) + arr_len = js_arr_length(array) + if not is_callable(callbackfn): + raise MakeError('TypeError', 'callbackfn must be a function') + if not arr_len and len(args) < 2: + raise MakeError('TypeError', + 'Reduce of empty array with no initial value') + k = 0 + accumulator = undefined + if len(args) > 1: # initial value present + accumulator = args[1] + else: + kPresent = False + while not kPresent and k < arr_len: + kPresent = array.has_property(unicode(k)) + if kPresent: + accumulator = array.get(unicode(k)) + k += 1 + if not kPresent: + raise MakeError('TypeError', + 'Reduce of empty array with no initial value') + while k < arr_len: + if array.has_property(unicode(k)): + kValue = array.get(unicode(k)) + accumulator = callbackfn.call( + undefined, (accumulator, kValue, float(k), array)) + k += 1 + return accumulator + + def reduceRight(this, args): + array = to_object(this, args.space) + callbackfn = get_arg(args, 0) + arr_len = js_arr_length(array) + if not is_callable(callbackfn): + raise MakeError('TypeError', 'callbackfn must be a function') + if not arr_len and len(args) < 2: + raise MakeError('TypeError', + 'Reduce of empty array with no initial value') + k = arr_len - 1 + accumulator = undefined + + if len(args) > 1: # initial value present + accumulator = args[1] + else: + kPresent = False + while not kPresent and k >= 0: + kPresent = array.has_property(unicode(k)) + if kPresent: + accumulator = array.get(unicode(k)) + k -= 1 + if not kPresent: + raise MakeError('TypeError', + 'Reduce of empty array with no initial value') + while k >= 0: + if array.has_property(unicode(k)): + kValue = array.get(unicode(k)) + accumulator = callbackfn.call( + undefined, (accumulator, kValue, float(k), array)) + k -= 1 + return accumulator + + +def sort_compare(a, b, comp): + if a is None: + if b is None: + return 0 + return 1 + if b is None: + if a is None: + return 0 + return -1 + if is_undefined(a): + if is_undefined(b): + return 0 + return 1 + if is_undefined(b): + if is_undefined(a): + return 0 + return -1 + if comp is not None: + res = comp.call(undefined, (a, b)) + return to_int(res) + x, y = to_string(a), to_string(b) + if x < y: + return -1 + elif x > y: + return 1 + return 0 diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsboolean.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsboolean.py new file mode 100644 index 000000000..9aff9d2e8 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsboolean.py @@ -0,0 +1,22 @@ +from __future__ import unicode_literals + +from ..conversions import * +from ..func_utils import * + + +class BooleanPrototype: + def toString(this, args): + if GetClass(this) != 'Boolean': + raise MakeError('TypeError', + 'Boolean.prototype.toString is not generic') + if is_object(this): + this = this.value + return u'true' if this else u'false' + + def valueOf(this, args): + if GetClass(this) != 'Boolean': + raise MakeError('TypeError', + 'Boolean.prototype.valueOf is not generic') + if is_object(this): + this = this.value + return this diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jserror.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jserror.py new file mode 100644 index 000000000..c58dec498 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jserror.py @@ -0,0 +1,15 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * + + +class ErrorPrototype: + def toString(this, args): + if Type(this) != 'Object': + raise MakeError('TypeError', + 'Error.prototype.toString called on non-object') + name = this.get('name') + name = u'Error' if is_undefined(name) else to_string(name) + msg = this.get('message') + msg = '' if is_undefined(msg) else to_string(msg) + return name + (name and msg and ': ') + msg diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsfunction.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsfunction.py new file mode 100644 index 000000000..06ec68014 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsfunction.py @@ -0,0 +1,61 @@ +from __future__ import unicode_literals + +from ..conversions import * +from ..func_utils import * + +# python 3 support +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + +# todo fix apply and bind + + +class FunctionPrototype: + def toString(this, args): + if not is_callable(this): + raise MakeError('TypeError', + 'Function.prototype.toString is not generic') + + args = u', '.join(map(unicode, this.params)) + return u'function %s(%s) { [native code] }' % (this.name if this.name + else u'', args) + + def call(this, args): + if not is_callable(this): + raise MakeError('TypeError', + 'Function.prototype.call is not generic') + _this = get_arg(args, 0) + _args = tuple(args)[1:] + return this.call(_this, _args) + + def apply(this, args): + if not is_callable(this): + raise MakeError('TypeError', + 'Function.prototype.apply is not generic') + _args = get_arg(args, 1) + if not is_object(_args): + raise MakeError( + 'TypeError', + 'argList argument to Function.prototype.apply must an Object') + _this = get_arg(args, 0) + return this.call(_this, js_array_to_tuple(_args)) + + def bind(this, args): + if not is_callable(this): + raise MakeError('TypeError', + 'Function.prototype.bind is not generic') + bound_this = get_arg(args, 0) + bound_args = tuple(args)[1:] + + def bound(dummy_this, extra_args): + return this.call(bound_this, bound_args + tuple(extra_args)) + + js_bound = args.space.NewFunction(bound, this.ctx, (), u'', False, ()) + js_bound.put(u'length', + float(max(len(this.params) - len(bound_args), 0.))) + js_bound.put(u'name', u'boundFunc') + return js_bound diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsjson.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsjson.py new file mode 100644 index 000000000..87dc5f389 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsjson.py @@ -0,0 +1,205 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * +from ..operations import strict_equality_op +import json + +indent = '' +# python 3 support +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + + +def parse(this, args): + text, reviver = get_arg(args, 0), get_arg(args, 1) + s = to_string(text) + try: + unfiltered = json.loads(s) + except: + raise MakeError( + 'SyntaxError', + 'JSON.parse could not parse JSON string - Invalid syntax') + unfiltered = to_js(unfiltered, args.space) + if is_callable(reviver): + root = args.space.ConstructObject({'': unfiltered}) + return walk(root, '', reviver) + else: + return unfiltered + + +def stringify(this, args): + global indent + value, replacer, space = get_arg(args, 0), get_arg(args, 1), get_arg( + args, 2) + stack = set([]) + indent = '' + property_list = replacer_function = undefined + if is_object(replacer): + if is_callable(replacer): + replacer_function = replacer + elif replacer.Class == 'Array': + property_list = [] + for e in replacer: + v = replacer[e] + item = undefined + typ = Type(v) + if typ == 'Number': + item = to_string(v) + elif typ == 'String': + item = v + elif typ == 'Object': + if GetClass(v) in ('String', 'Number'): + item = to_string(v) + if not is_undefined(item) and item not in property_list: + property_list.append(item) + if is_object(space): + if GetClass(space) == 'Number': + space = to_number(space) + elif GetClass(space) == 'String': + space = to_string(space) + if Type(space) == 'Number': + space = min(10, to_int(space)) + gap = max(int(space), 0) * ' ' + elif Type(space) == 'String': + gap = space[:10] + else: + gap = '' + return Str('', args.space.ConstructObject({ + '': value + }), replacer_function, property_list, gap, stack, space) + + +def Str(key, holder, replacer_function, property_list, gap, stack, space): + value = holder.get(key) + if is_object(value): + to_json = value.get('toJSON') + if is_callable(to_json): + value = to_json.call(value, (key, )) + if not is_undefined(replacer_function): + value = replacer_function.call(holder, (key, value)) + + if is_object(value): + if value.Class == 'String': + value = to_string(value) + elif value.Class == 'Number': + value = to_number(value) + elif value.Class == 'Boolean': + value = to_boolean(value) + typ = Type(value) + if is_null(value): + return 'null' + elif typ == 'Boolean': + return 'true' if value else 'false' + elif typ == 'String': + return Quote(value) + elif typ == 'Number': + if not is_infinity(value): + return to_string(value) + return 'null' + if is_object(value) and not is_callable(value): + if value.Class == 'Array': + return ja(value, stack, gap, property_list, replacer_function, + space) + else: + return jo(value, stack, gap, property_list, replacer_function, + space) + return undefined + + +def jo(value, stack, gap, property_list, replacer_function, space): + global indent + if value in stack: + raise MakeError('TypeError', 'Converting circular structure to JSON') + stack.add(value) + stepback = indent + indent += gap + if not is_undefined(property_list): + k = property_list + else: + k = [unicode(e) for e, d in value.own.items() if d.get('enumerable')] + partial = [] + for p in k: + str_p = Str(p, value, replacer_function, property_list, gap, stack, + space) + if not is_undefined(str_p): + member = json.dumps(p) + ':' + ( + ' ' if gap else + '') + str_p # todo not sure here - what space character? + partial.append(member) + if not partial: + final = '{}' + else: + if not gap: + final = '{%s}' % ','.join(partial) + else: + sep = ',\n' + indent + properties = sep.join(partial) + final = '{\n' + indent + properties + '\n' + stepback + '}' + stack.remove(value) + indent = stepback + return final + + +def ja(value, stack, gap, property_list, replacer_function, space): + global indent + if value in stack: + raise MakeError('TypeError', 'Converting circular structure to JSON') + stack.add(value) + stepback = indent + indent += gap + partial = [] + length = js_arr_length(value) + for index in xrange(length): + index = unicode(index) + str_index = Str(index, value, replacer_function, property_list, gap, + stack, space) + if is_undefined(str_index): + partial.append('null') + else: + partial.append(str_index) + if not partial: + final = '[]' + else: + if not gap: + final = '[%s]' % ','.join(partial) + else: + sep = ',\n' + indent + properties = sep.join(partial) + final = '[\n' + indent + properties + '\n' + stepback + ']' + stack.remove(value) + indent = stepback + return final + + +def Quote(string): + return json.dumps(string) + + +def to_js(d, _args_space): + return convert_to_js_type(d, _args_space) + + +def walk(holder, name, reviver): + val = holder.get(name) + if GetClass(val) == 'Array': + for i in xrange(js_arr_length(val)): + i = unicode(i) + new_element = walk(val, i, reviver) + if is_undefined(new_element): + val.delete(i) + else: + new_element.put(i, new_element) + elif is_object(val): + for key in [ + unicode(e) for e, d in val.own.items() if d.get('enumerable') + ]: + new_element = walk(val, key, reviver) + if is_undefined(new_element): + val.delete(key) + else: + val.put(key, new_element) + return reviver.call(holder, (name, val)) diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsnumber.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsnumber.py new file mode 100644 index 000000000..d099eabd3 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsnumber.py @@ -0,0 +1,163 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * + +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + +RADIX_SYMBOLS = { + 0: '0', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: 'a', + 11: 'b', + 12: 'c', + 13: 'd', + 14: 'e', + 15: 'f', + 16: 'g', + 17: 'h', + 18: 'i', + 19: 'j', + 20: 'k', + 21: 'l', + 22: 'm', + 23: 'n', + 24: 'o', + 25: 'p', + 26: 'q', + 27: 'r', + 28: 's', + 29: 't', + 30: 'u', + 31: 'v', + 32: 'w', + 33: 'x', + 34: 'y', + 35: 'z' +} + + +def to_str_rep(num): + if is_nan(num): + return 'NaN' + elif is_infinity(num): + sign = '-' if num < 0 else '' + return sign + 'Infinity' + elif int(num) == num: # dont print .0 + return unicode(int(num)) + return unicode(num) # todo: Make it 100% consistent with Node + + +class NumberPrototype: + def toString(this, args): + if GetClass(this) != 'Number': + raise MakeError('TypeError', + 'Number.prototype.valueOf is not generic') + if type(this) != float: + this = this.value + radix = get_arg(args, 0) + if is_undefined(radix): + return to_str_rep(this) + r = to_int(radix) + if r == 10: + return to_str_rep(this) + if r not in xrange(2, 37) or radix != r: + raise MakeError( + 'RangeError', + 'Number.prototype.toString() radix argument must be an integer between 2 and 36' + ) + num = to_int(this) + if num < 0: + num = -num + sign = '-' + else: + sign = '' + res = '' + while num: + s = RADIX_SYMBOLS[num % r] + num = num // r + res = s + res + return sign + (res if res else '0') + + def valueOf(this, args): + if GetClass(this) != 'Number': + raise MakeError('TypeError', + 'Number.prototype.valueOf is not generic') + if type(this) != float: + this = this.value + return this + + def toFixed(this, args): + if GetClass(this) != 'Number': + raise MakeError( + 'TypeError', + 'Number.prototype.toFixed called on incompatible receiver') + if type(this) != float: + this = this.value + fractionDigits = get_arg(args, 0) + digs = to_int(fractionDigits) + if digs < 0 or digs > 20: + raise MakeError( + 'RangeError', + 'toFixed() digits argument must be between 0 and 20') + elif is_infinity(this): + return 'Infinity' if this > 0 else '-Infinity' + elif is_nan(this): + return 'NaN' + return format(this, '-.%df' % digs) + + def toExponential(this, args): + if GetClass(this) != 'Number': + raise MakeError( + 'TypeError', + 'Number.prototype.toExponential called on incompatible receiver' + ) + if type(this) != float: + this = this.value + fractionDigits = get_arg(args, 0) + digs = to_int(fractionDigits) + if digs < 0 or digs > 20: + raise MakeError( + 'RangeError', + 'toFixed() digits argument must be between 0 and 20') + elif is_infinity(this): + return 'Infinity' if this > 0 else '-Infinity' + elif is_nan(this): + return 'NaN' + return format(this, '-.%de' % digs) + + def toPrecision(this, args): + if GetClass(this) != 'Number': + raise MakeError( + 'TypeError', + 'Number.prototype.toPrecision called on incompatible receiver') + if type(this) != float: + this = this.value + precision = get_arg(args, 0) + if is_undefined(precision): + return to_string(this) + prec = to_int(precision) + if is_nan(this): + return 'NaN' + elif is_infinity(this): + return 'Infinity' if this > 0 else '-Infinity' + digs = prec - len(str(int(this))) + if digs >= 0: + return format(this, '-.%df' % digs) + else: + return format(this, '-.%df' % (prec - 1)) + + +NumberPrototype.toLocaleString = NumberPrototype.toString diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsobject.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsobject.py new file mode 100644 index 000000000..cdda6baba --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsobject.py @@ -0,0 +1,48 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * + + +class ObjectPrototype: + def toString(this, args): + if type(this) == UNDEFINED_TYPE: + return u'[object Undefined]' + elif type(this) == NULL_TYPE: + return u'[object Null]' + return u'[object %s]' % GetClass(to_object(this, args.space)) + + def valueOf(this, args): + return to_object(this, args.space) + + def toLocaleString(this, args): + o = to_object(this, args.space) + toString = o.get(u'toString') + if not is_callable(toString): + raise MakeError('TypeError', 'toString of this is not callcable') + else: + return toString.call(this, args) + + def hasOwnProperty(this, args): + prop = get_arg(args, 0) + o = to_object(this, args.space) + return o.get_own_property(to_string(prop)) is not None + + def isPrototypeOf(this, args): + # a bit stupid specification because of object conversion that will cause invalid values for primitives + # for example Object.prototype.isPrototypeOf.call((5).__proto__, 5) gives false + obj = get_arg(args, 0) + if not is_object(obj): + return False + o = to_object(this, args.space) + while 1: + obj = obj.prototype + if obj is None or is_null(obj): + return False + if obj is o: + return True + + def propertyIsEnumerable(this, args): + prop = get_arg(args, 0) + o = to_object(this, args.space) + cand = o.own.get(to_string(prop)) + return cand is not None and cand.get('enumerable') diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsregexp.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsregexp.py new file mode 100644 index 000000000..54aba3274 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsregexp.py @@ -0,0 +1,56 @@ +from __future__ import unicode_literals + +from ..conversions import * +from ..func_utils import * + + +class RegExpPrototype: + def toString(this, args): + flags = u'' + try: + if this.glob: + flags += u'g' + if this.ignore_case: + flags += u'i' + if this.multiline: + flags += u'm' + except: + pass + try: + v = this.value if this.value else u'(?:)' + except: + v = u'(?:)' + return u'/%s/' % v + flags + + def test(this, args): + string = get_arg(args, 0) + return RegExpExec(this, string, args.space) is not null + + def _exec( + this, args + ): # will be changed to exec in base.py. cant name it exec here... + string = get_arg(args, 0) + return RegExpExec(this, string, args.space) + + +def RegExpExec(this, string, space): + if GetClass(this) != 'RegExp': + raise MakeError('TypeError', 'RegExp.prototype.exec is not generic!') + string = to_string(string) + length = len(string) + i = to_int(this.get('lastIndex')) if this.glob else 0 + matched = False + while not matched: + if i < 0 or i > length: + this.put('lastIndex', 0.) + return null + matched = this.match(string, i) + i += 1 + start, end = matched.span() #[0]+i-1, matched.span()[1]+i-1 + if this.glob: + this.put('lastIndex', float(end)) + arr = convert_to_js_type( + [matched.group()] + list(matched.groups()), space=space) + arr.put('index', float(start)) + arr.put('input', unicode(string)) + return arr diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsstring.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsstring.py new file mode 100644 index 000000000..b56246e25 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsstring.py @@ -0,0 +1,323 @@ +from __future__ import unicode_literals + +# -*- coding: utf-8 -*- +import re +from ..conversions import * +from ..func_utils import * +from jsregexp import RegExpExec + +DIGS = set(u'0123456789') +WHITE = u"\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF" + + +def replacement_template(rep, source, span, npar): + """Takes the replacement template and some info about the match and returns filled template + """ + n = 0 + res = '' + while n < len(rep) - 1: + char = rep[n] + if char == '$': + if rep[n + 1] == '$': + res += '$' + n += 2 + continue + elif rep[n + 1] == '`': + # replace with string that is BEFORE match + res += source[:span[0]] + n += 2 + continue + elif rep[n + 1] == '\'': + # replace with string that is AFTER match + res += source[span[1]:] + n += 2 + continue + elif rep[n + 1] in DIGS: + dig = rep[n + 1] + if n + 2 < len(rep) and rep[n + 2] in DIGS: + dig += rep[n + 2] + num = int(dig) + # we will not do any replacements if we dont have this npar or dig is 0 + if not num or num > len(npar): + res += '$' + dig + else: + # None - undefined has to be replaced with '' + res += npar[num - 1] if npar[num - 1] else '' + n += 1 + len(dig) + continue + res += char + n += 1 + if n < len(rep): + res += rep[-1] + return res + + +################################################### + + +class StringPrototype: + def toString(this, args): + if GetClass(this) != 'String': + raise MakeError('TypeError', + 'String.prototype.toString is not generic') + if type(this) == unicode: + return this + assert type(this.value) == unicode + return this.value + + def valueOf(this, args): + if GetClass(this) != 'String': + raise MakeError('TypeError', + 'String.prototype.valueOf is not generic') + if type(this) == unicode: + return this + assert type(this.value) == unicode + return this.value + + def charAt(this, args): + cok(this) + pos = to_int(get_arg(args, 0)) + s = to_string(this) + if 0 <= pos < len(s): + return s[pos] + return u'' + + def charCodeAt(this, args): + cok(this) + pos = to_int(get_arg(args, 0)) + s = to_string(this) + if 0 <= pos < len(s): + return float(ord(s[pos])) + return NaN + + def concat(this, args): + cok(this) + return to_string(this) + u''.join(map(to_string, args)) + + def indexOf(this, args): + cok(this) + search = to_string(get_arg(args, 0)) + pos = to_int(get_arg(args, 1)) + s = to_string(this) + return float(s.find(search, min(max(pos, 0), len(s)))) + + def lastIndexOf(this, args): + cok(this) + search = to_string(get_arg(args, 0)) + pos = get_arg(args, 1) + s = to_string(this) + pos = 10**12 if is_nan(pos) else to_int(pos) + return float(s.rfind(search, 0, min(max(pos, 0) + 1, len(s)))) + + def localeCompare(this, args): + cok(this) + s = to_string(this) + that = to_string(get_arg(args, 0)) + if s < that: + return -1. + elif s > that: + return 1. + return 0. + + def match(this, args): + cok(this) + s = to_string(this) + regexp = get_arg(args, 0) + r = args.space.NewRegExp( + regexp, '') if GetClass(regexp) != 'RegExp' else regexp + if not r.glob: + return RegExpExec(r, s, space=args.space) + r.put('lastIndex', float(0)) + found = [] + previous_last_index = 0 + last_match = True + while last_match: + result = RegExpExec(r, s, space=args.space) + if is_null(result): + last_match = False + else: + this_index = r.get('lastIndex') + if this_index == previous_last_index: + r.put('lastIndex', float(this_index + 1)) + previous_last_index += 1 + else: + previous_last_index = this_index + matchStr = result.get('0') + found.append(matchStr) + if not found: + return null + return args.space.ConstructArray(found) + + def replace(this, args): + # VERY COMPLICATED. to check again. + cok(this) + s = to_string(this) + searchValue = get_arg(args, 0) + replaceValue = get_arg(args, 1) + res = '' + if not is_callable(replaceValue): + replaceValue = to_string(replaceValue) + func = False + else: + func = True + # Replace all ( global ) + if GetClass(searchValue) == 'RegExp' and searchValue.glob: + last = 0 + for e in re.finditer(searchValue.pat, s): + res += s[last:e.span()[0]] + if func: + # prepare arguments for custom func (replaceValue) + call_args = (e.group(), ) + e.groups() + (e.span()[1], s) + # convert all types to JS before Js bytecode call... + res += to_string( + replaceValue.call( + this, ensure_js_types(call_args, + space=args.space))) + else: + res += replacement_template(replaceValue, s, e.span(), + e.groups()) + last = e.span()[1] + res += s[last:] + return res + elif GetClass(searchValue) == 'RegExp': + e = re.search(searchValue.pat, s) + if e is None: + return s + span = e.span() + pars = e.groups() + match = e.group() + else: + match = to_string(searchValue) + ind = s.find(match) + if ind == -1: + return s + span = ind, ind + len(match) + pars = () + res = s[:span[0]] + if func: + call_args = (match, ) + pars + (span[1], s) + # convert all types to JS before Js bytecode call... + res += to_string( + replaceValue.call(this, + ensure_js_types(call_args, + space=args.space))) + else: + res += replacement_template(replaceValue, s, span, pars) + res += s[span[1]:] + return res + + def search(this, args): + cok(this) + string = to_string(this) + regexp = get_arg(args, 0) + if GetClass(regexp) == 'RegExp': + rx = regexp + else: + rx = args.space.NewRegExp(regexp, '') + res = re.search(rx.pat, string) + if res is not None: + return float(res.span()[0]) + return -1. + + def slice(this, args): + cok(this) + s = to_string(this) + start = to_int(get_arg(args, 0)) + length = len(s) + end = get_arg(args, 1) + end = length if is_undefined(end) else to_int(end) + #From = max(length+start, 0) if start<0 else min(length, start) + #To = max(length+end, 0) if end<0 else min(length, end) + return s[start:end] + + def split(this, args): + # its a bit different from re.split! + cok(this) + s = to_string(this) + separator = get_arg(args, 0) + limit = get_arg(args, 1) + lim = 2**32 - 1 if is_undefined(limit) else to_uint32(limit) + if not lim: + return args.space.ConstructArray([]) + if is_undefined(separator): + return args.space.ConstructArray([s]) + len_s = len(s) + res = [] + R = separator if GetClass(separator) == 'RegExp' else to_string( + separator) + if not len_s: + if SplitMatch(s, 0, R) is None: + return args.space.ConstructArray([s]) + return args.space.ConstructArray([]) + p = q = 0 + while q != len_s: + e, cap = SplitMatch(s, q, R) + if e is None or e == p: + q += 1 + continue + res.append(s[p:q]) + p = q = e + if len(res) == lim: + return args.space.ConstructArray(res) + for element in cap: + res.append(element) + if len(res) == lim: + return args.space.ConstructArray(res) + res.append(s[p:]) + return args.space.ConstructArray(res) + + def substring(this, args): + cok(this) + s = to_string(this) + start = to_int(get_arg(args, 0)) + length = len(s) + end = get_arg(args, 1) + end = length if is_undefined(end) else to_int(end) + fstart = min(max(start, 0), length) + fend = min(max(end, 0), length) + return s[min(fstart, fend):max(fstart, fend)] + + def substr(this, args): + cok(this) + #I hate this function and its description in specification + r1 = to_string(this) + r2 = to_int(get_arg(args, 0)) + length = get_arg(args, 1) + r3 = 10**20 if is_undefined(length) else to_int(length) + r4 = len(r1) + r5 = r2 if r2 >= 0 else max(0, r2 + r4) + r6 = min(max(r3, 0), r4 - r5) + if r6 <= 0: + return '' + return r1[r5:r5 + r6] + + def toLowerCase(this, args): + cok(this) + return to_string(this).lower() + + def toLocaleLowerCase(this, args): + cok(this) + return to_string(this).lower() + + def toUpperCase(this, args): + cok(this) + return to_string(this).upper() + + def toLocaleUpperCase(this, args): + cok(this) + return to_string(this).upper() + + def trim(this, args): + cok(this) + return to_string(this).strip(WHITE) + + +def SplitMatch(s, q, R): + # s is Py String to match, q is the py int match start and R is Js RegExp or String. + if GetClass(R) == 'RegExp': + res = R.match(s, q) + return (None, ()) if res is None else (res.span()[1], res.groups()) + # R is just a string + if s[q:].startswith(R): + return q + len(R), () + return None, () diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsutils.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsutils.py new file mode 100644 index 000000000..85f5bd44b --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsutils.py @@ -0,0 +1,149 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * + +RADIX_CHARS = { + '1': 1, + '0': 0, + '3': 3, + '2': 2, + '5': 5, + '4': 4, + '7': 7, + '6': 6, + '9': 9, + '8': 8, + 'a': 10, + 'c': 12, + 'b': 11, + 'e': 14, + 'd': 13, + 'g': 16, + 'f': 15, + 'i': 18, + 'h': 17, + 'k': 20, + 'j': 19, + 'm': 22, + 'l': 21, + 'o': 24, + 'n': 23, + 'q': 26, + 'p': 25, + 's': 28, + 'r': 27, + 'u': 30, + 't': 29, + 'w': 32, + 'v': 31, + 'y': 34, + 'x': 33, + 'z': 35, + 'A': 10, + 'C': 12, + 'B': 11, + 'E': 14, + 'D': 13, + 'G': 16, + 'F': 15, + 'I': 18, + 'H': 17, + 'K': 20, + 'J': 19, + 'M': 22, + 'L': 21, + 'O': 24, + 'N': 23, + 'Q': 26, + 'P': 25, + 'S': 28, + 'R': 27, + 'U': 30, + 'T': 29, + 'W': 32, + 'V': 31, + 'Y': 34, + 'X': 33, + 'Z': 35 +} + +# parseFloat +# parseInt +# isFinite +# isNaN + + +def parseInt(this, args): + string, radix = get_arg(args, 0), get_arg(args, 1) + string = to_string(string).lstrip() + sign = 1 + if string and string[0] in ('+', '-'): + if string[0] == '-': + sign = -1 + string = string[1:] + r = to_int32(radix) + strip_prefix = True + if r: + if r < 2 or r > 36: + return NaN + if r != 16: + strip_prefix = False + else: + r = 10 + if strip_prefix: + if len(string) >= 2 and string[:2] in ('0x', '0X'): + string = string[2:] + r = 16 + n = 0 + num = 0 + while n < len(string): + cand = RADIX_CHARS.get(string[n]) + if cand is None or not cand < r: + break + num = cand + num * r + n += 1 + if not n: + return NaN + return float(sign * num) + + +def parseFloat(this, args): + string = get_arg(args, 0) + string = to_string(string).strip() + sign = 1 + if string and string[0] in ('+', '-'): + if string[0] == '-': + sign = -1 + string = string[1:] + num = None + length = 1 + max_len = None + failed = 0 + while length <= len(string): + try: + num = float(string[:length]) + max_len = length + failed = 0 + except: + failed += 1 + if failed > 4: # cant be a number anymore + break + length += 1 + if num is None: + return NaN + return sign * float(string[:max_len]) + + +def isNaN(this, args): + number = get_arg(args, 0) + if is_nan(to_number(number)): + return True + return False + + +def isFinite(this, args): + number = get_arg(args, 0) + num = to_number(number) + if is_nan(num) or is_infinity(num): + return False + return True diff --git a/Contents/Libraries/Shared/js2py/internals/seval.py b/Contents/Libraries/Shared/js2py/internals/seval.py new file mode 100644 index 000000000..c4404ab77 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/seval.py @@ -0,0 +1,32 @@ +import pyjsparser +from space import Space +import fill_space +from byte_trans import ByteCodeGenerator +from code import Code +from simplex import MakeError +import sys +sys.setrecursionlimit(100000) + + +pyjsparser.parser.ENABLE_JS2PY_ERRORS = lambda msg: MakeError(u'SyntaxError', unicode(msg)) + +def get_js_bytecode(js): + a = ByteCodeGenerator(Code()) + d = pyjsparser.parse(js) + a.emit(d) + return a.exe.tape + +def eval_js_vm(js): + a = ByteCodeGenerator(Code()) + s = Space() + a.exe.space = s + s.exe = a.exe + + d = pyjsparser.parse(js) + + a.emit(d) + fill_space.fill_space(s, a) + # print a.exe.tape + a.exe.compile() + + return a.exe.run(a.exe.space.GlobalObj) diff --git a/Contents/Libraries/Shared/js2py/internals/simplex.py b/Contents/Libraries/Shared/js2py/internals/simplex.py new file mode 100644 index 000000000..b05f6174e --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/simplex.py @@ -0,0 +1,133 @@ +from __future__ import unicode_literals +import six + + +#Undefined +class PyJsUndefined(object): + TYPE = 'Undefined' + Class = 'Undefined' + + +undefined = PyJsUndefined() + + +#Null +class PyJsNull(object): + TYPE = 'Null' + Class = 'Null' + + +null = PyJsNull() + +Infinity = float('inf') +NaN = float('nan') + +UNDEFINED_TYPE = PyJsUndefined +NULL_TYPE = PyJsNull +STRING_TYPE = unicode if six.PY2 else str +NUMBER_TYPE = float +BOOLEAN_TYPE = bool + +# exactly 5 simplexes! +PRIMITIVES = frozenset( + [UNDEFINED_TYPE, NULL_TYPE, STRING_TYPE, NUMBER_TYPE, BOOLEAN_TYPE]) + +TYPE_NAMES = { + UNDEFINED_TYPE: 'Undefined', + NULL_TYPE: 'Null', + STRING_TYPE: 'String', + NUMBER_TYPE: 'Number', + BOOLEAN_TYPE: 'Boolean', +} + + +def Type(x): + # Any -> Str + return TYPE_NAMES.get(type(x), 'Object') + + +def GetClass(x): + # Any -> Str + cand = TYPE_NAMES.get(type(x)) + if cand is None: + return x.Class + return cand + + +def is_undefined(self): + return self is undefined + + +def is_null(self): + return self is null + + +def is_primitive(self): + return type(self) in PRIMITIVES + + +def is_object(self): + return not is_primitive(self) + + +def is_callable(self): + return hasattr(self, 'call') + + +def is_infinity(self): + return self == float('inf') or self == -float('inf') + + +def is_nan(self): + return self != self # nan!=nan evaluates to True + + +def is_finite(self): + return not (is_nan(self) or is_infinity(self)) + + +class JsException(Exception): + def __init__(self, typ=None, message=None, throw=None): + if typ is None and message is None and throw is None: + # it means its the trasnlator based error (old format), do nothing + self._translator_based = True + else: + assert throw is None or (typ is None + and message is None), (throw, typ, + message) + self._translator_based = False + self.typ = typ + self.message = message + self.throw = throw + + def get_thrown_value(self, space): + if self.throw is not None: + return self.throw + else: + return space.NewError(self.typ, self.message) + + def __str__(self): + if self._translator_based: + if self.mes.Class == 'Error': + return self.mes.callprop('toString').value + else: + return self.mes.to_string().value + else: + if self.throw is not None: + from conversions import to_string + return to_string(self.throw) + else: + return self.typ + ': ' + self.message + + +def MakeError(typ, message=u'no info', throw=None): + return JsException(typ, + unicode(message) if message is not None else message, + throw) + + +def value_from_js_exception(js_exception, space): + if js_exception.throw is not None: + return js_exception.throw + else: + return space.NewError(js_exception.typ, js_exception.message) diff --git a/Contents/Libraries/Shared/js2py/internals/space.py b/Contents/Libraries/Shared/js2py/internals/space.py new file mode 100644 index 000000000..7283070cd --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/space.py @@ -0,0 +1,92 @@ +from base import * +from simplex import * + + +class Space(object): + def __init__(self): + self.GlobalObj = None + self.ctx = None + self.byte_generator = None + + self.Number = None + self.String = None + self.Boolean = None + self.RegExp = None + self.Object = None + self.Array = None + self.Function = None + + self.BooleanPrototype = None + self.NumberPrototype = None + self.StringPrototype = None + + self.FunctionPrototype = None + self.ArrayPrototype = None + self.RegExpPrototype = None + self.DatePrototype = None + self.ObjectPrototype = None + + self.ErrorPrototype = None + self.EvalErrorPrototype = None + self.RangeErrorPrototype = None + self.ReferenceErrorPrototype = None + self.SyntaxErrorPrototype = None + self.TypeErrorPrototype = None + self.URIErrorPrototype = None + + self.interpreter = None + + @property + def ERROR_TYPES(self): + return { + 'Error': self.ErrorPrototype, + 'EvalError': self.EvalErrorPrototype, + 'RangeError': self.RangeErrorPrototype, + 'ReferenceError': self.ReferenceErrorPrototype, + 'SyntaxError': self.SyntaxErrorPrototype, + 'TypeError': self.TypeErrorPrototype, + 'URIError': self.URIErrorPrototype, + } + + def get_global_environment(self): + return self.GlobalCtx.variable_environment() + + def NewObject(self): + return PyJsObject(self.ObjectPrototype) + + def NewFunction(self, code, ctx, params, name, is_declaration, + definitions): + return PyJsFunction( + code, + ctx, + params, + name, + self, + is_declaration, + definitions, + prototype=self.FunctionPrototype) + + def NewDate(self, value): + return PyJsDate(value, self.DatePrototype) + + def NewArray(self, length=0): + return PyJsArray(length, self.ArrayPrototype) + + def NewError(self, typ, message): + return PyJsError(message, self.ERROR_TYPES[typ]) + + def NewRegExp(self, body, flags): + return PyJsRegExp(body, flags, self.RegExpPrototype) + + def ConstructArray(self, py_arr): + ''' note py_arr elems are NOT converted to PyJs types!''' + arr = self.NewArray(len(py_arr)) + arr._init(py_arr) + return arr + + def ConstructObject(self, py_obj): + ''' note py_obj items are NOT converted to PyJs types! ''' + obj = self.NewObject() + for k, v in py_obj.items(): + obj.put(unicode(k), v) + return obj diff --git a/Contents/Libraries/Shared/js2py/internals/speed.py b/Contents/Libraries/Shared/js2py/internals/speed.py new file mode 100644 index 000000000..3ca4079e7 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/speed.py @@ -0,0 +1,62 @@ +from timeit import timeit +from collections import namedtuple +from array import array +from itertools import izip +from collections import deque + + +class Y(object): + UUU = 88 + + def __init__(self, x): + self.x = x + + def s(self, x): + return self.x + 1 + + +class X(Y): + A = 10 + B = 2 + C = 4 + D = 9 + + def __init__(self, x): + self.x = x + self.stack = [] + self.par = super(X, self) + + def s(self, x): + pass + + def __add__(self, other): + return self.x + other.x + + def another(self): + return Y.s(self, 1) + + def yet_another(self): + return self.par.s(1) + + +def add(a, b): + return a.x + b.x + + +t = [] + +Type = None +try: + print timeit( + """ + +t.append(4) +t.pop() + + + +""", + "from __main__ import X,Y,namedtuple,array,t,add,Type, izip", + number=1000000) +except: + raise diff --git a/Contents/Libraries/Shared/js2py/internals/trans_utils.py b/Contents/Libraries/Shared/js2py/internals/trans_utils.py new file mode 100644 index 000000000..235b46a85 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/trans_utils.py @@ -0,0 +1,28 @@ +def to_key(literal_or_identifier): + ''' returns string representation of this object''' + if literal_or_identifier['type'] == 'Identifier': + return literal_or_identifier['name'] + elif literal_or_identifier['type'] == 'Literal': + k = literal_or_identifier['value'] + if isinstance(k, float): + return unicode(float_repr(k)) + elif 'regex' in literal_or_identifier: + return compose_regex(k) + elif isinstance(k, bool): + return u'true' if k else u'false' + elif k is None: + return u'null' + else: + return unicode(k) + + +def compose_regex(val): + reg, flags = val + # reg = REGEXP_CONVERTER._unescape_string(reg) + return u'/%s/%s' % (reg, flags) + + +def float_repr(f): + if int(f) == f: + return unicode(repr(int(f))) + return unicode(repr(f)) diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/__init__.py b/Contents/Libraries/Shared/js2py/legecy_translators/__init__.py new file mode 100644 index 000000000..d01e0f5fd --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/__init__.py @@ -0,0 +1 @@ +__author__ = 'Piotrek' diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/constants.py b/Contents/Libraries/Shared/js2py/legecy_translators/constants.py new file mode 100644 index 000000000..ea048f128 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/constants.py @@ -0,0 +1,308 @@ +from string import ascii_lowercase, digits +################################## +StringName = u'PyJsConstantString%d_' +NumberName = u'PyJsConstantNumber%d_' +RegExpName = u'PyJsConstantRegExp%d_' +################################## +ALPHAS = set(ascii_lowercase + ascii_lowercase.upper()) +NUMS = set(digits) +IDENTIFIER_START = ALPHAS.union(NUMS) +ESCAPE_CHARS = {'n', '0', 'b', 'f', 'r', 't', 'v', '"', "'", '\\'} +OCTAL = {'0', '1', '2', '3', '4', '5', '6', '7'} +HEX = set('0123456789abcdefABCDEF') +from utils import * +IDENTIFIER_PART = IDENTIFIER_PART.union({'.'}) + + +def _is_cancelled(source, n): + cancelled = False + k = 0 + while True: + k += 1 + if source[n - k] != '\\': + break + cancelled = not cancelled + return cancelled + + +def _ensure_regexp(source, n): #<- this function has to be improved + '''returns True if regexp starts at n else returns False + checks whether it is not a division ''' + markers = '(+~"\'=[%:?!*^|&-,;/\\' + k = 0 + while True: + k += 1 + if n - k < 0: + return True + char = source[n - k] + if char in markers: + return True + if char != ' ' and char != '\n': + break + return False + + +def parse_num(source, start, charset): + """Returns a first index>=start of chat not in charset""" + while start < len(source) and source[start] in charset: + start += 1 + return start + + +def parse_exponent(source, start): + """returns end of exponential, raises SyntaxError if failed""" + if not source[start] in {'e', 'E'}: + if source[start] in IDENTIFIER_PART: + raise SyntaxError('Invalid number literal!') + return start + start += 1 + if source[start] in {'-', '+'}: + start += 1 + FOUND = False + # we need at least one dig after exponent + while source[start] in NUMS: + FOUND = True + start += 1 + if not FOUND or source[start] in IDENTIFIER_PART: + raise SyntaxError('Invalid number literal!') + return start + + +def remove_constants(source): + '''Replaces Strings and Regexp literals in the source code with + identifiers and *removes comments*. Identifier is of the format: + + PyJsStringConst(String const number)_ - for Strings + PyJsRegExpConst(RegExp const number)_ - for RegExps + + Returns dict which relates identifier and replaced constant. + + Removes single line and multiline comments from JavaScript source code + Pseudo comments (inside strings) will not be removed. + + For example this line: + var x = "/*PSEUDO COMMENT*/ TEXT //ANOTHER PSEUDO COMMENT" + will be unaltered''' + source = ' ' + source + '\n' + comments = [] + inside_comment, single_comment = False, False + inside_single, inside_double = False, False + inside_regexp = False + regexp_class_count = 0 + n = 0 + while n < len(source): + char = source[n] + if char == '"' and not (inside_comment or inside_single + or inside_regexp): + if not _is_cancelled(source, n): + if inside_double: + inside_double[1] = n + 1 + comments.append(inside_double) + inside_double = False + else: + inside_double = [n, None, 0] + elif char == "'" and not (inside_comment or inside_double + or inside_regexp): + if not _is_cancelled(source, n): + if inside_single: + inside_single[1] = n + 1 + comments.append(inside_single) + inside_single = False + else: + inside_single = [n, None, 0] + elif (inside_single or inside_double): + if char in LINE_TERMINATOR: + if _is_cancelled(source, n): + if char == CR and source[n + 1] == LF: + n += 1 + n += 1 + continue + else: + raise SyntaxError( + 'Invalid string literal. Line terminators must be escaped!' + ) + else: + if inside_comment: + if single_comment: + if char in LINE_TERMINATOR: + inside_comment[1] = n + comments.append(inside_comment) + inside_comment = False + single_comment = False + else: # Multiline + if char == '/' and source[n - 1] == '*': + inside_comment[1] = n + 1 + comments.append(inside_comment) + inside_comment = False + elif inside_regexp: + if not quiting_regexp: + if char in LINE_TERMINATOR: + raise SyntaxError( + 'Invalid regexp literal. Line terminators cant appear!' + ) + if _is_cancelled(source, n): + n += 1 + continue + if char == '[': + regexp_class_count += 1 + elif char == ']': + regexp_class_count = max(regexp_class_count - 1, 0) + elif char == '/' and not regexp_class_count: + quiting_regexp = True + else: + if char not in IDENTIFIER_START: + inside_regexp[1] = n + comments.append(inside_regexp) + inside_regexp = False + elif char == '/' and source[n - 1] == '/': + single_comment = True + inside_comment = [n - 1, None, 1] + elif char == '*' and source[n - 1] == '/': + inside_comment = [n - 1, None, 1] + elif char == '/' and source[n + 1] not in ('/', '*'): + if not _ensure_regexp(source, n): #<- improve this one + n += 1 + continue #Probably just a division + quiting_regexp = False + inside_regexp = [n, None, 2] + elif not (inside_comment or inside_regexp): + if (char in NUMS and + source[n - 1] not in IDENTIFIER_PART) or char == '.': + if char == '.': + k = parse_num(source, n + 1, NUMS) + if k == n + 1: # just a stupid dot... + n += 1 + continue + k = parse_exponent(source, k) + elif char == '0' and source[n + 1] in { + 'x', 'X' + }: #Hex number probably + k = parse_num(source, n + 2, HEX) + if k == n + 2 or source[k] in IDENTIFIER_PART: + raise SyntaxError('Invalid hex literal!') + else: #int or exp or flot or exp flot + k = parse_num(source, n + 1, NUMS) + if source[k] == '.': + k = parse_num(source, k + 1, NUMS) + k = parse_exponent(source, k) + comments.append((n, k, 3)) + n = k + continue + n += 1 + res = '' + start = 0 + count = 0 + constants = {} + for end, next_start, typ in comments: + res += source[start:end] + start = next_start + if typ == 0: # String + name = StringName + elif typ == 1: # comment + continue + elif typ == 2: # regexp + name = RegExpName + elif typ == 3: # number + name = NumberName + else: + raise RuntimeError() + res += ' ' + name % count + ' ' + constants[name % count] = source[end:next_start] + count += 1 + res += source[start:] + # remove this stupid white space + for e in WHITE: + res = res.replace(e, ' ') + res = res.replace(CR + LF, '\n') + for e in LINE_TERMINATOR: + res = res.replace(e, '\n') + return res.strip(), constants + + +def recover_constants(py_source, + replacements): #now has n^2 complexity. improve to n + '''Converts identifiers representing Js constants to the PyJs constants + PyJsNumberConst_1_ which has the true value of 5 will be converted to PyJsNumber(5)''' + for identifier, value in replacements.iteritems(): + if identifier.startswith('PyJsConstantRegExp'): + py_source = py_source.replace(identifier, + 'JsRegExp(%s)' % repr(value)) + elif identifier.startswith('PyJsConstantString'): + py_source = py_source.replace( + identifier, 'Js(u%s)' % unify_string_literals(value)) + else: + py_source = py_source.replace(identifier, 'Js(%s)' % value) + return py_source + + +def unify_string_literals(js_string): + """this function parses the string just like javascript + for example literal '\d' in JavaScript would be interpreted + as 'd' - backslash would be ignored and in Pyhon this + would be interpreted as '\\d' This function fixes this problem.""" + n = 0 + res = '' + limit = len(js_string) + while n < limit: + char = js_string[n] + if char == '\\': + new, n = do_escape(js_string, n) + res += new + else: + res += char + n += 1 + return res + + +def unify_regexp_literals(js): + pass + + +def do_escape(source, n): + """Its actually quite complicated to cover every case :) + http://www.javascriptkit.com/jsref/escapesequence.shtml""" + if not n + 1 < len(source): + return '' # not possible here but can be possible in general case. + if source[n + 1] in LINE_TERMINATOR: + if source[n + 1] == CR and n + 2 < len(source) and source[n + 2] == LF: + return source[n:n + 3], n + 3 + return source[n:n + 2], n + 2 + if source[n + 1] in ESCAPE_CHARS: + return source[n:n + 2], n + 2 + if source[n + 1] in {'x', 'u'}: + char, length = ('u', 4) if source[n + 1] == 'u' else ('x', 2) + n += 2 + end = parse_num(source, n, HEX) + if end - n < length: + raise SyntaxError('Invalid escape sequence!') + #if length==4: + # return unichr(int(source[n:n+4], 16)), n+4 # <- this was a very bad way of solving this problem :) + return source[n - 2:n + length], n + length + if source[n + 1] in OCTAL: + n += 1 + end = parse_num(source, n, OCTAL) + end = min(end, n + 3) # cant be longer than 3 + # now the max allowed is 377 ( in octal) and 255 in decimal + max_num = 255 + num = 0 + len_parsed = 0 + for e in source[n:end]: + cand = 8 * num + int(e) + if cand > max_num: + break + num = cand + len_parsed += 1 + # we have to return in a different form because python may want to parse more... + # for example '\777' will be parsed by python as a whole while js will use only \77 + return '\\' + hex(num)[1:], n + len_parsed + return source[n + 1], n + 2 + + +#####TEST###### + +if __name__ == '__main__': + test = (''' + ''') + + t, d = remove_constants(test) + print t, d diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/exps.py b/Contents/Libraries/Shared/js2py/legecy_translators/exps.py new file mode 100644 index 000000000..3c8f793cd --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/exps.py @@ -0,0 +1,83 @@ +""" +exp_translate routine: +It takes a single line of JS code and returns a SINGLE line of Python code. +Note var is not present here because it was removed in previous stages. Also remove this useless void keyword +If case of parsing errors it must return a pos of error. +1. Convert all assignment operations to put operations, this may be hard :( DONE, wasn't that bad +2. Convert all gets and calls to get and callprop. +3. Convert unary operators like typeof, new, !, delete, ++, -- + Delete can be handled by replacing last get method with delete. +4. Convert remaining operators that are not handled by python: + &&, || <= these should be easy simply replace && by and and || by or + === and !== + comma operator , in, instanceof and finally :? + + +NOTES: +Strings and other literals are not present so each = means assignment +""" +from utils import * +from jsparser import * + + +def exps_translator(js): + #Check () {} and [] nums + ass = assignment_translator(js) + + +# Step 1 +def assignment_translator(js): + sep = js.split(',') + res = sep[:] + for i, e in enumerate(sep): + if '=' not in e: # no need to convert + continue + res[i] = bass_translator(e) + return ','.join(res) + + +def bass_translator(s): + # I hope that I will not have to fix any bugs here because it will be terrible + if '(' in s or '[' in s: + converted = '' + for e in bracket_split(s, ['()', '[]'], strip=False): + if e[0] == '(': + converted += '(' + bass_translator(e[1:-1]) + ')' + elif e[0] == '[': + converted += '[' + bass_translator(e[1:-1]) + ']' + else: + converted += e + s = converted + if '=' not in s: + return s + ass = reversed(s.split('=')) + last = ass.next() + res = last + for e in ass: + op = '' + if e[-1] in OP_METHODS: #increment assign like += + op = ', "' + e[-1] + '"' + e = e[:-1] + cand = e.strip( + '() ') # (a) = 40 is valid so we need to transform '(a) ' to 'a' + if not is_property_accessor(cand): # it is not a property assignment + if not is_lval(cand) or is_internal(cand): + raise SyntaxError('Invalid left-hand side in assignment') + res = 'var.put(%s, %s%s)' % (cand.__repr__(), res, op) + elif cand[-1] == ']': # property assignment via [] + c = list(bracket_split(cand, ['[]'], strip=False)) + meth, prop = ''.join(c[:-1]).strip(), c[-1][1:-1].strip( + ) #this does not have to be a string so dont remove + #() because it can be a call + res = '%s.put(%s, %s%s)' % (meth, prop, res, op) + else: # Prop set via '.' + c = cand.rfind('.') + meth, prop = cand[:c].strip(), cand[c + 1:].strip('() ') + if not is_lval(prop): + raise SyntaxError('Invalid left-hand side in assignment') + res = '%s.put(%s, %s%s)' % (meth, prop.__repr__(), res, op) + return res + + +if __name__ == '__main__': + print bass_translator('3.ddsd = 40') diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/flow.py b/Contents/Libraries/Shared/js2py/legecy_translators/flow.py new file mode 100644 index 000000000..9e2bb0fa7 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/flow.py @@ -0,0 +1,480 @@ +"""This module translates JS flow into PY flow. + +Translates: +IF ELSE + +DO WHILE +WHILE +FOR 123 +FOR iter +CONTINUE, BREAK, RETURN, LABEL, THROW, TRY, SWITCH +""" +from utils import * +from jsparser import * +from nodevisitor import exp_translator +import random + +TO_REGISTER = [] +CONTINUE_LABEL = 'JS_CONTINUE_LABEL_%s' +BREAK_LABEL = 'JS_BREAK_LABEL_%s' + +PREPARE = '''HOLDER = var.own.get(NAME)\nvar.force_own_put(NAME, PyExceptionToJs(PyJsTempException))\n''' +RESTORE = '''if HOLDER is not None:\n var.own[NAME] = HOLDER\nelse:\n del var.own[NAME]\ndel HOLDER\n''' +TRY_CATCH = '''%stry:\nBLOCKfinally:\n%s''' % (PREPARE, indent(RESTORE)) + + +def get_continue_label(label): + return CONTINUE_LABEL % label.encode('hex') + + +def get_break_label(label): + return BREAK_LABEL % label.encode('hex') + + +def pass_until(source, start, tokens=(';', )): + while start < len(source) and source[start] not in tokens: + start += 1 + return start + 1 + + +def do_bracket_exp(source, start, throw=True): + bra, cand = pass_bracket(source, start, '()') + if throw and not bra: + raise SyntaxError('Missing bracket expression') + bra = exp_translator(bra[1:-1]) + if throw and not bra: + raise SyntaxError('Empty bracket condition') + return bra, cand if bra else start + + +def do_if(source, start): + start += 2 # pass this if + bra, start = do_bracket_exp(source, start, throw=True) + statement, start = do_statement(source, start) + if statement is None: + raise SyntaxError('Invalid if statement') + translated = 'if %s:\n' % bra + indent(statement) + + elseif = except_keyword(source, start, 'else') + is_elseif = False + if elseif: + start = elseif + if except_keyword(source, start, 'if'): + is_elseif = True + elseif, start = do_statement(source, start) + if elseif is None: + raise SyntaxError('Invalid if statement)') + if is_elseif: + translated += 'el' + elseif + else: + translated += 'else:\n' + indent(elseif) + return translated, start + + +def do_statement(source, start): + """returns none if not found other functions that begin with 'do_' raise + also this do_ type function passes white space""" + start = pass_white(source, start) + # start is the fist position after initial start that is not a white space or \n + if not start < len(source): #if finished parsing return None + return None, start + if any(startswith_keyword(source[start:], e) for e in {'case', 'default'}): + return None, start + rest = source[start:] + for key, meth in KEYWORD_METHODS.iteritems( + ): # check for statements that are uniquely defined by their keywords + if rest.startswith(key): + # has to startwith this keyword and the next letter after keyword must be either EOF or not in IDENTIFIER_PART + if len(key) == len(rest) or rest[len(key)] not in IDENTIFIER_PART: + return meth(source, start) + if rest[0] == '{': #Block + return do_block(source, start) + # Now only label and expression left + cand = parse_identifier(source, start, False) + if cand is not None: # it can mean that its a label + label, cand_start = cand + cand_start = pass_white(source, cand_start) + if source[cand_start] == ':': + return do_label(source, start) + return do_expression(source, start) + + +def do_while(source, start): + start += 5 # pass while + bra, start = do_bracket_exp(source, start, throw=True) + statement, start = do_statement(source, start) + if statement is None: + raise SyntaxError('Missing statement to execute in while loop!') + return 'while %s:\n' % bra + indent(statement), start + + +def do_dowhile(source, start): + start += 2 # pass do + statement, start = do_statement(source, start) + if statement is None: + raise SyntaxError('Missing statement to execute in do while loop!') + start = except_keyword(source, start, 'while') + if not start: + raise SyntaxError('Missing while keyword in do-while loop') + bra, start = do_bracket_exp(source, start, throw=True) + statement += 'if not %s:\n' % bra + indent('break\n') + return 'while 1:\n' + indent(statement), start + + +def do_block(source, start): + bra, start = pass_bracket(source, start, '{}') + #print source[start:], bra + #return bra +'\n', start + if bra is None: + raise SyntaxError('Missing block ( {code} )') + code = '' + bra = bra[1:-1] + ';' + bra_pos = 0 + while bra_pos < len(bra): + st, bra_pos = do_statement(bra, bra_pos) + if st is None: + break + code += st + bra_pos = pass_white(bra, bra_pos) + if bra_pos < len(bra): + raise SyntaxError('Block has more code that could not be parsed:\n' + + bra[bra_pos:]) + return code, start + + +def do_empty(source, start): + return 'pass\n', start + 1 + + +def do_expression(source, start): + start = pass_white(source, start) + end = pass_until(source, start, tokens=(';', )) + if end == start + 1: #empty statement + return 'pass\n', end + # AUTOMATIC SEMICOLON INSERTION FOLLOWS + # Without ASI this function would end with: return exp_translator(source[start:end].rstrip(';'))+'\n', end + # ASI makes things a bit more complicated: + # we will try to parse as much as possible, inserting ; in place of last new line in case of error + rev = False + rpos = 0 + while True: + try: + code = source[start:end].rstrip(';') + cand = exp_translator(code) + '\n', end + just_to_test = compile(cand[0], '', 'exec') + return cand + except Exception as e: + if not rev: + rev = source[start:end][::-1] + lpos = rpos + while True: + rpos = pass_until(rev, rpos, LINE_TERMINATOR) + if rpos >= len(rev): + raise + if filter(lambda x: x not in SPACE, rev[lpos:rpos]): + break + end = start + len(rev) - rpos + 1 + + +def do_var(source, start): + #todo auto ; insertion + start += 3 #pass var + end = pass_until(source, start, tokens=(';', )) + defs = argsplit( + source[start:end - 1] + ) # defs is the list of defined vars with optional initializer + code = '' + for de in defs: + var, var_end = parse_identifier(de, 0, True) + TO_REGISTER.append(var) + var_end = pass_white(de, var_end) + if var_end < len( + de + ): # we have something more to parse... It has to start with = + if de[var_end] != '=': + raise SyntaxError( + 'Unexpected initializer in var statement. Expected "=", got "%s"' + % de[var_end]) + code += exp_translator(de) + '\n' + if not code.strip(): + code = 'pass\n' + return code, end + + +def do_label(source, start): + label, end = parse_identifier(source, start) + end = pass_white(source, end) + #now source[end] must be : + assert source[end] == ':' + end += 1 + inside, end = do_statement(source, end) + if inside is None: + raise SyntaxError('Missing statement after label') + defs = '' + if inside.startswith('while ') or inside.startswith( + 'for ') or inside.startswith('#for'): + # we have to add contine label as well... + # 3 or 1 since #for loop type has more lines before real for. + sep = 1 if not inside.startswith('#for') else 3 + cont_label = get_continue_label(label) + temp = inside.split('\n') + injected = 'try:\n' + '\n'.join(temp[sep:]) + injected += 'except %s:\n pass\n' % cont_label + inside = '\n'.join(temp[:sep]) + '\n' + indent(injected) + defs += 'class %s(Exception): pass\n' % cont_label + break_label = get_break_label(label) + inside = 'try:\n%sexcept %s:\n pass\n' % (indent(inside), break_label) + defs += 'class %s(Exception): pass\n' % break_label + return defs + inside, end + + +def do_for(source, start): + start += 3 # pass for + entered = start + bra, start = pass_bracket(source, start, '()') + inside, start = do_statement(source, start) + if inside is None: + raise SyntaxError('Missing statement after for') + bra = bra[1:-1] + if ';' in bra: + init = argsplit(bra, ';') + if len(init) != 3: + raise SyntaxError('Invalid for statement') + args = [] + for i, item in enumerate(init): + end = pass_white(item, 0) + if end == len(item): + args.append('' if i != 1 else '1') + continue + if not i and except_keyword(item, end, 'var') is not None: + # var statement + args.append(do_var(item, end)[0]) + continue + args.append(do_expression(item, end)[0]) + return '#for JS loop\n%swhile %s:\n%s%s\n' % ( + args[0], args[1].strip(), indent(inside), indent(args[2])), start + # iteration + end = pass_white(bra, 0) + register = False + if bra[end:].startswith('var '): + end += 3 + end = pass_white(bra, end) + register = True + name, end = parse_identifier(bra, end) + if register: + TO_REGISTER.append(name) + end = pass_white(bra, end) + if bra[end:end + 2] != 'in' or bra[end + 2] in IDENTIFIER_PART: + #print source[entered-10:entered+50] + raise SyntaxError('Invalid "for x in y" statement') + end += 2 # pass in + exp = exp_translator(bra[end:]) + res = 'for temp in %s:\n' % exp + res += indent('var.put(%s, temp)\n' % name.__repr__()) + indent(inside) + return res, start + + +# todo - IMPORTANT +def do_continue(source, start, name='continue'): + start += len(name) #pass continue + start = pass_white(source, start) + if start < len(source) and source[start] == ';': + return '%s\n' % name, start + 1 + # labeled statement or error + label, start = parse_identifier(source, start) + start = pass_white(source, start) + if start < len(source) and source[start] != ';': + raise SyntaxError('Missing ; after label name in %s statement' % name) + return 'raise %s("%s")\n' % (get_continue_label(label) + if name == 'continue' else + get_break_label(label), name), start + 1 + + +def do_break(source, start): + return do_continue(source, start, 'break') + + +def do_return(source, start): + start += 6 # pass return + end = source.find(';', start) + 1 + if end == -1: + end = len(source) + trans = exp_translator(source[start:end].rstrip(';')) + return 'return %s\n' % (trans if trans else "var.get('undefined')"), end + + +# todo later?- Also important +def do_throw(source, start): + start += 5 # pass throw + end = source.find(';', start) + 1 + if not end: + end = len(source) + trans = exp_translator(source[start:end].rstrip(';')) + if not trans: + raise SyntaxError('Invalid throw statement: nothing to throw') + res = 'PyJsTempException = JsToPyException(%s)\nraise PyJsTempException\n' % trans + return res, end + + +def do_try(source, start): + start += 3 # pass try + block, start = do_block(source, start) + result = 'try:\n%s' % indent(block) + catch = except_keyword(source, start, 'catch') + if catch: + bra, catch = pass_bracket(source, catch, '()') + bra = bra[1:-1] + identifier, bra_end = parse_identifier(bra, 0) + holder = 'PyJsHolder_%s_%d' % (identifier.encode('hex'), + random.randrange(1e8)) + identifier = identifier.__repr__() + bra_end = pass_white(bra, bra_end) + if bra_end < len(bra): + raise SyntaxError('Invalid content of catch statement') + result += 'except PyJsException as PyJsTempException:\n' + block, catch = do_block(source, catch) + # fill in except ( catch ) block and remember to recover holder variable to its previous state + result += indent( + TRY_CATCH.replace('HOLDER', holder).replace('NAME', + identifier).replace( + 'BLOCK', + indent(block))) + start = max(catch, start) + final = except_keyword(source, start, 'finally') + if not (final or catch): + raise SyntaxError( + 'Try statement has to be followed by catch or finally') + if not final: + return result, start + # translate finally statement + block, start = do_block(source, final) + return result + 'finally:\n%s' % indent(block), start + + +def do_debugger(source, start): + start += 8 # pass debugger + end = pass_white(source, start) + if end < len(source) and source[end] == ';': + end += 1 + return 'pass\n', end #ignore errors... + + +# todo automatic ; insertion. fuck this crappy feature + +# Least important + + +def do_switch(source, start): + start += 6 # pass switch + code = 'while 1:\n' + indent('SWITCHED = False\nCONDITION = (%s)\n') + # parse value of check + val, start = pass_bracket(source, start, '()') + if val is None: + raise SyntaxError('Missing () after switch statement') + if not val.strip(): + raise SyntaxError('Missing content inside () after switch statement') + code = code % exp_translator(val) + bra, start = pass_bracket(source, start, '{}') + if bra is None: + raise SyntaxError('Missing block {} after switch statement') + bra_pos = 0 + bra = bra[1:-1] + ';' + while True: + case = except_keyword(bra, bra_pos, 'case') + default = except_keyword(bra, bra_pos, 'default') + assert not (case and default) + if case or default: # this ?: expression makes things much harder.... + case_code = None + if case: + case_code = 'if SWITCHED or PyJsStrictEq(CONDITION, %s):\n' + # we are looking for a first : with count 1. ? gives -1 and : gives +1. + count = 0 + for pos, e in enumerate(bra[case:], case): + if e == '?': + count -= 1 + elif e == ':': + count += 1 + if count == 1: + break + else: + raise SyntaxError( + 'Missing : token after case in switch statement') + case_condition = exp_translator( + bra[case:pos]) # switch {case CONDITION: statements} + case_code = case_code % case_condition + case = pos + 1 + if default: + case = except_token(bra, default, ':') + case_code = 'if True:\n' + # now parse case statements (things after ':' ) + cand, case = do_statement(bra, case) + while cand: + case_code += indent(cand) + cand, case = do_statement(bra, case) + case_code += indent('SWITCHED = True\n') + code += indent(case_code) + bra_pos = case + else: + break + # prevent infinite loop :) + code += indent('break\n') + return code, start + + +def do_pyimport(source, start): + start += 8 + lib, start = parse_identifier(source, start) + jlib = 'PyImport_%s' % lib + code = 'import %s as %s\n' % (lib, jlib) + #check whether valid lib name... + try: + compile(code, '', 'exec') + except: + raise SyntaxError( + 'Invalid Python module name (%s) in pyimport statement' % lib) + # var.pyimport will handle module conversion to PyJs object + code += 'var.pyimport(%s, %s)\n' % (repr(lib), jlib) + return code, start + + +def do_with(source, start): + raise NotImplementedError('With statement is not implemented yet :(') + + +KEYWORD_METHODS = { + 'do': do_dowhile, + 'while': do_while, + 'if': do_if, + 'throw': do_throw, + 'return': do_return, + 'continue': do_continue, + 'break': do_break, + 'try': do_try, + 'for': do_for, + 'switch': do_switch, + 'var': do_var, + 'debugger': do_debugger, # this one does not do anything + 'with': do_with, + 'pyimport': do_pyimport +} + +#Also not specific statements (harder to detect) +# Block {} +# Expression or Empty Statement +# Label +# +# Its easy to recognize block but harder to distinguish between label and expression statement + + +def translate_flow(source): + """Source cant have arrays, object, constant or function literals. + Returns PySource and variables to register""" + global TO_REGISTER + TO_REGISTER = [] + return do_block('{%s}' % source, 0)[0], TO_REGISTER + + +if __name__ == '__main__': + #print do_dowhile('do {} while(k+f)', 0)[0] + #print 'e: "%s"'%do_expression('++(c?g:h); mj', 0)[0] + print translate_flow('a; yimport test')[0] diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/functions.py b/Contents/Libraries/Shared/js2py/legecy_translators/functions.py new file mode 100644 index 000000000..4825eee0f --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/functions.py @@ -0,0 +1,98 @@ +"""This module removes JS functions from source code""" +from jsparser import * +from utils import * + +INLINE_NAME = 'PyJsLvalInline%d_' +INLINE_COUNT = 0 +PRE_EXP_STARTS = { + 'return', 'new', 'void', 'throw', 'typeof', 'in', 'instanceof' +} +PRE_ALLOWED = IDENTIFIER_PART.union({';', '{', '}', ']', ')', ':'}) +INCREMENTS = {'++', '--'} + + +def reset_inline_count(): + global INLINE_COUNT + INLINE_COUNT = 0 + + +def remove_functions(source, all_inline=False): + """removes functions and returns new source, and 2 dicts. + first dict with removed hoisted(global) functions and second with replaced inline functions""" + global INLINE_COUNT + inline = {} + hoisted = {} + n = 0 + limit = len(source) - 9 # 8 is length of 'function' + res = '' + last = 0 + while n < limit: + if n and source[n - 1] in IDENTIFIER_PART: + n += 1 + continue + if source[n:n + 8] == 'function' and source[n + + 8] not in IDENTIFIER_PART: + if source[:n].rstrip().endswith( + '.'): # allow function as a property name :) + n += 1 + continue + if source[n + 8:].lstrip().startswith( + ':'): # allow functions inside objects... + n += 1 + continue + entered = n + res += source[last:n] + name = '' + n = pass_white(source, n + 8) + if source[n] in IDENTIFIER_START: # hoisted function + name, n = parse_identifier(source, n) + args, n = pass_bracket(source, n, '()') + if not args: + raise SyntaxError('Function misses bracket with argnames ()') + args = args.strip('() \n') + args = tuple(parse_identifier(e, 0)[0] + for e in argsplit(args)) if args else () + if len(args) - len(set(args)): + # I know its legal in JS but python does not allow duplicate argnames + # I will not work around it + raise SyntaxError( + 'Function has duplicate argument names. Its not legal in this implementation. Sorry.' + ) + block, n = pass_bracket(source, n, '{}') + if not block: + raise SyntaxError( + 'Function does not have any code block to execute') + mixed = False # named function expression flag + if name and not all_inline: + # Here I will distinguish between named function expression (mixed) and a function statement + before = source[:entered].rstrip() + if any(endswith_keyword(before, e) for e in PRE_EXP_STARTS): + #print 'Ended ith keyword' + mixed = True + elif before and before[-1] not in PRE_ALLOWED and not before[ + -2:] in INCREMENTS: + #print 'Ended with'+repr(before[-1]), before[-1]=='}' + mixed = True + else: + #print 'FUNCTION STATEMENT' + #its a function statement. + # todo remove fucking label if present! + hoisted[name] = block, args + if not name or mixed or all_inline: # its a function expression (can be both named and not named) + #print 'FUNCTION EXPRESSION' + INLINE_COUNT += 1 + iname = INLINE_NAME % INLINE_COUNT # inline name + res += ' ' + iname + inline['%s@%s' % ( + iname, name + )] = block, args #here added real name at the end because it has to be added to the func scope + last = n + else: + n += 1 + res += source[last:] + return res, hoisted, inline + + +if __name__ == '__main__': + print remove_functions( + '5+5 function n (functiona ,functionaj) {dsd s, dsdd}') diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/jsparser.py b/Contents/Libraries/Shared/js2py/legecy_translators/jsparser.py new file mode 100644 index 000000000..a09537d31 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/jsparser.py @@ -0,0 +1,326 @@ +""" +The process of translating JS will go like that: # TOP = 'imports and scope set' + +1. Remove all the comments +2. Replace number, string and regexp literals with markers +4. Remove global Functions and move their translation to the TOP. Also add register code there. +5. Replace inline functions with lvals +6. Remove List and Object literals and replace them with lvals +7. Find and remove var declarations, generate python register code that would go on TOP. + +Here we should be left with global code only where 1 line of js code = 1 line of python code. +Routine translating this code should be called glob_translate: +1. Search for outer structures and translate them using glob and inside using exps_translate + + +exps_translate routine: +1. Remove outer {} +2. Split lines at ; +3. Convert line by line using exp_translate +4. In case of error in 3 try to insert ; according to ECMA rules and repeat 3. + +exp_translate routine: +It takes a single line of JS code and returns a SINGLE line of Python code. +Note var is not present here because it was removed in previous stages. +If case of parsing errors it must return a pos of error. +1. Convert all assignment operations to put operations, this may be hard :( +2. Convert all gets and calls to get and callprop. +3. Convert unary operators like typeof, new, !, delete. + Delete can be handled by replacing last get method with delete. +4. Convert remaining operators that are not handled by python eg: === and , + + + + + +lval format PyJsLvalNR +marker PyJs(TYPE_NAME)(NR) + +TODO +1. Number literal replacement +2. Array literal replacement +3. Object literal replacement +5. Function replacement +4. Literal replacement translators + + +""" + +from utils import * + +OP_METHODS = { + '*': '__mul__', + '/': '__div__', + '%': '__mod__', + '+': '__add__', + '-': '__sub__', + '<<': '__lshift__', + '>>': '__rshift__', + '&': '__and__', + '^': '__xor__', + '|': '__or__' +} + + +def dbg(source): + try: + with open('C:\Users\Piotrek\Desktop\dbg.py', 'w') as f: + f.write(source) + except: + pass + + +def indent(lines, ind=4): + return ind * ' ' + lines.replace('\n', '\n' + ind * ' ').rstrip(' ') + + +def inject_before_lval(source, lval, code): + if source.count(lval) > 1: + dbg(source) + print + print lval + raise RuntimeError('To many lvals (%s)' % lval) + elif not source.count(lval): + dbg(source) + print + print lval + assert lval not in source + raise RuntimeError('No lval found "%s"' % lval) + end = source.index(lval) + inj = source.rfind('\n', 0, end) + ind = inj + while source[ind + 1] == ' ': + ind += 1 + ind -= inj + return source[:inj + 1] + indent(code, ind) + source[inj + 1:] + + +def bracket_split(source, brackets=('()', '{}', '[]'), strip=False): + """DOES NOT RETURN EMPTY STRINGS (can only return empty bracket content if strip=True)""" + starts = [e[0] for e in brackets] + in_bracket = 0 + n = 0 + last = 0 + while n < len(source): + e = source[n] + if not in_bracket and e in starts: + in_bracket = 1 + start = n + b_start, b_end = brackets[starts.index(e)] + elif in_bracket: + if e == b_start: + in_bracket += 1 + elif e == b_end: + in_bracket -= 1 + if not in_bracket: + if source[last:start]: + yield source[last:start] + last = n + 1 + yield source[start + strip:n + 1 - strip] + n += 1 + if source[last:]: + yield source[last:] + + +def pass_bracket(source, start, bracket='()'): + """Returns content of brackets with brackets and first pos after brackets + if source[start] is followed by some optional white space and brackets. + Otherwise None""" + e = bracket_split(source[start:], [bracket], False) + try: + cand = e.next() + except StopIteration: + return None, None + if not cand.strip(): #white space... + try: + res = e.next() + return res, start + len(cand) + len(res) + except StopIteration: + return None, None + elif cand[-1] == bracket[1]: + return cand, start + len(cand) + else: + return None, None + + +def startswith_keyword(start, keyword): + start = start.lstrip() + if start.startswith(keyword): + if len(keyword) < len(start): + if start[len(keyword)] in IDENTIFIER_PART: + return False + return True + return False + + +def endswith_keyword(ending, keyword): + ending = ending.rstrip() + if ending.endswith(keyword): + if len(keyword) < len(ending): + if ending[len(ending) - len(keyword) - 1] in IDENTIFIER_PART: + return False + return True + return False + + +def pass_white(source, start): + n = start + while n < len(source): + if source[n] in SPACE: + n += 1 + else: + break + return n + + +def except_token(source, start, token, throw=True): + """Token can be only a single char. Returns position after token if found. Otherwise raises syntax error if throw + otherwise returns None""" + start = pass_white(source, start) + if start < len(source) and source[start] == token: + return start + 1 + if throw: + raise SyntaxError('Missing token. Expected %s' % token) + return None + + +def except_keyword(source, start, keyword): + """ Returns position after keyword if found else None + Note: skips white space""" + start = pass_white(source, start) + kl = len(keyword) #keyword len + if kl + start > len(source): + return None + if source[start:start + kl] != keyword: + return None + if kl + start < len(source) and source[start + kl] in IDENTIFIER_PART: + return None + return start + kl + + +def parse_identifier(source, start, throw=True): + """passes white space from start and returns first identifier, + if identifier invalid and throw raises SyntaxError otherwise returns None""" + start = pass_white(source, start) + end = start + if not end < len(source): + if throw: + raise SyntaxError('Missing identifier!') + return None + if source[end] not in IDENTIFIER_START: + if throw: + raise SyntaxError('Invalid identifier start: "%s"' % source[end]) + return None + end += 1 + while end < len(source) and source[end] in IDENTIFIER_PART: + end += 1 + if not is_valid_lval(source[start:end]): + if throw: + raise SyntaxError( + 'Invalid identifier name: "%s"' % source[start:end]) + return None + return source[start:end], end + + +def argsplit(args, sep=','): + """used to split JS args (it is not that simple as it seems because + sep can be inside brackets). + + pass args *without* brackets! + + Used also to parse array and object elements, and more""" + parsed_len = 0 + last = 0 + splits = [] + for e in bracket_split(args, brackets=['()', '[]', '{}']): + if e[0] not in {'(', '[', '{'}: + for i, char in enumerate(e): + if char == sep: + splits.append(args[last:parsed_len + i]) + last = parsed_len + i + 1 + parsed_len += len(e) + splits.append(args[last:]) + return splits + + +def split_add_ops(text): + """Specialized function splitting text at add/sub operators. + Operands are *not* translated. Example result ['op1', '+', 'op2', '-', 'op3']""" + n = 0 + text = text.replace('++', '##').replace( + '--', '@@') #text does not normally contain any of these + spotted = False # set to true if noticed anything other than +- or white space + last = 0 + while n < len(text): + e = text[n] + if e == '+' or e == '-': + if spotted: + yield text[last:n].replace('##', '++').replace('@@', '--') + yield e + last = n + 1 + spotted = False + elif e == '/' or e == '*' or e == '%': + spotted = False + elif e != ' ': + spotted = True + n += 1 + yield text[last:n].replace('##', '++').replace('@@', '--') + + +def split_at_any(text, + lis, + translate=False, + not_before=[], + not_after=[], + validitate=None): + """ doc """ + lis.sort(key=lambda x: len(x), reverse=True) + last = 0 + n = 0 + text_len = len(text) + while n < text_len: + if any(text[:n].endswith(e) + for e in not_before): #Cant end with end before + n += 1 + continue + for e in lis: + s = len(e) + if s + n > text_len: + continue + if validitate and not validitate(e, text[:n], text[n + s:]): + continue + if any(text[n + s:].startswith(e) + for e in not_after): #Cant end with end before + n += 1 + break + if e == text[n:n + s]: + yield text[last:n] if not translate else translate( + text[last:n]) + yield e + n += s + last = n + break + else: + n += 1 + yield text[last:n] if not translate else translate(text[last:n]) + + +def split_at_single(text, sep, not_before=[], not_after=[]): + """Works like text.split(sep) but separated fragments + cant end with not_before or start with not_after""" + n = 0 + lt, s = len(text), len(sep) + last = 0 + while n < lt: + if not s + n > lt: + if sep == text[n:n + s]: + if any(text[last:n].endswith(e) for e in not_before): + pass + elif any(text[n + s:].startswith(e) for e in not_after): + pass + else: + yield text[last:n] + last = n + s + n += s - 1 + n += 1 + yield text[last:] diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/nodevisitor.py b/Contents/Libraries/Shared/js2py/legecy_translators/nodevisitor.py new file mode 100644 index 000000000..4d50545c9 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/nodevisitor.py @@ -0,0 +1,562 @@ +from jsparser import * +from utils import * +import re +from utils import * + +#Note all white space sent to this module must be ' ' so no '\n' +REPL = {} + +#PROBLEMS +# <<=, >>=, >>>= +# they are unusual so I will not fix that now. a++ +b works fine and a+++++b (a++ + ++b) does not work even in V8 +ASSIGNMENT_MATCH = '(?<!=|!|<|>)=(?!=)' + + +def unary_validitator(keyword, before, after): + if keyword[-1] in IDENTIFIER_PART: + if not after or after[0] in IDENTIFIER_PART: + return False + if before and before[-1] in IDENTIFIER_PART: # I am not sure here... + return False + return True + + +def comb_validitator(keyword, before, after): + if keyword == 'instanceof' or keyword == 'in': + if before and before[-1] in IDENTIFIER_PART: + return False + elif after and after[0] in IDENTIFIER_PART: + return False + return True + + +def bracket_replace(code): + new = '' + for e in bracket_split(code, ['()', '[]'], False): + if e[0] == '[': + name = '#PYJSREPL' + str(len(REPL)) + '{' + new += name + REPL[name] = e + elif e[0] == '(': # can be a function call + name = '@PYJSREPL' + str(len(REPL)) + '}' + new += name + REPL[name] = e + else: + new += e + return new + + +class NodeVisitor: + def __init__(self, code): + self.code = code + + def rl(self, lis, op): + """performs this operation on a list from *right to left* + op must take 2 args + a,b,c => op(a, op(b, c))""" + it = reversed(lis) + res = trans(it.next()) + for e in it: + e = trans(e) + res = op(e, res) + return res + + def lr(self, lis, op): + """performs this operation on a list from *left to right* + op must take 2 args + a,b,c => op(op(a, b), c)""" + it = iter(lis) + res = trans(it.next()) + for e in it: + e = trans(e) + res = op(res, e) + return res + + def translate(self): + """Translates outer operation and calls translate on inner operation. + Returns fully translated code.""" + if not self.code: + return '' + new = bracket_replace(self.code) + #Check comma operator: + cand = new.split(',') #every comma in new must be an operator + if len(cand) > 1: #LR + return self.lr(cand, js_comma) + #Check = operator: + # dont split at != or !== or == or === or <= or >= + #note <<=, >>= or this >>> will NOT be supported + # maybe I will change my mind later + # Find this crappy ?: + if '?' in new: + cond_ind = new.find('?') + tenary_start = 0 + for ass in re.finditer(ASSIGNMENT_MATCH, new): + cand = ass.span()[1] + if cand < cond_ind: + tenary_start = cand + else: + break + actual_tenary = new[tenary_start:] + spl = ''.join(split_at_any(new, [':', '?'], translate=trans)) + tenary_translation = transform_crap(spl) + assignment = new[:tenary_start] + ' PyJsConstantTENARY' + return trans(assignment).replace('PyJsConstantTENARY', + tenary_translation) + cand = list(split_at_single(new, '=', ['!', '=', '<', '>'], ['='])) + if len(cand) > 1: # RL + it = reversed(cand) + res = trans(it.next()) + for e in it: + e = e.strip() + if not e: + raise SyntaxError('Missing left-hand in assignment!') + op = '' + if e[-2:] in OP_METHODS: + op = ',' + e[-2:].__repr__() + e = e[:-2] + elif e[-1:] in OP_METHODS: + op = ',' + e[-1].__repr__() + e = e[:-1] + e = trans(e) + #Now replace last get method with put and change args + c = list(bracket_split(e, ['()'])) + beg, arglist = ''.join(c[:-1]).strip(), c[-1].strip( + ) #strips just to make sure... I will remove it later + if beg[-4:] != '.get': + raise SyntaxError('Invalid left-hand side in assignment') + beg = beg[0:-3] + 'put' + arglist = arglist[0:-1] + ', ' + res + op + ')' + res = beg + arglist + return res + #Now check remaining 2 arg operators that are not handled by python + #They all have Left to Right (LR) associativity + order = [OR, AND, BOR, BXOR, BAND, EQS, COMPS, BSHIFTS, ADDS, MULTS] + # actually we dont need OR and AND because they can be handled easier. But just for fun + dangerous = ['<', '>'] + for typ in order: + #we have to use special method for ADDS since they can be also unary operation +/++ or -/-- FUCK + if '+' in typ: + cand = list(split_add_ops(new)) + else: + #dont translate. cant start or end on dangerous op. + cand = list( + split_at_any( + new, + typ.keys(), + False, + dangerous, + dangerous, + validitate=comb_validitator)) + if not len(cand) > 1: + continue + n = 1 + res = trans(cand[0]) + if not res: + raise SyntaxError("Missing operand!") + while n < len(cand): + e = cand[n] + if not e: + raise SyntaxError("Missing operand!") + if n % 2: + op = typ[e] + else: + res = op(res, trans(e)) + n += 1 + return res + #Now replace unary operators - only they are left + cand = list( + split_at_any( + new, UNARY.keys(), False, validitate=unary_validitator)) + if len(cand) > 1: #contains unary operators + if '++' in cand or '--' in cand: #it cant contain both ++ and -- + if '--' in cand: + op = '--' + meths = js_post_dec, js_pre_dec + else: + op = '++' + meths = js_post_inc, js_pre_inc + pos = cand.index(op) + if cand[pos - 1].strip(): # post increment + a = cand[pos - 1] + meth = meths[0] + elif cand[pos + 1].strip(): #pre increment + a = cand[pos + 1] + meth = meths[1] + else: + raise SyntaxError('Invalid use of ++ operator') + if cand[pos + 2:]: + raise SyntaxError('Too many operands') + operand = meth(trans(a)) + cand = cand[:pos - 1] + # now last cand should be operand and every other odd element should be empty + else: + operand = trans(cand[-1]) + del cand[-1] + for i, e in enumerate(reversed(cand)): + if i % 2: + if e.strip(): + raise SyntaxError('Too many operands') + else: + operand = UNARY[e](operand) + return operand + #Replace brackets + if new[0] == '@' or new[0] == '#': + if len( + list(bracket_split(new, ('#{', '@}'))) + ) == 1: # we have only one bracket, otherwise pseudobracket like @@.... + assert new in REPL + if new[0] == '#': + raise SyntaxError( + '[] cant be used as brackets! Use () instead.') + return '(' + trans(REPL[new][1:-1]) + ')' + #Replace function calls and prop getters + # 'now' must be a reference like: a or b.c.d but it can have also calls or getters ( for example a["b"](3)) + #From here @@ means a function call and ## means get operation (note they dont have to present) + it = bracket_split(new, ('#{', '@}')) + res = [] + for e in it: + if e[0] != '#' and e[0] != '@': + res += [x.strip() for x in e.split('.')] + else: + res += [e.strip()] + # res[0] can be inside @@ (name)... + res = filter(lambda x: x, res) + if is_internal(res[0]): + out = res[0] + elif res[0][0] in {'#', '@'}: + out = '(' + trans(REPL[res[0]][1:-1]) + ')' + elif is_valid_lval( + res[0]) or res[0] in {'this', 'false', 'true', 'null'}: + out = 'var.get(' + res[0].__repr__() + ')' + else: + if is_reserved(res[0]): + raise SyntaxError('Unexpected reserved word: "%s"' % res[0]) + raise SyntaxError('Invalid identifier: "%s"' % res[0]) + if len(res) == 1: + return out + n = 1 + while n < len(res): #now every func call is a prop call + e = res[n] + if e[0] == '@': # direct call + out += trans_args(REPL[e]) + n += 1 + continue + args = False #assume not prop call + if n + 1 < len(res) and res[n + 1][0] == '@': #prop call + args = trans_args(REPL[res[n + 1]])[1:] + if args != ')': + args = ',' + args + if e[0] == '#': + prop = trans(REPL[e][1:-1]) + else: + if not is_lval(e): + raise SyntaxError('Invalid identifier: "%s"' % e) + prop = e.__repr__() + if args: # prop call + n += 1 + out += '.callprop(' + prop + args + else: #prop get + out += '.get(' + prop + ')' + n += 1 + return out + + +def js_comma(a, b): + return 'PyJsComma(' + a + ',' + b + ')' + + +def js_or(a, b): + return '(' + a + ' or ' + b + ')' + + +def js_bor(a, b): + return '(' + a + '|' + b + ')' + + +def js_bxor(a, b): + return '(' + a + '^' + b + ')' + + +def js_band(a, b): + return '(' + a + '&' + b + ')' + + +def js_and(a, b): + return '(' + a + ' and ' + b + ')' + + +def js_strict_eq(a, b): + + return 'PyJsStrictEq(' + a + ',' + b + ')' + + +def js_strict_neq(a, b): + return 'PyJsStrictNeq(' + a + ',' + b + ')' + + +#Not handled by python in the same way like JS. For example 2==2==True returns false. +# In JS above would return true so we need brackets. +def js_abstract_eq(a, b): + return '(' + a + '==' + b + ')' + + +#just like == +def js_abstract_neq(a, b): + return '(' + a + '!=' + b + ')' + + +def js_lt(a, b): + return '(' + a + '<' + b + ')' + + +def js_le(a, b): + return '(' + a + '<=' + b + ')' + + +def js_ge(a, b): + return '(' + a + '>=' + b + ')' + + +def js_gt(a, b): + return '(' + a + '>' + b + ')' + + +def js_in(a, b): + return b + '.contains(' + a + ')' + + +def js_instanceof(a, b): + return a + '.instanceof(' + b + ')' + + +def js_lshift(a, b): + return '(' + a + '<<' + b + ')' + + +def js_rshift(a, b): + return '(' + a + '>>' + b + ')' + + +def js_shit(a, b): + return 'PyJsBshift(' + a + ',' + b + ')' + + +def js_add( + a, + b): # To simplify later process of converting unary operators + and ++ + return '(%s+%s)' % (a, b) + + +def js_sub(a, b): # To simplify + return '(%s-%s)' % (a, b) + + +def js_mul(a, b): + return '(' + a + '*' + b + ')' + + +def js_div(a, b): + return '(' + a + '/' + b + ')' + + +def js_mod(a, b): + return '(' + a + '%' + b + ')' + + +def js_typeof(a): + cand = list(bracket_split(a, ('()', ))) + if len(cand) == 2 and cand[0] == 'var.get': + return cand[0] + cand[1][:-1] + ',throw=False).typeof()' + return a + '.typeof()' + + +def js_void(a): + return '(' + a + ')' + + +def js_new(a): + cands = list(bracket_split(a, ('()', ))) + lim = len(cands) + if lim < 2: + return a + '.create()' + n = 0 + while n < lim: + c = cands[n] + if c[0] == '(': + if cands[n - 1].endswith( + '.get') and n + 1 >= lim: # last get operation. + return a + '.create()' + elif cands[n - 1][0] == '(': + return ''.join(cands[:n]) + '.create' + c + ''.join( + cands[n + 1:]) + elif cands[n - 1] == '.callprop': + beg = ''.join(cands[:n - 1]) + args = argsplit(c[1:-1], ',') + prop = args[0] + new_args = ','.join(args[1:]) + create = '.get(%s).create(%s)' % (prop, new_args) + return beg + create + ''.join(cands[n + 1:]) + n += 1 + return a + '.create()' + + +def js_delete(a): + #replace last get with delete. + c = list(bracket_split(a, ['()'])) + beg, arglist = ''.join(c[:-1]).strip(), c[-1].strip( + ) #strips just to make sure... I will remove it later + if beg[-4:] != '.get': + raise SyntaxError('Invalid delete operation') + return beg[:-3] + 'delete' + arglist + + +def js_neg(a): + return '(-' + a + ')' + + +def js_pos(a): + return '(+' + a + ')' + + +def js_inv(a): + return '(~' + a + ')' + + +def js_not(a): + return a + '.neg()' + + +def postfix(a, inc, post): + bra = list(bracket_split(a, ('()', ))) + meth = bra[-2] + if not meth.endswith('get'): + raise SyntaxError('Invalid ++ or -- operation.') + bra[-2] = bra[-2][:-3] + 'put' + bra[-1] = '(%s,%s%sJs(1))' % (bra[-1][1:-1], a, '+' if inc else '-') + res = ''.join(bra) + return res if not post else '(%s%sJs(1))' % (res, '-' if inc else '+') + + +def js_pre_inc(a): + return postfix(a, True, False) + + +def js_post_inc(a): + return postfix(a, True, True) + + +def js_pre_dec(a): + return postfix(a, False, False) + + +def js_post_dec(a): + return postfix(a, False, True) + + +OR = {'||': js_or} +AND = {'&&': js_and} +BOR = {'|': js_bor} +BXOR = {'^': js_bxor} +BAND = {'&': js_band} + +EQS = { + '===': js_strict_eq, + '!==': js_strict_neq, + '==': js_abstract_eq, # we need == and != too. Read a note above method + '!=': js_abstract_neq +} + +#Since JS does not have chained comparisons we need to implement all cmp methods. +COMPS = { + '<': js_lt, + '<=': js_le, + '>=': js_ge, + '>': js_gt, + 'instanceof': js_instanceof, #todo change to validitate + 'in': js_in +} + +BSHIFTS = {'<<': js_lshift, '>>': js_rshift, '>>>': js_shit} + +ADDS = {'+': js_add, '-': js_sub} + +MULTS = {'*': js_mul, '/': js_div, '%': js_mod} + +#Note they dont contain ++ and -- methods because they both have 2 different methods +# correct method will be found automatically in translate function +UNARY = { + 'typeof': js_typeof, + 'void': js_void, + 'new': js_new, + 'delete': js_delete, + '!': js_not, + '-': js_neg, + '+': js_pos, + '~': js_inv, + '++': None, + '--': None +} + + +def transform_crap(code): #needs some more tests + """Transforms this ?: crap into if else python syntax""" + ind = code.rfind('?') + if ind == -1: + return code + sep = code.find(':', ind) + if sep == -1: + raise SyntaxError('Invalid ?: syntax (probably missing ":" )') + beg = max(code.rfind(':', 0, ind), code.find('?', 0, ind)) + 1 + end = code.find(':', sep + 1) + end = len(code) if end == -1 else end + formula = '(' + code[ind + 1:sep] + ' if ' + code[ + beg:ind] + ' else ' + code[sep + 1:end] + ')' + return transform_crap(code[:beg] + formula + code[end:]) + + +from code import InteractiveConsole + +#e = InteractiveConsole(globals()).interact() +import traceback + + +def trans(code): + return NodeVisitor(code.strip()).translate().strip() + + +#todo finish this trans args +def trans_args(code): + new = bracket_replace(code.strip()[1:-1]) + args = ','.join(trans(e) for e in new.split(',')) + return '(%s)' % args + + +EXP = 0 + + +def exp_translator(code): + global REPL, EXP + EXP += 1 + REPL = {} + #print EXP, code + code = code.replace('\n', ' ') + assert '@' not in code + assert ';' not in code + assert '#' not in code + #if not code.strip(): #? + # return 'var.get("undefined")' + try: + return trans(code) + except: + #print '\n\ntrans failed on \n\n' + code + #raw_input('\n\npress enter') + raise + + +if __name__ == '__main__': + #print 'Here', trans('(eee ) . ii [ PyJsMarker ] [ jkj ] ( j , j ) . + # jiji (h , ji , i)(non )( )()()()') + for e in xrange(3): + print exp_translator('jk = kk.ik++') + #First line translated with PyJs: PyJsStrictEq(PyJsAdd((Js(100)*Js(50)),Js(30)), Js("5030")), yay! + print exp_translator('delete a.f') diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/nparser.py b/Contents/Libraries/Shared/js2py/legecy_translators/nparser.py new file mode 100644 index 000000000..a9c97c9ae --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/nparser.py @@ -0,0 +1,3209 @@ +# JUST FOR NOW, later I will write my own - much faster and better. + +# Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com> +# Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com> +# Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com> +# Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be> +# Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl> +# Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com> +# Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com> +# Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com> +# Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com> +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# -*- coding: latin-1 -*- +from __future__ import print_function +import re + + +def typeof(t): + if t is None: return 'undefined' + elif isinstance(t, bool): return 'boolean' + elif isinstance(t, str): return 'string' + elif isinstance(t, int) or isinstance(t, float): return 'number' + elif hasattr(t, '__call__'): return 'function' + else: return 'object' + + +def list_indexOf(l, v): + try: + return l.index(v) + except: + return -1 + + +parseFloat = float +parseInt = int + + +class jsdict(object): + def __init__(self, d): + self.__dict__.update(d) + + def __getitem__(self, name): + if name in self.__dict__: + return self.__dict__[name] + else: + return None + + def __setitem__(self, name, value): + self.__dict__[name] = value + return value + + def __getattr__(self, name): + try: + return getattr(self, name) + except: + return None + + def __setattr__(self, name, value): + self[name] = value + return value + + def __contains__(self, name): + return name in self.__dict__ + + def __repr__(self): + return str(self.__dict__) + + +class RegExp(object): + def __init__(self, pattern, flags=''): + self.flags = flags + pyflags = 0 | re.M if 'm' in flags else 0 | re.I if 'i' in flags else 0 + self.source = pattern + self.pattern = re.compile(pattern, pyflags) + + def test(self, s): + return self.pattern.search(s) is not None + + +console = jsdict({"log": print}) + + +def __temp__42(object=None, body=None): + return jsdict({ + "type": Syntax.WithStatement, + "object": object, + "body": body, + }) + + +def __temp__41(test=None, body=None): + return jsdict({ + "type": Syntax.WhileStatement, + "test": test, + "body": body, + }) + + +def __temp__40(id=None, init=None): + return jsdict({ + "type": Syntax.VariableDeclarator, + "id": id, + "init": init, + }) + + +def __temp__39(declarations=None, kind=None): + return jsdict({ + "type": Syntax.VariableDeclaration, + "declarations": declarations, + "kind": kind, + }) + + +def __temp__38(operator=None, argument=None): + if (operator == "++") or (operator == "--"): + return jsdict({ + "type": Syntax.UpdateExpression, + "operator": operator, + "argument": argument, + "prefix": True, + }) + return jsdict({ + "type": Syntax.UnaryExpression, + "operator": operator, + "argument": argument, + "prefix": True, + }) + + +def __temp__37(block=None, guardedHandlers=None, handlers=None, + finalizer=None): + return jsdict({ + "type": Syntax.TryStatement, + "block": block, + "guardedHandlers": guardedHandlers, + "handlers": handlers, + "finalizer": finalizer, + }) + + +def __temp__36(argument=None): + return jsdict({ + "type": Syntax.ThrowStatement, + "argument": argument, + }) + + +def __temp__35(): + return jsdict({ + "type": Syntax.ThisExpression, + }) + + +def __temp__34(discriminant=None, cases=None): + return jsdict({ + "type": Syntax.SwitchStatement, + "discriminant": discriminant, + "cases": cases, + }) + + +def __temp__33(test=None, consequent=None): + return jsdict({ + "type": Syntax.SwitchCase, + "test": test, + "consequent": consequent, + }) + + +def __temp__32(expressions=None): + return jsdict({ + "type": Syntax.SequenceExpression, + "expressions": expressions, + }) + + +def __temp__31(argument=None): + return jsdict({ + "type": Syntax.ReturnStatement, + "argument": argument, + }) + + +def __temp__30(kind=None, key=None, value=None): + return jsdict({ + "type": Syntax.Property, + "key": key, + "value": value, + "kind": kind, + }) + + +def __temp__29(body=None): + return jsdict({ + "type": Syntax.Program, + "body": body, + }) + + +def __temp__28(operator=None, argument=None): + return jsdict({ + "type": Syntax.UpdateExpression, + "operator": operator, + "argument": argument, + "prefix": False, + }) + + +def __temp__27(properties=None): + return jsdict({ + "type": Syntax.ObjectExpression, + "properties": properties, + }) + + +def __temp__26(callee=None, args=None): + return jsdict({ + "type": Syntax.NewExpression, + "callee": callee, + "arguments": args, + }) + + +def __temp__25(accessor=None, object=None, property=None): + return jsdict({ + "type": Syntax.MemberExpression, + "computed": accessor == "[", + "object": object, + "property": property, + }) + + +def __temp__24(token=None): + return jsdict({ + "type": Syntax.Literal, + "value": token.value, + "raw": source[token.range[0]:token.range[1]], + }) + + +def __temp__23(label=None, body=None): + return jsdict({ + "type": Syntax.LabeledStatement, + "label": label, + "body": body, + }) + + +def __temp__22(test=None, consequent=None, alternate=None): + return jsdict({ + "type": Syntax.IfStatement, + "test": test, + "consequent": consequent, + "alternate": alternate, + }) + + +def __temp__21(name=None): + return jsdict({ + "type": Syntax.Identifier, + "name": name, + }) + + +def __temp__20(id=None, params=None, defaults=None, body=None): + return jsdict({ + "type": Syntax.FunctionExpression, + "id": id, + "params": params, + "defaults": defaults, + "body": body, + "rest": None, + "generator": False, + "expression": False, + }) + + +def __temp__19(id=None, params=None, defaults=None, body=None): + return jsdict({ + "type": Syntax.FunctionDeclaration, + "id": id, + "params": params, + "defaults": defaults, + "body": body, + "rest": None, + "generator": False, + "expression": False, + }) + + +def __temp__18(left=None, right=None, body=None): + return jsdict({ + "type": Syntax.ForInStatement, + "left": left, + "right": right, + "body": body, + "each": False, + }) + + +def __temp__17(init=None, test=None, update=None, body=None): + return jsdict({ + "type": Syntax.ForStatement, + "init": init, + "test": test, + "update": update, + "body": body, + }) + + +def __temp__16(expression=None): + return jsdict({ + "type": Syntax.ExpressionStatement, + "expression": expression, + }) + + +def __temp__15(): + return jsdict({ + "type": Syntax.EmptyStatement, + }) + + +def __temp__14(body=None, test=None): + return jsdict({ + "type": Syntax.DoWhileStatement, + "body": body, + "test": test, + }) + + +def __temp__13(): + return jsdict({ + "type": Syntax.DebuggerStatement, + }) + + +def __temp__12(label=None): + return jsdict({ + "type": Syntax.ContinueStatement, + "label": label, + }) + + +def __temp__11(test=None, consequent=None, alternate=None): + return jsdict({ + "type": Syntax.ConditionalExpression, + "test": test, + "consequent": consequent, + "alternate": alternate, + }) + + +def __temp__10(param=None, body=None): + return jsdict({ + "type": Syntax.CatchClause, + "param": param, + "body": body, + }) + + +def __temp__9(callee=None, args=None): + return jsdict({ + "type": Syntax.CallExpression, + "callee": callee, + "arguments": args, + }) + + +def __temp__8(label=None): + return jsdict({ + "type": Syntax.BreakStatement, + "label": label, + }) + + +def __temp__7(body=None): + return jsdict({ + "type": Syntax.BlockStatement, + "body": body, + }) + + +def __temp__6(operator=None, left=None, right=None): + type = (Syntax.LogicalExpression if (operator == "||") or + (operator == "&&") else Syntax.BinaryExpression) + return jsdict({ + "type": type, + "operator": operator, + "left": left, + "right": right, + }) + + +def __temp__5(operator=None, left=None, right=None): + return jsdict({ + "type": Syntax.AssignmentExpression, + "operator": operator, + "left": left, + "right": right, + }) + + +def __temp__4(elements=None): + return jsdict({ + "type": Syntax.ArrayExpression, + "elements": elements, + }) + + +def __temp__3(node=None): + if extra.source: + node.loc.source = extra.source + return node + + +def __temp__2(node=None): + if node.range or node.loc: + if extra.loc: + state.markerStack.pop() + state.markerStack.pop() + if extra.range: + state.markerStack.pop() + else: + SyntaxTreeDelegate.markEnd(node) + return node + + +def __temp__1(node=None): + if extra.range: + node.range = [state.markerStack.pop(), index] + if extra.loc: + node.loc = jsdict({ + "start": + jsdict({ + "line": state.markerStack.pop(), + "column": state.markerStack.pop(), + }), + "end": + jsdict({ + "line": lineNumber, + "column": index - lineStart, + }), + }) + SyntaxTreeDelegate.postProcess(node) + return node + + +def __temp__0(): + if extra.loc: + state.markerStack.append(index - lineStart) + state.markerStack.append(lineNumber) + if extra.range: + state.markerStack.append(index) + + +Token = None +TokenName = None +FnExprTokens = None +Syntax = None +PropertyKind = None +Messages = None +Regex = None +SyntaxTreeDelegate = None +source = None +strict = None +index = None +lineNumber = None +lineStart = None +length = None +delegate = None +lookahead = None +state = None +extra = None +Token = jsdict({ + "BooleanLiteral": 1, + "EOF": 2, + "Identifier": 3, + "Keyword": 4, + "NullLiteral": 5, + "NumericLiteral": 6, + "Punctuator": 7, + "StringLiteral": 8, + "RegularExpression": 9, +}) +TokenName = jsdict({}) +TokenName[Token.BooleanLiteral] = "Boolean" +TokenName[Token.EOF] = "<end>" +TokenName[Token.Identifier] = "Identifier" +TokenName[Token.Keyword] = "Keyword" +TokenName[Token.NullLiteral] = "Null" +TokenName[Token.NumericLiteral] = "Numeric" +TokenName[Token.Punctuator] = "Punctuator" +TokenName[Token.StringLiteral] = "String" +TokenName[Token.RegularExpression] = "RegularExpression" +FnExprTokens = [ + "(", "{", "[", "in", "typeof", "instanceof", "new", "return", "case", + "delete", "throw", "void", "=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", + ">>>=", "&=", "|=", "^=", ",", "+", "-", "*", "/", "%", "++", "--", "<<", + ">>", ">>>", "&", "|", "^", "!", "~", "&&", "||", "?", ":", "===", "==", + ">=", "<=", "<", ">", "!=", "!==" +] +Syntax = jsdict({ + "AssignmentExpression": "AssignmentExpression", + "ArrayExpression": "ArrayExpression", + "BlockStatement": "BlockStatement", + "BinaryExpression": "BinaryExpression", + "BreakStatement": "BreakStatement", + "CallExpression": "CallExpression", + "CatchClause": "CatchClause", + "ConditionalExpression": "ConditionalExpression", + "ContinueStatement": "ContinueStatement", + "DoWhileStatement": "DoWhileStatement", + "DebuggerStatement": "DebuggerStatement", + "EmptyStatement": "EmptyStatement", + "ExpressionStatement": "ExpressionStatement", + "ForStatement": "ForStatement", + "ForInStatement": "ForInStatement", + "FunctionDeclaration": "FunctionDeclaration", + "FunctionExpression": "FunctionExpression", + "Identifier": "Identifier", + "IfStatement": "IfStatement", + "Literal": "Literal", + "LabeledStatement": "LabeledStatement", + "LogicalExpression": "LogicalExpression", + "MemberExpression": "MemberExpression", + "NewExpression": "NewExpression", + "ObjectExpression": "ObjectExpression", + "Program": "Program", + "Property": "Property", + "ReturnStatement": "ReturnStatement", + "SequenceExpression": "SequenceExpression", + "SwitchStatement": "SwitchStatement", + "SwitchCase": "SwitchCase", + "ThisExpression": "ThisExpression", + "ThrowStatement": "ThrowStatement", + "TryStatement": "TryStatement", + "UnaryExpression": "UnaryExpression", + "UpdateExpression": "UpdateExpression", + "VariableDeclaration": "VariableDeclaration", + "VariableDeclarator": "VariableDeclarator", + "WhileStatement": "WhileStatement", + "WithStatement": "WithStatement", +}) +PropertyKind = jsdict({ + "Data": 1, + "Get": 2, + "Set": 4, +}) +Messages = jsdict({ + "UnexpectedToken": + "Unexpected token %0", + "UnexpectedNumber": + "Unexpected number", + "UnexpectedString": + "Unexpected string", + "UnexpectedIdentifier": + "Unexpected identifier", + "UnexpectedReserved": + "Unexpected reserved word", + "UnexpectedEOS": + "Unexpected end of input", + "NewlineAfterThrow": + "Illegal newline after throw", + "InvalidRegExp": + "Invalid regular expression", + "UnterminatedRegExp": + "Invalid regular expression: missing /", + "InvalidLHSInAssignment": + "Invalid left-hand side in assignment", + "InvalidLHSInForIn": + "Invalid left-hand side in for-in", + "MultipleDefaultsInSwitch": + "More than one default clause in switch statement", + "NoCatchOrFinally": + "Missing catch or finally after try", + "UnknownLabel": + "Undefined label '%0'", + "Redeclaration": + "%0 '%1' has already been declared", + "IllegalContinue": + "Illegal continue statement", + "IllegalBreak": + "Illegal break statement", + "IllegalReturn": + "Illegal return statement", + "StrictModeWith": + "Strict mode code may not include a with statement", + "StrictCatchVariable": + "Catch variable may not be eval or arguments in strict mode", + "StrictVarName": + "Variable name may not be eval or arguments in strict mode", + "StrictParamName": + "Parameter name eval or arguments is not allowed in strict mode", + "StrictParamDupe": + "Strict mode function may not have duplicate parameter names", + "StrictFunctionName": + "Function name may not be eval or arguments in strict mode", + "StrictOctalLiteral": + "Octal literals are not allowed in strict mode.", + "StrictDelete": + "Delete of an unqualified identifier in strict mode.", + "StrictDuplicateProperty": + "Duplicate data property in object literal not allowed in strict mode", + "AccessorDataProperty": + "Object literal may not have data and accessor property with the same name", + "AccessorGetSet": + "Object literal may not have multiple get/set accessors with the same name", + "StrictLHSAssignment": + "Assignment to eval or arguments is not allowed in strict mode", + "StrictLHSPostfix": + "Postfix increment/decrement may not have eval or arguments operand in strict mode", + "StrictLHSPrefix": + "Prefix increment/decrement may not have eval or arguments operand in strict mode", + "StrictReservedWord": + "Use of future reserved word in strict mode", +}) +Regex = jsdict({ + "NonAsciiIdentifierStart": + RegExp( + u"[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]" + ), + "NonAsciiIdentifierPart": + RegExp( + u"[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0\u08a2-\u08ac\u08e4-\u08fe\u0900-\u0963\u0966-\u096f\u0971-\u0977\u0979-\u097f\u0981-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17d3\u17d7\u17dc\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191c\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19d9\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1cd0-\u1cd2\u1cd4-\u1cf6\u1d00-\u1de6\u1dfc-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200c\u200d\u203f\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua697\ua69f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua827\ua840-\ua873\ua880-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua900-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a\uaa7b\uaa80-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabea\uabec\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]" + ), +}) + + +def assert__py__(condition=None, message=None): + if not condition: + raise RuntimeError("ASSERT: " + message) + + +def isDecimalDigit(ch=None): + return (ch >= 48) and (ch <= 57) + + +def isHexDigit(ch=None): + return "0123456789abcdefABCDEF".find(ch) >= 0 + + +def isOctalDigit(ch=None): + return "01234567".find(ch) >= 0 + + +def isWhiteSpace(ch=None): + return ( + ((((ch == 32) or (ch == 9)) or (ch == 11)) or + (ch == 12)) or (ch == 160) + ) or ((ch >= 5760) and ( + u"\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\ufeff" + .find(unichr(ch)) > 0)) + + +def isLineTerminator(ch=None): + return (((ch == 10) or (ch == 13)) or (ch == 8232)) or (ch == 8233) + + +def isIdentifierStart(ch=None): + return (((((ch == 36) or (ch == 95)) or ((ch >= 65) and (ch <= 90))) or + ((ch >= 97) and (ch <= 122))) or + (ch == 92)) or ((ch >= 128) + and Regex.NonAsciiIdentifierStart.test(unichr(ch))) + + +def isIdentifierPart(ch=None): + return ((((((ch == 36) or (ch == 95)) or ((ch >= 65) and (ch <= 90))) or + ((ch >= 97) and (ch <= 122))) or ((ch >= 48) and (ch <= 57))) or + (ch == 92)) or ((ch >= 128) + and Regex.NonAsciiIdentifierPart.test(unichr(ch))) + + +def isFutureReservedWord(id=None): + while 1: + if (id == "super") or ((id == "import") or ((id == "extends") or + ((id == "export") or + ((id == "enum") or + (id == "class"))))): + return True + else: + return False + break + + +def isStrictModeReservedWord(id=None): + while 1: + if (id == "let") or ((id == "yield") or + ((id == "static") or + ((id == "public") or + ((id == "protected") or + ((id == "private") or + ((id == "package") or + ((id == "interface") or + (id == "implements")))))))): + return True + else: + return False + break + + +def isRestrictedWord(id=None): + return (id == "eval") or (id == "arguments") + + +def isKeyword(id=None): + if strict and isStrictModeReservedWord(id): + return True + while 1: + if len(id) == 2: + return ((id == "if") or (id == "in")) or (id == "do") + elif len(id) == 3: + return ((((id == "var") or (id == "for")) or (id == "new")) or + (id == "try")) or (id == "let") + elif len(id) == 4: + return (((((id == "this") or (id == "else")) or (id == "case")) or + (id == "void")) or (id == "with")) or (id == "enum") + elif len(id) == 5: + return (((((((id == "while") or (id == "break")) or + (id == "catch")) or (id == "throw")) or + (id == "const")) or (id == "yield")) or + (id == "class")) or (id == "super") + elif len(id) == 6: + return (((((id == "return") or (id == "typeof")) or + (id == "delete")) or (id == "switch")) or + (id == "export")) or (id == "import") + elif len(id) == 7: + return ((id == "default") or + (id == "finally")) or (id == "extends") + elif len(id) == 8: + return ((id == "function") or + (id == "continue")) or (id == "debugger") + elif len(id) == 10: + return id == "instanceof" + else: + return False + break + + +def addComment(type=None, value=None, start=None, end=None, loc=None): + comment = None + assert__py__(('undefined' + if not 'start' in locals() else typeof(start)) == "number", + "Comment must have valid position") + if state.lastCommentStart >= start: + return + state.lastCommentStart = start + comment = jsdict({ + "type": type, + "value": value, + }) + if extra.range: + comment.range = [start, end] + if extra.loc: + comment.loc = loc + extra.comments.append(comment) + + +def skipSingleLineComment(): + global index, lineNumber, lineStart + start = None + loc = None + ch = None + comment = None + start = index - 2 + loc = jsdict({ + "start": + jsdict({ + "line": lineNumber, + "column": (index - lineStart) - 2, + }), + }) + while index < length: + ch = (ord(source[index]) if index < len(source) else None) + index += 1 + index + if isLineTerminator(ch): + if extra.comments: + comment = source[(start + 2):(index - 1)] + loc.end = jsdict({ + "line": lineNumber, + "column": (index - lineStart) - 1, + }) + addComment("Line", comment, start, index - 1, loc) + if (ch == 13) and ( + (ord(source[index]) if index < len(source) else None) == 10): + index += 1 + index + lineNumber += 1 + lineNumber + lineStart = index + return + if extra.comments: + comment = source[(start + 2):index] + loc.end = jsdict({ + "line": lineNumber, + "column": index - lineStart, + }) + addComment("Line", comment, start, index, loc) + + +def skipMultiLineComment(): + global index, lineNumber, lineStart + start = None + loc = None + ch = None + comment = None + if extra.comments: + start = index - 2 + loc = jsdict({ + "start": + jsdict({ + "line": lineNumber, + "column": (index - lineStart) - 2, + }), + }) + while index < length: + ch = (ord(source[index]) if index < len(source) else None) + if isLineTerminator(ch): + if (ch == 13) and ((ord(source[index + 1]) if + (index + 1) < len(source) else None) == 10): + index += 1 + index + lineNumber += 1 + lineNumber + index += 1 + index + lineStart = index + if index >= length: + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + elif ch == 42: + if (ord(source[index + 1]) if + (index + 1) < len(source) else None) == 47: + index += 1 + index + index += 1 + index + if extra.comments: + comment = source[(start + 2):(index - 2)] + loc.end = jsdict({ + "line": lineNumber, + "column": index - lineStart, + }) + addComment("Block", comment, start, index, loc) + return + index += 1 + index + else: + index += 1 + index + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + + +def skipComment(): + global index, lineNumber, lineStart + ch = None + while index < length: + ch = (ord(source[index]) if index < len(source) else None) + if isWhiteSpace(ch): + index += 1 + index + elif isLineTerminator(ch): + index += 1 + index + if (ch == 13) and ( + (ord(source[index]) if index < len(source) else None) == 10): + index += 1 + index + lineNumber += 1 + lineNumber + lineStart = index + elif ch == 47: + ch = (ord(source[index + 1]) if + (index + 1) < len(source) else None) + if ch == 47: + index += 1 + index + index += 1 + index + skipSingleLineComment() + elif ch == 42: + index += 1 + index + index += 1 + index + skipMultiLineComment() + else: + break + else: + break + + +def scanHexEscape(prefix=None): + global len__py__, index + i = None + len__py__ = None + ch = None + code = 0 + len__py__ = (4 if prefix == "u" else 2) + i = 0 + while 1: + if not (i < len__py__): + break + if (index < length) and isHexDigit(source[index]): + index += 1 + ch = source[index - 1] + code = (code * 16) + "0123456789abcdef".find(ch.lower()) + else: + return "" + i += 1 + return unichr(code) + + +def getEscapedIdentifier(): + global index + ch = None + id = None + index += 1 + index += 1 + ch = (ord(source[index - 1]) if index - 1 < len(source) else None) + id = unichr(ch) + if ch == 92: + if (ord(source[index]) if index < len(source) else None) != 117: + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + index += 1 + index + ch = scanHexEscape("u") + if ((not ch) or (ch == "\\")) or (not isIdentifierStart( + (ord(ch[0]) if 0 < len(ch) else None))): + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + id = ch + while index < length: + ch = (ord(source[index]) if index < len(source) else None) + if not isIdentifierPart(ch): + break + index += 1 + index + id += unichr(ch) + if ch == 92: + id = id[0:(0 + (len(id) - 1))] + if (ord(source[index]) if index < len(source) else None) != 117: + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + index += 1 + index + ch = scanHexEscape("u") + if ((not ch) or (ch == "\\")) or (not isIdentifierPart( + (ord(ch[0]) if 0 < len(ch) else None))): + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + id += ch + return id + + +def getIdentifier(): + global index + start = None + ch = None + index += 1 + start = index - 1 + while index < length: + ch = (ord(source[index]) if index < len(source) else None) + if ch == 92: + index = start + return getEscapedIdentifier() + if isIdentifierPart(ch): + index += 1 + index + else: + break + return source[start:index] + + +def scanIdentifier(): + start = None + id = None + type = None + start = index + id = (getEscapedIdentifier() if + (ord(source[index]) if index < len(source) else None) == 92 else + getIdentifier()) + if len(id) == 1: + type = Token.Identifier + elif isKeyword(id): + type = Token.Keyword + elif id == "null": + type = Token.NullLiteral + elif (id == "true") or (id == "false"): + type = Token.BooleanLiteral + else: + type = Token.Identifier + return jsdict({ + "type": type, + "value": id, + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + + +def scanPunctuator(): + global index + start = index + code = (ord(source[index]) if index < len(source) else None) + code2 = None + ch1 = source[index] + ch2 = None + ch3 = None + ch4 = None + while 1: + if (code == 126) or ((code == 63) or ((code == 58) or + ((code == 93) or + ((code == 91) or + ((code == 125) or + ((code == 123) or + ((code == 44) or + ((code == 59) or + ((code == 41) or + ((code == 40) or + (code == 46))))))))))): + index += 1 + index + if extra.tokenize: + if code == 40: + extra.openParenToken = len(extra.tokens) + elif code == 123: + extra.openCurlyToken = len(extra.tokens) + return jsdict({ + "type": Token.Punctuator, + "value": unichr(code), + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + else: + code2 = (ord(source[index + 1]) if + (index + 1) < len(source) else None) + if code2 == 61: + while 1: + if (code == 124) or ((code == 94) or + ((code == 62) or + ((code == 60) or + ((code == 47) or + ((code == 45) or + ((code == 43) or + ((code == 42) or + ((code == 38) or + (code == 37))))))))): + index += 2 + return jsdict({ + "type": Token.Punctuator, + "value": unichr(code) + unichr(code2), + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + elif (code == 61) or (code == 33): + index += 2 + if (ord(source[index]) + if index < len(source) else None) == 61: + index += 1 + index + return jsdict({ + "type": Token.Punctuator, + "value": source[start:index], + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + else: + break + break + break + break + ch2 = source[index + 1] if index + 1 < len(source) else None + ch3 = source[index + 2] if index + 2 < len(source) else None + ch4 = source[index + 3] if index + 3 < len(source) else None + if ((ch1 == ">") and (ch2 == ">")) and (ch3 == ">"): + if ch4 == "=": + index += 4 + return jsdict({ + "type": Token.Punctuator, + "value": ">>>=", + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + if ((ch1 == ">") and (ch2 == ">")) and (ch3 == ">"): + index += 3 + return jsdict({ + "type": Token.Punctuator, + "value": ">>>", + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + if ((ch1 == "<") and (ch2 == "<")) and (ch3 == "="): + index += 3 + return jsdict({ + "type": Token.Punctuator, + "value": "<<=", + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + if ((ch1 == ">") and (ch2 == ">")) and (ch3 == "="): + index += 3 + return jsdict({ + "type": Token.Punctuator, + "value": ">>=", + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + if (ch1 == ch2) and ("+-<>&|".find(ch1) >= 0): + index += 2 + return jsdict({ + "type": Token.Punctuator, + "value": ch1 + ch2, + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + if "<>=!+-*%&|^/".find(ch1) >= 0: + index += 1 + index + return jsdict({ + "type": Token.Punctuator, + "value": ch1, + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + + +def scanHexLiteral(start=None): + global index + number = "" + while index < length: + if not isHexDigit(source[index]): + break + index += 1 + number += source[index - 1] + if len(number) == 0: + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + if isIdentifierStart( + (ord(source[index]) if index < len(source) else None)): + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + return jsdict({ + "type": Token.NumericLiteral, + "value": parseInt("0x" + number, 16), + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + + +def scanOctalLiteral(start=None): + global index + index += 1 + number = "0" + source[index - 1] + while index < length: + if not isOctalDigit(source[index]): + break + index += 1 + number += source[index - 1] + if isIdentifierStart( + (ord(source[index]) + if index < len(source) else None)) or isDecimalDigit( + (ord(source[index]) if index < len(source) else None)): + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + return jsdict({ + "type": Token.NumericLiteral, + "value": parseInt(number, 8), + "octal": True, + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + + +def scanNumericLiteral(): + global index + number = None + start = None + ch = None + ch = source[index] + assert__py__( + isDecimalDigit((ord(ch[0]) if 0 < len(ch) else None)) or (ch == "."), + "Numeric literal must start with a decimal digit or a decimal point") + start = index + number = "" + if ch != ".": + index += 1 + number = source[index - 1] + ch = source[index] if index < len(source) else None + if number == "0": + if (ch == "x") or (ch == "X"): + index += 1 + index + return scanHexLiteral(start) + if isOctalDigit(ch): + return scanOctalLiteral(start) + if ch and isDecimalDigit((ord(ch[0]) if 0 < len(ch) else None)): + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + while isDecimalDigit( + (ord(source[index]) if index < len(source) else None)): + index += 1 + number += source[index - 1] + ch = source[index] if index < len(source) else None + if ch == ".": + index += 1 + number += source[index - 1] + while isDecimalDigit( + (ord(source[index]) if index < len(source) else None)): + index += 1 + number += source[index - 1] + ch = source[index] + if (ch == "e") or (ch == "E"): + index += 1 + number += source[index - 1] + ch = source[index] + if (ch == "+") or (ch == "-"): + index += 1 + number += source[index - 1] + if isDecimalDigit( + (ord(source[index]) if index < len(source) else None)): + while isDecimalDigit( + (ord(source[index]) if index < len(source) else None)): + index += 1 + number += source[index - 1] + else: + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + if isIdentifierStart( + (ord(source[index]) if index < len(source) else None)): + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + return jsdict({ + "type": Token.NumericLiteral, + "value": parseFloat(number), + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + + +def scanStringLiteral(): + global index, lineNumber + str = "" + quote = None + start = None + ch = None + code = None + unescaped = None + restore = None + octal = False + quote = source[index] + assert__py__((quote == "'") or (quote == "\""), + "String literal must starts with a quote") + start = index + index += 1 + index + while index < length: + index += 1 + ch = source[index - 1] + if ch == quote: + quote = "" + break + elif ch == "\\": + index += 1 + ch = source[index - 1] + if (not ch) or (not isLineTerminator( + (ord(ch[0]) if 0 < len(ch) else None))): + while 1: + if ch == "n": + str += u"\x0a" + break + elif ch == "r": + str += u"\x0d" + break + elif ch == "t": + str += u"\x09" + break + elif (ch == "x") or (ch == "u"): + restore = index + unescaped = scanHexEscape(ch) + if unescaped: + str += unescaped + else: + index = restore + str += ch + break + elif ch == "b": + str += u"\x08" + break + elif ch == "f": + str += u"\x0c" + break + elif ch == "v": + str += u"\x0b" + break + else: + if isOctalDigit(ch): + code = "01234567".find(ch) + if code != 0: + octal = True + if (index < length) and isOctalDigit( + source[index]): + octal = True + index += 1 + code = (code * 8) + "01234567".find( + source[index - 1]) + if (("0123".find(ch) >= 0) and + (index < length)) and isOctalDigit( + source[index]): + index += 1 + code = (code * 8) + "01234567".find( + source[index - 1]) + str += unichr(code) + else: + str += ch + break + break + else: + lineNumber += 1 + lineNumber + if (ch == u"\x0d") and (source[index] == u"\x0a"): + index += 1 + index + elif isLineTerminator((ord(ch[0]) if 0 < len(ch) else None)): + break + else: + str += ch + if quote != "": + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + return jsdict({ + "type": Token.StringLiteral, + "value": str, + "octal": octal, + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + + +def scanRegExp(): + global lookahead, index + str = None + ch = None + start = None + pattern = None + flags = None + value = None + classMarker = False + restore = None + terminated = False + lookahead = None + skipComment() + start = index + ch = source[index] + assert__py__(ch == "/", + "Regular expression literal must start with a slash") + index += 1 + str = source[index - 1] + while index < length: + index += 1 + ch = source[index - 1] + str += ch + if classMarker: + if ch == "]": + classMarker = False + else: + if ch == "\\": + index += 1 + ch = source[index - 1] + if isLineTerminator((ord(ch[0]) if 0 < len(ch) else None)): + throwError(jsdict({}), Messages.UnterminatedRegExp) + str += ch + elif ch == "/": + terminated = True + break + elif ch == "[": + classMarker = True + elif isLineTerminator((ord(ch[0]) if 0 < len(ch) else None)): + throwError(jsdict({}), Messages.UnterminatedRegExp) + if not terminated: + throwError(jsdict({}), Messages.UnterminatedRegExp) + pattern = str[1:(1 + (len(str) - 2))] + flags = "" + while index < length: + ch = source[index] + if not isIdentifierPart((ord(ch[0]) if 0 < len(ch) else None)): + break + index += 1 + index + if (ch == "\\") and (index < length): + ch = source[index] + if ch == "u": + index += 1 + index + restore = index + ch = scanHexEscape("u") + if ch: + flags += ch + str += "\\u" + while 1: + if not (restore < index): + break + str += source[restore] + restore += 1 + else: + index = restore + flags += "u" + str += "\\u" + else: + str += "\\" + else: + flags += ch + str += ch + try: + value = RegExp(pattern, flags) + except Exception as e: + throwError(jsdict({}), Messages.InvalidRegExp) + peek() + if extra.tokenize: + return jsdict({ + "type": Token.RegularExpression, + "value": value, + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + return jsdict({ + "literal": str, + "value": value, + "range": [start, index], + }) + + +def isIdentifierName(token=None): + return (((token.type == Token.Identifier) or + (token.type == Token.Keyword)) or + (token.type == Token.BooleanLiteral)) or ( + token.type == Token.NullLiteral) + + +def advanceSlash(): + prevToken = None + checkToken = None + prevToken = extra.tokens[len(extra.tokens) - 1] + if not prevToken: + return scanRegExp() + if prevToken.type == "Punctuator": + if prevToken.value == ")": + checkToken = extra.tokens[extra.openParenToken - 1] + if (checkToken and (checkToken.type == "Keyword")) and ( + (((checkToken.value == "if") or + (checkToken.value == "while")) or + (checkToken.value == "for")) or (checkToken.value == "with")): + return scanRegExp() + return scanPunctuator() + if prevToken.value == "}": + if extra.tokens[extra.openCurlyToken - 3] and ( + extra.tokens[extra.openCurlyToken - 3].type == "Keyword"): + checkToken = extra.tokens[extra.openCurlyToken - 4] + if not checkToken: + return scanPunctuator() + elif extra.tokens[extra.openCurlyToken - 4] and ( + extra.tokens[extra.openCurlyToken - 4].type == "Keyword"): + checkToken = extra.tokens[extra.openCurlyToken - 5] + if not checkToken: + return scanRegExp() + else: + return scanPunctuator() + if FnExprTokens.indexOf(checkToken.value) >= 0: + return scanPunctuator() + return scanRegExp() + return scanRegExp() + if prevToken.type == "Keyword": + return scanRegExp() + return scanPunctuator() + + +def advance(): + ch = None + skipComment() + if index >= length: + return jsdict({ + "type": Token.EOF, + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [index, index], + }) + ch = (ord(source[index]) if index < len(source) else None) + if ((ch == 40) or (ch == 41)) or (ch == 58): + return scanPunctuator() + if (ch == 39) or (ch == 34): + return scanStringLiteral() + if isIdentifierStart(ch): + return scanIdentifier() + if ch == 46: + if isDecimalDigit((ord(source[index + 1]) if + (index + 1) < len(source) else None)): + return scanNumericLiteral() + return scanPunctuator() + if isDecimalDigit(ch): + return scanNumericLiteral() + if extra.tokenize and (ch == 47): + return advanceSlash() + return scanPunctuator() + + +def lex(): + global index, lineNumber, lineStart, lookahead + token = None + token = lookahead + index = token.range[1] + lineNumber = token.lineNumber + lineStart = token.lineStart + lookahead = advance() + index = token.range[1] + lineNumber = token.lineNumber + lineStart = token.lineStart + return token + + +def peek(): + global lookahead, index, lineNumber, lineStart + pos = None + line = None + start = None + pos = index + line = lineNumber + start = lineStart + lookahead = advance() + index = pos + lineNumber = line + lineStart = start + + +SyntaxTreeDelegate = jsdict({ + "name": "SyntaxTree", + "markStart": __temp__0, + "markEnd": __temp__1, + "markEndIf": __temp__2, + "postProcess": __temp__3, + "createArrayExpression": __temp__4, + "createAssignmentExpression": __temp__5, + "createBinaryExpression": __temp__6, + "createBlockStatement": __temp__7, + "createBreakStatement": __temp__8, + "createCallExpression": __temp__9, + "createCatchClause": __temp__10, + "createConditionalExpression": __temp__11, + "createContinueStatement": __temp__12, + "createDebuggerStatement": __temp__13, + "createDoWhileStatement": __temp__14, + "createEmptyStatement": __temp__15, + "createExpressionStatement": __temp__16, + "createForStatement": __temp__17, + "createForInStatement": __temp__18, + "createFunctionDeclaration": __temp__19, + "createFunctionExpression": __temp__20, + "createIdentifier": __temp__21, + "createIfStatement": __temp__22, + "createLabeledStatement": __temp__23, + "createLiteral": __temp__24, + "createMemberExpression": __temp__25, + "createNewExpression": __temp__26, + "createObjectExpression": __temp__27, + "createPostfixExpression": __temp__28, + "createProgram": __temp__29, + "createProperty": __temp__30, + "createReturnStatement": __temp__31, + "createSequenceExpression": __temp__32, + "createSwitchCase": __temp__33, + "createSwitchStatement": __temp__34, + "createThisExpression": __temp__35, + "createThrowStatement": __temp__36, + "createTryStatement": __temp__37, + "createUnaryExpression": __temp__38, + "createVariableDeclaration": __temp__39, + "createVariableDeclarator": __temp__40, + "createWhileStatement": __temp__41, + "createWithStatement": __temp__42, +}) + + +def peekLineTerminator(): + global index, lineNumber, lineStart + pos = None + line = None + start = None + found = None + pos = index + line = lineNumber + start = lineStart + skipComment() + found = lineNumber != line + index = pos + lineNumber = line + lineStart = start + return found + + +def throwError(token=None, messageFormat=None, a=None): + def __temp__43(whole=None, index=None): + assert__py__(index < len(args), "Message reference must be in range") + return args[index] + + error = None + args = Array.prototype.slice.call(arguments, 2) + msg = messageFormat.replace(RegExp(r'%(\d)'), __temp__43) + if ('undefined' if not ('lineNumber' in token) else typeof( + token.lineNumber)) == "number": + error = RuntimeError((("Line " + token.lineNumber) + ": ") + msg) + error.index = token.range[0] + error.lineNumber = token.lineNumber + error.column = (token.range[0] - lineStart) + 1 + else: + error = RuntimeError((("Line " + lineNumber) + ": ") + msg) + error.index = index + error.lineNumber = lineNumber + error.column = (index - lineStart) + 1 + error.description = msg + raise error + + +def throwErrorTolerant(): + try: + throwError.apply(None, arguments) + except Exception as e: + if extra.errors: + extra.errors.append(e) + else: + raise + + +def throwUnexpected(token=None): + if token.type == Token.EOF: + throwError(token, Messages.UnexpectedEOS) + if token.type == Token.NumericLiteral: + throwError(token, Messages.UnexpectedNumber) + if token.type == Token.StringLiteral: + throwError(token, Messages.UnexpectedString) + if token.type == Token.Identifier: + throwError(token, Messages.UnexpectedIdentifier) + if token.type == Token.Keyword: + if isFutureReservedWord(token.value): + throwError(token, Messages.UnexpectedReserved) + elif strict and isStrictModeReservedWord(token.value): + throwErrorTolerant(token, Messages.StrictReservedWord) + return + throwError(token, Messages.UnexpectedToken, token.value) + throwError(token, Messages.UnexpectedToken, token.value) + + +def expect(value=None): + token = lex() + if (token.type != Token.Punctuator) or (token.value != value): + throwUnexpected(token) + + +def expectKeyword(keyword=None): + token = lex() + if (token.type != Token.Keyword) or (token.value != keyword): + throwUnexpected(token) + + +def match(value=None): + return (lookahead.type == Token.Punctuator) and (lookahead.value == value) + + +def matchKeyword(keyword=None): + return (lookahead.type == Token.Keyword) and (lookahead.value == keyword) + + +def matchAssign(): + op = None + if lookahead.type != Token.Punctuator: + return False + op = lookahead.value + return (((((((((((op == "=") or (op == "*=")) or (op == "/=")) or + (op == "%=")) or (op == "+=")) or (op == "-=")) or + (op == "<<=")) or (op == ">>=")) or (op == ">>>=")) or + (op == "&=")) or (op == "^=")) or (op == "|=") + + +def consumeSemicolon(): + line = None + if (ord(source[index]) if index < len(source) else None) == 59: + lex() + return + line = lineNumber + skipComment() + if lineNumber != line: + return + if match(";"): + lex() + return + if (lookahead.type != Token.EOF) and (not match("}")): + throwUnexpected(lookahead) + + +def isLeftHandSide(expr=None): + return (expr.type == Syntax.Identifier) or ( + expr.type == Syntax.MemberExpression) + + +def parseArrayInitialiser(): + elements = [] + expect("[") + while not match("]"): + if match(","): + lex() + elements.append(None) + else: + elements.append(parseAssignmentExpression()) + if not match("]"): + expect(",") + expect("]") + return delegate.createArrayExpression(elements) + + +def parsePropertyFunction(param=None, first=None): + global strict + previousStrict = None + body = None + previousStrict = strict + skipComment() + delegate.markStart() + body = parseFunctionSourceElements() + if (first and strict) and isRestrictedWord(param[0].name): + throwErrorTolerant(first, Messages.StrictParamName) + strict = previousStrict + return delegate.markEnd( + delegate.createFunctionExpression(None, param, [], body)) + + +def parseObjectPropertyKey(): + token = None + skipComment() + delegate.markStart() + token = lex() + if (token.type == Token.StringLiteral) or ( + token.type == Token.NumericLiteral): + if strict and token.octal: + throwErrorTolerant(token, Messages.StrictOctalLiteral) + return delegate.markEnd(delegate.createLiteral(token)) + return delegate.markEnd(delegate.createIdentifier(token.value)) + + +def parseObjectProperty(): + token = None + key = None + id = None + value = None + param = None + token = lookahead + skipComment() + delegate.markStart() + if token.type == Token.Identifier: + id = parseObjectPropertyKey() + if (token.value == "get") and (not match(":")): + key = parseObjectPropertyKey() + expect("(") + expect(")") + value = parsePropertyFunction([]) + return delegate.markEnd(delegate.createProperty("get", key, value)) + if (token.value == "set") and (not match(":")): + key = parseObjectPropertyKey() + expect("(") + token = lookahead + if token.type != Token.Identifier: + expect(")") + throwErrorTolerant(token, Messages.UnexpectedToken, + token.value) + value = parsePropertyFunction([]) + else: + param = [parseVariableIdentifier()] + expect(")") + value = parsePropertyFunction(param, token) + return delegate.markEnd(delegate.createProperty("set", key, value)) + expect(":") + value = parseAssignmentExpression() + return delegate.markEnd(delegate.createProperty("init", id, value)) + if (token.type == Token.EOF) or (token.type == Token.Punctuator): + throwUnexpected(token) + else: + key = parseObjectPropertyKey() + expect(":") + value = parseAssignmentExpression() + return delegate.markEnd(delegate.createProperty("init", key, value)) + + +def parseObjectInitialiser(): + properties = [] + property = None + name = None + key = None + kind = None + map = jsdict({}) + toString = str + expect("{") + while not match("}"): + property = parseObjectProperty() + if property.key.type == Syntax.Identifier: + name = property.key.name + else: + name = toString(property.key.value) + kind = (PropertyKind.Data if property.kind == "init" else ( + PropertyKind.Get if property.kind == "get" else PropertyKind.Set)) + key = "$" + name + if key in map: + if map[key] == PropertyKind.Data: + if strict and (kind == PropertyKind.Data): + throwErrorTolerant( + jsdict({}), Messages.StrictDuplicateProperty) + elif kind != PropertyKind.Data: + throwErrorTolerant( + jsdict({}), Messages.AccessorDataProperty) + else: + if kind == PropertyKind.Data: + throwErrorTolerant( + jsdict({}), Messages.AccessorDataProperty) + elif map[key] & kind: + throwErrorTolerant(jsdict({}), Messages.AccessorGetSet) + map[key] |= kind + else: + map[key] = kind + properties.append(property) + if not match("}"): + expect(",") + expect("}") + return delegate.createObjectExpression(properties) + + +def parseGroupExpression(): + expr = None + expect("(") + expr = parseExpression() + expect(")") + return expr + + +def parsePrimaryExpression(): + type = None + token = None + expr = None + if match("("): + return parseGroupExpression() + type = lookahead.type + delegate.markStart() + if type == Token.Identifier: + expr = delegate.createIdentifier(lex().value) + elif (type == Token.StringLiteral) or (type == Token.NumericLiteral): + if strict and lookahead.octal: + throwErrorTolerant(lookahead, Messages.StrictOctalLiteral) + expr = delegate.createLiteral(lex()) + elif type == Token.Keyword: + if matchKeyword("this"): + lex() + expr = delegate.createThisExpression() + elif matchKeyword("function"): + expr = parseFunctionExpression() + elif type == Token.BooleanLiteral: + token = lex() + token.value = token.value == "true" + expr = delegate.createLiteral(token) + elif type == Token.NullLiteral: + token = lex() + token.value = None + expr = delegate.createLiteral(token) + elif match("["): + expr = parseArrayInitialiser() + elif match("{"): + expr = parseObjectInitialiser() + elif match("/") or match("/="): + expr = delegate.createLiteral(scanRegExp()) + if expr: + return delegate.markEnd(expr) + throwUnexpected(lex()) + + +def parseArguments(): + args = [] + expect("(") + if not match(")"): + while index < length: + args.append(parseAssignmentExpression()) + if match(")"): + break + expect(",") + expect(")") + return args + + +def parseNonComputedProperty(): + token = None + delegate.markStart() + token = lex() + if not isIdentifierName(token): + throwUnexpected(token) + return delegate.markEnd(delegate.createIdentifier(token.value)) + + +def parseNonComputedMember(): + expect(".") + return parseNonComputedProperty() + + +def parseComputedMember(): + expr = None + expect("[") + expr = parseExpression() + expect("]") + return expr + + +def parseNewExpression(): + callee = None + args = None + delegate.markStart() + expectKeyword("new") + callee = parseLeftHandSideExpression() + args = (parseArguments() if match("(") else []) + return delegate.markEnd(delegate.createNewExpression(callee, args)) + + +def parseLeftHandSideExpressionAllowCall(): + marker = None + expr = None + args = None + property = None + marker = createLocationMarker() + expr = (parseNewExpression() + if matchKeyword("new") else parsePrimaryExpression()) + while (match(".") or match("[")) or match("("): + if match("("): + args = parseArguments() + expr = delegate.createCallExpression(expr, args) + elif match("["): + property = parseComputedMember() + expr = delegate.createMemberExpression("[", expr, property) + else: + property = parseNonComputedMember() + expr = delegate.createMemberExpression(".", expr, property) + if marker: + marker.end() + marker.apply(expr) + return expr + + +def parseLeftHandSideExpression(): + marker = None + expr = None + property = None + marker = createLocationMarker() + expr = (parseNewExpression() + if matchKeyword("new") else parsePrimaryExpression()) + while match(".") or match("["): + if match("["): + property = parseComputedMember() + expr = delegate.createMemberExpression("[", expr, property) + else: + property = parseNonComputedMember() + expr = delegate.createMemberExpression(".", expr, property) + if marker: + marker.end() + marker.apply(expr) + return expr + + +def parsePostfixExpression(): + expr = None + token = None + delegate.markStart() + expr = parseLeftHandSideExpressionAllowCall() + if lookahead.type == Token.Punctuator: + if (match("++") or match("--")) and (not peekLineTerminator()): + if (strict and + (expr.type == Syntax.Identifier)) and isRestrictedWord( + expr.name): + throwErrorTolerant(jsdict({}), Messages.StrictLHSPostfix) + if not isLeftHandSide(expr): + throwError(jsdict({}), Messages.InvalidLHSInAssignment) + token = lex() + expr = delegate.createPostfixExpression(token.value, expr) + return delegate.markEndIf(expr) + + +def parseUnaryExpression(): + token = None + expr = None + delegate.markStart() + if (lookahead.type != Token.Punctuator) and (lookahead.type != + Token.Keyword): + expr = parsePostfixExpression() + elif match("++") or match("--"): + token = lex() + expr = parseUnaryExpression() + if (strict and + (expr.type == Syntax.Identifier)) and isRestrictedWord(expr.name): + throwErrorTolerant(jsdict({}), Messages.StrictLHSPrefix) + if not isLeftHandSide(expr): + throwError(jsdict({}), Messages.InvalidLHSInAssignment) + expr = delegate.createUnaryExpression(token.value, expr) + elif ((match("+") or match("-")) or match("~")) or match("!"): + token = lex() + expr = parseUnaryExpression() + expr = delegate.createUnaryExpression(token.value, expr) + elif (matchKeyword("delete") + or matchKeyword("void")) or matchKeyword("typeof"): + token = lex() + expr = parseUnaryExpression() + expr = delegate.createUnaryExpression(token.value, expr) + if (strict and (expr.operator == "delete")) and ( + expr.argument.type == Syntax.Identifier): + throwErrorTolerant(jsdict({}), Messages.StrictDelete) + else: + expr = parsePostfixExpression() + return delegate.markEndIf(expr) + + +def binaryPrecedence(token=None, allowIn=None): + prec = 0 + if (token.type != Token.Punctuator) and (token.type != Token.Keyword): + return 0 + while 1: + if token.value == "||": + prec = 1 + break + elif token.value == "&&": + prec = 2 + break + elif token.value == "|": + prec = 3 + break + elif token.value == "^": + prec = 4 + break + elif token.value == "&": + prec = 5 + break + elif (token.value == "!==") or ((token.value == "===") or + ((token.value == "!=") or + (token.value == "=="))): + prec = 6 + break + elif (token.value == "instanceof") or ((token.value == ">=") or + ((token.value == "<=") or + ((token.value == ">") or + (token.value == "<")))): + prec = 7 + break + elif token.value == "in": + prec = (7 if allowIn else 0) + break + elif (token.value == ">>>") or ((token.value == ">>") or + (token.value == "<<")): + prec = 8 + break + elif (token.value == "-") or (token.value == "+"): + prec = 9 + break + elif (token.value == "%") or ((token.value == "/") or + (token.value == "*")): + prec = 11 + break + else: + break + break + return prec + + +def parseBinaryExpression(): + marker = None + markers = None + expr = None + token = None + prec = None + previousAllowIn = None + stack = None + right = None + operator = None + left = None + i = None + previousAllowIn = state.allowIn + state.allowIn = True + marker = createLocationMarker() + left = parseUnaryExpression() + token = lookahead + prec = binaryPrecedence(token, previousAllowIn) + if prec == 0: + return left + token.prec = prec + lex() + markers = [marker, createLocationMarker()] + right = parseUnaryExpression() + stack = [left, token, right] + prec = binaryPrecedence(lookahead, previousAllowIn) + while prec > 0: + while (len(stack) > 2) and (prec <= stack[len(stack) - 2].prec): + right = stack.pop() + operator = stack.pop().value + left = stack.pop() + expr = delegate.createBinaryExpression(operator, left, right) + markers.pop() + marker = markers.pop() + if marker: + marker.end() + marker.apply(expr) + stack.append(expr) + markers.append(marker) + token = lex() + token.prec = prec + stack.append(token) + markers.append(createLocationMarker()) + expr = parseUnaryExpression() + stack.append(expr) + prec = binaryPrecedence(lookahead, previousAllowIn) + state.allowIn = previousAllowIn + i = len(stack) - 1 + expr = stack[i] + markers.pop() + while i > 1: + expr = delegate.createBinaryExpression(stack[i - 1].value, + stack[i - 2], expr) + i -= 2 + marker = markers.pop() + if marker: + marker.end() + marker.apply(expr) + return expr + + +def parseConditionalExpression(): + expr = None + previousAllowIn = None + consequent = None + alternate = None + delegate.markStart() + expr = parseBinaryExpression() + if match("?"): + lex() + previousAllowIn = state.allowIn + state.allowIn = True + consequent = parseAssignmentExpression() + state.allowIn = previousAllowIn + expect(":") + alternate = parseAssignmentExpression() + expr = delegate.markEnd( + delegate.createConditionalExpression(expr, consequent, alternate)) + else: + delegate.markEnd(jsdict({})) + return expr + + +def parseAssignmentExpression(): + token = None + left = None + right = None + node = None + token = lookahead + delegate.markStart() + left = parseConditionalExpression() + node = left + if matchAssign(): + if not isLeftHandSide(left): + throwError(jsdict({}), Messages.InvalidLHSInAssignment) + if (strict and + (left.type == Syntax.Identifier)) and isRestrictedWord(left.name): + throwErrorTolerant(token, Messages.StrictLHSAssignment) + token = lex() + right = parseAssignmentExpression() + node = delegate.createAssignmentExpression(token.value, left, right) + return delegate.markEndIf(node) + + +def parseExpression(): + expr = None + delegate.markStart() + expr = parseAssignmentExpression() + if match(","): + expr = delegate.createSequenceExpression([expr]) + while index < length: + if not match(","): + break + lex() + expr.expressions.append(parseAssignmentExpression()) + return delegate.markEndIf(expr) + + +def parseStatementList(): + list__py__ = [] + statement = None + while index < length: + if match("}"): + break + statement = parseSourceElement() + if ('undefined' if not 'statement' in locals() else + typeof(statement)) == "undefined": + break + list__py__.append(statement) + return list__py__ + + +def parseBlock(): + block = None + skipComment() + delegate.markStart() + expect("{") + block = parseStatementList() + expect("}") + return delegate.markEnd(delegate.createBlockStatement(block)) + + +def parseVariableIdentifier(): + token = None + skipComment() + delegate.markStart() + token = lex() + if token.type != Token.Identifier: + throwUnexpected(token) + return delegate.markEnd(delegate.createIdentifier(token.value)) + + +def parseVariableDeclaration(kind=None): + init = None + id = None + skipComment() + delegate.markStart() + id = parseVariableIdentifier() + if strict and isRestrictedWord(id.name): + throwErrorTolerant(jsdict({}), Messages.StrictVarName) + if kind == "const": + expect("=") + init = parseAssignmentExpression() + elif match("="): + lex() + init = parseAssignmentExpression() + return delegate.markEnd(delegate.createVariableDeclarator(id, init)) + + +def parseVariableDeclarationList(kind=None): + list__py__ = [] + while 1: + list__py__.append(parseVariableDeclaration(kind)) + if not match(","): + break + lex() + if not (index < length): + break + return list__py__ + + +def parseVariableStatement(): + declarations = None + expectKeyword("var") + declarations = parseVariableDeclarationList() + consumeSemicolon() + return delegate.createVariableDeclaration(declarations, "var") + + +def parseConstLetDeclaration(kind=None): + declarations = None + skipComment() + delegate.markStart() + expectKeyword(kind) + declarations = parseVariableDeclarationList(kind) + consumeSemicolon() + return delegate.markEnd( + delegate.createVariableDeclaration(declarations, kind)) + + +def parseEmptyStatement(): + expect(";") + return delegate.createEmptyStatement() + + +def parseExpressionStatement(): + expr = parseExpression() + consumeSemicolon() + return delegate.createExpressionStatement(expr) + + +def parseIfStatement(): + test = None + consequent = None + alternate = None + expectKeyword("if") + expect("(") + test = parseExpression() + expect(")") + consequent = parseStatement() + if matchKeyword("else"): + lex() + alternate = parseStatement() + else: + alternate = None + return delegate.createIfStatement(test, consequent, alternate) + + +def parseDoWhileStatement(): + body = None + test = None + oldInIteration = None + expectKeyword("do") + oldInIteration = state.inIteration + state.inIteration = True + body = parseStatement() + state.inIteration = oldInIteration + expectKeyword("while") + expect("(") + test = parseExpression() + expect(")") + if match(";"): + lex() + return delegate.createDoWhileStatement(body, test) + + +def parseWhileStatement(): + test = None + body = None + oldInIteration = None + expectKeyword("while") + expect("(") + test = parseExpression() + expect(")") + oldInIteration = state.inIteration + state.inIteration = True + body = parseStatement() + state.inIteration = oldInIteration + return delegate.createWhileStatement(test, body) + + +def parseForVariableDeclaration(): + token = None + declarations = None + delegate.markStart() + token = lex() + declarations = parseVariableDeclarationList() + return delegate.markEnd( + delegate.createVariableDeclaration(declarations, token.value)) + + +def parseForStatement(): + init = None + test = None + update = None + left = None + right = None + body = None + oldInIteration = None + update = None + test = update + init = test + expectKeyword("for") + expect("(") + if match(";"): + lex() + else: + if matchKeyword("var") or matchKeyword("let"): + state.allowIn = False + init = parseForVariableDeclaration() + state.allowIn = True + if (len(init.declarations) == 1) and matchKeyword("in"): + lex() + left = init + right = parseExpression() + init = None + else: + state.allowIn = False + init = parseExpression() + state.allowIn = True + if matchKeyword("in"): + if not isLeftHandSide(init): + throwError(jsdict({}), Messages.InvalidLHSInForIn) + lex() + left = init + right = parseExpression() + init = None + if ('undefined' + if not 'left' in locals() else typeof(left)) == "undefined": + expect(";") + if ('undefined' + if not 'left' in locals() else typeof(left)) == "undefined": + if not match(";"): + test = parseExpression() + expect(";") + if not match(")"): + update = parseExpression() + expect(")") + oldInIteration = state.inIteration + state.inIteration = True + body = parseStatement() + state.inIteration = oldInIteration + return (delegate.createForStatement(init, test, update, body) if ( + 'undefined' if not 'left' in locals() else typeof(left)) == "undefined" + else delegate.createForInStatement(left, right, body)) + + +def parseContinueStatement(): + label = None + key = None + expectKeyword("continue") + if (ord(source[index]) if index < len(source) else None) == 59: + lex() + if not state.inIteration: + throwError(jsdict({}), Messages.IllegalContinue) + return delegate.createContinueStatement(None) + if peekLineTerminator(): + if not state.inIteration: + throwError(jsdict({}), Messages.IllegalContinue) + return delegate.createContinueStatement(None) + if lookahead.type == Token.Identifier: + label = parseVariableIdentifier() + key = "$" + label.name + if not (key in state.labelSet): + throwError(jsdict({}), Messages.UnknownLabel, label.name) + consumeSemicolon() + if (label == None) and (not state.inIteration): + throwError(jsdict({}), Messages.IllegalContinue) + return delegate.createContinueStatement(label) + + +def parseBreakStatement(): + label = None + key = None + expectKeyword("break") + if (ord(source[index]) if index < len(source) else None) == 59: + lex() + if not (state.inIteration or state.inSwitch): + throwError(jsdict({}), Messages.IllegalBreak) + return delegate.createBreakStatement(None) + if peekLineTerminator(): + if not (state.inIteration or state.inSwitch): + throwError(jsdict({}), Messages.IllegalBreak) + return delegate.createBreakStatement(None) + if lookahead.type == Token.Identifier: + label = parseVariableIdentifier() + key = "$" + label.name + if not (key in state.labelSet): + throwError(jsdict({}), Messages.UnknownLabel, label.name) + consumeSemicolon() + if (label == None) and (not (state.inIteration or state.inSwitch)): + throwError(jsdict({}), Messages.IllegalBreak) + return delegate.createBreakStatement(label) + + +def parseReturnStatement(): + argument = None + expectKeyword("return") + if not state.inFunctionBody: + throwErrorTolerant(jsdict({}), Messages.IllegalReturn) + if (ord(source[index]) if index < len(source) else None) == 32: + if isIdentifierStart((ord(source[index + 1]) if + (index + 1) < len(source) else None)): + argument = parseExpression() + consumeSemicolon() + return delegate.createReturnStatement(argument) + if peekLineTerminator(): + return delegate.createReturnStatement(None) + if not match(";"): + if (not match("}")) and (lookahead.type != Token.EOF): + argument = parseExpression() + consumeSemicolon() + return delegate.createReturnStatement(argument) + + +def parseWithStatement(): + object = None + body = None + if strict: + throwErrorTolerant(jsdict({}), Messages.StrictModeWith) + expectKeyword("with") + expect("(") + object = parseExpression() + expect(")") + body = parseStatement() + return delegate.createWithStatement(object, body) + + +def parseSwitchCase(): + test = None + consequent = [] + statement = None + skipComment() + delegate.markStart() + if matchKeyword("default"): + lex() + test = None + else: + expectKeyword("case") + test = parseExpression() + expect(":") + while index < length: + if (match("}") or matchKeyword("default")) or matchKeyword("case"): + break + statement = parseStatement() + consequent.append(statement) + return delegate.markEnd(delegate.createSwitchCase(test, consequent)) + + +def parseSwitchStatement(): + discriminant = None + cases = None + clause = None + oldInSwitch = None + defaultFound = None + expectKeyword("switch") + expect("(") + discriminant = parseExpression() + expect(")") + expect("{") + if match("}"): + lex() + return delegate.createSwitchStatement(discriminant) + cases = [] + oldInSwitch = state.inSwitch + state.inSwitch = True + defaultFound = False + while index < length: + if match("}"): + break + clause = parseSwitchCase() + if clause.test == None: + if defaultFound: + throwError(jsdict({}), Messages.MultipleDefaultsInSwitch) + defaultFound = True + cases.append(clause) + state.inSwitch = oldInSwitch + expect("}") + return delegate.createSwitchStatement(discriminant, cases) + + +def parseThrowStatement(): + argument = None + expectKeyword("throw") + if peekLineTerminator(): + throwError(jsdict({}), Messages.NewlineAfterThrow) + argument = parseExpression() + consumeSemicolon() + return delegate.createThrowStatement(argument) + + +def parseCatchClause(): + param = None + body = None + skipComment() + delegate.markStart() + expectKeyword("catch") + expect("(") + if match(")"): + throwUnexpected(lookahead) + param = parseVariableIdentifier() + if strict and isRestrictedWord(param.name): + throwErrorTolerant(jsdict({}), Messages.StrictCatchVariable) + expect(")") + body = parseBlock() + return delegate.markEnd(delegate.createCatchClause(param, body)) + + +def parseTryStatement(): + block = None + handlers = [] + finalizer = None + expectKeyword("try") + block = parseBlock() + if matchKeyword("catch"): + handlers.append(parseCatchClause()) + if matchKeyword("finally"): + lex() + finalizer = parseBlock() + if (len(handlers) == 0) and (not finalizer): + throwError(jsdict({}), Messages.NoCatchOrFinally) + return delegate.createTryStatement(block, [], handlers, finalizer) + + +def parseDebuggerStatement(): + expectKeyword("debugger") + consumeSemicolon() + return delegate.createDebuggerStatement() + + +def parseStatement(): + type = lookahead.type + expr = None + labeledBody = None + key = None + if type == Token.EOF: + throwUnexpected(lookahead) + skipComment() + delegate.markStart() + if type == Token.Punctuator: + while 1: + if lookahead.value == ";": + return delegate.markEnd(parseEmptyStatement()) + elif lookahead.value == "{": + return delegate.markEnd(parseBlock()) + elif lookahead.value == "(": + return delegate.markEnd(parseExpressionStatement()) + else: + break + break + if type == Token.Keyword: + while 1: + if lookahead.value == "break": + return delegate.markEnd(parseBreakStatement()) + elif lookahead.value == "continue": + return delegate.markEnd(parseContinueStatement()) + elif lookahead.value == "debugger": + return delegate.markEnd(parseDebuggerStatement()) + elif lookahead.value == "do": + return delegate.markEnd(parseDoWhileStatement()) + elif lookahead.value == "for": + return delegate.markEnd(parseForStatement()) + elif lookahead.value == "function": + return delegate.markEnd(parseFunctionDeclaration()) + elif lookahead.value == "if": + return delegate.markEnd(parseIfStatement()) + elif lookahead.value == "return": + return delegate.markEnd(parseReturnStatement()) + elif lookahead.value == "switch": + return delegate.markEnd(parseSwitchStatement()) + elif lookahead.value == "throw": + return delegate.markEnd(parseThrowStatement()) + elif lookahead.value == "try": + return delegate.markEnd(parseTryStatement()) + elif lookahead.value == "var": + return delegate.markEnd(parseVariableStatement()) + elif lookahead.value == "while": + return delegate.markEnd(parseWhileStatement()) + elif lookahead.value == "with": + return delegate.markEnd(parseWithStatement()) + else: + break + break + expr = parseExpression() + if (expr.type == Syntax.Identifier) and match(":"): + lex() + key = "$" + expr.name + if key in state.labelSet: + throwError(jsdict({}), Messages.Redeclaration, "Label", expr.name) + state.labelSet[key] = True + labeledBody = parseStatement() + del state.labelSet[key] + return delegate.markEnd( + delegate.createLabeledStatement(expr, labeledBody)) + consumeSemicolon() + return delegate.markEnd(delegate.createExpressionStatement(expr)) + + +def parseFunctionSourceElements(): + global strict + sourceElement = None + sourceElements = [] + token = None + directive = None + firstRestricted = None + oldLabelSet = None + oldInIteration = None + oldInSwitch = None + oldInFunctionBody = None + skipComment() + delegate.markStart() + expect("{") + while index < length: + if lookahead.type != Token.StringLiteral: + break + token = lookahead + sourceElement = parseSourceElement() + sourceElements.append(sourceElement) + if sourceElement.expression.type != Syntax.Literal: + break + directive = source[(token.range[0] + 1):(token.range[1] - 1)] + if directive == "use strict": + strict = True + if firstRestricted: + throwErrorTolerant(firstRestricted, + Messages.StrictOctalLiteral) + else: + if (not firstRestricted) and token.octal: + firstRestricted = token + oldLabelSet = state.labelSet + oldInIteration = state.inIteration + oldInSwitch = state.inSwitch + oldInFunctionBody = state.inFunctionBody + state.labelSet = jsdict({}) + state.inIteration = False + state.inSwitch = False + state.inFunctionBody = True + while index < length: + if match("}"): + break + sourceElement = parseSourceElement() + if ('undefined' if not 'sourceElement' in locals() else + typeof(sourceElement)) == "undefined": + break + sourceElements.append(sourceElement) + expect("}") + state.labelSet = oldLabelSet + state.inIteration = oldInIteration + state.inSwitch = oldInSwitch + state.inFunctionBody = oldInFunctionBody + return delegate.markEnd(delegate.createBlockStatement(sourceElements)) + + +def parseParams(firstRestricted=None): + param = None + params = [] + token = None + stricted = None + paramSet = None + key = None + message = None + expect("(") + if not match(")"): + paramSet = jsdict({}) + while index < length: + token = lookahead + param = parseVariableIdentifier() + key = "$" + token.value + if strict: + if isRestrictedWord(token.value): + stricted = token + message = Messages.StrictParamName + if key in paramSet: + stricted = token + message = Messages.StrictParamDupe + elif not firstRestricted: + if isRestrictedWord(token.value): + firstRestricted = token + message = Messages.StrictParamName + elif isStrictModeReservedWord(token.value): + firstRestricted = token + message = Messages.StrictReservedWord + elif key in paramSet: + firstRestricted = token + message = Messages.StrictParamDupe + params.append(param) + paramSet[key] = True + if match(")"): + break + expect(",") + expect(")") + return jsdict({ + "params": params, + "stricted": stricted, + "firstRestricted": firstRestricted, + "message": message, + }) + + +def parseFunctionDeclaration(): + global strict + id = None + params = [] + body = None + token = None + stricted = None + tmp = None + firstRestricted = None + message = None + previousStrict = None + skipComment() + delegate.markStart() + expectKeyword("function") + token = lookahead + id = parseVariableIdentifier() + if strict: + if isRestrictedWord(token.value): + throwErrorTolerant(token, Messages.StrictFunctionName) + else: + if isRestrictedWord(token.value): + firstRestricted = token + message = Messages.StrictFunctionName + elif isStrictModeReservedWord(token.value): + firstRestricted = token + message = Messages.StrictReservedWord + tmp = parseParams(firstRestricted) + params = tmp.params + stricted = tmp.stricted + firstRestricted = tmp.firstRestricted + if tmp.message: + message = tmp.message + previousStrict = strict + body = parseFunctionSourceElements() + if strict and firstRestricted: + throwError(firstRestricted, message) + if strict and stricted: + throwErrorTolerant(stricted, message) + strict = previousStrict + return delegate.markEnd( + delegate.createFunctionDeclaration(id, params, [], body)) + + +def parseFunctionExpression(): + global strict + token = None + id = None + stricted = None + firstRestricted = None + message = None + tmp = None + params = [] + body = None + previousStrict = None + delegate.markStart() + expectKeyword("function") + if not match("("): + token = lookahead + id = parseVariableIdentifier() + if strict: + if isRestrictedWord(token.value): + throwErrorTolerant(token, Messages.StrictFunctionName) + else: + if isRestrictedWord(token.value): + firstRestricted = token + message = Messages.StrictFunctionName + elif isStrictModeReservedWord(token.value): + firstRestricted = token + message = Messages.StrictReservedWord + tmp = parseParams(firstRestricted) + params = tmp.params + stricted = tmp.stricted + firstRestricted = tmp.firstRestricted + if tmp.message: + message = tmp.message + previousStrict = strict + body = parseFunctionSourceElements() + if strict and firstRestricted: + throwError(firstRestricted, message) + if strict and stricted: + throwErrorTolerant(stricted, message) + strict = previousStrict + return delegate.markEnd( + delegate.createFunctionExpression(id, params, [], body)) + + +def parseSourceElement(): + if lookahead.type == Token.Keyword: + while 1: + if (lookahead.value == "let") or (lookahead.value == "const"): + return parseConstLetDeclaration(lookahead.value) + elif lookahead.value == "function": + return parseFunctionDeclaration() + else: + return parseStatement() + break + if lookahead.type != Token.EOF: + return parseStatement() + + +def parseSourceElements(): + global strict + sourceElement = None + sourceElements = [] + token = None + directive = None + firstRestricted = None + while index < length: + token = lookahead + if token.type != Token.StringLiteral: + break + sourceElement = parseSourceElement() + sourceElements.append(sourceElement) + if sourceElement.expression.type != Syntax.Literal: + break + directive = source[(token.range[0] + 1):(token.range[1] - 1)] + if directive == "use strict": + strict = True + if firstRestricted: + throwErrorTolerant(firstRestricted, + Messages.StrictOctalLiteral) + else: + if (not firstRestricted) and token.octal: + firstRestricted = token + while index < length: + sourceElement = parseSourceElement() + if ('undefined' if not 'sourceElement' in locals() else + typeof(sourceElement)) == "undefined": + break + sourceElements.append(sourceElement) + return sourceElements + + +def parseProgram(): + global strict + body = None + skipComment() + delegate.markStart() + strict = False + peek() + body = parseSourceElements() + return delegate.markEnd(delegate.createProgram(body)) + + +def collectToken(): + start = None + loc = None + token = None + range = None + value = None + skipComment() + start = index + loc = jsdict({ + "start": + jsdict({ + "line": lineNumber, + "column": index - lineStart, + }), + }) + token = extra.advance() + loc.end = jsdict({ + "line": lineNumber, + "column": index - lineStart, + }) + if token.type != Token.EOF: + range = [token.range[0], token.range[1]] + value = source[token.range[0]:token.range[1]] + extra.tokens.append( + jsdict({ + "type": TokenName[token.type], + "value": value, + "range": range, + "loc": loc, + })) + return token + + +def collectRegex(): + pos = None + loc = None + regex = None + token = None + skipComment() + pos = index + loc = jsdict({ + "start": + jsdict({ + "line": lineNumber, + "column": index - lineStart, + }), + }) + regex = extra.scanRegExp() + loc.end = jsdict({ + "line": lineNumber, + "column": index - lineStart, + }) + if not extra.tokenize: + if len(extra.tokens) > 0: + token = extra.tokens[len(extra.tokens) - 1] + if (token.range[0] == pos) and (token.type == "Punctuator"): + if (token.value == "/") or (token.value == "/="): + extra.tokens.pop() + extra.tokens.append( + jsdict({ + "type": "RegularExpression", + "value": regex.literal, + "range": [pos, index], + "loc": loc, + })) + return regex + + +def filterTokenLocation(): + i = None + entry = None + token = None + tokens = [] + i = 0 + while 1: + if not (i < len(extra.tokens)): + break + entry = extra.tokens[i] + token = jsdict({ + "type": entry.type, + "value": entry.value, + }) + if extra.range: + token.range = entry.range + if extra.loc: + token.loc = entry.loc + tokens.append(token) + i += 1 + extra.tokens = tokens + + +class LocationMarker(object): + def __init__(self=None): + self.marker = [index, lineNumber, index - lineStart, 0, 0, 0] + + def end(self=None): + self.marker[3] = index + self.marker[4] = lineNumber + self.marker[5] = index - lineStart + + def apply(self=None, node=None): + if extra.range: + node.range = [self.marker[0], self.marker[3]] + if extra.loc: + node.loc = jsdict({ + "start": + jsdict({ + "line": self.marker[1], + "column": self.marker[2], + }), + "end": + jsdict({ + "line": self.marker[4], + "column": self.marker[5], + }), + }) + node = delegate.postProcess(node) + + +def createLocationMarker(): + if (not extra.loc) and (not extra.range): + return None + skipComment() + return LocationMarker() + + +def patch(): + global advance, scanRegExp + if ('undefined' if not ('tokens' in extra) else typeof( + extra.tokens)) != "undefined": + extra.advance = advance + extra.scanRegExp = scanRegExp + advance = collectToken + scanRegExp = collectRegex + + +def unpatch(): + global advance, scanRegExp + if ('undefined' if not ('scanRegExp' in extra) else typeof( + extra.scanRegExp)) == "function": + advance = extra.advance + scanRegExp = extra.scanRegExp + + +def tokenize(code, **options): + global delegate, source, index, lineNumber, lineStart, length, lookahead, state, extra + options = jsdict(options) + toString = None + token = None + tokens = None + toString = str + if (('undefined' if not 'code' in locals() else typeof(code)) != + "string") and (not isinstance(code, str)): + code = toString(code) + delegate = SyntaxTreeDelegate + source = code + index = 0 + lineNumber = (1 if len(source) > 0 else 0) + lineStart = 0 + length = len(source) + lookahead = None + state = jsdict({ + "allowIn": True, + "labelSet": jsdict({}), + "inFunctionBody": False, + "inIteration": False, + "inSwitch": False, + "lastCommentStart": -1, + }) + extra = jsdict({}) + options = options or jsdict({}) + options.tokens = True + extra.tokens = [] + extra.tokenize = True + extra.openParenToken = -1 + extra.openCurlyToken = -1 + extra.range = (('undefined' if not ('range' in options) else typeof( + options.range)) == "boolean") and options.range + extra.loc = (('undefined' if not ('loc' in options) else typeof( + options.loc)) == "boolean") and options.loc + if (('undefined' if not ('comment' in options) else typeof( + options.comment)) == "boolean") and options.comment: + extra.comments = [] + if (('undefined' if not ('tolerant' in options) else typeof( + options.tolerant)) == "boolean") and options.tolerant: + extra.errors = [] + if length > 0: + if (typeof(source[0])) == "undefined": + if isinstance(code, str): + source = code.valueOf() + patch() + try: + peek() + if lookahead.type == Token.EOF: + return extra.tokens + token = lex() + while lookahead.type != Token.EOF: + try: + token = lex() + except Exception as lexError: + token = lookahead + if extra.errors: + extra.errors.append(lexError) + break + else: + raise + filterTokenLocation() + tokens = extra.tokens + if ('undefined' if not ('comments' in extra) else typeof( + extra.comments)) != "undefined": + tokens.comments = extra.comments + if ('undefined' if not ('errors' in extra) else typeof( + extra.errors)) != "undefined": + tokens.errors = extra.errors + except Exception as e: + raise + finally: + unpatch() + extra = jsdict({}) + return tokens + + +def parse(code, **options): + global delegate, source, index, lineNumber, lineStart, length, lookahead, state, extra + options = jsdict(options) + program = None + toString = None + toString = str + if (('undefined' if not 'code' in locals() else typeof(code)) != + "string") and (not isinstance(code, str)): + code = toString(code) + delegate = SyntaxTreeDelegate + source = code + index = 0 + lineNumber = (1 if len(source) > 0 else 0) + lineStart = 0 + length = len(source) + lookahead = None + state = jsdict({ + "allowIn": True, + "labelSet": jsdict({}), + "inFunctionBody": False, + "inIteration": False, + "inSwitch": False, + "lastCommentStart": -1, + "markerStack": [], + }) + extra = jsdict({}) + if ('undefined' + if not 'options' in locals() else typeof(options)) != "undefined": + extra.range = (('undefined' if not ('range' in options) else typeof( + options.range)) == "boolean") and options.range + extra.loc = (('undefined' if not ('loc' in options) else typeof( + options.loc)) == "boolean") and options.loc + if (extra.loc and + (options.source != None)) and (options.source != undefined): + extra.source = toString(options.source) + if (('undefined' if not ('tokens' in options) else typeof( + options.tokens)) == "boolean") and options.tokens: + extra.tokens = [] + if (('undefined' if not ('comment' in options) else typeof( + options.comment)) == "boolean") and options.comment: + extra.comments = [] + if (('undefined' if not ('tolerant' in options) else typeof( + options.tolerant)) == "boolean") and options.tolerant: + extra.errors = [] + if length > 0: + if (typeof(source[0])) == "undefined": + if isinstance(code, str): + source = code.valueOf() + patch() + try: + program = parseProgram() + if ('undefined' if not ('comments' in extra) else typeof( + extra.comments)) != "undefined": + program.comments = extra.comments + if ('undefined' if not ('tokens' in extra) else typeof( + extra.tokens)) != "undefined": + filterTokenLocation() + program.tokens = extra.tokens + if ('undefined' if not ('errors' in extra) else typeof( + extra.errors)) != "undefined": + program.errors = extra.errors + except Exception as e: + raise + finally: + unpatch() + extra = jsdict({}) + return program + + +parse('var = 490 \n a=4;') diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/objects.py b/Contents/Libraries/Shared/js2py/legecy_translators/objects.py new file mode 100644 index 000000000..2abda3e8b --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/objects.py @@ -0,0 +1,300 @@ +""" This module removes all objects/arrays from JS source code and replace them with LVALS. +Also it has s function translating removed object/array to python code. +Use this module just after removing constants. Later move on to removing functions""" +OBJECT_LVAL = 'PyJsLvalObject%d_' +ARRAY_LVAL = 'PyJsLvalArray%d_' +from utils import * +from jsparser import * +from nodevisitor import exp_translator +import functions +from flow import KEYWORD_METHODS + + +def FUNC_TRANSLATOR(*a): # stupid import system in python + raise RuntimeError('Remember to set func translator. Thank you.') + + +def set_func_translator(ftrans): + # stupid stupid Python or Peter + global FUNC_TRANSLATOR + FUNC_TRANSLATOR = ftrans + + +def is_empty_object(n, last): + """n may be the inside of block or object""" + if n.strip(): + return False + # seems to be but can be empty code + last = last.strip() + markers = { + ')', + ';', + } + if not last or last[-1] in markers: + return False + return True + + +# todo refine this function +def is_object(n, last): + """n may be the inside of block or object. + last is the code before object""" + if is_empty_object(n, last): + return True + if not n.strip(): + return False + #Object contains lines of code so it cant be an object + if len(argsplit(n, ';')) > 1: + return False + cands = argsplit(n, ',') + if not cands[-1].strip(): + return True # {xxxx,} empty after last , it must be an object + for cand in cands: + cand = cand.strip() + # separate each candidate element at : in dict and check whether they are correct... + kv = argsplit(cand, ':') + if len( + kv + ) > 2: # set the len of kv to 2 because of this stupid : expression + kv = kv[0], ':'.join(kv[1:]) + + if len(kv) == 2: + # key value pair, check whether not label or ?: + k, v = kv + if not is_lval(k.strip()): + return False + v = v.strip() + if v.startswith('function'): + continue + #will fail on label... {xxx: while {}} + if v[0] == '{': # value cant be a code block + return False + for e in KEYWORD_METHODS: + # if v starts with any statement then return false + if v.startswith(e) and len(e) < len(v) and v[len( + e)] not in IDENTIFIER_PART: + return False + elif not (cand.startswith('set ') or cand.startswith('get ')): + return False + return True + + +def is_array(last): + #it can be prop getter + last = last.strip() + if any( + endswith_keyword(last, e) for e in + {'return', 'new', 'void', 'throw', 'typeof', 'in', 'instanceof'}): + return True + markers = {')', ']'} + return not last or not (last[-1] in markers or last[-1] in IDENTIFIER_PART) + + +def remove_objects(code, count=1): + """ This function replaces objects with OBJECTS_LVALS, returns new code, replacement dict and count. + count arg is the number that should be added to the LVAL of the first replaced object + """ + replacements = {} #replacement dict + br = bracket_split(code, ['{}', '[]']) + res = '' + last = '' + for e in br: + #test whether e is an object + if e[0] == '{': + n, temp_rep, cand_count = remove_objects(e[1:-1], count) + # if e was not an object then n should not contain any : + if is_object(n, last): + #e was an object + res += ' ' + OBJECT_LVAL % count + replacements[OBJECT_LVAL % count] = e + count += 1 + else: + # e was just a code block but could contain objects inside + res += '{%s}' % n + count = cand_count + replacements.update(temp_rep) + elif e[0] == '[': + if is_array(last): + res += e # will be translated later + else: # prop get + n, rep, count = remove_objects(e[1:-1], count) + res += '[%s]' % n + replacements.update(rep) + else: # e does not contain any objects + res += e + last = e #needed to test for this stipid empty object + return res, replacements, count + + +def remove_arrays(code, count=1): + """removes arrays and replaces them with ARRAY_LVALS + returns new code and replacement dict + *NOTE* has to be called AFTER remove objects""" + res = '' + last = '' + replacements = {} + for e in bracket_split(code, ['[]']): + if e[0] == '[': + if is_array(last): + name = ARRAY_LVAL % count + res += ' ' + name + replacements[name] = e + count += 1 + else: # pseudo array. But pseudo array can contain true array. for example a[['d'][3]] has 2 pseudo and 1 true array + cand, new_replacements, count = remove_arrays(e[1:-1], count) + res += '[%s]' % cand + replacements.update(new_replacements) + else: + res += e + last = e + return res, replacements, count + + +def translate_object(obj, lval, obj_count=1, arr_count=1): + obj = obj[1:-1] # remove {} from both ends + obj, obj_rep, obj_count = remove_objects(obj, obj_count) + obj, arr_rep, arr_count = remove_arrays(obj, arr_count) + # functions can be defined inside objects. exp translator cant translate them. + # we have to remove them and translate with func translator + # its better explained in translate_array function + obj, hoisted, inline = functions.remove_functions(obj, all_inline=True) + assert not hoisted + gsetters_after = '' + keys = argsplit(obj) + res = [] + for i, e in enumerate(keys, 1): + e = e.strip() + if e.startswith('set '): + gsetters_after += translate_setter(lval, e) + elif e.startswith('get '): + gsetters_after += translate_getter(lval, e) + elif ':' not in e: + if i < len(keys + ): # can happen legally only in the last element {3:2,} + raise SyntaxError('Unexpected "," in Object literal') + break + else: #Not getter, setter or elision + spl = argsplit(e, ':') + if len(spl) < 2: + raise SyntaxError('Invalid Object literal: ' + e) + try: + key, value = spl + except: #len(spl)> 2 + print 'Unusual case ' + repr(e) + key = spl[0] + value = ':'.join(spl[1:]) + key = key.strip() + if is_internal(key): + key = '%s.to_string().value' % key + else: + key = repr(key) + + value = exp_translator(value) + if not value: + raise SyntaxError('Missing value in Object literal') + res.append('%s:%s' % (key, value)) + res = '%s = Js({%s})\n' % (lval, ','.join(res)) + gsetters_after + # translate all the nested objects (including removed earlier functions) + for nested_name, nested_info in inline.iteritems(): # functions + nested_block, nested_args = nested_info + new_def = FUNC_TRANSLATOR(nested_name, nested_block, nested_args) + res = new_def + res + for lval, obj in obj_rep.iteritems(): #objects + new_def, obj_count, arr_count = translate_object( + obj, lval, obj_count, arr_count) + # add object definition BEFORE array definition + res = new_def + res + for lval, obj in arr_rep.iteritems(): # arrays + new_def, obj_count, arr_count = translate_array( + obj, lval, obj_count, arr_count) + # add object definition BEFORE array definition + res = new_def + res + return res, obj_count, arr_count + + +def translate_setter(lval, setter): + func = 'function' + setter[3:] + try: + _, data, _ = functions.remove_functions(func) + if not data or len(data) > 1: + raise Exception() + except: + raise SyntaxError('Could not parse setter: ' + setter) + prop = data.keys()[0] + body, args = data[prop] + if len(args) != 1: #setter must have exactly 1 argument + raise SyntaxError('Invalid setter. It must take exactly 1 argument.') + # now messy part + res = FUNC_TRANSLATOR('setter', body, args) + res += "%s.define_own_property(%s, {'set': setter})\n" % (lval, repr(prop)) + return res + + +def translate_getter(lval, getter): + func = 'function' + getter[3:] + try: + _, data, _ = functions.remove_functions(func) + if not data or len(data) > 1: + raise Exception() + except: + raise SyntaxError('Could not parse getter: ' + getter) + prop = data.keys()[0] + body, args = data[prop] + if len(args) != 0: #setter must have exactly 0 argument + raise SyntaxError('Invalid getter. It must take exactly 0 argument.') + # now messy part + res = FUNC_TRANSLATOR('getter', body, args) + res += "%s.define_own_property(%s, {'get': setter})\n" % (lval, repr(prop)) + return res + + +def translate_array(array, lval, obj_count=1, arr_count=1): + """array has to be any js array for example [1,2,3] + lval has to be name of this array. + Returns python code that adds lval to the PY scope it should be put before lval""" + array = array[1:-1] + array, obj_rep, obj_count = remove_objects(array, obj_count) + array, arr_rep, arr_count = remove_arrays(array, arr_count) + #functions can be also defined in arrays, this caused many problems since in Python + # functions cant be defined inside literal + # remove functions (they dont contain arrays or objects so can be translated easily) + # hoisted functions are treated like inline + array, hoisted, inline = functions.remove_functions(array, all_inline=True) + assert not hoisted + arr = [] + # separate elements in array + for e in argsplit(array, ','): + # translate expressions in array PyJsLvalInline will not be translated! + e = exp_translator(e.replace('\n', '')) + arr.append(e if e else 'None') + arr = '%s = Js([%s])\n' % (lval, ','.join(arr)) + #But we can have more code to add to define arrays/objects/functions defined inside this array + # translate nested objects: + # functions: + for nested_name, nested_info in inline.iteritems(): + nested_block, nested_args = nested_info + new_def = FUNC_TRANSLATOR(nested_name, nested_block, nested_args) + arr = new_def + arr + for lval, obj in obj_rep.iteritems(): + new_def, obj_count, arr_count = translate_object( + obj, lval, obj_count, arr_count) + # add object definition BEFORE array definition + arr = new_def + arr + for lval, obj in arr_rep.iteritems(): + new_def, obj_count, arr_count = translate_array( + obj, lval, obj_count, arr_count) + # add object definition BEFORE array definition + arr = new_def + arr + return arr, obj_count, arr_count + + +if __name__ == '__main__': + test = 'a = {404:{494:19}}; b = 303; if () {f={:}; { }}' + + #print remove_objects(test) + #print list(bracket_split(' {}')) + print + print remove_arrays( + 'typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""], [][[5][5]])[1].toLowerCase()])' + ) + print is_object('', ')') diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/tokenize.py b/Contents/Libraries/Shared/js2py/legecy_translators/tokenize.py new file mode 100644 index 000000000..d6af01958 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/tokenize.py @@ -0,0 +1,4 @@ +from jsparser import * +from utils import * +# maybe I will try rewriting my parser in the future... Tokenizer makes things much easier and faster, unfortunately I +# did not know anything about parsers when I was starting this project so I invented my own. diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/translator.py b/Contents/Libraries/Shared/js2py/legecy_translators/translator.py new file mode 100644 index 000000000..3573f06c6 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/translator.py @@ -0,0 +1,151 @@ +from flow import translate_flow +from constants import remove_constants, recover_constants +from objects import remove_objects, remove_arrays, translate_object, translate_array, set_func_translator +from functions import remove_functions, reset_inline_count +from jsparser import inject_before_lval, indent, dbg + +TOP_GLOBAL = '''from js2py.pyjs import *\nvar = Scope( JS_BUILTINS )\nset_global_object(var)\n''' + + +def translate_js(js, top=TOP_GLOBAL): + """js has to be a javascript source code. + returns equivalent python code.""" + # Remove constant literals + no_const, constants = remove_constants(js) + #print 'const count', len(constants) + # Remove object literals + no_obj, objects, obj_count = remove_objects(no_const) + #print 'obj count', len(objects) + # Remove arrays + no_arr, arrays, arr_count = remove_arrays(no_obj) + #print 'arr count', len(arrays) + # Here remove and replace functions + reset_inline_count() + no_func, hoisted, inline = remove_functions(no_arr) + + #translate flow and expressions + py_seed, to_register = translate_flow(no_func) + + # register variables and hoisted functions + #top += '# register variables\n' + top += 'var.registers(%s)\n' % str(to_register + hoisted.keys()) + + #Recover functions + # hoisted functions recovery + defs = '' + #defs += '# define hoisted functions\n' + #print len(hoisted) , 'HH'*40 + for nested_name, nested_info in hoisted.iteritems(): + nested_block, nested_args = nested_info + new_code = translate_func('PyJsLvalTempHoisted', nested_block, + nested_args) + new_code += 'PyJsLvalTempHoisted.func_name = %s\n' % repr(nested_name) + defs += new_code + '\nvar.put(%s, PyJsLvalTempHoisted)\n' % repr( + nested_name) + #defs += '# Everting ready!\n' + # inline functions recovery + for nested_name, nested_info in inline.iteritems(): + nested_block, nested_args = nested_info + new_code = translate_func(nested_name, nested_block, nested_args) + py_seed = inject_before_lval(py_seed, + nested_name.split('@')[0], new_code) + # add hoisted definitiond - they have literals that have to be recovered + py_seed = defs + py_seed + + #Recover arrays + for arr_lval, arr_code in arrays.iteritems(): + translation, obj_count, arr_count = translate_array( + arr_code, arr_lval, obj_count, arr_count) + py_seed = inject_before_lval(py_seed, arr_lval, translation) + + #Recover objects + for obj_lval, obj_code in objects.iteritems(): + translation, obj_count, arr_count = translate_object( + obj_code, obj_lval, obj_count, arr_count) + py_seed = inject_before_lval(py_seed, obj_lval, translation) + + #Recover constants + py_code = recover_constants(py_seed, constants) + + return top + py_code + + +def translate_func(name, block, args): + """Translates functions and all nested functions to Python code. + name - name of that function (global functions will be available under var while + inline will be available directly under this name ) + block - code of the function (*with* brackets {} ) + args - arguments that this function takes""" + inline = name.startswith('PyJsLvalInline') + real_name = '' + if inline: + name, real_name = name.split('@') + arglist = ', '.join(args) + ', ' if args else '' + code = '@Js\ndef %s(%sthis, arguments, var=var):\n' % (name, arglist) + # register local variables + scope = "'this':this, 'arguments':arguments" #it will be a simple dictionary + for arg in args: + scope += ', %s:%s' % (repr(arg), arg) + if real_name: + scope += ', %s:%s' % (repr(real_name), name) + code += indent('var = Scope({%s}, var)\n' % scope) + block, nested_hoisted, nested_inline = remove_functions(block) + py_code, to_register = translate_flow(block) + #register variables declared with var and names of hoisted functions. + to_register += nested_hoisted.keys() + if to_register: + code += indent('var.registers(%s)\n' % str(to_register)) + for nested_name, info in nested_hoisted.iteritems(): + nested_block, nested_args = info + new_code = translate_func('PyJsLvalTempHoisted', nested_block, + nested_args) + # Now put definition of hoisted function on the top + code += indent(new_code) + code += indent( + 'PyJsLvalTempHoisted.func_name = %s\n' % repr(nested_name)) + code += indent( + 'var.put(%s, PyJsLvalTempHoisted)\n' % repr(nested_name)) + for nested_name, info in nested_inline.iteritems(): + nested_block, nested_args = info + new_code = translate_func(nested_name, nested_block, nested_args) + # Inject definitions of inline functions just before usage + # nested inline names have this format : LVAL_NAME@REAL_NAME + py_code = inject_before_lval(py_code, + nested_name.split('@')[0], new_code) + if py_code.strip(): + code += indent(py_code) + return code + + +set_func_translator(translate_func) + +#print inject_before_lval(' chuj\n moj\n lval\nelse\n', 'lval', 'siema\njestem piter\n') +import time +#print time.time() +#print translate_js('if (1) console.log("Hello, World!"); else if (5) console.log("Hello world?");') +#print time.time() +t = """ +var x = [1,2,3,4,5,6]; +for (var e in x) {console.log(e); delete x[3];} +console.log(5 in [1,2,3,4,5]); + +""" + +SANDBOX = ''' +import traceback +try: +%s +except: + print traceback.format_exc() +print +raw_input('Press Enter to quit') +''' +if __name__ == '__main__': + # test with jq if works then it really works :) + #with open('jq.js', 'r') as f: + #jq = f.read() + + #res = translate_js(jq) + res = translate_js(t) + dbg(SANDBOX % indent(res)) + print 'Done' diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/utils.py b/Contents/Libraries/Shared/js2py/legecy_translators/utils.py new file mode 100644 index 000000000..b14e13d83 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/utils.py @@ -0,0 +1,91 @@ +import sys +import unicodedata +from collections import defaultdict + + +def is_lval(t): + """Does not chceck whether t is not resticted or internal""" + if not t: + return False + i = iter(t) + if i.next() not in IDENTIFIER_START: + return False + return all(e in IDENTIFIER_PART for e in i) + + +def is_valid_lval(t): + """Checks whether t is valid JS identifier name (no keyword like var, function, if etc) + Also returns false on internal""" + if not is_internal(t) and is_lval(t) and t not in RESERVED_NAMES: + return True + return False + + +def is_plval(t): + return t.startswith('PyJsLval') + + +def is_marker(t): + return t.startswith('PyJsMarker') or t.startswith('PyJsConstant') + + +def is_internal(t): + return is_plval(t) or is_marker(t) or t == 'var' # var is a scope var + + +def is_property_accessor(t): + return '[' in t or '.' in t + + +def is_reserved(t): + return t in RESERVED_NAMES + + +#http://stackoverflow.com/questions/14245893/efficiently-list-all-characters-in-a-given-unicode-category +BOM = u'\uFEFF' +ZWJ = u'\u200D' +ZWNJ = u'\u200C' +TAB = u'\u0009' +VT = u'\u000B' +FF = u'\u000C' +SP = u'\u0020' +NBSP = u'\u00A0' +LF = u'\u000A' +CR = u'\u000D' +LS = u'\u2028' +PS = u'\u2029' + +U_CATEGORIES = defaultdict(list) # Thank you Martijn Pieters! +for c in map(unichr, range(sys.maxunicode + 1)): + U_CATEGORIES[unicodedata.category(c)].append(c) + +UNICODE_LETTER = set(U_CATEGORIES['Lu'] + U_CATEGORIES['Ll'] + + U_CATEGORIES['Lt'] + U_CATEGORIES['Lm'] + + U_CATEGORIES['Lo'] + U_CATEGORIES['Nl']) +UNICODE_COMBINING_MARK = set(U_CATEGORIES['Mn'] + U_CATEGORIES['Mc']) +UNICODE_DIGIT = set(U_CATEGORIES['Nd']) +UNICODE_CONNECTOR_PUNCTUATION = set(U_CATEGORIES['Pc']) +IDENTIFIER_START = UNICODE_LETTER.union( + {'$', '_'}) # and some fucking unicode escape sequence +IDENTIFIER_PART = IDENTIFIER_START.union(UNICODE_COMBINING_MARK).union( + UNICODE_DIGIT).union(UNICODE_CONNECTOR_PUNCTUATION).union({ZWJ, ZWNJ}) +USP = U_CATEGORIES['Zs'] +KEYWORD = { + 'break', 'do', 'instanceof', 'typeof', 'case', 'else', 'new', 'var', + 'catch', 'finally', 'return', 'void', 'continue', 'for', 'switch', 'while', + 'debugger', 'function', 'this', 'with', 'default', 'if', 'throw', 'delete', + 'in', 'try' +} + +FUTURE_RESERVED_WORD = { + 'class', 'enum', 'extends', 'super', 'const', 'export', 'import' +} +RESERVED_NAMES = KEYWORD.union(FUTURE_RESERVED_WORD).union( + {'null', 'false', 'true'}) + +WHITE = {TAB, VT, FF, SP, NBSP, BOM}.union(USP) +LINE_TERMINATOR = {LF, CR, LS, PS} +LLINE_TERMINATOR = list(LINE_TERMINATOR) +x = ''.join(WHITE) + ''.join(LINE_TERMINATOR) +SPACE = WHITE.union(LINE_TERMINATOR) +LINE_TERMINATOR_SEQUENCE = LINE_TERMINATOR.union({CR + LF}) diff --git a/Contents/Libraries/Shared/js2py/node_import.py b/Contents/Libraries/Shared/js2py/node_import.py new file mode 100644 index 000000000..a49a1f51e --- /dev/null +++ b/Contents/Libraries/Shared/js2py/node_import.py @@ -0,0 +1,113 @@ +__all__ = ['require'] +import subprocess, os, codecs, glob +from .evaljs import translate_js +import six +DID_INIT = False +DIRNAME = os.path.dirname(os.path.abspath(__file__)) +PY_NODE_MODULES_PATH = os.path.join(DIRNAME, 'py_node_modules') + + +def _init(): + global DID_INIT + if DID_INIT: + return + assert subprocess.call( + 'node -v', shell=True, cwd=DIRNAME + ) == 0, 'You must have node installed! run: brew install node' + assert subprocess.call( + 'cd %s;npm install babel-core babel-cli babel-preset-es2015 babel-polyfill babelify browserify' + % repr(DIRNAME), + shell=True, + cwd=DIRNAME) == 0, 'Could not link required node_modules' + DID_INIT = True + + +ADD_TO_GLOBALS_FUNC = ''' +;function addToGlobals(name, obj) { + if (!Object.prototype.hasOwnProperty('_fake_exports')) { + Object.prototype._fake_exports = {}; + } + Object.prototype._fake_exports[name] = obj; +}; + +''' +# subprocess.call("""node -e 'require("browserify")'""", shell=True) +GET_FROM_GLOBALS_FUNC = ''' +;function getFromGlobals(name) { + if (!Object.prototype.hasOwnProperty('_fake_exports')) { + throw Error("Could not find any value named "+name); + } + if (Object.prototype._fake_exports.hasOwnProperty(name)) { + return Object.prototype._fake_exports[name]; + } else { + throw Error("Could not find any value named "+name); + } +}; + +''' + + +def require(module_name, include_polyfill=False, update=False): + assert isinstance(module_name, str), 'module_name must be a string!' + py_name = module_name.replace('-', '_') + module_filename = '%s.py' % py_name + var_name = py_name.rpartition('/')[-1] + if not os.path.exists(os.path.join(PY_NODE_MODULES_PATH, + module_filename)) or update: + _init() + in_file_name = 'tmp0in439341018923js2py.js' + out_file_name = 'tmp0out439341018923js2py.js' + code = ADD_TO_GLOBALS_FUNC + if include_polyfill: + code += "\n;require('babel-polyfill');\n" + code += """ + var module_temp_love_python = require(%s); + addToGlobals(%s, module_temp_love_python); + """ % (repr(module_name), repr(module_name)) + with open(os.path.join(DIRNAME, in_file_name), 'wb') as f: + f.write(code.encode('utf-8') if six.PY3 else code) + + pkg_name = module_name.partition('/')[0] + # make sure the module is installed + assert subprocess.call( + 'cd %s;npm install %s' % (repr(DIRNAME), pkg_name), + shell=True, + cwd=DIRNAME + ) == 0, 'Could not install the required module: ' + pkg_name + + # convert the module + assert subprocess.call( + '''node -e "(require('browserify')('./%s').bundle(function (err,data) {fs.writeFile('%s', require('babel-core').transform(data, {'presets': require('babel-preset-es2015')}).code, ()=>{});}))"''' + % (in_file_name, out_file_name), + shell=True, + cwd=DIRNAME, + ) == 0, 'Error when converting module to the js bundle' + + os.remove(os.path.join(DIRNAME, in_file_name)) + with codecs.open(os.path.join(DIRNAME, out_file_name), "r", + "utf-8") as f: + js_code = f.read() + os.remove(os.path.join(DIRNAME, out_file_name)) + + js_code += GET_FROM_GLOBALS_FUNC + js_code += ';var %s = getFromGlobals(%s);%s' % ( + var_name, repr(module_name), var_name) + print('Please wait, translating...') + py_code = translate_js(js_code) + + dirname = os.path.dirname( + os.path.join(PY_NODE_MODULES_PATH, module_filename)) + if not os.path.isdir(dirname): + os.makedirs(dirname) + with open(os.path.join(PY_NODE_MODULES_PATH, module_filename), + 'wb') as f: + f.write(py_code.encode('utf-8') if six.PY3 else py_code) + else: + with codecs.open( + os.path.join(PY_NODE_MODULES_PATH, module_filename), "r", + "utf-8") as f: + py_code = f.read() + + context = {} + exec (py_code, context) + return context['var'][var_name].to_py() diff --git a/Contents/Libraries/Shared/js2py/prototypes/__init__.py b/Contents/Libraries/Shared/js2py/prototypes/__init__.py new file mode 100644 index 000000000..8de79cb9d --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/__init__.py @@ -0,0 +1 @@ +__author__ = 'Piotr Dabkowski' diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsarray.py b/Contents/Libraries/Shared/js2py/prototypes/jsarray.py new file mode 100644 index 000000000..d02e62b25 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsarray.py @@ -0,0 +1,476 @@ +import six + +if six.PY3: + xrange = range + import functools + + +def to_arr(this): + """Returns Python array from Js array""" + return [this.get(str(e)) for e in xrange(len(this))] + + +ARR_STACK = set({}) + + +class ArrayPrototype: + def toString(): + # this function is wrong but I will leave it here fore debugging purposes. + func = this.get('join') + if not func.is_callable(): + + @this.Js + def func(): + return '[object %s]' % this.Class + + return func.call(this, ()) + + def toLocaleString(): + array = this.to_object() + arr_len = array.get('length').to_uint32() + # separator is simply a comma ',' + if not arr_len: + return '' + res = [] + for i in xrange(arr_len): + element = array[str(i)] + if element.is_undefined() or element.is_null(): + res.append('') + else: + cand = element.to_object() + str_func = element.get('toLocaleString') + if not str_func.is_callable(): + raise this.MakeError( + 'TypeError', + 'toLocaleString method of item at index %d is not callable' + % i) + res.append(element.callprop('toLocaleString').value) + return ','.join(res) + + def concat(): + array = this.to_object() + A = this.Js([]) + items = [array] + items.extend(to_arr(arguments)) + n = 0 + for E in items: + if E.Class == 'Array': + k = 0 + e_len = len(E) + while k < e_len: + if E.has_property(str(k)): + A.put(str(n), E.get(str(k))) + n += 1 + k += 1 + else: + A.put(str(n), E) + n += 1 + return A + + def join(separator): + ARR_STACK.add(this) + array = this.to_object() + arr_len = array.get('length').to_uint32() + separator = ',' if separator.is_undefined() else separator.to_string( + ).value + elems = [] + for e in xrange(arr_len): + elem = array.get(str(e)) + if elem in ARR_STACK: + s = '' + else: + s = elem.to_string().value + elems.append( + s if not (elem.is_undefined() or elem.is_null()) else '') + res = separator.join(elems) + ARR_STACK.remove(this) + return res + + def pop(): #todo check + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not arr_len: + array.put('length', this.Js(arr_len)) + return None + ind = str(arr_len - 1) + element = array.get(ind) + array.delete(ind) + array.put('length', this.Js(arr_len - 1)) + return element + + def push(item): # todo check + array = this.to_object() + arr_len = array.get('length').to_uint32() + to_put = arguments.to_list() + i = arr_len + for i, e in enumerate(to_put, arr_len): + array.put(str(i), e) + if to_put: + i += 1 + array.put('length', this.Js(i)) + return i + + def reverse(): + array = this.to_object() # my own algorithm + vals = to_arr(array) + has_props = [array.has_property(str(e)) for e in xrange(len(array))] + vals.reverse() + has_props.reverse() + for i, val in enumerate(vals): + if has_props[i]: + array.put(str(i), val) + else: + array.delete(str(i)) + return array + + def shift(): #todo check + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not arr_len: + array.put('length', this.Js(0)) + return None + first = array.get('0') + for k in xrange(1, arr_len): + from_s, to_s = str(k), str(k - 1) + if array.has_property(from_s): + array.put(to_s, array.get(from_s)) + else: + array.delete(to) + array.delete(str(arr_len - 1)) + array.put('length', this.Js(str(arr_len - 1))) + return first + + def slice(start, end): # todo check + array = this.to_object() + arr_len = array.get('length').to_uint32() + relative_start = start.to_int() + k = max((arr_len + relative_start), 0) if relative_start < 0 else min( + relative_start, arr_len) + relative_end = arr_len if end.is_undefined() else end.to_int() + final = max((arr_len + relative_end), 0) if relative_end < 0 else min( + relative_end, arr_len) + res = [] + n = 0 + while k < final: + pk = str(k) + if array.has_property(pk): + res.append(array.get(pk)) + k += 1 + n += 1 + return res + + def sort(cmpfn): + if not this.Class in ('Array', 'Arguments'): + return this.to_object() # do nothing + arr = [] + for i in xrange(len(this)): + arr.append(this.get(six.text_type(i))) + + if not arr: + return this + if not cmpfn.is_callable(): + cmpfn = None + cmp = lambda a, b: sort_compare(a, b, cmpfn) + if six.PY3: + key = functools.cmp_to_key(cmp) + arr.sort(key=key) + else: + arr.sort(cmp=cmp) + for i in xrange(len(arr)): + this.put(six.text_type(i), arr[i]) + + return this + + def splice(start, deleteCount): + # 1-8 + array = this.to_object() + arr_len = array.get('length').to_uint32() + relative_start = start.to_int() + actual_start = max( + (arr_len + relative_start), 0) if relative_start < 0 else min( + relative_start, arr_len) + actual_delete_count = min( + max(deleteCount.to_int(), 0), arr_len - actual_start) + k = 0 + A = this.Js([]) + # 9 + while k < actual_delete_count: + if array.has_property(str(actual_start + k)): + A.put(str(k), array.get(str(actual_start + k))) + k += 1 + # 10-11 + items = to_arr(arguments)[2:] + items_len = len(items) + # 12 + if items_len < actual_delete_count: + k = actual_start + while k < (arr_len - actual_delete_count): + fr = str(k + actual_delete_count) + to = str(k + items_len) + if array.has_property(fr): + array.put(to, array.get(fr)) + else: + array.delete(to) + k += 1 + k = arr_len + while k > (arr_len - actual_delete_count + items_len): + array.delete(str(k - 1)) + k -= 1 + # 13 + elif items_len > actual_delete_count: + k = arr_len - actual_delete_count + while k > actual_start: + fr = str(k + actual_delete_count - 1) + to = str(k + items_len - 1) + if array.has_property(fr): + array.put(to, array.get(fr)) + else: + array.delete(to) + k -= 1 + # 14-17 + k = actual_start + while items: + E = items.pop(0) + array.put(str(k), E) + k += 1 + array.put('length', this.Js(arr_len - actual_delete_count + items_len)) + return A + + def unshift(): + array = this.to_object() + arr_len = array.get('length').to_uint32() + argCount = len(arguments) + k = arr_len + while k > 0: + fr = str(k - 1) + to = str(k + argCount - 1) + if array.has_property(fr): + array.put(to, array.get(fr)) + else: + array.delete(to) + k -= 1 + j = 0 + items = to_arr(arguments) + while items: + E = items.pop(0) + array.put(str(j), E) + j += 1 + array.put('length', this.Js(arr_len + argCount)) + return arr_len + argCount + + def indexOf(searchElement): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if arr_len == 0: + return -1 + if len(arguments) > 1: + n = arguments[1].to_int() + else: + n = 0 + if n >= arr_len: + return -1 + if n >= 0: + k = n + else: + k = arr_len - abs(n) + if k < 0: + k = 0 + while k < arr_len: + if array.has_property(str(k)): + elementK = array.get(str(k)) + if searchElement.strict_equality_comparison(elementK): + return k + k += 1 + return -1 + + def lastIndexOf(searchElement): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if arr_len == 0: + return -1 + if len(arguments) > 1: + n = arguments[1].to_int() + else: + n = arr_len - 1 + if n >= 0: + k = min(n, arr_len - 1) + else: + k = arr_len - abs(n) + while k >= 0: + if array.has_property(str(k)): + elementK = array.get(str(k)) + if searchElement.strict_equality_comparison(elementK): + return k + k -= 1 + return -1 + + def every(callbackfn): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + if not callbackfn.call( + T, (kValue, this.Js(k), array)).to_boolean().value: + return False + k += 1 + return True + + def some(callbackfn): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + if callbackfn.call( + T, (kValue, this.Js(k), array)).to_boolean().value: + return True + k += 1 + return False + + def forEach(callbackfn): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + callbackfn.call(T, (kValue, this.Js(k), array)) + k += 1 + + def map(callbackfn): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + A = this.Js([]) + k = 0 + while k < arr_len: + Pk = str(k) + if array.has_property(Pk): + kValue = array.get(Pk) + mappedValue = callbackfn.call(T, (kValue, this.Js(k), array)) + A.define_own_property( + Pk, { + 'value': mappedValue, + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + k += 1 + return A + + def filter(callbackfn): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + res = [] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + if callbackfn.call( + T, (kValue, this.Js(k), array)).to_boolean().value: + res.append(kValue) + k += 1 + return res # converted to js array automatically + + def reduce(callbackfn): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + if not arr_len and len(arguments) < 2: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + k = 0 + if len(arguments) > 1: # initial value present + accumulator = arguments[1] + else: + kPresent = False + while not kPresent and k < arr_len: + kPresent = array.has_property(str(k)) + if kPresent: + accumulator = array.get(str(k)) + k += 1 + if not kPresent: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + accumulator = callbackfn.call( + this.undefined, (accumulator, kValue, this.Js(k), array)) + k += 1 + return accumulator + + def reduceRight(callbackfn): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + if not arr_len and len(arguments) < 2: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + k = arr_len - 1 + if len(arguments) > 1: # initial value present + accumulator = arguments[1] + else: + kPresent = False + while not kPresent and k >= 0: + kPresent = array.has_property(str(k)) + if kPresent: + accumulator = array.get(str(k)) + k -= 1 + if not kPresent: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + while k >= 0: + if array.has_property(str(k)): + kValue = array.get(str(k)) + accumulator = callbackfn.call( + this.undefined, (accumulator, kValue, this.Js(k), array)) + k -= 1 + return accumulator + + +def sort_compare(a, b, comp): + if a is None: + if b is None: + return 0 + return 1 + if b is None: + if a is None: + return 0 + return -1 + if a.is_undefined(): + if b.is_undefined(): + return 0 + return 1 + if b.is_undefined(): + if a.is_undefined(): + return 0 + return -1 + if comp is not None: + res = comp.call(a.undefined, (a, b)) + return res.to_int() + x, y = a.to_string(), b.to_string() + if x < y: + return -1 + elif x > y: + return 1 + return 0 diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsarraybuffer.py b/Contents/Libraries/Shared/js2py/prototypes/jsarraybuffer.py new file mode 100644 index 000000000..7bcd00fb0 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsarraybuffer.py @@ -0,0 +1,19 @@ +# this is based on jsarray.py + +import six + +if six.PY3: + xrange = range + import functools + + +def to_arr(this): + """Returns Python array from Js array""" + return [this.get(str(e)) for e in xrange(len(this))] + + +ARR_STACK = set({}) + + +class ArrayBufferPrototype: + pass diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsboolean.py b/Contents/Libraries/Shared/js2py/prototypes/jsboolean.py new file mode 100644 index 000000000..2cacd32da --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsboolean.py @@ -0,0 +1,10 @@ +class BooleanPrototype: + def toString(): + if this.Class != 'Boolean': + raise this.Js(TypeError)('this must be a boolean') + return 'true' if this.value else 'false' + + def valueOf(): + if this.Class != 'Boolean': + raise this.Js(TypeError)('this must be a boolean') + return this.value diff --git a/Contents/Libraries/Shared/js2py/prototypes/jserror.py b/Contents/Libraries/Shared/js2py/prototypes/jserror.py new file mode 100644 index 000000000..c488bf155 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jserror.py @@ -0,0 +1,10 @@ +class ErrorPrototype: + def toString(): + if this.TYPE != 'Object': + raise this.MakeError( + 'TypeError', 'Error.prototype.toString called on non-object') + name = this.get('name') + name = 'Error' if name.is_undefined() else name.to_string().value + msg = this.get('message') + msg = '' if msg.is_undefined() else msg.to_string().value + return name + (name and msg and ': ') + msg diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsfunction.py b/Contents/Libraries/Shared/js2py/prototypes/jsfunction.py new file mode 100644 index 000000000..f9598a317 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsfunction.py @@ -0,0 +1,52 @@ +# python 3 support +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + +# todo fix apply and bind + + +class FunctionPrototype: + def toString(): + if not this.is_callable(): + raise TypeError('toString is not generic!') + args = ', '.join(this.code.__code__.co_varnames[:this.argcount]) + return 'function %s(%s) ' % (this.func_name, args) + this.source + + def call(): + arguments_ = arguments + if not len(arguments): + obj = this.Js(None) + else: + obj = arguments[0] + if len(arguments) <= 1: + args = () + else: + args = tuple([arguments_[e] for e in xrange(1, len(arguments_))]) + return this.call(obj, args) + + def apply(): + if not len(arguments): + obj = this.Js(None) + else: + obj = arguments[0] + if len(arguments) <= 1: + args = () + else: + appl = arguments[1] + args = tuple([appl[e] for e in xrange(len(appl))]) + return this.call(obj, args) + + def bind(thisArg): + target = this + if not target.is_callable(): + raise this.MakeError( + 'Object must be callable in order to be used with bind method') + if len(arguments) <= 1: + args = () + else: + args = tuple([arguments[e] for e in xrange(1, len(arguments))]) + return this.PyJsBoundFunction(target, thisArg, args) diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsjson.py b/Contents/Libraries/Shared/js2py/prototypes/jsjson.py new file mode 100644 index 000000000..9f7ccbb01 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsjson.py @@ -0,0 +1,219 @@ +import json +from ..base import Js +indent = '' +# python 3 support +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + + +def parse(text): + reviver = arguments[1] + s = text.to_string().value + try: + unfiltered = json.loads(s) + except: + raise this.MakeError('SyntaxError', + 'Could not parse JSON string - Invalid syntax') + unfiltered = to_js(this, unfiltered) + if reviver.is_callable(): + root = this.Js({'': unfiltered}) + return walk(root, '', reviver) + else: + return unfiltered + + +def stringify(value, replacer, space): + global indent + stack = set([]) + indent = '' + property_list = replacer_function = this.undefined + if replacer.is_object(): + if replacer.is_callable(): + replacer_function = replacer + elif replacer.Class == 'Array': + property_list = [] + for e in replacer: + v = replacer[e] + item = this.undefined + if v._type() == 'Number': + item = v.to_string() + elif v._type() == 'String': + item = v + elif v.is_object(): + if v.Class in ('String', 'Number'): + item = v.to_string() + if not item.is_undefined() and item.value not in property_list: + property_list.append(item.value) + if space.is_object(): + if space.Class == 'Number': + space = space.to_number() + elif space.Class == 'String': + space = space.to_string() + if space._type() == 'Number': + space = this.Js(min(10, space.to_int())) + gap = max(int(space.value), 0) * ' ' + elif space._type() == 'String': + gap = space.value[:10] + else: + gap = '' + return this.Js( + Str('', this.Js({ + '': value + }), replacer_function, property_list, gap, stack, space)) + + +def Str(key, holder, replacer_function, property_list, gap, stack, space): + value = holder[key] + if value.is_object(): + to_json = value.get('toJSON') + if to_json.is_callable(): + value = to_json.call(value, (key, )) + if not replacer_function.is_undefined(): + value = replacer_function.call(holder, (key, value)) + + if value.is_object(): + if value.Class == 'String': + value = value.to_string() + elif value.Class == 'Number': + value = value.to_number() + elif value.Class == 'Boolean': + value = value.to_boolean() + if value.is_null(): + return 'null' + elif value.Class == 'Boolean': + return 'true' if value.value else 'false' + elif value._type() == 'String': + return Quote(value) + elif value._type() == 'Number': + if not value.is_infinity(): + return value.to_string() + return 'null' + if value.is_object() and not value.is_callable(): + if value.Class == 'Array': + return ja(value, stack, gap, property_list, replacer_function, + space) + else: + return jo(value, stack, gap, property_list, replacer_function, + space) + return None # undefined + + +def jo(value, stack, gap, property_list, replacer_function, space): + global indent + if value in stack: + raise value.MakeError('TypeError', + 'Converting circular structure to JSON') + stack.add(value) + stepback = indent + indent += gap + if not property_list.is_undefined(): + k = property_list + else: + k = [e.value for e in value] + partial = [] + for p in k: + str_p = value.Js( + Str(p, value, replacer_function, property_list, gap, stack, space)) + if not str_p.is_undefined(): + member = json.dumps(p) + ':' + ( + ' ' if gap else + '') + str_p.value # todo not sure here - what space character? + partial.append(member) + if not partial: + final = '{}' + else: + if not gap: + final = '{%s}' % ','.join(partial) + else: + sep = ',\n' + indent + properties = sep.join(partial) + final = '{\n' + indent + properties + '\n' + stepback + '}' + stack.remove(value) + indent = stepback + return final + + +def ja(value, stack, gap, property_list, replacer_function, space): + global indent + if value in stack: + raise value.MakeError('TypeError', + 'Converting circular structure to JSON') + stack.add(value) + stepback = indent + indent += gap + partial = [] + length = len(value) + for index in xrange(length): + index = str(index) + str_index = value.Js( + Str(index, value, replacer_function, property_list, gap, stack, + space)) + if str_index.is_undefined(): + partial.append('null') + else: + partial.append(str_index.value) + if not partial: + final = '[]' + else: + if not gap: + final = '[%s]' % ','.join(partial) + else: + sep = ',\n' + indent + properties = sep.join(partial) + final = '[\n' + indent + properties + '\n' + stepback + ']' + stack.remove(value) + indent = stepback + return final + + +def Quote(string): + return string.Js(json.dumps(string.value)) + + +def to_js(this, d): + if isinstance(d, dict): + return this.Js(dict((k, this.Js(v)) for k, v in six.iteritems(d))) + return this.Js(d) + + +def walk(holder, name, reviver): + val = holder.get(name) + if val.Class == 'Array': + for i in xrange(len(val)): + i = unicode(i) + new_element = walk(val, i, reviver) + if new_element.is_undefined(): + val.delete(i) + else: + new_element.put(i, new_element) + elif val.is_object(): + for key in val: + new_element = walk(val, key, reviver) + if new_element.is_undefined(): + val.delete(key) + else: + val.put(key, new_element) + return reviver.call(holder, (name, val)) + + +JSON = Js({}) + +JSON.define_own_property( + 'parse', { + 'value': Js(parse), + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +JSON.define_own_property( + 'stringify', { + 'value': Js(stringify), + 'enumerable': False, + 'writable': True, + 'configurable': True + }) diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsnumber.py b/Contents/Libraries/Shared/js2py/prototypes/jsnumber.py new file mode 100644 index 000000000..c9905ab01 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsnumber.py @@ -0,0 +1,146 @@ +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + +RADIX_SYMBOLS = { + 0: '0', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: 'a', + 11: 'b', + 12: 'c', + 13: 'd', + 14: 'e', + 15: 'f', + 16: 'g', + 17: 'h', + 18: 'i', + 19: 'j', + 20: 'k', + 21: 'l', + 22: 'm', + 23: 'n', + 24: 'o', + 25: 'p', + 26: 'q', + 27: 'r', + 28: 's', + 29: 't', + 30: 'u', + 31: 'v', + 32: 'w', + 33: 'x', + 34: 'y', + 35: 'z' +} + + +def to_str_rep(num): + if num.is_nan(): + return num.Js('NaN') + elif num.is_infinity(): + sign = '-' if num.value < 0 else '' + return num.Js(sign + 'Infinity') + elif isinstance(num.value, + (long, int)) or num.value.is_integer(): # dont print .0 + return num.Js(unicode(int(num.value))) + return num.Js(unicode(num.value)) # accurate enough + + +class NumberPrototype: + def toString(radix): + if this.Class != 'Number': + raise this.MakeError('TypeError', + 'Number.prototype.valueOf is not generic') + if radix.is_undefined(): + return to_str_rep(this) + r = radix.to_int() + if r == 10: + return to_str_rep(this) + if r not in xrange(2, 37): + raise this.MakeError( + 'RangeError', + 'Number.prototype.toString() radix argument must be between 2 and 36' + ) + num = this.to_int() + if num < 0: + num = -num + sign = '-' + else: + sign = '' + res = '' + while num: + s = RADIX_SYMBOLS[num % r] + num = num // r + res = s + res + return sign + (res if res else '0') + + def valueOf(): + if this.Class != 'Number': + raise this.MakeError('TypeError', + 'Number.prototype.valueOf is not generic') + return this.value + + def toLocaleString(): + return this.to_string() + + def toFixed(fractionDigits): + if this.Class != 'Number': + raise this.MakeError( + 'TypeError', + 'Number.prototype.toFixed called on incompatible receiver') + digs = fractionDigits.to_int() + if digs < 0 or digs > 20: + raise this.MakeError( + 'RangeError', + 'toFixed() digits argument must be between 0 and 20') + elif this.is_infinity(): + return 'Infinity' if this.value > 0 else '-Infinity' + elif this.is_nan(): + return 'NaN' + return format(this.value, '-.%df' % digs) + + def toExponential(fractionDigits): + if this.Class != 'Number': + raise this.MakeError( + 'TypeError', + 'Number.prototype.toExponential called on incompatible receiver' + ) + digs = fractionDigits.to_int() + if digs < 0 or digs > 20: + raise this.MakeError( + 'RangeError', + 'toFixed() digits argument must be between 0 and 20') + elif this.is_infinity(): + return 'Infinity' if this.value > 0 else '-Infinity' + elif this.is_nan(): + return 'NaN' + return format(this.value, '-.%de' % digs) + + def toPrecision(precision): + if this.Class != 'Number': + raise this.MakeError( + 'TypeError', + 'Number.prototype.toPrecision called on incompatible receiver') + if precision.is_undefined(): + return this.to_string() + prec = precision.to_int() + if this.is_nan(): + return 'NaN' + elif this.is_infinity(): + return 'Infinity' if this.value > 0 else '-Infinity' + digs = prec - len(str(int(this.value))) + if digs >= 0: + return format(this.value, '-.%df' % digs) + else: + return format(this.value, '-.%df' % (prec - 1)) diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsobject.py b/Contents/Libraries/Shared/js2py/prototypes/jsobject.py new file mode 100644 index 000000000..aeefe5d37 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsobject.py @@ -0,0 +1,28 @@ +class ObjectPrototype: + def toString(): + return '[object %s]' % this.Class + + def valueOf(): + return this.to_object() + + def toLocaleString(): + return this.callprop('toString') + + def hasOwnProperty(prop): + return this.get_own_property(prop.to_string().value) is not None + + def isPrototypeOf(obj): + #a bit stupid specification but well + # for example Object.prototype.isPrototypeOf.call((5).__proto__, 5) gives false + if not obj.is_object(): + return False + while 1: + obj = obj.prototype + if obj is None or obj.is_null(): + return False + if obj is this: + return True + + def propertyIsEnumerable(prop): + cand = this.own.get(prop.to_string().value) + return cand is not None and cand.get('enumerable') diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsregexp.py b/Contents/Libraries/Shared/js2py/prototypes/jsregexp.py new file mode 100644 index 000000000..b23f2003b --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsregexp.py @@ -0,0 +1,45 @@ +class RegExpPrototype: + def toString(): + flags = u'' + try: + if this.glob: + flags += u'g' + if this.ignore_case: + flags += u'i' + if this.multiline: + flags += u'm' + except: + pass + v = this.value if this.value else '(?:)' + return u'/%s/' % v + flags + + def test(string): + return Exec(this, string) is not this.null + + def exec2(string + ): # will be changed to exec in base.py. cant name it exec here + return Exec(this, string) + + +def Exec(this, string): + if this.Class != 'RegExp': + raise this.MakeError('TypeError', + 'RegExp.prototype.exec is not generic!') + string = string.to_string() + length = len(string) + i = this.get('lastIndex').to_int() if this.glob else 0 + matched = False + while not matched: + if i < 0 or i > length: + this.put('lastIndex', this.Js(0)) + return this.null + matched = this.match(string.value, i) + i += 1 + start, end = matched.span() #[0]+i-1, matched.span()[1]+i-1 + if this.glob: + this.put('lastIndex', this.Js(end)) + arr = this.Js( + [this.Js(e) for e in [matched.group()] + list(matched.groups())]) + arr.put('index', this.Js(start)) + arr.put('input', string) + return arr diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsstring.py b/Contents/Libraries/Shared/js2py/prototypes/jsstring.py new file mode 100644 index 000000000..ee3207094 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsstring.py @@ -0,0 +1,306 @@ +# -*- coding: utf-8 -*- +from .jsregexp import Exec +import re +DIGS = set('0123456789') +WHITE = u"\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF" + + +def replacement_template(rep, source, span, npar): + """Takes the replacement template and some info about the match and returns filled template + """ + n = 0 + res = '' + while n < len(rep) - 1: + char = rep[n] + if char == '$': + if rep[n + 1] == '$': + res += '$' + n += 2 + continue + elif rep[n + 1] == '`': + # replace with string that is BEFORE match + res += source[:span[0]] + n += 2 + continue + elif rep[n + 1] == '\'': + # replace with string that is AFTER match + res += source[span[1]:] + n += 2 + continue + elif rep[n + 1] in DIGS: + dig = rep[n + 1] + if n + 2 < len(rep) and rep[n + 2] in DIGS: + dig += rep[n + 2] + num = int(dig) + # we will not do any replacements if we dont have this npar or dig is 0 + if not num or num > len(npar): + res += '$' + dig + else: + # None - undefined has to be replaced with '' + res += npar[num - 1] if npar[num - 1] else '' + n += 1 + len(dig) + continue + res += char + n += 1 + if n < len(rep): + res += rep[-1] + return res + + +################################################### + + +class StringPrototype: + def toString(): + if this.Class != 'String': + raise this.MakeError('TypeError', + 'String.prototype.toString is not generic') + return this.value + + def valueOf(): + if this.Class != 'String': + raise this.MakeError('TypeError', + 'String.prototype.valueOf is not generic') + return this.value + + def charAt(pos): + this.cok() + pos = pos.to_int() + s = this.to_string() + if 0 <= pos < len(s.value): + char = s.value[pos] + if char not in s.CHAR_BANK: + s.Js(char) # add char to char bank + return s.CHAR_BANK[char] + return s.CHAR_BANK[''] + + def charCodeAt(pos): + this.cok() + pos = pos.to_int() + s = this.to_string() + if 0 <= pos < len(s.value): + return s.Js(ord(s.value[pos])) + return s.NaN + + def concat(): + this.cok() + s = this.to_string() + res = s.value + for e in arguments.to_list(): + res += e.to_string().value + return res + + def indexOf(searchString, position): + this.cok() + s = this.to_string().value + search = searchString.to_string().value + pos = position.to_int() + return this.Js(s.find(search, min(max(pos, 0), len(s)))) + + def lastIndexOf(searchString, position): + this.cok() + s = this.to_string().value + search = searchString.to_string().value + pos = position.to_number() + pos = 10**15 if pos.is_nan() else pos.to_int() + return s.rfind(search, 0, min(max(pos, 0) + 1, len(s))) + + def localeCompare(that): + this.cok() + s = this.to_string() + that = that.to_string() + if s < that: + return this.Js(-1) + elif s > that: + return this.Js(1) + return this.Js(0) + + def match(regexp): + this.cok() + s = this.to_string() + r = this.RegExp(regexp) if regexp.Class != 'RegExp' else regexp + if not r.glob: + return Exec(r, s) + r.put('lastIndex', this.Js(0)) + found = [] + previous_last_index = 0 + last_match = True + while last_match: + result = Exec(r, s) + if result.is_null(): + last_match = False + else: + this_index = r.get('lastIndex').value + if this_index == previous_last_index: + r.put('lastIndex', this.Js(this_index + 1)) + previous_last_index += 1 + else: + previous_last_index = this_index + matchStr = result.get('0') + found.append(matchStr) + if not found: + return this.null + return found + + def replace(searchValue, replaceValue): + # VERY COMPLICATED. to check again. + this.cok() + string = this.to_string() + s = string.value + res = '' + if not replaceValue.is_callable(): + replaceValue = replaceValue.to_string().value + func = False + else: + func = True + # Replace all ( global ) + if searchValue.Class == 'RegExp' and searchValue.glob: + last = 0 + for e in re.finditer(searchValue.pat, s): + res += s[last:e.span()[0]] + if func: + # prepare arguments for custom func (replaceValue) + args = (e.group(), ) + e.groups() + (e.span()[1], string) + # convert all types to JS + args = map(this.Js, args) + res += replaceValue(*args).to_string().value + else: + res += replacement_template(replaceValue, s, e.span(), + e.groups()) + last = e.span()[1] + res += s[last:] + return this.Js(res) + elif searchValue.Class == 'RegExp': + e = re.search(searchValue.pat, s) + if e is None: + return string + span = e.span() + pars = e.groups() + match = e.group() + else: + match = searchValue.to_string().value + ind = s.find(match) + if ind == -1: + return string + span = ind, ind + len(match) + pars = () + res = s[:span[0]] + if func: + args = (match, ) + pars + (span[1], string) + # convert all types to JS + this_ = this + args = tuple([this_.Js(x) for x in args]) + res += replaceValue(*args).to_string().value + else: + res += replacement_template(replaceValue, s, span, pars) + res += s[span[1]:] + return res + + def search(regexp): + this.cok() + string = this.to_string() + if regexp.Class == 'RegExp': + rx = regexp + else: + rx = this.RegExp(regexp) + res = re.search(rx.pat, string.value) + if res is not None: + return this.Js(res.span()[0]) + return -1 + + def slice(start, end): + this.cok() + s = this.to_string() + start = start.to_int() + length = len(s.value) + end = length if end.is_undefined() else end.to_int() + #From = max(length+start, 0) if start<0 else min(length, start) + #To = max(length+end, 0) if end<0 else min(length, end) + return s.value[start:end] + + def split(separator, limit): + # its a bit different that re.split! + this.cok() + S = this.to_string() + s = S.value + lim = 2**32 - 1 if limit.is_undefined() else limit.to_uint32() + if not lim: + return [] + if separator.is_undefined(): + return [s] + len_s = len(s) + res = [] + R = separator if separator.Class == 'RegExp' else separator.to_string() + if not len_s: + if SplitMatch(s, 0, R) is None: + return [S] + return [] + p = q = 0 + while q != len_s: + e, cap = SplitMatch(s, q, R) + if e is None or e == p: + q += 1 + continue + res.append(s[p:q]) + p = q = e + if len(res) == lim: + return res + for element in cap: + res.append(this.Js(element)) + if len(res) == lim: + return res + res.append(s[p:]) + return res + + def substring(start, end): + this.cok() + s = this.to_string().value + start = start.to_int() + length = len(s) + end = length if end.is_undefined() else end.to_int() + fstart = min(max(start, 0), length) + fend = min(max(end, 0), length) + return this.Js(s[min(fstart, fend):max(fstart, fend)]) + + def substr(start, length): + #I hate this function and its description in specification + r1 = this.to_string().value + r2 = start.to_int() + r3 = 10**20 if length.is_undefined() else length.to_int() + r4 = len(r1) + r5 = r2 if r2 >= 0 else max(0, r2 + r4) + r6 = min(max(r3, 0), r4 - r5) + if r6 <= 0: + return '' + return r1[r5:r5 + r6] + + def toLowerCase(): + this.cok() + return this.Js(this.to_string().value.lower()) + + def toLocaleLowerCase(): + this.cok() + return this.Js(this.to_string().value.lower()) + + def toUpperCase(): + this.cok() + return this.Js(this.to_string().value.upper()) + + def toLocaleUpperCase(): + this.cok() + return this.Js(this.to_string().value.upper()) + + def trim(): + this.cok() + return this.Js(this.to_string().value.strip(WHITE)) + + +def SplitMatch(s, q, R): + # s is Py String to match, q is the py int match start and R is Js RegExp or String. + if R.Class == 'RegExp': + res = R.match(s, q) + return (None, ()) if res is None else (res.span()[1], res.groups()) + # R is just a string + if s[q:].startswith(R.value): + return q + len(R.value), () + return None, () diff --git a/Contents/Libraries/Shared/js2py/prototypes/jstypedarray.py b/Contents/Libraries/Shared/js2py/prototypes/jstypedarray.py new file mode 100644 index 000000000..43285aaef --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jstypedarray.py @@ -0,0 +1,344 @@ +# this is based on jsarray.py + +import six +try: + import numpy +except: + pass + +if six.PY3: + xrange = range + import functools + + +def to_arr(this): + """Returns Python array from Js array""" + return [this.get(str(e)) for e in xrange(len(this))] + + +ARR_STACK = set({}) + + +class TypedArrayPrototype: + def toString(): + # this function is wrong + func = this.get('join') + if not func.is_callable(): + + @this.Js + def func(): + return '[object %s]' % this.Class + + return func.call(this, ()) + + def toLocaleString(locales=None, options=None): + array = this.to_object() + arr_len = array.get("length").to_uint32() + # separator is simply a comma ',' + if not arr_len: + return '' + res = [] + for i in xrange(arr_len): + element = array[str(i)] + if element.is_undefined() or element.is_null(): + res.append('') + else: + cand = element.to_object() + str_func = element.get('toLocaleString') + if not str_func.is_callable(): + raise this.MakeError( + 'TypeError', + 'toLocaleString method of item at index %d is not callable' + % i) + res.append(element.callprop('toLocaleString').value) + return ','.join(res) + + def join(separator): + ARR_STACK.add(this) + array = this.to_object() + arr_len = array.get("length").to_uint32() + separator = ',' if separator.is_undefined() else separator.to_string( + ).value + elems = [] + for e in xrange(arr_len): + elem = array.get(str(e)) + if elem in ARR_STACK: + s = '' + else: + s = elem.to_string().value + elems.append( + s if not (elem.is_undefined() or elem.is_null()) else '') + res = separator.join(elems) + ARR_STACK.remove(this) + return res + + def reverse(): + array = this.to_object() # my own algorithm + vals = to_arr(array) + has_props = [array.has_property(str(e)) for e in xrange(len(array))] + vals.reverse() + has_props.reverse() + for i, val in enumerate(vals): + if has_props[i]: + array.put(str(i), val) + else: + array.delete(str(i)) + return array + + def slice(start, end): # todo check + array = this.to_object() + arr_len = array.get("length").to_uint32() + relative_start = start.to_int() + k = max((arr_len + relative_start), 0) if relative_start < 0 else min( + relative_start, arr_len) + relative_end = arr_len if end.is_undefined() else end.to_int() + final = max((arr_len + relative_end), 0) if relative_end < 0 else min( + relative_end, arr_len) + res = [] + n = 0 + while k < final: + pk = str(k) + if array.has_property(pk): + res.append(array.get(pk)) + k += 1 + n += 1 + return res + + def sort(cmpfn): + if not this.Class in ('Array', 'Arguments'): + return this.to_object() # do nothing + arr = [] + for i in xrange(len(this)): + arr.append(this.get(six.text_type(i))) + + if not arr: + return this + if not cmpfn.is_callable(): + cmpfn = None + cmp = lambda a, b: sort_compare(a, b, cmpfn) + if six.PY3: + key = functools.cmp_to_key(cmp) + arr.sort(key=key) + else: + arr.sort(cmp=cmp) + for i in xrange(len(arr)): + this.put(six.text_type(i), arr[i]) + + return this + + def indexOf(searchElement): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if arr_len == 0: + return -1 + if len(arguments) > 1: + n = arguments[1].to_int() + else: + n = 0 + if n >= arr_len: + return -1 + if n >= 0: + k = n + else: + k = arr_len - abs(n) + if k < 0: + k = 0 + while k < arr_len: + if array.has_property(str(k)): + elementK = array.get(str(k)) + if searchElement.strict_equality_comparison(elementK): + return k + k += 1 + return -1 + + def lastIndexOf(searchElement): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if arr_len == 0: + return -1 + if len(arguments) > 1: + n = arguments[1].to_int() + else: + n = arr_len - 1 + if n >= 0: + k = min(n, arr_len - 1) + else: + k = arr_len - abs(n) + while k >= 0: + if array.has_property(str(k)): + elementK = array.get(str(k)) + if searchElement.strict_equality_comparison(elementK): + return k + k -= 1 + return -1 + + def every(callbackfn): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + if not callbackfn.call( + T, (kValue, this.Js(k), array)).to_boolean().value: + return False + k += 1 + return True + + def some(callbackfn): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + if callbackfn.call( + T, (kValue, this.Js(k), array)).to_boolean().value: + return True + k += 1 + return False + + def forEach(callbackfn): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + callbackfn.call(T, (kValue, this.Js(k), array)) + k += 1 + + def map(callbackfn): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + A = this.Js([]) + k = 0 + while k < arr_len: + Pk = str(k) + if array.has_property(Pk): + kValue = array.get(Pk) + mappedValue = callbackfn.call(T, (kValue, this.Js(k), array)) + A.define_own_property( + Pk, { + 'value': mappedValue, + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + k += 1 + return A + + def filter(callbackfn): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + res = [] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + if callbackfn.call( + T, (kValue, this.Js(k), array)).to_boolean().value: + res.append(kValue) + k += 1 + return res # converted to js array automatically + + def reduce(callbackfn): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + if not arr_len and len(arguments) < 2: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + k = 0 + if len(arguments) > 1: # initial value present + accumulator = arguments[1] + else: + kPresent = False + while not kPresent and k < arr_len: + kPresent = array.has_property(str(k)) + if kPresent: + accumulator = array.get(str(k)) + k += 1 + if not kPresent: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + accumulator = callbackfn.call( + this.undefined, (accumulator, kValue, this.Js(k), array)) + k += 1 + return accumulator + + def reduceRight(callbackfn): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + if not arr_len and len(arguments) < 2: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + k = arr_len - 1 + if len(arguments) > 1: # initial value present + accumulator = arguments[1] + else: + kPresent = False + while not kPresent and k >= 0: + kPresent = array.has_property(str(k)) + if kPresent: + accumulator = array.get(str(k)) + k -= 1 + if not kPresent: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + while k >= 0: + if array.has_property(str(k)): + kValue = array.get(str(k)) + accumulator = callbackfn.call( + this.undefined, (accumulator, kValue, this.Js(k), array)) + k -= 1 + return accumulator + + +def sort_compare(a, b, comp): + if a is None: + if b is None: + return 0 + return 1 + if b is None: + if a is None: + return 0 + return -1 + if a.is_undefined(): + if b.is_undefined(): + return 0 + return 1 + if b.is_undefined(): + if a.is_undefined(): + return 0 + return -1 + if comp is not None: + res = comp.call(a.undefined, (a, b)) + return res.to_int() + x, y = a.to_string(), b.to_string() + if x < y: + return -1 + elif x > y: + return 1 + return 0 diff --git a/Contents/Libraries/Shared/js2py/py_node_modules/__init__.py b/Contents/Libraries/Shared/js2py/py_node_modules/__init__.py new file mode 100644 index 000000000..03b730262 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/py_node_modules/__init__.py @@ -0,0 +1 @@ +"""this package contains all the npm modules translated by js2py via node import""" \ No newline at end of file diff --git a/Contents/Libraries/Shared/js2py/pyjs.py b/Contents/Libraries/Shared/js2py/pyjs.py new file mode 100644 index 000000000..98e106a00 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/pyjs.py @@ -0,0 +1,100 @@ +from .base import * +from .constructors.jsmath import Math +from .constructors.jsdate import Date +from .constructors.jsobject import Object +from .constructors.jsfunction import Function +from .constructors.jsstring import String +from .constructors.jsnumber import Number +from .constructors.jsboolean import Boolean +from .constructors.jsregexp import RegExp +from .constructors.jsarray import Array +from .constructors.jsarraybuffer import ArrayBuffer +from .constructors.jsint8array import Int8Array +from .constructors.jsuint8array import Uint8Array +from .constructors.jsuint8clampedarray import Uint8ClampedArray +from .constructors.jsint16array import Int16Array +from .constructors.jsuint16array import Uint16Array +from .constructors.jsint32array import Int32Array +from .constructors.jsuint32array import Uint32Array +from .constructors.jsfloat32array import Float32Array +from .constructors.jsfloat64array import Float64Array +from .prototypes.jsjson import JSON +from .host.console import console +from .host.jseval import Eval +from .host.jsfunctions import parseFloat, parseInt, isFinite, \ + isNaN, escape, unescape, encodeURI, decodeURI, encodeURIComponent, decodeURIComponent + +# Now we have all the necessary items to create global environment for script +__all__ = [ + 'Js', 'PyJsComma', 'PyJsStrictEq', 'PyJsStrictNeq', 'PyJsException', + 'PyJsBshift', 'Scope', 'PyExceptionToJs', 'JsToPyException', 'JS_BUILTINS', + 'appengine', 'set_global_object', 'JsRegExp', 'PyJsException', + 'PyExceptionToJs', 'JsToPyException', 'PyJsSwitchException' +] + +# these were defined in base.py +builtins = ( + 'true', + 'false', + 'null', + 'undefined', + 'Infinity', + 'NaN', + 'console', + 'String', + 'Number', + 'Boolean', + 'RegExp', + 'Math', + 'Date', + 'Object', + 'Function', + 'Array', + 'Int8Array', + 'Uint8Array', + 'Uint8ClampedArray', + 'Int16Array', + 'Uint16Array', + 'Int32Array', + 'Uint32Array', + 'Float32Array', + 'Float64Array', + 'ArrayBuffer', + 'parseFloat', + 'parseInt', + 'isFinite', + 'isNaN', + 'escape', + 'unescape', + 'encodeURI', + 'decodeURI', + 'encodeURIComponent', + 'decodeURIComponent', +) + +#Array, Function, JSON, Error is done later :) +# also some built in functions like eval... + + +def set_global_object(obj): + obj.IS_CHILD_SCOPE = False + this = This({}) + this.own = obj.own + this.prototype = obj.prototype + PyJs.GlobalObject = this + # make this available + obj.register('this') + obj.put('this', this) + # also add window and set it to be a global object for compatibility + obj.register('window') + obj.put('window', this) + + +scope = dict(zip(builtins, [globals()[e] for e in builtins])) +# Now add errors: +for name, error in ERRORS.items(): + scope[name] = error +#add eval +scope['eval'] = Eval +scope['JSON'] = JSON +JS_BUILTINS = dict((k, v) for k, v in scope.items()) diff --git a/Contents/Libraries/Shared/js2py/test_internals.py b/Contents/Libraries/Shared/js2py/test_internals.py new file mode 100644 index 000000000..12cf4ad7a --- /dev/null +++ b/Contents/Libraries/Shared/js2py/test_internals.py @@ -0,0 +1,9 @@ +from internals import byte_trans +from internals import seval +import pyjsparser + +x = r''' +function g() {var h123 = 11; return [function g1() {return h123}, new Function('return h123')]} +g()[1]() +''' +print seval.eval_js_vm(x) diff --git a/Contents/Libraries/Shared/js2py/translators/__init__.py b/Contents/Libraries/Shared/js2py/translators/__init__.py new file mode 100644 index 000000000..7a1001fd1 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/translators/__init__.py @@ -0,0 +1,38 @@ +# The MIT License +# +# Copyright 2014, 2015 Piotr Dabkowski +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the 'Software'), +# to deal in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, subject +# to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies or +# substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +# LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +# OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +__all__ = [ + 'PyJsParser', 'Node', 'WrappingNode', 'node_to_dict', 'parse', + 'translate_js', 'translate', 'syntax_tree_translate', 'DEFAULT_HEADER' +] +__author__ = 'Piotr Dabkowski' +__version__ = '2.2.0' +from pyjsparser import PyJsParser +from .translator import translate_js, trasnlate, syntax_tree_translate, DEFAULT_HEADER + + +def parse(javascript_code): + """Returns syntax tree of javascript_code. + + Syntax tree has the same structure as syntax tree produced by esprima.js + + Same as PyJsParser().parse For your convenience :) """ + p = PyJsParser() + return p.parse(javascript_code) diff --git a/Contents/Libraries/Shared/js2py/translators/friendly_nodes.py b/Contents/Libraries/Shared/js2py/translators/friendly_nodes.py new file mode 100644 index 000000000..370f85d8a --- /dev/null +++ b/Contents/Libraries/Shared/js2py/translators/friendly_nodes.py @@ -0,0 +1,375 @@ +import binascii + +from pyjsparser import PyJsParser +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + +REGEXP_CONVERTER = PyJsParser() + + +def to_hex(s): + return binascii.hexlify(s.encode('utf8')).decode( + 'utf8') # fucking python 3, I hate it so much + + + # wtf was wrong with s.encode('hex') ??? +def indent(lines, ind=4): + return ind * ' ' + lines.replace('\n', '\n' + ind * ' ').rstrip(' ') + + +def inject_before_lval(source, lval, code): + if source.count(lval) > 1: + print() + print(lval) + raise RuntimeError('To many lvals (%s)' % lval) + elif not source.count(lval): + print() + print(lval) + assert lval not in source + raise RuntimeError('No lval found "%s"' % lval) + end = source.index(lval) + inj = source.rfind('\n', 0, end) + ind = inj + while source[ind + 1] == ' ': + ind += 1 + ind -= inj + return source[:inj + 1] + indent(code, ind) + source[inj + 1:] + + +def get_continue_label(label): + return CONTINUE_LABEL % to_hex(label) + + +def get_break_label(label): + return BREAK_LABEL % to_hex(label) + + +def is_valid_py_name(name): + try: + compile(name + ' = 11', 'a', 'exec') + except: + return False + return True + + +def indent(lines, ind=4): + return ind * ' ' + lines.replace('\n', '\n' + ind * ' ').rstrip(' ') + + +def compose_regex(val): + reg, flags = val + #reg = REGEXP_CONVERTER._unescape_string(reg) + return u'/%s/%s' % (reg, flags) + + +def float_repr(f): + if int(f) == f: + return repr(int(f)) + return repr(f) + + +def argsplit(args, sep=','): + """used to split JS args (it is not that simple as it seems because + sep can be inside brackets). + + pass args *without* brackets! + + Used also to parse array and object elements, and more""" + parsed_len = 0 + last = 0 + splits = [] + for e in bracket_split(args, brackets=['()', '[]', '{}']): + if e[0] not in ('(', '[', '{'): + for i, char in enumerate(e): + if char == sep: + splits.append(args[last:parsed_len + i]) + last = parsed_len + i + 1 + parsed_len += len(e) + splits.append(args[last:]) + return splits + + +def bracket_split(source, brackets=('()', '{}', '[]'), strip=False): + """DOES NOT RETURN EMPTY STRINGS (can only return empty bracket content if strip=True)""" + starts = [e[0] for e in brackets] + in_bracket = 0 + n = 0 + last = 0 + while n < len(source): + e = source[n] + if not in_bracket and e in starts: + in_bracket = 1 + start = n + b_start, b_end = brackets[starts.index(e)] + elif in_bracket: + if e == b_start: + in_bracket += 1 + elif e == b_end: + in_bracket -= 1 + if not in_bracket: + if source[last:start]: + yield source[last:start] + last = n + 1 + yield source[start + strip:n + 1 - strip] + n += 1 + if source[last:]: + yield source[last:] + + +def js_comma(a, b): + return 'PyJsComma(' + a + ',' + b + ')' + + +def js_or(a, b): + return '(' + a + ' or ' + b + ')' + + +def js_bor(a, b): + return '(' + a + '|' + b + ')' + + +def js_bxor(a, b): + return '(' + a + '^' + b + ')' + + +def js_band(a, b): + return '(' + a + '&' + b + ')' + + +def js_and(a, b): + return '(' + a + ' and ' + b + ')' + + +def js_strict_eq(a, b): + return 'PyJsStrictEq(' + a + ',' + b + ')' + + +def js_strict_neq(a, b): + return 'PyJsStrictNeq(' + a + ',' + b + ')' + + +#Not handled by python in the same way like JS. For example 2==2==True returns false. +# In JS above would return true so we need brackets. +def js_abstract_eq(a, b): + return '(' + a + '==' + b + ')' + + +#just like == +def js_abstract_neq(a, b): + return '(' + a + '!=' + b + ')' + + +def js_lt(a, b): + return '(' + a + '<' + b + ')' + + +def js_le(a, b): + return '(' + a + '<=' + b + ')' + + +def js_ge(a, b): + return '(' + a + '>=' + b + ')' + + +def js_gt(a, b): + return '(' + a + '>' + b + ')' + + +def js_in(a, b): + return b + '.contains(' + a + ')' + + +def js_instanceof(a, b): + return a + '.instanceof(' + b + ')' + + +def js_lshift(a, b): + return '(' + a + '<<' + b + ')' + + +def js_rshift(a, b): + return '(' + a + '>>' + b + ')' + + +def js_shit(a, b): + return 'PyJsBshift(' + a + ',' + b + ')' + + +def js_add( + a, + b): # To simplify later process of converting unary operators + and ++ + return '(%s+%s)' % (a, b) + + +def js_sub(a, b): # To simplify + return '(%s-%s)' % (a, b) + + +def js_mul(a, b): + return '(' + a + '*' + b + ')' + + +def js_div(a, b): + return '(' + a + '/' + b + ')' + + +def js_mod(a, b): + return '(' + a + '%' + b + ')' + + +def js_typeof(a): + cand = list(bracket_split(a, ('()', ))) + if len(cand) == 2 and cand[0] == 'var.get': + return cand[0] + cand[1][:-1] + ',throw=False).typeof()' + return a + '.typeof()' + + +def js_void(a): + # eval and return undefined + return 'PyJsComma(%s, Js(None))' % a + + +def js_new(a): + cands = list(bracket_split(a, ('()', ))) + lim = len(cands) + if lim < 2: + return a + '.create()' + n = 0 + while n < lim: + c = cands[n] + if c[0] == '(': + if cands[n - 1].endswith( + '.get') and n + 1 >= lim: # last get operation. + return a + '.create()' + elif cands[n - 1][0] == '(': + return ''.join(cands[:n]) + '.create' + c + ''.join( + cands[n + 1:]) + elif cands[n - 1] == '.callprop': + beg = ''.join(cands[:n - 1]) + args = argsplit(c[1:-1], ',') + prop = args[0] + new_args = ','.join(args[1:]) + create = '.get(%s).create(%s)' % (prop, new_args) + return beg + create + ''.join(cands[n + 1:]) + n += 1 + return a + '.create()' + + +def js_delete(a): + #replace last get with delete. + c = list(bracket_split(a, ['()'])) + beg, arglist = ''.join(c[:-1]).strip(), c[-1].strip( + ) #strips just to make sure... I will remove it later + if beg[-4:] != '.get': + print(a) + raise SyntaxError('Invalid delete operation') + return beg[:-3] + 'delete' + arglist + + +def js_neg(a): + return '(-' + a + ')' + + +def js_pos(a): + return '(+' + a + ')' + + +def js_inv(a): + return '(~' + a + ')' + + +def js_not(a): + return a + '.neg()' + + +def js_postfix(a, inc, post): + bra = list(bracket_split(a, ('()', ))) + meth = bra[-2] + if not meth.endswith('get'): + raise SyntaxError('Invalid ++ or -- operation.') + bra[-2] = bra[-2][:-3] + 'put' + bra[-1] = '(%s,Js(%s.to_number())%sJs(1))' % (bra[-1][1:-1], a, + '+' if inc else '-') + res = ''.join(bra) + return res if not post else '(%s%sJs(1))' % (res, '-' if inc else '+') + + +def js_pre_inc(a): + return js_postfix(a, True, False) + + +def js_post_inc(a): + return js_postfix(a, True, True) + + +def js_pre_dec(a): + return js_postfix(a, False, False) + + +def js_post_dec(a): + return js_postfix(a, False, True) + + +CONTINUE_LABEL = 'JS_CONTINUE_LABEL_%s' +BREAK_LABEL = 'JS_BREAK_LABEL_%s' +PREPARE = '''HOLDER = var.own.get(NAME)\nvar.force_own_put(NAME, PyExceptionToJs(PyJsTempException))\n''' +RESTORE = '''if HOLDER is not None:\n var.own[NAME] = HOLDER\nelse:\n del var.own[NAME]\ndel HOLDER\n''' +TRY_CATCH = '''%stry:\nBLOCKfinally:\n%s''' % (PREPARE, indent(RESTORE)) + +OR = {'||': js_or} +AND = {'&&': js_and} +BOR = {'|': js_bor} +BXOR = {'^': js_bxor} +BAND = {'&': js_band} + +EQS = { + '===': js_strict_eq, + '!==': js_strict_neq, + '==': js_abstract_eq, # we need == and != too. Read a note above method + '!=': js_abstract_neq +} + +#Since JS does not have chained comparisons we need to implement all cmp methods. +COMPS = { + '<': js_lt, + '<=': js_le, + '>=': js_ge, + '>': js_gt, + 'instanceof': js_instanceof, #todo change to validitate + 'in': js_in +} + +BSHIFTS = {'<<': js_lshift, '>>': js_rshift, '>>>': js_shit} + +ADDS = {'+': js_add, '-': js_sub} + +MULTS = {'*': js_mul, '/': js_div, '%': js_mod} +BINARY = {} +BINARY.update(ADDS) +BINARY.update(MULTS) +BINARY.update(BSHIFTS) +BINARY.update(COMPS) +BINARY.update(EQS) +BINARY.update(BAND) +BINARY.update(BXOR) +BINARY.update(BOR) +BINARY.update(AND) +BINARY.update(OR) +#Note they dont contain ++ and -- methods because they both have 2 different methods +# correct method will be found automatically in translate function +UNARY = { + 'typeof': js_typeof, + 'void': js_void, + 'new': js_new, + 'delete': js_delete, + '!': js_not, + '-': js_neg, + '+': js_pos, + '~': js_inv, + '++': None, + '--': None +} diff --git a/Contents/Libraries/Shared/js2py/translators/jsregexps.py b/Contents/Libraries/Shared/js2py/translators/jsregexps.py new file mode 100644 index 000000000..235d67c78 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/translators/jsregexps.py @@ -0,0 +1,211 @@ +from pyjsparser.pyjsparserdata import * + +REGEXP_SPECIAL_SINGLE = {'\\', '^', '$', '*', '+', '?', '.'} + +NOT_PATTERN_CHARS = { + '^', '$', '\\', '.', '*', '+', '?', '(', ')', '[', ']', '|' +} # what about '{', '}', ??? + +CHAR_CLASS_ESCAPE = {'d', 'D', 's', 'S', 'w', 'W'} +CONTROL_ESCAPE_CHARS = {'f', 'n', 'r', 't', 'v'} +CONTROL_LETTERS = { + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', + 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', + 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' +} + + +def SpecialChar(char): + return {'type': 'SpecialChar', 'content': char} + + +def isPatternCharacter(char): + return char not in NOT_PATTERN_CHARS + + +class JsRegExpParser: + def __init__(self, source, flags): + self.source = source + self.flags = flags + self.index = 0 + self.length = len(source) + self.lineNumber = 0 + self.lineStart = 0 + + def parsePattern(self): + '''Perform sctring escape - for regexp literals''' + return {'type': 'Pattern', 'contents': self.parseDisjunction()} + + def parseDisjunction(self): + alternatives = [] + while True: + alternatives.append(self.parseAlternative()) + if not self.isEOF(): + self.expect_character('|') + else: + break + return {'type': 'Disjunction', 'contents': alternatives} + + def isEOF(self): + if self.index >= self.length: + return True + return False + + def expect_character(self, character): + if self.source[self.index] != character: + self.throwUnexpected(character) + self.index += 1 + + def parseAlternative(self): + contents = [] + while not self.isEOF() and self.source[self.index] != '|': + contents.append(self.parseTerm()) + return {'type': 'Alternative', 'contents': contents} + + def follows(self, chars): + for i, c in enumerate(chars): + if self.index + i >= self.length or self.source[self.index + + i] != c: + return False + return True + + def parseTerm(self): + assertion = self.parseAssertion() + if assertion: + return assertion + else: + return { + 'type': 'Term', + 'contents': self.parseAtom() + } # quantifier will go inside atom! + + def parseAssertion(self): + if self.follows('$'): + content = SpecialChar('$') + self.index += 1 + elif self.follows('^'): + content = SpecialChar('^') + self.index += 1 + elif self.follows('\\b'): + content = SpecialChar('\\b') + self.index += 2 + elif self.follows('\\B'): + content = SpecialChar('\\B') + self.index += 2 + elif self.follows('(?='): + self.index += 3 + dis = self.parseDisjunction() + self.expect_character(')') + content = {'type': 'Lookached', 'contents': dis, 'negated': False} + elif self.follows('(?!'): + self.index += 3 + dis = self.parseDisjunction() + self.expect_character(')') + content = {'type': 'Lookached', 'contents': dis, 'negated': True} + else: + return None + return {'type': 'Assertion', 'content': content} + + def parseAtom(self): + if self.follows('.'): + content = SpecialChar('.') + self.index += 1 + elif self.follows('\\'): + self.index += 1 + content = self.parseAtomEscape() + elif self.follows('['): + content = self.parseCharacterClass() + elif self.follows('(?:'): + self.index += 3 + dis = self.parseDisjunction() + self.expect_character(')') + content = 'idk' + elif self.follows('('): + self.index += 1 + dis = self.parseDisjunction() + self.expect_character(')') + content = 'idk' + elif isPatternCharacter(self.source[self.index]): + content = self.source[self.index] + self.index += 1 + else: + return None + quantifier = self.parseQuantifier() + return {'type': 'Atom', 'content': content, 'quantifier': quantifier} + + def parseQuantifier(self): + prefix = self.parseQuantifierPrefix() + if not prefix: + return None + greedy = True + if self.follows('?'): + self.index += 1 + greedy = False + return {'type': 'Quantifier', 'contents': prefix, 'greedy': greedy} + + def parseQuantifierPrefix(self): + if self.isEOF(): + return None + if self.follows('+'): + content = '+' + self.index += 1 + elif self.follows('?'): + content = '?' + self.index += 1 + elif self.follows('*'): + content = '*' + self.index += 1 + elif self.follows( + '{' + ): # try matching otherwise return None and restore the state + i = self.index + self.index += 1 + digs1 = self.scanDecimalDigs() + # if no minimal number of digs provided then return no quantifier + if not digs1: + self.index = i + return None + # scan char limit if provided + if self.follows(','): + self.index += 1 + digs2 = self.scanDecimalDigs() + else: + digs2 = '' + # must be valid! + if not self.follows('}'): + self.index = i + return None + else: + self.expect_character('}') + content = int(digs1), int(digs2) if digs2 else None + else: + return None + return content + + def parseAtomEscape(self): + ch = self.source[self.index] + if isDecimalDigit(ch) and ch != 0: + digs = self.scanDecimalDigs() + elif ch in CHAR_CLASS_ESCAPE: + self.index += 1 + return SpecialChar('\\' + ch) + else: + return self.parseCharacterEscape() + + def parseCharacterEscape(self): + ch = self.source[self.index] + if ch in CONTROL_ESCAPE_CHARS: + return SpecialChar('\\' + ch) + if ch == 'c': + 'ok, fuck this shit.' + + def scanDecimalDigs(self): + s = self.index + while not self.isEOF() and isDecimalDigit(self.source[self.index]): + self.index += 1 + return self.source[s:self.index] + + +a = JsRegExpParser('a(?=x)', '') +print(a.parsePattern()) diff --git a/Contents/Libraries/Shared/js2py/translators/translating_nodes.py b/Contents/Libraries/Shared/js2py/translators/translating_nodes.py new file mode 100644 index 000000000..286714f91 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/translators/translating_nodes.py @@ -0,0 +1,688 @@ +from __future__ import unicode_literals +from pyjsparser.pyjsparserdata import * +from .friendly_nodes import * +import random +import six + +if six.PY3: + from functools import reduce + xrange = range + unicode = str +# number of characters above which expression will be split to multiple lines in order to avoid python parser stack overflow +# still experimental so I suggest to set it to 400 in order to avoid common errors +# set it to smaller value only if you have problems with parser stack overflow +LINE_LEN_LIMIT = 400 # 200 # or any other value - the larger the smaller probability of errors :) + + +class ForController: + def __init__(self): + self.inside = [False] + self.update = '' + + def enter_for(self, update): + self.inside.append(True) + self.update = update + + def leave_for(self): + self.inside.pop() + + def enter_other(self): + self.inside.append(False) + + def leave_other(self): + self.inside.pop() + + def is_inside(self): + return self.inside[-1] + + +class InlineStack: + NAME = 'PyJs_%s_%d_' + + def __init__(self): + self.reps = {} + self.names = [] + + def inject_inlines(self, source): + for lval in self.names: # first in first out! Its important by the way + source = inject_before_lval(source, lval, self.reps[lval]) + return source + + def require(self, typ): + name = self.NAME % (typ, len(self.names)) + self.names.append(name) + return name + + def define(self, name, val): + self.reps[name] = val + + def reset(self): + self.rel = {} + self.names = [] + + +class ContextStack: + def __init__(self): + self.to_register = set([]) + self.to_define = {} + + def reset(self): + self.to_register = set([]) + self.to_define = {} + + def register(self, var): + self.to_register.add(var) + + def define(self, name, code): + self.to_define[name] = code + self.register(name) + + def get_code(self): + code = 'var.registers([%s])\n' % ', '.join( + repr(e) for e in self.to_register) + for name, func_code in six.iteritems(self.to_define): + code += func_code + return code + + +def clean_stacks(): + global Context, inline_stack + Context = ContextStack() + inline_stack = InlineStack() + + +def to_key(literal_or_identifier): + ''' returns string representation of this object''' + if literal_or_identifier['type'] == 'Identifier': + return literal_or_identifier['name'] + elif literal_or_identifier['type'] == 'Literal': + k = literal_or_identifier['value'] + if isinstance(k, float): + return unicode(float_repr(k)) + elif 'regex' in literal_or_identifier: + return compose_regex(k) + elif isinstance(k, bool): + return 'true' if k else 'false' + elif k is None: + return 'null' + else: + return unicode(k) + + +def trans(ele, standard=False): + """Translates esprima syntax tree to python by delegating to appropriate translating node""" + try: + node = globals().get(ele['type']) + if not node: + raise NotImplementedError('%s is not supported!' % ele['type']) + if standard: + node = node.__dict__[ + 'standard'] if 'standard' in node.__dict__ else node + return node(**ele) + except: + #print ele + raise + + +def limited(func): + '''Decorator limiting resulting line length in order to avoid python parser stack overflow - + If expression longer than LINE_LEN_LIMIT characters then it will be moved to upper line + USE ONLY ON EXPRESSIONS!!! ''' + + def f(standard=False, **args): + insert_pos = len( + inline_stack.names + ) # in case line is longer than limit we will have to insert the lval at current position + # this is because calling func will change inline_stack. + # we cant use inline_stack.require here because we dont know whether line overflows yet + res = func(**args) + if len(res) > LINE_LEN_LIMIT: + name = inline_stack.require('LONG') + inline_stack.names.pop() + inline_stack.names.insert(insert_pos, name) + res = 'def %s(var=var):\n return %s\n' % (name, res) + inline_stack.define(name, res) + return name + '()' + else: + return res + + f.__dict__['standard'] = func + return f + + +# ==== IDENTIFIERS AND LITERALS ======= + +inf = float('inf') + + +def Literal(type, value, raw, regex=None): + if regex: # regex + return 'JsRegExp(%s)' % repr(compose_regex(value)) + elif value is None: # null + return 'var.get(u"null")' + # Todo template + # String, Bool, Float + return 'Js(%s)' % repr(value) if value != inf else 'Js(float("inf"))' + + +def Identifier(type, name): + return 'var.get(%s)' % repr(name) + + +@limited +def MemberExpression(type, computed, object, property): + far_left = trans(object) + if computed: # obj[prop] type accessor + # may be literal which is the same in every case so we can save some time on conversion + if property['type'] == 'Literal': + prop = repr(to_key(property)) + else: # worst case + prop = trans(property) + else: # always the same since not computed (obj.prop accessor) + prop = repr(to_key(property)) + return far_left + '.get(%s)' % prop + + +def ThisExpression(type): + return 'var.get(u"this")' + + +@limited +def CallExpression(type, callee, arguments): + arguments = [trans(e) for e in arguments] + if callee['type'] == 'MemberExpression': + far_left = trans(callee['object']) + if callee['computed']: # obj[prop] type accessor + # may be literal which is the same in every case so we can save some time on conversion + if callee['property']['type'] == 'Literal': + prop = repr(to_key(callee['property'])) + else: # worst case + prop = trans( + callee['property']) # its not a string literal! so no repr + else: # always the same since not computed (obj.prop accessor) + prop = repr(to_key(callee['property'])) + arguments.insert(0, prop) + return far_left + '.callprop(%s)' % ', '.join(arguments) + else: # standard call + return trans(callee) + '(%s)' % ', '.join(arguments) + + +# ========== ARRAYS ============ + + +def ArrayExpression(type, elements): # todo fix null inside problem + return 'Js([%s])' % ', '.join(trans(e) if e else 'None' for e in elements) + + +# ========== OBJECTS ============= + + +def ObjectExpression(type, properties): + name = inline_stack.require('Object') + elems = [] + after = '' + for p in properties: + if p['kind'] == 'init': + elems.append('%s:%s' % Property(**p)) + elif p['kind'] == 'set': + k, setter = Property( + **p + ) # setter is just a lval referring to that function, it will be defined in InlineStack automatically + after += '%s.define_own_property(%s, {"set":%s, "configurable":True, "enumerable":True})\n' % ( + name, k, setter) + elif p['kind'] == 'get': + k, getter = Property(**p) + after += '%s.define_own_property(%s, {"get":%s, "configurable":True, "enumerable":True})\n' % ( + name, k, getter) + else: + raise RuntimeError('Unexpected object propery kind') + obj = '%s = Js({%s})\n' % (name, ','.join(elems)) + inline_stack.define(name, obj + after) + return name + + +def Property(type, kind, key, computed, value, method, shorthand): + if shorthand or computed: + raise NotImplementedError( + 'Shorthand and Computed properties not implemented!') + k = to_key(key) + if k is None: + raise SyntaxError('Invalid key in dictionary! Or bug in Js2Py') + v = trans(value) + return repr(k), v + + +# ========== EXPRESSIONS ============ + + +@limited +def UnaryExpression(type, operator, argument, prefix): + a = trans( + argument, standard=True + ) # unary involve some complex operations so we cant use line shorteners here + if operator == 'delete': + if argument['type'] in ('Identifier', 'MemberExpression'): + # means that operation is valid + return js_delete(a) + return 'PyJsComma(%s, Js(True))' % a # otherwise not valid, just perform expression and return true. + elif operator == 'typeof': + return js_typeof(a) + return UNARY[operator](a) + + +@limited +def BinaryExpression(type, operator, left, right): + a = trans(left) + b = trans(right) + # delegate to our friends + return BINARY[operator](a, b) + + +@limited +def UpdateExpression(type, operator, argument, prefix): + a = trans( + argument, standard=True + ) # also complex operation involving parsing of the result so no line length reducing here + return js_postfix(a, operator == '++', not prefix) + + +@limited +def AssignmentExpression(type, operator, left, right): + operator = operator[:-1] + if left['type'] == 'Identifier': + if operator: + return 'var.put(%s, %s, %s)' % (repr(to_key(left)), trans(right), + repr(operator)) + else: + return 'var.put(%s, %s)' % (repr(to_key(left)), trans(right)) + elif left['type'] == 'MemberExpression': + far_left = trans(left['object']) + if left['computed']: # obj[prop] type accessor + # may be literal which is the same in every case so we can save some time on conversion + if left['property']['type'] == 'Literal': + prop = repr(to_key(left['property'])) + else: # worst case + prop = trans( + left['property']) # its not a string literal! so no repr + else: # always the same since not computed (obj.prop accessor) + prop = repr(to_key(left['property'])) + if operator: + return far_left + '.put(%s, %s, %s)' % (prop, trans(right), + repr(operator)) + else: + return far_left + '.put(%s, %s)' % (prop, trans(right)) + else: + raise SyntaxError('Invalid left hand side in assignment!') + + +six + + +@limited +def SequenceExpression(type, expressions): + return reduce(js_comma, (trans(e) for e in expressions)) + + +@limited +def NewExpression(type, callee, arguments): + return trans(callee) + '.create(%s)' % ', '.join( + trans(e) for e in arguments) + + +@limited +def ConditionalExpression( + type, test, consequent, + alternate): # caused plenty of problems in my home-made translator :) + return '(%s if %s else %s)' % (trans(consequent), trans(test), + trans(alternate)) + + +# =========== STATEMENTS ============= + + +def BlockStatement(type, body): + return StatementList( + body) # never returns empty string! In the worst case returns pass\n + + +def ExpressionStatement(type, expression, **ommit): + return trans(expression) + '\n' # end expression space with new line + + +def BreakStatement(type, label): + if label: + return 'raise %s("Breaked")\n' % (get_break_label(label['name'])) + else: + return 'break\n' + + +def ContinueStatement(type, label): + if label: + return 'raise %s("Continued")\n' % (get_continue_label(label['name'])) + else: + return 'continue\n' + + +def ReturnStatement(type, argument): + return 'return %s\n' % (trans(argument) + if argument else "var.get('undefined')") + + +def EmptyStatement(type): + return 'pass\n' + + +def DebuggerStatement(type): + return 'pass\n' + + +def DoWhileStatement(type, body, test): + inside = trans(body) + 'if not %s:\n' % trans(test) + indent('break\n') + result = 'while 1:\n' + indent(inside) + return result + + +def ForStatement(type, init, test, update, body): + update = indent(trans(update)) if update else '' + init = trans(init) if init else '' + if not init.endswith('\n'): + init += '\n' + test = trans(test) if test else '1' + if not update: + result = '#for JS loop\n%swhile %s:\n%s%s\n' % ( + init, test, indent(trans(body)), update) + else: + result = '#for JS loop\n%swhile %s:\n' % (init, test) + body = 'try:\n%sfinally:\n %s\n' % (indent(trans(body)), update) + result += indent(body) + return result + + +def ForInStatement(type, left, right, body, each): + res = 'for PyJsTemp in %s:\n' % trans(right) + if left['type'] == "VariableDeclaration": + addon = trans(left) # make sure variable is registered + if addon != 'pass\n': + res = addon + res # we have to execute this expression :( + # now extract the name + try: + name = left['declarations'][0]['id']['name'] + except: + raise RuntimeError('Unusual ForIn loop') + elif left['type'] == 'Identifier': + name = left['name'] + else: + raise RuntimeError('Unusual ForIn loop') + res += indent('var.put(%s, PyJsTemp)\n' % repr(name) + trans(body)) + return res + + +def IfStatement(type, test, consequent, alternate): + # NOTE we cannot do elif because function definition inside elif statement would not be possible! + IF = 'if %s:\n' % trans(test) + IF += indent(trans(consequent)) + if not alternate: + return IF + ELSE = 'else:\n' + indent(trans(alternate)) + return IF + ELSE + + +def LabeledStatement(type, label, body): + # todo consider using smarter approach! + inside = trans(body) + defs = '' + if inside.startswith('while ') or inside.startswith( + 'for ') or inside.startswith('#for'): + # we have to add contine label as well... + # 3 or 1 since #for loop type has more lines before real for. + sep = 1 if not inside.startswith('#for') else 3 + cont_label = get_continue_label(label['name']) + temp = inside.split('\n') + injected = 'try:\n' + '\n'.join(temp[sep:]) + injected += 'except %s:\n pass\n' % cont_label + inside = '\n'.join(temp[:sep]) + '\n' + indent(injected) + defs += 'class %s(Exception): pass\n' % cont_label + break_label = get_break_label(label['name']) + inside = 'try:\n%sexcept %s:\n pass\n' % (indent(inside), break_label) + defs += 'class %s(Exception): pass\n' % break_label + return defs + inside + + +def StatementList(lis): + if lis: # ensure we don't return empty string because it may ruin indentation! + code = ''.join(trans(e) for e in lis) + return code if code else 'pass\n' + else: + return 'pass\n' + + +def PyimportStatement(type, imp): + lib = imp['name'] + jlib = 'PyImport_%s' % lib + code = 'import %s as %s\n' % (lib, jlib) + #check whether valid lib name... + try: + compile(code, '', 'exec') + except: + raise SyntaxError( + 'Invalid Python module name (%s) in pyimport statement' % lib) + # var.pyimport will handle module conversion to PyJs object + code += 'var.pyimport(%s, %s)\n' % (repr(lib), jlib) + return code + + +def SwitchStatement(type, discriminant, cases): + #TODO there will be a problem with continue in a switch statement.... FIX IT + code = 'while 1:\n' + indent('SWITCHED = False\nCONDITION = (%s)\n') + code = code % trans(discriminant) + for case in cases: + case_code = None + if case['test']: # case (x): + case_code = 'if SWITCHED or PyJsStrictEq(CONDITION, %s):\n' % ( + trans(case['test'])) + else: # default: + case_code = 'if True:\n' + case_code += indent('SWITCHED = True\n') + case_code += indent(StatementList(case['consequent'])) + # one more indent for whole + code += indent(case_code) + # prevent infinite loop and sort out nested switch... + code += indent('SWITCHED = True\nbreak\n') + return code + + +def ThrowStatement(type, argument): + return 'PyJsTempException = JsToPyException(%s)\nraise PyJsTempException\n' % trans( + argument) + + +def TryStatement(type, block, handler, handlers, guardedHandlers, finalizer): + result = 'try:\n%s' % indent(trans(block)) + # complicated catch statement... + if handler: + identifier = handler['param']['name'] + holder = 'PyJsHolder_%s_%d' % (to_hex(identifier), + random.randrange(1e8)) + identifier = repr(identifier) + result += 'except PyJsException as PyJsTempException:\n' + # fill in except ( catch ) block and remember to recover holder variable to its previous state + result += indent( + TRY_CATCH.replace('HOLDER', + holder).replace('NAME', identifier).replace( + 'BLOCK', indent(trans(handler['body'])))) + # translate finally statement if present + if finalizer: + result += 'finally:\n%s' % indent(trans(finalizer)) + return result + + +def LexicalDeclaration(type, declarations, kind): + raise NotImplementedError( + 'let and const not implemented yet but they will be soon! Check github for updates.' + ) + + +def VariableDeclarator(type, id, init): + name = id['name'] + # register the name if not already registered + Context.register(name) + if init: + return 'var.put(%s, %s)\n' % (repr(name), trans(init)) + return '' + + +def VariableDeclaration(type, declarations, kind): + code = ''.join(trans(d) for d in declarations) + return code if code else 'pass\n' + + +def WhileStatement(type, test, body): + result = 'while %s:\n' % trans(test) + indent(trans(body)) + return result + + +def WithStatement(type, object, body): + raise NotImplementedError('With statement not implemented!') + + +def Program(type, body): + inline_stack.reset() + code = ''.join(trans(e) for e in body) + # here add hoisted elements (register variables and define functions) + code = Context.get_code() + code + # replace all inline variables + code = inline_stack.inject_inlines(code) + return code + + +# ======== FUNCTIONS ============ + + +def FunctionDeclaration(type, id, params, defaults, body, generator, + expression): + if generator: + raise NotImplementedError('Generators not supported') + if defaults: + raise NotImplementedError('Defaults not supported') + if not id: + return FunctionExpression(type, id, params, defaults, body, generator, + expression) + '\n' + JsName = id['name'] + PyName = 'PyJsHoisted_%s_' % JsName + PyName = PyName if is_valid_py_name(PyName) else 'PyJsHoistedNonPyName' + # this is quite complicated + global Context + previous_context = Context + # change context to the context of this function + Context = ContextStack() + # translate body within current context + code = trans(body) + # get arg names + vars = [v['name'] for v in params] + # args are automaticaly registered variables + Context.to_register.update(vars) + # add all hoisted elements inside function + code = Context.get_code() + code + # check whether args are valid python names: + used_vars = [] + for v in vars: + if is_valid_py_name(v): + used_vars.append(v) + else: # invalid arg in python, for example $, replace with alternatice arg + used_vars.append('PyJsArg_%s_' % to_hex(v)) + header = '@Js\n' + header += 'def %s(%sthis, arguments, var=var):\n' % ( + PyName, ', '.join(used_vars) + (', ' if vars else '')) + # transfer names from Py scope to Js scope + arg_map = dict(zip(vars, used_vars)) + arg_map.update({'this': 'this', 'arguments': 'arguments'}) + arg_conv = 'var = Scope({%s}, var)\n' % ', '.join( + repr(k) + ':' + v for k, v in six.iteritems(arg_map)) + # and finally set the name of the function to its real name: + footer = '%s.func_name = %s\n' % (PyName, repr(JsName)) + footer += 'var.put(%s, %s)\n' % (repr(JsName), PyName) + whole_code = header + indent(arg_conv + code) + footer + # restore context + Context = previous_context + # define in upper context + Context.define(JsName, whole_code) + return 'pass\n' + + +def FunctionExpression(type, id, params, defaults, body, generator, + expression): + if generator: + raise NotImplementedError('Generators not supported') + if defaults: + raise NotImplementedError('Defaults not supported') + JsName = id['name'] if id else 'anonymous' + if not is_valid_py_name(JsName): + ScriptName = 'InlineNonPyName' + else: + ScriptName = JsName + PyName = inline_stack.require(ScriptName) # this is unique + + # again quite complicated + global Context + previous_context = Context + # change context to the context of this function + Context = ContextStack() + # translate body within current context + code = trans(body) + # get arg names + vars = [v['name'] for v in params] + # args are automaticaly registered variables + Context.to_register.update(vars) + # add all hoisted elements inside function + code = Context.get_code() + code + # check whether args are valid python names: + used_vars = [] + for v in vars: + if is_valid_py_name(v): + used_vars.append(v) + else: # invalid arg in python, for example $, replace with alternatice arg + used_vars.append('PyJsArg_%s_' % to_hex(v)) + header = '@Js\n' + header += 'def %s(%sthis, arguments, var=var):\n' % ( + PyName, ', '.join(used_vars) + (', ' if vars else '')) + # transfer names from Py scope to Js scope + arg_map = dict(zip(vars, used_vars)) + arg_map.update({'this': 'this', 'arguments': 'arguments'}) + if id: # make self available from inside... + if id['name'] not in arg_map: + arg_map[id['name']] = PyName + arg_conv = 'var = Scope({%s}, var)\n' % ', '.join( + repr(k) + ':' + v for k, v in six.iteritems(arg_map)) + # and finally set the name of the function to its real name: + footer = '%s._set_name(%s)\n' % (PyName, repr(JsName)) + whole_code = header + indent(arg_conv + code) + footer + # restore context + Context = previous_context + # define in upper context + inline_stack.define(PyName, whole_code) + return PyName + + +LogicalExpression = BinaryExpression +PostfixExpression = UpdateExpression + +clean_stacks() + +if __name__ == '__main__': + import codecs + import time + import pyjsparser + + c = None #'''`ijfdij`''' + if not c: + with codecs.open("esp.js", "r", "utf-8") as f: + c = f.read() + + print('Started') + t = time.time() + res = trans(pyjsparser.PyJsParser().parse(c)) + dt = time.time() - t + 0.000000001 + print('Translated everyting in', round(dt, 5), 'seconds.') + print('Thats %d characters per second' % int(len(c) / dt)) + with open('res.py', 'w') as f: + f.write(res) diff --git a/Contents/Libraries/Shared/js2py/translators/translator.py b/Contents/Libraries/Shared/js2py/translators/translator.py new file mode 100644 index 000000000..16ed5bdb6 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/translators/translator.py @@ -0,0 +1,189 @@ +import pyjsparser +import pyjsparser.parser +from . import translating_nodes + +import hashlib +import re + +# Enable Js2Py exceptions and pyimport in parser +pyjsparser.parser.ENABLE_PYIMPORT = True + +# the re below is how we'll recognise numeric constants. +# it finds any 'simple numeric that is not preceded with an alphanumeric character +# the numeric can be a float (so a dot is found) but +# it does not recognise notation such as 123e5, 0xFF, infinity or NaN +CP_NUMERIC_RE = re.compile(r'(?<![a-zA-Z0-9_"\'])([0-9\.]+)') +CP_NUMERIC_PLACEHOLDER = '__PyJsNUM_%i_PyJsNUM__' +CP_NUMERIC_PLACEHOLDER_REVERSE_RE = re.compile( + CP_NUMERIC_PLACEHOLDER.replace('%i', r'([0-9\.]+)')) + +# the re below is how we'll recognise string constants +# it finds a ' or ", then reads until the next matching ' or " +# this re only services simple cases, it can not be used when +# there are escaped quotes in the expression + +#CP_STRING_1 = re.compile(r'(["\'])(.*?)\1') # this is how we'll recognise string constants + +CP_STRING = '"([^\\\\"]+|\\\\([bfnrtv\'"\\\\]|[0-3]?[0-7]{1,2}|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}))*"|\'([^\\\\\']+|\\\\([bfnrtv\'"\\\\]|[0-3]?[0-7]{1,2}|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}))*\'' +CP_STRING_RE = re.compile( + CP_STRING) # this is how we'll recognise string constants +CP_STRING_PLACEHOLDER = '__PyJsSTR_%i_PyJsSTR__' +CP_STRING_PLACEHOLDER_REVERSE_RE = re.compile( + CP_STRING_PLACEHOLDER.replace('%i', r'([0-9\.]+)')) + +cache = {} + +# This crap is still needed but I removed it for speed reasons. Have to think ofa better idea +# import js2py.pyjs, sys +# # Redefine builtin objects... Do you have a better idea? +# for m in list(sys.modules): +# if m.startswith('js2py'): +# del sys.modules[m] +# del js2py.pyjs +# del js2py + +DEFAULT_HEADER = u'''from js2py.pyjs import * +# setting scope +var = Scope( JS_BUILTINS ) +set_global_object(var) + +# Code follows: +''' + + +def dbg(x): + """does nothing, legacy dummy function""" + return '' + + +def translate_js(js, HEADER=DEFAULT_HEADER, use_compilation_plan=False): + """js has to be a javascript source code. + returns equivalent python code.""" + if use_compilation_plan and not '//' in js and not '/*' in js: + return translate_js_with_compilation_plan(js, HEADER=HEADER) + parser = pyjsparser.PyJsParser() + parsed = parser.parse(js) # js to esprima syntax tree + # Another way of doing that would be with my auto esprima translation but its much slower and causes import problems: + # parsed = esprima.parse(js).to_dict() + translating_nodes.clean_stacks() + return HEADER + translating_nodes.trans( + parsed) # syntax tree to python code + + +class match_unumerator(object): + """This class ise used """ + matchcount = -1 + + def __init__(self, placeholder_mask): + self.placeholder_mask = placeholder_mask + self.matches = [] + + def __call__(self, match): + self.matchcount += 1 + self.matches.append(match.group(0)) + return self.placeholder_mask % self.matchcount + + def __repr__(self): + return '\n'.join(self.placeholder_mask % counter + '=' + match + for counter, match in enumerate(self.matches)) + + def wrap_up(self, output): + for counter, value in enumerate(self.matches): + output = output.replace( + "u'" + self.placeholder_mask % (counter) + "'", value, 1) + return output + + +def get_compilation_plan(js): + match_increaser_str = match_unumerator(CP_STRING_PLACEHOLDER) + compilation_plan = re.sub(CP_STRING, match_increaser_str, js) + + match_increaser_num = match_unumerator(CP_NUMERIC_PLACEHOLDER) + compilation_plan = re.sub(CP_NUMERIC_RE, match_increaser_num, + compilation_plan) + # now put quotes, note that just patching string replaces is somewhat faster than + # using another re: + compilation_plan = compilation_plan.replace( + '__PyJsNUM_', '"__PyJsNUM_').replace('_PyJsNUM__', '_PyJsNUM__"') + compilation_plan = compilation_plan.replace( + '__PyJsSTR_', '"__PyJsSTR_').replace('_PyJsSTR__', '_PyJsSTR__"') + + return match_increaser_str, match_increaser_num, compilation_plan + + +def translate_js_with_compilation_plan(js, HEADER=DEFAULT_HEADER): + """js has to be a javascript source code. + returns equivalent python code. + + compile plans only work with the following restrictions: + - only enabled for oneliner expressions + - when there are comments in the js code string substitution is disabled + - when there nested escaped quotes string substitution is disabled, so + + cacheable: + Q1 == 1 && name == 'harry' + + not cacheable: + Q1 == 1 && name == 'harry' // some comment + + not cacheable: + Q1 == 1 && name == 'o\'Reilly' + + not cacheable: + Q1 == 1 && name /* some comment */ == 'o\'Reilly' + """ + + match_increaser_str, match_increaser_num, compilation_plan = get_compilation_plan( + js) + + cp_hash = hashlib.md5(compilation_plan.encode('utf-8')).digest() + try: + python_code = cache[cp_hash]['proto_python_code'] + except: + parser = pyjsparser.PyJsParser() + parsed = parser.parse(compilation_plan) # js to esprima syntax tree + # Another way of doing that would be with my auto esprima translation but its much slower and causes import problems: + # parsed = esprima.parse(js).to_dict() + translating_nodes.clean_stacks() + python_code = translating_nodes.trans( + parsed) # syntax tree to python code + cache[cp_hash] = { + 'compilation_plan': compilation_plan, + 'proto_python_code': python_code, + } + + python_code = match_increaser_str.wrap_up(python_code) + python_code = match_increaser_num.wrap_up(python_code) + + return HEADER + python_code + + +def trasnlate(js, HEADER=DEFAULT_HEADER): + """js has to be a javascript source code. + returns equivalent python code. + + Equivalent to translate_js""" + return translate_js(js, HEADER) + + +syntax_tree_translate = translating_nodes.trans + +if __name__ == '__main__': + PROFILE = False + import js2py + import codecs + + def main(): + with codecs.open("esprima.js", "r", "utf-8") as f: + d = f.read() + r = js2py.translate_js(d) + + with open('res.py', 'wb') as f2: + f2.write(r) + exec (r, {}) + + if PROFILE: + import cProfile + cProfile.run('main()', sort='tottime') + else: + main() diff --git a/Contents/Libraries/Shared/js2py/utils/__init__.py b/Contents/Libraries/Shared/js2py/utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/js2py/utils/injector.py b/Contents/Libraries/Shared/js2py/utils/injector.py new file mode 100644 index 000000000..dd714a482 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/utils/injector.py @@ -0,0 +1,235 @@ +__all__ = ['fix_js_args'] + +import types +from collections import namedtuple +import opcode +import six +import sys +import dis + +if six.PY3: + xrange = range + chr = lambda x: x + +# Opcode constants used for comparison and replacecment +LOAD_FAST = opcode.opmap['LOAD_FAST'] +LOAD_GLOBAL = opcode.opmap['LOAD_GLOBAL'] +STORE_FAST = opcode.opmap['STORE_FAST'] + + +def fix_js_args(func): + '''Use this function when unsure whether func takes this and arguments as its last 2 args. + It will append 2 args if it does not.''' + fcode = six.get_function_code(func) + fargs = fcode.co_varnames[fcode.co_argcount - 2:fcode.co_argcount] + if fargs == ('this', 'arguments') or fargs == ('arguments', 'var'): + return func + code = append_arguments(six.get_function_code(func), ('this', 'arguments')) + + return types.FunctionType( + code, + six.get_function_globals(func), + func.__name__, + closure=six.get_function_closure(func)) + + +def append_arguments(code_obj, new_locals): + co_varnames = code_obj.co_varnames # Old locals + co_names = code_obj.co_names # Old globals + co_names += tuple(e for e in new_locals if e not in co_names) + co_argcount = code_obj.co_argcount # Argument count + co_code = code_obj.co_code # The actual bytecode as a string + + # Make one pass over the bytecode to identify names that should be + # left in code_obj.co_names. + not_removed = set(opcode.hasname) - set([LOAD_GLOBAL]) + saved_names = set() + for inst in instructions(code_obj): + if inst[0] in not_removed: + saved_names.add(co_names[inst[1]]) + + # Build co_names for the new code object. This should consist of + # globals that were only accessed via LOAD_GLOBAL + names = tuple( + name for name in co_names if name not in set(new_locals) - saved_names) + + # Build a dictionary that maps the indices of the entries in co_names + # to their entry in the new co_names + name_translations = dict( + (co_names.index(name), i) for i, name in enumerate(names)) + + # Build co_varnames for the new code object. This should consist of + # the entirety of co_varnames with new_locals spliced in after the + # arguments + new_locals_len = len(new_locals) + varnames = ( + co_varnames[:co_argcount] + new_locals + co_varnames[co_argcount:]) + + # Build the dictionary that maps indices of entries in the old co_varnames + # to their indices in the new co_varnames + range1, range2 = xrange(co_argcount), xrange(co_argcount, len(co_varnames)) + varname_translations = dict((i, i) for i in range1) + varname_translations.update((i, i + new_locals_len) for i in range2) + + # Build the dictionary that maps indices of deleted entries of co_names + # to their indices in the new co_varnames + names_to_varnames = dict( + (co_names.index(name), varnames.index(name)) for name in new_locals) + + # Now we modify the actual bytecode + modified = [] + for inst in instructions(code_obj): + op, arg = inst.opcode, inst.arg + # If the instruction is a LOAD_GLOBAL, we have to check to see if + # it's one of the globals that we are replacing. Either way, + # update its arg using the appropriate dict. + if inst.opcode == LOAD_GLOBAL: + if inst.arg in names_to_varnames: + op = LOAD_FAST + arg = names_to_varnames[inst.arg] + elif inst.arg in name_translations: + arg = name_translations[inst.arg] + else: + raise ValueError("a name was lost in translation") + # If it accesses co_varnames or co_names then update its argument. + elif inst.opcode in opcode.haslocal: + arg = varname_translations[inst.arg] + elif inst.opcode in opcode.hasname: + arg = name_translations[inst.arg] + modified.extend(write_instruction(op, arg)) + if six.PY2: + code = ''.join(modified) + args = (co_argcount + new_locals_len, + code_obj.co_nlocals + new_locals_len, code_obj.co_stacksize, + code_obj.co_flags, code, code_obj.co_consts, names, varnames, + code_obj.co_filename, code_obj.co_name, + code_obj.co_firstlineno, code_obj.co_lnotab, + code_obj.co_freevars, code_obj.co_cellvars) + else: + code = bytes(modified) + args = (co_argcount + new_locals_len, 0, + code_obj.co_nlocals + new_locals_len, code_obj.co_stacksize, + code_obj.co_flags, code, code_obj.co_consts, names, varnames, + code_obj.co_filename, code_obj.co_name, + code_obj.co_firstlineno, code_obj.co_lnotab, + code_obj.co_freevars, code_obj.co_cellvars) + + # Done modifying codestring - make the code object + return types.CodeType(*args) + + +def instructions(code_obj): + # easy for python 3.4+ + if sys.version_info >= (3, 4): + for inst in dis.Bytecode(code_obj): + yield inst + else: + # otherwise we have to manually parse + code = code_obj.co_code + NewInstruction = namedtuple('Instruction', ('opcode', 'arg')) + if six.PY2: + code = map(ord, code) + i, L = 0, len(code) + extended_arg = 0 + while i < L: + op = code[i] + i += 1 + if op < opcode.HAVE_ARGUMENT: + yield NewInstruction(op, None) + continue + oparg = code[i] + (code[i + 1] << 8) + extended_arg + extended_arg = 0 + i += 2 + if op == opcode.EXTENDED_ARG: + extended_arg = oparg << 16 + continue + yield NewInstruction(op, oparg) + + +def write_instruction(op, arg): + if sys.version_info < (3, 6): + if arg is None: + return [chr(op)] + elif arg <= 65536: + return [chr(op), chr(arg & 255), chr((arg >> 8) & 255)] + elif arg <= 4294967296: + return [ + chr(opcode.EXTENDED_ARG), + chr((arg >> 16) & 255), + chr((arg >> 24) & 255), + chr(op), + chr(arg & 255), + chr((arg >> 8) & 255) + ] + else: + raise ValueError("Invalid oparg: {0} is too large".format(oparg)) + else: # python 3.6+ uses wordcode instead of bytecode and they already supply all the EXTENDEND_ARG ops :) + if arg is None: + return [chr(op), 0] + return [chr(op), arg & 255] + # the code below is for case when extended args are to be determined automatically + # if op == opcode.EXTENDED_ARG: + # return [] # this will be added automatically + # elif arg < 1 << 8: + # return [chr(op), arg] + # elif arg < 1 << 32: + # subs = [1<<24, 1<<16, 1<<8] # allowed op extension sizes + # for sub in subs: + # if arg >= sub: + # fit = int(arg / sub) + # return [chr(opcode.EXTENDED_ARG), fit] + write_instruction(op, arg - fit * sub) + # else: + # raise ValueError("Invalid oparg: {0} is too large".format(oparg)) + + +def check(code_obj): + old_bytecode = code_obj.co_code + insts = list(instructions(code_obj)) + + pos_to_inst = {} + bytelist = [] + + for inst in insts: + pos_to_inst[len(bytelist)] = inst + bytelist.extend(write_instruction(inst.opcode, inst.arg)) + if six.PY2: + new_bytecode = ''.join(bytelist) + else: + new_bytecode = bytes(bytelist) + if new_bytecode != old_bytecode: + print(new_bytecode) + print(old_bytecode) + for i in range(min(len(new_bytecode), len(old_bytecode))): + if old_bytecode[i] != new_bytecode[i]: + while 1: + if i in pos_to_inst: + print(pos_to_inst[i]) + print(pos_to_inst[i - 2]) + print(list(map(chr, old_bytecode))[i - 4:i + 8]) + print(bytelist[i - 4:i + 8]) + break + raise RuntimeError( + 'Your python version made changes to the bytecode') + + +check(six.get_function_code(check)) + +if __name__ == '__main__': + x = 'Wrong' + dick = 3000 + + def func(a): + print(x, y, z, a) + print(dick) + d = (x, ) + for e in (e for e in x): + print(e) + return x, y, z + + func2 = types.FunctionType( + append_arguments(six.get_function_code(func), ('x', 'y', 'z')), + six.get_function_globals(func), + func.__name__, + closure=six.get_function_closure(func)) + args = (2, 2, 3, 4), 3, 4 + assert func2(1, *args) == args diff --git a/Contents/Libraries/Shared/pyjsparser/__init__.py b/Contents/Libraries/Shared/pyjsparser/__init__.py new file mode 100644 index 000000000..2a9de69e9 --- /dev/null +++ b/Contents/Libraries/Shared/pyjsparser/__init__.py @@ -0,0 +1,4 @@ +__all__ = ['PyJsParser', 'parse', 'JsSyntaxError'] +__author__ = 'Piotr Dabkowski' +__version__ = '2.2.0' +from .parser import PyJsParser, parse, JsSyntaxError \ No newline at end of file diff --git a/Contents/Libraries/Shared/pyjsparser/parser.py b/Contents/Libraries/Shared/pyjsparser/parser.py new file mode 100644 index 000000000..a67869ce8 --- /dev/null +++ b/Contents/Libraries/Shared/pyjsparser/parser.py @@ -0,0 +1,2898 @@ +# The MIT License +# +# Copyright 2014, 2015 Piotr Dabkowski +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the 'Software'), +# to deal in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, subject +# to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies or +# substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +# LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +# OR THE USE OR OTHER DEALINGS IN THE SOFTWARE +from __future__ import unicode_literals +from .pyjsparserdata import * +from .std_nodes import * +from pprint import pprint +import sys + +__all__ = ['PyJsParser', 'parse', 'ENABLE_JS2PY_ERRORS', 'ENABLE_PYIMPORT', 'JsSyntaxError'] +REGEXP_SPECIAL_SINGLE = ('\\', '^', '$', '*', '+', '?', '.', '[', ']', '(', ')', '{', '{', '|', '-') +ENABLE_PYIMPORT = False +ENABLE_JS2PY_ERRORS = False + +PY3 = sys.version_info >= (3,0) + +if PY3: + basestring = str + long = int + xrange = range + unicode = str + +ESPRIMA_VERSION = '2.2.0' +DEBUG = False +# Small naming convention changes +# len -> leng +# id -> d +# type -> typ +# str -> st +true = True +false = False +null = None + + +class PyJsParser: + """ Usage: + parser = PyJsParser() + parser.parse('var JavaScriptCode = 5.1') + """ + + def __init__(self): + self.clean() + + def test(self, code): + pprint(self.parse(code)) + + def clean(self): + self.strict = None + self.sourceType = None + self.index = 0 + self.lineNumber = 1 + self.lineStart = 0 + self.hasLineTerminator = None + self.lastIndex = None + self.lastLineNumber = None + self.lastLineStart = None + self.startIndex = None + self.startLineNumber = None + self.startLineStart = None + self.scanning = None + self.lookahead = None + self.state = None + self.extra = None + self.isBindingElement = None + self.isAssignmentTarget = None + self.firstCoverInitializedNameError = None + + # 7.4 Comments + + def skipSingleLineComment(self, offset): + start = self.index - offset; + while self.index < self.length: + ch = self.source[self.index]; + self.index += 1 + if isLineTerminator(ch): + if (ord(ch) == 13 and ord(self.source[self.index]) == 10): + self.index += 1 + self.lineNumber += 1 + self.hasLineTerminator = True + self.lineStart = self.index + return + + def skipMultiLineComment(self): + while self.index < self.length: + ch = ord(self.source[self.index]) + if isLineTerminator(ch): + if (ch == 0x0D and ord(self.source[self.index + 1]) == 0x0A): + self.index += 1 + self.lineNumber += 1 + self.index += 1 + self.hasLineTerminator = True + self.lineStart = self.index + elif ch == 0x2A: + # Block comment ends with '*/'. + if ord(self.source[self.index + 1]) == 0x2F: + self.index += 2 + return + self.index += 1 + else: + self.index += 1 + self.tolerateUnexpectedToken() + + def skipComment(self): + self.hasLineTerminator = False + start = (self.index == 0) + while self.index < self.length: + ch = ord(self.source[self.index]) + if isWhiteSpace(ch): + self.index += 1 + elif isLineTerminator(ch): + self.hasLineTerminator = True + self.index += 1 + if (ch == 0x0D and ord(self.source[self.index]) == 0x0A): + self.index += 1 + self.lineNumber += 1 + self.lineStart = self.index + start = True + elif (ch == 0x2F): # U+002F is '/' + ch = ord(self.source[self.index + 1]) + if (ch == 0x2F): + self.index += 2 + self.skipSingleLineComment(2) + start = True + elif (ch == 0x2A): # U+002A is '*' + self.index += 2 + self.skipMultiLineComment() + else: + break + elif (start and ch == 0x2D): # U+002D is '-' + # U+003E is '>' + if (ord(self.source[self.index + 1]) == 0x2D) and (ord(self.source[self.index + 2]) == 0x3E): + # '-->' is a single-line comment + self.index += 3 + self.skipSingleLineComment(3) + else: + break + elif (ch == 0x3C): # U+003C is '<' + if self.source[self.index + 1: self.index + 4] == '!--': + # <!-- + self.index += 4 + self.skipSingleLineComment(4) + else: + break + else: + break + + def scanHexEscape(self, prefix): + code = 0 + leng = 4 if (prefix == 'u') else 2 + for i in xrange(leng): + if self.index < self.length and isHexDigit(self.source[self.index]): + ch = self.source[self.index] + self.index += 1 + code = code * 16 + HEX_CONV[ch] + else: + return '' + return unichr(code) + + def scanUnicodeCodePointEscape(self): + ch = self.source[self.index] + code = 0 + # At least, one hex digit is required. + if ch == '}': + self.throwUnexpectedToken() + while (self.index < self.length): + ch = self.source[self.index] + self.index += 1 + if not isHexDigit(ch): + break + code = code * 16 + HEX_CONV[ch] + if code > 0x10FFFF or ch != '}': + self.throwUnexpectedToken() + # UTF-16 Encoding + if (code <= 0xFFFF): + return unichr(code) + cu1 = ((code - 0x10000) >> 10) + 0xD800; + cu2 = ((code - 0x10000) & 1023) + 0xDC00; + return unichr(cu1) + unichr(cu2) + + def ccode(self, offset=0): + return ord(self.source[self.index + offset]) + + def log_err_case(self): + if not DEBUG: + return + print('INDEX', self.index) + print(self.source[self.index - 10:self.index + 10]) + print('') + + def at(self, loc): + return None if loc >= self.length else self.source[loc] + + def substr(self, le, offset=0): + return self.source[self.index + offset:self.index + offset + le] + + def getEscapedIdentifier(self): + d = self.source[self.index] + ch = ord(d) + self.index += 1 + # '\u' (U+005C, U+0075) denotes an escaped character. + if (ch == 0x5C): + if (ord(self.source[self.index]) != 0x75): + self.throwUnexpectedToken() + self.index += 1 + ch = self.scanHexEscape('u') + if not ch or ch == '\\' or not isIdentifierStart(ch[0]): + self.throwUnexpectedToken() + d = ch + while (self.index < self.length): + ch = self.ccode() + if not isIdentifierPart(ch): + break + self.index += 1 + d += unichr(ch) + + # '\u' (U+005C, U+0075) denotes an escaped character. + if (ch == 0x5C): + d = d[0: len(d) - 1] + if (self.ccode() != 0x75): + self.throwUnexpectedToken() + self.index += 1 + ch = self.scanHexEscape('u'); + if (not ch or ch == '\\' or not isIdentifierPart(ch[0])): + self.throwUnexpectedToken() + d += ch + return d + + def getIdentifier(self): + start = self.index + self.index += 1 + while (self.index < self.length): + ch = self.ccode() + if (ch == 0x5C): + # Blackslash (U+005C) marks Unicode escape sequence. + self.index = start + return self.getEscapedIdentifier() + if (isIdentifierPart(ch)): + self.index += 1 + else: + break + return self.source[start: self.index] + + def scanIdentifier(self): + start = self.index + + # Backslash (U+005C) starts an escaped character. + d = self.getEscapedIdentifier() if (self.ccode() == 0x5C) else self.getIdentifier() + + # There is no keyword or literal with only one character. + # Thus, it must be an identifier. + if (len(d) == 1): + type = Token.Identifier + elif (isKeyword(d)): + type = Token.Keyword + elif (d == 'null'): + type = Token.NullLiteral + elif (d == 'true' or d == 'false'): + type = Token.BooleanLiteral + else: + type = Token.Identifier; + return { + 'type': type, + 'value': d, + 'lineNumber': self.lineNumber, + 'lineStart': self.lineStart, + 'start': start, + 'end': self.index + } + + # 7.7 Punctuators + + def scanPunctuator(self): + token = { + 'type': Token.Punctuator, + 'value': '', + 'lineNumber': self.lineNumber, + 'lineStart': self.lineStart, + 'start': self.index, + 'end': self.index + } + # Check for most common single-character punctuators. + st = self.source[self.index] + if st == '{': + self.state['curlyStack'].append('{') + self.index += 1 + elif st == '}': + self.index += 1 + self.state['curlyStack'].pop() + elif st in ('.', '(', ')', ';', ',', '[', ']', ':', '?', '~'): + self.index += 1 + else: + # 4-character punctuator. + st = self.substr(4) + if (st == '>>>='): + self.index += 4 + else: + # 3-character punctuators. + st = st[0:3] + if st in ('===', '!==', '>>>', '<<=', '>>='): + self.index += 3 + else: + # 2-character punctuators. + st = st[0:2] + if st in ('&&', '||', '==', '!=', '+=', '-=', '*=', '/=', '++', '--', '<<', '>>', '&=', '|=', '^=', + '%=', '<=', '>=', '=>'): + self.index += 2 + else: + # 1-character punctuators. + st = self.source[self.index] + if st in ('<', '>', '=', '!', '+', '-', '*', '%', '&', '|', '^', '/'): + self.index += 1 + if self.index == token['start']: + self.throwUnexpectedToken() + token['end'] = self.index; + token['value'] = st + return token + + # 7.8.3 Numeric Literals + + def scanHexLiteral(self, start): + number = '' + while (self.index < self.length): + if (not isHexDigit(self.source[self.index])): + break + number += self.source[self.index] + self.index += 1 + if not number: + self.throwUnexpectedToken() + if isIdentifierStart(self.ccode()): + self.throwUnexpectedToken() + return { + 'type': Token.NumericLiteral, + 'value': int(number, 16), + 'lineNumber': self.lineNumber, + 'lineStart': self.lineStart, + 'start': start, + 'end': self.index} + + def scanBinaryLiteral(self, start): + number = '' + while (self.index < self.length): + ch = self.source[self.index] + if (ch != '0' and ch != '1'): + break + number += self.source[self.index] + self.index += 1 + + if not number: + # only 0b or 0B + self.throwUnexpectedToken() + if (self.index < self.length): + ch = self.source[self.index] + # istanbul ignore else + if (isIdentifierStart(ch) or isDecimalDigit(ch)): + self.throwUnexpectedToken(); + return { + 'type': Token.NumericLiteral, + 'value': int(number, 2), + 'lineNumber': self.lineNumber, + 'lineStart': self.lineStart, + 'start': start, + 'end': self.index} + + def scanOctalLiteral(self, prefix, start): + if isOctalDigit(prefix): + octal = True + number = '0' + self.source[self.index] + self.index += 1 + else: + octal = False + self.index += 1 + number = '' + while (self.index < self.length): + if (not isOctalDigit(self.source[self.index])): + break + number += self.source[self.index] + self.index += 1 + if (not octal and not number): + # only 0o or 0O + self.throwUnexpectedToken() + if (isIdentifierStart(self.ccode()) or isDecimalDigit(self.ccode())): + self.throwUnexpectedToken() + return { + 'type': Token.NumericLiteral, + 'value': int(number, 8), + 'lineNumber': self.lineNumber, + 'lineStart': self.lineStart, + 'start': start, + 'end': self.index} + + def octalToDecimal(self, ch): + # \0 is not octal escape sequence + octal = (ch != '0') + code = int(ch, 8) + + if (self.index < self.length and isOctalDigit(self.source[self.index])): + octal = True + code = code * 8 + int(self.source[self.index], 8) + self.index += 1 + + # 3 digits are only allowed when string starts + # with 0, 1, 2, 3 + if (ch in '0123' and self.index < self.length and isOctalDigit(self.source[self.index])): + code = code * 8 + int((self.source[self.index]), 8) + self.index += 1 + return { + 'code': code, + 'octal': octal} + + def isImplicitOctalLiteral(self): + # Implicit octal, unless there is a non-octal digit. + # (Annex B.1.1 on Numeric Literals) + for i in xrange(self.index + 1, self.length): + ch = self.source[i]; + if (ch == '8' or ch == '9'): + return False; + if (not isOctalDigit(ch)): + return True + return True + + def scanNumericLiteral(self): + ch = self.source[self.index] + assert isDecimalDigit(ch) or (ch == '.'), 'Numeric literal must start with a decimal digit or a decimal point' + start = self.index + number = '' + if ch != '.': + number = self.source[self.index] + self.index += 1 + ch = self.source[self.index] + # Hex number starts with '0x'. + # Octal number starts with '0'. + # Octal number in ES6 starts with '0o'. + # Binary number in ES6 starts with '0b'. + if (number == '0'): + if (ch == 'x' or ch == 'X'): + self.index += 1 + return self.scanHexLiteral(start); + if (ch == 'b' or ch == 'B'): + self.index += 1 + return self.scanBinaryLiteral(start) + if (ch == 'o' or ch == 'O'): + return self.scanOctalLiteral(ch, start) + if (isOctalDigit(ch)): + if (self.isImplicitOctalLiteral()): + return self.scanOctalLiteral(ch, start); + while (isDecimalDigit(self.ccode())): + number += self.source[self.index] + self.index += 1 + ch = self.source[self.index]; + if (ch == '.'): + number += self.source[self.index] + self.index += 1 + while (isDecimalDigit(self.source[self.index])): + number += self.source[self.index] + self.index += 1 + ch = self.source[self.index] + if (ch == 'e' or ch == 'E'): + number += self.source[self.index] + self.index += 1 + ch = self.source[self.index] + if (ch == '+' or ch == '-'): + number += self.source[self.index] + self.index += 1 + if (isDecimalDigit(self.source[self.index])): + while (isDecimalDigit(self.source[self.index])): + number += self.source[self.index] + self.index += 1 + else: + self.throwUnexpectedToken() + if (isIdentifierStart(self.source[self.index])): + self.throwUnexpectedToken(); + return { + 'type': Token.NumericLiteral, + 'value': float(number), + 'lineNumber': self.lineNumber, + 'lineStart': self.lineStart, + 'start': start, + 'end': self.index} + + # 7.8.4 String Literals + + def _interpret_regexp(self, string, flags): + '''Perform sctring escape - for regexp literals''' + self.index = 0 + self.length = len(string) + self.source = string + self.lineNumber = 0 + self.lineStart = 0 + octal = False + st = '' + inside_square = 0 + while (self.index < self.length): + template = '[%s]' if not inside_square else '%s' + ch = self.source[self.index] + self.index += 1 + if ch == '\\': + ch = self.source[self.index] + self.index += 1 + if (not isLineTerminator(ch)): + if ch == 'u': + digs = self.source[self.index:self.index + 4] + if len(digs) == 4 and all(isHexDigit(d) for d in digs): + st += template % unichr(int(digs, 16)) + self.index += 4 + else: + st += 'u' + elif ch == 'x': + digs = self.source[self.index:self.index + 2] + if len(digs) == 2 and all(isHexDigit(d) for d in digs): + st += template % unichr(int(digs, 16)) + self.index += 2 + else: + st += 'x' + # special meaning - single char. + elif ch == '0': + st += '\\0' + elif ch == 'n': + st += '\\n' + elif ch == 'r': + st += '\\r' + elif ch == 't': + st += '\\t' + elif ch == 'f': + st += '\\f' + elif ch == 'v': + st += '\\v' + + # unescape special single characters like . so that they are interpreted literally + elif ch in REGEXP_SPECIAL_SINGLE: + st += '\\' + ch + + # character groups + elif ch == 'b': + st += '\\b' + elif ch == 'B': + st += '\\B' + elif ch == 'w': + st += '\\w' + elif ch == 'W': + st += '\\W' + elif ch == 'd': + st += '\\d' + elif ch == 'D': + st += '\\D' + elif ch == 's': + st += template % u' \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff' + elif ch == 'S': + st += template % u'\u0000-\u0008\u000e-\u001f\u0021-\u009f\u00a1-\u167f\u1681-\u180d\u180f-\u1fff\u200b-\u2027\u202a-\u202e\u2030-\u205e\u2060-\u2fff\u3001-\ufefe\uff00-\uffff' + else: + if isDecimalDigit(ch): + num = ch + while self.index < self.length and isDecimalDigit(self.source[self.index]): + num += self.source[self.index] + self.index += 1 + st += '\\' + num + + else: + st += ch # DONT ESCAPE!!! + else: + self.lineNumber += 1 + if (ch == '\r' and self.source[self.index] == '\n'): + self.index += 1 + self.lineStart = self.index + else: + if ch == '[': + inside_square = True + elif ch == ']': + inside_square = False + st += ch + # print string, 'was transformed to', st + return st + + def scanStringLiteral(self): + st = '' + octal = False + + quote = self.source[self.index] + assert quote == '\'' or quote == '"', 'String literal must starts with a quote' + start = self.index; + self.index += 1 + + while (self.index < self.length): + ch = self.source[self.index] + self.index += 1 + if (ch == quote): + quote = '' + break + elif (ch == '\\'): + ch = self.source[self.index] + self.index += 1 + if (not isLineTerminator(ch)): + if ch in 'ux': + if (self.source[self.index] == '{'): + self.index += 1 + st += self.scanUnicodeCodePointEscape() + else: + unescaped = self.scanHexEscape(ch) + if (not unescaped): + self.throwUnexpectedToken() # with throw I don't know whats the difference + st += unescaped + elif ch == 'n': + st += '\n'; + elif ch == 'r': + st += '\r'; + elif ch == 't': + st += '\t'; + elif ch == 'b': + st += '\b'; + elif ch == 'f': + st += '\f'; + elif ch == 'v': + st += '\x0B' + # elif ch in '89': + # self.throwUnexpectedToken() # again with throw.... + else: + if isOctalDigit(ch): + octToDec = self.octalToDecimal(ch) + octal = octToDec.get('octal') or octal + st += unichr(octToDec['code']) + else: + st += ch + else: + self.lineNumber += 1 + if (ch == '\r' and self.source[self.index] == '\n'): + self.index += 1 + self.lineStart = self.index + elif isLineTerminator(ch): + break + else: + st += ch; + if (quote != ''): + self.throwUnexpectedToken() + return { + 'type': Token.StringLiteral, + 'value': st, + 'octal': octal, + 'lineNumber': self.lineNumber, + 'lineStart': self.startLineStart, + 'start': start, + 'end': self.index} + + def scanTemplate(self): + cooked = '' + terminated = False + tail = False + start = self.index + head = (self.source[self.index] == '`') + rawOffset = 2 + + self.index += 1 + + while (self.index < self.length): + ch = self.source[self.index] + self.index += 1 + if (ch == '`'): + rawOffset = 1; + tail = True + terminated = True + break + elif (ch == '$'): + if (self.source[self.index] == '{'): + self.state['curlyStack'].append('${') + self.index += 1 + terminated = True + break; + cooked += ch + elif (ch == '\\'): + ch = self.source[self.index] + self.index += 1 + if (not isLineTerminator(ch)): + if ch == 'n': + cooked += '\n' + elif ch == 'r': + cooked += '\r' + elif ch == 't': + cooked += '\t' + elif ch in 'ux': + if (self.source[self.index] == '{'): + self.index += 1 + cooked += self.scanUnicodeCodePointEscape() + else: + restore = self.index + unescaped = self.scanHexEscape(ch) + if (unescaped): + cooked += unescaped + else: + self.index = restore + cooked += ch + elif ch == 'b': + cooked += '\b' + elif ch == 'f': + cooked += '\f' + elif ch == 'v': + cooked += '\v' + else: + if (ch == '0'): + if isDecimalDigit(self.ccode()): + # Illegal: \01 \02 and so on + self.throwError(Messages.TemplateOctalLiteral) + cooked += '\0' + elif (isOctalDigit(ch)): + # Illegal: \1 \2 + self.throwError(Messages.TemplateOctalLiteral) + else: + cooked += ch + else: + self.lineNumber += 1 + if (ch == '\r' and self.source[self.index] == '\n'): + self.index += 1 + self.lineStart = self.index + elif (isLineTerminator(ch)): + self.lineNumber += 1 + if (ch == '\r' and self.source[self.index] == '\n'): + self.index += 1 + self.lineStart = self.index + cooked += '\n' + else: + cooked += ch; + if (not terminated): + self.throwUnexpectedToken() + + if (not head): + self.state['curlyStack'].pop(); + + return { + 'type': Token.Template, + 'value': { + 'cooked': cooked, + 'raw': self.source[start + 1:self.index - rawOffset]}, + 'head': head, + 'tail': tail, + 'lineNumber': self.lineNumber, + 'lineStart': self.lineStart, + 'start': start, + 'end': self.index} + + def testRegExp(self, pattern, flags): + # todo: you should return python regexp object + return (pattern, flags) + + def scanRegExpBody(self): + ch = self.source[self.index] + assert ch == '/', 'Regular expression literal must start with a slash' + st = ch + self.index += 1 + + classMarker = False + terminated = False + while (self.index < self.length): + ch = self.source[self.index] + self.index += 1 + st += ch + if (ch == '\\'): + ch = self.source[self.index] + self.index += 1 + # ECMA-262 7.8.5 + if (isLineTerminator(ch)): + self.throwUnexpectedToken(None, Messages.UnterminatedRegExp) + st += ch + elif (isLineTerminator(ch)): + self.throwUnexpectedToken(None, Messages.UnterminatedRegExp) + elif (classMarker): + if (ch == ']'): + classMarker = False + else: + if (ch == '/'): + terminated = True + break + elif (ch == '['): + classMarker = True; + if (not terminated): + self.throwUnexpectedToken(None, Messages.UnterminatedRegExp) + + # Exclude leading and trailing slash. + body = st[1:-1] + return { + 'value': body, + 'literal': st} + + def scanRegExpFlags(self): + st = '' + flags = '' + while (self.index < self.length): + ch = self.source[self.index] + if (not isIdentifierPart(ch)): + break + self.index += 1 + if (ch == '\\' and self.index < self.length): + ch = self.source[self.index] + if (ch == 'u'): + self.index += 1 + restore = self.index + ch = self.scanHexEscape('u') + if (ch): + flags += ch + st += '\\u' + while restore < self.index: + st += self.source[restore] + restore += 1 + else: + self.index = restore + flags += 'u' + st += '\\u' + self.tolerateUnexpectedToken() + else: + st += '\\' + self.tolerateUnexpectedToken() + else: + flags += ch + st += ch + return { + 'value': flags, + 'literal': st} + + def scanRegExp(self): + self.scanning = True + self.lookahead = None + self.skipComment() + start = self.index + + body = self.scanRegExpBody() + flags = self.scanRegExpFlags() + value = self.testRegExp(body['value'], flags['value']) + scanning = False + return { + 'literal': body['literal'] + flags['literal'], + 'value': value, + 'regex': { + 'pattern': body['value'], + 'flags': flags['value'] + }, + 'start': start, + 'end': self.index} + + def collectRegex(self): + self.skipComment(); + return self.scanRegExp() + + def isIdentifierName(self, token): + return token['type'] in (1, 3, 4, 5) + + # def advanceSlash(self): ??? + + def advance(self): + if (self.index >= self.length): + return { + 'type': Token.EOF, + 'lineNumber': self.lineNumber, + 'lineStart': self.lineStart, + 'start': self.index, + 'end': self.index} + ch = self.ccode() + + if isIdentifierStart(ch): + token = self.scanIdentifier() + if (self.strict and isStrictModeReservedWord(token['value'])): + token['type'] = Token.Keyword + return token + # Very common: ( and ) and ; + if (ch == 0x28 or ch == 0x29 or ch == 0x3B): + return self.scanPunctuator() + + # String literal starts with single quote (U+0027) or double quote (U+0022). + if (ch == 0x27 or ch == 0x22): + return self.scanStringLiteral() + + # Dot (.) U+002E can also start a floating-point number, hence the need + # to check the next character. + if (ch == 0x2E): + if (isDecimalDigit(self.ccode(1))): + return self.scanNumericLiteral() + return self.scanPunctuator(); + + if (isDecimalDigit(ch)): + return self.scanNumericLiteral() + + # Slash (/) U+002F can also start a regex. + # if (extra.tokenize && ch == 0x2F): + # return advanceSlash(); + + # Template literals start with ` (U+0060) for template head + # or } (U+007D) for template middle or template tail. + if (ch == 0x60 or (ch == 0x7D and self.state['curlyStack'][len(self.state['curlyStack']) - 1] == '${')): + return self.scanTemplate() + return self.scanPunctuator(); + + # def collectToken(self): + # loc = { + # 'start': { + # 'line': self.lineNumber, + # 'column': self.index - self.lineStart}} + # + # token = self.advance() + # + # loc['end'] = { + # 'line': self.lineNumber, + # 'column': self.index - self.lineStart} + # if (token['type'] != Token.EOF): + # value = self.source[token['start']: token['end']] + # entry = { + # 'type': TokenName[token['type']], + # 'value': value, + # 'range': [token['start'], token['end']], + # 'loc': loc} + # if (token.get('regex')): + # entry['regex'] = { + # 'pattern': token['regex']['pattern'], + # 'flags': token['regex']['flags']} + # self.extra['tokens'].append(entry) + # return token; + + + def lex(self): + self.scanning = True + + self.lastIndex = self.index + self.lastLineNumber = self.lineNumber + self.lastLineStart = self.lineStart + + self.skipComment() + + token = self.lookahead + + self.startIndex = self.index + self.startLineNumber = self.lineNumber + self.startLineStart = self.lineStart + + self.lookahead = self.advance() + self.scanning = False + return token + + def peek(self): + self.scanning = True + + self.skipComment() + + self.lastIndex = self.index + self.lastLineNumber = self.lineNumber + self.lastLineStart = self.lineStart + + self.startIndex = self.index + self.startLineNumber = self.lineNumber + self.startLineStart = self.lineStart + + self.lookahead = self.advance() + self.scanning = False + + def createError(self, line, pos, description): + global ENABLE_PYIMPORT + msg = 'Line ' + unicode(line) + ': ' + unicode(description) + if ENABLE_JS2PY_ERRORS: + if isinstance(ENABLE_JS2PY_ERRORS, bool): + import js2py.base + return js2py.base.MakeError('SyntaxError', msg) + else: + return ENABLE_JS2PY_ERRORS(msg) + else: + return JsSyntaxError(msg) + + + # Throw an exception + + def throwError(self, messageFormat, *args): + msg = messageFormat % tuple(unicode(e) for e in args) + raise self.createError(self.lastLineNumber, self.lastIndex, msg); + + def tolerateError(self, messageFormat, *args): + return self.throwError(messageFormat, *args) + + # Throw an exception because of the token. + + def unexpectedTokenError(self, token={}, message=''): + msg = message or Messages.UnexpectedToken + if (token): + typ = token['type'] + if (not message): + if typ == Token.EOF: + msg = Messages.UnexpectedEOS + elif (typ == Token.Identifier): + msg = Messages.UnexpectedIdentifier + elif (typ == Token.NumericLiteral): + msg = Messages.UnexpectedNumber + elif (typ == Token.StringLiteral): + msg = Messages.UnexpectedString + elif (typ == Token.Template): + msg = Messages.UnexpectedTemplate + else: + msg = Messages.UnexpectedToken; + if (typ == Token.Keyword): + if (isFutureReservedWord(token['value'])): + msg = Messages.UnexpectedReserved + elif (self.strict and isStrictModeReservedWord(token['value'])): + msg = Messages.StrictReservedWord + value = token['value']['raw'] if (typ == Token.Template) else token.get('value') + else: + value = 'ILLEGAL' + msg = msg.replace('%s', unicode(value)) + + return (self.createError(token['lineNumber'], token['start'], msg) if (token and token.get('lineNumber')) else + self.createError(self.lineNumber if self.scanning else self.lastLineNumber, + self.index if self.scanning else self.lastIndex, msg)) + + def throwUnexpectedToken(self, token={}, message=''): + raise self.unexpectedTokenError(token, message) + + def tolerateUnexpectedToken(self, token={}, message=''): + self.throwUnexpectedToken(token, message) + + # Expect the next token to match the specified punctuator. + # If not, an exception will be thrown. + + def expect(self, value): + token = self.lex() + if (token['type'] != Token.Punctuator or token['value'] != value): + self.throwUnexpectedToken(token) + + # /** + # * @name expectCommaSeparator + # * @description Quietly expect a comma when in tolerant mode, otherwise delegates + # * to <code>expect(value)</code> + # * @since 2.0 + # */ + def expectCommaSeparator(self): + self.expect(',') + + # Expect the next token to match the specified keyword. + # If not, an exception will be thrown. + + def expectKeyword(self, keyword): + token = self.lex(); + if (token['type'] != Token.Keyword or token['value'] != keyword): + self.throwUnexpectedToken(token) + + # Return true if the next token matches the specified punctuator. + + def match(self, value): + return self.lookahead['type'] == Token.Punctuator and self.lookahead['value'] == value + + # Return true if the next token matches the specified keyword + + def matchKeyword(self, keyword): + return self.lookahead['type'] == Token.Keyword and self.lookahead['value'] == keyword + + # Return true if the next token matches the specified contextual keyword + # (where an identifier is sometimes a keyword depending on the context) + + def matchContextualKeyword(self, keyword): + return self.lookahead['type'] == Token.Identifier and self.lookahead['value'] == keyword + + # Return true if the next token is an assignment operator + + def matchAssign(self): + if (self.lookahead['type'] != Token.Punctuator): + return False; + op = self.lookahead['value'] + return op in ('=', '*=', '/=', '%=', '+=', '-=', '<<=', '>>=', '>>>=', '&=', '^=', '|=') + + def consumeSemicolon(self): + # Catch the very common case first: immediately a semicolon (U+003B). + + if (self.at(self.startIndex) == ';' or self.match(';')): + self.lex() + return + + if (self.hasLineTerminator): + return + + # TODO: FIXME(ikarienator): this is seemingly an issue in the previous location info convention. + self.lastIndex = self.startIndex + self.lastLineNumber = self.startLineNumber + self.lastLineStart = self.startLineStart + + if (self.lookahead['type'] != Token.EOF and not self.match('}')): + self.throwUnexpectedToken(self.lookahead) + + # // Cover grammar support. + # // + # // When an assignment expression position starts with an left parenthesis, the determination of the type + # // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead) + # // or the first comma. This situation also defers the determination of all the expressions nested in the pair. + # // + # // There are three productions that can be parsed in a parentheses pair that needs to be determined + # // after the outermost pair is closed. They are: + # // + # // 1. AssignmentExpression + # // 2. BindingElements + # // 3. AssignmentTargets + # // + # // In order to avoid exponential backtracking, we use two flags to denote if the production can be + # // binding element or assignment target. + # // + # // The three productions have the relationship: + # // + # // BindingElements <= AssignmentTargets <= AssignmentExpression + # // + # // with a single exception that CoverInitializedName when used directly in an Expression, generates + # // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the + # // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair. + # // + # // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not + # // effect the current flags. This means the production the parser parses is only used as an expression. Therefore + # // the CoverInitializedName check is conducted. + # // + # // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates + # // the flags outside of the parser. This means the production the parser parses is used as a part of a potential + # // pattern. The CoverInitializedName check is deferred. + + def isolateCoverGrammar(self, parser): + oldIsBindingElement = self.isBindingElement + oldIsAssignmentTarget = self.isAssignmentTarget + oldFirstCoverInitializedNameError = self.firstCoverInitializedNameError + self.isBindingElement = true + self.isAssignmentTarget = true + self.firstCoverInitializedNameError = null + result = parser() + if (self.firstCoverInitializedNameError != null): + self.throwUnexpectedToken(self.firstCoverInitializedNameError) + self.isBindingElement = oldIsBindingElement + self.isAssignmentTarget = oldIsAssignmentTarget + self.firstCoverInitializedNameError = oldFirstCoverInitializedNameError + return result + + def inheritCoverGrammar(self, parser): + oldIsBindingElement = self.isBindingElement + oldIsAssignmentTarget = self.isAssignmentTarget + oldFirstCoverInitializedNameError = self.firstCoverInitializedNameError + self.isBindingElement = true + self.isAssignmentTarget = true + self.firstCoverInitializedNameError = null + result = parser() + self.isBindingElement = self.isBindingElement and oldIsBindingElement + self.isAssignmentTarget = self.isAssignmentTarget and oldIsAssignmentTarget + self.firstCoverInitializedNameError = oldFirstCoverInitializedNameError or self.firstCoverInitializedNameError + return result + + def parseArrayPattern(self): + node = Node() + elements = [] + self.expect('['); + while (not self.match(']')): + if (self.match(',')): + self.lex() + elements.append(null) + else: + if (self.match('...')): + restNode = Node() + self.lex() + rest = self.parseVariableIdentifier() + elements.append(restNode.finishRestElement(rest)) + break + else: + elements.append(self.parsePatternWithDefault()) + if (not self.match(']')): + self.expect(',') + self.expect(']') + return node.finishArrayPattern(elements) + + def parsePropertyPattern(self): + node = Node() + computed = self.match('[') + if (self.lookahead['type'] == Token.Identifier): + key = self.parseVariableIdentifier() + if (self.match('=')): + self.lex(); + init = self.parseAssignmentExpression() + return node.finishProperty( + 'init', key, false, WrappingNode(key).finishAssignmentPattern(key, init), false, false) + elif (not self.match(':')): + return node.finishProperty('init', key, false, key, false, true) + else: + key = self.parseObjectPropertyKey() + self.expect(':') + init = self.parsePatternWithDefault() + return node.finishProperty('init', key, computed, init, false, false) + + def parseObjectPattern(self): + node = Node() + properties = [] + self.expect('{') + while (not self.match('}')): + properties.append(self.parsePropertyPattern()) + if (not self.match('}')): + self.expect(',') + self.lex() + return node.finishObjectPattern(properties) + + def parsePattern(self): + if (self.lookahead['type'] == Token.Identifier): + return self.parseVariableIdentifier() + elif (self.match('[')): + return self.parseArrayPattern() + elif (self.match('{')): + return self.parseObjectPattern() + self.throwUnexpectedToken(self.lookahead) + + def parsePatternWithDefault(self): + startToken = self.lookahead + + pattern = self.parsePattern() + if (self.match('=')): + self.lex() + right = self.isolateCoverGrammar(self.parseAssignmentExpression) + pattern = WrappingNode(startToken).finishAssignmentPattern(pattern, right) + return pattern + + # 11.1.4 Array Initialiser + + def parseArrayInitialiser(self): + elements = [] + node = Node() + + self.expect('[') + + while (not self.match(']')): + if (self.match(',')): + self.lex() + elements.append(null) + elif (self.match('...')): + restSpread = Node() + self.lex() + restSpread.finishSpreadElement(self.inheritCoverGrammar(self.parseAssignmentExpression)) + if (not self.match(']')): + self.isAssignmentTarget = self.isBindingElement = false + self.expect(',') + elements.append(restSpread) + else: + elements.append(self.inheritCoverGrammar(self.parseAssignmentExpression)) + if (not self.match(']')): + self.expect(',') + self.lex(); + + return node.finishArrayExpression(elements) + + # 11.1.5 Object Initialiser + + def parsePropertyFunction(self, node, paramInfo): + + self.isAssignmentTarget = self.isBindingElement = false; + + previousStrict = self.strict; + body = self.isolateCoverGrammar(self.parseFunctionSourceElements); + + if (self.strict and paramInfo['firstRestricted']): + self.tolerateUnexpectedToken(paramInfo['firstRestricted'], paramInfo.get('message')) + if (self.strict and paramInfo.get('stricted')): + self.tolerateUnexpectedToken(paramInfo.get('stricted'), paramInfo.get('message')); + + self.strict = previousStrict; + return node.finishFunctionExpression(null, paramInfo.get('params'), paramInfo.get('defaults'), body) + + def parsePropertyMethodFunction(self): + node = Node(); + + params = self.parseParams(null); + method = self.parsePropertyFunction(node, params); + return method; + + def parseObjectPropertyKey(self): + node = Node() + + token = self.lex(); + + # // Note: This function is called only from parseObjectProperty(), where + # // EOF and Punctuator tokens are already filtered out. + + typ = token['type'] + + if typ in [Token.StringLiteral, Token.NumericLiteral]: + if self.strict and token.get('octal'): + self.tolerateUnexpectedToken(token, Messages.StrictOctalLiteral); + return node.finishLiteral(token); + elif typ in (Token.Identifier, Token.BooleanLiteral, Token.NullLiteral, Token.Keyword): + return node.finishIdentifier(token['value']); + elif typ == Token.Punctuator: + if (token['value'] == '['): + expr = self.isolateCoverGrammar(self.parseAssignmentExpression) + self.expect(']') + return expr + self.throwUnexpectedToken(token) + + def lookaheadPropertyName(self): + typ = self.lookahead['type'] + if typ in (Token.Identifier, Token.StringLiteral, Token.BooleanLiteral, Token.NullLiteral, Token.NumericLiteral, + Token.Keyword): + return true + if typ == Token.Punctuator: + return self.lookahead['value'] == '[' + return false + + # // This function is to try to parse a MethodDefinition as defined in 14.3. But in the case of object literals, + # // it might be called at a position where there is in fact a short hand identifier pattern or a data property. + # // This can only be determined after we consumed up to the left parentheses. + # // + # // In order to avoid back tracking, it returns `null` if the position is not a MethodDefinition and the caller + # // is responsible to visit other options. + def tryParseMethodDefinition(self, token, key, computed, node): + if (token['type'] == Token.Identifier): + # check for `get` and `set`; + + if (token['value'] == 'get' and self.lookaheadPropertyName()): + computed = self.match('['); + key = self.parseObjectPropertyKey() + methodNode = Node() + self.expect('(') + self.expect(')') + value = self.parsePropertyFunction(methodNode, { + 'params': [], + 'defaults': [], + 'stricted': null, + 'firstRestricted': null, + 'message': null + }) + return node.finishProperty('get', key, computed, value, false, false) + elif (token['value'] == 'set' and self.lookaheadPropertyName()): + computed = self.match('[') + key = self.parseObjectPropertyKey() + methodNode = Node() + self.expect('(') + + options = { + 'params': [], + 'defaultCount': 0, + 'defaults': [], + 'firstRestricted': null, + 'paramSet': {} + } + if (self.match(')')): + self.tolerateUnexpectedToken(self.lookahead); + else: + self.parseParam(options); + if (options['defaultCount'] == 0): + options['defaults'] = [] + self.expect(')') + + value = self.parsePropertyFunction(methodNode, options); + return node.finishProperty('set', key, computed, value, false, false); + if (self.match('(')): + value = self.parsePropertyMethodFunction(); + return node.finishProperty('init', key, computed, value, true, false) + return null; + + def checkProto(self, key, computed, hasProto): + if (computed == false and (key['type'] == Syntax.Identifier and key['name'] == '__proto__' or + key['type'] == Syntax.Literal and key['value'] == '__proto__')): + if (hasProto['value']): + self.tolerateError(Messages.DuplicateProtoProperty); + else: + hasProto['value'] = true; + + def parseObjectProperty(self, hasProto): + token = self.lookahead + node = Node() + + computed = self.match('['); + key = self.parseObjectPropertyKey(); + maybeMethod = self.tryParseMethodDefinition(token, key, computed, node) + + if (maybeMethod): + self.checkProto(maybeMethod['key'], maybeMethod['computed'], hasProto); + return maybeMethod; + + # // init property or short hand property. + self.checkProto(key, computed, hasProto); + + if (self.match(':')): + self.lex(); + value = self.inheritCoverGrammar(self.parseAssignmentExpression) + return node.finishProperty('init', key, computed, value, false, false) + + if (token['type'] == Token.Identifier): + if (self.match('=')): + self.firstCoverInitializedNameError = self.lookahead; + self.lex(); + value = self.isolateCoverGrammar(self.parseAssignmentExpression); + return node.finishProperty('init', key, computed, + WrappingNode(token).finishAssignmentPattern(key, value), false, true) + return node.finishProperty('init', key, computed, key, false, true) + self.throwUnexpectedToken(self.lookahead) + + def parseObjectInitialiser(self): + properties = [] + hasProto = {'value': false} + node = Node(); + + self.expect('{'); + + while (not self.match('}')): + properties.append(self.parseObjectProperty(hasProto)); + + if (not self.match('}')): + self.expectCommaSeparator() + self.expect('}'); + return node.finishObjectExpression(properties) + + def reinterpretExpressionAsPattern(self, expr): + typ = (expr['type']) + if typ in (Syntax.Identifier, Syntax.MemberExpression, Syntax.RestElement, Syntax.AssignmentPattern): + pass + elif typ == Syntax.SpreadElement: + expr['type'] = Syntax.RestElement + self.reinterpretExpressionAsPattern(expr.argument) + elif typ == Syntax.ArrayExpression: + expr['type'] = Syntax.ArrayPattern + for i in xrange(len(expr['elements'])): + if (expr['elements'][i] != null): + self.reinterpretExpressionAsPattern(expr['elements'][i]) + elif typ == Syntax.ObjectExpression: + expr['type'] = Syntax.ObjectPattern + for i in xrange(len(expr['properties'])): + self.reinterpretExpressionAsPattern(expr['properties'][i]['value']); + elif Syntax.AssignmentExpression: + expr['type'] = Syntax.AssignmentPattern; + self.reinterpretExpressionAsPattern(expr['left']) + else: + # // Allow other node type for tolerant parsing. + return + + def parseTemplateElement(self, option): + + if (self.lookahead['type'] != Token.Template or (option['head'] and not self.lookahead['head'])): + self.throwUnexpectedToken() + + node = Node(); + token = self.lex(); + + return node.finishTemplateElement({'raw': token['value']['raw'], 'cooked': token['value']['cooked']}, + token['tail']) + + def parseTemplateLiteral(self): + node = Node() + + quasi = self.parseTemplateElement({'head': true}) + quasis = [quasi] + expressions = [] + + while (not quasi['tail']): + expressions.append(self.parseExpression()); + quasi = self.parseTemplateElement({'head': false}); + quasis.append(quasi) + return node.finishTemplateLiteral(quasis, expressions) + + # 11.1.6 The Grouping Operator + + def parseGroupExpression(self): + self.expect('('); + + if (self.match(')')): + self.lex(); + if (not self.match('=>')): + self.expect('=>') + return { + 'type': PlaceHolders.ArrowParameterPlaceHolder, + 'params': []} + + startToken = self.lookahead + if (self.match('...')): + expr = self.parseRestElement(); + self.expect(')'); + if (not self.match('=>')): + self.expect('=>') + return { + 'type': PlaceHolders.ArrowParameterPlaceHolder, + 'params': [expr]} + + self.isBindingElement = true; + expr = self.inheritCoverGrammar(self.parseAssignmentExpression); + + if (self.match(',')): + self.isAssignmentTarget = false; + expressions = [expr] + + while (self.startIndex < self.length): + if (not self.match(',')): + break + self.lex(); + + if (self.match('...')): + if (not self.isBindingElement): + self.throwUnexpectedToken(self.lookahead) + expressions.append(self.parseRestElement()) + self.expect(')'); + if (not self.match('=>')): + self.expect('=>'); + self.isBindingElement = false + for i in xrange(len(expressions)): + self.reinterpretExpressionAsPattern(expressions[i]) + return { + 'type': PlaceHolders.ArrowParameterPlaceHolder, + 'params': expressions} + expressions.append(self.inheritCoverGrammar(self.parseAssignmentExpression)) + expr = WrappingNode(startToken).finishSequenceExpression(expressions); + self.expect(')') + + if (self.match('=>')): + if (not self.isBindingElement): + self.throwUnexpectedToken(self.lookahead); + if (expr['type'] == Syntax.SequenceExpression): + for i in xrange(len(expr.expressions)): + self.reinterpretExpressionAsPattern(expr['expressions'][i]) + else: + self.reinterpretExpressionAsPattern(expr); + expr = { + 'type': PlaceHolders.ArrowParameterPlaceHolder, + 'params': expr['expressions'] if expr['type'] == Syntax.SequenceExpression else [expr]} + self.isBindingElement = false + return expr + + # 11.1 Primary Expressions + + def parsePrimaryExpression(self): + if (self.match('(')): + self.isBindingElement = false; + return self.inheritCoverGrammar(self.parseGroupExpression) + if (self.match('[')): + return self.inheritCoverGrammar(self.parseArrayInitialiser) + + if (self.match('{')): + return self.inheritCoverGrammar(self.parseObjectInitialiser) + + typ = self.lookahead['type'] + node = Node(); + + if (typ == Token.Identifier): + expr = node.finishIdentifier(self.lex()['value']); + elif (typ == Token.StringLiteral or typ == Token.NumericLiteral): + self.isAssignmentTarget = self.isBindingElement = false + if (self.strict and self.lookahead.get('octal')): + self.tolerateUnexpectedToken(self.lookahead, Messages.StrictOctalLiteral) + expr = node.finishLiteral(self.lex()) + elif (typ == Token.Keyword): + self.isAssignmentTarget = self.isBindingElement = false + if (self.matchKeyword('function')): + return self.parseFunctionExpression() + if (self.matchKeyword('this')): + self.lex() + return node.finishThisExpression() + if (self.matchKeyword('class')): + return self.parseClassExpression() + self.throwUnexpectedToken(self.lex()) + elif (typ == Token.BooleanLiteral): + isAssignmentTarget = self.isBindingElement = false + token = self.lex(); + token['value'] = (token['value'] == 'true') + expr = node.finishLiteral(token) + elif (typ == Token.NullLiteral): + self.isAssignmentTarget = self.isBindingElement = false + token = self.lex() + token['value'] = null; + expr = node.finishLiteral(token) + elif (self.match('/') or self.match('/=')): + self.isAssignmentTarget = self.isBindingElement = false; + self.index = self.startIndex; + token = self.scanRegExp(); # hehe, here you are! + self.lex(); + expr = node.finishLiteral(token); + elif (typ == Token.Template): + expr = self.parseTemplateLiteral() + else: + self.throwUnexpectedToken(self.lex()); + return expr; + + # 11.2 Left-Hand-Side Expressions + + def parseArguments(self): + args = []; + + self.expect('('); + if (not self.match(')')): + while (self.startIndex < self.length): + args.append(self.isolateCoverGrammar(self.parseAssignmentExpression)) + if (self.match(')')): + break + self.expectCommaSeparator() + self.expect(')') + return args; + + def parseNonComputedProperty(self): + node = Node() + + token = self.lex(); + + if (not self.isIdentifierName(token)): + self.throwUnexpectedToken(token) + return node.finishIdentifier(token['value']) + + def parseNonComputedMember(self): + self.expect('.') + return self.parseNonComputedProperty(); + + def parseComputedMember(self): + self.expect('[') + + expr = self.isolateCoverGrammar(self.parseExpression) + self.expect(']') + + return expr + + def parseNewExpression(self): + node = Node() + self.expectKeyword('new') + callee = self.isolateCoverGrammar(self.parseLeftHandSideExpression) + args = self.parseArguments() if self.match('(') else [] + + self.isAssignmentTarget = self.isBindingElement = false + + return node.finishNewExpression(callee, args) + + def parseLeftHandSideExpressionAllowCall(self): + previousAllowIn = self.state['allowIn'] + + startToken = self.lookahead; + self.state['allowIn'] = true; + + if (self.matchKeyword('super') and self.state['inFunctionBody']): + expr = Node(); + self.lex(); + expr = expr.finishSuper() + if (not self.match('(') and not self.match('.') and not self.match('[')): + self.throwUnexpectedToken(self.lookahead); + else: + expr = self.inheritCoverGrammar( + self.parseNewExpression if self.matchKeyword('new') else self.parsePrimaryExpression) + while True: + if (self.match('.')): + self.isBindingElement = false; + self.isAssignmentTarget = true; + property = self.parseNonComputedMember(); + expr = WrappingNode(startToken).finishMemberExpression('.', expr, property) + elif (self.match('(')): + self.isBindingElement = false; + self.isAssignmentTarget = false; + args = self.parseArguments(); + expr = WrappingNode(startToken).finishCallExpression(expr, args) + elif (self.match('[')): + self.isBindingElement = false; + self.isAssignmentTarget = true; + property = self.parseComputedMember(); + expr = WrappingNode(startToken).finishMemberExpression('[', expr, property) + elif (self.lookahead['type'] == Token.Template and self.lookahead['head']): + quasi = self.parseTemplateLiteral() + expr = WrappingNode(startToken).finishTaggedTemplateExpression(expr, quasi) + else: + break + self.state['allowIn'] = previousAllowIn + + return expr + + def parseLeftHandSideExpression(self): + assert self.state['allowIn'], 'callee of new expression always allow in keyword.' + + startToken = self.lookahead + + if (self.matchKeyword('super') and self.state['inFunctionBody']): + expr = Node(); + self.lex(); + expr = expr.finishSuper(); + if (not self.match('[') and not self.match('.')): + self.throwUnexpectedToken(self.lookahead) + else: + expr = self.inheritCoverGrammar( + self.parseNewExpression if self.matchKeyword('new') else self.parsePrimaryExpression); + + while True: + if (self.match('[')): + self.isBindingElement = false; + self.isAssignmentTarget = true; + property = self.parseComputedMember(); + expr = WrappingNode(startToken).finishMemberExpression('[', expr, property) + elif (self.match('.')): + self.isBindingElement = false; + self.isAssignmentTarget = true; + property = self.parseNonComputedMember(); + expr = WrappingNode(startToken).finishMemberExpression('.', expr, property); + elif (self.lookahead['type'] == Token.Template and self.lookahead['head']): + quasi = self.parseTemplateLiteral(); + expr = WrappingNode(startToken).finishTaggedTemplateExpression(expr, quasi) + else: + break + return expr + + # 11.3 Postfix Expressions + + def parsePostfixExpression(self): + startToken = self.lookahead + + expr = self.inheritCoverGrammar(self.parseLeftHandSideExpressionAllowCall) + + if (not self.hasLineTerminator and self.lookahead['type'] == Token.Punctuator): + if (self.match('++') or self.match('--')): + # 11.3.1, 11.3.2 + if (self.strict and expr.type == Syntax.Identifier and isRestrictedWord(expr.name)): + self.tolerateError(Messages.StrictLHSPostfix) + if (not self.isAssignmentTarget): + self.tolerateError(Messages.InvalidLHSInAssignment); + self.isAssignmentTarget = self.isBindingElement = false; + + token = self.lex(); + expr = WrappingNode(startToken).finishPostfixExpression(token['value'], expr); + return expr; + + # 11.4 Unary Operators + + def parseUnaryExpression(self): + + if (self.lookahead['type'] != Token.Punctuator and self.lookahead['type'] != Token.Keyword): + expr = self.parsePostfixExpression(); + elif (self.match('++') or self.match('--')): + startToken = self.lookahead; + token = self.lex(); + expr = self.inheritCoverGrammar(self.parseUnaryExpression); + # 11.4.4, 11.4.5 + if (self.strict and expr.type == Syntax.Identifier and isRestrictedWord(expr.name)): + self.tolerateError(Messages.StrictLHSPrefix) + if (not self.isAssignmentTarget): + self.tolerateError(Messages.InvalidLHSInAssignment) + expr = WrappingNode(startToken).finishUnaryExpression(token['value'], expr) + self.isAssignmentTarget = self.isBindingElement = false + elif (self.match('+') or self.match('-') or self.match('~') or self.match('!')): + startToken = self.lookahead; + token = self.lex(); + expr = self.inheritCoverGrammar(self.parseUnaryExpression); + expr = WrappingNode(startToken).finishUnaryExpression(token['value'], expr) + self.isAssignmentTarget = self.isBindingElement = false; + elif (self.matchKeyword('delete') or self.matchKeyword('void') or self.matchKeyword('typeof')): + startToken = self.lookahead; + token = self.lex(); + expr = self.inheritCoverGrammar(self.parseUnaryExpression); + expr = WrappingNode(startToken).finishUnaryExpression(token['value'], expr); + if (self.strict and expr.operator == 'delete' and expr.argument.type == Syntax.Identifier): + self.tolerateError(Messages.StrictDelete) + self.isAssignmentTarget = self.isBindingElement = false; + else: + expr = self.parsePostfixExpression() + return expr + + def binaryPrecedence(self, token, allowIn): + prec = 0; + typ = token['type'] + if (typ != Token.Punctuator and typ != Token.Keyword): + return 0; + val = token['value'] + if val == 'in' and not allowIn: + return 0 + return PRECEDENCE.get(val, 0) + + # 11.5 Multiplicative Operators + # 11.6 Additive Operators + # 11.7 Bitwise Shift Operators + # 11.8 Relational Operators + # 11.9 Equality Operators + # 11.10 Binary Bitwise Operators + # 11.11 Binary Logical Operators + + def parseBinaryExpression(self): + + marker = self.lookahead; + left = self.inheritCoverGrammar(self.parseUnaryExpression); + + token = self.lookahead; + prec = self.binaryPrecedence(token, self.state['allowIn']); + if (prec == 0): + return left + self.isAssignmentTarget = self.isBindingElement = false; + token['prec'] = prec + self.lex() + + markers = [marker, self.lookahead]; + right = self.isolateCoverGrammar(self.parseUnaryExpression); + + stack = [left, token, right]; + + while True: + prec = self.binaryPrecedence(self.lookahead, self.state['allowIn']) + if not prec > 0: + break + # Reduce: make a binary expression from the three topmost entries. + while ((len(stack) > 2) and (prec <= stack[len(stack) - 2]['prec'])): + right = stack.pop(); + operator = stack.pop()['value'] + left = stack.pop() + markers.pop() + expr = WrappingNode(markers[len(markers) - 1]).finishBinaryExpression(operator, left, right) + stack.append(expr) + + # Shift + token = self.lex(); + token['prec'] = prec; + stack.append(token); + markers.append(self.lookahead); + expr = self.isolateCoverGrammar(self.parseUnaryExpression); + stack.append(expr); + + # Final reduce to clean-up the stack. + i = len(stack) - 1; + expr = stack[i] + markers.pop() + while (i > 1): + expr = WrappingNode(markers.pop()).finishBinaryExpression(stack[i - 1]['value'], stack[i - 2], expr); + i -= 2 + return expr + + # 11.12 Conditional Operator + + def parseConditionalExpression(self): + + startToken = self.lookahead + + expr = self.inheritCoverGrammar(self.parseBinaryExpression); + if (self.match('?')): + self.lex() + previousAllowIn = self.state['allowIn'] + self.state['allowIn'] = true; + consequent = self.isolateCoverGrammar(self.parseAssignmentExpression); + self.state['allowIn'] = previousAllowIn; + self.expect(':'); + alternate = self.isolateCoverGrammar(self.parseAssignmentExpression) + + expr = WrappingNode(startToken).finishConditionalExpression(expr, consequent, alternate); + self.isAssignmentTarget = self.isBindingElement = false; + return expr + + # [ES6] 14.2 Arrow Function + + def parseConciseBody(self): + if (self.match('{')): + return self.parseFunctionSourceElements() + return self.isolateCoverGrammar(self.parseAssignmentExpression) + + def checkPatternParam(self, options, param): + typ = param.type + if typ == Syntax.Identifier: + self.validateParam(options, param, param.name); + elif typ == Syntax.RestElement: + self.checkPatternParam(options, param.argument) + elif typ == Syntax.AssignmentPattern: + self.checkPatternParam(options, param.left) + elif typ == Syntax.ArrayPattern: + for i in xrange(len(param.elements)): + if (param.elements[i] != null): + self.checkPatternParam(options, param.elements[i]); + else: + assert typ == Syntax.ObjectPattern, 'Invalid type' + for i in xrange(len(param.properties)): + self.checkPatternParam(options, param.properties[i]['value']); + + def reinterpretAsCoverFormalsList(self, expr): + defaults = []; + defaultCount = 0; + params = [expr]; + typ = expr.type + if typ == Syntax.Identifier: + pass + elif typ == PlaceHolders.ArrowParameterPlaceHolder: + params = expr.params + else: + return null + options = { + 'paramSet': {}} + le = len(params) + for i in xrange(le): + param = params[i] + if param.type == Syntax.AssignmentPattern: + params[i] = param.left; + defaults.append(param.right); + defaultCount += 1 + self.checkPatternParam(options, param.left); + else: + self.checkPatternParam(options, param); + params[i] = param; + defaults.append(null); + if (options.get('message') == Messages.StrictParamDupe): + token = options.get('stricted') if self.strict else options['firstRestricted'] + self.throwUnexpectedToken(token, options.get('message')); + if (defaultCount == 0): + defaults = [] + return { + 'params': params, + 'defaults': defaults, + 'stricted': options['stricted'], + 'firstRestricted': options['firstRestricted'], + 'message': options.get('message')} + + def parseArrowFunctionExpression(self, options, node): + if (self.hasLineTerminator): + self.tolerateUnexpectedToken(self.lookahead) + self.expect('=>') + previousStrict = self.strict; + + body = self.parseConciseBody(); + + if (self.strict and options['firstRestricted']): + self.throwUnexpectedToken(options['firstRestricted'], options.get('message')); + if (self.strict and options['stricted']): + self.tolerateUnexpectedToken(options['stricted'], options['message']); + + self.strict = previousStrict + + return node.finishArrowFunctionExpression(options['params'], options['defaults'], body, + body.type != Syntax.BlockStatement) + + # 11.13 Assignment Operators + + def parseAssignmentExpression(self): + startToken = self.lookahead; + token = self.lookahead; + + expr = self.parseConditionalExpression(); + + if (expr.type == PlaceHolders.ArrowParameterPlaceHolder or self.match('=>')): + self.isAssignmentTarget = self.isBindingElement = false; + lis = self.reinterpretAsCoverFormalsList(expr) + + if (lis): + self.firstCoverInitializedNameError = null; + return self.parseArrowFunctionExpression(lis, WrappingNode(startToken)) + return expr + + if (self.matchAssign()): + if (not self.isAssignmentTarget or expr.type==Syntax.Literal): + self.tolerateError(Messages.InvalidLHSInAssignment) + # 11.13.1 + + if (self.strict and expr.type == Syntax.Identifier and isRestrictedWord(expr.name)): + self.tolerateUnexpectedToken(token, Messages.StrictLHSAssignment); + if (not self.match('=')): + self.isAssignmentTarget = self.isBindingElement = false; + else: + self.reinterpretExpressionAsPattern(expr) + token = self.lex(); + right = self.isolateCoverGrammar(self.parseAssignmentExpression) + expr = WrappingNode(startToken).finishAssignmentExpression(token['value'], expr, right); + self.firstCoverInitializedNameError = null + return expr + + # 11.14 Comma Operator + + def parseExpression(self): + startToken = self.lookahead + expr = self.isolateCoverGrammar(self.parseAssignmentExpression) + + if (self.match(',')): + expressions = [expr]; + + while (self.startIndex < self.length): + if (not self.match(',')): + break + self.lex(); + expressions.append(self.isolateCoverGrammar(self.parseAssignmentExpression)) + expr = WrappingNode(startToken).finishSequenceExpression(expressions); + return expr + + # 12.1 Block + + def parseStatementListItem(self): + if (self.lookahead['type'] == Token.Keyword): + val = (self.lookahead['value']) + if val == 'export': + if (self.sourceType != 'module'): + self.tolerateUnexpectedToken(self.lookahead, Messages.IllegalExportDeclaration) + return self.parseExportDeclaration(); + elif val == 'import': + if (self.sourceType != 'module'): + self.tolerateUnexpectedToken(self.lookahead, Messages.IllegalImportDeclaration); + return self.parseImportDeclaration(); + elif val == 'const' or val == 'let': + return self.parseLexicalDeclaration({'inFor': false}); + elif val == 'function': + return self.parseFunctionDeclaration(Node()); + elif val == 'class': + return self.parseClassDeclaration(); + elif ENABLE_PYIMPORT and val == 'pyimport': # <<<<< MODIFIED HERE + return self.parsePyimportStatement() + return self.parseStatement(); + + def parsePyimportStatement(self): + print(ENABLE_PYIMPORT) + assert ENABLE_PYIMPORT + n = Node() + self.lex() + n.finishPyimport(self.parseVariableIdentifier()) + self.consumeSemicolon() + return n + + def parseStatementList(self): + list = []; + while (self.startIndex < self.length): + if (self.match('}')): + break + list.append(self.parseStatementListItem()) + return list + + def parseBlock(self): + node = Node(); + + self.expect('{'); + + block = self.parseStatementList() + + self.expect('}'); + + return node.finishBlockStatement(block); + + # 12.2 Variable Statement + + def parseVariableIdentifier(self): + node = Node() + + token = self.lex() + + if (token['type'] != Token.Identifier): + if (self.strict and token['type'] == Token.Keyword and isStrictModeReservedWord(token['value'])): + self.tolerateUnexpectedToken(token, Messages.StrictReservedWord); + else: + self.throwUnexpectedToken(token) + return node.finishIdentifier(token['value']) + + def parseVariableDeclaration(self): + init = null + node = Node(); + + d = self.parsePattern(); + + # 12.2.1 + if (self.strict and isRestrictedWord(d.name)): + self.tolerateError(Messages.StrictVarName); + + if (self.match('=')): + self.lex(); + init = self.isolateCoverGrammar(self.parseAssignmentExpression); + elif (d.type != Syntax.Identifier): + self.expect('=') + return node.finishVariableDeclarator(d, init) + + def parseVariableDeclarationList(self): + lis = [] + + while True: + lis.append(self.parseVariableDeclaration()) + if (not self.match(',')): + break + self.lex(); + if not (self.startIndex < self.length): + break + + return lis; + + def parseVariableStatement(self, node): + self.expectKeyword('var') + + declarations = self.parseVariableDeclarationList() + + self.consumeSemicolon() + + return node.finishVariableDeclaration(declarations) + + def parseLexicalBinding(self, kind, options): + init = null + node = Node() + + d = self.parsePattern(); + + # 12.2.1 + if (self.strict and d.type == Syntax.Identifier and isRestrictedWord(d.name)): + self.tolerateError(Messages.StrictVarName); + + if (kind == 'const'): + if (not self.matchKeyword('in')): + self.expect('=') + init = self.isolateCoverGrammar(self.parseAssignmentExpression) + elif ((not options['inFor'] and d.type != Syntax.Identifier) or self.match('=')): + self.expect('='); + init = self.isolateCoverGrammar(self.parseAssignmentExpression); + return node.finishVariableDeclarator(d, init) + + def parseBindingList(self, kind, options): + list = []; + + while True: + list.append(self.parseLexicalBinding(kind, options)); + if (not self.match(',')): + break + self.lex(); + if not (self.startIndex < self.length): + break + return list; + + def parseLexicalDeclaration(self, options): + node = Node(); + + kind = self.lex()['value'] + assert kind == 'let' or kind == 'const', 'Lexical declaration must be either let or const' + declarations = self.parseBindingList(kind, options); + self.consumeSemicolon(); + return node.finishLexicalDeclaration(declarations, kind); + + def parseRestElement(self): + node = Node(); + + self.lex(); + + if (self.match('{')): + self.throwError(Messages.ObjectPatternAsRestParameter) + param = self.parseVariableIdentifier(); + if (self.match('=')): + self.throwError(Messages.DefaultRestParameter); + + if (not self.match(')')): + self.throwError(Messages.ParameterAfterRestParameter); + return node.finishRestElement(param); + + # 12.3 Empty Statement + + def parseEmptyStatement(self, node): + self.expect(';'); + return node.finishEmptyStatement() + + # 12.4 Expression Statement + + def parseExpressionStatement(self, node): + expr = self.parseExpression(); + self.consumeSemicolon(); + return node.finishExpressionStatement(expr); + + # 12.5 If statement + + def parseIfStatement(self, node): + self.expectKeyword('if'); + + self.expect('('); + + test = self.parseExpression(); + + self.expect(')'); + + consequent = self.parseStatement(); + + if (self.matchKeyword('else')): + self.lex(); + alternate = self.parseStatement(); + else: + alternate = null; + return node.finishIfStatement(test, consequent, alternate) + + # 12.6 Iteration Statements + + def parseDoWhileStatement(self, node): + + self.expectKeyword('do') + + oldInIteration = self.state['inIteration'] + self.state['inIteration'] = true + + body = self.parseStatement(); + + self.state['inIteration'] = oldInIteration; + + self.expectKeyword('while'); + + self.expect('('); + + test = self.parseExpression(); + + self.expect(')') + + if (self.match(';')): + self.lex() + return node.finishDoWhileStatement(body, test) + + def parseWhileStatement(self, node): + + self.expectKeyword('while') + + self.expect('(') + + test = self.parseExpression() + + self.expect(')') + + oldInIteration = self.state['inIteration'] + self.state['inIteration'] = true + + body = self.parseStatement() + + self.state['inIteration'] = oldInIteration + + return node.finishWhileStatement(test, body) + + def parseForStatement(self, node): + previousAllowIn = self.state['allowIn'] + + init = test = update = null + + self.expectKeyword('for') + + self.expect('(') + + if (self.match(';')): + self.lex() + else: + if (self.matchKeyword('var')): + init = Node() + self.lex() + + self.state['allowIn'] = false; + init = init.finishVariableDeclaration(self.parseVariableDeclarationList()) + self.state['allowIn'] = previousAllowIn + + if (len(init.declarations) == 1 and self.matchKeyword('in')): + self.lex() + left = init + right = self.parseExpression() + init = null + else: + self.expect(';') + elif (self.matchKeyword('const') or self.matchKeyword('let')): + init = Node() + kind = self.lex()['value'] + + self.state['allowIn'] = false + declarations = self.parseBindingList(kind, {'inFor': true}) + self.state['allowIn'] = previousAllowIn + + if (len(declarations) == 1 and declarations[0].init == null and self.matchKeyword('in')): + init = init.finishLexicalDeclaration(declarations, kind); + self.lex(); + left = init; + right = self.parseExpression(); + init = null; + else: + self.consumeSemicolon(); + init = init.finishLexicalDeclaration(declarations, kind); + else: + initStartToken = self.lookahead + self.state['allowIn'] = false + init = self.inheritCoverGrammar(self.parseAssignmentExpression); + self.state['allowIn'] = previousAllowIn; + + if (self.matchKeyword('in')): + if (not self.isAssignmentTarget): + self.tolerateError(Messages.InvalidLHSInForIn) + self.lex(); + self.reinterpretExpressionAsPattern(init); + left = init; + right = self.parseExpression(); + init = null; + else: + if (self.match(',')): + initSeq = [init]; + while (self.match(',')): + self.lex(); + initSeq.append(self.isolateCoverGrammar(self.parseAssignmentExpression)) + init = WrappingNode(initStartToken).finishSequenceExpression(initSeq) + self.expect(';'); + + if ('left' not in locals()): + if (not self.match(';')): + test = self.parseExpression(); + + self.expect(';'); + + if (not self.match(')')): + update = self.parseExpression(); + + self.expect(')'); + + oldInIteration = self.state['inIteration'] + self.state['inIteration'] = true; + + body = self.isolateCoverGrammar(self.parseStatement) + + self.state['inIteration'] = oldInIteration; + + return node.finishForStatement(init, test, update, body) if ( + 'left' not in locals()) else node.finishForInStatement(left, right, body); + + # 12.7 The continue statement + + def parseContinueStatement(self, node): + label = null + + self.expectKeyword('continue'); + + # Optimize the most common form: 'continue;'. + if ord(self.source[self.startIndex]) == 0x3B: + self.lex(); + if (not self.state['inIteration']): + self.throwError(Messages.IllegalContinue) + return node.finishContinueStatement(null) + if (self.hasLineTerminator): + if (not self.state['inIteration']): + self.throwError(Messages.IllegalContinue); + return node.finishContinueStatement(null); + + if (self.lookahead['type'] == Token.Identifier): + label = self.parseVariableIdentifier(); + + key = '$' + label.name; + if not key in self.state['labelSet']: # todo make sure its correct! + self.throwError(Messages.UnknownLabel, label.name); + self.consumeSemicolon() + + if (label == null and not self.state['inIteration']): + self.throwError(Messages.IllegalContinue) + return node.finishContinueStatement(label) + + # 12.8 The break statement + + def parseBreakStatement(self, node): + label = null + + self.expectKeyword('break'); + + # Catch the very common case first: immediately a semicolon (U+003B). + if (ord(self.source[self.lastIndex]) == 0x3B): + self.lex(); + + if (not (self.state['inIteration'] or self.state['inSwitch'])): + self.throwError(Messages.IllegalBreak) + return node.finishBreakStatement(null) + if (self.hasLineTerminator): + if (not (self.state['inIteration'] or self.state['inSwitch'])): + self.throwError(Messages.IllegalBreak); + return node.finishBreakStatement(null); + if (self.lookahead['type'] == Token.Identifier): + label = self.parseVariableIdentifier(); + + key = '$' + label.name; + if not (key in self.state['labelSet']): + self.throwError(Messages.UnknownLabel, label.name); + self.consumeSemicolon(); + + if (label == null and not (self.state['inIteration'] or self.state['inSwitch'])): + self.throwError(Messages.IllegalBreak) + return node.finishBreakStatement(label); + + # 12.9 The return statement + + def parseReturnStatement(self, node): + argument = null; + + self.expectKeyword('return'); + + if (not self.state['inFunctionBody']): + self.tolerateError(Messages.IllegalReturn); + + # 'return' followed by a space and an identifier is very common. + if (ord(self.source[self.lastIndex]) == 0x20): + if (isIdentifierStart(self.source[self.lastIndex + 1])): + argument = self.parseExpression(); + self.consumeSemicolon(); + return node.finishReturnStatement(argument) + if (self.hasLineTerminator): + # HACK + return node.finishReturnStatement(null) + + if (not self.match(';')): + if (not self.match('}') and self.lookahead['type'] != Token.EOF): + argument = self.parseExpression(); + self.consumeSemicolon(); + + return node.finishReturnStatement(argument); + + # 12.10 The with statement + + def parseWithStatement(self, node): + if (self.strict): + self.tolerateError(Messages.StrictModeWith) + + self.expectKeyword('with'); + + self.expect('('); + + obj = self.parseExpression(); + + self.expect(')'); + + body = self.parseStatement(); + + return node.finishWithStatement(obj, body); + + # 12.10 The swith statement + + def parseSwitchCase(self): + consequent = [] + node = Node(); + + if (self.matchKeyword('default')): + self.lex(); + test = null; + else: + self.expectKeyword('case'); + test = self.parseExpression(); + + self.expect(':'); + + while (self.startIndex < self.length): + if (self.match('}') or self.matchKeyword('default') or self.matchKeyword('case')): + break + statement = self.parseStatementListItem() + consequent.append(statement) + return node.finishSwitchCase(test, consequent) + + def parseSwitchStatement(self, node): + + self.expectKeyword('switch'); + + self.expect('('); + + discriminant = self.parseExpression(); + + self.expect(')'); + + self.expect('{'); + + cases = []; + + if (self.match('}')): + self.lex(); + return node.finishSwitchStatement(discriminant, cases); + + oldInSwitch = self.state['inSwitch']; + self.state['inSwitch'] = true; + defaultFound = false; + + while (self.startIndex < self.length): + if (self.match('}')): + break; + clause = self.parseSwitchCase(); + if (clause.test == null): + if (defaultFound): + self.throwError(Messages.MultipleDefaultsInSwitch); + defaultFound = true; + cases.append(clause); + + self.state['inSwitch'] = oldInSwitch; + + self.expect('}'); + + return node.finishSwitchStatement(discriminant, cases); + + # 12.13 The throw statement + + def parseThrowStatement(self, node): + + self.expectKeyword('throw'); + + if (self.hasLineTerminator): + self.throwError(Messages.NewlineAfterThrow); + + argument = self.parseExpression(); + + self.consumeSemicolon(); + + return node.finishThrowStatement(argument); + + # 12.14 The try statement + + def parseCatchClause(self): + node = Node(); + + self.expectKeyword('catch'); + + self.expect('('); + if (self.match(')')): + self.throwUnexpectedToken(self.lookahead); + param = self.parsePattern(); + + # 12.14.1 + if (self.strict and isRestrictedWord(param.name)): + self.tolerateError(Messages.StrictCatchVariable); + + self.expect(')'); + body = self.parseBlock(); + return node.finishCatchClause(param, body); + + def parseTryStatement(self, node): + handler = null + finalizer = null; + + self.expectKeyword('try'); + + block = self.parseBlock(); + + if (self.matchKeyword('catch')): + handler = self.parseCatchClause() + + if (self.matchKeyword('finally')): + self.lex(); + finalizer = self.parseBlock(); + + if (not handler and not finalizer): + self.throwError(Messages.NoCatchOrFinally) + + return node.finishTryStatement(block, handler, finalizer) + + # 12.15 The debugger statement + + def parseDebuggerStatement(self, node): + self.expectKeyword('debugger'); + + self.consumeSemicolon(); + + return node.finishDebuggerStatement(); + + # 12 Statements + + def parseStatement(self): + typ = self.lookahead['type'] + + if (typ == Token.EOF): + self.throwUnexpectedToken(self.lookahead) + + if (typ == Token.Punctuator and self.lookahead['value'] == '{'): + return self.parseBlock() + + self.isAssignmentTarget = self.isBindingElement = true; + node = Node(); + val = self.lookahead['value'] + + if (typ == Token.Punctuator): + if val == ';': + return self.parseEmptyStatement(node); + elif val == '(': + return self.parseExpressionStatement(node); + elif (typ == Token.Keyword): + if val == 'break': + return self.parseBreakStatement(node); + elif val == 'continue': + return self.parseContinueStatement(node); + elif val == 'debugger': + return self.parseDebuggerStatement(node); + elif val == 'do': + return self.parseDoWhileStatement(node); + elif val == 'for': + return self.parseForStatement(node); + elif val == 'function': + return self.parseFunctionDeclaration(node); + elif val == 'if': + return self.parseIfStatement(node); + elif val == 'return': + return self.parseReturnStatement(node); + elif val == 'switch': + return self.parseSwitchStatement(node); + elif val == 'throw': + return self.parseThrowStatement(node); + elif val == 'try': + return self.parseTryStatement(node); + elif val == 'var': + return self.parseVariableStatement(node); + elif val == 'while': + return self.parseWhileStatement(node); + elif val == 'with': + return self.parseWithStatement(node); + + expr = self.parseExpression(); + + # 12.12 Labelled Statements + if ((expr.type == Syntax.Identifier) and self.match(':')): + self.lex(); + + key = '$' + expr.name + if key in self.state['labelSet']: + self.throwError(Messages.Redeclaration, 'Label', expr.name); + self.state['labelSet'][key] = true + labeledBody = self.parseStatement() + del self.state['labelSet'][key] + return node.finishLabeledStatement(expr, labeledBody) + self.consumeSemicolon(); + return node.finishExpressionStatement(expr) + + # 13 Function Definition + + def parseFunctionSourceElements(self): + body = [] + node = Node() + firstRestricted = None + + self.expect('{') + + while (self.startIndex < self.length): + if (self.lookahead['type'] != Token.StringLiteral): + break + token = self.lookahead; + + statement = self.parseStatementListItem() + body.append(statement) + if (statement.expression.type != Syntax.Literal): + # this is not directive + break + directive = self.source[token['start'] + 1: token['end'] - 1] + if (directive == 'use strict'): + self.strict = true; + if (firstRestricted): + self.tolerateUnexpectedToken(firstRestricted, Messages.StrictOctalLiteral); + else: + if (not firstRestricted and token.get('octal')): + firstRestricted = token; + + oldLabelSet = self.state['labelSet'] + oldInIteration = self.state['inIteration'] + oldInSwitch = self.state['inSwitch'] + oldInFunctionBody = self.state['inFunctionBody'] + oldParenthesisCount = self.state['parenthesizedCount'] + + self.state['labelSet'] = {} + self.state['inIteration'] = false + self.state['inSwitch'] = false + self.state['inFunctionBody'] = true + self.state['parenthesizedCount'] = 0 + + while (self.startIndex < self.length): + if (self.match('}')): + break + body.append(self.parseStatementListItem()) + self.expect('}') + + self.state['labelSet'] = oldLabelSet; + self.state['inIteration'] = oldInIteration; + self.state['inSwitch'] = oldInSwitch; + self.state['inFunctionBody'] = oldInFunctionBody; + self.state['parenthesizedCount'] = oldParenthesisCount; + + return node.finishBlockStatement(body) + + def validateParam(self, options, param, name): + key = '$' + name + if (self.strict): + if (isRestrictedWord(name)): + options['stricted'] = param; + options['message'] = Messages.StrictParamName + if key in options['paramSet']: + options['stricted'] = param; + options['message'] = Messages.StrictParamDupe; + elif (not options['firstRestricted']): + if (isRestrictedWord(name)): + options['firstRestricted'] = param; + options['message'] = Messages.StrictParamName; + elif (isStrictModeReservedWord(name)): + options['firstRestricted'] = param; + options['message'] = Messages.StrictReservedWord; + elif key in options['paramSet']: + options['firstRestricted'] = param + options['message'] = Messages.StrictParamDupe; + options['paramSet'][key] = true + + def parseParam(self, options): + token = self.lookahead + de = None + if (token['value'] == '...'): + param = self.parseRestElement(); + self.validateParam(options, param.argument, param.argument.name); + options['params'].append(param); + options['defaults'].append(null); + return false + param = self.parsePatternWithDefault(); + self.validateParam(options, token, token['value']); + + if (param.type == Syntax.AssignmentPattern): + de = param.right; + param = param.left; + options['defaultCount'] += 1 + options['params'].append(param); + options['defaults'].append(de) + return not self.match(')') + + def parseParams(self, firstRestricted): + options = { + 'params': [], + 'defaultCount': 0, + 'defaults': [], + 'firstRestricted': firstRestricted} + + self.expect('('); + + if (not self.match(')')): + options['paramSet'] = {}; + while (self.startIndex < self.length): + if (not self.parseParam(options)): + break + self.expect(','); + self.expect(')'); + + if (options['defaultCount'] == 0): + options['defaults'] = []; + + return { + 'params': options['params'], + 'defaults': options['defaults'], + 'stricted': options.get('stricted'), + 'firstRestricted': options.get('firstRestricted'), + 'message': options.get('message')} + + def parseFunctionDeclaration(self, node, identifierIsOptional=None): + d = null + params = [] + defaults = [] + message = None + firstRestricted = None + + self.expectKeyword('function'); + if (identifierIsOptional or not self.match('(')): + token = self.lookahead; + d = self.parseVariableIdentifier(); + if (self.strict): + if (isRestrictedWord(token['value'])): + self.tolerateUnexpectedToken(token, Messages.StrictFunctionName); + else: + if (isRestrictedWord(token['value'])): + firstRestricted = token; + message = Messages.StrictFunctionName; + elif (isStrictModeReservedWord(token['value'])): + firstRestricted = token; + message = Messages.StrictReservedWord; + + tmp = self.parseParams(firstRestricted); + params = tmp['params'] + defaults = tmp['defaults'] + stricted = tmp.get('stricted') + firstRestricted = tmp['firstRestricted'] + if (tmp.get('message')): + message = tmp['message']; + + previousStrict = self.strict; + body = self.parseFunctionSourceElements(); + if (self.strict and firstRestricted): + self.throwUnexpectedToken(firstRestricted, message); + + if (self.strict and stricted): + self.tolerateUnexpectedToken(stricted, message); + self.strict = previousStrict; + + return node.finishFunctionDeclaration(d, params, defaults, body); + + def parseFunctionExpression(self): + id = null + params = [] + defaults = [] + node = Node(); + firstRestricted = None + message = None + + self.expectKeyword('function'); + + if (not self.match('(')): + token = self.lookahead; + id = self.parseVariableIdentifier(); + if (self.strict): + if (isRestrictedWord(token['value'])): + self.tolerateUnexpectedToken(token, Messages.StrictFunctionName); + else: + if (isRestrictedWord(token['value'])): + firstRestricted = token; + message = Messages.StrictFunctionName; + elif (isStrictModeReservedWord(token['value'])): + firstRestricted = token; + message = Messages.StrictReservedWord; + tmp = self.parseParams(firstRestricted); + params = tmp['params'] + defaults = tmp['defaults'] + stricted = tmp.get('stricted') + firstRestricted = tmp['firstRestricted'] + if (tmp.get('message')): + message = tmp['message'] + + previousStrict = self.strict; + body = self.parseFunctionSourceElements(); + if (self.strict and firstRestricted): + self.throwUnexpectedToken(firstRestricted, message); + if (self.strict and stricted): + self.tolerateUnexpectedToken(stricted, message); + self.strict = previousStrict; + + return node.finishFunctionExpression(id, params, defaults, body); + + # todo Translate parse class functions! + + def parseClassExpression(self): + raise NotImplementedError() + + def parseClassDeclaration(self): + raise NotImplementedError() + + # 14 Program + + def parseScriptBody(self): + body = [] + firstRestricted = None + + while (self.startIndex < self.length): + token = self.lookahead; + if (token['type'] != Token.StringLiteral): + break + statement = self.parseStatementListItem(); + body.append(statement); + if (statement.expression.type != Syntax.Literal): + # this is not directive + break + directive = self.source[token['start'] + 1: token['end'] - 1] + if (directive == 'use strict'): + self.strict = true; + if (firstRestricted): + self.tolerateUnexpectedToken(firstRestricted, Messages.StrictOctalLiteral) + else: + if (not firstRestricted and token.get('octal')): + firstRestricted = token; + while (self.startIndex < self.length): + statement = self.parseStatementListItem(); + # istanbul ignore if + if (statement is None): + break + body.append(statement); + return body; + + def parseProgram(self): + self.peek() + node = Node() + + body = self.parseScriptBody() + return node.finishProgram(body) + + # DONE!!! + def parse(self, code, options={}): + if options: + raise NotImplementedError('Options not implemented! You can only use default settings.') + + self.clean() + self.source = unicode(code) + ' \n ; //END' # I have to add it in order not to check for EOF every time + self.index = 0 + self.lineNumber = 1 if len(self.source) > 0 else 0 + self.lineStart = 0 + self.startIndex = self.index + self.startLineNumber = self.lineNumber; + self.startLineStart = self.lineStart; + self.length = len(self.source) + self.lookahead = null; + self.state = { + 'allowIn': true, + 'labelSet': {}, + 'inFunctionBody': false, + 'inIteration': false, + 'inSwitch': false, + 'lastCommentStart': -1, + 'curlyStack': [], + 'parenthesizedCount': None} + self.sourceType = 'script'; + self.strict = false; + program = self.parseProgram(); + return node_to_dict(program) + + + +def parse(javascript_code): + """Returns syntax tree of javascript_code. + Same as PyJsParser().parse For your convenience :) """ + p = PyJsParser() + return p.parse(javascript_code) + + +if __name__ == '__main__': + import time + + test_path = None + if test_path: + f = open(test_path, 'rb') + x = f.read() + f.close() + else: + x = 'var $ = "Hello!"' + p = PyJsParser() + t = time.time() + res = p.parse(x) + dt = time.time() - t + 0.000000001 + if test_path: + print(len(res)) + else: + pprint(res) + print() + print('Parsed everyting in', round(dt, 5), 'seconds.') + print('Thats %d characters per second' % int(len(x) / dt)) + + + diff --git a/Contents/Libraries/Shared/pyjsparser/pyjsparserdata.py b/Contents/Libraries/Shared/pyjsparser/pyjsparserdata.py new file mode 100644 index 000000000..1d6ab2ee2 --- /dev/null +++ b/Contents/Libraries/Shared/pyjsparser/pyjsparserdata.py @@ -0,0 +1,303 @@ +# The MIT License +# +# Copyright 2014, 2015 Piotr Dabkowski +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the 'Software'), +# to deal in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, subject +# to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies or +# substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +# LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +# OR THE USE OR OTHER DEALINGS IN THE SOFTWARE +from __future__ import unicode_literals + +import sys +import unicodedata +from collections import defaultdict + +PY3 = sys.version_info >= (3,0) + +if PY3: + unichr = chr + xrange = range + unicode = str + +token = { + 'BooleanLiteral': 1, + 'EOF': 2, + 'Identifier': 3, + 'Keyword': 4, + 'NullLiteral': 5, + 'NumericLiteral': 6, + 'Punctuator': 7, + 'StringLiteral': 8, + 'RegularExpression': 9, + 'Template': 10 + } + + +TokenName = dict((v,k) for k,v in token.items()) + +FnExprTokens = ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new', + 'return', 'case', 'delete', 'throw', 'void', + # assignment operators + '=', '+=', '-=', '*=', '/=', '%=', '<<=', '>>=', '>>>=', + '&=', '|=', '^=', ',', + # binary/unary operators + '+', '-', '*', '/', '%', '++', '--', '<<', '>>', '>>>', '&', + '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=', + '<=', '<', '>', '!=', '!=='] + +syntax= set(('AssignmentExpression', + 'AssignmentPattern', + 'ArrayExpression', + 'ArrayPattern', + 'ArrowFunctionExpression', + 'BlockStatement', + 'BinaryExpression', + 'BreakStatement', + 'CallExpression', + 'CatchClause', + 'ClassBody', + 'ClassDeclaration', + 'ClassExpression', + 'ConditionalExpression', + 'ContinueStatement', + 'DoWhileStatement', + 'DebuggerStatement', + 'EmptyStatement', + 'ExportAllDeclaration', + 'ExportDefaultDeclaration', + 'ExportNamedDeclaration', + 'ExportSpecifier', + 'ExpressionStatement', + 'ForStatement', + 'ForInStatement', + 'FunctionDeclaration', + 'FunctionExpression', + 'Identifier', + 'IfStatement', + 'ImportDeclaration', + 'ImportDefaultSpecifier', + 'ImportNamespaceSpecifier', + 'ImportSpecifier', + 'Literal', + 'LabeledStatement', + 'LogicalExpression', + 'MemberExpression', + 'MethodDefinition', + 'NewExpression', + 'ObjectExpression', + 'ObjectPattern', + 'Program', + 'Property', + 'RestElement', + 'ReturnStatement', + 'SequenceExpression', + 'SpreadElement', + 'Super', + 'SwitchCase', + 'SwitchStatement', + 'TaggedTemplateExpression', + 'TemplateElement', + 'TemplateLiteral', + 'ThisExpression', + 'ThrowStatement', + 'TryStatement', + 'UnaryExpression', + 'UpdateExpression', + 'VariableDeclaration', + 'VariableDeclarator', + 'WhileStatement', + 'WithStatement')) + + +# Error messages should be identical to V8. +messages = { + 'UnexpectedToken': 'Unexpected token %s', + 'UnexpectedNumber': 'Unexpected number', + 'UnexpectedString': 'Unexpected string', + 'UnexpectedIdentifier': 'Unexpected identifier', + 'UnexpectedReserved': 'Unexpected reserved word', + 'UnexpectedTemplate': 'Unexpected quasi %s', + 'UnexpectedEOS': 'Unexpected end of input', + 'NewlineAfterThrow': 'Illegal newline after throw', + 'InvalidRegExp': 'Invalid regular expression', + 'UnterminatedRegExp': 'Invalid regular expression: missing /', + 'InvalidLHSInAssignment': 'Invalid left-hand side in assignment', + 'InvalidLHSInForIn': 'Invalid left-hand side in for-in', + 'MultipleDefaultsInSwitch': 'More than one default clause in switch statement', + 'NoCatchOrFinally': 'Missing catch or finally after try', + 'UnknownLabel': 'Undefined label \'%s\'', + 'Redeclaration': '%s \'%s\' has already been declared', + 'IllegalContinue': 'Illegal continue statement', + 'IllegalBreak': 'Illegal break statement', + 'IllegalReturn': 'Illegal return statement', + 'StrictModeWith': 'Strict mode code may not include a with statement', + 'StrictCatchVariable': 'Catch variable may not be eval or arguments in strict mode', + 'StrictVarName': 'Variable name may not be eval or arguments in strict mode', + 'StrictParamName': 'Parameter name eval or arguments is not allowed in strict mode', + 'StrictParamDupe': 'Strict mode function may not have duplicate parameter names', + 'StrictFunctionName': 'Function name may not be eval or arguments in strict mode', + 'StrictOctalLiteral': 'Octal literals are not allowed in strict mode.', + 'StrictDelete': 'Delete of an unqualified identifier in strict mode.', + 'StrictLHSAssignment': 'Assignment to eval or arguments is not allowed in strict mode', + 'StrictLHSPostfix': 'Postfix increment/decrement may not have eval or arguments operand in strict mode', + 'StrictLHSPrefix': 'Prefix increment/decrement may not have eval or arguments operand in strict mode', + 'StrictReservedWord': 'Use of future reserved word in strict mode', + 'TemplateOctalLiteral': 'Octal literals are not allowed in template strings.', + 'ParameterAfterRestParameter': 'Rest parameter must be last formal parameter', + 'DefaultRestParameter': 'Unexpected token =', + 'ObjectPatternAsRestParameter': 'Unexpected token {', + 'DuplicateProtoProperty': 'Duplicate __proto__ fields are not allowed in object literals', + 'ConstructorSpecialMethod': 'Class constructor may not be an accessor', + 'DuplicateConstructor': 'A class may only have one constructor', + 'StaticPrototype': 'Classes may not have static property named prototype', + 'MissingFromClause': 'Unexpected token', + 'NoAsAfterImportNamespace': 'Unexpected token', + 'InvalidModuleSpecifier': 'Unexpected token', + 'IllegalImportDeclaration': 'Unexpected token', + 'IllegalExportDeclaration': 'Unexpected token'} + +PRECEDENCE = {'||':1, + '&&':2, + '|':3, + '^':4, + '&':5, + '==':6, + '!=':6, + '===':6, + '!==':6, + '<':7, + '>':7, + '<=':7, + '>=':7, + 'instanceof':7, + 'in':7, + '<<':8, + '>>':8, + '>>>':8, + '+':9, + '-':9, + '*':11, + '/':11, + '%':11} + +class Token: pass +class Syntax: pass +class Messages: pass +class PlaceHolders: + ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder' + +for k,v in token.items(): + setattr(Token, k, v) + +for e in syntax: + setattr(Syntax, e, e) + +for k,v in messages.items(): + setattr(Messages, k, v) + +#http://stackoverflow.com/questions/14245893/efficiently-list-all-characters-in-a-given-unicode-category +BOM = u'\uFEFF' +ZWJ = u'\u200D' +ZWNJ = u'\u200C' +TAB = u'\u0009' +VT = u'\u000B' +FF = u'\u000C' +SP = u'\u0020' +NBSP = u'\u00A0' +LF = u'\u000A' +CR = u'\u000D' +LS = u'\u2028' +PS = u'\u2029' + +U_CATEGORIES = defaultdict(list) +for c in map(unichr, range(sys.maxunicode + 1)): + U_CATEGORIES[unicodedata.category(c)].append(c) +UNICODE_LETTER = set(U_CATEGORIES['Lu']+U_CATEGORIES['Ll']+ + U_CATEGORIES['Lt']+U_CATEGORIES['Lm']+ + U_CATEGORIES['Lo']+U_CATEGORIES['Nl']) +UNICODE_COMBINING_MARK = set(U_CATEGORIES['Mn']+U_CATEGORIES['Mc']) +UNICODE_DIGIT = set(U_CATEGORIES['Nd']) +UNICODE_CONNECTOR_PUNCTUATION = set(U_CATEGORIES['Pc']) +IDENTIFIER_START = UNICODE_LETTER.union(set(('$','_', '\\'))) # and some fucking unicode escape sequence +IDENTIFIER_PART = IDENTIFIER_START.union(UNICODE_COMBINING_MARK).union(UNICODE_DIGIT)\ + .union(UNICODE_CONNECTOR_PUNCTUATION).union(set((ZWJ, ZWNJ))) + +WHITE_SPACE = set((0x20, 0x09, 0x0B, 0x0C, 0xA0, 0x1680, + 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, + 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, + 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, + 0xFEFF)) + +LINE_TERMINATORS = set((0x0A, 0x0D, 0x2028, 0x2029)) + +def isIdentifierStart(ch): + return (ch if isinstance(ch, unicode) else unichr(ch)) in IDENTIFIER_START + +def isIdentifierPart(ch): + return (ch if isinstance(ch, unicode) else unichr(ch)) in IDENTIFIER_PART + +def isWhiteSpace(ch): + return (ord(ch) if isinstance(ch, unicode) else ch) in WHITE_SPACE + +def isLineTerminator(ch): + return (ord(ch) if isinstance(ch, unicode) else ch) in LINE_TERMINATORS + +OCTAL = set(('0', '1', '2', '3', '4', '5', '6', '7')) +DEC = set(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')) +HEX = set('0123456789abcdefABCDEF') +HEX_CONV = dict(('0123456789abcdef'[n],n) for n in xrange(16)) +for i,e in enumerate('ABCDEF', 10): + HEX_CONV[e] = i + + +def isDecimalDigit(ch): + return (ch if isinstance(ch, unicode) else unichr(ch)) in DEC + +def isHexDigit(ch): + return (ch if isinstance(ch, unicode) else unichr(ch)) in HEX + +def isOctalDigit(ch): + return (ch if isinstance(ch, unicode) else unichr(ch)) in OCTAL + +def isFutureReservedWord(w): + return w in ('enum', 'export', 'import', 'super') + + +RESERVED_WORD = set(('implements', 'interface', 'package', 'private', 'protected', 'public', 'static', 'yield', 'let')) +def isStrictModeReservedWord(w): + return w in RESERVED_WORD + +def isRestrictedWord(w): + return w in ('eval', 'arguments') + + +KEYWORDS = set(('if', 'in', 'do', 'var', 'for', 'new', 'try', 'let', 'this', 'else', 'case', + 'void', 'with', 'enum', 'while', 'break', 'catch', 'throw', 'const', 'yield', + 'class', 'super', 'return', 'typeof', 'delete', 'switch', 'export', 'import', + 'default', 'finally', 'extends', 'function', 'continue', 'debugger', 'instanceof', 'pyimport')) +def isKeyword(w): + # 'const' is specialized as Keyword in V8. + # 'yield' and 'let' are for compatibility with SpiderMonkey and ES.next. + # Some others are from future reserved words. + return w in KEYWORDS + + +class JsSyntaxError(Exception): pass + +if __name__=='__main__': + assert isLineTerminator('\n') + assert isLineTerminator(0x0A) + assert isIdentifierStart('$') + assert isIdentifierStart(100) + assert isWhiteSpace(' ') \ No newline at end of file diff --git a/Contents/Libraries/Shared/pyjsparser/std_nodes.py b/Contents/Libraries/Shared/pyjsparser/std_nodes.py new file mode 100644 index 000000000..a4b37ca3d --- /dev/null +++ b/Contents/Libraries/Shared/pyjsparser/std_nodes.py @@ -0,0 +1,471 @@ +from .pyjsparserdata import * + + +class BaseNode: + def finish(self): + pass + + def finishArrayExpression(self, elements): + self.type = Syntax.ArrayExpression + self.elements = elements + self.finish() + return self + + def finishArrayPattern(self, elements): + self.type = Syntax.ArrayPattern + self.elements = elements + self.finish() + return self + + def finishArrowFunctionExpression(self, params, defaults, body, expression): + self.type = Syntax.ArrowFunctionExpression + self.id = None + self.params = params + self.defaults = defaults + self.body = body + self.generator = False + self.expression = expression + self.finish() + return self + + def finishAssignmentExpression(self, operator, left, right): + self.type = Syntax.AssignmentExpression + self.operator = operator + self.left = left + self.right = right + self.finish() + return self + + def finishAssignmentPattern(self, left, right): + self.type = Syntax.AssignmentPattern + self.left = left + self.right = right + self.finish() + return self + + def finishBinaryExpression(self, operator, left, right): + self.type = Syntax.LogicalExpression if (operator == '||' or operator == '&&') else Syntax.BinaryExpression + self.operator = operator + self.left = left + self.right = right + self.finish() + return self + + def finishBlockStatement(self, body): + self.type = Syntax.BlockStatement + self.body = body + self.finish() + return self + + def finishBreakStatement(self, label): + self.type = Syntax.BreakStatement + self.label = label + self.finish() + return self + + def finishCallExpression(self, callee, args): + self.type = Syntax.CallExpression + self.callee = callee + self.arguments = args + self.finish() + return self + + def finishCatchClause(self, param, body): + self.type = Syntax.CatchClause + self.param = param + self.body = body + self.finish() + return self + + def finishClassBody(self, body): + self.type = Syntax.ClassBody + self.body = body + self.finish() + return self + + def finishClassDeclaration(self, id, superClass, body): + self.type = Syntax.ClassDeclaration + self.id = id + self.superClass = superClass + self.body = body + self.finish() + return self + + def finishClassExpression(self, id, superClass, body): + self.type = Syntax.ClassExpression + self.id = id + self.superClass = superClass + self.body = body + self.finish() + return self + + def finishConditionalExpression(self, test, consequent, alternate): + self.type = Syntax.ConditionalExpression + self.test = test + self.consequent = consequent + self.alternate = alternate + self.finish() + return self + + def finishContinueStatement(self, label): + self.type = Syntax.ContinueStatement + self.label = label + self.finish() + return self + + def finishDebuggerStatement(self, ): + self.type = Syntax.DebuggerStatement + self.finish() + return self + + def finishDoWhileStatement(self, body, test): + self.type = Syntax.DoWhileStatement + self.body = body + self.test = test + self.finish() + return self + + def finishEmptyStatement(self, ): + self.type = Syntax.EmptyStatement + self.finish() + return self + + def finishExpressionStatement(self, expression): + self.type = Syntax.ExpressionStatement + self.expression = expression + self.finish() + return self + + def finishForStatement(self, init, test, update, body): + self.type = Syntax.ForStatement + self.init = init + self.test = test + self.update = update + self.body = body + self.finish() + return self + + def finishForInStatement(self, left, right, body): + self.type = Syntax.ForInStatement + self.left = left + self.right = right + self.body = body + self.each = False + self.finish() + return self + + def finishFunctionDeclaration(self, id, params, defaults, body): + self.type = Syntax.FunctionDeclaration + self.id = id + self.params = params + self.defaults = defaults + self.body = body + self.generator = False + self.expression = False + self.finish() + return self + + def finishFunctionExpression(self, id, params, defaults, body): + self.type = Syntax.FunctionExpression + self.id = id + self.params = params + self.defaults = defaults + self.body = body + self.generator = False + self.expression = False + self.finish() + return self + + def finishIdentifier(self, name): + self.type = Syntax.Identifier + self.name = name + self.finish() + return self + + def finishIfStatement(self, test, consequent, alternate): + self.type = Syntax.IfStatement + self.test = test + self.consequent = consequent + self.alternate = alternate + self.finish() + return self + + def finishLabeledStatement(self, label, body): + self.type = Syntax.LabeledStatement + self.label = label + self.body = body + self.finish() + return self + + def finishLiteral(self, token): + self.type = Syntax.Literal + self.value = token['value'] + self.raw = None # todo fix it? + if token.get('regex'): + self.regex = token['regex'] + self.finish() + return self + + def finishMemberExpression(self, accessor, object, property): + self.type = Syntax.MemberExpression + self.computed = accessor == '[' + self.object = object + self.property = property + self.finish() + return self + + def finishNewExpression(self, callee, args): + self.type = Syntax.NewExpression + self.callee = callee + self.arguments = args + self.finish() + return self + + def finishObjectExpression(self, properties): + self.type = Syntax.ObjectExpression + self.properties = properties + self.finish() + return self + + def finishObjectPattern(self, properties): + self.type = Syntax.ObjectPattern + self.properties = properties + self.finish() + return self + + def finishPostfixExpression(self, operator, argument): + self.type = Syntax.UpdateExpression + self.operator = operator + self.argument = argument + self.prefix = False + self.finish() + return self + + def finishProgram(self, body): + self.type = Syntax.Program + self.body = body + self.finish() + return self + + def finishPyimport(self, imp): + self.type = 'PyimportStatement' + self.imp = imp + self.finish() + return self + + def finishProperty(self, kind, key, computed, value, method, shorthand): + self.type = Syntax.Property + self.key = key + self.computed = computed + self.value = value + self.kind = kind + self.method = method + self.shorthand = shorthand + self.finish() + return self + + def finishRestElement(self, argument): + self.type = Syntax.RestElement + self.argument = argument + self.finish() + return self + + def finishReturnStatement(self, argument): + self.type = Syntax.ReturnStatement + self.argument = argument + self.finish() + return self + + def finishSequenceExpression(self, expressions): + self.type = Syntax.SequenceExpression + self.expressions = expressions + self.finish() + return self + + def finishSpreadElement(self, argument): + self.type = Syntax.SpreadElement + self.argument = argument + self.finish() + return self + + def finishSwitchCase(self, test, consequent): + self.type = Syntax.SwitchCase + self.test = test + self.consequent = consequent + self.finish() + return self + + def finishSuper(self, ): + self.type = Syntax.Super + self.finish() + return self + + def finishSwitchStatement(self, discriminant, cases): + self.type = Syntax.SwitchStatement + self.discriminant = discriminant + self.cases = cases + self.finish() + return self + + def finishTaggedTemplateExpression(self, tag, quasi): + self.type = Syntax.TaggedTemplateExpression + self.tag = tag + self.quasi = quasi + self.finish() + return self + + def finishTemplateElement(self, value, tail): + self.type = Syntax.TemplateElement + self.value = value + self.tail = tail + self.finish() + return self + + def finishTemplateLiteral(self, quasis, expressions): + self.type = Syntax.TemplateLiteral + self.quasis = quasis + self.expressions = expressions + self.finish() + return self + + def finishThisExpression(self, ): + self.type = Syntax.ThisExpression + self.finish() + return self + + def finishThrowStatement(self, argument): + self.type = Syntax.ThrowStatement + self.argument = argument + self.finish() + return self + + def finishTryStatement(self, block, handler, finalizer): + self.type = Syntax.TryStatement + self.block = block + self.guardedHandlers = [] + self.handlers = [handler] if handler else [] + self.handler = handler + self.finalizer = finalizer + self.finish() + return self + + def finishUnaryExpression(self, operator, argument): + self.type = Syntax.UpdateExpression if (operator == '++' or operator == '--') else Syntax.UnaryExpression + self.operator = operator + self.argument = argument + self.prefix = True + self.finish() + return self + + def finishVariableDeclaration(self, declarations): + self.type = Syntax.VariableDeclaration + self.declarations = declarations + self.kind = 'var' + self.finish() + return self + + def finishLexicalDeclaration(self, declarations, kind): + self.type = Syntax.VariableDeclaration + self.declarations = declarations + self.kind = kind + self.finish() + return self + + def finishVariableDeclarator(self, id, init): + self.type = Syntax.VariableDeclarator + self.id = id + self.init = init + self.finish() + return self + + def finishWhileStatement(self, test, body): + self.type = Syntax.WhileStatement + self.test = test + self.body = body + self.finish() + return self + + def finishWithStatement(self, object, body): + self.type = Syntax.WithStatement + self.object = object + self.body = body + self.finish() + return self + + def finishExportSpecifier(self, local, exported): + self.type = Syntax.ExportSpecifier + self.exported = exported or local + self.local = local + self.finish() + return self + + def finishImportDefaultSpecifier(self, local): + self.type = Syntax.ImportDefaultSpecifier + self.local = local + self.finish() + return self + + def finishImportNamespaceSpecifier(self, local): + self.type = Syntax.ImportNamespaceSpecifier + self.local = local + self.finish() + return self + + def finishExportNamedDeclaration(self, declaration, specifiers, src): + self.type = Syntax.ExportNamedDeclaration + self.declaration = declaration + self.specifiers = specifiers + self.source = src + self.finish() + return self + + def finishExportDefaultDeclaration(self, declaration): + self.type = Syntax.ExportDefaultDeclaration + self.declaration = declaration + self.finish() + return self + + def finishExportAllDeclaration(self, src): + self.type = Syntax.ExportAllDeclaration + self.source = src + self.finish() + return self + + def finishImportSpecifier(self, local, imported): + self.type = Syntax.ImportSpecifier + self.local = local or imported + self.imported = imported + self.finish() + return self + + def finishImportDeclaration(self, specifiers, src): + self.type = Syntax.ImportDeclaration + self.specifiers = specifiers + self.source = src + self.finish() + return self + + def __getitem__(self, item): + return getattr(self, item) + + def __setitem__(self, key, value): + setattr(self, key, value) + + +class Node(BaseNode): + pass + + +class WrappingNode(BaseNode): + def __init__(self, startToken=None): + pass + + +def node_to_dict(node): # extremely important for translation speed + if isinstance(node, list): + return [node_to_dict(e) for e in node] + elif isinstance(node, dict): + return dict((k, node_to_dict(v)) for k, v in node.items()) + elif not isinstance(node, BaseNode): + return node + return dict((k, node_to_dict(v)) for k, v in node.__dict__.items()) diff --git a/Contents/Libraries/Shared/requests_toolbelt/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/__init__.py new file mode 100644 index 000000000..e7c3ccb63 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/__init__.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +""" +requests-toolbelt +================= + +See https://toolbelt.readthedocs.io/ for documentation + +:copyright: (c) 2014 by Ian Cordasco and Cory Benfield +:license: Apache v2.0, see LICENSE for more details +""" + +from .adapters import SSLAdapter, SourceAddressAdapter +from .auth.guess import GuessAuth +from .multipart import ( + MultipartEncoder, MultipartEncoderMonitor, MultipartDecoder, + ImproperBodyPartContentException, NonMultipartContentTypeException + ) +from .streaming_iterator import StreamingIterator +from .utils.user_agent import user_agent + +__title__ = 'requests-toolbelt' +__authors__ = 'Ian Cordasco, Cory Benfield' +__license__ = 'Apache v2.0' +__copyright__ = 'Copyright 2014 Ian Cordasco, Cory Benfield' +__version__ = '0.9.1' +__version_info__ = tuple(int(i) for i in __version__.split('.')) + +__all__ = [ + 'GuessAuth', 'MultipartEncoder', 'MultipartEncoderMonitor', + 'MultipartDecoder', 'SSLAdapter', 'SourceAddressAdapter', + 'StreamingIterator', 'user_agent', 'ImproperBodyPartContentException', + 'NonMultipartContentTypeException', '__title__', '__authors__', + '__license__', '__copyright__', '__version__', '__version_info__', +] diff --git a/Contents/Libraries/Shared/requests_toolbelt/_compat.py b/Contents/Libraries/Shared/requests_toolbelt/_compat.py new file mode 100644 index 000000000..7927a382f --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/_compat.py @@ -0,0 +1,324 @@ +"""Private module full of compatibility hacks. + +Primarily this is for downstream redistributions of requests that unvendor +urllib3 without providing a shim. + +.. warning:: + + This module is private. If you use it, and something breaks, you were + warned +""" +import sys + +import requests + +try: + from requests.packages.urllib3 import fields + from requests.packages.urllib3 import filepost + from requests.packages.urllib3 import poolmanager +except ImportError: + from urllib3 import fields + from urllib3 import filepost + from urllib3 import poolmanager + +try: + from requests.packages.urllib3.connection import HTTPConnection + from requests.packages.urllib3 import connection +except ImportError: + try: + from urllib3.connection import HTTPConnection + from urllib3 import connection + except ImportError: + HTTPConnection = None + connection = None + + +if requests.__build__ < 0x020300: + timeout = None +else: + try: + from requests.packages.urllib3.util import timeout + except ImportError: + from urllib3.util import timeout + +if requests.__build__ < 0x021000: + gaecontrib = None +else: + try: + from requests.packages.urllib3.contrib import appengine as gaecontrib + except ImportError: + from urllib3.contrib import appengine as gaecontrib + +if requests.__build__ < 0x021200: + PyOpenSSLContext = None +else: + try: + from requests.packages.urllib3.contrib.pyopenssl \ + import PyOpenSSLContext + except ImportError: + try: + from urllib3.contrib.pyopenssl import PyOpenSSLContext + except ImportError: + PyOpenSSLContext = None + +PY3 = sys.version_info > (3, 0) + +if PY3: + from collections.abc import Mapping, MutableMapping + import queue + from urllib.parse import urlencode, urljoin +else: + from collections import Mapping, MutableMapping + import Queue as queue + from urllib import urlencode + from urlparse import urljoin + +try: + basestring = basestring +except NameError: + basestring = (str, bytes) + + +class HTTPHeaderDict(MutableMapping): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + """ + + def __init__(self, headers=None, **kwargs): + super(HTTPHeaderDict, self).__init__() + self._container = {} + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key, val): + self._container[key.lower()] = (key, val) + return self._container[key.lower()] + + def __getitem__(self, key): + val = self._container[key.lower()] + return ', '.join(val[1:]) + + def __delitem__(self, key): + del self._container[key.lower()] + + def __contains__(self, key): + return key.lower() in self._container + + def __eq__(self, other): + if not isinstance(other, Mapping) and not hasattr(other, 'keys'): + return False + if not isinstance(other, type(self)): + other = type(self)(other) + return ({k.lower(): v for k, v in self.itermerged()} == + {k.lower(): v for k, v in other.itermerged()}) + + def __ne__(self, other): + return not self.__eq__(other) + + if not PY3: # Python 2 + iterkeys = MutableMapping.iterkeys + itervalues = MutableMapping.itervalues + + __marker = object() + + def __len__(self): + return len(self._container) + + def __iter__(self): + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def pop(self, key, default=__marker): + """D.pop(k[,d]) -> v, remove specified key and return its value. + + If key is not found, d is returned if given, otherwise KeyError is + raised. + """ + # Using the MutableMapping function directly fails due to the private + # marker. + # Using ordinary dict.pop would expose the internal structures. + # So let's reinvent the wheel. + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def discard(self, key): + try: + del self[key] + except KeyError: + pass + + def add(self, key, val): + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + """ + key_lower = key.lower() + new_vals = key, val + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + # new_vals was not inserted, as there was a previous one + if isinstance(vals, list): + # If already several items got inserted, we have a list + vals.append(val) + else: + # vals should be a tuple then, i.e. only one item so far + # Need to convert the tuple to list for further extension + self._container[key_lower] = [vals[0], vals[1], val] + + def extend(self, *args, **kwargs): + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError("extend() takes at most 1 positional " + "arguments ({} given)".format(len(args))) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, Mapping): + for key in other: + self.add(key, other[key]) + elif hasattr(other, "keys"): + for key in other.keys(): + self.add(key, other[key]) + else: + for key, value in other: + self.add(key, value) + + for key, value in kwargs.items(): + self.add(key, value) + + def getlist(self, key): + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + try: + vals = self._container[key.lower()] + except KeyError: + return [] + else: + if isinstance(vals, tuple): + return [vals[1]] + else: + return vals[1:] + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + def __repr__(self): + return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) + + def _copy_from(self, other): + for key in other: + val = other.getlist(key) + if isinstance(val, list): + # Don't need to convert tuples + val = list(val) + self._container[key.lower()] = [key] + val + + def copy(self): + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self): + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self): + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ', '.join(val[1:]) + + def items(self): + return list(self.iteritems()) + + @classmethod + def from_httplib(cls, message): # Python 2 + """Read headers from a Python 2 httplib message object.""" + # python2.7 does not expose a proper API for exporting multiheaders + # efficiently. This function re-reads raw lines from the message + # object and extracts the multiheaders properly. + headers = [] + + for line in message.headers: + if line.startswith((' ', '\t')): + key, value = headers[-1] + headers[-1] = (key, value + '\r\n' + line.rstrip()) + continue + + key, value = line.split(':', 1) + headers.append((key, value.strip())) + + return cls(headers) + + +__all__ = ( + 'basestring', + 'connection', + 'fields', + 'filepost', + 'poolmanager', + 'timeout', + 'HTTPHeaderDict', + 'queue', + 'urlencode', + 'gaecontrib', + 'urljoin', + 'PyOpenSSLContext', +) diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/__init__.py new file mode 100644 index 000000000..7195f43e3 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/__init__.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +""" +requests-toolbelt.adapters +========================== + +See https://toolbelt.readthedocs.io/ for documentation + +:copyright: (c) 2014 by Ian Cordasco and Cory Benfield +:license: Apache v2.0, see LICENSE for more details +""" + +from .ssl import SSLAdapter +from .source import SourceAddressAdapter + +__all__ = ['SSLAdapter', 'SourceAddressAdapter'] diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/appengine.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/appengine.py new file mode 100644 index 000000000..25a70a176 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/appengine.py @@ -0,0 +1,206 @@ +# -*- coding: utf-8 -*- +"""The App Engine Transport Adapter for requests. + +.. versionadded:: 0.6.0 + +This requires a version of requests >= 2.10.0 and Python 2. + +There are two ways to use this library: + +#. If you're using requests directly, you can use code like: + + .. code-block:: python + + >>> import requests + >>> import ssl + >>> import requests.packages.urllib3.contrib.appengine as ul_appengine + >>> from requests_toolbelt.adapters import appengine + >>> s = requests.Session() + >>> if ul_appengine.is_appengine_sandbox(): + ... s.mount('http://', appengine.AppEngineAdapter()) + ... s.mount('https://', appengine.AppEngineAdapter()) + +#. If you depend on external libraries which use requests, you can use code + like: + + .. code-block:: python + + >>> from requests_toolbelt.adapters import appengine + >>> appengine.monkeypatch() + +which will ensure all requests.Session objects use AppEngineAdapter properly. + +You are also able to :ref:`disable certificate validation <insecure_appengine>` +when monkey-patching. +""" +import requests +import warnings +from requests import adapters +from requests import sessions + +from .. import exceptions as exc +from .._compat import gaecontrib +from .._compat import timeout + + +class AppEngineMROHack(adapters.HTTPAdapter): + """Resolves infinite recursion when monkeypatching. + + This works by injecting itself as the base class of both the + :class:`AppEngineAdapter` and Requests' default HTTPAdapter, which needs to + be done because default HTTPAdapter's MRO is recompiled when we + monkeypatch, at which point this class becomes HTTPAdapter's base class. + In addition, we use an instantiation flag to avoid infinite recursion. + """ + _initialized = False + + def __init__(self, *args, **kwargs): + if not self._initialized: + self._initialized = True + super(AppEngineMROHack, self).__init__(*args, **kwargs) + + +class AppEngineAdapter(AppEngineMROHack, adapters.HTTPAdapter): + """The transport adapter for Requests to use urllib3's GAE support. + + Implements Requests's HTTPAdapter API. + + When deploying to Google's App Engine service, some of Requests' + functionality is broken. There is underlying support for GAE in urllib3. + This functionality, however, is opt-in and needs to be enabled explicitly + for Requests to be able to use it. + """ + + __attrs__ = adapters.HTTPAdapter.__attrs__ + ['_validate_certificate'] + + def __init__(self, validate_certificate=True, *args, **kwargs): + _check_version() + self._validate_certificate = validate_certificate + super(AppEngineAdapter, self).__init__(*args, **kwargs) + + def init_poolmanager(self, connections, maxsize, block=False): + self.poolmanager = _AppEnginePoolManager(self._validate_certificate) + + +class InsecureAppEngineAdapter(AppEngineAdapter): + """An always-insecure GAE adapter for Requests. + + This is a variant of the the transport adapter for Requests to use + urllib3's GAE support that does not validate certificates. Use with + caution! + + .. note:: + The ``validate_certificate`` keyword argument will not be honored here + and is not part of the signature because we always force it to + ``False``. + + See :class:`AppEngineAdapter` for further details. + """ + + def __init__(self, *args, **kwargs): + if kwargs.pop("validate_certificate", False): + warnings.warn("Certificate validation cannot be specified on the " + "InsecureAppEngineAdapter, but was present. This " + "will be ignored and certificate validation will " + "remain off.", exc.IgnoringGAECertificateValidation) + + super(InsecureAppEngineAdapter, self).__init__( + validate_certificate=False, *args, **kwargs) + + +class _AppEnginePoolManager(object): + """Implements urllib3's PoolManager API expected by requests. + + While a real PoolManager map hostnames to reusable Connections, + AppEngine has no concept of a reusable connection to a host. + So instead, this class constructs a small Connection per request, + that is returned to the Adapter and used to access the URL. + """ + + def __init__(self, validate_certificate=True): + self.appengine_manager = gaecontrib.AppEngineManager( + validate_certificate=validate_certificate) + + def connection_from_url(self, url): + return _AppEngineConnection(self.appengine_manager, url) + + def clear(self): + pass + + +class _AppEngineConnection(object): + """Implements urllib3's HTTPConnectionPool API's urlopen(). + + This Connection's urlopen() is called with a host-relative path, + so in order to properly support opening the URL, we need to store + the full URL when this Connection is constructed from the PoolManager. + + This code wraps AppEngineManager.urlopen(), which exposes a different + API than in the original urllib3 urlopen(), and thus needs this adapter. + """ + + def __init__(self, appengine_manager, url): + self.appengine_manager = appengine_manager + self.url = url + + def urlopen(self, method, url, body=None, headers=None, retries=None, + redirect=True, assert_same_host=True, + timeout=timeout.Timeout.DEFAULT_TIMEOUT, + pool_timeout=None, release_conn=None, **response_kw): + # This function's url argument is a host-relative URL, + # but the AppEngineManager expects an absolute URL. + # So we saved out the self.url when the AppEngineConnection + # was constructed, which we then can use down below instead. + + # We once tried to verify our assumptions here, but sometimes the + # passed-in URL differs on url fragments, or "http://a.com" vs "/". + + # urllib3's App Engine adapter only uses Timeout.total, not read or + # connect. + if not timeout.total: + timeout.total = timeout._read or timeout._connect + + # Jump through the hoops necessary to call AppEngineManager's API. + return self.appengine_manager.urlopen( + method, + self.url, + body=body, + headers=headers, + retries=retries, + redirect=redirect, + timeout=timeout, + **response_kw) + + +def monkeypatch(validate_certificate=True): + """Sets up all Sessions to use AppEngineAdapter by default. + + If you don't want to deal with configuring your own Sessions, + or if you use libraries that use requests directly (ie requests.post), + then you may prefer to monkeypatch and auto-configure all Sessions. + + .. warning: : + + If ``validate_certificate`` is ``False``, certification validation will + effectively be disabled for all requests. + """ + _check_version() + # HACK: We should consider modifying urllib3 to support this cleanly, + # so that we can set a module-level variable in the sessions module, + # instead of overriding an imported HTTPAdapter as is done here. + adapter = AppEngineAdapter + if not validate_certificate: + adapter = InsecureAppEngineAdapter + + sessions.HTTPAdapter = adapter + adapters.HTTPAdapter = adapter + + +def _check_version(): + if gaecontrib is None: + raise exc.VersionMismatchError( + "The toolbelt requires at least Requests 2.10.0 to be " + "installed. Version {} was found instead.".format( + requests.__version__ + ) + ) diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/fingerprint.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/fingerprint.py new file mode 100644 index 000000000..6645d3498 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/fingerprint.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +"""Submodule containing the implementation for the FingerprintAdapter. + +This file contains an implementation of a Transport Adapter that validates +the fingerprints of SSL certificates presented upon connection. +""" +from requests.adapters import HTTPAdapter + +from .._compat import poolmanager + + +class FingerprintAdapter(HTTPAdapter): + """ + A HTTPS Adapter for Python Requests that verifies certificate fingerprints, + instead of certificate hostnames. + + Example usage: + + .. code-block:: python + + import requests + import ssl + from requests_toolbelt.adapters.fingerprint import FingerprintAdapter + + twitter_fingerprint = '...' + s = requests.Session() + s.mount( + 'https://twitter.com', + FingerprintAdapter(twitter_fingerprint) + ) + + The fingerprint should be provided as a hexadecimal string, optionally + containing colons. + """ + + __attrs__ = HTTPAdapter.__attrs__ + ['fingerprint'] + + def __init__(self, fingerprint, **kwargs): + self.fingerprint = fingerprint + + super(FingerprintAdapter, self).__init__(**kwargs) + + def init_poolmanager(self, connections, maxsize, block=False): + self.poolmanager = poolmanager.PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + assert_fingerprint=self.fingerprint) diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/host_header_ssl.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/host_header_ssl.py new file mode 100644 index 000000000..f34ed1aa1 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/host_header_ssl.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +""" +requests_toolbelt.adapters.host_header_ssl +========================================== + +This file contains an implementation of the HostHeaderSSLAdapter. +""" + +from requests.adapters import HTTPAdapter + + +class HostHeaderSSLAdapter(HTTPAdapter): + """ + A HTTPS Adapter for Python Requests that sets the hostname for certificate + verification based on the Host header. + + This allows requesting the IP address directly via HTTPS without getting + a "hostname doesn't match" exception. + + Example usage: + + >>> s.mount('https://', HostHeaderSSLAdapter()) + >>> s.get("https://93.184.216.34", headers={"Host": "example.org"}) + + """ + + def send(self, request, **kwargs): + # HTTP headers are case-insensitive (RFC 7230) + host_header = None + for header in request.headers: + if header.lower() == "host": + host_header = request.headers[header] + break + + connection_pool_kwargs = self.poolmanager.connection_pool_kw + + if host_header: + connection_pool_kwargs["assert_hostname"] = host_header + elif "assert_hostname" in connection_pool_kwargs: + # an assert_hostname from a previous request may have been left + connection_pool_kwargs.pop("assert_hostname", None) + + return super(HostHeaderSSLAdapter, self).send(request, **kwargs) diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/socket_options.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/socket_options.py new file mode 100644 index 000000000..f8aef5dd5 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/socket_options.py @@ -0,0 +1,129 @@ +# -*- coding: utf-8 -*- +"""The implementation of the SocketOptionsAdapter.""" +import socket +import warnings +import sys + +import requests +from requests import adapters + +from .._compat import connection +from .._compat import poolmanager +from .. import exceptions as exc + + +class SocketOptionsAdapter(adapters.HTTPAdapter): + """An adapter for requests that allows users to specify socket options. + + Since version 2.4.0 of requests, it is possible to specify a custom list + of socket options that need to be set before establishing the connection. + + Example usage:: + + >>> import socket + >>> import requests + >>> from requests_toolbelt.adapters import socket_options + >>> s = requests.Session() + >>> opts = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 0)] + >>> adapter = socket_options.SocketOptionsAdapter(socket_options=opts) + >>> s.mount('http://', adapter) + + You can also take advantage of the list of default options on this class + to keep using the original options in addition to your custom options. In + that case, ``opts`` might look like:: + + >>> opts = socket_options.SocketOptionsAdapter.default_options + opts + + """ + + if connection is not None: + default_options = getattr( + connection.HTTPConnection, + 'default_socket_options', + [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + ) + else: + default_options = [] + warnings.warn(exc.RequestsVersionTooOld, + "This version of Requests is only compatible with a " + "version of urllib3 which is too old to support " + "setting options on a socket. This adapter is " + "functionally useless.") + + def __init__(self, **kwargs): + self.socket_options = kwargs.pop('socket_options', + self.default_options) + + super(SocketOptionsAdapter, self).__init__(**kwargs) + + def init_poolmanager(self, connections, maxsize, block=False): + if requests.__build__ >= 0x020400: + # NOTE(Ian): Perhaps we should raise a warning + self.poolmanager = poolmanager.PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + socket_options=self.socket_options + ) + else: + super(SocketOptionsAdapter, self).init_poolmanager( + connections, maxsize, block + ) + + +class TCPKeepAliveAdapter(SocketOptionsAdapter): + """An adapter for requests that turns on TCP Keep-Alive by default. + + The adapter sets 4 socket options: + + - ``SOL_SOCKET`` ``SO_KEEPALIVE`` - This turns on TCP Keep-Alive + - ``IPPROTO_TCP`` ``TCP_KEEPINTVL`` 20 - Sets the keep alive interval + - ``IPPROTO_TCP`` ``TCP_KEEPCNT`` 5 - Sets the number of keep alive probes + - ``IPPROTO_TCP`` ``TCP_KEEPIDLE`` 60 - Sets the keep alive time if the + socket library has the ``TCP_KEEPIDLE`` constant + + The latter three can be overridden by keyword arguments (respectively): + + - ``idle`` + - ``interval`` + - ``count`` + + You can use this adapter like so:: + + >>> from requests_toolbelt.adapters import socket_options + >>> tcp = socket_options.TCPKeepAliveAdapter(idle=120, interval=10) + >>> s = requests.Session() + >>> s.mount('http://', tcp) + + """ + + def __init__(self, **kwargs): + socket_options = kwargs.pop('socket_options', + SocketOptionsAdapter.default_options) + idle = kwargs.pop('idle', 60) + interval = kwargs.pop('interval', 20) + count = kwargs.pop('count', 5) + socket_options = socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) + ] + + # NOTE(Ian): OSX does not have these constants defined, so we + # set them conditionally. + if getattr(socket, 'TCP_KEEPINTVL', None) is not None: + socket_options += [(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, + interval)] + elif sys.platform == 'darwin': + # On OSX, TCP_KEEPALIVE from netinet/tcp.h is not exported + # by python's socket module + TCP_KEEPALIVE = getattr(socket, 'TCP_KEEPALIVE', 0x10) + socket_options += [(socket.IPPROTO_TCP, TCP_KEEPALIVE, interval)] + + if getattr(socket, 'TCP_KEEPCNT', None) is not None: + socket_options += [(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, count)] + + if getattr(socket, 'TCP_KEEPIDLE', None) is not None: + socket_options += [(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, idle)] + + super(TCPKeepAliveAdapter, self).__init__( + socket_options=socket_options, **kwargs + ) diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/source.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/source.py new file mode 100644 index 000000000..d3dda797a --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/source.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +""" +requests_toolbelt.source_adapter +================================ + +This file contains an implementation of the SourceAddressAdapter originally +demonstrated on the Requests GitHub page. +""" +from requests.adapters import HTTPAdapter + +from .._compat import poolmanager, basestring + + +class SourceAddressAdapter(HTTPAdapter): + """ + A Source Address Adapter for Python Requests that enables you to choose the + local address to bind to. This allows you to send your HTTP requests from a + specific interface and IP address. + + Two address formats are accepted. The first is a string: this will set the + local IP address to the address given in the string, and will also choose a + semi-random high port for the local port number. + + The second is a two-tuple of the form (ip address, port): for example, + ``('10.10.10.10', 8999)``. This will set the local IP address to the first + element, and the local port to the second element. If ``0`` is used as the + port number, a semi-random high port will be selected. + + .. warning:: Setting an explicit local port can have negative interactions + with connection-pooling in Requests: in particular, it risks + the possibility of getting "Address in use" errors. The + string-only argument is generally preferred to the tuple-form. + + Example usage: + + .. code-block:: python + + import requests + from requests_toolbelt.adapters.source import SourceAddressAdapter + + s = requests.Session() + s.mount('http://', SourceAddressAdapter('10.10.10.10')) + s.mount('https://', SourceAddressAdapter(('10.10.10.10', 8999))) + """ + def __init__(self, source_address, **kwargs): + if isinstance(source_address, basestring): + self.source_address = (source_address, 0) + elif isinstance(source_address, tuple): + self.source_address = source_address + else: + raise TypeError( + "source_address must be IP address string or (ip, port) tuple" + ) + + super(SourceAddressAdapter, self).__init__(**kwargs) + + def init_poolmanager(self, connections, maxsize, block=False): + self.poolmanager = poolmanager.PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + source_address=self.source_address) + + def proxy_manager_for(self, *args, **kwargs): + kwargs['source_address'] = self.source_address + return super(SourceAddressAdapter, self).proxy_manager_for( + *args, **kwargs) diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/ssl.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/ssl.py new file mode 100644 index 000000000..c4a76ae45 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/ssl.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +""" + +requests_toolbelt.ssl_adapter +============================= + +This file contains an implementation of the SSLAdapter originally demonstrated +in this blog post: +https://lukasa.co.uk/2013/01/Choosing_SSL_Version_In_Requests/ + +""" +import requests + +from requests.adapters import HTTPAdapter + +from .._compat import poolmanager + + +class SSLAdapter(HTTPAdapter): + """ + A HTTPS Adapter for Python Requests that allows the choice of the SSL/TLS + version negotiated by Requests. This can be used either to enforce the + choice of high-security TLS versions (where supported), or to work around + misbehaving servers that fail to correctly negotiate the default TLS + version being offered. + + Example usage: + + >>> import requests + >>> import ssl + >>> from requests_toolbelt import SSLAdapter + >>> s = requests.Session() + >>> s.mount('https://', SSLAdapter(ssl.PROTOCOL_TLSv1)) + + You can replace the chosen protocol with any that are available in the + default Python SSL module. All subsequent requests that match the adapter + prefix will use the chosen SSL version instead of the default. + + This adapter will also attempt to change the SSL/TLS version negotiated by + Requests when using a proxy. However, this may not always be possible: + prior to Requests v2.4.0 the adapter did not have access to the proxy setup + code. In earlier versions of Requests, this adapter will not function + properly when used with proxies. + """ + + __attrs__ = HTTPAdapter.__attrs__ + ['ssl_version'] + + def __init__(self, ssl_version=None, **kwargs): + self.ssl_version = ssl_version + + super(SSLAdapter, self).__init__(**kwargs) + + def init_poolmanager(self, connections, maxsize, block=False): + self.poolmanager = poolmanager.PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + ssl_version=self.ssl_version) + + if requests.__build__ >= 0x020400: + # Earlier versions of requests either don't have this method or, worse, + # don't allow passing arbitrary keyword arguments. As a result, only + # conditionally define this method. + def proxy_manager_for(self, *args, **kwargs): + kwargs['ssl_version'] = self.ssl_version + return super(SSLAdapter, self).proxy_manager_for(*args, **kwargs) diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/x509.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/x509.py new file mode 100644 index 000000000..21bfacb9e --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/x509.py @@ -0,0 +1,178 @@ +# -*- coding: utf-8 -*- +"""A X509Adapter for use with the requests library. + +This file contains an implementation of the X509Adapter that will +allow users to authenticate a request using an arbitrary +X.509 certificate without needing to convert it to a .pem file + +""" + +from OpenSSL.crypto import PKey, X509 +from cryptography import x509 +from cryptography.hazmat.primitives.serialization import (load_pem_private_key, + load_der_private_key) +from cryptography.hazmat.primitives.serialization import Encoding +from cryptography.hazmat.backends import default_backend + +from datetime import datetime +from requests.adapters import HTTPAdapter +import requests + +from .._compat import PyOpenSSLContext +from .. import exceptions as exc + +""" +importing the protocol constants from _ssl instead of ssl because only the +constants are needed and to handle issues caused by importing from ssl on +the 2.7.x line. +""" +try: + from _ssl import PROTOCOL_TLS as PROTOCOL +except ImportError: + from _ssl import PROTOCOL_SSLv23 as PROTOCOL + + +class X509Adapter(HTTPAdapter): + r"""Adapter for use with X.509 certificates. + + Provides an interface for Requests sessions to contact HTTPS urls and + authenticate with an X.509 cert by implementing the Transport Adapter + interface. This class will need to be manually instantiated and mounted + to the session + + :param pool_connections: The number of urllib3 connection pools to + cache. + :param pool_maxsize: The maximum number of connections to save in the + pool. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, + socket connections and connection timeouts, never to requests where + data has made it to the server. By default, Requests does not retry + failed connections. If you need granular control over the + conditions under which we retry a request, import urllib3's + ``Retry`` class and pass that instead. + :param pool_block: Whether the connection pool should block for + connections. + + :param bytes cert_bytes: + bytes object containing contents of a cryptography.x509Certificate + object using the encoding specified by the ``encoding`` parameter. + :param bytes pk_bytes: + bytes object containing contents of a object that implements + ``cryptography.hazmat.primitives.serialization.PrivateFormat`` + using the encoding specified by the ``encoding`` parameter. + :param password: + string or utf8 encoded bytes containing the passphrase used for the + private key. None if unencrypted. Defaults to None. + :param encoding: + Enumeration detailing the encoding method used on the ``cert_bytes`` + parameter. Can be either PEM or DER. Defaults to PEM. + :type encoding: + :class: `cryptography.hazmat.primitives.serialization.Encoding` + + Usage:: + + >>> import requests + >>> from requests_toolbelt.adapters.x509 import X509Adapter + >>> s = requests.Session() + >>> a = X509Adapter(max_retries=3, + cert_bytes=b'...', pk_bytes=b'...', encoding='...' + >>> s.mount('https://', a) + """ + + def __init__(self, *args, **kwargs): + self._check_version() + cert_bytes = kwargs.pop('cert_bytes', None) + pk_bytes = kwargs.pop('pk_bytes', None) + password = kwargs.pop('password', None) + encoding = kwargs.pop('encoding', Encoding.PEM) + + password_bytes = None + + if cert_bytes is None or not isinstance(cert_bytes, bytes): + raise ValueError('Invalid cert content provided. ' + 'You must provide an X.509 cert ' + 'formatted as a byte array.') + if pk_bytes is None or not isinstance(pk_bytes, bytes): + raise ValueError('Invalid private key content provided. ' + 'You must provide a private key ' + 'formatted as a byte array.') + + if isinstance(password, bytes): + password_bytes = password + elif password: + password_bytes = password.encode('utf8') + + self.ssl_context = create_ssl_context(cert_bytes, pk_bytes, + password_bytes, encoding) + + super(X509Adapter, self).__init__(*args, **kwargs) + + def init_poolmanager(self, *args, **kwargs): + if self.ssl_context: + kwargs['ssl_context'] = self.ssl_context + return super(X509Adapter, self).init_poolmanager(*args, **kwargs) + + def proxy_manager_for(self, *args, **kwargs): + if self.ssl_context: + kwargs['ssl_context'] = self.ssl_context + return super(X509Adapter, self).proxy_manager_for(*args, **kwargs) + + def _check_version(self): + if PyOpenSSLContext is None: + raise exc.VersionMismatchError( + "The X509Adapter requires at least Requests 2.12.0 to be " + "installed. Version {} was found instead.".format( + requests.__version__ + ) + ) + + +def check_cert_dates(cert): + """Verify that the supplied client cert is not invalid.""" + + now = datetime.utcnow() + if cert.not_valid_after < now or cert.not_valid_before > now: + raise ValueError('Client certificate expired: Not After: ' + '{:%Y-%m-%d %H:%M:%SZ} ' + 'Not Before: {:%Y-%m-%d %H:%M:%SZ}' + .format(cert.not_valid_after, cert.not_valid_before)) + + +def create_ssl_context(cert_byes, pk_bytes, password=None, + encoding=Encoding.PEM): + """Create an SSL Context with the supplied cert/password. + + :param cert_bytes array of bytes containing the cert encoded + using the method supplied in the ``encoding`` parameter + :param pk_bytes array of bytes containing the private key encoded + using the method supplied in the ``encoding`` parameter + :param password array of bytes containing the passphrase to be used + with the supplied private key. None if unencrypted. + Defaults to None. + :param encoding ``cryptography.hazmat.primitives.serialization.Encoding`` + details the encoding method used on the ``cert_bytes`` and + ``pk_bytes`` parameters. Can be either PEM or DER. + Defaults to PEM. + """ + backend = default_backend() + + cert = None + key = None + if encoding == Encoding.PEM: + cert = x509.load_pem_x509_certificate(cert_byes, backend) + key = load_pem_private_key(pk_bytes, password, backend) + elif encoding == Encoding.DER: + cert = x509.load_der_x509_certificate(cert_byes, backend) + key = load_der_private_key(pk_bytes, password, backend) + else: + raise ValueError('Invalid encoding provided: Must be PEM or DER') + + if not (cert and key): + raise ValueError('Cert and key could not be parsed from ' + 'provided data') + check_cert_dates(cert) + ssl_context = PyOpenSSLContext(PROTOCOL) + ssl_context._ctx.use_certificate(X509.from_cryptography(cert)) + ssl_context._ctx.use_privatekey(PKey.from_cryptography_key(key)) + return ssl_context diff --git a/Contents/Libraries/Shared/requests_toolbelt/auth/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/auth/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/requests_toolbelt/auth/_digest_auth_compat.py b/Contents/Libraries/Shared/requests_toolbelt/auth/_digest_auth_compat.py new file mode 100644 index 000000000..285a6a763 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/auth/_digest_auth_compat.py @@ -0,0 +1,29 @@ +"""Provide a compatibility layer for requests.auth.HTTPDigestAuth.""" +import requests + + +class _ThreadingDescriptor(object): + def __init__(self, prop, default): + self.prop = prop + self.default = default + + def __get__(self, obj, objtype=None): + return getattr(obj._thread_local, self.prop, self.default) + + def __set__(self, obj, value): + setattr(obj._thread_local, self.prop, value) + + +class _HTTPDigestAuth(requests.auth.HTTPDigestAuth): + init = _ThreadingDescriptor('init', True) + last_nonce = _ThreadingDescriptor('last_nonce', '') + nonce_count = _ThreadingDescriptor('nonce_count', 0) + chal = _ThreadingDescriptor('chal', {}) + pos = _ThreadingDescriptor('pos', None) + num_401_calls = _ThreadingDescriptor('num_401_calls', 1) + + +if requests.__build__ < 0x020800: + HTTPDigestAuth = requests.auth.HTTPDigestAuth +else: + HTTPDigestAuth = _HTTPDigestAuth diff --git a/Contents/Libraries/Shared/requests_toolbelt/auth/guess.py b/Contents/Libraries/Shared/requests_toolbelt/auth/guess.py new file mode 100644 index 000000000..ba6de504a --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/auth/guess.py @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- +"""The module containing the code for GuessAuth.""" +from requests import auth +from requests import cookies + +from . import _digest_auth_compat as auth_compat, http_proxy_digest + + +class GuessAuth(auth.AuthBase): + """Guesses the auth type by the WWW-Authentication header.""" + def __init__(self, username, password): + self.username = username + self.password = password + self.auth = None + self.pos = None + + def _handle_basic_auth_401(self, r, kwargs): + if self.pos is not None: + r.request.body.seek(self.pos) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.raw.release_conn() + prep = r.request.copy() + if not hasattr(prep, '_cookies'): + prep._cookies = cookies.RequestsCookieJar() + cookies.extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + self.auth = auth.HTTPBasicAuth(self.username, self.password) + prep = self.auth(prep) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + def _handle_digest_auth_401(self, r, kwargs): + self.auth = auth_compat.HTTPDigestAuth(self.username, self.password) + try: + self.auth.init_per_thread_state() + except AttributeError: + # If we're not on requests 2.8.0+ this method does not exist and + # is not relevant. + pass + + # Check that the attr exists because much older versions of requests + # set this attribute lazily. For example: + # https://github.com/kennethreitz/requests/blob/33735480f77891754304e7f13e3cdf83aaaa76aa/requests/auth.py#L59 + if (hasattr(self.auth, 'num_401_calls') and + self.auth.num_401_calls is None): + self.auth.num_401_calls = 1 + # Digest auth would resend the request by itself. We can take a + # shortcut here. + return self.auth.handle_401(r, **kwargs) + + def handle_401(self, r, **kwargs): + """Resends a request with auth headers, if needed.""" + + www_authenticate = r.headers.get('www-authenticate', '').lower() + + if 'basic' in www_authenticate: + return self._handle_basic_auth_401(r, kwargs) + + if 'digest' in www_authenticate: + return self._handle_digest_auth_401(r, kwargs) + + def __call__(self, request): + if self.auth is not None: + return self.auth(request) + + try: + self.pos = request.body.tell() + except AttributeError: + pass + + request.register_hook('response', self.handle_401) + return request + + +class GuessProxyAuth(GuessAuth): + """ + Guesses the auth type by WWW-Authentication and Proxy-Authentication + headers + """ + def __init__(self, username=None, password=None, + proxy_username=None, proxy_password=None): + super(GuessProxyAuth, self).__init__(username, password) + self.proxy_username = proxy_username + self.proxy_password = proxy_password + self.proxy_auth = None + + def _handle_basic_auth_407(self, r, kwargs): + if self.pos is not None: + r.request.body.seek(self.pos) + + r.content + r.raw.release_conn() + prep = r.request.copy() + if not hasattr(prep, '_cookies'): + prep._cookies = cookies.RequestsCookieJar() + cookies.extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + self.proxy_auth = auth.HTTPProxyAuth(self.proxy_username, + self.proxy_password) + prep = self.proxy_auth(prep) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + def _handle_digest_auth_407(self, r, kwargs): + self.proxy_auth = http_proxy_digest.HTTPProxyDigestAuth( + username=self.proxy_username, + password=self.proxy_password) + + try: + self.auth.init_per_thread_state() + except AttributeError: + pass + + return self.proxy_auth.handle_407(r, **kwargs) + + def handle_407(self, r, **kwargs): + proxy_authenticate = r.headers.get('Proxy-Authenticate', '').lower() + + if 'basic' in proxy_authenticate: + return self._handle_basic_auth_407(r, kwargs) + + if 'digest' in proxy_authenticate: + return self._handle_digest_auth_407(r, kwargs) + + def __call__(self, request): + if self.proxy_auth is not None: + request = self.proxy_auth(request) + + try: + self.pos = request.body.tell() + except AttributeError: + pass + + request.register_hook('response', self.handle_407) + return super(GuessProxyAuth, self).__call__(request) diff --git a/Contents/Libraries/Shared/requests_toolbelt/auth/handler.py b/Contents/Libraries/Shared/requests_toolbelt/auth/handler.py new file mode 100644 index 000000000..0b4051a80 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/auth/handler.py @@ -0,0 +1,142 @@ +# -*- coding: utf-8 -*- +""" + +requests_toolbelt.auth.handler +============================== + +This holds all of the implementation details of the Authentication Handler. + +""" + +from requests.auth import AuthBase, HTTPBasicAuth +from requests.compat import urlparse, urlunparse + + +class AuthHandler(AuthBase): + + """ + + The ``AuthHandler`` object takes a dictionary of domains paired with + authentication strategies and will use this to determine which credentials + to use when making a request. For example, you could do the following: + + .. code-block:: python + + from requests import HTTPDigestAuth + from requests_toolbelt.auth.handler import AuthHandler + + import requests + + auth = AuthHandler({ + 'https://api.github.com': ('sigmavirus24', 'fakepassword'), + 'https://example.com': HTTPDigestAuth('username', 'password') + }) + + r = requests.get('https://api.github.com/user', auth=auth) + # => <Response [200]> + r = requests.get('https://example.com/some/path', auth=auth) + # => <Response [200]> + + s = requests.Session() + s.auth = auth + r = s.get('https://api.github.com/user') + # => <Response [200]> + + .. warning:: + + :class:`requests.auth.HTTPDigestAuth` is not yet thread-safe. If you + use :class:`AuthHandler` across multiple threads you should + instantiate a new AuthHandler for each thread with a new + HTTPDigestAuth instance for each thread. + + """ + + def __init__(self, strategies): + self.strategies = dict(strategies) + self._make_uniform() + + def __call__(self, request): + auth = self.get_strategy_for(request.url) + return auth(request) + + def __repr__(self): + return '<AuthHandler({!r})>'.format(self.strategies) + + def _make_uniform(self): + existing_strategies = list(self.strategies.items()) + self.strategies = {} + + for (k, v) in existing_strategies: + self.add_strategy(k, v) + + @staticmethod + def _key_from_url(url): + parsed = urlparse(url) + return urlunparse((parsed.scheme.lower(), + parsed.netloc.lower(), + '', '', '', '')) + + def add_strategy(self, domain, strategy): + """Add a new domain and authentication strategy. + + :param str domain: The domain you wish to match against. For example: + ``'https://api.github.com'`` + :param str strategy: The authentication strategy you wish to use for + that domain. For example: ``('username', 'password')`` or + ``requests.HTTPDigestAuth('username', 'password')`` + + .. code-block:: python + + a = AuthHandler({}) + a.add_strategy('https://api.github.com', ('username', 'password')) + + """ + # Turn tuples into Basic Authentication objects + if isinstance(strategy, tuple): + strategy = HTTPBasicAuth(*strategy) + + key = self._key_from_url(domain) + self.strategies[key] = strategy + + def get_strategy_for(self, url): + """Retrieve the authentication strategy for a specified URL. + + :param str url: The full URL you will be making a request against. For + example, ``'https://api.github.com/user'`` + :returns: Callable that adds authentication to a request. + + .. code-block:: python + + import requests + a = AuthHandler({'example.com', ('foo', 'bar')}) + strategy = a.get_strategy_for('http://example.com/example') + assert isinstance(strategy, requests.auth.HTTPBasicAuth) + + """ + key = self._key_from_url(url) + return self.strategies.get(key, NullAuthStrategy()) + + def remove_strategy(self, domain): + """Remove the domain and strategy from the collection of strategies. + + :param str domain: The domain you wish remove. For example, + ``'https://api.github.com'``. + + .. code-block:: python + + a = AuthHandler({'example.com', ('foo', 'bar')}) + a.remove_strategy('example.com') + assert a.strategies == {} + + """ + key = self._key_from_url(domain) + if key in self.strategies: + del self.strategies[key] + + +class NullAuthStrategy(AuthBase): + def __repr__(self): + return '<NullAuthStrategy>' + + def __call__(self, r): + return r diff --git a/Contents/Libraries/Shared/requests_toolbelt/auth/http_proxy_digest.py b/Contents/Libraries/Shared/requests_toolbelt/auth/http_proxy_digest.py new file mode 100644 index 000000000..7e1f69ef7 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/auth/http_proxy_digest.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +"""The module containing HTTPProxyDigestAuth.""" +import re + +from requests import cookies, utils + +from . import _digest_auth_compat as auth + + +class HTTPProxyDigestAuth(auth.HTTPDigestAuth): + """HTTP digest authentication between proxy + + :param stale_rejects: The number of rejects indicate that: + the client may wish to simply retry the request + with a new encrypted response, without reprompting the user for a + new username and password. i.e., retry build_digest_header + :type stale_rejects: int + """ + _pat = re.compile(r'digest ', flags=re.IGNORECASE) + + def __init__(self, *args, **kwargs): + super(HTTPProxyDigestAuth, self).__init__(*args, **kwargs) + self.stale_rejects = 0 + + self.init_per_thread_state() + + @property + def stale_rejects(self): + thread_local = getattr(self, '_thread_local', None) + if thread_local is None: + return self._stale_rejects + return thread_local.stale_rejects + + @stale_rejects.setter + def stale_rejects(self, value): + thread_local = getattr(self, '_thread_local', None) + if thread_local is None: + self._stale_rejects = value + else: + thread_local.stale_rejects = value + + def init_per_thread_state(self): + try: + super(HTTPProxyDigestAuth, self).init_per_thread_state() + except AttributeError: + # If we're not on requests 2.8.0+ this method does not exist + pass + + def handle_407(self, r, **kwargs): + """Handle HTTP 407 only once, otherwise give up + + :param r: current response + :returns: responses, along with the new response + """ + if r.status_code == 407 and self.stale_rejects < 2: + s_auth = r.headers.get("proxy-authenticate") + if s_auth is None: + raise IOError( + "proxy server violated RFC 7235:" + "407 response MUST contain header proxy-authenticate") + elif not self._pat.match(s_auth): + return r + + self.chal = utils.parse_dict_header( + self._pat.sub('', s_auth, count=1)) + + # if we present the user/passwd and still get rejected + # https://tools.ietf.org/html/rfc2617#section-3.2.1 + if ('Proxy-Authorization' in r.request.headers and + 'stale' in self.chal): + if self.chal['stale'].lower() == 'true': # try again + self.stale_rejects += 1 + # wrong user/passwd + elif self.chal['stale'].lower() == 'false': + raise IOError("User or password is invalid") + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + cookies.extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers['Proxy-Authorization'] = self.build_digest_header( + prep.method, prep.url) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + else: # give up authenticate + return r + + def __call__(self, r): + self.init_per_thread_state() + # if we have nonce, then just use it, otherwise server will tell us + if self.last_nonce: + r.headers['Proxy-Authorization'] = self.build_digest_header( + r.method, r.url + ) + r.register_hook('response', self.handle_407) + return r diff --git a/Contents/Libraries/Shared/requests_toolbelt/cookies/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/cookies/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/requests_toolbelt/cookies/forgetful.py b/Contents/Libraries/Shared/requests_toolbelt/cookies/forgetful.py new file mode 100644 index 000000000..332036384 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/cookies/forgetful.py @@ -0,0 +1,7 @@ +"""The module containing the code for ForgetfulCookieJar.""" +from requests.cookies import RequestsCookieJar + + +class ForgetfulCookieJar(RequestsCookieJar): + def set_cookie(self, *args, **kwargs): + return diff --git a/Contents/Libraries/Shared/requests_toolbelt/downloadutils/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/downloadutils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/requests_toolbelt/downloadutils/stream.py b/Contents/Libraries/Shared/requests_toolbelt/downloadutils/stream.py new file mode 100644 index 000000000..7253d96e0 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/downloadutils/stream.py @@ -0,0 +1,176 @@ +# -*- coding: utf-8 -*- +"""Utilities for dealing with streamed requests.""" +import os.path +import re + +from .. import exceptions as exc + +# Regular expressions stolen from werkzeug/http.py +# cd2c97bb0a076da2322f11adce0b2731f9193396 L62-L64 +_QUOTED_STRING_RE = r'"[^"\\]*(?:\\.[^"\\]*)*"' +_OPTION_HEADER_PIECE_RE = re.compile( + r';\s*(%s|[^\s;=]+)\s*(?:=\s*(%s|[^;]+))?\s*' % (_QUOTED_STRING_RE, + _QUOTED_STRING_RE) +) +_DEFAULT_CHUNKSIZE = 512 + + +def _get_filename(content_disposition): + for match in _OPTION_HEADER_PIECE_RE.finditer(content_disposition): + k, v = match.groups() + if k == 'filename': + # ignore any directory paths in the filename + return os.path.split(v)[1] + return None + + +def get_download_file_path(response, path): + """ + Given a response and a path, return a file path for a download. + + If a ``path`` parameter is a directory, this function will parse the + ``Content-Disposition`` header on the response to determine the name of the + file as reported by the server, and return a file path in the specified + directory. + + If ``path`` is empty or None, this function will return a path relative + to the process' current working directory. + + If path is a full file path, return it. + + :param response: A Response object from requests + :type response: requests.models.Response + :param str path: Directory or file path. + :returns: full file path to download as + :rtype: str + :raises: :class:`requests_toolbelt.exceptions.StreamingError` + """ + path_is_dir = path and os.path.isdir(path) + + if path and not path_is_dir: + # fully qualified file path + filepath = path + else: + response_filename = _get_filename( + response.headers.get('content-disposition', '') + ) + if not response_filename: + raise exc.StreamingError('No filename given to stream response to') + + if path_is_dir: + # directory to download to + filepath = os.path.join(path, response_filename) + else: + # fallback to downloading to current working directory + filepath = response_filename + + return filepath + + +def stream_response_to_file(response, path=None, chunksize=_DEFAULT_CHUNKSIZE): + """Stream a response body to the specified file. + + Either use the ``path`` provided or use the name provided in the + ``Content-Disposition`` header. + + .. warning:: + + If you pass this function an open file-like object as the ``path`` + parameter, the function will not close that file for you. + + .. warning:: + + This function will not automatically close the response object + passed in as the ``response`` parameter. + + If a ``path`` parameter is a directory, this function will parse the + ``Content-Disposition`` header on the response to determine the name of the + file as reported by the server, and return a file path in the specified + directory. If no ``path`` parameter is supplied, this function will default + to the process' current working directory. + + .. code-block:: python + + import requests + from requests_toolbelt import exceptions + from requests_toolbelt.downloadutils import stream + + r = requests.get(url, stream=True) + try: + filename = stream.stream_response_to_file(r) + except exceptions.StreamingError as e: + # The toolbelt could not find the filename in the + # Content-Disposition + print(e.message) + + You can also specify the filename as a string. This will be passed to + the built-in :func:`open` and we will read the content into the file. + + .. code-block:: python + + import requests + from requests_toolbelt.downloadutils import stream + + r = requests.get(url, stream=True) + filename = stream.stream_response_to_file(r, path='myfile') + + If the calculated download file path already exists, this function will + raise a StreamingError. + + Instead, if you want to manage the file object yourself, you need to + provide either a :class:`io.BytesIO` object or a file opened with the + `'b'` flag. See the two examples below for more details. + + .. code-block:: python + + import requests + from requests_toolbelt.downloadutils import stream + + with open('myfile', 'wb') as fd: + r = requests.get(url, stream=True) + filename = stream.stream_response_to_file(r, path=fd) + + print('{} saved to {}'.format(url, filename)) + + .. code-block:: python + + import io + import requests + from requests_toolbelt.downloadutils import stream + + b = io.BytesIO() + r = requests.get(url, stream=True) + filename = stream.stream_response_to_file(r, path=b) + assert filename is None + + :param response: A Response object from requests + :type response: requests.models.Response + :param path: *(optional)*, Either a string with the path to the location + to save the response content, or a file-like object expecting bytes. + :type path: :class:`str`, or object with a :meth:`write` + :param int chunksize: (optional), Size of chunk to attempt to stream + (default 512B). + :returns: The name of the file, if one can be determined, else None + :rtype: str + :raises: :class:`requests_toolbelt.exceptions.StreamingError` + """ + pre_opened = False + fd = None + filename = None + if path and callable(getattr(path, 'write', None)): + pre_opened = True + fd = path + filename = getattr(fd, 'name', None) + else: + filename = get_download_file_path(response, path) + if os.path.exists(filename): + raise exc.StreamingError("File already exists: %s" % filename) + fd = open(filename, 'wb') + + for chunk in response.iter_content(chunk_size=chunksize): + fd.write(chunk) + + if not pre_opened: + fd.close() + + return filename diff --git a/Contents/Libraries/Shared/requests_toolbelt/downloadutils/tee.py b/Contents/Libraries/Shared/requests_toolbelt/downloadutils/tee.py new file mode 100644 index 000000000..ecc7d0cdd --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/downloadutils/tee.py @@ -0,0 +1,123 @@ +"""Tee function implementations.""" +import io + +_DEFAULT_CHUNKSIZE = 65536 + +__all__ = ['tee', 'tee_to_file', 'tee_to_bytearray'] + + +def _tee(response, callback, chunksize, decode_content): + for chunk in response.raw.stream(amt=chunksize, + decode_content=decode_content): + callback(chunk) + yield chunk + + +def tee(response, fileobject, chunksize=_DEFAULT_CHUNKSIZE, + decode_content=None): + """Stream the response both to the generator and a file. + + This will stream the response body while writing the bytes to + ``fileobject``. + + Example usage: + + .. code-block:: python + + resp = requests.get(url, stream=True) + with open('save_file', 'wb') as save_file: + for chunk in tee(resp, save_file): + # do stuff with chunk + + .. code-block:: python + + import io + + resp = requests.get(url, stream=True) + fileobject = io.BytesIO() + + for chunk in tee(resp, fileobject): + # do stuff with chunk + + :param response: Response from requests. + :type response: requests.Response + :param fileobject: Writable file-like object. + :type fileobject: file, io.BytesIO + :param int chunksize: (optional), Size of chunk to attempt to stream. + :param bool decode_content: (optional), If True, this will decode the + compressed content of the response. + :raises: TypeError if the fileobject wasn't opened with the right mode + or isn't a BytesIO object. + """ + # We will be streaming the raw bytes from over the wire, so we need to + # ensure that writing to the fileobject will preserve those bytes. On + # Python3, if the user passes an io.StringIO, this will fail, so we need + # to check for BytesIO instead. + if not ('b' in getattr(fileobject, 'mode', '') or + isinstance(fileobject, io.BytesIO)): + raise TypeError('tee() will write bytes directly to this fileobject' + ', it must be opened with the "b" flag if it is a file' + ' or inherit from io.BytesIO.') + + return _tee(response, fileobject.write, chunksize, decode_content) + + +def tee_to_file(response, filename, chunksize=_DEFAULT_CHUNKSIZE, + decode_content=None): + """Stream the response both to the generator and a file. + + This will open a file named ``filename`` and stream the response body + while writing the bytes to the opened file object. + + Example usage: + + .. code-block:: python + + resp = requests.get(url, stream=True) + for chunk in tee_to_file(resp, 'save_file'): + # do stuff with chunk + + :param response: Response from requests. + :type response: requests.Response + :param str filename: Name of file in which we write the response content. + :param int chunksize: (optional), Size of chunk to attempt to stream. + :param bool decode_content: (optional), If True, this will decode the + compressed content of the response. + """ + with open(filename, 'wb') as fd: + for chunk in tee(response, fd, chunksize, decode_content): + yield chunk + + +def tee_to_bytearray(response, bytearr, chunksize=_DEFAULT_CHUNKSIZE, + decode_content=None): + """Stream the response both to the generator and a bytearray. + + This will stream the response provided to the function, add them to the + provided :class:`bytearray` and yield them to the user. + + .. note:: + + This uses the :meth:`bytearray.extend` by default instead of passing + the bytearray into the ``readinto`` method. + + Example usage: + + .. code-block:: python + + b = bytearray() + resp = requests.get(url, stream=True) + for chunk in tee_to_bytearray(resp, b): + # do stuff with chunk + + :param response: Response from requests. + :type response: requests.Response + :param bytearray bytearr: Array to add the streamed bytes to. + :param int chunksize: (optional), Size of chunk to attempt to stream. + :param bool decode_content: (optional), If True, this will decode the + compressed content of the response. + """ + if not isinstance(bytearr, bytearray): + raise TypeError('tee_to_bytearray() expects bytearr to be a ' + 'bytearray') + return _tee(response, bytearr.extend, chunksize, decode_content) diff --git a/Contents/Libraries/Shared/requests_toolbelt/exceptions.py b/Contents/Libraries/Shared/requests_toolbelt/exceptions.py new file mode 100644 index 000000000..32ade215a --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/exceptions.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +"""Collection of exceptions raised by requests-toolbelt.""" + + +class StreamingError(Exception): + """Used in :mod:`requests_toolbelt.downloadutils.stream`.""" + pass + + +class VersionMismatchError(Exception): + """Used to indicate a version mismatch in the version of requests required. + + The feature in use requires a newer version of Requests to function + appropriately but the version installed is not sufficient. + """ + pass + + +class RequestsVersionTooOld(Warning): + """Used to indicate that the Requests version is too old. + + If the version of Requests is too old to support a feature, we will issue + this warning to the user. + """ + pass + + +class IgnoringGAECertificateValidation(Warning): + """Used to indicate that given GAE validation behavior will be ignored. + + If the user has tried to specify certificate validation when using the + insecure AppEngine adapter, it will be ignored (certificate validation will + remain off), so we will issue this warning to the user. + + In :class:`requests_toolbelt.adapters.appengine.InsecureAppEngineAdapter`. + """ + pass diff --git a/Contents/Libraries/Shared/requests_toolbelt/multipart/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/multipart/__init__.py new file mode 100644 index 000000000..d3bced1c8 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/multipart/__init__.py @@ -0,0 +1,31 @@ +""" +requests_toolbelt.multipart +=========================== + +See https://toolbelt.readthedocs.io/ for documentation + +:copyright: (c) 2014 by Ian Cordasco and Cory Benfield +:license: Apache v2.0, see LICENSE for more details +""" + +from .encoder import MultipartEncoder, MultipartEncoderMonitor +from .decoder import MultipartDecoder +from .decoder import ImproperBodyPartContentException +from .decoder import NonMultipartContentTypeException + +__title__ = 'requests-toolbelt' +__authors__ = 'Ian Cordasco, Cory Benfield' +__license__ = 'Apache v2.0' +__copyright__ = 'Copyright 2014 Ian Cordasco, Cory Benfield' + +__all__ = [ + 'MultipartEncoder', + 'MultipartEncoderMonitor', + 'MultipartDecoder', + 'ImproperBodyPartContentException', + 'NonMultipartContentTypeException', + '__title__', + '__authors__', + '__license__', + '__copyright__', +] diff --git a/Contents/Libraries/Shared/requests_toolbelt/multipart/decoder.py b/Contents/Libraries/Shared/requests_toolbelt/multipart/decoder.py new file mode 100644 index 000000000..2f74d4700 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/multipart/decoder.py @@ -0,0 +1,156 @@ +# -*- coding: utf-8 -*- +""" + +requests_toolbelt.multipart.decoder +=================================== + +This holds all the implementation details of the MultipartDecoder + +""" + +import sys +import email.parser +from .encoder import encode_with +from requests.structures import CaseInsensitiveDict + + +def _split_on_find(content, bound): + point = content.find(bound) + return content[:point], content[point + len(bound):] + + +class ImproperBodyPartContentException(Exception): + pass + + +class NonMultipartContentTypeException(Exception): + pass + + +def _header_parser(string, encoding): + major = sys.version_info[0] + if major == 3: + string = string.decode(encoding) + headers = email.parser.HeaderParser().parsestr(string).items() + return ( + (encode_with(k, encoding), encode_with(v, encoding)) + for k, v in headers + ) + + +class BodyPart(object): + """ + + The ``BodyPart`` object is a ``Response``-like interface to an individual + subpart of a multipart response. It is expected that these will + generally be created by objects of the ``MultipartDecoder`` class. + + Like ``Response``, there is a ``CaseInsensitiveDict`` object named headers, + ``content`` to access bytes, ``text`` to access unicode, and ``encoding`` + to access the unicode codec. + + """ + + def __init__(self, content, encoding): + self.encoding = encoding + headers = {} + # Split into header section (if any) and the content + if b'\r\n\r\n' in content: + first, self.content = _split_on_find(content, b'\r\n\r\n') + if first != b'': + headers = _header_parser(first.lstrip(), encoding) + else: + raise ImproperBodyPartContentException( + 'content does not contain CR-LF-CR-LF' + ) + self.headers = CaseInsensitiveDict(headers) + + @property + def text(self): + """Content of the ``BodyPart`` in unicode.""" + return self.content.decode(self.encoding) + + +class MultipartDecoder(object): + """ + + The ``MultipartDecoder`` object parses the multipart payload of + a bytestring into a tuple of ``Response``-like ``BodyPart`` objects. + + The basic usage is:: + + import requests + from requests_toolbelt import MultipartDecoder + + response = request.get(url) + decoder = MultipartDecoder.from_response(response) + for part in decoder.parts: + print(part.headers['content-type']) + + If the multipart content is not from a response, basic usage is:: + + from requests_toolbelt import MultipartDecoder + + decoder = MultipartDecoder(content, content_type) + for part in decoder.parts: + print(part.headers['content-type']) + + For both these usages, there is an optional ``encoding`` parameter. This is + a string, which is the name of the unicode codec to use (default is + ``'utf-8'``). + + """ + def __init__(self, content, content_type, encoding='utf-8'): + #: Original Content-Type header + self.content_type = content_type + #: Response body encoding + self.encoding = encoding + #: Parsed parts of the multipart response body + self.parts = tuple() + self._find_boundary() + self._parse_body(content) + + def _find_boundary(self): + ct_info = tuple(x.strip() for x in self.content_type.split(';')) + mimetype = ct_info[0] + if mimetype.split('/')[0].lower() != 'multipart': + raise NonMultipartContentTypeException( + "Unexpected mimetype in content-type: '{}'".format(mimetype) + ) + for item in ct_info[1:]: + attr, value = _split_on_find( + item, + '=' + ) + if attr.lower() == 'boundary': + self.boundary = encode_with(value.strip('"'), self.encoding) + + @staticmethod + def _fix_first_part(part, boundary_marker): + bm_len = len(boundary_marker) + if boundary_marker == part[:bm_len]: + return part[bm_len:] + else: + return part + + def _parse_body(self, content): + boundary = b''.join((b'--', self.boundary)) + + def body_part(part): + fixed = MultipartDecoder._fix_first_part(part, boundary) + return BodyPart(fixed, self.encoding) + + def test_part(part): + return (part != b'' and + part != b'\r\n' and + part[:4] != b'--\r\n' and + part != b'--') + + parts = content.split(b''.join((b'\r\n', boundary))) + self.parts = tuple(body_part(x) for x in parts if test_part(x)) + + @classmethod + def from_response(cls, response, encoding='utf-8'): + content = response.content + content_type = response.headers.get('content-type', None) + return cls(content, content_type, encoding) diff --git a/Contents/Libraries/Shared/requests_toolbelt/multipart/encoder.py b/Contents/Libraries/Shared/requests_toolbelt/multipart/encoder.py new file mode 100644 index 000000000..c5333be68 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/multipart/encoder.py @@ -0,0 +1,655 @@ +# -*- coding: utf-8 -*- +""" + +requests_toolbelt.multipart.encoder +=================================== + +This holds all of the implementation details of the MultipartEncoder + +""" +import contextlib +import io +import os +from uuid import uuid4 + +import requests + +from .._compat import fields + + +class FileNotSupportedError(Exception): + """File not supported error.""" + + +class MultipartEncoder(object): + + """ + + The ``MultipartEncoder`` object is a generic interface to the engine that + will create a ``multipart/form-data`` body for you. + + The basic usage is: + + .. code-block:: python + + import requests + from requests_toolbelt import MultipartEncoder + + encoder = MultipartEncoder({'field': 'value', + 'other_field', 'other_value'}) + r = requests.post('https://httpbin.org/post', data=encoder, + headers={'Content-Type': encoder.content_type}) + + If you do not need to take advantage of streaming the post body, you can + also do: + + .. code-block:: python + + r = requests.post('https://httpbin.org/post', + data=encoder.to_string(), + headers={'Content-Type': encoder.content_type}) + + If you want the encoder to use a specific order, you can use an + OrderedDict or more simply, a list of tuples: + + .. code-block:: python + + encoder = MultipartEncoder([('field', 'value'), + ('other_field', 'other_value')]) + + .. versionchanged:: 0.4.0 + + You can also provide tuples as part values as you would provide them to + requests' ``files`` parameter. + + .. code-block:: python + + encoder = MultipartEncoder({ + 'field': ('file_name', b'{"a": "b"}', 'application/json', + {'X-My-Header': 'my-value'}) + ]) + + .. warning:: + + This object will end up directly in :mod:`httplib`. Currently, + :mod:`httplib` has a hard-coded read size of **8192 bytes**. This + means that it will loop until the file has been read and your upload + could take a while. This is **not** a bug in requests. A feature is + being considered for this object to allow you, the user, to specify + what size should be returned on a read. If you have opinions on this, + please weigh in on `this issue`_. + + .. _this issue: + https://github.com/requests/toolbelt/issues/75 + + """ + + def __init__(self, fields, boundary=None, encoding='utf-8'): + #: Boundary value either passed in by the user or created + self.boundary_value = boundary or uuid4().hex + + # Computed boundary + self.boundary = '--{}'.format(self.boundary_value) + + #: Encoding of the data being passed in + self.encoding = encoding + + # Pre-encoded boundary + self._encoded_boundary = b''.join([ + encode_with(self.boundary, self.encoding), + encode_with('\r\n', self.encoding) + ]) + + #: Fields provided by the user + self.fields = fields + + #: Whether or not the encoder is finished + self.finished = False + + #: Pre-computed parts of the upload + self.parts = [] + + # Pre-computed parts iterator + self._iter_parts = iter([]) + + # The part we're currently working with + self._current_part = None + + # Cached computation of the body's length + self._len = None + + # Our buffer + self._buffer = CustomBytesIO(encoding=encoding) + + # Pre-compute each part's headers + self._prepare_parts() + + # Load boundary into buffer + self._write_boundary() + + @property + def len(self): + """Length of the multipart/form-data body. + + requests will first attempt to get the length of the body by calling + ``len(body)`` and then by checking for the ``len`` attribute. + + On 32-bit systems, the ``__len__`` method cannot return anything + larger than an integer (in C) can hold. If the total size of the body + is even slightly larger than 4GB users will see an OverflowError. This + manifested itself in `bug #80`_. + + As such, we now calculate the length lazily as a property. + + .. _bug #80: + https://github.com/requests/toolbelt/issues/80 + """ + # If _len isn't already calculated, calculate, return, and set it + return self._len or self._calculate_length() + + def __repr__(self): + return '<MultipartEncoder: {!r}>'.format(self.fields) + + def _calculate_length(self): + """ + This uses the parts to calculate the length of the body. + + This returns the calculated length so __len__ can be lazy. + """ + boundary_len = len(self.boundary) # Length of --{boundary} + # boundary length + header length + body length + len('\r\n') * 2 + self._len = sum( + (boundary_len + total_len(p) + 4) for p in self.parts + ) + boundary_len + 4 + return self._len + + def _calculate_load_amount(self, read_size): + """This calculates how many bytes need to be added to the buffer. + + When a consumer read's ``x`` from the buffer, there are two cases to + satisfy: + + 1. Enough data in the buffer to return the requested amount + 2. Not enough data + + This function uses the amount of unread bytes in the buffer and + determines how much the Encoder has to load before it can return the + requested amount of bytes. + + :param int read_size: the number of bytes the consumer requests + :returns: int -- the number of bytes that must be loaded into the + buffer before the read can be satisfied. This will be strictly + non-negative + """ + amount = read_size - total_len(self._buffer) + return amount if amount > 0 else 0 + + def _load(self, amount): + """Load ``amount`` number of bytes into the buffer.""" + self._buffer.smart_truncate() + part = self._current_part or self._next_part() + while amount == -1 or amount > 0: + written = 0 + if part and not part.bytes_left_to_write(): + written += self._write(b'\r\n') + written += self._write_boundary() + part = self._next_part() + + if not part: + written += self._write_closing_boundary() + self.finished = True + break + + written += part.write_to(self._buffer, amount) + + if amount != -1: + amount -= written + + def _next_part(self): + try: + p = self._current_part = next(self._iter_parts) + except StopIteration: + p = None + return p + + def _iter_fields(self): + _fields = self.fields + if hasattr(self.fields, 'items'): + _fields = list(self.fields.items()) + for k, v in _fields: + file_name = None + file_type = None + file_headers = None + if isinstance(v, (list, tuple)): + if len(v) == 2: + file_name, file_pointer = v + elif len(v) == 3: + file_name, file_pointer, file_type = v + else: + file_name, file_pointer, file_type, file_headers = v + else: + file_pointer = v + + field = fields.RequestField(name=k, data=file_pointer, + filename=file_name, + headers=file_headers) + field.make_multipart(content_type=file_type) + yield field + + def _prepare_parts(self): + """This uses the fields provided by the user and creates Part objects. + + It populates the `parts` attribute and uses that to create a + generator for iteration. + """ + enc = self.encoding + self.parts = [Part.from_field(f, enc) for f in self._iter_fields()] + self._iter_parts = iter(self.parts) + + def _write(self, bytes_to_write): + """Write the bytes to the end of the buffer. + + :param bytes bytes_to_write: byte-string (or bytearray) to append to + the buffer + :returns: int -- the number of bytes written + """ + return self._buffer.append(bytes_to_write) + + def _write_boundary(self): + """Write the boundary to the end of the buffer.""" + return self._write(self._encoded_boundary) + + def _write_closing_boundary(self): + """Write the bytes necessary to finish a multipart/form-data body.""" + with reset(self._buffer): + self._buffer.seek(-2, 2) + self._buffer.write(b'--\r\n') + return 2 + + def _write_headers(self, headers): + """Write the current part's headers to the buffer.""" + return self._write(encode_with(headers, self.encoding)) + + @property + def content_type(self): + return str( + 'multipart/form-data; boundary={}'.format(self.boundary_value) + ) + + def to_string(self): + """Return the entirety of the data in the encoder. + + .. note:: + + This simply reads all of the data it can. If you have started + streaming or reading data from the encoder, this method will only + return whatever data is left in the encoder. + + .. note:: + + This method affects the internal state of the encoder. Calling + this method will exhaust the encoder. + + :returns: the multipart message + :rtype: bytes + """ + + return self.read() + + def read(self, size=-1): + """Read data from the streaming encoder. + + :param int size: (optional), If provided, ``read`` will return exactly + that many bytes. If it is not provided, it will return the + remaining bytes. + :returns: bytes + """ + if self.finished: + return self._buffer.read(size) + + bytes_to_load = size + if bytes_to_load != -1 and bytes_to_load is not None: + bytes_to_load = self._calculate_load_amount(int(size)) + + self._load(bytes_to_load) + return self._buffer.read(size) + + +def IDENTITY(monitor): + return monitor + + +class MultipartEncoderMonitor(object): + + """ + An object used to monitor the progress of a :class:`MultipartEncoder`. + + The :class:`MultipartEncoder` should only be responsible for preparing and + streaming the data. For anyone who wishes to monitor it, they shouldn't be + using that instance to manage that as well. Using this class, they can + monitor an encoder and register a callback. The callback receives the + instance of the monitor. + + To use this monitor, you construct your :class:`MultipartEncoder` as you + normally would. + + .. code-block:: python + + from requests_toolbelt import (MultipartEncoder, + MultipartEncoderMonitor) + import requests + + def callback(monitor): + # Do something with this information + pass + + m = MultipartEncoder(fields={'field0': 'value0'}) + monitor = MultipartEncoderMonitor(m, callback) + headers = {'Content-Type': monitor.content_type} + r = requests.post('https://httpbin.org/post', data=monitor, + headers=headers) + + Alternatively, if your use case is very simple, you can use the following + pattern. + + .. code-block:: python + + from requests_toolbelt import MultipartEncoderMonitor + import requests + + def callback(monitor): + # Do something with this information + pass + + monitor = MultipartEncoderMonitor.from_fields( + fields={'field0': 'value0'}, callback + ) + headers = {'Content-Type': montior.content_type} + r = requests.post('https://httpbin.org/post', data=monitor, + headers=headers) + + """ + + def __init__(self, encoder, callback=None): + #: Instance of the :class:`MultipartEncoder` being monitored + self.encoder = encoder + + #: Optionally function to call after a read + self.callback = callback or IDENTITY + + #: Number of bytes already read from the :class:`MultipartEncoder` + #: instance + self.bytes_read = 0 + + #: Avoid the same problem in bug #80 + self.len = self.encoder.len + + @classmethod + def from_fields(cls, fields, boundary=None, encoding='utf-8', + callback=None): + encoder = MultipartEncoder(fields, boundary, encoding) + return cls(encoder, callback) + + @property + def content_type(self): + return self.encoder.content_type + + def to_string(self): + return self.read() + + def read(self, size=-1): + string = self.encoder.read(size) + self.bytes_read += len(string) + self.callback(self) + return string + + +def encode_with(string, encoding): + """Encoding ``string`` with ``encoding`` if necessary. + + :param str string: If string is a bytes object, it will not encode it. + Otherwise, this function will encode it with the provided encoding. + :param str encoding: The encoding with which to encode string. + :returns: encoded bytes object + """ + if not (string is None or isinstance(string, bytes)): + return string.encode(encoding) + return string + + +def readable_data(data, encoding): + """Coerce the data to an object with a ``read`` method.""" + if hasattr(data, 'read'): + return data + + return CustomBytesIO(data, encoding) + + +def total_len(o): + if hasattr(o, '__len__'): + return len(o) + + if hasattr(o, 'len'): + return o.len + + if hasattr(o, 'fileno'): + try: + fileno = o.fileno() + except io.UnsupportedOperation: + pass + else: + return os.fstat(fileno).st_size + + if hasattr(o, 'getvalue'): + # e.g. BytesIO, cStringIO.StringIO + return len(o.getvalue()) + + +@contextlib.contextmanager +def reset(buffer): + """Keep track of the buffer's current position and write to the end. + + This is a context manager meant to be used when adding data to the buffer. + It eliminates the need for every function to be concerned with the + position of the cursor in the buffer. + """ + original_position = buffer.tell() + buffer.seek(0, 2) + yield + buffer.seek(original_position, 0) + + +def coerce_data(data, encoding): + """Ensure that every object's __len__ behaves uniformly.""" + if not isinstance(data, CustomBytesIO): + if hasattr(data, 'getvalue'): + return CustomBytesIO(data.getvalue(), encoding) + + if hasattr(data, 'fileno'): + return FileWrapper(data) + + if not hasattr(data, 'read'): + return CustomBytesIO(data, encoding) + + return data + + +def to_list(fields): + if hasattr(fields, 'items'): + return list(fields.items()) + return list(fields) + + +class Part(object): + def __init__(self, headers, body): + self.headers = headers + self.body = body + self.headers_unread = True + self.len = len(self.headers) + total_len(self.body) + + @classmethod + def from_field(cls, field, encoding): + """Create a part from a Request Field generated by urllib3.""" + headers = encode_with(field.render_headers(), encoding) + body = coerce_data(field.data, encoding) + return cls(headers, body) + + def bytes_left_to_write(self): + """Determine if there are bytes left to write. + + :returns: bool -- ``True`` if there are bytes left to write, otherwise + ``False`` + """ + to_read = 0 + if self.headers_unread: + to_read += len(self.headers) + + return (to_read + total_len(self.body)) > 0 + + def write_to(self, buffer, size): + """Write the requested amount of bytes to the buffer provided. + + The number of bytes written may exceed size on the first read since we + load the headers ambitiously. + + :param CustomBytesIO buffer: buffer we want to write bytes to + :param int size: number of bytes requested to be written to the buffer + :returns: int -- number of bytes actually written + """ + written = 0 + if self.headers_unread: + written += buffer.append(self.headers) + self.headers_unread = False + + while total_len(self.body) > 0 and (size == -1 or written < size): + amount_to_read = size + if size != -1: + amount_to_read = size - written + written += buffer.append(self.body.read(amount_to_read)) + + return written + + +class CustomBytesIO(io.BytesIO): + def __init__(self, buffer=None, encoding='utf-8'): + buffer = encode_with(buffer, encoding) + super(CustomBytesIO, self).__init__(buffer) + + def _get_end(self): + current_pos = self.tell() + self.seek(0, 2) + length = self.tell() + self.seek(current_pos, 0) + return length + + @property + def len(self): + length = self._get_end() + return length - self.tell() + + def append(self, bytes): + with reset(self): + written = self.write(bytes) + return written + + def smart_truncate(self): + to_be_read = total_len(self) + already_read = self._get_end() - to_be_read + + if already_read >= to_be_read: + old_bytes = self.read() + self.seek(0, 0) + self.truncate() + self.write(old_bytes) + self.seek(0, 0) # We want to be at the beginning + + +class FileWrapper(object): + def __init__(self, file_object): + self.fd = file_object + + @property + def len(self): + return total_len(self.fd) - self.fd.tell() + + def read(self, length=-1): + return self.fd.read(length) + + +class FileFromURLWrapper(object): + """File from URL wrapper. + + The :class:`FileFromURLWrapper` object gives you the ability to stream file + from provided URL in chunks by :class:`MultipartEncoder`. + Provide a stateless solution for streaming file from one server to another. + You can use the :class:`FileFromURLWrapper` without a session or with + a session as demonstated by the examples below: + + .. code-block:: python + # no session + + import requests + from requests_toolbelt import MultipartEncoder, FileFromURLWrapper + + url = 'https://httpbin.org/image/png' + streaming_encoder = MultipartEncoder( + fields={ + 'file': FileFromURLWrapper(url) + } + ) + r = requests.post( + 'https://httpbin.org/post', data=streaming_encoder, + headers={'Content-Type': streaming_encoder.content_type} + ) + + .. code-block:: python + # using a session + + import requests + from requests_toolbelt import MultipartEncoder, FileFromURLWrapper + + session = requests.Session() + url = 'https://httpbin.org/image/png' + streaming_encoder = MultipartEncoder( + fields={ + 'file': FileFromURLWrapper(url, session=session) + } + ) + r = session.post( + 'https://httpbin.org/post', data=streaming_encoder, + headers={'Content-Type': streaming_encoder.content_type} + ) + + """ + + def __init__(self, file_url, session=None): + self.session = session or requests.Session() + requested_file = self._request_for_file(file_url) + self.len = int(requested_file.headers['content-length']) + self.raw_data = requested_file.raw + + def _request_for_file(self, file_url): + """Make call for file under provided URL.""" + response = self.session.get(file_url, stream=True) + content_length = response.headers.get('content-length', None) + if content_length is None: + error_msg = ( + "Data from provided URL {url} is not supported. Lack of " + "content-length Header in requested file response.".format( + url=file_url) + ) + raise FileNotSupportedError(error_msg) + elif not content_length.isdigit(): + error_msg = ( + "Data from provided URL {url} is not supported. content-length" + " header value is not a digit.".format(url=file_url) + ) + raise FileNotSupportedError(error_msg) + return response + + def read(self, chunk_size): + """Read file in chunks.""" + chunk_size = chunk_size if chunk_size >= 0 else self.len + chunk = self.raw_data.read(chunk_size) or b'' + self.len -= len(chunk) if chunk else 0 # left to read + return chunk diff --git a/Contents/Libraries/Shared/requests_toolbelt/sessions.py b/Contents/Libraries/Shared/requests_toolbelt/sessions.py new file mode 100644 index 000000000..362924ff4 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/sessions.py @@ -0,0 +1,70 @@ +import requests + +from ._compat import urljoin + + +class BaseUrlSession(requests.Session): + """A Session with a URL that all requests will use as a base. + + Let's start by looking at an example: + + .. code-block:: python + + >>> from requests_toolbelt import sessions + >>> s = sessions.BaseUrlSession( + ... base_url='https://example.com/resource/') + >>> r = s.get('sub-resource/', params={'foo': 'bar'}) + >>> print(r.request.url) + https://example.com/resource/sub-resource/?foo=bar + + Our call to the ``get`` method will make a request to the URL passed in + when we created the Session and the partial resource name we provide. + + We implement this by overriding the ``request`` method so most uses of a + Session are covered. (This, however, precludes the use of PreparedRequest + objects). + + .. note:: + + The base URL that you provide and the path you provide are **very** + important. + + Let's look at another *similar* example + + .. code-block:: python + + >>> from requests_toolbelt import sessions + >>> s = sessions.BaseUrlSession( + ... base_url='https://example.com/resource/') + >>> r = s.get('/sub-resource/', params={'foo': 'bar'}) + >>> print(r.request.url) + https://example.com/sub-resource/?foo=bar + + The key difference here is that we called ``get`` with ``/sub-resource/``, + i.e., there was a leading ``/``. This changes how we create the URL + because we rely on :mod:`urllib.parse.urljoin`. + + To override how we generate the URL, sub-class this method and override the + ``create_url`` method. + + Based on implementation from + https://github.com/kennethreitz/requests/issues/2554#issuecomment-109341010 + """ + + base_url = None + + def __init__(self, base_url=None): + if base_url: + self.base_url = base_url + super(BaseUrlSession, self).__init__() + + def request(self, method, url, *args, **kwargs): + """Send the request after generating the complete URL.""" + url = self.create_url(url) + return super(BaseUrlSession, self).request( + method, url, *args, **kwargs + ) + + def create_url(self, url): + """Create the URL based off this partial path.""" + return urljoin(self.base_url, url) diff --git a/Contents/Libraries/Shared/requests_toolbelt/streaming_iterator.py b/Contents/Libraries/Shared/requests_toolbelt/streaming_iterator.py new file mode 100644 index 000000000..64fd75f16 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/streaming_iterator.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- +""" + +requests_toolbelt.streaming_iterator +==================================== + +This holds the implementation details for the :class:`StreamingIterator`. It +is designed for the case where you, the user, know the size of the upload but +need to provide the data as an iterator. This class will allow you to specify +the size and stream the data without using a chunked transfer-encoding. + +""" +from requests.utils import super_len + +from .multipart.encoder import CustomBytesIO, encode_with + + +class StreamingIterator(object): + + """ + This class provides a way of allowing iterators with a known size to be + streamed instead of chunked. + + In requests, if you pass in an iterator it assumes you want to use + chunked transfer-encoding to upload the data, which not all servers + support well. Additionally, you may want to set the content-length + yourself to avoid this but that will not work. The only way to preempt + requests using a chunked transfer-encoding and forcing it to stream the + uploads is to mimic a very specific interace. Instead of having to know + these details you can instead just use this class. You simply provide the + size and iterator and pass the instance of StreamingIterator to requests + via the data parameter like so: + + .. code-block:: python + + from requests_toolbelt import StreamingIterator + + import requests + + # Let iterator be some generator that you already have and size be + # the size of the data produced by the iterator + + r = requests.post(url, data=StreamingIterator(size, iterator)) + + You can also pass file-like objects to :py:class:`StreamingIterator` in + case requests can't determize the filesize itself. This is the case with + streaming file objects like ``stdin`` or any sockets. Wrapping e.g. files + that are on disk with ``StreamingIterator`` is unnecessary, because + requests can determine the filesize itself. + + Naturally, you should also set the `Content-Type` of your upload + appropriately because the toolbelt will not attempt to guess that for you. + """ + + def __init__(self, size, iterator, encoding='utf-8'): + #: The expected size of the upload + self.size = int(size) + + if self.size < 0: + raise ValueError( + 'The size of the upload must be a positive integer' + ) + + #: Attribute that requests will check to determine the length of the + #: body. See bug #80 for more details + self.len = self.size + + #: Encoding the input data is using + self.encoding = encoding + + #: The iterator used to generate the upload data + self.iterator = iterator + + if hasattr(iterator, 'read'): + self._file = iterator + else: + self._file = _IteratorAsBinaryFile(iterator, encoding) + + def read(self, size=-1): + return encode_with(self._file.read(size), self.encoding) + + +class _IteratorAsBinaryFile(object): + def __init__(self, iterator, encoding='utf-8'): + #: The iterator used to generate the upload data + self.iterator = iterator + + #: Encoding the iterator is using + self.encoding = encoding + + # The buffer we use to provide the correct number of bytes requested + # during a read + self._buffer = CustomBytesIO() + + def _get_bytes(self): + try: + return encode_with(next(self.iterator), self.encoding) + except StopIteration: + return b'' + + def _load_bytes(self, size): + self._buffer.smart_truncate() + amount_to_load = size - super_len(self._buffer) + bytes_to_append = True + + while amount_to_load > 0 and bytes_to_append: + bytes_to_append = self._get_bytes() + amount_to_load -= self._buffer.append(bytes_to_append) + + def read(self, size=-1): + size = int(size) + if size == -1: + return b''.join(self.iterator) + + self._load_bytes(size) + return self._buffer.read(size) diff --git a/Contents/Libraries/Shared/requests_toolbelt/threaded/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/threaded/__init__.py new file mode 100644 index 000000000..984f1e801 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/threaded/__init__.py @@ -0,0 +1,97 @@ +""" +This module provides the API for ``requests_toolbelt.threaded``. + +The module provides a clean and simple API for making requests via a thread +pool. The thread pool will use sessions for increased performance. + +A simple use-case is: + +.. code-block:: python + + from requests_toolbelt import threaded + + urls_to_get = [{ + 'url': 'https://api.github.com/users/sigmavirus24', + 'method': 'GET', + }, { + 'url': 'https://api.github.com/repos/requests/toolbelt', + 'method': 'GET', + }, { + 'url': 'https://google.com', + 'method': 'GET', + }] + responses, errors = threaded.map(urls_to_get) + +By default, the threaded submodule will detect the number of CPUs your +computer has and use that if no other number of processes is selected. To +change this, always use the keyword argument ``num_processes``. Using the +above example, we would expand it like so: + +.. code-block:: python + + responses, errors = threaded.map(urls_to_get, num_processes=10) + +You can also customize how a :class:`requests.Session` is initialized by +creating a callback function: + +.. code-block:: python + + from requests_toolbelt import user_agent + + def initialize_session(session): + session.headers['User-Agent'] = user_agent('my-scraper', '0.1') + session.headers['Accept'] = 'application/json' + + responses, errors = threaded.map(urls_to_get, + initializer=initialize_session) + +.. autofunction:: requests_toolbelt.threaded.map + +Inspiration is blatantly drawn from the standard library's multiprocessing +library. See the following references: + +- multiprocessing's `pool source`_ + +- map and map_async `inspiration`_ + +.. _pool source: + https://hg.python.org/cpython/file/8ef4f75a8018/Lib/multiprocessing/pool.py +.. _inspiration: + https://hg.python.org/cpython/file/8ef4f75a8018/Lib/multiprocessing/pool.py#l340 +""" +from . import pool +from .._compat import queue + + +def map(requests, **kwargs): + r"""Simple interface to the threaded Pool object. + + This function takes a list of dictionaries representing requests to make + using Sessions in threads and returns a tuple where the first item is + a generator of successful responses and the second is a generator of + exceptions. + + :param list requests: + Collection of dictionaries representing requests to make with the Pool + object. + :param \*\*kwargs: + Keyword arguments that are passed to the + :class:`~requests_toolbelt.threaded.pool.Pool` object. + :returns: Tuple of responses and exceptions from the pool + :rtype: (:class:`~requests_toolbelt.threaded.pool.ThreadResponse`, + :class:`~requests_toolbelt.threaded.pool.ThreadException`) + """ + if not (requests and all(isinstance(r, dict) for r in requests)): + raise ValueError('map expects a list of dictionaries.') + + # Build our queue of requests + job_queue = queue.Queue() + for request in requests: + job_queue.put(request) + + # Ensure the user doesn't try to pass their own job_queue + kwargs['job_queue'] = job_queue + + threadpool = pool.Pool(**kwargs) + threadpool.join_all() + return threadpool.responses(), threadpool.exceptions() diff --git a/Contents/Libraries/Shared/requests_toolbelt/threaded/pool.py b/Contents/Libraries/Shared/requests_toolbelt/threaded/pool.py new file mode 100644 index 000000000..1fe81461a --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/threaded/pool.py @@ -0,0 +1,211 @@ +"""Module implementing the Pool for :mod:``requests_toolbelt.threaded``.""" +import multiprocessing +import requests + +from . import thread +from .._compat import queue + + +class Pool(object): + """Pool that manages the threads containing sessions. + + :param queue: + The queue you're expected to use to which you should add items. + :type queue: queue.Queue + :param initializer: + Function used to initialize an instance of ``session``. + :type initializer: collections.Callable + :param auth_generator: + Function used to generate new auth credentials for the session. + :type auth_generator: collections.Callable + :param int num_process: + Number of threads to create. + :param session: + :type session: requests.Session + """ + + def __init__(self, job_queue, initializer=None, auth_generator=None, + num_processes=None, session=requests.Session): + if num_processes is None: + num_processes = multiprocessing.cpu_count() or 1 + + if num_processes < 1: + raise ValueError("Number of processes should at least be 1.") + + self._job_queue = job_queue + self._response_queue = queue.Queue() + self._exc_queue = queue.Queue() + self._processes = num_processes + self._initializer = initializer or _identity + self._auth = auth_generator or _identity + self._session = session + self._pool = [ + thread.SessionThread(self._new_session(), self._job_queue, + self._response_queue, self._exc_queue) + for _ in range(self._processes) + ] + + def _new_session(self): + return self._auth(self._initializer(self._session())) + + @classmethod + def from_exceptions(cls, exceptions, **kwargs): + r"""Create a :class:`~Pool` from an :class:`~ThreadException`\ s. + + Provided an iterable that provides :class:`~ThreadException` objects, + this classmethod will generate a new pool to retry the requests that + caused the exceptions. + + :param exceptions: + Iterable that returns :class:`~ThreadException` + :type exceptions: iterable + :param kwargs: + Keyword arguments passed to the :class:`~Pool` initializer. + :returns: An initialized :class:`~Pool` object. + :rtype: :class:`~Pool` + """ + job_queue = queue.Queue() + for exc in exceptions: + job_queue.put(exc.request_kwargs) + + return cls(job_queue=job_queue, **kwargs) + + @classmethod + def from_urls(cls, urls, request_kwargs=None, **kwargs): + """Create a :class:`~Pool` from an iterable of URLs. + + :param urls: + Iterable that returns URLs with which we create a pool. + :type urls: iterable + :param dict request_kwargs: + Dictionary of other keyword arguments to provide to the request + method. + :param kwargs: + Keyword arguments passed to the :class:`~Pool` initializer. + :returns: An initialized :class:`~Pool` object. + :rtype: :class:`~Pool` + """ + request_dict = {'method': 'GET'} + request_dict.update(request_kwargs or {}) + job_queue = queue.Queue() + for url in urls: + job = request_dict.copy() + job.update({'url': url}) + job_queue.put(job) + + return cls(job_queue=job_queue, **kwargs) + + def exceptions(self): + """Iterate over all the exceptions in the pool. + + :returns: Generator of :class:`~ThreadException` + """ + while True: + exc = self.get_exception() + if exc is None: + break + yield exc + + def get_exception(self): + """Get an exception from the pool. + + :rtype: :class:`~ThreadException` + """ + try: + (request, exc) = self._exc_queue.get_nowait() + except queue.Empty: + return None + else: + return ThreadException(request, exc) + + def get_response(self): + """Get a response from the pool. + + :rtype: :class:`~ThreadResponse` + """ + try: + (request, response) = self._response_queue.get_nowait() + except queue.Empty: + return None + else: + return ThreadResponse(request, response) + + def responses(self): + """Iterate over all the responses in the pool. + + :returns: Generator of :class:`~ThreadResponse` + """ + while True: + resp = self.get_response() + if resp is None: + break + yield resp + + def join_all(self): + """Join all the threads to the master thread.""" + for session_thread in self._pool: + session_thread.join() + + +class ThreadProxy(object): + proxied_attr = None + + def __getattr__(self, attr): + """Proxy attribute accesses to the proxied object.""" + get = object.__getattribute__ + if attr not in self.attrs: + response = get(self, self.proxied_attr) + return getattr(response, attr) + else: + return get(self, attr) + + +class ThreadResponse(ThreadProxy): + """A wrapper around a requests Response object. + + This will proxy most attribute access actions to the Response object. For + example, if you wanted the parsed JSON from the response, you might do: + + .. code-block:: python + + thread_response = pool.get_response() + json = thread_response.json() + + """ + proxied_attr = 'response' + attrs = frozenset(['request_kwargs', 'response']) + + def __init__(self, request_kwargs, response): + #: The original keyword arguments provided to the queue + self.request_kwargs = request_kwargs + #: The wrapped response + self.response = response + + +class ThreadException(ThreadProxy): + """A wrapper around an exception raised during a request. + + This will proxy most attribute access actions to the exception object. For + example, if you wanted the message from the exception, you might do: + + .. code-block:: python + + thread_exc = pool.get_exception() + msg = thread_exc.message + + """ + proxied_attr = 'exception' + attrs = frozenset(['request_kwargs', 'exception']) + + def __init__(self, request_kwargs, exception): + #: The original keyword arguments provided to the queue + self.request_kwargs = request_kwargs + #: The captured and wrapped exception + self.exception = exception + + +def _identity(session_obj): + return session_obj + + +__all__ = ['ThreadException', 'ThreadResponse', 'Pool'] diff --git a/Contents/Libraries/Shared/requests_toolbelt/threaded/thread.py b/Contents/Libraries/Shared/requests_toolbelt/threaded/thread.py new file mode 100644 index 000000000..542813c1f --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/threaded/thread.py @@ -0,0 +1,53 @@ +"""Module containing the SessionThread class.""" +import threading +import uuid + +import requests.exceptions as exc + +from .._compat import queue + + +class SessionThread(object): + def __init__(self, initialized_session, job_queue, response_queue, + exception_queue): + self._session = initialized_session + self._jobs = job_queue + self._create_worker() + self._responses = response_queue + self._exceptions = exception_queue + + def _create_worker(self): + self._worker = threading.Thread( + target=self._make_request, + name=uuid.uuid4(), + ) + self._worker.daemon = True + self._worker._state = 0 + self._worker.start() + + def _handle_request(self, kwargs): + try: + response = self._session.request(**kwargs) + except exc.RequestException as e: + self._exceptions.put((kwargs, e)) + else: + self._responses.put((kwargs, response)) + finally: + self._jobs.task_done() + + def _make_request(self): + while True: + try: + kwargs = self._jobs.get_nowait() + except queue.Empty: + break + + self._handle_request(kwargs) + + def is_alive(self): + """Proxy to the thread's ``is_alive`` method.""" + return self._worker.is_alive() + + def join(self): + """Join this thread to the master thread.""" + self._worker.join() diff --git a/Contents/Libraries/Shared/requests_toolbelt/utils/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/requests_toolbelt/utils/deprecated.py b/Contents/Libraries/Shared/requests_toolbelt/utils/deprecated.py new file mode 100644 index 000000000..c935783bd --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/utils/deprecated.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +"""A collection of functions deprecated in requests.utils.""" +import re +import sys + +from requests import utils + +find_charset = re.compile( + br'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I +).findall + +find_pragma = re.compile( + br'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I +).findall + +find_xml = re.compile( + br'^<\?xml.*?encoding=["\']*(.+?)["\'>]' +).findall + + +def get_encodings_from_content(content): + """Return encodings from given content string. + + .. code-block:: python + + import requests + from requests_toolbelt.utils import deprecated + + r = requests.get(url) + encodings = deprecated.get_encodings_from_content(r) + + :param content: bytestring to extract encodings from + :type content: bytes + :return: encodings detected in the provided content + :rtype: list(str) + """ + encodings = (find_charset(content) + find_pragma(content) + + find_xml(content)) + if (3, 0) <= sys.version_info < (4, 0): + encodings = [encoding.decode('utf8') for encoding in encodings] + return encodings + + +def get_unicode_from_response(response): + """Return the requested content back in unicode. + + This will first attempt to retrieve the encoding from the response + headers. If that fails, it will use + :func:`requests_toolbelt.utils.deprecated.get_encodings_from_content` + to determine encodings from HTML elements. + + .. code-block:: python + + import requests + from requests_toolbelt.utils import deprecated + + r = requests.get(url) + text = deprecated.get_unicode_from_response(r) + + :param response: Response object to get unicode content from. + :type response: requests.models.Response + """ + tried_encodings = set() + + # Try charset from content-type + encoding = utils.get_encoding_from_headers(response.headers) + + if encoding: + try: + return str(response.content, encoding) + except UnicodeError: + tried_encodings.add(encoding.lower()) + + encodings = get_encodings_from_content(response.content) + + for _encoding in encodings: + _encoding = _encoding.lower() + if _encoding in tried_encodings: + continue + try: + return str(response.content, _encoding) + except UnicodeError: + tried_encodings.add(_encoding) + + # Fall back: + if encoding: + try: + return str(response.content, encoding, errors='replace') + except TypeError: + pass + return response.text diff --git a/Contents/Libraries/Shared/requests_toolbelt/utils/dump.py b/Contents/Libraries/Shared/requests_toolbelt/utils/dump.py new file mode 100644 index 000000000..23b35e75a --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/utils/dump.py @@ -0,0 +1,197 @@ +"""This module provides functions for dumping information about responses.""" +import collections + +from requests import compat + + +__all__ = ('dump_response', 'dump_all') + +HTTP_VERSIONS = { + 9: b'0.9', + 10: b'1.0', + 11: b'1.1', +} + +_PrefixSettings = collections.namedtuple('PrefixSettings', + ['request', 'response']) + + +class PrefixSettings(_PrefixSettings): + def __new__(cls, request, response): + request = _coerce_to_bytes(request) + response = _coerce_to_bytes(response) + return super(PrefixSettings, cls).__new__(cls, request, response) + + +def _get_proxy_information(response): + if getattr(response.connection, 'proxy_manager', False): + proxy_info = {} + request_url = response.request.url + if request_url.startswith('https://'): + proxy_info['method'] = 'CONNECT' + + proxy_info['request_path'] = request_url + return proxy_info + return None + + +def _format_header(name, value): + return (_coerce_to_bytes(name) + b': ' + _coerce_to_bytes(value) + + b'\r\n') + + +def _build_request_path(url, proxy_info): + uri = compat.urlparse(url) + proxy_url = proxy_info.get('request_path') + if proxy_url is not None: + request_path = _coerce_to_bytes(proxy_url) + return request_path, uri + + request_path = _coerce_to_bytes(uri.path) + if uri.query: + request_path += b'?' + _coerce_to_bytes(uri.query) + + return request_path, uri + + +def _dump_request_data(request, prefixes, bytearr, proxy_info=None): + if proxy_info is None: + proxy_info = {} + + prefix = prefixes.request + method = _coerce_to_bytes(proxy_info.pop('method', request.method)) + request_path, uri = _build_request_path(request.url, proxy_info) + + # <prefix><METHOD> <request-path> HTTP/1.1 + bytearr.extend(prefix + method + b' ' + request_path + b' HTTP/1.1\r\n') + + # <prefix>Host: <request-host> OR host header specified by user + headers = request.headers.copy() + host_header = _coerce_to_bytes(headers.pop('Host', uri.netloc)) + bytearr.extend(prefix + b'Host: ' + host_header + b'\r\n') + + for name, value in headers.items(): + bytearr.extend(prefix + _format_header(name, value)) + + bytearr.extend(prefix + b'\r\n') + if request.body: + if isinstance(request.body, compat.basestring): + bytearr.extend(prefix + _coerce_to_bytes(request.body)) + else: + # In the event that the body is a file-like object, let's not try + # to read everything into memory. + bytearr.extend(b'<< Request body is not a string-like type >>') + bytearr.extend(b'\r\n') + + +def _dump_response_data(response, prefixes, bytearr): + prefix = prefixes.response + # Let's interact almost entirely with urllib3's response + raw = response.raw + + # Let's convert the version int from httplib to bytes + version_str = HTTP_VERSIONS.get(raw.version, b'?') + + # <prefix>HTTP/<version_str> <status_code> <reason> + bytearr.extend(prefix + b'HTTP/' + version_str + b' ' + + str(raw.status).encode('ascii') + b' ' + + _coerce_to_bytes(response.reason) + b'\r\n') + + headers = raw.headers + for name in headers.keys(): + for value in headers.getlist(name): + bytearr.extend(prefix + _format_header(name, value)) + + bytearr.extend(prefix + b'\r\n') + + bytearr.extend(response.content) + + +def _coerce_to_bytes(data): + if not isinstance(data, bytes) and hasattr(data, 'encode'): + data = data.encode('utf-8') + # Don't bail out with an exception if data is None + return data if data is not None else b'' + + +def dump_response(response, request_prefix=b'< ', response_prefix=b'> ', + data_array=None): + """Dump a single request-response cycle's information. + + This will take a response object and dump only the data that requests can + see for that single request-response cycle. + + Example:: + + import requests + from requests_toolbelt.utils import dump + + resp = requests.get('https://api.github.com/users/sigmavirus24') + data = dump.dump_response(resp) + print(data.decode('utf-8')) + + :param response: + The response to format + :type response: :class:`requests.Response` + :param request_prefix: (*optional*) + Bytes to prefix each line of the request data + :type request_prefix: :class:`bytes` + :param response_prefix: (*optional*) + Bytes to prefix each line of the response data + :type response_prefix: :class:`bytes` + :param data_array: (*optional*) + Bytearray to which we append the request-response cycle data + :type data_array: :class:`bytearray` + :returns: Formatted bytes of request and response information. + :rtype: :class:`bytearray` + """ + data = data_array if data_array is not None else bytearray() + prefixes = PrefixSettings(request_prefix, response_prefix) + + if not hasattr(response, 'request'): + raise ValueError('Response has no associated request') + + proxy_info = _get_proxy_information(response) + _dump_request_data(response.request, prefixes, data, + proxy_info=proxy_info) + _dump_response_data(response, prefixes, data) + return data + + +def dump_all(response, request_prefix=b'< ', response_prefix=b'> '): + """Dump all requests and responses including redirects. + + This takes the response returned by requests and will dump all + request-response pairs in the redirect history in order followed by the + final request-response. + + Example:: + + import requests + from requests_toolbelt.utils import dump + + resp = requests.get('https://httpbin.org/redirect/5') + data = dump.dump_all(resp) + print(data.decode('utf-8')) + + :param response: + The response to format + :type response: :class:`requests.Response` + :param request_prefix: (*optional*) + Bytes to prefix each line of the request data + :type request_prefix: :class:`bytes` + :param response_prefix: (*optional*) + Bytes to prefix each line of the response data + :type response_prefix: :class:`bytes` + :returns: Formatted bytes of request and response information. + :rtype: :class:`bytearray` + """ + data = bytearray() + + history = list(response.history[:]) + history.append(response) + + for response in history: + dump_response(response, request_prefix, response_prefix, data) + + return data diff --git a/Contents/Libraries/Shared/requests_toolbelt/utils/formdata.py b/Contents/Libraries/Shared/requests_toolbelt/utils/formdata.py new file mode 100644 index 000000000..b0a909d24 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/utils/formdata.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +"""Implementation of nested form-data encoding function(s).""" +from .._compat import basestring +from .._compat import urlencode as _urlencode + + +__all__ = ('urlencode',) + + +def urlencode(query, *args, **kwargs): + """Handle nested form-data queries and serialize them appropriately. + + There are times when a website expects a nested form data query to be sent + but, the standard library's urlencode function does not appropriately + handle the nested structures. In that case, you need this function which + will flatten the structure first and then properly encode it for you. + + When using this to send data in the body of a request, make sure you + specify the appropriate Content-Type header for the request. + + .. code-block:: python + + import requests + from requests_toolbelt.utils import formdata + + query = { + 'my_dict': { + 'foo': 'bar', + 'biz': 'baz", + }, + 'a': 'b', + } + + resp = requests.get(url, params=formdata.urlencode(query)) + # or + resp = requests.post( + url, + data=formdata.urlencode(query), + headers={ + 'Content-Type': 'application/x-www-form-urlencoded' + }, + ) + + Similarly, you can specify a list of nested tuples, e.g., + + .. code-block:: python + + import requests + from requests_toolbelt.utils import formdata + + query = [ + ('my_list', [ + ('foo', 'bar'), + ('biz', 'baz'), + ]), + ('a', 'b'), + ] + + resp = requests.get(url, params=formdata.urlencode(query)) + # or + resp = requests.post( + url, + data=formdata.urlencode(query), + headers={ + 'Content-Type': 'application/x-www-form-urlencoded' + }, + ) + + For additional parameter and return information, see the official + `urlencode`_ documentation. + + .. _urlencode: + https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode + """ + expand_classes = (dict, list, tuple) + original_query_list = _to_kv_list(query) + + if not all(_is_two_tuple(i) for i in original_query_list): + raise ValueError("Expected query to be able to be converted to a " + "list comprised of length 2 tuples.") + + query_list = original_query_list + while any(isinstance(v, expand_classes) for _, v in query_list): + query_list = _expand_query_values(query_list) + + return _urlencode(query_list, *args, **kwargs) + + +def _to_kv_list(dict_or_list): + if hasattr(dict_or_list, 'items'): + return list(dict_or_list.items()) + return dict_or_list + + +def _is_two_tuple(item): + return isinstance(item, (list, tuple)) and len(item) == 2 + + +def _expand_query_values(original_query_list): + query_list = [] + for key, value in original_query_list: + if isinstance(value, basestring): + query_list.append((key, value)) + else: + key_fmt = key + '[%s]' + value_list = _to_kv_list(value) + query_list.extend((key_fmt % k, v) for k, v in value_list) + return query_list diff --git a/Contents/Libraries/Shared/requests_toolbelt/utils/user_agent.py b/Contents/Libraries/Shared/requests_toolbelt/utils/user_agent.py new file mode 100644 index 000000000..e9636a41c --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/utils/user_agent.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +import collections +import platform +import sys + + +def user_agent(name, version, extras=None): + """Return an internet-friendly user_agent string. + + The majority of this code has been wilfully stolen from the equivalent + function in Requests. + + :param name: The intended name of the user-agent, e.g. "python-requests". + :param version: The version of the user-agent, e.g. "0.0.1". + :param extras: List of two-item tuples that are added to the user-agent + string. + :returns: Formatted user-agent string + :rtype: str + """ + if extras is None: + extras = [] + + return UserAgentBuilder( + name, version + ).include_extras( + extras + ).include_implementation( + ).include_system().build() + + +class UserAgentBuilder(object): + """Class to provide a greater level of control than :func:`user_agent`. + + This is used by :func:`user_agent` to build its User-Agent string. + + .. code-block:: python + + user_agent_str = UserAgentBuilder( + name='requests-toolbelt', + version='17.4.0', + ).include_implementation( + ).include_system( + ).include_extras([ + ('requests', '2.14.2'), + ('urllib3', '1.21.2'), + ]).build() + + """ + + format_string = '%s/%s' + + def __init__(self, name, version): + """Initialize our builder with the name and version of our user agent. + + :param str name: + Name of our user-agent. + :param str version: + The version string for user-agent. + """ + self._pieces = collections.deque([(name, version)]) + + def build(self): + """Finalize the User-Agent string. + + :returns: + Formatted User-Agent string. + :rtype: + str + """ + return " ".join([self.format_string % piece for piece in self._pieces]) + + def include_extras(self, extras): + """Include extra portions of the User-Agent. + + :param list extras: + list of tuples of extra-name and extra-version + """ + if any(len(extra) != 2 for extra in extras): + raise ValueError('Extras should be a sequence of two item tuples.') + + self._pieces.extend(extras) + return self + + def include_implementation(self): + """Append the implementation string to the user-agent string. + + This adds the the information that you're using CPython 2.7.13 to the + User-Agent. + """ + self._pieces.append(_implementation_tuple()) + return self + + def include_system(self): + """Append the information about the Operating System.""" + self._pieces.append(_platform_tuple()) + return self + + +def _implementation_tuple(): + """Return the tuple of interpreter name and version. + + Returns a string that provides both the name and the version of the Python + implementation currently running. For example, on CPython 2.7.5 it will + return "CPython/2.7.5". + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == 'CPython': + implementation_version = platform.python_version() + elif implementation == 'PyPy': + implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + implementation_version = ''.join([ + implementation_version, sys.pypy_version_info.releaselevel + ]) + elif implementation == 'Jython': + implementation_version = platform.python_version() # Complete Guess + elif implementation == 'IronPython': + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = 'Unknown' + + return (implementation, implementation_version) + + +def _implementation_string(): + return "%s/%s" % _implementation_tuple() + + +def _platform_tuple(): + try: + p_system = platform.system() + p_release = platform.release() + except IOError: + p_system = 'Unknown' + p_release = 'Unknown' + return (p_system, p_release) diff --git a/Contents/Libraries/Shared/tzlocal/__init__.py b/Contents/Libraries/Shared/tzlocal/__init__.py new file mode 100644 index 000000000..c8196d66d --- /dev/null +++ b/Contents/Libraries/Shared/tzlocal/__init__.py @@ -0,0 +1,5 @@ +import sys +if sys.platform == 'win32': + from tzlocal.win32 import get_localzone, reload_localzone +else: + from tzlocal.unix import get_localzone, reload_localzone diff --git a/Contents/Libraries/Shared/tzlocal/unix.py b/Contents/Libraries/Shared/tzlocal/unix.py new file mode 100644 index 000000000..ad944454e --- /dev/null +++ b/Contents/Libraries/Shared/tzlocal/unix.py @@ -0,0 +1,164 @@ +import os +import pytz +import re + +from tzlocal import utils + +_cache_tz = None + + +def _tz_from_env(tzenv): + if tzenv[0] == ':': + tzenv = tzenv[1:] + + # TZ specifies a file + if os.path.exists(tzenv): + with open(tzenv, 'rb') as tzfile: + return pytz.tzfile.build_tzinfo('local', tzfile) + + # TZ specifies a zoneinfo zone. + try: + tz = pytz.timezone(tzenv) + # That worked, so we return this: + return tz + except pytz.UnknownTimeZoneError: + raise pytz.UnknownTimeZoneError( + "tzlocal() does not support non-zoneinfo timezones like %s. \n" + "Please use a timezone in the form of Continent/City") + + +def _try_tz_from_env(): + tzenv = os.environ.get('TZ') + if tzenv: + try: + return _tz_from_env(tzenv) + except pytz.UnknownTimeZoneError: + pass + + +def _get_localzone(_root='/'): + """Tries to find the local timezone configuration. + + This method prefers finding the timezone name and passing that to pytz, + over passing in the localtime file, as in the later case the zoneinfo + name is unknown. + + The parameter _root makes the function look for files like /etc/localtime + beneath the _root directory. This is primarily used by the tests. + In normal usage you call the function without parameters.""" + + tzenv = _try_tz_from_env() + if tzenv: + return tzenv + + # Now look for distribution specific configuration files + # that contain the timezone name. + for configfile in ('etc/timezone', 'var/db/zoneinfo'): + tzpath = os.path.join(_root, configfile) + try: + with open(tzpath, 'rb') as tzfile: + data = tzfile.read() + + # Issue #3 was that /etc/timezone was a zoneinfo file. + # That's a misconfiguration, but we need to handle it gracefully: + if data[:5] == b'TZif2': + continue + + etctz = data.strip().decode() + if not etctz: + # Empty file, skip + continue + for etctz in data.decode().splitlines(): + # Get rid of host definitions and comments: + if ' ' in etctz: + etctz, dummy = etctz.split(' ', 1) + if '#' in etctz: + etctz, dummy = etctz.split('#', 1) + if not etctz: + continue + return pytz.timezone(etctz.replace(' ', '_')) + except IOError: + # File doesn't exist or is a directory + continue + + # CentOS has a ZONE setting in /etc/sysconfig/clock, + # OpenSUSE has a TIMEZONE setting in /etc/sysconfig/clock and + # Gentoo has a TIMEZONE setting in /etc/conf.d/clock + # We look through these files for a timezone: + + zone_re = re.compile(r'\s*ZONE\s*=\s*\"') + timezone_re = re.compile(r'\s*TIMEZONE\s*=\s*\"') + end_re = re.compile('\"') + + for filename in ('etc/sysconfig/clock', 'etc/conf.d/clock'): + tzpath = os.path.join(_root, filename) + try: + with open(tzpath, 'rt') as tzfile: + data = tzfile.readlines() + + for line in data: + # Look for the ZONE= setting. + match = zone_re.match(line) + if match is None: + # No ZONE= setting. Look for the TIMEZONE= setting. + match = timezone_re.match(line) + if match is not None: + # Some setting existed + line = line[match.end():] + etctz = line[:end_re.search(line).start()] + + # We found a timezone + return pytz.timezone(etctz.replace(' ', '_')) + except IOError: + # File doesn't exist or is a directory + continue + + # systemd distributions use symlinks that include the zone name, + # see manpage of localtime(5) and timedatectl(1) + tzpath = os.path.join(_root, 'etc/localtime') + if os.path.exists(tzpath) and os.path.islink(tzpath): + tzpath = os.path.realpath(tzpath) + start = tzpath.find("/")+1 + while start is not 0: + tzpath = tzpath[start:] + try: + return pytz.timezone(tzpath) + except pytz.UnknownTimeZoneError: + pass + start = tzpath.find("/")+1 + + # Are we under Termux on Android? It's not officially supported, because + # there is no reasonable way to run tests for this, but let's make an effort. + if os.path.exists('/system/bin/getprop'): + import subprocess + androidtz = subprocess.check_output(['getprop', 'persist.sys.timezone']) + return pytz.timezone(androidtz.strip().decode()) + + # No explicit setting existed. Use localtime + for filename in ('etc/localtime', 'usr/local/etc/localtime'): + tzpath = os.path.join(_root, filename) + + if not os.path.exists(tzpath): + continue + with open(tzpath, 'rb') as tzfile: + return pytz.tzfile.build_tzinfo('local', tzfile) + + raise pytz.UnknownTimeZoneError('Can not find any timezone configuration') + + +def get_localzone(): + """Get the computers configured local timezone, if any.""" + global _cache_tz + if _cache_tz is None: + _cache_tz = _get_localzone() + + utils.assert_tz_offset(_cache_tz) + return _cache_tz + + +def reload_localzone(): + """Reload the cached localzone. You need to call this if the timezone has changed.""" + global _cache_tz + _cache_tz = _get_localzone() + utils.assert_tz_offset(_cache_tz) + return _cache_tz diff --git a/Contents/Libraries/Shared/tzlocal/utils.py b/Contents/Libraries/Shared/tzlocal/utils.py new file mode 100644 index 000000000..bd9d663e8 --- /dev/null +++ b/Contents/Libraries/Shared/tzlocal/utils.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +import datetime + + +def get_system_offset(): + """Get system's timezone offset using built-in library time. + + For the Timezone constants (altzone, daylight, timezone, and tzname), the + value is determined by the timezone rules in effect at module load time or + the last time tzset() is called and may be incorrect for times in the past. + + To keep compatibility with Windows, we're always importing time module here. + """ + import time + if time.daylight and time.localtime().tm_isdst > 0: + return -time.altzone + else: + return -time.timezone + + +def get_tz_offset(tz): + """Get timezone's offset using built-in function datetime.utcoffset().""" + return int(datetime.datetime.now(tz).utcoffset().total_seconds()) + + +def assert_tz_offset(tz): + """Assert that system's timezone offset equals to the timezone offset found. + + If they don't match, we probably have a misconfiguration, for example, an + incorrect timezone set in /etc/timezone file in systemd distributions.""" + tz_offset = get_tz_offset(tz) + system_offset = get_system_offset() + if tz_offset != system_offset: + msg = ('Timezone offset does not match system offset: {0} != {1}. ' + 'Please, check your config files.').format( + tz_offset, system_offset + ) + raise ValueError(msg) diff --git a/Contents/Libraries/Shared/tzlocal/win32.py b/Contents/Libraries/Shared/tzlocal/win32.py new file mode 100644 index 000000000..fcc42a23f --- /dev/null +++ b/Contents/Libraries/Shared/tzlocal/win32.py @@ -0,0 +1,104 @@ +try: + import _winreg as winreg +except ImportError: + import winreg + +import pytz + +from tzlocal.windows_tz import win_tz +from tzlocal import utils + +_cache_tz = None + + +def valuestodict(key): + """Convert a registry key's values to a dictionary.""" + dict = {} + size = winreg.QueryInfoKey(key)[1] + for i in range(size): + data = winreg.EnumValue(key, i) + dict[data[0]] = data[1] + return dict + + +def get_localzone_name(): + # Windows is special. It has unique time zone names (in several + # meanings of the word) available, but unfortunately, they can be + # translated to the language of the operating system, so we need to + # do a backwards lookup, by going through all time zones and see which + # one matches. + handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) + + TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" + localtz = winreg.OpenKey(handle, TZLOCALKEYNAME) + keyvalues = valuestodict(localtz) + localtz.Close() + + if 'TimeZoneKeyName' in keyvalues: + # Windows 7 (and Vista?) + + # For some reason this returns a string with loads of NUL bytes at + # least on some systems. I don't know if this is a bug somewhere, I + # just work around it. + tzkeyname = keyvalues['TimeZoneKeyName'].split('\x00', 1)[0] + else: + # Windows 2000 or XP + + # This is the localized name: + tzwin = keyvalues['StandardName'] + + # Open the list of timezones to look up the real name: + TZKEYNAME = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" + tzkey = winreg.OpenKey(handle, TZKEYNAME) + + # Now, match this value to Time Zone information + tzkeyname = None + for i in range(winreg.QueryInfoKey(tzkey)[0]): + subkey = winreg.EnumKey(tzkey, i) + sub = winreg.OpenKey(tzkey, subkey) + data = valuestodict(sub) + sub.Close() + try: + if data['Std'] == tzwin: + tzkeyname = subkey + break + except KeyError: + # This timezone didn't have proper configuration. + # Ignore it. + pass + + tzkey.Close() + handle.Close() + + if tzkeyname is None: + raise LookupError('Can not find Windows timezone configuration') + + timezone = win_tz.get(tzkeyname) + if timezone is None: + # Nope, that didn't work. Try adding "Standard Time", + # it seems to work a lot of times: + timezone = win_tz.get(tzkeyname + " Standard Time") + + # Return what we have. + if timezone is None: + raise pytz.UnknownTimeZoneError('Can not find timezone ' + tzkeyname) + + return timezone + + +def get_localzone(): + """Returns the zoneinfo-based tzinfo object that matches the Windows-configured timezone.""" + global _cache_tz + if _cache_tz is None: + _cache_tz = pytz.timezone(get_localzone_name()) + + utils.assert_tz_offset(_cache_tz) + return _cache_tz + + +def reload_localzone(): + """Reload the cached localzone. You need to call this if the timezone has changed.""" + global _cache_tz + _cache_tz = pytz.timezone(get_localzone_name()) + utils.assert_tz_offset(_cache_tz) + return _cache_tz diff --git a/Contents/Libraries/Shared/tzlocal/windows_tz.py b/Contents/Libraries/Shared/tzlocal/windows_tz.py new file mode 100644 index 000000000..60f9ff5eb --- /dev/null +++ b/Contents/Libraries/Shared/tzlocal/windows_tz.py @@ -0,0 +1,693 @@ +# This file is autogenerated by the update_windows_mapping.py script +# Do not edit. +win_tz = {'AUS Central Standard Time': 'Australia/Darwin', + 'AUS Eastern Standard Time': 'Australia/Sydney', + 'Afghanistan Standard Time': 'Asia/Kabul', + 'Alaskan Standard Time': 'America/Anchorage', + 'Aleutian Standard Time': 'America/Adak', + 'Altai Standard Time': 'Asia/Barnaul', + 'Arab Standard Time': 'Asia/Riyadh', + 'Arabian Standard Time': 'Asia/Dubai', + 'Arabic Standard Time': 'Asia/Baghdad', + 'Argentina Standard Time': 'America/Buenos_Aires', + 'Astrakhan Standard Time': 'Europe/Astrakhan', + 'Atlantic Standard Time': 'America/Halifax', + 'Aus Central W. Standard Time': 'Australia/Eucla', + 'Azerbaijan Standard Time': 'Asia/Baku', + 'Azores Standard Time': 'Atlantic/Azores', + 'Bahia Standard Time': 'America/Bahia', + 'Bangladesh Standard Time': 'Asia/Dhaka', + 'Belarus Standard Time': 'Europe/Minsk', + 'Bougainville Standard Time': 'Pacific/Bougainville', + 'Canada Central Standard Time': 'America/Regina', + 'Cape Verde Standard Time': 'Atlantic/Cape_Verde', + 'Caucasus Standard Time': 'Asia/Yerevan', + 'Cen. Australia Standard Time': 'Australia/Adelaide', + 'Central America Standard Time': 'America/Guatemala', + 'Central Asia Standard Time': 'Asia/Almaty', + 'Central Brazilian Standard Time': 'America/Cuiaba', + 'Central Europe Standard Time': 'Europe/Budapest', + 'Central European Standard Time': 'Europe/Warsaw', + 'Central Pacific Standard Time': 'Pacific/Guadalcanal', + 'Central Standard Time': 'America/Chicago', + 'Central Standard Time (Mexico)': 'America/Mexico_City', + 'Chatham Islands Standard Time': 'Pacific/Chatham', + 'China Standard Time': 'Asia/Shanghai', + 'Cuba Standard Time': 'America/Havana', + 'Dateline Standard Time': 'Etc/GMT+12', + 'E. Africa Standard Time': 'Africa/Nairobi', + 'E. Australia Standard Time': 'Australia/Brisbane', + 'E. Europe Standard Time': 'Europe/Chisinau', + 'E. South America Standard Time': 'America/Sao_Paulo', + 'Easter Island Standard Time': 'Pacific/Easter', + 'Eastern Standard Time': 'America/New_York', + 'Eastern Standard Time (Mexico)': 'America/Cancun', + 'Egypt Standard Time': 'Africa/Cairo', + 'Ekaterinburg Standard Time': 'Asia/Yekaterinburg', + 'FLE Standard Time': 'Europe/Kiev', + 'Fiji Standard Time': 'Pacific/Fiji', + 'GMT Standard Time': 'Europe/London', + 'GTB Standard Time': 'Europe/Bucharest', + 'Georgian Standard Time': 'Asia/Tbilisi', + 'Greenland Standard Time': 'America/Godthab', + 'Greenwich Standard Time': 'Atlantic/Reykjavik', + 'Haiti Standard Time': 'America/Port-au-Prince', + 'Hawaiian Standard Time': 'Pacific/Honolulu', + 'India Standard Time': 'Asia/Calcutta', + 'Iran Standard Time': 'Asia/Tehran', + 'Israel Standard Time': 'Asia/Jerusalem', + 'Jordan Standard Time': 'Asia/Amman', + 'Kaliningrad Standard Time': 'Europe/Kaliningrad', + 'Korea Standard Time': 'Asia/Seoul', + 'Libya Standard Time': 'Africa/Tripoli', + 'Line Islands Standard Time': 'Pacific/Kiritimati', + 'Lord Howe Standard Time': 'Australia/Lord_Howe', + 'Magadan Standard Time': 'Asia/Magadan', + 'Magallanes Standard Time': 'America/Punta_Arenas', + 'Marquesas Standard Time': 'Pacific/Marquesas', + 'Mauritius Standard Time': 'Indian/Mauritius', + 'Middle East Standard Time': 'Asia/Beirut', + 'Montevideo Standard Time': 'America/Montevideo', + 'Morocco Standard Time': 'Africa/Casablanca', + 'Mountain Standard Time': 'America/Denver', + 'Mountain Standard Time (Mexico)': 'America/Chihuahua', + 'Myanmar Standard Time': 'Asia/Rangoon', + 'N. Central Asia Standard Time': 'Asia/Novosibirsk', + 'Namibia Standard Time': 'Africa/Windhoek', + 'Nepal Standard Time': 'Asia/Katmandu', + 'New Zealand Standard Time': 'Pacific/Auckland', + 'Newfoundland Standard Time': 'America/St_Johns', + 'Norfolk Standard Time': 'Pacific/Norfolk', + 'North Asia East Standard Time': 'Asia/Irkutsk', + 'North Asia Standard Time': 'Asia/Krasnoyarsk', + 'North Korea Standard Time': 'Asia/Pyongyang', + 'Omsk Standard Time': 'Asia/Omsk', + 'Pacific SA Standard Time': 'America/Santiago', + 'Pacific Standard Time': 'America/Los_Angeles', + 'Pacific Standard Time (Mexico)': 'America/Tijuana', + 'Pakistan Standard Time': 'Asia/Karachi', + 'Paraguay Standard Time': 'America/Asuncion', + 'Romance Standard Time': 'Europe/Paris', + 'Russia Time Zone 10': 'Asia/Srednekolymsk', + 'Russia Time Zone 11': 'Asia/Kamchatka', + 'Russia Time Zone 3': 'Europe/Samara', + 'Russian Standard Time': 'Europe/Moscow', + 'SA Eastern Standard Time': 'America/Cayenne', + 'SA Pacific Standard Time': 'America/Bogota', + 'SA Western Standard Time': 'America/La_Paz', + 'SE Asia Standard Time': 'Asia/Bangkok', + 'Saint Pierre Standard Time': 'America/Miquelon', + 'Sakhalin Standard Time': 'Asia/Sakhalin', + 'Samoa Standard Time': 'Pacific/Apia', + 'Sao Tome Standard Time': 'Africa/Sao_Tome', + 'Saratov Standard Time': 'Europe/Saratov', + 'Singapore Standard Time': 'Asia/Singapore', + 'South Africa Standard Time': 'Africa/Johannesburg', + 'Sri Lanka Standard Time': 'Asia/Colombo', + 'Sudan Standard Time': 'Africa/Khartoum', + 'Syria Standard Time': 'Asia/Damascus', + 'Taipei Standard Time': 'Asia/Taipei', + 'Tasmania Standard Time': 'Australia/Hobart', + 'Tocantins Standard Time': 'America/Araguaina', + 'Tokyo Standard Time': 'Asia/Tokyo', + 'Tomsk Standard Time': 'Asia/Tomsk', + 'Tonga Standard Time': 'Pacific/Tongatapu', + 'Transbaikal Standard Time': 'Asia/Chita', + 'Turkey Standard Time': 'Europe/Istanbul', + 'Turks And Caicos Standard Time': 'America/Grand_Turk', + 'US Eastern Standard Time': 'America/Indianapolis', + 'US Mountain Standard Time': 'America/Phoenix', + 'UTC': 'Etc/GMT', + 'UTC+12': 'Etc/GMT-12', + 'UTC+13': 'Etc/GMT-13', + 'UTC-02': 'Etc/GMT+2', + 'UTC-08': 'Etc/GMT+8', + 'UTC-09': 'Etc/GMT+9', + 'UTC-11': 'Etc/GMT+11', + 'Ulaanbaatar Standard Time': 'Asia/Ulaanbaatar', + 'Venezuela Standard Time': 'America/Caracas', + 'Vladivostok Standard Time': 'Asia/Vladivostok', + 'W. Australia Standard Time': 'Australia/Perth', + 'W. Central Africa Standard Time': 'Africa/Lagos', + 'W. Europe Standard Time': 'Europe/Berlin', + 'W. Mongolia Standard Time': 'Asia/Hovd', + 'West Asia Standard Time': 'Asia/Tashkent', + 'West Bank Standard Time': 'Asia/Hebron', + 'West Pacific Standard Time': 'Pacific/Port_Moresby', + 'Yakutsk Standard Time': 'Asia/Yakutsk'} + +# Old name for the win_tz variable: +tz_names = win_tz + +tz_win = {'Africa/Abidjan': 'Greenwich Standard Time', + 'Africa/Accra': 'Greenwich Standard Time', + 'Africa/Addis_Ababa': 'E. Africa Standard Time', + 'Africa/Algiers': 'W. Central Africa Standard Time', + 'Africa/Asmera': 'E. Africa Standard Time', + 'Africa/Bamako': 'Greenwich Standard Time', + 'Africa/Bangui': 'W. Central Africa Standard Time', + 'Africa/Banjul': 'Greenwich Standard Time', + 'Africa/Bissau': 'Greenwich Standard Time', + 'Africa/Blantyre': 'South Africa Standard Time', + 'Africa/Brazzaville': 'W. Central Africa Standard Time', + 'Africa/Bujumbura': 'South Africa Standard Time', + 'Africa/Cairo': 'Egypt Standard Time', + 'Africa/Casablanca': 'Morocco Standard Time', + 'Africa/Ceuta': 'Romance Standard Time', + 'Africa/Conakry': 'Greenwich Standard Time', + 'Africa/Dakar': 'Greenwich Standard Time', + 'Africa/Dar_es_Salaam': 'E. Africa Standard Time', + 'Africa/Djibouti': 'E. Africa Standard Time', + 'Africa/Douala': 'W. Central Africa Standard Time', + 'Africa/El_Aaiun': 'Morocco Standard Time', + 'Africa/Freetown': 'Greenwich Standard Time', + 'Africa/Gaborone': 'South Africa Standard Time', + 'Africa/Harare': 'South Africa Standard Time', + 'Africa/Johannesburg': 'South Africa Standard Time', + 'Africa/Juba': 'E. Africa Standard Time', + 'Africa/Kampala': 'E. Africa Standard Time', + 'Africa/Khartoum': 'Sudan Standard Time', + 'Africa/Kigali': 'South Africa Standard Time', + 'Africa/Kinshasa': 'W. Central Africa Standard Time', + 'Africa/Lagos': 'W. Central Africa Standard Time', + 'Africa/Libreville': 'W. Central Africa Standard Time', + 'Africa/Lome': 'Greenwich Standard Time', + 'Africa/Luanda': 'W. Central Africa Standard Time', + 'Africa/Lubumbashi': 'South Africa Standard Time', + 'Africa/Lusaka': 'South Africa Standard Time', + 'Africa/Malabo': 'W. Central Africa Standard Time', + 'Africa/Maputo': 'South Africa Standard Time', + 'Africa/Maseru': 'South Africa Standard Time', + 'Africa/Mbabane': 'South Africa Standard Time', + 'Africa/Mogadishu': 'E. Africa Standard Time', + 'Africa/Monrovia': 'Greenwich Standard Time', + 'Africa/Nairobi': 'E. Africa Standard Time', + 'Africa/Ndjamena': 'W. Central Africa Standard Time', + 'Africa/Niamey': 'W. Central Africa Standard Time', + 'Africa/Nouakchott': 'Greenwich Standard Time', + 'Africa/Ouagadougou': 'Greenwich Standard Time', + 'Africa/Porto-Novo': 'W. Central Africa Standard Time', + 'Africa/Sao_Tome': 'Sao Tome Standard Time', + 'Africa/Timbuktu': 'Greenwich Standard Time', + 'Africa/Tripoli': 'Libya Standard Time', + 'Africa/Tunis': 'W. Central Africa Standard Time', + 'Africa/Windhoek': 'Namibia Standard Time', + 'America/Adak': 'Aleutian Standard Time', + 'America/Anchorage': 'Alaskan Standard Time', + 'America/Anguilla': 'SA Western Standard Time', + 'America/Antigua': 'SA Western Standard Time', + 'America/Araguaina': 'Tocantins Standard Time', + 'America/Argentina/La_Rioja': 'Argentina Standard Time', + 'America/Argentina/Rio_Gallegos': 'Argentina Standard Time', + 'America/Argentina/Salta': 'Argentina Standard Time', + 'America/Argentina/San_Juan': 'Argentina Standard Time', + 'America/Argentina/San_Luis': 'Argentina Standard Time', + 'America/Argentina/Tucuman': 'Argentina Standard Time', + 'America/Argentina/Ushuaia': 'Argentina Standard Time', + 'America/Aruba': 'SA Western Standard Time', + 'America/Asuncion': 'Paraguay Standard Time', + 'America/Atka': 'Aleutian Standard Time', + 'America/Bahia': 'Bahia Standard Time', + 'America/Bahia_Banderas': 'Central Standard Time (Mexico)', + 'America/Barbados': 'SA Western Standard Time', + 'America/Belem': 'SA Eastern Standard Time', + 'America/Belize': 'Central America Standard Time', + 'America/Blanc-Sablon': 'SA Western Standard Time', + 'America/Boa_Vista': 'SA Western Standard Time', + 'America/Bogota': 'SA Pacific Standard Time', + 'America/Boise': 'Mountain Standard Time', + 'America/Buenos_Aires': 'Argentina Standard Time', + 'America/Cambridge_Bay': 'Mountain Standard Time', + 'America/Campo_Grande': 'Central Brazilian Standard Time', + 'America/Cancun': 'Eastern Standard Time (Mexico)', + 'America/Caracas': 'Venezuela Standard Time', + 'America/Catamarca': 'Argentina Standard Time', + 'America/Cayenne': 'SA Eastern Standard Time', + 'America/Cayman': 'SA Pacific Standard Time', + 'America/Chicago': 'Central Standard Time', + 'America/Chihuahua': 'Mountain Standard Time (Mexico)', + 'America/Coral_Harbour': 'SA Pacific Standard Time', + 'America/Cordoba': 'Argentina Standard Time', + 'America/Costa_Rica': 'Central America Standard Time', + 'America/Creston': 'US Mountain Standard Time', + 'America/Cuiaba': 'Central Brazilian Standard Time', + 'America/Curacao': 'SA Western Standard Time', + 'America/Danmarkshavn': 'UTC', + 'America/Dawson': 'Pacific Standard Time', + 'America/Dawson_Creek': 'US Mountain Standard Time', + 'America/Denver': 'Mountain Standard Time', + 'America/Detroit': 'Eastern Standard Time', + 'America/Dominica': 'SA Western Standard Time', + 'America/Edmonton': 'Mountain Standard Time', + 'America/Eirunepe': 'SA Pacific Standard Time', + 'America/El_Salvador': 'Central America Standard Time', + 'America/Ensenada': 'Pacific Standard Time (Mexico)', + 'America/Fort_Nelson': 'US Mountain Standard Time', + 'America/Fortaleza': 'SA Eastern Standard Time', + 'America/Glace_Bay': 'Atlantic Standard Time', + 'America/Godthab': 'Greenland Standard Time', + 'America/Goose_Bay': 'Atlantic Standard Time', + 'America/Grand_Turk': 'Turks And Caicos Standard Time', + 'America/Grenada': 'SA Western Standard Time', + 'America/Guadeloupe': 'SA Western Standard Time', + 'America/Guatemala': 'Central America Standard Time', + 'America/Guayaquil': 'SA Pacific Standard Time', + 'America/Guyana': 'SA Western Standard Time', + 'America/Halifax': 'Atlantic Standard Time', + 'America/Havana': 'Cuba Standard Time', + 'America/Hermosillo': 'US Mountain Standard Time', + 'America/Indiana/Knox': 'Central Standard Time', + 'America/Indiana/Marengo': 'US Eastern Standard Time', + 'America/Indiana/Petersburg': 'Eastern Standard Time', + 'America/Indiana/Tell_City': 'Central Standard Time', + 'America/Indiana/Vevay': 'US Eastern Standard Time', + 'America/Indiana/Vincennes': 'Eastern Standard Time', + 'America/Indiana/Winamac': 'Eastern Standard Time', + 'America/Indianapolis': 'US Eastern Standard Time', + 'America/Inuvik': 'Mountain Standard Time', + 'America/Iqaluit': 'Eastern Standard Time', + 'America/Jamaica': 'SA Pacific Standard Time', + 'America/Jujuy': 'Argentina Standard Time', + 'America/Juneau': 'Alaskan Standard Time', + 'America/Kentucky/Monticello': 'Eastern Standard Time', + 'America/Knox_IN': 'Central Standard Time', + 'America/Kralendijk': 'SA Western Standard Time', + 'America/La_Paz': 'SA Western Standard Time', + 'America/Lima': 'SA Pacific Standard Time', + 'America/Los_Angeles': 'Pacific Standard Time', + 'America/Louisville': 'Eastern Standard Time', + 'America/Lower_Princes': 'SA Western Standard Time', + 'America/Maceio': 'SA Eastern Standard Time', + 'America/Managua': 'Central America Standard Time', + 'America/Manaus': 'SA Western Standard Time', + 'America/Marigot': 'SA Western Standard Time', + 'America/Martinique': 'SA Western Standard Time', + 'America/Matamoros': 'Central Standard Time', + 'America/Mazatlan': 'Mountain Standard Time (Mexico)', + 'America/Mendoza': 'Argentina Standard Time', + 'America/Menominee': 'Central Standard Time', + 'America/Merida': 'Central Standard Time (Mexico)', + 'America/Metlakatla': 'Pacific Standard Time', + 'America/Mexico_City': 'Central Standard Time (Mexico)', + 'America/Miquelon': 'Saint Pierre Standard Time', + 'America/Moncton': 'Atlantic Standard Time', + 'America/Monterrey': 'Central Standard Time (Mexico)', + 'America/Montevideo': 'Montevideo Standard Time', + 'America/Montreal': 'Eastern Standard Time', + 'America/Montserrat': 'SA Western Standard Time', + 'America/Nassau': 'Eastern Standard Time', + 'America/New_York': 'Eastern Standard Time', + 'America/Nipigon': 'Eastern Standard Time', + 'America/Nome': 'Alaskan Standard Time', + 'America/Noronha': 'UTC-02', + 'America/North_Dakota/Beulah': 'Central Standard Time', + 'America/North_Dakota/Center': 'Central Standard Time', + 'America/North_Dakota/New_Salem': 'Central Standard Time', + 'America/Ojinaga': 'Mountain Standard Time', + 'America/Panama': 'SA Pacific Standard Time', + 'America/Pangnirtung': 'Eastern Standard Time', + 'America/Paramaribo': 'SA Eastern Standard Time', + 'America/Phoenix': 'US Mountain Standard Time', + 'America/Port-au-Prince': 'Haiti Standard Time', + 'America/Port_of_Spain': 'SA Western Standard Time', + 'America/Porto_Acre': 'SA Pacific Standard Time', + 'America/Porto_Velho': 'SA Western Standard Time', + 'America/Puerto_Rico': 'SA Western Standard Time', + 'America/Punta_Arenas': 'Magallanes Standard Time', + 'America/Rainy_River': 'Central Standard Time', + 'America/Rankin_Inlet': 'Central Standard Time', + 'America/Recife': 'SA Eastern Standard Time', + 'America/Regina': 'Canada Central Standard Time', + 'America/Resolute': 'Central Standard Time', + 'America/Rio_Branco': 'SA Pacific Standard Time', + 'America/Santa_Isabel': 'Pacific Standard Time (Mexico)', + 'America/Santarem': 'SA Eastern Standard Time', + 'America/Santiago': 'Pacific SA Standard Time', + 'America/Santo_Domingo': 'SA Western Standard Time', + 'America/Sao_Paulo': 'E. South America Standard Time', + 'America/Scoresbysund': 'Azores Standard Time', + 'America/Shiprock': 'Mountain Standard Time', + 'America/Sitka': 'Alaskan Standard Time', + 'America/St_Barthelemy': 'SA Western Standard Time', + 'America/St_Johns': 'Newfoundland Standard Time', + 'America/St_Kitts': 'SA Western Standard Time', + 'America/St_Lucia': 'SA Western Standard Time', + 'America/St_Thomas': 'SA Western Standard Time', + 'America/St_Vincent': 'SA Western Standard Time', + 'America/Swift_Current': 'Canada Central Standard Time', + 'America/Tegucigalpa': 'Central America Standard Time', + 'America/Thule': 'Atlantic Standard Time', + 'America/Thunder_Bay': 'Eastern Standard Time', + 'America/Tijuana': 'Pacific Standard Time (Mexico)', + 'America/Toronto': 'Eastern Standard Time', + 'America/Tortola': 'SA Western Standard Time', + 'America/Vancouver': 'Pacific Standard Time', + 'America/Virgin': 'SA Western Standard Time', + 'America/Whitehorse': 'Pacific Standard Time', + 'America/Winnipeg': 'Central Standard Time', + 'America/Yakutat': 'Alaskan Standard Time', + 'America/Yellowknife': 'Mountain Standard Time', + 'Antarctica/Casey': 'W. Australia Standard Time', + 'Antarctica/Davis': 'SE Asia Standard Time', + 'Antarctica/DumontDUrville': 'West Pacific Standard Time', + 'Antarctica/Macquarie': 'Central Pacific Standard Time', + 'Antarctica/Mawson': 'West Asia Standard Time', + 'Antarctica/McMurdo': 'New Zealand Standard Time', + 'Antarctica/Palmer': 'Magallanes Standard Time', + 'Antarctica/Rothera': 'SA Eastern Standard Time', + 'Antarctica/South_Pole': 'New Zealand Standard Time', + 'Antarctica/Syowa': 'E. Africa Standard Time', + 'Antarctica/Vostok': 'Central Asia Standard Time', + 'Arctic/Longyearbyen': 'W. Europe Standard Time', + 'Asia/Aden': 'Arab Standard Time', + 'Asia/Almaty': 'Central Asia Standard Time', + 'Asia/Amman': 'Jordan Standard Time', + 'Asia/Anadyr': 'Russia Time Zone 11', + 'Asia/Aqtau': 'West Asia Standard Time', + 'Asia/Aqtobe': 'West Asia Standard Time', + 'Asia/Ashgabat': 'West Asia Standard Time', + 'Asia/Ashkhabad': 'West Asia Standard Time', + 'Asia/Atyrau': 'West Asia Standard Time', + 'Asia/Baghdad': 'Arabic Standard Time', + 'Asia/Bahrain': 'Arab Standard Time', + 'Asia/Baku': 'Azerbaijan Standard Time', + 'Asia/Bangkok': 'SE Asia Standard Time', + 'Asia/Barnaul': 'Altai Standard Time', + 'Asia/Beirut': 'Middle East Standard Time', + 'Asia/Bishkek': 'Central Asia Standard Time', + 'Asia/Brunei': 'Singapore Standard Time', + 'Asia/Calcutta': 'India Standard Time', + 'Asia/Chita': 'Transbaikal Standard Time', + 'Asia/Choibalsan': 'Ulaanbaatar Standard Time', + 'Asia/Chongqing': 'China Standard Time', + 'Asia/Chungking': 'China Standard Time', + 'Asia/Colombo': 'Sri Lanka Standard Time', + 'Asia/Dacca': 'Bangladesh Standard Time', + 'Asia/Damascus': 'Syria Standard Time', + 'Asia/Dhaka': 'Bangladesh Standard Time', + 'Asia/Dili': 'Tokyo Standard Time', + 'Asia/Dubai': 'Arabian Standard Time', + 'Asia/Dushanbe': 'West Asia Standard Time', + 'Asia/Famagusta': 'GTB Standard Time', + 'Asia/Gaza': 'West Bank Standard Time', + 'Asia/Harbin': 'China Standard Time', + 'Asia/Hebron': 'West Bank Standard Time', + 'Asia/Hong_Kong': 'China Standard Time', + 'Asia/Hovd': 'W. Mongolia Standard Time', + 'Asia/Irkutsk': 'North Asia East Standard Time', + 'Asia/Jakarta': 'SE Asia Standard Time', + 'Asia/Jayapura': 'Tokyo Standard Time', + 'Asia/Jerusalem': 'Israel Standard Time', + 'Asia/Kabul': 'Afghanistan Standard Time', + 'Asia/Kamchatka': 'Russia Time Zone 11', + 'Asia/Karachi': 'Pakistan Standard Time', + 'Asia/Kashgar': 'Central Asia Standard Time', + 'Asia/Katmandu': 'Nepal Standard Time', + 'Asia/Khandyga': 'Yakutsk Standard Time', + 'Asia/Krasnoyarsk': 'North Asia Standard Time', + 'Asia/Kuala_Lumpur': 'Singapore Standard Time', + 'Asia/Kuching': 'Singapore Standard Time', + 'Asia/Kuwait': 'Arab Standard Time', + 'Asia/Macao': 'China Standard Time', + 'Asia/Macau': 'China Standard Time', + 'Asia/Magadan': 'Magadan Standard Time', + 'Asia/Makassar': 'Singapore Standard Time', + 'Asia/Manila': 'Singapore Standard Time', + 'Asia/Muscat': 'Arabian Standard Time', + 'Asia/Nicosia': 'GTB Standard Time', + 'Asia/Novokuznetsk': 'North Asia Standard Time', + 'Asia/Novosibirsk': 'N. Central Asia Standard Time', + 'Asia/Omsk': 'Omsk Standard Time', + 'Asia/Oral': 'West Asia Standard Time', + 'Asia/Phnom_Penh': 'SE Asia Standard Time', + 'Asia/Pontianak': 'SE Asia Standard Time', + 'Asia/Pyongyang': 'North Korea Standard Time', + 'Asia/Qatar': 'Arab Standard Time', + 'Asia/Qostanay': 'Central Asia Standard Time', + 'Asia/Qyzylorda': 'West Asia Standard Time', + 'Asia/Rangoon': 'Myanmar Standard Time', + 'Asia/Riyadh': 'Arab Standard Time', + 'Asia/Saigon': 'SE Asia Standard Time', + 'Asia/Sakhalin': 'Sakhalin Standard Time', + 'Asia/Samarkand': 'West Asia Standard Time', + 'Asia/Seoul': 'Korea Standard Time', + 'Asia/Shanghai': 'China Standard Time', + 'Asia/Singapore': 'Singapore Standard Time', + 'Asia/Srednekolymsk': 'Russia Time Zone 10', + 'Asia/Taipei': 'Taipei Standard Time', + 'Asia/Tashkent': 'West Asia Standard Time', + 'Asia/Tbilisi': 'Georgian Standard Time', + 'Asia/Tehran': 'Iran Standard Time', + 'Asia/Tel_Aviv': 'Israel Standard Time', + 'Asia/Thimbu': 'Bangladesh Standard Time', + 'Asia/Thimphu': 'Bangladesh Standard Time', + 'Asia/Tokyo': 'Tokyo Standard Time', + 'Asia/Tomsk': 'Tomsk Standard Time', + 'Asia/Ujung_Pandang': 'Singapore Standard Time', + 'Asia/Ulaanbaatar': 'Ulaanbaatar Standard Time', + 'Asia/Ulan_Bator': 'Ulaanbaatar Standard Time', + 'Asia/Urumqi': 'Central Asia Standard Time', + 'Asia/Ust-Nera': 'Vladivostok Standard Time', + 'Asia/Vientiane': 'SE Asia Standard Time', + 'Asia/Vladivostok': 'Vladivostok Standard Time', + 'Asia/Yakutsk': 'Yakutsk Standard Time', + 'Asia/Yekaterinburg': 'Ekaterinburg Standard Time', + 'Asia/Yerevan': 'Caucasus Standard Time', + 'Atlantic/Azores': 'Azores Standard Time', + 'Atlantic/Bermuda': 'Atlantic Standard Time', + 'Atlantic/Canary': 'GMT Standard Time', + 'Atlantic/Cape_Verde': 'Cape Verde Standard Time', + 'Atlantic/Faeroe': 'GMT Standard Time', + 'Atlantic/Jan_Mayen': 'W. Europe Standard Time', + 'Atlantic/Madeira': 'GMT Standard Time', + 'Atlantic/Reykjavik': 'Greenwich Standard Time', + 'Atlantic/South_Georgia': 'UTC-02', + 'Atlantic/St_Helena': 'Greenwich Standard Time', + 'Atlantic/Stanley': 'SA Eastern Standard Time', + 'Australia/ACT': 'AUS Eastern Standard Time', + 'Australia/Adelaide': 'Cen. Australia Standard Time', + 'Australia/Brisbane': 'E. Australia Standard Time', + 'Australia/Broken_Hill': 'Cen. Australia Standard Time', + 'Australia/Canberra': 'AUS Eastern Standard Time', + 'Australia/Currie': 'Tasmania Standard Time', + 'Australia/Darwin': 'AUS Central Standard Time', + 'Australia/Eucla': 'Aus Central W. Standard Time', + 'Australia/Hobart': 'Tasmania Standard Time', + 'Australia/LHI': 'Lord Howe Standard Time', + 'Australia/Lindeman': 'E. Australia Standard Time', + 'Australia/Lord_Howe': 'Lord Howe Standard Time', + 'Australia/Melbourne': 'AUS Eastern Standard Time', + 'Australia/NSW': 'AUS Eastern Standard Time', + 'Australia/North': 'AUS Central Standard Time', + 'Australia/Perth': 'W. Australia Standard Time', + 'Australia/Queensland': 'E. Australia Standard Time', + 'Australia/South': 'Cen. Australia Standard Time', + 'Australia/Sydney': 'AUS Eastern Standard Time', + 'Australia/Tasmania': 'Tasmania Standard Time', + 'Australia/Victoria': 'AUS Eastern Standard Time', + 'Australia/West': 'W. Australia Standard Time', + 'Australia/Yancowinna': 'Cen. Australia Standard Time', + 'Brazil/Acre': 'SA Pacific Standard Time', + 'Brazil/DeNoronha': 'UTC-02', + 'Brazil/East': 'E. South America Standard Time', + 'Brazil/West': 'SA Western Standard Time', + 'CST6CDT': 'Central Standard Time', + 'Canada/Atlantic': 'Atlantic Standard Time', + 'Canada/Central': 'Central Standard Time', + 'Canada/Eastern': 'Eastern Standard Time', + 'Canada/Mountain': 'Mountain Standard Time', + 'Canada/Newfoundland': 'Newfoundland Standard Time', + 'Canada/Pacific': 'Pacific Standard Time', + 'Canada/Saskatchewan': 'Canada Central Standard Time', + 'Canada/Yukon': 'Pacific Standard Time', + 'Chile/Continental': 'Pacific SA Standard Time', + 'Chile/EasterIsland': 'Easter Island Standard Time', + 'Cuba': 'Cuba Standard Time', + 'EST5EDT': 'Eastern Standard Time', + 'Egypt': 'Egypt Standard Time', + 'Eire': 'GMT Standard Time', + 'Etc/GMT': 'UTC', + 'Etc/GMT+1': 'Cape Verde Standard Time', + 'Etc/GMT+10': 'Hawaiian Standard Time', + 'Etc/GMT+11': 'UTC-11', + 'Etc/GMT+12': 'Dateline Standard Time', + 'Etc/GMT+2': 'UTC-02', + 'Etc/GMT+3': 'SA Eastern Standard Time', + 'Etc/GMT+4': 'SA Western Standard Time', + 'Etc/GMT+5': 'SA Pacific Standard Time', + 'Etc/GMT+6': 'Central America Standard Time', + 'Etc/GMT+7': 'US Mountain Standard Time', + 'Etc/GMT+8': 'UTC-08', + 'Etc/GMT+9': 'UTC-09', + 'Etc/GMT-1': 'W. Central Africa Standard Time', + 'Etc/GMT-10': 'West Pacific Standard Time', + 'Etc/GMT-11': 'Central Pacific Standard Time', + 'Etc/GMT-12': 'UTC+12', + 'Etc/GMT-13': 'UTC+13', + 'Etc/GMT-14': 'Line Islands Standard Time', + 'Etc/GMT-2': 'South Africa Standard Time', + 'Etc/GMT-3': 'E. Africa Standard Time', + 'Etc/GMT-4': 'Arabian Standard Time', + 'Etc/GMT-5': 'West Asia Standard Time', + 'Etc/GMT-6': 'Central Asia Standard Time', + 'Etc/GMT-7': 'SE Asia Standard Time', + 'Etc/GMT-8': 'Singapore Standard Time', + 'Etc/GMT-9': 'Tokyo Standard Time', + 'Etc/UTC': 'UTC', + 'Europe/Amsterdam': 'W. Europe Standard Time', + 'Europe/Andorra': 'W. Europe Standard Time', + 'Europe/Astrakhan': 'Astrakhan Standard Time', + 'Europe/Athens': 'GTB Standard Time', + 'Europe/Belfast': 'GMT Standard Time', + 'Europe/Belgrade': 'Central Europe Standard Time', + 'Europe/Berlin': 'W. Europe Standard Time', + 'Europe/Bratislava': 'Central Europe Standard Time', + 'Europe/Brussels': 'Romance Standard Time', + 'Europe/Bucharest': 'GTB Standard Time', + 'Europe/Budapest': 'Central Europe Standard Time', + 'Europe/Busingen': 'W. Europe Standard Time', + 'Europe/Chisinau': 'E. Europe Standard Time', + 'Europe/Copenhagen': 'Romance Standard Time', + 'Europe/Dublin': 'GMT Standard Time', + 'Europe/Gibraltar': 'W. Europe Standard Time', + 'Europe/Guernsey': 'GMT Standard Time', + 'Europe/Helsinki': 'FLE Standard Time', + 'Europe/Isle_of_Man': 'GMT Standard Time', + 'Europe/Istanbul': 'Turkey Standard Time', + 'Europe/Jersey': 'GMT Standard Time', + 'Europe/Kaliningrad': 'Kaliningrad Standard Time', + 'Europe/Kiev': 'FLE Standard Time', + 'Europe/Kirov': 'Russian Standard Time', + 'Europe/Lisbon': 'GMT Standard Time', + 'Europe/Ljubljana': 'Central Europe Standard Time', + 'Europe/London': 'GMT Standard Time', + 'Europe/Luxembourg': 'W. Europe Standard Time', + 'Europe/Madrid': 'Romance Standard Time', + 'Europe/Malta': 'W. Europe Standard Time', + 'Europe/Mariehamn': 'FLE Standard Time', + 'Europe/Minsk': 'Belarus Standard Time', + 'Europe/Monaco': 'W. Europe Standard Time', + 'Europe/Moscow': 'Russian Standard Time', + 'Europe/Oslo': 'W. Europe Standard Time', + 'Europe/Paris': 'Romance Standard Time', + 'Europe/Podgorica': 'Central Europe Standard Time', + 'Europe/Prague': 'Central Europe Standard Time', + 'Europe/Riga': 'FLE Standard Time', + 'Europe/Rome': 'W. Europe Standard Time', + 'Europe/Samara': 'Russia Time Zone 3', + 'Europe/San_Marino': 'W. Europe Standard Time', + 'Europe/Sarajevo': 'Central European Standard Time', + 'Europe/Saratov': 'Saratov Standard Time', + 'Europe/Simferopol': 'Russian Standard Time', + 'Europe/Skopje': 'Central European Standard Time', + 'Europe/Sofia': 'FLE Standard Time', + 'Europe/Stockholm': 'W. Europe Standard Time', + 'Europe/Tallinn': 'FLE Standard Time', + 'Europe/Tirane': 'Central Europe Standard Time', + 'Europe/Tiraspol': 'E. Europe Standard Time', + 'Europe/Ulyanovsk': 'Astrakhan Standard Time', + 'Europe/Uzhgorod': 'FLE Standard Time', + 'Europe/Vaduz': 'W. Europe Standard Time', + 'Europe/Vatican': 'W. Europe Standard Time', + 'Europe/Vienna': 'W. Europe Standard Time', + 'Europe/Vilnius': 'FLE Standard Time', + 'Europe/Volgograd': 'Russian Standard Time', + 'Europe/Warsaw': 'Central European Standard Time', + 'Europe/Zagreb': 'Central European Standard Time', + 'Europe/Zaporozhye': 'FLE Standard Time', + 'Europe/Zurich': 'W. Europe Standard Time', + 'GB': 'GMT Standard Time', + 'GB-Eire': 'GMT Standard Time', + 'GMT+0': 'UTC', + 'GMT-0': 'UTC', + 'GMT0': 'UTC', + 'Greenwich': 'UTC', + 'Hongkong': 'China Standard Time', + 'Iceland': 'Greenwich Standard Time', + 'Indian/Antananarivo': 'E. Africa Standard Time', + 'Indian/Chagos': 'Central Asia Standard Time', + 'Indian/Christmas': 'SE Asia Standard Time', + 'Indian/Cocos': 'Myanmar Standard Time', + 'Indian/Comoro': 'E. Africa Standard Time', + 'Indian/Kerguelen': 'West Asia Standard Time', + 'Indian/Mahe': 'Mauritius Standard Time', + 'Indian/Maldives': 'West Asia Standard Time', + 'Indian/Mauritius': 'Mauritius Standard Time', + 'Indian/Mayotte': 'E. Africa Standard Time', + 'Indian/Reunion': 'Mauritius Standard Time', + 'Iran': 'Iran Standard Time', + 'Israel': 'Israel Standard Time', + 'Jamaica': 'SA Pacific Standard Time', + 'Japan': 'Tokyo Standard Time', + 'Kwajalein': 'UTC+12', + 'Libya': 'Libya Standard Time', + 'MST7MDT': 'Mountain Standard Time', + 'Mexico/BajaNorte': 'Pacific Standard Time (Mexico)', + 'Mexico/BajaSur': 'Mountain Standard Time (Mexico)', + 'Mexico/General': 'Central Standard Time (Mexico)', + 'NZ': 'New Zealand Standard Time', + 'NZ-CHAT': 'Chatham Islands Standard Time', + 'Navajo': 'Mountain Standard Time', + 'PRC': 'China Standard Time', + 'PST8PDT': 'Pacific Standard Time', + 'Pacific/Apia': 'Samoa Standard Time', + 'Pacific/Auckland': 'New Zealand Standard Time', + 'Pacific/Bougainville': 'Bougainville Standard Time', + 'Pacific/Chatham': 'Chatham Islands Standard Time', + 'Pacific/Easter': 'Easter Island Standard Time', + 'Pacific/Efate': 'Central Pacific Standard Time', + 'Pacific/Enderbury': 'UTC+13', + 'Pacific/Fakaofo': 'UTC+13', + 'Pacific/Fiji': 'Fiji Standard Time', + 'Pacific/Funafuti': 'UTC+12', + 'Pacific/Galapagos': 'Central America Standard Time', + 'Pacific/Gambier': 'UTC-09', + 'Pacific/Guadalcanal': 'Central Pacific Standard Time', + 'Pacific/Guam': 'West Pacific Standard Time', + 'Pacific/Honolulu': 'Hawaiian Standard Time', + 'Pacific/Johnston': 'Hawaiian Standard Time', + 'Pacific/Kiritimati': 'Line Islands Standard Time', + 'Pacific/Kosrae': 'Central Pacific Standard Time', + 'Pacific/Kwajalein': 'UTC+12', + 'Pacific/Majuro': 'UTC+12', + 'Pacific/Marquesas': 'Marquesas Standard Time', + 'Pacific/Midway': 'UTC-11', + 'Pacific/Nauru': 'UTC+12', + 'Pacific/Niue': 'UTC-11', + 'Pacific/Norfolk': 'Norfolk Standard Time', + 'Pacific/Noumea': 'Central Pacific Standard Time', + 'Pacific/Pago_Pago': 'UTC-11', + 'Pacific/Palau': 'Tokyo Standard Time', + 'Pacific/Pitcairn': 'UTC-08', + 'Pacific/Ponape': 'Central Pacific Standard Time', + 'Pacific/Port_Moresby': 'West Pacific Standard Time', + 'Pacific/Rarotonga': 'Hawaiian Standard Time', + 'Pacific/Saipan': 'West Pacific Standard Time', + 'Pacific/Samoa': 'UTC-11', + 'Pacific/Tahiti': 'Hawaiian Standard Time', + 'Pacific/Tarawa': 'UTC+12', + 'Pacific/Tongatapu': 'Tonga Standard Time', + 'Pacific/Truk': 'West Pacific Standard Time', + 'Pacific/Wake': 'UTC+12', + 'Pacific/Wallis': 'UTC+12', + 'Poland': 'Central European Standard Time', + 'Portugal': 'GMT Standard Time', + 'ROC': 'Taipei Standard Time', + 'ROK': 'Korea Standard Time', + 'Singapore': 'Singapore Standard Time', + 'Turkey': 'Turkey Standard Time', + 'US/Alaska': 'Alaskan Standard Time', + 'US/Aleutian': 'Aleutian Standard Time', + 'US/Arizona': 'US Mountain Standard Time', + 'US/Central': 'Central Standard Time', + 'US/Eastern': 'Eastern Standard Time', + 'US/Hawaii': 'Hawaiian Standard Time', + 'US/Indiana-Starke': 'Central Standard Time', + 'US/Michigan': 'Eastern Standard Time', + 'US/Mountain': 'Mountain Standard Time', + 'US/Pacific': 'Pacific Standard Time', + 'US/Samoa': 'UTC-11', + 'UTC': 'UTC', + 'Universal': 'UTC', + 'W-SU': 'Russian Standard Time', + 'Zulu': 'UTC'} From b87c6c24d8ce7b64ef8809aef34602d1d9db3c79 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 11 Apr 2019 02:26:29 +0200 Subject: [PATCH 425/710] providers: assrt: support undefined Chinese as Simplified (chs/zho-Hans) --- Contents/Libraries/Shared/subliminal_patch/converters/assrt.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/converters/assrt.py b/Contents/Libraries/Shared/subliminal_patch/converters/assrt.py index ed4fd0362..06dd91338 100644 --- a/Contents/Libraries/Shared/subliminal_patch/converters/assrt.py +++ b/Contents/Libraries/Shared/subliminal_patch/converters/assrt.py @@ -9,7 +9,8 @@ def __init__(self): u'英文': ('eng',), u'chs': ('zho', None, 'Hans'), u'cht': ('zho', None, 'Hant'), u'chn': ('zho', None, 'Hans'), u'twn': ('zho', None, 'Hant')} - self.to_assrt = { ('zho', None, 'Hans'): u'chs', ('zho', None, 'Hant'): u'cht', ('eng',) : u'eng' } + self.to_assrt = { ('zho', None, 'Hans'): u'chs', ('zho', None, 'Hant'): u'cht', ('eng',) : u'eng', + ('zho',): u'chs'} self.codes = set(self.from_assrt.keys()) def convert(self, alpha3, country=None, script=None): From 9a28ea76727fa5480bb95d4a6a7f6486cf3c8505 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 11 Apr 2019 02:30:35 +0200 Subject: [PATCH 426/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 5daf64006..b805243e7 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.2977</string> + <string>2.6.5.2980</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.2977 DEV +Version 2.6.5.2980 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 92594dba1d57a4da3a26a9ffb18d7c9bca4b46cc Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 11 Apr 2019 03:52:22 +0200 Subject: [PATCH 427/710] core: http: clear up classes; reorder the MRO refiners: tvdb/omdb: properly implement timeouts --- .../Libraries/Shared/subliminal_patch/http.py | 27 ++++++++++++++----- .../Shared/subliminal_patch/refiners/omdb.py | 3 +++ .../Shared/subliminal_patch/refiners/tvdb.py | 3 +++ .../Shared/subliminal_patch/refiners/util.py | 10 +++++++ 4 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 Contents/Libraries/Shared/subliminal_patch/refiners/util.py diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index c813f5585..6073a73f9 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -38,12 +38,29 @@ custom_resolver.nameservers = ['8.8.8.8', '1.1.1.1'] -class CertifiSession(CloudflareScraper): +class TimeoutSession(requests.Session): timeout = 10 + def __init__(self, timeout=None): + super(TimeoutSession, self).__init__() + self.timeout = timeout or self.timeout + + def request(self, method, url, *args, **kwargs): + if kwargs.get('timeout') is None: + kwargs['timeout'] = self.timeout + + return super(TimeoutSession, self).request(method, url, *args, **kwargs) + + +class CertifiSession(TimeoutSession): def __init__(self): super(CertifiSession, self).__init__() self.verify = pem_file + + +class CFSession(CloudflareScraper, CertifiSession, TimeoutSession): + def __init__(self): + super(CFSession, self).__init__() self.headers.update({ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', @@ -53,9 +70,6 @@ def __init__(self): }) def request(self, method, url, *args, **kwargs): - if kwargs.get('timeout') is None: - kwargs['timeout'] = self.timeout - parsed_url = urlparse(url) domain = parsed_url.netloc @@ -71,7 +85,7 @@ def request(self, method, url, *args, **kwargs): self.headers['User-Agent'] = user_agent - ret = super(CertifiSession, self).request(method, url, *args, **kwargs) + ret = super(CFSession, self).request(method, url, *args, **kwargs) try: cf_data = self.get_live_tokens(domain) except: @@ -85,12 +99,11 @@ def request(self, method, url, *args, **kwargs): return ret -class RetryingSession(CertifiSession): +class RetryingSession(CFSession): proxied_functions = ("get", "post") def __init__(self): super(RetryingSession, self).__init__() - self.verify = pem_file proxy = os.environ.get('SZ_HTTP_PROXY') if proxy: diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/omdb.py b/Contents/Libraries/Shared/subliminal_patch/refiners/omdb.py index bef212f75..f8cfba105 100644 --- a/Contents/Libraries/Shared/subliminal_patch/refiners/omdb.py +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/omdb.py @@ -5,10 +5,13 @@ import zlib from subliminal import __short_version__ from subliminal.refiners.omdb import OMDBClient, refine as refine_orig, Episode, Movie +from subliminal_patch.http import TimeoutSession class SZOMDBClient(OMDBClient): def __init__(self, version=1, session=None, headers=None, timeout=10): + if not session: + session = TimeoutSession(timeout=timeout) super(SZOMDBClient, self).__init__(version=version, session=session, headers=headers, timeout=timeout) def get_params(self, params): diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py b/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py index a70f9aba6..808c8ef90 100644 --- a/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py @@ -5,9 +5,12 @@ from subliminal.refiners.tvdb import Episode, logger, search_series, series_re, sanitize, get_series, \ get_series_episode, region, tvdb_client +from util import fix_session_bases TVDB_SEASON_EXPIRATION_TIME = datetime.timedelta(days=1).total_seconds() +fix_session_bases(tvdb_client.session) + @region.cache_on_arguments(expiration_time=TVDB_SEASON_EXPIRATION_TIME) def is_season_fully_aired(series_id, season): diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/util.py b/Contents/Libraries/Shared/subliminal_patch/refiners/util.py new file mode 100644 index 000000000..f83701684 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/util.py @@ -0,0 +1,10 @@ +# coding=utf-8 + +import types +from subliminal_patch.http import TimeoutSession + + +def fix_session_bases(obj): + obj.__class__ = type("PatchedTimeoutSession", (TimeoutSession,), + {"request": types.MethodType(TimeoutSession.request, obj)}) + return obj From f2d8139befe274f3c2e7137ce11195cccc22ec28 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 11 Apr 2019 03:54:55 +0200 Subject: [PATCH 428/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index b805243e7..698ca45c8 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.2980</string> + <string>2.6.5.2982</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.2980 DEV +Version 2.6.5.2982 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 77e1c69f6b05b512b7bd02a6f0e1fa72ce0002d3 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 11 Apr 2019 04:02:48 +0200 Subject: [PATCH 429/710] providers: addic7ed: revert 6338757a9b46d6cba45299057de3099a8d61a5ff; temporarily remove _search_show_id --- .../Shared/subliminal/providers/addic7ed.py | 6 +-- .../subliminal_patch/providers/addic7ed.py | 41 +++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal/providers/addic7ed.py index 6d367ae84..2926081e0 100644 --- a/Contents/Libraries/Shared/subliminal/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal/providers/addic7ed.py @@ -230,9 +230,9 @@ def get_show_id(self, series, year=None, country_code=None): show_id = show_ids.get(series_sanitized) # search as last resort - # if not show_id: - # logger.warning('Series %s not found in show ids', series) - # show_id = self._search_show_id(series) + if not show_id: + logger.warning('Series %s not found in show ids', series) + show_id = self._search_show_id(series) return show_id diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 2d556d877..8507052d3 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -146,6 +146,47 @@ def check_verification(cache_region): def terminate(self): self.session.close() + def get_show_id(self, series, year=None, country_code=None): + """Get the best matching show id for `series`, `year` and `country_code`. + + First search in the result of :meth:`_get_show_ids` and fallback on a search with :meth:`_search_show_id`. + + :param str series: series of the episode. + :param year: year of the series, if any. + :type year: int + :param country_code: country code of the series, if any. + :type country_code: str + :return: the show id, if found. + :rtype: int + + """ + series_sanitized = sanitize(series).lower() + show_ids = self._get_show_ids() + show_id = None + + # attempt with country + if not show_id and country_code: + logger.debug('Getting show id with country') + show_id = show_ids.get('%s %s' % (series_sanitized, country_code.lower())) + + # attempt with year + if not show_id and year: + logger.debug('Getting show id with year') + show_id = show_ids.get('%s %d' % (series_sanitized, year)) + + # attempt clean + if not show_id: + logger.debug('Getting show id') + show_id = show_ids.get(series_sanitized) + + # search as last resort + # broken right now + # if not show_id: + # logger.warning('Series %s not found in show ids', series) + # show_id = self._search_show_id(series) + + return show_id + @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME) def _get_show_ids(self): """Get the ``dict`` of show ids per series by querying the `shows.php` page. From a9490b083872c42dcdaa2cecebe8dc2f2eb355bc Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 11 Apr 2019 04:59:49 +0200 Subject: [PATCH 430/710] providers: subscene: relieve a bit of stress on the provider by not querying releases anymore --- .../Libraries/Shared/subliminal_patch/http.py | 1 + .../subliminal_patch/providers/subscene.py | 25 +++++++++++-------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 6073a73f9..8683c6eda 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -86,6 +86,7 @@ def request(self, method, url, *args, **kwargs): self.headers['User-Agent'] = user_agent ret = super(CFSession, self).request(method, url, *args, **kwargs) + try: cf_data = self.get_live_tokens(domain) except: diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index d6a294cdb..7f2758b14 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -200,23 +200,23 @@ def parse_results(self, video, film): def query(self, video): vfn = get_video_filename(video) subtitles = [] - logger.debug(u"Searching for: %s", vfn) - film = search(vfn, session=self.session) + #logger.debug(u"Searching for: %s", vfn) + # film = search(vfn, session=self.session) + # + # if film and film.subtitles: + # logger.debug('Release results found: %s', len(film.subtitles)) + # subtitles = self.parse_results(video, film) + # else: + # logger.debug('No release results found') - if film and film.subtitles: - logger.debug('Release results found: %s', len(film.subtitles)) - subtitles = self.parse_results(video, film) - else: - logger.debug('No release results found') - - time.sleep(self.search_throttle) + #time.sleep(self.search_throttle) # re-search for episodes without explicit release name if isinstance(video, Episode): #term = u"%s S%02iE%02i" % (video.series, video.season, video.episode) + more_than_one = len([video.series] + video.alternative_series) > 1 for series in [video.series] + video.alternative_series: term = u"%s - %s Season" % (series, p.number_to_words("%sth" % video.season).capitalize()) - time.sleep(self.search_throttle) logger.debug('Searching for alternative results: %s', term) film = search(term, session=self.session, release=False) if film and film.subtitles: @@ -238,12 +238,17 @@ def query(self, video): logger.debug('No pack results found') else: logger.debug("Not searching for packs, because the season hasn't fully aired") + if more_than_one: + time.sleep(self.search_throttle) else: + more_than_one = len([video.title] + video.alternative_titles) > 1 for title in [video.title] + video.alternative_titles: logger.debug('Searching for movie results: %s', title) film = search(title, year=video.year, session=self.session, limit_to=None, release=False) if film and film.subtitles: subtitles += self.parse_results(video, film) + if more_than_one: + time.sleep(self.search_throttle) logger.info("%s subtitles found" % len(subtitles)) return subtitles From 2406e0ad4988aaf56080934abe01041062a807e2 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 12 Apr 2019 14:53:43 +0200 Subject: [PATCH 431/710] core: extract embedded: use fs encoding for filenames --- Contents/Code/interface/menu_helpers.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 2d05c315d..8e7b17b66 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -7,6 +7,7 @@ import operator from func import enable_channel_wrapper, route_wrapper, register_route_function +from subzero.lib.io import get_viable_encoding from subzero.language import Language from support.i18n import is_localized_string, _ from support.items import get_kind, get_item_thumb, get_item, get_item_kind_from_item, refresh_item @@ -190,8 +191,10 @@ def extract_embedded_sub(**kwargs): out_codec = stream.codec if stream.codec != "mov_text" else "srt" + encoding = get_viable_encoding() args = [ - config.plex_transcoder, "-i", part.file, "-map", "0:%s" % stream_index, "-f", out_codec, "-" + config.plex_transcoder.decode("utf-8").encode(encoding), "-i", + part.file.decode("utf-8").encode(encoding), "-map", "0:%s" % stream_index, "-f", out_codec, "-" ] output = None try: From c3665f04d64a5f0db1b4742bd3e1984b5a7e5ee6 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 13 Apr 2019 02:31:59 +0200 Subject: [PATCH 432/710] core: extract embedded: fix encoding for mswindows --- Contents/Code/interface/menu_helpers.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 8e7b17b66..94895ac38 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -12,7 +12,7 @@ from support.i18n import is_localized_string, _ from support.items import get_kind, get_item_thumb, get_item, get_item_kind_from_item, refresh_item from support.helpers import get_video_display_title, pad_title, display_language, quote_args, is_stream_forced, \ - get_title_for_video_metadata + get_title_for_video_metadata, mswindows from support.history import get_history from support.ignore import get_decision_list from support.lib import get_intent @@ -191,14 +191,19 @@ def extract_embedded_sub(**kwargs): out_codec = stream.codec if stream.codec != "mov_text" else "srt" - encoding = get_viable_encoding() args = [ - config.plex_transcoder.decode("utf-8").encode(encoding), "-i", - part.file.decode("utf-8").encode(encoding), "-map", "0:%s" % stream_index, "-f", out_codec, "-" + config.plex_transcoder, "-i", part.file, "-map", "0:%s" % stream_index, "-f", out_codec, "-" ] + + cmdline = quote_args(args) + Log.Debug(u"Calling: %s", cmdline) + if mswindows: + Log.Debug("MSWindows: Fixing encoding") + cmdline = cmdline.encode("mbcs") + output = None try: - output = subprocess.check_output(quote_args(args), stderr=subprocess.PIPE, shell=True) + output = subprocess.check_output(cmdline, stderr=subprocess.PIPE, shell=True) except: Log.Error("Extraction failed: %s", traceback.format_exc()) From 8c569183be666c22a7e5cf501b3dd173044bb512 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 13 Apr 2019 03:45:22 +0200 Subject: [PATCH 433/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 698ca45c8..57214645e 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.2982</string> + <string>2.6.5.2987</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.2982 DEV +Version 2.6.5.2987 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 65201749f760871ae011a46e800830f45ab32f16 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 13 Apr 2019 16:12:11 +0200 Subject: [PATCH 434/710] providers: titlovi: might work without captcha, make it optional --- Contents/Code/support/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index f9eda93d9..66e8e654c 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -758,7 +758,7 @@ def providers_by_prefs(self): return {'opensubtitles': cast_bool(Prefs['provider.opensubtitles.enabled']), # 'thesubdb': Prefs['provider.thesubdb.enabled'], 'podnapisi': cast_bool(Prefs['provider.podnapisi.enabled']), - 'titlovi': cast_bool(Prefs['provider.titlovi.enabled']) and self.has_anticaptcha, + 'titlovi': cast_bool(Prefs['provider.titlovi.enabled']), 'addic7ed': cast_bool(Prefs['provider.addic7ed.enabled']) and self.has_anticaptcha, 'tvsubtitles': cast_bool(Prefs['provider.tvsubtitles.enabled']), 'legendastv': cast_bool(Prefs['provider.legendastv.enabled']), From 0ec11c532ec0f8dacf53c5d0eb4328655e0ef585 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 13 Apr 2019 16:23:33 +0200 Subject: [PATCH 435/710] release 2.6.5.2989 --- Contents/Info.plist | 4 ++-- README.md | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 57214645e..4974972e6 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.2987</string> + <string>2.6.5.2989</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.2987 DEV +Version 2.6.5.2989 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index a036b4c32..aa6869a0b 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.4.2947 +2.6.5.2988 - core: SRT parsing: handle (bad) ASS color tag in SRT - core: auto extract embedded: only use one unknown sub for first language - core: better embedded streams language detection @@ -93,17 +93,26 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe - core: don't raise exception when subtitle not found inside archive - core: search external subtitles: fix condition - core: better plex transcoder path detection -- core: use Log.Warn instead of Log.Warning +- core: use Log.Warn instead of Log.Warning (#619, #629, #633) - core: also check for "plex transcoder.exe" in case of windows (fixes #619) +- core: auto extract: use mbcs encoding for paths on windows - core: Fix issue scandir not returning the name of the file inside Docker images on ARM systems. (thanks @giejay) - core: also clean PYTHONHOME when calling external notification app - core: update certifi to 2019.3.9 +- core: scan_video: add series/title as alternative by scanning filename itself without parent folders +- core: add generic solution for solving captchas using anti captcha services +- core: increase cache time to 180d (was: 30d) - windows: fix compatibility issues with plex transcoder - compat: use lowercase paths on subtitle detection -- providers: addic7ed: drop support for now (they added reCAPTCHA; waiting for API; #612) +- providers: addic7ed: re-enable (using paid anti captch service) +- providers: assrt: assume undefined Chinese flavor as Simplified (chs/zho-Hans) +- providers: subscene: make it work again by bypassing cf - providers: subscene: don't fail on missing cover -- providers: titlovi: fix provider (thanks @viking1304) +- providers: titlovi: re-enable (might need paid anti captch service) - providers: opensubtitles: fix only_foreign handling +- providers: opensubtitles: show subtitles with possibly mismatched series when manually listing subs +- menu: list subtitles: show subtitles with bad season/episode values as well +- refiners: omdb: fix imdb ids with spaces From 72a21e1ef459c0253c46f08a68cb76fe2945375d Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 16 Apr 2019 17:52:04 +0200 Subject: [PATCH 436/710] back from dev --- Contents/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 4974972e6..eaf4f5e88 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> From 060ba2a5be13037b2fa5f8aea48648cb90c5a4b2 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 16 Apr 2019 18:15:03 +0200 Subject: [PATCH 437/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index eaf4f5e88..6c371236b 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.2989 +Version 2.6.5.2989 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From e7cdbbcacbe3746097a71d7bdc79f45606b79bc3 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 18 Apr 2019 16:48:43 +0200 Subject: [PATCH 438/710] providers: subscene: cf: preserve headers --- .../Libraries/Shared/cfscrape/__init__.py | 26 +++++++++---------- .../Libraries/Shared/subliminal_patch/http.py | 21 ++++++++++----- .../subliminal_patch/providers/subscene.py | 1 - 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/Contents/Libraries/Shared/cfscrape/__init__.py b/Contents/Libraries/Shared/cfscrape/__init__.py index 57afe4312..e1d0c8fc8 100644 --- a/Contents/Libraries/Shared/cfscrape/__init__.py +++ b/Contents/Libraries/Shared/cfscrape/__init__.py @@ -77,18 +77,18 @@ def debugRequest(self, req): pass def request(self, method, url, *args, **kwargs): - self.headers = ( - OrderedDict( - [ - ('User-Agent', self.headers['User-Agent']), - ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), - ('Accept-Language', 'en-US,en;q=0.5'), - ('Accept-Encoding', 'gzip, deflate'), - ('Connection', 'close'), - ('Upgrade-Insecure-Requests', '1') - ] - ) - ) + if not isinstance(self.headers, OrderedDict): + self.headers = \ + OrderedDict( + [ + ('User-Agent', self.headers['User-Agent']), + ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), + ('Accept-Language', 'en-US,en;q=0.5'), + ('Accept-Encoding', 'gzip, deflate'), + ('Connection', 'close'), + ('Upgrade-Insecure-Requests', '1') + ] + ) resp = super(CloudflareScraper, self).request(method, url, *args, **kwargs) @@ -127,7 +127,7 @@ def solve_cf_challenge(self, resp, **original_kwargs): submit_url = '{}://{}/cdn-cgi/l/chk_jschl'.format(parsed_url.scheme, domain) cloudflare_kwargs = deepcopy(original_kwargs) - headers = cloudflare_kwargs.setdefault('headers', {'Referer': resp.url}) + headers = cloudflare_kwargs.setdefault('headers', OrderedDict({'Referer': resp.url})) try: params = cloudflare_kwargs.setdefault( diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 8683c6eda..7f903d204 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -1,4 +1,5 @@ # coding=utf-8 + import certifi import ssl import os @@ -8,7 +9,9 @@ import xmlrpclib import dns.resolver +from collections import OrderedDict from requests import exceptions +from requests.utils import default_user_agent from urllib3.util import connection from retry.api import retry_call from exceptions import APIThrottled @@ -61,13 +64,17 @@ def __init__(self): class CFSession(CloudflareScraper, CertifiSession, TimeoutSession): def __init__(self): super(CFSession, self).__init__() - self.headers.update({ - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'Accept-Language': 'en-US,en;q=0.5', - 'Cache-Control': 'no-cache', - 'Pragma': 'no-cache', - 'DNT': '1' - }) + self.headers = OrderedDict([ + ('User-Agent', default_user_agent()), + ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), + ('Accept-Language', 'en-US,en;q=0.5'), + ('Accept-Encoding', 'gzip, deflate'), + ('Connection', 'keep-alive'), + ('Pragma', 'no-cache'), + ('Cache-Control', 'no-cache'), + ('Upgrade-Insecure-Requests', '1'), + ('DNT', '1'), + ]) def request(self, method, url, *args, **kwargs): parsed_url = urlparse(url) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 7f2758b14..1e2a2a2c8 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -128,7 +128,6 @@ def initialize(self): self.session = Session() from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)] - self.session.headers['Referer'] = "https://subscene.com" def terminate(self): logger.info("Closing session") From a8de8dcc48bbc49510b88a3b15dac97c0a041b8b Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 18 Apr 2019 16:51:00 +0200 Subject: [PATCH 439/710] bump dev --- Contents/Info.plist | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 6c371236b..3115e2827 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.2989</string> + <string>2.6.5.2995</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.2989 DEV +Version 2.6.5.2995 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index e10f53312..cee1b243d 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.2988 +2.6.5.2995 - core: SRT parsing: handle (bad) ASS color tag in SRT - core: auto extract embedded: only use one unknown sub for first language - core: better embedded streams language detection From b1dfbffc4f9c24e29a5562745b1dc5016d114639 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 18 Apr 2019 16:52:29 +0200 Subject: [PATCH 440/710] core: add CF debugging environment variable --- Contents/Libraries/Shared/subliminal_patch/http.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 7f903d204..84fa3f2c4 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -75,6 +75,7 @@ def __init__(self): ('Upgrade-Insecure-Requests', '1'), ('DNT', '1'), ]) + self.debug = os.environ.get("CF_DEBUG", False) def request(self, method, url, *args, **kwargs): parsed_url = urlparse(url) From 4d152834739fa95b2d41bf20414bcc6b2f0a040c Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 18 Apr 2019 16:53:33 +0200 Subject: [PATCH 441/710] bump dev --- Contents/Info.plist | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 3115e2827..e65af1673 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.2995</string> + <string>2.6.5.2997</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.2995 DEV +Version 2.6.5.2997 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index cee1b243d..c8a130fd5 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.2995 +2.6.5.2997 - core: SRT parsing: handle (bad) ASS color tag in SRT - core: auto extract embedded: only use one unknown sub for first language - core: better embedded streams language detection From e03bb4f28084ae55e8d7542fe68f619298e2d295 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 18 Apr 2019 16:54:03 +0200 Subject: [PATCH 442/710] release 2.6.5.2997 --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index e65af1673..1c26c82ef 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.2997 DEV +Version 2.6.5.2997 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 22dd7ef0935ab1f46fe6671452d2268e9232cddb Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 19 Apr 2019 03:12:24 +0200 Subject: [PATCH 443/710] Revert: providers: subscene: cf: preserve headers --- .../Libraries/Shared/cfscrape/__init__.py | 26 +++++++++---------- .../Libraries/Shared/subliminal_patch/http.py | 14 ---------- .../subliminal_patch/providers/subscene.py | 2 -- 3 files changed, 13 insertions(+), 29 deletions(-) diff --git a/Contents/Libraries/Shared/cfscrape/__init__.py b/Contents/Libraries/Shared/cfscrape/__init__.py index e1d0c8fc8..57afe4312 100644 --- a/Contents/Libraries/Shared/cfscrape/__init__.py +++ b/Contents/Libraries/Shared/cfscrape/__init__.py @@ -77,18 +77,18 @@ def debugRequest(self, req): pass def request(self, method, url, *args, **kwargs): - if not isinstance(self.headers, OrderedDict): - self.headers = \ - OrderedDict( - [ - ('User-Agent', self.headers['User-Agent']), - ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), - ('Accept-Language', 'en-US,en;q=0.5'), - ('Accept-Encoding', 'gzip, deflate'), - ('Connection', 'close'), - ('Upgrade-Insecure-Requests', '1') - ] - ) + self.headers = ( + OrderedDict( + [ + ('User-Agent', self.headers['User-Agent']), + ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), + ('Accept-Language', 'en-US,en;q=0.5'), + ('Accept-Encoding', 'gzip, deflate'), + ('Connection', 'close'), + ('Upgrade-Insecure-Requests', '1') + ] + ) + ) resp = super(CloudflareScraper, self).request(method, url, *args, **kwargs) @@ -127,7 +127,7 @@ def solve_cf_challenge(self, resp, **original_kwargs): submit_url = '{}://{}/cdn-cgi/l/chk_jschl'.format(parsed_url.scheme, domain) cloudflare_kwargs = deepcopy(original_kwargs) - headers = cloudflare_kwargs.setdefault('headers', OrderedDict({'Referer': resp.url})) + headers = cloudflare_kwargs.setdefault('headers', {'Referer': resp.url}) try: params = cloudflare_kwargs.setdefault( diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 84fa3f2c4..28b3cc088 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -1,5 +1,4 @@ # coding=utf-8 - import certifi import ssl import os @@ -9,9 +8,7 @@ import xmlrpclib import dns.resolver -from collections import OrderedDict from requests import exceptions -from requests.utils import default_user_agent from urllib3.util import connection from retry.api import retry_call from exceptions import APIThrottled @@ -64,17 +61,6 @@ def __init__(self): class CFSession(CloudflareScraper, CertifiSession, TimeoutSession): def __init__(self): super(CFSession, self).__init__() - self.headers = OrderedDict([ - ('User-Agent', default_user_agent()), - ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), - ('Accept-Language', 'en-US,en;q=0.5'), - ('Accept-Encoding', 'gzip, deflate'), - ('Connection', 'keep-alive'), - ('Pragma', 'no-cache'), - ('Cache-Control', 'no-cache'), - ('Upgrade-Insecure-Requests', '1'), - ('DNT', '1'), - ]) self.debug = os.environ.get("CF_DEBUG", False) def request(self, method, url, *args, **kwargs): diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 1e2a2a2c8..4392e6368 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -126,8 +126,6 @@ def __init__(self, only_foreign=False): def initialize(self): logger.info("Creating session") self.session = Session() - from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST - self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)] def terminate(self): logger.info("Closing session") From 66e7c6076721de4ef1fdf2a6156e7d4d6d8fe633 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 19 Apr 2019 03:19:58 +0200 Subject: [PATCH 444/710] core: cf: move get_live_tokens to CFSession.get_cf_live_tokens --- .../Libraries/Shared/cfscrape/__init__.py | 16 ---------------- .../Libraries/Shared/subliminal_patch/http.py | 19 ++++++++++++++++++- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/Contents/Libraries/Shared/cfscrape/__init__.py b/Contents/Libraries/Shared/cfscrape/__init__.py index 57afe4312..0f3fd3f86 100644 --- a/Contents/Libraries/Shared/cfscrape/__init__.py +++ b/Contents/Libraries/Shared/cfscrape/__init__.py @@ -297,22 +297,6 @@ def get_tokens(cls, url, user_agent=None, debug=False, **kwargs): scraper.headers['User-Agent'] ) - def get_live_tokens(self, domain): - for d in self.cookies.list_domains(): - if d.startswith(".") and d in ("." + domain): - cookie_domain = d - break - else: - raise ValueError( - "Unable to find Cloudflare cookies. Does the site actually have Cloudflare IUAM (\"I'm Under Attack Mode\") enabled?") - - return ({ - "__cfduid": self.cookies.get("__cfduid", "", domain=cookie_domain), - "cf_clearance": self.cookies.get("cf_clearance", "", domain=cookie_domain) - }, - self.headers["User-Agent"] - ) - @classmethod def get_cookie_string(cls, url, user_agent=None, debug=False, **kwargs): """ diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 28b3cc088..d9049d778 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -82,7 +82,7 @@ def request(self, method, url, *args, **kwargs): ret = super(CFSession, self).request(method, url, *args, **kwargs) try: - cf_data = self.get_live_tokens(domain) + cf_data = self.get_cf_live_tokens(domain) except: pass else: @@ -93,6 +93,23 @@ def request(self, method, url, *args, **kwargs): return ret + def get_cf_live_tokens(self, domain): + for d in self.cookies.list_domains(): + if d.startswith(".") and d in ("." + domain): + cookie_domain = d + break + else: + raise ValueError( + "Unable to find Cloudflare cookies. Does the site actually have " + "Cloudflare IUAM (\"I'm Under Attack Mode\") enabled?") + + return ({ + "__cfduid": self.cookies.get("__cfduid", "", domain=cookie_domain), + "cf_clearance": self.cookies.get("cf_clearance", "", domain=cookie_domain) + }, + self.headers["User-Agent"] + ) + class RetryingSession(CFSession): proxied_functions = ("get", "post") From 5ba5a9dfc449c3ea0c3eed1d220343aad4e49199 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 19 Apr 2019 04:30:42 +0200 Subject: [PATCH 445/710] core: http: separate CFSession and RetryingSession again providers: subscene/titlovi: use RetryingCFSession proviers: titlovi: drop explicit random user agent; drop explicit referer --- Contents/Libraries/Shared/subliminal_patch/http.py | 8 ++++++-- .../Shared/subliminal_patch/providers/subscene.py | 4 ++-- .../Shared/subliminal_patch/providers/titlovi.py | 10 +++------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index d9049d778..8b247f90f 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -58,7 +58,7 @@ def __init__(self): self.verify = pem_file -class CFSession(CloudflareScraper, CertifiSession, TimeoutSession): +class CFSession(CloudflareScraper): def __init__(self): super(CFSession, self).__init__() self.debug = os.environ.get("CF_DEBUG", False) @@ -111,7 +111,7 @@ def get_cf_live_tokens(self, domain): ) -class RetryingSession(CFSession): +class RetryingSession(CertifiSession, TimeoutSession): proxied_functions = ("get", "post") def __init__(self): @@ -149,6 +149,10 @@ def post(self, *args, **kwargs): return self.retry_method("post", *args, **kwargs) +class RetryingCFSession(RetryingSession, CFSession): + pass + + class SubZeroRequestsTransport(xmlrpclib.SafeTransport): """ Drop in Transport for xmlrpclib that uses Requests instead of httplib diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 4392e6368..0025470cf 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -12,11 +12,11 @@ from babelfish import language_converters from guessit import guessit -from requests import Session from dogpile.cache.api import NO_VALUE from subliminal import Episode, ProviderError from subliminal.cache import region from subliminal.utils import sanitize_release_group +from subliminal_patch.http import RetryingCFSession from subliminal_patch.providers import Provider from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin from subliminal_patch.subtitle import Subtitle, guess_matches @@ -125,7 +125,7 @@ def __init__(self, only_foreign=False): def initialize(self): logger.info("Creating session") - self.session = Session() + self.session = RetryingCFSession() def terminate(self): logger.info("Closing session") diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index 860932ca5..b58c9fe29 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -12,8 +12,9 @@ from zipfile import ZipFile, is_zipfile from rarfile import RarFile, is_rarfile from babelfish import language_converters, Script -from requests import Session, RequestException +from requests import RequestException from guessit import guessit +from subliminal_patch.http import RetryingCFSession from subliminal_patch.providers import Provider from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin from subliminal_patch.subtitle import Subtitle @@ -138,12 +139,7 @@ class TitloviProvider(Provider, ProviderSubtitleArchiveMixin): download_url = server_url + '/download/?type=1&mediaid=' def initialize(self): - self.session = Session() - logger.debug("Using random user agents") - self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)] - logger.debug('User-Agent set to %s', self.session.headers['User-Agent']) - self.session.headers['Referer'] = self.server_url - logger.debug('Referer set to %s', self.session.headers['Referer']) + self.session = RetryingCFSession() load_verification("titlovi", self.session) def terminate(self): From 7301cd259bae7569979f781521b660f0c02ad224 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 20 Apr 2019 04:20:07 +0200 Subject: [PATCH 446/710] core: update requests to 2.21.0; six to 1.12.0 --- .../Libraries/Shared/requests/__version__.py | 4 +- Contents/Libraries/Shared/requests/models.py | 2 +- .../Libraries/Shared/requests/sessions.py | 13 +- Contents/Libraries/Shared/requests/utils.py | 4 +- Contents/Libraries/Shared/six.py | 117 +++++++++++++++--- 5 files changed, 118 insertions(+), 22 deletions(-) diff --git a/Contents/Libraries/Shared/requests/__version__.py b/Contents/Libraries/Shared/requests/__version__.py index be8a45fe0..f5b5d0367 100644 --- a/Contents/Libraries/Shared/requests/__version__.py +++ b/Contents/Libraries/Shared/requests/__version__.py @@ -5,8 +5,8 @@ __title__ = 'requests' __description__ = 'Python HTTP for Humans.' __url__ = 'http://python-requests.org' -__version__ = '2.20.0' -__build__ = 0x022000 +__version__ = '2.21.0' +__build__ = 0x022100 __author__ = 'Kenneth Reitz' __author_email__ = 'me@kennethreitz.org' __license__ = 'Apache 2.0' diff --git a/Contents/Libraries/Shared/requests/models.py b/Contents/Libraries/Shared/requests/models.py index 3dded57ef..62dcd0b7c 100644 --- a/Contents/Libraries/Shared/requests/models.py +++ b/Contents/Libraries/Shared/requests/models.py @@ -781,7 +781,7 @@ def generate(): return chunks - def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None): + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None): """Iterates over the response data, one line at a time. When stream=True is set on the request, this avoids reading the content at once into memory for large responses. diff --git a/Contents/Libraries/Shared/requests/sessions.py b/Contents/Libraries/Shared/requests/sessions.py index a448bd83f..d73d700fa 100644 --- a/Contents/Libraries/Shared/requests/sessions.py +++ b/Contents/Libraries/Shared/requests/sessions.py @@ -19,7 +19,7 @@ from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT from .hooks import default_hooks, dispatch_hook from ._internal_utils import to_native_string -from .utils import to_key_val_list, default_headers +from .utils import to_key_val_list, default_headers, DEFAULT_PORTS from .exceptions import ( TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) @@ -128,8 +128,17 @@ def should_strip_auth(self, old_url, new_url): if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): return False + + # Handle default port usage corresponding to scheme. + changed_port = old_parsed.port != new_parsed.port + changed_scheme = old_parsed.scheme != new_parsed.scheme + default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) + if (not changed_scheme and old_parsed.port in default_port + and new_parsed.port in default_port): + return False + # Standard case: root URI must match - return old_parsed.port != new_parsed.port or old_parsed.scheme != new_parsed.scheme + return changed_port or changed_scheme def resolve_redirects(self, resp, req, stream=False, timeout=None, verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): diff --git a/Contents/Libraries/Shared/requests/utils.py b/Contents/Libraries/Shared/requests/utils.py index 0ce7fe115..8170a8d2c 100644 --- a/Contents/Libraries/Shared/requests/utils.py +++ b/Contents/Libraries/Shared/requests/utils.py @@ -38,6 +38,8 @@ DEFAULT_CA_BUNDLE_PATH = certs.where() +DEFAULT_PORTS = {'http': 80, 'https': 443} + if sys.platform == 'win32': # provide a proxy_bypass version on Windows without DNS lookups @@ -264,7 +266,7 @@ def from_key_val_list(value): >>> from_key_val_list([('key', 'val')]) OrderedDict([('key', 'val')]) >>> from_key_val_list('string') - ValueError: need more than 1 value to unpack + ValueError: cannot encode objects that are not 2-tuples >>> from_key_val_list({'key': 'val'}) OrderedDict([('key', 'val')]) diff --git a/Contents/Libraries/Shared/six.py b/Contents/Libraries/Shared/six.py index 190c0239c..47ecf52bd 100644 --- a/Contents/Libraries/Shared/six.py +++ b/Contents/Libraries/Shared/six.py @@ -1,6 +1,4 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2015 Benjamin Peterson +# Copyright (c) 2010-2018 Benjamin Peterson # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,6 +18,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +"""Utilities for writing code that runs on Python 2 and 3""" + from __future__ import absolute_import import functools @@ -29,7 +29,7 @@ import types __author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.10.0" +__version__ = "1.12.0" # Useful for very coarse version differentiation. @@ -241,6 +241,7 @@ class _MovedItems(_LazyModule): MovedAttribute("map", "itertools", "builtins", "imap", "map"), MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getoutput", "commands", "subprocess"), MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), MovedAttribute("reduce", "__builtin__", "functools"), @@ -262,10 +263,11 @@ class _MovedItems(_LazyModule): MovedModule("html_entities", "htmlentitydefs", "html.entities"), MovedModule("html_parser", "HTMLParser", "html.parser"), MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), @@ -337,10 +339,12 @@ class Module_six_moves_urllib_parse(_LazyModule): MovedAttribute("quote_plus", "urllib", "urllib.parse"), MovedAttribute("unquote", "urllib", "urllib.parse"), MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), MovedAttribute("urlencode", "urllib", "urllib.parse"), MovedAttribute("splitquery", "urllib", "urllib.parse"), MovedAttribute("splittag", "urllib", "urllib.parse"), MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), MovedAttribute("uses_params", "urlparse", "urllib.parse"), @@ -416,6 +420,8 @@ class Module_six_moves_urllib_request(_LazyModule): MovedAttribute("URLopener", "urllib", "urllib.request"), MovedAttribute("FancyURLopener", "urllib", "urllib.request"), MovedAttribute("proxy_bypass", "urllib", "urllib.request"), + MovedAttribute("parse_http_list", "urllib2", "urllib.request"), + MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), ] for attr in _urllib_request_moved_attributes: setattr(Module_six_moves_urllib_request, attr.name, attr) @@ -631,6 +637,7 @@ def u(s): import io StringIO = io.StringIO BytesIO = io.BytesIO + del io _assertCountEqual = "assertCountEqual" if sys.version_info[1] <= 1: _assertRaisesRegex = "assertRaisesRegexp" @@ -679,11 +686,15 @@ def assertRegex(self, *args, **kwargs): exec_ = getattr(moves.builtins, "exec") def reraise(tp, value, tb=None): - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None else: def exec_(_code_, _globs_=None, _locs_=None): @@ -699,19 +710,28 @@ def exec_(_code_, _globs_=None, _locs_=None): exec("""exec _code_ in _globs_, _locs_""") exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb + try: + raise tp, value, tb + finally: + tb = None """) if sys.version_info[:2] == (3, 2): exec_("""def raise_from(value, from_value): - if from_value is None: - raise value - raise value from from_value + try: + if from_value is None: + raise value + raise value from from_value + finally: + value = None """) elif sys.version_info[:2] > (3, 2): exec_("""def raise_from(value, from_value): - raise value from from_value + try: + raise value from from_value + finally: + value = None """) else: def raise_from(value, from_value): @@ -802,10 +822,14 @@ def with_metaclass(meta, *bases): # This requires a bit of explanation: the basic idea is to make a dummy # metaclass for one level of class instantiation that replaces itself with # the actual metaclass. - class metaclass(meta): + class metaclass(type): def __new__(cls, name, this_bases, d): return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) return type.__new__(metaclass, 'temporary_class', (), {}) @@ -821,10 +845,71 @@ def wrapper(cls): orig_vars.pop(slots_var) orig_vars.pop('__dict__', None) orig_vars.pop('__weakref__', None) + if hasattr(cls, '__qualname__'): + orig_vars['__qualname__'] = cls.__qualname__ return metaclass(cls.__name__, cls.__bases__, orig_vars) return wrapper +def ensure_binary(s, encoding='utf-8', errors='strict'): + """Coerce **s** to six.binary_type. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> encoded to `bytes` + - `bytes` -> `bytes` + """ + if isinstance(s, text_type): + return s.encode(encoding, errors) + elif isinstance(s, binary_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + +def ensure_str(s, encoding='utf-8', errors='strict'): + """Coerce *s* to `str`. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if not isinstance(s, (text_type, binary_type)): + raise TypeError("not expecting type '%s'" % type(s)) + if PY2 and isinstance(s, text_type): + s = s.encode(encoding, errors) + elif PY3 and isinstance(s, binary_type): + s = s.decode(encoding, errors) + return s + + +def ensure_text(s, encoding='utf-8', errors='strict'): + """Coerce *s* to six.text_type. + + For Python 2: + - `unicode` -> `unicode` + - `str` -> `unicode` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if isinstance(s, binary_type): + return s.decode(encoding, errors) + elif isinstance(s, text_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + + def python_2_unicode_compatible(klass): """ A decorator that defines __unicode__ and __str__ methods under Python 2. From 5bb36bc87cea98a667797a6e0455786e0caeac32 Mon Sep 17 00:00:00 2001 From: Robin Westra <r.westra96@gmail.com> Date: Sat, 20 Apr 2019 15:24:29 +0200 Subject: [PATCH 447/710] Allow matching either series name or imdb_id --- Contents/Libraries/Shared/subliminal_patch/core.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index df38b4e09..0905ce1df 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -396,7 +396,12 @@ def download_best_subtitles(self, subtitles, video, languages, min_score=0, hear if not subtitle.hash_verifiable and "hash" in matches: can_verify_series = False - if can_verify_series and not {"series", "season", "episode"}.issubset(orig_matches): + matches_series = False + if {"season", "episode"}.issubset(orig_matches) and \ + ("series" in orig_matches or "imdb_id" in orig_matches): + matches_series = True + + if can_verify_series and not matches_series: logger.debug("%r: Skipping subtitle with score %d, because it doesn't match our series/episode", subtitle, score) continue From dc83d361933023bc1166c5bcb283583b9f876044 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 20 Apr 2019 15:44:54 +0200 Subject: [PATCH 448/710] core: update enum to 1.1.6; urllib3 to 1.24.2 --- Contents/Libraries/Shared/urllib3/__init__.py | 2 +- Contents/Libraries/Shared/urllib3/contrib/pyopenssl.py | 3 +++ Contents/Libraries/Shared/urllib3/poolmanager.py | 7 +++++-- Contents/Libraries/Shared/urllib3/response.py | 8 ++++---- Contents/Libraries/Shared/urllib3/util/retry.py | 3 ++- Contents/Libraries/Shared/urllib3/util/ssl_.py | 7 ++++++- 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Contents/Libraries/Shared/urllib3/__init__.py b/Contents/Libraries/Shared/urllib3/__init__.py index 75725167e..61915465f 100644 --- a/Contents/Libraries/Shared/urllib3/__init__.py +++ b/Contents/Libraries/Shared/urllib3/__init__.py @@ -27,7 +27,7 @@ __author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' __license__ = 'MIT' -__version__ = '1.24' +__version__ = '1.24.2' __all__ = ( 'HTTPConnectionPool', diff --git a/Contents/Libraries/Shared/urllib3/contrib/pyopenssl.py b/Contents/Libraries/Shared/urllib3/contrib/pyopenssl.py index 7c0e9465d..5ab7803ac 100644 --- a/Contents/Libraries/Shared/urllib3/contrib/pyopenssl.py +++ b/Contents/Libraries/Shared/urllib3/contrib/pyopenssl.py @@ -184,6 +184,9 @@ def idna_encode(name): except idna.core.IDNAError: return None + if ':' in name: + return name + name = idna_encode(name) if name is None: return None diff --git a/Contents/Libraries/Shared/urllib3/poolmanager.py b/Contents/Libraries/Shared/urllib3/poolmanager.py index fe5491cfd..32bd97302 100644 --- a/Contents/Libraries/Shared/urllib3/poolmanager.py +++ b/Contents/Libraries/Shared/urllib3/poolmanager.py @@ -7,6 +7,7 @@ from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool from .connectionpool import port_by_scheme from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown +from .packages import six from .packages.six.moves.urllib.parse import urljoin from .request import RequestMethods from .util.url import parse_url @@ -342,8 +343,10 @@ def urlopen(self, method, url, redirect=True, **kw): # conn.is_same_host() which may use socket.gethostbyname() in the future. if (retries.remove_headers_on_redirect and not conn.is_same_host(redirect_location)): - for header in retries.remove_headers_on_redirect: - kw['headers'].pop(header, None) + headers = list(six.iterkeys(kw['headers'])) + for header in headers: + if header.lower() in retries.remove_headers_on_redirect: + kw['headers'].pop(header, None) try: retries = retries.increment(method, url, response=response, _pool=conn) diff --git a/Contents/Libraries/Shared/urllib3/response.py b/Contents/Libraries/Shared/urllib3/response.py index f0cfbb549..c112690b0 100644 --- a/Contents/Libraries/Shared/urllib3/response.py +++ b/Contents/Libraries/Shared/urllib3/response.py @@ -69,9 +69,9 @@ def __getattr__(self, name): return getattr(self._obj, name) def decompress(self, data): - ret = b'' + ret = bytearray() if self._state == GzipDecoderState.SWALLOW_DATA or not data: - return ret + return bytes(ret) while True: try: ret += self._obj.decompress(data) @@ -81,11 +81,11 @@ def decompress(self, data): self._state = GzipDecoderState.SWALLOW_DATA if previous_state == GzipDecoderState.OTHER_MEMBERS: # Allow trailing garbage acceptable in other gzip clients - return ret + return bytes(ret) raise data = self._obj.unused_data if not data: - return ret + return bytes(ret) self._state = GzipDecoderState.OTHER_MEMBERS self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) diff --git a/Contents/Libraries/Shared/urllib3/util/retry.py b/Contents/Libraries/Shared/urllib3/util/retry.py index e7d0abd61..02429ee8e 100644 --- a/Contents/Libraries/Shared/urllib3/util/retry.py +++ b/Contents/Libraries/Shared/urllib3/util/retry.py @@ -179,7 +179,8 @@ def __init__(self, total=10, connect=None, read=None, redirect=None, status=None self.raise_on_status = raise_on_status self.history = history or tuple() self.respect_retry_after_header = respect_retry_after_header - self.remove_headers_on_redirect = remove_headers_on_redirect + self.remove_headers_on_redirect = frozenset([ + h.lower() for h in remove_headers_on_redirect]) def new(self, **kw): params = dict( diff --git a/Contents/Libraries/Shared/urllib3/util/ssl_.py b/Contents/Libraries/Shared/urllib3/util/ssl_.py index 24ee26d63..5ae435827 100644 --- a/Contents/Libraries/Shared/urllib3/util/ssl_.py +++ b/Contents/Libraries/Shared/urllib3/util/ssl_.py @@ -263,6 +263,8 @@ def create_urllib3_context(ssl_version=None, cert_reqs=None, """ context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + # Setting the default here, as we may have no ssl module on import cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs @@ -325,7 +327,10 @@ def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, if e.errno == errno.ENOENT: raise SSLError(e) raise - elif getattr(context, 'load_default_certs', None) is not None: + + # Don't load system certs unless there were no CA certs or + # SSLContext object specified manually. + elif ssl_context is None and hasattr(context, 'load_default_certs'): # try to load OS default certs; works well on Windows (require Python3.4+) context.load_default_certs() From 9147ed90b702f6a6576c8d377357c7d91e07ab77 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 20 Apr 2019 17:15:02 +0200 Subject: [PATCH 449/710] core: cf: update cfscrape to use proper user agents and headers; support brotli (if brotli is installed); support captcha solving in case of bad ip reputation for cf --- Contents/Info.plist | 4 +- .../Libraries/Shared/cfscrape/__init__.py | 128 +++++-- .../Libraries/Shared/cfscrape/browsers.json | 80 +++++ .../Shared/cfscrape/browsers_br.json | 336 ++++++++++++++++++ .../Libraries/Shared/subliminal_patch/http.py | 25 +- 5 files changed, 537 insertions(+), 36 deletions(-) create mode 100644 Contents/Libraries/Shared/cfscrape/browsers.json create mode 100644 Contents/Libraries/Shared/cfscrape/browsers_br.json diff --git a/Contents/Info.plist b/Contents/Info.plist index 1c26c82ef..e65af1673 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.2997 +Version 2.6.5.2997 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/Contents/Libraries/Shared/cfscrape/__init__.py b/Contents/Libraries/Shared/cfscrape/__init__.py index 0f3fd3f86..f21c3ec49 100644 --- a/Contents/Libraries/Shared/cfscrape/__init__.py +++ b/Contents/Libraries/Shared/cfscrape/__init__.py @@ -1,7 +1,10 @@ +# coding=utf-8 + import logging import random import re - +import os +import json import base64 from copy import deepcopy @@ -11,6 +14,7 @@ import js2py from requests.sessions import Session +from subliminal_patch.pitcher import pitchers try: from requests_toolbelt.utils import dump @@ -24,6 +28,15 @@ from urllib.parse import urlparse from urllib.parse import urlunparse +brotli_available = True + +try: + from brotli import decompress as brdec +except: + brotli_available = False + +logger = logging.getLogger(__name__) + __version__ = "2.0.3" # Orignally written by https://github.com/Anorov/cloudflare-scrape @@ -43,16 +56,46 @@ Cloudflare may have changed their technique, or there may be a bug in the script. """ + +cur_path = os.path.abspath(os.path.dirname(__file__)) + +if brotli_available: + brwsrs = os.path.join(cur_path, "browsers_br.json") + with open(brwsrs, "r") as f: + UA_COMBO = json.load(f, object_pairs_hook=OrderedDict)["chrome"] + +else: + brwsrs = os.path.join(cur_path, "browsers.json") + UA_COMBO = [] + with open(brwsrs, "r") as f: + _brwsrs = json.load(f, object_pairs_hook=OrderedDict) + for entry in _brwsrs: + _entry = OrderedDict(("-".join(a.capitalize() for a in key.split("-")), value) + for key, value in entry.iteritems()) + _entry["User-Agent"] = None + UA_COMBO.append({"User-Agent": [entry["user-agent"]], "headers": _entry}) + + +class NeedsCaptchaException(Exception): + pass + + class CloudflareScraper(Session): def __init__(self, *args, **kwargs): self.delay = kwargs.pop('delay', 8) self.debug = False + self._ua = None + self._hdrs = None super(CloudflareScraper, self).__init__(*args, **kwargs) if 'requests' in self.headers['User-Agent']: # Set a random User-Agent if no custom User-Agent has been set - self.headers['User-Agent'] = random.choice(DEFAULT_USER_AGENTS) + ua_combo = random.choice(UA_COMBO) + self._ua = random.choice(ua_combo["User-Agent"]) + self._hdrs = ua_combo["headers"].copy() + self._hdrs["User-Agent"] = self._ua + self.headers['User-Agent'] = self._ua def set_cloudflare_challenge_delay(self, delay): if isinstance(delay, (int, float)) and delay > 0: @@ -61,7 +104,7 @@ def set_cloudflare_challenge_delay(self, delay): def is_cloudflare_challenge(self, resp): if resp.headers.get('Server', '').startswith('cloudflare'): if b'why_captcha' in resp.content or b'/cdn-cgi/l/chk_captcha' in resp.content: - raise ValueError('Captcha') + raise NeedsCaptchaException return ( resp.status_code in [429, 503] @@ -77,34 +120,73 @@ def debugRequest(self, req): pass def request(self, method, url, *args, **kwargs): - self.headers = ( - OrderedDict( - [ - ('User-Agent', self.headers['User-Agent']), - ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), - ('Accept-Language', 'en-US,en;q=0.5'), - ('Accept-Encoding', 'gzip, deflate'), - ('Connection', 'close'), - ('Upgrade-Insecure-Requests', '1') - ] - ) - ) + # self.headers = ( + # OrderedDict( + # [ + # ('User-Agent', self.headers['User-Agent']), + # ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), + # ('Accept-Language', 'en-US,en;q=0.5'), + # ('Accept-Encoding', 'gzip, deflate'), + # ('Connection', 'close'), + # ('Upgrade-Insecure-Requests', '1') + # ] + # ) + # ) + self.headers = self._hdrs.copy() resp = super(CloudflareScraper, self).request(method, url, *args, **kwargs) + if resp.headers.get('content-encoding') == 'br' and brotli_available: + resp._content = brdec(resp._content) # Debug request if self.debug: self.debugRequest(resp) # Check if Cloudflare anti-bot is on - if self.is_cloudflare_challenge(resp): - # Work around if the initial request is not a GET, - # Superseed with a GET then re-request the orignal METHOD. - if resp.request.method != 'GET': - self.request('GET', resp.url) - resp = self.request(method, url, *args, **kwargs) - else: - resp = self.solve_cf_challenge(resp, **kwargs) + try: + if self.is_cloudflare_challenge(resp): + # Work around if the initial request is not a GET, + # Superseed with a GET then re-request the orignal METHOD. + if resp.request.method != 'GET': + self.request('GET', resp.url) + resp = self.request(method, url, *args, **kwargs) + else: + resp = self.solve_cf_challenge(resp, **kwargs) + except NeedsCaptchaException: + # solve the captcha + site_key = re.search(r'data-sitekey="(.+?)"', resp.content).group(1) + challenge_s = re.search(r'type="hidden" name="s" value="(.+?)"', resp.content).group(1) + challenge_ray = re.search(r'data-ray="(.+?)"', resp.content).group(1) + if not all([site_key, challenge_s, challenge_ray]): + raise Exception("cf: Captcha site-key not found!") + + pitcher = pitchers.get_pitcher()("cf", resp.request.url, site_key, + user_agent=self.headers["User-Agent"], + cookies=self.cookies.get_dict(), + is_invisible=True) + + logger.info("cf: Solving captcha") + result = pitcher.throw() + if not result: + raise Exception("cf: Couldn't solve captcha!") + + parsed_url = urlparse(resp.url) + domain = parsed_url.netloc + submit_url = '{}://{}/cdn-cgi/l/chk_captcha'.format(parsed_url.scheme, domain) + method = resp.request.method + + cloudflare_kwargs = { + 'allow_redirects': False, + 'headers': {'Referer': resp.url}, + 'params': OrderedDict( + [ + ('s', challenge_s), + ('g-recaptcha-response', result) + ] + ) + } + + return self.request(method, submit_url, **cloudflare_kwargs) return resp diff --git a/Contents/Libraries/Shared/cfscrape/browsers.json b/Contents/Libraries/Shared/cfscrape/browsers.json new file mode 100644 index 000000000..f1b7ad3c9 --- /dev/null +++ b/Contents/Libraries/Shared/cfscrape/browsers.json @@ -0,0 +1,80 @@ +[ + { + "connection": "close", + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "user-agent": "Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.102 Safari/537.36", + "accept-encoding": "gzip,deflate", + "accept-language": "en-US,en;q=0.8" + }, + { + "connection": "close", + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "user-agent": "Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.101 Safari/537.36", + "accept-encoding": "gzip,deflate", + "accept-language": "en-US,en;q=0.8" + }, + { + "connection": "close", + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "upgrade-insecure-requests": "1", + "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36", + "accept-language": "en-US,en;q=0.8", + "accept-encoding": "gzip, deflate, " + }, + { + "connection": "close", + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "upgrade-insecure-requests": "1", + "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36", + "accept-language": "en-US,en;q=0.8", + "accept-encoding": "gzip, deflate, " + }, + { + "connection": "close", + "accept": "*/*", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0" + }, + { + "connection": "close", + "accept": "image/jpeg, image/gif, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*", + "accept-language": "en-US", + "user-agent": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)", + "accept-encoding": "gzip, deflate" + }, + { + "connection": "close", + "accept": "text/html, application/xhtml+xml, */*", + "accept-language": "en-US", + "user-agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)", + "accept-encoding": "gzip, deflate" + }, + { + "connection": "close", + "accept": "text/html, application/xhtml+xml, */*", + "accept-language": "en-US", + "user-agent": "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)", + "accept-encoding": "gzip, deflate", + "dnt": "1" + }, + { + "connection": "close", + "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0", + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "accept-language": "en-US,en;q=0.5", + "accept-encoding": "gzip, deflate" + }, + { + "connection": "close", + "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0", + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "accept-language": "en-US,en;q=0.5", + "accept-encoding": "gzip, deflate" + }, + { + "connection": "close", + "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0", + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "accept-language": "en-US,en;q=0.5", + "accept-encoding": "gzip, deflate" + } +] \ No newline at end of file diff --git a/Contents/Libraries/Shared/cfscrape/browsers_br.json b/Contents/Libraries/Shared/cfscrape/browsers_br.json new file mode 100644 index 000000000..c3eab3155 --- /dev/null +++ b/Contents/Libraries/Shared/cfscrape/browsers_br.json @@ -0,0 +1,336 @@ +{ + "chrome": [ + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.8", + "Accept-Encoding": "gzip, deflate, , br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.8", + "Accept-Encoding": "gzip, deflate, br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Accept-Encoding": "gzip, deflate, br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "User-Agent": null, + "Upgrade-Insecure-Requests": "1", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Accept-Encoding": "gzip, deflate, br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.40 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.40 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", + "Accept-Language": "en-US,en;q=0.9", + "Accept-Encoding": "gzip, deflate, br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Linux; Android 8.1.0; SM-N960F Build/M1AJQ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 8.0.0; SM-G965F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 Build/OPD1.170816.010) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 8.0.0; Pixel Build/OPR6.170623.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.1.1; SM-A530F Build/NMF26X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.1; Pixel Build/NDE63H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.0; SM-G955F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.0; SM-G950F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.0; SM-T825 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", + "Mozilla/5.0 (Linux; Android 6.0.1; SM-G930F Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 6.0; Nexus 6 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 6.0; XT1092 Build/MPE24.49-18) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 6.0.1; SM-N910C Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 5.0.2; SM-G920F Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 5.0; Nexus 6 Build/LRX21O) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 9; Pixel 3 XL Build/PD1A.180720.030) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PD1A.180720.030) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 9; Pixel 2 Build/PPR1.180610.009) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/KRT16M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 4.4.2; SM-T530 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", + "Mozilla/5.0 (Linux; Android 4.4.4; SM-N910C Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 9 Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.1.1; SM-N950F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, br", + "Accept-Language": "en-US,en;q=0.9" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Linux; Android 8.1.0; SM-T835 Build/M1AJQ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", + "Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 5.0; XT1092 Build/LXE22.46-19) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, br", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8" + } + } + ] +} diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 8b247f90f..00de7249f 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -1,4 +1,6 @@ # coding=utf-8 +from collections import OrderedDict + import certifi import ssl import os @@ -67,17 +69,19 @@ def request(self, method, url, *args, **kwargs): parsed_url = urlparse(url) domain = parsed_url.netloc - cache_key = "cf_data_%s" % domain + cache_key = "cf_data2_%s" % domain if not self.cookies.get("__cfduid", "", domain=domain): cf_data = region.get(cache_key) if cf_data is not NO_VALUE: - cf_cookies, user_agent = cf_data + cf_cookies, user_agent, hdrs = cf_data logger.debug("Trying to use old cf data for %s: %s", domain, cf_data) for cookie, value in cf_cookies.iteritems(): self.cookies.set(cookie, value, domain=domain) - self.headers['User-Agent'] = user_agent + self._hdrs = hdrs + self._ua = user_agent + self.headers['User-Agent'] = self._ua ret = super(CFSession, self).request(method, url, *args, **kwargs) @@ -86,8 +90,7 @@ def request(self, method, url, *args, **kwargs): except: pass else: - if cf_data != region.get(cache_key) and self.cookies.get("__cfduid", "", domain=domain)\ - and self.cookies.get("cf_clearance", "", domain=domain): + if cf_data != region.get(cache_key) and cf_data[0]["__cfduid"] and cf_data[0]["cf_clearance"]: logger.debug("Storing cf data for %s: %s", domain, cf_data) region.set(cache_key, cf_data) @@ -103,15 +106,15 @@ def get_cf_live_tokens(self, domain): "Unable to find Cloudflare cookies. Does the site actually have " "Cloudflare IUAM (\"I'm Under Attack Mode\") enabled?") - return ({ - "__cfduid": self.cookies.get("__cfduid", "", domain=cookie_domain), - "cf_clearance": self.cookies.get("cf_clearance", "", domain=cookie_domain) - }, - self.headers["User-Agent"] + return (OrderedDict([ + ("__cfduid", self.cookies.get("__cfduid", "", domain=cookie_domain)), + ("cf_clearance", self.cookies.get("cf_clearance", "", domain=cookie_domain)) + ]), + self._ua, self._hdrs ) -class RetryingSession(CertifiSession, TimeoutSession): +class RetryingSession(CertifiSession): proxied_functions = ("get", "post") def __init__(self): From 2483a9c901a78ee8063098a3b2262ae4ea75da14 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 20 Apr 2019 17:15:41 +0200 Subject: [PATCH 450/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index e65af1673..51b84ea69 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.2997</string> + <string>2.6.5.3008</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.2997 DEV +Version 2.6.5.3008 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 216512788cd06872f03665d74b00ece1fa500c74 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 20 Apr 2019 17:19:17 +0200 Subject: [PATCH 451/710] core: add cfscrape to log --- Contents/Libraries/Shared/subzero/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/constants.py b/Contents/Libraries/Shared/subzero/constants.py index 43297b2a2..b89da8199 100755 --- a/Contents/Libraries/Shared/subzero/constants.py +++ b/Contents/Libraries/Shared/subzero/constants.py @@ -2,7 +2,7 @@ OS_PLEX_USERAGENT = 'plexapp.com v9.0' -DEPENDENCY_MODULE_NAMES = ['subliminal', 'subliminal_patch', 'enzyme', 'guessit', 'subzero', 'libfilebot'] +DEPENDENCY_MODULE_NAMES = ['subliminal', 'subliminal_patch', 'enzyme', 'guessit', 'subzero', 'libfilebot', 'cfscrape'] PERSONAL_MEDIA_IDENTIFIER = "com.plexapp.agents.none" PLUGIN_IDENTIFIER_SHORT = "subzero" PLUGIN_IDENTIFIER = "com.plexapp.agents.%s" % PLUGIN_IDENTIFIER_SHORT From ad9be91f453aaac4101090b5a2d4f2c0f654799a Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 20 Apr 2019 17:52:40 +0200 Subject: [PATCH 452/710] core: cfscrape: select user agent regardless --- Contents/Libraries/Shared/cfscrape/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/cfscrape/__init__.py b/Contents/Libraries/Shared/cfscrape/__init__.py index f21c3ec49..262cc9765 100644 --- a/Contents/Libraries/Shared/cfscrape/__init__.py +++ b/Contents/Libraries/Shared/cfscrape/__init__.py @@ -89,7 +89,7 @@ def __init__(self, *args, **kwargs): super(CloudflareScraper, self).__init__(*args, **kwargs) - if 'requests' in self.headers['User-Agent']: + if not self._ua: # Set a random User-Agent if no custom User-Agent has been set ua_combo = random.choice(UA_COMBO) self._ua = random.choice(ua_combo["User-Agent"]) From ae9aef98991798e311cd6e5c3686e825b6fbf600 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sat, 20 Apr 2019 19:09:54 +0200 Subject: [PATCH 453/710] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c8a130fd5..55c881080 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # Sub-Zero for Plex +# Attention: 2.6.4.2911 is still the latest official release! [![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle.svg?style=flat&label=stable)](https://github.com/pannal/Sub-Zero.bundle/releases/latest)<!--[![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle/all.svg?maxAge=2592000&label=testing+2.0+RC9)](https://github.com/pannal/Sub-Zero.bundle/releases)--> [![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)]() [![Maintenance](https://img.shields.io/maintenance/yes/2019.svg)]() [![Slack Status](https://szslack.fragstore.net/badge.svg)](https://szslack.fragstore.net) From a8daaa787a76d6e00bb6116d7fabfcc9bd71cfae Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sat, 20 Apr 2019 19:13:54 +0200 Subject: [PATCH 454/710] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 55c881080..f34be70a6 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.2997 +2.6.5.xxxx (in progress) - core: SRT parsing: handle (bad) ASS color tag in SRT - core: auto extract embedded: only use one unknown sub for first language - core: better embedded streams language detection From 3fe0500746e0c8ab3ce7193e6c812d45a7471f34 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 21 Apr 2019 03:03:27 +0200 Subject: [PATCH 455/710] providers: opensubtitles: catch specific exceptions when testing token --- .../Shared/subliminal_patch/providers/opensubtitles.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index 4ce3aacea..4138f06d2 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -173,7 +173,7 @@ def initialize(self): logger.info('Logging in') - token = region.get("os_token", expiration_time=3600) + token = region.get("os_token") if token is not NO_VALUE: try: logger.debug('Trying previous token: %r', token[:10]+"X"*(len(token)-10)) @@ -181,7 +181,7 @@ def initialize(self): self.token = token logger.debug("Using previous login token: %r", token[:10]+"X"*(len(token)-10)) return - except: + except (NoSession, Unauthorized): logger.debug('Token not valid.') pass From ce2296c95db73c712fd60187535105df62287029 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 21 Apr 2019 03:28:52 +0200 Subject: [PATCH 456/710] core: guess_matches: handle multiple title matches; fixes bazarr#403 --- .../subliminal_patch/providers/opensubtitles.py | 3 ++- .../Libraries/Shared/subliminal_patch/subtitle.py | 14 ++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index 4138f06d2..a314087c2 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -12,10 +12,11 @@ from subliminal.exceptions import ConfigurationError, ServiceUnavailable from subliminal.providers.opensubtitles import OpenSubtitlesProvider as _OpenSubtitlesProvider,\ OpenSubtitlesSubtitle as _OpenSubtitlesSubtitle, Episode, Movie, ServerProxy, Unauthorized, NoSession, \ - DownloadLimitReached, InvalidImdbid, UnknownUserAgent, DisabledUserAgent, OpenSubtitlesError, sanitize + DownloadLimitReached, InvalidImdbid, UnknownUserAgent, DisabledUserAgent, OpenSubtitlesError from mixins import ProviderRetryMixin from subliminal.subtitle import fix_line_ending from subliminal_patch.http import SubZeroRequestsTransport +from subliminal_patch.utils import sanitize from subliminal.cache import region from subliminal_patch.score import framerate_equal from subzero.language import Language diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 69a3c1e5b..a4254261c 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -16,7 +16,8 @@ from pysubs2.time import ms_to_times from subzero.modification import SubtitleModifications from subliminal import Subtitle as Subtitle_ -from subliminal.subtitle import Episode, Movie, sanitize_release_group, sanitize, get_equivalent_release_groups +from subliminal.subtitle import Episode, Movie, sanitize_release_group, get_equivalent_release_groups +from subliminal_patch.utils import sanitize from ftfy import fix_text logger = logging.getLogger(__name__) @@ -358,9 +359,14 @@ def guess_matches(video, guess, partial=False): matches = set() if isinstance(video, Episode): # series - if video.series and 'title' in guess and sanitize(guess['title']) in ( - sanitize(name) for name in [video.series] + video.alternative_series): - matches.add('series') + titles = guess["title"] + if not isinstance(titles, types.ListType): + titles = [titles] + + if video.series and 'title' in guess: + for title in titles: + if sanitize(title) in (sanitize(name) for name in [video.series] + video.alternative_series): + matches.add('series') # title if video.title and 'episode_title' in guess and sanitize(guess['episode_title']) == sanitize(video.title): matches.add('title') From 72eeb7eb35a85f8a8320bbe26b355373f079bd17 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 21 Apr 2019 03:40:06 +0200 Subject: [PATCH 457/710] bump year --- Contents/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 51b84ea69..1ff7c5df1 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -46,7 +46,7 @@ Github: <a href="https://github.com/pannal/Sub-Zero.bundle">http 3rd party licenses: <a href="https://github.com/pannal/Sub-Zero.bundle/tree/master/Licenses">https://github.com/pannal/Sub-Zero.bundle/tree/master/Licenses</a> -panni, 2018 +panni, 2019 </div> </string> </dict> From b4cc35b10957a8069e883a78b2e0ed76c2334827 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 21 Apr 2019 03:44:39 +0200 Subject: [PATCH 458/710] release 2.6.5.3017 --- Contents/Info.plist | 6 +++--- README.md | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 1ff7c5df1..f2a0d1f0b 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3008</string> + <string>2.6.5.3017</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3008 DEV +Version 2.6.5.3017 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index f34be70a6..8f1b66a2b 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,11 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.xxxx (in progress) +2.6.5.3017 +subscene, addic7ed and titlovi +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service (anti-captcha.com or deathbycaptcha.com), add funds, then supply your credentials/apikey in the configuration + +Changelog - core: SRT parsing: handle (bad) ASS color tag in SRT - core: auto extract embedded: only use one unknown sub for first language - core: better embedded streams language detection @@ -103,6 +107,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe - core: scan_video: add series/title as alternative by scanning filename itself without parent folders - core: add generic solution for solving captchas using anti captcha services - core: increase cache time to 180d (was: 30d) +- core: guess_matches: handle multiple title matches; fixes bazarr#403 - windows: fix compatibility issues with plex transcoder - compat: use lowercase paths on subtitle detection - providers: addic7ed: re-enable (using paid anti captch service) From a0a3c39606f1316ce0db69f88b27d8764f833afd Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sun, 21 Apr 2019 03:44:58 +0200 Subject: [PATCH 459/710] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 8f1b66a2b..391792fa2 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ # Sub-Zero for Plex -# Attention: 2.6.4.2911 is still the latest official release! [![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle.svg?style=flat&label=stable)](https://github.com/pannal/Sub-Zero.bundle/releases/latest)<!--[![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle/all.svg?maxAge=2592000&label=testing+2.0+RC9)](https://github.com/pannal/Sub-Zero.bundle/releases)--> [![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)]() [![Maintenance](https://img.shields.io/maintenance/yes/2019.svg)]() [![Slack Status](https://szslack.fragstore.net/badge.svg)](https://szslack.fragstore.net) From 5cc4dcf10b8e674437b04c1d568facb2b70a0f93 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 21 Apr 2019 03:45:38 +0200 Subject: [PATCH 460/710] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 391792fa2..9f4e19998 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog 2.6.5.3017 + subscene, addic7ed and titlovi - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service (anti-captcha.com or deathbycaptcha.com), add funds, then supply your credentials/apikey in the configuration From 96bdf606e2731cf53b752ca1e2646b57176d9f2c Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 21 Apr 2019 03:46:25 +0200 Subject: [PATCH 461/710] back to dev --- Contents/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index f2a0d1f0b..26bad16e3 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> From 237a47b8ed4281c51a4da3aa188f0060295ea87f Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sun, 21 Apr 2019 03:48:37 +0200 Subject: [PATCH 462/710] Update Info.plist --- Contents/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index f2a0d1f0b..f40106a7e 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3017 DEV +Version 2.6.5.3017 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 8ac6c9d7a7f1e361e162b818079b5ff90e6ae29a Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Mon, 22 Apr 2019 05:31:29 +0200 Subject: [PATCH 463/710] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9f4e19998..66d8144e6 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ Check out **[the Sub-Zero Wiki](https://github.com/pannal/Sub-Zero.bundle/wiki)* If you like this, buy me a beer: <br>[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G9VKR2B8PMNKG) <br>or become a Patreon starting at **1 $ / month** <br><a href="https://www.patreon.com/subzero_plex" target="_blank"><img src="http://www.wenspencer.com/wp-content/uploads/2017/02/patreon-button.png" height="42" /></a> <br>or use the OpenSubtitles Sub-Zero affiliate link to become VIP <br>**10€/year, ad-free subs, 1000 subs/day, no-cache *VIP* server**<br><a href="http://v.ht/osvip" target="_blank"><img src="https://static.opensubtitles.org/gfx/logo.gif" height="50" /></a> +If you register with an anti-captcha service and you decide to use [Anti-Captcha.com](http://getcaptchasolution.com/kkvviom7nh), you can use [this affiliate link](http://getcaptchasolution.com/kkvviom7nh) to help development. + ## Introduction #### What's Sub-Zero? Sub-Zero is a metadata agent and interface-plugin at the same time, for the popular Plex Media Server environment. From 14f2f45f20dee3ce5b60fba32adf4dc8941ea4a0 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Mon, 22 Apr 2019 05:37:47 +0200 Subject: [PATCH 464/710] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 66d8144e6..8739ea4ba 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ Check out **[the Sub-Zero Wiki](https://github.com/pannal/Sub-Zero.bundle/wiki)* --- +## Helping development + If you like this, buy me a beer: <br>[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G9VKR2B8PMNKG) <br>or become a Patreon starting at **1 $ / month** <br><a href="https://www.patreon.com/subzero_plex" target="_blank"><img src="http://www.wenspencer.com/wp-content/uploads/2017/02/patreon-button.png" height="42" /></a> <br>or use the OpenSubtitles Sub-Zero affiliate link to become VIP <br>**10€/year, ad-free subs, 1000 subs/day, no-cache *VIP* server**<br><a href="http://v.ht/osvip" target="_blank"><img src="https://static.opensubtitles.org/gfx/logo.gif" height="50" /></a> If you register with an anti-captcha service and you decide to use [Anti-Captcha.com](http://getcaptchasolution.com/kkvviom7nh), you can use [this affiliate link](http://getcaptchasolution.com/kkvviom7nh) to help development. From 6204572ddc02a09feb9a4715436c1a68738b8c11 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 26 Apr 2019 15:32:59 +0200 Subject: [PATCH 465/710] core: only reference guessed title if there actually is one --- Contents/Libraries/Shared/subliminal_patch/subtitle.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index a4254261c..daa922359 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -359,11 +359,11 @@ def guess_matches(video, guess, partial=False): matches = set() if isinstance(video, Episode): # series - titles = guess["title"] - if not isinstance(titles, types.ListType): - titles = [titles] - if video.series and 'title' in guess: + titles = guess["title"] + if not isinstance(titles, types.ListType): + titles = [titles] + for title in titles: if sanitize(title) in (sanitize(name) for name in [video.series] + video.alternative_series): matches.add('series') From eeaeb80f0fbce8feb7c55cacc220cbba99ede340 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 27 Apr 2019 06:36:45 +0200 Subject: [PATCH 466/710] core/compat: dns: support nameservers via ENV[dns_resolvers]; don't fall back to default DNS when configured custom DNS failed --- Contents/Code/support/config.py | 16 +++-- Contents/DefaultPrefs.json | 8 +-- .../Libraries/Shared/subliminal_patch/http.py | 70 +++++++++++++------ 3 files changed, 65 insertions(+), 29 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 66e8e654c..2e8df7cc2 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -1,5 +1,6 @@ # coding=utf-8 import copy +import json import os import re import inspect @@ -147,7 +148,7 @@ class Config(object): ietf_as_alpha3 = False unrar = None adv_cfg_path = None - use_custom_dns = False + use_custom_dns = None anticaptcha_token = None anticaptcha_cls = None has_anticaptcha = False @@ -235,7 +236,7 @@ def initialize(self): self.only_one = cast_bool(Prefs['subtitles.only_one']) self.embedded_auto_extract = cast_bool(Prefs["subtitles.embedded.autoextract"]) self.ietf_as_alpha3 = cast_bool(Prefs["subtitles.language.ietf_normalize"]) - self.use_custom_dns = cast_bool(Prefs['use_custom_dns']) + self.use_custom_dns = self.parse_custom_dns() self.initialized = True def migrate_prefs(self): @@ -1078,6 +1079,14 @@ def parse_rename_mode(self): def text_based_formats(self): return self.advanced.text_subtitle_formats or TEXT_SUBTITLE_EXTS + def parse_custom_dns(self): + custom_dns = Prefs['use_custom_dns2'].strip() + if custom_dns: + ips = filter(lambda x: x, [d.strip() for d in custom_dns.split(",")]) + if ips: + os.environ["dns_resolvers"] = json.dumps(ips) + return os.environ["dns_resolvers"] + def init_subliminal_patches(self): # configure custom subtitle destination folders for scanning pre-existing subs Log.Debug("Patching subliminal ...") @@ -1088,9 +1097,6 @@ def init_subliminal_patches(self): subliminal_patch.core.DOWNLOAD_TRIES = int(Prefs['subtitles.try_downloads']) subliminal.score.episode_scores["addic7ed_boost"] = int(Prefs['provider.addic7ed.boost_by2']) - if self.use_custom_dns: - subliminal_patch.http.set_custom_resolver() - config = Config() config.initialize() diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 27e70f5cf..1a8e9810e 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -847,10 +847,10 @@ "default": "15" }, { - "id": "use_custom_dns", - "label": "Use Google DNS (for \"problematic\" countries)", - "type": "bool", - "default": "false" + "id": "use_custom_dns2", + "label": "Use custom DNS (IPs, comma-separated, leave empty for default DNS. Default: Google/CF)", + "type": "text", + "default": "1.1.1.1, 8.8.8.8" }, { "id": "proxy", diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 00de7249f..5c4dd686d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -1,4 +1,5 @@ # coding=utf-8 +import json from collections import OrderedDict import certifi @@ -34,12 +35,6 @@ default_ssl_context = None -custom_resolver = dns.resolver.Resolver(configure=False) - -# 8.8.8.8 is Google's public DNS server -custom_resolver.nameservers = ['8.8.8.8', '1.1.1.1'] - - class TimeoutSession(requests.Session): timeout = 10 @@ -226,25 +221,60 @@ def _build_url(self, host, handler): dns_cache = {} -def set_custom_resolver(): +_custom_resolver = None +_custom_resolver_ips = None + + +def patch_create_connection(): + if hasattr(connection.create_connection, "_sz_patched"): + return + def patched_create_connection(address, *args, **kwargs): """Wrap urllib3's create_connection to resolve the name elsewhere""" # resolve hostname to an ip address; use your own # resolver here, as otherwise the system resolver will be used. + global _custom_resolver, _custom_resolver_ips, dns_cache host, port = address - if host in dns_cache: - ip = dns_cache[host] - logger.debug("Using %s=%s from cache", host, ip) - else: - try: - ip = custom_resolver.query(host)[0].address - dns_cache[host] = ip - except dns.exception.DNSException: - logger.warning("Couldn't resolve %s with DNS: %s", host, custom_resolver.nameservers) - return _orig_create_connection((host, port), *args, **kwargs) - logger.debug("Resolved %s to %s using %s", host, ip, custom_resolver.nameservers) + __custom_resolver_ips = os.environ.get("dns_resolvers", None) + + # resolver ips changed in the meantime? + if __custom_resolver_ips != _custom_resolver_ips: + _custom_resolver = None + _custom_resolver_ips = __custom_resolver_ips + dns_cache = {} + + custom_resolver = _custom_resolver + + if not custom_resolver: + if _custom_resolver_ips: + logger.debug("DNS: Trying to use custom DNS resolvers: %s", _custom_resolver_ips) + try: + custom_resolver = dns.resolver.Resolver(configure=False) + custom_resolver.lifetime = 8.0 + custom_resolver.nameservers = json.loads(_custom_resolver_ips) + _custom_resolver = custom_resolver + except: + logger.debug("DNS: Couldn't load custom DNS resolvers: %s", _custom_resolver_ips) + + if custom_resolver: + if host in dns_cache: + ip = dns_cache[host] + logger.debug("DNS: Using %s=%s from cache", host, ip) + else: + try: + ip = custom_resolver.query(host)[0].address + logger.debug("DNS: Resolved %s to %s using %s", host, ip, custom_resolver.nameservers) + dns_cache[host] = ip + except dns.exception.DNSException: + logger.warning("DNS: Couldn't resolve %s with DNS: %s", host, custom_resolver.nameservers) + raise + + return _orig_create_connection((host, port), *args, **kwargs) + + patch_create_connection._sz_patched = True + connection.create_connection = patched_create_connection - return _orig_create_connection((ip, port), *args, **kwargs) - connection.create_connection = patched_create_connection +patch_create_connection() + From 92edfc7312e7535c103a9c44def2bc961914d561 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 27 Apr 2019 06:37:43 +0200 Subject: [PATCH 467/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 26bad16e3..30797a425 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3017</string> + <string>2.6.5.3023</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3017 DEV +Version 2.6.5.3023 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 10c8b8ceff330a0ad2e84fdb9c165624f7e25515 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 27 Apr 2019 06:43:46 +0200 Subject: [PATCH 468/710] core: dns: be a tad smarter --- Contents/Libraries/Shared/subliminal_patch/http.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 5c4dd686d..13129f580 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -249,13 +249,14 @@ def patched_create_connection(address, *args, **kwargs): if not custom_resolver: if _custom_resolver_ips: logger.debug("DNS: Trying to use custom DNS resolvers: %s", _custom_resolver_ips) + custom_resolver = dns.resolver.Resolver(configure=False) + custom_resolver.lifetime = 8.0 try: - custom_resolver = dns.resolver.Resolver(configure=False) - custom_resolver.lifetime = 8.0 custom_resolver.nameservers = json.loads(_custom_resolver_ips) - _custom_resolver = custom_resolver except: logger.debug("DNS: Couldn't load custom DNS resolvers: %s", _custom_resolver_ips) + else: + _custom_resolver = custom_resolver if custom_resolver: if host in dns_cache: From d2a665624a2fd7391d390d2747cd64ba8a19741e Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 28 Apr 2019 03:10:33 +0200 Subject: [PATCH 469/710] core/config: add setting for one existing language to be enough, fixes #491 --- Contents/Code/support/config.py | 2 ++ Contents/Code/support/download.py | 16 ++++++++++++++++ Contents/DefaultPrefs.json | 15 ++++++++++++++- Contents/Strings/de.json | 2 +- Contents/Strings/en.json | 8 +++++++- 5 files changed, 40 insertions(+), 3 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 2e8df7cc2..fc9d16584 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -144,6 +144,7 @@ class Config(object): refiner_settings = None exact_filenames = False only_one = False + any_language_is_enough = False embedded_auto_extract = False ietf_as_alpha3 = False unrar = None @@ -234,6 +235,7 @@ def initialize(self): self.no_refresh = os.environ.get("SZ_NO_REFRESH", False) self.plex_transcoder = self.get_plex_transcoder() self.only_one = cast_bool(Prefs['subtitles.only_one']) + self.any_language_is_enough = Prefs['subtitles.any_language_is_enough'] self.embedded_auto_extract = cast_bool(Prefs["subtitles.embedded.autoextract"]) self.ietf_as_alpha3 = cast_bool(Prefs["subtitles.language.ietf_normalize"]) self.use_custom_dns = self.parse_custom_dns() diff --git a/Contents/Code/support/download.py b/Contents/Code/support/download.py index 4ba1de696..0cd974ed9 100644 --- a/Contents/Code/support/download.py +++ b/Contents/Code/support/download.py @@ -46,6 +46,22 @@ def get_missing_languages(video, part): missing_languages = (languages - have_languages) + if config.any_language_is_enough != "Always search for all configured languages": + not_in_forced = "foreign" in config.any_language_is_enough + if "External or embedded subtitle" in config.any_language_is_enough: + langs = video.subtitle_languages if not not_in_forced else \ + filter(lambda l: not l.forced, video.subtitle_languages) + if langs: + Log.Debug("We have at least one subtitle for any configured language.") + return False + + elif "External subtitle" in config.any_language_is_enough: + langs = video.subtitle_languages if not not_in_forced else \ + filter(lambda l: not l.forced, video.external_subtitle_languages) + if langs: + Log.Debug("We have at least one external subtitle for any configured language.") + return False + # all languages are found if we either really have subs for all languages or we only want to have exactly one language # and we've only found one (the case for a selected language, Prefs['subtitles.only_one'] (one found sub matches any language)) found_one_which_is_enough = len(video.subtitle_languages) >= 1 and Prefs['subtitles.only_one'] diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 1a8e9810e..a8f749ac1 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -205,6 +205,19 @@ ], "default": "Never" }, + { + "id": "subtitles.any_language_is_enough", + "label": "Don't search for subtitles if a subtitle in any configured language exists as", + "type": "enum", + "values": [ + "External or embedded subtitle", + "External or embedded subtitle (not foreign/forced)", + "External subtitle", + "External subtitle (not foreign/forced)", + "Always search for all configured languages" + ], + "default": "Always search for all configured languages" + }, { "id": "subtitles.language.ietf_display", "label": "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", @@ -848,7 +861,7 @@ }, { "id": "use_custom_dns2", - "label": "Use custom DNS (IPs, comma-separated, leave empty for default DNS. Default: Google/CF)", + "label": "Use custom DNS (IPs, comma-separated, leave empty for system DNS. Default: Google/CF)", "type": "text", "default": "1.1.1.1, 8.8.8.8" }, diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 8af2c20bc..b3f639372 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -438,5 +438,5 @@ "auto-better": "auto-besser", "Unknown": "Unbekannt", "embedded": "eingebettet", - "Use Google DNS (for \"problematic\" countries)": "Google DNS benutzen (für \"problematische\" Länder)" + "Use custom DNS (IPs, comma-separated, leave empty for system DNS. Default: Google/CF)": "Benutzerdefinierten DNS benutzen (IPs, Komma-Separiert, leer lassen für System-DNS. Default: Google/CF)" } \ No newline at end of file diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json index 620200159..da75365db 100644 --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -438,5 +438,11 @@ "auto-better": "auto-better", "Unknown": "Unknown", "embedded": "embedded", - "Use Google DNS (for \"problematic\" countries)": "Use Google DNS (for \"problematic\" countries)" + "Use custom DNS (IPs, comma-separated, leave empty for default DNS. Default: Google/CF)": "Use custom DNS (IPs, comma-separated, leave empty for default DNS. Default: Google/CF)", + "Don't search for subtitles if a subtitle in any configured language exists as": "Don't search for subtitles if a subtitle in any configured language exists as", + "External or embedded subtitle": "External or embedded subtitle", + "External or embedded subtitle (not foreign/forced)": "External or embedded subtitle (not foreign/forced)", + "External subtitle": "External subtitle", + "External subtitle (not foreign/forced)": "External subtitle (not foreign/forced)", + "Always search for all configured languages": "Always search for all configured languages" } \ No newline at end of file From b692ebde6fbbf931a0e7295827d28ab76b491f6f Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sun, 28 Apr 2019 03:20:52 +0200 Subject: [PATCH 470/710] Update de.json (POEditor.com) --- Contents/Strings/de.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index b3f639372..f8c27aeb3 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -438,5 +438,12 @@ "auto-better": "auto-besser", "Unknown": "Unbekannt", "embedded": "eingebettet", - "Use custom DNS (IPs, comma-separated, leave empty for system DNS. Default: Google/CF)": "Benutzerdefinierten DNS benutzen (IPs, Komma-Separiert, leer lassen für System-DNS. Default: Google/CF)" + "Use Google DNS (for \"problematic\" countries)": "Google DNS benutzen (für \"problematische\" Länder)", + "Use custom DNS (IPs, comma-separated, leave empty for default DNS. Default: Google/CF)": "Benutzerdefinierten DNS benutzen (IPs, Komma-Separiert, leer lassen für System-DNS. Default: Google/CF)", + "Don't search for subtitles if a subtitle in any configured language exists as": "Nicht nach Untertiteln suchen, wenn wenigstens ein Untertitel in einer konfigurierten Sprache gefunden wurde", + "External or embedded subtitle": "Externe oder eingebettete Untertitel", + "External or embedded subtitle (not foreign/forced)": "Externe oder eingebettete Untertitel (keine erzwungenden/fremdsprachigen)", + "External subtitle": "Externe Untertitel", + "External subtitle (not foreign/forced)": "Externe Untertitel (keine erzwungenden/fremdsprachigen)", + "Always search for all configured languages": "Immer nach allen konfigurierten Untertiteln suchen" } \ No newline at end of file From 3bc646187f7a5e1fad2b881592f220f3cee78ae0 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sun, 28 Apr 2019 03:21:46 +0200 Subject: [PATCH 471/710] Update de.json (POEditor.com) --- Contents/Strings/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index f8c27aeb3..86cf5b9d2 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -445,5 +445,5 @@ "External or embedded subtitle (not foreign/forced)": "Externe oder eingebettete Untertitel (keine erzwungenden/fremdsprachigen)", "External subtitle": "Externe Untertitel", "External subtitle (not foreign/forced)": "Externe Untertitel (keine erzwungenden/fremdsprachigen)", - "Always search for all configured languages": "Immer nach allen konfigurierten Untertiteln suchen" + "Always search for all configured languages": "Immer nach allen konfigurierten Sprachen suchen" } \ No newline at end of file From f48c0799c0797bef76f30c1c911ea62c8ae0b9af Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 28 Apr 2019 03:28:44 +0200 Subject: [PATCH 472/710] i128n: remove obsolete trans --- Contents/Strings/de.json | 1 - 1 file changed, 1 deletion(-) diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json index 86cf5b9d2..a477872d9 100644 --- a/Contents/Strings/de.json +++ b/Contents/Strings/de.json @@ -438,7 +438,6 @@ "auto-better": "auto-besser", "Unknown": "Unbekannt", "embedded": "eingebettet", - "Use Google DNS (for \"problematic\" countries)": "Google DNS benutzen (für \"problematische\" Länder)", "Use custom DNS (IPs, comma-separated, leave empty for default DNS. Default: Google/CF)": "Benutzerdefinierten DNS benutzen (IPs, Komma-Separiert, leer lassen für System-DNS. Default: Google/CF)", "Don't search for subtitles if a subtitle in any configured language exists as": "Nicht nach Untertiteln suchen, wenn wenigstens ein Untertitel in einer konfigurierten Sprache gefunden wurde", "External or embedded subtitle": "Externe oder eingebettete Untertitel", From 70674fbce7164aec4f3d14f9fab5ab3f3a179da3 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 28 Apr 2019 03:30:35 +0200 Subject: [PATCH 473/710] i128n: remove obsolete trans --- Contents/Strings/da.json | 1 - Contents/Strings/es.json | 3 +-- Contents/Strings/hu.json | 3 +-- Contents/Strings/nl.json | 3 +-- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/Contents/Strings/da.json b/Contents/Strings/da.json index ad6fbcb40..61d4b3b34 100644 --- a/Contents/Strings/da.json +++ b/Contents/Strings/da.json @@ -438,5 +438,4 @@ "auto-better": "Auto-bedre", "Unknown": "Ukendt", "embedded": "Indlejret", - "Use Google DNS (for \"problematic\" countries)": "Benyt Google DNS (For lande med restriktive DNS servere)" } \ No newline at end of file diff --git a/Contents/Strings/es.json b/Contents/Strings/es.json index 6fb547bdb..108aa105f 100644 --- a/Contents/Strings/es.json +++ b/Contents/Strings/es.json @@ -437,6 +437,5 @@ "manual": "manual", "auto-better": "auto-mejorar", "Unknown": "Desconocido", - "embedded": "Integrado", - "Use Google DNS (for \"problematic\" countries)": "Usar DNS de Google (para países problemáticos)" + "embedded": "Integrado" } \ No newline at end of file diff --git a/Contents/Strings/hu.json b/Contents/Strings/hu.json index 6d2809787..b5f246eb7 100644 --- a/Contents/Strings/hu.json +++ b/Contents/Strings/hu.json @@ -437,6 +437,5 @@ "manual": "", "auto-better": "", "Unknown": "", - "embedded": "", - "Use Google DNS (for \"problematic\" countries)": "" + "embedded": "" } \ No newline at end of file diff --git a/Contents/Strings/nl.json b/Contents/Strings/nl.json index 3a0d8e808..12da134bc 100644 --- a/Contents/Strings/nl.json +++ b/Contents/Strings/nl.json @@ -437,6 +437,5 @@ "manual": "handmatig", "auto-better": "automatisch-verbeter", "Unknown": "Onbekend", - "embedded": "geëmbedde", - "Use Google DNS (for \"problematic\" countries)": "Gebruik Google DNS (voor \"probleematische\" landen)" + "embedded": "geëmbedde" } \ No newline at end of file From 5b3d9f26be5009b6a2eb85d9cd40775996502d24 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sun, 28 Apr 2019 03:47:55 +0200 Subject: [PATCH 474/710] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8739ea4ba..fa8ebc130 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe 2.6.5.3017 subscene, addic7ed and titlovi -- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service (anti-captcha.com or deathbycaptcha.com), add funds, then supply your credentials/apikey in the configuration +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog - core: SRT parsing: handle (bad) ASS color tag in SRT From 643485b87998193e41bc20d88d98007b57bcabf3 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 28 Apr 2019 04:43:03 +0200 Subject: [PATCH 475/710] core: cf: optimize providers: titlovi: optimize cf/captcha handling --- .../Libraries/Shared/cfscrape/__init__.py | 9 +++-- .../Libraries/Shared/subliminal_patch/http.py | 25 +++++++----- .../subliminal_patch/providers/titlovi.py | 40 ++----------------- 3 files changed, 24 insertions(+), 50 deletions(-) diff --git a/Contents/Libraries/Shared/cfscrape/__init__.py b/Contents/Libraries/Shared/cfscrape/__init__.py index 262cc9765..c31bb377b 100644 --- a/Contents/Libraries/Shared/cfscrape/__init__.py +++ b/Contents/Libraries/Shared/cfscrape/__init__.py @@ -84,6 +84,7 @@ class CloudflareScraper(Session): def __init__(self, *args, **kwargs): self.delay = kwargs.pop('delay', 8) self.debug = False + self._was_cf = False self._ua = None self._hdrs = None @@ -145,6 +146,7 @@ def request(self, method, url, *args, **kwargs): # Check if Cloudflare anti-bot is on try: if self.is_cloudflare_challenge(resp): + self._was_cf = True # Work around if the initial request is not a GET, # Superseed with a GET then re-request the orignal METHOD. if resp.request.method != 'GET': @@ -154,6 +156,7 @@ def request(self, method, url, *args, **kwargs): resp = self.solve_cf_challenge(resp, **kwargs) except NeedsCaptchaException: # solve the captcha + self._was_cf = True site_key = re.search(r'data-sitekey="(.+?)"', resp.content).group(1) challenge_s = re.search(r'type="hidden" name="s" value="(.+?)"', resp.content).group(1) challenge_ray = re.search(r'data-ray="(.+?)"', resp.content).group(1) @@ -165,13 +168,13 @@ def request(self, method, url, *args, **kwargs): cookies=self.cookies.get_dict(), is_invisible=True) - logger.info("cf: Solving captcha") + parsed_url = urlparse(resp.url) + domain = parsed_url.netloc + logger.info("cf: %s: Solving captcha", domain) result = pitcher.throw() if not result: raise Exception("cf: Couldn't solve captcha!") - parsed_url = urlparse(resp.url) - domain = parsed_url.netloc submit_url = '{}://{}/cdn-cgi/l/chk_captcha'.format(parsed_url.scheme, domain) method = resp.request.method diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 13129f580..2bf0d0f75 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -58,7 +58,7 @@ def __init__(self): class CFSession(CloudflareScraper): def __init__(self): super(CFSession, self).__init__() - self.debug = os.environ.get("CF_DEBUG", False) + self.debug = True or os.environ.get("CF_DEBUG", False) def request(self, method, url, *args, **kwargs): parsed_url = urlparse(url) @@ -66,7 +66,7 @@ def request(self, method, url, *args, **kwargs): cache_key = "cf_data2_%s" % domain - if not self.cookies.get("__cfduid", "", domain=domain): + if not self.cookies.get("cf_clearance", "", domain=domain): cf_data = region.get(cache_key) if cf_data is not NO_VALUE: cf_cookies, user_agent, hdrs = cf_data @@ -80,14 +80,18 @@ def request(self, method, url, *args, **kwargs): ret = super(CFSession, self).request(method, url, *args, **kwargs) - try: - cf_data = self.get_cf_live_tokens(domain) - except: - pass - else: - if cf_data != region.get(cache_key) and cf_data[0]["__cfduid"] and cf_data[0]["cf_clearance"]: - logger.debug("Storing cf data for %s: %s", domain, cf_data) - region.set(cache_key, cf_data) + if self._was_cf: + self._was_cf = False + logger.debug("We've hit CF, trying to store previous data") + try: + cf_data = self.get_cf_live_tokens(domain) + except: + logger.debug("Couldn't get CF live tokens for re-use. Cookies: %r", self.cookies) + pass + else: + if cf_data != region.get(cache_key) and cf_data[0]["cf_clearance"]: + logger.debug("Storing cf data for %s: %s", domain, cf_data) + region.set(cache_key, cf_data) return ret @@ -262,6 +266,7 @@ def patched_create_connection(address, *args, **kwargs): if host in dns_cache: ip = dns_cache[host] logger.debug("DNS: Using %s=%s from cache", host, ip) + return _orig_create_connection((ip, port), *args, **kwargs) else: try: ip = custom_resolver.query(host)[0].address diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index b58c9fe29..b076680e9 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -140,7 +140,7 @@ class TitloviProvider(Provider, ProviderSubtitleArchiveMixin): def initialize(self): self.session = RetryingCFSession() - load_verification("titlovi", self.session) + #load_verification("titlovi", self.session) def terminate(self): self.session.close() @@ -181,42 +181,8 @@ def query(self, languages, title, season=None, episode=None, year=None, video=No r = self.session.get(self.search_url, params=params, timeout=10) r.raise_for_status() except RequestException as e: - captcha_passed = False - if e.response.status_code == 403 and "data-sitekey" in e.response.content: - logger.info('titlovi: Solving captcha. This might take a couple of minutes, but should only ' - 'happen once every so often') - - site_key = re.search(r'data-sitekey="(.+?)"', e.response.content).group(1) - challenge_s = re.search(r'type="hidden" name="s" value="(.+?)"', e.response.content).group(1) - challenge_ray = re.search(r'data-ray="(.+?)"', e.response.content).group(1) - if not all([site_key, challenge_s, challenge_ray]): - raise Exception("titlovi: Captcha site-key not found!") - - pitcher = pitchers.get_pitcher()("titlovi", e.request.url, site_key, - user_agent=self.session.headers["User-Agent"], - cookies=self.session.cookies.get_dict(), - is_invisible=True) - - result = pitcher.throw() - if not result: - raise Exception("titlovi: Couldn't solve captcha!") - - s_params = { - "s": challenge_s, - "id": challenge_ray, - "g-recaptcha-response": result, - } - r = self.session.get(self.server_url + "/cdn-cgi/l/chk_captcha", params=s_params, timeout=10, - allow_redirects=False) - r.raise_for_status() - r = self.session.get(self.search_url, params=params, timeout=10) - r.raise_for_status() - store_verification("titlovi", self.session) - captcha_passed = True - - if not captcha_passed: - logger.exception('RequestException %s', e) - break + logger.exception('RequestException %s', e) + break else: try: soup = BeautifulSoup(r.content, 'lxml') From 1ce14aa231be7ad0aeb557ff58a93c12e05d6432 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 28 Apr 2019 04:44:27 +0200 Subject: [PATCH 476/710] core: http: remove debug --- Contents/Libraries/Shared/subliminal_patch/http.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 2bf0d0f75..4d674e599 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -58,7 +58,7 @@ def __init__(self): class CFSession(CloudflareScraper): def __init__(self): super(CFSession, self).__init__() - self.debug = True or os.environ.get("CF_DEBUG", False) + self.debug = os.environ.get("CF_DEBUG", False) def request(self, method, url, *args, **kwargs): parsed_url = urlparse(url) From 8c72cf9057a497a116be2507b3c8d3469ec6d660 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 28 Apr 2019 04:45:17 +0200 Subject: [PATCH 477/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 30797a425..4ebc6bcf9 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3023</string> + <string>2.6.5.3032</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3023 DEV +Version 2.6.5.3032 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From ccf5a902e5c0fae9b2616c049aed029708ddf84b Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 28 Apr 2019 05:03:04 +0200 Subject: [PATCH 478/710] core: cf: only store cookie if it had a value --- Contents/Libraries/Shared/subliminal_patch/http.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 4d674e599..a7292ff52 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -105,10 +105,10 @@ def get_cf_live_tokens(self, domain): "Unable to find Cloudflare cookies. Does the site actually have " "Cloudflare IUAM (\"I'm Under Attack Mode\") enabled?") - return (OrderedDict([ + return (OrderedDict(filter(lambda x: x[1], [ ("__cfduid", self.cookies.get("__cfduid", "", domain=cookie_domain)), ("cf_clearance", self.cookies.get("cf_clearance", "", domain=cookie_domain)) - ]), + ])), self._ua, self._hdrs ) From f546fcffce746c6e1b941ea1dd62259ba022aa74 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 28 Apr 2019 05:08:00 +0200 Subject: [PATCH 479/710] release 2.6.5.3039 --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fa8ebc130..28892a7e5 100644 --- a/README.md +++ b/README.md @@ -88,11 +88,20 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3017 +2.6.5.3039 subscene, addic7ed and titlovi - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration +Changelog +core: only reference guessed title if there actually is one +core: cf: optimize +core/compat: dns: support nameservers via ENV[dns_resolvers]; don't fall back to default DNS when configured custom DNS failed +providers: titlovi: prevent repeated captcha solving for CF + + +2.6.5.3017 + Changelog - core: SRT parsing: handle (bad) ASS color tag in SRT - core: auto extract embedded: only use one unknown sub for first language From 344025226aa828cde76e74efd4ec40aba2904df5 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 28 Apr 2019 05:11:09 +0200 Subject: [PATCH 480/710] add missing changelog entry --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 28892a7e5..e51c784ef 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ subscene, addic7ed and titlovi Changelog core: only reference guessed title if there actually is one core: cf: optimize +core/config: add setting for one existing language to be enough, fixes #491 core/compat: dns: support nameservers via ENV[dns_resolvers]; don't fall back to default DNS when configured custom DNS failed providers: titlovi: prevent repeated captcha solving for CF From 4568e222d1b3d3e142a3ae4f9d39366eb103b1f1 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 28 Apr 2019 05:11:45 +0200 Subject: [PATCH 481/710] release 2.6.5.3041 --- Contents/Info.plist | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index edb41260c..1a5eeb3f9 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3032</string> + <string>2.6.5.3041</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3032 +Version 2.6.5.3041 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index e51c784ef..e0500475d 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3039 +2.6.5.3041 subscene, addic7ed and titlovi - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration From 76c20dc3d7487834f56a2a2db8e1d8a3a7e4444f Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sun, 28 Apr 2019 05:21:35 +0200 Subject: [PATCH 482/710] Update README.md --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e0500475d..bd551e5be 100644 --- a/README.md +++ b/README.md @@ -94,11 +94,12 @@ subscene, addic7ed and titlovi - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog -core: only reference guessed title if there actually is one -core: cf: optimize -core/config: add setting for one existing language to be enough, fixes #491 -core/compat: dns: support nameservers via ENV[dns_resolvers]; don't fall back to default DNS when configured custom DNS failed -providers: titlovi: prevent repeated captcha solving for CF + +- core: only reference guessed title if there actually is one +- core: cf: optimize +- core/config: add setting for one existing language to be enough, fixes #491 +- core/compat: dns: support nameservers via ENV[dns_resolvers]; don't fall back to default DNS when configured custom DNS failed +- providers: titlovi: prevent repeated captcha solving for CF 2.6.5.3017 From d9fa9d03da2bf2f83404698960835126f07b17ca Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 28 Apr 2019 05:22:24 +0200 Subject: [PATCH 483/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 1a5eeb3f9..e739e494b 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1 </string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3041 +Version 2.6.5.3041 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 850f836ebd40a790ed992ca10b207b8e06e976e8 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 28 Apr 2019 05:27:26 +0200 Subject: [PATCH 484/710] back to dev --- Contents/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index e739e494b..644864098 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1 </string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> From b3ab2a451c836acb2f7279f091104a81ac7095db Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 02:27:30 +0200 Subject: [PATCH 485/710] core: http: don't query DNS with IPs. thanks @fgump --- Contents/Libraries/Shared/ipaddress.py | 2419 +++++++++++++++++ .../Libraries/Shared/subliminal_patch/http.py | 75 +- 2 files changed, 2459 insertions(+), 35 deletions(-) create mode 100644 Contents/Libraries/Shared/ipaddress.py diff --git a/Contents/Libraries/Shared/ipaddress.py b/Contents/Libraries/Shared/ipaddress.py new file mode 100644 index 000000000..f2d076684 --- /dev/null +++ b/Contents/Libraries/Shared/ipaddress.py @@ -0,0 +1,2419 @@ +# Copyright 2007 Google Inc. +# Licensed to PSF under a Contributor Agreement. + +"""A fast, lightweight IPv4/IPv6 manipulation library in Python. + +This library is used to create/poke/manipulate IPv4 and IPv6 addresses +and networks. + +""" + +from __future__ import unicode_literals + + +import itertools +import struct + +__version__ = '1.0.22' + +# Compatibility functions +_compat_int_types = (int,) +try: + _compat_int_types = (int, long) +except NameError: + pass +try: + _compat_str = unicode +except NameError: + _compat_str = str + assert bytes != str +if b'\0'[0] == 0: # Python 3 semantics + def _compat_bytes_to_byte_vals(byt): + return byt +else: + def _compat_bytes_to_byte_vals(byt): + return [struct.unpack(b'!B', b)[0] for b in byt] +try: + _compat_int_from_byte_vals = int.from_bytes +except AttributeError: + def _compat_int_from_byte_vals(bytvals, endianess): + assert endianess == 'big' + res = 0 + for bv in bytvals: + assert isinstance(bv, _compat_int_types) + res = (res << 8) + bv + return res + + +def _compat_to_bytes(intval, length, endianess): + assert isinstance(intval, _compat_int_types) + assert endianess == 'big' + if length == 4: + if intval < 0 or intval >= 2 ** 32: + raise struct.error("integer out of range for 'I' format code") + return struct.pack(b'!I', intval) + elif length == 16: + if intval < 0 or intval >= 2 ** 128: + raise struct.error("integer out of range for 'QQ' format code") + return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff) + else: + raise NotImplementedError() + + +if hasattr(int, 'bit_length'): + # Not int.bit_length , since that won't work in 2.7 where long exists + def _compat_bit_length(i): + return i.bit_length() +else: + def _compat_bit_length(i): + for res in itertools.count(): + if i >> res == 0: + return res + + +def _compat_range(start, end, step=1): + assert step > 0 + i = start + while i < end: + yield i + i += step + + +class _TotalOrderingMixin(object): + __slots__ = () + + # Helper that derives the other comparison operations from + # __lt__ and __eq__ + # We avoid functools.total_ordering because it doesn't handle + # NotImplemented correctly yet (http://bugs.python.org/issue10042) + def __eq__(self, other): + raise NotImplementedError + + def __ne__(self, other): + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not equal + + def __lt__(self, other): + raise NotImplementedError + + def __le__(self, other): + less = self.__lt__(other) + if less is NotImplemented or not less: + return self.__eq__(other) + return less + + def __gt__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not (less or equal) + + def __ge__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + return not less + + +IPV4LENGTH = 32 +IPV6LENGTH = 128 + + +class AddressValueError(ValueError): + """A Value Error related to the address.""" + + +class NetmaskValueError(ValueError): + """A Value Error related to the netmask.""" + + +def ip_address(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Address or IPv6Address object. + + Raises: + ValueError: if the *address* passed isn't either a v4 or a v6 + address + + """ + try: + return IPv4Address(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Address(address) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % + address) + + +def ip_network(address, strict=True): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP network. Either IPv4 or + IPv6 networks may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Network or IPv6Network object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. Or if the network has host bits set. + + """ + try: + return IPv4Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 network. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % + address) + + +def ip_interface(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Interface or IPv6Interface object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. + + Notes: + The IPv?Interface classes describe an Address on a particular + Network, so they're basically a combination of both the Address + and Network classes. + + """ + try: + return IPv4Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' % + address) + + +def v4_int_to_packed(address): + """Represent an address as 4 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv4 IP address. + + Returns: + The integer address packed as 4 bytes in network (big-endian) order. + + Raises: + ValueError: If the integer is negative or too large to be an + IPv4 IP address. + + """ + try: + return _compat_to_bytes(address, 4, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv4") + + +def v6_int_to_packed(address): + """Represent an address as 16 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv6 IP address. + + Returns: + The integer address packed as 16 bytes in network (big-endian) order. + + """ + try: + return _compat_to_bytes(address, 16, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv6") + + +def _split_optional_netmask(address): + """Helper to split the netmask and raise AddressValueError if needed""" + addr = _compat_str(address).split('/') + if len(addr) > 2: + raise AddressValueError("Only one '/' permitted in %r" % address) + return addr + + +def _find_address_range(addresses): + """Find a sequence of sorted deduplicated IPv#Address. + + Args: + addresses: a list of IPv#Address objects. + + Yields: + A tuple containing the first and last IP addresses in the sequence. + + """ + it = iter(addresses) + first = last = next(it) + for ip in it: + if ip._ip != last._ip + 1: + yield first, last + first = ip + last = ip + yield first, last + + +def _count_righthand_zero_bits(number, bits): + """Count the number of zero bits on the right hand side. + + Args: + number: an integer. + bits: maximum number of bits to count. + + Returns: + The number of zero bits on the right hand side of the number. + + """ + if number == 0: + return bits + return min(bits, _compat_bit_length(~number & (number - 1))) + + +def summarize_address_range(first, last): + """Summarize a network range given the first and last IP addresses. + + Example: + >>> list(summarize_address_range(IPv4Address('192.0.2.0'), + ... IPv4Address('192.0.2.130'))) + ... #doctest: +NORMALIZE_WHITESPACE + [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), + IPv4Network('192.0.2.130/32')] + + Args: + first: the first IPv4Address or IPv6Address in the range. + last: the last IPv4Address or IPv6Address in the range. + + Returns: + An iterator of the summarized IPv(4|6) network objects. + + Raise: + TypeError: + If the first and last objects are not IP addresses. + If the first and last objects are not the same version. + ValueError: + If the last object is not greater than the first. + If the version of the first address is not 4 or 6. + + """ + if (not (isinstance(first, _BaseAddress) and + isinstance(last, _BaseAddress))): + raise TypeError('first and last must be IP addresses, not networks') + if first.version != last.version: + raise TypeError("%s and %s are not of the same version" % ( + first, last)) + if first > last: + raise ValueError('last IP address must be greater than first') + + if first.version == 4: + ip = IPv4Network + elif first.version == 6: + ip = IPv6Network + else: + raise ValueError('unknown IP version') + + ip_bits = first._max_prefixlen + first_int = first._ip + last_int = last._ip + while first_int <= last_int: + nbits = min(_count_righthand_zero_bits(first_int, ip_bits), + _compat_bit_length(last_int - first_int + 1) - 1) + net = ip((first_int, ip_bits - nbits)) + yield net + first_int += 1 << nbits + if first_int - 1 == ip._ALL_ONES: + break + + +def _collapse_addresses_internal(addresses): + """Loops through the addresses, collapsing concurrent netblocks. + + Example: + + ip1 = IPv4Network('192.0.2.0/26') + ip2 = IPv4Network('192.0.2.64/26') + ip3 = IPv4Network('192.0.2.128/26') + ip4 = IPv4Network('192.0.2.192/26') + + _collapse_addresses_internal([ip1, ip2, ip3, ip4]) -> + [IPv4Network('192.0.2.0/24')] + + This shouldn't be called directly; it is called via + collapse_addresses([]). + + Args: + addresses: A list of IPv4Network's or IPv6Network's + + Returns: + A list of IPv4Network's or IPv6Network's depending on what we were + passed. + + """ + # First merge + to_merge = list(addresses) + subnets = {} + while to_merge: + net = to_merge.pop() + supernet = net.supernet() + existing = subnets.get(supernet) + if existing is None: + subnets[supernet] = net + elif existing != net: + # Merge consecutive subnets + del subnets[supernet] + to_merge.append(supernet) + # Then iterate over resulting networks, skipping subsumed subnets + last = None + for net in sorted(subnets.values()): + if last is not None: + # Since they are sorted, + # last.network_address <= net.network_address is a given. + if last.broadcast_address >= net.broadcast_address: + continue + yield net + last = net + + +def collapse_addresses(addresses): + """Collapse a list of IP objects. + + Example: + collapse_addresses([IPv4Network('192.0.2.0/25'), + IPv4Network('192.0.2.128/25')]) -> + [IPv4Network('192.0.2.0/24')] + + Args: + addresses: An iterator of IPv4Network or IPv6Network objects. + + Returns: + An iterator of the collapsed IPv(4|6)Network objects. + + Raises: + TypeError: If passed a list of mixed version objects. + + """ + addrs = [] + ips = [] + nets = [] + + # split IP addresses and networks + for ip in addresses: + if isinstance(ip, _BaseAddress): + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + ips.append(ip) + elif ip._prefixlen == ip._max_prefixlen: + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + try: + ips.append(ip.ip) + except AttributeError: + ips.append(ip.network_address) + else: + if nets and nets[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, nets[-1])) + nets.append(ip) + + # sort and dedup + ips = sorted(set(ips)) + + # find consecutive address ranges in the sorted sequence and summarize them + if ips: + for first, last in _find_address_range(ips): + addrs.extend(summarize_address_range(first, last)) + + return _collapse_addresses_internal(addrs + nets) + + +def get_mixed_type_key(obj): + """Return a key suitable for sorting between networks and addresses. + + Address and Network objects are not sortable by default; they're + fundamentally different so the expression + + IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24') + + doesn't make any sense. There are some times however, where you may wish + to have ipaddress sort these for you anyway. If you need to do this, you + can use this function as the key= argument to sorted(). + + Args: + obj: either a Network or Address object. + Returns: + appropriate key. + + """ + if isinstance(obj, _BaseNetwork): + return obj._get_networks_key() + elif isinstance(obj, _BaseAddress): + return obj._get_address_key() + return NotImplemented + + +class _IPAddressBase(_TotalOrderingMixin): + + """The mother class.""" + + __slots__ = () + + @property + def exploded(self): + """Return the longhand version of the IP address as a string.""" + return self._explode_shorthand_ip_string() + + @property + def compressed(self): + """Return the shorthand version of the IP address as a string.""" + return _compat_str(self) + + @property + def reverse_pointer(self): + """The name of the reverse DNS pointer for the IP address, e.g.: + >>> ipaddress.ip_address("127.0.0.1").reverse_pointer + '1.0.0.127.in-addr.arpa' + >>> ipaddress.ip_address("2001:db8::1").reverse_pointer + '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' + + """ + return self._reverse_pointer() + + @property + def version(self): + msg = '%200s has no version specified' % (type(self),) + raise NotImplementedError(msg) + + def _check_int_address(self, address): + if address < 0: + msg = "%d (< 0) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._version)) + if address > self._ALL_ONES: + msg = "%d (>= 2**%d) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._max_prefixlen, + self._version)) + + def _check_packed_address(self, address, expected_len): + address_len = len(address) + if address_len != expected_len: + msg = ( + '%r (len %d != %d) is not permitted as an IPv%d address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?') + raise AddressValueError(msg % (address, address_len, + expected_len, self._version)) + + @classmethod + def _ip_int_from_prefix(cls, prefixlen): + """Turn the prefix length into a bitwise netmask + + Args: + prefixlen: An integer, the prefix length. + + Returns: + An integer. + + """ + return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen) + + @classmethod + def _prefix_from_ip_int(cls, ip_int): + """Return prefix length from the bitwise netmask. + + Args: + ip_int: An integer, the netmask in expanded bitwise format + + Returns: + An integer, the prefix length. + + Raises: + ValueError: If the input intermingles zeroes & ones + """ + trailing_zeroes = _count_righthand_zero_bits(ip_int, + cls._max_prefixlen) + prefixlen = cls._max_prefixlen - trailing_zeroes + leading_ones = ip_int >> trailing_zeroes + all_ones = (1 << prefixlen) - 1 + if leading_ones != all_ones: + byteslen = cls._max_prefixlen // 8 + details = _compat_to_bytes(ip_int, byteslen, 'big') + msg = 'Netmask pattern %r mixes zeroes & ones' + raise ValueError(msg % details) + return prefixlen + + @classmethod + def _report_invalid_netmask(cls, netmask_str): + msg = '%r is not a valid netmask' % netmask_str + raise NetmaskValueError(msg) + + @classmethod + def _prefix_from_prefix_string(cls, prefixlen_str): + """Return prefix length from a numeric string + + Args: + prefixlen_str: The string to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask + """ + # int allows a leading +/- as well as surrounding whitespace, + # so we ensure that isn't the case + if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str): + cls._report_invalid_netmask(prefixlen_str) + try: + prefixlen = int(prefixlen_str) + except ValueError: + cls._report_invalid_netmask(prefixlen_str) + if not (0 <= prefixlen <= cls._max_prefixlen): + cls._report_invalid_netmask(prefixlen_str) + return prefixlen + + @classmethod + def _prefix_from_ip_string(cls, ip_str): + """Turn a netmask/hostmask string into a prefix length + + Args: + ip_str: The netmask/hostmask to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask/hostmask + """ + # Parse the netmask/hostmask like an IP address. + try: + ip_int = cls._ip_int_from_string(ip_str) + except AddressValueError: + cls._report_invalid_netmask(ip_str) + + # Try matching a netmask (this would be /1*0*/ as a bitwise regexp). + # Note that the two ambiguous cases (all-ones and all-zeroes) are + # treated as netmasks. + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + pass + + # Invert the bits, and try matching a /0+1+/ hostmask instead. + ip_int ^= cls._ALL_ONES + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + cls._report_invalid_netmask(ip_str) + + def __reduce__(self): + return self.__class__, (_compat_str(self),) + + +class _BaseAddress(_IPAddressBase): + + """A generic IP object. + + This IP class contains the version independent methods which are + used by single IP addresses. + """ + + __slots__ = () + + def __int__(self): + return self._ip + + def __eq__(self, other): + try: + return (self._ip == other._ip and + self._version == other._version) + except AttributeError: + return NotImplemented + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseAddress): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self._ip != other._ip: + return self._ip < other._ip + return False + + # Shorthand for Integer addition and subtraction. This is not + # meant to ever support addition/subtraction of addresses. + def __add__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) + other) + + def __sub__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) - other) + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return _compat_str(self._string_from_ip_int(self._ip)) + + def __hash__(self): + return hash(hex(int(self._ip))) + + def _get_address_key(self): + return (self._version, self) + + def __reduce__(self): + return self.__class__, (self._ip,) + + +class _BaseNetwork(_IPAddressBase): + + """A generic IP network object. + + This IP class contains the version independent methods which are + used by networks. + + """ + def __init__(self, address): + self._cache = {} + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return '%s/%d' % (self.network_address, self.prefixlen) + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the network + or broadcast addresses. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast): + yield self._address_class(x) + + def __iter__(self): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network, broadcast + 1): + yield self._address_class(x) + + def __getitem__(self, n): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + if n >= 0: + if network + n > broadcast: + raise IndexError('address out of range') + return self._address_class(network + n) + else: + n += 1 + if broadcast + n < network: + raise IndexError('address out of range') + return self._address_class(broadcast + n) + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseNetwork): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self.network_address != other.network_address: + return self.network_address < other.network_address + if self.netmask != other.netmask: + return self.netmask < other.netmask + return False + + def __eq__(self, other): + try: + return (self._version == other._version and + self.network_address == other.network_address and + int(self.netmask) == int(other.netmask)) + except AttributeError: + return NotImplemented + + def __hash__(self): + return hash(int(self.network_address) ^ int(self.netmask)) + + def __contains__(self, other): + # always false if one is v4 and the other is v6. + if self._version != other._version: + return False + # dealing with another network. + if isinstance(other, _BaseNetwork): + return False + # dealing with another address + else: + # address + return (int(self.network_address) <= int(other._ip) <= + int(self.broadcast_address)) + + def overlaps(self, other): + """Tell if self is partly contained in other.""" + return self.network_address in other or ( + self.broadcast_address in other or ( + other.network_address in self or ( + other.broadcast_address in self))) + + @property + def broadcast_address(self): + x = self._cache.get('broadcast_address') + if x is None: + x = self._address_class(int(self.network_address) | + int(self.hostmask)) + self._cache['broadcast_address'] = x + return x + + @property + def hostmask(self): + x = self._cache.get('hostmask') + if x is None: + x = self._address_class(int(self.netmask) ^ self._ALL_ONES) + self._cache['hostmask'] = x + return x + + @property + def with_prefixlen(self): + return '%s/%d' % (self.network_address, self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self.network_address, self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self.network_address, self.hostmask) + + @property + def num_addresses(self): + """Number of hosts in the current subnet.""" + return int(self.broadcast_address) - int(self.network_address) + 1 + + @property + def _address_class(self): + # Returning bare address objects (rather than interfaces) allows for + # more consistent behaviour across the network address, broadcast + # address and individual host addresses. + msg = '%200s has no associated address class' % (type(self),) + raise NotImplementedError(msg) + + @property + def prefixlen(self): + return self._prefixlen + + def address_exclude(self, other): + """Remove an address from a larger block. + + For example: + + addr1 = ip_network('192.0.2.0/28') + addr2 = ip_network('192.0.2.1/32') + list(addr1.address_exclude(addr2)) = + [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'), + IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')] + + or IPv6: + + addr1 = ip_network('2001:db8::1/32') + addr2 = ip_network('2001:db8::1/128') + list(addr1.address_exclude(addr2)) = + [ip_network('2001:db8::1/128'), + ip_network('2001:db8::2/127'), + ip_network('2001:db8::4/126'), + ip_network('2001:db8::8/125'), + ... + ip_network('2001:db8:8000::/33')] + + Args: + other: An IPv4Network or IPv6Network object of the same type. + + Returns: + An iterator of the IPv(4|6)Network objects which is self + minus other. + + Raises: + TypeError: If self and other are of differing address + versions, or if other is not a network object. + ValueError: If other is not completely contained by self. + + """ + if not self._version == other._version: + raise TypeError("%s and %s are not of the same version" % ( + self, other)) + + if not isinstance(other, _BaseNetwork): + raise TypeError("%s is not a network object" % other) + + if not other.subnet_of(self): + raise ValueError('%s not contained in %s' % (other, self)) + if other == self: + return + + # Make sure we're comparing the network of other. + other = other.__class__('%s/%s' % (other.network_address, + other.prefixlen)) + + s1, s2 = self.subnets() + while s1 != other and s2 != other: + if other.subnet_of(s1): + yield s2 + s1, s2 = s1.subnets() + elif other.subnet_of(s2): + yield s1 + s1, s2 = s2.subnets() + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + if s1 == other: + yield s2 + elif s2 == other: + yield s1 + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + + def compare_networks(self, other): + """Compare two IP objects. + + This is only concerned about the comparison of the integer + representation of the network addresses. This means that the + host bits aren't considered at all in this method. If you want + to compare host bits, you can easily enough do a + 'HostA._ip < HostB._ip' + + Args: + other: An IP object. + + Returns: + If the IP versions of self and other are the same, returns: + + -1 if self < other: + eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25') + IPv6Network('2001:db8::1000/124') < + IPv6Network('2001:db8::2000/124') + 0 if self == other + eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24') + IPv6Network('2001:db8::1000/124') == + IPv6Network('2001:db8::1000/124') + 1 if self > other + eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25') + IPv6Network('2001:db8::2000/124') > + IPv6Network('2001:db8::1000/124') + + Raises: + TypeError if the IP versions are different. + + """ + # does this need to raise a ValueError? + if self._version != other._version: + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + # self._version == other._version below here: + if self.network_address < other.network_address: + return -1 + if self.network_address > other.network_address: + return 1 + # self.network_address == other.network_address below here: + if self.netmask < other.netmask: + return -1 + if self.netmask > other.netmask: + return 1 + return 0 + + def _get_networks_key(self): + """Network-only key function. + + Returns an object that identifies this address' network and + netmask. This function is a suitable "key" argument for sorted() + and list.sort(). + + """ + return (self._version, self.network_address, self.netmask) + + def subnets(self, prefixlen_diff=1, new_prefix=None): + """The subnets which join to make the current subnet. + + In the case that self contains only one IP + (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 + for IPv6), yield an iterator with just ourself. + + Args: + prefixlen_diff: An integer, the amount the prefix length + should be increased by. This should not be set if + new_prefix is also set. + new_prefix: The desired new prefix length. This must be a + larger number (smaller prefix) than the existing prefix. + This should not be set if prefixlen_diff is also set. + + Returns: + An iterator of IPv(4|6) objects. + + Raises: + ValueError: The prefixlen_diff is too small or too large. + OR + prefixlen_diff and new_prefix are both set or new_prefix + is a smaller number than the current prefix (smaller + number means a larger network) + + """ + if self._prefixlen == self._max_prefixlen: + yield self + return + + if new_prefix is not None: + if new_prefix < self._prefixlen: + raise ValueError('new prefix must be longer') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = new_prefix - self._prefixlen + + if prefixlen_diff < 0: + raise ValueError('prefix length diff must be > 0') + new_prefixlen = self._prefixlen + prefixlen_diff + + if new_prefixlen > self._max_prefixlen: + raise ValueError( + 'prefix length diff %d is invalid for netblock %s' % ( + new_prefixlen, self)) + + start = int(self.network_address) + end = int(self.broadcast_address) + 1 + step = (int(self.hostmask) + 1) >> prefixlen_diff + for new_addr in _compat_range(start, end, step): + current = self.__class__((new_addr, new_prefixlen)) + yield current + + def supernet(self, prefixlen_diff=1, new_prefix=None): + """The supernet containing the current network. + + Args: + prefixlen_diff: An integer, the amount the prefix length of + the network should be decreased by. For example, given a + /24 network and a prefixlen_diff of 3, a supernet with a + /21 netmask is returned. + + Returns: + An IPv4 network object. + + Raises: + ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have + a negative prefix length. + OR + If prefixlen_diff and new_prefix are both set or new_prefix is a + larger number than the current prefix (larger number means a + smaller network) + + """ + if self._prefixlen == 0: + return self + + if new_prefix is not None: + if new_prefix > self._prefixlen: + raise ValueError('new prefix must be shorter') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = self._prefixlen - new_prefix + + new_prefixlen = self.prefixlen - prefixlen_diff + if new_prefixlen < 0: + raise ValueError( + 'current prefixlen is %d, cannot have a prefixlen_diff of %d' % + (self.prefixlen, prefixlen_diff)) + return self.__class__(( + int(self.network_address) & (int(self.netmask) << prefixlen_diff), + new_prefixlen)) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return (self.network_address.is_multicast and + self.broadcast_address.is_multicast) + + @staticmethod + def _is_subnet_of(a, b): + try: + # Always false if one is v4 and the other is v6. + if a._version != b._version: + raise TypeError("%s and %s are not of the same version" (a, b)) + return (b.network_address <= a.network_address and + b.broadcast_address >= a.broadcast_address) + except AttributeError: + raise TypeError("Unable to test subnet containment " + "between %s and %s" % (a, b)) + + def subnet_of(self, other): + """Return True if this network is a subnet of other.""" + return self._is_subnet_of(self, other) + + def supernet_of(self, other): + """Return True if this network is a supernet of other.""" + return self._is_subnet_of(other, self) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return (self.network_address.is_reserved and + self.broadcast_address.is_reserved) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return (self.network_address.is_link_local and + self.broadcast_address.is_link_local) + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return (self.network_address.is_private and + self.broadcast_address.is_private) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return (self.network_address.is_unspecified and + self.broadcast_address.is_unspecified) + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return (self.network_address.is_loopback and + self.broadcast_address.is_loopback) + + +class _BaseV4(object): + + """Base IPv4 object. + + The following methods are used by IPv4 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 4 + # Equivalent to 255.255.255.255 or 32 bits of 1's. + _ALL_ONES = (2 ** IPV4LENGTH) - 1 + _DECIMAL_DIGITS = frozenset('0123456789') + + # the valid octets for host and netmasks. only useful for IPv4. + _valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0]) + + _max_prefixlen = IPV4LENGTH + # There are only a handful of valid v4 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + def _explode_shorthand_ip_string(self): + return _compat_str(self) + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + try: + # Check for a netmask in prefix length form + prefixlen = cls._prefix_from_prefix_string(arg) + except NetmaskValueError: + # Check for a netmask or hostmask in dotted-quad form. + # This may raise NetmaskValueError. + prefixlen = cls._prefix_from_ip_string(arg) + netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn the given IP string into an integer for comparison. + + Args: + ip_str: A string, the IP ip_str. + + Returns: + The IP ip_str as an integer. + + Raises: + AddressValueError: if ip_str isn't a valid IPv4 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + octets = ip_str.split('.') + if len(octets) != 4: + raise AddressValueError("Expected 4 octets in %r" % ip_str) + + try: + return _compat_int_from_byte_vals( + map(cls._parse_octet, octets), 'big') + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_octet(cls, octet_str): + """Convert a decimal octet into an integer. + + Args: + octet_str: A string, the number to parse. + + Returns: + The octet as an integer. + + Raises: + ValueError: if the octet isn't strictly a decimal from [0..255]. + + """ + if not octet_str: + raise ValueError("Empty octet not permitted") + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._DECIMAL_DIGITS.issuperset(octet_str): + msg = "Only decimal digits permitted in %r" + raise ValueError(msg % octet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(octet_str) > 3: + msg = "At most 3 characters permitted in %r" + raise ValueError(msg % octet_str) + # Convert to integer (we know digits are legal) + octet_int = int(octet_str, 10) + # Any octets that look like they *might* be written in octal, + # and which don't look exactly the same in both octal and + # decimal are rejected as ambiguous + if octet_int > 7 and octet_str[0] == '0': + msg = "Ambiguous (octal/decimal) value in %r not permitted" + raise ValueError(msg % octet_str) + if octet_int > 255: + raise ValueError("Octet %d (> 255) not permitted" % octet_int) + return octet_int + + @classmethod + def _string_from_ip_int(cls, ip_int): + """Turns a 32-bit integer into dotted decimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + The IP address as a string in dotted decimal notation. + + """ + return '.'.join(_compat_str(struct.unpack(b'!B', b)[0] + if isinstance(b, bytes) + else b) + for b in _compat_to_bytes(ip_int, 4, 'big')) + + def _is_hostmask(self, ip_str): + """Test if the IP string is a hostmask (rather than a netmask). + + Args: + ip_str: A string, the potential hostmask. + + Returns: + A boolean, True if the IP string is a hostmask. + + """ + bits = ip_str.split('.') + try: + parts = [x for x in map(int, bits) if x in self._valid_mask_octets] + except ValueError: + return False + if len(parts) != len(bits): + return False + if parts[0] < parts[-1]: + return True + return False + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv4 address. + + This implements the method described in RFC1035 3.5. + + """ + reverse_octets = _compat_str(self).split('.')[::-1] + return '.'.join(reverse_octets) + '.in-addr.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv4Address(_BaseV4, _BaseAddress): + + """Represent and manipulate single IPv4 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + + """ + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv4Address('192.0.2.1') == IPv4Address(3221225985). + or, more generally + IPv4Address(int(IPv4Address('192.0.2.1'))) == + IPv4Address('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 4) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v4_int_to_packed(self._ip) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within the + reserved IPv4 Network range. + + """ + return self in self._constants._reserved_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + return ( + self not in self._constants._public_network and + not self.is_private) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is multicast. + See RFC 3171 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 5735 3. + + """ + return self == self._constants._unspecified_address + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback per RFC 3330. + + """ + return self in self._constants._loopback_network + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is link-local per RFC 3927. + + """ + return self in self._constants._linklocal_network + + +class IPv4Interface(IPv4Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv4Address.__init__(self, address) + self.network = IPv4Network(self._ip) + self._prefixlen = self._max_prefixlen + return + + if isinstance(address, tuple): + IPv4Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + + self.network = IPv4Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv4Address.__init__(self, addr[0]) + + self.network = IPv4Network(address, strict=False) + self._prefixlen = self.network._prefixlen + + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv4Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv4Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return (self.network < other.network or + self.network == other.network and address_less) + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv4Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + +class IPv4Network(_BaseV4, _BaseNetwork): + + """This class represents and manipulates 32-bit IPv4 network + addresses.. + + Attributes: [examples for IPv4Network('192.0.2.0/27')] + .network_address: IPv4Address('192.0.2.0') + .hostmask: IPv4Address('0.0.0.31') + .broadcast_address: IPv4Address('192.0.2.32') + .netmask: IPv4Address('255.255.255.224') + .prefixlen: 27 + + """ + # Class to use when creating address objects + _address_class = IPv4Address + + def __init__(self, address, strict=True): + + """Instantiate a new IPv4 network object. + + Args: + address: A string or integer representing the IP [& network]. + '192.0.2.0/24' + '192.0.2.0/255.255.255.0' + '192.0.0.2/0.0.0.255' + are all functionally the same in IPv4. Similarly, + '192.0.2.1' + '192.0.2.1/255.255.255.255' + '192.0.2.1/32' + are also functionally equivalent. That is to say, failing to + provide a subnetmask will create an object with a mask of /32. + + If the mask (portion after the / in the argument) is given in + dotted quad form, it is treated as a netmask if it starts with a + non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it + starts with a zero field (e.g. 0.255.255.255 == /8), with the + single exception of an all-zero mask which is treated as a + netmask == /0. If no mask is given, a default of /32 is used. + + Additionally, an integer can be passed, so + IPv4Network('192.0.2.1') == IPv4Network(3221225985) + or, more generally + IPv4Interface(int(IPv4Interface('192.0.2.1'))) == + IPv4Interface('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + NetmaskValueError: If the netmask isn't valid for + an IPv4 address. + ValueError: If strict is True and a network address is not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Constructing from a packed address or integer + if isinstance(address, (_compat_int_types, bytes)): + self.network_address = IPv4Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + # fixme: address/network test here. + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + # We weren't given an address[1] + arg = self._max_prefixlen + self.network_address = IPv4Address(address[0]) + self.netmask, self._prefixlen = self._make_netmask(arg) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv4Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + self.network_address = IPv4Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv4Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv4Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry. + + """ + return (not (self.network_address in IPv4Network('100.64.0.0/10') and + self.broadcast_address in IPv4Network('100.64.0.0/10')) and + not self.is_private) + + +class _IPv4Constants(object): + + _linklocal_network = IPv4Network('169.254.0.0/16') + + _loopback_network = IPv4Network('127.0.0.0/8') + + _multicast_network = IPv4Network('224.0.0.0/4') + + _public_network = IPv4Network('100.64.0.0/10') + + _private_networks = [ + IPv4Network('0.0.0.0/8'), + IPv4Network('10.0.0.0/8'), + IPv4Network('127.0.0.0/8'), + IPv4Network('169.254.0.0/16'), + IPv4Network('172.16.0.0/12'), + IPv4Network('192.0.0.0/29'), + IPv4Network('192.0.0.170/31'), + IPv4Network('192.0.2.0/24'), + IPv4Network('192.168.0.0/16'), + IPv4Network('198.18.0.0/15'), + IPv4Network('198.51.100.0/24'), + IPv4Network('203.0.113.0/24'), + IPv4Network('240.0.0.0/4'), + IPv4Network('255.255.255.255/32'), + ] + + _reserved_network = IPv4Network('240.0.0.0/4') + + _unspecified_address = IPv4Address('0.0.0.0') + + +IPv4Address._constants = _IPv4Constants + + +class _BaseV6(object): + + """Base IPv6 object. + + The following methods are used by IPv6 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 6 + _ALL_ONES = (2 ** IPV6LENGTH) - 1 + _HEXTET_COUNT = 8 + _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef') + _max_prefixlen = IPV6LENGTH + + # There are only a bunch of valid v6 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + prefixlen = cls._prefix_from_prefix_string(arg) + netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn an IPv6 ip_str into an integer. + + Args: + ip_str: A string, the IPv6 ip_str. + + Returns: + An int, the IPv6 address + + Raises: + AddressValueError: if ip_str isn't a valid IPv6 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + parts = ip_str.split(':') + + # An IPv6 address needs at least 2 colons (3 parts). + _min_parts = 3 + if len(parts) < _min_parts: + msg = "At least %d parts expected in %r" % (_min_parts, ip_str) + raise AddressValueError(msg) + + # If the address has an IPv4-style suffix, convert it to hexadecimal. + if '.' in parts[-1]: + try: + ipv4_int = IPv4Address(parts.pop())._ip + except AddressValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF)) + parts.append('%x' % (ipv4_int & 0xFFFF)) + + # An IPv6 address can't have more than 8 colons (9 parts). + # The extra colon comes from using the "::" notation for a single + # leading or trailing zero part. + _max_parts = cls._HEXTET_COUNT + 1 + if len(parts) > _max_parts: + msg = "At most %d colons permitted in %r" % ( + _max_parts - 1, ip_str) + raise AddressValueError(msg) + + # Disregarding the endpoints, find '::' with nothing in between. + # This indicates that a run of zeroes has been skipped. + skip_index = None + for i in _compat_range(1, len(parts) - 1): + if not parts[i]: + if skip_index is not None: + # Can't have more than one '::' + msg = "At most one '::' permitted in %r" % ip_str + raise AddressValueError(msg) + skip_index = i + + # parts_hi is the number of parts to copy from above/before the '::' + # parts_lo is the number of parts to copy from below/after the '::' + if skip_index is not None: + # If we found a '::', then check if it also covers the endpoints. + parts_hi = skip_index + parts_lo = len(parts) - skip_index - 1 + if not parts[0]: + parts_hi -= 1 + if parts_hi: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + parts_lo -= 1 + if parts_lo: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo) + if parts_skipped < 1: + msg = "Expected at most %d other parts with '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str)) + else: + # Otherwise, allocate the entire address to parts_hi. The + # endpoints could still be empty, but _parse_hextet() will check + # for that. + if len(parts) != cls._HEXTET_COUNT: + msg = "Exactly %d parts expected without '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str)) + if not parts[0]: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_hi = len(parts) + parts_lo = 0 + parts_skipped = 0 + + try: + # Now, parse the hextets into a 128-bit integer. + ip_int = 0 + for i in range(parts_hi): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + ip_int <<= 16 * parts_skipped + for i in range(-parts_lo, 0): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + return ip_int + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_hextet(cls, hextet_str): + """Convert an IPv6 hextet string into an integer. + + Args: + hextet_str: A string, the number to parse. + + Returns: + The hextet as an integer. + + Raises: + ValueError: if the input isn't strictly a hex number from + [0..FFFF]. + + """ + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._HEX_DIGITS.issuperset(hextet_str): + raise ValueError("Only hex digits permitted in %r" % hextet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(hextet_str) > 4: + msg = "At most 4 characters permitted in %r" + raise ValueError(msg % hextet_str) + # Length check means we can skip checking the integer value + return int(hextet_str, 16) + + @classmethod + def _compress_hextets(cls, hextets): + """Compresses a list of hextets. + + Compresses a list of strings, replacing the longest continuous + sequence of "0" in the list with "" and adding empty strings at + the beginning or at the end of the string such that subsequently + calling ":".join(hextets) will produce the compressed version of + the IPv6 address. + + Args: + hextets: A list of strings, the hextets to compress. + + Returns: + A list of strings. + + """ + best_doublecolon_start = -1 + best_doublecolon_len = 0 + doublecolon_start = -1 + doublecolon_len = 0 + for index, hextet in enumerate(hextets): + if hextet == '0': + doublecolon_len += 1 + if doublecolon_start == -1: + # Start of a sequence of zeros. + doublecolon_start = index + if doublecolon_len > best_doublecolon_len: + # This is the longest sequence of zeros so far. + best_doublecolon_len = doublecolon_len + best_doublecolon_start = doublecolon_start + else: + doublecolon_len = 0 + doublecolon_start = -1 + + if best_doublecolon_len > 1: + best_doublecolon_end = (best_doublecolon_start + + best_doublecolon_len) + # For zeros at the end of the address. + if best_doublecolon_end == len(hextets): + hextets += [''] + hextets[best_doublecolon_start:best_doublecolon_end] = [''] + # For zeros at the beginning of the address. + if best_doublecolon_start == 0: + hextets = [''] + hextets + + return hextets + + @classmethod + def _string_from_ip_int(cls, ip_int=None): + """Turns a 128-bit integer into hexadecimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + A string, the hexadecimal representation of the address. + + Raises: + ValueError: The address is bigger than 128 bits of all ones. + + """ + if ip_int is None: + ip_int = int(cls._ip) + + if ip_int > cls._ALL_ONES: + raise ValueError('IPv6 address is too large') + + hex_str = '%032x' % ip_int + hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)] + + hextets = cls._compress_hextets(hextets) + return ':'.join(hextets) + + def _explode_shorthand_ip_string(self): + """Expand a shortened IPv6 address. + + Args: + ip_str: A string, the IPv6 address. + + Returns: + A string, the expanded IPv6 address. + + """ + if isinstance(self, IPv6Network): + ip_str = _compat_str(self.network_address) + elif isinstance(self, IPv6Interface): + ip_str = _compat_str(self.ip) + else: + ip_str = _compat_str(self) + + ip_int = self._ip_int_from_string(ip_str) + hex_str = '%032x' % ip_int + parts = [hex_str[x:x + 4] for x in range(0, 32, 4)] + if isinstance(self, (_BaseNetwork, IPv6Interface)): + return '%s/%d' % (':'.join(parts), self._prefixlen) + return ':'.join(parts) + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv6 address. + + This implements the method described in RFC3596 2.5. + + """ + reverse_chars = self.exploded[::-1].replace(':', '') + return '.'.join(reverse_chars) + '.ip6.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv6Address(_BaseV6, _BaseAddress): + + """Represent and manipulate single IPv6 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + """Instantiate a new IPv6 address object. + + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv6Address('2001:db8::') == + IPv6Address(42540766411282592856903984951653826560) + or, more generally + IPv6Address(int(IPv6Address('2001:db8::'))) == + IPv6Address('2001:db8::') + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 16) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v6_int_to_packed(self._ip) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return any(self in x for x in self._constants._reserved_networks) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return self in self._constants._linklocal_network + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return self in self._constants._sitelocal_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv6-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, true if the address is not reserved per + iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return self._ip == 0 + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return self._ip == 1 + + @property + def ipv4_mapped(self): + """Return the IPv4 mapped address. + + Returns: + If the IPv6 address is a v4 mapped address, return the + IPv4 mapped address. Return None otherwise. + + """ + if (self._ip >> 32) != 0xFFFF: + return None + return IPv4Address(self._ip & 0xFFFFFFFF) + + @property + def teredo(self): + """Tuple of embedded teredo IPs. + + Returns: + Tuple of the (server, client) IPs or None if the address + doesn't appear to be a teredo address (doesn't start with + 2001::/32) + + """ + if (self._ip >> 96) != 0x20010000: + return None + return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF), + IPv4Address(~self._ip & 0xFFFFFFFF)) + + @property + def sixtofour(self): + """Return the IPv4 6to4 embedded address. + + Returns: + The IPv4 6to4-embedded address if present or None if the + address doesn't appear to contain a 6to4 embedded address. + + """ + if (self._ip >> 112) != 0x2002: + return None + return IPv4Address((self._ip >> 80) & 0xFFFFFFFF) + + +class IPv6Interface(IPv6Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv6Address.__init__(self, address) + self.network = IPv6Network(self._ip) + self._prefixlen = self._max_prefixlen + return + if isinstance(address, tuple): + IPv6Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv6Address.__init__(self, addr[0]) + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self._prefixlen = self.network._prefixlen + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv6Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv6Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return (self.network < other.network or + self.network == other.network and address_less) + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv6Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + @property + def is_unspecified(self): + return self._ip == 0 and self.network.is_unspecified + + @property + def is_loopback(self): + return self._ip == 1 and self.network.is_loopback + + +class IPv6Network(_BaseV6, _BaseNetwork): + + """This class represents and manipulates 128-bit IPv6 networks. + + Attributes: [examples for IPv6('2001:db8::1000/124')] + .network_address: IPv6Address('2001:db8::1000') + .hostmask: IPv6Address('::f') + .broadcast_address: IPv6Address('2001:db8::100f') + .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0') + .prefixlen: 124 + + """ + + # Class to use when creating address objects + _address_class = IPv6Address + + def __init__(self, address, strict=True): + """Instantiate a new IPv6 Network object. + + Args: + address: A string or integer representing the IPv6 network or the + IP and prefix/netmask. + '2001:db8::/128' + '2001:db8:0000:0000:0000:0000:0000:0000/128' + '2001:db8::' + are all functionally the same in IPv6. That is to say, + failing to provide a subnetmask will create an object with + a mask of /128. + + Additionally, an integer can be passed, so + IPv6Network('2001:db8::') == + IPv6Network(42540766411282592856903984951653826560) + or, more generally + IPv6Network(int(IPv6Network('2001:db8::'))) == + IPv6Network('2001:db8::') + + strict: A boolean. If true, ensure that we have been passed + A true network address, eg, 2001:db8::1000/124 and not an + IP address on a network, eg, 2001:db8::1/124. + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + NetmaskValueError: If the netmask isn't valid for + an IPv6 address. + ValueError: If strict was True and a network address was not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Efficient constructor from integer or packed address + if isinstance(address, (bytes, _compat_int_types)): + self.network_address = IPv6Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + self.network_address = IPv6Address(address[0]) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv6Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + + self.network_address = IPv6Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv6Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv6Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the + Subnet-Router anycast address. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast + 1): + yield self._address_class(x) + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return (self.network_address.is_site_local and + self.broadcast_address.is_site_local) + + +class _IPv6Constants(object): + + _linklocal_network = IPv6Network('fe80::/10') + + _multicast_network = IPv6Network('ff00::/8') + + _private_networks = [ + IPv6Network('::1/128'), + IPv6Network('::/128'), + IPv6Network('::ffff:0:0/96'), + IPv6Network('100::/64'), + IPv6Network('2001::/23'), + IPv6Network('2001:2::/48'), + IPv6Network('2001:db8::/32'), + IPv6Network('2001:10::/28'), + IPv6Network('fc00::/7'), + IPv6Network('fe80::/10'), + ] + + _reserved_networks = [ + IPv6Network('::/8'), IPv6Network('100::/8'), + IPv6Network('200::/7'), IPv6Network('400::/6'), + IPv6Network('800::/5'), IPv6Network('1000::/4'), + IPv6Network('4000::/3'), IPv6Network('6000::/3'), + IPv6Network('8000::/3'), IPv6Network('A000::/3'), + IPv6Network('C000::/3'), IPv6Network('E000::/4'), + IPv6Network('F000::/5'), IPv6Network('F800::/6'), + IPv6Network('FE00::/9'), + ] + + _sitelocal_network = IPv6Network('fec0::/10') + + +IPv6Address._constants = _IPv6Constants diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index a7292ff52..6ba1a1c9f 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -10,6 +10,7 @@ import requests import xmlrpclib import dns.resolver +import ipaddress from requests import exceptions from urllib3.util import connection @@ -240,42 +241,46 @@ def patched_create_connection(address, *args, **kwargs): global _custom_resolver, _custom_resolver_ips, dns_cache host, port = address - __custom_resolver_ips = os.environ.get("dns_resolvers", None) - - # resolver ips changed in the meantime? - if __custom_resolver_ips != _custom_resolver_ips: - _custom_resolver = None - _custom_resolver_ips = __custom_resolver_ips - dns_cache = {} - - custom_resolver = _custom_resolver - - if not custom_resolver: - if _custom_resolver_ips: - logger.debug("DNS: Trying to use custom DNS resolvers: %s", _custom_resolver_ips) - custom_resolver = dns.resolver.Resolver(configure=False) - custom_resolver.lifetime = 8.0 - try: - custom_resolver.nameservers = json.loads(_custom_resolver_ips) - except: - logger.debug("DNS: Couldn't load custom DNS resolvers: %s", _custom_resolver_ips) + try: + ipaddress.ip_address(unicode(host)) + except (ipaddress.AddressValueError, ValueError): + __custom_resolver_ips = os.environ.get("dns_resolvers", None) + + # resolver ips changed in the meantime? + if __custom_resolver_ips != _custom_resolver_ips: + _custom_resolver = None + _custom_resolver_ips = __custom_resolver_ips + dns_cache = {} + + custom_resolver = _custom_resolver + + if not custom_resolver: + if _custom_resolver_ips: + logger.debug("DNS: Trying to use custom DNS resolvers: %s", _custom_resolver_ips) + custom_resolver = dns.resolver.Resolver(configure=False) + custom_resolver.lifetime = 8.0 + try: + custom_resolver.nameservers = json.loads(_custom_resolver_ips) + except: + logger.debug("DNS: Couldn't load custom DNS resolvers: %s", _custom_resolver_ips) + else: + _custom_resolver = custom_resolver + + if custom_resolver: + if host in dns_cache: + ip = dns_cache[host] + logger.debug("DNS: Using %s=%s from cache", host, ip) + return _orig_create_connection((ip, port), *args, **kwargs) else: - _custom_resolver = custom_resolver - - if custom_resolver: - if host in dns_cache: - ip = dns_cache[host] - logger.debug("DNS: Using %s=%s from cache", host, ip) - return _orig_create_connection((ip, port), *args, **kwargs) - else: - try: - ip = custom_resolver.query(host)[0].address - logger.debug("DNS: Resolved %s to %s using %s", host, ip, custom_resolver.nameservers) - dns_cache[host] = ip - except dns.exception.DNSException: - logger.warning("DNS: Couldn't resolve %s with DNS: %s", host, custom_resolver.nameservers) - raise - + try: + ip = custom_resolver.query(host)[0].address + logger.debug("DNS: Resolved %s to %s using %s", host, ip, custom_resolver.nameservers) + dns_cache[host] = ip + except dns.exception.DNSException: + logger.warning("DNS: Couldn't resolve %s with DNS: %s", host, custom_resolver.nameservers) + raise + + logger.debug("DNS: Falling back to default DNS or IP on %s", host) return _orig_create_connection((host, port), *args, **kwargs) patch_create_connection._sz_patched = True From 7da0bac6433a94492f037b454f2a350826c68cb8 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 02:33:46 +0200 Subject: [PATCH 486/710] skip warning --- Contents/Libraries/Shared/subliminal_patch/http.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 6ba1a1c9f..94ed885e9 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -276,6 +276,7 @@ def patched_create_connection(address, *args, **kwargs): ip = custom_resolver.query(host)[0].address logger.debug("DNS: Resolved %s to %s using %s", host, ip, custom_resolver.nameservers) dns_cache[host] = ip + return _orig_create_connection((ip, port), *args, **kwargs) except dns.exception.DNSException: logger.warning("DNS: Couldn't resolve %s with DNS: %s", host, custom_resolver.nameservers) raise From a1f70d1d4d30c6f090ca0a8ed851f01b4f5a9fe0 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 02:39:18 +0200 Subject: [PATCH 487/710] core: add ENV:dns_resolvers_timeout --- Contents/Libraries/Shared/subliminal_patch/http.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 94ed885e9..24e58e023 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -258,7 +258,7 @@ def patched_create_connection(address, *args, **kwargs): if _custom_resolver_ips: logger.debug("DNS: Trying to use custom DNS resolvers: %s", _custom_resolver_ips) custom_resolver = dns.resolver.Resolver(configure=False) - custom_resolver.lifetime = 8.0 + custom_resolver.lifetime = os.environ.get("dns_resolvers_timeout", 8.0) try: custom_resolver.nameservers = json.loads(_custom_resolver_ips) except: From dd27997deb082eb47d650969e7df35c07caed341 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 03:12:01 +0200 Subject: [PATCH 488/710] core: cf: add cloudscaper 1.1.1@496900e instead of cfscrape --- .../Libraries/Shared/cloudscraper/__init__.py | 298 ++++++++++++++++ .../cloudscraper/interpreters/__init__.py | 89 +++++ .../Shared/cloudscraper/interpreters/js2py.py | 32 ++ .../cloudscraper/interpreters/jsunfuck.py | 97 +++++ .../cloudscraper/interpreters/nodejs.py | 46 +++ .../cloudscraper/user_agent/__init__.py | 40 +++ .../cloudscraper/user_agent/browsers.json | 336 ++++++++++++++++++ 7 files changed, 938 insertions(+) create mode 100644 Contents/Libraries/Shared/cloudscraper/__init__.py create mode 100644 Contents/Libraries/Shared/cloudscraper/interpreters/__init__.py create mode 100644 Contents/Libraries/Shared/cloudscraper/interpreters/js2py.py create mode 100644 Contents/Libraries/Shared/cloudscraper/interpreters/jsunfuck.py create mode 100644 Contents/Libraries/Shared/cloudscraper/interpreters/nodejs.py create mode 100644 Contents/Libraries/Shared/cloudscraper/user_agent/__init__.py create mode 100644 Contents/Libraries/Shared/cloudscraper/user_agent/browsers.json diff --git a/Contents/Libraries/Shared/cloudscraper/__init__.py b/Contents/Libraries/Shared/cloudscraper/__init__.py new file mode 100644 index 000000000..7aaddcc4f --- /dev/null +++ b/Contents/Libraries/Shared/cloudscraper/__init__.py @@ -0,0 +1,298 @@ +import re +import ssl +try: + import brotli +except ImportError: + brotli = None + +import logging + +from copy import deepcopy +from time import sleep +from collections import OrderedDict + +from requests.sessions import Session +from requests.adapters import HTTPAdapter +from requests.packages.urllib3.util.ssl_ import create_urllib3_context + +from .interpreters import JavaScriptInterpreter +from .user_agent import User_Agent + +try: + from requests_toolbelt.utils import dump +except ImportError: + pass + +try: + from urlparse import urlparse + from urlparse import urlunparse +except ImportError: + from urllib.parse import urlparse + from urllib.parse import urlunparse + +########################################################################################################################################################## + +__version__ = '1.1.1' + +BUG_REPORT = 'Cloudflare may have changed their technique, or there may be a bug in the script.' + +########################################################################################################################################################## + + +class CipherSuiteAdapter(HTTPAdapter): + + def __init__(self, cipherSuite=None, **kwargs): + self.cipherSuite = cipherSuite + super(CipherSuiteAdapter, self).__init__(**kwargs) + + ########################################################################################################################################################## + + def init_poolmanager(self, *args, **kwargs): + kwargs['ssl_context'] = create_urllib3_context(ciphers=self.cipherSuite) + return super(CipherSuiteAdapter, self).init_poolmanager(*args, **kwargs) + + ########################################################################################################################################################## + + def proxy_manager_for(self, *args, **kwargs): + kwargs['ssl_context'] = create_urllib3_context(ciphers=self.cipherSuite) + return super(CipherSuiteAdapter, self).proxy_manager_for(*args, **kwargs) + +########################################################################################################################################################## + + +class CloudScraper(Session): + def __init__(self, *args, **kwargs): + self.debug = kwargs.pop('debug', False) + self.delay = kwargs.pop('delay', None) + self.interpreter = kwargs.pop('interpreter', 'js2py') + self.allow_brotli = kwargs.pop('allow_brotli', True) and bool(brotli) + self.cipherSuite = None + + super(CloudScraper, self).__init__() + + if 'requests' in self.headers['User-Agent']: + # Set a random User-Agent if no custom User-Agent has been set + self.headers = User_Agent(allow_brotli=self.allow_brotli).headers + + self.mount('https://', CipherSuiteAdapter(self.loadCipherSuite())) + + ########################################################################################################################################################## + + @staticmethod + def debugRequest(req): + try: + print(dump.dump_all(req).decode('utf-8')) + except: # noqa + pass + + ########################################################################################################################################################## + + def loadCipherSuite(self): + if self.cipherSuite: + return self.cipherSuite + + ciphers = [ + 'GREASE_3A', 'GREASE_6A', 'AES128-GCM-SHA256', 'AES256-GCM-SHA256', 'AES256-GCM-SHA384', 'CHACHA20-POLY1305-SHA256', + 'ECDHE-ECDSA-AES128-GCM-SHA256', 'ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-ECDSA-AES256-GCM-SHA384', + 'ECDHE-RSA-AES256-GCM-SHA384', 'ECDHE-ECDSA-CHACHA20-POLY1305-SHA256', 'ECDHE-RSA-CHACHA20-POLY1305-SHA256', + 'ECDHE-RSA-AES128-CBC-SHA', 'ECDHE-RSA-AES256-CBC-SHA', 'RSA-AES128-GCM-SHA256', 'RSA-AES256-GCM-SHA384', + 'ECDHE-RSA-AES128-GCM-SHA256', 'RSA-AES256-SHA', '3DES-EDE-CBC' + ] + + self.cipherSuite = '' + + ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + + for cipher in ciphers: + try: + ctx.set_ciphers(cipher) + self.cipherSuite = '{}:{}'.format(self.cipherSuite, cipher).rstrip(':') + except ssl.SSLError: + pass + + return self.cipherSuite + + ########################################################################################################################################################## + + def request(self, method, url, *args, **kwargs): + ourSuper = super(CloudScraper, self) + resp = ourSuper.request(method, url, *args, **kwargs) + + if resp.headers.get('Content-Encoding') == 'br': + if self.allow_brotli and resp._content: + resp._content = brotli.decompress(resp.content) + else: + logging.warning('Brotli content detected, But option is disabled, we will not continue.') + return resp + + # Debug request + if self.debug: + self.debugRequest(resp) + + # Check if Cloudflare anti-bot is on + if self.isChallengeRequest(resp): + if resp.request.method != 'GET': + # Work around if the initial request is not a GET, + # Supersede with a GET then re-request the original METHOD. + self.request('GET', resp.url) + resp = ourSuper.request(method, url, *args, **kwargs) + else: + # Solve Challenge + resp = self.sendChallengeResponse(resp, **kwargs) + + return resp + + ########################################################################################################################################################## + + @staticmethod + def isChallengeRequest(resp): + if resp.headers.get('Server', '').startswith('cloudflare'): + if b'why_captcha' in resp.content or b'/cdn-cgi/l/chk_captcha' in resp.content: + raise ValueError('Captcha') + + return ( + resp.status_code in [429, 503] + and all(s in resp.content for s in [b'jschl_vc', b'jschl_answer']) + ) + + return False + + ########################################################################################################################################################## + + def sendChallengeResponse(self, resp, **original_kwargs): + body = resp.text + + # Cloudflare requires a delay before solving the challenge + if not self.delay: + try: + delay = float(re.search(r'submit\(\);\r?\n\s*},\s*([0-9]+)', body).group(1)) / float(1000) + if isinstance(delay, (int, float)): + self.delay = delay + except: # noqa + pass + + sleep(self.delay) + + parsed_url = urlparse(resp.url) + domain = parsed_url.netloc + submit_url = '{}://{}/cdn-cgi/l/chk_jschl'.format(parsed_url.scheme, domain) + + cloudflare_kwargs = deepcopy(original_kwargs) + + try: + params = OrderedDict() + + s = re.search(r'name="s"\svalue="(?P<s_value>[^"]+)', body) + if s: + params['s'] = s.group('s_value') + + params.update( + [ + ('jschl_vc', re.search(r'name="jschl_vc" value="(\w+)"', body).group(1)), + ('pass', re.search(r'name="pass" value="(.+?)"', body).group(1)) + ] + ) + + params = cloudflare_kwargs.setdefault('params', params) + + except Exception as e: + raise ValueError('Unable to parse Cloudflare anti-bots page: {} {}'.format(e.message, BUG_REPORT)) + + # Solve the Javascript challenge + params['jschl_answer'] = JavaScriptInterpreter.dynamicImport(self.interpreter).solveChallenge(body, domain) + + # Requests transforms any request into a GET after a redirect, + # so the redirect has to be handled manually here to allow for + # performing other types of requests even as the first request. + + cloudflare_kwargs['allow_redirects'] = False + + redirect = self.request(resp.request.method, submit_url, **cloudflare_kwargs) + redirect_location = urlparse(redirect.headers['Location']) + if not redirect_location.netloc: + redirect_url = urlunparse( + ( + parsed_url.scheme, + domain, + redirect_location.path, + redirect_location.params, + redirect_location.query, + redirect_location.fragment + ) + ) + return self.request(resp.request.method, redirect_url, **original_kwargs) + + return self.request(resp.request.method, redirect.headers['Location'], **original_kwargs) + + ########################################################################################################################################################## + + @classmethod + def create_scraper(cls, sess=None, **kwargs): + """ + Convenience function for creating a ready-to-go CloudScraper object. + """ + scraper = cls(**kwargs) + + if sess: + attrs = ['auth', 'cert', 'cookies', 'headers', 'hooks', 'params', 'proxies', 'data'] + for attr in attrs: + val = getattr(sess, attr, None) + if val: + setattr(scraper, attr, val) + + return scraper + + ########################################################################################################################################################## + + # Functions for integrating cloudscraper with other applications and scripts + @classmethod + def get_tokens(cls, url, **kwargs): + scraper = cls.create_scraper( + debug=kwargs.pop('debug', False), + delay=kwargs.pop('delay', None), + interpreter=kwargs.pop('interpreter', 'js2py'), + allow_brotli=kwargs.pop('allow_brotli', True), + ) + + try: + resp = scraper.get(url, **kwargs) + resp.raise_for_status() + except Exception: + logging.error('"{}" returned an error. Could not collect tokens.'.format(url)) + raise + + domain = urlparse(resp.url).netloc + # noinspection PyUnusedLocal + cookie_domain = None + + for d in scraper.cookies.list_domains(): + if d.startswith('.') and d in ('.{}'.format(domain)): + cookie_domain = d + break + else: + raise ValueError('Unable to find Cloudflare cookies. Does the site actually have Cloudflare IUAM ("I\'m Under Attack Mode") enabled?') + + return ( + { + '__cfduid': scraper.cookies.get('__cfduid', '', domain=cookie_domain), + 'cf_clearance': scraper.cookies.get('cf_clearance', '', domain=cookie_domain) + }, + scraper.headers['User-Agent'] + ) + + ########################################################################################################################################################## + + @classmethod + def get_cookie_string(cls, url, **kwargs): + """ + Convenience function for building a Cookie HTTP header value. + """ + tokens, user_agent = cls.get_tokens(url, **kwargs) + return '; '.join('='.join(pair) for pair in tokens.items()), user_agent + + +########################################################################################################################################################## + +create_scraper = CloudScraper.create_scraper +get_tokens = CloudScraper.get_tokens +get_cookie_string = CloudScraper.get_cookie_string diff --git a/Contents/Libraries/Shared/cloudscraper/interpreters/__init__.py b/Contents/Libraries/Shared/cloudscraper/interpreters/__init__.py new file mode 100644 index 000000000..f915e4695 --- /dev/null +++ b/Contents/Libraries/Shared/cloudscraper/interpreters/__init__.py @@ -0,0 +1,89 @@ +import re +import sys +import logging +import abc + +if sys.version_info >= (3, 4): + ABC = abc.ABC # noqa +else: + ABC = abc.ABCMeta('ABC', (), {}) + +########################################################################################################################################################## + +BUG_REPORT = 'Cloudflare may have changed their technique, or there may be a bug in the script.' + +########################################################################################################################################################## + +interpreters = {} + + +class JavaScriptInterpreter(ABC): + @abc.abstractmethod + def __init__(self, name): + interpreters[name] = self + + @classmethod + def dynamicImport(cls, name): + if name not in interpreters: + try: + __import__('{}.{}'.format(cls.__module__, name)) + if not isinstance(interpreters.get(name), JavaScriptInterpreter): + raise ImportError('The interpreter was not initialized.') + except ImportError: + logging.error('Unable to load {} interpreter'.format(name)) + raise + + return interpreters[name] + + @abc.abstractmethod + def eval(self, jsEnv, js): + pass + + def solveChallenge(self, body, domain): + try: + js = re.search( + r'setTimeout\(function\(\){\s+(var s,t,o,p,b,r,e,a,k,i,n,g,f.+?\r?\n[\s\S]+?a\.value =.+?)\r?\n', + body + ).group(1) + except Exception: + raise ValueError('Unable to identify Cloudflare IUAM Javascript on website. {}'.format(BUG_REPORT)) + + js = re.sub(r'\s{2,}', ' ', js, flags=re.MULTILINE | re.DOTALL).replace('\'; 121\'', '') + js += '\na.value;' + + jsEnv = ''' + function italics (str) {{ return "<i>" + this + "</i>"; }}; + var document = {{ + createElement: function () {{ + return {{ firstChild: {{ href: "http://{domain}/" }} }} + }}, + getElementById: function () {{ + return {{"innerHTML": "{innerHTML}"}}; + }} + }}; + ''' + + try: + innerHTML = re.search( + r'<div(?: [^<>]*)? id="([^<>]*?)">([^<>]*?)</div>', + body, + re.MULTILINE | re.DOTALL + ) + innerHTML = innerHTML.group(2) if innerHTML else '' + + except: # noqa + logging.error('Error extracting Cloudflare IUAM Javascript. {}'.format(BUG_REPORT)) + raise + + try: + result = self.eval( + re.sub(r'\s{2,}', ' ', jsEnv.format(domain=domain, innerHTML=innerHTML), flags=re.MULTILINE | re.DOTALL), + js + ) + + float(result) + except Exception: + logging.error('Error executing Cloudflare IUAM Javascript. {}'.format(BUG_REPORT)) + raise + + return result diff --git a/Contents/Libraries/Shared/cloudscraper/interpreters/js2py.py b/Contents/Libraries/Shared/cloudscraper/interpreters/js2py.py new file mode 100644 index 000000000..d39104614 --- /dev/null +++ b/Contents/Libraries/Shared/cloudscraper/interpreters/js2py.py @@ -0,0 +1,32 @@ +from __future__ import absolute_import + +import js2py +import logging +import base64 + +from . import JavaScriptInterpreter + +from .jsunfuck import jsunfuck + + +class ChallengeInterpreter(JavaScriptInterpreter): + + def __init__(self): + super(ChallengeInterpreter, self).__init__('js2py') + + def eval(self, jsEnv, js): + if js2py.eval_js('(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]') == '1': + logging.warning('WARNING - Please upgrade your js2py https://github.com/PiotrDabkowski/Js2Py, applying work around for the meantime.') + js = jsunfuck(js) + + def atob(s): + return base64.b64decode('{}'.format(s)).decode('utf-8') + + js2py.disable_pyimport() + context = js2py.EvalJs({'atob': atob}) + result = context.eval('{}{}'.format(jsEnv, js)) + + return result + + +ChallengeInterpreter() diff --git a/Contents/Libraries/Shared/cloudscraper/interpreters/jsunfuck.py b/Contents/Libraries/Shared/cloudscraper/interpreters/jsunfuck.py new file mode 100644 index 000000000..9b149cc2e --- /dev/null +++ b/Contents/Libraries/Shared/cloudscraper/interpreters/jsunfuck.py @@ -0,0 +1,97 @@ +MAPPING = { + 'a': '(false+"")[1]', + 'b': '([]["entries"]()+"")[2]', + 'c': '([]["fill"]+"")[3]', + 'd': '(undefined+"")[2]', + 'e': '(true+"")[3]', + 'f': '(false+"")[0]', + 'g': '(false+[0]+String)[20]', + 'h': '(+(101))["to"+String["name"]](21)[1]', + 'i': '([false]+undefined)[10]', + 'j': '([]["entries"]()+"")[3]', + 'k': '(+(20))["to"+String["name"]](21)', + 'l': '(false+"")[2]', + 'm': '(Number+"")[11]', + 'n': '(undefined+"")[1]', + 'o': '(true+[]["fill"])[10]', + 'p': '(+(211))["to"+String["name"]](31)[1]', + 'q': '(+(212))["to"+String["name"]](31)[1]', + 'r': '(true+"")[1]', + 's': '(false+"")[3]', + 't': '(true+"")[0]', + 'u': '(undefined+"")[0]', + 'v': '(+(31))["to"+String["name"]](32)', + 'w': '(+(32))["to"+String["name"]](33)', + 'x': '(+(101))["to"+String["name"]](34)[1]', + 'y': '(NaN+[Infinity])[10]', + 'z': '(+(35))["to"+String["name"]](36)', + 'A': '(+[]+Array)[10]', + 'B': '(+[]+Boolean)[10]', + 'C': 'Function("return escape")()(("")["italics"]())[2]', + 'D': 'Function("return escape")()([]["fill"])["slice"]("-1")', + 'E': '(RegExp+"")[12]', + 'F': '(+[]+Function)[10]', + 'G': '(false+Function("return Date")()())[30]', + 'I': '(Infinity+"")[0]', + 'M': '(true+Function("return Date")()())[30]', + 'N': '(NaN+"")[0]', + 'O': '(NaN+Function("return{}")())[11]', + 'R': '(+[]+RegExp)[10]', + 'S': '(+[]+String)[10]', + 'T': '(NaN+Function("return Date")()())[30]', + 'U': '(NaN+Function("return{}")()["to"+String["name"]]["call"]())[11]', + ' ': '(NaN+[]["fill"])[11]', + '"': '("")["fontcolor"]()[12]', + '%': 'Function("return escape")()([]["fill"])[21]', + '&': '("")["link"](0+")[10]', + '(': '(undefined+[]["fill"])[22]', + ')': '([0]+false+[]["fill"])[20]', + '+': '(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[2]', + ',': '([]["slice"]["call"](false+"")+"")[1]', + '-': '(+(.+[0000000001])+"")[2]', + '.': '(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]', + '/': '(false+[0])["italics"]()[10]', + ':': '(RegExp()+"")[3]', + ';': '("")["link"](")[14]', + '<': '("")["italics"]()[0]', + '=': '("")["fontcolor"]()[11]', + '>': '("")["italics"]()[2]', + '?': '(RegExp()+"")[2]', + '[': '([]["entries"]()+"")[0]', + ']': '([]["entries"]()+"")[22]', + '{': '(true+[]["fill"])[20]', + '}': '([]["fill"]+"")["slice"]("-1")' +} + +SIMPLE = { + 'false': '![]', + 'true': '!![]', + 'undefined': '[][[]]', + 'NaN': '+[![]]', + 'Infinity': '+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])' # +"1e1000" +} + +CONSTRUCTORS = { + 'Array': '[]', + 'Number': '(+[])', + 'String': '([]+[])', + 'Boolean': '(![])', + 'Function': '[]["fill"]', + 'RegExp': 'Function("return/"+false+"/")()' +} + + +def jsunfuck(jsfuckString): + for key in sorted(MAPPING, key=lambda k: len(MAPPING[k]), reverse=True): + if MAPPING.get(key) in jsfuckString: + jsfuckString = jsfuckString.replace(MAPPING.get(key), '"{}"'.format(key)) + + for key in sorted(SIMPLE, key=lambda k: len(SIMPLE[k]), reverse=True): + if SIMPLE.get(key) in jsfuckString: + jsfuckString = jsfuckString.replace(SIMPLE.get(key), '{}'.format(key)) + + # for key in sorted(CONSTRUCTORS, key=lambda k: len(CONSTRUCTORS[k]), reverse=True): + # if CONSTRUCTORS.get(key) in jsfuckString: + # jsfuckString = jsfuckString.replace(CONSTRUCTORS.get(key), '{}'.format(key)) + + return jsfuckString diff --git a/Contents/Libraries/Shared/cloudscraper/interpreters/nodejs.py b/Contents/Libraries/Shared/cloudscraper/interpreters/nodejs.py new file mode 100644 index 000000000..28a375984 --- /dev/null +++ b/Contents/Libraries/Shared/cloudscraper/interpreters/nodejs.py @@ -0,0 +1,46 @@ +import base64 +import logging +import subprocess + +from . import JavaScriptInterpreter + +########################################################################################################################################################## + +BUG_REPORT = 'Cloudflare may have changed their technique, or there may be a bug in the script.' + +########################################################################################################################################################## + + +class ChallengeInterpreter(JavaScriptInterpreter): + + def __init__(self): + super(ChallengeInterpreter, self).__init__('nodejs') + + def eval(self, jsEnv, js): + try: + js = 'var atob = function(str) {return Buffer.from(str, "base64").toString("binary");};' \ + 'var challenge = atob("%s");' \ + 'var context = {atob: atob};' \ + 'var options = {filename: "iuam-challenge.js", timeout: 4000};' \ + 'var answer = require("vm").runInNewContext(challenge, context, options);' \ + 'process.stdout.write(String(answer));' \ + % base64.b64encode('{}{}'.format(jsEnv, js).encode('UTF-8')).decode('ascii') + + return subprocess.check_output(['node', '-e', js]) + + except OSError as e: + if e.errno == 2: + raise EnvironmentError( + 'Missing Node.js runtime. Node is required and must be in the PATH (check with `node -v`). Your Node binary may be called `nodejs` rather than `node`, ' + 'in which case you may need to run `apt-get install nodejs-legacy` on some Debian-based systems. (Please read the cloudscraper' + ' README\'s Dependencies section: https://github.com/VeNoMouS/cloudscraper#dependencies.' + ) + raise + except Exception: + logging.error('Error executing Cloudflare IUAM Javascript. %s' % BUG_REPORT) + raise + + pass + + +ChallengeInterpreter() diff --git a/Contents/Libraries/Shared/cloudscraper/user_agent/__init__.py b/Contents/Libraries/Shared/cloudscraper/user_agent/__init__.py new file mode 100644 index 000000000..45190fbe4 --- /dev/null +++ b/Contents/Libraries/Shared/cloudscraper/user_agent/__init__.py @@ -0,0 +1,40 @@ +import os +import json +import random +import logging + +from collections import OrderedDict + +########################################################################################################################################################## + + +class User_Agent(): + + ########################################################################################################################################################## + + def __init__(self, *args, **kwargs): + self.headers = None + self.loadUserAgent(*args, **kwargs) + + ########################################################################################################################################################## + + def loadUserAgent(self, *args, **kwargs): + browser = kwargs.pop('browser', 'chrome') + + user_agents = json.load( + open(os.path.join(os.path.dirname(__file__), 'browsers.json'), 'r'), + object_pairs_hook=OrderedDict + ) + + if not user_agents.get(browser): + logging.error('Sorry "{}" browser User-Agent was not found.'.format(browser)) + raise + + user_agent = random.choice(user_agents.get(browser)) + + self.headers = user_agent.get('headers') + self.headers['User-Agent'] = random.choice(user_agent.get('User-Agent')) + + if not kwargs.get('allow_brotli', False): + if 'br' in self.headers['Accept-Encoding']: + self.headers['Accept-Encoding'] = ','.join([encoding for encoding in self.headers['Accept-Encoding'].split(',') if encoding.strip() != 'br']).strip() diff --git a/Contents/Libraries/Shared/cloudscraper/user_agent/browsers.json b/Contents/Libraries/Shared/cloudscraper/user_agent/browsers.json new file mode 100644 index 000000000..c3eab3155 --- /dev/null +++ b/Contents/Libraries/Shared/cloudscraper/user_agent/browsers.json @@ -0,0 +1,336 @@ +{ + "chrome": [ + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.8", + "Accept-Encoding": "gzip, deflate, , br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.8", + "Accept-Encoding": "gzip, deflate, br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Accept-Encoding": "gzip, deflate, br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "User-Agent": null, + "Upgrade-Insecure-Requests": "1", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Accept-Encoding": "gzip, deflate, br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.40 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.40 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", + "Accept-Language": "en-US,en;q=0.9", + "Accept-Encoding": "gzip, deflate, br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Linux; Android 8.1.0; SM-N960F Build/M1AJQ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 8.0.0; SM-G965F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 Build/OPD1.170816.010) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 8.0.0; Pixel Build/OPR6.170623.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.1.1; SM-A530F Build/NMF26X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.1; Pixel Build/NDE63H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.0; SM-G955F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.0; SM-G950F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.0; SM-T825 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", + "Mozilla/5.0 (Linux; Android 6.0.1; SM-G930F Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 6.0; Nexus 6 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 6.0; XT1092 Build/MPE24.49-18) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 6.0.1; SM-N910C Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 5.0.2; SM-G920F Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 5.0; Nexus 6 Build/LRX21O) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 9; Pixel 3 XL Build/PD1A.180720.030) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PD1A.180720.030) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 9; Pixel 2 Build/PPR1.180610.009) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/KRT16M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 4.4.2; SM-T530 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", + "Mozilla/5.0 (Linux; Android 4.4.4; SM-N910C Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 9 Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.1.1; SM-N950F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, br", + "Accept-Language": "en-US,en;q=0.9" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Linux; Android 8.1.0; SM-T835 Build/M1AJQ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", + "Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 5.0; XT1092 Build/LXE22.46-19) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, br", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8" + } + } + ] +} From 6f3f1cb4b58d7160196d32c01715a0f03b450a48 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 04:24:09 +0200 Subject: [PATCH 489/710] core: cf: harden. --- .../Libraries/Shared/cloudscraper/__init__.py | 67 ++++++++++++++++--- .../Libraries/Shared/subliminal_patch/http.py | 27 ++++---- .../Libraries/Shared/subzero/constants.py | 3 +- 3 files changed, 73 insertions(+), 24 deletions(-) diff --git a/Contents/Libraries/Shared/cloudscraper/__init__.py b/Contents/Libraries/Shared/cloudscraper/__init__.py index 7aaddcc4f..644993d70 100644 --- a/Contents/Libraries/Shared/cloudscraper/__init__.py +++ b/Contents/Libraries/Shared/cloudscraper/__init__.py @@ -14,6 +14,7 @@ from requests.sessions import Session from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.ssl_ import create_urllib3_context +from subliminal_patch.pitcher import pitchers from .interpreters import JavaScriptInterpreter from .user_agent import User_Agent @@ -30,6 +31,8 @@ from urllib.parse import urlparse from urllib.parse import urlunparse +logger = logging.getLogger(__name__) + ########################################################################################################################################################## __version__ = '1.1.1' @@ -60,7 +63,13 @@ def proxy_manager_for(self, *args, **kwargs): ########################################################################################################################################################## +class NeedsCaptchaException(Exception): + pass + + class CloudScraper(Session): + was_cf_request = False + def __init__(self, *args, **kwargs): self.debug = kwargs.pop('debug', False) self.delay = kwargs.pop('delay', None) @@ -130,15 +139,53 @@ def request(self, method, url, *args, **kwargs): self.debugRequest(resp) # Check if Cloudflare anti-bot is on - if self.isChallengeRequest(resp): - if resp.request.method != 'GET': - # Work around if the initial request is not a GET, - # Supersede with a GET then re-request the original METHOD. - self.request('GET', resp.url) - resp = ourSuper.request(method, url, *args, **kwargs) - else: - # Solve Challenge - resp = self.sendChallengeResponse(resp, **kwargs) + try: + if self.isChallengeRequest(resp): + self.was_cf_request = True + if resp.request.method != 'GET': + # Work around if the initial request is not a GET, + # Supersede with a GET then re-request the original METHOD. + self.request('GET', resp.url) + resp = ourSuper.request(method, url, *args, **kwargs) + else: + # Solve Challenge + resp = self.sendChallengeResponse(resp, **kwargs) + except NeedsCaptchaException: + self.was_cf_request = True + # solve the captcha + site_key = re.search(r'data-sitekey="(.+?)"', resp.content).group(1) + challenge_s = re.search(r'type="hidden" name="s" value="(.+?)"', resp.content).group(1) + challenge_ray = re.search(r'data-ray="(.+?)"', resp.content).group(1) + if not all([site_key, challenge_s, challenge_ray]): + raise Exception("cf: Captcha site-key not found!") + + pitcher = pitchers.get_pitcher()("cf", resp.request.url, site_key, + user_agent=self.headers["User-Agent"], + cookies=self.cookies.get_dict(), + is_invisible=True) + + parsed_url = urlparse(resp.url) + domain = parsed_url.netloc + logger.info("cf: %s: Solving captcha", domain) + result = pitcher.throw() + if not result: + raise Exception("cf: Couldn't solve captcha!") + + submit_url = '{}://{}/cdn-cgi/l/chk_captcha'.format(parsed_url.scheme, domain) + method = resp.request.method + + cloudflare_kwargs = { + 'allow_redirects': False, + 'headers': {'Referer': resp.url}, + 'params': OrderedDict( + [ + ('s', challenge_s), + ('g-recaptcha-response', result) + ] + ) + } + + return self.request(method, submit_url, **cloudflare_kwargs) return resp @@ -148,7 +195,7 @@ def request(self, method, url, *args, **kwargs): def isChallengeRequest(resp): if resp.headers.get('Server', '').startswith('cloudflare'): if b'why_captcha' in resp.content or b'/cdn-cgi/l/chk_captcha' in resp.content: - raise ValueError('Captcha') + raise NeedsCaptchaException return ( resp.status_code in [429, 503] diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 24e58e023..c529fc228 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -18,7 +18,7 @@ from exceptions import APIThrottled from dogpile.cache.api import NO_VALUE from subliminal.cache import region -from cfscrape import CloudflareScraper +from cloudscraper import CloudScraper try: from urlparse import urlparse @@ -56,34 +56,35 @@ def __init__(self): self.verify = pem_file -class CFSession(CloudflareScraper): - def __init__(self): - super(CFSession, self).__init__() +class CFSession(CloudScraper): + _hdrs = None + + def __init__(self, *args, **kwargs): + super(CFSession, self).__init__(*args, **kwargs) self.debug = os.environ.get("CF_DEBUG", False) + self._was_cf = False def request(self, method, url, *args, **kwargs): parsed_url = urlparse(url) domain = parsed_url.netloc - cache_key = "cf_data2_%s" % domain + cache_key = "cf_data3_%s" % domain if not self.cookies.get("cf_clearance", "", domain=domain): cf_data = region.get(cache_key) if cf_data is not NO_VALUE: - cf_cookies, user_agent, hdrs = cf_data + cf_cookies, hdrs = cf_data logger.debug("Trying to use old cf data for %s: %s", domain, cf_data) for cookie, value in cf_cookies.iteritems(): self.cookies.set(cookie, value, domain=domain) - self._hdrs = hdrs - self._ua = user_agent - self.headers['User-Agent'] = self._ua + self.headers = hdrs ret = super(CFSession, self).request(method, url, *args, **kwargs) - if self._was_cf: - self._was_cf = False - logger.debug("We've hit CF, trying to store previous data") + if self.was_cf_request: + self.was_cf_request = False + logger.debug("We've hit CF, seeing if we need to store previous data") try: cf_data = self.get_cf_live_tokens(domain) except: @@ -110,7 +111,7 @@ def get_cf_live_tokens(self, domain): ("__cfduid", self.cookies.get("__cfduid", "", domain=cookie_domain)), ("cf_clearance", self.cookies.get("cf_clearance", "", domain=cookie_domain)) ])), - self._ua, self._hdrs + self.headers ) diff --git a/Contents/Libraries/Shared/subzero/constants.py b/Contents/Libraries/Shared/subzero/constants.py index b89da8199..cdfa242a6 100755 --- a/Contents/Libraries/Shared/subzero/constants.py +++ b/Contents/Libraries/Shared/subzero/constants.py @@ -2,7 +2,8 @@ OS_PLEX_USERAGENT = 'plexapp.com v9.0' -DEPENDENCY_MODULE_NAMES = ['subliminal', 'subliminal_patch', 'enzyme', 'guessit', 'subzero', 'libfilebot', 'cfscrape'] +DEPENDENCY_MODULE_NAMES = ['subliminal', 'subliminal_patch', 'enzyme', 'guessit', 'subzero', 'libfilebot', + 'cloudscraper'] PERSONAL_MEDIA_IDENTIFIER = "com.plexapp.agents.none" PLUGIN_IDENTIFIER_SHORT = "subzero" PLUGIN_IDENTIFIER = "com.plexapp.agents.%s" % PLUGIN_IDENTIFIER_SHORT From 8c02e75fed8dd184bcde56dea31262b970eab25e Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 04:24:31 +0200 Subject: [PATCH 490/710] providers: titlovi: match cfsrc for src --- .../Libraries/Shared/subliminal_patch/providers/titlovi.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index b076680e9..17d87ac32 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -225,7 +225,8 @@ def query(self, languages, title, season=None, episode=None, year=None, video=No # page link page_link = self.server_url + sub.a.attrs['href'] # subtitle language - match = lang_re.search(sub.select_one('.lang').attrs['src']) + _lang = sub.select_one('.lang') + match = lang_re.search(_lang.attrs.get('src', _lang.attrs.get('cfsrc', ''))) if match: try: # decode language From 58111bf20445e06c67ed30cf7ad9e974d93a4ff0 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 04:25:04 +0200 Subject: [PATCH 491/710] core: remove old cfscrape implementation --- .../Libraries/Shared/cfscrape/__init__.py | 395 ------------------ .../Libraries/Shared/cfscrape/browsers.json | 80 ---- .../Shared/cfscrape/browsers_br.json | 336 --------------- Contents/Libraries/Shared/cfscrape/jsfuck.py | 97 ----- 4 files changed, 908 deletions(-) delete mode 100644 Contents/Libraries/Shared/cfscrape/__init__.py delete mode 100644 Contents/Libraries/Shared/cfscrape/browsers.json delete mode 100644 Contents/Libraries/Shared/cfscrape/browsers_br.json delete mode 100644 Contents/Libraries/Shared/cfscrape/jsfuck.py diff --git a/Contents/Libraries/Shared/cfscrape/__init__.py b/Contents/Libraries/Shared/cfscrape/__init__.py deleted file mode 100644 index c31bb377b..000000000 --- a/Contents/Libraries/Shared/cfscrape/__init__.py +++ /dev/null @@ -1,395 +0,0 @@ -# coding=utf-8 - -import logging -import random -import re -import os -import json -import base64 - -from copy import deepcopy -from time import sleep -from collections import OrderedDict -from .jsfuck import jsunfuck - -import js2py -from requests.sessions import Session -from subliminal_patch.pitcher import pitchers - -try: - from requests_toolbelt.utils import dump -except ImportError: - pass - -try: - from urlparse import urlparse - from urlparse import urlunparse -except ImportError: - from urllib.parse import urlparse - from urllib.parse import urlunparse - -brotli_available = True - -try: - from brotli import decompress as brdec -except: - brotli_available = False - -logger = logging.getLogger(__name__) - -__version__ = "2.0.3" - -# Orignally written by https://github.com/Anorov/cloudflare-scrape -# Rewritten by VeNoMouS - <venom@gen-x.co.nz> for https://github.com/VeNoMouS/Sick-Beard - 24/3/2018 NZDT - -DEFAULT_USER_AGENTS = [ - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/65.0.3325.181 Chrome/65.0.3325.181 Safari/537.36", - "Mozilla/5.0 (Linux; Android 7.0; Moto G (5) Build/NPPS25.137-93-8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36", - "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53", - "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0", -] - -BUG_REPORT = """\ -Cloudflare may have changed their technique, or there may be a bug in the script. -""" - - -cur_path = os.path.abspath(os.path.dirname(__file__)) - -if brotli_available: - brwsrs = os.path.join(cur_path, "browsers_br.json") - with open(brwsrs, "r") as f: - UA_COMBO = json.load(f, object_pairs_hook=OrderedDict)["chrome"] - -else: - brwsrs = os.path.join(cur_path, "browsers.json") - UA_COMBO = [] - with open(brwsrs, "r") as f: - _brwsrs = json.load(f, object_pairs_hook=OrderedDict) - for entry in _brwsrs: - _entry = OrderedDict(("-".join(a.capitalize() for a in key.split("-")), value) - for key, value in entry.iteritems()) - _entry["User-Agent"] = None - UA_COMBO.append({"User-Agent": [entry["user-agent"]], "headers": _entry}) - - -class NeedsCaptchaException(Exception): - pass - - -class CloudflareScraper(Session): - def __init__(self, *args, **kwargs): - self.delay = kwargs.pop('delay', 8) - self.debug = False - self._was_cf = False - self._ua = None - self._hdrs = None - - super(CloudflareScraper, self).__init__(*args, **kwargs) - - if not self._ua: - # Set a random User-Agent if no custom User-Agent has been set - ua_combo = random.choice(UA_COMBO) - self._ua = random.choice(ua_combo["User-Agent"]) - self._hdrs = ua_combo["headers"].copy() - self._hdrs["User-Agent"] = self._ua - self.headers['User-Agent'] = self._ua - - def set_cloudflare_challenge_delay(self, delay): - if isinstance(delay, (int, float)) and delay > 0: - self.delay = delay - - def is_cloudflare_challenge(self, resp): - if resp.headers.get('Server', '').startswith('cloudflare'): - if b'why_captcha' in resp.content or b'/cdn-cgi/l/chk_captcha' in resp.content: - raise NeedsCaptchaException - - return ( - resp.status_code in [429, 503] - and b"jschl_vc" in resp.content - and b"jschl_answer" in resp.content - ) - return False - - def debugRequest(self, req): - try: - print (dump.dump_all(req).decode('utf-8')) - except: - pass - - def request(self, method, url, *args, **kwargs): - # self.headers = ( - # OrderedDict( - # [ - # ('User-Agent', self.headers['User-Agent']), - # ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), - # ('Accept-Language', 'en-US,en;q=0.5'), - # ('Accept-Encoding', 'gzip, deflate'), - # ('Connection', 'close'), - # ('Upgrade-Insecure-Requests', '1') - # ] - # ) - # ) - self.headers = self._hdrs.copy() - - resp = super(CloudflareScraper, self).request(method, url, *args, **kwargs) - if resp.headers.get('content-encoding') == 'br' and brotli_available: - resp._content = brdec(resp._content) - - # Debug request - if self.debug: - self.debugRequest(resp) - - # Check if Cloudflare anti-bot is on - try: - if self.is_cloudflare_challenge(resp): - self._was_cf = True - # Work around if the initial request is not a GET, - # Superseed with a GET then re-request the orignal METHOD. - if resp.request.method != 'GET': - self.request('GET', resp.url) - resp = self.request(method, url, *args, **kwargs) - else: - resp = self.solve_cf_challenge(resp, **kwargs) - except NeedsCaptchaException: - # solve the captcha - self._was_cf = True - site_key = re.search(r'data-sitekey="(.+?)"', resp.content).group(1) - challenge_s = re.search(r'type="hidden" name="s" value="(.+?)"', resp.content).group(1) - challenge_ray = re.search(r'data-ray="(.+?)"', resp.content).group(1) - if not all([site_key, challenge_s, challenge_ray]): - raise Exception("cf: Captcha site-key not found!") - - pitcher = pitchers.get_pitcher()("cf", resp.request.url, site_key, - user_agent=self.headers["User-Agent"], - cookies=self.cookies.get_dict(), - is_invisible=True) - - parsed_url = urlparse(resp.url) - domain = parsed_url.netloc - logger.info("cf: %s: Solving captcha", domain) - result = pitcher.throw() - if not result: - raise Exception("cf: Couldn't solve captcha!") - - submit_url = '{}://{}/cdn-cgi/l/chk_captcha'.format(parsed_url.scheme, domain) - method = resp.request.method - - cloudflare_kwargs = { - 'allow_redirects': False, - 'headers': {'Referer': resp.url}, - 'params': OrderedDict( - [ - ('s', challenge_s), - ('g-recaptcha-response', result) - ] - ) - } - - return self.request(method, submit_url, **cloudflare_kwargs) - - return resp - - def solve_cf_challenge(self, resp, **original_kwargs): - body = resp.text - - # Cloudflare requires a delay before solving the challenge - if self.delay == 8: - try: - delay = float(re.search(r'submit\(\);\r?\n\s*},\s*([0-9]+)', body).group(1)) / float(1000) - if isinstance(delay, (int, float)): - self.delay = delay - except: - pass - - sleep(self.delay) - - parsed_url = urlparse(resp.url) - domain = parsed_url.netloc - submit_url = '{}://{}/cdn-cgi/l/chk_jschl'.format(parsed_url.scheme, domain) - - cloudflare_kwargs = deepcopy(original_kwargs) - headers = cloudflare_kwargs.setdefault('headers', {'Referer': resp.url}) - - try: - params = cloudflare_kwargs.setdefault( - 'params', OrderedDict( - [ - ('s', re.search(r'name="s"\svalue="(?P<s_value>[^"]+)', body).group('s_value')), - ('jschl_vc', re.search(r'name="jschl_vc" value="(\w+)"', body).group(1)), - ('pass', re.search(r'name="pass" value="(.+?)"', body).group(1)), - ] - ) - ) - - except Exception as e: - # Something is wrong with the page. - # This may indicate Cloudflare has changed their anti-bot - # technique. If you see this and are running the latest version, - # please open a GitHub issue so I can update the code accordingly. - raise ValueError("Unable to parse Cloudflare anti-bots page: {} {}".format(e.message, BUG_REPORT)) - - # Solve the Javascript challenge - params['jschl_answer'] = self.solve_challenge(body, domain) - - # Requests transforms any request into a GET after a redirect, - # so the redirect has to be handled manually here to allow for - # performing other types of requests even as the first request. - method = resp.request.method - - cloudflare_kwargs['allow_redirects'] = False - - redirect = self.request(method, submit_url, **cloudflare_kwargs) - redirect_location = urlparse(redirect.headers['Location']) - if not redirect_location.netloc: - redirect_url = urlunparse( - ( - parsed_url.scheme, - domain, - redirect_location.path, - redirect_location.params, - redirect_location.query, - redirect_location.fragment - ) - ) - return self.request(method, redirect_url, **original_kwargs) - - return self.request(method, redirect.headers['Location'], **original_kwargs) - - def solve_challenge(self, body, domain): - try: - js = re.search( - r"setTimeout\(function\(\){\s+(var s,t,o,p,b,r,e,a,k,i,n,g,f.+?\r?\n[\s\S]+?a\.value =.+?)\r?\n", - body - ).group(1) - except Exception: - raise ValueError("Unable to identify Cloudflare IUAM Javascript on website. {}".format(BUG_REPORT)) - - js = re.sub(r"a\.value = ((.+).toFixed\(10\))?", r"\1", js) - js = re.sub(r'(e\s=\sfunction\(s\)\s{.*?};)', '', js, flags=re.DOTALL|re.MULTILINE) - js = re.sub(r"\s{3,}[a-z](?: = |\.).+", "", js).replace("t.length", str(len(domain))) - - js = js.replace('; 121', '') - - # Strip characters that could be used to exit the string context - # These characters are not currently used in Cloudflare's arithmetic snippet - js = re.sub(r"[\n\\']", "", js) - - if 'toFixed' not in js: - raise ValueError("Error parsing Cloudflare IUAM Javascript challenge. {}".format(BUG_REPORT)) - - try: - jsEnv = """ - var t = "{domain}"; - var g = String.fromCharCode; - - o = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - e = function(s) {{ - s += "==".slice(2 - (s.length & 3)); - var bm, r = "", r1, r2, i = 0; - for (; i < s.length;) {{ - bm = o.indexOf(s.charAt(i++)) << 18 | o.indexOf(s.charAt(i++)) << 12 | (r1 = o.indexOf(s.charAt(i++))) << 6 | (r2 = o.indexOf(s.charAt(i++))); - r += r1 === 64 ? g(bm >> 16 & 255) : r2 === 64 ? g(bm >> 16 & 255, bm >> 8 & 255) : g(bm >> 16 & 255, bm >> 8 & 255, bm & 255); - }} - return r; - }}; - - function italics (str) {{ return '<i>' + this + '</i>'; }}; - var document = {{ - getElementById: function () {{ - return {{'innerHTML': '{innerHTML}'}}; - }} - }}; - {js} - """ - - innerHTML = re.search( - '<div(?: [^<>]*)? id="([^<>]*?)">([^<>]*?)<\/div>', - body, - re.MULTILINE | re.DOTALL - ) - innerHTML = innerHTML.group(2).replace("'", r"\'") if innerHTML else "" - - js = jsunfuck(jsEnv.format(domain=domain, innerHTML=innerHTML, js=js)) - - def atob(s): - return base64.b64decode('{}'.format(s)).decode('utf-8') - - js2py.disable_pyimport() - context = js2py.EvalJs({'atob': atob}) - result = context.eval(js) - except Exception: - logging.error("Error executing Cloudflare IUAM Javascript. {}".format(BUG_REPORT)) - raise - - try: - float(result) - except Exception: - raise ValueError("Cloudflare IUAM challenge returned unexpected answer. {}".format(BUG_REPORT)) - - return result - - @classmethod - def create_scraper(cls, sess=None, **kwargs): - """ - Convenience function for creating a ready-to-go CloudflareScraper object. - """ - scraper = cls(**kwargs) - - if sess: - attrs = ['auth', 'cert', 'cookies', 'headers', 'hooks', 'params', 'proxies', 'data'] - for attr in attrs: - val = getattr(sess, attr, None) - if val: - setattr(scraper, attr, val) - - return scraper - - # Functions for integrating cloudflare-scrape with other applications and scripts - @classmethod - def get_tokens(cls, url, user_agent=None, debug=False, **kwargs): - scraper = cls.create_scraper() - scraper.debug = debug - - if user_agent: - scraper.headers['User-Agent'] = user_agent - - try: - resp = scraper.get(url, **kwargs) - resp.raise_for_status() - except Exception as e: - logging.error("'{}' returned an error. Could not collect tokens.".format(url)) - raise - - domain = urlparse(resp.url).netloc - cookie_domain = None - - for d in scraper.cookies.list_domains(): - if d.startswith('.') and d in ('.{}'.format(domain)): - cookie_domain = d - break - else: - raise ValueError("Unable to find Cloudflare cookies. Does the site actually have Cloudflare IUAM (\"I'm Under Attack Mode\") enabled?") - - return ( - { - '__cfduid': scraper.cookies.get('__cfduid', '', domain=cookie_domain), - 'cf_clearance': scraper.cookies.get('cf_clearance', '', domain=cookie_domain) - }, - scraper.headers['User-Agent'] - ) - - @classmethod - def get_cookie_string(cls, url, user_agent=None, debug=False, **kwargs): - """ - Convenience function for building a Cookie HTTP header value. - """ - tokens, user_agent = cls.get_tokens(url, user_agent=user_agent, debug=debug, **kwargs) - return "; ".join("=".join(pair) for pair in tokens.items()), user_agent - -create_scraper = CloudflareScraper.create_scraper -get_tokens = CloudflareScraper.get_tokens -get_cookie_string = CloudflareScraper.get_cookie_string diff --git a/Contents/Libraries/Shared/cfscrape/browsers.json b/Contents/Libraries/Shared/cfscrape/browsers.json deleted file mode 100644 index f1b7ad3c9..000000000 --- a/Contents/Libraries/Shared/cfscrape/browsers.json +++ /dev/null @@ -1,80 +0,0 @@ -[ - { - "connection": "close", - "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", - "user-agent": "Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.102 Safari/537.36", - "accept-encoding": "gzip,deflate", - "accept-language": "en-US,en;q=0.8" - }, - { - "connection": "close", - "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", - "user-agent": "Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.101 Safari/537.36", - "accept-encoding": "gzip,deflate", - "accept-language": "en-US,en;q=0.8" - }, - { - "connection": "close", - "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", - "upgrade-insecure-requests": "1", - "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36", - "accept-language": "en-US,en;q=0.8", - "accept-encoding": "gzip, deflate, " - }, - { - "connection": "close", - "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", - "upgrade-insecure-requests": "1", - "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36", - "accept-language": "en-US,en;q=0.8", - "accept-encoding": "gzip, deflate, " - }, - { - "connection": "close", - "accept": "*/*", - "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0" - }, - { - "connection": "close", - "accept": "image/jpeg, image/gif, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*", - "accept-language": "en-US", - "user-agent": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)", - "accept-encoding": "gzip, deflate" - }, - { - "connection": "close", - "accept": "text/html, application/xhtml+xml, */*", - "accept-language": "en-US", - "user-agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)", - "accept-encoding": "gzip, deflate" - }, - { - "connection": "close", - "accept": "text/html, application/xhtml+xml, */*", - "accept-language": "en-US", - "user-agent": "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)", - "accept-encoding": "gzip, deflate", - "dnt": "1" - }, - { - "connection": "close", - "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0", - "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", - "accept-language": "en-US,en;q=0.5", - "accept-encoding": "gzip, deflate" - }, - { - "connection": "close", - "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0", - "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", - "accept-language": "en-US,en;q=0.5", - "accept-encoding": "gzip, deflate" - }, - { - "connection": "close", - "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0", - "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", - "accept-language": "en-US,en;q=0.5", - "accept-encoding": "gzip, deflate" - } -] \ No newline at end of file diff --git a/Contents/Libraries/Shared/cfscrape/browsers_br.json b/Contents/Libraries/Shared/cfscrape/browsers_br.json deleted file mode 100644 index c3eab3155..000000000 --- a/Contents/Libraries/Shared/cfscrape/browsers_br.json +++ /dev/null @@ -1,336 +0,0 @@ -{ - "chrome": [ - { - "User-Agent": [ - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36" - ], - "headers": { - "Connection": "keep-alive", - "Upgrade-Insecure-Requests": "1", - "User-Agent": null, - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", - "Accept-Language": "en-US,en;q=0.8", - "Accept-Encoding": "gzip, deflate, , br" - } - }, - { - "User-Agent": [ - "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36" - ], - "headers": { - "Connection": "keep-alive", - "Upgrade-Insecure-Requests": "1", - "User-Agent": null, - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", - "Accept-Language": "en-US,en;q=0.8", - "Accept-Encoding": "gzip, deflate, br" - } - }, - { - "User-Agent": [ - "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36" - ], - "headers": { - "Connection": "keep-alive", - "Upgrade-Insecure-Requests": "1", - "User-Agent": null, - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", - "Accept-Language": "en-US,en;q=0.9", - "Accept-Encoding": "gzip, deflate, br" - } - }, - { - "User-Agent": [ - "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36" - ], - "headers": { - "Connection": "keep-alive", - "User-Agent": null, - "Upgrade-Insecure-Requests": "1", - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", - "Accept-Language": "en-US,en;q=0.9", - "Accept-Encoding": "gzip, deflate, br" - } - }, - { - "User-Agent": [ - "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.40 Safari/537.36", - "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.40 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36" - ], - "headers": { - "Connection": "keep-alive", - "Upgrade-Insecure-Requests": "1", - "User-Agent": null, - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", - "Accept-Language": "en-US,en;q=0.9", - "Accept-Encoding": "gzip, deflate, br" - } - }, - { - "User-Agent": [ - "Mozilla/5.0 (Linux; Android 8.1.0; SM-N960F Build/M1AJQ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 8.0.0; SM-G965F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 Build/OPD1.170816.010) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 8.0.0; Pixel Build/OPR6.170623.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 7.1.1; SM-A530F Build/NMF26X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 7.1; Pixel Build/NDE63H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 7.0; SM-G955F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 7.0; SM-G950F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 7.0; SM-T825 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", - "Mozilla/5.0 (Linux; Android 6.0.1; SM-G930F Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 6.0; Nexus 6 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 6.0; XT1092 Build/MPE24.49-18) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 6.0.1; SM-N910C Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 5.0.2; SM-G920F Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 5.0; Nexus 6 Build/LRX21O) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 9; Pixel 3 XL Build/PD1A.180720.030) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PD1A.180720.030) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 9; Pixel 2 Build/PPR1.180610.009) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/KRT16M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 4.4.2; SM-T530 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", - "Mozilla/5.0 (Linux; Android 4.4.4; SM-N910C Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 9 Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", - "Mozilla/5.0 (Linux; Android 7.1.1; SM-N950F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36" - ], - "headers": { - "Connection": "keep-alive", - "Upgrade-Insecure-Requests": "1", - "User-Agent": null, - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", - "Accept-Encoding": "gzip, deflate, br", - "Accept-Language": "en-US,en;q=0.9" - } - }, - { - "User-Agent": [ - "Mozilla/5.0 (Linux; Android 8.1.0; SM-T835 Build/M1AJQ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", - "Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", - "Mozilla/5.0 (Linux; Android 5.0; XT1092 Build/LXE22.46-19) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36" - ], - "headers": { - "Connection": "keep-alive", - "Upgrade-Insecure-Requests": "1", - "User-Agent": null, - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", - "Accept-Encoding": "gzip, deflate, br", - "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8" - } - } - ] -} diff --git a/Contents/Libraries/Shared/cfscrape/jsfuck.py b/Contents/Libraries/Shared/cfscrape/jsfuck.py deleted file mode 100644 index 9538a0ee1..000000000 --- a/Contents/Libraries/Shared/cfscrape/jsfuck.py +++ /dev/null @@ -1,97 +0,0 @@ -MAPPING = { - 'a': '(false+"")[1]', - 'b': '([]["entries"]()+"")[2]', - 'c': '([]["fill"]+"")[3]', - 'd': '(undefined+"")[2]', - 'e': '(true+"")[3]', - 'f': '(false+"")[0]', - 'g': '(false+[0]+String)[20]', - 'h': '(+(101))["to"+String["name"]](21)[1]', - 'i': '([false]+undefined)[10]', - 'j': '([]["entries"]()+"")[3]', - 'k': '(+(20))["to"+String["name"]](21)', - 'l': '(false+"")[2]', - 'm': '(Number+"")[11]', - 'n': '(undefined+"")[1]', - 'o': '(true+[]["fill"])[10]', - 'p': '(+(211))["to"+String["name"]](31)[1]', - 'q': '(+(212))["to"+String["name"]](31)[1]', - 'r': '(true+"")[1]', - 's': '(false+"")[3]', - 't': '(true+"")[0]', - 'u': '(undefined+"")[0]', - 'v': '(+(31))["to"+String["name"]](32)', - 'w': '(+(32))["to"+String["name"]](33)', - 'x': '(+(101))["to"+String["name"]](34)[1]', - 'y': '(NaN+[Infinity])[10]', - 'z': '(+(35))["to"+String["name"]](36)', - 'A': '(+[]+Array)[10]', - 'B': '(+[]+Boolean)[10]', - 'C': 'Function("return escape")()(("")["italics"]())[2]', - 'D': 'Function("return escape")()([]["fill"])["slice"]("-1")', - 'E': '(RegExp+"")[12]', - 'F': '(+[]+Function)[10]', - 'G': '(false+Function("return Date")()())[30]', - 'I': '(Infinity+"")[0]', - 'M': '(true+Function("return Date")()())[30]', - 'N': '(NaN+"")[0]', - 'O': '(NaN+Function("return{}")())[11]', - 'R': '(+[]+RegExp)[10]', - 'S': '(+[]+String)[10]', - 'T': '(NaN+Function("return Date")()())[30]', - 'U': '(NaN+Function("return{}")()["to"+String["name"]]["call"]())[11]', - ' ': '(NaN+[]["fill"])[11]', - '"': '("")["fontcolor"]()[12]', - '%': 'Function("return escape")()([]["fill"])[21]', - '&': '("")["link"](0+")[10]', - '(': '(undefined+[]["fill"])[22]', - ')': '([0]+false+[]["fill"])[20]', - '+': '(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[2]', - ',': '([]["slice"]["call"](false+"")+"")[1]', - '-': '(+(.+[0000000001])+"")[2]', - '.': '(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]', - '/': '(false+[0])["italics"]()[10]', - ':': '(RegExp()+"")[3]', - ';': '("")["link"](")[14]', - '<': '("")["italics"]()[0]', - '=': '("")["fontcolor"]()[11]', - '>': '("")["italics"]()[2]', - '?': '(RegExp()+"")[2]', - '[': '([]["entries"]()+"")[0]', - ']': '([]["entries"]()+"")[22]', - '{': '(true+[]["fill"])[20]', - '}': '([]["fill"]+"")["slice"]("-1")' -} - -SIMPLE = { - 'false': '![]', - 'true': '!![]', - 'undefined': '[][[]]', - 'NaN': '+[![]]', - 'Infinity': '+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])' # +"1e1000" -} - -CONSTRUCTORS = { - 'Array': '[]', - 'Number': '(+[])', - 'String': '([]+[])', - 'Boolean': '(![])', - 'Function': '[]["fill"]', - 'RegExp': 'Function("return/"+false+"/")()' -} - -def jsunfuck(jsfuckString): - - for key in sorted(MAPPING, key=lambda k: len(MAPPING[k]), reverse=True): - if MAPPING.get(key) in jsfuckString: - jsfuckString = jsfuckString.replace(MAPPING.get(key), '"{}"'.format(key)) - - for key in sorted(SIMPLE, key=lambda k: len(SIMPLE[k]), reverse=True): - if SIMPLE.get(key) in jsfuckString: - jsfuckString = jsfuckString.replace(SIMPLE.get(key), '{}'.format(key)) - - #for key in sorted(CONSTRUCTORS, key=lambda k: len(CONSTRUCTORS[k]), reverse=True): - # if CONSTRUCTORS.get(key) in jsfuckString: - # jsfuckString = jsfuckString.replace(CONSTRUCTORS.get(key), '{}'.format(key)) - - return jsfuckString \ No newline at end of file From df48e8fccde0a83de319f962667b0f689a025104 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 04:27:11 +0200 Subject: [PATCH 492/710] providers: subscene: remove obsolete imports --- .../Libraries/Shared/subliminal_patch/providers/subscene.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 0025470cf..2dc38b691 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -5,16 +5,11 @@ import os import time import inflect -import cfscrape -from random import randint from zipfile import ZipFile - from babelfish import language_converters from guessit import guessit -from dogpile.cache.api import NO_VALUE from subliminal import Episode, ProviderError -from subliminal.cache import region from subliminal.utils import sanitize_release_group from subliminal_patch.http import RetryingCFSession from subliminal_patch.providers import Provider From 4e6421b928501f2415542eb801e0bd76fb1d7768 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 04:36:03 +0200 Subject: [PATCH 493/710] core: dns: set env var empty if not configured --- Contents/Code/support/config.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index fc9d16584..bf57dd7d6 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -1083,6 +1083,7 @@ def text_based_formats(self): def parse_custom_dns(self): custom_dns = Prefs['use_custom_dns2'].strip() + os.environ["dns_resolvers"] = "" if custom_dns: ips = filter(lambda x: x, [d.strip() for d in custom_dns.split(",")]) if ips: From a7cc4706450d57461d395ef46bd3b4d35d06346f Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 04:48:48 +0200 Subject: [PATCH 494/710] core: log cf domain --- Contents/Libraries/Shared/cloudscraper/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/cloudscraper/__init__.py b/Contents/Libraries/Shared/cloudscraper/__init__.py index 644993d70..e89799f48 100644 --- a/Contents/Libraries/Shared/cloudscraper/__init__.py +++ b/Contents/Libraries/Shared/cloudscraper/__init__.py @@ -152,6 +152,8 @@ def request(self, method, url, *args, **kwargs): resp = self.sendChallengeResponse(resp, **kwargs) except NeedsCaptchaException: self.was_cf_request = True + parsed_url = urlparse(url) + domain = parsed_url.netloc # solve the captcha site_key = re.search(r'data-sitekey="(.+?)"', resp.content).group(1) challenge_s = re.search(r'type="hidden" name="s" value="(.+?)"', resp.content).group(1) @@ -159,13 +161,12 @@ def request(self, method, url, *args, **kwargs): if not all([site_key, challenge_s, challenge_ray]): raise Exception("cf: Captcha site-key not found!") - pitcher = pitchers.get_pitcher()("cf", resp.request.url, site_key, + pitcher = pitchers.get_pitcher()("cf: %s" % domain, resp.request.url, site_key, user_agent=self.headers["User-Agent"], cookies=self.cookies.get_dict(), is_invisible=True) parsed_url = urlparse(resp.url) - domain = parsed_url.netloc logger.info("cf: %s: Solving captcha", domain) result = pitcher.throw() if not result: From df607e5772e34690296c1b025fe38e641a249a65 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 04:49:30 +0200 Subject: [PATCH 495/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 644864098..dc560547a 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3041</string> + <string>2.6.5.3055</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3041 DEV +Version 2.6.5.3055 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From e9289182018a097346952290499d74b0bfac3885 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 05:13:13 +0200 Subject: [PATCH 496/710] add cloudscaper LICENSE --- Licenses/cloudscaper/LICENSE.txt | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Licenses/cloudscaper/LICENSE.txt diff --git a/Licenses/cloudscaper/LICENSE.txt b/Licenses/cloudscaper/LICENSE.txt new file mode 100644 index 000000000..548bfc029 --- /dev/null +++ b/Licenses/cloudscaper/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 VeNoMouS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From fb2210f2fd9003b68f78f4c878f4428ec4aa0d4f Mon Sep 17 00:00:00 2001 From: fossabot <badges@fossa.io> Date: Tue, 30 Apr 2019 20:44:05 -0700 Subject: [PATCH 497/710] Add license scan report and status Signed-off-by: fossabot <badges@fossa.io> --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bd551e5be..a90b108ba 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Sub-Zero for Plex -[![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle.svg?style=flat&label=stable)](https://github.com/pannal/Sub-Zero.bundle/releases/latest)<!--[![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle/all.svg?maxAge=2592000&label=testing+2.0+RC9)](https://github.com/pannal/Sub-Zero.bundle/releases)--> [![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)]() +[![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle.svg?style=flat&label=stable)](https://github.com/pannal/Sub-Zero.bundle/releases/latest)<!--[![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle/all.svg?maxAge=2592000&label=testing+2.0+RC9)](https://github.com/pannal/Sub-Zero.bundle/releases)--> [![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)][![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle?ref=badge_shield) +() [![Maintenance](https://img.shields.io/maintenance/yes/2019.svg)]() [![Slack Status](https://szslack.fragstore.net/badge.svg)](https://szslack.fragstore.net) @@ -143,3 +144,7 @@ Changelog Subtitles provided by [OpenSubtitles.org](http://www.opensubtitles.org/), [Podnapisi.NET](https://www.podnapisi.net/), [TVSubtitles.net](http://www.tvsubtitles.net/), [Addic7ed.com](http://www.addic7ed.com/), [Legendas TV](http://legendas.tv/), [Napi Projekt](http://www.napiprojekt.pl/), [Shooter](http://shooter.cn/), [Titlovi](http://titlovi.com), [aRGENTeaM](http://argenteam.net), [SubScene](https://subscene.com/), [Hosszupuska](http://hosszupuskasub.com/) [3rd party licenses](https://github.com/pannal/Sub-Zero.bundle/tree/master/Licenses) + + +## License +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle?ref=badge_large) \ No newline at end of file From 861a25be41751fa4616758f4ca45489840953bf3 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Wed, 1 May 2019 05:59:21 +0200 Subject: [PATCH 498/710] Update README.md --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a90b108ba..a46f61b28 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@ # Sub-Zero for Plex -[![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle.svg?style=flat&label=stable)](https://github.com/pannal/Sub-Zero.bundle/releases/latest)<!--[![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle/all.svg?maxAge=2592000&label=testing+2.0+RC9)](https://github.com/pannal/Sub-Zero.bundle/releases)--> [![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)][![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle?ref=badge_shield) -() +[![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle.svg?style=flat&label=stable)](https://github.com/pannal/Sub-Zero.bundle/releases/latest) +[![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)] [![Maintenance](https://img.shields.io/maintenance/yes/2019.svg)]() [![Slack Status](https://szslack.fragstore.net/badge.svg)](https://szslack.fragstore.net) +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle?ref=badge_shield) +() <img src="https://raw.githubusercontent.com/pannal/Sub-Zero.bundle/master/Contents/Resources/subzero.gif" align="left" height="100"> <font size="5"><b>Subtitles done right!</b></font><br /> @@ -147,4 +149,4 @@ Subtitles provided by [OpenSubtitles.org](http://www.opensubtitles.org/), [Podna ## License -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle?ref=badge_large) \ No newline at end of file +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle?ref=badge_large) From b4f08f61a65ad06c78d1a132b4a4b5df5a5c7aa3 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Wed, 1 May 2019 06:00:01 +0200 Subject: [PATCH 499/710] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index a46f61b28..91b43924a 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,9 @@ # Sub-Zero for Plex [![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle.svg?style=flat&label=stable)](https://github.com/pannal/Sub-Zero.bundle/releases/latest) -[![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)] +[![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)]() [![Maintenance](https://img.shields.io/maintenance/yes/2019.svg)]() [![Slack Status](https://szslack.fragstore.net/badge.svg)](https://szslack.fragstore.net) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle?ref=badge_shield) -() <img src="https://raw.githubusercontent.com/pannal/Sub-Zero.bundle/master/Contents/Resources/subzero.gif" align="left" height="100"> <font size="5"><b>Subtitles done right!</b></font><br /> From d44298993c1220eaa106f3275eea19262da1742c Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 15:32:19 +0200 Subject: [PATCH 500/710] Release 2.6.5.3055 --- CHANGELOG.md | 35 +++++++++++++++++++++++++++++++++++ Contents/Info.plist | 6 +++--- README.md | 44 ++++++++------------------------------------ 3 files changed, 46 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57a8ad919..78ee89578 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,39 @@ + +2.6.5.3017 + +Changelog +- core: SRT parsing: handle (bad) ASS color tag in SRT +- core: auto extract embedded: only use one unknown sub for first language +- core: better embedded streams language detection +- core: optimizations +- core: extract embedded: fix is_unknown check +- core: don't raise exception when subtitle not found inside archive +- core: search external subtitles: fix condition +- core: better plex transcoder path detection +- core: use Log.Warn instead of Log.Warning (#619, #629, #633) +- core: also check for "plex transcoder.exe" in case of windows (fixes #619) +- core: auto extract: use mbcs encoding for paths on windows +- core: Fix issue scandir not returning the name of the file inside Docker images on ARM systems. (thanks @giejay) +- core: also clean PYTHONHOME when calling external notification app +- core: update certifi to 2019.3.9 +- core: scan_video: add series/title as alternative by scanning filename itself without parent folders +- core: add generic solution for solving captchas using anti captcha services +- core: increase cache time to 180d (was: 30d) +- core: guess_matches: handle multiple title matches; fixes bazarr#403 +- windows: fix compatibility issues with plex transcoder +- compat: use lowercase paths on subtitle detection +- providers: addic7ed: re-enable (using paid anti captch service) +- providers: assrt: assume undefined Chinese flavor as Simplified (chs/zho-Hans) +- providers: subscene: make it work again by bypassing cf +- providers: subscene: don't fail on missing cover +- providers: titlovi: re-enable (might need paid anti captch service) +- providers: opensubtitles: fix only_foreign handling +- providers: opensubtitles: show subtitles with possibly mismatched series when manually listing subs +- menu: list subtitles: show subtitles with bad season/episode values as well +- refiners: omdb: fix imdb ids with spaces + + 2.6.4.2911 - core: improve file cache (windows especially); use fixed-length cache filenames; fixes #600 - core: don't log "Checking connections ..." when sonarr/radarr not activated diff --git a/Contents/Info.plist b/Contents/Info.plist index dc560547a..c7c25cb06 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3055</string> + <string>2.6.5.3062</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3055 DEV +Version 2.6.5.3062 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 91b43924a..de64025f1 100644 --- a/README.md +++ b/README.md @@ -90,13 +90,20 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3041 + +2.6.5.3062 subscene, addic7ed and titlovi - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog +- core: cf: optimize +- core: http: don't query DNS with IPs. thanks @fgump (fixes sonarr/radarr) + + +2.6.5.3041 +Changelog - core: only reference guessed title if there actually is one - core: cf: optimize - core/config: add setting for one existing language to be enough, fixes #491 @@ -104,41 +111,6 @@ Changelog - providers: titlovi: prevent repeated captcha solving for CF -2.6.5.3017 - -Changelog -- core: SRT parsing: handle (bad) ASS color tag in SRT -- core: auto extract embedded: only use one unknown sub for first language -- core: better embedded streams language detection -- core: optimizations -- core: extract embedded: fix is_unknown check -- core: don't raise exception when subtitle not found inside archive -- core: search external subtitles: fix condition -- core: better plex transcoder path detection -- core: use Log.Warn instead of Log.Warning (#619, #629, #633) -- core: also check for "plex transcoder.exe" in case of windows (fixes #619) -- core: auto extract: use mbcs encoding for paths on windows -- core: Fix issue scandir not returning the name of the file inside Docker images on ARM systems. (thanks @giejay) -- core: also clean PYTHONHOME when calling external notification app -- core: update certifi to 2019.3.9 -- core: scan_video: add series/title as alternative by scanning filename itself without parent folders -- core: add generic solution for solving captchas using anti captcha services -- core: increase cache time to 180d (was: 30d) -- core: guess_matches: handle multiple title matches; fixes bazarr#403 -- windows: fix compatibility issues with plex transcoder -- compat: use lowercase paths on subtitle detection -- providers: addic7ed: re-enable (using paid anti captch service) -- providers: assrt: assume undefined Chinese flavor as Simplified (chs/zho-Hans) -- providers: subscene: make it work again by bypassing cf -- providers: subscene: don't fail on missing cover -- providers: titlovi: re-enable (might need paid anti captch service) -- providers: opensubtitles: fix only_foreign handling -- providers: opensubtitles: show subtitles with possibly mismatched series when manually listing subs -- menu: list subtitles: show subtitles with bad season/episode values as well -- refiners: omdb: fix imdb ids with spaces - - - [older changes](CHANGELOG.md) From 92d0d70258a9c544376df365ed8de670ad18d061 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 15:32:36 +0200 Subject: [PATCH 501/710] Release 2.6.5.3062 --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78ee89578..116b95866 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,4 @@ - 2.6.5.3017 Changelog From 03c934cf21d1e4fdaf5b6f159620ab8b98d36677 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 1 May 2019 15:39:14 +0200 Subject: [PATCH 502/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index c7c25cb06..ad1ca35ae 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3062 +Version 2.6.5.3062 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 97e93cd10aa33451ec893c20a32a5ff0549910ad Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 8 May 2019 01:31:21 +0200 Subject: [PATCH 503/710] core: cf: update js2py; update cloudscraper to 1.1.5; --- .../Libraries/Shared/cloudscraper/__init__.py | 87 ++++----------- .../cloudscraper/interpreters/__init__.py | 4 +- Contents/Libraries/Shared/js2py/base.py | 13 +-- Contents/Libraries/Shared/js2py/evaljs.py | 2 + .../Libraries/Shared/js2py/internals/base.py | 18 +-- .../Shared/js2py/internals/byte_trans.py | 23 ++-- .../Libraries/Shared/js2py/internals/code.py | 66 ++++++++--- .../internals/constructors/jsfunction.py | 3 +- .../Shared/js2py/internals/conversions.py | 11 +- .../Shared/js2py/internals/fill_space.py | 45 ++++---- .../Shared/js2py/internals/func_utils.py | 4 +- .../Shared/js2py/internals/opcodes.py | 4 +- .../Shared/js2py/internals/operations.py | 4 +- .../js2py/internals/prototypes/jsstring.py | 2 +- .../Libraries/Shared/js2py/internals/seval.py | 21 ++-- .../Shared/js2py/internals/simplex.py | 33 +++++- .../Libraries/Shared/js2py/internals/space.py | 4 +- .../Shared/js2py/internals/trans_utils.py | 7 ++ .../Shared/js2py/prototypes/jsfunction.py | 5 +- .../js2py/translators/translating_nodes.py | 2 +- .../Libraries/Shared/subliminal_patch/http.py | 105 +++++++++++++++--- 21 files changed, 272 insertions(+), 191 deletions(-) diff --git a/Contents/Libraries/Shared/cloudscraper/__init__.py b/Contents/Libraries/Shared/cloudscraper/__init__.py index e89799f48..b34065ecb 100644 --- a/Contents/Libraries/Shared/cloudscraper/__init__.py +++ b/Contents/Libraries/Shared/cloudscraper/__init__.py @@ -1,11 +1,7 @@ +import logging import re +import sys import ssl -try: - import brotli -except ImportError: - brotli = None - -import logging from copy import deepcopy from time import sleep @@ -14,7 +10,6 @@ from requests.sessions import Session from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.ssl_ import create_urllib3_context -from subliminal_patch.pitcher import pitchers from .interpreters import JavaScriptInterpreter from .user_agent import User_Agent @@ -24,6 +19,11 @@ except ImportError: pass +try: + import brotli +except ImportError: + pass + try: from urlparse import urlparse from urlparse import urlunparse @@ -31,11 +31,9 @@ from urllib.parse import urlparse from urllib.parse import urlunparse -logger = logging.getLogger(__name__) - ########################################################################################################################################################## -__version__ = '1.1.1' +__version__ = '1.1.5' BUG_REPORT = 'Cloudflare may have changed their technique, or there may be a bug in the script.' @@ -63,21 +61,15 @@ def proxy_manager_for(self, *args, **kwargs): ########################################################################################################################################################## -class NeedsCaptchaException(Exception): - pass - - class CloudScraper(Session): - was_cf_request = False - def __init__(self, *args, **kwargs): self.debug = kwargs.pop('debug', False) self.delay = kwargs.pop('delay', None) self.interpreter = kwargs.pop('interpreter', 'js2py') - self.allow_brotli = kwargs.pop('allow_brotli', True) and bool(brotli) + self.allow_brotli = kwargs.pop('allow_brotli', True if 'brotli' in sys.modules.keys() else False) self.cipherSuite = None - super(CloudScraper, self).__init__() + super(CloudScraper, self).__init__(*args, **kwargs) if 'requests' in self.headers['User-Agent']: # Set a random User-Agent if no custom User-Agent has been set @@ -139,54 +131,15 @@ def request(self, method, url, *args, **kwargs): self.debugRequest(resp) # Check if Cloudflare anti-bot is on - try: - if self.isChallengeRequest(resp): - self.was_cf_request = True - if resp.request.method != 'GET': - # Work around if the initial request is not a GET, - # Supersede with a GET then re-request the original METHOD. - self.request('GET', resp.url) - resp = ourSuper.request(method, url, *args, **kwargs) - else: - # Solve Challenge - resp = self.sendChallengeResponse(resp, **kwargs) - except NeedsCaptchaException: - self.was_cf_request = True - parsed_url = urlparse(url) - domain = parsed_url.netloc - # solve the captcha - site_key = re.search(r'data-sitekey="(.+?)"', resp.content).group(1) - challenge_s = re.search(r'type="hidden" name="s" value="(.+?)"', resp.content).group(1) - challenge_ray = re.search(r'data-ray="(.+?)"', resp.content).group(1) - if not all([site_key, challenge_s, challenge_ray]): - raise Exception("cf: Captcha site-key not found!") - - pitcher = pitchers.get_pitcher()("cf: %s" % domain, resp.request.url, site_key, - user_agent=self.headers["User-Agent"], - cookies=self.cookies.get_dict(), - is_invisible=True) - - parsed_url = urlparse(resp.url) - logger.info("cf: %s: Solving captcha", domain) - result = pitcher.throw() - if not result: - raise Exception("cf: Couldn't solve captcha!") - - submit_url = '{}://{}/cdn-cgi/l/chk_captcha'.format(parsed_url.scheme, domain) - method = resp.request.method - - cloudflare_kwargs = { - 'allow_redirects': False, - 'headers': {'Referer': resp.url}, - 'params': OrderedDict( - [ - ('s', challenge_s), - ('g-recaptcha-response', result) - ] - ) - } - - return self.request(method, submit_url, **cloudflare_kwargs) + if self.isChallengeRequest(resp): + if resp.request.method != 'GET': + # Work around if the initial request is not a GET, + # Supersede with a GET then re-request the original METHOD. + self.request('GET', resp.url) + resp = ourSuper.request(method, url, *args, **kwargs) + else: + # Solve Challenge + resp = self.sendChallengeResponse(resp, **kwargs) return resp @@ -196,7 +149,7 @@ def request(self, method, url, *args, **kwargs): def isChallengeRequest(resp): if resp.headers.get('Server', '').startswith('cloudflare'): if b'why_captcha' in resp.content or b'/cdn-cgi/l/chk_captcha' in resp.content: - raise NeedsCaptchaException + raise ValueError('Captcha') return ( resp.status_code in [429, 503] diff --git a/Contents/Libraries/Shared/cloudscraper/interpreters/__init__.py b/Contents/Libraries/Shared/cloudscraper/interpreters/__init__.py index f915e4695..b6ee8a8a1 100644 --- a/Contents/Libraries/Shared/cloudscraper/interpreters/__init__.py +++ b/Contents/Libraries/Shared/cloudscraper/interpreters/__init__.py @@ -52,10 +52,10 @@ def solveChallenge(self, body, domain): js += '\na.value;' jsEnv = ''' - function italics (str) {{ return "<i>" + this + "</i>"; }}; + String.prototype.italics=function(str) {{return "<i>" + this + "</i>";}}; var document = {{ createElement: function () {{ - return {{ firstChild: {{ href: "http://{domain}/" }} }} + return {{ firstChild: {{ href: "https://{domain}/" }} }} }}, getElementById: function () {{ return {{"innerHTML": "{innerHTML}"}}; diff --git a/Contents/Libraries/Shared/js2py/base.py b/Contents/Libraries/Shared/js2py/base.py index 67c80d599..cf1eca08d 100644 --- a/Contents/Libraries/Shared/js2py/base.py +++ b/Contents/Libraries/Shared/js2py/base.py @@ -5,6 +5,7 @@ from .translators.friendly_nodes import REGEXP_CONVERTER from .utils.injector import fix_js_args from types import FunctionType, ModuleType, GeneratorType, BuiltinFunctionType, MethodType, BuiltinMethodType +from math import floor, log10 import traceback try: import numpy @@ -603,15 +604,7 @@ def to_string(self): elif typ == 'Boolean': return Js('true') if self.value else Js('false') elif typ == 'Number': #or self.Class=='Number': - if self.is_nan(): - return Js('NaN') - elif self.is_infinity(): - sign = '-' if self.value < 0 else '' - return Js(sign + 'Infinity') - elif isinstance(self.value, - long) or self.value.is_integer(): # dont print .0 - return Js(unicode(int(self.value))) - return Js(unicode(self.value)) # accurate enough + return Js(unicode(js_dtoa(self.value))) elif typ == 'String': return self else: #object @@ -1046,7 +1039,7 @@ def PyJsComma(a, b): return b -from .internals.simplex import JsException as PyJsException +from .internals.simplex import JsException as PyJsException, js_dtoa import pyjsparser pyjsparser.parser.ENABLE_JS2PY_ERRORS = lambda msg: MakeError('SyntaxError', msg) diff --git a/Contents/Libraries/Shared/js2py/evaljs.py b/Contents/Libraries/Shared/js2py/evaljs.py index 3f5eeee53..64eea5c4c 100644 --- a/Contents/Libraries/Shared/js2py/evaljs.py +++ b/Contents/Libraries/Shared/js2py/evaljs.py @@ -116,10 +116,12 @@ def eval_js(js): def eval_js6(js): + """Just like eval_js but with experimental support for js6 via babel.""" return eval_js(js6_to_js5(js)) def translate_js6(js): + """Just like translate_js but with experimental support for js6 via babel.""" return translate_js(js6_to_js5(js)) diff --git a/Contents/Libraries/Shared/js2py/internals/base.py b/Contents/Libraries/Shared/js2py/internals/base.py index ec277c64d..a02a21229 100644 --- a/Contents/Libraries/Shared/js2py/internals/base.py +++ b/Contents/Libraries/Shared/js2py/internals/base.py @@ -3,15 +3,19 @@ import datetime -from desc import * -from simplex import * -from conversions import * -import six +from .desc import * +from .simplex import * +from .conversions import * + from pyjsparser import PyJsParser -from itertools import izip -from conversions import * -from simplex import * +import six +if six.PY2: + from itertools import izip +else: + izip = zip + + def Type(obj): diff --git a/Contents/Libraries/Shared/js2py/internals/byte_trans.py b/Contents/Libraries/Shared/js2py/internals/byte_trans.py index 87fab4b4e..e32bcb1e2 100644 --- a/Contents/Libraries/Shared/js2py/internals/byte_trans.py +++ b/Contents/Libraries/Shared/js2py/internals/byte_trans.py @@ -1,8 +1,8 @@ -from code import Code -from simplex import MakeError -from opcodes import * -from operations import * -from trans_utils import * +from .code import Code +from .simplex import MakeError +from .opcodes import * +from .operations import * +from .trans_utils import * SPECIAL_IDENTIFIERS = {'true', 'false', 'this'} @@ -465,10 +465,11 @@ def ObjectExpression(self, properties, **kwargs): self.emit('LOAD_OBJECT', tuple(data)) def Program(self, body, **kwargs): + old_tape_len = len(self.exe.tape) self.emit('LOAD_UNDEFINED') self.emit(body) # add function tape ! - self.exe.tape = self.function_declaration_tape + self.exe.tape + self.exe.tape = self.exe.tape[:old_tape_len] + self.function_declaration_tape + self.exe.tape[old_tape_len:] def Pyimport(self, imp, **kwargs): raise NotImplementedError( @@ -735,17 +736,17 @@ def main(): # # } a.emit(d) - print a.declared_vars - print a.exe.tape - print len(a.exe.tape) + print(a.declared_vars) + print(a.exe.tape) + print(len(a.exe.tape)) a.exe.compile() def log(this, args): - print args[0] + print(args[0]) return 999 - print a.exe.run(a.exe.space.GlobalObj) + print(a.exe.run(a.exe.space.GlobalObj)) if __name__ == '__main__': diff --git a/Contents/Libraries/Shared/js2py/internals/code.py b/Contents/Libraries/Shared/js2py/internals/code.py index 6bd6739fd..9af0e602b 100644 --- a/Contents/Libraries/Shared/js2py/internals/code.py +++ b/Contents/Libraries/Shared/js2py/internals/code.py @@ -1,16 +1,17 @@ -from opcodes import * -from space import * -from base import * +from .opcodes import * +from .space import * +from .base import * class Code: '''Can generate, store and run sequence of ops representing js code''' - def __init__(self, is_strict=False): + def __init__(self, is_strict=False, debug_mode=False): self.tape = [] self.compiled = False self.label_locs = None self.is_strict = is_strict + self.debug_mode = debug_mode self.contexts = [] self.current_ctx = None @@ -22,6 +23,10 @@ def __init__(self, is_strict=False): self.GLOBAL_THIS = None self.space = None + # dbg + self.ctx_depth = 0 + + def get_new_label(self): self._label_count += 1 return self._label_count @@ -74,21 +79,35 @@ def execute_fragment_under_context(self, ctx, start_label, end_label): # 0=normal, 1=return, 2=jump_outside, 3=errors # execute_fragment_under_context returns: # (return_value, typ, return_value/jump_loc/py_error) - # ctx.stack must be len 1 and its always empty after the call. + # IMPARTANT: It is guaranteed that the length of the ctx.stack is unchanged. ''' old_curr_ctx = self.current_ctx + self.ctx_depth += 1 + old_stack_len = len(ctx.stack) + old_ret_len = len(self.return_locs) + old_ctx_len = len(self.contexts) try: self.current_ctx = ctx return self._execute_fragment_under_context( ctx, start_label, end_label) except JsException as err: - # undo the things that were put on the stack (if any) - # don't worry, I know the recovery is possible through try statement and for this reason try statement - # has its own context and stack so it will not delete the contents of the outer stack - del ctx.stack[:] + if self.debug_mode: + self._on_fragment_exit("js errors") + # undo the things that were put on the stack (if any) to ensure a proper error recovery + del ctx.stack[old_stack_len:] + del self.return_locs[old_ret_len:] + del self.contexts[old_ctx_len :] return undefined, 3, err finally: + self.ctx_depth -= 1 self.current_ctx = old_curr_ctx + assert old_stack_len == len(ctx.stack) + + def _get_dbg_indent(self): + return self.ctx_depth * ' ' + + def _on_fragment_exit(self, mode): + print(self._get_dbg_indent() + 'ctx exit (%s)' % mode) def _execute_fragment_under_context(self, ctx, start_label, end_label): start, end = self.label_locs[start_label], self.label_locs[end_label] @@ -97,16 +116,20 @@ def _execute_fragment_under_context(self, ctx, start_label, end_label): entry_level = len(self.contexts) # for e in self.tape[start:end]: # print e - + if self.debug_mode: + print(self._get_dbg_indent() + 'ctx entry (from:%d, to:%d)' % (start, end)) while loc < len(self.tape): - #print loc, self.tape[loc] if len(self.contexts) == entry_level and loc >= end: + if self.debug_mode: + self._on_fragment_exit('normal') assert loc == end - assert len(ctx.stack) == ( - 1 + initial_len), 'Stack change must be equal to +1!' + delta_stack = len(ctx.stack) - initial_len + assert delta_stack == +1, 'Stack change must be equal to +1! got %d' % delta_stack return ctx.stack.pop(), 0, None # means normal return # execute instruction + if self.debug_mode: + print(self._get_dbg_indent() + str(loc), self.tape[loc]) status = self.tape[loc].eval(ctx) # check status for special actions @@ -116,9 +139,10 @@ def _execute_fragment_under_context(self, ctx, start_label, end_label): if len(self.contexts) == entry_level: # check if jumped outside of the fragment and break if so if not start <= loc < end: - assert len(ctx.stack) == ( - 1 + initial_len - ), 'Stack change must be equal to +1!' + if self.debug_mode: + self._on_fragment_exit('jump outside loc:%d label:%d' % (loc, status)) + delta_stack = len(ctx.stack) - initial_len + assert delta_stack == +1, 'Stack change must be equal to +1! got %d' % delta_stack return ctx.stack.pop(), 2, status # jump outside continue @@ -137,7 +161,10 @@ def _execute_fragment_under_context(self, ctx, start_label, end_label): # return: (None, None) else: if len(self.contexts) == entry_level: - assert len(ctx.stack) == 1 + initial_len + if self.debug_mode: + self._on_fragment_exit('return') + delta_stack = len(ctx.stack) - initial_len + assert delta_stack == +1, 'Stack change must be equal to +1! got %d' % delta_stack return undefined, 1, ctx.stack.pop( ) # return signal return_value = ctx.stack.pop() @@ -149,6 +176,8 @@ def _execute_fragment_under_context(self, ctx, start_label, end_label): continue # next instruction loc += 1 + if self.debug_mode: + self._on_fragment_exit('internal error - unexpected end of tape, will crash') assert False, 'Remember to add NOP at the end!' def run(self, ctx, starting_loc=0): @@ -156,7 +185,8 @@ def run(self, ctx, starting_loc=0): self.current_ctx = ctx while loc < len(self.tape): # execute instruction - #print loc, self.tape[loc] + if self.debug_mode: + print(loc, self.tape[loc]) status = self.tape[loc].eval(ctx) # check status for special actions diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsfunction.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsfunction.py index 9728fb382..d62731ac3 100644 --- a/Contents/Libraries/Shared/js2py/internals/constructors/jsfunction.py +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsfunction.py @@ -42,6 +42,7 @@ def executable_code(code_str, space, global_context=True): space.byte_generator.emit('LABEL', skip) space.byte_generator.emit('NOP') space.byte_generator.restore_state() + space.byte_generator.exe.compile( start_loc=old_tape_len ) # dont read the code from the beginning, dont be stupid! @@ -71,5 +72,5 @@ def _eval(this, args): def log(this, args): - print ' '.join(map(to_string, args)) + print(' '.join(map(to_string, args))) return undefined diff --git a/Contents/Libraries/Shared/js2py/internals/conversions.py b/Contents/Libraries/Shared/js2py/internals/conversions.py index b90a427d2..8b2c7c308 100644 --- a/Contents/Libraries/Shared/js2py/internals/conversions.py +++ b/Contents/Libraries/Shared/js2py/internals/conversions.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals # Type Conversions. to_type. All must return PyJs subclass instance -from simplex import * +from .simplex import * def to_primitive(self, hint=None): @@ -73,14 +73,7 @@ def to_string(self): elif typ == 'Boolean': return 'true' if self else 'false' elif typ == 'Number': # or self.Class=='Number': - if is_nan(self): - return 'NaN' - elif is_infinity(self): - sign = '-' if self < 0 else '' - return sign + 'Infinity' - elif int(self) == self: # integer value! - return unicode(int(self)) - return unicode(self) # todo make it print exactly like node.js + return js_dtoa(self) else: # object return to_string(to_primitive(self, 'String')) diff --git a/Contents/Libraries/Shared/js2py/internals/fill_space.py b/Contents/Libraries/Shared/js2py/internals/fill_space.py index 9aa9c4d21..329c8b28f 100644 --- a/Contents/Libraries/Shared/js2py/internals/fill_space.py +++ b/Contents/Libraries/Shared/js2py/internals/fill_space.py @@ -1,29 +1,22 @@ from __future__ import unicode_literals -from base import Scope -from func_utils import * -from conversions import * +from .base import Scope +from .func_utils import * +from .conversions import * import six -from prototypes.jsboolean import BooleanPrototype -from prototypes.jserror import ErrorPrototype -from prototypes.jsfunction import FunctionPrototype -from prototypes.jsnumber import NumberPrototype -from prototypes.jsobject import ObjectPrototype -from prototypes.jsregexp import RegExpPrototype -from prototypes.jsstring import StringPrototype -from prototypes.jsarray import ArrayPrototype -import prototypes.jsjson as jsjson -import prototypes.jsutils as jsutils - -from constructors import jsnumber -from constructors import jsstring -from constructors import jsarray -from constructors import jsboolean -from constructors import jsregexp -from constructors import jsmath -from constructors import jsobject -from constructors import jsfunction -from constructors import jsconsole +from .prototypes.jsboolean import BooleanPrototype +from .prototypes.jserror import ErrorPrototype +from .prototypes.jsfunction import FunctionPrototype +from .prototypes.jsnumber import NumberPrototype +from .prototypes.jsobject import ObjectPrototype +from .prototypes.jsregexp import RegExpPrototype +from .prototypes.jsstring import StringPrototype +from .prototypes.jsarray import ArrayPrototype +from .prototypes import jsjson +from .prototypes import jsutils + +from .constructors import jsnumber, jsstring, jsarray, jsboolean, jsregexp, jsmath, jsobject, jsfunction, jsconsole + def fill_proto(proto, proto_class, space): @@ -155,7 +148,10 @@ def creator(this, args): j = easy_func(creator, space) j.name = unicode(typ) - j.prototype = space.ERROR_TYPES[typ] + + set_protected(j, 'prototype', space.ERROR_TYPES[typ]) + + set_non_enumerable(space.ERROR_TYPES[typ], 'constructor', j) def new_create(args, space): message = get_arg(args, 0) @@ -178,6 +174,7 @@ def new_create(args, space): setattr(space, err_type_name + u'Prototype', extra_err) error_constructors[err_type_name] = construct_constructor( err_type_name) + assert space.TypeErrorPrototype is not None # RegExp diff --git a/Contents/Libraries/Shared/js2py/internals/func_utils.py b/Contents/Libraries/Shared/js2py/internals/func_utils.py index 3c0b8d576..58dfef9ee 100644 --- a/Contents/Libraries/Shared/js2py/internals/func_utils.py +++ b/Contents/Libraries/Shared/js2py/internals/func_utils.py @@ -1,5 +1,5 @@ -from simplex import * -from conversions import * +from .simplex import * +from .conversions import * import six if six.PY3: diff --git a/Contents/Libraries/Shared/js2py/internals/opcodes.py b/Contents/Libraries/Shared/js2py/internals/opcodes.py index 0f3127db7..15c57ccd1 100644 --- a/Contents/Libraries/Shared/js2py/internals/opcodes.py +++ b/Contents/Libraries/Shared/js2py/internals/opcodes.py @@ -1,5 +1,5 @@ -from operations import * -from base import get_member, get_member_dot, PyJsFunction, Scope +from .operations import * +from .base import get_member, get_member_dot, PyJsFunction, Scope class OP_CODE(object): diff --git a/Contents/Libraries/Shared/js2py/internals/operations.py b/Contents/Libraries/Shared/js2py/internals/operations.py index d9875088c..35b901794 100644 --- a/Contents/Libraries/Shared/js2py/internals/operations.py +++ b/Contents/Libraries/Shared/js2py/internals/operations.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals -from simplex import * -from conversions import * +from .simplex import * +from .conversions import * # ------------------------------------------------------------------------------ # Unary operations diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsstring.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsstring.py index b56246e25..be38802ef 100644 --- a/Contents/Libraries/Shared/js2py/internals/prototypes/jsstring.py +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsstring.py @@ -4,7 +4,7 @@ import re from ..conversions import * from ..func_utils import * -from jsregexp import RegExpExec +from .jsregexp import RegExpExec DIGS = set(u'0123456789') WHITE = u"\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF" diff --git a/Contents/Libraries/Shared/js2py/internals/seval.py b/Contents/Libraries/Shared/js2py/internals/seval.py index c4404ab77..cd8ea50fa 100644 --- a/Contents/Libraries/Shared/js2py/internals/seval.py +++ b/Contents/Libraries/Shared/js2py/internals/seval.py @@ -1,11 +1,9 @@ import pyjsparser -from space import Space -import fill_space -from byte_trans import ByteCodeGenerator -from code import Code -from simplex import MakeError -import sys -sys.setrecursionlimit(100000) +from .space import Space +from . import fill_space +from .byte_trans import ByteCodeGenerator +from .code import Code +from .simplex import * pyjsparser.parser.ENABLE_JS2PY_ERRORS = lambda msg: MakeError(u'SyntaxError', unicode(msg)) @@ -16,8 +14,8 @@ def get_js_bytecode(js): a.emit(d) return a.exe.tape -def eval_js_vm(js): - a = ByteCodeGenerator(Code()) +def eval_js_vm(js, debug=False): + a = ByteCodeGenerator(Code(debug_mode=debug)) s = Space() a.exe.space = s s.exe = a.exe @@ -26,7 +24,10 @@ def eval_js_vm(js): a.emit(d) fill_space.fill_space(s, a) - # print a.exe.tape + if debug: + from pprint import pprint + pprint(a.exe.tape) + print() a.exe.compile() return a.exe.run(a.exe.space.GlobalObj) diff --git a/Contents/Libraries/Shared/js2py/internals/simplex.py b/Contents/Libraries/Shared/js2py/internals/simplex.py index b05f6174e..4cd247eb2 100644 --- a/Contents/Libraries/Shared/js2py/internals/simplex.py +++ b/Contents/Libraries/Shared/js2py/internals/simplex.py @@ -1,6 +1,10 @@ from __future__ import unicode_literals import six - +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str #Undefined class PyJsUndefined(object): @@ -75,7 +79,7 @@ def is_callable(self): def is_infinity(self): - return self == float('inf') or self == -float('inf') + return self == Infinity or self == -Infinity def is_nan(self): @@ -114,7 +118,7 @@ def __str__(self): return self.mes.to_string().value else: if self.throw is not None: - from conversions import to_string + from .conversions import to_string return to_string(self.throw) else: return self.typ + ': ' + self.message @@ -131,3 +135,26 @@ def value_from_js_exception(js_exception, space): return js_exception.throw else: return space.NewError(js_exception.typ, js_exception.message) + + +def js_dtoa(number): + if is_nan(number): + return u'NaN' + elif is_infinity(number): + if number > 0: + return u'Infinity' + return u'-Infinity' + elif number == 0.: + return u'0' + elif abs(number) < 1e-6 or abs(number) >= 1e21: + frac, exponent = unicode(repr(float(number))).split('e') + # Remove leading zeros from the exponent. + exponent = int(exponent) + return frac + ('e' if exponent < 0 else 'e+') + unicode(exponent) + elif abs(number) < 1e-4: # python starts to return exp notation while we still want the prec + frac, exponent = unicode(repr(float(number))).split('e-') + base = u'0.' + u'0' * (int(exponent) - 1) + frac.lstrip('-').replace('.', '') + return base if number > 0. else u'-' + base + elif isinstance(number, long) or number.is_integer(): # dont print .0 + return unicode(int(number)) + return unicode(repr(number)) # python representation should be equivalent. diff --git a/Contents/Libraries/Shared/js2py/internals/space.py b/Contents/Libraries/Shared/js2py/internals/space.py index 7283070cd..cb2e77ae0 100644 --- a/Contents/Libraries/Shared/js2py/internals/space.py +++ b/Contents/Libraries/Shared/js2py/internals/space.py @@ -1,5 +1,5 @@ -from base import * -from simplex import * +from .base import * +from .simplex import * class Space(object): diff --git a/Contents/Libraries/Shared/js2py/internals/trans_utils.py b/Contents/Libraries/Shared/js2py/internals/trans_utils.py index 235b46a85..f99c09945 100644 --- a/Contents/Libraries/Shared/js2py/internals/trans_utils.py +++ b/Contents/Libraries/Shared/js2py/internals/trans_utils.py @@ -1,3 +1,10 @@ +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + def to_key(literal_or_identifier): ''' returns string representation of this object''' if literal_or_identifier['type'] == 'Identifier': diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsfunction.py b/Contents/Libraries/Shared/js2py/prototypes/jsfunction.py index f9598a317..2ed417e0d 100644 --- a/Contents/Libraries/Shared/js2py/prototypes/jsfunction.py +++ b/Contents/Libraries/Shared/js2py/prototypes/jsfunction.py @@ -6,8 +6,6 @@ xrange = range unicode = str -# todo fix apply and bind - class FunctionPrototype: def toString(): @@ -41,6 +39,7 @@ def apply(): return this.call(obj, args) def bind(thisArg): + arguments_ = arguments target = this if not target.is_callable(): raise this.MakeError( @@ -48,5 +47,5 @@ def bind(thisArg): if len(arguments) <= 1: args = () else: - args = tuple([arguments[e] for e in xrange(1, len(arguments))]) + args = tuple([arguments_[e] for e in xrange(1, len(arguments_))]) return this.PyJsBoundFunction(target, thisArg, args) diff --git a/Contents/Libraries/Shared/js2py/translators/translating_nodes.py b/Contents/Libraries/Shared/js2py/translators/translating_nodes.py index 286714f91..0ae93dd9a 100644 --- a/Contents/Libraries/Shared/js2py/translators/translating_nodes.py +++ b/Contents/Libraries/Shared/js2py/translators/translating_nodes.py @@ -345,7 +345,7 @@ def BlockStatement(type, body): body) # never returns empty string! In the worst case returns pass\n -def ExpressionStatement(type, expression, **ommit): +def ExpressionStatement(type, expression): return trans(expression) + '\n' # end expression space with new line diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index c529fc228..d4cdbee49 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -11,6 +11,7 @@ import xmlrpclib import dns.resolver import ipaddress +import re from requests import exceptions from urllib3.util import connection @@ -18,8 +19,14 @@ from exceptions import APIThrottled from dogpile.cache.api import NO_VALUE from subliminal.cache import region +from subliminal_patch.pitcher import pitchers from cloudscraper import CloudScraper +try: + import brotli +except: + pass + try: from urlparse import urlparse except ImportError: @@ -56,13 +63,81 @@ def __init__(self): self.verify = pem_file -class CFSession(CloudScraper): - _hdrs = None +class NeedsCaptchaException(Exception): + pass + +class CFSession(CloudScraper): def __init__(self, *args, **kwargs): super(CFSession, self).__init__(*args, **kwargs) self.debug = os.environ.get("CF_DEBUG", False) - self._was_cf = False + + def _request(self, method, url, *args, **kwargs): + ourSuper = super(CloudScraper, self) + resp = ourSuper.request(method, url, *args, **kwargs) + + if resp.headers.get('Content-Encoding') == 'br': + if self.allow_brotli and resp._content: + resp._content = brotli.decompress(resp.content) + else: + logging.warning('Brotli content detected, But option is disabled, we will not continue.') + return resp + + # Debug request + if self.debug: + self.debugRequest(resp) + + # Check if Cloudflare anti-bot is on + try: + if self.isChallengeRequest(resp): + if resp.request.method != 'GET': + # Work around if the initial request is not a GET, + # Supersede with a GET then re-request the original METHOD. + CloudScraper.request(self, 'GET', resp.url) + resp = ourSuper.request(method, url, *args, **kwargs) + else: + # Solve Challenge + resp = self.sendChallengeResponse(resp, **kwargs) + + except ValueError, e: + if e.message == "Captcha": + parsed_url = urlparse(url) + domain = parsed_url.netloc + # solve the captcha + site_key = re.search(r'data-sitekey="(.+?)"', resp.content).group(1) + challenge_s = re.search(r'type="hidden" name="s" value="(.+?)"', resp.content).group(1) + challenge_ray = re.search(r'data-ray="(.+?)"', resp.content).group(1) + if not all([site_key, challenge_s, challenge_ray]): + raise Exception("cf: Captcha site-key not found!") + + pitcher = pitchers.get_pitcher()("cf: %s" % domain, resp.request.url, site_key, + user_agent=self.headers["User-Agent"], + cookies=self.cookies.get_dict(), + is_invisible=True) + + parsed_url = urlparse(resp.url) + logger.info("cf: %s: Solving captcha", domain) + result = pitcher.throw() + if not result: + raise Exception("cf: Couldn't solve captcha!") + + submit_url = '{}://{}/cdn-cgi/l/chk_captcha'.format(parsed_url.scheme, domain) + method = resp.request.method + + cloudflare_kwargs = { + 'allow_redirects': False, + 'headers': {'Referer': resp.url}, + 'params': OrderedDict( + [ + ('s', challenge_s), + ('g-recaptcha-response', result) + ] + ) + } + + return CloudScraper.request(self, method, submit_url, **cloudflare_kwargs) + + return resp def request(self, method, url, *args, **kwargs): parsed_url = urlparse(url) @@ -80,20 +155,18 @@ def request(self, method, url, *args, **kwargs): self.headers = hdrs - ret = super(CFSession, self).request(method, url, *args, **kwargs) + ret = self._request(method, url, *args, **kwargs) - if self.was_cf_request: - self.was_cf_request = False - logger.debug("We've hit CF, seeing if we need to store previous data") - try: - cf_data = self.get_cf_live_tokens(domain) - except: - logger.debug("Couldn't get CF live tokens for re-use. Cookies: %r", self.cookies) - pass - else: - if cf_data != region.get(cache_key) and cf_data[0]["cf_clearance"]: - logger.debug("Storing cf data for %s: %s", domain, cf_data) - region.set(cache_key, cf_data) + try: + cf_data = self.get_cf_live_tokens(domain) + except: + pass + else: + if cf_data != region.get(cache_key) and cf_data[0]["cf_clearance"]: + logger.debug("Storing cf data for %s: %s", domain, cf_data) + region.set(cache_key, cf_data) + elif cf_data[0]["cf_clearance"]: + logger.debug("CF Live tokens not updated") return ret From dc0a8deb4088dc92cb7045b00a5a729ddd8f797d Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 8 May 2019 04:14:04 +0200 Subject: [PATCH 504/710] core: cf: testing providers: subscene: testing --- Contents/Libraries/Shared/cloudscraper/__init__.py | 13 +++++++++---- Contents/Libraries/Shared/subscene_api/subscene.py | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Contents/Libraries/Shared/cloudscraper/__init__.py b/Contents/Libraries/Shared/cloudscraper/__init__.py index b34065ecb..66d473924 100644 --- a/Contents/Libraries/Shared/cloudscraper/__init__.py +++ b/Contents/Libraries/Shared/cloudscraper/__init__.py @@ -49,17 +49,22 @@ def __init__(self, cipherSuite=None, **kwargs): ########################################################################################################################################################## def init_poolmanager(self, *args, **kwargs): - kwargs['ssl_context'] = create_urllib3_context(ciphers=self.cipherSuite) + if hasattr(ssl, 'PROTOCOL_TLS'): + kwargs['ssl_context'] = create_urllib3_context(ssl_version=getattr(ssl, 'PROTOCOL_TLSv1_3', ssl.PROTOCOL_TLSv1_2), ciphers=self.cipherSuite) + else: + kwargs['ssl_context'] = create_urllib3_context(ssl_version=ssl.PROTOCOL_TLSv1) return super(CipherSuiteAdapter, self).init_poolmanager(*args, **kwargs) ########################################################################################################################################################## def proxy_manager_for(self, *args, **kwargs): - kwargs['ssl_context'] = create_urllib3_context(ciphers=self.cipherSuite) + if hasattr(ssl, 'PROTOCOL_TLS'): + kwargs['ssl_context'] = create_urllib3_context( + ssl_version=getattr(ssl, 'PROTOCOL_TLSv1_3', ssl.PROTOCOL_TLSv1_2), ciphers=self.cipherSuite) + else: + kwargs['ssl_context'] = create_urllib3_context(ssl_version=ssl.PROTOCOL_TLSv1) return super(CipherSuiteAdapter, self).proxy_manager_for(*args, **kwargs) -########################################################################################################################################################## - class CloudScraper(Session): def __init__(self, *args, **kwargs): diff --git a/Contents/Libraries/Shared/subscene_api/subscene.py b/Contents/Libraries/Shared/subscene_api/subscene.py index e2b14ea26..5b53a8c95 100644 --- a/Contents/Libraries/Shared/subscene_api/subscene.py +++ b/Contents/Libraries/Shared/subscene_api/subscene.py @@ -244,7 +244,7 @@ def get_first_film(soup, section, year=None, session=None): def search(term, release=True, session=None, year=None, limit_to=SearchTypes.Exact): - soup = soup_for("%s/subtitles/%s?q=%s" % (SITE_DOMAIN, "release" if release else "title", term), session=session) + soup = soup_for("%s/subtitles/%s?q=%s" % (SITE_DOMAIN, "release" if release else "search", term), session=session) if "Subtitle search by" in str(soup): rows = soup.find("table").tbody.find_all("tr") From e139ffefe6831c4138a0a96f74cdb01d47f6bdf7 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 8 May 2019 04:18:25 +0200 Subject: [PATCH 505/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index ad1ca35ae..8920f2ff7 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3062</string> + <string>2.6.5.3067</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3062 DEV +Version 2.6.5.3067 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From cbf5ea69be501872a3cb6db486b467a213fa4a50 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 8 May 2019 15:57:33 +0200 Subject: [PATCH 506/710] core: cf: update cloudscraper to 1.1.9; fix keyerror --- .../Libraries/Shared/cloudscraper/__init__.py | 59 +++++++++++-------- .../Libraries/Shared/subliminal_patch/http.py | 11 ++-- 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/Contents/Libraries/Shared/cloudscraper/__init__.py b/Contents/Libraries/Shared/cloudscraper/__init__.py index 66d473924..04b6e714d 100644 --- a/Contents/Libraries/Shared/cloudscraper/__init__.py +++ b/Contents/Libraries/Shared/cloudscraper/__init__.py @@ -33,7 +33,7 @@ ########################################################################################################################################################## -__version__ = '1.1.5' +__version__ = '1.1.9' BUG_REPORT = 'Cloudflare may have changed their technique, or there may be a bug in the script.' @@ -44,27 +44,31 @@ class CipherSuiteAdapter(HTTPAdapter): def __init__(self, cipherSuite=None, **kwargs): self.cipherSuite = cipherSuite + + if hasattr(ssl, 'PROTOCOL_TLS'): + self.ssl_context = create_urllib3_context( + ssl_version=getattr(ssl, 'PROTOCOL_TLSv1_3', ssl.PROTOCOL_TLSv1_2), + ciphers=self.cipherSuite + ) + else: + self.ssl_context = create_urllib3_context(ssl_version=ssl.PROTOCOL_TLSv1) + super(CipherSuiteAdapter, self).__init__(**kwargs) ########################################################################################################################################################## def init_poolmanager(self, *args, **kwargs): - if hasattr(ssl, 'PROTOCOL_TLS'): - kwargs['ssl_context'] = create_urllib3_context(ssl_version=getattr(ssl, 'PROTOCOL_TLSv1_3', ssl.PROTOCOL_TLSv1_2), ciphers=self.cipherSuite) - else: - kwargs['ssl_context'] = create_urllib3_context(ssl_version=ssl.PROTOCOL_TLSv1) + kwargs['ssl_context'] = self.ssl_context return super(CipherSuiteAdapter, self).init_poolmanager(*args, **kwargs) ########################################################################################################################################################## def proxy_manager_for(self, *args, **kwargs): - if hasattr(ssl, 'PROTOCOL_TLS'): - kwargs['ssl_context'] = create_urllib3_context( - ssl_version=getattr(ssl, 'PROTOCOL_TLSv1_3', ssl.PROTOCOL_TLSv1_2), ciphers=self.cipherSuite) - else: - kwargs['ssl_context'] = create_urllib3_context(ssl_version=ssl.PROTOCOL_TLSv1) + kwargs['ssl_context'] = self.ssl_context return super(CipherSuiteAdapter, self).proxy_manager_for(*args, **kwargs) +########################################################################################################################################################## + class CloudScraper(Session): def __init__(self, *args, **kwargs): @@ -97,24 +101,27 @@ def loadCipherSuite(self): if self.cipherSuite: return self.cipherSuite - ciphers = [ - 'GREASE_3A', 'GREASE_6A', 'AES128-GCM-SHA256', 'AES256-GCM-SHA256', 'AES256-GCM-SHA384', 'CHACHA20-POLY1305-SHA256', - 'ECDHE-ECDSA-AES128-GCM-SHA256', 'ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-ECDSA-AES256-GCM-SHA384', - 'ECDHE-RSA-AES256-GCM-SHA384', 'ECDHE-ECDSA-CHACHA20-POLY1305-SHA256', 'ECDHE-RSA-CHACHA20-POLY1305-SHA256', - 'ECDHE-RSA-AES128-CBC-SHA', 'ECDHE-RSA-AES256-CBC-SHA', 'RSA-AES128-GCM-SHA256', 'RSA-AES256-GCM-SHA384', - 'ECDHE-RSA-AES128-GCM-SHA256', 'RSA-AES256-SHA', '3DES-EDE-CBC' - ] - self.cipherSuite = '' - ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) - - for cipher in ciphers: - try: - ctx.set_ciphers(cipher) - self.cipherSuite = '{}:{}'.format(self.cipherSuite, cipher).rstrip(':') - except ssl.SSLError: - pass + if hasattr(ssl, 'PROTOCOL_TLS'): + ciphers = [ + 'ECDHE-ECDSA-AES128-GCM-SHA256', 'ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-ECDSA-AES256-GCM-SHA384', + 'ECDHE-RSA-AES256-GCM-SHA384', 'ECDHE-ECDSA-CHACHA20-POLY1305-SHA256', 'ECDHE-RSA-CHACHA20-POLY1305-SHA256', + 'ECDHE-RSA-AES128-CBC-SHA', 'ECDHE-RSA-AES256-CBC-SHA', 'RSA-AES128-GCM-SHA256', 'RSA-AES256-GCM-SHA384', + 'ECDHE-RSA-AES128-GCM-SHA256', 'RSA-AES256-SHA', '3DES-EDE-CBC' + ] + + if hasattr(ssl, 'PROTOCOL_TLSv1_3'): + ciphers.insert(0, ['GREASE_3A', 'GREASE_6A', 'AES128-GCM-SHA256', 'AES256-GCM-SHA256', 'AES256-GCM-SHA384', 'CHACHA20-POLY1305-SHA256']) + + ctx = ssl.SSLContext(getattr(ssl, 'PROTOCOL_TLSv1_3', ssl.PROTOCOL_TLSv1_2)) + + for cipher in ciphers: + try: + ctx.set_ciphers(cipher) + self.cipherSuite = '{}:{}'.format(self.cipherSuite, cipher).rstrip(':') + except ssl.SSLError: + pass return self.cipherSuite diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index d4cdbee49..b4fe6ad8f 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -162,11 +162,12 @@ def request(self, method, url, *args, **kwargs): except: pass else: - if cf_data != region.get(cache_key) and cf_data[0]["cf_clearance"]: - logger.debug("Storing cf data for %s: %s", domain, cf_data) - region.set(cache_key, cf_data) - elif cf_data[0]["cf_clearance"]: - logger.debug("CF Live tokens not updated") + if cf_data and "cf_clearance" in cf_data[0] and cf_data[0]["cf_clearance"]: + if cf_data != region.get(cache_key): + logger.debug("Storing cf data for %s: %s", domain, cf_data) + region.set(cache_key, cf_data) + elif cf_data[0]["cf_clearance"]: + logger.debug("CF Live tokens not updated") return ret From b51deb5d0174f56218d29e40172bd4fcc78d039d Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 12 May 2019 04:47:45 +0200 Subject: [PATCH 507/710] core: subliminal: don't replace \r with \n by default; fixes utf-16 character transformation issues; fixes #646 --- Contents/Libraries/Shared/subliminal/subtitle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal/subtitle.py b/Contents/Libraries/Shared/subliminal/subtitle.py index 726b28e37..5c2c789b2 100644 --- a/Contents/Libraries/Shared/subliminal/subtitle.py +++ b/Contents/Libraries/Shared/subliminal/subtitle.py @@ -258,4 +258,4 @@ def fix_line_ending(content): :rtype: bytes """ - return content.replace(b'\r\n', b'\n').replace(b'\r', b'\n') + return content.replace(b'\r\n', b'\n') From 5c47ddeb2dd2184a711428fab1eea7ff5dded756 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 12 May 2019 04:49:30 +0200 Subject: [PATCH 508/710] core: update chinese encodings; #646 --- Contents/Libraries/Shared/subliminal_patch/subtitle.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index daa922359..5ee53a46a 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -123,7 +123,8 @@ def guess_encoding(self): # http://scratchpad.wikia.com/wiki/Character_Encoding_Recommendation_for_Languages if self.language.alpha3 == 'zho': - encodings.extend(['cp936', 'gb2312', 'cp950', 'gb18030', 'big5', 'big5hkscs']) + encodings.extend(['cp936', 'gb2312', 'gbk', 'gb18030', 'hz', 'iso2022_jp_2', 'cp950', 'gb18030', 'big5', + 'big5hkscs', 'utf-16']) elif self.language.alpha3 == 'jpn': encodings.extend(['shift-jis', 'cp932', 'euc_jp', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2', 'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext', ]) From 1a853a780c83859434d24d68579b383a74f60d0f Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 12 May 2019 05:01:38 +0200 Subject: [PATCH 509/710] core: update pysubs2 to 0.2.3 --- Contents/Libraries/Shared/pysubs2/cli.py | 10 ++++++ Contents/Libraries/Shared/pysubs2/common.py | 4 ++- Contents/Libraries/Shared/pysubs2/formats.py | 4 +-- .../pysubs2/{txt_generic.py => mpl2.py} | 36 ++++++++++--------- Contents/Libraries/Shared/pysubs2/ssastyle.py | 2 +- Contents/Libraries/Shared/pysubs2/subrip.py | 10 +++++- .../Libraries/Shared/pysubs2/substation.py | 18 +++++++--- 7 files changed, 57 insertions(+), 27 deletions(-) rename Contents/Libraries/Shared/pysubs2/{txt_generic.py => mpl2.py} (55%) diff --git a/Contents/Libraries/Shared/pysubs2/cli.py b/Contents/Libraries/Shared/pysubs2/cli.py index f28cfcba6..fc82bf9b5 100644 --- a/Contents/Libraries/Shared/pysubs2/cli.py +++ b/Contents/Libraries/Shared/pysubs2/cli.py @@ -163,3 +163,13 @@ def process(subs, args): elif args.transform_framerate is not None: in_fps, out_fps = args.transform_framerate subs.transform_framerate(in_fps, out_fps) + + +def __main__(): + cli = Pysubs2CLI() + rv = cli(sys.argv[1:]) + sys.exit(rv) + + +if __name__ == "__main__": + __main__() diff --git a/Contents/Libraries/Shared/pysubs2/common.py b/Contents/Libraries/Shared/pysubs2/common.py index 08738eb5c..2f95ccf44 100644 --- a/Contents/Libraries/Shared/pysubs2/common.py +++ b/Contents/Libraries/Shared/pysubs2/common.py @@ -17,12 +17,14 @@ def __new__(cls, r, g, b, a=0): return _Color.__new__(cls, r, g, b, a) #: Version of the pysubs2 library. -VERSION = "0.2.1" +VERSION = "0.2.3" PY3 = sys.version_info.major == 3 if PY3: text_type = str + binary_string_type = bytes else: text_type = unicode + binary_string_type = str diff --git a/Contents/Libraries/Shared/pysubs2/formats.py b/Contents/Libraries/Shared/pysubs2/formats.py index 03fba8e60..5c25a6e96 100644 --- a/Contents/Libraries/Shared/pysubs2/formats.py +++ b/Contents/Libraries/Shared/pysubs2/formats.py @@ -3,7 +3,7 @@ from .subrip import SubripFormat from .jsonformat import JSONFormat from .substation import SubstationFormat -from .txt_generic import TXTGenericFormat, MPL2Format +from .mpl2 import MPL2Format from .exceptions import * #: Dict mapping file extensions to format identifiers. @@ -13,7 +13,6 @@ ".ssa": "ssa", ".sub": "microdvd", ".json": "json", - ".txt": "txt_generic", } #: Dict mapping format identifiers to implementations (FormatBase subclasses). @@ -23,7 +22,6 @@ "ssa": SubstationFormat, "microdvd": MicroDVDFormat, "json": JSONFormat, - "txt_generic": TXTGenericFormat, "mpl2": MPL2Format, } diff --git a/Contents/Libraries/Shared/pysubs2/txt_generic.py b/Contents/Libraries/Shared/pysubs2/mpl2.py similarity index 55% rename from Contents/Libraries/Shared/pysubs2/txt_generic.py rename to Contents/Libraries/Shared/pysubs2/mpl2.py index 70bf3e31c..5c90bb4f8 100644 --- a/Contents/Libraries/Shared/pysubs2/txt_generic.py +++ b/Contents/Libraries/Shared/pysubs2/mpl2.py @@ -2,44 +2,48 @@ from __future__ import print_function, division, unicode_literals import re -from numbers import Number -from pysubs2.time import times_to_ms +from .time import times_to_ms from .formatbase import FormatBase from .ssaevent import SSAEvent -from .ssastyle import SSAStyle # thanks to http://otsaloma.io/gaupol/doc/api/aeidon.files.mpl2_source.html -MPL2_FORMAT = re.compile(r"^(?um)\[(-?\d+)\]\[(-?\d+)\](.*?)$") - - -class TXTGenericFormat(FormatBase): - @classmethod - def guess_format(cls, text): - if MPL2_FORMAT.match(text): - return "mpl2" +MPL2_FORMAT = re.compile(r"^(?um)\[(-?\d+)\]\[(-?\d+)\](.*)") class MPL2Format(FormatBase): @classmethod def guess_format(cls, text): - return TXTGenericFormat.guess_format(text) + if MPL2_FORMAT.search(text): + return "mpl2" @classmethod def from_file(cls, subs, fp, format_, **kwargs): def prepare_text(lines): out = [] for s in lines.split("|"): + s = s.strip() + if s.startswith("/"): - out.append(r"{\i1}%s{\i0}" % s[1:]) - continue + # line beginning with '/' is in italics + s = r"{\i1}%s{\i0}" % s[1:].strip() + out.append(s) - return "\n".join(out) + return "\\N".join(out) subs.events = [SSAEvent(start=times_to_ms(s=float(start) / 10), end=times_to_ms(s=float(end) / 10), text=prepare_text(text)) for start, end, text in MPL2_FORMAT.findall(fp.getvalue())] @classmethod def to_file(cls, subs, fp, format_, **kwargs): - raise NotImplemented + + # TODO handle italics + for line in subs: + if line.is_comment: + continue + + print("[{start}][{end}] {text}".format(start=int(line.start // 100), + end=int(line.end // 100), + text=line.plaintext.replace("\n", "|")), + file=fp) diff --git a/Contents/Libraries/Shared/pysubs2/ssastyle.py b/Contents/Libraries/Shared/pysubs2/ssastyle.py index 522f8ce0d..2fcadc7ed 100644 --- a/Contents/Libraries/Shared/pysubs2/ssastyle.py +++ b/Contents/Libraries/Shared/pysubs2/ssastyle.py @@ -78,7 +78,7 @@ def __repr__(self): s += "%rpx " % self.fontsize if self.bold: s += "bold " if self.italic: s += "italic " - s += "'%s'>" % self.fontname + s += "{!r}>".format(self.fontname) if not PY3: s = s.encode("utf-8") return s diff --git a/Contents/Libraries/Shared/pysubs2/subrip.py b/Contents/Libraries/Shared/pysubs2/subrip.py index 7fa3f29b2..fea4eade6 100644 --- a/Contents/Libraries/Shared/pysubs2/subrip.py +++ b/Contents/Libraries/Shared/pysubs2/subrip.py @@ -46,8 +46,16 @@ def from_file(cls, subs, fp, format_, **kwargs): following_lines[-1].append(line) def prepare_text(lines): + # Handle the "happy" empty subtitle case, which is timestamp line followed by blank line(s) + # followed by number line and timestamp line of the next subtitle. Fixes issue #11. + if (len(lines) >= 2 + and all(re.match("\s*$", line) for line in lines[:-1]) + and re.match("\s*\d+\s*$", lines[-1])): + return "" + + # Handle the general case. s = "".join(lines).strip() - s = re.sub(r"\n* *\d+ *$", "", s) # strip number of next subtitle + s = re.sub(r"\n+ *\d+ *$", "", s) # strip number of next subtitle s = re.sub(r"< *i *>", r"{\i1}", s) s = re.sub(r"< */ *i *>", r"{\i0}", s) s = re.sub(r"< *s *>", r"{\s1}", s) diff --git a/Contents/Libraries/Shared/pysubs2/substation.py b/Contents/Libraries/Shared/pysubs2/substation.py index fc4172a49..b6e4c5c13 100644 --- a/Contents/Libraries/Shared/pysubs2/substation.py +++ b/Contents/Libraries/Shared/pysubs2/substation.py @@ -4,7 +4,7 @@ from .formatbase import FormatBase from .ssaevent import SSAEvent from .ssastyle import SSAStyle -from .common import text_type, Color +from .common import text_type, Color, PY3, binary_string_type from .time import make_time, ms_to_times, timestamp_to_ms, TIMESTAMP SSA_ALIGNMENT = (1, 2, 3, 9, 10, 11, 5, 6, 7) @@ -229,7 +229,7 @@ def to_file(cls, subs, fp, format_, header_notice=NOTICE, **kwargs): for k, v in subs.aegisub_project.items(): print(k, v, sep=": ", file=fp) - def field_to_string(f, v): + def field_to_string(f, v, line): if f in {"start", "end"}: return ms_to_timestamp(v) elif f == "marked": @@ -240,23 +240,31 @@ def field_to_string(f, v): return "-1" if v else "0" elif isinstance(v, (text_type, Number)): return text_type(v) + elif not PY3 and isinstance(v, binary_string_type): + # A convenience feature, see issue #12 - accept non-unicode strings + # when they are ASCII; this is useful in Python 2, especially for non-text + # fields like style names, where requiring Unicode type seems too stringent + if all(ord(c) < 128 for c in v): + return text_type(v) + else: + raise TypeError("Encountered binary string with non-ASCII codepoint in SubStation field {!r} for line {!r} - please use unicode string instead of str".format(f, line)) elif isinstance(v, Color): if format_ == "ass": return color_to_ass_rgba(v) else: return color_to_ssa_rgb(v) else: - raise TypeError("Unexpected type when writing a SubStation field") + raise TypeError("Unexpected type when writing a SubStation field {!r} for line {!r}".format(f, line)) print("\n[V4+ Styles]" if format_ == "ass" else "\n[V4 Styles]", file=fp) print(STYLE_FORMAT_LINE[format_], file=fp) for name, sty in subs.styles.items(): - fields = [field_to_string(f, getattr(sty, f)) for f in STYLE_FIELDS[format_]] + fields = [field_to_string(f, getattr(sty, f), sty) for f in STYLE_FIELDS[format_]] print("Style: %s" % name, *fields, sep=",", file=fp) print("\n[Events]", file=fp) print(EVENT_FORMAT_LINE[format_], file=fp) for ev in subs.events: - fields = [field_to_string(f, getattr(ev, f)) for f in EVENT_FIELDS[format_]] + fields = [field_to_string(f, getattr(ev, f), ev) for f in EVENT_FIELDS[format_]] print(ev.type, end=": ", file=fp) print(*fields, sep=",", file=fp) From b3f062956d3f46f5bda7c8913678d6fba90801f1 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 12 May 2019 05:12:34 +0200 Subject: [PATCH 510/710] core: re-fix ass/ssa tags in srt in pysubs2 0.2.3 --- Contents/Libraries/Shared/pysubs2/substation.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/Contents/Libraries/Shared/pysubs2/substation.py b/Contents/Libraries/Shared/pysubs2/substation.py index b6e4c5c13..f810a4776 100644 --- a/Contents/Libraries/Shared/pysubs2/substation.py +++ b/Contents/Libraries/Shared/pysubs2/substation.py @@ -150,14 +150,7 @@ def string_to_field(f, v): if format_ == "ass": return ass_rgba_to_color(v) else: - try: - return ssa_rgb_to_color(v) - except ValueError: - try: - return ass_rgba_to_color(v) - except: - return Color(255, 255, 255, 0) - + return ssa_rgb_to_color(v) elif f in {"bold", "underline", "italic", "strikeout"}: return v == "-1" elif f in {"borderstyle", "encoding", "marginl", "marginr", "marginv", "layer", "alphalevel"}: From d0c71b4b67f57d428e06367a9e269636052a353e Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 12 May 2019 05:12:58 +0200 Subject: [PATCH 511/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 8920f2ff7..aba307e48 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3067</string> + <string>2.6.5.3073</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3067 DEV +Version 2.6.5.3073 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 1a0bb9c3e4be84be35d46672907783363fe5a87b Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 12 May 2019 06:05:16 +0200 Subject: [PATCH 512/710] release 2.6.5.3074 --- CHANGELOG.md | 10 ++++++++++ Contents/Info.plist | 6 +++--- README.md | 14 ++++++-------- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 116b95866..ece7920ef 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,14 @@ +2.6.5.3041 + +Changelog +- core: only reference guessed title if there actually is one +- core: cf: optimize +- core/config: add setting for one existing language to be enough, fixes #491 +- core/compat: dns: support nameservers via ENV[dns_resolvers]; don't fall back to default DNS when configured custom DNS failed +- providers: titlovi: prevent repeated captcha solving for CF + + 2.6.5.3017 Changelog diff --git a/Contents/Info.plist b/Contents/Info.plist index aba307e48..e907db830 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3073</string> + <string>2.6.5.3074</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3073 DEV +Version 2.6.5.3074 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index de64025f1..924f25a80 100644 --- a/README.md +++ b/README.md @@ -91,24 +91,22 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3062 +2.6.5.3074 subscene, addic7ed and titlovi - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog -- core: cf: optimize -- core: http: don't query DNS with IPs. thanks @fgump (fixes sonarr/radarr) +- core: cf: bypass cf 95% of the time without captchas +- core: fix breaking line endings of certain languages (chinese, UTF-16); fixes #646 +- core: update pysubs2 to 0.2.3 -2.6.5.3041 +2.6.5.3062 Changelog -- core: only reference guessed title if there actually is one - core: cf: optimize -- core/config: add setting for one existing language to be enough, fixes #491 -- core/compat: dns: support nameservers via ENV[dns_resolvers]; don't fall back to default DNS when configured custom DNS failed -- providers: titlovi: prevent repeated captcha solving for CF +- core: http: don't query DNS with IPs. thanks @fgump (fixes sonarr/radarr) [older changes](CHANGELOG.md) From ce28d0284c4fa0a50dca52547102d2455355de9c Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 12 May 2019 06:17:08 +0200 Subject: [PATCH 513/710] back from dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index e907db830..594fc433d 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3074 +Version 2.6.5.3074 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 13d5e0761ee06f0a3fd8dee605757d8b412525a1 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Mon, 13 May 2019 16:14:26 +0200 Subject: [PATCH 514/710] providers: subscene: fix endpoint once again --- .../subliminal_patch/providers/subscene.py | 7 +-- .../Libraries/Shared/subscene_api/subscene.py | 45 ++++++++++++++----- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 2dc38b691..b940eb787 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -210,7 +210,7 @@ def query(self, video): for series in [video.series] + video.alternative_series: term = u"%s - %s Season" % (series, p.number_to_words("%sth" % video.season).capitalize()) logger.debug('Searching for alternative results: %s', term) - film = search(term, session=self.session, release=False) + film = search(term, session=self.session, release=False, throttle=self.search_throttle) if film and film.subtitles: logger.debug('Alternative results found: %s', len(film.subtitles)) subtitles += self.parse_results(video, film) @@ -222,7 +222,7 @@ def query(self, video): term = u"%s S%02i" % (series, video.season) logger.debug('Searching for packs: %s', term) time.sleep(self.search_throttle) - film = search(term, session=self.session) + film = search(term, session=self.session, throttle=self.search_throttle) if film and film.subtitles: logger.debug('Pack results found: %s', len(film.subtitles)) subtitles += self.parse_results(video, film) @@ -236,7 +236,8 @@ def query(self, video): more_than_one = len([video.title] + video.alternative_titles) > 1 for title in [video.title] + video.alternative_titles: logger.debug('Searching for movie results: %s', title) - film = search(title, year=video.year, session=self.session, limit_to=None, release=False) + film = search(title, year=video.year, session=self.session, limit_to=None, release=False, + throttle=self.search_throttle) if film and film.subtitles: subtitles += self.parse_results(video, film) if more_than_one: diff --git a/Contents/Libraries/Shared/subscene_api/subscene.py b/Contents/Libraries/Shared/subscene_api/subscene.py index 5b53a8c95..e0ba77138 100644 --- a/Contents/Libraries/Shared/subscene_api/subscene.py +++ b/Contents/Libraries/Shared/subscene_api/subscene.py @@ -28,6 +28,8 @@ import enum import sys +import requests +import time is_PY2 = sys.version_info[0] < 3 if is_PY2: @@ -55,7 +57,9 @@ def soup_for(url, session=None, user_agent=DEFAULT_USER_AGENT): r = Request(url, data=None, headers=dict(HEADERS, **{"User-Agent": user_agent})) html = urlopen(r).read().decode("utf-8") else: - html = session.get(url).text + ret = session.get(url) + ret.raise_for_status() + html = ret.text return BeautifulSoup(html, "html.parser") @@ -243,17 +247,34 @@ def get_first_film(soup, section, year=None, session=None): return Film.from_url(url, session=session) -def search(term, release=True, session=None, year=None, limit_to=SearchTypes.Exact): - soup = soup_for("%s/subtitles/%s?q=%s" % (SITE_DOMAIN, "release" if release else "search", term), session=session) +def search(term, release=True, session=None, year=None, limit_to=SearchTypes.Exact, throttle=0): + # note to subscene: if you actually start to randomize the endpoint, we'll have to query your server even more + endpoints = ["searching", "search", "srch", "find"] + if release: + endpoints = ["release"] - if "Subtitle search by" in str(soup): - rows = soup.find("table").tbody.find_all("tr") - subtitles = Subtitle.from_rows(rows) - return Film(term, subtitles=subtitles) + soup = None + for endpoint in endpoints: + try: + soup = soup_for("%s/subtitles/%s?q=%s" % (SITE_DOMAIN, endpoint, term), + session=session) + except requests.HTTPError, e: + if e.response.status_code == 404: + time.sleep(throttle) + # fixme: detect endpoint from html + continue + raise + break - for junk, search_type in SearchTypes.__members__.items(): - if section_exists(soup, search_type): - return get_first_film(soup, search_type, year=year, session=session) + if soup: + if "Subtitle search by" in str(soup): + rows = soup.find("table").tbody.find_all("tr") + subtitles = Subtitle.from_rows(rows) + return Film(term, subtitles=subtitles) - if limit_to == search_type: - return + for junk, search_type in SearchTypes.__members__.items(): + if section_exists(soup, search_type): + return get_first_film(soup, search_type, year=year, session=session) + + if limit_to == search_type: + return From aea6050d7156db239d1e794632dd800e2fbe822b Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 17 May 2019 23:45:06 +0200 Subject: [PATCH 515/710] subtitle: try decoding with utf-16 by default as well --- Contents/Libraries/Shared/subliminal_patch/subtitle.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 5ee53a46a..ea89d901a 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -117,14 +117,14 @@ def guess_encoding(self): logger.info('Guessing encoding for language %s', self.language) - encodings = ['utf-8'] + encodings = ['utf-8', 'utf-16'] # add language-specific encodings # http://scratchpad.wikia.com/wiki/Character_Encoding_Recommendation_for_Languages if self.language.alpha3 == 'zho': encodings.extend(['cp936', 'gb2312', 'gbk', 'gb18030', 'hz', 'iso2022_jp_2', 'cp950', 'gb18030', 'big5', - 'big5hkscs', 'utf-16']) + 'big5hkscs']) elif self.language.alpha3 == 'jpn': encodings.extend(['shift-jis', 'cp932', 'euc_jp', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2', 'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext', ]) From f337b53ae3412a10f799eb40a129302d9a815bc8 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 18 May 2019 06:23:04 +0200 Subject: [PATCH 516/710] submod: HI: remove music submod: common: be less aggressive about music symbols submod: HI: be less aggressive about brackets submod: HI: be less aggressive about MAN --- .../Shared/subzero/modification/main.py | 30 +++++++++++++++++++ .../subzero/modification/mods/__init__.py | 12 ++++++-- .../subzero/modification/mods/common.py | 4 +-- .../modification/mods/hearing_impaired.py | 19 +++++++----- 4 files changed, 53 insertions(+), 12 deletions(-) diff --git a/Contents/Libraries/Shared/subzero/modification/main.py b/Contents/Libraries/Shared/subzero/modification/main.py index 05c882d9e..7d35c2e27 100644 --- a/Contents/Libraries/Shared/subzero/modification/main.py +++ b/Contents/Libraries/Shared/subzero/modification/main.py @@ -293,6 +293,9 @@ def apply_line_mods(self, new_entries, mods): end_tag = line[-5:] line = line[:-5] + last_procs_mods = [] + + # fixme: this double loop is ugly for order, identifier, args in mods: mod = self.initialized_mods[identifier] @@ -312,6 +315,33 @@ def apply_line_mods(self, new_entries, mods): break applied_mods.append(identifier) + if mod.last_processors: + last_procs_mods.append([identifier, args]) + + if skip_entry: + lines = [] + break + + if skip_line: + continue + + for identifier, args in last_procs_mods: + mod = self.initialized_mods[identifier] + + try: + line = mod.modify(line.strip(), entry=entry.text, debug=self.debug, parent=self, index=index, + procs=["last_process"], **args) + except EmptyEntryError: + if self.debug: + logger.debug(u"%d: %s: %r -> ''", index, identifier, entry.text) + skip_entry = True + break + + if not line: + if self.debug: + logger.debug(u"%d: %s: %r -> ''", index, identifier, old_line) + skip_line = True + break if skip_entry: lines = [] diff --git a/Contents/Libraries/Shared/subzero/modification/mods/__init__.py b/Contents/Libraries/Shared/subzero/modification/mods/__init__.py index 10d0553da..aaf4c37e4 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/__init__.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/__init__.py @@ -21,6 +21,7 @@ class SubtitleModification(object): pre_processors = [] processors = [] post_processors = [] + last_processors = [] languages = [] def __init__(self, parent): @@ -67,15 +68,16 @@ def process(self, content, debug=False, parent=None, **kwargs): def post_process(self, content, debug=False, parent=None, **kwargs): return self._process(content, self.post_processors, debug=debug, parent=parent, **kwargs) - def modify(self, content, debug=False, parent=None, **kwargs): + def modify(self, content, debug=False, parent=None, procs=None, **kwargs): if not content: return new_content = content - for method in ("pre_process", "process", "post_process"): + for method in procs or ("pre_process", "process", "post_process"): if not new_content: return - new_content = getattr(self, method)(new_content, debug=debug, parent=parent, **kwargs) + new_content = self._process(new_content, getattr(self, "%sors" % method), + debug=debug, parent=parent, **kwargs) return new_content @@ -107,3 +109,7 @@ class SubtitleTextModification(SubtitleModification): class EmptyEntryError(Exception): pass + + +class EmptyLineError(Exception): + pass diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index eba386b1d..14c360937 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -28,7 +28,7 @@ class CommonFixes(SubtitleTextModification): NReProcessor(re.compile(r'(?u)(\w|\b|\s|^)(-\s?-{1,2})'), ur"\1—", name="CM_multidash"), # line = _/-/\s - NReProcessor(re.compile(r'(?u)(^\W*[-_.:>~]+\W*$)'), "", name="CM_non_word_only"), + NReProcessor(re.compile(r'(?u)(^\W*[-_.:>~]+\W*$)'), "", name="<CM_non_word_only"), # remove >> NReProcessor(re.compile(r'(?u)^\s?>>\s*'), "", name="CM_leading_crocodiles"), @@ -37,7 +37,7 @@ class CommonFixes(SubtitleTextModification): NReProcessor(re.compile(r'(?u)(^\W*:\s*(?=\w+))'), "", name="CM_empty_colon_start"), # fix music symbols - NReProcessor(re.compile(ur'(?u)(^[-\s>~]*[*#¶]+\s*)|(\s*[*#¶]+\s*$)'), + NReProcessor(re.compile(ur'(?u)(^[-\s>~]*[*#¶]+\s+)|(\s*[*#¶]+\s*$)'), lambda x: u"♪ " if x.group(1) else u" ♪", name="CM_music_symbols"), diff --git a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py index 8912834d7..cb72d898c 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py @@ -49,11 +49,11 @@ class HearingImpaired(SubtitleTextModification): NReProcessor(re.compile(ur'(?sux)-?%(t)s[([][^([)\]]+?(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+[)\]][\s:]*%(t)s' % {"t": TAG}), "", name="HI_brackets"), - NReProcessor(re.compile(ur'(?sux)-?%(t)s[([]%(t)s(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+%(t)s$' % {"t": TAG}), - "", name="HI_bracket_open_start"), + #NReProcessor(re.compile(ur'(?sux)-?%(t)s[([]%(t)s(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+%(t)s$' % {"t": TAG}), + # "", name="HI_bracket_open_start"), - NReProcessor(re.compile(ur'(?sux)-?%(t)s(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+[)\]][\s:]*%(t)s' % {"t": TAG}), "", - name="HI_bracket_open_end"), + #NReProcessor(re.compile(ur'(?sux)-?%(t)s(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+[)\]][\s:]*%(t)s' % {"t": TAG}), "", + # name="HI_bracket_open_end"), # text before colon (and possible dash in front), max 11 chars after the first whitespace (if any) # NReProcessor(re.compile(r'(?u)(^[A-z\-\'"_]+[\w\s]{0,11}:[^0-9{2}][\s]*)'), "", name="HI_before_colon"), @@ -73,7 +73,7 @@ class HearingImpaired(SubtitleTextModification): supported=lambda p: not p.only_uppercase), # remove MAN: - NReProcessor(re.compile(ur'(?suxi)(.*MAN:\s*)'), "", name="HI_remove_man"), + NReProcessor(re.compile(ur'(?suxi)(\b(?:WO)MAN:\s*)'), "", name="HI_remove_man"), # dash in front # NReProcessor(re.compile(r'(?u)^\s*-\s*'), "", name="HI_starting_dash"), @@ -81,13 +81,18 @@ class HearingImpaired(SubtitleTextModification): # all caps at start before new sentence NReProcessor(re.compile(ur'(?u)^(?=[A-ZÀ-Ž]{4,})[A-ZÀ-Ž-_\s]+\s([A-ZÀ-Ž][a-zà-ž].+)'), r"\1", name="HI_starting_upper_then_sentence", supported=lambda p: not p.only_uppercase), + ] + post_processors = empty_line_post_processors + last_processors = [ # remove music symbols NReProcessor(re.compile(ur'(?u)(^%(t)s[*#¶♫♪\s]*%(t)s[*#¶♫♪\s]+%(t)s[*#¶♫♪\s]*%(t)s$)' % {"t": TAG}), "", name="HI_music_symbols_only"), - ] - post_processors = empty_line_post_processors + # remove music entries + NReProcessor(re.compile(ur'(?ums)(^[-\s>~]*[♫♪]+\s*.+|.+\s*[♫♪]+\s*$)'), + "", name="HI_music"), + ] registry.register(HearingImpaired) From 9bf5123a0076abfc45c39265d1425b673114f980 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 18 May 2019 15:03:53 +0200 Subject: [PATCH 517/710] providers: subscene: don't search for season packs (broken); fix endpoint error handling --- .../subliminal_patch/providers/subscene.py | 24 +++++++++---------- .../Libraries/Shared/subscene_api/subscene.py | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index b940eb787..b6127cbb1 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -218,18 +218,18 @@ def query(self, video): logger.debug('No alternative results found') # packs - if video.season_fully_aired: - term = u"%s S%02i" % (series, video.season) - logger.debug('Searching for packs: %s', term) - time.sleep(self.search_throttle) - film = search(term, session=self.session, throttle=self.search_throttle) - if film and film.subtitles: - logger.debug('Pack results found: %s', len(film.subtitles)) - subtitles += self.parse_results(video, film) - else: - logger.debug('No pack results found') - else: - logger.debug("Not searching for packs, because the season hasn't fully aired") + # if video.season_fully_aired: + # term = u"%s S%02i" % (series, video.season) + # logger.debug('Searching for packs: %s', term) + # time.sleep(self.search_throttle) + # film = search(term, session=self.session, throttle=self.search_throttle) + # if film and film.subtitles: + # logger.debug('Pack results found: %s', len(film.subtitles)) + # subtitles += self.parse_results(video, film) + # else: + # logger.debug('No pack results found') + # else: + # logger.debug("Not searching for packs, because the season hasn't fully aired") if more_than_one: time.sleep(self.search_throttle) else: diff --git a/Contents/Libraries/Shared/subscene_api/subscene.py b/Contents/Libraries/Shared/subscene_api/subscene.py index e0ba77138..c8450518a 100644 --- a/Contents/Libraries/Shared/subscene_api/subscene.py +++ b/Contents/Libraries/Shared/subscene_api/subscene.py @@ -263,7 +263,7 @@ def search(term, release=True, session=None, year=None, limit_to=SearchTypes.Exa time.sleep(throttle) # fixme: detect endpoint from html continue - raise + return break if soup: From 30a0f11515c36cf058f2132de2e0dbc4337e8464 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 19 May 2019 04:27:20 +0200 Subject: [PATCH 518/710] providers: subscene: don't calculate video fn for now --- .../Libraries/Shared/subliminal_patch/providers/subscene.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index b6127cbb1..098447ad5 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -190,7 +190,7 @@ def parse_results(self, video, film): return subtitles def query(self, video): - vfn = get_video_filename(video) + #vfn = get_video_filename(video) subtitles = [] #logger.debug(u"Searching for: %s", vfn) # film = search(vfn, session=self.session) From db536502a17484be9a100b039c05de1cd94678a1 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 19 May 2019 06:06:43 +0200 Subject: [PATCH 519/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 594fc433d..1b2b6e532 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3074</string> + <string>2.6.5.3082</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3074 DEV +Version 2.6.5.3082 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 7bb42e95d858efad6ff387837e1d84b09882f1cf Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 24 May 2019 18:06:00 +0200 Subject: [PATCH 520/710] core: add env var SZ_KEEP_ENCODING to keep encoding of subtitles --- Contents/Libraries/Shared/subliminal_patch/core.py | 3 ++- Contents/Libraries/Shared/subliminal_patch/subtitle.py | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 0905ce1df..097457ce3 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -309,7 +309,8 @@ def download_subtitle(self, subtitle): logger.error('Invalid subtitle') return False - subtitle.normalize() + if not os.environ.get("SZ_KEEP_ENCODING", False): + subtitle.normalize() return True diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index ea89d901a..9890ce41d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -320,7 +320,8 @@ def get_modified_content(self, format="srt", debug=False): :return: string """ if not self.mods: - return fix_text(self.content.decode("utf-8"), **ftfy_defaults).encode(encoding="utf-8") + return fix_text(self.content.decode(encoding=self._guessed_encoding), **ftfy_defaults).encode( + encoding=self._guessed_encoding) submods = SubtitleModifications(debug=debug) if submods.load(content=self.text, language=self.language): @@ -329,7 +330,7 @@ def get_modified_content(self, format="srt", debug=False): self.mods = submods.mods_used content = fix_text(self.pysubs2_to_unicode(submods.f, format=format), **ftfy_defaults)\ - .encode(encoding="utf-8") + .encode(encoding=self._guessed_encoding) submods.f = None del submods return content From a65b5a5d82fde1c8d84c549391f8b14766f5f96b Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 24 May 2019 18:10:09 +0200 Subject: [PATCH 521/710] core: missed forced utf-8 instance --- Contents/Libraries/Shared/subliminal_patch/subtitle.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 9890ce41d..6b2263e59 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -251,8 +251,7 @@ def is_valid(self): subs = pysubs2.SSAFile.from_string(text, fps=self.plex_media_fps) unicontent = self.pysubs2_to_unicode(subs) - self.content = unicontent.encode("utf-8") - self._guessed_encoding = "utf-8" + self.content = unicontent.encode(self._guessed_encoding) except: logger.exception("Couldn't convert subtitle %s to .srt format: %s", self, traceback.format_exc()) return False From 2fa217d5d9b3cc3ee59e475f36c9fe1123d84754 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Mon, 27 May 2019 12:27:18 +0200 Subject: [PATCH 522/710] core: subtitle: encoding: re-revert 1ed4f11 --- Contents/Libraries/Shared/subliminal_patch/subtitle.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 6b2263e59..057be546a 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -117,14 +117,14 @@ def guess_encoding(self): logger.info('Guessing encoding for language %s', self.language) - encodings = ['utf-8', 'utf-16'] + encodings = ['utf-8'] # add language-specific encodings # http://scratchpad.wikia.com/wiki/Character_Encoding_Recommendation_for_Languages if self.language.alpha3 == 'zho': encodings.extend(['cp936', 'gb2312', 'gbk', 'gb18030', 'hz', 'iso2022_jp_2', 'cp950', 'gb18030', 'big5', - 'big5hkscs']) + 'big5hkscs', 'utf-16']) elif self.language.alpha3 == 'jpn': encodings.extend(['shift-jis', 'cp932', 'euc_jp', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2', 'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext', ]) @@ -133,7 +133,7 @@ def guess_encoding(self): # arabian/farsi elif self.language.alpha3 in ('ara', 'fas', 'per'): - encodings.append('windows-1256') + encodings.extend(['windows-1256', 'utf-16']) elif self.language.alpha3 == 'heb': encodings.extend(['windows-1255', 'iso-8859-8']) elif self.language.alpha3 == 'tur': From 05d0de51208e05fc6ac484d4f08b43a9047e061f Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Mon, 27 May 2019 12:34:37 +0200 Subject: [PATCH 523/710] core: providers: argenteam: backport fixes from bazarr --- .../subliminal_patch/providers/argenteam.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/argenteam.py b/Contents/Libraries/Shared/subliminal_patch/providers/argenteam.py index 6a2c7aec8..6b872e920 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/argenteam.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/argenteam.py @@ -23,9 +23,10 @@ class ArgenteamSubtitle(Subtitle): hearing_impaired_verifiable = False _release_info = None - def __init__(self, language, download_link, movie_kind, title, season, episode, year, release, version, source, + def __init__(self, language, page_link, download_link, movie_kind, title, season, episode, year, release, version, source, video_codec, tvdb_id, imdb_id, asked_for_episode=None, asked_for_release_group=None, *args, **kwargs): - super(ArgenteamSubtitle, self).__init__(language, download_link, *args, **kwargs) + super(ArgenteamSubtitle, self).__init__(language, page_link=page_link, *args, **kwargs) + self.page_link = page_link self.download_link = download_link self.movie_kind = movie_kind self.title = title @@ -135,7 +136,8 @@ class ArgenteamProvider(Provider, ProviderSubtitleArchiveMixin): provider_name = 'argenteam' languages = {Language.fromalpha2(l) for l in ['es']} video_types = (Episode, Movie) - API_URL = "http://argenteam.net/api/v1/" + BASE_URL = "http://www.argenteam.net/" + API_URL = BASE_URL + "api/v1/" subtitle_class = ArgenteamSubtitle hearing_impaired_verifiable = False language_list = list(languages) @@ -240,12 +242,13 @@ def query(self, title, video, titles=None): for r in content['releases']: for s in r['subtitles']: - sub = ArgenteamSubtitle(language, s['uri'], "episode" if is_episode else "movie", returned_title, + movie_kind = "episode" if is_episode else "movie" + page_link = self.BASE_URL + movie_kind + "/" + str(aid) + sub = ArgenteamSubtitle(language, page_link, s['uri'], movie_kind, returned_title, season, episode, year, r.get('team'), r.get('tags'), r.get('source'), r.get('codec'), content.get("tvdb"), imdb_id, asked_for_release_group=video.release_group, - asked_for_episode=episode - ) + asked_for_episode=episode) subtitles.append(sub) if has_multiple_ids: From 0c1042ec5c3e9756a99b0c541c776a998189413a Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Mon, 27 May 2019 12:39:04 +0200 Subject: [PATCH 524/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 1b2b6e532..b2ee2026d 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3082</string> + <string>2.6.5.3087</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3082 DEV +Version 2.6.5.3087 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 0deb3eae21720dc1a61ada9b5d048f601aeea1e8 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 30 May 2019 04:11:12 +0200 Subject: [PATCH 525/710] providers: subscene: react to new endpoint; store and use new endpoint --- .../Libraries/Shared/subscene_api/subscene.py | 46 ++++++++++++++++--- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/Contents/Libraries/Shared/subscene_api/subscene.py b/Contents/Libraries/Shared/subscene_api/subscene.py index c8450518a..a9216d5fd 100644 --- a/Contents/Libraries/Shared/subscene_api/subscene.py +++ b/Contents/Libraries/Shared/subscene_api/subscene.py @@ -30,6 +30,7 @@ import sys import requests import time +import logging is_PY2 = sys.version_info[0] < 3 if is_PY2: @@ -39,8 +40,13 @@ from contextlib import suppress from urllib2.request import Request, urlopen +from dogpile.cache.api import NO_VALUE +from subliminal.cache import region from bs4 import BeautifulSoup, NavigableString + +logger = logging.getLogger(__name__) + # constants HEADERS = { } @@ -50,6 +56,13 @@ "Kit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36" +ENDPOINT_RE = re.compile(ur'(?uis)<form action="/subtitles/(.+)">.*?<input type="text"') + + +class NewEndpoint(Exception): + pass + + # utils def soup_for(url, session=None, user_agent=DEFAULT_USER_AGENT): url = re.sub("\s", "+", url) @@ -58,7 +71,17 @@ def soup_for(url, session=None, user_agent=DEFAULT_USER_AGENT): html = urlopen(r).read().decode("utf-8") else: ret = session.get(url) - ret.raise_for_status() + try: + ret.raise_for_status() + except requests.HTTPError, e: + if e.response.status_code == 404: + m = ENDPOINT_RE.search(ret.text) + if m: + try: + raise NewEndpoint(m.group(1)) + except: + pass + raise html = ret.text return BeautifulSoup(html, "html.parser") @@ -250,20 +273,31 @@ def get_first_film(soup, section, year=None, session=None): def search(term, release=True, session=None, year=None, limit_to=SearchTypes.Exact, throttle=0): # note to subscene: if you actually start to randomize the endpoint, we'll have to query your server even more endpoints = ["searching", "search", "srch", "find"] + if release: endpoints = ["release"] + else: + endpoint = region.get("subscene_endpoint") + if endpoint is not NO_VALUE and endpoint not in endpoints: + endpoints.insert(0, endpoint) soup = None for endpoint in endpoints: try: soup = soup_for("%s/subtitles/%s?q=%s" % (SITE_DOMAIN, endpoint, term), session=session) - except requests.HTTPError, e: - if e.response.status_code == 404: + + except NewEndpoint, e: + new_endpoint = e.message + if new_endpoint not in endpoints: + new_endpoint = new_endpoint.strip() + logger.debug("Switching main endpoint to %s", new_endpoint) + region.set("subscene_endpoint", new_endpoint) time.sleep(throttle) - # fixme: detect endpoint from html - continue - return + return search(term, release=release, session=session, year=year, limit_to=limit_to, throttle=throttle) + else: + region.delete("subscene_endpoint") + raise break if soup: From b379468b4713ba48c12c2d3ee2c70cfdca3dadc7 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 30 May 2019 04:13:00 +0200 Subject: [PATCH 526/710] properly re-raise --- Contents/Libraries/Shared/subscene_api/subscene.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subscene_api/subscene.py b/Contents/Libraries/Shared/subscene_api/subscene.py index a9216d5fd..823e379fe 100644 --- a/Contents/Libraries/Shared/subscene_api/subscene.py +++ b/Contents/Libraries/Shared/subscene_api/subscene.py @@ -297,7 +297,7 @@ def search(term, release=True, session=None, year=None, limit_to=SearchTypes.Exa return search(term, release=release, session=session, year=year, limit_to=limit_to, throttle=throttle) else: region.delete("subscene_endpoint") - raise + raise Exception("New endpoint %s didn't work; exiting" % new_endpoint) break if soup: From c15d8fbe58c33a59c512c93f232be58f1112bb2a Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 30 May 2019 04:14:38 +0200 Subject: [PATCH 527/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index b2ee2026d..94d579e72 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3087</string> + <string>2.6.5.3090</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3087 DEV +Version 2.6.5.3090 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 4751ea8396348bde62bcc6a9985d33ef89768245 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 30 May 2019 04:21:50 +0200 Subject: [PATCH 528/710] bump dev --- CHANGELOG.md | 7 +++++++ README.md | 20 +++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ece7920ef..b46a60d95 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,11 @@ +2.6.5.3062 + +Changelog +- core: cf: optimize +- core: http: don't query DNS with IPs. thanks @fgump (fixes sonarr/radarr) + + 2.6.5.3041 Changelog diff --git a/README.md b/README.md index 924f25a80..464796ec1 100644 --- a/README.md +++ b/README.md @@ -91,22 +91,28 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3074 +2.6.5.30xx subscene, addic7ed and titlovi - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog -- core: cf: bypass cf 95% of the time without captchas -- core: fix breaking line endings of certain languages (chinese, UTF-16); fixes #646 -- core: update pysubs2 to 0.2.3 +- providers: subscene: fix endpoint (hopefully for longer now) +- providers: subscene: don't search for season packs (broken for now; relieves 50% of server load on provider) +- providers: subscene: don't calculate video fn for now +- providers: argenteam: backport fixes from bazarr +- subtitle: try decoding with utf-16 by default as well (zho/farsi) +- submod: HI: remove music tags by default +- core: compat (bazarr): add env var SZ_KEEP_ENCODING to keep encoding of subtitles -2.6.5.3062 +2.6.5.3074 Changelog -- core: cf: optimize -- core: http: don't query DNS with IPs. thanks @fgump (fixes sonarr/radarr) +- core: cf: bypass cf 95% of the time without captchas +- core: fix breaking line endings of certain languages (chinese, UTF-16); fixes #646 +- core: update pysubs2 to 0.2.3 + [older changes](CHANGELOG.md) From 82ffed699f36f97cd8488ff0881268035adcb59b Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 30 May 2019 04:23:07 +0200 Subject: [PATCH 529/710] release 2.6.5.3092 --- Contents/Info.plist | 6 +++--- README.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 94d579e72..1493cde35 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3090</string> + <string>2.6.5.3092</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3090 DEV +Version 2.6.5.3092 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 464796ec1..8f241d7e9 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.30xx +2.6.5.3092 subscene, addic7ed and titlovi - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration From bbb9a62357edefb389f2ec45091c0feb1b6fb9de Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 30 May 2019 04:23:49 +0200 Subject: [PATCH 530/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 1493cde35..1061b067d 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3092 +Version 2.6.5.3092 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From ab93f9809aa8ffa917d8a64bc68b076d4afeacfc Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 6 Jun 2019 01:31:27 +0200 Subject: [PATCH 531/710] providers: subscene: dumb down endpoint detection; adapt --- .../Libraries/Shared/subscene_api/subscene.py | 50 ++++++------------- 1 file changed, 16 insertions(+), 34 deletions(-) diff --git a/Contents/Libraries/Shared/subscene_api/subscene.py b/Contents/Libraries/Shared/subscene_api/subscene.py index 823e379fe..1b43f5473 100644 --- a/Contents/Libraries/Shared/subscene_api/subscene.py +++ b/Contents/Libraries/Shared/subscene_api/subscene.py @@ -56,7 +56,7 @@ "Kit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36" -ENDPOINT_RE = re.compile(ur'(?uis)<form action="/subtitles/(.+)">.*?<input type="text"') +ENDPOINT_RE = re.compile(ur'(?uis)<form.+?action="/subtitles/(.+)">.*?<input type="text"') class NewEndpoint(Exception): @@ -64,23 +64,16 @@ class NewEndpoint(Exception): # utils -def soup_for(url, session=None, user_agent=DEFAULT_USER_AGENT): +def soup_for(url, data=None, session=None, user_agent=DEFAULT_USER_AGENT): url = re.sub("\s", "+", url) if not session: r = Request(url, data=None, headers=dict(HEADERS, **{"User-Agent": user_agent})) html = urlopen(r).read().decode("utf-8") else: - ret = session.get(url) + ret = session.post(url, data=data) try: ret.raise_for_status() except requests.HTTPError, e: - if e.response.status_code == 404: - m = ENDPOINT_RE.search(ret.text) - if m: - try: - raise NewEndpoint(m.group(1)) - except: - pass raise html = ret.text return BeautifulSoup(html, "html.parser") @@ -272,33 +265,22 @@ def get_first_film(soup, section, year=None, session=None): def search(term, release=True, session=None, year=None, limit_to=SearchTypes.Exact, throttle=0): # note to subscene: if you actually start to randomize the endpoint, we'll have to query your server even more - endpoints = ["searching", "search", "srch", "find"] if release: - endpoints = ["release"] + endpoint = "release" else: - endpoint = region.get("subscene_endpoint") - if endpoint is not NO_VALUE and endpoint not in endpoints: - endpoints.insert(0, endpoint) - - soup = None - for endpoint in endpoints: - try: - soup = soup_for("%s/subtitles/%s?q=%s" % (SITE_DOMAIN, endpoint, term), - session=session) - - except NewEndpoint, e: - new_endpoint = e.message - if new_endpoint not in endpoints: - new_endpoint = new_endpoint.strip() - logger.debug("Switching main endpoint to %s", new_endpoint) - region.set("subscene_endpoint", new_endpoint) - time.sleep(throttle) - return search(term, release=release, session=session, year=year, limit_to=limit_to, throttle=throttle) - else: - region.delete("subscene_endpoint") - raise Exception("New endpoint %s didn't work; exiting" % new_endpoint) - break + endpoint = region.get("subscene_endpoint2") + if endpoint is NO_VALUE: + ret = session.get(SITE_DOMAIN) + time.sleep(throttle) + m = ENDPOINT_RE.search(ret.text) + if m: + endpoint = m.group(1).strip() + logger.debug("Switching main endpoint to %s", endpoint) + region.set("subscene_endpoint2", endpoint) + + soup = soup_for("%s/subtitles/%s" % (SITE_DOMAIN, endpoint), data={"query": term}, + session=session) if soup: if "Subtitle search by" in str(soup): From f095d5c99c63effb2b4b16addc4160ae6bc4a697 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 6 Jun 2019 01:38:28 +0200 Subject: [PATCH 532/710] providers: subscene: remove obsolete exception handling --- Contents/Libraries/Shared/subscene_api/subscene.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Contents/Libraries/Shared/subscene_api/subscene.py b/Contents/Libraries/Shared/subscene_api/subscene.py index 1b43f5473..39064f744 100644 --- a/Contents/Libraries/Shared/subscene_api/subscene.py +++ b/Contents/Libraries/Shared/subscene_api/subscene.py @@ -71,10 +71,7 @@ def soup_for(url, data=None, session=None, user_agent=DEFAULT_USER_AGENT): html = urlopen(r).read().decode("utf-8") else: ret = session.post(url, data=data) - try: - ret.raise_for_status() - except requests.HTTPError, e: - raise + ret.raise_for_status() html = ret.text return BeautifulSoup(html, "html.parser") From c2f054a25eb578595971a5daa349222fa7514a46 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 6 Jun 2019 01:41:57 +0200 Subject: [PATCH 533/710] release 2.6.5.3096 --- CHANGELOG.md | 9 +++++++++ Contents/Info.plist | 6 +++--- README.md | 14 ++++++++------ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b46a60d95..afffc46c8 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,13 @@ + +2.6.5.3074 + +Changelog +- core: cf: bypass cf 95% of the time without captchas +- core: fix breaking line endings of certain languages (chinese, UTF-16); fixes #646 +- core: update pysubs2 to 0.2.3 + + 2.6.5.3062 Changelog diff --git a/Contents/Info.plist b/Contents/Info.plist index 1061b067d..ce3a9f151 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3092</string> + <string>2.6.5.3096</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3092 DEV +Version 2.6.5.3096 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 8f241d7e9..961bd7e5e 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,14 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog +2.6.5.3096 + +subscene, addic7ed and titlovi +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- providers: subscene: fix again (subscene, contact us please, so we can end this) + 2.6.5.3092 @@ -106,12 +114,6 @@ Changelog - core: compat (bazarr): add env var SZ_KEEP_ENCODING to keep encoding of subtitles -2.6.5.3074 - -Changelog -- core: cf: bypass cf 95% of the time without captchas -- core: fix breaking line endings of certain languages (chinese, UTF-16); fixes #646 -- core: update pysubs2 to 0.2.3 From ee54839f28d6986dfc837bd1ff2f7917cfa8aa87 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 6 Jun 2019 01:45:16 +0200 Subject: [PATCH 534/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index ce3a9f151..db587eed0 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3096 +Version 2.6.5.3096 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 2dd9b1723bf76b83992c27d7367c423a8e424600 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 6 Jun 2019 02:13:20 +0200 Subject: [PATCH 535/710] core: allow system DNS again by putting "system" as the DNS --- Contents/Code/support/config.py | 5 +++-- Contents/DefaultPrefs.json | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index bf57dd7d6..ad73cb39b 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -1084,11 +1084,12 @@ def text_based_formats(self): def parse_custom_dns(self): custom_dns = Prefs['use_custom_dns2'].strip() os.environ["dns_resolvers"] = "" - if custom_dns: + + if custom_dns and custom_dns != "system": ips = filter(lambda x: x, [d.strip() for d in custom_dns.split(",")]) if ips: os.environ["dns_resolvers"] = json.dumps(ips) - return os.environ["dns_resolvers"] + return os.environ["dns_resolvers"] def init_subliminal_patches(self): # configure custom subtitle destination folders for scanning pre-existing subs diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index a8f749ac1..f063fc6fe 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -861,7 +861,7 @@ }, { "id": "use_custom_dns2", - "label": "Use custom DNS (IPs, comma-separated, leave empty for system DNS. Default: Google/CF)", + "label": "Use custom DNS (IPs, comma-separated, set to 'system' for system DNS. Default: Google/CF)", "type": "text", "default": "1.1.1.1, 8.8.8.8" }, From 5f40452f571d1ce28065b9e13d16896003049016 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 6 Jun 2019 02:14:50 +0200 Subject: [PATCH 536/710] release 2.6.5.3099 --- Contents/Info.plist | 4 ++-- README.md | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index db587eed0..e6a2a285c 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3096</string> + <string>2.6.5.3099</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3096 DEV +Version 2.6.5.3099 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 961bd7e5e..67df81424 100644 --- a/README.md +++ b/README.md @@ -90,12 +90,13 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3096 +2.6.5.3099 subscene, addic7ed and titlovi - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog +- core: allow system DNS again by putting "system" as the DNS - providers: subscene: fix again (subscene, contact us please, so we can end this) From aa5cba9347b30585b6cc5dffe4c7fac3f3b6defd Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 6 Jun 2019 02:15:23 +0200 Subject: [PATCH 537/710] release 2.6.5.3099 --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index e6a2a285c..40edaa5cd 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3099 DEV +Version 2.6.5.3099 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From ba2f3f217278474b102ee4d58aae86f69db637ad Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 6 Jun 2019 02:18:34 +0200 Subject: [PATCH 538/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 40edaa5cd..e6a2a285c 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3099 +Version 2.6.5.3099 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 2c25191291c60c4afe833b256c4406dd4f5f36b1 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 20 Jun 2019 16:11:21 +0200 Subject: [PATCH 539/710] providers: subscene: support logging in --- Contents/Code/support/config.py | 2 + Contents/DefaultPrefs.json | 14 +++ .../subliminal_patch/providers/subscene.py | 109 +++++++++++++++--- 3 files changed, 110 insertions(+), 15 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index ad73cb39b..7feea0b27 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -866,6 +866,8 @@ def get_provider_settings(self): }, 'subscene': { 'only_foreign': self.forced_only, + 'username': Prefs['provider.subscene.username'], + 'password': Prefs['provider.subscene.password'], }, 'legendastv': {'username': Prefs['provider.legendastv.username'], 'password': Prefs['provider.legendastv.password'], diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index f063fc6fe..671a2c3f7 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -431,6 +431,20 @@ "type": "bool", "default": "true" }, + { + "id": "provider.subscene.username", + "label": "SubScene Username", + "type": "text", + "default": "" + }, + { + "id": "provider.subscene.password", + "label": "SubScene Password", + "type": "text", + "option": "hidden", + "default": "", + "secure": "true" + }, { "id": "provider.supersubtitles.enabled", "label": "Provider: Enable feliratok.info (Hungarian)", diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 098447ad5..a5cab3fd8 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -4,24 +4,34 @@ import logging import os import time +import traceback + +import requests + import inflect +import re +import json +import HTMLParser +import urlparse from zipfile import ZipFile from babelfish import language_converters from guessit import guessit +from dogpile.cache.api import NO_VALUE from subliminal import Episode, ProviderError +from subliminal.exceptions import ConfigurationError from subliminal.utils import sanitize_release_group +from subliminal.cache import region from subliminal_patch.http import RetryingCFSession from subliminal_patch.providers import Provider from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin from subliminal_patch.subtitle import Subtitle, guess_matches from subliminal_patch.converters.subscene import language_ids, supported_languages -from subscene_api.subscene import search, Subtitle as APISubtitle +from subscene_api.subscene import search, Subtitle as APISubtitle, SITE_DOMAIN from subzero.language import Language p = inflect.engine() - language_converters.register('subscene = subliminal_patch.converters.subscene:SubsceneConverter') logger = logging.getLogger(__name__) @@ -112,16 +122,67 @@ class SubsceneProvider(Provider, ProviderSubtitleArchiveMixin): skip_wrong_fps = False hearing_impaired_verifiable = True only_foreign = False + username = None + password = None - search_throttle = 2 # seconds + search_throttle = 5 # seconds + + def __init__(self, only_foreign=False, username=None, password=None): + if not all((username, password)): + raise ConfigurationError('Username and password must be specified') - def __init__(self, only_foreign=False): self.only_foreign = only_foreign + self.username = username + self.password = password def initialize(self): logger.info("Creating session") self.session = RetryingCFSession() + def login(self): + r = self.session.get("https://subscene.com/account/login") + match = re.search(r"<script id='modelJson' type='application/json'>\s*(.+)\s*</script>", r.content) + + if match: + h = HTMLParser.HTMLParser() + data = json.loads(h.unescape(match.group(1))) + login_url = urlparse.urljoin(data["siteUrl"], data["loginUrl"]) + time.sleep(1.0) + + r = self.session.post(login_url, + { + "username": self.username, + "password": self.password, + data["antiForgery"]["name"]: data["antiForgery"]["value"] + }) + pep_content = re.search(r"<form method=\"post\" action=\"https://subscene\.com/\">" + r".+name=\"id_token\".+?value=\"(?P<id_token>.+?)\".*?" + r"access_token\".+?value=\"(?P<access_token>.+?)\".+?" + r"token_type.+?value=\"(?P<token_type>.+?)\".+?" + r"expires_in.+?value=\"(?P<expires_in>.+?)\".+?" + r"scope.+?value=\"(?P<scope>.+?)\".+?" + r"state.+?value=\"(?P<state>.+?)\".+?" + r"session_state.+?value=\"(?P<session_state>.+?)\"", + r.content, re.MULTILINE | re.DOTALL) + + if pep_content: + r = self.session.post(SITE_DOMAIN, pep_content.groupdict()) + try: + r.raise_for_status() + except Exception: + raise ProviderError("Something went wrong when trying to log in: %s", traceback.format_exc()) + else: + cj = self.session.cookies.copy() + store_cks = ("scene", "idsrv", "idsrv.xsrf", "idsvr.clients", "idsvr.session", "idsvr.username") + for cn in self.session.cookies.iterkeys(): + if cn not in store_cks: + del cj[cn] + + logger.debug("Storing cookies: %r", cj) + region.set("subscene_cookies2", cj) + return + raise ProviderError("Something went wrong when trying to log in #1") + def terminate(self): logger.info("Closing session") self.session.close() @@ -176,7 +237,11 @@ def download_subtitle(self, subtitle): def parse_results(self, video, film): subtitles = [] for s in film.subtitles: - subtitle = SubsceneSubtitle.from_api(s) + try: + subtitle = SubsceneSubtitle.from_api(s) + except NotImplementedError, e: + logger.info(e) + continue subtitle.asked_for_release_group = video.release_group if isinstance(video, Episode): subtitle.asked_for_episode = video.episode @@ -189,10 +254,16 @@ def parse_results(self, video, film): return subtitles + def do_search(self, *args, **kwargs): + try: + return search(*args, **kwargs) + except requests.HTTPError: + region.delete("subscene_cookies2") + def query(self, video): - #vfn = get_video_filename(video) + # vfn = get_video_filename(video) subtitles = [] - #logger.debug(u"Searching for: %s", vfn) + # logger.debug(u"Searching for: %s", vfn) # film = search(vfn, session=self.session) # # if film and film.subtitles: @@ -201,16 +272,24 @@ def query(self, video): # else: # logger.debug('No release results found') - #time.sleep(self.search_throttle) + # time.sleep(self.search_throttle) + prev_cookies = region.get("subscene_cookies2") + if prev_cookies != NO_VALUE: + logger.debug("Re-using old subscene cookies: %r", prev_cookies) + self.session.cookies.update(prev_cookies) + + else: + logger.debug("Logging in") + self.login() # re-search for episodes without explicit release name if isinstance(video, Episode): - #term = u"%s S%02iE%02i" % (video.series, video.season, video.episode) + # term = u"%s S%02iE%02i" % (video.series, video.season, video.episode) more_than_one = len([video.series] + video.alternative_series) > 1 - for series in [video.series] + video.alternative_series: + for series in set([video.series] + video.alternative_series): term = u"%s - %s Season" % (series, p.number_to_words("%sth" % video.season).capitalize()) logger.debug('Searching for alternative results: %s', term) - film = search(term, session=self.session, release=False, throttle=self.search_throttle) + film = self.do_search(term, session=self.session, release=False, throttle=self.search_throttle) if film and film.subtitles: logger.debug('Alternative results found: %s', len(film.subtitles)) subtitles += self.parse_results(video, film) @@ -234,10 +313,10 @@ def query(self, video): time.sleep(self.search_throttle) else: more_than_one = len([video.title] + video.alternative_titles) > 1 - for title in [video.title] + video.alternative_titles: - logger.debug('Searching for movie results: %s', title) - film = search(title, year=video.year, session=self.session, limit_to=None, release=False, - throttle=self.search_throttle) + for title in set([video.title] + video.alternative_titles): + logger.debug('Searching for movie results: %r', title) + film = self.do_search(title, year=video.year, session=self.session, limit_to=None, release=False, + throttle=self.search_throttle) if film and film.subtitles: subtitles += self.parse_results(video, film) if more_than_one: From 94928c29303807a67e8b791ad9f6ba0613be2aef Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 21 Jun 2019 04:16:46 +0200 Subject: [PATCH 540/710] providers: add Napisy24 (polish) --- Contents/Code/support/config.py | 6 + Contents/DefaultPrefs.json | 20 +++ .../Libraries/Shared/subliminal_patch/core.py | 4 + .../subliminal_patch/providers/napisy24.py | 124 ++++++++++++++++++ 4 files changed, 154 insertions(+) create mode 100644 Contents/Libraries/Shared/subliminal_patch/providers/napisy24.py diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 7feea0b27..e79e0665f 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -761,6 +761,7 @@ def providers_by_prefs(self): return {'opensubtitles': cast_bool(Prefs['provider.opensubtitles.enabled']), # 'thesubdb': Prefs['provider.thesubdb.enabled'], 'podnapisi': cast_bool(Prefs['provider.podnapisi.enabled']), + 'napisy24': cast_bool(Prefs['provider.napisy24.enabled']), 'titlovi': cast_bool(Prefs['provider.titlovi.enabled']), 'addic7ed': cast_bool(Prefs['provider.addic7ed.enabled']) and self.has_anticaptcha, 'tvsubtitles': cast_bool(Prefs['provider.tvsubtitles.enabled']), @@ -801,6 +802,7 @@ def get_providers(self, media_type="series"): providers["argenteam"] = False providers["assrt"] = False providers["subscene"] = False + providers["napisy24"] = False providers_forced_off = dict(providers) if not self.unrar and providers["legendastv"]: @@ -864,6 +866,10 @@ def get_provider_settings(self): 'only_foreign': self.forced_only, 'also_foreign': self.forced_also, }, + 'napisy24': { + 'username': Prefs['provider.napisy24.username'], + 'password': Prefs['provider.napisy24.password'], + }, 'subscene': { 'only_foreign': self.forced_only, 'username': Prefs['provider.subscene.username'], diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 671a2c3f7..5d48f74a4 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -335,6 +335,26 @@ "type": "bool", "default": "true" }, + { + "id": "provider.napisy24.enabled", + "label": "Provider: Enable Napisy24 (pl)", + "type": "bool", + "default": "false" + }, + { + "id": "provider.napisy24.username", + "label": "Napisy24 Username", + "type": "text", + "default": "" + }, + { + "id": "provider.napisy24.password", + "label": "Napisy24 Password", + "type": "text", + "option": "hidden", + "default": "", + "secure": "true" + }, { "id": "provider.addic7ed.enabled", "label": "Provider: Enable Addic7ed (needs AntiCaptcha)", diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 097457ce3..9dd6881ed 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -561,6 +561,10 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski except MemoryError: logger.warning(u"Couldn't compute napiprojekt hash for %s", path) + if "napisy24" in providers: + # Napisy24 uses the same hash as opensubtitles + video.hashes['napisy24'] = hash_opensubtitles(path) + logger.debug('Computed hashes %r', video.hashes) else: logger.warning('Size is lower than 10MB: hashes not computed') diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/napisy24.py b/Contents/Libraries/Shared/subliminal_patch/providers/napisy24.py new file mode 100644 index 000000000..553e948f2 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/providers/napisy24.py @@ -0,0 +1,124 @@ +import logging +import os +from io import BytesIO +from zipfile import ZipFile + +from requests import Session + +from subliminal_patch.subtitle import Subtitle +from subliminal_patch.providers import Provider +from subliminal import __short_version__ +from subliminal.exceptions import AuthenticationError, ConfigurationError +from subliminal.subtitle import fix_line_ending +from subzero.language import Language + +logger = logging.getLogger(__name__) + + +class Napisy24Subtitle(Subtitle): + '''Napisy24 Subtitle.''' + provider_name = 'napisy24' + + def __init__(self, language, hash, imdb_id, napis_id): + super(Napisy24Subtitle, self).__init__(language) + self.hash = hash + self.imdb_id = imdb_id + self.napis_id = napis_id + + @property + def id(self): + return self.hash + + def get_matches(self, video): + matches = set() + + # hash + if 'napisy24' in video.hashes and video.hashes['napisy24'] == self.hash: + matches.add('hash') + + # imdb_id + if video.imdb_id and self.imdb_id == video.imdb_id: + matches.add('imdb_id') + + return matches + + +class Napisy24Provider(Provider): + '''Napisy24 Provider.''' + languages = {Language(l) for l in ['pol']} + required_hash = 'napisy24' + api_url = 'http://napisy24.pl/run/CheckSubAgent.php' + + def __init__(self, username=None, password=None): + if all((username, password)): + self.username = username + self.password = password + else: + self.username = 'subliminal' + self.password = 'lanimilbus' + + self.session = None + + def initialize(self): + self.session = Session() + self.session.headers['User-Agent'] = 'Subliminal/%s' % __short_version__ + self.session.headers['Content-Type'] = 'application/x-www-form-urlencoded' + + def terminate(self): + self.session.close() + + def query(self, language, size, name, hash): + params = { + 'postAction': 'CheckSub', + 'ua': self.username, + 'ap': self.password, + 'fs': size, + 'fh': hash, + 'fn': os.path.basename(name), + 'n24pref': 1 + } + + response = self.session.post(self.api_url, data=params, timeout=10) + response.raise_for_status() + + response_content = response.content.split(b'||', 1) + n24_data = response_content[0].decode() + + if n24_data[:2] != 'OK': + if n24_data[:11] == 'login error': + raise AuthenticationError('Login failed') + logger.error('Unknown response: %s', response.content) + return None + + n24_status = n24_data[:4] + if n24_status == 'OK-0': + logger.info('No subtitles found') + return None + + subtitle_info = dict(p.split(':', 1) for p in n24_data.split('|')[1:]) + logger.debug('Subtitle info: %s', subtitle_info) + + if n24_status == 'OK-1': + logger.info('No subtitles found but got video info') + return None + elif n24_status == 'OK-2': + logger.info('Found subtitles') + elif n24_status == 'OK-3': + logger.info('Found subtitles but not from Napisy24 database') + return None + + subtitle_content = response_content[1] + + subtitle = Napisy24Subtitle(language, hash, 'tt%s' % subtitle_info['imdb'].zfill(7), subtitle_info['napisId']) + with ZipFile(BytesIO(subtitle_content)) as zf: + subtitle.content = fix_line_ending(zf.open(zf.namelist()[0]).read()) + + return subtitle + + def list_subtitles(self, video, languages): + subtitles = [self.query(l, video.size, video.name, video.hashes['napisy24']) for l in languages] + return [s for s in subtitles if s is not None] + + def download_subtitle(self, subtitle): + # there is no download step, content is already filled from listing subtitles + pass From 2afba02b590c25dca04807ca0d411984403d5110 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 21 Jun 2019 04:17:15 +0200 Subject: [PATCH 541/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index e6a2a285c..0598cf04e 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3099</string> + <string>2.6.5.3104</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3099 DEV +Version 2.6.5.3104 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From e7c3039fdeb0e8fc49393e0f9cfbac47aea9d2ff Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 21 Jun 2019 04:49:54 +0200 Subject: [PATCH 542/710] providers: subscene: detect login availability; fallback to non year results if none found with year --- .../subliminal_patch/providers/subscene.py | 6 +++- .../Libraries/Shared/subscene_api/subscene.py | 33 +++++++++++++------ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index a5cab3fd8..af5c40d83 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -19,7 +19,7 @@ from guessit import guessit from dogpile.cache.api import NO_VALUE from subliminal import Episode, ProviderError -from subliminal.exceptions import ConfigurationError +from subliminal.exceptions import ConfigurationError, ServiceUnavailable from subliminal.utils import sanitize_release_group from subliminal.cache import region from subliminal_patch.http import RetryingCFSession @@ -141,6 +141,10 @@ def initialize(self): def login(self): r = self.session.get("https://subscene.com/account/login") + if "Server Error" in r.content: + logger.error("Login unavailable; Maintenance?") + raise ServiceUnavailable("Login unavailable; Maintenance?") + match = re.search(r"<script id='modelJson' type='application/json'>\s*(.+)\s*</script>", r.content) if match: diff --git a/Contents/Libraries/Shared/subscene_api/subscene.py b/Contents/Libraries/Shared/subscene_api/subscene.py index 39064f744..07d1eda3e 100644 --- a/Contents/Libraries/Shared/subscene_api/subscene.py +++ b/Contents/Libraries/Shared/subscene_api/subscene.py @@ -255,26 +255,39 @@ def get_first_film(soup, section, year=None, session=None): url = SITE_DOMAIN + t.div.a.get("href") break if not url: - return + # fallback to non-year results + logger.info("Falling back to non-year results as year wasn't found (%s)", year) + url = SITE_DOMAIN + tag.findNext("ul").find("li").div.a.get("href") return Film.from_url(url, session=session) +def find_endpoint(session, content=None): + endpoint = region.get("subscene_endpoint2") + if endpoint is NO_VALUE: + if not content: + content = session.get(SITE_DOMAIN).text + + m = ENDPOINT_RE.search(content) + if m: + endpoint = m.group(1).strip() + logger.debug("Switching main endpoint to %s", endpoint) + region.set("subscene_endpoint2", endpoint) + return endpoint + + def search(term, release=True, session=None, year=None, limit_to=SearchTypes.Exact, throttle=0): # note to subscene: if you actually start to randomize the endpoint, we'll have to query your server even more if release: endpoint = "release" else: - endpoint = region.get("subscene_endpoint2") - if endpoint is NO_VALUE: - ret = session.get(SITE_DOMAIN) - time.sleep(throttle) - m = ENDPOINT_RE.search(ret.text) - if m: - endpoint = m.group(1).strip() - logger.debug("Switching main endpoint to %s", endpoint) - region.set("subscene_endpoint2", endpoint) + endpoint = find_endpoint(session) + time.sleep(throttle) + + if not endpoint: + logger.error("Couldn't find endpoint, exiting") + return soup = soup_for("%s/subtitles/%s" % (SITE_DOMAIN, endpoint), data={"query": term}, session=session) From 2a48782b6b6ffc199e0ad09248f26e851246ea29 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 21 Jun 2019 15:00:35 +0200 Subject: [PATCH 543/710] core: bazarr compat --- .../Libraries/Shared/subliminal_patch/core.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 9dd6881ed..5c79bcff0 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -473,7 +473,7 @@ def list_subtitles(self, video, languages, blacklist=None): SZAsyncProviderPool = SZProviderPool -def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, skip_hashing=False): +def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, skip_hashing=False, hash_from=None): """Scan a video from a `path`. patch: @@ -538,32 +538,34 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski video.alternative_titles.append(alt_guess["title"]) logger.debug("Adding alternative title: %s", alt_guess["title"]) - if dont_use_actual_file: + if dont_use_actual_file and not hash_from: return video # size and hashes if not skip_hashing: + hash_path = hash_from or path video.size = os.path.getsize(path) if video.size > 10485760: logger.debug('Size is %d', video.size) + osub_hash = None if "opensubtitles" in providers: - video.hashes['opensubtitles'] = hash_opensubtitles(path) + video.hashes['opensubtitles'] = osub_hash = hash_opensubtitles(hash_path) if "shooter" in providers: - video.hashes['shooter'] = hash_shooter(path) + video.hashes['shooter'] = hash_shooter(hash_path) if "thesubdb" in providers: - video.hashes['thesubdb'] = hash_thesubdb(path) + video.hashes['thesubdb'] = hash_thesubdb(hash_path) if "napiprojekt" in providers: try: - video.hashes['napiprojekt'] = hash_napiprojekt(path) + video.hashes['napiprojekt'] = hash_napiprojekt(hash_path) except MemoryError: - logger.warning(u"Couldn't compute napiprojekt hash for %s", path) + logger.warning(u"Couldn't compute napiprojekt hash for %s", hash_path) if "napisy24" in providers: # Napisy24 uses the same hash as opensubtitles - video.hashes['napisy24'] = hash_opensubtitles(path) + video.hashes['napisy24'] = osub_hash or hash_opensubtitles(hash_path) logger.debug('Computed hashes %r', video.hashes) else: From 22724c269ce091a88e0b5197aa2a982b37877d9a Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 21 Jun 2019 15:02:11 +0200 Subject: [PATCH 544/710] core: bazarr compat --- Contents/Libraries/Shared/subliminal_patch/core.py | 2 +- Contents/Libraries/Shared/subzero/video.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 5c79bcff0..2963988e9 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -544,7 +544,7 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski # size and hashes if not skip_hashing: hash_path = hash_from or path - video.size = os.path.getsize(path) + video.size = os.path.getsize(hash_path) if video.size > 10485760: logger.debug('Size is %d', video.size) osub_hash = None diff --git a/Contents/Libraries/Shared/subzero/video.py b/Contents/Libraries/Shared/subzero/video.py index fc6dc99de..13db33ddf 100644 --- a/Contents/Libraries/Shared/subzero/video.py +++ b/Contents/Libraries/Shared/subzero/video.py @@ -52,10 +52,10 @@ def set_existing_languages(video, video_info, external_subtitles=False, embedded video.subtitle_languages.add(language) -def parse_video(fn, hints, skip_hashing=False, dry_run=False, providers=None): +def parse_video(fn, hints, skip_hashing=False, dry_run=False, providers=None, hash_from=None): logger.debug("Parsing video: %s, hints: %s", os.path.basename(fn), hints) return scan_video(fn, hints=hints, dont_use_actual_file=dry_run, providers=providers, - skip_hashing=skip_hashing) + skip_hashing=skip_hashing, hash_from=hash_from) def refine_video(video, no_refining=False, refiner_settings=None): From 317c02bf0634061a181eba2d448c00db01abe85a Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 22 Jun 2019 04:04:22 +0200 Subject: [PATCH 545/710] prepare next release --- CHANGELOG.md | 23 +++++++++++++++++++++++ README.md | 26 +++++--------------------- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index afffc46c8..d29eb706a 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,26 @@ +2.6.5.3099 + +subscene, addic7ed and titlovi +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- core: allow system DNS again by putting "system" as the DNS +- providers: subscene: fix again (subscene, contact us please, so we can end this) + + +2.6.5.3092 + +subscene, addic7ed and titlovi +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- providers: subscene: fix endpoint (hopefully for longer now) +- providers: subscene: don't search for season packs (broken for now; relieves 50% of server load on provider) +- providers: subscene: don't calculate video fn for now +- providers: argenteam: backport fixes from bazarr +- subtitle: try decoding with utf-16 by default as well (zho/farsi) +- submod: HI: remove music tags by default +- core: compat (bazarr): add env var SZ_KEEP_ENCODING to keep encoding of subtitles 2.6.5.3074 diff --git a/README.md b/README.md index 67df81424..da53a3186 100644 --- a/README.md +++ b/README.md @@ -90,32 +90,16 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3099 +2.6.5.xxxx subscene, addic7ed and titlovi - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog -- core: allow system DNS again by putting "system" as the DNS -- providers: subscene: fix again (subscene, contact us please, so we can end this) - - -2.6.5.3092 - -subscene, addic7ed and titlovi -- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration - -Changelog -- providers: subscene: fix endpoint (hopefully for longer now) -- providers: subscene: don't search for season packs (broken for now; relieves 50% of server load on provider) -- providers: subscene: don't calculate video fn for now -- providers: argenteam: backport fixes from bazarr -- subtitle: try decoding with utf-16 by default as well (zho/farsi) -- submod: HI: remove music tags by default -- core: compat (bazarr): add env var SZ_KEEP_ENCODING to keep encoding of subtitles - - - +- providers: add Napisy24 (polish) +- providers: subscene: reduce provider load by possibly half +- providers: subscene: support logging in (username/password are now required) +- providers: subscene: fallback to non year results if none found with year [older changes](CHANGELOG.md) From 9e088a5e9d6cd6a7e1f7df22da3e3bdf76563dbe Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 22 Jun 2019 04:05:37 +0200 Subject: [PATCH 546/710] release 2.6.5.3109 --- Contents/Info.plist | 6 +++--- README.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 0598cf04e..25ef8d810 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3104</string> + <string>2.6.5.3109</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3104 DEV +Version 2.6.5.3109 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index da53a3186..241590679 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.xxxx +2.6.5.3109 subscene, addic7ed and titlovi - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration From eefffcfb1b56aa7fd85bbc047a206e5ffdba9b90 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 22 Jun 2019 04:06:10 +0200 Subject: [PATCH 547/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 25ef8d810..c9841e5c4 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3109 +Version 2.6.5.3109 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From e1f529036532f3a7b53a92c38b525ddaee62ceb2 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sat, 22 Jun 2019 04:07:30 +0200 Subject: [PATCH 548/710] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 241590679..69ef16929 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ Changelog [older changes](CHANGELOG.md) -Subtitles provided by [OpenSubtitles.org](http://www.opensubtitles.org/), [Podnapisi.NET](https://www.podnapisi.net/), [TVSubtitles.net](http://www.tvsubtitles.net/), [Addic7ed.com](http://www.addic7ed.com/), [Legendas TV](http://legendas.tv/), [Napi Projekt](http://www.napiprojekt.pl/), [Shooter](http://shooter.cn/), [Titlovi](http://titlovi.com), [aRGENTeaM](http://argenteam.net), [SubScene](https://subscene.com/), [Hosszupuska](http://hosszupuskasub.com/) +Subtitles provided by [OpenSubtitles.org](http://www.opensubtitles.org/), [Podnapisi.NET](https://www.podnapisi.net/), [TVSubtitles.net](http://www.tvsubtitles.net/), [Addic7ed.com](http://www.addic7ed.com/), [Legendas TV](http://legendas.tv/), [Napi Projekt](http://www.napiprojekt.pl/), [Shooter](http://shooter.cn/), [Titlovi](http://titlovi.com), [aRGENTeaM](http://argenteam.net), [SubScene](https://subscene.com/), [Hosszupuska](http://hosszupuskasub.com/), [Napisy24](https://napisy24.pl/) [3rd party licenses](https://github.com/pannal/Sub-Zero.bundle/tree/master/Licenses) From bd4c180c07120105ebe14b7aa7721c70695593a4 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 22 Jun 2019 04:29:03 +0200 Subject: [PATCH 549/710] submod: generic: en: fix ";='s --- Contents/Libraries/Shared/submod_test.py | 2 +- .../Libraries/Shared/subzero/modification/dictionaries/data.py | 2 +- .../Shared/subzero/modification/dictionaries/make_data.py | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/submod_test.py b/Contents/Libraries/Shared/submod_test.py index c4455dd07..eabf3a576 100644 --- a/Contents/Libraries/Shared/submod_test.py +++ b/Contents/Libraries/Shared/submod_test.py @@ -21,7 +21,7 @@ logging.basicConfig(level=logging.DEBUG) #sub = Subtitle(Language.fromietf("eng:forced"), mods=["common", "remove_HI", "OCR_fixes", "fix_uppercase", "shift_offset(ms=-500)", "shift_offset(ms=500)", "shift_offset(s=2,ms=800)"]) -sub = Subtitle(Language.fromietf("eng:forced"), mods=["common", "remove_HI", "OCR_fixes", "fix_uppercase", "shift_offset(ms=0,s=1)"]) +sub = Subtitle(Language.fromietf("eng"), mods=["common", "remove_HI", "OCR_fixes", "fix_uppercase", "shift_offset(ms=0,s=1)"]) sub.content = open(fn).read() sub.normalize() content = sub.get_modified_content(debug=True) diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py b/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py index 7524cbc04..c56a0c809 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py @@ -42,7 +42,7 @@ 'pattern': u"(?um)(?:\\,\\ sin|\\ mothen|\\ can\\'t\\_|\\ openiL|\\ of\\\ufb02|pshycol|\\ i\\.\\.\\.|\\ L\\.)$"}, 'PartialLines': {'data': OrderedDict([(u' /be ', u' I be '), (u" aren '1'", u" aren't"), (u" aren'tyou", u" aren't you"), (u" doesn '1'", u" doesn't"), (u" fr/eno'", u' friend'), (u" fr/eno'.", u' friend.'), (u" haven 'z' ", u" haven't "), (u" haven 'z'.", u" haven't."), (u' I ha ve ', u' I have '), (u" I']I ", u" I'll "), (u' L am', u' I am'), (u' L can', u' I can'), (u" L don't ", u" I don't "), (u' L hate ', u' I hate '), (u' L have ', u' I have '), (u' L like ', u' I like '), (u' L will', u' I will'), (u' L would', u' I would'), (u" L'll ", u" I'll "), (u" L've ", u" I've "), (u' m y family', u' my family'), (u" 's ", u"'s "), (u" shou/dn '1 ", u" shouldn't "), (u" won 'z' ", u" won't "), (u" won 'z'.", u" won't."), (u" wou/c/n 'z' ", u" wouldn't "), (u" wou/c/n 'z'.", u" wouldn't."), (u" wou/dn 'z' ", u" wouldn't "), (u" wou/dn 'z'.", u" wouldn't."), (u'/ did', u'I did'), (u'/ have ', u'I have '), (u'/ just ', u'I just '), (u'/ loved ', u'I loved '), (u'/ need', u'I need'), (u'|was11', u'I was 11'), (u'at Hrst', u'at first'), (u"B ullshiz'", u'Bullshit'), (u'big lunk', u'love you'), (u"can 't", u"can't"), (u"can' t ", u"can't "), (u"can 't ", u"can't "), (u'CHA TTERING', u'CHATTERING'), (u'come 0n', u'come on'), (u'Come 0n', u'Come on'), (u"couldn 't", u"couldn't"), (u"couldn' t ", u"couldn't "), (u"couldn 't ", u"couldn't "), (u"Destin y's", u"Destiny's"), (u"didn 't", u"didn't"), (u"didn' t ", u"didn't "), (u"didn 't ", u"didn't "), (u"Doesn '1'", u"Doesn't"), (u"doesn '1' ", u"doesn't "), (u"doesn '1\u2018 ", u"doesn't "), (u"doesn 't", u"doesn't"), (u"doesn'1' ", u"doesn't "), (u"doesn'1\u2018 ", u"doesn't "), (u"don '1' ", u"don't "), (u"don '1\u2018 ", u"don't "), (u"don '2' ", u"don't "), (u" aren '2'", u" aren't"), (u"aren '2' ", u"aren't "), (u"don '2\u2018 ", u"don't "), (u"don 't", u"don't"), (u"Don' t ", u"Don't "), (u"Don 't ", u"Don't "), (u"don'1' ", u"don't "), (u"don'1\u2018 ", u"don't "), (u"there '5 ", u"there's "), (u'E very', u'Every'), (u'get 0n', u'get on'), (u'go 0n', u'go on'), (u'Go 0n', u'Go on'), (u"H3993' birthday", u'Happy birthday'), (u"hadn 't", u"hadn't"), (u"he 's", u"he's"), (u"He 's", u"He's"), (u'He y', u'Hey'), (u'he)/', u'hey'), (u'He)/', u'Hey'), (u'HEA VY', u'HEAVY'), (u'Henry ll', u'Henry II'), (u'Henry lll', u'Henry III'), (u'Henry Vlll', u'Henry VIII'), (u'Henry Vll', u'Henry VII'), (u'Henry Vl', u'Henry VI'), (u'Hold 0n', u'Hold on'), (u'I am. ls', u'I am. Is'), (u'I d0', u'I do'), (u"I 'm", u"I'm"), (u"I 'rn ", u"I'm "), (u"I 've", u"I've"), (u'I0 ve her', u'love her'), (u'I0 ve you', u'love you'), (u"I02'", u'lot'), (u"I'm sony", u"I'm sorry"), (u"isn' t ", u"isn't "), (u"isn 't ", u"isn't "), (u'K)/le', u'Kyle'), (u'L ook', u'Look'), (u'let me 90', u'let me go'), (u'Let me 90', u'Let me go'), (u"let's 90", u"let's go"), (u"Let's 90", u"Let's go"), (u'lfl had', u'If I had'), (u'lova you', u'love you'), (u'Lova you', u'love you'), (u'lovo you', u'love you'), (u'Lovo you', u'love you'), (u'ls anyone', u'Is anyone'), (u'ls he', u'Is he'), (u'-ls he', u'- Is he'), (u'ls it', u'Is it'), (u'-ls it', u'- Is it'), (u'ls she', u'Is she'), (u'-ls she', u'- Is she'), (u'ls that', u'Is that'), (u'-ls that', u'- Is that'), (u'ls this', u'Is this'), (u'-ls this', u'- Is this'), (u'Maze] tov', u'Mazel tov'), (u"N02' ", u'Not '), (u' of 0ur ', u' of our '), (u' ot mine ', u' of mine '), (u'PLA YING', u'PLAYING'), (u'REPEA TING ', u'REPEATING '), (u'Sa y', u'Say'), (u"she 's", u"she's"), (u"She 's", u"She's"), (u"shouldn 't", u"shouldn't"), (u'sta y', u'stay'), (u'Sta y', u'Stay'), (u'SWO rd', u'Sword'), (u'taka care', u'take care'), (u'Taka care', u'Take care'), (u'the Hrst', u'the first'), (u'toc late', u'too late'), (u'uf me', u'of me'), (u'uf our', u'of our'), (u'wa y', u'way'), (u'Wal-I\\/Iart', u'Wal-Mart'), (u"wasn '1' ", u"wasn't "), (u"Wasn '1' ", u"Wasn't "), (u"wasn '1\u2018 ", u"wasn't "), (u"Wasn '1\u2018 ", u"Wasn't "), (u"wasn 't", u"wasn't"), (u"Wasn 't", u"Wasn't"), (u"we 've", u"we've"), (u"We 've", u"We've"), (u"wem' off", u'went off'), (u"weren 't", u"weren't"), (u"who 's", u"who's"), (u"won 't", u"won't"), (u'would ha ve', u'would have '), (u"wouldn 't", u"wouldn't"), (u"Wouldn 't", u"Wouldn't"), (u'y()u', u'you'), (u'you QUYS', u'you guys'), (u"you' re ", u"you're "), (u"you 're ", u"you're "), (u"you 've", u"you've"), (u"You 've", u"You've"), (u"you' ve ", u"you've "), (u"you 've ", u"you've "), (u'aftera while', u'after a while'), (u'Aftera while', u'After a while'), (u'THUN DERCLAPS', u'THUNDERCLAPS'), (u'(BUZZI N G)', u'(BUZZING)'), (u'[BUZZI N G]', u'[BUZZING]'), (u'(G RU NTING', u'(GRUNTING'), (u'[G RU NTING', u'[GRUNTING'), (u'(G ROWLING', u'(GROWLING'), (u'[G ROWLING', u'[GROWLING'), (u' WAI LS)', u'WAILS)'), (u' WAI LS]', u'WAILS]'), (u'(scu RRYING)', u'(SCURRYING)'), (u'[scu RRYING]', u'[SCURRYING]'), (u'(GRUNT5)', u'(GRUNTS)'), (u'[GRUNT5]', u'[GRUNTS]'), (u'NARRA TOR:', u'NARRATOR:'), (u'(GROAN ING', u'(GROANING'), (u'[GROAN ING', u'[GROANING'), (u'GROAN ING)', u'GROANING)'), (u'GROAN ING]', u'GROANING]'), (u'(LAUGH ING', u'(LAUGHING'), (u'[LAUGH ING', u'[LAUGHING'), (u'LAUGH ING)', u'LAUGHING)'), (u'LAUGH ING]', u'LAUGHING]'), (u'(BU BBLING', u'(BUBBLING'), (u'[BU BBLING', u'[BUBBLING'), (u'BU BBLING)', u'BUBBLING)'), (u'BU BBLING]', u'BUBBLING]'), (u'(SH USHING', u'(SHUSHING'), (u'[SH USHING', u'[SHUSHING'), (u'SH USHING)', u'SHUSHING)'), (u'SH USHING]', u'SHUSHING]'), (u'(CH ILDREN', u'(CHILDREN'), (u'[CH ILDREN', u'[CHILDREN'), (u'CH ILDREN)', u'CHILDREN)'), (u'CH ILDREN]', u'CHILDREN]'), (u'(MURMU RING', u'(MURMURING'), (u'[MURMU RING', u'[MURMURING'), (u'MURMU RING)', u'MURMURING)'), (u'MURMU RING]', u'MURMURING]'), (u'(GU N ', u'(GUN '), (u'[GU N ', u'[GUN '), (u'GU N)', u'GUN)'), (u'GU N]', u'GUN]'), (u'CH ILDREN:', u'CHILDREN:'), (u'STU DENTS:', u'STUDENTS:'), (u'(WH ISTLE', u'(WHISTLE'), (u'[WH ISTLE', u'[WHISTLE'), (u'WH ISTLE)', u'WHISTLE)'), (u'WH ISTLE]', u'WHISTLE]'), (u'U LU LATING', u'ULULATING'), (u'AU DIENCE:', u'AUDIENCE:'), (u'HA WAIIAN', u'HAWAIIAN'), (u'(ARTH UR', u'(ARTHUR'), (u'[ARTH UR', u'[ARTHUR'), (u'ARTH UR)', u'ARTHUR)'), (u'ARTH UR]', u'ARTHUR]'), (u'J EREMY:', u'JEREMY:'), (u'(ELEVA TOR', u'(ELEVATOR'), (u'[ELEVA TOR', u'[ELEVATOR'), (u'ELEVA TOR)', u'ELEVATOR)'), (u'ELEVA TOR]', u'ELEVATOR]'), (u'CONTIN U ES', u'CONTINUES'), (u'WIN D HOWLING', u'WIND HOWLING'), (u'telis me', u'tells me'), (u'Telis me', u'Tells me'), (u'. Ls ', u'. Is '), (u'! Ls ', u'! Is '), (u'? Ls ', u'? Is '), (u'. Lt ', u'. It '), (u'! Lt ', u'! It '), (u'? Lt ', u'? It '), (u'SQMEWH ERE ELSE', u'SOMEWHERE ELSE'), (u' I,m ', u" I'm "), (u' I,ve ', u" I've "), (u' you,re ', u" you're "), (u' you,ll ', u" you'll "), (u' doesn,t ', u" doesn't "), (u' let,s ', u" let's "), (u' he,s ', u" he's "), (u' it,s ', u" it's "), (u' can,t ', u" can't "), (u' Can,t ', u" Can't "), (u' don,t ', u" don't "), (u' Don,t ', u" Don't "), (u"wouldn 'tyou", u"wouldn't you"), (u' lgot it', u' I got it'), (u' you,ve ', u" you've "), (u' I ve ', u" I've "), (u' I ii ', u" I'll "), (u' I m ', u" I'm "), (u' why d ', u" why'd "), (u' couldn t ', u" couldn't "), (u' that s ', u" that's "), (u' i... ', u' I... '), (u"L don't", u"I don't"), (u"L won't", u"I won't"), (u'L should', u'I should'), (u'L had', u'I had'), (u'L happen', u'I happen'), (u"L wasn't", u"I wasnt't"), (u'H i', u'Hi'), (u"L didn't", u"I didn't"), (u'L do', u'I do'), (u'L could', u'I could'), (u'L will', u'I will'), (u'L suggest', u'I suggest'), (u'L reckon', u'I reckon'), (u'L am', u'I am'), (u"L couldn't", u"I couldn't"), (u'L might', u'I might'), (u'L would', u'I would'), (u'L was', u'I was'), (u'L know', u'I know'), (u'L think', u'I think'), (u"L haven't", u"I haven't"), (u'L have ', u'I have'), (u'L want', u'I want'), (u'L can', u'I can'), (u'L love', u'I love'), (u'L like', u'I like')]), 'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:\\ \\/be\\ |\\ aren\\ \\'1\\'|\\ aren\\'tyou|\\ doesn\\ \\'1\\'|\\ fr\\/eno\\'|\\ fr\\/eno\\'\\.|\\ haven\\ \\'z\\'\\ |\\ haven\\ \\'z\\'\\.|\\ I\\ ha\\ ve\\ |\\ I\\'\\]I\\ |\\ L\\ am|\\ L\\ can|\\ L\\ don\\'t\\ |\\ L\\ hate\\ |\\ L\\ have\\ |\\ L\\ like\\ |\\ L\\ will|\\ L\\ would|\\ L\\'ll\\ |\\ L\\'ve\\ |\\ m\\ y\\ family|\\ \\'s\\ |\\ shou\\/dn\\ \\'1\\ |\\ won\\ \\'z\\'\\ |\\ won\\ \\'z\\'\\.|\\ wou\\/c\\/n\\ \\'z\\'\\ |\\ wou\\/c\\/n\\ \\'z\\'\\.|\\ wou\\/dn\\ \\'z\\'\\ |\\ wou\\/dn\\ \\'z\\'\\.|\\/\\ did|\\/\\ have\\ |\\/\\ just\\ |\\/\\ loved\\ |\\/\\ need|\\|was11|at\\ Hrst|B\\ ullshiz\\'|big\\ lunk|can\\ \\'t|can\\'\\ t\\ |can\\ \\'t\\ |CHA\\ TTERING|come\\ 0n|Come\\ 0n|couldn\\ \\'t|couldn\\'\\ t\\ |couldn\\ \\'t\\ |Destin\\ y\\'s|didn\\ \\'t|didn\\'\\ t\\ |didn\\ \\'t\\ |Doesn\\ \\'1\\'|doesn\\ \\'1\\'\\ |doesn\\ \\'1\\\u2018\\ |doesn\\ \\'t|doesn\\'1\\'\\ |doesn\\'1\\\u2018\\ |don\\ \\'1\\'\\ |don\\ \\'1\\\u2018\\ |don\\ \\'2\\'\\ |\\ aren\\ \\'2\\'|aren\\ \\'2\\'\\ |don\\ \\'2\\\u2018\\ |don\\ \\'t|Don\\'\\ t\\ |Don\\ \\'t\\ |don\\'1\\'\\ |don\\'1\\\u2018\\ |there\\ \\'5\\ |E\\ very|get\\ 0n|go\\ 0n|Go\\ 0n|H3993\\'\\ birthday|hadn\\ \\'t|he\\ \\'s|He\\ \\'s|He\\ y|he\\)\\/|He\\)\\/|HEA\\ VY|Henry\\ ll|Henry\\ lll|Henry\\ Vlll|Henry\\ Vll|Henry\\ Vl|Hold\\ 0n|I\\ am\\.\\ ls|I\\ d0|I\\ \\'m|I\\ \\'rn\\ |I\\ \\'ve|I0\\ ve\\ her|I0\\ ve\\ you|I02\\'|I\\'m\\ sony|isn\\'\\ t\\ |isn\\ \\'t\\ |K\\)\\/le|L\\ ook|let\\ me\\ 90|Let\\ me\\ 90|let\\'s\\ 90|Let\\'s\\ 90|lfl\\ had|lova\\ you|Lova\\ you|lovo\\ you|Lovo\\ you|ls\\ anyone|ls\\ he|\\-ls\\ he|ls\\ it|\\-ls\\ it|ls\\ she|\\-ls\\ she|ls\\ that|\\-ls\\ that|ls\\ this|\\-ls\\ this|Maze\\]\\ tov|N02\\'\\ |\\ of\\ 0ur\\ |\\ ot\\ mine\\ |PLA\\ YING|REPEA\\ TING\\ |Sa\\ y|she\\ \\'s|She\\ \\'s|shouldn\\ \\'t|sta\\ y|Sta\\ y|SWO\\ rd|taka\\ care|Taka\\ care|the\\ Hrst|toc\\ late|uf\\ me|uf\\ our|wa\\ y|Wal\\-I\\\\\\/Iart|wasn\\ \\'1\\'\\ |Wasn\\ \\'1\\'\\ |wasn\\ \\'1\\\u2018\\ |Wasn\\ \\'1\\\u2018\\ |wasn\\ \\'t|Wasn\\ \\'t|we\\ \\'ve|We\\ \\'ve|wem\\'\\ off|weren\\ \\'t|who\\ \\'s|won\\ \\'t|would\\ ha\\ ve|wouldn\\ \\'t|Wouldn\\ \\'t|y\\(\\)u|you\\ QUYS|you\\'\\ re\\ |you\\ \\'re\\ |you\\ \\'ve|You\\ \\'ve|you\\'\\ ve\\ |you\\ \\'ve\\ |aftera\\ while|Aftera\\ while|THUN\\ DERCLAPS|\\(BUZZI\\ N\\ G\\)|\\[BUZZI\\ N\\ G\\]|\\(G\\ RU\\ NTING|\\[G\\ RU\\ NTING|\\(G\\ ROWLING|\\[G\\ ROWLING|\\ WAI\\ LS\\)|\\ WAI\\ LS\\]|\\(scu\\ RRYING\\)|\\[scu\\ RRYING\\]|\\(GRUNT5\\)|\\[GRUNT5\\]|NARRA\\ TOR\\:|\\(GROAN\\ ING|\\[GROAN\\ ING|GROAN\\ ING\\)|GROAN\\ ING\\]|\\(LAUGH\\ ING|\\[LAUGH\\ ING|LAUGH\\ ING\\)|LAUGH\\ ING\\]|\\(BU\\ BBLING|\\[BU\\ BBLING|BU\\ BBLING\\)|BU\\ BBLING\\]|\\(SH\\ USHING|\\[SH\\ USHING|SH\\ USHING\\)|SH\\ USHING\\]|\\(CH\\ ILDREN|\\[CH\\ ILDREN|CH\\ ILDREN\\)|CH\\ ILDREN\\]|\\(MURMU\\ RING|\\[MURMU\\ RING|MURMU\\ RING\\)|MURMU\\ RING\\]|\\(GU\\ N\\ |\\[GU\\ N\\ |GU\\ N\\)|GU\\ N\\]|CH\\ ILDREN\\:|STU\\ DENTS\\:|\\(WH\\ ISTLE|\\[WH\\ ISTLE|WH\\ ISTLE\\)|WH\\ ISTLE\\]|U\\ LU\\ LATING|AU\\ DIENCE\\:|HA\\ WAIIAN|\\(ARTH\\ UR|\\[ARTH\\ UR|ARTH\\ UR\\)|ARTH\\ UR\\]|J\\ EREMY\\:|\\(ELEVA\\ TOR|\\[ELEVA\\ TOR|ELEVA\\ TOR\\)|ELEVA\\ TOR\\]|CONTIN\\ U\\ ES|WIN\\ D\\ HOWLING|telis\\ me|Telis\\ me|\\.\\ Ls\\ |\\!\\ Ls\\ |\\?\\ Ls\\ |\\.\\ Lt\\ |\\!\\ Lt\\ |\\?\\ Lt\\ |SQMEWH\\ ERE\\ ELSE|\\ I\\,m\\ |\\ I\\,ve\\ |\\ you\\,re\\ |\\ you\\,ll\\ |\\ doesn\\,t\\ |\\ let\\,s\\ |\\ he\\,s\\ |\\ it\\,s\\ |\\ can\\,t\\ |\\ Can\\,t\\ |\\ don\\,t\\ |\\ Don\\,t\\ |wouldn\\ \\'tyou|\\ lgot\\ it|\\ you\\,ve\\ |\\ I\\ ve\\ |\\ I\\ ii\\ |\\ I\\ m\\ |\\ why\\ d\\ |\\ couldn\\ t\\ |\\ that\\ s\\ |\\ i\\.\\.\\.\\ |L\\ don\\'t|L\\ won\\'t|L\\ should|L\\ had|L\\ happen|L\\ wasn\\'t|H\\ i|L\\ didn\\'t|L\\ do|L\\ could|L\\ will|L\\ suggest|L\\ reckon|L\\ am|L\\ couldn\\'t|L\\ might|L\\ would|L\\ was|L\\ know|L\\ think|L\\ haven\\'t|L\\ have\\ |L\\ want|L\\ can|L\\ love|L\\ like)(?:(?=\\s)|(?=$)|(?=\\b))"}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xa4', u'o'), (u'lVI', u'M'), (u'IVl', u'M'), (u'lVl', u'M'), (u'I\\/I', u'M'), (u'l\\/I', u'M'), (u'I\\/l', u'M'), (u'l\\/l', u'M'), (u'IVIa', u'Ma'), (u'IVIe', u'Me'), (u'IVIi', u'Mi'), (u'IVIo', u'Mo'), (u'IVIu', u'Mu'), (u'IVIy', u'My'), (u' l ', u' I '), (u'l/an', u'lian'), (u'\xb0x\xb0', u'%'), (u'\xc3\xc2s', u"'s"), (u'at/on', u'ation'), (u'lljust', u'll just'), (u"'sjust", u"'s just"), (u'compiete', u'complete'), (u' L ', u' I '), (u'a/ion', u'ation'), (u'\xc2s', u"'s"), (u"'tjust", u"'t just")]), + 'PartialWordsAlways': {'data': OrderedDict([(u'\xa4', u'o'), (u'lVI', u'M'), (u'IVl', u'M'), (u'lVl', u'M'), (u'I\\/I', u'M'), (u'l\\/I', u'M'), (u'I\\/l', u'M'), (u'l\\/l', u'M'), (u'IVIa', u'Ma'), (u'IVIe', u'Me'), (u'IVIi', u'Mi'), (u'IVIo', u'Mo'), (u'IVIu', u'Mu'), (u'IVIy', u'My'), (u' l ', u' I '), (u'l/an', u'lian'), (u'\xb0x\xb0', u'%'), (u'\xc3\xc2s', u"'s"), (u'at/on', u'ation'), (u'lljust', u'll just'), (u"'sjust", u"'s just"), (u'";', u"'s"), (u'compiete', u'complete'), (u' L ', u' I '), (u'a/ion', u'ation'), (u'\xc2s', u"'s"), (u"'tjust", u"'t just")]), 'pattern': None}, 'WholeLines': {'data': OrderedDict([(u'H ey.', u'Hey.'), (u'He)\u2019-', u'Hey.'), (u'N0.', u'No.'), (u'-N0.', u'-No.'), (u'Noll', u'No!!'), (u'(G ROANS)', u'(GROANS)'), (u'[G ROANS]', u'[GROANS]'), (u'(M EOWS)', u'(MEOWS)'), (u'[M EOWS]', u'[MEOWS]'), (u'Uaughs]', u'[laughs]'), (u'[chitte rs]', u'[chitters]'), (u'Hil\u2018 it!', u'Hit it!'), (u'<i>Hil\u2018 it!</i>', u'<i>Hit it!</i>'), (u'ISIGHS]', u'[SIGHS]')]), 'pattern': None}, diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/make_data.py b/Contents/Libraries/Shared/subzero/modification/dictionaries/make_data.py index f6e6ac048..7a0482dad 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/make_data.py +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/make_data.py @@ -36,6 +36,7 @@ u" l ": u" I ", u"'sjust": u"'s just", u"'tjust": u"'t just", + u"\";": u"'s", }, "WholeWords": { u"I'11": u"I'll", From 836945c95c8264a5de3a6ace10cf305aeee79335 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 22 Jun 2019 16:45:31 +0200 Subject: [PATCH 550/710] providers: subscene: move login/cookies to initialization sequence --- .../subliminal_patch/providers/subscene.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index af5c40d83..e7c078e1f 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -139,6 +139,15 @@ def initialize(self): logger.info("Creating session") self.session = RetryingCFSession() + prev_cookies = region.get("subscene_cookies2") + if prev_cookies != NO_VALUE: + logger.debug("Re-using old subscene cookies: %r", prev_cookies) + self.session.cookies.update(prev_cookies) + + else: + logger.debug("Logging in") + self.login() + def login(self): r = self.session.get("https://subscene.com/account/login") if "Server Error" in r.content: @@ -277,14 +286,6 @@ def query(self, video): # logger.debug('No release results found') # time.sleep(self.search_throttle) - prev_cookies = region.get("subscene_cookies2") - if prev_cookies != NO_VALUE: - logger.debug("Re-using old subscene cookies: %r", prev_cookies) - self.session.cookies.update(prev_cookies) - - else: - logger.debug("Logging in") - self.login() # re-search for episodes without explicit release name if isinstance(video, Episode): From 04c283c48d888365d9481a39dde97cc7325ac8ba Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 23 Jun 2019 04:24:18 +0200 Subject: [PATCH 551/710] providers: subscene: limit alternative searches to 3; set throttle to 8 --- .../Shared/subliminal_patch/providers/subscene.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index e7c078e1f..7136d3eb1 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -125,7 +125,7 @@ class SubsceneProvider(Provider, ProviderSubtitleArchiveMixin): username = None password = None - search_throttle = 5 # seconds + search_throttle = 8 # seconds def __init__(self, only_foreign=False, username=None, password=None): if not all((username, password)): @@ -289,9 +289,10 @@ def query(self, video): # re-search for episodes without explicit release name if isinstance(video, Episode): + titles = list(set([video.series] + video.alternative_series))[:2] # term = u"%s S%02iE%02i" % (video.series, video.season, video.episode) - more_than_one = len([video.series] + video.alternative_series) > 1 - for series in set([video.series] + video.alternative_series): + more_than_one = len(titles) > 1 + for series in titles: term = u"%s - %s Season" % (series, p.number_to_words("%sth" % video.season).capitalize()) logger.debug('Searching for alternative results: %s', term) film = self.do_search(term, session=self.session, release=False, throttle=self.search_throttle) @@ -317,8 +318,9 @@ def query(self, video): if more_than_one: time.sleep(self.search_throttle) else: - more_than_one = len([video.title] + video.alternative_titles) > 1 - for title in set([video.title] + video.alternative_titles): + titles = list(set([video.title] + video.alternative_titles))[:2] + more_than_one = len(titles) > 1 + for title in titles: logger.debug('Searching for movie results: %r', title) film = self.do_search(title, year=video.year, session=self.session, limit_to=None, release=False, throttle=self.search_throttle) From ee05da70f4be609f061b9d3f0c2e11812b27f87d Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 23 Jun 2019 15:26:41 +0200 Subject: [PATCH 552/710] providers: subscene: explicitly set account filters for languages --- .../Shared/subliminal_patch/providers/subscene.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 7136d3eb1..3315ed18a 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -202,12 +202,20 @@ def terminate(self): def _create_filters(self, languages): self.filters = dict(HearingImpaired="2") + acc_filters = self.filters.copy() if self.only_foreign: self.filters["ForeignOnly"] = "True" + acc_filters["ForeignOnly"] = self.filters["ForeignOnly"].lower() logger.info("Only searching for foreign/forced subtitles") - self.filters["LanguageFilter"] = ",".join((str(language_ids[l.alpha3]) for l in languages - if l.alpha3 in language_ids)) + acc_filters["SelectedIds"] = [str(language_ids[l.alpha3]) for l in languages if l.alpha3 in language_ids] + self.filters["LanguageFilter"] = ",".join(acc_filters["SelectedIds"]) + + last_filters = region.get("subscene_filters") + if last_filters != acc_filters: + region.set("subscene_filters", acc_filters) + logger.debug("Setting account filters to %r", acc_filters) + self.session.post("https://u.subscene.com/filter", acc_filters, allow_redirects=False) logger.debug("Filter created: '%s'" % self.filters) From 5f0982970d807b512e47df854c0add18bfc61047 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 5 Jul 2019 03:22:06 +0200 Subject: [PATCH 553/710] docker/bazarr compat --- Contents/Libraries/Shared/subliminal_patch/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 2963988e9..363477e1f 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -581,7 +581,7 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen subtitles = {} _scandir = _scandir_generic if scandir_generic else scandir for entry in _scandir(dirpath): - if not entry.name and not scandir_generic: + if (not entry.name or entry.name in ('\x0c', '$', ',', '\x7f')) and not scandir_generic: logger.debug('Could not determine the name of the file, retrying with scandir_generic') return _search_external_subtitles(path, languages, only_one, True) if not entry.is_file(follow_symlinks=False): From c91d5ca483a72a522e5d6a5108e1bfd64c65351b Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 5 Jul 2019 13:55:52 +0200 Subject: [PATCH 554/710] providers: subscene: add support for pt-BR (based on https://github.com/Diaoul/subliminal/pull/740/commits/b22cf08a5d0e7082b0dc6c0de8cc764f01233625) --- .../subliminal_patch/converters/subscene.py | 19 +++++++++++++++++-- .../subliminal_patch/providers/subscene.py | 8 +++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/converters/subscene.py b/Contents/Libraries/Shared/subliminal_patch/converters/subscene.py index 3a8c8ead6..66b28de2d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/converters/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/converters/subscene.py @@ -12,6 +12,13 @@ 'Malay': 'msa', 'Pashto': 'pus', 'Punjabi': 'pan', 'Swahili': 'swa' } +from_subscene_with_country = { + 'Brazillian Portuguese': ('por', 'BR') +} + +to_subscene_with_country = {val: key for key, val in from_subscene_with_country.items()} + + to_subscene = {v: k for k, v in from_subscene.items()} exact_languages_alpha3 = [ @@ -34,12 +41,12 @@ 'mkd': 48, 'mal': 64, 'mni': 65, 'mon': 72, 'pus': 67, 'pol': 31, 'por': 32, 'pan': 66, 'rus': 34, 'srp': 35, 'sin': 58, 'slk': 36, 'slv': 37, 'som': 70, 'tgl': 53, 'tam': 59, 'tel': 63, 'tha': 40, - 'tur': 41, 'ukr': 56, 'urd': 42, 'yor': 71 + 'tur': 41, 'ukr': 56, 'urd': 42, 'yor': 71, 'pt-BR': 4 } # TODO: specify codes for unspecified_languages unspecified_languages = [ - 'Big 5 code', 'Brazillian Portuguese', 'Bulgarian/ English', + 'Big 5 code', 'Bulgarian/ English', 'Chinese BG code', 'Dutch/ English', 'English/ German', 'Hungarian/ English', 'Rohingya' ] @@ -50,6 +57,8 @@ supported_languages.update({Language(l) for l in to_subscene}) +supported_languages.update({Language(lang, cr) for lang, cr in to_subscene_with_country}) + class SubsceneConverter(LanguageReverseConverter): codes = {l.name for l in supported_languages} @@ -61,9 +70,15 @@ def convert(self, alpha3, country=None, script=None): if alpha3 in to_subscene: return to_subscene[alpha3] + if (alpha3, country) in to_subscene_with_country: + return to_subscene_with_country[(alpha3, country)] + raise ConfigurationError('Unsupported language for subscene: %s, %s, %s' % (alpha3, country, script)) def reverse(self, code): + if code in from_subscene_with_country: + return from_subscene_with_country[code] + if code in from_subscene: return (from_subscene[code],) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 3315ed18a..7f6e3911b 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -208,7 +208,13 @@ def _create_filters(self, languages): acc_filters["ForeignOnly"] = self.filters["ForeignOnly"].lower() logger.info("Only searching for foreign/forced subtitles") - acc_filters["SelectedIds"] = [str(language_ids[l.alpha3]) for l in languages if l.alpha3 in language_ids] + selected_ids = [] + for l in languages: + lid = language_ids.get(l.basename, language_ids.get(l.alpha3, None)) + if lid: + selected_ids.append(str(lid)) + + acc_filters["SelectedIds"] = selected_ids self.filters["LanguageFilter"] = ",".join(acc_filters["SelectedIds"]) last_filters = region.get("subscene_filters") From c3d3163392c3da1374df26fab2fbc8d6ec83e7e8 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 5 Jul 2019 13:56:21 +0200 Subject: [PATCH 555/710] providers: subscene: fix unknown language code error when "empty" result is returned --- Contents/Libraries/Shared/subscene_api/subscene.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subscene_api/subscene.py b/Contents/Libraries/Shared/subscene_api/subscene.py index 07d1eda3e..827110369 100644 --- a/Contents/Libraries/Shared/subscene_api/subscene.py +++ b/Contents/Libraries/Shared/subscene_api/subscene.py @@ -125,7 +125,7 @@ def from_rows(cls, rows): subtitles = [] for row in rows: - if row.td.a is not None: + if row.td.a is not None and row.td.get("class", ["lazy"])[0] != "empty": subtitles.append(cls.from_row(row)) return subtitles From efdf3b2c9da1b36ae961a03b6a90ef2677f9a622 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 27 Jul 2019 02:57:35 +0200 Subject: [PATCH 556/710] core: http: fallback to default DNS when normal resolving fails; fixes #657 --- Contents/Libraries/Shared/subliminal_patch/http.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index b4fe6ad8f..db313578e 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -354,7 +354,6 @@ def patched_create_connection(address, *args, **kwargs): return _orig_create_connection((ip, port), *args, **kwargs) except dns.exception.DNSException: logger.warning("DNS: Couldn't resolve %s with DNS: %s", host, custom_resolver.nameservers) - raise logger.debug("DNS: Falling back to default DNS or IP on %s", host) return _orig_create_connection((host, port), *args, **kwargs) From f5156bcea7a46d2ae9b9b9c48aac3a4d57454ec1 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 27 Jul 2019 03:10:08 +0200 Subject: [PATCH 557/710] providers: titlovi: fix matching --- Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index 17d87ac32..c0a1ffa11 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -226,7 +226,7 @@ def query(self, languages, title, season=None, episode=None, year=None, video=No page_link = self.server_url + sub.a.attrs['href'] # subtitle language _lang = sub.select_one('.lang') - match = lang_re.search(_lang.attrs.get('src', _lang.attrs.get('cfsrc', ''))) + match = lang_re.search(_lang.attrs.get('src', _lang.attrs.get('data-cfsrc', ''))) if match: try: # decode language From 0cf0371a4360bb31bcb73c1900f23a71ed8a1faa Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 6 Aug 2019 18:04:34 +0200 Subject: [PATCH 558/710] core: language: use replacement map from bazarr --- Contents/Libraries/Shared/subzero/language.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index 8d096e19d..0a3a5e775 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -8,6 +8,25 @@ "dk": "da", "nld": "nl", "english": "en", + "alb": "sq", + "arm": "hy", + "baq": "eu", + "bur": "my", + "chi": "zh", + "cze": "cs", + "dut": "nl", + "fre": "fr", + "geo": "ka", + "ger": "de", + "gre": "el", + "ice": "is", + "mac": "mk", + "mao": "mi", + "may": "ms", + "per": "fa", + "rum": "ro", + "slo": "sk", + "tib": "bo", } From ffc42883de279a3f7c343e43e14c61a0d060a7d9 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 8 Aug 2019 14:30:29 +0200 Subject: [PATCH 559/710] core: extract embedded/menu: fix detection of unknown streams; don't use unknown streams if a known language was previously found --- Contents/Code/__init__.py | 6 ++++- Contents/Code/support/helpers.py | 2 +- Contents/Code/support/plex_media.py | 36 ++++++++++++++++++++--------- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 833801fd2..5f5ecf71c 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -119,19 +119,23 @@ def agent_extract_embedded(video_part_map): for plexapi_part in get_all_parts(plexapi_item): item_count = item_count + 1 used_one_unknown_stream = False + used_one_known_stream = False for requested_language in config.lang_list: + skip_unknown = used_one_unknown_stream or used_one_known_stream embedded_subs = stored_subs.get_by_provider(plexapi_part.id, requested_language, "embedded") current = stored_subs.get_any(plexapi_part.id, requested_language) or \ requested_language in scanned_video.external_subtitle_languages if not embedded_subs: stream_data = get_embedded_subtitle_streams(plexapi_part, requested_language=requested_language, - skip_unknown=used_one_unknown_stream) + skip_unknown=skip_unknown) if stream_data: stream = stream_data[0]["stream"] if stream_data[0]["is_unknown"]: used_one_unknown_stream = True + else: + used_one_known_stream = True to_extract.append(({scanned_video: part_info}, plexapi_part, str(stream.index), str(requested_language), not current)) diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index ca37a7fbf..8a7c974d7 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -394,7 +394,7 @@ def get_language_from_stream(lang_code): return Language.fromietf(lang) elif lang: try: - return language_from_stream(lang) + return language_from_stream(lang_code) except LanguageError: pass diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index 1dd8a4db3..772d90faa 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -177,6 +177,7 @@ def get_all_parts(plex_item): def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_unknown=True, skip_unknown=False): streams = [] streams_unknown = [] + all_streams = [] has_unknown = False found_requested_language = False for stream in part.streams: @@ -189,27 +190,40 @@ def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_ is_unknown = False found_requested_language = requested_language and requested_language == language + stream_data = None - if not language and config.treat_und_as_first: + if not language: # only consider first unknown subtitle stream - if has_unknown and skip_duplicate_unknown: - continue - - language = Language.rebuild(list(config.lang_list)[0], forced=is_forced) + if requested_language and config.treat_und_as_first: + if has_unknown and skip_duplicate_unknown: + Log.Debug("skipping duplicate unknown") + continue + + language = Language.rebuild(list(config.lang_list)[0], forced=is_forced) + else: + language = Language("unk") is_unknown = True has_unknown = True - streams_unknown.append({"stream": stream, "is_unknown": is_unknown, "language": language, - "is_forced": is_forced}) + stream_data = {"stream": stream, "is_unknown": is_unknown, "language": language, + "is_forced": is_forced} + streams_unknown.append(stream_data) if not requested_language or found_requested_language: - streams.append({"stream": stream, "is_unknown": is_unknown, "language": language, - "is_forced": is_forced}) + stream_data = {"stream": stream, "is_unknown": is_unknown, "language": language, + "is_forced": is_forced} + streams.append(stream_data) if found_requested_language: break - if streams_unknown and not found_requested_language and not skip_unknown: - streams = streams_unknown + if stream_data: + all_streams.append(stream_data) + + if requested_language: + if streams_unknown and not found_requested_language and not skip_unknown: + streams = streams_unknown + else: + streams = all_streams return streams From 54435398afd7db90e86b29f18df0f5c5819ae073 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 8 Aug 2019 15:09:04 +0200 Subject: [PATCH 560/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index c9841e5c4..2a372b9fa 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3109</string> + <string>2.6.5.3122</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3109 DEV +Version 2.6.5.3122 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 02a3ecc9fe4413ad9d19e1df3ae405945669bcce Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 9 Aug 2019 03:11:55 +0200 Subject: [PATCH 561/710] prepare for release --- CHANGELOG.md | 12 ++++++++++++ Contents/Info.plist | 4 ++-- README.md | 17 ++++++++++++----- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d29eb706a..a80475ec8 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +2.6.5.3109 + +subscene, addic7ed and titlovi +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- providers: add Napisy24 (polish) +- providers: subscene: reduce provider load by possibly half +- providers: subscene: support logging in (username/password are now required) +- providers: subscene: fallback to non year results if none found with year + + 2.6.5.3099 subscene, addic7ed and titlovi diff --git a/Contents/Info.plist b/Contents/Info.plist index 2a372b9fa..b9169f220 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3122</string> + <string>2.6.5.xxxx</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3122 DEV +Version 2.6.5.xxxx DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 241590679..6910e68a0 100644 --- a/README.md +++ b/README.md @@ -90,16 +90,23 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3109 + +2.6.5.xxxx subscene, addic7ed and titlovi - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog -- providers: add Napisy24 (polish) -- providers: subscene: reduce provider load by possibly half -- providers: subscene: support logging in (username/password are now required) -- providers: subscene: fallback to non year results if none found with year +- core: http: fallback to default DNS when normal resolving fails; fixes #657 +- core: extract embedded/menu: fix detection of unknown streams; don't use unknown streams if a known language was previously found +- core: language: use replacement map from bazarr +- providers: titlovi: fix matching +- providers: subscene: fix unknown language code error when "empty" result is returned +- providers: subscene: add support for pt-BR (based on Diaoul/subliminal@b22cf08) +- providers: subscene: explicitly set account filters for languages +- providers: subscene: limit alternative searches to 3; set throttle to 8 +- providers: subscene: move login/cookies to initialization sequence +- submod: generic: en: fix ";='s [older changes](CHANGELOG.md) From 7cb2486d3e13d78c53da4553583929001992f3fe Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 9 Aug 2019 03:13:34 +0200 Subject: [PATCH 562/710] release 2.6.5.3124 --- Contents/Info.plist | 6 +++--- README.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index b9169f220..0b46463df 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.xxxx</string> + <string>2.6.5.3124</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.xxxx DEV +Version 2.6.5.3124 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 6910e68a0..514fcaa6d 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.xxxx +2.6.5.3124 subscene, addic7ed and titlovi - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration From 4d03ca078decefc16f26380191b716a7472246c1 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 9 Aug 2019 03:38:54 +0200 Subject: [PATCH 563/710] back to dev --- Contents/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 0b46463df..22a223bd5 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> From 20620cfa7e7f0c39c9efcd3cd56db42e38f63fef Mon Sep 17 00:00:00 2001 From: viking1304 <viking1304@gmail.com> Date: Fri, 9 Aug 2019 18:22:42 +0200 Subject: [PATCH 564/710] New implentation of Titlovi using API --- Contents/Code/support/config.py | 4 + Contents/DefaultPrefs.json | 16 +- .../subliminal_patch/converters/titlovi.py | 14 - .../subliminal_patch/providers/titlovi.py | 271 +++++++++--------- 4 files changed, 148 insertions(+), 157 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index e79e0665f..2f40859a2 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -866,6 +866,10 @@ def get_provider_settings(self): 'only_foreign': self.forced_only, 'also_foreign': self.forced_also, }, + 'titlovi': { + 'username': Prefs['provider.titlovi.username'], + 'password': Prefs['provider.titlovi.password'], + }, 'napisy24': { 'username': Prefs['provider.napisy24.username'], 'password': Prefs['provider.napisy24.password'], diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 5d48f74a4..d51a2d7e5 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -409,10 +409,24 @@ }, { "id": "provider.titlovi.enabled", - "label": "Provider: Enable Titlovi.com (might need AntiCaptcha)", + "label": "Provider: Enable Titlovi.com (User and Password required)", "type": "bool", "default": "true" }, + { + "id": "provider.titlovi.username", + "label": "Titlovi Username", + "type": "text", + "default": "" + }, + { + "id": "provider.titlovi.password", + "label": "Titlovi Password", + "type": "text", + "option": "hidden", + "default": "", + "secure": "true" + }, { "id": "provider.legendastv.enabled", "label": "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", diff --git a/Contents/Libraries/Shared/subliminal_patch/converters/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/converters/titlovi.py index 940507d4f..761cf79a6 100644 --- a/Contents/Libraries/Shared/subliminal_patch/converters/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/converters/titlovi.py @@ -27,16 +27,6 @@ def __init__(self): } self.codes = set(self.from_titlovi.keys()) - # temporary fix, should be removed as soon as API is used - self.lang_from_countrycode = {'ba': ('bos',), - 'en': ('eng',), - 'hr': ('hrv',), - 'mk': ('mkd',), - 'rs': ('srp',), - 'rsc': ('srp', None, 'Cyrl'), - 'si': ('slv',) - } - def convert(self, alpha3, country=None, script=None): if (alpha3, country, script) in self.to_titlovi: return self.to_titlovi[(alpha3, country, script)] @@ -49,9 +39,5 @@ def reverse(self, titlovi): if titlovi in self.from_titlovi: return self.from_titlovi[titlovi] - # temporary fix, should be removed as soon as API is used - if titlovi in self.lang_from_countrycode: - return self.lang_from_countrycode[titlovi] - raise ConfigurationError('Unsupported language number for titlovi: %s' % titlovi) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index c0a1ffa11..846cd26bd 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -2,42 +2,35 @@ import io import logging -import math import re -import time +from datetime import datetime +import dateutil.parser import rarfile -from bs4 import BeautifulSoup from zipfile import ZipFile, is_zipfile from rarfile import RarFile, is_rarfile from babelfish import language_converters, Script -from requests import RequestException +from requests import RequestException, codes as request_codes from guessit import guessit from subliminal_patch.http import RetryingCFSession from subliminal_patch.providers import Provider from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin from subliminal_patch.subtitle import Subtitle from subliminal_patch.utils import sanitize, fix_inconsistent_naming as _fix_inconsistent_naming -from subliminal.exceptions import ProviderError +from subliminal.exceptions import ProviderError, AuthenticationError, ConfigurationError from subliminal.score import get_equivalent_release_groups from subliminal.utils import sanitize_release_group from subliminal.subtitle import guess_matches from subliminal.video import Episode, Movie from subliminal.subtitle import fix_line_ending -from subliminal_patch.pitcher import pitchers, load_verification, store_verification -from subzero.language import Language -from random import randint -from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST +from subzero.language import Language +from dogpile.cache.api import NO_VALUE +from subliminal.cache import region # parsing regex definitions title_re = re.compile(r'(?P<title>(?:.+(?= [Aa][Kk][Aa] ))|.+)(?:(?:.+)(?P<altitle>(?<= [Aa][Kk][Aa] ).+))?') -lang_re = re.compile(r'(?<=flags/)(?P<lang>.{2})(?:.)(?P<script>c?)(?:.+)') -season_re = re.compile(r'Sezona (?P<season>\d+)') -episode_re = re.compile(r'Epizoda (?P<episode>\d+)') -year_re = re.compile(r'(?P<year>\d+)') -fps_re = re.compile(r'fps: (?P<fps>.+)') def fix_inconsistent_naming(title): @@ -51,6 +44,7 @@ def fix_inconsistent_naming(title): return _fix_inconsistent_naming(title, {"DC's Legends of Tomorrow": "Legends of Tomorrow", "Marvel's Jessica Jones": "Jessica Jones"}) + logger = logging.getLogger(__name__) # Configure :mod:`rarfile` to use the same path separator as :mod:`zipfile` @@ -62,9 +56,9 @@ def fix_inconsistent_naming(title): class TitloviSubtitle(Subtitle): provider_name = 'titlovi' - def __init__(self, language, page_link, download_link, sid, releases, title, alt_title=None, season=None, - episode=None, year=None, fps=None, asked_for_release_group=None, asked_for_episode=None): - super(TitloviSubtitle, self).__init__(language, page_link=page_link) + def __init__(self, language, download_link, sid, releases, title, alt_title=None, season=None, + episode=None, year=None, rating=None, download_count=None, asked_for_release_group=None, asked_for_episode=None): + super(TitloviSubtitle, self).__init__(language) self.sid = sid self.releases = self.release_info = releases self.title = title @@ -73,11 +67,21 @@ def __init__(self, language, page_link, download_link, sid, releases, title, alt self.episode = episode self.year = year self.download_link = download_link - self.fps = fps + self.rating = rating + self.download_count = download_count self.matches = None self.asked_for_release_group = asked_for_release_group self.asked_for_episode = asked_for_episode + def __repr__(self): + if self.season and self.episode: + return '<%s "%s (%r)" s%.2de%.2d [%s:%s] ID:%r R:%.2f D:%r>' % ( + self.__class__.__name__, self.title, self.year, self.season, self.episode, self.language, self._guessed_encoding, self.sid, + self.rating, self.download_count) + else: + return '<%s "%s (%r)" [%s:%s] ID:%r R:%.2f D:%r>' % ( + self.__class__.__name__, self.title, self.year, self.language, self._guessed_encoding, self.sid, self.rating, self.download_count) + @property def id(self): return self.sid @@ -134,20 +138,62 @@ def get_matches(self, video): class TitloviProvider(Provider, ProviderSubtitleArchiveMixin): subtitle_class = TitloviSubtitle languages = {Language.fromtitlovi(l) for l in language_converters['titlovi'].codes} | {Language.fromietf('sr-Latn')} - server_url = 'https://titlovi.com' - search_url = server_url + '/titlovi/?' - download_url = server_url + '/download/?type=1&mediaid=' + api_url = 'https://kodi.titlovi.com/api/subtitles' + api_gettoken_url = api_url + '/gettoken' + api_search_url = api_url + '/search' + + def __init__(self, username=None, password=None): + if any((username, password)) and not all((username, password)): + raise ConfigurationError('Username and password must be specified') + + self.username = username + self.password = password + + self.session = None + + self.user_id = None + self.login_token = None + self.token_exp = None def initialize(self): self.session = RetryingCFSession() #load_verification("titlovi", self.session) + token = region.get("titlovi_token") + if token is not NO_VALUE: + self.user_id, self.login_token, self.token_exp = token + if datetime.now() > self.token_exp: + logger.debug('Token expired') + self.log_in() + else: + logger.debug('Use cached token') + else: + logger.debug('Token not found in cache') + self.log_in() + + def log_in(self): + login_params = dict(username=self.username, password=self.password, json=True) + try: + response = self.session.post(self.api_gettoken_url, params=login_params) + if response.status_code == request_codes.ok: + resp_json = response.json() + self.login_token = resp_json.get('Token') + self.user_id = resp_json.get('UserId') + self.token_exp = dateutil.parser.parse(resp_json.get('ExpirationDate')) + + region.set("titlovi_token", [self.user_id, self.login_token, self.token_exp]) + logger.debug('New token obtained') + + elif response.status_code == request_codes.unauthorized: + raise AuthenticationError('Login failed') + + except RequestException as e: + logger.error(e) def terminate(self): self.session.close() - def query(self, languages, title, season=None, episode=None, year=None, video=None): - items_per_page = 10 - current_page = 1 + def query(self, languages, title, season=None, episode=None, year=None, imdb_id=None, video=None): + search_params = dict() used_languages = languages lang_strings = [str(lang) for lang in used_languages] @@ -162,135 +208,73 @@ def query(self, languages, title, season=None, episode=None, year=None, video=No langs = '|'.join(map(str, [l.titlovi for l in used_languages])) # set query params - params = {'prijevod': title, 'jezik': langs} + search_params['query'] = title + search_params['lang'] = langs is_episode = False if season and episode: is_episode = True - params['s'] = season - params['e'] = episode - if year: - params['g'] = year + search_params['season'] = season + search_params['episode'] = episode + #if year: + # search_params['year'] = year + if imdb_id: + search_params['imdbID'] = imdb_id # loop through paginated results - logger.info('Searching subtitles %r', params) + logger.info('Searching subtitles %r', search_params) subtitles = [] + query_results = [] - while True: - # query the server - try: - r = self.session.get(self.search_url, params=params, timeout=10) - r.raise_for_status() - except RequestException as e: - logger.exception('RequestException %s', e) - break + try: + search_params['token'] = self.login_token + search_params['userid'] = self.user_id + search_params['json'] = True + + response = self.session.get(self.api_search_url, params=search_params) + resp_json = response.json() + if resp_json['SubtitleResults']: + query_results.extend(resp_json['SubtitleResults']) + + + except Exception as e: + logger.error(e) + + for sub in query_results: + + # title and alternate title + match = title_re.search(sub.get('Title')) + if match: + _title = match.group('title') + alt_title = match.group('altitle') else: - try: - soup = BeautifulSoup(r.content, 'lxml') - - # number of results - result_count = int(soup.select_one('.results_count b').string) - except: - result_count = None - - # exit if no results - if not result_count: - if not subtitles: - logger.debug('No subtitles found') - else: - logger.debug("No more subtitles found") - break - - # number of pages with results - pages = int(math.ceil(result_count / float(items_per_page))) - - # get current page - if 'pg' in params: - current_page = int(params['pg']) - - try: - sublist = soup.select('section.titlovi > ul.titlovi > li.subtitleContainer.canEdit') - for sub in sublist: - # subtitle id - sid = sub.find(attrs={'data-id': True}).attrs['data-id'] - # get download link - download_link = self.download_url + sid - # title and alternate title - match = title_re.search(sub.a.string) - if match: - _title = match.group('title') - alt_title = match.group('altitle') - else: - continue - - # page link - page_link = self.server_url + sub.a.attrs['href'] - # subtitle language - _lang = sub.select_one('.lang') - match = lang_re.search(_lang.attrs.get('src', _lang.attrs.get('data-cfsrc', ''))) - if match: - try: - # decode language - lang = Language.fromtitlovi(match.group('lang')+match.group('script')) - except ValueError: - continue - - # relase year or series start year - match = year_re.search(sub.find(attrs={'data-id': True}).parent.i.string) - if match: - r_year = int(match.group('year')) - # fps - match = fps_re.search(sub.select_one('.fps').string) - if match: - fps = match.group('fps') - # releases - releases = str(sub.select_one('.fps').parent.contents[0].string) - - # handle movies and series separately - if is_episode: - # season and episode info - sxe = sub.select_one('.s0xe0y').string - r_season = None - r_episode = None - if sxe: - match = season_re.search(sxe) - if match: - r_season = int(match.group('season')) - match = episode_re.search(sxe) - if match: - r_episode = int(match.group('episode')) - - subtitle = self.subtitle_class(lang, page_link, download_link, sid, releases, _title, - alt_title=alt_title, season=r_season, episode=r_episode, - year=r_year, fps=fps, - asked_for_release_group=video.release_group, - asked_for_episode=episode) - else: - subtitle = self.subtitle_class(lang, page_link, download_link, sid, releases, _title, - alt_title=alt_title, year=r_year, fps=fps, - asked_for_release_group=video.release_group) - logger.debug('Found subtitle %r', subtitle) - - # prime our matches so we can use the values later - subtitle.get_matches(video) - - # add found subtitles - subtitles.append(subtitle) - - finally: - soup.decompose() - - # stop on last page - if current_page >= pages: - break - - # increment current page - params['pg'] = current_page + 1 - logger.debug('Getting page %d', params['pg']) + continue + + # handle movies and series separately + if is_episode: + subtitle = self.subtitle_class(Language.fromtitlovi(sub.get('Lang')), sub.get('Link'), sub.get('Id'), sub.get('Release'), _title, + alt_title=alt_title, season=sub.get('Season'), episode=sub.get('Episode'), + year=sub.get('Year'), rating=sub.get('Rating'), + download_count=sub.get('DownloadCount'), + asked_for_release_group=video.release_group, + asked_for_episode=episode) + else: + subtitle = self.subtitle_class(Language.fromtitlovi(sub.get('Lang')), sub.get('Link'), sub.get('Id'), sub.get('Release'), _title, + alt_title=alt_title, year=sub.get('Year'), rating=sub.get('Rating'), + download_count=sub.get('DownloadCount'), + asked_for_release_group=video.release_group) + logger.debug('Found subtitle %r', subtitle) + + # prime our matches so we can use the values later + subtitle.get_matches(video) + + # add found subtitles + subtitles.append(subtitle) return subtitles def list_subtitles(self, video, languages): season = episode = None + if isinstance(video, Episode): title = video.series season = video.season @@ -300,6 +284,7 @@ def list_subtitles(self, video, languages): return [s for s in self.query(languages, fix_inconsistent_naming(title), season=season, episode=episode, year=video.year, + imdb_id=video.imdb_id, video=video)] def download_subtitle(self, subtitle): @@ -337,10 +322,12 @@ def get_subtitle_from_bundled_archive(self, subtitle, subs_in_archive, archive): sub_to_extract = None for sub_name in subs_in_archive: - if not ('.cyr' in sub_name or '.cir' in sub_name): + _sub_name = sub_name.lower() + + if not ('.cyr' in _sub_name or '.cir' in _sub_name or 'cyr)' in _sub_name): sr_lat_subs.append(sub_name) - if ('.cyr' in sub_name or '.cir' in sub_name) and not '.lat' in sub_name: + if ('.cyr' in sub_name or '.cir' in _sub_name) and not '.lat' in _sub_name.lower(): sr_cyr_subs.append(sub_name) if subtitle.language == 'sr': From 527d171a6a7d95305ab3e2322ef6aac7d11e2f17 Mon Sep 17 00:00:00 2001 From: viking1304 <viking1304@gmail.com> Date: Fri, 9 Aug 2019 18:54:35 +0200 Subject: [PATCH 565/710] Disable provider Titlovi if user and password are not set --- Contents/Code/support/config.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 2f40859a2..bd6e1be00 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -762,7 +762,9 @@ def providers_by_prefs(self): # 'thesubdb': Prefs['provider.thesubdb.enabled'], 'podnapisi': cast_bool(Prefs['provider.podnapisi.enabled']), 'napisy24': cast_bool(Prefs['provider.napisy24.enabled']), - 'titlovi': cast_bool(Prefs['provider.titlovi.enabled']), + 'titlovi': cast_bool(Prefs['provider.titlovi.enabled']) and + cast_bool(Prefs['provider.titlovi.username']) and + cast_bool(Prefs['provider.titlovi.password']), 'addic7ed': cast_bool(Prefs['provider.addic7ed.enabled']) and self.has_anticaptcha, 'tvsubtitles': cast_bool(Prefs['provider.tvsubtitles.enabled']), 'legendastv': cast_bool(Prefs['provider.legendastv.enabled']), From 8db1cdacb43d88d8da94e2e17f0f85eee0b9e384 Mon Sep 17 00:00:00 2001 From: viking1304 <viking1304@gmail.com> Date: Fri, 9 Aug 2019 19:01:08 +0200 Subject: [PATCH 566/710] Revert "Disable provider Titlovi if user and password are not set" This reverts commit 527d171a6a7d95305ab3e2322ef6aac7d11e2f17. --- Contents/Code/support/config.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index bd6e1be00..2f40859a2 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -762,9 +762,7 @@ def providers_by_prefs(self): # 'thesubdb': Prefs['provider.thesubdb.enabled'], 'podnapisi': cast_bool(Prefs['provider.podnapisi.enabled']), 'napisy24': cast_bool(Prefs['provider.napisy24.enabled']), - 'titlovi': cast_bool(Prefs['provider.titlovi.enabled']) and - cast_bool(Prefs['provider.titlovi.username']) and - cast_bool(Prefs['provider.titlovi.password']), + 'titlovi': cast_bool(Prefs['provider.titlovi.enabled']), 'addic7ed': cast_bool(Prefs['provider.addic7ed.enabled']) and self.has_anticaptcha, 'tvsubtitles': cast_bool(Prefs['provider.tvsubtitles.enabled']), 'legendastv': cast_bool(Prefs['provider.legendastv.enabled']), From d2022de97053d8da5a02d94de3ec521a30f92fe2 Mon Sep 17 00:00:00 2001 From: viking1304 <viking1304@gmail.com> Date: Mon, 12 Aug 2019 21:02:51 +0200 Subject: [PATCH 567/710] Removed titlovi from AntiCaptcha lablel --- Contents/DefaultPrefs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index d51a2d7e5..d2f3aa678 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -288,7 +288,7 @@ }, { "id": "anticaptcha.service", - "label": "AntiCaptcha-Service (needs paid account; enables Addic7ed, titlovi)", + "label": "AntiCaptcha-Service (needs paid account; enables Addic7ed)", "type": "enum", "values": [ "none", From 75b83aa1639d81b0ea30dadfeb4aa835f46a5407 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 13 Aug 2019 12:54:17 +0200 Subject: [PATCH 568/710] #661 fix match strictness when determining preexisting external subtitles --- Contents/Code/support/scanning.py | 3 +- .../Libraries/Shared/subliminal_patch/core.py | 28 +++++++++++++------ Contents/Libraries/Shared/subzero/video.py | 6 ++-- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Contents/Code/support/scanning.py b/Contents/Code/support/scanning.py index b97dc2555..20c4d8fce 100644 --- a/Contents/Code/support/scanning.py +++ b/Contents/Code/support/scanning.py @@ -127,7 +127,8 @@ def prepare_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, set_existing_languages(video, pms_video_info, external_subtitles=external_subtitles, embedded_subtitles=embedded_subtitles, known_embedded=known_embedded, stored_subs=stored_subs, languages=config.lang_list, - only_one=config.only_one, known_metadata_subs=known_metadata_subs) + only_one=config.only_one, known_metadata_subs=known_metadata_subs, + match_strictness=config.ext_match_strictness) # add video fps info video.fps = plex_part.fps diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 363477e1f..f263cdcf3 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -574,10 +574,11 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski return video -def _search_external_subtitles(path, languages=None, only_one=False, scandir_generic=False): +def _search_external_subtitles(path, languages=None, only_one=False, scandir_generic=False, match_strictness="strict"): dirpath, filename = os.path.split(path) dirpath = dirpath or '.' - fileroot, fileext = os.path.splitext(filename) + fn_no_ext, fileext = os.path.splitext(filename) + fn_no_ext_lower = fn_no_ext.lower() subtitles = {} _scandir = _scandir_generic if scandir_generic else scandir for entry in _scandir(dirpath): @@ -588,15 +589,25 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen continue p = entry.name - # keep only valid subtitle filenames - if not p.lower().startswith(fileroot.lower()) or not p.lower().endswith(SUBTITLE_EXTENSIONS): + if p.lower().endswith(SUBTITLE_EXTENSIONS): continue + # not p.lower().startswith(fileroot.lower()) or not + p_root, p_ext = os.path.splitext(p) if not INCLUDE_EXOTIC_SUBS and p_ext not in (".srt", ".ass", ".ssa", ".vtt"): continue + p_root_lower = p_root.lower() + + filename_matches = p_root_lower == fn_no_ext_lower + filename_contains = p_root_lower in fn_no_ext_lower + + if not filename_matches: + if match_strictness == "strict" or (match_strictness == "loose" and not filename_contains): + continue + # extract potential forced/normal/default tag # fixme: duplicate from subtitlehelpers split_tag = p_root.rsplit('.', 1) @@ -611,7 +622,7 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen forced = "forced" in adv_tag # extract the potential language code - language_code = p_root[len(fileroot):].replace('_', '-')[1:] + language_code = p_root[len(fn_no_ext):].replace('_', '-')[1:] # default language is undefined language = Language('und') @@ -635,7 +646,7 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen return subtitles -def search_external_subtitles(path, languages=None, only_one=False): +def search_external_subtitles(path, languages=None, only_one=False, match_strictness="strict"): """ wrap original search_external_subtitles function to search multiple paths for one given video # todo: cleanup and merge with _search_external_subtitles @@ -656,10 +667,11 @@ def search_external_subtitles(path, languages=None, only_one=False): if os.path.isdir(os.path.dirname(abspath)): try: subtitles.update(_search_external_subtitles(abspath, languages=languages, - only_one=only_one)) + only_one=only_one, match_strictness=match_strictness)) except OSError: subtitles.update(_search_external_subtitles(abspath, languages=languages, - only_one=only_one, scandir_generic=True)) + only_one=only_one, match_strictness=match_strictness, + scandir_generic=True)) logger.debug("external subs: found %s", subtitles) return subtitles diff --git a/Contents/Libraries/Shared/subzero/video.py b/Contents/Libraries/Shared/subzero/video.py index 13db33ddf..160e1afec 100644 --- a/Contents/Libraries/Shared/subzero/video.py +++ b/Contents/Libraries/Shared/subzero/video.py @@ -17,7 +17,8 @@ def has_external_subtitle(part_id, stored_subs, language): def set_existing_languages(video, video_info, external_subtitles=False, embedded_subtitles=False, known_embedded=None, - stored_subs=None, languages=None, only_one=False, known_metadata_subs=None): + stored_subs=None, languages=None, only_one=False, known_metadata_subs=None, + match_strictness="strict"): logger.debug(u"Determining existing subtitles for %s", video.name) external_langs_found = set() @@ -27,7 +28,8 @@ def set_existing_languages(video, video_info, external_subtitles=False, embedded external_langs_found = known_metadata_subs external_langs_found.update(set(search_external_subtitles(video.name, languages=languages, - only_one=only_one).values())) + only_one=only_one, + match_strictness=match_strictness).values())) # found external subtitles should be considered? if external_subtitles: From 8169d31e867874dc38d38afb036cee3cd82106bf Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 13 Aug 2019 13:01:05 +0200 Subject: [PATCH 569/710] #661 fix bad condition --- Contents/Libraries/Shared/subliminal_patch/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index f263cdcf3..1a9fc371a 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -590,7 +590,7 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen p = entry.name # keep only valid subtitle filenames - if p.lower().endswith(SUBTITLE_EXTENSIONS): + if not p.lower().endswith(SUBTITLE_EXTENSIONS): continue # not p.lower().startswith(fileroot.lower()) or not From 0e4917bba95213a6b83972730bc9cb7c09147a65 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 13 Aug 2019 18:06:06 +0200 Subject: [PATCH 570/710] #661 further improvements --- Contents/Code/support/localmedia.py | 3 ++- Contents/Code/support/subtitlehelpers.py | 16 ++--------- .../Libraries/Shared/subliminal_patch/core.py | 27 +++++++++++-------- Contents/Libraries/Shared/subzero/language.py | 14 ++++++++++ 4 files changed, 34 insertions(+), 26 deletions(-) diff --git a/Contents/Code/support/localmedia.py b/Contents/Code/support/localmedia.py index 2a5ac39c4..0c7d8b318 100755 --- a/Contents/Code/support/localmedia.py +++ b/Contents/Code/support/localmedia.py @@ -7,6 +7,7 @@ import subtitlehelpers from config import config as sz_config +from subzero.language import ENDSWITH_LANGUAGECODE_RE SECONDARY_TAGS = ['forced', 'normal', 'default', 'embedded', 'embedded-forced', 'custom', 'hi', 'cc', 'sdh'] @@ -125,7 +126,7 @@ def find_subtitles(part, ignore_parts_cleanup=None): root = split_tag[0] # get associated media file name without language - sub_fn = subtitlehelpers.ENDSWITH_LANGUAGECODE_RE.sub("", root) + sub_fn = ENDSWITH_LANGUAGECODE_RE.sub("", root) # subtitle basename and basename without possible language tag not found in collected # media files? kill. diff --git a/Contents/Code/support/subtitlehelpers.py b/Contents/Code/support/subtitlehelpers.py index a2086f3aa..d2b165fd7 100644 --- a/Contents/Code/support/subtitlehelpers.py +++ b/Contents/Code/support/subtitlehelpers.py @@ -5,6 +5,7 @@ from config import config, SUBTITLE_EXTS, TEXT_SUBTITLE_EXTS from bs4 import UnicodeDammit +from subzero.language import match_ietf_language class SubtitleHelper(object): @@ -85,19 +86,6 @@ def process_subtitles(self, part): ##################################################################################################################### -IETF_MATCH = ".+\.([^-.]+)(?:-[A-Za-z]+)?$" -ENDSWITH_LANGUAGECODE_RE = re.compile("\.([^-.]{2,3})(?:-[A-Za-z]{2,})?$") - - -def match_ietf_language(s): - language_match = re.match(".+\.([^\.]+)$" if not helpers.cast_bool(Prefs["subtitles.language.ietf_display"]) - else IETF_MATCH, s) - if language_match and len(language_match.groups()) == 1: - language = language_match.groups()[0] - return language - return s - - class DefaultSubtitleHelper(SubtitleHelper): @classmethod def is_helper_for(cls, filename): @@ -133,7 +121,7 @@ def process_subtitles(self, part): # Attempt to extract the language from the filename (e.g. Avatar (2009).eng) # IETF support thanks to # https://github.com/hpsbranco/LocalMedia.bundle/commit/4fad9aefedece78a1fa96401304351347f644369 - lang_part = match_ietf_language(file) + lang_part = match_ietf_language(file, ietf=helpers.cast_bool(Prefs["subtitles.language.ietf_display"])) if lang_part != file: language = Locale.Language.Match(lang_part) elif config.only_one: diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 1a9fc371a..2608b7fe9 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -30,7 +30,7 @@ ThreadPoolExecutor, check_video from subliminal_patch.exceptions import TooManyRequests, APIThrottled -from subzero.language import Language +from subzero.language import Language, ENDSWITH_LANGUAGECODE_RE from scandir import scandir, scandir_generic as _scandir_generic logger = logging.getLogger(__name__) @@ -581,6 +581,7 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen fn_no_ext_lower = fn_no_ext.lower() subtitles = {} _scandir = _scandir_generic if scandir_generic else scandir + for entry in _scandir(dirpath): if (not entry.name or entry.name in ('\x0c', '$', ',', '\x7f')) and not scandir_generic: logger.debug('Could not determine the name of the file, retrying with scandir_generic') @@ -589,6 +590,7 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen continue p = entry.name + # keep only valid subtitle filenames if not p.lower().endswith(SUBTITLE_EXTENSIONS): continue @@ -599,15 +601,6 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen if not INCLUDE_EXOTIC_SUBS and p_ext not in (".srt", ".ass", ".ssa", ".vtt"): continue - p_root_lower = p_root.lower() - - filename_matches = p_root_lower == fn_no_ext_lower - filename_contains = p_root_lower in fn_no_ext_lower - - if not filename_matches: - if match_strictness == "strict" or (match_strictness == "loose" and not filename_contains): - continue - # extract potential forced/normal/default tag # fixme: duplicate from subtitlehelpers split_tag = p_root.rsplit('.', 1) @@ -622,7 +615,19 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen forced = "forced" in adv_tag # extract the potential language code - language_code = p_root[len(fn_no_ext):].replace('_', '-')[1:] + language_code = p_root.rsplit(".", 1)[1].replace('_', '-') + + # remove possible language code for matching + p_root_bare = ENDSWITH_LANGUAGECODE_RE.sub("", p_root) + + p_root_lower = p_root_bare.lower() + + filename_matches = p_root_lower == fn_no_ext_lower + filename_contains = p_root_lower in fn_no_ext_lower + + if not filename_matches: + if match_strictness == "strict" or (match_strictness == "loose" and not filename_contains): + continue # default language is undefined language = Language('und') diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index 0a3a5e775..a13bab160 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -1,5 +1,6 @@ # coding=utf-8 import types +import re from babelfish.exceptions import LanguageError from babelfish import Language as Language_, basestr @@ -134,3 +135,16 @@ def fromalpha3b(cls, s): return Language(*Language_.fromietf(s).__getstate__()) return Language(*Language_.fromalpha3b(s).__getstate__()) + + +IETF_MATCH = ".+\.([^-.]+)(?:-[A-Za-z]+)?$" +ENDSWITH_LANGUAGECODE_RE = re.compile("\.([^-.]{2,3})(?:-[A-Za-z]{2,})?$") + + +def match_ietf_language(s, ietf=False): + language_match = re.match(".+\.([^\.]+)$" if not ietf + else IETF_MATCH, s) + if language_match and len(language_match.groups()) == 1: + language = language_match.groups()[0] + return language + return s From ada0b9687246c8c77b257b353742c86989ea7749 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 22 Aug 2019 14:58:28 +0200 Subject: [PATCH 571/710] #664 fix missing language processing of multiple videos refreshed at once --- Contents/Code/support/download.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Contents/Code/support/download.py b/Contents/Code/support/download.py index 0cd974ed9..6e9e23e28 100644 --- a/Contents/Code/support/download.py +++ b/Contents/Code/support/download.py @@ -53,14 +53,14 @@ def get_missing_languages(video, part): filter(lambda l: not l.forced, video.subtitle_languages) if langs: Log.Debug("We have at least one subtitle for any configured language.") - return False + return set() elif "External subtitle" in config.any_language_is_enough: langs = video.subtitle_languages if not not_in_forced else \ filter(lambda l: not l.forced, video.external_subtitle_languages) if langs: Log.Debug("We have at least one external subtitle for any configured language.") - return False + return set() # all languages are found if we either really have subs for all languages or we only want to have exactly one language # and we've only found one (the case for a selected language, Prefs['subtitles.only_one'] (one found sub matches any language)) @@ -70,7 +70,7 @@ def get_missing_languages(video, part): Log.Debug('Only one language was requested, and we\'ve got a subtitle for %s', video) else: Log.Debug('All languages %r exist for %s', languages, video) - return False + return set() # re-add country codes to the missing languages, in case we've removed them above if config.ietf_as_alpha3: @@ -106,21 +106,22 @@ def language_hook(provider): def download_best_subtitles(video_part_map, min_score=0, throttle_time=None, providers=None): hearing_impaired = Prefs['subtitles.search.hearingImpaired'] languages = set([Language.rebuild(l) for l in config.lang_list]) - missing_languages = [] if not languages: return use_videos = [] + missing_languages = set() for video, part in video_part_map.iteritems(): if not video.ignore_all: - missing_languages = get_missing_languages(video, part) + p_missing_languages = get_missing_languages(video, part) else: - missing_languages = languages + p_missing_languages = languages - if missing_languages: - Log.Info(u"%s has missing languages: %s", os.path.basename(video.name), missing_languages) + if p_missing_languages: + Log.Info(u"%s has missing languages: %s", os.path.basename(video.name), p_missing_languages) refine_video(video, refiner_settings=config.refiner_settings) use_videos.append(video) + missing_languages.update(p_missing_languages) # prepare blacklist blacklist = get_blacklist_from_part_map(video_part_map, languages) From 23242c0f52cd8a4ebef18d4985b8c8640526e796 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 22 Aug 2019 15:34:45 +0200 Subject: [PATCH 572/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 22a223bd5..8410e1e79 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3124</string> + <string>2.6.5.3137</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3124 +Version 2.6.5.3137 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From a0ab6e406aa6bc9ad8db7b4042556fcb6f3896b4 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 22 Aug 2019 15:46:38 +0200 Subject: [PATCH 573/710] providers: titlovi: raise ConfigurationError if credentials aren't given --- Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index 846cd26bd..9be0a92f6 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -143,7 +143,7 @@ class TitloviProvider(Provider, ProviderSubtitleArchiveMixin): api_search_url = api_url + '/search' def __init__(self, username=None, password=None): - if any((username, password)) and not all((username, password)): + if not all((username, password)): raise ConfigurationError('Username and password must be specified') self.username = username From 638dec0f044730d0422bc74ec0bc52f0842b1fa7 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sat, 24 Aug 2019 04:45:45 +0200 Subject: [PATCH 574/710] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 8f14b727c..c3ae97905 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,10 @@ Check out **[the Sub-Zero Wiki](https://github.com/pannal/Sub-Zero.bundle/wiki)* --- +**[Kitana is now required to have a UI](https://github.com/pannal/Kitana)** + +--- + **[The future of Sub-Zero](https://www.reddit.com/r/PleX/comments/9n9qjl/subzero_the_future/)** --- From 11d111da7c4e66418bad6fc6bcc2f0eac1b4516a Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sat, 24 Aug 2019 04:51:26 +0200 Subject: [PATCH 575/710] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c3ae97905..3e9eea3a5 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Check out **[the Sub-Zero Wiki](https://github.com/pannal/Sub-Zero.bundle/wiki)* ## Helping development -If you like this, buy me a beer: <br>[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G9VKR2B8PMNKG) <br>or become a Patreon starting at **1 $ / month** <br><a href="https://www.patreon.com/subzero_plex" target="_blank"><img src="http://www.wenspencer.com/wp-content/uploads/2017/02/patreon-button.png" height="42" /></a> <br>or use the OpenSubtitles Sub-Zero affiliate link to become VIP <br>**10€/year, ad-free subs, 1000 subs/day, no-cache *VIP* server**<br><a href="http://v.ht/osvip" target="_blank"><img src="https://static.opensubtitles.org/gfx/logo.gif" height="50" /></a> +If you like this, buy me a beer: <br>[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G9VKR2B8PMNKG) <br>or become a Patreon starting at **1 $ / month** <br><a href="https://www.patreon.com/subzero_plex" target="_blank"><img src="https://i0.wp.com/tablecakes.com/wp-content/uploads/2018/08/become-a-patron-button.png" height="54" /></a> <br>or use the OpenSubtitles Sub-Zero affiliate link to become VIP <br>**10€/year, ad-free subs, 1000 subs/day, no-cache *VIP* server**<br><a href="http://v.ht/osvip" target="_blank"><img src="https://static.opensubtitles.org/gfx/logo.gif" height="50" /></a> If you register with an anti-captcha service and you decide to use [Anti-Captcha.com](http://getcaptchasolution.com/kkvviom7nh), you can use [this affiliate link](http://getcaptchasolution.com/kkvviom7nh) to help development. From 95b1272018ece7ea56b87850c30b6471c35f1607 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 25 Aug 2019 06:12:48 +0200 Subject: [PATCH 576/710] explicit language=None check --- Contents/Code/support/download.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/download.py b/Contents/Code/support/download.py index 6e9e23e28..c37766495 100644 --- a/Contents/Code/support/download.py +++ b/Contents/Code/support/download.py @@ -33,14 +33,14 @@ def get_missing_languages(video, part): alpha3_map = {} if config.ietf_as_alpha3: for language in languages: - if language.country: + if language and language.country: alpha3_map[language.alpha3] = language.country language.country = None have_languages = video.subtitle_languages.copy() if config.ietf_as_alpha3: for language in have_languages: - if language.country: + if language and language.country: alpha3_map[language.alpha3] = language.country language.country = None From de447d2d0ba486a38c7181bfb2ad5a6b7fb6637e Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 31 Aug 2019 14:32:42 +0200 Subject: [PATCH 577/710] core: fix for determining whether to search under certain circumstances; fixes #666 --- Contents/Code/support/download.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/support/download.py b/Contents/Code/support/download.py index c37766495..263facea1 100644 --- a/Contents/Code/support/download.py +++ b/Contents/Code/support/download.py @@ -56,7 +56,7 @@ def get_missing_languages(video, part): return set() elif "External subtitle" in config.any_language_is_enough: - langs = video.subtitle_languages if not not_in_forced else \ + langs = video.external_subtitle_languages if not not_in_forced else \ filter(lambda l: not l.forced, video.external_subtitle_languages) if langs: Log.Debug("We have at least one external subtitle for any configured language.") From c23b3e93a6cfecbbc522e097fdcce1bdf1293355 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 31 Aug 2019 14:33:04 +0200 Subject: [PATCH 578/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 8410e1e79..bb70baa9e 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3137</string> + <string>2.6.5.3141</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3137 +Version 2.6.5.3141 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From f4e82c560de424c3c1da3e330747c58f3b331162 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Fri, 20 Sep 2019 18:10:16 +0200 Subject: [PATCH 579/710] core: fix default values of opensubtitles-skip-wrong-fps, use_https; fix #676 --- Contents/Code/support/config.py | 4 ++-- Contents/Libraries/Shared/subzero/lib/dict.py | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 2f40859a2..051ff438a 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -844,10 +844,10 @@ def get_providers(self, media_type="series"): def get_provider_settings(self): os_use_https = self.advanced.providers.opensubtitles.use_https \ - if self.advanced.providers.opensubtitles.use_https is not None else True + if self.advanced.providers.opensubtitles.has("use_https") else True os_skip_wrong_fps = self.advanced.providers.opensubtitles.skip_wrong_fps \ - if self.advanced.providers.opensubtitles.skip_wrong_fps is not None else True + if self.advanced.providers.opensubtitles.has("skip_wrong_fps") else True provider_settings = {'addic7ed': {'username': Prefs['provider.addic7ed.username'], 'password': Prefs['provider.addic7ed.password'], diff --git a/Contents/Libraries/Shared/subzero/lib/dict.py b/Contents/Libraries/Shared/subzero/lib/dict.py index 3f327dcf4..4cdac63f7 100644 --- a/Contents/Libraries/Shared/subzero/lib/dict.py +++ b/Contents/Libraries/Shared/subzero/lib/dict.py @@ -107,6 +107,9 @@ def __init__(self, **entries): for key, value in entries.iteritems(): self.__dict__[key] = (Dicked(**value) if isinstance(value, dict) else value) + def has(self, key): + return self._entries is not None and key in self._entries + def __repr__(self): return str(self) From 8b5be8ea4b236463d19b98d216320786ea31e247 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Fri, 20 Sep 2019 18:14:14 +0200 Subject: [PATCH 580/710] #676 improve --- Contents/Code/support/config.py | 7 ++----- Contents/Libraries/Shared/subzero/lib/dict.py | 3 +++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 051ff438a..e9ee40d5c 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -843,11 +843,8 @@ def get_providers(self, media_type="series"): providers = property(get_providers) def get_provider_settings(self): - os_use_https = self.advanced.providers.opensubtitles.use_https \ - if self.advanced.providers.opensubtitles.has("use_https") else True - - os_skip_wrong_fps = self.advanced.providers.opensubtitles.skip_wrong_fps \ - if self.advanced.providers.opensubtitles.has("skip_wrong_fps") else True + os_use_https = self.advanced.providers.opensubtitles.get("use_https", True) + os_skip_wrong_fps = self.advanced.providers.opensubtitles.get("skip_wrong_fps", True) provider_settings = {'addic7ed': {'username': Prefs['provider.addic7ed.username'], 'password': Prefs['provider.addic7ed.password'], diff --git a/Contents/Libraries/Shared/subzero/lib/dict.py b/Contents/Libraries/Shared/subzero/lib/dict.py index 4cdac63f7..c920d20fe 100644 --- a/Contents/Libraries/Shared/subzero/lib/dict.py +++ b/Contents/Libraries/Shared/subzero/lib/dict.py @@ -110,6 +110,9 @@ def __init__(self, **entries): def has(self, key): return self._entries is not None and key in self._entries + def get(self, key, default=None): + return self._entries.get(key, default) + def __repr__(self): return str(self) From d651f2cbb773a2de977bc5bc8d204f9212265f30 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Fri, 20 Sep 2019 18:24:16 +0200 Subject: [PATCH 581/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index bb70baa9e..1df4821c6 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3141</string> + <string>2.6.5.3144</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3141 +Version 2.6.5.3144 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 06c0b44589a29838b54038ef84e4f236242115f2 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sat, 21 Sep 2019 16:24:21 +0200 Subject: [PATCH 582/710] fix Dicked.get --- Contents/Libraries/Shared/subzero/lib/dict.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subzero/lib/dict.py b/Contents/Libraries/Shared/subzero/lib/dict.py index c920d20fe..929a9a642 100644 --- a/Contents/Libraries/Shared/subzero/lib/dict.py +++ b/Contents/Libraries/Shared/subzero/lib/dict.py @@ -111,7 +111,7 @@ def has(self, key): return self._entries is not None and key in self._entries def get(self, key, default=None): - return self._entries.get(key, default) + return self._entries.get(key, default) if self._entries else default def __repr__(self): return str(self) From 65b502afa459a2778da88863d2d38c28095a7bb3 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sat, 21 Sep 2019 16:25:33 +0200 Subject: [PATCH 583/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 1df4821c6..703b68600 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3144</string> + <string>2.6.5.3146</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3144 +Version 2.6.5.3146 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 433c8e987bf08548bbaa1a1e5ad7fe16d16f5478 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 5 Oct 2019 04:07:52 +0200 Subject: [PATCH 584/710] back from dev --- Contents/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 703b68600..79bc0f7bc 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> From 66859802f9a31343a8bc0fdc643f57ae6d8a5762 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 5 Oct 2019 04:13:50 +0200 Subject: [PATCH 585/710] update readme --- CHANGELOG.md | 18 ++++++++++++++++++ Contents/Info.plist | 4 ++-- README.md | 20 ++++++++------------ 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a80475ec8..ac0b78857 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ +2.6.5.3124 + +subscene, addic7ed and titlovi +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- core: http: fallback to default DNS when normal resolving fails; fixes #657 +- core: extract embedded/menu: fix detection of unknown streams; don't use unknown streams if a known language was previously found +- core: language: use replacement map from bazarr +- providers: titlovi: fix matching +- providers: subscene: fix unknown language code error when "empty" result is returned +- providers: subscene: add support for pt-BR (based on Diaoul/subliminal@b22cf08) +- providers: subscene: explicitly set account filters for languages +- providers: subscene: limit alternative searches to 3; set throttle to 8 +- providers: subscene: move login/cookies to initialization sequence +- submod: generic: en: fix ";='s + + 2.6.5.3109 subscene, addic7ed and titlovi diff --git a/Contents/Info.plist b/Contents/Info.plist index 79bc0f7bc..bce176939 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3146</string> + <string>2.6.5.3151</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3146 +Version 2.6.5.3151 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 3e9eea3a5..8f8c8fde3 100644 --- a/README.md +++ b/README.md @@ -95,22 +95,18 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3124 +2.6.5.x -subscene, addic7ed and titlovi +subscene, addic7ed - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog -- core: http: fallback to default DNS when normal resolving fails; fixes #657 -- core: extract embedded/menu: fix detection of unknown streams; don't use unknown streams if a known language was previously found -- core: language: use replacement map from bazarr -- providers: titlovi: fix matching -- providers: subscene: fix unknown language code error when "empty" result is returned -- providers: subscene: add support for pt-BR (based on Diaoul/subliminal@b22cf08) -- providers: subscene: explicitly set account filters for languages -- providers: subscene: limit alternative searches to 3; set throttle to 8 -- providers: subscene: move login/cookies to initialization sequence -- submod: generic: en: fix ";='s +- core: fix core issue possibly impacting results on OpenSubtitles in certain conditions +- core: fix default values of opensubtitles-skip-wrong-fps, use_https; fix #676 +- core: fix for determining whether to search under certain circumstances; fixes #666 +- core: #664 fix missing language processing of multiple videos refreshed at once +- core: #661 fix match strictness when determining preexisting external subtitles +- providers: titlovi: New implementation of Titlovi using API (thanks @viking1304) [older changes](CHANGELOG.md) From c48aa2b255bae8f39f2b754a7cdd9007344fb0aa Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 5 Oct 2019 04:14:28 +0200 Subject: [PATCH 586/710] release 2.6.5.3152 --- Contents/Info.plist | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index bce176939..c472cae97 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3151</string> + <string>2.6.5.3152</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3151 +Version 2.6.5.3152 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 8f8c8fde3..5118bb6f5 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.x +2.6.5.3152 subscene, addic7ed - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration From 1dc7b4b5e4fedbf0c552af621a156b8156ee4452 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 5 Oct 2019 04:15:11 +0200 Subject: [PATCH 587/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index c472cae97..f02d664b4 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3152 +Version 2.6.5.3152 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From f265c861d200a5af570f7f1f2028c2bbe456bea3 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 5 Oct 2019 04:24:20 +0200 Subject: [PATCH 588/710] back to dev --- Contents/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index f02d664b4..0c2fc60f1 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> From 802381b2bc455c1eabffe0b9b9313217ffb2c94e Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 5 Oct 2019 04:25:48 +0200 Subject: [PATCH 589/710] back to dev --- Contents/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 0c2fc60f1..f02d664b4 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> From eed7b9da0c69984425fcfe0704819f94d5b0a6a6 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 5 Oct 2019 16:47:45 +0200 Subject: [PATCH 590/710] core: support using mediainfo for retrieving MP4 MOV_TEXT subtitle stream titles (PMS bug) --- Contents/Code/interface/item_details.py | 7 +++-- Contents/Code/interface/menu.py | 2 +- Contents/Code/interface/menu_helpers.py | 5 +-- Contents/Code/support/config.py | 4 +++ Contents/Code/support/helpers.py | 9 ------ Contents/Code/support/missing_subtitles.py | 5 +-- Contents/Code/support/plex_media.py | 36 +++++++++++++++++++++- Contents/Code/support/scanning.py | 5 +-- Contents/advanced_settings.json.template | 7 +++++ 9 files changed, 61 insertions(+), 19 deletions(-) diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index f422b4046..6e48de92c 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -12,9 +12,10 @@ from refresh_item import RefreshItem from subzero.constants import PREFIX from support.config import config, TEXT_SUBTITLE_EXTS -from support.helpers import timestamp, df, get_language, display_language, get_language_from_stream, is_stream_forced +from support.helpers import timestamp, df, get_language, display_language, get_language_from_stream from support.items import get_item_kind_from_rating_key, get_item, get_current_sub, get_item_title, save_stored_sub -from support.plex_media import get_plex_metadata, get_part, get_embedded_subtitle_streams +from support.plex_media import get_plex_metadata, get_part, get_embedded_subtitle_streams, is_stream_forced, \ + update_stream_info from support.scanning import scan_videos from support.scheduler import scheduler from support.storage import get_subtitle_storage @@ -118,6 +119,8 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra if not os.path.exists(part.file): continue + update_stream_info(part) + part_id = str(part.id) part_index += 1 diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 27ee890b3..328e9398e 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -368,7 +368,7 @@ def ValidatePrefs(): "subtitle_destination_folder", "include", "include_exclude_paths", "include_exclude_sz_files", "new_style_cache", "dbm_supported", "lang_list", "providers", "normal_subs", "forced_only", "forced_also", "plex_transcoder", "refiner_settings", "unrar", "adv_cfg_path", "use_custom_dns", - "has_anticaptcha", "anticaptcha_cls"]: + "has_anticaptcha", "anticaptcha_cls", "mediainfo_bin"]: value = getattr(config, attr) if isinstance(value, dict): diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 94895ac38..11d3aa8dc 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -11,14 +11,14 @@ from subzero.language import Language from support.i18n import is_localized_string, _ from support.items import get_kind, get_item_thumb, get_item, get_item_kind_from_item, refresh_item -from support.helpers import get_video_display_title, pad_title, display_language, quote_args, is_stream_forced, \ +from support.helpers import get_video_display_title, pad_title, display_language, quote_args, \ get_title_for_video_metadata, mswindows from support.history import get_history from support.ignore import get_decision_list from support.lib import get_intent from support.config import config from subzero.constants import ICON_SUB, ICON -from support.plex_media import get_part, get_plex_metadata +from support.plex_media import get_part, get_plex_metadata, is_stream_forced, update_stream_info from support.scheduler import scheduler from support.scanning import scan_videos from support.storage import save_subtitles @@ -178,6 +178,7 @@ def extract_embedded_sub(**kwargs): metadata = get_plex_metadata(rating_key, part_id, item_type, plex_item=plex_item) scanned_videos = scan_videos([metadata], ignore_all=True, skip_hashing=True) + update_stream_info(part) for stream in part.streams: # subtitle stream if str(stream.index) == stream_index: diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index e9ee40d5c..b0779ca66 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -22,6 +22,7 @@ from subliminal.cli import MutexLock from subzero.lib.io import FileIO, get_viable_encoding from subzero.lib.dict import Dicked +from subzero.lib.which import find_executable from subzero.util import get_root_path from subzero.constants import PLUGIN_NAME, PLUGIN_IDENTIFIER, MOVIE, SHOW, MEDIA_TYPE_TO_STRING from subzero.prefs import get_user_prefs, update_user_prefs @@ -153,6 +154,7 @@ class Config(object): anticaptcha_token = None anticaptcha_cls = None has_anticaptcha = False + mediainfo_bin = None store_recently_played_amount = 40 @@ -239,6 +241,8 @@ def initialize(self): self.embedded_auto_extract = cast_bool(Prefs["subtitles.embedded.autoextract"]) self.ietf_as_alpha3 = cast_bool(Prefs["subtitles.language.ietf_normalize"]) self.use_custom_dns = self.parse_custom_dns() + if not self.advanced.dont_use_mediainfo_mp4: + self.mediainfo_bin = self.advanced.mediainfo_bin or find_executable("mediainfo") self.initialized = True def migrate_prefs(self): diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 8a7c974d7..597dcd7da 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -440,14 +440,5 @@ def display_language(l): return _(str(l.basename).lower()) + ((u" (%s)" % _("forced")) if l.forced else "") -def is_stream_forced(stream): - stream_title = getattr(stream, "title", "") or "" - forced = getattr(stream, "forced", False) - if not forced and stream_title and "forced" in stream_title.strip().lower(): - forced = True - - return forced - - class PartUnknownException(Exception): pass diff --git a/Contents/Code/support/missing_subtitles.py b/Contents/Code/support/missing_subtitles.py index 7553af5d1..1f3b41498 100755 --- a/Contents/Code/support/missing_subtitles.py +++ b/Contents/Code/support/missing_subtitles.py @@ -7,7 +7,8 @@ from babelfish import LanguageReverseError from support.config import config, TEXT_SUBTITLE_EXTS -from support.helpers import get_plex_item_display_title, cast_bool, get_language_from_stream, is_stream_forced +from support.helpers import get_plex_item_display_title, cast_bool, get_language_from_stream +from support.plex_media import is_stream_forced, update_stream_info from support.items import get_item from support.lib import Plex from support.storage import get_subtitle_storage @@ -35,7 +36,7 @@ def item_discover_missing_subs(rating_key, kind="show", added_at=None, section_t for media in item.media: existing_subs = {"internal": [], "external": [], "own_external": [], "count": 0} for part in media.parts: - + update_stream_info(part) # did we already download an external subtitle before? if subtitle_target_dir and stored_subs: for language in languages_set: diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index 772d90faa..bb0871dd1 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -1,6 +1,7 @@ # coding=utf-8 import os +import subprocess import helpers from items import get_item @@ -174,16 +175,49 @@ def get_all_parts(plex_item): return parts +def update_stream_info(part): + if config.mediainfo_bin and part.container == "mp4": + cmdline = '%s --Inform="Text;-%%ID%%_%%Title%%" %s' % (config.mediainfo_bin, helpers.quote(part.file)) + result = subprocess.check_output(cmdline, stderr=subprocess.PIPE, shell=True) + if result: + try: + stream_titles = {} + for pair in result[1:].split("-"): + sid, title = pair.split("_") + stream_titles[int(sid.strip())] = title.strip() + except: + pass + else: + filled = [] + for stream in part.streams: + index = stream.index+1 + if index in stream_titles: + stream.title = stream_titles[index] + filled.append(index-1) + if filled: + Log.Debug("Filled missing MP4 stream title info for streams: %s", filled) + + +def is_stream_forced(stream): + stream_title = getattr(stream, "title", "") or "" + forced = getattr(stream, "forced", False) + if not forced and stream_title and "forced" in stream_title.strip().lower(): + forced = True + + return forced + + def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_unknown=True, skip_unknown=False): streams = [] streams_unknown = [] all_streams = [] has_unknown = False found_requested_language = False + update_stream_info(part) for stream in part.streams: # subtitle stream if stream.stream_type == 3 and not stream.stream_key and stream.codec in TEXT_SUBTITLE_EXTS: - is_forced = helpers.is_stream_forced(stream) + is_forced = is_stream_forced(stream) language = helpers.get_language_from_stream(stream.language_code) if language: language = Language.rebuild(language, forced=is_forced) diff --git a/Contents/Code/support/scanning.py b/Contents/Code/support/scanning.py index 20c4d8fce..d97b08975 100644 --- a/Contents/Code/support/scanning.py +++ b/Contents/Code/support/scanning.py @@ -4,7 +4,7 @@ from babelfish.exceptions import LanguageError from support.lib import Plex, get_intent -from support.plex_media import get_stream_fps +from support.plex_media import get_stream_fps, is_stream_forced, update_stream_info from support.storage import get_subtitle_storage from support.config import config, TEXT_SUBTITLE_EXTS from support.subtitlehelpers import get_subtitles_from_metadata @@ -46,6 +46,7 @@ def prepare_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, # fixme: skip the whole scanning process if known_embedded == wanted languages? audio_languages = [] if plexpy_part: + update_stream_info(plexpy_part) for stream in plexpy_part.streams: if stream.stream_type == 2: lang = None @@ -62,7 +63,7 @@ def prepare_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, # subtitle stream elif stream.stream_type == 3 and embedded_subtitles: - is_forced = helpers.is_stream_forced(stream) + is_forced = is_stream_forced(stream) if ((config.forced_only or config.forced_also) and is_forced) or not is_forced: # embedded subtitle diff --git a/Contents/advanced_settings.json.template b/Contents/advanced_settings.json.template index b9c14c470..4db303835 100644 --- a/Contents/advanced_settings.json.template +++ b/Contents/advanced_settings.json.template @@ -24,6 +24,13 @@ Don't expect support if you mess this up. "find_better_as_extracted_tv_score": 352, "find_better_as_extracted_movie_score": 82, + // SZ can use mediainfo if present to detect titles/forced state of MP4 MOV_TEXT, because the PMS currently doesn't + // set the title attribute + "dont_use_mediainfo_mp4": False, + + // specific mediainfo binary path + "mediainfo_bin": null, + "debug_i18n": false, // per-provider-config From 8ffb20ebe3a70038b8e96487adee9df8436d06d1 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Mon, 7 Oct 2019 15:13:00 +0200 Subject: [PATCH 591/710] try fixing #681 --- Contents/Code/__init__.py | 2 +- Contents/Code/interface/item_details.py | 45 ++++++++++++------------- Contents/Code/support/helpers.py | 2 ++ Contents/Code/support/plex_media.py | 4 +-- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 5f5ecf71c..49567e73b 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -130,7 +130,7 @@ def agent_extract_embedded(video_part_map): stream_data = get_embedded_subtitle_streams(plexapi_part, requested_language=requested_language, skip_unknown=skip_unknown) - if stream_data: + if stream_data and stream_data[0]["language"]: stream = stream_data[0]["stream"] if stream_data[0]["is_unknown"]: used_one_unknown_stream = True diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index 6e48de92c..d92d91d80 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -673,29 +673,28 @@ def ListEmbeddedSubsForItemMenu(**kwargs): stream = stream_data["stream"] is_forced = stream_data["is_forced"] - if language: - oc.add(DirectoryObject( - key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), - stream_index=str(stream.index), language=language, with_mods=True, **kwargs), - title=_(u"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s" - u"%(stream_title)s with default mods", - stream_index=stream.index, - language=display_language(language), - unknown_state=_(" (unknown)") if is_unknown else "", - forced_state=_(" (forced)") if is_forced else "", - stream_title=" (\"%s\")" % stream.title if stream.title else ""), - )) - oc.add(DirectoryObject( - key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), - stream_index=str(stream.index), language=language, **kwargs), - title=_(u"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s" - u"%(stream_title)s", - stream_index=stream.index, - language=display_language(language), - unknown_state=_(" (unknown)") if is_unknown else "", - forced_state=_(" (forced)") if is_forced else "", - stream_title=" (\"%s\")" % stream.title if stream.title else ""), - )) + oc.add(DirectoryObject( + key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), + stream_index=str(stream.index), language=language, with_mods=True, **kwargs), + title=_(u"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s" + u"%(stream_title)s with default mods", + stream_index=stream.index, + language=display_language(language), + unknown_state=_(" (unknown)") if is_unknown else "", + forced_state=_(" (forced)") if is_forced else "", + stream_title=" (\"%s\")" % stream.title if stream.title else ""), + )) + oc.add(DirectoryObject( + key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), + stream_index=str(stream.index), language=language, **kwargs), + title=_(u"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s" + u"%(stream_title)s", + stream_index=stream.index, + language=display_language(language), + unknown_state=_(" (unknown)") if is_unknown else "", + forced_state=_(" (forced)") if is_forced else "", + stream_title=" (\"%s\")" % stream.title if stream.title else ""), + )) return oc diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 597dcd7da..64a6d8fe8 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -437,6 +437,8 @@ def get_language(lang_short): def display_language(l): + if not l: + return "Unknown" return _(str(l.basename).lower()) + ((u" (%s)" % _("forced")) if l.forced else "") diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index bb0871dd1..bd5f64c3c 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -228,14 +228,14 @@ def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_ if not language: # only consider first unknown subtitle stream - if requested_language and config.treat_und_as_first: + if config.treat_und_as_first: if has_unknown and skip_duplicate_unknown: Log.Debug("skipping duplicate unknown") continue language = Language.rebuild(list(config.lang_list)[0], forced=is_forced) else: - language = Language("unk") + language = None is_unknown = True has_unknown = True stream_data = {"stream": stream, "is_unknown": is_unknown, "language": language, From 6d6f6d9356f723576bee9742bb6a36348f3a8ffe Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 19 Oct 2019 06:54:38 +0200 Subject: [PATCH 592/710] forgot to fix #681 --- .../Libraries/Shared/subliminal_patch/core.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 2608b7fe9..0bfb0b622 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -614,9 +614,6 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen if adv_tag: forced = "forced" in adv_tag - # extract the potential language code - language_code = p_root.rsplit(".", 1)[1].replace('_', '-') - # remove possible language code for matching p_root_bare = ENDSWITH_LANGUAGECODE_RE.sub("", p_root) @@ -629,19 +626,21 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen if match_strictness == "strict" or (match_strictness == "loose" and not filename_contains): continue - # default language is undefined - language = Language('und') + language = None - # attempt to parse - if language_code: + # extract the potential language code + try: + language_code = p_root.rsplit(".", 1)[1].replace('_', '-') try: language = Language.fromietf(language_code) language.forced = forced except ValueError: logger.error('Cannot parse language code %r', language_code) - language = None + language_code = None + except IndexError: + language_code = None - elif not language_code and only_one: + if not language and not language_code and only_one: language = Language.rebuild(list(languages)[0], forced=forced) subtitles[p] = language From d2b617bdf4f929816cb2ffb08ff5f95a19e4791e Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 19 Oct 2019 06:55:32 +0200 Subject: [PATCH 593/710] addicted; fix #686 --- .../Shared/subliminal_patch/providers/addic7ed.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 8507052d3..0ca54ec8e 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -103,11 +103,15 @@ def check_verification(cache_region): tries = 0 while tries < 3: r = self.session.get(self.server_url + 'login.php', timeout=10, headers={"Referer": self.server_url}) - if "grecaptcha" in r.content: + if "g-recaptcha" in r.content or "grecaptcha" in r.content: logger.info('Addic7ed: Solving captcha. This might take a couple of minutes, but should only ' 'happen once every so often') - site_key = re.search(r'grecaptcha.execute\(\'(.+?)\',', r.content).group(1) + for g, s in (("g-recaptcha-response", r'g-recaptcha.+?data-sitekey=\"(.+?)\"'), + ("recaptcha_response", r'grecaptcha.execute\(\'(.+?)\',')): + site_key = re.search(s, r.content).group(1) + if site_key: + break if not site_key: logger.error("Addic7ed: Captcha site-key not found!") return @@ -121,7 +125,7 @@ def check_verification(cache_region): if not result: raise Exception("Addic7ed: Couldn't solve captcha!") - data["recaptcha_response"] = result + data[g] = result r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10, headers={"Referer": self.server_url + "login.php"}) From 0c379f8b9f7671a41cfdf6e51bc1522abb419881 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 19 Oct 2019 07:15:07 +0200 Subject: [PATCH 594/710] providers: addic7ed: add timeout on authentication error --- Contents/Code/support/config.py | 2 ++ .../Shared/subliminal_patch/providers/addic7ed.py | 9 ++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index b0779ca66..f6c552c87 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -67,6 +67,7 @@ def int_or_default(s, default): DownloadLimitExceeded: (datetime.timedelta(hours=3), "3 hours"), ServiceUnavailable: (datetime.timedelta(minutes=20), "20 minutes"), APIThrottled: (datetime.timedelta(minutes=10), "10 minutes"), + AuthenticationError: (datetime.timedelta(hours=2), "2 hours"), }, "opensubtitles": { TooManyRequests: (datetime.timedelta(hours=3), "3 hours"), @@ -76,6 +77,7 @@ def int_or_default(s, default): "addic7ed": { DownloadLimitExceeded: (datetime.timedelta(hours=3), "3 hours"), TooManyRequests: (datetime.timedelta(minutes=5), "5 minutes"), + AuthenticationError: (datetime.timedelta(hours=24), "24 hours"), } } diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 0ca54ec8e..c5d3ccde5 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -133,12 +133,11 @@ def check_verification(cache_region): if "relax, slow down" in r.content: raise TooManyRequests(self.username) - if r.status_code != 302: - if "User <b></b> doesn't exist" in r.content and tries <= 2: - logger.info("Addic7ed: Error, trying again. (%s/%s)", tries+1, 3) - tries += 1 - continue + if "Try again" in r.content or "Wrong password" in r.content: + raise AuthenticationError(self.username) + if r.status_code != 302: + logger.error("Addic7ed: Something went wrong when logging in") raise AuthenticationError(self.username) break From 9127c382971f2e18953c5d039aae768c25dd9f8c Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 19 Oct 2019 07:15:45 +0200 Subject: [PATCH 595/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index f02d664b4..ee35bfd0c 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3152</string> + <string>2.6.5.3161</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3152 DEV +Version 2.6.5.3161 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 2f219a1a81fb38ca7ebe6b73c8fc3aa46ef215cb Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 19 Oct 2019 15:35:19 +0200 Subject: [PATCH 596/710] providers: addic7ed: fix show match --- Contents/Libraries/Shared/subliminal/providers/addic7ed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal/providers/addic7ed.py index 2926081e0..9583d2e84 100644 --- a/Contents/Libraries/Shared/subliminal/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal/providers/addic7ed.py @@ -20,7 +20,7 @@ language_converters.register('addic7ed = subliminal.converters.addic7ed:Addic7edConverter') # Series cell matching regex -show_cells_re = re.compile(b'<td class="version">.*?</td>', re.DOTALL) +show_cells_re = re.compile(b'<td class="(?:version|vr)">.*?</td>', re.DOTALL) #: Series header parsing regex series_year_re = re.compile(r'^(?P<series>[ \w\'.:(),*&!?-]+?)(?: \((?P<year>\d{4})\))?$') From 7583edf3fed058dfbbd20a84bbd0b426d42d0629 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 19 Oct 2019 15:36:46 +0200 Subject: [PATCH 597/710] providers: addic7ed: move re to correct place; fix show match; #686 --- Contents/Libraries/Shared/subliminal/providers/addic7ed.py | 2 +- .../Libraries/Shared/subliminal_patch/providers/addic7ed.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal/providers/addic7ed.py index 9583d2e84..2926081e0 100644 --- a/Contents/Libraries/Shared/subliminal/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal/providers/addic7ed.py @@ -20,7 +20,7 @@ language_converters.register('addic7ed = subliminal.converters.addic7ed:Addic7edConverter') # Series cell matching regex -show_cells_re = re.compile(b'<td class="(?:version|vr)">.*?</td>', re.DOTALL) +show_cells_re = re.compile(b'<td class="version">.*?</td>', re.DOTALL) #: Series header parsing regex series_year_re = re.compile(r'^(?P<series>[ \w\'.:(),*&!?-]+?)(?: \((?P<year>\d{4})\))?$') diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index c5d3ccde5..1e04821b0 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -10,7 +10,7 @@ from subliminal.cache import region from subliminal.exceptions import DownloadLimitExceeded, AuthenticationError from subliminal.providers.addic7ed import Addic7edProvider as _Addic7edProvider, \ - Addic7edSubtitle as _Addic7edSubtitle, ParserBeautifulSoup, show_cells_re + Addic7edSubtitle as _Addic7edSubtitle, ParserBeautifulSoup from subliminal.subtitle import fix_line_ending from subliminal_patch.utils import sanitize from subliminal_patch.exceptions import TooManyRequests @@ -19,6 +19,8 @@ logger = logging.getLogger(__name__) +show_cells_re = re.compile(b'<td class="(?:version|vr)">.*?</td>', re.DOTALL) + #: Series header parsing regex series_year_re = re.compile(r'^(?P<series>[ \w\'.:(),*&!?-]+?)(?: \((?P<year>\d{4})\))?$') From 5b8cd215e40501b5a50c27db1b095646cb822c67 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 19 Oct 2019 23:02:57 +0200 Subject: [PATCH 598/710] core: backport removal of existing subtitle file from bazarr, to support MergerFS --- Contents/Libraries/Shared/subliminal_patch/core.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 0bfb0b622..f423152bf 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -868,6 +868,9 @@ def save_subtitles(file_path, subtitles, single=False, directory=None, chmod=Non logger.debug(u"Saving %r to %r", subtitle, subtitle_path) content = subtitle.get_modified_content(format=format, debug=debug_mods) if content: + if os.path.exists(subtitle_path): + os.remove(subtitle_path) + with open(subtitle_path, 'w') as f: f.write(content) subtitle.storage_path = subtitle_path From 1e2a127dac16b94f14548ba01c8618a4f0552712 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 19 Oct 2019 23:13:57 +0200 Subject: [PATCH 599/710] core: bazarr-backport: generic 10 minute throttling if uncaught exception occurs --- Contents/Code/support/config.py | 8 ++++---- Contents/Libraries/Shared/subliminal_patch/core.py | 7 ++----- Contents/Libraries/Shared/subliminal_patch/exceptions.py | 5 +++++ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index f6c552c87..d91629666 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -909,10 +909,10 @@ def provider_throttle(self, name, exception): throttle_data = PROVIDER_THROTTLE_MAP.get(name, PROVIDER_THROTTLE_MAP["default"]).get(cls, None) or \ PROVIDER_THROTTLE_MAP["default"].get(cls, None) - if not throttle_data: - return - - throttle_delta, throttle_description = throttle_data + if throttle_data: + throttle_delta, throttle_description = throttle_data + else: + throttle_delta, throttle_description = datetime.timedelta(minutes=10), "10 minutes" if "provider_throttle" not in Dict: Dict["provider_throttle"] = {} diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index f423152bf..eec96e83c 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -186,12 +186,9 @@ def list_subtitles_provider(self, provider, video, languages): except (requests.Timeout, socket.timeout): logger.error('Provider %r timed out', provider) - except (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable, APIThrottled), e: - self.throttle_callback(provider, e) - return - - except: + except Exception as e: logger.exception('Unexpected error in provider %r: %s', provider, traceback.format_exc()) + self.throttle_callback(provider, e) def list_subtitles(self, video, languages): """List subtitles. diff --git a/Contents/Libraries/Shared/subliminal_patch/exceptions.py b/Contents/Libraries/Shared/subliminal_patch/exceptions.py index e336a10af..9b166a29a 100644 --- a/Contents/Libraries/Shared/subliminal_patch/exceptions.py +++ b/Contents/Libraries/Shared/subliminal_patch/exceptions.py @@ -9,3 +9,8 @@ class TooManyRequests(ProviderError): class APIThrottled(ProviderError): pass + + +class ParseResponseError(ProviderError): + """Exception raised by providers when they are not able to parse the response.""" + pass From 0a7de0e9b663718de26667082564a2ff5d605592 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 19 Oct 2019 23:17:09 +0200 Subject: [PATCH 600/710] core: bazarr-backport: generic 10 minute throttling if uncaught exception occurs; also for downloads --- Contents/Libraries/Shared/subliminal_patch/core.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index eec96e83c..46d701dc8 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -280,14 +280,10 @@ def download_subtitle(self, subtitle): logger.debug("RAR Traceback: %s", traceback.format_exc()) return False - except (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable, APIThrottled), e: - self.throttle_callback(subtitle.provider_name, e) - self.discarded_providers.add(subtitle.provider_name) - return False - - except: + except Exception as e: logger.exception('Unexpected error in provider %r, Traceback: %s', subtitle.provider_name, traceback.format_exc()) + self.throttle_callback(subtitle.provider_name, e) self.discarded_providers.add(subtitle.provider_name) return False From c0cf2fd78e0cf660e025a7663347e79c251f807f Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 19 Oct 2019 23:19:19 +0200 Subject: [PATCH 601/710] providers: argenteam: bazarr-backport: use new url; fixes --- .../Shared/subliminal_patch/providers/argenteam.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/argenteam.py b/Contents/Libraries/Shared/subliminal_patch/providers/argenteam.py index 6b872e920..5fe3d28cc 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/argenteam.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/argenteam.py @@ -136,7 +136,7 @@ class ArgenteamProvider(Provider, ProviderSubtitleArchiveMixin): provider_name = 'argenteam' languages = {Language.fromalpha2(l) for l in ['es']} video_types = (Episode, Movie) - BASE_URL = "http://www.argenteam.net/" + BASE_URL = "https://argenteam.net/" API_URL = BASE_URL + "api/v1/" subtitle_class = ArgenteamSubtitle hearing_impaired_verifiable = False @@ -244,7 +244,9 @@ def query(self, title, video, titles=None): for s in r['subtitles']: movie_kind = "episode" if is_episode else "movie" page_link = self.BASE_URL + movie_kind + "/" + str(aid) - sub = ArgenteamSubtitle(language, page_link, s['uri'], movie_kind, returned_title, + # use https and new domain + download_link = s['uri'].replace('http://www.argenteam.net/', self.BASE_URL) + sub = ArgenteamSubtitle(language, page_link, download_link, movie_kind, returned_title, season, episode, year, r.get('team'), r.get('tags'), r.get('source'), r.get('codec'), content.get("tvdb"), imdb_id, asked_for_release_group=video.release_group, From 8bcfc712fbdf89c20ec640a54a42e242f97b13de Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 19 Oct 2019 23:21:03 +0200 Subject: [PATCH 602/710] updated dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index ee35bfd0c..bdc11156e 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3161</string> + <string>2.6.5.3168</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3161 DEV +Version 2.6.5.3168 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From d517e86333236315f37976042a505157f4ef4b7e Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 20 Oct 2019 03:45:16 +0200 Subject: [PATCH 603/710] core: don't fall back to default providers if none enabled --- Contents/Libraries/Shared/subliminal_patch/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 46d701dc8..5057eb9b1 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -62,7 +62,7 @@ class SZProviderPool(ProviderPool): def __init__(self, providers=None, provider_configs=None, blacklist=None, throttle_callback=None, pre_download_hook=None, post_download_hook=None, language_hook=None): #: Name of providers to use - self.providers = providers or provider_registry.names() + self.providers = providers #: Provider configuration self.provider_configs = provider_configs or {} From 997d4aa1cffea112334621bfbc489fd6d5d65a1b Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 20 Oct 2019 03:59:39 +0200 Subject: [PATCH 604/710] core: don't process any further if stream info is missing --- Contents/Code/support/plex_media.py | 43 ++++++++++++++++++----------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index bd5f64c3c..960124d3a 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -27,6 +27,9 @@ def get_metadata_dict(item, part, add): def get_plexapi_stream_info(plex_item, part_id=None): + if not plex_item: + return + d = {"stream": {}} data = d["stream"] @@ -101,6 +104,9 @@ def media_to_videos(media, kind="series"): plex_episode = get_item(ep.id) stream_info = get_plexapi_stream_info(plex_episode) + if not stream_info: + continue + for item in media.seasons[season].episodes[episode].items: for part in item.parts: videos.append( @@ -122,22 +128,24 @@ def media_to_videos(media, kind="series"): ) else: stream_info = get_plexapi_stream_info(plex_item) - imdb_id = None - if imdb_guid_identifier in media.guid: - imdb_id = media.guid[len(imdb_guid_identifier):].split("?")[0] - for item in media.items: - for part in item.parts: - videos.append( - get_metadata_dict(plex_item, part, dict(stream_info, **{"plex_part": part, "type": "movie", - "title": media.title, "id": media.id, - "super_thumb": plex_item.thumb, - "series_id": None, "year": year, - "season_id": None, "imdb_id": imdb_id, - "original_title": original_title, - "series_tvdb_id": None, "tvdb_id": None, - "section": plex_item.section.title}) - ) - ) + + if stream_info: + imdb_id = None + if imdb_guid_identifier in media.guid: + imdb_id = media.guid[len(imdb_guid_identifier):].split("?")[0] + for item in media.items: + for part in item.parts: + videos.append( + get_metadata_dict(plex_item, part, dict(stream_info, **{"plex_part": part, "type": "movie", + "title": media.title, "id": media.id, + "super_thumb": plex_item.thumb, + "series_id": None, "year": year, + "season_id": None, "imdb_id": imdb_id, + "original_title": original_title, + "series_tvdb_id": None, "tvdb_id": None, + "section": plex_item.section.title}) + ) + ) return videos @@ -293,6 +301,9 @@ def get_plex_metadata(rating_key, part_id, item_type, plex_item=None): stream_info = get_plexapi_stream_info(plex_item, part_id) + if not stream_info: + return + # get normalized metadata # fixme: duplicated logic of media_to_videos if item_type == "episode": From 1841a72ca72d50a3005e167f3bd3e1a2a6c133e9 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 20 Oct 2019 04:00:23 +0200 Subject: [PATCH 605/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index bdc11156e..9bfe7164b 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3168</string> + <string>2.6.5.3171</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3168 DEV +Version 2.6.5.3171 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From bb64e482df1ef75cd243acbcf493b4c708dc6b15 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 20 Oct 2019 05:04:02 +0200 Subject: [PATCH 606/710] providers: addic7ed: fix getting show list (failing on foreign characters) providers: addic7ed: don't run anything if no credentials given providers: addic7ed: actually try three times to log in --- .../subliminal_patch/providers/addic7ed.py | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 1e04821b0..bba61d7ed 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -8,7 +8,7 @@ from random import randint from requests import Session from subliminal.cache import region -from subliminal.exceptions import DownloadLimitExceeded, AuthenticationError +from subliminal.exceptions import DownloadLimitExceeded, AuthenticationError, ConfigurationError from subliminal.providers.addic7ed import Addic7edProvider as _Addic7edProvider, \ Addic7edSubtitle as _Addic7edSubtitle, ParserBeautifulSoup from subliminal.subtitle import fix_line_ending @@ -73,6 +73,9 @@ def __init__(self, username=None, password=None, use_random_agents=False): super(Addic7edProvider, self).__init__(username=username, password=password) self.USE_ADDICTED_RANDOM_AGENTS = use_random_agents + if not all((username, password)): + raise ConfigurationError('Username and password must be specified') + def initialize(self): self.session = Session() self.session.headers['User-Agent'] = 'Subliminal/%s' % subliminal.__short_version__ @@ -103,7 +106,8 @@ def check_verification(cache_region): 'remember': 'true'} tries = 0 - while tries < 3: + while tries <= 3: + tries += 1 r = self.session.get(self.server_url + 'login.php', timeout=10, headers={"Referer": self.server_url}) if "g-recaptcha" in r.content or "grecaptcha" in r.content: logger.info('Addic7ed: Solving captcha. This might take a couple of minutes, but should only ' @@ -125,7 +129,10 @@ def check_verification(cache_region): result = pitcher.throw() if not result: - raise Exception("Addic7ed: Couldn't solve captcha!") + if tries >= 3: + raise Exception("Addic7ed: Couldn't solve captcha!") + logger.info("Addic7ed: Couldn't solve captcha! Retrying") + continue data[g] = result @@ -139,8 +146,11 @@ def check_verification(cache_region): raise AuthenticationError(self.username) if r.status_code != 302: - logger.error("Addic7ed: Something went wrong when logging in") - raise AuthenticationError(self.username) + if tries >= 3: + logger.error("Addic7ed: Something went wrong when logging in") + raise AuthenticationError(self.username) + logger.info("Addic7ed: Something went wrong when logging in; retrying") + continue break store_verification("addic7ed", self.session) @@ -210,14 +220,15 @@ def _get_show_ids(self): # Assuming the site's markup is bad, and stripping it down to only contain what's needed. show_cells = re.findall(show_cells_re, r.content) if show_cells: - soup = ParserBeautifulSoup(b''.join(show_cells), ['lxml', 'html.parser']) + soup = ParserBeautifulSoup(b''.join(show_cells).decode('utf-8', 'ignore'), ['lxml', 'html.parser']) else: # If RegEx fails, fall back to original r.content and use 'html.parser' soup = ParserBeautifulSoup(r.content, ['html.parser']) # populate the show ids show_ids = {} - for show in soup.select('td > h3 > a[href^="/show/"]'): + shows = soup.select('td > h3 > a[href^="/show/"]') + for show in shows: show_clean = sanitize(show.text, default_characters=self.sanitize_characters) try: show_id = int(show['href'][6:]) From 1aebe8d0dd1054d321ad9b56861a4198adfd950a Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 20 Oct 2019 05:19:05 +0200 Subject: [PATCH 607/710] providers: addic7ed: fix getting show ids (failing on foreign characters) providers: addic7ed: don't run anything if no credentials given providers: addic7ed: actually try three times to log in providers: addic7ed: store last show ids fetch; when show id not found, re-try once per day --- .../subliminal_patch/providers/addic7ed.py | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index bba61d7ed..62518ba58 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -6,6 +6,8 @@ import time from random import randint + +from dogpile.cache.api import NO_VALUE from requests import Session from subliminal.cache import region from subliminal.exceptions import DownloadLimitExceeded, AuthenticationError, ConfigurationError @@ -68,6 +70,7 @@ class Addic7edProvider(_Addic7edProvider): server_url = 'https://www.addic7ed.com/' sanitize_characters = {'-', ':', '(', ')', '.', '/'} + last_show_ids_fetch_key = "addic7ed_last_id_fetch" def __init__(self, username=None, password=None, use_random_agents=False): super(Addic7edProvider, self).__init__(username=username, password=password) @@ -161,7 +164,7 @@ def check_verification(cache_region): def terminate(self): self.session.close() - def get_show_id(self, series, year=None, country_code=None): + def get_show_id(self, series, year=None, country_code=None, ignore_cache=False): """Get the best matching show id for `series`, `year` and `country_code`. First search in the result of :meth:`_get_show_ids` and fallback on a search with :meth:`_search_show_id`. @@ -176,7 +179,10 @@ def get_show_id(self, series, year=None, country_code=None): """ series_sanitized = sanitize(series).lower() - show_ids = self._get_show_ids() + if not ignore_cache: + show_ids = self._get_show_ids() + else: + show_ids = self._get_show_ids.original(self) show_id = None # attempt with country @@ -194,6 +200,15 @@ def get_show_id(self, series, year=None, country_code=None): logger.debug('Getting show id') show_id = show_ids.get(series_sanitized) + if not show_id: + now = datetime.datetime.now() + last_fetch = region.get(self.last_show_ids_fetch_key) + + # re-fetch show ids once per day if any show ID not found + if not ignore_cache and last_fetch != NO_VALUE and last_fetch + datetime.timedelta(days=1) < now: + logger.info("Show id not found; re-fetching show ids") + return self.get_show_id(series, year=year, country_code=country_code, ignore_cache=True) + # search as last resort # broken right now # if not show_id: @@ -212,6 +227,8 @@ def _get_show_ids(self): """ # get the show page logger.info('Getting show ids') + region.set(self.last_show_ids_fetch_key, datetime.datetime.now()) + r = self.session.get(self.server_url + 'shows.php', timeout=10) r.raise_for_status() From 83eecf09ed3574cd902049ee7326c2e2a30ff809 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 20 Oct 2019 05:20:13 +0200 Subject: [PATCH 608/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 9bfe7164b..77d4197dd 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3171</string> + <string>2.6.5.3174</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3171 DEV +Version 2.6.5.3174 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 9e9dfb3f4d3226e4735f2af01a4bfa02bb221072 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 20 Oct 2019 05:50:33 +0200 Subject: [PATCH 609/710] providers: addic7ed: fix Mayans M.C.; add logging; fix AuthenticationError --- .../subliminal_patch/providers/addic7ed.py | 74 ++++++++++--------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 62518ba58..86e1a810a 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -145,7 +145,7 @@ def check_verification(cache_region): if "relax, slow down" in r.content: raise TooManyRequests(self.username) - if "Try again" in r.content or "Wrong password" in r.content: + if "Wrong password" in r.content or "doesn't exist" in r.content: raise AuthenticationError(self.username) if r.status_code != 302: @@ -176,44 +176,46 @@ def get_show_id(self, series, year=None, country_code=None, ignore_cache=False): :type country_code: str :return: the show id, if found. :rtype: int - """ - series_sanitized = sanitize(series).lower() - if not ignore_cache: - show_ids = self._get_show_ids() - else: - show_ids = self._get_show_ids.original(self) show_id = None - - # attempt with country - if not show_id and country_code: - logger.debug('Getting show id with country') - show_id = show_ids.get('%s %s' % (series_sanitized, country_code.lower())) - - # attempt with year - if not show_id and year: - logger.debug('Getting show id with year') - show_id = show_ids.get('%s %d' % (series_sanitized, year)) - - # attempt clean - if not show_id: - logger.debug('Getting show id') - show_id = show_ids.get(series_sanitized) - + show_ids = {sanitize(series).lower(), sanitize(series.replace(".", "")).lower()} + logger.debug("Trying show ids: %s", show_ids) + for series_sanitized in show_ids: + if not ignore_cache: + show_ids = self._get_show_ids() + else: + show_ids = self._get_show_ids.refresh(self) + + # attempt with country + if not show_id and country_code: + logger.debug('Getting show id with country') + show_id = show_ids.get('%s %s' % (series_sanitized, country_code.lower())) + + # attempt with year + if not show_id and year: + logger.debug('Getting show id with year') + show_id = show_ids.get('%s %d' % (series_sanitized, year)) + + # attempt clean if not show_id: - now = datetime.datetime.now() - last_fetch = region.get(self.last_show_ids_fetch_key) - - # re-fetch show ids once per day if any show ID not found - if not ignore_cache and last_fetch != NO_VALUE and last_fetch + datetime.timedelta(days=1) < now: - logger.info("Show id not found; re-fetching show ids") - return self.get_show_id(series, year=year, country_code=country_code, ignore_cache=True) - - # search as last resort - # broken right now - # if not show_id: - # logger.warning('Series %s not found in show ids', series) - # show_id = self._search_show_id(series) + logger.debug('Getting show id') + show_id = show_ids.get(series_sanitized) + + if not show_id: + now = datetime.datetime.now() + last_fetch = region.get(self.last_show_ids_fetch_key) + + # re-fetch show ids once per day if any show ID not found + if not ignore_cache and last_fetch != NO_VALUE and last_fetch + datetime.timedelta(days=1) < now: + logger.info("Show id not found; re-fetching show ids") + return self.get_show_id(series, year=year, country_code=country_code, ignore_cache=True) + logger.debug("Not refreshing show ids, as the last fetch has been too recent") + + # search as last resort + # broken right now + # if not show_id: + # logger.warning('Series %s not found in show ids', series) + # show_id = self._search_show_id(series) return show_id From f208a24213f312d85dba90d3ef9b0b630f527e79 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 20 Oct 2019 16:53:13 +0200 Subject: [PATCH 610/710] providers: addic7ed: fix bungled show_ids reference; #686 --- .../Shared/subliminal_patch/providers/addic7ed.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 86e1a810a..29995d1c1 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -178,14 +178,14 @@ def get_show_id(self, series, year=None, country_code=None, ignore_cache=False): :rtype: int """ show_id = None - show_ids = {sanitize(series).lower(), sanitize(series.replace(".", "")).lower()} - logger.debug("Trying show ids: %s", show_ids) - for series_sanitized in show_ids: - if not ignore_cache: - show_ids = self._get_show_ids() - else: - show_ids = self._get_show_ids.refresh(self) + ids_to_look_for = {sanitize(series).lower(), sanitize(series.replace(".", "")).lower()} + if not ignore_cache: + show_ids = self._get_show_ids() + else: + show_ids = self._get_show_ids.refresh(self) + logger.debug("Trying show ids: %s", ids_to_look_for) + for series_sanitized in ids_to_look_for: # attempt with country if not show_id and country_code: logger.debug('Getting show id with country') From 3fec766890393e0bf3c6541ddfa576ba06d43aa8 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Mon, 21 Oct 2019 16:03:40 +0200 Subject: [PATCH 611/710] core: fix #688 --- Contents/Libraries/Shared/subliminal_patch/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 5057eb9b1..0eff91856 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -627,7 +627,7 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen try: language = Language.fromietf(language_code) language.forced = forced - except ValueError: + except (ValueError, LanguageReverseError): logger.error('Cannot parse language code %r', language_code) language_code = None except IndexError: From c20c32c17dc29a1f49ba2e33aecc6d7b03466753 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Mon, 21 Oct 2019 15:56:01 +0200 Subject: [PATCH 612/710] providers: addic7ed: refresh show IDs if stored ones were empty --- .../Shared/subliminal_patch/providers/addic7ed.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 29995d1c1..5ca4e5015 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -179,9 +179,8 @@ def get_show_id(self, series, year=None, country_code=None, ignore_cache=False): """ show_id = None ids_to_look_for = {sanitize(series).lower(), sanitize(series.replace(".", "")).lower()} - if not ignore_cache: - show_ids = self._get_show_ids() - else: + show_ids = self._get_show_ids() + if ignore_cache or not show_ids: show_ids = self._get_show_ids.refresh(self) logger.debug("Trying show ids: %s", ids_to_look_for) @@ -265,6 +264,9 @@ def _get_show_ids(self): logger.debug('Found %d show ids', len(show_ids)) + if not show_ids: + raise Exception("Addic7ed: No show IDs found!") + return show_ids @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME) From 3445259cdedcd2dfea2195d953a358af504828ae Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Mon, 21 Oct 2019 17:15:02 +0200 Subject: [PATCH 613/710] providers: addic7ed: fix detection of completed subtitle (#686) --- .../Libraries/Shared/subliminal_patch/providers/addic7ed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 5ca4e5015..f24a35634 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -366,7 +366,7 @@ def query(self, show_id, series, season, year=None, country=None): # ignore incomplete subtitles status = cells[5].text - if status != 'Completed': + if "%" in status: logger.debug('Ignoring subtitle with status %s', status) continue From 02e2bcb41760daa4addd23029d4978ea761bd97c Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Mon, 21 Oct 2019 17:21:01 +0200 Subject: [PATCH 614/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 77d4197dd..a42bbd1e7 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3174</string> + <string>2.6.5.3180</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3174 DEV +Version 2.6.5.3180 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 22ac935f9b1bfaf35f994db323987904f67b0fd9 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 23 Oct 2019 14:12:37 +0200 Subject: [PATCH 615/710] core: scanning: add additional INFO logging for undetected languages --- Contents/Code/support/scanning.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/scanning.py b/Contents/Code/support/scanning.py index d97b08975..702c3cfa0 100644 --- a/Contents/Code/support/scanning.py +++ b/Contents/Code/support/scanning.py @@ -53,11 +53,12 @@ def prepare_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, try: lang = language_from_stream(stream.language_code) except LanguageError: - Log.Debug("Couldn't detect embedded audio stream language: %s", stream.language_code) + Log.Info("Couldn't detect embedded audio stream language: %s", stream.language_code) # treat unknown language as lang1? if not lang and config.treat_und_as_first: lang = Language.rebuild(list(config.lang_list)[0]) + Log.Info("Assuming language %s for audio stream: %s", lang, getattr(stream, "index", None)) audio_languages.append(lang) @@ -74,11 +75,13 @@ def prepare_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, try: lang = language_from_stream(stream.language_code) except LanguageError: - Log.Debug("Couldn't detect embedded subtitle stream language: %s", stream.language_code) + Log.Info("Couldn't detect embedded subtitle stream language: %s", stream.language_code) # treat unknown language as lang1? if not lang and config.treat_und_as_first: lang = Language.rebuild(list(config.lang_list)[0]) + Log.Info("Assuming language %s for subtitle stream: %s", lang, + getattr(stream, "index", None)) if lang: if is_forced: From a564a1d808d9b1fceb8a3430c3656d9da45177ae Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 26 Oct 2019 04:14:38 +0200 Subject: [PATCH 616/710] providers: addic7ed: wait a short while between retries and after successfully logging in --- .../Libraries/Shared/subliminal_patch/providers/addic7ed.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index f24a35634..02010fa13 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -135,10 +135,12 @@ def check_verification(cache_region): if tries >= 3: raise Exception("Addic7ed: Couldn't solve captcha!") logger.info("Addic7ed: Couldn't solve captcha! Retrying") + time.sleep(4) continue data[g] = result + time.sleep(1) r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10, headers={"Referer": self.server_url + "login.php"}) @@ -153,6 +155,7 @@ def check_verification(cache_region): logger.error("Addic7ed: Something went wrong when logging in") raise AuthenticationError(self.username) logger.info("Addic7ed: Something went wrong when logging in; retrying") + time.sleep(4) continue break @@ -161,6 +164,8 @@ def check_verification(cache_region): logger.debug('Addic7ed: Logged in') self.logged_in = True + time.sleep(2) + def terminate(self): self.session.close() From bf1e1c31396020458a7b83e18449790d51dc5f92 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 26 Oct 2019 04:17:25 +0200 Subject: [PATCH 617/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index a42bbd1e7..16664c1a9 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3180</string> + <string>2.6.5.3183</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3180 DEV +Version 2.6.5.3183 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 77861a4c6d2867c8d7110f4b64eb3b49366b14d9 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 26 Oct 2019 04:38:03 +0200 Subject: [PATCH 618/710] release 2.6.5.3152 --- CHANGELOG.md | 14 ++++++++++++++ README.md | 20 +++++++++++++------- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac0b78857..491760d9c 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +2.6.5.3152 + +subscene, addic7ed +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- core: fix core issue possibly impacting results on OpenSubtitles in certain conditions +- core: fix default values of opensubtitles-skip-wrong-fps, use_https; fix #676 +- core: fix for determining whether to search under certain circumstances; fixes #666 +- core: #664 fix missing language processing of multiple videos refreshed at once +- core: #661 fix match strictness when determining preexisting external subtitles +- providers: titlovi: New implementation of Titlovi using API (thanks @viking1304) + + 2.6.5.3124 subscene, addic7ed and titlovi diff --git a/README.md b/README.md index 5118bb6f5..63cf93cd9 100644 --- a/README.md +++ b/README.md @@ -101,13 +101,19 @@ subscene, addic7ed - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog -- core: fix core issue possibly impacting results on OpenSubtitles in certain conditions -- core: fix default values of opensubtitles-skip-wrong-fps, use_https; fix #676 -- core: fix for determining whether to search under certain circumstances; fixes #666 -- core: #664 fix missing language processing of multiple videos refreshed at once -- core: #661 fix match strictness when determining preexisting external subtitles -- providers: titlovi: New implementation of Titlovi using API (thanks @viking1304) - +- core: don't fall back to default providers if none enabled +- core: don't process any further if stream info is missing +- core: support using mediainfo for retrieving MP4 MOV_TEXT subtitle stream titles (PMS bug) +- core: fix embedded subtitle extraction in some cases (#681, #680) +- core: scanning: add additional INFO logging for undetected languages +- core: bazarr-backport: remove existing subtitle file, to support MergerFS +- core: bazarr-backport: generic 10 minute throttling if uncaught exception occurs +- providers: addic7ed: fix recaptcha solving; fix show ID retrieval (#681) +- providers: addic7ed: add timeout on authentication error +- providers: addic7ed: fix shows with dots in them (Mayans M.C.) +- providers: addic7ed: fix detection of completed subtitle for non-english users (#686) +- providers: addic7ed: add more timeouts in the login process +- providers: argenteam: bazarr-backport: use new url; fixes [older changes](CHANGELOG.md) From c6a1df9a79a1c635fe6b5b2fef7ad14ae3327258 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 26 Oct 2019 04:38:34 +0200 Subject: [PATCH 619/710] release 2.6.5.3152 --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 16664c1a9..8f38be86b 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3183 DEV +Version 2.6.5.3183 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 775d1e3cf1ddc178d48a6dd7906f778c6ddb852b Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 26 Oct 2019 04:39:15 +0200 Subject: [PATCH 620/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 8f38be86b..16664c1a9 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3183 +Version 2.6.5.3183 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From fd748b29e90424979c31f5b60d5f1b63b0129dab Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 26 Oct 2019 04:41:26 +0200 Subject: [PATCH 621/710] fix changelog --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 63cf93cd9..bc58d0e1c 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3152 +2.6.5.3183 subscene, addic7ed - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration From 1a999e202fb6fe0784cfd4012302a4d60d719d14 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 26 Oct 2019 04:44:24 +0200 Subject: [PATCH 622/710] release 2.6.5.3183 --- Contents/Info.plist | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 16664c1a9..8f38be86b 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3183 DEV +Version 2.6.5.3183 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 63cf93cd9..bc58d0e1c 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3152 +2.6.5.3183 subscene, addic7ed - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration From e78ace46643fdd6bb5ed5b9a69257cb5f486c206 Mon Sep 17 00:00:00 2001 From: dor <dornizar@gmail.com> Date: Thu, 7 Nov 2019 18:54:52 +0200 Subject: [PATCH 623/710] ScrewZira Hebrew subtitle support www.screwzira.com --- Contents/Code/support/config.py | 3 +- Contents/DefaultPrefs.json | 6 + .../Libraries/Shared/subliminal/extensions.py | 3 +- .../subliminal_patch/providers/screwzira.py | 239 ++++++++++++++++++ 4 files changed, 249 insertions(+), 2 deletions(-) create mode 100644 Contents/Libraries/Shared/subliminal_patch/providers/screwzira.py diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index d91629666..8ce7f7231 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -780,7 +780,8 @@ def providers_by_prefs(self): 'argenteam': cast_bool(Prefs['provider.argenteam.enabled']), 'subscenter': False, 'assrt': cast_bool(Prefs['provider.assrt.enabled']), - } + 'screwzira': cast_bool(Prefs['provider.screwzira.enabled']), + } @property def providers_enabled(self): diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index d2f3aa678..eb16f30f1 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -329,6 +329,12 @@ "type": "bool", "default": "false" }, + { + "id": "provider.screwzira.enabled", + "label": "Provider: Enable ScrewZira (Hebrew)", + "type": "bool", + "default": "true" + }, { "id": "provider.podnapisi.enabled", "label": "Provider: Enable Podnapisi.NET", diff --git a/Contents/Libraries/Shared/subliminal/extensions.py b/Contents/Libraries/Shared/subliminal/extensions.py index 495b68efc..1bef0d1a6 100644 --- a/Contents/Libraries/Shared/subliminal/extensions.py +++ b/Contents/Libraries/Shared/subliminal/extensions.py @@ -94,7 +94,8 @@ def unregister(self, entry_point): 'podnapisi = subliminal.providers.podnapisi:PodnapisiProvider', 'shooter = subliminal.providers.shooter:ShooterProvider', 'thesubdb = subliminal.providers.thesubdb:TheSubDBProvider', - 'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider' + 'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider', + 'screwzira = subliminal.providers.screwzira:ScrewZiraProvider' ]) #: Refiner manager diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/screwzira.py b/Contents/Libraries/Shared/subliminal_patch/providers/screwzira.py new file mode 100644 index 000000000..9b5eec3e9 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/providers/screwzira.py @@ -0,0 +1,239 @@ +# -*- coding: utf-8 -*- +from requests import Session +import json +import logging +from subzero.language import Language +from bs4 import BeautifulSoup +from guessit import guessit + +from subliminal.providers import Episode, Movie, Provider +from subliminal.utils import sanitize +from subliminal.subtitle import Subtitle, fix_line_ending, guess_matches + +__author__ = "Dor Nizar" + +logger = logging.getLogger(__name__) + + +class ScrewZiraSubtitle(Subtitle): + provider_name = 'screwzira' + + def __init__(self, language, title_id, subtitle_id, series, season, episode, release, year): + super(ScrewZiraSubtitle, self).__init__(language, subtitle_id) + self.title_id = title_id + self.subtitle_id = subtitle_id + self.series = series + self.season = season + self.episode = episode + self.release = release + self.year = year + + def get_matches(self, video): + matches = set() + logger.debug("--ScrewZiraSubtitle--\n{}".format(self.__dict__)) + + # episode + if isinstance(video, Episode): + # series + if video.series and sanitize(self.series) == sanitize(video.series): + matches.add('series') + # season + if video.season and self.season == video.season: + matches.add('season') + # episode + if video.episode and self.episode == video.episode: + matches.add('episode') + # guess + matches |= guess_matches(video, guessit(self.release, {'type': 'episode'})) + # movie + elif isinstance(video, Movie): + # title + if video.title and (sanitize(self.series) in ( + sanitize(name) for name in [video.title] + video.alternative_titles)): + matches.add('title') + # year + if video.year and self.year == video.year: + matches.add('year') + # guess + matches |= guess_matches(video, guessit(self.release, {'type': 'movie'})) + + logger.debug("ScrewZira subtitle criteria match:\n{}".format(matches)) + return matches + + @property + def id(self): + return self.subtitle_id + + +class ScrewZiraProvider(Provider): + subtitle_class = ScrewZiraSubtitle + languages = {Language.fromalpha2(l) for l in ['he']} + URL_SERVER = 'https://www.screwzira.com/' + + URI_SEARCH_TITLE = 'Services/ContentProvider.svc/GetSearchForecast' + URI_SEARCH_SERIES_SUBTITLE = 'Services/GetModuleAjax.ashx' + URI_SEARCH_MOVIE_SUBTITLE = "MovieInfo.aspx" + URI_REQ_SUBTITLE_ID = "Services/ContentProvider.svc/RequestSubtitleDownload" + URI_DOWNLOAD_SUBTITLE = "Services/DownloadFile.ashx" + + def initialize(self): + logger.debug("ScrewZira initialize") + self.session = Session() + self.session.headers[ + 'User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; ' \ + 'Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36' + + def terminate(self): + logger.debug("ScrewZira terminate") + self.session.close() + + def __init__(self): + self.session = None + + def _search_series(self, title): + logger.debug("Searching '{}'".format(title)) + title_request = { + "request": { + "SearchString": title, + "SearchType": "Film" + } + } + r = self.session.post(self.URL_SERVER + self.URI_SEARCH_TITLE, json=title_request, allow_redirects=False, + timeout=10) + r.raise_for_status() + series_found = r.json() + if 'd' in series_found: + try: + series_found = json.loads(series_found['d']) + except ValueError: + series_found = None + if 'Items' in series_found: + return series_found['Items'] + return [] + + def _search_subtitles(self, title_id, season=None, episode=None): + if season and episode: + params = { + 'moduleName': 'SubtitlesList', + 'SeriesID': title_id, + 'Season': season, + 'Episode': episode + } + r = self.session.get(url=self.URL_SERVER + self.URI_SEARCH_SERIES_SUBTITLE, params=params) + else: + params = { + 'ID': title_id, + } + r = self.session.get(url=self.URL_SERVER + self.URI_SEARCH_MOVIE_SUBTITLE, params=params) + + r.raise_for_status() + results = r.content + if not results: + return [] + subtitles = BeautifulSoup(results, 'html.parser').select('a.fa') + logger.debug("[BS4] Elements found:\n{}".format(subtitles)) + subtitle_list = [] + for i in subtitles: + subtitle_id = i.attrs['data-subtitle-id'] + release = i.findParent().findParent().text.strip().split('\n')[0] + subtitle_list.append((subtitle_id, release)) + + return subtitle_list # [(Subtitle ID, name), (....)] + + def _req_download_identifier(self, title_id, subtitle_id): + logger.debug("Request subtitle identifier for: title id: {}, subtitle id: {}".format(title_id, subtitle_id)) + data = { + 'request': { + 'FilmID': title_id, + 'SubtitleID': subtitle_id, + 'FontSize': 0, + 'FontColor': "", + 'PredefinedLayout': -1 + } + } + + r = self.session.post(self.URL_SERVER + self.URI_REQ_SUBTITLE_ID, json=data, allow_redirects=False, + timeout=10) + r.raise_for_status() + try: + r = json.loads(r.json()['d']) + except ValueError: + r = {} + + if 'DownloadIdentifier' not in r: + logger.error("Download Identifier not found") + return None + return r['DownloadIdentifier'] + + def _download_subtitles(self, download_id): + logger.debug("Downloading subtitles by download identifier - {}".format(download_id)) + data = {'DownloadIdentifier': download_id} + r = self.session.get(self.URL_SERVER + self.URI_DOWNLOAD_SUBTITLE, params=data, + timeout=10) + r.raise_for_status() + if not r.content: + logger.debug("Download subtitle failed") + return None + + logger.debug("Download subtitle success") + return r.content + + def query(self, title, season=None, episode=None, year=None): + subtitles = [] + titles = self._search_series(title) + if season and episode: + logger.debug("Searching for:\nTitle: {}\nSeason: {}\nEpisode: {}\nYear: {}".format(title, season, + episode, year)) + else: + logger.debug("Searching for:\nTitle: {}\nYear: {}\n".format(title, year)) + for title in titles: + logger.debug("Title Candidate: {}".format(title)) + title_id = title['ID'] + if season and episode: + result = self._search_subtitles(title_id, season, episode) + else: + result = self._search_subtitles(title_id) + + if not result: + continue + + for subtitle_id, release in result: + subtitles.append(self.subtitle_class(next(iter(self.languages)), title_id, subtitle_id, + title['EngName'], season, episode, release, year)) + + if subtitles: + logger.debug("Found Subtitle Candidates: {}".format(subtitles)) + return subtitles + + def list_subtitles(self, video, languages): + season = episode = year = title = None + + if isinstance(video, Episode): + logger.info("list_subtitles Series: {}, season: {}, episode: {}".format(video.series, + video.season, + video.episode)) + title = video.series + season = video.season + episode = video.episode + elif isinstance(video, Movie): + logger.info("list_subtitles Movie: {}, year: {}".format(video.title, video.year)) + title = video.title + year = video.year + + return [s for s in self.query(title, season, episode, year) if s.language in languages] + + def download_subtitle(self, subtitle): + # type: (ScrewZiraSubtitle) -> None + + logger.info('Downloading subtitle from ScrewZira: %r', subtitle) + downloadID = self._req_download_identifier(subtitle.title_id, subtitle.subtitle_id) + if not downloadID: + logger.debug('Unable to retrieve download identifier') + return None + + content = self._download_subtitles(downloadID) + if not content: + logger.debug('Unable to download subtitle') + return None + + subtitle.content = fix_line_ending(content) From 5d5fa21630cb19e628364c992a124aa9ff59e54d Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 9 Nov 2019 02:59:36 +0100 Subject: [PATCH 624/710] refactor all extraction into support.extract; extract also on SearchAllRecentlyAddedMissing --- Contents/Code/__init__.py | 65 +------- Contents/Code/interface/item_details.py | 3 +- Contents/Code/interface/menu.py | 56 +------ Contents/Code/interface/menu_helpers.py | 103 +----------- Contents/Code/support/__init__.py | 12 +- Contents/Code/support/extract.py | 205 ++++++++++++++++++++++++ Contents/Code/support/plex_media.py | 1 + Contents/Code/support/tasks.py | 8 + 8 files changed, 236 insertions(+), 217 deletions(-) create mode 100644 Contents/Code/support/extract.py diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 49567e73b..c98b2441f 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -21,20 +21,21 @@ import interface sys.modules["interface"] = interface -from subzero.constants import OS_PLEX_USERAGENT, PERSONAL_MEDIA_IDENTIFIER +from subzero.constants import OS_PLEX_USERAGENT from interface.menu import * from support.plex_media import media_to_videos, get_media_item_ids +from support.extract import agent_extract_embedded from support.scanning import scan_videos -from support.storage import save_subtitles, store_subtitle_info, get_subtitle_storage +from support.storage import save_subtitles, store_subtitle_info from support.items import is_wanted from support.config import config from support.lib import get_intent -from support.helpers import track_usage, get_title_for_video_metadata, get_identifier, cast_bool, \ - audio_streams_match_languages +from support.helpers import track_usage, get_title_for_video_metadata, get_identifier, cast_bool from support.history import get_history from support.data import dispatch_migrate from support.activities import activity from support.download import download_best_subtitles +from support.localmedia import find_subtitles def Start(): @@ -96,61 +97,7 @@ def Start(): def update_local_media(videos, ignore_parts_cleanup=None): for video in videos: - support.localmedia.find_subtitles(video["plex_part"], ignore_parts_cleanup=ignore_parts_cleanup) - - -def agent_extract_embedded(video_part_map): - try: - subtitle_storage = get_subtitle_storage() - - to_extract = [] - item_count = 0 - - for scanned_video, part_info in video_part_map.iteritems(): - plexapi_item = scanned_video.plexapi_metadata["item"] - stored_subs = subtitle_storage.load_or_new(plexapi_item) - valid_langs_in_media = audio_streams_match_languages(scanned_video, config.get_lang_list(ordered=True)) - - if not config.lang_list.difference(valid_langs_in_media): - Log.Debug("Skipping embedded subtitle extraction for %s, audio streams are in correct language(s)", - plexapi_item.rating_key) - continue - - for plexapi_part in get_all_parts(plexapi_item): - item_count = item_count + 1 - used_one_unknown_stream = False - used_one_known_stream = False - for requested_language in config.lang_list: - skip_unknown = used_one_unknown_stream or used_one_known_stream - embedded_subs = stored_subs.get_by_provider(plexapi_part.id, requested_language, "embedded") - current = stored_subs.get_any(plexapi_part.id, requested_language) or \ - requested_language in scanned_video.external_subtitle_languages - - if not embedded_subs: - stream_data = get_embedded_subtitle_streams(plexapi_part, requested_language=requested_language, - skip_unknown=skip_unknown) - - if stream_data and stream_data[0]["language"]: - stream = stream_data[0]["stream"] - if stream_data[0]["is_unknown"]: - used_one_unknown_stream = True - else: - used_one_known_stream = True - - to_extract.append(({scanned_video: part_info}, plexapi_part, str(stream.index), - str(requested_language), not current)) - - if not cast_bool(Prefs["subtitles.search_after_autoextract"]): - scanned_video.subtitle_languages.update({requested_language}) - else: - Log.Debug("Skipping embedded subtitle extraction for %s, already got %r from %s", - plexapi_item.rating_key, requested_language, embedded_subs[0].id) - if to_extract: - Log.Info("Triggering extraction of %d embedded subtitles of %d items", len(to_extract), item_count) - Thread.Create(multi_extract_embedded, stream_list=to_extract, refresh=True, with_mods=True, - single_thread=not config.advanced.auto_extract_multithread) - except: - Log.Error("Something went wrong when auto-extracting subtitles, continuing: %s", traceback.format_exc()) + find_subtitles(video["plex_part"], ignore_parts_cleanup=ignore_parts_cleanup) class SubZeroAgent(object): diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index d92d91d80..546ae9632 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -7,7 +7,8 @@ from sub_mod import SubtitleModificationsMenu from menu_helpers import debounce, SubFolderObjectContainer, default_thumb, add_incl_excl_options, get_item_task_data, \ - set_refresh_menu_state, route, extract_embedded_sub + set_refresh_menu_state, route +from support.extract import extract_embedded_sub from refresh_item import RefreshItem from subzero.constants import PREFIX diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 328e9398e..8cfc82cb9 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -12,19 +12,16 @@ from item_details import ItemDetailsMenu from refresh_item import RefreshItem from menu_helpers import add_incl_excl_options, dig_tree, set_refresh_menu_state, \ - default_thumb, debounce, ObjectContainer, SubFolderObjectContainer, route, \ - extract_embedded_sub + default_thumb, debounce, ObjectContainer, SubFolderObjectContainer, route from main import fatality, InclExclMenu from advanced import DispatchRestart from subzero.constants import ART, PREFIX, DEPENDENCY_MODULE_NAMES -from support.plex_media import get_all_parts, get_embedded_subtitle_streams +from support.extract import season_extract_embedded from support.scheduler import scheduler from support.config import config from support.helpers import timestamp, df, display_language from support.ignore import get_decision_list -from support.items import get_all_items, get_items_info, get_item_kind_from_rating_key, get_item, MI_KEY, \ - get_item_title, get_item_thumb -from support.storage import get_subtitle_storage +from support.items import get_all_items, get_items_info, get_item_kind_from_rating_key, get_item, get_item_title from support.i18n import _ # init GUI @@ -174,53 +171,6 @@ def SeasonExtractEmbedded(**kwargs): return MetadataMenu(randomize=timestamp(), title=item_title, **kwargs) -def multi_extract_embedded(stream_list, refresh=False, with_mods=False, single_thread=True, extract_mode="a", - history_storage=None): - def execute(): - for video_part_map, plexapi_part, stream_index, language, set_current in stream_list: - plexapi_item = video_part_map.keys()[0].plexapi_metadata["item"] - - extract_embedded_sub(rating_key=plexapi_item.rating_key, part_id=plexapi_part.id, - plex_item=plexapi_item, part=plexapi_part, scanned_videos=video_part_map, - stream_index=stream_index, set_current=set_current, - language=language, with_mods=with_mods, refresh=refresh, extract_mode=extract_mode, - history_storage=history_storage) - - if single_thread: - with Thread.Lock(key="extract_embedded"): - execute() - else: - execute() - - -def season_extract_embedded(rating_key, requested_language, with_mods=False, force=False): - # get stored subtitle info for item id - subtitle_storage = get_subtitle_storage() - - try: - for data in get_all_items(key="children", value=rating_key, base="library/metadata"): - item = get_item(data[MI_KEY]) - if item: - stored_subs = subtitle_storage.load_or_new(item) - for part in get_all_parts(item): - embedded_subs = stored_subs.get_by_provider(part.id, requested_language, "embedded") - current = stored_subs.get_any(part.id, requested_language) - if not embedded_subs or force: - stream_data = get_embedded_subtitle_streams(part, requested_language=requested_language) - if stream_data: - stream = stream_data[0]["stream"] - - set_current = not current or force - refresh = not current - - extract_embedded_sub(rating_key=item.rating_key, part_id=part.id, - stream_index=str(stream.index), set_current=set_current, - refresh=refresh, language=requested_language, with_mods=with_mods, - extract_mode="m") - finally: - subtitle_storage.destroy() - - @route(PREFIX + '/ignore_list') def IgnoreListMenu(): ref_list = get_decision_list() diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index 11d3aa8dc..d39dd87b5 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -1,29 +1,16 @@ # coding=utf-8 -import traceback import types import datetime -import subprocess -import os -import operator -from func import enable_channel_wrapper, route_wrapper, register_route_function -from subzero.lib.io import get_viable_encoding -from subzero.language import Language +from func import enable_channel_wrapper, route_wrapper from support.i18n import is_localized_string, _ -from support.items import get_kind, get_item_thumb, get_item, get_item_kind_from_item, refresh_item -from support.helpers import get_video_display_title, pad_title, display_language, quote_args, \ - get_title_for_video_metadata, mswindows -from support.history import get_history +from support.items import get_item_thumb +from support.helpers import get_video_display_title, pad_title from support.ignore import get_decision_list from support.lib import get_intent from support.config import config from subzero.constants import ICON_SUB, ICON -from support.plex_media import get_part, get_plex_metadata, is_stream_forced, update_stream_info from support.scheduler import scheduler -from support.scanning import scan_videos -from support.storage import save_subtitles - -from subliminal_patch.subtitle import ModifiedSubtitle default_thumb = R(ICON_SUB) main_icon = ICON if not config.is_development else "icon-dev.jpg" @@ -156,90 +143,6 @@ def debounce(func): return func -def extract_embedded_sub(**kwargs): - rating_key = kwargs["rating_key"] - part_id = kwargs.pop("part_id") - stream_index = kwargs.pop("stream_index") - with_mods = kwargs.pop("with_mods", False) - language = Language.fromietf(kwargs.pop("language")) - refresh = kwargs.pop("refresh", True) - set_current = kwargs.pop("set_current", True) - - plex_item = kwargs.pop("plex_item", get_item(rating_key)) - item_type = get_item_kind_from_item(plex_item) - part = kwargs.pop("part", get_part(plex_item, part_id)) - scanned_videos = kwargs.pop("scanned_videos", None) - extract_mode = kwargs.pop("extract_mode", "a") - - any_successful = False - - if part: - if not scanned_videos: - metadata = get_plex_metadata(rating_key, part_id, item_type, plex_item=plex_item) - scanned_videos = scan_videos([metadata], ignore_all=True, skip_hashing=True) - - update_stream_info(part) - for stream in part.streams: - # subtitle stream - if str(stream.index) == stream_index: - is_forced = is_stream_forced(stream) - bn = os.path.basename(part.file) - - set_refresh_menu_state(_(u"Extracting subtitle %(stream_index)s of %(filename)s", - stream_index=stream_index, - filename=bn)) - Log.Info(u"Extracting stream %s (%s) of %s", stream_index, str(language), bn) - - out_codec = stream.codec if stream.codec != "mov_text" else "srt" - - args = [ - config.plex_transcoder, "-i", part.file, "-map", "0:%s" % stream_index, "-f", out_codec, "-" - ] - - cmdline = quote_args(args) - Log.Debug(u"Calling: %s", cmdline) - if mswindows: - Log.Debug("MSWindows: Fixing encoding") - cmdline = cmdline.encode("mbcs") - - output = None - try: - output = subprocess.check_output(cmdline, stderr=subprocess.PIPE, shell=True) - except: - Log.Error("Extraction failed: %s", traceback.format_exc()) - - if output: - subtitle = ModifiedSubtitle(language, mods=config.default_mods if with_mods else None) - subtitle.content = output - subtitle.provider_name = "embedded" - subtitle.id = "stream_%s" % stream_index - subtitle.score = 0 - subtitle.set_encoding("utf-8") - - # fixme: speedup video; only video.name is needed - video = scanned_videos.keys()[0] - save_successful = save_subtitles(scanned_videos, {video: [subtitle]}, mode="m", - set_current=set_current) - set_refresh_menu_state(None) - - if save_successful and refresh: - refresh_item(rating_key) - - # add item to history - item_title = get_title_for_video_metadata(video.plexapi_metadata, - add_section_title=False, add_episode_title=True) - - history = get_history() - history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], - thumb=video.plexapi_metadata["super_thumb"], - subtitle=subtitle, mode=extract_mode) - history.destroy() - - any_successful = True - - return any_successful - - class SZObjectContainer(ObjectContainer): def __init__(self, *args, **kwargs): skip_pin_lock = kwargs.pop("skip_pin_lock", False) diff --git a/Contents/Code/support/__init__.py b/Contents/Code/support/__init__.py index 4cb998b12..e3dc2a581 100644 --- a/Contents/Code/support/__init__.py +++ b/Contents/Code/support/__init__.py @@ -19,6 +19,10 @@ helpers._ = i18n._ +import history + +sys.modules["support.history"] = history + import plex_media sys.modules["support.plex_media"] = plex_media @@ -49,6 +53,10 @@ sys.modules["support.missing_subtitles"] = missing_subtitles +import extract + +sys.modules["support.extract"] = extract + import tasks sys.modules["support.tasks"] = tasks @@ -57,10 +65,6 @@ sys.modules["support.ignore"] = ignore -import history - -sys.modules["support.history"] = history - import data sys.modules["support.data"] = data diff --git a/Contents/Code/support/extract.py b/Contents/Code/support/extract.py new file mode 100644 index 000000000..ede60d430 --- /dev/null +++ b/Contents/Code/support/extract.py @@ -0,0 +1,205 @@ +# coding=utf-8 +import os +import subprocess +import traceback + +from support.helpers import quote_args, mswindows, get_title_for_video_metadata, cast_bool, \ + audio_streams_match_languages +from support.i18n import _ +from support.items import get_item_kind_from_item, refresh_item, get_all_items, get_item, MI_KEY +from support.storage import get_subtitle_storage, save_subtitles +from support.config import config +from support.history import get_history +from support.plex_media import get_all_parts, get_embedded_subtitle_streams, get_part, get_plex_metadata, \ + update_stream_info, is_stream_forced +from support.scanning import scan_videos +from subzero.language import Language +from subliminal_patch.subtitle import ModifiedSubtitle + + +def agent_extract_embedded(video_part_map): + try: + subtitle_storage = get_subtitle_storage() + + to_extract = [] + item_count = 0 + + for scanned_video, part_info in video_part_map.iteritems(): + plexapi_item = scanned_video.plexapi_metadata["item"] + stored_subs = subtitle_storage.load_or_new(plexapi_item) + valid_langs_in_media = \ + audio_streams_match_languages(scanned_video, config.get_lang_list(ordered=True)) + + if not config.lang_list.difference(valid_langs_in_media): + Log.Debug("Skipping embedded subtitle extraction for %s, audio streams are in correct language(s)", + plexapi_item.rating_key) + continue + + for plexapi_part in get_all_parts(plexapi_item): + item_count = item_count + 1 + used_one_unknown_stream = False + used_one_known_stream = False + for requested_language in config.lang_list: + skip_unknown = used_one_unknown_stream or used_one_known_stream + embedded_subs = stored_subs.get_by_provider(plexapi_part.id, requested_language, "embedded") + current = stored_subs.get_any(plexapi_part.id, requested_language) or \ + requested_language in scanned_video.external_subtitle_languages + + if not embedded_subs: + stream_data = get_embedded_subtitle_streams(plexapi_part, requested_language=requested_language, + skip_unknown=skip_unknown) + + if stream_data and stream_data[0]["language"]: + stream = stream_data[0]["stream"] + if stream_data[0]["is_unknown"]: + used_one_unknown_stream = True + else: + used_one_known_stream = True + + to_extract.append(({scanned_video: part_info}, plexapi_part, str(stream.index), + str(requested_language), not current)) + + if not cast_bool(Prefs["subtitles.search_after_autoextract"]): + scanned_video.subtitle_languages.update({requested_language}) + else: + Log.Debug("Skipping embedded subtitle extraction for %s, already got %r from %s", + plexapi_item.rating_key, requested_language, embedded_subs[0].id) + if to_extract: + Log.Info("Triggering extraction of %d embedded subtitles of %d items", len(to_extract), item_count) + Thread.Create(multi_extract_embedded, stream_list=to_extract, refresh=True, with_mods=True, + single_thread=not config.advanced.auto_extract_multithread) + except: + Log.Error("Something went wrong when auto-extracting subtitles, continuing: %s", traceback.format_exc()) + + +def multi_extract_embedded(stream_list, refresh=False, with_mods=False, single_thread=True, extract_mode="a", + history_storage=None): + def execute(): + for video_part_map, plexapi_part, stream_index, language, set_current in stream_list: + plexapi_item = video_part_map.keys()[0].plexapi_metadata["item"] + + extract_embedded_sub(rating_key=plexapi_item.rating_key, part_id=plexapi_part.id, + plex_item=plexapi_item, part=plexapi_part, scanned_videos=video_part_map, + stream_index=stream_index, set_current=set_current, + language=language, with_mods=with_mods, refresh=refresh, extract_mode=extract_mode, + history_storage=history_storage) + + if single_thread: + with Thread.Lock(key="extract_embedded"): + execute() + else: + execute() + + +def season_extract_embedded(rating_key, requested_language, with_mods=False, force=False): + # get stored subtitle info for item id + subtitle_storage = get_subtitle_storage() + + try: + for data in get_all_items(key="children", value=rating_key, base="library/metadata"): + item = get_item(data[MI_KEY]) + if item: + stored_subs = subtitle_storage.load_or_new(item) + for part in get_all_parts(item): + embedded_subs = stored_subs.get_by_provider(part.id, requested_language, "embedded") + current = stored_subs.get_any(part.id, requested_language) + if not embedded_subs or force: + stream_data = get_embedded_subtitle_streams(part, requested_language=requested_language) + if stream_data: + stream = stream_data[0]["stream"] + + set_current = not current or force + refresh = not current + + extract_embedded_sub(rating_key=item.rating_key, part_id=part.id, + stream_index=str(stream.index), set_current=set_current, + refresh=refresh, language=requested_language, with_mods=with_mods, + extract_mode="m") + finally: + subtitle_storage.destroy() + + +def extract_embedded_sub(**kwargs): + rating_key = kwargs["rating_key"] + part_id = kwargs.pop("part_id") + stream_index = kwargs.pop("stream_index") + with_mods = kwargs.pop("with_mods", False) + language = Language.fromietf(kwargs.pop("language")) + refresh = kwargs.pop("refresh", True) + set_current = kwargs.pop("set_current", True) + + plex_item = kwargs.pop("plex_item", get_item(rating_key)) + item_type = get_item_kind_from_item(plex_item) + part = kwargs.pop("part", get_part(plex_item, part_id)) + scanned_videos = kwargs.pop("scanned_videos", None) + extract_mode = kwargs.pop("extract_mode", "a") + + any_successful = False + + from interface.menu_helpers import set_refresh_menu_state + + if part: + if not scanned_videos: + metadata = get_plex_metadata(rating_key, part_id, item_type, plex_item=plex_item) + scanned_videos = scan_videos([metadata], ignore_all=True, skip_hashing=True) + + update_stream_info(part) + for stream in part.streams: + # subtitle stream + if str(stream.index) == stream_index: + is_forced = is_stream_forced(stream) + bn = os.path.basename(part.file) + + set_refresh_menu_state(_(u"Extracting subtitle %(stream_index)s of %(filename)s", + stream_index=stream_index, + filename=bn)) + Log.Info(u"Extracting stream %s (%s) of %s", stream_index, str(language), bn) + + out_codec = stream.codec if stream.codec != "mov_text" else "srt" + + args = [ + config.plex_transcoder, "-i", part.file, "-map", "0:%s" % stream_index, "-f", out_codec, "-" + ] + + cmdline = quote_args(args) + Log.Debug(u"Calling: %s", cmdline) + if mswindows: + Log.Debug("MSWindows: Fixing encoding") + cmdline = cmdline.encode("mbcs") + + output = None + try: + output = subprocess.check_output(cmdline, stderr=subprocess.PIPE, shell=True) + except: + Log.Error("Extraction failed: %s", traceback.format_exc()) + + if output: + subtitle = ModifiedSubtitle(language, mods=config.default_mods if with_mods else None) + subtitle.content = output + subtitle.provider_name = "embedded" + subtitle.id = "stream_%s" % stream_index + subtitle.score = 0 + subtitle.set_encoding("utf-8") + + # fixme: speedup video; only video.name is needed + video = scanned_videos.keys()[0] + save_successful = save_subtitles(scanned_videos, {video: [subtitle]}, mode="m", + set_current=set_current) + set_refresh_menu_state(None) + + if save_successful and refresh: + refresh_item(rating_key) + + # add item to history + item_title = get_title_for_video_metadata(video.plexapi_metadata, + add_section_title=False, add_episode_title=True) + + history = get_history() + history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], + thumb=video.plexapi_metadata["super_thumb"], + subtitle=subtitle, mode=extract_mode) + history.destroy() + + any_successful = True + + return any_successful \ No newline at end of file diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index 960124d3a..437c3b591 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -425,3 +425,4 @@ def get_all_parts(self): m = m.children[0] return parts + diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index 0c6d12e40..39834fd13 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -19,6 +19,7 @@ from support.items import get_recent_items, get_item, is_wanted, get_item_title from support.helpers import track_usage, get_title_for_video_metadata, cast_bool, PartUnknownException from support.plex_media import get_plex_metadata +from support.extract import agent_extract_embedded from support.scanning import scan_videos from support.i18n import _ from download import download_best_subtitles, pre_download_hook, post_download_hook, language_hook @@ -449,6 +450,13 @@ def skip_item(): Log.Debug(u"%s: Looking for missing subtitles: %s", self.name, get_item_title(plex_item)) scanned_parts = scan_videos([metadata], providers=providers) + # auto extract embedded + if config.embedded_auto_extract: + if config.plex_transcoder: + agent_extract_embedded(scanned_parts) + else: + Log.Warn("Plex Transcoder not found, can't auto extract") + downloaded_subtitles = download_best_subtitles(scanned_parts, min_score=min_score, providers=providers) hit_providers = downloaded_subtitles is not None From 1a638431d7d19ff55ba5468e6fb353f52b6e67ea Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 9 Nov 2019 03:19:01 +0100 Subject: [PATCH 625/710] core: when extracting embedded subtitles from task, execute threads synchronously --- Contents/Code/support/extract.py | 11 +++++++---- Contents/Code/support/tasks.py | 6 +++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Contents/Code/support/extract.py b/Contents/Code/support/extract.py index ede60d430..709bbb7d8 100644 --- a/Contents/Code/support/extract.py +++ b/Contents/Code/support/extract.py @@ -17,13 +17,15 @@ from subliminal_patch.subtitle import ModifiedSubtitle -def agent_extract_embedded(video_part_map): +def agent_extract_embedded(video_part_map, set_as_existing=False): try: subtitle_storage = get_subtitle_storage() to_extract = [] item_count = 0 + threads = [] + for scanned_video, part_info in video_part_map.iteritems(): plexapi_item = scanned_video.plexapi_metadata["item"] stored_subs = subtitle_storage.load_or_new(plexapi_item) @@ -59,15 +61,16 @@ def agent_extract_embedded(video_part_map): to_extract.append(({scanned_video: part_info}, plexapi_part, str(stream.index), str(requested_language), not current)) - if not cast_bool(Prefs["subtitles.search_after_autoextract"]): + if not cast_bool(Prefs["subtitles.search_after_autoextract"]) or set_as_existing: scanned_video.subtitle_languages.update({requested_language}) else: Log.Debug("Skipping embedded subtitle extraction for %s, already got %r from %s", plexapi_item.rating_key, requested_language, embedded_subs[0].id) if to_extract: Log.Info("Triggering extraction of %d embedded subtitles of %d items", len(to_extract), item_count) - Thread.Create(multi_extract_embedded, stream_list=to_extract, refresh=True, with_mods=True, - single_thread=not config.advanced.auto_extract_multithread) + threads.append(Thread.Create(multi_extract_embedded, stream_list=to_extract, refresh=True, with_mods=True, + single_thread=not config.advanced.auto_extract_multithread)) + return threads except: Log.Error("Something went wrong when auto-extracting subtitles, continuing: %s", traceback.format_exc()) diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index 39834fd13..55915419c 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -453,7 +453,11 @@ def skip_item(): # auto extract embedded if config.embedded_auto_extract: if config.plex_transcoder: - agent_extract_embedded(scanned_parts) + ts = agent_extract_embedded(scanned_parts, set_as_existing=True) + if ts: + Log.Debug("Waiting for %i extraction threads to finish" % len(ts)) + for t in ts: + t.join() else: Log.Warn("Plex Transcoder not found, can't auto extract") From c4c26a76f13eb35b7642abcc3b7a00dbdbe5deb4 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 9 Nov 2019 03:57:38 +0100 Subject: [PATCH 626/710] core: clarify Detecting Streams --- Contents/Code/support/scanning.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/support/scanning.py b/Contents/Code/support/scanning.py index 702c3cfa0..f93dce055 100644 --- a/Contents/Code/support/scanning.py +++ b/Contents/Code/support/scanning.py @@ -29,7 +29,7 @@ def prepare_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, if ignore_all: Log.Debug("Force refresh intended.") - Log.Debug("Detecting streams: %s, external_subtitles=%s, embedded_subtitles=%s" % ( + Log.Debug("Detecting streams: %s, account_for_external_subtitles=%s, account_for_embedded_subtitles=%s" % ( plex_part.file, external_subtitles, embedded_subtitles)) known_embedded = [] From 0cca4a2ebe40e8e119cdc0c50b8ffda948f9b178 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 9 Nov 2019 04:28:14 +0100 Subject: [PATCH 627/710] core: UnRAR: set binary to executable, even if not checked out from git; might fix #693 --- Contents/Code/support/config.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index d91629666..80ccb96d6 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -8,6 +8,8 @@ import rarfile import jstyleson import datetime +import stat +import traceback import subliminal import subliminal_patch @@ -329,6 +331,19 @@ def init_libraries(self): for exe in try_executables: rarfile.UNRAR_TOOL = exe rarfile.ORIG_UNRAR_TOOL = exe + if os.path.isfile(exe) and not os.access(exe, os.X_OK): + st = os.stat(exe) + try: + Log.Debug("setting generic executable permissions for %s", exe) + # fixme: too broad? + os.chmod(exe, st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) + except: + Log.Debug("failed setting generic executable permissions for %s: %s", exe, traceback.format_exc()) + try: + Log.Debug("setting executable permissions for %s", exe) + os.chmod(exe, st.st_mode | stat.S_IEXEC) + except: + Log.Debug("failed setting executable permissions for %s: %s", exe, traceback.format_exc()) try: rarfile.custom_check([rarfile.UNRAR_TOOL], True) except: From 64c1bcd9e625b002948151c49bb98babbe3a2a58 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 9 Nov 2019 04:46:56 +0100 Subject: [PATCH 628/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 16664c1a9..2cf216057 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3183</string> + <string>2.6.5.3195</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3183 DEV +Version 2.6.5.3195 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 064c447528cce3d9652c8d3ded0fc06e23d26782 Mon Sep 17 00:00:00 2001 From: dor <dornizar@gmail.com> Date: Sat, 9 Nov 2019 21:32:02 +0200 Subject: [PATCH 629/710] changed imports to subliminal_patch --- .../Shared/subliminal_patch/providers/screwzira.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/screwzira.py b/Contents/Libraries/Shared/subliminal_patch/providers/screwzira.py index 9b5eec3e9..ec5c39e32 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/screwzira.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/screwzira.py @@ -6,9 +6,11 @@ from bs4 import BeautifulSoup from guessit import guessit -from subliminal.providers import Episode, Movie, Provider -from subliminal.utils import sanitize -from subliminal.subtitle import Subtitle, fix_line_ending, guess_matches +from subliminal_patch.providers import Provider +from subliminal.providers import Episode, Movie +from subliminal_patch.utils import sanitize +from subliminal_patch.subtitle import Subtitle, guess_matches +from subliminal.subtitle import fix_line_ending __author__ = "Dor Nizar" From a92f3e2480aa9d1e0ee11ded41c10011b32a91b0 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 24 Dec 2019 00:10:26 +0100 Subject: [PATCH 630/710] bazarr #703: use proper language code detection instead of a wild guess; should fix bad existing subtitle detection --- Contents/Libraries/Shared/subliminal_patch/core.py | 5 +++-- Contents/Libraries/Shared/subzero/language.py | 8 +++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 0eff91856..08b728cc2 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -30,7 +30,7 @@ ThreadPoolExecutor, check_video from subliminal_patch.exceptions import TooManyRequests, APIThrottled -from subzero.language import Language, ENDSWITH_LANGUAGECODE_RE +from subzero.language import Language, ENDSWITH_LANGUAGECODE_RE, FULL_LANGUAGE_LIST from scandir import scandir, scandir_generic as _scandir_generic logger = logging.getLogger(__name__) @@ -608,7 +608,8 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen forced = "forced" in adv_tag # remove possible language code for matching - p_root_bare = ENDSWITH_LANGUAGECODE_RE.sub("", p_root) + p_root_bare = ENDSWITH_LANGUAGECODE_RE.sub( + lambda m: "" if str(m.group(1)).lower() in FULL_LANGUAGE_LIST else m.group(0), p_root) p_root_lower = p_root_bare.lower() diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index a13bab160..981873477 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -3,7 +3,7 @@ import re from babelfish.exceptions import LanguageError -from babelfish import Language as Language_, basestr +from babelfish import Language as Language_, basestr, LANGUAGE_MATRIX repl_map = { "dk": "da", @@ -31,6 +31,12 @@ } +ALPHA2_LIST = list(set(filter(lambda x: x, map(lambda x: x.alpha2, LANGUAGE_MATRIX)) + repl_map.values())) +ALPHA3b_LIST = list(set(filter(lambda x: x, map(lambda x: x.alpha3, LANGUAGE_MATRIX)) + + filter(lambda x: len(x) == 3, repl_map.keys()))) +FULL_LANGUAGE_LIST = ALPHA2_LIST + ALPHA3b_LIST + + def language_from_stream(l): if not l: raise LanguageError() From fc484e569ff0a8493d4c33700ead7280b9445fb0 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 24 Dec 2019 00:38:50 +0100 Subject: [PATCH 631/710] bazarr #660: try detecting BOMs before doing any other encoding guessing --- .../Shared/subliminal_patch/subtitle.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 057be546a..868577d29 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -19,6 +19,15 @@ from subliminal.subtitle import Episode, Movie, sanitize_release_group, get_equivalent_release_groups from subliminal_patch.utils import sanitize from ftfy import fix_text +from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE + +BOMS = ( + (BOM_UTF8, "UTF-8"), + (BOM_UTF32_BE, "UTF-32-BE"), + (BOM_UTF32_LE, "UTF-32-LE"), + (BOM_UTF16_BE, "UTF-16-BE"), + (BOM_UTF16_LE, "UTF-16-LE"), +) logger = logging.getLogger(__name__) @@ -105,6 +114,9 @@ def normalize(self): # normalize line endings self.content = self.content.replace("\r\n", "\n").replace('\r', '\n') + def _check_bom(self, data): + return [encoding for bom, encoding in BOMS if data.startswith(bom)] + def guess_encoding(self): """Guess encoding using the language, falling back on chardet. @@ -119,6 +131,11 @@ def guess_encoding(self): encodings = ['utf-8'] + # check UTF BOMs + bom_encodings = self._check_bom(self.content) + if bom_encodings: + encodings = bom_encodings + encodings + # add language-specific encodings # http://scratchpad.wikia.com/wiki/Character_Encoding_Recommendation_for_Languages From e3d83f6dc222963a742f0eaea97fea1a43045e62 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 24 Dec 2019 00:42:50 +0100 Subject: [PATCH 632/710] bazarr #660: don't double-check encodings when BOM encoding detected --- Contents/Libraries/Shared/subliminal_patch/subtitle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 868577d29..b40601da9 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -134,7 +134,7 @@ def guess_encoding(self): # check UTF BOMs bom_encodings = self._check_bom(self.content) if bom_encodings: - encodings = bom_encodings + encodings + encodings = list(set(bom_encodings + encodings)) # add language-specific encodings # http://scratchpad.wikia.com/wiki/Character_Encoding_Recommendation_for_Languages From 46f48023f46904a47c8219c51d33c67af5a4ad90 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 24 Dec 2019 00:44:53 +0100 Subject: [PATCH 633/710] bazarr #660: lowercase all BOM encodings --- Contents/Libraries/Shared/subliminal_patch/subtitle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index b40601da9..68d3ab829 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -134,7 +134,7 @@ def guess_encoding(self): # check UTF BOMs bom_encodings = self._check_bom(self.content) if bom_encodings: - encodings = list(set(bom_encodings + encodings)) + encodings = list(set(enc.lower() for enc in bom_encodings + encodings)) # add language-specific encodings # http://scratchpad.wikia.com/wiki/Character_Encoding_Recommendation_for_Languages From dc96f626dd23568e6a8fb6664352f16ca5f9c17e Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 25 Dec 2019 01:32:32 +0100 Subject: [PATCH 634/710] bazarr #703: py3 compat backport --- Contents/Libraries/Shared/subzero/language.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index 981873477..8237d5ace 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -31,9 +31,9 @@ } -ALPHA2_LIST = list(set(filter(lambda x: x, map(lambda x: x.alpha2, LANGUAGE_MATRIX)) + repl_map.values())) -ALPHA3b_LIST = list(set(filter(lambda x: x, map(lambda x: x.alpha3, LANGUAGE_MATRIX)) + - filter(lambda x: len(x) == 3, repl_map.keys()))) +ALPHA2_LIST = list(set(filter(lambda x: x, map(lambda x: x.alpha2, LANGUAGE_MATRIX)))) + list(repl_map.values()) +ALPHA3b_LIST = list(set(filter(lambda x: x, map(lambda x: x.alpha3, LANGUAGE_MATRIX)))) + \ + list(set(filter(lambda x: len(x) == 3, list(repl_map.keys())))) FULL_LANGUAGE_LIST = ALPHA2_LIST + ALPHA3b_LIST From 11c649a7afde5492f561da5417164b7b71b55590 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 18 Jan 2020 23:21:01 +0100 Subject: [PATCH 635/710] #711 don't fail on inexistant stream IDs when detecting extra stream info (mediainfo) --- Contents/Code/support/plex_media.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index 437c3b591..a5143b6c2 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -184,6 +184,13 @@ def get_all_parts(plex_item): def update_stream_info(part): + try: + return _update_stream_info(part) + except: + Log.Traceback("Getting Mediainfo failed for: %s", part.file) + + +def _update_stream_info(part): if config.mediainfo_bin and part.container == "mp4": cmdline = '%s --Inform="Text;-%%ID%%_%%Title%%" %s' % (config.mediainfo_bin, helpers.quote(part.file)) result = subprocess.check_output(cmdline, stderr=subprocess.PIPE, shell=True) @@ -198,7 +205,10 @@ def update_stream_info(part): else: filled = [] for stream in part.streams: - index = stream.index+1 + if stream.index is None: + Log.Debug("Found stream with no index: %r", stream) + + index = stream.index+1 if stream.index is not None else 1 if index in stream_titles: stream.title = stream_titles[index] filled.append(index-1) From 20a850b9e9c2c80dc417552cc7370fc8e501d5a0 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 18 Jan 2020 23:26:43 +0100 Subject: [PATCH 636/710] #711 use correct Log function --- Contents/Code/support/plex_media.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index a5143b6c2..fcc10abd5 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -187,7 +187,7 @@ def update_stream_info(part): try: return _update_stream_info(part) except: - Log.Traceback("Getting Mediainfo failed for: %s", part.file) + Log.Exception("Getting Mediainfo failed for: %s", part.file) def _update_stream_info(part): From 55cbf2478a9f1713ced99596f137a6e3a295281e Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 19 Jan 2020 05:02:34 +0100 Subject: [PATCH 637/710] morpheus65535/bazarr#656 further generalize formats; skip release group match if format match failed --- .../Shared/subliminal_patch/subtitle.py | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 68d3ab829..920465436 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -357,6 +357,15 @@ class ModifiedSubtitle(Subtitle): id = None +MERGED_FORMATS = { + "TV": ("HDTV", "SDTV", "AHDTV", "UHDTV"), + "Air": ("SATRip", "DVB", "PPV"), + "Disk": ("DVD", "HD-DVD", "BluRay") +} + +MERGED_FORMATS_REV = dict((v.lower(), k.lower()) for k in MERGED_FORMATS for v in MERGED_FORMATS[k]) + + def guess_matches(video, guess, partial=False): """Get matches between a `video` and a `guess`. @@ -439,21 +448,25 @@ def guess_matches(video, guess, partial=False): formats = [formats] if video.format: - video_format = video.format - if video_format in ("HDTV", "SDTV", "TV"): - video_format = "TV" - logger.debug("Treating HDTV/SDTV the same") + video_format = video.format.lower() + _video_gen_format = MERGED_FORMATS_REV.get(video_format) + if _video_gen_format: + logger.debug("Treating %s as %s the same", video_format, _video_gen_format) for frmt in formats: - if frmt in ("HDTV", "SDTV"): - frmt = "TV" + _guess_gen_frmt = MERGED_FORMATS_REV.get(frmt.lower()) - if frmt.lower() == video_format.lower(): + if _guess_gen_frmt == _video_gen_format: matches.add('format') break + if "release_group" in matches and "format" not in matches: + logger.info("Release group matched but format didn't. Remnoving release group match.") + matches.remove("release_group") + # video_codec if video.video_codec and 'video_codec' in guess and guess['video_codec'] == video.video_codec: matches.add('video_codec') + # audio_codec if video.audio_codec and 'audio_codec' in guess and guess['audio_codec'] == video.audio_codec: matches.add('audio_codec') From 831bec36306ffbe75ae321e6b589fb0be5dafe6f Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 19 Jan 2020 05:35:10 +0100 Subject: [PATCH 638/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 2cf216057..d19d5e0a1 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3195</string> + <string>2.6.5.3205</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3195 DEV +Version 2.6.5.3205 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 2a82857570b9785a5cf0d694f76dbd88fabb2283 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 19 Jan 2020 05:38:59 +0100 Subject: [PATCH 639/710] #711 plex security blerp --- Contents/Code/support/plex_media.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index fcc10abd5..b4e4dacb0 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -185,12 +185,12 @@ def get_all_parts(plex_item): def update_stream_info(part): try: - return _update_stream_info(part) + return update_stream_info_(part) except: Log.Exception("Getting Mediainfo failed for: %s", part.file) -def _update_stream_info(part): +def update_stream_info_(part): if config.mediainfo_bin and part.container == "mp4": cmdline = '%s --Inform="Text;-%%ID%%_%%Title%%" %s' % (config.mediainfo_bin, helpers.quote(part.file)) result = subprocess.check_output(cmdline, stderr=subprocess.PIPE, shell=True) From 1225a4887c0b6f8c83b62cbbf23bc20a7890c320 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 19 Jan 2020 05:39:41 +0100 Subject: [PATCH 640/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index d19d5e0a1..876f7f142 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3205</string> + <string>2.6.5.3207</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3205 DEV +Version 2.6.5.3207 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 6b6af347da3e426de19916413d18a8f17a022f78 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 15 Feb 2020 02:08:16 +0100 Subject: [PATCH 641/710] providers: screwzira: disable when foreign only is enabled --- Contents/Code/support/config.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 4566e10ff..a080435a9 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -825,6 +825,7 @@ def get_providers(self, media_type="series"): providers["assrt"] = False providers["subscene"] = False providers["napisy24"] = False + providers["screwzira"] = False providers_forced_off = dict(providers) if not self.unrar and providers["legendastv"]: From 78e47d3cd5bec660aaf7e7c71170e70c74a8f2a3 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 15 Feb 2020 02:10:32 +0100 Subject: [PATCH 642/710] providers: screwzira: move config; providers: add BSPlayer --- Contents/Code/support/config.py | 2 + Contents/DefaultPrefs.json | 18 +- .../subliminal_patch/providers/bsplayer.py | 235 ++++++++++++++++++ 3 files changed, 249 insertions(+), 6 deletions(-) create mode 100644 Contents/Libraries/Shared/subliminal_patch/providers/bsplayer.py diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index a080435a9..54fcee010 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -795,6 +795,7 @@ def providers_by_prefs(self): 'argenteam': cast_bool(Prefs['provider.argenteam.enabled']), 'subscenter': False, 'assrt': cast_bool(Prefs['provider.assrt.enabled']), + 'bsplayer': cast_bool(Prefs['provider.bsplayer.enabled']), 'screwzira': cast_bool(Prefs['provider.screwzira.enabled']), } @@ -825,6 +826,7 @@ def get_providers(self, media_type="series"): providers["assrt"] = False providers["subscene"] = False providers["napisy24"] = False + providers["bsplayer"] = False providers["screwzira"] = False providers_forced_off = dict(providers) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index eb16f30f1..aec1215c2 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -329,12 +329,6 @@ "type": "bool", "default": "false" }, - { - "id": "provider.screwzira.enabled", - "label": "Provider: Enable ScrewZira (Hebrew)", - "type": "bool", - "default": "true" - }, { "id": "provider.podnapisi.enabled", "label": "Provider: Enable Podnapisi.NET", @@ -515,6 +509,18 @@ "type": "text", "default": "" }, + { + "id": "provider.bsplayer.enabled", + "label": "Provider: Enable BSPlayer", + "type": "bool", + "default": "true" + }, + { + "id": "provider.screwzira.enabled", + "label": "Provider: Enable ScrewZira (Hebrew)", + "type": "bool", + "default": "false" + }, { "id": "providers.multithreading", "label": "Search enabled providers simultaneously (multithreading)", diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/bsplayer.py b/Contents/Libraries/Shared/subliminal_patch/providers/bsplayer.py new file mode 100644 index 000000000..9839a0331 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/providers/bsplayer.py @@ -0,0 +1,235 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +import logging +import io +import os + +from requests import Session +from guessit import guessit +from subliminal_patch.providers import Provider +from subliminal_patch.subtitle import Subtitle +from subliminal.utils import sanitize_release_group +from subliminal.subtitle import guess_matches +from subzero.language import Language + +import gzip +import random +from time import sleep +from xml.etree import ElementTree + +logger = logging.getLogger(__name__) + +class BSPlayerSubtitle(Subtitle): + """BSPlayer Subtitle.""" + provider_name = 'bsplayer' + + def __init__(self, language, filename, subtype, video, link): + super(BSPlayerSubtitle, self).__init__(language) + self.language = language + self.filename = filename + self.page_link = link + self.subtype = subtype + self.video = video + + @property + def id(self): + return self.page_link + + @property + def release_info(self): + return self.filename + + def get_matches(self, video): + matches = set() + + video_filename = video.name + video_filename = os.path.basename(video_filename) + video_filename, _ = os.path.splitext(video_filename) + video_filename = sanitize_release_group(video_filename) + + subtitle_filename = self.filename + subtitle_filename = os.path.basename(subtitle_filename) + subtitle_filename, _ = os.path.splitext(subtitle_filename) + subtitle_filename = sanitize_release_group(subtitle_filename) + + + matches |= guess_matches(video, guessit(self.filename)) + + matches.add(id(self)) + matches.add('hash') + + return matches + + + +class BSPlayerProvider(Provider): + """BSPlayer Provider.""" + languages = {Language('por', 'BR')} | {Language(l) for l in [ + 'ara', 'bul', 'ces', 'dan', 'deu', 'ell', 'eng', 'fin', 'fra', 'hun', 'ita', 'jpn', 'kor', 'nld', 'pol', 'por', + 'ron', 'rus', 'spa', 'swe', 'tur', 'ukr', 'zho' + ]} + SEARCH_THROTTLE = 8 + + # batantly based on kodi's bsplayer plugin + # also took from BSPlayer-Subtitles-Downloader + def __init__(self): + self.initialize() + + def initialize(self): + self.session = Session() + self.search_url = self.get_sub_domain() + self.token = None + self.login() + + def terminate(self): + self.session.close() + self.logout() + + def api_request(self, func_name='logIn', params='', tries=5): + headers = { + 'User-Agent': 'BSPlayer/2.x (1022.12360)', + 'Content-Type': 'text/xml; charset=utf-8', + 'Connection': 'close', + 'SOAPAction': '"http://api.bsplayer-subtitles.com/v1.php#{func_name}"'.format(func_name=func_name) + } + data = ( + '<?xml version="1.0" encoding="UTF-8"?>\n' + '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" ' + 'xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" ' + 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' + 'xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="{search_url}">' + '<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' + '<ns1:{func_name}>{params}</ns1:{func_name}></SOAP-ENV:Body></SOAP-ENV:Envelope>' + ).format(search_url=self.search_url, func_name=func_name, params=params) + logger.info('Sending request: %s.' % func_name) + for i in iter(range(tries)): + try: + self.session.headers.update(headers.items()) + res = self.session.post(self.search_url, data) + return ElementTree.fromstring(res.text) + + ### with requests + # res = requests.post( + # url=self.search_url, + # data=data, + # headers=headers + # ) + # return ElementTree.fromstring(res.text) + + except Exception as ex: + logger.info("ERROR: %s." % ex) + if func_name == 'logIn': + self.search_url = self.get_sub_domain() + sleep(1) + logger.info('ERROR: Too many tries (%d)...' % tries) + raise Exception('Too many tries...') + + def login(self): + # If already logged in + if self.token: + return True + + root = self.api_request( + func_name='logIn', + params=('<username></username>' + '<password></password>' + '<AppID>BSPlayer v2.67</AppID>') + ) + res = root.find('.//return') + if res.find('status').text == 'OK': + self.token = res.find('data').text + logger.info("Logged In Successfully.") + return True + return False + + def logout(self): + # If already logged out / not logged in + if not self.token: + return True + + root = self.api_request( + func_name='logOut', + params='<handle>{token}</handle>'.format(token=self.token) + ) + res = root.find('.//return') + self.token = None + if res.find('status').text == 'OK': + logger.info("Logged Out Successfully.") + return True + return False + + def query(self, video, video_hash, language): + if not self.login(): + return [] + + if isinstance(language, (tuple, list, set)): + # language_ids = ",".join(language) + # language_ids = 'spa' + language_ids = ','.join(sorted(l.opensubtitles for l in language)) + + + if video.imdb_id is None: + imdbId = '*' + else: + imdbId = video.imdb_id + sleep(self.SEARCH_THROTTLE) + root = self.api_request( + func_name='searchSubtitles', + params=( + '<handle>{token}</handle>' + '<movieHash>{movie_hash}</movieHash>' + '<movieSize>{movie_size}</movieSize>' + '<languageId>{language_ids}</languageId>' + '<imdbId>{imdbId}</imdbId>' + ).format(token=self.token, movie_hash=video_hash, + movie_size=video.size, language_ids=language_ids, imdbId=imdbId) + ) + res = root.find('.//return/result') + if res.find('status').text != 'OK': + return [] + + items = root.findall('.//return/data/item') + subtitles = [] + if items: + logger.info("Subtitles Found.") + for item in items: + subID=item.find('subID').text + subDownloadLink=item.find('subDownloadLink').text + subLang= Language.fromopensubtitles(item.find('subLang').text) + subName=item.find('subName').text + subFormat=item.find('subFormat').text + subtitles.append( + BSPlayerSubtitle(subLang,subName, subFormat, video, subDownloadLink) + ) + return subtitles + + def list_subtitles(self, video, languages): + return self.query(video, video.hashes['bsplayer'], languages) + + def get_sub_domain(self): + # s1-9, s101-109 + SUB_DOMAINS = ['s1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', + 's101', 's102', 's103', 's104', 's105', 's106', 's107', 's108', 's109'] + API_URL_TEMPLATE = "http://{sub_domain}.api.bsplayer-subtitles.com/v1.php" + sub_domains_end = len(SUB_DOMAINS) - 1 + return API_URL_TEMPLATE.format(sub_domain=SUB_DOMAINS[random.randint(0, sub_domains_end)]) + + def download_subtitle(self, subtitle): + session = Session() + _addheaders = { + 'User-Agent': 'Mozilla/4.0 (compatible; Synapse)' + } + session.headers.update(_addheaders) + res = session.get(subtitle.page_link) + if res: + if res.text == '500': + raise ValueError('Error 500 on server') + + with gzip.GzipFile(fileobj=io.BytesIO(res.content)) as gf: + subtitle.content = gf.read() + subtitle.normalize() + + return subtitle + raise ValueError('Problems conecting to the server') + + From 88d2a44f08f188370b431c6d138ee07bcd3f912d Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 15 Feb 2020 02:27:11 +0100 Subject: [PATCH 643/710] core: reuse OS hash core: refiners: tvdb: don't fail on bad firstAired date --- Contents/Libraries/Shared/subliminal_patch/core.py | 6 +++++- Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 08b728cc2..e9f9872c0 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -541,8 +541,12 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski if video.size > 10485760: logger.debug('Size is %d', video.size) osub_hash = None + + if "bsplayer" in providers: + video.hashes['bsplayer'] = osub_hash = hash_opensubtitles(hash_path) + if "opensubtitles" in providers: - video.hashes['opensubtitles'] = osub_hash = hash_opensubtitles(hash_path) + video.hashes['opensubtitles'] = osub_hash = osub_hash or hash_opensubtitles(hash_path) if "shooter" in providers: video.hashes['shooter'] = hash_shooter(hash_path) diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py b/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py index 808c8ef90..4dda710e3 100644 --- a/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py @@ -87,7 +87,10 @@ def refine(video, **kwargs): # parse series year series_year = None if result['firstAired']: - series_year = datetime.datetime.strptime(result['firstAired'], '%Y-%m-%d').year + try: + series_year = datetime.datetime.strptime(result['firstAired'], '%Y-%m-%d').year + except ValueError: + continue # discard mismatches on year if video.year and series_year and video.year != series_year: From e6b79334d83ad941646e99b553d60926413e571a Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 15 Feb 2020 03:00:06 +0100 Subject: [PATCH 644/710] core: scheduler: add option to specify subtitle storage maintenance --- Contents/DefaultPrefs.json | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index aec1215c2..7c3fa6e14 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -806,6 +806,29 @@ "type": "bool", "default": "false" }, + { + "id": "scheduler.tasks.SubtitleStorageMaintenance.frequency", + "label": "Scheduler: Periodically run subtitle storage maintenance (SZ internal)", + "type": "enum", + "values": [ + "never", + "every 6 hours", + "every 12 hours", + "every 24 hours", + "every 1 days", + "every 2 days", + "every 3 days", + "every 4 days", + "every 1 weeks", + "every 2 weeks", + "every 3 weeks", + "every 4 weeks", + "every 5 weeks", + "every 6 weeks", + "every 12 weeks" + ], + "default": "every 1 weeks" + }, { "id": "history_size", "label": "History: amount of items to store historical data for", From d59abea1f5f2bd9b5d83dd31ff3732cafb6656a7 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 15 Feb 2020 03:02:05 +0100 Subject: [PATCH 645/710] changelog --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 491760d9c..6380729a9 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +2.6.5.3183 + +subscene, addic7ed +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- core: don't fall back to default providers if none enabled +- core: don't process any further if stream info is missing +- core: support using mediainfo for retrieving MP4 MOV_TEXT subtitle stream titles (PMS bug) +- core: fix embedded subtitle extraction in some cases (#681, #680) +- core: scanning: add additional INFO logging for undetected languages +- core: bazarr-backport: remove existing subtitle file, to support MergerFS +- core: bazarr-backport: generic 10 minute throttling if uncaught exception occurs +- providers: addic7ed: fix recaptcha solving; fix show ID retrieval (#681) +- providers: addic7ed: add timeout on authentication error +- providers: addic7ed: fix shows with dots in them (Mayans M.C.) +- providers: addic7ed: fix detection of completed subtitle for non-english users (#686) +- providers: addic7ed: add more timeouts in the login process +- providers: argenteam: bazarr-backport: use new url; fixes + + 2.6.5.3152 subscene, addic7ed From 5d1858d5daf1a0df65519ad504f515eee8a1f631 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 15 Feb 2020 03:15:17 +0100 Subject: [PATCH 646/710] 2.6.5.3217 --- Contents/DefaultPrefs.json | 2 +- README.md | 25 +++++++++++-------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 7c3fa6e14..0724a2319 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -511,7 +511,7 @@ }, { "id": "provider.bsplayer.enabled", - "label": "Provider: Enable BSPlayer", + "label": "Provider: Enable BSPlayer Subtitles", "type": "bool", "default": "true" }, diff --git a/README.md b/README.md index bc58d0e1c..d17aff7cd 100644 --- a/README.md +++ b/README.md @@ -95,25 +95,22 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3183 +2.6.5.3217 subscene, addic7ed - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog -- core: don't fall back to default providers if none enabled -- core: don't process any further if stream info is missing -- core: support using mediainfo for retrieving MP4 MOV_TEXT subtitle stream titles (PMS bug) -- core: fix embedded subtitle extraction in some cases (#681, #680) -- core: scanning: add additional INFO logging for undetected languages -- core: bazarr-backport: remove existing subtitle file, to support MergerFS -- core: bazarr-backport: generic 10 minute throttling if uncaught exception occurs -- providers: addic7ed: fix recaptcha solving; fix show ID retrieval (#681) -- providers: addic7ed: add timeout on authentication error -- providers: addic7ed: fix shows with dots in them (Mayans M.C.) -- providers: addic7ed: fix detection of completed subtitle for non-english users (#686) -- providers: addic7ed: add more timeouts in the login process -- providers: argenteam: bazarr-backport: use new url; fixes +- core: also extract (missing) embedded subtitles when SearchAllRecentlyAddedMissing is running +- core: core: clarify detecting streams (in logs) +- core: UnRAR: set binary to executable, even if not checked out from git; might fix #693 +- core: bazarr-backport: morpheus65535/bazarr#703: use proper language code detection instead of a wild guess; should fix bad existing subtitle detection +- core: bazarr-backport: morpheus65535/bazarr#660: fix BOM encoding stuff +- core: bazarr-backport: morpheus65535/bazarr#656 further generalize formats; skip release group match if format match failed +- core: fix stream detection when using mediainfo (#711) +- config/core: make periodic SZ-internal subtitle maintenance interval configurable +- providers: add BSPlayer Subtitles +- providers: add ScrewZira (Hebrew) [older changes](CHANGELOG.md) From ee9268957da45f4f35dab57bbb741d1120ac073e Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 15 Feb 2020 03:16:32 +0100 Subject: [PATCH 647/710] release 2.6.5.3217 --- Contents/Info.plist | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 876f7f142..1e9870640 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3207</string> + <string>2.6.5.3217</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3207 DEV +Version 2.6.5.3217 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From c51ce55d32d67569e07765be18209f6aef1f1944 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 15 Feb 2020 03:17:00 +0100 Subject: [PATCH 648/710] update maintenance state in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d17aff7cd..4e1d1e08d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Sub-Zero for Plex [![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle.svg?style=flat&label=stable)](https://github.com/pannal/Sub-Zero.bundle/releases/latest) [![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)]() -[![Maintenance](https://img.shields.io/maintenance/yes/2019.svg)]() +[![Maintenance](https://img.shields.io/maintenance/yes/2020.svg)]() [![Slack Status](https://szslack.fragstore.net/badge.svg)](https://szslack.fragstore.net) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle?ref=badge_shield) From 3cf83b5bf73b4db0f38affd48f35e47ad064dfef Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 15 Feb 2020 03:17:36 +0100 Subject: [PATCH 649/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 1e9870640..323f81a03 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3217 +Version 2.6.5.3217 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From ff49dd4512c4e089e9c0ffc1780e3d8124e8e6e4 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 16 Feb 2020 05:08:50 +0100 Subject: [PATCH 650/710] providers: bsplayer: verify hash; clean up --- .../subliminal_patch/providers/bsplayer.py | 48 +++++-------------- 1 file changed, 13 insertions(+), 35 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/bsplayer.py b/Contents/Libraries/Shared/subliminal_patch/providers/bsplayer.py index 9839a0331..f6eb20db4 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/bsplayer.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/bsplayer.py @@ -19,9 +19,11 @@ logger = logging.getLogger(__name__) + class BSPlayerSubtitle(Subtitle): """BSPlayer Subtitle.""" provider_name = 'bsplayer' + hash_verifiable = True def __init__(self, language, filename, subtype, video, link): super(BSPlayerSubtitle, self).__init__(language) @@ -41,27 +43,12 @@ def release_info(self): def get_matches(self, video): matches = set() - - video_filename = video.name - video_filename = os.path.basename(video_filename) - video_filename, _ = os.path.splitext(video_filename) - video_filename = sanitize_release_group(video_filename) - - subtitle_filename = self.filename - subtitle_filename = os.path.basename(subtitle_filename) - subtitle_filename, _ = os.path.splitext(subtitle_filename) - subtitle_filename = sanitize_release_group(subtitle_filename) - - matches |= guess_matches(video, guessit(self.filename)) - - matches.add(id(self)) matches.add('hash') return matches - class BSPlayerProvider(Provider): """BSPlayer Provider.""" languages = {Language('por', 'BR')} | {Language(l) for l in [ @@ -69,6 +56,7 @@ class BSPlayerProvider(Provider): 'ron', 'rus', 'spa', 'swe', 'tur', 'ukr', 'zho' ]} SEARCH_THROTTLE = 8 + hash_verifiable = True # batantly based on kodi's bsplayer plugin # also took from BSPlayer-Subtitles-Downloader @@ -108,18 +96,11 @@ def api_request(self, func_name='logIn', params='', tries=5): res = self.session.post(self.search_url, data) return ElementTree.fromstring(res.text) - ### with requests - # res = requests.post( - # url=self.search_url, - # data=data, - # headers=headers - # ) - # return ElementTree.fromstring(res.text) - except Exception as ex: logger.info("ERROR: %s." % ex) if func_name == 'logIn': self.search_url = self.get_sub_domain() + sleep(1) logger.info('ERROR: Too many tries (%d)...' % tries) raise Exception('Too many tries...') @@ -167,7 +148,6 @@ def query(self, video, video_hash, language): # language_ids = 'spa' language_ids = ','.join(sorted(l.opensubtitles for l in language)) - if video.imdb_id is None: imdbId = '*' else: @@ -193,13 +173,13 @@ def query(self, video, video_hash, language): if items: logger.info("Subtitles Found.") for item in items: - subID=item.find('subID').text - subDownloadLink=item.find('subDownloadLink').text - subLang= Language.fromopensubtitles(item.find('subLang').text) - subName=item.find('subName').text - subFormat=item.find('subFormat').text + subID = item.find('subID').text + subDownloadLink = item.find('subDownloadLink').text + subLang = Language.fromopensubtitles(item.find('subLang').text) + subName = item.find('subName').text + subFormat = item.find('subFormat').text subtitles.append( - BSPlayerSubtitle(subLang,subName, subFormat, video, subDownloadLink) + BSPlayerSubtitle(subLang, subName, subFormat, video, subDownloadLink) ) return subtitles @@ -207,9 +187,9 @@ def list_subtitles(self, video, languages): return self.query(video, video.hashes['bsplayer'], languages) def get_sub_domain(self): - # s1-9, s101-109 + # s1-9, s101-109 SUB_DOMAINS = ['s1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', - 's101', 's102', 's103', 's104', 's105', 's106', 's107', 's108', 's109'] + 's101', 's102', 's103', 's104', 's105', 's106', 's107', 's108', 's109'] API_URL_TEMPLATE = "http://{sub_domain}.api.bsplayer-subtitles.com/v1.php" sub_domains_end = len(SUB_DOMAINS) - 1 return API_URL_TEMPLATE.format(sub_domain=SUB_DOMAINS[random.randint(0, sub_domains_end)]) @@ -226,10 +206,8 @@ def download_subtitle(self, subtitle): raise ValueError('Error 500 on server') with gzip.GzipFile(fileobj=io.BytesIO(res.content)) as gf: - subtitle.content = gf.read() + subtitle.content = gf.read() subtitle.normalize() return subtitle raise ValueError('Problems conecting to the server') - - From 1f0a713f9bd534a3913f52b2dddf146939415474 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 16 Feb 2020 05:44:59 +0100 Subject: [PATCH 651/710] core: scoring: reorder subtitles based on second non-hash-score if main hash score is the same; morpheus65535/bazarr#821 --- Contents/Code/support/tasks.py | 9 ++++--- .../Libraries/Shared/subliminal_patch/core.py | 7 +++--- .../Shared/subliminal_patch/score.py | 24 ++++++++++++------- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index 55915419c..972ba66d0 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -171,12 +171,15 @@ def list_subtitles(self, rating_key, item_type, part_id, language, skip_wrong_fp else: s.wrong_season_ep = True + orig_matches = matches.copy() + score, score_without_hash = compute_score(matches, s, video, hearing_impaired=use_hearing_impaired) + unsorted_subtitles.append( - (s, compute_score(matches, s, video, hearing_impaired=use_hearing_impaired), matches)) - scored_subtitles = sorted(unsorted_subtitles, key=operator.itemgetter(1), reverse=True) + (s, score, score_without_hash, matches, orig_matches)) + scored_subtitles = sorted(unsorted_subtitles, key=operator.itemgetter(1, 2), reverse=True) subtitles = [] - for subtitle, score, matches in scored_subtitles: + for subtitle, score, score_without_hash, matches, orig_matches in scored_subtitles: # check score if score < min_score and not subtitle.wrong_series: Log.Info(u'%s: Score %d is below min_score (%d)', self.name, score, min_score) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index e9f9872c0..d94515064 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -354,15 +354,16 @@ def download_best_subtitles(self, subtitles, video, languages, min_score=0, hear orig_matches = matches.copy() logger.debug('%r: Found matches %r', s, matches) + score, score_without_hash = compute_score(matches, s, video, hearing_impaired=use_hearing_impaired) unsorted_subtitles.append( - (s, compute_score(matches, s, video, hearing_impaired=use_hearing_impaired), matches, orig_matches)) + (s, score, score_without_hash, matches, orig_matches)) # sort subtitles by score - scored_subtitles = sorted(unsorted_subtitles, key=operator.itemgetter(1), reverse=True) + scored_subtitles = sorted(unsorted_subtitles, key=operator.itemgetter(1, 2), reverse=True) # download best subtitles, falling back on the next on error downloaded_subtitles = [] - for subtitle, score, matches, orig_matches in scored_subtitles: + for subtitle, score, score_without_hash, matches, orig_matches in scored_subtitles: # check score if score < min_score: logger.info('%r: Score %d is below min_score (%d)', subtitle, score, min_score) diff --git a/Contents/Libraries/Shared/subliminal_patch/score.py b/Contents/Libraries/Shared/subliminal_patch/score.py index 918f8f668..c70e61f15 100644 --- a/Contents/Libraries/Shared/subliminal_patch/score.py +++ b/Contents/Libraries/Shared/subliminal_patch/score.py @@ -60,6 +60,8 @@ def compute_score(matches, subtitle, video, hearing_impaired=None): episode_hash_valid_if = {"series", "season", "episode", "format"} movie_hash_valid_if = {"video_codec", "format"} + orig_matches = matches.copy() + # on hash match, discard everything else if subtitle.hash_verifiable: if 'hash' in matches: @@ -83,41 +85,47 @@ def compute_score(matches, subtitle, video, hearing_impaired=None): matches &= {'hash'} # handle equivalent matches + eq_matches = set() if is_episode: if 'title' in matches: logger.debug('Adding title match equivalent') - matches.add('episode') + eq_matches.add('episode') if 'series_imdb_id' in matches: logger.debug('Adding series_imdb_id match equivalent') - matches |= {'series', 'year'} + eq_matches |= {'series', 'year'} if 'imdb_id' in matches: logger.debug('Adding imdb_id match equivalents') - matches |= {'series', 'year', 'season', 'episode'} + eq_matches |= {'series', 'year', 'season', 'episode'} if 'tvdb_id' in matches: logger.debug('Adding tvdb_id match equivalents') - matches |= {'series', 'year', 'season', 'episode', 'title'} + eq_matches |= {'series', 'year', 'season', 'episode', 'title'} if 'series_tvdb_id' in matches: logger.debug('Adding series_tvdb_id match equivalents') - matches |= {'series', 'year'} + eq_matches |= {'series', 'year'} # specials if video.is_special and 'title' in matches and 'series' in matches \ and 'year' in matches: logger.debug('Adding special title match equivalent') - matches |= {'season', 'episode'} + eq_matches |= {'season', 'episode'} elif is_movie: if 'imdb_id' in matches: logger.debug('Adding imdb_id match equivalents') - matches |= {'title', 'year'} + eq_matches |= {'title', 'year'} + + matches |= eq_matches # handle hearing impaired if hearing_impaired is not None and subtitle.hearing_impaired == hearing_impaired: logger.debug('Matched hearing_impaired') matches.add('hearing_impaired') + orig_matches.add('hearing_impaired') # compute the score score = sum((scores.get(match, 0) for match in matches)) logger.info('%r: Computed score %r with final matches %r', subtitle, score, matches) - return score + score_without_hash = sum((scores.get(match, 0) for match in orig_matches | eq_matches if match != "hash")) + + return score, score_without_hash From 9e5829151d9f836c7783cdfbfc1aaa6f47233c98 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 16 Feb 2020 06:03:21 +0100 Subject: [PATCH 652/710] release 2.6.5.3223 --- Contents/Info.plist | 4 ++-- README.md | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 323f81a03..2a3ea262a 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3217</string> + <string>2.6.5.3223</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3217 DEV +Version 2.6.5.3223 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 4e1d1e08d..209c0576d 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,15 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog +2.6.5.3223 + +subscene, addic7ed +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- core: scoring: reorder subtitles based on second non-hash-score if main hash score is the same; morpheus65535/bazarr#821 +- providers: bsplayer: verify hash; clean up + 2.6.5.3217 From fcb1a8a6a7bd2b30b4e3febc320af5fc05749661 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 16 Feb 2020 06:05:04 +0100 Subject: [PATCH 653/710] release 2.6.5.3223 --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 2a3ea262a..928c5b509 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3223 DEV +Version 2.6.5.3223 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 60e265654122a96848cd3fed587011e2392733b6 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 16 Feb 2020 06:06:23 +0100 Subject: [PATCH 654/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 928c5b509..2a3ea262a 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3223 +Version 2.6.5.3223 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 9455e3b52b5a7b23e9b107f522497f53b6080372 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 8 Mar 2020 05:18:20 +0100 Subject: [PATCH 655/710] skip drawing tags for SRT --- Contents/Libraries/Shared/pysubs2/exceptions.py | 3 +++ Contents/Libraries/Shared/pysubs2/ssastyle.py | 1 + Contents/Libraries/Shared/pysubs2/subrip.py | 7 ++++++- Contents/Libraries/Shared/pysubs2/substation.py | 9 ++++++++- .../Libraries/Shared/subliminal_patch/subtitle.py | 14 +++++++++++++- 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/pysubs2/exceptions.py b/Contents/Libraries/Shared/pysubs2/exceptions.py index e0c9312fb..b9d528524 100644 --- a/Contents/Libraries/Shared/pysubs2/exceptions.py +++ b/Contents/Libraries/Shared/pysubs2/exceptions.py @@ -12,3 +12,6 @@ class UnknownFormatIdentifierError(Pysubs2Error): class FormatAutodetectionError(Pysubs2Error): """Subtitle format is ambiguous or unknown.""" + +class ContentNotUsable(Pysubs2Error): + """Current content not usable for specified format""" diff --git a/Contents/Libraries/Shared/pysubs2/ssastyle.py b/Contents/Libraries/Shared/pysubs2/ssastyle.py index 2fcadc7ed..2f84e8214 100644 --- a/Contents/Libraries/Shared/pysubs2/ssastyle.py +++ b/Contents/Libraries/Shared/pysubs2/ssastyle.py @@ -41,6 +41,7 @@ def __init__(self, **fields): self.italic = False #: Italic self.underline = False #: Underline (ASS only) self.strikeout = False #: Strikeout (ASS only) + self.drawing = False #: Drawing (ASS only, see http://docs.aegisub.org/3.1/ASS_Tags/#drawing-tags self.scalex = 100.0 #: Horizontal scaling (ASS only) self.scaley = 100.0 #: Vertical scaling (ASS only) self.spacing = 0.0 #: Letter spacing (ASS only) diff --git a/Contents/Libraries/Shared/pysubs2/subrip.py b/Contents/Libraries/Shared/pysubs2/subrip.py index fea4eade6..a0878ba98 100644 --- a/Contents/Libraries/Shared/pysubs2/subrip.py +++ b/Contents/Libraries/Shared/pysubs2/subrip.py @@ -5,6 +5,7 @@ from .ssaevent import SSAEvent from .ssastyle import SSAStyle from .substation import parse_tags +from .exceptions import ContentNotUsable from .time import ms_to_times, make_time, TIMESTAMP, timestamp_to_ms #: Largest timestamp allowed in SubRip, ie. 99:59:59,999. @@ -81,6 +82,7 @@ def prepare_text(text, style): if sty.italic: fragment = "<i>%s</i>" % fragment if sty.underline: fragment = "<u>%s</u>" % fragment if sty.strikeout: fragment = "<s>%s</s>" % fragment + if sty.drawing: raise ContentNotUsable body.append(fragment) return re.sub("\n+", "\n", "".join(body).strip()) @@ -90,7 +92,10 @@ def prepare_text(text, style): for i, line in enumerate(visible_lines, 1): start = ms_to_timestamp(line.start) end = ms_to_timestamp(line.end) - text = prepare_text(line.text, subs.styles.get(line.style, SSAStyle.DEFAULT_STYLE)) + try: + text = prepare_text(line.text, subs.styles.get(line.style, SSAStyle.DEFAULT_STYLE)) + except ContentNotUsable: + continue print("%d" % i, file=fp) # Python 2.7 compat print(start, "-->", end, file=fp) diff --git a/Contents/Libraries/Shared/pysubs2/substation.py b/Contents/Libraries/Shared/pysubs2/substation.py index f810a4776..808b94130 100644 --- a/Contents/Libraries/Shared/pysubs2/substation.py +++ b/Contents/Libraries/Shared/pysubs2/substation.py @@ -110,7 +110,7 @@ def parse_tags(text, style=SSAStyle.DEFAULT_STYLE, styles={}): def apply_overrides(all_overrides): s = style.copy() - for tag in re.findall(r"\\[ibus][10]|\\r[a-zA-Z_0-9 ]*", all_overrides): + for tag in re.findall(r"\\[ibusp][0-9]|\\r[a-zA-Z_0-9 ]*", all_overrides): if tag == r"\r": s = style.copy() # reset to original line style elif tag.startswith(r"\r"): @@ -122,6 +122,13 @@ def apply_overrides(all_overrides): elif "b" in tag: s.bold = "1" in tag elif "u" in tag: s.underline = "1" in tag elif "s" in tag: s.strikeout = "1" in tag + elif "p" in tag: + try: + scale = int(tag[2:]) + except (ValueError, IndexError): + continue + + s.drawing = scale > 0 return s overrides = SSAEvent.OVERRIDE_SEQUENCE.findall(text) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 920465436..7d6e1cf00 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -278,6 +278,12 @@ def is_valid(self): @classmethod def pysubs2_to_unicode(cls, sub, format="srt"): + """ + this is a modified version of pysubs2.SubripFormat.to_file with special handling for drawing tags in ASS + :param sub: + :param format: + :return: + """ def ms_to_timestamp(ms, mssep=","): """Convert ms to 'HH:MM:SS,mmm'""" # XXX throw on overflow/underflow? @@ -292,6 +298,9 @@ def prepare_text(text, style): fragment = fragment.replace(ur"\h", u" ") fragment = fragment.replace(ur"\n", u"\n") fragment = fragment.replace(ur"\N", u"\n") + if sty.drawing: + raise pysubs2.ContentNotUsable + if format == "srt": if sty.italic: fragment = u"<i>%s</i>" % fragment @@ -323,7 +332,10 @@ def prepare_text(text, style): for i, line in enumerate(visible_lines, 1): start = ms_to_timestamp(line.start, mssep=mssep) end = ms_to_timestamp(line.end, mssep=mssep) - text = prepare_text(line.text, sub.styles.get(line.style, SSAStyle.DEFAULT_STYLE)) + try: + text = prepare_text(line.text, sub.styles.get(line.style, SSAStyle.DEFAULT_STYLE)) + except pysubs2.ContentNotUsable: + continue out.append(u"%d\n" % i) out.append(u"%s --> %s\n" % (start, end)) From b151ed4c55ddd068cde6b23d2a2a55e5cadd489f Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 8 Mar 2020 05:37:32 +0100 Subject: [PATCH 656/710] core: mods: CM_punctuation_space2: detect AND don't try changing domain/url/host when fixing punctuation add python-tld; functools_lru_cache --- .../Libraries/Shared/backports/__init__.py | 1 + .../Shared/backports/functools_lru_cache.py | 196 + Contents/Libraries/Shared/submod_test.py | 1 + .../subzero/modification/mods/common.py | 5 +- Contents/Libraries/Shared/test.srt | 2 + Contents/Libraries/Shared/tld/__init__.py | 14 + Contents/Libraries/Shared/tld/base.py | 57 + Contents/Libraries/Shared/tld/conf.py | 45 + Contents/Libraries/Shared/tld/defaults.py | 13 + Contents/Libraries/Shared/tld/exceptions.py | 49 + Contents/Libraries/Shared/tld/helpers.py | 21 + .../Libraries/Shared/tld/parsers/__init__.py | 5 + .../Libraries/Shared/tld/parsers/mozilla.py | 5 + Contents/Libraries/Shared/tld/registry.py | 41 + .../tld/res/effective_tld_names.dat.txt | 13056 ++++++++++++++++ .../effective_tld_names-2013-04-22.dat.txt | 4418 ++++++ .../effective_tld_names-2015-07-19.dat.txt | 10641 +++++++++++++ .../effective_tld_names-2015-11-22.dat.txt | 11982 ++++++++++++++ Contents/Libraries/Shared/tld/result.py | 57 + .../Libraries/Shared/tld/tests/__init__.py | 11 + Contents/Libraries/Shared/tld/tests/base.py | 65 + .../res/effective_tld_names_custom.dat.txt | 12993 +++++++++++++++ .../Shared/tld/tests/test_commands.py | 43 + .../Libraries/Shared/tld/tests/test_core.py | 708 + Contents/Libraries/Shared/tld/trie.py | 54 + Contents/Libraries/Shared/tld/utils.py | 271 + Contents/Libraries/Shared/typing.py | 2550 +++ 27 files changed, 57303 insertions(+), 1 deletion(-) create mode 100644 Contents/Libraries/Shared/backports/__init__.py create mode 100644 Contents/Libraries/Shared/backports/functools_lru_cache.py create mode 100644 Contents/Libraries/Shared/tld/__init__.py create mode 100644 Contents/Libraries/Shared/tld/base.py create mode 100644 Contents/Libraries/Shared/tld/conf.py create mode 100644 Contents/Libraries/Shared/tld/defaults.py create mode 100644 Contents/Libraries/Shared/tld/exceptions.py create mode 100644 Contents/Libraries/Shared/tld/helpers.py create mode 100644 Contents/Libraries/Shared/tld/parsers/__init__.py create mode 100644 Contents/Libraries/Shared/tld/parsers/mozilla.py create mode 100644 Contents/Libraries/Shared/tld/registry.py create mode 100644 Contents/Libraries/Shared/tld/res/effective_tld_names.dat.txt create mode 100644 Contents/Libraries/Shared/tld/res/old/effective_tld_names-2013-04-22.dat.txt create mode 100644 Contents/Libraries/Shared/tld/res/old/effective_tld_names-2015-07-19.dat.txt create mode 100644 Contents/Libraries/Shared/tld/res/old/effective_tld_names-2015-11-22.dat.txt create mode 100644 Contents/Libraries/Shared/tld/result.py create mode 100644 Contents/Libraries/Shared/tld/tests/__init__.py create mode 100644 Contents/Libraries/Shared/tld/tests/base.py create mode 100644 Contents/Libraries/Shared/tld/tests/res/effective_tld_names_custom.dat.txt create mode 100644 Contents/Libraries/Shared/tld/tests/test_commands.py create mode 100644 Contents/Libraries/Shared/tld/tests/test_core.py create mode 100644 Contents/Libraries/Shared/tld/trie.py create mode 100644 Contents/Libraries/Shared/tld/utils.py create mode 100644 Contents/Libraries/Shared/typing.py diff --git a/Contents/Libraries/Shared/backports/__init__.py b/Contents/Libraries/Shared/backports/__init__.py new file mode 100644 index 000000000..69e3be50d --- /dev/null +++ b/Contents/Libraries/Shared/backports/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/Contents/Libraries/Shared/backports/functools_lru_cache.py b/Contents/Libraries/Shared/backports/functools_lru_cache.py new file mode 100644 index 000000000..e0b19d951 --- /dev/null +++ b/Contents/Libraries/Shared/backports/functools_lru_cache.py @@ -0,0 +1,196 @@ +from __future__ import absolute_import + +import functools +from collections import namedtuple +from threading import RLock + +_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"]) + + +@functools.wraps(functools.update_wrapper) +def update_wrapper( + wrapper, + wrapped, + assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES, +): + """ + Patch two bugs in functools.update_wrapper. + """ + # workaround for http://bugs.python.org/issue3445 + assigned = tuple(attr for attr in assigned if hasattr(wrapped, attr)) + wrapper = functools.update_wrapper(wrapper, wrapped, assigned, updated) + # workaround for https://bugs.python.org/issue17482 + wrapper.__wrapped__ = wrapped + return wrapper + + +class _HashedSeq(list): + __slots__ = 'hashvalue' + + def __init__(self, tup, hash=hash): + self[:] = tup + self.hashvalue = hash(tup) + + def __hash__(self): + return self.hashvalue + + +def _make_key( + args, + kwds, + typed, + kwd_mark=(object(),), + fasttypes=set([int, str, frozenset, type(None)]), + sorted=sorted, + tuple=tuple, + type=type, + len=len, +): + 'Make a cache key from optionally typed positional and keyword arguments' + key = args + if kwds: + sorted_items = sorted(kwds.items()) + key += kwd_mark + for item in sorted_items: + key += item + if typed: + key += tuple(type(v) for v in args) + if kwds: + key += tuple(type(v) for k, v in sorted_items) + elif len(key) == 1 and type(key[0]) in fasttypes: + return key[0] + return _HashedSeq(key) + + +def lru_cache(maxsize=100, typed=False): + """Least-recently-used cache decorator. + + If *maxsize* is set to None, the LRU features are disabled and the cache + can grow without bound. + + If *typed* is True, arguments of different types will be cached separately. + For example, f(3.0) and f(3) will be treated as distinct calls with + distinct results. + + Arguments to the cached function must be hashable. + + View the cache statistics named tuple (hits, misses, maxsize, currsize) with + f.cache_info(). Clear the cache and statistics with f.cache_clear(). + Access the underlying function with f.__wrapped__. + + See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used + + """ + + # Users should only access the lru_cache through its public API: + # cache_info, cache_clear, and f.__wrapped__ + # The internals of the lru_cache are encapsulated for thread safety and + # to allow the implementation to change (including a possible C version). + + def decorating_function(user_function): + + cache = dict() + stats = [0, 0] # make statistics updateable non-locally + HITS, MISSES = 0, 1 # names for the stats fields + make_key = _make_key + cache_get = cache.get # bound method to lookup key or return None + _len = len # localize the global len() function + lock = RLock() # because linkedlist updates aren't threadsafe + root = [] # root of the circular doubly linked list + root[:] = [root, root, None, None] # initialize by pointing to self + nonlocal_root = [root] # make updateable non-locally + PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields + + if maxsize == 0: + + def wrapper(*args, **kwds): + # no caching, just do a statistics update after a successful call + result = user_function(*args, **kwds) + stats[MISSES] += 1 + return result + + elif maxsize is None: + + def wrapper(*args, **kwds): + # simple caching without ordering or size limit + key = make_key(args, kwds, typed) + result = cache_get( + key, root + ) # root used here as a unique not-found sentinel + if result is not root: + stats[HITS] += 1 + return result + result = user_function(*args, **kwds) + cache[key] = result + stats[MISSES] += 1 + return result + + else: + + def wrapper(*args, **kwds): + # size limited caching that tracks accesses by recency + key = make_key(args, kwds, typed) if kwds or typed else args + with lock: + link = cache_get(key) + if link is not None: + # record recent use of the key by moving it + # to the front of the list + root, = nonlocal_root + link_prev, link_next, key, result = link + link_prev[NEXT] = link_next + link_next[PREV] = link_prev + last = root[PREV] + last[NEXT] = root[PREV] = link + link[PREV] = last + link[NEXT] = root + stats[HITS] += 1 + return result + result = user_function(*args, **kwds) + with lock: + root, = nonlocal_root + if key in cache: + # getting here means that this same key was added to the + # cache while the lock was released. since the link + # update is already done, we need only return the + # computed result and update the count of misses. + pass + elif _len(cache) >= maxsize: + # use the old root to store the new key and result + oldroot = root + oldroot[KEY] = key + oldroot[RESULT] = result + # empty the oldest link and make it the new root + root = nonlocal_root[0] = oldroot[NEXT] + oldkey = root[KEY] + root[KEY] = root[RESULT] = None + # now update the cache dictionary for the new links + del cache[oldkey] + cache[key] = oldroot + else: + # put result in a new link at the front of the list + last = root[PREV] + link = [last, root, key, result] + last[NEXT] = root[PREV] = cache[key] = link + stats[MISSES] += 1 + return result + + def cache_info(): + """Report cache statistics""" + with lock: + return _CacheInfo(stats[HITS], stats[MISSES], maxsize, len(cache)) + + def cache_clear(): + """Clear the cache and cache statistics""" + with lock: + cache.clear() + root = nonlocal_root[0] + root[:] = [root, root, None, None] + stats[:] = [0, 0] + + wrapper.__wrapped__ = user_function + wrapper.cache_info = cache_info + wrapper.cache_clear = cache_clear + return update_wrapper(wrapper, user_function) + + return decorating_function diff --git a/Contents/Libraries/Shared/submod_test.py b/Contents/Libraries/Shared/submod_test.py index eabf3a576..49dbee18d 100644 --- a/Contents/Libraries/Shared/submod_test.py +++ b/Contents/Libraries/Shared/submod_test.py @@ -24,6 +24,7 @@ sub = Subtitle(Language.fromietf("eng"), mods=["common", "remove_HI", "OCR_fixes", "fix_uppercase", "shift_offset(ms=0,s=1)"]) sub.content = open(fn).read() sub.normalize() +sub.is_valid() content = sub.get_modified_content(debug=True) #submod = SubMod(debug=debug) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 14c360937..190047774 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -7,6 +7,7 @@ from subzero.modification.processors import FuncProcessor from subzero.modification.processors.re_processor import NReProcessor from subzero.modification import registry +from tld import get_tld ENGLISH = Language("eng") @@ -113,7 +114,9 @@ class CommonFixes(SubtitleTextModification): NReProcessor(re.compile(r'(?u)(?:(?<=^)|(?<=\w)) +([!?.,](?![!?.,]| \.))'), r"\1", name="CM_punctuation_space"), # add space after punctuation - NReProcessor(re.compile(r'(?u)([!?.,:])([A-zÀ-ž]{2,})'), r"\1 \2", name="CM_punctuation_space2"), + NReProcessor(re.compile(r'(?u)(([^\s]*)([!?.,:])([A-zÀ-ž]{2,}))'), + lambda match: u"%s%s %s" % (match.group(2), match.group(3), match.group(4)) if not get_tld(match.group(1), fail_silently=True, fix_protocol=True) else match.group(1), + name="CM_punctuation_space2"), # fix lowercase I in english NReProcessor(re.compile(r'(?u)(\b)i(\b)'), r"\1I\2", name="CM_EN_lowercase_i", diff --git a/Contents/Libraries/Shared/test.srt b/Contents/Libraries/Shared/test.srt index cfff81cf7..e3a340ebc 100644 --- a/Contents/Libraries/Shared/test.srt +++ b/Contents/Libraries/Shared/test.srt @@ -19,6 +19,8 @@ I can't keep running. L can't! <b>i don't know. Some kind of wrong "1 00" number--- of signal, drawing the Tardis off.... course.</b> # I'm singing in the rain +www.website.com +www.nowebsite.badlol 4 00:00:16,099 --> 00:00:17,224 diff --git a/Contents/Libraries/Shared/tld/__init__.py b/Contents/Libraries/Shared/tld/__init__.py new file mode 100644 index 000000000..a0e456f85 --- /dev/null +++ b/Contents/Libraries/Shared/tld/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from .utils import get_fld, get_tld, get_tld_names, is_tld, parse_tld, Result, update_tld_names +__title__ = u'tld' +__version__ = u'0.11.10' +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'get_fld', u'get_tld', u'get_tld_names', u'is_tld', + u'parse_tld', u'Result', u'update_tld_names') diff --git a/Contents/Libraries/Shared/tld/base.py b/Contents/Libraries/Shared/tld/base.py new file mode 100644 index 000000000..420cd6a5e --- /dev/null +++ b/Contents/Libraries/Shared/tld/base.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from six import with_metaclass as _py_backwards_six_withmetaclass +from codecs import open as codecs_open +try: + from urllib.request import urlopen +except ImportError: + from six.moves.urllib.request import urlopen as urlopen +from .exceptions import TldIOError, TldImproperlyConfigured +from .helpers import project_dir +from .registry import Registry +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'BaseTLDSourceParser',) + + +class BaseTLDSourceParser( + _py_backwards_six_withmetaclass(Registry, *[object])): + u'Base TLD source parser.' + uid = None + source_url = None + local_path = None + + @classmethod + def validate(cls): + u'Constructor.' + if (not cls.uid): + raise TldImproperlyConfigured( + u'The `uid` property of the TLD source parser shall be defined.') + + @classmethod + def get_tld_names(cls, fail_silently=False, retry_count=0): + u'Get tld names.\n\n :param fail_silently:\n :param retry_count:\n :return:\n ' + cls.validate() + raise NotImplementedError( + u'Your TLD source parser shall implement `get_tld_names` method.') + + @classmethod + def update_tld_names(cls, fail_silently=False): + u'Update the local copy of the TLD file.\n\n :param fail_silently:\n :return:\n ' + try: + remote_file = urlopen(cls.source_url) + local_file = codecs_open(project_dir( + cls.local_path), u'wb', encoding='utf8') + local_file.write(remote_file.read().decode(u'utf8')) + local_file.close() + remote_file.close() + except Exception as err: + if fail_silently: + return False + raise TldIOError(err) + return True diff --git a/Contents/Libraries/Shared/tld/conf.py b/Contents/Libraries/Shared/tld/conf.py new file mode 100644 index 000000000..50d9a4c25 --- /dev/null +++ b/Contents/Libraries/Shared/tld/conf.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from typing import Any +from . import defaults +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'get_setting', u'reset_settings', u'set_setting', u'settings') + + +class Settings(object): + u'Settings registry.' + + def __init__(self): + self._settings = { + + } + self._settings_get = self._settings.get + + def set(self, name, value): + u'\n Override default settings.\n\n :param str name:\n :param mixed value:\n ' + self._settings[name] = value + + def get(self, name, default=None): + u'\n Gets a variable from local settings.\n\n :param str name:\n :param mixed default: Default value.\n :return mixed:\n ' + if (name in self._settings): + return self._settings_get(name, default) + elif hasattr(defaults, name): + return getattr(defaults, name, default) + return default + + def reset(self): + u'Reset settings.' + for name in defaults.__all__: + self.set(name, getattr(defaults, name)) + + +settings = Settings() +get_setting = settings.get +set_setting = settings.set +reset_settings = settings.reset diff --git a/Contents/Libraries/Shared/tld/defaults.py b/Contents/Libraries/Shared/tld/defaults.py new file mode 100644 index 000000000..35be13ab1 --- /dev/null +++ b/Contents/Libraries/Shared/tld/defaults.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from os.path import dirname +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'DEBUG', u'NAMES_LOCAL_PATH_PARENT') +NAMES_LOCAL_PATH_PARENT = dirname(__file__) +DEBUG = False diff --git a/Contents/Libraries/Shared/tld/exceptions.py b/Contents/Libraries/Shared/tld/exceptions.py new file mode 100644 index 000000000..2f0278b6e --- /dev/null +++ b/Contents/Libraries/Shared/tld/exceptions.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from .conf import get_setting +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'TldBadUrl', u'TldDomainNotFound', + u'TldImproperlyConfigured', u'TldIOError') + + +class TldIOError(IOError): + u'TldIOError.\n\n Supposed to be thrown when problems with reading/writing occur.\n ' + + def __init__(self, msg=None): + tld_names_local_path = get_setting(u'NAMES_LOCAL_PATH') + if (msg is None): + msg = (u"Can't read from or write to the %s file!" % + tld_names_local_path) + super(TldIOError, self).__init__(msg) + + +class TldDomainNotFound(ValueError): + u"TldDomainNotFound.\n\n Supposed to be thrown when domain name is not found (didn't match) the\n local TLD policy.\n " + + def __init__(self, domain_name): + super(TldDomainNotFound, self).__init__( + (u"Domain %s didn't match any existing TLD name!" % domain_name)) + + +class TldBadUrl(ValueError): + u'TldBadUrl.\n\n Supposed to be thrown when bad URL is given.\n ' + + def __init__(self, url): + super(TldBadUrl, self).__init__((u'Is not a valid URL %s!' % url)) + + +class TldImproperlyConfigured(Exception): + u'TldImproperlyConfigured.\n\n Supposed to be thrown when code is improperly configured. Typical use-case\n is when user tries to use `get_tld` function with both `search_public` and\n `search_private` set to False.\n ' + + def __init__(self, msg=None): + if (msg is None): + msg = u'Improperly configured.' + else: + msg = (u'Improperly configured. %s' % msg) + super(TldImproperlyConfigured, self).__init__(msg) diff --git a/Contents/Libraries/Shared/tld/helpers.py b/Contents/Libraries/Shared/tld/helpers.py new file mode 100644 index 000000000..951204dbe --- /dev/null +++ b/Contents/Libraries/Shared/tld/helpers.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from os.path import abspath, join +from .conf import get_setting +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'project_dir', u'PROJECT_DIR') + + +def project_dir(base): + u'Project dir.' + tld_names_local_path_parent = get_setting(u'NAMES_LOCAL_PATH_PARENT') + return abspath(join(tld_names_local_path_parent, base).replace(u'\\', u'/')) + + +PROJECT_DIR = project_dir diff --git a/Contents/Libraries/Shared/tld/parsers/__init__.py b/Contents/Libraries/Shared/tld/parsers/__init__.py new file mode 100644 index 000000000..5eaaa0a68 --- /dev/null +++ b/Contents/Libraries/Shared/tld/parsers/__init__.py @@ -0,0 +1,5 @@ + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals diff --git a/Contents/Libraries/Shared/tld/parsers/mozilla.py b/Contents/Libraries/Shared/tld/parsers/mozilla.py new file mode 100644 index 000000000..5eaaa0a68 --- /dev/null +++ b/Contents/Libraries/Shared/tld/parsers/mozilla.py @@ -0,0 +1,5 @@ + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals diff --git a/Contents/Libraries/Shared/tld/registry.py b/Contents/Libraries/Shared/tld/registry.py new file mode 100644 index 000000000..c83d6abae --- /dev/null +++ b/Contents/Libraries/Shared/tld/registry.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from typing import Type, Dict +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'Registry',) + + +class Registry(type): + REGISTRY = { + + } + + def __new__(cls, name, bases, attrs): + new_cls = type.__new__(cls, name, bases, attrs) + if getattr(new_cls, u'_uid', None): + cls.REGISTRY[new_cls._uid] = new_cls + return new_cls + + @property + def _uid(cls): + return getattr(cls, 'uid', cls.__name__) + + @classmethod + def reset(cls): + cls.REGISTRY = { + + } + + @classmethod + def get(cls, key, default=None): + return cls.REGISTRY.get(key, default) + + @classmethod + def items(cls): + return cls.REGISTRY.items() diff --git a/Contents/Libraries/Shared/tld/res/effective_tld_names.dat.txt b/Contents/Libraries/Shared/tld/res/effective_tld_names.dat.txt new file mode 100644 index 000000000..565efd225 --- /dev/null +++ b/Contents/Libraries/Shared/tld/res/effective_tld_names.dat.txt @@ -0,0 +1,13056 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, +// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. + +// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. + +// ===BEGIN ICANN DOMAINS=== + +// ac : https://en.wikipedia.org/wiki/.ac +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : https://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : https://en.wikipedia.org/wiki/.ae +// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see https://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +freight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : https://www.amnic.net/policy/en/Policy_EN.pdf +am +co.am +com.am +commune.am +net.am +org.am + +// ao : https://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : https://en.wikipedia.org/wiki/.aq +aq + +// ar : https://nic.ar/nic-argentina/normativa-vigente +ar +com.ar +edu.ar +gob.ar +gov.ar +int.ar +mil.ar +musica.ar +net.ar +org.ar +tur.ar + +// arpa : https://en.wikipedia.org/wiki/.arpa +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +arpa +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : https://en.wikipedia.org/wiki/.as +as +gov.as + +// asia : https://en.wikipedia.org/wiki/.asia +asia + +// at : https://en.wikipedia.org/wiki/.at +// Confirmed by registry <it@nic.at> 2008-06-17 +at +ac.at +co.at +gv.at +or.at + +// au : https://en.wikipedia.org/wiki/.au +// http://www.auda.org.au/ +au +// 2LDs +com.au +net.au +org.au +edu.au +gov.au +asn.au +id.au +// Historic 2LDs (closed to new registration, but sites still exist) +info.au +conf.au +oz.au +// CGDNs - http://www.cgdn.org.au/ +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +// 3LDs +act.edu.au +catholic.edu.au +eq.edu.au +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +// act.gov.au Bug 984824 - Removed at request of Greg Tankard +// nsw.gov.au Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au> +// nt.gov.au Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au> +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au +// 4LDs +education.tas.edu.au +schools.nsw.edu.au + +// aw : https://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : https://en.wikipedia.org/wiki/.ax +ax + +// az : https://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf +ba +com.ba +edu.ba +gov.ba +mil.ba +net.ba +org.ba + +// bb : https://en.wikipedia.org/wiki/.bb +bb +biz.bb +co.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb +tv.bb + +// bd : https://en.wikipedia.org/wiki/.bd +*.bd + +// be : https://en.wikipedia.org/wiki/.be +// Confirmed by registry <tech@dns.be> 2008-06-08 +be +ac.be + +// bf : https://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : https://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : https://en.wikipedia.org/wiki/.bh +bh +com.bh +edu.bh +net.bh +org.bh +gov.bh + +// bi : https://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : https://en.wikipedia.org/wiki/.biz +biz + +// bj : https://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : http://www.bnnic.bn/faqs +bn +com.bn +edu.bn +gov.bn +net.bn +org.bn + +// bo : https://nic.bo/delegacion2015.php#h-1.10 +bo +com.bo +edu.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo +web.bo +// Social Domains +academia.bo +agro.bo +arte.bo +blog.bo +bolivia.bo +ciencia.bo +cooperativa.bo +democracia.bo +deporte.bo +ecologia.bo +economia.bo +empresa.bo +indigena.bo +industria.bo +info.bo +medicina.bo +movimiento.bo +musica.bo +natural.bo +nombre.bo +noticias.bo +patria.bo +politica.bo +profesional.bo +plurinacional.bo +pueblo.bo +revista.bo +salud.bo +tecnologia.bo +tksat.bo +transporte.bo +wiki.bo + +// br : http://registro.br/dominio/categoria.html +// Submitted by registry <fneves@registro.br> +br +9guacu.br +abc.br +adm.br +adv.br +agr.br +aju.br +am.br +anani.br +aparecida.br +arq.br +art.br +ato.br +b.br +barueri.br +belem.br +bhz.br +bio.br +blog.br +bmd.br +boavista.br +bsb.br +campinagrande.br +campinas.br +caxias.br +cim.br +cng.br +cnt.br +com.br +contagem.br +coop.br +cri.br +cuiaba.br +curitiba.br +def.br +ecn.br +eco.br +edu.br +emp.br +eng.br +esp.br +etc.br +eti.br +far.br +feira.br +flog.br +floripa.br +fm.br +fnd.br +fortal.br +fot.br +foz.br +fst.br +g12.br +ggf.br +goiania.br +gov.br +// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil +ac.gov.br +al.gov.br +am.gov.br +ap.gov.br +ba.gov.br +ce.gov.br +df.gov.br +es.gov.br +go.gov.br +ma.gov.br +mg.gov.br +ms.gov.br +mt.gov.br +pa.gov.br +pb.gov.br +pe.gov.br +pi.gov.br +pr.gov.br +rj.gov.br +rn.gov.br +ro.gov.br +rr.gov.br +rs.gov.br +sc.gov.br +se.gov.br +sp.gov.br +to.gov.br +gru.br +imb.br +ind.br +inf.br +jab.br +jampa.br +jdf.br +joinville.br +jor.br +jus.br +leg.br +lel.br +londrina.br +macapa.br +maceio.br +manaus.br +maringa.br +mat.br +med.br +mil.br +morena.br +mp.br +mus.br +natal.br +net.br +niteroi.br +*.nom.br +not.br +ntr.br +odo.br +ong.br +org.br +osasco.br +palmas.br +poa.br +ppg.br +pro.br +psc.br +psi.br +pvh.br +qsl.br +radio.br +rec.br +recife.br +ribeirao.br +rio.br +riobranco.br +riopreto.br +salvador.br +sampa.br +santamaria.br +santoandre.br +saobernardo.br +saogonca.br +sjc.br +slg.br +slz.br +sorocaba.br +srv.br +taxi.br +tc.br +teo.br +the.br +tmp.br +trd.br +tur.br +tv.br +udi.br +vet.br +vix.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : https://en.wikipedia.org/wiki/.bt +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt + +// bv : No registrations at this time. +// Submitted by registry <jarle@uninett.no> +bv + +// bw : https://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : https://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : https://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : https://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: https://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : https://en.wikipedia.org/wiki/.cat +cat + +// cc : https://en.wikipedia.org/wiki/.cc +cc + +// cd : https://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : https://en.wikipedia.org/wiki/.cf +cf + +// cg : https://en.wikipedia.org/wiki/.cg +cg + +// ch : https://en.wikipedia.org/wiki/.ch +ch + +// ci : https://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : https://en.wikipedia.org/wiki/.ck +*.ck +!www.ck + +// cl : https://en.wikipedia.org/wiki/.cl +cl +gov.cl +gob.cl +co.cl +mil.cl + +// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 +cm +co.cm +com.cm +gov.cm +net.cm + +// cn : https://en.wikipedia.org/wiki/.cn +// Submitted by registry <tanyaling@cnnic.cn> +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +公司.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : https://en.wikipedia.org/wiki/.co +// Submitted by registry <tecnico@uniandes.edu.co> +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : https://en.wikipedia.org/wiki/.com +com + +// coop : https://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : https://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : https://en.wikipedia.org/wiki/.cv +cv + +// cw : http://www.una.cw/cw_registry/ +// Confirmed by registry <registry@una.net> 2013-03-26 +cw +com.cw +edu.cw +net.cw +org.cw + +// cx : https://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://www.nic.cy/ +// Submitted by registry Panayiotou Fotia <cydns@ucy.ac.cy> +cy +ac.cy +biz.cy +com.cy +ekloges.cy +gov.cy +ltd.cy +name.cy +net.cy +org.cy +parliament.cy +press.cy +pro.cy +tm.cy + +// cz : https://en.wikipedia.org/wiki/.cz +cz + +// de : https://en.wikipedia.org/wiki/.de +// Confirmed by registry <ops@denic.de> (with technical +// reservations) 2008-07-01 +de + +// dj : https://en.wikipedia.org/wiki/.dj +dj + +// dk : https://en.wikipedia.org/wiki/.dk +// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17 +dk + +// dm : https://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : https://en.wikipedia.org/wiki/.do +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do + +// dz : https://en.wikipedia.org/wiki/.dz +dz +com.dz +org.dz +net.dz +gov.dz +edu.dz +asso.dz +pol.dz +art.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry <vabboud@nic.ec> +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +gob.ec +mil.ec + +// edu : https://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : https://en.wikipedia.org/wiki/.eg +eg +com.eg +edu.eg +eun.eg +gov.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg + +// er : https://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : https://en.wikipedia.org/wiki/.et +et +com.et +gov.et +org.et +edu.et +biz.et +name.et +info.et +net.et + +// eu : https://en.wikipedia.org/wiki/.eu +eu + +// fi : https://en.wikipedia.org/wiki/.fi +fi +// aland.fi : https://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi + +// fj : https://en.wikipedia.org/wiki/.fj +*.fj + +// fk : https://en.wikipedia.org/wiki/.fk +*.fk + +// fm : https://en.wikipedia.org/wiki/.fm +fm + +// fo : https://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : https://www.afnic.fr/medias/documents/Cadre_legal/Afnic_Naming_Policy_12122016_VEN.pdf +fr +asso.fr +com.fr +gouv.fr +nom.fr +prd.fr +tm.fr +// domaines sectoriels : https://www.afnic.fr/en/products-and-services/the-fr-tld/sector-based-fr-domains-4.html +aeroport.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : https://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry <Damien.Shaw@ja.net> +gb + +// gd : https://en.wikipedia.org/wiki/.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : https://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +gg +co.gg +net.gg +org.gg + +// gh : https://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : https://en.wikipedia.org/wiki/.gl +// http://nic.gl +gl +co.gl +com.gl +edu.gl +net.gl +org.gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry <randy@psg.com> +gn +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : https://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : https://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry <segred@ics.forth.gr> +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : https://en.wikipedia.org/wiki/.gs +gs + +// gt : http://www.gt/politicas_de_registro.html +gt +com.gt +edu.gt +gob.gt +ind.gt +mil.gt +net.gt +org.gt + +// gu : http://gadao.gov.gu/register.html +// University of Guam : https://www.uog.edu +// Submitted by uognoc@triton.uog.edu +gu +com.gu +edu.gu +gov.gu +guam.gu +info.gu +net.gu +org.gu +web.gu + +// gw : https://en.wikipedia.org/wiki/.gw +gw + +// gy : https://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +edu.gy +gov.gy +net.gy +org.gy + +// hk : https://www.hkirc.hk +// Submitted by registry <hk.tech@hkirc.hk> +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +公司.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : https://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry <pasztor@iszt.hu> 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : https://pandi.id/en/domain/registration-requirements/ +id +ac.id +biz.id +co.id +desa.id +go.id +mil.id +my.id +net.id +or.id +ponpes.id +sch.id +web.id + +// ie : https://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://www.isoc.org.il/domains/ +il +ac.il +co.il +gov.il +idf.il +k12.il +muni.il +net.il +org.il + +// im : https://www.nic.im/ +// Submitted by registry <info@nic.im> +im +ac.im +co.im +com.im +ltd.co.im +net.im +org.im +plc.co.im +tt.im +tv.im + +// in : https://en.wikipedia.org/wiki/.in +// see also: https://registry.in/Policies +// Please note, that nic.in is not an official eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : https://en.wikipedia.org/wiki/.info +info + +// int : https://en.wikipedia.org/wiki/.int +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.html +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules +// Also see http://www.nic.ir/Internationalized_Domain_Names +// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16 +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH) +ایران.ir +// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH) +ايران.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry <marius@isgate.is> 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : https://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// Reserved geo-names (regions and provinces): +// https://www.nic.it/sites/default/files/archivio/docs/Regulation_assignation_v7.1.pdf +// Regions +abr.it +abruzzo.it +aosta-valley.it +aostavalley.it +bas.it +basilicata.it +cal.it +calabria.it +cam.it +campania.it +emilia-romagna.it +emiliaromagna.it +emr.it +friuli-v-giulia.it +friuli-ve-giulia.it +friuli-vegiulia.it +friuli-venezia-giulia.it +friuli-veneziagiulia.it +friuli-vgiulia.it +friuliv-giulia.it +friulive-giulia.it +friulivegiulia.it +friulivenezia-giulia.it +friuliveneziagiulia.it +friulivgiulia.it +fvg.it +laz.it +lazio.it +lig.it +liguria.it +lom.it +lombardia.it +lombardy.it +lucania.it +mar.it +marche.it +mol.it +molise.it +piedmont.it +piemonte.it +pmn.it +pug.it +puglia.it +sar.it +sardegna.it +sardinia.it +sic.it +sicilia.it +sicily.it +taa.it +tos.it +toscana.it +trentin-sud-tirol.it +trentin-süd-tirol.it +trentin-sudtirol.it +trentin-südtirol.it +trentin-sued-tirol.it +trentin-suedtirol.it +trentino-a-adige.it +trentino-aadige.it +trentino-alto-adige.it +trentino-altoadige.it +trentino-s-tirol.it +trentino-stirol.it +trentino-sud-tirol.it +trentino-süd-tirol.it +trentino-sudtirol.it +trentino-südtirol.it +trentino-sued-tirol.it +trentino-suedtirol.it +trentino.it +trentinoa-adige.it +trentinoaadige.it +trentinoalto-adige.it +trentinoaltoadige.it +trentinos-tirol.it +trentinostirol.it +trentinosud-tirol.it +trentinosüd-tirol.it +trentinosudtirol.it +trentinosüdtirol.it +trentinosued-tirol.it +trentinosuedtirol.it +trentinsud-tirol.it +trentinsüd-tirol.it +trentinsudtirol.it +trentinsüdtirol.it +trentinsued-tirol.it +trentinsuedtirol.it +tuscany.it +umb.it +umbria.it +val-d-aosta.it +val-daosta.it +vald-aosta.it +valdaosta.it +valle-aosta.it +valle-d-aosta.it +valle-daosta.it +valleaosta.it +valled-aosta.it +valledaosta.it +vallee-aoste.it +vallée-aoste.it +vallee-d-aoste.it +vallée-d-aoste.it +valleeaoste.it +valléeaoste.it +valleedaoste.it +valléedaoste.it +vao.it +vda.it +ven.it +veneto.it +// Provinces +ag.it +agrigento.it +al.it +alessandria.it +alto-adige.it +altoadige.it +an.it +ancona.it +andria-barletta-trani.it +andria-trani-barletta.it +andriabarlettatrani.it +andriatranibarletta.it +ao.it +aosta.it +aoste.it +ap.it +aq.it +aquila.it +ar.it +arezzo.it +ascoli-piceno.it +ascolipiceno.it +asti.it +at.it +av.it +avellino.it +ba.it +balsan-sudtirol.it +balsan-südtirol.it +balsan-suedtirol.it +balsan.it +bari.it +barletta-trani-andria.it +barlettatraniandria.it +belluno.it +benevento.it +bergamo.it +bg.it +bi.it +biella.it +bl.it +bn.it +bo.it +bologna.it +bolzano-altoadige.it +bolzano.it +bozen-sudtirol.it +bozen-südtirol.it +bozen-suedtirol.it +bozen.it +br.it +brescia.it +brindisi.it +bs.it +bt.it +bulsan-sudtirol.it +bulsan-südtirol.it +bulsan-suedtirol.it +bulsan.it +bz.it +ca.it +cagliari.it +caltanissetta.it +campidano-medio.it +campidanomedio.it +campobasso.it +carbonia-iglesias.it +carboniaiglesias.it +carrara-massa.it +carraramassa.it +caserta.it +catania.it +catanzaro.it +cb.it +ce.it +cesena-forli.it +cesena-forlì.it +cesenaforli.it +cesenaforlì.it +ch.it +chieti.it +ci.it +cl.it +cn.it +co.it +como.it +cosenza.it +cr.it +cremona.it +crotone.it +cs.it +ct.it +cuneo.it +cz.it +dell-ogliastra.it +dellogliastra.it +en.it +enna.it +fc.it +fe.it +fermo.it +ferrara.it +fg.it +fi.it +firenze.it +florence.it +fm.it +foggia.it +forli-cesena.it +forlì-cesena.it +forlicesena.it +forlìcesena.it +fr.it +frosinone.it +ge.it +genoa.it +genova.it +go.it +gorizia.it +gr.it +grosseto.it +iglesias-carbonia.it +iglesiascarbonia.it +im.it +imperia.it +is.it +isernia.it +kr.it +la-spezia.it +laquila.it +laspezia.it +latina.it +lc.it +le.it +lecce.it +lecco.it +li.it +livorno.it +lo.it +lodi.it +lt.it +lu.it +lucca.it +macerata.it +mantova.it +massa-carrara.it +massacarrara.it +matera.it +mb.it +mc.it +me.it +medio-campidano.it +mediocampidano.it +messina.it +mi.it +milan.it +milano.it +mn.it +mo.it +modena.it +monza-brianza.it +monza-e-della-brianza.it +monza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +ms.it +mt.it +na.it +naples.it +napoli.it +no.it +novara.it +nu.it +nuoro.it +og.it +ogliastra.it +olbia-tempio.it +olbiatempio.it +or.it +oristano.it +ot.it +pa.it +padova.it +padua.it +palermo.it +parma.it +pavia.it +pc.it +pd.it +pe.it +perugia.it +pesaro-urbino.it +pesarourbino.it +pescara.it +pg.it +pi.it +piacenza.it +pisa.it +pistoia.it +pn.it +po.it +pordenone.it +potenza.it +pr.it +prato.it +pt.it +pu.it +pv.it +pz.it +ra.it +ragusa.it +ravenna.it +rc.it +re.it +reggio-calabria.it +reggio-emilia.it +reggiocalabria.it +reggioemilia.it +rg.it +ri.it +rieti.it +rimini.it +rm.it +rn.it +ro.it +roma.it +rome.it +rovigo.it +sa.it +salerno.it +sassari.it +savona.it +si.it +siena.it +siracusa.it +so.it +sondrio.it +sp.it +sr.it +ss.it +suedtirol.it +südtirol.it +sv.it +ta.it +taranto.it +te.it +tempio-olbia.it +tempioolbia.it +teramo.it +terni.it +tn.it +to.it +torino.it +tp.it +tr.it +trani-andria-barletta.it +trani-barletta-andria.it +traniandriabarletta.it +tranibarlettaandria.it +trapani.it +trento.it +treviso.it +trieste.it +ts.it +turin.it +tv.it +ud.it +udine.it +urbino-pesaro.it +urbinopesaro.it +va.it +varese.it +vb.it +vc.it +ve.it +venezia.it +venice.it +verbania.it +vercelli.it +verona.it +vi.it +vibo-valentia.it +vibovalentia.it +vicenza.it +viterbo.it +vr.it +vs.it +vt.it +vv.it + +// je : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +je +co.je +net.je +org.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : https://en.wikipedia.org/wiki/.jobs +jobs + +// jp : https://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry <info@jprs.jp> +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp prefecture type names +aichi.jp +akita.jp +aomori.jp +chiba.jp +ehime.jp +fukui.jp +fukuoka.jp +fukushima.jp +gifu.jp +gunma.jp +hiroshima.jp +hokkaido.jp +hyogo.jp +ibaraki.jp +ishikawa.jp +iwate.jp +kagawa.jp +kagoshima.jp +kanagawa.jp +kochi.jp +kumamoto.jp +kyoto.jp +mie.jp +miyagi.jp +miyazaki.jp +nagano.jp +nagasaki.jp +nara.jp +niigata.jp +oita.jp +okayama.jp +okinawa.jp +osaka.jp +saga.jp +saitama.jp +shiga.jp +shimane.jp +shizuoka.jp +tochigi.jp +tokushima.jp +tokyo.jp +tottori.jp +toyama.jp +wakayama.jp +yamagata.jp +yamaguchi.jp +yamanashi.jp +栃木.jp +愛知.jp +愛媛.jp +兵庫.jp +熊本.jp +茨城.jp +北海道.jp +千葉.jp +和歌山.jp +長崎.jp +長野.jp +新潟.jp +青森.jp +静岡.jp +東京.jp +石川.jp +埼玉.jp +三重.jp +京都.jp +佐賀.jp +大分.jp +大阪.jp +奈良.jp +宮城.jp +宮崎.jp +富山.jp +山口.jp +山形.jp +山梨.jp +岩手.jp +岐阜.jp +岡山.jp +島根.jp +広島.jp +徳島.jp +沖縄.jp +滋賀.jp +神奈川.jp +福井.jp +福岡.jp +福島.jp +秋田.jp +群馬.jp +香川.jp +高知.jp +鳥取.jp +鹿児島.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.nagoya.jp +*.sapporo.jp +*.sendai.jp +*.yokohama.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.nagoya.jp +!city.sapporo.jp +!city.sendai.jp +!city.yokohama.jp +// 4th level registration +aisai.aichi.jp +ama.aichi.jp +anjo.aichi.jp +asuke.aichi.jp +chiryu.aichi.jp +chita.aichi.jp +fuso.aichi.jp +gamagori.aichi.jp +handa.aichi.jp +hazu.aichi.jp +hekinan.aichi.jp +higashiura.aichi.jp +ichinomiya.aichi.jp +inazawa.aichi.jp +inuyama.aichi.jp +isshiki.aichi.jp +iwakura.aichi.jp +kanie.aichi.jp +kariya.aichi.jp +kasugai.aichi.jp +kira.aichi.jp +kiyosu.aichi.jp +komaki.aichi.jp +konan.aichi.jp +kota.aichi.jp +mihama.aichi.jp +miyoshi.aichi.jp +nishio.aichi.jp +nisshin.aichi.jp +obu.aichi.jp +oguchi.aichi.jp +oharu.aichi.jp +okazaki.aichi.jp +owariasahi.aichi.jp +seto.aichi.jp +shikatsu.aichi.jp +shinshiro.aichi.jp +shitara.aichi.jp +tahara.aichi.jp +takahama.aichi.jp +tobishima.aichi.jp +toei.aichi.jp +togo.aichi.jp +tokai.aichi.jp +tokoname.aichi.jp +toyoake.aichi.jp +toyohashi.aichi.jp +toyokawa.aichi.jp +toyone.aichi.jp +toyota.aichi.jp +tsushima.aichi.jp +yatomi.aichi.jp +akita.akita.jp +daisen.akita.jp +fujisato.akita.jp +gojome.akita.jp +hachirogata.akita.jp +happou.akita.jp +higashinaruse.akita.jp +honjo.akita.jp +honjyo.akita.jp +ikawa.akita.jp +kamikoani.akita.jp +kamioka.akita.jp +katagami.akita.jp +kazuno.akita.jp +kitaakita.akita.jp +kosaka.akita.jp +kyowa.akita.jp +misato.akita.jp +mitane.akita.jp +moriyoshi.akita.jp +nikaho.akita.jp +noshiro.akita.jp +odate.akita.jp +oga.akita.jp +ogata.akita.jp +semboku.akita.jp +yokote.akita.jp +yurihonjo.akita.jp +aomori.aomori.jp +gonohe.aomori.jp +hachinohe.aomori.jp +hashikami.aomori.jp +hiranai.aomori.jp +hirosaki.aomori.jp +itayanagi.aomori.jp +kuroishi.aomori.jp +misawa.aomori.jp +mutsu.aomori.jp +nakadomari.aomori.jp +noheji.aomori.jp +oirase.aomori.jp +owani.aomori.jp +rokunohe.aomori.jp +sannohe.aomori.jp +shichinohe.aomori.jp +shingo.aomori.jp +takko.aomori.jp +towada.aomori.jp +tsugaru.aomori.jp +tsuruta.aomori.jp +abiko.chiba.jp +asahi.chiba.jp +chonan.chiba.jp +chosei.chiba.jp +choshi.chiba.jp +chuo.chiba.jp +funabashi.chiba.jp +futtsu.chiba.jp +hanamigawa.chiba.jp +ichihara.chiba.jp +ichikawa.chiba.jp +ichinomiya.chiba.jp +inzai.chiba.jp +isumi.chiba.jp +kamagaya.chiba.jp +kamogawa.chiba.jp +kashiwa.chiba.jp +katori.chiba.jp +katsuura.chiba.jp +kimitsu.chiba.jp +kisarazu.chiba.jp +kozaki.chiba.jp +kujukuri.chiba.jp +kyonan.chiba.jp +matsudo.chiba.jp +midori.chiba.jp +mihama.chiba.jp +minamiboso.chiba.jp +mobara.chiba.jp +mutsuzawa.chiba.jp +nagara.chiba.jp +nagareyama.chiba.jp +narashino.chiba.jp +narita.chiba.jp +noda.chiba.jp +oamishirasato.chiba.jp +omigawa.chiba.jp +onjuku.chiba.jp +otaki.chiba.jp +sakae.chiba.jp +sakura.chiba.jp +shimofusa.chiba.jp +shirako.chiba.jp +shiroi.chiba.jp +shisui.chiba.jp +sodegaura.chiba.jp +sosa.chiba.jp +tako.chiba.jp +tateyama.chiba.jp +togane.chiba.jp +tohnosho.chiba.jp +tomisato.chiba.jp +urayasu.chiba.jp +yachimata.chiba.jp +yachiyo.chiba.jp +yokaichiba.chiba.jp +yokoshibahikari.chiba.jp +yotsukaido.chiba.jp +ainan.ehime.jp +honai.ehime.jp +ikata.ehime.jp +imabari.ehime.jp +iyo.ehime.jp +kamijima.ehime.jp +kihoku.ehime.jp +kumakogen.ehime.jp +masaki.ehime.jp +matsuno.ehime.jp +matsuyama.ehime.jp +namikata.ehime.jp +niihama.ehime.jp +ozu.ehime.jp +saijo.ehime.jp +seiyo.ehime.jp +shikokuchuo.ehime.jp +tobe.ehime.jp +toon.ehime.jp +uchiko.ehime.jp +uwajima.ehime.jp +yawatahama.ehime.jp +echizen.fukui.jp +eiheiji.fukui.jp +fukui.fukui.jp +ikeda.fukui.jp +katsuyama.fukui.jp +mihama.fukui.jp +minamiechizen.fukui.jp +obama.fukui.jp +ohi.fukui.jp +ono.fukui.jp +sabae.fukui.jp +sakai.fukui.jp +takahama.fukui.jp +tsuruga.fukui.jp +wakasa.fukui.jp +ashiya.fukuoka.jp +buzen.fukuoka.jp +chikugo.fukuoka.jp +chikuho.fukuoka.jp +chikujo.fukuoka.jp +chikushino.fukuoka.jp +chikuzen.fukuoka.jp +chuo.fukuoka.jp +dazaifu.fukuoka.jp +fukuchi.fukuoka.jp +hakata.fukuoka.jp +higashi.fukuoka.jp +hirokawa.fukuoka.jp +hisayama.fukuoka.jp +iizuka.fukuoka.jp +inatsuki.fukuoka.jp +kaho.fukuoka.jp +kasuga.fukuoka.jp +kasuya.fukuoka.jp +kawara.fukuoka.jp +keisen.fukuoka.jp +koga.fukuoka.jp +kurate.fukuoka.jp +kurogi.fukuoka.jp +kurume.fukuoka.jp +minami.fukuoka.jp +miyako.fukuoka.jp +miyama.fukuoka.jp +miyawaka.fukuoka.jp +mizumaki.fukuoka.jp +munakata.fukuoka.jp +nakagawa.fukuoka.jp +nakama.fukuoka.jp +nishi.fukuoka.jp +nogata.fukuoka.jp +ogori.fukuoka.jp +okagaki.fukuoka.jp +okawa.fukuoka.jp +oki.fukuoka.jp +omuta.fukuoka.jp +onga.fukuoka.jp +onojo.fukuoka.jp +oto.fukuoka.jp +saigawa.fukuoka.jp +sasaguri.fukuoka.jp +shingu.fukuoka.jp +shinyoshitomi.fukuoka.jp +shonai.fukuoka.jp +soeda.fukuoka.jp +sue.fukuoka.jp +tachiarai.fukuoka.jp +tagawa.fukuoka.jp +takata.fukuoka.jp +toho.fukuoka.jp +toyotsu.fukuoka.jp +tsuiki.fukuoka.jp +ukiha.fukuoka.jp +umi.fukuoka.jp +usui.fukuoka.jp +yamada.fukuoka.jp +yame.fukuoka.jp +yanagawa.fukuoka.jp +yukuhashi.fukuoka.jp +aizubange.fukushima.jp +aizumisato.fukushima.jp +aizuwakamatsu.fukushima.jp +asakawa.fukushima.jp +bandai.fukushima.jp +date.fukushima.jp +fukushima.fukushima.jp +furudono.fukushima.jp +futaba.fukushima.jp +hanawa.fukushima.jp +higashi.fukushima.jp +hirata.fukushima.jp +hirono.fukushima.jp +iitate.fukushima.jp +inawashiro.fukushima.jp +ishikawa.fukushima.jp +iwaki.fukushima.jp +izumizaki.fukushima.jp +kagamiishi.fukushima.jp +kaneyama.fukushima.jp +kawamata.fukushima.jp +kitakata.fukushima.jp +kitashiobara.fukushima.jp +koori.fukushima.jp +koriyama.fukushima.jp +kunimi.fukushima.jp +miharu.fukushima.jp +mishima.fukushima.jp +namie.fukushima.jp +nango.fukushima.jp +nishiaizu.fukushima.jp +nishigo.fukushima.jp +okuma.fukushima.jp +omotego.fukushima.jp +ono.fukushima.jp +otama.fukushima.jp +samegawa.fukushima.jp +shimogo.fukushima.jp +shirakawa.fukushima.jp +showa.fukushima.jp +soma.fukushima.jp +sukagawa.fukushima.jp +taishin.fukushima.jp +tamakawa.fukushima.jp +tanagura.fukushima.jp +tenei.fukushima.jp +yabuki.fukushima.jp +yamato.fukushima.jp +yamatsuri.fukushima.jp +yanaizu.fukushima.jp +yugawa.fukushima.jp +anpachi.gifu.jp +ena.gifu.jp +gifu.gifu.jp +ginan.gifu.jp +godo.gifu.jp +gujo.gifu.jp +hashima.gifu.jp +hichiso.gifu.jp +hida.gifu.jp +higashishirakawa.gifu.jp +ibigawa.gifu.jp +ikeda.gifu.jp +kakamigahara.gifu.jp +kani.gifu.jp +kasahara.gifu.jp +kasamatsu.gifu.jp +kawaue.gifu.jp +kitagata.gifu.jp +mino.gifu.jp +minokamo.gifu.jp +mitake.gifu.jp +mizunami.gifu.jp +motosu.gifu.jp +nakatsugawa.gifu.jp +ogaki.gifu.jp +sakahogi.gifu.jp +seki.gifu.jp +sekigahara.gifu.jp +shirakawa.gifu.jp +tajimi.gifu.jp +takayama.gifu.jp +tarui.gifu.jp +toki.gifu.jp +tomika.gifu.jp +wanouchi.gifu.jp +yamagata.gifu.jp +yaotsu.gifu.jp +yoro.gifu.jp +annaka.gunma.jp +chiyoda.gunma.jp +fujioka.gunma.jp +higashiagatsuma.gunma.jp +isesaki.gunma.jp +itakura.gunma.jp +kanna.gunma.jp +kanra.gunma.jp +katashina.gunma.jp +kawaba.gunma.jp +kiryu.gunma.jp +kusatsu.gunma.jp +maebashi.gunma.jp +meiwa.gunma.jp +midori.gunma.jp +minakami.gunma.jp +naganohara.gunma.jp +nakanojo.gunma.jp +nanmoku.gunma.jp +numata.gunma.jp +oizumi.gunma.jp +ora.gunma.jp +ota.gunma.jp +shibukawa.gunma.jp +shimonita.gunma.jp +shinto.gunma.jp +showa.gunma.jp +takasaki.gunma.jp +takayama.gunma.jp +tamamura.gunma.jp +tatebayashi.gunma.jp +tomioka.gunma.jp +tsukiyono.gunma.jp +tsumagoi.gunma.jp +ueno.gunma.jp +yoshioka.gunma.jp +asaminami.hiroshima.jp +daiwa.hiroshima.jp +etajima.hiroshima.jp +fuchu.hiroshima.jp +fukuyama.hiroshima.jp +hatsukaichi.hiroshima.jp +higashihiroshima.hiroshima.jp +hongo.hiroshima.jp +jinsekikogen.hiroshima.jp +kaita.hiroshima.jp +kui.hiroshima.jp +kumano.hiroshima.jp +kure.hiroshima.jp +mihara.hiroshima.jp +miyoshi.hiroshima.jp +naka.hiroshima.jp +onomichi.hiroshima.jp +osakikamijima.hiroshima.jp +otake.hiroshima.jp +saka.hiroshima.jp +sera.hiroshima.jp +seranishi.hiroshima.jp +shinichi.hiroshima.jp +shobara.hiroshima.jp +takehara.hiroshima.jp +abashiri.hokkaido.jp +abira.hokkaido.jp +aibetsu.hokkaido.jp +akabira.hokkaido.jp +akkeshi.hokkaido.jp +asahikawa.hokkaido.jp +ashibetsu.hokkaido.jp +ashoro.hokkaido.jp +assabu.hokkaido.jp +atsuma.hokkaido.jp +bibai.hokkaido.jp +biei.hokkaido.jp +bifuka.hokkaido.jp +bihoro.hokkaido.jp +biratori.hokkaido.jp +chippubetsu.hokkaido.jp +chitose.hokkaido.jp +date.hokkaido.jp +ebetsu.hokkaido.jp +embetsu.hokkaido.jp +eniwa.hokkaido.jp +erimo.hokkaido.jp +esan.hokkaido.jp +esashi.hokkaido.jp +fukagawa.hokkaido.jp +fukushima.hokkaido.jp +furano.hokkaido.jp +furubira.hokkaido.jp +haboro.hokkaido.jp +hakodate.hokkaido.jp +hamatonbetsu.hokkaido.jp +hidaka.hokkaido.jp +higashikagura.hokkaido.jp +higashikawa.hokkaido.jp +hiroo.hokkaido.jp +hokuryu.hokkaido.jp +hokuto.hokkaido.jp +honbetsu.hokkaido.jp +horokanai.hokkaido.jp +horonobe.hokkaido.jp +ikeda.hokkaido.jp +imakane.hokkaido.jp +ishikari.hokkaido.jp +iwamizawa.hokkaido.jp +iwanai.hokkaido.jp +kamifurano.hokkaido.jp +kamikawa.hokkaido.jp +kamishihoro.hokkaido.jp +kamisunagawa.hokkaido.jp +kamoenai.hokkaido.jp +kayabe.hokkaido.jp +kembuchi.hokkaido.jp +kikonai.hokkaido.jp +kimobetsu.hokkaido.jp +kitahiroshima.hokkaido.jp +kitami.hokkaido.jp +kiyosato.hokkaido.jp +koshimizu.hokkaido.jp +kunneppu.hokkaido.jp +kuriyama.hokkaido.jp +kuromatsunai.hokkaido.jp +kushiro.hokkaido.jp +kutchan.hokkaido.jp +kyowa.hokkaido.jp +mashike.hokkaido.jp +matsumae.hokkaido.jp +mikasa.hokkaido.jp +minamifurano.hokkaido.jp +mombetsu.hokkaido.jp +moseushi.hokkaido.jp +mukawa.hokkaido.jp +muroran.hokkaido.jp +naie.hokkaido.jp +nakagawa.hokkaido.jp +nakasatsunai.hokkaido.jp +nakatombetsu.hokkaido.jp +nanae.hokkaido.jp +nanporo.hokkaido.jp +nayoro.hokkaido.jp +nemuro.hokkaido.jp +niikappu.hokkaido.jp +niki.hokkaido.jp +nishiokoppe.hokkaido.jp +noboribetsu.hokkaido.jp +numata.hokkaido.jp +obihiro.hokkaido.jp +obira.hokkaido.jp +oketo.hokkaido.jp +okoppe.hokkaido.jp +otaru.hokkaido.jp +otobe.hokkaido.jp +otofuke.hokkaido.jp +otoineppu.hokkaido.jp +oumu.hokkaido.jp +ozora.hokkaido.jp +pippu.hokkaido.jp +rankoshi.hokkaido.jp +rebun.hokkaido.jp +rikubetsu.hokkaido.jp +rishiri.hokkaido.jp +rishirifuji.hokkaido.jp +saroma.hokkaido.jp +sarufutsu.hokkaido.jp +shakotan.hokkaido.jp +shari.hokkaido.jp +shibecha.hokkaido.jp +shibetsu.hokkaido.jp +shikabe.hokkaido.jp +shikaoi.hokkaido.jp +shimamaki.hokkaido.jp +shimizu.hokkaido.jp +shimokawa.hokkaido.jp +shinshinotsu.hokkaido.jp +shintoku.hokkaido.jp +shiranuka.hokkaido.jp +shiraoi.hokkaido.jp +shiriuchi.hokkaido.jp +sobetsu.hokkaido.jp +sunagawa.hokkaido.jp +taiki.hokkaido.jp +takasu.hokkaido.jp +takikawa.hokkaido.jp +takinoue.hokkaido.jp +teshikaga.hokkaido.jp +tobetsu.hokkaido.jp +tohma.hokkaido.jp +tomakomai.hokkaido.jp +tomari.hokkaido.jp +toya.hokkaido.jp +toyako.hokkaido.jp +toyotomi.hokkaido.jp +toyoura.hokkaido.jp +tsubetsu.hokkaido.jp +tsukigata.hokkaido.jp +urakawa.hokkaido.jp +urausu.hokkaido.jp +uryu.hokkaido.jp +utashinai.hokkaido.jp +wakkanai.hokkaido.jp +wassamu.hokkaido.jp +yakumo.hokkaido.jp +yoichi.hokkaido.jp +aioi.hyogo.jp +akashi.hyogo.jp +ako.hyogo.jp +amagasaki.hyogo.jp +aogaki.hyogo.jp +asago.hyogo.jp +ashiya.hyogo.jp +awaji.hyogo.jp +fukusaki.hyogo.jp +goshiki.hyogo.jp +harima.hyogo.jp +himeji.hyogo.jp +ichikawa.hyogo.jp +inagawa.hyogo.jp +itami.hyogo.jp +kakogawa.hyogo.jp +kamigori.hyogo.jp +kamikawa.hyogo.jp +kasai.hyogo.jp +kasuga.hyogo.jp +kawanishi.hyogo.jp +miki.hyogo.jp +minamiawaji.hyogo.jp +nishinomiya.hyogo.jp +nishiwaki.hyogo.jp +ono.hyogo.jp +sanda.hyogo.jp +sannan.hyogo.jp +sasayama.hyogo.jp +sayo.hyogo.jp +shingu.hyogo.jp +shinonsen.hyogo.jp +shiso.hyogo.jp +sumoto.hyogo.jp +taishi.hyogo.jp +taka.hyogo.jp +takarazuka.hyogo.jp +takasago.hyogo.jp +takino.hyogo.jp +tamba.hyogo.jp +tatsuno.hyogo.jp +toyooka.hyogo.jp +yabu.hyogo.jp +yashiro.hyogo.jp +yoka.hyogo.jp +yokawa.hyogo.jp +ami.ibaraki.jp +asahi.ibaraki.jp +bando.ibaraki.jp +chikusei.ibaraki.jp +daigo.ibaraki.jp +fujishiro.ibaraki.jp +hitachi.ibaraki.jp +hitachinaka.ibaraki.jp +hitachiomiya.ibaraki.jp +hitachiota.ibaraki.jp +ibaraki.ibaraki.jp +ina.ibaraki.jp +inashiki.ibaraki.jp +itako.ibaraki.jp +iwama.ibaraki.jp +joso.ibaraki.jp +kamisu.ibaraki.jp +kasama.ibaraki.jp +kashima.ibaraki.jp +kasumigaura.ibaraki.jp +koga.ibaraki.jp +miho.ibaraki.jp +mito.ibaraki.jp +moriya.ibaraki.jp +naka.ibaraki.jp +namegata.ibaraki.jp +oarai.ibaraki.jp +ogawa.ibaraki.jp +omitama.ibaraki.jp +ryugasaki.ibaraki.jp +sakai.ibaraki.jp +sakuragawa.ibaraki.jp +shimodate.ibaraki.jp +shimotsuma.ibaraki.jp +shirosato.ibaraki.jp +sowa.ibaraki.jp +suifu.ibaraki.jp +takahagi.ibaraki.jp +tamatsukuri.ibaraki.jp +tokai.ibaraki.jp +tomobe.ibaraki.jp +tone.ibaraki.jp +toride.ibaraki.jp +tsuchiura.ibaraki.jp +tsukuba.ibaraki.jp +uchihara.ibaraki.jp +ushiku.ibaraki.jp +yachiyo.ibaraki.jp +yamagata.ibaraki.jp +yawara.ibaraki.jp +yuki.ibaraki.jp +anamizu.ishikawa.jp +hakui.ishikawa.jp +hakusan.ishikawa.jp +kaga.ishikawa.jp +kahoku.ishikawa.jp +kanazawa.ishikawa.jp +kawakita.ishikawa.jp +komatsu.ishikawa.jp +nakanoto.ishikawa.jp +nanao.ishikawa.jp +nomi.ishikawa.jp +nonoichi.ishikawa.jp +noto.ishikawa.jp +shika.ishikawa.jp +suzu.ishikawa.jp +tsubata.ishikawa.jp +tsurugi.ishikawa.jp +uchinada.ishikawa.jp +wajima.ishikawa.jp +fudai.iwate.jp +fujisawa.iwate.jp +hanamaki.iwate.jp +hiraizumi.iwate.jp +hirono.iwate.jp +ichinohe.iwate.jp +ichinoseki.iwate.jp +iwaizumi.iwate.jp +iwate.iwate.jp +joboji.iwate.jp +kamaishi.iwate.jp +kanegasaki.iwate.jp +karumai.iwate.jp +kawai.iwate.jp +kitakami.iwate.jp +kuji.iwate.jp +kunohe.iwate.jp +kuzumaki.iwate.jp +miyako.iwate.jp +mizusawa.iwate.jp +morioka.iwate.jp +ninohe.iwate.jp +noda.iwate.jp +ofunato.iwate.jp +oshu.iwate.jp +otsuchi.iwate.jp +rikuzentakata.iwate.jp +shiwa.iwate.jp +shizukuishi.iwate.jp +sumita.iwate.jp +tanohata.iwate.jp +tono.iwate.jp +yahaba.iwate.jp +yamada.iwate.jp +ayagawa.kagawa.jp +higashikagawa.kagawa.jp +kanonji.kagawa.jp +kotohira.kagawa.jp +manno.kagawa.jp +marugame.kagawa.jp +mitoyo.kagawa.jp +naoshima.kagawa.jp +sanuki.kagawa.jp +tadotsu.kagawa.jp +takamatsu.kagawa.jp +tonosho.kagawa.jp +uchinomi.kagawa.jp +utazu.kagawa.jp +zentsuji.kagawa.jp +akune.kagoshima.jp +amami.kagoshima.jp +hioki.kagoshima.jp +isa.kagoshima.jp +isen.kagoshima.jp +izumi.kagoshima.jp +kagoshima.kagoshima.jp +kanoya.kagoshima.jp +kawanabe.kagoshima.jp +kinko.kagoshima.jp +kouyama.kagoshima.jp +makurazaki.kagoshima.jp +matsumoto.kagoshima.jp +minamitane.kagoshima.jp +nakatane.kagoshima.jp +nishinoomote.kagoshima.jp +satsumasendai.kagoshima.jp +soo.kagoshima.jp +tarumizu.kagoshima.jp +yusui.kagoshima.jp +aikawa.kanagawa.jp +atsugi.kanagawa.jp +ayase.kanagawa.jp +chigasaki.kanagawa.jp +ebina.kanagawa.jp +fujisawa.kanagawa.jp +hadano.kanagawa.jp +hakone.kanagawa.jp +hiratsuka.kanagawa.jp +isehara.kanagawa.jp +kaisei.kanagawa.jp +kamakura.kanagawa.jp +kiyokawa.kanagawa.jp +matsuda.kanagawa.jp +minamiashigara.kanagawa.jp +miura.kanagawa.jp +nakai.kanagawa.jp +ninomiya.kanagawa.jp +odawara.kanagawa.jp +oi.kanagawa.jp +oiso.kanagawa.jp +sagamihara.kanagawa.jp +samukawa.kanagawa.jp +tsukui.kanagawa.jp +yamakita.kanagawa.jp +yamato.kanagawa.jp +yokosuka.kanagawa.jp +yugawara.kanagawa.jp +zama.kanagawa.jp +zushi.kanagawa.jp +aki.kochi.jp +geisei.kochi.jp +hidaka.kochi.jp +higashitsuno.kochi.jp +ino.kochi.jp +kagami.kochi.jp +kami.kochi.jp +kitagawa.kochi.jp +kochi.kochi.jp +mihara.kochi.jp +motoyama.kochi.jp +muroto.kochi.jp +nahari.kochi.jp +nakamura.kochi.jp +nankoku.kochi.jp +nishitosa.kochi.jp +niyodogawa.kochi.jp +ochi.kochi.jp +okawa.kochi.jp +otoyo.kochi.jp +otsuki.kochi.jp +sakawa.kochi.jp +sukumo.kochi.jp +susaki.kochi.jp +tosa.kochi.jp +tosashimizu.kochi.jp +toyo.kochi.jp +tsuno.kochi.jp +umaji.kochi.jp +yasuda.kochi.jp +yusuhara.kochi.jp +amakusa.kumamoto.jp +arao.kumamoto.jp +aso.kumamoto.jp +choyo.kumamoto.jp +gyokuto.kumamoto.jp +kamiamakusa.kumamoto.jp +kikuchi.kumamoto.jp +kumamoto.kumamoto.jp +mashiki.kumamoto.jp +mifune.kumamoto.jp +minamata.kumamoto.jp +minamioguni.kumamoto.jp +nagasu.kumamoto.jp +nishihara.kumamoto.jp +oguni.kumamoto.jp +ozu.kumamoto.jp +sumoto.kumamoto.jp +takamori.kumamoto.jp +uki.kumamoto.jp +uto.kumamoto.jp +yamaga.kumamoto.jp +yamato.kumamoto.jp +yatsushiro.kumamoto.jp +ayabe.kyoto.jp +fukuchiyama.kyoto.jp +higashiyama.kyoto.jp +ide.kyoto.jp +ine.kyoto.jp +joyo.kyoto.jp +kameoka.kyoto.jp +kamo.kyoto.jp +kita.kyoto.jp +kizu.kyoto.jp +kumiyama.kyoto.jp +kyotamba.kyoto.jp +kyotanabe.kyoto.jp +kyotango.kyoto.jp +maizuru.kyoto.jp +minami.kyoto.jp +minamiyamashiro.kyoto.jp +miyazu.kyoto.jp +muko.kyoto.jp +nagaokakyo.kyoto.jp +nakagyo.kyoto.jp +nantan.kyoto.jp +oyamazaki.kyoto.jp +sakyo.kyoto.jp +seika.kyoto.jp +tanabe.kyoto.jp +uji.kyoto.jp +ujitawara.kyoto.jp +wazuka.kyoto.jp +yamashina.kyoto.jp +yawata.kyoto.jp +asahi.mie.jp +inabe.mie.jp +ise.mie.jp +kameyama.mie.jp +kawagoe.mie.jp +kiho.mie.jp +kisosaki.mie.jp +kiwa.mie.jp +komono.mie.jp +kumano.mie.jp +kuwana.mie.jp +matsusaka.mie.jp +meiwa.mie.jp +mihama.mie.jp +minamiise.mie.jp +misugi.mie.jp +miyama.mie.jp +nabari.mie.jp +shima.mie.jp +suzuka.mie.jp +tado.mie.jp +taiki.mie.jp +taki.mie.jp +tamaki.mie.jp +toba.mie.jp +tsu.mie.jp +udono.mie.jp +ureshino.mie.jp +watarai.mie.jp +yokkaichi.mie.jp +furukawa.miyagi.jp +higashimatsushima.miyagi.jp +ishinomaki.miyagi.jp +iwanuma.miyagi.jp +kakuda.miyagi.jp +kami.miyagi.jp +kawasaki.miyagi.jp +marumori.miyagi.jp +matsushima.miyagi.jp +minamisanriku.miyagi.jp +misato.miyagi.jp +murata.miyagi.jp +natori.miyagi.jp +ogawara.miyagi.jp +ohira.miyagi.jp +onagawa.miyagi.jp +osaki.miyagi.jp +rifu.miyagi.jp +semine.miyagi.jp +shibata.miyagi.jp +shichikashuku.miyagi.jp +shikama.miyagi.jp +shiogama.miyagi.jp +shiroishi.miyagi.jp +tagajo.miyagi.jp +taiwa.miyagi.jp +tome.miyagi.jp +tomiya.miyagi.jp +wakuya.miyagi.jp +watari.miyagi.jp +yamamoto.miyagi.jp +zao.miyagi.jp +aya.miyazaki.jp +ebino.miyazaki.jp +gokase.miyazaki.jp +hyuga.miyazaki.jp +kadogawa.miyazaki.jp +kawaminami.miyazaki.jp +kijo.miyazaki.jp +kitagawa.miyazaki.jp +kitakata.miyazaki.jp +kitaura.miyazaki.jp +kobayashi.miyazaki.jp +kunitomi.miyazaki.jp +kushima.miyazaki.jp +mimata.miyazaki.jp +miyakonojo.miyazaki.jp +miyazaki.miyazaki.jp +morotsuka.miyazaki.jp +nichinan.miyazaki.jp +nishimera.miyazaki.jp +nobeoka.miyazaki.jp +saito.miyazaki.jp +shiiba.miyazaki.jp +shintomi.miyazaki.jp +takaharu.miyazaki.jp +takanabe.miyazaki.jp +takazaki.miyazaki.jp +tsuno.miyazaki.jp +achi.nagano.jp +agematsu.nagano.jp +anan.nagano.jp +aoki.nagano.jp +asahi.nagano.jp +azumino.nagano.jp +chikuhoku.nagano.jp +chikuma.nagano.jp +chino.nagano.jp +fujimi.nagano.jp +hakuba.nagano.jp +hara.nagano.jp +hiraya.nagano.jp +iida.nagano.jp +iijima.nagano.jp +iiyama.nagano.jp +iizuna.nagano.jp +ikeda.nagano.jp +ikusaka.nagano.jp +ina.nagano.jp +karuizawa.nagano.jp +kawakami.nagano.jp +kiso.nagano.jp +kisofukushima.nagano.jp +kitaaiki.nagano.jp +komagane.nagano.jp +komoro.nagano.jp +matsukawa.nagano.jp +matsumoto.nagano.jp +miasa.nagano.jp +minamiaiki.nagano.jp +minamimaki.nagano.jp +minamiminowa.nagano.jp +minowa.nagano.jp +miyada.nagano.jp +miyota.nagano.jp +mochizuki.nagano.jp +nagano.nagano.jp +nagawa.nagano.jp +nagiso.nagano.jp +nakagawa.nagano.jp +nakano.nagano.jp +nozawaonsen.nagano.jp +obuse.nagano.jp +ogawa.nagano.jp +okaya.nagano.jp +omachi.nagano.jp +omi.nagano.jp +ookuwa.nagano.jp +ooshika.nagano.jp +otaki.nagano.jp +otari.nagano.jp +sakae.nagano.jp +sakaki.nagano.jp +saku.nagano.jp +sakuho.nagano.jp +shimosuwa.nagano.jp +shinanomachi.nagano.jp +shiojiri.nagano.jp +suwa.nagano.jp +suzaka.nagano.jp +takagi.nagano.jp +takamori.nagano.jp +takayama.nagano.jp +tateshina.nagano.jp +tatsuno.nagano.jp +togakushi.nagano.jp +togura.nagano.jp +tomi.nagano.jp +ueda.nagano.jp +wada.nagano.jp +yamagata.nagano.jp +yamanouchi.nagano.jp +yasaka.nagano.jp +yasuoka.nagano.jp +chijiwa.nagasaki.jp +futsu.nagasaki.jp +goto.nagasaki.jp +hasami.nagasaki.jp +hirado.nagasaki.jp +iki.nagasaki.jp +isahaya.nagasaki.jp +kawatana.nagasaki.jp +kuchinotsu.nagasaki.jp +matsuura.nagasaki.jp +nagasaki.nagasaki.jp +obama.nagasaki.jp +omura.nagasaki.jp +oseto.nagasaki.jp +saikai.nagasaki.jp +sasebo.nagasaki.jp +seihi.nagasaki.jp +shimabara.nagasaki.jp +shinkamigoto.nagasaki.jp +togitsu.nagasaki.jp +tsushima.nagasaki.jp +unzen.nagasaki.jp +ando.nara.jp +gose.nara.jp +heguri.nara.jp +higashiyoshino.nara.jp +ikaruga.nara.jp +ikoma.nara.jp +kamikitayama.nara.jp +kanmaki.nara.jp +kashiba.nara.jp +kashihara.nara.jp +katsuragi.nara.jp +kawai.nara.jp +kawakami.nara.jp +kawanishi.nara.jp +koryo.nara.jp +kurotaki.nara.jp +mitsue.nara.jp +miyake.nara.jp +nara.nara.jp +nosegawa.nara.jp +oji.nara.jp +ouda.nara.jp +oyodo.nara.jp +sakurai.nara.jp +sango.nara.jp +shimoichi.nara.jp +shimokitayama.nara.jp +shinjo.nara.jp +soni.nara.jp +takatori.nara.jp +tawaramoto.nara.jp +tenkawa.nara.jp +tenri.nara.jp +uda.nara.jp +yamatokoriyama.nara.jp +yamatotakada.nara.jp +yamazoe.nara.jp +yoshino.nara.jp +aga.niigata.jp +agano.niigata.jp +gosen.niigata.jp +itoigawa.niigata.jp +izumozaki.niigata.jp +joetsu.niigata.jp +kamo.niigata.jp +kariwa.niigata.jp +kashiwazaki.niigata.jp +minamiuonuma.niigata.jp +mitsuke.niigata.jp +muika.niigata.jp +murakami.niigata.jp +myoko.niigata.jp +nagaoka.niigata.jp +niigata.niigata.jp +ojiya.niigata.jp +omi.niigata.jp +sado.niigata.jp +sanjo.niigata.jp +seiro.niigata.jp +seirou.niigata.jp +sekikawa.niigata.jp +shibata.niigata.jp +tagami.niigata.jp +tainai.niigata.jp +tochio.niigata.jp +tokamachi.niigata.jp +tsubame.niigata.jp +tsunan.niigata.jp +uonuma.niigata.jp +yahiko.niigata.jp +yoita.niigata.jp +yuzawa.niigata.jp +beppu.oita.jp +bungoono.oita.jp +bungotakada.oita.jp +hasama.oita.jp +hiji.oita.jp +himeshima.oita.jp +hita.oita.jp +kamitsue.oita.jp +kokonoe.oita.jp +kuju.oita.jp +kunisaki.oita.jp +kusu.oita.jp +oita.oita.jp +saiki.oita.jp +taketa.oita.jp +tsukumi.oita.jp +usa.oita.jp +usuki.oita.jp +yufu.oita.jp +akaiwa.okayama.jp +asakuchi.okayama.jp +bizen.okayama.jp +hayashima.okayama.jp +ibara.okayama.jp +kagamino.okayama.jp +kasaoka.okayama.jp +kibichuo.okayama.jp +kumenan.okayama.jp +kurashiki.okayama.jp +maniwa.okayama.jp +misaki.okayama.jp +nagi.okayama.jp +niimi.okayama.jp +nishiawakura.okayama.jp +okayama.okayama.jp +satosho.okayama.jp +setouchi.okayama.jp +shinjo.okayama.jp +shoo.okayama.jp +soja.okayama.jp +takahashi.okayama.jp +tamano.okayama.jp +tsuyama.okayama.jp +wake.okayama.jp +yakage.okayama.jp +aguni.okinawa.jp +ginowan.okinawa.jp +ginoza.okinawa.jp +gushikami.okinawa.jp +haebaru.okinawa.jp +higashi.okinawa.jp +hirara.okinawa.jp +iheya.okinawa.jp +ishigaki.okinawa.jp +ishikawa.okinawa.jp +itoman.okinawa.jp +izena.okinawa.jp +kadena.okinawa.jp +kin.okinawa.jp +kitadaito.okinawa.jp +kitanakagusuku.okinawa.jp +kumejima.okinawa.jp +kunigami.okinawa.jp +minamidaito.okinawa.jp +motobu.okinawa.jp +nago.okinawa.jp +naha.okinawa.jp +nakagusuku.okinawa.jp +nakijin.okinawa.jp +nanjo.okinawa.jp +nishihara.okinawa.jp +ogimi.okinawa.jp +okinawa.okinawa.jp +onna.okinawa.jp +shimoji.okinawa.jp +taketomi.okinawa.jp +tarama.okinawa.jp +tokashiki.okinawa.jp +tomigusuku.okinawa.jp +tonaki.okinawa.jp +urasoe.okinawa.jp +uruma.okinawa.jp +yaese.okinawa.jp +yomitan.okinawa.jp +yonabaru.okinawa.jp +yonaguni.okinawa.jp +zamami.okinawa.jp +abeno.osaka.jp +chihayaakasaka.osaka.jp +chuo.osaka.jp +daito.osaka.jp +fujiidera.osaka.jp +habikino.osaka.jp +hannan.osaka.jp +higashiosaka.osaka.jp +higashisumiyoshi.osaka.jp +higashiyodogawa.osaka.jp +hirakata.osaka.jp +ibaraki.osaka.jp +ikeda.osaka.jp +izumi.osaka.jp +izumiotsu.osaka.jp +izumisano.osaka.jp +kadoma.osaka.jp +kaizuka.osaka.jp +kanan.osaka.jp +kashiwara.osaka.jp +katano.osaka.jp +kawachinagano.osaka.jp +kishiwada.osaka.jp +kita.osaka.jp +kumatori.osaka.jp +matsubara.osaka.jp +minato.osaka.jp +minoh.osaka.jp +misaki.osaka.jp +moriguchi.osaka.jp +neyagawa.osaka.jp +nishi.osaka.jp +nose.osaka.jp +osakasayama.osaka.jp +sakai.osaka.jp +sayama.osaka.jp +sennan.osaka.jp +settsu.osaka.jp +shijonawate.osaka.jp +shimamoto.osaka.jp +suita.osaka.jp +tadaoka.osaka.jp +taishi.osaka.jp +tajiri.osaka.jp +takaishi.osaka.jp +takatsuki.osaka.jp +tondabayashi.osaka.jp +toyonaka.osaka.jp +toyono.osaka.jp +yao.osaka.jp +ariake.saga.jp +arita.saga.jp +fukudomi.saga.jp +genkai.saga.jp +hamatama.saga.jp +hizen.saga.jp +imari.saga.jp +kamimine.saga.jp +kanzaki.saga.jp +karatsu.saga.jp +kashima.saga.jp +kitagata.saga.jp +kitahata.saga.jp +kiyama.saga.jp +kouhoku.saga.jp +kyuragi.saga.jp +nishiarita.saga.jp +ogi.saga.jp +omachi.saga.jp +ouchi.saga.jp +saga.saga.jp +shiroishi.saga.jp +taku.saga.jp +tara.saga.jp +tosu.saga.jp +yoshinogari.saga.jp +arakawa.saitama.jp +asaka.saitama.jp +chichibu.saitama.jp +fujimi.saitama.jp +fujimino.saitama.jp +fukaya.saitama.jp +hanno.saitama.jp +hanyu.saitama.jp +hasuda.saitama.jp +hatogaya.saitama.jp +hatoyama.saitama.jp +hidaka.saitama.jp +higashichichibu.saitama.jp +higashimatsuyama.saitama.jp +honjo.saitama.jp +ina.saitama.jp +iruma.saitama.jp +iwatsuki.saitama.jp +kamiizumi.saitama.jp +kamikawa.saitama.jp +kamisato.saitama.jp +kasukabe.saitama.jp +kawagoe.saitama.jp +kawaguchi.saitama.jp +kawajima.saitama.jp +kazo.saitama.jp +kitamoto.saitama.jp +koshigaya.saitama.jp +kounosu.saitama.jp +kuki.saitama.jp +kumagaya.saitama.jp +matsubushi.saitama.jp +minano.saitama.jp +misato.saitama.jp +miyashiro.saitama.jp +miyoshi.saitama.jp +moroyama.saitama.jp +nagatoro.saitama.jp +namegawa.saitama.jp +niiza.saitama.jp +ogano.saitama.jp +ogawa.saitama.jp +ogose.saitama.jp +okegawa.saitama.jp +omiya.saitama.jp +otaki.saitama.jp +ranzan.saitama.jp +ryokami.saitama.jp +saitama.saitama.jp +sakado.saitama.jp +satte.saitama.jp +sayama.saitama.jp +shiki.saitama.jp +shiraoka.saitama.jp +soka.saitama.jp +sugito.saitama.jp +toda.saitama.jp +tokigawa.saitama.jp +tokorozawa.saitama.jp +tsurugashima.saitama.jp +urawa.saitama.jp +warabi.saitama.jp +yashio.saitama.jp +yokoze.saitama.jp +yono.saitama.jp +yorii.saitama.jp +yoshida.saitama.jp +yoshikawa.saitama.jp +yoshimi.saitama.jp +aisho.shiga.jp +gamo.shiga.jp +higashiomi.shiga.jp +hikone.shiga.jp +koka.shiga.jp +konan.shiga.jp +kosei.shiga.jp +koto.shiga.jp +kusatsu.shiga.jp +maibara.shiga.jp +moriyama.shiga.jp +nagahama.shiga.jp +nishiazai.shiga.jp +notogawa.shiga.jp +omihachiman.shiga.jp +otsu.shiga.jp +ritto.shiga.jp +ryuoh.shiga.jp +takashima.shiga.jp +takatsuki.shiga.jp +torahime.shiga.jp +toyosato.shiga.jp +yasu.shiga.jp +akagi.shimane.jp +ama.shimane.jp +gotsu.shimane.jp +hamada.shimane.jp +higashiizumo.shimane.jp +hikawa.shimane.jp +hikimi.shimane.jp +izumo.shimane.jp +kakinoki.shimane.jp +masuda.shimane.jp +matsue.shimane.jp +misato.shimane.jp +nishinoshima.shimane.jp +ohda.shimane.jp +okinoshima.shimane.jp +okuizumo.shimane.jp +shimane.shimane.jp +tamayu.shimane.jp +tsuwano.shimane.jp +unnan.shimane.jp +yakumo.shimane.jp +yasugi.shimane.jp +yatsuka.shimane.jp +arai.shizuoka.jp +atami.shizuoka.jp +fuji.shizuoka.jp +fujieda.shizuoka.jp +fujikawa.shizuoka.jp +fujinomiya.shizuoka.jp +fukuroi.shizuoka.jp +gotemba.shizuoka.jp +haibara.shizuoka.jp +hamamatsu.shizuoka.jp +higashiizu.shizuoka.jp +ito.shizuoka.jp +iwata.shizuoka.jp +izu.shizuoka.jp +izunokuni.shizuoka.jp +kakegawa.shizuoka.jp +kannami.shizuoka.jp +kawanehon.shizuoka.jp +kawazu.shizuoka.jp +kikugawa.shizuoka.jp +kosai.shizuoka.jp +makinohara.shizuoka.jp +matsuzaki.shizuoka.jp +minamiizu.shizuoka.jp +mishima.shizuoka.jp +morimachi.shizuoka.jp +nishiizu.shizuoka.jp +numazu.shizuoka.jp +omaezaki.shizuoka.jp +shimada.shizuoka.jp +shimizu.shizuoka.jp +shimoda.shizuoka.jp +shizuoka.shizuoka.jp +susono.shizuoka.jp +yaizu.shizuoka.jp +yoshida.shizuoka.jp +ashikaga.tochigi.jp +bato.tochigi.jp +haga.tochigi.jp +ichikai.tochigi.jp +iwafune.tochigi.jp +kaminokawa.tochigi.jp +kanuma.tochigi.jp +karasuyama.tochigi.jp +kuroiso.tochigi.jp +mashiko.tochigi.jp +mibu.tochigi.jp +moka.tochigi.jp +motegi.tochigi.jp +nasu.tochigi.jp +nasushiobara.tochigi.jp +nikko.tochigi.jp +nishikata.tochigi.jp +nogi.tochigi.jp +ohira.tochigi.jp +ohtawara.tochigi.jp +oyama.tochigi.jp +sakura.tochigi.jp +sano.tochigi.jp +shimotsuke.tochigi.jp +shioya.tochigi.jp +takanezawa.tochigi.jp +tochigi.tochigi.jp +tsuga.tochigi.jp +ujiie.tochigi.jp +utsunomiya.tochigi.jp +yaita.tochigi.jp +aizumi.tokushima.jp +anan.tokushima.jp +ichiba.tokushima.jp +itano.tokushima.jp +kainan.tokushima.jp +komatsushima.tokushima.jp +matsushige.tokushima.jp +mima.tokushima.jp +minami.tokushima.jp +miyoshi.tokushima.jp +mugi.tokushima.jp +nakagawa.tokushima.jp +naruto.tokushima.jp +sanagochi.tokushima.jp +shishikui.tokushima.jp +tokushima.tokushima.jp +wajiki.tokushima.jp +adachi.tokyo.jp +akiruno.tokyo.jp +akishima.tokyo.jp +aogashima.tokyo.jp +arakawa.tokyo.jp +bunkyo.tokyo.jp +chiyoda.tokyo.jp +chofu.tokyo.jp +chuo.tokyo.jp +edogawa.tokyo.jp +fuchu.tokyo.jp +fussa.tokyo.jp +hachijo.tokyo.jp +hachioji.tokyo.jp +hamura.tokyo.jp +higashikurume.tokyo.jp +higashimurayama.tokyo.jp +higashiyamato.tokyo.jp +hino.tokyo.jp +hinode.tokyo.jp +hinohara.tokyo.jp +inagi.tokyo.jp +itabashi.tokyo.jp +katsushika.tokyo.jp +kita.tokyo.jp +kiyose.tokyo.jp +kodaira.tokyo.jp +koganei.tokyo.jp +kokubunji.tokyo.jp +komae.tokyo.jp +koto.tokyo.jp +kouzushima.tokyo.jp +kunitachi.tokyo.jp +machida.tokyo.jp +meguro.tokyo.jp +minato.tokyo.jp +mitaka.tokyo.jp +mizuho.tokyo.jp +musashimurayama.tokyo.jp +musashino.tokyo.jp +nakano.tokyo.jp +nerima.tokyo.jp +ogasawara.tokyo.jp +okutama.tokyo.jp +ome.tokyo.jp +oshima.tokyo.jp +ota.tokyo.jp +setagaya.tokyo.jp +shibuya.tokyo.jp +shinagawa.tokyo.jp +shinjuku.tokyo.jp +suginami.tokyo.jp +sumida.tokyo.jp +tachikawa.tokyo.jp +taito.tokyo.jp +tama.tokyo.jp +toshima.tokyo.jp +chizu.tottori.jp +hino.tottori.jp +kawahara.tottori.jp +koge.tottori.jp +kotoura.tottori.jp +misasa.tottori.jp +nanbu.tottori.jp +nichinan.tottori.jp +sakaiminato.tottori.jp +tottori.tottori.jp +wakasa.tottori.jp +yazu.tottori.jp +yonago.tottori.jp +asahi.toyama.jp +fuchu.toyama.jp +fukumitsu.toyama.jp +funahashi.toyama.jp +himi.toyama.jp +imizu.toyama.jp +inami.toyama.jp +johana.toyama.jp +kamiichi.toyama.jp +kurobe.toyama.jp +nakaniikawa.toyama.jp +namerikawa.toyama.jp +nanto.toyama.jp +nyuzen.toyama.jp +oyabe.toyama.jp +taira.toyama.jp +takaoka.toyama.jp +tateyama.toyama.jp +toga.toyama.jp +tonami.toyama.jp +toyama.toyama.jp +unazuki.toyama.jp +uozu.toyama.jp +yamada.toyama.jp +arida.wakayama.jp +aridagawa.wakayama.jp +gobo.wakayama.jp +hashimoto.wakayama.jp +hidaka.wakayama.jp +hirogawa.wakayama.jp +inami.wakayama.jp +iwade.wakayama.jp +kainan.wakayama.jp +kamitonda.wakayama.jp +katsuragi.wakayama.jp +kimino.wakayama.jp +kinokawa.wakayama.jp +kitayama.wakayama.jp +koya.wakayama.jp +koza.wakayama.jp +kozagawa.wakayama.jp +kudoyama.wakayama.jp +kushimoto.wakayama.jp +mihama.wakayama.jp +misato.wakayama.jp +nachikatsuura.wakayama.jp +shingu.wakayama.jp +shirahama.wakayama.jp +taiji.wakayama.jp +tanabe.wakayama.jp +wakayama.wakayama.jp +yuasa.wakayama.jp +yura.wakayama.jp +asahi.yamagata.jp +funagata.yamagata.jp +higashine.yamagata.jp +iide.yamagata.jp +kahoku.yamagata.jp +kaminoyama.yamagata.jp +kaneyama.yamagata.jp +kawanishi.yamagata.jp +mamurogawa.yamagata.jp +mikawa.yamagata.jp +murayama.yamagata.jp +nagai.yamagata.jp +nakayama.yamagata.jp +nanyo.yamagata.jp +nishikawa.yamagata.jp +obanazawa.yamagata.jp +oe.yamagata.jp +oguni.yamagata.jp +ohkura.yamagata.jp +oishida.yamagata.jp +sagae.yamagata.jp +sakata.yamagata.jp +sakegawa.yamagata.jp +shinjo.yamagata.jp +shirataka.yamagata.jp +shonai.yamagata.jp +takahata.yamagata.jp +tendo.yamagata.jp +tozawa.yamagata.jp +tsuruoka.yamagata.jp +yamagata.yamagata.jp +yamanobe.yamagata.jp +yonezawa.yamagata.jp +yuza.yamagata.jp +abu.yamaguchi.jp +hagi.yamaguchi.jp +hikari.yamaguchi.jp +hofu.yamaguchi.jp +iwakuni.yamaguchi.jp +kudamatsu.yamaguchi.jp +mitou.yamaguchi.jp +nagato.yamaguchi.jp +oshima.yamaguchi.jp +shimonoseki.yamaguchi.jp +shunan.yamaguchi.jp +tabuse.yamaguchi.jp +tokuyama.yamaguchi.jp +toyota.yamaguchi.jp +ube.yamaguchi.jp +yuu.yamaguchi.jp +chuo.yamanashi.jp +doshi.yamanashi.jp +fuefuki.yamanashi.jp +fujikawa.yamanashi.jp +fujikawaguchiko.yamanashi.jp +fujiyoshida.yamanashi.jp +hayakawa.yamanashi.jp +hokuto.yamanashi.jp +ichikawamisato.yamanashi.jp +kai.yamanashi.jp +kofu.yamanashi.jp +koshu.yamanashi.jp +kosuge.yamanashi.jp +minami-alps.yamanashi.jp +minobu.yamanashi.jp +nakamichi.yamanashi.jp +nanbu.yamanashi.jp +narusawa.yamanashi.jp +nirasaki.yamanashi.jp +nishikatsura.yamanashi.jp +oshino.yamanashi.jp +otsuki.yamanashi.jp +showa.yamanashi.jp +tabayama.yamanashi.jp +tsuru.yamanashi.jp +uenohara.yamanashi.jp +yamanakako.yamanashi.jp +yamanashi.yamanashi.jp + +// ke : http://www.kenic.or.ke/index.php/en/ke-domains/ke-domains +ke +ac.ke +co.ke +go.ke +info.ke +me.ke +mobi.ke +ne.ke +or.ke +sc.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : https://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// https://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : https://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kp : http://www.kcce.kp/en_index.php +kp +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp + +// kr : https://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : https://www.nic.kw/policies/ +// Confirmed by registry <nic.tech@citra.gov.kw> +kw +com.kw +edu.kw +emb.kw +gov.kw +ind.kw +net.kw +org.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17 +ky +edu.ky +gov.ky +com.ky +org.ky +net.ky + +// kz : https://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : https://en.wikipedia.org/wiki/.la +// Submitted by registry <gavin.brown@nic.la> +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la + +// lb : https://en.wikipedia.org/wiki/.lb +// Submitted by registry <randy@psg.com> +lb +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : https://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : https://en.wikipedia.org/wiki/.li +li + +// lk : http://www.nic.lk/seclevpr.html +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk +ac.lk + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry <randy@psg.com> +lr +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : http://www.nic.ls/ +// Confirmed by registry <lsadmin@nic.ls> +ls +ac.ls +biz.ls +co.ls +edu.ls +gov.ls +info.ls +net.ls +org.ls +sc.ls + +// lt : https://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : https://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : https://en.wikipedia.org/wiki/.md +md + +// me : https://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://nic.mg/nicmg/?page_id=39 +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg +co.mg + +// mh : https://en.wikipedia.org/wiki/.mh +mh + +// mil : https://en.wikipedia.org/wiki/.mil +mil + +// mk : https://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: https://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : https://en.wikipedia.org/wiki/.mm +*.mm + +// mn : https://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : https://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry <dcamacho@saipan.com> 2008-06-17 +mp + +// mq : https://en.wikipedia.org/wiki/.mq +mq + +// mr : https://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf +ms +com.ms +edu.ms +gov.ms +net.ms +org.ms + +// mt : https://www.nic.org.mt/go/policy +// Submitted by registry <help@nic.org.mt> +mt +com.mt +edu.mt +net.mt +org.mt + +// mu : https://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלים.museum +иком.museum + +// mv : https://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry <farias@nic.mx> +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.net.my/ +my +com.my +net.my +org.my +gov.my +edu.my +mil.my +name.my + +// mz : http://www.uem.mz/ +// Submitted by registry <antonio@uem.mz> +mz +ac.mz +adv.mz +co.mz +edu.mz +gov.mz +mil.mz +net.mz +org.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc +nom.nc + +// ne : https://en.wikipedia.org/wiki/.ne +ne + +// net : https://en.wikipedia.org/wiki/.net +net + +// nf : https://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds +ng +com.ng +edu.ng +gov.ng +i.ng +mil.ng +mobi.ng +name.ng +net.ng +org.ng +sch.ng + +// ni : http://www.nic.ni/ +ni +ac.ni +biz.ni +co.ni +com.ni +edu.ni +gob.ni +in.ni +info.ni +int.ni +mil.ni +net.ni +nom.ni +org.ni +web.ni + +// nl : https://en.wikipedia.org/wiki/.nl +// https://www.sidn.nl/ +// ccTLD for the Netherlands +nl + +// no : http://www.norid.no/regelverk/index.en.html +// The Norwegian registry has declined to notify us of updates. The web pages +// referenced below are the official source of the data. There is also an +// announce mailing list: +// https://postlister.uninett.no/sympa/info/norid-diskusjon +no +// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +mil.no +stat.no +dep.no +kommune.no +herad.no +// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +åkrehamn.no +algard.no +ålgård.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevåg.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +råholt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +åfjord.no +agdenes.no +al.no +ål.no +alesund.no +ålesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +åmli.no +amot.no +åmot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +årdal.no +aremark.no +arendal.no +ås.no +aseral.no +åseral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +åsnes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevåg.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bådåddjå.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +båtsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flå.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskål.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +kråanghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákŋoluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtålen.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hå.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kåfjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaŋgaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindås.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +måsøy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +meråker.no +moareke.no +moåreke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +målselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegård.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +råde.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjåk.no +skodje.no +skanland.no +skånland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snåsa.no +snoasa.no +snaase.no +snåase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +čáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegårshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvågøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vågan.no +voagat.no +vagsoy.no +vågsøy.no +vaga.no +vågå.no +valer.ostfold.no +våler.østfold.no +valer.hedmark.no +våler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Submitted by registry <technician@cenpac.net.nr> +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : https://en.wikipedia.org/wiki/.nu +nu + +// nz : https://en.wikipedia.org/wiki/.nz +// Submitted by registry <jay@nzrs.net.nz> +nz +ac.nz +co.nz +cri.nz +geek.nz +gen.nz +govt.nz +health.nz +iwi.nz +kiwi.nz +maori.nz +mil.nz +māori.nz +net.nz +org.nz +parliament.nz +school.nz + +// om : https://en.wikipedia.org/wiki/.om +om +co.om +com.om +edu.om +gov.om +med.om +museum.om +net.om +org.om +pro.om + +// onion : https://tools.ietf.org/html/rfc7686 +onion + +// org : https://en.wikipedia.org/wiki/.org +org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : https://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry <jed@email.com.ph> +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl http://www.dns.pl/english/index.html +// Submitted by registry +pl +com.pl +net.pl +org.pl +// pl functional domains (http://www.dns.pl/english/index.html) +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +nieruchomosci.pl +nom.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// Government domains +gov.pl +ap.gov.pl +ic.gov.pl +is.gov.pl +us.gov.pl +kmpsp.gov.pl +kppsp.gov.pl +kwpsp.gov.pl +psp.gov.pl +wskr.gov.pl +kwp.gov.pl +mw.gov.pl +ug.gov.pl +um.gov.pl +umig.gov.pl +ugim.gov.pl +upow.gov.pl +uw.gov.pl +starostwo.gov.pl +pa.gov.pl +po.gov.pl +psse.gov.pl +pup.gov.pl +rzgw.gov.pl +sa.gov.pl +so.gov.pl +sr.gov.pl +wsa.gov.pl +sko.gov.pl +uzs.gov.pl +wiih.gov.pl +winb.gov.pl +pinb.gov.pl +wios.gov.pl +witd.gov.pl +wzmiuw.gov.pl +piw.gov.pl +wiw.gov.pl +griw.gov.pl +wif.gov.pl +oum.gov.pl +sdn.gov.pl +zp.gov.pl +uppo.gov.pl +mup.gov.pl +wuoz.gov.pl +konsulat.gov.pl +oirm.gov.pl +// pl regional domains (http://www.dns.pl/english/index.html) +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl + +// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +pm + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// post : https://en.wikipedia.org/wiki/.post +post + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://registry.pro/get-pro +pro +aaa.pro +aca.pro +acct.pro +avocat.pro +bar.pro +cpa.pro +eng.pro +jur.pro +law.pro +med.pro +recht.pro + +// ps : https://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : http://online.dns.pt/dns/start_dns +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : https://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/pautas.html#seccion_9 +// Submitted by registry +py +com.py +coop.py +edu.py +gov.py +mil.py +net.py +org.py + +// qa : http://domains.qa/en/ +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +asso.re +com.re +nom.re + +// ro : http://www.rotld.ro/ +ro +arts.ro +com.ro +firm.ro +info.ro +nom.ro +nt.ro +org.ro +rec.ro +store.ro +tm.ro +www.ro + +// rs : https://www.rnids.rs/en/domains/national-domains +rs +ac.rs +co.rs +edu.rs +gov.rs +in.rs +org.rs + +// ru : https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf +// Submitted by George Georgievsky <gug@cctld.ru> +ru + +// rw : https://www.ricta.org.rw/sites/default/files/resources/registry_registrar_contract_0.pdf +rw +ac.rw +co.rw +coop.rw +gov.rw +mil.rw +net.rw +org.rw + +// sa : http://www.nic.net.sa/ +sa +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry <lee.humphries@telekom.com.sb> +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry <admin@isoc.sd> +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +tv.sd +gov.sd +info.sd + +// se : https://en.wikipedia.org/wiki/.se +// Submitted by registry <patrik.wallstrom@iis.se> +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://www.nic.sh/registrar.html +sh +com.sh +net.sh +gov.sh +org.sh +mil.sh + +// si : https://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry <jarle@uninett.no> +sj + +// sk : https://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry <adam@neoip.com> +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : https://en.wikipedia.org/wiki/.sm +sm + +// sn : https://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// so : http://sonic.so/policies/ +so +com.so +edu.so +gov.so +me.so +net.so +org.so + +// sr : https://en.wikipedia.org/wiki/.sr +sr + +// ss : https://registry.nic.ss/ +// Submitted by registry <technical@nic.ss> +ss +biz.ss +com.ss +edu.ss +gov.ss +net.ss +org.ss + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +gov.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : https://en.wikipedia.org/wiki/.su +su + +// sv : http://www.svnet.org.sv/niveldos.pdf +sv +com.sv +edu.sv +gob.sv +org.sv +red.sv + +// sx : https://en.wikipedia.org/wiki/.sx +// Submitted by registry <jcvignes@openregistry.com> +sx +gov.sx + +// sy : https://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : https://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : https://en.wikipedia.org/wiki/.tc +tc + +// td : https://en.wikipedia.org/wiki/.td +td + +// tel: https://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : https://en.wikipedia.org/wiki/.tf +tf + +// tg : https://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/ +tg + +// th : https://en.wikipedia.org/wiki/.th +// Submitted by registry <krit@thains.co.th> +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.html +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : https://en.wikipedia.org/wiki/.tk +tk + +// tl : https://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/local.html +tm +com.tm +co.tm +org.tm +net.tm +nom.tm +gov.tm +mil.tm +edu.tm + +// tn : https://en.wikipedia.org/wiki/.tn +// http://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +intl.tn +nat.tn +net.tn +org.tn +info.tn +perso.tn +tourism.tn +edunet.tn +rnrt.tn +rns.tn +rnu.tn +mincom.tn +agrinet.tn +defense.tn +turen.tn + +// to : https://en.wikipedia.org/wiki/.to +// Submitted by registry <egullich@colo.to> +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// tr : https://nic.tr/ +// https://nic.tr/forms/eng/policies.pdf +// https://nic.tr/index.php?USRACTN=PRICELST +tr +av.tr +bbs.tr +bel.tr +biz.tr +com.tr +dr.tr +edu.tr +gen.tr +gov.tr +info.tr +mil.tr +k12.tr +kep.tr +name.tr +net.tr +org.tr +pol.tr +tel.tr +tsk.tr +tv.tr +web.tr +// Used by Northern Cyprus +nc.tr +// Used by government agencies of Northern Cyprus +gov.nc.tr + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : https://en.wikipedia.org/wiki/.tv +// Not listing any 2LDs as reserved since none seem to exist in practice, +// Wikipedia notwithstanding. +tv + +// tw : https://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://www.tznic.or.tz/index.php/domains +// Submitted by registry <manager@tznic.or.tz> +tz +ac.tz +co.tz +go.tz +hotel.tz +info.tz +me.tz +mil.tz +mobi.tz +ne.tz +or.tz +sc.tz +tv.tz + +// ua : https://hostmaster.ua/policy/?ua +// Submitted by registry <dk@cctld.ua> +ua +// ua 2LD +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geographic names +// https://hostmaster.ua/2ld/ +cherkassy.ua +cherkasy.ua +chernigov.ua +chernihiv.ua +chernivtsi.ua +chernovtsy.ua +ck.ua +cn.ua +cr.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +dnipropetrovsk.ua +dominic.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkiv.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +khmelnytskyi.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +krym.ua +ks.ua +kv.ua +kyiv.ua +lg.ua +lt.ua +lugansk.ua +lutsk.ua +lv.ua +lviv.ua +mk.ua +mykolaiv.ua +nikolaev.ua +od.ua +odesa.ua +odessa.ua +pl.ua +poltava.ua +rivne.ua +rovno.ua +rv.ua +sb.ua +sebastopol.ua +sevastopol.ua +sm.ua +sumy.ua +te.ua +ternopil.ua +uz.ua +uzhgorod.ua +vinnica.ua +vinnytsia.ua +vn.ua +volyn.ua +yalta.ua +zaporizhzhe.ua +zaporizhzhia.ua +zhitomir.ua +zhytomyr.ua +zp.ua +zt.ua + +// ug : https://www.registry.co.ug/ +ug +co.ug +or.ug +ac.ug +sc.ug +go.ug +ne.ug +com.ug +org.ug + +// uk : https://en.wikipedia.org/wiki/.uk +// Submitted by registry <Michael.Daly@nominet.org.uk> +uk +ac.uk +co.uk +gov.uk +ltd.uk +me.uk +net.uk +nhs.uk +org.uk +plc.uk +police.uk +*.sch.uk + +// us : https://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are available, or even nothing at all. We include the +// most common ones where it's clear that different sites are different +// entities. +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.de.us +k12.fl.us +k12.ga.us +k12.gu.us +// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov> +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +k12.ri.us +k12.sc.us +// k12.sd.us Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us> +k12.tn.us +k12.tx.us +k12.ut.us +k12.vi.us +k12.vt.us +k12.va.us +k12.wa.us +k12.wi.us +// k12.wv.us Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu> +k12.wy.us +cc.ak.us +cc.al.us +cc.ar.us +cc.as.us +cc.az.us +cc.ca.us +cc.co.us +cc.ct.us +cc.dc.us +cc.de.us +cc.fl.us +cc.ga.us +cc.gu.us +cc.hi.us +cc.ia.us +cc.id.us +cc.il.us +cc.in.us +cc.ks.us +cc.ky.us +cc.la.us +cc.ma.us +cc.md.us +cc.me.us +cc.mi.us +cc.mn.us +cc.mo.us +cc.ms.us +cc.mt.us +cc.nc.us +cc.nd.us +cc.ne.us +cc.nh.us +cc.nj.us +cc.nm.us +cc.nv.us +cc.ny.us +cc.oh.us +cc.ok.us +cc.or.us +cc.pa.us +cc.pr.us +cc.ri.us +cc.sc.us +cc.sd.us +cc.tn.us +cc.tx.us +cc.ut.us +cc.vi.us +cc.vt.us +cc.va.us +cc.wa.us +cc.wi.us +cc.wv.us +cc.wy.us +lib.ak.us +lib.al.us +lib.ar.us +lib.as.us +lib.az.us +lib.ca.us +lib.co.us +lib.ct.us +lib.dc.us +// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore <Ed.Moore@lib.de.us> +lib.fl.us +lib.ga.us +lib.gu.us +lib.hi.us +lib.ia.us +lib.id.us +lib.il.us +lib.in.us +lib.ks.us +lib.ky.us +lib.la.us +lib.ma.us +lib.md.us +lib.me.us +lib.mi.us +lib.mn.us +lib.mo.us +lib.ms.us +lib.mt.us +lib.nc.us +lib.nd.us +lib.ne.us +lib.nh.us +lib.nj.us +lib.nm.us +lib.nv.us +lib.ny.us +lib.oh.us +lib.ok.us +lib.or.us +lib.pa.us +lib.pr.us +lib.ri.us +lib.sc.us +lib.sd.us +lib.tn.us +lib.tx.us +lib.ut.us +lib.vi.us +lib.vt.us +lib.va.us +lib.wa.us +lib.wi.us +// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us> +lib.wy.us +// k12.ma.us contains school districts in Massachusetts. The 4LDs are +// managed independently except for private (PVT), charter (CHTR) and +// parochial (PAROCH) schools. Those are delegated directly to the +// 5LD operators. <k12-ma-hostmaster _ at _ rsuc.gweep.net> +pvt.k12.ma.us +chtr.k12.ma.us +paroch.k12.ma.us +// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following +// see also: http://domreg.merit.edu +// see also: whois -h whois.domreg.merit.edu help +ann-arbor.mi.us +cog.mi.us +dst.mi.us +eaton.mi.us +gen.mi.us +mus.mi.us +tec.mi.us +washtenaw.mi.us + +// uy : http://www.nic.org.uy/ +uy +com.uy +edu.uy +gub.uy +mil.uy +net.uy +org.uy + +// uz : http://www.reg.uz/ +uz +co.uz +com.uz +net.uz +org.uz + +// va : https://en.wikipedia.org/wiki/.va +va + +// vc : https://en.wikipedia.org/wiki/.vc +// Submitted by registry <kshah@ca.afilias.info> +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : https://registro.nic.ve/ +// Submitted by registry +ve +arts.ve +co.ve +com.ve +e12.ve +edu.ve +firm.ve +gob.ve +gov.ve +info.ve +int.ve +mil.ve +net.ve +org.ve +rec.ve +store.ve +tec.ve +web.ve + +// vg : https://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : https://en.wikipedia.org/wiki/.vu +// http://www.vunic.vu/ +vu +com.vu +edu.vu +net.vu +org.vu + +// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +wf + +// ws : https://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +yt + +// IDN ccTLDs +// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then +// U-label, and follow this format: +// // A-Label ("<Latin renderings>", <language name>[, variant info]) : <ISO 3166 ccTLD> +// // [sponsoring org] +// U-Label + +// xn--mgbaam7a8h ("Emerat", Arabic) : AE +// http://nic.ae/english/arabicdomain/rules.jsp +امارات + +// xn--y9a3aq ("hye", Armenian) : AM +// ISOC AM (operated by .am Registry) +հայ + +// xn--54b7fta0cc ("Bangla", Bangla) : BD +বাংলা + +// xn--90ae ("bg", Bulgarian) : BG +бг + +// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY +// Operated by .by registry +бел + +// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中国 + +// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中國 + +// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ +الجزائر + +// xn--wgbh1c ("Egypt/Masr", Arabic) : EG +// http://www.dotmasr.eg/ +مصر + +// xn--e1a4c ("eu", Cyrillic) : EU +ею + +// xn--mgbah1a3hjkrd ("Mauritania", Arabic) : MR +موريتانيا + +// xn--node ("ge", Georgian Mkhedruli) : GE +გე + +// xn--qxam ("el", Greek) : GR +// Hellenic Ministry of Infrastructure, Transport, and Networks +ελ + +// xn--j6w193g ("Hong Kong", Chinese) : HK +// https://www.hkirc.hk +// Submitted by registry <hk.tech@hkirc.hk> +// https://www.hkirc.hk/content.jsp?id=30#!/34 +香港 +公司.香港 +教育.香港 +政府.香港 +個人.香港 +網絡.香港 +組織.香港 + +// xn--2scrj9c ("Bharat", Kannada) : IN +// India +ಭಾರತ + +// xn--3hcrj9c ("Bharat", Oriya) : IN +// India +ଭାରତ + +// xn--45br5cyl ("Bharatam", Assamese) : IN +// India +ভাৰত + +// xn--h2breg3eve ("Bharatam", Sanskrit) : IN +// India +भारतम् + +// xn--h2brj9c8c ("Bharot", Santali) : IN +// India +भारोत + +// xn--mgbgu82a ("Bharat", Sindhi) : IN +// India +ڀارت + +// xn--rvc1e0am3e ("Bharatam", Malayalam) : IN +// India +ഭാരതം + +// xn--h2brj9c ("Bharat", Devanagari) : IN +// India +भारत + +// xn--mgbbh1a ("Bharat", Kashmiri) : IN +// India +بارت + +// xn--mgbbh1a71e ("Bharat", Arabic) : IN +// India +بھارت + +// xn--fpcrj9c3d ("Bharat", Telugu) : IN +// India +భారత్ + +// xn--gecrj9c ("Bharat", Gujarati) : IN +// India +ભારત + +// xn--s9brj9c ("Bharat", Gurmukhi) : IN +// India +ਭਾਰਤ + +// xn--45brj9c ("Bharat", Bengali) : IN +// India +ভারত + +// xn--xkc2dl3a5ee0h ("India", Tamil) : IN +// India +இந்தியா + +// xn--mgba3a4f16a ("Iran", Persian) : IR +ایران + +// xn--mgba3a4fra ("Iran", Arabic) : IR +ايران + +// xn--mgbtx2b ("Iraq", Arabic) : IQ +// Communications and Media Commission +عراق + +// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO +// National Information Technology Center (NITC) +// Royal Scientific Society, Al-Jubeiha +الاردن + +// xn--3e0b707e ("Republic of Korea", Hangul) : KR +한국 + +// xn--80ao21a ("Kaz", Kazakh) : KZ +қаз + +// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK +// http://nic.lk +ලංකා + +// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK +// http://nic.lk +இலங்கை + +// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA +المغرب + +// xn--d1alf ("mkd", Macedonian) : MK +// MARnet +мкд + +// xn--l1acc ("mon", Mongolian) : MN +мон + +// xn--mix891f ("Macao", Chinese, Traditional) : MO +// MONIC / HNET Asia (Registry Operator for .mo) +澳門 + +// xn--mix082f ("Macao", Chinese, Simplified) : MO +澳门 + +// xn--mgbx4cd0ab ("Malaysia", Malay) : MY +مليسيا + +// xn--mgb9awbf ("Oman", Arabic) : OM +عمان + +// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK +پاکستان + +// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK +پاكستان + +// xn--ygbi2ammx ("Falasteen", Arabic) : PS +// The Palestinian National Internet Naming Authority (PNINA) +// http://www.pnina.ps +فلسطين + +// xn--90a3ac ("srb", Cyrillic) : RS +// https://www.rnids.rs/en/domains/national-domains +срб +пр.срб +орг.срб +обр.срб +од.срб +упр.срб +ак.срб + +// xn--p1ai ("rf", Russian-Cyrillic) : RU +// https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf +// Submitted by George Georgievsky <gug@cctld.ru> +рф + +// xn--wgbl6a ("Qatar", Arabic) : QA +// http://www.ict.gov.qa/ +قطر + +// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA +// http://www.nic.net.sa/ +السعودية + +// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA +السعودیة + +// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA +السعودیۃ + +// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA +السعوديه + +// xn--mgbpl2fh ("sudan", Arabic) : SD +// Operated by .sd registry +سودان + +// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG +新加坡 + +// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG +சிங்கப்பூர் + +// xn--ogbpf8fl ("Syria", Arabic) : SY +سورية + +// xn--mgbtf8fl ("Syria", Arabic, variant) : SY +سوريا + +// xn--o3cw4h ("Thai", Thai) : TH +// http://www.thnic.co.th +ไทย +ศึกษา.ไทย +ธุรกิจ.ไทย +รัฐบาล.ไทย +ทหาร.ไทย +เน็ต.ไทย +องค์กร.ไทย + +// xn--pgbs0dh ("Tunisia", Arabic) : TN +// http://nic.tn +تونس + +// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台灣 + +// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台湾 + +// xn--nnx388a ("Taiwan", Chinese, variant) : TW +臺灣 + +// xn--j1amh ("ukr", Cyrillic) : UA +укр + +// xn--mgb2ddes ("AlYemen", Arabic) : YE +اليمن + +// xxx : http://icmregistry.com +xxx + +// ye : http://www.y.net.ye/services/domain_name.htm +*.ye + +// za : https://www.zadna.org.za/content/page/domain-information/ +ac.za +agric.za +alt.za +co.za +edu.za +gov.za +grondar.za +law.za +mil.za +net.za +ngo.za +nic.za +nis.za +nom.za +org.za +school.za +tm.za +web.za + +// zm : https://zicta.zm/ +// Submitted by registry <info@zicta.zm> +zm +ac.zm +biz.zm +co.zm +com.zm +edu.zm +gov.zm +info.zm +mil.zm +net.zm +org.zm +sch.zm + +// zw : https://www.potraz.gov.zw/ +// Confirmed by registry <bmtengwa@potraz.gov.zw> 2017-01-25 +zw +ac.zw +co.zw +gov.zw +mil.zw +org.zw + + +// newGTLDs + +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2019-12-11T17:19:54Z +// This list is auto-generated, don't edit it manually. +// aaa : 2015-02-26 American Automobile Association, Inc. +aaa + +// aarp : 2015-05-21 AARP +aarp + +// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V. +abarth + +// abb : 2014-10-24 ABB Ltd +abb + +// abbott : 2014-07-24 Abbott Laboratories, Inc. +abbott + +// abbvie : 2015-07-30 AbbVie Inc. +abbvie + +// abc : 2015-07-30 Disney Enterprises, Inc. +abc + +// able : 2015-06-25 Able Inc. +able + +// abogado : 2014-04-24 Minds + Machines Group Limited +abogado + +// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre +abudhabi + +// academy : 2013-11-07 Binky Moon, LLC +academy + +// accenture : 2014-08-15 Accenture plc +accenture + +// accountant : 2014-11-20 dot Accountant Limited +accountant + +// accountants : 2014-03-20 Binky Moon, LLC +accountants + +// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG +aco + +// actor : 2013-12-12 Dog Beach, LLC +actor + +// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) +adac + +// ads : 2014-12-04 Charleston Road Registry Inc. +ads + +// adult : 2014-10-16 ICM Registry AD LLC +adult + +// aeg : 2015-03-19 Aktiebolaget Electrolux +aeg + +// aetna : 2015-05-21 Aetna Life Insurance Company +aetna + +// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc. +afamilycompany + +// afl : 2014-10-02 Australian Football League +afl + +// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa +africa + +// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +agakhan + +// agency : 2013-11-14 Binky Moon, LLC +agency + +// aig : 2014-12-18 American International Group, Inc. +aig + +// aigo : 2015-08-06 aigo Digital Technology Co,Ltd. +aigo + +// airbus : 2015-07-30 Airbus S.A.S. +airbus + +// airforce : 2014-03-06 Dog Beach, LLC +airforce + +// airtel : 2014-10-24 Bharti Airtel Limited +airtel + +// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +akdn + +// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V. +alfaromeo + +// alibaba : 2015-01-15 Alibaba Group Holding Limited +alibaba + +// alipay : 2015-01-15 Alibaba Group Holding Limited +alipay + +// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +allfinanz + +// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company +allstate + +// ally : 2015-06-18 Ally Financial Inc. +ally + +// alsace : 2014-07-02 Region Grand Est +alsace + +// alstom : 2015-07-30 ALSTOM +alstom + +// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. +americanexpress + +// americanfamily : 2015-07-23 AmFam, Inc. +americanfamily + +// amex : 2015-07-31 American Express Travel Related Services Company, Inc. +amex + +// amfam : 2015-07-23 AmFam, Inc. +amfam + +// amica : 2015-05-28 Amica Mutual Insurance Company +amica + +// amsterdam : 2014-07-24 Gemeente Amsterdam +amsterdam + +// analytics : 2014-12-18 Campus IP LLC +analytics + +// android : 2014-08-07 Charleston Road Registry Inc. +android + +// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +anquan + +// anz : 2015-07-31 Australia and New Zealand Banking Group Limited +anz + +// aol : 2015-09-17 Oath Inc. +aol + +// apartments : 2014-12-11 Binky Moon, LLC +apartments + +// app : 2015-05-14 Charleston Road Registry Inc. +app + +// apple : 2015-05-14 Apple Inc. +apple + +// aquarelle : 2014-07-24 Aquarelle.com +aquarelle + +// arab : 2015-11-12 League of Arab States +arab + +// aramco : 2014-11-20 Aramco Services Company +aramco + +// archi : 2014-02-06 Afilias Limited +archi + +// army : 2014-03-06 Dog Beach, LLC +army + +// art : 2016-03-24 UK Creative Ideas Limited +art + +// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. +arte + +// asda : 2015-07-31 Wal-Mart Stores, Inc. +asda + +// associates : 2014-03-06 Binky Moon, LLC +associates + +// athleta : 2015-07-30 The Gap, Inc. +athleta + +// attorney : 2014-03-20 Dog Beach, LLC +attorney + +// auction : 2014-03-20 Dog Beach, LLC +auction + +// audi : 2015-05-21 AUDI Aktiengesellschaft +audi + +// audible : 2015-06-25 Amazon Registry Services, Inc. +audible + +// audio : 2014-03-20 Uniregistry, Corp. +audio + +// auspost : 2015-08-13 Australian Postal Corporation +auspost + +// author : 2014-12-18 Amazon Registry Services, Inc. +author + +// auto : 2014-11-13 Cars Registry Limited +auto + +// autos : 2014-01-09 DERAutos, LLC +autos + +// avianca : 2015-01-08 Avianca Holdings S.A. +avianca + +// aws : 2015-06-25 Amazon Registry Services, Inc. +aws + +// axa : 2013-12-19 AXA SA +axa + +// azure : 2014-12-18 Microsoft Corporation +azure + +// baby : 2015-04-09 XYZ.COM LLC +baby + +// baidu : 2015-01-08 Baidu, Inc. +baidu + +// banamex : 2015-07-30 Citigroup Inc. +banamex + +// bananarepublic : 2015-07-31 The Gap, Inc. +bananarepublic + +// band : 2014-06-12 Dog Beach, LLC +band + +// bank : 2014-09-25 fTLD Registry Services LLC +bank + +// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +bar + +// barcelona : 2014-07-24 Municipi de Barcelona +barcelona + +// barclaycard : 2014-11-20 Barclays Bank PLC +barclaycard + +// barclays : 2014-11-20 Barclays Bank PLC +barclays + +// barefoot : 2015-06-11 Gallo Vineyards, Inc. +barefoot + +// bargains : 2013-11-14 Binky Moon, LLC +bargains + +// baseball : 2015-10-29 MLB Advanced Media DH, LLC +baseball + +// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) +basketball + +// bauhaus : 2014-04-17 Werkhaus GmbH +bauhaus + +// bayern : 2014-01-23 Bayern Connect GmbH +bayern + +// bbc : 2014-12-18 British Broadcasting Corporation +bbc + +// bbt : 2015-07-23 BB&T Corporation +bbt + +// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +bbva + +// bcg : 2015-04-02 The Boston Consulting Group, Inc. +bcg + +// bcn : 2014-07-24 Municipi de Barcelona +bcn + +// beats : 2015-05-14 Beats Electronics, LLC +beats + +// beauty : 2015-12-03 L'Oréal +beauty + +// beer : 2014-01-09 Minds + Machines Group Limited +beer + +// bentley : 2014-12-18 Bentley Motors Limited +bentley + +// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG +berlin + +// best : 2013-12-19 BestTLD Pty Ltd +best + +// bestbuy : 2015-07-31 BBY Solutions, Inc. +bestbuy + +// bet : 2015-05-07 Afilias Limited +bet + +// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited +bharti + +// bible : 2014-06-19 American Bible Society +bible + +// bid : 2013-12-19 dot Bid Limited +bid + +// bike : 2013-08-27 Binky Moon, LLC +bike + +// bing : 2014-12-18 Microsoft Corporation +bing + +// bingo : 2014-12-04 Binky Moon, LLC +bingo + +// bio : 2014-03-06 Afilias Limited +bio + +// black : 2014-01-16 Afilias Limited +black + +// blackfriday : 2014-01-16 Uniregistry, Corp. +blackfriday + +// blockbuster : 2015-07-30 Dish DBS Corporation +blockbuster + +// blog : 2015-05-14 Knock Knock WHOIS There, LLC +blog + +// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC +bloomberg + +// blue : 2013-11-07 Afilias Limited +blue + +// bms : 2014-10-30 Bristol-Myers Squibb Company +bms + +// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +bmw + +// bnpparibas : 2014-05-29 BNP Paribas +bnpparibas + +// boats : 2014-12-04 DERBoats, LLC +boats + +// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH +boehringer + +// bofa : 2015-07-31 Bank of America Corporation +bofa + +// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +bom + +// bond : 2014-06-05 ShortDot SA +bond + +// boo : 2014-01-30 Charleston Road Registry Inc. +boo + +// book : 2015-08-27 Amazon Registry Services, Inc. +book + +// booking : 2015-07-16 Booking.com B.V. +booking + +// bosch : 2015-06-18 Robert Bosch GMBH +bosch + +// bostik : 2015-05-28 Bostik SA +bostik + +// boston : 2015-12-10 Boston TLD Management, LLC +boston + +// bot : 2014-12-18 Amazon Registry Services, Inc. +bot + +// boutique : 2013-11-14 Binky Moon, LLC +boutique + +// box : 2015-11-12 .BOX INC. +box + +// bradesco : 2014-12-18 Banco Bradesco S.A. +bradesco + +// bridgestone : 2014-12-18 Bridgestone Corporation +bridgestone + +// broadway : 2014-12-22 Celebrate Broadway, Inc. +broadway + +// broker : 2014-12-11 Dotbroker Registry Limited +broker + +// brother : 2015-01-29 Brother Industries, Ltd. +brother + +// brussels : 2014-02-06 DNS.be vzw +brussels + +// budapest : 2013-11-21 Minds + Machines Group Limited +budapest + +// bugatti : 2015-07-23 Bugatti International SA +bugatti + +// build : 2013-11-07 Plan Bee LLC +build + +// builders : 2013-11-07 Binky Moon, LLC +builders + +// business : 2013-11-07 Binky Moon, LLC +business + +// buy : 2014-12-18 Amazon Registry Services, Inc. +buy + +// buzz : 2013-10-02 DOTSTRATEGY CO. +buzz + +// bzh : 2014-02-27 Association www.bzh +bzh + +// cab : 2013-10-24 Binky Moon, LLC +cab + +// cafe : 2015-02-11 Binky Moon, LLC +cafe + +// cal : 2014-07-24 Charleston Road Registry Inc. +cal + +// call : 2014-12-18 Amazon Registry Services, Inc. +call + +// calvinklein : 2015-07-30 PVH gTLD Holdings LLC +calvinklein + +// cam : 2016-04-21 AC Webconnecting Holding B.V. +cam + +// camera : 2013-08-27 Binky Moon, LLC +camera + +// camp : 2013-11-07 Binky Moon, LLC +camp + +// cancerresearch : 2014-05-15 Australian Cancer Research Foundation +cancerresearch + +// canon : 2014-09-12 Canon Inc. +canon + +// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +capetown + +// capital : 2014-03-06 Binky Moon, LLC +capital + +// capitalone : 2015-08-06 Capital One Financial Corporation +capitalone + +// car : 2015-01-22 Cars Registry Limited +car + +// caravan : 2013-12-12 Caravan International, Inc. +caravan + +// cards : 2013-12-05 Binky Moon, LLC +cards + +// care : 2014-03-06 Binky Moon, LLC +care + +// career : 2013-10-09 dotCareer LLC +career + +// careers : 2013-10-02 Binky Moon, LLC +careers + +// cars : 2014-11-13 Cars Registry Limited +cars + +// casa : 2013-11-21 Minds + Machines Group Limited +casa + +// case : 2015-09-03 CNH Industrial N.V. +case + +// caseih : 2015-09-03 CNH Industrial N.V. +caseih + +// cash : 2014-03-06 Binky Moon, LLC +cash + +// casino : 2014-12-18 Binky Moon, LLC +casino + +// catering : 2013-12-05 Binky Moon, LLC +catering + +// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +catholic + +// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +cba + +// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. +cbn + +// cbre : 2015-07-02 CBRE, Inc. +cbre + +// cbs : 2015-08-06 CBS Domains Inc. +cbs + +// ceb : 2015-04-09 The Corporate Executive Board Company +ceb + +// center : 2013-11-07 Binky Moon, LLC +center + +// ceo : 2013-11-07 CEOTLD Pty Ltd +ceo + +// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") +cern + +// cfa : 2014-08-28 CFA Institute +cfa + +// cfd : 2014-12-11 DotCFD Registry Limited +cfd + +// chanel : 2015-04-09 Chanel International B.V. +chanel + +// channel : 2014-05-08 Charleston Road Registry Inc. +channel + +// charity : 2018-04-11 Binky Moon, LLC +charity + +// chase : 2015-04-30 JPMorgan Chase Bank, National Association +chase + +// chat : 2014-12-04 Binky Moon, LLC +chat + +// cheap : 2013-11-14 Binky Moon, LLC +cheap + +// chintai : 2015-06-11 CHINTAI Corporation +chintai + +// christmas : 2013-11-21 Uniregistry, Corp. +christmas + +// chrome : 2014-07-24 Charleston Road Registry Inc. +chrome + +// church : 2014-02-06 Binky Moon, LLC +church + +// cipriani : 2015-02-19 Hotel Cipriani Srl +cipriani + +// circle : 2014-12-18 Amazon Registry Services, Inc. +circle + +// cisco : 2014-12-22 Cisco Technology, Inc. +cisco + +// citadel : 2015-07-23 Citadel Domain LLC +citadel + +// citi : 2015-07-30 Citigroup Inc. +citi + +// citic : 2014-01-09 CITIC Group Corporation +citic + +// city : 2014-05-29 Binky Moon, LLC +city + +// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. +cityeats + +// claims : 2014-03-20 Binky Moon, LLC +claims + +// cleaning : 2013-12-05 Binky Moon, LLC +cleaning + +// click : 2014-06-05 Uniregistry, Corp. +click + +// clinic : 2014-03-20 Binky Moon, LLC +clinic + +// clinique : 2015-10-01 The Estée Lauder Companies Inc. +clinique + +// clothing : 2013-08-27 Binky Moon, LLC +clothing + +// cloud : 2015-04-16 Aruba PEC S.p.A. +cloud + +// club : 2013-11-08 .CLUB DOMAINS, LLC +club + +// clubmed : 2015-06-25 Club Méditerranée S.A. +clubmed + +// coach : 2014-10-09 Binky Moon, LLC +coach + +// codes : 2013-10-31 Binky Moon, LLC +codes + +// coffee : 2013-10-17 Binky Moon, LLC +coffee + +// college : 2014-01-16 XYZ.COM LLC +college + +// cologne : 2014-02-05 dotKoeln GmbH +cologne + +// comcast : 2015-07-23 Comcast IP Holdings I, LLC +comcast + +// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +commbank + +// community : 2013-12-05 Binky Moon, LLC +community + +// company : 2013-11-07 Binky Moon, LLC +company + +// compare : 2015-10-08 Registry Services, LLC +compare + +// computer : 2013-10-24 Binky Moon, LLC +computer + +// comsec : 2015-01-08 VeriSign, Inc. +comsec + +// condos : 2013-12-05 Binky Moon, LLC +condos + +// construction : 2013-09-16 Binky Moon, LLC +construction + +// consulting : 2013-12-05 Dog Beach, LLC +consulting + +// contact : 2015-01-08 Dog Beach, LLC +contact + +// contractors : 2013-09-10 Binky Moon, LLC +contractors + +// cooking : 2013-11-21 Minds + Machines Group Limited +cooking + +// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +cookingchannel + +// cool : 2013-11-14 Binky Moon, LLC +cool + +// corsica : 2014-09-25 Collectivité de Corse +corsica + +// country : 2013-12-19 DotCountry LLC +country + +// coupon : 2015-02-26 Amazon Registry Services, Inc. +coupon + +// coupons : 2015-03-26 Binky Moon, LLC +coupons + +// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD +courses + +// cpa : 2019-06-10 American Institute of Certified Public Accountants +cpa + +// credit : 2014-03-20 Binky Moon, LLC +credit + +// creditcard : 2014-03-20 Binky Moon, LLC +creditcard + +// creditunion : 2015-01-22 CUNA Performance Resources, LLC +creditunion + +// cricket : 2014-10-09 dot Cricket Limited +cricket + +// crown : 2014-10-24 Crown Equipment Corporation +crown + +// crs : 2014-04-03 Federated Co-operatives Limited +crs + +// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. +cruise + +// cruises : 2013-12-05 Binky Moon, LLC +cruises + +// csc : 2014-09-25 Alliance-One Services, Inc. +csc + +// cuisinella : 2014-04-03 SCHMIDT GROUPE S.A.S. +cuisinella + +// cymru : 2014-05-08 Nominet UK +cymru + +// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. +cyou + +// dabur : 2014-02-06 Dabur India Limited +dabur + +// dad : 2014-01-23 Charleston Road Registry Inc. +dad + +// dance : 2013-10-24 Dog Beach, LLC +dance + +// data : 2016-06-02 Dish DBS Corporation +data + +// date : 2014-11-20 dot Date Limited +date + +// dating : 2013-12-05 Binky Moon, LLC +dating + +// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. +datsun + +// day : 2014-01-30 Charleston Road Registry Inc. +day + +// dclk : 2014-11-20 Charleston Road Registry Inc. +dclk + +// dds : 2015-05-07 Minds + Machines Group Limited +dds + +// deal : 2015-06-25 Amazon Registry Services, Inc. +deal + +// dealer : 2014-12-22 Intercap Registry Inc. +dealer + +// deals : 2014-05-22 Binky Moon, LLC +deals + +// degree : 2014-03-06 Dog Beach, LLC +degree + +// delivery : 2014-09-11 Binky Moon, LLC +delivery + +// dell : 2014-10-24 Dell Inc. +dell + +// deloitte : 2015-07-31 Deloitte Touche Tohmatsu +deloitte + +// delta : 2015-02-19 Delta Air Lines, Inc. +delta + +// democrat : 2013-10-24 Dog Beach, LLC +democrat + +// dental : 2014-03-20 Binky Moon, LLC +dental + +// dentist : 2014-03-20 Dog Beach, LLC +dentist + +// desi : 2013-11-14 Desi Networks LLC +desi + +// design : 2014-11-07 Top Level Design, LLC +design + +// dev : 2014-10-16 Charleston Road Registry Inc. +dev + +// dhl : 2015-07-23 Deutsche Post AG +dhl + +// diamonds : 2013-09-22 Binky Moon, LLC +diamonds + +// diet : 2014-06-26 Uniregistry, Corp. +diet + +// digital : 2014-03-06 Binky Moon, LLC +digital + +// direct : 2014-04-10 Binky Moon, LLC +direct + +// directory : 2013-09-20 Binky Moon, LLC +directory + +// discount : 2014-03-06 Binky Moon, LLC +discount + +// discover : 2015-07-23 Discover Financial Services +discover + +// dish : 2015-07-30 Dish DBS Corporation +dish + +// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. +diy + +// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. +dnp + +// docs : 2014-10-16 Charleston Road Registry Inc. +docs + +// doctor : 2016-06-02 Binky Moon, LLC +doctor + +// dog : 2014-12-04 Binky Moon, LLC +dog + +// domains : 2013-10-17 Binky Moon, LLC +domains + +// dot : 2015-05-21 Dish DBS Corporation +dot + +// download : 2014-11-20 dot Support Limited +download + +// drive : 2015-03-05 Charleston Road Registry Inc. +drive + +// dtv : 2015-06-04 Dish DBS Corporation +dtv + +// dubai : 2015-01-01 Dubai Smart Government Department +dubai + +// duck : 2015-07-23 Johnson Shareholdings, Inc. +duck + +// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company +dunlop + +// dupont : 2015-06-25 E. I. du Pont de Nemours and Company +dupont + +// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +durban + +// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +dvag + +// dvr : 2016-05-26 DISH Technologies L.L.C. +dvr + +// earth : 2014-12-04 Interlink Co., Ltd. +earth + +// eat : 2014-01-23 Charleston Road Registry Inc. +eat + +// eco : 2016-07-08 Big Room Inc. +eco + +// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. +edeka + +// education : 2013-11-07 Binky Moon, LLC +education + +// email : 2013-10-31 Binky Moon, LLC +email + +// emerck : 2014-04-03 Merck KGaA +emerck + +// energy : 2014-09-11 Binky Moon, LLC +energy + +// engineer : 2014-03-06 Dog Beach, LLC +engineer + +// engineering : 2014-03-06 Binky Moon, LLC +engineering + +// enterprises : 2013-09-20 Binky Moon, LLC +enterprises + +// epson : 2014-12-04 Seiko Epson Corporation +epson + +// equipment : 2013-08-27 Binky Moon, LLC +equipment + +// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson +ericsson + +// erni : 2014-04-03 ERNI Group Holding AG +erni + +// esq : 2014-05-08 Charleston Road Registry Inc. +esq + +// estate : 2013-08-27 Binky Moon, LLC +estate + +// esurance : 2015-07-23 Esurance Insurance Company +esurance + +// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +etisalat + +// eurovision : 2014-04-24 European Broadcasting Union (EBU) +eurovision + +// eus : 2013-12-12 Puntueus Fundazioa +eus + +// events : 2013-12-05 Binky Moon, LLC +events + +// exchange : 2014-03-06 Binky Moon, LLC +exchange + +// expert : 2013-11-21 Binky Moon, LLC +expert + +// exposed : 2013-12-05 Binky Moon, LLC +exposed + +// express : 2015-02-11 Binky Moon, LLC +express + +// extraspace : 2015-05-14 Extra Space Storage LLC +extraspace + +// fage : 2014-12-18 Fage International S.A. +fage + +// fail : 2014-03-06 Binky Moon, LLC +fail + +// fairwinds : 2014-11-13 FairWinds Partners, LLC +fairwinds + +// faith : 2014-11-20 dot Faith Limited +faith + +// family : 2015-04-02 Dog Beach, LLC +family + +// fan : 2014-03-06 Dog Beach, LLC +fan + +// fans : 2014-11-07 ZDNS International Limited +fans + +// farm : 2013-11-07 Binky Moon, LLC +farm + +// farmers : 2015-07-09 Farmers Insurance Exchange +farmers + +// fashion : 2014-07-03 Minds + Machines Group Limited +fashion + +// fast : 2014-12-18 Amazon Registry Services, Inc. +fast + +// fedex : 2015-08-06 Federal Express Corporation +fedex + +// feedback : 2013-12-19 Top Level Spectrum, Inc. +feedback + +// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. +ferrari + +// ferrero : 2014-12-18 Ferrero Trading Lux S.A. +ferrero + +// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V. +fiat + +// fidelity : 2015-07-30 Fidelity Brokerage Services LLC +fidelity + +// fido : 2015-08-06 Rogers Communications Canada Inc. +fido + +// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd +film + +// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +final + +// finance : 2014-03-20 Binky Moon, LLC +finance + +// financial : 2014-03-06 Binky Moon, LLC +financial + +// fire : 2015-06-25 Amazon Registry Services, Inc. +fire + +// firestone : 2014-12-18 Bridgestone Licensing Services, Inc +firestone + +// firmdale : 2014-03-27 Firmdale Holdings Limited +firmdale + +// fish : 2013-12-12 Binky Moon, LLC +fish + +// fishing : 2013-11-21 Minds + Machines Group Limited +fishing + +// fit : 2014-11-07 Minds + Machines Group Limited +fit + +// fitness : 2014-03-06 Binky Moon, LLC +fitness + +// flickr : 2015-04-02 Yahoo! Domain Services Inc. +flickr + +// flights : 2013-12-05 Binky Moon, LLC +flights + +// flir : 2015-07-23 FLIR Systems, Inc. +flir + +// florist : 2013-11-07 Binky Moon, LLC +florist + +// flowers : 2014-10-09 Uniregistry, Corp. +flowers + +// fly : 2014-05-08 Charleston Road Registry Inc. +fly + +// foo : 2014-01-23 Charleston Road Registry Inc. +foo + +// food : 2016-04-21 Lifestyle Domain Holdings, Inc. +food + +// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. +foodnetwork + +// football : 2014-12-18 Binky Moon, LLC +football + +// ford : 2014-11-13 Ford Motor Company +ford + +// forex : 2014-12-11 Dotforex Registry Limited +forex + +// forsale : 2014-05-22 Dog Beach, LLC +forsale + +// forum : 2015-04-02 Fegistry, LLC +forum + +// foundation : 2013-12-05 Binky Moon, LLC +foundation + +// fox : 2015-09-11 FOX Registry, LLC +fox + +// free : 2015-12-10 Amazon Registry Services, Inc. +free + +// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH +fresenius + +// frl : 2014-05-15 FRLregistry B.V. +frl + +// frogans : 2013-12-19 OP3FT +frogans + +// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. +frontdoor + +// frontier : 2015-02-05 Frontier Communications Corporation +frontier + +// ftr : 2015-07-16 Frontier Communications Corporation +ftr + +// fujitsu : 2015-07-30 Fujitsu Limited +fujitsu + +// fujixerox : 2015-07-23 Xerox DNHC LLC +fujixerox + +// fun : 2016-01-14 DotSpace Inc. +fun + +// fund : 2014-03-20 Binky Moon, LLC +fund + +// furniture : 2014-03-20 Binky Moon, LLC +furniture + +// futbol : 2013-09-20 Dog Beach, LLC +futbol + +// fyi : 2015-04-02 Binky Moon, LLC +fyi + +// gal : 2013-11-07 Asociación puntoGAL +gal + +// gallery : 2013-09-13 Binky Moon, LLC +gallery + +// gallo : 2015-06-11 Gallo Vineyards, Inc. +gallo + +// gallup : 2015-02-19 Gallup, Inc. +gallup + +// game : 2015-05-28 Uniregistry, Corp. +game + +// games : 2015-05-28 Dog Beach, LLC +games + +// gap : 2015-07-31 The Gap, Inc. +gap + +// garden : 2014-06-26 Minds + Machines Group Limited +garden + +// gay : 2019-05-23 Top Level Design, LLC +gay + +// gbiz : 2014-07-17 Charleston Road Registry Inc. +gbiz + +// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" +gdn + +// gea : 2014-12-04 GEA Group Aktiengesellschaft +gea + +// gent : 2014-01-23 COMBELL NV +gent + +// genting : 2015-03-12 Resorts World Inc Pte. Ltd. +genting + +// george : 2015-07-31 Wal-Mart Stores, Inc. +george + +// ggee : 2014-01-09 GMO Internet, Inc. +ggee + +// gift : 2013-10-17 DotGift, LLC +gift + +// gifts : 2014-07-03 Binky Moon, LLC +gifts + +// gives : 2014-03-06 Dog Beach, LLC +gives + +// giving : 2014-11-13 Giving Limited +giving + +// glade : 2015-07-23 Johnson Shareholdings, Inc. +glade + +// glass : 2013-11-07 Binky Moon, LLC +glass + +// gle : 2014-07-24 Charleston Road Registry Inc. +gle + +// global : 2014-04-17 Dot Global Domain Registry Limited +global + +// globo : 2013-12-19 Globo Comunicação e Participações S.A +globo + +// gmail : 2014-05-01 Charleston Road Registry Inc. +gmail + +// gmbh : 2016-01-29 Binky Moon, LLC +gmbh + +// gmo : 2014-01-09 GMO Internet, Inc. +gmo + +// gmx : 2014-04-24 1&1 Mail & Media GmbH +gmx + +// godaddy : 2015-07-23 Go Daddy East, LLC +godaddy + +// gold : 2015-01-22 Binky Moon, LLC +gold + +// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +goldpoint + +// golf : 2014-12-18 Binky Moon, LLC +golf + +// goo : 2014-12-18 NTT Resonant Inc. +goo + +// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company +goodyear + +// goog : 2014-11-20 Charleston Road Registry Inc. +goog + +// google : 2014-07-24 Charleston Road Registry Inc. +google + +// gop : 2014-01-16 Republican State Leadership Committee, Inc. +gop + +// got : 2014-12-18 Amazon Registry Services, Inc. +got + +// grainger : 2015-05-07 Grainger Registry Services, LLC +grainger + +// graphics : 2013-09-13 Binky Moon, LLC +graphics + +// gratis : 2014-03-20 Binky Moon, LLC +gratis + +// green : 2014-05-08 Afilias Limited +green + +// gripe : 2014-03-06 Binky Moon, LLC +gripe + +// grocery : 2016-06-16 Wal-Mart Stores, Inc. +grocery + +// group : 2014-08-15 Binky Moon, LLC +group + +// guardian : 2015-07-30 The Guardian Life Insurance Company of America +guardian + +// gucci : 2014-11-13 Guccio Gucci S.p.a. +gucci + +// guge : 2014-08-28 Charleston Road Registry Inc. +guge + +// guide : 2013-09-13 Binky Moon, LLC +guide + +// guitars : 2013-11-14 Uniregistry, Corp. +guitars + +// guru : 2013-08-27 Binky Moon, LLC +guru + +// hair : 2015-12-03 L'Oréal +hair + +// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH +hamburg + +// hangout : 2014-11-13 Charleston Road Registry Inc. +hangout + +// haus : 2013-12-05 Dog Beach, LLC +haus + +// hbo : 2015-07-30 HBO Registry Services, Inc. +hbo + +// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED +hdfc + +// hdfcbank : 2015-02-12 HDFC Bank Limited +hdfcbank + +// health : 2015-02-11 DotHealth, LLC +health + +// healthcare : 2014-06-12 Binky Moon, LLC +healthcare + +// help : 2014-06-26 Uniregistry, Corp. +help + +// helsinki : 2015-02-05 City of Helsinki +helsinki + +// here : 2014-02-06 Charleston Road Registry Inc. +here + +// hermes : 2014-07-10 HERMES INTERNATIONAL +hermes + +// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. +hgtv + +// hiphop : 2014-03-06 Uniregistry, Corp. +hiphop + +// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. +hisamitsu + +// hitachi : 2014-10-31 Hitachi, Ltd. +hitachi + +// hiv : 2014-03-13 Uniregistry, Corp. +hiv + +// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited +hkt + +// hockey : 2015-03-19 Binky Moon, LLC +hockey + +// holdings : 2013-08-27 Binky Moon, LLC +holdings + +// holiday : 2013-11-07 Binky Moon, LLC +holiday + +// homedepot : 2015-04-02 Home Depot Product Authority, LLC +homedepot + +// homegoods : 2015-07-16 The TJX Companies, Inc. +homegoods + +// homes : 2014-01-09 DERHomes, LLC +homes + +// homesense : 2015-07-16 The TJX Companies, Inc. +homesense + +// honda : 2014-12-18 Honda Motor Co., Ltd. +honda + +// horse : 2013-11-21 Minds + Machines Group Limited +horse + +// hospital : 2016-10-20 Binky Moon, LLC +hospital + +// host : 2014-04-17 DotHost Inc. +host + +// hosting : 2014-05-29 Uniregistry, Corp. +hosting + +// hot : 2015-08-27 Amazon Registry Services, Inc. +hot + +// hoteles : 2015-03-05 Travel Reservations SRL +hoteles + +// hotels : 2016-04-07 Booking.com B.V. +hotels + +// hotmail : 2014-12-18 Microsoft Corporation +hotmail + +// house : 2013-11-07 Binky Moon, LLC +house + +// how : 2014-01-23 Charleston Road Registry Inc. +how + +// hsbc : 2014-10-24 HSBC Global Services (UK) Limited +hsbc + +// hughes : 2015-07-30 Hughes Satellite Systems Corporation +hughes + +// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. +hyatt + +// hyundai : 2015-07-09 Hyundai Motor Company +hyundai + +// ibm : 2014-07-31 International Business Machines Corporation +ibm + +// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited +icbc + +// ice : 2014-10-30 IntercontinentalExchange, Inc. +ice + +// icu : 2015-01-08 ShortDot SA +icu + +// ieee : 2015-07-23 IEEE Global LLC +ieee + +// ifm : 2014-01-30 ifm electronic gmbh +ifm + +// ikano : 2015-07-09 Ikano S.A. +ikano + +// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +imamat + +// imdb : 2015-06-25 Amazon Registry Services, Inc. +imdb + +// immo : 2014-07-10 Binky Moon, LLC +immo + +// immobilien : 2013-11-07 Dog Beach, LLC +immobilien + +// inc : 2018-03-10 Intercap Registry Inc. +inc + +// industries : 2013-12-05 Binky Moon, LLC +industries + +// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. +infiniti + +// ing : 2014-01-23 Charleston Road Registry Inc. +ing + +// ink : 2013-12-05 Top Level Design, LLC +ink + +// institute : 2013-11-07 Binky Moon, LLC +institute + +// insurance : 2015-02-19 fTLD Registry Services LLC +insurance + +// insure : 2014-03-20 Binky Moon, LLC +insure + +// intel : 2015-08-06 Intel Corporation +intel + +// international : 2013-11-07 Binky Moon, LLC +international + +// intuit : 2015-07-30 Intuit Administrative Services, Inc. +intuit + +// investments : 2014-03-20 Binky Moon, LLC +investments + +// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. +ipiranga + +// irish : 2014-08-07 Binky Moon, LLC +irish + +// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +ismaili + +// ist : 2014-08-28 Istanbul Metropolitan Municipality +ist + +// istanbul : 2014-08-28 Istanbul Metropolitan Municipality +istanbul + +// itau : 2014-10-02 Itau Unibanco Holding S.A. +itau + +// itv : 2015-07-09 ITV Services Limited +itv + +// iveco : 2015-09-03 CNH Industrial N.V. +iveco + +// jaguar : 2014-11-13 Jaguar Land Rover Ltd +jaguar + +// java : 2014-06-19 Oracle Corporation +java + +// jcb : 2014-11-20 JCB Co., Ltd. +jcb + +// jcp : 2015-04-23 JCP Media, Inc. +jcp + +// jeep : 2015-07-30 FCA US LLC. +jeep + +// jetzt : 2014-01-09 Binky Moon, LLC +jetzt + +// jewelry : 2015-03-05 Binky Moon, LLC +jewelry + +// jio : 2015-04-02 Reliance Industries Limited +jio + +// jll : 2015-04-02 Jones Lang LaSalle Incorporated +jll + +// jmp : 2015-03-26 Matrix IP LLC +jmp + +// jnj : 2015-06-18 Johnson & Johnson Services, Inc. +jnj + +// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +joburg + +// jot : 2014-12-18 Amazon Registry Services, Inc. +jot + +// joy : 2014-12-18 Amazon Registry Services, Inc. +joy + +// jpmorgan : 2015-04-30 JPMorgan Chase Bank, National Association +jpmorgan + +// jprs : 2014-09-18 Japan Registry Services Co., Ltd. +jprs + +// juegos : 2014-03-20 Uniregistry, Corp. +juegos + +// juniper : 2015-07-30 JUNIPER NETWORKS, INC. +juniper + +// kaufen : 2013-11-07 Dog Beach, LLC +kaufen + +// kddi : 2014-09-12 KDDI CORPORATION +kddi + +// kerryhotels : 2015-04-30 Kerry Trading Co. Limited +kerryhotels + +// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited +kerrylogistics + +// kerryproperties : 2015-04-09 Kerry Trading Co. Limited +kerryproperties + +// kfh : 2014-12-04 Kuwait Finance House +kfh + +// kia : 2015-07-09 KIA MOTORS CORPORATION +kia + +// kim : 2013-09-23 Afilias Limited +kim + +// kinder : 2014-11-07 Ferrero Trading Lux S.A. +kinder + +// kindle : 2015-06-25 Amazon Registry Services, Inc. +kindle + +// kitchen : 2013-09-20 Binky Moon, LLC +kitchen + +// kiwi : 2013-09-20 DOT KIWI LIMITED +kiwi + +// koeln : 2014-01-09 dotKoeln GmbH +koeln + +// komatsu : 2015-01-08 Komatsu Ltd. +komatsu + +// kosher : 2015-08-20 Kosher Marketing Assets LLC +kosher + +// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) +kpmg + +// kpn : 2015-01-08 Koninklijke KPN N.V. +kpn + +// krd : 2013-12-05 KRG Department of Information Technology +krd + +// kred : 2013-12-19 KredTLD Pty Ltd +kred + +// kuokgroup : 2015-04-09 Kerry Trading Co. Limited +kuokgroup + +// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen +kyoto + +// lacaixa : 2014-01-09 Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa” +lacaixa + +// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. +lamborghini + +// lamer : 2015-10-01 The Estée Lauder Companies Inc. +lamer + +// lancaster : 2015-02-12 LANCASTER +lancaster + +// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. +lancia + +// land : 2013-09-10 Binky Moon, LLC +land + +// landrover : 2014-11-13 Jaguar Land Rover Ltd +landrover + +// lanxess : 2015-07-30 LANXESS Corporation +lanxess + +// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated +lasalle + +// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico +lat + +// latino : 2015-07-30 Dish DBS Corporation +latino + +// latrobe : 2014-06-16 La Trobe University +latrobe + +// law : 2015-01-22 LW TLD Limited +law + +// lawyer : 2014-03-20 Dog Beach, LLC +lawyer + +// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") +lds + +// lease : 2014-03-06 Binky Moon, LLC +lease + +// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +leclerc + +// lefrak : 2015-07-16 LeFrak Organization, Inc. +lefrak + +// legal : 2014-10-16 Binky Moon, LLC +legal + +// lego : 2015-07-16 LEGO Juris A/S +lego + +// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION +lexus + +// lgbt : 2014-05-08 Afilias Limited +lgbt + +// liaison : 2014-10-02 Liaison Technologies, Incorporated +liaison + +// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +lidl + +// life : 2014-02-06 Binky Moon, LLC +life + +// lifeinsurance : 2015-01-15 American Council of Life Insurers +lifeinsurance + +// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. +lifestyle + +// lighting : 2013-08-27 Binky Moon, LLC +lighting + +// like : 2014-12-18 Amazon Registry Services, Inc. +like + +// lilly : 2015-07-31 Eli Lilly and Company +lilly + +// limited : 2014-03-06 Binky Moon, LLC +limited + +// limo : 2013-10-17 Binky Moon, LLC +limo + +// lincoln : 2014-11-13 Ford Motor Company +lincoln + +// linde : 2014-12-04 Linde Aktiengesellschaft +linde + +// link : 2013-11-14 Uniregistry, Corp. +link + +// lipsy : 2015-06-25 Lipsy Ltd +lipsy + +// live : 2014-12-04 Dog Beach, LLC +live + +// living : 2015-07-30 Lifestyle Domain Holdings, Inc. +living + +// lixil : 2015-03-19 LIXIL Group Corporation +lixil + +// llc : 2017-12-14 Afilias Limited +llc + +// llp : 2019-08-26 Dot Registry LLC +llp + +// loan : 2014-11-20 dot Loan Limited +loan + +// loans : 2014-03-20 Binky Moon, LLC +loans + +// locker : 2015-06-04 Dish DBS Corporation +locker + +// locus : 2015-06-25 Locus Analytics LLC +locus + +// loft : 2015-07-30 Annco, Inc. +loft + +// lol : 2015-01-30 Uniregistry, Corp. +lol + +// london : 2013-11-14 Dot London Domains Limited +london + +// lotte : 2014-11-07 Lotte Holdings Co., Ltd. +lotte + +// lotto : 2014-04-10 Afilias Limited +lotto + +// love : 2014-12-22 Merchant Law Group LLP +love + +// lpl : 2015-07-30 LPL Holdings, Inc. +lpl + +// lplfinancial : 2015-07-30 LPL Holdings, Inc. +lplfinancial + +// ltd : 2014-09-25 Binky Moon, LLC +ltd + +// ltda : 2014-04-17 InterNetX, Corp +ltda + +// lundbeck : 2015-08-06 H. Lundbeck A/S +lundbeck + +// lupin : 2014-11-07 LUPIN LIMITED +lupin + +// luxe : 2014-01-09 Minds + Machines Group Limited +luxe + +// luxury : 2013-10-17 Luxury Partners, LLC +luxury + +// macys : 2015-07-31 Macys, Inc. +macys + +// madrid : 2014-05-01 Comunidad de Madrid +madrid + +// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) +maif + +// maison : 2013-12-05 Binky Moon, LLC +maison + +// makeup : 2015-01-15 L'Oréal +makeup + +// man : 2014-12-04 MAN SE +man + +// management : 2013-11-07 Binky Moon, LLC +management + +// mango : 2013-10-24 PUNTO FA S.L. +mango + +// map : 2016-06-09 Charleston Road Registry Inc. +map + +// market : 2014-03-06 Dog Beach, LLC +market + +// marketing : 2013-11-07 Binky Moon, LLC +marketing + +// markets : 2014-12-11 Dotmarkets Registry Limited +markets + +// marriott : 2014-10-09 Marriott Worldwide Corporation +marriott + +// marshalls : 2015-07-16 The TJX Companies, Inc. +marshalls + +// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V. +maserati + +// mattel : 2015-08-06 Mattel Sites, Inc. +mattel + +// mba : 2015-04-02 Binky Moon, LLC +mba + +// mckinsey : 2015-07-31 McKinsey Holdings, Inc. +mckinsey + +// med : 2015-08-06 Medistry LLC +med + +// media : 2014-03-06 Binky Moon, LLC +media + +// meet : 2014-01-16 Charleston Road Registry Inc. +meet + +// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +melbourne + +// meme : 2014-01-30 Charleston Road Registry Inc. +meme + +// memorial : 2014-10-16 Dog Beach, LLC +memorial + +// men : 2015-02-26 Exclusive Registry Limited +men + +// menu : 2013-09-11 Dot Menu Registry, LLC +menu + +// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. +merckmsd + +// metlife : 2015-05-07 MetLife Services and Solutions, LLC +metlife + +// miami : 2013-12-19 Minds + Machines Group Limited +miami + +// microsoft : 2014-12-18 Microsoft Corporation +microsoft + +// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +mini + +// mint : 2015-07-30 Intuit Administrative Services, Inc. +mint + +// mit : 2015-07-02 Massachusetts Institute of Technology +mit + +// mitsubishi : 2015-07-23 Mitsubishi Corporation +mitsubishi + +// mlb : 2015-05-21 MLB Advanced Media DH, LLC +mlb + +// mls : 2015-04-23 The Canadian Real Estate Association +mls + +// mma : 2014-11-07 MMA IARD +mma + +// mobile : 2016-06-02 Dish DBS Corporation +mobile + +// moda : 2013-11-07 Dog Beach, LLC +moda + +// moe : 2013-11-13 Interlink Co., Ltd. +moe + +// moi : 2014-12-18 Amazon Registry Services, Inc. +moi + +// mom : 2015-04-16 Uniregistry, Corp. +mom + +// monash : 2013-09-30 Monash University +monash + +// money : 2014-10-16 Binky Moon, LLC +money + +// monster : 2015-09-11 XYZ.COM LLC +monster + +// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") +mormon + +// mortgage : 2014-03-20 Dog Beach, LLC +mortgage + +// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +moscow + +// moto : 2015-06-04 Motorola Trademark Holdings, LLC +moto + +// motorcycles : 2014-01-09 DERMotorcycles, LLC +motorcycles + +// mov : 2014-01-30 Charleston Road Registry Inc. +mov + +// movie : 2015-02-05 Binky Moon, LLC +movie + +// movistar : 2014-10-16 Telefónica S.A. +movistar + +// msd : 2015-07-23 MSD Registry Holdings, Inc. +msd + +// mtn : 2014-12-04 MTN Dubai Limited +mtn + +// mtr : 2015-03-12 MTR Corporation Limited +mtr + +// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC +mutual + +// nab : 2015-08-20 National Australia Bank Limited +nab + +// nadex : 2014-12-11 Nadex Domains, Inc. +nadex + +// nagoya : 2013-10-24 GMO Registry, Inc. +nagoya + +// nationwide : 2015-07-23 Nationwide Mutual Insurance Company +nationwide + +// natura : 2015-03-12 NATURA COSMÉTICOS S.A. +natura + +// navy : 2014-03-06 Dog Beach, LLC +navy + +// nba : 2015-07-31 NBA REGISTRY, LLC +nba + +// nec : 2015-01-08 NEC Corporation +nec + +// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +netbank + +// netflix : 2015-06-18 Netflix, Inc. +netflix + +// network : 2013-11-14 Binky Moon, LLC +network + +// neustar : 2013-12-05 Registry Services, LLC +neustar + +// new : 2014-01-30 Charleston Road Registry Inc. +new + +// newholland : 2015-09-03 CNH Industrial N.V. +newholland + +// news : 2014-12-18 Dog Beach, LLC +news + +// next : 2015-06-18 Next plc +next + +// nextdirect : 2015-06-18 Next plc +nextdirect + +// nexus : 2014-07-24 Charleston Road Registry Inc. +nexus + +// nfl : 2015-07-23 NFL Reg Ops LLC +nfl + +// ngo : 2014-03-06 Public Interest Registry +ngo + +// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) +nhk + +// nico : 2014-12-04 DWANGO Co., Ltd. +nico + +// nike : 2015-07-23 NIKE, Inc. +nike + +// nikon : 2015-05-21 NIKON CORPORATION +nikon + +// ninja : 2013-11-07 Dog Beach, LLC +ninja + +// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. +nissan + +// nissay : 2015-10-29 Nippon Life Insurance Company +nissay + +// nokia : 2015-01-08 Nokia Corporation +nokia + +// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC +northwesternmutual + +// norton : 2014-12-04 Symantec Corporation +norton + +// now : 2015-06-25 Amazon Registry Services, Inc. +now + +// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +nowruz + +// nowtv : 2015-05-14 Starbucks (HK) Limited +nowtv + +// nra : 2014-05-22 NRA Holdings Company, INC. +nra + +// nrw : 2013-11-21 Minds + Machines GmbH +nrw + +// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION +ntt + +// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications +nyc + +// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA +obi + +// observer : 2015-04-30 Top Level Spectrum, Inc. +observer + +// off : 2015-07-23 Johnson Shareholdings, Inc. +off + +// office : 2015-03-12 Microsoft Corporation +office + +// okinawa : 2013-12-05 BRregistry, Inc. +okinawa + +// olayan : 2015-05-14 Crescent Holding GmbH +olayan + +// olayangroup : 2015-05-14 Crescent Holding GmbH +olayangroup + +// oldnavy : 2015-07-31 The Gap, Inc. +oldnavy + +// ollo : 2015-06-04 Dish DBS Corporation +ollo + +// omega : 2015-01-08 The Swatch Group Ltd +omega + +// one : 2014-11-07 One.com A/S +one + +// ong : 2014-03-06 Public Interest Registry +ong + +// onl : 2013-09-16 I-Registry Ltd. +onl + +// online : 2015-01-15 DotOnline Inc. +online + +// onyourside : 2015-07-23 Nationwide Mutual Insurance Company +onyourside + +// ooo : 2014-01-09 INFIBEAM AVENUES LIMITED +ooo + +// open : 2015-07-31 American Express Travel Related Services Company, Inc. +open + +// oracle : 2014-06-19 Oracle Corporation +oracle + +// orange : 2015-03-12 Orange Brand Services Limited +orange + +// organic : 2014-03-27 Afilias Limited +organic + +// origins : 2015-10-01 The Estée Lauder Companies Inc. +origins + +// osaka : 2014-09-04 Osaka Registry Co., Ltd. +osaka + +// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. +otsuka + +// ott : 2015-06-04 Dish DBS Corporation +ott + +// ovh : 2014-01-16 MédiaBC +ovh + +// page : 2014-12-04 Charleston Road Registry Inc. +page + +// panasonic : 2015-07-30 Panasonic Corporation +panasonic + +// paris : 2014-01-30 City of Paris +paris + +// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +pars + +// partners : 2013-12-05 Binky Moon, LLC +partners + +// parts : 2013-12-05 Binky Moon, LLC +parts + +// party : 2014-09-11 Blue Sky Registry Limited +party + +// passagens : 2015-03-05 Travel Reservations SRL +passagens + +// pay : 2015-08-27 Amazon Registry Services, Inc. +pay + +// pccw : 2015-05-14 PCCW Enterprises Limited +pccw + +// pet : 2015-05-07 Afilias Limited +pet + +// pfizer : 2015-09-11 Pfizer Inc. +pfizer + +// pharmacy : 2014-06-19 National Association of Boards of Pharmacy +pharmacy + +// phd : 2016-07-28 Charleston Road Registry Inc. +phd + +// philips : 2014-11-07 Koninklijke Philips N.V. +philips + +// phone : 2016-06-02 Dish DBS Corporation +phone + +// photo : 2013-11-14 Uniregistry, Corp. +photo + +// photography : 2013-09-20 Binky Moon, LLC +photography + +// photos : 2013-10-17 Binky Moon, LLC +photos + +// physio : 2014-05-01 PhysBiz Pty Ltd +physio + +// pics : 2013-11-14 Uniregistry, Corp. +pics + +// pictet : 2014-06-26 Pictet Europe S.A. +pictet + +// pictures : 2014-03-06 Binky Moon, LLC +pictures + +// pid : 2015-01-08 Top Level Spectrum, Inc. +pid + +// pin : 2014-12-18 Amazon Registry Services, Inc. +pin + +// ping : 2015-06-11 Ping Registry Provider, Inc. +ping + +// pink : 2013-10-01 Afilias Limited +pink + +// pioneer : 2015-07-16 Pioneer Corporation +pioneer + +// pizza : 2014-06-26 Binky Moon, LLC +pizza + +// place : 2014-04-24 Binky Moon, LLC +place + +// play : 2015-03-05 Charleston Road Registry Inc. +play + +// playstation : 2015-07-02 Sony Interactive Entertainment Inc. +playstation + +// plumbing : 2013-09-10 Binky Moon, LLC +plumbing + +// plus : 2015-02-05 Binky Moon, LLC +plus + +// pnc : 2015-07-02 PNC Domain Co., LLC +pnc + +// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +pohl + +// poker : 2014-07-03 Afilias Limited +poker + +// politie : 2015-08-20 Politie Nederland +politie + +// porn : 2014-10-16 ICM Registry PN LLC +porn + +// pramerica : 2015-07-30 Prudential Financial, Inc. +pramerica + +// praxi : 2013-12-05 Praxi S.p.A. +praxi + +// press : 2014-04-03 DotPress Inc. +press + +// prime : 2015-06-25 Amazon Registry Services, Inc. +prime + +// prod : 2014-01-23 Charleston Road Registry Inc. +prod + +// productions : 2013-12-05 Binky Moon, LLC +productions + +// prof : 2014-07-24 Charleston Road Registry Inc. +prof + +// progressive : 2015-07-23 Progressive Casualty Insurance Company +progressive + +// promo : 2014-12-18 Afilias Limited +promo + +// properties : 2013-12-05 Binky Moon, LLC +properties + +// property : 2014-05-22 Uniregistry, Corp. +property + +// protection : 2015-04-23 XYZ.COM LLC +protection + +// pru : 2015-07-30 Prudential Financial, Inc. +pru + +// prudential : 2015-07-30 Prudential Financial, Inc. +prudential + +// pub : 2013-12-12 Dog Beach, LLC +pub + +// pwc : 2015-10-29 PricewaterhouseCoopers LLP +pwc + +// qpon : 2013-11-14 dotCOOL, Inc. +qpon + +// quebec : 2013-12-19 PointQuébec Inc +quebec + +// quest : 2015-03-26 XYZ.COM LLC +quest + +// qvc : 2015-07-30 QVC, Inc. +qvc + +// racing : 2014-12-04 Premier Registry Limited +racing + +// radio : 2016-07-21 European Broadcasting Union (EBU) +radio + +// raid : 2015-07-23 Johnson Shareholdings, Inc. +raid + +// read : 2014-12-18 Amazon Registry Services, Inc. +read + +// realestate : 2015-09-11 dotRealEstate LLC +realestate + +// realtor : 2014-05-29 Real Estate Domains LLC +realtor + +// realty : 2015-03-19 Fegistry, LLC +realty + +// recipes : 2013-10-17 Binky Moon, LLC +recipes + +// red : 2013-11-07 Afilias Limited +red + +// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. +redstone + +// redumbrella : 2015-03-26 Travelers TLD, LLC +redumbrella + +// rehab : 2014-03-06 Dog Beach, LLC +rehab + +// reise : 2014-03-13 Binky Moon, LLC +reise + +// reisen : 2014-03-06 Binky Moon, LLC +reisen + +// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. +reit + +// reliance : 2015-04-02 Reliance Industries Limited +reliance + +// ren : 2013-12-12 ZDNS International Limited +ren + +// rent : 2014-12-04 XYZ.COM LLC +rent + +// rentals : 2013-12-05 Binky Moon, LLC +rentals + +// repair : 2013-11-07 Binky Moon, LLC +repair + +// report : 2013-12-05 Binky Moon, LLC +report + +// republican : 2014-03-20 Dog Beach, LLC +republican + +// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +rest + +// restaurant : 2014-07-03 Binky Moon, LLC +restaurant + +// review : 2014-11-20 dot Review Limited +review + +// reviews : 2013-09-13 Dog Beach, LLC +reviews + +// rexroth : 2015-06-18 Robert Bosch GMBH +rexroth + +// rich : 2013-11-21 I-Registry Ltd. +rich + +// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited +richardli + +// ricoh : 2014-11-20 Ricoh Company, Ltd. +ricoh + +// rightathome : 2015-07-23 Johnson Shareholdings, Inc. +rightathome + +// ril : 2015-04-02 Reliance Industries Limited +ril + +// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO +rio + +// rip : 2014-07-10 Dog Beach, LLC +rip + +// rmit : 2015-11-19 Royal Melbourne Institute of Technology +rmit + +// rocher : 2014-12-18 Ferrero Trading Lux S.A. +rocher + +// rocks : 2013-11-14 Dog Beach, LLC +rocks + +// rodeo : 2013-12-19 Minds + Machines Group Limited +rodeo + +// rogers : 2015-08-06 Rogers Communications Canada Inc. +rogers + +// room : 2014-12-18 Amazon Registry Services, Inc. +room + +// rsvp : 2014-05-08 Charleston Road Registry Inc. +rsvp + +// rugby : 2016-12-15 World Rugby Strategic Developments Limited +rugby + +// ruhr : 2013-10-02 regiodot GmbH & Co. KG +ruhr + +// run : 2015-03-19 Binky Moon, LLC +run + +// rwe : 2015-04-02 RWE AG +rwe + +// ryukyu : 2014-01-09 BRregistry, Inc. +ryukyu + +// saarland : 2013-12-12 dotSaarland GmbH +saarland + +// safe : 2014-12-18 Amazon Registry Services, Inc. +safe + +// safety : 2015-01-08 Safety Registry Services, LLC. +safety + +// sakura : 2014-12-18 SAKURA Internet Inc. +sakura + +// sale : 2014-10-16 Dog Beach, LLC +sale + +// salon : 2014-12-11 Binky Moon, LLC +salon + +// samsclub : 2015-07-31 Wal-Mart Stores, Inc. +samsclub + +// samsung : 2014-04-03 SAMSUNG SDS CO., LTD +samsung + +// sandvik : 2014-11-13 Sandvik AB +sandvik + +// sandvikcoromant : 2014-11-07 Sandvik AB +sandvikcoromant + +// sanofi : 2014-10-09 Sanofi +sanofi + +// sap : 2014-03-27 SAP AG +sap + +// sarl : 2014-07-03 Binky Moon, LLC +sarl + +// sas : 2015-04-02 Research IP LLC +sas + +// save : 2015-06-25 Amazon Registry Services, Inc. +save + +// saxo : 2014-10-31 Saxo Bank A/S +saxo + +// sbi : 2015-03-12 STATE BANK OF INDIA +sbi + +// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION +sbs + +// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) +sca + +// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") +scb + +// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG +schaeffler + +// schmidt : 2014-04-03 SCHMIDT GROUPE S.A.S. +schmidt + +// scholarships : 2014-04-24 Scholarships.com, LLC +scholarships + +// school : 2014-12-18 Binky Moon, LLC +school + +// schule : 2014-03-06 Binky Moon, LLC +schule + +// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +schwarz + +// science : 2014-09-11 dot Science Limited +science + +// scjohnson : 2015-07-23 Johnson Shareholdings, Inc. +scjohnson + +// scor : 2014-10-31 SCOR SE +scor + +// scot : 2014-01-23 Dot Scot Registry Limited +scot + +// search : 2016-06-09 Charleston Road Registry Inc. +search + +// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) +seat + +// secure : 2015-08-27 Amazon Registry Services, Inc. +secure + +// security : 2015-05-14 XYZ.COM LLC +security + +// seek : 2014-12-04 Seek Limited +seek + +// select : 2015-10-08 Registry Services, LLC +select + +// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. +sener + +// services : 2014-02-27 Binky Moon, LLC +services + +// ses : 2015-07-23 SES +ses + +// seven : 2015-08-06 Seven West Media Ltd +seven + +// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG +sew + +// sex : 2014-11-13 ICM Registry SX LLC +sex + +// sexy : 2013-09-11 Uniregistry, Corp. +sexy + +// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR +sfr + +// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited +shangrila + +// sharp : 2014-05-01 Sharp Corporation +sharp + +// shaw : 2015-04-23 Shaw Cablesystems G.P. +shaw + +// shell : 2015-07-30 Shell Information Technology International Inc +shell + +// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +shia + +// shiksha : 2013-11-14 Afilias Limited +shiksha + +// shoes : 2013-10-02 Binky Moon, LLC +shoes + +// shop : 2016-04-08 GMO Registry, Inc. +shop + +// shopping : 2016-03-31 Binky Moon, LLC +shopping + +// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +shouji + +// show : 2015-03-05 Binky Moon, LLC +show + +// showtime : 2015-08-06 CBS Domains Inc. +showtime + +// shriram : 2014-01-23 Shriram Capital Ltd. +shriram + +// silk : 2015-06-25 Amazon Registry Services, Inc. +silk + +// sina : 2015-03-12 Sina Corporation +sina + +// singles : 2013-08-27 Binky Moon, LLC +singles + +// site : 2015-01-15 DotSite Inc. +site + +// ski : 2015-04-09 Afilias Limited +ski + +// skin : 2015-01-15 L'Oréal +skin + +// sky : 2014-06-19 Sky International AG +sky + +// skype : 2014-12-18 Microsoft Corporation +skype + +// sling : 2015-07-30 DISH Technologies L.L.C. +sling + +// smart : 2015-07-09 Smart Communications, Inc. (SMART) +smart + +// smile : 2014-12-18 Amazon Registry Services, Inc. +smile + +// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F +sncf + +// soccer : 2015-03-26 Binky Moon, LLC +soccer + +// social : 2013-11-07 Dog Beach, LLC +social + +// softbank : 2015-07-02 SoftBank Group Corp. +softbank + +// software : 2014-03-20 Dog Beach, LLC +software + +// sohu : 2013-12-19 Sohu.com Limited +sohu + +// solar : 2013-11-07 Binky Moon, LLC +solar + +// solutions : 2013-11-07 Binky Moon, LLC +solutions + +// song : 2015-02-26 Amazon Registry Services, Inc. +song + +// sony : 2015-01-08 Sony Corporation +sony + +// soy : 2014-01-23 Charleston Road Registry Inc. +soy + +// spa : 2019-09-19 Asia Spa and Wellness Promotion Council Limited +spa + +// space : 2014-04-03 DotSpace Inc. +space + +// sport : 2017-11-16 Global Association of International Sports Federations (GAISF) +sport + +// spot : 2015-02-26 Amazon Registry Services, Inc. +spot + +// spreadbetting : 2014-12-11 Dotspreadbetting Registry Limited +spreadbetting + +// srl : 2015-05-07 InterNetX, Corp +srl + +// stada : 2014-11-13 STADA Arzneimittel AG +stada + +// staples : 2015-07-30 Staples, Inc. +staples + +// star : 2015-01-08 Star India Private Limited +star + +// statebank : 2015-03-12 STATE BANK OF INDIA +statebank + +// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company +statefarm + +// stc : 2014-10-09 Saudi Telecom Company +stc + +// stcgroup : 2014-10-09 Saudi Telecom Company +stcgroup + +// stockholm : 2014-12-18 Stockholms kommun +stockholm + +// storage : 2014-12-22 XYZ.COM LLC +storage + +// store : 2015-04-09 DotStore Inc. +store + +// stream : 2016-01-08 dot Stream Limited +stream + +// studio : 2015-02-11 Dog Beach, LLC +studio + +// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD +study + +// style : 2014-12-04 Binky Moon, LLC +style + +// sucks : 2014-12-22 Vox Populi Registry Ltd. +sucks + +// supplies : 2013-12-19 Binky Moon, LLC +supplies + +// supply : 2013-12-19 Binky Moon, LLC +supply + +// support : 2013-10-24 Binky Moon, LLC +support + +// surf : 2014-01-09 Minds + Machines Group Limited +surf + +// surgery : 2014-03-20 Binky Moon, LLC +surgery + +// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION +suzuki + +// swatch : 2015-01-08 The Swatch Group Ltd +swatch + +// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited +swiftcover + +// swiss : 2014-10-16 Swiss Confederation +swiss + +// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet +sydney + +// symantec : 2014-12-04 Symantec Corporation +symantec + +// systems : 2013-11-07 Binky Moon, LLC +systems + +// tab : 2014-12-04 Tabcorp Holdings Limited +tab + +// taipei : 2014-07-10 Taipei City Government +taipei + +// talk : 2015-04-09 Amazon Registry Services, Inc. +talk + +// taobao : 2015-01-15 Alibaba Group Holding Limited +taobao + +// target : 2015-07-31 Target Domain Holdings, LLC +target + +// tatamotors : 2015-03-12 Tata Motors Ltd +tatamotors + +// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +tatar + +// tattoo : 2013-08-30 Uniregistry, Corp. +tattoo + +// tax : 2014-03-20 Binky Moon, LLC +tax + +// taxi : 2015-03-19 Binky Moon, LLC +taxi + +// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +tci + +// tdk : 2015-06-11 TDK Corporation +tdk + +// team : 2015-03-05 Binky Moon, LLC +team + +// tech : 2015-01-30 Personals TLD Inc. +tech + +// technology : 2013-09-13 Binky Moon, LLC +technology + +// telefonica : 2014-10-16 Telefónica S.A. +telefonica + +// temasek : 2014-08-07 Temasek Holdings (Private) Limited +temasek + +// tennis : 2014-12-04 Binky Moon, LLC +tennis + +// teva : 2015-07-02 Teva Pharmaceutical Industries Limited +teva + +// thd : 2015-04-02 Home Depot Product Authority, LLC +thd + +// theater : 2015-03-19 Binky Moon, LLC +theater + +// theatre : 2015-05-07 XYZ.COM LLC +theatre + +// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America +tiaa + +// tickets : 2015-02-05 Accent Media Limited +tickets + +// tienda : 2013-11-14 Binky Moon, LLC +tienda + +// tiffany : 2015-01-30 Tiffany and Company +tiffany + +// tips : 2013-09-20 Binky Moon, LLC +tips + +// tires : 2014-11-07 Binky Moon, LLC +tires + +// tirol : 2014-04-24 punkt Tirol GmbH +tirol + +// tjmaxx : 2015-07-16 The TJX Companies, Inc. +tjmaxx + +// tjx : 2015-07-16 The TJX Companies, Inc. +tjx + +// tkmaxx : 2015-07-16 The TJX Companies, Inc. +tkmaxx + +// tmall : 2015-01-15 Alibaba Group Holding Limited +tmall + +// today : 2013-09-20 Binky Moon, LLC +today + +// tokyo : 2013-11-13 GMO Registry, Inc. +tokyo + +// tools : 2013-11-21 Binky Moon, LLC +tools + +// top : 2014-03-20 .TOP Registry +top + +// toray : 2014-12-18 Toray Industries, Inc. +toray + +// toshiba : 2014-04-10 TOSHIBA Corporation +toshiba + +// total : 2015-08-06 Total SA +total + +// tours : 2015-01-22 Binky Moon, LLC +tours + +// town : 2014-03-06 Binky Moon, LLC +town + +// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION +toyota + +// toys : 2014-03-06 Binky Moon, LLC +toys + +// trade : 2014-01-23 Elite Registry Limited +trade + +// trading : 2014-12-11 Dottrading Registry Limited +trading + +// training : 2013-11-07 Binky Moon, LLC +training + +// travel : Dog Beach, LLC +travel + +// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +travelchannel + +// travelers : 2015-03-26 Travelers TLD, LLC +travelers + +// travelersinsurance : 2015-03-26 Travelers TLD, LLC +travelersinsurance + +// trust : 2014-10-16 NCC Group Inc. +trust + +// trv : 2015-03-26 Travelers TLD, LLC +trv + +// tube : 2015-06-11 Latin American Telecom LLC +tube + +// tui : 2014-07-03 TUI AG +tui + +// tunes : 2015-02-26 Amazon Registry Services, Inc. +tunes + +// tushu : 2014-12-18 Amazon Registry Services, Inc. +tushu + +// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED +tvs + +// ubank : 2015-08-20 National Australia Bank Limited +ubank + +// ubs : 2014-12-11 UBS AG +ubs + +// unicom : 2015-10-15 China United Network Communications Corporation Limited +unicom + +// university : 2014-03-06 Binky Moon, LLC +university + +// uno : 2013-09-11 DotSite Inc. +uno + +// uol : 2014-05-01 UBN INTERNET LTDA. +uol + +// ups : 2015-06-25 UPS Market Driver, Inc. +ups + +// vacations : 2013-12-05 Binky Moon, LLC +vacations + +// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. +vana + +// vanguard : 2015-09-03 The Vanguard Group, Inc. +vanguard + +// vegas : 2014-01-16 Dot Vegas, Inc. +vegas + +// ventures : 2013-08-27 Binky Moon, LLC +ventures + +// verisign : 2015-08-13 VeriSign, Inc. +verisign + +// versicherung : 2014-03-20 tldbox GmbH +versicherung + +// vet : 2014-03-06 Dog Beach, LLC +vet + +// viajes : 2013-10-17 Binky Moon, LLC +viajes + +// video : 2014-10-16 Dog Beach, LLC +video + +// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +vig + +// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. +viking + +// villas : 2013-12-05 Binky Moon, LLC +villas + +// vin : 2015-06-18 Binky Moon, LLC +vin + +// vip : 2015-01-22 Minds + Machines Group Limited +vip + +// virgin : 2014-09-25 Virgin Enterprises Limited +virgin + +// visa : 2015-07-30 Visa Worldwide Pte. Limited +visa + +// vision : 2013-12-05 Binky Moon, LLC +vision + +// vistaprint : 2014-09-18 Vistaprint Limited +vistaprint + +// viva : 2014-11-07 Saudi Telecom Company +viva + +// vivo : 2015-07-31 Telefonica Brasil S.A. +vivo + +// vlaanderen : 2014-02-06 DNS.be vzw +vlaanderen + +// vodka : 2013-12-19 Minds + Machines Group Limited +vodka + +// volkswagen : 2015-05-14 Volkswagen Group of America Inc. +volkswagen + +// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag +volvo + +// vote : 2013-11-21 Monolith Registry LLC +vote + +// voting : 2013-11-13 Valuetainment Corp. +voting + +// voto : 2013-11-21 Monolith Registry LLC +voto + +// voyage : 2013-08-27 Binky Moon, LLC +voyage + +// vuelos : 2015-03-05 Travel Reservations SRL +vuelos + +// wales : 2014-05-08 Nominet UK +wales + +// walmart : 2015-07-31 Wal-Mart Stores, Inc. +walmart + +// walter : 2014-11-13 Sandvik AB +walter + +// wang : 2013-10-24 Zodiac Wang Limited +wang + +// wanggou : 2014-12-18 Amazon Registry Services, Inc. +wanggou + +// watch : 2013-11-14 Binky Moon, LLC +watch + +// watches : 2014-12-22 Richemont DNS Inc. +watches + +// weather : 2015-01-08 International Business Machines Corporation +weather + +// weatherchannel : 2015-03-12 International Business Machines Corporation +weatherchannel + +// webcam : 2014-01-23 dot Webcam Limited +webcam + +// weber : 2015-06-04 Saint-Gobain Weber SA +weber + +// website : 2014-04-03 DotWebsite Inc. +website + +// wed : 2013-10-01 Atgron, Inc. +wed + +// wedding : 2014-04-24 Minds + Machines Group Limited +wedding + +// weibo : 2015-03-05 Sina Corporation +weibo + +// weir : 2015-01-29 Weir Group IP Limited +weir + +// whoswho : 2014-02-20 Who's Who Registry +whoswho + +// wien : 2013-10-28 punkt.wien GmbH +wien + +// wiki : 2013-11-07 Top Level Design, LLC +wiki + +// williamhill : 2014-03-13 William Hill Organization Limited +williamhill + +// win : 2014-11-20 First Registry Limited +win + +// windows : 2014-12-18 Microsoft Corporation +windows + +// wine : 2015-06-18 Binky Moon, LLC +wine + +// winners : 2015-07-16 The TJX Companies, Inc. +winners + +// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC +wme + +// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. +wolterskluwer + +// woodside : 2015-07-09 Woodside Petroleum Limited +woodside + +// work : 2013-12-19 Minds + Machines Group Limited +work + +// works : 2013-11-14 Binky Moon, LLC +works + +// world : 2014-06-12 Binky Moon, LLC +world + +// wow : 2015-10-08 Amazon Registry Services, Inc. +wow + +// wtc : 2013-12-19 World Trade Centers Association, Inc. +wtc + +// wtf : 2014-03-06 Binky Moon, LLC +wtf + +// xbox : 2014-12-18 Microsoft Corporation +xbox + +// xerox : 2014-10-24 Xerox DNHC LLC +xerox + +// xfinity : 2015-07-09 Comcast IP Holdings I, LLC +xfinity + +// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +xihuan + +// xin : 2014-12-11 Elegant Leader Limited +xin + +// xn--11b4c3d : 2015-01-15 VeriSign Sarl +कॉम + +// xn--1ck2e1b : 2015-02-26 Amazon Registry Services, Inc. +セール + +// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. +佛山 + +// xn--30rr7y : 2014-06-12 Excellent First Limited +慈善 + +// xn--3bst00m : 2013-09-13 Eagle Horizon Limited +集团 + +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED OY +在线 + +// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. +大众汽车 + +// xn--3pxu8k : 2015-01-15 VeriSign Sarl +点看 + +// xn--42c2d9a : 2015-01-15 VeriSign Sarl +คอม + +// xn--45q11c : 2013-11-21 Zodiac Gemini Ltd +八卦 + +// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment +موقع + +// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center +公益 + +// xn--55qx5d : 2013-11-14 China Internet Network Information Center (CNNIC) +公司 + +// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited +香格里拉 + +// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited +网站 + +// xn--6frz82g : 2013-09-23 Afilias Limited +移动 + +// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited +我爱你 + +// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +москва + +// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +католик + +// xn--80asehdb : 2013-07-14 CORE Association +онлайн + +// xn--80aswg : 2013-07-14 CORE Association +сайт + +// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited +联通 + +// xn--9dbq2a : 2015-01-15 VeriSign Sarl +קום + +// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED +时尚 + +// xn--9krt00a : 2015-03-12 Sina Corporation +微博 + +// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited +淡马锡 + +// xn--bck1b9a5dre4c : 2015-02-26 Amazon Registry Services, Inc. +ファッション + +// xn--c1avg : 2013-11-14 Public Interest Registry +орг + +// xn--c2br7g : 2015-01-15 VeriSign Sarl +नेट + +// xn--cck2b3b : 2015-02-26 Amazon Registry Services, Inc. +ストア + +// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD +삼성 + +// xn--czr694b : 2014-01-16 Internet DotTrademark Organisation Limited +商标 + +// xn--czrs0t : 2013-12-19 Binky Moon, LLC +商店 + +// xn--czru2d : 2013-11-21 Zodiac Aquarius Limited +商城 + +// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” +дети + +// xn--eckvdtc9d : 2014-12-18 Amazon Registry Services, Inc. +ポイント + +// xn--efvy88h : 2014-08-22 Guangzhou YU Wei Information Technology Co., Ltd. +新闻 + +// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited +工行 + +// xn--fct429k : 2015-04-09 Amazon Registry Services, Inc. +家電 + +// xn--fhbei : 2015-01-15 VeriSign Sarl +كوم + +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED OY +中文网 + +// xn--fiq64b : 2013-10-14 CITIC Group Corporation +中信 + +// xn--fjq720a : 2014-05-22 Binky Moon, LLC +娱乐 + +// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. +谷歌 + +// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited +電訊盈科 + +// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited +购物 + +// xn--gckr3f0f : 2015-02-26 Amazon Registry Services, Inc. +クラウド + +// xn--gk3at1e : 2015-10-08 Amazon Registry Services, Inc. +通販 + +// xn--hxt814e : 2014-05-15 Zodiac Taurus Limited +网店 + +// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry +संगठन + +// xn--imr513n : 2014-12-11 Internet DotTrademark Organisation Limited +餐厅 + +// xn--io0a7i : 2013-11-14 China Internet Network Information Center (CNNIC) +网络 + +// xn--j1aef : 2015-01-15 VeriSign Sarl +ком + +// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation +诺基亚 + +// xn--jvr189m : 2015-02-26 Amazon Registry Services, Inc. +食品 + +// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. +飞利浦 + +// xn--kpu716f : 2014-12-22 Richemont DNS Inc. +手表 + +// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd +手机 + +// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company +ارامكو + +// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH +العليان + +// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +اتصالات + +// xn--mgbab2bd : 2013-10-31 CORE Association +بازار + +// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre +ابوظبي + +// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +كاثوليك + +// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +همراه + +// xn--mk1bu44c : 2015-01-15 VeriSign Sarl +닷컴 + +// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. +政府 + +// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. +شبكة + +// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House +بيتك + +// xn--ngbrx : 2015-11-12 League of Arab States +عرب + +// xn--nqv7f : 2013-11-14 Public Interest Registry +机构 + +// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry +组织机构 + +// xn--nyqy26a : 2014-11-07 Stable Tone Limited +健康 + +// xn--otu796d : 2017-08-06 Internet DotTrademark Organisation Limited +招聘 + +// xn--p1acf : 2013-12-12 Rusnames Limited +рус + +// xn--pbt977c : 2014-12-22 Richemont DNS Inc. +珠宝 + +// xn--pssy2u : 2015-01-15 VeriSign Sarl +大拿 + +// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. +みんな + +// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. +グーグル + +// xn--rhqv96g : 2013-09-11 Stable Tone Limited +世界 + +// xn--rovu88b : 2015-02-26 Amazon Registry Services, Inc. +書籍 + +// xn--ses554g : 2014-01-16 KNET Co., Ltd. +网址 + +// xn--t60b56a : 2015-01-15 VeriSign Sarl +닷넷 + +// xn--tckwe : 2015-01-15 VeriSign Sarl +コム + +// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +天主教 + +// xn--unup4y : 2013-07-14 Binky Moon, LLC +游戏 + +// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberater + +// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberatung + +// xn--vhquv : 2013-08-27 Binky Moon, LLC +企业 + +// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. +信息 + +// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited +嘉里大酒店 + +// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited +嘉里 + +// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. +广东 + +// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center +政务 + +// xyz : 2013-12-05 XYZ.COM LLC +xyz + +// yachts : 2014-01-09 DERYachts, LLC +yachts + +// yahoo : 2015-04-02 Yahoo! Domain Services Inc. +yahoo + +// yamaxun : 2014-12-18 Amazon Registry Services, Inc. +yamaxun + +// yandex : 2014-04-10 Yandex Europe B.V. +yandex + +// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +yodobashi + +// yoga : 2014-05-29 Minds + Machines Group Limited +yoga + +// yokohama : 2013-12-12 GMO Registry, Inc. +yokohama + +// you : 2015-04-09 Amazon Registry Services, Inc. +you + +// youtube : 2014-05-01 Charleston Road Registry Inc. +youtube + +// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +yun + +// zappos : 2015-06-25 Amazon Registry Services, Inc. +zappos + +// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) +zara + +// zero : 2014-12-18 Amazon Registry Services, Inc. +zero + +// zip : 2014-05-08 Charleston Road Registry Inc. +zip + +// zone : 2013-11-14 Binky Moon, LLC +zone + +// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) +zuerich + + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== +// (Note: these are in alphabetical order by company name) + +// 1GB LLC : https://www.1gb.ua/ +// Submitted by 1GB LLC <noc@1gb.com.ua> +cc.ua +inf.ua +ltd.ua + +// Adobe : https://www.adobe.com/ +// Submitted by Ian Boston <boston@adobe.com> +adobeaemcloud.com +adobeaemcloud.net +*.dev.adobeaemcloud.com + +// Agnat sp. z o.o. : https://domena.pl +// Submitted by Przemyslaw Plewa <it-admin@domena.pl> +beep.pl + +// alboto.ca : http://alboto.ca +// Submitted by Anton Avramov <avramov@alboto.ca> +barsy.ca + +// Alces Software Ltd : http://alces-software.com +// Submitted by Mark J. Titorenko <mark.titorenko@alces-software.com> +*.compute.estate +*.alces.network + +// Altervista: https://www.altervista.org +// Submitted by Carlo Cannas <tech_staff@altervista.it> +altervista.org + +// alwaysdata : https://www.alwaysdata.com +// Submitted by Cyril <admin@alwaysdata.com> +alwaysdata.net + +// Amazon CloudFront : https://aws.amazon.com/cloudfront/ +// Submitted by Donavan Miller <donavanm@amazon.com> +cloudfront.net + +// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +*.compute.amazonaws.com +*.compute-1.amazonaws.com +*.compute.amazonaws.com.cn +us-east-1.amazonaws.com + +// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +cn-north-1.eb.amazonaws.com.cn +cn-northwest-1.eb.amazonaws.com.cn +elasticbeanstalk.com +ap-northeast-1.elasticbeanstalk.com +ap-northeast-2.elasticbeanstalk.com +ap-northeast-3.elasticbeanstalk.com +ap-south-1.elasticbeanstalk.com +ap-southeast-1.elasticbeanstalk.com +ap-southeast-2.elasticbeanstalk.com +ca-central-1.elasticbeanstalk.com +eu-central-1.elasticbeanstalk.com +eu-west-1.elasticbeanstalk.com +eu-west-2.elasticbeanstalk.com +eu-west-3.elasticbeanstalk.com +sa-east-1.elasticbeanstalk.com +us-east-1.elasticbeanstalk.com +us-east-2.elasticbeanstalk.com +us-gov-west-1.elasticbeanstalk.com +us-west-1.elasticbeanstalk.com +us-west-2.elasticbeanstalk.com + +// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +*.elb.amazonaws.com +*.elb.amazonaws.com.cn + +// Amazon S3 : https://aws.amazon.com/s3/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +s3.amazonaws.com +s3-ap-northeast-1.amazonaws.com +s3-ap-northeast-2.amazonaws.com +s3-ap-south-1.amazonaws.com +s3-ap-southeast-1.amazonaws.com +s3-ap-southeast-2.amazonaws.com +s3-ca-central-1.amazonaws.com +s3-eu-central-1.amazonaws.com +s3-eu-west-1.amazonaws.com +s3-eu-west-2.amazonaws.com +s3-eu-west-3.amazonaws.com +s3-external-1.amazonaws.com +s3-fips-us-gov-west-1.amazonaws.com +s3-sa-east-1.amazonaws.com +s3-us-gov-west-1.amazonaws.com +s3-us-east-2.amazonaws.com +s3-us-west-1.amazonaws.com +s3-us-west-2.amazonaws.com +s3.ap-northeast-2.amazonaws.com +s3.ap-south-1.amazonaws.com +s3.cn-north-1.amazonaws.com.cn +s3.ca-central-1.amazonaws.com +s3.eu-central-1.amazonaws.com +s3.eu-west-2.amazonaws.com +s3.eu-west-3.amazonaws.com +s3.us-east-2.amazonaws.com +s3.dualstack.ap-northeast-1.amazonaws.com +s3.dualstack.ap-northeast-2.amazonaws.com +s3.dualstack.ap-south-1.amazonaws.com +s3.dualstack.ap-southeast-1.amazonaws.com +s3.dualstack.ap-southeast-2.amazonaws.com +s3.dualstack.ca-central-1.amazonaws.com +s3.dualstack.eu-central-1.amazonaws.com +s3.dualstack.eu-west-1.amazonaws.com +s3.dualstack.eu-west-2.amazonaws.com +s3.dualstack.eu-west-3.amazonaws.com +s3.dualstack.sa-east-1.amazonaws.com +s3.dualstack.us-east-1.amazonaws.com +s3.dualstack.us-east-2.amazonaws.com +s3-website-us-east-1.amazonaws.com +s3-website-us-west-1.amazonaws.com +s3-website-us-west-2.amazonaws.com +s3-website-ap-northeast-1.amazonaws.com +s3-website-ap-southeast-1.amazonaws.com +s3-website-ap-southeast-2.amazonaws.com +s3-website-eu-west-1.amazonaws.com +s3-website-sa-east-1.amazonaws.com +s3-website.ap-northeast-2.amazonaws.com +s3-website.ap-south-1.amazonaws.com +s3-website.ca-central-1.amazonaws.com +s3-website.eu-central-1.amazonaws.com +s3-website.eu-west-2.amazonaws.com +s3-website.eu-west-3.amazonaws.com +s3-website.us-east-2.amazonaws.com + +// Amsterdam Wireless: https://www.amsterdamwireless.nl/ +// Submitted by Imre Jonk <hostmaster@amsterdamwireless.nl> +amsw.nl + +// Amune : https://amune.org/ +// Submitted by Team Amune <cert@amune.org> +t3l3p0rt.net +tele.amune.org + +// Apigee : https://apigee.com/ +// Submitted by Apigee Security Team <security@apigee.com> +apigee.io + +// Aptible : https://www.aptible.com/ +// Submitted by Thomas Orozco <thomas@aptible.com> +on-aptible.com + +// ASEINet : https://www.aseinet.com/ +// Submitted by Asei SEKIGUCHI <mail@aseinet.com> +user.aseinet.ne.jp +gv.vc +d.gv.vc + +// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ +// Submitted by Hector Martin <marcan@euskalencounter.org> +user.party.eus + +// Association potager.org : https://potager.org/ +// Submitted by Lunar <jardiniers@potager.org> +pimienta.org +poivron.org +potager.org +sweetpepper.org + +// ASUSTOR Inc. : http://www.asustor.com +// Submitted by Vincent Tseng <vincenttseng@asustor.com> +myasustor.com + +// AVM : https://avm.de +// Submitted by Andreas Weise <a.weise@avm.de> +myfritz.net + +// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com +// Submitted by James Kennedy <domains@advisorwebsites.com> +*.awdev.ca +*.advisor.ws + +// b-data GmbH : https://www.b-data.io +// Submitted by Olivier Benz <olivier.benz@b-data.ch> +b-data.io + +// backplane : https://www.backplane.io +// Submitted by Anthony Voutas <anthony@backplane.io> +backplaneapp.io + +// Balena : https://www.balena.io +// Submitted by Petros Angelatos <petrosagg@balena.io> +balena-devices.com + +// Banzai Cloud +// Submitted by Gabor Kozma <info@banzaicloud.com> +app.banzaicloud.io + +// BetaInABox +// Submitted by Adrian <adrian@betainabox.com> +betainabox.com + +// BinaryLane : http://www.binarylane.com +// Submitted by Nathan O'Sullivan <nathan@mammoth.com.au> +bnr.la + +// Blackbaud, Inc. : https://www.blackbaud.com +// Submitted by Paul Crowder <paul.crowder@blackbaud.com> +blackbaudcdn.net + +// Boomla : https://boomla.com +// Submitted by Tibor Halter <thalter@boomla.com> +boomla.net + +// Boxfuse : https://boxfuse.com +// Submitted by Axel Fontaine <axel@boxfuse.com> +boxfuse.io + +// bplaced : https://www.bplaced.net/ +// Submitted by Miroslav Bozic <security@bplaced.net> +square7.ch +bplaced.com +bplaced.de +square7.de +bplaced.net +square7.net + +// BrowserSafetyMark +// Submitted by Dave Tharp <browsersafetymark.io@quicinc.com> +browsersafetymark.io + +// Bytemark Hosting : https://www.bytemark.co.uk +// Submitted by Paul Cammish <paul.cammish@bytemark.co.uk> +uk0.bigv.io +dh.bytemark.co.uk +vm.bytemark.co.uk + +// callidomus : https://www.callidomus.com/ +// Submitted by Marcus Popp <admin@callidomus.com> +mycd.eu + +// Carrd : https://carrd.co +// Submitted by AJ <aj@carrd.co> +carrd.co +crd.co +uwu.ai + +// CentralNic : http://www.centralnic.com/names/domains +// Submitted by registry <gavin.brown@centralnic.com> +ae.org +ar.com +br.com +cn.com +com.de +com.se +de.com +eu.com +gb.com +gb.net +hu.com +hu.net +jp.net +jpn.com +kr.com +mex.com +no.com +qc.com +ru.com +sa.com +se.net +uk.com +uk.net +us.com +uy.com +za.bz +za.com + +// Africa.com Web Solutions Ltd : https://registry.africa.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +africa.com + +// iDOT Services Limited : http://www.domain.gr.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +gr.com + +// Radix FZC : http://domains.in.net +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +in.net + +// US REGISTRY LLC : http://us.org +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +us.org + +// co.com Registry, LLC : https://registry.co.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +co.com + +// c.la : http://www.c.la/ +c.la + +// certmgr.org : https://certmgr.org +// Submitted by B. Blechschmidt <hostmaster@certmgr.org> +certmgr.org + +// Citrix : https://citrix.com +// Submitted by Alex Stoddard <alex.stoddard@citrix.com> +xenapponazure.com + +// Civilized Discourse Construction Kit, Inc. : https://www.discourse.org/ +// Submitted by Rishabh Nambiar <rishabh.nambiar@discourse.org> +discourse.group + +// ClearVox : http://www.clearvox.nl/ +// Submitted by Leon Rowland <leon@clearvox.nl> +virtueeldomein.nl + +// Clever Cloud : https://www.clever-cloud.com/ +// Submitted by Quentin Adam <noc@clever-cloud.com> +cleverapps.io + +// Clerk : https://www.clerk.dev +// Submitted by Colin Sidoti <colin@clerk.dev> +*.lcl.dev +*.stg.dev + +// Cloud66 : https://www.cloud66.com/ +// Submitted by Khash Sajadi <khash@cloud66.com> +c66.me +cloud66.ws +cloud66.zone + +// CloudAccess.net : https://www.cloudaccess.net/ +// Submitted by Pawel Panek <noc@cloudaccess.net> +jdevcloud.com +wpdevcloud.com +cloudaccess.host +freesite.host +cloudaccess.net + +// cloudControl : https://www.cloudcontrol.com/ +// Submitted by Tobias Wilken <tw@cloudcontrol.com> +cloudcontrolled.com +cloudcontrolapp.com + +// Cloudera, Inc. : https://www.cloudera.com/ +// Submitted by Philip Langdale <security@cloudera.com> +cloudera.site + +// Cloudflare, Inc. : https://www.cloudflare.com/ +// Submitted by Jake Riesterer <publicsuffixlist@cloudflare.com> +trycloudflare.com +workers.dev + +// Clovyr : https://clovyr.io +// Submitted by Patrick Nielsen <patrick@clovyr.io> +wnext.app + +// co.ca : http://registry.co.ca/ +co.ca + +// Co & Co : https://co-co.nl/ +// Submitted by Govert Versluis <govert@co-co.nl> +*.otap.co + +// i-registry s.r.o. : http://www.i-registry.cz/ +// Submitted by Martin Semrad <semrad@i-registry.cz> +co.cz + +// CDN77.com : http://www.cdn77.com +// Submitted by Jan Krpes <jan.krpes@cdn77.com> +c.cdn77.org +cdn77-ssl.net +r.cdn77.net +rsc.cdn77.org +ssl.origin.cdn77-secure.org + +// Cloud DNS Ltd : http://www.cloudns.net +// Submitted by Aleksander Hristov <noc@cloudns.net> +cloudns.asia +cloudns.biz +cloudns.club +cloudns.cc +cloudns.eu +cloudns.in +cloudns.info +cloudns.org +cloudns.pro +cloudns.pw +cloudns.us + +// Cloudeity Inc : https://cloudeity.com +// Submitted by Stefan Dimitrov <contact@cloudeity.com> +cloudeity.net + +// CNPY : https://cnpy.gdn +// Submitted by Angelo Gladding <angelo@lahacker.net> +cnpy.gdn + +// CoDNS B.V. +co.nl +co.no + +// Combell.com : https://www.combell.com +// Submitted by Thomas Wouters <thomas.wouters@combellgroup.com> +webhosting.be +hosting-cluster.nl + +// Coordination Center for TLD RU and XN--P1AI : https://cctld.ru/en/domains/domens_ru/reserved/ +// Submitted by George Georgievsky <gug@cctld.ru> +ac.ru +edu.ru +gov.ru +int.ru +mil.ru +test.ru + +// COSIMO GmbH : http://www.cosimo.de +// Submitted by Rene Marticke <rmarticke@cosimo.de> +dyn.cosidns.de +dynamisches-dns.de +dnsupdater.de +internet-dns.de +l-o-g-i-n.de +dynamic-dns.info +feste-ip.net +knx-server.net +static-access.net + +// Craynic, s.r.o. : http://www.craynic.com/ +// Submitted by Ales Krajnik <ales.krajnik@craynic.com> +realm.cz + +// Cryptonomic : https://cryptonomic.net/ +// Submitted by Andrew Cady <public-suffix-list@cryptonomic.net> +*.cryptonomic.net + +// Cupcake : https://cupcake.io/ +// Submitted by Jonathan Rudenberg <jonathan@cupcake.io> +cupcake.is + +// Customer OCI - Oracle Dyn https://cloud.oracle.com/home https://dyn.com/dns/ +// Submitted by Gregory Drake <support@dyn.com> +// Note: This is intended to also include customer-oci.com due to wildcards implicitly including the current label +*.customer-oci.com +*.oci.customer-oci.com +*.ocp.customer-oci.com +*.ocs.customer-oci.com + +// cyon GmbH : https://www.cyon.ch/ +// Submitted by Dominic Luechinger <dol@cyon.ch> +cyon.link +cyon.site + +// Daplie, Inc : https://daplie.com +// Submitted by AJ ONeal <aj@daplie.com> +daplie.me +localhost.daplie.me + +// Datto, Inc. : https://www.datto.com/ +// Submitted by Philipp Heckel <ph@datto.com> +dattolocal.com +dattorelay.com +dattoweb.com +mydatto.com +dattolocal.net +mydatto.net + +// Dansk.net : http://www.dansk.net/ +// Submitted by Anani Voule <digital@digital.co.dk> +biz.dk +co.dk +firm.dk +reg.dk +store.dk + +// dapps.earth : https://dapps.earth/ +// Submitted by Daniil Burdakov <icqkill@gmail.com> +*.dapps.earth +*.bzz.dapps.earth + +// Dark, Inc. : https://darklang.com +// Submitted by Paul Biggar <ops@darklang.com> +builtwithdark.com + +// Datawire, Inc : https://www.datawire.io +// Submitted by Richard Li <secalert@datawire.io> +edgestack.me + +// Debian : https://www.debian.org/ +// Submitted by Peter Palfrader / Debian Sysadmin Team <dsa-publicsuffixlist@debian.org> +debian.net + +// deSEC : https://desec.io/ +// Submitted by Peter Thomassen <peter@desec.io> +dedyn.io + +// DNShome : https://www.dnshome.de/ +// Submitted by Norbert Auler <mail@dnshome.de> +dnshome.de + +// DotArai : https://www.dotarai.com/ +// Submitted by Atsadawat Netcharadsang <atsadawat@dotarai.co.th> +online.th +shop.th + +// DrayTek Corp. : https://www.draytek.com/ +// Submitted by Paul Fang <mis@draytek.com> +drayddns.com + +// DreamHost : http://www.dreamhost.com/ +// Submitted by Andrew Farmer <andrew.farmer@dreamhost.com> +dreamhosters.com + +// Drobo : http://www.drobo.com/ +// Submitted by Ricardo Padilha <rpadilha@drobo.com> +mydrobo.com + +// Drud Holdings, LLC. : https://www.drud.com/ +// Submitted by Kevin Bridges <kevin@drud.com> +drud.io +drud.us + +// DuckDNS : http://www.duckdns.org/ +// Submitted by Richard Harper <richard@duckdns.org> +duckdns.org + +// dy.fi : http://dy.fi/ +// Submitted by Heikki Hannikainen <hessu@hes.iki.fi> +dy.fi +tunk.org + +// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ +dyndns-at-home.com +dyndns-at-work.com +dyndns-blog.com +dyndns-free.com +dyndns-home.com +dyndns-ip.com +dyndns-mail.com +dyndns-office.com +dyndns-pics.com +dyndns-remote.com +dyndns-server.com +dyndns-web.com +dyndns-wiki.com +dyndns-work.com +dyndns.biz +dyndns.info +dyndns.org +dyndns.tv +at-band-camp.net +ath.cx +barrel-of-knowledge.info +barrell-of-knowledge.info +better-than.tv +blogdns.com +blogdns.net +blogdns.org +blogsite.org +boldlygoingnowhere.org +broke-it.net +buyshouses.net +cechire.com +dnsalias.com +dnsalias.net +dnsalias.org +dnsdojo.com +dnsdojo.net +dnsdojo.org +does-it.net +doesntexist.com +doesntexist.org +dontexist.com +dontexist.net +dontexist.org +doomdns.com +doomdns.org +dvrdns.org +dyn-o-saur.com +dynalias.com +dynalias.net +dynalias.org +dynathome.net +dyndns.ws +endofinternet.net +endofinternet.org +endoftheinternet.org +est-a-la-maison.com +est-a-la-masion.com +est-le-patron.com +est-mon-blogueur.com +for-better.biz +for-more.biz +for-our.info +for-some.biz +for-the.biz +forgot.her.name +forgot.his.name +from-ak.com +from-al.com +from-ar.com +from-az.net +from-ca.com +from-co.net +from-ct.com +from-dc.com +from-de.com +from-fl.com +from-ga.com +from-hi.com +from-ia.com +from-id.com +from-il.com +from-in.com +from-ks.com +from-ky.com +from-la.net +from-ma.com +from-md.com +from-me.org +from-mi.com +from-mn.com +from-mo.com +from-ms.com +from-mt.com +from-nc.com +from-nd.com +from-ne.com +from-nh.com +from-nj.com +from-nm.com +from-nv.com +from-ny.net +from-oh.com +from-ok.com +from-or.com +from-pa.com +from-pr.com +from-ri.com +from-sc.com +from-sd.com +from-tn.com +from-tx.com +from-ut.com +from-va.com +from-vt.com +from-wa.com +from-wi.com +from-wv.com +from-wy.com +ftpaccess.cc +fuettertdasnetz.de +game-host.org +game-server.cc +getmyip.com +gets-it.net +go.dyndns.org +gotdns.com +gotdns.org +groks-the.info +groks-this.info +ham-radio-op.net +here-for-more.info +hobby-site.com +hobby-site.org +home.dyndns.org +homedns.org +homeftp.net +homeftp.org +homeip.net +homelinux.com +homelinux.net +homelinux.org +homeunix.com +homeunix.net +homeunix.org +iamallama.com +in-the-band.net +is-a-anarchist.com +is-a-blogger.com +is-a-bookkeeper.com +is-a-bruinsfan.org +is-a-bulls-fan.com +is-a-candidate.org +is-a-caterer.com +is-a-celticsfan.org +is-a-chef.com +is-a-chef.net +is-a-chef.org +is-a-conservative.com +is-a-cpa.com +is-a-cubicle-slave.com +is-a-democrat.com +is-a-designer.com +is-a-doctor.com +is-a-financialadvisor.com +is-a-geek.com +is-a-geek.net +is-a-geek.org +is-a-green.com +is-a-guru.com +is-a-hard-worker.com +is-a-hunter.com +is-a-knight.org +is-a-landscaper.com +is-a-lawyer.com +is-a-liberal.com +is-a-libertarian.com +is-a-linux-user.org +is-a-llama.com +is-a-musician.com +is-a-nascarfan.com +is-a-nurse.com +is-a-painter.com +is-a-patsfan.org +is-a-personaltrainer.com +is-a-photographer.com +is-a-player.com +is-a-republican.com +is-a-rockstar.com +is-a-socialist.com +is-a-soxfan.org +is-a-student.com +is-a-teacher.com +is-a-techie.com +is-a-therapist.com +is-an-accountant.com +is-an-actor.com +is-an-actress.com +is-an-anarchist.com +is-an-artist.com +is-an-engineer.com +is-an-entertainer.com +is-by.us +is-certified.com +is-found.org +is-gone.com +is-into-anime.com +is-into-cars.com +is-into-cartoons.com +is-into-games.com +is-leet.com +is-lost.org +is-not-certified.com +is-saved.org +is-slick.com +is-uberleet.com +is-very-bad.org +is-very-evil.org +is-very-good.org +is-very-nice.org +is-very-sweet.org +is-with-theband.com +isa-geek.com +isa-geek.net +isa-geek.org +isa-hockeynut.com +issmarterthanyou.com +isteingeek.de +istmein.de +kicks-ass.net +kicks-ass.org +knowsitall.info +land-4-sale.us +lebtimnetz.de +leitungsen.de +likes-pie.com +likescandy.com +merseine.nu +mine.nu +misconfused.org +mypets.ws +myphotos.cc +neat-url.com +office-on-the.net +on-the-web.tv +podzone.net +podzone.org +readmyblog.org +saves-the-whales.com +scrapper-site.net +scrapping.cc +selfip.biz +selfip.com +selfip.info +selfip.net +selfip.org +sells-for-less.com +sells-for-u.com +sells-it.net +sellsyourhome.org +servebbs.com +servebbs.net +servebbs.org +serveftp.net +serveftp.org +servegame.org +shacknet.nu +simple-url.com +space-to-rent.com +stuff-4-sale.org +stuff-4-sale.us +teaches-yoga.com +thruhere.net +traeumtgerade.de +webhop.biz +webhop.info +webhop.net +webhop.org +worse-than.tv +writesthisblog.com + +// ddnss.de : https://www.ddnss.de/ +// Submitted by Robert Niedziela <webmaster@ddnss.de> +ddnss.de +dyn.ddnss.de +dyndns.ddnss.de +dyndns1.de +dyn-ip24.de +home-webserver.de +dyn.home-webserver.de +myhome-server.de +ddnss.org + +// Definima : http://www.definima.com/ +// Submitted by Maxence Bitterli <maxence@definima.com> +definima.net +definima.io + +// dnstrace.pro : https://dnstrace.pro/ +// Submitted by Chris Partridge <chris@partridge.tech> +bci.dnstrace.pro + +// Dynu.com : https://www.dynu.com/ +// Submitted by Sue Ye <sue@dynu.com> +ddnsfree.com +ddnsgeek.com +giize.com +gleeze.com +kozow.com +loseyourip.com +ooguy.com +theworkpc.com +casacam.net +dynu.net +accesscam.org +camdvr.org +freeddns.org +mywire.org +webredirect.org +myddns.rocks +blogsite.xyz + +// dynv6 : https://dynv6.com +// Submitted by Dominik Menke <dom@digineo.de> +dynv6.net + +// E4YOU spol. s.r.o. : https://e4you.cz/ +// Submitted by Vladimir Dudr <info@e4you.cz> +e4.cz + +// En root‽ : https://en-root.org +// Submitted by Emmanuel Raviart <emmanuel@raviart.com> +en-root.fr + +// Enalean SAS: https://www.enalean.com +// Submitted by Thomas Cottier <thomas.cottier@enalean.com> +mytuleap.com + +// ECG Robotics, Inc: https://ecgrobotics.org +// Submitted by <frc1533@ecgrobotics.org> +onred.one +staging.onred.one + +// Enonic : http://enonic.com/ +// Submitted by Erik Kaareng-Sunde <esu@enonic.com> +enonic.io +customer.enonic.io + +// EU.org https://eu.org/ +// Submitted by Pierre Beyssac <hostmaster@eu.org> +eu.org +al.eu.org +asso.eu.org +at.eu.org +au.eu.org +be.eu.org +bg.eu.org +ca.eu.org +cd.eu.org +ch.eu.org +cn.eu.org +cy.eu.org +cz.eu.org +de.eu.org +dk.eu.org +edu.eu.org +ee.eu.org +es.eu.org +fi.eu.org +fr.eu.org +gr.eu.org +hr.eu.org +hu.eu.org +ie.eu.org +il.eu.org +in.eu.org +int.eu.org +is.eu.org +it.eu.org +jp.eu.org +kr.eu.org +lt.eu.org +lu.eu.org +lv.eu.org +mc.eu.org +me.eu.org +mk.eu.org +mt.eu.org +my.eu.org +net.eu.org +ng.eu.org +nl.eu.org +no.eu.org +nz.eu.org +paris.eu.org +pl.eu.org +pt.eu.org +q-a.eu.org +ro.eu.org +ru.eu.org +se.eu.org +si.eu.org +sk.eu.org +tr.eu.org +uk.eu.org +us.eu.org + +// Evennode : http://www.evennode.com/ +// Submitted by Michal Kralik <support@evennode.com> +eu-1.evennode.com +eu-2.evennode.com +eu-3.evennode.com +eu-4.evennode.com +us-1.evennode.com +us-2.evennode.com +us-3.evennode.com +us-4.evennode.com + +// eDirect Corp. : https://hosting.url.com.tw/ +// Submitted by C.S. chang <cschang@corp.url.com.tw> +twmail.cc +twmail.net +twmail.org +mymailer.com.tw +url.tw + +// Facebook, Inc. +// Submitted by Peter Ruibal <public-suffix@fb.com> +apps.fbsbx.com + +// FAITID : https://faitid.org/ +// Submitted by Maxim Alzoba <tech.contact@faitid.org> +// https://www.flexireg.net/stat_info +ru.net +adygeya.ru +bashkiria.ru +bir.ru +cbg.ru +com.ru +dagestan.ru +grozny.ru +kalmykia.ru +kustanai.ru +marine.ru +mordovia.ru +msk.ru +mytis.ru +nalchik.ru +nov.ru +pyatigorsk.ru +spb.ru +vladikavkaz.ru +vladimir.ru +abkhazia.su +adygeya.su +aktyubinsk.su +arkhangelsk.su +armenia.su +ashgabad.su +azerbaijan.su +balashov.su +bashkiria.su +bryansk.su +bukhara.su +chimkent.su +dagestan.su +east-kazakhstan.su +exnet.su +georgia.su +grozny.su +ivanovo.su +jambyl.su +kalmykia.su +kaluga.su +karacol.su +karaganda.su +karelia.su +khakassia.su +krasnodar.su +kurgan.su +kustanai.su +lenug.su +mangyshlak.su +mordovia.su +msk.su +murmansk.su +nalchik.su +navoi.su +north-kazakhstan.su +nov.su +obninsk.su +penza.su +pokrovsk.su +sochi.su +spb.su +tashkent.su +termez.su +togliatti.su +troitsk.su +tselinograd.su +tula.su +tuva.su +vladikavkaz.su +vladimir.su +vologda.su + +// Fancy Bits, LLC : http://getchannels.com +// Submitted by Aman Gupta <aman@getchannels.com> +channelsdvr.net + +// Fastly Inc. : http://www.fastly.com/ +// Submitted by Fastly Security <security@fastly.com> +fastly-terrarium.com +fastlylb.net +map.fastlylb.net +freetls.fastly.net +map.fastly.net +a.prod.fastly.net +global.prod.fastly.net +a.ssl.fastly.net +b.ssl.fastly.net +global.ssl.fastly.net + +// FASTVPS EESTI OU : https://fastvps.ru/ +// Submitted by Likhachev Vasiliy <lihachev@fastvps.ru> +fastpanel.direct +fastvps-server.com + +// Featherhead : https://featherhead.xyz/ +// Submitted by Simon Menke <simon@featherhead.xyz> +fhapp.xyz + +// Fedora : https://fedoraproject.org/ +// submitted by Patrick Uiterwijk <puiterwijk@fedoraproject.org> +fedorainfracloud.org +fedorapeople.org +cloud.fedoraproject.org +app.os.fedoraproject.org +app.os.stg.fedoraproject.org + +// Fermax : https://fermax.com/ +// submitted by Koen Van Isterdael <k.vanisterdael@fermax.be> +mydobiss.com + +// Filegear Inc. : https://www.filegear.com +// Submitted by Jason Zhu <jason@owtware.com> +filegear.me +filegear-au.me +filegear-de.me +filegear-gb.me +filegear-ie.me +filegear-jp.me +filegear-sg.me + +// Firebase, Inc. +// Submitted by Chris Raynor <chris@firebase.com> +firebaseapp.com + +// Flynn : https://flynn.io +// Submitted by Jonathan Rudenberg <jonathan@flynn.io> +flynnhub.com +flynnhosting.net + +// Frederik Braun https://frederik-braun.com +// Submitted by Frederik Braun <fb@frederik-braun.com> +0e.vc + +// Freebox : http://www.freebox.fr +// Submitted by Romain Fliedel <rfliedel@freebox.fr> +freebox-os.com +freeboxos.com +fbx-os.fr +fbxos.fr +freebox-os.fr +freeboxos.fr + +// freedesktop.org : https://www.freedesktop.org +// Submitted by Daniel Stone <daniel@fooishbar.org> +freedesktop.org + +// Futureweb OG : http://www.futureweb.at +// Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at> +*.futurecms.at +*.ex.futurecms.at +*.in.futurecms.at +futurehosting.at +futuremailing.at +*.ex.ortsinfo.at +*.kunden.ortsinfo.at +*.statics.cloud + +// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains +// Submitted by David Illsley <david.illsley@digital.cabinet-office.gov.uk> +service.gov.uk + +// Gehirn Inc. : https://www.gehirn.co.jp/ +// Submitted by Kohei YOSHIDA <tech@gehirn.co.jp> +gehirn.ne.jp +usercontent.jp + +// Gentlent, Inc. : https://www.gentlent.com +// Submitted by Tom Klein <tom@gentlent.com> +gentapps.com +lab.ms + +// GitHub, Inc. +// Submitted by Patrick Toomey <security@github.com> +github.io +githubusercontent.com + +// GitLab, Inc. +// Submitted by Alex Hanselka <alex@gitlab.com> +gitlab.io + +// Glitch, Inc : https://glitch.com +// Submitted by Mads Hartmann <mads@glitch.com> +glitch.me + +// GMO Pepabo, Inc. : https://pepabo.com/ +// Submitted by dojineko <admin@pepabo.com> +lolipop.io + +// GOV.UK Platform as a Service : https://www.cloud.service.gov.uk/ +// Submitted by Tom Whitwell <tom.whitwell@digital.cabinet-office.gov.uk> +cloudapps.digital +london.cloudapps.digital + +// UKHomeOffice : https://www.gov.uk/government/organisations/home-office +// Submitted by Jon Shanks <jon.shanks@digital.homeoffice.gov.uk> +homeoffice.gov.uk + +// GlobeHosting, Inc. +// Submitted by Zoltan Egresi <egresi@globehosting.com> +ro.im +shop.ro + +// GoIP DNS Services : http://www.goip.de +// Submitted by Christian Poulter <milchstrasse@goip.de> +goip.de + +// Google, Inc. +// Submitted by Eduardo Vela <evn@google.com> +run.app +a.run.app +web.app +*.0emm.com +appspot.com +*.r.appspot.com +blogspot.ae +blogspot.al +blogspot.am +blogspot.ba +blogspot.be +blogspot.bg +blogspot.bj +blogspot.ca +blogspot.cf +blogspot.ch +blogspot.cl +blogspot.co.at +blogspot.co.id +blogspot.co.il +blogspot.co.ke +blogspot.co.nz +blogspot.co.uk +blogspot.co.za +blogspot.com +blogspot.com.ar +blogspot.com.au +blogspot.com.br +blogspot.com.by +blogspot.com.co +blogspot.com.cy +blogspot.com.ee +blogspot.com.eg +blogspot.com.es +blogspot.com.mt +blogspot.com.ng +blogspot.com.tr +blogspot.com.uy +blogspot.cv +blogspot.cz +blogspot.de +blogspot.dk +blogspot.fi +blogspot.fr +blogspot.gr +blogspot.hk +blogspot.hr +blogspot.hu +blogspot.ie +blogspot.in +blogspot.is +blogspot.it +blogspot.jp +blogspot.kr +blogspot.li +blogspot.lt +blogspot.lu +blogspot.md +blogspot.mk +blogspot.mr +blogspot.mx +blogspot.my +blogspot.nl +blogspot.no +blogspot.pe +blogspot.pt +blogspot.qa +blogspot.re +blogspot.ro +blogspot.rs +blogspot.ru +blogspot.se +blogspot.sg +blogspot.si +blogspot.sk +blogspot.sn +blogspot.td +blogspot.tw +blogspot.ug +blogspot.vn +cloudfunctions.net +cloud.goog +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +publishproxy.com +withgoogle.com +withyoutube.com + +// Group 53, LLC : https://www.group53.com +// Submitted by Tyler Todd <noc@nova53.net> +awsmppl.com + +// Hakaran group: http://hakaran.cz +// Submited by Arseniy Sokolov <security@hakaran.cz> +fin.ci +free.hr +caa.li +ua.rs +conf.se + +// Handshake : https://handshake.org +// Submitted by Mike Damm <md@md.vc> +hs.zone +hs.run + +// Hashbang : https://hashbang.sh +hashbang.sh + +// Hasura : https://hasura.io +// Submitted by Shahidh K Muhammed <shahidh@hasura.io> +hasura.app +hasura-app.io + +// Hepforge : https://www.hepforge.org +// Submitted by David Grellscheid <admin@hepforge.org> +hepforge.org + +// Heroku : https://www.heroku.com/ +// Submitted by Tom Maher <tmaher@heroku.com> +herokuapp.com +herokussl.com + +// Hibernating Rhinos +// Submitted by Oren Eini <oren@ravendb.net> +myravendb.com +ravendb.community +ravendb.me +development.run +ravendb.run + +// HOSTBIP REGISTRY : https://www.hostbip.com/ +// Submitted by Atanunu Igbunuroghene <publicsuffixlist@hostbip.com> +bpl.biz +orx.biz +ng.city +biz.gl +ng.ink +col.ng +firm.ng +gen.ng +ltd.ng +ngo.ng +ng.school +sch.so + +// Häkkinen.fi +// Submitted by Eero Häkkinen <Eero+psl@Häkkinen.fi> +häkkinen.fi + +// Ici la Lune : http://www.icilalune.com/ +// Submitted by Simon Morvan <simon@icilalune.com> +*.moonscale.io +moonscale.net + +// iki.fi +// Submitted by Hannu Aronsson <haa@iki.fi> +iki.fi + +// Individual Network Berlin e.V. : https://www.in-berlin.de/ +// Submitted by Christian Seitz <chris@in-berlin.de> +dyn-berlin.de +in-berlin.de +in-brb.de +in-butter.de +in-dsl.de +in-dsl.net +in-dsl.org +in-vpn.de +in-vpn.net +in-vpn.org + +// info.at : http://www.info.at/ +biz.at +info.at + +// info.cx : http://info.cx +// Submitted by Jacob Slater <whois@igloo.to> +info.cx + +// Interlegis : http://www.interlegis.leg.br +// Submitted by Gabriel Ferreira <registrobr@interlegis.leg.br> +ac.leg.br +al.leg.br +am.leg.br +ap.leg.br +ba.leg.br +ce.leg.br +df.leg.br +es.leg.br +go.leg.br +ma.leg.br +mg.leg.br +ms.leg.br +mt.leg.br +pa.leg.br +pb.leg.br +pe.leg.br +pi.leg.br +pr.leg.br +rj.leg.br +rn.leg.br +ro.leg.br +rr.leg.br +rs.leg.br +sc.leg.br +se.leg.br +sp.leg.br +to.leg.br + +// intermetrics GmbH : https://pixolino.com/ +// Submitted by Wolfgang Schwarz <admin@intermetrics.de> +pixolino.com + +// IPiFony Systems, Inc. : https://www.ipifony.com/ +// Submitted by Matthew Hardeman <mhardeman@ipifony.com> +ipifony.net + +// IServ GmbH : https://iserv.eu +// Submitted by Kim-Alexander Brodowski <kim.brodowski@iserv.eu> +mein-iserv.de +test-iserv.de +iserv.dev + +// I-O DATA DEVICE, INC. : http://www.iodata.com/ +// Submitted by Yuji Minagawa <domains-admin@iodata.jp> +iobb.net + +// Jino : https://www.jino.ru +// Submitted by Sergey Ulyashin <ulyashin@jino.ru> +myjino.ru +*.hosting.myjino.ru +*.landing.myjino.ru +*.spectrum.myjino.ru +*.vps.myjino.ru + +// Joyent : https://www.joyent.com/ +// Submitted by Brian Bennett <brian.bennett@joyent.com> +*.triton.zone +*.cns.joyent.com + +// JS.ORG : http://dns.js.org +// Submitted by Stefan Keim <admin@js.org> +js.org + +// KaasHosting : http://www.kaashosting.nl/ +// Submitted by Wouter Bakker <hostmaster@kaashosting.nl> +kaas.gg +khplay.nl + +// Keyweb AG : https://www.keyweb.de +// Submitted by Martin Dannehl <postmaster@keymachine.de> +keymachine.de + +// KingHost : https://king.host +// Submitted by Felipe Keller Braz <felipebraz@kinghost.com.br> +kinghost.net +uni5.net + +// KnightPoint Systems, LLC : http://www.knightpoint.com/ +// Submitted by Roy Keene <rkeene@knightpoint.com> +knightpoint.systems + +// KUROKU LTD : https://kuroku.ltd/ +// Submitted by DisposaBoy <security@oya.to> +oya.to + +// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf +co.krd +edu.krd + +// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de +// Submitted by Lars Laehn <info@lcube.de> +git-repos.de +lcube-server.de +svn-repos.de + +// Leadpages : https://www.leadpages.net +// Submitted by Greg Dallavalle <domains@leadpages.net> +leadpages.co +lpages.co +lpusercontent.com + +// Lelux.fi : https://lelux.fi/ +// Submitted by Lelux Admin <publisuffix@lelux.site> +lelux.site + +// Lifetime Hosting : https://Lifetime.Hosting/ +// Submitted by Mike Fillator <support@lifetime.hosting> +co.business +co.education +co.events +co.financial +co.network +co.place +co.technology + +// Lightmaker Property Manager, Inc. : https://app.lmpm.com/ +// Submitted by Greg Holland <greg.holland@lmpm.com> +app.lmpm.com + +// Linki Tools UG : https://linki.tools +// Submitted by Paulo Matos <pmatos@linki.tools> +linkitools.space + +// linkyard ldt: https://www.linkyard.ch/ +// Submitted by Mario Siegenthaler <mario.siegenthaler@linkyard.ch> +linkyard.cloud +linkyard-cloud.ch + +// Linode : https://linode.com +// Submitted by <security@linode.com> +members.linode.com +nodebalancer.linode.com + +// LiquidNet Ltd : http://www.liquidnetlimited.com/ +// Submitted by Victor Velchev <admin@liquidnetlimited.com> +we.bs + +// Log'in Line : https://www.loginline.com/ +// Submitted by Rémi Mach <remi.mach@loginline.com> +loginline.app +loginline.dev +loginline.io +loginline.services +loginline.site + +// LubMAN UMCS Sp. z o.o : https://lubman.pl/ +// Submitted by Ireneusz Maliszewski <ireneusz.maliszewski@lubman.pl> +krasnik.pl +leczna.pl +lubartow.pl +lublin.pl +poniatowa.pl +swidnik.pl + +// Lug.org.uk : https://lug.org.uk +// Submitted by Jon Spriggs <admin@lug.org.uk> +uklugs.org +glug.org.uk +lug.org.uk +lugs.org.uk + +// Lukanet Ltd : https://lukanet.com +// Submitted by Anton Avramov <register@lukanet.com> +barsy.bg +barsy.co.uk +barsyonline.co.uk +barsycenter.com +barsyonline.com +barsy.club +barsy.de +barsy.eu +barsy.in +barsy.info +barsy.io +barsy.me +barsy.menu +barsy.mobi +barsy.net +barsy.online +barsy.org +barsy.pro +barsy.pub +barsy.shop +barsy.site +barsy.support +barsy.uk + +// Magento Commerce +// Submitted by Damien Tournoud <dtournoud@magento.cloud> +*.magentosite.cloud + +// May First - People Link : https://mayfirst.org/ +// Submitted by Jamie McClelland <info@mayfirst.org> +mayfirst.info +mayfirst.org + +// Mail.Ru Group : https://hb.cldmail.ru +// Submitted by Ilya Zaretskiy <zaretskiy@corp.mail.ru> +hb.cldmail.ru + +// Memset hosting : https://www.memset.com +// Submitted by Tom Whitwell <domains@memset.com> +miniserver.com +memset.net + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Zdeněk Šustr <zdenek.sustr@cesnet.cz> +cloud.metacentrum.cz +custom.metacentrum.cz + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Radim Janča <janca@cesnet.cz> +flt.cloud.muni.cz +usr.cloud.muni.cz + +// Meteor Development Group : https://www.meteor.com/hosting +// Submitted by Pierre Carrier <pierre@meteor.com> +meteorapp.com +eu.meteorapp.com + +// Michau Enterprises Limited : http://www.co.pl/ +co.pl + +// Microsoft Corporation : http://microsoft.com +// Submitted by Justin Luk <juluk@microsoft.com> +azurecontainer.io +azurewebsites.net +azure-mobile.net +cloudapp.net + +// Mozilla Corporation : https://mozilla.com +// Submitted by Ben Francis <bfrancis@mozilla.com> +mozilla-iot.org + +// Mozilla Foundation : https://mozilla.org/ +// Submitted by glob <glob@mozilla.com> +bmoattachments.org + +// MSK-IX : https://www.msk-ix.ru/ +// Submitted by Khannanov Roman <r.khannanov@msk-ix.ru> +net.ru +org.ru +pp.ru + +// Nabu Casa : https://www.nabucasa.com +// Submitted by Paulus Schoutsen <infra@nabucasa.com> +ui.nabu.casa + +// Names.of.London : https://names.of.london/ +// Submitted by James Stevens <registry@names.of.london> or <james@jrcs.net> +pony.club +of.fashion +on.fashion +of.football +in.london +of.london +for.men +and.mom +for.mom +for.one +for.sale +of.work +to.work + +// NCTU.ME : https://nctu.me/ +// Submitted by Tocknicsu <admin@nctu.me> +nctu.me + +// Netlify : https://www.netlify.com +// Submitted by Jessica Parsons <jessica@netlify.com> +bitballoon.com +netlify.com + +// Neustar Inc. +// Submitted by Trung Tran <Trung.Tran@neustar.biz> +4u.com + +// ngrok : https://ngrok.com/ +// Submitted by Alan Shreve <alan@ngrok.com> +ngrok.io + +// Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/ +// Submitted by Nicholas Ford <nick@nimbushosting.co.uk> +nh-serv.co.uk + +// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ +// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net> +nfshost.com + +// Now-DNS : https://now-dns.com +// Submitted by Steve Russell <steve@now-dns.com> +dnsking.ch +mypi.co +n4t.co +001www.com +ddnslive.com +myiphost.com +forumz.info +16-b.it +32-b.it +64-b.it +soundcast.me +tcp4.me +dnsup.net +hicam.net +now-dns.net +ownip.net +vpndns.net +dynserv.org +now-dns.org +x443.pw +now-dns.top +ntdll.top +freeddns.us +crafting.xyz +zapto.xyz + +// nsupdate.info : https://www.nsupdate.info/ +// Submitted by Thomas Waldmann <info@nsupdate.info> +nsupdate.info +nerdpol.ovh + +// No-IP.com : https://noip.com/ +// Submitted by Deven Reza <publicsuffixlist@noip.com> +blogsyte.com +brasilia.me +cable-modem.org +ciscofreak.com +collegefan.org +couchpotatofries.org +damnserver.com +ddns.me +ditchyourip.com +dnsfor.me +dnsiskinky.com +dvrcam.info +dynns.com +eating-organic.net +fantasyleague.cc +geekgalaxy.com +golffan.us +health-carereform.com +homesecuritymac.com +homesecuritypc.com +hopto.me +ilovecollege.info +loginto.me +mlbfan.org +mmafan.biz +myactivedirectory.com +mydissent.net +myeffect.net +mymediapc.net +mypsx.net +mysecuritycamera.com +mysecuritycamera.net +mysecuritycamera.org +net-freaks.com +nflfan.org +nhlfan.net +no-ip.ca +no-ip.co.uk +no-ip.net +noip.us +onthewifi.com +pgafan.net +point2this.com +pointto.us +privatizehealthinsurance.net +quicksytes.com +read-books.org +securitytactics.com +serveexchange.com +servehumour.com +servep2p.com +servesarcasm.com +stufftoread.com +ufcfan.org +unusualperson.com +workisboring.com +3utilities.com +bounceme.net +ddns.net +ddnsking.com +gotdns.ch +hopto.org +myftp.biz +myftp.org +myvnc.com +no-ip.biz +no-ip.info +no-ip.org +noip.me +redirectme.net +servebeer.com +serveblog.net +servecounterstrike.com +serveftp.com +servegame.com +servehalflife.com +servehttp.com +serveirc.com +serveminecraft.net +servemp3.com +servepics.com +servequake.com +sytes.net +webhop.me +zapto.org + +// NodeArt : https://nodeart.io +// Submitted by Konstantin Nosov <Nosov@nodeart.io> +stage.nodeart.io + +// Nodum B.V. : https://nodum.io/ +// Submitted by Wietse Wind <hello+publicsuffixlist@nodum.io> +nodum.co +nodum.io + +// Nucleos Inc. : https://nucleos.com +// Submitted by Piotr Zduniak <piotr@nucleos.com> +pcloud.host + +// NYC.mn : http://www.information.nyc.mn +// Submitted by Matthew Brown <mattbrown@nyc.mn> +nyc.mn + +// NymNom : https://nymnom.com/ +// Submitted by Dave McCormack <dave.mccormack@nymnom.com> +nom.ae +nom.af +nom.ai +nom.al +nym.by +nym.bz +nom.cl +nym.ec +nom.gd +nom.ge +nom.gl +nym.gr +nom.gt +nym.gy +nym.hk +nom.hn +nym.ie +nom.im +nom.ke +nym.kz +nym.la +nym.lc +nom.li +nym.li +nym.lt +nym.lu +nym.me +nom.mk +nym.mn +nym.mx +nom.nu +nym.nz +nym.pe +nym.pt +nom.pw +nom.qa +nym.ro +nom.rs +nom.si +nym.sk +nom.st +nym.su +nym.sx +nom.tj +nym.tw +nom.ug +nom.uy +nom.vc +nom.vg + +// Observable, Inc. : https://observablehq.com +// Submitted by Mike Bostock <dns@observablehq.com> +static.observableusercontent.com + +// Octopodal Solutions, LLC. : https://ulterius.io/ +// Submitted by Andrew Sampson <andrew@ulterius.io> +cya.gg + +// Omnibond Systems, LLC. : https://www.omnibond.com +// Submitted by Cole Estep <cole@omnibond.com> +cloudycluster.net + +// One Fold Media : http://www.onefoldmedia.com/ +// Submitted by Eddie Jones <eddie@onefoldmedia.com> +nid.io + +// OpenCraft GmbH : http://opencraft.com/ +// Submitted by Sven Marnach <sven@opencraft.com> +opencraft.hosting + +// Opera Software, A.S.A. +// Submitted by Yngve Pettersen <yngve@opera.com> +operaunite.com + +// Oursky Limited : https://skygear.io/ +// Submited by Skygear Developer <hello@skygear.io> +skygearapp.com + +// OutSystems +// Submitted by Duarte Santos <domain-admin@outsystemscloud.com> +outsystemscloud.com + +// OwnProvider GmbH: http://www.ownprovider.com +// Submitted by Jan Moennich <jan.moennich@ownprovider.com> +ownprovider.com +own.pm + +// OX : http://www.ox.rs +// Submitted by Adam Grand <webmaster@mail.ox.rs> +ox.rs + +// oy.lc +// Submitted by Charly Coste <changaco@changaco.oy.lc> +oy.lc + +// Pagefog : https://pagefog.com/ +// Submitted by Derek Myers <derek@pagefog.com> +pgfog.com + +// Pagefront : https://www.pagefronthq.com/ +// Submitted by Jason Kriss <jason@pagefronthq.com> +pagefrontapp.com + +// .pl domains (grandfathered) +art.pl +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// Pantheon Systems, Inc. : https://pantheon.io/ +// Submitted by Gary Dylina <gary@pantheon.io> +pantheonsite.io +gotpantheon.com + +// Peplink | Pepwave : http://peplink.com/ +// Submitted by Steve Leung <steveleung@peplink.com> +mypep.link + +// Perspecta : https://perspecta.com/ +// Submitted by Kenneth Van Alstyne <kvanalstyne@perspecta.com> +perspecta.cloud + +// Planet-Work : https://www.planet-work.com/ +// Submitted by Frédéric VANNIÈRE <f.vanniere@planet-work.com> +on-web.fr + +// Platform.sh : https://platform.sh +// Submitted by Nikola Kotur <nikola@platform.sh> +*.platform.sh +*.platformsh.site + +// Port53 : https://port53.io/ +// Submitted by Maximilian Schieder <maxi@zeug.co> +dyn53.io + +// Positive Codes Technology Company : http://co.bn/faq.html +// Submitted by Zulfais <pc@co.bn> +co.bn + +// prgmr.com : https://prgmr.com/ +// Submitted by Sarah Newman <owner@prgmr.com> +xen.prgmr.com + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry <lendl@nic.at> +priv.at + +// privacytools.io : https://www.privacytools.io/ +// Submitted by Jonah Aragon <jonah@privacytools.io> +prvcy.page + +// Protocol Labs : https://protocol.ai/ +// Submitted by Michael Burns <noc@protocol.ai> +*.dweb.link + +// Protonet GmbH : http://protonet.io +// Submitted by Martin Meier <admin@protonet.io> +protonet.io + +// Publication Presse Communication SARL : https://ppcom.fr +// Submitted by Yaacov Akiba Slama <admin@chirurgiens-dentistes-en-france.fr> +chirurgiens-dentistes-en-france.fr +byen.site + +// pubtls.org: https://www.pubtls.org +// Submitted by Kor Nielsen <kor@pubtls.org> +pubtls.org + +// Qualifio : https://qualifio.com/ +// Submitted by Xavier De Cock <xdecock@gmail.com> +qualifioapp.com + +// Redstar Consultants : https://www.redstarconsultants.com/ +// Submitted by Jons Slemmer <jons@redstarconsultants.com> +instantcloud.cn + +// Russian Academy of Sciences +// Submitted by Tech Support <support@rasnet.ru> +ras.ru + +// QA2 +// Submitted by Daniel Dent (https://www.danieldent.com/) +qa2.com + +// QCX +// Submitted by Cassandra Beelen <cassandra@beelen.one> +qcx.io +*.sys.qcx.io + +// QNAP System Inc : https://www.qnap.com +// Submitted by Nick Chang <nickchang@qnap.com> +dev-myqnapcloud.com +alpha-myqnapcloud.com +myqnapcloud.com + +// Quip : https://quip.com +// Submitted by Patrick Linehan <plinehan@quip.com> +*.quipelements.com + +// Qutheory LLC : http://qutheory.io +// Submitted by Jonas Schwartz <jonas@qutheory.io> +vapor.cloud +vaporcloud.io + +// Rackmaze LLC : https://www.rackmaze.com +// Submitted by Kirill Pertsev <kika@rackmaze.com> +rackmaze.com +rackmaze.net + +// Rancher Labs, Inc : https://rancher.com +// Submitted by Vincent Fiduccia <domains@rancher.com> +*.on-k3s.io +*.on-rancher.cloud +*.on-rio.io + +// Read The Docs, Inc : https://www.readthedocs.org +// Submitted by David Fischer <team@readthedocs.org> +readthedocs.io + +// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ +// Submitted by Tim Kramer <tkramer@rhcloud.com> +rhcloud.com + +// Render : https://render.com +// Submitted by Anurag Goel <dev@render.com> +app.render.com +onrender.com + +// Repl.it : https://repl.it +// Submitted by Mason Clayton <mason@repl.it> +repl.co +repl.run + +// Resin.io : https://resin.io +// Submitted by Tim Perry <tim@resin.io> +resindevice.io +devices.resinstaging.io + +// RethinkDB : https://www.rethinkdb.com/ +// Submitted by Chris Kastorff <info@rethinkdb.com> +hzc.io + +// Revitalised Limited : http://www.revitalised.co.uk +// Submitted by Jack Price <jack@revitalised.co.uk> +wellbeingzone.eu +ptplus.fit +wellbeingzone.co.uk + +// Rochester Institute of Technology : http://www.rit.edu/ +// Submitted by Jennifer Herting <jchits@rit.edu> +git-pages.rit.edu + +// Sandstorm Development Group, Inc. : https://sandcats.io/ +// Submitted by Asheesh Laroia <asheesh@sandstorm.io> +sandcats.io + +// SBE network solutions GmbH : https://www.sbe.de/ +// Submitted by Norman Meilick <nm@sbe.de> +logoip.de +logoip.com + +// schokokeks.org GbR : https://schokokeks.org/ +// Submitted by Hanno Böck <hanno@schokokeks.org> +schokokeks.net + +// Scottish Government: https://www.gov.scot +// Submitted by Martin Ellis <martin.ellis@gov.scot> +gov.scot + +// Scry Security : http://www.scrysec.com +// Submitted by Shante Adam <shante@skyhat.io> +scrysec.com + +// Securepoint GmbH : https://www.securepoint.de +// Submitted by Erik Anders <erik.anders@securepoint.de> +firewall-gateway.com +firewall-gateway.de +my-gateway.de +my-router.de +spdns.de +spdns.eu +firewall-gateway.net +my-firewall.org +myfirewall.org +spdns.org + +// Service Online LLC : http://drs.ua/ +// Submitted by Serhii Bulakh <support@drs.ua> +biz.ua +co.ua +pp.ua + +// ShiftEdit : https://shiftedit.net/ +// Submitted by Adam Jimenez <adam@shiftcreate.com> +shiftedit.io + +// Shopblocks : http://www.shopblocks.com/ +// Submitted by Alex Bowers <alex@shopblocks.com> +myshopblocks.com + +// Shopit : https://www.shopitcommerce.com/ +// Submitted by Craig McMahon <craig@shopitcommerce.com> +shopitsite.com + +// Siemens Mobility GmbH +// Submitted by Oliver Graebner <security@mo-siemens.io> +mo-siemens.io + +// SinaAppEngine : http://sae.sina.com.cn/ +// Submitted by SinaAppEngine <saesupport@sinacloud.com> +1kapp.com +appchizi.com +applinzi.com +sinaapp.com +vipsinaapp.com + +// Siteleaf : https://www.siteleaf.com/ +// Submitted by Skylar Challand <support@siteleaf.com> +siteleaf.net + +// Skyhat : http://www.skyhat.io +// Submitted by Shante Adam <shante@skyhat.io> +bounty-full.com +alpha.bounty-full.com +beta.bounty-full.com + +// Stackhero : https://www.stackhero.io +// Submitted by Adrien Gillon <adrien+public-suffix-list@stackhero.io> +stackhero-network.com + +// staticland : https://static.land +// Submitted by Seth Vincent <sethvincent@gmail.com> +static.land +dev.static.land +sites.static.land + +// SourceLair PC : https://www.sourcelair.com +// Submitted by Antonis Kalipetis <akalipetis@sourcelair.com> +apps.lair.io +*.stolos.io + +// SpaceKit : https://www.spacekit.io/ +// Submitted by Reza Akhavan <spacekit.io@gmail.com> +spacekit.io + +// SpeedPartner GmbH: https://www.speedpartner.de/ +// Submitted by Stefan Neufeind <info@speedpartner.de> +customer.speedpartner.de + +// Standard Library : https://stdlib.com +// Submitted by Jacob Lee <jacob@stdlib.com> +api.stdlib.com + +// Storj Labs Inc. : https://storj.io/ +// Submitted by Philip Hutchins <hostmaster@storj.io> +storj.farm + +// Studenten Net Twente : http://www.snt.utwente.nl/ +// Submitted by Silke Hofstra <syscom@snt.utwente.nl> +utwente.io + +// Student-Run Computing Facility : https://www.srcf.net/ +// Submitted by Edwin Balani <sysadmins@srcf.net> +soc.srcf.net +user.srcf.net + +// Sub 6 Limited: http://www.sub6.com +// Submitted by Dan Miller <dm@sub6.com> +temp-dns.com + +// Swisscom Application Cloud: https://developer.swisscom.com +// Submitted by Matthias.Winzeler <matthias.winzeler@swisscom.com> +applicationcloud.io +scapp.io + +// Symfony, SAS : https://symfony.com/ +// Submitted by Fabien Potencier <fabien@symfony.com> +*.s5y.io +*.sensiosite.cloud + +// Syncloud : https://syncloud.org +// Submitted by Boris Rybalkin <syncloud@syncloud.it> +syncloud.it + +// Synology, Inc. : https://www.synology.com/ +// Submitted by Rony Weng <ronyweng@synology.com> +diskstation.me +dscloud.biz +dscloud.me +dscloud.mobi +dsmynas.com +dsmynas.net +dsmynas.org +familyds.com +familyds.net +familyds.org +i234.me +myds.me +synology.me +vpnplus.to +direct.quickconnect.to + +// TAIFUN Software AG : http://taifun-software.de +// Submitted by Bjoern Henke <dev-server@taifun-software.de> +taifun-dns.de + +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl + +// Teckids e.V. : https://www.teckids.org +// Submitted by Dominik George <dominik.george@teckids.org> +edugit.org + +// Telebit : https://telebit.cloud +// Submitted by AJ ONeal <aj@telebit.cloud> +telebit.app +telebit.io +*.telebit.xyz + +// The Gwiddle Foundation : https://gwiddlefoundation.org.uk +// Submitted by Joshua Bayfield <joshua.bayfield@gwiddlefoundation.org.uk> +gwiddle.co.uk + +// Thingdust AG : https://thingdust.com/ +// Submitted by Adrian Imboden <adi@thingdust.com> +thingdustdata.com +cust.dev.thingdust.io +cust.disrec.thingdust.io +cust.prod.thingdust.io +cust.testing.thingdust.io + +// Tlon.io : https://tlon.io +// Submitted by Mark Staarink <mark@tlon.io> +arvo.network +azimuth.network + +// TownNews.com : http://www.townnews.com +// Submitted by Dustin Ward <dward@townnews.com> +bloxcms.com +townnews-staging.com + +// TrafficPlex GmbH : https://www.trafficplex.de/ +// Submitted by Phillipp Röll <phillipp.roell@trafficplex.de> +12hp.at +2ix.at +4lima.at +lima-city.at +12hp.ch +2ix.ch +4lima.ch +lima-city.ch +trafficplex.cloud +de.cool +12hp.de +2ix.de +4lima.de +lima-city.de +1337.pictures +clan.rip +lima-city.rocks +webspace.rocks +lima.zone + +// TransIP : https://www.transip.nl +// Submitted by Rory Breuk <rbreuk@transip.nl> +*.transurl.be +*.transurl.eu +*.transurl.nl + +// TuxFamily : http://tuxfamily.org +// Submitted by TuxFamily administrators <adm@staff.tuxfamily.org> +tuxfamily.org + +// TwoDNS : https://www.twodns.de/ +// Submitted by TwoDNS-Support <support@two-dns.de> +dd-dns.de +diskstation.eu +diskstation.org +dray-dns.de +draydns.de +dyn-vpn.de +dynvpn.de +mein-vigor.de +my-vigor.de +my-wan.de +syno-ds.de +synology-diskstation.de +synology-ds.de + +// Uberspace : https://uberspace.de +// Submitted by Moritz Werner <mwerner@jonaspasche.com> +uber.space +*.uberspace.de + +// UDR Limited : http://www.udr.hk.com +// Submitted by registry <hostmaster@udr.hk.com> +hk.com +hk.org +ltd.hk +inc.hk + +// United Gameserver GmbH : https://united-gameserver.de +// Submitted by Stefan Schwarz <sysadm@united-gameserver.de> +virtualuser.de +virtual-user.de + +// .US +// Submitted by Ed Moore <Ed.Moore@lib.de.us> +lib.de.us + +// VeryPositive SIA : http://very.lv +// Submitted by Danko Aleksejevs <danko@very.lv> +2038.io + +// Viprinet Europe GmbH : http://www.viprinet.com +// Submitted by Simon Kissel <hostmaster@viprinet.com> +router.management + +// Virtual-Info : https://www.virtual-info.info/ +// Submitted by Adnan RIHAN <hostmaster@v-info.info> +v-info.info + +// Voorloper.com: https://voorloper.com +// Submitted by Nathan van Bakel <info@voorloper.com> +voorloper.cloud + +// V.UA Domain Administrator : https://domain.v.ua/ +// Submitted by Serhii Rostilo <sergey@rostilo.kiev.ua> +v.ua + +// Waffle Computer Inc., Ltd. : https://docs.waffleinfo.com +// Submitted by Masayuki Note <masa@blade.wafflecell.com> +wafflecell.com + +// WebHare bv: https://www.webhare.com/ +// Submitted by Arnold Hendriks <info@webhare.com> +*.webhare.dev + +// WeDeploy by Liferay, Inc. : https://www.wedeploy.com +// Submitted by Henrique Vicente <security@wedeploy.com> +wedeploy.io +wedeploy.me +wedeploy.sh + +// Western Digital Technologies, Inc : https://www.wdc.com +// Submitted by Jung Jin <jungseok.jin@wdc.com> +remotewd.com + +// Wikimedia Labs : https://wikitech.wikimedia.org +// Submitted by Yuvi Panda <yuvipanda@wikimedia.org> +wmflabs.org + +// XenonCloud GbR: https://xenoncloud.net +// Submitted by Julian Uphoff <publicsuffixlist@xenoncloud.net> +half.host + +// XnBay Technology : http://www.xnbay.com/ +// Submitted by XnBay Developer <developer.xncloud@gmail.com> +xnbay.com +u2.xnbay.com +u2-local.xnbay.com + +// XS4ALL Internet bv : https://www.xs4all.nl/ +// Submitted by Daniel Mostertman <unixbeheer+publicsuffix@xs4all.net> +cistron.nl +demon.nl +xs4all.space + +// Yandex.Cloud LLC: https://cloud.yandex.com +// Submitted by Alexander Lodin <security+psl@yandex-team.ru> +yandexcloud.net +storage.yandexcloud.net +website.yandexcloud.net + +// YesCourse Pty Ltd : https://yescourse.com +// Submitted by Atul Bhouraskar <atul@yescourse.com> +official.academy + +// Yola : https://www.yola.com/ +// Submitted by Stefano Rivera <stefano@yola.com> +yolasite.com + +// Yombo : https://yombo.net +// Submitted by Mitch Schwenk <mitch@yombo.net> +ybo.faith +yombo.me +homelink.one +ybo.party +ybo.review +ybo.science +ybo.trade + +// Yunohost : https://yunohost.org +// Submitted by Valentin Grimaud <security@yunohost.org> +nohost.me +noho.st + +// ZaNiC : http://www.za.net/ +// Submitted by registry <hostmaster@nic.za.net> +za.net +za.org + +// Zeit, Inc. : https://zeit.domains/ +// Submitted by Olli Vanhoja <olli@zeit.co> +now.sh + +// Zine EOOD : https://zine.bg/ +// Submitted by Martin Angelov <martin@zine.bg> +bss.design + +// Zitcom A/S : https://www.zitcom.dk +// Submitted by Emil Stahl <esp@zitcom.dk> +basicserver.io +virtualserver.io +site.builder.nu +enterprisecloud.nu + +// ===END PRIVATE DOMAINS=== diff --git a/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2013-04-22.dat.txt b/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2013-04-22.dat.txt new file mode 100644 index 000000000..25f7b0e18 --- /dev/null +++ b/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2013-04-22.dat.txt @@ -0,0 +1,4418 @@ +// ***** BEGIN LICENSE BLOCK ***** +// Version: MPL 1.1/GPL 2.0/LGPL 2.1 +// +// The contents of this file are subject to the Mozilla Public License Version +// 1.1 (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an "AS IS" basis, +// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +// for the specific language governing rights and limitations under the +// License. +// +// The Original Code is the Public Suffix List. +// +// The Initial Developer of the Original Code is +// Jo Hermans <jo.hermans@gmail.com>. +// Portions created by the Initial Developer are Copyright (C) 2007 +// the Initial Developer. All Rights Reserved. +// +// Contributor(s): +// Ruben Arakelyan <ruben@wackomenace.co.uk> +// Gervase Markham <gerv@gerv.net> +// Pamela Greene <pamg.bugs@gmail.com> +// David Triendl <david@triendl.name> +// The kind representatives of many TLD registries +// +// Alternatively, the contents of this file may be used under the terms of +// either the GNU General Public License Version 2 or later (the "GPL"), or +// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +// in which case the provisions of the GPL or the LGPL are applicable instead +// of those above. If you wish to allow use of your version of this file only +// under the terms of either the GPL or the LGPL, and not to allow others to +// use your version of this file under the terms of the MPL, indicate your +// decision by deleting the provisions above and replace them with the notice +// and other provisions required by the GPL or the LGPL. If you do not delete +// the provisions above, a recipient may use your version of this file under +// the terms of any one of the MPL, the GPL or the LGPL. +// +// ***** END LICENSE BLOCK ***** + +// ac : http://en.wikipedia.org/wiki/.ac +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : http://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : http://en.wikipedia.org/wiki/.ae +// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see http://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +freight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +marketplace.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +taxi.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : http://en.wikipedia.org/wiki/.am +am + +// an : http://www.una.an/an_domreg/default.asp +an +com.an +net.an +org.an +edu.an + +// ao : http://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : http://en.wikipedia.org/wiki/.aq +aq + +// ar : http://en.wikipedia.org/wiki/.ar +*.ar +!congresodelalengua3.ar +!educ.ar +!gobiernoelectronico.ar +!mecon.ar +!nacion.ar +!nic.ar +!promocion.ar +!retina.ar +!uba.ar + +// arpa : http://en.wikipedia.org/wiki/.arpa +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : http://en.wikipedia.org/wiki/.as +as +gov.as + +// asia: http://en.wikipedia.org/wiki/.asia +asia + +// at : http://en.wikipedia.org/wiki/.at +// Confirmed by registry <it@nic.at> 2008-06-17 +at +ac.at +co.at +gv.at +or.at + +// http://www.info.at/ +biz.at +info.at + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry <lendl@nic.at> 2008-06-09 +priv.at + +// au : http://en.wikipedia.org/wiki/.au +*.au +// au geographical names (vic.au etc... are covered above) +act.edu.au +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +act.gov.au +// Removed at request of Shae.Donelan@services.nsw.gov.au, 2010-03-04 +// nsw.gov.au +nt.gov.au +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au + +// aw : http://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : http://en.wikipedia.org/wiki/.ax +ax + +// az : http://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://en.wikipedia.org/wiki/.ba +ba +org.ba +net.ba +edu.ba +gov.ba +mil.ba +unsa.ba +unbi.ba +co.ba +com.ba +rs.ba + +// bb : http://en.wikipedia.org/wiki/.bb +bb +biz.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb + +// bd : http://en.wikipedia.org/wiki/.bd +*.bd + +// be : http://en.wikipedia.org/wiki/.be +// Confirmed by registry <tech@dns.be> 2008-06-08 +be +ac.be + +// bf : http://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : http://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : http://en.wikipedia.org/wiki/.bh +// list of other 2nd level tlds ? +bh +com.bh + +// bi : http://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : http://en.wikipedia.org/wiki/.biz +biz + +// bj : http://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : http://en.wikipedia.org/wiki/.bn +*.bn + +// bo : http://www.nic.bo/ +bo +com.bo +edu.bo +gov.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo + +// br : http://en.wikipedia.org/wiki/.br +// http://registro.br/info/dpn.html +// Confirmed by registry <fneves@registro.br> 2008-06-24 +br +adm.br +adv.br +agr.br +am.br +arq.br +art.br +ato.br +bio.br +blog.br +bmd.br +can.br +cim.br +cng.br +cnt.br +com.br +coop.br +ecn.br +edu.br +eng.br +esp.br +etc.br +eti.br +far.br +flog.br +fm.br +fnd.br +fot.br +fst.br +g12.br +ggf.br +gov.br +imb.br +ind.br +inf.br +jor.br +jus.br +lel.br +mat.br +med.br +mil.br +mus.br +net.br +nom.br +not.br +ntr.br +odo.br +org.br +ppg.br +pro.br +psc.br +psi.br +qsl.br +rec.br +slg.br +srv.br +tmp.br +trd.br +tur.br +tv.br +vet.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : http://en.wikipedia.org/wiki/.bt +*.bt + +// bv : No registrations at this time. +// Submitted by registry <jarle@uninett.no> 2006-06-16 + +// bw : http://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : http://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : http://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : http://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: http://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : http://en.wikipedia.org/wiki/.cat +cat + +// cc : http://en.wikipedia.org/wiki/.cc +cc + +// cd : http://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : http://en.wikipedia.org/wiki/.cf +cf + +// cg : http://en.wikipedia.org/wiki/.cg +cg + +// ch : http://en.wikipedia.org/wiki/.ch +ch + +// ci : http://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : http://en.wikipedia.org/wiki/.ck +*.ck + +// cl : http://en.wikipedia.org/wiki/.cl +cl +gov.cl +gob.cl + +// cm : http://en.wikipedia.org/wiki/.cm +cm +gov.cm + +// cn : http://en.wikipedia.org/wiki/.cn +// Submitted by registry <tanyaling@cnnic.cn> 2008-06-11 +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +公司.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : http://en.wikipedia.org/wiki/.co +// Submitted by registry <tecnico@uniandes.edu.co> 2008-06-11 +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : http://en.wikipedia.org/wiki/.com +com + +// CentralNic names : http://www.centralnic.com/names/domains +// Confirmed by registry <gavin.brown@centralnic.com> 2008-06-09 +ar.com +br.com +cn.com +de.com +eu.com +gb.com +hu.com +jpn.com +kr.com +no.com +qc.com +ru.com +sa.com +se.com +uk.com +us.com +uy.com +za.com + +// Requested by Yngve Pettersen <yngve@opera.com> 2009-11-26 +operaunite.com + +// coop : http://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : http://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : http://en.wikipedia.org/wiki/.cv +cv + +// cx : http://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://en.wikipedia.org/wiki/.cy +*.cy + +// cz : http://en.wikipedia.org/wiki/.cz +cz + +// de : http://en.wikipedia.org/wiki/.de +// Confirmed by registry <ops@denic.de> (with technical +// reservations) 2008-07-01 +de + +// dj : http://en.wikipedia.org/wiki/.dj +dj + +// dk : http://en.wikipedia.org/wiki/.dk +// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17 +dk + +// dm : http://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : http://en.wikipedia.org/wiki/.do +*.do + +// dz : http://en.wikipedia.org/wiki/.dz +dz +com.dz +org.dz +net.dz +gov.dz +edu.dz +asso.dz +pol.dz +art.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry <vabboud@nic.ec> 2008-07-04 +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +mil.ec + +// edu : http://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : http://en.wikipedia.org/wiki/.eg +*.eg + +// er : http://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : http://en.wikipedia.org/wiki/.et +*.et + +// eu : http://en.wikipedia.org/wiki/.eu +eu + +// fi : http://en.wikipedia.org/wiki/.fi +fi +// aland.fi : http://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi +// iki.fi : Submitted by Hannu Aronsson <haa@iki.fi> 2009-11-05 +iki.fi + +// fj : http://en.wikipedia.org/wiki/.fj +*.fj + +// fk : http://en.wikipedia.org/wiki/.fk +*.fk + +// fm : http://en.wikipedia.org/wiki/.fm +fm + +// fo : http://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs +fr +com.fr +asso.fr +nom.fr +prd.fr +presse.fr +tm.fr +// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels +aeroport.fr +assedic.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +gouv.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : http://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry <Damien.Shaw@ja.net> 2008-06-12 + +// gd : http://en.wikipedia.org/wiki/.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : http://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/applic/avextn.shtml +gg +co.gg +org.gg +net.gg +sch.gg +gov.gg + +// gh : http://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : http://en.wikipedia.org/wiki/.gl +gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry <randy@psg.com> 2008-06-17 +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : http://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : http://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry <segred@ics.forth.gr> 2008-06-09 +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : http://en.wikipedia.org/wiki/.gs +gs + +// gt : http://www.gt/politicas.html +*.gt + +// gu : http://gadao.gov.gu/registration.txt +*.gu + +// gw : http://en.wikipedia.org/wiki/.gw +gw + +// gy : http://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +net.gy + +// hk : https://www.hkdnr.hk +// Submitted by registry <hk.tech@hkirc.hk> 2008-06-11 +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +公司.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : http://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry <pasztor@iszt.hu> 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : http://en.wikipedia.org/wiki/.id +*.id + +// ie : http://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://en.wikipedia.org/wiki/.il +*.il + +// im : https://www.nic.im/pdfs/imfaqs.pdf +im +co.im +ltd.co.im +plc.co.im +net.im +gov.im +org.im +nic.im +ac.im + +// in : http://en.wikipedia.org/wiki/.in +// see also: http://www.inregistry.in/policies/ +// Please note, that nic.in is not an offical eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : http://en.wikipedia.org/wiki/.info +info + +// int : http://en.wikipedia.org/wiki/.int +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.html +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/ascii/Appendix1.htm +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry <marius@isgate.is> 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : http://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// geo-names found at http://www.nic.it/RA/en/domini/regole/nomi-riservati.pdf +agrigento.it +ag.it +alessandria.it +al.it +ancona.it +an.it +aosta.it +aoste.it +ao.it +arezzo.it +ar.it +ascoli-piceno.it +ascolipiceno.it +ap.it +asti.it +at.it +avellino.it +av.it +bari.it +ba.it +barlettaandriatrani.it +barletta-andria-trani.it +belluno.it +bl.it +benevento.it +bn.it +bergamo.it +bg.it +biella.it +bi.it +bologna.it +bo.it +bolzano.it +bozen.it +balsan.it +alto-adige.it +altoadige.it +suedtirol.it +bz.it +brescia.it +bs.it +brindisi.it +br.it +cagliari.it +ca.it +caltanissetta.it +cl.it +campobasso.it +cb.it +caserta.it +ce.it +catania.it +ct.it +catanzaro.it +cz.it +chieti.it +ch.it +como.it +co.it +cosenza.it +cs.it +cremona.it +cr.it +crotone.it +kr.it +cuneo.it +cn.it +enna.it +en.it +fermo.it +ferrara.it +fe.it +firenze.it +florence.it +fi.it +foggia.it +fg.it +forli-cesena.it +forlicesena.it +fc.it +frosinone.it +fr.it +genova.it +genoa.it +ge.it +gorizia.it +go.it +grosseto.it +gr.it +imperia.it +im.it +isernia.it +is.it +laquila.it +aquila.it +aq.it +la-spezia.it +laspezia.it +sp.it +latina.it +lt.it +lecce.it +le.it +lecco.it +lc.it +livorno.it +li.it +lodi.it +lo.it +lucca.it +lu.it +macerata.it +mc.it +mantova.it +mn.it +massa-carrara.it +massacarrara.it +ms.it +matera.it +mt.it +messina.it +me.it +milano.it +milan.it +mi.it +modena.it +mo.it +monza.it +napoli.it +naples.it +na.it +novara.it +no.it +nuoro.it +nu.it +oristano.it +or.it +padova.it +padua.it +pd.it +palermo.it +pa.it +parma.it +pr.it +pavia.it +pv.it +perugia.it +pg.it +pescara.it +pe.it +pesaro-urbino.it +pesarourbino.it +pu.it +piacenza.it +pc.it +pisa.it +pi.it +pistoia.it +pt.it +pordenone.it +pn.it +potenza.it +pz.it +prato.it +po.it +ragusa.it +rg.it +ravenna.it +ra.it +reggio-calabria.it +reggiocalabria.it +rc.it +reggio-emilia.it +reggioemilia.it +re.it +rieti.it +ri.it +rimini.it +rn.it +roma.it +rome.it +rm.it +rovigo.it +ro.it +salerno.it +sa.it +sassari.it +ss.it +savona.it +sv.it +siena.it +si.it +siracusa.it +sr.it +sondrio.it +so.it +taranto.it +ta.it +teramo.it +te.it +terni.it +tr.it +torino.it +turin.it +to.it +trapani.it +tp.it +trento.it +trentino.it +tn.it +treviso.it +tv.it +trieste.it +ts.it +udine.it +ud.it +varese.it +va.it +venezia.it +venice.it +ve.it +verbania.it +vb.it +vercelli.it +vc.it +verona.it +vr.it +vibo-valentia.it +vibovalentia.it +vv.it +vicenza.it +vi.it +viterbo.it +vt.it + +// je : http://www.channelisles.net/applic/avextn.shtml +je +co.je +org.je +net.je +sch.je +gov.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : http://en.wikipedia.org/wiki/.jobs +jobs + +// jp : http://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry <yone@jprs.co.jp> 2008-06-11 +// Updated by registry <yone@jprs.co.jp> 2008-12-04 +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.aichi.jp +*.akita.jp +*.aomori.jp +*.chiba.jp +*.ehime.jp +*.fukui.jp +*.fukuoka.jp +*.fukushima.jp +*.gifu.jp +*.gunma.jp +*.hiroshima.jp +*.hokkaido.jp +*.hyogo.jp +*.ibaraki.jp +*.ishikawa.jp +*.iwate.jp +*.kagawa.jp +*.kagoshima.jp +*.kanagawa.jp +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.kochi.jp +*.kumamoto.jp +*.kyoto.jp +*.mie.jp +*.miyagi.jp +*.miyazaki.jp +*.nagano.jp +*.nagasaki.jp +*.nagoya.jp +*.nara.jp +*.niigata.jp +*.oita.jp +*.okayama.jp +*.okinawa.jp +*.osaka.jp +*.saga.jp +*.saitama.jp +*.sapporo.jp +*.sendai.jp +*.shiga.jp +*.shimane.jp +*.shizuoka.jp +*.tochigi.jp +*.tokushima.jp +*.tokyo.jp +*.tottori.jp +*.toyama.jp +*.wakayama.jp +*.yamagata.jp +*.yamaguchi.jp +*.yamanashi.jp +*.yokohama.jp +!metro.tokyo.jp +!pref.aichi.jp +!pref.akita.jp +!pref.aomori.jp +!pref.chiba.jp +!pref.ehime.jp +!pref.fukui.jp +!pref.fukuoka.jp +!pref.fukushima.jp +!pref.gifu.jp +!pref.gunma.jp +!pref.hiroshima.jp +!pref.hokkaido.jp +!pref.hyogo.jp +!pref.ibaraki.jp +!pref.ishikawa.jp +!pref.iwate.jp +!pref.kagawa.jp +!pref.kagoshima.jp +!pref.kanagawa.jp +!pref.kochi.jp +!pref.kumamoto.jp +!pref.kyoto.jp +!pref.mie.jp +!pref.miyagi.jp +!pref.miyazaki.jp +!pref.nagano.jp +!pref.nagasaki.jp +!pref.nara.jp +!pref.niigata.jp +!pref.oita.jp +!pref.okayama.jp +!pref.okinawa.jp +!pref.osaka.jp +!pref.saga.jp +!pref.saitama.jp +!pref.shiga.jp +!pref.shimane.jp +!pref.shizuoka.jp +!pref.tochigi.jp +!pref.tokushima.jp +!pref.tottori.jp +!pref.toyama.jp +!pref.wakayama.jp +!pref.yamagata.jp +!pref.yamaguchi.jp +!pref.yamanashi.jp +!city.chiba.jp +!city.fukuoka.jp +!city.hiroshima.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.kyoto.jp +!city.nagoya.jp +!city.niigata.jp +!city.okayama.jp +!city.osaka.jp +!city.saitama.jp +!city.sapporo.jp +!city.sendai.jp +!city.shizuoka.jp +!city.yokohama.jp + +// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 +*.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : http://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// http://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : http://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kr : http://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : http://en.wikipedia.org/wiki/.kw +*.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17 +ky +edu.ky +gov.ky +com.ky +org.ky +net.ky + +// kz : http://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : http://en.wikipedia.org/wiki/.la +// Submitted by registry <gavin.brown@nic.la> 2008-06-10 +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la +// see http://www.c.la/ +c.la + +// lb : http://en.wikipedia.org/wiki/.lb +// Submitted by registry <randy@psg.com> 2008-06-17 +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : http://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : http://en.wikipedia.org/wiki/.li +li + +// lk : http://www.nic.lk/seclevpr.html +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk + +// local : http://en.wikipedia.org/wiki/.local +local + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry <randy@psg.com> 2008-06-17 +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : http://en.wikipedia.org/wiki/.ls +ls +co.ls +org.ls + +// lt : http://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : http://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : http://en.wikipedia.org/wiki/.md +md + +// me : http://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://www.nic.mg/tarif.htm +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg + +// mh : http://en.wikipedia.org/wiki/.mh +mh + +// mil : http://en.wikipedia.org/wiki/.mil +mil + +// mk : http://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: http://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : http://en.wikipedia.org/wiki/.mm +*.mm + +// mn : http://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : http://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry <dcamacho@saipan.com> 2008-06-17 +mp + +// mq : http://en.wikipedia.org/wiki/.mq +mq + +// mr : http://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://en.wikipedia.org/wiki/.ms +ms + +// mt : https://www.nic.org.mt/dotmt/ +*.mt + +// mu : http://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nuernberg.museum +nuremberg.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלים.museum +иком.museum + +// mv : http://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry <farias@nic.mx> 2008-06-19 +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.net.my/ +my +com.my +net.my +org.my +gov.my +edu.my +mil.my +name.my + +// mz : http://www.gobin.info/domainname/mz-template.doc +*.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc + +// ne : http://en.wikipedia.org/wiki/.ne +ne + +// net : http://en.wikipedia.org/wiki/.net +net + +// CentralNic names : http://www.centralnic.com/names/domains +// Submitted by registry <gavin.brown@centralnic.com> 2008-06-17 +gb.net +se.net +uk.net + +// ZaNiC names : http://www.za.net/ +// Confirmed by registry <hostmaster@nic.za.net> 2009-10-03 +za.net + +// nf : http://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://psg.com/dns/ng/ +// Submitted by registry <randy@psg.com> 2008-06-17 +ac.ng +com.ng +edu.ng +gov.ng +net.ng +org.ng + +// ni : http://www.nic.ni/dominios.htm +*.ni + +// nl : http://www.domain-registry.nl/ace.php/c,728,122,,,,Home.html +// Confirmed by registry <Antoin.Verschuren@sidn.nl> (with technical +// reservations) 2008-06-08 +nl + +// no : http://www.norid.no/regelverk/index.en.html +// The Norwegian registry has declined to notify us of updates. The web pages +// referenced below are the official source of the data. There is also an +// announce mailing list: +// https://postlister.uninett.no/sympa/info/norid-diskusjon +no +// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +mil.no +stat.no +dep.no +kommune.no +herad.no +// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +åkrehamn.no +algard.no +ålgård.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevåg.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +råholt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +åfjord.no +agdenes.no +al.no +ål.no +alesund.no +ålesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +åmli.no +amot.no +åmot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +årdal.no +aremark.no +arendal.no +ås.no +aseral.no +åseral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +åsnes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevåg.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bådåddjå.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +båtsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flå.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskål.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +kråanghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákŋoluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtålen.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hå.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kåfjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaŋgaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindås.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +måsøy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +meråker.no +moareke.no +moåreke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +målselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegård.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +råde.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjåk.no +skodje.no +skanland.no +skånland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snåsa.no +snoasa.no +snaase.no +snåase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +čáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegårshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvågøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vågan.no +voagat.no +vagsoy.no +vågsøy.no +vaga.no +vågå.no +valer.ostfold.no +våler.østfold.no +valer.hedmark.no +våler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Confirmed by registry <technician@cenpac.net.nr> 2008-06-17 +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : http://en.wikipedia.org/wiki/.nu +nu + +// nz : http://en.wikipedia.org/wiki/.nz +*.nz + +// om : http://en.wikipedia.org/wiki/.om +*.om + +// org : http://en.wikipedia.org/wiki/.org +org + +// CentralNic names : http://www.centralnic.com/names/domains +// Submitted by registry <gavin.brown@centralnic.com> 2008-06-17 +ae.org + +// ZaNiC names : http://www.za.net/ +// Confirmed by registry <hostmaster@nic.za.net> 2009-10-03 +za.org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : http://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry <jed@email.com.ph> 2008-06-13 +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl : http://www.dns.pl/english/ +pl +// NASK functional domains (nask.pl / dns.pl) : http://www.dns.pl/english/dns-funk.html +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +com.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +net.pl +nieruchomosci.pl +nom.pl +org.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// ICM functional domains (icm.edu.pl) +6bone.pl +art.pl +mbone.pl +// Government domains (administred by ippt.gov.pl) +gov.pl +uw.gov.pl +um.gov.pl +ug.gov.pl +upow.gov.pl +starostwo.gov.pl +so.gov.pl +sr.gov.pl +po.gov.pl +pa.gov.pl +// other functional domains +ngo.pl +irc.pl +usenet.pl +// NASK geographical domains : http://www.dns.pl/english/dns-regiony.html +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +siedlce.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl +// other geographical domains +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on http://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://www.nic.pro/support_faq.htm +pro +aca.pro +bar.pro +cpa.pro +jur.pro +law.pro +med.pro +eng.pro + +// ps : http://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : http://online.dns.pt/dns/start_dns +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : http://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/faq_a.html#faq_b +*.py + +// qa : http://www.qatar.net.qa/services/virtual.htm +*.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +com.re +asso.re +nom.re + +// ro : http://www.rotld.ro/ +ro +com.ro +org.ro +tm.ro +nt.ro +nom.ro +info.ro +rec.ro +arts.ro +firm.ro +store.ro +www.ro + +// rs : http://en.wikipedia.org/wiki/.rs +rs +co.rs +org.rs +edu.rs +ac.rs +gov.rs +in.rs + +// ru : http://www.cctld.ru/ru/docs/aktiv_8.php +// Industry domains +ru +ac.ru +com.ru +edu.ru +int.ru +net.ru +org.ru +pp.ru +// Geographical domains +adygeya.ru +altai.ru +amur.ru +arkhangelsk.ru +astrakhan.ru +bashkiria.ru +belgorod.ru +bir.ru +bryansk.ru +buryatia.ru +cbg.ru +chel.ru +chelyabinsk.ru +chita.ru +chukotka.ru +chuvashia.ru +dagestan.ru +dudinka.ru +e-burg.ru +grozny.ru +irkutsk.ru +ivanovo.ru +izhevsk.ru +jar.ru +joshkar-ola.ru +kalmykia.ru +kaluga.ru +kamchatka.ru +karelia.ru +kazan.ru +kchr.ru +kemerovo.ru +khabarovsk.ru +khakassia.ru +khv.ru +kirov.ru +koenig.ru +komi.ru +kostroma.ru +krasnoyarsk.ru +kuban.ru +kurgan.ru +kursk.ru +lipetsk.ru +magadan.ru +mari.ru +mari-el.ru +marine.ru +mordovia.ru +mosreg.ru +msk.ru +murmansk.ru +nalchik.ru +nnov.ru +nov.ru +novosibirsk.ru +nsk.ru +omsk.ru +orenburg.ru +oryol.ru +palana.ru +penza.ru +perm.ru +pskov.ru +ptz.ru +rnd.ru +ryazan.ru +sakhalin.ru +samara.ru +saratov.ru +simbirsk.ru +smolensk.ru +spb.ru +stavropol.ru +stv.ru +surgut.ru +tambov.ru +tatarstan.ru +tom.ru +tomsk.ru +tsaritsyn.ru +tsk.ru +tula.ru +tuva.ru +tver.ru +tyumen.ru +udm.ru +udmurtia.ru +ulan-ude.ru +vladikavkaz.ru +vladimir.ru +vladivostok.ru +volgograd.ru +vologda.ru +voronezh.ru +vrn.ru +vyatka.ru +yakutia.ru +yamal.ru +yaroslavl.ru +yekaterinburg.ru +yuzhno-sakhalinsk.ru +// More geographical domains +amursk.ru +baikal.ru +cmw.ru +fareast.ru +jamal.ru +kms.ru +k-uralsk.ru +kustanai.ru +kuzbass.ru +magnitka.ru +mytis.ru +nakhodka.ru +nkz.ru +norilsk.ru +oskol.ru +pyatigorsk.ru +rubtsovsk.ru +snz.ru +syzran.ru +vdonsk.ru +zgrad.ru +// State domains +gov.ru +mil.ru +// Technical domains +test.ru + +// rw : http://www.nic.rw/cgi-bin/policy.pl +rw +gov.rw +net.rw +edu.rw +ac.rw +com.rw +co.rw +int.rw +mil.rw +gouv.rw + +// sa : http://www.nic.net.sa/ +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry <lee.humphries@telekom.com.sb> 2008-06-08 +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry <admin@isoc.sd> 2008-06-17 +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +gov.sd +info.sd + +// se : http://en.wikipedia.org/wiki/.se +// Submitted by registry <Patrik.Wallstrom@iis.se> 2008-06-24 +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +sshn.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/sub_policies_agreement/2ld.html +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://www.nic.sh/rules.html +// list of 2nd level domains ? +sh + +// si : http://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry <jarle@uninett.no> 2008-06-16 + +// sk : http://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry <adam@neoip.com> 2008-06-12 +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : http://en.wikipedia.org/wiki/.sm +sm + +// sn : http://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// sr : http://en.wikipedia.org/wiki/.sr +sr + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +gov.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : http://en.wikipedia.org/wiki/.su +su + +// sv : http://www.svnet.org.sv/svpolicy.html +*.sv + +// sy : http://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : http://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : http://en.wikipedia.org/wiki/.tc +tc + +// td : http://en.wikipedia.org/wiki/.td +td + +// tel: http://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : http://en.wikipedia.org/wiki/.tf +tf + +// tg : http://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/nictg/index.php implies no reserved 2nd-level domains, +// although this contradicts wikipedia. +tg + +// th : http://en.wikipedia.org/wiki/.th +// Submitted by registry <krit@thains.co.th> 2008-06-17 +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.htm +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : http://en.wikipedia.org/wiki/.tk +tk + +// tl : http://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/rules.html +// list of 2nd level tlds ? +tm + +// tn : http://en.wikipedia.org/wiki/.tn +// http://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +intl.tn +nat.tn +net.tn +org.tn +info.tn +perso.tn +tourism.tn +edunet.tn +rnrt.tn +rns.tn +rnu.tn +mincom.tn +agrinet.tn +defense.tn +turen.tn + +// to : http://en.wikipedia.org/wiki/.to +// Submitted by registry <egullich@colo.to> 2008-06-17 +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// tr : http://en.wikipedia.org/wiki/.tr +*.tr + +// travel : http://en.wikipedia.org/wiki/.travel +travel + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : http://en.wikipedia.org/wiki/.tv +// list of other 2nd level tlds ? +tv +com.tv +net.tv +org.tv +gov.tv + +// tw : http://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://en.wikipedia.org/wiki/.tz +// Submitted by registry <randy@psg.com> 2008-06-17 +ac.tz +co.tz +go.tz +ne.tz +or.tz + +// ua : http://www.nic.net.ua/ +ua +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geo-names +cherkassy.ua +chernigov.ua +chernovtsy.ua +ck.ua +cn.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +ks.ua +kv.ua +lg.ua +lugansk.ua +lutsk.ua +lviv.ua +mk.ua +nikolaev.ua +od.ua +odessa.ua +pl.ua +poltava.ua +rovno.ua +rv.ua +sebastopol.ua +sumy.ua +te.ua +ternopil.ua +uzhgorod.ua +vinnica.ua +vn.ua +zaporizhzhe.ua +zp.ua +zhitomir.ua +zt.ua + +// ug : http://www.registry.co.ug/ +ug +co.ug +ac.ug +sc.ug +go.ug +ne.ug +or.ug + +// uk : http://en.wikipedia.org/wiki/.uk +*.uk +*.sch.uk +!bl.uk +!british-library.uk +!icnet.uk +!jet.uk +!nel.uk +!nhs.uk +!nls.uk +!national-library-scotland.uk +!parliament.uk + +// us : http://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are avilable, or even nothing at all. + +// uy : http://www.antel.com.uy/ +*.uy + +// uz : http://www.reg.uz/registerr.html +// are there other 2nd level tlds ? +uz +com.uz +co.uz + +// va : http://en.wikipedia.org/wiki/.va +va + +// vc : http://en.wikipedia.org/wiki/.vc +// Submitted by registry <kshah@ca.afilias.info> 2008-06-13 +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : http://registro.nic.ve/nicve/registro/index.html +*.ve + +// vg : http://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : http://en.wikipedia.org/wiki/.vu +// list of 2nd level tlds ? +vu + +// ws : http://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// ye : http://www.y.net.ye/services/domain_name.htm +*.ye + +// yu : http://www.nic.yu/pravilnik-e.html +*.yu + +// za : http://www.zadna.org.za/slds.html +*.za + +// zm : http://en.wikipedia.org/wiki/.zm +*.zm + +// zw : http://en.wikipedia.org/wiki/.zw +*.zw diff --git a/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2015-07-19.dat.txt b/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2015-07-19.dat.txt new file mode 100644 index 000000000..ad507ba29 --- /dev/null +++ b/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2015-07-19.dat.txt @@ -0,0 +1,10641 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// ===BEGIN ICANN DOMAINS=== + +// ac : http://en.wikipedia.org/wiki/.ac +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : http://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : http://en.wikipedia.org/wiki/.ae +// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see http://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +freight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +marketplace.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +taxi.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : http://en.wikipedia.org/wiki/.am +am + +// an : http://www.una.an/an_domreg/default.asp +an +com.an +net.an +org.an +edu.an + +// ao : http://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : http://en.wikipedia.org/wiki/.aq +aq + +// ar : https://nic.ar/normativa-vigente.xhtml +ar +com.ar +edu.ar +gob.ar +gov.ar +int.ar +mil.ar +net.ar +org.ar +tur.ar + +// arpa : http://en.wikipedia.org/wiki/.arpa +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +arpa +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : http://en.wikipedia.org/wiki/.as +as +gov.as + +// asia : http://en.wikipedia.org/wiki/.asia +asia + +// at : http://en.wikipedia.org/wiki/.at +// Confirmed by registry <it@nic.at> 2008-06-17 +at +ac.at +co.at +gv.at +or.at + +// au : http://en.wikipedia.org/wiki/.au +// http://www.auda.org.au/ +au +// 2LDs +com.au +net.au +org.au +edu.au +gov.au +asn.au +id.au +// Historic 2LDs (closed to new registration, but sites still exist) +info.au +conf.au +oz.au +// CGDNs - http://www.cgdn.org.au/ +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +// 3LDs +act.edu.au +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +// act.gov.au Bug 984824 - Removed at request of Greg Tankard +// nsw.gov.au Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au> +// nt.gov.au Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au> +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au + +// aw : http://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : http://en.wikipedia.org/wiki/.ax +ax + +// az : http://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://en.wikipedia.org/wiki/.ba +ba +org.ba +net.ba +edu.ba +gov.ba +mil.ba +unsa.ba +unbi.ba +co.ba +com.ba +rs.ba + +// bb : http://en.wikipedia.org/wiki/.bb +bb +biz.bb +co.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb +tv.bb + +// bd : http://en.wikipedia.org/wiki/.bd +*.bd + +// be : http://en.wikipedia.org/wiki/.be +// Confirmed by registry <tech@dns.be> 2008-06-08 +be +ac.be + +// bf : http://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : http://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : http://en.wikipedia.org/wiki/.bh +bh +com.bh +edu.bh +net.bh +org.bh +gov.bh + +// bi : http://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : http://en.wikipedia.org/wiki/.biz +biz + +// bj : http://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : http://en.wikipedia.org/wiki/.bn +*.bn + +// bo : http://www.nic.bo/ +bo +com.bo +edu.bo +gov.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo + +// br : http://registro.br/dominio/categoria.html +// Submitted by registry <fneves@registro.br> 2014-08-11 +br +adm.br +adv.br +agr.br +am.br +arq.br +art.br +ato.br +b.br +bio.br +blog.br +bmd.br +cim.br +cng.br +cnt.br +com.br +coop.br +ecn.br +eco.br +edu.br +emp.br +eng.br +esp.br +etc.br +eti.br +far.br +flog.br +fm.br +fnd.br +fot.br +fst.br +g12.br +ggf.br +gov.br +imb.br +ind.br +inf.br +jor.br +jus.br +leg.br +lel.br +mat.br +med.br +mil.br +mp.br +mus.br +net.br +*.nom.br +not.br +ntr.br +odo.br +org.br +ppg.br +pro.br +psc.br +psi.br +qsl.br +radio.br +rec.br +slg.br +srv.br +taxi.br +teo.br +tmp.br +trd.br +tur.br +tv.br +vet.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : http://en.wikipedia.org/wiki/.bt +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt + +// bv : No registrations at this time. +// Submitted by registry <jarle@uninett.no> 2006-06-16 +bv + +// bw : http://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : http://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : http://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : http://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: http://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : http://en.wikipedia.org/wiki/.cat +cat + +// cc : http://en.wikipedia.org/wiki/.cc +cc + +// cd : http://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : http://en.wikipedia.org/wiki/.cf +cf + +// cg : http://en.wikipedia.org/wiki/.cg +cg + +// ch : http://en.wikipedia.org/wiki/.ch +ch + +// ci : http://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : http://en.wikipedia.org/wiki/.ck +*.ck +!www.ck + +// cl : http://en.wikipedia.org/wiki/.cl +cl +gov.cl +gob.cl +co.cl +mil.cl + +// cm : http://en.wikipedia.org/wiki/.cm plus bug 981927 +cm +co.cm +com.cm +gov.cm +net.cm + +// cn : http://en.wikipedia.org/wiki/.cn +// Submitted by registry <tanyaling@cnnic.cn> 2008-06-11 +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +公司.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : http://en.wikipedia.org/wiki/.co +// Submitted by registry <tecnico@uniandes.edu.co> 2008-06-11 +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : http://en.wikipedia.org/wiki/.com +com + +// coop : http://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : http://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : http://en.wikipedia.org/wiki/.cv +cv + +// cw : http://www.una.cw/cw_registry/ +// Confirmed by registry <registry@una.net> 2013-03-26 +cw +com.cw +edu.cw +net.cw +org.cw + +// cx : http://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://en.wikipedia.org/wiki/.cy +ac.cy +biz.cy +com.cy +ekloges.cy +gov.cy +ltd.cy +name.cy +net.cy +org.cy +parliament.cy +press.cy +pro.cy +tm.cy + +// cz : http://en.wikipedia.org/wiki/.cz +cz + +// de : http://en.wikipedia.org/wiki/.de +// Confirmed by registry <ops@denic.de> (with technical +// reservations) 2008-07-01 +de + +// dj : http://en.wikipedia.org/wiki/.dj +dj + +// dk : http://en.wikipedia.org/wiki/.dk +// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17 +dk + +// dm : http://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : http://en.wikipedia.org/wiki/.do +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do + +// dz : http://en.wikipedia.org/wiki/.dz +dz +com.dz +org.dz +net.dz +gov.dz +edu.dz +asso.dz +pol.dz +art.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry <vabboud@nic.ec> 2008-07-04 +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +gob.ec +mil.ec + +// edu : http://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : http://en.wikipedia.org/wiki/.eg +eg +com.eg +edu.eg +eun.eg +gov.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg + +// er : http://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : http://en.wikipedia.org/wiki/.et +et +com.et +gov.et +org.et +edu.et +biz.et +name.et +info.et +net.et + +// eu : http://en.wikipedia.org/wiki/.eu +eu + +// fi : http://en.wikipedia.org/wiki/.fi +fi +// aland.fi : http://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi + +// fj : http://en.wikipedia.org/wiki/.fj +*.fj + +// fk : http://en.wikipedia.org/wiki/.fk +*.fk + +// fm : http://en.wikipedia.org/wiki/.fm +fm + +// fo : http://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs +fr +com.fr +asso.fr +nom.fr +prd.fr +presse.fr +tm.fr +// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels +aeroport.fr +assedic.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +gouv.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : http://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry <Damien.Shaw@ja.net> 2008-06-12 +gb + +// gd : http://en.wikipedia.org/wiki/.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : http://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +gg +co.gg +net.gg +org.gg + +// gh : http://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : http://en.wikipedia.org/wiki/.gl +// http://nic.gl +gl +co.gl +com.gl +edu.gl +net.gl +org.gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry <randy@psg.com> 2008-06-17 +gn +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : http://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : http://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry <segred@ics.forth.gr> 2008-06-09 +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : http://en.wikipedia.org/wiki/.gs +gs + +// gt : http://www.gt/politicas_de_registro.html +gt +com.gt +edu.gt +gob.gt +ind.gt +mil.gt +net.gt +org.gt + +// gu : http://gadao.gov.gu/registration.txt +*.gu + +// gw : http://en.wikipedia.org/wiki/.gw +gw + +// gy : http://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +net.gy + +// hk : https://www.hkdnr.hk +// Submitted by registry <hk.tech@hkirc.hk> 2008-06-11 +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +公司.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : http://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry <pasztor@iszt.hu> 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : https://register.pandi.or.id/ +id +ac.id +biz.id +co.id +desa.id +go.id +mil.id +my.id +net.id +or.id +sch.id +web.id + +// ie : http://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://en.wikipedia.org/wiki/.il +*.il + +// im : https://www.nic.im/ +// Submitted by registry <info@nic.im> 2013-11-15 +im +ac.im +co.im +com.im +ltd.co.im +net.im +org.im +plc.co.im +tt.im +tv.im + +// in : http://en.wikipedia.org/wiki/.in +// see also: https://registry.in/Policies +// Please note, that nic.in is not an offical eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : http://en.wikipedia.org/wiki/.info +info + +// int : http://en.wikipedia.org/wiki/.int +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.html +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules +// Also see http://www.nic.ir/Internationalized_Domain_Names +// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16 +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH) +ایران.ir +// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH) +ايران.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry <marius@isgate.is> 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : http://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// Reserved geo-names: +// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf +// There is also a list of reserved geo-names corresponding to Italian municipalities +// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here. +// Regions +abr.it +abruzzo.it +aosta-valley.it +aostavalley.it +bas.it +basilicata.it +cal.it +calabria.it +cam.it +campania.it +emilia-romagna.it +emiliaromagna.it +emr.it +friuli-v-giulia.it +friuli-ve-giulia.it +friuli-vegiulia.it +friuli-venezia-giulia.it +friuli-veneziagiulia.it +friuli-vgiulia.it +friuliv-giulia.it +friulive-giulia.it +friulivegiulia.it +friulivenezia-giulia.it +friuliveneziagiulia.it +friulivgiulia.it +fvg.it +laz.it +lazio.it +lig.it +liguria.it +lom.it +lombardia.it +lombardy.it +lucania.it +mar.it +marche.it +mol.it +molise.it +piedmont.it +piemonte.it +pmn.it +pug.it +puglia.it +sar.it +sardegna.it +sardinia.it +sic.it +sicilia.it +sicily.it +taa.it +tos.it +toscana.it +trentino-a-adige.it +trentino-aadige.it +trentino-alto-adige.it +trentino-altoadige.it +trentino-s-tirol.it +trentino-stirol.it +trentino-sud-tirol.it +trentino-sudtirol.it +trentino-sued-tirol.it +trentino-suedtirol.it +trentinoa-adige.it +trentinoaadige.it +trentinoalto-adige.it +trentinoaltoadige.it +trentinos-tirol.it +trentinostirol.it +trentinosud-tirol.it +trentinosudtirol.it +trentinosued-tirol.it +trentinosuedtirol.it +tuscany.it +umb.it +umbria.it +val-d-aosta.it +val-daosta.it +vald-aosta.it +valdaosta.it +valle-aosta.it +valle-d-aosta.it +valle-daosta.it +valleaosta.it +valled-aosta.it +valledaosta.it +vallee-aoste.it +valleeaoste.it +vao.it +vda.it +ven.it +veneto.it +// Provinces +ag.it +agrigento.it +al.it +alessandria.it +alto-adige.it +altoadige.it +an.it +ancona.it +andria-barletta-trani.it +andria-trani-barletta.it +andriabarlettatrani.it +andriatranibarletta.it +ao.it +aosta.it +aoste.it +ap.it +aq.it +aquila.it +ar.it +arezzo.it +ascoli-piceno.it +ascolipiceno.it +asti.it +at.it +av.it +avellino.it +ba.it +balsan.it +bari.it +barletta-trani-andria.it +barlettatraniandria.it +belluno.it +benevento.it +bergamo.it +bg.it +bi.it +biella.it +bl.it +bn.it +bo.it +bologna.it +bolzano.it +bozen.it +br.it +brescia.it +brindisi.it +bs.it +bt.it +bz.it +ca.it +cagliari.it +caltanissetta.it +campidano-medio.it +campidanomedio.it +campobasso.it +carbonia-iglesias.it +carboniaiglesias.it +carrara-massa.it +carraramassa.it +caserta.it +catania.it +catanzaro.it +cb.it +ce.it +cesena-forli.it +cesenaforli.it +ch.it +chieti.it +ci.it +cl.it +cn.it +co.it +como.it +cosenza.it +cr.it +cremona.it +crotone.it +cs.it +ct.it +cuneo.it +cz.it +dell-ogliastra.it +dellogliastra.it +en.it +enna.it +fc.it +fe.it +fermo.it +ferrara.it +fg.it +fi.it +firenze.it +florence.it +fm.it +foggia.it +forli-cesena.it +forlicesena.it +fr.it +frosinone.it +ge.it +genoa.it +genova.it +go.it +gorizia.it +gr.it +grosseto.it +iglesias-carbonia.it +iglesiascarbonia.it +im.it +imperia.it +is.it +isernia.it +kr.it +la-spezia.it +laquila.it +laspezia.it +latina.it +lc.it +le.it +lecce.it +lecco.it +li.it +livorno.it +lo.it +lodi.it +lt.it +lu.it +lucca.it +macerata.it +mantova.it +massa-carrara.it +massacarrara.it +matera.it +mb.it +mc.it +me.it +medio-campidano.it +mediocampidano.it +messina.it +mi.it +milan.it +milano.it +mn.it +mo.it +modena.it +monza-brianza.it +monza-e-della-brianza.it +monza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +ms.it +mt.it +na.it +naples.it +napoli.it +no.it +novara.it +nu.it +nuoro.it +og.it +ogliastra.it +olbia-tempio.it +olbiatempio.it +or.it +oristano.it +ot.it +pa.it +padova.it +padua.it +palermo.it +parma.it +pavia.it +pc.it +pd.it +pe.it +perugia.it +pesaro-urbino.it +pesarourbino.it +pescara.it +pg.it +pi.it +piacenza.it +pisa.it +pistoia.it +pn.it +po.it +pordenone.it +potenza.it +pr.it +prato.it +pt.it +pu.it +pv.it +pz.it +ra.it +ragusa.it +ravenna.it +rc.it +re.it +reggio-calabria.it +reggio-emilia.it +reggiocalabria.it +reggioemilia.it +rg.it +ri.it +rieti.it +rimini.it +rm.it +rn.it +ro.it +roma.it +rome.it +rovigo.it +sa.it +salerno.it +sassari.it +savona.it +si.it +siena.it +siracusa.it +so.it +sondrio.it +sp.it +sr.it +ss.it +suedtirol.it +sv.it +ta.it +taranto.it +te.it +tempio-olbia.it +tempioolbia.it +teramo.it +terni.it +tn.it +to.it +torino.it +tp.it +tr.it +trani-andria-barletta.it +trani-barletta-andria.it +traniandriabarletta.it +tranibarlettaandria.it +trapani.it +trentino.it +trento.it +treviso.it +trieste.it +ts.it +turin.it +tv.it +ud.it +udine.it +urbino-pesaro.it +urbinopesaro.it +va.it +varese.it +vb.it +vc.it +ve.it +venezia.it +venice.it +verbania.it +vercelli.it +verona.it +vi.it +vibo-valentia.it +vibovalentia.it +vicenza.it +viterbo.it +vr.it +vs.it +vt.it +vv.it + +// je : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +je +co.je +net.je +org.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : http://en.wikipedia.org/wiki/.jobs +jobs + +// jp : http://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry <info@jprs.jp> 2014-10-30 +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp prefecture type names +aichi.jp +akita.jp +aomori.jp +chiba.jp +ehime.jp +fukui.jp +fukuoka.jp +fukushima.jp +gifu.jp +gunma.jp +hiroshima.jp +hokkaido.jp +hyogo.jp +ibaraki.jp +ishikawa.jp +iwate.jp +kagawa.jp +kagoshima.jp +kanagawa.jp +kochi.jp +kumamoto.jp +kyoto.jp +mie.jp +miyagi.jp +miyazaki.jp +nagano.jp +nagasaki.jp +nara.jp +niigata.jp +oita.jp +okayama.jp +okinawa.jp +osaka.jp +saga.jp +saitama.jp +shiga.jp +shimane.jp +shizuoka.jp +tochigi.jp +tokushima.jp +tokyo.jp +tottori.jp +toyama.jp +wakayama.jp +yamagata.jp +yamaguchi.jp +yamanashi.jp +栃木.jp +愛知.jp +愛媛.jp +兵庫.jp +熊本.jp +茨城.jp +北海道.jp +千葉.jp +和歌山.jp +長崎.jp +長野.jp +新潟.jp +青森.jp +静岡.jp +東京.jp +石川.jp +埼玉.jp +三重.jp +京都.jp +佐賀.jp +大分.jp +大阪.jp +奈良.jp +宮城.jp +宮崎.jp +富山.jp +山口.jp +山形.jp +山梨.jp +岩手.jp +岐阜.jp +岡山.jp +島根.jp +広島.jp +徳島.jp +沖縄.jp +滋賀.jp +神奈川.jp +福井.jp +福岡.jp +福島.jp +秋田.jp +群馬.jp +香川.jp +高知.jp +鳥取.jp +鹿児島.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.nagoya.jp +*.sapporo.jp +*.sendai.jp +*.yokohama.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.nagoya.jp +!city.sapporo.jp +!city.sendai.jp +!city.yokohama.jp +// 4th level registration +aisai.aichi.jp +ama.aichi.jp +anjo.aichi.jp +asuke.aichi.jp +chiryu.aichi.jp +chita.aichi.jp +fuso.aichi.jp +gamagori.aichi.jp +handa.aichi.jp +hazu.aichi.jp +hekinan.aichi.jp +higashiura.aichi.jp +ichinomiya.aichi.jp +inazawa.aichi.jp +inuyama.aichi.jp +isshiki.aichi.jp +iwakura.aichi.jp +kanie.aichi.jp +kariya.aichi.jp +kasugai.aichi.jp +kira.aichi.jp +kiyosu.aichi.jp +komaki.aichi.jp +konan.aichi.jp +kota.aichi.jp +mihama.aichi.jp +miyoshi.aichi.jp +nishio.aichi.jp +nisshin.aichi.jp +obu.aichi.jp +oguchi.aichi.jp +oharu.aichi.jp +okazaki.aichi.jp +owariasahi.aichi.jp +seto.aichi.jp +shikatsu.aichi.jp +shinshiro.aichi.jp +shitara.aichi.jp +tahara.aichi.jp +takahama.aichi.jp +tobishima.aichi.jp +toei.aichi.jp +togo.aichi.jp +tokai.aichi.jp +tokoname.aichi.jp +toyoake.aichi.jp +toyohashi.aichi.jp +toyokawa.aichi.jp +toyone.aichi.jp +toyota.aichi.jp +tsushima.aichi.jp +yatomi.aichi.jp +akita.akita.jp +daisen.akita.jp +fujisato.akita.jp +gojome.akita.jp +hachirogata.akita.jp +happou.akita.jp +higashinaruse.akita.jp +honjo.akita.jp +honjyo.akita.jp +ikawa.akita.jp +kamikoani.akita.jp +kamioka.akita.jp +katagami.akita.jp +kazuno.akita.jp +kitaakita.akita.jp +kosaka.akita.jp +kyowa.akita.jp +misato.akita.jp +mitane.akita.jp +moriyoshi.akita.jp +nikaho.akita.jp +noshiro.akita.jp +odate.akita.jp +oga.akita.jp +ogata.akita.jp +semboku.akita.jp +yokote.akita.jp +yurihonjo.akita.jp +aomori.aomori.jp +gonohe.aomori.jp +hachinohe.aomori.jp +hashikami.aomori.jp +hiranai.aomori.jp +hirosaki.aomori.jp +itayanagi.aomori.jp +kuroishi.aomori.jp +misawa.aomori.jp +mutsu.aomori.jp +nakadomari.aomori.jp +noheji.aomori.jp +oirase.aomori.jp +owani.aomori.jp +rokunohe.aomori.jp +sannohe.aomori.jp +shichinohe.aomori.jp +shingo.aomori.jp +takko.aomori.jp +towada.aomori.jp +tsugaru.aomori.jp +tsuruta.aomori.jp +abiko.chiba.jp +asahi.chiba.jp +chonan.chiba.jp +chosei.chiba.jp +choshi.chiba.jp +chuo.chiba.jp +funabashi.chiba.jp +futtsu.chiba.jp +hanamigawa.chiba.jp +ichihara.chiba.jp +ichikawa.chiba.jp +ichinomiya.chiba.jp +inzai.chiba.jp +isumi.chiba.jp +kamagaya.chiba.jp +kamogawa.chiba.jp +kashiwa.chiba.jp +katori.chiba.jp +katsuura.chiba.jp +kimitsu.chiba.jp +kisarazu.chiba.jp +kozaki.chiba.jp +kujukuri.chiba.jp +kyonan.chiba.jp +matsudo.chiba.jp +midori.chiba.jp +mihama.chiba.jp +minamiboso.chiba.jp +mobara.chiba.jp +mutsuzawa.chiba.jp +nagara.chiba.jp +nagareyama.chiba.jp +narashino.chiba.jp +narita.chiba.jp +noda.chiba.jp +oamishirasato.chiba.jp +omigawa.chiba.jp +onjuku.chiba.jp +otaki.chiba.jp +sakae.chiba.jp +sakura.chiba.jp +shimofusa.chiba.jp +shirako.chiba.jp +shiroi.chiba.jp +shisui.chiba.jp +sodegaura.chiba.jp +sosa.chiba.jp +tako.chiba.jp +tateyama.chiba.jp +togane.chiba.jp +tohnosho.chiba.jp +tomisato.chiba.jp +urayasu.chiba.jp +yachimata.chiba.jp +yachiyo.chiba.jp +yokaichiba.chiba.jp +yokoshibahikari.chiba.jp +yotsukaido.chiba.jp +ainan.ehime.jp +honai.ehime.jp +ikata.ehime.jp +imabari.ehime.jp +iyo.ehime.jp +kamijima.ehime.jp +kihoku.ehime.jp +kumakogen.ehime.jp +masaki.ehime.jp +matsuno.ehime.jp +matsuyama.ehime.jp +namikata.ehime.jp +niihama.ehime.jp +ozu.ehime.jp +saijo.ehime.jp +seiyo.ehime.jp +shikokuchuo.ehime.jp +tobe.ehime.jp +toon.ehime.jp +uchiko.ehime.jp +uwajima.ehime.jp +yawatahama.ehime.jp +echizen.fukui.jp +eiheiji.fukui.jp +fukui.fukui.jp +ikeda.fukui.jp +katsuyama.fukui.jp +mihama.fukui.jp +minamiechizen.fukui.jp +obama.fukui.jp +ohi.fukui.jp +ono.fukui.jp +sabae.fukui.jp +sakai.fukui.jp +takahama.fukui.jp +tsuruga.fukui.jp +wakasa.fukui.jp +ashiya.fukuoka.jp +buzen.fukuoka.jp +chikugo.fukuoka.jp +chikuho.fukuoka.jp +chikujo.fukuoka.jp +chikushino.fukuoka.jp +chikuzen.fukuoka.jp +chuo.fukuoka.jp +dazaifu.fukuoka.jp +fukuchi.fukuoka.jp +hakata.fukuoka.jp +higashi.fukuoka.jp +hirokawa.fukuoka.jp +hisayama.fukuoka.jp +iizuka.fukuoka.jp +inatsuki.fukuoka.jp +kaho.fukuoka.jp +kasuga.fukuoka.jp +kasuya.fukuoka.jp +kawara.fukuoka.jp +keisen.fukuoka.jp +koga.fukuoka.jp +kurate.fukuoka.jp +kurogi.fukuoka.jp +kurume.fukuoka.jp +minami.fukuoka.jp +miyako.fukuoka.jp +miyama.fukuoka.jp +miyawaka.fukuoka.jp +mizumaki.fukuoka.jp +munakata.fukuoka.jp +nakagawa.fukuoka.jp +nakama.fukuoka.jp +nishi.fukuoka.jp +nogata.fukuoka.jp +ogori.fukuoka.jp +okagaki.fukuoka.jp +okawa.fukuoka.jp +oki.fukuoka.jp +omuta.fukuoka.jp +onga.fukuoka.jp +onojo.fukuoka.jp +oto.fukuoka.jp +saigawa.fukuoka.jp +sasaguri.fukuoka.jp +shingu.fukuoka.jp +shinyoshitomi.fukuoka.jp +shonai.fukuoka.jp +soeda.fukuoka.jp +sue.fukuoka.jp +tachiarai.fukuoka.jp +tagawa.fukuoka.jp +takata.fukuoka.jp +toho.fukuoka.jp +toyotsu.fukuoka.jp +tsuiki.fukuoka.jp +ukiha.fukuoka.jp +umi.fukuoka.jp +usui.fukuoka.jp +yamada.fukuoka.jp +yame.fukuoka.jp +yanagawa.fukuoka.jp +yukuhashi.fukuoka.jp +aizubange.fukushima.jp +aizumisato.fukushima.jp +aizuwakamatsu.fukushima.jp +asakawa.fukushima.jp +bandai.fukushima.jp +date.fukushima.jp +fukushima.fukushima.jp +furudono.fukushima.jp +futaba.fukushima.jp +hanawa.fukushima.jp +higashi.fukushima.jp +hirata.fukushima.jp +hirono.fukushima.jp +iitate.fukushima.jp +inawashiro.fukushima.jp +ishikawa.fukushima.jp +iwaki.fukushima.jp +izumizaki.fukushima.jp +kagamiishi.fukushima.jp +kaneyama.fukushima.jp +kawamata.fukushima.jp +kitakata.fukushima.jp +kitashiobara.fukushima.jp +koori.fukushima.jp +koriyama.fukushima.jp +kunimi.fukushima.jp +miharu.fukushima.jp +mishima.fukushima.jp +namie.fukushima.jp +nango.fukushima.jp +nishiaizu.fukushima.jp +nishigo.fukushima.jp +okuma.fukushima.jp +omotego.fukushima.jp +ono.fukushima.jp +otama.fukushima.jp +samegawa.fukushima.jp +shimogo.fukushima.jp +shirakawa.fukushima.jp +showa.fukushima.jp +soma.fukushima.jp +sukagawa.fukushima.jp +taishin.fukushima.jp +tamakawa.fukushima.jp +tanagura.fukushima.jp +tenei.fukushima.jp +yabuki.fukushima.jp +yamato.fukushima.jp +yamatsuri.fukushima.jp +yanaizu.fukushima.jp +yugawa.fukushima.jp +anpachi.gifu.jp +ena.gifu.jp +gifu.gifu.jp +ginan.gifu.jp +godo.gifu.jp +gujo.gifu.jp +hashima.gifu.jp +hichiso.gifu.jp +hida.gifu.jp +higashishirakawa.gifu.jp +ibigawa.gifu.jp +ikeda.gifu.jp +kakamigahara.gifu.jp +kani.gifu.jp +kasahara.gifu.jp +kasamatsu.gifu.jp +kawaue.gifu.jp +kitagata.gifu.jp +mino.gifu.jp +minokamo.gifu.jp +mitake.gifu.jp +mizunami.gifu.jp +motosu.gifu.jp +nakatsugawa.gifu.jp +ogaki.gifu.jp +sakahogi.gifu.jp +seki.gifu.jp +sekigahara.gifu.jp +shirakawa.gifu.jp +tajimi.gifu.jp +takayama.gifu.jp +tarui.gifu.jp +toki.gifu.jp +tomika.gifu.jp +wanouchi.gifu.jp +yamagata.gifu.jp +yaotsu.gifu.jp +yoro.gifu.jp +annaka.gunma.jp +chiyoda.gunma.jp +fujioka.gunma.jp +higashiagatsuma.gunma.jp +isesaki.gunma.jp +itakura.gunma.jp +kanna.gunma.jp +kanra.gunma.jp +katashina.gunma.jp +kawaba.gunma.jp +kiryu.gunma.jp +kusatsu.gunma.jp +maebashi.gunma.jp +meiwa.gunma.jp +midori.gunma.jp +minakami.gunma.jp +naganohara.gunma.jp +nakanojo.gunma.jp +nanmoku.gunma.jp +numata.gunma.jp +oizumi.gunma.jp +ora.gunma.jp +ota.gunma.jp +shibukawa.gunma.jp +shimonita.gunma.jp +shinto.gunma.jp +showa.gunma.jp +takasaki.gunma.jp +takayama.gunma.jp +tamamura.gunma.jp +tatebayashi.gunma.jp +tomioka.gunma.jp +tsukiyono.gunma.jp +tsumagoi.gunma.jp +ueno.gunma.jp +yoshioka.gunma.jp +asaminami.hiroshima.jp +daiwa.hiroshima.jp +etajima.hiroshima.jp +fuchu.hiroshima.jp +fukuyama.hiroshima.jp +hatsukaichi.hiroshima.jp +higashihiroshima.hiroshima.jp +hongo.hiroshima.jp +jinsekikogen.hiroshima.jp +kaita.hiroshima.jp +kui.hiroshima.jp +kumano.hiroshima.jp +kure.hiroshima.jp +mihara.hiroshima.jp +miyoshi.hiroshima.jp +naka.hiroshima.jp +onomichi.hiroshima.jp +osakikamijima.hiroshima.jp +otake.hiroshima.jp +saka.hiroshima.jp +sera.hiroshima.jp +seranishi.hiroshima.jp +shinichi.hiroshima.jp +shobara.hiroshima.jp +takehara.hiroshima.jp +abashiri.hokkaido.jp +abira.hokkaido.jp +aibetsu.hokkaido.jp +akabira.hokkaido.jp +akkeshi.hokkaido.jp +asahikawa.hokkaido.jp +ashibetsu.hokkaido.jp +ashoro.hokkaido.jp +assabu.hokkaido.jp +atsuma.hokkaido.jp +bibai.hokkaido.jp +biei.hokkaido.jp +bifuka.hokkaido.jp +bihoro.hokkaido.jp +biratori.hokkaido.jp +chippubetsu.hokkaido.jp +chitose.hokkaido.jp +date.hokkaido.jp +ebetsu.hokkaido.jp +embetsu.hokkaido.jp +eniwa.hokkaido.jp +erimo.hokkaido.jp +esan.hokkaido.jp +esashi.hokkaido.jp +fukagawa.hokkaido.jp +fukushima.hokkaido.jp +furano.hokkaido.jp +furubira.hokkaido.jp +haboro.hokkaido.jp +hakodate.hokkaido.jp +hamatonbetsu.hokkaido.jp +hidaka.hokkaido.jp +higashikagura.hokkaido.jp +higashikawa.hokkaido.jp +hiroo.hokkaido.jp +hokuryu.hokkaido.jp +hokuto.hokkaido.jp +honbetsu.hokkaido.jp +horokanai.hokkaido.jp +horonobe.hokkaido.jp +ikeda.hokkaido.jp +imakane.hokkaido.jp +ishikari.hokkaido.jp +iwamizawa.hokkaido.jp +iwanai.hokkaido.jp +kamifurano.hokkaido.jp +kamikawa.hokkaido.jp +kamishihoro.hokkaido.jp +kamisunagawa.hokkaido.jp +kamoenai.hokkaido.jp +kayabe.hokkaido.jp +kembuchi.hokkaido.jp +kikonai.hokkaido.jp +kimobetsu.hokkaido.jp +kitahiroshima.hokkaido.jp +kitami.hokkaido.jp +kiyosato.hokkaido.jp +koshimizu.hokkaido.jp +kunneppu.hokkaido.jp +kuriyama.hokkaido.jp +kuromatsunai.hokkaido.jp +kushiro.hokkaido.jp +kutchan.hokkaido.jp +kyowa.hokkaido.jp +mashike.hokkaido.jp +matsumae.hokkaido.jp +mikasa.hokkaido.jp +minamifurano.hokkaido.jp +mombetsu.hokkaido.jp +moseushi.hokkaido.jp +mukawa.hokkaido.jp +muroran.hokkaido.jp +naie.hokkaido.jp +nakagawa.hokkaido.jp +nakasatsunai.hokkaido.jp +nakatombetsu.hokkaido.jp +nanae.hokkaido.jp +nanporo.hokkaido.jp +nayoro.hokkaido.jp +nemuro.hokkaido.jp +niikappu.hokkaido.jp +niki.hokkaido.jp +nishiokoppe.hokkaido.jp +noboribetsu.hokkaido.jp +numata.hokkaido.jp +obihiro.hokkaido.jp +obira.hokkaido.jp +oketo.hokkaido.jp +okoppe.hokkaido.jp +otaru.hokkaido.jp +otobe.hokkaido.jp +otofuke.hokkaido.jp +otoineppu.hokkaido.jp +oumu.hokkaido.jp +ozora.hokkaido.jp +pippu.hokkaido.jp +rankoshi.hokkaido.jp +rebun.hokkaido.jp +rikubetsu.hokkaido.jp +rishiri.hokkaido.jp +rishirifuji.hokkaido.jp +saroma.hokkaido.jp +sarufutsu.hokkaido.jp +shakotan.hokkaido.jp +shari.hokkaido.jp +shibecha.hokkaido.jp +shibetsu.hokkaido.jp +shikabe.hokkaido.jp +shikaoi.hokkaido.jp +shimamaki.hokkaido.jp +shimizu.hokkaido.jp +shimokawa.hokkaido.jp +shinshinotsu.hokkaido.jp +shintoku.hokkaido.jp +shiranuka.hokkaido.jp +shiraoi.hokkaido.jp +shiriuchi.hokkaido.jp +sobetsu.hokkaido.jp +sunagawa.hokkaido.jp +taiki.hokkaido.jp +takasu.hokkaido.jp +takikawa.hokkaido.jp +takinoue.hokkaido.jp +teshikaga.hokkaido.jp +tobetsu.hokkaido.jp +tohma.hokkaido.jp +tomakomai.hokkaido.jp +tomari.hokkaido.jp +toya.hokkaido.jp +toyako.hokkaido.jp +toyotomi.hokkaido.jp +toyoura.hokkaido.jp +tsubetsu.hokkaido.jp +tsukigata.hokkaido.jp +urakawa.hokkaido.jp +urausu.hokkaido.jp +uryu.hokkaido.jp +utashinai.hokkaido.jp +wakkanai.hokkaido.jp +wassamu.hokkaido.jp +yakumo.hokkaido.jp +yoichi.hokkaido.jp +aioi.hyogo.jp +akashi.hyogo.jp +ako.hyogo.jp +amagasaki.hyogo.jp +aogaki.hyogo.jp +asago.hyogo.jp +ashiya.hyogo.jp +awaji.hyogo.jp +fukusaki.hyogo.jp +goshiki.hyogo.jp +harima.hyogo.jp +himeji.hyogo.jp +ichikawa.hyogo.jp +inagawa.hyogo.jp +itami.hyogo.jp +kakogawa.hyogo.jp +kamigori.hyogo.jp +kamikawa.hyogo.jp +kasai.hyogo.jp +kasuga.hyogo.jp +kawanishi.hyogo.jp +miki.hyogo.jp +minamiawaji.hyogo.jp +nishinomiya.hyogo.jp +nishiwaki.hyogo.jp +ono.hyogo.jp +sanda.hyogo.jp +sannan.hyogo.jp +sasayama.hyogo.jp +sayo.hyogo.jp +shingu.hyogo.jp +shinonsen.hyogo.jp +shiso.hyogo.jp +sumoto.hyogo.jp +taishi.hyogo.jp +taka.hyogo.jp +takarazuka.hyogo.jp +takasago.hyogo.jp +takino.hyogo.jp +tamba.hyogo.jp +tatsuno.hyogo.jp +toyooka.hyogo.jp +yabu.hyogo.jp +yashiro.hyogo.jp +yoka.hyogo.jp +yokawa.hyogo.jp +ami.ibaraki.jp +asahi.ibaraki.jp +bando.ibaraki.jp +chikusei.ibaraki.jp +daigo.ibaraki.jp +fujishiro.ibaraki.jp +hitachi.ibaraki.jp +hitachinaka.ibaraki.jp +hitachiomiya.ibaraki.jp +hitachiota.ibaraki.jp +ibaraki.ibaraki.jp +ina.ibaraki.jp +inashiki.ibaraki.jp +itako.ibaraki.jp +iwama.ibaraki.jp +joso.ibaraki.jp +kamisu.ibaraki.jp +kasama.ibaraki.jp +kashima.ibaraki.jp +kasumigaura.ibaraki.jp +koga.ibaraki.jp +miho.ibaraki.jp +mito.ibaraki.jp +moriya.ibaraki.jp +naka.ibaraki.jp +namegata.ibaraki.jp +oarai.ibaraki.jp +ogawa.ibaraki.jp +omitama.ibaraki.jp +ryugasaki.ibaraki.jp +sakai.ibaraki.jp +sakuragawa.ibaraki.jp +shimodate.ibaraki.jp +shimotsuma.ibaraki.jp +shirosato.ibaraki.jp +sowa.ibaraki.jp +suifu.ibaraki.jp +takahagi.ibaraki.jp +tamatsukuri.ibaraki.jp +tokai.ibaraki.jp +tomobe.ibaraki.jp +tone.ibaraki.jp +toride.ibaraki.jp +tsuchiura.ibaraki.jp +tsukuba.ibaraki.jp +uchihara.ibaraki.jp +ushiku.ibaraki.jp +yachiyo.ibaraki.jp +yamagata.ibaraki.jp +yawara.ibaraki.jp +yuki.ibaraki.jp +anamizu.ishikawa.jp +hakui.ishikawa.jp +hakusan.ishikawa.jp +kaga.ishikawa.jp +kahoku.ishikawa.jp +kanazawa.ishikawa.jp +kawakita.ishikawa.jp +komatsu.ishikawa.jp +nakanoto.ishikawa.jp +nanao.ishikawa.jp +nomi.ishikawa.jp +nonoichi.ishikawa.jp +noto.ishikawa.jp +shika.ishikawa.jp +suzu.ishikawa.jp +tsubata.ishikawa.jp +tsurugi.ishikawa.jp +uchinada.ishikawa.jp +wajima.ishikawa.jp +fudai.iwate.jp +fujisawa.iwate.jp +hanamaki.iwate.jp +hiraizumi.iwate.jp +hirono.iwate.jp +ichinohe.iwate.jp +ichinoseki.iwate.jp +iwaizumi.iwate.jp +iwate.iwate.jp +joboji.iwate.jp +kamaishi.iwate.jp +kanegasaki.iwate.jp +karumai.iwate.jp +kawai.iwate.jp +kitakami.iwate.jp +kuji.iwate.jp +kunohe.iwate.jp +kuzumaki.iwate.jp +miyako.iwate.jp +mizusawa.iwate.jp +morioka.iwate.jp +ninohe.iwate.jp +noda.iwate.jp +ofunato.iwate.jp +oshu.iwate.jp +otsuchi.iwate.jp +rikuzentakata.iwate.jp +shiwa.iwate.jp +shizukuishi.iwate.jp +sumita.iwate.jp +tanohata.iwate.jp +tono.iwate.jp +yahaba.iwate.jp +yamada.iwate.jp +ayagawa.kagawa.jp +higashikagawa.kagawa.jp +kanonji.kagawa.jp +kotohira.kagawa.jp +manno.kagawa.jp +marugame.kagawa.jp +mitoyo.kagawa.jp +naoshima.kagawa.jp +sanuki.kagawa.jp +tadotsu.kagawa.jp +takamatsu.kagawa.jp +tonosho.kagawa.jp +uchinomi.kagawa.jp +utazu.kagawa.jp +zentsuji.kagawa.jp +akune.kagoshima.jp +amami.kagoshima.jp +hioki.kagoshima.jp +isa.kagoshima.jp +isen.kagoshima.jp +izumi.kagoshima.jp +kagoshima.kagoshima.jp +kanoya.kagoshima.jp +kawanabe.kagoshima.jp +kinko.kagoshima.jp +kouyama.kagoshima.jp +makurazaki.kagoshima.jp +matsumoto.kagoshima.jp +minamitane.kagoshima.jp +nakatane.kagoshima.jp +nishinoomote.kagoshima.jp +satsumasendai.kagoshima.jp +soo.kagoshima.jp +tarumizu.kagoshima.jp +yusui.kagoshima.jp +aikawa.kanagawa.jp +atsugi.kanagawa.jp +ayase.kanagawa.jp +chigasaki.kanagawa.jp +ebina.kanagawa.jp +fujisawa.kanagawa.jp +hadano.kanagawa.jp +hakone.kanagawa.jp +hiratsuka.kanagawa.jp +isehara.kanagawa.jp +kaisei.kanagawa.jp +kamakura.kanagawa.jp +kiyokawa.kanagawa.jp +matsuda.kanagawa.jp +minamiashigara.kanagawa.jp +miura.kanagawa.jp +nakai.kanagawa.jp +ninomiya.kanagawa.jp +odawara.kanagawa.jp +oi.kanagawa.jp +oiso.kanagawa.jp +sagamihara.kanagawa.jp +samukawa.kanagawa.jp +tsukui.kanagawa.jp +yamakita.kanagawa.jp +yamato.kanagawa.jp +yokosuka.kanagawa.jp +yugawara.kanagawa.jp +zama.kanagawa.jp +zushi.kanagawa.jp +aki.kochi.jp +geisei.kochi.jp +hidaka.kochi.jp +higashitsuno.kochi.jp +ino.kochi.jp +kagami.kochi.jp +kami.kochi.jp +kitagawa.kochi.jp +kochi.kochi.jp +mihara.kochi.jp +motoyama.kochi.jp +muroto.kochi.jp +nahari.kochi.jp +nakamura.kochi.jp +nankoku.kochi.jp +nishitosa.kochi.jp +niyodogawa.kochi.jp +ochi.kochi.jp +okawa.kochi.jp +otoyo.kochi.jp +otsuki.kochi.jp +sakawa.kochi.jp +sukumo.kochi.jp +susaki.kochi.jp +tosa.kochi.jp +tosashimizu.kochi.jp +toyo.kochi.jp +tsuno.kochi.jp +umaji.kochi.jp +yasuda.kochi.jp +yusuhara.kochi.jp +amakusa.kumamoto.jp +arao.kumamoto.jp +aso.kumamoto.jp +choyo.kumamoto.jp +gyokuto.kumamoto.jp +hitoyoshi.kumamoto.jp +kamiamakusa.kumamoto.jp +kashima.kumamoto.jp +kikuchi.kumamoto.jp +kosa.kumamoto.jp +kumamoto.kumamoto.jp +mashiki.kumamoto.jp +mifune.kumamoto.jp +minamata.kumamoto.jp +minamioguni.kumamoto.jp +nagasu.kumamoto.jp +nishihara.kumamoto.jp +oguni.kumamoto.jp +ozu.kumamoto.jp +sumoto.kumamoto.jp +takamori.kumamoto.jp +uki.kumamoto.jp +uto.kumamoto.jp +yamaga.kumamoto.jp +yamato.kumamoto.jp +yatsushiro.kumamoto.jp +ayabe.kyoto.jp +fukuchiyama.kyoto.jp +higashiyama.kyoto.jp +ide.kyoto.jp +ine.kyoto.jp +joyo.kyoto.jp +kameoka.kyoto.jp +kamo.kyoto.jp +kita.kyoto.jp +kizu.kyoto.jp +kumiyama.kyoto.jp +kyotamba.kyoto.jp +kyotanabe.kyoto.jp +kyotango.kyoto.jp +maizuru.kyoto.jp +minami.kyoto.jp +minamiyamashiro.kyoto.jp +miyazu.kyoto.jp +muko.kyoto.jp +nagaokakyo.kyoto.jp +nakagyo.kyoto.jp +nantan.kyoto.jp +oyamazaki.kyoto.jp +sakyo.kyoto.jp +seika.kyoto.jp +tanabe.kyoto.jp +uji.kyoto.jp +ujitawara.kyoto.jp +wazuka.kyoto.jp +yamashina.kyoto.jp +yawata.kyoto.jp +asahi.mie.jp +inabe.mie.jp +ise.mie.jp +kameyama.mie.jp +kawagoe.mie.jp +kiho.mie.jp +kisosaki.mie.jp +kiwa.mie.jp +komono.mie.jp +kumano.mie.jp +kuwana.mie.jp +matsusaka.mie.jp +meiwa.mie.jp +mihama.mie.jp +minamiise.mie.jp +misugi.mie.jp +miyama.mie.jp +nabari.mie.jp +shima.mie.jp +suzuka.mie.jp +tado.mie.jp +taiki.mie.jp +taki.mie.jp +tamaki.mie.jp +toba.mie.jp +tsu.mie.jp +udono.mie.jp +ureshino.mie.jp +watarai.mie.jp +yokkaichi.mie.jp +furukawa.miyagi.jp +higashimatsushima.miyagi.jp +ishinomaki.miyagi.jp +iwanuma.miyagi.jp +kakuda.miyagi.jp +kami.miyagi.jp +kawasaki.miyagi.jp +kesennuma.miyagi.jp +marumori.miyagi.jp +matsushima.miyagi.jp +minamisanriku.miyagi.jp +misato.miyagi.jp +murata.miyagi.jp +natori.miyagi.jp +ogawara.miyagi.jp +ohira.miyagi.jp +onagawa.miyagi.jp +osaki.miyagi.jp +rifu.miyagi.jp +semine.miyagi.jp +shibata.miyagi.jp +shichikashuku.miyagi.jp +shikama.miyagi.jp +shiogama.miyagi.jp +shiroishi.miyagi.jp +tagajo.miyagi.jp +taiwa.miyagi.jp +tome.miyagi.jp +tomiya.miyagi.jp +wakuya.miyagi.jp +watari.miyagi.jp +yamamoto.miyagi.jp +zao.miyagi.jp +aya.miyazaki.jp +ebino.miyazaki.jp +gokase.miyazaki.jp +hyuga.miyazaki.jp +kadogawa.miyazaki.jp +kawaminami.miyazaki.jp +kijo.miyazaki.jp +kitagawa.miyazaki.jp +kitakata.miyazaki.jp +kitaura.miyazaki.jp +kobayashi.miyazaki.jp +kunitomi.miyazaki.jp +kushima.miyazaki.jp +mimata.miyazaki.jp +miyakonojo.miyazaki.jp +miyazaki.miyazaki.jp +morotsuka.miyazaki.jp +nichinan.miyazaki.jp +nishimera.miyazaki.jp +nobeoka.miyazaki.jp +saito.miyazaki.jp +shiiba.miyazaki.jp +shintomi.miyazaki.jp +takaharu.miyazaki.jp +takanabe.miyazaki.jp +takazaki.miyazaki.jp +tsuno.miyazaki.jp +achi.nagano.jp +agematsu.nagano.jp +anan.nagano.jp +aoki.nagano.jp +asahi.nagano.jp +azumino.nagano.jp +chikuhoku.nagano.jp +chikuma.nagano.jp +chino.nagano.jp +fujimi.nagano.jp +hakuba.nagano.jp +hara.nagano.jp +hiraya.nagano.jp +iida.nagano.jp +iijima.nagano.jp +iiyama.nagano.jp +iizuna.nagano.jp +ikeda.nagano.jp +ikusaka.nagano.jp +ina.nagano.jp +karuizawa.nagano.jp +kawakami.nagano.jp +kiso.nagano.jp +kisofukushima.nagano.jp +kitaaiki.nagano.jp +komagane.nagano.jp +komoro.nagano.jp +matsukawa.nagano.jp +matsumoto.nagano.jp +miasa.nagano.jp +minamiaiki.nagano.jp +minamimaki.nagano.jp +minamiminowa.nagano.jp +minowa.nagano.jp +miyada.nagano.jp +miyota.nagano.jp +mochizuki.nagano.jp +nagano.nagano.jp +nagawa.nagano.jp +nagiso.nagano.jp +nakagawa.nagano.jp +nakano.nagano.jp +nozawaonsen.nagano.jp +obuse.nagano.jp +ogawa.nagano.jp +okaya.nagano.jp +omachi.nagano.jp +omi.nagano.jp +ookuwa.nagano.jp +ooshika.nagano.jp +otaki.nagano.jp +otari.nagano.jp +sakae.nagano.jp +sakaki.nagano.jp +saku.nagano.jp +sakuho.nagano.jp +shimosuwa.nagano.jp +shinanomachi.nagano.jp +shiojiri.nagano.jp +suwa.nagano.jp +suzaka.nagano.jp +takagi.nagano.jp +takamori.nagano.jp +takayama.nagano.jp +tateshina.nagano.jp +tatsuno.nagano.jp +togakushi.nagano.jp +togura.nagano.jp +tomi.nagano.jp +ueda.nagano.jp +wada.nagano.jp +yamagata.nagano.jp +yamanouchi.nagano.jp +yasaka.nagano.jp +yasuoka.nagano.jp +chijiwa.nagasaki.jp +futsu.nagasaki.jp +goto.nagasaki.jp +hasami.nagasaki.jp +hirado.nagasaki.jp +iki.nagasaki.jp +isahaya.nagasaki.jp +kawatana.nagasaki.jp +kuchinotsu.nagasaki.jp +matsuura.nagasaki.jp +nagasaki.nagasaki.jp +obama.nagasaki.jp +omura.nagasaki.jp +oseto.nagasaki.jp +saikai.nagasaki.jp +sasebo.nagasaki.jp +seihi.nagasaki.jp +shimabara.nagasaki.jp +shinkamigoto.nagasaki.jp +togitsu.nagasaki.jp +tsushima.nagasaki.jp +unzen.nagasaki.jp +ando.nara.jp +gose.nara.jp +heguri.nara.jp +higashiyoshino.nara.jp +ikaruga.nara.jp +ikoma.nara.jp +kamikitayama.nara.jp +kanmaki.nara.jp +kashiba.nara.jp +kashihara.nara.jp +katsuragi.nara.jp +kawai.nara.jp +kawakami.nara.jp +kawanishi.nara.jp +koryo.nara.jp +kurotaki.nara.jp +mitsue.nara.jp +miyake.nara.jp +nara.nara.jp +nosegawa.nara.jp +oji.nara.jp +ouda.nara.jp +oyodo.nara.jp +sakurai.nara.jp +sango.nara.jp +shimoichi.nara.jp +shimokitayama.nara.jp +shinjo.nara.jp +soni.nara.jp +takatori.nara.jp +tawaramoto.nara.jp +tenkawa.nara.jp +tenri.nara.jp +uda.nara.jp +yamatokoriyama.nara.jp +yamatotakada.nara.jp +yamazoe.nara.jp +yoshino.nara.jp +aga.niigata.jp +agano.niigata.jp +gosen.niigata.jp +itoigawa.niigata.jp +izumozaki.niigata.jp +joetsu.niigata.jp +kamo.niigata.jp +kariwa.niigata.jp +kashiwazaki.niigata.jp +minamiuonuma.niigata.jp +mitsuke.niigata.jp +muika.niigata.jp +murakami.niigata.jp +myoko.niigata.jp +nagaoka.niigata.jp +niigata.niigata.jp +ojiya.niigata.jp +omi.niigata.jp +sado.niigata.jp +sanjo.niigata.jp +seiro.niigata.jp +seirou.niigata.jp +sekikawa.niigata.jp +shibata.niigata.jp +tagami.niigata.jp +tainai.niigata.jp +tochio.niigata.jp +tokamachi.niigata.jp +tsubame.niigata.jp +tsunan.niigata.jp +uonuma.niigata.jp +yahiko.niigata.jp +yoita.niigata.jp +yuzawa.niigata.jp +beppu.oita.jp +bungoono.oita.jp +bungotakada.oita.jp +hasama.oita.jp +hiji.oita.jp +himeshima.oita.jp +hita.oita.jp +kamitsue.oita.jp +kokonoe.oita.jp +kuju.oita.jp +kunisaki.oita.jp +kusu.oita.jp +oita.oita.jp +saiki.oita.jp +taketa.oita.jp +tsukumi.oita.jp +usa.oita.jp +usuki.oita.jp +yufu.oita.jp +akaiwa.okayama.jp +asakuchi.okayama.jp +bizen.okayama.jp +hayashima.okayama.jp +ibara.okayama.jp +kagamino.okayama.jp +kasaoka.okayama.jp +kibichuo.okayama.jp +kumenan.okayama.jp +kurashiki.okayama.jp +maniwa.okayama.jp +misaki.okayama.jp +nagi.okayama.jp +niimi.okayama.jp +nishiawakura.okayama.jp +okayama.okayama.jp +satosho.okayama.jp +setouchi.okayama.jp +shinjo.okayama.jp +shoo.okayama.jp +soja.okayama.jp +takahashi.okayama.jp +tamano.okayama.jp +tsuyama.okayama.jp +wake.okayama.jp +yakage.okayama.jp +aguni.okinawa.jp +ginowan.okinawa.jp +ginoza.okinawa.jp +gushikami.okinawa.jp +haebaru.okinawa.jp +higashi.okinawa.jp +hirara.okinawa.jp +iheya.okinawa.jp +ishigaki.okinawa.jp +ishikawa.okinawa.jp +itoman.okinawa.jp +izena.okinawa.jp +kadena.okinawa.jp +kin.okinawa.jp +kitadaito.okinawa.jp +kitanakagusuku.okinawa.jp +kumejima.okinawa.jp +kunigami.okinawa.jp +minamidaito.okinawa.jp +motobu.okinawa.jp +nago.okinawa.jp +naha.okinawa.jp +nakagusuku.okinawa.jp +nakijin.okinawa.jp +nanjo.okinawa.jp +nishihara.okinawa.jp +ogimi.okinawa.jp +okinawa.okinawa.jp +onna.okinawa.jp +shimoji.okinawa.jp +taketomi.okinawa.jp +tarama.okinawa.jp +tokashiki.okinawa.jp +tomigusuku.okinawa.jp +tonaki.okinawa.jp +urasoe.okinawa.jp +uruma.okinawa.jp +yaese.okinawa.jp +yomitan.okinawa.jp +yonabaru.okinawa.jp +yonaguni.okinawa.jp +zamami.okinawa.jp +abeno.osaka.jp +chihayaakasaka.osaka.jp +chuo.osaka.jp +daito.osaka.jp +fujiidera.osaka.jp +habikino.osaka.jp +hannan.osaka.jp +higashiosaka.osaka.jp +higashisumiyoshi.osaka.jp +higashiyodogawa.osaka.jp +hirakata.osaka.jp +ibaraki.osaka.jp +ikeda.osaka.jp +izumi.osaka.jp +izumiotsu.osaka.jp +izumisano.osaka.jp +kadoma.osaka.jp +kaizuka.osaka.jp +kanan.osaka.jp +kashiwara.osaka.jp +katano.osaka.jp +kawachinagano.osaka.jp +kishiwada.osaka.jp +kita.osaka.jp +kumatori.osaka.jp +matsubara.osaka.jp +minato.osaka.jp +minoh.osaka.jp +misaki.osaka.jp +moriguchi.osaka.jp +neyagawa.osaka.jp +nishi.osaka.jp +nose.osaka.jp +osakasayama.osaka.jp +sakai.osaka.jp +sayama.osaka.jp +sennan.osaka.jp +settsu.osaka.jp +shijonawate.osaka.jp +shimamoto.osaka.jp +suita.osaka.jp +tadaoka.osaka.jp +taishi.osaka.jp +tajiri.osaka.jp +takaishi.osaka.jp +takatsuki.osaka.jp +tondabayashi.osaka.jp +toyonaka.osaka.jp +toyono.osaka.jp +yao.osaka.jp +ariake.saga.jp +arita.saga.jp +fukudomi.saga.jp +genkai.saga.jp +hamatama.saga.jp +hizen.saga.jp +imari.saga.jp +kamimine.saga.jp +kanzaki.saga.jp +karatsu.saga.jp +kashima.saga.jp +kitagata.saga.jp +kitahata.saga.jp +kiyama.saga.jp +kouhoku.saga.jp +kyuragi.saga.jp +nishiarita.saga.jp +ogi.saga.jp +omachi.saga.jp +ouchi.saga.jp +saga.saga.jp +shiroishi.saga.jp +taku.saga.jp +tara.saga.jp +tosu.saga.jp +yoshinogari.saga.jp +arakawa.saitama.jp +asaka.saitama.jp +chichibu.saitama.jp +fujimi.saitama.jp +fujimino.saitama.jp +fukaya.saitama.jp +hanno.saitama.jp +hanyu.saitama.jp +hasuda.saitama.jp +hatogaya.saitama.jp +hatoyama.saitama.jp +hidaka.saitama.jp +higashichichibu.saitama.jp +higashimatsuyama.saitama.jp +honjo.saitama.jp +ina.saitama.jp +iruma.saitama.jp +iwatsuki.saitama.jp +kamiizumi.saitama.jp +kamikawa.saitama.jp +kamisato.saitama.jp +kasukabe.saitama.jp +kawagoe.saitama.jp +kawaguchi.saitama.jp +kawajima.saitama.jp +kazo.saitama.jp +kitamoto.saitama.jp +koshigaya.saitama.jp +kounosu.saitama.jp +kuki.saitama.jp +kumagaya.saitama.jp +matsubushi.saitama.jp +minano.saitama.jp +misato.saitama.jp +miyashiro.saitama.jp +miyoshi.saitama.jp +moroyama.saitama.jp +nagatoro.saitama.jp +namegawa.saitama.jp +niiza.saitama.jp +ogano.saitama.jp +ogawa.saitama.jp +ogose.saitama.jp +okegawa.saitama.jp +omiya.saitama.jp +otaki.saitama.jp +ranzan.saitama.jp +ryokami.saitama.jp +saitama.saitama.jp +sakado.saitama.jp +satte.saitama.jp +sayama.saitama.jp +shiki.saitama.jp +shiraoka.saitama.jp +soka.saitama.jp +sugito.saitama.jp +toda.saitama.jp +tokigawa.saitama.jp +tokorozawa.saitama.jp +tsurugashima.saitama.jp +urawa.saitama.jp +warabi.saitama.jp +yashio.saitama.jp +yokoze.saitama.jp +yono.saitama.jp +yorii.saitama.jp +yoshida.saitama.jp +yoshikawa.saitama.jp +yoshimi.saitama.jp +aisho.shiga.jp +gamo.shiga.jp +higashiomi.shiga.jp +hikone.shiga.jp +koka.shiga.jp +konan.shiga.jp +kosei.shiga.jp +koto.shiga.jp +kusatsu.shiga.jp +maibara.shiga.jp +moriyama.shiga.jp +nagahama.shiga.jp +nishiazai.shiga.jp +notogawa.shiga.jp +omihachiman.shiga.jp +otsu.shiga.jp +ritto.shiga.jp +ryuoh.shiga.jp +takashima.shiga.jp +takatsuki.shiga.jp +torahime.shiga.jp +toyosato.shiga.jp +yasu.shiga.jp +akagi.shimane.jp +ama.shimane.jp +gotsu.shimane.jp +hamada.shimane.jp +higashiizumo.shimane.jp +hikawa.shimane.jp +hikimi.shimane.jp +izumo.shimane.jp +kakinoki.shimane.jp +masuda.shimane.jp +matsue.shimane.jp +misato.shimane.jp +nishinoshima.shimane.jp +ohda.shimane.jp +okinoshima.shimane.jp +okuizumo.shimane.jp +shimane.shimane.jp +tamayu.shimane.jp +tsuwano.shimane.jp +unnan.shimane.jp +yakumo.shimane.jp +yasugi.shimane.jp +yatsuka.shimane.jp +arai.shizuoka.jp +atami.shizuoka.jp +fuji.shizuoka.jp +fujieda.shizuoka.jp +fujikawa.shizuoka.jp +fujinomiya.shizuoka.jp +fukuroi.shizuoka.jp +gotemba.shizuoka.jp +haibara.shizuoka.jp +hamamatsu.shizuoka.jp +higashiizu.shizuoka.jp +ito.shizuoka.jp +iwata.shizuoka.jp +izu.shizuoka.jp +izunokuni.shizuoka.jp +kakegawa.shizuoka.jp +kannami.shizuoka.jp +kawanehon.shizuoka.jp +kawazu.shizuoka.jp +kikugawa.shizuoka.jp +kosai.shizuoka.jp +makinohara.shizuoka.jp +matsuzaki.shizuoka.jp +minamiizu.shizuoka.jp +mishima.shizuoka.jp +morimachi.shizuoka.jp +nishiizu.shizuoka.jp +numazu.shizuoka.jp +omaezaki.shizuoka.jp +shimada.shizuoka.jp +shimizu.shizuoka.jp +shimoda.shizuoka.jp +shizuoka.shizuoka.jp +susono.shizuoka.jp +yaizu.shizuoka.jp +yoshida.shizuoka.jp +ashikaga.tochigi.jp +bato.tochigi.jp +haga.tochigi.jp +ichikai.tochigi.jp +iwafune.tochigi.jp +kaminokawa.tochigi.jp +kanuma.tochigi.jp +karasuyama.tochigi.jp +kuroiso.tochigi.jp +mashiko.tochigi.jp +mibu.tochigi.jp +moka.tochigi.jp +motegi.tochigi.jp +nasu.tochigi.jp +nasushiobara.tochigi.jp +nikko.tochigi.jp +nishikata.tochigi.jp +nogi.tochigi.jp +ohira.tochigi.jp +ohtawara.tochigi.jp +oyama.tochigi.jp +sakura.tochigi.jp +sano.tochigi.jp +shimotsuke.tochigi.jp +shioya.tochigi.jp +takanezawa.tochigi.jp +tochigi.tochigi.jp +tsuga.tochigi.jp +ujiie.tochigi.jp +utsunomiya.tochigi.jp +yaita.tochigi.jp +aizumi.tokushima.jp +anan.tokushima.jp +ichiba.tokushima.jp +itano.tokushima.jp +kainan.tokushima.jp +komatsushima.tokushima.jp +matsushige.tokushima.jp +mima.tokushima.jp +minami.tokushima.jp +miyoshi.tokushima.jp +mugi.tokushima.jp +nakagawa.tokushima.jp +naruto.tokushima.jp +sanagochi.tokushima.jp +shishikui.tokushima.jp +tokushima.tokushima.jp +wajiki.tokushima.jp +adachi.tokyo.jp +akiruno.tokyo.jp +akishima.tokyo.jp +aogashima.tokyo.jp +arakawa.tokyo.jp +bunkyo.tokyo.jp +chiyoda.tokyo.jp +chofu.tokyo.jp +chuo.tokyo.jp +edogawa.tokyo.jp +fuchu.tokyo.jp +fussa.tokyo.jp +hachijo.tokyo.jp +hachioji.tokyo.jp +hamura.tokyo.jp +higashikurume.tokyo.jp +higashimurayama.tokyo.jp +higashiyamato.tokyo.jp +hino.tokyo.jp +hinode.tokyo.jp +hinohara.tokyo.jp +inagi.tokyo.jp +itabashi.tokyo.jp +katsushika.tokyo.jp +kita.tokyo.jp +kiyose.tokyo.jp +kodaira.tokyo.jp +koganei.tokyo.jp +kokubunji.tokyo.jp +komae.tokyo.jp +koto.tokyo.jp +kouzushima.tokyo.jp +kunitachi.tokyo.jp +machida.tokyo.jp +meguro.tokyo.jp +minato.tokyo.jp +mitaka.tokyo.jp +mizuho.tokyo.jp +musashimurayama.tokyo.jp +musashino.tokyo.jp +nakano.tokyo.jp +nerima.tokyo.jp +ogasawara.tokyo.jp +okutama.tokyo.jp +ome.tokyo.jp +oshima.tokyo.jp +ota.tokyo.jp +setagaya.tokyo.jp +shibuya.tokyo.jp +shinagawa.tokyo.jp +shinjuku.tokyo.jp +suginami.tokyo.jp +sumida.tokyo.jp +tachikawa.tokyo.jp +taito.tokyo.jp +tama.tokyo.jp +toshima.tokyo.jp +chizu.tottori.jp +hino.tottori.jp +kawahara.tottori.jp +koge.tottori.jp +kotoura.tottori.jp +misasa.tottori.jp +nanbu.tottori.jp +nichinan.tottori.jp +sakaiminato.tottori.jp +tottori.tottori.jp +wakasa.tottori.jp +yazu.tottori.jp +yonago.tottori.jp +asahi.toyama.jp +fuchu.toyama.jp +fukumitsu.toyama.jp +funahashi.toyama.jp +himi.toyama.jp +imizu.toyama.jp +inami.toyama.jp +johana.toyama.jp +kamiichi.toyama.jp +kurobe.toyama.jp +nakaniikawa.toyama.jp +namerikawa.toyama.jp +nanto.toyama.jp +nyuzen.toyama.jp +oyabe.toyama.jp +taira.toyama.jp +takaoka.toyama.jp +tateyama.toyama.jp +toga.toyama.jp +tonami.toyama.jp +toyama.toyama.jp +unazuki.toyama.jp +uozu.toyama.jp +yamada.toyama.jp +arida.wakayama.jp +aridagawa.wakayama.jp +gobo.wakayama.jp +hashimoto.wakayama.jp +hidaka.wakayama.jp +hirogawa.wakayama.jp +inami.wakayama.jp +iwade.wakayama.jp +kainan.wakayama.jp +kamitonda.wakayama.jp +katsuragi.wakayama.jp +kimino.wakayama.jp +kinokawa.wakayama.jp +kitayama.wakayama.jp +koya.wakayama.jp +koza.wakayama.jp +kozagawa.wakayama.jp +kudoyama.wakayama.jp +kushimoto.wakayama.jp +mihama.wakayama.jp +misato.wakayama.jp +nachikatsuura.wakayama.jp +shingu.wakayama.jp +shirahama.wakayama.jp +taiji.wakayama.jp +tanabe.wakayama.jp +wakayama.wakayama.jp +yuasa.wakayama.jp +yura.wakayama.jp +asahi.yamagata.jp +funagata.yamagata.jp +higashine.yamagata.jp +iide.yamagata.jp +kahoku.yamagata.jp +kaminoyama.yamagata.jp +kaneyama.yamagata.jp +kawanishi.yamagata.jp +mamurogawa.yamagata.jp +mikawa.yamagata.jp +murayama.yamagata.jp +nagai.yamagata.jp +nakayama.yamagata.jp +nanyo.yamagata.jp +nishikawa.yamagata.jp +obanazawa.yamagata.jp +oe.yamagata.jp +oguni.yamagata.jp +ohkura.yamagata.jp +oishida.yamagata.jp +sagae.yamagata.jp +sakata.yamagata.jp +sakegawa.yamagata.jp +shinjo.yamagata.jp +shirataka.yamagata.jp +shonai.yamagata.jp +takahata.yamagata.jp +tendo.yamagata.jp +tozawa.yamagata.jp +tsuruoka.yamagata.jp +yamagata.yamagata.jp +yamanobe.yamagata.jp +yonezawa.yamagata.jp +yuza.yamagata.jp +abu.yamaguchi.jp +hagi.yamaguchi.jp +hikari.yamaguchi.jp +hofu.yamaguchi.jp +iwakuni.yamaguchi.jp +kudamatsu.yamaguchi.jp +mitou.yamaguchi.jp +nagato.yamaguchi.jp +oshima.yamaguchi.jp +shimonoseki.yamaguchi.jp +shunan.yamaguchi.jp +tabuse.yamaguchi.jp +tokuyama.yamaguchi.jp +toyota.yamaguchi.jp +ube.yamaguchi.jp +yuu.yamaguchi.jp +chuo.yamanashi.jp +doshi.yamanashi.jp +fuefuki.yamanashi.jp +fujikawa.yamanashi.jp +fujikawaguchiko.yamanashi.jp +fujiyoshida.yamanashi.jp +hayakawa.yamanashi.jp +hokuto.yamanashi.jp +ichikawamisato.yamanashi.jp +kai.yamanashi.jp +kofu.yamanashi.jp +koshu.yamanashi.jp +kosuge.yamanashi.jp +minami-alps.yamanashi.jp +minobu.yamanashi.jp +nakamichi.yamanashi.jp +nanbu.yamanashi.jp +narusawa.yamanashi.jp +nirasaki.yamanashi.jp +nishikatsura.yamanashi.jp +oshino.yamanashi.jp +otsuki.yamanashi.jp +showa.yamanashi.jp +tabayama.yamanashi.jp +tsuru.yamanashi.jp +uenohara.yamanashi.jp +yamanakako.yamanashi.jp +yamanashi.yamanashi.jp + +// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 +*.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : http://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// http://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : http://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kp : http://www.kcce.kp/en_index.php +kp +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp + +// kr : http://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : http://en.wikipedia.org/wiki/.kw +*.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17 +ky +edu.ky +gov.ky +com.ky +org.ky +net.ky + +// kz : http://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : http://en.wikipedia.org/wiki/.la +// Submitted by registry <gavin.brown@nic.la> 2008-06-10 +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la + +// lb : http://en.wikipedia.org/wiki/.lb +// Submitted by registry <randy@psg.com> 2008-06-17 +lb +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : http://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : http://en.wikipedia.org/wiki/.li +li + +// lk : http://www.nic.lk/seclevpr.html +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk +ac.lk + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry <randy@psg.com> 2008-06-17 +lr +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : http://en.wikipedia.org/wiki/.ls +ls +co.ls +org.ls + +// lt : http://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : http://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : http://en.wikipedia.org/wiki/.md +md + +// me : http://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://www.nic.mg/tarif.htm +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg + +// mh : http://en.wikipedia.org/wiki/.mh +mh + +// mil : http://en.wikipedia.org/wiki/.mil +mil + +// mk : http://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: http://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : http://en.wikipedia.org/wiki/.mm +*.mm + +// mn : http://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : http://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry <dcamacho@saipan.com> 2008-06-17 +mp + +// mq : http://en.wikipedia.org/wiki/.mq +mq + +// mr : http://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf +ms +com.ms +edu.ms +gov.ms +net.ms +org.ms + +// mt : https://www.nic.org.mt/go/policy +// Submitted by registry <help@nic.org.mt> 2013-11-19 +mt +com.mt +edu.mt +net.mt +org.mt + +// mu : http://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nuernberg.museum +nuremberg.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלים.museum +иком.museum + +// mv : http://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry <farias@nic.mx> 2008-06-19 +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.net.my/ +my +com.my +net.my +org.my +gov.my +edu.my +mil.my +name.my + +// mz : http://www.gobin.info/domainname/mz-template.doc +*.mz +!teledata.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc + +// ne : http://en.wikipedia.org/wiki/.ne +ne + +// net : http://en.wikipedia.org/wiki/.net +net + +// nf : http://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://psg.com/dns/ng/ +ng +com.ng +edu.ng +name.ng +net.ng +org.ng +sch.ng +gov.ng +mil.ng +mobi.ng + +// ni : http://www.nic.ni/dominios.htm +*.ni + +// nl : http://en.wikipedia.org/wiki/.nl +// https://www.sidn.nl/ +// ccTLD for the Netherlands +nl + +// BV.nl will be a registry for dutch BV's (besloten vennootschap) +bv.nl + +// no : http://www.norid.no/regelverk/index.en.html +// The Norwegian registry has declined to notify us of updates. The web pages +// referenced below are the official source of the data. There is also an +// announce mailing list: +// https://postlister.uninett.no/sympa/info/norid-diskusjon +no +// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +mil.no +stat.no +dep.no +kommune.no +herad.no +// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +åkrehamn.no +algard.no +ålgård.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevåg.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +råholt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +åfjord.no +agdenes.no +al.no +ål.no +alesund.no +ålesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +åmli.no +amot.no +åmot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +årdal.no +aremark.no +arendal.no +ås.no +aseral.no +åseral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +åsnes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevåg.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bådåddjå.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +båtsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flå.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskål.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +kråanghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákŋoluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtålen.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hå.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kåfjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaŋgaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindås.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +måsøy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +meråker.no +moareke.no +moåreke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +målselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegård.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +råde.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjåk.no +skodje.no +skanland.no +skånland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snåsa.no +snoasa.no +snaase.no +snåase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +čáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegårshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvågøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vågan.no +voagat.no +vagsoy.no +vågsøy.no +vaga.no +vågå.no +valer.ostfold.no +våler.østfold.no +valer.hedmark.no +våler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Confirmed by registry <technician@cenpac.net.nr> 2008-06-17 +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : http://en.wikipedia.org/wiki/.nu +nu + +// nz : http://en.wikipedia.org/wiki/.nz +// Confirmed by registry <jay@nzrs.net.nz> 2014-05-19 +nz +ac.nz +co.nz +cri.nz +geek.nz +gen.nz +govt.nz +health.nz +iwi.nz +kiwi.nz +maori.nz +mil.nz +māori.nz +net.nz +org.nz +parliament.nz +school.nz + +// om : http://en.wikipedia.org/wiki/.om +om +co.om +com.om +edu.om +gov.om +med.om +museum.om +net.om +org.om +pro.om + +// org : http://en.wikipedia.org/wiki/.org +org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : http://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry <jed@email.com.ph> 2008-06-13 +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl http://www.dns.pl/english/index.html +// updated by .PL registry on 2015-04-28 +pl +com.pl +net.pl +org.pl +// pl functional domains (http://www.dns.pl/english/index.html) +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +nieruchomosci.pl +nom.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// Government domains +gov.pl +ap.gov.pl +ic.gov.pl +is.gov.pl +us.gov.pl +kmpsp.gov.pl +kppsp.gov.pl +kwpsp.gov.pl +psp.gov.pl +wskr.gov.pl +kwp.gov.pl +mw.gov.pl +ug.gov.pl +um.gov.pl +umig.gov.pl +ugim.gov.pl +upow.gov.pl +uw.gov.pl +starostwo.gov.pl +pa.gov.pl +po.gov.pl +psse.gov.pl +pup.gov.pl +rzgw.gov.pl +sa.gov.pl +so.gov.pl +sr.gov.pl +wsa.gov.pl +sko.gov.pl +uzs.gov.pl +wiih.gov.pl +winb.gov.pl +pinb.gov.pl +wios.gov.pl +witd.gov.pl +wzmiuw.gov.pl +piw.gov.pl +wiw.gov.pl +griw.gov.pl +wif.gov.pl +oum.gov.pl +sdn.gov.pl +zp.gov.pl +uppo.gov.pl +mup.gov.pl +wuoz.gov.pl +konsulat.gov.pl +oirm.gov.pl +// pl regional domains (http://www.dns.pl/english/index.html) +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl + +// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +pm + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// post : http://en.wikipedia.org/wiki/.post +post + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on http://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://www.nic.pro/support_faq.htm +pro +aca.pro +bar.pro +cpa.pro +jur.pro +law.pro +med.pro +eng.pro + +// ps : http://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : http://online.dns.pt/dns/start_dns +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : http://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/pautas.html#seccion_9 +// Confirmed by registry 2012-10-03 +py +com.py +coop.py +edu.py +gov.py +mil.py +net.py +org.py + +// qa : http://domains.qa/en/ +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +com.re +asso.re +nom.re + +// ro : http://www.rotld.ro/ +ro +com.ro +org.ro +tm.ro +nt.ro +nom.ro +info.ro +rec.ro +arts.ro +firm.ro +store.ro +www.ro + +// rs : http://en.wikipedia.org/wiki/.rs +rs +co.rs +org.rs +edu.rs +ac.rs +gov.rs +in.rs + +// ru : http://www.cctld.ru/ru/docs/aktiv_8.php +// Industry domains +ru +ac.ru +com.ru +edu.ru +int.ru +net.ru +org.ru +pp.ru +// Geographical domains +adygeya.ru +altai.ru +amur.ru +arkhangelsk.ru +astrakhan.ru +bashkiria.ru +belgorod.ru +bir.ru +bryansk.ru +buryatia.ru +cbg.ru +chel.ru +chelyabinsk.ru +chita.ru +chukotka.ru +chuvashia.ru +dagestan.ru +dudinka.ru +e-burg.ru +grozny.ru +irkutsk.ru +ivanovo.ru +izhevsk.ru +jar.ru +joshkar-ola.ru +kalmykia.ru +kaluga.ru +kamchatka.ru +karelia.ru +kazan.ru +kchr.ru +kemerovo.ru +khabarovsk.ru +khakassia.ru +khv.ru +kirov.ru +koenig.ru +komi.ru +kostroma.ru +krasnoyarsk.ru +kuban.ru +kurgan.ru +kursk.ru +lipetsk.ru +magadan.ru +mari.ru +mari-el.ru +marine.ru +mordovia.ru +// mosreg.ru Bug 1090800 - removed at request of Aleksey Konstantinov <konstantinovav@mosreg.ru> +msk.ru +murmansk.ru +nalchik.ru +nnov.ru +nov.ru +novosibirsk.ru +nsk.ru +omsk.ru +orenburg.ru +oryol.ru +palana.ru +penza.ru +perm.ru +ptz.ru +rnd.ru +ryazan.ru +sakhalin.ru +samara.ru +saratov.ru +simbirsk.ru +smolensk.ru +spb.ru +stavropol.ru +stv.ru +surgut.ru +tambov.ru +tatarstan.ru +tom.ru +tomsk.ru +tsaritsyn.ru +tsk.ru +tula.ru +tuva.ru +tver.ru +tyumen.ru +udm.ru +udmurtia.ru +ulan-ude.ru +vladikavkaz.ru +vladimir.ru +vladivostok.ru +volgograd.ru +vologda.ru +voronezh.ru +vrn.ru +vyatka.ru +yakutia.ru +yamal.ru +yaroslavl.ru +yekaterinburg.ru +yuzhno-sakhalinsk.ru +// More geographical domains +amursk.ru +baikal.ru +cmw.ru +fareast.ru +jamal.ru +kms.ru +k-uralsk.ru +kustanai.ru +kuzbass.ru +magnitka.ru +mytis.ru +nakhodka.ru +nkz.ru +norilsk.ru +oskol.ru +pyatigorsk.ru +rubtsovsk.ru +snz.ru +syzran.ru +vdonsk.ru +zgrad.ru +// State domains +gov.ru +mil.ru +// Technical domains +test.ru + +// rw : http://www.nic.rw/cgi-bin/policy.pl +rw +gov.rw +net.rw +edu.rw +ac.rw +com.rw +co.rw +int.rw +mil.rw +gouv.rw + +// sa : http://www.nic.net.sa/ +sa +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry <lee.humphries@telekom.com.sb> 2008-06-08 +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry <admin@isoc.sd> 2008-06-17 +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +tv.sd +gov.sd +info.sd + +// se : http://en.wikipedia.org/wiki/.se +// Submitted by registry <patrik.wallstrom@iis.se> 2014-03-18 +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://www.nic.sh/registrar.html +sh +com.sh +net.sh +gov.sh +org.sh +mil.sh + +// si : http://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry <jarle@uninett.no> 2008-06-16 +sj + +// sk : http://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry <adam@neoip.com> 2008-06-12 +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : http://en.wikipedia.org/wiki/.sm +sm + +// sn : http://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// so : http://www.soregistry.com/ +so +com.so +net.so +org.so + +// sr : http://en.wikipedia.org/wiki/.sr +sr + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +gov.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : http://en.wikipedia.org/wiki/.su +su +adygeya.su +arkhangelsk.su +balashov.su +bashkiria.su +bryansk.su +dagestan.su +grozny.su +ivanovo.su +kalmykia.su +kaluga.su +karelia.su +khakassia.su +krasnodar.su +kurgan.su +lenug.su +mordovia.su +msk.su +murmansk.su +nalchik.su +nov.su +obninsk.su +penza.su +pokrovsk.su +sochi.su +spb.su +togliatti.su +troitsk.su +tula.su +tuva.su +vladikavkaz.su +vladimir.su +vologda.su + +// sv : http://www.svnet.org.sv/niveldos.pdf +sv +com.sv +edu.sv +gob.sv +org.sv +red.sv + +// sx : http://en.wikipedia.org/wiki/.sx +// Confirmed by registry <jcvignes@openregistry.com> 2012-05-31 +sx +gov.sx + +// sy : http://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : http://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : http://en.wikipedia.org/wiki/.tc +tc + +// td : http://en.wikipedia.org/wiki/.td +td + +// tel: http://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : http://en.wikipedia.org/wiki/.tf +tf + +// tg : http://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/ +tg + +// th : http://en.wikipedia.org/wiki/.th +// Submitted by registry <krit@thains.co.th> 2008-06-17 +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.html +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : http://en.wikipedia.org/wiki/.tk +tk + +// tl : http://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/local.html +tm +com.tm +co.tm +org.tm +net.tm +nom.tm +gov.tm +mil.tm +edu.tm + +// tn : http://en.wikipedia.org/wiki/.tn +// http://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +intl.tn +nat.tn +net.tn +org.tn +info.tn +perso.tn +tourism.tn +edunet.tn +rnrt.tn +rns.tn +rnu.tn +mincom.tn +agrinet.tn +defense.tn +turen.tn + +// to : http://en.wikipedia.org/wiki/.to +// Submitted by registry <egullich@colo.to> 2008-06-17 +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// tp : No registrations at this time. +// Submitted by Ryan Sleevi <ryan.sleevi@gmail.com> 2014-01-03 +tp + +// subTLDs: https://www.nic.tr/forms/eng/policies.pdf +// and: https://www.nic.tr/forms/politikalar.pdf +// Submitted by <mehmetgurevin@gmail.com> 2014-07-19 +tr +com.tr +info.tr +biz.tr +net.tr +org.tr +web.tr +gen.tr +tv.tr +av.tr +dr.tr +bbs.tr +name.tr +tel.tr +gov.tr +bel.tr +pol.tr +mil.tr +k12.tr +edu.tr +kep.tr + +// Used by Northern Cyprus +nc.tr + +// Used by government agencies of Northern Cyprus +gov.nc.tr + +// travel : http://en.wikipedia.org/wiki/.travel +travel + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : http://en.wikipedia.org/wiki/.tv +// Not listing any 2LDs as reserved since none seem to exist in practice, +// Wikipedia notwithstanding. +tv + +// tw : http://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://www.tznic.or.tz/index.php/domains +// Confirmed by registry <manager@tznic.or.tz> 2013-01-22 +tz +ac.tz +co.tz +go.tz +hotel.tz +info.tz +me.tz +mil.tz +mobi.tz +ne.tz +or.tz +sc.tz +tv.tz + +// ua : https://hostmaster.ua/policy/?ua +// Submitted by registry <dk@cctld.ua> 2012-04-27 +ua +// ua 2LD +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geographic names +// https://hostmaster.ua/2ld/ +cherkassy.ua +cherkasy.ua +chernigov.ua +chernihiv.ua +chernivtsi.ua +chernovtsy.ua +ck.ua +cn.ua +cr.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +dnipropetrovsk.ua +dominic.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkiv.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +khmelnytskyi.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +krym.ua +ks.ua +kv.ua +kyiv.ua +lg.ua +lt.ua +lugansk.ua +lutsk.ua +lv.ua +lviv.ua +mk.ua +mykolaiv.ua +nikolaev.ua +od.ua +odesa.ua +odessa.ua +pl.ua +poltava.ua +rivne.ua +rovno.ua +rv.ua +sb.ua +sebastopol.ua +sevastopol.ua +sm.ua +sumy.ua +te.ua +ternopil.ua +uz.ua +uzhgorod.ua +vinnica.ua +vinnytsia.ua +vn.ua +volyn.ua +yalta.ua +zaporizhzhe.ua +zaporizhzhia.ua +zhitomir.ua +zhytomyr.ua +zp.ua +zt.ua + +// Private registries in .ua +co.ua +pp.ua + +// ug : https://www.registry.co.ug/ +ug +co.ug +or.ug +ac.ug +sc.ug +go.ug +ne.ug +com.ug +org.ug + +// uk : http://en.wikipedia.org/wiki/.uk +// Submitted by registry <Michael.Daly@nominet.org.uk> +uk +ac.uk +co.uk +gov.uk +ltd.uk +me.uk +net.uk +nhs.uk +org.uk +plc.uk +police.uk +*.sch.uk + +// us : http://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are available, or even nothing at all. We include the +// most common ones where it's clear that different sites are different +// entities. +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.de.us +k12.fl.us +k12.ga.us +k12.gu.us +// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov> +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +k12.ri.us +k12.sc.us +// k12.sd.us Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us> +k12.tn.us +k12.tx.us +k12.ut.us +k12.vi.us +k12.vt.us +k12.va.us +k12.wa.us +k12.wi.us +// k12.wv.us Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu> +k12.wy.us +cc.ak.us +cc.al.us +cc.ar.us +cc.as.us +cc.az.us +cc.ca.us +cc.co.us +cc.ct.us +cc.dc.us +cc.de.us +cc.fl.us +cc.ga.us +cc.gu.us +cc.hi.us +cc.ia.us +cc.id.us +cc.il.us +cc.in.us +cc.ks.us +cc.ky.us +cc.la.us +cc.ma.us +cc.md.us +cc.me.us +cc.mi.us +cc.mn.us +cc.mo.us +cc.ms.us +cc.mt.us +cc.nc.us +cc.nd.us +cc.ne.us +cc.nh.us +cc.nj.us +cc.nm.us +cc.nv.us +cc.ny.us +cc.oh.us +cc.ok.us +cc.or.us +cc.pa.us +cc.pr.us +cc.ri.us +cc.sc.us +cc.sd.us +cc.tn.us +cc.tx.us +cc.ut.us +cc.vi.us +cc.vt.us +cc.va.us +cc.wa.us +cc.wi.us +cc.wv.us +cc.wy.us +lib.ak.us +lib.al.us +lib.ar.us +lib.as.us +lib.az.us +lib.ca.us +lib.co.us +lib.ct.us +lib.dc.us +lib.de.us +lib.fl.us +lib.ga.us +lib.gu.us +lib.hi.us +lib.ia.us +lib.id.us +lib.il.us +lib.in.us +lib.ks.us +lib.ky.us +lib.la.us +lib.ma.us +lib.md.us +lib.me.us +lib.mi.us +lib.mn.us +lib.mo.us +lib.ms.us +lib.mt.us +lib.nc.us +lib.nd.us +lib.ne.us +lib.nh.us +lib.nj.us +lib.nm.us +lib.nv.us +lib.ny.us +lib.oh.us +lib.ok.us +lib.or.us +lib.pa.us +lib.pr.us +lib.ri.us +lib.sc.us +lib.sd.us +lib.tn.us +lib.tx.us +lib.ut.us +lib.vi.us +lib.vt.us +lib.va.us +lib.wa.us +lib.wi.us +// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us> +lib.wy.us +// k12.ma.us contains school districts in Massachusetts. The 4LDs are +// managed indepedently except for private (PVT), charter (CHTR) and +// parochial (PAROCH) schools. Those are delegated dorectly to the +// 5LD operators. <k12-ma-hostmaster _ at _ rsuc.gweep.net> +pvt.k12.ma.us +chtr.k12.ma.us +paroch.k12.ma.us + +// uy : http://www.nic.org.uy/ +uy +com.uy +edu.uy +gub.uy +mil.uy +net.uy +org.uy + +// uz : http://www.reg.uz/ +uz +co.uz +com.uz +net.uz +org.uz + +// va : http://en.wikipedia.org/wiki/.va +va + +// vc : http://en.wikipedia.org/wiki/.vc +// Submitted by registry <kshah@ca.afilias.info> 2008-06-13 +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : https://registro.nic.ve/ +// Confirmed by registry 2012-10-04 +// Updated 2014-05-20 - Bug 940478 +ve +arts.ve +co.ve +com.ve +e12.ve +edu.ve +firm.ve +gob.ve +gov.ve +info.ve +int.ve +mil.ve +net.ve +org.ve +rec.ve +store.ve +tec.ve +web.ve + +// vg : http://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : http://en.wikipedia.org/wiki/.vu +// http://www.vunic.vu/ +vu +com.vu +edu.vu +net.vu +org.vu + +// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +wf + +// ws : http://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +yt + +// IDN ccTLDs +// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then +// U-label, and follow this format: +// // A-Label ("<Latin renderings>", <language name>[, variant info]) : <ISO 3166 ccTLD> +// // [sponsoring org] +// U-Label + +// xn--mgbaam7a8h ("Emerat", Arabic) : AE +// http://nic.ae/english/arabicdomain/rules.jsp +امارات + +// xn--y9a3aq ("hye", Armenian) : AM +// ISOC AM (operated by .am Registry) +հայ + +// xn--54b7fta0cc ("Bangla", Bangla) : BD +বাংলা + +// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY +// Operated by .by registry +бел + +// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中国 + +// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中國 + +// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ +الجزائر + +// xn--wgbh1c ("Egypt/Masr", Arabic) : EG +// http://www.dotmasr.eg/ +مصر + +// xn--node ("ge", Georgian Mkhedruli) : GE +გე + +// xn--qxam ("el", Greek) : GR +// Hellenic Ministry of Infrastructure, Transport, and Networks +ελ + +// xn--j6w193g ("Hong Kong", Chinese) : HK +// https://www2.hkirc.hk/register/rules.jsp +香港 + +// xn--h2brj9c ("Bharat", Devanagari) : IN +// India +भारत + +// xn--mgbbh1a71e ("Bharat", Arabic) : IN +// India +بھارت + +// xn--fpcrj9c3d ("Bharat", Telugu) : IN +// India +భారత్ + +// xn--gecrj9c ("Bharat", Gujarati) : IN +// India +ભારત + +// xn--s9brj9c ("Bharat", Gurmukhi) : IN +// India +ਭਾਰਤ + +// xn--45brj9c ("Bharat", Bengali) : IN +// India +ভারত + +// xn--xkc2dl3a5ee0h ("India", Tamil) : IN +// India +இந்தியா + +// xn--mgba3a4f16a ("Iran", Persian) : IR +ایران + +// xn--mgba3a4fra ("Iran", Arabic) : IR +ايران + +// xn--mgbtx2b ("Iraq", Arabic) : IQ +// Communications and Media Commission +عراق + +// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO +// National Information Technology Center (NITC) +// Royal Scientific Society, Al-Jubeiha +الاردن + +// xn--3e0b707e ("Republic of Korea", Hangul) : KR +한국 + +// xn--80ao21a ("Kaz", Kazakh) : KZ +қаз + +// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK +// http://nic.lk +ලංකා + +// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK +// http://nic.lk +இலங்கை + +// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA +المغرب + +// xn--d1alf ("mkd", Macedonian) : MK +// MARnet +мкд + +// xn--l1acc ("mon", Mongolian) : MN +мон + +// xn--mix891f ("Macao", Chinese, Traditional) : MO +// MONIC / HNET Asia (Registry Operator for .mo) +澳門 + +// xn--mix082f ("Macao", Chinese, Simplified) : MO +澳门 + +// xn--mgbx4cd0ab ("Malaysia", Malay) : MY +مليسيا + +// xn--mgb9awbf ("Oman", Arabic) : OM +عمان + +// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK +پاکستان + +// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK +پاكستان + +// xn--ygbi2ammx ("Falasteen", Arabic) : PS +// The Palestinian National Internet Naming Authority (PNINA) +// http://www.pnina.ps +فلسطين + +// xn--90a3ac ("srb", Cyrillic) : RS +// http://www.rnids.rs/en/the-.срб-domain +срб +пр.срб +орг.срб +обр.срб +од.срб +упр.срб +ак.срб + +// xn--p1ai ("rf", Russian-Cyrillic) : RU +// http://www.cctld.ru/en/docs/rulesrf.php +рф + +// xn--wgbl6a ("Qatar", Arabic) : QA +// http://www.ict.gov.qa/ +قطر + +// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA +// http://www.nic.net.sa/ +السعودية + +// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA +السعودیة + +// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA +السعودیۃ + +// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA +السعوديه + +// xn--mgbpl2fh ("sudan", Arabic) : SD +// Operated by .sd registry +سودان + +// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG +新加坡 + +// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG +சிங்கப்பூர் + +// xn--ogbpf8fl ("Syria", Arabic) : SY +سورية + +// xn--mgbtf8fl ("Syria", Arabic, variant) : SY +سوريا + +// xn--o3cw4h ("Thai", Thai) : TH +// http://www.thnic.co.th +ไทย + +// xn--pgbs0dh ("Tunisia", Arabic) : TN +// http://nic.tn +تونس + +// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台灣 + +// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台湾 + +// xn--nnx388a ("Taiwan", Chinese, variant) : TW +臺灣 + +// xn--j1amh ("ukr", Cyrillic) : UA +укр + +// xn--mgb2ddes ("AlYemen", Arabic) : YE +اليمن + +// xxx : http://icmregistry.com +xxx + +// ye : http://www.y.net.ye/services/domain_name.htm +*.ye + +// za : http://www.zadna.org.za/content/page/domain-information +ac.za +agrica.za +alt.za +co.za +edu.za +gov.za +grondar.za +law.za +mil.za +net.za +ngo.za +nis.za +nom.za +org.za +school.za +tm.za +web.za + +// zm : http://en.wikipedia.org/wiki/.zm +*.zm + +// zw : http://en.wikipedia.org/wiki/.zw +*.zw + + +// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2015-07-09T11:20:15Z + +// aaa : 2015-02-26 American Automobile Association, Inc. +aaa + +// aarp : 2015-05-21 AARP +aarp + +// abb : 2014-10-24 ABB Ltd +abb + +// abbott : 2014-07-24 Abbott Laboratories, Inc. +abbott + +// able : 2015-06-25 Able Inc. +able + +// abogado : 2014-04-24 Top Level Domain Holdings Limited +abogado + +// academy : 2013-11-07 Half Oaks, LLC +academy + +// accenture : 2014-08-15 Accenture plc +accenture + +// accountant : 2014-11-20 dot Accountant Limited +accountant + +// accountants : 2014-03-20 Knob Town, LLC +accountants + +// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG +aco + +// active : 2014-05-01 The Active Network, Inc +active + +// actor : 2013-12-12 United TLD Holdco Ltd. +actor + +// ads : 2014-12-04 Charleston Road Registry Inc. +ads + +// adult : 2014-10-16 ICM Registry AD LLC +adult + +// aeg : 2015-03-19 Aktiebolaget Electrolux +aeg + +// aetna : 2015-05-21 Aetna Life Insurance Company +aetna + +// afl : 2014-10-02 Australian Football League +afl + +// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa +africa + +// africamagic : 2015-03-05 Electronic Media Network (Pty) Ltd +africamagic + +// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +agakhan + +// agency : 2013-11-14 Steel Falls, LLC +agency + +// aig : 2014-12-18 American International Group, Inc. +aig + +// airforce : 2014-03-06 United TLD Holdco Ltd. +airforce + +// airtel : 2014-10-24 Bharti Airtel Limited +airtel + +// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +akdn + +// alibaba : 2015-01-15 Alibaba Group Holding Limited +alibaba + +// alipay : 2015-01-15 Alibaba Group Holding Limited +alipay + +// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +allfinanz + +// ally : 2015-06-18 Ally Financial Inc. +ally + +// alsace : 2014-07-02 REGION D ALSACE +alsace + +// amica : 2015-05-28 Amica Mutual Insurance Company +amica + +// amsterdam : 2014-07-24 Gemeente Amsterdam +amsterdam + +// analytics : 2014-12-18 Campus IP LLC +analytics + +// android : 2014-08-07 Charleston Road Registry Inc. +android + +// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +anquan + +// apartments : 2014-12-11 June Maple, LLC +apartments + +// app : 2015-05-14 Charleston Road Registry Inc. +app + +// apple : 2015-05-14 Apple Inc. +apple + +// aquarelle : 2014-07-24 Aquarelle.com +aquarelle + +// aramco : 2014-11-20 Aramco Services Company +aramco + +// archi : 2014-02-06 STARTING DOT LIMITED +archi + +// army : 2014-03-06 United TLD Holdco Ltd. +army + +// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. +arte + +// associates : 2014-03-06 Baxter Hill, LLC +associates + +// attorney : 2014-03-20 +attorney + +// auction : 2014-03-20 +auction + +// audi : 2015-05-21 AUDI Aktiengesellschaft +audi + +// audible : 2015-06-25 Amazon EU S.à r.l. +audible + +// audio : 2014-03-20 Uniregistry, Corp. +audio + +// author : 2014-12-18 Amazon EU S.à r.l. +author + +// auto : 2014-11-13 +auto + +// autos : 2014-01-09 DERAutos, LLC +autos + +// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca +avianca + +// aws : 2015-06-25 Amazon EU S.à r.l. +aws + +// axa : 2013-12-19 AXA SA +axa + +// azure : 2014-12-18 Microsoft Corporation +azure + +// baby : 2015-04-09 Johnson & Johnson Services, Inc. +baby + +// baidu : 2015-01-08 Baidu, Inc. +baidu + +// band : 2014-06-12 +band + +// bank : 2014-09-25 fTLD Registry Services LLC +bank + +// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +bar + +// barcelona : 2014-07-24 Municipi de Barcelona +barcelona + +// barclaycard : 2014-11-20 Barclays Bank PLC +barclaycard + +// barclays : 2014-11-20 Barclays Bank PLC +barclays + +// barefoot : 2015-06-11 Gallo Vineyards, Inc. +barefoot + +// bargains : 2013-11-14 Half Hallow, LLC +bargains + +// bauhaus : 2014-04-17 Werkhaus GmbH +bauhaus + +// bayern : 2014-01-23 Bayern Connect GmbH +bayern + +// bbc : 2014-12-18 British Broadcasting Corporation +bbc + +// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +bbva + +// bcg : 2015-04-02 The Boston Consulting Group, Inc. +bcg + +// bcn : 2014-07-24 Municipi de Barcelona +bcn + +// beats : 2015-05-14 Beats Electronics, LLC +beats + +// beer : 2014-01-09 Top Level Domain Holdings Limited +beer + +// bentley : 2014-12-18 Bentley Motors Limited +bentley + +// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG +berlin + +// best : 2013-12-19 BestTLD Pty Ltd +best + +// bet : 2015-05-07 Afilias plc +bet + +// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited +bharti + +// bible : 2014-06-19 American Bible Society +bible + +// bid : 2013-12-19 dot Bid Limited +bid + +// bike : 2013-08-27 Grand Hollow, LLC +bike + +// bing : 2014-12-18 Microsoft Corporation +bing + +// bingo : 2014-12-04 Sand Cedar, LLC +bingo + +// bio : 2014-03-06 STARTING DOT LIMITED +bio + +// black : 2014-01-16 Afilias Limited +black + +// blackfriday : 2014-01-16 Uniregistry, Corp. +blackfriday + +// blog : 2015-05-14 PRIMER NIVEL S.A. +blog + +// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC +bloomberg + +// blue : 2013-11-07 Afilias Limited +blue + +// bms : 2014-10-30 Bristol-Myers Squibb Company +bms + +// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +bmw + +// bnl : 2014-07-24 Banca Nazionale del Lavoro +bnl + +// bnpparibas : 2014-05-29 BNP Paribas +bnpparibas + +// boats : 2014-12-04 DERBoats, LLC +boats + +// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +bom + +// bond : 2014-06-05 Bond University Limited +bond + +// boo : 2014-01-30 Charleston Road Registry Inc. +boo + +// boots : 2015-01-08 THE BOOTS COMPANY PLC +boots + +// bosch : 2015-06-18 Robert Bosch GMBH +bosch + +// bostik : 2015-05-28 Bostik SA +bostik + +// bot : 2014-12-18 Amazon EU S.à r.l. +bot + +// boutique : 2013-11-14 Over Galley, LLC +boutique + +// bradesco : 2014-12-18 Banco Bradesco S.A. +bradesco + +// bridgestone : 2014-12-18 Bridgestone Corporation +bridgestone + +// broadway : 2014-12-22 Celebrate Broadway, Inc. +broadway + +// broker : 2014-12-11 IG Group Holdings PLC +broker + +// brother : 2015-01-29 Brother Industries, Ltd. +brother + +// brussels : 2014-02-06 DNS.be vzw +brussels + +// budapest : 2013-11-21 Top Level Domain Holdings Limited +budapest + +// build : 2013-11-07 Plan Bee LLC +build + +// builders : 2013-11-07 Atomic Madison, LLC +builders + +// business : 2013-11-07 Spring Cross, LLC +business + +// buy : 2014-12-18 Amazon EU S.à r.l. +buy + +// buzz : 2013-10-02 DOTSTRATEGY CO. +buzz + +// bzh : 2014-02-27 Association www.bzh +bzh + +// cab : 2013-10-24 Half Sunset, LLC +cab + +// cafe : 2015-02-11 Pioneer Canyon, LLC +cafe + +// cal : 2014-07-24 Charleston Road Registry Inc. +cal + +// call : 2014-12-18 Amazon EU S.à r.l. +call + +// camera : 2013-08-27 Atomic Maple, LLC +camera + +// camp : 2013-11-07 Delta Dynamite, LLC +camp + +// cancerresearch : 2014-05-15 Australian Cancer Research Foundation +cancerresearch + +// canon : 2014-09-12 Canon Inc. +canon + +// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +capetown + +// capital : 2014-03-06 Delta Mill, LLC +capital + +// car : 2015-01-22 +car + +// caravan : 2013-12-12 Caravan International, Inc. +caravan + +// cards : 2013-12-05 Foggy Hollow, LLC +cards + +// care : 2014-03-06 Goose Cross +care + +// career : 2013-10-09 dotCareer LLC +career + +// careers : 2013-10-02 Wild Corner, LLC +careers + +// cars : 2014-11-13 +cars + +// cartier : 2014-06-23 Richemont DNS Inc. +cartier + +// casa : 2013-11-21 Top Level Domain Holdings Limited +casa + +// cash : 2014-03-06 Delta Lake, LLC +cash + +// casino : 2014-12-18 Binky Sky, LLC +casino + +// catering : 2013-12-05 New Falls. LLC +catering + +// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +cba + +// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. +cbn + +// cbre : 2015-07-02 CBRE, Inc. +cbre + +// ceb : 2015-04-09 The Corporate Executive Board Company +ceb + +// center : 2013-11-07 Tin Mill, LLC +center + +// ceo : 2013-11-07 CEOTLD Pty Ltd +ceo + +// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") +cern + +// cfa : 2014-08-28 CFA Institute +cfa + +// cfd : 2014-12-11 IG Group Holdings PLC +cfd + +// chanel : 2015-04-09 Chanel International B.V. +chanel + +// channel : 2014-05-08 Charleston Road Registry Inc. +channel + +// chase : 2015-04-30 JPMorgan Chase & Co. +chase + +// chat : 2014-12-04 Sand Fields, LLC +chat + +// cheap : 2013-11-14 Sand Cover, LLC +cheap + +// chintai : 2015-06-11 CHINTAI Corporation +chintai + +// chloe : 2014-10-16 Richemont DNS Inc. +chloe + +// christmas : 2013-11-21 Uniregistry, Corp. +christmas + +// chrome : 2014-07-24 Charleston Road Registry Inc. +chrome + +// church : 2014-02-06 Holly Fields, LLC +church + +// cipriani : 2015-02-19 Hotel Cipriani Srl +cipriani + +// circle : 2014-12-18 Amazon EU S.à r.l. +circle + +// cisco : 2014-12-22 Cisco Technology, Inc. +cisco + +// citic : 2014-01-09 CITIC Group Corporation +citic + +// city : 2014-05-29 Snow Sky, LLC +city + +// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. +cityeats + +// claims : 2014-03-20 Black Corner, LLC +claims + +// cleaning : 2013-12-05 Fox Shadow, LLC +cleaning + +// click : 2014-06-05 Uniregistry, Corp. +click + +// clinic : 2014-03-20 Goose Park, LLC +clinic + +// clothing : 2013-08-27 Steel Lake, LLC +clothing + +// cloud : 2015-04-16 ARUBA S.p.A. +cloud + +// club : 2013-11-08 .CLUB DOMAINS, LLC +club + +// clubmed : 2015-06-25 Club Méditerranée S.A. +clubmed + +// coach : 2014-10-09 Koko Island, LLC +coach + +// codes : 2013-10-31 Puff Willow, LLC +codes + +// coffee : 2013-10-17 Trixy Cover, LLC +coffee + +// college : 2014-01-16 XYZ.COM LLC +college + +// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH +cologne + +// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +commbank + +// community : 2013-12-05 Fox Orchard, LLC +community + +// company : 2013-11-07 Silver Avenue, LLC +company + +// computer : 2013-10-24 Pine Mill, LLC +computer + +// comsec : 2015-01-08 VeriSign, Inc. +comsec + +// condos : 2013-12-05 Pine House, LLC +condos + +// construction : 2013-09-16 Fox Dynamite, LLC +construction + +// consulting : 2013-12-05 +consulting + +// contact : 2015-01-08 Top Level Spectrum, Inc. +contact + +// contractors : 2013-09-10 Magic Woods, LLC +contractors + +// cooking : 2013-11-21 Top Level Domain Holdings Limited +cooking + +// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +cookingchannel + +// cool : 2013-11-14 Koko Lake, LLC +cool + +// corsica : 2014-09-25 Collectivité Territoriale de Corse +corsica + +// country : 2013-12-19 Top Level Domain Holdings Limited +country + +// coupon : 2015-02-26 Amazon EU S.à r.l. +coupon + +// coupons : 2015-03-26 Black Island, LLC +coupons + +// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD +courses + +// credit : 2014-03-20 Snow Shadow, LLC +credit + +// creditcard : 2014-03-20 Binky Frostbite, LLC +creditcard + +// creditunion : 2015-01-22 CUNA Performance Resources, LLC +creditunion + +// cricket : 2014-10-09 dot Cricket Limited +cricket + +// crown : 2014-10-24 Crown Equipment Corporation +crown + +// crs : 2014-04-03 Federated Co-operatives Limited +crs + +// cruises : 2013-12-05 Spring Way, LLC +cruises + +// csc : 2014-09-25 Alliance-One Services, Inc. +csc + +// cuisinella : 2014-04-03 SALM S.A.S. +cuisinella + +// cymru : 2014-05-08 Nominet UK +cymru + +// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. +cyou + +// dabur : 2014-02-06 Dabur India Limited +dabur + +// dad : 2014-01-23 Charleston Road Registry Inc. +dad + +// dance : 2013-10-24 United TLD Holdco Ltd. +dance + +// date : 2014-11-20 dot Date Limited +date + +// dating : 2013-12-05 Pine Fest, LLC +dating + +// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. +datsun + +// day : 2014-01-30 Charleston Road Registry Inc. +day + +// dclk : 2014-11-20 Charleston Road Registry Inc. +dclk + +// dds : 2015-05-07 Top Level Domain Holdings Limited +dds + +// deal : 2015-06-25 Amazon EU S.à r.l. +deal + +// dealer : 2014-12-22 Dealer Dot Com, Inc. +dealer + +// deals : 2014-05-22 Sand Sunset, LLC +deals + +// degree : 2014-03-06 +degree + +// delivery : 2014-09-11 Steel Station, LLC +delivery + +// dell : 2014-10-24 Dell Inc. +dell + +// delta : 2015-02-19 Delta Air Lines, Inc. +delta + +// democrat : 2013-10-24 United TLD Holdco Ltd. +democrat + +// dental : 2014-03-20 Tin Birch, LLC +dental + +// dentist : 2014-03-20 +dentist + +// desi : 2013-11-14 Desi Networks LLC +desi + +// design : 2014-11-07 Top Level Design, LLC +design + +// dev : 2014-10-16 Charleston Road Registry Inc. +dev + +// diamonds : 2013-09-22 John Edge, LLC +diamonds + +// diet : 2014-06-26 Uniregistry, Corp. +diet + +// digital : 2014-03-06 Dash Park, LLC +digital + +// direct : 2014-04-10 Half Trail, LLC +direct + +// directory : 2013-09-20 Extra Madison, LLC +directory + +// discount : 2014-03-06 Holly Hill, LLC +discount + +// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. +dnp + +// docs : 2014-10-16 Charleston Road Registry Inc. +docs + +// dog : 2014-12-04 Koko Mill, LLC +dog + +// doha : 2014-09-18 Communications Regulatory Authority (CRA) +doha + +// domains : 2013-10-17 Sugar Cross, LLC +domains + +// doosan : 2014-04-03 Doosan Corporation +doosan + +// dot : 2015-05-21 Dish DBS Corporation +dot + +// download : 2014-11-20 dot Support Limited +download + +// drive : 2015-03-05 Charleston Road Registry Inc. +drive + +// dstv : 2015-03-12 MultiChoice (Proprietary) Limited +dstv + +// dtv : 2015-06-04 Dish DBS Corporation +dtv + +// dubai : 2015-01-01 Dubai Smart Government Department +dubai + +// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company +dunlop + +// dupont : 2015-06-25 E.I. du Pont de Nemours and Company +dupont + +// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +durban + +// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +dvag + +// earth : 2014-12-04 Interlink Co., Ltd. +earth + +// eat : 2014-01-23 Charleston Road Registry Inc. +eat + +// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. +edeka + +// education : 2013-11-07 Brice Way, LLC +education + +// email : 2013-10-31 Spring Madison, LLC +email + +// emerck : 2014-04-03 Merck KGaA +emerck + +// energy : 2014-09-11 Binky Birch, LLC +energy + +// engineer : 2014-03-06 United TLD Holdco Ltd. +engineer + +// engineering : 2014-03-06 Romeo Canyon +engineering + +// enterprises : 2013-09-20 Snow Oaks, LLC +enterprises + +// epson : 2014-12-04 Seiko Epson Corporation +epson + +// equipment : 2013-08-27 Corn Station, LLC +equipment + +// erni : 2014-04-03 ERNI Group Holding AG +erni + +// esq : 2014-05-08 Charleston Road Registry Inc. +esq + +// estate : 2013-08-27 Trixy Park, LLC +estate + +// eurovision : 2014-04-24 European Broadcasting Union (EBU) +eurovision + +// eus : 2013-12-12 Puntueus Fundazioa +eus + +// events : 2013-12-05 Pioneer Maple, LLC +events + +// everbank : 2014-05-15 EverBank +everbank + +// exchange : 2014-03-06 Spring Falls, LLC +exchange + +// expert : 2013-11-21 Magic Pass, LLC +expert + +// exposed : 2013-12-05 Victor Beach, LLC +exposed + +// express : 2015-02-11 Sea Sunset, LLC +express + +// extraspace : 2015-05-14 Extra Space Storage LLC +extraspace + +// fage : 2014-12-18 Fage International S.A. +fage + +// fail : 2014-03-06 Atomic Pipe, LLC +fail + +// fairwinds : 2014-11-13 FairWinds Partners, LLC +fairwinds + +// faith : 2014-11-20 dot Faith Limited +faith + +// family : 2015-04-02 +family + +// fan : 2014-03-06 +fan + +// fans : 2014-11-07 Asiamix Digital Limited +fans + +// farm : 2013-11-07 Just Maple, LLC +farm + +// fashion : 2014-07-03 Top Level Domain Holdings Limited +fashion + +// fast : 2014-12-18 Amazon EU S.à r.l. +fast + +// feedback : 2013-12-19 Top Level Spectrum, Inc. +feedback + +// ferrero : 2014-12-18 Ferrero Trading Lux S.A. +ferrero + +// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd +film + +// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +final + +// finance : 2014-03-20 Cotton Cypress, LLC +finance + +// financial : 2014-03-06 Just Cover, LLC +financial + +// fire : 2015-06-25 Amazon EU S.à r.l. +fire + +// firestone : 2014-12-18 Bridgestone Corporation +firestone + +// firmdale : 2014-03-27 Firmdale Holdings Limited +firmdale + +// fish : 2013-12-12 Fox Woods, LLC +fish + +// fishing : 2013-11-21 Top Level Domain Holdings Limited +fishing + +// fit : 2014-11-07 Top Level Domain Holdings Limited +fit + +// fitness : 2014-03-06 Brice Orchard, LLC +fitness + +// flickr : 2015-04-02 Yahoo! Domain Services Inc. +flickr + +// flights : 2013-12-05 Fox Station, LLC +flights + +// florist : 2013-11-07 Half Cypress, LLC +florist + +// flowers : 2014-10-09 Uniregistry, Corp. +flowers + +// flsmidth : 2014-07-24 FLSmidth A/S +flsmidth + +// fly : 2014-05-08 Charleston Road Registry Inc. +fly + +// foo : 2014-01-23 Charleston Road Registry Inc. +foo + +// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. +foodnetwork + +// football : 2014-12-18 Foggy Farms, LLC +football + +// ford : 2014-11-13 Ford Motor Company +ford + +// forex : 2014-12-11 IG Group Holdings PLC +forex + +// forsale : 2014-05-22 +forsale + +// forum : 2015-04-02 Fegistry, LLC +forum + +// foundation : 2013-12-05 John Dale, LLC +foundation + +// frl : 2014-05-15 FRLregistry B.V. +frl + +// frogans : 2013-12-19 OP3FT +frogans + +// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. +frontdoor + +// frontier : 2015-02-05 Frontier Communications Corporation +frontier + +// fund : 2014-03-20 John Castle, LLC +fund + +// furniture : 2014-03-20 Lone Fields, LLC +furniture + +// futbol : 2013-09-20 +futbol + +// fyi : 2015-04-02 Silver Tigers, LLC +fyi + +// gal : 2013-11-07 Asociación puntoGAL +gal + +// gallery : 2013-09-13 Sugar House, LLC +gallery + +// gallo : 2015-06-11 Gallo Vineyards, Inc. +gallo + +// gallup : 2015-02-19 Gallup, Inc. +gallup + +// game : 2015-05-28 Uniregistry, Corp. +game + +// games : 2015-05-28 Foggy Beach, LLC +games + +// garden : 2014-06-26 Top Level Domain Holdings Limited +garden + +// gbiz : 2014-07-17 Charleston Road Registry Inc. +gbiz + +// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" +gdn + +// gea : 2014-12-04 GEA Group Aktiengesellschaft +gea + +// gent : 2014-01-23 COMBELL GROUP NV/SA +gent + +// genting : 2015-03-12 Resorts World Inc Pte. Ltd. +genting + +// ggee : 2014-01-09 GMO Internet, Inc. +ggee + +// gift : 2013-10-17 Uniregistry, Corp. +gift + +// gifts : 2014-07-03 Goose Sky, LLC +gifts + +// gives : 2014-03-06 United TLD Holdco Ltd. +gives + +// giving : 2014-11-13 Giving Limited +giving + +// glass : 2013-11-07 Black Cover, LLC +glass + +// gle : 2014-07-24 Charleston Road Registry Inc. +gle + +// global : 2014-04-17 Dot GLOBAL AS +global + +// globo : 2013-12-19 Globo Comunicação e Participações S.A +globo + +// gmail : 2014-05-01 Charleston Road Registry Inc. +gmail + +// gmo : 2014-01-09 GMO Internet, Inc. +gmo + +// gmx : 2014-04-24 1&1 Mail & Media GmbH +gmx + +// gold : 2015-01-22 June Edge, LLC +gold + +// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +goldpoint + +// golf : 2014-12-18 Lone falls, LLC +golf + +// goo : 2014-12-18 NTT Resonant Inc. +goo + +// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company +goodyear + +// goog : 2014-11-20 Charleston Road Registry Inc. +goog + +// google : 2014-07-24 Charleston Road Registry Inc. +google + +// gop : 2014-01-16 Republican State Leadership Committee, Inc. +gop + +// got : 2014-12-18 Amazon EU S.à r.l. +got + +// gotv : 2015-03-12 MultiChoice (Proprietary) Limited +gotv + +// grainger : 2015-05-07 Grainger Registry Services, LLC +grainger + +// graphics : 2013-09-13 Over Madison, LLC +graphics + +// gratis : 2014-03-20 Pioneer Tigers, LLC +gratis + +// green : 2014-05-08 Afilias Limited +green + +// gripe : 2014-03-06 Corn Sunset, LLC +gripe + +// group : 2014-08-15 Romeo Town, LLC +group + +// gucci : 2014-11-13 Guccio Gucci S.p.a. +gucci + +// guge : 2014-08-28 Charleston Road Registry Inc. +guge + +// guide : 2013-09-13 Snow Moon, LLC +guide + +// guitars : 2013-11-14 Uniregistry, Corp. +guitars + +// guru : 2013-08-27 Pioneer Cypress, LLC +guru + +// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH +hamburg + +// hangout : 2014-11-13 Charleston Road Registry Inc. +hangout + +// haus : 2013-12-05 +haus + +// hdfcbank : 2015-02-12 HDFC Bank Limited +hdfcbank + +// health : 2015-02-11 DotHealth, LLC +health + +// healthcare : 2014-06-12 Silver Glen, LLC +healthcare + +// help : 2014-06-26 Uniregistry, Corp. +help + +// helsinki : 2015-02-05 City of Helsinki +helsinki + +// here : 2014-02-06 Charleston Road Registry Inc. +here + +// hermes : 2014-07-10 HERMES INTERNATIONAL +hermes + +// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. +hgtv + +// hiphop : 2014-03-06 Uniregistry, Corp. +hiphop + +// hitachi : 2014-10-31 Hitachi, Ltd. +hitachi + +// hiv : 2014-03-13 dotHIV gemeinnuetziger e.V. +hiv + +// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited +hkt + +// hockey : 2015-03-19 Half Willow, LLC +hockey + +// holdings : 2013-08-27 John Madison, LLC +holdings + +// holiday : 2013-11-07 Goose Woods, LLC +holiday + +// homedepot : 2015-04-02 Homer TLC, Inc. +homedepot + +// homes : 2014-01-09 DERHomes, LLC +homes + +// honda : 2014-12-18 Honda Motor Co., Ltd. +honda + +// horse : 2013-11-21 Top Level Domain Holdings Limited +horse + +// host : 2014-04-17 DotHost Inc. +host + +// hosting : 2014-05-29 Uniregistry, Corp. +hosting + +// hoteles : 2015-03-05 Travel Reservations SRL +hoteles + +// hotmail : 2014-12-18 Microsoft Corporation +hotmail + +// house : 2013-11-07 Sugar Park, LLC +house + +// how : 2014-01-23 Charleston Road Registry Inc. +how + +// hsbc : 2014-10-24 HSBC Holdings PLC +hsbc + +// htc : 2015-04-02 HTC corporation +htc + +// ibm : 2014-07-31 International Business Machines Corporation +ibm + +// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited +icbc + +// ice : 2014-10-30 IntercontinentalExchange, Inc. +ice + +// icu : 2015-01-08 One.com A/S +icu + +// ifm : 2014-01-30 ifm electronic gmbh +ifm + +// iinet : 2014-07-03 Connect West Pty. Ltd. +iinet + +// imdb : 2015-06-25 Amazon EU S.à r.l. +imdb + +// immo : 2014-07-10 Auburn Bloom, LLC +immo + +// immobilien : 2013-11-07 United TLD Holdco Ltd. +immobilien + +// industries : 2013-12-05 Outer House, LLC +industries + +// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. +infiniti + +// ing : 2014-01-23 Charleston Road Registry Inc. +ing + +// ink : 2013-12-05 Top Level Design, LLC +ink + +// institute : 2013-11-07 Outer Maple, LLC +institute + +// insurance : 2015-02-19 fTLD Registry Services LLC +insurance + +// insure : 2014-03-20 Pioneer Willow, LLC +insure + +// international : 2013-11-07 Wild Way, LLC +international + +// investments : 2014-03-20 Holly Glen, LLC +investments + +// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. +ipiranga + +// irish : 2014-08-07 Dot-Irish LLC +irish + +// iselect : 2015-02-11 iSelect Ltd +iselect + +// ist : 2014-08-28 Istanbul Metropolitan Municipality +ist + +// istanbul : 2014-08-28 Istanbul Metropolitan Municipality +istanbul + +// itau : 2014-10-02 Itau Unibanco Holding S.A. +itau + +// iwc : 2014-06-23 Richemont DNS Inc. +iwc + +// jaguar : 2014-11-13 Jaguar Land Rover Ltd +jaguar + +// java : 2014-06-19 Oracle Corporation +java + +// jcb : 2014-11-20 JCB Co., Ltd. +jcb + +// jcp : 2015-04-23 JCP Media, Inc. +jcp + +// jetzt : 2014-01-09 New TLD Company AB +jetzt + +// jewelry : 2015-03-05 Wild Bloom, LLC +jewelry + +// jio : 2015-04-02 Affinity Names, Inc. +jio + +// jlc : 2014-12-04 Richemont DNS Inc. +jlc + +// jll : 2015-04-02 Jones Lang LaSalle Incorporated +jll + +// jmp : 2015-03-26 Matrix IP LLC +jmp + +// jnj : 2015-06-18 Johnson & Johnson Services, Inc. +jnj + +// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +joburg + +// jot : 2014-12-18 Amazon EU S.à r.l. +jot + +// joy : 2014-12-18 Amazon EU S.à r.l. +joy + +// jpmorgan : 2015-04-30 JPMorgan Chase & Co. +jpmorgan + +// jprs : 2014-09-18 Japan Registry Services Co., Ltd. +jprs + +// juegos : 2014-03-20 Uniregistry, Corp. +juegos + +// kaufen : 2013-11-07 United TLD Holdco Ltd. +kaufen + +// kddi : 2014-09-12 KDDI CORPORATION +kddi + +// kerryhotels : 2015-04-30 Kerry Trading Co. Limited +kerryhotels + +// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited +kerrylogistics + +// kerryproperties : 2015-04-09 Kerry Trading Co. Limited +kerryproperties + +// kfh : 2014-12-04 Kuwait Finance House +kfh + +// kim : 2013-09-23 Afilias Limited +kim + +// kinder : 2014-11-07 Ferrero Trading Lux S.A. +kinder + +// kindle : 2015-06-25 Amazon EU S.à r.l. +kindle + +// kitchen : 2013-09-20 Just Goodbye, LLC +kitchen + +// kiwi : 2013-09-20 DOT KIWI LIMITED +kiwi + +// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH +koeln + +// komatsu : 2015-01-08 Komatsu Ltd. +komatsu + +// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) +kpmg + +// kpn : 2015-01-08 Koninklijke KPN N.V. +kpn + +// krd : 2013-12-05 KRG Department of Information Technology +krd + +// kred : 2013-12-19 KredTLD Pty Ltd +kred + +// kuokgroup : 2015-04-09 Kerry Trading Co. Limited +kuokgroup + +// kyknet : 2015-03-05 Electronic Media Network (Pty) Ltd +kyknet + +// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen +kyoto + +// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA +lacaixa + +// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. +lamborghini + +// lancaster : 2015-02-12 LANCASTER +lancaster + +// land : 2013-09-10 Pine Moon, LLC +land + +// landrover : 2014-11-13 Jaguar Land Rover Ltd +landrover + +// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated +lasalle + +// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico +lat + +// latrobe : 2014-06-16 La Trobe University +latrobe + +// law : 2015-01-22 Minds + Machines Group Limited +law + +// lawyer : 2014-03-20 +lawyer + +// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") +lds + +// lease : 2014-03-06 Victor Trail, LLC +lease + +// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +leclerc + +// legal : 2014-10-16 Blue Falls, LLC +legal + +// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION +lexus + +// lgbt : 2014-05-08 Afilias Limited +lgbt + +// liaison : 2014-10-02 Liaison Technologies, Incorporated +liaison + +// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +lidl + +// life : 2014-02-06 Trixy Oaks, LLC +life + +// lifeinsurance : 2015-01-15 American Council of Life Insurers +lifeinsurance + +// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. +lifestyle + +// lighting : 2013-08-27 John McCook, LLC +lighting + +// like : 2014-12-18 Amazon EU S.à r.l. +like + +// limited : 2014-03-06 Big Fest, LLC +limited + +// limo : 2013-10-17 Hidden Frostbite, LLC +limo + +// lincoln : 2014-11-13 Ford Motor Company +lincoln + +// linde : 2014-12-04 Linde Aktiengesellschaft +linde + +// link : 2013-11-14 Uniregistry, Corp. +link + +// lipsy : 2015-06-25 Lipsy Ltd +lipsy + +// live : 2014-12-04 +live + +// lixil : 2015-03-19 LIXIL Group Corporation +lixil + +// loan : 2014-11-20 dot Loan Limited +loan + +// loans : 2014-03-20 June Woods, LLC +loans + +// locker : 2015-06-04 Dish DBS Corporation +locker + +// locus : 2015-06-25 Locus Analytics LLC +locus + +// lol : 2015-01-30 Uniregistry, Corp. +lol + +// london : 2013-11-14 Dot London Domains Limited +london + +// lotte : 2014-11-07 Lotte Holdings Co., Ltd. +lotte + +// lotto : 2014-04-10 Afilias Limited +lotto + +// love : 2014-12-22 Merchant Law Group LLP +love + +// ltd : 2014-09-25 Over Corner, LLC +ltd + +// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA +ltda + +// lupin : 2014-11-07 LUPIN LIMITED +lupin + +// luxe : 2014-01-09 Top Level Domain Holdings Limited +luxe + +// luxury : 2013-10-17 Luxury Partners, LLC +luxury + +// madrid : 2014-05-01 Comunidad de Madrid +madrid + +// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) +maif + +// maison : 2013-12-05 Victor Frostbite, LLC +maison + +// makeup : 2015-01-15 L'Oréal +makeup + +// man : 2014-12-04 MAN SE +man + +// management : 2013-11-07 John Goodbye, LLC +management + +// mango : 2013-10-24 PUNTO FA S.L. +mango + +// market : 2014-03-06 +market + +// marketing : 2013-11-07 Fern Pass, LLC +marketing + +// markets : 2014-12-11 IG Group Holdings PLC +markets + +// marriott : 2014-10-09 Marriott Worldwide Corporation +marriott + +// mba : 2015-04-02 Lone Hollow, LLC +mba + +// media : 2014-03-06 Grand Glen, LLC +media + +// meet : 2014-01-16 +meet + +// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +melbourne + +// meme : 2014-01-30 Charleston Road Registry Inc. +meme + +// memorial : 2014-10-16 Dog Beach, LLC +memorial + +// men : 2015-02-26 Exclusive Registry Limited +men + +// menu : 2013-09-11 Wedding TLD2, LLC +menu + +// meo : 2014-11-07 PT Comunicacoes S.A. +meo + +// metlife : 2015-05-07 MetLife Services and Solutions, LLC +metlife + +// miami : 2013-12-19 Top Level Domain Holdings Limited +miami + +// microsoft : 2014-12-18 Microsoft Corporation +microsoft + +// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +mini + +// mit : 2015-07-02 Massachusetts Institute of Technology +mit + +// mlb : 2015-05-21 MLB Advanced Media DH, LLC +mlb + +// mls : 2015-04-23 The Canadian Real Estate Association +mls + +// mma : 2014-11-07 MMA IARD +mma + +// mnet : 2015-03-05 Electronic Media Network (Pty) Ltd +mnet + +// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L. +mobily + +// moda : 2013-11-07 United TLD Holdco Ltd. +moda + +// moe : 2013-11-13 Interlink Co., Ltd. +moe + +// moi : 2014-12-18 Amazon EU S.à r.l. +moi + +// mom : 2015-04-16 Uniregistry, Corp. +mom + +// monash : 2013-09-30 Monash University +monash + +// money : 2014-10-16 Outer McCook, LLC +money + +// montblanc : 2014-06-23 Richemont DNS Inc. +montblanc + +// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") +mormon + +// mortgage : 2014-03-20 +mortgage + +// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +moscow + +// moto : 2015-06-04 Charleston Road Registry Inc. +moto + +// motorcycles : 2014-01-09 DERMotorcycles, LLC +motorcycles + +// mov : 2014-01-30 Charleston Road Registry Inc. +mov + +// movie : 2015-02-05 New Frostbite, LLC +movie + +// movistar : 2014-10-16 Telefónica S.A. +movistar + +// mtn : 2014-12-04 MTN Dubai Limited +mtn + +// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation +mtpc + +// mtr : 2015-03-12 MTR Corporation Limited +mtr + +// multichoice : 2015-03-12 MultiChoice (Proprietary) Limited +multichoice + +// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC +mutual + +// mutuelle : 2015-06-18 Fédération Nationale de la Mutualité Française +mutuelle + +// mzansimagic : 2015-03-05 Electronic Media Network (Pty) Ltd +mzansimagic + +// nadex : 2014-12-11 IG Group Holdings PLC +nadex + +// nagoya : 2013-10-24 GMO Registry, Inc. +nagoya + +// naspers : 2015-02-12 Intelprop (Proprietary) Limited +naspers + +// natura : 2015-03-12 NATURA COSMÉTICOS S.A. +natura + +// navy : 2014-03-06 United TLD Holdco Ltd. +navy + +// nec : 2015-01-08 NEC Corporation +nec + +// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +netbank + +// netflix : 2015-06-18 Netflix, Inc. +netflix + +// network : 2013-11-14 Trixy Manor, LLC +network + +// neustar : 2013-12-05 NeuStar, Inc. +neustar + +// new : 2014-01-30 Charleston Road Registry Inc. +new + +// news : 2014-12-18 +news + +// next : 2015-06-18 Next plc +next + +// nextdirect : 2015-06-18 Next plc +nextdirect + +// nexus : 2014-07-24 Charleston Road Registry Inc. +nexus + +// ngo : 2014-03-06 Public Interest Registry +ngo + +// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) +nhk + +// nico : 2014-12-04 DWANGO Co., Ltd. +nico + +// nikon : 2015-05-21 NIKON CORPORATION +nikon + +// ninja : 2013-11-07 United TLD Holdco Ltd. +ninja + +// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. +nissan + +// nokia : 2015-01-08 Nokia Corporation +nokia + +// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC +northwesternmutual + +// norton : 2014-12-04 Symantec Corporation +norton + +// now : 2015-06-25 Amazon EU S.à r.l. +now + +// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +nowruz + +// nowtv : 2015-05-14 Starbucks (HK) Limited +nowtv + +// nra : 2014-05-22 NRA Holdings Company, INC. +nra + +// nrw : 2013-11-21 Minds + Machines GmbH +nrw + +// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION +ntt + +// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications +nyc + +// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA +obi + +// observer : 2015-04-30 Guardian News and Media Limited +observer + +// office : 2015-03-12 Microsoft Corporation +office + +// okinawa : 2013-12-05 BusinessRalliart Inc. +okinawa + +// olayan : 2015-05-14 Crescent Holding GmbH +olayan + +// olayangroup : 2015-05-14 Crescent Holding GmbH +olayangroup + +// ollo : 2015-06-04 Dish DBS Corporation +ollo + +// omega : 2015-01-08 The Swatch Group Ltd +omega + +// one : 2014-11-07 One.com A/S +one + +// ong : 2014-03-06 Public Interest Registry +ong + +// onl : 2013-09-16 I-Registry Ltd. +onl + +// online : 2015-01-15 DotOnline Inc. +online + +// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED +ooo + +// oracle : 2014-06-19 Oracle Corporation +oracle + +// orange : 2015-03-12 Orange Brand Services Limited +orange + +// organic : 2014-03-27 Afilias Limited +organic + +// orientexpress : 2015-02-05 Belmond Ltd. +orientexpress + +// osaka : 2014-09-04 Interlink Co., Ltd. +osaka + +// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. +otsuka + +// ott : 2015-06-04 Dish DBS Corporation +ott + +// ovh : 2014-01-16 OVH SAS +ovh + +// page : 2014-12-04 Charleston Road Registry Inc. +page + +// pamperedchef : 2015-02-05 The Pampered Chef, Ltd. +pamperedchef + +// panerai : 2014-11-07 Richemont DNS Inc. +panerai + +// paris : 2014-01-30 City of Paris +paris + +// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +pars + +// partners : 2013-12-05 Magic Glen, LLC +partners + +// parts : 2013-12-05 Sea Goodbye, LLC +parts + +// party : 2014-09-11 Blue Sky Registry Limited +party + +// passagens : 2015-03-05 Travel Reservations SRL +passagens + +// payu : 2015-02-12 MIH PayU B.V. +payu + +// pccw : 2015-05-14 PCCW Enterprises Limited +pccw + +// pet : 2015-05-07 Afilias plc +pet + +// pharmacy : 2014-06-19 National Association of Boards of Pharmacy +pharmacy + +// philips : 2014-11-07 Koninklijke Philips N.V. +philips + +// photo : 2013-11-14 Uniregistry, Corp. +photo + +// photography : 2013-09-20 Sugar Glen, LLC +photography + +// photos : 2013-10-17 Sea Corner, LLC +photos + +// physio : 2014-05-01 PhysBiz Pty Ltd +physio + +// piaget : 2014-10-16 Richemont DNS Inc. +piaget + +// pics : 2013-11-14 Uniregistry, Corp. +pics + +// pictet : 2014-06-26 Pictet Europe S.A. +pictet + +// pictures : 2014-03-06 Foggy Sky, LLC +pictures + +// pid : 2015-01-08 Top Level Spectrum, Inc. +pid + +// pin : 2014-12-18 Amazon EU S.à r.l. +pin + +// ping : 2015-06-11 Ping Registry Provider, Inc. +ping + +// pink : 2013-10-01 Afilias Limited +pink + +// pizza : 2014-06-26 Foggy Moon, LLC +pizza + +// place : 2014-04-24 Snow Galley, LLC +place + +// play : 2015-03-05 Charleston Road Registry Inc. +play + +// playstation : 2015-07-02 Sony Computer Entertainment Inc. +playstation + +// plumbing : 2013-09-10 Spring Tigers, LLC +plumbing + +// plus : 2015-02-05 Sugar Mill, LLC +plus + +// pnc : 2015-07-02 PNC Domain Co., LLC +pnc + +// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +pohl + +// poker : 2014-07-03 Afilias Domains No. 5 Limited +poker + +// porn : 2014-10-16 ICM Registry PN LLC +porn + +// praxi : 2013-12-05 Praxi S.p.A. +praxi + +// press : 2014-04-03 DotPress Inc. +press + +// prime : 2015-06-25 Amazon EU S.à r.l. +prime + +// prod : 2014-01-23 Charleston Road Registry Inc. +prod + +// productions : 2013-12-05 Magic Birch, LLC +productions + +// prof : 2014-07-24 Charleston Road Registry Inc. +prof + +// promo : 2014-12-18 Play.PROMO Oy +promo + +// properties : 2013-12-05 Big Pass, LLC +properties + +// property : 2014-05-22 Uniregistry, Corp. +property + +// protection : 2015-04-23 +protection + +// pub : 2013-12-12 United TLD Holdco Ltd. +pub + +// qpon : 2013-11-14 dotCOOL, Inc. +qpon + +// quebec : 2013-12-19 PointQuébec Inc +quebec + +// quest : 2015-03-26 Quest ION Limited +quest + +// racing : 2014-12-04 Premier Registry Limited +racing + +// read : 2014-12-18 Amazon EU S.à r.l. +read + +// realtor : 2014-05-29 Real Estate Domains LLC +realtor + +// realty : 2015-03-19 Fegistry, LLC +realty + +// recipes : 2013-10-17 Grand Island, LLC +recipes + +// red : 2013-11-07 Afilias Limited +red + +// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. +redstone + +// redumbrella : 2015-03-26 Travelers TLD, LLC +redumbrella + +// rehab : 2014-03-06 United TLD Holdco Ltd. +rehab + +// reise : 2014-03-13 +reise + +// reisen : 2014-03-06 New Cypress, LLC +reisen + +// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. +reit + +// reliance : 2015-04-02 Reliance Industries Limited +reliance + +// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd. +ren + +// rent : 2014-12-04 DERRent, LLC +rent + +// rentals : 2013-12-05 Big Hollow,LLC +rentals + +// repair : 2013-11-07 Lone Sunset, LLC +repair + +// report : 2013-12-05 Binky Glen, LLC +report + +// republican : 2014-03-20 United TLD Holdco Ltd. +republican + +// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +rest + +// restaurant : 2014-07-03 Snow Avenue, LLC +restaurant + +// review : 2014-11-20 dot Review Limited +review + +// reviews : 2013-09-13 +reviews + +// rexroth : 2015-06-18 Robert Bosch GMBH +rexroth + +// rich : 2013-11-21 I-Registry Ltd. +rich + +// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited +richardli + +// ricoh : 2014-11-20 Ricoh Company, Ltd. +ricoh + +// ril : 2015-04-02 Reliance Industries Limited +ril + +// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO +rio + +// rip : 2014-07-10 United TLD Holdco Ltd. +rip + +// rocher : 2014-12-18 Ferrero Trading Lux S.A. +rocher + +// rocks : 2013-11-14 +rocks + +// rodeo : 2013-12-19 Top Level Domain Holdings Limited +rodeo + +// room : 2014-12-18 Amazon EU S.à r.l. +room + +// rsvp : 2014-05-08 Charleston Road Registry Inc. +rsvp + +// ruhr : 2013-10-02 regiodot GmbH & Co. KG +ruhr + +// run : 2015-03-19 Snow Park, LLC +run + +// rwe : 2015-04-02 RWE AG +rwe + +// ryukyu : 2014-01-09 BusinessRalliart Inc. +ryukyu + +// saarland : 2013-12-12 dotSaarland GmbH +saarland + +// safe : 2014-12-18 Amazon EU S.à r.l. +safe + +// safety : 2015-01-08 Safety Registry Services, LLC. +safety + +// sakura : 2014-12-18 SAKURA Internet Inc. +sakura + +// sale : 2014-10-16 +sale + +// salon : 2014-12-11 Outer Orchard, LLC +salon + +// samsung : 2014-04-03 SAMSUNG SDS CO., LTD +samsung + +// sandvik : 2014-11-13 Sandvik AB +sandvik + +// sandvikcoromant : 2014-11-07 Sandvik AB +sandvikcoromant + +// sanofi : 2014-10-09 Sanofi +sanofi + +// sap : 2014-03-27 SAP AG +sap + +// sapo : 2014-11-07 PT Comunicacoes S.A. +sapo + +// sarl : 2014-07-03 Delta Orchard, LLC +sarl + +// sas : 2015-04-02 Research IP LLC +sas + +// save : 2015-06-25 Amazon EU S.à r.l. +save + +// saxo : 2014-10-31 Saxo Bank A/S +saxo + +// sbi : 2015-03-12 STATE BANK OF INDIA +sbi + +// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION +sbs + +// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) +sca + +// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") +scb + +// schmidt : 2014-04-03 SALM S.A.S. +schmidt + +// scholarships : 2014-04-24 Scholarships.com, LLC +scholarships + +// school : 2014-12-18 Little Galley, LLC +school + +// schule : 2014-03-06 Outer Moon, LLC +schule + +// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +schwarz + +// science : 2014-09-11 dot Science Limited +science + +// scor : 2014-10-31 SCOR SE +scor + +// scot : 2014-01-23 Dot Scot Registry Limited +scot + +// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) +seat + +// security : 2015-05-14 Symantec Corporation +security + +// seek : 2014-12-04 Seek Limited +seek + +// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. +sener + +// services : 2014-02-27 Fox Castle, LLC +services + +// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG +sew + +// sex : 2014-11-13 ICM Registry SX LLC +sex + +// sexy : 2013-09-11 Uniregistry, Corp. +sexy + +// sharp : 2014-05-01 Sharp Corporation +sharp + +// shaw : 2015-04-23 Shaw Cablesystems G.P. +shaw + +// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +shia + +// shiksha : 2013-11-14 Afilias Limited +shiksha + +// shoes : 2013-10-02 Binky Galley, LLC +shoes + +// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +shouji + +// show : 2015-03-05 Snow Beach, LLC +show + +// shriram : 2014-01-23 Shriram Capital Ltd. +shriram + +// silk : 2015-06-25 Amazon EU S.à r.l. +silk + +// sina : 2015-03-12 Sina Corporation +sina + +// singles : 2013-08-27 Fern Madison, LLC +singles + +// site : 2015-01-15 DotSite Inc. +site + +// ski : 2015-04-09 STARTING DOT LIMITED +ski + +// skin : 2015-01-15 L'Oréal +skin + +// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch +sky + +// skype : 2014-12-18 Microsoft Corporation +skype + +// smile : 2014-12-18 Amazon EU S.à r.l. +smile + +// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F +sncf + +// soccer : 2015-03-26 Foggy Shadow, LLC +soccer + +// social : 2013-11-07 United TLD Holdco Ltd. +social + +// softbank : 2015-07-02 SoftBank Corp. +softbank + +// software : 2014-03-20 +software + +// sohu : 2013-12-19 Sohu.com Limited +sohu + +// solar : 2013-11-07 Ruby Town, LLC +solar + +// solutions : 2013-11-07 Silver Cover, LLC +solutions + +// song : 2015-02-26 Amazon EU S.à r.l. +song + +// sony : 2015-01-08 Sony Corporation +sony + +// soy : 2014-01-23 Charleston Road Registry Inc. +soy + +// space : 2014-04-03 DotSpace Inc. +space + +// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG +spiegel + +// spot : 2015-02-26 Amazon EU S.à r.l. +spot + +// spreadbetting : 2014-12-11 IG Group Holdings PLC +spreadbetting + +// srl : 2015-05-07 mySRL GmbH +srl + +// stada : 2014-11-13 STADA Arzneimittel AG +stada + +// star : 2015-01-08 Star India Private Limited +star + +// starhub : 2015-02-05 StarHub Limited +starhub + +// statebank : 2015-03-12 STATE BANK OF INDIA +statebank + +// statoil : 2014-12-04 Statoil ASA +statoil + +// stc : 2014-10-09 Saudi Telecom Company +stc + +// stcgroup : 2014-10-09 Saudi Telecom Company +stcgroup + +// stockholm : 2014-12-18 Stockholms kommun +stockholm + +// storage : 2014-12-22 Self Storage Company LLC +storage + +// store : 2015-04-09 DotStore Inc. +store + +// studio : 2015-02-11 +studio + +// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD +study + +// style : 2014-12-04 Binky Moon, LLC +style + +// sucks : 2014-12-22 Vox Populi Registry Inc. +sucks + +// supersport : 2015-03-05 SuperSport International Holdings Proprietary Limited +supersport + +// supplies : 2013-12-19 Atomic Fields, LLC +supplies + +// supply : 2013-12-19 Half Falls, LLC +supply + +// support : 2013-10-24 Grand Orchard, LLC +support + +// surf : 2014-01-09 Top Level Domain Holdings Limited +surf + +// surgery : 2014-03-20 Tin Avenue, LLC +surgery + +// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION +suzuki + +// swatch : 2015-01-08 The Swatch Group Ltd +swatch + +// swiss : 2014-10-16 Swiss Confederation +swiss + +// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet +sydney + +// symantec : 2014-12-04 Symantec Corporation +symantec + +// systems : 2013-11-07 Dash Cypress, LLC +systems + +// tab : 2014-12-04 Tabcorp Holdings Limited +tab + +// taipei : 2014-07-10 Taipei City Government +taipei + +// talk : 2015-04-09 Amazon EU S.à r.l. +talk + +// taobao : 2015-01-15 Alibaba Group Holding Limited +taobao + +// tatamotors : 2015-03-12 Tata Motors Ltd +tatamotors + +// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +tatar + +// tattoo : 2013-08-30 Uniregistry, Corp. +tattoo + +// tax : 2014-03-20 Storm Orchard, LLC +tax + +// taxi : 2015-03-19 Pine Falls, LLC +taxi + +// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +tci + +// tdk : 2015-06-11 TDK Corporation +tdk + +// team : 2015-03-05 Atomic Lake, LLC +team + +// tech : 2015-01-30 Dot Tech LLC +tech + +// technology : 2013-09-13 Auburn Falls +technology + +// telecity : 2015-02-19 TelecityGroup International Limited +telecity + +// telefonica : 2014-10-16 Telefónica S.A. +telefonica + +// temasek : 2014-08-07 Temasek Holdings (Private) Limited +temasek + +// tennis : 2014-12-04 Cotton Bloom, LLC +tennis + +// teva : 2015-07-02 Teva Pharmaceutical Industries Limited +teva + +// thd : 2015-04-02 Homer TLC, Inc. +thd + +// theater : 2015-03-19 Blue Tigers, LLC +theater + +// theatre : 2015-05-07 +theatre + +// theguardian : 2015-04-30 Guardian News and Media Limited +theguardian + +// tickets : 2015-02-05 Accent Media Limited +tickets + +// tienda : 2013-11-14 Victor Manor, LLC +tienda + +// tiffany : 2015-01-30 Tiffany and Company +tiffany + +// tips : 2013-09-20 Corn Willow, LLC +tips + +// tires : 2014-11-07 Dog Edge, LLC +tires + +// tirol : 2014-04-24 punkt Tirol GmbH +tirol + +// tmall : 2015-01-15 Alibaba Group Holding Limited +tmall + +// today : 2013-09-20 Pearl Woods, LLC +today + +// tokyo : 2013-11-13 GMO Registry, Inc. +tokyo + +// tools : 2013-11-21 Pioneer North, LLC +tools + +// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd. +top + +// toray : 2014-12-18 Toray Industries, Inc. +toray + +// toshiba : 2014-04-10 TOSHIBA Corporation +toshiba + +// tours : 2015-01-22 Sugar Station, LLC +tours + +// town : 2014-03-06 Koko Moon, LLC +town + +// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION +toyota + +// toys : 2014-03-06 Pioneer Orchard, LLC +toys + +// trade : 2014-01-23 Elite Registry Limited +trade + +// trading : 2014-12-11 IG Group Holdings PLC +trading + +// training : 2013-11-07 Wild Willow, LLC +training + +// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +travelchannel + +// travelers : 2015-03-26 Travelers TLD, LLC +travelers + +// travelersinsurance : 2015-03-26 Travelers TLD, LLC +travelersinsurance + +// trust : 2014-10-16 +trust + +// trv : 2015-03-26 Travelers TLD, LLC +trv + +// tube : 2015-06-11 Latin American Telecom LLC +tube + +// tui : 2014-07-03 TUI AG +tui + +// tunes : 2015-02-26 Amazon EU S.à r.l. +tunes + +// tushu : 2014-12-18 Amazon EU S.à r.l. +tushu + +// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED +tvs + +// ubs : 2014-12-11 UBS AG +ubs + +// university : 2014-03-06 Little Station, LLC +university + +// uno : 2013-09-11 Dot Latin LLC +uno + +// uol : 2014-05-01 UBN INTERNET LTDA. +uol + +// ups : 2015-06-25 UPS Market Driver, Inc. +ups + +// vacations : 2013-12-05 Atomic Tigers, LLC +vacations + +// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. +vana + +// vegas : 2014-01-16 Dot Vegas, Inc. +vegas + +// ventures : 2013-08-27 Binky Lake, LLC +ventures + +// versicherung : 2014-03-20 dotversicherung-registry GmbH +versicherung + +// vet : 2014-03-06 +vet + +// viajes : 2013-10-17 Black Madison, LLC +viajes + +// video : 2014-10-16 +video + +// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +vig + +// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. +viking + +// villas : 2013-12-05 New Sky, LLC +villas + +// vin : 2015-06-18 Holly Shadow, LLC +vin + +// vip : 2015-01-22 Minds + Machines Group Limited +vip + +// virgin : 2014-09-25 Virgin Enterprises Limited +virgin + +// vision : 2013-12-05 Koko Station, LLC +vision + +// vista : 2014-09-18 Vistaprint Limited +vista + +// vistaprint : 2014-09-18 Vistaprint Limited +vistaprint + +// viva : 2014-11-07 Saudi Telecom Company +viva + +// vlaanderen : 2014-02-06 DNS.be vzw +vlaanderen + +// vodka : 2013-12-19 Top Level Domain Holdings Limited +vodka + +// volkswagen : 2015-05-14 Volkswagen Group of America Inc. +volkswagen + +// vote : 2013-11-21 Monolith Registry LLC +vote + +// voting : 2013-11-13 Valuetainment Corp. +voting + +// voto : 2013-11-21 Monolith Registry LLC +voto + +// voyage : 2013-08-27 Ruby House, LLC +voyage + +// vuelos : 2015-03-05 Travel Reservations SRL +vuelos + +// wales : 2014-05-08 Nominet UK +wales + +// walter : 2014-11-13 Sandvik AB +walter + +// wang : 2013-10-24 Zodiac Leo Limited +wang + +// wanggou : 2014-12-18 Amazon EU S.à r.l. +wanggou + +// warman : 2015-06-18 Weir Group IP Limited +warman + +// watch : 2013-11-14 Sand Shadow, LLC +watch + +// watches : 2014-12-22 Richemont DNS Inc. +watches + +// weather : 2015-01-08 The Weather Channel, LLC +weather + +// weatherchannel : 2015-03-12 The Weather Channel, LLC +weatherchannel + +// webcam : 2014-01-23 dot Webcam Limited +webcam + +// weber : 2015-06-04 Saint-Gobain Weber SA +weber + +// website : 2014-04-03 DotWebsite Inc. +website + +// wed : 2013-10-01 Atgron, Inc. +wed + +// wedding : 2014-04-24 Top Level Domain Holdings Limited +wedding + +// weibo : 2015-03-05 Sina Corporation +weibo + +// weir : 2015-01-29 Weir Group IP Limited +weir + +// whoswho : 2014-02-20 Who's Who Registry +whoswho + +// wien : 2013-10-28 punkt.wien GmbH +wien + +// wiki : 2013-11-07 Top Level Design, LLC +wiki + +// williamhill : 2014-03-13 William Hill Organization Limited +williamhill + +// win : 2014-11-20 First Registry Limited +win + +// windows : 2014-12-18 Microsoft Corporation +windows + +// wine : 2015-06-18 June Station, LLC +wine + +// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC +wme + +// work : 2013-12-19 Top Level Domain Holdings Limited +work + +// works : 2013-11-14 Little Dynamite, LLC +works + +// world : 2014-06-12 Bitter Fields, LLC +world + +// wtc : 2013-12-19 World Trade Centers Association, Inc. +wtc + +// wtf : 2014-03-06 Hidden Way, LLC +wtf + +// xbox : 2014-12-18 Microsoft Corporation +xbox + +// xerox : 2014-10-24 Xerox DNHC LLC +xerox + +// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +xihuan + +// xin : 2014-12-11 Elegant Leader Limited +xin + +// xn--11b4c3d : 2015-01-15 VeriSign Sarl +कॉम + +// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l. +セール + +// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. +佛山 + +// xn--30rr7y : 2014-06-12 Excellent First Limited +慈善 + +// xn--3bst00m : 2013-09-13 Eagle Horizon Limited +集团 + +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED +在线 + +// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. +大众汽车 + +// xn--3pxu8k : 2015-01-15 VeriSign Sarl +点看 + +// xn--42c2d9a : 2015-01-15 VeriSign Sarl +คอม + +// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited +八卦 + +// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment +موقع + +// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center +公益 + +// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +公司 + +// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited +网站 + +// xn--6frz82g : 2013-09-23 Afilias Limited +移动 + +// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited +我爱你 + +// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +москва + +// xn--80asehdb : 2013-07-14 CORE Association +онлайн + +// xn--80aswg : 2013-07-14 CORE Association +сайт + +// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited +联通 + +// xn--9dbq2a : 2015-01-15 VeriSign Sarl +קום + +// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED +时尚 + +// xn--9krt00a : 2015-03-12 Sina Corporation +微博 + +// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited +淡马锡 + +// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l. +ファッション + +// xn--c1avg : 2013-11-14 Public Interest Registry +орг + +// xn--c2br7g : 2015-01-15 VeriSign Sarl +नेट + +// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l. +ストア + +// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD +삼성 + +// xn--czr694b : 2014-01-16 HU YI GLOBAL INFORMATION RESOURCES (HOLDING) COMPANY.HONGKONG LIMITED +商标 + +// xn--czrs0t : 2013-12-19 Wild Island, LLC +商店 + +// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited +商城 + +// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” +дети + +// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l. +ポイント + +// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch 新华通讯社广东分社 +新闻 + +// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited +工行 + +// xn--fct429k : 2015-04-09 Amazon EU S.à r.l. +家電 + +// xn--fhbei : 2015-01-15 VeriSign Sarl +كوم + +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED +中文网 + +// xn--fiq64b : 2013-10-14 CITIC Group Corporation +中信 + +// xn--fjq720a : 2014-05-22 Will Bloom, LLC +娱乐 + +// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. +谷歌 + +// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited +電訊盈科 + +// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited +购物 + +// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l. +クラウド + +// xn--hxt814e : 2014-05-15 Zodiac Libra Limited +网店 + +// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry +संगठन + +// xn--imr513n : 2014-12-11 HU YI GLOBAL INFORMATION RESOURCES (HOLDING) COMPANY. HONGKONG LIMITED +餐厅 + +// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +网络 + +// xn--j1aef : 2015-01-15 VeriSign Sarl +ком + +// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation +诺基亚 + +// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l. +食品 + +// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. +飞利浦 + +// xn--kpu716f : 2014-12-22 Richemont DNS Inc. +手表 + +// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd +手机 + +// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company +ارامكو + +// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH +العليان + +// xn--mgbab2bd : 2013-10-31 CORE Association +بازار + +// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L. +موبايلي + +// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +همراه + +// xn--mk1bu44c : 2015-01-15 VeriSign Sarl +닷컴 + +// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. +政府 + +// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. +شبكة + +// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House +بيتك + +// xn--nqv7f : 2013-11-14 Public Interest Registry +机构 + +// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry +组织机构 + +// xn--nyqy26a : 2014-11-07 Stable Tone Limited +健康 + +// xn--p1acf : 2013-12-12 Rusnames Limited +рус + +// xn--pbt977c : 2014-12-22 Richemont DNS Inc. +珠宝 + +// xn--pssy2u : 2015-01-15 VeriSign Sarl +大拿 + +// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. +みんな + +// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. +グーグル + +// xn--rhqv96g : 2013-09-11 Stable Tone Limited +世界 + +// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l. +書籍 + +// xn--ses554g : 2014-01-16 +网址 + +// xn--t60b56a : 2015-01-15 VeriSign Sarl +닷넷 + +// xn--tckwe : 2015-01-15 VeriSign Sarl +コム + +// xn--unup4y : 2013-07-14 Spring Fields, LLC +游戏 + +// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberater + +// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberatung + +// xn--vhquv : 2013-08-27 Dash McCook, LLC +企业 + +// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. +信息 + +// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited +嘉里大酒店 + +// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. +广东 + +// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center +政务 + +// xperia : 2015-05-14 Sony Mobile Communications AB +xperia + +// xyz : 2013-12-05 XYZ.COM LLC +xyz + +// yachts : 2014-01-09 DERYachts, LLC +yachts + +// yahoo : 2015-04-02 Yahoo! Domain Services Inc. +yahoo + +// yamaxun : 2014-12-18 Amazon EU S.à r.l. +yamaxun + +// yandex : 2014-04-10 YANDEX, LLC +yandex + +// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +yodobashi + +// yoga : 2014-05-29 Top Level Domain Holdings Limited +yoga + +// yokohama : 2013-12-12 GMO Registry, Inc. +yokohama + +// you : 2015-04-09 Amazon EU S.à r.l. +you + +// youtube : 2014-05-01 Charleston Road Registry Inc. +youtube + +// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +yun + +// zappos : 2015-06-25 Amazon EU S.à r.l. +zappos + +// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) +zara + +// zero : 2014-12-18 Amazon EU S.à r.l. +zero + +// zip : 2014-05-08 Charleston Road Registry Inc. +zip + +// zippo : 2015-07-02 Zadco Company +zippo + +// zone : 2013-11-14 Outer Falls, LLC +zone + +// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) +zuerich + + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== +// (Note: these are in alphabetical order by company name) + +// Amazon CloudFront : https://aws.amazon.com/cloudfront/ +// Submitted by Donavan Miller <donavanm@amazon.com> 2013-03-22 +cloudfront.net + +// Amazon Elastic Compute Cloud: https://aws.amazon.com/ec2/ +// Submitted by Osman Surkatty <osmans@amazon.com> 2014-12-16 +ap-northeast-1.compute.amazonaws.com +ap-southeast-1.compute.amazonaws.com +ap-southeast-2.compute.amazonaws.com +cn-north-1.compute.amazonaws.cn +compute.amazonaws.cn +compute.amazonaws.com +compute-1.amazonaws.com +eu-west-1.compute.amazonaws.com +eu-central-1.compute.amazonaws.com +sa-east-1.compute.amazonaws.com +us-east-1.amazonaws.com +us-gov-west-1.compute.amazonaws.com +us-west-1.compute.amazonaws.com +us-west-2.compute.amazonaws.com +z-1.compute-1.amazonaws.com +z-2.compute-1.amazonaws.com + +// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ +// Submitted by Adam Stein <astein@amazon.com> 2013-04-02 +elasticbeanstalk.com + +// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ +// Submitted by Scott Vidmar <svidmar@amazon.com> 2013-03-27 +elb.amazonaws.com + +// Amazon S3 : https://aws.amazon.com/s3/ +// Submitted by Eric Kinolik <kilo@amazon.com> 2015-04-08 +s3.amazonaws.com +s3-ap-northeast-1.amazonaws.com +s3-ap-southeast-1.amazonaws.com +s3-ap-southeast-2.amazonaws.com +s3-external-1.amazonaws.com +s3-external-2.amazonaws.com +s3-fips-us-gov-west-1.amazonaws.com +s3-eu-central-1.amazonaws.com +s3-eu-west-1.amazonaws.com +s3-sa-east-1.amazonaws.com +s3-us-gov-west-1.amazonaws.com +s3-us-west-1.amazonaws.com +s3-us-west-2.amazonaws.com +s3.cn-north-1.amazonaws.com.cn +s3.eu-central-1.amazonaws.com + +// BetaInABox +// Submitted by adrian@betainabox.com 2012-09-13 +betainabox.com + +// CentralNic : http://www.centralnic.com/names/domains +// Submitted by registry <gavin.brown@centralnic.com> 2012-09-27 +ae.org +ar.com +br.com +cn.com +com.de +com.se +de.com +eu.com +gb.com +gb.net +hu.com +hu.net +jp.net +jpn.com +kr.com +mex.com +no.com +qc.com +ru.com +sa.com +se.com +se.net +uk.com +uk.net +us.com +uy.com +za.bz +za.com + +// Africa.com Web Solutions Ltd : https://registry.africa.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04 +africa.com + +// iDOT Services Limited : http://www.domain.gr.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04 +gr.com + +// Radix FZC : http://domains.in.net +// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04 +in.net + +// US REGISTRY LLC : http://us.org +// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04 +us.org + +// co.com Registry, LLC : https://registry.co.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04 +co.com + +// c.la : http://www.c.la/ +c.la + +// cloudControl : https://www.cloudcontrol.com/ +// Submitted by Tobias Wilken <tw@cloudcontrol.com> 2013-07-23 +cloudcontrolled.com +cloudcontrolapp.com + +// co.ca : http://registry.co.ca/ +co.ca + +// CoDNS B.V. +co.nl +co.no + +// Commerce Guys, SAS +// Submitted by Damien Tournoud <damien@commerceguys.com> 2015-01-22 +*.platform.sh + +// Cupcake : https://cupcake.io/ +// Submitted by Jonathan Rudenberg <jonathan@cupcake.io> 2013-10-08 +cupcake.is + +// DreamHost : http://www.dreamhost.com/ +// Submitted by Andrew Farmer <andrew.farmer@dreamhost.com> 2012-10-02 +dreamhosters.com + +// DuckDNS : http://www.duckdns.org/ +// Submitted by Richard Harper <richard@duckdns.org> 2015-05-17 +duckdns.org + +// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ +dyndns-at-home.com +dyndns-at-work.com +dyndns-blog.com +dyndns-free.com +dyndns-home.com +dyndns-ip.com +dyndns-mail.com +dyndns-office.com +dyndns-pics.com +dyndns-remote.com +dyndns-server.com +dyndns-web.com +dyndns-wiki.com +dyndns-work.com +dyndns.biz +dyndns.info +dyndns.org +dyndns.tv +at-band-camp.net +ath.cx +barrel-of-knowledge.info +barrell-of-knowledge.info +better-than.tv +blogdns.com +blogdns.net +blogdns.org +blogsite.org +boldlygoingnowhere.org +broke-it.net +buyshouses.net +cechire.com +dnsalias.com +dnsalias.net +dnsalias.org +dnsdojo.com +dnsdojo.net +dnsdojo.org +does-it.net +doesntexist.com +doesntexist.org +dontexist.com +dontexist.net +dontexist.org +doomdns.com +doomdns.org +dvrdns.org +dyn-o-saur.com +dynalias.com +dynalias.net +dynalias.org +dynathome.net +dyndns.ws +endofinternet.net +endofinternet.org +endoftheinternet.org +est-a-la-maison.com +est-a-la-masion.com +est-le-patron.com +est-mon-blogueur.com +for-better.biz +for-more.biz +for-our.info +for-some.biz +for-the.biz +forgot.her.name +forgot.his.name +from-ak.com +from-al.com +from-ar.com +from-az.net +from-ca.com +from-co.net +from-ct.com +from-dc.com +from-de.com +from-fl.com +from-ga.com +from-hi.com +from-ia.com +from-id.com +from-il.com +from-in.com +from-ks.com +from-ky.com +from-la.net +from-ma.com +from-md.com +from-me.org +from-mi.com +from-mn.com +from-mo.com +from-ms.com +from-mt.com +from-nc.com +from-nd.com +from-ne.com +from-nh.com +from-nj.com +from-nm.com +from-nv.com +from-ny.net +from-oh.com +from-ok.com +from-or.com +from-pa.com +from-pr.com +from-ri.com +from-sc.com +from-sd.com +from-tn.com +from-tx.com +from-ut.com +from-va.com +from-vt.com +from-wa.com +from-wi.com +from-wv.com +from-wy.com +ftpaccess.cc +fuettertdasnetz.de +game-host.org +game-server.cc +getmyip.com +gets-it.net +go.dyndns.org +gotdns.com +gotdns.org +groks-the.info +groks-this.info +ham-radio-op.net +here-for-more.info +hobby-site.com +hobby-site.org +home.dyndns.org +homedns.org +homeftp.net +homeftp.org +homeip.net +homelinux.com +homelinux.net +homelinux.org +homeunix.com +homeunix.net +homeunix.org +iamallama.com +in-the-band.net +is-a-anarchist.com +is-a-blogger.com +is-a-bookkeeper.com +is-a-bruinsfan.org +is-a-bulls-fan.com +is-a-candidate.org +is-a-caterer.com +is-a-celticsfan.org +is-a-chef.com +is-a-chef.net +is-a-chef.org +is-a-conservative.com +is-a-cpa.com +is-a-cubicle-slave.com +is-a-democrat.com +is-a-designer.com +is-a-doctor.com +is-a-financialadvisor.com +is-a-geek.com +is-a-geek.net +is-a-geek.org +is-a-green.com +is-a-guru.com +is-a-hard-worker.com +is-a-hunter.com +is-a-knight.org +is-a-landscaper.com +is-a-lawyer.com +is-a-liberal.com +is-a-libertarian.com +is-a-linux-user.org +is-a-llama.com +is-a-musician.com +is-a-nascarfan.com +is-a-nurse.com +is-a-painter.com +is-a-patsfan.org +is-a-personaltrainer.com +is-a-photographer.com +is-a-player.com +is-a-republican.com +is-a-rockstar.com +is-a-socialist.com +is-a-soxfan.org +is-a-student.com +is-a-teacher.com +is-a-techie.com +is-a-therapist.com +is-an-accountant.com +is-an-actor.com +is-an-actress.com +is-an-anarchist.com +is-an-artist.com +is-an-engineer.com +is-an-entertainer.com +is-by.us +is-certified.com +is-found.org +is-gone.com +is-into-anime.com +is-into-cars.com +is-into-cartoons.com +is-into-games.com +is-leet.com +is-lost.org +is-not-certified.com +is-saved.org +is-slick.com +is-uberleet.com +is-very-bad.org +is-very-evil.org +is-very-good.org +is-very-nice.org +is-very-sweet.org +is-with-theband.com +isa-geek.com +isa-geek.net +isa-geek.org +isa-hockeynut.com +issmarterthanyou.com +isteingeek.de +istmein.de +kicks-ass.net +kicks-ass.org +knowsitall.info +land-4-sale.us +lebtimnetz.de +leitungsen.de +likes-pie.com +likescandy.com +merseine.nu +mine.nu +misconfused.org +mypets.ws +myphotos.cc +neat-url.com +office-on-the.net +on-the-web.tv +podzone.net +podzone.org +readmyblog.org +saves-the-whales.com +scrapper-site.net +scrapping.cc +selfip.biz +selfip.com +selfip.info +selfip.net +selfip.org +sells-for-less.com +sells-for-u.com +sells-it.net +sellsyourhome.org +servebbs.com +servebbs.net +servebbs.org +serveftp.net +serveftp.org +servegame.org +shacknet.nu +simple-url.com +space-to-rent.com +stuff-4-sale.org +stuff-4-sale.us +teaches-yoga.com +thruhere.net +traeumtgerade.de +webhop.biz +webhop.info +webhop.net +webhop.org +worse-than.tv +writesthisblog.com + +// EU.org https://eu.org/ +// Submitted by Pierre Beyssac <hostmaster@eu.org> 2015-04-17 + +eu.org +al.eu.org +asso.eu.org +at.eu.org +au.eu.org +be.eu.org +bg.eu.org +ca.eu.org +cd.eu.org +ch.eu.org +cn.eu.org +cy.eu.org +cz.eu.org +de.eu.org +dk.eu.org +edu.eu.org +ee.eu.org +es.eu.org +fi.eu.org +fr.eu.org +gr.eu.org +hr.eu.org +hu.eu.org +ie.eu.org +il.eu.org +in.eu.org +int.eu.org +is.eu.org +it.eu.org +jp.eu.org +kr.eu.org +lt.eu.org +lu.eu.org +lv.eu.org +mc.eu.org +me.eu.org +mk.eu.org +mt.eu.org +my.eu.org +net.eu.org +ng.eu.org +nl.eu.org +no.eu.org +nz.eu.org +paris.eu.org +pl.eu.org +pt.eu.org +q-a.eu.org +ro.eu.org +ru.eu.org +se.eu.org +si.eu.org +sk.eu.org +tr.eu.org +uk.eu.org +us.eu.org + +// Fastly Inc. http://www.fastly.com/ +// Submitted by Vladimir Vuksan <vladimir@fastly.com> 2013-05-31 +a.ssl.fastly.net +b.ssl.fastly.net +global.ssl.fastly.net +a.prod.fastly.net +global.prod.fastly.net + +// Firebase, Inc. +// Submitted by Chris Raynor <chris@firebase.com> 2014-01-21 +firebaseapp.com + +// Flynn : https://flynn.io +// Submitted by Jonathan Rudenberg <jonathan@flynn.io> 2014-07-12 +flynnhub.com + +// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains +// Submitted by David Illsley <david.illsley@digital.cabinet-office.gov.uk> 2014-08-28 +service.gov.uk + +// GitHub, Inc. +// Submitted by Ben Toews <btoews@github.com> 2014-02-06 +github.io +githubusercontent.com + +// GlobeHosting, Inc. +// Submitted by Zoltan Egresi <egresi@globehosting.com> 2013-07-12 +ro.com + +// Google, Inc. +// Submitted by Eduardo Vela <evn@google.com> 2014-12-19 +appspot.com +blogspot.ae +blogspot.al +blogspot.am +blogspot.ba +blogspot.be +blogspot.bg +blogspot.bj +blogspot.ca +blogspot.cf +blogspot.ch +blogspot.cl +blogspot.co.at +blogspot.co.id +blogspot.co.il +blogspot.co.ke +blogspot.co.nz +blogspot.co.uk +blogspot.co.za +blogspot.com +blogspot.com.ar +blogspot.com.au +blogspot.com.br +blogspot.com.by +blogspot.com.co +blogspot.com.cy +blogspot.com.ee +blogspot.com.eg +blogspot.com.es +blogspot.com.mt +blogspot.com.ng +blogspot.com.tr +blogspot.com.uy +blogspot.cv +blogspot.cz +blogspot.de +blogspot.dk +blogspot.fi +blogspot.fr +blogspot.gr +blogspot.hk +blogspot.hr +blogspot.hu +blogspot.ie +blogspot.in +blogspot.is +blogspot.it +blogspot.jp +blogspot.kr +blogspot.li +blogspot.lt +blogspot.lu +blogspot.md +blogspot.mk +blogspot.mr +blogspot.mx +blogspot.my +blogspot.nl +blogspot.no +blogspot.pe +blogspot.pt +blogspot.qa +blogspot.re +blogspot.ro +blogspot.rs +blogspot.ru +blogspot.se +blogspot.sg +blogspot.si +blogspot.sk +blogspot.sn +blogspot.td +blogspot.tw +blogspot.ug +blogspot.vn +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +withgoogle.com + +// Heroku : https://www.heroku.com/ +// Submitted by Tom Maher <tmaher@heroku.com> 2013-05-02 +herokuapp.com +herokussl.com + +// iki.fi +// Submitted by Hannu Aronsson <haa@iki.fi> 2009-11-05 +iki.fi + +// info.at : http://www.info.at/ +biz.at +info.at + +// Michau Enterprises Limited : http://www.co.pl/ +co.pl + +// Microsoft : http://microsoft.com +// Submitted by Barry Dorrans <bdorrans@microsoft.com> 2014-01-24 +azurewebsites.net +azure-mobile.net +cloudapp.net + +// Neustar Inc. +// Submitted by Trung Tran <Trung.Tran@neustar.biz> 2015-04-23 +4u.com + +// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ +// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net> 2014-02-02 +nfshost.com + +// NYC.mn : http://www.information.nyc.mn +// Submitted by Matthew Brown <mattbrown@nyc.mn> 2013-03-11 +nyc.mn + +// One Fold Media : http://www.onefoldmedia.com/ +// Submitted by Eddie Jones <eddie@onefoldmedia.com> 2014-06-10 +nid.io + +// Opera Software, A.S.A. +// Submitted by Yngve Pettersen <yngve@opera.com> 2009-11-26 +operaunite.com + +// OutSystems +// Submitted by Duarte Santos <domain-admin@outsystemscloud.com> 2014-03-11 +outsystemscloud.com + +// .pl domains (grandfathered) +art.pl +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry <lendl@nic.at> 2008-06-09 +priv.at + +// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ +// Submitted by Tim Kramer <tkramer@rhcloud.com> 2012-10-24 +rhcloud.com + +// SinaAppEngine : http://sae.sina.com.cn/ +// Submitted by SinaAppEngine <saesupport@sinacloud.com> 2015-02-02 +sinaapp.com +vipsinaapp.com +1kapp.com + +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl + +// UDR Limited : http://www.udr.hk.com +// Submitted by registry <hostmaster@udr.hk.com> 2014-11-07 +hk.com +hk.org +ltd.hk +inc.hk + +// Yola : https://www.yola.com/ +// Submitted by Stefano Rivera <stefano@yola.com> 2014-07-09 +yolasite.com + +// ZaNiC : http://www.za.net/ +// Submitted by registry <hostmaster@nic.za.net> 2009-10-03 +za.net +za.org + +// ===END PRIVATE DOMAINS=== diff --git a/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2015-11-22.dat.txt b/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2015-11-22.dat.txt new file mode 100644 index 000000000..cd4d3a2cf --- /dev/null +++ b/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2015-11-22.dat.txt @@ -0,0 +1,11982 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, +// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. + +// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. + +// ===BEGIN ICANN DOMAINS=== + +// ac : https://en.wikipedia.org/wiki/.ac +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : https://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : https://en.wikipedia.org/wiki/.ae +// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see https://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +freight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : https://en.wikipedia.org/wiki/.am +am + +// ao : https://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : https://en.wikipedia.org/wiki/.aq +aq + +// ar : https://nic.ar/nic-argentina/normativa-vigente +ar +com.ar +edu.ar +gob.ar +gov.ar +int.ar +mil.ar +musica.ar +net.ar +org.ar +tur.ar + +// arpa : https://en.wikipedia.org/wiki/.arpa +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +arpa +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : https://en.wikipedia.org/wiki/.as +as +gov.as + +// asia : https://en.wikipedia.org/wiki/.asia +asia + +// at : https://en.wikipedia.org/wiki/.at +// Confirmed by registry <it@nic.at> 2008-06-17 +at +ac.at +co.at +gv.at +or.at + +// au : https://en.wikipedia.org/wiki/.au +// http://www.auda.org.au/ +au +// 2LDs +com.au +net.au +org.au +edu.au +gov.au +asn.au +id.au +// Historic 2LDs (closed to new registration, but sites still exist) +info.au +conf.au +oz.au +// CGDNs - http://www.cgdn.org.au/ +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +// 3LDs +act.edu.au +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +// act.gov.au Bug 984824 - Removed at request of Greg Tankard +// nsw.gov.au Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au> +// nt.gov.au Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au> +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au + +// aw : https://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : https://en.wikipedia.org/wiki/.ax +ax + +// az : https://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf +ba +com.ba +edu.ba +gov.ba +mil.ba +net.ba +org.ba + +// bb : https://en.wikipedia.org/wiki/.bb +bb +biz.bb +co.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb +tv.bb + +// bd : https://en.wikipedia.org/wiki/.bd +*.bd + +// be : https://en.wikipedia.org/wiki/.be +// Confirmed by registry <tech@dns.be> 2008-06-08 +be +ac.be + +// bf : https://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : https://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : https://en.wikipedia.org/wiki/.bh +bh +com.bh +edu.bh +net.bh +org.bh +gov.bh + +// bi : https://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : https://en.wikipedia.org/wiki/.biz +biz + +// bj : https://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : https://en.wikipedia.org/wiki/.bn +*.bn + +// bo : http://www.nic.bo/ +bo +com.bo +edu.bo +gov.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo + +// br : http://registro.br/dominio/categoria.html +// Submitted by registry <fneves@registro.br> +br +adm.br +adv.br +agr.br +am.br +arq.br +art.br +ato.br +b.br +bio.br +blog.br +bmd.br +cim.br +cng.br +cnt.br +com.br +coop.br +ecn.br +eco.br +edu.br +emp.br +eng.br +esp.br +etc.br +eti.br +far.br +flog.br +fm.br +fnd.br +fot.br +fst.br +g12.br +ggf.br +gov.br +imb.br +ind.br +inf.br +jor.br +jus.br +leg.br +lel.br +mat.br +med.br +mil.br +mp.br +mus.br +net.br +*.nom.br +not.br +ntr.br +odo.br +org.br +ppg.br +pro.br +psc.br +psi.br +qsl.br +radio.br +rec.br +slg.br +srv.br +taxi.br +teo.br +tmp.br +trd.br +tur.br +tv.br +vet.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : https://en.wikipedia.org/wiki/.bt +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt + +// bv : No registrations at this time. +// Submitted by registry <jarle@uninett.no> +bv + +// bw : https://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : https://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : https://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : https://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: https://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : https://en.wikipedia.org/wiki/.cat +cat + +// cc : https://en.wikipedia.org/wiki/.cc +cc + +// cd : https://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : https://en.wikipedia.org/wiki/.cf +cf + +// cg : https://en.wikipedia.org/wiki/.cg +cg + +// ch : https://en.wikipedia.org/wiki/.ch +ch + +// ci : https://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : https://en.wikipedia.org/wiki/.ck +*.ck +!www.ck + +// cl : https://en.wikipedia.org/wiki/.cl +cl +gov.cl +gob.cl +co.cl +mil.cl + +// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 +cm +co.cm +com.cm +gov.cm +net.cm + +// cn : https://en.wikipedia.org/wiki/.cn +// Submitted by registry <tanyaling@cnnic.cn> +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +公司.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : https://en.wikipedia.org/wiki/.co +// Submitted by registry <tecnico@uniandes.edu.co> +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : https://en.wikipedia.org/wiki/.com +com + +// coop : https://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : https://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : https://en.wikipedia.org/wiki/.cv +cv + +// cw : http://www.una.cw/cw_registry/ +// Confirmed by registry <registry@una.net> 2013-03-26 +cw +com.cw +edu.cw +net.cw +org.cw + +// cx : https://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://www.nic.cy/ +// Submitted by registry Panayiotou Fotia <cydns@ucy.ac.cy> +cy +ac.cy +biz.cy +com.cy +ekloges.cy +gov.cy +ltd.cy +name.cy +net.cy +org.cy +parliament.cy +press.cy +pro.cy +tm.cy + +// cz : https://en.wikipedia.org/wiki/.cz +cz + +// de : https://en.wikipedia.org/wiki/.de +// Confirmed by registry <ops@denic.de> (with technical +// reservations) 2008-07-01 +de + +// dj : https://en.wikipedia.org/wiki/.dj +dj + +// dk : https://en.wikipedia.org/wiki/.dk +// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17 +dk + +// dm : https://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : https://en.wikipedia.org/wiki/.do +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do + +// dz : https://en.wikipedia.org/wiki/.dz +dz +com.dz +org.dz +net.dz +gov.dz +edu.dz +asso.dz +pol.dz +art.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry <vabboud@nic.ec> +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +gob.ec +mil.ec + +// edu : https://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : https://en.wikipedia.org/wiki/.eg +eg +com.eg +edu.eg +eun.eg +gov.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg + +// er : https://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : https://en.wikipedia.org/wiki/.et +et +com.et +gov.et +org.et +edu.et +biz.et +name.et +info.et +net.et + +// eu : https://en.wikipedia.org/wiki/.eu +eu + +// fi : https://en.wikipedia.org/wiki/.fi +fi +// aland.fi : https://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi + +// fj : https://en.wikipedia.org/wiki/.fj +*.fj + +// fk : https://en.wikipedia.org/wiki/.fk +*.fk + +// fm : https://en.wikipedia.org/wiki/.fm +fm + +// fo : https://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs +fr +com.fr +asso.fr +nom.fr +prd.fr +presse.fr +tm.fr +// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels +aeroport.fr +assedic.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +gouv.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : https://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry <Damien.Shaw@ja.net> +gb + +// gd : https://en.wikipedia.org/wiki/.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : https://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +gg +co.gg +net.gg +org.gg + +// gh : https://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : https://en.wikipedia.org/wiki/.gl +// http://nic.gl +gl +co.gl +com.gl +edu.gl +net.gl +org.gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry <randy@psg.com> +gn +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : https://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : https://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry <segred@ics.forth.gr> +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : https://en.wikipedia.org/wiki/.gs +gs + +// gt : http://www.gt/politicas_de_registro.html +gt +com.gt +edu.gt +gob.gt +ind.gt +mil.gt +net.gt +org.gt + +// gu : http://gadao.gov.gu/registration.txt +*.gu + +// gw : https://en.wikipedia.org/wiki/.gw +gw + +// gy : https://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +edu.gy +gov.gy +net.gy +org.gy + +// hk : https://www.hkdnr.hk +// Submitted by registry <hk.tech@hkirc.hk> +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +公司.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : https://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry <pasztor@iszt.hu> 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : https://register.pandi.or.id/ +id +ac.id +biz.id +co.id +desa.id +go.id +mil.id +my.id +net.id +or.id +sch.id +web.id + +// ie : https://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://www.isoc.org.il/domains/ +il +ac.il +co.il +gov.il +idf.il +k12.il +muni.il +net.il +org.il + +// im : https://www.nic.im/ +// Submitted by registry <info@nic.im> +im +ac.im +co.im +com.im +ltd.co.im +net.im +org.im +plc.co.im +tt.im +tv.im + +// in : https://en.wikipedia.org/wiki/.in +// see also: https://registry.in/Policies +// Please note, that nic.in is not an official eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : https://en.wikipedia.org/wiki/.info +info + +// int : https://en.wikipedia.org/wiki/.int +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.html +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules +// Also see http://www.nic.ir/Internationalized_Domain_Names +// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16 +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH) +ایران.ir +// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH) +ايران.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry <marius@isgate.is> 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : https://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// Reserved geo-names: +// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf +// There is also a list of reserved geo-names corresponding to Italian municipalities +// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here. +// Regions +abr.it +abruzzo.it +aosta-valley.it +aostavalley.it +bas.it +basilicata.it +cal.it +calabria.it +cam.it +campania.it +emilia-romagna.it +emiliaromagna.it +emr.it +friuli-v-giulia.it +friuli-ve-giulia.it +friuli-vegiulia.it +friuli-venezia-giulia.it +friuli-veneziagiulia.it +friuli-vgiulia.it +friuliv-giulia.it +friulive-giulia.it +friulivegiulia.it +friulivenezia-giulia.it +friuliveneziagiulia.it +friulivgiulia.it +fvg.it +laz.it +lazio.it +lig.it +liguria.it +lom.it +lombardia.it +lombardy.it +lucania.it +mar.it +marche.it +mol.it +molise.it +piedmont.it +piemonte.it +pmn.it +pug.it +puglia.it +sar.it +sardegna.it +sardinia.it +sic.it +sicilia.it +sicily.it +taa.it +tos.it +toscana.it +trentino-a-adige.it +trentino-aadige.it +trentino-alto-adige.it +trentino-altoadige.it +trentino-s-tirol.it +trentino-stirol.it +trentino-sud-tirol.it +trentino-sudtirol.it +trentino-sued-tirol.it +trentino-suedtirol.it +trentinoa-adige.it +trentinoaadige.it +trentinoalto-adige.it +trentinoaltoadige.it +trentinos-tirol.it +trentinostirol.it +trentinosud-tirol.it +trentinosudtirol.it +trentinosued-tirol.it +trentinosuedtirol.it +tuscany.it +umb.it +umbria.it +val-d-aosta.it +val-daosta.it +vald-aosta.it +valdaosta.it +valle-aosta.it +valle-d-aosta.it +valle-daosta.it +valleaosta.it +valled-aosta.it +valledaosta.it +vallee-aoste.it +valleeaoste.it +vao.it +vda.it +ven.it +veneto.it +// Provinces +ag.it +agrigento.it +al.it +alessandria.it +alto-adige.it +altoadige.it +an.it +ancona.it +andria-barletta-trani.it +andria-trani-barletta.it +andriabarlettatrani.it +andriatranibarletta.it +ao.it +aosta.it +aoste.it +ap.it +aq.it +aquila.it +ar.it +arezzo.it +ascoli-piceno.it +ascolipiceno.it +asti.it +at.it +av.it +avellino.it +ba.it +balsan.it +bari.it +barletta-trani-andria.it +barlettatraniandria.it +belluno.it +benevento.it +bergamo.it +bg.it +bi.it +biella.it +bl.it +bn.it +bo.it +bologna.it +bolzano.it +bozen.it +br.it +brescia.it +brindisi.it +bs.it +bt.it +bz.it +ca.it +cagliari.it +caltanissetta.it +campidano-medio.it +campidanomedio.it +campobasso.it +carbonia-iglesias.it +carboniaiglesias.it +carrara-massa.it +carraramassa.it +caserta.it +catania.it +catanzaro.it +cb.it +ce.it +cesena-forli.it +cesenaforli.it +ch.it +chieti.it +ci.it +cl.it +cn.it +co.it +como.it +cosenza.it +cr.it +cremona.it +crotone.it +cs.it +ct.it +cuneo.it +cz.it +dell-ogliastra.it +dellogliastra.it +en.it +enna.it +fc.it +fe.it +fermo.it +ferrara.it +fg.it +fi.it +firenze.it +florence.it +fm.it +foggia.it +forli-cesena.it +forlicesena.it +fr.it +frosinone.it +ge.it +genoa.it +genova.it +go.it +gorizia.it +gr.it +grosseto.it +iglesias-carbonia.it +iglesiascarbonia.it +im.it +imperia.it +is.it +isernia.it +kr.it +la-spezia.it +laquila.it +laspezia.it +latina.it +lc.it +le.it +lecce.it +lecco.it +li.it +livorno.it +lo.it +lodi.it +lt.it +lu.it +lucca.it +macerata.it +mantova.it +massa-carrara.it +massacarrara.it +matera.it +mb.it +mc.it +me.it +medio-campidano.it +mediocampidano.it +messina.it +mi.it +milan.it +milano.it +mn.it +mo.it +modena.it +monza-brianza.it +monza-e-della-brianza.it +monza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +ms.it +mt.it +na.it +naples.it +napoli.it +no.it +novara.it +nu.it +nuoro.it +og.it +ogliastra.it +olbia-tempio.it +olbiatempio.it +or.it +oristano.it +ot.it +pa.it +padova.it +padua.it +palermo.it +parma.it +pavia.it +pc.it +pd.it +pe.it +perugia.it +pesaro-urbino.it +pesarourbino.it +pescara.it +pg.it +pi.it +piacenza.it +pisa.it +pistoia.it +pn.it +po.it +pordenone.it +potenza.it +pr.it +prato.it +pt.it +pu.it +pv.it +pz.it +ra.it +ragusa.it +ravenna.it +rc.it +re.it +reggio-calabria.it +reggio-emilia.it +reggiocalabria.it +reggioemilia.it +rg.it +ri.it +rieti.it +rimini.it +rm.it +rn.it +ro.it +roma.it +rome.it +rovigo.it +sa.it +salerno.it +sassari.it +savona.it +si.it +siena.it +siracusa.it +so.it +sondrio.it +sp.it +sr.it +ss.it +suedtirol.it +sv.it +ta.it +taranto.it +te.it +tempio-olbia.it +tempioolbia.it +teramo.it +terni.it +tn.it +to.it +torino.it +tp.it +tr.it +trani-andria-barletta.it +trani-barletta-andria.it +traniandriabarletta.it +tranibarlettaandria.it +trapani.it +trentino.it +trento.it +treviso.it +trieste.it +ts.it +turin.it +tv.it +ud.it +udine.it +urbino-pesaro.it +urbinopesaro.it +va.it +varese.it +vb.it +vc.it +ve.it +venezia.it +venice.it +verbania.it +vercelli.it +verona.it +vi.it +vibo-valentia.it +vibovalentia.it +vicenza.it +viterbo.it +vr.it +vs.it +vt.it +vv.it + +// je : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +je +co.je +net.je +org.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : https://en.wikipedia.org/wiki/.jobs +jobs + +// jp : https://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry <info@jprs.jp> +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp prefecture type names +aichi.jp +akita.jp +aomori.jp +chiba.jp +ehime.jp +fukui.jp +fukuoka.jp +fukushima.jp +gifu.jp +gunma.jp +hiroshima.jp +hokkaido.jp +hyogo.jp +ibaraki.jp +ishikawa.jp +iwate.jp +kagawa.jp +kagoshima.jp +kanagawa.jp +kochi.jp +kumamoto.jp +kyoto.jp +mie.jp +miyagi.jp +miyazaki.jp +nagano.jp +nagasaki.jp +nara.jp +niigata.jp +oita.jp +okayama.jp +okinawa.jp +osaka.jp +saga.jp +saitama.jp +shiga.jp +shimane.jp +shizuoka.jp +tochigi.jp +tokushima.jp +tokyo.jp +tottori.jp +toyama.jp +wakayama.jp +yamagata.jp +yamaguchi.jp +yamanashi.jp +栃木.jp +愛知.jp +愛媛.jp +兵庫.jp +熊本.jp +茨城.jp +北海道.jp +千葉.jp +和歌山.jp +長崎.jp +長野.jp +新潟.jp +青森.jp +静岡.jp +東京.jp +石川.jp +埼玉.jp +三重.jp +京都.jp +佐賀.jp +大分.jp +大阪.jp +奈良.jp +宮城.jp +宮崎.jp +富山.jp +山口.jp +山形.jp +山梨.jp +岩手.jp +岐阜.jp +岡山.jp +島根.jp +広島.jp +徳島.jp +沖縄.jp +滋賀.jp +神奈川.jp +福井.jp +福岡.jp +福島.jp +秋田.jp +群馬.jp +香川.jp +高知.jp +鳥取.jp +鹿児島.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.nagoya.jp +*.sapporo.jp +*.sendai.jp +*.yokohama.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.nagoya.jp +!city.sapporo.jp +!city.sendai.jp +!city.yokohama.jp +// 4th level registration +aisai.aichi.jp +ama.aichi.jp +anjo.aichi.jp +asuke.aichi.jp +chiryu.aichi.jp +chita.aichi.jp +fuso.aichi.jp +gamagori.aichi.jp +handa.aichi.jp +hazu.aichi.jp +hekinan.aichi.jp +higashiura.aichi.jp +ichinomiya.aichi.jp +inazawa.aichi.jp +inuyama.aichi.jp +isshiki.aichi.jp +iwakura.aichi.jp +kanie.aichi.jp +kariya.aichi.jp +kasugai.aichi.jp +kira.aichi.jp +kiyosu.aichi.jp +komaki.aichi.jp +konan.aichi.jp +kota.aichi.jp +mihama.aichi.jp +miyoshi.aichi.jp +nishio.aichi.jp +nisshin.aichi.jp +obu.aichi.jp +oguchi.aichi.jp +oharu.aichi.jp +okazaki.aichi.jp +owariasahi.aichi.jp +seto.aichi.jp +shikatsu.aichi.jp +shinshiro.aichi.jp +shitara.aichi.jp +tahara.aichi.jp +takahama.aichi.jp +tobishima.aichi.jp +toei.aichi.jp +togo.aichi.jp +tokai.aichi.jp +tokoname.aichi.jp +toyoake.aichi.jp +toyohashi.aichi.jp +toyokawa.aichi.jp +toyone.aichi.jp +toyota.aichi.jp +tsushima.aichi.jp +yatomi.aichi.jp +akita.akita.jp +daisen.akita.jp +fujisato.akita.jp +gojome.akita.jp +hachirogata.akita.jp +happou.akita.jp +higashinaruse.akita.jp +honjo.akita.jp +honjyo.akita.jp +ikawa.akita.jp +kamikoani.akita.jp +kamioka.akita.jp +katagami.akita.jp +kazuno.akita.jp +kitaakita.akita.jp +kosaka.akita.jp +kyowa.akita.jp +misato.akita.jp +mitane.akita.jp +moriyoshi.akita.jp +nikaho.akita.jp +noshiro.akita.jp +odate.akita.jp +oga.akita.jp +ogata.akita.jp +semboku.akita.jp +yokote.akita.jp +yurihonjo.akita.jp +aomori.aomori.jp +gonohe.aomori.jp +hachinohe.aomori.jp +hashikami.aomori.jp +hiranai.aomori.jp +hirosaki.aomori.jp +itayanagi.aomori.jp +kuroishi.aomori.jp +misawa.aomori.jp +mutsu.aomori.jp +nakadomari.aomori.jp +noheji.aomori.jp +oirase.aomori.jp +owani.aomori.jp +rokunohe.aomori.jp +sannohe.aomori.jp +shichinohe.aomori.jp +shingo.aomori.jp +takko.aomori.jp +towada.aomori.jp +tsugaru.aomori.jp +tsuruta.aomori.jp +abiko.chiba.jp +asahi.chiba.jp +chonan.chiba.jp +chosei.chiba.jp +choshi.chiba.jp +chuo.chiba.jp +funabashi.chiba.jp +futtsu.chiba.jp +hanamigawa.chiba.jp +ichihara.chiba.jp +ichikawa.chiba.jp +ichinomiya.chiba.jp +inzai.chiba.jp +isumi.chiba.jp +kamagaya.chiba.jp +kamogawa.chiba.jp +kashiwa.chiba.jp +katori.chiba.jp +katsuura.chiba.jp +kimitsu.chiba.jp +kisarazu.chiba.jp +kozaki.chiba.jp +kujukuri.chiba.jp +kyonan.chiba.jp +matsudo.chiba.jp +midori.chiba.jp +mihama.chiba.jp +minamiboso.chiba.jp +mobara.chiba.jp +mutsuzawa.chiba.jp +nagara.chiba.jp +nagareyama.chiba.jp +narashino.chiba.jp +narita.chiba.jp +noda.chiba.jp +oamishirasato.chiba.jp +omigawa.chiba.jp +onjuku.chiba.jp +otaki.chiba.jp +sakae.chiba.jp +sakura.chiba.jp +shimofusa.chiba.jp +shirako.chiba.jp +shiroi.chiba.jp +shisui.chiba.jp +sodegaura.chiba.jp +sosa.chiba.jp +tako.chiba.jp +tateyama.chiba.jp +togane.chiba.jp +tohnosho.chiba.jp +tomisato.chiba.jp +urayasu.chiba.jp +yachimata.chiba.jp +yachiyo.chiba.jp +yokaichiba.chiba.jp +yokoshibahikari.chiba.jp +yotsukaido.chiba.jp +ainan.ehime.jp +honai.ehime.jp +ikata.ehime.jp +imabari.ehime.jp +iyo.ehime.jp +kamijima.ehime.jp +kihoku.ehime.jp +kumakogen.ehime.jp +masaki.ehime.jp +matsuno.ehime.jp +matsuyama.ehime.jp +namikata.ehime.jp +niihama.ehime.jp +ozu.ehime.jp +saijo.ehime.jp +seiyo.ehime.jp +shikokuchuo.ehime.jp +tobe.ehime.jp +toon.ehime.jp +uchiko.ehime.jp +uwajima.ehime.jp +yawatahama.ehime.jp +echizen.fukui.jp +eiheiji.fukui.jp +fukui.fukui.jp +ikeda.fukui.jp +katsuyama.fukui.jp +mihama.fukui.jp +minamiechizen.fukui.jp +obama.fukui.jp +ohi.fukui.jp +ono.fukui.jp +sabae.fukui.jp +sakai.fukui.jp +takahama.fukui.jp +tsuruga.fukui.jp +wakasa.fukui.jp +ashiya.fukuoka.jp +buzen.fukuoka.jp +chikugo.fukuoka.jp +chikuho.fukuoka.jp +chikujo.fukuoka.jp +chikushino.fukuoka.jp +chikuzen.fukuoka.jp +chuo.fukuoka.jp +dazaifu.fukuoka.jp +fukuchi.fukuoka.jp +hakata.fukuoka.jp +higashi.fukuoka.jp +hirokawa.fukuoka.jp +hisayama.fukuoka.jp +iizuka.fukuoka.jp +inatsuki.fukuoka.jp +kaho.fukuoka.jp +kasuga.fukuoka.jp +kasuya.fukuoka.jp +kawara.fukuoka.jp +keisen.fukuoka.jp +koga.fukuoka.jp +kurate.fukuoka.jp +kurogi.fukuoka.jp +kurume.fukuoka.jp +minami.fukuoka.jp +miyako.fukuoka.jp +miyama.fukuoka.jp +miyawaka.fukuoka.jp +mizumaki.fukuoka.jp +munakata.fukuoka.jp +nakagawa.fukuoka.jp +nakama.fukuoka.jp +nishi.fukuoka.jp +nogata.fukuoka.jp +ogori.fukuoka.jp +okagaki.fukuoka.jp +okawa.fukuoka.jp +oki.fukuoka.jp +omuta.fukuoka.jp +onga.fukuoka.jp +onojo.fukuoka.jp +oto.fukuoka.jp +saigawa.fukuoka.jp +sasaguri.fukuoka.jp +shingu.fukuoka.jp +shinyoshitomi.fukuoka.jp +shonai.fukuoka.jp +soeda.fukuoka.jp +sue.fukuoka.jp +tachiarai.fukuoka.jp +tagawa.fukuoka.jp +takata.fukuoka.jp +toho.fukuoka.jp +toyotsu.fukuoka.jp +tsuiki.fukuoka.jp +ukiha.fukuoka.jp +umi.fukuoka.jp +usui.fukuoka.jp +yamada.fukuoka.jp +yame.fukuoka.jp +yanagawa.fukuoka.jp +yukuhashi.fukuoka.jp +aizubange.fukushima.jp +aizumisato.fukushima.jp +aizuwakamatsu.fukushima.jp +asakawa.fukushima.jp +bandai.fukushima.jp +date.fukushima.jp +fukushima.fukushima.jp +furudono.fukushima.jp +futaba.fukushima.jp +hanawa.fukushima.jp +higashi.fukushima.jp +hirata.fukushima.jp +hirono.fukushima.jp +iitate.fukushima.jp +inawashiro.fukushima.jp +ishikawa.fukushima.jp +iwaki.fukushima.jp +izumizaki.fukushima.jp +kagamiishi.fukushima.jp +kaneyama.fukushima.jp +kawamata.fukushima.jp +kitakata.fukushima.jp +kitashiobara.fukushima.jp +koori.fukushima.jp +koriyama.fukushima.jp +kunimi.fukushima.jp +miharu.fukushima.jp +mishima.fukushima.jp +namie.fukushima.jp +nango.fukushima.jp +nishiaizu.fukushima.jp +nishigo.fukushima.jp +okuma.fukushima.jp +omotego.fukushima.jp +ono.fukushima.jp +otama.fukushima.jp +samegawa.fukushima.jp +shimogo.fukushima.jp +shirakawa.fukushima.jp +showa.fukushima.jp +soma.fukushima.jp +sukagawa.fukushima.jp +taishin.fukushima.jp +tamakawa.fukushima.jp +tanagura.fukushima.jp +tenei.fukushima.jp +yabuki.fukushima.jp +yamato.fukushima.jp +yamatsuri.fukushima.jp +yanaizu.fukushima.jp +yugawa.fukushima.jp +anpachi.gifu.jp +ena.gifu.jp +gifu.gifu.jp +ginan.gifu.jp +godo.gifu.jp +gujo.gifu.jp +hashima.gifu.jp +hichiso.gifu.jp +hida.gifu.jp +higashishirakawa.gifu.jp +ibigawa.gifu.jp +ikeda.gifu.jp +kakamigahara.gifu.jp +kani.gifu.jp +kasahara.gifu.jp +kasamatsu.gifu.jp +kawaue.gifu.jp +kitagata.gifu.jp +mino.gifu.jp +minokamo.gifu.jp +mitake.gifu.jp +mizunami.gifu.jp +motosu.gifu.jp +nakatsugawa.gifu.jp +ogaki.gifu.jp +sakahogi.gifu.jp +seki.gifu.jp +sekigahara.gifu.jp +shirakawa.gifu.jp +tajimi.gifu.jp +takayama.gifu.jp +tarui.gifu.jp +toki.gifu.jp +tomika.gifu.jp +wanouchi.gifu.jp +yamagata.gifu.jp +yaotsu.gifu.jp +yoro.gifu.jp +annaka.gunma.jp +chiyoda.gunma.jp +fujioka.gunma.jp +higashiagatsuma.gunma.jp +isesaki.gunma.jp +itakura.gunma.jp +kanna.gunma.jp +kanra.gunma.jp +katashina.gunma.jp +kawaba.gunma.jp +kiryu.gunma.jp +kusatsu.gunma.jp +maebashi.gunma.jp +meiwa.gunma.jp +midori.gunma.jp +minakami.gunma.jp +naganohara.gunma.jp +nakanojo.gunma.jp +nanmoku.gunma.jp +numata.gunma.jp +oizumi.gunma.jp +ora.gunma.jp +ota.gunma.jp +shibukawa.gunma.jp +shimonita.gunma.jp +shinto.gunma.jp +showa.gunma.jp +takasaki.gunma.jp +takayama.gunma.jp +tamamura.gunma.jp +tatebayashi.gunma.jp +tomioka.gunma.jp +tsukiyono.gunma.jp +tsumagoi.gunma.jp +ueno.gunma.jp +yoshioka.gunma.jp +asaminami.hiroshima.jp +daiwa.hiroshima.jp +etajima.hiroshima.jp +fuchu.hiroshima.jp +fukuyama.hiroshima.jp +hatsukaichi.hiroshima.jp +higashihiroshima.hiroshima.jp +hongo.hiroshima.jp +jinsekikogen.hiroshima.jp +kaita.hiroshima.jp +kui.hiroshima.jp +kumano.hiroshima.jp +kure.hiroshima.jp +mihara.hiroshima.jp +miyoshi.hiroshima.jp +naka.hiroshima.jp +onomichi.hiroshima.jp +osakikamijima.hiroshima.jp +otake.hiroshima.jp +saka.hiroshima.jp +sera.hiroshima.jp +seranishi.hiroshima.jp +shinichi.hiroshima.jp +shobara.hiroshima.jp +takehara.hiroshima.jp +abashiri.hokkaido.jp +abira.hokkaido.jp +aibetsu.hokkaido.jp +akabira.hokkaido.jp +akkeshi.hokkaido.jp +asahikawa.hokkaido.jp +ashibetsu.hokkaido.jp +ashoro.hokkaido.jp +assabu.hokkaido.jp +atsuma.hokkaido.jp +bibai.hokkaido.jp +biei.hokkaido.jp +bifuka.hokkaido.jp +bihoro.hokkaido.jp +biratori.hokkaido.jp +chippubetsu.hokkaido.jp +chitose.hokkaido.jp +date.hokkaido.jp +ebetsu.hokkaido.jp +embetsu.hokkaido.jp +eniwa.hokkaido.jp +erimo.hokkaido.jp +esan.hokkaido.jp +esashi.hokkaido.jp +fukagawa.hokkaido.jp +fukushima.hokkaido.jp +furano.hokkaido.jp +furubira.hokkaido.jp +haboro.hokkaido.jp +hakodate.hokkaido.jp +hamatonbetsu.hokkaido.jp +hidaka.hokkaido.jp +higashikagura.hokkaido.jp +higashikawa.hokkaido.jp +hiroo.hokkaido.jp +hokuryu.hokkaido.jp +hokuto.hokkaido.jp +honbetsu.hokkaido.jp +horokanai.hokkaido.jp +horonobe.hokkaido.jp +ikeda.hokkaido.jp +imakane.hokkaido.jp +ishikari.hokkaido.jp +iwamizawa.hokkaido.jp +iwanai.hokkaido.jp +kamifurano.hokkaido.jp +kamikawa.hokkaido.jp +kamishihoro.hokkaido.jp +kamisunagawa.hokkaido.jp +kamoenai.hokkaido.jp +kayabe.hokkaido.jp +kembuchi.hokkaido.jp +kikonai.hokkaido.jp +kimobetsu.hokkaido.jp +kitahiroshima.hokkaido.jp +kitami.hokkaido.jp +kiyosato.hokkaido.jp +koshimizu.hokkaido.jp +kunneppu.hokkaido.jp +kuriyama.hokkaido.jp +kuromatsunai.hokkaido.jp +kushiro.hokkaido.jp +kutchan.hokkaido.jp +kyowa.hokkaido.jp +mashike.hokkaido.jp +matsumae.hokkaido.jp +mikasa.hokkaido.jp +minamifurano.hokkaido.jp +mombetsu.hokkaido.jp +moseushi.hokkaido.jp +mukawa.hokkaido.jp +muroran.hokkaido.jp +naie.hokkaido.jp +nakagawa.hokkaido.jp +nakasatsunai.hokkaido.jp +nakatombetsu.hokkaido.jp +nanae.hokkaido.jp +nanporo.hokkaido.jp +nayoro.hokkaido.jp +nemuro.hokkaido.jp +niikappu.hokkaido.jp +niki.hokkaido.jp +nishiokoppe.hokkaido.jp +noboribetsu.hokkaido.jp +numata.hokkaido.jp +obihiro.hokkaido.jp +obira.hokkaido.jp +oketo.hokkaido.jp +okoppe.hokkaido.jp +otaru.hokkaido.jp +otobe.hokkaido.jp +otofuke.hokkaido.jp +otoineppu.hokkaido.jp +oumu.hokkaido.jp +ozora.hokkaido.jp +pippu.hokkaido.jp +rankoshi.hokkaido.jp +rebun.hokkaido.jp +rikubetsu.hokkaido.jp +rishiri.hokkaido.jp +rishirifuji.hokkaido.jp +saroma.hokkaido.jp +sarufutsu.hokkaido.jp +shakotan.hokkaido.jp +shari.hokkaido.jp +shibecha.hokkaido.jp +shibetsu.hokkaido.jp +shikabe.hokkaido.jp +shikaoi.hokkaido.jp +shimamaki.hokkaido.jp +shimizu.hokkaido.jp +shimokawa.hokkaido.jp +shinshinotsu.hokkaido.jp +shintoku.hokkaido.jp +shiranuka.hokkaido.jp +shiraoi.hokkaido.jp +shiriuchi.hokkaido.jp +sobetsu.hokkaido.jp +sunagawa.hokkaido.jp +taiki.hokkaido.jp +takasu.hokkaido.jp +takikawa.hokkaido.jp +takinoue.hokkaido.jp +teshikaga.hokkaido.jp +tobetsu.hokkaido.jp +tohma.hokkaido.jp +tomakomai.hokkaido.jp +tomari.hokkaido.jp +toya.hokkaido.jp +toyako.hokkaido.jp +toyotomi.hokkaido.jp +toyoura.hokkaido.jp +tsubetsu.hokkaido.jp +tsukigata.hokkaido.jp +urakawa.hokkaido.jp +urausu.hokkaido.jp +uryu.hokkaido.jp +utashinai.hokkaido.jp +wakkanai.hokkaido.jp +wassamu.hokkaido.jp +yakumo.hokkaido.jp +yoichi.hokkaido.jp +aioi.hyogo.jp +akashi.hyogo.jp +ako.hyogo.jp +amagasaki.hyogo.jp +aogaki.hyogo.jp +asago.hyogo.jp +ashiya.hyogo.jp +awaji.hyogo.jp +fukusaki.hyogo.jp +goshiki.hyogo.jp +harima.hyogo.jp +himeji.hyogo.jp +ichikawa.hyogo.jp +inagawa.hyogo.jp +itami.hyogo.jp +kakogawa.hyogo.jp +kamigori.hyogo.jp +kamikawa.hyogo.jp +kasai.hyogo.jp +kasuga.hyogo.jp +kawanishi.hyogo.jp +miki.hyogo.jp +minamiawaji.hyogo.jp +nishinomiya.hyogo.jp +nishiwaki.hyogo.jp +ono.hyogo.jp +sanda.hyogo.jp +sannan.hyogo.jp +sasayama.hyogo.jp +sayo.hyogo.jp +shingu.hyogo.jp +shinonsen.hyogo.jp +shiso.hyogo.jp +sumoto.hyogo.jp +taishi.hyogo.jp +taka.hyogo.jp +takarazuka.hyogo.jp +takasago.hyogo.jp +takino.hyogo.jp +tamba.hyogo.jp +tatsuno.hyogo.jp +toyooka.hyogo.jp +yabu.hyogo.jp +yashiro.hyogo.jp +yoka.hyogo.jp +yokawa.hyogo.jp +ami.ibaraki.jp +asahi.ibaraki.jp +bando.ibaraki.jp +chikusei.ibaraki.jp +daigo.ibaraki.jp +fujishiro.ibaraki.jp +hitachi.ibaraki.jp +hitachinaka.ibaraki.jp +hitachiomiya.ibaraki.jp +hitachiota.ibaraki.jp +ibaraki.ibaraki.jp +ina.ibaraki.jp +inashiki.ibaraki.jp +itako.ibaraki.jp +iwama.ibaraki.jp +joso.ibaraki.jp +kamisu.ibaraki.jp +kasama.ibaraki.jp +kashima.ibaraki.jp +kasumigaura.ibaraki.jp +koga.ibaraki.jp +miho.ibaraki.jp +mito.ibaraki.jp +moriya.ibaraki.jp +naka.ibaraki.jp +namegata.ibaraki.jp +oarai.ibaraki.jp +ogawa.ibaraki.jp +omitama.ibaraki.jp +ryugasaki.ibaraki.jp +sakai.ibaraki.jp +sakuragawa.ibaraki.jp +shimodate.ibaraki.jp +shimotsuma.ibaraki.jp +shirosato.ibaraki.jp +sowa.ibaraki.jp +suifu.ibaraki.jp +takahagi.ibaraki.jp +tamatsukuri.ibaraki.jp +tokai.ibaraki.jp +tomobe.ibaraki.jp +tone.ibaraki.jp +toride.ibaraki.jp +tsuchiura.ibaraki.jp +tsukuba.ibaraki.jp +uchihara.ibaraki.jp +ushiku.ibaraki.jp +yachiyo.ibaraki.jp +yamagata.ibaraki.jp +yawara.ibaraki.jp +yuki.ibaraki.jp +anamizu.ishikawa.jp +hakui.ishikawa.jp +hakusan.ishikawa.jp +kaga.ishikawa.jp +kahoku.ishikawa.jp +kanazawa.ishikawa.jp +kawakita.ishikawa.jp +komatsu.ishikawa.jp +nakanoto.ishikawa.jp +nanao.ishikawa.jp +nomi.ishikawa.jp +nonoichi.ishikawa.jp +noto.ishikawa.jp +shika.ishikawa.jp +suzu.ishikawa.jp +tsubata.ishikawa.jp +tsurugi.ishikawa.jp +uchinada.ishikawa.jp +wajima.ishikawa.jp +fudai.iwate.jp +fujisawa.iwate.jp +hanamaki.iwate.jp +hiraizumi.iwate.jp +hirono.iwate.jp +ichinohe.iwate.jp +ichinoseki.iwate.jp +iwaizumi.iwate.jp +iwate.iwate.jp +joboji.iwate.jp +kamaishi.iwate.jp +kanegasaki.iwate.jp +karumai.iwate.jp +kawai.iwate.jp +kitakami.iwate.jp +kuji.iwate.jp +kunohe.iwate.jp +kuzumaki.iwate.jp +miyako.iwate.jp +mizusawa.iwate.jp +morioka.iwate.jp +ninohe.iwate.jp +noda.iwate.jp +ofunato.iwate.jp +oshu.iwate.jp +otsuchi.iwate.jp +rikuzentakata.iwate.jp +shiwa.iwate.jp +shizukuishi.iwate.jp +sumita.iwate.jp +tanohata.iwate.jp +tono.iwate.jp +yahaba.iwate.jp +yamada.iwate.jp +ayagawa.kagawa.jp +higashikagawa.kagawa.jp +kanonji.kagawa.jp +kotohira.kagawa.jp +manno.kagawa.jp +marugame.kagawa.jp +mitoyo.kagawa.jp +naoshima.kagawa.jp +sanuki.kagawa.jp +tadotsu.kagawa.jp +takamatsu.kagawa.jp +tonosho.kagawa.jp +uchinomi.kagawa.jp +utazu.kagawa.jp +zentsuji.kagawa.jp +akune.kagoshima.jp +amami.kagoshima.jp +hioki.kagoshima.jp +isa.kagoshima.jp +isen.kagoshima.jp +izumi.kagoshima.jp +kagoshima.kagoshima.jp +kanoya.kagoshima.jp +kawanabe.kagoshima.jp +kinko.kagoshima.jp +kouyama.kagoshima.jp +makurazaki.kagoshima.jp +matsumoto.kagoshima.jp +minamitane.kagoshima.jp +nakatane.kagoshima.jp +nishinoomote.kagoshima.jp +satsumasendai.kagoshima.jp +soo.kagoshima.jp +tarumizu.kagoshima.jp +yusui.kagoshima.jp +aikawa.kanagawa.jp +atsugi.kanagawa.jp +ayase.kanagawa.jp +chigasaki.kanagawa.jp +ebina.kanagawa.jp +fujisawa.kanagawa.jp +hadano.kanagawa.jp +hakone.kanagawa.jp +hiratsuka.kanagawa.jp +isehara.kanagawa.jp +kaisei.kanagawa.jp +kamakura.kanagawa.jp +kiyokawa.kanagawa.jp +matsuda.kanagawa.jp +minamiashigara.kanagawa.jp +miura.kanagawa.jp +nakai.kanagawa.jp +ninomiya.kanagawa.jp +odawara.kanagawa.jp +oi.kanagawa.jp +oiso.kanagawa.jp +sagamihara.kanagawa.jp +samukawa.kanagawa.jp +tsukui.kanagawa.jp +yamakita.kanagawa.jp +yamato.kanagawa.jp +yokosuka.kanagawa.jp +yugawara.kanagawa.jp +zama.kanagawa.jp +zushi.kanagawa.jp +aki.kochi.jp +geisei.kochi.jp +hidaka.kochi.jp +higashitsuno.kochi.jp +ino.kochi.jp +kagami.kochi.jp +kami.kochi.jp +kitagawa.kochi.jp +kochi.kochi.jp +mihara.kochi.jp +motoyama.kochi.jp +muroto.kochi.jp +nahari.kochi.jp +nakamura.kochi.jp +nankoku.kochi.jp +nishitosa.kochi.jp +niyodogawa.kochi.jp +ochi.kochi.jp +okawa.kochi.jp +otoyo.kochi.jp +otsuki.kochi.jp +sakawa.kochi.jp +sukumo.kochi.jp +susaki.kochi.jp +tosa.kochi.jp +tosashimizu.kochi.jp +toyo.kochi.jp +tsuno.kochi.jp +umaji.kochi.jp +yasuda.kochi.jp +yusuhara.kochi.jp +amakusa.kumamoto.jp +arao.kumamoto.jp +aso.kumamoto.jp +choyo.kumamoto.jp +gyokuto.kumamoto.jp +kamiamakusa.kumamoto.jp +kikuchi.kumamoto.jp +kumamoto.kumamoto.jp +mashiki.kumamoto.jp +mifune.kumamoto.jp +minamata.kumamoto.jp +minamioguni.kumamoto.jp +nagasu.kumamoto.jp +nishihara.kumamoto.jp +oguni.kumamoto.jp +ozu.kumamoto.jp +sumoto.kumamoto.jp +takamori.kumamoto.jp +uki.kumamoto.jp +uto.kumamoto.jp +yamaga.kumamoto.jp +yamato.kumamoto.jp +yatsushiro.kumamoto.jp +ayabe.kyoto.jp +fukuchiyama.kyoto.jp +higashiyama.kyoto.jp +ide.kyoto.jp +ine.kyoto.jp +joyo.kyoto.jp +kameoka.kyoto.jp +kamo.kyoto.jp +kita.kyoto.jp +kizu.kyoto.jp +kumiyama.kyoto.jp +kyotamba.kyoto.jp +kyotanabe.kyoto.jp +kyotango.kyoto.jp +maizuru.kyoto.jp +minami.kyoto.jp +minamiyamashiro.kyoto.jp +miyazu.kyoto.jp +muko.kyoto.jp +nagaokakyo.kyoto.jp +nakagyo.kyoto.jp +nantan.kyoto.jp +oyamazaki.kyoto.jp +sakyo.kyoto.jp +seika.kyoto.jp +tanabe.kyoto.jp +uji.kyoto.jp +ujitawara.kyoto.jp +wazuka.kyoto.jp +yamashina.kyoto.jp +yawata.kyoto.jp +asahi.mie.jp +inabe.mie.jp +ise.mie.jp +kameyama.mie.jp +kawagoe.mie.jp +kiho.mie.jp +kisosaki.mie.jp +kiwa.mie.jp +komono.mie.jp +kumano.mie.jp +kuwana.mie.jp +matsusaka.mie.jp +meiwa.mie.jp +mihama.mie.jp +minamiise.mie.jp +misugi.mie.jp +miyama.mie.jp +nabari.mie.jp +shima.mie.jp +suzuka.mie.jp +tado.mie.jp +taiki.mie.jp +taki.mie.jp +tamaki.mie.jp +toba.mie.jp +tsu.mie.jp +udono.mie.jp +ureshino.mie.jp +watarai.mie.jp +yokkaichi.mie.jp +furukawa.miyagi.jp +higashimatsushima.miyagi.jp +ishinomaki.miyagi.jp +iwanuma.miyagi.jp +kakuda.miyagi.jp +kami.miyagi.jp +kawasaki.miyagi.jp +marumori.miyagi.jp +matsushima.miyagi.jp +minamisanriku.miyagi.jp +misato.miyagi.jp +murata.miyagi.jp +natori.miyagi.jp +ogawara.miyagi.jp +ohira.miyagi.jp +onagawa.miyagi.jp +osaki.miyagi.jp +rifu.miyagi.jp +semine.miyagi.jp +shibata.miyagi.jp +shichikashuku.miyagi.jp +shikama.miyagi.jp +shiogama.miyagi.jp +shiroishi.miyagi.jp +tagajo.miyagi.jp +taiwa.miyagi.jp +tome.miyagi.jp +tomiya.miyagi.jp +wakuya.miyagi.jp +watari.miyagi.jp +yamamoto.miyagi.jp +zao.miyagi.jp +aya.miyazaki.jp +ebino.miyazaki.jp +gokase.miyazaki.jp +hyuga.miyazaki.jp +kadogawa.miyazaki.jp +kawaminami.miyazaki.jp +kijo.miyazaki.jp +kitagawa.miyazaki.jp +kitakata.miyazaki.jp +kitaura.miyazaki.jp +kobayashi.miyazaki.jp +kunitomi.miyazaki.jp +kushima.miyazaki.jp +mimata.miyazaki.jp +miyakonojo.miyazaki.jp +miyazaki.miyazaki.jp +morotsuka.miyazaki.jp +nichinan.miyazaki.jp +nishimera.miyazaki.jp +nobeoka.miyazaki.jp +saito.miyazaki.jp +shiiba.miyazaki.jp +shintomi.miyazaki.jp +takaharu.miyazaki.jp +takanabe.miyazaki.jp +takazaki.miyazaki.jp +tsuno.miyazaki.jp +achi.nagano.jp +agematsu.nagano.jp +anan.nagano.jp +aoki.nagano.jp +asahi.nagano.jp +azumino.nagano.jp +chikuhoku.nagano.jp +chikuma.nagano.jp +chino.nagano.jp +fujimi.nagano.jp +hakuba.nagano.jp +hara.nagano.jp +hiraya.nagano.jp +iida.nagano.jp +iijima.nagano.jp +iiyama.nagano.jp +iizuna.nagano.jp +ikeda.nagano.jp +ikusaka.nagano.jp +ina.nagano.jp +karuizawa.nagano.jp +kawakami.nagano.jp +kiso.nagano.jp +kisofukushima.nagano.jp +kitaaiki.nagano.jp +komagane.nagano.jp +komoro.nagano.jp +matsukawa.nagano.jp +matsumoto.nagano.jp +miasa.nagano.jp +minamiaiki.nagano.jp +minamimaki.nagano.jp +minamiminowa.nagano.jp +minowa.nagano.jp +miyada.nagano.jp +miyota.nagano.jp +mochizuki.nagano.jp +nagano.nagano.jp +nagawa.nagano.jp +nagiso.nagano.jp +nakagawa.nagano.jp +nakano.nagano.jp +nozawaonsen.nagano.jp +obuse.nagano.jp +ogawa.nagano.jp +okaya.nagano.jp +omachi.nagano.jp +omi.nagano.jp +ookuwa.nagano.jp +ooshika.nagano.jp +otaki.nagano.jp +otari.nagano.jp +sakae.nagano.jp +sakaki.nagano.jp +saku.nagano.jp +sakuho.nagano.jp +shimosuwa.nagano.jp +shinanomachi.nagano.jp +shiojiri.nagano.jp +suwa.nagano.jp +suzaka.nagano.jp +takagi.nagano.jp +takamori.nagano.jp +takayama.nagano.jp +tateshina.nagano.jp +tatsuno.nagano.jp +togakushi.nagano.jp +togura.nagano.jp +tomi.nagano.jp +ueda.nagano.jp +wada.nagano.jp +yamagata.nagano.jp +yamanouchi.nagano.jp +yasaka.nagano.jp +yasuoka.nagano.jp +chijiwa.nagasaki.jp +futsu.nagasaki.jp +goto.nagasaki.jp +hasami.nagasaki.jp +hirado.nagasaki.jp +iki.nagasaki.jp +isahaya.nagasaki.jp +kawatana.nagasaki.jp +kuchinotsu.nagasaki.jp +matsuura.nagasaki.jp +nagasaki.nagasaki.jp +obama.nagasaki.jp +omura.nagasaki.jp +oseto.nagasaki.jp +saikai.nagasaki.jp +sasebo.nagasaki.jp +seihi.nagasaki.jp +shimabara.nagasaki.jp +shinkamigoto.nagasaki.jp +togitsu.nagasaki.jp +tsushima.nagasaki.jp +unzen.nagasaki.jp +ando.nara.jp +gose.nara.jp +heguri.nara.jp +higashiyoshino.nara.jp +ikaruga.nara.jp +ikoma.nara.jp +kamikitayama.nara.jp +kanmaki.nara.jp +kashiba.nara.jp +kashihara.nara.jp +katsuragi.nara.jp +kawai.nara.jp +kawakami.nara.jp +kawanishi.nara.jp +koryo.nara.jp +kurotaki.nara.jp +mitsue.nara.jp +miyake.nara.jp +nara.nara.jp +nosegawa.nara.jp +oji.nara.jp +ouda.nara.jp +oyodo.nara.jp +sakurai.nara.jp +sango.nara.jp +shimoichi.nara.jp +shimokitayama.nara.jp +shinjo.nara.jp +soni.nara.jp +takatori.nara.jp +tawaramoto.nara.jp +tenkawa.nara.jp +tenri.nara.jp +uda.nara.jp +yamatokoriyama.nara.jp +yamatotakada.nara.jp +yamazoe.nara.jp +yoshino.nara.jp +aga.niigata.jp +agano.niigata.jp +gosen.niigata.jp +itoigawa.niigata.jp +izumozaki.niigata.jp +joetsu.niigata.jp +kamo.niigata.jp +kariwa.niigata.jp +kashiwazaki.niigata.jp +minamiuonuma.niigata.jp +mitsuke.niigata.jp +muika.niigata.jp +murakami.niigata.jp +myoko.niigata.jp +nagaoka.niigata.jp +niigata.niigata.jp +ojiya.niigata.jp +omi.niigata.jp +sado.niigata.jp +sanjo.niigata.jp +seiro.niigata.jp +seirou.niigata.jp +sekikawa.niigata.jp +shibata.niigata.jp +tagami.niigata.jp +tainai.niigata.jp +tochio.niigata.jp +tokamachi.niigata.jp +tsubame.niigata.jp +tsunan.niigata.jp +uonuma.niigata.jp +yahiko.niigata.jp +yoita.niigata.jp +yuzawa.niigata.jp +beppu.oita.jp +bungoono.oita.jp +bungotakada.oita.jp +hasama.oita.jp +hiji.oita.jp +himeshima.oita.jp +hita.oita.jp +kamitsue.oita.jp +kokonoe.oita.jp +kuju.oita.jp +kunisaki.oita.jp +kusu.oita.jp +oita.oita.jp +saiki.oita.jp +taketa.oita.jp +tsukumi.oita.jp +usa.oita.jp +usuki.oita.jp +yufu.oita.jp +akaiwa.okayama.jp +asakuchi.okayama.jp +bizen.okayama.jp +hayashima.okayama.jp +ibara.okayama.jp +kagamino.okayama.jp +kasaoka.okayama.jp +kibichuo.okayama.jp +kumenan.okayama.jp +kurashiki.okayama.jp +maniwa.okayama.jp +misaki.okayama.jp +nagi.okayama.jp +niimi.okayama.jp +nishiawakura.okayama.jp +okayama.okayama.jp +satosho.okayama.jp +setouchi.okayama.jp +shinjo.okayama.jp +shoo.okayama.jp +soja.okayama.jp +takahashi.okayama.jp +tamano.okayama.jp +tsuyama.okayama.jp +wake.okayama.jp +yakage.okayama.jp +aguni.okinawa.jp +ginowan.okinawa.jp +ginoza.okinawa.jp +gushikami.okinawa.jp +haebaru.okinawa.jp +higashi.okinawa.jp +hirara.okinawa.jp +iheya.okinawa.jp +ishigaki.okinawa.jp +ishikawa.okinawa.jp +itoman.okinawa.jp +izena.okinawa.jp +kadena.okinawa.jp +kin.okinawa.jp +kitadaito.okinawa.jp +kitanakagusuku.okinawa.jp +kumejima.okinawa.jp +kunigami.okinawa.jp +minamidaito.okinawa.jp +motobu.okinawa.jp +nago.okinawa.jp +naha.okinawa.jp +nakagusuku.okinawa.jp +nakijin.okinawa.jp +nanjo.okinawa.jp +nishihara.okinawa.jp +ogimi.okinawa.jp +okinawa.okinawa.jp +onna.okinawa.jp +shimoji.okinawa.jp +taketomi.okinawa.jp +tarama.okinawa.jp +tokashiki.okinawa.jp +tomigusuku.okinawa.jp +tonaki.okinawa.jp +urasoe.okinawa.jp +uruma.okinawa.jp +yaese.okinawa.jp +yomitan.okinawa.jp +yonabaru.okinawa.jp +yonaguni.okinawa.jp +zamami.okinawa.jp +abeno.osaka.jp +chihayaakasaka.osaka.jp +chuo.osaka.jp +daito.osaka.jp +fujiidera.osaka.jp +habikino.osaka.jp +hannan.osaka.jp +higashiosaka.osaka.jp +higashisumiyoshi.osaka.jp +higashiyodogawa.osaka.jp +hirakata.osaka.jp +ibaraki.osaka.jp +ikeda.osaka.jp +izumi.osaka.jp +izumiotsu.osaka.jp +izumisano.osaka.jp +kadoma.osaka.jp +kaizuka.osaka.jp +kanan.osaka.jp +kashiwara.osaka.jp +katano.osaka.jp +kawachinagano.osaka.jp +kishiwada.osaka.jp +kita.osaka.jp +kumatori.osaka.jp +matsubara.osaka.jp +minato.osaka.jp +minoh.osaka.jp +misaki.osaka.jp +moriguchi.osaka.jp +neyagawa.osaka.jp +nishi.osaka.jp +nose.osaka.jp +osakasayama.osaka.jp +sakai.osaka.jp +sayama.osaka.jp +sennan.osaka.jp +settsu.osaka.jp +shijonawate.osaka.jp +shimamoto.osaka.jp +suita.osaka.jp +tadaoka.osaka.jp +taishi.osaka.jp +tajiri.osaka.jp +takaishi.osaka.jp +takatsuki.osaka.jp +tondabayashi.osaka.jp +toyonaka.osaka.jp +toyono.osaka.jp +yao.osaka.jp +ariake.saga.jp +arita.saga.jp +fukudomi.saga.jp +genkai.saga.jp +hamatama.saga.jp +hizen.saga.jp +imari.saga.jp +kamimine.saga.jp +kanzaki.saga.jp +karatsu.saga.jp +kashima.saga.jp +kitagata.saga.jp +kitahata.saga.jp +kiyama.saga.jp +kouhoku.saga.jp +kyuragi.saga.jp +nishiarita.saga.jp +ogi.saga.jp +omachi.saga.jp +ouchi.saga.jp +saga.saga.jp +shiroishi.saga.jp +taku.saga.jp +tara.saga.jp +tosu.saga.jp +yoshinogari.saga.jp +arakawa.saitama.jp +asaka.saitama.jp +chichibu.saitama.jp +fujimi.saitama.jp +fujimino.saitama.jp +fukaya.saitama.jp +hanno.saitama.jp +hanyu.saitama.jp +hasuda.saitama.jp +hatogaya.saitama.jp +hatoyama.saitama.jp +hidaka.saitama.jp +higashichichibu.saitama.jp +higashimatsuyama.saitama.jp +honjo.saitama.jp +ina.saitama.jp +iruma.saitama.jp +iwatsuki.saitama.jp +kamiizumi.saitama.jp +kamikawa.saitama.jp +kamisato.saitama.jp +kasukabe.saitama.jp +kawagoe.saitama.jp +kawaguchi.saitama.jp +kawajima.saitama.jp +kazo.saitama.jp +kitamoto.saitama.jp +koshigaya.saitama.jp +kounosu.saitama.jp +kuki.saitama.jp +kumagaya.saitama.jp +matsubushi.saitama.jp +minano.saitama.jp +misato.saitama.jp +miyashiro.saitama.jp +miyoshi.saitama.jp +moroyama.saitama.jp +nagatoro.saitama.jp +namegawa.saitama.jp +niiza.saitama.jp +ogano.saitama.jp +ogawa.saitama.jp +ogose.saitama.jp +okegawa.saitama.jp +omiya.saitama.jp +otaki.saitama.jp +ranzan.saitama.jp +ryokami.saitama.jp +saitama.saitama.jp +sakado.saitama.jp +satte.saitama.jp +sayama.saitama.jp +shiki.saitama.jp +shiraoka.saitama.jp +soka.saitama.jp +sugito.saitama.jp +toda.saitama.jp +tokigawa.saitama.jp +tokorozawa.saitama.jp +tsurugashima.saitama.jp +urawa.saitama.jp +warabi.saitama.jp +yashio.saitama.jp +yokoze.saitama.jp +yono.saitama.jp +yorii.saitama.jp +yoshida.saitama.jp +yoshikawa.saitama.jp +yoshimi.saitama.jp +aisho.shiga.jp +gamo.shiga.jp +higashiomi.shiga.jp +hikone.shiga.jp +koka.shiga.jp +konan.shiga.jp +kosei.shiga.jp +koto.shiga.jp +kusatsu.shiga.jp +maibara.shiga.jp +moriyama.shiga.jp +nagahama.shiga.jp +nishiazai.shiga.jp +notogawa.shiga.jp +omihachiman.shiga.jp +otsu.shiga.jp +ritto.shiga.jp +ryuoh.shiga.jp +takashima.shiga.jp +takatsuki.shiga.jp +torahime.shiga.jp +toyosato.shiga.jp +yasu.shiga.jp +akagi.shimane.jp +ama.shimane.jp +gotsu.shimane.jp +hamada.shimane.jp +higashiizumo.shimane.jp +hikawa.shimane.jp +hikimi.shimane.jp +izumo.shimane.jp +kakinoki.shimane.jp +masuda.shimane.jp +matsue.shimane.jp +misato.shimane.jp +nishinoshima.shimane.jp +ohda.shimane.jp +okinoshima.shimane.jp +okuizumo.shimane.jp +shimane.shimane.jp +tamayu.shimane.jp +tsuwano.shimane.jp +unnan.shimane.jp +yakumo.shimane.jp +yasugi.shimane.jp +yatsuka.shimane.jp +arai.shizuoka.jp +atami.shizuoka.jp +fuji.shizuoka.jp +fujieda.shizuoka.jp +fujikawa.shizuoka.jp +fujinomiya.shizuoka.jp +fukuroi.shizuoka.jp +gotemba.shizuoka.jp +haibara.shizuoka.jp +hamamatsu.shizuoka.jp +higashiizu.shizuoka.jp +ito.shizuoka.jp +iwata.shizuoka.jp +izu.shizuoka.jp +izunokuni.shizuoka.jp +kakegawa.shizuoka.jp +kannami.shizuoka.jp +kawanehon.shizuoka.jp +kawazu.shizuoka.jp +kikugawa.shizuoka.jp +kosai.shizuoka.jp +makinohara.shizuoka.jp +matsuzaki.shizuoka.jp +minamiizu.shizuoka.jp +mishima.shizuoka.jp +morimachi.shizuoka.jp +nishiizu.shizuoka.jp +numazu.shizuoka.jp +omaezaki.shizuoka.jp +shimada.shizuoka.jp +shimizu.shizuoka.jp +shimoda.shizuoka.jp +shizuoka.shizuoka.jp +susono.shizuoka.jp +yaizu.shizuoka.jp +yoshida.shizuoka.jp +ashikaga.tochigi.jp +bato.tochigi.jp +haga.tochigi.jp +ichikai.tochigi.jp +iwafune.tochigi.jp +kaminokawa.tochigi.jp +kanuma.tochigi.jp +karasuyama.tochigi.jp +kuroiso.tochigi.jp +mashiko.tochigi.jp +mibu.tochigi.jp +moka.tochigi.jp +motegi.tochigi.jp +nasu.tochigi.jp +nasushiobara.tochigi.jp +nikko.tochigi.jp +nishikata.tochigi.jp +nogi.tochigi.jp +ohira.tochigi.jp +ohtawara.tochigi.jp +oyama.tochigi.jp +sakura.tochigi.jp +sano.tochigi.jp +shimotsuke.tochigi.jp +shioya.tochigi.jp +takanezawa.tochigi.jp +tochigi.tochigi.jp +tsuga.tochigi.jp +ujiie.tochigi.jp +utsunomiya.tochigi.jp +yaita.tochigi.jp +aizumi.tokushima.jp +anan.tokushima.jp +ichiba.tokushima.jp +itano.tokushima.jp +kainan.tokushima.jp +komatsushima.tokushima.jp +matsushige.tokushima.jp +mima.tokushima.jp +minami.tokushima.jp +miyoshi.tokushima.jp +mugi.tokushima.jp +nakagawa.tokushima.jp +naruto.tokushima.jp +sanagochi.tokushima.jp +shishikui.tokushima.jp +tokushima.tokushima.jp +wajiki.tokushima.jp +adachi.tokyo.jp +akiruno.tokyo.jp +akishima.tokyo.jp +aogashima.tokyo.jp +arakawa.tokyo.jp +bunkyo.tokyo.jp +chiyoda.tokyo.jp +chofu.tokyo.jp +chuo.tokyo.jp +edogawa.tokyo.jp +fuchu.tokyo.jp +fussa.tokyo.jp +hachijo.tokyo.jp +hachioji.tokyo.jp +hamura.tokyo.jp +higashikurume.tokyo.jp +higashimurayama.tokyo.jp +higashiyamato.tokyo.jp +hino.tokyo.jp +hinode.tokyo.jp +hinohara.tokyo.jp +inagi.tokyo.jp +itabashi.tokyo.jp +katsushika.tokyo.jp +kita.tokyo.jp +kiyose.tokyo.jp +kodaira.tokyo.jp +koganei.tokyo.jp +kokubunji.tokyo.jp +komae.tokyo.jp +koto.tokyo.jp +kouzushima.tokyo.jp +kunitachi.tokyo.jp +machida.tokyo.jp +meguro.tokyo.jp +minato.tokyo.jp +mitaka.tokyo.jp +mizuho.tokyo.jp +musashimurayama.tokyo.jp +musashino.tokyo.jp +nakano.tokyo.jp +nerima.tokyo.jp +ogasawara.tokyo.jp +okutama.tokyo.jp +ome.tokyo.jp +oshima.tokyo.jp +ota.tokyo.jp +setagaya.tokyo.jp +shibuya.tokyo.jp +shinagawa.tokyo.jp +shinjuku.tokyo.jp +suginami.tokyo.jp +sumida.tokyo.jp +tachikawa.tokyo.jp +taito.tokyo.jp +tama.tokyo.jp +toshima.tokyo.jp +chizu.tottori.jp +hino.tottori.jp +kawahara.tottori.jp +koge.tottori.jp +kotoura.tottori.jp +misasa.tottori.jp +nanbu.tottori.jp +nichinan.tottori.jp +sakaiminato.tottori.jp +tottori.tottori.jp +wakasa.tottori.jp +yazu.tottori.jp +yonago.tottori.jp +asahi.toyama.jp +fuchu.toyama.jp +fukumitsu.toyama.jp +funahashi.toyama.jp +himi.toyama.jp +imizu.toyama.jp +inami.toyama.jp +johana.toyama.jp +kamiichi.toyama.jp +kurobe.toyama.jp +nakaniikawa.toyama.jp +namerikawa.toyama.jp +nanto.toyama.jp +nyuzen.toyama.jp +oyabe.toyama.jp +taira.toyama.jp +takaoka.toyama.jp +tateyama.toyama.jp +toga.toyama.jp +tonami.toyama.jp +toyama.toyama.jp +unazuki.toyama.jp +uozu.toyama.jp +yamada.toyama.jp +arida.wakayama.jp +aridagawa.wakayama.jp +gobo.wakayama.jp +hashimoto.wakayama.jp +hidaka.wakayama.jp +hirogawa.wakayama.jp +inami.wakayama.jp +iwade.wakayama.jp +kainan.wakayama.jp +kamitonda.wakayama.jp +katsuragi.wakayama.jp +kimino.wakayama.jp +kinokawa.wakayama.jp +kitayama.wakayama.jp +koya.wakayama.jp +koza.wakayama.jp +kozagawa.wakayama.jp +kudoyama.wakayama.jp +kushimoto.wakayama.jp +mihama.wakayama.jp +misato.wakayama.jp +nachikatsuura.wakayama.jp +shingu.wakayama.jp +shirahama.wakayama.jp +taiji.wakayama.jp +tanabe.wakayama.jp +wakayama.wakayama.jp +yuasa.wakayama.jp +yura.wakayama.jp +asahi.yamagata.jp +funagata.yamagata.jp +higashine.yamagata.jp +iide.yamagata.jp +kahoku.yamagata.jp +kaminoyama.yamagata.jp +kaneyama.yamagata.jp +kawanishi.yamagata.jp +mamurogawa.yamagata.jp +mikawa.yamagata.jp +murayama.yamagata.jp +nagai.yamagata.jp +nakayama.yamagata.jp +nanyo.yamagata.jp +nishikawa.yamagata.jp +obanazawa.yamagata.jp +oe.yamagata.jp +oguni.yamagata.jp +ohkura.yamagata.jp +oishida.yamagata.jp +sagae.yamagata.jp +sakata.yamagata.jp +sakegawa.yamagata.jp +shinjo.yamagata.jp +shirataka.yamagata.jp +shonai.yamagata.jp +takahata.yamagata.jp +tendo.yamagata.jp +tozawa.yamagata.jp +tsuruoka.yamagata.jp +yamagata.yamagata.jp +yamanobe.yamagata.jp +yonezawa.yamagata.jp +yuza.yamagata.jp +abu.yamaguchi.jp +hagi.yamaguchi.jp +hikari.yamaguchi.jp +hofu.yamaguchi.jp +iwakuni.yamaguchi.jp +kudamatsu.yamaguchi.jp +mitou.yamaguchi.jp +nagato.yamaguchi.jp +oshima.yamaguchi.jp +shimonoseki.yamaguchi.jp +shunan.yamaguchi.jp +tabuse.yamaguchi.jp +tokuyama.yamaguchi.jp +toyota.yamaguchi.jp +ube.yamaguchi.jp +yuu.yamaguchi.jp +chuo.yamanashi.jp +doshi.yamanashi.jp +fuefuki.yamanashi.jp +fujikawa.yamanashi.jp +fujikawaguchiko.yamanashi.jp +fujiyoshida.yamanashi.jp +hayakawa.yamanashi.jp +hokuto.yamanashi.jp +ichikawamisato.yamanashi.jp +kai.yamanashi.jp +kofu.yamanashi.jp +koshu.yamanashi.jp +kosuge.yamanashi.jp +minami-alps.yamanashi.jp +minobu.yamanashi.jp +nakamichi.yamanashi.jp +nanbu.yamanashi.jp +narusawa.yamanashi.jp +nirasaki.yamanashi.jp +nishikatsura.yamanashi.jp +oshino.yamanashi.jp +otsuki.yamanashi.jp +showa.yamanashi.jp +tabayama.yamanashi.jp +tsuru.yamanashi.jp +uenohara.yamanashi.jp +yamanakako.yamanashi.jp +yamanashi.yamanashi.jp + +// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 +*.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : https://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// https://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : https://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kp : http://www.kcce.kp/en_index.php +kp +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp + +// kr : https://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : https://en.wikipedia.org/wiki/.kw +*.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17 +ky +edu.ky +gov.ky +com.ky +org.ky +net.ky + +// kz : https://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : https://en.wikipedia.org/wiki/.la +// Submitted by registry <gavin.brown@nic.la> +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la + +// lb : https://en.wikipedia.org/wiki/.lb +// Submitted by registry <randy@psg.com> +lb +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : https://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : https://en.wikipedia.org/wiki/.li +li + +// lk : http://www.nic.lk/seclevpr.html +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk +ac.lk + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry <randy@psg.com> +lr +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : https://en.wikipedia.org/wiki/.ls +ls +co.ls +org.ls + +// lt : https://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : https://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : https://en.wikipedia.org/wiki/.md +md + +// me : https://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://nic.mg/nicmg/?page_id=39 +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg +co.mg + +// mh : https://en.wikipedia.org/wiki/.mh +mh + +// mil : https://en.wikipedia.org/wiki/.mil +mil + +// mk : https://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: https://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : https://en.wikipedia.org/wiki/.mm +*.mm + +// mn : https://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : https://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry <dcamacho@saipan.com> 2008-06-17 +mp + +// mq : https://en.wikipedia.org/wiki/.mq +mq + +// mr : https://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf +ms +com.ms +edu.ms +gov.ms +net.ms +org.ms + +// mt : https://www.nic.org.mt/go/policy +// Submitted by registry <help@nic.org.mt> +mt +com.mt +edu.mt +net.mt +org.mt + +// mu : https://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nuernberg.museum +nuremberg.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלים.museum +иком.museum + +// mv : https://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry <farias@nic.mx> +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.net.my/ +my +com.my +net.my +org.my +gov.my +edu.my +mil.my +name.my + +// mz : http://www.uem.mz/ +// Submitted by registry <antonio@uem.mz> +mz +ac.mz +adv.mz +co.mz +edu.mz +gov.mz +mil.mz +net.mz +org.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc + +// ne : https://en.wikipedia.org/wiki/.ne +ne + +// net : https://en.wikipedia.org/wiki/.net +net + +// nf : https://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds +ng +com.ng +edu.ng +gov.ng +i.ng +mil.ng +mobi.ng +name.ng +net.ng +org.ng +sch.ng + +// ni : http://www.nic.ni/ +ni +ac.ni +biz.ni +co.ni +com.ni +edu.ni +gob.ni +in.ni +info.ni +int.ni +mil.ni +net.ni +nom.ni +org.ni +web.ni + +// nl : https://en.wikipedia.org/wiki/.nl +// https://www.sidn.nl/ +// ccTLD for the Netherlands +nl + +// BV.nl will be a registry for dutch BV's (besloten vennootschap) +bv.nl + +// no : http://www.norid.no/regelverk/index.en.html +// The Norwegian registry has declined to notify us of updates. The web pages +// referenced below are the official source of the data. There is also an +// announce mailing list: +// https://postlister.uninett.no/sympa/info/norid-diskusjon +no +// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +mil.no +stat.no +dep.no +kommune.no +herad.no +// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +åkrehamn.no +algard.no +ålgård.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevåg.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +råholt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +åfjord.no +agdenes.no +al.no +ål.no +alesund.no +ålesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +åmli.no +amot.no +åmot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +årdal.no +aremark.no +arendal.no +ås.no +aseral.no +åseral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +åsnes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevåg.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bådåddjå.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +båtsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flå.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskål.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +kråanghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákŋoluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtålen.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hå.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kåfjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaŋgaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindås.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +måsøy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +meråker.no +moareke.no +moåreke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +målselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegård.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +råde.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjåk.no +skodje.no +skanland.no +skånland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snåsa.no +snoasa.no +snaase.no +snåase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +čáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegårshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvågøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vågan.no +voagat.no +vagsoy.no +vågsøy.no +vaga.no +vågå.no +valer.ostfold.no +våler.østfold.no +valer.hedmark.no +våler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Submitted by registry <technician@cenpac.net.nr> +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : https://en.wikipedia.org/wiki/.nu +nu + +// nz : https://en.wikipedia.org/wiki/.nz +// Submitted by registry <jay@nzrs.net.nz> +nz +ac.nz +co.nz +cri.nz +geek.nz +gen.nz +govt.nz +health.nz +iwi.nz +kiwi.nz +maori.nz +mil.nz +māori.nz +net.nz +org.nz +parliament.nz +school.nz + +// om : https://en.wikipedia.org/wiki/.om +om +co.om +com.om +edu.om +gov.om +med.om +museum.om +net.om +org.om +pro.om + +// onion : https://tools.ietf.org/html/rfc7686 +onion + +// org : https://en.wikipedia.org/wiki/.org +org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : https://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry <jed@email.com.ph> +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl http://www.dns.pl/english/index.html +// Submitted by registry +pl +com.pl +net.pl +org.pl +// pl functional domains (http://www.dns.pl/english/index.html) +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +nieruchomosci.pl +nom.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// Government domains +gov.pl +ap.gov.pl +ic.gov.pl +is.gov.pl +us.gov.pl +kmpsp.gov.pl +kppsp.gov.pl +kwpsp.gov.pl +psp.gov.pl +wskr.gov.pl +kwp.gov.pl +mw.gov.pl +ug.gov.pl +um.gov.pl +umig.gov.pl +ugim.gov.pl +upow.gov.pl +uw.gov.pl +starostwo.gov.pl +pa.gov.pl +po.gov.pl +psse.gov.pl +pup.gov.pl +rzgw.gov.pl +sa.gov.pl +so.gov.pl +sr.gov.pl +wsa.gov.pl +sko.gov.pl +uzs.gov.pl +wiih.gov.pl +winb.gov.pl +pinb.gov.pl +wios.gov.pl +witd.gov.pl +wzmiuw.gov.pl +piw.gov.pl +wiw.gov.pl +griw.gov.pl +wif.gov.pl +oum.gov.pl +sdn.gov.pl +zp.gov.pl +uppo.gov.pl +mup.gov.pl +wuoz.gov.pl +konsulat.gov.pl +oirm.gov.pl +// pl regional domains (http://www.dns.pl/english/index.html) +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl + +// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +pm + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// post : https://en.wikipedia.org/wiki/.post +post + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://registry.pro/get-pro +pro +aaa.pro +aca.pro +acct.pro +avocat.pro +bar.pro +cpa.pro +eng.pro +jur.pro +law.pro +med.pro +recht.pro + +// ps : https://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : http://online.dns.pt/dns/start_dns +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : https://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/pautas.html#seccion_9 +// Submitted by registry +py +com.py +coop.py +edu.py +gov.py +mil.py +net.py +org.py + +// qa : http://domains.qa/en/ +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +asso.re +com.re +nom.re + +// ro : http://www.rotld.ro/ +ro +arts.ro +com.ro +firm.ro +info.ro +nom.ro +nt.ro +org.ro +rec.ro +store.ro +tm.ro +www.ro + +// rs : https://www.rnids.rs/en/domains/national-domains +rs +ac.rs +co.rs +edu.rs +gov.rs +in.rs +org.rs + +// ru : https://cctld.ru/en/domains/domens_ru/reserved/ +ru +ac.ru +edu.ru +gov.ru +int.ru +mil.ru +test.ru + +// rw : http://www.nic.rw/cgi-bin/policy.pl +rw +gov.rw +net.rw +edu.rw +ac.rw +com.rw +co.rw +int.rw +mil.rw +gouv.rw + +// sa : http://www.nic.net.sa/ +sa +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry <lee.humphries@telekom.com.sb> +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry <admin@isoc.sd> +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +tv.sd +gov.sd +info.sd + +// se : https://en.wikipedia.org/wiki/.se +// Submitted by registry <patrik.wallstrom@iis.se> +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://www.nic.sh/registrar.html +sh +com.sh +net.sh +gov.sh +org.sh +mil.sh + +// si : https://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry <jarle@uninett.no> +sj + +// sk : https://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry <adam@neoip.com> +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : https://en.wikipedia.org/wiki/.sm +sm + +// sn : https://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// so : http://www.soregistry.com/ +so +com.so +net.so +org.so + +// sr : https://en.wikipedia.org/wiki/.sr +sr + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +gov.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : https://en.wikipedia.org/wiki/.su +su + +// sv : http://www.svnet.org.sv/niveldos.pdf +sv +com.sv +edu.sv +gob.sv +org.sv +red.sv + +// sx : https://en.wikipedia.org/wiki/.sx +// Submitted by registry <jcvignes@openregistry.com> +sx +gov.sx + +// sy : https://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : https://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : https://en.wikipedia.org/wiki/.tc +tc + +// td : https://en.wikipedia.org/wiki/.td +td + +// tel: https://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : https://en.wikipedia.org/wiki/.tf +tf + +// tg : https://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/ +tg + +// th : https://en.wikipedia.org/wiki/.th +// Submitted by registry <krit@thains.co.th> +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.html +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : https://en.wikipedia.org/wiki/.tk +tk + +// tl : https://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/local.html +tm +com.tm +co.tm +org.tm +net.tm +nom.tm +gov.tm +mil.tm +edu.tm + +// tn : https://en.wikipedia.org/wiki/.tn +// http://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +intl.tn +nat.tn +net.tn +org.tn +info.tn +perso.tn +tourism.tn +edunet.tn +rnrt.tn +rns.tn +rnu.tn +mincom.tn +agrinet.tn +defense.tn +turen.tn + +// to : https://en.wikipedia.org/wiki/.to +// Submitted by registry <egullich@colo.to> +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// subTLDs: https://www.nic.tr/forms/eng/policies.pdf +// and: https://www.nic.tr/forms/politikalar.pdf +// Submitted by <mehmetgurevin@gmail.com> +tr +com.tr +info.tr +biz.tr +net.tr +org.tr +web.tr +gen.tr +tv.tr +av.tr +dr.tr +bbs.tr +name.tr +tel.tr +gov.tr +bel.tr +pol.tr +mil.tr +k12.tr +edu.tr +kep.tr + +// Used by Northern Cyprus +nc.tr + +// Used by government agencies of Northern Cyprus +gov.nc.tr + +// travel : https://en.wikipedia.org/wiki/.travel +travel + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : https://en.wikipedia.org/wiki/.tv +// Not listing any 2LDs as reserved since none seem to exist in practice, +// Wikipedia notwithstanding. +tv + +// tw : https://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://www.tznic.or.tz/index.php/domains +// Submitted by registry <manager@tznic.or.tz> +tz +ac.tz +co.tz +go.tz +hotel.tz +info.tz +me.tz +mil.tz +mobi.tz +ne.tz +or.tz +sc.tz +tv.tz + +// ua : https://hostmaster.ua/policy/?ua +// Submitted by registry <dk@cctld.ua> +ua +// ua 2LD +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geographic names +// https://hostmaster.ua/2ld/ +cherkassy.ua +cherkasy.ua +chernigov.ua +chernihiv.ua +chernivtsi.ua +chernovtsy.ua +ck.ua +cn.ua +cr.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +dnipropetrovsk.ua +dominic.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkiv.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +khmelnytskyi.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +krym.ua +ks.ua +kv.ua +kyiv.ua +lg.ua +lt.ua +lugansk.ua +lutsk.ua +lv.ua +lviv.ua +mk.ua +mykolaiv.ua +nikolaev.ua +od.ua +odesa.ua +odessa.ua +pl.ua +poltava.ua +rivne.ua +rovno.ua +rv.ua +sb.ua +sebastopol.ua +sevastopol.ua +sm.ua +sumy.ua +te.ua +ternopil.ua +uz.ua +uzhgorod.ua +vinnica.ua +vinnytsia.ua +vn.ua +volyn.ua +yalta.ua +zaporizhzhe.ua +zaporizhzhia.ua +zhitomir.ua +zhytomyr.ua +zp.ua +zt.ua + +// ug : https://www.registry.co.ug/ +ug +co.ug +or.ug +ac.ug +sc.ug +go.ug +ne.ug +com.ug +org.ug + +// uk : https://en.wikipedia.org/wiki/.uk +// Submitted by registry <Michael.Daly@nominet.org.uk> +uk +ac.uk +co.uk +gov.uk +ltd.uk +me.uk +net.uk +nhs.uk +org.uk +plc.uk +police.uk +*.sch.uk + +// us : https://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are available, or even nothing at all. We include the +// most common ones where it's clear that different sites are different +// entities. +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.de.us +k12.fl.us +k12.ga.us +k12.gu.us +// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov> +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +k12.ri.us +k12.sc.us +// k12.sd.us Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us> +k12.tn.us +k12.tx.us +k12.ut.us +k12.vi.us +k12.vt.us +k12.va.us +k12.wa.us +k12.wi.us +// k12.wv.us Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu> +k12.wy.us +cc.ak.us +cc.al.us +cc.ar.us +cc.as.us +cc.az.us +cc.ca.us +cc.co.us +cc.ct.us +cc.dc.us +cc.de.us +cc.fl.us +cc.ga.us +cc.gu.us +cc.hi.us +cc.ia.us +cc.id.us +cc.il.us +cc.in.us +cc.ks.us +cc.ky.us +cc.la.us +cc.ma.us +cc.md.us +cc.me.us +cc.mi.us +cc.mn.us +cc.mo.us +cc.ms.us +cc.mt.us +cc.nc.us +cc.nd.us +cc.ne.us +cc.nh.us +cc.nj.us +cc.nm.us +cc.nv.us +cc.ny.us +cc.oh.us +cc.ok.us +cc.or.us +cc.pa.us +cc.pr.us +cc.ri.us +cc.sc.us +cc.sd.us +cc.tn.us +cc.tx.us +cc.ut.us +cc.vi.us +cc.vt.us +cc.va.us +cc.wa.us +cc.wi.us +cc.wv.us +cc.wy.us +lib.ak.us +lib.al.us +lib.ar.us +lib.as.us +lib.az.us +lib.ca.us +lib.co.us +lib.ct.us +lib.dc.us +// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore <Ed.Moore@lib.de.us> +lib.fl.us +lib.ga.us +lib.gu.us +lib.hi.us +lib.ia.us +lib.id.us +lib.il.us +lib.in.us +lib.ks.us +lib.ky.us +lib.la.us +lib.ma.us +lib.md.us +lib.me.us +lib.mi.us +lib.mn.us +lib.mo.us +lib.ms.us +lib.mt.us +lib.nc.us +lib.nd.us +lib.ne.us +lib.nh.us +lib.nj.us +lib.nm.us +lib.nv.us +lib.ny.us +lib.oh.us +lib.ok.us +lib.or.us +lib.pa.us +lib.pr.us +lib.ri.us +lib.sc.us +lib.sd.us +lib.tn.us +lib.tx.us +lib.ut.us +lib.vi.us +lib.vt.us +lib.va.us +lib.wa.us +lib.wi.us +// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us> +lib.wy.us +// k12.ma.us contains school districts in Massachusetts. The 4LDs are +// managed independently except for private (PVT), charter (CHTR) and +// parochial (PAROCH) schools. Those are delegated directly to the +// 5LD operators. <k12-ma-hostmaster _ at _ rsuc.gweep.net> +pvt.k12.ma.us +chtr.k12.ma.us +paroch.k12.ma.us + +// uy : http://www.nic.org.uy/ +uy +com.uy +edu.uy +gub.uy +mil.uy +net.uy +org.uy + +// uz : http://www.reg.uz/ +uz +co.uz +com.uz +net.uz +org.uz + +// va : https://en.wikipedia.org/wiki/.va +va + +// vc : https://en.wikipedia.org/wiki/.vc +// Submitted by registry <kshah@ca.afilias.info> +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : https://registro.nic.ve/ +// Submitted by registry +ve +arts.ve +co.ve +com.ve +e12.ve +edu.ve +firm.ve +gob.ve +gov.ve +info.ve +int.ve +mil.ve +net.ve +org.ve +rec.ve +store.ve +tec.ve +web.ve + +// vg : https://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : https://en.wikipedia.org/wiki/.vu +// http://www.vunic.vu/ +vu +com.vu +edu.vu +net.vu +org.vu + +// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +wf + +// ws : https://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +yt + +// IDN ccTLDs +// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then +// U-label, and follow this format: +// // A-Label ("<Latin renderings>", <language name>[, variant info]) : <ISO 3166 ccTLD> +// // [sponsoring org] +// U-Label + +// xn--mgbaam7a8h ("Emerat", Arabic) : AE +// http://nic.ae/english/arabicdomain/rules.jsp +امارات + +// xn--y9a3aq ("hye", Armenian) : AM +// ISOC AM (operated by .am Registry) +հայ + +// xn--54b7fta0cc ("Bangla", Bangla) : BD +বাংলা + +// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY +// Operated by .by registry +бел + +// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中国 + +// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中國 + +// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ +الجزائر + +// xn--wgbh1c ("Egypt/Masr", Arabic) : EG +// http://www.dotmasr.eg/ +مصر + +// xn--e1a4c ("eu", Cyrillic) : EU +ею + +// xn--node ("ge", Georgian Mkhedruli) : GE +გე + +// xn--qxam ("el", Greek) : GR +// Hellenic Ministry of Infrastructure, Transport, and Networks +ελ + +// xn--j6w193g ("Hong Kong", Chinese) : HK +// https://www2.hkirc.hk/register/rules.jsp +香港 + +// xn--h2brj9c ("Bharat", Devanagari) : IN +// India +भारत + +// xn--mgbbh1a71e ("Bharat", Arabic) : IN +// India +بھارت + +// xn--fpcrj9c3d ("Bharat", Telugu) : IN +// India +భారత్ + +// xn--gecrj9c ("Bharat", Gujarati) : IN +// India +ભારત + +// xn--s9brj9c ("Bharat", Gurmukhi) : IN +// India +ਭਾਰਤ + +// xn--45brj9c ("Bharat", Bengali) : IN +// India +ভারত + +// xn--xkc2dl3a5ee0h ("India", Tamil) : IN +// India +இந்தியா + +// xn--mgba3a4f16a ("Iran", Persian) : IR +ایران + +// xn--mgba3a4fra ("Iran", Arabic) : IR +ايران + +// xn--mgbtx2b ("Iraq", Arabic) : IQ +// Communications and Media Commission +عراق + +// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO +// National Information Technology Center (NITC) +// Royal Scientific Society, Al-Jubeiha +الاردن + +// xn--3e0b707e ("Republic of Korea", Hangul) : KR +한국 + +// xn--80ao21a ("Kaz", Kazakh) : KZ +қаз + +// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK +// http://nic.lk +ලංකා + +// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK +// http://nic.lk +இலங்கை + +// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA +المغرب + +// xn--d1alf ("mkd", Macedonian) : MK +// MARnet +мкд + +// xn--l1acc ("mon", Mongolian) : MN +мон + +// xn--mix891f ("Macao", Chinese, Traditional) : MO +// MONIC / HNET Asia (Registry Operator for .mo) +澳門 + +// xn--mix082f ("Macao", Chinese, Simplified) : MO +澳门 + +// xn--mgbx4cd0ab ("Malaysia", Malay) : MY +مليسيا + +// xn--mgb9awbf ("Oman", Arabic) : OM +عمان + +// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK +پاکستان + +// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK +پاكستان + +// xn--ygbi2ammx ("Falasteen", Arabic) : PS +// The Palestinian National Internet Naming Authority (PNINA) +// http://www.pnina.ps +فلسطين + +// xn--90a3ac ("srb", Cyrillic) : RS +// https://www.rnids.rs/en/domains/national-domains +срб +пр.срб +орг.срб +обр.срб +од.срб +упр.срб +ак.срб + +// xn--p1ai ("rf", Russian-Cyrillic) : RU +// http://www.cctld.ru/en/docs/rulesrf.php +рф + +// xn--wgbl6a ("Qatar", Arabic) : QA +// http://www.ict.gov.qa/ +قطر + +// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA +// http://www.nic.net.sa/ +السعودية + +// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA +السعودیة + +// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA +السعودیۃ + +// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA +السعوديه + +// xn--mgbpl2fh ("sudan", Arabic) : SD +// Operated by .sd registry +سودان + +// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG +新加坡 + +// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG +சிங்கப்பூர் + +// xn--ogbpf8fl ("Syria", Arabic) : SY +سورية + +// xn--mgbtf8fl ("Syria", Arabic, variant) : SY +سوريا + +// xn--o3cw4h ("Thai", Thai) : TH +// http://www.thnic.co.th +ไทย +ศึกษา.ไทย +ธุรกิจ.ไทย +รัฐบาล.ไทย +ทหาร.ไทย +เน็ต.ไทย +องค์กร.ไทย + +// xn--pgbs0dh ("Tunisia", Arabic) : TN +// http://nic.tn +تونس + +// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台灣 + +// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台湾 + +// xn--nnx388a ("Taiwan", Chinese, variant) : TW +臺灣 + +// xn--j1amh ("ukr", Cyrillic) : UA +укр + +// xn--mgb2ddes ("AlYemen", Arabic) : YE +اليمن + +// xxx : http://icmregistry.com +xxx + +// ye : http://www.y.net.ye/services/domain_name.htm +*.ye + +// za : http://www.zadna.org.za/content/page/domain-information +ac.za +agric.za +alt.za +co.za +edu.za +gov.za +grondar.za +law.za +mil.za +net.za +ngo.za +nis.za +nom.za +org.za +school.za +tm.za +web.za + +// zm : https://zicta.zm/ +// Submitted by registry <info@zicta.zm> +zm +ac.zm +biz.zm +co.zm +com.zm +edu.zm +gov.zm +info.zm +mil.zm +net.zm +org.zm +sch.zm + +// zw : https://www.potraz.gov.zw/ +// Confirmed by registry <bmtengwa@potraz.gov.zw> 2017-01-25 +zw +ac.zw +co.zw +gov.zw +mil.zw +org.zw + +// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2017-02-23T00:46:09Z + +// aaa : 2015-02-26 American Automobile Association, Inc. +aaa + +// aarp : 2015-05-21 AARP +aarp + +// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V. +abarth + +// abb : 2014-10-24 ABB Ltd +abb + +// abbott : 2014-07-24 Abbott Laboratories, Inc. +abbott + +// abbvie : 2015-07-30 AbbVie Inc. +abbvie + +// abc : 2015-07-30 Disney Enterprises, Inc. +abc + +// able : 2015-06-25 Able Inc. +able + +// abogado : 2014-04-24 Top Level Domain Holdings Limited +abogado + +// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre +abudhabi + +// academy : 2013-11-07 Half Oaks, LLC +academy + +// accenture : 2014-08-15 Accenture plc +accenture + +// accountant : 2014-11-20 dot Accountant Limited +accountant + +// accountants : 2014-03-20 Knob Town, LLC +accountants + +// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG +aco + +// active : 2014-05-01 The Active Network, Inc +active + +// actor : 2013-12-12 United TLD Holdco Ltd. +actor + +// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) +adac + +// ads : 2014-12-04 Charleston Road Registry Inc. +ads + +// adult : 2014-10-16 ICM Registry AD LLC +adult + +// aeg : 2015-03-19 Aktiebolaget Electrolux +aeg + +// aetna : 2015-05-21 Aetna Life Insurance Company +aetna + +// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc. +afamilycompany + +// afl : 2014-10-02 Australian Football League +afl + +// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa +africa + +// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +agakhan + +// agency : 2013-11-14 Steel Falls, LLC +agency + +// aig : 2014-12-18 American International Group, Inc. +aig + +// aigo : 2015-08-06 aigo Digital Technology Co,Ltd. +aigo + +// airbus : 2015-07-30 Airbus S.A.S. +airbus + +// airforce : 2014-03-06 United TLD Holdco Ltd. +airforce + +// airtel : 2014-10-24 Bharti Airtel Limited +airtel + +// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +akdn + +// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V. +alfaromeo + +// alibaba : 2015-01-15 Alibaba Group Holding Limited +alibaba + +// alipay : 2015-01-15 Alibaba Group Holding Limited +alipay + +// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +allfinanz + +// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company +allstate + +// ally : 2015-06-18 Ally Financial Inc. +ally + +// alsace : 2014-07-02 REGION D ALSACE +alsace + +// alstom : 2015-07-30 ALSTOM +alstom + +// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. +americanexpress + +// americanfamily : 2015-07-23 AmFam, Inc. +americanfamily + +// amex : 2015-07-31 American Express Travel Related Services Company, Inc. +amex + +// amfam : 2015-07-23 AmFam, Inc. +amfam + +// amica : 2015-05-28 Amica Mutual Insurance Company +amica + +// amsterdam : 2014-07-24 Gemeente Amsterdam +amsterdam + +// analytics : 2014-12-18 Campus IP LLC +analytics + +// android : 2014-08-07 Charleston Road Registry Inc. +android + +// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +anquan + +// anz : 2015-07-31 Australia and New Zealand Banking Group Limited +anz + +// aol : 2015-09-17 AOL Inc. +aol + +// apartments : 2014-12-11 June Maple, LLC +apartments + +// app : 2015-05-14 Charleston Road Registry Inc. +app + +// apple : 2015-05-14 Apple Inc. +apple + +// aquarelle : 2014-07-24 Aquarelle.com +aquarelle + +// arab : 2015-11-12 League of Arab States +arab + +// aramco : 2014-11-20 Aramco Services Company +aramco + +// archi : 2014-02-06 STARTING DOT LIMITED +archi + +// army : 2014-03-06 United TLD Holdco Ltd. +army + +// art : 2016-03-24 UK Creative Ideas Limited +art + +// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. +arte + +// asda : 2015-07-31 Wal-Mart Stores, Inc. +asda + +// associates : 2014-03-06 Baxter Hill, LLC +associates + +// athleta : 2015-07-30 The Gap, Inc. +athleta + +// attorney : 2014-03-20 +attorney + +// auction : 2014-03-20 +auction + +// audi : 2015-05-21 AUDI Aktiengesellschaft +audi + +// audible : 2015-06-25 Amazon EU S.à r.l. +audible + +// audio : 2014-03-20 Uniregistry, Corp. +audio + +// auspost : 2015-08-13 Australian Postal Corporation +auspost + +// author : 2014-12-18 Amazon EU S.à r.l. +author + +// auto : 2014-11-13 +auto + +// autos : 2014-01-09 DERAutos, LLC +autos + +// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca +avianca + +// aws : 2015-06-25 Amazon EU S.à r.l. +aws + +// axa : 2013-12-19 AXA SA +axa + +// azure : 2014-12-18 Microsoft Corporation +azure + +// baby : 2015-04-09 Johnson & Johnson Services, Inc. +baby + +// baidu : 2015-01-08 Baidu, Inc. +baidu + +// banamex : 2015-07-30 Citigroup Inc. +banamex + +// bananarepublic : 2015-07-31 The Gap, Inc. +bananarepublic + +// band : 2014-06-12 +band + +// bank : 2014-09-25 fTLD Registry Services LLC +bank + +// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +bar + +// barcelona : 2014-07-24 Municipi de Barcelona +barcelona + +// barclaycard : 2014-11-20 Barclays Bank PLC +barclaycard + +// barclays : 2014-11-20 Barclays Bank PLC +barclays + +// barefoot : 2015-06-11 Gallo Vineyards, Inc. +barefoot + +// bargains : 2013-11-14 Half Hallow, LLC +bargains + +// baseball : 2015-10-29 MLB Advanced Media DH, LLC +baseball + +// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) +basketball + +// bauhaus : 2014-04-17 Werkhaus GmbH +bauhaus + +// bayern : 2014-01-23 Bayern Connect GmbH +bayern + +// bbc : 2014-12-18 British Broadcasting Corporation +bbc + +// bbt : 2015-07-23 BB&T Corporation +bbt + +// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +bbva + +// bcg : 2015-04-02 The Boston Consulting Group, Inc. +bcg + +// bcn : 2014-07-24 Municipi de Barcelona +bcn + +// beats : 2015-05-14 Beats Electronics, LLC +beats + +// beauty : 2015-12-03 L'Oréal +beauty + +// beer : 2014-01-09 Top Level Domain Holdings Limited +beer + +// bentley : 2014-12-18 Bentley Motors Limited +bentley + +// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG +berlin + +// best : 2013-12-19 BestTLD Pty Ltd +best + +// bestbuy : 2015-07-31 BBY Solutions, Inc. +bestbuy + +// bet : 2015-05-07 Afilias plc +bet + +// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited +bharti + +// bible : 2014-06-19 American Bible Society +bible + +// bid : 2013-12-19 dot Bid Limited +bid + +// bike : 2013-08-27 Grand Hollow, LLC +bike + +// bing : 2014-12-18 Microsoft Corporation +bing + +// bingo : 2014-12-04 Sand Cedar, LLC +bingo + +// bio : 2014-03-06 STARTING DOT LIMITED +bio + +// black : 2014-01-16 Afilias Limited +black + +// blackfriday : 2014-01-16 Uniregistry, Corp. +blackfriday + +// blanco : 2015-07-16 BLANCO GmbH + Co KG +blanco + +// blockbuster : 2015-07-30 Dish DBS Corporation +blockbuster + +// blog : 2015-05-14 +blog + +// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC +bloomberg + +// blue : 2013-11-07 Afilias Limited +blue + +// bms : 2014-10-30 Bristol-Myers Squibb Company +bms + +// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +bmw + +// bnl : 2014-07-24 Banca Nazionale del Lavoro +bnl + +// bnpparibas : 2014-05-29 BNP Paribas +bnpparibas + +// boats : 2014-12-04 DERBoats, LLC +boats + +// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH +boehringer + +// bofa : 2015-07-31 NMS Services, Inc. +bofa + +// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +bom + +// bond : 2014-06-05 Bond University Limited +bond + +// boo : 2014-01-30 Charleston Road Registry Inc. +boo + +// book : 2015-08-27 Amazon EU S.à r.l. +book + +// booking : 2015-07-16 Booking.com B.V. +booking + +// boots : 2015-01-08 THE BOOTS COMPANY PLC +boots + +// bosch : 2015-06-18 Robert Bosch GMBH +bosch + +// bostik : 2015-05-28 Bostik SA +bostik + +// boston : 2015-12-10 +boston + +// bot : 2014-12-18 Amazon EU S.à r.l. +bot + +// boutique : 2013-11-14 Over Galley, LLC +boutique + +// box : 2015-11-12 NS1 Limited +box + +// bradesco : 2014-12-18 Banco Bradesco S.A. +bradesco + +// bridgestone : 2014-12-18 Bridgestone Corporation +bridgestone + +// broadway : 2014-12-22 Celebrate Broadway, Inc. +broadway + +// broker : 2014-12-11 IG Group Holdings PLC +broker + +// brother : 2015-01-29 Brother Industries, Ltd. +brother + +// brussels : 2014-02-06 DNS.be vzw +brussels + +// budapest : 2013-11-21 Top Level Domain Holdings Limited +budapest + +// bugatti : 2015-07-23 Bugatti International SA +bugatti + +// build : 2013-11-07 Plan Bee LLC +build + +// builders : 2013-11-07 Atomic Madison, LLC +builders + +// business : 2013-11-07 Spring Cross, LLC +business + +// buy : 2014-12-18 Amazon EU S.à r.l. +buy + +// buzz : 2013-10-02 DOTSTRATEGY CO. +buzz + +// bzh : 2014-02-27 Association www.bzh +bzh + +// cab : 2013-10-24 Half Sunset, LLC +cab + +// cafe : 2015-02-11 Pioneer Canyon, LLC +cafe + +// cal : 2014-07-24 Charleston Road Registry Inc. +cal + +// call : 2014-12-18 Amazon EU S.à r.l. +call + +// calvinklein : 2015-07-30 PVH gTLD Holdings LLC +calvinklein + +// cam : 2016-04-21 AC Webconnecting Holding B.V. +cam + +// camera : 2013-08-27 Atomic Maple, LLC +camera + +// camp : 2013-11-07 Delta Dynamite, LLC +camp + +// cancerresearch : 2014-05-15 Australian Cancer Research Foundation +cancerresearch + +// canon : 2014-09-12 Canon Inc. +canon + +// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +capetown + +// capital : 2014-03-06 Delta Mill, LLC +capital + +// capitalone : 2015-08-06 Capital One Financial Corporation +capitalone + +// car : 2015-01-22 +car + +// caravan : 2013-12-12 Caravan International, Inc. +caravan + +// cards : 2013-12-05 Foggy Hollow, LLC +cards + +// care : 2014-03-06 Goose Cross +care + +// career : 2013-10-09 dotCareer LLC +career + +// careers : 2013-10-02 Wild Corner, LLC +careers + +// cars : 2014-11-13 +cars + +// cartier : 2014-06-23 Richemont DNS Inc. +cartier + +// casa : 2013-11-21 Top Level Domain Holdings Limited +casa + +// case : 2015-09-03 CNH Industrial N.V. +case + +// caseih : 2015-09-03 CNH Industrial N.V. +caseih + +// cash : 2014-03-06 Delta Lake, LLC +cash + +// casino : 2014-12-18 Binky Sky, LLC +casino + +// catering : 2013-12-05 New Falls. LLC +catering + +// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +catholic + +// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +cba + +// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. +cbn + +// cbre : 2015-07-02 CBRE, Inc. +cbre + +// cbs : 2015-08-06 CBS Domains Inc. +cbs + +// ceb : 2015-04-09 The Corporate Executive Board Company +ceb + +// center : 2013-11-07 Tin Mill, LLC +center + +// ceo : 2013-11-07 CEOTLD Pty Ltd +ceo + +// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") +cern + +// cfa : 2014-08-28 CFA Institute +cfa + +// cfd : 2014-12-11 IG Group Holdings PLC +cfd + +// chanel : 2015-04-09 Chanel International B.V. +chanel + +// channel : 2014-05-08 Charleston Road Registry Inc. +channel + +// chase : 2015-04-30 JPMorgan Chase & Co. +chase + +// chat : 2014-12-04 Sand Fields, LLC +chat + +// cheap : 2013-11-14 Sand Cover, LLC +cheap + +// chintai : 2015-06-11 CHINTAI Corporation +chintai + +// chloe : 2014-10-16 Richemont DNS Inc. +chloe + +// christmas : 2013-11-21 Uniregistry, Corp. +christmas + +// chrome : 2014-07-24 Charleston Road Registry Inc. +chrome + +// chrysler : 2015-07-30 FCA US LLC. +chrysler + +// church : 2014-02-06 Holly Fields, LLC +church + +// cipriani : 2015-02-19 Hotel Cipriani Srl +cipriani + +// circle : 2014-12-18 Amazon EU S.à r.l. +circle + +// cisco : 2014-12-22 Cisco Technology, Inc. +cisco + +// citadel : 2015-07-23 Citadel Domain LLC +citadel + +// citi : 2015-07-30 Citigroup Inc. +citi + +// citic : 2014-01-09 CITIC Group Corporation +citic + +// city : 2014-05-29 Snow Sky, LLC +city + +// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. +cityeats + +// claims : 2014-03-20 Black Corner, LLC +claims + +// cleaning : 2013-12-05 Fox Shadow, LLC +cleaning + +// click : 2014-06-05 Uniregistry, Corp. +click + +// clinic : 2014-03-20 Goose Park, LLC +clinic + +// clinique : 2015-10-01 The Estée Lauder Companies Inc. +clinique + +// clothing : 2013-08-27 Steel Lake, LLC +clothing + +// cloud : 2015-04-16 ARUBA S.p.A. +cloud + +// club : 2013-11-08 .CLUB DOMAINS, LLC +club + +// clubmed : 2015-06-25 Club Méditerranée S.A. +clubmed + +// coach : 2014-10-09 Koko Island, LLC +coach + +// codes : 2013-10-31 Puff Willow, LLC +codes + +// coffee : 2013-10-17 Trixy Cover, LLC +coffee + +// college : 2014-01-16 XYZ.COM LLC +college + +// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH +cologne + +// comcast : 2015-07-23 Comcast IP Holdings I, LLC +comcast + +// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +commbank + +// community : 2013-12-05 Fox Orchard, LLC +community + +// company : 2013-11-07 Silver Avenue, LLC +company + +// compare : 2015-10-08 iSelect Ltd +compare + +// computer : 2013-10-24 Pine Mill, LLC +computer + +// comsec : 2015-01-08 VeriSign, Inc. +comsec + +// condos : 2013-12-05 Pine House, LLC +condos + +// construction : 2013-09-16 Fox Dynamite, LLC +construction + +// consulting : 2013-12-05 +consulting + +// contact : 2015-01-08 Top Level Spectrum, Inc. +contact + +// contractors : 2013-09-10 Magic Woods, LLC +contractors + +// cooking : 2013-11-21 Top Level Domain Holdings Limited +cooking + +// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +cookingchannel + +// cool : 2013-11-14 Koko Lake, LLC +cool + +// corsica : 2014-09-25 Collectivité Territoriale de Corse +corsica + +// country : 2013-12-19 Top Level Domain Holdings Limited +country + +// coupon : 2015-02-26 Amazon EU S.à r.l. +coupon + +// coupons : 2015-03-26 Black Island, LLC +coupons + +// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD +courses + +// credit : 2014-03-20 Snow Shadow, LLC +credit + +// creditcard : 2014-03-20 Binky Frostbite, LLC +creditcard + +// creditunion : 2015-01-22 CUNA Performance Resources, LLC +creditunion + +// cricket : 2014-10-09 dot Cricket Limited +cricket + +// crown : 2014-10-24 Crown Equipment Corporation +crown + +// crs : 2014-04-03 Federated Co-operatives Limited +crs + +// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. +cruise + +// cruises : 2013-12-05 Spring Way, LLC +cruises + +// csc : 2014-09-25 Alliance-One Services, Inc. +csc + +// cuisinella : 2014-04-03 SALM S.A.S. +cuisinella + +// cymru : 2014-05-08 Nominet UK +cymru + +// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. +cyou + +// dabur : 2014-02-06 Dabur India Limited +dabur + +// dad : 2014-01-23 Charleston Road Registry Inc. +dad + +// dance : 2013-10-24 United TLD Holdco Ltd. +dance + +// data : 2016-06-02 Dish DBS Corporation +data + +// date : 2014-11-20 dot Date Limited +date + +// dating : 2013-12-05 Pine Fest, LLC +dating + +// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. +datsun + +// day : 2014-01-30 Charleston Road Registry Inc. +day + +// dclk : 2014-11-20 Charleston Road Registry Inc. +dclk + +// dds : 2015-05-07 Top Level Domain Holdings Limited +dds + +// deal : 2015-06-25 Amazon EU S.à r.l. +deal + +// dealer : 2014-12-22 Dealer Dot Com, Inc. +dealer + +// deals : 2014-05-22 Sand Sunset, LLC +deals + +// degree : 2014-03-06 +degree + +// delivery : 2014-09-11 Steel Station, LLC +delivery + +// dell : 2014-10-24 Dell Inc. +dell + +// deloitte : 2015-07-31 Deloitte Touche Tohmatsu +deloitte + +// delta : 2015-02-19 Delta Air Lines, Inc. +delta + +// democrat : 2013-10-24 United TLD Holdco Ltd. +democrat + +// dental : 2014-03-20 Tin Birch, LLC +dental + +// dentist : 2014-03-20 +dentist + +// desi : 2013-11-14 Desi Networks LLC +desi + +// design : 2014-11-07 Top Level Design, LLC +design + +// dev : 2014-10-16 Charleston Road Registry Inc. +dev + +// dhl : 2015-07-23 Deutsche Post AG +dhl + +// diamonds : 2013-09-22 John Edge, LLC +diamonds + +// diet : 2014-06-26 Uniregistry, Corp. +diet + +// digital : 2014-03-06 Dash Park, LLC +digital + +// direct : 2014-04-10 Half Trail, LLC +direct + +// directory : 2013-09-20 Extra Madison, LLC +directory + +// discount : 2014-03-06 Holly Hill, LLC +discount + +// discover : 2015-07-23 Discover Financial Services +discover + +// dish : 2015-07-30 Dish DBS Corporation +dish + +// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. +diy + +// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. +dnp + +// docs : 2014-10-16 Charleston Road Registry Inc. +docs + +// doctor : 2016-06-02 Brice Trail, LLC +doctor + +// dodge : 2015-07-30 FCA US LLC. +dodge + +// dog : 2014-12-04 Koko Mill, LLC +dog + +// doha : 2014-09-18 Communications Regulatory Authority (CRA) +doha + +// domains : 2013-10-17 Sugar Cross, LLC +domains + +// dot : 2015-05-21 Dish DBS Corporation +dot + +// download : 2014-11-20 dot Support Limited +download + +// drive : 2015-03-05 Charleston Road Registry Inc. +drive + +// dtv : 2015-06-04 Dish DBS Corporation +dtv + +// dubai : 2015-01-01 Dubai Smart Government Department +dubai + +// duck : 2015-07-23 Johnson Shareholdings, Inc. +duck + +// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company +dunlop + +// duns : 2015-08-06 The Dun & Bradstreet Corporation +duns + +// dupont : 2015-06-25 E. I. du Pont de Nemours and Company +dupont + +// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +durban + +// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +dvag + +// dvr : 2016-05-26 Hughes Satellite Systems Corporation +dvr + +// earth : 2014-12-04 Interlink Co., Ltd. +earth + +// eat : 2014-01-23 Charleston Road Registry Inc. +eat + +// eco : 2016-07-08 Big Room Inc. +eco + +// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. +edeka + +// education : 2013-11-07 Brice Way, LLC +education + +// email : 2013-10-31 Spring Madison, LLC +email + +// emerck : 2014-04-03 Merck KGaA +emerck + +// energy : 2014-09-11 Binky Birch, LLC +energy + +// engineer : 2014-03-06 United TLD Holdco Ltd. +engineer + +// engineering : 2014-03-06 Romeo Canyon +engineering + +// enterprises : 2013-09-20 Snow Oaks, LLC +enterprises + +// epost : 2015-07-23 Deutsche Post AG +epost + +// epson : 2014-12-04 Seiko Epson Corporation +epson + +// equipment : 2013-08-27 Corn Station, LLC +equipment + +// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson +ericsson + +// erni : 2014-04-03 ERNI Group Holding AG +erni + +// esq : 2014-05-08 Charleston Road Registry Inc. +esq + +// estate : 2013-08-27 Trixy Park, LLC +estate + +// esurance : 2015-07-23 Esurance Insurance Company +esurance + +// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +etisalat + +// eurovision : 2014-04-24 European Broadcasting Union (EBU) +eurovision + +// eus : 2013-12-12 Puntueus Fundazioa +eus + +// events : 2013-12-05 Pioneer Maple, LLC +events + +// everbank : 2014-05-15 EverBank +everbank + +// exchange : 2014-03-06 Spring Falls, LLC +exchange + +// expert : 2013-11-21 Magic Pass, LLC +expert + +// exposed : 2013-12-05 Victor Beach, LLC +exposed + +// express : 2015-02-11 Sea Sunset, LLC +express + +// extraspace : 2015-05-14 Extra Space Storage LLC +extraspace + +// fage : 2014-12-18 Fage International S.A. +fage + +// fail : 2014-03-06 Atomic Pipe, LLC +fail + +// fairwinds : 2014-11-13 FairWinds Partners, LLC +fairwinds + +// faith : 2014-11-20 dot Faith Limited +faith + +// family : 2015-04-02 +family + +// fan : 2014-03-06 +fan + +// fans : 2014-11-07 Asiamix Digital Limited +fans + +// farm : 2013-11-07 Just Maple, LLC +farm + +// farmers : 2015-07-09 Farmers Insurance Exchange +farmers + +// fashion : 2014-07-03 Top Level Domain Holdings Limited +fashion + +// fast : 2014-12-18 Amazon EU S.à r.l. +fast + +// fedex : 2015-08-06 Federal Express Corporation +fedex + +// feedback : 2013-12-19 Top Level Spectrum, Inc. +feedback + +// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. +ferrari + +// ferrero : 2014-12-18 Ferrero Trading Lux S.A. +ferrero + +// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V. +fiat + +// fidelity : 2015-07-30 Fidelity Brokerage Services LLC +fidelity + +// fido : 2015-08-06 Rogers Communications Partnership +fido + +// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd +film + +// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +final + +// finance : 2014-03-20 Cotton Cypress, LLC +finance + +// financial : 2014-03-06 Just Cover, LLC +financial + +// fire : 2015-06-25 Amazon EU S.à r.l. +fire + +// firestone : 2014-12-18 Bridgestone Corporation +firestone + +// firmdale : 2014-03-27 Firmdale Holdings Limited +firmdale + +// fish : 2013-12-12 Fox Woods, LLC +fish + +// fishing : 2013-11-21 Top Level Domain Holdings Limited +fishing + +// fit : 2014-11-07 Top Level Domain Holdings Limited +fit + +// fitness : 2014-03-06 Brice Orchard, LLC +fitness + +// flickr : 2015-04-02 Yahoo! Domain Services Inc. +flickr + +// flights : 2013-12-05 Fox Station, LLC +flights + +// flir : 2015-07-23 FLIR Systems, Inc. +flir + +// florist : 2013-11-07 Half Cypress, LLC +florist + +// flowers : 2014-10-09 Uniregistry, Corp. +flowers + +// fly : 2014-05-08 Charleston Road Registry Inc. +fly + +// foo : 2014-01-23 Charleston Road Registry Inc. +foo + +// food : 2016-04-21 Lifestyle Domain Holdings, Inc. +food + +// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. +foodnetwork + +// football : 2014-12-18 Foggy Farms, LLC +football + +// ford : 2014-11-13 Ford Motor Company +ford + +// forex : 2014-12-11 IG Group Holdings PLC +forex + +// forsale : 2014-05-22 +forsale + +// forum : 2015-04-02 Fegistry, LLC +forum + +// foundation : 2013-12-05 John Dale, LLC +foundation + +// fox : 2015-09-11 FOX Registry, LLC +fox + +// free : 2015-12-10 Amazon EU S.à r.l. +free + +// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH +fresenius + +// frl : 2014-05-15 FRLregistry B.V. +frl + +// frogans : 2013-12-19 OP3FT +frogans + +// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. +frontdoor + +// frontier : 2015-02-05 Frontier Communications Corporation +frontier + +// ftr : 2015-07-16 Frontier Communications Corporation +ftr + +// fujitsu : 2015-07-30 Fujitsu Limited +fujitsu + +// fujixerox : 2015-07-23 Xerox DNHC LLC +fujixerox + +// fun : 2016-01-14 +fun + +// fund : 2014-03-20 John Castle, LLC +fund + +// furniture : 2014-03-20 Lone Fields, LLC +furniture + +// futbol : 2013-09-20 +futbol + +// fyi : 2015-04-02 Silver Tigers, LLC +fyi + +// gal : 2013-11-07 Asociación puntoGAL +gal + +// gallery : 2013-09-13 Sugar House, LLC +gallery + +// gallo : 2015-06-11 Gallo Vineyards, Inc. +gallo + +// gallup : 2015-02-19 Gallup, Inc. +gallup + +// game : 2015-05-28 Uniregistry, Corp. +game + +// games : 2015-05-28 +games + +// gap : 2015-07-31 The Gap, Inc. +gap + +// garden : 2014-06-26 Top Level Domain Holdings Limited +garden + +// gbiz : 2014-07-17 Charleston Road Registry Inc. +gbiz + +// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" +gdn + +// gea : 2014-12-04 GEA Group Aktiengesellschaft +gea + +// gent : 2014-01-23 COMBELL GROUP NV/SA +gent + +// genting : 2015-03-12 Resorts World Inc Pte. Ltd. +genting + +// george : 2015-07-31 Wal-Mart Stores, Inc. +george + +// ggee : 2014-01-09 GMO Internet, Inc. +ggee + +// gift : 2013-10-17 Uniregistry, Corp. +gift + +// gifts : 2014-07-03 Goose Sky, LLC +gifts + +// gives : 2014-03-06 United TLD Holdco Ltd. +gives + +// giving : 2014-11-13 Giving Limited +giving + +// glade : 2015-07-23 Johnson Shareholdings, Inc. +glade + +// glass : 2013-11-07 Black Cover, LLC +glass + +// gle : 2014-07-24 Charleston Road Registry Inc. +gle + +// global : 2014-04-17 Dot GLOBAL AS +global + +// globo : 2013-12-19 Globo Comunicação e Participações S.A +globo + +// gmail : 2014-05-01 Charleston Road Registry Inc. +gmail + +// gmbh : 2016-01-29 Extra Dynamite, LLC +gmbh + +// gmo : 2014-01-09 GMO Internet, Inc. +gmo + +// gmx : 2014-04-24 1&1 Mail & Media GmbH +gmx + +// godaddy : 2015-07-23 Go Daddy East, LLC +godaddy + +// gold : 2015-01-22 June Edge, LLC +gold + +// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +goldpoint + +// golf : 2014-12-18 Lone falls, LLC +golf + +// goo : 2014-12-18 NTT Resonant Inc. +goo + +// goodhands : 2015-07-31 Allstate Fire and Casualty Insurance Company +goodhands + +// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company +goodyear + +// goog : 2014-11-20 Charleston Road Registry Inc. +goog + +// google : 2014-07-24 Charleston Road Registry Inc. +google + +// gop : 2014-01-16 Republican State Leadership Committee, Inc. +gop + +// got : 2014-12-18 Amazon EU S.à r.l. +got + +// grainger : 2015-05-07 Grainger Registry Services, LLC +grainger + +// graphics : 2013-09-13 Over Madison, LLC +graphics + +// gratis : 2014-03-20 Pioneer Tigers, LLC +gratis + +// green : 2014-05-08 Afilias Limited +green + +// gripe : 2014-03-06 Corn Sunset, LLC +gripe + +// grocery : 2016-06-16 Wal-Mart Stores, Inc. +grocery + +// group : 2014-08-15 Romeo Town, LLC +group + +// guardian : 2015-07-30 The Guardian Life Insurance Company of America +guardian + +// gucci : 2014-11-13 Guccio Gucci S.p.a. +gucci + +// guge : 2014-08-28 Charleston Road Registry Inc. +guge + +// guide : 2013-09-13 Snow Moon, LLC +guide + +// guitars : 2013-11-14 Uniregistry, Corp. +guitars + +// guru : 2013-08-27 Pioneer Cypress, LLC +guru + +// hair : 2015-12-03 L'Oréal +hair + +// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH +hamburg + +// hangout : 2014-11-13 Charleston Road Registry Inc. +hangout + +// haus : 2013-12-05 +haus + +// hbo : 2015-07-30 HBO Registry Services, Inc. +hbo + +// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED +hdfc + +// hdfcbank : 2015-02-12 HDFC Bank Limited +hdfcbank + +// health : 2015-02-11 DotHealth, LLC +health + +// healthcare : 2014-06-12 Silver Glen, LLC +healthcare + +// help : 2014-06-26 Uniregistry, Corp. +help + +// helsinki : 2015-02-05 City of Helsinki +helsinki + +// here : 2014-02-06 Charleston Road Registry Inc. +here + +// hermes : 2014-07-10 HERMES INTERNATIONAL +hermes + +// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. +hgtv + +// hiphop : 2014-03-06 Uniregistry, Corp. +hiphop + +// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. +hisamitsu + +// hitachi : 2014-10-31 Hitachi, Ltd. +hitachi + +// hiv : 2014-03-13 +hiv + +// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited +hkt + +// hockey : 2015-03-19 Half Willow, LLC +hockey + +// holdings : 2013-08-27 John Madison, LLC +holdings + +// holiday : 2013-11-07 Goose Woods, LLC +holiday + +// homedepot : 2015-04-02 Homer TLC, Inc. +homedepot + +// homegoods : 2015-07-16 The TJX Companies, Inc. +homegoods + +// homes : 2014-01-09 DERHomes, LLC +homes + +// homesense : 2015-07-16 The TJX Companies, Inc. +homesense + +// honda : 2014-12-18 Honda Motor Co., Ltd. +honda + +// honeywell : 2015-07-23 Honeywell GTLD LLC +honeywell + +// horse : 2013-11-21 Top Level Domain Holdings Limited +horse + +// hospital : 2016-10-20 Ruby Pike, LLC +hospital + +// host : 2014-04-17 DotHost Inc. +host + +// hosting : 2014-05-29 Uniregistry, Corp. +hosting + +// hot : 2015-08-27 Amazon EU S.à r.l. +hot + +// hoteles : 2015-03-05 Travel Reservations SRL +hoteles + +// hotels : 2016-04-07 Booking.com B.V. +hotels + +// hotmail : 2014-12-18 Microsoft Corporation +hotmail + +// house : 2013-11-07 Sugar Park, LLC +house + +// how : 2014-01-23 Charleston Road Registry Inc. +how + +// hsbc : 2014-10-24 HSBC Holdings PLC +hsbc + +// htc : 2015-04-02 HTC corporation +htc + +// hughes : 2015-07-30 Hughes Satellite Systems Corporation +hughes + +// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. +hyatt + +// hyundai : 2015-07-09 Hyundai Motor Company +hyundai + +// ibm : 2014-07-31 International Business Machines Corporation +ibm + +// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited +icbc + +// ice : 2014-10-30 IntercontinentalExchange, Inc. +ice + +// icu : 2015-01-08 One.com A/S +icu + +// ieee : 2015-07-23 IEEE Global LLC +ieee + +// ifm : 2014-01-30 ifm electronic gmbh +ifm + +// ikano : 2015-07-09 Ikano S.A. +ikano + +// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +imamat + +// imdb : 2015-06-25 Amazon EU S.à r.l. +imdb + +// immo : 2014-07-10 Auburn Bloom, LLC +immo + +// immobilien : 2013-11-07 United TLD Holdco Ltd. +immobilien + +// industries : 2013-12-05 Outer House, LLC +industries + +// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. +infiniti + +// ing : 2014-01-23 Charleston Road Registry Inc. +ing + +// ink : 2013-12-05 Top Level Design, LLC +ink + +// institute : 2013-11-07 Outer Maple, LLC +institute + +// insurance : 2015-02-19 fTLD Registry Services LLC +insurance + +// insure : 2014-03-20 Pioneer Willow, LLC +insure + +// intel : 2015-08-06 Intel Corporation +intel + +// international : 2013-11-07 Wild Way, LLC +international + +// intuit : 2015-07-30 Intuit Administrative Services, Inc. +intuit + +// investments : 2014-03-20 Holly Glen, LLC +investments + +// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. +ipiranga + +// irish : 2014-08-07 Dot-Irish LLC +irish + +// iselect : 2015-02-11 iSelect Ltd +iselect + +// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +ismaili + +// ist : 2014-08-28 Istanbul Metropolitan Municipality +ist + +// istanbul : 2014-08-28 Istanbul Metropolitan Municipality +istanbul + +// itau : 2014-10-02 Itau Unibanco Holding S.A. +itau + +// itv : 2015-07-09 ITV Services Limited +itv + +// iveco : 2015-09-03 CNH Industrial N.V. +iveco + +// iwc : 2014-06-23 Richemont DNS Inc. +iwc + +// jaguar : 2014-11-13 Jaguar Land Rover Ltd +jaguar + +// java : 2014-06-19 Oracle Corporation +java + +// jcb : 2014-11-20 JCB Co., Ltd. +jcb + +// jcp : 2015-04-23 JCP Media, Inc. +jcp + +// jeep : 2015-07-30 FCA US LLC. +jeep + +// jetzt : 2014-01-09 +jetzt + +// jewelry : 2015-03-05 Wild Bloom, LLC +jewelry + +// jio : 2015-04-02 Affinity Names, Inc. +jio + +// jlc : 2014-12-04 Richemont DNS Inc. +jlc + +// jll : 2015-04-02 Jones Lang LaSalle Incorporated +jll + +// jmp : 2015-03-26 Matrix IP LLC +jmp + +// jnj : 2015-06-18 Johnson & Johnson Services, Inc. +jnj + +// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +joburg + +// jot : 2014-12-18 Amazon EU S.à r.l. +jot + +// joy : 2014-12-18 Amazon EU S.à r.l. +joy + +// jpmorgan : 2015-04-30 JPMorgan Chase & Co. +jpmorgan + +// jprs : 2014-09-18 Japan Registry Services Co., Ltd. +jprs + +// juegos : 2014-03-20 Uniregistry, Corp. +juegos + +// juniper : 2015-07-30 JUNIPER NETWORKS, INC. +juniper + +// kaufen : 2013-11-07 United TLD Holdco Ltd. +kaufen + +// kddi : 2014-09-12 KDDI CORPORATION +kddi + +// kerryhotels : 2015-04-30 Kerry Trading Co. Limited +kerryhotels + +// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited +kerrylogistics + +// kerryproperties : 2015-04-09 Kerry Trading Co. Limited +kerryproperties + +// kfh : 2014-12-04 Kuwait Finance House +kfh + +// kia : 2015-07-09 KIA MOTORS CORPORATION +kia + +// kim : 2013-09-23 Afilias Limited +kim + +// kinder : 2014-11-07 Ferrero Trading Lux S.A. +kinder + +// kindle : 2015-06-25 Amazon EU S.à r.l. +kindle + +// kitchen : 2013-09-20 Just Goodbye, LLC +kitchen + +// kiwi : 2013-09-20 DOT KIWI LIMITED +kiwi + +// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH +koeln + +// komatsu : 2015-01-08 Komatsu Ltd. +komatsu + +// kosher : 2015-08-20 Kosher Marketing Assets LLC +kosher + +// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) +kpmg + +// kpn : 2015-01-08 Koninklijke KPN N.V. +kpn + +// krd : 2013-12-05 KRG Department of Information Technology +krd + +// kred : 2013-12-19 KredTLD Pty Ltd +kred + +// kuokgroup : 2015-04-09 Kerry Trading Co. Limited +kuokgroup + +// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen +kyoto + +// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA +lacaixa + +// ladbrokes : 2015-08-06 LADBROKES INTERNATIONAL PLC +ladbrokes + +// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. +lamborghini + +// lamer : 2015-10-01 The Estée Lauder Companies Inc. +lamer + +// lancaster : 2015-02-12 LANCASTER +lancaster + +// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. +lancia + +// lancome : 2015-07-23 L'Oréal +lancome + +// land : 2013-09-10 Pine Moon, LLC +land + +// landrover : 2014-11-13 Jaguar Land Rover Ltd +landrover + +// lanxess : 2015-07-30 LANXESS Corporation +lanxess + +// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated +lasalle + +// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico +lat + +// latino : 2015-07-30 Dish DBS Corporation +latino + +// latrobe : 2014-06-16 La Trobe University +latrobe + +// law : 2015-01-22 Minds + Machines Group Limited +law + +// lawyer : 2014-03-20 +lawyer + +// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") +lds + +// lease : 2014-03-06 Victor Trail, LLC +lease + +// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +leclerc + +// lefrak : 2015-07-16 LeFrak Organization, Inc. +lefrak + +// legal : 2014-10-16 Blue Falls, LLC +legal + +// lego : 2015-07-16 LEGO Juris A/S +lego + +// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION +lexus + +// lgbt : 2014-05-08 Afilias Limited +lgbt + +// liaison : 2014-10-02 Liaison Technologies, Incorporated +liaison + +// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +lidl + +// life : 2014-02-06 Trixy Oaks, LLC +life + +// lifeinsurance : 2015-01-15 American Council of Life Insurers +lifeinsurance + +// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. +lifestyle + +// lighting : 2013-08-27 John McCook, LLC +lighting + +// like : 2014-12-18 Amazon EU S.à r.l. +like + +// lilly : 2015-07-31 Eli Lilly and Company +lilly + +// limited : 2014-03-06 Big Fest, LLC +limited + +// limo : 2013-10-17 Hidden Frostbite, LLC +limo + +// lincoln : 2014-11-13 Ford Motor Company +lincoln + +// linde : 2014-12-04 Linde Aktiengesellschaft +linde + +// link : 2013-11-14 Uniregistry, Corp. +link + +// lipsy : 2015-06-25 Lipsy Ltd +lipsy + +// live : 2014-12-04 +live + +// living : 2015-07-30 Lifestyle Domain Holdings, Inc. +living + +// lixil : 2015-03-19 LIXIL Group Corporation +lixil + +// loan : 2014-11-20 dot Loan Limited +loan + +// loans : 2014-03-20 June Woods, LLC +loans + +// locker : 2015-06-04 Dish DBS Corporation +locker + +// locus : 2015-06-25 Locus Analytics LLC +locus + +// loft : 2015-07-30 Annco, Inc. +loft + +// lol : 2015-01-30 Uniregistry, Corp. +lol + +// london : 2013-11-14 Dot London Domains Limited +london + +// lotte : 2014-11-07 Lotte Holdings Co., Ltd. +lotte + +// lotto : 2014-04-10 Afilias Limited +lotto + +// love : 2014-12-22 Merchant Law Group LLP +love + +// lpl : 2015-07-30 LPL Holdings, Inc. +lpl + +// lplfinancial : 2015-07-30 LPL Holdings, Inc. +lplfinancial + +// ltd : 2014-09-25 Over Corner, LLC +ltd + +// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA +ltda + +// lundbeck : 2015-08-06 H. Lundbeck A/S +lundbeck + +// lupin : 2014-11-07 LUPIN LIMITED +lupin + +// luxe : 2014-01-09 Top Level Domain Holdings Limited +luxe + +// luxury : 2013-10-17 Luxury Partners, LLC +luxury + +// macys : 2015-07-31 Macys, Inc. +macys + +// madrid : 2014-05-01 Comunidad de Madrid +madrid + +// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) +maif + +// maison : 2013-12-05 Victor Frostbite, LLC +maison + +// makeup : 2015-01-15 L'Oréal +makeup + +// man : 2014-12-04 MAN SE +man + +// management : 2013-11-07 John Goodbye, LLC +management + +// mango : 2013-10-24 PUNTO FA S.L. +mango + +// map : 2016-06-09 Charleston Road Registry Inc. +map + +// market : 2014-03-06 +market + +// marketing : 2013-11-07 Fern Pass, LLC +marketing + +// markets : 2014-12-11 IG Group Holdings PLC +markets + +// marriott : 2014-10-09 Marriott Worldwide Corporation +marriott + +// marshalls : 2015-07-16 The TJX Companies, Inc. +marshalls + +// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V. +maserati + +// mattel : 2015-08-06 Mattel Sites, Inc. +mattel + +// mba : 2015-04-02 Lone Hollow, LLC +mba + +// mcd : 2015-07-30 McDonald’s Corporation +mcd + +// mcdonalds : 2015-07-30 McDonald’s Corporation +mcdonalds + +// mckinsey : 2015-07-31 McKinsey Holdings, Inc. +mckinsey + +// med : 2015-08-06 Medistry LLC +med + +// media : 2014-03-06 Grand Glen, LLC +media + +// meet : 2014-01-16 +meet + +// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +melbourne + +// meme : 2014-01-30 Charleston Road Registry Inc. +meme + +// memorial : 2014-10-16 Dog Beach, LLC +memorial + +// men : 2015-02-26 Exclusive Registry Limited +men + +// menu : 2013-09-11 Wedding TLD2, LLC +menu + +// meo : 2014-11-07 PT Comunicacoes S.A. +meo + +// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. +merckmsd + +// metlife : 2015-05-07 MetLife Services and Solutions, LLC +metlife + +// miami : 2013-12-19 Top Level Domain Holdings Limited +miami + +// microsoft : 2014-12-18 Microsoft Corporation +microsoft + +// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +mini + +// mint : 2015-07-30 Intuit Administrative Services, Inc. +mint + +// mit : 2015-07-02 Massachusetts Institute of Technology +mit + +// mitsubishi : 2015-07-23 Mitsubishi Corporation +mitsubishi + +// mlb : 2015-05-21 MLB Advanced Media DH, LLC +mlb + +// mls : 2015-04-23 The Canadian Real Estate Association +mls + +// mma : 2014-11-07 MMA IARD +mma + +// mobile : 2016-06-02 Dish DBS Corporation +mobile + +// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L. +mobily + +// moda : 2013-11-07 United TLD Holdco Ltd. +moda + +// moe : 2013-11-13 Interlink Co., Ltd. +moe + +// moi : 2014-12-18 Amazon EU S.à r.l. +moi + +// mom : 2015-04-16 Uniregistry, Corp. +mom + +// monash : 2013-09-30 Monash University +monash + +// money : 2014-10-16 Outer McCook, LLC +money + +// monster : 2015-09-11 Monster Worldwide, Inc. +monster + +// montblanc : 2014-06-23 Richemont DNS Inc. +montblanc + +// mopar : 2015-07-30 FCA US LLC. +mopar + +// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") +mormon + +// mortgage : 2014-03-20 +mortgage + +// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +moscow + +// moto : 2015-06-04 +moto + +// motorcycles : 2014-01-09 DERMotorcycles, LLC +motorcycles + +// mov : 2014-01-30 Charleston Road Registry Inc. +mov + +// movie : 2015-02-05 New Frostbite, LLC +movie + +// movistar : 2014-10-16 Telefónica S.A. +movistar + +// msd : 2015-07-23 MSD Registry Holdings, Inc. +msd + +// mtn : 2014-12-04 MTN Dubai Limited +mtn + +// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation +mtpc + +// mtr : 2015-03-12 MTR Corporation Limited +mtr + +// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC +mutual + +// nab : 2015-08-20 National Australia Bank Limited +nab + +// nadex : 2014-12-11 IG Group Holdings PLC +nadex + +// nagoya : 2013-10-24 GMO Registry, Inc. +nagoya + +// nationwide : 2015-07-23 Nationwide Mutual Insurance Company +nationwide + +// natura : 2015-03-12 NATURA COSMÉTICOS S.A. +natura + +// navy : 2014-03-06 United TLD Holdco Ltd. +navy + +// nba : 2015-07-31 NBA REGISTRY, LLC +nba + +// nec : 2015-01-08 NEC Corporation +nec + +// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +netbank + +// netflix : 2015-06-18 Netflix, Inc. +netflix + +// network : 2013-11-14 Trixy Manor, LLC +network + +// neustar : 2013-12-05 NeuStar, Inc. +neustar + +// new : 2014-01-30 Charleston Road Registry Inc. +new + +// newholland : 2015-09-03 CNH Industrial N.V. +newholland + +// news : 2014-12-18 +news + +// next : 2015-06-18 Next plc +next + +// nextdirect : 2015-06-18 Next plc +nextdirect + +// nexus : 2014-07-24 Charleston Road Registry Inc. +nexus + +// nfl : 2015-07-23 NFL Reg Ops LLC +nfl + +// ngo : 2014-03-06 Public Interest Registry +ngo + +// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) +nhk + +// nico : 2014-12-04 DWANGO Co., Ltd. +nico + +// nike : 2015-07-23 NIKE, Inc. +nike + +// nikon : 2015-05-21 NIKON CORPORATION +nikon + +// ninja : 2013-11-07 United TLD Holdco Ltd. +ninja + +// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. +nissan + +// nissay : 2015-10-29 Nippon Life Insurance Company +nissay + +// nokia : 2015-01-08 Nokia Corporation +nokia + +// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC +northwesternmutual + +// norton : 2014-12-04 Symantec Corporation +norton + +// now : 2015-06-25 Amazon EU S.à r.l. +now + +// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +nowruz + +// nowtv : 2015-05-14 Starbucks (HK) Limited +nowtv + +// nra : 2014-05-22 NRA Holdings Company, INC. +nra + +// nrw : 2013-11-21 Minds + Machines GmbH +nrw + +// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION +ntt + +// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications +nyc + +// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA +obi + +// observer : 2015-04-30 +observer + +// off : 2015-07-23 Johnson Shareholdings, Inc. +off + +// office : 2015-03-12 Microsoft Corporation +office + +// okinawa : 2013-12-05 BusinessRalliart Inc. +okinawa + +// olayan : 2015-05-14 Crescent Holding GmbH +olayan + +// olayangroup : 2015-05-14 Crescent Holding GmbH +olayangroup + +// oldnavy : 2015-07-31 The Gap, Inc. +oldnavy + +// ollo : 2015-06-04 Dish DBS Corporation +ollo + +// omega : 2015-01-08 The Swatch Group Ltd +omega + +// one : 2014-11-07 One.com A/S +one + +// ong : 2014-03-06 Public Interest Registry +ong + +// onl : 2013-09-16 I-Registry Ltd. +onl + +// online : 2015-01-15 DotOnline Inc. +online + +// onyourside : 2015-07-23 Nationwide Mutual Insurance Company +onyourside + +// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED +ooo + +// open : 2015-07-31 American Express Travel Related Services Company, Inc. +open + +// oracle : 2014-06-19 Oracle Corporation +oracle + +// orange : 2015-03-12 Orange Brand Services Limited +orange + +// organic : 2014-03-27 Afilias Limited +organic + +// orientexpress : 2015-02-05 +orientexpress + +// origins : 2015-10-01 The Estée Lauder Companies Inc. +origins + +// osaka : 2014-09-04 Interlink Co., Ltd. +osaka + +// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. +otsuka + +// ott : 2015-06-04 Dish DBS Corporation +ott + +// ovh : 2014-01-16 OVH SAS +ovh + +// page : 2014-12-04 Charleston Road Registry Inc. +page + +// pamperedchef : 2015-02-05 The Pampered Chef, Ltd. +pamperedchef + +// panasonic : 2015-07-30 Panasonic Corporation +panasonic + +// panerai : 2014-11-07 Richemont DNS Inc. +panerai + +// paris : 2014-01-30 City of Paris +paris + +// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +pars + +// partners : 2013-12-05 Magic Glen, LLC +partners + +// parts : 2013-12-05 Sea Goodbye, LLC +parts + +// party : 2014-09-11 Blue Sky Registry Limited +party + +// passagens : 2015-03-05 Travel Reservations SRL +passagens + +// pay : 2015-08-27 Amazon EU S.à r.l. +pay + +// pccw : 2015-05-14 PCCW Enterprises Limited +pccw + +// pet : 2015-05-07 Afilias plc +pet + +// pfizer : 2015-09-11 Pfizer Inc. +pfizer + +// pharmacy : 2014-06-19 National Association of Boards of Pharmacy +pharmacy + +// phd : 2016-07-28 Charleston Road Registry Inc. +phd + +// philips : 2014-11-07 Koninklijke Philips N.V. +philips + +// phone : 2016-06-02 Dish DBS Corporation +phone + +// photo : 2013-11-14 Uniregistry, Corp. +photo + +// photography : 2013-09-20 Sugar Glen, LLC +photography + +// photos : 2013-10-17 Sea Corner, LLC +photos + +// physio : 2014-05-01 PhysBiz Pty Ltd +physio + +// piaget : 2014-10-16 Richemont DNS Inc. +piaget + +// pics : 2013-11-14 Uniregistry, Corp. +pics + +// pictet : 2014-06-26 Pictet Europe S.A. +pictet + +// pictures : 2014-03-06 Foggy Sky, LLC +pictures + +// pid : 2015-01-08 Top Level Spectrum, Inc. +pid + +// pin : 2014-12-18 Amazon EU S.à r.l. +pin + +// ping : 2015-06-11 Ping Registry Provider, Inc. +ping + +// pink : 2013-10-01 Afilias Limited +pink + +// pioneer : 2015-07-16 Pioneer Corporation +pioneer + +// pizza : 2014-06-26 Foggy Moon, LLC +pizza + +// place : 2014-04-24 Snow Galley, LLC +place + +// play : 2015-03-05 Charleston Road Registry Inc. +play + +// playstation : 2015-07-02 Sony Computer Entertainment Inc. +playstation + +// plumbing : 2013-09-10 Spring Tigers, LLC +plumbing + +// plus : 2015-02-05 Sugar Mill, LLC +plus + +// pnc : 2015-07-02 PNC Domain Co., LLC +pnc + +// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +pohl + +// poker : 2014-07-03 Afilias Domains No. 5 Limited +poker + +// politie : 2015-08-20 Politie Nederland +politie + +// porn : 2014-10-16 ICM Registry PN LLC +porn + +// pramerica : 2015-07-30 Prudential Financial, Inc. +pramerica + +// praxi : 2013-12-05 Praxi S.p.A. +praxi + +// press : 2014-04-03 DotPress Inc. +press + +// prime : 2015-06-25 Amazon EU S.à r.l. +prime + +// prod : 2014-01-23 Charleston Road Registry Inc. +prod + +// productions : 2013-12-05 Magic Birch, LLC +productions + +// prof : 2014-07-24 Charleston Road Registry Inc. +prof + +// progressive : 2015-07-23 Progressive Casualty Insurance Company +progressive + +// promo : 2014-12-18 +promo + +// properties : 2013-12-05 Big Pass, LLC +properties + +// property : 2014-05-22 Uniregistry, Corp. +property + +// protection : 2015-04-23 +protection + +// pru : 2015-07-30 Prudential Financial, Inc. +pru + +// prudential : 2015-07-30 Prudential Financial, Inc. +prudential + +// pub : 2013-12-12 United TLD Holdco Ltd. +pub + +// pwc : 2015-10-29 PricewaterhouseCoopers LLP +pwc + +// qpon : 2013-11-14 dotCOOL, Inc. +qpon + +// quebec : 2013-12-19 PointQuébec Inc +quebec + +// quest : 2015-03-26 Quest ION Limited +quest + +// qvc : 2015-07-30 QVC, Inc. +qvc + +// racing : 2014-12-04 Premier Registry Limited +racing + +// radio : 2016-07-21 European Broadcasting Union (EBU) +radio + +// raid : 2015-07-23 Johnson Shareholdings, Inc. +raid + +// read : 2014-12-18 Amazon EU S.à r.l. +read + +// realestate : 2015-09-11 dotRealEstate LLC +realestate + +// realtor : 2014-05-29 Real Estate Domains LLC +realtor + +// realty : 2015-03-19 Fegistry, LLC +realty + +// recipes : 2013-10-17 Grand Island, LLC +recipes + +// red : 2013-11-07 Afilias Limited +red + +// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. +redstone + +// redumbrella : 2015-03-26 Travelers TLD, LLC +redumbrella + +// rehab : 2014-03-06 United TLD Holdco Ltd. +rehab + +// reise : 2014-03-13 +reise + +// reisen : 2014-03-06 New Cypress, LLC +reisen + +// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. +reit + +// reliance : 2015-04-02 Reliance Industries Limited +reliance + +// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd. +ren + +// rent : 2014-12-04 DERRent, LLC +rent + +// rentals : 2013-12-05 Big Hollow,LLC +rentals + +// repair : 2013-11-07 Lone Sunset, LLC +repair + +// report : 2013-12-05 Binky Glen, LLC +report + +// republican : 2014-03-20 United TLD Holdco Ltd. +republican + +// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +rest + +// restaurant : 2014-07-03 Snow Avenue, LLC +restaurant + +// review : 2014-11-20 dot Review Limited +review + +// reviews : 2013-09-13 +reviews + +// rexroth : 2015-06-18 Robert Bosch GMBH +rexroth + +// rich : 2013-11-21 I-Registry Ltd. +rich + +// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited +richardli + +// ricoh : 2014-11-20 Ricoh Company, Ltd. +ricoh + +// rightathome : 2015-07-23 Johnson Shareholdings, Inc. +rightathome + +// ril : 2015-04-02 Reliance Industries Limited +ril + +// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO +rio + +// rip : 2014-07-10 United TLD Holdco Ltd. +rip + +// rmit : 2015-11-19 Royal Melbourne Institute of Technology +rmit + +// rocher : 2014-12-18 Ferrero Trading Lux S.A. +rocher + +// rocks : 2013-11-14 +rocks + +// rodeo : 2013-12-19 Top Level Domain Holdings Limited +rodeo + +// rogers : 2015-08-06 Rogers Communications Partnership +rogers + +// room : 2014-12-18 Amazon EU S.à r.l. +room + +// rsvp : 2014-05-08 Charleston Road Registry Inc. +rsvp + +// rugby : 2016-12-15 World Rugby Strategic Developments Limited +rugby + +// ruhr : 2013-10-02 regiodot GmbH & Co. KG +ruhr + +// run : 2015-03-19 Snow Park, LLC +run + +// rwe : 2015-04-02 RWE AG +rwe + +// ryukyu : 2014-01-09 BusinessRalliart Inc. +ryukyu + +// saarland : 2013-12-12 dotSaarland GmbH +saarland + +// safe : 2014-12-18 Amazon EU S.à r.l. +safe + +// safety : 2015-01-08 Safety Registry Services, LLC. +safety + +// sakura : 2014-12-18 SAKURA Internet Inc. +sakura + +// sale : 2014-10-16 +sale + +// salon : 2014-12-11 Outer Orchard, LLC +salon + +// samsclub : 2015-07-31 Wal-Mart Stores, Inc. +samsclub + +// samsung : 2014-04-03 SAMSUNG SDS CO., LTD +samsung + +// sandvik : 2014-11-13 Sandvik AB +sandvik + +// sandvikcoromant : 2014-11-07 Sandvik AB +sandvikcoromant + +// sanofi : 2014-10-09 Sanofi +sanofi + +// sap : 2014-03-27 SAP AG +sap + +// sapo : 2014-11-07 PT Comunicacoes S.A. +sapo + +// sarl : 2014-07-03 Delta Orchard, LLC +sarl + +// sas : 2015-04-02 Research IP LLC +sas + +// save : 2015-06-25 Amazon EU S.à r.l. +save + +// saxo : 2014-10-31 Saxo Bank A/S +saxo + +// sbi : 2015-03-12 STATE BANK OF INDIA +sbi + +// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION +sbs + +// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) +sca + +// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") +scb + +// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG +schaeffler + +// schmidt : 2014-04-03 SALM S.A.S. +schmidt + +// scholarships : 2014-04-24 Scholarships.com, LLC +scholarships + +// school : 2014-12-18 Little Galley, LLC +school + +// schule : 2014-03-06 Outer Moon, LLC +schule + +// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +schwarz + +// science : 2014-09-11 dot Science Limited +science + +// scjohnson : 2015-07-23 Johnson Shareholdings, Inc. +scjohnson + +// scor : 2014-10-31 SCOR SE +scor + +// scot : 2014-01-23 Dot Scot Registry Limited +scot + +// search : 2016-06-09 Charleston Road Registry Inc. +search + +// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) +seat + +// secure : 2015-08-27 Amazon EU S.à r.l. +secure + +// security : 2015-05-14 +security + +// seek : 2014-12-04 Seek Limited +seek + +// select : 2015-10-08 iSelect Ltd +select + +// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. +sener + +// services : 2014-02-27 Fox Castle, LLC +services + +// ses : 2015-07-23 SES +ses + +// seven : 2015-08-06 Seven West Media Ltd +seven + +// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG +sew + +// sex : 2014-11-13 ICM Registry SX LLC +sex + +// sexy : 2013-09-11 Uniregistry, Corp. +sexy + +// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR +sfr + +// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited +shangrila + +// sharp : 2014-05-01 Sharp Corporation +sharp + +// shaw : 2015-04-23 Shaw Cablesystems G.P. +shaw + +// shell : 2015-07-30 Shell Information Technology International Inc +shell + +// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +shia + +// shiksha : 2013-11-14 Afilias Limited +shiksha + +// shoes : 2013-10-02 Binky Galley, LLC +shoes + +// shop : 2016-04-08 GMO Registry, Inc. +shop + +// shopping : 2016-03-31 +shopping + +// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +shouji + +// show : 2015-03-05 Snow Beach, LLC +show + +// showtime : 2015-08-06 CBS Domains Inc. +showtime + +// shriram : 2014-01-23 Shriram Capital Ltd. +shriram + +// silk : 2015-06-25 Amazon EU S.à r.l. +silk + +// sina : 2015-03-12 Sina Corporation +sina + +// singles : 2013-08-27 Fern Madison, LLC +singles + +// site : 2015-01-15 DotSite Inc. +site + +// ski : 2015-04-09 STARTING DOT LIMITED +ski + +// skin : 2015-01-15 L'Oréal +skin + +// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch +sky + +// skype : 2014-12-18 Microsoft Corporation +skype + +// sling : 2015-07-30 Hughes Satellite Systems Corporation +sling + +// smart : 2015-07-09 Smart Communications, Inc. (SMART) +smart + +// smile : 2014-12-18 Amazon EU S.à r.l. +smile + +// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F +sncf + +// soccer : 2015-03-26 Foggy Shadow, LLC +soccer + +// social : 2013-11-07 United TLD Holdco Ltd. +social + +// softbank : 2015-07-02 SoftBank Corp. +softbank + +// software : 2014-03-20 +software + +// sohu : 2013-12-19 Sohu.com Limited +sohu + +// solar : 2013-11-07 Ruby Town, LLC +solar + +// solutions : 2013-11-07 Silver Cover, LLC +solutions + +// song : 2015-02-26 Amazon EU S.à r.l. +song + +// sony : 2015-01-08 Sony Corporation +sony + +// soy : 2014-01-23 Charleston Road Registry Inc. +soy + +// space : 2014-04-03 DotSpace Inc. +space + +// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG +spiegel + +// spot : 2015-02-26 Amazon EU S.à r.l. +spot + +// spreadbetting : 2014-12-11 IG Group Holdings PLC +spreadbetting + +// srl : 2015-05-07 mySRL GmbH +srl + +// srt : 2015-07-30 FCA US LLC. +srt + +// stada : 2014-11-13 STADA Arzneimittel AG +stada + +// staples : 2015-07-30 Staples, Inc. +staples + +// star : 2015-01-08 Star India Private Limited +star + +// starhub : 2015-02-05 StarHub Ltd +starhub + +// statebank : 2015-03-12 STATE BANK OF INDIA +statebank + +// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company +statefarm + +// statoil : 2014-12-04 Statoil ASA +statoil + +// stc : 2014-10-09 Saudi Telecom Company +stc + +// stcgroup : 2014-10-09 Saudi Telecom Company +stcgroup + +// stockholm : 2014-12-18 Stockholms kommun +stockholm + +// storage : 2014-12-22 Self Storage Company LLC +storage + +// store : 2015-04-09 DotStore Inc. +store + +// stream : 2016-01-08 dot Stream Limited +stream + +// studio : 2015-02-11 +studio + +// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD +study + +// style : 2014-12-04 Binky Moon, LLC +style + +// sucks : 2014-12-22 Vox Populi Registry Inc. +sucks + +// supplies : 2013-12-19 Atomic Fields, LLC +supplies + +// supply : 2013-12-19 Half Falls, LLC +supply + +// support : 2013-10-24 Grand Orchard, LLC +support + +// surf : 2014-01-09 Top Level Domain Holdings Limited +surf + +// surgery : 2014-03-20 Tin Avenue, LLC +surgery + +// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION +suzuki + +// swatch : 2015-01-08 The Swatch Group Ltd +swatch + +// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited +swiftcover + +// swiss : 2014-10-16 Swiss Confederation +swiss + +// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet +sydney + +// symantec : 2014-12-04 Symantec Corporation +symantec + +// systems : 2013-11-07 Dash Cypress, LLC +systems + +// tab : 2014-12-04 Tabcorp Holdings Limited +tab + +// taipei : 2014-07-10 Taipei City Government +taipei + +// talk : 2015-04-09 Amazon EU S.à r.l. +talk + +// taobao : 2015-01-15 Alibaba Group Holding Limited +taobao + +// target : 2015-07-31 Target Domain Holdings, LLC +target + +// tatamotors : 2015-03-12 Tata Motors Ltd +tatamotors + +// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +tatar + +// tattoo : 2013-08-30 Uniregistry, Corp. +tattoo + +// tax : 2014-03-20 Storm Orchard, LLC +tax + +// taxi : 2015-03-19 Pine Falls, LLC +taxi + +// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +tci + +// tdk : 2015-06-11 TDK Corporation +tdk + +// team : 2015-03-05 Atomic Lake, LLC +team + +// tech : 2015-01-30 Dot Tech LLC +tech + +// technology : 2013-09-13 Auburn Falls +technology + +// telecity : 2015-02-19 TelecityGroup International Limited +telecity + +// telefonica : 2014-10-16 Telefónica S.A. +telefonica + +// temasek : 2014-08-07 Temasek Holdings (Private) Limited +temasek + +// tennis : 2014-12-04 Cotton Bloom, LLC +tennis + +// teva : 2015-07-02 Teva Pharmaceutical Industries Limited +teva + +// thd : 2015-04-02 Homer TLC, Inc. +thd + +// theater : 2015-03-19 Blue Tigers, LLC +theater + +// theatre : 2015-05-07 +theatre + +// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America +tiaa + +// tickets : 2015-02-05 Accent Media Limited +tickets + +// tienda : 2013-11-14 Victor Manor, LLC +tienda + +// tiffany : 2015-01-30 Tiffany and Company +tiffany + +// tips : 2013-09-20 Corn Willow, LLC +tips + +// tires : 2014-11-07 Dog Edge, LLC +tires + +// tirol : 2014-04-24 punkt Tirol GmbH +tirol + +// tjmaxx : 2015-07-16 The TJX Companies, Inc. +tjmaxx + +// tjx : 2015-07-16 The TJX Companies, Inc. +tjx + +// tkmaxx : 2015-07-16 The TJX Companies, Inc. +tkmaxx + +// tmall : 2015-01-15 Alibaba Group Holding Limited +tmall + +// today : 2013-09-20 Pearl Woods, LLC +today + +// tokyo : 2013-11-13 GMO Registry, Inc. +tokyo + +// tools : 2013-11-21 Pioneer North, LLC +tools + +// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd. +top + +// toray : 2014-12-18 Toray Industries, Inc. +toray + +// toshiba : 2014-04-10 TOSHIBA Corporation +toshiba + +// total : 2015-08-06 Total SA +total + +// tours : 2015-01-22 Sugar Station, LLC +tours + +// town : 2014-03-06 Koko Moon, LLC +town + +// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION +toyota + +// toys : 2014-03-06 Pioneer Orchard, LLC +toys + +// trade : 2014-01-23 Elite Registry Limited +trade + +// trading : 2014-12-11 IG Group Holdings PLC +trading + +// training : 2013-11-07 Wild Willow, LLC +training + +// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +travelchannel + +// travelers : 2015-03-26 Travelers TLD, LLC +travelers + +// travelersinsurance : 2015-03-26 Travelers TLD, LLC +travelersinsurance + +// trust : 2014-10-16 +trust + +// trv : 2015-03-26 Travelers TLD, LLC +trv + +// tube : 2015-06-11 Latin American Telecom LLC +tube + +// tui : 2014-07-03 TUI AG +tui + +// tunes : 2015-02-26 Amazon EU S.à r.l. +tunes + +// tushu : 2014-12-18 Amazon EU S.à r.l. +tushu + +// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED +tvs + +// ubank : 2015-08-20 National Australia Bank Limited +ubank + +// ubs : 2014-12-11 UBS AG +ubs + +// uconnect : 2015-07-30 FCA US LLC. +uconnect + +// unicom : 2015-10-15 China United Network Communications Corporation Limited +unicom + +// university : 2014-03-06 Little Station, LLC +university + +// uno : 2013-09-11 Dot Latin LLC +uno + +// uol : 2014-05-01 UBN INTERNET LTDA. +uol + +// ups : 2015-06-25 UPS Market Driver, Inc. +ups + +// vacations : 2013-12-05 Atomic Tigers, LLC +vacations + +// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. +vana + +// vanguard : 2015-09-03 The Vanguard Group, Inc. +vanguard + +// vegas : 2014-01-16 Dot Vegas, Inc. +vegas + +// ventures : 2013-08-27 Binky Lake, LLC +ventures + +// verisign : 2015-08-13 VeriSign, Inc. +verisign + +// versicherung : 2014-03-20 +versicherung + +// vet : 2014-03-06 +vet + +// viajes : 2013-10-17 Black Madison, LLC +viajes + +// video : 2014-10-16 +video + +// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +vig + +// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. +viking + +// villas : 2013-12-05 New Sky, LLC +villas + +// vin : 2015-06-18 Holly Shadow, LLC +vin + +// vip : 2015-01-22 Minds + Machines Group Limited +vip + +// virgin : 2014-09-25 Virgin Enterprises Limited +virgin + +// visa : 2015-07-30 Visa Worldwide Pte. Limited +visa + +// vision : 2013-12-05 Koko Station, LLC +vision + +// vista : 2014-09-18 Vistaprint Limited +vista + +// vistaprint : 2014-09-18 Vistaprint Limited +vistaprint + +// viva : 2014-11-07 Saudi Telecom Company +viva + +// vivo : 2015-07-31 Telefonica Brasil S.A. +vivo + +// vlaanderen : 2014-02-06 DNS.be vzw +vlaanderen + +// vodka : 2013-12-19 Top Level Domain Holdings Limited +vodka + +// volkswagen : 2015-05-14 Volkswagen Group of America Inc. +volkswagen + +// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag +volvo + +// vote : 2013-11-21 Monolith Registry LLC +vote + +// voting : 2013-11-13 Valuetainment Corp. +voting + +// voto : 2013-11-21 Monolith Registry LLC +voto + +// voyage : 2013-08-27 Ruby House, LLC +voyage + +// vuelos : 2015-03-05 Travel Reservations SRL +vuelos + +// wales : 2014-05-08 Nominet UK +wales + +// walmart : 2015-07-31 Wal-Mart Stores, Inc. +walmart + +// walter : 2014-11-13 Sandvik AB +walter + +// wang : 2013-10-24 Zodiac Leo Limited +wang + +// wanggou : 2014-12-18 Amazon EU S.à r.l. +wanggou + +// warman : 2015-06-18 Weir Group IP Limited +warman + +// watch : 2013-11-14 Sand Shadow, LLC +watch + +// watches : 2014-12-22 Richemont DNS Inc. +watches + +// weather : 2015-01-08 The Weather Channel, LLC +weather + +// weatherchannel : 2015-03-12 The Weather Channel, LLC +weatherchannel + +// webcam : 2014-01-23 dot Webcam Limited +webcam + +// weber : 2015-06-04 Saint-Gobain Weber SA +weber + +// website : 2014-04-03 DotWebsite Inc. +website + +// wed : 2013-10-01 Atgron, Inc. +wed + +// wedding : 2014-04-24 Top Level Domain Holdings Limited +wedding + +// weibo : 2015-03-05 Sina Corporation +weibo + +// weir : 2015-01-29 Weir Group IP Limited +weir + +// whoswho : 2014-02-20 Who's Who Registry +whoswho + +// wien : 2013-10-28 punkt.wien GmbH +wien + +// wiki : 2013-11-07 Top Level Design, LLC +wiki + +// williamhill : 2014-03-13 William Hill Organization Limited +williamhill + +// win : 2014-11-20 First Registry Limited +win + +// windows : 2014-12-18 Microsoft Corporation +windows + +// wine : 2015-06-18 June Station, LLC +wine + +// winners : 2015-07-16 The TJX Companies, Inc. +winners + +// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC +wme + +// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. +wolterskluwer + +// woodside : 2015-07-09 Woodside Petroleum Limited +woodside + +// work : 2013-12-19 Top Level Domain Holdings Limited +work + +// works : 2013-11-14 Little Dynamite, LLC +works + +// world : 2014-06-12 Bitter Fields, LLC +world + +// wow : 2015-10-08 Amazon EU S.à r.l. +wow + +// wtc : 2013-12-19 World Trade Centers Association, Inc. +wtc + +// wtf : 2014-03-06 Hidden Way, LLC +wtf + +// xbox : 2014-12-18 Microsoft Corporation +xbox + +// xerox : 2014-10-24 Xerox DNHC LLC +xerox + +// xfinity : 2015-07-09 Comcast IP Holdings I, LLC +xfinity + +// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +xihuan + +// xin : 2014-12-11 Elegant Leader Limited +xin + +// xn--11b4c3d : 2015-01-15 VeriSign Sarl +कॉम + +// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l. +セール + +// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. +佛山 + +// xn--30rr7y : 2014-06-12 Excellent First Limited +慈善 + +// xn--3bst00m : 2013-09-13 Eagle Horizon Limited +集团 + +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED +在线 + +// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. +大众汽车 + +// xn--3pxu8k : 2015-01-15 VeriSign Sarl +点看 + +// xn--42c2d9a : 2015-01-15 VeriSign Sarl +คอม + +// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited +八卦 + +// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment +موقع + +// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center +公益 + +// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +公司 + +// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited +香格里拉 + +// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited +网站 + +// xn--6frz82g : 2013-09-23 Afilias Limited +移动 + +// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited +我爱你 + +// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +москва + +// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +католик + +// xn--80asehdb : 2013-07-14 CORE Association +онлайн + +// xn--80aswg : 2013-07-14 CORE Association +сайт + +// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited +联通 + +// xn--9dbq2a : 2015-01-15 VeriSign Sarl +קום + +// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED +时尚 + +// xn--9krt00a : 2015-03-12 Sina Corporation +微博 + +// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited +淡马锡 + +// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l. +ファッション + +// xn--c1avg : 2013-11-14 Public Interest Registry +орг + +// xn--c2br7g : 2015-01-15 VeriSign Sarl +नेट + +// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l. +ストア + +// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD +삼성 + +// xn--czr694b : 2014-01-16 Dot Trademark TLD Holding Company Limited +商标 + +// xn--czrs0t : 2013-12-19 Wild Island, LLC +商店 + +// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited +商城 + +// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” +дети + +// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l. +ポイント + +// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch 新华通讯社广东分社 +新闻 + +// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited +工行 + +// xn--fct429k : 2015-04-09 Amazon EU S.à r.l. +家電 + +// xn--fhbei : 2015-01-15 VeriSign Sarl +كوم + +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED +中文网 + +// xn--fiq64b : 2013-10-14 CITIC Group Corporation +中信 + +// xn--fjq720a : 2014-05-22 Will Bloom, LLC +娱乐 + +// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. +谷歌 + +// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited +電訊盈科 + +// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited +购物 + +// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l. +クラウド + +// xn--gk3at1e : 2015-10-08 Amazon EU S.à r.l. +通販 + +// xn--hxt814e : 2014-05-15 Zodiac Libra Limited +网店 + +// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry +संगठन + +// xn--imr513n : 2014-12-11 Dot Trademark TLD Holding Company Limited +餐厅 + +// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +网络 + +// xn--j1aef : 2015-01-15 VeriSign Sarl +ком + +// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation +诺基亚 + +// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l. +食品 + +// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. +飞利浦 + +// xn--kpu716f : 2014-12-22 Richemont DNS Inc. +手表 + +// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd +手机 + +// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company +ارامكو + +// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH +العليان + +// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +اتصالات + +// xn--mgbab2bd : 2013-10-31 CORE Association +بازار + +// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L. +موبايلي + +// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre +ابوظبي + +// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +كاثوليك + +// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +همراه + +// xn--mk1bu44c : 2015-01-15 VeriSign Sarl +닷컴 + +// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. +政府 + +// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. +شبكة + +// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House +بيتك + +// xn--ngbrx : 2015-11-12 League of Arab States +عرب + +// xn--nqv7f : 2013-11-14 Public Interest Registry +机构 + +// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry +组织机构 + +// xn--nyqy26a : 2014-11-07 Stable Tone Limited +健康 + +// xn--p1acf : 2013-12-12 Rusnames Limited +рус + +// xn--pbt977c : 2014-12-22 Richemont DNS Inc. +珠宝 + +// xn--pssy2u : 2015-01-15 VeriSign Sarl +大拿 + +// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. +みんな + +// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. +グーグル + +// xn--rhqv96g : 2013-09-11 Stable Tone Limited +世界 + +// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l. +書籍 + +// xn--ses554g : 2014-01-16 +网址 + +// xn--t60b56a : 2015-01-15 VeriSign Sarl +닷넷 + +// xn--tckwe : 2015-01-15 VeriSign Sarl +コム + +// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +天主教 + +// xn--unup4y : 2013-07-14 Spring Fields, LLC +游戏 + +// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberater + +// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberatung + +// xn--vhquv : 2013-08-27 Dash McCook, LLC +企业 + +// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. +信息 + +// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited +嘉里大酒店 + +// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited +嘉里 + +// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. +广东 + +// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center +政务 + +// xperia : 2015-05-14 Sony Mobile Communications AB +xperia + +// xyz : 2013-12-05 XYZ.COM LLC +xyz + +// yachts : 2014-01-09 DERYachts, LLC +yachts + +// yahoo : 2015-04-02 Yahoo! Domain Services Inc. +yahoo + +// yamaxun : 2014-12-18 Amazon EU S.à r.l. +yamaxun + +// yandex : 2014-04-10 YANDEX, LLC +yandex + +// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +yodobashi + +// yoga : 2014-05-29 Top Level Domain Holdings Limited +yoga + +// yokohama : 2013-12-12 GMO Registry, Inc. +yokohama + +// you : 2015-04-09 Amazon EU S.à r.l. +you + +// youtube : 2014-05-01 Charleston Road Registry Inc. +youtube + +// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +yun + +// zappos : 2015-06-25 Amazon EU S.à r.l. +zappos + +// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) +zara + +// zero : 2014-12-18 Amazon EU S.à r.l. +zero + +// zip : 2014-05-08 Charleston Road Registry Inc. +zip + +// zippo : 2015-07-02 Zadco Company +zippo + +// zone : 2013-11-14 Outer Falls, LLC +zone + +// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) +zuerich + + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== +// (Note: these are in alphabetical order by company name) + +// Agnat sp. z o.o. : https://domena.pl +// Submitted by Przemyslaw Plewa <it-admin@domena.pl> +beep.pl + +// Alces Software Ltd : http://alces-software.com +// Submitted by Mark J. Titorenko <mark.titorenko@alces-software.com> +*.compute.estate +*.alces.network + +// alwaysdata : https://www.alwaysdata.com +// Submitted by Cyril <admin@alwaysdata.com> +*.alwaysdata.net + +// Amazon CloudFront : https://aws.amazon.com/cloudfront/ +// Submitted by Donavan Miller <donavanm@amazon.com> +cloudfront.net + +// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +*.compute.amazonaws.com +*.compute-1.amazonaws.com +*.compute.amazonaws.com.cn +us-east-1.amazonaws.com + +// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +elasticbeanstalk.cn-north-1.amazonaws.com.cn +*.elasticbeanstalk.com + +// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +*.elb.amazonaws.com +*.elb.amazonaws.com.cn + +// Amazon S3 : https://aws.amazon.com/s3/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +s3.amazonaws.com +s3-ap-northeast-1.amazonaws.com +s3-ap-northeast-2.amazonaws.com +s3-ap-south-1.amazonaws.com +s3-ap-southeast-1.amazonaws.com +s3-ap-southeast-2.amazonaws.com +s3-ca-central-1.amazonaws.com +s3-eu-central-1.amazonaws.com +s3-eu-west-1.amazonaws.com +s3-eu-west-2.amazonaws.com +s3-external-1.amazonaws.com +s3-fips-us-gov-west-1.amazonaws.com +s3-sa-east-1.amazonaws.com +s3-us-gov-west-1.amazonaws.com +s3-us-east-2.amazonaws.com +s3-us-west-1.amazonaws.com +s3-us-west-2.amazonaws.com +s3.ap-northeast-2.amazonaws.com +s3.ap-south-1.amazonaws.com +s3.cn-north-1.amazonaws.com.cn +s3.ca-central-1.amazonaws.com +s3.eu-central-1.amazonaws.com +s3.eu-west-2.amazonaws.com +s3.us-east-2.amazonaws.com +s3.dualstack.ap-northeast-1.amazonaws.com +s3.dualstack.ap-northeast-2.amazonaws.com +s3.dualstack.ap-south-1.amazonaws.com +s3.dualstack.ap-southeast-1.amazonaws.com +s3.dualstack.ap-southeast-2.amazonaws.com +s3.dualstack.ca-central-1.amazonaws.com +s3.dualstack.eu-central-1.amazonaws.com +s3.dualstack.eu-west-1.amazonaws.com +s3.dualstack.eu-west-2.amazonaws.com +s3.dualstack.sa-east-1.amazonaws.com +s3.dualstack.us-east-1.amazonaws.com +s3.dualstack.us-east-2.amazonaws.com +s3-website-us-east-1.amazonaws.com +s3-website-us-west-1.amazonaws.com +s3-website-us-west-2.amazonaws.com +s3-website-ap-northeast-1.amazonaws.com +s3-website-ap-southeast-1.amazonaws.com +s3-website-ap-southeast-2.amazonaws.com +s3-website-eu-west-1.amazonaws.com +s3-website-sa-east-1.amazonaws.com +s3-website.ap-northeast-2.amazonaws.com +s3-website.ap-south-1.amazonaws.com +s3-website.ca-central-1.amazonaws.com +s3-website.eu-central-1.amazonaws.com +s3-website.eu-west-2.amazonaws.com +s3-website.us-east-2.amazonaws.com + +// Amune : https://amune.org/ +// Submitted by Team Amune <cert@amune.org> +t3l3p0rt.net +tele.amune.org + +// Aptible : https://www.aptible.com/ +// Submitted by Thomas Orozco <thomas@aptible.com> +on-aptible.com + +// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ +// Submitted by Hector Martin <marcan@euskalencounter.org> +user.party.eus + +// Association potager.org : https://potager.org/ +// Submitted by Lunar <jardiniers@potager.org> +pimienta.org +poivron.org +potager.org +sweetpepper.org + +// ASUSTOR Inc. : http://www.asustor.com +// Submitted by Vincent Tseng <vincenttseng@asustor.com> +myasustor.com + +// AVM : https://avm.de +// Submitted by Andreas Weise <a.weise@avm.de> +myfritz.net + +// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com +// Submitted by James Kennedy <domains@advisorwebsites.com> +*.awdev.ca +*.advisor.ws + +// backplane : https://www.backplane.io +// Submitted by Anthony Voutas <anthony@backplane.io> +backplaneapp.io + +// BetaInABox +// Submitted by Adrian <adrian@betainabox.com> +betainabox.com + +// BinaryLane : http://www.binarylane.com +// Submitted by Nathan O'Sullivan <nathan@mammoth.com.au> +bnr.la + +// Boxfuse : https://boxfuse.com +// Submitted by Axel Fontaine <axel@boxfuse.com> +boxfuse.io + +// bplaced : https://www.bplaced.net/ +// Submitted by Miroslav Bozic <security@bplaced.net> +square7.ch +bplaced.com +bplaced.de +square7.de +bplaced.net +square7.net + +// BrowserSafetyMark +// Submitted by Dave Tharp <browsersafetymark.io@quicinc.com> +browsersafetymark.io + +// callidomus : https://www.callidomus.com/ +// Submitted by Marcus Popp <admin@callidomus.com> +mycd.eu + +// CentralNic : http://www.centralnic.com/names/domains +// Submitted by registry <gavin.brown@centralnic.com> +ae.org +ar.com +br.com +cn.com +com.de +com.se +de.com +eu.com +gb.com +gb.net +hu.com +hu.net +jp.net +jpn.com +kr.com +mex.com +no.com +qc.com +ru.com +sa.com +se.com +se.net +uk.com +uk.net +us.com +uy.com +za.bz +za.com + +// Africa.com Web Solutions Ltd : https://registry.africa.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +africa.com + +// iDOT Services Limited : http://www.domain.gr.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +gr.com + +// Radix FZC : http://domains.in.net +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +in.net + +// US REGISTRY LLC : http://us.org +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +us.org + +// co.com Registry, LLC : https://registry.co.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +co.com + +// c.la : http://www.c.la/ +c.la + +// certmgr.org : https://certmgr.org +// Submitted by B. Blechschmidt <hostmaster@certmgr.org> +certmgr.org + +// Citrix : https://citrix.com +// Submitted by Alex Stoddard <alex.stoddard@citrix.com> +xenapponazure.com + +// ClearVox : http://www.clearvox.nl/ +// Submitted by Leon Rowland <leon@clearvox.nl> +virtueeldomein.nl + +// Cloud66 : https://www.cloud66.com/ +// Submitted by Khash Sajadi <khash@cloud66.com> +c66.me + +// cloudControl : https://www.cloudcontrol.com/ +// Submitted by Tobias Wilken <tw@cloudcontrol.com> +cloudcontrolled.com +cloudcontrolapp.com + +// co.ca : http://registry.co.ca/ +co.ca + +// i-registry s.r.o. : http://www.i-registry.cz/ +// Submitted by Martin Semrad <semrad@i-registry.cz> +co.cz + +// CDN77.com : http://www.cdn77.com +// Submitted by Jan Krpes <jan.krpes@cdn77.com> +c.cdn77.org +cdn77-ssl.net +r.cdn77.net +rsc.cdn77.org +ssl.origin.cdn77-secure.org + +// Cloud DNS Ltd : http://www.cloudns.net +// Submitted by Aleksander Hristov <noc@cloudns.net> +cloudns.asia +cloudns.biz +cloudns.club +cloudns.cc +cloudns.eu +cloudns.in +cloudns.info +cloudns.org +cloudns.pro +cloudns.pw +cloudns.us + +// CoDNS B.V. +co.nl +co.no + +// COSIMO GmbH : http://www.cosimo.de +// Submitted by Rene Marticke <rmarticke@cosimo.de> +dyn.cosidns.de +dynamisches-dns.de +dnsupdater.de +internet-dns.de +l-o-g-i-n.de +dynamic-dns.info +feste-ip.net +knx-server.net +static-access.net + +// Craynic, s.r.o. : http://www.craynic.com/ +// Submitted by Ales Krajnik <ales.krajnik@craynic.com> +realm.cz + +// Cryptonomic : https://cryptonomic.net/ +// Submitted by Andrew Cady <public-suffix-list@cryptonomic.net> +*.cryptonomic.net + +// Cupcake : https://cupcake.io/ +// Submitted by Jonathan Rudenberg <jonathan@cupcake.io> +cupcake.is + +// cyon GmbH : https://www.cyon.ch/ +// Submitted by Dominic Luechinger <dol@cyon.ch> +cyon.link +cyon.site + +// Daplie, Inc : https://daplie.com +// Submitted by AJ ONeal <aj@daplie.com> +daplie.me +localhost.daplie.me + +// Dansk.net : http://www.dansk.net/ +// Submitted by Anani Voule <digital@digital.co.dk> +biz.dk +co.dk +firm.dk +reg.dk +store.dk + +// deSEC : https://desec.io/ +// Submitted by Peter Thomassen <peter@desec.io> +dedyn.io + +// DNShome : https://www.dnshome.de/ +// Submitted by Norbert Auler <mail@dnshome.de> +dnshome.de + +// DreamHost : http://www.dreamhost.com/ +// Submitted by Andrew Farmer <andrew.farmer@dreamhost.com> +dreamhosters.com + +// Drobo : http://www.drobo.com/ +// Submitted by Ricardo Padilha <rpadilha@drobo.com> +mydrobo.com + +// Drud Holdings, LLC. : https://www.drud.com/ +// Submitted by Kevin Bridges <kevin@drud.com> +drud.io +drud.us + +// DuckDNS : http://www.duckdns.org/ +// Submitted by Richard Harper <richard@duckdns.org> +duckdns.org + +// dy.fi : http://dy.fi/ +// Submitted by Heikki Hannikainen <hessu@hes.iki.fi> +dy.fi +tunk.org + +// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ +dyndns-at-home.com +dyndns-at-work.com +dyndns-blog.com +dyndns-free.com +dyndns-home.com +dyndns-ip.com +dyndns-mail.com +dyndns-office.com +dyndns-pics.com +dyndns-remote.com +dyndns-server.com +dyndns-web.com +dyndns-wiki.com +dyndns-work.com +dyndns.biz +dyndns.info +dyndns.org +dyndns.tv +at-band-camp.net +ath.cx +barrel-of-knowledge.info +barrell-of-knowledge.info +better-than.tv +blogdns.com +blogdns.net +blogdns.org +blogsite.org +boldlygoingnowhere.org +broke-it.net +buyshouses.net +cechire.com +dnsalias.com +dnsalias.net +dnsalias.org +dnsdojo.com +dnsdojo.net +dnsdojo.org +does-it.net +doesntexist.com +doesntexist.org +dontexist.com +dontexist.net +dontexist.org +doomdns.com +doomdns.org +dvrdns.org +dyn-o-saur.com +dynalias.com +dynalias.net +dynalias.org +dynathome.net +dyndns.ws +endofinternet.net +endofinternet.org +endoftheinternet.org +est-a-la-maison.com +est-a-la-masion.com +est-le-patron.com +est-mon-blogueur.com +for-better.biz +for-more.biz +for-our.info +for-some.biz +for-the.biz +forgot.her.name +forgot.his.name +from-ak.com +from-al.com +from-ar.com +from-az.net +from-ca.com +from-co.net +from-ct.com +from-dc.com +from-de.com +from-fl.com +from-ga.com +from-hi.com +from-ia.com +from-id.com +from-il.com +from-in.com +from-ks.com +from-ky.com +from-la.net +from-ma.com +from-md.com +from-me.org +from-mi.com +from-mn.com +from-mo.com +from-ms.com +from-mt.com +from-nc.com +from-nd.com +from-ne.com +from-nh.com +from-nj.com +from-nm.com +from-nv.com +from-ny.net +from-oh.com +from-ok.com +from-or.com +from-pa.com +from-pr.com +from-ri.com +from-sc.com +from-sd.com +from-tn.com +from-tx.com +from-ut.com +from-va.com +from-vt.com +from-wa.com +from-wi.com +from-wv.com +from-wy.com +ftpaccess.cc +fuettertdasnetz.de +game-host.org +game-server.cc +getmyip.com +gets-it.net +go.dyndns.org +gotdns.com +gotdns.org +groks-the.info +groks-this.info +ham-radio-op.net +here-for-more.info +hobby-site.com +hobby-site.org +home.dyndns.org +homedns.org +homeftp.net +homeftp.org +homeip.net +homelinux.com +homelinux.net +homelinux.org +homeunix.com +homeunix.net +homeunix.org +iamallama.com +in-the-band.net +is-a-anarchist.com +is-a-blogger.com +is-a-bookkeeper.com +is-a-bruinsfan.org +is-a-bulls-fan.com +is-a-candidate.org +is-a-caterer.com +is-a-celticsfan.org +is-a-chef.com +is-a-chef.net +is-a-chef.org +is-a-conservative.com +is-a-cpa.com +is-a-cubicle-slave.com +is-a-democrat.com +is-a-designer.com +is-a-doctor.com +is-a-financialadvisor.com +is-a-geek.com +is-a-geek.net +is-a-geek.org +is-a-green.com +is-a-guru.com +is-a-hard-worker.com +is-a-hunter.com +is-a-knight.org +is-a-landscaper.com +is-a-lawyer.com +is-a-liberal.com +is-a-libertarian.com +is-a-linux-user.org +is-a-llama.com +is-a-musician.com +is-a-nascarfan.com +is-a-nurse.com +is-a-painter.com +is-a-patsfan.org +is-a-personaltrainer.com +is-a-photographer.com +is-a-player.com +is-a-republican.com +is-a-rockstar.com +is-a-socialist.com +is-a-soxfan.org +is-a-student.com +is-a-teacher.com +is-a-techie.com +is-a-therapist.com +is-an-accountant.com +is-an-actor.com +is-an-actress.com +is-an-anarchist.com +is-an-artist.com +is-an-engineer.com +is-an-entertainer.com +is-by.us +is-certified.com +is-found.org +is-gone.com +is-into-anime.com +is-into-cars.com +is-into-cartoons.com +is-into-games.com +is-leet.com +is-lost.org +is-not-certified.com +is-saved.org +is-slick.com +is-uberleet.com +is-very-bad.org +is-very-evil.org +is-very-good.org +is-very-nice.org +is-very-sweet.org +is-with-theband.com +isa-geek.com +isa-geek.net +isa-geek.org +isa-hockeynut.com +issmarterthanyou.com +isteingeek.de +istmein.de +kicks-ass.net +kicks-ass.org +knowsitall.info +land-4-sale.us +lebtimnetz.de +leitungsen.de +likes-pie.com +likescandy.com +merseine.nu +mine.nu +misconfused.org +mypets.ws +myphotos.cc +neat-url.com +office-on-the.net +on-the-web.tv +podzone.net +podzone.org +readmyblog.org +saves-the-whales.com +scrapper-site.net +scrapping.cc +selfip.biz +selfip.com +selfip.info +selfip.net +selfip.org +sells-for-less.com +sells-for-u.com +sells-it.net +sellsyourhome.org +servebbs.com +servebbs.net +servebbs.org +serveftp.net +serveftp.org +servegame.org +shacknet.nu +simple-url.com +space-to-rent.com +stuff-4-sale.org +stuff-4-sale.us +teaches-yoga.com +thruhere.net +traeumtgerade.de +webhop.biz +webhop.info +webhop.net +webhop.org +worse-than.tv +writesthisblog.com + +// ddnss.de : https://www.ddnss.de/ +// Submitted by Robert Niedziela <webmaster@ddnss.de> +ddnss.de +dyn.ddnss.de +dyndns.ddnss.de +dyndns1.de +dyn-ip24.de +home-webserver.de +dyn.home-webserver.de +myhome-server.de +ddnss.org + +// dynv6 : https://dynv6.com +// Submitted by Dominik Menke <dom@digineo.de> +dynv6.net + +// E4YOU spol. s.r.o. : https://e4you.cz/ +// Submitted by Vladimir Dudr <info@e4you.cz> +e4.cz + +// Enonic : http://enonic.com/ +// Submitted by Erik Kaareng-Sunde <esu@enonic.com> +enonic.io +customer.enonic.io + +// EU.org https://eu.org/ +// Submitted by Pierre Beyssac <hostmaster@eu.org> +eu.org +al.eu.org +asso.eu.org +at.eu.org +au.eu.org +be.eu.org +bg.eu.org +ca.eu.org +cd.eu.org +ch.eu.org +cn.eu.org +cy.eu.org +cz.eu.org +de.eu.org +dk.eu.org +edu.eu.org +ee.eu.org +es.eu.org +fi.eu.org +fr.eu.org +gr.eu.org +hr.eu.org +hu.eu.org +ie.eu.org +il.eu.org +in.eu.org +int.eu.org +is.eu.org +it.eu.org +jp.eu.org +kr.eu.org +lt.eu.org +lu.eu.org +lv.eu.org +mc.eu.org +me.eu.org +mk.eu.org +mt.eu.org +my.eu.org +net.eu.org +ng.eu.org +nl.eu.org +no.eu.org +nz.eu.org +paris.eu.org +pl.eu.org +pt.eu.org +q-a.eu.org +ro.eu.org +ru.eu.org +se.eu.org +si.eu.org +sk.eu.org +tr.eu.org +uk.eu.org +us.eu.org + +// Evennode : http://www.evennode.com/ +// Submitted by Michal Kralik <support@evennode.com> +eu-1.evennode.com +eu-2.evennode.com +eu-3.evennode.com +us-1.evennode.com +us-2.evennode.com +us-3.evennode.com + +// eDirect Corp. : https://hosting.url.com.tw/ +// Submitted by C.S. chang <cschang@corp.url.com.tw> +twmail.cc +twmail.net +twmail.org +mymailer.com.tw +url.tw + +// Facebook, Inc. +// Submitted by Peter Ruibal <public-suffix@fb.com> +apps.fbsbx.com + +// FAITID : https://faitid.org/ +// Submitted by Maxim Alzoba <tech.contact@faitid.org> +// https://www.flexireg.net/stat_info +ru.net +adygeya.ru +bashkiria.ru +bir.ru +cbg.ru +com.ru +dagestan.ru +grozny.ru +kalmykia.ru +kustanai.ru +marine.ru +mordovia.ru +msk.ru +mytis.ru +nalchik.ru +nov.ru +pyatigorsk.ru +spb.ru +vladikavkaz.ru +vladimir.ru +abkhazia.su +adygeya.su +aktyubinsk.su +arkhangelsk.su +armenia.su +ashgabad.su +azerbaijan.su +balashov.su +bashkiria.su +bryansk.su +bukhara.su +chimkent.su +dagestan.su +east-kazakhstan.su +exnet.su +georgia.su +grozny.su +ivanovo.su +jambyl.su +kalmykia.su +kaluga.su +karacol.su +karaganda.su +karelia.su +khakassia.su +krasnodar.su +kurgan.su +kustanai.su +lenug.su +mangyshlak.su +mordovia.su +msk.su +murmansk.su +nalchik.su +navoi.su +north-kazakhstan.su +nov.su +obninsk.su +penza.su +pokrovsk.su +sochi.su +spb.su +tashkent.su +termez.su +togliatti.su +troitsk.su +tselinograd.su +tula.su +tuva.su +vladikavkaz.su +vladimir.su +vologda.su + +// Fastly Inc. : http://www.fastly.com/ +// Submitted by Fastly Security <security@fastly.com> +fastlylb.net +map.fastlylb.net +freetls.fastly.net +map.fastly.net +a.prod.fastly.net +global.prod.fastly.net +a.ssl.fastly.net +b.ssl.fastly.net +global.ssl.fastly.net + +// Featherhead : https://featherhead.xyz/ +// Submitted by Simon Menke <simon@featherhead.xyz> +fhapp.xyz + +// Fedora : https://fedoraproject.org/ +// submitted by Patrick Uiterwijk <puiterwijk@fedoraproject.org> +fedorainfracloud.org +fedorapeople.org +cloud.fedoraproject.org + +// Firebase, Inc. +// Submitted by Chris Raynor <chris@firebase.com> +firebaseapp.com + +// Flynn : https://flynn.io +// Submitted by Jonathan Rudenberg <jonathan@flynn.io> +flynnhub.com + +// Freebox : http://www.freebox.fr +// Submitted by Romain Fliedel <rfliedel@freebox.fr> +freebox-os.com +freeboxos.com +fbx-os.fr +fbxos.fr +freebox-os.fr +freeboxos.fr + +// Fusion Intranet : https://www.fusion-intranet.com +// Submitted by Matthias Burtscher <matthias.burtscher@fusonic.net> +myfusion.cloud + +// Futureweb OG : http://www.futureweb.at +// Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at> +futurehosting.at +futuremailing.at +*.ex.ortsinfo.at +*.kunden.ortsinfo.at +*.statics.cloud + +// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains +// Submitted by David Illsley <david.illsley@digital.cabinet-office.gov.uk> +service.gov.uk + +// GitHub, Inc. +// Submitted by Patrick Toomey <security@github.com> +github.io +githubusercontent.com +githubcloud.com +*.api.githubcloud.com +*.ext.githubcloud.com +gist.githubcloud.com +*.githubcloudusercontent.com + +// GitLab, Inc. +// Submitted by Alex Hanselka <alex@gitlab.com> +gitlab.io + +// UKHomeOffice : https://www.gov.uk/government/organisations/home-office +// Submitted by Jon Shanks <jon.shanks@digital.homeoffice.gov.uk> +homeoffice.gov.uk + +// GlobeHosting, Inc. +// Submitted by Zoltan Egresi <egresi@globehosting.com> +ro.im +shop.ro + +// GoIP DNS Services : http://www.goip.de +// Submitted by Christian Poulter <milchstrasse@goip.de> +goip.de + +// Google, Inc. +// Submitted by Eduardo Vela <evn@google.com> +*.0emm.com +appspot.com +blogspot.ae +blogspot.al +blogspot.am +blogspot.ba +blogspot.be +blogspot.bg +blogspot.bj +blogspot.ca +blogspot.cf +blogspot.ch +blogspot.cl +blogspot.co.at +blogspot.co.id +blogspot.co.il +blogspot.co.ke +blogspot.co.nz +blogspot.co.uk +blogspot.co.za +blogspot.com +blogspot.com.ar +blogspot.com.au +blogspot.com.br +blogspot.com.by +blogspot.com.co +blogspot.com.cy +blogspot.com.ee +blogspot.com.eg +blogspot.com.es +blogspot.com.mt +blogspot.com.ng +blogspot.com.tr +blogspot.com.uy +blogspot.cv +blogspot.cz +blogspot.de +blogspot.dk +blogspot.fi +blogspot.fr +blogspot.gr +blogspot.hk +blogspot.hr +blogspot.hu +blogspot.ie +blogspot.in +blogspot.is +blogspot.it +blogspot.jp +blogspot.kr +blogspot.li +blogspot.lt +blogspot.lu +blogspot.md +blogspot.mk +blogspot.mr +blogspot.mx +blogspot.my +blogspot.nl +blogspot.no +blogspot.pe +blogspot.pt +blogspot.qa +blogspot.re +blogspot.ro +blogspot.rs +blogspot.ru +blogspot.se +blogspot.sg +blogspot.si +blogspot.sk +blogspot.sn +blogspot.td +blogspot.tw +blogspot.ug +blogspot.vn +cloudfunctions.net +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +publishproxy.com +withgoogle.com +withyoutube.com + +// Hashbang : https://hashbang.sh +hashbang.sh + +// Hasura : https://hasura.io +// Submitted by Shahidh K Muhammed <shahidh@hasura.io> +hasura-app.io + +// Hepforge : https://www.hepforge.org +// Submitted by David Grellscheid <admin@hepforge.org> +hepforge.org + +// Heroku : https://www.heroku.com/ +// Submitted by Tom Maher <tmaher@heroku.com> +herokuapp.com +herokussl.com + +// Ici la Lune : http://www.icilalune.com/ +// Submitted by Simon Morvan <simon@icilalune.com> +moonscale.net + +// iki.fi +// Submitted by Hannu Aronsson <haa@iki.fi> +iki.fi + +// info.at : http://www.info.at/ +biz.at +info.at + +// Interlegis : http://www.interlegis.leg.br +// Submitted by Gabriel Ferreira <registrobr@interlegis.leg.br> +ac.leg.br +al.leg.br +am.leg.br +ap.leg.br +ba.leg.br +ce.leg.br +df.leg.br +es.leg.br +go.leg.br +ma.leg.br +mg.leg.br +ms.leg.br +mt.leg.br +pa.leg.br +pb.leg.br +pe.leg.br +pi.leg.br +pr.leg.br +rj.leg.br +rn.leg.br +ro.leg.br +rr.leg.br +rs.leg.br +sc.leg.br +se.leg.br +sp.leg.br +to.leg.br + +// IPiFony Systems, Inc. : https://www.ipifony.com/ +// Submitted by Matthew Hardeman <mhardeman@ipifony.com> +ipifony.net + +// Joyent : https://www.joyent.com/ +// Submitted by Brian Bennett <brian.bennett@joyent.com> +*.triton.zone +*.cns.joyent.com + +// JS.ORG : http://dns.js.org +// Submitted by Stefan Keim <admin@js.org> +js.org + +// Keyweb AG : https://www.keyweb.de +// Submitted by Martin Dannehl <postmaster@keymachine.de> +keymachine.de + +// KnightPoint Systems, LLC : http://www.knightpoint.com/ +// Submitted by Roy Keene <rkeene@knightpoint.com> +knightpoint.systems + +// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf +co.krd +edu.krd + +// Magento Commerce +// Submitted by Damien Tournoud <dtournoud@magento.cloud> +*.magentosite.cloud + +// Mail.Ru Group : https://hb.cldmail.ru +// Submitted by Ilya Zaretskiy <zaretskiy@corp.mail.ru> +hb.cldmail.ru + +// Meteor Development Group : https://www.meteor.com/hosting +// Submitted by Pierre Carrier <pierre@meteor.com> +meteorapp.com +eu.meteorapp.com + +// Michau Enterprises Limited : http://www.co.pl/ +co.pl + +// Microsoft : http://microsoft.com +// Submitted by Barry Dorrans <bdorrans@microsoft.com> +azurewebsites.net +azure-mobile.net +cloudapp.net + +// Mozilla Foundation : https://mozilla.org/ +// Submitted by glob <glob@mozilla.com> +bmoattachments.org + +// Neustar Inc. +// Submitted by Trung Tran <Trung.Tran@neustar.biz> +4u.com + +// ngrok : https://ngrok.com/ +// Submitted by Alan Shreve <alan@ngrok.com> +ngrok.io + +// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ +// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net> +nfshost.com + +// nsupdate.info : https://www.nsupdate.info/ +// Submitted by Thomas Waldmann <info@nsupdate.info> +nsupdate.info +nerdpol.ovh + +// No-IP.com : https://noip.com/ +// Submitted by Deven Reza <publicsuffixlist@noip.com> +blogsyte.com +brasilia.me +cable-modem.org +ciscofreak.com +collegefan.org +couchpotatofries.org +damnserver.com +ddns.me +ditchyourip.com +dnsfor.me +dnsiskinky.com +dvrcam.info +dynns.com +eating-organic.net +fantasyleague.cc +geekgalaxy.com +golffan.us +health-carereform.com +homesecuritymac.com +homesecuritypc.com +hopto.me +ilovecollege.info +loginto.me +mlbfan.org +mmafan.biz +myactivedirectory.com +mydissent.net +myeffect.net +mymediapc.net +mypsx.net +mysecuritycamera.com +mysecuritycamera.net +mysecuritycamera.org +net-freaks.com +nflfan.org +nhlfan.net +no-ip.ca +no-ip.co.uk +no-ip.net +noip.us +onthewifi.com +pgafan.net +point2this.com +pointto.us +privatizehealthinsurance.net +quicksytes.com +read-books.org +securitytactics.com +serveexchange.com +servehumour.com +servep2p.com +servesarcasm.com +stufftoread.com +ufcfan.org +unusualperson.com +workisboring.com +3utilities.com +bounceme.net +ddns.net +ddnsking.com +gotdns.ch +hopto.org +myftp.biz +myftp.org +myvnc.com +no-ip.biz +no-ip.info +no-ip.org +noip.me +redirectme.net +servebeer.com +serveblog.net +servecounterstrike.com +serveftp.com +servegame.com +servehalflife.com +servehttp.com +serveirc.com +serveminecraft.net +servemp3.com +servepics.com +servequake.com +sytes.net +webhop.me +zapto.org + +// NYC.mn : http://www.information.nyc.mn +// Submitted by Matthew Brown <mattbrown@nyc.mn> +nyc.mn + +// Octopodal Solutions, LLC. : https://ulterius.io/ +// Submitted by Andrew Sampson <andrew@ulterius.io> +cya.gg + +// One Fold Media : http://www.onefoldmedia.com/ +// Submitted by Eddie Jones <eddie@onefoldmedia.com> +nid.io + +// OpenCraft GmbH : http://opencraft.com/ +// Submitted by Sven Marnach <sven@opencraft.com> +opencraft.hosting + +// Opera Software, A.S.A. +// Submitted by Yngve Pettersen <yngve@opera.com> +operaunite.com + +// OutSystems +// Submitted by Duarte Santos <domain-admin@outsystemscloud.com> +outsystemscloud.com + +// OwnProvider : http://www.ownprovider.com +// Submitted by Jan Moennich <jan.moennich@ownprovider.com> +ownprovider.com + +// oy.lc +// Submitted by Charly Coste <changaco@changaco.oy.lc> +oy.lc + +// Pagefog : https://pagefog.com/ +// Submitted by Derek Myers <derek@pagefog.com> +pgfog.com + +// Pagefront : https://www.pagefronthq.com/ +// Submitted by Jason Kriss <jason@pagefronthq.com> +pagefrontapp.com + +// .pl domains (grandfathered) +art.pl +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// Pantheon Systems, Inc. : https://pantheon.io/ +// Submitted by Gary Dylina <gary@pantheon.io> +pantheonsite.io +gotpantheon.com + +// Peplink | Pepwave : http://peplink.com/ +// Submitted by Steve Leung <steveleung@peplink.com> +mypep.link + +// Planet-Work : https://www.planet-work.com/ +// Submitted by Frédéric VANNIÈRE <f.vanniere@planet-work.com> +on-web.fr + +// Platform.sh : https://platform.sh +// Submitted by Nikola Kotur <nikola@platform.sh> +*.platform.sh +*.platformsh.site + +// prgmr.com : https://prgmr.com/ +// Submitted by Sarah Newman <owner@prgmr.com> +xen.prgmr.com + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry <lendl@nic.at> +priv.at + +// Protonet GmbH : http://protonet.io +// Submitted by Martin Meier <admin@protonet.io> +protonet.io + +// Publication Presse Communication SARL : https://ppcom.fr +// Submitted by Yaacov Akiba Slama <admin@chirurgiens-dentistes-en-france.fr> +chirurgiens-dentistes-en-france.fr + +// QA2 +// Submitted by Daniel Dent (https://www.danieldent.com/) +qa2.com + +// QNAP System Inc : https://www.qnap.com +// Submitted by Nick Chang <nickchang@qnap.com> +dev-myqnapcloud.com +alpha-myqnapcloud.com +myqnapcloud.com + +// Quip : https://quip.com +// Submitted by Patrick Linehan <plinehan@quip.com> +*.quipelements.com + +// Qutheory LLC : http://qutheory.io +// Submitted by Jonas Schwartz <jonas@qutheory.io> +vapor.cloud +vaporcloud.io + +// Rackmaze LLC : https://www.rackmaze.com +// Submitted by Kirill Pertsev <kika@rackmaze.com> +rackmaze.com +rackmaze.net + +// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ +// Submitted by Tim Kramer <tkramer@rhcloud.com> +rhcloud.com + +// RethinkDB : https://www.rethinkdb.com/ +// Submitted by Chris Kastorff <info@rethinkdb.com> +hzc.io + +// Revitalised Limited : http://www.revitalised.co.uk +// Submitted by Jack Price <jack@revitalised.co.uk> +wellbeingzone.eu +ptplus.fit +wellbeingzone.co.uk + +// Sandstorm Development Group, Inc. : https://sandcats.io/ +// Submitted by Asheesh Laroia <asheesh@sandstorm.io> +sandcats.io + +// SBE network solutions GmbH : https://www.sbe.de/ +// Submitted by Norman Meilick <nm@sbe.de> +logoip.de +logoip.com + +// Securepoint GmbH : https://www.securepoint.de +// Submitted by Erik Anders <erik.anders@securepoint.de> +firewall-gateway.com +firewall-gateway.de +my-gateway.de +my-router.de +spdns.de +spdns.eu +firewall-gateway.net +my-firewall.org +myfirewall.org +spdns.org + +// SensioLabs, SAS : https://sensiolabs.com/ +// Submitted by Fabien Potencier <fabien.potencier@sensiolabs.com> +*.sensiosite.cloud + +// Service Online LLC : http://drs.ua/ +// Submitted by Serhii Bulakh <support@drs.ua> +biz.ua +co.ua +pp.ua + +// ShiftEdit : https://shiftedit.net/ +// Submitted by Adam Jimenez <adam@shiftcreate.com> +shiftedit.io + +// Shopblocks : http://www.shopblocks.com/ +// Submitted by Alex Bowers <alex@shopblocks.com> +myshopblocks.com + +// SinaAppEngine : http://sae.sina.com.cn/ +// Submitted by SinaAppEngine <saesupport@sinacloud.com> +1kapp.com +appchizi.com +applinzi.com +sinaapp.com +vipsinaapp.com + +// Skyhat : http://www.skyhat.io +// Submitted by Shante Adam <shante@skyhat.io> +bounty-full.com +alpha.bounty-full.com +beta.bounty-full.com + +// staticland : https://static.land +// Submitted by Seth Vincent <sethvincent@gmail.com> +static.land +dev.static.land +sites.static.land + +// SourceLair PC : https://www.sourcelair.com +// Submitted by Antonis Kalipetis <akalipetis@sourcelair.com> +apps.lair.io +*.stolos.io + +// SpaceKit : https://www.spacekit.io/ +// Submitted by Reza Akhavan <spacekit.io@gmail.com> +spacekit.io + +// Stackspace : https://www.stackspace.io/ +// Submitted by Lina He <info@stackspace.io> +stackspace.space + +// Storj Labs Inc. : https://storj.io/ +// Submitted by Philip Hutchins <hostmaster@storj.io> +storj.farm + +// Synology, Inc. : https://www.synology.com/ +// Submitted by Rony Weng <ronyweng@synology.com> +diskstation.me +dscloud.biz +dscloud.me +dscloud.mobi +dsmynas.com +dsmynas.net +dsmynas.org +familyds.com +familyds.net +familyds.org +i234.me +myds.me +synology.me +vpnplus.to + +// TAIFUN Software AG : http://taifun-software.de +// Submitted by Bjoern Henke <dev-server@taifun-software.de> +taifun-dns.de + +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl + +// TownNews.com : http://www.townnews.com +// Submitted by Dustin Ward <dward@townnews.com> +bloxcms.com +townnews-staging.com + +// TransIP : htts://www.transip.nl +// Submitted by Rory Breuk <rbreuk@transip.nl> +*.transurl.be +*.transurl.eu +*.transurl.nl + +// TuxFamily : http://tuxfamily.org +// Submitted by TuxFamily administrators <adm@staff.tuxfamily.org> +tuxfamily.org + +// TwoDNS : https://www.twodns.de/ +// Submitted by TwoDNS-Support <support@two-dns.de> +dd-dns.de +diskstation.eu +diskstation.org +dray-dns.de +draydns.de +dyn-vpn.de +dynvpn.de +mein-vigor.de +my-vigor.de +my-wan.de +syno-ds.de +synology-diskstation.de +synology-ds.de + +// Uberspace : https://uberspace.de +// Submitted by Moritz Werner <mwerner@jonaspasche.com> +uber.space + +// UDR Limited : http://www.udr.hk.com +// Submitted by registry <hostmaster@udr.hk.com> +hk.com +hk.org +ltd.hk +inc.hk + +// .US +// Submitted by Ed Moore <Ed.Moore@lib.de.us> +lib.de.us + +// Viprinet Europe GmbH : http://www.viprinet.com +// Submitted by Simon Kissel <hostmaster@viprinet.com> +router.management + +// Western Digital Technologies, Inc : https://www.wdc.com +// Submitted by Jung Jin <jungseok.jin@wdc.com> +remotewd.com + +// Wikimedia Labs : https://wikitech.wikimedia.org +// Submitted by Yuvi Panda <yuvipanda@wikimedia.org> +wmflabs.org + +// XS4ALL Internet bv : https://www.xs4all.nl/ +// Submitted by Daniel Mostertman <unixbeheer+publicsuffix@xs4all.net> +xs4all.space + +// Yola : https://www.yola.com/ +// Submitted by Stefano Rivera <stefano@yola.com> +yolasite.com + +// Yombo : https://yombo.net +// Submitted by Mitch Schwenk <mitch@yombo.net> +ybo.faith +yombo.me +homelink.one +ybo.party +ybo.review +ybo.science +ybo.trade + +// ZaNiC : http://www.za.net/ +// Submitted by registry <hostmaster@nic.za.net> +za.net +za.org + +// Zeit, Inc. : https://zeit.domains/ +// Submitted by Olli Vanhoja <olli@zeit.co> +now.sh + +// 1GB LLC : https://www.1gb.ua/ +// Submitted by 1GB LLC <noc@1gb.com.ua> +cc.ua +inf.ua +ltd.ua + +// ===END PRIVATE DOMAINS=== diff --git a/Contents/Libraries/Shared/tld/result.py b/Contents/Libraries/Shared/tld/result.py new file mode 100644 index 000000000..ead92a246 --- /dev/null +++ b/Contents/Libraries/Shared/tld/result.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from typing import Dict +try: + from urllib.parse import SplitResult +except ImportError: + from six.moves.urllib_parse import SplitResult +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'Result',) + + +class Result(object): + u'Container.' + __slots__ = (u'subdomain', u'domain', u'tld', u'__fld', u'parsed_url') + + def __init__(self, tld, domain, subdomain, parsed_url): + self.tld = tld + self.domain = (domain if (domain != u'') else tld) + self.subdomain = subdomain + self.parsed_url = parsed_url + if domain: + self.__fld = u''.join( + [u'{}'.format(self.domain), u'.', u'{}'.format(self.tld)]) + else: + self.__fld = self.tld + + @property + def extension(self): + u'Alias of ``tld``.\n\n :return str:\n ' + return self.tld + suffix = extension + + @property + def fld(self): + u'First level domain.\n\n :return:\n :rtype: str\n ' + return self.__fld + + def __str__(self): + return self.tld + __repr__ = __str__ + + @property + def __dict__(self): + u'Mimic __dict__ functionality.\n\n :return:\n :rtype: dict\n ' + return { + u'tld': self.tld, + u'domain': self.domain, + u'subdomain': self.subdomain, + u'fld': self.fld, + u'parsed_url': self.parsed_url, + } diff --git a/Contents/Libraries/Shared/tld/tests/__init__.py b/Contents/Libraries/Shared/tld/tests/__init__.py new file mode 100644 index 000000000..9da93dcb3 --- /dev/null +++ b/Contents/Libraries/Shared/tld/tests/__init__.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +import unittest +from .test_core import * +from .test_commands import * +if (__name__ == u'__main__'): + unittest.main() diff --git a/Contents/Libraries/Shared/tld/tests/base.py b/Contents/Libraries/Shared/tld/tests/base.py new file mode 100644 index 000000000..3029ada93 --- /dev/null +++ b/Contents/Libraries/Shared/tld/tests/base.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from backports.functools_lru_cache import lru_cache +import logging +import socket +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'internet_available_only', u'log_info') +LOG_INFO = True +LOGGER = logging.getLogger(__name__) + + +def log_info(func): + u'Log some useful info.' + if (not LOG_INFO): + return func + + def inner(self, *args, **kwargs): + u'Inner.' + result = func(*([self] + list(args)), **kwargs) + LOGGER.debug(u'\n\n%s', func.__name__) + LOGGER.debug(u'============================') + if func.__doc__: + LOGGER.debug(u'""" %s """', func.__doc__.strip()) + LOGGER.debug(u'----------------------------') + if (result is not None): + LOGGER.debug(result) + LOGGER.debug(u'\n++++++++++++++++++++++++++++') + return result + return inner + + +@lru_cache(maxsize=32) +def is_internet_available(host='8.8.8.8', port=53, timeout=3): + u'Check if internet is available.\n\n Host: 8.8.8.8 (google-public-dns-a.google.com)\n OpenPort: 53/tcp\n Service: domain (DNS/TCP)\n ' + try: + socket.setdefaulttimeout(timeout) + socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port)) + return True + except socket.error as ex: + print(ex) + return False + + +def internet_available_only(func): + + def inner(self, *args, **kwargs): + u'Inner.' + if (not is_internet_available()): + LOGGER.debug(u'\n\n%s', func.__name__) + LOGGER.debug(u'============================') + if func.__doc__: + LOGGER.debug(u'""" %s """', func.__doc__.strip()) + LOGGER.debug(u'----------------------------') + LOGGER.debug(u'Skipping because no Internet connection available.') + LOGGER.debug(u'\n++++++++++++++++++++++++++++') + return None + result = func(*([self] + list(args)), **kwargs) + return result + return inner diff --git a/Contents/Libraries/Shared/tld/tests/res/effective_tld_names_custom.dat.txt b/Contents/Libraries/Shared/tld/tests/res/effective_tld_names_custom.dat.txt new file mode 100644 index 000000000..b3b05190c --- /dev/null +++ b/Contents/Libraries/Shared/tld/tests/res/effective_tld_names_custom.dat.txt @@ -0,0 +1,12993 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, +// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. + +// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. + +// ===BEGIN ICANN DOMAINS=== + +// This one actually does not exist, added for testing purposes +foreverchild + +// ac : https://en.wikipedia.org/wiki/.ac +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : https://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : https://en.wikipedia.org/wiki/.ae +// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see https://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +freight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : https://www.amnic.net/policy/en/Policy_EN.pdf +am +co.am +com.am +commune.am +net.am +org.am + +// ao : https://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : https://en.wikipedia.org/wiki/.aq +aq + +// ar : https://nic.ar/nic-argentina/normativa-vigente +ar +com.ar +edu.ar +gob.ar +gov.ar +int.ar +mil.ar +musica.ar +net.ar +org.ar +tur.ar + +// arpa : https://en.wikipedia.org/wiki/.arpa +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +arpa +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : https://en.wikipedia.org/wiki/.as +as +gov.as + +// asia : https://en.wikipedia.org/wiki/.asia +asia + +// at : https://en.wikipedia.org/wiki/.at +// Confirmed by registry <it@nic.at> 2008-06-17 +at +ac.at +co.at +gv.at +or.at + +// au : https://en.wikipedia.org/wiki/.au +// http://www.auda.org.au/ +au +// 2LDs +com.au +net.au +org.au +edu.au +gov.au +asn.au +id.au +// Historic 2LDs (closed to new registration, but sites still exist) +info.au +conf.au +oz.au +// CGDNs - http://www.cgdn.org.au/ +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +// 3LDs +act.edu.au +catholic.edu.au +eq.edu.au +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +// act.gov.au Bug 984824 - Removed at request of Greg Tankard +// nsw.gov.au Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au> +// nt.gov.au Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au> +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au +// 4LDs +education.tas.edu.au +schools.nsw.edu.au + +// aw : https://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : https://en.wikipedia.org/wiki/.ax +ax + +// az : https://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf +ba +com.ba +edu.ba +gov.ba +mil.ba +net.ba +org.ba + +// bb : https://en.wikipedia.org/wiki/.bb +bb +biz.bb +co.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb +tv.bb + +// bd : https://en.wikipedia.org/wiki/.bd +*.bd + +// be : https://en.wikipedia.org/wiki/.be +// Confirmed by registry <tech@dns.be> 2008-06-08 +be +ac.be + +// bf : https://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : https://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : https://en.wikipedia.org/wiki/.bh +bh +com.bh +edu.bh +net.bh +org.bh +gov.bh + +// bi : https://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : https://en.wikipedia.org/wiki/.biz +biz + +// bj : https://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : http://www.bnnic.bn/faqs +bn +com.bn +edu.bn +gov.bn +net.bn +org.bn + +// bo : https://nic.bo/delegacion2015.php#h-1.10 +bo +com.bo +edu.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo +web.bo +// Social Domains +academia.bo +agro.bo +arte.bo +blog.bo +bolivia.bo +ciencia.bo +cooperativa.bo +democracia.bo +deporte.bo +ecologia.bo +economia.bo +empresa.bo +indigena.bo +industria.bo +info.bo +medicina.bo +movimiento.bo +musica.bo +natural.bo +nombre.bo +noticias.bo +patria.bo +politica.bo +profesional.bo +plurinacional.bo +pueblo.bo +revista.bo +salud.bo +tecnologia.bo +tksat.bo +transporte.bo +wiki.bo + +// br : http://registro.br/dominio/categoria.html +// Submitted by registry <fneves@registro.br> +br +9guacu.br +abc.br +adm.br +adv.br +agr.br +aju.br +am.br +anani.br +aparecida.br +arq.br +art.br +ato.br +b.br +barueri.br +belem.br +bhz.br +bio.br +blog.br +bmd.br +boavista.br +bsb.br +campinagrande.br +campinas.br +caxias.br +cim.br +cng.br +cnt.br +com.br +contagem.br +coop.br +cri.br +cuiaba.br +curitiba.br +def.br +ecn.br +eco.br +edu.br +emp.br +eng.br +esp.br +etc.br +eti.br +far.br +feira.br +flog.br +floripa.br +fm.br +fnd.br +fortal.br +fot.br +foz.br +fst.br +g12.br +ggf.br +goiania.br +gov.br +// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil +ac.gov.br +al.gov.br +am.gov.br +ap.gov.br +ba.gov.br +ce.gov.br +df.gov.br +es.gov.br +go.gov.br +ma.gov.br +mg.gov.br +ms.gov.br +mt.gov.br +pa.gov.br +pb.gov.br +pe.gov.br +pi.gov.br +pr.gov.br +rj.gov.br +rn.gov.br +ro.gov.br +rr.gov.br +rs.gov.br +sc.gov.br +se.gov.br +sp.gov.br +to.gov.br +gru.br +imb.br +ind.br +inf.br +jab.br +jampa.br +jdf.br +joinville.br +jor.br +jus.br +leg.br +lel.br +londrina.br +macapa.br +maceio.br +manaus.br +maringa.br +mat.br +med.br +mil.br +morena.br +mp.br +mus.br +natal.br +net.br +niteroi.br +*.nom.br +not.br +ntr.br +odo.br +ong.br +org.br +osasco.br +palmas.br +poa.br +ppg.br +pro.br +psc.br +psi.br +pvh.br +qsl.br +radio.br +rec.br +recife.br +ribeirao.br +rio.br +riobranco.br +riopreto.br +salvador.br +sampa.br +santamaria.br +santoandre.br +saobernardo.br +saogonca.br +sjc.br +slg.br +slz.br +sorocaba.br +srv.br +taxi.br +tc.br +teo.br +the.br +tmp.br +trd.br +tur.br +tv.br +udi.br +vet.br +vix.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : https://en.wikipedia.org/wiki/.bt +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt + +// bv : No registrations at this time. +// Submitted by registry <jarle@uninett.no> +bv + +// bw : https://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : https://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : https://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : https://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: https://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : https://en.wikipedia.org/wiki/.cat +cat + +// cc : https://en.wikipedia.org/wiki/.cc +cc + +// cd : https://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : https://en.wikipedia.org/wiki/.cf +cf + +// cg : https://en.wikipedia.org/wiki/.cg +cg + +// ch : https://en.wikipedia.org/wiki/.ch +ch + +// ci : https://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : https://en.wikipedia.org/wiki/.ck +*.ck +!www.ck + +// cl : https://en.wikipedia.org/wiki/.cl +cl +gov.cl +gob.cl +co.cl +mil.cl + +// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 +cm +co.cm +com.cm +gov.cm +net.cm + +// cn : https://en.wikipedia.org/wiki/.cn +// Submitted by registry <tanyaling@cnnic.cn> +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +公司.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : https://en.wikipedia.org/wiki/.co +// Submitted by registry <tecnico@uniandes.edu.co> +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : https://en.wikipedia.org/wiki/.com +com + +// coop : https://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : https://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : https://en.wikipedia.org/wiki/.cv +cv + +// cw : http://www.una.cw/cw_registry/ +// Confirmed by registry <registry@una.net> 2013-03-26 +cw +com.cw +edu.cw +net.cw +org.cw + +// cx : https://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://www.nic.cy/ +// Submitted by registry Panayiotou Fotia <cydns@ucy.ac.cy> +cy +ac.cy +biz.cy +com.cy +ekloges.cy +gov.cy +ltd.cy +name.cy +net.cy +org.cy +parliament.cy +press.cy +pro.cy +tm.cy + +// cz : https://en.wikipedia.org/wiki/.cz +cz + +// de : https://en.wikipedia.org/wiki/.de +// Confirmed by registry <ops@denic.de> (with technical +// reservations) 2008-07-01 +de + +// dj : https://en.wikipedia.org/wiki/.dj +dj + +// dk : https://en.wikipedia.org/wiki/.dk +// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17 +dk + +// dm : https://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : https://en.wikipedia.org/wiki/.do +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do + +// dz : https://en.wikipedia.org/wiki/.dz +dz +com.dz +org.dz +net.dz +gov.dz +edu.dz +asso.dz +pol.dz +art.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry <vabboud@nic.ec> +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +gob.ec +mil.ec + +// edu : https://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : https://en.wikipedia.org/wiki/.eg +eg +com.eg +edu.eg +eun.eg +gov.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg + +// er : https://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : https://en.wikipedia.org/wiki/.et +et +com.et +gov.et +org.et +edu.et +biz.et +name.et +info.et +net.et + +// eu : https://en.wikipedia.org/wiki/.eu +eu + +// fi : https://en.wikipedia.org/wiki/.fi +fi +// aland.fi : https://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi + +// fj : https://en.wikipedia.org/wiki/.fj +*.fj + +// fk : https://en.wikipedia.org/wiki/.fk +*.fk + +// fm : https://en.wikipedia.org/wiki/.fm +fm + +// fo : https://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : https://www.afnic.fr/medias/documents/Cadre_legal/Afnic_Naming_Policy_12122016_VEN.pdf +fr +asso.fr +com.fr +gouv.fr +nom.fr +prd.fr +tm.fr +// domaines sectoriels : https://www.afnic.fr/en/products-and-services/the-fr-tld/sector-based-fr-domains-4.html +aeroport.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : https://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry <Damien.Shaw@ja.net> +gb + +// gd : https://en.wikipedia.org/wiki/.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : https://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +gg +co.gg +net.gg +org.gg + +// gh : https://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : https://en.wikipedia.org/wiki/.gl +// http://nic.gl +gl +co.gl +com.gl +edu.gl +net.gl +org.gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry <randy@psg.com> +gn +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : https://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : https://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry <segred@ics.forth.gr> +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : https://en.wikipedia.org/wiki/.gs +gs + +// gt : http://www.gt/politicas_de_registro.html +gt +com.gt +edu.gt +gob.gt +ind.gt +mil.gt +net.gt +org.gt + +// gu : http://gadao.gov.gu/register.html +// University of Guam : https://www.uog.edu +// Submitted by uognoc@triton.uog.edu +gu +com.gu +edu.gu +gov.gu +guam.gu +info.gu +net.gu +org.gu +web.gu + +// gw : https://en.wikipedia.org/wiki/.gw +gw + +// gy : https://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +edu.gy +gov.gy +net.gy +org.gy + +// hk : https://www.hkirc.hk +// Submitted by registry <hk.tech@hkirc.hk> +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +公司.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : https://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry <pasztor@iszt.hu> 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : https://pandi.id/en/domain/registration-requirements/ +id +ac.id +biz.id +co.id +desa.id +go.id +mil.id +my.id +net.id +or.id +ponpes.id +sch.id +web.id + +// ie : https://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://www.isoc.org.il/domains/ +il +ac.il +co.il +gov.il +idf.il +k12.il +muni.il +net.il +org.il + +// im : https://www.nic.im/ +// Submitted by registry <info@nic.im> +im +ac.im +co.im +com.im +ltd.co.im +net.im +org.im +plc.co.im +tt.im +tv.im + +// in : https://en.wikipedia.org/wiki/.in +// see also: https://registry.in/Policies +// Please note, that nic.in is not an official eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : https://en.wikipedia.org/wiki/.info +info + +// int : https://en.wikipedia.org/wiki/.int +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.html +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules +// Also see http://www.nic.ir/Internationalized_Domain_Names +// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16 +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH) +ایران.ir +// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH) +ايران.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry <marius@isgate.is> 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : https://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// Reserved geo-names (regions and provinces): +// https://www.nic.it/sites/default/files/archivio/docs/Regulation_assignation_v7.1.pdf +// Regions +abr.it +abruzzo.it +aosta-valley.it +aostavalley.it +bas.it +basilicata.it +cal.it +calabria.it +cam.it +campania.it +emilia-romagna.it +emiliaromagna.it +emr.it +friuli-v-giulia.it +friuli-ve-giulia.it +friuli-vegiulia.it +friuli-venezia-giulia.it +friuli-veneziagiulia.it +friuli-vgiulia.it +friuliv-giulia.it +friulive-giulia.it +friulivegiulia.it +friulivenezia-giulia.it +friuliveneziagiulia.it +friulivgiulia.it +fvg.it +laz.it +lazio.it +lig.it +liguria.it +lom.it +lombardia.it +lombardy.it +lucania.it +mar.it +marche.it +mol.it +molise.it +piedmont.it +piemonte.it +pmn.it +pug.it +puglia.it +sar.it +sardegna.it +sardinia.it +sic.it +sicilia.it +sicily.it +taa.it +tos.it +toscana.it +trentin-sud-tirol.it +trentin-süd-tirol.it +trentin-sudtirol.it +trentin-südtirol.it +trentin-sued-tirol.it +trentin-suedtirol.it +trentino-a-adige.it +trentino-aadige.it +trentino-alto-adige.it +trentino-altoadige.it +trentino-s-tirol.it +trentino-stirol.it +trentino-sud-tirol.it +trentino-süd-tirol.it +trentino-sudtirol.it +trentino-südtirol.it +trentino-sued-tirol.it +trentino-suedtirol.it +trentino.it +trentinoa-adige.it +trentinoaadige.it +trentinoalto-adige.it +trentinoaltoadige.it +trentinos-tirol.it +trentinostirol.it +trentinosud-tirol.it +trentinosüd-tirol.it +trentinosudtirol.it +trentinosüdtirol.it +trentinosued-tirol.it +trentinosuedtirol.it +trentinsud-tirol.it +trentinsüd-tirol.it +trentinsudtirol.it +trentinsüdtirol.it +trentinsued-tirol.it +trentinsuedtirol.it +tuscany.it +umb.it +umbria.it +val-d-aosta.it +val-daosta.it +vald-aosta.it +valdaosta.it +valle-aosta.it +valle-d-aosta.it +valle-daosta.it +valleaosta.it +valled-aosta.it +valledaosta.it +vallee-aoste.it +vallée-aoste.it +vallee-d-aoste.it +vallée-d-aoste.it +valleeaoste.it +valléeaoste.it +valleedaoste.it +valléedaoste.it +vao.it +vda.it +ven.it +veneto.it +// Provinces +ag.it +agrigento.it +al.it +alessandria.it +alto-adige.it +altoadige.it +an.it +ancona.it +andria-barletta-trani.it +andria-trani-barletta.it +andriabarlettatrani.it +andriatranibarletta.it +ao.it +aosta.it +aoste.it +ap.it +aq.it +aquila.it +ar.it +arezzo.it +ascoli-piceno.it +ascolipiceno.it +asti.it +at.it +av.it +avellino.it +ba.it +balsan-sudtirol.it +balsan-südtirol.it +balsan-suedtirol.it +balsan.it +bari.it +barletta-trani-andria.it +barlettatraniandria.it +belluno.it +benevento.it +bergamo.it +bg.it +bi.it +biella.it +bl.it +bn.it +bo.it +bologna.it +bolzano-altoadige.it +bolzano.it +bozen-sudtirol.it +bozen-südtirol.it +bozen-suedtirol.it +bozen.it +br.it +brescia.it +brindisi.it +bs.it +bt.it +bulsan-sudtirol.it +bulsan-südtirol.it +bulsan-suedtirol.it +bulsan.it +bz.it +ca.it +cagliari.it +caltanissetta.it +campidano-medio.it +campidanomedio.it +campobasso.it +carbonia-iglesias.it +carboniaiglesias.it +carrara-massa.it +carraramassa.it +caserta.it +catania.it +catanzaro.it +cb.it +ce.it +cesena-forli.it +cesena-forlì.it +cesenaforli.it +cesenaforlì.it +ch.it +chieti.it +ci.it +cl.it +cn.it +co.it +como.it +cosenza.it +cr.it +cremona.it +crotone.it +cs.it +ct.it +cuneo.it +cz.it +dell-ogliastra.it +dellogliastra.it +en.it +enna.it +fc.it +fe.it +fermo.it +ferrara.it +fg.it +fi.it +firenze.it +florence.it +fm.it +foggia.it +forli-cesena.it +forlì-cesena.it +forlicesena.it +forlìcesena.it +fr.it +frosinone.it +ge.it +genoa.it +genova.it +go.it +gorizia.it +gr.it +grosseto.it +iglesias-carbonia.it +iglesiascarbonia.it +im.it +imperia.it +is.it +isernia.it +kr.it +la-spezia.it +laquila.it +laspezia.it +latina.it +lc.it +le.it +lecce.it +lecco.it +li.it +livorno.it +lo.it +lodi.it +lt.it +lu.it +lucca.it +macerata.it +mantova.it +massa-carrara.it +massacarrara.it +matera.it +mb.it +mc.it +me.it +medio-campidano.it +mediocampidano.it +messina.it +mi.it +milan.it +milano.it +mn.it +mo.it +modena.it +monza-brianza.it +monza-e-della-brianza.it +monza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +ms.it +mt.it +na.it +naples.it +napoli.it +no.it +novara.it +nu.it +nuoro.it +og.it +ogliastra.it +olbia-tempio.it +olbiatempio.it +or.it +oristano.it +ot.it +pa.it +padova.it +padua.it +palermo.it +parma.it +pavia.it +pc.it +pd.it +pe.it +perugia.it +pesaro-urbino.it +pesarourbino.it +pescara.it +pg.it +pi.it +piacenza.it +pisa.it +pistoia.it +pn.it +po.it +pordenone.it +potenza.it +pr.it +prato.it +pt.it +pu.it +pv.it +pz.it +ra.it +ragusa.it +ravenna.it +rc.it +re.it +reggio-calabria.it +reggio-emilia.it +reggiocalabria.it +reggioemilia.it +rg.it +ri.it +rieti.it +rimini.it +rm.it +rn.it +ro.it +roma.it +rome.it +rovigo.it +sa.it +salerno.it +sassari.it +savona.it +si.it +siena.it +siracusa.it +so.it +sondrio.it +sp.it +sr.it +ss.it +suedtirol.it +südtirol.it +sv.it +ta.it +taranto.it +te.it +tempio-olbia.it +tempioolbia.it +teramo.it +terni.it +tn.it +to.it +torino.it +tp.it +tr.it +trani-andria-barletta.it +trani-barletta-andria.it +traniandriabarletta.it +tranibarlettaandria.it +trapani.it +trento.it +treviso.it +trieste.it +ts.it +turin.it +tv.it +ud.it +udine.it +urbino-pesaro.it +urbinopesaro.it +va.it +varese.it +vb.it +vc.it +ve.it +venezia.it +venice.it +verbania.it +vercelli.it +verona.it +vi.it +vibo-valentia.it +vibovalentia.it +vicenza.it +viterbo.it +vr.it +vs.it +vt.it +vv.it + +// je : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +je +co.je +net.je +org.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : https://en.wikipedia.org/wiki/.jobs +jobs + +// jp : https://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry <info@jprs.jp> +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp prefecture type names +aichi.jp +akita.jp +aomori.jp +chiba.jp +ehime.jp +fukui.jp +fukuoka.jp +fukushima.jp +gifu.jp +gunma.jp +hiroshima.jp +hokkaido.jp +hyogo.jp +ibaraki.jp +ishikawa.jp +iwate.jp +kagawa.jp +kagoshima.jp +kanagawa.jp +kochi.jp +kumamoto.jp +kyoto.jp +mie.jp +miyagi.jp +miyazaki.jp +nagano.jp +nagasaki.jp +nara.jp +niigata.jp +oita.jp +okayama.jp +okinawa.jp +osaka.jp +saga.jp +saitama.jp +shiga.jp +shimane.jp +shizuoka.jp +tochigi.jp +tokushima.jp +tokyo.jp +tottori.jp +toyama.jp +wakayama.jp +yamagata.jp +yamaguchi.jp +yamanashi.jp +栃木.jp +愛知.jp +愛媛.jp +兵庫.jp +熊本.jp +茨城.jp +北海道.jp +千葉.jp +和歌山.jp +長崎.jp +長野.jp +新潟.jp +青森.jp +静岡.jp +東京.jp +石川.jp +埼玉.jp +三重.jp +京都.jp +佐賀.jp +大分.jp +大阪.jp +奈良.jp +宮城.jp +宮崎.jp +富山.jp +山口.jp +山形.jp +山梨.jp +岩手.jp +岐阜.jp +岡山.jp +島根.jp +広島.jp +徳島.jp +沖縄.jp +滋賀.jp +神奈川.jp +福井.jp +福岡.jp +福島.jp +秋田.jp +群馬.jp +香川.jp +高知.jp +鳥取.jp +鹿児島.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.nagoya.jp +*.sapporo.jp +*.sendai.jp +*.yokohama.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.nagoya.jp +!city.sapporo.jp +!city.sendai.jp +!city.yokohama.jp +// 4th level registration +aisai.aichi.jp +ama.aichi.jp +anjo.aichi.jp +asuke.aichi.jp +chiryu.aichi.jp +chita.aichi.jp +fuso.aichi.jp +gamagori.aichi.jp +handa.aichi.jp +hazu.aichi.jp +hekinan.aichi.jp +higashiura.aichi.jp +ichinomiya.aichi.jp +inazawa.aichi.jp +inuyama.aichi.jp +isshiki.aichi.jp +iwakura.aichi.jp +kanie.aichi.jp +kariya.aichi.jp +kasugai.aichi.jp +kira.aichi.jp +kiyosu.aichi.jp +komaki.aichi.jp +konan.aichi.jp +kota.aichi.jp +mihama.aichi.jp +miyoshi.aichi.jp +nishio.aichi.jp +nisshin.aichi.jp +obu.aichi.jp +oguchi.aichi.jp +oharu.aichi.jp +okazaki.aichi.jp +owariasahi.aichi.jp +seto.aichi.jp +shikatsu.aichi.jp +shinshiro.aichi.jp +shitara.aichi.jp +tahara.aichi.jp +takahama.aichi.jp +tobishima.aichi.jp +toei.aichi.jp +togo.aichi.jp +tokai.aichi.jp +tokoname.aichi.jp +toyoake.aichi.jp +toyohashi.aichi.jp +toyokawa.aichi.jp +toyone.aichi.jp +toyota.aichi.jp +tsushima.aichi.jp +yatomi.aichi.jp +akita.akita.jp +daisen.akita.jp +fujisato.akita.jp +gojome.akita.jp +hachirogata.akita.jp +happou.akita.jp +higashinaruse.akita.jp +honjo.akita.jp +honjyo.akita.jp +ikawa.akita.jp +kamikoani.akita.jp +kamioka.akita.jp +katagami.akita.jp +kazuno.akita.jp +kitaakita.akita.jp +kosaka.akita.jp +kyowa.akita.jp +misato.akita.jp +mitane.akita.jp +moriyoshi.akita.jp +nikaho.akita.jp +noshiro.akita.jp +odate.akita.jp +oga.akita.jp +ogata.akita.jp +semboku.akita.jp +yokote.akita.jp +yurihonjo.akita.jp +aomori.aomori.jp +gonohe.aomori.jp +hachinohe.aomori.jp +hashikami.aomori.jp +hiranai.aomori.jp +hirosaki.aomori.jp +itayanagi.aomori.jp +kuroishi.aomori.jp +misawa.aomori.jp +mutsu.aomori.jp +nakadomari.aomori.jp +noheji.aomori.jp +oirase.aomori.jp +owani.aomori.jp +rokunohe.aomori.jp +sannohe.aomori.jp +shichinohe.aomori.jp +shingo.aomori.jp +takko.aomori.jp +towada.aomori.jp +tsugaru.aomori.jp +tsuruta.aomori.jp +abiko.chiba.jp +asahi.chiba.jp +chonan.chiba.jp +chosei.chiba.jp +choshi.chiba.jp +chuo.chiba.jp +funabashi.chiba.jp +futtsu.chiba.jp +hanamigawa.chiba.jp +ichihara.chiba.jp +ichikawa.chiba.jp +ichinomiya.chiba.jp +inzai.chiba.jp +isumi.chiba.jp +kamagaya.chiba.jp +kamogawa.chiba.jp +kashiwa.chiba.jp +katori.chiba.jp +katsuura.chiba.jp +kimitsu.chiba.jp +kisarazu.chiba.jp +kozaki.chiba.jp +kujukuri.chiba.jp +kyonan.chiba.jp +matsudo.chiba.jp +midori.chiba.jp +mihama.chiba.jp +minamiboso.chiba.jp +mobara.chiba.jp +mutsuzawa.chiba.jp +nagara.chiba.jp +nagareyama.chiba.jp +narashino.chiba.jp +narita.chiba.jp +noda.chiba.jp +oamishirasato.chiba.jp +omigawa.chiba.jp +onjuku.chiba.jp +otaki.chiba.jp +sakae.chiba.jp +sakura.chiba.jp +shimofusa.chiba.jp +shirako.chiba.jp +shiroi.chiba.jp +shisui.chiba.jp +sodegaura.chiba.jp +sosa.chiba.jp +tako.chiba.jp +tateyama.chiba.jp +togane.chiba.jp +tohnosho.chiba.jp +tomisato.chiba.jp +urayasu.chiba.jp +yachimata.chiba.jp +yachiyo.chiba.jp +yokaichiba.chiba.jp +yokoshibahikari.chiba.jp +yotsukaido.chiba.jp +ainan.ehime.jp +honai.ehime.jp +ikata.ehime.jp +imabari.ehime.jp +iyo.ehime.jp +kamijima.ehime.jp +kihoku.ehime.jp +kumakogen.ehime.jp +masaki.ehime.jp +matsuno.ehime.jp +matsuyama.ehime.jp +namikata.ehime.jp +niihama.ehime.jp +ozu.ehime.jp +saijo.ehime.jp +seiyo.ehime.jp +shikokuchuo.ehime.jp +tobe.ehime.jp +toon.ehime.jp +uchiko.ehime.jp +uwajima.ehime.jp +yawatahama.ehime.jp +echizen.fukui.jp +eiheiji.fukui.jp +fukui.fukui.jp +ikeda.fukui.jp +katsuyama.fukui.jp +mihama.fukui.jp +minamiechizen.fukui.jp +obama.fukui.jp +ohi.fukui.jp +ono.fukui.jp +sabae.fukui.jp +sakai.fukui.jp +takahama.fukui.jp +tsuruga.fukui.jp +wakasa.fukui.jp +ashiya.fukuoka.jp +buzen.fukuoka.jp +chikugo.fukuoka.jp +chikuho.fukuoka.jp +chikujo.fukuoka.jp +chikushino.fukuoka.jp +chikuzen.fukuoka.jp +chuo.fukuoka.jp +dazaifu.fukuoka.jp +fukuchi.fukuoka.jp +hakata.fukuoka.jp +higashi.fukuoka.jp +hirokawa.fukuoka.jp +hisayama.fukuoka.jp +iizuka.fukuoka.jp +inatsuki.fukuoka.jp +kaho.fukuoka.jp +kasuga.fukuoka.jp +kasuya.fukuoka.jp +kawara.fukuoka.jp +keisen.fukuoka.jp +koga.fukuoka.jp +kurate.fukuoka.jp +kurogi.fukuoka.jp +kurume.fukuoka.jp +minami.fukuoka.jp +miyako.fukuoka.jp +miyama.fukuoka.jp +miyawaka.fukuoka.jp +mizumaki.fukuoka.jp +munakata.fukuoka.jp +nakagawa.fukuoka.jp +nakama.fukuoka.jp +nishi.fukuoka.jp +nogata.fukuoka.jp +ogori.fukuoka.jp +okagaki.fukuoka.jp +okawa.fukuoka.jp +oki.fukuoka.jp +omuta.fukuoka.jp +onga.fukuoka.jp +onojo.fukuoka.jp +oto.fukuoka.jp +saigawa.fukuoka.jp +sasaguri.fukuoka.jp +shingu.fukuoka.jp +shinyoshitomi.fukuoka.jp +shonai.fukuoka.jp +soeda.fukuoka.jp +sue.fukuoka.jp +tachiarai.fukuoka.jp +tagawa.fukuoka.jp +takata.fukuoka.jp +toho.fukuoka.jp +toyotsu.fukuoka.jp +tsuiki.fukuoka.jp +ukiha.fukuoka.jp +umi.fukuoka.jp +usui.fukuoka.jp +yamada.fukuoka.jp +yame.fukuoka.jp +yanagawa.fukuoka.jp +yukuhashi.fukuoka.jp +aizubange.fukushima.jp +aizumisato.fukushima.jp +aizuwakamatsu.fukushima.jp +asakawa.fukushima.jp +bandai.fukushima.jp +date.fukushima.jp +fukushima.fukushima.jp +furudono.fukushima.jp +futaba.fukushima.jp +hanawa.fukushima.jp +higashi.fukushima.jp +hirata.fukushima.jp +hirono.fukushima.jp +iitate.fukushima.jp +inawashiro.fukushima.jp +ishikawa.fukushima.jp +iwaki.fukushima.jp +izumizaki.fukushima.jp +kagamiishi.fukushima.jp +kaneyama.fukushima.jp +kawamata.fukushima.jp +kitakata.fukushima.jp +kitashiobara.fukushima.jp +koori.fukushima.jp +koriyama.fukushima.jp +kunimi.fukushima.jp +miharu.fukushima.jp +mishima.fukushima.jp +namie.fukushima.jp +nango.fukushima.jp +nishiaizu.fukushima.jp +nishigo.fukushima.jp +okuma.fukushima.jp +omotego.fukushima.jp +ono.fukushima.jp +otama.fukushima.jp +samegawa.fukushima.jp +shimogo.fukushima.jp +shirakawa.fukushima.jp +showa.fukushima.jp +soma.fukushima.jp +sukagawa.fukushima.jp +taishin.fukushima.jp +tamakawa.fukushima.jp +tanagura.fukushima.jp +tenei.fukushima.jp +yabuki.fukushima.jp +yamato.fukushima.jp +yamatsuri.fukushima.jp +yanaizu.fukushima.jp +yugawa.fukushima.jp +anpachi.gifu.jp +ena.gifu.jp +gifu.gifu.jp +ginan.gifu.jp +godo.gifu.jp +gujo.gifu.jp +hashima.gifu.jp +hichiso.gifu.jp +hida.gifu.jp +higashishirakawa.gifu.jp +ibigawa.gifu.jp +ikeda.gifu.jp +kakamigahara.gifu.jp +kani.gifu.jp +kasahara.gifu.jp +kasamatsu.gifu.jp +kawaue.gifu.jp +kitagata.gifu.jp +mino.gifu.jp +minokamo.gifu.jp +mitake.gifu.jp +mizunami.gifu.jp +motosu.gifu.jp +nakatsugawa.gifu.jp +ogaki.gifu.jp +sakahogi.gifu.jp +seki.gifu.jp +sekigahara.gifu.jp +shirakawa.gifu.jp +tajimi.gifu.jp +takayama.gifu.jp +tarui.gifu.jp +toki.gifu.jp +tomika.gifu.jp +wanouchi.gifu.jp +yamagata.gifu.jp +yaotsu.gifu.jp +yoro.gifu.jp +annaka.gunma.jp +chiyoda.gunma.jp +fujioka.gunma.jp +higashiagatsuma.gunma.jp +isesaki.gunma.jp +itakura.gunma.jp +kanna.gunma.jp +kanra.gunma.jp +katashina.gunma.jp +kawaba.gunma.jp +kiryu.gunma.jp +kusatsu.gunma.jp +maebashi.gunma.jp +meiwa.gunma.jp +midori.gunma.jp +minakami.gunma.jp +naganohara.gunma.jp +nakanojo.gunma.jp +nanmoku.gunma.jp +numata.gunma.jp +oizumi.gunma.jp +ora.gunma.jp +ota.gunma.jp +shibukawa.gunma.jp +shimonita.gunma.jp +shinto.gunma.jp +showa.gunma.jp +takasaki.gunma.jp +takayama.gunma.jp +tamamura.gunma.jp +tatebayashi.gunma.jp +tomioka.gunma.jp +tsukiyono.gunma.jp +tsumagoi.gunma.jp +ueno.gunma.jp +yoshioka.gunma.jp +asaminami.hiroshima.jp +daiwa.hiroshima.jp +etajima.hiroshima.jp +fuchu.hiroshima.jp +fukuyama.hiroshima.jp +hatsukaichi.hiroshima.jp +higashihiroshima.hiroshima.jp +hongo.hiroshima.jp +jinsekikogen.hiroshima.jp +kaita.hiroshima.jp +kui.hiroshima.jp +kumano.hiroshima.jp +kure.hiroshima.jp +mihara.hiroshima.jp +miyoshi.hiroshima.jp +naka.hiroshima.jp +onomichi.hiroshima.jp +osakikamijima.hiroshima.jp +otake.hiroshima.jp +saka.hiroshima.jp +sera.hiroshima.jp +seranishi.hiroshima.jp +shinichi.hiroshima.jp +shobara.hiroshima.jp +takehara.hiroshima.jp +abashiri.hokkaido.jp +abira.hokkaido.jp +aibetsu.hokkaido.jp +akabira.hokkaido.jp +akkeshi.hokkaido.jp +asahikawa.hokkaido.jp +ashibetsu.hokkaido.jp +ashoro.hokkaido.jp +assabu.hokkaido.jp +atsuma.hokkaido.jp +bibai.hokkaido.jp +biei.hokkaido.jp +bifuka.hokkaido.jp +bihoro.hokkaido.jp +biratori.hokkaido.jp +chippubetsu.hokkaido.jp +chitose.hokkaido.jp +date.hokkaido.jp +ebetsu.hokkaido.jp +embetsu.hokkaido.jp +eniwa.hokkaido.jp +erimo.hokkaido.jp +esan.hokkaido.jp +esashi.hokkaido.jp +fukagawa.hokkaido.jp +fukushima.hokkaido.jp +furano.hokkaido.jp +furubira.hokkaido.jp +haboro.hokkaido.jp +hakodate.hokkaido.jp +hamatonbetsu.hokkaido.jp +hidaka.hokkaido.jp +higashikagura.hokkaido.jp +higashikawa.hokkaido.jp +hiroo.hokkaido.jp +hokuryu.hokkaido.jp +hokuto.hokkaido.jp +honbetsu.hokkaido.jp +horokanai.hokkaido.jp +horonobe.hokkaido.jp +ikeda.hokkaido.jp +imakane.hokkaido.jp +ishikari.hokkaido.jp +iwamizawa.hokkaido.jp +iwanai.hokkaido.jp +kamifurano.hokkaido.jp +kamikawa.hokkaido.jp +kamishihoro.hokkaido.jp +kamisunagawa.hokkaido.jp +kamoenai.hokkaido.jp +kayabe.hokkaido.jp +kembuchi.hokkaido.jp +kikonai.hokkaido.jp +kimobetsu.hokkaido.jp +kitahiroshima.hokkaido.jp +kitami.hokkaido.jp +kiyosato.hokkaido.jp +koshimizu.hokkaido.jp +kunneppu.hokkaido.jp +kuriyama.hokkaido.jp +kuromatsunai.hokkaido.jp +kushiro.hokkaido.jp +kutchan.hokkaido.jp +kyowa.hokkaido.jp +mashike.hokkaido.jp +matsumae.hokkaido.jp +mikasa.hokkaido.jp +minamifurano.hokkaido.jp +mombetsu.hokkaido.jp +moseushi.hokkaido.jp +mukawa.hokkaido.jp +muroran.hokkaido.jp +naie.hokkaido.jp +nakagawa.hokkaido.jp +nakasatsunai.hokkaido.jp +nakatombetsu.hokkaido.jp +nanae.hokkaido.jp +nanporo.hokkaido.jp +nayoro.hokkaido.jp +nemuro.hokkaido.jp +niikappu.hokkaido.jp +niki.hokkaido.jp +nishiokoppe.hokkaido.jp +noboribetsu.hokkaido.jp +numata.hokkaido.jp +obihiro.hokkaido.jp +obira.hokkaido.jp +oketo.hokkaido.jp +okoppe.hokkaido.jp +otaru.hokkaido.jp +otobe.hokkaido.jp +otofuke.hokkaido.jp +otoineppu.hokkaido.jp +oumu.hokkaido.jp +ozora.hokkaido.jp +pippu.hokkaido.jp +rankoshi.hokkaido.jp +rebun.hokkaido.jp +rikubetsu.hokkaido.jp +rishiri.hokkaido.jp +rishirifuji.hokkaido.jp +saroma.hokkaido.jp +sarufutsu.hokkaido.jp +shakotan.hokkaido.jp +shari.hokkaido.jp +shibecha.hokkaido.jp +shibetsu.hokkaido.jp +shikabe.hokkaido.jp +shikaoi.hokkaido.jp +shimamaki.hokkaido.jp +shimizu.hokkaido.jp +shimokawa.hokkaido.jp +shinshinotsu.hokkaido.jp +shintoku.hokkaido.jp +shiranuka.hokkaido.jp +shiraoi.hokkaido.jp +shiriuchi.hokkaido.jp +sobetsu.hokkaido.jp +sunagawa.hokkaido.jp +taiki.hokkaido.jp +takasu.hokkaido.jp +takikawa.hokkaido.jp +takinoue.hokkaido.jp +teshikaga.hokkaido.jp +tobetsu.hokkaido.jp +tohma.hokkaido.jp +tomakomai.hokkaido.jp +tomari.hokkaido.jp +toya.hokkaido.jp +toyako.hokkaido.jp +toyotomi.hokkaido.jp +toyoura.hokkaido.jp +tsubetsu.hokkaido.jp +tsukigata.hokkaido.jp +urakawa.hokkaido.jp +urausu.hokkaido.jp +uryu.hokkaido.jp +utashinai.hokkaido.jp +wakkanai.hokkaido.jp +wassamu.hokkaido.jp +yakumo.hokkaido.jp +yoichi.hokkaido.jp +aioi.hyogo.jp +akashi.hyogo.jp +ako.hyogo.jp +amagasaki.hyogo.jp +aogaki.hyogo.jp +asago.hyogo.jp +ashiya.hyogo.jp +awaji.hyogo.jp +fukusaki.hyogo.jp +goshiki.hyogo.jp +harima.hyogo.jp +himeji.hyogo.jp +ichikawa.hyogo.jp +inagawa.hyogo.jp +itami.hyogo.jp +kakogawa.hyogo.jp +kamigori.hyogo.jp +kamikawa.hyogo.jp +kasai.hyogo.jp +kasuga.hyogo.jp +kawanishi.hyogo.jp +miki.hyogo.jp +minamiawaji.hyogo.jp +nishinomiya.hyogo.jp +nishiwaki.hyogo.jp +ono.hyogo.jp +sanda.hyogo.jp +sannan.hyogo.jp +sasayama.hyogo.jp +sayo.hyogo.jp +shingu.hyogo.jp +shinonsen.hyogo.jp +shiso.hyogo.jp +sumoto.hyogo.jp +taishi.hyogo.jp +taka.hyogo.jp +takarazuka.hyogo.jp +takasago.hyogo.jp +takino.hyogo.jp +tamba.hyogo.jp +tatsuno.hyogo.jp +toyooka.hyogo.jp +yabu.hyogo.jp +yashiro.hyogo.jp +yoka.hyogo.jp +yokawa.hyogo.jp +ami.ibaraki.jp +asahi.ibaraki.jp +bando.ibaraki.jp +chikusei.ibaraki.jp +daigo.ibaraki.jp +fujishiro.ibaraki.jp +hitachi.ibaraki.jp +hitachinaka.ibaraki.jp +hitachiomiya.ibaraki.jp +hitachiota.ibaraki.jp +ibaraki.ibaraki.jp +ina.ibaraki.jp +inashiki.ibaraki.jp +itako.ibaraki.jp +iwama.ibaraki.jp +joso.ibaraki.jp +kamisu.ibaraki.jp +kasama.ibaraki.jp +kashima.ibaraki.jp +kasumigaura.ibaraki.jp +koga.ibaraki.jp +miho.ibaraki.jp +mito.ibaraki.jp +moriya.ibaraki.jp +naka.ibaraki.jp +namegata.ibaraki.jp +oarai.ibaraki.jp +ogawa.ibaraki.jp +omitama.ibaraki.jp +ryugasaki.ibaraki.jp +sakai.ibaraki.jp +sakuragawa.ibaraki.jp +shimodate.ibaraki.jp +shimotsuma.ibaraki.jp +shirosato.ibaraki.jp +sowa.ibaraki.jp +suifu.ibaraki.jp +takahagi.ibaraki.jp +tamatsukuri.ibaraki.jp +tokai.ibaraki.jp +tomobe.ibaraki.jp +tone.ibaraki.jp +toride.ibaraki.jp +tsuchiura.ibaraki.jp +tsukuba.ibaraki.jp +uchihara.ibaraki.jp +ushiku.ibaraki.jp +yachiyo.ibaraki.jp +yamagata.ibaraki.jp +yawara.ibaraki.jp +yuki.ibaraki.jp +anamizu.ishikawa.jp +hakui.ishikawa.jp +hakusan.ishikawa.jp +kaga.ishikawa.jp +kahoku.ishikawa.jp +kanazawa.ishikawa.jp +kawakita.ishikawa.jp +komatsu.ishikawa.jp +nakanoto.ishikawa.jp +nanao.ishikawa.jp +nomi.ishikawa.jp +nonoichi.ishikawa.jp +noto.ishikawa.jp +shika.ishikawa.jp +suzu.ishikawa.jp +tsubata.ishikawa.jp +tsurugi.ishikawa.jp +uchinada.ishikawa.jp +wajima.ishikawa.jp +fudai.iwate.jp +fujisawa.iwate.jp +hanamaki.iwate.jp +hiraizumi.iwate.jp +hirono.iwate.jp +ichinohe.iwate.jp +ichinoseki.iwate.jp +iwaizumi.iwate.jp +iwate.iwate.jp +joboji.iwate.jp +kamaishi.iwate.jp +kanegasaki.iwate.jp +karumai.iwate.jp +kawai.iwate.jp +kitakami.iwate.jp +kuji.iwate.jp +kunohe.iwate.jp +kuzumaki.iwate.jp +miyako.iwate.jp +mizusawa.iwate.jp +morioka.iwate.jp +ninohe.iwate.jp +noda.iwate.jp +ofunato.iwate.jp +oshu.iwate.jp +otsuchi.iwate.jp +rikuzentakata.iwate.jp +shiwa.iwate.jp +shizukuishi.iwate.jp +sumita.iwate.jp +tanohata.iwate.jp +tono.iwate.jp +yahaba.iwate.jp +yamada.iwate.jp +ayagawa.kagawa.jp +higashikagawa.kagawa.jp +kanonji.kagawa.jp +kotohira.kagawa.jp +manno.kagawa.jp +marugame.kagawa.jp +mitoyo.kagawa.jp +naoshima.kagawa.jp +sanuki.kagawa.jp +tadotsu.kagawa.jp +takamatsu.kagawa.jp +tonosho.kagawa.jp +uchinomi.kagawa.jp +utazu.kagawa.jp +zentsuji.kagawa.jp +akune.kagoshima.jp +amami.kagoshima.jp +hioki.kagoshima.jp +isa.kagoshima.jp +isen.kagoshima.jp +izumi.kagoshima.jp +kagoshima.kagoshima.jp +kanoya.kagoshima.jp +kawanabe.kagoshima.jp +kinko.kagoshima.jp +kouyama.kagoshima.jp +makurazaki.kagoshima.jp +matsumoto.kagoshima.jp +minamitane.kagoshima.jp +nakatane.kagoshima.jp +nishinoomote.kagoshima.jp +satsumasendai.kagoshima.jp +soo.kagoshima.jp +tarumizu.kagoshima.jp +yusui.kagoshima.jp +aikawa.kanagawa.jp +atsugi.kanagawa.jp +ayase.kanagawa.jp +chigasaki.kanagawa.jp +ebina.kanagawa.jp +fujisawa.kanagawa.jp +hadano.kanagawa.jp +hakone.kanagawa.jp +hiratsuka.kanagawa.jp +isehara.kanagawa.jp +kaisei.kanagawa.jp +kamakura.kanagawa.jp +kiyokawa.kanagawa.jp +matsuda.kanagawa.jp +minamiashigara.kanagawa.jp +miura.kanagawa.jp +nakai.kanagawa.jp +ninomiya.kanagawa.jp +odawara.kanagawa.jp +oi.kanagawa.jp +oiso.kanagawa.jp +sagamihara.kanagawa.jp +samukawa.kanagawa.jp +tsukui.kanagawa.jp +yamakita.kanagawa.jp +yamato.kanagawa.jp +yokosuka.kanagawa.jp +yugawara.kanagawa.jp +zama.kanagawa.jp +zushi.kanagawa.jp +aki.kochi.jp +geisei.kochi.jp +hidaka.kochi.jp +higashitsuno.kochi.jp +ino.kochi.jp +kagami.kochi.jp +kami.kochi.jp +kitagawa.kochi.jp +kochi.kochi.jp +mihara.kochi.jp +motoyama.kochi.jp +muroto.kochi.jp +nahari.kochi.jp +nakamura.kochi.jp +nankoku.kochi.jp +nishitosa.kochi.jp +niyodogawa.kochi.jp +ochi.kochi.jp +okawa.kochi.jp +otoyo.kochi.jp +otsuki.kochi.jp +sakawa.kochi.jp +sukumo.kochi.jp +susaki.kochi.jp +tosa.kochi.jp +tosashimizu.kochi.jp +toyo.kochi.jp +tsuno.kochi.jp +umaji.kochi.jp +yasuda.kochi.jp +yusuhara.kochi.jp +amakusa.kumamoto.jp +arao.kumamoto.jp +aso.kumamoto.jp +choyo.kumamoto.jp +gyokuto.kumamoto.jp +kamiamakusa.kumamoto.jp +kikuchi.kumamoto.jp +kumamoto.kumamoto.jp +mashiki.kumamoto.jp +mifune.kumamoto.jp +minamata.kumamoto.jp +minamioguni.kumamoto.jp +nagasu.kumamoto.jp +nishihara.kumamoto.jp +oguni.kumamoto.jp +ozu.kumamoto.jp +sumoto.kumamoto.jp +takamori.kumamoto.jp +uki.kumamoto.jp +uto.kumamoto.jp +yamaga.kumamoto.jp +yamato.kumamoto.jp +yatsushiro.kumamoto.jp +ayabe.kyoto.jp +fukuchiyama.kyoto.jp +higashiyama.kyoto.jp +ide.kyoto.jp +ine.kyoto.jp +joyo.kyoto.jp +kameoka.kyoto.jp +kamo.kyoto.jp +kita.kyoto.jp +kizu.kyoto.jp +kumiyama.kyoto.jp +kyotamba.kyoto.jp +kyotanabe.kyoto.jp +kyotango.kyoto.jp +maizuru.kyoto.jp +minami.kyoto.jp +minamiyamashiro.kyoto.jp +miyazu.kyoto.jp +muko.kyoto.jp +nagaokakyo.kyoto.jp +nakagyo.kyoto.jp +nantan.kyoto.jp +oyamazaki.kyoto.jp +sakyo.kyoto.jp +seika.kyoto.jp +tanabe.kyoto.jp +uji.kyoto.jp +ujitawara.kyoto.jp +wazuka.kyoto.jp +yamashina.kyoto.jp +yawata.kyoto.jp +asahi.mie.jp +inabe.mie.jp +ise.mie.jp +kameyama.mie.jp +kawagoe.mie.jp +kiho.mie.jp +kisosaki.mie.jp +kiwa.mie.jp +komono.mie.jp +kumano.mie.jp +kuwana.mie.jp +matsusaka.mie.jp +meiwa.mie.jp +mihama.mie.jp +minamiise.mie.jp +misugi.mie.jp +miyama.mie.jp +nabari.mie.jp +shima.mie.jp +suzuka.mie.jp +tado.mie.jp +taiki.mie.jp +taki.mie.jp +tamaki.mie.jp +toba.mie.jp +tsu.mie.jp +udono.mie.jp +ureshino.mie.jp +watarai.mie.jp +yokkaichi.mie.jp +furukawa.miyagi.jp +higashimatsushima.miyagi.jp +ishinomaki.miyagi.jp +iwanuma.miyagi.jp +kakuda.miyagi.jp +kami.miyagi.jp +kawasaki.miyagi.jp +marumori.miyagi.jp +matsushima.miyagi.jp +minamisanriku.miyagi.jp +misato.miyagi.jp +murata.miyagi.jp +natori.miyagi.jp +ogawara.miyagi.jp +ohira.miyagi.jp +onagawa.miyagi.jp +osaki.miyagi.jp +rifu.miyagi.jp +semine.miyagi.jp +shibata.miyagi.jp +shichikashuku.miyagi.jp +shikama.miyagi.jp +shiogama.miyagi.jp +shiroishi.miyagi.jp +tagajo.miyagi.jp +taiwa.miyagi.jp +tome.miyagi.jp +tomiya.miyagi.jp +wakuya.miyagi.jp +watari.miyagi.jp +yamamoto.miyagi.jp +zao.miyagi.jp +aya.miyazaki.jp +ebino.miyazaki.jp +gokase.miyazaki.jp +hyuga.miyazaki.jp +kadogawa.miyazaki.jp +kawaminami.miyazaki.jp +kijo.miyazaki.jp +kitagawa.miyazaki.jp +kitakata.miyazaki.jp +kitaura.miyazaki.jp +kobayashi.miyazaki.jp +kunitomi.miyazaki.jp +kushima.miyazaki.jp +mimata.miyazaki.jp +miyakonojo.miyazaki.jp +miyazaki.miyazaki.jp +morotsuka.miyazaki.jp +nichinan.miyazaki.jp +nishimera.miyazaki.jp +nobeoka.miyazaki.jp +saito.miyazaki.jp +shiiba.miyazaki.jp +shintomi.miyazaki.jp +takaharu.miyazaki.jp +takanabe.miyazaki.jp +takazaki.miyazaki.jp +tsuno.miyazaki.jp +achi.nagano.jp +agematsu.nagano.jp +anan.nagano.jp +aoki.nagano.jp +asahi.nagano.jp +azumino.nagano.jp +chikuhoku.nagano.jp +chikuma.nagano.jp +chino.nagano.jp +fujimi.nagano.jp +hakuba.nagano.jp +hara.nagano.jp +hiraya.nagano.jp +iida.nagano.jp +iijima.nagano.jp +iiyama.nagano.jp +iizuna.nagano.jp +ikeda.nagano.jp +ikusaka.nagano.jp +ina.nagano.jp +karuizawa.nagano.jp +kawakami.nagano.jp +kiso.nagano.jp +kisofukushima.nagano.jp +kitaaiki.nagano.jp +komagane.nagano.jp +komoro.nagano.jp +matsukawa.nagano.jp +matsumoto.nagano.jp +miasa.nagano.jp +minamiaiki.nagano.jp +minamimaki.nagano.jp +minamiminowa.nagano.jp +minowa.nagano.jp +miyada.nagano.jp +miyota.nagano.jp +mochizuki.nagano.jp +nagano.nagano.jp +nagawa.nagano.jp +nagiso.nagano.jp +nakagawa.nagano.jp +nakano.nagano.jp +nozawaonsen.nagano.jp +obuse.nagano.jp +ogawa.nagano.jp +okaya.nagano.jp +omachi.nagano.jp +omi.nagano.jp +ookuwa.nagano.jp +ooshika.nagano.jp +otaki.nagano.jp +otari.nagano.jp +sakae.nagano.jp +sakaki.nagano.jp +saku.nagano.jp +sakuho.nagano.jp +shimosuwa.nagano.jp +shinanomachi.nagano.jp +shiojiri.nagano.jp +suwa.nagano.jp +suzaka.nagano.jp +takagi.nagano.jp +takamori.nagano.jp +takayama.nagano.jp +tateshina.nagano.jp +tatsuno.nagano.jp +togakushi.nagano.jp +togura.nagano.jp +tomi.nagano.jp +ueda.nagano.jp +wada.nagano.jp +yamagata.nagano.jp +yamanouchi.nagano.jp +yasaka.nagano.jp +yasuoka.nagano.jp +chijiwa.nagasaki.jp +futsu.nagasaki.jp +goto.nagasaki.jp +hasami.nagasaki.jp +hirado.nagasaki.jp +iki.nagasaki.jp +isahaya.nagasaki.jp +kawatana.nagasaki.jp +kuchinotsu.nagasaki.jp +matsuura.nagasaki.jp +nagasaki.nagasaki.jp +obama.nagasaki.jp +omura.nagasaki.jp +oseto.nagasaki.jp +saikai.nagasaki.jp +sasebo.nagasaki.jp +seihi.nagasaki.jp +shimabara.nagasaki.jp +shinkamigoto.nagasaki.jp +togitsu.nagasaki.jp +tsushima.nagasaki.jp +unzen.nagasaki.jp +ando.nara.jp +gose.nara.jp +heguri.nara.jp +higashiyoshino.nara.jp +ikaruga.nara.jp +ikoma.nara.jp +kamikitayama.nara.jp +kanmaki.nara.jp +kashiba.nara.jp +kashihara.nara.jp +katsuragi.nara.jp +kawai.nara.jp +kawakami.nara.jp +kawanishi.nara.jp +koryo.nara.jp +kurotaki.nara.jp +mitsue.nara.jp +miyake.nara.jp +nara.nara.jp +nosegawa.nara.jp +oji.nara.jp +ouda.nara.jp +oyodo.nara.jp +sakurai.nara.jp +sango.nara.jp +shimoichi.nara.jp +shimokitayama.nara.jp +shinjo.nara.jp +soni.nara.jp +takatori.nara.jp +tawaramoto.nara.jp +tenkawa.nara.jp +tenri.nara.jp +uda.nara.jp +yamatokoriyama.nara.jp +yamatotakada.nara.jp +yamazoe.nara.jp +yoshino.nara.jp +aga.niigata.jp +agano.niigata.jp +gosen.niigata.jp +itoigawa.niigata.jp +izumozaki.niigata.jp +joetsu.niigata.jp +kamo.niigata.jp +kariwa.niigata.jp +kashiwazaki.niigata.jp +minamiuonuma.niigata.jp +mitsuke.niigata.jp +muika.niigata.jp +murakami.niigata.jp +myoko.niigata.jp +nagaoka.niigata.jp +niigata.niigata.jp +ojiya.niigata.jp +omi.niigata.jp +sado.niigata.jp +sanjo.niigata.jp +seiro.niigata.jp +seirou.niigata.jp +sekikawa.niigata.jp +shibata.niigata.jp +tagami.niigata.jp +tainai.niigata.jp +tochio.niigata.jp +tokamachi.niigata.jp +tsubame.niigata.jp +tsunan.niigata.jp +uonuma.niigata.jp +yahiko.niigata.jp +yoita.niigata.jp +yuzawa.niigata.jp +beppu.oita.jp +bungoono.oita.jp +bungotakada.oita.jp +hasama.oita.jp +hiji.oita.jp +himeshima.oita.jp +hita.oita.jp +kamitsue.oita.jp +kokonoe.oita.jp +kuju.oita.jp +kunisaki.oita.jp +kusu.oita.jp +oita.oita.jp +saiki.oita.jp +taketa.oita.jp +tsukumi.oita.jp +usa.oita.jp +usuki.oita.jp +yufu.oita.jp +akaiwa.okayama.jp +asakuchi.okayama.jp +bizen.okayama.jp +hayashima.okayama.jp +ibara.okayama.jp +kagamino.okayama.jp +kasaoka.okayama.jp +kibichuo.okayama.jp +kumenan.okayama.jp +kurashiki.okayama.jp +maniwa.okayama.jp +misaki.okayama.jp +nagi.okayama.jp +niimi.okayama.jp +nishiawakura.okayama.jp +okayama.okayama.jp +satosho.okayama.jp +setouchi.okayama.jp +shinjo.okayama.jp +shoo.okayama.jp +soja.okayama.jp +takahashi.okayama.jp +tamano.okayama.jp +tsuyama.okayama.jp +wake.okayama.jp +yakage.okayama.jp +aguni.okinawa.jp +ginowan.okinawa.jp +ginoza.okinawa.jp +gushikami.okinawa.jp +haebaru.okinawa.jp +higashi.okinawa.jp +hirara.okinawa.jp +iheya.okinawa.jp +ishigaki.okinawa.jp +ishikawa.okinawa.jp +itoman.okinawa.jp +izena.okinawa.jp +kadena.okinawa.jp +kin.okinawa.jp +kitadaito.okinawa.jp +kitanakagusuku.okinawa.jp +kumejima.okinawa.jp +kunigami.okinawa.jp +minamidaito.okinawa.jp +motobu.okinawa.jp +nago.okinawa.jp +naha.okinawa.jp +nakagusuku.okinawa.jp +nakijin.okinawa.jp +nanjo.okinawa.jp +nishihara.okinawa.jp +ogimi.okinawa.jp +okinawa.okinawa.jp +onna.okinawa.jp +shimoji.okinawa.jp +taketomi.okinawa.jp +tarama.okinawa.jp +tokashiki.okinawa.jp +tomigusuku.okinawa.jp +tonaki.okinawa.jp +urasoe.okinawa.jp +uruma.okinawa.jp +yaese.okinawa.jp +yomitan.okinawa.jp +yonabaru.okinawa.jp +yonaguni.okinawa.jp +zamami.okinawa.jp +abeno.osaka.jp +chihayaakasaka.osaka.jp +chuo.osaka.jp +daito.osaka.jp +fujiidera.osaka.jp +habikino.osaka.jp +hannan.osaka.jp +higashiosaka.osaka.jp +higashisumiyoshi.osaka.jp +higashiyodogawa.osaka.jp +hirakata.osaka.jp +ibaraki.osaka.jp +ikeda.osaka.jp +izumi.osaka.jp +izumiotsu.osaka.jp +izumisano.osaka.jp +kadoma.osaka.jp +kaizuka.osaka.jp +kanan.osaka.jp +kashiwara.osaka.jp +katano.osaka.jp +kawachinagano.osaka.jp +kishiwada.osaka.jp +kita.osaka.jp +kumatori.osaka.jp +matsubara.osaka.jp +minato.osaka.jp +minoh.osaka.jp +misaki.osaka.jp +moriguchi.osaka.jp +neyagawa.osaka.jp +nishi.osaka.jp +nose.osaka.jp +osakasayama.osaka.jp +sakai.osaka.jp +sayama.osaka.jp +sennan.osaka.jp +settsu.osaka.jp +shijonawate.osaka.jp +shimamoto.osaka.jp +suita.osaka.jp +tadaoka.osaka.jp +taishi.osaka.jp +tajiri.osaka.jp +takaishi.osaka.jp +takatsuki.osaka.jp +tondabayashi.osaka.jp +toyonaka.osaka.jp +toyono.osaka.jp +yao.osaka.jp +ariake.saga.jp +arita.saga.jp +fukudomi.saga.jp +genkai.saga.jp +hamatama.saga.jp +hizen.saga.jp +imari.saga.jp +kamimine.saga.jp +kanzaki.saga.jp +karatsu.saga.jp +kashima.saga.jp +kitagata.saga.jp +kitahata.saga.jp +kiyama.saga.jp +kouhoku.saga.jp +kyuragi.saga.jp +nishiarita.saga.jp +ogi.saga.jp +omachi.saga.jp +ouchi.saga.jp +saga.saga.jp +shiroishi.saga.jp +taku.saga.jp +tara.saga.jp +tosu.saga.jp +yoshinogari.saga.jp +arakawa.saitama.jp +asaka.saitama.jp +chichibu.saitama.jp +fujimi.saitama.jp +fujimino.saitama.jp +fukaya.saitama.jp +hanno.saitama.jp +hanyu.saitama.jp +hasuda.saitama.jp +hatogaya.saitama.jp +hatoyama.saitama.jp +hidaka.saitama.jp +higashichichibu.saitama.jp +higashimatsuyama.saitama.jp +honjo.saitama.jp +ina.saitama.jp +iruma.saitama.jp +iwatsuki.saitama.jp +kamiizumi.saitama.jp +kamikawa.saitama.jp +kamisato.saitama.jp +kasukabe.saitama.jp +kawagoe.saitama.jp +kawaguchi.saitama.jp +kawajima.saitama.jp +kazo.saitama.jp +kitamoto.saitama.jp +koshigaya.saitama.jp +kounosu.saitama.jp +kuki.saitama.jp +kumagaya.saitama.jp +matsubushi.saitama.jp +minano.saitama.jp +misato.saitama.jp +miyashiro.saitama.jp +miyoshi.saitama.jp +moroyama.saitama.jp +nagatoro.saitama.jp +namegawa.saitama.jp +niiza.saitama.jp +ogano.saitama.jp +ogawa.saitama.jp +ogose.saitama.jp +okegawa.saitama.jp +omiya.saitama.jp +otaki.saitama.jp +ranzan.saitama.jp +ryokami.saitama.jp +saitama.saitama.jp +sakado.saitama.jp +satte.saitama.jp +sayama.saitama.jp +shiki.saitama.jp +shiraoka.saitama.jp +soka.saitama.jp +sugito.saitama.jp +toda.saitama.jp +tokigawa.saitama.jp +tokorozawa.saitama.jp +tsurugashima.saitama.jp +urawa.saitama.jp +warabi.saitama.jp +yashio.saitama.jp +yokoze.saitama.jp +yono.saitama.jp +yorii.saitama.jp +yoshida.saitama.jp +yoshikawa.saitama.jp +yoshimi.saitama.jp +aisho.shiga.jp +gamo.shiga.jp +higashiomi.shiga.jp +hikone.shiga.jp +koka.shiga.jp +konan.shiga.jp +kosei.shiga.jp +koto.shiga.jp +kusatsu.shiga.jp +maibara.shiga.jp +moriyama.shiga.jp +nagahama.shiga.jp +nishiazai.shiga.jp +notogawa.shiga.jp +omihachiman.shiga.jp +otsu.shiga.jp +ritto.shiga.jp +ryuoh.shiga.jp +takashima.shiga.jp +takatsuki.shiga.jp +torahime.shiga.jp +toyosato.shiga.jp +yasu.shiga.jp +akagi.shimane.jp +ama.shimane.jp +gotsu.shimane.jp +hamada.shimane.jp +higashiizumo.shimane.jp +hikawa.shimane.jp +hikimi.shimane.jp +izumo.shimane.jp +kakinoki.shimane.jp +masuda.shimane.jp +matsue.shimane.jp +misato.shimane.jp +nishinoshima.shimane.jp +ohda.shimane.jp +okinoshima.shimane.jp +okuizumo.shimane.jp +shimane.shimane.jp +tamayu.shimane.jp +tsuwano.shimane.jp +unnan.shimane.jp +yakumo.shimane.jp +yasugi.shimane.jp +yatsuka.shimane.jp +arai.shizuoka.jp +atami.shizuoka.jp +fuji.shizuoka.jp +fujieda.shizuoka.jp +fujikawa.shizuoka.jp +fujinomiya.shizuoka.jp +fukuroi.shizuoka.jp +gotemba.shizuoka.jp +haibara.shizuoka.jp +hamamatsu.shizuoka.jp +higashiizu.shizuoka.jp +ito.shizuoka.jp +iwata.shizuoka.jp +izu.shizuoka.jp +izunokuni.shizuoka.jp +kakegawa.shizuoka.jp +kannami.shizuoka.jp +kawanehon.shizuoka.jp +kawazu.shizuoka.jp +kikugawa.shizuoka.jp +kosai.shizuoka.jp +makinohara.shizuoka.jp +matsuzaki.shizuoka.jp +minamiizu.shizuoka.jp +mishima.shizuoka.jp +morimachi.shizuoka.jp +nishiizu.shizuoka.jp +numazu.shizuoka.jp +omaezaki.shizuoka.jp +shimada.shizuoka.jp +shimizu.shizuoka.jp +shimoda.shizuoka.jp +shizuoka.shizuoka.jp +susono.shizuoka.jp +yaizu.shizuoka.jp +yoshida.shizuoka.jp +ashikaga.tochigi.jp +bato.tochigi.jp +haga.tochigi.jp +ichikai.tochigi.jp +iwafune.tochigi.jp +kaminokawa.tochigi.jp +kanuma.tochigi.jp +karasuyama.tochigi.jp +kuroiso.tochigi.jp +mashiko.tochigi.jp +mibu.tochigi.jp +moka.tochigi.jp +motegi.tochigi.jp +nasu.tochigi.jp +nasushiobara.tochigi.jp +nikko.tochigi.jp +nishikata.tochigi.jp +nogi.tochigi.jp +ohira.tochigi.jp +ohtawara.tochigi.jp +oyama.tochigi.jp +sakura.tochigi.jp +sano.tochigi.jp +shimotsuke.tochigi.jp +shioya.tochigi.jp +takanezawa.tochigi.jp +tochigi.tochigi.jp +tsuga.tochigi.jp +ujiie.tochigi.jp +utsunomiya.tochigi.jp +yaita.tochigi.jp +aizumi.tokushima.jp +anan.tokushima.jp +ichiba.tokushima.jp +itano.tokushima.jp +kainan.tokushima.jp +komatsushima.tokushima.jp +matsushige.tokushima.jp +mima.tokushima.jp +minami.tokushima.jp +miyoshi.tokushima.jp +mugi.tokushima.jp +nakagawa.tokushima.jp +naruto.tokushima.jp +sanagochi.tokushima.jp +shishikui.tokushima.jp +tokushima.tokushima.jp +wajiki.tokushima.jp +adachi.tokyo.jp +akiruno.tokyo.jp +akishima.tokyo.jp +aogashima.tokyo.jp +arakawa.tokyo.jp +bunkyo.tokyo.jp +chiyoda.tokyo.jp +chofu.tokyo.jp +chuo.tokyo.jp +edogawa.tokyo.jp +fuchu.tokyo.jp +fussa.tokyo.jp +hachijo.tokyo.jp +hachioji.tokyo.jp +hamura.tokyo.jp +higashikurume.tokyo.jp +higashimurayama.tokyo.jp +higashiyamato.tokyo.jp +hino.tokyo.jp +hinode.tokyo.jp +hinohara.tokyo.jp +inagi.tokyo.jp +itabashi.tokyo.jp +katsushika.tokyo.jp +kita.tokyo.jp +kiyose.tokyo.jp +kodaira.tokyo.jp +koganei.tokyo.jp +kokubunji.tokyo.jp +komae.tokyo.jp +koto.tokyo.jp +kouzushima.tokyo.jp +kunitachi.tokyo.jp +machida.tokyo.jp +meguro.tokyo.jp +minato.tokyo.jp +mitaka.tokyo.jp +mizuho.tokyo.jp +musashimurayama.tokyo.jp +musashino.tokyo.jp +nakano.tokyo.jp +nerima.tokyo.jp +ogasawara.tokyo.jp +okutama.tokyo.jp +ome.tokyo.jp +oshima.tokyo.jp +ota.tokyo.jp +setagaya.tokyo.jp +shibuya.tokyo.jp +shinagawa.tokyo.jp +shinjuku.tokyo.jp +suginami.tokyo.jp +sumida.tokyo.jp +tachikawa.tokyo.jp +taito.tokyo.jp +tama.tokyo.jp +toshima.tokyo.jp +chizu.tottori.jp +hino.tottori.jp +kawahara.tottori.jp +koge.tottori.jp +kotoura.tottori.jp +misasa.tottori.jp +nanbu.tottori.jp +nichinan.tottori.jp +sakaiminato.tottori.jp +tottori.tottori.jp +wakasa.tottori.jp +yazu.tottori.jp +yonago.tottori.jp +asahi.toyama.jp +fuchu.toyama.jp +fukumitsu.toyama.jp +funahashi.toyama.jp +himi.toyama.jp +imizu.toyama.jp +inami.toyama.jp +johana.toyama.jp +kamiichi.toyama.jp +kurobe.toyama.jp +nakaniikawa.toyama.jp +namerikawa.toyama.jp +nanto.toyama.jp +nyuzen.toyama.jp +oyabe.toyama.jp +taira.toyama.jp +takaoka.toyama.jp +tateyama.toyama.jp +toga.toyama.jp +tonami.toyama.jp +toyama.toyama.jp +unazuki.toyama.jp +uozu.toyama.jp +yamada.toyama.jp +arida.wakayama.jp +aridagawa.wakayama.jp +gobo.wakayama.jp +hashimoto.wakayama.jp +hidaka.wakayama.jp +hirogawa.wakayama.jp +inami.wakayama.jp +iwade.wakayama.jp +kainan.wakayama.jp +kamitonda.wakayama.jp +katsuragi.wakayama.jp +kimino.wakayama.jp +kinokawa.wakayama.jp +kitayama.wakayama.jp +koya.wakayama.jp +koza.wakayama.jp +kozagawa.wakayama.jp +kudoyama.wakayama.jp +kushimoto.wakayama.jp +mihama.wakayama.jp +misato.wakayama.jp +nachikatsuura.wakayama.jp +shingu.wakayama.jp +shirahama.wakayama.jp +taiji.wakayama.jp +tanabe.wakayama.jp +wakayama.wakayama.jp +yuasa.wakayama.jp +yura.wakayama.jp +asahi.yamagata.jp +funagata.yamagata.jp +higashine.yamagata.jp +iide.yamagata.jp +kahoku.yamagata.jp +kaminoyama.yamagata.jp +kaneyama.yamagata.jp +kawanishi.yamagata.jp +mamurogawa.yamagata.jp +mikawa.yamagata.jp +murayama.yamagata.jp +nagai.yamagata.jp +nakayama.yamagata.jp +nanyo.yamagata.jp +nishikawa.yamagata.jp +obanazawa.yamagata.jp +oe.yamagata.jp +oguni.yamagata.jp +ohkura.yamagata.jp +oishida.yamagata.jp +sagae.yamagata.jp +sakata.yamagata.jp +sakegawa.yamagata.jp +shinjo.yamagata.jp +shirataka.yamagata.jp +shonai.yamagata.jp +takahata.yamagata.jp +tendo.yamagata.jp +tozawa.yamagata.jp +tsuruoka.yamagata.jp +yamagata.yamagata.jp +yamanobe.yamagata.jp +yonezawa.yamagata.jp +yuza.yamagata.jp +abu.yamaguchi.jp +hagi.yamaguchi.jp +hikari.yamaguchi.jp +hofu.yamaguchi.jp +iwakuni.yamaguchi.jp +kudamatsu.yamaguchi.jp +mitou.yamaguchi.jp +nagato.yamaguchi.jp +oshima.yamaguchi.jp +shimonoseki.yamaguchi.jp +shunan.yamaguchi.jp +tabuse.yamaguchi.jp +tokuyama.yamaguchi.jp +toyota.yamaguchi.jp +ube.yamaguchi.jp +yuu.yamaguchi.jp +chuo.yamanashi.jp +doshi.yamanashi.jp +fuefuki.yamanashi.jp +fujikawa.yamanashi.jp +fujikawaguchiko.yamanashi.jp +fujiyoshida.yamanashi.jp +hayakawa.yamanashi.jp +hokuto.yamanashi.jp +ichikawamisato.yamanashi.jp +kai.yamanashi.jp +kofu.yamanashi.jp +koshu.yamanashi.jp +kosuge.yamanashi.jp +minami-alps.yamanashi.jp +minobu.yamanashi.jp +nakamichi.yamanashi.jp +nanbu.yamanashi.jp +narusawa.yamanashi.jp +nirasaki.yamanashi.jp +nishikatsura.yamanashi.jp +oshino.yamanashi.jp +otsuki.yamanashi.jp +showa.yamanashi.jp +tabayama.yamanashi.jp +tsuru.yamanashi.jp +uenohara.yamanashi.jp +yamanakako.yamanashi.jp +yamanashi.yamanashi.jp + +// ke : http://www.kenic.or.ke/index.php/en/ke-domains/ke-domains +ke +ac.ke +co.ke +go.ke +info.ke +me.ke +mobi.ke +ne.ke +or.ke +sc.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : https://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// https://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : https://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kp : http://www.kcce.kp/en_index.php +kp +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp + +// kr : https://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : https://www.nic.kw/policies/ +// Confirmed by registry <nic.tech@citra.gov.kw> +kw +com.kw +edu.kw +emb.kw +gov.kw +ind.kw +net.kw +org.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17 +ky +edu.ky +gov.ky +com.ky +org.ky +net.ky + +// kz : https://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : https://en.wikipedia.org/wiki/.la +// Submitted by registry <gavin.brown@nic.la> +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la + +// lb : https://en.wikipedia.org/wiki/.lb +// Submitted by registry <randy@psg.com> +lb +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : https://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : https://en.wikipedia.org/wiki/.li +li + +// lk : http://www.nic.lk/seclevpr.html +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk +ac.lk + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry <randy@psg.com> +lr +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : http://www.nic.ls/ +// Confirmed by registry <lsadmin@nic.ls> +ls +ac.ls +biz.ls +co.ls +edu.ls +gov.ls +info.ls +net.ls +org.ls +sc.ls + +// lt : https://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : https://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : https://en.wikipedia.org/wiki/.md +md + +// me : https://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://nic.mg/nicmg/?page_id=39 +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg +co.mg + +// mh : https://en.wikipedia.org/wiki/.mh +mh + +// mil : https://en.wikipedia.org/wiki/.mil +mil + +// mk : https://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: https://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : https://en.wikipedia.org/wiki/.mm +*.mm + +// mn : https://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : https://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry <dcamacho@saipan.com> 2008-06-17 +mp + +// mq : https://en.wikipedia.org/wiki/.mq +mq + +// mr : https://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf +ms +com.ms +edu.ms +gov.ms +net.ms +org.ms + +// mt : https://www.nic.org.mt/go/policy +// Submitted by registry <help@nic.org.mt> +mt +com.mt +edu.mt +net.mt +org.mt + +// mu : https://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלים.museum +иком.museum + +// mv : https://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry <farias@nic.mx> +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.net.my/ +my +com.my +net.my +org.my +gov.my +edu.my +mil.my +name.my + +// mz : http://www.uem.mz/ +// Submitted by registry <antonio@uem.mz> +mz +ac.mz +adv.mz +co.mz +edu.mz +gov.mz +mil.mz +net.mz +org.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc +nom.nc + +// ne : https://en.wikipedia.org/wiki/.ne +ne + +// net : https://en.wikipedia.org/wiki/.net +net + +// nf : https://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds +ng +com.ng +edu.ng +gov.ng +i.ng +mil.ng +mobi.ng +name.ng +net.ng +org.ng +sch.ng + +// ni : http://www.nic.ni/ +ni +ac.ni +biz.ni +co.ni +com.ni +edu.ni +gob.ni +in.ni +info.ni +int.ni +mil.ni +net.ni +nom.ni +org.ni +web.ni + +// nl : https://en.wikipedia.org/wiki/.nl +// https://www.sidn.nl/ +// ccTLD for the Netherlands +nl + +// no : http://www.norid.no/regelverk/index.en.html +// The Norwegian registry has declined to notify us of updates. The web pages +// referenced below are the official source of the data. There is also an +// announce mailing list: +// https://postlister.uninett.no/sympa/info/norid-diskusjon +no +// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +mil.no +stat.no +dep.no +kommune.no +herad.no +// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +åkrehamn.no +algard.no +ålgård.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevåg.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +råholt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +åfjord.no +agdenes.no +al.no +ål.no +alesund.no +ålesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +åmli.no +amot.no +åmot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +årdal.no +aremark.no +arendal.no +ås.no +aseral.no +åseral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +åsnes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevåg.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bådåddjå.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +båtsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flå.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskål.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +kråanghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákŋoluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtålen.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hå.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kåfjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaŋgaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindås.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +måsøy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +meråker.no +moareke.no +moåreke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +målselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegård.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +råde.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjåk.no +skodje.no +skanland.no +skånland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snåsa.no +snoasa.no +snaase.no +snåase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +čáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegårshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvågøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vågan.no +voagat.no +vagsoy.no +vågsøy.no +vaga.no +vågå.no +valer.ostfold.no +våler.østfold.no +valer.hedmark.no +våler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Submitted by registry <technician@cenpac.net.nr> +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : https://en.wikipedia.org/wiki/.nu +nu + +// nz : https://en.wikipedia.org/wiki/.nz +// Submitted by registry <jay@nzrs.net.nz> +nz +ac.nz +co.nz +cri.nz +geek.nz +gen.nz +govt.nz +health.nz +iwi.nz +kiwi.nz +maori.nz +mil.nz +māori.nz +net.nz +org.nz +parliament.nz +school.nz + +// om : https://en.wikipedia.org/wiki/.om +om +co.om +com.om +edu.om +gov.om +med.om +museum.om +net.om +org.om +pro.om + +// onion : https://tools.ietf.org/html/rfc7686 +onion + +// org : https://en.wikipedia.org/wiki/.org +org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : https://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry <jed@email.com.ph> +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl http://www.dns.pl/english/index.html +// Submitted by registry +pl +com.pl +net.pl +org.pl +// pl functional domains (http://www.dns.pl/english/index.html) +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +nieruchomosci.pl +nom.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// Government domains +gov.pl +ap.gov.pl +ic.gov.pl +is.gov.pl +us.gov.pl +kmpsp.gov.pl +kppsp.gov.pl +kwpsp.gov.pl +psp.gov.pl +wskr.gov.pl +kwp.gov.pl +mw.gov.pl +ug.gov.pl +um.gov.pl +umig.gov.pl +ugim.gov.pl +upow.gov.pl +uw.gov.pl +starostwo.gov.pl +pa.gov.pl +po.gov.pl +psse.gov.pl +pup.gov.pl +rzgw.gov.pl +sa.gov.pl +so.gov.pl +sr.gov.pl +wsa.gov.pl +sko.gov.pl +uzs.gov.pl +wiih.gov.pl +winb.gov.pl +pinb.gov.pl +wios.gov.pl +witd.gov.pl +wzmiuw.gov.pl +piw.gov.pl +wiw.gov.pl +griw.gov.pl +wif.gov.pl +oum.gov.pl +sdn.gov.pl +zp.gov.pl +uppo.gov.pl +mup.gov.pl +wuoz.gov.pl +konsulat.gov.pl +oirm.gov.pl +// pl regional domains (http://www.dns.pl/english/index.html) +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl + +// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +pm + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// post : https://en.wikipedia.org/wiki/.post +post + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://registry.pro/get-pro +pro +aaa.pro +aca.pro +acct.pro +avocat.pro +bar.pro +cpa.pro +eng.pro +jur.pro +law.pro +med.pro +recht.pro + +// ps : https://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : http://online.dns.pt/dns/start_dns +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : https://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/pautas.html#seccion_9 +// Submitted by registry +py +com.py +coop.py +edu.py +gov.py +mil.py +net.py +org.py + +// qa : http://domains.qa/en/ +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +asso.re +com.re +nom.re + +// ro : http://www.rotld.ro/ +ro +arts.ro +com.ro +firm.ro +info.ro +nom.ro +nt.ro +org.ro +rec.ro +store.ro +tm.ro +www.ro + +// rs : https://www.rnids.rs/en/domains/national-domains +rs +ac.rs +co.rs +edu.rs +gov.rs +in.rs +org.rs + +// ru : https://cctld.ru/en/domains/domens_ru/reserved/ +ru +ac.ru +edu.ru +gov.ru +int.ru +mil.ru +test.ru + +// rw : https://www.ricta.org.rw/sites/default/files/resources/registry_registrar_contract_0.pdf +rw +ac.rw +co.rw +coop.rw +gov.rw +mil.rw +net.rw +org.rw + +// sa : http://www.nic.net.sa/ +sa +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry <lee.humphries@telekom.com.sb> +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry <admin@isoc.sd> +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +tv.sd +gov.sd +info.sd + +// se : https://en.wikipedia.org/wiki/.se +// Submitted by registry <patrik.wallstrom@iis.se> +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://www.nic.sh/registrar.html +sh +com.sh +net.sh +gov.sh +org.sh +mil.sh + +// si : https://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry <jarle@uninett.no> +sj + +// sk : https://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry <adam@neoip.com> +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : https://en.wikipedia.org/wiki/.sm +sm + +// sn : https://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// so : http://sonic.so/policies/ +so +com.so +edu.so +gov.so +me.so +net.so +org.so + +// sr : https://en.wikipedia.org/wiki/.sr +sr + +// ss : https://registry.nic.ss/ +// Submitted by registry <technical@nic.ss> +ss +biz.ss +com.ss +edu.ss +gov.ss +net.ss +org.ss + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +gov.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : https://en.wikipedia.org/wiki/.su +su + +// sv : http://www.svnet.org.sv/niveldos.pdf +sv +com.sv +edu.sv +gob.sv +org.sv +red.sv + +// sx : https://en.wikipedia.org/wiki/.sx +// Submitted by registry <jcvignes@openregistry.com> +sx +gov.sx + +// sy : https://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : https://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : https://en.wikipedia.org/wiki/.tc +tc + +// td : https://en.wikipedia.org/wiki/.td +td + +// tel: https://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : https://en.wikipedia.org/wiki/.tf +tf + +// tg : https://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/ +tg + +// th : https://en.wikipedia.org/wiki/.th +// Submitted by registry <krit@thains.co.th> +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.html +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : https://en.wikipedia.org/wiki/.tk +tk + +// tl : https://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/local.html +tm +com.tm +co.tm +org.tm +net.tm +nom.tm +gov.tm +mil.tm +edu.tm + +// tn : https://en.wikipedia.org/wiki/.tn +// http://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +intl.tn +nat.tn +net.tn +org.tn +info.tn +perso.tn +tourism.tn +edunet.tn +rnrt.tn +rns.tn +rnu.tn +mincom.tn +agrinet.tn +defense.tn +turen.tn + +// to : https://en.wikipedia.org/wiki/.to +// Submitted by registry <egullich@colo.to> +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// tr : https://nic.tr/ +// https://nic.tr/forms/eng/policies.pdf +// https://nic.tr/index.php?USRACTN=PRICELST +tr +av.tr +bbs.tr +bel.tr +biz.tr +com.tr +dr.tr +edu.tr +gen.tr +gov.tr +info.tr +mil.tr +k12.tr +kep.tr +name.tr +net.tr +org.tr +pol.tr +tel.tr +tsk.tr +tv.tr +web.tr +// Used by Northern Cyprus +nc.tr +// Used by government agencies of Northern Cyprus +gov.nc.tr + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : https://en.wikipedia.org/wiki/.tv +// Not listing any 2LDs as reserved since none seem to exist in practice, +// Wikipedia notwithstanding. +tv + +// tw : https://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://www.tznic.or.tz/index.php/domains +// Submitted by registry <manager@tznic.or.tz> +tz +ac.tz +co.tz +go.tz +hotel.tz +info.tz +me.tz +mil.tz +mobi.tz +ne.tz +or.tz +sc.tz +tv.tz + +// ua : https://hostmaster.ua/policy/?ua +// Submitted by registry <dk@cctld.ua> +ua +// ua 2LD +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geographic names +// https://hostmaster.ua/2ld/ +cherkassy.ua +cherkasy.ua +chernigov.ua +chernihiv.ua +chernivtsi.ua +chernovtsy.ua +ck.ua +cn.ua +cr.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +dnipropetrovsk.ua +dominic.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkiv.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +khmelnytskyi.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +krym.ua +ks.ua +kv.ua +kyiv.ua +lg.ua +lt.ua +lugansk.ua +lutsk.ua +lv.ua +lviv.ua +mk.ua +mykolaiv.ua +nikolaev.ua +od.ua +odesa.ua +odessa.ua +pl.ua +poltava.ua +rivne.ua +rovno.ua +rv.ua +sb.ua +sebastopol.ua +sevastopol.ua +sm.ua +sumy.ua +te.ua +ternopil.ua +uz.ua +uzhgorod.ua +vinnica.ua +vinnytsia.ua +vn.ua +volyn.ua +yalta.ua +zaporizhzhe.ua +zaporizhzhia.ua +zhitomir.ua +zhytomyr.ua +zp.ua +zt.ua + +// ug : https://www.registry.co.ug/ +ug +co.ug +or.ug +ac.ug +sc.ug +go.ug +ne.ug +com.ug +org.ug + +// uk : https://en.wikipedia.org/wiki/.uk +// Submitted by registry <Michael.Daly@nominet.org.uk> +uk +ac.uk +co.uk +gov.uk +ltd.uk +me.uk +net.uk +nhs.uk +org.uk +plc.uk +police.uk +*.sch.uk + +// us : https://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are available, or even nothing at all. We include the +// most common ones where it's clear that different sites are different +// entities. +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.de.us +k12.fl.us +k12.ga.us +k12.gu.us +// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov> +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +k12.ri.us +k12.sc.us +// k12.sd.us Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us> +k12.tn.us +k12.tx.us +k12.ut.us +k12.vi.us +k12.vt.us +k12.va.us +k12.wa.us +k12.wi.us +// k12.wv.us Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu> +k12.wy.us +cc.ak.us +cc.al.us +cc.ar.us +cc.as.us +cc.az.us +cc.ca.us +cc.co.us +cc.ct.us +cc.dc.us +cc.de.us +cc.fl.us +cc.ga.us +cc.gu.us +cc.hi.us +cc.ia.us +cc.id.us +cc.il.us +cc.in.us +cc.ks.us +cc.ky.us +cc.la.us +cc.ma.us +cc.md.us +cc.me.us +cc.mi.us +cc.mn.us +cc.mo.us +cc.ms.us +cc.mt.us +cc.nc.us +cc.nd.us +cc.ne.us +cc.nh.us +cc.nj.us +cc.nm.us +cc.nv.us +cc.ny.us +cc.oh.us +cc.ok.us +cc.or.us +cc.pa.us +cc.pr.us +cc.ri.us +cc.sc.us +cc.sd.us +cc.tn.us +cc.tx.us +cc.ut.us +cc.vi.us +cc.vt.us +cc.va.us +cc.wa.us +cc.wi.us +cc.wv.us +cc.wy.us +lib.ak.us +lib.al.us +lib.ar.us +lib.as.us +lib.az.us +lib.ca.us +lib.co.us +lib.ct.us +lib.dc.us +// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore <Ed.Moore@lib.de.us> +lib.fl.us +lib.ga.us +lib.gu.us +lib.hi.us +lib.ia.us +lib.id.us +lib.il.us +lib.in.us +lib.ks.us +lib.ky.us +lib.la.us +lib.ma.us +lib.md.us +lib.me.us +lib.mi.us +lib.mn.us +lib.mo.us +lib.ms.us +lib.mt.us +lib.nc.us +lib.nd.us +lib.ne.us +lib.nh.us +lib.nj.us +lib.nm.us +lib.nv.us +lib.ny.us +lib.oh.us +lib.ok.us +lib.or.us +lib.pa.us +lib.pr.us +lib.ri.us +lib.sc.us +lib.sd.us +lib.tn.us +lib.tx.us +lib.ut.us +lib.vi.us +lib.vt.us +lib.va.us +lib.wa.us +lib.wi.us +// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us> +lib.wy.us +// k12.ma.us contains school districts in Massachusetts. The 4LDs are +// managed independently except for private (PVT), charter (CHTR) and +// parochial (PAROCH) schools. Those are delegated directly to the +// 5LD operators. <k12-ma-hostmaster _ at _ rsuc.gweep.net> +pvt.k12.ma.us +chtr.k12.ma.us +paroch.k12.ma.us +// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following +// see also: http://domreg.merit.edu +// see also: whois -h whois.domreg.merit.edu help +ann-arbor.mi.us +cog.mi.us +dst.mi.us +eaton.mi.us +gen.mi.us +mus.mi.us +tec.mi.us +washtenaw.mi.us + +// uy : http://www.nic.org.uy/ +uy +com.uy +edu.uy +gub.uy +mil.uy +net.uy +org.uy + +// uz : http://www.reg.uz/ +uz +co.uz +com.uz +net.uz +org.uz + +// va : https://en.wikipedia.org/wiki/.va +va + +// vc : https://en.wikipedia.org/wiki/.vc +// Submitted by registry <kshah@ca.afilias.info> +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : https://registro.nic.ve/ +// Submitted by registry +ve +arts.ve +co.ve +com.ve +e12.ve +edu.ve +firm.ve +gob.ve +gov.ve +info.ve +int.ve +mil.ve +net.ve +org.ve +rec.ve +store.ve +tec.ve +web.ve + +// vg : https://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : https://en.wikipedia.org/wiki/.vu +// http://www.vunic.vu/ +vu +com.vu +edu.vu +net.vu +org.vu + +// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +wf + +// ws : https://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +yt + +// IDN ccTLDs +// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then +// U-label, and follow this format: +// // A-Label ("<Latin renderings>", <language name>[, variant info]) : <ISO 3166 ccTLD> +// // [sponsoring org] +// U-Label + +// xn--mgbaam7a8h ("Emerat", Arabic) : AE +// http://nic.ae/english/arabicdomain/rules.jsp +امارات + +// xn--y9a3aq ("hye", Armenian) : AM +// ISOC AM (operated by .am Registry) +հայ + +// xn--54b7fta0cc ("Bangla", Bangla) : BD +বাংলা + +// xn--90ae ("bg", Bulgarian) : BG +бг + +// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY +// Operated by .by registry +бел + +// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中国 + +// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中國 + +// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ +الجزائر + +// xn--wgbh1c ("Egypt/Masr", Arabic) : EG +// http://www.dotmasr.eg/ +مصر + +// xn--e1a4c ("eu", Cyrillic) : EU +ею + +// xn--mgbah1a3hjkrd ("Mauritania", Arabic) : MR +موريتانيا + +// xn--node ("ge", Georgian Mkhedruli) : GE +გე + +// xn--qxam ("el", Greek) : GR +// Hellenic Ministry of Infrastructure, Transport, and Networks +ελ + +// xn--j6w193g ("Hong Kong", Chinese) : HK +// https://www.hkirc.hk +// Submitted by registry <hk.tech@hkirc.hk> +// https://www.hkirc.hk/content.jsp?id=30#!/34 +香港 +公司.香港 +教育.香港 +政府.香港 +個人.香港 +網絡.香港 +組織.香港 + +// xn--2scrj9c ("Bharat", Kannada) : IN +// India +ಭಾರತ + +// xn--3hcrj9c ("Bharat", Oriya) : IN +// India +ଭାରତ + +// xn--45br5cyl ("Bharatam", Assamese) : IN +// India +ভাৰত + +// xn--h2breg3eve ("Bharatam", Sanskrit) : IN +// India +भारतम् + +// xn--h2brj9c8c ("Bharot", Santali) : IN +// India +भारोत + +// xn--mgbgu82a ("Bharat", Sindhi) : IN +// India +ڀارت + +// xn--rvc1e0am3e ("Bharatam", Malayalam) : IN +// India +ഭാരതം + +// xn--h2brj9c ("Bharat", Devanagari) : IN +// India +भारत + +// xn--mgbbh1a ("Bharat", Kashmiri) : IN +// India +بارت + +// xn--mgbbh1a71e ("Bharat", Arabic) : IN +// India +بھارت + +// xn--fpcrj9c3d ("Bharat", Telugu) : IN +// India +భారత్ + +// xn--gecrj9c ("Bharat", Gujarati) : IN +// India +ભારત + +// xn--s9brj9c ("Bharat", Gurmukhi) : IN +// India +ਭਾਰਤ + +// xn--45brj9c ("Bharat", Bengali) : IN +// India +ভারত + +// xn--xkc2dl3a5ee0h ("India", Tamil) : IN +// India +இந்தியா + +// xn--mgba3a4f16a ("Iran", Persian) : IR +ایران + +// xn--mgba3a4fra ("Iran", Arabic) : IR +ايران + +// xn--mgbtx2b ("Iraq", Arabic) : IQ +// Communications and Media Commission +عراق + +// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO +// National Information Technology Center (NITC) +// Royal Scientific Society, Al-Jubeiha +الاردن + +// xn--3e0b707e ("Republic of Korea", Hangul) : KR +한국 + +// xn--80ao21a ("Kaz", Kazakh) : KZ +қаз + +// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK +// http://nic.lk +ලංකා + +// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK +// http://nic.lk +இலங்கை + +// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA +المغرب + +// xn--d1alf ("mkd", Macedonian) : MK +// MARnet +мкд + +// xn--l1acc ("mon", Mongolian) : MN +мон + +// xn--mix891f ("Macao", Chinese, Traditional) : MO +// MONIC / HNET Asia (Registry Operator for .mo) +澳門 + +// xn--mix082f ("Macao", Chinese, Simplified) : MO +澳门 + +// xn--mgbx4cd0ab ("Malaysia", Malay) : MY +مليسيا + +// xn--mgb9awbf ("Oman", Arabic) : OM +عمان + +// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK +پاکستان + +// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK +پاكستان + +// xn--ygbi2ammx ("Falasteen", Arabic) : PS +// The Palestinian National Internet Naming Authority (PNINA) +// http://www.pnina.ps +فلسطين + +// xn--90a3ac ("srb", Cyrillic) : RS +// https://www.rnids.rs/en/domains/national-domains +срб +пр.срб +орг.срб +обр.срб +од.срб +упр.срб +ак.срб + +// xn--p1ai ("rf", Russian-Cyrillic) : RU +// http://www.cctld.ru/en/docs/rulesrf.php +рф + +// xn--wgbl6a ("Qatar", Arabic) : QA +// http://www.ict.gov.qa/ +قطر + +// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA +// http://www.nic.net.sa/ +السعودية + +// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA +السعودیة + +// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA +السعودیۃ + +// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA +السعوديه + +// xn--mgbpl2fh ("sudan", Arabic) : SD +// Operated by .sd registry +سودان + +// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG +新加坡 + +// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG +சிங்கப்பூர் + +// xn--ogbpf8fl ("Syria", Arabic) : SY +سورية + +// xn--mgbtf8fl ("Syria", Arabic, variant) : SY +سوريا + +// xn--o3cw4h ("Thai", Thai) : TH +// http://www.thnic.co.th +ไทย +ศึกษา.ไทย +ธุรกิจ.ไทย +รัฐบาล.ไทย +ทหาร.ไทย +เน็ต.ไทย +องค์กร.ไทย + +// xn--pgbs0dh ("Tunisia", Arabic) : TN +// http://nic.tn +تونس + +// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台灣 + +// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台湾 + +// xn--nnx388a ("Taiwan", Chinese, variant) : TW +臺灣 + +// xn--j1amh ("ukr", Cyrillic) : UA +укр + +// xn--mgb2ddes ("AlYemen", Arabic) : YE +اليمن + +// xxx : http://icmregistry.com +xxx + +// ye : http://www.y.net.ye/services/domain_name.htm +*.ye + +// za : https://www.zadna.org.za/content/page/domain-information/ +ac.za +agric.za +alt.za +co.za +edu.za +gov.za +grondar.za +law.za +mil.za +net.za +ngo.za +nic.za +nis.za +nom.za +org.za +school.za +tm.za +web.za + +// zm : https://zicta.zm/ +// Submitted by registry <info@zicta.zm> +zm +ac.zm +biz.zm +co.zm +com.zm +edu.zm +gov.zm +info.zm +mil.zm +net.zm +org.zm +sch.zm + +// zw : https://www.potraz.gov.zw/ +// Confirmed by registry <bmtengwa@potraz.gov.zw> 2017-01-25 +zw +ac.zw +co.zw +gov.zw +mil.zw +org.zw + + +// newGTLDs + +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2019-11-20T17:10:44Z +// This list is auto-generated, don't edit it manually. +// aaa : 2015-02-26 American Automobile Association, Inc. +aaa + +// aarp : 2015-05-21 AARP +aarp + +// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V. +abarth + +// abb : 2014-10-24 ABB Ltd +abb + +// abbott : 2014-07-24 Abbott Laboratories, Inc. +abbott + +// abbvie : 2015-07-30 AbbVie Inc. +abbvie + +// abc : 2015-07-30 Disney Enterprises, Inc. +abc + +// able : 2015-06-25 Able Inc. +able + +// abogado : 2014-04-24 Minds + Machines Group Limited +abogado + +// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre +abudhabi + +// academy : 2013-11-07 Binky Moon, LLC +academy + +// accenture : 2014-08-15 Accenture plc +accenture + +// accountant : 2014-11-20 dot Accountant Limited +accountant + +// accountants : 2014-03-20 Binky Moon, LLC +accountants + +// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG +aco + +// actor : 2013-12-12 Dog Beach, LLC +actor + +// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) +adac + +// ads : 2014-12-04 Charleston Road Registry Inc. +ads + +// adult : 2014-10-16 ICM Registry AD LLC +adult + +// aeg : 2015-03-19 Aktiebolaget Electrolux +aeg + +// aetna : 2015-05-21 Aetna Life Insurance Company +aetna + +// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc. +afamilycompany + +// afl : 2014-10-02 Australian Football League +afl + +// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa +africa + +// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +agakhan + +// agency : 2013-11-14 Binky Moon, LLC +agency + +// aig : 2014-12-18 American International Group, Inc. +aig + +// aigo : 2015-08-06 aigo Digital Technology Co,Ltd. +aigo + +// airbus : 2015-07-30 Airbus S.A.S. +airbus + +// airforce : 2014-03-06 Dog Beach, LLC +airforce + +// airtel : 2014-10-24 Bharti Airtel Limited +airtel + +// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +akdn + +// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V. +alfaromeo + +// alibaba : 2015-01-15 Alibaba Group Holding Limited +alibaba + +// alipay : 2015-01-15 Alibaba Group Holding Limited +alipay + +// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +allfinanz + +// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company +allstate + +// ally : 2015-06-18 Ally Financial Inc. +ally + +// alsace : 2014-07-02 Region Grand Est +alsace + +// alstom : 2015-07-30 ALSTOM +alstom + +// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. +americanexpress + +// americanfamily : 2015-07-23 AmFam, Inc. +americanfamily + +// amex : 2015-07-31 American Express Travel Related Services Company, Inc. +amex + +// amfam : 2015-07-23 AmFam, Inc. +amfam + +// amica : 2015-05-28 Amica Mutual Insurance Company +amica + +// amsterdam : 2014-07-24 Gemeente Amsterdam +amsterdam + +// analytics : 2014-12-18 Campus IP LLC +analytics + +// android : 2014-08-07 Charleston Road Registry Inc. +android + +// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +anquan + +// anz : 2015-07-31 Australia and New Zealand Banking Group Limited +anz + +// aol : 2015-09-17 Oath Inc. +aol + +// apartments : 2014-12-11 Binky Moon, LLC +apartments + +// app : 2015-05-14 Charleston Road Registry Inc. +app + +// apple : 2015-05-14 Apple Inc. +apple + +// aquarelle : 2014-07-24 Aquarelle.com +aquarelle + +// arab : 2015-11-12 League of Arab States +arab + +// aramco : 2014-11-20 Aramco Services Company +aramco + +// archi : 2014-02-06 Afilias Limited +archi + +// army : 2014-03-06 Dog Beach, LLC +army + +// art : 2016-03-24 UK Creative Ideas Limited +art + +// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. +arte + +// asda : 2015-07-31 Wal-Mart Stores, Inc. +asda + +// associates : 2014-03-06 Binky Moon, LLC +associates + +// athleta : 2015-07-30 The Gap, Inc. +athleta + +// attorney : 2014-03-20 Dog Beach, LLC +attorney + +// auction : 2014-03-20 Dog Beach, LLC +auction + +// audi : 2015-05-21 AUDI Aktiengesellschaft +audi + +// audible : 2015-06-25 Amazon Registry Services, Inc. +audible + +// audio : 2014-03-20 Uniregistry, Corp. +audio + +// auspost : 2015-08-13 Australian Postal Corporation +auspost + +// author : 2014-12-18 Amazon Registry Services, Inc. +author + +// auto : 2014-11-13 Cars Registry Limited +auto + +// autos : 2014-01-09 DERAutos, LLC +autos + +// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca +avianca + +// aws : 2015-06-25 Amazon Registry Services, Inc. +aws + +// axa : 2013-12-19 AXA SA +axa + +// azure : 2014-12-18 Microsoft Corporation +azure + +// baby : 2015-04-09 XYZ.COM LLC +baby + +// baidu : 2015-01-08 Baidu, Inc. +baidu + +// banamex : 2015-07-30 Citigroup Inc. +banamex + +// bananarepublic : 2015-07-31 The Gap, Inc. +bananarepublic + +// band : 2014-06-12 Dog Beach, LLC +band + +// bank : 2014-09-25 fTLD Registry Services LLC +bank + +// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +bar + +// barcelona : 2014-07-24 Municipi de Barcelona +barcelona + +// barclaycard : 2014-11-20 Barclays Bank PLC +barclaycard + +// barclays : 2014-11-20 Barclays Bank PLC +barclays + +// barefoot : 2015-06-11 Gallo Vineyards, Inc. +barefoot + +// bargains : 2013-11-14 Binky Moon, LLC +bargains + +// baseball : 2015-10-29 MLB Advanced Media DH, LLC +baseball + +// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) +basketball + +// bauhaus : 2014-04-17 Werkhaus GmbH +bauhaus + +// bayern : 2014-01-23 Bayern Connect GmbH +bayern + +// bbc : 2014-12-18 British Broadcasting Corporation +bbc + +// bbt : 2015-07-23 BB&T Corporation +bbt + +// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +bbva + +// bcg : 2015-04-02 The Boston Consulting Group, Inc. +bcg + +// bcn : 2014-07-24 Municipi de Barcelona +bcn + +// beats : 2015-05-14 Beats Electronics, LLC +beats + +// beauty : 2015-12-03 L'Oréal +beauty + +// beer : 2014-01-09 Minds + Machines Group Limited +beer + +// bentley : 2014-12-18 Bentley Motors Limited +bentley + +// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG +berlin + +// best : 2013-12-19 BestTLD Pty Ltd +best + +// bestbuy : 2015-07-31 BBY Solutions, Inc. +bestbuy + +// bet : 2015-05-07 Afilias Limited +bet + +// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited +bharti + +// bible : 2014-06-19 American Bible Society +bible + +// bid : 2013-12-19 dot Bid Limited +bid + +// bike : 2013-08-27 Binky Moon, LLC +bike + +// bing : 2014-12-18 Microsoft Corporation +bing + +// bingo : 2014-12-04 Binky Moon, LLC +bingo + +// bio : 2014-03-06 Afilias Limited +bio + +// black : 2014-01-16 Afilias Limited +black + +// blackfriday : 2014-01-16 Uniregistry, Corp. +blackfriday + +// blockbuster : 2015-07-30 Dish DBS Corporation +blockbuster + +// blog : 2015-05-14 Knock Knock WHOIS There, LLC +blog + +// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC +bloomberg + +// blue : 2013-11-07 Afilias Limited +blue + +// bms : 2014-10-30 Bristol-Myers Squibb Company +bms + +// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +bmw + +// bnpparibas : 2014-05-29 BNP Paribas +bnpparibas + +// boats : 2014-12-04 DERBoats, LLC +boats + +// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH +boehringer + +// bofa : 2015-07-31 Bank of America Corporation +bofa + +// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +bom + +// bond : 2014-06-05 ShortDot SA +bond + +// boo : 2014-01-30 Charleston Road Registry Inc. +boo + +// book : 2015-08-27 Amazon Registry Services, Inc. +book + +// booking : 2015-07-16 Booking.com B.V. +booking + +// bosch : 2015-06-18 Robert Bosch GMBH +bosch + +// bostik : 2015-05-28 Bostik SA +bostik + +// boston : 2015-12-10 Boston TLD Management, LLC +boston + +// bot : 2014-12-18 Amazon Registry Services, Inc. +bot + +// boutique : 2013-11-14 Binky Moon, LLC +boutique + +// box : 2015-11-12 .BOX INC. +box + +// bradesco : 2014-12-18 Banco Bradesco S.A. +bradesco + +// bridgestone : 2014-12-18 Bridgestone Corporation +bridgestone + +// broadway : 2014-12-22 Celebrate Broadway, Inc. +broadway + +// broker : 2014-12-11 Dotbroker Registry Limited +broker + +// brother : 2015-01-29 Brother Industries, Ltd. +brother + +// brussels : 2014-02-06 DNS.be vzw +brussels + +// budapest : 2013-11-21 Minds + Machines Group Limited +budapest + +// bugatti : 2015-07-23 Bugatti International SA +bugatti + +// build : 2013-11-07 Plan Bee LLC +build + +// builders : 2013-11-07 Binky Moon, LLC +builders + +// business : 2013-11-07 Binky Moon, LLC +business + +// buy : 2014-12-18 Amazon Registry Services, Inc. +buy + +// buzz : 2013-10-02 DOTSTRATEGY CO. +buzz + +// bzh : 2014-02-27 Association www.bzh +bzh + +// cab : 2013-10-24 Binky Moon, LLC +cab + +// cafe : 2015-02-11 Binky Moon, LLC +cafe + +// cal : 2014-07-24 Charleston Road Registry Inc. +cal + +// call : 2014-12-18 Amazon Registry Services, Inc. +call + +// calvinklein : 2015-07-30 PVH gTLD Holdings LLC +calvinklein + +// cam : 2016-04-21 AC Webconnecting Holding B.V. +cam + +// camera : 2013-08-27 Binky Moon, LLC +camera + +// camp : 2013-11-07 Binky Moon, LLC +camp + +// cancerresearch : 2014-05-15 Australian Cancer Research Foundation +cancerresearch + +// canon : 2014-09-12 Canon Inc. +canon + +// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +capetown + +// capital : 2014-03-06 Binky Moon, LLC +capital + +// capitalone : 2015-08-06 Capital One Financial Corporation +capitalone + +// car : 2015-01-22 Cars Registry Limited +car + +// caravan : 2013-12-12 Caravan International, Inc. +caravan + +// cards : 2013-12-05 Binky Moon, LLC +cards + +// care : 2014-03-06 Binky Moon, LLC +care + +// career : 2013-10-09 dotCareer LLC +career + +// careers : 2013-10-02 Binky Moon, LLC +careers + +// cars : 2014-11-13 Cars Registry Limited +cars + +// casa : 2013-11-21 Minds + Machines Group Limited +casa + +// case : 2015-09-03 CNH Industrial N.V. +case + +// caseih : 2015-09-03 CNH Industrial N.V. +caseih + +// cash : 2014-03-06 Binky Moon, LLC +cash + +// casino : 2014-12-18 Binky Moon, LLC +casino + +// catering : 2013-12-05 Binky Moon, LLC +catering + +// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +catholic + +// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +cba + +// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. +cbn + +// cbre : 2015-07-02 CBRE, Inc. +cbre + +// cbs : 2015-08-06 CBS Domains Inc. +cbs + +// ceb : 2015-04-09 The Corporate Executive Board Company +ceb + +// center : 2013-11-07 Binky Moon, LLC +center + +// ceo : 2013-11-07 CEOTLD Pty Ltd +ceo + +// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") +cern + +// cfa : 2014-08-28 CFA Institute +cfa + +// cfd : 2014-12-11 DotCFD Registry Limited +cfd + +// chanel : 2015-04-09 Chanel International B.V. +chanel + +// channel : 2014-05-08 Charleston Road Registry Inc. +channel + +// charity : 2018-04-11 Binky Moon, LLC +charity + +// chase : 2015-04-30 JPMorgan Chase Bank, National Association +chase + +// chat : 2014-12-04 Binky Moon, LLC +chat + +// cheap : 2013-11-14 Binky Moon, LLC +cheap + +// chintai : 2015-06-11 CHINTAI Corporation +chintai + +// christmas : 2013-11-21 Uniregistry, Corp. +christmas + +// chrome : 2014-07-24 Charleston Road Registry Inc. +chrome + +// church : 2014-02-06 Binky Moon, LLC +church + +// cipriani : 2015-02-19 Hotel Cipriani Srl +cipriani + +// circle : 2014-12-18 Amazon Registry Services, Inc. +circle + +// cisco : 2014-12-22 Cisco Technology, Inc. +cisco + +// citadel : 2015-07-23 Citadel Domain LLC +citadel + +// citi : 2015-07-30 Citigroup Inc. +citi + +// citic : 2014-01-09 CITIC Group Corporation +citic + +// city : 2014-05-29 Binky Moon, LLC +city + +// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. +cityeats + +// claims : 2014-03-20 Binky Moon, LLC +claims + +// cleaning : 2013-12-05 Binky Moon, LLC +cleaning + +// click : 2014-06-05 Uniregistry, Corp. +click + +// clinic : 2014-03-20 Binky Moon, LLC +clinic + +// clinique : 2015-10-01 The Estée Lauder Companies Inc. +clinique + +// clothing : 2013-08-27 Binky Moon, LLC +clothing + +// cloud : 2015-04-16 Aruba PEC S.p.A. +cloud + +// club : 2013-11-08 .CLUB DOMAINS, LLC +club + +// clubmed : 2015-06-25 Club Méditerranée S.A. +clubmed + +// coach : 2014-10-09 Binky Moon, LLC +coach + +// codes : 2013-10-31 Binky Moon, LLC +codes + +// coffee : 2013-10-17 Binky Moon, LLC +coffee + +// college : 2014-01-16 XYZ.COM LLC +college + +// cologne : 2014-02-05 dotKoeln GmbH +cologne + +// comcast : 2015-07-23 Comcast IP Holdings I, LLC +comcast + +// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +commbank + +// community : 2013-12-05 Binky Moon, LLC +community + +// company : 2013-11-07 Binky Moon, LLC +company + +// compare : 2015-10-08 Registry Services, LLC +compare + +// computer : 2013-10-24 Binky Moon, LLC +computer + +// comsec : 2015-01-08 VeriSign, Inc. +comsec + +// condos : 2013-12-05 Binky Moon, LLC +condos + +// construction : 2013-09-16 Binky Moon, LLC +construction + +// consulting : 2013-12-05 Dog Beach, LLC +consulting + +// contact : 2015-01-08 Dog Beach, LLC +contact + +// contractors : 2013-09-10 Binky Moon, LLC +contractors + +// cooking : 2013-11-21 Minds + Machines Group Limited +cooking + +// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +cookingchannel + +// cool : 2013-11-14 Binky Moon, LLC +cool + +// corsica : 2014-09-25 Collectivité de Corse +corsica + +// country : 2013-12-19 DotCountry LLC +country + +// coupon : 2015-02-26 Amazon Registry Services, Inc. +coupon + +// coupons : 2015-03-26 Binky Moon, LLC +coupons + +// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD +courses + +// cpa : 2019-06-10 American Institute of Certified Public Accountants +cpa + +// credit : 2014-03-20 Binky Moon, LLC +credit + +// creditcard : 2014-03-20 Binky Moon, LLC +creditcard + +// creditunion : 2015-01-22 CUNA Performance Resources, LLC +creditunion + +// cricket : 2014-10-09 dot Cricket Limited +cricket + +// crown : 2014-10-24 Crown Equipment Corporation +crown + +// crs : 2014-04-03 Federated Co-operatives Limited +crs + +// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. +cruise + +// cruises : 2013-12-05 Binky Moon, LLC +cruises + +// csc : 2014-09-25 Alliance-One Services, Inc. +csc + +// cuisinella : 2014-04-03 SCHMIDT GROUPE S.A.S. +cuisinella + +// cymru : 2014-05-08 Nominet UK +cymru + +// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. +cyou + +// dabur : 2014-02-06 Dabur India Limited +dabur + +// dad : 2014-01-23 Charleston Road Registry Inc. +dad + +// dance : 2013-10-24 Dog Beach, LLC +dance + +// data : 2016-06-02 Dish DBS Corporation +data + +// date : 2014-11-20 dot Date Limited +date + +// dating : 2013-12-05 Binky Moon, LLC +dating + +// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. +datsun + +// day : 2014-01-30 Charleston Road Registry Inc. +day + +// dclk : 2014-11-20 Charleston Road Registry Inc. +dclk + +// dds : 2015-05-07 Minds + Machines Group Limited +dds + +// deal : 2015-06-25 Amazon Registry Services, Inc. +deal + +// dealer : 2014-12-22 Intercap Registry Inc. +dealer + +// deals : 2014-05-22 Binky Moon, LLC +deals + +// degree : 2014-03-06 Dog Beach, LLC +degree + +// delivery : 2014-09-11 Binky Moon, LLC +delivery + +// dell : 2014-10-24 Dell Inc. +dell + +// deloitte : 2015-07-31 Deloitte Touche Tohmatsu +deloitte + +// delta : 2015-02-19 Delta Air Lines, Inc. +delta + +// democrat : 2013-10-24 Dog Beach, LLC +democrat + +// dental : 2014-03-20 Binky Moon, LLC +dental + +// dentist : 2014-03-20 Dog Beach, LLC +dentist + +// desi : 2013-11-14 Desi Networks LLC +desi + +// design : 2014-11-07 Top Level Design, LLC +design + +// dev : 2014-10-16 Charleston Road Registry Inc. +dev + +// dhl : 2015-07-23 Deutsche Post AG +dhl + +// diamonds : 2013-09-22 Binky Moon, LLC +diamonds + +// diet : 2014-06-26 Uniregistry, Corp. +diet + +// digital : 2014-03-06 Binky Moon, LLC +digital + +// direct : 2014-04-10 Binky Moon, LLC +direct + +// directory : 2013-09-20 Binky Moon, LLC +directory + +// discount : 2014-03-06 Binky Moon, LLC +discount + +// discover : 2015-07-23 Discover Financial Services +discover + +// dish : 2015-07-30 Dish DBS Corporation +dish + +// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. +diy + +// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. +dnp + +// docs : 2014-10-16 Charleston Road Registry Inc. +docs + +// doctor : 2016-06-02 Binky Moon, LLC +doctor + +// dog : 2014-12-04 Binky Moon, LLC +dog + +// domains : 2013-10-17 Binky Moon, LLC +domains + +// dot : 2015-05-21 Dish DBS Corporation +dot + +// download : 2014-11-20 dot Support Limited +download + +// drive : 2015-03-05 Charleston Road Registry Inc. +drive + +// dtv : 2015-06-04 Dish DBS Corporation +dtv + +// dubai : 2015-01-01 Dubai Smart Government Department +dubai + +// duck : 2015-07-23 Johnson Shareholdings, Inc. +duck + +// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company +dunlop + +// dupont : 2015-06-25 E. I. du Pont de Nemours and Company +dupont + +// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +durban + +// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +dvag + +// dvr : 2016-05-26 DISH Technologies L.L.C. +dvr + +// earth : 2014-12-04 Interlink Co., Ltd. +earth + +// eat : 2014-01-23 Charleston Road Registry Inc. +eat + +// eco : 2016-07-08 Big Room Inc. +eco + +// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. +edeka + +// education : 2013-11-07 Binky Moon, LLC +education + +// email : 2013-10-31 Binky Moon, LLC +email + +// emerck : 2014-04-03 Merck KGaA +emerck + +// energy : 2014-09-11 Binky Moon, LLC +energy + +// engineer : 2014-03-06 Dog Beach, LLC +engineer + +// engineering : 2014-03-06 Binky Moon, LLC +engineering + +// enterprises : 2013-09-20 Binky Moon, LLC +enterprises + +// epson : 2014-12-04 Seiko Epson Corporation +epson + +// equipment : 2013-08-27 Binky Moon, LLC +equipment + +// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson +ericsson + +// erni : 2014-04-03 ERNI Group Holding AG +erni + +// esq : 2014-05-08 Charleston Road Registry Inc. +esq + +// estate : 2013-08-27 Binky Moon, LLC +estate + +// esurance : 2015-07-23 Esurance Insurance Company +esurance + +// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +etisalat + +// eurovision : 2014-04-24 European Broadcasting Union (EBU) +eurovision + +// eus : 2013-12-12 Puntueus Fundazioa +eus + +// events : 2013-12-05 Binky Moon, LLC +events + +// exchange : 2014-03-06 Binky Moon, LLC +exchange + +// expert : 2013-11-21 Binky Moon, LLC +expert + +// exposed : 2013-12-05 Binky Moon, LLC +exposed + +// express : 2015-02-11 Binky Moon, LLC +express + +// extraspace : 2015-05-14 Extra Space Storage LLC +extraspace + +// fage : 2014-12-18 Fage International S.A. +fage + +// fail : 2014-03-06 Binky Moon, LLC +fail + +// fairwinds : 2014-11-13 FairWinds Partners, LLC +fairwinds + +// faith : 2014-11-20 dot Faith Limited +faith + +// family : 2015-04-02 Dog Beach, LLC +family + +// fan : 2014-03-06 Dog Beach, LLC +fan + +// fans : 2014-11-07 ZDNS International Limited +fans + +// farm : 2013-11-07 Binky Moon, LLC +farm + +// farmers : 2015-07-09 Farmers Insurance Exchange +farmers + +// fashion : 2014-07-03 Minds + Machines Group Limited +fashion + +// fast : 2014-12-18 Amazon Registry Services, Inc. +fast + +// fedex : 2015-08-06 Federal Express Corporation +fedex + +// feedback : 2013-12-19 Top Level Spectrum, Inc. +feedback + +// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. +ferrari + +// ferrero : 2014-12-18 Ferrero Trading Lux S.A. +ferrero + +// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V. +fiat + +// fidelity : 2015-07-30 Fidelity Brokerage Services LLC +fidelity + +// fido : 2015-08-06 Rogers Communications Canada Inc. +fido + +// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd +film + +// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +final + +// finance : 2014-03-20 Binky Moon, LLC +finance + +// financial : 2014-03-06 Binky Moon, LLC +financial + +// fire : 2015-06-25 Amazon Registry Services, Inc. +fire + +// firestone : 2014-12-18 Bridgestone Licensing Services, Inc +firestone + +// firmdale : 2014-03-27 Firmdale Holdings Limited +firmdale + +// fish : 2013-12-12 Binky Moon, LLC +fish + +// fishing : 2013-11-21 Minds + Machines Group Limited +fishing + +// fit : 2014-11-07 Minds + Machines Group Limited +fit + +// fitness : 2014-03-06 Binky Moon, LLC +fitness + +// flickr : 2015-04-02 Yahoo! Domain Services Inc. +flickr + +// flights : 2013-12-05 Binky Moon, LLC +flights + +// flir : 2015-07-23 FLIR Systems, Inc. +flir + +// florist : 2013-11-07 Binky Moon, LLC +florist + +// flowers : 2014-10-09 Uniregistry, Corp. +flowers + +// fly : 2014-05-08 Charleston Road Registry Inc. +fly + +// foo : 2014-01-23 Charleston Road Registry Inc. +foo + +// food : 2016-04-21 Lifestyle Domain Holdings, Inc. +food + +// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. +foodnetwork + +// football : 2014-12-18 Binky Moon, LLC +football + +// ford : 2014-11-13 Ford Motor Company +ford + +// forex : 2014-12-11 Dotforex Registry Limited +forex + +// forsale : 2014-05-22 Dog Beach, LLC +forsale + +// forum : 2015-04-02 Fegistry, LLC +forum + +// foundation : 2013-12-05 Binky Moon, LLC +foundation + +// fox : 2015-09-11 FOX Registry, LLC +fox + +// free : 2015-12-10 Amazon Registry Services, Inc. +free + +// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH +fresenius + +// frl : 2014-05-15 FRLregistry B.V. +frl + +// frogans : 2013-12-19 OP3FT +frogans + +// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. +frontdoor + +// frontier : 2015-02-05 Frontier Communications Corporation +frontier + +// ftr : 2015-07-16 Frontier Communications Corporation +ftr + +// fujitsu : 2015-07-30 Fujitsu Limited +fujitsu + +// fujixerox : 2015-07-23 Xerox DNHC LLC +fujixerox + +// fun : 2016-01-14 DotSpace Inc. +fun + +// fund : 2014-03-20 Binky Moon, LLC +fund + +// furniture : 2014-03-20 Binky Moon, LLC +furniture + +// futbol : 2013-09-20 Dog Beach, LLC +futbol + +// fyi : 2015-04-02 Binky Moon, LLC +fyi + +// gal : 2013-11-07 Asociación puntoGAL +gal + +// gallery : 2013-09-13 Binky Moon, LLC +gallery + +// gallo : 2015-06-11 Gallo Vineyards, Inc. +gallo + +// gallup : 2015-02-19 Gallup, Inc. +gallup + +// game : 2015-05-28 Uniregistry, Corp. +game + +// games : 2015-05-28 Dog Beach, LLC +games + +// gap : 2015-07-31 The Gap, Inc. +gap + +// garden : 2014-06-26 Minds + Machines Group Limited +garden + +// gay : 2019-05-23 Top Level Design, LLC +gay + +// gbiz : 2014-07-17 Charleston Road Registry Inc. +gbiz + +// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" +gdn + +// gea : 2014-12-04 GEA Group Aktiengesellschaft +gea + +// gent : 2014-01-23 COMBELL NV +gent + +// genting : 2015-03-12 Resorts World Inc Pte. Ltd. +genting + +// george : 2015-07-31 Wal-Mart Stores, Inc. +george + +// ggee : 2014-01-09 GMO Internet, Inc. +ggee + +// gift : 2013-10-17 DotGift, LLC +gift + +// gifts : 2014-07-03 Binky Moon, LLC +gifts + +// gives : 2014-03-06 Dog Beach, LLC +gives + +// giving : 2014-11-13 Giving Limited +giving + +// glade : 2015-07-23 Johnson Shareholdings, Inc. +glade + +// glass : 2013-11-07 Binky Moon, LLC +glass + +// gle : 2014-07-24 Charleston Road Registry Inc. +gle + +// global : 2014-04-17 Dot Global Domain Registry Limited +global + +// globo : 2013-12-19 Globo Comunicação e Participações S.A +globo + +// gmail : 2014-05-01 Charleston Road Registry Inc. +gmail + +// gmbh : 2016-01-29 Binky Moon, LLC +gmbh + +// gmo : 2014-01-09 GMO Internet, Inc. +gmo + +// gmx : 2014-04-24 1&1 Mail & Media GmbH +gmx + +// godaddy : 2015-07-23 Go Daddy East, LLC +godaddy + +// gold : 2015-01-22 Binky Moon, LLC +gold + +// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +goldpoint + +// golf : 2014-12-18 Binky Moon, LLC +golf + +// goo : 2014-12-18 NTT Resonant Inc. +goo + +// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company +goodyear + +// goog : 2014-11-20 Charleston Road Registry Inc. +goog + +// google : 2014-07-24 Charleston Road Registry Inc. +google + +// gop : 2014-01-16 Republican State Leadership Committee, Inc. +gop + +// got : 2014-12-18 Amazon Registry Services, Inc. +got + +// grainger : 2015-05-07 Grainger Registry Services, LLC +grainger + +// graphics : 2013-09-13 Binky Moon, LLC +graphics + +// gratis : 2014-03-20 Binky Moon, LLC +gratis + +// green : 2014-05-08 Afilias Limited +green + +// gripe : 2014-03-06 Binky Moon, LLC +gripe + +// grocery : 2016-06-16 Wal-Mart Stores, Inc. +grocery + +// group : 2014-08-15 Binky Moon, LLC +group + +// guardian : 2015-07-30 The Guardian Life Insurance Company of America +guardian + +// gucci : 2014-11-13 Guccio Gucci S.p.a. +gucci + +// guge : 2014-08-28 Charleston Road Registry Inc. +guge + +// guide : 2013-09-13 Binky Moon, LLC +guide + +// guitars : 2013-11-14 Uniregistry, Corp. +guitars + +// guru : 2013-08-27 Binky Moon, LLC +guru + +// hair : 2015-12-03 L'Oréal +hair + +// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH +hamburg + +// hangout : 2014-11-13 Charleston Road Registry Inc. +hangout + +// haus : 2013-12-05 Dog Beach, LLC +haus + +// hbo : 2015-07-30 HBO Registry Services, Inc. +hbo + +// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED +hdfc + +// hdfcbank : 2015-02-12 HDFC Bank Limited +hdfcbank + +// health : 2015-02-11 DotHealth, LLC +health + +// healthcare : 2014-06-12 Binky Moon, LLC +healthcare + +// help : 2014-06-26 Uniregistry, Corp. +help + +// helsinki : 2015-02-05 City of Helsinki +helsinki + +// here : 2014-02-06 Charleston Road Registry Inc. +here + +// hermes : 2014-07-10 HERMES INTERNATIONAL +hermes + +// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. +hgtv + +// hiphop : 2014-03-06 Uniregistry, Corp. +hiphop + +// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. +hisamitsu + +// hitachi : 2014-10-31 Hitachi, Ltd. +hitachi + +// hiv : 2014-03-13 Uniregistry, Corp. +hiv + +// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited +hkt + +// hockey : 2015-03-19 Binky Moon, LLC +hockey + +// holdings : 2013-08-27 Binky Moon, LLC +holdings + +// holiday : 2013-11-07 Binky Moon, LLC +holiday + +// homedepot : 2015-04-02 Home Depot Product Authority, LLC +homedepot + +// homegoods : 2015-07-16 The TJX Companies, Inc. +homegoods + +// homes : 2014-01-09 DERHomes, LLC +homes + +// homesense : 2015-07-16 The TJX Companies, Inc. +homesense + +// honda : 2014-12-18 Honda Motor Co., Ltd. +honda + +// horse : 2013-11-21 Minds + Machines Group Limited +horse + +// hospital : 2016-10-20 Binky Moon, LLC +hospital + +// host : 2014-04-17 DotHost Inc. +host + +// hosting : 2014-05-29 Uniregistry, Corp. +hosting + +// hot : 2015-08-27 Amazon Registry Services, Inc. +hot + +// hoteles : 2015-03-05 Travel Reservations SRL +hoteles + +// hotels : 2016-04-07 Booking.com B.V. +hotels + +// hotmail : 2014-12-18 Microsoft Corporation +hotmail + +// house : 2013-11-07 Binky Moon, LLC +house + +// how : 2014-01-23 Charleston Road Registry Inc. +how + +// hsbc : 2014-10-24 HSBC Global Services (UK) Limited +hsbc + +// hughes : 2015-07-30 Hughes Satellite Systems Corporation +hughes + +// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. +hyatt + +// hyundai : 2015-07-09 Hyundai Motor Company +hyundai + +// ibm : 2014-07-31 International Business Machines Corporation +ibm + +// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited +icbc + +// ice : 2014-10-30 IntercontinentalExchange, Inc. +ice + +// icu : 2015-01-08 ShortDot SA +icu + +// ieee : 2015-07-23 IEEE Global LLC +ieee + +// ifm : 2014-01-30 ifm electronic gmbh +ifm + +// ikano : 2015-07-09 Ikano S.A. +ikano + +// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +imamat + +// imdb : 2015-06-25 Amazon Registry Services, Inc. +imdb + +// immo : 2014-07-10 Binky Moon, LLC +immo + +// immobilien : 2013-11-07 Dog Beach, LLC +immobilien + +// inc : 2018-03-10 Intercap Registry Inc. +inc + +// industries : 2013-12-05 Binky Moon, LLC +industries + +// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. +infiniti + +// ing : 2014-01-23 Charleston Road Registry Inc. +ing + +// ink : 2013-12-05 Top Level Design, LLC +ink + +// institute : 2013-11-07 Binky Moon, LLC +institute + +// insurance : 2015-02-19 fTLD Registry Services LLC +insurance + +// insure : 2014-03-20 Binky Moon, LLC +insure + +// intel : 2015-08-06 Intel Corporation +intel + +// international : 2013-11-07 Binky Moon, LLC +international + +// intuit : 2015-07-30 Intuit Administrative Services, Inc. +intuit + +// investments : 2014-03-20 Binky Moon, LLC +investments + +// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. +ipiranga + +// irish : 2014-08-07 Binky Moon, LLC +irish + +// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +ismaili + +// ist : 2014-08-28 Istanbul Metropolitan Municipality +ist + +// istanbul : 2014-08-28 Istanbul Metropolitan Municipality +istanbul + +// itau : 2014-10-02 Itau Unibanco Holding S.A. +itau + +// itv : 2015-07-09 ITV Services Limited +itv + +// iveco : 2015-09-03 CNH Industrial N.V. +iveco + +// jaguar : 2014-11-13 Jaguar Land Rover Ltd +jaguar + +// java : 2014-06-19 Oracle Corporation +java + +// jcb : 2014-11-20 JCB Co., Ltd. +jcb + +// jcp : 2015-04-23 JCP Media, Inc. +jcp + +// jeep : 2015-07-30 FCA US LLC. +jeep + +// jetzt : 2014-01-09 Binky Moon, LLC +jetzt + +// jewelry : 2015-03-05 Binky Moon, LLC +jewelry + +// jio : 2015-04-02 Reliance Industries Limited +jio + +// jll : 2015-04-02 Jones Lang LaSalle Incorporated +jll + +// jmp : 2015-03-26 Matrix IP LLC +jmp + +// jnj : 2015-06-18 Johnson & Johnson Services, Inc. +jnj + +// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +joburg + +// jot : 2014-12-18 Amazon Registry Services, Inc. +jot + +// joy : 2014-12-18 Amazon Registry Services, Inc. +joy + +// jpmorgan : 2015-04-30 JPMorgan Chase Bank, National Association +jpmorgan + +// jprs : 2014-09-18 Japan Registry Services Co., Ltd. +jprs + +// juegos : 2014-03-20 Uniregistry, Corp. +juegos + +// juniper : 2015-07-30 JUNIPER NETWORKS, INC. +juniper + +// kaufen : 2013-11-07 Dog Beach, LLC +kaufen + +// kddi : 2014-09-12 KDDI CORPORATION +kddi + +// kerryhotels : 2015-04-30 Kerry Trading Co. Limited +kerryhotels + +// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited +kerrylogistics + +// kerryproperties : 2015-04-09 Kerry Trading Co. Limited +kerryproperties + +// kfh : 2014-12-04 Kuwait Finance House +kfh + +// kia : 2015-07-09 KIA MOTORS CORPORATION +kia + +// kim : 2013-09-23 Afilias Limited +kim + +// kinder : 2014-11-07 Ferrero Trading Lux S.A. +kinder + +// kindle : 2015-06-25 Amazon Registry Services, Inc. +kindle + +// kitchen : 2013-09-20 Binky Moon, LLC +kitchen + +// kiwi : 2013-09-20 DOT KIWI LIMITED +kiwi + +// koeln : 2014-01-09 dotKoeln GmbH +koeln + +// komatsu : 2015-01-08 Komatsu Ltd. +komatsu + +// kosher : 2015-08-20 Kosher Marketing Assets LLC +kosher + +// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) +kpmg + +// kpn : 2015-01-08 Koninklijke KPN N.V. +kpn + +// krd : 2013-12-05 KRG Department of Information Technology +krd + +// kred : 2013-12-19 KredTLD Pty Ltd +kred + +// kuokgroup : 2015-04-09 Kerry Trading Co. Limited +kuokgroup + +// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen +kyoto + +// lacaixa : 2014-01-09 Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa” +lacaixa + +// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. +lamborghini + +// lamer : 2015-10-01 The Estée Lauder Companies Inc. +lamer + +// lancaster : 2015-02-12 LANCASTER +lancaster + +// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. +lancia + +// lancome : 2015-07-23 L'Oréal +lancome + +// land : 2013-09-10 Binky Moon, LLC +land + +// landrover : 2014-11-13 Jaguar Land Rover Ltd +landrover + +// lanxess : 2015-07-30 LANXESS Corporation +lanxess + +// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated +lasalle + +// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico +lat + +// latino : 2015-07-30 Dish DBS Corporation +latino + +// latrobe : 2014-06-16 La Trobe University +latrobe + +// law : 2015-01-22 LW TLD Limited +law + +// lawyer : 2014-03-20 Dog Beach, LLC +lawyer + +// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") +lds + +// lease : 2014-03-06 Binky Moon, LLC +lease + +// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +leclerc + +// lefrak : 2015-07-16 LeFrak Organization, Inc. +lefrak + +// legal : 2014-10-16 Binky Moon, LLC +legal + +// lego : 2015-07-16 LEGO Juris A/S +lego + +// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION +lexus + +// lgbt : 2014-05-08 Afilias Limited +lgbt + +// liaison : 2014-10-02 Liaison Technologies, Incorporated +liaison + +// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +lidl + +// life : 2014-02-06 Binky Moon, LLC +life + +// lifeinsurance : 2015-01-15 American Council of Life Insurers +lifeinsurance + +// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. +lifestyle + +// lighting : 2013-08-27 Binky Moon, LLC +lighting + +// like : 2014-12-18 Amazon Registry Services, Inc. +like + +// lilly : 2015-07-31 Eli Lilly and Company +lilly + +// limited : 2014-03-06 Binky Moon, LLC +limited + +// limo : 2013-10-17 Binky Moon, LLC +limo + +// lincoln : 2014-11-13 Ford Motor Company +lincoln + +// linde : 2014-12-04 Linde Aktiengesellschaft +linde + +// link : 2013-11-14 Uniregistry, Corp. +link + +// lipsy : 2015-06-25 Lipsy Ltd +lipsy + +// live : 2014-12-04 Dog Beach, LLC +live + +// living : 2015-07-30 Lifestyle Domain Holdings, Inc. +living + +// lixil : 2015-03-19 LIXIL Group Corporation +lixil + +// llc : 2017-12-14 Afilias Limited +llc + +// llp : 2019-08-26 Dot Registry LLC +llp + +// loan : 2014-11-20 dot Loan Limited +loan + +// loans : 2014-03-20 Binky Moon, LLC +loans + +// locker : 2015-06-04 Dish DBS Corporation +locker + +// locus : 2015-06-25 Locus Analytics LLC +locus + +// loft : 2015-07-30 Annco, Inc. +loft + +// lol : 2015-01-30 Uniregistry, Corp. +lol + +// london : 2013-11-14 Dot London Domains Limited +london + +// lotte : 2014-11-07 Lotte Holdings Co., Ltd. +lotte + +// lotto : 2014-04-10 Afilias Limited +lotto + +// love : 2014-12-22 Merchant Law Group LLP +love + +// lpl : 2015-07-30 LPL Holdings, Inc. +lpl + +// lplfinancial : 2015-07-30 LPL Holdings, Inc. +lplfinancial + +// ltd : 2014-09-25 Binky Moon, LLC +ltd + +// ltda : 2014-04-17 InterNetX, Corp +ltda + +// lundbeck : 2015-08-06 H. Lundbeck A/S +lundbeck + +// lupin : 2014-11-07 LUPIN LIMITED +lupin + +// luxe : 2014-01-09 Minds + Machines Group Limited +luxe + +// luxury : 2013-10-17 Luxury Partners, LLC +luxury + +// macys : 2015-07-31 Macys, Inc. +macys + +// madrid : 2014-05-01 Comunidad de Madrid +madrid + +// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) +maif + +// maison : 2013-12-05 Binky Moon, LLC +maison + +// makeup : 2015-01-15 L'Oréal +makeup + +// man : 2014-12-04 MAN SE +man + +// management : 2013-11-07 Binky Moon, LLC +management + +// mango : 2013-10-24 PUNTO FA S.L. +mango + +// map : 2016-06-09 Charleston Road Registry Inc. +map + +// market : 2014-03-06 Dog Beach, LLC +market + +// marketing : 2013-11-07 Binky Moon, LLC +marketing + +// markets : 2014-12-11 Dotmarkets Registry Limited +markets + +// marriott : 2014-10-09 Marriott Worldwide Corporation +marriott + +// marshalls : 2015-07-16 The TJX Companies, Inc. +marshalls + +// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V. +maserati + +// mattel : 2015-08-06 Mattel Sites, Inc. +mattel + +// mba : 2015-04-02 Binky Moon, LLC +mba + +// mckinsey : 2015-07-31 McKinsey Holdings, Inc. +mckinsey + +// med : 2015-08-06 Medistry LLC +med + +// media : 2014-03-06 Binky Moon, LLC +media + +// meet : 2014-01-16 Charleston Road Registry Inc. +meet + +// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +melbourne + +// meme : 2014-01-30 Charleston Road Registry Inc. +meme + +// memorial : 2014-10-16 Dog Beach, LLC +memorial + +// men : 2015-02-26 Exclusive Registry Limited +men + +// menu : 2013-09-11 Dot Menu Registry, LLC +menu + +// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. +merckmsd + +// metlife : 2015-05-07 MetLife Services and Solutions, LLC +metlife + +// miami : 2013-12-19 Minds + Machines Group Limited +miami + +// microsoft : 2014-12-18 Microsoft Corporation +microsoft + +// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +mini + +// mint : 2015-07-30 Intuit Administrative Services, Inc. +mint + +// mit : 2015-07-02 Massachusetts Institute of Technology +mit + +// mitsubishi : 2015-07-23 Mitsubishi Corporation +mitsubishi + +// mlb : 2015-05-21 MLB Advanced Media DH, LLC +mlb + +// mls : 2015-04-23 The Canadian Real Estate Association +mls + +// mma : 2014-11-07 MMA IARD +mma + +// mobile : 2016-06-02 Dish DBS Corporation +mobile + +// moda : 2013-11-07 Dog Beach, LLC +moda + +// moe : 2013-11-13 Interlink Co., Ltd. +moe + +// moi : 2014-12-18 Amazon Registry Services, Inc. +moi + +// mom : 2015-04-16 Uniregistry, Corp. +mom + +// monash : 2013-09-30 Monash University +monash + +// money : 2014-10-16 Binky Moon, LLC +money + +// monster : 2015-09-11 XYZ.COM LLC +monster + +// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") +mormon + +// mortgage : 2014-03-20 Dog Beach, LLC +mortgage + +// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +moscow + +// moto : 2015-06-04 Motorola Trademark Holdings, LLC +moto + +// motorcycles : 2014-01-09 DERMotorcycles, LLC +motorcycles + +// mov : 2014-01-30 Charleston Road Registry Inc. +mov + +// movie : 2015-02-05 Binky Moon, LLC +movie + +// movistar : 2014-10-16 Telefónica S.A. +movistar + +// msd : 2015-07-23 MSD Registry Holdings, Inc. +msd + +// mtn : 2014-12-04 MTN Dubai Limited +mtn + +// mtr : 2015-03-12 MTR Corporation Limited +mtr + +// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC +mutual + +// nab : 2015-08-20 National Australia Bank Limited +nab + +// nadex : 2014-12-11 Nadex Domains, Inc. +nadex + +// nagoya : 2013-10-24 GMO Registry, Inc. +nagoya + +// nationwide : 2015-07-23 Nationwide Mutual Insurance Company +nationwide + +// natura : 2015-03-12 NATURA COSMÉTICOS S.A. +natura + +// navy : 2014-03-06 Dog Beach, LLC +navy + +// nba : 2015-07-31 NBA REGISTRY, LLC +nba + +// nec : 2015-01-08 NEC Corporation +nec + +// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +netbank + +// netflix : 2015-06-18 Netflix, Inc. +netflix + +// network : 2013-11-14 Binky Moon, LLC +network + +// neustar : 2013-12-05 Registry Services, LLC +neustar + +// new : 2014-01-30 Charleston Road Registry Inc. +new + +// newholland : 2015-09-03 CNH Industrial N.V. +newholland + +// news : 2014-12-18 Dog Beach, LLC +news + +// next : 2015-06-18 Next plc +next + +// nextdirect : 2015-06-18 Next plc +nextdirect + +// nexus : 2014-07-24 Charleston Road Registry Inc. +nexus + +// nfl : 2015-07-23 NFL Reg Ops LLC +nfl + +// ngo : 2014-03-06 Public Interest Registry +ngo + +// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) +nhk + +// nico : 2014-12-04 DWANGO Co., Ltd. +nico + +// nike : 2015-07-23 NIKE, Inc. +nike + +// nikon : 2015-05-21 NIKON CORPORATION +nikon + +// ninja : 2013-11-07 Dog Beach, LLC +ninja + +// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. +nissan + +// nissay : 2015-10-29 Nippon Life Insurance Company +nissay + +// nokia : 2015-01-08 Nokia Corporation +nokia + +// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC +northwesternmutual + +// norton : 2014-12-04 Symantec Corporation +norton + +// now : 2015-06-25 Amazon Registry Services, Inc. +now + +// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +nowruz + +// nowtv : 2015-05-14 Starbucks (HK) Limited +nowtv + +// nra : 2014-05-22 NRA Holdings Company, INC. +nra + +// nrw : 2013-11-21 Minds + Machines GmbH +nrw + +// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION +ntt + +// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications +nyc + +// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA +obi + +// observer : 2015-04-30 Top Level Spectrum, Inc. +observer + +// off : 2015-07-23 Johnson Shareholdings, Inc. +off + +// office : 2015-03-12 Microsoft Corporation +office + +// okinawa : 2013-12-05 BRregistry, Inc. +okinawa + +// olayan : 2015-05-14 Crescent Holding GmbH +olayan + +// olayangroup : 2015-05-14 Crescent Holding GmbH +olayangroup + +// oldnavy : 2015-07-31 The Gap, Inc. +oldnavy + +// ollo : 2015-06-04 Dish DBS Corporation +ollo + +// omega : 2015-01-08 The Swatch Group Ltd +omega + +// one : 2014-11-07 One.com A/S +one + +// ong : 2014-03-06 Public Interest Registry +ong + +// onl : 2013-09-16 I-Registry Ltd. +onl + +// online : 2015-01-15 DotOnline Inc. +online + +// onyourside : 2015-07-23 Nationwide Mutual Insurance Company +onyourside + +// ooo : 2014-01-09 INFIBEAM AVENUES LIMITED +ooo + +// open : 2015-07-31 American Express Travel Related Services Company, Inc. +open + +// oracle : 2014-06-19 Oracle Corporation +oracle + +// orange : 2015-03-12 Orange Brand Services Limited +orange + +// organic : 2014-03-27 Afilias Limited +organic + +// origins : 2015-10-01 The Estée Lauder Companies Inc. +origins + +// osaka : 2014-09-04 Osaka Registry Co., Ltd. +osaka + +// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. +otsuka + +// ott : 2015-06-04 Dish DBS Corporation +ott + +// ovh : 2014-01-16 MédiaBC +ovh + +// page : 2014-12-04 Charleston Road Registry Inc. +page + +// panasonic : 2015-07-30 Panasonic Corporation +panasonic + +// paris : 2014-01-30 City of Paris +paris + +// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +pars + +// partners : 2013-12-05 Binky Moon, LLC +partners + +// parts : 2013-12-05 Binky Moon, LLC +parts + +// party : 2014-09-11 Blue Sky Registry Limited +party + +// passagens : 2015-03-05 Travel Reservations SRL +passagens + +// pay : 2015-08-27 Amazon Registry Services, Inc. +pay + +// pccw : 2015-05-14 PCCW Enterprises Limited +pccw + +// pet : 2015-05-07 Afilias Limited +pet + +// pfizer : 2015-09-11 Pfizer Inc. +pfizer + +// pharmacy : 2014-06-19 National Association of Boards of Pharmacy +pharmacy + +// phd : 2016-07-28 Charleston Road Registry Inc. +phd + +// philips : 2014-11-07 Koninklijke Philips N.V. +philips + +// phone : 2016-06-02 Dish DBS Corporation +phone + +// photo : 2013-11-14 Uniregistry, Corp. +photo + +// photography : 2013-09-20 Binky Moon, LLC +photography + +// photos : 2013-10-17 Binky Moon, LLC +photos + +// physio : 2014-05-01 PhysBiz Pty Ltd +physio + +// pics : 2013-11-14 Uniregistry, Corp. +pics + +// pictet : 2014-06-26 Pictet Europe S.A. +pictet + +// pictures : 2014-03-06 Binky Moon, LLC +pictures + +// pid : 2015-01-08 Top Level Spectrum, Inc. +pid + +// pin : 2014-12-18 Amazon Registry Services, Inc. +pin + +// ping : 2015-06-11 Ping Registry Provider, Inc. +ping + +// pink : 2013-10-01 Afilias Limited +pink + +// pioneer : 2015-07-16 Pioneer Corporation +pioneer + +// pizza : 2014-06-26 Binky Moon, LLC +pizza + +// place : 2014-04-24 Binky Moon, LLC +place + +// play : 2015-03-05 Charleston Road Registry Inc. +play + +// playstation : 2015-07-02 Sony Interactive Entertainment Inc. +playstation + +// plumbing : 2013-09-10 Binky Moon, LLC +plumbing + +// plus : 2015-02-05 Binky Moon, LLC +plus + +// pnc : 2015-07-02 PNC Domain Co., LLC +pnc + +// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +pohl + +// poker : 2014-07-03 Afilias Limited +poker + +// politie : 2015-08-20 Politie Nederland +politie + +// porn : 2014-10-16 ICM Registry PN LLC +porn + +// pramerica : 2015-07-30 Prudential Financial, Inc. +pramerica + +// praxi : 2013-12-05 Praxi S.p.A. +praxi + +// press : 2014-04-03 DotPress Inc. +press + +// prime : 2015-06-25 Amazon Registry Services, Inc. +prime + +// prod : 2014-01-23 Charleston Road Registry Inc. +prod + +// productions : 2013-12-05 Binky Moon, LLC +productions + +// prof : 2014-07-24 Charleston Road Registry Inc. +prof + +// progressive : 2015-07-23 Progressive Casualty Insurance Company +progressive + +// promo : 2014-12-18 Afilias Limited +promo + +// properties : 2013-12-05 Binky Moon, LLC +properties + +// property : 2014-05-22 Uniregistry, Corp. +property + +// protection : 2015-04-23 XYZ.COM LLC +protection + +// pru : 2015-07-30 Prudential Financial, Inc. +pru + +// prudential : 2015-07-30 Prudential Financial, Inc. +prudential + +// pub : 2013-12-12 Dog Beach, LLC +pub + +// pwc : 2015-10-29 PricewaterhouseCoopers LLP +pwc + +// qpon : 2013-11-14 dotCOOL, Inc. +qpon + +// quebec : 2013-12-19 PointQuébec Inc +quebec + +// quest : 2015-03-26 XYZ.COM LLC +quest + +// qvc : 2015-07-30 QVC, Inc. +qvc + +// racing : 2014-12-04 Premier Registry Limited +racing + +// radio : 2016-07-21 European Broadcasting Union (EBU) +radio + +// raid : 2015-07-23 Johnson Shareholdings, Inc. +raid + +// read : 2014-12-18 Amazon Registry Services, Inc. +read + +// realestate : 2015-09-11 dotRealEstate LLC +realestate + +// realtor : 2014-05-29 Real Estate Domains LLC +realtor + +// realty : 2015-03-19 Fegistry, LLC +realty + +// recipes : 2013-10-17 Binky Moon, LLC +recipes + +// red : 2013-11-07 Afilias Limited +red + +// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. +redstone + +// redumbrella : 2015-03-26 Travelers TLD, LLC +redumbrella + +// rehab : 2014-03-06 Dog Beach, LLC +rehab + +// reise : 2014-03-13 Binky Moon, LLC +reise + +// reisen : 2014-03-06 Binky Moon, LLC +reisen + +// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. +reit + +// reliance : 2015-04-02 Reliance Industries Limited +reliance + +// ren : 2013-12-12 ZDNS International Limited +ren + +// rent : 2014-12-04 XYZ.COM LLC +rent + +// rentals : 2013-12-05 Binky Moon, LLC +rentals + +// repair : 2013-11-07 Binky Moon, LLC +repair + +// report : 2013-12-05 Binky Moon, LLC +report + +// republican : 2014-03-20 Dog Beach, LLC +republican + +// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +rest + +// restaurant : 2014-07-03 Binky Moon, LLC +restaurant + +// review : 2014-11-20 dot Review Limited +review + +// reviews : 2013-09-13 Dog Beach, LLC +reviews + +// rexroth : 2015-06-18 Robert Bosch GMBH +rexroth + +// rich : 2013-11-21 I-Registry Ltd. +rich + +// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited +richardli + +// ricoh : 2014-11-20 Ricoh Company, Ltd. +ricoh + +// rightathome : 2015-07-23 Johnson Shareholdings, Inc. +rightathome + +// ril : 2015-04-02 Reliance Industries Limited +ril + +// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO +rio + +// rip : 2014-07-10 Dog Beach, LLC +rip + +// rmit : 2015-11-19 Royal Melbourne Institute of Technology +rmit + +// rocher : 2014-12-18 Ferrero Trading Lux S.A. +rocher + +// rocks : 2013-11-14 Dog Beach, LLC +rocks + +// rodeo : 2013-12-19 Minds + Machines Group Limited +rodeo + +// rogers : 2015-08-06 Rogers Communications Canada Inc. +rogers + +// room : 2014-12-18 Amazon Registry Services, Inc. +room + +// rsvp : 2014-05-08 Charleston Road Registry Inc. +rsvp + +// rugby : 2016-12-15 World Rugby Strategic Developments Limited +rugby + +// ruhr : 2013-10-02 regiodot GmbH & Co. KG +ruhr + +// run : 2015-03-19 Binky Moon, LLC +run + +// rwe : 2015-04-02 RWE AG +rwe + +// ryukyu : 2014-01-09 BRregistry, Inc. +ryukyu + +// saarland : 2013-12-12 dotSaarland GmbH +saarland + +// safe : 2014-12-18 Amazon Registry Services, Inc. +safe + +// safety : 2015-01-08 Safety Registry Services, LLC. +safety + +// sakura : 2014-12-18 SAKURA Internet Inc. +sakura + +// sale : 2014-10-16 Dog Beach, LLC +sale + +// salon : 2014-12-11 Binky Moon, LLC +salon + +// samsclub : 2015-07-31 Wal-Mart Stores, Inc. +samsclub + +// samsung : 2014-04-03 SAMSUNG SDS CO., LTD +samsung + +// sandvik : 2014-11-13 Sandvik AB +sandvik + +// sandvikcoromant : 2014-11-07 Sandvik AB +sandvikcoromant + +// sanofi : 2014-10-09 Sanofi +sanofi + +// sap : 2014-03-27 SAP AG +sap + +// sarl : 2014-07-03 Binky Moon, LLC +sarl + +// sas : 2015-04-02 Research IP LLC +sas + +// save : 2015-06-25 Amazon Registry Services, Inc. +save + +// saxo : 2014-10-31 Saxo Bank A/S +saxo + +// sbi : 2015-03-12 STATE BANK OF INDIA +sbi + +// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION +sbs + +// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) +sca + +// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") +scb + +// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG +schaeffler + +// schmidt : 2014-04-03 SCHMIDT GROUPE S.A.S. +schmidt + +// scholarships : 2014-04-24 Scholarships.com, LLC +scholarships + +// school : 2014-12-18 Binky Moon, LLC +school + +// schule : 2014-03-06 Binky Moon, LLC +schule + +// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +schwarz + +// science : 2014-09-11 dot Science Limited +science + +// scjohnson : 2015-07-23 Johnson Shareholdings, Inc. +scjohnson + +// scor : 2014-10-31 SCOR SE +scor + +// scot : 2014-01-23 Dot Scot Registry Limited +scot + +// search : 2016-06-09 Charleston Road Registry Inc. +search + +// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) +seat + +// secure : 2015-08-27 Amazon Registry Services, Inc. +secure + +// security : 2015-05-14 XYZ.COM LLC +security + +// seek : 2014-12-04 Seek Limited +seek + +// select : 2015-10-08 Registry Services, LLC +select + +// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. +sener + +// services : 2014-02-27 Binky Moon, LLC +services + +// ses : 2015-07-23 SES +ses + +// seven : 2015-08-06 Seven West Media Ltd +seven + +// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG +sew + +// sex : 2014-11-13 ICM Registry SX LLC +sex + +// sexy : 2013-09-11 Uniregistry, Corp. +sexy + +// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR +sfr + +// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited +shangrila + +// sharp : 2014-05-01 Sharp Corporation +sharp + +// shaw : 2015-04-23 Shaw Cablesystems G.P. +shaw + +// shell : 2015-07-30 Shell Information Technology International Inc +shell + +// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +shia + +// shiksha : 2013-11-14 Afilias Limited +shiksha + +// shoes : 2013-10-02 Binky Moon, LLC +shoes + +// shop : 2016-04-08 GMO Registry, Inc. +shop + +// shopping : 2016-03-31 Binky Moon, LLC +shopping + +// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +shouji + +// show : 2015-03-05 Binky Moon, LLC +show + +// showtime : 2015-08-06 CBS Domains Inc. +showtime + +// shriram : 2014-01-23 Shriram Capital Ltd. +shriram + +// silk : 2015-06-25 Amazon Registry Services, Inc. +silk + +// sina : 2015-03-12 Sina Corporation +sina + +// singles : 2013-08-27 Binky Moon, LLC +singles + +// site : 2015-01-15 DotSite Inc. +site + +// ski : 2015-04-09 Afilias Limited +ski + +// skin : 2015-01-15 L'Oréal +skin + +// sky : 2014-06-19 Sky International AG +sky + +// skype : 2014-12-18 Microsoft Corporation +skype + +// sling : 2015-07-30 DISH Technologies L.L.C. +sling + +// smart : 2015-07-09 Smart Communications, Inc. (SMART) +smart + +// smile : 2014-12-18 Amazon Registry Services, Inc. +smile + +// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F +sncf + +// soccer : 2015-03-26 Binky Moon, LLC +soccer + +// social : 2013-11-07 Dog Beach, LLC +social + +// softbank : 2015-07-02 SoftBank Group Corp. +softbank + +// software : 2014-03-20 Dog Beach, LLC +software + +// sohu : 2013-12-19 Sohu.com Limited +sohu + +// solar : 2013-11-07 Binky Moon, LLC +solar + +// solutions : 2013-11-07 Binky Moon, LLC +solutions + +// song : 2015-02-26 Amazon Registry Services, Inc. +song + +// sony : 2015-01-08 Sony Corporation +sony + +// soy : 2014-01-23 Charleston Road Registry Inc. +soy + +// spa : 2019-09-19 Asia Spa and Wellness Promotion Council Limited +spa + +// space : 2014-04-03 DotSpace Inc. +space + +// sport : 2017-11-16 Global Association of International Sports Federations (GAISF) +sport + +// spot : 2015-02-26 Amazon Registry Services, Inc. +spot + +// spreadbetting : 2014-12-11 Dotspreadbetting Registry Limited +spreadbetting + +// srl : 2015-05-07 InterNetX, Corp +srl + +// stada : 2014-11-13 STADA Arzneimittel AG +stada + +// staples : 2015-07-30 Staples, Inc. +staples + +// star : 2015-01-08 Star India Private Limited +star + +// statebank : 2015-03-12 STATE BANK OF INDIA +statebank + +// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company +statefarm + +// stc : 2014-10-09 Saudi Telecom Company +stc + +// stcgroup : 2014-10-09 Saudi Telecom Company +stcgroup + +// stockholm : 2014-12-18 Stockholms kommun +stockholm + +// storage : 2014-12-22 XYZ.COM LLC +storage + +// store : 2015-04-09 DotStore Inc. +store + +// stream : 2016-01-08 dot Stream Limited +stream + +// studio : 2015-02-11 Dog Beach, LLC +studio + +// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD +study + +// style : 2014-12-04 Binky Moon, LLC +style + +// sucks : 2014-12-22 Vox Populi Registry Ltd. +sucks + +// supplies : 2013-12-19 Binky Moon, LLC +supplies + +// supply : 2013-12-19 Binky Moon, LLC +supply + +// support : 2013-10-24 Binky Moon, LLC +support + +// surf : 2014-01-09 Minds + Machines Group Limited +surf + +// surgery : 2014-03-20 Binky Moon, LLC +surgery + +// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION +suzuki + +// swatch : 2015-01-08 The Swatch Group Ltd +swatch + +// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited +swiftcover + +// swiss : 2014-10-16 Swiss Confederation +swiss + +// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet +sydney + +// symantec : 2014-12-04 Symantec Corporation +symantec + +// systems : 2013-11-07 Binky Moon, LLC +systems + +// tab : 2014-12-04 Tabcorp Holdings Limited +tab + +// taipei : 2014-07-10 Taipei City Government +taipei + +// talk : 2015-04-09 Amazon Registry Services, Inc. +talk + +// taobao : 2015-01-15 Alibaba Group Holding Limited +taobao + +// target : 2015-07-31 Target Domain Holdings, LLC +target + +// tatamotors : 2015-03-12 Tata Motors Ltd +tatamotors + +// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +tatar + +// tattoo : 2013-08-30 Uniregistry, Corp. +tattoo + +// tax : 2014-03-20 Binky Moon, LLC +tax + +// taxi : 2015-03-19 Binky Moon, LLC +taxi + +// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +tci + +// tdk : 2015-06-11 TDK Corporation +tdk + +// team : 2015-03-05 Binky Moon, LLC +team + +// tech : 2015-01-30 Personals TLD Inc. +tech + +// technology : 2013-09-13 Binky Moon, LLC +technology + +// telefonica : 2014-10-16 Telefónica S.A. +telefonica + +// temasek : 2014-08-07 Temasek Holdings (Private) Limited +temasek + +// tennis : 2014-12-04 Binky Moon, LLC +tennis + +// teva : 2015-07-02 Teva Pharmaceutical Industries Limited +teva + +// thd : 2015-04-02 Home Depot Product Authority, LLC +thd + +// theater : 2015-03-19 Binky Moon, LLC +theater + +// theatre : 2015-05-07 XYZ.COM LLC +theatre + +// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America +tiaa + +// tickets : 2015-02-05 Accent Media Limited +tickets + +// tienda : 2013-11-14 Binky Moon, LLC +tienda + +// tiffany : 2015-01-30 Tiffany and Company +tiffany + +// tips : 2013-09-20 Binky Moon, LLC +tips + +// tires : 2014-11-07 Binky Moon, LLC +tires + +// tirol : 2014-04-24 punkt Tirol GmbH +tirol + +// tjmaxx : 2015-07-16 The TJX Companies, Inc. +tjmaxx + +// tjx : 2015-07-16 The TJX Companies, Inc. +tjx + +// tkmaxx : 2015-07-16 The TJX Companies, Inc. +tkmaxx + +// tmall : 2015-01-15 Alibaba Group Holding Limited +tmall + +// today : 2013-09-20 Binky Moon, LLC +today + +// tokyo : 2013-11-13 GMO Registry, Inc. +tokyo + +// tools : 2013-11-21 Binky Moon, LLC +tools + +// top : 2014-03-20 .TOP Registry +top + +// toray : 2014-12-18 Toray Industries, Inc. +toray + +// toshiba : 2014-04-10 TOSHIBA Corporation +toshiba + +// total : 2015-08-06 Total SA +total + +// tours : 2015-01-22 Binky Moon, LLC +tours + +// town : 2014-03-06 Binky Moon, LLC +town + +// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION +toyota + +// toys : 2014-03-06 Binky Moon, LLC +toys + +// trade : 2014-01-23 Elite Registry Limited +trade + +// trading : 2014-12-11 Dottrading Registry Limited +trading + +// training : 2013-11-07 Binky Moon, LLC +training + +// travel : Dog Beach, LLC +travel + +// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +travelchannel + +// travelers : 2015-03-26 Travelers TLD, LLC +travelers + +// travelersinsurance : 2015-03-26 Travelers TLD, LLC +travelersinsurance + +// trust : 2014-10-16 NCC Group Inc. +trust + +// trv : 2015-03-26 Travelers TLD, LLC +trv + +// tube : 2015-06-11 Latin American Telecom LLC +tube + +// tui : 2014-07-03 TUI AG +tui + +// tunes : 2015-02-26 Amazon Registry Services, Inc. +tunes + +// tushu : 2014-12-18 Amazon Registry Services, Inc. +tushu + +// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED +tvs + +// ubank : 2015-08-20 National Australia Bank Limited +ubank + +// ubs : 2014-12-11 UBS AG +ubs + +// unicom : 2015-10-15 China United Network Communications Corporation Limited +unicom + +// university : 2014-03-06 Binky Moon, LLC +university + +// uno : 2013-09-11 DotSite Inc. +uno + +// uol : 2014-05-01 UBN INTERNET LTDA. +uol + +// ups : 2015-06-25 UPS Market Driver, Inc. +ups + +// vacations : 2013-12-05 Binky Moon, LLC +vacations + +// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. +vana + +// vanguard : 2015-09-03 The Vanguard Group, Inc. +vanguard + +// vegas : 2014-01-16 Dot Vegas, Inc. +vegas + +// ventures : 2013-08-27 Binky Moon, LLC +ventures + +// verisign : 2015-08-13 VeriSign, Inc. +verisign + +// versicherung : 2014-03-20 tldbox GmbH +versicherung + +// vet : 2014-03-06 Dog Beach, LLC +vet + +// viajes : 2013-10-17 Binky Moon, LLC +viajes + +// video : 2014-10-16 Dog Beach, LLC +video + +// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +vig + +// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. +viking + +// villas : 2013-12-05 Binky Moon, LLC +villas + +// vin : 2015-06-18 Binky Moon, LLC +vin + +// vip : 2015-01-22 Minds + Machines Group Limited +vip + +// virgin : 2014-09-25 Virgin Enterprises Limited +virgin + +// visa : 2015-07-30 Visa Worldwide Pte. Limited +visa + +// vision : 2013-12-05 Binky Moon, LLC +vision + +// vistaprint : 2014-09-18 Vistaprint Limited +vistaprint + +// viva : 2014-11-07 Saudi Telecom Company +viva + +// vivo : 2015-07-31 Telefonica Brasil S.A. +vivo + +// vlaanderen : 2014-02-06 DNS.be vzw +vlaanderen + +// vodka : 2013-12-19 Minds + Machines Group Limited +vodka + +// volkswagen : 2015-05-14 Volkswagen Group of America Inc. +volkswagen + +// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag +volvo + +// vote : 2013-11-21 Monolith Registry LLC +vote + +// voting : 2013-11-13 Valuetainment Corp. +voting + +// voto : 2013-11-21 Monolith Registry LLC +voto + +// voyage : 2013-08-27 Binky Moon, LLC +voyage + +// vuelos : 2015-03-05 Travel Reservations SRL +vuelos + +// wales : 2014-05-08 Nominet UK +wales + +// walmart : 2015-07-31 Wal-Mart Stores, Inc. +walmart + +// walter : 2014-11-13 Sandvik AB +walter + +// wang : 2013-10-24 Zodiac Wang Limited +wang + +// wanggou : 2014-12-18 Amazon Registry Services, Inc. +wanggou + +// watch : 2013-11-14 Binky Moon, LLC +watch + +// watches : 2014-12-22 Richemont DNS Inc. +watches + +// weather : 2015-01-08 International Business Machines Corporation +weather + +// weatherchannel : 2015-03-12 International Business Machines Corporation +weatherchannel + +// webcam : 2014-01-23 dot Webcam Limited +webcam + +// weber : 2015-06-04 Saint-Gobain Weber SA +weber + +// website : 2014-04-03 DotWebsite Inc. +website + +// wed : 2013-10-01 Atgron, Inc. +wed + +// wedding : 2014-04-24 Minds + Machines Group Limited +wedding + +// weibo : 2015-03-05 Sina Corporation +weibo + +// weir : 2015-01-29 Weir Group IP Limited +weir + +// whoswho : 2014-02-20 Who's Who Registry +whoswho + +// wien : 2013-10-28 punkt.wien GmbH +wien + +// wiki : 2013-11-07 Top Level Design, LLC +wiki + +// williamhill : 2014-03-13 William Hill Organization Limited +williamhill + +// win : 2014-11-20 First Registry Limited +win + +// windows : 2014-12-18 Microsoft Corporation +windows + +// wine : 2015-06-18 Binky Moon, LLC +wine + +// winners : 2015-07-16 The TJX Companies, Inc. +winners + +// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC +wme + +// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. +wolterskluwer + +// woodside : 2015-07-09 Woodside Petroleum Limited +woodside + +// work : 2013-12-19 Minds + Machines Group Limited +work + +// works : 2013-11-14 Binky Moon, LLC +works + +// world : 2014-06-12 Binky Moon, LLC +world + +// wow : 2015-10-08 Amazon Registry Services, Inc. +wow + +// wtc : 2013-12-19 World Trade Centers Association, Inc. +wtc + +// wtf : 2014-03-06 Binky Moon, LLC +wtf + +// xbox : 2014-12-18 Microsoft Corporation +xbox + +// xerox : 2014-10-24 Xerox DNHC LLC +xerox + +// xfinity : 2015-07-09 Comcast IP Holdings I, LLC +xfinity + +// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +xihuan + +// xin : 2014-12-11 Elegant Leader Limited +xin + +// xn--11b4c3d : 2015-01-15 VeriSign Sarl +कॉम + +// xn--1ck2e1b : 2015-02-26 Amazon Registry Services, Inc. +セール + +// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. +佛山 + +// xn--30rr7y : 2014-06-12 Excellent First Limited +慈善 + +// xn--3bst00m : 2013-09-13 Eagle Horizon Limited +集团 + +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED OY +在线 + +// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. +大众汽车 + +// xn--3pxu8k : 2015-01-15 VeriSign Sarl +点看 + +// xn--42c2d9a : 2015-01-15 VeriSign Sarl +คอม + +// xn--45q11c : 2013-11-21 Zodiac Gemini Ltd +八卦 + +// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment +موقع + +// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center +公益 + +// xn--55qx5d : 2013-11-14 China Internet Network Information Center (CNNIC) +公司 + +// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited +香格里拉 + +// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited +网站 + +// xn--6frz82g : 2013-09-23 Afilias Limited +移动 + +// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited +我爱你 + +// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +москва + +// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +католик + +// xn--80asehdb : 2013-07-14 CORE Association +онлайн + +// xn--80aswg : 2013-07-14 CORE Association +сайт + +// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited +联通 + +// xn--9dbq2a : 2015-01-15 VeriSign Sarl +קום + +// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED +时尚 + +// xn--9krt00a : 2015-03-12 Sina Corporation +微博 + +// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited +淡马锡 + +// xn--bck1b9a5dre4c : 2015-02-26 Amazon Registry Services, Inc. +ファッション + +// xn--c1avg : 2013-11-14 Public Interest Registry +орг + +// xn--c2br7g : 2015-01-15 VeriSign Sarl +नेट + +// xn--cck2b3b : 2015-02-26 Amazon Registry Services, Inc. +ストア + +// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD +삼성 + +// xn--czr694b : 2014-01-16 Internet DotTrademark Organisation Limited +商标 + +// xn--czrs0t : 2013-12-19 Binky Moon, LLC +商店 + +// xn--czru2d : 2013-11-21 Zodiac Aquarius Limited +商城 + +// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” +дети + +// xn--eckvdtc9d : 2014-12-18 Amazon Registry Services, Inc. +ポイント + +// xn--efvy88h : 2014-08-22 Guangzhou YU Wei Information Technology Co., Ltd. +新闻 + +// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited +工行 + +// xn--fct429k : 2015-04-09 Amazon Registry Services, Inc. +家電 + +// xn--fhbei : 2015-01-15 VeriSign Sarl +كوم + +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED OY +中文网 + +// xn--fiq64b : 2013-10-14 CITIC Group Corporation +中信 + +// xn--fjq720a : 2014-05-22 Binky Moon, LLC +娱乐 + +// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. +谷歌 + +// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited +電訊盈科 + +// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited +购物 + +// xn--gckr3f0f : 2015-02-26 Amazon Registry Services, Inc. +クラウド + +// xn--gk3at1e : 2015-10-08 Amazon Registry Services, Inc. +通販 + +// xn--hxt814e : 2014-05-15 Zodiac Taurus Limited +网店 + +// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry +संगठन + +// xn--imr513n : 2014-12-11 Internet DotTrademark Organisation Limited +餐厅 + +// xn--io0a7i : 2013-11-14 China Internet Network Information Center (CNNIC) +网络 + +// xn--j1aef : 2015-01-15 VeriSign Sarl +ком + +// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation +诺基亚 + +// xn--jvr189m : 2015-02-26 Amazon Registry Services, Inc. +食品 + +// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. +飞利浦 + +// xn--kpu716f : 2014-12-22 Richemont DNS Inc. +手表 + +// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd +手机 + +// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company +ارامكو + +// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH +العليان + +// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +اتصالات + +// xn--mgbab2bd : 2013-10-31 CORE Association +بازار + +// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre +ابوظبي + +// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +كاثوليك + +// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +همراه + +// xn--mk1bu44c : 2015-01-15 VeriSign Sarl +닷컴 + +// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. +政府 + +// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. +شبكة + +// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House +بيتك + +// xn--ngbrx : 2015-11-12 League of Arab States +عرب + +// xn--nqv7f : 2013-11-14 Public Interest Registry +机构 + +// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry +组织机构 + +// xn--nyqy26a : 2014-11-07 Stable Tone Limited +健康 + +// xn--otu796d : 2017-08-06 Internet DotTrademark Organisation Limited +招聘 + +// xn--p1acf : 2013-12-12 Rusnames Limited +рус + +// xn--pbt977c : 2014-12-22 Richemont DNS Inc. +珠宝 + +// xn--pssy2u : 2015-01-15 VeriSign Sarl +大拿 + +// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. +みんな + +// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. +グーグル + +// xn--rhqv96g : 2013-09-11 Stable Tone Limited +世界 + +// xn--rovu88b : 2015-02-26 Amazon Registry Services, Inc. +書籍 + +// xn--ses554g : 2014-01-16 KNET Co., Ltd. +网址 + +// xn--t60b56a : 2015-01-15 VeriSign Sarl +닷넷 + +// xn--tckwe : 2015-01-15 VeriSign Sarl +コム + +// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +天主教 + +// xn--unup4y : 2013-07-14 Binky Moon, LLC +游戏 + +// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberater + +// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberatung + +// xn--vhquv : 2013-08-27 Binky Moon, LLC +企业 + +// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. +信息 + +// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited +嘉里大酒店 + +// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited +嘉里 + +// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. +广东 + +// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center +政务 + +// xyz : 2013-12-05 XYZ.COM LLC +xyz + +// yachts : 2014-01-09 DERYachts, LLC +yachts + +// yahoo : 2015-04-02 Yahoo! Domain Services Inc. +yahoo + +// yamaxun : 2014-12-18 Amazon Registry Services, Inc. +yamaxun + +// yandex : 2014-04-10 YANDEX, LLC +yandex + +// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +yodobashi + +// yoga : 2014-05-29 Minds + Machines Group Limited +yoga + +// yokohama : 2013-12-12 GMO Registry, Inc. +yokohama + +// you : 2015-04-09 Amazon Registry Services, Inc. +you + +// youtube : 2014-05-01 Charleston Road Registry Inc. +youtube + +// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +yun + +// zappos : 2015-06-25 Amazon Registry Services, Inc. +zappos + +// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) +zara + +// zero : 2014-12-18 Amazon Registry Services, Inc. +zero + +// zip : 2014-05-08 Charleston Road Registry Inc. +zip + +// zone : 2013-11-14 Binky Moon, LLC +zone + +// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) +zuerich + + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== +// (Note: these are in alphabetical order by company name) + +// This one actually does not exist, added for testing purposes +delusionalinsanity.am + +// 1GB LLC : https://www.1gb.ua/ +// Submitted by 1GB LLC <noc@1gb.com.ua> +cc.ua +inf.ua +ltd.ua + +// Agnat sp. z o.o. : https://domena.pl +// Submitted by Przemyslaw Plewa <it-admin@domena.pl> +beep.pl + +// alboto.ca : http://alboto.ca +// Submitted by Anton Avramov <avramov@alboto.ca> +barsy.ca + +// Alces Software Ltd : http://alces-software.com +// Submitted by Mark J. Titorenko <mark.titorenko@alces-software.com> +*.compute.estate +*.alces.network + +// Altervista: https://www.altervista.org +// Submitted by Carlo Cannas <tech_staff@altervista.it> +altervista.org + +// alwaysdata : https://www.alwaysdata.com +// Submitted by Cyril <admin@alwaysdata.com> +alwaysdata.net + +// Amazon CloudFront : https://aws.amazon.com/cloudfront/ +// Submitted by Donavan Miller <donavanm@amazon.com> +cloudfront.net + +// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +*.compute.amazonaws.com +*.compute-1.amazonaws.com +*.compute.amazonaws.com.cn +us-east-1.amazonaws.com + +// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +cn-north-1.eb.amazonaws.com.cn +cn-northwest-1.eb.amazonaws.com.cn +elasticbeanstalk.com +ap-northeast-1.elasticbeanstalk.com +ap-northeast-2.elasticbeanstalk.com +ap-northeast-3.elasticbeanstalk.com +ap-south-1.elasticbeanstalk.com +ap-southeast-1.elasticbeanstalk.com +ap-southeast-2.elasticbeanstalk.com +ca-central-1.elasticbeanstalk.com +eu-central-1.elasticbeanstalk.com +eu-west-1.elasticbeanstalk.com +eu-west-2.elasticbeanstalk.com +eu-west-3.elasticbeanstalk.com +sa-east-1.elasticbeanstalk.com +us-east-1.elasticbeanstalk.com +us-east-2.elasticbeanstalk.com +us-gov-west-1.elasticbeanstalk.com +us-west-1.elasticbeanstalk.com +us-west-2.elasticbeanstalk.com + +// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +*.elb.amazonaws.com +*.elb.amazonaws.com.cn + +// Amazon S3 : https://aws.amazon.com/s3/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +s3.amazonaws.com +s3-ap-northeast-1.amazonaws.com +s3-ap-northeast-2.amazonaws.com +s3-ap-south-1.amazonaws.com +s3-ap-southeast-1.amazonaws.com +s3-ap-southeast-2.amazonaws.com +s3-ca-central-1.amazonaws.com +s3-eu-central-1.amazonaws.com +s3-eu-west-1.amazonaws.com +s3-eu-west-2.amazonaws.com +s3-eu-west-3.amazonaws.com +s3-external-1.amazonaws.com +s3-fips-us-gov-west-1.amazonaws.com +s3-sa-east-1.amazonaws.com +s3-us-gov-west-1.amazonaws.com +s3-us-east-2.amazonaws.com +s3-us-west-1.amazonaws.com +s3-us-west-2.amazonaws.com +s3.ap-northeast-2.amazonaws.com +s3.ap-south-1.amazonaws.com +s3.cn-north-1.amazonaws.com.cn +s3.ca-central-1.amazonaws.com +s3.eu-central-1.amazonaws.com +s3.eu-west-2.amazonaws.com +s3.eu-west-3.amazonaws.com +s3.us-east-2.amazonaws.com +s3.dualstack.ap-northeast-1.amazonaws.com +s3.dualstack.ap-northeast-2.amazonaws.com +s3.dualstack.ap-south-1.amazonaws.com +s3.dualstack.ap-southeast-1.amazonaws.com +s3.dualstack.ap-southeast-2.amazonaws.com +s3.dualstack.ca-central-1.amazonaws.com +s3.dualstack.eu-central-1.amazonaws.com +s3.dualstack.eu-west-1.amazonaws.com +s3.dualstack.eu-west-2.amazonaws.com +s3.dualstack.eu-west-3.amazonaws.com +s3.dualstack.sa-east-1.amazonaws.com +s3.dualstack.us-east-1.amazonaws.com +s3.dualstack.us-east-2.amazonaws.com +s3-website-us-east-1.amazonaws.com +s3-website-us-west-1.amazonaws.com +s3-website-us-west-2.amazonaws.com +s3-website-ap-northeast-1.amazonaws.com +s3-website-ap-southeast-1.amazonaws.com +s3-website-ap-southeast-2.amazonaws.com +s3-website-eu-west-1.amazonaws.com +s3-website-sa-east-1.amazonaws.com +s3-website.ap-northeast-2.amazonaws.com +s3-website.ap-south-1.amazonaws.com +s3-website.ca-central-1.amazonaws.com +s3-website.eu-central-1.amazonaws.com +s3-website.eu-west-2.amazonaws.com +s3-website.eu-west-3.amazonaws.com +s3-website.us-east-2.amazonaws.com + +// Amune : https://amune.org/ +// Submitted by Team Amune <cert@amune.org> +t3l3p0rt.net +tele.amune.org + +// Apigee : https://apigee.com/ +// Submitted by Apigee Security Team <security@apigee.com> +apigee.io + +// Aptible : https://www.aptible.com/ +// Submitted by Thomas Orozco <thomas@aptible.com> +on-aptible.com + +// ASEINet : https://www.aseinet.com/ +// Submitted by Asei SEKIGUCHI <mail@aseinet.com> +user.aseinet.ne.jp +gv.vc +d.gv.vc + +// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ +// Submitted by Hector Martin <marcan@euskalencounter.org> +user.party.eus + +// Association potager.org : https://potager.org/ +// Submitted by Lunar <jardiniers@potager.org> +pimienta.org +poivron.org +potager.org +sweetpepper.org + +// ASUSTOR Inc. : http://www.asustor.com +// Submitted by Vincent Tseng <vincenttseng@asustor.com> +myasustor.com + +// AVM : https://avm.de +// Submitted by Andreas Weise <a.weise@avm.de> +myfritz.net + +// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com +// Submitted by James Kennedy <domains@advisorwebsites.com> +*.awdev.ca +*.advisor.ws + +// b-data GmbH : https://www.b-data.io +// Submitted by Olivier Benz <olivier.benz@b-data.ch> +b-data.io + +// backplane : https://www.backplane.io +// Submitted by Anthony Voutas <anthony@backplane.io> +backplaneapp.io + +// Balena : https://www.balena.io +// Submitted by Petros Angelatos <petrosagg@balena.io> +balena-devices.com + +// Banzai Cloud +// Submitted by Gabor Kozma <info@banzaicloud.com> +app.banzaicloud.io + +// BetaInABox +// Submitted by Adrian <adrian@betainabox.com> +betainabox.com + +// BinaryLane : http://www.binarylane.com +// Submitted by Nathan O'Sullivan <nathan@mammoth.com.au> +bnr.la + +// Blackbaud, Inc. : https://www.blackbaud.com +// Submitted by Paul Crowder <paul.crowder@blackbaud.com> +blackbaudcdn.net + +// Boomla : https://boomla.com +// Submitted by Tibor Halter <thalter@boomla.com> +boomla.net + +// Boxfuse : https://boxfuse.com +// Submitted by Axel Fontaine <axel@boxfuse.com> +boxfuse.io + +// bplaced : https://www.bplaced.net/ +// Submitted by Miroslav Bozic <security@bplaced.net> +square7.ch +bplaced.com +bplaced.de +square7.de +bplaced.net +square7.net + +// BrowserSafetyMark +// Submitted by Dave Tharp <browsersafetymark.io@quicinc.com> +browsersafetymark.io + +// Bytemark Hosting : https://www.bytemark.co.uk +// Submitted by Paul Cammish <paul.cammish@bytemark.co.uk> +uk0.bigv.io +dh.bytemark.co.uk +vm.bytemark.co.uk + +// callidomus : https://www.callidomus.com/ +// Submitted by Marcus Popp <admin@callidomus.com> +mycd.eu + +// Carrd : https://carrd.co +// Submitted by AJ <aj@carrd.co> +carrd.co +crd.co +uwu.ai + +// CentralNic : http://www.centralnic.com/names/domains +// Submitted by registry <gavin.brown@centralnic.com> +ae.org +ar.com +br.com +cn.com +com.de +com.se +de.com +eu.com +gb.com +gb.net +hu.com +hu.net +jp.net +jpn.com +kr.com +mex.com +no.com +qc.com +ru.com +sa.com +se.net +uk.com +uk.net +us.com +uy.com +za.bz +za.com + +// Africa.com Web Solutions Ltd : https://registry.africa.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +africa.com + +// iDOT Services Limited : http://www.domain.gr.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +gr.com + +// Radix FZC : http://domains.in.net +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +in.net + +// US REGISTRY LLC : http://us.org +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +us.org + +// co.com Registry, LLC : https://registry.co.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +co.com + +// c.la : http://www.c.la/ +c.la + +// certmgr.org : https://certmgr.org +// Submitted by B. Blechschmidt <hostmaster@certmgr.org> +certmgr.org + +// Citrix : https://citrix.com +// Submitted by Alex Stoddard <alex.stoddard@citrix.com> +xenapponazure.com + +// Civilized Discourse Construction Kit, Inc. : https://www.discourse.org/ +// Submitted by Rishabh Nambiar <rishabh.nambiar@discourse.org> +discourse.group + +// ClearVox : http://www.clearvox.nl/ +// Submitted by Leon Rowland <leon@clearvox.nl> +virtueeldomein.nl + +// Clever Cloud : https://www.clever-cloud.com/ +// Submitted by Quentin Adam <noc@clever-cloud.com> +cleverapps.io + +// Clerk : https://www.clerk.dev +// Submitted by Colin Sidoti <colin@clerk.dev> +*.lcl.dev +*.stg.dev + +// Cloud66 : https://www.cloud66.com/ +// Submitted by Khash Sajadi <khash@cloud66.com> +c66.me +cloud66.ws +cloud66.zone + +// CloudAccess.net : https://www.cloudaccess.net/ +// Submitted by Pawel Panek <noc@cloudaccess.net> +jdevcloud.com +wpdevcloud.com +cloudaccess.host +freesite.host +cloudaccess.net + +// cloudControl : https://www.cloudcontrol.com/ +// Submitted by Tobias Wilken <tw@cloudcontrol.com> +cloudcontrolled.com +cloudcontrolapp.com + +// Cloudera, Inc. : https://www.cloudera.com/ +// Submitted by Philip Langdale <security@cloudera.com> +cloudera.site + +// Cloudflare, Inc. : https://www.cloudflare.com/ +// Submitted by Jake Riesterer <publicsuffixlist@cloudflare.com> +trycloudflare.com +workers.dev + +// Clovyr : https://clovyr.io +// Submitted by Patrick Nielsen <patrick@clovyr.io> +wnext.app + +// co.ca : http://registry.co.ca/ +co.ca + +// Co & Co : https://co-co.nl/ +// Submitted by Govert Versluis <govert@co-co.nl> +*.otap.co + +// i-registry s.r.o. : http://www.i-registry.cz/ +// Submitted by Martin Semrad <semrad@i-registry.cz> +co.cz + +// CDN77.com : http://www.cdn77.com +// Submitted by Jan Krpes <jan.krpes@cdn77.com> +c.cdn77.org +cdn77-ssl.net +r.cdn77.net +rsc.cdn77.org +ssl.origin.cdn77-secure.org + +// Cloud DNS Ltd : http://www.cloudns.net +// Submitted by Aleksander Hristov <noc@cloudns.net> +cloudns.asia +cloudns.biz +cloudns.club +cloudns.cc +cloudns.eu +cloudns.in +cloudns.info +cloudns.org +cloudns.pro +cloudns.pw +cloudns.us + +// Cloudeity Inc : https://cloudeity.com +// Submitted by Stefan Dimitrov <contact@cloudeity.com> +cloudeity.net + +// CNPY : https://cnpy.gdn +// Submitted by Angelo Gladding <angelo@lahacker.net> +cnpy.gdn + +// CoDNS B.V. +co.nl +co.no + +// Combell.com : https://www.combell.com +// Submitted by Thomas Wouters <thomas.wouters@combellgroup.com> +webhosting.be +hosting-cluster.nl + +// COSIMO GmbH : http://www.cosimo.de +// Submitted by Rene Marticke <rmarticke@cosimo.de> +dyn.cosidns.de +dynamisches-dns.de +dnsupdater.de +internet-dns.de +l-o-g-i-n.de +dynamic-dns.info +feste-ip.net +knx-server.net +static-access.net + +// Craynic, s.r.o. : http://www.craynic.com/ +// Submitted by Ales Krajnik <ales.krajnik@craynic.com> +realm.cz + +// Cryptonomic : https://cryptonomic.net/ +// Submitted by Andrew Cady <public-suffix-list@cryptonomic.net> +*.cryptonomic.net + +// Cupcake : https://cupcake.io/ +// Submitted by Jonathan Rudenberg <jonathan@cupcake.io> +cupcake.is + +// cyon GmbH : https://www.cyon.ch/ +// Submitted by Dominic Luechinger <dol@cyon.ch> +cyon.link +cyon.site + +// Daplie, Inc : https://daplie.com +// Submitted by AJ ONeal <aj@daplie.com> +daplie.me +localhost.daplie.me + +// Datto, Inc. : https://www.datto.com/ +// Submitted by Philipp Heckel <ph@datto.com> +dattolocal.com +dattorelay.com +dattoweb.com +mydatto.com +dattolocal.net +mydatto.net + +// Dansk.net : http://www.dansk.net/ +// Submitted by Anani Voule <digital@digital.co.dk> +biz.dk +co.dk +firm.dk +reg.dk +store.dk + +// dapps.earth : https://dapps.earth/ +// Submitted by Daniil Burdakov <icqkill@gmail.com> +*.dapps.earth +*.bzz.dapps.earth + +// Debian : https://www.debian.org/ +// Submitted by Peter Palfrader / Debian Sysadmin Team <dsa-publicsuffixlist@debian.org> +debian.net + +// deSEC : https://desec.io/ +// Submitted by Peter Thomassen <peter@desec.io> +dedyn.io + +// DNShome : https://www.dnshome.de/ +// Submitted by Norbert Auler <mail@dnshome.de> +dnshome.de + +// DotArai : https://www.dotarai.com/ +// Submitted by Atsadawat Netcharadsang <atsadawat@dotarai.co.th> +online.th +shop.th + +// DrayTek Corp. : https://www.draytek.com/ +// Submitted by Paul Fang <mis@draytek.com> +drayddns.com + +// DreamHost : http://www.dreamhost.com/ +// Submitted by Andrew Farmer <andrew.farmer@dreamhost.com> +dreamhosters.com + +// Drobo : http://www.drobo.com/ +// Submitted by Ricardo Padilha <rpadilha@drobo.com> +mydrobo.com + +// Drud Holdings, LLC. : https://www.drud.com/ +// Submitted by Kevin Bridges <kevin@drud.com> +drud.io +drud.us + +// DuckDNS : http://www.duckdns.org/ +// Submitted by Richard Harper <richard@duckdns.org> +duckdns.org + +// dy.fi : http://dy.fi/ +// Submitted by Heikki Hannikainen <hessu@hes.iki.fi> +dy.fi +tunk.org + +// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ +dyndns-at-home.com +dyndns-at-work.com +dyndns-blog.com +dyndns-free.com +dyndns-home.com +dyndns-ip.com +dyndns-mail.com +dyndns-office.com +dyndns-pics.com +dyndns-remote.com +dyndns-server.com +dyndns-web.com +dyndns-wiki.com +dyndns-work.com +dyndns.biz +dyndns.info +dyndns.org +dyndns.tv +at-band-camp.net +ath.cx +barrel-of-knowledge.info +barrell-of-knowledge.info +better-than.tv +blogdns.com +blogdns.net +blogdns.org +blogsite.org +boldlygoingnowhere.org +broke-it.net +buyshouses.net +cechire.com +dnsalias.com +dnsalias.net +dnsalias.org +dnsdojo.com +dnsdojo.net +dnsdojo.org +does-it.net +doesntexist.com +doesntexist.org +dontexist.com +dontexist.net +dontexist.org +doomdns.com +doomdns.org +dvrdns.org +dyn-o-saur.com +dynalias.com +dynalias.net +dynalias.org +dynathome.net +dyndns.ws +endofinternet.net +endofinternet.org +endoftheinternet.org +est-a-la-maison.com +est-a-la-masion.com +est-le-patron.com +est-mon-blogueur.com +for-better.biz +for-more.biz +for-our.info +for-some.biz +for-the.biz +forgot.her.name +forgot.his.name +from-ak.com +from-al.com +from-ar.com +from-az.net +from-ca.com +from-co.net +from-ct.com +from-dc.com +from-de.com +from-fl.com +from-ga.com +from-hi.com +from-ia.com +from-id.com +from-il.com +from-in.com +from-ks.com +from-ky.com +from-la.net +from-ma.com +from-md.com +from-me.org +from-mi.com +from-mn.com +from-mo.com +from-ms.com +from-mt.com +from-nc.com +from-nd.com +from-ne.com +from-nh.com +from-nj.com +from-nm.com +from-nv.com +from-ny.net +from-oh.com +from-ok.com +from-or.com +from-pa.com +from-pr.com +from-ri.com +from-sc.com +from-sd.com +from-tn.com +from-tx.com +from-ut.com +from-va.com +from-vt.com +from-wa.com +from-wi.com +from-wv.com +from-wy.com +ftpaccess.cc +fuettertdasnetz.de +game-host.org +game-server.cc +getmyip.com +gets-it.net +go.dyndns.org +gotdns.com +gotdns.org +groks-the.info +groks-this.info +ham-radio-op.net +here-for-more.info +hobby-site.com +hobby-site.org +home.dyndns.org +homedns.org +homeftp.net +homeftp.org +homeip.net +homelinux.com +homelinux.net +homelinux.org +homeunix.com +homeunix.net +homeunix.org +iamallama.com +in-the-band.net +is-a-anarchist.com +is-a-blogger.com +is-a-bookkeeper.com +is-a-bruinsfan.org +is-a-bulls-fan.com +is-a-candidate.org +is-a-caterer.com +is-a-celticsfan.org +is-a-chef.com +is-a-chef.net +is-a-chef.org +is-a-conservative.com +is-a-cpa.com +is-a-cubicle-slave.com +is-a-democrat.com +is-a-designer.com +is-a-doctor.com +is-a-financialadvisor.com +is-a-geek.com +is-a-geek.net +is-a-geek.org +is-a-green.com +is-a-guru.com +is-a-hard-worker.com +is-a-hunter.com +is-a-knight.org +is-a-landscaper.com +is-a-lawyer.com +is-a-liberal.com +is-a-libertarian.com +is-a-linux-user.org +is-a-llama.com +is-a-musician.com +is-a-nascarfan.com +is-a-nurse.com +is-a-painter.com +is-a-patsfan.org +is-a-personaltrainer.com +is-a-photographer.com +is-a-player.com +is-a-republican.com +is-a-rockstar.com +is-a-socialist.com +is-a-soxfan.org +is-a-student.com +is-a-teacher.com +is-a-techie.com +is-a-therapist.com +is-an-accountant.com +is-an-actor.com +is-an-actress.com +is-an-anarchist.com +is-an-artist.com +is-an-engineer.com +is-an-entertainer.com +is-by.us +is-certified.com +is-found.org +is-gone.com +is-into-anime.com +is-into-cars.com +is-into-cartoons.com +is-into-games.com +is-leet.com +is-lost.org +is-not-certified.com +is-saved.org +is-slick.com +is-uberleet.com +is-very-bad.org +is-very-evil.org +is-very-good.org +is-very-nice.org +is-very-sweet.org +is-with-theband.com +isa-geek.com +isa-geek.net +isa-geek.org +isa-hockeynut.com +issmarterthanyou.com +isteingeek.de +istmein.de +kicks-ass.net +kicks-ass.org +knowsitall.info +land-4-sale.us +lebtimnetz.de +leitungsen.de +likes-pie.com +likescandy.com +merseine.nu +mine.nu +misconfused.org +mypets.ws +myphotos.cc +neat-url.com +office-on-the.net +on-the-web.tv +podzone.net +podzone.org +readmyblog.org +saves-the-whales.com +scrapper-site.net +scrapping.cc +selfip.biz +selfip.com +selfip.info +selfip.net +selfip.org +sells-for-less.com +sells-for-u.com +sells-it.net +sellsyourhome.org +servebbs.com +servebbs.net +servebbs.org +serveftp.net +serveftp.org +servegame.org +shacknet.nu +simple-url.com +space-to-rent.com +stuff-4-sale.org +stuff-4-sale.us +teaches-yoga.com +thruhere.net +traeumtgerade.de +webhop.biz +webhop.info +webhop.net +webhop.org +worse-than.tv +writesthisblog.com + +// ddnss.de : https://www.ddnss.de/ +// Submitted by Robert Niedziela <webmaster@ddnss.de> +ddnss.de +dyn.ddnss.de +dyndns.ddnss.de +dyndns1.de +dyn-ip24.de +home-webserver.de +dyn.home-webserver.de +myhome-server.de +ddnss.org + +// Definima : http://www.definima.com/ +// Submitted by Maxence Bitterli <maxence@definima.com> +definima.net +definima.io + +// dnstrace.pro : https://dnstrace.pro/ +// Submitted by Chris Partridge <chris@partridge.tech> +bci.dnstrace.pro + +// Dynu.com : https://www.dynu.com/ +// Submitted by Sue Ye <sue@dynu.com> +ddnsfree.com +ddnsgeek.com +giize.com +gleeze.com +kozow.com +loseyourip.com +ooguy.com +theworkpc.com +casacam.net +dynu.net +accesscam.org +camdvr.org +freeddns.org +mywire.org +webredirect.org +myddns.rocks +blogsite.xyz + +// dynv6 : https://dynv6.com +// Submitted by Dominik Menke <dom@digineo.de> +dynv6.net + +// E4YOU spol. s.r.o. : https://e4you.cz/ +// Submitted by Vladimir Dudr <info@e4you.cz> +e4.cz + +// Enalean SAS: https://www.enalean.com +// Submitted by Thomas Cottier <thomas.cottier@enalean.com> +mytuleap.com + +// ECG Robotics, Inc: https://ecgrobotics.org +// Submitted by <frc1533@ecgrobotics.org> +onred.one +staging.onred.one + +// Enonic : http://enonic.com/ +// Submitted by Erik Kaareng-Sunde <esu@enonic.com> +enonic.io +customer.enonic.io + +// EU.org https://eu.org/ +// Submitted by Pierre Beyssac <hostmaster@eu.org> +eu.org +al.eu.org +asso.eu.org +at.eu.org +au.eu.org +be.eu.org +bg.eu.org +ca.eu.org +cd.eu.org +ch.eu.org +cn.eu.org +cy.eu.org +cz.eu.org +de.eu.org +dk.eu.org +edu.eu.org +ee.eu.org +es.eu.org +fi.eu.org +fr.eu.org +gr.eu.org +hr.eu.org +hu.eu.org +ie.eu.org +il.eu.org +in.eu.org +int.eu.org +is.eu.org +it.eu.org +jp.eu.org +kr.eu.org +lt.eu.org +lu.eu.org +lv.eu.org +mc.eu.org +me.eu.org +mk.eu.org +mt.eu.org +my.eu.org +net.eu.org +ng.eu.org +nl.eu.org +no.eu.org +nz.eu.org +paris.eu.org +pl.eu.org +pt.eu.org +q-a.eu.org +ro.eu.org +ru.eu.org +se.eu.org +si.eu.org +sk.eu.org +tr.eu.org +uk.eu.org +us.eu.org + +// Evennode : http://www.evennode.com/ +// Submitted by Michal Kralik <support@evennode.com> +eu-1.evennode.com +eu-2.evennode.com +eu-3.evennode.com +eu-4.evennode.com +us-1.evennode.com +us-2.evennode.com +us-3.evennode.com +us-4.evennode.com + +// eDirect Corp. : https://hosting.url.com.tw/ +// Submitted by C.S. chang <cschang@corp.url.com.tw> +twmail.cc +twmail.net +twmail.org +mymailer.com.tw +url.tw + +// Facebook, Inc. +// Submitted by Peter Ruibal <public-suffix@fb.com> +apps.fbsbx.com + +// FAITID : https://faitid.org/ +// Submitted by Maxim Alzoba <tech.contact@faitid.org> +// https://www.flexireg.net/stat_info +ru.net +adygeya.ru +bashkiria.ru +bir.ru +cbg.ru +com.ru +dagestan.ru +grozny.ru +kalmykia.ru +kustanai.ru +marine.ru +mordovia.ru +msk.ru +mytis.ru +nalchik.ru +nov.ru +pyatigorsk.ru +spb.ru +vladikavkaz.ru +vladimir.ru +abkhazia.su +adygeya.su +aktyubinsk.su +arkhangelsk.su +armenia.su +ashgabad.su +azerbaijan.su +balashov.su +bashkiria.su +bryansk.su +bukhara.su +chimkent.su +dagestan.su +east-kazakhstan.su +exnet.su +georgia.su +grozny.su +ivanovo.su +jambyl.su +kalmykia.su +kaluga.su +karacol.su +karaganda.su +karelia.su +khakassia.su +krasnodar.su +kurgan.su +kustanai.su +lenug.su +mangyshlak.su +mordovia.su +msk.su +murmansk.su +nalchik.su +navoi.su +north-kazakhstan.su +nov.su +obninsk.su +penza.su +pokrovsk.su +sochi.su +spb.su +tashkent.su +termez.su +togliatti.su +troitsk.su +tselinograd.su +tula.su +tuva.su +vladikavkaz.su +vladimir.su +vologda.su + +// Fancy Bits, LLC : http://getchannels.com +// Submitted by Aman Gupta <aman@getchannels.com> +channelsdvr.net + +// Fastly Inc. : http://www.fastly.com/ +// Submitted by Fastly Security <security@fastly.com> +fastly-terrarium.com +fastlylb.net +map.fastlylb.net +freetls.fastly.net +map.fastly.net +a.prod.fastly.net +global.prod.fastly.net +a.ssl.fastly.net +b.ssl.fastly.net +global.ssl.fastly.net + +// FASTVPS EESTI OU : https://fastvps.ru/ +// Submitted by Likhachev Vasiliy <lihachev@fastvps.ru> +fastpanel.direct +fastvps-server.com + +// Featherhead : https://featherhead.xyz/ +// Submitted by Simon Menke <simon@featherhead.xyz> +fhapp.xyz + +// Fedora : https://fedoraproject.org/ +// submitted by Patrick Uiterwijk <puiterwijk@fedoraproject.org> +fedorainfracloud.org +fedorapeople.org +cloud.fedoraproject.org +app.os.fedoraproject.org +app.os.stg.fedoraproject.org + +// Fermax : https://fermax.com/ +// submitted by Koen Van Isterdael <k.vanisterdael@fermax.be> +mydobiss.com + +// Filegear Inc. : https://www.filegear.com +// Submitted by Jason Zhu <jason@owtware.com> +filegear.me +filegear-au.me +filegear-de.me +filegear-gb.me +filegear-ie.me +filegear-jp.me +filegear-sg.me + +// Firebase, Inc. +// Submitted by Chris Raynor <chris@firebase.com> +firebaseapp.com + +// Flynn : https://flynn.io +// Submitted by Jonathan Rudenberg <jonathan@flynn.io> +flynnhub.com +flynnhosting.net + +// Freebox : http://www.freebox.fr +// Submitted by Romain Fliedel <rfliedel@freebox.fr> +freebox-os.com +freeboxos.com +fbx-os.fr +fbxos.fr +freebox-os.fr +freeboxos.fr + +// freedesktop.org : https://www.freedesktop.org +// Submitted by Daniel Stone <daniel@fooishbar.org> +freedesktop.org + +// Futureweb OG : http://www.futureweb.at +// Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at> +*.futurecms.at +*.ex.futurecms.at +*.in.futurecms.at +futurehosting.at +futuremailing.at +*.ex.ortsinfo.at +*.kunden.ortsinfo.at +*.statics.cloud + +// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains +// Submitted by David Illsley <david.illsley@digital.cabinet-office.gov.uk> +service.gov.uk + +// Gehirn Inc. : https://www.gehirn.co.jp/ +// Submitted by Kohei YOSHIDA <tech@gehirn.co.jp> +gehirn.ne.jp +usercontent.jp + +// Gentlent, Limited : https://www.gentlent.com +// Submitted by Tom Klein <tklein@gentlent.com> +lab.ms + +// GitHub, Inc. +// Submitted by Patrick Toomey <security@github.com> +github.io +githubusercontent.com + +// GitLab, Inc. +// Submitted by Alex Hanselka <alex@gitlab.com> +gitlab.io + +// Glitch, Inc : https://glitch.com +// Submitted by Mads Hartmann <mads@glitch.com> +glitch.me + +// GMO Pepabo, Inc. : https://pepabo.com/ +// Submitted by dojineko <admin@pepabo.com> +lolipop.io + +// GOV.UK Platform as a Service : https://www.cloud.service.gov.uk/ +// Submitted by Tom Whitwell <tom.whitwell@digital.cabinet-office.gov.uk> +cloudapps.digital +london.cloudapps.digital + +// UKHomeOffice : https://www.gov.uk/government/organisations/home-office +// Submitted by Jon Shanks <jon.shanks@digital.homeoffice.gov.uk> +homeoffice.gov.uk + +// GlobeHosting, Inc. +// Submitted by Zoltan Egresi <egresi@globehosting.com> +ro.im +shop.ro + +// GoIP DNS Services : http://www.goip.de +// Submitted by Christian Poulter <milchstrasse@goip.de> +goip.de + +// Google, Inc. +// Submitted by Eduardo Vela <evn@google.com> +run.app +a.run.app +web.app +*.0emm.com +appspot.com +blogspot.ae +blogspot.al +blogspot.am +blogspot.ba +blogspot.be +blogspot.bg +blogspot.bj +blogspot.ca +blogspot.cf +blogspot.ch +blogspot.cl +blogspot.co.at +blogspot.co.id +blogspot.co.il +blogspot.co.ke +blogspot.co.nz +blogspot.co.uk +blogspot.co.za +blogspot.com +blogspot.com.ar +blogspot.com.au +blogspot.com.br +blogspot.com.by +blogspot.com.co +blogspot.com.cy +blogspot.com.ee +blogspot.com.eg +blogspot.com.es +blogspot.com.mt +blogspot.com.ng +blogspot.com.tr +blogspot.com.uy +blogspot.cv +blogspot.cz +blogspot.de +blogspot.dk +blogspot.fi +blogspot.fr +blogspot.gr +blogspot.hk +blogspot.hr +blogspot.hu +blogspot.ie +blogspot.in +blogspot.is +blogspot.it +blogspot.jp +blogspot.kr +blogspot.li +blogspot.lt +blogspot.lu +blogspot.md +blogspot.mk +blogspot.mr +blogspot.mx +blogspot.my +blogspot.nl +blogspot.no +blogspot.pe +blogspot.pt +blogspot.qa +blogspot.re +blogspot.ro +blogspot.rs +blogspot.ru +blogspot.se +blogspot.sg +blogspot.si +blogspot.sk +blogspot.sn +blogspot.td +blogspot.tw +blogspot.ug +blogspot.vn +cloudfunctions.net +cloud.goog +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +publishproxy.com +withgoogle.com +withyoutube.com + +// Hakaran group: http://hakaran.cz +// Submited by Arseniy Sokolov <security@hakaran.cz> +fin.ci +free.hr +caa.li +ua.rs +conf.se + +// Handshake : https://handshake.org +// Submitted by Mike Damm <md@md.vc> +hs.zone +hs.run + +// Hashbang : https://hashbang.sh +hashbang.sh + +// Hasura : https://hasura.io +// Submitted by Shahidh K Muhammed <shahidh@hasura.io> +hasura.app +hasura-app.io + +// Hepforge : https://www.hepforge.org +// Submitted by David Grellscheid <admin@hepforge.org> +hepforge.org + +// Heroku : https://www.heroku.com/ +// Submitted by Tom Maher <tmaher@heroku.com> +herokuapp.com +herokussl.com + +// Hibernating Rhinos +// Submitted by Oren Eini <oren@ravendb.net> +myravendb.com +ravendb.community +ravendb.me +development.run +ravendb.run + +// HOSTBIP REGISTRY : https://www.hostbip.com/ +// Submitted by Atanunu Igbunuroghene <publicsuffixlist@hostbip.com> +bpl.biz +orx.biz +ng.city +biz.gl +ng.ink +col.ng +firm.ng +gen.ng +ltd.ng +ng.school +sch.so + +// Häkkinen.fi +// Submitted by Eero Häkkinen <Eero+psl@Häkkinen.fi> +häkkinen.fi + +// Ici la Lune : http://www.icilalune.com/ +// Submitted by Simon Morvan <simon@icilalune.com> +*.moonscale.io +moonscale.net + +// iki.fi +// Submitted by Hannu Aronsson <haa@iki.fi> +iki.fi + +// Individual Network Berlin e.V. : https://www.in-berlin.de/ +// Submitted by Christian Seitz <chris@in-berlin.de> +dyn-berlin.de +in-berlin.de +in-brb.de +in-butter.de +in-dsl.de +in-dsl.net +in-dsl.org +in-vpn.de +in-vpn.net +in-vpn.org + +// info.at : http://www.info.at/ +biz.at +info.at + +// info.cx : http://info.cx +// Submitted by Jacob Slater <whois@igloo.to> +info.cx + +// Interlegis : http://www.interlegis.leg.br +// Submitted by Gabriel Ferreira <registrobr@interlegis.leg.br> +ac.leg.br +al.leg.br +am.leg.br +ap.leg.br +ba.leg.br +ce.leg.br +df.leg.br +es.leg.br +go.leg.br +ma.leg.br +mg.leg.br +ms.leg.br +mt.leg.br +pa.leg.br +pb.leg.br +pe.leg.br +pi.leg.br +pr.leg.br +rj.leg.br +rn.leg.br +ro.leg.br +rr.leg.br +rs.leg.br +sc.leg.br +se.leg.br +sp.leg.br +to.leg.br + +// intermetrics GmbH : https://pixolino.com/ +// Submitted by Wolfgang Schwarz <admin@intermetrics.de> +pixolino.com + +// IPiFony Systems, Inc. : https://www.ipifony.com/ +// Submitted by Matthew Hardeman <mhardeman@ipifony.com> +ipifony.net + +// IServ GmbH : https://iserv.eu +// Submitted by Kim-Alexander Brodowski <kim.brodowski@iserv.eu> +mein-iserv.de +test-iserv.de +iserv.dev + +// I-O DATA DEVICE, INC. : http://www.iodata.com/ +// Submitted by Yuji Minagawa <domains-admin@iodata.jp> +iobb.net + +// Jino : https://www.jino.ru +// Submitted by Sergey Ulyashin <ulyashin@jino.ru> +myjino.ru +*.hosting.myjino.ru +*.landing.myjino.ru +*.spectrum.myjino.ru +*.vps.myjino.ru + +// Joyent : https://www.joyent.com/ +// Submitted by Brian Bennett <brian.bennett@joyent.com> +*.triton.zone +*.cns.joyent.com + +// JS.ORG : http://dns.js.org +// Submitted by Stefan Keim <admin@js.org> +js.org + +// KaasHosting : http://www.kaashosting.nl/ +// Submitted by Wouter Bakker <hostmaster@kaashosting.nl> +kaas.gg +khplay.nl + +// Keyweb AG : https://www.keyweb.de +// Submitted by Martin Dannehl <postmaster@keymachine.de> +keymachine.de + +// KingHost : https://king.host +// Submitted by Felipe Keller Braz <felipebraz@kinghost.com.br> +kinghost.net +uni5.net + +// KnightPoint Systems, LLC : http://www.knightpoint.com/ +// Submitted by Roy Keene <rkeene@knightpoint.com> +knightpoint.systems + +// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf +co.krd +edu.krd + +// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de +// Submitted by Lars Laehn <info@lcube.de> +git-repos.de +lcube-server.de +svn-repos.de + +// Leadpages : https://www.leadpages.net +// Submitted by Greg Dallavalle <domains@leadpages.net> +leadpages.co +lpages.co +lpusercontent.com + +// Lelux.fi : https://lelux.fi/ +// Submitted by Lelux Admin <publisuffix@lelux.site> +lelux.site + +// Lifetime Hosting : https://Lifetime.Hosting/ +// Submitted by Mike Fillator <support@lifetime.hosting> +co.business +co.education +co.events +co.financial +co.network +co.place +co.technology + +// Lightmaker Property Manager, Inc. : https://app.lmpm.com/ +// Submitted by Greg Holland <greg.holland@lmpm.com> +app.lmpm.com + +// Linki Tools UG : https://linki.tools +// Submitted by Paulo Matos <pmatos@linki.tools> +linkitools.space + +// linkyard ldt: https://www.linkyard.ch/ +// Submitted by Mario Siegenthaler <mario.siegenthaler@linkyard.ch> +linkyard.cloud +linkyard-cloud.ch + +// Linode : https://linode.com +// Submitted by <security@linode.com> +members.linode.com +nodebalancer.linode.com + +// LiquidNet Ltd : http://www.liquidnetlimited.com/ +// Submitted by Victor Velchev <admin@liquidnetlimited.com> +we.bs + +// Log'in Line : https://www.loginline.com/ +// Submitted by Rémi Mach <remi.mach@loginline.com> +loginline.app +loginline.dev +loginline.io +loginline.services +loginline.site + +// LubMAN UMCS Sp. z o.o : https://lubman.pl/ +// Submitted by Ireneusz Maliszewski <ireneusz.maliszewski@lubman.pl> +krasnik.pl +leczna.pl +lubartow.pl +lublin.pl +poniatowa.pl +swidnik.pl + +// Lug.org.uk : https://lug.org.uk +// Submitted by Jon Spriggs <admin@lug.org.uk> +uklugs.org +glug.org.uk +lug.org.uk +lugs.org.uk + +// Lukanet Ltd : https://lukanet.com +// Submitted by Anton Avramov <register@lukanet.com> +barsy.bg +barsy.co.uk +barsyonline.co.uk +barsycenter.com +barsyonline.com +barsy.club +barsy.de +barsy.eu +barsy.in +barsy.info +barsy.io +barsy.me +barsy.menu +barsy.mobi +barsy.net +barsy.online +barsy.org +barsy.pro +barsy.pub +barsy.shop +barsy.site +barsy.support +barsy.uk + +// Magento Commerce +// Submitted by Damien Tournoud <dtournoud@magento.cloud> +*.magentosite.cloud + +// May First - People Link : https://mayfirst.org/ +// Submitted by Jamie McClelland <info@mayfirst.org> +mayfirst.info +mayfirst.org + +// Mail.Ru Group : https://hb.cldmail.ru +// Submitted by Ilya Zaretskiy <zaretskiy@corp.mail.ru> +hb.cldmail.ru + +// Memset hosting : https://www.memset.com +// Submitted by Tom Whitwell <domains@memset.com> +miniserver.com +memset.net + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Zdeněk Šustr <zdenek.sustr@cesnet.cz> +cloud.metacentrum.cz +custom.metacentrum.cz + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Radim Janča <janca@cesnet.cz> +flt.cloud.muni.cz +usr.cloud.muni.cz + +// Meteor Development Group : https://www.meteor.com/hosting +// Submitted by Pierre Carrier <pierre@meteor.com> +meteorapp.com +eu.meteorapp.com + +// Michau Enterprises Limited : http://www.co.pl/ +co.pl + +// Microsoft Corporation : http://microsoft.com +// Submitted by Justin Luk <juluk@microsoft.com> +azurecontainer.io +azurewebsites.net +azure-mobile.net +cloudapp.net + +// Mozilla Corporation : https://mozilla.com +// Submitted by Ben Francis <bfrancis@mozilla.com> +mozilla-iot.org + +// Mozilla Foundation : https://mozilla.org/ +// Submitted by glob <glob@mozilla.com> +bmoattachments.org + +// MSK-IX : https://www.msk-ix.ru/ +// Submitted by Khannanov Roman <r.khannanov@msk-ix.ru> +net.ru +org.ru +pp.ru + +// Nabu Casa : https://www.nabucasa.com +// Submitted by Paulus Schoutsen <infra@nabucasa.com> +ui.nabu.casa + +// Names.of.London : https://names.of.london/ +// Submitted by James Stevens <registry@names.of.london> or <james@jrcs.net> +pony.club +of.fashion +on.fashion +of.football +in.london +of.london +for.men +and.mom +for.mom +for.one +for.sale +of.work +to.work + +// NCTU.ME : https://nctu.me/ +// Submitted by Tocknicsu <admin@nctu.me> +nctu.me + +// Netlify : https://www.netlify.com +// Submitted by Jessica Parsons <jessica@netlify.com> +bitballoon.com +netlify.com + +// Neustar Inc. +// Submitted by Trung Tran <Trung.Tran@neustar.biz> +4u.com + +// ngrok : https://ngrok.com/ +// Submitted by Alan Shreve <alan@ngrok.com> +ngrok.io + +// Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/ +// Submitted by Nicholas Ford <nick@nimbushosting.co.uk> +nh-serv.co.uk + +// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ +// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net> +nfshost.com + +// Now-DNS : https://now-dns.com +// Submitted by Steve Russell <steve@now-dns.com> +dnsking.ch +mypi.co +n4t.co +001www.com +ddnslive.com +myiphost.com +forumz.info +16-b.it +32-b.it +64-b.it +soundcast.me +tcp4.me +dnsup.net +hicam.net +now-dns.net +ownip.net +vpndns.net +dynserv.org +now-dns.org +x443.pw +now-dns.top +ntdll.top +freeddns.us +crafting.xyz +zapto.xyz + +// nsupdate.info : https://www.nsupdate.info/ +// Submitted by Thomas Waldmann <info@nsupdate.info> +nsupdate.info +nerdpol.ovh + +// No-IP.com : https://noip.com/ +// Submitted by Deven Reza <publicsuffixlist@noip.com> +blogsyte.com +brasilia.me +cable-modem.org +ciscofreak.com +collegefan.org +couchpotatofries.org +damnserver.com +ddns.me +ditchyourip.com +dnsfor.me +dnsiskinky.com +dvrcam.info +dynns.com +eating-organic.net +fantasyleague.cc +geekgalaxy.com +golffan.us +health-carereform.com +homesecuritymac.com +homesecuritypc.com +hopto.me +ilovecollege.info +loginto.me +mlbfan.org +mmafan.biz +myactivedirectory.com +mydissent.net +myeffect.net +mymediapc.net +mypsx.net +mysecuritycamera.com +mysecuritycamera.net +mysecuritycamera.org +net-freaks.com +nflfan.org +nhlfan.net +no-ip.ca +no-ip.co.uk +no-ip.net +noip.us +onthewifi.com +pgafan.net +point2this.com +pointto.us +privatizehealthinsurance.net +quicksytes.com +read-books.org +securitytactics.com +serveexchange.com +servehumour.com +servep2p.com +servesarcasm.com +stufftoread.com +ufcfan.org +unusualperson.com +workisboring.com +3utilities.com +bounceme.net +ddns.net +ddnsking.com +gotdns.ch +hopto.org +myftp.biz +myftp.org +myvnc.com +no-ip.biz +no-ip.info +no-ip.org +noip.me +redirectme.net +servebeer.com +serveblog.net +servecounterstrike.com +serveftp.com +servegame.com +servehalflife.com +servehttp.com +serveirc.com +serveminecraft.net +servemp3.com +servepics.com +servequake.com +sytes.net +webhop.me +zapto.org + +// NodeArt : https://nodeart.io +// Submitted by Konstantin Nosov <Nosov@nodeart.io> +stage.nodeart.io + +// Nodum B.V. : https://nodum.io/ +// Submitted by Wietse Wind <hello+publicsuffixlist@nodum.io> +nodum.co +nodum.io + +// Nucleos Inc. : https://nucleos.com +// Submitted by Piotr Zduniak <piotr@nucleos.com> +pcloud.host + +// NYC.mn : http://www.information.nyc.mn +// Submitted by Matthew Brown <mattbrown@nyc.mn> +nyc.mn + +// NymNom : https://nymnom.com/ +// Submitted by Dave McCormack <dave.mccormack@nymnom.com> +nom.ae +nom.af +nom.ai +nom.al +nym.by +nym.bz +nom.cl +nym.ec +nom.gd +nom.ge +nom.gl +nym.gr +nom.gt +nym.gy +nym.hk +nom.hn +nym.ie +nom.im +nom.ke +nym.kz +nym.la +nym.lc +nom.li +nym.li +nym.lt +nym.lu +nym.me +nom.mk +nym.mn +nym.mx +nom.nu +nym.nz +nym.pe +nym.pt +nom.pw +nom.qa +nym.ro +nom.rs +nom.si +nym.sk +nom.st +nym.su +nym.sx +nom.tj +nym.tw +nom.ug +nom.uy +nom.vc +nom.vg + +// Octopodal Solutions, LLC. : https://ulterius.io/ +// Submitted by Andrew Sampson <andrew@ulterius.io> +cya.gg + +// Omnibond Systems, LLC. : https://www.omnibond.com +// Submitted by Cole Estep <cole@omnibond.com> +cloudycluster.net + +// One Fold Media : http://www.onefoldmedia.com/ +// Submitted by Eddie Jones <eddie@onefoldmedia.com> +nid.io + +// OpenCraft GmbH : http://opencraft.com/ +// Submitted by Sven Marnach <sven@opencraft.com> +opencraft.hosting + +// Opera Software, A.S.A. +// Submitted by Yngve Pettersen <yngve@opera.com> +operaunite.com + +// OutSystems +// Submitted by Duarte Santos <domain-admin@outsystemscloud.com> +outsystemscloud.com + +// OwnProvider GmbH: http://www.ownprovider.com +// Submitted by Jan Moennich <jan.moennich@ownprovider.com> +ownprovider.com +own.pm + +// OX : http://www.ox.rs +// Submitted by Adam Grand <webmaster@mail.ox.rs> +ox.rs + +// oy.lc +// Submitted by Charly Coste <changaco@changaco.oy.lc> +oy.lc + +// Pagefog : https://pagefog.com/ +// Submitted by Derek Myers <derek@pagefog.com> +pgfog.com + +// Pagefront : https://www.pagefronthq.com/ +// Submitted by Jason Kriss <jason@pagefronthq.com> +pagefrontapp.com + +// .pl domains (grandfathered) +art.pl +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// Pantheon Systems, Inc. : https://pantheon.io/ +// Submitted by Gary Dylina <gary@pantheon.io> +pantheonsite.io +gotpantheon.com + +// Peplink | Pepwave : http://peplink.com/ +// Submitted by Steve Leung <steveleung@peplink.com> +mypep.link + +// Planet-Work : https://www.planet-work.com/ +// Submitted by Frédéric VANNIÈRE <f.vanniere@planet-work.com> +on-web.fr + +// Platform.sh : https://platform.sh +// Submitted by Nikola Kotur <nikola@platform.sh> +*.platform.sh +*.platformsh.site + +// Port53 : https://port53.io/ +// Submitted by Maximilian Schieder <maxi@zeug.co> +dyn53.io + +// Positive Codes Technology Company : http://co.bn/faq.html +// Submitted by Zulfais <pc@co.bn> +co.bn + +// prgmr.com : https://prgmr.com/ +// Submitted by Sarah Newman <owner@prgmr.com> +xen.prgmr.com + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry <lendl@nic.at> +priv.at + +// privacytools.io : https://www.privacytools.io/ +// Submitted by Jonah Aragon <jonah@privacytools.io> +prvcy.page + +// Protocol Labs : https://protocol.ai/ +// Submitted by Michael Burns <noc@protocol.ai> +*.dweb.link + +// Protonet GmbH : http://protonet.io +// Submitted by Martin Meier <admin@protonet.io> +protonet.io + +// Publication Presse Communication SARL : https://ppcom.fr +// Submitted by Yaacov Akiba Slama <admin@chirurgiens-dentistes-en-france.fr> +chirurgiens-dentistes-en-france.fr +byen.site + +// pubtls.org: https://www.pubtls.org +// Submitted by Kor Nielsen <kor@pubtls.org> +pubtls.org + +// Qualifio : https://qualifio.com/ +// Submitted by Xavier De Cock <xdecock@gmail.com> +qualifioapp.com + +// Redstar Consultants : https://www.redstarconsultants.com/ +// Submitted by Jons Slemmer <jons@redstarconsultants.com> +instantcloud.cn + +// Russian Academy of Sciences +// Submitted by Tech Support <support@rasnet.ru> +ras.ru + +// QA2 +// Submitted by Daniel Dent (https://www.danieldent.com/) +qa2.com + +// QNAP System Inc : https://www.qnap.com +// Submitted by Nick Chang <nickchang@qnap.com> +dev-myqnapcloud.com +alpha-myqnapcloud.com +myqnapcloud.com + +// Quip : https://quip.com +// Submitted by Patrick Linehan <plinehan@quip.com> +*.quipelements.com + +// Qutheory LLC : http://qutheory.io +// Submitted by Jonas Schwartz <jonas@qutheory.io> +vapor.cloud +vaporcloud.io + +// Rackmaze LLC : https://www.rackmaze.com +// Submitted by Kirill Pertsev <kika@rackmaze.com> +rackmaze.com +rackmaze.net + +// Rancher Labs, Inc : https://rancher.com +// Submitted by Vincent Fiduccia <domains@rancher.com> +*.on-rancher.cloud +*.on-rio.io + +// Read The Docs, Inc : https://www.readthedocs.org +// Submitted by David Fischer <team@readthedocs.org> +readthedocs.io + +// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ +// Submitted by Tim Kramer <tkramer@rhcloud.com> +rhcloud.com + +// Render : https://render.com +// Submitted by Anurag Goel <dev@render.com> +app.render.com +onrender.com + +// Repl.it : https://repl.it +// Submitted by Mason Clayton <mason@repl.it> +repl.co +repl.run + +// Resin.io : https://resin.io +// Submitted by Tim Perry <tim@resin.io> +resindevice.io +devices.resinstaging.io + +// RethinkDB : https://www.rethinkdb.com/ +// Submitted by Chris Kastorff <info@rethinkdb.com> +hzc.io + +// Revitalised Limited : http://www.revitalised.co.uk +// Submitted by Jack Price <jack@revitalised.co.uk> +wellbeingzone.eu +ptplus.fit +wellbeingzone.co.uk + +// Rochester Institute of Technology : http://www.rit.edu/ +// Submitted by Jennifer Herting <jchits@rit.edu> +git-pages.rit.edu + +// Sandstorm Development Group, Inc. : https://sandcats.io/ +// Submitted by Asheesh Laroia <asheesh@sandstorm.io> +sandcats.io + +// SBE network solutions GmbH : https://www.sbe.de/ +// Submitted by Norman Meilick <nm@sbe.de> +logoip.de +logoip.com + +// schokokeks.org GbR : https://schokokeks.org/ +// Submitted by Hanno Böck <hanno@schokokeks.org> +schokokeks.net + +// Scottish Government: https://www.gov.scot +// Submitted by Martin Ellis <martin.ellis@gov.scot> +gov.scot + +// Scry Security : http://www.scrysec.com +// Submitted by Shante Adam <shante@skyhat.io> +scrysec.com + +// Securepoint GmbH : https://www.securepoint.de +// Submitted by Erik Anders <erik.anders@securepoint.de> +firewall-gateway.com +firewall-gateway.de +my-gateway.de +my-router.de +spdns.de +spdns.eu +firewall-gateway.net +my-firewall.org +myfirewall.org +spdns.org + +// Service Online LLC : http://drs.ua/ +// Submitted by Serhii Bulakh <support@drs.ua> +biz.ua +co.ua +pp.ua + +// ShiftEdit : https://shiftedit.net/ +// Submitted by Adam Jimenez <adam@shiftcreate.com> +shiftedit.io + +// Shopblocks : http://www.shopblocks.com/ +// Submitted by Alex Bowers <alex@shopblocks.com> +myshopblocks.com + +// Shopit : https://www.shopitcommerce.com/ +// Submitted by Craig McMahon <craig@shopitcommerce.com> +shopitsite.com + +// Siemens Mobility GmbH +// Submitted by Oliver Graebner <security@mo-siemens.io> +mo-siemens.io + +// SinaAppEngine : http://sae.sina.com.cn/ +// Submitted by SinaAppEngine <saesupport@sinacloud.com> +1kapp.com +appchizi.com +applinzi.com +sinaapp.com +vipsinaapp.com + +// Siteleaf : https://www.siteleaf.com/ +// Submitted by Skylar Challand <support@siteleaf.com> +siteleaf.net + +// Skyhat : http://www.skyhat.io +// Submitted by Shante Adam <shante@skyhat.io> +bounty-full.com +alpha.bounty-full.com +beta.bounty-full.com + +// Stackhero : https://www.stackhero.io +// Submitted by Adrien Gillon <adrien+public-suffix-list@stackhero.io> +stackhero-network.com + +// staticland : https://static.land +// Submitted by Seth Vincent <sethvincent@gmail.com> +static.land +dev.static.land +sites.static.land + +// SourceLair PC : https://www.sourcelair.com +// Submitted by Antonis Kalipetis <akalipetis@sourcelair.com> +apps.lair.io +*.stolos.io + +// SpaceKit : https://www.spacekit.io/ +// Submitted by Reza Akhavan <spacekit.io@gmail.com> +spacekit.io + +// SpeedPartner GmbH: https://www.speedpartner.de/ +// Submitted by Stefan Neufeind <info@speedpartner.de> +customer.speedpartner.de + +// Standard Library : https://stdlib.com +// Submitted by Jacob Lee <jacob@stdlib.com> +api.stdlib.com + +// Storj Labs Inc. : https://storj.io/ +// Submitted by Philip Hutchins <hostmaster@storj.io> +storj.farm + +// Studenten Net Twente : http://www.snt.utwente.nl/ +// Submitted by Silke Hofstra <syscom@snt.utwente.nl> +utwente.io + +// Student-Run Computing Facility : https://www.srcf.net/ +// Submitted by Edwin Balani <sysadmins@srcf.net> +soc.srcf.net +user.srcf.net + +// Sub 6 Limited: http://www.sub6.com +// Submitted by Dan Miller <dm@sub6.com> +temp-dns.com + +// Swisscom Application Cloud: https://developer.swisscom.com +// Submitted by Matthias.Winzeler <matthias.winzeler@swisscom.com> +applicationcloud.io +scapp.io + +// Symfony, SAS : https://symfony.com/ +// Submitted by Fabien Potencier <fabien@symfony.com> +*.s5y.io +*.sensiosite.cloud + +// Syncloud : https://syncloud.org +// Submitted by Boris Rybalkin <syncloud@syncloud.it> +syncloud.it + +// Synology, Inc. : https://www.synology.com/ +// Submitted by Rony Weng <ronyweng@synology.com> +diskstation.me +dscloud.biz +dscloud.me +dscloud.mobi +dsmynas.com +dsmynas.net +dsmynas.org +familyds.com +familyds.net +familyds.org +i234.me +myds.me +synology.me +vpnplus.to +direct.quickconnect.to + +// TAIFUN Software AG : http://taifun-software.de +// Submitted by Bjoern Henke <dev-server@taifun-software.de> +taifun-dns.de + +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl + +// Teckids e.V. : https://www.teckids.org +// Submitted by Dominik George <dominik.george@teckids.org> +edugit.org + +// Telebit : https://telebit.cloud +// Submitted by AJ ONeal <aj@telebit.cloud> +telebit.app +telebit.io +*.telebit.xyz + +// The Gwiddle Foundation : https://gwiddlefoundation.org.uk +// Submitted by Joshua Bayfield <joshua.bayfield@gwiddlefoundation.org.uk> +gwiddle.co.uk + +// Thingdust AG : https://thingdust.com/ +// Submitted by Adrian Imboden <adi@thingdust.com> +thingdustdata.com +cust.dev.thingdust.io +cust.disrec.thingdust.io +cust.prod.thingdust.io +cust.testing.thingdust.io + +// Tlon.io : https://tlon.io +// Submitted by Mark Staarink <mark@tlon.io> +arvo.network +azimuth.network + +// TownNews.com : http://www.townnews.com +// Submitted by Dustin Ward <dward@townnews.com> +bloxcms.com +townnews-staging.com + +// TrafficPlex GmbH : https://www.trafficplex.de/ +// Submitted by Phillipp Röll <phillipp.roell@trafficplex.de> +12hp.at +2ix.at +4lima.at +lima-city.at +12hp.ch +2ix.ch +4lima.ch +lima-city.ch +trafficplex.cloud +de.cool +12hp.de +2ix.de +4lima.de +lima-city.de +1337.pictures +clan.rip +lima-city.rocks +webspace.rocks +lima.zone + +// TransIP : https://www.transip.nl +// Submitted by Rory Breuk <rbreuk@transip.nl> +*.transurl.be +*.transurl.eu +*.transurl.nl + +// TuxFamily : http://tuxfamily.org +// Submitted by TuxFamily administrators <adm@staff.tuxfamily.org> +tuxfamily.org + +// TwoDNS : https://www.twodns.de/ +// Submitted by TwoDNS-Support <support@two-dns.de> +dd-dns.de +diskstation.eu +diskstation.org +dray-dns.de +draydns.de +dyn-vpn.de +dynvpn.de +mein-vigor.de +my-vigor.de +my-wan.de +syno-ds.de +synology-diskstation.de +synology-ds.de + +// Uberspace : https://uberspace.de +// Submitted by Moritz Werner <mwerner@jonaspasche.com> +uber.space +*.uberspace.de + +// UDR Limited : http://www.udr.hk.com +// Submitted by registry <hostmaster@udr.hk.com> +hk.com +hk.org +ltd.hk +inc.hk + +// United Gameserver GmbH : https://united-gameserver.de +// Submitted by Stefan Schwarz <sysadm@united-gameserver.de> +virtualuser.de +virtual-user.de + +// .US +// Submitted by Ed Moore <Ed.Moore@lib.de.us> +lib.de.us + +// VeryPositive SIA : http://very.lv +// Submitted by Danko Aleksejevs <danko@very.lv> +2038.io + +// Viprinet Europe GmbH : http://www.viprinet.com +// Submitted by Simon Kissel <hostmaster@viprinet.com> +router.management + +// Virtual-Info : https://www.virtual-info.info/ +// Submitted by Adnan RIHAN <hostmaster@v-info.info> +v-info.info + +// Voorloper.com: https://voorloper.com +// Submitted by Nathan van Bakel <info@voorloper.com> +voorloper.cloud + +// Waffle Computer Inc., Ltd. : https://docs.waffleinfo.com +// Submitted by Masayuki Note <masa@blade.wafflecell.com> +wafflecell.com + +// WebHare bv: https://www.webhare.com/ +// Submitted by Arnold Hendriks <info@webhare.com> +*.webhare.dev + +// WeDeploy by Liferay, Inc. : https://www.wedeploy.com +// Submitted by Henrique Vicente <security@wedeploy.com> +wedeploy.io +wedeploy.me +wedeploy.sh + +// Western Digital Technologies, Inc : https://www.wdc.com +// Submitted by Jung Jin <jungseok.jin@wdc.com> +remotewd.com + +// Wikimedia Labs : https://wikitech.wikimedia.org +// Submitted by Yuvi Panda <yuvipanda@wikimedia.org> +wmflabs.org + +// XenonCloud GbR: https://xenoncloud.net +// Submitted by Julian Uphoff <publicsuffixlist@xenoncloud.net> +half.host + +// XnBay Technology : http://www.xnbay.com/ +// Submitted by XnBay Developer <developer.xncloud@gmail.com> +xnbay.com +u2.xnbay.com +u2-local.xnbay.com + +// XS4ALL Internet bv : https://www.xs4all.nl/ +// Submitted by Daniel Mostertman <unixbeheer+publicsuffix@xs4all.net> +cistron.nl +demon.nl +xs4all.space + +// Yandex.Cloud LLC: https://cloud.yandex.com +// Submitted by Alexander Lodin <security+psl@yandex-team.ru> +yandexcloud.net +storage.yandexcloud.net +website.yandexcloud.net + +// YesCourse Pty Ltd : https://yescourse.com +// Submitted by Atul Bhouraskar <atul@yescourse.com> +official.academy + +// Yola : https://www.yola.com/ +// Submitted by Stefano Rivera <stefano@yola.com> +yolasite.com + +// Yombo : https://yombo.net +// Submitted by Mitch Schwenk <mitch@yombo.net> +ybo.faith +yombo.me +homelink.one +ybo.party +ybo.review +ybo.science +ybo.trade + +// Yunohost : https://yunohost.org +// Submitted by Valentin Grimaud <security@yunohost.org> +nohost.me +noho.st + +// ZaNiC : http://www.za.net/ +// Submitted by registry <hostmaster@nic.za.net> +za.net +za.org + +// Zeit, Inc. : https://zeit.domains/ +// Submitted by Olli Vanhoja <olli@zeit.co> +now.sh + +// Zine EOOD : https://zine.bg/ +// Submitted by Martin Angelov <martin@zine.bg> +bss.design + +// Zitcom A/S : https://www.zitcom.dk +// Submitted by Emil Stahl <esp@zitcom.dk> +basicserver.io +virtualserver.io +site.builder.nu +enterprisecloud.nu + +// ===END PRIVATE DOMAINS=== diff --git a/Contents/Libraries/Shared/tld/tests/test_commands.py b/Contents/Libraries/Shared/tld/tests/test_commands.py new file mode 100644 index 000000000..23394fa61 --- /dev/null +++ b/Contents/Libraries/Shared/tld/tests/test_commands.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +import logging +import unittest +import subprocess +from .base import log_info, internet_available_only +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'GPL 2.0/LGPL 2.1' +__all__ = (u'TestCommands',) +LOGGER = logging.getLogger(__name__) + + +class TestCommands(unittest.TestCase): + u'Tld commands tests.' + + def setUp(self): + u'Set up.' + + @internet_available_only + @log_info + def test_1_update_tld_names_command(self): + u'Test updating the tld names (re-fetch mozilla source).' + res = subprocess.check_output([u'update-tld-names']).strip() + self.assertEqual(res, b'') + return res + + @internet_available_only + @log_info + def test_1_update_tld_names_mozilla_command(self): + u'Test updating the tld names (re-fetch mozilla source).' + res = subprocess.check_output( + [u'update-tld-names', u'mozilla']).strip() + self.assertEqual(res, b'') + return res + + +if (__name__ == u'__main__'): + unittest.main() diff --git a/Contents/Libraries/Shared/tld/tests/test_core.py b/Contents/Libraries/Shared/tld/tests/test_core.py new file mode 100644 index 000000000..b1a71e113 --- /dev/null +++ b/Contents/Libraries/Shared/tld/tests/test_core.py @@ -0,0 +1,708 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import copy +import logging +from os.path import abspath, join +import unittest +from tempfile import gettempdir +from typing import Type +try: + from urllib.parse import urlsplit +except ImportError: + from six.moves.urllib_parse import urlsplit +from faker import Faker +from .. import defaults +from ..base import BaseTLDSourceParser +from ..conf import get_setting, reset_settings, set_setting +from ..exceptions import TldBadUrl, TldDomainNotFound, TldImproperlyConfigured, TldIOError +from ..helpers import project_dir +from ..registry import Registry +from ..utils import get_fld, get_tld, get_tld_names, get_tld_names_container, is_tld, MozillaTLDSourceParser, BaseMozillaTLDSourceParser, parse_tld, reset_tld_names, update_tld_names, update_tld_names_cli +from .base import internet_available_only, log_info +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'TestCore',) +LOGGER = logging.getLogger(__name__) + + +class TestCore(unittest.TestCase): + u'Core tld functionality tests.' + + @classmethod + def setUpClass(cls): + cls.faker = Faker() + cls.temp_dir = gettempdir() + + def setUp(self): + u'Set up.' + self.good_patterns = [{ + u'url': u'http://www.google.co.uk', + u'fld': u'google.co.uk', + u'subdomain': u'www', + u'domain': u'google', + u'suffix': u'co.uk', + u'tld': u'co.uk', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://www.v2.google.co.uk', + u'fld': u'google.co.uk', + u'subdomain': u'www.v2', + u'domain': u'google', + u'suffix': u'co.uk', + u'tld': u'co.uk', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://хром.гугл.рф', + u'fld': u'гугл.рф', + u'subdomain': u'хром', + u'domain': u'гугл', + u'suffix': u'рф', + u'tld': u'рф', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://www.google.co.uk:8001/lorem-ipsum/', + u'fld': u'google.co.uk', + u'subdomain': u'www', + u'domain': u'google', + u'suffix': u'co.uk', + u'tld': u'co.uk', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://www.me.cloudfront.net', + u'fld': u'me.cloudfront.net', + u'subdomain': u'www', + u'domain': u'me', + u'suffix': u'cloudfront.net', + u'tld': u'cloudfront.net', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://www.v2.forum.tech.google.co.uk:8001/lorem-ipsum/', + u'fld': u'google.co.uk', + u'subdomain': u'www.v2.forum.tech', + u'domain': u'google', + u'suffix': u'co.uk', + u'tld': u'co.uk', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'https://pantheon.io/', + u'fld': u'pantheon.io', + u'subdomain': u'', + u'domain': u'pantheon', + u'suffix': u'io', + u'tld': u'io', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'v2.www.google.com', + u'fld': u'google.com', + u'subdomain': u'v2.www', + u'domain': u'google', + u'suffix': u'com', + u'tld': u'com', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': u'//v2.www.google.com', + u'fld': u'google.com', + u'subdomain': u'v2.www', + u'domain': u'google', + u'suffix': u'com', + u'tld': u'com', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': u'http://foo@bar.com', + u'fld': u'bar.com', + u'subdomain': u'', + u'domain': u'bar', + u'suffix': u'com', + u'tld': u'com', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://user:foo@bar.com', + u'fld': u'bar.com', + u'subdomain': u'', + u'domain': u'bar', + u'suffix': u'com', + u'tld': u'com', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'https://faguoren.xn--fiqs8s', + u'fld': u'faguoren.xn--fiqs8s', + u'subdomain': u'', + u'domain': u'faguoren', + u'suffix': u'xn--fiqs8s', + u'tld': u'xn--fiqs8s', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'blogs.lemonde.paris', + u'fld': u'lemonde.paris', + u'subdomain': u'blogs', + u'domain': u'lemonde', + u'suffix': u'paris', + u'tld': u'paris', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': u'axel.brighton.ac.uk', + u'fld': u'brighton.ac.uk', + u'subdomain': u'axel', + u'domain': u'brighton', + u'suffix': u'ac.uk', + u'tld': u'ac.uk', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': u'm.fr.blogspot.com.au', + u'fld': u'fr.blogspot.com.au', + u'subdomain': u'm', + u'domain': u'fr', + u'suffix': u'blogspot.com.au', + u'tld': u'blogspot.com.au', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': u'help.www.福岡.jp', + u'fld': u'www.福岡.jp', + u'subdomain': u'help', + u'domain': u'www', + u'suffix': u'福岡.jp', + u'tld': u'福岡.jp', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': u'syria.arabic.variant.سوريا', + u'fld': u'variant.سوريا', + u'subdomain': u'syria.arabic', + u'domain': u'variant', + u'suffix': u'سوريا', + u'tld': u'سوريا', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': u'http://www.help.kawasaki.jp', + u'fld': u'www.help.kawasaki.jp', + u'subdomain': u'', + u'domain': u'www', + u'suffix': u'help.kawasaki.jp', + u'tld': u'help.kawasaki.jp', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://www.city.kawasaki.jp', + u'fld': u'city.kawasaki.jp', + u'subdomain': u'www', + u'domain': u'city', + u'suffix': u'kawasaki.jp', + u'tld': u'kawasaki.jp', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://fedoraproject.org', + u'fld': u'fedoraproject.org', + u'subdomain': u'', + u'domain': u'fedoraproject', + u'suffix': u'org', + u'tld': u'org', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://www.cloud.fedoraproject.org', + u'fld': u'www.cloud.fedoraproject.org', + u'subdomain': u'', + u'domain': u'www', + u'suffix': u'cloud.fedoraproject.org', + u'tld': u'cloud.fedoraproject.org', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'https://www.john.app.os.fedoraproject.org', + u'fld': u'john.app.os.fedoraproject.org', + u'subdomain': u'www', + u'domain': u'john', + u'suffix': u'app.os.fedoraproject.org', + u'tld': u'app.os.fedoraproject.org', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'ftp://www.xn--mxail5aa.xn--11b4c3d', + u'fld': u'xn--mxail5aa.xn--11b4c3d', + u'subdomain': u'www', + u'domain': u'xn--mxail5aa', + u'suffix': u'xn--11b4c3d', + u'tld': u'xn--11b4c3d', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://cloud.fedoraproject.org', + u'fld': u'cloud.fedoraproject.org', + u'subdomain': u'', + u'domain': u'cloud.fedoraproject.org', + u'suffix': u'cloud.fedoraproject.org', + u'tld': u'cloud.fedoraproject.org', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'github.io', + u'fld': u'github.io', + u'subdomain': u'', + u'domain': u'github.io', + u'suffix': u'github.io', + u'tld': u'github.io', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': urlsplit(u'http://lemonde.fr/article.html'), + u'fld': u'lemonde.fr', + u'subdomain': u'', + u'domain': u'lemonde', + u'suffix': u'fr', + u'tld': u'fr', + u'kwargs': { + u'fail_silently': True, + }, + }] + self.bad_patterns = { + u'v2.www.google.com': { + u'exception': TldBadUrl, + }, + u'/index.php?a=1&b=2': { + u'exception': TldBadUrl, + }, + u'http://www.tld.doesnotexist': { + u'exception': TldDomainNotFound, + }, + u'https://2001:0db8:0000:85a3:0000:0000:ac1f:8001': { + u'exception': TldDomainNotFound, + }, + u'http://192.169.1.1': { + u'exception': TldDomainNotFound, + }, + u'http://localhost:8080': { + u'exception': TldDomainNotFound, + }, + u'https://localhost': { + u'exception': TldDomainNotFound, + }, + u'https://localhost2': { + u'exception': TldImproperlyConfigured, + u'kwargs': { + u'search_public': False, + u'search_private': False, + }, + }, + } + self.invalid_tlds = {u'v2.www.google.com', u'tld.doesnotexist', + u'2001:0db8:0000:85a3:0000:0000:ac1f', u'192.169.1.1', 'localhost', u'google.com'} + self.tld_names_local_path_custom = project_dir( + join(u'tests', u'res', u'effective_tld_names_custom.dat.txt')) + self.good_patterns_custom_parser = [{ + u'url': u'http://www.foreverchild', + u'fld': u'www.foreverchild', + u'subdomain': u'', + u'domain': u'www', + u'suffix': u'foreverchild', + u'tld': u'foreverchild', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://www.v2.foreverchild', + u'fld': u'v2.foreverchild', + u'subdomain': u'www', + u'domain': u'v2', + u'suffix': u'foreverchild', + u'tld': u'foreverchild', + u'kwargs': { + u'fail_silently': True, + }, + }] + reset_settings() + + def tearDown(self): + u'Tear down.' + reset_settings() + Registry.reset() + + @property + def good_url(self): + return self.good_patterns[0][u'url'] + + @property + def bad_url(self): + return list(self.bad_patterns.keys())[0] + + def get_custom_parser_class(self, uid='custom_mozilla', source_url=None, local_path='tests/res/effective_tld_names_custom.dat.txt'): + parser_class = type('CustomMozillaTLDSourceParser', (BaseMozillaTLDSourceParser,), { + 'uid': uid, + 'source_url': source_url, + 'local_path': local_path, + }) + return parser_class + + @log_info + def test_0_tld_names_loaded(self): + u'Test if tld names are loaded.' + get_fld(u'http://www.google.co.uk') + from ..utils import tld_names + res = (len(tld_names) > 0) + self.assertTrue(res) + return res + + @internet_available_only + @log_info + def test_1_update_tld_names(self): + u'Test updating the tld names (re-fetch mozilla source).' + res = update_tld_names(fail_silently=False) + self.assertTrue(res) + return res + + @log_info + def test_2_fld_good_patterns_pass(self): + u'Test good URL patterns.' + res = [] + for data in self.good_patterns: + _res = get_fld(data[u'url'], **data[u'kwargs']) + self.assertEqual(_res, data[u'fld']) + res.append(_res) + return res + + @log_info + def test_3_fld_bad_patterns_pass(self): + u'Test bad URL patterns.' + res = [] + for (url, params) in self.bad_patterns.items(): + _res = get_fld(url, fail_silently=True) + self.assertEqual(_res, None) + res.append(_res) + return res + + @log_info + def test_4_override_settings(self): + u'Testing settings override.' + + def override_settings(): + u'Override settings.' + return get_setting(u'DEBUG') + self.assertEqual(defaults.DEBUG, override_settings()) + set_setting(u'DEBUG', True) + self.assertEqual(True, override_settings()) + return override_settings() + + @log_info + def test_5_tld_good_patterns_pass_parsed_object(self): + u'Test good URL patterns.' + res = [] + for data in self.good_patterns: + kwargs = copy.copy(data[u'kwargs']) + kwargs.update({ + u'as_object': True, + }) + _res = get_tld(data[u'url'], **kwargs) + self.assertEqual(_res.tld, data[u'tld']) + self.assertEqual(_res.subdomain, data[u'subdomain']) + self.assertEqual(_res.domain, data[u'domain']) + self.assertEqual(_res.suffix, data[u'suffix']) + self.assertEqual(_res.fld, data[u'fld']) + self.assertEqual(unicode(_res).encode(u'utf8'), + data[u'tld'].encode(u'utf8')) + self.assertEqual(_res.__dict__, { + u'tld': _res.tld, + u'domain': _res.domain, + u'subdomain': _res.subdomain, + u'fld': _res.fld, + u'parsed_url': _res.parsed_url, + }) + res.append(_res) + return res + + @log_info + def test_6_override_full_names_path(self): + default = project_dir(u'dummy.txt') + override_base = u'/tmp/test' + set_setting(u'NAMES_LOCAL_PATH_PARENT', override_base) + modified = project_dir(u'dummy.txt') + self.assertNotEqual(default, modified) + self.assertEqual(modified, abspath(u'/tmp/test/dummy.txt')) + + @log_info + def test_7_public_private(self): + res = get_fld(u'http://silly.cc.ua', + fail_silently=True, search_private=False) + self.assertEqual(res, None) + res = get_fld(u'http://silly.cc.ua', + fail_silently=True, search_private=True) + self.assertEqual(res, u'silly.cc.ua') + res = get_fld(u'mercy.compute.amazonaws.com', + fail_silently=True, search_private=False, fix_protocol=True) + self.assertEqual(res, None) + res = get_fld(u'http://whatever.com', + fail_silently=True, search_public=False) + self.assertEqual(res, None) + + @log_info + def test_8_fld_bad_patterns_exceptions(self): + u'Test exceptions.' + res = [] + for (url, params) in self.bad_patterns.items(): + kwargs = (params[u'kwargs'] if (u'kwargs' in params) else { + + }) + kwargs.update({ + u'fail_silently': False, + }) + with self.assertRaises(params[u'exception']): + _res = get_fld(url, **kwargs) + res.append(_res) + return res + + @log_info + def test_9_tld_good_patterns_pass(self): + u'Test `get_tld` good URL patterns.' + res = [] + for data in self.good_patterns: + _res = get_tld(data[u'url'], **data[u'kwargs']) + self.assertEqual(_res, data[u'tld']) + res.append(_res) + return res + + @log_info + def test_10_tld_bad_patterns_pass(self): + u'Test `get_tld` bad URL patterns.' + res = [] + for (url, params) in self.bad_patterns.items(): + _res = get_tld(url, fail_silently=True) + self.assertEqual(_res, None) + res.append(_res) + return res + + @log_info + def test_11_parse_tld_good_patterns(self): + u'Test `parse_tld` good URL patterns.' + res = [] + for data in self.good_patterns: + _res = parse_tld(data[u'url'], **data[u'kwargs']) + self.assertEqual( + _res, (data[u'tld'], data[u'domain'], data[u'subdomain'])) + res.append(_res) + return res + + @log_info + def test_12_is_tld_good_patterns(self): + u'Test `is_tld` good URL patterns.' + for data in self.good_patterns: + self.assertTrue(is_tld(data[u'tld'])) + + @log_info + def test_13_is_tld_bad_patterns(self): + u'Test `is_tld` bad URL patterns.' + for _tld in self.invalid_tlds: + self.assertFalse(is_tld(_tld)) + + @log_info + def test_14_fail_update_tld_names(self): + u'Test fail `update_tld_names`.' + parser_class = self.get_custom_parser_class( + uid='custom_mozilla_2', source_url='i-do-not-exist') + with self.assertRaises(TldIOError): + update_tld_names(fail_silently=False, parser_uid=parser_class.uid) + self.assertFalse(update_tld_names( + fail_silently=True, parser_uid=parser_class.uid)) + + @log_info + def test_15_fail_get_fld_wrong_kwargs(self): + u'Test fail `get_fld` with wrong kwargs.' + with self.assertRaises(TldImproperlyConfigured): + get_fld(self.good_url, as_object=True) + + @log_info + def test_16_fail_parse_tld(self): + u'Test fail `parse_tld`.\n\n Assert raise TldIOError on wrong `NAMES_SOURCE_URL` for `parse_tld`.\n ' + parser_class = self.get_custom_parser_class( + source_url='i-do-not-exist') + parsed_tld = parse_tld( + self.bad_url, fail_silently=False, parser_class=parser_class) + self.assertEqual(parsed_tld, (None, None, None)) + + @log_info + def test_17_get_tld_names_and_reset_tld_names(self): + u'Test fail `get_tld_names` and repair using `reset_tld_names`.' + tmp_filename = join(gettempdir(), u''.join( + [u'{}'.format(self.faker.uuid4()), u'.dat.txt'])) + parser_class = self.get_custom_parser_class( + source_url='i-do-not-exist', local_path=tmp_filename) + reset_tld_names() + if True: + with self.assertRaises(TldIOError): + get_tld_names(fail_silently=False, parser_class=parser_class) + tmp_filename = join(gettempdir(), u''.join( + [u'{}'.format(self.faker.uuid4()), u'.dat.txt'])) + parser_class_2 = self.get_custom_parser_class( + source_url='i-do-not-exist-2', local_path=tmp_filename) + reset_tld_names() + if True: + self.assertIsNone(get_tld_names( + fail_silently=True, parser_class=parser_class_2)) + + @internet_available_only + @log_info + def test_18_update_tld_names_cli(self): + u'Test the return code of the CLI version of `update_tld_names`.' + reset_tld_names() + res = update_tld_names_cli() + self.assertEqual(res, 0) + + @log_info + def test_19_parse_tld_custom_tld_names_good_patterns(self): + u'Test `parse_tld` good URL patterns for custom tld names.' + res = [] + for data in self.good_patterns_custom_parser: + kwargs = copy.copy(data[u'kwargs']) + kwargs.update({ + u'parser_class': self.get_custom_parser_class(), + }) + _res = parse_tld(data[u'url'], **kwargs) + self.assertEqual( + _res, (data[u'tld'], data[u'domain'], data[u'subdomain'])) + res.append(_res) + return res + + @log_info + def test_20_tld_custom_tld_names_good_patterns_pass_parsed_object(self): + u'Test `get_tld` good URL patterns for custom tld names.' + res = [] + for data in self.good_patterns_custom_parser: + kwargs = copy.copy(data[u'kwargs']) + kwargs.update({ + u'as_object': True, + u'parser_class': self.get_custom_parser_class(), + }) + _res = get_tld(data[u'url'], **kwargs) + self.assertEqual(_res.tld, data[u'tld']) + self.assertEqual(_res.subdomain, data[u'subdomain']) + self.assertEqual(_res.domain, data[u'domain']) + self.assertEqual(_res.suffix, data[u'suffix']) + self.assertEqual(_res.fld, data[u'fld']) + self.assertEqual(unicode(_res).encode(u'utf8'), + data[u'tld'].encode(u'utf8')) + self.assertEqual(_res.__dict__, { + u'tld': _res.tld, + u'domain': _res.domain, + u'subdomain': _res.subdomain, + u'fld': _res.fld, + u'parsed_url': _res.parsed_url, + }) + res.append(_res) + return res + + @log_info + def test_21_reset_tld_names_for_custom_parser(self): + u'Test `reset_tld_names` for `tld_names_local_path`.' + res = [] + parser_class = self.get_custom_parser_class() + for data in self.good_patterns_custom_parser: + kwargs = copy.copy(data[u'kwargs']) + kwargs.update({ + u'as_object': True, + u'parser_class': self.get_custom_parser_class(), + }) + _res = get_tld(data[u'url'], **kwargs) + self.assertEqual(_res.tld, data[u'tld']) + self.assertEqual(_res.subdomain, data[u'subdomain']) + self.assertEqual(_res.domain, data[u'domain']) + self.assertEqual(_res.suffix, data[u'suffix']) + self.assertEqual(_res.fld, data[u'fld']) + self.assertEqual(unicode(_res).encode(u'utf8'), + data[u'tld'].encode(u'utf8')) + self.assertEqual(_res.__dict__, { + u'tld': _res.tld, + u'domain': _res.domain, + u'subdomain': _res.subdomain, + u'fld': _res.fld, + u'parsed_url': _res.parsed_url, + }) + res.append(_res) + tld_names = get_tld_names_container() + self.assertIn(parser_class.local_path, tld_names) + reset_tld_names(parser_class.local_path) + self.assertNotIn(parser_class.local_path, tld_names) + return res + + @log_info + def test_22_fail_define_custom_parser_class_without_uid(self): + u'Test fail define custom parser class without `uid`.' + + class CustomParser(BaseTLDSourceParser): + pass + + class AnotherCustomParser(BaseTLDSourceParser): + uid = u'another-custom-parser' + with self.assertRaises(TldImproperlyConfigured): + CustomParser.get_tld_names() + with self.assertRaises(NotImplementedError): + AnotherCustomParser.get_tld_names() + + @log_info + def test_23_len_trie_nodes(self): + u'Test len of the trie nodes.' + get_tld(u'http://delusionalinsanity.com') + tld_names = get_tld_names_container() + self.assertGreater( + len(tld_names[MozillaTLDSourceParser.local_path]), 0) + + @log_info + def test_24_get_tld_names_no_arguments(self): + u'Test len of the trie nodes.' + tld_names = get_tld_names() + self.assertGreater(len(tld_names), 0) + + +if (__name__ == u'__main__'): + unittest.main() diff --git a/Contents/Libraries/Shared/tld/trie.py b/Contents/Libraries/Shared/tld/trie.py new file mode 100644 index 000000000..c9365f8a5 --- /dev/null +++ b/Contents/Libraries/Shared/tld/trie.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'Trie', u'TrieNode') + + +class TrieNode(object): + u'Class representing a single Trie node.' + __slots__ = (u'children', u'exception', u'leaf', u'private') + + def __init__(self): + self.children = None + self.exception = None + self.leaf = False + self.private = False + + +class Trie(object): + u'An adhoc Trie data structure to store tlds in reverse notation order.' + + def __init__(self): + self.root = TrieNode() + self.__nodes = 0 + + def __len__(self): + return self.__nodes + + def add(self, tld, private=False): + node = self.root + for part in reversed(tld.split(u'.')): + if part.startswith(u'!'): + node.exception = part[1:] + break + if (node.children is None): + node.children = { + + } + child = TrieNode() + else: + child = node.children.get(part) + if (child is None): + child = TrieNode() + node.children[part] = child + node = child + node.leaf = True + if private: + node.private = True + self.__nodes += 1 diff --git a/Contents/Libraries/Shared/tld/utils.py b/Contents/Libraries/Shared/tld/utils.py new file mode 100644 index 000000000..d8ef62acd --- /dev/null +++ b/Contents/Libraries/Shared/tld/utils.py @@ -0,0 +1,271 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from __future__ import unicode_literals +import argparse +from codecs import open as codecs_open +from backports.functools_lru_cache import lru_cache +from os.path import isabs +import sys +from typing import Dict, Type, Union, Tuple, List +try: + from urllib.parse import urlsplit, SplitResult +except ImportError: + from six.moves.urllib_parse import urlsplit, SplitResult +from .base import BaseTLDSourceParser +from .exceptions import TldBadUrl, TldDomainNotFound, TldImproperlyConfigured, TldIOError +from .helpers import project_dir +from .trie import Trie +from .registry import Registry +from .result import Result +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'BaseMozillaTLDSourceParser', u'get_fld', u'get_tld', u'get_tld_names', u'get_tld_names_container', u'is_tld', u'MozillaTLDSourceParser', u'parse_tld', + u'pop_tld_names_container', u'process_url', u'reset_tld_names', u'Result', u'update_tld_names', u'update_tld_names_cli', u'update_tld_names_container') +tld_names = { + +} + + +def get_tld_names_container(): + u'Get container of all tld names.\n\n :return:\n :rtype dict:\n ' + global tld_names + return tld_names + + +def update_tld_names_container(tld_names_local_path, trie_obj): + u'Update TLD Names container item.\n\n :param tld_names_local_path:\n :param trie_obj:\n :return:\n ' + global tld_names + tld_names.update({ + tld_names_local_path: trie_obj, + }) + + +def pop_tld_names_container(tld_names_local_path): + u'Remove TLD names container item.\n\n :param tld_names_local_path:\n :return:\n ' + global tld_names + tld_names.pop(tld_names_local_path, None) + + +@lru_cache(maxsize=128, typed=True) +def update_tld_names(fail_silently=False, parser_uid=None): + u'Update TLD names.\n\n :param fail_silently:\n :param parser_uid:\n :return:\n ' + results = [] + results_append = results.append + if parser_uid: + parser_cls = Registry.get(parser_uid, None) + if (parser_cls and parser_cls.source_url): + results_append(parser_cls.update_tld_names( + fail_silently=fail_silently)) + else: + for (parser_uid, parser_cls) in Registry.items(): + if (parser_cls and parser_cls.source_url): + results_append(parser_cls.update_tld_names( + fail_silently=fail_silently)) + return all(results) + + +def update_tld_names_cli(): + u'CLI wrapper for update_tld_names.\n\n Since update_tld_names returns True on success, we need to negate the\n result to match CLI semantics.\n ' + parser = argparse.ArgumentParser(description='Update TLD names') + parser.add_argument(u'parser_uid', nargs='?', default=None, + help='UID of the parser to update TLD names for.') + parser.add_argument(u'--fail-silently', dest='fail_silently', + default=False, action='store_true', help='Fail silently') + args = parser.parse_args(sys.argv[1:]) + parser_uid = args.parser_uid + fail_silently = args.fail_silently + return int((not update_tld_names(parser_uid=parser_uid, fail_silently=fail_silently))) + + +def get_tld_names(fail_silently=False, retry_count=0, parser_class=None): + u'Build the ``tlds`` list if empty. Recursive.\n\n :param fail_silently: If set to True, no exceptions are raised and None\n is returned on failure.\n :param retry_count: If greater than 1, we raise an exception in order\n to avoid infinite loops.\n :param parser_class:\n :type fail_silently: bool\n :type retry_count: int\n :type parser_class: BaseTLDSourceParser\n :return: List of TLD names\n :rtype: obj:`tld.utils.Trie`\n ' + if (not parser_class): + parser_class = MozillaTLDSourceParser + return parser_class.get_tld_names(fail_silently=fail_silently, retry_count=retry_count) + + +class BaseMozillaTLDSourceParser(BaseTLDSourceParser): + + @classmethod + def get_tld_names(cls, fail_silently=False, retry_count=0): + u'Parse.\n\n :param fail_silently:\n :param retry_count:\n :return:\n ' + if (retry_count > 1): + if fail_silently: + return None + else: + raise TldIOError + global tld_names + _tld_names = tld_names + if ((cls.local_path in _tld_names) and (_tld_names[cls.local_path] is not None)): + return _tld_names + local_file = None + try: + if isabs(cls.local_path): + local_path = cls.local_path + else: + local_path = project_dir(cls.local_path) + local_file = codecs_open(local_path, u'r', encoding='utf8') + trie = Trie() + trie_add = trie.add + private_section = False + for line in local_file: + if (u'===BEGIN PRIVATE DOMAINS===' in line): + private_section = True + if (u'// xn--' in line): + line = line.split()[1] + if (line[0] in (u'/', u'\n')): + continue + trie_add(u''.join([u'{}'.format(line.strip())]), + private=private_section) + update_tld_names_container(cls.local_path, trie) + local_file.close() + except IOError as err: + cls.update_tld_names(fail_silently=fail_silently) + retry_count += 1 + return cls.get_tld_names(fail_silently=fail_silently, retry_count=retry_count) + except Exception as err: + if fail_silently: + return None + else: + raise err + finally: + try: + local_file.close() + except Exception: + pass + return _tld_names + + +class MozillaTLDSourceParser(BaseMozillaTLDSourceParser): + u'Mozilla TLD source.' + uid = u'mozilla' + source_url = u'http://mxr.mozilla.org/mozilla/source/netwerk/dns/src/effective_tld_names.dat?raw=1' + local_path = u'res/effective_tld_names.dat.txt' + + +def process_url(url, fail_silently=False, fix_protocol=False, search_public=True, search_private=True, parser_class=MozillaTLDSourceParser): + u'Process URL.\n\n :param parser_class:\n :param url:\n :param fail_silently:\n :param fix_protocol:\n :param search_public:\n :param search_private:\n :return:\n ' + if (not (search_public or search_private)): + raise TldImproperlyConfigured( + u'Either `search_public` or `search_private` (or both) shall be set to True.') + _tld_names = get_tld_names( + fail_silently=fail_silently, parser_class=parser_class) + if (not isinstance(url, SplitResult)): + url = url.lower() + if (fix_protocol and (not url.startswith((u'//', u'http://', u'https://')))): + url = u''.join([u'https://', u'{}'.format(url)]) + parsed_url = urlsplit(url) + else: + parsed_url = url + domain_name = parsed_url.hostname + if (not domain_name): + if fail_silently: + return (None, None, parsed_url) + else: + raise TldBadUrl(url=url) + domain_parts = domain_name.split(u'.') + tld_names_local_path = parser_class.local_path + node = _tld_names[tld_names_local_path].root + current_length = 0 + tld_length = 0 + match = None + len_domain_parts = len(domain_parts) + for i in reversed(range(len_domain_parts)): + part = domain_parts[i] + if (node.children is None): + break + if (part == node.exception): + break + child = node.children.get(part) + if (child is None): + child = node.children.get(u'*') + if (child is None): + break + current_length += 1 + node = child + if node.leaf: + tld_length = current_length + match = node + if ((match is None) or (not match.leaf) or ((not search_public) and (not match.private)) or ((not search_private) and match.private)): + if fail_silently: + return (None, None, parsed_url) + else: + raise TldDomainNotFound(domain_name=domain_name) + if (len_domain_parts == tld_length): + non_zero_i = (- 1) + else: + non_zero_i = max(1, (len_domain_parts - tld_length)) + return (domain_parts, non_zero_i, parsed_url) + + +def get_fld(url, fail_silently=False, fix_protocol=False, search_public=True, search_private=True, parser_class=MozillaTLDSourceParser, **kwargs): + u"Extract the first level domain.\n\n Extract the top level domain based on the mozilla's effective TLD names\n dat file. Returns a string. May throw ``TldBadUrl`` or\n ``TldDomainNotFound`` exceptions if there's bad URL provided or no TLD\n match found respectively.\n\n :param url: URL to get top level domain from.\n :param fail_silently: If set to True, no exceptions are raised and None\n is returned on failure.\n :param fix_protocol: If set to True, missing or wrong protocol is\n ignored (https is appended instead).\n :param search_public: If set to True, search in public domains.\n :param search_private: If set to True, search in private domains.\n :param parser_class:\n :type url: str\n :type fail_silently: bool\n :type fix_protocol: bool\n :type search_public: bool\n :type search_private: bool\n :return: String with top level domain (if ``as_object`` argument\n is set to False) or a ``tld.utils.Result`` object (if ``as_object``\n argument is set to True); returns None on failure.\n :rtype: str\n " + if (u'as_object' in kwargs): + raise TldImproperlyConfigured( + u'`as_object` argument is deprecated for `get_fld`. Use `get_tld` instead.') + (domain_parts, non_zero_i, parsed_url) = process_url(url=url, fail_silently=fail_silently, + fix_protocol=fix_protocol, search_public=search_public, search_private=search_private, parser_class=parser_class) + if (domain_parts is None): + return None + if (non_zero_i < 0): + return parsed_url.hostname + return u'.'.join(domain_parts[(non_zero_i - 1):]) + + +def get_tld(url, fail_silently=False, as_object=False, fix_protocol=False, search_public=True, search_private=True, parser_class=MozillaTLDSourceParser): + u"Extract the top level domain.\n\n Extract the top level domain based on the mozilla's effective TLD names\n dat file. Returns a string. May throw ``TldBadUrl`` or\n ``TldDomainNotFound`` exceptions if there's bad URL provided or no TLD\n match found respectively.\n\n :param url: URL to get top level domain from.\n :param fail_silently: If set to True, no exceptions are raised and None\n is returned on failure.\n :param as_object: If set to True, ``tld.utils.Result`` object is returned,\n ``domain``, ``suffix`` and ``tld`` properties.\n :param fix_protocol: If set to True, missing or wrong protocol is\n ignored (https is appended instead).\n :param search_public: If set to True, search in public domains.\n :param search_private: If set to True, search in private domains.\n :param parser_class:\n :type url: str\n :type fail_silently: bool\n :type as_object: bool\n :type fix_protocol: bool\n :type search_public: bool\n :type search_private: bool\n :return: String with top level domain (if ``as_object`` argument\n is set to False) or a ``tld.utils.Result`` object (if ``as_object``\n argument is set to True); returns None on failure.\n :rtype: str\n " + (domain_parts, non_zero_i, parsed_url) = process_url(url=url, fail_silently=fail_silently, + fix_protocol=fix_protocol, search_public=search_public, search_private=search_private, parser_class=parser_class) + if (domain_parts is None): + return None + if (not as_object): + if (non_zero_i < 0): + return parsed_url.hostname + return u'.'.join(domain_parts[non_zero_i:]) + if (non_zero_i < 0): + subdomain = u'' + domain = u'' + _tld = parsed_url.hostname + else: + subdomain = u'.'.join(domain_parts[:(non_zero_i - 1)]) + domain = u'.'.join(domain_parts[(non_zero_i - 1):non_zero_i]) + _tld = u'.'.join(domain_parts[non_zero_i:]) + return Result(subdomain=subdomain, domain=domain, tld=_tld, parsed_url=parsed_url) + + +def parse_tld(url, fail_silently=False, fix_protocol=False, search_public=True, search_private=True, parser_class=MozillaTLDSourceParser): + u'Parse TLD into parts.\n\n :param url:\n :param fail_silently:\n :param fix_protocol:\n :param search_public:\n :param search_private:\n :param parser_class:\n :return:\n :rtype: tuple\n ' + try: + obj = get_tld(url, fail_silently=fail_silently, as_object=True, fix_protocol=fix_protocol, + search_public=search_public, search_private=search_private, parser_class=parser_class) + _tld = obj.tld + domain = obj.domain + subdomain = obj.subdomain + except (TldBadUrl, TldDomainNotFound, TldImproperlyConfigured, TldIOError): + _tld = None + domain = None + subdomain = None + return (_tld, domain, subdomain) + + +def is_tld(value, search_public=True, search_private=True, parser_class=MozillaTLDSourceParser): + u'Check if given URL is tld.\n\n :param value: URL to get top level domain from.\n :param search_public: If set to True, search in public domains.\n :param search_private: If set to True, search in private domains.\n :param parser_class:\n :type value: str\n :type search_public: bool\n :type search_private: bool\n :return:\n :rtype: bool\n ' + _tld = get_tld(url=value, fail_silently=True, fix_protocol=True, + search_public=search_public, search_private=search_private, parser_class=parser_class) + return (value == _tld) + + +def reset_tld_names(tld_names_local_path=None): + u'Reset the ``tld_names`` to empty value.\n\n If ``tld_names_local_path`` is given, removes specified\n entry from ``tld_names`` instead.\n\n :param tld_names_local_path:\n :type tld_names_local_path: str\n :return:\n ' + if tld_names_local_path: + pop_tld_names_container(tld_names_local_path) + else: + global tld_names + tld_names = { + + } diff --git a/Contents/Libraries/Shared/typing.py b/Contents/Libraries/Shared/typing.py new file mode 100644 index 000000000..dd16d9af9 --- /dev/null +++ b/Contents/Libraries/Shared/typing.py @@ -0,0 +1,2550 @@ +from __future__ import absolute_import, unicode_literals + +import abc +from abc import abstractmethod, abstractproperty +import collections +import functools +import re as stdlib_re # Avoid confusion with the re we export. +import sys +import types +import copy +try: + import collections.abc as collections_abc +except ImportError: + import collections as collections_abc # Fallback for PY3.2. + + +# Please keep __all__ alphabetized within each category. +__all__ = [ + # Super-special typing primitives. + 'Any', + 'Callable', + 'ClassVar', + 'Final', + 'Generic', + 'Literal', + 'Optional', + 'Protocol', + 'Tuple', + 'Type', + 'TypeVar', + 'Union', + + # ABCs (from collections.abc). + 'AbstractSet', # collections.abc.Set. + 'GenericMeta', # subclass of abc.ABCMeta and a metaclass + # for 'Generic' and ABCs below. + 'ByteString', + 'Container', + 'ContextManager', + 'Hashable', + 'ItemsView', + 'Iterable', + 'Iterator', + 'KeysView', + 'Mapping', + 'MappingView', + 'MutableMapping', + 'MutableSequence', + 'MutableSet', + 'Sequence', + 'Sized', + 'ValuesView', + + # Structural checks, a.k.a. protocols. + 'Reversible', + 'SupportsAbs', + 'SupportsComplex', + 'SupportsFloat', + 'SupportsIndex', + 'SupportsInt', + + # Concrete collection types. + 'Counter', + 'Deque', + 'Dict', + 'DefaultDict', + 'List', + 'Set', + 'FrozenSet', + 'NamedTuple', # Not really a type. + 'TypedDict', # Not really a type. + 'Generator', + + # One-off things. + 'AnyStr', + 'cast', + 'final', + 'get_type_hints', + 'NewType', + 'no_type_check', + 'no_type_check_decorator', + 'NoReturn', + 'overload', + 'runtime_checkable', + 'Text', + 'TYPE_CHECKING', +] + +# The pseudo-submodules 're' and 'io' are part of the public +# namespace, but excluded from __all__ because they might stomp on +# legitimate imports of those modules. + + +def _qualname(x): + if sys.version_info[:2] >= (3, 3): + return x.__qualname__ + else: + # Fall back to just name. + return x.__name__ + + +def _trim_name(nm): + whitelist = ('_TypeAlias', '_ForwardRef', '_TypingBase', '_FinalTypingBase') + if nm.startswith('_') and nm not in whitelist: + nm = nm[1:] + return nm + + +class TypingMeta(type): + """Metaclass for most types defined in typing module + (not a part of public API). + + This also defines a dummy constructor (all the work for most typing + constructs is done in __new__) and a nicer repr(). + """ + + _is_protocol = False + + def __new__(cls, name, bases, namespace): + return super(TypingMeta, cls).__new__(cls, str(name), bases, namespace) + + @classmethod + def assert_no_subclassing(cls, bases): + for base in bases: + if isinstance(base, cls): + raise TypeError("Cannot subclass %s" % + (', '.join(map(_type_repr, bases)) or '()')) + + def __init__(self, *args, **kwds): + pass + + def _eval_type(self, globalns, localns): + """Override this in subclasses to interpret forward references. + + For example, List['C'] is internally stored as + List[_ForwardRef('C')], which should evaluate to List[C], + where C is an object found in globalns or localns (searching + localns first, of course). + """ + return self + + def _get_type_vars(self, tvars): + pass + + def __repr__(self): + qname = _trim_name(_qualname(self)) + return '%s.%s' % (self.__module__, qname) + + +class _TypingBase(object): + """Internal indicator of special typing constructs.""" + __metaclass__ = TypingMeta + __slots__ = ('__weakref__',) + + def __init__(self, *args, **kwds): + pass + + def __new__(cls, *args, **kwds): + """Constructor. + + This only exists to give a better error message in case + someone tries to subclass a special typing object (not a good idea). + """ + if (len(args) == 3 and + isinstance(args[0], str) and + isinstance(args[1], tuple)): + # Close enough. + raise TypeError("Cannot subclass %r" % cls) + return super(_TypingBase, cls).__new__(cls) + + # Things that are not classes also need these. + def _eval_type(self, globalns, localns): + return self + + def _get_type_vars(self, tvars): + pass + + def __repr__(self): + cls = type(self) + qname = _trim_name(_qualname(cls)) + return '%s.%s' % (cls.__module__, qname) + + def __call__(self, *args, **kwds): + raise TypeError("Cannot instantiate %r" % type(self)) + + +class _FinalTypingBase(_TypingBase): + """Internal mix-in class to prevent instantiation. + + Prevents instantiation unless _root=True is given in class call. + It is used to create pseudo-singleton instances Any, Union, Optional, etc. + """ + + __slots__ = () + + def __new__(cls, *args, **kwds): + self = super(_FinalTypingBase, cls).__new__(cls, *args, **kwds) + if '_root' in kwds and kwds['_root'] is True: + return self + raise TypeError("Cannot instantiate %r" % cls) + + def __reduce__(self): + return _trim_name(type(self).__name__) + + +class _ForwardRef(_TypingBase): + """Internal wrapper to hold a forward reference.""" + + __slots__ = ('__forward_arg__', '__forward_code__', + '__forward_evaluated__', '__forward_value__') + + def __init__(self, arg): + super(_ForwardRef, self).__init__(arg) + if not isinstance(arg, basestring): + raise TypeError('Forward reference must be a string -- got %r' % (arg,)) + try: + code = compile(arg, '<string>', 'eval') + except SyntaxError: + raise SyntaxError('Forward reference must be an expression -- got %r' % + (arg,)) + self.__forward_arg__ = arg + self.__forward_code__ = code + self.__forward_evaluated__ = False + self.__forward_value__ = None + + def _eval_type(self, globalns, localns): + if not self.__forward_evaluated__ or localns is not globalns: + if globalns is None and localns is None: + globalns = localns = {} + elif globalns is None: + globalns = localns + elif localns is None: + localns = globalns + self.__forward_value__ = _type_check( + eval(self.__forward_code__, globalns, localns), + "Forward references must evaluate to types.") + self.__forward_evaluated__ = True + return self.__forward_value__ + + def __eq__(self, other): + if not isinstance(other, _ForwardRef): + return NotImplemented + return (self.__forward_arg__ == other.__forward_arg__ and + self.__forward_value__ == other.__forward_value__) + + def __hash__(self): + return hash((self.__forward_arg__, self.__forward_value__)) + + def __instancecheck__(self, obj): + raise TypeError("Forward references cannot be used with isinstance().") + + def __subclasscheck__(self, cls): + raise TypeError("Forward references cannot be used with issubclass().") + + def __repr__(self): + return '_ForwardRef(%r)' % (self.__forward_arg__,) + + +class _TypeAlias(_TypingBase): + """Internal helper class for defining generic variants of concrete types. + + Note that this is not a type; let's call it a pseudo-type. It cannot + be used in instance and subclass checks in parameterized form, i.e. + ``isinstance(42, Match[str])`` raises ``TypeError`` instead of returning + ``False``. + """ + + __slots__ = ('name', 'type_var', 'impl_type', 'type_checker') + + def __init__(self, name, type_var, impl_type, type_checker): + """Initializer. + + Args: + name: The name, e.g. 'Pattern'. + type_var: The type parameter, e.g. AnyStr, or the + specific type, e.g. str. + impl_type: The implementation type. + type_checker: Function that takes an impl_type instance. + and returns a value that should be a type_var instance. + """ + assert isinstance(name, basestring), repr(name) + assert isinstance(impl_type, type), repr(impl_type) + assert not isinstance(impl_type, TypingMeta), repr(impl_type) + assert isinstance(type_var, (type, _TypingBase)), repr(type_var) + self.name = name + self.type_var = type_var + self.impl_type = impl_type + self.type_checker = type_checker + + def __repr__(self): + return "%s[%s]" % (self.name, _type_repr(self.type_var)) + + def __getitem__(self, parameter): + if not isinstance(self.type_var, TypeVar): + raise TypeError("%s cannot be further parameterized." % self) + if self.type_var.__constraints__ and isinstance(parameter, type): + if not issubclass(parameter, self.type_var.__constraints__): + raise TypeError("%s is not a valid substitution for %s." % + (parameter, self.type_var)) + if isinstance(parameter, TypeVar) and parameter is not self.type_var: + raise TypeError("%s cannot be re-parameterized." % self) + return self.__class__(self.name, parameter, + self.impl_type, self.type_checker) + + def __eq__(self, other): + if not isinstance(other, _TypeAlias): + return NotImplemented + return self.name == other.name and self.type_var == other.type_var + + def __hash__(self): + return hash((self.name, self.type_var)) + + def __instancecheck__(self, obj): + if not isinstance(self.type_var, TypeVar): + raise TypeError("Parameterized type aliases cannot be used " + "with isinstance().") + return isinstance(obj, self.impl_type) + + def __subclasscheck__(self, cls): + if not isinstance(self.type_var, TypeVar): + raise TypeError("Parameterized type aliases cannot be used " + "with issubclass().") + return issubclass(cls, self.impl_type) + + +def _get_type_vars(types, tvars): + for t in types: + if isinstance(t, TypingMeta) or isinstance(t, _TypingBase): + t._get_type_vars(tvars) + + +def _type_vars(types): + tvars = [] + _get_type_vars(types, tvars) + return tuple(tvars) + + +def _eval_type(t, globalns, localns): + if isinstance(t, TypingMeta) or isinstance(t, _TypingBase): + return t._eval_type(globalns, localns) + return t + + +def _type_check(arg, msg): + """Check that the argument is a type, and return it (internal helper). + + As a special case, accept None and return type(None) instead. + Also, _TypeAlias instances (e.g. Match, Pattern) are acceptable. + + The msg argument is a human-readable error message, e.g. + + "Union[arg, ...]: arg should be a type." + + We append the repr() of the actual value (truncated to 100 chars). + """ + if arg is None: + return type(None) + if isinstance(arg, basestring): + arg = _ForwardRef(arg) + if ( + isinstance(arg, _TypingBase) and type(arg).__name__ == '_ClassVar' or + not isinstance(arg, (type, _TypingBase)) and not callable(arg) + ): + raise TypeError(msg + " Got %.100r." % (arg,)) + # Bare Union etc. are not valid as type arguments + if ( + type(arg).__name__ in ('_Union', '_Optional') and + not getattr(arg, '__origin__', None) or + isinstance(arg, TypingMeta) and arg._gorg in (Generic, Protocol) + ): + raise TypeError("Plain %s is not valid as type argument" % arg) + return arg + + +def _type_repr(obj): + """Return the repr() of an object, special-casing types (internal helper). + + If obj is a type, we return a shorter version than the default + type.__repr__, based on the module and qualified name, which is + typically enough to uniquely identify a type. For everything + else, we fall back on repr(obj). + """ + if isinstance(obj, type) and not isinstance(obj, TypingMeta): + if obj.__module__ == '__builtin__': + return _qualname(obj) + return '%s.%s' % (obj.__module__, _qualname(obj)) + if obj is Ellipsis: + return '...' + if isinstance(obj, types.FunctionType): + return obj.__name__ + return repr(obj) + + +class ClassVarMeta(TypingMeta): + """Metaclass for _ClassVar""" + + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + self = super(ClassVarMeta, cls).__new__(cls, name, bases, namespace) + return self + + +class _ClassVar(_FinalTypingBase): + """Special type construct to mark class variables. + + An annotation wrapped in ClassVar indicates that a given + attribute is intended to be used as a class variable and + should not be set on instances of that class. Usage:: + + class Starship: + stats = {} # type: ClassVar[Dict[str, int]] # class variable + damage = 10 # type: int # instance variable + + ClassVar accepts only types and cannot be further subscribed. + + Note that ClassVar is not a class itself, and should not + be used with isinstance() or issubclass(). + """ + + __metaclass__ = ClassVarMeta + __slots__ = ('__type__',) + + def __init__(self, tp=None, _root=False): + self.__type__ = tp + + def __getitem__(self, item): + cls = type(self) + if self.__type__ is None: + return cls(_type_check(item, + '{} accepts only types.'.format(cls.__name__[1:])), + _root=True) + raise TypeError('{} cannot be further subscripted' + .format(cls.__name__[1:])) + + def _eval_type(self, globalns, localns): + return type(self)(_eval_type(self.__type__, globalns, localns), + _root=True) + + def __repr__(self): + r = super(_ClassVar, self).__repr__() + if self.__type__ is not None: + r += '[{}]'.format(_type_repr(self.__type__)) + return r + + def __hash__(self): + return hash((type(self).__name__, self.__type__)) + + def __eq__(self, other): + if not isinstance(other, _ClassVar): + return NotImplemented + if self.__type__ is not None: + return self.__type__ == other.__type__ + return self is other + + +ClassVar = _ClassVar(_root=True) + + +class _FinalMeta(TypingMeta): + """Metaclass for _Final""" + + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + self = super(_FinalMeta, cls).__new__(cls, name, bases, namespace) + return self + + +class _Final(_FinalTypingBase): + """A special typing construct to indicate that a name + cannot be re-assigned or overridden in a subclass. + For example: + + MAX_SIZE: Final = 9000 + MAX_SIZE += 1 # Error reported by type checker + + class Connection: + TIMEOUT: Final[int] = 10 + class FastConnector(Connection): + TIMEOUT = 1 # Error reported by type checker + + There is no runtime checking of these properties. + """ + + __metaclass__ = _FinalMeta + __slots__ = ('__type__',) + + def __init__(self, tp=None, **kwds): + self.__type__ = tp + + def __getitem__(self, item): + cls = type(self) + if self.__type__ is None: + return cls(_type_check(item, + '{} accepts only single type.'.format(cls.__name__[1:])), + _root=True) + raise TypeError('{} cannot be further subscripted' + .format(cls.__name__[1:])) + + def _eval_type(self, globalns, localns): + new_tp = _eval_type(self.__type__, globalns, localns) + if new_tp == self.__type__: + return self + return type(self)(new_tp, _root=True) + + def __repr__(self): + r = super(_Final, self).__repr__() + if self.__type__ is not None: + r += '[{}]'.format(_type_repr(self.__type__)) + return r + + def __hash__(self): + return hash((type(self).__name__, self.__type__)) + + def __eq__(self, other): + if not isinstance(other, _Final): + return NotImplemented + if self.__type__ is not None: + return self.__type__ == other.__type__ + return self is other + + +Final = _Final(_root=True) + + +def final(f): + """This decorator can be used to indicate to type checkers that + the decorated method cannot be overridden, and decorated class + cannot be subclassed. For example: + + class Base: + @final + def done(self) -> None: + ... + class Sub(Base): + def done(self) -> None: # Error reported by type checker + ... + @final + class Leaf: + ... + class Other(Leaf): # Error reported by type checker + ... + + There is no runtime checking of these properties. + """ + return f + + +class _LiteralMeta(TypingMeta): + """Metaclass for _Literal""" + + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + self = super(_LiteralMeta, cls).__new__(cls, name, bases, namespace) + return self + + +class _Literal(_FinalTypingBase): + """A type that can be used to indicate to type checkers that the + corresponding value has a value literally equivalent to the + provided parameter. For example: + + var: Literal[4] = 4 + + The type checker understands that 'var' is literally equal to the + value 4 and no other value. + + Literal[...] cannot be subclassed. There is no runtime checking + verifying that the parameter is actually a value instead of a type. + """ + + __metaclass__ = _LiteralMeta + __slots__ = ('__values__',) + + def __init__(self, values=None, **kwds): + self.__values__ = values + + def __getitem__(self, item): + cls = type(self) + if self.__values__ is None: + if not isinstance(item, tuple): + item = (item,) + return cls(values=item, + _root=True) + raise TypeError('{} cannot be further subscripted' + .format(cls.__name__[1:])) + + def _eval_type(self, globalns, localns): + return self + + def __repr__(self): + r = super(_Literal, self).__repr__() + if self.__values__ is not None: + r += '[{}]'.format(', '.join(map(_type_repr, self.__values__))) + return r + + def __hash__(self): + return hash((type(self).__name__, self.__values__)) + + def __eq__(self, other): + if not isinstance(other, _Literal): + return NotImplemented + if self.__values__ is not None: + return self.__values__ == other.__values__ + return self is other + + +Literal = _Literal(_root=True) + + +class AnyMeta(TypingMeta): + """Metaclass for Any.""" + + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + self = super(AnyMeta, cls).__new__(cls, name, bases, namespace) + return self + + +class _Any(_FinalTypingBase): + """Special type indicating an unconstrained type. + + - Any is compatible with every type. + - Any assumed to have all methods. + - All values assumed to be instances of Any. + + Note that all the above statements are true from the point of view of + static type checkers. At runtime, Any should not be used with instance + or class checks. + """ + __metaclass__ = AnyMeta + __slots__ = () + + def __instancecheck__(self, obj): + raise TypeError("Any cannot be used with isinstance().") + + def __subclasscheck__(self, cls): + raise TypeError("Any cannot be used with issubclass().") + + +Any = _Any(_root=True) + + +class NoReturnMeta(TypingMeta): + """Metaclass for NoReturn.""" + + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + self = super(NoReturnMeta, cls).__new__(cls, name, bases, namespace) + return self + + +class _NoReturn(_FinalTypingBase): + """Special type indicating functions that never return. + Example:: + + from typing import NoReturn + + def stop() -> NoReturn: + raise Exception('no way') + + This type is invalid in other positions, e.g., ``List[NoReturn]`` + will fail in static type checkers. + """ + __metaclass__ = NoReturnMeta + __slots__ = () + + def __instancecheck__(self, obj): + raise TypeError("NoReturn cannot be used with isinstance().") + + def __subclasscheck__(self, cls): + raise TypeError("NoReturn cannot be used with issubclass().") + + +NoReturn = _NoReturn(_root=True) + + +class TypeVarMeta(TypingMeta): + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + return super(TypeVarMeta, cls).__new__(cls, name, bases, namespace) + + +class TypeVar(_TypingBase): + """Type variable. + + Usage:: + + T = TypeVar('T') # Can be anything + A = TypeVar('A', str, bytes) # Must be str or bytes + + Type variables exist primarily for the benefit of static type + checkers. They serve as the parameters for generic types as well + as for generic function definitions. See class Generic for more + information on generic types. Generic functions work as follows: + + def repeat(x: T, n: int) -> List[T]: + '''Return a list containing n references to x.''' + return [x]*n + + def longest(x: A, y: A) -> A: + '''Return the longest of two strings.''' + return x if len(x) >= len(y) else y + + The latter example's signature is essentially the overloading + of (str, str) -> str and (bytes, bytes) -> bytes. Also note + that if the arguments are instances of some subclass of str, + the return type is still plain str. + + At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError. + + Type variables defined with covariant=True or contravariant=True + can be used do declare covariant or contravariant generic types. + See PEP 484 for more details. By default generic types are invariant + in all type variables. + + Type variables can be introspected. e.g.: + + T.__name__ == 'T' + T.__constraints__ == () + T.__covariant__ == False + T.__contravariant__ = False + A.__constraints__ == (str, bytes) + """ + + __metaclass__ = TypeVarMeta + __slots__ = ('__name__', '__bound__', '__constraints__', + '__covariant__', '__contravariant__') + + def __init__(self, name, *constraints, **kwargs): + super(TypeVar, self).__init__(name, *constraints, **kwargs) + bound = kwargs.get('bound', None) + covariant = kwargs.get('covariant', False) + contravariant = kwargs.get('contravariant', False) + self.__name__ = name + if covariant and contravariant: + raise ValueError("Bivariant types are not supported.") + self.__covariant__ = bool(covariant) + self.__contravariant__ = bool(contravariant) + if constraints and bound is not None: + raise TypeError("Constraints cannot be combined with bound=...") + if constraints and len(constraints) == 1: + raise TypeError("A single constraint is not allowed") + msg = "TypeVar(name, constraint, ...): constraints must be types." + self.__constraints__ = tuple(_type_check(t, msg) for t in constraints) + if bound: + self.__bound__ = _type_check(bound, "Bound must be a type.") + else: + self.__bound__ = None + + def _get_type_vars(self, tvars): + if self not in tvars: + tvars.append(self) + + def __repr__(self): + if self.__covariant__: + prefix = '+' + elif self.__contravariant__: + prefix = '-' + else: + prefix = '~' + return prefix + self.__name__ + + def __instancecheck__(self, instance): + raise TypeError("Type variables cannot be used with isinstance().") + + def __subclasscheck__(self, cls): + raise TypeError("Type variables cannot be used with issubclass().") + + +# Some unconstrained type variables. These are used by the container types. +# (These are not for export.) +T = TypeVar('T') # Any type. +KT = TypeVar('KT') # Key type. +VT = TypeVar('VT') # Value type. +T_co = TypeVar('T_co', covariant=True) # Any type covariant containers. +V_co = TypeVar('V_co', covariant=True) # Any type covariant containers. +VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers. +T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant. + +# A useful type variable with constraints. This represents string types. +# (This one *is* for export!) +AnyStr = TypeVar('AnyStr', bytes, unicode) + + +def _replace_arg(arg, tvars, args): + """An internal helper function: replace arg if it is a type variable + found in tvars with corresponding substitution from args or + with corresponding substitution sub-tree if arg is a generic type. + """ + + if tvars is None: + tvars = [] + if hasattr(arg, '_subs_tree') and isinstance(arg, (GenericMeta, _TypingBase)): + return arg._subs_tree(tvars, args) + if isinstance(arg, TypeVar): + for i, tvar in enumerate(tvars): + if arg == tvar: + return args[i] + return arg + + +# Special typing constructs Union, Optional, Generic, Callable and Tuple +# use three special attributes for internal bookkeeping of generic types: +# * __parameters__ is a tuple of unique free type parameters of a generic +# type, for example, Dict[T, T].__parameters__ == (T,); +# * __origin__ keeps a reference to a type that was subscripted, +# e.g., Union[T, int].__origin__ == Union; +# * __args__ is a tuple of all arguments used in subscripting, +# e.g., Dict[T, int].__args__ == (T, int). + + +def _subs_tree(cls, tvars=None, args=None): + """An internal helper function: calculate substitution tree + for generic cls after replacing its type parameters with + substitutions in tvars -> args (if any). + Repeat the same following __origin__'s. + + Return a list of arguments with all possible substitutions + performed. Arguments that are generic classes themselves are represented + as tuples (so that no new classes are created by this function). + For example: _subs_tree(List[Tuple[int, T]][str]) == [(Tuple, int, str)] + """ + + if cls.__origin__ is None: + return cls + # Make of chain of origins (i.e. cls -> cls.__origin__) + current = cls.__origin__ + orig_chain = [] + while current.__origin__ is not None: + orig_chain.append(current) + current = current.__origin__ + # Replace type variables in __args__ if asked ... + tree_args = [] + for arg in cls.__args__: + tree_args.append(_replace_arg(arg, tvars, args)) + # ... then continue replacing down the origin chain. + for ocls in orig_chain: + new_tree_args = [] + for arg in ocls.__args__: + new_tree_args.append(_replace_arg(arg, ocls.__parameters__, tree_args)) + tree_args = new_tree_args + return tree_args + + +def _remove_dups_flatten(parameters): + """An internal helper for Union creation and substitution: flatten Union's + among parameters, then remove duplicates and strict subclasses. + """ + + # Flatten out Union[Union[...], ...]. + params = [] + for p in parameters: + if isinstance(p, _Union) and p.__origin__ is Union: + params.extend(p.__args__) + elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union: + params.extend(p[1:]) + else: + params.append(p) + # Weed out strict duplicates, preserving the first of each occurrence. + all_params = set(params) + if len(all_params) < len(params): + new_params = [] + for t in params: + if t in all_params: + new_params.append(t) + all_params.remove(t) + params = new_params + assert not all_params, all_params + # Weed out subclasses. + # E.g. Union[int, Employee, Manager] == Union[int, Employee]. + # If object is present it will be sole survivor among proper classes. + # Never discard type variables. + # (In particular, Union[str, AnyStr] != AnyStr.) + all_params = set(params) + for t1 in params: + if not isinstance(t1, type): + continue + if any(isinstance(t2, type) and issubclass(t1, t2) + for t2 in all_params - {t1} + if not (isinstance(t2, GenericMeta) and + t2.__origin__ is not None)): + all_params.remove(t1) + return tuple(t for t in params if t in all_params) + + +def _check_generic(cls, parameters): + # Check correct count for parameters of a generic cls (internal helper). + if not cls.__parameters__: + raise TypeError("%s is not a generic class" % repr(cls)) + alen = len(parameters) + elen = len(cls.__parameters__) + if alen != elen: + raise TypeError("Too %s parameters for %s; actual %s, expected %s" % + ("many" if alen > elen else "few", repr(cls), alen, elen)) + + +_cleanups = [] + + +def _tp_cache(func): + maxsize = 128 + cache = {} + _cleanups.append(cache.clear) + + @functools.wraps(func) + def inner(*args): + key = args + try: + return cache[key] + except TypeError: + # Assume it's an unhashable argument. + return func(*args) + except KeyError: + value = func(*args) + if len(cache) >= maxsize: + # If the cache grows too much, just start over. + cache.clear() + cache[key] = value + return value + + return inner + + +class UnionMeta(TypingMeta): + """Metaclass for Union.""" + + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + return super(UnionMeta, cls).__new__(cls, name, bases, namespace) + + +class _Union(_FinalTypingBase): + """Union type; Union[X, Y] means either X or Y. + + To define a union, use e.g. Union[int, str]. Details: + + - The arguments must be types and there must be at least one. + + - None as an argument is a special case and is replaced by + type(None). + + - Unions of unions are flattened, e.g.:: + + Union[Union[int, str], float] == Union[int, str, float] + + - Unions of a single argument vanish, e.g.:: + + Union[int] == int # The constructor actually returns int + + - Redundant arguments are skipped, e.g.:: + + Union[int, str, int] == Union[int, str] + + - When comparing unions, the argument order is ignored, e.g.:: + + Union[int, str] == Union[str, int] + + - When two arguments have a subclass relationship, the least + derived argument is kept, e.g.:: + + class Employee: pass + class Manager(Employee): pass + Union[int, Employee, Manager] == Union[int, Employee] + Union[Manager, int, Employee] == Union[int, Employee] + Union[Employee, Manager] == Employee + + - Similar for object:: + + Union[int, object] == object + + - You cannot subclass or instantiate a union. + + - You can use Optional[X] as a shorthand for Union[X, None]. + """ + + __metaclass__ = UnionMeta + __slots__ = ('__parameters__', '__args__', '__origin__', '__tree_hash__') + + def __new__(cls, parameters=None, origin=None, *args, **kwds): + self = super(_Union, cls).__new__(cls, parameters, origin, *args, **kwds) + if origin is None: + self.__parameters__ = None + self.__args__ = None + self.__origin__ = None + self.__tree_hash__ = hash(frozenset(('Union',))) + return self + if not isinstance(parameters, tuple): + raise TypeError("Expected parameters=<tuple>") + if origin is Union: + parameters = _remove_dups_flatten(parameters) + # It's not a union if there's only one type left. + if len(parameters) == 1: + return parameters[0] + self.__parameters__ = _type_vars(parameters) + self.__args__ = parameters + self.__origin__ = origin + # Pre-calculate the __hash__ on instantiation. + # This improves speed for complex substitutions. + subs_tree = self._subs_tree() + if isinstance(subs_tree, tuple): + self.__tree_hash__ = hash(frozenset(subs_tree)) + else: + self.__tree_hash__ = hash(subs_tree) + return self + + def _eval_type(self, globalns, localns): + if self.__args__ is None: + return self + ev_args = tuple(_eval_type(t, globalns, localns) for t in self.__args__) + ev_origin = _eval_type(self.__origin__, globalns, localns) + if ev_args == self.__args__ and ev_origin == self.__origin__: + # Everything is already evaluated. + return self + return self.__class__(ev_args, ev_origin, _root=True) + + def _get_type_vars(self, tvars): + if self.__origin__ and self.__parameters__: + _get_type_vars(self.__parameters__, tvars) + + def __repr__(self): + if self.__origin__ is None: + return super(_Union, self).__repr__() + tree = self._subs_tree() + if not isinstance(tree, tuple): + return repr(tree) + return tree[0]._tree_repr(tree) + + def _tree_repr(self, tree): + arg_list = [] + for arg in tree[1:]: + if not isinstance(arg, tuple): + arg_list.append(_type_repr(arg)) + else: + arg_list.append(arg[0]._tree_repr(arg)) + return super(_Union, self).__repr__() + '[%s]' % ', '.join(arg_list) + + @_tp_cache + def __getitem__(self, parameters): + if parameters == (): + raise TypeError("Cannot take a Union of no types.") + if not isinstance(parameters, tuple): + parameters = (parameters,) + if self.__origin__ is None: + msg = "Union[arg, ...]: each arg must be a type." + else: + msg = "Parameters to generic types must be types." + parameters = tuple(_type_check(p, msg) for p in parameters) + if self is not Union: + _check_generic(self, parameters) + return self.__class__(parameters, origin=self, _root=True) + + def _subs_tree(self, tvars=None, args=None): + if self is Union: + return Union # Nothing to substitute + tree_args = _subs_tree(self, tvars, args) + tree_args = _remove_dups_flatten(tree_args) + if len(tree_args) == 1: + return tree_args[0] # Union of a single type is that type + return (Union,) + tree_args + + def __eq__(self, other): + if isinstance(other, _Union): + return self.__tree_hash__ == other.__tree_hash__ + elif self is not Union: + return self._subs_tree() == other + else: + return self is other + + def __hash__(self): + return self.__tree_hash__ + + def __instancecheck__(self, obj): + raise TypeError("Unions cannot be used with isinstance().") + + def __subclasscheck__(self, cls): + raise TypeError("Unions cannot be used with issubclass().") + + +Union = _Union(_root=True) + + +class OptionalMeta(TypingMeta): + """Metaclass for Optional.""" + + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + return super(OptionalMeta, cls).__new__(cls, name, bases, namespace) + + +class _Optional(_FinalTypingBase): + """Optional type. + + Optional[X] is equivalent to Union[X, None]. + """ + + __metaclass__ = OptionalMeta + __slots__ = () + + @_tp_cache + def __getitem__(self, arg): + arg = _type_check(arg, "Optional[t] requires a single type.") + return Union[arg, type(None)] + + +Optional = _Optional(_root=True) + + +def _next_in_mro(cls): + """Helper for Generic.__new__. + + Returns the class after the last occurrence of Generic or + Generic[...] in cls.__mro__. + """ + next_in_mro = object + # Look for the last occurrence of Generic or Generic[...]. + for i, c in enumerate(cls.__mro__[:-1]): + if isinstance(c, GenericMeta) and c._gorg is Generic: + next_in_mro = cls.__mro__[i + 1] + return next_in_mro + + +def _make_subclasshook(cls): + """Construct a __subclasshook__ callable that incorporates + the associated __extra__ class in subclass checks performed + against cls. + """ + if isinstance(cls.__extra__, abc.ABCMeta): + # The logic mirrors that of ABCMeta.__subclasscheck__. + # Registered classes need not be checked here because + # cls and its extra share the same _abc_registry. + def __extrahook__(cls, subclass): + res = cls.__extra__.__subclasshook__(subclass) + if res is not NotImplemented: + return res + if cls.__extra__ in getattr(subclass, '__mro__', ()): + return True + for scls in cls.__extra__.__subclasses__(): + if isinstance(scls, GenericMeta): + continue + if issubclass(subclass, scls): + return True + return NotImplemented + else: + # For non-ABC extras we'll just call issubclass(). + def __extrahook__(cls, subclass): + if cls.__extra__ and issubclass(subclass, cls.__extra__): + return True + return NotImplemented + return classmethod(__extrahook__) + + +class GenericMeta(TypingMeta, abc.ABCMeta): + """Metaclass for generic types. + + This is a metaclass for typing.Generic and generic ABCs defined in + typing module. User defined subclasses of GenericMeta can override + __new__ and invoke super().__new__. Note that GenericMeta.__new__ + has strict rules on what is allowed in its bases argument: + * plain Generic is disallowed in bases; + * Generic[...] should appear in bases at most once; + * if Generic[...] is present, then it should list all type variables + that appear in other bases. + In addition, type of all generic bases is erased, e.g., C[int] is + stripped to plain C. + """ + + def __new__(cls, name, bases, namespace, + tvars=None, args=None, origin=None, extra=None, orig_bases=None): + """Create a new generic class. GenericMeta.__new__ accepts + keyword arguments that are used for internal bookkeeping, therefore + an override should pass unused keyword arguments to super(). + """ + if tvars is not None: + # Called from __getitem__() below. + assert origin is not None + assert all(isinstance(t, TypeVar) for t in tvars), tvars + else: + # Called from class statement. + assert tvars is None, tvars + assert args is None, args + assert origin is None, origin + + # Get the full set of tvars from the bases. + tvars = _type_vars(bases) + # Look for Generic[T1, ..., Tn]. + # If found, tvars must be a subset of it. + # If not found, tvars is it. + # Also check for and reject plain Generic, + # and reject multiple Generic[...]. + gvars = None + for base in bases: + if base is Generic: + raise TypeError("Cannot inherit from plain Generic") + if (isinstance(base, GenericMeta) and + base.__origin__ in (Generic, Protocol)): + if gvars is not None: + raise TypeError( + "Cannot inherit from Generic[...] or" + " Protocol[...] multiple times.") + gvars = base.__parameters__ + if gvars is None: + gvars = tvars + else: + tvarset = set(tvars) + gvarset = set(gvars) + if not tvarset <= gvarset: + raise TypeError( + "Some type variables (%s) " + "are not listed in %s[%s]" % + (", ".join(str(t) for t in tvars if t not in gvarset), + "Generic" if any(b.__origin__ is Generic + for b in bases) else "Protocol", + ", ".join(str(g) for g in gvars))) + tvars = gvars + + initial_bases = bases + if extra is None: + extra = namespace.get('__extra__') + if extra is not None and type(extra) is abc.ABCMeta and extra not in bases: + bases = (extra,) + bases + bases = tuple(b._gorg if isinstance(b, GenericMeta) else b for b in bases) + + # remove bare Generic from bases if there are other generic bases + if any(isinstance(b, GenericMeta) and b is not Generic for b in bases): + bases = tuple(b for b in bases if b is not Generic) + namespace.update({'__origin__': origin, '__extra__': extra}) + self = super(GenericMeta, cls).__new__(cls, name, bases, namespace) + super(GenericMeta, self).__setattr__('_gorg', + self if not origin else origin._gorg) + + self.__parameters__ = tvars + # Be prepared that GenericMeta will be subclassed by TupleMeta + # and CallableMeta, those two allow ..., (), or [] in __args___. + self.__args__ = tuple(Ellipsis if a is _TypingEllipsis else + () if a is _TypingEmpty else + a for a in args) if args else None + # Speed hack (https://github.com/python/typing/issues/196). + self.__next_in_mro__ = _next_in_mro(self) + # Preserve base classes on subclassing (__bases__ are type erased now). + if orig_bases is None: + self.__orig_bases__ = initial_bases + + # This allows unparameterized generic collections to be used + # with issubclass() and isinstance() in the same way as their + # collections.abc counterparts (e.g., isinstance([], Iterable)). + if ( + '__subclasshook__' not in namespace and extra or + # allow overriding + getattr(self.__subclasshook__, '__name__', '') == '__extrahook__' + ): + self.__subclasshook__ = _make_subclasshook(self) + + if origin and hasattr(origin, '__qualname__'): # Fix for Python 3.2. + self.__qualname__ = origin.__qualname__ + self.__tree_hash__ = (hash(self._subs_tree()) if origin else + super(GenericMeta, self).__hash__()) + return self + + def __init__(self, *args, **kwargs): + super(GenericMeta, self).__init__(*args, **kwargs) + if isinstance(self.__extra__, abc.ABCMeta): + self._abc_registry = self.__extra__._abc_registry + self._abc_cache = self.__extra__._abc_cache + elif self.__origin__ is not None: + self._abc_registry = self.__origin__._abc_registry + self._abc_cache = self.__origin__._abc_cache + + # _abc_negative_cache and _abc_negative_cache_version + # realised as descriptors, since GenClass[t1, t2, ...] always + # share subclass info with GenClass. + # This is an important memory optimization. + @property + def _abc_negative_cache(self): + if isinstance(self.__extra__, abc.ABCMeta): + return self.__extra__._abc_negative_cache + return self._gorg._abc_generic_negative_cache + + @_abc_negative_cache.setter + def _abc_negative_cache(self, value): + if self.__origin__ is None: + if isinstance(self.__extra__, abc.ABCMeta): + self.__extra__._abc_negative_cache = value + else: + self._abc_generic_negative_cache = value + + @property + def _abc_negative_cache_version(self): + if isinstance(self.__extra__, abc.ABCMeta): + return self.__extra__._abc_negative_cache_version + return self._gorg._abc_generic_negative_cache_version + + @_abc_negative_cache_version.setter + def _abc_negative_cache_version(self, value): + if self.__origin__ is None: + if isinstance(self.__extra__, abc.ABCMeta): + self.__extra__._abc_negative_cache_version = value + else: + self._abc_generic_negative_cache_version = value + + def _get_type_vars(self, tvars): + if self.__origin__ and self.__parameters__: + _get_type_vars(self.__parameters__, tvars) + + def _eval_type(self, globalns, localns): + ev_origin = (self.__origin__._eval_type(globalns, localns) + if self.__origin__ else None) + ev_args = tuple(_eval_type(a, globalns, localns) for a + in self.__args__) if self.__args__ else None + if ev_origin == self.__origin__ and ev_args == self.__args__: + return self + return self.__class__(self.__name__, + self.__bases__, + dict(self.__dict__), + tvars=_type_vars(ev_args) if ev_args else None, + args=ev_args, + origin=ev_origin, + extra=self.__extra__, + orig_bases=self.__orig_bases__) + + def __repr__(self): + if self.__origin__ is None: + return super(GenericMeta, self).__repr__() + return self._tree_repr(self._subs_tree()) + + def _tree_repr(self, tree): + arg_list = [] + for arg in tree[1:]: + if arg == (): + arg_list.append('()') + elif not isinstance(arg, tuple): + arg_list.append(_type_repr(arg)) + else: + arg_list.append(arg[0]._tree_repr(arg)) + return super(GenericMeta, self).__repr__() + '[%s]' % ', '.join(arg_list) + + def _subs_tree(self, tvars=None, args=None): + if self.__origin__ is None: + return self + tree_args = _subs_tree(self, tvars, args) + return (self._gorg,) + tuple(tree_args) + + def __eq__(self, other): + if not isinstance(other, GenericMeta): + return NotImplemented + if self.__origin__ is None or other.__origin__ is None: + return self is other + return self.__tree_hash__ == other.__tree_hash__ + + def __hash__(self): + return self.__tree_hash__ + + @_tp_cache + def __getitem__(self, params): + if not isinstance(params, tuple): + params = (params,) + if not params and self._gorg is not Tuple: + raise TypeError( + "Parameter list to %s[...] cannot be empty" % _qualname(self)) + msg = "Parameters to generic types must be types." + params = tuple(_type_check(p, msg) for p in params) + if self in (Generic, Protocol): + # Generic can only be subscripted with unique type variables. + if not all(isinstance(p, TypeVar) for p in params): + raise TypeError( + "Parameters to %s[...] must all be type variables" % self.__name__) + if len(set(params)) != len(params): + raise TypeError( + "Parameters to %s[...] must all be unique" % self.__name__) + tvars = params + args = params + elif self in (Tuple, Callable): + tvars = _type_vars(params) + args = params + elif self.__origin__ in (Generic, Protocol): + # Can't subscript Generic[...] or Protocol[...]. + raise TypeError("Cannot subscript already-subscripted %s" % + repr(self)) + else: + # Subscripting a regular Generic subclass. + _check_generic(self, params) + tvars = _type_vars(params) + args = params + + prepend = (self,) if self.__origin__ is None else () + return self.__class__(self.__name__, + prepend + self.__bases__, + dict(self.__dict__), + tvars=tvars, + args=args, + origin=self, + extra=self.__extra__, + orig_bases=self.__orig_bases__) + + def __subclasscheck__(self, cls): + if self.__origin__ is not None: + # These should only be modules within the standard library. + # singledispatch is an exception, because it's a Python 2 backport + # of functools.singledispatch. + whitelist = ['abc', 'functools', 'singledispatch'] + if (sys._getframe(1).f_globals['__name__'] in whitelist or + # The second frame is needed for the case where we came + # from _ProtocolMeta.__subclasscheck__. + sys._getframe(2).f_globals['__name__'] in whitelist): + return False + raise TypeError("Parameterized generics cannot be used with class " + "or instance checks") + if self is Generic: + raise TypeError("Class %r cannot be used with class " + "or instance checks" % self) + return super(GenericMeta, self).__subclasscheck__(cls) + + def __instancecheck__(self, instance): + # Since we extend ABC.__subclasscheck__ and + # ABC.__instancecheck__ inlines the cache checking done by the + # latter, we must extend __instancecheck__ too. For simplicity + # we just skip the cache check -- instance checks for generic + # classes are supposed to be rare anyways. + if hasattr(instance, "__class__"): + return issubclass(instance.__class__, self) + return False + + def __setattr__(self, attr, value): + # We consider all the subscripted genrics as proxies for original class + if ( + attr.startswith('__') and attr.endswith('__') or + attr.startswith('_abc_') + ): + super(GenericMeta, self).__setattr__(attr, value) + else: + super(GenericMeta, self._gorg).__setattr__(attr, value) + + +def _copy_generic(self): + """Hack to work around https://bugs.python.org/issue11480 on Python 2""" + return self.__class__(self.__name__, self.__bases__, dict(self.__dict__), + self.__parameters__, self.__args__, self.__origin__, + self.__extra__, self.__orig_bases__) + + +copy._copy_dispatch[GenericMeta] = _copy_generic + + +# Prevent checks for Generic to crash when defining Generic. +Generic = None + + +def _generic_new(base_cls, cls, *args, **kwds): + # Assure type is erased on instantiation, + # but attempt to store it in __orig_class__ + if cls.__origin__ is None: + if (base_cls.__new__ is object.__new__ and + cls.__init__ is not object.__init__): + return base_cls.__new__(cls) + else: + return base_cls.__new__(cls, *args, **kwds) + else: + origin = cls._gorg + if (base_cls.__new__ is object.__new__ and + cls.__init__ is not object.__init__): + obj = base_cls.__new__(origin) + else: + obj = base_cls.__new__(origin, *args, **kwds) + try: + obj.__orig_class__ = cls + except AttributeError: + pass + obj.__init__(*args, **kwds) + return obj + + +class Generic(object): + """Abstract base class for generic types. + + A generic type is typically declared by inheriting from + this class parameterized with one or more type variables. + For example, a generic mapping type might be defined as:: + + class Mapping(Generic[KT, VT]): + def __getitem__(self, key: KT) -> VT: + ... + # Etc. + + This class can then be used as follows:: + + def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT: + try: + return mapping[key] + except KeyError: + return default + """ + + __metaclass__ = GenericMeta + __slots__ = () + + def __new__(cls, *args, **kwds): + if cls._gorg is Generic: + raise TypeError("Type Generic cannot be instantiated; " + "it can be used only as a base class") + return _generic_new(cls.__next_in_mro__, cls, *args, **kwds) + + +class _TypingEmpty(object): + """Internal placeholder for () or []. Used by TupleMeta and CallableMeta + to allow empty list/tuple in specific places, without allowing them + to sneak in where prohibited. + """ + + +class _TypingEllipsis(object): + """Internal placeholder for ... (ellipsis).""" + + +class TupleMeta(GenericMeta): + """Metaclass for Tuple (internal).""" + + @_tp_cache + def __getitem__(self, parameters): + if self.__origin__ is not None or self._gorg is not Tuple: + # Normal generic rules apply if this is not the first subscription + # or a subscription of a subclass. + return super(TupleMeta, self).__getitem__(parameters) + if parameters == (): + return super(TupleMeta, self).__getitem__((_TypingEmpty,)) + if not isinstance(parameters, tuple): + parameters = (parameters,) + if len(parameters) == 2 and parameters[1] is Ellipsis: + msg = "Tuple[t, ...]: t must be a type." + p = _type_check(parameters[0], msg) + return super(TupleMeta, self).__getitem__((p, _TypingEllipsis)) + msg = "Tuple[t0, t1, ...]: each t must be a type." + parameters = tuple(_type_check(p, msg) for p in parameters) + return super(TupleMeta, self).__getitem__(parameters) + + def __instancecheck__(self, obj): + if self.__args__ is None: + return isinstance(obj, tuple) + raise TypeError("Parameterized Tuple cannot be used " + "with isinstance().") + + def __subclasscheck__(self, cls): + if self.__args__ is None: + return issubclass(cls, tuple) + raise TypeError("Parameterized Tuple cannot be used " + "with issubclass().") + + +copy._copy_dispatch[TupleMeta] = _copy_generic + + +class Tuple(tuple): + """Tuple type; Tuple[X, Y] is the cross-product type of X and Y. + + Example: Tuple[T1, T2] is a tuple of two elements corresponding + to type variables T1 and T2. Tuple[int, float, str] is a tuple + of an int, a float and a string. + + To specify a variable-length tuple of homogeneous type, use Tuple[T, ...]. + """ + + __metaclass__ = TupleMeta + __extra__ = tuple + __slots__ = () + + def __new__(cls, *args, **kwds): + if cls._gorg is Tuple: + raise TypeError("Type Tuple cannot be instantiated; " + "use tuple() instead") + return _generic_new(tuple, cls, *args, **kwds) + + +class CallableMeta(GenericMeta): + """ Metaclass for Callable.""" + + def __repr__(self): + if self.__origin__ is None: + return super(CallableMeta, self).__repr__() + return self._tree_repr(self._subs_tree()) + + def _tree_repr(self, tree): + if self._gorg is not Callable: + return super(CallableMeta, self)._tree_repr(tree) + # For actual Callable (not its subclass) we override + # super(CallableMeta, self)._tree_repr() for nice formatting. + arg_list = [] + for arg in tree[1:]: + if not isinstance(arg, tuple): + arg_list.append(_type_repr(arg)) + else: + arg_list.append(arg[0]._tree_repr(arg)) + if arg_list[0] == '...': + return repr(tree[0]) + '[..., %s]' % arg_list[1] + return (repr(tree[0]) + + '[[%s], %s]' % (', '.join(arg_list[:-1]), arg_list[-1])) + + def __getitem__(self, parameters): + """A thin wrapper around __getitem_inner__ to provide the latter + with hashable arguments to improve speed. + """ + + if self.__origin__ is not None or self._gorg is not Callable: + return super(CallableMeta, self).__getitem__(parameters) + if not isinstance(parameters, tuple) or len(parameters) != 2: + raise TypeError("Callable must be used as " + "Callable[[arg, ...], result].") + args, result = parameters + if args is Ellipsis: + parameters = (Ellipsis, result) + else: + if not isinstance(args, list): + raise TypeError("Callable[args, result]: args must be a list." + " Got %.100r." % (args,)) + parameters = (tuple(args), result) + return self.__getitem_inner__(parameters) + + @_tp_cache + def __getitem_inner__(self, parameters): + args, result = parameters + msg = "Callable[args, result]: result must be a type." + result = _type_check(result, msg) + if args is Ellipsis: + return super(CallableMeta, self).__getitem__((_TypingEllipsis, result)) + msg = "Callable[[arg, ...], result]: each arg must be a type." + args = tuple(_type_check(arg, msg) for arg in args) + parameters = args + (result,) + return super(CallableMeta, self).__getitem__(parameters) + + +copy._copy_dispatch[CallableMeta] = _copy_generic + + +class Callable(object): + """Callable type; Callable[[int], str] is a function of (int) -> str. + + The subscription syntax must always be used with exactly two + values: the argument list and the return type. The argument list + must be a list of types or ellipsis; the return type must be a single type. + + There is no syntax to indicate optional or keyword arguments, + such function types are rarely used as callback types. + """ + + __metaclass__ = CallableMeta + __extra__ = collections_abc.Callable + __slots__ = () + + def __new__(cls, *args, **kwds): + if cls._gorg is Callable: + raise TypeError("Type Callable cannot be instantiated; " + "use a non-abstract subclass instead") + return _generic_new(cls.__next_in_mro__, cls, *args, **kwds) + + +def cast(typ, val): + """Cast a value to a type. + + This returns the value unchanged. To the type checker this + signals that the return value has the designated type, but at + runtime we intentionally don't check anything (we want this + to be as fast as possible). + """ + return val + + +def _get_defaults(func): + """Internal helper to extract the default arguments, by name.""" + code = func.__code__ + pos_count = code.co_argcount + arg_names = code.co_varnames + arg_names = arg_names[:pos_count] + defaults = func.__defaults__ or () + kwdefaults = func.__kwdefaults__ + res = dict(kwdefaults) if kwdefaults else {} + pos_offset = pos_count - len(defaults) + for name, value in zip(arg_names[pos_offset:], defaults): + assert name not in res + res[name] = value + return res + + +def get_type_hints(obj, globalns=None, localns=None): + """In Python 2 this is not supported and always returns None.""" + return None + + +def no_type_check(arg): + """Decorator to indicate that annotations are not type hints. + + The argument must be a class or function; if it is a class, it + applies recursively to all methods and classes defined in that class + (but not to methods defined in its superclasses or subclasses). + + This mutates the function(s) or class(es) in place. + """ + if isinstance(arg, type): + arg_attrs = arg.__dict__.copy() + for attr, val in arg.__dict__.items(): + if val in arg.__bases__ + (arg,): + arg_attrs.pop(attr) + for obj in arg_attrs.values(): + if isinstance(obj, types.FunctionType): + obj.__no_type_check__ = True + if isinstance(obj, type): + no_type_check(obj) + try: + arg.__no_type_check__ = True + except TypeError: # built-in classes + pass + return arg + + +def no_type_check_decorator(decorator): + """Decorator to give another decorator the @no_type_check effect. + + This wraps the decorator with something that wraps the decorated + function in @no_type_check. + """ + + @functools.wraps(decorator) + def wrapped_decorator(*args, **kwds): + func = decorator(*args, **kwds) + func = no_type_check(func) + return func + + return wrapped_decorator + + +def _overload_dummy(*args, **kwds): + """Helper for @overload to raise when called.""" + raise NotImplementedError( + "You should not call an overloaded function. " + "A series of @overload-decorated functions " + "outside a stub module should always be followed " + "by an implementation that is not @overload-ed.") + + +def overload(func): + """Decorator for overloaded functions/methods. + + In a stub file, place two or more stub definitions for the same + function in a row, each decorated with @overload. For example: + + @overload + def utf8(value: None) -> None: ... + @overload + def utf8(value: bytes) -> bytes: ... + @overload + def utf8(value: str) -> bytes: ... + + In a non-stub file (i.e. a regular .py file), do the same but + follow it with an implementation. The implementation should *not* + be decorated with @overload. For example: + + @overload + def utf8(value: None) -> None: ... + @overload + def utf8(value: bytes) -> bytes: ... + @overload + def utf8(value: str) -> bytes: ... + def utf8(value): + # implementation goes here + """ + return _overload_dummy + + +_PROTO_WHITELIST = ['Callable', 'Iterable', 'Iterator', + 'Hashable', 'Sized', 'Container', 'Collection', + 'Reversible', 'ContextManager'] + + +class _ProtocolMeta(GenericMeta): + """Internal metaclass for Protocol. + + This exists so Protocol classes can be generic without deriving + from Generic. + """ + def __init__(cls, *args, **kwargs): + super(_ProtocolMeta, cls).__init__(*args, **kwargs) + if not cls.__dict__.get('_is_protocol', None): + cls._is_protocol = any(b is Protocol or + isinstance(b, _ProtocolMeta) and + b.__origin__ is Protocol + for b in cls.__bases__) + if cls._is_protocol: + for base in cls.__mro__[1:]: + if not (base in (object, Generic) or + base.__module__ == '_abcoll' and + base.__name__ in _PROTO_WHITELIST or + isinstance(base, TypingMeta) and base._is_protocol or + isinstance(base, GenericMeta) and base.__origin__ is Generic): + raise TypeError('Protocols can only inherit from other protocols,' + ' got %r' % base) + cls._callable_members_only = all(callable(getattr(cls, attr)) + for attr in cls._get_protocol_attrs()) + + def _no_init(self, *args, **kwargs): + if type(self)._is_protocol: + raise TypeError('Protocols cannot be instantiated') + cls.__init__ = _no_init + + def _proto_hook(cls, other): + if not cls.__dict__.get('_is_protocol', None): + return NotImplemented + if not isinstance(other, type): + # Similar error as for issubclass(1, int) + # (also not a chance for old-style classes) + raise TypeError('issubclass() arg 1 must be a new-style class') + for attr in cls._get_protocol_attrs(): + for base in other.__mro__: + if attr in base.__dict__: + if base.__dict__[attr] is None: + return NotImplemented + break + else: + return NotImplemented + return True + if '__subclasshook__' not in cls.__dict__: + cls.__subclasshook__ = classmethod(_proto_hook) + + def __instancecheck__(self, instance): + # We need this method for situations where attributes are assigned in __init__ + if isinstance(instance, type): + # This looks like a fundamental limitation of Python 2. + # It cannot support runtime protocol metaclasses, On Python 2 classes + # cannot be correctly inspected as instances of protocols. + return False + if ((not getattr(self, '_is_protocol', False) or + self._callable_members_only) and + issubclass(instance.__class__, self)): + return True + if self._is_protocol: + if all(hasattr(instance, attr) and + (not callable(getattr(self, attr)) or + getattr(instance, attr) is not None) + for attr in self._get_protocol_attrs()): + return True + return super(GenericMeta, self).__instancecheck__(instance) + + def __subclasscheck__(self, cls): + if (self.__dict__.get('_is_protocol', None) and + not self.__dict__.get('_is_runtime_protocol', None)): + if (sys._getframe(1).f_globals['__name__'] in ['abc', 'functools'] or + # This is needed because we remove subclasses from unions on Python 2. + sys._getframe(2).f_globals['__name__'] == 'typing'): + return False + raise TypeError("Instance and class checks can only be used with" + " @runtime_checkable protocols") + if (self.__dict__.get('_is_runtime_protocol', None) and + not self._callable_members_only): + if sys._getframe(1).f_globals['__name__'] in ['abc', 'functools']: + return super(GenericMeta, self).__subclasscheck__(cls) + raise TypeError("Protocols with non-method members" + " don't support issubclass()") + return super(_ProtocolMeta, self).__subclasscheck__(cls) + + def _get_protocol_attrs(self): + attrs = set() + for base in self.__mro__[:-1]: # without object + if base.__name__ in ('Protocol', 'Generic'): + continue + annotations = getattr(base, '__annotations__', {}) + for attr in list(base.__dict__.keys()) + list(annotations.keys()): + if (not attr.startswith('_abc_') and attr not in ( + '__abstractmethods__', '__annotations__', '__weakref__', + '_is_protocol', '_is_runtime_protocol', '__dict__', + '__args__', '__slots__', '_get_protocol_attrs', + '__next_in_mro__', '__parameters__', '__origin__', + '__orig_bases__', '__extra__', '__tree_hash__', + '__doc__', '__subclasshook__', '__init__', '__new__', + '__module__', '_MutableMapping__marker', + '__metaclass__', '_gorg', '_callable_members_only')): + attrs.add(attr) + return attrs + + +class Protocol(object): + """Base class for protocol classes. Protocol classes are defined as:: + + class Proto(Protocol): + def meth(self): + # type: () -> int + pass + + Such classes are primarily used with static type checkers that recognize + structural subtyping (static duck-typing), for example:: + + class C: + def meth(self): + # type: () -> int + return 0 + + def func(x): + # type: (Proto) -> int + return x.meth() + + func(C()) # Passes static type check + + See PEP 544 for details. Protocol classes decorated with @typing.runtime_checkable + act as simple-minded runtime protocols that checks only the presence of + given attributes, ignoring their type signatures. + + Protocol classes can be generic, they are defined as:: + + class GenProto(Protocol[T]): + def meth(self): + # type: () -> T + pass + """ + + __metaclass__ = _ProtocolMeta + __slots__ = () + _is_protocol = True + + def __new__(cls, *args, **kwds): + if cls._gorg is Protocol: + raise TypeError("Type Protocol cannot be instantiated; " + "it can be used only as a base class") + return _generic_new(cls.__next_in_mro__, cls, *args, **kwds) + + +def runtime_checkable(cls): + """Mark a protocol class as a runtime protocol, so that it + can be used with isinstance() and issubclass(). Raise TypeError + if applied to a non-protocol class. + + This allows a simple-minded structural check very similar to the + one-offs in collections.abc such as Hashable. + """ + if not isinstance(cls, _ProtocolMeta) or not cls._is_protocol: + raise TypeError('@runtime_checkable can be only applied to protocol classes,' + ' got %r' % cls) + cls._is_runtime_protocol = True + return cls + + +# Various ABCs mimicking those in collections.abc. +# A few are simply re-exported for completeness. + +Hashable = collections_abc.Hashable # Not generic. + + +class Iterable(Generic[T_co]): + __slots__ = () + __extra__ = collections_abc.Iterable + + +class Iterator(Iterable[T_co]): + __slots__ = () + __extra__ = collections_abc.Iterator + + +@runtime_checkable +class SupportsInt(Protocol): + __slots__ = () + + @abstractmethod + def __int__(self): + pass + + +@runtime_checkable +class SupportsFloat(Protocol): + __slots__ = () + + @abstractmethod + def __float__(self): + pass + + +@runtime_checkable +class SupportsComplex(Protocol): + __slots__ = () + + @abstractmethod + def __complex__(self): + pass + + +@runtime_checkable +class SupportsIndex(Protocol): + __slots__ = () + + @abstractmethod + def __index__(self): + pass + + +@runtime_checkable +class SupportsAbs(Protocol[T_co]): + __slots__ = () + + @abstractmethod + def __abs__(self): + pass + + +if hasattr(collections_abc, 'Reversible'): + class Reversible(Iterable[T_co]): + __slots__ = () + __extra__ = collections_abc.Reversible +else: + @runtime_checkable + class Reversible(Protocol[T_co]): + __slots__ = () + + @abstractmethod + def __reversed__(self): + pass + + +Sized = collections_abc.Sized # Not generic. + + +class Container(Generic[T_co]): + __slots__ = () + __extra__ = collections_abc.Container + + +# Callable was defined earlier. + + +class AbstractSet(Sized, Iterable[T_co], Container[T_co]): + __slots__ = () + __extra__ = collections_abc.Set + + +class MutableSet(AbstractSet[T]): + __slots__ = () + __extra__ = collections_abc.MutableSet + + +# NOTE: It is only covariant in the value type. +class Mapping(Sized, Iterable[KT], Container[KT], Generic[KT, VT_co]): + __slots__ = () + __extra__ = collections_abc.Mapping + + +class MutableMapping(Mapping[KT, VT]): + __slots__ = () + __extra__ = collections_abc.MutableMapping + + +if hasattr(collections_abc, 'Reversible'): + class Sequence(Sized, Reversible[T_co], Container[T_co]): + __slots__ = () + __extra__ = collections_abc.Sequence +else: + class Sequence(Sized, Iterable[T_co], Container[T_co]): + __slots__ = () + __extra__ = collections_abc.Sequence + + +class MutableSequence(Sequence[T]): + __slots__ = () + __extra__ = collections_abc.MutableSequence + + +class ByteString(Sequence[int]): + pass + + +ByteString.register(str) +ByteString.register(bytearray) + + +class List(list, MutableSequence[T]): + __slots__ = () + __extra__ = list + + def __new__(cls, *args, **kwds): + if cls._gorg is List: + raise TypeError("Type List cannot be instantiated; " + "use list() instead") + return _generic_new(list, cls, *args, **kwds) + + +class Deque(collections.deque, MutableSequence[T]): + __slots__ = () + __extra__ = collections.deque + + def __new__(cls, *args, **kwds): + if cls._gorg is Deque: + return collections.deque(*args, **kwds) + return _generic_new(collections.deque, cls, *args, **kwds) + + +class Set(set, MutableSet[T]): + __slots__ = () + __extra__ = set + + def __new__(cls, *args, **kwds): + if cls._gorg is Set: + raise TypeError("Type Set cannot be instantiated; " + "use set() instead") + return _generic_new(set, cls, *args, **kwds) + + +class FrozenSet(frozenset, AbstractSet[T_co]): + __slots__ = () + __extra__ = frozenset + + def __new__(cls, *args, **kwds): + if cls._gorg is FrozenSet: + raise TypeError("Type FrozenSet cannot be instantiated; " + "use frozenset() instead") + return _generic_new(frozenset, cls, *args, **kwds) + + +class MappingView(Sized, Iterable[T_co]): + __slots__ = () + __extra__ = collections_abc.MappingView + + +class KeysView(MappingView[KT], AbstractSet[KT]): + __slots__ = () + __extra__ = collections_abc.KeysView + + +class ItemsView(MappingView[Tuple[KT, VT_co]], + AbstractSet[Tuple[KT, VT_co]], + Generic[KT, VT_co]): + __slots__ = () + __extra__ = collections_abc.ItemsView + + +class ValuesView(MappingView[VT_co]): + __slots__ = () + __extra__ = collections_abc.ValuesView + + +class ContextManager(Generic[T_co]): + __slots__ = () + + def __enter__(self): + return self + + @abc.abstractmethod + def __exit__(self, exc_type, exc_value, traceback): + return None + + @classmethod + def __subclasshook__(cls, C): + if cls is ContextManager: + # In Python 3.6+, it is possible to set a method to None to + # explicitly indicate that the class does not implement an ABC + # (https://bugs.python.org/issue25958), but we do not support + # that pattern here because this fallback class is only used + # in Python 3.5 and earlier. + if (any("__enter__" in B.__dict__ for B in C.__mro__) and + any("__exit__" in B.__dict__ for B in C.__mro__)): + return True + return NotImplemented + + +class Dict(dict, MutableMapping[KT, VT]): + __slots__ = () + __extra__ = dict + + def __new__(cls, *args, **kwds): + if cls._gorg is Dict: + raise TypeError("Type Dict cannot be instantiated; " + "use dict() instead") + return _generic_new(dict, cls, *args, **kwds) + + +class DefaultDict(collections.defaultdict, MutableMapping[KT, VT]): + __slots__ = () + __extra__ = collections.defaultdict + + def __new__(cls, *args, **kwds): + if cls._gorg is DefaultDict: + return collections.defaultdict(*args, **kwds) + return _generic_new(collections.defaultdict, cls, *args, **kwds) + + +class Counter(collections.Counter, Dict[T, int]): + __slots__ = () + __extra__ = collections.Counter + + def __new__(cls, *args, **kwds): + if cls._gorg is Counter: + return collections.Counter(*args, **kwds) + return _generic_new(collections.Counter, cls, *args, **kwds) + + +# Determine what base class to use for Generator. +if hasattr(collections_abc, 'Generator'): + # Sufficiently recent versions of 3.5 have a Generator ABC. + _G_base = collections_abc.Generator +else: + # Fall back on the exact type. + _G_base = types.GeneratorType + + +class Generator(Iterator[T_co], Generic[T_co, T_contra, V_co]): + __slots__ = () + __extra__ = _G_base + + def __new__(cls, *args, **kwds): + if cls._gorg is Generator: + raise TypeError("Type Generator cannot be instantiated; " + "create a subclass instead") + return _generic_new(_G_base, cls, *args, **kwds) + + +# Internal type variable used for Type[]. +CT_co = TypeVar('CT_co', covariant=True, bound=type) + + +# This is not a real generic class. Don't use outside annotations. +class Type(Generic[CT_co]): + """A special construct usable to annotate class objects. + + For example, suppose we have the following classes:: + + class User: ... # Abstract base for User classes + class BasicUser(User): ... + class ProUser(User): ... + class TeamUser(User): ... + + And a function that takes a class argument that's a subclass of + User and returns an instance of the corresponding class:: + + U = TypeVar('U', bound=User) + def new_user(user_class: Type[U]) -> U: + user = user_class() + # (Here we could write the user object to a database) + return user + + joe = new_user(BasicUser) + + At this point the type checker knows that joe has type BasicUser. + """ + __slots__ = () + __extra__ = type + + +def NamedTuple(typename, fields): + """Typed version of namedtuple. + + Usage:: + + Employee = typing.NamedTuple('Employee', [('name', str), ('id', int)]) + + This is equivalent to:: + + Employee = collections.namedtuple('Employee', ['name', 'id']) + + The resulting class has one extra attribute: _field_types, + giving a dict mapping field names to types. (The field names + are in the _fields attribute, which is part of the namedtuple + API.) + """ + fields = [(n, t) for n, t in fields] + cls = collections.namedtuple(typename, [n for n, t in fields]) + cls._field_types = dict(fields) + # Set the module to the caller's module (otherwise it'd be 'typing'). + try: + cls.__module__ = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + pass + return cls + + +def _check_fails(cls, other): + try: + if sys._getframe(1).f_globals['__name__'] not in ['abc', 'functools', 'typing']: + # Typed dicts are only for static structural subtyping. + raise TypeError('TypedDict does not support instance and class checks') + except (AttributeError, ValueError): + pass + return False + + +def _dict_new(cls, *args, **kwargs): + return dict(*args, **kwargs) + + +def _typeddict_new(cls, _typename, _fields=None, **kwargs): + total = kwargs.pop('total', True) + if _fields is None: + _fields = kwargs + elif kwargs: + raise TypeError("TypedDict takes either a dict or keyword arguments," + " but not both") + + ns = {'__annotations__': dict(_fields), '__total__': total} + try: + # Setting correct module is necessary to make typed dict classes pickleable. + ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + pass + + return _TypedDictMeta(_typename, (), ns) + + +class _TypedDictMeta(type): + def __new__(cls, name, bases, ns, total=True): + # Create new typed dict class object. + # This method is called directly when TypedDict is subclassed, + # or via _typeddict_new when TypedDict is instantiated. This way + # TypedDict supports all three syntaxes described in its docstring. + # Subclasses and instances of TypedDict return actual dictionaries + # via _dict_new. + ns['__new__'] = _typeddict_new if name == b'TypedDict' else _dict_new + tp_dict = super(_TypedDictMeta, cls).__new__(cls, name, (dict,), ns) + + anns = ns.get('__annotations__', {}) + msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" + anns = {n: _type_check(tp, msg) for n, tp in anns.items()} + for base in bases: + anns.update(base.__dict__.get('__annotations__', {})) + tp_dict.__annotations__ = anns + if not hasattr(tp_dict, '__total__'): + tp_dict.__total__ = total + return tp_dict + + __instancecheck__ = __subclasscheck__ = _check_fails + + +TypedDict = _TypedDictMeta(b'TypedDict', (dict,), {}) +TypedDict.__module__ = __name__ +TypedDict.__doc__ = \ + """A simple typed name space. At runtime it is equivalent to a plain dict. + + TypedDict creates a dictionary type that expects all of its + instances to have a certain set of keys, with each key + associated with a value of a consistent type. This expectation + is not checked at runtime but is only enforced by type checkers. + Usage:: + + Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) + + a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK + b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check + + assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') + + The type info could be accessed via Point2D.__annotations__. TypedDict + supports an additional equivalent form:: + + Point2D = TypedDict('Point2D', x=int, y=int, label=str) + """ + + +def NewType(name, tp): + """NewType creates simple unique types with almost zero + runtime overhead. NewType(name, tp) is considered a subtype of tp + by static type checkers. At runtime, NewType(name, tp) returns + a dummy function that simply returns its argument. Usage:: + + UserId = NewType('UserId', int) + + def name_by_id(user_id): + # type: (UserId) -> str + ... + + UserId('user') # Fails type check + + name_by_id(42) # Fails type check + name_by_id(UserId(42)) # OK + + num = UserId(5) + 1 # type: int + """ + + def new_type(x): + return x + + # Some versions of Python 2 complain because of making all strings unicode + new_type.__name__ = str(name) + new_type.__supertype__ = tp + return new_type + + +# Python-version-specific alias (Python 2: unicode; Python 3: str) +Text = unicode + + +# Constant that's True when type checking, but False here. +TYPE_CHECKING = False + + +class IO(Generic[AnyStr]): + """Generic base class for TextIO and BinaryIO. + + This is an abstract, generic version of the return of open(). + + NOTE: This does not distinguish between the different possible + classes (text vs. binary, read vs. write vs. read/write, + append-only, unbuffered). The TextIO and BinaryIO subclasses + below capture the distinctions between text vs. binary, which is + pervasive in the interface; however we currently do not offer a + way to track the other distinctions in the type system. + """ + + __slots__ = () + + @abstractproperty + def mode(self): + pass + + @abstractproperty + def name(self): + pass + + @abstractmethod + def close(self): + pass + + @abstractproperty + def closed(self): + pass + + @abstractmethod + def fileno(self): + pass + + @abstractmethod + def flush(self): + pass + + @abstractmethod + def isatty(self): + pass + + @abstractmethod + def read(self, n=-1): + pass + + @abstractmethod + def readable(self): + pass + + @abstractmethod + def readline(self, limit=-1): + pass + + @abstractmethod + def readlines(self, hint=-1): + pass + + @abstractmethod + def seek(self, offset, whence=0): + pass + + @abstractmethod + def seekable(self): + pass + + @abstractmethod + def tell(self): + pass + + @abstractmethod + def truncate(self, size=None): + pass + + @abstractmethod + def writable(self): + pass + + @abstractmethod + def write(self, s): + pass + + @abstractmethod + def writelines(self, lines): + pass + + @abstractmethod + def __enter__(self): + pass + + @abstractmethod + def __exit__(self, type, value, traceback): + pass + + +class BinaryIO(IO[bytes]): + """Typed version of the return of open() in binary mode.""" + + __slots__ = () + + @abstractmethod + def write(self, s): + pass + + @abstractmethod + def __enter__(self): + pass + + +class TextIO(IO[unicode]): + """Typed version of the return of open() in text mode.""" + + __slots__ = () + + @abstractproperty + def buffer(self): + pass + + @abstractproperty + def encoding(self): + pass + + @abstractproperty + def errors(self): + pass + + @abstractproperty + def line_buffering(self): + pass + + @abstractproperty + def newlines(self): + pass + + @abstractmethod + def __enter__(self): + pass + + +class io(object): + """Wrapper namespace for IO generic classes.""" + + __all__ = ['IO', 'TextIO', 'BinaryIO'] + IO = IO + TextIO = TextIO + BinaryIO = BinaryIO + + +io.__name__ = __name__ + b'.io' +sys.modules[io.__name__] = io + + +Pattern = _TypeAlias('Pattern', AnyStr, type(stdlib_re.compile('')), + lambda p: p.pattern) +Match = _TypeAlias('Match', AnyStr, type(stdlib_re.match('', '')), + lambda m: m.re.pattern) + + +class re(object): + """Wrapper namespace for re type aliases.""" + + __all__ = ['Pattern', 'Match'] + Pattern = Pattern + Match = Match + + +re.__name__ = __name__ + b'.re' +sys.modules[re.__name__] = re From 356f57801430855ff9754651772efd15d0c4115f Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 8 Mar 2020 16:29:49 +0100 Subject: [PATCH 657/710] remove py3 compat breaking unnecessary change --- Contents/Libraries/Shared/subliminal_patch/subtitle.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 7d6e1cf00..46b6f5960 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -295,9 +295,9 @@ def ms_to_timestamp(ms, mssep=","): def prepare_text(text, style): body = [] for fragment, sty in parse_tags(text, style, sub.styles): - fragment = fragment.replace(ur"\h", u" ") - fragment = fragment.replace(ur"\n", u"\n") - fragment = fragment.replace(ur"\N", u"\n") + fragment = fragment.replace(r"\h", u" ") + fragment = fragment.replace(r"\n", u"\n") + fragment = fragment.replace(r"\N", u"\n") if sty.drawing: raise pysubs2.ContentNotUsable From c7fe6076cb0e99c134bfbf970f743eeb42591ec0 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 8 Mar 2020 16:32:40 +0100 Subject: [PATCH 658/710] bump version --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 2a3ea262a..fde05c57a 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3223</string> + <string>2.6.5.3229</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3223 DEV +Version 2.6.5.3229 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From dba469750be65ec6973938ac4c49e228f29befbb Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 11 Apr 2020 05:06:12 +0200 Subject: [PATCH 659/710] submod: HI: remove more music tags core: update pysubs2 providers: opensubtitles: actually use sessions (they're broken) for checking for token state --- Contents/Libraries/Shared/provider_test.sh | 2 + .../Libraries/Shared/subliminal_patch/http.py | 40 ++++++++++++++++--- .../providers/opensubtitles.py | 13 +++--- .../Shared/subzero/modification/exc.py | 7 ++++ .../Shared/subzero/modification/main.py | 11 ++--- .../subzero/modification/mods/__init__.py | 6 --- .../subzero/modification/mods/common.py | 2 +- .../modification/mods/hearing_impaired.py | 9 +++-- .../modification/processors/__init__.py | 4 +- .../modification/processors/re_processor.py | 18 +++++++-- .../processors/string_processor.py | 4 +- 11 files changed, 79 insertions(+), 37 deletions(-) create mode 100644 Contents/Libraries/Shared/subzero/modification/exc.py diff --git a/Contents/Libraries/Shared/provider_test.sh b/Contents/Libraries/Shared/provider_test.sh index 12b16ed3c..a91c1b8ad 100644 --- a/Contents/Libraries/Shared/provider_test.sh +++ b/Contents/Libraries/Shared/provider_test.sh @@ -43,6 +43,8 @@ python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.get # subscenter:list python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subliminal_patch.core import SZProviderPool; from babelfish import Language; from subliminal.core import scan_video; print SZProviderPool(providers=['subscenter'], )['subscenter'].list_subtitles(scan_video('FULL_PATH'), languages=[Language('heb')])" +# subscene:list +python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subliminal_patch.core import SZProviderPool; from subzero.language import Language; from subzero.video import parse_video; SZProviderPool(providers=['subscene'], provider_configs={'subscene': {'username': 'USERNAME', 'password': 'PASSWORD'}})['subscene'].list_subtitles(parse_video('FILENAME', {}, {'type': 'episode'}, dry_run=True), languages=[Language('eng')])" # refining python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import os; os.environ['U1pfT01EQl9LRVk'] = '789CF30DAC2C8B0AF433F5C9AD34290A712DF30D7135F12D0FB3E502006FDE081E'; import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subzero.video import parse_video, refine_video; video = parse_video('FILE_NAME', {'type': 'episode'}, dry_run=True); print refine_video(video)" diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index db313578e..44219e304 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -241,12 +241,20 @@ class SubZeroRequestsTransport(xmlrpclib.SafeTransport): # change our user agent to reflect Requests user_agent = "Python XMLRPC with Requests (python-requests.org)" proxies = None + xm_ver = 1 + session_var = "PHPSESSID" def __init__(self, use_https=True, verify=None, user_agent=None, timeout=10, *args, **kwargs): self.verify = pem_file if verify is None else verify self.use_https = use_https self.user_agent = user_agent if user_agent is not None else self.user_agent self.timeout = timeout + self.session = requests.Session() + self.session.headers['User-Agent'] = self.user_agent + # if 'requests' in self.session.headers['User-Agent']: + # # Set a random User-Agent if no custom User-Agent has been set + # self.session.headers = User_Agent(allow_brotli=False).headers + proxy = os.environ.get('SZ_HTTP_PROXY') if proxy: self.proxies = { @@ -260,18 +268,40 @@ def request(self, host, handler, request_body, verbose=0): """ Make an xmlrpc request. """ - headers = {'User-Agent': self.user_agent} url = self._build_url(host, handler) + cache_key = "xm%s_%s" % (self.xm_ver, host) + + old_sessvar = self.session.cookies.get(self.session_var, "") + if not old_sessvar: + data = region.get(cache_key) + if data is not NO_VALUE: + logger.debug("Trying to re-use headers/cookies for %s" % host) + self.session.cookies, self.session.headers = data + old_sessvar = self.session.cookies.get(self.session_var, "") + try: - resp = requests.post(url, data=request_body, headers=headers, - stream=True, timeout=self.timeout, proxies=self.proxies, - verify=self.verify) + resp = self.session.post(url, data=request_body, + stream=True, timeout=self.timeout, proxies=self.proxies, + verify=self.verify) + + if self.session_var in resp.cookies and resp.cookies[self.session_var] != old_sessvar: + logger.debug("Storing %s cookies" % host) + region.set(cache_key, [self.session.cookies, self.session.headers]) except ValueError: + logger.debug("Wiping cookies/headers cache (VE) for %s" % host) + region.delete(cache_key) raise except Exception: + logger.debug("Wiping cookies/headers cache (EX) for %s" % host) + region.delete(cache_key) raise # something went wrong else: - resp.raise_for_status() + try: + resp.raise_for_status() + except requests.exceptions.HTTPError: + logger.debug("Wiping cookies/headers cache (RE) for %s" % host) + region.delete(cache_key) + raise try: if 'x-ratelimit-remaining' in resp.headers and int(resp.headers['x-ratelimit-remaining']) <= 2: diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index a314087c2..ad3bf46c7 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -105,7 +105,7 @@ class OpenSubtitlesProvider(ProviderRetryMixin, _OpenSubtitlesProvider): def __init__(self, username=None, password=None, use_tag_search=False, only_foreign=False, also_foreign=False, skip_wrong_fps=True, is_vip=False, use_ssl=True, timeout=15): - if any((username, password)) and not all((username, password)): + if not all((username, password)): raise ConfigurationError('Username and password must be specified') self.username = username or '' @@ -154,6 +154,7 @@ def log_in(self, server_url=None): logger.debug('Logged in with token %r', self.token[:10]+"X"*(len(self.token)-10)) region.set("os_token", self.token) + time.sleep(1) def use_token_or_login(self, func): if not self.token: @@ -162,6 +163,7 @@ def use_token_or_login(self, func): try: return func() except Unauthorized: + logger.debug("Token not valid, logging in again") self.log_in() return func() @@ -197,16 +199,11 @@ def initialize(self): return logger.error("Login failed, please check your credentials") + raise def terminate(self): - if self.token: - try: - checked(lambda: self.server.LogOut(self.token)) - except: - logger.error("Logout failed: %s", traceback.format_exc()) - self.server = None - self.token = None + #self.token = None def list_subtitles(self, video, languages): """ diff --git a/Contents/Libraries/Shared/subzero/modification/exc.py b/Contents/Libraries/Shared/subzero/modification/exc.py new file mode 100644 index 000000000..38679a8ee --- /dev/null +++ b/Contents/Libraries/Shared/subzero/modification/exc.py @@ -0,0 +1,7 @@ +# coding=utf-8 +class EmptyEntryError(Exception): + pass + + +class EmptyLineError(Exception): + pass \ No newline at end of file diff --git a/Contents/Libraries/Shared/subzero/modification/main.py b/Contents/Libraries/Shared/subzero/modification/main.py index 7d35c2e27..11adc0b0d 100644 --- a/Contents/Libraries/Shared/subzero/modification/main.py +++ b/Contents/Libraries/Shared/subzero/modification/main.py @@ -6,7 +6,8 @@ import logging import time -from mods import EMPTY_TAG_PROCESSOR, EmptyEntryError +from mods import EMPTY_TAG_PROCESSOR +from exc import EmptyEntryError from registry import registry from subzero.language import Language @@ -300,11 +301,11 @@ def apply_line_mods(self, new_entries, mods): mod = self.initialized_mods[identifier] try: - line = mod.modify(line.strip(), entry=entry.text, debug=self.debug, parent=self, index=index, + line = mod.modify(line.strip(), entry=t, debug=self.debug, parent=self, index=index, **args) except EmptyEntryError: if self.debug: - logger.debug(u"%d: %s: %r -> ''", index, identifier, entry.text) + logger.debug(u"%d: %s: %r -> ''", index, identifier, t) skip_entry = True break @@ -329,11 +330,11 @@ def apply_line_mods(self, new_entries, mods): mod = self.initialized_mods[identifier] try: - line = mod.modify(line.strip(), entry=entry.text, debug=self.debug, parent=self, index=index, + line = mod.modify(line.strip(), entry=t, debug=self.debug, parent=self, index=index, procs=["last_process"], **args) except EmptyEntryError: if self.debug: - logger.debug(u"%d: %s: %r -> ''", index, identifier, entry.text) + logger.debug(u"%d: %s: %r -> ''", index, identifier, t) skip_entry = True break diff --git a/Contents/Libraries/Shared/subzero/modification/mods/__init__.py b/Contents/Libraries/Shared/subzero/modification/mods/__init__.py index aaf4c37e4..535d3e621 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/__init__.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/__init__.py @@ -107,9 +107,3 @@ class SubtitleTextModification(SubtitleModification): ] -class EmptyEntryError(Exception): - pass - - -class EmptyLineError(Exception): - pass diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 190047774..49a5aa0f4 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -29,7 +29,7 @@ class CommonFixes(SubtitleTextModification): NReProcessor(re.compile(r'(?u)(\w|\b|\s|^)(-\s?-{1,2})'), ur"\1—", name="CM_multidash"), # line = _/-/\s - NReProcessor(re.compile(r'(?u)(^\W*[-_.:>~]+\W*$)'), "", name="<CM_non_word_only"), + NReProcessor(re.compile(r'(?u)(^\W*[-_.:<>~"\']+\W*$)'), "", name="CM_non_word_only"), # remove >> NReProcessor(re.compile(r'(?u)^\s?>>\s*'), "", name="CM_leading_crocodiles"), diff --git a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py index cb72d898c..6af6e357b 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py @@ -1,7 +1,8 @@ # coding=utf-8 import re -from subzero.modification.mods import SubtitleTextModification, empty_line_post_processors, EmptyEntryError, TAG +from subzero.modification.mods import SubtitleTextModification, empty_line_post_processors, TAG +from subzero.modification.exc import EmptyEntryError from subzero.modification.processors.re_processor import NReProcessor from subzero.modification import registry @@ -46,7 +47,7 @@ class HearingImpaired(SubtitleTextModification): name="HI_before_colon_noncaps"), # brackets (only remove if at least 3 chars in brackets) - NReProcessor(re.compile(ur'(?sux)-?%(t)s[([][^([)\]]+?(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+[)\]][\s:]*%(t)s' % + NReProcessor(re.compile(ur'(?sux)-?%(t)s["\']*[([][^([)\]]+?(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+[)\]]["\']*[\s:]*%(t)s' % {"t": TAG}), "", name="HI_brackets"), #NReProcessor(re.compile(ur'(?sux)-?%(t)s[([]%(t)s(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+%(t)s$' % {"t": TAG}), @@ -90,8 +91,8 @@ class HearingImpaired(SubtitleTextModification): "", name="HI_music_symbols_only"), # remove music entries - NReProcessor(re.compile(ur'(?ums)(^[-\s>~]*[♫♪]+\s*.+|.+\s*[♫♪]+\s*$)'), - "", name="HI_music"), + NReProcessor(re.compile(ur'(?ums)(^[-\s>~]*[*#¶♫♪]+\s*.+|.+\s*[*#¶♫♪]+\s*$)'), + "", name="HI_music", entry=True), ] diff --git a/Contents/Libraries/Shared/subzero/modification/processors/__init__.py b/Contents/Libraries/Shared/subzero/modification/processors/__init__.py index 7cfb0aa33..cc7613791 100644 --- a/Contents/Libraries/Shared/subzero/modification/processors/__init__.py +++ b/Contents/Libraries/Shared/subzero/modification/processors/__init__.py @@ -10,7 +10,7 @@ class Processor(object): supported = None enabled = True - def __init__(self, name=None, parent=None, supported=None): + def __init__(self, name=None, parent=None, supported=None, **kwargs): self.name = name self.parent = parent self.supported = supported if supported else lambda parent: True @@ -35,7 +35,7 @@ def __unicode__(self): class FuncProcessor(Processor): func = None - def __init__(self, func, name=None, parent=None, supported=None): + def __init__(self, func, name=None, parent=None, supported=None, **kwargs): super(FuncProcessor, self).__init__(name=name, supported=supported) self.func = func diff --git a/Contents/Libraries/Shared/subzero/modification/processors/re_processor.py b/Contents/Libraries/Shared/subzero/modification/processors/re_processor.py index 5ff76331e..3c5887458 100644 --- a/Contents/Libraries/Shared/subzero/modification/processors/re_processor.py +++ b/Contents/Libraries/Shared/subzero/modification/processors/re_processor.py @@ -2,6 +2,7 @@ import re import logging +from subzero.modification.exc import EmptyEntryError from subzero.modification.processors import Processor logger = logging.getLogger(__name__) @@ -14,13 +15,22 @@ class ReProcessor(Processor): pattern = None replace_with = None - def __init__(self, pattern, replace_with, name=None, supported=None): + def __init__(self, pattern, replace_with, name=None, supported=None, entry=False, **kwargs): super(ReProcessor, self).__init__(name=name, supported=supported) self.pattern = pattern self.replace_with = replace_with + self.use_entry = entry - def process(self, content, debug=False, **kwargs): - return self.pattern.sub(self.replace_with, content) + def process(self, content, debug=False, entry=None, **kwargs): + if not self.use_entry: + return self.pattern.sub(self.replace_with, content) + + ret = self.pattern.sub(self.replace_with, entry) + if not ret: + raise EmptyEntryError() + elif ret != entry: + return ret + return content class NReProcessor(ReProcessor): @@ -36,7 +46,7 @@ class MultipleWordReProcessor(ReProcessor): } replaces found key in pattern with the corresponding value in data """ - def __init__(self, snr_dict, name=None, parent=None, supported=None): + def __init__(self, snr_dict, name=None, parent=None, supported=None, **kwargs): super(ReProcessor, self).__init__(name=name, supported=supported) self.snr_dict = snr_dict diff --git a/Contents/Libraries/Shared/subzero/modification/processors/string_processor.py b/Contents/Libraries/Shared/subzero/modification/processors/string_processor.py index 270fd76f8..27b542c88 100644 --- a/Contents/Libraries/Shared/subzero/modification/processors/string_processor.py +++ b/Contents/Libraries/Shared/subzero/modification/processors/string_processor.py @@ -12,7 +12,7 @@ class StringProcessor(Processor): String replacement processor base """ - def __init__(self, search, replace, name=None, parent=None, supported=None): + def __init__(self, search, replace, name=None, parent=None, supported=None, **kwargs): super(StringProcessor, self).__init__(name=name, supported=supported) self.search = search self.replace = replace @@ -31,7 +31,7 @@ class MultipleLineProcessor(Processor): "data": {"old_value": "new_value"} } """ - def __init__(self, snr_dict, name=None, parent=None, supported=None): + def __init__(self, snr_dict, name=None, parent=None, supported=None, **kwargs): super(MultipleLineProcessor, self).__init__(name=name, supported=supported) self.snr_dict = snr_dict From e94bd3fcb99c40a2df3e30cf723a95cc022371c9 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 12 Apr 2020 06:52:45 +0200 Subject: [PATCH 660/710] providers: addic7ed: limit downloads per day; add vip setting --- Contents/Code/support/config.py | 8 +++-- Contents/DefaultPrefs.json | 6 ++++ .../Libraries/Shared/subliminal/exceptions.py | 5 +++ .../subliminal_patch/providers/addic7ed.py | 32 +++++++++++++++++-- 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 54fcee010..4c3395888 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -15,7 +15,8 @@ import subliminal_patch import subzero.constants import lib -from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded, AuthenticationError +from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded, AuthenticationError, \ + DownloadLimitPerDayExceeded from subliminal_patch.core import is_windows_special_path from whichdb import whichdb @@ -61,12 +62,14 @@ def int_or_default(s, default): return default -VALID_THROTTLE_EXCEPTIONS = (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable, APIThrottled) +VALID_THROTTLE_EXCEPTIONS = (TooManyRequests, DownloadLimitExceeded, DownloadLimitPerDayExceeded, + ServiceUnavailable, APIThrottled) PROVIDER_THROTTLE_MAP = { "default": { TooManyRequests: (datetime.timedelta(hours=1), "1 hour"), DownloadLimitExceeded: (datetime.timedelta(hours=3), "3 hours"), + DownloadLimitPerDayExceeded: (datetime.timedelta(days=1), "1 days"), ServiceUnavailable: (datetime.timedelta(minutes=20), "20 minutes"), APIThrottled: (datetime.timedelta(minutes=10), "10 minutes"), AuthenticationError: (datetime.timedelta(hours=2), "2 hours"), @@ -873,6 +876,7 @@ def get_provider_settings(self): provider_settings = {'addic7ed': {'username': Prefs['provider.addic7ed.username'], 'password': Prefs['provider.addic7ed.password'], + 'is_vip': cast_bool(Prefs['provider.addic7ed.is_vip']), }, 'opensubtitles': {'username': Prefs['provider.opensubtitles.username'], 'password': Prefs['provider.opensubtitles.password'], diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 0724a2319..2954a1f00 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -375,6 +375,12 @@ "default": "", "secure": "true" }, + { + "id": "provider.addic7ed.is_vip", + "label": "Addic7ed VIP? (80 vs 40 downloads per day)", + "type": "bool", + "default": "false" + }, { "id": "provider.addic7ed.boost_by2", "label": "Addic7ed: boost score (if requirements met)", diff --git a/Contents/Libraries/Shared/subliminal/exceptions.py b/Contents/Libraries/Shared/subliminal/exceptions.py index 14d4f6412..ed46be1a4 100644 --- a/Contents/Libraries/Shared/subliminal/exceptions.py +++ b/Contents/Libraries/Shared/subliminal/exceptions.py @@ -27,3 +27,8 @@ class ServiceUnavailable(ProviderError): class DownloadLimitExceeded(ProviderError): """Exception raised by providers when download limit is exceeded.""" pass + + +class DownloadLimitPerDayExceeded(ProviderError): + """Exception raised by providers when download limit is exceeded.""" + pass diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 02010fa13..87dbb8fa3 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -2,6 +2,8 @@ import logging import re import datetime + +import pytz import subliminal import time @@ -10,7 +12,8 @@ from dogpile.cache.api import NO_VALUE from requests import Session from subliminal.cache import region -from subliminal.exceptions import DownloadLimitExceeded, AuthenticationError, ConfigurationError +from subliminal.exceptions import DownloadLimitExceeded, AuthenticationError, ConfigurationError, \ + DownloadLimitPerDayExceeded from subliminal.providers.addic7ed import Addic7edProvider as _Addic7edProvider, \ Addic7edSubtitle as _Addic7edSubtitle, ParserBeautifulSoup from subliminal.subtitle import fix_line_ending @@ -64,6 +67,7 @@ class Addic7edProvider(_Addic7edProvider): 'slk', 'slv', 'spa', 'sqi', 'srp', 'swe', 'tha', 'tur', 'ukr', 'vie', 'zho' ]} | {Language.fromietf(l) for l in ["sr-Latn", "sr-Cyrl"]} + vip = False USE_ADDICTED_RANDOM_AGENTS = False hearing_impaired_verifiable = True subtitle_class = Addic7edSubtitle @@ -72,9 +76,10 @@ class Addic7edProvider(_Addic7edProvider): sanitize_characters = {'-', ':', '(', ')', '.', '/'} last_show_ids_fetch_key = "addic7ed_last_id_fetch" - def __init__(self, username=None, password=None, use_random_agents=False): + def __init__(self, username=None, password=None, use_random_agents=False, is_vip=False): super(Addic7edProvider, self).__init__(username=username, password=password) self.USE_ADDICTED_RANDOM_AGENTS = use_random_agents + self.vip = is_vip if not all((username, password)): raise ConfigurationError('Username and password must be specified') @@ -397,6 +402,27 @@ def query(self, show_id, series, season, year=None, country=None): return subtitles def download_subtitle(self, subtitle): + last_dl = region.get("addic7ed_dl_ts") + amount = region.get("addic7ed_dl_amount") + if amount is NO_VALUE: + amount = 0 + + cap = self.vip and 80 or 40 + + # we may be falsely assuming germany here; also they might just use UTC. + germany_now = datetime.datetime.now(tz=pytz.timezone("Europe/Berlin")) + midnight = datetime.datetime.combine(germany_now, datetime.time.min) + + # reset at night + if last_dl <= midnight: + logger.info("Reset dl amount (max: %s)", cap) + region.set("addic7ed_dl_amount", 0) + amount = 0 + + if amount >= cap: + logger.info("Used %s/%s of downloads since %s", (amount, cap, last_dl)) + raise DownloadLimitPerDayExceeded + # download the subtitle r = self.session.get(self.server_url + subtitle.download_link, headers={'Referer': subtitle.page_link}, timeout=10) @@ -416,3 +442,5 @@ def download_subtitle(self, subtitle): raise DownloadLimitExceeded subtitle.content = fix_line_ending(r.content) + region.set("addic7ed_dl_amount", amount + 1) + region.set("addic7ed_dl_ts", germany_now) From 740fc93c1344f3c2db387ffbeef62ae07a73a3d5 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 12 Apr 2020 06:54:36 +0200 Subject: [PATCH 661/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index fde05c57a..5312ba50c 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3229</string> + <string>2.6.5.3232</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3229 DEV +Version 2.6.5.3232 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From ea03f3fc4d8317f22e5395a463a849c63fdc1f44 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 12 Apr 2020 22:47:21 +0200 Subject: [PATCH 662/710] providers: addic7ed: properly compare last_dl, add last_reset tracking info to log #723 --- .../Shared/subliminal_patch/providers/addic7ed.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index 87dbb8fa3..f460cb225 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -403,10 +403,14 @@ def query(self, show_id, series, season, year=None, country=None): def download_subtitle(self, subtitle): last_dl = region.get("addic7ed_dl_ts") + last_reset = region.get("addic7ed_dl_ts_lr") amount = region.get("addic7ed_dl_amount") if amount is NO_VALUE: amount = 0 + if last_reset is NO_VALUE: + last_reset = "never" + cap = self.vip and 80 or 40 # we may be falsely assuming germany here; also they might just use UTC. @@ -414,9 +418,11 @@ def download_subtitle(self, subtitle): midnight = datetime.datetime.combine(germany_now, datetime.time.min) # reset at night - if last_dl <= midnight: + if last_dl and last_dl != NO_VALUE and last_dl <= midnight: logger.info("Reset dl amount (max: %s)", cap) region.set("addic7ed_dl_amount", 0) + region.set("addic7ed_dl_ts_lr", germany_now) + last_reset = germany_now amount = 0 if amount >= cap: @@ -444,3 +450,4 @@ def download_subtitle(self, subtitle): subtitle.content = fix_line_ending(r.content) region.set("addic7ed_dl_amount", amount + 1) region.set("addic7ed_dl_ts", germany_now) + logger.info("Used %s/%s of downloads since %s", (amount + 1, cap, last_reset)) From 289f174e2bc86f90aa1401aeb68b35079bd18426 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Mon, 13 Apr 2020 05:54:04 +0200 Subject: [PATCH 663/710] providers: addic7ed: properly implement limits #723 --- .../subliminal_patch/providers/addic7ed.py | 41 ++++++++----------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index f460cb225..a4fa4fb9d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -2,8 +2,8 @@ import logging import re import datetime +import types -import pytz import subliminal import time @@ -402,31 +402,22 @@ def query(self, show_id, series, season, year=None, country=None): return subtitles def download_subtitle(self, subtitle): - last_dl = region.get("addic7ed_dl_ts") - last_reset = region.get("addic7ed_dl_ts_lr") - amount = region.get("addic7ed_dl_amount") - if amount is NO_VALUE: - amount = 0 + last_dls = region.get("addic7ed_dls") + now = datetime.datetime.now() + one_day = datetime.timedelta(hours=24) - if last_reset is NO_VALUE: - last_reset = "never" + if not isinstance(last_dls, types.ListType): + last_dls = [] + else: + # filter all non-expired DLs + last_dls = filter(lambda t: t + one_day > now, last_dls) + region.set("addic7ed_dls", last_dls) cap = self.vip and 80 or 40 - - # we may be falsely assuming germany here; also they might just use UTC. - germany_now = datetime.datetime.now(tz=pytz.timezone("Europe/Berlin")) - midnight = datetime.datetime.combine(germany_now, datetime.time.min) - - # reset at night - if last_dl and last_dl != NO_VALUE and last_dl <= midnight: - logger.info("Reset dl amount (max: %s)", cap) - region.set("addic7ed_dl_amount", 0) - region.set("addic7ed_dl_ts_lr", germany_now) - last_reset = germany_now - amount = 0 + amount = len(last_dls) if amount >= cap: - logger.info("Used %s/%s of downloads since %s", (amount, cap, last_dl)) + logger.info("Addic7ed: Downloads per day exceeded (%s)", cap) raise DownloadLimitPerDayExceeded # download the subtitle @@ -440,7 +431,7 @@ def download_subtitle(self, subtitle): if not r.content: # Provider wrongful return a status of 304 Not Modified with an empty content # raise_for_status won't raise exception for that status code - logger.error('Unable to download subtitle. No data returned from provider') + logger.error('Addic7ed: Unable to download subtitle. No data returned from provider') return # detect download limit exceeded @@ -448,6 +439,6 @@ def download_subtitle(self, subtitle): raise DownloadLimitExceeded subtitle.content = fix_line_ending(r.content) - region.set("addic7ed_dl_amount", amount + 1) - region.set("addic7ed_dl_ts", germany_now) - logger.info("Used %s/%s of downloads since %s", (amount + 1, cap, last_reset)) + last_dls.append(datetime.datetime.now()) + region.set("addic7ed_dls", last_dls) + logger.info("Addic7ed: Used %s/%s downloads", amount+1, cap) From 31ff93c3f13d4519d9aff282bf1217ff6e936197 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Mon, 13 Apr 2020 05:57:41 +0200 Subject: [PATCH 664/710] fix logging; set DownloadLimitPerDayExceeded timeout to 4 hours (was one day); #723 --- Contents/Code/support/config.py | 2 +- Contents/Libraries/Shared/subliminal_patch/core.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 4c3395888..6939a0bc4 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -69,7 +69,7 @@ def int_or_default(s, default): "default": { TooManyRequests: (datetime.timedelta(hours=1), "1 hour"), DownloadLimitExceeded: (datetime.timedelta(hours=3), "3 hours"), - DownloadLimitPerDayExceeded: (datetime.timedelta(days=1), "1 days"), + DownloadLimitPerDayExceeded: (datetime.timedelta(hours=4), "4 hours"), ServiceUnavailable: (datetime.timedelta(minutes=20), "20 minutes"), APIThrottled: (datetime.timedelta(minutes=10), "10 minutes"), AuthenticationError: (datetime.timedelta(hours=2), "2 hours"), diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index d94515064..74736d609 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -264,7 +264,7 @@ def download_subtitle(self, subtitle): requests.exceptions.SSLError, requests.Timeout, socket.timeout): - logger.error('Provider %r connection error', subtitle.provider_name) + logger.exception('Provider %r connection error', subtitle.provider_name) except ResponseNotReady: logger.error('Provider %r response error, reinitializing', subtitle.provider_name) From c787e671c3339da1c8dcb73afafe32981ed538f2 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 14 Apr 2020 05:06:02 +0200 Subject: [PATCH 665/710] providers: addic7ed: enforce limits once they're hit, to avoid unnecessary search queries #723 --- .../Shared/subliminal_patch/providers/addic7ed.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index a4fa4fb9d..3475d6689 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -406,6 +406,10 @@ def download_subtitle(self, subtitle): now = datetime.datetime.now() one_day = datetime.timedelta(hours=24) + def raise_limit(): + logger.info("Addic7ed: Downloads per day exceeded (%s)", cap) + raise DownloadLimitPerDayExceeded + if not isinstance(last_dls, types.ListType): last_dls = [] else: @@ -417,8 +421,7 @@ def download_subtitle(self, subtitle): amount = len(last_dls) if amount >= cap: - logger.info("Addic7ed: Downloads per day exceeded (%s)", cap) - raise DownloadLimitPerDayExceeded + raise_limit() # download the subtitle r = self.session.get(self.server_url + subtitle.download_link, headers={'Referer': subtitle.page_link}, @@ -441,4 +444,8 @@ def download_subtitle(self, subtitle): subtitle.content = fix_line_ending(r.content) last_dls.append(datetime.datetime.now()) region.set("addic7ed_dls", last_dls) - logger.info("Addic7ed: Used %s/%s downloads", amount+1, cap) + logger.info("Addic7ed: Used %s/%s downloads", amount + 1, cap) + + if amount + 1 >= cap: + raise_limit() + From e083e133eb072cd5b41a073ecedcfd4dc7b7e52e Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 14 Apr 2020 05:06:45 +0200 Subject: [PATCH 666/710] bump dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 5312ba50c..bfa8f6f65 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3232</string> + <string>2.6.5.3237</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3232 DEV +Version 2.6.5.3237 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 0be589bc5f420743e23cc34836c0e06691b4d84c Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 25 Jul 2020 05:01:12 +0200 Subject: [PATCH 667/710] add support for new Plex Movie agent --- Contents/Code/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index c98b2441f..1ed0daf2f 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -262,7 +262,8 @@ def update(self, metadata, media, lang): class SubZeroSubtitlesAgentMovies(SubZeroAgent, Agent.Movies): - contributes_to = ['com.plexapp.agents.imdb', 'com.plexapp.agents.xbmcnfo', 'com.plexapp.agents.themoviedb', 'com.plexapp.agents.hama'] + contributes_to = ['com.plexapp.agents.imdb', 'com.plexapp.agents.xbmcnfo', 'com.plexapp.agents.themoviedb', + 'com.plexapp.agents.hama', 'tv.plex.agents.movie'] score_prefs_key = "subtitles.search.minimumMovieScore2" agent_type_verbose = "Movies" From 52bac14a2e2fd2495bc468f6dd19304e5aef28c9 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 25 Jul 2020 05:08:51 +0200 Subject: [PATCH 668/710] core: remove old remnants; core: update certifi to 2020.6.20 --- Contents/Libraries/Shared/certifi/__init__.py | 4 +- Contents/Libraries/Shared/certifi/__main__.py | 14 +- Contents/Libraries/Shared/certifi/cacert.pem | 456 ++++++++---------- Contents/Libraries/Shared/certifi/core.py | 53 +- .../Libraries/Shared/subliminal_patch/http.py | 5 - 5 files changed, 272 insertions(+), 260 deletions(-) diff --git a/Contents/Libraries/Shared/certifi/__init__.py b/Contents/Libraries/Shared/certifi/__init__.py index 632db8e13..5d52a62e7 100644 --- a/Contents/Libraries/Shared/certifi/__init__.py +++ b/Contents/Libraries/Shared/certifi/__init__.py @@ -1,3 +1,3 @@ -from .core import where +from .core import contents, where -__version__ = "2019.03.09" +__version__ = "2020.06.20" diff --git a/Contents/Libraries/Shared/certifi/__main__.py b/Contents/Libraries/Shared/certifi/__main__.py index 5f1da0dd0..8945b5da8 100644 --- a/Contents/Libraries/Shared/certifi/__main__.py +++ b/Contents/Libraries/Shared/certifi/__main__.py @@ -1,2 +1,12 @@ -from certifi import where -print(where()) +import argparse + +from certifi import contents, where + +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--contents", action="store_true") +args = parser.parse_args() + +if args.contents: + print(contents()) +else: + print(where()) diff --git a/Contents/Libraries/Shared/certifi/cacert.pem b/Contents/Libraries/Shared/certifi/cacert.pem index 84636dde7..0fd855f46 100644 --- a/Contents/Libraries/Shared/certifi/cacert.pem +++ b/Contents/Libraries/Shared/certifi/cacert.pem @@ -58,38 +58,6 @@ AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - # Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Label: "Entrust.net Premium 2048 Secure Server CA" @@ -152,39 +120,6 @@ ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - # Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. # Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. # Label: "Entrust Root Certification Authority" @@ -771,36 +706,6 @@ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +OkuE6N36B9K -----END CERTIFICATE----- -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - # Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. # Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. # Label: "DST Root CA X3" @@ -1219,36 +1124,6 @@ t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - # Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc # Subject: CN=Cybertrust Global Root O=Cybertrust, Inc # Label: "Cybertrust Global Root" @@ -1559,47 +1434,6 @@ uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - # Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post # Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post # Label: "Hongkong Post Root CA 1" @@ -2200,6 +2034,45 @@ t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- +# Issuer: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Subject: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Label: "EC-ACC" +# Serial: -23701579247955709139626555126524820479 +# MD5 Fingerprint: eb:f5:9d:29:0d:61:f9:42:1f:7c:c2:ba:6d:e3:15:09 +# SHA1 Fingerprint: 28:90:3a:63:5b:52:80:fa:e6:77:4c:0b:6d:a7:d6:ba:a6:4a:f2:e8 +# SHA256 Fingerprint: 88:49:7f:01:60:2f:31:54:24:6a:e2:8c:4d:5a:ef:10:f1:d8:7e:bb:76:62:6f:4a:e0:b7:f9:5b:a7:96:87:99 +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB +8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy +dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 +YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 +dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh +IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD +LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG +EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g +KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD +ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu +bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg +ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R +85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm +4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV +HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd +QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t +lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB +o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 +opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo +dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW +ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN +AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y +/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k +SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy +Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS +Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl +nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= +-----END CERTIFICATE----- + # Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority # Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority # Label: "Hellenic Academic and Research Institutions RootCA 2011" @@ -3453,46 +3326,6 @@ AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ 5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- -# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Root CA" -# Serial: 1 -# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f -# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 -# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 ------BEGIN CERTIFICATE----- -MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb -BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz -MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx -FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g -Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 -fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl -LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV -WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF -TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb -5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc -CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri -wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ -wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG -m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 -F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng -WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 -2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF -AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ -0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw -F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS -g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj -qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN -h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ -ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V -btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj -Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ -8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW -gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= ------END CERTIFICATE----- - # Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed # Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed # Label: "OISTE WISeKey Global Root GB CA" @@ -3849,47 +3682,6 @@ CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW 1KyLa2tJElMzrdfkviT8tQp21KW8EA== -----END CERTIFICATE----- -# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Label: "LuxTrust Global Root 2" -# Serial: 59914338225734147123941058376788110305822489521 -# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c -# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f -# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 ------BEGIN CERTIFICATE----- -MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL -BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV -BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw -MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B -LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F -ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem -hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 -EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn -Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 -zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ -96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m -j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g -DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ -8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j -X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH -hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB -KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 -Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT -+Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL -BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 -BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO -jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 -loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c -qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ -2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ -JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre -zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf -LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ -x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 -oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr ------END CERTIFICATE----- - # Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM # Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM # Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" @@ -4656,3 +4448,173 @@ L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG mpv0 -----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G4" +# Serial: 289383649854506086828220374796556676440 +# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 +# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 +# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw +gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL +Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg +MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw +BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 +MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 +c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ +bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ +2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E +T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j +5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM +C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T +DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX +wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A +2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm +nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl +N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj +c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS +5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS +Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr +hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ +B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI +AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw +H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ +b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk +2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol +IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk +5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY +n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft ECC Root Certificate Authority 2017" +# Serial: 136839042543790627607696632466672567020 +# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 +# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 +# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD +VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw +MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy +b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR +ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb +hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 +FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV +L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB +iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft RSA Root Certificate Authority 2017" +# Serial: 40975477897264996090493496164228220339 +# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 +# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 +# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl +MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N +aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ +Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 +ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 +HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm +gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ +jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc +aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG +YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 +W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K +UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH ++FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q +W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC +LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC +gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 +tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh +SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 +TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 +pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR +xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp +GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 +dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN +AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB +RA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Label: "e-Szigno Root CA 2017" +# Serial: 411379200276854331539784714 +# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 +# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 +# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV +BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk +LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv +b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ +BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg +THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v +IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv +xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H +Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB +eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo +jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ ++efcMQ== +-----END CERTIFICATE----- + +# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Label: "certSIGN Root CA G2" +# Serial: 313609486401300475190 +# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 +# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 +# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV +BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g +Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ +BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ +R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF +dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw +vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ +uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp +n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs +cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW +xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P +rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF +DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx +DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy +LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C +eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ +d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq +kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl +qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 +OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c +NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk +ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO +pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj +03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk +PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE +1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX +QRBdJ3NghVdJIgc= +-----END CERTIFICATE----- diff --git a/Contents/Libraries/Shared/certifi/core.py b/Contents/Libraries/Shared/certifi/core.py index 7271acf40..5d2b8cd32 100644 --- a/Contents/Libraries/Shared/certifi/core.py +++ b/Contents/Libraries/Shared/certifi/core.py @@ -4,12 +4,57 @@ certifi.py ~~~~~~~~~~ -This module returns the installation location of cacert.pem. +This module returns the installation location of cacert.pem or its contents. """ import os +try: + from importlib.resources import path as get_path, read_text -def where(): - f = os.path.dirname(__file__) + _CACERT_CTX = None + _CACERT_PATH = None - return os.path.join(f, 'cacert.pem') + def where(): + # This is slightly terrible, but we want to delay extracting the file + # in cases where we're inside of a zipimport situation until someone + # actually calls where(), but we don't want to re-extract the file + # on every call of where(), so we'll do it once then store it in a + # global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you to + # manage the cleanup of this file, so it doesn't actually return a + # path, it returns a context manager that will give you the path + # when you enter it and will do any cleanup when you leave it. In + # the common case of not needing a temporary file, it will just + # return the file system location and the __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_CTX = get_path("certifi", "cacert.pem") + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + + return _CACERT_PATH + + +except ImportError: + # This fallback will work for Python versions prior to 3.7 that lack the + # importlib.resources module but relies on the existing `where` function + # so won't address issues with environments like PyOxidizer that don't set + # __file__ on modules. + def read_text(_module, _path, encoding="ascii"): + with open(where(), "r", encoding=encoding) as data: + return data.read() + + # If we don't have importlib.resources, then we will just do the old logic + # of assuming we're on the filesystem and munge the path directly. + def where(): + f = os.path.dirname(__file__) + + return os.path.join(f, "cacert.pem") + + +def contents(): + return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 44219e304..043f0f697 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -36,11 +36,6 @@ logger = logging.getLogger(__name__) pem_file = os.path.normpath(os.path.join(os.path.dirname(os.path.realpath(unicode(__file__, get_viable_encoding()))), "..", certifi.where())) -try: - default_ssl_context = ssl.create_default_context(cafile=pem_file) -except AttributeError: - # < Python 2.7.9 - default_ssl_context = None class TimeoutSession(requests.Session): From 648464612275a0bae2ee70a4687f262a466e4b36 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 25 Jul 2020 05:22:57 +0200 Subject: [PATCH 669/710] advanced_settings: refiners: drone: add custom pem_file support; fixes #735 --- Contents/Libraries/Shared/subliminal_patch/http.py | 7 ++++--- .../Libraries/Shared/subliminal_patch/refiners/drone.py | 4 ++-- Contents/advanced_settings.json.template | 3 +++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 043f0f697..2ba824117 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -35,7 +35,8 @@ from subzero.lib.io import get_viable_encoding logger = logging.getLogger(__name__) -pem_file = os.path.normpath(os.path.join(os.path.dirname(os.path.realpath(unicode(__file__, get_viable_encoding()))), "..", certifi.where())) +pem_file = os.path.normpath(os.path.join(os.path.dirname(os.path.realpath(unicode(__file__, get_viable_encoding()))), + "..", certifi.where())) class TimeoutSession(requests.Session): @@ -53,9 +54,9 @@ def request(self, method, url, *args, **kwargs): class CertifiSession(TimeoutSession): - def __init__(self): + def __init__(self, verify=None): super(CertifiSession, self).__init__() - self.verify = pem_file + self.verify = verify or pem_file class NeedsCaptchaException(Exception): diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/drone.py b/Contents/Libraries/Shared/subliminal_patch/refiners/drone.py index ae96e26c9..8e5e6d3fa 100644 --- a/Contents/Libraries/Shared/subliminal_patch/refiners/drone.py +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/drone.py @@ -19,11 +19,11 @@ class DroneAPIClient(object): _fill_attrs = None def __init__(self, version=1, session=None, headers=None, timeout=10, base_url=None, api_key=None, - ssl_no_verify=False): + ssl_no_verify=False, pem_file=None): headers = dict(headers or {}, **{"X-Api-Key": api_key}) #: Session for the requests - self.session = session or CertifiSession() + self.session = session or CertifiSession(verify=pem_file) if ssl_no_verify: self.session.verify = False diff --git a/Contents/advanced_settings.json.template b/Contents/advanced_settings.json.template index 4db303835..f13d12154 100644 --- a/Contents/advanced_settings.json.template +++ b/Contents/advanced_settings.json.template @@ -85,9 +85,12 @@ Don't expect support if you mess this up. "sonarr": { // don't verify HTTPS certificates? Set to True for self-signed certificates "ssl_no_verify": false, + // custom path to certificate pem file + "pem_file": None, }, "radarr": { "ssl_no_verify": false, + "pem_file": None, }, } } \ No newline at end of file From d98ae74c8aa5eb6f00edfbe3a515dc4026ec3623 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 25 Jul 2020 05:51:09 +0200 Subject: [PATCH 670/710] 2.6.5.3241 --- CHANGELOG.md | 17 +++++++++++++++++ Contents/Info.plist | 4 ++-- README.md | 29 +++++++++++++++-------------- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6380729a9..2b9a1a4fe 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +2.6.5.3217 + +subscene, addic7ed +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- core: also extract (missing) embedded subtitles when SearchAllRecentlyAddedMissing is running +- core: core: clarify detecting streams (in logs) +- core: UnRAR: set binary to executable, even if not checked out from git; might fix #693 +- core: bazarr-backport: morpheus65535/bazarr#703: use proper language code detection instead of a wild guess; should fix bad existing subtitle detection +- core: bazarr-backport: morpheus65535/bazarr#660: fix BOM encoding stuff +- core: bazarr-backport: morpheus65535/bazarr#656 further generalize formats; skip release group match if format match failed +- core: fix stream detection when using mediainfo (#711) +- config/core: make periodic SZ-internal subtitle maintenance interval configurable +- providers: add BSPlayer Subtitles +- providers: add ScrewZira (Hebrew) + 2.6.5.3183 subscene, addic7ed diff --git a/Contents/Info.plist b/Contents/Info.plist index bfa8f6f65..416a52ca1 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3237</string> + <string>2.6.5.3241</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3237 DEV +Version 2.6.5.3241 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 209c0576d..846e652cb 100644 --- a/README.md +++ b/README.md @@ -94,32 +94,33 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3223 +2.6.5.3241 subscene, addic7ed - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog -- core: scoring: reorder subtitles based on second non-hash-score if main hash score is the same; morpheus65535/bazarr#821 -- providers: bsplayer: verify hash; clean up +- core: add support for new Plex Movie agent +- core: remove py3 compat breaking unnecessary change +- core: skip drawing tags for SRT +- core: advanced_settings: refiners: drone: add custom pem_file support; fixes #735 +- providers: core: set DownloadLimitPerDayExceeded timeout to 4 hours (was one day); +- providers: addic7ed: limit downloads per day; add vip setting +- providers: addic7ed: properly compare last_dl, add last_reset tracking info to log #723 +- providers: addic7ed: properly implement limits +- submod: HI: remove more music tags +- submod: common CM_punctuation_space2: detect AND don't try changing domain/url/host when fixing punctuation -2.6.5.3217 +2.6.5.3223 subscene, addic7ed - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog -- core: also extract (missing) embedded subtitles when SearchAllRecentlyAddedMissing is running -- core: core: clarify detecting streams (in logs) -- core: UnRAR: set binary to executable, even if not checked out from git; might fix #693 -- core: bazarr-backport: morpheus65535/bazarr#703: use proper language code detection instead of a wild guess; should fix bad existing subtitle detection -- core: bazarr-backport: morpheus65535/bazarr#660: fix BOM encoding stuff -- core: bazarr-backport: morpheus65535/bazarr#656 further generalize formats; skip release group match if format match failed -- core: fix stream detection when using mediainfo (#711) -- config/core: make periodic SZ-internal subtitle maintenance interval configurable -- providers: add BSPlayer Subtitles -- providers: add ScrewZira (Hebrew) +- core: scoring: reorder subtitles based on second non-hash-score if main hash score is the same; morpheus65535/bazarr#821 +- providers: bsplayer: verify hash; clean up + [older changes](CHANGELOG.md) From df1fba83a8d9c44e18c5ad8a3a0c1a2e9c37fcfe Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 25 Jul 2020 05:53:12 +0200 Subject: [PATCH 671/710] release 2.6.5.3241 --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 416a52ca1..d395cd32d 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3241 DEV +Version 2.6.5.3241 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From de2b11f69a3bcc166d3454ad95c2b56932640e7a Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 25 Jul 2020 05:56:40 +0200 Subject: [PATCH 672/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index d395cd32d..416a52ca1 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3241 +Version 2.6.5.3241 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 8512940ccfe2037b575d2c8be8c93e03654e21a9 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 25 Jul 2020 15:00:28 +0200 Subject: [PATCH 673/710] core: fix for tv.plex.agents.movie not populating its media types --- Contents/Code/support/config.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 6939a0bc4..fd282f88e 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -666,12 +666,18 @@ def check_enabled_sections(self): if not agent.primary: continue - for t in list(agent.media_types): - if t.media_type in (MOVIE, SHOW): - related_agents = Plex.primary_agent(agent.identifier, t.media_type) + media_types = [t.media_type for t in list(agent.media_types)] + + # the new movie agent doesn't populate its media types, workaround + if not media_types and agent.identifier == "tv.plex.agents.movie": + media_types = [MOVIE] + + for media_type in media_types: + if media_type in (MOVIE, SHOW): + related_agents = Plex.primary_agent(agent.identifier, media_type) for a in related_agents: if a.identifier == PLUGIN_IDENTIFIER and a.enabled: - enabled_for_primary_agents[MEDIA_TYPE_TO_STRING[t.media_type]].append(agent.identifier) + enabled_for_primary_agents[MEDIA_TYPE_TO_STRING[media_type]].append(agent.identifier) # find the libraries that use them for library in self.sections: From 8a059c988eab95f04842bc69fd3a92013f0c579d Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 26 Jul 2020 03:07:04 +0200 Subject: [PATCH 674/710] core: findBetterSubtitles: increase minimum score for better subtitles for movies with extracted embedded subs from 82 to 112 --- Contents/Code/support/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index 972ba66d0..a6b45bc3c 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -670,7 +670,7 @@ def run(self): min_score_series = int(Prefs["subtitles.search.minimumTVScore2"].strip()) min_score_movies = int(Prefs["subtitles.search.minimumMovieScore2"].strip()) min_score_extracted_series = config.advanced.find_better_as_extracted_tv_score or 352 - min_score_extracted_movies = config.advanced.find_better_as_extracted_movie_score or 82 + min_score_extracted_movies = config.advanced.find_better_as_extracted_movie_score or 112 overwrite_manually_modified = cast_bool( Prefs["scheduler.tasks.FindBetterSubtitles.overwrite_manually_modified"]) overwrite_manually_selected = cast_bool( From f25968239110d41a93a5864e83809abc331be9b7 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 26 Jul 2020 03:08:46 +0200 Subject: [PATCH 675/710] core: findBetterSubtitles: increase minimum score for better subtitles for movies with extracted embedded subs from 82 to 112 --- Contents/advanced_settings.json.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/advanced_settings.json.template b/Contents/advanced_settings.json.template index f13d12154..19b12e2ae 100644 --- a/Contents/advanced_settings.json.template +++ b/Contents/advanced_settings.json.template @@ -22,7 +22,7 @@ Don't expect support if you mess this up. // when the find better subtitles task finds a subtitle for an item that has an active extracted embedded subtitle // set, what should be the minimum score that subtitle has to have in order to be considered better? "find_better_as_extracted_tv_score": 352, - "find_better_as_extracted_movie_score": 82, + "find_better_as_extracted_movie_score": 112, // SZ can use mediainfo if present to detect titles/forced state of MP4 MOV_TEXT, because the PMS currently doesn't // set the title attribute From 6b918be799fedd849bc1e2cb2d4b3e378c7eb3b8 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sun, 26 Jul 2020 03:12:35 +0200 Subject: [PATCH 676/710] release 2.6.5.3247 --- Contents/Info.plist | 6 +++--- README.md | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 416a52ca1..f3deb9597 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3241</string> + <string>2.6.5.3247</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3241 DEV +Version 2.6.5.3247 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 846e652cb..13ed66ce4 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,16 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog +2.6.5.3247 + +subscene, addic7ed +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +core: fix for tv.plex.agents.movie not populating its media types +core: tasks: findBetterSubtitles: increase minimum score for better subtitles for movies with extracted embedded subs from 82 to 112 + + 2.6.5.3241 subscene, addic7ed From a9b677f0cea47003e093dc426523aacfc178d389 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Sat, 8 Aug 2020 03:43:27 +0200 Subject: [PATCH 677/710] core: catch more exceptions --- Contents/Code/support/config.py | 6 +++++- .../Libraries/Shared/subliminal_patch/core.py | 17 +++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index fd282f88e..7796c09c2 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -10,6 +10,8 @@ import datetime import stat import traceback +import socket +import requests import subliminal import subliminal_patch @@ -63,7 +65,7 @@ def int_or_default(s, default): VALID_THROTTLE_EXCEPTIONS = (TooManyRequests, DownloadLimitExceeded, DownloadLimitPerDayExceeded, - ServiceUnavailable, APIThrottled) + ServiceUnavailable, APIThrottled, requests.Timeout, socket.timeout) PROVIDER_THROTTLE_MAP = { "default": { @@ -73,6 +75,8 @@ def int_or_default(s, default): ServiceUnavailable: (datetime.timedelta(minutes=20), "20 minutes"), APIThrottled: (datetime.timedelta(minutes=10), "10 minutes"), AuthenticationError: (datetime.timedelta(hours=2), "2 hours"), + requests.Timeout: (datetime.timedelta(minutes=20), "20 minutes"), + socket.timeout: (datetime.timedelta(minutes=20), "20 minutes"), }, "opensubtitles": { TooManyRequests: (datetime.timedelta(hours=3), "3 hours"), diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 74736d609..7c40516cc 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -108,10 +108,12 @@ def __delitem__(self, name): try: logger.info('Terminating provider %s', name) self.initialized_providers[name].terminate() - except (requests.Timeout, socket.timeout): + except (requests.Timeout, socket.timeout) as e: logger.error('Provider %r timed out, improperly terminated', name) - except: + self.throttle_callback(name, e) + except Exception as e: logger.exception('Provider %r terminated unexpectedly', name) + self.throttle_callback(name, e) del self.initialized_providers[name] @@ -183,8 +185,9 @@ def list_subtitles_provider(self, provider, video, languages): return out - except (requests.Timeout, socket.timeout): - logger.error('Provider %r timed out', provider) + except (requests.Timeout, socket.timeout) as e: + logger.exception('Provider %r timed out', provider) + self.throttle_callback(provider, e) except Exception as e: logger.exception('Unexpected error in provider %r: %s', provider, traceback.format_exc()) @@ -263,10 +266,11 @@ def download_subtitle(self, subtitle): requests.exceptions.ProxyError, requests.exceptions.SSLError, requests.Timeout, - socket.timeout): + socket.timeout) as e: logger.exception('Provider %r connection error', subtitle.provider_name) + self.throttle_callback(subtitle.provider_name, e) - except ResponseNotReady: + except ResponseNotReady as e: logger.error('Provider %r response error, reinitializing', subtitle.provider_name) try: self[subtitle.provider_name].terminate() @@ -274,6 +278,7 @@ def download_subtitle(self, subtitle): except: logger.error('Provider %r reinitialization error: %s', subtitle.provider_name, traceback.format_exc()) + self.throttle_callback(subtitle.provider_name, e) except rarfile.BadRarFile: logger.error('Malformed RAR file from provider %r, skipping subtitle.', subtitle.provider_name) From 89dded387d88d72723ebf3aa624a3466d7f6bbaa Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 12 Aug 2020 16:09:53 +0200 Subject: [PATCH 678/710] core: properly handle ReadTimeout --- Contents/Code/support/config.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 7796c09c2..66e172fd1 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -65,7 +65,9 @@ def int_or_default(s, default): VALID_THROTTLE_EXCEPTIONS = (TooManyRequests, DownloadLimitExceeded, DownloadLimitPerDayExceeded, - ServiceUnavailable, APIThrottled, requests.Timeout, socket.timeout) + ServiceUnavailable, APIThrottled, requests.Timeout, requests.ReadTimeout, socket.timeout) + +def_timeout = (datetime.timedelta(minutes=20), "20 minutes") PROVIDER_THROTTLE_MAP = { "default": { @@ -75,8 +77,9 @@ def int_or_default(s, default): ServiceUnavailable: (datetime.timedelta(minutes=20), "20 minutes"), APIThrottled: (datetime.timedelta(minutes=10), "10 minutes"), AuthenticationError: (datetime.timedelta(hours=2), "2 hours"), - requests.Timeout: (datetime.timedelta(minutes=20), "20 minutes"), - socket.timeout: (datetime.timedelta(minutes=20), "20 minutes"), + requests.Timeout: def_timeout, + socket.timeout: def_timeout, + requests.ReadTimeout: def_timeout, }, "opensubtitles": { TooManyRequests: (datetime.timedelta(hours=3), "3 hours"), From 25f204b330be38d79455a9fdcc2a5cab7aa302e4 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 12 Aug 2020 17:01:06 +0200 Subject: [PATCH 679/710] whoops, missed dev flag --- Contents/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index f3deb9597..fb4fe99df 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -21,7 +21,7 @@ <key>PlexPluginMode</key> <string>Daemon</string> <key>PlexPluginConsoleLogging</key> - <string>0</string> + <string>1</string> <key>PlexPluginDevMode</key> <string>0</string> <key>PlexPluginCodePolicy</key> From c77489a5bea5c8af37cb921daa8a4513242c1697 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Wed, 12 Aug 2020 17:02:54 +0200 Subject: [PATCH 680/710] the heat --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index fb4fe99df..1dcf9450d 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -21,9 +21,9 @@ <key>PlexPluginMode</key> <string>Daemon</string> <key>PlexPluginConsoleLogging</key> - <string>1</string> - <key>PlexPluginDevMode</key> <string>0</string> + <key>PlexPluginDevMode</key> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> From 7dacd806603ac36586995bf7baf29ee7eddec8e2 Mon Sep 17 00:00:00 2001 From: PlexIL <plexisrael@gmail.com> Date: Sat, 5 Dec 2020 19:59:54 +0200 Subject: [PATCH 681/710] Hebrew subtitle support for Ktuvit & WizdomSubs --- Contents/Code/support/config.py | 12 +- Contents/DefaultPrefs.json | 26 +- Contents/Libraries/Shared/pbkdf2.py | 297 +++++++++ Contents/Libraries/Shared/pyaes/__init__.py | 53 ++ Contents/Libraries/Shared/pyaes/aes.py | 589 ++++++++++++++++++ .../Libraries/Shared/pyaes/blockfeeder.py | 227 +++++++ Contents/Libraries/Shared/pyaes/util.py | 60 ++ .../Libraries/Shared/subliminal/extensions.py | 3 +- .../providers/{screwzira.py => ktuvit.py} | 212 ++++++- .../subliminal_patch/providers/wizdom.py | 235 +++++++ 10 files changed, 1689 insertions(+), 25 deletions(-) create mode 100644 Contents/Libraries/Shared/pbkdf2.py create mode 100644 Contents/Libraries/Shared/pyaes/__init__.py create mode 100644 Contents/Libraries/Shared/pyaes/aes.py create mode 100644 Contents/Libraries/Shared/pyaes/blockfeeder.py create mode 100644 Contents/Libraries/Shared/pyaes/util.py rename Contents/Libraries/Shared/subliminal_patch/providers/{screwzira.py => ktuvit.py} (55%) create mode 100644 Contents/Libraries/Shared/subliminal_patch/providers/wizdom.py diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index fd282f88e..2d8a09cce 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -805,7 +805,8 @@ def providers_by_prefs(self): 'subscenter': False, 'assrt': cast_bool(Prefs['provider.assrt.enabled']), 'bsplayer': cast_bool(Prefs['provider.bsplayer.enabled']), - 'screwzira': cast_bool(Prefs['provider.screwzira.enabled']), + 'ktuvit': cast_bool(Prefs['provider.ktuvit.enabled']), + 'wizdom': cast_bool(Prefs['provider.wizdom.enabled']), } @property @@ -836,7 +837,8 @@ def get_providers(self, media_type="series"): providers["subscene"] = False providers["napisy24"] = False providers["bsplayer"] = False - providers["screwzira"] = False + providers["ktuvit"] = False + providers["wizdom"] = False providers_forced_off = dict(providers) if not self.unrar and providers["legendastv"]: @@ -914,7 +916,11 @@ def get_provider_settings(self): 'legendastv': {'username': Prefs['provider.legendastv.username'], 'password': Prefs['provider.legendastv.password'], }, - 'assrt': {'token': Prefs['provider.assrt.token'], } + 'assrt': {'token': Prefs['provider.assrt.token'], }, + 'ktuvit': { + 'username': Prefs['provider.ktuvit.username'], + 'password': Prefs['provider.ktuvit.password'], + }, } return provider_settings diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 2954a1f00..e64a82236 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -522,10 +522,30 @@ "default": "true" }, { - "id": "provider.screwzira.enabled", - "label": "Provider: Enable ScrewZira (Hebrew)", + "id": "provider.wizdom.enabled", + "label": "Provider: Enable WizdomSubs (Hebrew)", "type": "bool", - "default": "false" + "default": "true" + }, + { + "id": "provider.ktuvit.enabled", + "label": "Provider: Enable Ktuvit (Hebrew)", + "type": "bool", + "default": "true" + }, + { + "id": "provider.ktuvit.username", + "label": "Ktuvit Username", + "type": "text", + "default": "" + }, + { + "id": "provider.ktuvit.password", + "label": "Ktuvit Password", + "type": "text", + "option": "hidden", + "secure": "true", + "default": "" }, { "id": "providers.multithreading", diff --git a/Contents/Libraries/Shared/pbkdf2.py b/Contents/Libraries/Shared/pbkdf2.py new file mode 100644 index 000000000..937a99a5c --- /dev/null +++ b/Contents/Libraries/Shared/pbkdf2.py @@ -0,0 +1,297 @@ +#!/usr/bin/python +# -*- coding: ascii -*- +########################################################################### +# pbkdf2 - PKCS#5 v2.0 Password-Based Key Derivation +# +# Copyright (C) 2007-2011 Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Country of origin: Canada +# +########################################################################### +# Sample PBKDF2 usage: +# from Crypto.Cipher import AES +# from pbkdf2 import PBKDF2 +# import os +# +# salt = os.urandom(8) # 64-bit salt +# key = PBKDF2("This passphrase is a secret.", salt).read(32) # 256-bit key +# iv = os.urandom(16) # 128-bit IV +# cipher = AES.new(key, AES.MODE_CBC, iv) +# ... +# +# Sample crypt() usage: +# from pbkdf2 import crypt +# pwhash = crypt("secret") +# alleged_pw = raw_input("Enter password: ") +# if pwhash == crypt(alleged_pw, pwhash): +# print "Password good" +# else: +# print "Invalid password" +# +########################################################################### + +__version__ = "1.3" +__all__ = ['PBKDF2', 'crypt'] + +from struct import pack +from random import randint +import string +import sys + +try: + # Use PyCrypto (if available). + from Crypto.Hash import HMAC, SHA as SHA1 +except ImportError: + # PyCrypto not available. Use the Python standard library. + import hmac as HMAC + try: + from hashlib import sha1 as SHA1 + except ImportError: + # hashlib not available. Use the old sha module. + import sha as SHA1 + +# +# Python 2.1 thru 3.2 compatibility +# + +if sys.version_info[0] == 2: + _0xffffffffL = long(1) << 32 + def isunicode(s): + return isinstance(s, unicode) + def isbytes(s): + return isinstance(s, str) + def isinteger(n): + return isinstance(n, (int, long)) + def b(s): + return s + def binxor(a, b): + return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a, b)]) + def b64encode(data, chars="+/"): + tt = string.maketrans("+/", chars) + return data.encode('base64').replace("\n", "").translate(tt) + from binascii import b2a_hex +else: + _0xffffffffL = 0xffffffff + def isunicode(s): + return isinstance(s, str) + def isbytes(s): + return isinstance(s, bytes) + def isinteger(n): + return isinstance(n, int) + def callable(obj): + return hasattr(obj, '__call__') + def b(s): + return s.encode("latin-1") + def binxor(a, b): + return bytes([x ^ y for (x, y) in zip(a, b)]) + from base64 import b64encode as _b64encode + def b64encode(data, chars="+/"): + if isunicode(chars): + return _b64encode(data, chars.encode('utf-8')).decode('utf-8') + else: + return _b64encode(data, chars) + from binascii import b2a_hex as _b2a_hex + def b2a_hex(s): + return _b2a_hex(s).decode('us-ascii') + xrange = range + +class PBKDF2(object): + """PBKDF2.py : PKCS#5 v2.0 Password-Based Key Derivation + + This implementation takes a passphrase and a salt (and optionally an + iteration count, a digest module, and a MAC module) and provides a + file-like object from which an arbitrarily-sized key can be read. + + If the passphrase and/or salt are unicode objects, they are encoded as + UTF-8 before they are processed. + + The idea behind PBKDF2 is to derive a cryptographic key from a + passphrase and a salt. + + PBKDF2 may also be used as a strong salted password hash. The + 'crypt' function is provided for that purpose. + + Remember: Keys generated using PBKDF2 are only as strong as the + passphrases they are derived from. + """ + + def __init__(self, passphrase, salt, iterations=1000, + digestmodule=SHA1, macmodule=HMAC): + self.__macmodule = macmodule + self.__digestmodule = digestmodule + self._setup(passphrase, salt, iterations, self._pseudorandom) + + def _pseudorandom(self, key, msg): + """Pseudorandom function. e.g. HMAC-SHA1""" + return self.__macmodule.new(key=key, msg=msg, + digestmod=self.__digestmodule).digest() + + def read(self, bytes): + """Read the specified number of key bytes.""" + if self.closed: + raise ValueError("file-like object is closed") + + size = len(self.__buf) + blocks = [self.__buf] + i = self.__blockNum + while size < bytes: + i += 1 + if i > _0xffffffffL or i < 1: + # We could return "" here, but + raise OverflowError("derived key too long") + block = self.__f(i) + blocks.append(block) + size += len(block) + buf = b("").join(blocks) + retval = buf[:bytes] + self.__buf = buf[bytes:] + self.__blockNum = i + return retval + + def __f(self, i): + # i must fit within 32 bits + assert 1 <= i <= _0xffffffffL + U = self.__prf(self.__passphrase, self.__salt + pack("!L", i)) + result = U + for j in xrange(2, 1+self.__iterations): + U = self.__prf(self.__passphrase, U) + result = binxor(result, U) + return result + + def hexread(self, octets): + """Read the specified number of octets. Return them as hexadecimal. + + Note that len(obj.hexread(n)) == 2*n. + """ + return b2a_hex(self.read(octets)) + + def _setup(self, passphrase, salt, iterations, prf): + # Sanity checks: + + # passphrase and salt must be str or unicode (in the latter + # case, we convert to UTF-8) + if isunicode(passphrase): + passphrase = passphrase.encode("UTF-8") + elif not isbytes(passphrase): + raise TypeError("passphrase must be str or unicode") + if isunicode(salt): + salt = salt.encode("UTF-8") + elif not isbytes(salt): + raise TypeError("salt must be str or unicode") + + # iterations must be an integer >= 1 + if not isinteger(iterations): + raise TypeError("iterations must be an integer") + if iterations < 1: + raise ValueError("iterations must be at least 1") + + # prf must be callable + if not callable(prf): + raise TypeError("prf must be callable") + + self.__passphrase = passphrase + self.__salt = salt + self.__iterations = iterations + self.__prf = prf + self.__blockNum = 0 + self.__buf = b("") + self.closed = False + + def close(self): + """Close the stream.""" + if not self.closed: + del self.__passphrase + del self.__salt + del self.__iterations + del self.__prf + del self.__blockNum + del self.__buf + self.closed = True + +def crypt(word, salt=None, iterations=None): + """PBKDF2-based unix crypt(3) replacement. + + The number of iterations specified in the salt overrides the 'iterations' + parameter. + + The effective hash length is 192 bits. + """ + + # Generate a (pseudo-)random salt if the user hasn't provided one. + if salt is None: + salt = _makesalt() + + # salt must be a string or the us-ascii subset of unicode + if isunicode(salt): + salt = salt.encode('us-ascii').decode('us-ascii') + elif isbytes(salt): + salt = salt.decode('us-ascii') + else: + raise TypeError("salt must be a string") + + # word must be a string or unicode (in the latter case, we convert to UTF-8) + if isunicode(word): + word = word.encode("UTF-8") + elif not isbytes(word): + raise TypeError("word must be a string or unicode") + + # Try to extract the real salt and iteration count from the salt + if salt.startswith("$p5k2$"): + (iterations, salt, dummy) = salt.split("$")[2:5] + if iterations == "": + iterations = 400 + else: + converted = int(iterations, 16) + if iterations != "%x" % converted: # lowercase hex, minimum digits + raise ValueError("Invalid salt") + iterations = converted + if not (iterations >= 1): + raise ValueError("Invalid salt") + + # Make sure the salt matches the allowed character set + allowed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./" + for ch in salt: + if ch not in allowed: + raise ValueError("Illegal character %r in salt" % (ch,)) + + if iterations is None or iterations == 400: + iterations = 400 + salt = "$p5k2$$" + salt + else: + salt = "$p5k2$%x$%s" % (iterations, salt) + rawhash = PBKDF2(word, salt, iterations).read(24) + return salt + "$" + b64encode(rawhash, "./") + +# Add crypt as a static method of the PBKDF2 class +# This makes it easier to do "from PBKDF2 import PBKDF2" and still use +# crypt. +PBKDF2.crypt = staticmethod(crypt) + +def _makesalt(): + """Return a 48-bit pseudorandom salt for crypt(). + + This function is not suitable for generating cryptographic secrets. + """ + binarysalt = b("").join([pack("@H", randint(0, 0xffff)) for i in range(3)]) + return b64encode(binarysalt, "./") + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Contents/Libraries/Shared/pyaes/__init__.py b/Contents/Libraries/Shared/pyaes/__init__.py new file mode 100644 index 000000000..5712f794a --- /dev/null +++ b/Contents/Libraries/Shared/pyaes/__init__.py @@ -0,0 +1,53 @@ +# The MIT License (MIT) +# +# Copyright (c) 2014 Richard Moore +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +# This is a pure-Python implementation of the AES algorithm and AES common +# modes of operation. + +# See: https://en.wikipedia.org/wiki/Advanced_Encryption_Standard +# See: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation + + +# Supported key sizes: +# 128-bit +# 192-bit +# 256-bit + + +# Supported modes of operation: +# ECB - Electronic Codebook +# CBC - Cipher-Block Chaining +# CFB - Cipher Feedback +# OFB - Output Feedback +# CTR - Counter + +# See the README.md for API details and general information. + +# Also useful, PyCrypto, a crypto library implemented in C with Python bindings: +# https://www.dlitz.net/software/pycrypto/ + + +VERSION = [1, 3, 0] + +from .aes import AES, AESModeOfOperationCTR, AESModeOfOperationCBC, AESModeOfOperationCFB, AESModeOfOperationECB, AESModeOfOperationOFB, AESModesOfOperation, Counter +from .blockfeeder import decrypt_stream, Decrypter, encrypt_stream, Encrypter +from .blockfeeder import PADDING_NONE, PADDING_DEFAULT diff --git a/Contents/Libraries/Shared/pyaes/aes.py b/Contents/Libraries/Shared/pyaes/aes.py new file mode 100644 index 000000000..c6e8bc02a --- /dev/null +++ b/Contents/Libraries/Shared/pyaes/aes.py @@ -0,0 +1,589 @@ +# The MIT License (MIT) +# +# Copyright (c) 2014 Richard Moore +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +# This is a pure-Python implementation of the AES algorithm and AES common +# modes of operation. + +# See: https://en.wikipedia.org/wiki/Advanced_Encryption_Standard + +# Honestly, the best description of the modes of operations are the wonderful +# diagrams on Wikipedia. They explain in moments what my words could never +# achieve. Hence the inline documentation here is sparer than I'd prefer. +# See: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation + +# Also useful, PyCrypto, a crypto library implemented in C with Python bindings: +# https://www.dlitz.net/software/pycrypto/ + + +# Supported key sizes: +# 128-bit +# 192-bit +# 256-bit + + +# Supported modes of operation: +# ECB - Electronic Codebook +# CBC - Cipher-Block Chaining +# CFB - Cipher Feedback +# OFB - Output Feedback +# CTR - Counter + + +# See the README.md for API details and general information. + + +import copy +import struct + +__all__ = ["AES", "AESModeOfOperationCTR", "AESModeOfOperationCBC", "AESModeOfOperationCFB", + "AESModeOfOperationECB", "AESModeOfOperationOFB", "AESModesOfOperation", "Counter"] + + +def _compact_word(word): + return (word[0] << 24) | (word[1] << 16) | (word[2] << 8) | word[3] + +def _string_to_bytes(text): + return list(ord(c) for c in text) + +def _bytes_to_string(binary): + return "".join(chr(b) for b in binary) + +def _concat_list(a, b): + return a + b + + +# Python 3 compatibility +try: + xrange +except Exception: + xrange = range + + # Python 3 supports bytes, which is already an array of integers + def _string_to_bytes(text): + if isinstance(text, bytes): + return text + return [ord(c) for c in text] + + # In Python 3, we return bytes + def _bytes_to_string(binary): + return bytes(binary) + + # Python 3 cannot concatenate a list onto a bytes, so we bytes-ify it first + def _concat_list(a, b): + return a + bytes(b) + + +# Based *largely* on the Rijndael implementation +# See: http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf +class AES(object): + '''Encapsulates the AES block cipher. + + You generally should not need this. Use the AESModeOfOperation classes + below instead.''' + + # Number of rounds by keysize + number_of_rounds = {16: 10, 24: 12, 32: 14} + + # Round constant words + rcon = [ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 ] + + # S-box and Inverse S-box (S is for Substitution) + S = [ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 ] + Si =[ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d ] + + # Transformations for encryption + T1 = [ 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a ] + T2 = [ 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616 ] + T3 = [ 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16 ] + T4 = [ 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c ] + + # Transformations for decryption + T5 = [ 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742 ] + T6 = [ 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857 ] + T7 = [ 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8 ] + T8 = [ 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0 ] + + # Transformations for decryption key expansion + U1 = [ 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3 ] + U2 = [ 0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697 ] + U3 = [ 0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46 ] + U4 = [ 0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d ] + + def __init__(self, key): + + if len(key) not in (16, 24, 32): + raise ValueError('Invalid key size') + + rounds = self.number_of_rounds[len(key)] + + # Encryption round keys + self._Ke = [[0] * 4 for i in xrange(rounds + 1)] + + # Decryption round keys + self._Kd = [[0] * 4 for i in xrange(rounds + 1)] + + round_key_count = (rounds + 1) * 4 + KC = len(key) // 4 + + # Convert the key into ints + tk = [ struct.unpack('>i', key[i:i + 4])[0] for i in xrange(0, len(key), 4) ] + + # Copy values into round key arrays + for i in xrange(0, KC): + self._Ke[i // 4][i % 4] = tk[i] + self._Kd[rounds - (i // 4)][i % 4] = tk[i] + + # Key expansion (fips-197 section 5.2) + rconpointer = 0 + t = KC + while t < round_key_count: + + tt = tk[KC - 1] + tk[0] ^= ((self.S[(tt >> 16) & 0xFF] << 24) ^ + (self.S[(tt >> 8) & 0xFF] << 16) ^ + (self.S[ tt & 0xFF] << 8) ^ + self.S[(tt >> 24) & 0xFF] ^ + (self.rcon[rconpointer] << 24)) + rconpointer += 1 + + if KC != 8: + for i in xrange(1, KC): + tk[i] ^= tk[i - 1] + + # Key expansion for 256-bit keys is "slightly different" (fips-197) + else: + for i in xrange(1, KC // 2): + tk[i] ^= tk[i - 1] + tt = tk[KC // 2 - 1] + + tk[KC // 2] ^= (self.S[ tt & 0xFF] ^ + (self.S[(tt >> 8) & 0xFF] << 8) ^ + (self.S[(tt >> 16) & 0xFF] << 16) ^ + (self.S[(tt >> 24) & 0xFF] << 24)) + + for i in xrange(KC // 2 + 1, KC): + tk[i] ^= tk[i - 1] + + # Copy values into round key arrays + j = 0 + while j < KC and t < round_key_count: + self._Ke[t // 4][t % 4] = tk[j] + self._Kd[rounds - (t // 4)][t % 4] = tk[j] + j += 1 + t += 1 + + # Inverse-Cipher-ify the decryption round key (fips-197 section 5.3) + for r in xrange(1, rounds): + for j in xrange(0, 4): + tt = self._Kd[r][j] + self._Kd[r][j] = (self.U1[(tt >> 24) & 0xFF] ^ + self.U2[(tt >> 16) & 0xFF] ^ + self.U3[(tt >> 8) & 0xFF] ^ + self.U4[ tt & 0xFF]) + + def encrypt(self, plaintext): + 'Encrypt a block of plain text using the AES block cipher.' + + if len(plaintext) != 16: + raise ValueError('wrong block length') + + rounds = len(self._Ke) - 1 + (s1, s2, s3) = [1, 2, 3] + a = [0, 0, 0, 0] + + # Convert plaintext to (ints ^ key) + t = [(_compact_word(plaintext[4 * i:4 * i + 4]) ^ self._Ke[0][i]) for i in xrange(0, 4)] + + # Apply round transforms + for r in xrange(1, rounds): + for i in xrange(0, 4): + a[i] = (self.T1[(t[ i ] >> 24) & 0xFF] ^ + self.T2[(t[(i + s1) % 4] >> 16) & 0xFF] ^ + self.T3[(t[(i + s2) % 4] >> 8) & 0xFF] ^ + self.T4[ t[(i + s3) % 4] & 0xFF] ^ + self._Ke[r][i]) + t = copy.copy(a) + + # The last round is special + result = [ ] + for i in xrange(0, 4): + tt = self._Ke[rounds][i] + result.append((self.S[(t[ i ] >> 24) & 0xFF] ^ (tt >> 24)) & 0xFF) + result.append((self.S[(t[(i + s1) % 4] >> 16) & 0xFF] ^ (tt >> 16)) & 0xFF) + result.append((self.S[(t[(i + s2) % 4] >> 8) & 0xFF] ^ (tt >> 8)) & 0xFF) + result.append((self.S[ t[(i + s3) % 4] & 0xFF] ^ tt ) & 0xFF) + + return result + + def decrypt(self, ciphertext): + 'Decrypt a block of cipher text using the AES block cipher.' + + if len(ciphertext) != 16: + raise ValueError('wrong block length') + + rounds = len(self._Kd) - 1 + (s1, s2, s3) = [3, 2, 1] + a = [0, 0, 0, 0] + + # Convert ciphertext to (ints ^ key) + t = [(_compact_word(ciphertext[4 * i:4 * i + 4]) ^ self._Kd[0][i]) for i in xrange(0, 4)] + + # Apply round transforms + for r in xrange(1, rounds): + for i in xrange(0, 4): + a[i] = (self.T5[(t[ i ] >> 24) & 0xFF] ^ + self.T6[(t[(i + s1) % 4] >> 16) & 0xFF] ^ + self.T7[(t[(i + s2) % 4] >> 8) & 0xFF] ^ + self.T8[ t[(i + s3) % 4] & 0xFF] ^ + self._Kd[r][i]) + t = copy.copy(a) + + # The last round is special + result = [ ] + for i in xrange(0, 4): + tt = self._Kd[rounds][i] + result.append((self.Si[(t[ i ] >> 24) & 0xFF] ^ (tt >> 24)) & 0xFF) + result.append((self.Si[(t[(i + s1) % 4] >> 16) & 0xFF] ^ (tt >> 16)) & 0xFF) + result.append((self.Si[(t[(i + s2) % 4] >> 8) & 0xFF] ^ (tt >> 8)) & 0xFF) + result.append((self.Si[ t[(i + s3) % 4] & 0xFF] ^ tt ) & 0xFF) + + return result + + +class Counter(object): + '''A counter object for the Counter (CTR) mode of operation. + + To create a custom counter, you can usually just override the + increment method.''' + + def __init__(self, initial_value = 1): + + # Convert the value into an array of bytes long + self._counter = [ ((initial_value >> i) % 256) for i in xrange(128 - 8, -1, -8) ] + + value = property(lambda s: s._counter) + + def increment(self): + '''Increment the counter (overflow rolls back to 0).''' + + for i in xrange(len(self._counter) - 1, -1, -1): + self._counter[i] += 1 + + if self._counter[i] < 256: break + + # Carry the one + self._counter[i] = 0 + + # Overflow + else: + self._counter = [ 0 ] * len(self._counter) + + +class AESBlockModeOfOperation(object): + '''Super-class for AES modes of operation that require blocks.''' + def __init__(self, key): + self._aes = AES(key) + + def decrypt(self, ciphertext): + raise Exception('not implemented') + + def encrypt(self, plaintext): + raise Exception('not implemented') + + +class AESStreamModeOfOperation(AESBlockModeOfOperation): + '''Super-class for AES modes of operation that are stream-ciphers.''' + +class AESSegmentModeOfOperation(AESStreamModeOfOperation): + '''Super-class for AES modes of operation that segment data.''' + + segment_bytes = 16 + + + +class AESModeOfOperationECB(AESBlockModeOfOperation): + '''AES Electronic Codebook Mode of Operation. + + o Block-cipher, so data must be padded to 16 byte boundaries + + Security Notes: + o This mode is not recommended + o Any two identical blocks produce identical encrypted values, + exposing data patterns. (See the image of Tux on wikipedia) + + Also see: + o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_codebook_.28ECB.29 + o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.1''' + + + name = "Electronic Codebook (ECB)" + + def encrypt(self, plaintext): + if len(plaintext) != 16: + raise ValueError('plaintext block must be 16 bytes') + + plaintext = _string_to_bytes(plaintext) + return _bytes_to_string(self._aes.encrypt(plaintext)) + + def decrypt(self, ciphertext): + if len(ciphertext) != 16: + raise ValueError('ciphertext block must be 16 bytes') + + ciphertext = _string_to_bytes(ciphertext) + return _bytes_to_string(self._aes.decrypt(ciphertext)) + + + +class AESModeOfOperationCBC(AESBlockModeOfOperation): + '''AES Cipher-Block Chaining Mode of Operation. + + o The Initialization Vector (IV) + o Block-cipher, so data must be padded to 16 byte boundaries + o An incorrect initialization vector will only cause the first + block to be corrupt; all other blocks will be intact + o A corrupt bit in the cipher text will cause a block to be + corrupted, and the next block to be inverted, but all other + blocks will be intact. + + Security Notes: + o This method (and CTR) ARE recommended. + + Also see: + o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher-block_chaining_.28CBC.29 + o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.2''' + + + name = "Cipher-Block Chaining (CBC)" + + def __init__(self, key, iv = None): + if iv is None: + self._last_cipherblock = [ 0 ] * 16 + elif len(iv) != 16: + raise ValueError('initialization vector must be 16 bytes') + else: + self._last_cipherblock = _string_to_bytes(iv) + + AESBlockModeOfOperation.__init__(self, key) + + def encrypt(self, plaintext): + if len(plaintext) != 16: + raise ValueError('plaintext block must be 16 bytes') + + plaintext = _string_to_bytes(plaintext) + precipherblock = [ (p ^ l) for (p, l) in zip(plaintext, self._last_cipherblock) ] + self._last_cipherblock = self._aes.encrypt(precipherblock) + + return _bytes_to_string(self._last_cipherblock) + + def decrypt(self, ciphertext): + if len(ciphertext) != 16: + raise ValueError('ciphertext block must be 16 bytes') + + cipherblock = _string_to_bytes(ciphertext) + plaintext = [ (p ^ l) for (p, l) in zip(self._aes.decrypt(cipherblock), self._last_cipherblock) ] + self._last_cipherblock = cipherblock + + return _bytes_to_string(plaintext) + + + +class AESModeOfOperationCFB(AESSegmentModeOfOperation): + '''AES Cipher Feedback Mode of Operation. + + o A stream-cipher, so input does not need to be padded to blocks, + but does need to be padded to segment_size + + Also see: + o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_feedback_.28CFB.29 + o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.3''' + + + name = "Cipher Feedback (CFB)" + + def __init__(self, key, iv, segment_size = 1): + if segment_size == 0: segment_size = 1 + + if iv is None: + self._shift_register = [ 0 ] * 16 + elif len(iv) != 16: + raise ValueError('initialization vector must be 16 bytes') + else: + self._shift_register = _string_to_bytes(iv) + + self._segment_bytes = segment_size + + AESBlockModeOfOperation.__init__(self, key) + + segment_bytes = property(lambda s: s._segment_bytes) + + def encrypt(self, plaintext): + if len(plaintext) % self._segment_bytes != 0: + raise ValueError('plaintext block must be a multiple of segment_size') + + plaintext = _string_to_bytes(plaintext) + + # Break block into segments + encrypted = [ ] + for i in xrange(0, len(plaintext), self._segment_bytes): + plaintext_segment = plaintext[i: i + self._segment_bytes] + xor_segment = self._aes.encrypt(self._shift_register)[:len(plaintext_segment)] + cipher_segment = [ (p ^ x) for (p, x) in zip(plaintext_segment, xor_segment) ] + + # Shift the top bits out and the ciphertext in + self._shift_register = _concat_list(self._shift_register[len(cipher_segment):], cipher_segment) + + encrypted.extend(cipher_segment) + + return _bytes_to_string(encrypted) + + def decrypt(self, ciphertext): + if len(ciphertext) % self._segment_bytes != 0: + raise ValueError('ciphertext block must be a multiple of segment_size') + + ciphertext = _string_to_bytes(ciphertext) + + # Break block into segments + decrypted = [ ] + for i in xrange(0, len(ciphertext), self._segment_bytes): + cipher_segment = ciphertext[i: i + self._segment_bytes] + xor_segment = self._aes.encrypt(self._shift_register)[:len(cipher_segment)] + plaintext_segment = [ (p ^ x) for (p, x) in zip(cipher_segment, xor_segment) ] + + # Shift the top bits out and the ciphertext in + self._shift_register = _concat_list(self._shift_register[len(cipher_segment):], cipher_segment) + + decrypted.extend(plaintext_segment) + + return _bytes_to_string(decrypted) + + + +class AESModeOfOperationOFB(AESStreamModeOfOperation): + '''AES Output Feedback Mode of Operation. + + o A stream-cipher, so input does not need to be padded to blocks, + allowing arbitrary length data. + o A bit twiddled in the cipher text, twiddles the same bit in the + same bit in the plain text, which can be useful for error + correction techniques. + + Also see: + o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Output_feedback_.28OFB.29 + o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.4''' + + + name = "Output Feedback (OFB)" + + def __init__(self, key, iv = None): + if iv is None: + self._last_precipherblock = [ 0 ] * 16 + elif len(iv) != 16: + raise ValueError('initialization vector must be 16 bytes') + else: + self._last_precipherblock = _string_to_bytes(iv) + + self._remaining_block = [ ] + + AESBlockModeOfOperation.__init__(self, key) + + def encrypt(self, plaintext): + encrypted = [ ] + for p in _string_to_bytes(plaintext): + if len(self._remaining_block) == 0: + self._remaining_block = self._aes.encrypt(self._last_precipherblock) + self._last_precipherblock = [ ] + precipherbyte = self._remaining_block.pop(0) + self._last_precipherblock.append(precipherbyte) + cipherbyte = p ^ precipherbyte + encrypted.append(cipherbyte) + + return _bytes_to_string(encrypted) + + def decrypt(self, ciphertext): + # AES-OFB is symetric + return self.encrypt(ciphertext) + + + +class AESModeOfOperationCTR(AESStreamModeOfOperation): + '''AES Counter Mode of Operation. + + o A stream-cipher, so input does not need to be padded to blocks, + allowing arbitrary length data. + o The counter must be the same size as the key size (ie. len(key)) + o Each block independant of the other, so a corrupt byte will not + damage future blocks. + o Each block has a uniue counter value associated with it, which + contributes to the encrypted value, so no data patterns are + leaked. + o Also known as: Counter Mode (CM), Integer Counter Mode (ICM) and + Segmented Integer Counter (SIC + + Security Notes: + o This method (and CBC) ARE recommended. + o Each message block is associated with a counter value which must be + unique for ALL messages with the same key. Otherwise security may be + compromised. + + Also see: + + o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_.28CTR.29 + o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.5 + and Appendix B for managing the initial counter''' + + + name = "Counter (CTR)" + + def __init__(self, key, counter = None): + AESBlockModeOfOperation.__init__(self, key) + + if counter is None: + counter = Counter() + + self._counter = counter + self._remaining_counter = [ ] + + def encrypt(self, plaintext): + while len(self._remaining_counter) < len(plaintext): + self._remaining_counter += self._aes.encrypt(self._counter.value) + self._counter.increment() + + plaintext = _string_to_bytes(plaintext) + + encrypted = [ (p ^ c) for (p, c) in zip(plaintext, self._remaining_counter) ] + self._remaining_counter = self._remaining_counter[len(encrypted):] + + return _bytes_to_string(encrypted) + + def decrypt(self, crypttext): + # AES-CTR is symetric + return self.encrypt(crypttext) + + +# Simple lookup table for each mode +AESModesOfOperation = dict( + ctr = AESModeOfOperationCTR, + cbc = AESModeOfOperationCBC, + cfb = AESModeOfOperationCFB, + ecb = AESModeOfOperationECB, + ofb = AESModeOfOperationOFB, +) diff --git a/Contents/Libraries/Shared/pyaes/blockfeeder.py b/Contents/Libraries/Shared/pyaes/blockfeeder.py new file mode 100644 index 000000000..b9a904d22 --- /dev/null +++ b/Contents/Libraries/Shared/pyaes/blockfeeder.py @@ -0,0 +1,227 @@ +# The MIT License (MIT) +# +# Copyright (c) 2014 Richard Moore +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +from .aes import AESBlockModeOfOperation, AESSegmentModeOfOperation, AESStreamModeOfOperation +from .util import append_PKCS7_padding, strip_PKCS7_padding, to_bufferable + + +# First we inject three functions to each of the modes of operations +# +# _can_consume(size) +# - Given a size, determine how many bytes could be consumed in +# a single call to either the decrypt or encrypt method +# +# _final_encrypt(data, padding = PADDING_DEFAULT) +# - call and return encrypt on this (last) chunk of data, +# padding as necessary; this will always be at least 16 +# bytes unless the total incoming input was less than 16 +# bytes +# +# _final_decrypt(data, padding = PADDING_DEFAULT) +# - same as _final_encrypt except for decrypt, for +# stripping off padding +# + +PADDING_NONE = 'none' +PADDING_DEFAULT = 'default' + +# @TODO: Ciphertext stealing and explicit PKCS#7 +# PADDING_CIPHERTEXT_STEALING +# PADDING_PKCS7 + +# ECB and CBC are block-only ciphers + +def _block_can_consume(self, size): + if size >= 16: return 16 + return 0 + +# After padding, we may have more than one block +def _block_final_encrypt(self, data, padding = PADDING_DEFAULT): + if padding == PADDING_DEFAULT: + data = append_PKCS7_padding(data) + + elif padding == PADDING_NONE: + if len(data) != 16: + raise Exception('invalid data length for final block') + else: + raise Exception('invalid padding option') + + if len(data) == 32: + return self.encrypt(data[:16]) + self.encrypt(data[16:]) + + return self.encrypt(data) + + +def _block_final_decrypt(self, data, padding = PADDING_DEFAULT): + if padding == PADDING_DEFAULT: + return strip_PKCS7_padding(self.decrypt(data)) + + if padding == PADDING_NONE: + if len(data) != 16: + raise Exception('invalid data length for final block') + return self.decrypt(data) + + raise Exception('invalid padding option') + +AESBlockModeOfOperation._can_consume = _block_can_consume +AESBlockModeOfOperation._final_encrypt = _block_final_encrypt +AESBlockModeOfOperation._final_decrypt = _block_final_decrypt + + + +# CFB is a segment cipher + +def _segment_can_consume(self, size): + return self.segment_bytes * int(size // self.segment_bytes) + +# CFB can handle a non-segment-sized block at the end using the remaining cipherblock +def _segment_final_encrypt(self, data, padding = PADDING_DEFAULT): + if padding != PADDING_DEFAULT: + raise Exception('invalid padding option') + + faux_padding = (chr(0) * (self.segment_bytes - (len(data) % self.segment_bytes))) + padded = data + to_bufferable(faux_padding) + return self.encrypt(padded)[:len(data)] + +# CFB can handle a non-segment-sized block at the end using the remaining cipherblock +def _segment_final_decrypt(self, data, padding = PADDING_DEFAULT): + if padding != PADDING_DEFAULT: + raise Exception('invalid padding option') + + faux_padding = (chr(0) * (self.segment_bytes - (len(data) % self.segment_bytes))) + padded = data + to_bufferable(faux_padding) + return self.decrypt(padded)[:len(data)] + +AESSegmentModeOfOperation._can_consume = _segment_can_consume +AESSegmentModeOfOperation._final_encrypt = _segment_final_encrypt +AESSegmentModeOfOperation._final_decrypt = _segment_final_decrypt + + + +# OFB and CTR are stream ciphers + +def _stream_can_consume(self, size): + return size + +def _stream_final_encrypt(self, data, padding = PADDING_DEFAULT): + if padding not in [PADDING_NONE, PADDING_DEFAULT]: + raise Exception('invalid padding option') + + return self.encrypt(data) + +def _stream_final_decrypt(self, data, padding = PADDING_DEFAULT): + if padding not in [PADDING_NONE, PADDING_DEFAULT]: + raise Exception('invalid padding option') + + return self.decrypt(data) + +AESStreamModeOfOperation._can_consume = _stream_can_consume +AESStreamModeOfOperation._final_encrypt = _stream_final_encrypt +AESStreamModeOfOperation._final_decrypt = _stream_final_decrypt + + + +class BlockFeeder(object): + '''The super-class for objects to handle chunking a stream of bytes + into the appropriate block size for the underlying mode of operation + and applying (or stripping) padding, as necessary.''' + + def __init__(self, mode, feed, final, padding = PADDING_DEFAULT): + self._mode = mode + self._feed = feed + self._final = final + self._buffer = to_bufferable("") + self._padding = padding + + def feed(self, data = None): + '''Provide bytes to encrypt (or decrypt), returning any bytes + possible from this or any previous calls to feed. + + Call with None or an empty string to flush the mode of + operation and return any final bytes; no further calls to + feed may be made.''' + + if self._buffer is None: + raise ValueError('already finished feeder') + + # Finalize; process the spare bytes we were keeping + if data is None: + result = self._final(self._buffer, self._padding) + self._buffer = None + return result + + self._buffer += to_bufferable(data) + + # We keep 16 bytes around so we can determine padding + result = to_bufferable('') + while len(self._buffer) > 16: + can_consume = self._mode._can_consume(len(self._buffer) - 16) + if can_consume == 0: break + result += self._feed(self._buffer[:can_consume]) + self._buffer = self._buffer[can_consume:] + + return result + + +class Encrypter(BlockFeeder): + 'Accepts bytes of plaintext and returns encrypted ciphertext.' + + def __init__(self, mode, padding = PADDING_DEFAULT): + BlockFeeder.__init__(self, mode, mode.encrypt, mode._final_encrypt, padding) + + +class Decrypter(BlockFeeder): + 'Accepts bytes of ciphertext and returns decrypted plaintext.' + + def __init__(self, mode, padding = PADDING_DEFAULT): + BlockFeeder.__init__(self, mode, mode.decrypt, mode._final_decrypt, padding) + + +# 8kb blocks +BLOCK_SIZE = (1 << 13) + +def _feed_stream(feeder, in_stream, out_stream, block_size = BLOCK_SIZE): + 'Uses feeder to read and convert from in_stream and write to out_stream.' + + while True: + chunk = in_stream.read(block_size) + if not chunk: + break + converted = feeder.feed(chunk) + out_stream.write(converted) + converted = feeder.feed() + out_stream.write(converted) + + +def encrypt_stream(mode, in_stream, out_stream, block_size = BLOCK_SIZE, padding = PADDING_DEFAULT): + 'Encrypts a stream of bytes from in_stream to out_stream using mode.' + + encrypter = Encrypter(mode, padding = padding) + _feed_stream(encrypter, in_stream, out_stream, block_size) + + +def decrypt_stream(mode, in_stream, out_stream, block_size = BLOCK_SIZE, padding = PADDING_DEFAULT): + 'Decrypts a stream of bytes from in_stream to out_stream using mode.' + + decrypter = Decrypter(mode, padding = padding) + _feed_stream(decrypter, in_stream, out_stream, block_size) diff --git a/Contents/Libraries/Shared/pyaes/util.py b/Contents/Libraries/Shared/pyaes/util.py new file mode 100644 index 000000000..081a37594 --- /dev/null +++ b/Contents/Libraries/Shared/pyaes/util.py @@ -0,0 +1,60 @@ +# The MIT License (MIT) +# +# Copyright (c) 2014 Richard Moore +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +# Why to_bufferable? +# Python 3 is very different from Python 2.x when it comes to strings of text +# and strings of bytes; in Python 3, strings of bytes do not exist, instead to +# represent arbitrary binary data, we must use the "bytes" object. This method +# ensures the object behaves as we need it to. + +def to_bufferable(binary): + return binary + +def _get_byte(c): + return ord(c) + +try: + xrange +except: + + def to_bufferable(binary): + if isinstance(binary, bytes): + return binary + return bytes(ord(b) for b in binary) + + def _get_byte(c): + return c + +def append_PKCS7_padding(data): + pad = 16 - (len(data) % 16) + return data + to_bufferable(chr(pad) * pad) + +def strip_PKCS7_padding(data): + if len(data) % 16 != 0: + raise ValueError("invalid length") + + pad = _get_byte(data[-1]) + + if pad > 16: + raise ValueError("invalid padding byte") + + return data[:-pad] diff --git a/Contents/Libraries/Shared/subliminal/extensions.py b/Contents/Libraries/Shared/subliminal/extensions.py index 1bef0d1a6..17a559a41 100644 --- a/Contents/Libraries/Shared/subliminal/extensions.py +++ b/Contents/Libraries/Shared/subliminal/extensions.py @@ -95,7 +95,8 @@ def unregister(self, entry_point): 'shooter = subliminal.providers.shooter:ShooterProvider', 'thesubdb = subliminal.providers.thesubdb:TheSubDBProvider', 'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider', - 'screwzira = subliminal.providers.screwzira:ScrewZiraProvider' + 'ktuvit = subliminal.providers.ktuvit:KtuvitProvider' + 'wizdom = subliminal.providers.wizdom:WizdomProvider' ]) #: Refiner manager diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/screwzira.py b/Contents/Libraries/Shared/subliminal_patch/providers/ktuvit.py similarity index 55% rename from Contents/Libraries/Shared/subliminal_patch/providers/screwzira.py rename to Contents/Libraries/Shared/subliminal_patch/providers/ktuvit.py index ec5c39e32..622cd942e 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/screwzira.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/ktuvit.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- +import re from requests import Session +from requests.cookies import RequestsCookieJar import json import logging from subzero.language import Language @@ -11,17 +13,25 @@ from subliminal_patch.utils import sanitize from subliminal_patch.subtitle import Subtitle, guess_matches from subliminal.subtitle import fix_line_ending +from subliminal.exceptions import ConfigurationError, AuthenticationError + +from string import hexdigits +from collections import defaultdict +import pbkdf2 +from base64 import b64decode, b64encode +from hashlib import sha256 +import pyaes __author__ = "Dor Nizar" logger = logging.getLogger(__name__) -class ScrewZiraSubtitle(Subtitle): - provider_name = 'screwzira' +class KtuvitSubtitle(Subtitle): + provider_name = 'ktuvit' def __init__(self, language, title_id, subtitle_id, series, season, episode, release, year): - super(ScrewZiraSubtitle, self).__init__(language, subtitle_id) + super(KtuvitSubtitle, self).__init__(language, subtitle_id) self.title_id = title_id self.subtitle_id = subtitle_id self.series = series @@ -32,7 +42,7 @@ def __init__(self, language, title_id, subtitle_id, series, season, episode, rel def get_matches(self, video): matches = set() - logger.debug("--ScrewZiraSubtitle--\n{}".format(self.__dict__)) + logger.debug("[{}]\n{}".format(self.__class__.__name__, self.__dict__)) # episode if isinstance(video, Episode): @@ -59,7 +69,7 @@ def get_matches(self, video): # guess matches |= guess_matches(video, guessit(self.release, {'type': 'movie'})) - logger.debug("ScrewZira subtitle criteria match:\n{}".format(matches)) + logger.debug("Ktuvit subtitle criteria match:\n{}".format(matches)) return matches @property @@ -67,31 +77,109 @@ def id(self): return self.subtitle_id -class ScrewZiraProvider(Provider): - subtitle_class = ScrewZiraSubtitle +class KtuvitProvider(Provider): + subtitle_class = KtuvitSubtitle languages = {Language.fromalpha2(l) for l in ['he']} - URL_SERVER = 'https://www.screwzira.com/' + URL_SERVER = 'https://www.ktuvit.me/' + URI_LOGIN = 'Login.aspx' + URI_LOGIN_POST = 'Services/MembershipService.svc/Login' URI_SEARCH_TITLE = 'Services/ContentProvider.svc/GetSearchForecast' URI_SEARCH_SERIES_SUBTITLE = 'Services/GetModuleAjax.ashx' URI_SEARCH_MOVIE_SUBTITLE = "MovieInfo.aspx" URI_REQ_SUBTITLE_ID = "Services/ContentProvider.svc/RequestSubtitleDownload" URI_DOWNLOAD_SUBTITLE = "Services/DownloadFile.ashx" + def __init__(self, username=None, password=None): + if not all((username, password)): + raise ConfigurationError('Username and password must be specified') + + self.session = None + self.username = username + self.password = password + self.encrypted_password = None + self.salt = None + + def encrypt_password(self): + logger.debug("password: {}".format(self.password)) + encrypted_password = KtuvitEncryptor(self.username, self.password, self.salt).encrypt() + if not encrypted_password: + logger.error("Could not encrypt password") + return False + self.encrypted_password = encrypted_password + return True + + def get_encryption_salt(self): + p = re.compile(r"var encryptionSalt = '(.*)';") + r = self.session.get(self.URL_SERVER + self.URI_LOGIN) + r.raise_for_status() + + logger.debug("Searching for encryptionSalt...") + script_list = [i for i in BeautifulSoup(r.content, 'html.parser').select('div#navbar script') if i.contents] + for item in script_list: + search_salt = p.search(item.contents[0]) + if search_salt: + self.salt = search_salt.group(1) + return True + logger.error("Could not get encryptionSalt") + return False + + def login(self): + if not self.get_encryption_salt(): + return False + if not self.encrypt_password(): + return False + data = { + "request": { + "Email": self.username, + "Password": self.encrypted_password + } + } + logger.debug("Trying to log in using: {}".format(json.dumps(data))) + r = self.session.post(self.URL_SERVER + self.URI_LOGIN_POST, json=data) + r_result = r.json() + login_results = "" + if 'd' in r_result: + try: + login_results = json.loads(r_result['d']) + except ValueError: + logger.error("Could not process JSON from login response") + return False + + if 'IsSuccess' not in login_results: + logger.error("Login response is different than expected") + return False + + if not login_results['IsSuccess']: + logger.error("Wrong username or password!") + raise AuthenticationError('Wrong username or password!') + return False + + if not r.cookies or type(r.cookies) is not RequestsCookieJar: + logger.error("Could not get the cookie response of the login") + return False + + if 'Login' not in r.cookies.keys(): + logger.error("Could not found login cookie!") + return False + + logger.info("Connected successfully to Ktuvit!") + return True + def initialize(self): - logger.debug("ScrewZira initialize") + logger.debug("Ktuvit initialize") self.session = Session() self.session.headers[ 'User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; ' \ 'Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36' + if not self.login(): + return False + def terminate(self): - logger.debug("ScrewZira terminate") + logger.debug("Ktuvit terminate") self.session.close() - def __init__(self): - self.session = None - def _search_series(self, title): logger.debug("Searching '{}'".format(title)) title_request = { @@ -225,17 +313,105 @@ def list_subtitles(self, video, languages): return [s for s in self.query(title, season, episode, year) if s.language in languages] def download_subtitle(self, subtitle): - # type: (ScrewZiraSubtitle) -> None + # type: (KtuvitSubtitle) -> None - logger.info('Downloading subtitle from ScrewZira: %r', subtitle) - downloadID = self._req_download_identifier(subtitle.title_id, subtitle.subtitle_id) - if not downloadID: + logger.info('Downloading subtitle from Ktuvit: %r', subtitle) + download_id = self._req_download_identifier(subtitle.title_id, subtitle.subtitle_id) + if not download_id: logger.debug('Unable to retrieve download identifier') return None - content = self._download_subtitles(downloadID) + content = self._download_subtitles(download_id) if not content: logger.debug('Unable to download subtitle') return None subtitle.content = fix_line_ending(content) + + +class KtuvitEncryptor: + def __init__(self, username, password, salt): + if not all((username, password, salt)): + raise Exception("Encryptor did not get all required arguments") + + self.encrypted_password = None + self.username = username + self.password = password + self.salt = salt + + @staticmethod + def rshift(val, n): + return (val % 0x100000000) >> n + + @staticmethod + def js_parseint(s, rad=10): + digits = '' + for c in str(s).strip(): + if c not in hexdigits: + break + digits += c + + return int(digits, rad) if digits else 0 + + @staticmethod + def to_signed32(n): + n = n & 0xffffffff + return n | (-(n & 0x80000000)) + + def stringify(self, words, length): + sigbytes = int(length / 2) + int((length % 2) > 0) + hex_chars = list() + + for i in xrange(0, sigbytes): + bite = self.rshift(words[self.rshift(i, 2)], (24 - (i % 4) * 8)) & 0xff + hex_chars.append(format(self.rshift(bite, 4), 'x')) + hex_chars.append(format(bite & 0x0f, 'x')) + return ''.join(hex_chars) + + def cryptojs_hexparse(self, s): + words = defaultdict(int) + for i in range(0, len(s), 2): + tmp1 = (self.js_parseint(s[i:i + 2], 16)) + tmp2 = (24 - (i % 8) * 4) + tmp3 = self.to_signed32(tmp1 << tmp2) + words[self.rshift(i, 3)] |= tmp3 + return self.stringify(words, len(s)) + + def cryptojs_pad_iv(self, iv): + return str.ljust(self.cryptojs_hexparse(iv), 32, '0').decode('hex') + + @staticmethod + def pbkdf2_encrypt(key, salt): + a = pbkdf2.PBKDF2(salt, key, 3000) + return a.read(16) + + @staticmethod + def pad(m): + return m + chr(16 - len(m) % 16) * (16 - len(m) % 16) + + def aes_encrypt(self, msg, key, iv): + if len(iv) != 16: + logger.error("iv (Len: {}) - {} is not 16 length".format(len(iv), iv)) + return False + msg = self.pad(msg) + + aes = pyaes.AESModeOfOperationCBC(key, iv=iv[:16]) + return b64encode(aes.encrypt(msg)) + + def encrypt(self): + if not self.salt: + logger.error("No salt was instantiated!") + return False + msg = self.password.encode('utf-8') + iv = self.cryptojs_pad_iv(self.username) + key = self.pbkdf2_encrypt(self.username, self.salt.encode('utf-8')) + + cipher = self.aes_encrypt(msg, key, iv) + if not cipher: + return False + + hash_sha256 = sha256(b64decode(cipher)) + self.encrypted_password = b64encode(hash_sha256.digest()) + logger.debug("Encrypted password: {}".format(self.encrypted_password)) + logger.debug("Original password: {}".format(self.password)) + return self.encrypted_password diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/wizdom.py b/Contents/Libraries/Shared/subliminal_patch/providers/wizdom.py new file mode 100644 index 000000000..fd51dd55b --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/providers/wizdom.py @@ -0,0 +1,235 @@ +# -*- coding: utf-8 -*- +from requests import Session +import logging +from subzero.language import Language +from guessit import guessit + +from subliminal_patch.providers import Provider +from subliminal.providers import Episode, Movie +from subliminal_patch.utils import sanitize +from subliminal_patch.subtitle import Subtitle, guess_matches +from subliminal.subtitle import fix_line_ending + +from io import BytesIO +from zipfile import ZipFile + +__author__ = "Dor Nizar" + +logger = logging.getLogger(__name__) + + +class WizdomSubtitle(Subtitle): + provider_name = 'wizdom' + + def __init__(self, language, title_id, subtitle_id, series, season, episode, release, year, page_link): + super(WizdomSubtitle, self).__init__(language, subtitle_id) + self.title_id = title_id + self.subtitle_id = subtitle_id + self.series = series + self.season = season + self.episode = episode + self.release = release + self.year = year + self.page_link = page_link + + def get_matches(self, video): + matches = set() + logger.debug("[{}]\n{}".format(self.__class__.__name__, self.__dict__)) + + # episode + if isinstance(video, Episode): + # series + if video.series and sanitize(self.series) == sanitize(video.series): + matches.add('series') + # season + if video.season and self.season == video.season: + matches.add('season') + # episode + if video.episode and self.episode == video.episode: + matches.add('episode') + # guess + matches |= guess_matches(video, guessit(self.release, {'type': 'episode'})) + # movie + elif isinstance(video, Movie): + # title + if video.title and (sanitize(self.series) in ( + sanitize(name) for name in [video.title] + video.alternative_titles)): + matches.add('title') + # year + if video.year and self.year == video.year: + matches.add('year') + # guess + matches |= guess_matches(video, guessit(self.release, {'type': 'movie'})) + + logger.debug("Wizdom subtitle criteria match:\n{}".format(matches)) + return matches + + @property + def id(self): + return self.subtitle_id + + +class WizdomProvider(Provider): + subtitle_class = WizdomSubtitle + languages = {Language.fromalpha2(lng) for lng in ['he']} + URL_JSON_SERVER = 'https://json.wizdom.xyz/' + URL_DOWNLOAD_SERVER = 'https://zip.wizdom.xyz/' + URL_WIZDOM_PAGELINK = 'https://wizdom.xyz/{}/{}' + + URL_SEARCH = URL_JSON_SERVER + "search.php?search={}" + URL_INFO = URL_JSON_SERVER + "{}.json" + URL_DOWNLOAD_SUBTITLE = URL_DOWNLOAD_SERVER + "{}.zip" + + def __init__(self): + self.session = None + + def initialize(self): + logger.info("Wizdom initialize") + self.session = Session() + self.session.headers[ + 'User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; ' \ + 'Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36' + return True + + def terminate(self): + logger.info("Wizdom terminate") + self.session.close() + + def _search_series(self, title, movie=False): + logger.debug("Searching '{}'".format(title)) + r = self.session.get(self.URL_SEARCH.format(title)) + if not r.ok: + logger.error("Bad response from server while searching: '{}']".format(title)) + return [] + try: + found = r.json() + except ValueError: + logger.error("Could not extract JSON from response") + return [] + + if movie: + series_list = [x for x in found if 'type' in x and x['type'] == 'movie'] + else: + series_list = [x for x in found if 'type' in x and x['type'] == 'tv'] + + logger.debug("Found the following titles: {}".format([x['title_en'] for x in series_list if 'title_en' in x])) + return series_list + + def _search_subtitles(self, title_id, season=None, episode=None): + r = self.session.get(self.URL_INFO.format(title_id)) + + if not r.ok: + logger.error("Bad response from server while searching subtitles [title_id={}]".format(title_id)) + return [] + if not r.content: + return [] + try: + results = r.json() + except ValueError: + return [] + + if 'subs' not in results: + return [] + + if season and episode: + s_season = str(season) + s_episode = str(episode) + if s_season in results['subs'] and s_episode in results['subs'][s_season]: + return results['subs'][s_season][s_episode] + else: + return results['subs'] + return [] + + def query(self, title, season=None, episode=None, year=None): + subtitles = [] + if season and episode: + logger.debug("Searching for:\nTitle: {}\nSeason: {}\nEpisode: {}\nYear: {}".format(title, season, + episode, year)) + titles = self._search_series(title) + else: + logger.debug("Searching for:\nTitle: {}\nYear: {}\n".format(title, year)) + titles = self._search_series(title, movie=True) + + for title in titles: + title_name = title['title_en'] + title_id = title['imdb'] + if season and episode: + results = self._search_subtitles(title_id, season, episode) + page_link = self.URL_WIZDOM_PAGELINK.format("tv", title_id) + else: + results = self._search_subtitles(title_id) + page_link = self.URL_WIZDOM_PAGELINK.format("movie", title_id) + + if not results: + logger.info("No subtitles found for: {}".format(title_name)) + continue + + for result in results: + subtitle_id, release = result['id'], result['version'] + subtitles.append(self.subtitle_class(next(iter(self.languages)), title_id, subtitle_id, + title_name, season, episode, release, year, page_link)) + + if subtitles: + logger.debug("Found Subtitle Candidates: {}".format([x.release for x in subtitles])) + return subtitles + + def list_subtitles(self, video, languages): + season = episode = year = title = None + + if isinstance(video, Episode): + logger.info("list_subtitles Series: {}, season: {}, episode: {}".format(video.series, + video.season, + video.episode)) + title = video.series + season = video.season + if video.episode == 0: + episode = 1 + else: + episode = video.episode + elif isinstance(video, Movie): + logger.info("list_subtitles Movie: {}, year: {}".format(video.title, video.year)) + title = video.title + year = video.year + + return [s for s in self.query(title, season, episode, year) if s.language in languages] + + def _download_subtitles(self, subtitle_id): + logger.debug("Downloading subtitle id - {}".format(subtitle_id)) + r = self.session.get(self.URL_DOWNLOAD_SUBTITLE.format(subtitle_id)) + + if not r.ok: + logger.error("Bad response from server while downloding zip [id={}]".format(subtitle_id)) + return None + if not r.content: + logger.error("Unable to download zip [id={}]".format(subtitle_id)) + return None + + return r.content + + def download_subtitle(self, subtitle): + # type: (WizdomSubtitle) -> None + + logger.info('Downloading subtitle from WizdomSubs: %r', subtitle) + + content = None + zip_content = self._download_subtitles(subtitle.subtitle_id) + if not zip_content: + return None + if not zip_content[:2] == "PK": + logger.warning("Response did not contain zip file") + return None + + zfile = ZipFile(BytesIO(zip_content)) + if not len(zfile.namelist()): + logger.warning("Response did not contain files inside the zip archive") + return None + + sub_files = [x for x in zfile.namelist() if x.endswith(('.srt', '.idx', '.sub'))] + if sub_files: + content = zfile.open(sub_files[0]).read() + + if not content: + logger.warning("File inside zip is empty") + return None + subtitle.content = fix_line_ending(content) + logger.info("Downloaded {} successfuly!".format(subtitle)) From 734dbf663e29d157a943376cf69d39477b3c9dd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= <glen@pld-linux.org> Date: Thu, 10 Dec 2020 11:39:01 +0200 Subject: [PATCH 682/710] Install: need to enable for the libraries --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 13ed66ce4..8bb8ac0c5 100644 --- a/README.md +++ b/README.md @@ -86,9 +86,18 @@ In addition to that Sub-Zero also fixes problems introduced by the subtitle crea Ever had broken music icons in a subtitle? Nordic characters like `Å` which turned into `Ã¥`? Not anymore. ## Installation + Simply go to the Plex Plugins in your Plex Media Server, search for Sub-Zero and install it. For further help or manual installation, [please go to the wiki](https://github.com/pannal/Sub-Zero.bundle/wiki/Installation). +After installation, you need to enable the plugin for your libraries: + +- go to Settings -> Server -> Agents -> Movies/TV Shows. +- select the metadata provider you use on your library, e.g.: Freebase (movies) or TheTVDB (series) +- enable Sub-Zero Subtitles (TV/Movies) +- configure them. +- refresh your library (or individual movies/TV shows) + ## Big thanks to the beta/i18n testing team (in no particular order)! the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, eherberg, tywilliams_88, Swanny, Jippo, Joost1991 / joost, Marik, Jon, AmbyDK, Clay, Abenlog, michael, smikwily, shoghicp, Zuikkis, Isilorn, Jacob K, Ninjouz, chopeta, fvb, Uthman, Claus Møller, Semi Doludizgin, Rafael, sugarman402, Morpheus1333, Yamil.llanos, Notorius28 From 3f47c1bcb898a39dfd20e0c2e6f28acba1079768 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sun, 24 Jan 2021 04:54:20 +0100 Subject: [PATCH 683/710] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8bb8ac0c5..bda1e4297 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,7 @@ For further help or manual installation, [please go to the wiki](https://github. After installation, you need to enable the plugin for your libraries: +- set your movie libraries to "Plex Movie (legacy)" otherwise no plugins will work - go to Settings -> Server -> Agents -> Movies/TV Shows. - select the metadata provider you use on your library, e.g.: Freebase (movies) or TheTVDB (series) - enable Sub-Zero Subtitles (TV/Movies) From 58aa0da32fa4e09b35470737e8bcb0bea51f4edc Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Mon, 8 Mar 2021 03:48:07 +0100 Subject: [PATCH 684/710] fix #761 --- Contents/Code/support/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 66e172fd1..405c53e82 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -779,8 +779,8 @@ def get_subtitle_destination_folder(self): if not Prefs["subtitles.save.filesystem"]: return - fld_custom = Prefs["subtitles.save.subFolder.Custom"].strip() if cast_bool( - Prefs["subtitles.save.subFolder.Custom"]) else None + fld_custom = Prefs["subtitles.save.subFolder.Custom"].strip() if \ + Prefs["subtitles.save.subFolder.Custom"] else None return fld_custom or ( Prefs["subtitles.save.subFolder"] if Prefs["subtitles.save.subFolder"] != "current folder" else None) From 6bd0f26296e15fd7a4a3b08f22c379cec2b565ab Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 9 Mar 2021 03:47:41 +0100 Subject: [PATCH 685/710] fix #756 - add option to not download subtitles for certain audio languages existing; and/or no audio stream --- Contents/Code/support/config.py | 43 +++++++++++++++++++++++-------- Contents/Code/support/download.py | 10 +++++++ Contents/DefaultPrefs.json | 6 +++++ 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 405c53e82..5ff131cfd 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -160,6 +160,8 @@ class Config(object): exact_filenames = False only_one = False any_language_is_enough = False + ignore_for_audio = False + ignore_subs_for_empty_audio = False embedded_auto_extract = False ietf_as_alpha3 = False unrar = None @@ -252,6 +254,7 @@ def initialize(self): self.plex_transcoder = self.get_plex_transcoder() self.only_one = cast_bool(Prefs['subtitles.only_one']) self.any_language_is_enough = Prefs['subtitles.any_language_is_enough'] + self.ignore_for_audio = self.ignore_subs_for_audio() self.embedded_auto_extract = cast_bool(Prefs["subtitles.embedded.autoextract"]) self.ietf_as_alpha3 = cast_bool(Prefs["subtitles.language.ietf_normalize"]) self.use_custom_dns = self.parse_custom_dns() @@ -694,6 +697,22 @@ def check_enabled_sections(self): Log.Debug(u"I'm enabled for: %s" % [lib.title for key, lib in enabled_sections.iteritems()]) return enabled_sections + def lang_str_to_list(self, s, l): + if len(s) and s != "None": + for lang in s.split(u","): + lang = lang.strip() + if lang == "NULL": + l.append(lang) + continue + try: + real_lang = Language.fromietf(lang) + except: + try: + real_lang = Language.fromname(lang) + except: + continue + l.append(real_lang) + # Prepare a list of languages we want subs for def get_lang_list(self, provider=None, ordered=False): # advanced settings @@ -734,17 +753,9 @@ def get_lang_list(self, provider=None, ordered=False): except: pass - if len(lang_custom) and lang_custom != "None": - for lang in lang_custom.split(u","): - lang = lang.strip() - try: - real_lang = Language.fromietf(lang) - except: - try: - real_lang = Language.fromname(lang) - except: - continue - l.append(real_lang) + self.lang_str_to_list(lang_custom, l) + if "NULL" in l: + l.remove("NULL") if self.forced_also: if Prefs["subtitles.when_forced"] == "Always": @@ -775,6 +786,16 @@ def get_lang_list(self, provider=None, ordered=False): lang_list = property(get_lang_list) + def ignore_subs_for_audio(self): + c = Prefs['subtitles.ignore_for_audio'].strip() + l = [] + + self.lang_str_to_list(c, l) + if "NULL" in l: + l.remove("NULL") + self.ignore_subs_for_empty_audio = True + return l + def get_subtitle_destination_folder(self): if not Prefs["subtitles.save.filesystem"]: return diff --git a/Contents/Code/support/download.py b/Contents/Code/support/download.py index 263facea1..ea68f705e 100644 --- a/Contents/Code/support/download.py +++ b/Contents/Code/support/download.py @@ -16,6 +16,7 @@ def get_missing_languages(video, part): languages_list = config.get_lang_list(ordered=True) languages = set(languages_list) + ignore_langs = set(config.ignore_for_audio) valid_langs_in_media = set() if Prefs["subtitles.when"] != "Always": @@ -29,6 +30,15 @@ def get_missing_languages(video, part): video) return set() + if config.ignore_subs_for_empty_audio and not video.audio_languages: + Log.Debug("Skipping subtitle search for %s, ignoring as no audio stream exists", video) + return set() + + inter = ignore_langs.intersection(video.audio_languages) + if ignore_langs and inter: + Log.Debug("Skipping subtitle search for %s, ignoring due to existing audio streams: %s", video, inter) + return set() + # should we treat IETF as alpha3? (ditch the country part) alpha3_map = {} if config.ietf_as_alpha3: diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 2954a1f00..f9f857c8f 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -192,6 +192,12 @@ ], "default": "Always" }, + { + "id": "subtitles.ignore_for_audio", + "label": "No subtitles for Audio languages (use ISO-639-1 codes; comma-separated; NULL=no audio)", + "type": "text", + "default": "None" + }, { "id": "subtitles.when_forced", "label": "Download foreign/forced subtitles", From 2e5f0551a156f9510394fe13d771daee5fc8fe41 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 9 Mar 2021 03:50:28 +0100 Subject: [PATCH 686/710] 2.6.5.3254 --- Contents/Info.plist | 4 ++-- README.md | 33 +++++++-------------------------- 2 files changed, 9 insertions(+), 28 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 1dcf9450d..913e8b51c 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3247</string> + <string>2.6.5.3254</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3247 DEV +Version 2.6.5.3254 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/README.md b/README.md index 13ed66ce4..384896600 100644 --- a/README.md +++ b/README.md @@ -94,43 +94,24 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3247 +2.6.5.3254 subscene, addic7ed - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog -core: fix for tv.plex.agents.movie not populating its media types -core: tasks: findBetterSubtitles: increase minimum score for better subtitles for movies with extracted embedded subs from 82 to 112 - - -2.6.5.3241 - -subscene, addic7ed -- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration +core: properly handle ReadTimeout +core: fix existing subtitle detection for custom subtitle folders (fix #761) +core: add option to not download subtitles for certain audio languages existing; and/or no audio stream (fix #756) -Changelog -- core: add support for new Plex Movie agent -- core: remove py3 compat breaking unnecessary change -- core: skip drawing tags for SRT -- core: advanced_settings: refiners: drone: add custom pem_file support; fixes #735 -- providers: core: set DownloadLimitPerDayExceeded timeout to 4 hours (was one day); -- providers: addic7ed: limit downloads per day; add vip setting -- providers: addic7ed: properly compare last_dl, add last_reset tracking info to log #723 -- providers: addic7ed: properly implement limits -- submod: HI: remove more music tags -- submod: common CM_punctuation_space2: detect AND don't try changing domain/url/host when fixing punctuation - - -2.6.5.3223 +2.6.5.3247 subscene, addic7ed - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog -- core: scoring: reorder subtitles based on second non-hash-score if main hash score is the same; morpheus65535/bazarr#821 -- providers: bsplayer: verify hash; clean up - +core: fix for tv.plex.agents.movie not populating its media types +core: tasks: findBetterSubtitles: increase minimum score for better subtitles for movies with extracted embedded subs from 82 to 112 [older changes](CHANGELOG.md) From a0a29618bfd096b8a2a30c323dbe2b0dfae0384e Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 9 Mar 2021 03:56:38 +0100 Subject: [PATCH 687/710] update readme --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 384896600..e9a957710 100644 --- a/README.md +++ b/README.md @@ -86,8 +86,7 @@ In addition to that Sub-Zero also fixes problems introduced by the subtitle crea Ever had broken music icons in a subtitle? Nordic characters like `Å` which turned into `Ã¥`? Not anymore. ## Installation -Simply go to the Plex Plugins in your Plex Media Server, search for Sub-Zero and install it. -For further help or manual installation, [please go to the wiki](https://github.com/pannal/Sub-Zero.bundle/wiki/Installation). +[Please go to the wiki](https://github.com/pannal/Sub-Zero.bundle/wiki/Installation). ## Big thanks to the beta/i18n testing team (in no particular order)! the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, eherberg, tywilliams_88, Swanny, Jippo, Joost1991 / joost, Marik, Jon, AmbyDK, Clay, Abenlog, michael, smikwily, shoghicp, Zuikkis, Isilorn, Jacob K, Ninjouz, chopeta, fvb, Uthman, Claus Møller, Semi Doludizgin, Rafael, sugarman402, Morpheus1333, Yamil.llanos, Notorius28 From 06e8c0e1ff8749ceb9c58c34e715a66787e9550e Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Tue, 9 Mar 2021 03:57:11 +0100 Subject: [PATCH 688/710] Update README.md --- README.md | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/README.md b/README.md index bda1e4297..65939a47a 100644 --- a/README.md +++ b/README.md @@ -86,18 +86,7 @@ In addition to that Sub-Zero also fixes problems introduced by the subtitle crea Ever had broken music icons in a subtitle? Nordic characters like `Å` which turned into `Ã¥`? Not anymore. ## Installation - -Simply go to the Plex Plugins in your Plex Media Server, search for Sub-Zero and install it. -For further help or manual installation, [please go to the wiki](https://github.com/pannal/Sub-Zero.bundle/wiki/Installation). - -After installation, you need to enable the plugin for your libraries: - -- set your movie libraries to "Plex Movie (legacy)" otherwise no plugins will work -- go to Settings -> Server -> Agents -> Movies/TV Shows. -- select the metadata provider you use on your library, e.g.: Freebase (movies) or TheTVDB (series) -- enable Sub-Zero Subtitles (TV/Movies) -- configure them. -- refresh your library (or individual movies/TV shows) +[Please go to the wiki](https://github.com/pannal/Sub-Zero.bundle/wiki/Installation). ## Big thanks to the beta/i18n testing team (in no particular order)! the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, eherberg, tywilliams_88, Swanny, Jippo, Joost1991 / joost, Marik, Jon, AmbyDK, Clay, Abenlog, michael, smikwily, shoghicp, Zuikkis, Isilorn, Jacob K, Ninjouz, chopeta, fvb, Uthman, Claus Møller, Semi Doludizgin, Rafael, sugarman402, Morpheus1333, Yamil.llanos, Notorius28 From a352be89f5c54ae6d6f8817818710f1417f0b66f Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Tue, 9 Mar 2021 04:03:25 +0100 Subject: [PATCH 689/710] clarify subtitles.ignore_for_audio --- Contents/DefaultPrefs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index f9f857c8f..813a76fcd 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -194,7 +194,7 @@ }, { "id": "subtitles.ignore_for_audio", - "label": "No subtitles for Audio languages (use ISO-639-1 codes; comma-separated; NULL=no audio)", + "label": "Don't download subtitles for Audio languages (use ISO-639-1 codes; comma-separated; NULL=no audio)", "type": "text", "default": "None" }, From 60ff16c174d7854dc67e78fdfebbe4f8b911f4bb Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Mon, 22 Mar 2021 18:46:37 +0100 Subject: [PATCH 690/710] menu: allow extraction of embedded subtitles for whole tv shows --- Contents/Code/interface/menu.py | 70 +++++++++++++++++++++----------- Contents/Code/support/extract.py | 46 ++++++++++++--------- 2 files changed, 73 insertions(+), 43 deletions(-) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index 8cfc82cb9..110bbbcc9 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -108,28 +108,51 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p add_incl_excl_options(oc, current_kind, title=sub_title, rating_key=rating_key, callback_menu=InclExclMenu) # mass-extract embedded - if current_kind == "season" and config.plex_transcoder: - for lang in config.lang_list: - oc.add(DirectoryObject( - key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, - base_title=show.section.title, display_items=display_items, item_title=item_title, - title=title, - previous_item_type=previous_item_type, with_mods=True, - previous_rating_key=previous_rating_key, randomize=timestamp()), - title=_(u"Extract missing %(language)s embedded subtitles", language=display_language(lang)), - summary=_("Extracts the not yet extracted embedded subtitles of all episodes for the current " - "season with all configured default modifications") - )) - oc.add(DirectoryObject( - key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, - base_title=show.section.title, display_items=display_items, item_title=item_title, - title=title, force=True, - previous_item_type=previous_item_type, with_mods=True, - previous_rating_key=previous_rating_key, randomize=timestamp()), - title=_(u"Extract and activate %(language)s embedded subtitles", language=display_language(lang)), - summary=_("Extracts embedded subtitles of all episodes for the current season " - "with all configured default modifications") - )) + if config.plex_transcoder: + if current_kind == "season": + for lang in config.lang_list: + oc.add(DirectoryObject( + key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, + base_title=show.section.title, display_items=display_items, item_title=item_title, + title=title, + previous_item_type=previous_item_type, with_mods=True, + previous_rating_key=previous_rating_key, randomize=timestamp()), + title=_(u"Extract missing %(language)s embedded subtitles", language=display_language(lang)), + summary=_("Extracts the not yet extracted embedded subtitles of all episodes for the current " + "season with all configured default modifications") + )) + oc.add(DirectoryObject( + key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, + base_title=show.section.title, display_items=display_items, item_title=item_title, + title=title, force=True, + previous_item_type=previous_item_type, with_mods=True, + previous_rating_key=previous_rating_key, randomize=timestamp()), + title=_(u"Extract and activate %(language)s embedded subtitles", language=display_language(lang)), + summary=_("Extracts embedded subtitles of all episodes for the current season " + "with all configured default modifications") + )) + elif current_kind == "series": + for lang in config.lang_list: + oc.add(DirectoryObject( + key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, + base_title=title, display_items=display_items, item_title=item_title, + title=title, mode="series", + previous_item_type=previous_item_type, with_mods=True, + previous_rating_key=previous_rating_key, randomize=timestamp()), + title=_(u"Extract missing %(language)s embedded subtitles", language=display_language(lang)), + summary=_("Extracts the not yet extracted embedded subtitles of all episodes for the current " + "series with all configured default modifications") + )) + oc.add(DirectoryObject( + key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, + base_title=title, display_items=display_items, item_title=item_title, + title=title, force=True, mode="series", + previous_item_type=previous_item_type, with_mods=True, + previous_rating_key=previous_rating_key, randomize=timestamp()), + title=_(u"Extract and activate %(language)s embedded subtitles", language=display_language(lang)), + summary=_("Extracts embedded subtitles of all episodes for the current series " + "with all configured default modifications") + )) # add refresh oc.add(DirectoryObject( @@ -160,9 +183,10 @@ def SeasonExtractEmbedded(**kwargs): item_title = kwargs.pop("item_title") title = kwargs.pop("title") force = kwargs.pop("force", False) + mode = kwargs.pop("mode", "season") Thread.Create(season_extract_embedded, **{"rating_key": rating_key, "requested_language": requested_language, - "with_mods": with_mods, "force": force}) + "with_mods": with_mods, "force": force, "mode": mode}) kwargs["header"] = _("Success") kwargs["message"] = _(u"Extracting of embedded subtitles for %s triggered", title) diff --git a/Contents/Code/support/extract.py b/Contents/Code/support/extract.py index 709bbb7d8..7e64b8643 100644 --- a/Contents/Code/support/extract.py +++ b/Contents/Code/support/extract.py @@ -94,30 +94,36 @@ def execute(): execute() -def season_extract_embedded(rating_key, requested_language, with_mods=False, force=False): +def season_extract_embedded(rating_key, requested_language, with_mods=False, force=False, mode="season"): # get stored subtitle info for item id subtitle_storage = get_subtitle_storage() try: - for data in get_all_items(key="children", value=rating_key, base="library/metadata"): - item = get_item(data[MI_KEY]) - if item: - stored_subs = subtitle_storage.load_or_new(item) - for part in get_all_parts(item): - embedded_subs = stored_subs.get_by_provider(part.id, requested_language, "embedded") - current = stored_subs.get_any(part.id, requested_language) - if not embedded_subs or force: - stream_data = get_embedded_subtitle_streams(part, requested_language=requested_language) - if stream_data: - stream = stream_data[0]["stream"] - - set_current = not current or force - refresh = not current - - extract_embedded_sub(rating_key=item.rating_key, part_id=part.id, - stream_index=str(stream.index), set_current=set_current, - refresh=refresh, language=requested_language, with_mods=with_mods, - extract_mode="m") + rating_keys = [rating_key] + if mode == "series": + seasons = get_all_items(key="children", value=rating_key, base="library/metadata") + rating_keys = [season[MI_KEY] for season in seasons] + + for rating_key in rating_keys: + for data in get_all_items(key="children", value=rating_key, base="library/metadata"): + item = get_item(data[MI_KEY]) + if item: + stored_subs = subtitle_storage.load_or_new(item) + for part in get_all_parts(item): + embedded_subs = stored_subs.get_by_provider(part.id, requested_language, "embedded") + current = stored_subs.get_any(part.id, requested_language) + if not embedded_subs or force: + stream_data = get_embedded_subtitle_streams(part, requested_language=requested_language) + if stream_data: + stream = stream_data[0]["stream"] + + set_current = not current or force + refresh = not current + + extract_embedded_sub(rating_key=item.rating_key, part_id=part.id, + stream_index=str(stream.index), set_current=set_current, + refresh=refresh, language=requested_language, with_mods=with_mods, + extract_mode="m") finally: subtitle_storage.destroy() From fc0ea002146cd5841009b8f833f4e2f49dd65f61 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 7 May 2021 02:04:48 +0200 Subject: [PATCH 691/710] core: delay initial item refresh after refresh call (default: 5 seconds) --- Contents/Code/support/items.py | 1 + Contents/advanced_settings.json.template | 3 +++ 2 files changed, 4 insertions(+) diff --git a/Contents/Code/support/items.py b/Contents/Code/support/items.py index aefcdf651..cdd18a6f8 100644 --- a/Contents/Code/support/items.py +++ b/Contents/Code/support/items.py @@ -349,6 +349,7 @@ def refresh_item(rating_key, force=False, timeout=8000, refresh_kind=None, paren refresh = [item.rating_key for item in list(Plex["library/metadata"].children(int(rating_key)))] multiple = len(refresh) > 1 + Thread.Sleep(config.advanced.get("refresh_after_called", 5)) for key in refresh: Log.Info("%s item %s", "Refreshing" if not force else "Forced-refreshing", key) Plex["library/metadata"].refresh(key) diff --git a/Contents/advanced_settings.json.template b/Contents/advanced_settings.json.template index 19b12e2ae..91190575b 100644 --- a/Contents/advanced_settings.json.template +++ b/Contents/advanced_settings.json.template @@ -33,6 +33,9 @@ Don't expect support if you mess this up. "debug_i18n": false, + // refresh item after plugin refresh has been called (default: 5) + "refresh_after_called": 5, + // per-provider-config "providers": { // enabled_for: specifies which media type to enable the provider for. does not override global/throttled From 1b83203a64c6c00d6d35fc206fab4fd0a57282b0 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Fri, 7 May 2021 02:06:12 +0200 Subject: [PATCH 692/710] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 65939a47a..419136a72 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Sub-Zero for Plex [![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle.svg?style=flat&label=stable)](https://github.com/pannal/Sub-Zero.bundle/releases/latest) [![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)]() -[![Maintenance](https://img.shields.io/maintenance/yes/2020.svg)]() +[![Maintenance](https://img.shields.io/maintenance/yes/2021.svg)]() [![Slack Status](https://szslack.fragstore.net/badge.svg)](https://szslack.fragstore.net) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle?ref=badge_shield) From 0a4014c4bfcdbfaff44318d120c647595ddcb564 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 7 May 2021 02:07:43 +0200 Subject: [PATCH 693/710] core: delay subsequent refreshes for the same time core: advanced: add "refresh_after_called" (default: 5 seconds) --- Contents/Code/support/items.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/items.py b/Contents/Code/support/items.py index cdd18a6f8..c51df76b0 100644 --- a/Contents/Code/support/items.py +++ b/Contents/Code/support/items.py @@ -349,12 +349,13 @@ def refresh_item(rating_key, force=False, timeout=8000, refresh_kind=None, paren refresh = [item.rating_key for item in list(Plex["library/metadata"].children(int(rating_key)))] multiple = len(refresh) > 1 - Thread.Sleep(config.advanced.get("refresh_after_called", 5)) + wait = config.advanced.get("refresh_after_called", 5) + Thread.Sleep(wait) for key in refresh: Log.Info("%s item %s", "Refreshing" if not force else "Forced-refreshing", key) Plex["library/metadata"].refresh(key) if multiple: - Thread.Sleep(10.0) + Thread.Sleep(wait) def get_current_sub(rating_key, part_id, language, plex_item=None): From 69096d89b260286473f35397267d77490e8254f4 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 7 May 2021 02:28:24 +0200 Subject: [PATCH 694/710] 2.6.5.3268 --- CHANGELOG.md | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 21 +++++++------------- 2 files changed, 61 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b9a1a4fe..4af26eb6d 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,56 @@ +2.6.5.3268 +subscene, addic7ed +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- clarify README +- core: fix custom folder handling; #761 +- core: providers: screwzira: move to ktuvit and wizdom +- core: add option to not download subtitles for certain audio languages existing; and/or no audio stream; fix #756 +- core: delay item refreshes after refresh call (default: 5 seconds; exposed in advanced settings) +- menu: allow extraction of embedded subtitles for whole tv shows + + +2.6.5.3247 + +subscene, addic7ed + +either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service (anti-captcha.com or deathbycaptcha.com), add funds, then supply your credentials/apikey in the configuration +Changelog +core: fix for tv.plex.agents.movie not populating its media types +core: tasks: findBetterSubtitles: increase minimum score for better subtitles for movies with extracted embedded subs from 82 to 112 + + +2.6.5.3241 + +subscene, addic7ed + +either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service (anti-captcha.com or deathbycaptcha.com), add funds, then supply your credentials/apikey in the configuration +Changelog + +core: add support for new Plex Movie agent +core: remove py3 compat breaking unnecessary change +core: skip drawing tags for SRT +core: advanced_settings: refiners: drone: add custom pem_file support; fixes #735 +providers: core: set DownloadLimitPerDayExceeded timeout to 4 hours (was one day); +providers: addic7ed: limit downloads per day; add vip setting +providers: addic7ed: properly compare last_dl, add last_reset tracking info to log #723 +providers: addic7ed: properly implement limits +submod: HI: remove more music tags +submod: common CM_punctuation_space2: detect AND don't try changing domain/url/host when fixing punctuation + + +2.6.5.3223 + +subscene, addic7ed + +either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service (anti-captcha.com or deathbycaptcha.com), add funds, then supply your credentials/apikey in the configuration +Changelog + +core: scoring: reorder subtitles based on second non-hash-score if main hash score is the same; morpheus65535/bazarr#821 +providers: bsplayer: verify hash; clean up + + 2.6.5.3217 subscene, addic7ed @@ -17,6 +70,7 @@ Changelog 2.6.5.3183 + subscene, addic7ed - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration diff --git a/README.md b/README.md index 6b45704b0..b952f0bf2 100644 --- a/README.md +++ b/README.md @@ -93,24 +93,17 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog -2.6.5.3254 - -subscene, addic7ed -- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration - -Changelog -core: properly handle ReadTimeout -core: fix existing subtitle detection for custom subtitle folders (fix #761) -core: add option to not download subtitles for certain audio languages existing; and/or no audio stream (fix #756) - -2.6.5.3247 - +2.6.5.3268 subscene, addic7ed - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration Changelog -core: fix for tv.plex.agents.movie not populating its media types -core: tasks: findBetterSubtitles: increase minimum score for better subtitles for movies with extracted embedded subs from 82 to 112 +- clarify README +- core: fix custom folder handling; #761 +- core: providers: screwzira: move to ktuvit and wizdom +- core: add option to not download subtitles for certain audio languages existing; and/or no audio stream; fix #756 +- core: delay item refreshes after refresh call (default: 5 seconds; exposed in advanced settings) +- menu: allow extraction of embedded subtitles for whole tv shows [older changes](CHANGELOG.md) From 432255d0889b0f76e3aa5aa1861206c11c43bd94 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 7 May 2021 02:28:55 +0200 Subject: [PATCH 695/710] update dev version to 2.6.5.3268 --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 913e8b51c..152a1f0d8 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3254</string> + <string>2.6.5.3268</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3254 DEV +Version 2.6.5.3268 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From dabef2240d7361ae229777a0cc571b1694bac22b Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 7 May 2021 02:29:32 +0200 Subject: [PATCH 696/710] 2.6.5.3268 --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 152a1f0d8..437a6f5da 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3268 DEV +Version 2.6.5.3268 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 2788b0e0b27a37b463c4c8fc08072542579c7f75 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Fri, 7 May 2021 02:36:16 +0200 Subject: [PATCH 697/710] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b952f0bf2..940abc4bb 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Check out **[the Sub-Zero Wiki](https://github.com/pannal/Sub-Zero.bundle/wiki)* ## Helping development -If you like this, buy me a beer: <br>[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G9VKR2B8PMNKG) <br>or become a Patreon starting at **1 $ / month** <br><a href="https://www.patreon.com/subzero_plex" target="_blank"><img src="https://i0.wp.com/tablecakes.com/wp-content/uploads/2018/08/become-a-patron-button.png" height="54" /></a> <br>or use the OpenSubtitles Sub-Zero affiliate link to become VIP <br>**10€/year, ad-free subs, 1000 subs/day, no-cache *VIP* server**<br><a href="http://v.ht/osvip" target="_blank"><img src="https://static.opensubtitles.org/gfx/logo.gif" height="50" /></a> +If you like this, buy me a beer: <br>[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G9VKR2B8PMNKG) <br>or become a Patreon starting at **1 $ / month** <br><a href="https://www.patreon.com/subzero_plex" target="_blank"><img src="https://images.squarespace-cdn.com/content/v1/56c7831bf8baf3ae17ce9259/1561826418792-IJOMFASTOR6CW80N5W0Z/ke17ZwdGBToddI8pDm48kEycOuEejcFJqqLot0yQ4VVZw-zPPgdn4jUwVcJE1ZvWEtT5uBSRWt4vQZAgTJucoTqqXjS3CfNDSuuf31e0tVFrfGYmOrPFZFUXr1UxW4wA0PgPOjs31URy2JeWL9DdYhur-lC0WofN0YB1wFg-ZW0/footer-patreon.png?format=500w" height="54" /></a> If you register with an anti-captcha service and you decide to use [Anti-Captcha.com](http://getcaptchasolution.com/kkvviom7nh), you can use [this affiliate link](http://getcaptchasolution.com/kkvviom7nh) to help development. From 8de63e92e5106848eea7e89db79219518dcdaefe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20N=C3=A9meth?= <35818300+sugarman402@users.noreply.github.com> Date: Sun, 5 Jun 2022 18:22:01 +0200 Subject: [PATCH 698/710] Change supersupbtitles server url Supersubtitles' url changed from feliratok.info to feliratok.eu --- .../Shared/subliminal_patch/providers/supersubtitles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py index 97c841103..52c2d6be4 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py @@ -143,7 +143,7 @@ class SuperSubtitlesProvider(Provider, ProviderSubtitleArchiveMixin): ]} video_types = (Episode, Movie) # https://www.feliratok.info/?search=&soriSorszam=&nyelv=&sorozatnev=The+Flash+%282014%29&sid=3212&complexsearch=true&knyelv=0&evad=4&epizod1=1&cimke=0&minoseg=0&rlsr=0&tab=all - server_url = 'https://www.feliratok.info/' + server_url = 'https://www.feliratok.eu/' subtitle_class = SuperSubtitlesSubtitle hearing_impaired_verifiable = False multi_result_throttle = 2 # seconds From 67b20b357d1ef566e54e3201466ea480288649e8 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Fri, 7 May 2021 02:30:13 +0200 Subject: [PATCH 699/710] back to dev --- Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 437a6f5da..152a1f0d8 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>0</string> + <string>1</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3268 +Version 2.6.5.3268 DEV Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 19a66dcf1cd1dc1dc3ea9d898c6ef919d7c5ce70 Mon Sep 17 00:00:00 2001 From: panni <panni@fragstore.net> Date: Thu, 26 Aug 2021 13:05:14 +0200 Subject: [PATCH 700/710] core: fix adding guessit-supplied titles as alternative titles (were overridden by plex before) --- Contents/Libraries/Shared/subliminal_patch/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index 7c40516cc..ab9350b2b 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -529,7 +529,7 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski video.hints = hints # get possibly alternative title from the filename itself - alt_guess = guessit(filename, options=hints) + alt_guess = guessit(filename, options={k: v for k, v in hints.items() if k not in ('expected_title', 'title')}) if "title" in alt_guess and alt_guess["title"] != guessed_result["title"]: if video_type == "episode": video.alternative_series.append(alt_guess["title"]) From ccf264cffbff8227f2ac13370a474a07700ebf9c Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Fri, 7 Jul 2023 16:14:47 +0200 Subject: [PATCH 701/710] core: fix enabled library/agents detection (Plex removed certain features) --- Contents/Code/support/config.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 2438625a3..632db4cf8 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -671,12 +671,23 @@ def check_enabled_sections(self): enabled_for_primary_agents = {"movie": [], "show": []} enabled_sections = {} + legacy_agents = { + "com.plexapp.agents.thetvdb": [SHOW], + "com.plexapp.agents.thetvdbdvdorder": [SHOW], + "com.plexapp.agents.hama": [SHOW, MOVIE], + "com.plexapp.agents.themoviedb": [SHOW, MOVIE], + "com.plexapp.agents.imdb": [SHOW, MOVIE], + } + # find which agents we're enabled for for agent in Plex.agents(): - if not agent.primary: + #if not agent.primary: + # continue + if agent.identifier not in legacy_agents: continue - media_types = [t.media_type for t in list(agent.media_types)] + #media_types = [t.media_type for t in list(agent.media_types)] + media_types = legacy_agents[agent.identifier] + [] # the new movie agent doesn't populate its media types, workaround if not media_types and agent.identifier == "tv.plex.agents.movie": From f888cadb8f9163af59cc8eb05362c8c9604c6421 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sun, 9 Jul 2023 04:49:32 +0200 Subject: [PATCH 702/710] release 2.6.5.3277 --- Contents/Info.plist | 6 +++--- .../Shared/subzero/modification/mods/common.py | 8 ++++++++ README.md | 11 ++++++++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/Contents/Info.plist b/Contents/Info.plist index 152a1f0d8..9cdbc87f5 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3268</string> + <string>2.6.5.3277</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -23,7 +23,7 @@ <key>PlexPluginConsoleLogging</key> <string>0</string> <key>PlexPluginDevMode</key> - <string>1</string> + <string>0</string> <key>PlexPluginCodePolicy</key> <!-- this allows channels to access some python methods which are otherwise blocked, as well as import external code libraries, and interact with the PMS HTTP API --> <string>Elevated</string> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3268 DEV +Version 2.6.5.3277 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 49a5aa0f4..47b897f4c 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -181,6 +181,14 @@ def modify(self, content, debug=False, parent=None, **kwargs): entry.plaintext = self.capitalize(entry.plaintext) +""" +subsync + +subsync --cli --offline --overwrite --window-size=600 --max-point-dist=2.0 --min-points-no=20 --min-word-prob=0.3 --min-word-len=5 --min-correlation=0.9999 --min-words-sim=0.6 --out-time-offset=-0.08 sync --out SUBTITLE -s SUBTITLE --sub-lang=eng --sub-enc=utf-8 -r REF_FILE --ref-stream-by-type=audio --ref-stream-by-lang=eng + +""" + + registry.register(CommonFixes) registry.register(RemoveTags) registry.register(ReverseRTL) diff --git a/README.md b/README.md index 940abc4bb..3a666ac00 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Sub-Zero for Plex [![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle.svg?style=flat&label=stable)](https://github.com/pannal/Sub-Zero.bundle/releases/latest) [![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)]() -[![Maintenance](https://img.shields.io/maintenance/yes/2021.svg)]() +[![Maintenance](https://img.shields.io/maintenance/yes/2023.svg)]() [![Slack Status](https://szslack.fragstore.net/badge.svg)](https://szslack.fragstore.net) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle?ref=badge_shield) @@ -12,6 +12,9 @@ Check out **[the Sub-Zero Wiki](https://github.com/pannal/Sub-Zero.bundle/wiki)* <br /> +## Legacy maintenance mode +This addon will not be developed any further. It still works and arguably is still the best for managing subtitles when using Plex. As long as Plex Inc. supports agents, Sub-Zero will be maintained to work with the latest PMS version. + --- **[Kitana is now required to have a UI](https://github.com/pannal/Kitana)** @@ -93,6 +96,12 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog +2.6.5.3277 +- core: fix enabled library/agents detection (Plex removed certain features) + fix Plex agent integration; Plex Inc removed certain attributes; SZ is now limited to thetvdb, thetvdbdvdorder, hama, themoviedb, imdb) + + + 2.6.5.3268 subscene, addic7ed - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration From 4ced7d8c8f9f5fb47d12410f87fa33d782e9f0f4 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sun, 9 Jul 2023 15:07:38 +0200 Subject: [PATCH 703/710] remove old TLD file due to licensing issues --- .../effective_tld_names-2013-04-22.dat.txt | 4418 ----------------- 1 file changed, 4418 deletions(-) delete mode 100644 Contents/Libraries/Shared/tld/res/old/effective_tld_names-2013-04-22.dat.txt diff --git a/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2013-04-22.dat.txt b/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2013-04-22.dat.txt deleted file mode 100644 index 25f7b0e18..000000000 --- a/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2013-04-22.dat.txt +++ /dev/null @@ -1,4418 +0,0 @@ -// ***** BEGIN LICENSE BLOCK ***** -// Version: MPL 1.1/GPL 2.0/LGPL 2.1 -// -// The contents of this file are subject to the Mozilla Public License Version -// 1.1 (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// http://www.mozilla.org/MPL/ -// -// Software distributed under the License is distributed on an "AS IS" basis, -// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -// for the specific language governing rights and limitations under the -// License. -// -// The Original Code is the Public Suffix List. -// -// The Initial Developer of the Original Code is -// Jo Hermans <jo.hermans@gmail.com>. -// Portions created by the Initial Developer are Copyright (C) 2007 -// the Initial Developer. All Rights Reserved. -// -// Contributor(s): -// Ruben Arakelyan <ruben@wackomenace.co.uk> -// Gervase Markham <gerv@gerv.net> -// Pamela Greene <pamg.bugs@gmail.com> -// David Triendl <david@triendl.name> -// The kind representatives of many TLD registries -// -// Alternatively, the contents of this file may be used under the terms of -// either the GNU General Public License Version 2 or later (the "GPL"), or -// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -// in which case the provisions of the GPL or the LGPL are applicable instead -// of those above. If you wish to allow use of your version of this file only -// under the terms of either the GPL or the LGPL, and not to allow others to -// use your version of this file under the terms of the MPL, indicate your -// decision by deleting the provisions above and replace them with the notice -// and other provisions required by the GPL or the LGPL. If you do not delete -// the provisions above, a recipient may use your version of this file under -// the terms of any one of the MPL, the GPL or the LGPL. -// -// ***** END LICENSE BLOCK ***** - -// ac : http://en.wikipedia.org/wiki/.ac -ac -com.ac -edu.ac -gov.ac -net.ac -mil.ac -org.ac - -// ad : http://en.wikipedia.org/wiki/.ad -ad -nom.ad - -// ae : http://en.wikipedia.org/wiki/.ae -// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php -ae -co.ae -net.ae -org.ae -sch.ae -ac.ae -gov.ae -mil.ae - -// aero : see http://www.information.aero/index.php?id=66 -aero -accident-investigation.aero -accident-prevention.aero -aerobatic.aero -aeroclub.aero -aerodrome.aero -agents.aero -aircraft.aero -airline.aero -airport.aero -air-surveillance.aero -airtraffic.aero -air-traffic-control.aero -ambulance.aero -amusement.aero -association.aero -author.aero -ballooning.aero -broker.aero -caa.aero -cargo.aero -catering.aero -certification.aero -championship.aero -charter.aero -civilaviation.aero -club.aero -conference.aero -consultant.aero -consulting.aero -control.aero -council.aero -crew.aero -design.aero -dgca.aero -educator.aero -emergency.aero -engine.aero -engineer.aero -entertainment.aero -equipment.aero -exchange.aero -express.aero -federation.aero -flight.aero -freight.aero -fuel.aero -gliding.aero -government.aero -groundhandling.aero -group.aero -hanggliding.aero -homebuilt.aero -insurance.aero -journal.aero -journalist.aero -leasing.aero -logistics.aero -magazine.aero -maintenance.aero -marketplace.aero -media.aero -microlight.aero -modelling.aero -navigation.aero -parachuting.aero -paragliding.aero -passenger-association.aero -pilot.aero -press.aero -production.aero -recreation.aero -repbody.aero -res.aero -research.aero -rotorcraft.aero -safety.aero -scientist.aero -services.aero -show.aero -skydiving.aero -software.aero -student.aero -taxi.aero -trader.aero -trading.aero -trainer.aero -union.aero -workinggroup.aero -works.aero - -// af : http://www.nic.af/help.jsp -af -gov.af -com.af -org.af -net.af -edu.af - -// ag : http://www.nic.ag/prices.htm -ag -com.ag -org.ag -net.ag -co.ag -nom.ag - -// ai : http://nic.com.ai/ -ai -off.ai -com.ai -net.ai -org.ai - -// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 -al -com.al -edu.al -gov.al -mil.al -net.al -org.al - -// am : http://en.wikipedia.org/wiki/.am -am - -// an : http://www.una.an/an_domreg/default.asp -an -com.an -net.an -org.an -edu.an - -// ao : http://en.wikipedia.org/wiki/.ao -// http://www.dns.ao/REGISTR.DOC -ao -ed.ao -gv.ao -og.ao -co.ao -pb.ao -it.ao - -// aq : http://en.wikipedia.org/wiki/.aq -aq - -// ar : http://en.wikipedia.org/wiki/.ar -*.ar -!congresodelalengua3.ar -!educ.ar -!gobiernoelectronico.ar -!mecon.ar -!nacion.ar -!nic.ar -!promocion.ar -!retina.ar -!uba.ar - -// arpa : http://en.wikipedia.org/wiki/.arpa -// Confirmed by registry <iana-questions@icann.org> 2008-06-18 -e164.arpa -in-addr.arpa -ip6.arpa -iris.arpa -uri.arpa -urn.arpa - -// as : http://en.wikipedia.org/wiki/.as -as -gov.as - -// asia: http://en.wikipedia.org/wiki/.asia -asia - -// at : http://en.wikipedia.org/wiki/.at -// Confirmed by registry <it@nic.at> 2008-06-17 -at -ac.at -co.at -gv.at -or.at - -// http://www.info.at/ -biz.at -info.at - -// priv.at : http://www.nic.priv.at/ -// Submitted by registry <lendl@nic.at> 2008-06-09 -priv.at - -// au : http://en.wikipedia.org/wiki/.au -*.au -// au geographical names (vic.au etc... are covered above) -act.edu.au -nsw.edu.au -nt.edu.au -qld.edu.au -sa.edu.au -tas.edu.au -vic.edu.au -wa.edu.au -act.gov.au -// Removed at request of Shae.Donelan@services.nsw.gov.au, 2010-03-04 -// nsw.gov.au -nt.gov.au -qld.gov.au -sa.gov.au -tas.gov.au -vic.gov.au -wa.gov.au - -// aw : http://en.wikipedia.org/wiki/.aw -aw -com.aw - -// ax : http://en.wikipedia.org/wiki/.ax -ax - -// az : http://en.wikipedia.org/wiki/.az -az -com.az -net.az -int.az -gov.az -org.az -edu.az -info.az -pp.az -mil.az -name.az -pro.az -biz.az - -// ba : http://en.wikipedia.org/wiki/.ba -ba -org.ba -net.ba -edu.ba -gov.ba -mil.ba -unsa.ba -unbi.ba -co.ba -com.ba -rs.ba - -// bb : http://en.wikipedia.org/wiki/.bb -bb -biz.bb -com.bb -edu.bb -gov.bb -info.bb -net.bb -org.bb -store.bb - -// bd : http://en.wikipedia.org/wiki/.bd -*.bd - -// be : http://en.wikipedia.org/wiki/.be -// Confirmed by registry <tech@dns.be> 2008-06-08 -be -ac.be - -// bf : http://en.wikipedia.org/wiki/.bf -bf -gov.bf - -// bg : http://en.wikipedia.org/wiki/.bg -// https://www.register.bg/user/static/rules/en/index.html -bg -a.bg -b.bg -c.bg -d.bg -e.bg -f.bg -g.bg -h.bg -i.bg -j.bg -k.bg -l.bg -m.bg -n.bg -o.bg -p.bg -q.bg -r.bg -s.bg -t.bg -u.bg -v.bg -w.bg -x.bg -y.bg -z.bg -0.bg -1.bg -2.bg -3.bg -4.bg -5.bg -6.bg -7.bg -8.bg -9.bg - -// bh : http://en.wikipedia.org/wiki/.bh -// list of other 2nd level tlds ? -bh -com.bh - -// bi : http://en.wikipedia.org/wiki/.bi -// http://whois.nic.bi/ -bi -co.bi -com.bi -edu.bi -or.bi -org.bi - -// biz : http://en.wikipedia.org/wiki/.biz -biz - -// bj : http://en.wikipedia.org/wiki/.bj -bj -asso.bj -barreau.bj -gouv.bj - -// bm : http://www.bermudanic.bm/dnr-text.txt -bm -com.bm -edu.bm -gov.bm -net.bm -org.bm - -// bn : http://en.wikipedia.org/wiki/.bn -*.bn - -// bo : http://www.nic.bo/ -bo -com.bo -edu.bo -gov.bo -gob.bo -int.bo -org.bo -net.bo -mil.bo -tv.bo - -// br : http://en.wikipedia.org/wiki/.br -// http://registro.br/info/dpn.html -// Confirmed by registry <fneves@registro.br> 2008-06-24 -br -adm.br -adv.br -agr.br -am.br -arq.br -art.br -ato.br -bio.br -blog.br -bmd.br -can.br -cim.br -cng.br -cnt.br -com.br -coop.br -ecn.br -edu.br -eng.br -esp.br -etc.br -eti.br -far.br -flog.br -fm.br -fnd.br -fot.br -fst.br -g12.br -ggf.br -gov.br -imb.br -ind.br -inf.br -jor.br -jus.br -lel.br -mat.br -med.br -mil.br -mus.br -net.br -nom.br -not.br -ntr.br -odo.br -org.br -ppg.br -pro.br -psc.br -psi.br -qsl.br -rec.br -slg.br -srv.br -tmp.br -trd.br -tur.br -tv.br -vet.br -vlog.br -wiki.br -zlg.br - -// bs : http://www.nic.bs/rules.html -bs -com.bs -net.bs -org.bs -edu.bs -gov.bs - -// bt : http://en.wikipedia.org/wiki/.bt -*.bt - -// bv : No registrations at this time. -// Submitted by registry <jarle@uninett.no> 2006-06-16 - -// bw : http://en.wikipedia.org/wiki/.bw -// http://www.gobin.info/domainname/bw.doc -// list of other 2nd level tlds ? -bw -co.bw -org.bw - -// by : http://en.wikipedia.org/wiki/.by -// http://tld.by/rules_2006_en.html -// list of other 2nd level tlds ? -by -gov.by -mil.by -// Official information does not indicate that com.by is a reserved -// second-level domain, but it's being used as one (see www.google.com.by and -// www.yahoo.com.by, for example), so we list it here for safety's sake. -com.by - -// http://hoster.by/ -of.by - -// bz : http://en.wikipedia.org/wiki/.bz -// http://www.belizenic.bz/ -bz -com.bz -net.bz -org.bz -edu.bz -gov.bz - -// ca : http://en.wikipedia.org/wiki/.ca -ca -// ca geographical names -ab.ca -bc.ca -mb.ca -nb.ca -nf.ca -nl.ca -ns.ca -nt.ca -nu.ca -on.ca -pe.ca -qc.ca -sk.ca -yk.ca -// gc.ca: http://en.wikipedia.org/wiki/.gc.ca -// see also: http://registry.gc.ca/en/SubdomainFAQ -gc.ca - -// cat : http://en.wikipedia.org/wiki/.cat -cat - -// cc : http://en.wikipedia.org/wiki/.cc -cc - -// cd : http://en.wikipedia.org/wiki/.cd -// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 -cd -gov.cd - -// cf : http://en.wikipedia.org/wiki/.cf -cf - -// cg : http://en.wikipedia.org/wiki/.cg -cg - -// ch : http://en.wikipedia.org/wiki/.ch -ch - -// ci : http://en.wikipedia.org/wiki/.ci -// http://www.nic.ci/index.php?page=charte -ci -org.ci -or.ci -com.ci -co.ci -edu.ci -ed.ci -ac.ci -net.ci -go.ci -asso.ci -aéroport.ci -int.ci -presse.ci -md.ci -gouv.ci - -// ck : http://en.wikipedia.org/wiki/.ck -*.ck - -// cl : http://en.wikipedia.org/wiki/.cl -cl -gov.cl -gob.cl - -// cm : http://en.wikipedia.org/wiki/.cm -cm -gov.cm - -// cn : http://en.wikipedia.org/wiki/.cn -// Submitted by registry <tanyaling@cnnic.cn> 2008-06-11 -cn -ac.cn -com.cn -edu.cn -gov.cn -net.cn -org.cn -mil.cn -公司.cn -网络.cn -網絡.cn -// cn geographic names -ah.cn -bj.cn -cq.cn -fj.cn -gd.cn -gs.cn -gz.cn -gx.cn -ha.cn -hb.cn -he.cn -hi.cn -hl.cn -hn.cn -jl.cn -js.cn -jx.cn -ln.cn -nm.cn -nx.cn -qh.cn -sc.cn -sd.cn -sh.cn -sn.cn -sx.cn -tj.cn -xj.cn -xz.cn -yn.cn -zj.cn -hk.cn -mo.cn -tw.cn - -// co : http://en.wikipedia.org/wiki/.co -// Submitted by registry <tecnico@uniandes.edu.co> 2008-06-11 -co -arts.co -com.co -edu.co -firm.co -gov.co -info.co -int.co -mil.co -net.co -nom.co -org.co -rec.co -web.co - -// com : http://en.wikipedia.org/wiki/.com -com - -// CentralNic names : http://www.centralnic.com/names/domains -// Confirmed by registry <gavin.brown@centralnic.com> 2008-06-09 -ar.com -br.com -cn.com -de.com -eu.com -gb.com -hu.com -jpn.com -kr.com -no.com -qc.com -ru.com -sa.com -se.com -uk.com -us.com -uy.com -za.com - -// Requested by Yngve Pettersen <yngve@opera.com> 2009-11-26 -operaunite.com - -// coop : http://en.wikipedia.org/wiki/.coop -coop - -// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do -cr -ac.cr -co.cr -ed.cr -fi.cr -go.cr -or.cr -sa.cr - -// cu : http://en.wikipedia.org/wiki/.cu -cu -com.cu -edu.cu -org.cu -net.cu -gov.cu -inf.cu - -// cv : http://en.wikipedia.org/wiki/.cv -cv - -// cx : http://en.wikipedia.org/wiki/.cx -// list of other 2nd level tlds ? -cx -gov.cx - -// cy : http://en.wikipedia.org/wiki/.cy -*.cy - -// cz : http://en.wikipedia.org/wiki/.cz -cz - -// de : http://en.wikipedia.org/wiki/.de -// Confirmed by registry <ops@denic.de> (with technical -// reservations) 2008-07-01 -de - -// dj : http://en.wikipedia.org/wiki/.dj -dj - -// dk : http://en.wikipedia.org/wiki/.dk -// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17 -dk - -// dm : http://en.wikipedia.org/wiki/.dm -dm -com.dm -net.dm -org.dm -edu.dm -gov.dm - -// do : http://en.wikipedia.org/wiki/.do -*.do - -// dz : http://en.wikipedia.org/wiki/.dz -dz -com.dz -org.dz -net.dz -gov.dz -edu.dz -asso.dz -pol.dz -art.dz - -// ec : http://www.nic.ec/reg/paso1.asp -// Submitted by registry <vabboud@nic.ec> 2008-07-04 -ec -com.ec -info.ec -net.ec -fin.ec -k12.ec -med.ec -pro.ec -org.ec -edu.ec -gov.ec -mil.ec - -// edu : http://en.wikipedia.org/wiki/.edu -edu - -// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B -ee -edu.ee -gov.ee -riik.ee -lib.ee -med.ee -com.ee -pri.ee -aip.ee -org.ee -fie.ee - -// eg : http://en.wikipedia.org/wiki/.eg -*.eg - -// er : http://en.wikipedia.org/wiki/.er -*.er - -// es : https://www.nic.es/site_ingles/ingles/dominios/index.html -es -com.es -nom.es -org.es -gob.es -edu.es - -// et : http://en.wikipedia.org/wiki/.et -*.et - -// eu : http://en.wikipedia.org/wiki/.eu -eu - -// fi : http://en.wikipedia.org/wiki/.fi -fi -// aland.fi : http://en.wikipedia.org/wiki/.ax -// This domain is being phased out in favor of .ax. As there are still many -// domains under aland.fi, we still keep it on the list until aland.fi is -// completely removed. -// TODO: Check for updates (expected to be phased out around Q1/2009) -aland.fi -// iki.fi : Submitted by Hannu Aronsson <haa@iki.fi> 2009-11-05 -iki.fi - -// fj : http://en.wikipedia.org/wiki/.fj -*.fj - -// fk : http://en.wikipedia.org/wiki/.fk -*.fk - -// fm : http://en.wikipedia.org/wiki/.fm -fm - -// fo : http://en.wikipedia.org/wiki/.fo -fo - -// fr : http://www.afnic.fr/ -// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs -fr -com.fr -asso.fr -nom.fr -prd.fr -presse.fr -tm.fr -// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels -aeroport.fr -assedic.fr -avocat.fr -avoues.fr -cci.fr -chambagri.fr -chirurgiens-dentistes.fr -experts-comptables.fr -geometre-expert.fr -gouv.fr -greta.fr -huissier-justice.fr -medecin.fr -notaires.fr -pharmacien.fr -port.fr -veterinaire.fr - -// ga : http://en.wikipedia.org/wiki/.ga -ga - -// gb : This registry is effectively dormant -// Submitted by registry <Damien.Shaw@ja.net> 2008-06-12 - -// gd : http://en.wikipedia.org/wiki/.gd -gd - -// ge : http://www.nic.net.ge/policy_en.pdf -ge -com.ge -edu.ge -gov.ge -org.ge -mil.ge -net.ge -pvt.ge - -// gf : http://en.wikipedia.org/wiki/.gf -gf - -// gg : http://www.channelisles.net/applic/avextn.shtml -gg -co.gg -org.gg -net.gg -sch.gg -gov.gg - -// gh : http://en.wikipedia.org/wiki/.gh -// see also: http://www.nic.gh/reg_now.php -// Although domains directly at second level are not possible at the moment, -// they have been possible for some time and may come back. -gh -com.gh -edu.gh -gov.gh -org.gh -mil.gh - -// gi : http://www.nic.gi/rules.html -gi -com.gi -ltd.gi -gov.gi -mod.gi -edu.gi -org.gi - -// gl : http://en.wikipedia.org/wiki/.gl -gl - -// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm -gm - -// gn : http://psg.com/dns/gn/gn.txt -// Submitted by registry <randy@psg.com> 2008-06-17 -ac.gn -com.gn -edu.gn -gov.gn -org.gn -net.gn - -// gov : http://en.wikipedia.org/wiki/.gov -gov - -// gp : http://www.nic.gp/index.php?lang=en -gp -com.gp -net.gp -mobi.gp -edu.gp -org.gp -asso.gp - -// gq : http://en.wikipedia.org/wiki/.gq -gq - -// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html -// Submitted by registry <segred@ics.forth.gr> 2008-06-09 -gr -com.gr -edu.gr -net.gr -org.gr -gov.gr - -// gs : http://en.wikipedia.org/wiki/.gs -gs - -// gt : http://www.gt/politicas.html -*.gt - -// gu : http://gadao.gov.gu/registration.txt -*.gu - -// gw : http://en.wikipedia.org/wiki/.gw -gw - -// gy : http://en.wikipedia.org/wiki/.gy -// http://registry.gy/ -gy -co.gy -com.gy -net.gy - -// hk : https://www.hkdnr.hk -// Submitted by registry <hk.tech@hkirc.hk> 2008-06-11 -hk -com.hk -edu.hk -gov.hk -idv.hk -net.hk -org.hk -公司.hk -教育.hk -敎育.hk -政府.hk -個人.hk -个人.hk -箇人.hk -網络.hk -网络.hk -组織.hk -網絡.hk -网絡.hk -组织.hk -組織.hk -組织.hk - -// hm : http://en.wikipedia.org/wiki/.hm -hm - -// hn : http://www.nic.hn/politicas/ps02,,05.html -hn -com.hn -edu.hn -org.hn -net.hn -mil.hn -gob.hn - -// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf -hr -iz.hr -from.hr -name.hr -com.hr - -// ht : http://www.nic.ht/info/charte.cfm -ht -com.ht -shop.ht -firm.ht -info.ht -adult.ht -net.ht -pro.ht -org.ht -med.ht -art.ht -coop.ht -pol.ht -asso.ht -edu.ht -rel.ht -gouv.ht -perso.ht - -// hu : http://www.domain.hu/domain/English/sld.html -// Confirmed by registry <pasztor@iszt.hu> 2008-06-12 -hu -co.hu -info.hu -org.hu -priv.hu -sport.hu -tm.hu -2000.hu -agrar.hu -bolt.hu -casino.hu -city.hu -erotica.hu -erotika.hu -film.hu -forum.hu -games.hu -hotel.hu -ingatlan.hu -jogasz.hu -konyvelo.hu -lakas.hu -media.hu -news.hu -reklam.hu -sex.hu -shop.hu -suli.hu -szex.hu -tozsde.hu -utazas.hu -video.hu - -// id : http://en.wikipedia.org/wiki/.id -*.id - -// ie : http://en.wikipedia.org/wiki/.ie -ie -gov.ie - -// il : http://en.wikipedia.org/wiki/.il -*.il - -// im : https://www.nic.im/pdfs/imfaqs.pdf -im -co.im -ltd.co.im -plc.co.im -net.im -gov.im -org.im -nic.im -ac.im - -// in : http://en.wikipedia.org/wiki/.in -// see also: http://www.inregistry.in/policies/ -// Please note, that nic.in is not an offical eTLD, but used by most -// government institutions. -in -co.in -firm.in -net.in -org.in -gen.in -ind.in -nic.in -ac.in -edu.in -res.in -gov.in -mil.in - -// info : http://en.wikipedia.org/wiki/.info -info - -// int : http://en.wikipedia.org/wiki/.int -// Confirmed by registry <iana-questions@icann.org> 2008-06-18 -int -eu.int - -// io : http://www.nic.io/rules.html -// list of other 2nd level tlds ? -io -com.io - -// iq : http://www.cmc.iq/english/iq/iqregister1.htm -iq -gov.iq -edu.iq -mil.iq -com.iq -org.iq -net.iq - -// ir : http://www.nic.ir/ascii/Appendix1.htm -ir -ac.ir -co.ir -gov.ir -id.ir -net.ir -org.ir -sch.ir - -// is : http://www.isnic.is/domain/rules.php -// Confirmed by registry <marius@isgate.is> 2008-12-06 -is -net.is -com.is -edu.is -gov.is -org.is -int.is - -// it : http://en.wikipedia.org/wiki/.it -it -gov.it -edu.it -// geo-names found at http://www.nic.it/RA/en/domini/regole/nomi-riservati.pdf -agrigento.it -ag.it -alessandria.it -al.it -ancona.it -an.it -aosta.it -aoste.it -ao.it -arezzo.it -ar.it -ascoli-piceno.it -ascolipiceno.it -ap.it -asti.it -at.it -avellino.it -av.it -bari.it -ba.it -barlettaandriatrani.it -barletta-andria-trani.it -belluno.it -bl.it -benevento.it -bn.it -bergamo.it -bg.it -biella.it -bi.it -bologna.it -bo.it -bolzano.it -bozen.it -balsan.it -alto-adige.it -altoadige.it -suedtirol.it -bz.it -brescia.it -bs.it -brindisi.it -br.it -cagliari.it -ca.it -caltanissetta.it -cl.it -campobasso.it -cb.it -caserta.it -ce.it -catania.it -ct.it -catanzaro.it -cz.it -chieti.it -ch.it -como.it -co.it -cosenza.it -cs.it -cremona.it -cr.it -crotone.it -kr.it -cuneo.it -cn.it -enna.it -en.it -fermo.it -ferrara.it -fe.it -firenze.it -florence.it -fi.it -foggia.it -fg.it -forli-cesena.it -forlicesena.it -fc.it -frosinone.it -fr.it -genova.it -genoa.it -ge.it -gorizia.it -go.it -grosseto.it -gr.it -imperia.it -im.it -isernia.it -is.it -laquila.it -aquila.it -aq.it -la-spezia.it -laspezia.it -sp.it -latina.it -lt.it -lecce.it -le.it -lecco.it -lc.it -livorno.it -li.it -lodi.it -lo.it -lucca.it -lu.it -macerata.it -mc.it -mantova.it -mn.it -massa-carrara.it -massacarrara.it -ms.it -matera.it -mt.it -messina.it -me.it -milano.it -milan.it -mi.it -modena.it -mo.it -monza.it -napoli.it -naples.it -na.it -novara.it -no.it -nuoro.it -nu.it -oristano.it -or.it -padova.it -padua.it -pd.it -palermo.it -pa.it -parma.it -pr.it -pavia.it -pv.it -perugia.it -pg.it -pescara.it -pe.it -pesaro-urbino.it -pesarourbino.it -pu.it -piacenza.it -pc.it -pisa.it -pi.it -pistoia.it -pt.it -pordenone.it -pn.it -potenza.it -pz.it -prato.it -po.it -ragusa.it -rg.it -ravenna.it -ra.it -reggio-calabria.it -reggiocalabria.it -rc.it -reggio-emilia.it -reggioemilia.it -re.it -rieti.it -ri.it -rimini.it -rn.it -roma.it -rome.it -rm.it -rovigo.it -ro.it -salerno.it -sa.it -sassari.it -ss.it -savona.it -sv.it -siena.it -si.it -siracusa.it -sr.it -sondrio.it -so.it -taranto.it -ta.it -teramo.it -te.it -terni.it -tr.it -torino.it -turin.it -to.it -trapani.it -tp.it -trento.it -trentino.it -tn.it -treviso.it -tv.it -trieste.it -ts.it -udine.it -ud.it -varese.it -va.it -venezia.it -venice.it -ve.it -verbania.it -vb.it -vercelli.it -vc.it -verona.it -vr.it -vibo-valentia.it -vibovalentia.it -vv.it -vicenza.it -vi.it -viterbo.it -vt.it - -// je : http://www.channelisles.net/applic/avextn.shtml -je -co.je -org.je -net.je -sch.je -gov.je - -// jm : http://www.com.jm/register.html -*.jm - -// jo : http://www.dns.jo/Registration_policy.aspx -jo -com.jo -org.jo -net.jo -edu.jo -sch.jo -gov.jo -mil.jo -name.jo - -// jobs : http://en.wikipedia.org/wiki/.jobs -jobs - -// jp : http://en.wikipedia.org/wiki/.jp -// http://jprs.co.jp/en/jpdomain.html -// Submitted by registry <yone@jprs.co.jp> 2008-06-11 -// Updated by registry <yone@jprs.co.jp> 2008-12-04 -jp -// jp organizational type names -ac.jp -ad.jp -co.jp -ed.jp -go.jp -gr.jp -lg.jp -ne.jp -or.jp -// jp geographic type names -// http://jprs.jp/doc/rule/saisoku-1.html -*.aichi.jp -*.akita.jp -*.aomori.jp -*.chiba.jp -*.ehime.jp -*.fukui.jp -*.fukuoka.jp -*.fukushima.jp -*.gifu.jp -*.gunma.jp -*.hiroshima.jp -*.hokkaido.jp -*.hyogo.jp -*.ibaraki.jp -*.ishikawa.jp -*.iwate.jp -*.kagawa.jp -*.kagoshima.jp -*.kanagawa.jp -*.kawasaki.jp -*.kitakyushu.jp -*.kobe.jp -*.kochi.jp -*.kumamoto.jp -*.kyoto.jp -*.mie.jp -*.miyagi.jp -*.miyazaki.jp -*.nagano.jp -*.nagasaki.jp -*.nagoya.jp -*.nara.jp -*.niigata.jp -*.oita.jp -*.okayama.jp -*.okinawa.jp -*.osaka.jp -*.saga.jp -*.saitama.jp -*.sapporo.jp -*.sendai.jp -*.shiga.jp -*.shimane.jp -*.shizuoka.jp -*.tochigi.jp -*.tokushima.jp -*.tokyo.jp -*.tottori.jp -*.toyama.jp -*.wakayama.jp -*.yamagata.jp -*.yamaguchi.jp -*.yamanashi.jp -*.yokohama.jp -!metro.tokyo.jp -!pref.aichi.jp -!pref.akita.jp -!pref.aomori.jp -!pref.chiba.jp -!pref.ehime.jp -!pref.fukui.jp -!pref.fukuoka.jp -!pref.fukushima.jp -!pref.gifu.jp -!pref.gunma.jp -!pref.hiroshima.jp -!pref.hokkaido.jp -!pref.hyogo.jp -!pref.ibaraki.jp -!pref.ishikawa.jp -!pref.iwate.jp -!pref.kagawa.jp -!pref.kagoshima.jp -!pref.kanagawa.jp -!pref.kochi.jp -!pref.kumamoto.jp -!pref.kyoto.jp -!pref.mie.jp -!pref.miyagi.jp -!pref.miyazaki.jp -!pref.nagano.jp -!pref.nagasaki.jp -!pref.nara.jp -!pref.niigata.jp -!pref.oita.jp -!pref.okayama.jp -!pref.okinawa.jp -!pref.osaka.jp -!pref.saga.jp -!pref.saitama.jp -!pref.shiga.jp -!pref.shimane.jp -!pref.shizuoka.jp -!pref.tochigi.jp -!pref.tokushima.jp -!pref.tottori.jp -!pref.toyama.jp -!pref.wakayama.jp -!pref.yamagata.jp -!pref.yamaguchi.jp -!pref.yamanashi.jp -!city.chiba.jp -!city.fukuoka.jp -!city.hiroshima.jp -!city.kawasaki.jp -!city.kitakyushu.jp -!city.kobe.jp -!city.kyoto.jp -!city.nagoya.jp -!city.niigata.jp -!city.okayama.jp -!city.osaka.jp -!city.saitama.jp -!city.sapporo.jp -!city.sendai.jp -!city.shizuoka.jp -!city.yokohama.jp - -// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 -*.ke - -// kg : http://www.domain.kg/dmn_n.html -kg -org.kg -net.kg -com.kg -edu.kg -gov.kg -mil.kg - -// kh : http://www.mptc.gov.kh/dns_registration.htm -*.kh - -// ki : http://www.ki/dns/index.html -ki -edu.ki -biz.ki -net.ki -org.ki -gov.ki -info.ki -com.ki - -// km : http://en.wikipedia.org/wiki/.km -// http://www.domaine.km/documents/charte.doc -km -org.km -nom.km -gov.km -prd.km -tm.km -edu.km -mil.km -ass.km -com.km -// These are only mentioned as proposed suggestions at domaine.km, but -// http://en.wikipedia.org/wiki/.km says they're available for registration: -coop.km -asso.km -presse.km -medecin.km -notaires.km -pharmaciens.km -veterinaire.km -gouv.km - -// kn : http://en.wikipedia.org/wiki/.kn -// http://www.dot.kn/domainRules.html -kn -net.kn -org.kn -edu.kn -gov.kn - -// kr : http://en.wikipedia.org/wiki/.kr -// see also: http://domain.nida.or.kr/eng/registration.jsp -kr -ac.kr -co.kr -es.kr -go.kr -hs.kr -kg.kr -mil.kr -ms.kr -ne.kr -or.kr -pe.kr -re.kr -sc.kr -// kr geographical names -busan.kr -chungbuk.kr -chungnam.kr -daegu.kr -daejeon.kr -gangwon.kr -gwangju.kr -gyeongbuk.kr -gyeonggi.kr -gyeongnam.kr -incheon.kr -jeju.kr -jeonbuk.kr -jeonnam.kr -seoul.kr -ulsan.kr - -// kw : http://en.wikipedia.org/wiki/.kw -*.kw - -// ky : http://www.icta.ky/da_ky_reg_dom.php -// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17 -ky -edu.ky -gov.ky -com.ky -org.ky -net.ky - -// kz : http://en.wikipedia.org/wiki/.kz -// see also: http://www.nic.kz/rules/index.jsp -kz -org.kz -edu.kz -net.kz -gov.kz -mil.kz -com.kz - -// la : http://en.wikipedia.org/wiki/.la -// Submitted by registry <gavin.brown@nic.la> 2008-06-10 -la -int.la -net.la -info.la -edu.la -gov.la -per.la -com.la -org.la -// see http://www.c.la/ -c.la - -// lb : http://en.wikipedia.org/wiki/.lb -// Submitted by registry <randy@psg.com> 2008-06-17 -com.lb -edu.lb -gov.lb -net.lb -org.lb - -// lc : http://en.wikipedia.org/wiki/.lc -// see also: http://www.nic.lc/rules.htm -lc -com.lc -net.lc -co.lc -org.lc -edu.lc -gov.lc - -// li : http://en.wikipedia.org/wiki/.li -li - -// lk : http://www.nic.lk/seclevpr.html -lk -gov.lk -sch.lk -net.lk -int.lk -com.lk -org.lk -edu.lk -ngo.lk -soc.lk -web.lk -ltd.lk -assn.lk -grp.lk -hotel.lk - -// local : http://en.wikipedia.org/wiki/.local -local - -// lr : http://psg.com/dns/lr/lr.txt -// Submitted by registry <randy@psg.com> 2008-06-17 -com.lr -edu.lr -gov.lr -org.lr -net.lr - -// ls : http://en.wikipedia.org/wiki/.ls -ls -co.ls -org.ls - -// lt : http://en.wikipedia.org/wiki/.lt -lt -// gov.lt : http://www.gov.lt/index_en.php -gov.lt - -// lu : http://www.dns.lu/en/ -lu - -// lv : http://www.nic.lv/DNS/En/generic.php -lv -com.lv -edu.lv -gov.lv -org.lv -mil.lv -id.lv -net.lv -asn.lv -conf.lv - -// ly : http://www.nic.ly/regulations.php -ly -com.ly -net.ly -gov.ly -plc.ly -edu.ly -sch.ly -med.ly -org.ly -id.ly - -// ma : http://en.wikipedia.org/wiki/.ma -// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf -ma -co.ma -net.ma -gov.ma -org.ma -ac.ma -press.ma - -// mc : http://www.nic.mc/ -mc -tm.mc -asso.mc - -// md : http://en.wikipedia.org/wiki/.md -md - -// me : http://en.wikipedia.org/wiki/.me -me -co.me -net.me -org.me -edu.me -ac.me -gov.me -its.me -priv.me - -// mg : http://www.nic.mg/tarif.htm -mg -org.mg -nom.mg -gov.mg -prd.mg -tm.mg -edu.mg -mil.mg -com.mg - -// mh : http://en.wikipedia.org/wiki/.mh -mh - -// mil : http://en.wikipedia.org/wiki/.mil -mil - -// mk : http://en.wikipedia.org/wiki/.mk -// see also: http://dns.marnet.net.mk/postapka.php -mk -com.mk -org.mk -net.mk -edu.mk -gov.mk -inf.mk -name.mk - -// ml : http://www.gobin.info/domainname/ml-template.doc -// see also: http://en.wikipedia.org/wiki/.ml -ml -com.ml -edu.ml -gouv.ml -gov.ml -net.ml -org.ml -presse.ml - -// mm : http://en.wikipedia.org/wiki/.mm -*.mm - -// mn : http://en.wikipedia.org/wiki/.mn -mn -gov.mn -edu.mn -org.mn - -// mo : http://www.monic.net.mo/ -mo -com.mo -net.mo -org.mo -edu.mo -gov.mo - -// mobi : http://en.wikipedia.org/wiki/.mobi -mobi - -// mp : http://www.dot.mp/ -// Confirmed by registry <dcamacho@saipan.com> 2008-06-17 -mp - -// mq : http://en.wikipedia.org/wiki/.mq -mq - -// mr : http://en.wikipedia.org/wiki/.mr -mr -gov.mr - -// ms : http://en.wikipedia.org/wiki/.ms -ms - -// mt : https://www.nic.org.mt/dotmt/ -*.mt - -// mu : http://en.wikipedia.org/wiki/.mu -mu -com.mu -net.mu -org.mu -gov.mu -ac.mu -co.mu -or.mu - -// museum : http://about.museum/naming/ -// http://index.museum/ -museum -academy.museum -agriculture.museum -air.museum -airguard.museum -alabama.museum -alaska.museum -amber.museum -ambulance.museum -american.museum -americana.museum -americanantiques.museum -americanart.museum -amsterdam.museum -and.museum -annefrank.museum -anthro.museum -anthropology.museum -antiques.museum -aquarium.museum -arboretum.museum -archaeological.museum -archaeology.museum -architecture.museum -art.museum -artanddesign.museum -artcenter.museum -artdeco.museum -arteducation.museum -artgallery.museum -arts.museum -artsandcrafts.museum -asmatart.museum -assassination.museum -assisi.museum -association.museum -astronomy.museum -atlanta.museum -austin.museum -australia.museum -automotive.museum -aviation.museum -axis.museum -badajoz.museum -baghdad.museum -bahn.museum -bale.museum -baltimore.museum -barcelona.museum -baseball.museum -basel.museum -baths.museum -bauern.museum -beauxarts.museum -beeldengeluid.museum -bellevue.museum -bergbau.museum -berkeley.museum -berlin.museum -bern.museum -bible.museum -bilbao.museum -bill.museum -birdart.museum -birthplace.museum -bonn.museum -boston.museum -botanical.museum -botanicalgarden.museum -botanicgarden.museum -botany.museum -brandywinevalley.museum -brasil.museum -bristol.museum -british.museum -britishcolumbia.museum -broadcast.museum -brunel.museum -brussel.museum -brussels.museum -bruxelles.museum -building.museum -burghof.museum -bus.museum -bushey.museum -cadaques.museum -california.museum -cambridge.museum -can.museum -canada.museum -capebreton.museum -carrier.museum -cartoonart.museum -casadelamoneda.museum -castle.museum -castres.museum -celtic.museum -center.museum -chattanooga.museum -cheltenham.museum -chesapeakebay.museum -chicago.museum -children.museum -childrens.museum -childrensgarden.museum -chiropractic.museum -chocolate.museum -christiansburg.museum -cincinnati.museum -cinema.museum -circus.museum -civilisation.museum -civilization.museum -civilwar.museum -clinton.museum -clock.museum -coal.museum -coastaldefence.museum -cody.museum -coldwar.museum -collection.museum -colonialwilliamsburg.museum -coloradoplateau.museum -columbia.museum -columbus.museum -communication.museum -communications.museum -community.museum -computer.museum -computerhistory.museum -comunicações.museum -contemporary.museum -contemporaryart.museum -convent.museum -copenhagen.museum -corporation.museum -correios-e-telecomunicações.museum -corvette.museum -costume.museum -countryestate.museum -county.museum -crafts.museum -cranbrook.museum -creation.museum -cultural.museum -culturalcenter.museum -culture.museum -cyber.museum -cymru.museum -dali.museum -dallas.museum -database.museum -ddr.museum -decorativearts.museum -delaware.museum -delmenhorst.museum -denmark.museum -depot.museum -design.museum -detroit.museum -dinosaur.museum -discovery.museum -dolls.museum -donostia.museum -durham.museum -eastafrica.museum -eastcoast.museum -education.museum -educational.museum -egyptian.museum -eisenbahn.museum -elburg.museum -elvendrell.museum -embroidery.museum -encyclopedic.museum -england.museum -entomology.museum -environment.museum -environmentalconservation.museum -epilepsy.museum -essex.museum -estate.museum -ethnology.museum -exeter.museum -exhibition.museum -family.museum -farm.museum -farmequipment.museum -farmers.museum -farmstead.museum -field.museum -figueres.museum -filatelia.museum -film.museum -fineart.museum -finearts.museum -finland.museum -flanders.museum -florida.museum -force.museum -fortmissoula.museum -fortworth.museum -foundation.museum -francaise.museum -frankfurt.museum -franziskaner.museum -freemasonry.museum -freiburg.museum -fribourg.museum -frog.museum -fundacio.museum -furniture.museum -gallery.museum -garden.museum -gateway.museum -geelvinck.museum -gemological.museum -geology.museum -georgia.museum -giessen.museum -glas.museum -glass.museum -gorge.museum -grandrapids.museum -graz.museum -guernsey.museum -halloffame.museum -hamburg.museum -handson.museum -harvestcelebration.museum -hawaii.museum -health.museum -heimatunduhren.museum -hellas.museum -helsinki.museum -hembygdsforbund.museum -heritage.museum -histoire.museum -historical.museum -historicalsociety.museum -historichouses.museum -historisch.museum -historisches.museum -history.museum -historyofscience.museum -horology.museum -house.museum -humanities.museum -illustration.museum -imageandsound.museum -indian.museum -indiana.museum -indianapolis.museum -indianmarket.museum -intelligence.museum -interactive.museum -iraq.museum -iron.museum -isleofman.museum -jamison.museum -jefferson.museum -jerusalem.museum -jewelry.museum -jewish.museum -jewishart.museum -jfk.museum -journalism.museum -judaica.museum -judygarland.museum -juedisches.museum -juif.museum -karate.museum -karikatur.museum -kids.museum -koebenhavn.museum -koeln.museum -kunst.museum -kunstsammlung.museum -kunstunddesign.museum -labor.museum -labour.museum -lajolla.museum -lancashire.museum -landes.museum -lans.museum -läns.museum -larsson.museum -lewismiller.museum -lincoln.museum -linz.museum -living.museum -livinghistory.museum -localhistory.museum -london.museum -losangeles.museum -louvre.museum -loyalist.museum -lucerne.museum -luxembourg.museum -luzern.museum -mad.museum -madrid.museum -mallorca.museum -manchester.museum -mansion.museum -mansions.museum -manx.museum -marburg.museum -maritime.museum -maritimo.museum -maryland.museum -marylhurst.museum -media.museum -medical.museum -medizinhistorisches.museum -meeres.museum -memorial.museum -mesaverde.museum -michigan.museum -midatlantic.museum -military.museum -mill.museum -miners.museum -mining.museum -minnesota.museum -missile.museum -missoula.museum -modern.museum -moma.museum -money.museum -monmouth.museum -monticello.museum -montreal.museum -moscow.museum -motorcycle.museum -muenchen.museum -muenster.museum -mulhouse.museum -muncie.museum -museet.museum -museumcenter.museum -museumvereniging.museum -music.museum -national.museum -nationalfirearms.museum -nationalheritage.museum -nativeamerican.museum -naturalhistory.museum -naturalhistorymuseum.museum -naturalsciences.museum -nature.museum -naturhistorisches.museum -natuurwetenschappen.museum -naumburg.museum -naval.museum -nebraska.museum -neues.museum -newhampshire.museum -newjersey.museum -newmexico.museum -newport.museum -newspaper.museum -newyork.museum -niepce.museum -norfolk.museum -north.museum -nrw.museum -nuernberg.museum -nuremberg.museum -nyc.museum -nyny.museum -oceanographic.museum -oceanographique.museum -omaha.museum -online.museum -ontario.museum -openair.museum -oregon.museum -oregontrail.museum -otago.museum -oxford.museum -pacific.museum -paderborn.museum -palace.museum -paleo.museum -palmsprings.museum -panama.museum -paris.museum -pasadena.museum -pharmacy.museum -philadelphia.museum -philadelphiaarea.museum -philately.museum -phoenix.museum -photography.museum -pilots.museum -pittsburgh.museum -planetarium.museum -plantation.museum -plants.museum -plaza.museum -portal.museum -portland.museum -portlligat.museum -posts-and-telecommunications.museum -preservation.museum -presidio.museum -press.museum -project.museum -public.museum -pubol.museum -quebec.museum -railroad.museum -railway.museum -research.museum -resistance.museum -riodejaneiro.museum -rochester.museum -rockart.museum -roma.museum -russia.museum -saintlouis.museum -salem.museum -salvadordali.museum -salzburg.museum -sandiego.museum -sanfrancisco.museum -santabarbara.museum -santacruz.museum -santafe.museum -saskatchewan.museum -satx.museum -savannahga.museum -schlesisches.museum -schoenbrunn.museum -schokoladen.museum -school.museum -schweiz.museum -science.museum -scienceandhistory.museum -scienceandindustry.museum -sciencecenter.museum -sciencecenters.museum -science-fiction.museum -sciencehistory.museum -sciences.museum -sciencesnaturelles.museum -scotland.museum -seaport.museum -settlement.museum -settlers.museum -shell.museum -sherbrooke.museum -sibenik.museum -silk.museum -ski.museum -skole.museum -society.museum -sologne.museum -soundandvision.museum -southcarolina.museum -southwest.museum -space.museum -spy.museum -square.museum -stadt.museum -stalbans.museum -starnberg.museum -state.museum -stateofdelaware.museum -station.museum -steam.museum -steiermark.museum -stjohn.museum -stockholm.museum -stpetersburg.museum -stuttgart.museum -suisse.museum -surgeonshall.museum -surrey.museum -svizzera.museum -sweden.museum -sydney.museum -tank.museum -tcm.museum -technology.museum -telekommunikation.museum -television.museum -texas.museum -textile.museum -theater.museum -time.museum -timekeeping.museum -topology.museum -torino.museum -touch.museum -town.museum -transport.museum -tree.museum -trolley.museum -trust.museum -trustee.museum -uhren.museum -ulm.museum -undersea.museum -university.museum -usa.museum -usantiques.museum -usarts.museum -uscountryestate.museum -usculture.museum -usdecorativearts.museum -usgarden.museum -ushistory.museum -ushuaia.museum -uslivinghistory.museum -utah.museum -uvic.museum -valley.museum -vantaa.museum -versailles.museum -viking.museum -village.museum -virginia.museum -virtual.museum -virtuel.museum -vlaanderen.museum -volkenkunde.museum -wales.museum -wallonie.museum -war.museum -washingtondc.museum -watchandclock.museum -watch-and-clock.museum -western.museum -westfalen.museum -whaling.museum -wildlife.museum -williamsburg.museum -windmill.museum -workshop.museum -york.museum -yorkshire.museum -yosemite.museum -youth.museum -zoological.museum -zoology.museum -ירושלים.museum -иком.museum - -// mv : http://en.wikipedia.org/wiki/.mv -// "mv" included because, contra Wikipedia, google.mv exists. -mv -aero.mv -biz.mv -com.mv -coop.mv -edu.mv -gov.mv -info.mv -int.mv -mil.mv -museum.mv -name.mv -net.mv -org.mv -pro.mv - -// mw : http://www.registrar.mw/ -mw -ac.mw -biz.mw -co.mw -com.mw -coop.mw -edu.mw -gov.mw -int.mw -museum.mw -net.mw -org.mw - -// mx : http://www.nic.mx/ -// Submitted by registry <farias@nic.mx> 2008-06-19 -mx -com.mx -org.mx -gob.mx -edu.mx -net.mx - -// my : http://www.mynic.net.my/ -my -com.my -net.my -org.my -gov.my -edu.my -mil.my -name.my - -// mz : http://www.gobin.info/domainname/mz-template.doc -*.mz - -// na : http://www.na-nic.com.na/ -// http://www.info.na/domain/ -na -info.na -pro.na -name.na -school.na -or.na -dr.na -us.na -mx.na -ca.na -in.na -cc.na -tv.na -ws.na -mobi.na -co.na -com.na -org.na - -// name : has 2nd-level tlds, but there's no list of them -name - -// nc : http://www.cctld.nc/ -nc -asso.nc - -// ne : http://en.wikipedia.org/wiki/.ne -ne - -// net : http://en.wikipedia.org/wiki/.net -net - -// CentralNic names : http://www.centralnic.com/names/domains -// Submitted by registry <gavin.brown@centralnic.com> 2008-06-17 -gb.net -se.net -uk.net - -// ZaNiC names : http://www.za.net/ -// Confirmed by registry <hostmaster@nic.za.net> 2009-10-03 -za.net - -// nf : http://en.wikipedia.org/wiki/.nf -nf -com.nf -net.nf -per.nf -rec.nf -web.nf -arts.nf -firm.nf -info.nf -other.nf -store.nf - -// ng : http://psg.com/dns/ng/ -// Submitted by registry <randy@psg.com> 2008-06-17 -ac.ng -com.ng -edu.ng -gov.ng -net.ng -org.ng - -// ni : http://www.nic.ni/dominios.htm -*.ni - -// nl : http://www.domain-registry.nl/ace.php/c,728,122,,,,Home.html -// Confirmed by registry <Antoin.Verschuren@sidn.nl> (with technical -// reservations) 2008-06-08 -nl - -// no : http://www.norid.no/regelverk/index.en.html -// The Norwegian registry has declined to notify us of updates. The web pages -// referenced below are the official source of the data. There is also an -// announce mailing list: -// https://postlister.uninett.no/sympa/info/norid-diskusjon -no -// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html -fhs.no -vgs.no -fylkesbibl.no -folkebibl.no -museum.no -idrett.no -priv.no -// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html -mil.no -stat.no -dep.no -kommune.no -herad.no -// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html -// counties -aa.no -ah.no -bu.no -fm.no -hl.no -hm.no -jan-mayen.no -mr.no -nl.no -nt.no -of.no -ol.no -oslo.no -rl.no -sf.no -st.no -svalbard.no -tm.no -tr.no -va.no -vf.no -// primary and lower secondary schools per county -gs.aa.no -gs.ah.no -gs.bu.no -gs.fm.no -gs.hl.no -gs.hm.no -gs.jan-mayen.no -gs.mr.no -gs.nl.no -gs.nt.no -gs.of.no -gs.ol.no -gs.oslo.no -gs.rl.no -gs.sf.no -gs.st.no -gs.svalbard.no -gs.tm.no -gs.tr.no -gs.va.no -gs.vf.no -// cities -akrehamn.no -åkrehamn.no -algard.no -ålgård.no -arna.no -brumunddal.no -bryne.no -bronnoysund.no -brønnøysund.no -drobak.no -drøbak.no -egersund.no -fetsund.no -floro.no -florø.no -fredrikstad.no -hokksund.no -honefoss.no -hønefoss.no -jessheim.no -jorpeland.no -jørpeland.no -kirkenes.no -kopervik.no -krokstadelva.no -langevag.no -langevåg.no -leirvik.no -mjondalen.no -mjøndalen.no -mo-i-rana.no -mosjoen.no -mosjøen.no -nesoddtangen.no -orkanger.no -osoyro.no -osøyro.no -raholt.no -råholt.no -sandnessjoen.no -sandnessjøen.no -skedsmokorset.no -slattum.no -spjelkavik.no -stathelle.no -stavern.no -stjordalshalsen.no -stjørdalshalsen.no -tananger.no -tranby.no -vossevangen.no -// communities -afjord.no -åfjord.no -agdenes.no -al.no -ål.no -alesund.no -ålesund.no -alstahaug.no -alta.no -áltá.no -alaheadju.no -álaheadju.no -alvdal.no -amli.no -åmli.no -amot.no -åmot.no -andebu.no -andoy.no -andøy.no -andasuolo.no -ardal.no -årdal.no -aremark.no -arendal.no -ås.no -aseral.no -åseral.no -asker.no -askim.no -askvoll.no -askoy.no -askøy.no -asnes.no -åsnes.no -audnedaln.no -aukra.no -aure.no -aurland.no -aurskog-holand.no -aurskog-høland.no -austevoll.no -austrheim.no -averoy.no -averøy.no -balestrand.no -ballangen.no -balat.no -bálát.no -balsfjord.no -bahccavuotna.no -báhccavuotna.no -bamble.no -bardu.no -beardu.no -beiarn.no -bajddar.no -bájddar.no -baidar.no -báidár.no -berg.no -bergen.no -berlevag.no -berlevåg.no -bearalvahki.no -bearalváhki.no -bindal.no -birkenes.no -bjarkoy.no -bjarkøy.no -bjerkreim.no -bjugn.no -bodo.no -bodø.no -badaddja.no -bådåddjå.no -budejju.no -bokn.no -bremanger.no -bronnoy.no -brønnøy.no -bygland.no -bykle.no -barum.no -bærum.no -bo.telemark.no -bø.telemark.no -bo.nordland.no -bø.nordland.no -bievat.no -bievát.no -bomlo.no -bømlo.no -batsfjord.no -båtsfjord.no -bahcavuotna.no -báhcavuotna.no -dovre.no -drammen.no -drangedal.no -dyroy.no -dyrøy.no -donna.no -dønna.no -eid.no -eidfjord.no -eidsberg.no -eidskog.no -eidsvoll.no -eigersund.no -elverum.no -enebakk.no -engerdal.no -etne.no -etnedal.no -evenes.no -evenassi.no -evenášši.no -evje-og-hornnes.no -farsund.no -fauske.no -fuossko.no -fuoisku.no -fedje.no -fet.no -finnoy.no -finnøy.no -fitjar.no -fjaler.no -fjell.no -flakstad.no -flatanger.no -flekkefjord.no -flesberg.no -flora.no -fla.no -flå.no -folldal.no -forsand.no -fosnes.no -frei.no -frogn.no -froland.no -frosta.no -frana.no -fræna.no -froya.no -frøya.no -fusa.no -fyresdal.no -forde.no -førde.no -gamvik.no -gangaviika.no -gáŋgaviika.no -gaular.no -gausdal.no -gildeskal.no -gildeskål.no -giske.no -gjemnes.no -gjerdrum.no -gjerstad.no -gjesdal.no -gjovik.no -gjøvik.no -gloppen.no -gol.no -gran.no -grane.no -granvin.no -gratangen.no -grimstad.no -grong.no -kraanghke.no -kråanghke.no -grue.no -gulen.no -hadsel.no -halden.no -halsa.no -hamar.no -hamaroy.no -habmer.no -hábmer.no -hapmir.no -hápmir.no -hammerfest.no -hammarfeasta.no -hámmárfeasta.no -haram.no -hareid.no -harstad.no -hasvik.no -aknoluokta.no -ákŋoluokta.no -hattfjelldal.no -aarborte.no -haugesund.no -hemne.no -hemnes.no -hemsedal.no -heroy.more-og-romsdal.no -herøy.møre-og-romsdal.no -heroy.nordland.no -herøy.nordland.no -hitra.no -hjartdal.no -hjelmeland.no -hobol.no -hobøl.no -hof.no -hol.no -hole.no -holmestrand.no -holtalen.no -holtålen.no -hornindal.no -horten.no -hurdal.no -hurum.no -hvaler.no -hyllestad.no -hagebostad.no -hægebostad.no -hoyanger.no -høyanger.no -hoylandet.no -høylandet.no -ha.no -hå.no -ibestad.no -inderoy.no -inderøy.no -iveland.no -jevnaker.no -jondal.no -jolster.no -jølster.no -karasjok.no -karasjohka.no -kárášjohka.no -karlsoy.no -galsa.no -gálsá.no -karmoy.no -karmøy.no -kautokeino.no -guovdageaidnu.no -klepp.no -klabu.no -klæbu.no -kongsberg.no -kongsvinger.no -kragero.no -kragerø.no -kristiansand.no -kristiansund.no -krodsherad.no -krødsherad.no -kvalsund.no -rahkkeravju.no -ráhkkerávju.no -kvam.no -kvinesdal.no -kvinnherad.no -kviteseid.no -kvitsoy.no -kvitsøy.no -kvafjord.no -kvæfjord.no -giehtavuoatna.no -kvanangen.no -kvænangen.no -navuotna.no -návuotna.no -kafjord.no -kåfjord.no -gaivuotna.no -gáivuotna.no -larvik.no -lavangen.no -lavagis.no -loabat.no -loabát.no -lebesby.no -davvesiida.no -leikanger.no -leirfjord.no -leka.no -leksvik.no -lenvik.no -leangaviika.no -leaŋgaviika.no -lesja.no -levanger.no -lier.no -lierne.no -lillehammer.no -lillesand.no -lindesnes.no -lindas.no -lindås.no -lom.no -loppa.no -lahppi.no -láhppi.no -lund.no -lunner.no -luroy.no -lurøy.no -luster.no -lyngdal.no -lyngen.no -ivgu.no -lardal.no -lerdal.no -lærdal.no -lodingen.no -lødingen.no -lorenskog.no -lørenskog.no -loten.no -løten.no -malvik.no -masoy.no -måsøy.no -muosat.no -muosát.no -mandal.no -marker.no -marnardal.no -masfjorden.no -meland.no -meldal.no -melhus.no -meloy.no -meløy.no -meraker.no -meråker.no -moareke.no -moåreke.no -midsund.no -midtre-gauldal.no -modalen.no -modum.no -molde.no -moskenes.no -moss.no -mosvik.no -malselv.no -målselv.no -malatvuopmi.no -málatvuopmi.no -namdalseid.no -aejrie.no -namsos.no -namsskogan.no -naamesjevuemie.no -nååmesjevuemie.no -laakesvuemie.no -nannestad.no -narvik.no -narviika.no -naustdal.no -nedre-eiker.no -nes.akershus.no -nes.buskerud.no -nesna.no -nesodden.no -nesseby.no -unjarga.no -unjárga.no -nesset.no -nissedal.no -nittedal.no -nord-aurdal.no -nord-fron.no -nord-odal.no -norddal.no -nordkapp.no -davvenjarga.no -davvenjárga.no -nordre-land.no -nordreisa.no -raisa.no -ráisa.no -nore-og-uvdal.no -notodden.no -naroy.no -nærøy.no -notteroy.no -nøtterøy.no -odda.no -oksnes.no -øksnes.no -oppdal.no -oppegard.no -oppegård.no -orkdal.no -orland.no -ørland.no -orskog.no -ørskog.no -orsta.no -ørsta.no -os.hedmark.no -os.hordaland.no -osen.no -osteroy.no -osterøy.no -ostre-toten.no -østre-toten.no -overhalla.no -ovre-eiker.no -øvre-eiker.no -oyer.no -øyer.no -oygarden.no -øygarden.no -oystre-slidre.no -øystre-slidre.no -porsanger.no -porsangu.no -porsáŋgu.no -porsgrunn.no -radoy.no -radøy.no -rakkestad.no -rana.no -ruovat.no -randaberg.no -rauma.no -rendalen.no -rennebu.no -rennesoy.no -rennesøy.no -rindal.no -ringebu.no -ringerike.no -ringsaker.no -rissa.no -risor.no -risør.no -roan.no -rollag.no -rygge.no -ralingen.no -rælingen.no -rodoy.no -rødøy.no -romskog.no -rømskog.no -roros.no -røros.no -rost.no -røst.no -royken.no -røyken.no -royrvik.no -røyrvik.no -rade.no -råde.no -salangen.no -siellak.no -saltdal.no -salat.no -sálát.no -sálat.no -samnanger.no -sande.more-og-romsdal.no -sande.møre-og-romsdal.no -sande.vestfold.no -sandefjord.no -sandnes.no -sandoy.no -sandøy.no -sarpsborg.no -sauda.no -sauherad.no -sel.no -selbu.no -selje.no -seljord.no -sigdal.no -siljan.no -sirdal.no -skaun.no -skedsmo.no -ski.no -skien.no -skiptvet.no -skjervoy.no -skjervøy.no -skierva.no -skiervá.no -skjak.no -skjåk.no -skodje.no -skanland.no -skånland.no -skanit.no -skánit.no -smola.no -smøla.no -snillfjord.no -snasa.no -snåsa.no -snoasa.no -snaase.no -snåase.no -sogndal.no -sokndal.no -sola.no -solund.no -songdalen.no -sortland.no -spydeberg.no -stange.no -stavanger.no -steigen.no -steinkjer.no -stjordal.no -stjørdal.no -stokke.no -stor-elvdal.no -stord.no -stordal.no -storfjord.no -omasvuotna.no -strand.no -stranda.no -stryn.no -sula.no -suldal.no -sund.no -sunndal.no -surnadal.no -sveio.no -svelvik.no -sykkylven.no -sogne.no -søgne.no -somna.no -sømna.no -sondre-land.no -søndre-land.no -sor-aurdal.no -sør-aurdal.no -sor-fron.no -sør-fron.no -sor-odal.no -sør-odal.no -sor-varanger.no -sør-varanger.no -matta-varjjat.no -mátta-várjjat.no -sorfold.no -sørfold.no -sorreisa.no -sørreisa.no -sorum.no -sørum.no -tana.no -deatnu.no -time.no -tingvoll.no -tinn.no -tjeldsund.no -dielddanuorri.no -tjome.no -tjøme.no -tokke.no -tolga.no -torsken.no -tranoy.no -tranøy.no -tromso.no -tromsø.no -tromsa.no -romsa.no -trondheim.no -troandin.no -trysil.no -trana.no -træna.no -trogstad.no -trøgstad.no -tvedestrand.no -tydal.no -tynset.no -tysfjord.no -divtasvuodna.no -divttasvuotna.no -tysnes.no -tysvar.no -tysvær.no -tonsberg.no -tønsberg.no -ullensaker.no -ullensvang.no -ulvik.no -utsira.no -vadso.no -vadsø.no -cahcesuolo.no -čáhcesuolo.no -vaksdal.no -valle.no -vang.no -vanylven.no -vardo.no -vardø.no -varggat.no -várggát.no -vefsn.no -vaapste.no -vega.no -vegarshei.no -vegårshei.no -vennesla.no -verdal.no -verran.no -vestby.no -vestnes.no -vestre-slidre.no -vestre-toten.no -vestvagoy.no -vestvågøy.no -vevelstad.no -vik.no -vikna.no -vindafjord.no -volda.no -voss.no -varoy.no -værøy.no -vagan.no -vågan.no -voagat.no -vagsoy.no -vågsøy.no -vaga.no -vågå.no -valer.ostfold.no -våler.østfold.no -valer.hedmark.no -våler.hedmark.no - -// np : http://www.mos.com.np/register.html -*.np - -// nr : http://cenpac.net.nr/dns/index.html -// Confirmed by registry <technician@cenpac.net.nr> 2008-06-17 -nr -biz.nr -info.nr -gov.nr -edu.nr -org.nr -net.nr -com.nr - -// nu : http://en.wikipedia.org/wiki/.nu -nu - -// nz : http://en.wikipedia.org/wiki/.nz -*.nz - -// om : http://en.wikipedia.org/wiki/.om -*.om - -// org : http://en.wikipedia.org/wiki/.org -org - -// CentralNic names : http://www.centralnic.com/names/domains -// Submitted by registry <gavin.brown@centralnic.com> 2008-06-17 -ae.org - -// ZaNiC names : http://www.za.net/ -// Confirmed by registry <hostmaster@nic.za.net> 2009-10-03 -za.org - -// pa : http://www.nic.pa/ -// Some additional second level "domains" resolve directly as hostnames, such as -// pannet.pa, so we add a rule for "pa". -pa -ac.pa -gob.pa -com.pa -org.pa -sld.pa -edu.pa -net.pa -ing.pa -abo.pa -med.pa -nom.pa - -// pe : https://www.nic.pe/InformeFinalComision.pdf -pe -edu.pe -gob.pe -nom.pe -mil.pe -org.pe -com.pe -net.pe - -// pf : http://www.gobin.info/domainname/formulaire-pf.pdf -pf -com.pf -org.pf -edu.pf - -// pg : http://en.wikipedia.org/wiki/.pg -*.pg - -// ph : http://www.domains.ph/FAQ2.asp -// Submitted by registry <jed@email.com.ph> 2008-06-13 -ph -com.ph -net.ph -org.ph -gov.ph -edu.ph -ngo.ph -mil.ph -i.ph - -// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK -pk -com.pk -net.pk -edu.pk -org.pk -fam.pk -biz.pk -web.pk -gov.pk -gob.pk -gok.pk -gon.pk -gop.pk -gos.pk -info.pk - -// pl : http://www.dns.pl/english/ -pl -// NASK functional domains (nask.pl / dns.pl) : http://www.dns.pl/english/dns-funk.html -aid.pl -agro.pl -atm.pl -auto.pl -biz.pl -com.pl -edu.pl -gmina.pl -gsm.pl -info.pl -mail.pl -miasta.pl -media.pl -mil.pl -net.pl -nieruchomosci.pl -nom.pl -org.pl -pc.pl -powiat.pl -priv.pl -realestate.pl -rel.pl -sex.pl -shop.pl -sklep.pl -sos.pl -szkola.pl -targi.pl -tm.pl -tourism.pl -travel.pl -turystyka.pl -// ICM functional domains (icm.edu.pl) -6bone.pl -art.pl -mbone.pl -// Government domains (administred by ippt.gov.pl) -gov.pl -uw.gov.pl -um.gov.pl -ug.gov.pl -upow.gov.pl -starostwo.gov.pl -so.gov.pl -sr.gov.pl -po.gov.pl -pa.gov.pl -// other functional domains -ngo.pl -irc.pl -usenet.pl -// NASK geographical domains : http://www.dns.pl/english/dns-regiony.html -augustow.pl -babia-gora.pl -bedzin.pl -beskidy.pl -bialowieza.pl -bialystok.pl -bielawa.pl -bieszczady.pl -boleslawiec.pl -bydgoszcz.pl -bytom.pl -cieszyn.pl -czeladz.pl -czest.pl -dlugoleka.pl -elblag.pl -elk.pl -glogow.pl -gniezno.pl -gorlice.pl -grajewo.pl -ilawa.pl -jaworzno.pl -jelenia-gora.pl -jgora.pl -kalisz.pl -kazimierz-dolny.pl -karpacz.pl -kartuzy.pl -kaszuby.pl -katowice.pl -kepno.pl -ketrzyn.pl -klodzko.pl -kobierzyce.pl -kolobrzeg.pl -konin.pl -konskowola.pl -kutno.pl -lapy.pl -lebork.pl -legnica.pl -lezajsk.pl -limanowa.pl -lomza.pl -lowicz.pl -lubin.pl -lukow.pl -malbork.pl -malopolska.pl -mazowsze.pl -mazury.pl -mielec.pl -mielno.pl -mragowo.pl -naklo.pl -nowaruda.pl -nysa.pl -olawa.pl -olecko.pl -olkusz.pl -olsztyn.pl -opoczno.pl -opole.pl -ostroda.pl -ostroleka.pl -ostrowiec.pl -ostrowwlkp.pl -pila.pl -pisz.pl -podhale.pl -podlasie.pl -polkowice.pl -pomorze.pl -pomorskie.pl -prochowice.pl -pruszkow.pl -przeworsk.pl -pulawy.pl -radom.pl -rawa-maz.pl -rybnik.pl -rzeszow.pl -sanok.pl -sejny.pl -siedlce.pl -slask.pl -slupsk.pl -sosnowiec.pl -stalowa-wola.pl -skoczow.pl -starachowice.pl -stargard.pl -suwalki.pl -swidnica.pl -swiebodzin.pl -swinoujscie.pl -szczecin.pl -szczytno.pl -tarnobrzeg.pl -tgory.pl -turek.pl -tychy.pl -ustka.pl -walbrzych.pl -warmia.pl -warszawa.pl -waw.pl -wegrow.pl -wielun.pl -wlocl.pl -wloclawek.pl -wodzislaw.pl -wolomin.pl -wroclaw.pl -zachpomor.pl -zagan.pl -zarow.pl -zgora.pl -zgorzelec.pl -// TASK geographical domains (www.task.gda.pl/uslugi/dns) -gda.pl -gdansk.pl -gdynia.pl -med.pl -sopot.pl -// other geographical domains -gliwice.pl -krakow.pl -poznan.pl -wroc.pl -zakopane.pl - -// pn : http://www.government.pn/PnRegistry/policies.htm -pn -gov.pn -co.pn -org.pn -edu.pn -net.pn - -// pr : http://www.nic.pr/index.asp?f=1 -pr -com.pr -net.pr -org.pr -gov.pr -edu.pr -isla.pr -pro.pr -biz.pr -info.pr -name.pr -// these aren't mentioned on nic.pr, but on http://en.wikipedia.org/wiki/.pr -est.pr -prof.pr -ac.pr - -// pro : http://www.nic.pro/support_faq.htm -pro -aca.pro -bar.pro -cpa.pro -jur.pro -law.pro -med.pro -eng.pro - -// ps : http://en.wikipedia.org/wiki/.ps -// http://www.nic.ps/registration/policy.html#reg -ps -edu.ps -gov.ps -sec.ps -plo.ps -com.ps -org.ps -net.ps - -// pt : http://online.dns.pt/dns/start_dns -pt -net.pt -gov.pt -org.pt -edu.pt -int.pt -publ.pt -com.pt -nome.pt - -// pw : http://en.wikipedia.org/wiki/.pw -pw -co.pw -ne.pw -or.pw -ed.pw -go.pw -belau.pw - -// py : http://www.nic.py/faq_a.html#faq_b -*.py - -// qa : http://www.qatar.net.qa/services/virtual.htm -*.qa - -// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs -re -com.re -asso.re -nom.re - -// ro : http://www.rotld.ro/ -ro -com.ro -org.ro -tm.ro -nt.ro -nom.ro -info.ro -rec.ro -arts.ro -firm.ro -store.ro -www.ro - -// rs : http://en.wikipedia.org/wiki/.rs -rs -co.rs -org.rs -edu.rs -ac.rs -gov.rs -in.rs - -// ru : http://www.cctld.ru/ru/docs/aktiv_8.php -// Industry domains -ru -ac.ru -com.ru -edu.ru -int.ru -net.ru -org.ru -pp.ru -// Geographical domains -adygeya.ru -altai.ru -amur.ru -arkhangelsk.ru -astrakhan.ru -bashkiria.ru -belgorod.ru -bir.ru -bryansk.ru -buryatia.ru -cbg.ru -chel.ru -chelyabinsk.ru -chita.ru -chukotka.ru -chuvashia.ru -dagestan.ru -dudinka.ru -e-burg.ru -grozny.ru -irkutsk.ru -ivanovo.ru -izhevsk.ru -jar.ru -joshkar-ola.ru -kalmykia.ru -kaluga.ru -kamchatka.ru -karelia.ru -kazan.ru -kchr.ru -kemerovo.ru -khabarovsk.ru -khakassia.ru -khv.ru -kirov.ru -koenig.ru -komi.ru -kostroma.ru -krasnoyarsk.ru -kuban.ru -kurgan.ru -kursk.ru -lipetsk.ru -magadan.ru -mari.ru -mari-el.ru -marine.ru -mordovia.ru -mosreg.ru -msk.ru -murmansk.ru -nalchik.ru -nnov.ru -nov.ru -novosibirsk.ru -nsk.ru -omsk.ru -orenburg.ru -oryol.ru -palana.ru -penza.ru -perm.ru -pskov.ru -ptz.ru -rnd.ru -ryazan.ru -sakhalin.ru -samara.ru -saratov.ru -simbirsk.ru -smolensk.ru -spb.ru -stavropol.ru -stv.ru -surgut.ru -tambov.ru -tatarstan.ru -tom.ru -tomsk.ru -tsaritsyn.ru -tsk.ru -tula.ru -tuva.ru -tver.ru -tyumen.ru -udm.ru -udmurtia.ru -ulan-ude.ru -vladikavkaz.ru -vladimir.ru -vladivostok.ru -volgograd.ru -vologda.ru -voronezh.ru -vrn.ru -vyatka.ru -yakutia.ru -yamal.ru -yaroslavl.ru -yekaterinburg.ru -yuzhno-sakhalinsk.ru -// More geographical domains -amursk.ru -baikal.ru -cmw.ru -fareast.ru -jamal.ru -kms.ru -k-uralsk.ru -kustanai.ru -kuzbass.ru -magnitka.ru -mytis.ru -nakhodka.ru -nkz.ru -norilsk.ru -oskol.ru -pyatigorsk.ru -rubtsovsk.ru -snz.ru -syzran.ru -vdonsk.ru -zgrad.ru -// State domains -gov.ru -mil.ru -// Technical domains -test.ru - -// rw : http://www.nic.rw/cgi-bin/policy.pl -rw -gov.rw -net.rw -edu.rw -ac.rw -com.rw -co.rw -int.rw -mil.rw -gouv.rw - -// sa : http://www.nic.net.sa/ -com.sa -net.sa -org.sa -gov.sa -med.sa -pub.sa -edu.sa -sch.sa - -// sb : http://www.sbnic.net.sb/ -// Submitted by registry <lee.humphries@telekom.com.sb> 2008-06-08 -sb -com.sb -edu.sb -gov.sb -net.sb -org.sb - -// sc : http://www.nic.sc/ -sc -com.sc -gov.sc -net.sc -org.sc -edu.sc - -// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm -// Submitted by registry <admin@isoc.sd> 2008-06-17 -sd -com.sd -net.sd -org.sd -edu.sd -med.sd -gov.sd -info.sd - -// se : http://en.wikipedia.org/wiki/.se -// Submitted by registry <Patrik.Wallstrom@iis.se> 2008-06-24 -se -a.se -ac.se -b.se -bd.se -brand.se -c.se -d.se -e.se -f.se -fh.se -fhsk.se -fhv.se -g.se -h.se -i.se -k.se -komforb.se -kommunalforbund.se -komvux.se -l.se -lanbib.se -m.se -n.se -naturbruksgymn.se -o.se -org.se -p.se -parti.se -pp.se -press.se -r.se -s.se -sshn.se -t.se -tm.se -u.se -w.se -x.se -y.se -z.se - -// sg : http://www.nic.net.sg/sub_policies_agreement/2ld.html -sg -com.sg -net.sg -org.sg -gov.sg -edu.sg -per.sg - -// sh : http://www.nic.sh/rules.html -// list of 2nd level domains ? -sh - -// si : http://en.wikipedia.org/wiki/.si -si - -// sj : No registrations at this time. -// Submitted by registry <jarle@uninett.no> 2008-06-16 - -// sk : http://en.wikipedia.org/wiki/.sk -// list of 2nd level domains ? -sk - -// sl : http://www.nic.sl -// Submitted by registry <adam@neoip.com> 2008-06-12 -sl -com.sl -net.sl -edu.sl -gov.sl -org.sl - -// sm : http://en.wikipedia.org/wiki/.sm -sm - -// sn : http://en.wikipedia.org/wiki/.sn -sn -art.sn -com.sn -edu.sn -gouv.sn -org.sn -perso.sn -univ.sn - -// sr : http://en.wikipedia.org/wiki/.sr -sr - -// st : http://www.nic.st/html/policyrules/ -st -co.st -com.st -consulado.st -edu.st -embaixada.st -gov.st -mil.st -net.st -org.st -principe.st -saotome.st -store.st - -// su : http://en.wikipedia.org/wiki/.su -su - -// sv : http://www.svnet.org.sv/svpolicy.html -*.sv - -// sy : http://en.wikipedia.org/wiki/.sy -// see also: http://www.gobin.info/domainname/sy.doc -sy -edu.sy -gov.sy -net.sy -mil.sy -com.sy -org.sy - -// sz : http://en.wikipedia.org/wiki/.sz -// http://www.sispa.org.sz/ -sz -co.sz -ac.sz -org.sz - -// tc : http://en.wikipedia.org/wiki/.tc -tc - -// td : http://en.wikipedia.org/wiki/.td -td - -// tel: http://en.wikipedia.org/wiki/.tel -// http://www.telnic.org/ -tel - -// tf : http://en.wikipedia.org/wiki/.tf -tf - -// tg : http://en.wikipedia.org/wiki/.tg -// http://www.nic.tg/nictg/index.php implies no reserved 2nd-level domains, -// although this contradicts wikipedia. -tg - -// th : http://en.wikipedia.org/wiki/.th -// Submitted by registry <krit@thains.co.th> 2008-06-17 -th -ac.th -co.th -go.th -in.th -mi.th -net.th -or.th - -// tj : http://www.nic.tj/policy.htm -tj -ac.tj -biz.tj -co.tj -com.tj -edu.tj -go.tj -gov.tj -int.tj -mil.tj -name.tj -net.tj -nic.tj -org.tj -test.tj -web.tj - -// tk : http://en.wikipedia.org/wiki/.tk -tk - -// tl : http://en.wikipedia.org/wiki/.tl -tl -gov.tl - -// tm : http://www.nic.tm/rules.html -// list of 2nd level tlds ? -tm - -// tn : http://en.wikipedia.org/wiki/.tn -// http://whois.ati.tn/ -tn -com.tn -ens.tn -fin.tn -gov.tn -ind.tn -intl.tn -nat.tn -net.tn -org.tn -info.tn -perso.tn -tourism.tn -edunet.tn -rnrt.tn -rns.tn -rnu.tn -mincom.tn -agrinet.tn -defense.tn -turen.tn - -// to : http://en.wikipedia.org/wiki/.to -// Submitted by registry <egullich@colo.to> 2008-06-17 -to -com.to -gov.to -net.to -org.to -edu.to -mil.to - -// tr : http://en.wikipedia.org/wiki/.tr -*.tr - -// travel : http://en.wikipedia.org/wiki/.travel -travel - -// tt : http://www.nic.tt/ -tt -co.tt -com.tt -org.tt -net.tt -biz.tt -info.tt -pro.tt -int.tt -coop.tt -jobs.tt -mobi.tt -travel.tt -museum.tt -aero.tt -name.tt -gov.tt -edu.tt - -// tv : http://en.wikipedia.org/wiki/.tv -// list of other 2nd level tlds ? -tv -com.tv -net.tv -org.tv -gov.tv - -// tw : http://en.wikipedia.org/wiki/.tw -tw -edu.tw -gov.tw -mil.tw -com.tw -net.tw -org.tw -idv.tw -game.tw -ebiz.tw -club.tw -網路.tw -組織.tw -商業.tw - -// tz : http://en.wikipedia.org/wiki/.tz -// Submitted by registry <randy@psg.com> 2008-06-17 -ac.tz -co.tz -go.tz -ne.tz -or.tz - -// ua : http://www.nic.net.ua/ -ua -com.ua -edu.ua -gov.ua -in.ua -net.ua -org.ua -// ua geo-names -cherkassy.ua -chernigov.ua -chernovtsy.ua -ck.ua -cn.ua -crimea.ua -cv.ua -dn.ua -dnepropetrovsk.ua -donetsk.ua -dp.ua -if.ua -ivano-frankivsk.ua -kh.ua -kharkov.ua -kherson.ua -khmelnitskiy.ua -kiev.ua -kirovograd.ua -km.ua -kr.ua -ks.ua -kv.ua -lg.ua -lugansk.ua -lutsk.ua -lviv.ua -mk.ua -nikolaev.ua -od.ua -odessa.ua -pl.ua -poltava.ua -rovno.ua -rv.ua -sebastopol.ua -sumy.ua -te.ua -ternopil.ua -uzhgorod.ua -vinnica.ua -vn.ua -zaporizhzhe.ua -zp.ua -zhitomir.ua -zt.ua - -// ug : http://www.registry.co.ug/ -ug -co.ug -ac.ug -sc.ug -go.ug -ne.ug -or.ug - -// uk : http://en.wikipedia.org/wiki/.uk -*.uk -*.sch.uk -!bl.uk -!british-library.uk -!icnet.uk -!jet.uk -!nel.uk -!nhs.uk -!nls.uk -!national-library-scotland.uk -!parliament.uk - -// us : http://en.wikipedia.org/wiki/.us -us -dni.us -fed.us -isa.us -kids.us -nsn.us -// us geographic names -ak.us -al.us -ar.us -as.us -az.us -ca.us -co.us -ct.us -dc.us -de.us -fl.us -ga.us -gu.us -hi.us -ia.us -id.us -il.us -in.us -ks.us -ky.us -la.us -ma.us -md.us -me.us -mi.us -mn.us -mo.us -ms.us -mt.us -nc.us -nd.us -ne.us -nh.us -nj.us -nm.us -nv.us -ny.us -oh.us -ok.us -or.us -pa.us -pr.us -ri.us -sc.us -sd.us -tn.us -tx.us -ut.us -vi.us -vt.us -va.us -wa.us -wi.us -wv.us -wy.us -// The registrar notes several more specific domains available in each state, -// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat -// haphazard; in some states these domains resolve as addresses, while in others -// only subdomains are avilable, or even nothing at all. - -// uy : http://www.antel.com.uy/ -*.uy - -// uz : http://www.reg.uz/registerr.html -// are there other 2nd level tlds ? -uz -com.uz -co.uz - -// va : http://en.wikipedia.org/wiki/.va -va - -// vc : http://en.wikipedia.org/wiki/.vc -// Submitted by registry <kshah@ca.afilias.info> 2008-06-13 -vc -com.vc -net.vc -org.vc -gov.vc -mil.vc -edu.vc - -// ve : http://registro.nic.ve/nicve/registro/index.html -*.ve - -// vg : http://en.wikipedia.org/wiki/.vg -vg - -// vi : http://www.nic.vi/newdomainform.htm -// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other -// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they -// are available for registration (which they do not seem to be). -vi -co.vi -com.vi -k12.vi -net.vi -org.vi - -// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp -vn -com.vn -net.vn -org.vn -edu.vn -gov.vn -int.vn -ac.vn -biz.vn -info.vn -name.vn -pro.vn -health.vn - -// vu : http://en.wikipedia.org/wiki/.vu -// list of 2nd level tlds ? -vu - -// ws : http://en.wikipedia.org/wiki/.ws -// http://samoanic.ws/index.dhtml -ws -com.ws -net.ws -org.ws -gov.ws -edu.ws - -// ye : http://www.y.net.ye/services/domain_name.htm -*.ye - -// yu : http://www.nic.yu/pravilnik-e.html -*.yu - -// za : http://www.zadna.org.za/slds.html -*.za - -// zm : http://en.wikipedia.org/wiki/.zm -*.zm - -// zw : http://en.wikipedia.org/wiki/.zw -*.zw From 483e0cf96eb249c779672ca81efefdf3478be83f Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Fri, 26 Jan 2024 23:53:41 +0100 Subject: [PATCH 704/710] extremely cheap and barely tested replacement of OpenSubtitles.org with OpenSubtitles.com (needs your own API key) --- Contents/Code/support/config.py | 25 +- Contents/Code/support/tasks.py | 4 +- Contents/DefaultPrefs.json | 14 +- .../Libraries/Shared/subliminal_patch/core.py | 3 + .../providers/opensubtitlescom.py | 579 ++++++++++++++++++ Contents/Libraries/Shared/subzero/language.py | 35 +- 6 files changed, 637 insertions(+), 23 deletions(-) create mode 100644 Contents/Libraries/Shared/subliminal_patch/providers/opensubtitlescom.py diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 632db4cf8..7a4276852 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -86,6 +86,10 @@ def int_or_default(s, default): DownloadLimitExceeded: (datetime.timedelta(hours=6), "6 hours"), APIThrottled: (datetime.timedelta(seconds=15), "15 seconds"), }, + "opensubtitlescom": { + TooManyRequests: (datetime.timedelta(minutes=1), "1 minute"), + DownloadLimitExceeded: (datetime.timedelta(hours=24), "24 hours"), + }, "addic7ed": { DownloadLimitExceeded: (datetime.timedelta(hours=3), "3 hours"), TooManyRequests: (datetime.timedelta(minutes=5), "5 minutes"), @@ -827,7 +831,7 @@ def get_subtitle_formats(self): @property def providers_by_prefs(self): - return {'opensubtitles': cast_bool(Prefs['provider.opensubtitles.enabled']), + return {'opensubtitlescom': cast_bool(Prefs['provider.opensubtitles.enabled']), # 'thesubdb': Prefs['provider.thesubdb.enabled'], 'podnapisi': cast_bool(Prefs['provider.podnapisi.enabled']), 'napisy24': cast_bool(Prefs['provider.napisy24.enabled']), @@ -925,15 +929,18 @@ def get_provider_settings(self): 'password': Prefs['provider.addic7ed.password'], 'is_vip': cast_bool(Prefs['provider.addic7ed.is_vip']), }, - 'opensubtitles': {'username': Prefs['provider.opensubtitles.username'], + 'opensubtitlescom': {'username': Prefs['provider.opensubtitles.username'], 'password': Prefs['provider.opensubtitles.password'], - 'use_tag_search': self.exact_filenames, - 'only_foreign': self.forced_only, - 'also_foreign': self.forced_also, - 'is_vip': cast_bool(Prefs['provider.opensubtitles.is_vip']), - 'use_ssl': os_use_https, - 'timeout': self.advanced.providers.opensubtitles.timeout or 15, - 'skip_wrong_fps': os_skip_wrong_fps, + #'use_tag_search': self.exact_filenames, + #'only_foreign': self.forced_only, + #'also_foreign': self.forced_also, + #'is_vip': cast_bool(Prefs['provider.opensubtitles.is_vip']), + #'use_ssl': os_use_https, + #'timeout': self.advanced.providers.opensubtitles.timeout or 15, + #'skip_wrong_fps': os_skip_wrong_fps, + 'use_hash': cast_bool(Prefs['provider.opensubtitles.use_hash']), + 'include_ai_translated': True, + 'api_key': Prefs['provider.opensubtitles.api_key'], }, 'podnapisi': { 'only_foreign': self.forced_only, diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index a6b45bc3c..24239b9f3 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -128,8 +128,8 @@ def list_subtitles(self, rating_key, item_type, part_id, language, skip_wrong_fp config.init_subliminal_patches() provider_settings = config.provider_settings - if not skip_wrong_fps: - provider_settings["opensubtitles"]["skip_wrong_fps"] = False + #if not skip_wrong_fps: + # provider_settings["opensubtitlescom"]["skip_wrong_fps"] = False if item_type == "episode": min_score = 240 diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 5b76792e5..397b50445 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -311,7 +311,7 @@ }, { "id": "provider.opensubtitles.enabled", - "label": "Provider: Enable OpenSubtitles", + "label": "Provider: Enable OpenSubtitles.com", "type": "bool", "default": "true" }, @@ -330,10 +330,16 @@ "secure": "true" }, { - "id": "provider.opensubtitles.is_vip", - "label": "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)", + "id": "provider.opensubtitles.use_hash", + "label": "OpenSubtitles hash?", "type": "bool", - "default": "false" + "default": "true" + }, + { + "id": "provider.opensubtitles.api_key", + "label": "OpenSubtitles APIKey", + "type": "text", + "default": "" }, { "id": "provider.podnapisi.enabled", diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index ab9350b2b..9877c377a 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -554,6 +554,9 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski if "opensubtitles" in providers: video.hashes['opensubtitles'] = osub_hash = osub_hash or hash_opensubtitles(hash_path) + if "opensubtitlescom" in providers: + video.hashes['opensubtitlescom'] = osub_hash = osub_hash or hash_opensubtitles(hash_path) + if "shooter" in providers: video.hashes['shooter'] = hash_shooter(hash_path) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitlescom.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitlescom.py new file mode 100644 index 000000000..e25870267 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitlescom.py @@ -0,0 +1,579 @@ +# -*- coding: utf-8 -*- +import logging +import os +import time +import datetime +import json +import types + +from requests import Session, ConnectionError, Timeout, ReadTimeout, RequestException +from simplejson import JSONDecodeError +from subzero.language import Language + +from babelfish import language_converters +from subliminal import Episode, Movie +from subliminal.score import get_equivalent_release_groups +from subliminal.utils import sanitize_release_group, sanitize +from subliminal_patch.exceptions import TooManyRequests, APIThrottled +from subliminal.exceptions import DownloadLimitExceeded, AuthenticationError, ConfigurationError, ServiceUnavailable, \ + ProviderError +from .mixins import ProviderRetryMixin +from subliminal_patch.subtitle import Subtitle +from subliminal.subtitle import fix_line_ending, SUBTITLE_EXTENSIONS +from subliminal_patch.providers import Provider +from subliminal_patch.subtitle import guess_matches +from subliminal_patch.utils import fix_inconsistent_naming +from subliminal.cache import region +from dogpile.cache.api import NO_VALUE +from guessit import guessit + +logger = logging.getLogger(__name__) + +SHOW_EXPIRATION_TIME = datetime.timedelta(weeks=1).total_seconds() +TOKEN_EXPIRATION_TIME = datetime.timedelta(hours=12).total_seconds() + +retry_amount = 3 + + +def fix_tv_naming(title): + """Fix TV show titles with inconsistent naming using dictionary, but do not sanitize them. + + :param str title: original title. + :return: new title. + :rtype: str + + """ + return fix_inconsistent_naming(title, {"Superman & Lois": "Superman and Lois", + }, True) + + +def fix_movie_naming(title): + return fix_inconsistent_naming(title, { + }, True) + + +custom_languages = { + 'pt': 'pt-PT', + 'zh': 'zh-CN', +} + + +def to_opensubtitlescom(lang): + if lang in custom_languages.keys(): + return custom_languages[lang] + else: + return lang + + +def from_opensubtitlescom(lang): + from_custom_languages = {v: k for k, v in custom_languages.items()} + if lang in from_custom_languages.keys(): + return from_custom_languages[lang] + else: + return lang + + +class OpenSubtitlesComSubtitle(Subtitle): + provider_name = 'opensubtitlescom' + hash_verifiable = True + hearing_impaired_verifiable = True + + def __init__(self, language, forced, hearing_impaired, page_link, file_id, releases, uploader, title, year, + hash_matched, file_hash=None, season=None, episode=None, imdb_match=False): + super(OpenSubtitlesComSubtitle, self).__init__(language, hearing_impaired, page_link) + language = Language.rebuild(language, hi=hearing_impaired, forced=forced) + + self.title = title + self.year = year + self.season = season + self.episode = episode + self.releases = releases + self.release_info = releases + self.language = language + self.hearing_impaired = hearing_impaired + self.forced = forced + self.file_id = file_id + self.page_link = page_link + self.download_link = None + self.uploader = uploader + self.matches = None + self.hash = file_hash + self.encoding = 'utf-8' + self.hash_matched = hash_matched + self.imdb_match = imdb_match + + @property + def id(self): + return self.file_id + + def get_matches(self, video): + matches = set() + type_ = "movie" if isinstance(video, Movie) else "episode" + + # handle movies and series separately + if type_ == "episode": + # series + matches.add('series') + # season + if video.season == self.season: + matches.add('season') + # episode + if video.episode == self.episode: + matches.add('episode') + # imdb + if self.imdb_match: + matches.add('series_imdb_id') + else: + # title + matches.add('title') + # imdb + if self.imdb_match: + matches.add('imdb_id') + + # rest is same for both groups + + # year + if video.year == self.year: + matches.add('year') + + # release_group + if (video.release_group and self.releases and + any(r in sanitize_release_group(self.releases) + for r in get_equivalent_release_groups(sanitize_release_group(video.release_group)))): + matches.add('release_group') + + if self.hash_matched: + matches.add('hash') + + # other properties + matches |= guess_matches(video, guessit(self.releases, {"type": type_})) + + self.matches = matches + + return matches + + +class OpenSubtitlesComProvider(ProviderRetryMixin, Provider): + """OpenSubtitlesCom Provider""" + server_url = 'https://api.opensubtitles.com/api/v1/' + + languages = {Language.fromopensubtitles(lang) for lang in language_converters['szopensubtitles'].codes} + languages.update(set(Language.rebuild(lang, forced=True) for lang in languages)) + languages.update(set(Language.rebuild(l, hi=True) for l in languages)) + + video_types = (Episode, Movie) + + def __init__(self, username=None, password=None, use_hash=True, include_ai_translated=False, api_key=None): + if not all((username, password)): + raise ConfigurationError('Username and password must be specified') + + if not api_key: + raise ConfigurationError('Api_key must be specified') + + if not all((username, password)): + raise ConfigurationError('Username and password must be specified') + + self.session = Session() + self.session.headers = {'User-Agent': os.environ.get("SZ_USER_AGENT", "Sub-Zero/2"), + 'Api-Key': api_key, + 'Content-Type': 'application/json'} + self.token = None + self.username = username + self.password = password + self.video = None + self.use_hash = use_hash + self.include_ai_translated = include_ai_translated + self._started = None + + def initialize(self): + self._started = time.time() + + if region.get("oscom_token", expiration_time=TOKEN_EXPIRATION_TIME) is NO_VALUE: + logger.debug("No cached token, we'll try to login again.") + self.login() + else: + self.token = region.get("oscom_token", expiration_time=TOKEN_EXPIRATION_TIME) + + def terminate(self): + self.session.close() + + def ping(self): + return self._started and (time.time() - self._started) < TOKEN_EXPIRATION_TIME + + def login(self, is_retry=False): + r = self.checked( + lambda: self.session.post(self.server_url + 'login', + json={"username": self.username, "password": self.password}, + allow_redirects=False, + timeout=30), + is_retry=is_retry) + + try: + self.token = r.json()['token'] + except (ValueError, JSONDecodeError): + log_request_response(r) + raise ProviderError("Cannot get token from provider login response") + else: + log_request_response(r, non_standard=False) + region.set("oscom_token", self.token) + + @staticmethod + def sanitize_external_ids(external_id): + if isinstance(external_id, types.StringTypes): + external_id = external_id.lower().lstrip('tt').lstrip('0') + sanitized_id = external_id[:-1].lstrip('0') + external_id[-1] + return int(sanitized_id) + + @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME) + def search_titles(self, title): + title_id = None + + parameters = {'query': title.lower()} + logging.debug('Searching using this title: %s' % title) + + results = self.retry( + lambda: self.checked( + lambda: self.session.get(self.server_url + 'features', params=parameters, timeout=30), + validate_json=True, + json_key_name='data' + ), + amount=retry_amount + ) + + # deserialize results + results_dict = results.json()['data'] + + # loop over results + for result in results_dict: + if 'title' in result['attributes']: + if isinstance(self.video, Episode): + if fix_tv_naming(title).lower() == result['attributes']['title'].lower() and \ + (not self.video.year or self.video.year == int(result['attributes']['year'])): + title_id = result['id'] + break + else: + if fix_movie_naming(title).lower() == result['attributes']['title'].lower() and \ + (not self.video.year or self.video.year == int(result['attributes']['year'])): + title_id = result['id'] + break + else: + continue + + if title_id: + logging.debug('Found this title ID: %s' % title_id) + return self.sanitize_external_ids(title_id) + + if not title_id: + logger.debug('No match found for %s' % title) + + def query(self, languages, video): + self.video = video + if self.use_hash: + file_hash = self.video.hashes.get('opensubtitlescom') + logging.debug('Searching using this hash: %s' % hash) + else: + file_hash = None + + if isinstance(self.video, Episode): + title = self.video.series + else: + title = self.video.title + + imdb_id = None + if isinstance(self.video, Episode) and self.video.series_imdb_id: + imdb_id = self.sanitize_external_ids(self.video.series_imdb_id) + elif isinstance(self.video, Movie) and self.video.imdb_id: + imdb_id = self.sanitize_external_ids(self.video.imdb_id) + + title_id = None + if not imdb_id: + title_id = self.search_titles(title) + if not title_id: + return [] + + # be sure to remove duplicates using list(set()) + langs_list = sorted(list(set([to_opensubtitlescom(lang.basename).lower() for lang in languages]))) + + langs = ','.join(langs_list) + logging.debug('Searching for those languages: %s' % langs) + + # query the server + if isinstance(self.video, Episode): + res = self.retry( + lambda: self.checked( + lambda: self.session.get(self.server_url + 'subtitles', + params=(('ai_translated', 'exclude' if not self.include_ai_translated + else 'include'), + ('episode_number', self.video.episode), + ('imdb_id', imdb_id if not title_id else None), + ('languages', langs), + ('moviehash', file_hash), + ('parent_feature_id', title_id if title_id else None), + ('season_number', self.video.season)), + timeout=30), + validate_json=True, + json_key_name='data' + ), + amount=retry_amount + ) + else: + res = self.retry( + lambda: self.checked( + lambda: self.session.get(self.server_url + 'subtitles', + params=(('ai_translated', 'exclude' if not self.include_ai_translated + else 'include'), + ('id', title_id if title_id else None), + ('imdb_id', imdb_id if not title_id else None), + ('languages', langs), + ('moviehash', file_hash)), + timeout=30), + validate_json=True, + json_key_name='data' + ), + amount=retry_amount + ) + + subtitles = [] + + result = res.json() + + # filter out forced subtitles or not depending on the required languages + if all([lang.forced for lang in languages]): # only forced + result['data'] = [x for x in result['data'] if x['attributes']['foreign_parts_only']] + elif any([lang.forced for lang in languages]): # also forced + pass + else: # not forced + result['data'] = [x for x in result['data'] if not x['attributes']['foreign_parts_only']] + + logging.debug("Query returned %s subtitles" % len(result['data'])) + + if len(result['data']): + for item in result['data']: + # ignore AI translated subtitles + if 'ai_translated' in item['attributes'] and item['attributes']['ai_translated']: + logging.debug("Skipping AI translated subtitles") + continue + + # ignore machine translated subtitles + if 'machine_translated' in item['attributes'] and item['attributes']['machine_translated']: + logging.debug("Skipping machine translated subtitles") + continue + + if 'season_number' in item['attributes']['feature_details']: + season_number = item['attributes']['feature_details']['season_number'] + else: + season_number = None + + if 'episode_number' in item['attributes']['feature_details']: + episode_number = item['attributes']['feature_details']['episode_number'] + else: + episode_number = None + + if 'moviehash_match' in item['attributes']: + moviehash_match = item['attributes']['moviehash_match'] + else: + moviehash_match = False + + try: + year = int(item['attributes']['feature_details']['year']) + except TypeError: + year = item['attributes']['feature_details']['year'] + + if len(item['attributes']['files']): + subtitle = OpenSubtitlesComSubtitle( + language=Language.fromietf(from_opensubtitlescom(item['attributes']['language'])), + forced=item['attributes']['foreign_parts_only'], + hearing_impaired=item['attributes']['hearing_impaired'], + page_link=item['attributes']['url'], + file_id=item['attributes']['files'][0]['file_id'], + releases=item['attributes']['release'], + uploader=item['attributes']['uploader']['name'], + title=item['attributes']['feature_details']['movie_name'], + year=year, + season=season_number, + episode=episode_number, + hash_matched=moviehash_match, + imdb_match=True if imdb_id else False + ) + subtitle.get_matches(self.video) + subtitles.append(subtitle) + + return subtitles + + def list_subtitles(self, video, languages): + return self.query(languages, video) + + def download_subtitle(self, subtitle): + logger.info('Downloading subtitle %r', subtitle) + + headers = {'Accept': 'application/json', 'Content-Type': 'application/json', + 'Authorization': 'Bearer ' + self.token} + res = self.retry( + lambda: self.checked( + lambda: self.session.post(self.server_url + 'download', + json={'file_id': subtitle.file_id, 'sub_format': 'srt'}, + headers=headers, + timeout=30), + validate_json=True, + json_key_name='link' + ), + amount=retry_amount + ) + + download_data = res.json() + subtitle.download_link = download_data['link'] + + r = self.retry( + lambda: self.checked( + lambda: self.session.get(subtitle.download_link, timeout=30), + validate_content=True + ), + amount=retry_amount + ) + + if not r: + logger.debug('Could not download subtitle from %s' % subtitle.download_link) + subtitle.content = None + return + else: + subtitle_content = r.content + subtitle.content = fix_line_ending(subtitle_content) + + @staticmethod + def reset_token(): + logging.debug('Authentication failed: clearing cache and attempting to login.') + region.delete("oscom_token") + return + + def checked(self, fn, raise_api_limit=False, validate_json=False, json_key_name=None, validate_content=False, + is_retry=False): + """Run :fn: and check the response status before returning it. + + :param fn: the function to make an API call to OpenSubtitles.com. + :param raise_api_limit: if True we wait a little bit longer before running the call again. + :param validate_json: test if response is valid json. + :param json_key_name: test if returned json contain a specific key. + :param validate_content: test if response have a content (used with download). + :param is_retry: prevent additional retries with login endpoint. + :return: the response. + + """ + response = None + try: + try: + response = fn() + except APIThrottled: + if not raise_api_limit: + logger.info("API request limit hit, waiting and trying again once.") + time.sleep(15) + return self.checked(fn, raise_api_limit=True) + raise + except (ConnectionError, Timeout, ReadTimeout): + raise ServiceUnavailable('Unknown Error, empty response: {}: {}'.format(response.status_code, response)) + except Exception: + logging.exception('Unhandled exception raised.') + raise ProviderError('Unhandled exception raised. Check log.') + else: + status_code = response.status_code + except Exception: + status_code = None + else: + if status_code == 400: + try: + json_response = response.json() + message = json_response['message'] + except JSONDecodeError: + raise ProviderError('Invalid JSON returned by provider') + else: + log_request_response(response) + raise ConfigurationError(message) + elif status_code == 401: + log_request_response(response) + self.reset_token() + if is_retry: + raise AuthenticationError('Login failed') + else: + time.sleep(1) + self.login(is_retry=True) + self.checked(fn, raise_api_limit=raise_api_limit, validate_json=validate_json, + json_key_name=json_key_name, validate_content=validate_content, is_retry=True) + elif status_code == 403: + log_request_response(response) + raise ProviderError("Bazarr API key seems to be in problem") + elif status_code == 406: + try: + json_response = response.json() + download_count = json_response['requests'] + remaining_download = json_response['remaining'] + quota_reset_time = json_response['reset_time'] + except JSONDecodeError: + raise ProviderError('Invalid JSON returned by provider') + else: + log_request_response(response) + raise DownloadLimitExceeded("Daily download limit reached. {} subtitles have been " + "downloaded and {} remaining subtitles can be " + "downloaded. Quota will be reset in {}.".format(download_count, remaining_download, quota_reset_time)) + elif status_code == 410: + log_request_response(response) + raise ProviderError("Download as expired") + elif status_code == 429: + log_request_response(response) + raise TooManyRequests() + elif status_code == 500: + logging.debug("Server side exception raised while downloading from opensubtitles.com website. They " + "should mitigate this soon.") + return None + elif status_code == 502: + # this one should deal with Bad Gateway issue on their side. + raise APIThrottled() + elif 500 <= status_code <= 599: + raise ProviderError(response.reason) + + if status_code != 200: + log_request_response(response) + raise ProviderError('Bad status code: %s' % response.status_code) + + if validate_json: + try: + json_test = response.json() + except JSONDecodeError: + raise ProviderError('Invalid JSON returned by provider') + else: + if json_key_name not in json_test: + raise ProviderError('Invalid JSON returned by provider: no %s key in returned json.' % json_key_name) + + if validate_content: + if not hasattr(response, 'content'): + logging.error('Download link returned no content attribute.') + return False + elif not response.content: + logging.error('This download link returned empty content: %s' % response.url) + return False + + return response + + +def log_request_response(response, non_standard=True): + redacted_request_headers = response.request.headers + if 'Authorization' in redacted_request_headers and isinstance(redacted_request_headers['Authorization'], str): + redacted_request_headers['Authorization'] = redacted_request_headers['Authorization'][:-8]+8*'x' + + redacted_request_body = json.loads(response.request.body) + if 'password' in redacted_request_body: + redacted_request_body['password'] = 'redacted' + + redacted_response_body = json.loads(response.text) + if 'token' in redacted_response_body and isinstance(redacted_response_body['token'], str): + redacted_response_body['token'] = redacted_response_body['token'][:-8] + 8 * 'x' + + if non_standard: + logging.debug("opensubtitlescom returned a non standard response. Logging request/response for debugging " + "purpose.") + else: + logging.debug("opensubtitlescom returned a standard response. Logging request/response for debugging purpose.") + logging.debug("Request URL: %s" % response.request.url) + logging.debug("Request Headers: %s" % redacted_request_headers) + logging.debug("Request Body: %s" % json.dumps(redacted_request_body)) + logging.debug("Response Status Code: %s" % {response.status_code}) + logging.debug("Response Headers: %s" % response.headers) + logging.debug("Response Body: %s" % json.dumps(redacted_response_body)) diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index 8237d5ace..b11f376e7 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -1,9 +1,11 @@ # coding=utf-8 +from __future__ import absolute_import import types import re from babelfish.exceptions import LanguageError from babelfish import Language as Language_, basestr, LANGUAGE_MATRIX +from six.moves import zip repl_map = { "dk": "da", @@ -30,11 +32,15 @@ "tib": "bo", } +CUSTOM_LIST = ["chs", "sc", "zhs", "hans", "gb", u"简", u"双语", + "cht", "tc", "zht", "hant", "big5", u"繁", u"雙語", + "spl", "ea", "pob", "pb"] ALPHA2_LIST = list(set(filter(lambda x: x, map(lambda x: x.alpha2, LANGUAGE_MATRIX)))) + list(repl_map.values()) ALPHA3b_LIST = list(set(filter(lambda x: x, map(lambda x: x.alpha3, LANGUAGE_MATRIX)))) + \ list(set(filter(lambda x: len(x) == 3, list(repl_map.keys())))) FULL_LANGUAGE_LIST = ALPHA2_LIST + ALPHA3b_LIST +FULL_LANGUAGE_LIST.extend(CUSTOM_LIST) def language_from_stream(l): @@ -61,7 +67,8 @@ def inner(*args, **kwargs): args = args[1:] s = args.pop(0) forced = None - if isinstance(s, types.StringTypes): + hi = None + if isinstance(s, (str,)): base, forced = s.split(":") if ":" in s else (s, False) else: base = s @@ -69,6 +76,7 @@ def inner(*args, **kwargs): instance = f(cls, base, *args, **kwargs) if isinstance(instance, Language): instance.forced = forced == "forced" + instance.hi = hi == "hi" return instance return inner @@ -76,16 +84,21 @@ def inner(*args, **kwargs): class Language(Language_): forced = False + hi = False - def __init__(self, language, country=None, script=None, unknown=None, forced=False): + def __init__(self, language, country=None, script=None, unknown=None, forced=False, hi=False): self.forced = forced + self.hi = hi super(Language, self).__init__(language, country=country, script=script, unknown=unknown) def __getstate__(self): - return self.alpha3, self.country, self.script, self.forced + return self.alpha3, self.country, self.script, self.hi, self.forced - def __setstate__(self, state): - self.alpha3, self.country, self.script, self.forced = state + def __setstate__(self, forced): + self.alpha3, self.country, self.script, self.hi, self.forced = forced + + def __hash__(self): + return hash(str(self)) def __eq__(self, other): if isinstance(other, basestr): @@ -95,11 +108,16 @@ def __eq__(self, other): return (self.alpha3 == other.alpha3 and self.country == other.country and self.script == other.script and - bool(self.forced) == bool(other.forced)) + bool(self.forced) == bool(other.forced) and + bool(self.hi) == bool(other.hi)) def __str__(self): return super(Language, self).__str__() + (":forced" if self.forced else "") + def __repr__(self): + info = ";".join("{}={}".format(k, v) for k, v in vars(self).items() if v) + return "<{}: {}>".format(self.__class__.__name__, info) + @property def basename(self): return super(Language, self).__str__() @@ -108,14 +126,15 @@ def __getattr__(self, name): ret = super(Language, self).__getattr__(name) if isinstance(ret, Language): ret.forced = self.forced + ret.hi = self.hi return ret @classmethod def rebuild(cls, instance, **replkw): state = instance.__getstate__() - attrs = ("country", "script", "forced") + attrs = ("country", "script", "hi", "forced") language = state[0] - kwa = dict(zip(attrs, state[1:])) + kwa = dict(list(zip(attrs, state[1:]))) kwa.update(replkw) return cls(language, **kwa) From 20c3cd23409a910aff35de779310de1bd06738b0 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sat, 27 Jan 2024 00:06:17 +0100 Subject: [PATCH 705/710] 2.6.5.3280 --- CHANGELOG.md | 13 +++++++++++++ Contents/Info.plist | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4af26eb6d..21d385b32 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +2.6.5.3280 + +temporarily enable OpenSubtitles.com instead of OpenSubtitles.org. +You need to have an account there and an API consumer configured. Enter your API key in settings. + +This is barely tested but should work for basic usage. + +THIS PLUGIN IS DEPRECATED, PLEASE USE BAZARR! + +Changelog +- cheaply backport opensubtitlescom from bazarr + + 2.6.5.3268 subscene, addic7ed - either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration diff --git a/Contents/Info.plist b/Contents/Info.plist index 9cdbc87f5..76d8ca797 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -13,7 +13,7 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>2.6.5.3277</string> + <string>2.6.5.3280</string> <key>PlexFrameworkVersion</key> <string>2</string> <key>PlexPluginClass</key> @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.6.5.3277 +Version 2.6.5.3280 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> From 3d95c6e420dd260f61b7bec5922557ce047d35fb Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sat, 27 Jan 2024 00:08:25 +0100 Subject: [PATCH 706/710] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3a666ac00..b50e11731 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ Check out **[the Sub-Zero Wiki](https://github.com/pannal/Sub-Zero.bundle/wiki)* <br /> +**DEPRECATED, USE BAZARR** ## Legacy maintenance mode This addon will not be developed any further. It still works and arguably is still the best for managing subtitles when using Plex. As long as Plex Inc. supports agents, Sub-Zero will be maintained to work with the latest PMS version. From e648e945c95ab91ba22e03a89a2b7d8a3c92b587 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sat, 27 Jan 2024 00:09:06 +0100 Subject: [PATCH 707/710] Update README.md --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index b50e11731..a0047232d 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,19 @@ the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, ehe ## Changelog +2.6.5.3280 + +temporarily enable OpenSubtitles.com instead of OpenSubtitles.org. +You need to have an account there and an API consumer configured. Enter your API key in settings. + +This is barely tested but should work for basic usage. + +THIS PLUGIN IS DEPRECATED, PLEASE USE BAZARR! + +Changelog +- cheaply backport opensubtitlescom from bazarr + + 2.6.5.3277 - core: fix enabled library/agents detection (Plex removed certain features) fix Plex agent integration; Plex Inc removed certain attributes; SZ is now limited to thetvdb, thetvdbdvdorder, hama, themoviedb, imdb) From 44587952931bd984a5d11de0411c0b30cdb80f3f Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sat, 27 Jan 2024 00:11:07 +0100 Subject: [PATCH 708/710] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a0047232d..f111f334a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Sub-Zero for Plex [![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle.svg?style=flat&label=stable)](https://github.com/pannal/Sub-Zero.bundle/releases/latest) [![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)]() -[![Maintenance](https://img.shields.io/maintenance/yes/2023.svg)]() +[![Maintenance](https://img.shields.io/maintenance/yes/2024.svg)]() [![Slack Status](https://szslack.fragstore.net/badge.svg)](https://szslack.fragstore.net) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle?ref=badge_shield) From 62439ef49fb3a275325a32097b34f3b67157f9b3 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sat, 27 Jan 2024 01:45:43 +0100 Subject: [PATCH 709/710] fix advanced_settings.json.template --- Contents/advanced_settings.json.template | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Contents/advanced_settings.json.template b/Contents/advanced_settings.json.template index 91190575b..8f5c6d4ce 100644 --- a/Contents/advanced_settings.json.template +++ b/Contents/advanced_settings.json.template @@ -26,7 +26,7 @@ Don't expect support if you mess this up. // SZ can use mediainfo if present to detect titles/forced state of MP4 MOV_TEXT, because the PMS currently doesn't // set the title attribute - "dont_use_mediainfo_mp4": False, + "dont_use_mediainfo_mp4": false, // specific mediainfo binary path "mediainfo_bin": null, @@ -89,11 +89,11 @@ Don't expect support if you mess this up. // don't verify HTTPS certificates? Set to True for self-signed certificates "ssl_no_verify": false, // custom path to certificate pem file - "pem_file": None, + "pem_file": null, }, "radarr": { "ssl_no_verify": false, - "pem_file": None, + "pem_file": null, }, } } \ No newline at end of file From 3a09d9ffeed1d1b3413bf874c3b126e9bd5fd653 Mon Sep 17 00:00:00 2001 From: pannal <panni@fragstore.net> Date: Sat, 27 Jan 2024 02:28:07 +0100 Subject: [PATCH 710/710] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f111f334a..6d395286e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,8 @@ Check out **[the Sub-Zero Wiki](https://github.com/pannal/Sub-Zero.bundle/wiki)* <br /> -**DEPRECATED, USE BAZARR** +# DEPRECATED, USE [BAZARR](https://www.bazarr.media/) + ## Legacy maintenance mode This addon will not be developed any further. It still works and arguably is still the best for managing subtitles when using Plex. As long as Plex Inc. supports agents, Sub-Zero will be maintained to work with the latest PMS version.